From 5b4e23236dd9475cb1d92b729822b1a53de8ea4b Mon Sep 17 00:00:00 2001 From: lklimek <842586+lklimek@users.noreply.github.com> Date: Mon, 27 Nov 2023 12:53:22 +0100 Subject: [PATCH 001/191] chore: automatic clippy fixes (#1528) --- .../src/block/extended_epoch_info/mod.rs | 1 - .../rs-dpp/src/data_contract/config/fields.rs | 2 - .../class_methods/try_from_schema/v0/mod.rs | 44 ++++++---------- .../src/data_contract/document_type/mod.rs | 2 +- .../document_type/random_document.rs | 6 +-- .../validate_schema_compatibility/v0/mod.rs | 10 ++-- .../document_type/v0/random_document.rs | 2 +- .../document_type/v0/validator.rs | 5 +- packages/rs-dpp/src/data_contract/mod.rs | 1 - .../serialized_version/v0/mod.rs | 2 +- .../src/data_contract/v0/accessors/mod.rs | 9 ++-- .../src/data_contract/v0/data_contract.rs | 2 +- .../json_schema_error_data.rs | 2 +- .../unsupported_protocol_version_error.rs | 3 +- .../basic/unsupported_version_error.rs | 3 +- .../rs-dpp/src/identity/accessors/v0/mod.rs | 2 +- packages/rs-dpp/src/identity/identity.rs | 2 +- .../rs-dpp/src/identity/identity_facade.rs | 5 +- .../rs-dpp/src/identity/identity_factory.rs | 2 +- .../contract_bounds/mod.rs | 2 +- .../identity/identity_public_key/key_type.rs | 10 ++-- .../identity/identity_public_key/purpose.rs | 8 +-- .../identity_public_key/security_level.rs | 8 +-- .../src/serialization/serialization_traits.rs | 2 +- .../src/state_transition/serialization.rs | 6 +-- .../document_create_transition/v0/mod.rs | 2 +- .../document_replace_transition/v0/mod.rs | 2 +- .../methods/hash/mod.rs | 5 +- .../get_document_transitions_fixture.rs | 2 - .../instant_asset_lock_proof_fixture.rs | 1 - .../src/abci/handler/error/mod.rs | 2 + .../src/execution/check_tx/v0/mod.rs | 13 ++--- .../engine/finalize_block_proposal/v0/mod.rs | 4 +- .../block_end/update_drive_cache/mod.rs | 3 +- .../v0/mod.rs | 2 +- .../clear_drive_block_cache/mod.rs | 3 +- .../create_owner_identity/v0/mod.rs | 1 - .../get_operator_identifier/v0/mod.rs | 1 - .../get_voter_identifier/v0/mod.rs | 1 - .../mod.rs | 1 - .../v0/mod.rs | 1 - .../v0/mod.rs | 27 ++++------ .../initial_core_height/v0/mod.rs | 1 - .../process_raw_state_transitions/mod.rs | 1 - .../types/execution_operation/mod.rs | 1 - .../v0/mod.rs | 6 +-- .../v0/mod.rs | 2 +- .../v0/mod.rs | 2 +- .../v0/mod.rs | 2 +- .../data_contract_update/state/v0/mod.rs | 7 ++- .../documents_batch/data_triggers/executor.rs | 4 +- .../documents_batch/transformer/v0/mod.rs | 9 ++-- packages/rs-drive-abci/src/logging/logger.rs | 3 -- packages/rs-drive-abci/src/main.rs | 6 +-- .../src/platform_types/platform/mod.rs | 1 - .../tests/strategy_tests/core_update_tests.rs | 2 +- .../tests/strategy_tests/execution.rs | 3 +- .../tests/strategy_tests/failures.rs | 4 +- .../tests/strategy_tests/strategy.rs | 6 +-- .../verify_state_transitions.rs | 22 ++++---- .../drive/batch/drive_op_batch/document.rs | 2 +- .../drive/grove_operations/grove_clear/mod.rs | 2 +- .../identity/contract_info/insert/mod.rs | 32 ++++-------- .../for_identity_contract_info/v0/mod.rs | 19 +++---- .../v0/mod.rs | 16 ++---- .../key/fetch/fetch_identity_keys/v0/mod.rs | 2 +- .../src/drive/identity/key/fetch/mod.rs | 1 - .../key/insert/insert_key_to_storage/mod.rs | 2 - .../insert/insert_new_non_unique_key/mod.rs | 2 +- .../insert_new_non_unique_key/v0/mod.rs | 2 +- .../key/insert/insert_new_unique_key/mod.rs | 2 +- .../insert/insert_new_unique_key/v0/mod.rs | 2 +- packages/rs-drive/src/drive/identity/mod.rs | 1 - .../btreemap_path_extensions.rs | 50 +++++++------------ packages/strategy-tests/src/lib.rs | 9 ++-- .../wasm-dpp/src/dash_platform_protocol.rs | 4 +- .../src/data_contract/data_contract.rs | 44 ++++++++-------- .../src/data_contract/data_contract_facade.rs | 6 +-- .../wasm-dpp/src/data_contract/errors/mod.rs | 2 +- .../data_contract_create_transition/mod.rs | 12 ++--- .../data_contract_update_transition/mod.rs | 12 ++--- .../data_contract_factory.rs | 9 +--- .../wasm-dpp/src/document/document_facade.rs | 5 +- .../errors/document_no_revision_error.rs | 1 - .../src/document/extended_document.rs | 6 +-- packages/wasm-dpp/src/document/factory.rs | 14 ++---- .../src/document/generate_document_id.rs | 2 +- packages/wasm-dpp/src/document/mod.rs | 12 ++--- .../document_transition/mod.rs | 14 ++---- .../document_batch_transition/mod.rs | 13 +++-- ...ta_contract_have_new_unique_index_error.rs | 4 +- ...tract_immutable_properties_update_error.rs | 3 +- ...t_invalid_index_definition_update_error.rs | 3 +- .../data_contract_max_depth_exceed_error.rs | 3 +- ...a_contract_unique_indices_changed_error.rs | 3 +- .../duplicate_index_name_error.rs | 3 +- ...incompatible_data_contract_schema_error.rs | 2 +- .../incompatible_re2_pattern_error.rs | 3 +- .../index_error/duplicate_index_error.rs | 3 +- .../invalid_compound_index_error.rs | 3 +- .../invalid_index_property_type_error.rs | 3 +- ...valid_indexed_property_constraint_error.rs | 3 +- ...em_property_index_already_present_error.rs | 3 +- .../undefined_index_property_error.rs | 3 +- .../unique_indices_limit_reached_error.rs | 3 +- .../invalid_data_contract_id_error.rs | 2 +- .../invalid_data_contract_version_error.rs | 3 +- .../invalid_json_schema_ref_error.rs | 3 +- .../decode/protocol_version_parsing_error.rs | 4 +- .../decode/serialized_object_parsing_error.rs | 3 +- .../data_contract_not_present_error.rs | 2 +- ...ate_document_transitions_with_ids_error.rs | 2 +- ...document_transitions_with_indices_error.rs | 2 +- .../inconsistent_compound_index_data_error.rs | 3 +- ...nvalid_document_transition_action_error.rs | 3 +- .../invalid_document_transition_id_error.rs | 2 +- .../document/invalid_document_type_error.rs | 2 +- .../missing_data_contract_id_error.rs | 4 +- ...issing_document_transition_action_error.rs | 3 +- .../missing_document_transition_type_error.rs | 3 +- .../document/missing_document_type_error.rs | 3 +- .../duplicated_identity_public_key_error.rs | 3 +- ...duplicated_identity_public_key_id_error.rs | 3 +- ...proof_locked_transaction_mismatch_error.rs | 2 +- ...set_lock_transaction_is_not_found_error.rs | 2 +- ...nsaction_out_point_already_exists_error.rs | 2 +- ...lock_transaction_output_not_found_error.rs | 3 +- .../identity_insufficient_balance_error.rs | 3 -- ...sset_lock_proof_core_chain_height_error.rs | 3 +- ...set_lock_proof_transaction_height_error.rs | 3 +- ...ck_transaction_output_return_size_error.rs | 3 +- ...d_identity_asset_lock_transaction_error.rs | 3 +- ...ity_asset_lock_transaction_output_error.rs | 3 +- ...it_withdrawal_transition_core_fee_error.rs | 3 +- ...thdrawal_transition_output_script_error.rs | 4 +- ...dit_withdrawal_transition_pooling_error.rs | 3 +- .../invalid_identity_key_signature_error.rs | 3 +- .../invalid_identity_public_key_data_error.rs | 4 +- ...dentity_public_key_security_level_error.rs | 4 +- .../invalid_identity_public_key_type_error.rs | 3 +- .../invalid_instant_asset_lock_proof_error.rs | 3 +- ...nstant_asset_lock_proof_signature_error.rs | 3 +- .../missing_master_public_key_error.rs | 3 +- .../identity/missing_public_key_error.rs | 3 +- .../incompatible_protocol_version_error.rs | 2 - .../basic/invalid_identifier_error.rs | 3 +- ...gnature_public_key_security_level_error.rs | 3 +- ...nvalid_state_transition_signature_error.rs | 3 +- .../basic/json_schema_compilation_error.rs | 3 +- .../consensus/basic/json_schema_error.rs | 2 - .../basic/public_key_is_disabled_error.rs | 3 +- ...public_key_security_level_not_met_error.rs | 3 -- .../invalid_state_transition_type_error.rs | 3 +- .../missing_state_transition_type_error.rs | 3 +- ...tate_transition_max_size_exceeded_error.rs | 3 +- .../unsupported_protocol_version_error.rs | 3 +- .../basic/unsupported_version_error.rs | 1 - .../basic/wrong_public_key_purpose_error.rs | 3 +- .../src/errors/consensus/consensus_error.rs | 9 ++-- .../fee/balance_is_not_enough_error.rs | 2 +- .../consensus/signature/basic_bls_error.rs | 3 +- .../consensus/signature/basic_ecdsa_error.rs | 3 +- .../signature/identity_not_found_error.rs | 2 +- .../signature_should_not_be_present_error.rs | 3 +- .../data_contract_already_present_error.rs | 2 +- .../data_contract_is_readonly_error.rs | 2 - .../document_already_present_error.rs | 2 +- .../document/document_not_found_error.rs | 2 +- .../document_owner_id_mismatch_error.rs | 2 +- ...cument_timestamp_window_violation_error.rs | 2 +- .../document_timestamps_are_equal_error.rs | 2 +- .../document_timestamps_mismatch_error.rs | 2 +- .../document/duplicate_unique_index_error.rs | 2 +- .../invalid_document_revision_error.rs | 2 +- ...ated_identity_public_key_id_state_error.rs | 3 +- ...licated_identity_public_key_state_error.rs | 3 +- .../identity/identity_already_exists_error.rs | 2 +- ..._key_disabled_at_window_violation_error.rs | 3 +- .../identity_public_key_is_disabled_error.rs | 3 +- .../identity_public_key_is_read_only_error.rs | 3 +- .../invalid_identity_public_key_id_error.rs | 4 +- .../invalid_identity_revision_error.rs | 2 +- ...identity_public_key_limit_reached_error.rs | 3 +- .../src/errors/consensus/value_error.rs | 3 +- .../wasm-dpp/src/identity/factory_utils.rs | 4 +- packages/wasm-dpp/src/identity/identity.rs | 10 ++-- .../wasm-dpp/src/identity/identity_factory.rs | 2 +- .../src/identity/identity_public_key/mod.rs | 11 ++-- .../identity_create_transition.rs | 8 ++- .../transition.rs | 11 ++-- .../identity_public_key_transitions.rs | 10 ++-- .../identity_topup_transition.rs | 12 ++--- .../identity_update_transition.rs | 10 ++-- packages/wasm-dpp/src/metadata.rs | 2 +- packages/wasm-dpp/src/protocol_version.rs | 2 +- .../errors/invalid_state_transition_error.rs | 4 +- 196 files changed, 349 insertions(+), 598 deletions(-) diff --git a/packages/rs-dpp/src/block/extended_epoch_info/mod.rs b/packages/rs-dpp/src/block/extended_epoch_info/mod.rs index e414591f0c..8562a73bd9 100644 --- a/packages/rs-dpp/src/block/extended_epoch_info/mod.rs +++ b/packages/rs-dpp/src/block/extended_epoch_info/mod.rs @@ -6,7 +6,6 @@ use crate::protocol_error::ProtocolError; use bincode::{Decode, Encode}; use derive_more::From; use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; -use platform_version::version::PlatformVersion; use serde::{Deserialize, Serialize}; /// Extended Block information diff --git a/packages/rs-dpp/src/data_contract/config/fields.rs b/packages/rs-dpp/src/data_contract/config/fields.rs index 255c8b1eda..33ced8f00f 100644 --- a/packages/rs-dpp/src/data_contract/config/fields.rs +++ b/packages/rs-dpp/src/data_contract/config/fields.rs @@ -1,5 +1,3 @@ -use crate::data_contract::storage_requirements::keys_for_document_type::StorageKeyRequirements; - pub const DEFAULT_CONTRACT_KEEPS_HISTORY: bool = false; pub const DEFAULT_CONTRACT_CAN_BE_DELETED: bool = false; pub const DEFAULT_CONTRACT_MUTABILITY: bool = true; diff --git a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs index ec06bff436..8b3aaab6e1 100644 --- a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs @@ -445,10 +445,7 @@ fn insert_values( match inner_properties .get_optional_str(property_names::CONTENT_MEDIA_TYPE)? { - Some(content_media_type) - if content_media_type - == "application/x.dash.dpp.identifier" => - { + Some("application/x.dash.dpp.identifier") => { DocumentPropertyType::Identifier } Some(_) | None => DocumentPropertyType::ByteArray( @@ -563,33 +560,23 @@ fn insert_values_nested( let is_required = known_required.contains(&property_key); - let field_type: DocumentPropertyType; - - match type_value { - "integer" => { - field_type = DocumentPropertyType::Integer; - } - "number" => { - field_type = DocumentPropertyType::Number; - } - "string" => { - field_type = DocumentPropertyType::String( - inner_properties.get_optional_integer(property_names::MIN_LENGTH)?, - inner_properties.get_optional_integer(property_names::MAX_LENGTH)?, - ); - } + let field_type = match type_value { + "integer" => DocumentPropertyType::Integer, + "number" => DocumentPropertyType::Number, + "string" => DocumentPropertyType::String( + inner_properties.get_optional_integer(property_names::MIN_LENGTH)?, + inner_properties.get_optional_integer(property_names::MAX_LENGTH)?, + ), "array" => { // Only handling bytearrays for v1 // Return an error if it is not a byte array - field_type = match inner_properties.get_optional_bool(property_names::BYTE_ARRAY)? { + match inner_properties.get_optional_bool(property_names::BYTE_ARRAY)? { Some(inner_bool) => { if inner_bool { match inner_properties .get_optional_str(property_names::CONTENT_MEDIA_TYPE)? { - Some(content_media_type) - if content_media_type == "application/x.dash.dpp.identifier" => - { + Some("application/x.dash.dpp.identifier") => { DocumentPropertyType::Identifier } Some(_) | None => DocumentPropertyType::ByteArray( @@ -610,7 +597,7 @@ fn insert_values_nested( // This is a temporary workaround to bring back v0.22 behavior and should be // replaced with a proper array support in future versions None => DocumentPropertyType::Array(ArrayItemType::Boolean), - }; + } } "object" => { let mut nested_properties = IndexMap::new(); @@ -663,20 +650,17 @@ fn insert_values_nested( )?; } } - field_type = DocumentPropertyType::Object(nested_properties); document_properties.insert( property_key, DocumentProperty { - property_type: field_type, + property_type: DocumentPropertyType::Object(nested_properties), required: is_required, }, ); return Ok(()); } - _ => { - field_type = DocumentPropertyType::try_from_name(type_value)?; - } - } + _ => DocumentPropertyType::try_from_name(type_value)?, + }; document_properties.insert( property_key, diff --git a/packages/rs-dpp/src/data_contract/document_type/mod.rs b/packages/rs-dpp/src/data_contract/document_type/mod.rs index 1ab0eeb300..5e8064c02c 100644 --- a/packages/rs-dpp/src/data_contract/document_type/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/mod.rs @@ -23,7 +23,7 @@ use derive_more::From; use platform_value::{Identifier, Value}; use std::collections::BTreeMap; -pub(self) mod property_names { +mod property_names { pub const DOCUMENTS_KEEP_HISTORY: &str = "documentsKeepHistory"; pub const DOCUMENTS_MUTABLE: &str = "documentsMutable"; pub const SECURITY_LEVEL_REQUIREMENT: &str = "signatureSecurityLevelRequirement"; diff --git a/packages/rs-dpp/src/data_contract/document_type/random_document.rs b/packages/rs-dpp/src/data_contract/document_type/random_document.rs index 3b8f542a7a..6582235183 100644 --- a/packages/rs-dpp/src/data_contract/document_type/random_document.rs +++ b/packages/rs-dpp/src/data_contract/document_type/random_document.rs @@ -46,7 +46,7 @@ pub trait CreateRandomDocument { fn random_documents_with_params( &self, count: u32, - identities: &Vec, + identities: &[Identity], time_ms: u64, document_field_fill_type: DocumentFieldFillType, document_field_fill_size: DocumentFieldFillSize, @@ -114,7 +114,7 @@ impl CreateRandomDocument for DocumentType { fn random_documents_with_params( &self, count: u32, - identities: &Vec, + identities: &[Identity], time_ms: u64, document_field_fill_type: DocumentFieldFillType, document_field_fill_size: DocumentFieldFillSize, @@ -224,7 +224,7 @@ impl<'a> CreateRandomDocument for DocumentTypeRef<'a> { fn random_documents_with_params( &self, count: u32, - identities: &Vec, + identities: &[Identity], time_ms: u64, document_field_fill_type: DocumentFieldFillType, document_field_fill_size: DocumentFieldFillSize, diff --git a/packages/rs-dpp/src/data_contract/document_type/schema/validate_schema_compatibility/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/schema/validate_schema_compatibility/v0/mod.rs index b9dd5baafe..5373fad695 100644 --- a/packages/rs-dpp/src/data_contract/document_type/schema/validate_schema_compatibility/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/schema/validate_schema_compatibility/v0/mod.rs @@ -46,7 +46,7 @@ pub fn any_schema_changes( new_schema: &JsonValue, ) -> bool { let changes = old_schema - .into_iter() + .iter() .filter(|(document_type, original_schema)| { let new_document_schema = new_schema.get(document_type).unwrap_or(&EMPTY_JSON); let diff = json_patch::diff(original_schema, new_document_schema); @@ -316,7 +316,7 @@ mod test { &DATA_SCHEMA.clone(), ValidationOptions::default(), ); - assert!(matches!(result, Ok(operations) if operations.len() == 0)); + assert!(matches!(result, Ok(operations) if operations.is_empty())); } #[test] @@ -344,7 +344,7 @@ mod test { ValidationOptions::default(), ); - assert!(matches!(result, Ok(operations) if operations.len() == 0)); + assert!(matches!(result, Ok(operations) if operations.is_empty())); } #[test] @@ -358,7 +358,7 @@ mod test { ValidationOptions::default(), ); - assert!(matches!(result, Ok(operations) if operations.len() == 0)); + assert!(matches!(result, Ok(operations) if operations.is_empty())); } #[test] @@ -391,7 +391,7 @@ mod test { assert!(matches!( result, - Ok(operations) if operations.len() > 0 + Ok(operations) if !operations.is_empty() )); } } diff --git a/packages/rs-dpp/src/data_contract/document_type/v0/random_document.rs b/packages/rs-dpp/src/data_contract/document_type/v0/random_document.rs index 9b7b0ede62..d4f78ca71f 100644 --- a/packages/rs-dpp/src/data_contract/document_type/v0/random_document.rs +++ b/packages/rs-dpp/src/data_contract/document_type/v0/random_document.rs @@ -53,7 +53,7 @@ impl CreateRandomDocument for DocumentTypeV0 { fn random_documents_with_params( &self, count: u32, - identities: &Vec, + identities: &[Identity], time_ms: u64, document_field_fill_type: DocumentFieldFillType, document_field_fill_size: DocumentFieldFillSize, diff --git a/packages/rs-dpp/src/data_contract/document_type/v0/validator.rs b/packages/rs-dpp/src/data_contract/document_type/v0/validator.rs index 99327ef15d..447d000fd2 100644 --- a/packages/rs-dpp/src/data_contract/document_type/v0/validator.rs +++ b/packages/rs-dpp/src/data_contract/document_type/v0/validator.rs @@ -28,11 +28,8 @@ impl PartialEq for StatelessJsonSchemaLazyValidator { fn eq(&self, _other: &Self) -> bool { true } - - fn ne(&self, other: &Self) -> bool { - !self.eq(other) - } } + impl Clone for StatelessJsonSchemaLazyValidator { fn clone(&self) -> Self { StatelessJsonSchemaLazyValidator::new() diff --git a/packages/rs-dpp/src/data_contract/mod.rs b/packages/rs-dpp/src/data_contract/mod.rs index cffbceea57..83536ce7b4 100644 --- a/packages/rs-dpp/src/data_contract/mod.rs +++ b/packages/rs-dpp/src/data_contract/mod.rs @@ -42,7 +42,6 @@ pub use v0::*; use crate::data_contract::serialized_version::{ DataContractInSerializationFormat, CONTRACT_DESERIALIZATION_LIMIT, }; -use crate::data_contract::v0::data_contract::DataContractV0; use crate::util::hash::hash_to_vec; use crate::version::{FeatureVersion, PlatformVersion}; diff --git a/packages/rs-dpp/src/data_contract/serialized_version/v0/mod.rs b/packages/rs-dpp/src/data_contract/serialized_version/v0/mod.rs index ba2a5bd4f1..085b1d2a82 100644 --- a/packages/rs-dpp/src/data_contract/serialized_version/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/serialized_version/v0/mod.rs @@ -1,7 +1,7 @@ use crate::data_contract::config::v0::DataContractConfigV0; use crate::data_contract::config::DataContractConfig; use crate::data_contract::document_type::accessors::DocumentTypeV0Getters; -use crate::data_contract::storage_requirements::keys_for_document_type::StorageKeyRequirements; + use crate::data_contract::v0::DataContractV0; use crate::data_contract::{DataContract, DefinitionName, DocumentName}; use crate::identity::state_transition::asset_lock_proof::{Decode, Encode}; diff --git a/packages/rs-dpp/src/data_contract/v0/accessors/mod.rs b/packages/rs-dpp/src/data_contract/v0/accessors/mod.rs index 1d0168c5e5..461037c65b 100644 --- a/packages/rs-dpp/src/data_contract/v0/accessors/mod.rs +++ b/packages/rs-dpp/src/data_contract/v0/accessors/mod.rs @@ -1,15 +1,14 @@ use crate::data_contract::accessors::v0::{DataContractV0Getters, DataContractV0Setters}; use crate::data_contract::config::DataContractConfig; -use crate::data_contract::document_type::accessors::DocumentTypeV0Getters; use crate::data_contract::document_type::{DocumentType, DocumentTypeRef}; use crate::data_contract::errors::DataContractError; -use crate::data_contract::storage_requirements::keys_for_document_type::StorageKeyRequirements; + use crate::data_contract::v0::DataContractV0; use crate::data_contract::DocumentName; use crate::metadata::Metadata; use crate::ProtocolError; use platform_value::Identifier; -use std::collections::{BTreeMap, BTreeSet}; +use std::collections::BTreeMap; impl DataContractV0Getters for DataContractV0 { fn id(&self) -> Identifier { @@ -52,9 +51,7 @@ impl DataContractV0Getters for DataContractV0 { } fn document_type_cloned_optional_for_name(&self, name: &str) -> Option { - self.document_types - .get(name) - .map(|document_type| document_type.clone()) + self.document_types.get(name).cloned() } fn has_document_type_for_name(&self, name: &str) -> bool { diff --git a/packages/rs-dpp/src/data_contract/v0/data_contract.rs b/packages/rs-dpp/src/data_contract/v0/data_contract.rs index 100cd1eea1..fbded8629e 100644 --- a/packages/rs-dpp/src/data_contract/v0/data_contract.rs +++ b/packages/rs-dpp/src/data_contract/v0/data_contract.rs @@ -7,7 +7,7 @@ use crate::data_contract::{DefinitionName, DocumentName}; use crate::data_contract::config::DataContractConfig; use crate::data_contract::document_type::DocumentType; -use crate::data_contract::storage_requirements::keys_for_document_type::StorageKeyRequirements; + use crate::metadata::Metadata; /// `DataContractV0` represents a data contract in a decentralized platform. diff --git a/packages/rs-dpp/src/errors/consensus/basic/json_schema_error/json_schema_error_data.rs b/packages/rs-dpp/src/errors/consensus/basic/json_schema_error/json_schema_error_data.rs index bceddf8afd..85a8c5bd93 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/json_schema_error/json_schema_error_data.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/json_schema_error/json_schema_error_data.rs @@ -142,7 +142,7 @@ impl<'a> From<&ValidationError<'a>> for JsonSchemaErrorData { keyword, params, property_name, - error_message, + error_message: _, } = JsonSchemaErrorData::from(error.deref()); builder diff --git a/packages/rs-dpp/src/errors/consensus/basic/unsupported_protocol_version_error.rs b/packages/rs-dpp/src/errors/consensus/basic/unsupported_protocol_version_error.rs index a7e258e6c9..9021c8df0e 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/unsupported_protocol_version_error.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/unsupported_protocol_version_error.rs @@ -3,8 +3,7 @@ use crate::consensus::ConsensusError; use crate::errors::ProtocolError; use bincode::{Decode, Encode}; use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; -use platform_value::Value; -use std::convert::TryFrom; + use thiserror::Error; #[derive( diff --git a/packages/rs-dpp/src/errors/consensus/basic/unsupported_version_error.rs b/packages/rs-dpp/src/errors/consensus/basic/unsupported_version_error.rs index fe6f447eb3..cba93d0a35 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/unsupported_version_error.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/unsupported_version_error.rs @@ -3,8 +3,7 @@ use crate::consensus::ConsensusError; use crate::errors::ProtocolError; use bincode::{Decode, Encode}; use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; -use platform_value::Value; -use std::convert::TryFrom; + use thiserror::Error; #[derive( diff --git a/packages/rs-dpp/src/identity/accessors/v0/mod.rs b/packages/rs-dpp/src/identity/accessors/v0/mod.rs index 390b0037be..f982da15ce 100644 --- a/packages/rs-dpp/src/identity/accessors/v0/mod.rs +++ b/packages/rs-dpp/src/identity/accessors/v0/mod.rs @@ -1,4 +1,4 @@ -use crate::identity::{Identity, IdentityPublicKey, KeyID, KeyType, Purpose, SecurityLevel}; +use crate::identity::{IdentityPublicKey, KeyID, KeyType, Purpose, SecurityLevel}; use crate::prelude::Revision; use crate::ProtocolError; diff --git a/packages/rs-dpp/src/identity/identity.rs b/packages/rs-dpp/src/identity/identity.rs index f73288d40c..72fc0662fd 100644 --- a/packages/rs-dpp/src/identity/identity.rs +++ b/packages/rs-dpp/src/identity/identity.rs @@ -1,6 +1,6 @@ use crate::identity::v0::IdentityV0; use crate::identity::{IdentityPublicKey, KeyID}; -use crate::prelude::{AssetLockProof, Revision}; +use crate::prelude::Revision; use crate::serialization::PlatformSerializable; use crate::util::hash; diff --git a/packages/rs-dpp/src/identity/identity_facade.rs b/packages/rs-dpp/src/identity/identity_facade.rs index 13ae58a919..07b65329b3 100644 --- a/packages/rs-dpp/src/identity/identity_facade.rs +++ b/packages/rs-dpp/src/identity/identity_facade.rs @@ -1,6 +1,5 @@ use dashcore::{InstantLock, Transaction}; -use platform_value::Value; -use platform_version::version::PlatformVersion; + use std::collections::BTreeMap; use crate::identity::state_transition::asset_lock_proof::chain::ChainAssetLockProof; @@ -20,7 +19,7 @@ use crate::state_transition::identity_update_transition::IdentityUpdateTransitio #[cfg(feature = "state-transitions")] use crate::state_transition::public_key_in_creation::IdentityPublicKeyInCreation; -use crate::{DashPlatformProtocolInitError, ProtocolError}; +use crate::ProtocolError; #[derive(Clone)] pub struct IdentityFacade { diff --git a/packages/rs-dpp/src/identity/identity_factory.rs b/packages/rs-dpp/src/identity/identity_factory.rs index 42134c9ed2..ebf264e66f 100644 --- a/packages/rs-dpp/src/identity/identity_factory.rs +++ b/packages/rs-dpp/src/identity/identity_factory.rs @@ -172,7 +172,7 @@ impl IdentityFactory { revision: 0, }); - let mut identity_create_transition = IdentityCreateTransition::V0( + let identity_create_transition = IdentityCreateTransition::V0( IdentityCreateTransitionV0::try_from_identity_v0(identity.clone(), asset_lock_proof)?, ); Ok((identity, identity_create_transition)) diff --git a/packages/rs-dpp/src/identity/identity_public_key/contract_bounds/mod.rs b/packages/rs-dpp/src/identity/identity_public_key/contract_bounds/mod.rs index b5df08e174..2d400838b6 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/contract_bounds/mod.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/contract_bounds/mod.rs @@ -4,7 +4,7 @@ use crate::identity::identity_public_key::contract_bounds::ContractBounds::{ }; use crate::ProtocolError; use bincode::{Decode, Encode}; -use serde::{Deserialize, Deserializer, Serialize, Serializer}; +use serde::{Deserialize, Serialize}; pub type ContractBoundsType = u8; diff --git a/packages/rs-dpp/src/identity/identity_public_key/key_type.rs b/packages/rs-dpp/src/identity/identity_public_key/key_type.rs index edf601b4ca..9a10d65211 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/key_type.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/key_type.rs @@ -34,8 +34,10 @@ use std::convert::TryFrom; PartialOrd, Encode, Decode, + Default, )] pub enum KeyType { + #[default] ECDSA_SECP256K1 = 0, BLS12_381 = 1, ECDSA_HASH160 = 2, @@ -43,14 +45,8 @@ pub enum KeyType { EDDSA_25519_HASH160 = 4, } -impl Default for KeyType { - fn default() -> Self { - KeyType::ECDSA_SECP256K1 - } -} - lazy_static! { - static ref KEY_TYPE_SIZES: HashMap = vec![ + static ref KEY_TYPE_SIZES: HashMap = [ (KeyType::ECDSA_SECP256K1, 33), (KeyType::BLS12_381, 48), (KeyType::ECDSA_HASH160, 20), diff --git a/packages/rs-dpp/src/identity/identity_public_key/purpose.rs b/packages/rs-dpp/src/identity/identity_public_key/purpose.rs index f192d4dedf..1e4fb81b6d 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/purpose.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/purpose.rs @@ -20,9 +20,11 @@ use std::convert::TryFrom; PartialOrd, Encode, Decode, + Default, )] pub enum Purpose { /// at least one authentication key must be registered for all security levels + #[default] AUTHENTICATION = 0, /// this key cannot be used for signing documents ENCRYPTION = 1, @@ -36,12 +38,6 @@ pub enum Purpose { VOTING = 5, } -impl Default for Purpose { - fn default() -> Self { - Purpose::AUTHENTICATION - } -} - impl TryFrom for Purpose { type Error = anyhow::Error; fn try_from(value: u8) -> Result { diff --git a/packages/rs-dpp/src/identity/identity_public_key/security_level.rs b/packages/rs-dpp/src/identity/identity_public_key/security_level.rs index ffb3d316c1..668293963b 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/security_level.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/security_level.rs @@ -21,20 +21,16 @@ use std::convert::TryFrom; Ord, Encode, Decode, + Default, )] pub enum SecurityLevel { + #[default] MASTER = 0, CRITICAL = 1, HIGH = 2, MEDIUM = 3, } -impl Default for SecurityLevel { - fn default() -> Self { - SecurityLevel::MASTER - } -} - #[cfg(feature = "cbor")] impl Into for SecurityLevel { fn into(self) -> CborValue { diff --git a/packages/rs-dpp/src/serialization/serialization_traits.rs b/packages/rs-dpp/src/serialization/serialization_traits.rs index 9c83fe4a56..ff19a4f945 100644 --- a/packages/rs-dpp/src/serialization/serialization_traits.rs +++ b/packages/rs-dpp/src/serialization/serialization_traits.rs @@ -3,7 +3,7 @@ use crate::identity::KeyType; use serde::{Deserialize, Serialize}; use crate::validation::SimpleConsensusValidationResult; -use crate::version::{FeatureVersion, PlatformVersion}; +use crate::version::PlatformVersion; use crate::{BlsModule, ProtocolError}; use platform_value::Value; diff --git a/packages/rs-dpp/src/state_transition/serialization.rs b/packages/rs-dpp/src/state_transition/serialization.rs index b77c303170..002590bf8b 100644 --- a/packages/rs-dpp/src/state_transition/serialization.rs +++ b/packages/rs-dpp/src/state_transition/serialization.rs @@ -3,9 +3,7 @@ use crate::state_transition::StateTransition; use crate::ProtocolError; impl StateTransition { - pub fn deserialize_many( - raw_state_transitions: &Vec>, - ) -> Result, ProtocolError> { + pub fn deserialize_many(raw_state_transitions: &[Vec]) -> Result, ProtocolError> { raw_state_transitions .iter() .map(|raw_state_transition| Self::deserialize_from_bytes(raw_state_transition)) @@ -327,7 +325,7 @@ mod tests { data_contract .document_type_for_name(extended_document.document_type_name()) .unwrap(), - extended_document.entropy().clone(), + *extended_document.entropy(), ) }) .collect::>(); diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/mod.rs index 35bc26c463..275398bbe2 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/mod.rs @@ -21,7 +21,7 @@ use crate::state_transition::documents_batch_transition::document_base_transitio use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; use derive_more::Display; -pub(self) mod property_names { +mod property_names { pub const ENTROPY: &str = "$entropy"; pub const CREATED_AT: &str = "$createdAt"; pub const UPDATED_AT: &str = "$updatedAt"; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/mod.rs index 5b546fbc01..ee32130575 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/mod.rs @@ -14,7 +14,7 @@ use std::collections::BTreeMap; pub use super::super::document_base_transition::IDENTIFIER_FIELDS; use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; -pub(self) mod property_names { +mod property_names { pub const REVISION: &str = "$revision"; pub const UPDATED_AT: &str = "$updatedAt"; } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/hash/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/hash/mod.rs index 697425d22f..69e746b366 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/hash/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/hash/mod.rs @@ -2,18 +2,17 @@ mod v0; use crate::state_transition::public_key_in_creation::IdentityPublicKeyInCreation; use crate::ProtocolError; -use platform_version::version::PlatformVersion; impl IdentityPublicKeyInCreation { pub fn hash(&self) -> Result<[u8; 20], ProtocolError> { match self { - IdentityPublicKeyInCreation::V0(v0) => self.hash_v0(), + IdentityPublicKeyInCreation::V0(_v0) => self.hash_v0(), } } pub fn hash_as_vec(&self) -> Result, ProtocolError> { match self { - IdentityPublicKeyInCreation::V0(v0) => self.hash_v0().map(|hash| hash.to_vec()), + IdentityPublicKeyInCreation::V0(_v0) => self.hash_v0().map(|hash| hash.to_vec()), } } } diff --git a/packages/rs-dpp/src/tests/fixtures/get_document_transitions_fixture.rs b/packages/rs-dpp/src/tests/fixtures/get_document_transitions_fixture.rs index 5b4cd5709e..8595c57433 100644 --- a/packages/rs-dpp/src/tests/fixtures/get_document_transitions_fixture.rs +++ b/packages/rs-dpp/src/tests/fixtures/get_document_transitions_fixture.rs @@ -9,8 +9,6 @@ use crate::state_transition::documents_batch_transition::document_transition::Do use crate::state_transition::documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; -use super::get_data_contract_fixture; - pub fn get_document_transitions_fixture<'a>( documents: impl IntoIterator< Item = ( diff --git a/packages/rs-dpp/src/tests/fixtures/instant_asset_lock_proof_fixture.rs b/packages/rs-dpp/src/tests/fixtures/instant_asset_lock_proof_fixture.rs index 9a1a627f0b..6b39976460 100644 --- a/packages/rs-dpp/src/tests/fixtures/instant_asset_lock_proof_fixture.rs +++ b/packages/rs-dpp/src/tests/fixtures/instant_asset_lock_proof_fixture.rs @@ -13,7 +13,6 @@ use dashcore::{ }; use crate::identity::state_transition::asset_lock_proof::{AssetLockProof, InstantAssetLockProof}; -use crate::util::vec::hex_to_array; //3bufpwQjL5qsvuP4fmCKgXJrKG852DDMYfi9J6XKqPAT //[198, 23, 40, 120, 58, 93, 0, 165, 27, 49, 4, 117, 107, 204, 67, 46, 164, 216, 230, 135, 201, 92, 31, 155, 62, 131, 211, 177, 139, 175, 163, 237] diff --git a/packages/rs-drive-abci/src/abci/handler/error/mod.rs b/packages/rs-drive-abci/src/abci/handler/error/mod.rs index 2d7f3a13e7..2a854fef12 100644 --- a/packages/rs-drive-abci/src/abci/handler/error/mod.rs +++ b/packages/rs-drive-abci/src/abci/handler/error/mod.rs @@ -8,6 +8,8 @@ use tenderdash_abci::proto::abci::ResponseException; /// ABCI handlers errors #[derive(Debug, thiserror::Error)] +// Allow dead code, as majority of these errors are reserved for future use +#[allow(dead_code)] pub enum HandlerError { /// ABCI Handler error (Cancelled) #[error("{0}")] diff --git a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs index 8368c3e21d..160a63008e 100644 --- a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs @@ -201,8 +201,8 @@ mod tests { 217, 221, 43, 251, 104, 84, 78, 35, 20, 237, 188, 237, 240, 216, 62, 79, 208, 96, 149, 116, 62, 82, 187, 135, 219, ]; - let state_transitions = StateTransition::deserialize_many(&vec![tx.clone()]) - .expect("expected a state transition"); + let state_transitions = + StateTransition::deserialize_many(&[tx.clone()]).expect("expected a state transition"); let state_transition = state_transitions.first().unwrap(); let StateTransition::DataContractCreate(contract_create) = state_transition else { panic!("expecting a data contract create"); @@ -235,8 +235,9 @@ mod tests { let transaction = platform.drive.grove.start_transaction(); let check_result = platform.check_tx(&tx).expect("expected to check tx"); + assert!(check_result.is_valid()); - let result = platform + let _result = platform .platform .process_raw_state_transitions( &vec![tx], @@ -1175,7 +1176,7 @@ mod tests { let high_key_pair = KeyPair::new(&secp, &mut rng); - let high_secret_key = high_key_pair.secret_key(); + let _high_secret_key = high_key_pair.secret_key(); let high_public_key = high_key_pair.public_key(); @@ -1223,7 +1224,7 @@ mod tests { }), }; - let signable_bytes = new_key + let _signable_bytes = new_key .signable_bytes() .expect("expected to get signable bytes"); @@ -1238,7 +1239,7 @@ mod tests { } .into(); - let mut update_transition: StateTransition = update_transition.into(); + let update_transition: StateTransition = update_transition.into(); let signable_bytes = update_transition .signable_bytes() diff --git a/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/v0/mod.rs b/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/v0/mod.rs index 0063cd5736..7c0cf75f7a 100644 --- a/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/v0/mod.rs @@ -1,5 +1,3 @@ -use dashcore_rpc::dashcore::hashes::Hash; - use dpp::block::epoch::Epoch; use dpp::validation::SimpleValidationResult; @@ -126,7 +124,7 @@ where block_header.core_chain_locked_height, block_state_info.height(), block_state_info.round(), - block_state_info.block_hash().map(|a| hex::encode(a)).unwrap_or("None".to_string()), + block_state_info.block_hash().map(hex::encode).unwrap_or("None".to_string()), block_state_info.core_chain_locked_height() ))); return Ok(validation_result.into()); diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_end/update_drive_cache/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_end/update_drive_cache/mod.rs index a3bb44c977..cc0692e8f3 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/block_end/update_drive_cache/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/block_end/update_drive_cache/mod.rs @@ -6,9 +6,8 @@ use crate::error::Error; use crate::platform_types::platform::Platform; use crate::rpc::core::CoreRPCLike; -use dpp::block::extended_block_info::ExtendedBlockInfo; + use dpp::version::PlatformVersion; -use drive::grovedb::Transaction; impl Platform where diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/add_process_epoch_change_operations/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/add_process_epoch_change_operations/v0/mod.rs index 24d58502f4..1314bd1116 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/add_process_epoch_change_operations/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/add_process_epoch_change_operations/v0/mod.rs @@ -36,7 +36,7 @@ use std::option::Option::None; use dpp::block::epoch::Epoch; -use dpp::fee::epoch::{perpetual_storage_epochs, GENESIS_EPOCH_INDEX, PERPETUAL_STORAGE_ERAS}; +use dpp::fee::epoch::{perpetual_storage_epochs, GENESIS_EPOCH_INDEX}; use dpp::fee::DEFAULT_ORIGINAL_FEE_MULTIPLIER; use dpp::version::PlatformVersion; use drive::drive::batch::grovedb_op_batch::GroveDbOpBatchV0Methods; diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_start/clear_drive_block_cache/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_start/clear_drive_block_cache/mod.rs index ab753ba88b..f8f2566863 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/block_start/clear_drive_block_cache/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/block_start/clear_drive_block_cache/mod.rs @@ -6,9 +6,8 @@ use crate::error::Error; use crate::platform_types::platform::Platform; use crate::rpc::core::CoreRPCLike; -use dpp::block::extended_block_info::ExtendedBlockInfo; + use dpp::version::PlatformVersion; -use drive::grovedb::Transaction; impl Platform where diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/create_owner_identity/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/create_owner_identity/v0/mod.rs index 616ef40b5d..79c1c9d126 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/create_owner_identity/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/create_owner_identity/v0/mod.rs @@ -2,7 +2,6 @@ use crate::error::Error; use crate::platform_types::platform::Platform; use crate::rpc::core::CoreRPCLike; use dashcore_rpc::dashcore_rpc_json::MasternodeListItem; -use dpp::dashcore::hashes::Hash; use dpp::identity::accessors::IdentityGettersV0; use dpp::identity::Identity; use dpp::version::PlatformVersion; diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/get_operator_identifier/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/get_operator_identifier/v0/mod.rs index a3aee5b860..150172ff41 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/get_operator_identifier/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/get_operator_identifier/v0/mod.rs @@ -2,7 +2,6 @@ use crate::error::Error; use crate::platform_types::platform::Platform; use crate::rpc::core::CoreRPCLike; use dashcore_rpc::dashcore_rpc_json::MasternodeListItem; -use dpp::dashcore::hashes::Hash; use dpp::version::PlatformVersion; impl Platform diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/get_voter_identifier/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/get_voter_identifier/v0/mod.rs index d3e4a39d5a..e7db6dc4a5 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/get_voter_identifier/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/get_voter_identifier/v0/mod.rs @@ -2,7 +2,6 @@ use crate::error::Error; use crate::platform_types::platform::Platform; use crate::rpc::core::CoreRPCLike; use dashcore_rpc::dashcore_rpc_json::MasternodeListItem; -use dpp::dashcore::hashes::Hash; use dpp::version::PlatformVersion; impl Platform diff --git a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/fetch_transactions_block_inclusion_status/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/fetch_transactions_block_inclusion_status/mod.rs index a63d7ae4f5..d882062c88 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/fetch_transactions_block_inclusion_status/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/fetch_transactions_block_inclusion_status/mod.rs @@ -2,7 +2,6 @@ use crate::error::execution::ExecutionError; use crate::error::Error; use crate::platform_types::platform::Platform; use crate::rpc::core::CoreRPCLike; -use dpp::identifier::Identifier; use dpp::version::PlatformVersion; use std::collections::BTreeMap; diff --git a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/fetch_transactions_block_inclusion_status/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/fetch_transactions_block_inclusion_status/v0/mod.rs index 6363d8d3d6..79620e55f0 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/fetch_transactions_block_inclusion_status/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/fetch_transactions_block_inclusion_status/v0/mod.rs @@ -1,6 +1,5 @@ use dpp::dashcore::hashes::Hash; use dpp::dashcore::Txid; -use dpp::prelude::Identifier; use std::collections::BTreeMap; use crate::{error::Error, platform_types::platform::Platform, rpc::core::CoreRPCLike}; diff --git a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/update_broadcasted_withdrawal_transaction_statuses/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/update_broadcasted_withdrawal_transaction_statuses/v0/mod.rs index b5ebb9f46f..d0d503ada1 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/update_broadcasted_withdrawal_transaction_statuses/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/update_broadcasted_withdrawal_transaction_statuses/v0/mod.rs @@ -5,8 +5,6 @@ use dpp::data_contracts::withdrawals_contract::WithdrawalStatus; use dpp::document::document_methods::DocumentMethodsV0; use dpp::document::{Document, DocumentV0Getters, DocumentV0Setters}; use dpp::platform_value::btreemap_extensions::BTreeValueMapHelper; -use dpp::platform_value::Bytes32; -use dpp::prelude::Identifier; use dpp::system_data_contracts::withdrawals_contract; use dpp::system_data_contracts::withdrawals_contract::document_types::withdrawal; use dpp::version::PlatformVersion; @@ -208,39 +206,34 @@ where #[cfg(test)] mod tests { - use dashcore_rpc::dashcore::{hashes::hex::FromHex, BlockHash, QuorumHash}; - use dashcore_rpc::dashcore_rpc_json::GetTransactionLockedResult; - use dpp::{ - data_contracts::withdrawals_contract, tests::fixtures::get_withdrawal_document_fixture, - }; - use drive::tests::helpers::setup::setup_document; - use serde_json::json; - use std::str::FromStr; - use crate::execution::types::block_execution_context::v0::BlockExecutionContextV0; use crate::execution::types::block_state_info::v0::BlockStateInfoV0; use crate::platform_types::epoch_info::v0::EpochInfoV0; use crate::platform_types::platform_state::v0::PlatformStateV0; use crate::rpc::core::MockCoreRPCLike; use crate::test::helpers::setup::TestPlatformBuilder; - + use dashcore_rpc::dashcore::{BlockHash, QuorumHash}; + use dashcore_rpc::dashcore_rpc_json::GetTransactionLockedResult; + use dpp::dashcore::hashes::Hash; + use dpp::dashcore::Txid; use dpp::data_contract::accessors::v0::DataContractV0Getters; - use dpp::document::DocumentV0Getters; use dpp::identity::core_script::CoreScript; use dpp::platform_value::platform_value; - - use crate::platform_types::platform::Platform; - use dpp::dashcore::hashes::Hash; - use dpp::dashcore::Txid; use dpp::system_data_contracts::withdrawals_contract::document_types::withdrawal; use dpp::version::PlatformVersion; use dpp::withdrawal::Pooling; + use dpp::{ + data_contracts::withdrawals_contract, tests::fixtures::get_withdrawal_document_fixture, + }; use dpp::{ prelude::Identifier, system_data_contracts::{load_system_data_contract, SystemDataContract}, }; + use drive::tests::helpers::setup::setup_document; use drive::tests::helpers::setup::setup_system_data_contract; + use serde_json::json; + use std::str::FromStr; #[test] fn test_statuses_are_updated() { diff --git a/packages/rs-drive-abci/src/execution/platform_events/initialization/initial_core_height/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/initialization/initial_core_height/v0/mod.rs index ae673a857c..3df1edb88d 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/initialization/initial_core_height/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/initialization/initial_core_height/v0/mod.rs @@ -2,7 +2,6 @@ use crate::error::execution::ExecutionError; use crate::error::Error; use crate::platform_types::platform::Platform; use crate::rpc::core::CoreRPCLike; -use dashcore_rpc::dashcore_rpc_json::Bip9SoftforkStatus; impl Platform where diff --git a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_raw_state_transitions/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_raw_state_transitions/mod.rs index 5f26cd86f7..ba3b7613da 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_raw_state_transitions/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_raw_state_transitions/mod.rs @@ -10,7 +10,6 @@ use dpp::block::block_info::BlockInfo; use dpp::fee::fee_result::FeeResult; use dpp::version::PlatformVersion; use drive::grovedb::Transaction; -use tenderdash_abci::proto::abci::ExecTxResult; impl Platform where diff --git a/packages/rs-drive-abci/src/execution/types/execution_operation/mod.rs b/packages/rs-drive-abci/src/execution/types/execution_operation/mod.rs index a15e2095c1..68530fb10e 100644 --- a/packages/rs-drive-abci/src/execution/types/execution_operation/mod.rs +++ b/packages/rs-drive-abci/src/execution/types/execution_operation/mod.rs @@ -3,7 +3,6 @@ use crate::execution::types::execution_operation::signature_verification_operati use dpp::fee::fee_result::FeeResult; use dpp::fee::Credits; use dpp::version::PlatformVersion; -use drive::drive::batch::DriveOperation; pub mod signature_verification_operation; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_identity_public_key_contract_bounds/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_identity_public_key_contract_bounds/v0/mod.rs index 43acebf0c0..48753f8193 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_identity_public_key_contract_bounds/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_identity_public_key_contract_bounds/v0/mod.rs @@ -1,7 +1,7 @@ use crate::error::Error; use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; use dpp::consensus::basic::document::{ - DataContractNotPresentError, InvalidDocumentTypeError, MissingDocumentTypeError, + DataContractNotPresentError, InvalidDocumentTypeError, }; use dpp::consensus::basic::identity::DataContractBoundsNotPresentError; use dpp::consensus::basic::BasicError; @@ -22,7 +22,7 @@ use dpp::validation::SimpleConsensusValidationResult; use dpp::version::PlatformVersion; use drive::drive::Drive; use drive::drive::identity::key::fetch::{IdentityKeysRequest, KeyKindRequestType, KeyRequestType, OptionalSingleIdentityPublicKeyOutcome}; -use drive::grovedb::{Transaction, TransactionArg}; +use drive::grovedb::TransactionArg; pub(super) fn validate_identity_public_keys_contract_bounds_v0( identity_id: Identifier, @@ -55,7 +55,7 @@ fn validate_identity_public_key_contract_bounds_v0( identity_public_key_in_creation: &IdentityPublicKeyInCreation, drive: &Drive, transaction: TransactionArg, - execution_context: &mut StateTransitionExecutionContext, + _execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion, ) -> Result { //todo: we should add to the execution context the cost of fetching contracts diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_identity_public_key_ids_dont_exist_in_state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_identity_public_key_ids_dont_exist_in_state/v0/mod.rs index dde54fe054..a9feed80d5 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_identity_public_key_ids_dont_exist_in_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_identity_public_key_ids_dont_exist_in_state/v0/mod.rs @@ -21,7 +21,7 @@ pub(super) fn validate_identity_public_key_ids_dont_exist_in_state_v0( identity_public_keys_with_witness: &[IdentityPublicKeyInCreation], drive: &Drive, transaction: TransactionArg, - execution_context: &mut StateTransitionExecutionContext, + _execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion, ) -> Result { // first let's check that the identity has no keys with the same id diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_identity_public_key_ids_exist_in_state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_identity_public_key_ids_exist_in_state/v0/mod.rs index 32f596f1e3..3751c64b84 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_identity_public_key_ids_exist_in_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_identity_public_key_ids_exist_in_state/v0/mod.rs @@ -20,7 +20,7 @@ pub(super) fn validate_identity_public_key_ids_exist_in_state_v0( identity_id: Identifier, key_ids: &[KeyID], drive: &Drive, - execution_context: &mut StateTransitionExecutionContext, + _execution_context: &mut StateTransitionExecutionContext, transaction: TransactionArg, platform_version: &PlatformVersion, ) -> Result { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_unique_identity_public_key_hashes_in_state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_unique_identity_public_key_hashes_in_state/v0/mod.rs index b58dcf59c8..7d533821be 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_unique_identity_public_key_hashes_in_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_unique_identity_public_key_hashes_in_state/v0/mod.rs @@ -21,7 +21,7 @@ use std::collections::HashMap; pub(super) fn validate_unique_identity_public_key_hashes_in_state_v0( identity_public_keys_with_witness: &[IdentityPublicKeyInCreation], drive: &Drive, - execution_context: &mut StateTransitionExecutionContext, + _execution_context: &mut StateTransitionExecutionContext, transaction: TransactionArg, platform_version: &PlatformVersion, ) -> Result { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/v0/mod.rs index 92d9802147..f65d526fe0 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/v0/mod.rs @@ -1,7 +1,6 @@ use crate::error::Error; use crate::platform_types::platform::PlatformRef; use crate::rpc::core::CoreRPCLike; -use serde::Serialize; use dpp::consensus::basic::data_contract::{ DataContractInvalidIndexDefinitionUpdateError, IncompatibleDataContractSchemaError, @@ -16,7 +15,7 @@ use dpp::data_contract::config::v0::DataContractConfigGettersV0; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::data_contract::document_type::schema::{ - get_operation_and_property_name_json, validate_schema_compatibility, EMPTY_JSON, + get_operation_and_property_name_json, validate_schema_compatibility, }; use dpp::data_contract::schema::DataContractSchemaMethodsV0; use dpp::data_contract::JsonValue; @@ -184,7 +183,7 @@ impl DataContractUpdateStateTransitionStateValidationV0 for DataContractUpdateTr let diffs = validate_schema_compatibility(&old_defs_json, &new_defs_json, platform_version)?; - if diffs.len() > 0 { + if !diffs.is_empty() { let (operation_name, property_name) = get_operation_and_property_name_json(&diffs[0]); @@ -224,7 +223,7 @@ impl DataContractUpdateStateTransitionStateValidationV0 for DataContractUpdateTr platform_version, )?; - if diffs.len() > 0 { + if !diffs.is_empty() { let (operation_name, property_name) = get_operation_and_property_name_json(&diffs[0]); diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/executor.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/executor.rs index 6fcd49f3d5..70643e9171 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/executor.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/executor.rs @@ -13,7 +13,7 @@ use crate::error::Error; pub trait DataTriggerExecutor { fn validate_with_data_triggers( &self, - data_trigger_bindings: &Vec, + data_trigger_bindings: &[DataTriggerBinding], context: &DataTriggerExecutionContext<'_>, platform_version: &PlatformVersion, ) -> Result; @@ -22,7 +22,7 @@ pub trait DataTriggerExecutor { impl DataTriggerExecutor for DocumentTransitionAction { fn validate_with_data_triggers( &self, - data_trigger_bindings: &Vec, + data_trigger_bindings: &[DataTriggerBinding], context: &DataTriggerExecutionContext, platform_version: &PlatformVersion, ) -> Result { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs index c7b8a06bd2..06dab8e893 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs @@ -18,14 +18,14 @@ use dpp::document::{Document, DocumentV0Getters}; use dpp::validation::SimpleConsensusValidationResult; use dpp::{consensus::ConsensusError, prelude::Identifier, validation::ConsensusValidationResult}; -use dpp::state_transition::documents_batch_transition::{DocumentsBatchTransition}; +use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; use dpp::state_transition::documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; use dpp::state_transition::documents_batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; use dpp::state_transition::documents_batch_transition::document_transition::{DocumentTransition, DocumentReplaceTransition, DocumentTransitionV0Methods}; use dpp::state_transition::StateTransitionLike; use drive::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::DocumentCreateTransitionAction; use drive::state_transition_action::document::documents_batch::document_transition::document_delete_transition_action::DocumentDeleteTransitionAction; -use drive::state_transition_action::document::documents_batch::document_transition::document_replace_transition_action::{DocumentReplaceTransitionAction, DocumentReplaceTransitionActionAccessorsV0}; +use drive::state_transition_action::document::documents_batch::document_transition::document_replace_transition_action::DocumentReplaceTransitionAction; use drive::state_transition_action::document::documents_batch::document_transition::DocumentTransitionAction; use drive::state_transition_action::document::documents_batch::DocumentsBatchTransitionAction; use drive::state_transition_action::document::documents_batch::v0::DocumentsBatchTransitionActionV0; @@ -36,8 +36,7 @@ use drive::grovedb::TransactionArg; use dpp::state_transition::documents_batch_transition::document_transition::document_replace_transition::v0::v0_methods::DocumentReplaceTransitionV0Methods; use drive::drive::contract::DataContractFetchInfo; -use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; -use crate::execution::types::state_transition_execution_context::{StateTransitionExecutionContext}; +use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; pub(in crate::execution::validation::state_transition::state_transitions::documents_batch) trait DocumentsBatchTransitionTransformerV0 { @@ -73,7 +72,7 @@ trait DocumentsBatchTransitionInternalTransformerV0 { platform_version: &PlatformVersion, ) -> Result>, Error>; /// The data contract can be of multiple difference versions - fn transform_transition_v0<'a>( + fn transform_transition_v0( validate: bool, data_contract_fetch_info: Arc, transition: &DocumentTransition, diff --git a/packages/rs-drive-abci/src/logging/logger.rs b/packages/rs-drive-abci/src/logging/logger.rs index ea04a2f74b..bb2755baed 100644 --- a/packages/rs-drive-abci/src/logging/logger.rs +++ b/packages/rs-drive-abci/src/logging/logger.rs @@ -2,8 +2,6 @@ use crate::logging::config::LogConfig; use crate::logging::destination::{LogDestinationWriter, Writer}; use crate::logging::error::Error; use crate::logging::{LogConfigs, LogFormat, LogLevel}; - -use itertools::Itertools; use lazy_static::__Deref; use std::collections::HashMap; use std::fmt::Debug; @@ -14,7 +12,6 @@ use tracing_subscriber::fmt; use tracing_subscriber::prelude::__tracing_subscriber_SubscriberExt; use tracing_subscriber::registry; use tracing_subscriber::util::SubscriberInitExt; -use tracing_subscriber::util::TryInitError; use tracing_subscriber::EnvFilter; use tracing_subscriber::Layer; use tracing_subscriber::Registry; diff --git a/packages/rs-drive-abci/src/main.rs b/packages/rs-drive-abci/src/main.rs index 0ba1ae2c38..234fccb5e0 100644 --- a/packages/rs-drive-abci/src/main.rs +++ b/packages/rs-drive-abci/src/main.rs @@ -409,14 +409,13 @@ mod test { db_opts.create_missing_column_families(false); db_opts.create_if_missing(false); - let db = rocksdb::DB::open_cf(&db_opts, &db_path, vec!["roots", "meta", "aux"]).unwrap(); + let db = rocksdb::DB::open_cf(&db_opts, db_path, vec!["roots", "meta", "aux"]).unwrap(); let cf_handle = db.cf_handle(cf).unwrap(); let iter = db.iterator_cf(cf_handle, IteratorMode::Start); // let iter = db.iterator(IteratorMode::Start); - let mut i = 0; - for item in iter { + for (i, item) in iter.enumerate() { let (key, mut value) = item.unwrap(); // println!("{} = {}", hex::encode(&key), hex::encode(value)); tracing::trace!(cf, key=?hex::encode(&key), value=hex::encode(&value),"found item in rocksdb"); @@ -428,7 +427,6 @@ mod test { tracing::debug!(cf, key=?hex::encode(&key), value=hex::encode(&value), "corrupt_rocksdb_item: corrupting item"); return; } - i += 1; } panic!( "cannot corrupt db: cannot find {}-th item in rocksdb column family {}", diff --git a/packages/rs-drive-abci/src/platform_types/platform/mod.rs b/packages/rs-drive-abci/src/platform_types/platform/mod.rs index bf317b69f2..c1519be922 100644 --- a/packages/rs-drive-abci/src/platform_types/platform/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/platform/mod.rs @@ -7,7 +7,6 @@ use std::fmt::{Debug, Formatter}; #[cfg(any(feature = "mocks", test))] use crate::rpc::core::MockCoreRPCLike; -use dashcore_rpc::dashcore::hashes::hex::FromHex; use drive::drive::defaults::PROTOCOL_VERSION; use std::path::Path; use std::str::FromStr; diff --git a/packages/rs-drive-abci/tests/strategy_tests/core_update_tests.rs b/packages/rs-drive-abci/tests/strategy_tests/core_update_tests.rs index 344c11822b..65b0280bdc 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/core_update_tests.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/core_update_tests.rs @@ -259,7 +259,7 @@ mod tests { let quorum_size = 100; let config = PlatformConfig { - quorum_size: 100, + quorum_size, execution: ExecutionConfig { verify_sum_trees: true, validator_set_quorum_rotation_block_count: 25, diff --git a/packages/rs-drive-abci/tests/strategy_tests/execution.rs b/packages/rs-drive-abci/tests/strategy_tests/execution.rs index e4564f4629..5d8dcd17c0 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/execution.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/execution.rs @@ -18,7 +18,6 @@ use dpp::block::extended_block_info::v0::ExtendedBlockInfoV0Getters; use dpp::identity::accessors::IdentityGettersV0; use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; use strategy_tests::operations::FinalizeBlockOperation::IdentityAddKeys; -use strategy_tests::Strategy; use dashcore_rpc::json::{ExtendedQuorumListResult, SoftforkInfo}; use drive_abci::abci::AbciApplication; @@ -321,7 +320,7 @@ pub(crate) fn run_chain_for_strategy( let initial_all_masternodes: Vec<_> = initial_masternodes_with_updates .into_iter() - .chain(initial_hpmns_with_updates.clone().into_iter()) + .chain(initial_hpmns_with_updates.clone()) .collect(); platform diff --git a/packages/rs-drive-abci/tests/strategy_tests/failures.rs b/packages/rs-drive-abci/tests/strategy_tests/failures.rs index 148f9ad61b..bc8c758abb 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/failures.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/failures.rs @@ -3,7 +3,7 @@ mod tests { use crate::execution::run_chain_for_strategy; use rand::rngs::StdRng; use rand::SeedableRng; - use std::collections::{BTreeMap, BTreeSet, HashMap}; + use std::collections::{BTreeMap, HashMap}; use strategy_tests::frequency::Frequency; use crate::strategy::{FailureStrategy, NetworkStrategy}; @@ -17,7 +17,7 @@ mod tests { }; use dpp::identity::accessors::IdentityGettersV0; use dpp::platform_value::Value; - use dpp::prelude::{Identifier, Identity}; + use dpp::prelude::Identity; use dpp::tests::json_document::json_document_to_created_contract; use dpp::version::PlatformVersion; use drive_abci::test::helpers::setup::TestPlatformBuilder; diff --git a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs index cd21ba4c98..7811ee3f19 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs @@ -4,13 +4,13 @@ use crate::BlockHeight; use dashcore_rpc::dashcore; use dashcore_rpc::dashcore::{ProTxHash, QuorumHash}; use dpp::block::block_info::BlockInfo; -use dpp::data_contract::created_data_contract::CreatedDataContract; + use dpp::data_contract::document_type::random_document::CreateRandomDocument; use dpp::data_contract::DataContract; use strategy_tests::frequency::Frequency; use strategy_tests::operations::FinalizeBlockOperation::IdentityAddKeys; use strategy_tests::operations::{ - DocumentAction, DocumentOp, FinalizeBlockOperation, IdentityUpdateOp, Operation, OperationType, + DocumentAction, DocumentOp, FinalizeBlockOperation, IdentityUpdateOp, OperationType, }; use dpp::document::DocumentV0Getters; @@ -50,7 +50,7 @@ use dpp::state_transition::documents_batch_transition::{DocumentsBatchTransition use dpp::state_transition::documents_batch_transition::document_transition::{DocumentDeleteTransition, DocumentReplaceTransition}; use drive::drive::document::query::QueryDocumentsOutcomeV0Methods; use dpp::state_transition::data_contract_create_transition::methods::v0::DataContractCreateTransitionMethodsV0; -use dpp::state_transition::identity_create_transition::IdentityCreateTransition; + use simple_signer::signer::SimpleSigner; #[derive(Clone, Debug, Default)] diff --git a/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs b/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs index 33313656c7..b7c70ae424 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs @@ -1,26 +1,26 @@ -use dapi_grpc::platform::v0::{get_proofs_request, GetProofsRequest, GetProofsResponse}; +use dapi_grpc::platform::v0::{ + get_proofs_request, GetProofsRequest, GetProofsResponse, +}; +use dpp::document::Document; +use dpp::identity::PartialIdentity; +use dpp::state_transition::StateTransition; +use drive::drive::Drive; +use drive::query::SingleDocumentDriveQuery; +use drive_abci::abci::AbciApplication; +use drive_abci::platform_types::platform::PlatformRef; +use drive_abci::rpc::core::MockCoreRPCLike; use dapi_grpc::platform::VersionedGrpcResponse; - use dapi_grpc::platform::v0::get_proofs_request::{get_proofs_request_v0, GetProofsRequestV0}; use dpp::block::block_info::BlockInfo; use dpp::data_contract::accessors::v0::DataContractV0Getters; -use dpp::document::Document; -use dpp::identity::PartialIdentity; -use dpp::state_transition::{StateTransition, StateTransitionLike}; use dpp::version::PlatformVersion; use drive::drive::identity::key::fetch::IdentityKeysRequest; -use drive::drive::Drive; -use drive::query::SingleDocumentDriveQuery; use drive::state_transition_action::document::documents_batch::document_transition::DocumentTransitionAction; use drive::state_transition_action::StateTransitionAction; -use drive_abci::abci::AbciApplication; use drive_abci::execution::validation::state_transition::transformer::StateTransitionActionTransformerV0; -use drive_abci::platform_types::platform::PlatformRef; use drive_abci::platform_types::platform_state::v0::PlatformStateV0Methods; -use drive_abci::rpc::core::MockCoreRPCLike; use prost::Message; use tenderdash_abci::proto::abci::ExecTxResult; - use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; use dpp::prelude::ConsensusValidationResult; diff --git a/packages/rs-drive/src/drive/batch/drive_op_batch/document.rs b/packages/rs-drive/src/drive/batch/drive_op_batch/document.rs index 148e47fbd8..4fd13a99cc 100644 --- a/packages/rs-drive/src/drive/batch/drive_op_batch/document.rs +++ b/packages/rs-drive/src/drive/batch/drive_op_batch/document.rs @@ -19,7 +19,7 @@ use dpp::system_data_contracts::withdrawals_contract::document_types::withdrawal use dpp::version::PlatformVersion; use grovedb::batch::KeyInfoPath; use grovedb::{EstimatedLayerInformation, TransactionArg}; -use std::borrow::{Borrow, Cow}; +use std::borrow::Cow; use std::collections::HashMap; /// A wrapper for a document operation diff --git a/packages/rs-drive/src/drive/grove_operations/grove_clear/mod.rs b/packages/rs-drive/src/drive/grove_operations/grove_clear/mod.rs index f62bc04084..22d71c89d0 100644 --- a/packages/rs-drive/src/drive/grove_operations/grove_clear/mod.rs +++ b/packages/rs-drive/src/drive/grove_operations/grove_clear/mod.rs @@ -3,7 +3,7 @@ mod v0; use crate::drive::Drive; use crate::error::drive::DriveError; use crate::error::Error; -use crate::fee::op::LowLevelDriveOperation; + use dpp::version::drive_versions::DriveVersion; use grovedb::TransactionArg; diff --git a/packages/rs-drive/src/drive/identity/contract_info/insert/mod.rs b/packages/rs-drive/src/drive/identity/contract_info/insert/mod.rs index 9b0e2876a2..f28aa81c83 100644 --- a/packages/rs-drive/src/drive/identity/contract_info/insert/mod.rs +++ b/packages/rs-drive/src/drive/identity/contract_info/insert/mod.rs @@ -1,15 +1,6 @@ mod add_potential_contract_info_for_contract_bounded_key; -use crate::drive::batch::DriveOperation; -use crate::drive::grove_operations::BatchInsertApplyType::StatefulBatchInsert; -use crate::drive::grove_operations::BatchInsertTreeApplyType::StatefulBatchInsertTree; use crate::drive::identity::contract_info::insert::DataContractApplyInfo::ContractBased; -use crate::drive::identity::IdentityRootStructure::IdentityContractInfo; -use crate::drive::identity::{ - identity_contract_info_group_path_vec, identity_contract_info_root_path_vec, - identity_key_location_within_identity_vec, identity_path_vec, -}; -use crate::drive::object_size_info::{PathKeyElementInfo, PathKeyInfo}; use crate::drive::Drive; use crate::error::identity::IdentityError; use crate::error::Error; @@ -19,13 +10,10 @@ use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::identifier::Identifier; use dpp::identity::contract_bounds::ContractBounds; -use dpp::identity::{IdentityPublicKey, KeyID, Purpose}; +use dpp::identity::{KeyID, Purpose}; use dpp::version::PlatformVersion; -use grovedb::batch::KeyInfoPath; -use grovedb::reference_path::ReferencePathType::UpstreamRootHeightReference; -use grovedb::{Element, EstimatedLayerInformation, TransactionArg}; -use integer_encoding::VarInt; -use std::collections::{BTreeMap, HashMap}; +use grovedb::TransactionArg; +use std::collections::BTreeMap; pub enum DataContractApplyInfo { /// The root_id is either a contract id or an owner id @@ -99,7 +87,10 @@ impl DataContractApplyInfo { document_type_keys: Default::default(), contract_keys: vec![(key_id, purpose)], }), - ContractBounds::SingleContractDocumentType { document_type_name: document_type, .. } => { + ContractBounds::SingleContractDocumentType { + document_type_name: document_type, + .. + } => { let document_type = contract .document_type_for_name(document_type) .map_err(Error::Protocol)?; @@ -111,11 +102,10 @@ impl DataContractApplyInfo { )]), contract_keys: vec![], }) - } - // ContractBounds::MultipleContractsOfSameOwner { .. } => Ok(ContractFamilyBased { - // contracts_owner_id: contract.owner_id(), - // family_keys: vec![key_id], - // }), + } // ContractBounds::MultipleContractsOfSameOwner { .. } => Ok(ContractFamilyBased { + // contracts_owner_id: contract.owner_id(), + // family_keys: vec![key_id], + // }), } } } diff --git a/packages/rs-drive/src/drive/identity/estimation_costs/for_identity_contract_info/v0/mod.rs b/packages/rs-drive/src/drive/identity/estimation_costs/for_identity_contract_info/v0/mod.rs index d55a9f82a8..f5da420585 100644 --- a/packages/rs-drive/src/drive/identity/estimation_costs/for_identity_contract_info/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/estimation_costs/for_identity_contract_info/v0/mod.rs @@ -1,18 +1,11 @@ -use crate::drive::defaults::{AVERAGE_BALANCE_SIZE, DEFAULT_HASH_SIZE_U8}; - -use crate::drive::{identity_tree_path, Drive}; - +use crate::drive::defaults::DEFAULT_HASH_SIZE_U8; +use crate::drive::identity::identity_contract_info_root_path_vec; +use crate::drive::Drive; use grovedb::batch::KeyInfoPath; -use grovedb::EstimatedLayerCount::{ApproximateElements, EstimatedLevel, PotentiallyAtMaxElements}; +use grovedb::EstimatedLayerCount::PotentiallyAtMaxElements; use grovedb::EstimatedLayerInformation; -use grovedb::EstimatedLayerSizes::{AllItems, AllReference, AllSubtrees}; - -use crate::drive::identity::estimation_costs::KEY_REFERENCE_SIZE; -use crate::drive::identity::{ - identity_contract_info_group_path_vec, identity_contract_info_root_path, - identity_contract_info_root_path_vec, -}; -use grovedb::EstimatedSumTrees::{NoSumTrees, SomeSumTrees}; +use grovedb::EstimatedLayerSizes::AllSubtrees; +use grovedb::EstimatedSumTrees::NoSumTrees; use std::collections::HashMap; impl Drive { diff --git a/packages/rs-drive/src/drive/identity/estimation_costs/for_identity_contract_info_group/v0/mod.rs b/packages/rs-drive/src/drive/identity/estimation_costs/for_identity_contract_info_group/v0/mod.rs index 030ef0e3f6..c01737d438 100644 --- a/packages/rs-drive/src/drive/identity/estimation_costs/for_identity_contract_info_group/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/estimation_costs/for_identity_contract_info_group/v0/mod.rs @@ -1,16 +1,10 @@ -use crate::drive::{identity_tree_path, Drive}; - +use crate::drive::identity::identity_contract_info_group_path_vec; +use crate::drive::Drive; use grovedb::batch::KeyInfoPath; -use grovedb::EstimatedLayerCount::{ApproximateElements, EstimatedLevel, PotentiallyAtMaxElements}; +use grovedb::EstimatedLayerCount::ApproximateElements; use grovedb::EstimatedLayerInformation; -use grovedb::EstimatedLayerSizes::{AllItems, AllReference, AllSubtrees}; - -use crate::drive::identity::estimation_costs::KEY_REFERENCE_SIZE; -use crate::drive::identity::{ - identity_contract_info_group_path_vec, identity_contract_info_root_path, - identity_contract_info_root_path_vec, -}; -use grovedb::EstimatedSumTrees::{NoSumTrees, SomeSumTrees}; +use grovedb::EstimatedLayerSizes::AllSubtrees; +use grovedb::EstimatedSumTrees::NoSumTrees; use std::collections::HashMap; impl Drive { diff --git a/packages/rs-drive/src/drive/identity/key/fetch/fetch_identity_keys/v0/mod.rs b/packages/rs-drive/src/drive/identity/key/fetch/fetch_identity_keys/v0/mod.rs index cc69305c88..76bd3f6986 100644 --- a/packages/rs-drive/src/drive/identity/key/fetch/fetch_identity_keys/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/key/fetch/fetch_identity_keys/v0/mod.rs @@ -2,7 +2,7 @@ use crate::drive::identity::key::fetch::KeyRequestType::{ AllKeys, ContractBoundKey, ContractDocumentTypeBoundKey, SearchKey, SpecificKeys, }; use crate::drive::identity::key::fetch::{ - IdentityKeysRequest, IdentityPublicKeyResult, KeyKindRequestType, KeyRequestType, + IdentityKeysRequest, IdentityPublicKeyResult, KeyKindRequestType, }; use crate::drive::Drive; use crate::error::Error; diff --git a/packages/rs-drive/src/drive/identity/key/fetch/mod.rs b/packages/rs-drive/src/drive/identity/key/fetch/mod.rs index 9f0cbcfce5..0b201c3d64 100644 --- a/packages/rs-drive/src/drive/identity/key/fetch/mod.rs +++ b/packages/rs-drive/src/drive/identity/key/fetch/mod.rs @@ -47,7 +47,6 @@ use dpp::prelude::IdentityPublicKey; use dpp::serialization::PlatformDeserializable; use dpp::version::PlatformVersion; -#[cfg(any(feature = "full", feature = "verify"))] use crate::drive::identity::identity_contract_info_group_path_key_purpose_vec; use crate::drive::identity::key::fetch::KeyRequestType::{ ContractBoundKey, ContractDocumentTypeBoundKey, diff --git a/packages/rs-drive/src/drive/identity/key/insert/insert_key_to_storage/mod.rs b/packages/rs-drive/src/drive/identity/key/insert/insert_key_to_storage/mod.rs index bd56e6a67e..529413aa77 100644 --- a/packages/rs-drive/src/drive/identity/key/insert/insert_key_to_storage/mod.rs +++ b/packages/rs-drive/src/drive/identity/key/insert/insert_key_to_storage/mod.rs @@ -5,8 +5,6 @@ use crate::error::drive::DriveError; use crate::error::Error; use crate::fee::op::LowLevelDriveOperation; use dpp::identity::IdentityPublicKey; - -use dpp::version::drive_versions::DriveVersion; use platform_version::version::PlatformVersion; impl Drive { diff --git a/packages/rs-drive/src/drive/identity/key/insert/insert_new_non_unique_key/mod.rs b/packages/rs-drive/src/drive/identity/key/insert/insert_new_non_unique_key/mod.rs index 4b4123e4a0..48d2b06f83 100644 --- a/packages/rs-drive/src/drive/identity/key/insert/insert_new_non_unique_key/mod.rs +++ b/packages/rs-drive/src/drive/identity/key/insert/insert_new_non_unique_key/mod.rs @@ -5,7 +5,7 @@ use crate::error::drive::DriveError; use crate::error::Error; use crate::fee::op::LowLevelDriveOperation; use dpp::identity::IdentityPublicKey; -use dpp::version::drive_versions::DriveVersion; + use grovedb::batch::KeyInfoPath; use grovedb::{EstimatedLayerInformation, TransactionArg}; diff --git a/packages/rs-drive/src/drive/identity/key/insert/insert_new_non_unique_key/v0/mod.rs b/packages/rs-drive/src/drive/identity/key/insert/insert_new_non_unique_key/v0/mod.rs index 95e2869bd1..aa90b52450 100644 --- a/packages/rs-drive/src/drive/identity/key/insert/insert_new_non_unique_key/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/key/insert/insert_new_non_unique_key/v0/mod.rs @@ -4,7 +4,7 @@ use crate::fee::op::LowLevelDriveOperation; use dpp::block::epoch::Epoch; use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; use dpp::identity::{IdentityPublicKey, Purpose}; -use dpp::version::drive_versions::DriveVersion; + use grovedb::batch::KeyInfoPath; use grovedb::{EstimatedLayerInformation, TransactionArg}; use integer_encoding::VarInt; diff --git a/packages/rs-drive/src/drive/identity/key/insert/insert_new_unique_key/mod.rs b/packages/rs-drive/src/drive/identity/key/insert/insert_new_unique_key/mod.rs index 3bbf64178e..47922b982e 100644 --- a/packages/rs-drive/src/drive/identity/key/insert/insert_new_unique_key/mod.rs +++ b/packages/rs-drive/src/drive/identity/key/insert/insert_new_unique_key/mod.rs @@ -5,7 +5,7 @@ use crate::error::drive::DriveError; use crate::error::Error; use crate::fee::op::LowLevelDriveOperation; use dpp::identity::IdentityPublicKey; -use dpp::version::drive_versions::DriveVersion; + use grovedb::batch::KeyInfoPath; use grovedb::{EstimatedLayerInformation, TransactionArg}; diff --git a/packages/rs-drive/src/drive/identity/key/insert/insert_new_unique_key/v0/mod.rs b/packages/rs-drive/src/drive/identity/key/insert/insert_new_unique_key/v0/mod.rs index 20933bde0c..0f2fd40041 100644 --- a/packages/rs-drive/src/drive/identity/key/insert/insert_new_unique_key/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/key/insert/insert_new_unique_key/v0/mod.rs @@ -4,7 +4,7 @@ use crate::fee::op::LowLevelDriveOperation; use dpp::block::epoch::Epoch; use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; use dpp::identity::{IdentityPublicKey, Purpose}; -use dpp::version::drive_versions::DriveVersion; + use grovedb::batch::KeyInfoPath; use grovedb::{EstimatedLayerInformation, TransactionArg}; use integer_encoding::VarInt; diff --git a/packages/rs-drive/src/drive/identity/mod.rs b/packages/rs-drive/src/drive/identity/mod.rs index c40f1b9278..eb67fc6494 100644 --- a/packages/rs-drive/src/drive/identity/mod.rs +++ b/packages/rs-drive/src/drive/identity/mod.rs @@ -44,7 +44,6 @@ use dpp::identity::{KeyID, Purpose, SecurityLevel}; /// Everything related to withdrawals pub mod withdrawals; -use dpp::identity::KeyType; #[cfg(feature = "full")] use dpp::identity::Purpose::AUTHENTICATION; #[cfg(feature = "full")] diff --git a/packages/rs-platform-value/src/btreemap_extensions/btreemap_path_extensions.rs b/packages/rs-platform-value/src/btreemap_extensions/btreemap_path_extensions.rs index dbb2caaf58..12890d38b6 100644 --- a/packages/rs-platform-value/src/btreemap_extensions/btreemap_path_extensions.rs +++ b/packages/rs-platform-value/src/btreemap_extensions/btreemap_path_extensions.rs @@ -179,7 +179,7 @@ where fn get_optional_identifier_at_path(&self, path: &str) -> Result, Error> { self.get_optional_at_path(path)? - .map(|v| v.borrow().to_hash256()) + .map(|v| v.to_hash256()) .transpose() } @@ -192,8 +192,7 @@ where fn get_optional_string_at_path(&self, path: &str) -> Result, Error> { self.get_optional_at_path(path)? .map(|v| { - v.borrow() - .as_text() + v.as_text() .map(|str| str.to_string()) .ok_or_else(|| Error::StructureError(format!("{path} must be a string"))) }) @@ -208,8 +207,7 @@ where fn get_optional_str_at_path(&self, path: &str) -> Result, Error> { self.get_optional_at_path(path)? .map(|v| { - v.borrow() - .as_text() + v.as_text() .ok_or_else(|| Error::StructureError(format!("{path} must be a string"))) }) .transpose() @@ -235,11 +233,10 @@ where { self.get_optional_at_path(path)? .and_then(|v| { - let borrowed = v.borrow(); - if borrowed.is_null() { + if v.is_null() { None } else { - Some(v.borrow().to_integer()) + Some(v.to_integer()) } }) .transpose() @@ -307,14 +304,7 @@ where fn get_optional_bool_at_path(&self, path: &str) -> Result, Error> { self.get_optional_at_path(path)? - .and_then(|v| { - let borrowed = v.borrow(); - if borrowed.is_null() { - None - } else { - Some(v.borrow().to_bool()) - } - }) + .and_then(|v| if v.is_null() { None } else { Some(v.to_bool()) }) .transpose() } @@ -329,8 +319,7 @@ where ) -> Result, Error> { self.get_optional_at_path(path)? .map(|v| { - v.borrow() - .as_array() + v.as_array() .map(|vec| vec.iter().collect()) .ok_or_else(|| Error::StructureError(format!("{path} must be a bool"))) }) @@ -353,8 +342,7 @@ where ) -> Result, Error> { self.get_optional_at_path(path)? .map(|v| { - v.borrow() - .as_array() + v.as_array() .map(|inner| { inner .iter() @@ -390,8 +378,7 @@ where ) -> Result>, Error> { self.get_optional_at_path(path)? .map(|v| { - v.borrow() - .as_map() + v.as_map() .ok_or_else(|| Error::StructureError(format!("{path} must be a map"))) }) .transpose() @@ -406,8 +393,7 @@ where ) -> Result, Error> { self.get_optional_at_path(path)? .map(|v| { - v.borrow() - .as_map() + v.as_map() .map(|inner| { inner .iter() @@ -438,8 +424,7 @@ where ) -> Result, Error> { self.get_optional_at_path(path)? .map(|v| { - v.borrow() - .as_map() + v.as_map() .map(|inner| { inner .iter() @@ -466,7 +451,7 @@ where fn get_optional_hash256_bytes_at_path(&self, path: &str) -> Result, Error> { self.get_optional_at_path(path)? - .map(|v| v.borrow().to_hash256()) + .map(|v| v.to_hash256()) .transpose() } @@ -477,7 +462,7 @@ where fn get_optional_bytes_at_path(&self, path: &str) -> Result>, Error> { self.get_optional_at_path(path)? - .map(|v| v.borrow().to_bytes()) + .map(|v| v.to_bytes()) .transpose() } @@ -489,7 +474,7 @@ where fn get_optional_identifier_bytes_at_path(&self, path: &str) -> Result>, Error> { self.get_optional_at_path(path)? - .map(|v| v.borrow().to_identifier_bytes()) + .map(|v| v.to_identifier_bytes()) .transpose() } @@ -502,7 +487,7 @@ where fn get_optional_binary_bytes_at_path(&self, path: &str) -> Result>, Error> { self.get_optional_at_path(path)? - .map(|v| v.borrow().to_binary_bytes()) + .map(|v| v.to_binary_bytes()) .transpose() } @@ -576,11 +561,10 @@ where fn get_optional_float_at_path(&self, path: &str) -> Result, Error> { self.get_optional_at_path(path)? .and_then(|v| { - let borrowed = v.borrow(); - if borrowed.is_null() { + if v.is_null() { None } else { - Some(v.borrow().to_float()) + Some(v.to_float()) } }) .transpose() diff --git a/packages/strategy-tests/src/lib.rs b/packages/strategy-tests/src/lib.rs index 389d8656ac..6a097bc861 100644 --- a/packages/strategy-tests/src/lib.rs +++ b/packages/strategy-tests/src/lib.rs @@ -1,13 +1,10 @@ use crate::frequency::Frequency; use crate::operations::FinalizeBlockOperation::IdentityAddKeys; use crate::operations::{ - DocumentAction, DocumentOp, FinalizeBlockOperation, IdentityUpdateOp, Operation, - OperationInSerializationFormat, OperationType, + DocumentAction, DocumentOp, FinalizeBlockOperation, IdentityUpdateOp, Operation, OperationType, }; use dpp::block::block_info::BlockInfo; -use dpp::data_contract::created_data_contract::{ - CreatedDataContract, CreatedDataContractInSerializationFormat, -}; +use dpp::data_contract::created_data_contract::CreatedDataContract; use dpp::data_contract::document_type::random_document::CreateRandomDocument; use dpp::data_contract::DataContract; @@ -46,7 +43,7 @@ use dpp::state_transition::documents_batch_transition::{DocumentsBatchTransition use dpp::state_transition::documents_batch_transition::document_transition::{DocumentDeleteTransition, DocumentReplaceTransition}; use drive::drive::document::query::QueryDocumentsOutcomeV0Methods; use dpp::state_transition::data_contract_create_transition::methods::v0::DataContractCreateTransitionMethodsV0; -use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; + use simple_signer::signer::SimpleSigner; pub mod frequency; diff --git a/packages/wasm-dpp/src/dash_platform_protocol.rs b/packages/wasm-dpp/src/dash_platform_protocol.rs index 4affd36c15..90ef71a9db 100644 --- a/packages/wasm-dpp/src/dash_platform_protocol.rs +++ b/packages/wasm-dpp/src/dash_platform_protocol.rs @@ -6,9 +6,7 @@ use crate::document::factory::DocumentFactoryWASM; use crate::document_facade::DocumentFacadeWasm; use dpp::dash_platform_protocol::DashPlatformProtocol; use dpp::data_contract::DataContractFacade; -use dpp::identity::IdentityFacade; -use dpp::prelude::DataContract; -use dpp::state_transition::state_transition_factory::StateTransitionFactory; + use dpp::version::LATEST_VERSION; use crate::entropy_generator::ExternalEntropyGenerator; diff --git a/packages/wasm-dpp/src/data_contract/data_contract.rs b/packages/wasm-dpp/src/data_contract/data_contract.rs index 603a027098..a244219819 100644 --- a/packages/wasm-dpp/src/data_contract/data_contract.rs +++ b/packages/wasm-dpp/src/data_contract/data_contract.rs @@ -7,7 +7,7 @@ pub use serde::{Deserialize, Serialize}; use wasm_bindgen::prelude::*; use dpp::data_contract::schema::DataContractSchemaMethodsV0; -use dpp::data_contract::{DataContract, DocumentName, JsonValue}; +use dpp::data_contract::DataContract; use dpp::platform_value::{platform_value, Bytes32, Value}; use dpp::data_contract::accessors::v0::{DataContractV0Getters, DataContractV0Setters}; @@ -17,16 +17,16 @@ use dpp::data_contract::conversion::value::v0::DataContractValueConversionMethod use dpp::data_contract::created_data_contract::CreatedDataContract; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::data_contract::serialized_version::DataContractInSerializationFormat; -use dpp::serialization::{PlatformSerializable, PlatformSerializableWithPlatformVersion}; +use dpp::serialization::PlatformSerializableWithPlatformVersion; use dpp::version::PlatformVersion; -use dpp::{platform_value, ProtocolError}; +use dpp::ProtocolError; use crate::identifier::identifier_from_js_value; use crate::metadata::MetadataWasm; use crate::utils::get_bool_from_options; use crate::utils::SKIP_VALIDATION_PROPERTY_NAME; use crate::utils::{Inner, IntoWasm, ToSerdeJSONExt, WithJsError}; -use crate::{bail_js, console_log, with_js_error}; +use crate::with_js_error; use crate::{buffer::Buffer, identifier::IdentifierWrapper}; #[wasm_bindgen(js_name=DataContract)] @@ -160,22 +160,18 @@ impl DataContractWasm { let mut binary_paths = BTreeMap::new(); - document_type.binary_paths().iter().for_each( - (|path| { - binary_paths.insert(path.to_owned(), platform_value!({})); - }), - ); - - document_type.identifier_paths().iter().for_each( - (|path| { - binary_paths.insert( - path.to_owned(), - platform_value!({ - "contentMediaType": "application/x.dash.dpp.identifier" - }), - ); - }), - ); + document_type.binary_paths().iter().for_each(|path| { + binary_paths.insert(path.to_owned(), platform_value!({})); + }); + + document_type.identifier_paths().iter().for_each(|path| { + binary_paths.insert( + path.to_owned(), + platform_value!({ + "contentMediaType": "application/x.dash.dpp.identifier" + }), + ); + }); with_js_error!(binary_paths.serialize(&serializer)) } @@ -214,7 +210,7 @@ impl DataContractWasm { document_schemas_map, defs, !skip_validation, - &platform_version, + platform_version, ) .with_js_error() } @@ -226,7 +222,7 @@ impl DataContractWasm { schema: JsValue, options: Option, ) -> Result<(), JsValue> { - let (skip_validation) = if let Some(options) = options { + let skip_validation = if let Some(options) = options { get_bool_from_options(options.into(), SKIP_VALIDATION_PROPERTY_NAME, false)? } else { false @@ -237,7 +233,7 @@ impl DataContractWasm { let platform_version = PlatformVersion::first(); self.inner - .set_document_schema(name, schema_value, !skip_validation, &platform_version) + .set_document_schema(name, schema_value, !skip_validation, platform_version) .with_js_error() } @@ -280,7 +276,7 @@ impl DataContractWasm { defs: Option, options: Option, ) -> Result<(), JsValue> { - let (skip_validation) = if let Some(options) = options { + let skip_validation = if let Some(options) = options { get_bool_from_options(options.into(), SKIP_VALIDATION_PROPERTY_NAME, false)? } else { false diff --git a/packages/wasm-dpp/src/data_contract/data_contract_facade.rs b/packages/wasm-dpp/src/data_contract/data_contract_facade.rs index cea432427b..1b99d0a567 100644 --- a/packages/wasm-dpp/src/data_contract/data_contract_facade.rs +++ b/packages/wasm-dpp/src/data_contract/data_contract_facade.rs @@ -1,7 +1,7 @@ use std::convert::TryFrom; use dpp::data_contract::created_data_contract::CreatedDataContract; -use dpp::data_contract::DataContract; + use dpp::data_contract::DataContractFacade; use dpp::identifier::Identifier; @@ -11,14 +11,12 @@ use crate::data_contract::DataContractWasm; use crate::entropy_generator::ExternalEntropyGenerator; use crate::errors::protocol_error::from_protocol_error; use crate::utils::{ - get_bool_from_options, IntoWasm, ToSerdeJSONExt, WithJsError, SKIP_VALIDATION_PROPERTY_NAME, + get_bool_from_options, ToSerdeJSONExt, WithJsError, SKIP_VALIDATION_PROPERTY_NAME, }; use dpp::ProtocolError; use std::sync::Arc; -use crate::identity::identity_facade::IdentityFacadeWasm; -use dpp::identity::IdentityFacade; use wasm_bindgen::prelude::*; impl From for DataContractFacadeWasm { diff --git a/packages/wasm-dpp/src/data_contract/errors/mod.rs b/packages/wasm-dpp/src/data_contract/errors/mod.rs index 93bedd6c77..62defde301 100644 --- a/packages/wasm-dpp/src/data_contract/errors/mod.rs +++ b/packages/wasm-dpp/src/data_contract/errors/mod.rs @@ -6,7 +6,7 @@ use wasm_bindgen::prelude::*; pub use data_contract_generic_error::*; use dpp::data_contract::errors::DataContractError; -use dpp::ProtocolError; + pub use invalid_data_contract::*; pub fn from_data_contract_to_js_error(e: DataContractError) -> JsValue { diff --git a/packages/wasm-dpp/src/data_contract/state_transition/data_contract_create_transition/mod.rs b/packages/wasm-dpp/src/data_contract/state_transition/data_contract_create_transition/mod.rs index 79765f37a0..5fae65c71f 100644 --- a/packages/wasm-dpp/src/data_contract/state_transition/data_contract_create_transition/mod.rs +++ b/packages/wasm-dpp/src/data_contract/state_transition/data_contract_create_transition/mod.rs @@ -1,21 +1,19 @@ // mod validation; -use std::collections::HashMap; - // pub use validation::*; use crate::errors::protocol_error::from_protocol_error; -use dpp::data_contract::JsonValue; + use dpp::errors::consensus::signature::SignatureError; use dpp::errors::consensus::ConsensusError; -use dpp::platform_value::Value; + use dpp::serialization::{PlatformDeserializable, PlatformSerializable}; use dpp::state_transition::data_contract_create_transition::accessors::DataContractCreateTransitionAccessorsV0; use dpp::state_transition::data_contract_create_transition::DataContractCreateTransition; use dpp::state_transition::StateTransitionIdentitySigned; -use dpp::state_transition::{JsonStateTransitionSerializationOptions, StateTransitionJsonConvert}; + use dpp::state_transition::{StateTransition, StateTransitionValueConvert}; -use dpp::version::{PlatformVersion, TryIntoPlatformVersioned}; +use dpp::version::PlatformVersion; use dpp::{state_transition::StateTransitionLike, ProtocolError}; use serde::Serialize; use wasm_bindgen::prelude::*; @@ -24,7 +22,7 @@ use crate::bls_adapter::{BlsAdapter, JsBlsAdapter}; use crate::data_contract::DataContractWasm; use crate::identity::IdentityPublicKeyWasm; use crate::utils::{ToSerdeJSONExt, WithJsError}; -use crate::{buffer::Buffer, identifier::IdentifierWrapper, with_js_error}; +use crate::{buffer::Buffer, identifier::IdentifierWrapper}; #[derive(Clone)] #[wasm_bindgen(js_name=DataContractCreateTransition)] diff --git a/packages/wasm-dpp/src/data_contract/state_transition/data_contract_update_transition/mod.rs b/packages/wasm-dpp/src/data_contract/state_transition/data_contract_update_transition/mod.rs index 2763fb6b2b..7104b840d1 100644 --- a/packages/wasm-dpp/src/data_contract/state_transition/data_contract_update_transition/mod.rs +++ b/packages/wasm-dpp/src/data_contract/state_transition/data_contract_update_transition/mod.rs @@ -1,8 +1,5 @@ // mod validation; -use std::collections::HashMap; -use std::hash::Hash; - // pub use validation::*; use dpp::consensus::ConsensusError; @@ -14,10 +11,9 @@ use dpp::state_transition::StateTransitionIdentitySigned; use dpp::state_transition::{StateTransition, StateTransitionValueConvert}; use dpp::version::PlatformVersion; use dpp::{ - consensus::signature::SignatureError, platform_value, state_transition::StateTransitionLike, - ProtocolError, + consensus::signature::SignatureError, state_transition::StateTransitionLike, ProtocolError, }; -use serde::{Deserialize, Serialize}; +use serde::Serialize; use wasm_bindgen::prelude::*; use crate::data_contract::DataContractWasm; @@ -28,7 +24,7 @@ use crate::{ bls_adapter::{BlsAdapter, JsBlsAdapter}, utils::WithJsError, }; -use crate::{buffer::Buffer, identifier::IdentifierWrapper, with_js_error}; +use crate::{buffer::Buffer, identifier::IdentifierWrapper}; #[derive(Clone)] #[wasm_bindgen(js_name=DataContractUpdateTransition)] @@ -62,8 +58,6 @@ impl DataContractUpdateTransitionWasm { #[wasm_bindgen(js_name=getDataContract)] pub fn get_data_contract(&self) -> DataContractWasm { - let platform_version = PlatformVersion::first(); - DataContractWasm::try_from_serialization_format(self.0.data_contract().clone(), false) .expect("should create data contract from serialized format") } diff --git a/packages/wasm-dpp/src/data_contract_factory/data_contract_factory.rs b/packages/wasm-dpp/src/data_contract_factory/data_contract_factory.rs index 569bf8ae01..d171f31235 100644 --- a/packages/wasm-dpp/src/data_contract_factory/data_contract_factory.rs +++ b/packages/wasm-dpp/src/data_contract_factory/data_contract_factory.rs @@ -1,5 +1,4 @@ use std::convert::TryFrom; -use std::sync::Arc; use dpp::data_contract::created_data_contract::CreatedDataContract; use dpp::{data_contract::DataContractFactory, platform_value, prelude::Identifier, ProtocolError}; @@ -9,13 +8,7 @@ use crate::entropy_generator::ExternalEntropyGenerator; use crate::utils::{ToSerdeJSONExt, WithJsError}; use crate::data_contract::{DataContractCreateTransitionWasm, DataContractWasm}; -use crate::{ - data_contract::errors::InvalidDataContractError, - errors::{from_dpp_err, protocol_error::from_protocol_error}, - with_js_error, -}; - -use dpp::util::entropy_generator::EntropyGenerator; +use crate::{errors::protocol_error::from_protocol_error, with_js_error}; #[wasm_bindgen(js_name=DataContractFactory)] pub struct DataContractFactoryWasm(DataContractFactory); diff --git a/packages/wasm-dpp/src/document/document_facade.rs b/packages/wasm-dpp/src/document/document_facade.rs index 028ad6aefe..fe1cfa493a 100644 --- a/packages/wasm-dpp/src/document/document_facade.rs +++ b/packages/wasm-dpp/src/document/document_facade.rs @@ -3,10 +3,7 @@ use std::sync::Arc; use wasm_bindgen::{prelude::*, JsValue}; use crate::document::factory::DocumentFactoryWASM; -use crate::{ - utils::{get_class_name, IntoWasm}, - DataContractWasm, ExtendedDocumentWasm, -}; +use crate::{DataContractWasm, ExtendedDocumentWasm}; use crate::document::state_transition::document_batch_transition::DocumentsBatchTransitionWasm; diff --git a/packages/wasm-dpp/src/document/errors/document_no_revision_error.rs b/packages/wasm-dpp/src/document/errors/document_no_revision_error.rs index 2743e4fc7a..2b94d2d82b 100644 --- a/packages/wasm-dpp/src/document/errors/document_no_revision_error.rs +++ b/packages/wasm-dpp/src/document/errors/document_no_revision_error.rs @@ -1,6 +1,5 @@ use thiserror::Error; -use crate::data_contract::DataContractWasm; use crate::DocumentWasm; use super::*; diff --git a/packages/wasm-dpp/src/document/extended_document.rs b/packages/wasm-dpp/src/document/extended_document.rs index 81d149c060..7d186fa7f3 100644 --- a/packages/wasm-dpp/src/document/extended_document.rs +++ b/packages/wasm-dpp/src/document/extended_document.rs @@ -5,7 +5,7 @@ use serde_json::Value as JsonValue; use dpp::platform_value::{Bytes32, Value}; use dpp::prelude::{Identifier, Revision, TimestampMillis}; -use dpp::util::json_schema::JsonSchemaExt; + use dpp::util::json_value::JsonValueExt; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; @@ -191,7 +191,7 @@ impl ExtendedDocumentWasm { #[wasm_bindgen(js_name=set)] pub fn set(&mut self, path: String, js_value_to_set: JsValue) -> Result<(), JsValue> { - let mut value: Value = js_value_to_set.with_serde_to_platform_value()?; + let value: Value = js_value_to_set.with_serde_to_platform_value()?; self.0.set_untrusted(&path, value).with_js_error() } @@ -260,7 +260,7 @@ impl ExtendedDocumentWasm { #[wasm_bindgen(js_name=getMetadata)] pub fn get_metadata(&self) -> Option { - self.0.metadata().clone().map(Into::into) + (*self.0.metadata()).map(Into::into) } #[wasm_bindgen(js_name=setMetadata)] diff --git a/packages/wasm-dpp/src/document/factory.rs b/packages/wasm-dpp/src/document/factory.rs index a81a33e52b..d0002bca61 100644 --- a/packages/wasm-dpp/src/document/factory.rs +++ b/packages/wasm-dpp/src/document/factory.rs @@ -1,9 +1,6 @@ use anyhow::anyhow; -use dpp::platform_value::ReplacementType; -use dpp::{ - document::{document_factory::DocumentFactory, extended_document}, - ProtocolError, -}; + +use dpp::document::document_factory::DocumentFactory; use std::collections::HashMap; use wasm_bindgen::prelude::*; @@ -13,13 +10,12 @@ use crate::document::platform_value::Bytes32; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::document_type::DocumentTypeRef; use dpp::document::Document; -use dpp::platform_value::btreemap_extensions::BTreeValueMapReplacementPathHelper; + use dpp::prelude::ExtendedDocument; -use dpp::state_transition::documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; + use dpp::state_transition::documents_batch_transition::document_transition::action_type::DocumentTransitionActionType; use dpp::version::PlatformVersion; use std::convert::TryFrom; -use std::sync::Arc; use crate::document_batch_transition::DocumentsBatchTransitionWasm; use crate::entropy_generator::ExternalEntropyGenerator; @@ -134,7 +130,7 @@ impl DocumentFactoryWASM { }) .collect(); - (action_type.clone(), documents_with_refs) + (*action_type, documents_with_refs) }) .collect(); diff --git a/packages/wasm-dpp/src/document/generate_document_id.rs b/packages/wasm-dpp/src/document/generate_document_id.rs index 058fae5831..4f18d303e9 100644 --- a/packages/wasm-dpp/src/document/generate_document_id.rs +++ b/packages/wasm-dpp/src/document/generate_document_id.rs @@ -1,4 +1,4 @@ -use dpp::document::{generate_document_id, Document}; +use dpp::document::Document; use wasm_bindgen::prelude::*; use crate::identifier::{identifier_from_js_value, IdentifierWrapper}; diff --git a/packages/wasm-dpp/src/document/mod.rs b/packages/wasm-dpp/src/document/mod.rs index 725abe78eb..f600c00ef6 100644 --- a/packages/wasm-dpp/src/document/mod.rs +++ b/packages/wasm-dpp/src/document/mod.rs @@ -1,5 +1,4 @@ -use dpp::prelude::{DataContract, Identifier}; -use dpp::util::json_schema::JsonSchemaExt; +use dpp::prelude::Identifier; use anyhow::anyhow; use serde::{Deserialize, Serialize}; @@ -10,10 +9,10 @@ use crate::buffer::Buffer; use crate::data_contract::DataContractWasm; use crate::identifier::IdentifierWrapper; -use crate::lodash::lodash_set; + use crate::utils::WithJsError; use crate::utils::{with_serde_to_json_value, ToSerdeJSONExt}; -use crate::with_js_error; + use dpp::document::document_methods::DocumentMethodsV0; use dpp::document::DocumentV0Getters; pub mod errors; @@ -28,13 +27,10 @@ pub mod state_transition; // pub use document_batch_transition::DocumentsBatchTransitionWasm; -use dpp::document::{ - Document, DocumentV0Setters, EXTENDED_DOCUMENT_IDENTIFIER_FIELDS, IDENTIFIER_FIELDS, -}; +use dpp::document::{Document, DocumentV0Setters, EXTENDED_DOCUMENT_IDENTIFIER_FIELDS}; pub use extended_document::ExtendedDocumentWasm; -use dpp::document::extended_document::property_names; use dpp::identity::TimestampMillis; use dpp::platform_value::btreemap_extensions::BTreeValueMapReplacementPathHelper; use dpp::platform_value::converter::serde_json::BTreeValueJsonConverter; diff --git a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/document_transition/mod.rs b/packages/wasm-dpp/src/document/state_transition/document_batch_transition/document_transition/mod.rs index c3e89f5078..0b7ba08b84 100644 --- a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/document_transition/mod.rs +++ b/packages/wasm-dpp/src/document/state_transition/document_batch_transition/document_transition/mod.rs @@ -6,20 +6,14 @@ mod document_create_transition; // pub use document_delete_transition::*; // pub use document_replace_transition::*; -use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::platform_value::Value; use dpp::prelude::TimestampMillis; use dpp::state_transition::documents_batch_transition::document_transition::action_type::TransitionActionTypeGetter; use dpp::state_transition::documents_batch_transition::document_transition::DocumentTransitionV0Methods; use dpp::{ - prelude::Identifier, - state_transition::documents_batch_transition::{ - document_transition::DocumentTransition, DocumentCreateTransition, - DocumentDeleteTransition, DocumentReplaceTransition, - }, - util::{json_schema::JsonSchemaExt, json_value::JsonValueExt}, - ProtocolError, + state_transition::documents_batch_transition::document_transition::DocumentTransition, + util::json_value::JsonValueExt, ProtocolError, }; use serde::Serialize; use serde_json::Value as JsonValue; @@ -30,7 +24,7 @@ use crate::{ identifier::{identifier_from_js_value, IdentifierWrapper}, lodash::lodash_set, utils::{Inner, ToSerdeJSONExt, WithJsError}, - with_js_error, BinaryType, ConversionOptions, DataContractWasm, + ConversionOptions, }; #[wasm_bindgen(js_name=DocumentTransition)] @@ -304,7 +298,7 @@ pub(crate) fn to_object<'a>( let js_value = value.serialize(&serializer)?; for path in identifiers_paths.into_iter() { - if let Ok(bytes) = value.remove_value_at_path_into::>(path.clone()) { + if let Ok(bytes) = value.remove_value_at_path_into::>(path) { let buffer = Buffer::from_bytes_owned(bytes); if !options.skip_identifiers_conversion { lodash_set(&js_value, path, buffer.into()); diff --git a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/mod.rs b/packages/wasm-dpp/src/document/state_transition/document_batch_transition/mod.rs index 559be4cbe0..dea07a934a 100644 --- a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/mod.rs +++ b/packages/wasm-dpp/src/document/state_transition/document_batch_transition/mod.rs @@ -1,17 +1,17 @@ use dpp::identity::KeyID; use dpp::{ - prelude::{DataContract, Identifier}, - state_transition::{StateTransitionFieldTypes, StateTransitionLike, StateTransitionType}, + prelude::Identifier, + state_transition::{StateTransitionLike, StateTransitionType}, util::json_value::JsonValueExt, ProtocolError, }; -use js_sys::{Array, Reflect}; +use js_sys::Array; use serde::{Deserialize, Serialize}; use dpp::consensus::signature::SignatureError; use dpp::consensus::ConsensusError; -use dpp::platform_value::{BinaryData, ReplacementType}; +use dpp::platform_value::BinaryData; use dpp::serialization::PlatformSerializable; use dpp::state_transition::documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; use dpp::state_transition::documents_batch_transition::document_transition::DocumentTransition; @@ -23,8 +23,7 @@ use crate::{ bls_adapter::{BlsAdapter, JsBlsAdapter}, buffer::Buffer, identifier::IdentifierWrapper, - lodash::lodash_set, - utils::{Inner, IntoWasm, ToSerdeJSONExt, WithJsError}, + utils::{Inner, IntoWasm, WithJsError}, IdentityPublicKeyWasm, }; @@ -277,7 +276,7 @@ impl DocumentsBatchTransitionWasm { state_transition .sign( &identity_public_key.to_owned().into(), - &private_key, + private_key, &bls_adapter, ) .with_js_error()?; diff --git a/packages/wasm-dpp/src/errors/consensus/basic/data_contract/data_contract_have_new_unique_index_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/data_contract_have_new_unique_index_error.rs index c652285833..6b5a9bfb13 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/data_contract/data_contract_have_new_unique_index_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/data_contract_have_new_unique_index_error.rs @@ -1,9 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::basic::data_contract::DataContractHaveNewUniqueIndexError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; -use serde::Serialize; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=DataContractHaveNewUniqueIndexError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/data_contract/data_contract_immutable_properties_update_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/data_contract_immutable_properties_update_error.rs index 1f548f3400..dfeb62ea53 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/data_contract/data_contract_immutable_properties_update_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/data_contract_immutable_properties_update_error.rs @@ -1,8 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::basic::data_contract::DataContractImmutablePropertiesUpdateError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=DataContractImmutablePropertiesUpdateError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/data_contract/data_contract_invalid_index_definition_update_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/data_contract_invalid_index_definition_update_error.rs index 02d3cd989c..a1e040ea2b 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/data_contract/data_contract_invalid_index_definition_update_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/data_contract_invalid_index_definition_update_error.rs @@ -1,8 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::basic::data_contract::DataContractInvalidIndexDefinitionUpdateError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=DataContractInvalidIndexDefinitionUpdateError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/data_contract/data_contract_max_depth_exceed_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/data_contract_max_depth_exceed_error.rs index 3ae3b67e1b..52c0a6addf 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/data_contract/data_contract_max_depth_exceed_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/data_contract_max_depth_exceed_error.rs @@ -1,8 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::basic::data_contract::data_contract_max_depth_exceed_error::DataContractMaxDepthExceedError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=DataContractMaxDepthExceedError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/data_contract/data_contract_unique_indices_changed_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/data_contract_unique_indices_changed_error.rs index c120d64cab..20e2c69884 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/data_contract/data_contract_unique_indices_changed_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/data_contract_unique_indices_changed_error.rs @@ -1,8 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::basic::data_contract::DataContractUniqueIndicesChangedError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=DataContractUniqueIndicesChangedError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/data_contract/duplicate_index_name_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/duplicate_index_name_error.rs index 15513194a0..ba918fac1e 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/data_contract/duplicate_index_name_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/duplicate_index_name_error.rs @@ -1,8 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::basic::data_contract::DuplicateIndexNameError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=DuplicateIndexNameError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/data_contract/incompatible_data_contract_schema_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/incompatible_data_contract_schema_error.rs index 3813a0456e..e3668bef0b 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/data_contract/incompatible_data_contract_schema_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/incompatible_data_contract_schema_error.rs @@ -2,7 +2,7 @@ use crate::buffer::Buffer; use dpp::consensus::basic::data_contract::IncompatibleDataContractSchemaError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=IncompatibleDataContractSchemaError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/data_contract/incompatible_re2_pattern_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/incompatible_re2_pattern_error.rs index 6c9713d8ec..43965f817d 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/data_contract/incompatible_re2_pattern_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/incompatible_re2_pattern_error.rs @@ -1,8 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::basic::data_contract::IncompatibleRe2PatternError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=IncompatibleRe2PatternError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/data_contract/index_error/duplicate_index_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/index_error/duplicate_index_error.rs index 49ea7b32cd..1f6bbffc4a 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/data_contract/index_error/duplicate_index_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/index_error/duplicate_index_error.rs @@ -1,8 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::basic::data_contract::DuplicateIndexError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=DuplicateIndexError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/data_contract/index_error/invalid_compound_index_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/index_error/invalid_compound_index_error.rs index 277d48852b..efaceff021 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/data_contract/index_error/invalid_compound_index_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/index_error/invalid_compound_index_error.rs @@ -1,8 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::basic::data_contract::InvalidCompoundIndexError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=InvalidCompoundIndexError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/data_contract/index_error/invalid_index_property_type_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/index_error/invalid_index_property_type_error.rs index 1020cb1c84..2f646ca611 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/data_contract/index_error/invalid_index_property_type_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/index_error/invalid_index_property_type_error.rs @@ -1,8 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::basic::data_contract::InvalidIndexPropertyTypeError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=InvalidIndexPropertyTypeError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/data_contract/index_error/invalid_indexed_property_constraint_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/index_error/invalid_indexed_property_constraint_error.rs index 76d16926ce..dca2fc0da8 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/data_contract/index_error/invalid_indexed_property_constraint_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/index_error/invalid_indexed_property_constraint_error.rs @@ -1,8 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::basic::data_contract::InvalidIndexedPropertyConstraintError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=InvalidIndexedPropertyConstraintError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/data_contract/index_error/system_property_index_already_present_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/index_error/system_property_index_already_present_error.rs index 0e4c7ce7ef..5c3a9b7e67 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/data_contract/index_error/system_property_index_already_present_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/index_error/system_property_index_already_present_error.rs @@ -1,8 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::basic::data_contract::SystemPropertyIndexAlreadyPresentError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=SystemPropertyIndexAlreadyPresentError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/data_contract/index_error/undefined_index_property_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/index_error/undefined_index_property_error.rs index 320e125fef..57a3b18642 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/data_contract/index_error/undefined_index_property_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/index_error/undefined_index_property_error.rs @@ -1,8 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::basic::data_contract::UndefinedIndexPropertyError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=UndefinedIndexPropertyError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/data_contract/index_error/unique_indices_limit_reached_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/index_error/unique_indices_limit_reached_error.rs index 28e59aaa1b..c7a6b03b77 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/data_contract/index_error/unique_indices_limit_reached_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/index_error/unique_indices_limit_reached_error.rs @@ -1,8 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::basic::data_contract::UniqueIndicesLimitReachedError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=UniqueIndicesLimitReachedError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/data_contract/invalid_data_contract_id_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/invalid_data_contract_id_error.rs index bbb268e683..fbb5b85e07 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/data_contract/invalid_data_contract_id_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/invalid_data_contract_id_error.rs @@ -2,7 +2,7 @@ use crate::buffer::Buffer; use dpp::consensus::basic::data_contract::InvalidDataContractIdError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=InvalidDataContractIdError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/data_contract/invalid_data_contract_version_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/invalid_data_contract_version_error.rs index fac4faea02..a8302ebd5c 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/data_contract/invalid_data_contract_version_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/invalid_data_contract_version_error.rs @@ -1,8 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::basic::data_contract::InvalidDataContractVersionError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=InvalidDataContractVersionError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/data_contract/invalid_json_schema_ref_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/invalid_json_schema_ref_error.rs index acfc5649d4..ba9850c3ff 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/data_contract/invalid_json_schema_ref_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/invalid_json_schema_ref_error.rs @@ -1,8 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::basic::data_contract::InvalidJsonSchemaRefError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=InvalidJsonSchemaRefError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/decode/protocol_version_parsing_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/decode/protocol_version_parsing_error.rs index 7dbe969735..2ead008957 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/decode/protocol_version_parsing_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/decode/protocol_version_parsing_error.rs @@ -1,9 +1,9 @@ use crate::buffer::Buffer; -use dpp::bincode::Decode; + use dpp::consensus::basic::decode::ProtocolVersionParsingError; use dpp::errors::consensus::codes::ErrorWithCode; use dpp::errors::consensus::ConsensusError; -use dpp::serialization::{PlatformSerializable, PlatformSerializableWithPlatformVersion}; +use dpp::serialization::PlatformSerializableWithPlatformVersion; use dpp::version::PlatformVersion; use wasm_bindgen::prelude::*; diff --git a/packages/wasm-dpp/src/errors/consensus/basic/decode/serialized_object_parsing_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/decode/serialized_object_parsing_error.rs index 7f6a305adb..e6b6107915 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/decode/serialized_object_parsing_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/decode/serialized_object_parsing_error.rs @@ -1,8 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::basic::decode::SerializedObjectParsingError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=SerializedObjectParsingError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/document/data_contract_not_present_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/document/data_contract_not_present_error.rs index f4c9ba0829..84d71151c1 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/document/data_contract_not_present_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/document/data_contract_not_present_error.rs @@ -1,7 +1,7 @@ use dpp::consensus::basic::document::DataContractNotPresentError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; use crate::buffer::Buffer; diff --git a/packages/wasm-dpp/src/errors/consensus/basic/document/duplicate_document_transitions_with_ids_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/document/duplicate_document_transitions_with_ids_error.rs index df745055ad..5a181d3825 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/document/duplicate_document_transitions_with_ids_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/document/duplicate_document_transitions_with_ids_error.rs @@ -2,7 +2,7 @@ use crate::buffer::Buffer; use dpp::consensus::basic::document::DuplicateDocumentTransitionsWithIdsError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use std::iter::FromIterator; use wasm_bindgen::prelude::*; diff --git a/packages/wasm-dpp/src/errors/consensus/basic/document/duplicate_document_transitions_with_indices_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/document/duplicate_document_transitions_with_indices_error.rs index ecad3fa37b..c3b3ad159b 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/document/duplicate_document_transitions_with_indices_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/document/duplicate_document_transitions_with_indices_error.rs @@ -2,7 +2,7 @@ use crate::buffer::Buffer; use dpp::consensus::basic::document::DuplicateDocumentTransitionsWithIndicesError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use std::iter::FromIterator; use wasm_bindgen::prelude::*; diff --git a/packages/wasm-dpp/src/errors/consensus/basic/document/inconsistent_compound_index_data_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/document/inconsistent_compound_index_data_error.rs index daa7ae7179..6277f2713f 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/document/inconsistent_compound_index_data_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/document/inconsistent_compound_index_data_error.rs @@ -1,8 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::basic::document::InconsistentCompoundIndexDataError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use js_sys::JsString; use wasm_bindgen::prelude::*; diff --git a/packages/wasm-dpp/src/errors/consensus/basic/document/invalid_document_transition_action_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/document/invalid_document_transition_action_error.rs index cb328b4e82..a144198bc0 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/document/invalid_document_transition_action_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/document/invalid_document_transition_action_error.rs @@ -1,8 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::basic::document::InvalidDocumentTransitionActionError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=InvalidDocumentTransitionActionError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/document/invalid_document_transition_id_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/document/invalid_document_transition_id_error.rs index c5692f3c38..86510ecc87 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/document/invalid_document_transition_id_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/document/invalid_document_transition_id_error.rs @@ -2,7 +2,7 @@ use crate::buffer::Buffer; use dpp::consensus::basic::document::InvalidDocumentTransitionIdError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=InvalidDocumentTransitionIdError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/document/invalid_document_type_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/document/invalid_document_type_error.rs index 4a862b23a9..c78ef8f13f 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/document/invalid_document_type_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/document/invalid_document_type_error.rs @@ -1,7 +1,7 @@ use dpp::consensus::basic::document::InvalidDocumentTypeError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; use crate::buffer::Buffer; diff --git a/packages/wasm-dpp/src/errors/consensus/basic/document/missing_data_contract_id_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/document/missing_data_contract_id_error.rs index 8c0f1a45b0..7a4ca857a6 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/document/missing_data_contract_id_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/document/missing_data_contract_id_error.rs @@ -1,10 +1,8 @@ use dpp::consensus::basic::document::MissingDataContractIdBasicError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; -use wasm_bindgen::prelude::*; -use crate::buffer::Buffer; +use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=MissingDataContractIdError)] pub struct MissingDataContractIdErrorWasm { diff --git a/packages/wasm-dpp/src/errors/consensus/basic/document/missing_document_transition_action_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/document/missing_document_transition_action_error.rs index 9bcd1e6152..90c1cdfd5f 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/document/missing_document_transition_action_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/document/missing_document_transition_action_error.rs @@ -1,8 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::basic::document::MissingDocumentTransitionActionError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=MissingDocumentTransitionActionError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/document/missing_document_transition_type_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/document/missing_document_transition_type_error.rs index 65e3bdbda3..6c46f95723 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/document/missing_document_transition_type_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/document/missing_document_transition_type_error.rs @@ -1,8 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::basic::document::MissingDocumentTransitionTypeError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=MissingDocumentTransitionTypeError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/document/missing_document_type_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/document/missing_document_type_error.rs index b11a4b3a25..f1ff0c35d7 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/document/missing_document_type_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/document/missing_document_type_error.rs @@ -1,8 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::basic::document::MissingDocumentTypeError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=MissingDocumentTypeError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/identity/duplicated_identity_public_key_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/identity/duplicated_identity_public_key_error.rs index 82fcf35aed..dae4e4ca3d 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/identity/duplicated_identity_public_key_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/identity/duplicated_identity_public_key_error.rs @@ -1,8 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::basic::identity::DuplicatedIdentityPublicKeyBasicError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=DuplicatedIdentityPublicKeyError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/identity/duplicated_identity_public_key_id_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/identity/duplicated_identity_public_key_id_error.rs index 9e1139970d..5dbead8bbf 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/identity/duplicated_identity_public_key_id_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/identity/duplicated_identity_public_key_id_error.rs @@ -1,8 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::basic::identity::DuplicatedIdentityPublicKeyIdBasicError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=DuplicatedIdentityPublicKeyIdError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/identity/identity_asset_lock_proof_locked_transaction_mismatch_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/identity/identity_asset_lock_proof_locked_transaction_mismatch_error.rs index ec835f215b..565392603e 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/identity/identity_asset_lock_proof_locked_transaction_mismatch_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/identity/identity_asset_lock_proof_locked_transaction_mismatch_error.rs @@ -2,7 +2,7 @@ use dpp::consensus::basic::identity::IdentityAssetLockProofLockedTransactionMism use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; use dpp::dashcore::hashes::Hash; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; use crate::buffer::Buffer; diff --git a/packages/wasm-dpp/src/errors/consensus/basic/identity/identity_asset_lock_transaction_is_not_found_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/identity/identity_asset_lock_transaction_is_not_found_error.rs index ebd0e63f9f..774828ff7c 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/identity/identity_asset_lock_transaction_is_not_found_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/identity/identity_asset_lock_transaction_is_not_found_error.rs @@ -1,7 +1,7 @@ use dpp::consensus::basic::identity::IdentityAssetLockTransactionIsNotFoundError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; use crate::buffer::Buffer; diff --git a/packages/wasm-dpp/src/errors/consensus/basic/identity/identity_asset_lock_transaction_out_point_already_exists_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/identity/identity_asset_lock_transaction_out_point_already_exists_error.rs index aa2631aa2e..bf3e685414 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/identity/identity_asset_lock_transaction_out_point_already_exists_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/identity/identity_asset_lock_transaction_out_point_already_exists_error.rs @@ -2,7 +2,7 @@ use dpp::consensus::basic::identity::IdentityAssetLockTransactionOutPointAlready use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; use dpp::dashcore::hashes::Hash; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; use crate::buffer::Buffer; diff --git a/packages/wasm-dpp/src/errors/consensus/basic/identity/identity_asset_lock_transaction_output_not_found_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/identity/identity_asset_lock_transaction_output_not_found_error.rs index 4dd51e3298..c95d911371 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/identity/identity_asset_lock_transaction_output_not_found_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/identity/identity_asset_lock_transaction_output_not_found_error.rs @@ -1,8 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::basic::identity::IdentityAssetLockTransactionOutputNotFoundError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=IdentityAssetLockTransactionOutputNotFoundError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/identity/identity_insufficient_balance_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/identity/identity_insufficient_balance_error.rs index c6f09e7400..d6b16a7186 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/identity/identity_insufficient_balance_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/identity/identity_insufficient_balance_error.rs @@ -1,10 +1,7 @@ -use crate::buffer::Buffer; use crate::identifier::IdentifierWrapper; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::state::identity::IdentityInsufficientBalanceError; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; -use std::ops::Deref; use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=IdentityInsufficientBalanceError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_asset_lock_proof_core_chain_height_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_asset_lock_proof_core_chain_height_error.rs index 462ed2971b..a9af7ffae2 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_asset_lock_proof_core_chain_height_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_asset_lock_proof_core_chain_height_error.rs @@ -1,8 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::basic::identity::InvalidAssetLockProofCoreChainHeightError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=InvalidAssetLockProofCoreChainHeightError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_asset_lock_proof_transaction_height_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_asset_lock_proof_transaction_height_error.rs index 28c4026c20..a1dccbd7f0 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_asset_lock_proof_transaction_height_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_asset_lock_proof_transaction_height_error.rs @@ -1,8 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::basic::identity::InvalidAssetLockProofTransactionHeightError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=InvalidAssetLockProofTransactionHeightError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_asset_lock_transaction_output_return_size_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_asset_lock_transaction_output_return_size_error.rs index 6c2501792e..f206d0814f 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_asset_lock_transaction_output_return_size_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_asset_lock_transaction_output_return_size_error.rs @@ -1,8 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::basic::identity::InvalidAssetLockTransactionOutputReturnSizeError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=InvalidAssetLockTransactionOutputReturnSizeError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_identity_asset_lock_transaction_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_identity_asset_lock_transaction_error.rs index 7ba3c5dbb7..195121ffd1 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_identity_asset_lock_transaction_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_identity_asset_lock_transaction_error.rs @@ -1,8 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::basic::identity::InvalidIdentityAssetLockTransactionError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=InvalidIdentityAssetLockTransactionError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_identity_asset_lock_transaction_output_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_identity_asset_lock_transaction_output_error.rs index 3c9f165960..b87c249167 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_identity_asset_lock_transaction_output_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_identity_asset_lock_transaction_output_error.rs @@ -1,8 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::basic::identity::InvalidIdentityAssetLockTransactionOutputError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=InvalidIdentityAssetLockTransactionOutputError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_identity_credit_withdrawal_transition_core_fee_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_identity_credit_withdrawal_transition_core_fee_error.rs index 7472cd9c71..fa0a40a52f 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_identity_credit_withdrawal_transition_core_fee_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_identity_credit_withdrawal_transition_core_fee_error.rs @@ -1,8 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::basic::identity::InvalidIdentityCreditWithdrawalTransitionCoreFeeError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=InvalidIdentityCreditWithdrawalTransitionCoreFeeError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_identity_credit_withdrawal_transition_output_script_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_identity_credit_withdrawal_transition_output_script_error.rs index bada2052da..055c644d08 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_identity_credit_withdrawal_transition_output_script_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_identity_credit_withdrawal_transition_output_script_error.rs @@ -1,10 +1,8 @@ use dpp::consensus::basic::identity::InvalidIdentityCreditWithdrawalTransitionOutputScriptError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; -use wasm_bindgen::prelude::*; -use crate::buffer::Buffer; +use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=InvalidIdentityCreditWithdrawalTransitionOutputScriptError)] pub struct InvalidIdentityCreditWithdrawalTransitionOutputScriptErrorWasm { diff --git a/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_identity_credit_withdrawal_transition_pooling_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_identity_credit_withdrawal_transition_pooling_error.rs index 46882b76b1..2fed16a2b9 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_identity_credit_withdrawal_transition_pooling_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_identity_credit_withdrawal_transition_pooling_error.rs @@ -1,8 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::basic::identity::NotImplementedIdentityCreditWithdrawalTransitionPoolingError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=NotImplementedIdentityCreditWithdrawalTransitionPoolingError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_identity_key_signature_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_identity_key_signature_error.rs index 98d3034409..74bafedc23 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_identity_key_signature_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_identity_key_signature_error.rs @@ -1,9 +1,8 @@ -use crate::buffer::Buffer; use dpp::consensus::basic::identity::InvalidIdentityKeySignatureError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; use dpp::identity::KeyID; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=InvalidIdentityKeySignatureError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_identity_public_key_data_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_identity_public_key_data_error.rs index 1e1f1090f7..2a5c502479 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_identity_public_key_data_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_identity_public_key_data_error.rs @@ -1,10 +1,8 @@ use dpp::consensus::basic::identity::InvalidIdentityPublicKeyDataError; use dpp::errors::consensus::codes::ErrorWithCode; -use crate::buffer::Buffer; -use dpp::consensus::ConsensusError; use dpp::errors::consensus::ConsensusError as DPPConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=InvalidIdentityPublicKeyDataError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_identity_public_key_security_level_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_identity_public_key_security_level_error.rs index 66339af4e7..ed739d25e3 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_identity_public_key_security_level_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_identity_public_key_security_level_error.rs @@ -1,10 +1,8 @@ use dpp::consensus::basic::identity::InvalidIdentityPublicKeySecurityLevelError; use dpp::errors::consensus::codes::ErrorWithCode; -use crate::buffer::Buffer; -use dpp::consensus::ConsensusError; use dpp::errors::consensus::ConsensusError as DPPConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=InvalidIdentityPublicKeySecurityLevelError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_identity_public_key_type_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_identity_public_key_type_error.rs index 211404737a..b3c306f649 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_identity_public_key_type_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_identity_public_key_type_error.rs @@ -1,12 +1,11 @@ use std::convert::TryFrom; -use crate::buffer::Buffer; use crate::utils::WithJsError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::signature::InvalidIdentityPublicKeyTypeError; use dpp::consensus::ConsensusError; use dpp::identity::KeyType; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=InvalidIdentityPublicKeyTypeError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_instant_asset_lock_proof_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_instant_asset_lock_proof_error.rs index 78abcca9cb..6aac164406 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_instant_asset_lock_proof_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_instant_asset_lock_proof_error.rs @@ -1,8 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::basic::identity::InvalidInstantAssetLockProofError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=InvalidInstantAssetLockProofError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_instant_asset_lock_proof_signature_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_instant_asset_lock_proof_signature_error.rs index 992aa652f7..8637f55f00 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_instant_asset_lock_proof_signature_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_instant_asset_lock_proof_signature_error.rs @@ -1,8 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::basic::identity::InvalidInstantAssetLockProofSignatureError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=InvalidInstantAssetLockProofSignatureError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/identity/missing_master_public_key_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/identity/missing_master_public_key_error.rs index a353a6123d..1d3eb91f2b 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/identity/missing_master_public_key_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/identity/missing_master_public_key_error.rs @@ -1,8 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::basic::identity::MissingMasterPublicKeyError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=MissingMasterPublicKeyError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/identity/missing_public_key_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/identity/missing_public_key_error.rs index 886d4b05f6..b1ee253aa5 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/identity/missing_public_key_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/identity/missing_public_key_error.rs @@ -1,9 +1,8 @@ -use crate::buffer::Buffer; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::signature::MissingPublicKeyError; use dpp::consensus::ConsensusError; use dpp::identity::KeyID; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=MissingPublicKeyError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/incompatible_protocol_version_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/incompatible_protocol_version_error.rs index de0754a754..34beb02237 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/incompatible_protocol_version_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/incompatible_protocol_version_error.rs @@ -1,9 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::basic::IncompatibleProtocolVersionError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=IncompatibleProtocolVersionError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/invalid_identifier_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/invalid_identifier_error.rs index 77abe190db..b364d38462 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/invalid_identifier_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/invalid_identifier_error.rs @@ -1,8 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::basic::invalid_identifier_error::InvalidIdentifierError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=InvalidIdentifierError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/invalid_signature_public_key_security_level_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/invalid_signature_public_key_security_level_error.rs index eb2985b459..64c9afdb30 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/invalid_signature_public_key_security_level_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/invalid_signature_public_key_security_level_error.rs @@ -1,8 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::signature::InvalidSignaturePublicKeySecurityLevelError; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=InvalidSignaturePublicKeySecurityLevelError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/invalid_state_transition_signature_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/invalid_state_transition_signature_error.rs index 769f00041e..ae335afaf4 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/invalid_state_transition_signature_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/invalid_state_transition_signature_error.rs @@ -1,8 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::signature::InvalidStateTransitionSignatureError; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=InvalidStateTransitionSignatureError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/json_schema_compilation_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/json_schema_compilation_error.rs index e011a1d1cd..ba7529fb6d 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/json_schema_compilation_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/json_schema_compilation_error.rs @@ -1,8 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::basic::json_schema_compilation_error::JsonSchemaCompilationError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=JsonSchemaCompilationError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/json_schema_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/json_schema_error.rs index 27a96e4d83..e46691ad39 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/json_schema_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/json_schema_error.rs @@ -5,8 +5,6 @@ use dpp::errors::consensus::codes::ErrorWithCode; use dpp::errors::consensus::ConsensusError; -use crate::buffer::Buffer; -use dpp::serialization::PlatformSerializable; use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=JsonSchemaError, inspectable)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/public_key_is_disabled_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/public_key_is_disabled_error.rs index 8dedd5ce4b..86959138e9 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/public_key_is_disabled_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/public_key_is_disabled_error.rs @@ -1,9 +1,8 @@ -use crate::buffer::Buffer; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::signature::PublicKeyIsDisabledError; use dpp::consensus::ConsensusError; use dpp::identity::KeyID; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=PublicKeyIsDisabledError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/public_key_security_level_not_met_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/public_key_security_level_not_met_error.rs index dfa02bf8fb..eb69de4fef 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/public_key_security_level_not_met_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/public_key_security_level_not_met_error.rs @@ -1,10 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::signature::PublicKeySecurityLevelNotMetError; use dpp::consensus::ConsensusError; -use serde::Serialize; -use dpp::serialization::PlatformSerializable; use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=PublicKeySecurityLevelNotMetError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/state_transition/invalid_state_transition_type_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/state_transition/invalid_state_transition_type_error.rs index e26e03e543..2da6a6ba06 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/state_transition/invalid_state_transition_type_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/state_transition/invalid_state_transition_type_error.rs @@ -1,8 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::basic::state_transition::InvalidStateTransitionTypeError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=InvalidStateTransitionTypeError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/state_transition/missing_state_transition_type_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/state_transition/missing_state_transition_type_error.rs index 03781fd2a3..d0ea289fc7 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/state_transition/missing_state_transition_type_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/state_transition/missing_state_transition_type_error.rs @@ -1,8 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::basic::state_transition::MissingStateTransitionTypeError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=MissingStateTransitionTypeError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/state_transition/state_transition_max_size_exceeded_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/state_transition/state_transition_max_size_exceeded_error.rs index 210cd09b5e..d8607ff919 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/state_transition/state_transition_max_size_exceeded_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/state_transition/state_transition_max_size_exceeded_error.rs @@ -1,8 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::basic::state_transition::StateTransitionMaxSizeExceededError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=StateTransitionMaxSizeExceededError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/unsupported_protocol_version_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/unsupported_protocol_version_error.rs index dfdd049508..e675a146ff 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/unsupported_protocol_version_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/unsupported_protocol_version_error.rs @@ -1,8 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::basic::UnsupportedProtocolVersionError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=UnsupportedProtocolVersionError)] diff --git a/packages/wasm-dpp/src/errors/consensus/basic/unsupported_version_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/unsupported_version_error.rs index 2066353bf6..9e48c407df 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/unsupported_version_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/unsupported_version_error.rs @@ -1,4 +1,3 @@ -use crate::buffer::Buffer; use dpp::consensus::basic::UnsupportedVersionError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; diff --git a/packages/wasm-dpp/src/errors/consensus/basic/wrong_public_key_purpose_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/wrong_public_key_purpose_error.rs index 95724268b1..ff07e99701 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/wrong_public_key_purpose_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/wrong_public_key_purpose_error.rs @@ -1,8 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::signature::WrongPublicKeyPurposeError; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=WrongPublicKeyPurposeError)] diff --git a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs index 503b1def1e..acae4e1f5d 100644 --- a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs @@ -2,8 +2,7 @@ use crate::errors::consensus::basic::{ IncompatibleProtocolVersionErrorWasm, InvalidIdentifierErrorWasm, JsonSchemaErrorWasm, UnsupportedProtocolVersionErrorWasm, UnsupportedVersionErrorWasm, }; -use dpp::consensus::{ConsensusError as DPPConsensusError, ConsensusError}; -use std::ops::Deref; +use dpp::consensus::ConsensusError as DPPConsensusError; use crate::errors::consensus::basic::identity::{ DuplicatedIdentityPublicKeyErrorWasm, DuplicatedIdentityPublicKeyIdErrorWasm, @@ -136,7 +135,7 @@ pub fn from_consensus_error_ref(e: &DPPConsensusError) -> JsValue { } pub fn from_state_error(state_error: &StateError) -> JsValue { - match state_error.deref() { + match state_error { StateError::DuplicatedIdentityPublicKeyIdStateError(e) => { DuplicatedIdentityPublicKeyIdStateErrorWasm::from(e).into() } @@ -222,7 +221,7 @@ pub fn from_state_error(state_error: &StateError) -> JsValue { // TODO: Move as From/TryInto trait implementation to wasm error modules fn from_basic_error(basic_error: &BasicError) -> JsValue { - match basic_error.deref() { + match basic_error { BasicError::ValueError(value_error) => ValueErrorWasm::from(value_error).into(), BasicError::DataContractNotPresentError(err) => { DataContractNotPresentErrorWasm::from(err).into() @@ -387,7 +386,7 @@ fn from_basic_error(basic_error: &BasicError) -> JsValue { } fn from_signature_error(signature_error: &SignatureError) -> JsValue { - match signature_error.deref() { + match signature_error { SignatureError::MissingPublicKeyError(err) => MissingPublicKeyErrorWasm::from(err).into(), SignatureError::InvalidIdentityPublicKeyTypeError(err) => { InvalidIdentityPublicKeyTypeErrorWasm::from(err).into() diff --git a/packages/wasm-dpp/src/errors/consensus/fee/balance_is_not_enough_error.rs b/packages/wasm-dpp/src/errors/consensus/fee/balance_is_not_enough_error.rs index 2cb9b1f523..e5599fe3bd 100644 --- a/packages/wasm-dpp/src/errors/consensus/fee/balance_is_not_enough_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/fee/balance_is_not_enough_error.rs @@ -3,7 +3,7 @@ use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::fee::balance_is_not_enough_error::BalanceIsNotEnoughError; use dpp::consensus::ConsensusError; use dpp::fee::Credits; -use dpp::serialization::PlatformSerializable; + use dpp::serialization::PlatformSerializableWithPlatformVersion; use dpp::version::PlatformVersion; use wasm_bindgen::prelude::*; diff --git a/packages/wasm-dpp/src/errors/consensus/signature/basic_bls_error.rs b/packages/wasm-dpp/src/errors/consensus/signature/basic_bls_error.rs index dacd14fd54..c004c978c7 100644 --- a/packages/wasm-dpp/src/errors/consensus/signature/basic_bls_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/signature/basic_bls_error.rs @@ -1,8 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::signature::BasicBLSError; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=BasicBLSError)] diff --git a/packages/wasm-dpp/src/errors/consensus/signature/basic_ecdsa_error.rs b/packages/wasm-dpp/src/errors/consensus/signature/basic_ecdsa_error.rs index ab98140205..9d62bcfd31 100644 --- a/packages/wasm-dpp/src/errors/consensus/signature/basic_ecdsa_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/signature/basic_ecdsa_error.rs @@ -1,8 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::signature::BasicECDSAError; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=BasicECDSAError)] diff --git a/packages/wasm-dpp/src/errors/consensus/signature/identity_not_found_error.rs b/packages/wasm-dpp/src/errors/consensus/signature/identity_not_found_error.rs index acbffc7522..91e6d2780e 100644 --- a/packages/wasm-dpp/src/errors/consensus/signature/identity_not_found_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/signature/identity_not_found_error.rs @@ -1,7 +1,7 @@ use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::signature::IdentityNotFoundError; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; use crate::buffer::Buffer; diff --git a/packages/wasm-dpp/src/errors/consensus/signature/signature_should_not_be_present_error.rs b/packages/wasm-dpp/src/errors/consensus/signature/signature_should_not_be_present_error.rs index 2e9706b11a..b48919fcef 100644 --- a/packages/wasm-dpp/src/errors/consensus/signature/signature_should_not_be_present_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/signature/signature_should_not_be_present_error.rs @@ -1,8 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::signature::SignatureShouldNotBePresentError; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=SignatureShouldNotBePresentError)] diff --git a/packages/wasm-dpp/src/errors/consensus/state/data_contract/data_contract_already_present_error.rs b/packages/wasm-dpp/src/errors/consensus/state/data_contract/data_contract_already_present_error.rs index e4d0c38e8d..72d9f5c244 100644 --- a/packages/wasm-dpp/src/errors/consensus/state/data_contract/data_contract_already_present_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/state/data_contract/data_contract_already_present_error.rs @@ -4,7 +4,7 @@ use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::state::data_contract::data_contract_already_present_error::DataContractAlreadyPresentError; use dpp::consensus::ConsensusError; -use dpp::serialization::{PlatformSerializable, PlatformSerializableWithPlatformVersion}; +use dpp::serialization::PlatformSerializableWithPlatformVersion; use dpp::version::PlatformVersion; use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=DataContractAlreadyPresentError)] diff --git a/packages/wasm-dpp/src/errors/consensus/state/data_contract/data_contract_is_readonly_error.rs b/packages/wasm-dpp/src/errors/consensus/state/data_contract/data_contract_is_readonly_error.rs index d2fdfccdb2..ddd18c3090 100644 --- a/packages/wasm-dpp/src/errors/consensus/state/data_contract/data_contract_is_readonly_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/state/data_contract/data_contract_is_readonly_error.rs @@ -1,10 +1,8 @@ -use crate::buffer::Buffer; use crate::identifier::IdentifierWrapper; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::state::data_contract::data_contract_is_readonly_error::DataContractIsReadonlyError; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=DataContractIsReadonlyError)] diff --git a/packages/wasm-dpp/src/errors/consensus/state/document/document_already_present_error.rs b/packages/wasm-dpp/src/errors/consensus/state/document/document_already_present_error.rs index 0864112eb7..c95e380504 100644 --- a/packages/wasm-dpp/src/errors/consensus/state/document/document_already_present_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/state/document/document_already_present_error.rs @@ -2,7 +2,7 @@ use crate::buffer::Buffer; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::state::document::document_already_present_error::DocumentAlreadyPresentError; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=DocumentAlreadyPresentError)] diff --git a/packages/wasm-dpp/src/errors/consensus/state/document/document_not_found_error.rs b/packages/wasm-dpp/src/errors/consensus/state/document/document_not_found_error.rs index bf157cc9a0..a46f7e7e8f 100644 --- a/packages/wasm-dpp/src/errors/consensus/state/document/document_not_found_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/state/document/document_not_found_error.rs @@ -2,7 +2,7 @@ use crate::buffer::Buffer; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::state::document::document_not_found_error::DocumentNotFoundError; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=DocumentNotFoundError)] diff --git a/packages/wasm-dpp/src/errors/consensus/state/document/document_owner_id_mismatch_error.rs b/packages/wasm-dpp/src/errors/consensus/state/document/document_owner_id_mismatch_error.rs index 9f209c3088..a02e7b45a5 100644 --- a/packages/wasm-dpp/src/errors/consensus/state/document/document_owner_id_mismatch_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/state/document/document_owner_id_mismatch_error.rs @@ -2,7 +2,7 @@ use crate::buffer::Buffer; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::state::document::document_owner_id_mismatch_error::DocumentOwnerIdMismatchError; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=DocumentOwnerIdMismatchError)] diff --git a/packages/wasm-dpp/src/errors/consensus/state/document/document_timestamp_window_violation_error.rs b/packages/wasm-dpp/src/errors/consensus/state/document/document_timestamp_window_violation_error.rs index 774a2cee74..7da7e2f260 100644 --- a/packages/wasm-dpp/src/errors/consensus/state/document/document_timestamp_window_violation_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/state/document/document_timestamp_window_violation_error.rs @@ -2,7 +2,7 @@ use crate::buffer::Buffer; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::state::document::document_timestamp_window_violation_error::DocumentTimestampWindowViolationError; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=DocumentTimestampWindowViolationError)] diff --git a/packages/wasm-dpp/src/errors/consensus/state/document/document_timestamps_are_equal_error.rs b/packages/wasm-dpp/src/errors/consensus/state/document/document_timestamps_are_equal_error.rs index 153ec1a1ed..543e5dfeaf 100644 --- a/packages/wasm-dpp/src/errors/consensus/state/document/document_timestamps_are_equal_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/state/document/document_timestamps_are_equal_error.rs @@ -2,7 +2,7 @@ use crate::buffer::Buffer; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::state::document::document_timestamps_are_equal_error::DocumentTimestampsAreEqualError; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=DocumentTimestampsAreEqualError)] diff --git a/packages/wasm-dpp/src/errors/consensus/state/document/document_timestamps_mismatch_error.rs b/packages/wasm-dpp/src/errors/consensus/state/document/document_timestamps_mismatch_error.rs index 0784c3f6b3..fb4c26994b 100644 --- a/packages/wasm-dpp/src/errors/consensus/state/document/document_timestamps_mismatch_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/state/document/document_timestamps_mismatch_error.rs @@ -2,7 +2,7 @@ use crate::buffer::Buffer; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::state::document::document_timestamps_mismatch_error::DocumentTimestampsMismatchError; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=DocumentTimestampsMismatchError)] diff --git a/packages/wasm-dpp/src/errors/consensus/state/document/duplicate_unique_index_error.rs b/packages/wasm-dpp/src/errors/consensus/state/document/duplicate_unique_index_error.rs index 0b3de84e1b..5583ef0d25 100644 --- a/packages/wasm-dpp/src/errors/consensus/state/document/duplicate_unique_index_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/state/document/duplicate_unique_index_error.rs @@ -2,7 +2,7 @@ use crate::buffer::Buffer; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::state::document::duplicate_unique_index_error::DuplicateUniqueIndexError; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use js_sys::JsString; use wasm_bindgen::prelude::*; diff --git a/packages/wasm-dpp/src/errors/consensus/state/document/invalid_document_revision_error.rs b/packages/wasm-dpp/src/errors/consensus/state/document/invalid_document_revision_error.rs index bb511b5296..6636ed0d14 100644 --- a/packages/wasm-dpp/src/errors/consensus/state/document/invalid_document_revision_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/state/document/invalid_document_revision_error.rs @@ -3,7 +3,7 @@ use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::state::document::invalid_document_revision_error::InvalidDocumentRevisionError; use dpp::consensus::ConsensusError; use dpp::prelude::Revision; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=InvalidDocumentRevisionError)] diff --git a/packages/wasm-dpp/src/errors/consensus/state/identity/duplicated_identity_public_key_id_state_error.rs b/packages/wasm-dpp/src/errors/consensus/state/identity/duplicated_identity_public_key_id_state_error.rs index cadc9ad13b..74cdbe96de 100644 --- a/packages/wasm-dpp/src/errors/consensus/state/identity/duplicated_identity_public_key_id_state_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/state/identity/duplicated_identity_public_key_id_state_error.rs @@ -1,8 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::state::identity::duplicated_identity_public_key_id_state_error::DuplicatedIdentityPublicKeyIdStateError; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=DuplicatedIdentityPublicKeyIdStateError)] diff --git a/packages/wasm-dpp/src/errors/consensus/state/identity/duplicated_identity_public_key_state_error.rs b/packages/wasm-dpp/src/errors/consensus/state/identity/duplicated_identity_public_key_state_error.rs index fcc463a53e..69ae1ade99 100644 --- a/packages/wasm-dpp/src/errors/consensus/state/identity/duplicated_identity_public_key_state_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/state/identity/duplicated_identity_public_key_state_error.rs @@ -1,8 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::state::identity::duplicated_identity_public_key_state_error::DuplicatedIdentityPublicKeyStateError; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=DuplicatedIdentityPublicKeyStateError)] diff --git a/packages/wasm-dpp/src/errors/consensus/state/identity/identity_already_exists_error.rs b/packages/wasm-dpp/src/errors/consensus/state/identity/identity_already_exists_error.rs index 91746d23c4..9396e42fa0 100644 --- a/packages/wasm-dpp/src/errors/consensus/state/identity/identity_already_exists_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/state/identity/identity_already_exists_error.rs @@ -2,7 +2,7 @@ use crate::buffer::Buffer; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::state::identity::IdentityAlreadyExistsError; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=IdentityAlreadyExistsError)] diff --git a/packages/wasm-dpp/src/errors/consensus/state/identity/identity_public_key_disabled_at_window_violation_error.rs b/packages/wasm-dpp/src/errors/consensus/state/identity/identity_public_key_disabled_at_window_violation_error.rs index b33a155452..d29d630616 100644 --- a/packages/wasm-dpp/src/errors/consensus/state/identity/identity_public_key_disabled_at_window_violation_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/state/identity/identity_public_key_disabled_at_window_violation_error.rs @@ -1,8 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::state::identity::identity_public_key_disabled_at_window_violation_error::IdentityPublicKeyDisabledAtWindowViolationError; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=IdentityPublicKeyDisabledAtWindowViolationError)] diff --git a/packages/wasm-dpp/src/errors/consensus/state/identity/identity_public_key_is_disabled_error.rs b/packages/wasm-dpp/src/errors/consensus/state/identity/identity_public_key_is_disabled_error.rs index 8b7f64eb42..e8a4588aed 100644 --- a/packages/wasm-dpp/src/errors/consensus/state/identity/identity_public_key_is_disabled_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/state/identity/identity_public_key_is_disabled_error.rs @@ -1,9 +1,8 @@ -use crate::buffer::Buffer; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::state::identity::identity_public_key_is_disabled_error::IdentityPublicKeyIsDisabledError; use dpp::consensus::ConsensusError; use dpp::identity::KeyID; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=IdentityPublicKeyIsDisabledError)] diff --git a/packages/wasm-dpp/src/errors/consensus/state/identity/identity_public_key_is_read_only_error.rs b/packages/wasm-dpp/src/errors/consensus/state/identity/identity_public_key_is_read_only_error.rs index 1296df9471..a842cc29e9 100644 --- a/packages/wasm-dpp/src/errors/consensus/state/identity/identity_public_key_is_read_only_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/state/identity/identity_public_key_is_read_only_error.rs @@ -1,9 +1,8 @@ -use crate::buffer::Buffer; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::state::identity::identity_public_key_is_read_only_error::IdentityPublicKeyIsReadOnlyError; use dpp::consensus::ConsensusError; use dpp::identity::KeyID; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=IdentityPublicKeyIsReadOnlyError)] diff --git a/packages/wasm-dpp/src/errors/consensus/state/identity/invalid_identity_public_key_id_error.rs b/packages/wasm-dpp/src/errors/consensus/state/identity/invalid_identity_public_key_id_error.rs index 92aa350ca1..da7eb35ac8 100644 --- a/packages/wasm-dpp/src/errors/consensus/state/identity/invalid_identity_public_key_id_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/state/identity/invalid_identity_public_key_id_error.rs @@ -1,10 +1,8 @@ -use crate::buffer::Buffer; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::state::identity::invalid_identity_public_key_id_error::InvalidIdentityPublicKeyIdError; use dpp::consensus::ConsensusError; use dpp::identity::KeyID; -use dpp::serialization::{PlatformSerializable, PlatformSerializableWithPlatformVersion}; -use dpp::version::PlatformVersion; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=InvalidIdentityPublicKeyIdError)] diff --git a/packages/wasm-dpp/src/errors/consensus/state/identity/invalid_identity_revision_error.rs b/packages/wasm-dpp/src/errors/consensus/state/identity/invalid_identity_revision_error.rs index c8a587056c..8db6b8973d 100644 --- a/packages/wasm-dpp/src/errors/consensus/state/identity/invalid_identity_revision_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/state/identity/invalid_identity_revision_error.rs @@ -2,7 +2,7 @@ use crate::buffer::Buffer; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::state::identity::invalid_identity_revision_error::InvalidIdentityRevisionError; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use js_sys::Number; use wasm_bindgen::prelude::*; diff --git a/packages/wasm-dpp/src/errors/consensus/state/identity/max_identity_public_key_limit_reached_error.rs b/packages/wasm-dpp/src/errors/consensus/state/identity/max_identity_public_key_limit_reached_error.rs index f8fdd04d19..7c22271951 100644 --- a/packages/wasm-dpp/src/errors/consensus/state/identity/max_identity_public_key_limit_reached_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/state/identity/max_identity_public_key_limit_reached_error.rs @@ -1,8 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::state::identity::max_identity_public_key_limit_reached_error::MaxIdentityPublicKeyLimitReachedError; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=MaxIdentityPublicKeyLimitReachedError)] diff --git a/packages/wasm-dpp/src/errors/consensus/value_error.rs b/packages/wasm-dpp/src/errors/consensus/value_error.rs index d3cfb69f29..3b0dec5c0d 100644 --- a/packages/wasm-dpp/src/errors/consensus/value_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/value_error.rs @@ -1,8 +1,7 @@ -use crate::buffer::Buffer; use dpp::consensus::basic::value_error::ValueError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; -use dpp::serialization::PlatformSerializable; + use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=ValueError, inspectable)] diff --git a/packages/wasm-dpp/src/identity/factory_utils.rs b/packages/wasm-dpp/src/identity/factory_utils.rs index e0f1e90293..18e1942842 100644 --- a/packages/wasm-dpp/src/identity/factory_utils.rs +++ b/packages/wasm-dpp/src/identity/factory_utils.rs @@ -1,10 +1,10 @@ use crate::errors::RustConversionError; -use crate::identity::state_transition::create_asset_lock_proof_from_wasm_instance; + use crate::identity::state_transition::identity_public_key_transitions::IdentityPublicKeyWithWitnessWasm; use crate::identity::IdentityPublicKeyWasm; use crate::utils::{generic_of_js_val, to_vec_of_platform_values}; use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; -use dpp::identity::state_transition::asset_lock_proof::AssetLockProof; + use dpp::identity::{IdentityPublicKey, KeyID}; use dpp::serialization::ValueConvertible; use dpp::state_transition::public_key_in_creation::IdentityPublicKeyInCreation; diff --git a/packages/wasm-dpp/src/identity/identity.rs b/packages/wasm-dpp/src/identity/identity.rs index ba9372c7f0..19a2f1ac00 100644 --- a/packages/wasm-dpp/src/identity/identity.rs +++ b/packages/wasm-dpp/src/identity/identity.rs @@ -4,18 +4,18 @@ use crate::identifier::IdentifierWrapper; use crate::identity::IdentityPublicKeyWasm; use crate::metadata::MetadataWasm; use crate::utils::{IntoWasm, WithJsError}; -use crate::{utils, with_js_error}; +use crate::with_js_error; use dpp::identity::accessors::{IdentityGettersV0, IdentitySettersV0}; use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; use dpp::identity::{Identity, IdentityPublicKey, KeyID}; use dpp::metadata::Metadata; -use dpp::platform_value::{ReplacementType, Value}; +use dpp::platform_value::ReplacementType; use dpp::serialization::PlatformDeserializable; use dpp::serialization::PlatformSerializable; use dpp::serialization::ValueConvertible; use dpp::version::PlatformVersion; use serde::Serialize; -use serde_json::Value as JsonValue; + use wasm_bindgen::prelude::*; use wasm_bindgen::JsValue; @@ -47,7 +47,7 @@ impl IdentityWasm { let platform_version = &PlatformVersion::get(platform_version).map_err(|e| JsValue::from(e.to_string()))?; - Identity::default_versioned(&platform_version) + Identity::default_versioned(platform_version) .map(Into::into) .map_err(from_dpp_err) } @@ -70,7 +70,6 @@ impl IdentityWasm { let public_keys = public_keys .iter() - .into_iter() .map(|key| { key.to_wasm::("IdentityPublicKey") .map(|key| { @@ -249,7 +248,6 @@ impl IdentityWasm { let public_keys: Vec = public_keys .iter() - .into_iter() .map(|key| { key.to_wasm::("IdentityPublicKey") .map(|key| key.to_owned().into()) diff --git a/packages/wasm-dpp/src/identity/identity_factory.rs b/packages/wasm-dpp/src/identity/identity_factory.rs index a284715f8a..6643f6b096 100644 --- a/packages/wasm-dpp/src/identity/identity_factory.rs +++ b/packages/wasm-dpp/src/identity/identity_factory.rs @@ -155,7 +155,7 @@ impl IdentityFactoryWasm { identity: &IdentityWasm, asset_lock_proof: &JsValue, ) -> Result { - let asset_lock_proof = create_asset_lock_proof_from_wasm_instance(&asset_lock_proof)?; + let asset_lock_proof = create_asset_lock_proof_from_wasm_instance(asset_lock_proof)?; self.0 .create_identity_create_transition( diff --git a/packages/wasm-dpp/src/identity/identity_public_key/mod.rs b/packages/wasm-dpp/src/identity/identity_public_key/mod.rs index 39ce59be5e..4565733075 100644 --- a/packages/wasm-dpp/src/identity/identity_public_key/mod.rs +++ b/packages/wasm-dpp/src/identity/identity_public_key/mod.rs @@ -1,19 +1,18 @@ -use js_sys::Reflect::delete_property; pub use serde::{Deserialize, Serialize}; -use serde_json::Value as JsonValue; + use std::convert::TryInto; use wasm_bindgen::prelude::*; use crate::utils::WithJsError; -use crate::{buffer::Buffer, utils, with_js_error}; +use crate::{buffer::Buffer, with_js_error}; use dpp::identity::identity_public_key::accessors::v0::{ IdentityPublicKeyGettersV0, IdentityPublicKeySettersV0, }; use dpp::identity::identity_public_key::hash::IdentityPublicKeyHashMethodsV0; use dpp::identity::{IdentityPublicKey, KeyID, TimestampMillis}; -use dpp::platform_value::{BinaryData, ReplacementType, Value}; +use dpp::platform_value::{BinaryData, ReplacementType}; use dpp::serialization::ValueConvertible; -use dpp::state_transition::public_key_in_creation::v0::BINARY_DATA_FIELDS; + use dpp::version::PlatformVersion; mod purpose; pub use purpose::*; @@ -37,7 +36,7 @@ impl IdentityPublicKeyWasm { let platform_version = &PlatformVersion::get(platform_version).map_err(|e| JsValue::from(e.to_string()))?; - IdentityPublicKey::default_versioned(&platform_version) + IdentityPublicKey::default_versioned(platform_version) .map(Into::into) .map_err(from_dpp_err) } diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs index e342868478..21964f9361 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs @@ -1,5 +1,3 @@ -use dpp::platform_value::Value; -use serde_json::Value as JsonValue; use std::default::Default; use wasm_bindgen::__rt::Ref; @@ -23,7 +21,7 @@ use crate::{ ChainAssetLockProofWasm, InstantAssetLockProofWasm, }, identity::state_transition::identity_public_key_transitions::IdentityPublicKeyWithWitnessWasm, - utils, with_js_error, + with_js_error, }; use crate::bls_adapter::JsBlsAdapter; @@ -63,7 +61,7 @@ impl IdentityCreateTransitionWasm { let platform_version = &PlatformVersion::get(platform_version).map_err(|e| JsValue::from(e.to_string()))?; - IdentityCreateTransition::default_versioned(&platform_version) + IdentityCreateTransition::default_versioned(platform_version) .map(Into::into) .map_err(from_dpp_err) } @@ -361,6 +359,6 @@ impl IdentityCreateTransitionWasm { #[wasm_bindgen(js_name=setSignature)] pub fn set_signature(&mut self, signature: Option>) { self.0 - .set_signature(BinaryData::new(signature.unwrap_or(vec![]))) + .set_signature(BinaryData::new(signature.unwrap_or_default())) } } diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_credit_transfer_transition/transition.rs b/packages/wasm-dpp/src/identity/state_transition/identity_credit_transfer_transition/transition.rs index f68057fdde..2c44a7fb37 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_credit_transfer_transition/transition.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_credit_transfer_transition/transition.rs @@ -1,6 +1,5 @@ use crate::utils::WithJsError; -use dpp::platform_value::{ReplacementType, Value}; -use serde_json::Value as JsonValue; + use std::convert::TryInto; use std::default::Default; @@ -11,14 +10,14 @@ use crate::bls_adapter::{BlsAdapter, JsBlsAdapter}; use crate::errors::from_dpp_err; use crate::identifier::IdentifierWrapper; use crate::identity::IdentityPublicKeyWasm; -use crate::{buffer::Buffer, utils, with_js_error}; +use crate::{buffer::Buffer, with_js_error}; use dpp::identifier::Identifier; use dpp::identity::KeyType; use dpp::platform_value::string_encoding::Encoding; use dpp::platform_value::{string_encoding, BinaryData}; use dpp::serialization::{PlatformSerializable, ValueConvertible}; use dpp::state_transition::identity_credit_transfer_transition::accessors::IdentityCreditTransferTransitionAccessorsV0; -use dpp::state_transition::identity_credit_transfer_transition::fields::IDENTIFIER_FIELDS; + use dpp::state_transition::identity_credit_transfer_transition::IdentityCreditTransferTransition; use dpp::state_transition::StateTransitionLike; use dpp::state_transition::{StateTransition, StateTransitionIdentitySigned}; @@ -45,7 +44,7 @@ impl IdentityCreditTransferTransitionWasm { let platform_version = &PlatformVersion::get(platform_version).map_err(|e| JsValue::from(e.to_string()))?; - IdentityCreditTransferTransition::default_versioned(&platform_version) + IdentityCreditTransferTransition::default_versioned(platform_version) .map(Into::into) .map_err(from_dpp_err) } @@ -311,7 +310,7 @@ impl IdentityCreditTransferTransitionWasm { #[wasm_bindgen(js_name=setSignature)] pub fn set_signature(&mut self, signature: Option>) { self.0 - .set_signature(BinaryData::new(signature.unwrap_or(vec![]))) + .set_signature(BinaryData::new(signature.unwrap_or_default())) } #[wasm_bindgen] diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_public_key_transitions.rs b/packages/wasm-dpp/src/identity/state_transition/identity_public_key_transitions.rs index d380d2a257..dae2e8d300 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_public_key_transitions.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_public_key_transitions.rs @@ -1,20 +1,20 @@ //todo: move this file to transition -use dpp::platform_value::{BinaryData, ReplacementType, Value}; +use dpp::platform_value::{BinaryData, ReplacementType}; use dpp::serialization::ValueConvertible; use dpp::state_transition::public_key_in_creation::accessors::{ IdentityPublicKeyInCreationV0Getters, IdentityPublicKeyInCreationV0Setters, }; -use dpp::state_transition::public_key_in_creation::v0::BINARY_DATA_FIELDS; + use dpp::state_transition::public_key_in_creation::IdentityPublicKeyInCreation; use js_sys::Reflect::delete_property; pub use serde::{Deserialize, Serialize}; -use serde_json::Value as JsonValue; + use std::convert::TryInto; use wasm_bindgen::prelude::*; use crate::errors::from_dpp_err; use crate::utils::WithJsError; -use crate::{buffer::Buffer, utils, with_js_error}; +use crate::{buffer::Buffer, with_js_error}; use dpp::version::PlatformVersion; #[derive(Deserialize, Default)] #[serde(rename_all = "camelCase")] @@ -33,7 +33,7 @@ impl IdentityPublicKeyWithWitnessWasm { let platform_version = &PlatformVersion::get(platform_version).map_err(|e| JsValue::from(e.to_string()))?; - IdentityPublicKeyInCreation::default_versioned(&platform_version) + IdentityPublicKeyInCreation::default_versioned(platform_version) .map(Into::into) .map_err(from_dpp_err) } diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_topup_transition/identity_topup_transition.rs b/packages/wasm-dpp/src/identity/state_transition/identity_topup_transition/identity_topup_transition.rs index c725337be3..e26ff9c7bc 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_topup_transition/identity_topup_transition.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_topup_transition/identity_topup_transition.rs @@ -8,9 +8,9 @@ use dpp::identity::state_transition::AssetLockProved; use dpp::identity::KeyType; use dpp::platform_value::BinaryData; use dpp::serialization::ValueConvertible; -use dpp::state_transition::identity_topup_transition::fields::IDENTIFIER_FIELDS; + use dpp::version::PlatformVersion; -use serde_json::Value as JsonValue; + use wasm_bindgen::prelude::*; use crate::identifier::IdentifierWrapper; @@ -20,12 +20,12 @@ use crate::{ identity::state_transition::asset_lock_proof::{ ChainAssetLockProofWasm, InstantAssetLockProofWasm, }, - utils, with_js_error, + with_js_error, }; use crate::identity::state_transition::create_asset_lock_proof_from_wasm_instance; +use dpp::platform_value::string_encoding; use dpp::platform_value::string_encoding::Encoding; -use dpp::platform_value::{string_encoding, ReplacementType, Value}; use dpp::serialization::PlatformSerializable; use dpp::state_transition::identity_topup_transition::accessors::IdentityTopUpTransitionAccessorsV0; use dpp::state_transition::identity_topup_transition::IdentityTopUpTransition; @@ -58,7 +58,7 @@ impl IdentityTopUpTransitionWasm { let platform_version = &PlatformVersion::get(platform_version).map_err(|e| JsValue::from(e.to_string()))?; - IdentityTopUpTransition::default_versioned(&platform_version) + IdentityTopUpTransition::default_versioned(platform_version) .map(Into::into) .map_err(from_dpp_err) } @@ -303,6 +303,6 @@ impl IdentityTopUpTransitionWasm { #[wasm_bindgen(js_name=setSignature)] pub fn set_signature(&mut self, signature: Option>) { self.0 - .set_signature(BinaryData::new(signature.unwrap_or(vec![]))) + .set_signature(BinaryData::new(signature.unwrap_or_default())) } } diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/identity_update_transition.rs b/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/identity_update_transition.rs index 3218fe754e..474d11ab56 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/identity_update_transition.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/identity_update_transition.rs @@ -2,7 +2,7 @@ use std::convert::TryInto; use std::default::Default; use serde::{Deserialize, Serialize}; -use serde_json::Value as JsonValue; + use wasm_bindgen::__rt::Ref; use wasm_bindgen::prelude::*; @@ -11,7 +11,7 @@ use crate::identifier::IdentifierWrapper; use crate::{ buffer::Buffer, identity::state_transition::identity_public_key_transitions::IdentityPublicKeyWithWitnessWasm, - identity::IdentityPublicKeyWasm, utils, with_js_error, + identity::IdentityPublicKeyWasm, with_js_error, }; use crate::bls_adapter::{BlsAdapter, JsBlsAdapter}; @@ -24,7 +24,7 @@ use dpp::errors::consensus::ConsensusError; use dpp::errors::ProtocolError; use dpp::identity::{KeyID, KeyType, TimestampMillis}; use dpp::platform_value::string_encoding::Encoding; -use dpp::platform_value::{string_encoding, BinaryData, ReplacementType, Value}; +use dpp::platform_value::{string_encoding, BinaryData}; use dpp::prelude::Revision; use dpp::serialization::PlatformSerializable; use dpp::serialization::ValueConvertible; @@ -79,7 +79,7 @@ impl IdentityUpdateTransitionWasm { let platform_version = &PlatformVersion::get(platform_version).map_err(|e| JsValue::from(e.to_string()))?; - IdentityUpdateTransition::default_versioned(&platform_version) + IdentityUpdateTransition::default_versioned(platform_version) .map(Into::into) .map_err(from_dpp_err) } @@ -444,7 +444,7 @@ impl IdentityUpdateTransitionWasm { #[wasm_bindgen(js_name=setSignature)] pub fn set_signature(&mut self, signature: Option>) { self.0 - .set_signature(BinaryData::new(signature.unwrap_or(vec![]))) + .set_signature(BinaryData::new(signature.unwrap_or_default())) } #[wasm_bindgen(js_name=getRevision)] diff --git a/packages/wasm-dpp/src/metadata.rs b/packages/wasm-dpp/src/metadata.rs index 488ba9e10a..2ba4a9e1b8 100644 --- a/packages/wasm-dpp/src/metadata.rs +++ b/packages/wasm-dpp/src/metadata.rs @@ -20,7 +20,7 @@ impl From for MetadataWasm { impl From<&MetadataWasm> for Metadata { fn from(v: &MetadataWasm) -> Self { - v.0.clone() + v.0 } } diff --git a/packages/wasm-dpp/src/protocol_version.rs b/packages/wasm-dpp/src/protocol_version.rs index be8ea4da80..605e58c2fb 100644 --- a/packages/wasm-dpp/src/protocol_version.rs +++ b/packages/wasm-dpp/src/protocol_version.rs @@ -1,4 +1,4 @@ -use dpp::version::{PlatformVersion, LATEST_VERSION}; +use dpp::version::PlatformVersion; use wasm_bindgen::prelude::wasm_bindgen; #[wasm_bindgen(js_name = getLatestProtocolVersion)] diff --git a/packages/wasm-dpp/src/state_transition/errors/invalid_state_transition_error.rs b/packages/wasm-dpp/src/state_transition/errors/invalid_state_transition_error.rs index b2726378e5..2c09e469ab 100644 --- a/packages/wasm-dpp/src/state_transition/errors/invalid_state_transition_error.rs +++ b/packages/wasm-dpp/src/state_transition/errors/invalid_state_transition_error.rs @@ -1,6 +1,6 @@ use dpp::consensus::ConsensusError; -use serde::Serialize; -use wasm_bindgen::{prelude::wasm_bindgen, JsError, JsValue}; + +use wasm_bindgen::{prelude::wasm_bindgen, JsValue}; use crate::{ buffer::Buffer, errors::consensus::consensus_error::from_consensus_error_ref, From 28820ae6921a07f42037c700357cf48a916ef5fb Mon Sep 17 00:00:00 2001 From: lklimek <842586+lklimek@users.noreply.github.com> Date: Tue, 28 Nov 2023 09:29:52 +0100 Subject: [PATCH 002/191] chore: cargo clippy fixes, continued (#1602) --- .../document_type/accessors/mod.rs | 2 +- .../document_type/accessors/v0/mod.rs | 2 +- .../class_methods/try_from_schema/v0/mod.rs | 2 +- .../document_type/property/mod.rs | 1 - .../find_identifier_and_binary_paths/mod.rs | 2 +- .../v0/mod.rs | 2 +- .../document_type/v0/accessors.rs | 2 +- .../src/data_contract/document_type/v0/mod.rs | 2 +- .../document_type/v0/random_document_type.rs | 2 +- packages/rs-dpp/src/document/mod.rs | 4 +- .../instant/instant_asset_lock_proof.rs | 6 +-- .../state_transition/asset_lock_proof/mod.rs | 2 +- .../accessors/mod.rs | 3 +- .../v0/v0_methods.rs | 5 +-- .../accessors/mod.rs | 1 - .../tests/fixtures/get_dpns_data_contract.rs | 5 +-- .../instant_asset_lock_proof_fixture.rs | 2 +- .../src/execution/check_tx/v0/mod.rs | 10 ++--- .../common/asset_lock/proof/chain/mod.rs | 2 +- .../state_transitions/identity_top_up/mod.rs | 1 - .../data_contract_history/mod.rs | 5 +-- .../src/query/document_query/mod.rs | 3 +- .../src/query/document_query/v0/mod.rs | 4 +- .../src/query/response_metadata/mod.rs | 2 +- .../src/query/system/epoch_infos/v0/mod.rs | 6 +-- .../system/version_upgrade_state/v0/mod.rs | 5 +-- .../version_upgrade_vote_status/v0/mod.rs | 7 ++-- packages/rs-drive-abci/src/query/v0/mod.rs | 1 - .../tests/strategy_tests/query.rs | 33 +++++----------- .../verify_state_transitions.rs | 32 +++++++-------- packages/rs-drive-proof-verifier/src/proof.rs | 16 ++++---- .../src/drive/batch/drive_op_batch/mod.rs | 5 +-- .../epochs/get_epochs_infos/mod.rs | 2 +- .../epochs/get_epochs_infos/v0/mod.rs | 6 +-- .../proposers/get_epoch_proposers/v0/mod.rs | 2 +- .../epochs/prove_epochs_infos/mod.rs | 2 +- .../epochs/prove_epochs_infos/v0/mod.rs | 11 +++--- packages/rs-drive/src/drive/document/mod.rs | 2 - .../rs-drive/src/drive/document/update/mod.rs | 1 - .../insert/add_new_identity/v0/mod.rs | 3 -- .../src/drive/initialization/v0/mod.rs | 5 +-- .../v0/mod.rs | 5 +-- .../fetch_proved_versions_with_counter/mod.rs | 3 -- .../fetch_validator_version_votes/v0/mod.rs | 5 +-- .../verify/contract/verify_contract/v0/mod.rs | 2 +- .../system/verify_epoch_infos/v0/mod.rs | 4 +- .../verify/system/verify_upgrade_state/mod.rs | 3 +- .../verify_upgrade_vote_status/v0/mod.rs | 4 +- packages/rs-drive/src/query/mod.rs | 7 ++-- .../identity/identity_topup/v0/transformer.rs | 2 +- .../rs-drive/tests/deterministic_root_hash.rs | 4 -- packages/rs-platform-value/src/value_map.rs | 4 +- .../document_create_transition.rs | 39 ++----------------- .../chain/chain_asset_lock_proof.rs | 5 +-- .../instant/instant_asset_lock_proof.rs | 12 +----- .../state_transition/asset_lock_proof/mod.rs | 2 - .../src/validation/validation_result.rs | 9 ++--- 57 files changed, 103 insertions(+), 218 deletions(-) diff --git a/packages/rs-dpp/src/data_contract/document_type/accessors/mod.rs b/packages/rs-dpp/src/data_contract/document_type/accessors/mod.rs index 3b9c92e103..fff3756248 100644 --- a/packages/rs-dpp/src/data_contract/document_type/accessors/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/accessors/mod.rs @@ -10,7 +10,7 @@ use platform_value::{Identifier, Value}; use crate::data_contract::storage_requirements::keys_for_document_type::StorageKeyRequirements; use crate::identity::SecurityLevel; use indexmap::IndexMap; -use std::collections::{BTreeMap, BTreeSet}; +use std::collections::BTreeSet; pub use v0::*; impl DocumentTypeV0Getters for DocumentType { diff --git a/packages/rs-dpp/src/data_contract/document_type/accessors/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/accessors/v0/mod.rs index a87802cf6f..d18abdfc91 100644 --- a/packages/rs-dpp/src/data_contract/document_type/accessors/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/accessors/v0/mod.rs @@ -7,7 +7,7 @@ use platform_value::{Identifier, Value}; use crate::data_contract::storage_requirements::keys_for_document_type::StorageKeyRequirements; use crate::identity::SecurityLevel; use indexmap::IndexMap; -use std::collections::{BTreeMap, BTreeSet}; +use std::collections::BTreeSet; pub trait DocumentTypeV0Getters { /// Returns the name of the document type. diff --git a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs index 8b3aaab6e1..7dfcbadac8 100644 --- a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs @@ -2,7 +2,7 @@ use crate::data_contract::document_type::v0::DocumentTypeV0; #[cfg(feature = "validation")] use crate::data_contract::document_type::v0::StatelessJsonSchemaLazyValidator; use indexmap::IndexMap; -use std::collections::{BTreeMap, BTreeSet, BinaryHeap, HashSet}; +use std::collections::{BTreeMap, BTreeSet, HashSet}; use std::convert::TryInto; use crate::consensus::basic::data_contract::{ diff --git a/packages/rs-dpp/src/data_contract/document_type/property/mod.rs b/packages/rs-dpp/src/data_contract/document_type/property/mod.rs index 0b7f1cac73..d1c9e08226 100644 --- a/packages/rs-dpp/src/data_contract/document_type/property/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/property/mod.rs @@ -1,4 +1,3 @@ -use std::collections::BTreeMap; use std::convert::TryInto; use std::io::{BufReader, Read}; diff --git a/packages/rs-dpp/src/data_contract/document_type/schema/find_identifier_and_binary_paths/mod.rs b/packages/rs-dpp/src/data_contract/document_type/schema/find_identifier_and_binary_paths/mod.rs index 7eeda7217e..a8f97466e7 100644 --- a/packages/rs-dpp/src/data_contract/document_type/schema/find_identifier_and_binary_paths/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/schema/find_identifier_and_binary_paths/mod.rs @@ -4,7 +4,7 @@ use crate::data_contract::document_type::DocumentType; use crate::version::dpp_versions::DocumentTypeVersions; use crate::ProtocolError; use indexmap::IndexMap; -use std::collections::{BTreeMap, BTreeSet}; +use std::collections::BTreeSet; mod v0; diff --git a/packages/rs-dpp/src/data_contract/document_type/schema/find_identifier_and_binary_paths/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/schema/find_identifier_and_binary_paths/v0/mod.rs index f2a0b4a209..865662bf41 100644 --- a/packages/rs-dpp/src/data_contract/document_type/schema/find_identifier_and_binary_paths/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/schema/find_identifier_and_binary_paths/v0/mod.rs @@ -3,7 +3,7 @@ use crate::data_contract::document_type::property::{DocumentProperty, DocumentPr use crate::data_contract::document_type::v0::DocumentTypeV0; use indexmap::IndexMap; -use std::collections::{BTreeMap, BTreeSet}; +use std::collections::BTreeSet; impl DocumentTypeV0 { pub(super) fn find_identifier_and_binary_paths_v0( diff --git a/packages/rs-dpp/src/data_contract/document_type/v0/accessors.rs b/packages/rs-dpp/src/data_contract/document_type/v0/accessors.rs index 208ebc1ff8..015c50a8e8 100644 --- a/packages/rs-dpp/src/data_contract/document_type/v0/accessors.rs +++ b/packages/rs-dpp/src/data_contract/document_type/v0/accessors.rs @@ -9,7 +9,7 @@ use platform_value::{Identifier, Value}; use crate::data_contract::storage_requirements::keys_for_document_type::StorageKeyRequirements; use crate::identity::SecurityLevel; use indexmap::IndexMap; -use std::collections::{BTreeMap, BTreeSet}; +use std::collections::BTreeSet; impl DocumentTypeV0Getters for DocumentTypeV0 { fn name(&self) -> &String { diff --git a/packages/rs-dpp/src/data_contract/document_type/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/v0/mod.rs index cce01ea1b4..61b843e1ce 100644 --- a/packages/rs-dpp/src/data_contract/document_type/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/v0/mod.rs @@ -1,5 +1,5 @@ use indexmap::IndexMap; -use std::collections::{BTreeMap, BTreeSet}; +use std::collections::BTreeSet; use crate::data_contract::document_type::index::Index; use crate::data_contract::document_type::index_level::IndexLevel; diff --git a/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs b/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs index 26c84d2c31..822aa40609 100644 --- a/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs +++ b/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs @@ -110,7 +110,7 @@ use indexmap::IndexMap; use platform_value::{Identifier, Value}; use rand::rngs::StdRng; use rand::Rng; -use std::collections::{BTreeMap, BTreeSet}; +use std::collections::BTreeSet; use std::ops::Range; impl DocumentTypeV0 { diff --git a/packages/rs-dpp/src/document/mod.rs b/packages/rs-dpp/src/document/mod.rs index 5eda83da44..f929194ba2 100644 --- a/packages/rs-dpp/src/document/mod.rs +++ b/packages/rs-dpp/src/document/mod.rs @@ -187,7 +187,7 @@ mod tests { use crate::data_contract::document_type::random_document::CreateRandomDocument; use crate::document::serialization_traits::DocumentPlatformConversionMethodsV0; use crate::tests::json_document::json_document_to_contract; - use platform_value::{Bytes32, Identifier}; + use regex::Regex; #[test] @@ -208,7 +208,7 @@ mod tests { .expect("expected to get a random document"); let document_string = format!("{}", document); - let pattern = r#"v\d+ : id:45ZNwGcxeMpLpYmiVEKKBKXbZfinrhjZLkau1GWizPFX owner_id:2vq574DjKi7ZD8kJ6dMHxT5wu6ZKD2bW5xKAyKAGW7qZ created_at:(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) updated_at:(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) avatarUrl:string y8RD1DbW18RuyblDX7hx\[...\(670\)\] displayName:string y94Itl6mn1yBE publicMessage:string SvAQrzsslj0ESc15GQBQ\[...\(105\)\] .*"#; + let pattern = r"v\d+ : id:45ZNwGcxeMpLpYmiVEKKBKXbZfinrhjZLkau1GWizPFX owner_id:2vq574DjKi7ZD8kJ6dMHxT5wu6ZKD2bW5xKAyKAGW7qZ created_at:(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) updated_at:(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) avatarUrl:string y8RD1DbW18RuyblDX7hx\[...\(670\)\] displayName:string y94Itl6mn1yBE publicMessage:string SvAQrzsslj0ESc15GQBQ\[...\(105\)\] .*"; let re = Regex::new(pattern).unwrap(); assert!( re.is_match(document_string.as_str()), diff --git a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs index 5d11032960..da95683d18 100644 --- a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs +++ b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs @@ -6,13 +6,11 @@ use dashcore::transaction::special_transaction::TransactionPayload; use dashcore::{InstantLock, OutPoint, Transaction, TxIn, TxOut}; use platform_value::{BinaryData, Value}; -use crate::consensus::basic::identity::IdentityAssetLockProofLockedTransactionMismatchError; +use crate::identity::state_transition::asset_lock_proof::instant::methods; +use platform_version::version::PlatformVersion; use serde::de::Error as DeError; use serde::ser::Error as SerError; use serde::{Deserialize, Deserializer, Serialize, Serializer}; -use platform_version::version::{FeatureVersion, PlatformVersion}; -use crate::identity::state_transition::asset_lock_proof::instant::methods; -use crate::identity::state_transition::asset_lock_proof::validate_asset_lock_transaction_structure::validate_asset_lock_transaction_structure; use crate::prelude::Identifier; #[cfg(feature = "cbor")] diff --git a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/mod.rs b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/mod.rs index 395190bec9..7731b02c3d 100644 --- a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/mod.rs +++ b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/mod.rs @@ -1,6 +1,6 @@ use std::convert::{TryFrom, TryInto}; -use dashcore::{OutPoint, Transaction, TxOut}; +use dashcore::{OutPoint, Transaction}; use serde::{Deserialize, Deserializer, Serialize}; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/accessors/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/accessors/mod.rs index eefb63b318..9a932ad308 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/accessors/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/accessors/mod.rs @@ -1,9 +1,8 @@ mod v0; -use crate::prelude::AssetLockProof; use crate::state_transition::identity_create_transition::IdentityCreateTransition; use crate::state_transition::public_key_in_creation::IdentityPublicKeyInCreation; -use crate::NonConsensusError; + use platform_value::Identifier; pub use v0::*; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/v0_methods.rs index cec855002f..df2025506e 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/v0_methods.rs @@ -1,7 +1,4 @@ -use crate::{ - prelude::Identifier, state_transition::StateTransitionType, BlsModule, NonConsensusError, - ProtocolError, -}; +use crate::{prelude::Identifier, state_transition::StateTransitionType, BlsModule, ProtocolError}; use crate::identity::accessors::IdentityGettersV0; use crate::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/accessors/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/accessors/mod.rs index 2f9df88f1a..41e8bfd9c5 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/accessors/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/accessors/mod.rs @@ -2,7 +2,6 @@ mod v0; pub use v0::*; -use crate::prelude::AssetLockProof; use crate::state_transition::identity_topup_transition::IdentityTopUpTransition; use platform_value::Identifier; diff --git a/packages/rs-dpp/src/tests/fixtures/get_dpns_data_contract.rs b/packages/rs-dpp/src/tests/fixtures/get_dpns_data_contract.rs index 3ac0e29d57..46edce1660 100644 --- a/packages/rs-dpp/src/tests/fixtures/get_dpns_data_contract.rs +++ b/packages/rs-dpp/src/tests/fixtures/get_dpns_data_contract.rs @@ -1,6 +1,4 @@ use data_contracts::{DataContractSource, SystemDataContract}; -use platform_value::platform_value; -use serde_json::json; use crate::data_contract::created_data_contract::CreatedDataContract; use crate::data_contract::DataContractFactory; @@ -17,8 +15,7 @@ pub fn get_dpns_data_contract_fixture( let owner_id = owner_id.unwrap_or_else(generate_random_identifier_struct); let DataContractSource { - mut document_schemas, - .. + document_schemas, .. } = SystemDataContract::DPNS .source() .expect("should return DPNS data contract source"); diff --git a/packages/rs-dpp/src/tests/fixtures/instant_asset_lock_proof_fixture.rs b/packages/rs-dpp/src/tests/fixtures/instant_asset_lock_proof_fixture.rs index 6b39976460..f1c9385101 100644 --- a/packages/rs-dpp/src/tests/fixtures/instant_asset_lock_proof_fixture.rs +++ b/packages/rs-dpp/src/tests/fixtures/instant_asset_lock_proof_fixture.rs @@ -2,7 +2,7 @@ use std::str::FromStr; use dashcore::bls_sig_utils::BLSSignature; use dashcore::hash_types::CycleHash; -use dashcore::hashes::Hash; + use dashcore::secp256k1::rand::thread_rng; use dashcore::secp256k1::Secp256k1; use dashcore::transaction::special_transaction::asset_lock::AssetLockPayload; diff --git a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs index 160a63008e..04e75fbe59 100644 --- a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs @@ -7,13 +7,11 @@ use crate::platform_types::state_transition_execution_result::StateTransitionExe #[cfg(test)] use crate::platform_types::state_transition_execution_result::StateTransitionExecutionResult::ConsensusExecutionError; use crate::rpc::core::CoreRPCLike; -use dpp::block::block_info::BlockInfo; -use dpp::block::epoch::Epoch; -use dpp::block::extended_block_info::v0::ExtendedBlockInfoV0Getters; + use dpp::consensus::basic::decode::SerializedObjectParsingError; use dpp::consensus::basic::BasicError; use dpp::consensus::ConsensusError; -use dpp::fee::epoch::GENESIS_EPOCH_INDEX; + use dpp::fee::fee_result::FeeResult; use dpp::serialization::PlatformDeserializable; use dpp::state_transition::StateTransition; @@ -31,7 +29,7 @@ where pub(in crate::execution) fn execute_tx( &self, raw_tx: Vec, - block_info: &BlockInfo, + block_info: &dpp::block::block_info::BlockInfo, transaction: &Transaction, ) -> Result { let state_transition = @@ -326,7 +324,7 @@ mod tests { .expect_verify_instant_lock() .returning(|_, _| Ok(true)); - let mut platform_state = platform.state.read().unwrap(); + let platform_state = platform.state.read().unwrap(); let platform_version = platform_state.current_platform_version().unwrap(); let mut signer = SimpleSigner::default(); diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/chain/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/chain/mod.rs index bcca8030c2..d9a4f55383 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/chain/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/chain/mod.rs @@ -34,7 +34,7 @@ impl AssetLockProofStateValidation for ChainAssetLockProof { // Make sure that asset lock isn't spent yet - let outpoint_bytes = self.out_point.try_into().map_err(|e| { + let outpoint_bytes = self.out_point.try_into().map_err(|_e| { Error::Execution(ExecutionError::Conversion(String::from( "can't convert output to bytes", ))) diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/mod.rs index f5969bea52..9fb420ab46 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/mod.rs @@ -2,7 +2,6 @@ pub(crate) mod identity_retrieval; mod state; mod structure; -use dpp::state_transition::identity_create_transition::IdentityCreateTransition; use dpp::state_transition::identity_topup_transition::IdentityTopUpTransition; use dpp::validation::{ConsensusValidationResult, SimpleConsensusValidationResult}; use dpp::version::PlatformVersion; diff --git a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/mod.rs b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/mod.rs index 82d09027b1..ea66c5cf8c 100644 --- a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/mod.rs +++ b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/mod.rs @@ -1,14 +1,13 @@ -use crate::error::execution::ExecutionError; use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_data_contract_history_request::Version; -use dapi_grpc::platform::v0::{GetDataContractHistoryRequest, GetDataContractRequest}; +use dapi_grpc::platform::v0::GetDataContractHistoryRequest; use dpp::check_validation_result_with_data; use dpp::validation::ValidationResult; -use dpp::version::FeatureVersion; + use dpp::version::PlatformVersion; use prost::Message; diff --git a/packages/rs-drive-abci/src/query/document_query/mod.rs b/packages/rs-drive-abci/src/query/document_query/mod.rs index c2b6270324..46587f5022 100644 --- a/packages/rs-drive-abci/src/query/document_query/mod.rs +++ b/packages/rs-drive-abci/src/query/document_query/mod.rs @@ -1,4 +1,3 @@ -use crate::error::execution::ExecutionError; use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; @@ -8,7 +7,7 @@ use dapi_grpc::platform::v0::get_documents_request::Version; use dapi_grpc::platform::v0::GetDocumentsRequest; use dpp::check_validation_result_with_data; use dpp::validation::ValidationResult; -use dpp::version::FeatureVersion; + use dpp::version::PlatformVersion; use prost::Message; diff --git a/packages/rs-drive-abci/src/query/document_query/v0/mod.rs b/packages/rs-drive-abci/src/query/document_query/v0/mod.rs index 02c7747a24..e635c7d744 100644 --- a/packages/rs-drive-abci/src/query/document_query/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/document_query/v0/mod.rs @@ -7,9 +7,7 @@ use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_documents_request::get_documents_request_v0::Start; use dapi_grpc::platform::v0::get_documents_request::GetDocumentsRequestV0; use dapi_grpc::platform::v0::get_documents_response::GetDocumentsResponseV0; -use dapi_grpc::platform::v0::{ - get_documents_response, GetDocumentsRequest, GetDocumentsResponse, Proof, -}; +use dapi_grpc::platform::v0::{get_documents_response, GetDocumentsResponse, Proof}; use dpp::check_validation_result_with_data; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::identifier::Identifier; diff --git a/packages/rs-drive-abci/src/query/response_metadata/mod.rs b/packages/rs-drive-abci/src/query/response_metadata/mod.rs index 7fd1ef5a89..b84c1581ea 100644 --- a/packages/rs-drive-abci/src/query/response_metadata/mod.rs +++ b/packages/rs-drive-abci/src/query/response_metadata/mod.rs @@ -3,7 +3,7 @@ mod v0; use crate::error::execution::ExecutionError; use crate::error::Error; use crate::platform_types::platform::Platform; -use crate::platform_types::platform_state::v0::PlatformStateV0Methods; + use crate::platform_types::platform_state::PlatformState; use dapi_grpc::platform::v0::ResponseMetadata; use dpp::version::PlatformVersion; diff --git a/packages/rs-drive-abci/src/query/system/epoch_infos/v0/mod.rs b/packages/rs-drive-abci/src/query/system/epoch_infos/v0/mod.rs index 8fb355e59a..9bc9448df8 100644 --- a/packages/rs-drive-abci/src/query/system/epoch_infos/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/system/epoch_infos/v0/mod.rs @@ -7,12 +7,10 @@ use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_epochs_info_request::GetEpochsInfoRequestV0; use dapi_grpc::platform::v0::get_epochs_info_response::get_epochs_info_response_v0::EpochInfos; use dapi_grpc::platform::v0::get_epochs_info_response::GetEpochsInfoResponseV0; -use dapi_grpc::platform::v0::{ - get_epochs_info_response, GetEpochsInfoRequest, GetEpochsInfoResponse, Proof, -}; +use dapi_grpc::platform::v0::{get_epochs_info_response, GetEpochsInfoResponse, Proof}; use dpp::block::extended_epoch_info::v0::ExtendedEpochInfoV0Getters; use dpp::check_validation_result_with_data; -use dpp::serialization::PlatformSerializableWithPlatformVersion; + use dpp::validation::ValidationResult; use dpp::version::PlatformVersion; use prost::Message; diff --git a/packages/rs-drive-abci/src/query/system/version_upgrade_state/v0/mod.rs b/packages/rs-drive-abci/src/query/system/version_upgrade_state/v0/mod.rs index efba1e9fe7..c891b47906 100644 --- a/packages/rs-drive-abci/src/query/system/version_upgrade_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/system/version_upgrade_state/v0/mod.rs @@ -4,11 +4,10 @@ use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::{ - get_protocol_version_upgrade_state_response, GetProtocolVersionUpgradeStateRequest, - GetProtocolVersionUpgradeStateResponse, Proof, + get_protocol_version_upgrade_state_response, GetProtocolVersionUpgradeStateResponse, Proof, }; use dpp::check_validation_result_with_data; -use dpp::serialization::PlatformSerializableWithPlatformVersion; + use dpp::validation::ValidationResult; use dpp::version::PlatformVersion; use prost::Message; diff --git a/packages/rs-drive-abci/src/query/system/version_upgrade_vote_status/v0/mod.rs b/packages/rs-drive-abci/src/query/system/version_upgrade_vote_status/v0/mod.rs index 02eb9debfb..1948a1f718 100644 --- a/packages/rs-drive-abci/src/query/system/version_upgrade_vote_status/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/system/version_upgrade_vote_status/v0/mod.rs @@ -4,12 +4,11 @@ use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::{ - get_protocol_version_upgrade_vote_status_response, GetProtocolVersionUpgradeVoteStatusRequest, - GetProtocolVersionUpgradeVoteStatusResponse, Proof, + get_protocol_version_upgrade_vote_status_response, GetProtocolVersionUpgradeVoteStatusResponse, + Proof, }; use dpp::check_validation_result_with_data; -use dpp::platform_value::Bytes32; -use dpp::serialization::PlatformSerializableWithPlatformVersion; + use dpp::validation::ValidationResult; use dpp::version::PlatformVersion; use prost::Message; diff --git a/packages/rs-drive-abci/src/query/v0/mod.rs b/packages/rs-drive-abci/src/query/v0/mod.rs index c4588b4cde..91b4aa84b8 100644 --- a/packages/rs-drive-abci/src/query/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/v0/mod.rs @@ -3,7 +3,6 @@ use crate::error::Error; use crate::platform_types::platform::Platform; use crate::query::QueryValidationResult; -use dpp::serialization::{PlatformSerializable, PlatformSerializableWithPlatformVersion}; use dpp::version::PlatformVersion; diff --git a/packages/rs-drive-abci/tests/strategy_tests/query.rs b/packages/rs-drive-abci/tests/strategy_tests/query.rs index acc957200c..0c5797719c 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/query.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/query.rs @@ -326,17 +326,9 @@ impl QueryStrategy { #[cfg(test)] mod tests { use super::*; - use crate::execution::{continue_chain_for_strategy, run_chain_for_strategy}; - use crate::query::QueryStrategy; - use crate::strategy::{FailureStrategy, MasternodeListChangesStrategy, NetworkStrategy}; - use dashcore_rpc::dashcore::hashes::Hash; - use dashcore_rpc::dashcore::BlockHash; - use dashcore_rpc::dashcore_rpc_json::ExtendedQuorumDetails; - use dpp::block::extended_block_info::v0::ExtendedBlockInfoV0Getters; - use strategy_tests::operations::DocumentAction::DocumentActionReplace; - use strategy_tests::operations::{ - DocumentAction, DocumentOp, IdentityUpdateOp, Operation, OperationType, - }; + use crate::execution::run_chain_for_strategy; + + use crate::strategy::NetworkStrategy; use dapi_grpc::platform::v0::get_epochs_info_request::{GetEpochsInfoRequestV0, Version}; use dapi_grpc::platform::v0::{ @@ -344,24 +336,19 @@ mod tests { }; use dpp::block::epoch::EpochIndex; use dpp::block::extended_epoch_info::v0::ExtendedEpochInfoV0Getters; - use dpp::data_contract::accessors::v0::{DataContractV0Getters, DataContractV0Setters}; - use dpp::data_contract::document_type::random_document::{ - DocumentFieldFillSize, DocumentFieldFillType, - }; - use dpp::identity::accessors::IdentityGettersV0; + use dpp::data_contract::accessors::v0::DataContractV0Getters; + use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; - use dpp::serialization::PlatformDeserializable; - use dpp::tests::json_document::json_document_to_created_contract; - use dpp::util::hash::hash_to_hex_string; + use dpp::version::PlatformVersion; use drive_abci::config::{ExecutionConfig, PlatformConfig, PlatformTestConfig}; - use drive_abci::logging::LogLevel; + use drive_abci::platform_types::platform_state::v0::PlatformStateV0Methods; - use drive_abci::rpc::core::QuorumListExtendedInfo; + use drive_abci::test::helpers::setup::TestPlatformBuilder; - use itertools::Itertools; + use strategy_tests::Strategy; - use tenderdash_abci::proto::abci::{RequestInfo, ResponseInfo}; + use tenderdash_abci::proto::types::CoreChainLock; use tenderdash_abci::Application; diff --git a/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs b/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs index b7c70ae424..47d254b9b9 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs @@ -1,29 +1,27 @@ -use dapi_grpc::platform::v0::{ - get_proofs_request, GetProofsRequest, GetProofsResponse, -}; -use dpp::document::Document; -use dpp::identity::PartialIdentity; -use dpp::state_transition::StateTransition; -use drive::drive::Drive; -use drive::query::SingleDocumentDriveQuery; -use drive_abci::abci::AbciApplication; -use drive_abci::platform_types::platform::PlatformRef; -use drive_abci::rpc::core::MockCoreRPCLike; -use dapi_grpc::platform::VersionedGrpcResponse; use dapi_grpc::platform::v0::get_proofs_request::{get_proofs_request_v0, GetProofsRequestV0}; +use dapi_grpc::platform::v0::{get_proofs_request, GetProofsRequest, GetProofsResponse}; +use dapi_grpc::platform::VersionedGrpcResponse; use dpp::block::block_info::BlockInfo; use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; +use dpp::document::Document; +use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; +use dpp::identity::PartialIdentity; +use dpp::state_transition::StateTransition; use dpp::version::PlatformVersion; use drive::drive::identity::key::fetch::IdentityKeysRequest; +use drive::drive::Drive; +use drive::query::SingleDocumentDriveQuery; use drive::state_transition_action::document::documents_batch::document_transition::DocumentTransitionAction; use drive::state_transition_action::StateTransitionAction; +use drive_abci::abci::AbciApplication; use drive_abci::execution::validation::state_transition::transformer::StateTransitionActionTransformerV0; +use drive_abci::platform_types::platform::PlatformRef; use drive_abci::platform_types::platform_state::v0::PlatformStateV0Methods; +use drive_abci::rpc::core::MockCoreRPCLike; use prost::Message; use tenderdash_abci::proto::abci::ExecTxResult; -use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; -use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; -use dpp::prelude::ConsensusValidationResult; + use dpp::state_transition::documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; use drive::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::DocumentFromCreateTransition; @@ -34,7 +32,7 @@ pub(crate) fn verify_state_transitions_were_or_were_not_executed( expected_root_hash: &[u8; 32], state_transitions: &[(StateTransition, ExecTxResult)], block_info: &BlockInfo, - expected_validation_errors: &Vec, + expected_validation_errors: &[u32], platform_version: &PlatformVersion, ) -> bool { let state = abci_app.platform.state.read().unwrap(); @@ -85,7 +83,7 @@ pub(crate) fn verify_state_transitions_were_or_were_not_executed( }) .collect::>(); - for (state_transition, action, was_executed) in &actions { + for (_state_transition, action, was_executed) in &actions { let mut proofs_request = GetProofsRequestV0 { identities: vec![], contracts: vec![], diff --git a/packages/rs-drive-proof-verifier/src/proof.rs b/packages/rs-drive-proof-verifier/src/proof.rs index d2efd1f357..005b678796 100644 --- a/packages/rs-drive-proof-verifier/src/proof.rs +++ b/packages/rs-drive-proof-verifier/src/proof.rs @@ -119,7 +119,7 @@ impl FromProof for Identity { fn maybe_from_proof<'a, I: Into, O: Into>( request: I, response: O, - platform_version: &PlatformVersion, + _platform_version: &PlatformVersion, provider: &'a dyn QuorumInfoProvider, ) -> Result, Error> where @@ -166,7 +166,7 @@ impl FromProof for Identity { fn maybe_from_proof<'a, I: Into, O: Into>( request: I, response: O, - platform_version: &PlatformVersion, + _platform_version: &PlatformVersion, provider: &'a dyn QuorumInfoProvider, ) -> Result, Error> @@ -215,7 +215,7 @@ impl FromProof for IdentityPublicKeys { fn maybe_from_proof<'a, I: Into, O: Into>( request: I, response: O, - platform_version: &PlatformVersion, + _platform_version: &PlatformVersion, provider: &'a dyn QuorumInfoProvider, ) -> Result, Error> @@ -380,7 +380,7 @@ impl FromProof for IdentityBalance { fn maybe_from_proof<'a, I: Into, O: Into>( request: I, response: O, - platform_version: &PlatformVersion, + _platform_version: &PlatformVersion, provider: &'a dyn QuorumInfoProvider, ) -> Result, Error> @@ -473,7 +473,7 @@ impl FromProof for DataContract { fn maybe_from_proof<'a, I: Into, O: Into>( request: I, response: O, - platform_version: &PlatformVersion, + _platform_version: &PlatformVersion, provider: &'a dyn QuorumInfoProvider, ) -> Result, Error> @@ -522,7 +522,7 @@ impl FromProof for DataContracts { fn maybe_from_proof<'a, I: Into, O: Into>( request: I, response: O, - platform_version: &PlatformVersion, + _platform_version: &PlatformVersion, provider: &'a dyn QuorumInfoProvider, ) -> Result, Error> @@ -595,7 +595,7 @@ impl FromProof for DataContractHistory fn maybe_from_proof<'a, I: Into, O: Into>( request: I, response: O, - platform_version: &PlatformVersion, + _platform_version: &PlatformVersion, provider: &'a dyn QuorumInfoProvider, ) -> Result, Error> @@ -861,7 +861,7 @@ where fn maybe_from_proof<'a, I: Into, O: Into>( request: I, response: O, - platform_version: &PlatformVersion, + _platform_version: &PlatformVersion, provider: &'a dyn QuorumInfoProvider, ) -> Result, Error> diff --git a/packages/rs-drive/src/drive/batch/drive_op_batch/mod.rs b/packages/rs-drive/src/drive/batch/drive_op_batch/mod.rs index 87331d6772..ba0769328b 100644 --- a/packages/rs-drive/src/drive/batch/drive_op_batch/mod.rs +++ b/packages/rs-drive/src/drive/batch/drive_op_batch/mod.rs @@ -190,7 +190,6 @@ mod tests { use dpp::util::cbor_serializer; use rand::Rng; use serde_json::json; - use tempfile::TempDir; use crate::common::setup_contract; @@ -204,13 +203,13 @@ mod tests { use crate::drive::batch::DataContractOperationType::ApplyContract; use crate::drive::batch::DocumentOperationType::AddDocumentForContract; use crate::drive::batch::DriveOperation::{DataContractOperation, DocumentOperation}; - use crate::drive::config::DriveConfig; + use crate::drive::contract::paths::contract_root_path; use crate::drive::flags::StorageFlags; use crate::drive::object_size_info::DocumentInfo::DocumentRefInfo; use crate::drive::object_size_info::{DocumentAndContractInfo, OwnedDocumentInfo}; use crate::drive::Drive; - use crate::tests::helpers::setup::{setup_drive, setup_drive_with_initial_state_structure}; + use crate::tests::helpers::setup::setup_drive_with_initial_state_structure; #[test] fn test_add_dashpay_documents() { diff --git a/packages/rs-drive/src/drive/credit_pools/epochs/get_epochs_infos/mod.rs b/packages/rs-drive/src/drive/credit_pools/epochs/get_epochs_infos/mod.rs index c861f139f3..fcd6e1ff0e 100644 --- a/packages/rs-drive/src/drive/credit_pools/epochs/get_epochs_infos/mod.rs +++ b/packages/rs-drive/src/drive/credit_pools/epochs/get_epochs_infos/mod.rs @@ -3,7 +3,7 @@ mod v0; use crate::drive::Drive; use crate::error::drive::DriveError; use crate::error::Error; -use dpp::block::epoch::Epoch; + use dpp::block::extended_epoch_info::ExtendedEpochInfo; use grovedb::TransactionArg; diff --git a/packages/rs-drive/src/drive/credit_pools/epochs/get_epochs_infos/v0/mod.rs b/packages/rs-drive/src/drive/credit_pools/epochs/get_epochs_infos/v0/mod.rs index e72e63bcee..3619900d40 100644 --- a/packages/rs-drive/src/drive/credit_pools/epochs/get_epochs_infos/v0/mod.rs +++ b/packages/rs-drive/src/drive/credit_pools/epochs/get_epochs_infos/v0/mod.rs @@ -1,7 +1,7 @@ use crate::drive::Drive; use crate::error::drive::DriveError; use crate::error::Error; -use dpp::block::epoch::{Epoch, EpochIndex, EPOCH_KEY_OFFSET}; +use dpp::block::epoch::{EpochIndex, EPOCH_KEY_OFFSET}; use dpp::block::extended_epoch_info::v0::ExtendedEpochInfoV0; use dpp::block::extended_epoch_info::ExtendedEpochInfo; use dpp::ProtocolError; @@ -75,9 +75,7 @@ impl Drive { if let QueryResultElement::PathKeyElementTrioResultItem((path, key, element)) = result_item { - acc.entry(path) - .or_insert_with(BTreeMap::new) - .insert(key, element); + acc.entry(path).or_default().insert(key, element); } acc }, diff --git a/packages/rs-drive/src/drive/credit_pools/epochs/proposers/get_epoch_proposers/v0/mod.rs b/packages/rs-drive/src/drive/credit_pools/epochs/proposers/get_epoch_proposers/v0/mod.rs index 2a84a51af9..4646c4630c 100644 --- a/packages/rs-drive/src/drive/credit_pools/epochs/proposers/get_epoch_proposers/v0/mod.rs +++ b/packages/rs-drive/src/drive/credit_pools/epochs/proposers/get_epoch_proposers/v0/mod.rs @@ -48,7 +48,7 @@ impl Drive { let block_count = u64::from_be_bytes( encoded_block_count.as_slice().try_into().map_err(|_| { Error::Drive(DriveError::CorruptedSerialization(String::from( - String::from("epochs proposer block count must be u64"), + "epochs proposer block count must be u64", ))) })?, ); diff --git a/packages/rs-drive/src/drive/credit_pools/epochs/prove_epochs_infos/mod.rs b/packages/rs-drive/src/drive/credit_pools/epochs/prove_epochs_infos/mod.rs index 53bb73f027..eee830a192 100644 --- a/packages/rs-drive/src/drive/credit_pools/epochs/prove_epochs_infos/mod.rs +++ b/packages/rs-drive/src/drive/credit_pools/epochs/prove_epochs_infos/mod.rs @@ -3,7 +3,7 @@ mod v0; use crate::drive::Drive; use crate::error::drive::DriveError; use crate::error::Error; -use dpp::block::epoch::Epoch; + use grovedb::TransactionArg; use dpp::version::PlatformVersion; diff --git a/packages/rs-drive/src/drive/credit_pools/epochs/prove_epochs_infos/v0/mod.rs b/packages/rs-drive/src/drive/credit_pools/epochs/prove_epochs_infos/v0/mod.rs index ccc50354cb..8115361dd2 100644 --- a/packages/rs-drive/src/drive/credit_pools/epochs/prove_epochs_infos/v0/mod.rs +++ b/packages/rs-drive/src/drive/credit_pools/epochs/prove_epochs_infos/v0/mod.rs @@ -1,12 +1,11 @@ use crate::drive::Drive; -use crate::error::drive::DriveError; + use crate::error::Error; -use dpp::block::epoch::{Epoch, EpochIndex, EPOCH_KEY_OFFSET}; -use dpp::block::extended_epoch_info::v0::ExtendedEpochInfoV0; +use dpp::block::epoch::EPOCH_KEY_OFFSET; + use dpp::ProtocolError; -use grovedb::query_result_type::QueryResultElement; -use grovedb::{Element, PathQuery, Query, SizedQuery, TransactionArg}; -use std::collections::BTreeMap; + +use grovedb::{PathQuery, Query, SizedQuery, TransactionArg}; use crate::drive::credit_pools::pools_vec_path; use crate::error::query::QuerySyntaxError; diff --git a/packages/rs-drive/src/drive/document/mod.rs b/packages/rs-drive/src/drive/document/mod.rs index c177970be2..58b28cd5bb 100644 --- a/packages/rs-drive/src/drive/document/mod.rs +++ b/packages/rs-drive/src/drive/document/mod.rs @@ -235,8 +235,6 @@ fn unique_event_id() -> [u8; 32] { pub(crate) mod tests { use std::option::Option::None; - use tempfile::TempDir; - use crate::drive::flags::StorageFlags; use crate::drive::Drive; use dpp::block::block_info::BlockInfo; diff --git a/packages/rs-drive/src/drive/document/update/mod.rs b/packages/rs-drive/src/drive/document/update/mod.rs index c785fcb8d0..d0eacee6ce 100644 --- a/packages/rs-drive/src/drive/document/update/mod.rs +++ b/packages/rs-drive/src/drive/document/update/mod.rs @@ -77,7 +77,6 @@ mod tests { use rand::{random, Rng}; use serde::{Deserialize, Serialize}; use serde_json::json; - use tempfile::TempDir; use crate::drive::config::DriveConfig; use crate::drive::flags::StorageFlags; diff --git a/packages/rs-drive/src/drive/identity/insert/add_new_identity/v0/mod.rs b/packages/rs-drive/src/drive/identity/insert/add_new_identity/v0/mod.rs index bb52ab42db..e2455dae82 100644 --- a/packages/rs-drive/src/drive/identity/insert/add_new_identity/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/insert/add_new_identity/v0/mod.rs @@ -274,9 +274,6 @@ mod tests { use dpp::identity::accessors::IdentityGettersV0; use dpp::version::PlatformVersion; - use tempfile::TempDir; - - use crate::drive::Drive; #[test] fn test_insert_and_fetch_identity_v0() { diff --git a/packages/rs-drive/src/drive/initialization/v0/mod.rs b/packages/rs-drive/src/drive/initialization/v0/mod.rs index 4a65004888..b15fd0a345 100644 --- a/packages/rs-drive/src/drive/initialization/v0/mod.rs +++ b/packages/rs-drive/src/drive/initialization/v0/mod.rs @@ -194,13 +194,12 @@ impl Drive { #[cfg(feature = "full")] #[cfg(test)] mod tests { - use crate::drive::{Drive, RootTree}; + use crate::drive::RootTree; use crate::tests::helpers::setup::setup_drive_with_initial_state_structure; use dpp::version::PlatformVersion; use grovedb::query_result_type::QueryResultType::QueryElementResultType; use grovedb::{PathQuery, Query, SizedQuery}; - use tempfile::TempDir; #[test] fn test_create_initial_state_structure() { @@ -235,7 +234,7 @@ mod tests { fn test_initial_state_structure_proper_heights() { let drive = setup_drive_with_initial_state_structure(); - let db_transaction = drive.grove.start_transaction(); + let _db_transaction = drive.grove.start_transaction(); let platform_version = PlatformVersion::latest(); let drive_version = &platform_version.drive; diff --git a/packages/rs-drive/src/drive/protocol_upgrade/fetch_proved_validator_version_votes/v0/mod.rs b/packages/rs-drive/src/drive/protocol_upgrade/fetch_proved_validator_version_votes/v0/mod.rs index 3c172c109b..ab4b2f7186 100644 --- a/packages/rs-drive/src/drive/protocol_upgrade/fetch_proved_validator_version_votes/v0/mod.rs +++ b/packages/rs-drive/src/drive/protocol_upgrade/fetch_proved_validator_version_votes/v0/mod.rs @@ -1,7 +1,4 @@ -use crate::drive::protocol_upgrade::{ - desired_version_for_validators_path, desired_version_for_validators_path_vec, - versions_counter_path_vec, -}; +use crate::drive::protocol_upgrade::desired_version_for_validators_path_vec; use crate::drive::Drive; use crate::error::Error; use std::ops::RangeFull; diff --git a/packages/rs-drive/src/drive/protocol_upgrade/fetch_proved_versions_with_counter/mod.rs b/packages/rs-drive/src/drive/protocol_upgrade/fetch_proved_versions_with_counter/mod.rs index b3721f06c6..0ad1ab1260 100644 --- a/packages/rs-drive/src/drive/protocol_upgrade/fetch_proved_versions_with_counter/mod.rs +++ b/packages/rs-drive/src/drive/protocol_upgrade/fetch_proved_versions_with_counter/mod.rs @@ -4,13 +4,10 @@ use crate::drive::Drive; use crate::error::drive::DriveError; use crate::error::Error; -use dpp::util::deserializer::ProtocolVersion; use dpp::version::drive_versions::DriveVersion; use grovedb::TransactionArg; -use nohash_hasher::IntMap; - impl Drive { /// Fetch versions by count for the upgrade window /// diff --git a/packages/rs-drive/src/drive/protocol_upgrade/fetch_validator_version_votes/v0/mod.rs b/packages/rs-drive/src/drive/protocol_upgrade/fetch_validator_version_votes/v0/mod.rs index 2c80fe161b..b3de731328 100644 --- a/packages/rs-drive/src/drive/protocol_upgrade/fetch_validator_version_votes/v0/mod.rs +++ b/packages/rs-drive/src/drive/protocol_upgrade/fetch_validator_version_votes/v0/mod.rs @@ -1,7 +1,4 @@ -use crate::drive::protocol_upgrade::{ - desired_version_for_validators_path, desired_version_for_validators_path_vec, - versions_counter_path_vec, -}; +use crate::drive::protocol_upgrade::desired_version_for_validators_path_vec; use crate::drive::Drive; use crate::error::Error; use std::collections::BTreeMap; diff --git a/packages/rs-drive/src/drive/verify/contract/verify_contract/v0/mod.rs b/packages/rs-drive/src/drive/verify/contract/verify_contract/v0/mod.rs index 8fa2eb02d9..44b310e38b 100644 --- a/packages/rs-drive/src/drive/verify/contract/verify_contract/v0/mod.rs +++ b/packages/rs-drive/src/drive/verify/contract/verify_contract/v0/mod.rs @@ -78,7 +78,7 @@ impl Drive { }; } }; - if proved_key_values.len() == 0 { + if proved_key_values.is_empty() { return Err(Error::Proof(ProofError::WrongElementCount { expected: 1, got: proved_key_values.len(), diff --git a/packages/rs-drive/src/drive/verify/system/verify_epoch_infos/v0/mod.rs b/packages/rs-drive/src/drive/verify/system/verify_epoch_infos/v0/mod.rs index 63e02c0cdc..cea7d679d2 100644 --- a/packages/rs-drive/src/drive/verify/system/verify_epoch_infos/v0/mod.rs +++ b/packages/rs-drive/src/drive/verify/system/verify_epoch_infos/v0/mod.rs @@ -85,9 +85,7 @@ impl Drive { |mut acc, result_item| { let (path, key, element) = result_item; if path.len() == 2 { - acc.entry(path) - .or_insert_with(BTreeMap::new) - .insert(key, element); + acc.entry(path).or_default().insert(key, element); } acc }, diff --git a/packages/rs-drive/src/drive/verify/system/verify_upgrade_state/mod.rs b/packages/rs-drive/src/drive/verify/system/verify_upgrade_state/mod.rs index 7c0838ef5c..75dc15924b 100644 --- a/packages/rs-drive/src/drive/verify/system/verify_upgrade_state/mod.rs +++ b/packages/rs-drive/src/drive/verify/system/verify_upgrade_state/mod.rs @@ -2,8 +2,7 @@ use crate::drive::verify::RootHash; use crate::drive::Drive; use crate::error::drive::DriveError; use crate::error::Error; -use dpp::block::epoch::EpochIndex; -use dpp::block::extended_epoch_info::ExtendedEpochInfo; + use dpp::util::deserializer::ProtocolVersion; use dpp::version::PlatformVersion; use nohash_hasher::IntMap; diff --git a/packages/rs-drive/src/drive/verify/system/verify_upgrade_vote_status/v0/mod.rs b/packages/rs-drive/src/drive/verify/system/verify_upgrade_vote_status/v0/mod.rs index 69aec6844f..57172d286c 100644 --- a/packages/rs-drive/src/drive/verify/system/verify_upgrade_vote_status/v0/mod.rs +++ b/packages/rs-drive/src/drive/verify/system/verify_upgrade_vote_status/v0/mod.rs @@ -1,6 +1,4 @@ -use crate::drive::protocol_upgrade::{ - desired_version_for_validators_path_vec, versions_counter_path_vec, -}; +use crate::drive::protocol_upgrade::desired_version_for_validators_path_vec; use crate::drive::verify::RootHash; use crate::drive::Drive; use crate::error::proof::ProofError; diff --git a/packages/rs-drive/src/query/mod.rs b/packages/rs-drive/src/query/mod.rs index decb50aad8..0023c0681f 100644 --- a/packages/rs-drive/src/query/mod.rs +++ b/packages/rs-drive/src/query/mod.rs @@ -1945,10 +1945,9 @@ impl<'a> From<&DriveQuery<'a>> for BTreeMap { #[cfg(feature = "full")] #[cfg(test)] mod tests { - use dpp::data_contract::data_contract::DataContractV0; + use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; - use dpp::data_contract::document_type::v0::DocumentTypeV0; - use dpp::data_contract::document_type::DocumentType; + use dpp::prelude::Identifier; use serde_json::json; use std::borrow::Cow; @@ -2070,7 +2069,7 @@ mod tests { assert_eq!(query, deserialized); assert_eq!(deserialized.start_at, Some(start_after.to_buffer())); - assert_eq!(deserialized.start_at_included, false); + assert!(!deserialized.start_at_included); assert_eq!(deserialized.block_time_ms, Some(13453432u64)); } diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_topup/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/identity/identity_topup/v0/transformer.rs index 6a69294fcf..d14579d294 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_topup/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_topup/v0/transformer.rs @@ -1,7 +1,7 @@ use crate::state_transition_action::identity::identity_topup::v0::IdentityTopUpTransitionActionV0; use dpp::consensus::basic::decode::SerializedObjectParsingError; use dpp::consensus::basic::identity::IdentityAssetLockTransactionOutputNotFoundError; -use dpp::consensus::basic::BasicError; + use dpp::consensus::ConsensusError; use dpp::fee::Credits; use dpp::platform_value::Bytes36; diff --git a/packages/rs-drive/tests/deterministic_root_hash.rs b/packages/rs-drive/tests/deterministic_root_hash.rs index 8dd8952774..b0856635f7 100644 --- a/packages/rs-drive/tests/deterministic_root_hash.rs +++ b/packages/rs-drive/tests/deterministic_root_hash.rs @@ -51,11 +51,7 @@ use rand::seq::SliceRandom; use rand::{Rng, SeedableRng}; #[cfg(feature = "full")] use serde::{Deserialize, Serialize}; -#[cfg(feature = "full")] -use tempfile::TempDir; -#[cfg(feature = "full")] -use drive::drive::config::DriveConfig; #[cfg(feature = "full")] use drive::drive::flags::StorageFlags; diff --git a/packages/rs-platform-value/src/value_map.rs b/packages/rs-platform-value/src/value_map.rs index 39be2e6083..fa4d383dab 100644 --- a/packages/rs-platform-value/src/value_map.rs +++ b/packages/rs-platform-value/src/value_map.rs @@ -345,9 +345,9 @@ impl Value { /// The index map is in the order sorted by the sort key /// The type T is the type of the value of the sort key /// Returns `Err(Error::Structure("reason"))` otherwise. - pub fn map_ref_into_indexed_string_map<'a, 'b, T>( + pub fn map_ref_into_indexed_string_map<'a, T>( map: &'a ValueMap, - sort_key: &'b str, + sort_key: &str, ) -> Result, Error> where T: TryFrom diff --git a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/document_transition/document_create_transition.rs b/packages/wasm-dpp/src/document/state_transition/document_batch_transition/document_transition/document_create_transition.rs index 69493bd8d2..8cf7b5d0b9 100644 --- a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/document_transition/document_create_transition.rs +++ b/packages/wasm-dpp/src/document/state_transition/document_batch_transition/document_transition/document_create_transition.rs @@ -1,43 +1,10 @@ -use std::convert; -use std::convert::TryInto; - -use serde_json::Value as JsonValue; - -use dpp::data_contract::accessors::v0::DataContractV0Getters; -use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; -use dpp::platform_value::btreemap_extensions::{ - BTreeValueMapHelper, BTreeValueMapPathHelper, BTreeValueMapReplacementPathHelper, -}; -use dpp::platform_value::converter::serde_json::BTreeValueJsonConverter; -use dpp::platform_value::ReplacementType; use dpp::prelude::Revision; -use dpp::state_transition::documents_batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; -use dpp::state_transition::documents_batch_transition::document_base_transition::v0::DocumentTransitionObjectLike; -use dpp::state_transition::documents_batch_transition::document_create_transition::v0::v0_methods::DocumentCreateTransitionV0Methods; + use dpp::state_transition::documents_batch_transition::document_create_transition::DocumentCreateTransition; -use dpp::state_transition::documents_batch_transition::document_transition::action_type::DocumentTransitionActionType; -use dpp::{ - document::INITIAL_REVISION, - prelude::{DataContract, Identifier}, - state_transition::documents_batch_transition::{ - document_create_transition, DocumentsBatchTransition, - }, - util::json_schema::JsonSchemaExt, - ProtocolError, -}; -use serde::Serialize; -use wasm_bindgen::prelude::*; -use crate::{ - buffer::Buffer, - document::document_batch_transition::document_transition::to_object, - identifier::IdentifierWrapper, - lodash::lodash_set, - utils::{ToSerdeJSONExt, WithJsError}, -}; +use dpp::document::INITIAL_REVISION; -use crate::data_contract::DataContractWasm; -use crate::document::BinaryType; +use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=DocumentCreateTransition)] #[derive(Debug, Clone)] diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs index 70ad57c21c..15fa4003aa 100644 --- a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs @@ -138,10 +138,7 @@ impl ChainAssetLockProofWasm { #[wasm_bindgen(js_name=createIdentifier)] pub fn create_identifier(&self) -> Result { - let identifier = self - .0 - .create_identifier() - .map_err(|e| from_dpp_err(e.into()))?; + let identifier = self.0.create_identifier().map_err(from_dpp_err)?; Ok(identifier.into()) } } diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs index 9c580235ad..244bc89e2f 100644 --- a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs @@ -10,12 +10,7 @@ use std::convert::TryInto; use wasm_bindgen::prelude::*; use crate::utils::WithJsError; -use crate::{ - buffer::Buffer, - errors::{from_dpp_err, RustConversionError}, - identifier::IdentifierWrapper, - with_js_error, -}; +use crate::{buffer::Buffer, errors::from_dpp_err, identifier::IdentifierWrapper, with_js_error}; use dpp::identity::state_transition::asset_lock_proof::instant::{ InstantAssetLockProof, RawInstantLockProof, }; @@ -102,10 +97,7 @@ impl InstantAssetLockProofWasm { #[wasm_bindgen(js_name=createIdentifier)] pub fn create_identifier(&self) -> Result { - let identifier = self - .0 - .create_identifier() - .map_err(|e| from_dpp_err(e.into()))?; + let identifier = self.0.create_identifier().map_err(from_dpp_err)?; Ok(identifier.into()) } diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs index 81e0cb84ed..629c42f456 100644 --- a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs @@ -7,8 +7,6 @@ use std::convert::TryInto; use wasm_bindgen::JsCast; use wasm_bindgen::__rt::Ref; -use crate::errors::RustConversionError; - use dpp::identity::errors::UnknownAssetLockProofTypeError; use wasm_bindgen::prelude::*; diff --git a/packages/wasm-dpp/src/validation/validation_result.rs b/packages/wasm-dpp/src/validation/validation_result.rs index 78743cf967..bc2f7b13d9 100644 --- a/packages/wasm-dpp/src/validation/validation_result.rs +++ b/packages/wasm-dpp/src/validation/validation_result.rs @@ -1,11 +1,10 @@ use crate::{ - buffer::Buffer, - errors::consensus::consensus_error::from_consensus_error_ref, - utils::{consensus_errors_from_buffers, WithJsError}, + buffer::Buffer, errors::consensus::consensus_error::from_consensus_error_ref, + utils::consensus_errors_from_buffers, }; -use dpp::serialization::PlatformDeserializable; + use dpp::{consensus::ConsensusError, validation::ConsensusValidationResult}; -use js_sys::{JsString, Uint8Array}; +use js_sys::JsString; use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=ValidationResult)] From 13243e988fca8482f05e793b80d2d21b9f726e09 Mon Sep 17 00:00:00 2001 From: lklimek <842586+lklimek@users.noreply.github.com> Date: Tue, 28 Nov 2023 17:24:45 +0100 Subject: [PATCH 003/191] feat(sdk): rs-sdk fetch current epoch (#1604) --- packages/rs-sdk/src/error.rs | 3 + packages/rs-sdk/src/platform/fetch_many.rs | 6 +- packages/rs-sdk/src/platform/query.rs | 9 ++- packages/rs-sdk/src/platform/types.rs | 1 + packages/rs-sdk/src/platform/types/epoch.rs | 73 +++++++++++++++++++ packages/rs-sdk/tests/fetch/epoch.rs | 30 +++++++- ...1f53264482cc34d82cf95e06bfa0b608c1dbd.json | 1 + ...1f53264482cc34d82cf95e06bfa0b608c1dbd.json | 1 + ...1f53264482cc34d82cf95e06bfa0b608c1dbd.json | 1 + ...1f53264482cc34d82cf95e06bfa0b608c1dbd.json | 1 + ...1f53264482cc34d82cf95e06bfa0b608c1dbd.json | 1 + ...d0c59d00e38c1dddc2b0830c07efc7fdcf609.json | 1 + ...3f083c2ceb802bbe764135021b32a1c684183.json | 1 + ...d7dd78bd88ffe63099d2128e0fb388aae50ab.json | 1 + ...2da649dce3dcbd207484424288382ece054f2.json | 1 + ...19e7631c1fc51bcbda1a4b854be8c566acb17.json | 1 + ...8201d413457dc90b5ecd24f4289973f36769d.json | 1 + 17 files changed, 124 insertions(+), 9 deletions(-) create mode 100644 packages/rs-sdk/src/platform/types/epoch.rs create mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:15.778699353Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:15.796630936Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:15.800193897Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:15.800233442Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:15.800635171Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:16.134231820Z_GetEpochsInfoRequest_73b10756ba7ed485a1871d443f8d0c59d00e38c1dddc2b0830c07efc7fdcf609.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:16.142398899Z_GetEpochsInfoRequest_d4fe9a388a1862a7db319738fb63f083c2ceb802bbe764135021b32a1c684183.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:16.536016360Z_GetEpochsInfoRequest_0df25d4dcb12ff24d9128fdcc91d7dd78bd88ffe63099d2128e0fb388aae50ab.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:16.879310928Z_GetEpochsInfoRequest_61b3e0349172ec26465ec79f45b2da649dce3dcbd207484424288382ece054f2.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:16.921837334Z_GetEpochsInfoRequest_93f0d7a77c909a6170f653a4b4b19e7631c1fc51bcbda1a4b854be8c566acb17.json create mode 100644 packages/rs-sdk/tests/vectors/quorum_pubkey-106-7b90b0a3c4f2577b80875327ef78201d413457dc90b5ecd24f4289973f36769d.json diff --git a/packages/rs-sdk/src/error.rs b/packages/rs-sdk/src/error.rs index 76ce45b22f..a1cd6096c9 100644 --- a/packages/rs-sdk/src/error.rs +++ b/packages/rs-sdk/src/error.rs @@ -28,6 +28,9 @@ pub enum Error { /// Dependency not found, for example data contract for a document not found #[error("Required {0} not found: {1}")] MissingDependency(String, String), + /// Epoch not found; we must have at least one epoch + #[error("No epoch found on the Platform; it should never happen")] + EpochNotFound, } impl From> for Error { diff --git a/packages/rs-sdk/src/platform/fetch_many.rs b/packages/rs-sdk/src/platform/fetch_many.rs index b39e2012f7..b6757c612d 100644 --- a/packages/rs-sdk/src/platform/fetch_many.rs +++ b/packages/rs-sdk/src/platform/fetch_many.rs @@ -252,11 +252,11 @@ impl FetchMany for IdentityPublicKey { /// /// ## Supported query types /// +/// * [EpochQuery](super::types::epoch::EpochQuery) - query that specifies epoch matching criteria /// * [EpochIndex](dpp::block::epoch::EpochIndex) - epoch index of first object to find; will return up to /// [DEFAULT_EPOCH_QUERY_LIMIT](super::query::DEFAULT_EPOCH_QUERY_LIMIT) objects starting from this index -/// * [`LimitQuery`](super::LimitQuery) - limit query that allows to specify maximum number of objects -/// to fetch; see also [FetchMany::fetch_many_with_limit()]. -/// +/// * [`LimitQuery`](super::LimitQuery), [`LimitQuery`](super::LimitQuery) - limit query +/// that allows to specify maximum number of objects to fetch; see also [FetchMany::fetch_many_with_limit()]. impl FetchMany for ExtendedEpochInfo { type Request = GetEpochsInfoRequest; } diff --git a/packages/rs-sdk/src/platform/query.rs b/packages/rs-sdk/src/platform/query.rs index 0b53e4990e..4ce637af53 100644 --- a/packages/rs-sdk/src/platform/query.rs +++ b/packages/rs-sdk/src/platform/query.rs @@ -15,6 +15,8 @@ use rs_dapi_client::transport::TransportRequest; use crate::{error::Error, platform::document_query::DocumentQuery}; +use super::types::epoch::EpochQuery; + /// Default limit of epoch records returned by the platform. pub const DEFAULT_EPOCH_QUERY_LIMIT: u32 = 100; /// Default limit of epoch records returned by the platform. @@ -178,18 +180,19 @@ impl From for LimitQuery { } } -impl Query for LimitQuery { +impl + Clone + Debug + Send> Query for LimitQuery { fn query(self, prove: bool) -> Result { if !prove { unimplemented!("queries without proofs are not supported yet"); } + let inner: EpochQuery = self.query.into(); Ok(GetEpochsInfoRequest { version: Some(proto::get_epochs_info_request::Version::V0( proto::get_epochs_info_request::GetEpochsInfoRequestV0 { prove, - start_epoch: Some(self.query.into()), + start_epoch: inner.start.map(|v| v as u32), count: self.limit.unwrap_or(DEFAULT_EPOCH_QUERY_LIMIT), - ascending: true, + ascending: inner.ascending, }, )), }) diff --git a/packages/rs-sdk/src/platform/types.rs b/packages/rs-sdk/src/platform/types.rs index 4b4aa76427..dc4f4abbf4 100644 --- a/packages/rs-sdk/src/platform/types.rs +++ b/packages/rs-sdk/src/platform/types.rs @@ -1,3 +1,4 @@ //! Type-specific implementation for various dpp object types to make queries more convenient and intuitive. +pub mod epoch; pub mod identity; pub mod version_votes; diff --git a/packages/rs-sdk/src/platform/types/epoch.rs b/packages/rs-sdk/src/platform/types/epoch.rs new file mode 100644 index 0000000000..c503143fba --- /dev/null +++ b/packages/rs-sdk/src/platform/types/epoch.rs @@ -0,0 +1,73 @@ +//! Epoch-related types and helpers +use async_trait::async_trait; +use dapi_grpc::platform::v0::GetEpochsInfoRequest; +use dpp::block::{epoch::EpochIndex, extended_epoch_info::ExtendedEpochInfo}; + +use crate::{ + platform::{Fetch, LimitQuery, Query}, + Error, Sdk, +}; + +#[async_trait] + +/// Helper trait for managing Epoch information +pub trait ExtendedEpochInfoEx: Sized { + /// Fetch current (the latest) epoch from the platform. + async fn fetch_current(sdk: &mut Sdk) -> Result; +} + +#[async_trait] +impl ExtendedEpochInfoEx for ExtendedEpochInfo { + async fn fetch_current(sdk: &mut Sdk) -> Result { + let query = LimitQuery { + query: EpochQuery { + start: None, + ascending: false, + }, + limit: Some(1), + }; + + let epoch = Self::fetch(sdk, query).await?; + + epoch.ok_or(Error::EpochNotFound) + } +} +/// Query used to fetch multiple epochs from the platform. +#[derive(Clone, Debug)] +pub struct EpochQuery { + /// Starting number of epoch to fetch. + /// + /// It is first returned epoch in the set. + /// + /// Value of `None` has the following meaning: + /// + /// * if ascending is true, then it is the first epoch on the Platform (eg. epoch 0). + /// * if ascending is false, then it is the last epoch on the Platform (eg. most recent epoch). + pub start: Option, + /// Sort order. Default is ascending (true), which means that the first returned epoch is the oldest one. + pub ascending: bool, +} + +impl Default for EpochQuery { + fn default() -> Self { + Self { + start: None, + ascending: true, + } + } +} + +impl From for EpochQuery { + fn from(start: EpochIndex) -> Self { + Self { + start: Some(start), + ascending: true, + } + } +} + +impl Query for EpochQuery { + fn query(self, prove: bool) -> Result { + LimitQuery::from(self).query(prove) + } +} diff --git a/packages/rs-sdk/tests/fetch/epoch.rs b/packages/rs-sdk/tests/fetch/epoch.rs index 6bd9eaf431..17a1f0f7d7 100644 --- a/packages/rs-sdk/tests/fetch/epoch.rs +++ b/packages/rs-sdk/tests/fetch/epoch.rs @@ -10,7 +10,9 @@ use dpp::block::extended_epoch_info::v0::ExtendedEpochInfoV0Getters; use dpp::block::extended_epoch_info::ExtendedEpochInfo; use rs_dapi_client::{Dapi, RequestSettings}; use rs_sdk::{ - platform::{Fetch, FetchMany, LimitQuery, DEFAULT_EPOCH_QUERY_LIMIT}, + platform::{ + types::epoch::ExtendedEpochInfoEx, Fetch, FetchMany, LimitQuery, DEFAULT_EPOCH_QUERY_LIMIT, + }, Sdk, }; @@ -81,7 +83,8 @@ async fn test_epoch_list() { let mut sdk = cfg.setup_api().await; // Given some starting epoch and current epoch - let starting_epoch: EpochIndex = 0; + // Note the devnet does not necessarily start with epoch 0 + let starting_epoch: EpochIndex = 3; let current_epoch = get_current_epoch(&mut sdk, &cfg).await; // When we fetch epochs from the server, starting with `starting_epoch` @@ -107,7 +110,8 @@ async fn test_epoch_list_limit() { let mut sdk = cfg.setup_api().await; // Given some starting epoch and current epoch - let starting_epoch: EpochIndex = 1; + // Note the devnet does not necessarily start with epoch 0 + let starting_epoch: EpochIndex = 3; let current_epoch = get_current_epoch(&mut sdk, &cfg).await; let limit = 2; @@ -159,3 +163,23 @@ async fn test_epoch_fetch_future() { assert!(epoch.is_none()); } + +/// Fetch current epoch from the platform. +#[tokio::test(flavor = "multi_thread", worker_threads = 1)] +async fn test_epoch_fetch_current() { + setup_logs(); + + let cfg = Config::new(); + let mut sdk = cfg.setup_api().await; + + // Given some current epoch + let expected_epoch = get_current_epoch(&mut sdk, &cfg).await; + + let epoch = ExtendedEpochInfo::fetch_current(&mut sdk) + .await + .expect("fetch current epoch"); + + assert_eq!(epoch.index(), expected_epoch); + + tracing::info!(epoch = ?epoch, "current epoch"); +} diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:15.778699353Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json b/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:15.778699353Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json new file mode 100644 index 0000000000..6da7db8093 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:15.778699353Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json @@ -0,0 +1 @@ +{"request":{"version":{"v0":{"id":[48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172],"prove":true}}},"response":{"version":{"v0":{"metadata":{"height":"399","core_chain_locked_height":1588,"epoch":17,"time_ms":"1701186367912","protocol_version":1,"chain_id":"dashmate_local_35"},"result":{"proof":{"grovedb_proof":[1,1,198,2,1,98,47,81,170,142,110,105,167,245,70,76,165,89,129,240,133,176,58,44,104,42,111,4,126,71,140,147,66,193,24,255,114,4,1,32,0,36,2,1,32,159,101,165,10,103,89,107,118,134,35,62,205,14,245,130,168,86,190,41,247,139,113,170,202,91,69,135,242,242,219,97,152,0,170,248,227,132,247,178,161,4,232,51,133,61,28,97,218,226,181,20,216,124,38,73,160,174,147,91,5,84,177,199,9,213,16,1,180,197,101,53,206,21,50,38,152,10,25,240,13,129,131,128,210,135,203,6,130,149,228,81,190,116,110,230,129,134,53,155,17,2,204,254,253,193,45,87,201,63,108,140,98,61,225,223,229,34,208,158,221,141,103,228,168,52,16,123,83,68,64,77,155,5,16,1,195,54,53,19,110,80,46,154,197,36,75,21,162,10,117,126,7,89,206,10,144,130,60,211,127,137,63,106,73,85,109,38,4,1,96,0,45,4,1,32,159,101,165,10,103,89,107,118,134,35,62,205,14,245,130,168,86,190,41,247,139,113,170,202,91,69,135,242,242,219,97,152,253,0,116,252,183,75,154,0,0,0,113,74,127,73,101,189,31,217,214,4,57,100,210,215,114,108,162,3,2,148,223,117,106,188,172,177,141,123,227,81,211,177,16,1,128,96,231,162,226,108,2,94,140,120,176,49,177,10,7,157,195,202,27,37,131,207,174,36,82,148,129,116,70,158,156,2,17,17,1,247,1,4,32,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,0,9,2,1,1,2,1,3,0,0,0,147,44,169,41,89,138,187,109,179,223,164,173,251,188,30,5,193,17,125,230,165,79,95,129,192,255,247,183,248,130,11,127,1,207,145,33,155,181,151,153,234,247,10,107,147,191,8,250,89,1,87,208,72,46,99,152,219,69,191,153,38,116,87,240,26,17,2,188,56,238,209,103,207,163,74,91,179,80,187,245,244,119,112,46,53,5,55,185,116,123,148,188,110,10,156,255,184,161,230,16,1,165,11,155,131,238,228,237,231,206,198,117,129,22,130,89,177,203,28,178,48,127,9,232,55,224,144,114,109,195,236,102,196,17,2,71,134,252,43,28,34,125,43,96,20,45,216,7,117,56,163,2,54,249,33,30,8,97,181,133,247,198,4,14,168,222,180,16,1,253,149,23,63,99,83,217,70,73,145,56,150,148,41,134,194,159,29,139,8,25,21,70,157,96,71,231,72,225,115,151,178,17,1,127,3,1,0,0,11,0,8,0,0,0,0,0,0,0,0,0,4,1,1,0,5,2,1,1,1,0,16,225,21,118,101,134,70,47,103,158,127,6,179,151,197,124,233,214,249,18,65,72,139,138,50,18,118,221,182,13,131,146,16,2,194,9,205,84,213,124,81,201,239,161,86,228,38,75,126,158,141,25,64,89,251,71,61,126,130,248,159,225,40,157,158,188,16,1,70,25,123,162,209,216,154,230,95,14,56,180,32,113,102,210,182,213,32,20,204,112,76,86,112,130,191,29,189,101,249,223,17,2,101,3,1,0,0,45,0,42,0,0,0,0,0,0,0,33,2,67,47,12,14,41,81,212,255,222,72,159,230,209,27,71,17,62,219,159,235,141,240,77,10,88,255,146,191,158,42,3,116,0,0,3,1,1,0,45,0,42,0,1,0,2,0,0,0,33,2,239,132,159,154,2,108,129,219,17,98,41,180,68,164,141,141,196,24,179,198,239,112,12,170,24,76,39,60,130,6,64,245,0,0,16,2,241,1,4,32,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,0,3,3,0,0,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,1,37,155,21,15,26,155,182,157,94,11,89,145,155,140,155,110,36,232,229,5,196,191,250,6,77,83,25,51,98,20,105,73,17,2,137,55,32,169,123,196,47,111,55,237,142,237,212,151,35,145,129,149,32,86,123,54,68,188,209,146,213,120,53,25,205,45,16,1,130,30,123,13,165,76,200,110,180,125,15,29,148,215,119,226,252,19,105,124,251,151,73,162,22,119,179,249,171,70,68,38,17,2,200,105,64,185,61,22,4,50,132,43,124,194,103,27,115,224,42,137,43,3,126,236,116,160,160,163,177,241,106,191,211,113,16,1,142,88,58,139,31,171,189,155,188,152,82,29,125,16,59,205,139,30,155,166,123,174,220,72,92,252,205,34,221,235,160,96,17],"quorum_hash":[123,144,176,163,196,242,87,123,128,135,83,39,239,120,32,29,65,52,87,220,144,181,236,210,79,66,137,151,63,54,118,157],"signature":[135,79,175,135,193,164,119,151,151,131,174,141,163,69,181,24,215,204,61,237,255,196,70,134,97,121,7,76,147,43,53,250,205,78,147,152,89,222,11,4,154,93,54,197,21,5,99,252,25,79,86,31,22,214,27,140,137,211,133,232,3,222,209,123,214,14,13,3,183,33,37,173,168,248,45,164,69,68,20,188,229,210,130,6,194,49,120,112,19,187,20,221,0,37,34,56],"round":0,"block_id_hash":[0,12,135,39,153,35,126,250,186,177,14,99,228,202,68,226,184,146,126,77,169,28,238,236,54,202,65,171,20,63,25,2],"quorum_type":106}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:15.796630936Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json b/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:15.796630936Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json new file mode 100644 index 0000000000..6da7db8093 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:15.796630936Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json @@ -0,0 +1 @@ +{"request":{"version":{"v0":{"id":[48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172],"prove":true}}},"response":{"version":{"v0":{"metadata":{"height":"399","core_chain_locked_height":1588,"epoch":17,"time_ms":"1701186367912","protocol_version":1,"chain_id":"dashmate_local_35"},"result":{"proof":{"grovedb_proof":[1,1,198,2,1,98,47,81,170,142,110,105,167,245,70,76,165,89,129,240,133,176,58,44,104,42,111,4,126,71,140,147,66,193,24,255,114,4,1,32,0,36,2,1,32,159,101,165,10,103,89,107,118,134,35,62,205,14,245,130,168,86,190,41,247,139,113,170,202,91,69,135,242,242,219,97,152,0,170,248,227,132,247,178,161,4,232,51,133,61,28,97,218,226,181,20,216,124,38,73,160,174,147,91,5,84,177,199,9,213,16,1,180,197,101,53,206,21,50,38,152,10,25,240,13,129,131,128,210,135,203,6,130,149,228,81,190,116,110,230,129,134,53,155,17,2,204,254,253,193,45,87,201,63,108,140,98,61,225,223,229,34,208,158,221,141,103,228,168,52,16,123,83,68,64,77,155,5,16,1,195,54,53,19,110,80,46,154,197,36,75,21,162,10,117,126,7,89,206,10,144,130,60,211,127,137,63,106,73,85,109,38,4,1,96,0,45,4,1,32,159,101,165,10,103,89,107,118,134,35,62,205,14,245,130,168,86,190,41,247,139,113,170,202,91,69,135,242,242,219,97,152,253,0,116,252,183,75,154,0,0,0,113,74,127,73,101,189,31,217,214,4,57,100,210,215,114,108,162,3,2,148,223,117,106,188,172,177,141,123,227,81,211,177,16,1,128,96,231,162,226,108,2,94,140,120,176,49,177,10,7,157,195,202,27,37,131,207,174,36,82,148,129,116,70,158,156,2,17,17,1,247,1,4,32,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,0,9,2,1,1,2,1,3,0,0,0,147,44,169,41,89,138,187,109,179,223,164,173,251,188,30,5,193,17,125,230,165,79,95,129,192,255,247,183,248,130,11,127,1,207,145,33,155,181,151,153,234,247,10,107,147,191,8,250,89,1,87,208,72,46,99,152,219,69,191,153,38,116,87,240,26,17,2,188,56,238,209,103,207,163,74,91,179,80,187,245,244,119,112,46,53,5,55,185,116,123,148,188,110,10,156,255,184,161,230,16,1,165,11,155,131,238,228,237,231,206,198,117,129,22,130,89,177,203,28,178,48,127,9,232,55,224,144,114,109,195,236,102,196,17,2,71,134,252,43,28,34,125,43,96,20,45,216,7,117,56,163,2,54,249,33,30,8,97,181,133,247,198,4,14,168,222,180,16,1,253,149,23,63,99,83,217,70,73,145,56,150,148,41,134,194,159,29,139,8,25,21,70,157,96,71,231,72,225,115,151,178,17,1,127,3,1,0,0,11,0,8,0,0,0,0,0,0,0,0,0,4,1,1,0,5,2,1,1,1,0,16,225,21,118,101,134,70,47,103,158,127,6,179,151,197,124,233,214,249,18,65,72,139,138,50,18,118,221,182,13,131,146,16,2,194,9,205,84,213,124,81,201,239,161,86,228,38,75,126,158,141,25,64,89,251,71,61,126,130,248,159,225,40,157,158,188,16,1,70,25,123,162,209,216,154,230,95,14,56,180,32,113,102,210,182,213,32,20,204,112,76,86,112,130,191,29,189,101,249,223,17,2,101,3,1,0,0,45,0,42,0,0,0,0,0,0,0,33,2,67,47,12,14,41,81,212,255,222,72,159,230,209,27,71,17,62,219,159,235,141,240,77,10,88,255,146,191,158,42,3,116,0,0,3,1,1,0,45,0,42,0,1,0,2,0,0,0,33,2,239,132,159,154,2,108,129,219,17,98,41,180,68,164,141,141,196,24,179,198,239,112,12,170,24,76,39,60,130,6,64,245,0,0,16,2,241,1,4,32,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,0,3,3,0,0,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,1,37,155,21,15,26,155,182,157,94,11,89,145,155,140,155,110,36,232,229,5,196,191,250,6,77,83,25,51,98,20,105,73,17,2,137,55,32,169,123,196,47,111,55,237,142,237,212,151,35,145,129,149,32,86,123,54,68,188,209,146,213,120,53,25,205,45,16,1,130,30,123,13,165,76,200,110,180,125,15,29,148,215,119,226,252,19,105,124,251,151,73,162,22,119,179,249,171,70,68,38,17,2,200,105,64,185,61,22,4,50,132,43,124,194,103,27,115,224,42,137,43,3,126,236,116,160,160,163,177,241,106,191,211,113,16,1,142,88,58,139,31,171,189,155,188,152,82,29,125,16,59,205,139,30,155,166,123,174,220,72,92,252,205,34,221,235,160,96,17],"quorum_hash":[123,144,176,163,196,242,87,123,128,135,83,39,239,120,32,29,65,52,87,220,144,181,236,210,79,66,137,151,63,54,118,157],"signature":[135,79,175,135,193,164,119,151,151,131,174,141,163,69,181,24,215,204,61,237,255,196,70,134,97,121,7,76,147,43,53,250,205,78,147,152,89,222,11,4,154,93,54,197,21,5,99,252,25,79,86,31,22,214,27,140,137,211,133,232,3,222,209,123,214,14,13,3,183,33,37,173,168,248,45,164,69,68,20,188,229,210,130,6,194,49,120,112,19,187,20,221,0,37,34,56],"round":0,"block_id_hash":[0,12,135,39,153,35,126,250,186,177,14,99,228,202,68,226,184,146,126,77,169,28,238,236,54,202,65,171,20,63,25,2],"quorum_type":106}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:15.800193897Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json b/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:15.800193897Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json new file mode 100644 index 0000000000..6da7db8093 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:15.800193897Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json @@ -0,0 +1 @@ +{"request":{"version":{"v0":{"id":[48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172],"prove":true}}},"response":{"version":{"v0":{"metadata":{"height":"399","core_chain_locked_height":1588,"epoch":17,"time_ms":"1701186367912","protocol_version":1,"chain_id":"dashmate_local_35"},"result":{"proof":{"grovedb_proof":[1,1,198,2,1,98,47,81,170,142,110,105,167,245,70,76,165,89,129,240,133,176,58,44,104,42,111,4,126,71,140,147,66,193,24,255,114,4,1,32,0,36,2,1,32,159,101,165,10,103,89,107,118,134,35,62,205,14,245,130,168,86,190,41,247,139,113,170,202,91,69,135,242,242,219,97,152,0,170,248,227,132,247,178,161,4,232,51,133,61,28,97,218,226,181,20,216,124,38,73,160,174,147,91,5,84,177,199,9,213,16,1,180,197,101,53,206,21,50,38,152,10,25,240,13,129,131,128,210,135,203,6,130,149,228,81,190,116,110,230,129,134,53,155,17,2,204,254,253,193,45,87,201,63,108,140,98,61,225,223,229,34,208,158,221,141,103,228,168,52,16,123,83,68,64,77,155,5,16,1,195,54,53,19,110,80,46,154,197,36,75,21,162,10,117,126,7,89,206,10,144,130,60,211,127,137,63,106,73,85,109,38,4,1,96,0,45,4,1,32,159,101,165,10,103,89,107,118,134,35,62,205,14,245,130,168,86,190,41,247,139,113,170,202,91,69,135,242,242,219,97,152,253,0,116,252,183,75,154,0,0,0,113,74,127,73,101,189,31,217,214,4,57,100,210,215,114,108,162,3,2,148,223,117,106,188,172,177,141,123,227,81,211,177,16,1,128,96,231,162,226,108,2,94,140,120,176,49,177,10,7,157,195,202,27,37,131,207,174,36,82,148,129,116,70,158,156,2,17,17,1,247,1,4,32,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,0,9,2,1,1,2,1,3,0,0,0,147,44,169,41,89,138,187,109,179,223,164,173,251,188,30,5,193,17,125,230,165,79,95,129,192,255,247,183,248,130,11,127,1,207,145,33,155,181,151,153,234,247,10,107,147,191,8,250,89,1,87,208,72,46,99,152,219,69,191,153,38,116,87,240,26,17,2,188,56,238,209,103,207,163,74,91,179,80,187,245,244,119,112,46,53,5,55,185,116,123,148,188,110,10,156,255,184,161,230,16,1,165,11,155,131,238,228,237,231,206,198,117,129,22,130,89,177,203,28,178,48,127,9,232,55,224,144,114,109,195,236,102,196,17,2,71,134,252,43,28,34,125,43,96,20,45,216,7,117,56,163,2,54,249,33,30,8,97,181,133,247,198,4,14,168,222,180,16,1,253,149,23,63,99,83,217,70,73,145,56,150,148,41,134,194,159,29,139,8,25,21,70,157,96,71,231,72,225,115,151,178,17,1,127,3,1,0,0,11,0,8,0,0,0,0,0,0,0,0,0,4,1,1,0,5,2,1,1,1,0,16,225,21,118,101,134,70,47,103,158,127,6,179,151,197,124,233,214,249,18,65,72,139,138,50,18,118,221,182,13,131,146,16,2,194,9,205,84,213,124,81,201,239,161,86,228,38,75,126,158,141,25,64,89,251,71,61,126,130,248,159,225,40,157,158,188,16,1,70,25,123,162,209,216,154,230,95,14,56,180,32,113,102,210,182,213,32,20,204,112,76,86,112,130,191,29,189,101,249,223,17,2,101,3,1,0,0,45,0,42,0,0,0,0,0,0,0,33,2,67,47,12,14,41,81,212,255,222,72,159,230,209,27,71,17,62,219,159,235,141,240,77,10,88,255,146,191,158,42,3,116,0,0,3,1,1,0,45,0,42,0,1,0,2,0,0,0,33,2,239,132,159,154,2,108,129,219,17,98,41,180,68,164,141,141,196,24,179,198,239,112,12,170,24,76,39,60,130,6,64,245,0,0,16,2,241,1,4,32,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,0,3,3,0,0,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,1,37,155,21,15,26,155,182,157,94,11,89,145,155,140,155,110,36,232,229,5,196,191,250,6,77,83,25,51,98,20,105,73,17,2,137,55,32,169,123,196,47,111,55,237,142,237,212,151,35,145,129,149,32,86,123,54,68,188,209,146,213,120,53,25,205,45,16,1,130,30,123,13,165,76,200,110,180,125,15,29,148,215,119,226,252,19,105,124,251,151,73,162,22,119,179,249,171,70,68,38,17,2,200,105,64,185,61,22,4,50,132,43,124,194,103,27,115,224,42,137,43,3,126,236,116,160,160,163,177,241,106,191,211,113,16,1,142,88,58,139,31,171,189,155,188,152,82,29,125,16,59,205,139,30,155,166,123,174,220,72,92,252,205,34,221,235,160,96,17],"quorum_hash":[123,144,176,163,196,242,87,123,128,135,83,39,239,120,32,29,65,52,87,220,144,181,236,210,79,66,137,151,63,54,118,157],"signature":[135,79,175,135,193,164,119,151,151,131,174,141,163,69,181,24,215,204,61,237,255,196,70,134,97,121,7,76,147,43,53,250,205,78,147,152,89,222,11,4,154,93,54,197,21,5,99,252,25,79,86,31,22,214,27,140,137,211,133,232,3,222,209,123,214,14,13,3,183,33,37,173,168,248,45,164,69,68,20,188,229,210,130,6,194,49,120,112,19,187,20,221,0,37,34,56],"round":0,"block_id_hash":[0,12,135,39,153,35,126,250,186,177,14,99,228,202,68,226,184,146,126,77,169,28,238,236,54,202,65,171,20,63,25,2],"quorum_type":106}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:15.800233442Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json b/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:15.800233442Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json new file mode 100644 index 0000000000..6da7db8093 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:15.800233442Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json @@ -0,0 +1 @@ +{"request":{"version":{"v0":{"id":[48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172],"prove":true}}},"response":{"version":{"v0":{"metadata":{"height":"399","core_chain_locked_height":1588,"epoch":17,"time_ms":"1701186367912","protocol_version":1,"chain_id":"dashmate_local_35"},"result":{"proof":{"grovedb_proof":[1,1,198,2,1,98,47,81,170,142,110,105,167,245,70,76,165,89,129,240,133,176,58,44,104,42,111,4,126,71,140,147,66,193,24,255,114,4,1,32,0,36,2,1,32,159,101,165,10,103,89,107,118,134,35,62,205,14,245,130,168,86,190,41,247,139,113,170,202,91,69,135,242,242,219,97,152,0,170,248,227,132,247,178,161,4,232,51,133,61,28,97,218,226,181,20,216,124,38,73,160,174,147,91,5,84,177,199,9,213,16,1,180,197,101,53,206,21,50,38,152,10,25,240,13,129,131,128,210,135,203,6,130,149,228,81,190,116,110,230,129,134,53,155,17,2,204,254,253,193,45,87,201,63,108,140,98,61,225,223,229,34,208,158,221,141,103,228,168,52,16,123,83,68,64,77,155,5,16,1,195,54,53,19,110,80,46,154,197,36,75,21,162,10,117,126,7,89,206,10,144,130,60,211,127,137,63,106,73,85,109,38,4,1,96,0,45,4,1,32,159,101,165,10,103,89,107,118,134,35,62,205,14,245,130,168,86,190,41,247,139,113,170,202,91,69,135,242,242,219,97,152,253,0,116,252,183,75,154,0,0,0,113,74,127,73,101,189,31,217,214,4,57,100,210,215,114,108,162,3,2,148,223,117,106,188,172,177,141,123,227,81,211,177,16,1,128,96,231,162,226,108,2,94,140,120,176,49,177,10,7,157,195,202,27,37,131,207,174,36,82,148,129,116,70,158,156,2,17,17,1,247,1,4,32,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,0,9,2,1,1,2,1,3,0,0,0,147,44,169,41,89,138,187,109,179,223,164,173,251,188,30,5,193,17,125,230,165,79,95,129,192,255,247,183,248,130,11,127,1,207,145,33,155,181,151,153,234,247,10,107,147,191,8,250,89,1,87,208,72,46,99,152,219,69,191,153,38,116,87,240,26,17,2,188,56,238,209,103,207,163,74,91,179,80,187,245,244,119,112,46,53,5,55,185,116,123,148,188,110,10,156,255,184,161,230,16,1,165,11,155,131,238,228,237,231,206,198,117,129,22,130,89,177,203,28,178,48,127,9,232,55,224,144,114,109,195,236,102,196,17,2,71,134,252,43,28,34,125,43,96,20,45,216,7,117,56,163,2,54,249,33,30,8,97,181,133,247,198,4,14,168,222,180,16,1,253,149,23,63,99,83,217,70,73,145,56,150,148,41,134,194,159,29,139,8,25,21,70,157,96,71,231,72,225,115,151,178,17,1,127,3,1,0,0,11,0,8,0,0,0,0,0,0,0,0,0,4,1,1,0,5,2,1,1,1,0,16,225,21,118,101,134,70,47,103,158,127,6,179,151,197,124,233,214,249,18,65,72,139,138,50,18,118,221,182,13,131,146,16,2,194,9,205,84,213,124,81,201,239,161,86,228,38,75,126,158,141,25,64,89,251,71,61,126,130,248,159,225,40,157,158,188,16,1,70,25,123,162,209,216,154,230,95,14,56,180,32,113,102,210,182,213,32,20,204,112,76,86,112,130,191,29,189,101,249,223,17,2,101,3,1,0,0,45,0,42,0,0,0,0,0,0,0,33,2,67,47,12,14,41,81,212,255,222,72,159,230,209,27,71,17,62,219,159,235,141,240,77,10,88,255,146,191,158,42,3,116,0,0,3,1,1,0,45,0,42,0,1,0,2,0,0,0,33,2,239,132,159,154,2,108,129,219,17,98,41,180,68,164,141,141,196,24,179,198,239,112,12,170,24,76,39,60,130,6,64,245,0,0,16,2,241,1,4,32,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,0,3,3,0,0,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,1,37,155,21,15,26,155,182,157,94,11,89,145,155,140,155,110,36,232,229,5,196,191,250,6,77,83,25,51,98,20,105,73,17,2,137,55,32,169,123,196,47,111,55,237,142,237,212,151,35,145,129,149,32,86,123,54,68,188,209,146,213,120,53,25,205,45,16,1,130,30,123,13,165,76,200,110,180,125,15,29,148,215,119,226,252,19,105,124,251,151,73,162,22,119,179,249,171,70,68,38,17,2,200,105,64,185,61,22,4,50,132,43,124,194,103,27,115,224,42,137,43,3,126,236,116,160,160,163,177,241,106,191,211,113,16,1,142,88,58,139,31,171,189,155,188,152,82,29,125,16,59,205,139,30,155,166,123,174,220,72,92,252,205,34,221,235,160,96,17],"quorum_hash":[123,144,176,163,196,242,87,123,128,135,83,39,239,120,32,29,65,52,87,220,144,181,236,210,79,66,137,151,63,54,118,157],"signature":[135,79,175,135,193,164,119,151,151,131,174,141,163,69,181,24,215,204,61,237,255,196,70,134,97,121,7,76,147,43,53,250,205,78,147,152,89,222,11,4,154,93,54,197,21,5,99,252,25,79,86,31,22,214,27,140,137,211,133,232,3,222,209,123,214,14,13,3,183,33,37,173,168,248,45,164,69,68,20,188,229,210,130,6,194,49,120,112,19,187,20,221,0,37,34,56],"round":0,"block_id_hash":[0,12,135,39,153,35,126,250,186,177,14,99,228,202,68,226,184,146,126,77,169,28,238,236,54,202,65,171,20,63,25,2],"quorum_type":106}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:15.800635171Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json b/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:15.800635171Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json new file mode 100644 index 0000000000..6da7db8093 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:15.800635171Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json @@ -0,0 +1 @@ +{"request":{"version":{"v0":{"id":[48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172],"prove":true}}},"response":{"version":{"v0":{"metadata":{"height":"399","core_chain_locked_height":1588,"epoch":17,"time_ms":"1701186367912","protocol_version":1,"chain_id":"dashmate_local_35"},"result":{"proof":{"grovedb_proof":[1,1,198,2,1,98,47,81,170,142,110,105,167,245,70,76,165,89,129,240,133,176,58,44,104,42,111,4,126,71,140,147,66,193,24,255,114,4,1,32,0,36,2,1,32,159,101,165,10,103,89,107,118,134,35,62,205,14,245,130,168,86,190,41,247,139,113,170,202,91,69,135,242,242,219,97,152,0,170,248,227,132,247,178,161,4,232,51,133,61,28,97,218,226,181,20,216,124,38,73,160,174,147,91,5,84,177,199,9,213,16,1,180,197,101,53,206,21,50,38,152,10,25,240,13,129,131,128,210,135,203,6,130,149,228,81,190,116,110,230,129,134,53,155,17,2,204,254,253,193,45,87,201,63,108,140,98,61,225,223,229,34,208,158,221,141,103,228,168,52,16,123,83,68,64,77,155,5,16,1,195,54,53,19,110,80,46,154,197,36,75,21,162,10,117,126,7,89,206,10,144,130,60,211,127,137,63,106,73,85,109,38,4,1,96,0,45,4,1,32,159,101,165,10,103,89,107,118,134,35,62,205,14,245,130,168,86,190,41,247,139,113,170,202,91,69,135,242,242,219,97,152,253,0,116,252,183,75,154,0,0,0,113,74,127,73,101,189,31,217,214,4,57,100,210,215,114,108,162,3,2,148,223,117,106,188,172,177,141,123,227,81,211,177,16,1,128,96,231,162,226,108,2,94,140,120,176,49,177,10,7,157,195,202,27,37,131,207,174,36,82,148,129,116,70,158,156,2,17,17,1,247,1,4,32,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,0,9,2,1,1,2,1,3,0,0,0,147,44,169,41,89,138,187,109,179,223,164,173,251,188,30,5,193,17,125,230,165,79,95,129,192,255,247,183,248,130,11,127,1,207,145,33,155,181,151,153,234,247,10,107,147,191,8,250,89,1,87,208,72,46,99,152,219,69,191,153,38,116,87,240,26,17,2,188,56,238,209,103,207,163,74,91,179,80,187,245,244,119,112,46,53,5,55,185,116,123,148,188,110,10,156,255,184,161,230,16,1,165,11,155,131,238,228,237,231,206,198,117,129,22,130,89,177,203,28,178,48,127,9,232,55,224,144,114,109,195,236,102,196,17,2,71,134,252,43,28,34,125,43,96,20,45,216,7,117,56,163,2,54,249,33,30,8,97,181,133,247,198,4,14,168,222,180,16,1,253,149,23,63,99,83,217,70,73,145,56,150,148,41,134,194,159,29,139,8,25,21,70,157,96,71,231,72,225,115,151,178,17,1,127,3,1,0,0,11,0,8,0,0,0,0,0,0,0,0,0,4,1,1,0,5,2,1,1,1,0,16,225,21,118,101,134,70,47,103,158,127,6,179,151,197,124,233,214,249,18,65,72,139,138,50,18,118,221,182,13,131,146,16,2,194,9,205,84,213,124,81,201,239,161,86,228,38,75,126,158,141,25,64,89,251,71,61,126,130,248,159,225,40,157,158,188,16,1,70,25,123,162,209,216,154,230,95,14,56,180,32,113,102,210,182,213,32,20,204,112,76,86,112,130,191,29,189,101,249,223,17,2,101,3,1,0,0,45,0,42,0,0,0,0,0,0,0,33,2,67,47,12,14,41,81,212,255,222,72,159,230,209,27,71,17,62,219,159,235,141,240,77,10,88,255,146,191,158,42,3,116,0,0,3,1,1,0,45,0,42,0,1,0,2,0,0,0,33,2,239,132,159,154,2,108,129,219,17,98,41,180,68,164,141,141,196,24,179,198,239,112,12,170,24,76,39,60,130,6,64,245,0,0,16,2,241,1,4,32,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,0,3,3,0,0,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,1,37,155,21,15,26,155,182,157,94,11,89,145,155,140,155,110,36,232,229,5,196,191,250,6,77,83,25,51,98,20,105,73,17,2,137,55,32,169,123,196,47,111,55,237,142,237,212,151,35,145,129,149,32,86,123,54,68,188,209,146,213,120,53,25,205,45,16,1,130,30,123,13,165,76,200,110,180,125,15,29,148,215,119,226,252,19,105,124,251,151,73,162,22,119,179,249,171,70,68,38,17,2,200,105,64,185,61,22,4,50,132,43,124,194,103,27,115,224,42,137,43,3,126,236,116,160,160,163,177,241,106,191,211,113,16,1,142,88,58,139,31,171,189,155,188,152,82,29,125,16,59,205,139,30,155,166,123,174,220,72,92,252,205,34,221,235,160,96,17],"quorum_hash":[123,144,176,163,196,242,87,123,128,135,83,39,239,120,32,29,65,52,87,220,144,181,236,210,79,66,137,151,63,54,118,157],"signature":[135,79,175,135,193,164,119,151,151,131,174,141,163,69,181,24,215,204,61,237,255,196,70,134,97,121,7,76,147,43,53,250,205,78,147,152,89,222,11,4,154,93,54,197,21,5,99,252,25,79,86,31,22,214,27,140,137,211,133,232,3,222,209,123,214,14,13,3,183,33,37,173,168,248,45,164,69,68,20,188,229,210,130,6,194,49,120,112,19,187,20,221,0,37,34,56],"round":0,"block_id_hash":[0,12,135,39,153,35,126,250,186,177,14,99,228,202,68,226,184,146,126,77,169,28,238,236,54,202,65,171,20,63,25,2],"quorum_type":106}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:16.134231820Z_GetEpochsInfoRequest_73b10756ba7ed485a1871d443f8d0c59d00e38c1dddc2b0830c07efc7fdcf609.json b/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:16.134231820Z_GetEpochsInfoRequest_73b10756ba7ed485a1871d443f8d0c59d00e38c1dddc2b0830c07efc7fdcf609.json new file mode 100644 index 0000000000..794d584722 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:16.134231820Z_GetEpochsInfoRequest_73b10756ba7ed485a1871d443f8d0c59d00e38c1dddc2b0830c07efc7fdcf609.json @@ -0,0 +1 @@ +{"request":{"version":{"v0":{"start_epoch":null,"count":1,"ascending":false,"prove":true}}},"response":{"version":{"v0":{"metadata":{"height":"399","core_chain_locked_height":1588,"epoch":17,"time_ms":"1701186367912","protocol_version":1,"chain_id":"dashmate_local_35"},"result":{"proof":{"grovedb_proof":[1,1,235,10,8,93,11,115,64,99,183,98,191,128,222,174,23,51,243,40,235,130,83,182,229,49,246,195,142,100,106,12,230,161,172,231,94,9,158,157,119,17,95,11,196,154,163,54,224,247,166,32,166,92,79,15,118,149,141,210,174,154,218,148,6,35,17,101,86,3,18,8,179,123,188,33,159,23,169,11,16,15,59,46,248,160,3,37,184,146,32,253,15,197,90,225,158,210,111,153,249,23,2,0,9,154,5,62,225,30,128,178,64,33,202,63,233,137,158,86,237,243,245,65,26,248,20,186,8,206,93,221,184,137,162,96,150,18,8,180,170,47,137,51,49,170,136,202,126,234,174,152,9,115,248,192,66,103,39,133,142,179,26,4,248,143,191,126,200,242,172,9,172,177,41,228,39,111,209,8,184,123,95,144,213,119,90,128,203,226,131,61,75,159,120,96,87,56,128,93,159,212,217,208,18,8,164,128,8,125,216,154,45,212,158,117,13,4,169,178,223,159,7,196,14,55,218,64,77,145,158,211,169,174,142,217,68,233,9,202,186,194,241,214,185,85,123,169,229,5,25,6,251,1,203,81,97,123,96,230,211,8,29,104,253,238,108,216,128,137,101,18,8,118,107,97,59,85,96,165,128,104,23,54,130,168,102,167,80,212,176,103,42,228,56,64,40,104,43,30,194,157,65,111,107,9,70,51,197,1,30,9,104,84,148,110,7,43,251,46,4,157,152,174,10,96,98,134,248,12,172,209,97,41,248,15,250,73,18,8,141,200,188,139,218,6,116,70,168,179,98,249,233,72,39,246,87,76,204,114,158,217,61,70,21,183,105,34,147,81,226,91,9,204,86,123,246,60,112,184,151,67,217,250,234,123,0,159,16,163,16,135,141,18,76,225,179,55,69,199,223,161,95,84,163,18,8,143,163,130,5,10,51,73,231,144,7,223,119,86,10,105,102,92,200,113,88,99,119,100,114,151,91,238,75,123,201,130,232,9,214,133,214,97,203,126,194,30,3,243,48,119,63,4,90,202,246,179,75,59,177,118,242,68,119,141,22,175,221,127,238,223,18,8,81,131,126,28,217,23,155,231,159,63,57,7,215,33,47,59,46,213,59,145,238,173,208,203,230,172,8,80,14,66,64,98,9,195,224,5,63,134,39,212,34,218,230,179,120,70,183,157,141,63,81,155,55,70,204,193,209,195,113,191,185,108,124,179,85,18,8,153,26,62,65,217,53,14,54,236,253,57,173,126,242,47,21,23,201,233,112,199,54,179,165,138,42,80,58,35,95,35,205,11,2,1,17,0,6,4,1,1,115,0,0,178,191,172,84,197,162,6,66,11,37,59,122,225,28,172,33,154,33,132,164,161,116,13,236,71,182,73,127,230,251,111,70,18,11,2,1,16,0,6,4,1,1,116,0,0,99,255,217,43,21,202,175,140,246,213,248,108,95,181,119,229,61,192,196,3,81,16,237,94,74,147,5,219,186,19,35,35,19,19,19,11,2,1,15,0,6,4,1,1,116,0,0,122,126,37,142,132,53,184,92,55,162,80,77,237,212,36,244,239,150,193,73,20,160,219,161,192,177,138,126,80,88,139,252,18,11,2,1,14,0,6,4,1,1,116,0,0,240,76,193,105,203,112,134,166,120,185,48,177,150,236,85,49,108,247,4,212,60,44,208,111,7,80,149,78,60,212,255,170,11,2,1,13,0,6,4,1,1,116,0,0,69,219,223,197,166,31,255,162,154,167,174,49,30,24,186,203,52,137,150,253,48,195,13,159,98,48,95,41,229,163,32,142,18,11,2,1,12,0,6,4,1,1,116,0,0,249,27,73,152,102,222,33,233,1,206,109,58,71,177,10,212,205,175,190,91,42,47,213,112,254,236,2,113,155,119,80,164,19,11,2,1,11,0,6,4,1,1,116,0,0,138,110,209,29,91,253,146,71,60,250,119,107,48,79,144,164,149,67,25,25,208,47,93,133,79,58,182,76,241,36,239,93,18,11,2,1,10,0,6,4,1,1,116,0,0,222,94,29,221,66,53,137,5,8,116,164,234,116,20,124,67,48,199,52,242,54,108,202,38,237,216,133,88,93,244,97,11,11,2,1,9,0,6,4,1,1,116,0,0,253,174,88,134,134,115,128,138,240,16,240,220,41,146,199,37,48,4,255,109,128,74,67,31,90,184,143,18,48,110,119,67,18,11,2,1,8,0,6,4,1,1,116,0,0,43,238,69,251,66,159,162,132,163,64,191,26,28,143,1,124,145,95,189,72,243,130,38,250,42,242,71,36,211,175,163,202,19,19,11,2,1,7,0,6,4,1,1,116,0,0,3,86,129,66,125,104,85,190,87,185,132,254,145,212,92,227,167,12,48,201,138,79,224,73,223,5,209,163,51,36,218,116,18,11,2,1,6,0,6,4,1,1,116,0,0,155,157,149,240,21,76,232,116,198,136,115,163,46,67,85,78,147,158,211,201,226,162,43,188,212,243,233,82,97,222,217,82,11,2,1,5,0,6,4,1,1,116,0,0,2,107,155,191,91,103,133,144,180,68,79,10,83,148,152,83,95,76,232,215,183,81,64,37,221,92,19,241,80,71,109,92,18,11,2,1,4,0,6,4,1,1,116,0,0,243,126,213,142,138,144,185,221,47,95,47,171,118,172,73,20,14,203,130,3,73,42,141,101,144,246,87,204,44,227,199,157,19,11,2,1,3,0,6,4,1,1,116,0,0,219,88,183,194,71,182,36,49,109,161,78,73,88,195,176,115,60,142,74,82,5,86,246,40,238,222,92,41,146,71,173,119,18,11,2,1,2,0,6,4,1,1,116,0,0,172,18,30,20,94,147,151,23,36,50,196,182,23,211,208,0,84,132,197,251,24,237,24,233,183,87,123,4,29,37,32,248,11,2,1,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,18,11,2,1,0,0,6,4,1,1,116,0,0,191,126,129,178,112,248,119,101,108,198,233,6,159,191,229,7,220,156,221,144,181,149,172,25,38,19,55,13,16,72,187,62,19,19,19,19,19,19,19,19,19,19,2,165,1,3,1,99,0,7,0,4,0,0,6,44,0,3,1,104,0,11,0,8,0,0,0,0,0,0,1,122,0,16,2,107,151,47,243,47,18,227,31,229,125,74,187,225,218,116,193,148,151,158,194,183,145,114,163,62,188,236,47,151,7,125,247,16,1,124,5,5,84,197,79,223,134,77,199,210,177,213,29,127,3,207,81,232,32,223,29,3,226,129,220,208,51,8,53,216,176,17,2,121,45,177,85,164,24,14,126,131,127,68,24,21,95,97,146,155,109,41,179,16,161,60,228,68,62,168,147,142,105,25,73,16,3,1,116,0,11,0,8,0,0,1,140,22,152,62,32,0,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,16,17,1,180,1,1,98,47,81,170,142,110,105,167,245,70,76,165,89,129,240,133,176,58,44,104,42,111,4,126,71,140,147,66,193,24,255,114,2,151,226,162,5,91,69,34,111,91,125,233,176,249,69,4,50,172,213,204,20,250,154,228,97,254,54,113,240,241,116,185,99,16,4,1,48,0,7,4,1,2,4,233,0,0,195,102,158,185,181,91,9,31,26,10,18,86,127,166,251,61,118,179,38,70,60,59,179,209,245,114,26,231,70,196,43,238,17,2,204,254,253,193,45,87,201,63,108,140,98,61,225,223,229,34,208,158,221,141,103,228,168,52,16,123,83,68,64,77,155,5,16,1,166,197,16,3,135,60,161,26,106,1,44,144,109,198,163,250,94,136,228,109,81,210,107,191,196,146,227,89,138,6,29,154,17],"quorum_hash":[123,144,176,163,196,242,87,123,128,135,83,39,239,120,32,29,65,52,87,220,144,181,236,210,79,66,137,151,63,54,118,157],"signature":[135,79,175,135,193,164,119,151,151,131,174,141,163,69,181,24,215,204,61,237,255,196,70,134,97,121,7,76,147,43,53,250,205,78,147,152,89,222,11,4,154,93,54,197,21,5,99,252,25,79,86,31,22,214,27,140,137,211,133,232,3,222,209,123,214,14,13,3,183,33,37,173,168,248,45,164,69,68,20,188,229,210,130,6,194,49,120,112,19,187,20,221,0,37,34,56],"round":0,"block_id_hash":[0,12,135,39,153,35,126,250,186,177,14,99,228,202,68,226,184,146,126,77,169,28,238,236,54,202,65,171,20,63,25,2],"quorum_type":106}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:16.142398899Z_GetEpochsInfoRequest_d4fe9a388a1862a7db319738fb63f083c2ceb802bbe764135021b32a1c684183.json b/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:16.142398899Z_GetEpochsInfoRequest_d4fe9a388a1862a7db319738fb63f083c2ceb802bbe764135021b32a1c684183.json new file mode 100644 index 0000000000..d8ab01a796 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:16.142398899Z_GetEpochsInfoRequest_d4fe9a388a1862a7db319738fb63f083c2ceb802bbe764135021b32a1c684183.json @@ -0,0 +1 @@ +{"request":{"version":{"v0":{"start_epoch":3,"count":100,"ascending":true,"prove":true}}},"response":{"version":{"v0":{"metadata":{"height":"399","core_chain_locked_height":1588,"epoch":17,"time_ms":"1701186367912","protocol_version":1,"chain_id":"dashmate_local_35"},"result":{"proof":{"grovedb_proof":[1,1,142,197,5,1,17,180,135,232,242,135,240,249,237,108,66,166,152,167,194,231,203,243,134,214,120,45,182,78,150,235,233,151,144,137,19,246,4,2,1,3,0,6,4,1,1,116,0,0,219,88,183,194,71,182,36,49,109,161,78,73,88,195,176,115,60,142,74,82,5,86,246,40,238,222,92,41,146,71,173,119,16,4,2,1,4,0,6,4,1,1,116,0,0,243,126,213,142,138,144,185,221,47,95,47,171,118,172,73,20,14,203,130,3,73,42,141,101,144,246,87,204,44,227,199,157,4,2,1,5,0,6,4,1,1,116,0,0,2,107,155,191,91,103,133,144,180,68,79,10,83,148,152,83,95,76,232,215,183,81,64,37,221,92,19,241,80,71,109,92,16,4,2,1,6,0,6,4,1,1,116,0,0,155,157,149,240,21,76,232,116,198,136,115,163,46,67,85,78,147,158,211,201,226,162,43,188,212,243,233,82,97,222,217,82,17,17,4,2,1,7,0,6,4,1,1,116,0,0,3,86,129,66,125,104,85,190,87,185,132,254,145,212,92,227,167,12,48,201,138,79,224,73,223,5,209,163,51,36,218,116,16,4,2,1,8,0,6,4,1,1,116,0,0,43,238,69,251,66,159,162,132,163,64,191,26,28,143,1,124,145,95,189,72,243,130,38,250,42,242,71,36,211,175,163,202,4,2,1,9,0,6,4,1,1,116,0,0,253,174,88,134,134,115,128,138,240,16,240,220,41,146,199,37,48,4,255,109,128,74,67,31,90,184,143,18,48,110,119,67,16,4,2,1,10,0,6,4,1,1,116,0,0,222,94,29,221,66,53,137,5,8,116,164,234,116,20,124,67,48,199,52,242,54,108,202,38,237,216,133,88,93,244,97,11,17,4,2,1,11,0,6,4,1,1,116,0,0,138,110,209,29,91,253,146,71,60,250,119,107,48,79,144,164,149,67,25,25,208,47,93,133,79,58,182,76,241,36,239,93,16,4,2,1,12,0,6,4,1,1,116,0,0,249,27,73,152,102,222,33,233,1,206,109,58,71,177,10,212,205,175,190,91,42,47,213,112,254,236,2,113,155,119,80,164,4,2,1,13,0,6,4,1,1,116,0,0,69,219,223,197,166,31,255,162,154,167,174,49,30,24,186,203,52,137,150,253,48,195,13,159,98,48,95,41,229,163,32,142,16,4,2,1,14,0,6,4,1,1,116,0,0,240,76,193,105,203,112,134,166,120,185,48,177,150,236,85,49,108,247,4,212,60,44,208,111,7,80,149,78,60,212,255,170,17,17,17,4,2,1,15,0,6,4,1,1,116,0,0,122,126,37,142,132,53,184,92,55,162,80,77,237,212,36,244,239,150,193,73,20,160,219,161,192,177,138,126,80,88,139,252,16,4,2,1,16,0,6,4,1,1,116,0,0,99,255,217,43,21,202,175,140,246,213,248,108,95,181,119,229,61,192,196,3,81,16,237,94,74,147,5,219,186,19,35,35,4,2,1,17,0,6,4,1,1,115,0,0,178,191,172,84,197,162,6,66,11,37,59,122,225,28,172,33,154,33,132,164,161,116,13,236,71,182,73,127,230,251,111,70,16,4,2,1,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,1,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,1,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,1,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,1,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,1,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,1,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,1,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,4,2,1,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,2,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,2,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,2,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,2,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,2,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,2,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,2,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,17,4,2,2,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,3,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,3,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,3,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,3,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,3,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,3,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,3,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,4,2,3,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,4,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,4,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,4,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,4,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,4,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,4,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,4,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,17,17,4,2,4,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,5,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,5,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,5,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,5,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,5,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,5,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,5,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,4,2,5,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,6,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,6,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,6,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,6,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,6,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,6,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,6,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,17,4,2,6,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,6,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,7,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,7,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,7,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,7,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,7,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,7,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,4,2,7,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,7,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,8,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,8,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,8,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,8,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,8,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,8,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,208,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,17,17,4,2,8,209,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,210,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,4,2,8,211,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,212,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,4,2,8,213,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,214,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,4,2,8,215,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,216,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,4,2,8,217,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,218,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,4,2,8,219,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,220,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,17,4,2,8,221,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,222,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,4,2,8,223,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,224,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,4,2,8,225,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,17,4,1,112,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,1,115,0,3,3,0,0,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,3,1,117,0,5,0,2,0,17,0,16,17,17,17,17,17,17,17,17,17,2,63,3,1,99,0,7,0,4,0,0,5,160,0,3,1,104,0,11,0,8,0,0,0,0,0,0,0,14,0,16,3,1,116,0,11,0,8,0,0,1,140,22,88,32,199,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,2,63,3,1,99,0,7,0,4,0,0,5,170,0,3,1,104,0,11,0,8,0,0,0,0,0,0,0,40,0,16,3,1,116,0,11,0,8,0,0,1,140,22,92,177,213,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,2,63,3,1,99,0,7,0,4,0,0,5,180,0,3,1,104,0,11,0,8,0,0,0,0,0,0,0,66,0,16,3,1,116,0,11,0,8,0,0,1,140,22,97,72,211,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,2,63,3,1,99,0,7,0,4,0,0,5,190,0,3,1,104,0,11,0,8,0,0,0,0,0,0,0,92,0,16,3,1,116,0,11,0,8,0,0,1,140,22,101,218,87,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,2,63,3,1,99,0,7,0,4,0,0,5,200,0,3,1,104,0,11,0,8,0,0,0,0,0,0,0,118,0,16,3,1,116,0,11,0,8,0,0,1,140,22,106,108,158,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,2,63,3,1,99,0,7,0,4,0,0,5,210,0,3,1,104,0,11,0,8,0,0,0,0,0,0,0,144,0,16,3,1,116,0,11,0,8,0,0,1,140,22,110,255,154,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,2,63,3,1,99,0,7,0,4,0,0,5,220,0,3,1,104,0,11,0,8,0,0,0,0,0,0,0,170,0,16,3,1,116,0,11,0,8,0,0,1,140,22,115,147,41,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,2,63,3,1,99,0,7,0,4,0,0,5,230,0,3,1,104,0,11,0,8,0,0,0,0,0,0,0,196,0,16,3,1,116,0,11,0,8,0,0,1,140,22,120,38,112,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,2,63,3,1,99,0,7,0,4,0,0,5,240,0,3,1,104,0,11,0,8,0,0,0,0,0,0,0,222,0,16,3,1,116,0,11,0,8,0,0,1,140,22,124,186,190,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,2,63,3,1,99,0,7,0,4,0,0,5,250,0,3,1,104,0,11,0,8,0,0,0,0,0,0,0,248,0,16,3,1,116,0,11,0,8,0,0,1,140,22,129,76,143,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,2,63,3,1,99,0,7,0,4,0,0,6,4,0,3,1,104,0,11,0,8,0,0,0,0,0,0,1,18,0,16,3,1,116,0,11,0,8,0,0,1,140,22,133,224,163,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,2,63,3,1,99,0,7,0,4,0,0,6,14,0,3,1,104,0,11,0,8,0,0,0,0,0,0,1,44,0,16,3,1,116,0,11,0,8,0,0,1,140,22,138,117,230,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,2,63,3,1,99,0,7,0,4,0,0,6,24,0,3,1,104,0,11,0,8,0,0,0,0,0,0,1,70,0,16,3,1,116,0,11,0,8,0,0,1,140,22,143,10,107,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,2,63,3,1,99,0,7,0,4,0,0,6,34,0,3,1,104,0,11,0,8,0,0,0,0,0,0,1,96,0,16,3,1,116,0,11,0,8,0,0,1,140,22,147,160,108,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,2,165,1,3,1,99,0,7,0,4,0,0,6,44,0,3,1,104,0,11,0,8,0,0,0,0,0,0,1,122,0,16,2,107,151,47,243,47,18,227,31,229,125,74,187,225,218,116,193,148,151,158,194,183,145,114,163,62,188,236,47,151,7,125,247,16,1,124,5,5,84,197,79,223,134,77,199,210,177,213,29,127,3,207,81,232,32,223,29,3,226,129,220,208,51,8,53,216,176,17,2,121,45,177,85,164,24,14,126,131,127,68,24,21,95,97,146,155,109,41,179,16,161,60,228,68,62,168,147,142,105,25,73,16,3,1,116,0,11,0,8,0,0,1,140,22,152,62,32,0,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,16,17,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,1,180,1,1,98,47,81,170,142,110,105,167,245,70,76,165,89,129,240,133,176,58,44,104,42,111,4,126,71,140,147,66,193,24,255,114,2,151,226,162,5,91,69,34,111,91,125,233,176,249,69,4,50,172,213,204,20,250,154,228,97,254,54,113,240,241,116,185,99,16,4,1,48,0,7,4,1,2,4,233,0,0,195,102,158,185,181,91,9,31,26,10,18,86,127,166,251,61,118,179,38,70,60,59,179,209,245,114,26,231,70,196,43,238,17,2,204,254,253,193,45,87,201,63,108,140,98,61,225,223,229,34,208,158,221,141,103,228,168,52,16,123,83,68,64,77,155,5,16,1,166,197,16,3,135,60,161,26,106,1,44,144,109,198,163,250,94,136,228,109,81,210,107,191,196,146,227,89,138,6,29,154,17],"quorum_hash":[123,144,176,163,196,242,87,123,128,135,83,39,239,120,32,29,65,52,87,220,144,181,236,210,79,66,137,151,63,54,118,157],"signature":[135,79,175,135,193,164,119,151,151,131,174,141,163,69,181,24,215,204,61,237,255,196,70,134,97,121,7,76,147,43,53,250,205,78,147,152,89,222,11,4,154,93,54,197,21,5,99,252,25,79,86,31,22,214,27,140,137,211,133,232,3,222,209,123,214,14,13,3,183,33,37,173,168,248,45,164,69,68,20,188,229,210,130,6,194,49,120,112,19,187,20,221,0,37,34,56],"round":0,"block_id_hash":[0,12,135,39,153,35,126,250,186,177,14,99,228,202,68,226,184,146,126,77,169,28,238,236,54,202,65,171,20,63,25,2],"quorum_type":106}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:16.536016360Z_GetEpochsInfoRequest_0df25d4dcb12ff24d9128fdcc91d7dd78bd88ffe63099d2128e0fb388aae50ab.json b/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:16.536016360Z_GetEpochsInfoRequest_0df25d4dcb12ff24d9128fdcc91d7dd78bd88ffe63099d2128e0fb388aae50ab.json new file mode 100644 index 0000000000..32ce90c08e --- /dev/null +++ b/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:16.536016360Z_GetEpochsInfoRequest_0df25d4dcb12ff24d9128fdcc91d7dd78bd88ffe63099d2128e0fb388aae50ab.json @@ -0,0 +1 @@ +{"request":{"version":{"v0":{"start_epoch":17,"count":100,"ascending":true,"prove":true}}},"response":{"version":{"v0":{"metadata":{"height":"399","core_chain_locked_height":1588,"epoch":17,"time_ms":"1701186367912","protocol_version":1,"chain_id":"dashmate_local_35"},"result":{"proof":{"grovedb_proof":[1,1,220,192,5,1,183,28,0,151,87,210,146,60,167,141,145,248,251,9,238,187,113,239,11,142,92,87,234,112,97,94,129,42,103,28,132,165,2,5,215,162,19,76,229,232,94,231,193,91,84,81,247,223,8,252,180,113,58,224,14,13,193,66,9,182,189,108,86,177,197,16,1,4,179,144,33,22,63,241,24,32,177,67,192,118,1,34,167,142,47,175,116,60,234,47,113,160,70,202,185,82,172,149,8,4,2,1,17,0,6,4,1,1,115,0,0,178,191,172,84,197,162,6,66,11,37,59,122,225,28,172,33,154,33,132,164,161,116,13,236,71,182,73,127,230,251,111,70,16,4,2,1,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,1,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,1,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,1,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,1,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,1,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,1,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,1,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,4,2,1,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,2,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,2,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,2,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,2,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,2,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,2,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,2,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,17,4,2,2,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,3,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,3,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,3,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,3,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,3,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,3,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,3,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,4,2,3,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,4,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,4,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,4,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,4,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,4,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,4,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,4,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,17,17,4,2,4,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,5,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,5,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,5,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,5,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,5,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,5,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,5,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,4,2,5,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,6,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,6,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,6,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,6,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,6,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,6,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,6,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,17,4,2,6,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,6,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,7,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,7,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,7,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,7,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,7,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,7,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,4,2,7,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,7,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,8,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,8,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,8,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,8,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,8,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,8,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,208,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,17,17,4,2,8,209,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,210,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,4,2,8,211,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,212,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,4,2,8,213,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,214,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,4,2,8,215,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,216,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,4,2,8,217,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,218,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,4,2,8,219,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,220,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,17,4,2,8,221,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,222,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,4,2,8,223,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,224,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,4,2,8,225,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,17,4,1,112,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,1,115,0,3,3,0,0,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,3,1,117,0,5,0,2,0,17,0,16,17,17,17,17,17,17,17,17,17,2,165,1,3,1,99,0,7,0,4,0,0,6,44,0,3,1,104,0,11,0,8,0,0,0,0,0,0,1,122,0,16,2,107,151,47,243,47,18,227,31,229,125,74,187,225,218,116,193,148,151,158,194,183,145,114,163,62,188,236,47,151,7,125,247,16,1,124,5,5,84,197,79,223,134,77,199,210,177,213,29,127,3,207,81,232,32,223,29,3,226,129,220,208,51,8,53,216,176,17,2,121,45,177,85,164,24,14,126,131,127,68,24,21,95,97,146,155,109,41,179,16,161,60,228,68,62,168,147,142,105,25,73,16,3,1,116,0,11,0,8,0,0,1,140,22,152,62,32,0,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,16,17,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,1,180,1,1,98,47,81,170,142,110,105,167,245,70,76,165,89,129,240,133,176,58,44,104,42,111,4,126,71,140,147,66,193,24,255,114,2,151,226,162,5,91,69,34,111,91,125,233,176,249,69,4,50,172,213,204,20,250,154,228,97,254,54,113,240,241,116,185,99,16,4,1,48,0,7,4,1,2,4,233,0,0,195,102,158,185,181,91,9,31,26,10,18,86,127,166,251,61,118,179,38,70,60,59,179,209,245,114,26,231,70,196,43,238,17,2,204,254,253,193,45,87,201,63,108,140,98,61,225,223,229,34,208,158,221,141,103,228,168,52,16,123,83,68,64,77,155,5,16,1,166,197,16,3,135,60,161,26,106,1,44,144,109,198,163,250,94,136,228,109,81,210,107,191,196,146,227,89,138,6,29,154,17],"quorum_hash":[123,144,176,163,196,242,87,123,128,135,83,39,239,120,32,29,65,52,87,220,144,181,236,210,79,66,137,151,63,54,118,157],"signature":[135,79,175,135,193,164,119,151,151,131,174,141,163,69,181,24,215,204,61,237,255,196,70,134,97,121,7,76,147,43,53,250,205,78,147,152,89,222,11,4,154,93,54,197,21,5,99,252,25,79,86,31,22,214,27,140,137,211,133,232,3,222,209,123,214,14,13,3,183,33,37,173,168,248,45,164,69,68,20,188,229,210,130,6,194,49,120,112,19,187,20,221,0,37,34,56],"round":0,"block_id_hash":[0,12,135,39,153,35,126,250,186,177,14,99,228,202,68,226,184,146,126,77,169,28,238,236,54,202,65,171,20,63,25,2],"quorum_type":106}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:16.879310928Z_GetEpochsInfoRequest_61b3e0349172ec26465ec79f45b2da649dce3dcbd207484424288382ece054f2.json b/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:16.879310928Z_GetEpochsInfoRequest_61b3e0349172ec26465ec79f45b2da649dce3dcbd207484424288382ece054f2.json new file mode 100644 index 0000000000..93a1f9dd48 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:16.879310928Z_GetEpochsInfoRequest_61b3e0349172ec26465ec79f45b2da649dce3dcbd207484424288382ece054f2.json @@ -0,0 +1 @@ +{"request":{"version":{"v0":{"start_epoch":27,"count":100,"ascending":true,"prove":true}}},"response":{"version":{"v0":{"metadata":{"height":"399","core_chain_locked_height":1588,"epoch":17,"time_ms":"1701186367912","protocol_version":1,"chain_id":"dashmate_local_35"},"result":{"proof":{"grovedb_proof":[1,1,222,189,5,1,183,28,0,151,87,210,146,60,167,141,145,248,251,9,238,187,113,239,11,142,92,87,234,112,97,94,129,42,103,28,132,165,2,5,215,162,19,76,229,232,94,231,193,91,84,81,247,223,8,252,180,113,58,224,14,13,193,66,9,182,189,108,86,177,197,16,1,235,164,122,9,165,118,133,245,116,170,88,198,216,16,177,72,95,213,104,188,45,201,64,1,231,214,243,211,46,176,18,176,2,214,133,214,97,203,126,194,30,3,243,48,119,63,4,90,202,246,179,75,59,177,118,242,68,119,141,22,175,221,127,238,223,16,1,113,7,212,117,2,228,217,183,56,43,184,204,159,148,171,28,213,227,252,69,93,204,164,2,164,53,166,77,19,203,49,4,4,2,1,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,1,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,1,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,1,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,1,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,1,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,1,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,1,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,4,2,1,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,2,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,2,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,2,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,2,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,2,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,2,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,2,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,17,4,2,2,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,3,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,3,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,3,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,3,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,3,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,3,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,3,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,4,2,3,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,4,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,4,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,4,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,4,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,4,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,4,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,4,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,17,17,4,2,4,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,5,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,5,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,5,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,5,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,5,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,5,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,5,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,4,2,5,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,6,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,6,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,6,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,6,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,6,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,6,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,6,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,17,4,2,6,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,6,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,7,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,7,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,7,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,7,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,7,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,7,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,4,2,7,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,7,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,8,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,8,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,8,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,8,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,8,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,8,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,208,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,17,17,4,2,8,209,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,210,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,4,2,8,211,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,212,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,4,2,8,213,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,214,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,4,2,8,215,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,216,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,4,2,8,217,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,218,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,4,2,8,219,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,220,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,17,4,2,8,221,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,222,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,4,2,8,223,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,224,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,4,2,8,225,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,17,4,1,112,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,1,115,0,3,3,0,0,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,3,1,117,0,5,0,2,0,17,0,16,17,17,17,17,17,17,17,17,17,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,1,180,1,1,98,47,81,170,142,110,105,167,245,70,76,165,89,129,240,133,176,58,44,104,42,111,4,126,71,140,147,66,193,24,255,114,2,151,226,162,5,91,69,34,111,91,125,233,176,249,69,4,50,172,213,204,20,250,154,228,97,254,54,113,240,241,116,185,99,16,4,1,48,0,7,4,1,2,4,233,0,0,195,102,158,185,181,91,9,31,26,10,18,86,127,166,251,61,118,179,38,70,60,59,179,209,245,114,26,231,70,196,43,238,17,2,204,254,253,193,45,87,201,63,108,140,98,61,225,223,229,34,208,158,221,141,103,228,168,52,16,123,83,68,64,77,155,5,16,1,166,197,16,3,135,60,161,26,106,1,44,144,109,198,163,250,94,136,228,109,81,210,107,191,196,146,227,89,138,6,29,154,17],"quorum_hash":[123,144,176,163,196,242,87,123,128,135,83,39,239,120,32,29,65,52,87,220,144,181,236,210,79,66,137,151,63,54,118,157],"signature":[135,79,175,135,193,164,119,151,151,131,174,141,163,69,181,24,215,204,61,237,255,196,70,134,97,121,7,76,147,43,53,250,205,78,147,152,89,222,11,4,154,93,54,197,21,5,99,252,25,79,86,31,22,214,27,140,137,211,133,232,3,222,209,123,214,14,13,3,183,33,37,173,168,248,45,164,69,68,20,188,229,210,130,6,194,49,120,112,19,187,20,221,0,37,34,56],"round":0,"block_id_hash":[0,12,135,39,153,35,126,250,186,177,14,99,228,202,68,226,184,146,126,77,169,28,238,236,54,202,65,171,20,63,25,2],"quorum_type":106}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:16.921837334Z_GetEpochsInfoRequest_93f0d7a77c909a6170f653a4b4b19e7631c1fc51bcbda1a4b854be8c566acb17.json b/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:16.921837334Z_GetEpochsInfoRequest_93f0d7a77c909a6170f653a4b4b19e7631c1fc51bcbda1a4b854be8c566acb17.json new file mode 100644 index 0000000000..21f6d43112 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:16.921837334Z_GetEpochsInfoRequest_93f0d7a77c909a6170f653a4b4b19e7631c1fc51bcbda1a4b854be8c566acb17.json @@ -0,0 +1 @@ +{"request":{"version":{"v0":{"start_epoch":3,"count":2,"ascending":true,"prove":true}}},"response":{"version":{"v0":{"metadata":{"height":"399","core_chain_locked_height":1588,"epoch":17,"time_ms":"1701186367912","protocol_version":1,"chain_id":"dashmate_local_35"},"result":{"proof":{"grovedb_proof":[1,1,142,197,5,1,17,180,135,232,242,135,240,249,237,108,66,166,152,167,194,231,203,243,134,214,120,45,182,78,150,235,233,151,144,137,19,246,4,2,1,3,0,6,4,1,1,116,0,0,219,88,183,194,71,182,36,49,109,161,78,73,88,195,176,115,60,142,74,82,5,86,246,40,238,222,92,41,146,71,173,119,16,4,2,1,4,0,6,4,1,1,116,0,0,243,126,213,142,138,144,185,221,47,95,47,171,118,172,73,20,14,203,130,3,73,42,141,101,144,246,87,204,44,227,199,157,4,2,1,5,0,6,4,1,1,116,0,0,2,107,155,191,91,103,133,144,180,68,79,10,83,148,152,83,95,76,232,215,183,81,64,37,221,92,19,241,80,71,109,92,16,4,2,1,6,0,6,4,1,1,116,0,0,155,157,149,240,21,76,232,116,198,136,115,163,46,67,85,78,147,158,211,201,226,162,43,188,212,243,233,82,97,222,217,82,17,17,4,2,1,7,0,6,4,1,1,116,0,0,3,86,129,66,125,104,85,190,87,185,132,254,145,212,92,227,167,12,48,201,138,79,224,73,223,5,209,163,51,36,218,116,16,4,2,1,8,0,6,4,1,1,116,0,0,43,238,69,251,66,159,162,132,163,64,191,26,28,143,1,124,145,95,189,72,243,130,38,250,42,242,71,36,211,175,163,202,4,2,1,9,0,6,4,1,1,116,0,0,253,174,88,134,134,115,128,138,240,16,240,220,41,146,199,37,48,4,255,109,128,74,67,31,90,184,143,18,48,110,119,67,16,4,2,1,10,0,6,4,1,1,116,0,0,222,94,29,221,66,53,137,5,8,116,164,234,116,20,124,67,48,199,52,242,54,108,202,38,237,216,133,88,93,244,97,11,17,4,2,1,11,0,6,4,1,1,116,0,0,138,110,209,29,91,253,146,71,60,250,119,107,48,79,144,164,149,67,25,25,208,47,93,133,79,58,182,76,241,36,239,93,16,4,2,1,12,0,6,4,1,1,116,0,0,249,27,73,152,102,222,33,233,1,206,109,58,71,177,10,212,205,175,190,91,42,47,213,112,254,236,2,113,155,119,80,164,4,2,1,13,0,6,4,1,1,116,0,0,69,219,223,197,166,31,255,162,154,167,174,49,30,24,186,203,52,137,150,253,48,195,13,159,98,48,95,41,229,163,32,142,16,4,2,1,14,0,6,4,1,1,116,0,0,240,76,193,105,203,112,134,166,120,185,48,177,150,236,85,49,108,247,4,212,60,44,208,111,7,80,149,78,60,212,255,170,17,17,17,4,2,1,15,0,6,4,1,1,116,0,0,122,126,37,142,132,53,184,92,55,162,80,77,237,212,36,244,239,150,193,73,20,160,219,161,192,177,138,126,80,88,139,252,16,4,2,1,16,0,6,4,1,1,116,0,0,99,255,217,43,21,202,175,140,246,213,248,108,95,181,119,229,61,192,196,3,81,16,237,94,74,147,5,219,186,19,35,35,4,2,1,17,0,6,4,1,1,115,0,0,178,191,172,84,197,162,6,66,11,37,59,122,225,28,172,33,154,33,132,164,161,116,13,236,71,182,73,127,230,251,111,70,16,4,2,1,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,1,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,1,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,1,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,1,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,1,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,1,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,1,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,4,2,1,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,2,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,2,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,2,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,2,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,2,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,2,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,2,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,17,4,2,2,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,3,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,3,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,3,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,3,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,3,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,3,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,3,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,4,2,3,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,4,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,4,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,4,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,4,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,4,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,4,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,4,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,17,17,4,2,4,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,5,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,5,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,5,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,5,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,5,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,5,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,5,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,4,2,5,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,6,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,6,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,6,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,6,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,6,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,6,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,6,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,17,4,2,6,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,6,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,7,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,7,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,7,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,7,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,7,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,7,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,4,2,7,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,7,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,8,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,8,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,8,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,8,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,8,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,8,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,208,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,17,17,4,2,8,209,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,210,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,4,2,8,211,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,212,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,4,2,8,213,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,214,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,4,2,8,215,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,216,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,4,2,8,217,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,218,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,4,2,8,219,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,220,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,17,4,2,8,221,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,222,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,4,2,8,223,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,224,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,4,2,8,225,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,17,4,1,112,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,1,115,0,3,3,0,0,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,3,1,117,0,5,0,2,0,17,0,16,17,17,17,17,17,17,17,17,17,2,63,3,1,99,0,7,0,4,0,0,5,160,0,3,1,104,0,11,0,8,0,0,0,0,0,0,0,14,0,16,3,1,116,0,11,0,8,0,0,1,140,22,88,32,199,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,2,63,3,1,99,0,7,0,4,0,0,5,170,0,3,1,104,0,11,0,8,0,0,0,0,0,0,0,40,0,16,3,1,116,0,11,0,8,0,0,1,140,22,92,177,213,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,1,180,1,1,98,47,81,170,142,110,105,167,245,70,76,165,89,129,240,133,176,58,44,104,42,111,4,126,71,140,147,66,193,24,255,114,2,151,226,162,5,91,69,34,111,91,125,233,176,249,69,4,50,172,213,204,20,250,154,228,97,254,54,113,240,241,116,185,99,16,4,1,48,0,7,4,1,2,4,233,0,0,195,102,158,185,181,91,9,31,26,10,18,86,127,166,251,61,118,179,38,70,60,59,179,209,245,114,26,231,70,196,43,238,17,2,204,254,253,193,45,87,201,63,108,140,98,61,225,223,229,34,208,158,221,141,103,228,168,52,16,123,83,68,64,77,155,5,16,1,166,197,16,3,135,60,161,26,106,1,44,144,109,198,163,250,94,136,228,109,81,210,107,191,196,146,227,89,138,6,29,154,17],"quorum_hash":[123,144,176,163,196,242,87,123,128,135,83,39,239,120,32,29,65,52,87,220,144,181,236,210,79,66,137,151,63,54,118,157],"signature":[135,79,175,135,193,164,119,151,151,131,174,141,163,69,181,24,215,204,61,237,255,196,70,134,97,121,7,76,147,43,53,250,205,78,147,152,89,222,11,4,154,93,54,197,21,5,99,252,25,79,86,31,22,214,27,140,137,211,133,232,3,222,209,123,214,14,13,3,183,33,37,173,168,248,45,164,69,68,20,188,229,210,130,6,194,49,120,112,19,187,20,221,0,37,34,56],"round":0,"block_id_hash":[0,12,135,39,153,35,126,250,186,177,14,99,228,202,68,226,184,146,126,77,169,28,238,236,54,202,65,171,20,63,25,2],"quorum_type":106}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/quorum_pubkey-106-7b90b0a3c4f2577b80875327ef78201d413457dc90b5ecd24f4289973f36769d.json b/packages/rs-sdk/tests/vectors/quorum_pubkey-106-7b90b0a3c4f2577b80875327ef78201d413457dc90b5ecd24f4289973f36769d.json new file mode 100644 index 0000000000..7af2166ac0 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/quorum_pubkey-106-7b90b0a3c4f2577b80875327ef78201d413457dc90b5ecd24f4289973f36769d.json @@ -0,0 +1 @@ +[139,82,100,243,110,219,128,14,41,255,188,173,115,96,249,222,245,107,234,228,126,150,240,64,51,240,79,241,173,179,241,175,144,57,168,4,206,144,166,44,255,180,178,46,237,36,29,138] \ No newline at end of file From becabaf32d79e13a0f560cff26d36667af523136 Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Thu, 4 Jan 2024 18:48:07 +0700 Subject: [PATCH 004/191] feat(drive-abci)!: processing fees for signature verification (#1656) --- Cargo.lock | 1 - packages/rs-dpp/Cargo.toml | 1 - packages/rs-dpp/src/fee/default_costs/mod.rs | 23 ++- .../identity/identity_public_key/key_type.rs | 25 ++- .../calculate_operation_fees.rs | 54 ------ .../calculate_state_transition_fee.rs | 59 ------ .../calculate_state_transition_fee_factory.rs | 20 -- ..._transition_fee_from_operations_factory.rs | 182 ------------------ .../state_transition_fee/mod.rs | 31 --- .../state_transition_fee/operations/mod.rs | 151 --------------- .../operations/precalculated_operation.rs | 50 ----- .../operations/read_operation.rs | 44 ----- .../state_transition_execution_context.rs | 92 --------- .../execute_event/v0/mod.rs | 13 +- .../validate_fees_of_event/v0/mod.rs | 23 ++- .../execution/types/execution_event/mod.rs | 45 ++--- .../types/execution_operation/mod.rs | 48 ++++- .../signature_verification_operation.rs | 9 +- .../rs-drive-abci/src/execution/types/mod.rs | 2 +- .../state_transition_execution_context/mod.rs | 11 ++ .../v0/mod.rs | 3 + .../v0/mod.rs | 4 - .../state_transition/processor/v0/mod.rs | 64 ++++-- .../data_contract_create/mod.rs | 3 + .../data_contract_update/mod.rs | 26 ++- .../state_transitions/documents_batch/mod.rs | 3 + .../identity_and_signatures/v0/mod.rs | 10 + .../state_transitions/identity_create/mod.rs | 7 +- .../identity_create/state/v0/mod.rs | 21 +- .../identity_credit_transfer/mod.rs | 3 + .../identity_credit_withdrawal/mod.rs | 3 + .../state_transitions/identity_top_up/mod.rs | 7 +- .../identity_top_up/state/v0/mod.rs | 19 +- .../identity_and_signatures/v0/mod.rs | 10 + .../state_transitions/identity_update/mod.rs | 3 + .../state_transition/transformer/mod.rs | 27 ++- .../tests/strategy_tests/main.rs | 6 +- .../verify_state_transitions.rs | 30 ++- 38 files changed, 347 insertions(+), 786 deletions(-) delete mode 100644 packages/rs-dpp/src/state_transition/state_transition_fee/calculate_operation_fees.rs delete mode 100644 packages/rs-dpp/src/state_transition/state_transition_fee/calculate_state_transition_fee.rs delete mode 100644 packages/rs-dpp/src/state_transition/state_transition_fee/calculate_state_transition_fee_factory.rs delete mode 100644 packages/rs-dpp/src/state_transition/state_transition_fee/calculate_state_transition_fee_from_operations_factory.rs delete mode 100644 packages/rs-dpp/src/state_transition/state_transition_fee/mod.rs delete mode 100644 packages/rs-dpp/src/state_transition/state_transition_fee/operations/mod.rs delete mode 100644 packages/rs-dpp/src/state_transition/state_transition_fee/operations/precalculated_operation.rs delete mode 100644 packages/rs-dpp/src/state_transition/state_transition_fee/operations/read_operation.rs delete mode 100644 packages/rs-dpp/src/state_transition/state_transition_fee/state_transition_execution_context.rs diff --git a/Cargo.lock b/Cargo.lock index f142933a6f..91abca198e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1188,7 +1188,6 @@ dependencies = [ "derive_more", "dpp", "ed25519-dalek", - "enum-map", "env_logger 0.9.3", "getrandom", "hex", diff --git a/packages/rs-dpp/Cargo.toml b/packages/rs-dpp/Cargo.toml index a1e2113013..b88d3c53f2 100644 --- a/packages/rs-dpp/Cargo.toml +++ b/packages/rs-dpp/Cargo.toml @@ -31,7 +31,6 @@ dashcore = { git = "https://github.com/dashpay/rust-dashcore", features = [ "serde", ], default-features = false, branch = "master" } env_logger = { version = "0.9" } -enum-map = { version = "2.5.0" } getrandom = { version = "0.2", features = ["js"] } hex = { version = "0.4" } integer-encoding = { version = "4.0.0" } diff --git a/packages/rs-dpp/src/fee/default_costs/mod.rs b/packages/rs-dpp/src/fee/default_costs/mod.rs index 25fac22371..a91d072f59 100644 --- a/packages/rs-dpp/src/fee/default_costs/mod.rs +++ b/packages/rs-dpp/src/fee/default_costs/mod.rs @@ -29,7 +29,7 @@ //! Fee costs //! -//! Fee costs for Drive (GroveDB) operations +//! Fee costs for Known Platform operations //! use crate::block::epoch::Epoch; @@ -57,6 +57,20 @@ pub enum KnownCostItem { FetchIdentityBalanceProcessingCost, /// The cost for fetching an identity key FetchSingleIdentityKeyProcessingCost, + /// The cost for a Double SHA256 operation + DoubleSHA256, + /// The cost for a Single SHA256 operation + SingleSHA256, + /// The cost for a EcdsaSecp256k1 signature verification + VerifySignatureEcdsaSecp256k1, + /// The cost for a BLS12_381 signature verification + VerifySignatureBLS12_381, + /// The cost for a EcdsaHash160 signature verification + VerifySignatureEcdsaHash160, + /// The cost for a Bip13ScriptHash signature verification + VerifySignatureBip13ScriptHash, + /// The cost for a Eddsa25519Hash160 signature verification + VerifySignatureEddsa25519Hash160, } const EPOCH_COST_UPDATE_VERSIONS: [u16; 1] = [0]; @@ -75,6 +89,13 @@ lazy_static! { KnownCostItem::FetchSingleIdentityKeyProcessingCost, 10000u64 ), + (KnownCostItem::DoubleSHA256, 800u64), + (KnownCostItem::SingleSHA256, 500u64), + (KnownCostItem::VerifySignatureEcdsaSecp256k1, 3000u64), + (KnownCostItem::VerifySignatureBLS12_381, 6000u64), + (KnownCostItem::VerifySignatureEcdsaHash160, 4000u64), + (KnownCostItem::VerifySignatureBip13ScriptHash, 6000u64), + (KnownCostItem::VerifySignatureEddsa25519Hash160, 3000u64), ]) )]); } diff --git a/packages/rs-dpp/src/identity/identity_public_key/key_type.rs b/packages/rs-dpp/src/identity/identity_public_key/key_type.rs index 9a10d65211..5f813237f4 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/key_type.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/key_type.rs @@ -10,6 +10,12 @@ use dashcore::Network; use itertools::Itertools; use lazy_static::lazy_static; +use crate::block::epoch::Epoch; +use crate::fee::default_costs::EpochCosts; +use crate::fee::default_costs::KnownCostItem::{ + VerifySignatureBLS12_381, VerifySignatureBip13ScriptHash, VerifySignatureEcdsaHash160, + VerifySignatureEcdsaSecp256k1, VerifySignatureEddsa25519Hash160, +}; use crate::fee::Credits; use crate::version::PlatformVersion; use crate::ProtocolError; @@ -83,14 +89,23 @@ impl KeyType { pub fn signature_verify_cost( &self, platform_version: &PlatformVersion, + epoch: &Epoch, ) -> Result { match platform_version.dpp.costs.signature_verify { 0 => Ok(match self { - KeyType::ECDSA_SECP256K1 => 3000, - KeyType::BLS12_381 => 6000, - KeyType::ECDSA_HASH160 => 4000, - KeyType::BIP13_SCRIPT_HASH => 6000, - KeyType::EDDSA_25519_HASH160 => 3000, + KeyType::ECDSA_SECP256K1 => { + epoch.cost_for_known_cost_item(VerifySignatureEcdsaSecp256k1) + } + KeyType::BLS12_381 => epoch.cost_for_known_cost_item(VerifySignatureBLS12_381), + KeyType::ECDSA_HASH160 => { + epoch.cost_for_known_cost_item(VerifySignatureEcdsaHash160) + } + KeyType::BIP13_SCRIPT_HASH => { + epoch.cost_for_known_cost_item(VerifySignatureBip13ScriptHash) + } + KeyType::EDDSA_25519_HASH160 => { + epoch.cost_for_known_cost_item(VerifySignatureEddsa25519Hash160) + } }), version => Err(ProtocolError::UnknownVersionMismatch { method: "KeyType::signature_verify_cost".to_string(), diff --git a/packages/rs-dpp/src/state_transition/state_transition_fee/calculate_operation_fees.rs b/packages/rs-dpp/src/state_transition/state_transition_fee/calculate_operation_fees.rs deleted file mode 100644 index c003d9553d..0000000000 --- a/packages/rs-dpp/src/state_transition/state_transition_fee/calculate_operation_fees.rs +++ /dev/null @@ -1,54 +0,0 @@ -use crate::fee::Credits; -use crate::NonConsensusError; - -use super::operations::{Operation, OperationLike}; -// -// pub fn calculate_operation_fees( -// operations: &[Operation], -// ) -> Result { -// let mut storage_fee: Credits = 0; -// let mut processing_fee: Credits = 0; -// let mut fee_refunds: Vec = Vec::new(); -// -// for operation in operations { -// storage_fee = storage_fee -// .checked_add(operation.get_storage_cost()?) -// .ok_or(NonConsensusError::Overflow("storage cost is too big"))?; -// processing_fee = processing_fee -// .checked_add(operation.get_processing_cost()?) -// .ok_or(NonConsensusError::Overflow("processing cost is too big"))?; -// -// // Merge refunds -// if let Some(operation_refunds) = operation.get_refunds() { -// for identity_refunds in operation_refunds { -// let mut existing_identity_refunds = fee_refunds -// .iter_mut() -// .find(|refund| refund.identifier == identity_refunds.identifier); -// -// if existing_identity_refunds.is_none() { -// fee_refunds.push(identity_refunds.clone()); -// continue; -// } -// -// for (epoch_index, credits) in identity_refunds.credits_per_epoch.iter() { -// if let Some(ref mut refunds) = existing_identity_refunds { -// let epoch = refunds -// .credits_per_epoch -// .entry(epoch_index.to_string()) -// .or_default(); -// -// *epoch = epoch -// .checked_add(*credits) -// .ok_or(NonConsensusError::Overflow("credits per epoch are too big"))? -// } -// } -// } -// } -// } -// -// Ok(DummyFeesResult { -// storage: storage_fee, -// processing: processing_fee, -// fee_refunds, -// }) -// } diff --git a/packages/rs-dpp/src/state_transition/state_transition_fee/calculate_state_transition_fee.rs b/packages/rs-dpp/src/state_transition/state_transition_fee/calculate_state_transition_fee.rs deleted file mode 100644 index 02c908fb8d..0000000000 --- a/packages/rs-dpp/src/state_transition/state_transition_fee/calculate_state_transition_fee.rs +++ /dev/null @@ -1,59 +0,0 @@ -use crate::state_transition::StateTransitionLike; - -use super::{calculate_operations_fees, constants::DEFAULT_USER_TIP}; - -pub fn calculate_state_transition_fee(state_transition: &impl StateTransitionLike) -> i64 { - let execution_context = state_transition.get_execution_context(); - let fee = calculate_operations_fees(execution_context.get_operations()); - - // Is not implemented yet - let storage_refund = 0; - - (fee.storage + fee.processing) + DEFAULT_USER_TIP - storage_refund -} - -#[cfg(test)] -mod test { - use crate::{ - identity::{ - state_transition::identity_create_transition::IdentityCreateTransition, KeyType, - }, - state_transition::{ - fee::operations::{ - DeleteOperation, Operation, PreCalculatedOperation, ReadOperation, WriteOperation, - }, - state_transition_execution_context::StateTransitionExecutionContext, - StateTransitionLike, - }, - tests::fixtures::identity_create_transition_fixture, - NativeBlsModule, - }; - - use super::calculate_state_transition_fee; - - // TODO: Must be more comprehensive. After we settle all factors and formula. - #[test] - fn should_calculate_fee_based_on_executed_operations() { - let bls = NativeBlsModule::default(); - let private_key = - hex::decode("af432c476f65211f45f48f1d42c9c0b497e56696aa1736b40544ef1a496af837") - .unwrap(); - let mut state_transition = - IdentityCreateTransition::new(identity_create_transition_fixture(None)).unwrap(); - state_transition - .sign_by_private_key(&private_key, KeyType::ECDSA_SECP256K1, &bls) - .expect("signing should be successful"); - - let execution_context = StateTransitionExecutionContext::default(); - execution_context.add_operation(Operation::Read(ReadOperation::new(10))); - execution_context.add_operation(Operation::Write(WriteOperation::new(5, 5))); - execution_context.add_operation(Operation::Delete(DeleteOperation::new(6, 6))); - execution_context.add_operation(Operation::PreCalculated(PreCalculatedOperation::new( - 12, 12, - ))); - state_transition.set_execution_context(execution_context); - - let result = calculate_state_transition_fee(&state_transition); - assert_eq!(13616, result) - } -} diff --git a/packages/rs-dpp/src/state_transition/state_transition_fee/calculate_state_transition_fee_factory.rs b/packages/rs-dpp/src/state_transition/state_transition_fee/calculate_state_transition_fee_factory.rs deleted file mode 100644 index 0b100c9076..0000000000 --- a/packages/rs-dpp/src/state_transition/state_transition_fee/calculate_state_transition_fee_factory.rs +++ /dev/null @@ -1,20 +0,0 @@ -use crate::{ - state_transition::{ - StateTransition, - }, - NonConsensusError, -}; -use crate::fee::fee_result::FeeResult; -use crate::state_transition::state_transition_execution_context::StateTransitionExecutionContext; -use crate::state_transition::state_transition_fee::calculate_state_transition_fee_from_operations_factory::calculate_state_transition_fee_from_operations; - - -pub fn calculate_state_transition_fee( - state_transition: &StateTransition, - execution_context: &StateTransitionExecutionContext, -) -> Result { - calculate_state_transition_fee_from_operations( - &execution_context.get_operations(), - state_transition.owner_id(), - ) -} diff --git a/packages/rs-dpp/src/state_transition/state_transition_fee/calculate_state_transition_fee_from_operations_factory.rs b/packages/rs-dpp/src/state_transition/state_transition_fee/calculate_state_transition_fee_from_operations_factory.rs deleted file mode 100644 index 1a7cb98395..0000000000 --- a/packages/rs-dpp/src/state_transition/state_transition_fee/calculate_state_transition_fee_from_operations_factory.rs +++ /dev/null @@ -1,182 +0,0 @@ -use crate::fee::fee_result::FeeResult; -use crate::state_transition::fee::calculate_operation_fees::calculate_operation_fees; -use crate::state_transition::fee::operations::Operation; -use crate::{prelude::Identifier, NonConsensusError}; - -pub fn calculate_state_transition_fee_from_operations( - operations: &[Operation], - identity_id: &Identifier, -) -> Result { - calculate_state_transition_fee_from_operations_with_custom_calculator( - operations, - identity_id, - calculate_operation_fees, - ) -} - -fn calculate_state_transition_fee_from_operations_with_custom_calculator( - operations: &[Operation], - identity_id: &Identifier, - calculate_operation_fees_fn: impl FnOnce(&[Operation]) -> Result, -) -> Result { - let calculated_fees = calculate_operation_fees_fn(operations)?; - - let storage_fee = calculated_fees.storage; - let processing_fee = calculated_fees.processing; - let fee_refunds = calculated_fees.fee_refunds; - - let mut total_refunds = 0; - - let owner_refunds = fee_refunds - .iter() - .find(|refunds| identity_id == &refunds.identifier); - - if let Some(owner_refunds) = owner_refunds { - total_refunds = owner_refunds - .credits_per_epoch - .iter() - .fold(0, |sum, (_, credits)| sum + credits); - } - - let required_amount = if storage_fee > total_refunds { - (storage_fee - total_refunds) + DEFAULT_USER_TIP - } else { - 0 - }; - - let fee_sum = storage_fee + processing_fee; - - let desired_amount = if fee_sum > total_refunds { - (fee_sum - total_refunds) + DEFAULT_USER_TIP - } else { - 0 - }; - - Ok(FeeResult { - storage_fee, - processing_fee, - fee_refunds, - total_refunds, - required_amount, - desired_amount, - }) -} - -#[cfg(test)] -mod test { - - use platform_value::Identifier; - use std::collections::HashMap; - - use crate::fee::Credits; - use crate::identity::KeyType::ECDSA_SECP256K1; - use crate::state_transition::fee::calculate_operation_fees::calculate_operation_fees; - use crate::state_transition::fee::operations::{ - PreCalculatedOperation, SignatureVerificationOperation, - }; - use crate::{ - state_transition::fee::{operations::Operation, DummyFeesResult, FeeResult, Refunds}, - tests::utils::generate_random_identifier_struct, - NonConsensusError, - }; - - use super::calculate_state_transition_fee_from_operations_with_custom_calculator; - - #[test] - fn should_calculate_fee_based_on_executed_operations() { - let identifier = generate_random_identifier_struct(); - let storage_fee = 10000; - let processing_fee = 1000; - let total_refunds = 1000 + 500; - let required_amount = storage_fee - total_refunds; - let desired_amount = storage_fee + processing_fee - total_refunds; - - let mut credits_per_epoch: HashMap = Default::default(); - credits_per_epoch.insert("0".to_string(), 1000); - credits_per_epoch.insert("1".to_string(), 500); - - let refunds = Refunds { - identifier, - credits_per_epoch, - }; - - let mock = |_operations: &[Operation]| -> Result { - Ok(DummyFeesResult { - storage: storage_fee, - processing: processing_fee, - fee_refunds: vec![refunds.clone()], - }) - }; - - let result = calculate_state_transition_fee_from_operations_with_custom_calculator( - &[], - &identifier, - mock, - ) - .expect("result should be returned"); - let expected = FeeResult { - storage_fee, - processing_fee, - desired_amount, - required_amount, - fee_refunds: vec![refunds], - total_refunds: 1500, - }; - assert_eq!(expected, result); - } - - #[test] - fn test_with_negative_credits() { - // Set of operations that produced by Document Remove Transition - let operations = vec![ - Operation::PreCalculated(PreCalculatedOperation { - storage_cost: 0, - processing_cost: 551320, - fee_refunds: vec![], - }), - Operation::SignatureVerification(SignatureVerificationOperation { - signature_type: ECDSA_SECP256K1, - }), - Operation::PreCalculated(PreCalculatedOperation { - storage_cost: 0, - processing_cost: 551320, - fee_refunds: vec![], - }), - Operation::PreCalculated(PreCalculatedOperation { - storage_cost: 0, - processing_cost: 191260, - fee_refunds: vec![], - }), - Operation::PreCalculated(PreCalculatedOperation { - storage_cost: 0, - processing_cost: 16870910, - fee_refunds: vec![Refunds { - identifier: Identifier::new([ - 130, 188, 56, 7, 78, 143, 58, 212, 133, 162, 145, 56, 186, 219, 191, 75, - 64, 112, 236, 226, 135, 75, 132, 170, 135, 243, 180, 110, 103, 161, 153, - 252, - ]), - credits_per_epoch: [("0".to_string(), 114301030)].iter().cloned().collect(), - }], - }), - ]; - - let identifier = Identifier::new([ - 130, 188, 56, 7, 78, 143, 58, 212, 133, 162, 145, 56, 186, 219, 191, 75, 64, 112, 236, - 226, 135, 75, 132, 170, 135, 243, 180, 110, 103, 161, 153, 252, - ]); - - // Panics because of negative credits - let result = calculate_state_transition_fee_from_operations_with_custom_calculator( - &operations, - &identifier, - calculate_operation_fees, - ); - - assert!(matches!(result, Ok(FeeResult { - desired_amount, - required_amount, - .. - }) if desired_amount == 0 && required_amount == 0)); - } -} diff --git a/packages/rs-dpp/src/state_transition/state_transition_fee/mod.rs b/packages/rs-dpp/src/state_transition/state_transition_fee/mod.rs deleted file mode 100644 index 21f0fa4cbf..0000000000 --- a/packages/rs-dpp/src/state_transition/state_transition_fee/mod.rs +++ /dev/null @@ -1,31 +0,0 @@ - -pub mod calculate_operation_fees; -pub mod calculate_state_transition_fee_factory; -pub mod calculate_state_transition_fee_from_operations_factory; -pub mod operations; -use crate::fee::fee_result::FeeResult; -use enum_map::EnumMap; -// -// #[derive(Debug, Clone, PartialEq, Eq, Default)] -// pub struct FeeResult { -// pub storage_fee: Credits, -// pub processing_fee: Credits, -// pub fee_refunds: Vec, -// pub total_refunds: Credits, -// pub desired_amount: Credits, -// pub required_amount: Credits, -// } - -// #[derive(Debug, Clone, PartialEq, Eq, Default)] -// pub struct DummyFeesResult { -// pub storage: Credits, -// pub processing: Credits, -// pub fee_refunds: Vec, -// } -// -// #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] -// #[serde(rename = "camelCase")] -// pub struct Refunds { -// pub identifier: Identifier, -// pub credits_per_epoch: HashMap, -// } diff --git a/packages/rs-dpp/src/state_transition/state_transition_fee/operations/mod.rs b/packages/rs-dpp/src/state_transition/state_transition_fee/operations/mod.rs deleted file mode 100644 index da2af583e6..0000000000 --- a/packages/rs-dpp/src/state_transition/state_transition_fee/operations/mod.rs +++ /dev/null @@ -1,151 +0,0 @@ -mod precalculated_operation; -pub use precalculated_operation::*; - -mod read_operation; -pub use read_operation::*; - -use serde::{Deserialize, Serialize}; -use serde_json::Value; - -mod signature_verification_operation; -use crate::fee::Credits; -pub use signature_verification_operation::*; - -use crate::NonConsensusError; - - -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] -#[serde(tag = "type", rename_all = "camelCase")] -pub enum Operation { - Read(ReadOperation), - PreCalculated(PreCalculatedOperation), - SignatureVerification(SignatureVerificationOperation), -} - -pub trait OperationLike { - /// Get CPU cost of the operation - fn get_processing_cost(&self) -> Result; - /// Get storage cost of the operation - fn get_storage_cost(&self) -> Result; - - /// Get refunds - fn get_refunds(&self) -> Option<&Vec>; -} - -macro_rules! call_method { - ($operation_type:expr, $method:ident ) => { - match $operation_type { - Operation::Read(op) => op.$method(), - Operation::PreCalculated(op) => op.$method(), - Operation::SignatureVerification(op) => op.$method(), - } - }; -} - -impl OperationLike for Operation { - fn get_processing_cost(&self) -> Result { - call_method!(self, get_processing_cost) - } - - fn get_storage_cost(&self) -> Result { - call_method!(self, get_storage_cost) - } - - fn get_refunds(&self) -> Option<&Vec> { - call_method!(self, get_refunds) - } -} - -impl Operation { - fn try_from_json_str(from: &str) -> Result { - let operation = serde_json::from_str(from)?; - Ok(operation) - } - - fn try_from_json_value(from: Value) -> Result { - let operation = serde_json::from_value(from)?; - Ok(operation) - } - - fn to_json_value(&self) -> Result { - let value = serde_json::to_value(self)?; - Ok(value) - } - - fn to_json_string(&self) -> Result { - let json_string = serde_json::to_string_pretty(self)?; - Ok(json_string) - } -} - -#[cfg(test)] -mod test { - use super::{Operation, PreCalculatedOperation, ReadOperation, SignatureVerificationOperation}; - use crate::identity::KeyType; - use serde_json::json; - - struct TestCase { - json_str: String, - operation: Operation, - } - - macro_rules! json_string { - ($($json:tt)+) => { - serde_json::to_string_pretty(&json!($($json)+)).unwrap() - }; - } - - #[test] - fn test_deserialize_json_read_operation() { - let cases = vec![ - TestCase { - json_str: json_string!({ - "type": "read", - "valueSize" : 123, - }), - operation: Operation::Read(ReadOperation { value_size: 123 }), - }, - TestCase { - json_str: json_string!({ - "type": "preCalculated", - "storageCost" : 12357, - "processingCost" : 468910, - "feeRefunds" : [], - }), - operation: Operation::PreCalculated(PreCalculatedOperation { - storage_cost: 12357, - processing_cost: 468910, - fee_refunds: vec![], - }), - }, - TestCase { - json_str: json_string!({ - "type": "signatureVerification", - "signatureType" : 1, - - }), - operation: Operation::SignatureVerification(SignatureVerificationOperation { - signature_type: KeyType::BLS12_381, - }), - }, - ]; - - for case in cases { - let operation = Operation::try_from_json_str(&case.json_str) - .unwrap_or_else(|e| panic!("failed deserializing: {}: {}", case.json_str, e)); - assert_eq!( - case.operation, operation, - "failed deserializing: {}", - case.json_str - ); - assert_eq!( - case.json_str, - operation - .to_json_string() - .unwrap_or_else(|e| panic!("failed serializing: {}: {}", case.json_str, e)), - "failed serializing: {}", - case.json_str - ); - } - } -} diff --git a/packages/rs-dpp/src/state_transition/state_transition_fee/operations/precalculated_operation.rs b/packages/rs-dpp/src/state_transition/state_transition_fee/operations/precalculated_operation.rs deleted file mode 100644 index 48035cff8c..0000000000 --- a/packages/rs-dpp/src/state_transition/state_transition_fee/operations/precalculated_operation.rs +++ /dev/null @@ -1,50 +0,0 @@ -use serde::{Deserialize, Serialize}; - -use crate::fee::Credits; -use crate::NonConsensusError; - -use super::OperationLike; - -#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] -#[serde(rename_all = "camelCase")] -pub struct PreCalculatedOperation { - pub storage_cost: Credits, - pub processing_cost: Credits, - pub fee_refunds: Vec, -} - -impl PreCalculatedOperation { - pub fn from_fee(fee: DummyFeesResult) -> Self { - Self { - fee_refunds: fee.fee_refunds, - processing_cost: fee.processing, - storage_cost: fee.storage, - } - } - - pub fn new( - storage_cost: Credits, - processing_cost: Credits, - fee_refunds: impl IntoIterator, - ) -> Self { - Self { - storage_cost, - processing_cost, - fee_refunds: fee_refunds.into_iter().collect(), - } - } -} - -impl OperationLike for PreCalculatedOperation { - fn get_processing_cost(&self) -> Result { - Ok(self.processing_cost) - } - - fn get_storage_cost(&self) -> Result { - Ok(self.storage_cost) - } - - fn get_refunds(&self) -> Option<&Vec> { - Some(&self.fee_refunds) - } -} diff --git a/packages/rs-dpp/src/state_transition/state_transition_fee/operations/read_operation.rs b/packages/rs-dpp/src/state_transition/state_transition_fee/operations/read_operation.rs deleted file mode 100644 index e835d686d6..0000000000 --- a/packages/rs-dpp/src/state_transition/state_transition_fee/operations/read_operation.rs +++ /dev/null @@ -1,44 +0,0 @@ -use serde::{Deserialize, Serialize}; - -use super::OperationLike; - -use crate::fee::default_costs::constants::{PROCESSING_CREDIT_PER_BYTE, READ_BASE_PROCESSING_COST}; -use crate::fee::Credits; -use crate::NonConsensusError; - -#[derive(Default, Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)] -#[serde(rename_all = "camelCase")] -pub struct ReadOperation { - pub value_size: Credits, -} - -impl ReadOperation { - pub fn new(value_size: u64) -> Self { - Self { value_size } - } -} - -impl OperationLike for ReadOperation { - fn get_processing_cost(&self) -> Result { - let value_byte_processing_cost = self - .value_size - .checked_mul(PROCESSING_CREDIT_PER_BYTE) - .ok_or(NonConsensusError::Overflow( - "value processing cost is too big", - ))?; - - READ_BASE_PROCESSING_COST - .checked_add(value_byte_processing_cost) - .ok_or(NonConsensusError::Overflow( - "can't add read base processing cost", - )) - } - - fn get_storage_cost(&self) -> Result { - Ok(0) - } - - fn get_refunds(&self) -> Option<&Vec> { - None - } -} diff --git a/packages/rs-dpp/src/state_transition/state_transition_fee/state_transition_execution_context.rs b/packages/rs-dpp/src/state_transition/state_transition_fee/state_transition_execution_context.rs deleted file mode 100644 index b2bdf38356..0000000000 --- a/packages/rs-dpp/src/state_transition/state_transition_fee/state_transition_execution_context.rs +++ /dev/null @@ -1,92 +0,0 @@ - -use crate::state_transition::state_transition_fee::operations::Operation; - - -#[derive(Debug, Clone, Default)] -pub struct StateTransitionExecutionContext { - operations : Vec, -} -// -// #[derive(Default, Debug, Clone)] -// struct StateTransitionContextInner { -// actual_operations: Vec, -// dry_run_operations: Vec, -// is_dry_run: bool, -// } -// -// impl StateTransitionExecutionContext { -// /// Add [`Operation`] into the execution context -// pub fn add_operation(&self, operation: Operation) { -// let mut inner = self.inner.lock().unwrap(); -// if inner.is_dry_run { -// inner.dry_run_operations.push(operation); -// } else { -// inner.actual_operations.push(operation); -// } -// } -// -// /// Add more than one [`Operation`] into the execution context -// pub fn add_operations(&self, operations: impl IntoIterator) { -// let mut inner = self.inner.lock().unwrap(); -// if inner.is_dry_run { -// inner.dry_run_operations.extend(operations); -// } else { -// inner.actual_operations.extend(operations); -// } -// } -// -// /// Replace all existing operations with a new collection of operations -// pub fn set_operations(&self, operations: Vec) { -// let mut inner = self.inner.lock().unwrap(); -// inner.actual_operations = operations -// } -// -// /// Returns dry run operations -// pub fn get_dry_operations(&self) -> Vec { -// let inner = self.inner.lock().unwrap(); -// inner.dry_run_operations.to_vec() -// } -// -// /// Returns all (actual & dry run) operations -// pub fn get_operations(&self) -> Vec { -// let inner = self.inner.lock().unwrap(); -// inner -// .actual_operations -// .iter() -// // TODO remove cloning -// .cloned() -// // TODO remove cloning -// .chain(inner.dry_run_operations.iter().cloned()) -// .collect() -// } -// -// /// Enable dry run -// pub fn enable_dry_run(&self) { -// let mut inner = self.inner.lock().unwrap(); -// inner.is_dry_run = true; -// } -// -// /// Enable dry run -// pub fn with_dry_run(self) -> Self { -// let mut inner = self.inner.lock().unwrap(); -// inner.is_dry_run = true; -// drop(inner); -// self -// } -// -// /// Disable dry run -// pub fn disable_dry_run(&self) { -// let mut inner = self.inner.lock().unwrap(); -// inner.is_dry_run = false; -// } -// -// pub fn clear_dry_run_operations(&self) { -// let mut inner = self.inner.lock().unwrap(); -// inner.dry_run_operations.clear() -// } -// -// pub fn is_dry_run(&self) -> bool { -// let inner = self.inner.lock().unwrap(); -// inner.is_dry_run -// } -// } diff --git a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/execute_event/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/execute_event/v0/mod.rs index d0f889d64a..3ce51b7a55 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/execute_event/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/execute_event/v0/mod.rs @@ -1,5 +1,7 @@ +use crate::error::execution::ExecutionError; use crate::error::Error; use crate::execution::types::execution_event::ExecutionEvent; +use crate::execution::types::execution_operation::{ExecutionOperation, OperationLike}; use crate::platform_types::platform::Platform; use crate::platform_types::state_transition_execution_result::StateTransitionExecutionResult; use crate::platform_types::state_transition_execution_result::StateTransitionExecutionResult::{ @@ -54,15 +56,17 @@ where ExecutionEvent::PaidFromAssetLockDriveEvent { identity, operations, + execution_operations, .. } | ExecutionEvent::PaidDriveEvent { identity, operations, + execution_operations, } => { if validation_result.is_valid_with_data() { //todo: make this into an atomic event with partial batches - let individual_fee_result = self + let mut individual_fee_result = self .drive .apply_drive_operations( operations, @@ -73,6 +77,13 @@ where ) .map_err(Error::Drive)?; + ExecutionOperation::add_many_to_fee_result( + &execution_operations, + &mut individual_fee_result, + &block_info.epoch, + platform_version, + )?; + let balance_change = individual_fee_result.into_balance_change(identity.id); let outcome = self.drive.apply_balance_change_from_fee_to_identity( diff --git a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/validate_fees_of_event/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/validate_fees_of_event/v0/mod.rs index d2d35895c9..fdb4bccf7f 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/validate_fees_of_event/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/validate_fees_of_event/v0/mod.rs @@ -1,14 +1,17 @@ use crate::error::execution::ExecutionError; use crate::error::Error; use crate::execution::types::execution_event::ExecutionEvent; +use crate::execution::types::execution_operation::{ExecutionOperation, OperationLike}; use crate::platform_types::platform::Platform; use crate::rpc::core::CoreRPCLike; use dpp::block::block_info::BlockInfo; use dpp::consensus::state::identity::IdentityInsufficientBalanceError; use dpp::consensus::state::state_error::StateError; use dpp::fee::fee_result::FeeResult; +use dpp::fee::Credits; use dpp::prelude::ConsensusValidationResult; use dpp::version::PlatformVersion; +use dpp::ProtocolError; use drive::grovedb::TransactionArg; impl Platform @@ -44,12 +47,13 @@ where identity, added_balance, operations, + execution_operations, } => { let previous_balance = identity.balance.ok_or(Error::Execution( ExecutionError::CorruptedCodeExecution("partial identity info with no balance"), ))?; let previous_balance_with_top_up = previous_balance + added_balance; - let estimated_fee_result = self + let mut estimated_fee_result = self .drive .apply_drive_operations( operations.clone(), @@ -60,6 +64,13 @@ where ) .map_err(Error::Drive)?; + ExecutionOperation::add_many_to_fee_result( + execution_operations, + &mut estimated_fee_result, + &block_info.epoch, + platform_version, + )?; + // TODO: Should take into account refunds as well let total_fee = estimated_fee_result.total_base_fee(); if previous_balance_with_top_up >= total_fee { @@ -83,11 +94,12 @@ where ExecutionEvent::PaidDriveEvent { identity, operations, + execution_operations, } => { let balance = identity.balance.ok_or(Error::Execution( ExecutionError::CorruptedCodeExecution("partial identity info with no balance"), ))?; - let estimated_fee_result = self + let mut estimated_fee_result = self .drive .apply_drive_operations( operations.clone(), @@ -98,6 +110,13 @@ where ) .map_err(Error::Drive)?; + ExecutionOperation::add_many_to_fee_result( + execution_operations, + &mut estimated_fee_result, + &block_info.epoch, + platform_version, + )?; + // TODO: Should take into account refunds as well let required_balance = estimated_fee_result.total_base_fee(); if balance >= required_balance { diff --git a/packages/rs-drive-abci/src/execution/types/execution_event/mod.rs b/packages/rs-drive-abci/src/execution/types/execution_event/mod.rs index 9e799bd064..43602f7fe1 100644 --- a/packages/rs-drive-abci/src/execution/types/execution_event/mod.rs +++ b/packages/rs-drive-abci/src/execution/types/execution_event/mod.rs @@ -13,6 +13,10 @@ use dpp::identity::PartialIdentity; use dpp::version::PlatformVersion; use drive::state_transition_action::StateTransitionAction; +use crate::execution::types::execution_operation::ExecutionOperation; +use crate::execution::types::state_transition_execution_context::{ + StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0, +}; use drive::drive::batch::transitions::DriveHighLevelOperationConverter; use drive::drive::batch::DriveOperation; @@ -25,6 +29,8 @@ pub(in crate::execution) enum ExecutionEvent<'a> { identity: PartialIdentity, /// the operations that the identity is requesting to perform operations: Vec>, + /// the execution operations that we must also pay for + execution_operations: Vec, }, /// A drive event that is paid from an asset lock PaidFromAssetLockDriveEvent { @@ -34,6 +40,8 @@ pub(in crate::execution) enum ExecutionEvent<'a> { added_balance: Credits, /// the operations that should be performed operations: Vec>, + /// the execution operations that we must also pay for + execution_operations: Vec, }, /// A drive event that is free FreeDriveEvent { @@ -42,44 +50,12 @@ pub(in crate::execution) enum ExecutionEvent<'a> { }, } -impl<'a> ExecutionEvent<'a> { - /// Creates a new identity Insertion Event - pub fn new_document_operation( - identity: PartialIdentity, - operation: DriveOperation<'a>, - ) -> Self { - Self::PaidDriveEvent { - identity, - operations: vec![operation], - } - } - /// Creates a new identity Insertion Event - pub fn new_contract_operation( - identity: PartialIdentity, - operation: DriveOperation<'a>, - ) -> Self { - Self::PaidDriveEvent { - identity, - operations: vec![operation], - } - } - /// Creates a new identity Insertion Event - pub fn new_identity_insertion( - identity: PartialIdentity, - operations: Vec>, - ) -> Self { - Self::PaidDriveEvent { - identity, - operations, - } - } -} - impl<'a> ExecutionEvent<'a> { pub(crate) fn create_from_state_transition_action( action: StateTransitionAction, identity: Option, epoch: &Epoch, + execution_context: StateTransitionExecutionContext, platform_version: &PlatformVersion, ) -> Result { match &action { @@ -91,6 +67,7 @@ impl<'a> ExecutionEvent<'a> { identity, added_balance: 0, operations, + execution_operations: execution_context.operations_consume(), }) } StateTransitionAction::IdentityTopUpAction(identity_top_up_action) => { @@ -102,6 +79,7 @@ impl<'a> ExecutionEvent<'a> { identity, added_balance, operations, + execution_operations: execution_context.operations_consume(), }) } else { Err(Error::Execution(ExecutionError::CorruptedCodeExecution( @@ -116,6 +94,7 @@ impl<'a> ExecutionEvent<'a> { Ok(PaidDriveEvent { identity, operations, + execution_operations: execution_context.operations_consume(), }) } else { Err(Error::Execution(ExecutionError::CorruptedCodeExecution( diff --git a/packages/rs-drive-abci/src/execution/types/execution_operation/mod.rs b/packages/rs-drive-abci/src/execution/types/execution_operation/mod.rs index 68530fb10e..eef958f13a 100644 --- a/packages/rs-drive-abci/src/execution/types/execution_operation/mod.rs +++ b/packages/rs-drive-abci/src/execution/types/execution_operation/mod.rs @@ -1,5 +1,9 @@ +use crate::error::execution::ExecutionError; use crate::error::Error; use crate::execution::types::execution_operation::signature_verification_operation::SignatureVerificationOperation; +use dpp::block::epoch::Epoch; +use dpp::fee::default_costs::EpochCosts; +use dpp::fee::default_costs::KnownCostItem::DoubleSHA256; use dpp::fee::fee_result::FeeResult; use dpp::fee::Credits; use dpp::version::PlatformVersion; @@ -8,12 +12,54 @@ pub mod signature_verification_operation; #[derive(Debug, Clone, PartialEq, Eq)] pub enum ExecutionOperation { + DoubleSha256, SignatureVerification(SignatureVerificationOperation), PrecalculatedOperation(FeeResult), } pub trait OperationLike { - fn processing_cost(&self, platform_version: &PlatformVersion) -> Result; + fn processing_cost( + &self, + epoch: &Epoch, + platform_version: &PlatformVersion, + ) -> Result; fn storage_cost(&self, platform_version: &PlatformVersion) -> Result; } + +impl ExecutionOperation { + pub fn add_many_to_fee_result( + execution_operations: &[ExecutionOperation], + fee_result: &mut FeeResult, + epoch: &Epoch, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + for execution_operation in execution_operations { + match execution_operation { + ExecutionOperation::SignatureVerification(signature_verification_operation) => { + fee_result.processing_fee = fee_result + .processing_fee + .checked_add( + signature_verification_operation + .processing_cost(epoch, platform_version)?, + ) + .ok_or(ExecutionError::Overflow( + "execution processing fee overflow error", + ))?; + } + ExecutionOperation::PrecalculatedOperation(precalculated_operation) => { + fee_result.checked_add_assign(precalculated_operation.clone())?; + } + ExecutionOperation::DoubleSha256 => { + fee_result.processing_fee = fee_result + .processing_fee + .checked_add(epoch.cost_for_known_cost_item(DoubleSHA256)) + .ok_or(ExecutionError::Overflow( + "execution processing fee overflow error", + ))?; + } + } + } + Ok(()) + } +} diff --git a/packages/rs-drive-abci/src/execution/types/execution_operation/signature_verification_operation.rs b/packages/rs-drive-abci/src/execution/types/execution_operation/signature_verification_operation.rs index f290dbd312..77bf8aeff7 100644 --- a/packages/rs-drive-abci/src/execution/types/execution_operation/signature_verification_operation.rs +++ b/packages/rs-drive-abci/src/execution/types/execution_operation/signature_verification_operation.rs @@ -1,5 +1,6 @@ use crate::error::Error; use crate::execution::types::execution_operation::OperationLike; +use dpp::block::epoch::Epoch; use dpp::fee::Credits; use dpp::identity::KeyType; use dpp::version::PlatformVersion; @@ -16,10 +17,14 @@ impl SignatureVerificationOperation { } impl OperationLike for SignatureVerificationOperation { - fn processing_cost(&self, platform_version: &PlatformVersion) -> Result { + fn processing_cost( + &self, + epoch: &Epoch, + platform_version: &PlatformVersion, + ) -> Result { Ok(self .signature_type - .signature_verify_cost(platform_version)?) + .signature_verify_cost(platform_version, epoch)?) } fn storage_cost(&self, _platform_version: &PlatformVersion) -> Result { diff --git a/packages/rs-drive-abci/src/execution/types/mod.rs b/packages/rs-drive-abci/src/execution/types/mod.rs index 1a50965d3d..01865f961c 100644 --- a/packages/rs-drive-abci/src/execution/types/mod.rs +++ b/packages/rs-drive-abci/src/execution/types/mod.rs @@ -15,7 +15,7 @@ pub(in crate::execution) mod processed_block_fees_outcome; /// Proposer payouts pub(in crate::execution) mod proposer_payouts; /// A structure representing the context of the execution of a state transition -pub(in crate::execution) mod state_transition_execution_context; +pub mod state_transition_execution_context; /// A structure used in the distribution of storage fees pub(in crate::execution) mod storage_fee_distribution_outcome; /// A structure representing an unpaid epoch diff --git a/packages/rs-drive-abci/src/execution/types/state_transition_execution_context/mod.rs b/packages/rs-drive-abci/src/execution/types/state_transition_execution_context/mod.rs index a3b397de51..60b33ac4f8 100644 --- a/packages/rs-drive-abci/src/execution/types/state_transition_execution_context/mod.rs +++ b/packages/rs-drive-abci/src/execution/types/state_transition_execution_context/mod.rs @@ -5,21 +5,32 @@ use crate::execution::types::state_transition_execution_context::v0::StateTransi use derive_more::From; use dpp::version::{DefaultForPlatformVersion, PlatformVersion}; +/// V0 module pub mod v0; #[derive(Debug, Clone, From)] +/// The state transition execution context pub enum StateTransitionExecutionContext { + /// Version 0 V0(StateTransitionExecutionContextV0), } +/// The trait defining state transition execution context methods for v0 pub trait StateTransitionExecutionContextMethodsV0 { + /// Add an operation to the state transition execution context fn add_operation(&mut self, operation: ExecutionOperation); + /// Add a operations to the state transition execution context fn add_operations(&mut self, operations: Vec); + /// Consume the operations of the context fn operations_consume(self) -> Vec; + /// Returns a slice of operations, does not consume the context fn operations_slice(&self) -> &[ExecutionOperation]; + /// Are we in a dry run? fn in_dry_run(&self) -> bool; + /// Set us to be in a dry run fn enable_dry_run(&mut self); + /// Set us not to be in a dry run fn disable_dry_run(&mut self); } diff --git a/packages/rs-drive-abci/src/execution/types/state_transition_execution_context/v0/mod.rs b/packages/rs-drive-abci/src/execution/types/state_transition_execution_context/v0/mod.rs index dbf0c50825..2431337fb1 100644 --- a/packages/rs-drive-abci/src/execution/types/state_transition_execution_context/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/types/state_transition_execution_context/v0/mod.rs @@ -1,9 +1,12 @@ use crate::execution::types::execution_operation::ExecutionOperation; +/// The V0 struct of the state transition execution context #[derive(Debug, Clone, Default)] pub struct StateTransitionExecutionContextV0 { // Are we executing the state transition in a dry run // Dry run is execution on check tx + /// Are we in a dry run? pub dry_run: bool, + /// The execution operations pub operations: Vec, } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_state_transition_identity_signed/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_state_transition_identity_signed/v0/mod.rs index be7cd864eb..57fc44ec35 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_state_transition_identity_signed/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_state_transition_identity_signed/v0/mod.rs @@ -166,10 +166,6 @@ impl<'a> ValidateStateTransitionIdentitySignatureV0<'a> for StateTransition { let operation = SignatureVerificationOperation::new(public_key.key_type()); execution_context.add_operation(ExecutionOperation::SignatureVerification(operation)); - // if execution_context.is_dry_run() { - // return Ok(validation_result); - // } - let signature_is_valid = self.verify_signature(public_key, &NativeBlsModule); if let Err(err) = signature_is_valid { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs index 4f9f4f7d35..80bbbfa688 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs @@ -4,7 +4,7 @@ use crate::execution::validation::state_transition::transformer::StateTransition use crate::platform_types::platform::{PlatformRef, PlatformStateRef}; use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::rpc::core::CoreRPCLike; -use dpp::identity::PartialIdentity; +use dpp::identity::{KeyType, PartialIdentity}; use dpp::prelude::ConsensusValidationResult; use dpp::serialization::Signable; @@ -15,7 +15,9 @@ use dpp::version::{DefaultForPlatformVersion, PlatformVersion}; use drive::drive::Drive; use drive::grovedb::TransactionArg; use crate::error::execution::ExecutionError; -use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; +use crate::execution::types::execution_operation::ExecutionOperation; +use crate::execution::types::execution_operation::signature_verification_operation::SignatureVerificationOperation; +use crate::execution::types::state_transition_execution_context::{StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0}; use crate::execution::validation::state_transition::common::validate_state_transition_identity_signed::{ValidateStateTransitionIdentitySignature}; use crate::execution::validation::state_transition::state_transitions::identity_update::identity_and_signatures::v0::IdentityUpdateStateTransitionIdentityAndSignaturesValidationV0; use crate::execution::validation::state_transition::state_transitions::identity_create::identity_and_signatures::v0::IdentityCreateStateTransitionIdentityAndSignaturesValidationV0; @@ -31,8 +33,12 @@ pub(in crate::execution) fn process_state_transition_v0<'a, C: CoreRPCLike>( StateTransitionExecutionContext::default_for_platform_version(platform_version)?; let action = if state_transition.requires_state_to_validate_structure() { - let state_transition_action_result = - state_transition.transform_into_action(platform, true, transaction)?; + let state_transition_action_result = state_transition.transform_into_action( + platform, + true, + &mut state_transition_execution_context, + transaction, + )?; if !state_transition_action_result.is_valid_with_data() { return Ok( ConsensusValidationResult::::new_with_errors( @@ -59,8 +65,12 @@ pub(in crate::execution) fn process_state_transition_v0<'a, C: CoreRPCLike>( if let Some(action) = action { Some(action) } else { - let state_transition_action_result = - state_transition.transform_into_action(platform, true, transaction)?; + let state_transition_action_result = state_transition.transform_into_action( + platform, + true, + &mut state_transition_execution_context, + transaction, + )?; if !state_transition_action_result.is_valid_with_data() { return Ok( ConsensusValidationResult::::new_with_errors( @@ -89,13 +99,19 @@ pub(in crate::execution) fn process_state_transition_v0<'a, C: CoreRPCLike>( let maybe_identity = result.into_data()?; // Validating state - let result = state_transition.validate_state(action, platform, transaction)?; + let result = state_transition.validate_state( + action, + platform, + &mut state_transition_execution_context, + transaction, + )?; result.map_result(|action| { ExecutionEvent::create_from_state_transition_action( action, maybe_identity, platform.state.epoch_ref(), + state_transition_execution_context, platform_version, ) }) @@ -170,6 +186,7 @@ pub(crate) trait StateTransitionStateValidationV0: &self, action: Option, platform: &PlatformRef, + execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, ) -> Result, Error>; } @@ -264,6 +281,7 @@ impl StateTransitionSignatureValidationV0 for StateTransition { .validate_identity_update_state_transition_signatures_v0( signable_bytes, partial_identity, + execution_context, )?; validation_result.merge(result); Ok(validation_result.map(Some)) @@ -300,6 +318,7 @@ impl StateTransitionSignatureValidationV0 for StateTransition { let result = st.validate_identity_create_state_transition_signatures_v0( signable_bytes, + execution_context, )?; validation_result.merge(result); @@ -358,19 +377,34 @@ impl StateTransitionStateValidationV0 for StateTransition { &self, action: Option, platform: &PlatformRef, + execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, ) -> Result, Error> { match self { - StateTransition::DataContractCreate(st) => st.validate_state(action, platform, tx), - StateTransition::DataContractUpdate(st) => st.validate_state(action, platform, tx), - StateTransition::IdentityCreate(st) => st.validate_state(action, platform, tx), - StateTransition::IdentityUpdate(st) => st.validate_state(action, platform, tx), - StateTransition::IdentityTopUp(st) => st.validate_state(action, platform, tx), + StateTransition::DataContractCreate(st) => { + st.validate_state(action, platform, execution_context, tx) + } + StateTransition::DataContractUpdate(st) => { + st.validate_state(action, platform, execution_context, tx) + } + StateTransition::IdentityCreate(st) => { + st.validate_state(action, platform, execution_context, tx) + } + StateTransition::IdentityUpdate(st) => { + st.validate_state(action, platform, execution_context, tx) + } + StateTransition::IdentityTopUp(st) => { + st.validate_state(action, platform, execution_context, tx) + } StateTransition::IdentityCreditWithdrawal(st) => { - st.validate_state(action, platform, tx) + st.validate_state(action, platform, execution_context, tx) + } + StateTransition::DocumentsBatch(st) => { + st.validate_state(action, platform, execution_context, tx) + } + StateTransition::IdentityCreditTransfer(st) => { + st.validate_state(action, platform, execution_context, tx) } - StateTransition::DocumentsBatch(st) => st.validate_state(action, platform, tx), - StateTransition::IdentityCreditTransfer(st) => st.validate_state(action, platform, tx), } } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs index 1238d95630..1e048a17f2 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs @@ -11,6 +11,7 @@ use drive::state_transition_action::StateTransitionAction; use crate::error::execution::ExecutionError; use crate::error::Error; +use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; use crate::execution::validation::state_transition::data_contract_create::state::v0::DataContractCreateStateTransitionStateValidationV0; use crate::execution::validation::state_transition::data_contract_create::structure::v0::DataContractCreatedStateTransitionStructureValidationV0; @@ -28,6 +29,7 @@ impl StateTransitionActionTransformerV0 for DataContractCreateTransition { &self, platform: &PlatformRef, _validate: bool, + _execution_context: &mut StateTransitionExecutionContext, _tx: TransactionArg, ) -> Result, Error> { let platform_version = @@ -79,6 +81,7 @@ impl StateTransitionStateValidationV0 for DataContractCreateTransition { &self, _action: Option, platform: &PlatformRef, + _execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, ) -> Result, Error> { let platform_version = diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs index 1fc864b41f..151eca048e 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs @@ -9,6 +9,7 @@ use drive::grovedb::TransactionArg; use crate::error::execution::ExecutionError; use crate::error::Error; +use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; use dpp::version::PlatformVersion; use drive::state_transition_action::StateTransitionAction; @@ -27,6 +28,7 @@ impl StateTransitionActionTransformerV0 for DataContractUpdateTransition { &self, platform: &PlatformRef, _validate: bool, + _execution_context: &mut StateTransitionExecutionContext, _tx: TransactionArg, ) -> Result, Error> { let platform_version = @@ -78,6 +80,7 @@ impl StateTransitionStateValidationV0 for DataContractUpdateTransition { &self, _action: Option, platform: &PlatformRef, + _execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, ) -> Result, Error> { let platform_version = @@ -184,9 +187,10 @@ mod tests { use dpp::platform_value::platform_value; use dpp::state_transition::data_contract_update_transition::DataContractUpdateTransition; + use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; use dpp::version::TryFromPlatformVersioned; use platform_version::version::LATEST_PLATFORM_VERSION; - use platform_version::TryIntoPlatformVersioned; + use platform_version::{DefaultForPlatformVersion, TryIntoPlatformVersioned}; #[test] pub fn should_return_error_if_trying_to_update_document_schema_in_a_readonly_contract() { @@ -241,8 +245,12 @@ mod tests { block_info: &BlockInfo::default(), }; + let mut execution_context = + StateTransitionExecutionContext::default_for_platform_version(platform_version) + .expect("expected a platform version"); + let result = DataContractUpdateTransition::V0(state_transition) - .validate_state(None, &platform_ref, None) + .validate_state(None, &platform_ref, &mut execution_context, None) .expect("state transition to be validated"); assert!(!result.is_valid()); @@ -315,8 +323,12 @@ mod tests { block_info: &BlockInfo::default(), }; + let mut execution_context = + StateTransitionExecutionContext::default_for_platform_version(platform_version) + .expect("expected a platform version"); + let result = DataContractUpdateTransition::V0(state_transition) - .validate_state(None, &platform_ref, None) + .validate_state(None, &platform_ref, &mut execution_context, None) .expect("state transition to be validated"); assert!(result.is_valid()); @@ -398,6 +410,8 @@ mod tests { platform, } = setup_test(); + let platform_version = PlatformVersion::latest(); + data_contract.config_mut().set_keeps_history(true); data_contract.config_mut().set_readonly(false); @@ -458,8 +472,12 @@ mod tests { block_info: &BlockInfo::default(), }; + let mut execution_context = + StateTransitionExecutionContext::default_for_platform_version(platform_version) + .expect("expected a platform version"); + let result = state_transition - .validate_state(None, &platform_ref, None) + .validate_state(None, &platform_ref, &mut execution_context, None) .expect("state transition to be validated"); assert!(!result.is_valid()); diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs index 9e629b2772..1158428f2e 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs @@ -14,6 +14,7 @@ use drive::grovedb::TransactionArg; use crate::error::execution::ExecutionError; use crate::error::Error; +use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; use crate::platform_types::platform::{PlatformRef, PlatformStateRef}; use crate::rpc::core::CoreRPCLike; @@ -32,6 +33,7 @@ impl StateTransitionActionTransformerV0 for DocumentsBatchTransition { &self, platform: &PlatformRef, validate: bool, + _execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, ) -> Result, Error> { let platform_version = @@ -100,6 +102,7 @@ impl StateTransitionStateValidationV0 for DocumentsBatchTransition { &self, action: Option, platform: &PlatformRef, + _execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, ) -> Result, Error> { let platform_version = diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/identity_and_signatures/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/identity_and_signatures/v0/mod.rs index 4ab68979ba..3a524ce440 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/identity_and_signatures/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/identity_and_signatures/v0/mod.rs @@ -5,6 +5,11 @@ use dpp::consensus::basic::BasicError; use dpp::consensus::ConsensusError; use dpp::identity::state_transition::AssetLockProved; +use crate::execution::types::execution_operation::signature_verification_operation::SignatureVerificationOperation; +use crate::execution::types::execution_operation::ExecutionOperation; +use crate::execution::types::state_transition_execution_context::{ + StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0, +}; use dpp::prelude::ConsensusValidationResult; use dpp::serialization::PlatformMessageSignable; use dpp::state_transition::identity_create_transition::accessors::IdentityCreateTransitionAccessorsV0; @@ -16,6 +21,7 @@ pub(crate) trait IdentityCreateStateTransitionIdentityAndSignaturesValidationV0 fn validate_identity_create_state_transition_signatures_v0( &self, signable_bytes: Vec, + execution_context: &mut StateTransitionExecutionContext, ) -> Result; } @@ -23,6 +29,7 @@ impl IdentityCreateStateTransitionIdentityAndSignaturesValidationV0 for Identity fn validate_identity_create_state_transition_signatures_v0( &self, signable_bytes: Vec, + execution_context: &mut StateTransitionExecutionContext, ) -> Result { let mut validation_result = SimpleConsensusValidationResult::default(); for key in self.public_keys().iter() { @@ -31,6 +38,9 @@ impl IdentityCreateStateTransitionIdentityAndSignaturesValidationV0 for Identity key.data().as_slice(), key.signature().as_slice(), )?; + execution_context.add_operation(ExecutionOperation::SignatureVerification( + SignatureVerificationOperation::new(key.key_type()), + )); if !result.is_valid() { validation_result.add_errors(result.errors); } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/mod.rs index ad40672612..3cc78530b0 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/mod.rs @@ -22,6 +22,7 @@ use dpp::state_transition::identity_create_transition::IdentityCreateTransition; use dpp::validation::SimpleConsensusValidationResult; use dpp::version::PlatformVersion; +use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; use drive::grovedb::TransactionArg; use drive::state_transition_action::StateTransitionAction; @@ -30,6 +31,7 @@ impl StateTransitionActionTransformerV0 for IdentityCreateTransition { &self, platform: &PlatformRef, _validate: bool, + execution_context: &mut StateTransitionExecutionContext, _tx: TransactionArg, ) -> Result, Error> { let platform_version = platform.state.current_platform_version()?; @@ -40,7 +42,7 @@ impl StateTransitionActionTransformerV0 for IdentityCreateTransition { .identity_create_state_transition .transform_into_action { - 0 => self.transform_into_action_v0(platform, platform_version), + 0 => self.transform_into_action_v0(platform, execution_context, platform_version), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "identity create transition: transform_into_action".to_string(), known_versions: vec![0], @@ -80,6 +82,7 @@ impl StateTransitionStateValidationV0 for IdentityCreateTransition { &self, _action: Option, platform: &PlatformRef, + execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, ) -> Result, Error> { let platform_version = platform.state.current_platform_version()?; @@ -90,7 +93,7 @@ impl StateTransitionStateValidationV0 for IdentityCreateTransition { .identity_create_state_transition .state { - 0 => self.validate_state_v0(platform, tx, platform_version), + 0 => self.validate_state_v0(platform, execution_context, tx, platform_version), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "identity create transition: validate_state".to_string(), known_versions: vec![0], diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/state/v0/mod.rs index d4ce966185..1de5fa9aeb 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/state/v0/mod.rs @@ -6,6 +6,7 @@ use dpp::consensus::signature::{BasicECDSAError, SignatureError}; use dpp::consensus::state::identity::IdentityAlreadyExistsError; use dpp::dashcore::signer; use dpp::dashcore::signer::double_sha; +use dpp::identity::KeyType; use dpp::identity::state_transition::AssetLockProved; use dpp::prelude::ConsensusValidationResult; @@ -21,7 +22,9 @@ use drive::state_transition_action::StateTransitionAction; use drive::grovedb::TransactionArg; use dpp::version::DefaultForPlatformVersion; use crate::error::execution::ExecutionError; -use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; +use crate::execution::types::execution_operation::ExecutionOperation; +use crate::execution::types::execution_operation::signature_verification_operation::SignatureVerificationOperation; +use crate::execution::types::state_transition_execution_context::{StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0}; use crate::execution::validation::state_transition::common::asset_lock::proof::AssetLockProofStateValidation; use crate::execution::validation::state_transition::common::asset_lock::transaction::fetch_asset_lock_transaction_output_sync::fetch_asset_lock_transaction_output_sync; use crate::execution::validation::state_transition::common::validate_unique_identity_public_key_hashes_in_state::validate_unique_identity_public_key_hashes_in_state; @@ -31,6 +34,7 @@ pub(in crate::execution::validation::state_transition::state_transitions::identi fn validate_state_v0( &self, platform: &PlatformRef, + execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, platform_version: &PlatformVersion, ) -> Result, Error>; @@ -38,6 +42,7 @@ pub(in crate::execution::validation::state_transition::state_transitions::identi fn transform_into_action_v0( &self, platform: &PlatformRef, + execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion, ) -> Result, Error>; } @@ -46,6 +51,7 @@ impl IdentityCreateStateTransitionStateValidationV0 for IdentityCreateTransition fn validate_state_v0( &self, platform: &PlatformRef, + execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, platform_version: &PlatformVersion, ) -> Result, Error> { @@ -66,6 +72,7 @@ impl IdentityCreateStateTransitionStateValidationV0 for IdentityCreateTransition } // Validate asset lock proof state + //todo: add costs for state validation validation_result.merge(self.asset_lock_proof().validate_state( platform, tx, @@ -92,12 +99,13 @@ impl IdentityCreateStateTransitionStateValidationV0 for IdentityCreateTransition return Ok(validation_result); } - self.transform_into_action_v0(platform, platform_version) + self.transform_into_action_v0(platform, execution_context, platform_version) } fn transform_into_action_v0( &self, platform: &PlatformRef, + execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion, ) -> Result, Error> { let mut validation_result = ConsensusValidationResult::::default(); @@ -118,7 +126,7 @@ impl IdentityCreateStateTransitionStateValidationV0 for IdentityCreateTransition // Verify one time signature - let singable_bytes = StateTransition::IdentityCreate(self.clone()).signable_bytes()?; + let signable_bytes = StateTransition::IdentityCreate(self.clone()).signable_bytes()?; let public_key_hash = tx_out .script_pubkey @@ -129,8 +137,13 @@ impl IdentityCreateStateTransitionStateValidationV0 for IdentityCreateTransition )) })?; + execution_context.add_operation(ExecutionOperation::DoubleSha256); + execution_context.add_operation(ExecutionOperation::SignatureVerification( + SignatureVerificationOperation::new(KeyType::ECDSA_HASH160), + )); + if let Err(e) = signer::verify_hash_signature( - &double_sha(singable_bytes), + &double_sha(signable_bytes), self.signature().as_slice(), public_key_hash, ) { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/mod.rs index 797eef6760..643c3ff738 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/mod.rs @@ -10,6 +10,7 @@ use drive::grovedb::TransactionArg; use crate::error::execution::ExecutionError; use crate::error::Error; +use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; use crate::platform_types::platform::{PlatformRef, PlatformStateRef}; use crate::rpc::core::CoreRPCLike; @@ -26,6 +27,7 @@ impl StateTransitionActionTransformerV0 for IdentityCreditTransferTransition { &self, platform: &PlatformRef, _validate: bool, + _execution_context: &mut StateTransitionExecutionContext, _tx: TransactionArg, ) -> Result, Error> { let platform_version = @@ -77,6 +79,7 @@ impl StateTransitionStateValidationV0 for IdentityCreditTransferTransition { &self, _action: Option, platform: &PlatformRef, + _execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, ) -> Result, Error> { let platform_version = diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs index 7b91a82a28..25f5b0a84d 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs @@ -10,6 +10,7 @@ use drive::grovedb::TransactionArg; use crate::error::execution::ExecutionError; use crate::error::Error; +use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; use crate::platform_types::platform::{PlatformRef, PlatformStateRef}; use crate::rpc::core::CoreRPCLike; @@ -27,6 +28,7 @@ impl StateTransitionActionTransformerV0 for IdentityCreditWithdrawalTransition { &self, platform: &PlatformRef, _validate: bool, + _execution_context: &mut StateTransitionExecutionContext, _tx: TransactionArg, ) -> Result, Error> { let platform_version = @@ -78,6 +80,7 @@ impl StateTransitionStateValidationV0 for IdentityCreditWithdrawalTransition { &self, _action: Option, platform: &PlatformRef, + _execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, ) -> Result, Error> { let platform_version = diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/mod.rs index 9fb420ab46..ad1ab33979 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/mod.rs @@ -11,6 +11,7 @@ use drive::state_transition_action::StateTransitionAction; use crate::error::execution::ExecutionError; use crate::error::Error; +use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; use crate::platform_types::platform::{PlatformRef, PlatformStateRef}; use crate::rpc::core::CoreRPCLike; @@ -29,6 +30,7 @@ impl StateTransitionActionTransformerV0 for IdentityTopUpTransition { &self, platform: &PlatformRef, _validate: bool, + execution_context: &mut StateTransitionExecutionContext, _tx: TransactionArg, ) -> Result, Error> { let platform_version = @@ -40,7 +42,7 @@ impl StateTransitionActionTransformerV0 for IdentityTopUpTransition { .identity_top_up_state_transition .transform_into_action { - 0 => self.transform_into_action_v0(platform, platform_version), + 0 => self.transform_into_action_v0(platform, execution_context, platform_version), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "identity top up transition: transform_into_action".to_string(), known_versions: vec![0], @@ -80,6 +82,7 @@ impl StateTransitionStateValidationV0 for IdentityTopUpTransition { &self, _action: Option, platform: &PlatformRef, + execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, ) -> Result, Error> { let platform_version = @@ -91,7 +94,7 @@ impl StateTransitionStateValidationV0 for IdentityTopUpTransition { .identity_top_up_state_transition .state { - 0 => self.validate_state_v0(platform, tx, platform_version), + 0 => self.validate_state_v0(platform, execution_context, tx, platform_version), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "identity top up transition: validate_state".to_string(), known_versions: vec![0], diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/state/v0/mod.rs index 1e4c2886a4..9e7caca155 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/state/v0/mod.rs @@ -6,6 +6,7 @@ use dpp::consensus::signature::{BasicECDSAError, SignatureError}; use dpp::dashcore::signer; use dpp::dashcore::signer::double_sha; use dpp::identity::state_transition::AssetLockProved; +use dpp::identity::KeyType; use dpp::prelude::ConsensusValidationResult; use dpp::serialization::Signable; @@ -18,6 +19,9 @@ use drive::state_transition_action::StateTransitionAction; use drive::grovedb::TransactionArg; use crate::error::execution::ExecutionError; +use crate::execution::types::execution_operation::ExecutionOperation; +use crate::execution::types::execution_operation::signature_verification_operation::SignatureVerificationOperation; +use crate::execution::types::state_transition_execution_context::{StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0}; use crate::execution::validation::state_transition::common::asset_lock::proof::AssetLockProofStateValidation; use crate::execution::validation::state_transition::common::asset_lock::transaction::fetch_asset_lock_transaction_output_sync::fetch_asset_lock_transaction_output_sync; @@ -26,6 +30,7 @@ pub(in crate::execution::validation::state_transition::state_transitions::identi fn validate_state_v0( &self, platform: &PlatformRef, + execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, platform_version: &PlatformVersion, ) -> Result, Error>; @@ -33,6 +38,7 @@ pub(in crate::execution::validation::state_transition::state_transitions::identi fn transform_into_action_v0( &self, platform: &PlatformRef, + execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion, ) -> Result, Error>; } @@ -41,6 +47,7 @@ impl IdentityTopUpStateTransitionStateValidationV0 for IdentityTopUpTransition { fn validate_state_v0( &self, platform: &PlatformRef, + execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, platform_version: &PlatformVersion, ) -> Result, Error> { @@ -56,12 +63,13 @@ impl IdentityTopUpStateTransitionStateValidationV0 for IdentityTopUpTransition { return Ok(validation_result); } - self.transform_into_action_v0(platform, platform_version) + self.transform_into_action_v0(platform, execution_context, platform_version) } fn transform_into_action_v0( &self, platform: &PlatformRef, + execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion, ) -> Result, Error> { let mut validation_result = ConsensusValidationResult::::default(); @@ -82,7 +90,7 @@ impl IdentityTopUpStateTransitionStateValidationV0 for IdentityTopUpTransition { // Verify one time signature - let singable_bytes = StateTransition::IdentityTopUp(self.clone()).signable_bytes()?; + let signable_bytes = StateTransition::IdentityTopUp(self.clone()).signable_bytes()?; let public_key_hash = tx_out .script_pubkey @@ -93,8 +101,13 @@ impl IdentityTopUpStateTransitionStateValidationV0 for IdentityTopUpTransition { )) })?; + execution_context.add_operation(ExecutionOperation::DoubleSha256); + execution_context.add_operation(ExecutionOperation::SignatureVerification( + SignatureVerificationOperation::new(KeyType::ECDSA_HASH160), + )); + if let Err(e) = signer::verify_hash_signature( - &double_sha(singable_bytes), + &double_sha(signable_bytes), self.signature().as_slice(), public_key_hash, ) { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/identity_and_signatures/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/identity_and_signatures/v0/mod.rs index cc845dc0e8..60bbc50f08 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/identity_and_signatures/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/identity_and_signatures/v0/mod.rs @@ -6,6 +6,11 @@ use dpp::consensus::state::state_error::StateError; use dpp::identity::PartialIdentity; +use crate::execution::types::execution_operation::signature_verification_operation::SignatureVerificationOperation; +use crate::execution::types::execution_operation::ExecutionOperation; +use crate::execution::types::state_transition_execution_context::{ + StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0, +}; use dpp::serialization::PlatformMessageSignable; use dpp::state_transition::identity_update_transition::accessors::IdentityUpdateTransitionAccessorsV0; use dpp::state_transition::identity_update_transition::IdentityUpdateTransition; @@ -18,6 +23,7 @@ pub(in crate::execution::validation::state_transition) trait IdentityUpdateState &self, signable_bytes: Vec, partial_identity: &PartialIdentity, + execution_context: &mut StateTransitionExecutionContext, ) -> Result; } @@ -26,6 +32,7 @@ impl IdentityUpdateStateTransitionIdentityAndSignaturesValidationV0 for Identity &self, signable_bytes: Vec, partial_identity: &PartialIdentity, + execution_context: &mut StateTransitionExecutionContext, ) -> Result { let mut result = SimpleConsensusValidationResult::default(); @@ -35,6 +42,9 @@ impl IdentityUpdateStateTransitionIdentityAndSignaturesValidationV0 for Identity key.data().as_slice(), key.signature().as_slice(), )?; + execution_context.add_operation(ExecutionOperation::SignatureVerification( + SignatureVerificationOperation::new(key.key_type()), + )); if !validation_result.is_valid() { result.add_errors(validation_result.errors); } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/mod.rs index 73bde66a79..bed0a1f2fd 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/mod.rs @@ -11,6 +11,7 @@ use drive::grovedb::TransactionArg; use crate::error::execution::ExecutionError; use crate::error::Error; +use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; use crate::platform_types::platform::{PlatformRef, PlatformStateRef}; use crate::rpc::core::CoreRPCLike; @@ -29,6 +30,7 @@ impl StateTransitionActionTransformerV0 for IdentityUpdateTransition { &self, platform: &PlatformRef, _validate: bool, + _execution_context: &mut StateTransitionExecutionContext, _tx: TransactionArg, ) -> Result, Error> { let platform_version = @@ -80,6 +82,7 @@ impl StateTransitionStateValidationV0 for IdentityUpdateTransition { &self, _action: Option, platform: &PlatformRef, + _execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, ) -> Result, Error> { let platform_version = diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/transformer/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/transformer/mod.rs index a96ba6b836..700f73381d 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/transformer/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/transformer/mod.rs @@ -1,4 +1,5 @@ use crate::error::Error; +use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; use crate::platform_types::platform::PlatformRef; use crate::rpc::core::CoreRPCLike; use dpp::prelude::ConsensusValidationResult; @@ -28,6 +29,7 @@ pub trait StateTransitionActionTransformerV0 { &self, platform: &PlatformRef, validate: bool, + execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, ) -> Result, Error>; } @@ -37,24 +39,33 @@ impl StateTransitionActionTransformerV0 for StateTransition { &self, platform: &PlatformRef, validate: bool, + execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, ) -> Result, Error> { match self { StateTransition::DataContractCreate(st) => { - st.transform_into_action(platform, validate, tx) + st.transform_into_action(platform, validate, execution_context, tx) } StateTransition::DataContractUpdate(st) => { - st.transform_into_action(platform, validate, tx) + st.transform_into_action(platform, validate, execution_context, tx) + } + StateTransition::IdentityCreate(st) => { + st.transform_into_action(platform, validate, execution_context, tx) + } + StateTransition::IdentityUpdate(st) => { + st.transform_into_action(platform, validate, execution_context, tx) + } + StateTransition::IdentityTopUp(st) => { + st.transform_into_action(platform, validate, execution_context, tx) } - StateTransition::IdentityCreate(st) => st.transform_into_action(platform, validate, tx), - StateTransition::IdentityUpdate(st) => st.transform_into_action(platform, validate, tx), - StateTransition::IdentityTopUp(st) => st.transform_into_action(platform, validate, tx), StateTransition::IdentityCreditWithdrawal(st) => { - st.transform_into_action(platform, validate, tx) + st.transform_into_action(platform, validate, execution_context, tx) + } + StateTransition::DocumentsBatch(st) => { + st.transform_into_action(platform, validate, execution_context, tx) } - StateTransition::DocumentsBatch(st) => st.transform_into_action(platform, validate, tx), StateTransition::IdentityCreditTransfer(st) => { - st.transform_into_action(platform, validate, tx) + st.transform_into_action(platform, validate, execution_context, tx) } } } diff --git a/packages/rs-drive-abci/tests/strategy_tests/main.rs b/packages/rs-drive-abci/tests/strategy_tests/main.rs index c5183dabe1..f5102db8cb 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/main.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/main.rs @@ -573,7 +573,7 @@ mod tests { .expect("expected to fetch balances") .expect("expected to have an identity to get balance from"); - assert_eq!(balance, 99869098220) + assert_eq!(balance, 99869074420) } #[test] @@ -1228,7 +1228,7 @@ mod tests { .unwrap() .unwrap() ), - "3fcae6c74a7c0cf2ed8613a6e110f3bdc544a4a7b5b51a2620108f845241c65b".to_string() + "7185a9b987f4fe7290f048ccdb2935d92446c240b9361be46a20f956164a9378".to_string() ) } @@ -1838,7 +1838,7 @@ mod tests { .unwrap() .unwrap() ), - "a19831eae73cfd6cb4fcb405e4725495b71f855842761312108c1bfc658417ba".to_string() + "5dfc31d164388c22154e10629030edb5557620c5fcd5c87ffeff5f4e81bdb657".to_string() ) } diff --git a/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs b/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs index 47d254b9b9..669dd93c47 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs @@ -26,6 +26,8 @@ use dpp::state_transition::documents_batch_transition::accessors::DocumentsBatch use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; use drive::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::DocumentFromCreateTransition; use drive::state_transition_action::document::documents_batch::document_transition::document_replace_transition_action::DocumentFromReplaceTransition; +use drive_abci::execution::types::state_transition_execution_context::StateTransitionExecutionContext; +use platform_version::DefaultForPlatformVersion; pub(crate) fn verify_state_transitions_were_or_were_not_executed( abci_app: &AbciApplication, @@ -55,17 +57,25 @@ pub(crate) fn verify_state_transitions_were_or_were_not_executed( // dbg!(batch.transitions().len(), hex::encode(first.base().id()), state.height(), first.to_string()); } - let consensus_validation_result = - match state_transition.transform_into_action(&platform, false, None) { - Ok(consensus_validation_result) => consensus_validation_result, - Err(e) => { - if expected_validation_errors.contains(&result.code) { - return (state_transition.clone(), None, false); - } else { - panic!("{}", e) - } + let mut execution_context = + StateTransitionExecutionContext::default_for_platform_version(platform_version) + .expect("expected to get an execution context"); + + let consensus_validation_result = match state_transition.transform_into_action( + &platform, + false, + &mut execution_context, + None, + ) { + Ok(consensus_validation_result) => consensus_validation_result, + Err(e) => { + if expected_validation_errors.contains(&result.code) { + return (state_transition.clone(), None, false); + } else { + panic!("{}", e) } - }; + } + }; if !consensus_validation_result.is_valid() { panic!( From d1771166fbc763529946e09d373ce1c9d3ecd2d5 Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Thu, 4 Jan 2024 22:18:56 +0700 Subject: [PATCH 005/191] fix(platform)!: credit transfer replay attack (#1634) Co-authored-by: Ivan Shumkov --- .../methods/identities/creditTransfer.ts | 2 +- .../rs-dpp/src/identity/identity_facade.rs | 4 +-- .../rs-dpp/src/identity/identity_factory.rs | 13 ++++++---- .../accessors/mod.rs | 13 ++++++++++ .../accessors/v0/mod.rs | 4 +++ .../v0/mod.rs | 4 ++- .../identity_credit_transfer/state/v0/mod.rs | 25 +++++++++++++++++++ .../tests/strategy_tests/main.rs | 22 +++------------- .../tests/strategy_tests/strategy.rs | 15 +++-------- .../verify_state_transitions.rs | 22 +++++----------- .../identity/identity_credit_transfer.rs | 5 ++++ .../identity/identity_credit_transfer/mod.rs | 8 ++++++ .../identity_credit_transfer/v0/mod.rs | 3 +++ .../v0/transformer.rs | 4 +++ .../identity_credit_withdrawal/mod.rs | 2 +- packages/strategy-tests/src/lib.rs | 15 +++-------- packages/strategy-tests/src/transitions.rs | 1 + packages/wasm-dpp/src/identity/identity.rs | 18 ++++++++++++- .../wasm-dpp/src/identity/identity_facade.rs | 6 +++-- .../wasm-dpp/src/identity/identity_factory.rs | 6 ++--- 20 files changed, 119 insertions(+), 73 deletions(-) diff --git a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/creditTransfer.ts b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/creditTransfer.ts index 946284560b..e04ddd2394 100644 --- a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/creditTransfer.ts +++ b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/creditTransfer.ts @@ -18,7 +18,7 @@ export async function creditTransfer( const identityCreditTransferTransition = dpp.identity .createIdentityCreditTransferTransition( - identity.getId(), + identity, recipientId, BigInt(amount), ); diff --git a/packages/rs-dpp/src/identity/identity_facade.rs b/packages/rs-dpp/src/identity/identity_facade.rs index 07b65329b3..d3899bda96 100644 --- a/packages/rs-dpp/src/identity/identity_facade.rs +++ b/packages/rs-dpp/src/identity/identity_facade.rs @@ -101,12 +101,12 @@ impl IdentityFacade { #[cfg(feature = "state-transitions")] pub fn create_identity_credit_transfer_transition( &self, - identity_id: Identifier, + identity: &Identity, recipient_id: Identifier, amount: u64, ) -> Result { self.factory - .create_identity_credit_transfer_transition(identity_id, recipient_id, amount) + .create_identity_credit_transfer_transition(identity, recipient_id, amount) } #[cfg(feature = "state-transitions")] diff --git a/packages/rs-dpp/src/identity/identity_factory.rs b/packages/rs-dpp/src/identity/identity_factory.rs index ebf264e66f..b00060d7f3 100644 --- a/packages/rs-dpp/src/identity/identity_factory.rs +++ b/packages/rs-dpp/src/identity/identity_factory.rs @@ -195,14 +195,17 @@ impl IdentityFactory { #[cfg(all(feature = "state-transitions", feature = "client"))] pub fn create_identity_credit_transfer_transition( &self, - identity_id: Identifier, + identity: &Identity, recipient_id: Identifier, amount: u64, ) -> Result { - let mut identity_credit_transfer_transition = IdentityCreditTransferTransitionV0::default(); - identity_credit_transfer_transition.identity_id = identity_id; - identity_credit_transfer_transition.recipient_id = recipient_id; - identity_credit_transfer_transition.amount = amount; + let identity_credit_transfer_transition = IdentityCreditTransferTransitionV0 { + identity_id: identity.id(), + recipient_id, + amount, + revision: identity.revision() + 1, + ..Default::default() + }; Ok(IdentityCreditTransferTransition::from( identity_credit_transfer_transition, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/accessors/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/accessors/mod.rs index abb71ed145..253c488dd7 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/accessors/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/accessors/mod.rs @@ -1,5 +1,6 @@ mod v0; +use crate::prelude::Revision; use crate::state_transition::identity_credit_transfer_transition::IdentityCreditTransferTransition; use platform_value::Identifier; pub use v0::*; @@ -46,4 +47,16 @@ impl IdentityCreditTransferTransitionAccessorsV0 for IdentityCreditTransferTrans } } } + + fn set_revision(&mut self, revision: Revision) { + match self { + IdentityCreditTransferTransition::V0(transition) => transition.revision = revision, + } + } + + fn revision(&self) -> Revision { + match self { + IdentityCreditTransferTransition::V0(transition) => transition.revision, + } + } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/accessors/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/accessors/v0/mod.rs index 425248a8ba..32d7866c5b 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/accessors/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/accessors/v0/mod.rs @@ -1,3 +1,5 @@ +use crate::prelude::Revision; +use crate::state_transition::identity_credit_transfer_transition::IdentityCreditTransferTransition; use platform_value::Identifier; pub trait IdentityCreditTransferTransitionAccessorsV0 { @@ -7,4 +9,6 @@ pub trait IdentityCreditTransferTransitionAccessorsV0 { fn set_identity_id(&mut self, identity_id: Identifier); fn recipient_id(&self) -> Identifier; fn set_recipient_id(&mut self, recipient_id: Identifier); + fn set_revision(&mut self, revision: Revision); + fn revision(&self) -> Revision; } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/v0/mod.rs index 5506323983..8912c25462 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/v0/mod.rs @@ -10,7 +10,7 @@ mod version; use crate::identity::KeyID; -use crate::prelude::Identifier; +use crate::prelude::{Identifier, Revision}; use crate::ProtocolError; use bincode::{Decode, Encode}; @@ -40,6 +40,7 @@ pub struct IdentityCreditTransferTransitionV0 { pub identity_id: Identifier, pub recipient_id: Identifier, pub amount: u64, + pub revision: Revision, #[platform_signable(exclude_from_sig_hash)] pub signature_public_key_id: KeyID, #[platform_signable(exclude_from_sig_hash)] @@ -76,6 +77,7 @@ mod test { identity_id: Identifier::random(), recipient_id: Identifier::random(), amount: rng.gen(), + revision: 1, signature_public_key_id: rng.gen(), signature: [0; 65].to_vec().into(), }; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/state/v0/mod.rs index 60cc63c19c..d2d0ae725c 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/state/v0/mod.rs @@ -4,7 +4,9 @@ use crate::rpc::core::CoreRPCLike; use dpp::consensus::signature::IdentityNotFoundError; +use dpp::consensus::state::identity::invalid_identity_revision_error::InvalidIdentityRevisionError; use dpp::consensus::state::identity::IdentityInsufficientBalanceError; +use dpp::consensus::state::state_error::StateError; use dpp::prelude::ConsensusValidationResult; use dpp::state_transition::identity_credit_transfer_transition::accessors::IdentityCreditTransferTransitionAccessorsV0; @@ -70,6 +72,29 @@ impl IdentityCreditTransferStateTransitionStateValidationV0 for IdentityCreditTr )); } + let Some(revision) = platform.drive.fetch_identity_revision( + self.identity_id().to_buffer(), + true, + tx, + platform_version, + )? + else { + return Ok(ConsensusValidationResult::new_with_error( + IdentityNotFoundError::new(self.identity_id()).into(), + )); + }; + + // Check revision + if revision + 1 != self.revision() { + return Ok(ConsensusValidationResult::new_with_error( + StateError::InvalidIdentityRevisionError(InvalidIdentityRevisionError::new( + self.identity_id(), + revision, + )) + .into(), + )); + } + self.transform_into_action_v0() } diff --git a/packages/rs-drive-abci/tests/strategy_tests/main.rs b/packages/rs-drive-abci/tests/strategy_tests/main.rs index f5102db8cb..0fd3a7efea 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/main.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/main.rs @@ -2981,13 +2981,13 @@ mod tests { operations: vec![Operation { op_type: OperationType::IdentityTransfer, frequency: Frequency { - times_per_block_range: 1..2, + times_per_block_range: 1..3, chance_per_block: None, }, }], start_identities: vec![], identities_inserts: Frequency { - times_per_block_range: 1..2, + times_per_block_range: 6..10, chance_per_block: None, }, signer: None, @@ -3033,7 +3033,7 @@ mod tests { signature: [2; 96].to_vec(), }) }); - let outcome = run_chain_for_strategy(&mut platform, 10, strategy, config, 15); + let outcome = run_chain_for_strategy(&mut platform, 15, strategy, config, 15); let balances = &outcome .abci_app @@ -3049,21 +3049,7 @@ mod tests { ) .expect("expected to fetch balances"); - assert_eq!(outcome.identities.len(), 10); - - let len = outcome.identities.len(); - - for identity in &outcome.identities[..len - 1] { - let new_balance = balances[&identity.id().to_buffer()]; - // All identity balances decreased - // as we transferred funds to the last identity - assert_eq!(new_balance, 0); - } - - let last_identity = &outcome.identities[len - 1]; - let last_identity_balance = balances[&last_identity.id().to_buffer()]; - // We transferred funds to the last identity, so we need to check that last identity balance was increased - assert!(last_identity_balance > 100000000000u64); + assert_eq!(outcome.identities.len(), 110); } // Test should filter out transactions exceeding max tx bytes per block diff --git a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs index 19cb800b48..9bb4013dad 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs @@ -862,18 +862,9 @@ impl NetworkStrategy { let owner = current_identities.get(indices[0]).unwrap(); let recipient = current_identities.get(indices[1]).unwrap(); - let fetched_owner_balance = platform - .drive - .fetch_identity_balance(owner.id().to_buffer(), None, platform_version) - .expect("expected to be able to get identity") - .expect("expected to get an identity"); - let state_transition = strategy_tests::transitions::create_identity_credit_transfer_transition( - owner, - recipient, - signer, - fetched_owner_balance - 100, + owner, recipient, signer, 1000, ); operations.push(state_transition); } @@ -909,9 +900,9 @@ impl NetworkStrategy { .expect("expected platform version"); let identity_state_transitions = self.identity_state_transitions_for_block(block_info, signer, rng, platform_version); - let (mut identities, mut state_transitions): (Vec, Vec) = + let (mut new_identities, mut state_transitions): (Vec, Vec) = identity_state_transitions.into_iter().unzip(); - current_identities.append(&mut identities); + current_identities.append(&mut new_identities); if block_info.height == 1 { // add contracts on block 1 diff --git a/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs b/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs index 669dd93c47..950b8138a7 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs @@ -418,22 +418,12 @@ pub(crate) fn verify_state_transitions_were_or_were_not_executed( platform.state.last_committed_block_info() ); if *was_executed { - assert_eq!( - identity - .expect("expected an identity") - .into_partial_identity_info_no_balance(), - PartialIdentity { - id: identity_create_transition.identity_id(), - loaded_public_keys: identity_create_transition - .public_keys() - .iter() - .map(|key| (key.id(), key.clone())) - .collect(), - balance: None, - revision: Some(0), - not_found_public_keys: Default::default(), - } - ) + // other state transitions might have happened in the same block the identity + // was created + let proved_identity = identity + .expect("expected an identity") + .into_partial_identity_info_no_balance(); + assert_eq!(proved_identity.id, identity_create_transition.identity_id()); } else { //there is the possibility that the state transition was not executed because it already existed, // we can discount that for now in tests diff --git a/packages/rs-drive/src/drive/batch/transitions/identity/identity_credit_transfer.rs b/packages/rs-drive/src/drive/batch/transitions/identity/identity_credit_transfer.rs index 69e96e3b64..e0b38de445 100644 --- a/packages/rs-drive/src/drive/batch/transitions/identity/identity_credit_transfer.rs +++ b/packages/rs-drive/src/drive/batch/transitions/identity/identity_credit_transfer.rs @@ -16,8 +16,13 @@ impl DriveHighLevelOperationConverter for IdentityCreditTransferTransitionAction let recipient_id = self.recipient_id(); let identity_id = self.identity_id(); let transfer_amount = self.transfer_amount(); + let revision = self.revision(); let drive_operations = vec![ + IdentityOperation(IdentityOperationType::UpdateIdentityRevision { + identity_id: identity_id.into_buffer(), + revision, + }), IdentityOperation(IdentityOperationType::RemoveFromIdentityBalance { identity_id: identity_id.to_buffer(), balance_to_remove: transfer_amount, diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_credit_transfer/mod.rs b/packages/rs-drive/src/state_transition_action/identity/identity_credit_transfer/mod.rs index 6491d63023..31b47b5699 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_credit_transfer/mod.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_credit_transfer/mod.rs @@ -7,6 +7,7 @@ use crate::state_transition_action::identity::identity_credit_transfer::v0::Iden use derive_more::From; use dpp::fee::Credits; use dpp::platform_value::Identifier; +use dpp::prelude::Revision; /// action #[derive(Debug, Clone, From)] @@ -16,6 +17,13 @@ pub enum IdentityCreditTransferTransitionAction { } impl IdentityCreditTransferTransitionAction { + /// Revision + pub fn revision(&self) -> Revision { + match self { + IdentityCreditTransferTransitionAction::V0(transition) => transition.revision, + } + } + /// Transfer amount pub fn transfer_amount(&self) -> Credits { match self { diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_credit_transfer/v0/mod.rs b/packages/rs-drive/src/state_transition_action/identity/identity_credit_transfer/v0/mod.rs index c2eb1ab2d4..ebf32ca065 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_credit_transfer/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_credit_transfer/v0/mod.rs @@ -2,6 +2,7 @@ mod transformer; use dpp::fee::Credits; use dpp::platform_value::Identifier; +use dpp::prelude::Revision; use serde::{Deserialize, Serialize}; /// action v0 @@ -14,4 +15,6 @@ pub struct IdentityCreditTransferTransitionActionV0 { pub recipient_id: Identifier, /// identity id pub identity_id: Identifier, + /// revision + pub revision: Revision, } diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_credit_transfer/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/identity/identity_credit_transfer/v0/transformer.rs index 346a1c3d18..d7b0ee8115 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_credit_transfer/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_credit_transfer/v0/transformer.rs @@ -7,12 +7,14 @@ impl From for IdentityCreditTransferTransiti identity_id, recipient_id, amount, + revision, .. } = value; IdentityCreditTransferTransitionActionV0 { identity_id, recipient_id, transfer_amount: amount, + revision, } } } @@ -23,12 +25,14 @@ impl From<&IdentityCreditTransferTransitionV0> for IdentityCreditTransferTransit identity_id, recipient_id, amount, + revision, .. } = value; IdentityCreditTransferTransitionActionV0 { identity_id: *identity_id, recipient_id: *recipient_id, transfer_amount: *amount, + revision: *revision, } } } diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/mod.rs b/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/mod.rs index d92f86d9b4..4706950d11 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/mod.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/mod.rs @@ -18,7 +18,7 @@ pub enum IdentityCreditWithdrawalTransitionAction { } impl IdentityCreditWithdrawalTransitionAction { - /// Withdrawal amount + /// Revision pub fn revision(&self) -> Revision { match self { IdentityCreditWithdrawalTransitionAction::V0(transition) => transition.revision, diff --git a/packages/strategy-tests/src/lib.rs b/packages/strategy-tests/src/lib.rs index 111e21c1f0..d6deff5afa 100644 --- a/packages/strategy-tests/src/lib.rs +++ b/packages/strategy-tests/src/lib.rs @@ -1027,17 +1027,9 @@ impl Strategy { let owner = current_identities.get(indices[0]).unwrap(); let recipient = current_identities.get(indices[1]).unwrap(); - let fetched_owner_balance = drive - .fetch_identity_balance(owner.id().to_buffer(), None, platform_version) - .expect("expected to be able to get identity") - .expect("expected to get an identity"); - let state_transition = crate::transitions::create_identity_credit_transfer_transition( - owner, - recipient, - signer, - fetched_owner_balance - 100, + owner, recipient, signer, 1000, ); operations.push(state_transition); } @@ -1100,9 +1092,8 @@ impl Strategy { let mut finalize_block_operations = vec![]; let identity_state_transitions = self.identity_state_transitions_for_block(block_info, signer, rng, platform_version); - let (mut identities, mut state_transitions): (Vec, Vec) = + let (mut new_identities, mut state_transitions): (Vec, Vec) = identity_state_transitions.into_iter().unzip(); - current_identities.append(&mut identities); if block_info.height == 1 { // add contracts on block 1 @@ -1134,6 +1125,8 @@ impl Strategy { state_transitions.append(&mut contract_update_state_transitions); } + current_identities.append(&mut new_identities); + (state_transitions, finalize_block_operations) } } diff --git a/packages/strategy-tests/src/transitions.rs b/packages/strategy-tests/src/transitions.rs index 558e1b2cf7..3c783e2fd1 100644 --- a/packages/strategy-tests/src/transitions.rs +++ b/packages/strategy-tests/src/transitions.rs @@ -529,6 +529,7 @@ pub fn create_identity_credit_transfer_transition( identity_id: identity.id(), recipient_id: recipient.id(), amount, + revision: identity.revision() + 1, signature_public_key_id: 0, signature: Default::default(), } diff --git a/packages/wasm-dpp/src/identity/identity.rs b/packages/wasm-dpp/src/identity/identity.rs index 19a2f1ac00..d6c22dacec 100644 --- a/packages/wasm-dpp/src/identity/identity.rs +++ b/packages/wasm-dpp/src/identity/identity.rs @@ -3,7 +3,7 @@ use crate::errors::from_dpp_err; use crate::identifier::IdentifierWrapper; use crate::identity::IdentityPublicKeyWasm; use crate::metadata::MetadataWasm; -use crate::utils::{IntoWasm, WithJsError}; +use crate::utils::{Inner, IntoWasm, WithJsError}; use crate::with_js_error; use dpp::identity::accessors::{IdentityGettersV0, IdentitySettersV0}; use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; @@ -271,3 +271,19 @@ impl IdentityWasm { Ok(identity.into()) } } + +impl Inner for IdentityWasm { + type InnerItem = Identity; + + fn into_inner(self) -> Self::InnerItem { + self.inner + } + + fn inner(&self) -> &Self::InnerItem { + &self.inner + } + + fn inner_mut(&mut self) -> &mut Self::InnerItem { + &mut self.inner + } +} diff --git a/packages/wasm-dpp/src/identity/identity_facade.rs b/packages/wasm-dpp/src/identity/identity_facade.rs index 5ecf107021..0ab0e8cb51 100644 --- a/packages/wasm-dpp/src/identity/identity_facade.rs +++ b/packages/wasm-dpp/src/identity/identity_facade.rs @@ -15,6 +15,8 @@ use crate::identity::state_transition::{ IdentityTopUpTransitionWasm, IdentityUpdateTransitionWasm, InstantAssetLockProofWasm, }; +use crate::utils::Inner; + use crate::utils::WithJsError; use crate::with_js_error; use dpp::dashcore::{consensus, InstantLock, Transaction}; @@ -196,13 +198,13 @@ impl IdentityFacadeWasm { #[wasm_bindgen(js_name=createIdentityCreditTransferTransition)] pub fn create_identity_credit_transfer_transition( &self, - identity_id: &IdentifierWrapper, + identity: &IdentityWasm, recipient_id: &IdentifierWrapper, amount: u64, ) -> Result { self.0 .create_identity_credit_transfer_transition( - identity_id.to_owned().into(), + identity.inner(), recipient_id.to_owned().into(), amount, ) diff --git a/packages/wasm-dpp/src/identity/identity_factory.rs b/packages/wasm-dpp/src/identity/identity_factory.rs index 6643f6b096..ee46f17562 100644 --- a/packages/wasm-dpp/src/identity/identity_factory.rs +++ b/packages/wasm-dpp/src/identity/identity_factory.rs @@ -21,7 +21,7 @@ use dpp::prelude::Identity; use serde::Deserialize; use std::convert::TryInto; -use crate::utils::WithJsError; +use crate::utils::{Inner, WithJsError}; use dpp::identity::identity_factory::IdentityFactory; use wasm_bindgen::prelude::wasm_bindgen; @@ -183,13 +183,13 @@ impl IdentityFactoryWasm { #[wasm_bindgen(js_name=createIdentityCreditTransferTransition)] pub fn create_identity_credit_transfer_transition( &self, - identity_id: &IdentifierWrapper, + identity: &IdentityWasm, recipient_id: &IdentifierWrapper, amount: u64, ) -> Result { self.0 .create_identity_credit_transfer_transition( - identity_id.to_owned().into(), + identity.inner(), recipient_id.to_owned().into(), amount, ) From ea27d6a24cba73aaf82ade7cd9f70c7cc49d9978 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Fri, 5 Jan 2024 19:15:57 +0300 Subject: [PATCH 006/191] feat(drive-abci)!: include invalid state transitions into block (#1657) --- .../platform-test-suite/lib/test/bootstrap.js | 8 +- .../src/errors/consensus/consensus_error.rs | 5 +- .../src/abci/handler/error/mod.rs | 95 +++--- .../src/abci/handler/execution_result.rs | 65 ++-- .../rs-drive-abci/src/abci/handler/mod.rs | 92 +++--- .../src/execution/check_tx/v0/mod.rs | 12 +- .../engine/run_block_proposal/v0/mod.rs | 6 +- .../execute_event/mod.rs | 4 +- .../execute_event/v0/mod.rs | 18 +- .../process_raw_state_transitions/mod.rs | 5 +- .../process_raw_state_transitions/v0/mod.rs | 279 +++++++++++++----- .../state_transition/processor/v0/mod.rs | 5 +- .../block_execution_outcome/v0/mod.rs | 4 +- .../event_execution_result/mod.rs | 17 ++ .../rs-drive-abci/src/platform_types/mod.rs | 4 +- .../state_transition_execution_result/mod.rs | 32 -- .../mod.rs | 83 ++++++ .../tests/strategy_tests/failures.rs | 11 +- .../src/errors/consensus/consensus_error.rs | 1 - 19 files changed, 489 insertions(+), 257 deletions(-) create mode 100644 packages/rs-drive-abci/src/platform_types/event_execution_result/mod.rs delete mode 100644 packages/rs-drive-abci/src/platform_types/state_transition_execution_result/mod.rs create mode 100644 packages/rs-drive-abci/src/platform_types/state_transitions_processing_result/mod.rs diff --git a/packages/platform-test-suite/lib/test/bootstrap.js b/packages/platform-test-suite/lib/test/bootstrap.js index 477b2cfdb6..f4e9d46724 100644 --- a/packages/platform-test-suite/lib/test/bootstrap.js +++ b/packages/platform-test-suite/lib/test/bootstrap.js @@ -10,6 +10,10 @@ use(chaiAsPromised); use(dirtyChai); use(sinonChai); +dotenvSafe.config({ + path: path.resolve(__dirname, '..', '..', '.env'), +}); + process.env.NODE_ENV = 'test'; let faucetIndex = 1; @@ -21,10 +25,6 @@ if (process.env.MOCHA_WORKER_ID) { process.env.FAUCET_ADDRESS = process.env[`FAUCET_${faucetIndex}_ADDRESS`]; process.env.FAUCET_PRIVATE_KEY = process.env[`FAUCET_${faucetIndex}_PRIVATE_KEY`]; -dotenvSafe.config({ - path: path.resolve(__dirname, '..', '..', '.env'), -}); - exports.mochaHooks = { beforeEach() { if (!this.sinon) { diff --git a/packages/rs-dpp/src/errors/consensus/consensus_error.rs b/packages/rs-dpp/src/errors/consensus/consensus_error.rs index 6966825408..7be628f29c 100644 --- a/packages/rs-dpp/src/errors/consensus/consensus_error.rs +++ b/packages/rs-dpp/src/errors/consensus/consensus_error.rs @@ -2,7 +2,6 @@ use crate::errors::ProtocolError; use bincode; use bincode::{Decode, Encode}; use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; -use thiserror::Error; use crate::consensus::state::state_error::StateError; @@ -16,7 +15,9 @@ use crate::errors::consensus::basic::BasicError; // TODO It must be versioned as all other serializable types -#[derive(Error, Debug, Encode, Decode, PlatformSerialize, PlatformDeserialize, Clone)] +#[derive( + thiserror::Error, Debug, Encode, Decode, PlatformSerialize, PlatformDeserialize, Clone, +)] #[platform_serialize(limit = 2000)] #[error(transparent)] pub enum ConsensusError { diff --git a/packages/rs-drive-abci/src/abci/handler/error/mod.rs b/packages/rs-drive-abci/src/abci/handler/error/mod.rs index 2a854fef12..7a832b0f7e 100644 --- a/packages/rs-drive-abci/src/abci/handler/error/mod.rs +++ b/packages/rs-drive-abci/src/abci/handler/error/mod.rs @@ -2,13 +2,15 @@ pub mod consensus; use crate::error::query::QueryError; use crate::error::Error; +use dpp::consensus::codes::ErrorWithCode; +use dpp::consensus::ConsensusError; use dpp::platform_value::platform_value; use dpp::platform_value::string_encoding::{encode, Encoding}; use tenderdash_abci::proto::abci::ResponseException; /// ABCI handlers errors #[derive(Debug, thiserror::Error)] -// Allow dead code, as majority of these errors are reserved for future use +// Allow dead code, as the majority of these errors are reserved for future use #[allow(dead_code)] pub enum HandlerError { /// ABCI Handler error (Cancelled) @@ -59,6 +61,9 @@ pub enum HandlerError { /// ABCI Handler error (Unauthenticated) #[error("{0}")] Unauthenticated(String), + /// State Transition processing consensus error + #[error(transparent)] + StateTransitionConsensusError(ConsensusError), } /// Error codes for ABCI handlers @@ -101,54 +106,54 @@ pub enum HandlerErrorCode { impl HandlerError { /// Returns ABCI handler error code pub fn code(&self) -> u32 { - let code = match self { - HandlerError::Cancelled(_) => HandlerErrorCode::Cancelled, - HandlerError::Unknown(_) => HandlerErrorCode::Unknown, - HandlerError::InvalidArgument(_) => HandlerErrorCode::InvalidArgument, - HandlerError::DeadlineExceeded(_) => HandlerErrorCode::DeadlineExceeded, - HandlerError::NotFound(_) => HandlerErrorCode::NotFound, - HandlerError::AlreadyExists(_) => HandlerErrorCode::AlreadyExists, - HandlerError::PermissionDenied(_) => HandlerErrorCode::PermissionDenied, - HandlerError::ResourceExhausted(_) => HandlerErrorCode::ResourceExhausted, - HandlerError::FailedPrecondition(_) => HandlerErrorCode::FailedPrecondition, - HandlerError::Aborted(_) => HandlerErrorCode::Aborted, - HandlerError::OutOfRange(_) => HandlerErrorCode::OutOfRange, - HandlerError::Unimplemented(_) => HandlerErrorCode::Unimplemented, - HandlerError::Internal(_) => HandlerErrorCode::Internal, - HandlerError::Unavailable(_) => HandlerErrorCode::Unavailable, - HandlerError::DataLoss(_) => HandlerErrorCode::DataLoss, - HandlerError::Unauthenticated(_) => HandlerErrorCode::Unauthenticated, - }; - - code as u32 + match self { + HandlerError::Cancelled(_) => HandlerErrorCode::Cancelled as u32, + HandlerError::Unknown(_) => HandlerErrorCode::Unknown as u32, + HandlerError::InvalidArgument(_) => HandlerErrorCode::InvalidArgument as u32, + HandlerError::DeadlineExceeded(_) => HandlerErrorCode::DeadlineExceeded as u32, + HandlerError::NotFound(_) => HandlerErrorCode::NotFound as u32, + HandlerError::AlreadyExists(_) => HandlerErrorCode::AlreadyExists as u32, + HandlerError::PermissionDenied(_) => HandlerErrorCode::PermissionDenied as u32, + HandlerError::ResourceExhausted(_) => HandlerErrorCode::ResourceExhausted as u32, + HandlerError::FailedPrecondition(_) => HandlerErrorCode::FailedPrecondition as u32, + HandlerError::Aborted(_) => HandlerErrorCode::Aborted as u32, + HandlerError::OutOfRange(_) => HandlerErrorCode::OutOfRange as u32, + HandlerError::Unimplemented(_) => HandlerErrorCode::Unimplemented as u32, + HandlerError::Internal(_) => HandlerErrorCode::Internal as u32, + HandlerError::Unavailable(_) => HandlerErrorCode::Unavailable as u32, + HandlerError::DataLoss(_) => HandlerErrorCode::DataLoss as u32, + HandlerError::Unauthenticated(_) => HandlerErrorCode::Unauthenticated as u32, + HandlerError::StateTransitionConsensusError(error) => error.code(), + } } /// Returns error message - pub fn message(&self) -> &str { + pub fn message(&self) -> String { match self { - HandlerError::Cancelled(message) => message, - HandlerError::Unknown(message) => message, - HandlerError::InvalidArgument(message) => message, - HandlerError::DeadlineExceeded(message) => message, - HandlerError::NotFound(message) => message, - HandlerError::AlreadyExists(message) => message, - HandlerError::PermissionDenied(message) => message, - HandlerError::ResourceExhausted(message) => message, - HandlerError::FailedPrecondition(message) => message, - HandlerError::Aborted(message) => message, - HandlerError::OutOfRange(message) => message, - HandlerError::Unimplemented(message) => message, - HandlerError::Internal(message) => message, - HandlerError::Unavailable(message) => message, - HandlerError::DataLoss(message) => message, - HandlerError::Unauthenticated(message) => message, + HandlerError::Cancelled(message) => message.to_owned(), + HandlerError::Unknown(message) => message.to_owned(), + HandlerError::InvalidArgument(message) => message.to_owned(), + HandlerError::DeadlineExceeded(message) => message.to_owned(), + HandlerError::NotFound(message) => message.to_owned(), + HandlerError::AlreadyExists(message) => message.to_owned(), + HandlerError::PermissionDenied(message) => message.to_owned(), + HandlerError::ResourceExhausted(message) => message.to_owned(), + HandlerError::FailedPrecondition(message) => message.to_owned(), + HandlerError::Aborted(message) => message.to_owned(), + HandlerError::OutOfRange(message) => message.to_owned(), + HandlerError::Unimplemented(message) => message.to_owned(), + HandlerError::Internal(message) => message.to_owned(), + HandlerError::Unavailable(message) => message.to_owned(), + HandlerError::DataLoss(message) => message.to_owned(), + HandlerError::Unauthenticated(message) => message.to_owned(), + HandlerError::StateTransitionConsensusError(error) => error.to_string(), } } /// Returns base64-encoded message for info field of ABCI handler responses pub fn response_info(&self) -> Result { let error_data_buffer = platform_value!({ - "message": self.message().to_string(), + "message": self.message(), // TODO: consider capturing stack with one of the libs // and send it to the client //"stack": "..." @@ -174,3 +179,15 @@ impl From<&QueryError> for HandlerError { } } } + +impl From<&ConsensusError> for HandlerError { + fn from(value: &ConsensusError) -> Self { + Self::StateTransitionConsensusError(value.to_owned()) + } +} + +impl From<&Error> for HandlerError { + fn from(value: &Error) -> Self { + Self::Internal(value.to_string()) + } +} diff --git a/packages/rs-drive-abci/src/abci/handler/execution_result.rs b/packages/rs-drive-abci/src/abci/handler/execution_result.rs index f2ec040a38..e3b0c0ff2f 100644 --- a/packages/rs-drive-abci/src/abci/handler/execution_result.rs +++ b/packages/rs-drive-abci/src/abci/handler/execution_result.rs @@ -1,14 +1,15 @@ use crate::abci::handler::error::consensus::AbciResponseInfoGetter; +use crate::abci::handler::error::HandlerError; use crate::error::Error; -use crate::platform_types::state_transition_execution_result::StateTransitionExecutionResult; -use dpp::consensus::codes::ErrorWithCode; +use crate::platform_types::state_transitions_processing_result::{ + StateTransitionExecutionResult, StateTransitionsProcessingResult, +}; use dpp::fee::SignedCredits; use dpp::version::PlatformVersion; use dpp::version::TryIntoPlatformVersioned; -use tenderdash_abci::proto::abci::ExecTxResult; +use tenderdash_abci::proto::abci::tx_record::TxAction; +use tenderdash_abci::proto::abci::{ExecTxResult, TxRecord}; -// State transitions are never free, so we should filter out SuccessfulFreeExecution -// So we use an option impl TryIntoPlatformVersioned for StateTransitionExecutionResult { type Error = Error; @@ -17,43 +18,29 @@ impl TryIntoPlatformVersioned for StateTransitionExecutionResult { platform_version: &PlatformVersion, ) -> Result { let response = match self { - Self::SuccessfulPaidExecution(dry_run_fee_result, fee_result) => ExecTxResult { - code: 0, - data: vec![], - log: "".to_string(), - info: "".to_string(), - gas_wanted: dry_run_fee_result.total_base_fee() as SignedCredits, - gas_used: fee_result.total_base_fee() as SignedCredits, - events: vec![], - codespace: "".to_string(), - }, - Self::SuccessfulFreeExecution => ExecTxResult { - code: 0, - data: vec![], - log: "".to_string(), - info: "".to_string(), - gas_wanted: 0, - gas_used: 0, - events: vec![], - codespace: "".to_string(), - }, - Self::ConsensusExecutionError(validation_result) => { - let error = validation_result - .errors - .first() - .expect("invalid execution result should have a consensus error"); - + StateTransitionExecutionResult::SuccessfulExecution(estimated_fees, actual_fees) => { ExecTxResult { - code: error.code(), - data: vec![], - log: "".to_string(), - info: error.response_info_for_version(platform_version)?, - gas_wanted: 0, - gas_used: 0, - events: vec![], - codespace: "".to_string(), + code: 0, + gas_wanted: estimated_fees.total_base_fee() as SignedCredits, + gas_used: actual_fees.total_base_fee() as SignedCredits, + ..Default::default() } } + StateTransitionExecutionResult::UnpaidConsensusError(error) + | StateTransitionExecutionResult::PaidConsensusError(error) => ExecTxResult { + code: HandlerError::from(&error).code(), + info: error.response_info_for_version(platform_version)?, + // TODO: We need to pass processing fees as well + gas_wanted: 0, + gas_used: 0, + ..Default::default() + }, + StateTransitionExecutionResult::DriveAbciError(message) => ExecTxResult { + code: HandlerError::Internal(message).code(), + // TODO: That would be nice to provide more information about the error for debugging + info: String::default(), + ..Default::default() + }, }; Ok(response) diff --git a/packages/rs-drive-abci/src/abci/handler/mod.rs b/packages/rs-drive-abci/src/abci/handler/mod.rs index 3235b7d59c..dc8649ac9a 100644 --- a/packages/rs-drive-abci/src/abci/handler/mod.rs +++ b/packages/rs-drive-abci/src/abci/handler/mod.rs @@ -67,6 +67,7 @@ use crate::platform_types::block_execution_outcome; use crate::platform_types::block_proposal::v0::BlockProposal; use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::platform_types::platform_state::PlatformState; +use crate::platform_types::state_transitions_processing_result::StateTransitionExecutionResult; use crate::platform_types::withdrawal::withdrawal_txs; use dpp::dashcore::hashes::Hash; use dpp::fee::SignedCredits; @@ -254,7 +255,7 @@ where let block_execution_outcome::v0::BlockExecutionOutcome { app_hash, - state_transition_results, + state_transitions_result, validator_set_update, protocol_version, } = run_result.into_data().map_err(Error::Protocol)?; @@ -263,30 +264,46 @@ where .expect("must be set in run block proposal from existing protocol version"); // We need to let Tenderdash know about the transactions we should remove from execution + let valid_tx_count = state_transitions_result.valid_count(); + let invalid_tx_count = state_transitions_result.invalid_count(); + let failed_tx_count = state_transitions_result.failed_count(); + let delayed_tx_count = transactions_exceeding_max_block_size.len(); + let mut tx_results = Vec::new(); let mut tx_records = Vec::new(); - let mut valid_txs_count = 0; - let mut invalid_tx_count = 0; - for (tx, state_transition_execution_result) in state_transition_results { + for (state_transition_execution_result, raw_state_transition) in state_transitions_result + .into_execution_results() + .into_iter() + .zip(request.txs) + { + let tx_action = match &state_transition_execution_result { + StateTransitionExecutionResult::SuccessfulExecution(_, _) => TxAction::Unmodified, + // We have identity to pay for the state transition, so we keep it in the block + StateTransitionExecutionResult::PaidConsensusError(_) => TxAction::Unmodified, + // We don't have any associated identity to pay for the state transition, + // so we remove it from the block to prevent spam attacks. + // Such state transitions must be invalidated by check tx, but they might + // still be added to mempool due to inconsistency between check tx and tx processing + // (fees calculation) or malicious proposer. + StateTransitionExecutionResult::UnpaidConsensusError(_) => TxAction::Removed, + // We shouldn't include in the block any state transitions that produced an internal error + // during execution + StateTransitionExecutionResult::DriveAbciError(_) => TxAction::Removed, + }; + let tx_result: ExecTxResult = state_transition_execution_result.try_into_platform_versioned(platform_version)?; - let action = if tx_result.code > 0 { - invalid_tx_count += 1; - TxAction::Removed - } else { - valid_txs_count += 1; - TxAction::Unmodified - } as i32; - - if action != TxAction::Removed as i32 { + if tx_action != TxAction::Removed { tx_results.push(tx_result); } - tx_records.push(TxRecord { action, tx }); - } - let delayed_tx_count = transactions_exceeding_max_block_size.len(); + tx_records.push(TxRecord { + action: tx_action.into(), + tx: raw_state_transition, + }); + } // Add up exceeding transactions to the response tx_records.extend( @@ -298,14 +315,14 @@ where }), ); - // TODO: implement all fields, including tx processing; for now, just leaving bare minimum let response = ResponsePrepareProposal { tx_results, app_hash: app_hash.to_vec(), tx_records, core_chain_lock_update, validator_set_update, - ..Default::default() + // TODO: implement consensus param updates + consensus_param_updates: None, }; let mut block_execution_context_guard = @@ -318,10 +335,11 @@ where tracing::info!( invalid_tx_count, - valid_txs_count, + valid_tx_count, delayed_tx_count, + failed_tx_count, "Prepared proposal with {} transitions for height: {}, round: {}", - valid_txs_count, + valid_tx_count, request.height, request.round, ); @@ -507,7 +525,7 @@ where } else { let block_execution_outcome::v0::BlockExecutionOutcome { app_hash, - state_transition_results, + state_transitions_result: state_transition_results, validator_set_update, protocol_version, } = run_result.into_data().map_err(Error::Protocol)?; @@ -515,32 +533,32 @@ where let platform_version = PlatformVersion::get(protocol_version) .expect("must be set in run block proposer from existing platform version"); - let mut invalid_tx_count = 0; - let mut valid_tx_count = 0; + let invalid_tx_count = state_transition_results.invalid_count(); + let valid_tx_count = state_transition_results.valid_count(); let tx_results = state_transition_results + .into_execution_results() .into_iter() - .map(|(_, execution_result)| { - let tx_result: ExecTxResult = - execution_result.try_into_platform_versioned(platform_version)?; - - if tx_result.code == 0 { - valid_tx_count += 1; - } else { - invalid_tx_count += 1; - } - - Ok(tx_result) + // To prevent spam attacks we add to the block state transitions covered with fees only + .filter(|execution_result| { + matches!( + execution_result, + StateTransitionExecutionResult::SuccessfulExecution(_, _) + | StateTransitionExecutionResult::PaidConsensusError(_) + ) + }) + .map(|execution_result| { + execution_result.try_into_platform_versioned(platform_version) }) - .collect::, Error>>()?; + .collect::>()?; - // TODO: implement all fields, including tx processing; for now, just leaving bare minimum let response = ResponseProcessProposal { app_hash: app_hash.to_vec(), tx_results, status: proto::response_process_proposal::ProposalStatus::Accept.into(), validator_set_update, - ..Default::default() + // TODO: Implement consensus param updates + consensus_param_updates: None, }; tracing::info!( diff --git a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs index 04e75fbe59..7868028ca8 100644 --- a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs @@ -1,11 +1,11 @@ use crate::error::Error; use crate::execution::validation::state_transition::processor::process_state_transition; -use crate::platform_types::platform::{Platform, PlatformRef}; -use crate::platform_types::platform_state::v0::PlatformStateV0Methods; #[cfg(test)] -use crate::platform_types::state_transition_execution_result::StateTransitionExecutionResult; +use crate::platform_types::event_execution_result::EventExecutionResult; #[cfg(test)] -use crate::platform_types::state_transition_execution_result::StateTransitionExecutionResult::ConsensusExecutionError; +use crate::platform_types::event_execution_result::EventExecutionResult::ConsensusExecutionError; +use crate::platform_types::platform::{Platform, PlatformRef}; +use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::rpc::core::CoreRPCLike; use dpp::consensus::basic::decode::SerializedObjectParsingError; @@ -31,7 +31,7 @@ where raw_tx: Vec, block_info: &dpp::block::block_info::BlockInfo, transaction: &Transaction, - ) -> Result { + ) -> Result { let state_transition = StateTransition::deserialize_from_bytes(raw_tx.as_slice()).map_err(Error::Protocol)?; let state_read_guard = self.state.read().unwrap(); @@ -115,8 +115,8 @@ where #[cfg(test)] mod tests { use crate::config::PlatformConfig; + use crate::platform_types::event_execution_result::EventExecutionResult::SuccessfulPaidExecution; use crate::platform_types::platform_state::v0::PlatformStateV0Methods; - use crate::platform_types::state_transition_execution_result::StateTransitionExecutionResult::SuccessfulPaidExecution; use crate::platform_types::system_identity_public_keys::v0::SystemIdentityPublicKeysV0; use crate::test::helpers::setup::TestPlatformBuilder; use dpp::block::block_info::BlockInfo; diff --git a/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs b/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs index 25156a2799..2408b92005 100644 --- a/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs @@ -270,7 +270,7 @@ where .collect(), ); - let (block_fees, state_transition_results) = self.process_raw_state_transitions( + let state_transitions_result = self.process_raw_state_transitions( raw_state_transitions, block_execution_context.block_platform_state(), &block_info, @@ -288,7 +288,7 @@ where // while we have the state transitions executed, we now need to process the block fees - let block_fees_v0: BlockFeesV0 = block_fees.into(); + let block_fees_v0: BlockFeesV0 = state_transitions_result.aggregated_fees().clone().into(); // Process fees let processed_block_fees = self.process_block_fees( @@ -334,7 +334,7 @@ where Ok(ValidationResult::new_with_data( block_execution_outcome::v0::BlockExecutionOutcome { app_hash: root_hash, - state_transition_results, + state_transitions_result, validator_set_update, protocol_version: platform_version.protocol_version, }, diff --git a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/execute_event/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/execute_event/mod.rs index 0b8d5e3f4c..9ee195adcb 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/execute_event/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/execute_event/mod.rs @@ -3,8 +3,8 @@ mod v0; use crate::error::execution::ExecutionError; use crate::error::Error; use crate::execution::types::execution_event::ExecutionEvent; +use crate::platform_types::event_execution_result::EventExecutionResult; use crate::platform_types::platform::Platform; -use crate::platform_types::state_transition_execution_result::StateTransitionExecutionResult; use crate::rpc::core::CoreRPCLike; use dpp::block::block_info::BlockInfo; use dpp::version::PlatformVersion; @@ -40,7 +40,7 @@ where block_info: &BlockInfo, transaction: &Transaction, platform_version: &PlatformVersion, - ) -> Result { + ) -> Result { match platform_version .drive_abci .methods diff --git a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/execute_event/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/execute_event/v0/mod.rs index 3ce51b7a55..d1b50852dd 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/execute_event/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/execute_event/v0/mod.rs @@ -2,11 +2,11 @@ use crate::error::execution::ExecutionError; use crate::error::Error; use crate::execution::types::execution_event::ExecutionEvent; use crate::execution::types::execution_operation::{ExecutionOperation, OperationLike}; -use crate::platform_types::platform::Platform; -use crate::platform_types::state_transition_execution_result::StateTransitionExecutionResult; -use crate::platform_types::state_transition_execution_result::StateTransitionExecutionResult::{ +use crate::platform_types::event_execution_result::EventExecutionResult; +use crate::platform_types::event_execution_result::EventExecutionResult::{ ConsensusExecutionError, SuccessfulFreeExecution, SuccessfulPaidExecution, }; +use crate::platform_types::platform::Platform; use crate::rpc::core::CoreRPCLike; use dpp::block::block_info::BlockInfo; use dpp::validation::SimpleConsensusValidationResult; @@ -46,10 +46,10 @@ where block_info: &BlockInfo, transaction: &Transaction, platform_version: &PlatformVersion, - ) -> Result { + ) -> Result { //todo: we need to split out errors // between failed execution and internal errors - let validation_result = + let fee_validation_result = self.validate_fees_of_event(&event, block_info, Some(transaction), platform_version)?; match event { @@ -64,7 +64,7 @@ where operations, execution_operations, } => { - if validation_result.is_valid_with_data() { + if fee_validation_result.is_valid_with_data() { //todo: make this into an atomic event with partial batches let mut individual_fee_result = self .drive @@ -93,12 +93,14 @@ where )?; Ok(SuccessfulPaidExecution( - validation_result.into_data()?, + fee_validation_result.into_data()?, outcome.actual_fee_paid_owned(), )) } else { Ok(ConsensusExecutionError( - SimpleConsensusValidationResult::new_with_errors(validation_result.errors), + SimpleConsensusValidationResult::new_with_errors( + fee_validation_result.errors, + ), )) } } diff --git a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_raw_state_transitions/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_raw_state_transitions/mod.rs index ba3b7613da..288c571dbb 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_raw_state_transitions/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_raw_state_transitions/mod.rs @@ -4,10 +4,9 @@ use crate::error::execution::ExecutionError; use crate::error::Error; use crate::platform_types::platform::Platform; use crate::platform_types::platform_state::PlatformState; -use crate::platform_types::state_transition_execution_result::StateTransitionExecutionResult; +use crate::platform_types::state_transitions_processing_result::StateTransitionsProcessingResult; use crate::rpc::core::CoreRPCLike; use dpp::block::block_info::BlockInfo; -use dpp::fee::fee_result::FeeResult; use dpp::version::PlatformVersion; use drive::grovedb::Transaction; @@ -43,7 +42,7 @@ where block_info: &BlockInfo, transaction: &Transaction, platform_version: &PlatformVersion, - ) -> Result<(FeeResult, Vec<(Vec, StateTransitionExecutionResult)>), Error> { + ) -> Result { match platform_version .drive_abci .methods diff --git a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_raw_state_transitions/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_raw_state_transitions/v0/mod.rs index e6c04fb97e..d056cf0710 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_raw_state_transitions/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_raw_state_transitions/v0/mod.rs @@ -2,21 +2,27 @@ use crate::error::Error; use crate::execution::validation::state_transition::processor::process_state_transition; use crate::platform_types::platform::{Platform, PlatformRef}; use crate::platform_types::platform_state::PlatformState; -use crate::platform_types::state_transition_execution_result::StateTransitionExecutionResult::{ - ConsensusExecutionError, SuccessfulPaidExecution, -}; use crate::rpc::core::CoreRPCLike; use dpp::block::block_info::BlockInfo; -use dpp::dashcore; +use dpp::consensus::basic::decode::SerializedObjectParsingError; use dpp::dashcore::hashes::Hash; use dpp::fee::fee_result::FeeResult; +use dpp::serialization::PlatformDeserializable; use dpp::state_transition::StateTransition; -use dpp::validation::SimpleConsensusValidationResult; +use dpp::{dashcore, ProtocolError}; -use crate::platform_types::state_transition_execution_result::StateTransitionExecutionResult; +use crate::platform_types::event_execution_result::EventExecutionResult; +use crate::platform_types::state_transitions_processing_result::{ + StateTransitionExecutionResult, StateTransitionsProcessingResult, +}; use dpp::version::PlatformVersion; use drive::grovedb::Transaction; +struct StateTransitionAwareError { + error: Error, + raw_state_transition: Vec, +} + impl Platform where C: CoreRPCLike, @@ -35,9 +41,9 @@ where /// /// # Returns /// - /// * `Result<(FeeResult, Vec), Error>` - If the processing is successful, it returns - /// a tuple consisting of a `FeeResult` and a vector of `ExecTxResult`. If the processing fails, - /// it returns an `Error`. + /// * `Result` - If the processing is successful, it returns + /// a `StateTransitionsProcessingResult` with state transition execution results and aggregated information. + /// If the processing fails, it returns an `Error`. /// /// # Errors /// @@ -51,9 +57,7 @@ where block_info: &BlockInfo, transaction: &Transaction, platform_version: &PlatformVersion, - ) -> Result<(FeeResult, Vec<(Vec, StateTransitionExecutionResult)>), Error> { - let state_transitions = StateTransition::deserialize_many(raw_state_transitions)?; - let mut aggregate_fee_result = FeeResult::default(); + ) -> Result { let platform_ref = PlatformRef { drive: &self.drive, state: block_platform_state, @@ -61,73 +65,204 @@ where core_rpc: &self.core_rpc, block_info, }; - let exec_tx_results = state_transitions - .into_iter() - .zip(raw_state_transitions.iter()) - .map(|(state_transition, raw_state_transition)| { - let state_transition_execution_event = process_state_transition( + + let mut processing_result = StateTransitionsProcessingResult::default(); + + for raw_state_transition in raw_state_transitions { + let execution_result = self + .process_raw_state_transition( + raw_state_transition, + block_info, &platform_ref, - state_transition.clone(), - Some(transaction), - )?; - - // Tenderdash hex-encoded ST hash - let mut st_hash = String::new(); - if tracing::enabled!(tracing::Level::TRACE) { - st_hash = hex::encode( - dashcore::hashes::sha256::Hash::hash(raw_state_transition).to_byte_array(), - ); - } - - let execution_result = if state_transition_execution_event.is_valid() { - let execution_event = state_transition_execution_event.into_data()?; - - let result = self.execute_event( - execution_event, - block_info, - transaction, - platform_version, - )?; - - tracing::debug!( - method = "process_raw_state_transitions_v0", - "{} state transition ({}) successfully processed", - state_transition.name(), - st_hash, + transaction, + platform_version, + ) + .unwrap_or_else(|st_error| { + tracing::error!( + error = ?st_error.error, + raw_state_transition = ?st_error.raw_state_transition, + "Error processing state transition: {}", + st_error.error, ); - tracing::trace!(?state_transition, "State transition"); - - result - } else { - let first_consensus_error = state_transition_execution_event - .errors - .first() - .expect("first error must be present for invalid result"); - - tracing::debug!( - errors = ?state_transition_execution_event.errors, - method = "process_raw_state_transitions_v0", - "Invalid {} state transition ({}): {}", - state_transition.name(), - st_hash, - first_consensus_error - ); + StateTransitionExecutionResult::DriveAbciError(st_error.error.to_string()) + }); + + processing_result.add(execution_result)?; + } + + Ok(processing_result) + } + + fn process_raw_state_transition( + &self, + raw_state_transition: &[u8], + block_info: &BlockInfo, + platform_ref: &PlatformRef, + transaction: &Transaction, + platform_version: &PlatformVersion, + ) -> Result { + // Tenderdash hex-encoded ST hash + let mut st_hash = String::new(); + if tracing::enabled!(tracing::Level::TRACE) { + st_hash = hex::encode( + dashcore::hashes::sha256::Hash::hash(raw_state_transition).to_byte_array(), + ); + } + + let state_transition = match StateTransition::deserialize_from_bytes(raw_state_transition) { + Ok(state_transition) => state_transition, + Err(error) => { + return match error { + ProtocolError::PlatformDeserializationError(message) => { + let consensus_error = + SerializedObjectParsingError::new(message.clone()).into(); + let errors = vec![&consensus_error]; - tracing::trace!(?state_transition, "State transition"); + tracing::debug!( + ?errors, + "Invalid unknown state transition ({}): {}", + st_hash, + message + ); - ConsensusExecutionError(SimpleConsensusValidationResult::new_with_errors( - state_transition_execution_event.errors, - )) + Ok(StateTransitionExecutionResult::UnpaidConsensusError( + consensus_error, + )) + } + ProtocolError::MaxEncodedBytesReachedError { .. } => { + let message = error.to_string(); + let consensus_error = + SerializedObjectParsingError::new(message.clone()).into(); + let errors = vec![&consensus_error]; + + tracing::debug!( + ?errors, + "Invalid unknown state transition ({}): {}", + st_hash, + message + ); + + Ok(StateTransitionExecutionResult::UnpaidConsensusError( + consensus_error, + )) + } + _ => Err(StateTransitionAwareError { + error: error.into(), + raw_state_transition: raw_state_transition.into(), + }), }; - if let SuccessfulPaidExecution(_, fee_result) = &execution_result { - aggregate_fee_result.checked_add_assign(fee_result.clone())?; - } + } + }; + + tracing::trace!(?state_transition, "Processing state transition"); + + let state_transition_name = state_transition.name(); + let is_st_asset_lock_funded = matches!( + state_transition, + StateTransition::IdentityCreate(_) | StateTransition::IdentityTopUp(_), + ); + + // Validate state transition and produce an execution event + let mut st_validation_result = + process_state_transition(platform_ref, state_transition, Some(transaction)).map_err( + |error| StateTransitionAwareError { + error, + raw_state_transition: raw_state_transition.into(), + }, + )?; + + // State Transition is invalid + if !st_validation_result.is_valid() { + let first_consensus_error = st_validation_result + .errors + // the first error must be present for an invalid result + .remove(0); + + tracing::debug!( + errors = ?st_validation_result.errors, + "Invalid {} state transition ({}): {}", + state_transition_name, + st_hash, + &first_consensus_error + ); + + // To prevent spam we should deduct fees for invalid state transitions as well. + // There are two cases when the user can't pay fees: + // 1. The state transition is funded by an asset lock transactions. This transactions are + // placed on the payment blockchain and they can't be partially spent. + // 2. We can't prove that the state transition is assosiated with identity or identity balance is not + // enough to cover processing fees + // TODO: process_state_transition should return fees for invalid state transitions as well so we can + // deduct the fees from balance if identity is valid + // TODO: Replace with state_transition.optional_asset_lock_proof().is_some() in check tx PR + let state_transition_execution_result = if is_st_asset_lock_funded { + StateTransitionExecutionResult::UnpaidConsensusError(first_consensus_error) + } else { + StateTransitionExecutionResult::PaidConsensusError(first_consensus_error) + }; - Ok((raw_state_transition.clone(), execution_result)) - }) - .collect::, StateTransitionExecutionResult)>, Error>>()?; + return Ok(state_transition_execution_result); + } + + let execution_event = + st_validation_result + .into_data() + .map_err(|error| StateTransitionAwareError { + error: error.into(), + raw_state_transition: raw_state_transition.into(), + })?; + + let event_execution_result = self + .execute_event(execution_event, block_info, transaction, platform_version) + .map_err(|error| StateTransitionAwareError { + error, + raw_state_transition: raw_state_transition.into(), + })?; + + let state_transition_execution_result = match event_execution_result { + EventExecutionResult::SuccessfulPaidExecution(estimated_fees, actual_fees) => { + tracing::debug!( + "{} state transition ({}) successfully processed", + state_transition_name, + st_hash, + ); + + StateTransitionExecutionResult::SuccessfulExecution(estimated_fees, actual_fees) + } + EventExecutionResult::SuccessfulFreeExecution => { + tracing::debug!( + "Free {} state transition ({}) successfully processed", + state_transition_name, + st_hash, + ); + + StateTransitionExecutionResult::SuccessfulExecution( + FeeResult::default(), + FeeResult::default(), + ) + } + EventExecutionResult::ConsensusExecutionError(mut validation_result) => { + // TODO: In case of balance is not enough, we need to reduce balance only for processing fees + // and return paid consensus error. + // Unpaid consensus error should be only if balance not enough even + // to cover processing fees + let first_consensus_error = validation_result + .errors + // the first error must be present for an invalid result + .remove(0); + + tracing::debug!( + error = ?first_consensus_error, + "Insufficient identity balance to process {} state transition ({})", + state_transition_name, + st_hash, + ); + + StateTransitionExecutionResult::UnpaidConsensusError(first_consensus_error) + } + }; - Ok((aggregate_fee_result, exec_tx_results)) + Ok(state_transition_execution_result) } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs index 80bbbfa688..3d100cb494 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs @@ -84,7 +84,7 @@ pub(in crate::execution) fn process_state_transition_v0<'a, C: CoreRPCLike>( None }; - // + // Validating signatures let result = state_transition.validate_identity_and_signatures( platform.drive, action.as_ref(), @@ -92,10 +92,11 @@ pub(in crate::execution) fn process_state_transition_v0<'a, C: CoreRPCLike>( &mut state_transition_execution_context, platform_version, )?; - // Validating signatures + if !result.is_valid() { return Ok(ConsensusValidationResult::::new_with_errors(result.errors)); } + let maybe_identity = result.into_data()?; // Validating state diff --git a/packages/rs-drive-abci/src/platform_types/block_execution_outcome/v0/mod.rs b/packages/rs-drive-abci/src/platform_types/block_execution_outcome/v0/mod.rs index 2bb7453355..14d02aeb2f 100644 --- a/packages/rs-drive-abci/src/platform_types/block_execution_outcome/v0/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/block_execution_outcome/v0/mod.rs @@ -1,5 +1,5 @@ use crate::abci::AbciError; -use crate::platform_types::state_transition_execution_result::StateTransitionExecutionResult; +use crate::platform_types::state_transitions_processing_result::StateTransitionsProcessingResult; use dpp::util::deserializer::ProtocolVersion; use dpp::validation::SimpleValidationResult; use tenderdash_abci::proto::abci::ValidatorSetUpdate; @@ -11,7 +11,7 @@ pub struct BlockExecutionOutcome { /// after the block has been executed pub app_hash: [u8; 32], /// The results of the execution of each state transition - pub state_transition_results: Vec<(Vec, StateTransitionExecutionResult)>, + pub state_transitions_result: StateTransitionsProcessingResult, /// The changes to the validator set // TODO We should use another DTO, only abci module should deal with Tenderdash proto structures pub validator_set_update: Option, diff --git a/packages/rs-drive-abci/src/platform_types/event_execution_result/mod.rs b/packages/rs-drive-abci/src/platform_types/event_execution_result/mod.rs new file mode 100644 index 0000000000..4ade8fa4de --- /dev/null +++ b/packages/rs-drive-abci/src/platform_types/event_execution_result/mod.rs @@ -0,0 +1,17 @@ +use dpp::validation::SimpleConsensusValidationResult; + +use dpp::fee::fee_result::FeeResult; + +/// The Fee Result for a Dry Run (without state) +pub type EstimatedFeeResult = FeeResult; + +/// An execution result +#[derive(Debug, Clone)] +pub enum EventExecutionResult { + /// Successfully executed a paid event + SuccessfulPaidExecution(EstimatedFeeResult, FeeResult), + /// Successfully executed a free event + SuccessfulFreeExecution, + /// There were consensus errors when trying to execute an event + ConsensusExecutionError(SimpleConsensusValidationResult), +} diff --git a/packages/rs-drive-abci/src/platform_types/mod.rs b/packages/rs-drive-abci/src/platform_types/mod.rs index 45301b68a3..3c9ea91fde 100644 --- a/packages/rs-drive-abci/src/platform_types/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/mod.rs @@ -37,6 +37,8 @@ pub mod cleaned_abci_messages; pub mod commit; /// Epoch pub mod epoch_info; +/// The execution event result +pub mod event_execution_result; /// Masternode pub mod masternode; /// Main platform structs, not versioned @@ -46,7 +48,7 @@ pub mod platform_state; /// Required identity public key set for system identities pub mod required_identity_public_key_set; /// The state transition execution result as part of the block execution outcome -pub mod state_transition_execution_result; +pub mod state_transitions_processing_result; /// System identity public keys pub mod system_identity_public_keys; /// The validator module diff --git a/packages/rs-drive-abci/src/platform_types/state_transition_execution_result/mod.rs b/packages/rs-drive-abci/src/platform_types/state_transition_execution_result/mod.rs deleted file mode 100644 index 7e1f072c3c..0000000000 --- a/packages/rs-drive-abci/src/platform_types/state_transition_execution_result/mod.rs +++ /dev/null @@ -1,32 +0,0 @@ -use dpp::validation::SimpleConsensusValidationResult; - -use dpp::fee::fee_result::FeeResult; - -/// The Fee Result for a Dry Run (without state) -pub type DryRunFeeResult = FeeResult; - -/// An execution result -#[derive(Debug, Clone)] -pub enum StateTransitionExecutionResult { - /// Successfully executed a paid event - SuccessfulPaidExecution(DryRunFeeResult, FeeResult), - /// Successfully executed a free event - SuccessfulFreeExecution, - /// There were consensus errors when trying to execute an event - ConsensusExecutionError(SimpleConsensusValidationResult), -} - -// impl From> for ExecutionResult { -// fn from(value: ValidationResult) -> Self { -// let ValidationResult { errors, data } = value; -// if let Some(result) = data { -// if !errors.is_empty() { -// ConsensusExecutionError(SimpleValidationResult::new_with_errors(errors)) -// } else { -// result -// } -// } else { -// ConsensusExecutionError(SimpleValidationResult::new_with_errors(errors)) -// } -// } -// } diff --git a/packages/rs-drive-abci/src/platform_types/state_transitions_processing_result/mod.rs b/packages/rs-drive-abci/src/platform_types/state_transitions_processing_result/mod.rs new file mode 100644 index 0000000000..d565277a72 --- /dev/null +++ b/packages/rs-drive-abci/src/platform_types/state_transitions_processing_result/mod.rs @@ -0,0 +1,83 @@ +use dpp::consensus::ConsensusError; + +use crate::error::Error; +use crate::platform_types::event_execution_result::EstimatedFeeResult; +use dpp::fee::fee_result::FeeResult; + +/// State Transition Execution Result represents a result of the single state transition execution. +/// There are four possible outcomes of the state transition execution described by this enum +#[derive(Debug, Clone)] +pub enum StateTransitionExecutionResult { + // TODO: Error should also have fees + /// State Transition is invalid, but we have a proved identity associated with it, + /// and we can deduct processing fees calculated until this validation error happened + PaidConsensusError(ConsensusError), + /// State Transition is invalid, but we don't have a proved identity associated with it + /// so we can't deduct balance. + UnpaidConsensusError(ConsensusError), + /// State Transition execution failed due to the internal drive-abci error + DriveAbciError(String), + /// State Transition was successfully executed + SuccessfulExecution(EstimatedFeeResult, FeeResult), +} + +/// State Transitions Processing Result produced by [process_raw_state_transitions] and represents +/// a result of a batch state transitions execution. It contains [StateTransitionExecutionResult] for +/// each state transition and aggregated fees. +#[derive(Debug, Default, Clone)] +pub struct StateTransitionsProcessingResult { + execution_results: Vec, + invalid_count: usize, + valid_count: usize, + failed_count: usize, + fees: FeeResult, +} + +impl StateTransitionsProcessingResult { + /// Add a new execution result + pub fn add(&mut self, execution_result: StateTransitionExecutionResult) -> Result<(), Error> { + match &execution_result { + StateTransitionExecutionResult::DriveAbciError(_) => { + self.failed_count += 1; + } + StateTransitionExecutionResult::PaidConsensusError(_) + | StateTransitionExecutionResult::UnpaidConsensusError(_) => { + self.invalid_count += 1; + } + StateTransitionExecutionResult::SuccessfulExecution(_, actual_fees) => { + self.valid_count += 1; + + self.fees.checked_add_assign(actual_fees.clone())?; + } + } + + self.execution_results.push(execution_result); + + Ok(()) + } + + /// Returns the number of invalid state transitions + pub fn invalid_count(&self) -> usize { + self.invalid_count + } + + /// Returns the number of valid state transitions + pub fn valid_count(&self) -> usize { + self.valid_count + } + + /// Returns the number of failed state transitions + pub fn failed_count(&self) -> usize { + self.failed_count + } + + /// Returns the aggregated fees + pub fn aggregated_fees(&self) -> &FeeResult { + &self.fees + } + + /// Transform into the state transition execution results + pub fn into_execution_results(self) -> Vec { + self.execution_results + } +} diff --git a/packages/rs-drive-abci/tests/strategy_tests/failures.rs b/packages/rs-drive-abci/tests/strategy_tests/failures.rs index 6a58c01b8e..6f55d48d65 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/failures.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/failures.rs @@ -395,14 +395,17 @@ mod tests { let first_document_insert_result = &state_transitions_block_2 .first() - .as_ref() .expect("expected a document insert") .1; + assert_eq!(first_document_insert_result.code, 0); - let second_document_insert_result = &state_transitions_block_2.get(1); + let second_document_insert_result = &state_transitions_block_2 + .get(1) + .expect("expected an invalid state transition") + .1; - // Second document should not be present - assert!(second_document_insert_result.is_none()); + // Second document should fail with DuplicateUniqueIndexError + assert_eq!(second_document_insert_result.code, 4009); } } diff --git a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs index 726a80fbc8..2e88186f20 100644 --- a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs @@ -119,7 +119,6 @@ use crate::errors::consensus::basic::{ }; use crate::errors::consensus::fee::BalanceIsNotEnoughErrorWasm; -// use crate::errors::consensus::state::data_contract::data_trigger::DataTriggerInvalidResultErrorWasm; use crate::errors::consensus::value_error::ValueErrorWasm; use super::state::document::DocumentTimestampsAreEqualErrorWasm; From c47aed454f39e1a09c4010fd0324478ca1a95be4 Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Sat, 6 Jan 2024 00:32:57 +0700 Subject: [PATCH 007/191] feat(drive-abci)!: remove unnecessary validation from check tx and re-check (#1647) Co-authored-by: Ivan Shumkov --- .../src/identity/state_transition/mod.rs | 8 + packages/rs-dpp/src/state_transition/mod.rs | 15 +- .../data_contract_create_transition/mod.rs | 6 +- .../data_contract_update_transition/mod.rs | 3 + .../documents_batch_transition/mod.rs | 2 + .../identity_create_transition/proved.rs | 8 +- .../mod.rs | 3 + .../mod.rs | 3 + .../identity_topup_transition/proved.rs | 8 +- .../identity_update_transition/mod.rs | 3 + .../rs-drive-abci/src/abci/handler/mod.rs | 10 +- .../src/execution/check_tx/mod.rs | 44 +++- .../src/execution/check_tx/v0/mod.rs | 249 ++++++++++++++++-- .../process_raw_state_transitions/v0/mod.rs | 7 +- .../check_tx_verification/mod.rs | 47 ++++ .../check_tx_verification/v0/mod.rs | 222 ++++++++++++++++ .../common/asset_lock/proof/mod.rs | 54 +--- .../asset_lock/proof/validate/chain/mod.rs | 35 +++ .../asset_lock/proof/validate/instant/mod.rs | 42 +++ .../common/asset_lock/proof/validate/mod.rs | 52 ++++ .../{ => verify_is_not_spent}/chain/mod.rs | 17 +- .../{ => verify_is_not_spent}/instant/mod.rs | 20 +- .../proof/verify_is_not_spent/mod.rs | 53 ++++ .../validation/state_transition/mod.rs | 1 + .../state_transition/processor/v0/mod.rs | 20 ++ .../state_transitions/documents_batch/mod.rs | 4 + .../identity_create/state/v0/mod.rs | 16 +- .../identity_top_up/state/v0/mod.rs | 7 +- .../document/document_create_transition.rs | 21 +- .../src/version/drive_abci_versions.rs | 1 + .../src/version/mocks/v2_test.rs | 1 + .../src/version/mocks/v3_test.rs | 1 + .../rs-platform-version/src/version/v1.rs | 1 + 33 files changed, 840 insertions(+), 144 deletions(-) create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/validate/chain/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/validate/instant/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/validate/mod.rs rename packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/{ => verify_is_not_spent}/chain/mod.rs (73%) rename packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/{ => verify_is_not_spent}/instant/mod.rs (73%) create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/verify_is_not_spent/mod.rs diff --git a/packages/rs-dpp/src/identity/state_transition/mod.rs b/packages/rs-dpp/src/identity/state_transition/mod.rs index a2b4256eb6..874928f8c5 100644 --- a/packages/rs-dpp/src/identity/state_transition/mod.rs +++ b/packages/rs-dpp/src/identity/state_transition/mod.rs @@ -16,3 +16,11 @@ pub trait AssetLockProved { /// Get asset lock proof fn asset_lock_proof(&self) -> &AssetLockProof; } + +/// Only state transitions funded with Asset Lock Transactions have Asset Lock Proofs +pub trait OptionallyAssetLockProved { + /// Returns asset lock proof if state transition implements it + fn optional_asset_lock_proof(&self) -> Option<&AssetLockProof> { + None + } +} diff --git a/packages/rs-dpp/src/state_transition/mod.rs b/packages/rs-dpp/src/state_transition/mod.rs index 73518cf73e..b874db7990 100644 --- a/packages/rs-dpp/src/state_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/mod.rs @@ -36,7 +36,9 @@ use crate::consensus::ConsensusError; use crate::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; use crate::identity::signer::Signer; +use crate::identity::state_transition::OptionallyAssetLockProved; use crate::identity::{IdentityPublicKey, KeyID, KeyType, Purpose, SecurityLevel}; +use crate::prelude::AssetLockProof; pub use state_transitions::*; use crate::serialization::Signable; @@ -243,16 +245,13 @@ pub enum StateTransition { IdentityCreditTransfer(IdentityCreditTransferTransition), } -impl StateTransition { - /// This means we should transform into the action before validation of the structure - pub fn requires_state_to_validate_structure(&self) -> bool { - matches!(self, StateTransition::DocumentsBatch(_)) - } - /// This means we should transform into the action before validation of the identity and signatures - pub fn requires_state_to_validate_identity_and_signatures(&self) -> bool { - matches!(self, StateTransition::DocumentsBatch(_)) +impl OptionallyAssetLockProved for StateTransition { + fn optional_asset_lock_proof(&self) -> Option<&AssetLockProof> { + call_method!(self, optional_asset_lock_proof) } +} +impl StateTransition { pub fn is_identity_signed(&self) -> bool { !matches!( self, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/mod.rs index 0d3e8ae0f7..929946cda5 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/mod.rs @@ -27,6 +27,7 @@ use platform_versioning::PlatformVersioned; use serde::{Deserialize, Serialize}; use crate::data_contract::created_data_contract::CreatedDataContract; +use crate::identity::state_transition::OptionallyAssetLockProved; pub use v0::*; pub type DataContractCreateTransitionLatest = DataContractCreateTransitionV0; @@ -146,6 +147,8 @@ impl DataContractCreateTransition { } } +impl OptionallyAssetLockProved for DataContractCreateTransition {} + #[cfg(test)] mod test { use crate::data_contract::conversion::json::DataContractJsonConversionMethodsV0; @@ -155,7 +158,6 @@ mod test { use crate::data_contract::accessors::v0::DataContractV0Getters; use crate::data_contract::conversion::value::v0::DataContractValueConversionMethodsV0; use crate::state_transition::data_contract_create_transition::accessors::DataContractCreateTransitionAccessorsV0; - use crate::state_transition::state_transitions::common_fields::property_names; use crate::state_transition::traits::StateTransitionLike; use crate::state_transition::{StateTransitionType, StateTransitionValueConvert}; use crate::tests::fixtures::get_data_contract_fixture; @@ -185,7 +187,7 @@ mod test { ), ), ( - property_names::ENTROPY, + ENTROPY, Value::Bytes32(created_data_contract.entropy_used().to_buffer()), ), ( diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/mod.rs index 56b7003ac0..7d95c8f68e 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/mod.rs @@ -27,6 +27,7 @@ use platform_version::{TryFromPlatformVersioned, TryIntoPlatformVersioned}; use crate::data_contract::DataContract; +use crate::identity::state_transition::OptionallyAssetLockProved; pub use v0::*; pub type DataContractUpdateTransitionLatest = DataContractUpdateTransitionV0; @@ -99,6 +100,8 @@ impl StateTransitionFieldTypes for DataContractUpdateTransition { } } +impl OptionallyAssetLockProved for DataContractUpdateTransition {} + #[cfg(test)] mod test { use crate::data_contract::DataContract; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/mod.rs index 51678da4b6..d3c905890c 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/mod.rs @@ -41,6 +41,7 @@ use crate::state_transition::data_contract_update_transition::{ use crate::state_transition::documents_batch_transition::fields::property_names; +use crate::identity::state_transition::OptionallyAssetLockProved; pub use v0::*; #[derive( @@ -593,3 +594,4 @@ pub fn get_security_level_requirement(v: &Value, default: SecurityLevel) -> Secu // assert_eq!(hex::encode(expected_bytes), hex::encode(bytes)); // } // } +impl OptionallyAssetLockProved for DocumentsBatchTransition {} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/proved.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/proved.rs index 79954d54f9..cee34c9d4b 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/proved.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/proved.rs @@ -1,8 +1,14 @@ -use crate::identity::state_transition::AssetLockProved; +use crate::identity::state_transition::{AssetLockProved, OptionallyAssetLockProved}; use crate::prelude::AssetLockProof; use crate::state_transition::identity_create_transition::IdentityCreateTransition; use crate::ProtocolError; +impl OptionallyAssetLockProved for IdentityCreateTransition { + fn optional_asset_lock_proof(&self) -> Option<&AssetLockProof> { + Some(self.asset_lock_proof()) + } +} + impl AssetLockProved for IdentityCreateTransition { fn set_asset_lock_proof( &mut self, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/mod.rs index ebe10ef16a..eee8925ca7 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/mod.rs @@ -15,6 +15,7 @@ use crate::state_transition::identity_credit_transfer_transition::v0::IdentityCr use crate::state_transition::identity_credit_transfer_transition::v0::IdentityCreditTransferTransitionV0Signable; use crate::state_transition::StateTransitionFieldTypes; +use crate::identity::state_transition::OptionallyAssetLockProved; use crate::ProtocolError; use bincode::{Decode, Encode}; use derive_more::From; @@ -71,6 +72,8 @@ impl IdentityCreditTransferTransition { } } +impl OptionallyAssetLockProved for IdentityCreditTransferTransition {} + impl StateTransitionFieldTypes for IdentityCreditTransferTransition { fn signature_property_paths() -> Vec<&'static str> { vec![SIGNATURE] diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/mod.rs index 7dc6a29030..c7b052160e 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/mod.rs @@ -15,6 +15,7 @@ mod version; use crate::state_transition::identity_credit_withdrawal_transition::v0::IdentityCreditWithdrawalTransitionV0Signable; use crate::state_transition::StateTransitionFieldTypes; +use crate::identity::state_transition::OptionallyAssetLockProved; use crate::ProtocolError; use bincode::{Decode, Encode}; use data_contracts::withdrawals_contract::document_types::withdrawal::properties::OUTPUT_SCRIPT; @@ -65,3 +66,5 @@ impl StateTransitionFieldTypes for IdentityCreditWithdrawalTransition { vec![SIGNATURE, OUTPUT_SCRIPT] } } + +impl OptionallyAssetLockProved for IdentityCreditWithdrawalTransition {} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/proved.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/proved.rs index 3d99212808..d664ee5ab9 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/proved.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/proved.rs @@ -1,8 +1,14 @@ -use crate::identity::state_transition::AssetLockProved; +use crate::identity::state_transition::{AssetLockProved, OptionallyAssetLockProved}; use crate::prelude::AssetLockProof; use crate::state_transition::identity_topup_transition::IdentityTopUpTransition; use crate::ProtocolError; +impl OptionallyAssetLockProved for IdentityTopUpTransition { + fn optional_asset_lock_proof(&self) -> Option<&AssetLockProof> { + Some(self.asset_lock_proof()) + } +} + impl AssetLockProved for IdentityTopUpTransition { fn set_asset_lock_proof( &mut self, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/mod.rs index 0ef9d4c5d7..f164926580 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/mod.rs @@ -17,6 +17,7 @@ use crate::state_transition::identity_update_transition::v0::IdentityUpdateTrans use crate::state_transition::StateTransitionFieldTypes; use fields::*; +use crate::identity::state_transition::OptionallyAssetLockProved; use crate::ProtocolError; use bincode::{Decode, Encode}; use derive_more::From; @@ -70,6 +71,8 @@ impl IdentityUpdateTransition { } } +impl OptionallyAssetLockProved for IdentityUpdateTransition {} + impl StateTransitionFieldTypes for IdentityUpdateTransition { fn binary_property_paths() -> Vec<&'static str> { vec![SIGNATURE, ADD_PUBLIC_KEYS_SIGNATURE] diff --git a/packages/rs-drive-abci/src/abci/handler/mod.rs b/packages/rs-drive-abci/src/abci/handler/mod.rs index dc8649ac9a..68f709864f 100644 --- a/packages/rs-drive-abci/src/abci/handler/mod.rs +++ b/packages/rs-drive-abci/src/abci/handler/mod.rs @@ -753,8 +753,8 @@ where ) -> Result { let _timer = crate::metrics::abci_request_duration("check_tx"); - let RequestCheckTx { tx, .. } = request; - match self.platform.check_tx(tx.as_slice()) { + let RequestCheckTx { tx, r#type } = request; + match self.platform.check_tx(tx.as_slice(), r#type.try_into()?) { Ok(validation_result) => { let platform_state = self.platform.state.read().unwrap(); let platform_version = platform_state.current_platform_version()?; @@ -774,7 +774,11 @@ where let gas_wanted = validation_result .data - .map(|fee_result| fee_result.total_base_fee()) + .map(|fee_result| { + fee_result + .map(|fee_result| fee_result.total_base_fee()) + .unwrap_or_default() + }) .unwrap_or_default(); Ok(ResponseCheckTx { diff --git a/packages/rs-drive-abci/src/execution/check_tx/mod.rs b/packages/rs-drive-abci/src/execution/check_tx/mod.rs index e6c5b7d3f3..64434b669a 100644 --- a/packages/rs-drive-abci/src/execution/check_tx/mod.rs +++ b/packages/rs-drive-abci/src/execution/check_tx/mod.rs @@ -2,6 +2,7 @@ use crate::error::execution::ExecutionError; use crate::error::Error; use crate::platform_types::platform::Platform; +use crate::abci::AbciError; use crate::rpc::core::CoreRPCLike; use dpp::consensus::ConsensusError; use dpp::fee::fee_result::FeeResult; @@ -9,6 +10,44 @@ use dpp::validation::ValidationResult; mod v0; +// @append_only +#[repr(u8)] +#[derive(Copy, Clone, Debug)] +pub enum CheckTxLevel { + FirstTimeCheck, + Recheck, +} + +impl TryFrom for CheckTxLevel { + type Error = Error; + + fn try_from(value: u8) -> Result { + match value { + 0 => Ok(CheckTxLevel::FirstTimeCheck), + 1 => Ok(CheckTxLevel::Recheck), + value => Err(Error::Abci(AbciError::BadRequest(format!( + "Invalid value for CheckTxLevel {}", + value + )))), + } + } +} + +impl TryFrom for CheckTxLevel { + type Error = Error; + + fn try_from(value: i32) -> Result { + match value { + 0 => Ok(CheckTxLevel::FirstTimeCheck), + 1 => Ok(CheckTxLevel::Recheck), + value => Err(Error::Abci(AbciError::BadRequest(format!( + "Invalid value for CheckTxLevel {}", + value + )))), + } + } +} + impl Platform where C: CoreRPCLike, @@ -30,11 +69,12 @@ where pub fn check_tx( &self, raw_tx: &[u8], - ) -> Result, Error> { + check_tx_level: CheckTxLevel, + ) -> Result, ConsensusError>, Error> { let state = self.state.read().expect("expected to get state"); let platform_version = state.current_platform_version()?; match platform_version.drive_abci.methods.engine.check_tx { - 0 => self.check_tx_v0(raw_tx), + 0 => self.check_tx_v0(raw_tx, check_tx_level), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "check_tx".to_string(), known_versions: vec![0], diff --git a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs index 7868028ca8..cafa016da3 100644 --- a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs @@ -1,4 +1,6 @@ use crate::error::Error; +use crate::execution::check_tx::CheckTxLevel; +use crate::execution::validation::state_transition::check_tx_verification::state_transition_to_execution_event_for_check_tx; use crate::execution::validation::state_transition::processor::process_state_transition; #[cfg(test)] use crate::platform_types::event_execution_result::EventExecutionResult; @@ -76,7 +78,8 @@ where pub(super) fn check_tx_v0( &self, raw_tx: &[u8], - ) -> Result, Error> { + check_tx_level: CheckTxLevel, + ) -> Result, ConsensusError>, Error> { let state_transition = match StateTransition::deserialize_from_bytes(raw_tx) { Ok(state_transition) => state_transition, Err(err) => { @@ -101,13 +104,22 @@ where block_info, }; - let execution_event = process_state_transition(&platform_ref, state_transition, None)?; - let platform_version = platform_ref.state.current_platform_version()?; + let execution_event = state_transition_to_execution_event_for_check_tx( + &platform_ref, + state_transition, + check_tx_level, + )?; + // We should run the execution event in dry run to see if we would have enough fees for the transition execution_event.and_then_borrowed_validation(|execution_event| { - self.validate_fees_of_event(execution_event, block_info, None, platform_version) + if let Some(execution_event) = execution_event { + self.validate_fees_of_event(execution_event, block_info, None, platform_version) + .map(|validation_result| validation_result.map(Some)) + } else { + Ok(ValidationResult::new_with_data(None)) + } }) } } @@ -157,6 +169,7 @@ mod tests { use dpp::version::PlatformVersion; use dpp::NativeBlsModule; + use crate::execution::check_tx::CheckTxLevel::{FirstTimeCheck, Recheck}; use dpp::identity::contract_bounds::ContractBounds::SingleContractDocumentType; use dpp::platform_value::Bytes32; use dpp::system_data_contracts::dashpay_contract; @@ -166,7 +179,7 @@ mod tests { use rand::SeedableRng; use std::collections::BTreeMap; - // This test needs to be finished, but is still useful for debugging + // This test needs to be redone with new contract bytes, but is still useful for debugging #[test] #[ignore] fn verify_check_tx_on_data_contract_create() { @@ -232,19 +245,34 @@ mod tests { let transaction = platform.drive.grove.start_transaction(); - let check_result = platform.check_tx(&tx).expect("expected to check tx"); + let check_result = platform + .check_tx(&tx, FirstTimeCheck) + .expect("expected to check tx"); + assert!(check_result.is_valid()); - let _result = platform + let check_result = platform + .check_tx(&tx, Recheck) + .expect("expected to check tx"); + + assert!(check_result.is_valid()); + + platform .platform .process_raw_state_transitions( - &vec![tx], + &vec![tx.clone()], &state, &BlockInfo::default(), &transaction, platform_version, ) .expect("expected to process state transition"); + + let check_result = platform + .check_tx(&tx, Recheck) + .expect("expected to check tx"); + + assert!(!check_result.is_valid()); } #[test] @@ -307,10 +335,152 @@ mod tests { .expect("expected to insert identity"); let validation_result = platform - .check_tx(serialized.as_slice()) + .check_tx(serialized.as_slice(), FirstTimeCheck) .expect("expected to check tx"); assert!(validation_result.errors.is_empty()); + + let check_result = platform + .check_tx(serialized.as_slice(), Recheck) + .expect("expected to check tx"); + + assert!(check_result.is_valid()); + + let transaction = platform.drive.grove.start_transaction(); + + platform + .platform + .process_raw_state_transitions( + &vec![serialized.clone()], + &state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + let check_result = platform + .check_tx(serialized.as_slice(), Recheck) + .expect("expected to check tx"); + + assert!(check_result.is_valid()); // it should still be valid, because we didn't commit the transaction + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit"); + + let check_result = platform + .check_tx(serialized.as_slice(), Recheck) + .expect("expected to check tx"); + + assert!(check_result.is_valid()); // it should still be valid, because we don't validate state + } + + #[test] + fn data_contract_create_check_tx_after_identity_balance_used_up() { + let mut platform = TestPlatformBuilder::new() + .with_config(PlatformConfig::default()) + .build_with_mock_rpc(); + + platform + .core_rpc + .expect_verify_instant_lock() + .returning(|_, _| Ok(true)); + + let state = platform.state.read().unwrap(); + let protocol_version = state.current_protocol_version_in_consensus(); + let platform_version = PlatformVersion::get(protocol_version).unwrap(); + + let (key, private_key) = IdentityPublicKey::random_ecdsa_critical_level_authentication_key( + 1, + Some(1), + platform_version, + ) + .expect("expected to get key pair"); + + platform + .drive + .create_initial_state_structure(None, platform_version) + .expect("expected to create state structure"); + let identity: Identity = IdentityV0 { + id: Identifier::new([ + 158, 113, 180, 126, 91, 83, 62, 44, 83, 54, 97, 88, 240, 215, 84, 139, 167, 156, + 166, 203, 222, 4, 64, 31, 215, 199, 149, 151, 190, 246, 251, 44, + ]), + public_keys: BTreeMap::from([(1, key.clone())]), + balance: 200000000, // we have enough balance only for 1 insertion (this is where this test is different) + revision: 0, + } + .into(); + + let dashpay = get_dashpay_contract_fixture(Some(identity.id()), protocol_version); + let mut create_contract_state_transition: StateTransition = dashpay + .try_into_platform_versioned(platform_version) + .expect("expected a state transition"); + create_contract_state_transition + .sign(&key, private_key.as_slice(), &NativeBlsModule) + .expect("expected to sign transition"); + let serialized = create_contract_state_transition + .serialize_to_bytes() + .expect("serialized state transition"); + platform + .drive + .add_new_identity( + identity, + false, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to insert identity"); + + let validation_result = platform + .check_tx(serialized.as_slice(), FirstTimeCheck) + .expect("expected to check tx"); + + assert!(validation_result.errors.is_empty()); + + let check_result = platform + .check_tx(serialized.as_slice(), Recheck) + .expect("expected to check tx"); + + assert!(check_result.is_valid()); + + let transaction = platform.drive.grove.start_transaction(); + + platform + .platform + .process_raw_state_transitions( + &vec![serialized.clone()], + &state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + let check_result = platform + .check_tx(serialized.as_slice(), Recheck) + .expect("expected to check tx"); + + assert!(check_result.is_valid()); // it should still be valid, because we didn't commit the transaction + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit"); + + let check_result = platform + .check_tx(serialized.as_slice(), Recheck) + .expect("expected to check tx"); + + assert!(!check_result.is_valid()); // the identity shouldn't have enough balance anymore } #[test] @@ -494,7 +664,10 @@ mod tests { .expect("expected to commit transaction"); let validation_result = platform - .check_tx(documents_batch_update_serialized_transition.as_slice()) + .check_tx( + documents_batch_update_serialized_transition.as_slice(), + FirstTimeCheck, + ) .expect("expected to check tx"); assert!(validation_result.errors.is_empty()); @@ -609,7 +782,10 @@ mod tests { .expect("serialized state transition"); let validation_result = platform - .check_tx(identity_top_up_serialized_transition.as_slice()) + .check_tx( + identity_top_up_serialized_transition.as_slice(), + FirstTimeCheck, + ) .expect("expected to check tx"); assert!(validation_result.errors.is_empty()); @@ -742,7 +918,10 @@ mod tests { .expect("serialized state transition"); let validation_result = platform - .check_tx(identity_top_up_serialized_transition.as_slice()) + .check_tx( + identity_top_up_serialized_transition.as_slice(), + FirstTimeCheck, + ) .expect("expected to check tx"); assert!(validation_result.errors.is_empty()); @@ -766,7 +945,21 @@ mod tests { .expect("expected to commit transaction"); let validation_result = platform - .check_tx(identity_top_up_serialized_transition.as_slice()) + .check_tx( + identity_top_up_serialized_transition.as_slice(), + FirstTimeCheck, + ) + .expect("expected to check tx"); + + assert!(matches!( + validation_result.errors.first().expect("expected an error"), + ConsensusError::BasicError( + BasicError::IdentityAssetLockTransactionOutPointAlreadyExistsError(_) + ) + )); + + let validation_result = platform + .check_tx(identity_top_up_serialized_transition.as_slice(), Recheck) .expect("expected to check tx"); assert!(matches!( @@ -853,7 +1046,10 @@ mod tests { .expect("serialized state transition"); let validation_result = platform - .check_tx(identity_top_up_serialized_transition.as_slice()) + .check_tx( + identity_top_up_serialized_transition.as_slice(), + FirstTimeCheck, + ) .expect("expected to check tx"); // This errors because we never created the identity @@ -973,7 +1169,10 @@ mod tests { .expect("serialized state transition"); let validation_result = platform - .check_tx(identity_top_up_serialized_transition.as_slice()) + .check_tx( + identity_top_up_serialized_transition.as_slice(), + FirstTimeCheck, + ) .expect("expected to check tx"); assert!(validation_result.errors.is_empty()); @@ -1037,7 +1236,21 @@ mod tests { .expect("serialized state transition"); let validation_result = platform - .check_tx(identity_create_serialized_transition.as_slice()) + .check_tx( + identity_create_serialized_transition.as_slice(), + FirstTimeCheck, + ) + .expect("expected to check tx"); + + assert!(matches!( + validation_result.errors.first().expect("expected an error"), + ConsensusError::BasicError( + BasicError::IdentityAssetLockTransactionOutPointAlreadyExistsError(_) + ) + )); + + let validation_result = platform + .check_tx(identity_create_serialized_transition.as_slice(), Recheck) .expect("expected to check tx"); assert!(matches!( @@ -1148,7 +1361,7 @@ mod tests { .expect("expected to serialize"); let validation_result = platform - .check_tx(update_transition_bytes.as_slice()) + .check_tx(update_transition_bytes.as_slice(), FirstTimeCheck) .expect("expected to execute identity top up tx"); // Only master keys can sign an update @@ -1272,7 +1485,7 @@ mod tests { .expect("expected to serialize"); let validation_result = platform - .check_tx(update_transition_bytes.as_slice()) + .check_tx(update_transition_bytes.as_slice(), FirstTimeCheck) .expect("expected to execute identity top up tx"); // we won't have enough funds diff --git a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_raw_state_transitions/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_raw_state_transitions/v0/mod.rs index d056cf0710..21d180fd13 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_raw_state_transitions/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_raw_state_transitions/v0/mod.rs @@ -7,6 +7,7 @@ use dpp::block::block_info::BlockInfo; use dpp::consensus::basic::decode::SerializedObjectParsingError; use dpp::dashcore::hashes::Hash; use dpp::fee::fee_result::FeeResult; +use dpp::identity::state_transition::OptionallyAssetLockProved; use dpp::serialization::PlatformDeserializable; use dpp::state_transition::StateTransition; use dpp::{dashcore, ProtocolError}; @@ -158,10 +159,7 @@ where tracing::trace!(?state_transition, "Processing state transition"); let state_transition_name = state_transition.name(); - let is_st_asset_lock_funded = matches!( - state_transition, - StateTransition::IdentityCreate(_) | StateTransition::IdentityTopUp(_), - ); + let is_st_asset_lock_funded = state_transition.optional_asset_lock_proof().is_some(); // Validate state transition and produce an execution event let mut st_validation_result = @@ -195,7 +193,6 @@ where // enough to cover processing fees // TODO: process_state_transition should return fees for invalid state transitions as well so we can // deduct the fees from balance if identity is valid - // TODO: Replace with state_transition.optional_asset_lock_proof().is_some() in check tx PR let state_transition_execution_result = if is_st_asset_lock_funded { StateTransitionExecutionResult::UnpaidConsensusError(first_consensus_error) } else { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/mod.rs new file mode 100644 index 0000000000..bd7eb14d37 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/mod.rs @@ -0,0 +1,47 @@ +pub(crate) mod v0; + +use crate::error::execution::ExecutionError; +use crate::error::Error; +use crate::execution::types::execution_event::ExecutionEvent; +use crate::platform_types::platform::PlatformRef; +use crate::rpc::core::CoreRPCLike; +use dpp::prelude::ConsensusValidationResult; +use dpp::state_transition::StateTransition; + +use crate::execution::check_tx::CheckTxLevel; + +/// === CHECK TX: NEW ==== +/// Full validation for identity create and identity top up +/// Otherwise only validate: +/// * identity has enough balance for fee +/// * identity signature on tx is valid +/// * ST structure is valid +/// +/// === CHECK TX: RECHECK === +/// For identity create and identity top up, make sure asset lock has not been used up +/// For other state transitions verify that the user still has enough balance +/// +pub(in crate::execution) fn state_transition_to_execution_event_for_check_tx<'a, C: CoreRPCLike>( + platform: &'a PlatformRef, + state_transition: StateTransition, + check_tx_level: CheckTxLevel, +) -> Result>>, Error> { + let platform_version = platform.state.current_platform_version()?; + match platform_version + .drive_abci + .validation_and_processing + .state_transition_to_execution_event_for_check_tx + { + 0 => v0::state_transition_to_execution_event_for_check_tx_v0( + platform, + state_transition, + check_tx_level, + platform_version, + ), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "state_transition_to_execution_event_for_check_tx".to_string(), + known_versions: vec![0], + received: version, + })), + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs new file mode 100644 index 0000000000..20d35ea0b2 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs @@ -0,0 +1,222 @@ +use crate::error::Error; +use crate::execution::types::execution_event::ExecutionEvent; +use crate::execution::validation::state_transition::transformer::StateTransitionActionTransformerV0; +use crate::platform_types::platform::PlatformRef; +use crate::platform_types::platform_state::v0::PlatformStateV0Methods; +use crate::rpc::core::CoreRPCLike; +use dpp::identity::state_transition::OptionallyAssetLockProved; +use dpp::prelude::ConsensusValidationResult; + +use dpp::state_transition::{StateTransition}; +use dpp::version::{DefaultForPlatformVersion, PlatformVersion}; +use crate::execution::check_tx::CheckTxLevel; +use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; +use crate::execution::validation::state_transition::common::asset_lock::proof::verify_is_not_spent::AssetLockProofVerifyIsNotSpent; +use crate::execution::validation::state_transition::processor::process_state_transition; +use crate::execution::validation::state_transition::processor::v0::{StateTransitionSignatureValidationV0, StateTransitionStructureValidationV0}; + +/// A trait for validating state transitions within a blockchain. +pub(crate) trait StateTransitionCheckTxValidationV0 { + /// This means we should do the full validation on check_tx + fn requires_check_tx_full_validation(&self) -> bool; +} + +impl StateTransitionCheckTxValidationV0 for StateTransition { + fn requires_check_tx_full_validation(&self) -> bool { + matches!( + self, + StateTransition::IdentityCreate(_) | StateTransition::IdentityTopUp(_) + ) + } +} + +pub(super) fn state_transition_to_execution_event_for_check_tx_v0<'a, C: CoreRPCLike>( + platform: &'a PlatformRef, + state_transition: StateTransition, + check_tx_level: CheckTxLevel, + platform_version: &PlatformVersion, +) -> Result>>, Error> { + match check_tx_level { + CheckTxLevel::FirstTimeCheck => { + if state_transition.requires_check_tx_full_validation() { + Ok(process_state_transition(platform, state_transition, None)?.map(Some)) + } else { + // we need to validate the structure, the fees, and the signature + let mut state_transition_execution_context = + StateTransitionExecutionContext::default_for_platform_version( + platform_version, + )?; + + let action = if state_transition.requires_state_to_validate_structure() { + let state_transition_action_result = state_transition.transform_into_action( + platform, + true, + &mut state_transition_execution_context, + None, + )?; + if !state_transition_action_result.is_valid_with_data() { + return Ok( + ConsensusValidationResult::>::new_with_errors( + state_transition_action_result.errors, + ), + ); + } + Some(state_transition_action_result.into_data()?) + } else { + None + }; + + // Validating structure + let result = state_transition.validate_structure( + &platform.into(), + action.as_ref(), + platform.state.current_protocol_version_in_consensus(), + )?; + if !result.is_valid() { + return Ok( + ConsensusValidationResult::>::new_with_errors( + result.errors, + ), + ); + } + + let action = if state_transition + .requires_state_to_validate_identity_and_signatures() + { + if let Some(action) = action { + Some(action) + } else { + let state_transition_action_result = state_transition + .transform_into_action( + platform, + true, + &mut state_transition_execution_context, + None, + )?; + if !state_transition_action_result.is_valid_with_data() { + return Ok( + ConsensusValidationResult::>::new_with_errors( + state_transition_action_result.errors, + ), + ); + } + Some(state_transition_action_result.into_data()?) + } + } else { + None + }; + + // + let result = state_transition.validate_identity_and_signatures( + platform.drive, + action.as_ref(), + None, + &mut state_transition_execution_context, + platform_version, + )?; + // Validating signatures + if !result.is_valid() { + return Ok( + ConsensusValidationResult::>::new_with_errors( + result.errors, + ), + ); + } + let maybe_identity = result.into_data()?; + + let action = if let Some(action) = action { + action + } else { + let state_transition_action_result = state_transition.transform_into_action( + platform, + true, + &mut state_transition_execution_context, + None, + )?; + if !state_transition_action_result.is_valid_with_data() { + return Ok( + ConsensusValidationResult::>::new_with_errors( + state_transition_action_result.errors, + ), + ); + } + state_transition_action_result.into_data()? + }; + + let execution_event = ExecutionEvent::create_from_state_transition_action( + action, + maybe_identity, + platform.state.epoch_ref(), + state_transition_execution_context, + platform_version, + )?; + + Ok( + ConsensusValidationResult::>::new_with_data(Some( + execution_event, + )), + ) + } + } + CheckTxLevel::Recheck => { + if let Some(asset_lock_proof) = state_transition.optional_asset_lock_proof() { + // we should check that the asset lock is still valid + let validation_result = + asset_lock_proof.verify_is_not_spent(platform, None, platform_version)?; + + if validation_result.is_valid() { + Ok(ConsensusValidationResult::>::new_with_data(None)) + } else { + Ok( + ConsensusValidationResult::>::new_with_errors( + validation_result.errors, + ), + ) + } + } else { + // TODO: We aren't calculating processing fees atm. We probably should reconsider this + + let mut state_transition_execution_context = + StateTransitionExecutionContext::default_for_platform_version( + platform_version, + )?; + + let state_transition_action_result = state_transition.transform_into_action( + platform, + true, + &mut state_transition_execution_context, + None, + )?; + + if !state_transition_action_result.is_valid_with_data() { + return Ok( + ConsensusValidationResult::>::new_with_errors( + state_transition_action_result.errors, + ), + ); + } + let action = state_transition_action_result.into_data()?; + + let maybe_identity = platform.drive.fetch_identity_with_balance( + state_transition.owner_id().to_buffer(), + None, + platform_version, + )?; + + let execution_event = ExecutionEvent::create_from_state_transition_action( + action, + maybe_identity, + platform.state.epoch_ref(), + state_transition_execution_context, + platform_version, + )?; + + Ok( + ConsensusValidationResult::>::new_with_data(Some( + execution_event, + )), + ) + } + } + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/mod.rs index d498e0f5de..c1e44b07b0 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/mod.rs @@ -1,52 +1,2 @@ -mod chain; -mod instant; - -use crate::error::Error; -use crate::platform_types::platform::PlatformRef; -use crate::rpc::core::CoreRPCLike; -use dpp::prelude::AssetLockProof; -use dpp::validation::SimpleConsensusValidationResult; -use dpp::version::PlatformVersion; -use drive::grovedb::TransactionArg; - -/// A trait for validating state transitions within a blockchain. -pub trait AssetLockProofStateValidation { - /// Validates the state transition by analyzing the changes in the platform state after applying the transaction. - /// - /// # Arguments - /// - /// * `platform` - A reference to the platform containing the state data. - /// * `tx` - The transaction argument to be applied. - /// - /// # Type Parameters - /// - /// * `C: CoreRPCLike` - A type constraint indicating that C should implement `CoreRPCLike`. - /// - /// # Returns - /// - /// * `Result` - A result with either a SimpleConsensusValidationResult or an Error. - fn validate_state( - &self, - platform_ref: &PlatformRef, - transaction: TransactionArg, - platform_version: &PlatformVersion, - ) -> Result; -} - -impl AssetLockProofStateValidation for AssetLockProof { - fn validate_state( - &self, - platform_ref: &PlatformRef, - transaction: TransactionArg, - platform_version: &PlatformVersion, - ) -> Result { - match self { - AssetLockProof::Instant(proof) => { - proof.validate_state(platform_ref, transaction, platform_version) - } - AssetLockProof::Chain(proof) => { - proof.validate_state(platform_ref, transaction, platform_version) - } - } - } -} +pub mod validate; +pub mod verify_is_not_spent; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/validate/chain/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/validate/chain/mod.rs new file mode 100644 index 0000000000..619c9b7d81 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/validate/chain/mod.rs @@ -0,0 +1,35 @@ +use crate::error::Error; +use crate::platform_types::platform::PlatformRef; +use crate::rpc::core::CoreRPCLike; +use dpp::consensus::basic::identity::{ + InvalidAssetLockProofCoreChainHeightError, +}; +use dpp::identity::state_transition::asset_lock_proof::chain::ChainAssetLockProof; +use dpp::validation::SimpleConsensusValidationResult; +use dpp::version::PlatformVersion; +use drive::grovedb::TransactionArg; +use crate::execution::validation::state_transition::common::asset_lock::proof::validate::AssetLockProofValidation; +use crate::execution::validation::state_transition::common::asset_lock::proof::verify_is_not_spent::AssetLockProofVerifyIsNotSpent; + +// TODO: Versioning +impl AssetLockProofValidation for ChainAssetLockProof { + fn validate( + &self, + platform_ref: &PlatformRef, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result { + let mut result = SimpleConsensusValidationResult::default(); + + if platform_ref.block_info.core_height < self.core_chain_locked_height { + result.add_error(InvalidAssetLockProofCoreChainHeightError::new( + self.core_chain_locked_height, + platform_ref.block_info.core_height, + )); + + return Ok(result); + } + + self.verify_is_not_spent(platform_ref, transaction, platform_version) + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/validate/instant/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/validate/instant/mod.rs new file mode 100644 index 0000000000..ce09c729f6 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/validate/instant/mod.rs @@ -0,0 +1,42 @@ +use crate::error::execution::ExecutionError; +use crate::error::Error; +use crate::platform_types::platform::PlatformRef; +use crate::rpc::core::CoreRPCLike; +use crate::rpc::signature::CoreSignatureVerification; +use dpp::consensus::basic::identity::{ + IdentityAssetLockTransactionOutPointAlreadyExistsError, + InvalidInstantAssetLockProofSignatureError, +}; +use dpp::identity::state_transition::asset_lock_proof::InstantAssetLockProof; +use dpp::platform_value::Bytes36; +use dpp::validation::SimpleConsensusValidationResult; +use dpp::version::PlatformVersion; +use drive::grovedb::TransactionArg; +use crate::execution::validation::state_transition::common::asset_lock::proof::validate::AssetLockProofValidation; +use crate::execution::validation::state_transition::common::asset_lock::proof::verify_is_not_spent::AssetLockProofVerifyIsNotSpent; + +// TODO: Versioning +impl AssetLockProofValidation for InstantAssetLockProof { + fn validate( + &self, + platform_ref: &PlatformRef, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result { + let mut result = SimpleConsensusValidationResult::default(); + + // Verify instant lock signature with Core + + let is_instant_lock_signature_valid = self + .instant_lock() + .verify_signature(platform_ref.core_rpc, platform_ref.block_info.core_height)?; + + if !is_instant_lock_signature_valid { + result.add_error(InvalidInstantAssetLockProofSignatureError::new()); + + return Ok(result); + } + + self.verify_is_not_spent(platform_ref, transaction, platform_version) + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/validate/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/validate/mod.rs new file mode 100644 index 0000000000..596657facc --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/validate/mod.rs @@ -0,0 +1,52 @@ +mod chain; +mod instant; + +use crate::error::Error; +use crate::platform_types::platform::PlatformRef; +use crate::rpc::core::CoreRPCLike; +use dpp::prelude::AssetLockProof; +use dpp::validation::SimpleConsensusValidationResult; +use dpp::version::PlatformVersion; +use drive::grovedb::TransactionArg; + +/// A trait for validating state transitions within a blockchain. +pub trait AssetLockProofValidation { + /// Validates the state transition by analyzing the changes in the platform state after applying the transaction. + /// + /// # Arguments + /// + /// * `platform` - A reference to the platform containing the state data. + /// * `tx` - The transaction argument to be applied. + /// + /// # Type Parameters + /// + /// * `C: CoreRPCLike` - A type constraint indicating that C should implement `CoreRPCLike`. + /// + /// # Returns + /// + /// * `Result` - A result with either a SimpleConsensusValidationResult or an Error. + fn validate( + &self, + platform_ref: &PlatformRef, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result; +} + +impl AssetLockProofValidation for AssetLockProof { + fn validate( + &self, + platform_ref: &PlatformRef, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result { + match self { + AssetLockProof::Instant(proof) => { + proof.validate(platform_ref, transaction, platform_version) + } + AssetLockProof::Chain(proof) => { + proof.validate(platform_ref, transaction, platform_version) + } + } + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/chain/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/verify_is_not_spent/chain/mod.rs similarity index 73% rename from packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/chain/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/verify_is_not_spent/chain/mod.rs index d9a4f55383..ee988de172 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/chain/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/verify_is_not_spent/chain/mod.rs @@ -1,21 +1,19 @@ use crate::error::execution::ExecutionError; use crate::error::Error; -use crate::execution::validation::state_transition::common::asset_lock::proof::AssetLockProofStateValidation; use crate::platform_types::platform::PlatformRef; -use crate::rpc::core::CoreRPCLike; use dpp::consensus::basic::identity::{ IdentityAssetLockTransactionOutPointAlreadyExistsError, - InvalidAssetLockProofCoreChainHeightError, }; use dpp::identity::state_transition::asset_lock_proof::chain::ChainAssetLockProof; use dpp::platform_value::Bytes36; use dpp::validation::SimpleConsensusValidationResult; use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; +use crate::execution::validation::state_transition::common::asset_lock::proof::verify_is_not_spent::AssetLockProofVerifyIsNotSpent; // TODO: Versioning -impl AssetLockProofStateValidation for ChainAssetLockProof { - fn validate_state( +impl AssetLockProofVerifyIsNotSpent for ChainAssetLockProof { + fn verify_is_not_spent( &self, platform_ref: &PlatformRef, transaction: TransactionArg, @@ -23,15 +21,6 @@ impl AssetLockProofStateValidation for ChainAssetLockProof { ) -> Result { let mut result = SimpleConsensusValidationResult::default(); - if platform_ref.block_info.core_height < self.core_chain_locked_height { - result.add_error(InvalidAssetLockProofCoreChainHeightError::new( - self.core_chain_locked_height, - platform_ref.block_info.core_height, - )); - - return Ok(result); - } - // Make sure that asset lock isn't spent yet let outpoint_bytes = self.out_point.try_into().map_err(|_e| { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/instant/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/verify_is_not_spent/instant/mod.rs similarity index 73% rename from packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/instant/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/verify_is_not_spent/instant/mod.rs index 4f193c2c33..cff397074b 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/instant/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/verify_is_not_spent/instant/mod.rs @@ -1,22 +1,20 @@ use crate::error::execution::ExecutionError; use crate::error::Error; -use crate::execution::validation::state_transition::common::asset_lock::proof::AssetLockProofStateValidation; use crate::platform_types::platform::PlatformRef; use crate::rpc::core::CoreRPCLike; -use crate::rpc::signature::CoreSignatureVerification; use dpp::consensus::basic::identity::{ IdentityAssetLockTransactionOutPointAlreadyExistsError, - InvalidInstantAssetLockProofSignatureError, }; use dpp::identity::state_transition::asset_lock_proof::InstantAssetLockProof; use dpp::platform_value::Bytes36; use dpp::validation::SimpleConsensusValidationResult; use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; +use crate::execution::validation::state_transition::common::asset_lock::proof::verify_is_not_spent::AssetLockProofVerifyIsNotSpent; // TODO: Versioning -impl AssetLockProofStateValidation for InstantAssetLockProof { - fn validate_state( +impl AssetLockProofVerifyIsNotSpent for InstantAssetLockProof { + fn verify_is_not_spent( &self, platform_ref: &PlatformRef, transaction: TransactionArg, @@ -51,18 +49,6 @@ impl AssetLockProofStateValidation for InstantAssetLockProof { )) } - // Verify instant lock signature with Core - - let is_instant_lock_signature_valid = self - .instant_lock() - .verify_signature(platform_ref.core_rpc, platform_ref.block_info.core_height)?; - - if !is_instant_lock_signature_valid { - result.add_error(InvalidInstantAssetLockProofSignatureError::new()); - - return Ok(result); - } - Ok(result) } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/verify_is_not_spent/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/verify_is_not_spent/mod.rs new file mode 100644 index 0000000000..9a864e4492 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/verify_is_not_spent/mod.rs @@ -0,0 +1,53 @@ +mod chain; +mod instant; + +use crate::error::Error; +use crate::platform_types::platform::PlatformRef; +use crate::rpc::core::CoreRPCLike; +use dpp::prelude::AssetLockProof; +use dpp::validation::SimpleConsensusValidationResult; +use dpp::version::PlatformVersion; +use drive::grovedb::TransactionArg; + +/// A trait for validating that an asset lock is not spent +pub trait AssetLockProofVerifyIsNotSpent { + /// Validates that the asset lock was not spent + /// + /// # Arguments + /// + /// * `platform` - A reference to the platform containing the state data. + /// * `transaction` - The database transaction to check on, can be None. + /// * `platform_version` - The platform version that we are using + /// + /// # Type Parameters + /// + /// * `C: CoreRPCLike` - A type constraint indicating that C should implement `CoreRPCLike`. + /// + /// # Returns + /// + /// * `Result` - A result with either a SimpleConsensusValidationResult or an Error. + fn verify_is_not_spent( + &self, + platform_ref: &PlatformRef, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result; +} + +impl AssetLockProofVerifyIsNotSpent for AssetLockProof { + fn verify_is_not_spent( + &self, + platform_ref: &PlatformRef, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result { + match self { + AssetLockProof::Instant(proof) => { + proof.verify_is_not_spent(platform_ref, transaction, platform_version) + } + AssetLockProof::Chain(proof) => { + proof.verify_is_not_spent(platform_ref, transaction, platform_version) + } + } + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/mod.rs index 6e78112922..0ef51bf585 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/mod.rs @@ -1,3 +1,4 @@ +pub(crate) mod check_tx_verification; mod common; pub(crate) mod processor; mod state_transitions; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs index 3d100cb494..ac909f52e0 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs @@ -143,6 +143,11 @@ pub(crate) trait StateTransitionSignatureValidationV0 { execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion, ) -> Result>, Error>; + + /// This means we should transform into the action before validation of the identity and signatures + fn requires_state_to_validate_identity_and_signatures(&self) -> bool { + false + } } /// A trait for validating state transitions within a blockchain. @@ -163,6 +168,11 @@ pub(crate) trait StateTransitionStructureValidationV0 { action: Option<&StateTransitionAction>, protocol_version: u32, ) -> Result; + + /// This means we should transform into the action before validation of the structure + fn requires_state_to_validate_structure(&self) -> bool { + false + } } /// A trait for validating state transitions within a blockchain. @@ -226,6 +236,11 @@ impl StateTransitionStructureValidationV0 for StateTransition { } } } + + /// This means we should transform into the action before validation of the structure + fn requires_state_to_validate_structure(&self) -> bool { + matches!(self, StateTransition::DocumentsBatch(_)) + } } impl StateTransitionSignatureValidationV0 for StateTransition { @@ -371,6 +386,11 @@ impl StateTransitionSignatureValidationV0 for StateTransition { } } } + + /// This means we should transform into the action before validation of the identity and signatures + fn requires_state_to_validate_identity_and_signatures(&self) -> bool { + matches!(self, StateTransition::DocumentsBatch(_)) + } } impl StateTransitionStateValidationV0 for StateTransition { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs index 1158428f2e..379d2a995e 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs @@ -95,6 +95,10 @@ impl StateTransitionStructureValidationV0 for DocumentsBatchTransition { })), } } + + fn requires_state_to_validate_structure(&self) -> bool { + true + } } impl StateTransitionStateValidationV0 for DocumentsBatchTransition { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/state/v0/mod.rs index 1de5fa9aeb..ef090ac682 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/state/v0/mod.rs @@ -19,13 +19,16 @@ use dpp::version::PlatformVersion; use drive::state_transition_action::identity::identity_create::IdentityCreateTransitionAction; use drive::state_transition_action::StateTransitionAction; -use drive::grovedb::TransactionArg; -use dpp::version::DefaultForPlatformVersion; use crate::error::execution::ExecutionError; -use crate::execution::types::execution_operation::ExecutionOperation; use crate::execution::types::execution_operation::signature_verification_operation::SignatureVerificationOperation; -use crate::execution::types::state_transition_execution_context::{StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0}; -use crate::execution::validation::state_transition::common::asset_lock::proof::AssetLockProofStateValidation; +use crate::execution::types::execution_operation::ExecutionOperation; +use crate::execution::types::state_transition_execution_context::{ + StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0, +}; +use crate::execution::validation::state_transition::common::asset_lock::proof::validate::AssetLockProofValidation; +use dpp::version::DefaultForPlatformVersion; +use drive::grovedb::TransactionArg; + use crate::execution::validation::state_transition::common::asset_lock::transaction::fetch_asset_lock_transaction_output_sync::fetch_asset_lock_transaction_output_sync; use crate::execution::validation::state_transition::common::validate_unique_identity_public_key_hashes_in_state::validate_unique_identity_public_key_hashes_in_state; @@ -72,8 +75,7 @@ impl IdentityCreateStateTransitionStateValidationV0 for IdentityCreateTransition } // Validate asset lock proof state - //todo: add costs for state validation - validation_result.merge(self.asset_lock_proof().validate_state( + validation_result.merge(self.asset_lock_proof().validate( platform, tx, platform_version, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/state/v0/mod.rs index 9e7caca155..66ece6b365 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/state/v0/mod.rs @@ -17,12 +17,13 @@ use dpp::version::PlatformVersion; use drive::state_transition_action::identity::identity_topup::IdentityTopUpTransitionAction; use drive::state_transition_action::StateTransitionAction; -use drive::grovedb::TransactionArg; use crate::error::execution::ExecutionError; +use drive::grovedb::TransactionArg; + use crate::execution::types::execution_operation::ExecutionOperation; use crate::execution::types::execution_operation::signature_verification_operation::SignatureVerificationOperation; use crate::execution::types::state_transition_execution_context::{StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0}; -use crate::execution::validation::state_transition::common::asset_lock::proof::AssetLockProofStateValidation; +use crate::execution::validation::state_transition::common::asset_lock::proof::validate::AssetLockProofValidation; use crate::execution::validation::state_transition::common::asset_lock::transaction::fetch_asset_lock_transaction_output_sync::fetch_asset_lock_transaction_output_sync; pub(in crate::execution::validation::state_transition::state_transitions::identity_top_up) trait IdentityTopUpStateTransitionStateValidationV0 @@ -53,7 +54,7 @@ impl IdentityTopUpStateTransitionStateValidationV0 for IdentityTopUpTransition { ) -> Result, Error> { let mut validation_result = ConsensusValidationResult::::default(); - validation_result.merge(self.asset_lock_proof().validate_state( + validation_result.merge(self.asset_lock_proof().validate( platform, tx, platform_version, diff --git a/packages/rs-drive/src/drive/batch/transitions/document/document_create_transition.rs b/packages/rs-drive/src/drive/batch/transitions/document/document_create_transition.rs index 08e1e360bb..68892e8eef 100644 --- a/packages/rs-drive/src/drive/batch/transitions/document/document_create_transition.rs +++ b/packages/rs-drive/src/drive/batch/transitions/document/document_create_transition.rs @@ -30,17 +30,16 @@ impl DriveHighLevelDocumentOperationConverter for DocumentCreateTransitionAction let storage_flags = StorageFlags::new_single_epoch(epoch.index, Some(owner_id.to_buffer())); - let mut drive_operations = vec![]; - drive_operations.push(DocumentOperation(DocumentOperationType::AddDocument { - owned_document_info: OwnedDocumentInfo { - document_info: DocumentOwnedInfo((document, Some(Cow::Owned(storage_flags)))), - owner_id: Some(owner_id.into_buffer()), + Ok(vec![DocumentOperation( + DocumentOperationType::AddDocument { + owned_document_info: OwnedDocumentInfo { + document_info: DocumentOwnedInfo((document, Some(Cow::Owned(storage_flags)))), + owner_id: Some(owner_id.into_buffer()), + }, + contract_id: data_contract_id, + document_type_name: Cow::Owned(document_type_name), + override_document: false, }, - contract_id: data_contract_id, - document_type_name: Cow::Owned(document_type_name), - override_document: false, - })); - - Ok(drive_operations) + )]) } } diff --git a/packages/rs-platform-version/src/version/drive_abci_versions.rs b/packages/rs-platform-version/src/version/drive_abci_versions.rs index a3e9d9a442..36c5af5308 100644 --- a/packages/rs-platform-version/src/version/drive_abci_versions.rs +++ b/packages/rs-platform-version/src/version/drive_abci_versions.rs @@ -75,6 +75,7 @@ pub struct DriveAbciMethodVersions { pub struct DriveAbciValidationVersions { pub state_transitions: DriveAbciStateTransitionValidationVersions, pub process_state_transition: FeatureVersion, + pub state_transition_to_execution_event_for_check_tx: FeatureVersion, } #[derive(Clone, Debug, Default)] diff --git a/packages/rs-platform-version/src/version/mocks/v2_test.rs b/packages/rs-platform-version/src/version/mocks/v2_test.rs index 481b2b0a6a..a1a8d82143 100644 --- a/packages/rs-platform-version/src/version/mocks/v2_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v2_test.rs @@ -619,6 +619,7 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { }, }, process_state_transition: 0, + state_transition_to_execution_event_for_check_tx: 0, }, query: DriveAbciQueryVersions { response_metadata: 0, diff --git a/packages/rs-platform-version/src/version/mocks/v3_test.rs b/packages/rs-platform-version/src/version/mocks/v3_test.rs index 846fbf9b01..4a87ecde42 100644 --- a/packages/rs-platform-version/src/version/mocks/v3_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v3_test.rs @@ -619,6 +619,7 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { }, }, process_state_transition: 0, + state_transition_to_execution_event_for_check_tx: 0, }, query: DriveAbciQueryVersions { response_metadata: 0, diff --git a/packages/rs-platform-version/src/version/v1.rs b/packages/rs-platform-version/src/version/v1.rs index f53927ca66..cc0fc782c6 100644 --- a/packages/rs-platform-version/src/version/v1.rs +++ b/packages/rs-platform-version/src/version/v1.rs @@ -616,6 +616,7 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { }, }, process_state_transition: 0, + state_transition_to_execution_event_for_check_tx: 0, }, query: DriveAbciQueryVersions { response_metadata: 0, From 8ad118fc8f16063200b1390a3b07f543a7f7a29c Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Thu, 11 Jan 2024 07:44:26 +0300 Subject: [PATCH 008/191] fix(dapi): internal error when mempool is full (#1661) --- .pnp.cjs | 14 +++++++------- ...directs-npm-1.15.2-1ec1dd82be-8be0d39919.zip | Bin 10821 -> 0 bytes ...directs-npm-1.15.4-3384d6a415-2e8f5f259a.zip | Bin 0 -> 11151 bytes package.json | 3 ++- .../broadcastStateTransitionHandlerFactory.js | 16 ++++++++++++++-- ...oadcastStateTransitionHandlerFactory.spec.js | 2 +- yarn.lock | 8 ++++---- 7 files changed, 28 insertions(+), 15 deletions(-) delete mode 100644 .yarn/cache/follow-redirects-npm-1.15.2-1ec1dd82be-8be0d39919.zip create mode 100644 .yarn/cache/follow-redirects-npm-1.15.4-3384d6a415-2e8f5f259a.zip diff --git a/.pnp.cjs b/.pnp.cjs index 7cdca89702..508c94cd6e 100755 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -10771,17 +10771,17 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["follow-redirects", [\ - ["npm:1.15.2", {\ - "packageLocation": "./.yarn/cache/follow-redirects-npm-1.15.2-1ec1dd82be-8be0d39919.zip/node_modules/follow-redirects/",\ + ["npm:1.15.4", {\ + "packageLocation": "./.yarn/cache/follow-redirects-npm-1.15.4-3384d6a415-2e8f5f259a.zip/node_modules/follow-redirects/",\ "packageDependencies": [\ - ["follow-redirects", "npm:1.15.2"]\ + ["follow-redirects", "npm:1.15.4"]\ ],\ "linkType": "SOFT"\ }],\ - ["virtual:a313c479c5c7e54d9ec8fbeeea69ff640f56b8989ea2dff42351a3fa5c4061fb80a52d8ede0f0826a181a216820c2d2c3f15da881e7fdf31cef1c446e42f0c45#npm:1.15.2", {\ - "packageLocation": "./.yarn/__virtual__/follow-redirects-virtual-2696a91c1b/0/cache/follow-redirects-npm-1.15.2-1ec1dd82be-8be0d39919.zip/node_modules/follow-redirects/",\ + ["virtual:a313c479c5c7e54d9ec8fbeeea69ff640f56b8989ea2dff42351a3fa5c4061fb80a52d8ede0f0826a181a216820c2d2c3f15da881e7fdf31cef1c446e42f0c45#npm:1.15.4", {\ + "packageLocation": "./.yarn/__virtual__/follow-redirects-virtual-035839a7fb/0/cache/follow-redirects-npm-1.15.4-3384d6a415-2e8f5f259a.zip/node_modules/follow-redirects/",\ "packageDependencies": [\ - ["follow-redirects", "virtual:a313c479c5c7e54d9ec8fbeeea69ff640f56b8989ea2dff42351a3fa5c4061fb80a52d8ede0f0826a181a216820c2d2c3f15da881e7fdf31cef1c446e42f0c45#npm:1.15.2"],\ + ["follow-redirects", "virtual:a313c479c5c7e54d9ec8fbeeea69ff640f56b8989ea2dff42351a3fa5c4061fb80a52d8ede0f0826a181a216820c2d2c3f15da881e7fdf31cef1c446e42f0c45#npm:1.15.4"],\ ["@types/debug", null],\ ["debug", null]\ ],\ @@ -11699,7 +11699,7 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["http-proxy", "npm:1.18.1"],\ ["eventemitter3", "npm:4.0.7"],\ - ["follow-redirects", "virtual:a313c479c5c7e54d9ec8fbeeea69ff640f56b8989ea2dff42351a3fa5c4061fb80a52d8ede0f0826a181a216820c2d2c3f15da881e7fdf31cef1c446e42f0c45#npm:1.15.2"],\ + ["follow-redirects", "virtual:a313c479c5c7e54d9ec8fbeeea69ff640f56b8989ea2dff42351a3fa5c4061fb80a52d8ede0f0826a181a216820c2d2c3f15da881e7fdf31cef1c446e42f0c45#npm:1.15.4"],\ ["requires-port", "npm:1.0.0"]\ ],\ "linkType": "HARD"\ diff --git a/.yarn/cache/follow-redirects-npm-1.15.2-1ec1dd82be-8be0d39919.zip b/.yarn/cache/follow-redirects-npm-1.15.2-1ec1dd82be-8be0d39919.zip deleted file mode 100644 index 9aa62ac845da744836ab51c2c5c8c1f4890d4e8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10821 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 diff --git a/.yarn/cache/follow-redirects-npm-1.15.4-3384d6a415-2e8f5f259a.zip b/.yarn/cache/follow-redirects-npm-1.15.4-3384d6a415-2e8f5f259a.zip new file mode 100644 index 0000000000000000000000000000000000000000..5bb42e70fe8362f2d5fb77e4b85a830f95df5614 GIT binary patch literal 11151 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

i6vMQ~6b$zB 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 literal 0 HcmV?d00001 diff --git a/package.json b/package.json index cc263f63a6..82cff36c66 100644 --- a/package.json +++ b/package.json @@ -87,7 +87,8 @@ "tsconfig-paths": "4.2.0", "ansi-regex": "5.0.1", "cacache": "18.0.0", - "node-gyp": "10.0.1" + "node-gyp": "10.0.1", + "follow-redirects": "^1.15.4" }, "dependencies": { "node-gyp": "^10.0.1" diff --git a/packages/dapi/lib/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.js b/packages/dapi/lib/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.js index 15e369f9ce..5bf2e3e73f 100644 --- a/packages/dapi/lib/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.js +++ b/packages/dapi/lib/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.js @@ -3,6 +3,7 @@ const { error: { InvalidArgumentGrpcError, AlreadyExistsGrpcError, + ResourceExhaustedGrpcError, }, }, } = require('@dashevo/grpc-common'); @@ -40,8 +41,19 @@ function broadcastStateTransitionHandlerFactory(rpcClient, createGrpcErrorFromDr const { result, error: jsonRpcError } = await rpcClient.request('broadcast_tx_sync', { tx }); if (jsonRpcError) { - if (jsonRpcError.data === 'tx already exists in cache') { - throw new AlreadyExistsGrpcError('State transition already in chain'); + if (typeof jsonRpcError.data === 'string') { + if (jsonRpcError.data === 'tx already exists in cache') { + throw new AlreadyExistsGrpcError('state transition already in chain'); + } + + if (jsonRpcError.data.startsWith('Tx too large.')) { + const message = jsonRpcError.data.replace('Tx too large. ', ''); + throw new InvalidArgumentGrpcError(`state transition is too large. ${message}`); + } + + if (jsonRpcError.data.startsWith('mempool is full')) { + throw new ResourceExhaustedGrpcError(jsonRpcError.data); + } } const error = new Error(); diff --git a/packages/dapi/test/unit/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.spec.js b/packages/dapi/test/unit/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.spec.js index 5f5a2cdf25..1b9fa6867c 100644 --- a/packages/dapi/test/unit/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.spec.js +++ b/packages/dapi/test/unit/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.spec.js @@ -144,7 +144,7 @@ describe('broadcastStateTransitionHandlerFactory', () => { expect.fail('should throw AlreadyExistsGrpcError'); } catch (e) { expect(e).to.be.an.instanceOf(AlreadyExistsGrpcError); - expect(e.getMessage()).to.equal('State transition already in chain'); + expect(e.getMessage()).to.equal('state transition already in chain'); } }); diff --git a/yarn.lock b/yarn.lock index 5da1b04248..3c98e0fa3d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8195,13 +8195,13 @@ __metadata: languageName: node linkType: hard -"follow-redirects@npm:^1.0.0": - version: 1.15.2 - resolution: "follow-redirects@npm:1.15.2" +"follow-redirects@npm:^1.15.4": + version: 1.15.4 + resolution: "follow-redirects@npm:1.15.4" peerDependenciesMeta: debug: optional: true - checksum: 8be0d39919770054812537d376850ccde0b4762b0501c440bd08724971a078123b55f57704f2984e0664fecc0c86adea85add63295804d9dce401cd9604c91d3 + checksum: 2e8f5f259a6b02dfa8dc199e08431848a7c3beed32eb4c19945966164a52c89f07b86c3afcc32ebe4279cf0a960520e45a63013d6350309c5ec90133c5d9351a languageName: node linkType: hard From c9b2927d0bbc9fa4a7f202e25fdb13d14f79eb60 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Thu, 11 Jan 2024 08:02:14 +0300 Subject: [PATCH 009/191] chore(release): update change log and versions to 1.0.0-dev.1 (#1662) --- CHANGELOG.md | 27 +++++++++++ Cargo.lock | 46 +++++++++---------- package.json | 2 +- packages/bench-suite/package.json | 2 +- packages/dapi-grpc/Cargo.toml | 2 +- packages/dapi-grpc/package.json | 2 +- packages/dapi/package.json | 2 +- packages/dash-spv/package.json | 2 +- packages/dashmate/package.json | 2 +- packages/dashpay-contract/Cargo.toml | 2 +- packages/dashpay-contract/package.json | 2 +- packages/data-contracts/Cargo.toml | 2 +- packages/dpns-contract/Cargo.toml | 2 +- packages/dpns-contract/package.json | 2 +- packages/feature-flags-contract/Cargo.toml | 2 +- packages/feature-flags-contract/package.json | 2 +- packages/js-dapi-client/package.json | 2 +- packages/js-dash-sdk/package.json | 2 +- packages/js-grpc-common/package.json | 2 +- .../Cargo.toml | 2 +- .../package.json | 2 +- packages/platform-test-suite/package.json | 2 +- packages/rs-dapi-client/Cargo.toml | 2 +- packages/rs-dapi-grpc-macros/Cargo.toml | 2 +- packages/rs-dpp/Cargo.toml | 2 +- packages/rs-drive-abci/Cargo.toml | 2 +- packages/rs-drive-proof-verifier/Cargo.toml | 2 +- packages/rs-drive/Cargo.toml | 2 +- .../Cargo.toml | 2 +- packages/rs-platform-serialization/Cargo.toml | 2 +- .../rs-platform-value-convertible/Cargo.toml | 2 +- packages/rs-platform-value/Cargo.toml | 2 +- packages/rs-platform-version/Cargo.toml | 2 +- packages/rs-platform-versioning/Cargo.toml | 2 +- packages/rs-sdk/Cargo.toml | 2 +- packages/simple-signer/Cargo.toml | 2 +- packages/strategy-tests/Cargo.toml | 2 +- packages/wallet-lib/package.json | 2 +- packages/wasm-dpp/Cargo.toml | 2 +- packages/wasm-dpp/package.json | 2 +- packages/withdrawals-contract/Cargo.toml | 2 +- packages/withdrawals-contract/package.json | 2 +- 42 files changed, 90 insertions(+), 63 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 70524e911c..1dd42d0815 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,30 @@ +## [1.0.0-dev.1](https://github.com/dashpay/platform/compare/v0.25.21...v1.0.0-dev.1) (2024-01-11) + + +### ⚠ BREAKING CHANGES + +* invalid state transitions now included into blocks that makes previous chain data invalid. (#1657) +* credit transfer state transition requires revision. (#1634) +* calculated fee amounts are changed (#1656) + +### Features + +* **drive-abci:** include invalid state transitions into block ([#1657](https://github.com/dashpay/platform/issues/1657)) +* **drive-abci:** processing fees for signature verification ([#1656](https://github.com/dashpay/platform/issues/1656)) +* **drive-abci:** remove unnecessary validation from check tx and re-check ([#1647](https://github.com/dashpay/platform/issues/1647)) +* **sdk:** rs-sdk fetch current epoch ([#1604](https://github.com/dashpay/platform/issues/1604)) + + +### Bug Fixes + +* **platform:** credit transfer replay attack ([#1634](https://github.com/dashpay/platform/issues/1634)) +* **dapi**: internal error when mempool is full ([#1661](https://github.com/dashpay/platform/issues/1661)) + + +### Miscellaneous Chores + +* automatic clippy fixes ([#1528](https://github.com/dashpay/platform/issues/1528), [#1602](https://github.com/dashpay/platform/issues/1602)) + ### [0.25.21](https://github.com/dashpay/platform/compare/v0.25.20...v0.25.21) (2023-12-28) diff --git a/Cargo.lock b/Cargo.lock index 91abca198e..fc333747d1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -945,7 +945,7 @@ dependencies = [ [[package]] name = "dapi-grpc" -version = "0.25.21" +version = "1.0.0-dev.1" dependencies = [ "dapi-grpc-macros", "platform-version", @@ -959,7 +959,7 @@ dependencies = [ [[package]] name = "dapi-grpc-macros" -version = "0.25.21" +version = "1.0.0-dev.1" dependencies = [ "dapi-grpc", "heck", @@ -1065,7 +1065,7 @@ dependencies = [ [[package]] name = "dashpay-contract" -version = "0.25.21" +version = "1.0.0-dev.1" dependencies = [ "platform-value", "serde_json", @@ -1073,7 +1073,7 @@ dependencies = [ [[package]] name = "data-contracts" -version = "0.25.21" +version = "1.0.0-dev.1" dependencies = [ "dashpay-contract", "dpns-contract", @@ -1164,7 +1164,7 @@ checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" [[package]] name = "dpns-contract" -version = "0.25.21" +version = "1.0.0-dev.1" dependencies = [ "platform-value", "serde_json", @@ -1172,7 +1172,7 @@ dependencies = [ [[package]] name = "dpp" -version = "0.25.21" +version = "1.0.0-dev.1" dependencies = [ "anyhow", "async-trait", @@ -1222,7 +1222,7 @@ dependencies = [ [[package]] name = "drive" -version = "0.25.21" +version = "1.0.0-dev.1" dependencies = [ "anyhow", "base64 0.21.5", @@ -1257,7 +1257,7 @@ dependencies = [ [[package]] name = "drive-abci" -version = "0.25.21" +version = "1.0.0-dev.1" dependencies = [ "atty", "base64 0.20.0", @@ -1311,7 +1311,7 @@ dependencies = [ [[package]] name = "drive-proof-verifier" -version = "0.25.21" +version = "1.0.0-dev.1" dependencies = [ "dapi-grpc", "dpp", @@ -1512,7 +1512,7 @@ checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" [[package]] name = "feature-flags-contract" -version = "0.25.21" +version = "1.0.0-dev.1" dependencies = [ "platform-value", "serde_json", @@ -2360,7 +2360,7 @@ dependencies = [ [[package]] name = "masternode-reward-shares-contract" -version = "0.25.21" +version = "1.0.0-dev.1" dependencies = [ "platform-value", "serde_json", @@ -2838,7 +2838,7 @@ checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" [[package]] name = "platform-serialization" -version = "0.25.21" +version = "1.0.0-dev.1" dependencies = [ "bincode 2.0.0-rc.3", "platform-version", @@ -2846,7 +2846,7 @@ dependencies = [ [[package]] name = "platform-serialization-derive" -version = "0.25.21" +version = "1.0.0-dev.1" dependencies = [ "proc-macro2", "quote", @@ -2856,7 +2856,7 @@ dependencies = [ [[package]] name = "platform-value" -version = "0.25.21" +version = "1.0.0-dev.1" dependencies = [ "base64 0.13.1", "bincode 2.0.0-rc.3", @@ -2877,7 +2877,7 @@ dependencies = [ [[package]] name = "platform-value-convertible" -version = "0.25.21" +version = "1.0.0-dev.1" dependencies = [ "quote", "syn 2.0.41", @@ -2885,14 +2885,14 @@ dependencies = [ [[package]] name = "platform-version" -version = "0.25.21" +version = "1.0.0-dev.1" dependencies = [ "thiserror", ] [[package]] name = "platform-versioning" -version = "0.25.21" +version = "1.0.0-dev.1" dependencies = [ "proc-macro2", "quote", @@ -3435,7 +3435,7 @@ dependencies = [ [[package]] name = "rs-dapi-client" -version = "0.25.21" +version = "1.0.0-dev.1" dependencies = [ "backon", "chrono", @@ -3455,7 +3455,7 @@ dependencies = [ [[package]] name = "rs-sdk" -version = "0.25.21" +version = "1.0.0-dev.1" dependencies = [ "async-trait", "base64 0.21.5", @@ -3905,7 +3905,7 @@ checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" [[package]] name = "simple-signer" -version = "0.25.21" +version = "1.0.0-dev.1" dependencies = [ "anyhow", "bincode 2.0.0-rc.3", @@ -3996,7 +3996,7 @@ dependencies = [ [[package]] name = "strategy-tests" -version = "0.25.21" +version = "1.0.0-dev.1" dependencies = [ "bincode 2.0.0-rc.3", "dpp", @@ -4903,7 +4903,7 @@ checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93" [[package]] name = "wasm-dpp" -version = "0.25.21" +version = "1.0.0-dev.1" dependencies = [ "anyhow", "async-trait", @@ -5145,7 +5145,7 @@ dependencies = [ [[package]] name = "withdrawals-contract" -version = "0.25.21" +version = "1.0.0-dev.1" dependencies = [ "num_enum", "platform-value", diff --git a/package.json b/package.json index 82cff36c66..59631bf083 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/platform", - "version": "0.25.21", + "version": "1.0.0-dev.1", "private": true, "scripts": { "setup": "yarn install && yarn run build && yarn run configure", diff --git a/packages/bench-suite/package.json b/packages/bench-suite/package.json index 1fb2397a82..bd5e216958 100644 --- a/packages/bench-suite/package.json +++ b/packages/bench-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/bench-suite", "private": true, - "version": "0.25.21", + "version": "1.0.0-dev.1", "description": "Dash Platform benchmark tool", "scripts": { "bench": "node ./bin/bench.js", diff --git a/packages/dapi-grpc/Cargo.toml b/packages/dapi-grpc/Cargo.toml index 7160550b71..63a481d993 100644 --- a/packages/dapi-grpc/Cargo.toml +++ b/packages/dapi-grpc/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc" description = "GRPC client for Dash Platform" -version = "0.25.21" +version = "1.0.0-dev.1" authors = [ "Samuel Westrich ", "Igor Markin ", diff --git a/packages/dapi-grpc/package.json b/packages/dapi-grpc/package.json index 1af8402370..e0ffb5137e 100644 --- a/packages/dapi-grpc/package.json +++ b/packages/dapi-grpc/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-grpc", - "version": "0.25.21", + "version": "1.0.0-dev.1", "description": "DAPI GRPC definition file and generated clients", "browser": "browser.js", "main": "node.js", diff --git a/packages/dapi/package.json b/packages/dapi/package.json index aef9e46b0c..61d36204a3 100644 --- a/packages/dapi/package.json +++ b/packages/dapi/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/dapi", "private": true, - "version": "0.25.21", + "version": "1.0.0-dev.1", "description": "A decentralized API for the Dash network", "scripts": { "api": "node scripts/api.js", diff --git a/packages/dash-spv/package.json b/packages/dash-spv/package.json index 212b6c2db3..643fb73c67 100644 --- a/packages/dash-spv/package.json +++ b/packages/dash-spv/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dash-spv", - "version": "0.25.21", + "version": "1.0.0-dev.1", "description": "Repository containing SPV functions used by @dashevo", "main": "index.js", "scripts": { diff --git a/packages/dashmate/package.json b/packages/dashmate/package.json index 02661e4b7e..fe46f6854a 100644 --- a/packages/dashmate/package.json +++ b/packages/dashmate/package.json @@ -1,6 +1,6 @@ { "name": "dashmate", - "version": "0.25.21", + "version": "1.0.0-dev.1", "description": "Distribution package for Dash node installation", "scripts": { "lint": "eslint .", diff --git a/packages/dashpay-contract/Cargo.toml b/packages/dashpay-contract/Cargo.toml index b11c400e19..2c46e2df52 100644 --- a/packages/dashpay-contract/Cargo.toml +++ b/packages/dashpay-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dashpay-contract" description = "DashPay data contract schema and tools" -version = "0.25.21" +version = "1.0.0-dev.1" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/dashpay-contract/package.json b/packages/dashpay-contract/package.json index 2872441944..93e3f5fd6b 100644 --- a/packages/dashpay-contract/package.json +++ b/packages/dashpay-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dashpay-contract", - "version": "0.25.21", + "version": "1.0.0-dev.1", "description": "Reference contract of the DashPay DPA on Dash Evolution", "scripts": { "lint": "eslint .", diff --git a/packages/data-contracts/Cargo.toml b/packages/data-contracts/Cargo.toml index 655973b97a..2d77d81195 100644 --- a/packages/data-contracts/Cargo.toml +++ b/packages/data-contracts/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "data-contracts" description = "Dash Platform system data contracts" -version = "0.25.21" +version = "1.0.0-dev.1" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/dpns-contract/Cargo.toml b/packages/dpns-contract/Cargo.toml index aee9162cca..38cd367939 100644 --- a/packages/dpns-contract/Cargo.toml +++ b/packages/dpns-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dpns-contract" description = "DPNS data contract schema and tools" -version = "0.25.21" +version = "1.0.0-dev.1" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/dpns-contract/package.json b/packages/dpns-contract/package.json index a1ea82bda1..4df6fa64fe 100644 --- a/packages/dpns-contract/package.json +++ b/packages/dpns-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dpns-contract", - "version": "0.25.21", + "version": "1.0.0-dev.1", "description": "A contract and helper scripts for DPNS DApp", "scripts": { "lint": "eslint .", diff --git a/packages/feature-flags-contract/Cargo.toml b/packages/feature-flags-contract/Cargo.toml index c5933bfd89..cac456ed13 100644 --- a/packages/feature-flags-contract/Cargo.toml +++ b/packages/feature-flags-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "feature-flags-contract" description = "Feature flags data contract schema and tools" -version = "0.25.21" +version = "1.0.0-dev.1" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/feature-flags-contract/package.json b/packages/feature-flags-contract/package.json index 14799d2520..5c9772bc48 100644 --- a/packages/feature-flags-contract/package.json +++ b/packages/feature-flags-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/feature-flags-contract", - "version": "0.25.21", + "version": "1.0.0-dev.1", "description": "Data Contract to store Dash Platform feature flags", "scripts": { "build": "", diff --git a/packages/js-dapi-client/package.json b/packages/js-dapi-client/package.json index 68a85d2a44..bec57c0ca8 100644 --- a/packages/js-dapi-client/package.json +++ b/packages/js-dapi-client/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-client", - "version": "0.25.21", + "version": "1.0.0-dev.1", "description": "Client library used to access Dash DAPI endpoints", "main": "lib/index.js", "contributors": [ diff --git a/packages/js-dash-sdk/package.json b/packages/js-dash-sdk/package.json index 6c2380476c..eed3034c6a 100644 --- a/packages/js-dash-sdk/package.json +++ b/packages/js-dash-sdk/package.json @@ -1,6 +1,6 @@ { "name": "dash", - "version": "3.25.21", + "version": "4.0.0-dev.1", "description": "Dash library for JavaScript/TypeScript ecosystem (Wallet, DAPI, Primitives, BLS, ...)", "main": "build/index.js", "unpkg": "dist/dash.min.js", diff --git a/packages/js-grpc-common/package.json b/packages/js-grpc-common/package.json index b63941f287..c9da4a1c55 100644 --- a/packages/js-grpc-common/package.json +++ b/packages/js-grpc-common/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/grpc-common", - "version": "0.25.21", + "version": "1.0.0-dev.1", "description": "Common GRPC library", "main": "index.js", "scripts": { diff --git a/packages/masternode-reward-shares-contract/Cargo.toml b/packages/masternode-reward-shares-contract/Cargo.toml index f18d7c30e7..31e0a868b9 100644 --- a/packages/masternode-reward-shares-contract/Cargo.toml +++ b/packages/masternode-reward-shares-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "masternode-reward-shares-contract" description = "Masternode reward shares data contract schema and tools" -version = "0.25.21" +version = "1.0.0-dev.1" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/masternode-reward-shares-contract/package.json b/packages/masternode-reward-shares-contract/package.json index 484ccbfda1..1774bb85b2 100644 --- a/packages/masternode-reward-shares-contract/package.json +++ b/packages/masternode-reward-shares-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/masternode-reward-shares-contract", - "version": "0.25.21", + "version": "1.0.0-dev.1", "description": "A contract and helper scripts for reward sharing", "scripts": { "lint": "eslint .", diff --git a/packages/platform-test-suite/package.json b/packages/platform-test-suite/package.json index 9c3ac419b5..30d3154929 100644 --- a/packages/platform-test-suite/package.json +++ b/packages/platform-test-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/platform-test-suite", "private": true, - "version": "0.25.21", + "version": "1.0.0-dev.1", "description": "Dash Network end-to-end tests", "scripts": { "test": "yarn exec bin/test.sh", diff --git a/packages/rs-dapi-client/Cargo.toml b/packages/rs-dapi-client/Cargo.toml index 8137e7c214..7b97773e70 100644 --- a/packages/rs-dapi-client/Cargo.toml +++ b/packages/rs-dapi-client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rs-dapi-client" -version = "0.25.21" +version = "1.0.0-dev.1" edition = "2021" [features] diff --git a/packages/rs-dapi-grpc-macros/Cargo.toml b/packages/rs-dapi-grpc-macros/Cargo.toml index 74c9fe8802..f3b93170f2 100644 --- a/packages/rs-dapi-grpc-macros/Cargo.toml +++ b/packages/rs-dapi-grpc-macros/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc-macros" -version = "0.25.21" +version = "1.0.0-dev.1" edition = "2021" description = "Macros used by dapi-grpc. Internal use only." diff --git a/packages/rs-dpp/Cargo.toml b/packages/rs-dpp/Cargo.toml index b88d3c53f2..3d95f0d036 100644 --- a/packages/rs-dpp/Cargo.toml +++ b/packages/rs-dpp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dpp" -version = "0.25.21" +version = "1.0.0-dev.1" edition = "2021" rust-version = "1.73" authors = [ diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index af6227b883..ae1d90b591 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drive-abci" -version = "0.25.21" +version = "1.0.0-dev.1" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/rs-drive-proof-verifier/Cargo.toml b/packages/rs-drive-proof-verifier/Cargo.toml index fa889b441e..495d38b178 100644 --- a/packages/rs-drive-proof-verifier/Cargo.toml +++ b/packages/rs-drive-proof-verifier/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drive-proof-verifier" -version = "0.25.21" +version = "1.0.0-dev.1" edition = "2021" rust-version = "1.73" diff --git a/packages/rs-drive/Cargo.toml b/packages/rs-drive/Cargo.toml index f4acb5c3ba..1fb1f3f872 100644 --- a/packages/rs-drive/Cargo.toml +++ b/packages/rs-drive/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "drive" description = "Dash drive built on top of GroveDB" -version = "0.25.21" +version = "1.0.0-dev.1" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/rs-platform-serialization-derive/Cargo.toml b/packages/rs-platform-serialization-derive/Cargo.toml index fe767766c7..11057a85b3 100644 --- a/packages/rs-platform-serialization-derive/Cargo.toml +++ b/packages/rs-platform-serialization-derive/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization-derive" authors = ["Samuel Westrich "] description = "Bincode serialization and deserialization derivations" -version = "0.25.21" +version = "1.0.0-dev.1" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/rs-platform-serialization/Cargo.toml b/packages/rs-platform-serialization/Cargo.toml index e79eef94c9..aac87ecee4 100644 --- a/packages/rs-platform-serialization/Cargo.toml +++ b/packages/rs-platform-serialization/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization" authors = ["Samuel Westrich "] description = "Bincode based serialization and deserialization" -version = "0.25.21" +version = "1.0.0-dev.1" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/rs-platform-value-convertible/Cargo.toml b/packages/rs-platform-value-convertible/Cargo.toml index a1e891a1a2..fc8ce061d5 100644 --- a/packages/rs-platform-value-convertible/Cargo.toml +++ b/packages/rs-platform-value-convertible/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-value-convertible" authors = ["Samuel Westrich "] description = "Convertion to and from platform values" -version = "0.25.21" +version = "1.0.0-dev.1" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/rs-platform-value/Cargo.toml b/packages/rs-platform-value/Cargo.toml index 123454bcaf..4578e9fb1c 100644 --- a/packages/rs-platform-value/Cargo.toml +++ b/packages/rs-platform-value/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-value" authors = ["Samuel Westrich "] description = "A simple value module" -version = "0.25.21" +version = "1.0.0-dev.1" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/rs-platform-version/Cargo.toml b/packages/rs-platform-version/Cargo.toml index 48ba80a54a..3fec1cab1d 100644 --- a/packages/rs-platform-version/Cargo.toml +++ b/packages/rs-platform-version/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-version" authors = ["Samuel Westrich "] description = "Bincode based serialization and deserialization" -version = "0.25.21" +version = "1.0.0-dev.1" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/rs-platform-versioning/Cargo.toml b/packages/rs-platform-versioning/Cargo.toml index 9c0f76cf03..55b39f19a9 100644 --- a/packages/rs-platform-versioning/Cargo.toml +++ b/packages/rs-platform-versioning/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-versioning" authors = ["Samuel Westrich "] description = "Version derivation" -version = "0.25.21" +version = "1.0.0-dev.1" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/rs-sdk/Cargo.toml b/packages/rs-sdk/Cargo.toml index 9eea015d11..b178ece870 100644 --- a/packages/rs-sdk/Cargo.toml +++ b/packages/rs-sdk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rs-sdk" -version = "0.25.21" +version = "1.0.0-dev.1" edition = "2021" [dependencies] diff --git a/packages/simple-signer/Cargo.toml b/packages/simple-signer/Cargo.toml index e05c3565ea..484074d2d9 100644 --- a/packages/simple-signer/Cargo.toml +++ b/packages/simple-signer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "simple-signer" -version = "0.25.21" +version = "1.0.0-dev.1" edition = "2021" rust-version = "1.73" diff --git a/packages/strategy-tests/Cargo.toml b/packages/strategy-tests/Cargo.toml index 2390dd7462..446c5a8a60 100644 --- a/packages/strategy-tests/Cargo.toml +++ b/packages/strategy-tests/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "strategy-tests" -version = "0.25.21" +version = "1.0.0-dev.1" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/wallet-lib/package.json b/packages/wallet-lib/package.json index 9b4475b932..2fdb79e237 100644 --- a/packages/wallet-lib/package.json +++ b/packages/wallet-lib/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wallet-lib", - "version": "7.25.21", + "version": "8.0.0-dev.1", "description": "Light wallet library for Dash", "main": "src/index.js", "unpkg": "dist/wallet-lib.min.js", diff --git a/packages/wasm-dpp/Cargo.toml b/packages/wasm-dpp/Cargo.toml index d7c2556c4d..8a462fb4cd 100644 --- a/packages/wasm-dpp/Cargo.toml +++ b/packages/wasm-dpp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasm-dpp" -version = "0.25.21" +version = "1.0.0-dev.1" edition = "2021" rust-version = "1.73" authors = ["Anton Suprunchuk "] diff --git a/packages/wasm-dpp/package.json b/packages/wasm-dpp/package.json index 51b6b8af6d..2f6082e64a 100644 --- a/packages/wasm-dpp/package.json +++ b/packages/wasm-dpp/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wasm-dpp", - "version": "0.25.21", + "version": "1.0.0-dev.1", "description": "The JavaScript implementation of the Dash Platform Protocol", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/withdrawals-contract/Cargo.toml b/packages/withdrawals-contract/Cargo.toml index 21335cfa28..07aa8be38a 100644 --- a/packages/withdrawals-contract/Cargo.toml +++ b/packages/withdrawals-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "withdrawals-contract" description = "Witdrawals data contract schema and tools" -version = "0.25.21" +version = "1.0.0-dev.1" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/withdrawals-contract/package.json b/packages/withdrawals-contract/package.json index 0d4b111283..4691da2234 100644 --- a/packages/withdrawals-contract/package.json +++ b/packages/withdrawals-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/withdrawals-contract", - "version": "0.25.21", + "version": "1.0.0-dev.1", "description": "Data Contract to manipulate and track withdrawals", "scripts": { "build": "", From 9b24a195d90ad3c30e1c5c966d94eca416e6b7f4 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Thu, 11 Jan 2024 19:12:51 +0300 Subject: [PATCH 010/191] chore(drive-abci): fix state transition logging (#1664) --- .../process_raw_state_transitions/v0/mod.rs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_raw_state_transitions/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_raw_state_transitions/v0/mod.rs index 21d180fd13..8e93c85bf0 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_raw_state_transitions/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_raw_state_transitions/v0/mod.rs @@ -79,10 +79,19 @@ where platform_version, ) .unwrap_or_else(|st_error| { + let mut st_hash = String::new(); + if tracing::enabled!(tracing::Level::ERROR) { + st_hash = hex::encode( + dashcore::hashes::sha256::Hash::hash(raw_state_transition) + .to_byte_array(), + ); + } + tracing::error!( error = ?st_error.error, raw_state_transition = ?st_error.raw_state_transition, - "Error processing state transition: {}", + "Error processing state transition ({}) : {}", + st_hash, st_error.error, ); @@ -105,7 +114,7 @@ where ) -> Result { // Tenderdash hex-encoded ST hash let mut st_hash = String::new(); - if tracing::enabled!(tracing::Level::TRACE) { + if tracing::enabled!(tracing::Level::DEBUG) { st_hash = hex::encode( dashcore::hashes::sha256::Hash::hash(raw_state_transition).to_byte_array(), ); From 49586bfebb2ad6f376884ce120747f88256acad3 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Thu, 11 Jan 2024 20:51:03 +0300 Subject: [PATCH 011/191] fix(drive-abci)!: internal error if vote extension block is already committed (#1663) Co-authored-by: Quantum Explorer --- .../rs-drive-abci/src/abci/handler/mod.rs | 49 ++++++++++++++++--- 1 file changed, 42 insertions(+), 7 deletions(-) diff --git a/packages/rs-drive-abci/src/abci/handler/mod.rs b/packages/rs-drive-abci/src/abci/handler/mod.rs index 68f709864f..762112baca 100644 --- a/packages/rs-drive-abci/src/abci/handler/mod.rs +++ b/packages/rs-drive-abci/src/abci/handler/mod.rs @@ -637,13 +637,21 @@ where .. } = request; + let height: u64 = height as u64; + let round: u32 = round as u32; + let guarded_block_execution_context = self.platform.block_execution_context.read().unwrap(); - let block_execution_context = - guarded_block_execution_context - .as_ref() - .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( - "block execution context must be set in block begin handler for verify vote extension", - )))?; + let Some(block_execution_context) = guarded_block_execution_context.as_ref() else { + tracing::warn!( + "vote extension for height: {}, round: {} is rejected because we are not in a block execution phase", + height, + round, + ); + + return Ok(proto::ResponseVerifyVoteExtension { + status: VerifyStatus::Reject.into(), + }); + }; let platform_version = block_execution_context .block_platform_state() @@ -678,6 +686,25 @@ where // }); // }; + let block_state_info = block_execution_context.block_state_info(); + + //// Verification that vote extension is for our current executed block + // When receiving the vote extension, we need to make sure that info matches our current block + + if block_state_info.height() != height || block_state_info.round() != round { + tracing::warn!( + "vote extension for height: {}, round: {} is rejected because we are at height: {} round {}", + height, + round, + block_state_info.height(), + block_state_info.round() + ); + + return Ok(proto::ResponseVerifyVoteExtension { + status: VerifyStatus::Reject.into(), + }); + } + let validation_result = self.platform.check_withdrawals( &got, &expected, @@ -689,6 +716,12 @@ where )?; if validation_result.is_valid() { + tracing::debug!( + "vote extension for height: {}, round: {} is successfully verified", + height, + round, + ); + Ok(proto::ResponseVerifyVoteExtension { status: VerifyStatus::Accept.into(), }) @@ -697,8 +730,10 @@ where ?got, ?expected, ?validation_result.errors, - "vote extension mismatch" + "vote extension for height: {}, round: {} mismatch", + height, round ); + Ok(proto::ResponseVerifyVoteExtension { status: VerifyStatus::Reject.into(), }) From f21ea2f243d87ed27258a96e701341d92f698611 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Fri, 12 Jan 2024 13:51:45 +0300 Subject: [PATCH 012/191] fix: broadcasting already invalidated transitions (#1668) --- .../templates/platform/drive/tenderdash/config.toml.dot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/dashmate/templates/platform/drive/tenderdash/config.toml.dot b/packages/dashmate/templates/platform/drive/tenderdash/config.toml.dot index d557259664..67ff3d5d76 100644 --- a/packages/dashmate/templates/platform/drive/tenderdash/config.toml.dot +++ b/packages/dashmate/templates/platform/drive/tenderdash/config.toml.dot @@ -320,7 +320,7 @@ cache-size = 10000 # Do not remove invalid transactions from the cache (default: false) # Set to true if it's not possible for any invalid transaction to become valid # again in the future. -keep-invalid-txs-in-cache = false +keep-invalid-txs-in-cache = true # Maximum size of a single transaction. # NOTE: the max size of a tx transmitted over the network is {max-tx-bytes}. From b3f0114db2e484aa6ed21c443ebea61a3f459820 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Fri, 12 Jan 2024 13:53:28 +0300 Subject: [PATCH 013/191] chore: various logging improvements (#1666) Co-authored-by: QuantumExplorer --- .../broadcastStateTransitionHandlerFactory.js | 15 +++++- .../rs-drive-abci/src/abci/handler/mod.rs | 46 +++++++++++++------ packages/rs-drive-abci/src/metrics.rs | 5 ++ 3 files changed, 51 insertions(+), 15 deletions(-) diff --git a/packages/dapi/lib/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.js b/packages/dapi/lib/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.js index 5bf2e3e73f..335794d42f 100644 --- a/packages/dapi/lib/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.js +++ b/packages/dapi/lib/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.js @@ -13,6 +13,7 @@ const { BroadcastStateTransitionResponse, }, } = require('@dashevo/dapi-grpc'); +const logger = require('../../../logger'); /** * @param {jaysonClient} rpcClient @@ -38,7 +39,17 @@ function broadcastStateTransitionHandlerFactory(rpcClient, createGrpcErrorFromDr const tx = Buffer.from(stByteArray).toString('base64'); - const { result, error: jsonRpcError } = await rpcClient.request('broadcast_tx_sync', { tx }); + let response; + + try { + response = await rpcClient.request('broadcast_tx_sync', { tx }); + } catch (e) { + logger.error(e, 'Failed broadcasting state transition'); + + throw e; + } + + const { result, error: jsonRpcError } = response; if (jsonRpcError) { if (typeof jsonRpcError.data === 'string') { @@ -59,6 +70,8 @@ function broadcastStateTransitionHandlerFactory(rpcClient, createGrpcErrorFromDr const error = new Error(); Object.assign(error, jsonRpcError); + logger.error(error, 'Unexpected JSON RPC error during broadcasting state transition'); + throw error; } diff --git a/packages/rs-drive-abci/src/abci/handler/mod.rs b/packages/rs-drive-abci/src/abci/handler/mod.rs index 762112baca..2c96f03ad1 100644 --- a/packages/rs-drive-abci/src/abci/handler/mod.rs +++ b/packages/rs-drive-abci/src/abci/handler/mod.rs @@ -109,15 +109,14 @@ where last_block_app_hash: state_app_hash.clone(), }; - tracing::info!( + tracing::debug!( protocol_version = latest_platform_version.protocol_version, software_version = env!("CARGO_PKG_VERSION"), block_version = request.block_version, p2p_version = request.p2p_version, app_hash = hex::encode(state_app_hash), height = state_guard.last_block_height(), - "Consensus engine is started from block {}", - state_guard.last_block_height(), + "Handshake with consensus engine", ); if tracing::enabled!(tracing::Level::TRACE) { @@ -163,7 +162,7 @@ where tracing::info!( app_hash, chain_id, - "platform chain initialized, initial state is created" + "Platform chain initialized, initial state is created" ); Ok(response) @@ -173,7 +172,7 @@ where &self, mut request: RequestPrepareProposal, ) -> Result { - let _timer = crate::metrics::abci_request_duration("prepare_proposal"); + let timer = crate::metrics::abci_request_duration("prepare_proposal"); // We should get the latest CoreChainLock from core // It is possible that we will not get a chain lock from core, in this case, just don't @@ -265,9 +264,11 @@ where // We need to let Tenderdash know about the transactions we should remove from execution let valid_tx_count = state_transitions_result.valid_count(); - let invalid_tx_count = state_transitions_result.invalid_count(); + let invalid_all_tx_count = state_transitions_result.invalid_count(); let failed_tx_count = state_transitions_result.failed_count(); let delayed_tx_count = transactions_exceeding_max_block_size.len(); + let mut invalid_paid_tx_count = state_transitions_result.invalid_count(); + let mut invalid_unpaid_tx_count = state_transitions_result.invalid_count(); let mut tx_results = Vec::new(); let mut tx_records = Vec::new(); @@ -280,13 +281,21 @@ where let tx_action = match &state_transition_execution_result { StateTransitionExecutionResult::SuccessfulExecution(_, _) => TxAction::Unmodified, // We have identity to pay for the state transition, so we keep it in the block - StateTransitionExecutionResult::PaidConsensusError(_) => TxAction::Unmodified, + StateTransitionExecutionResult::PaidConsensusError(_) => { + invalid_paid_tx_count += 1; + + TxAction::Unmodified + } // We don't have any associated identity to pay for the state transition, // so we remove it from the block to prevent spam attacks. // Such state transitions must be invalidated by check tx, but they might // still be added to mempool due to inconsistency between check tx and tx processing // (fees calculation) or malicious proposer. - StateTransitionExecutionResult::UnpaidConsensusError(_) => TxAction::Removed, + StateTransitionExecutionResult::UnpaidConsensusError(_) => { + invalid_unpaid_tx_count += 1; + + TxAction::Removed + } // We shouldn't include in the block any state transitions that produced an internal error // during execution StateTransitionExecutionResult::DriveAbciError(_) => TxAction::Removed, @@ -333,15 +342,20 @@ where .expect("expected that a block execution context was set"); block_execution_context.set_proposer_results(Some(response.clone())); + let elapsed_time_ms = timer.elapsed().as_millis(); + tracing::info!( - invalid_tx_count, + invalid_paid_tx_count, + invalid_unpaid_tx_count, valid_tx_count, delayed_tx_count, failed_tx_count, - "Prepared proposal with {} transitions for height: {}, round: {}", - valid_tx_count, + invalid_unpaid_tx_count, + "Prepared proposal with {} transitions for height: {}, round: {} in {} ms", + valid_tx_count + invalid_paid_tx_count, request.height, request.round, + elapsed_time_ms, ); Ok(response) @@ -351,7 +365,7 @@ where &self, mut request: RequestProcessProposal, ) -> Result { - let _timer = crate::metrics::abci_request_duration("process_proposal"); + let timer = crate::metrics::abci_request_duration("process_proposal"); let mut block_execution_context_guard = self.platform.block_execution_context.write().unwrap(); @@ -561,13 +575,17 @@ where consensus_param_updates: None, }; + let elapsed_time_ms = timer.elapsed().as_millis(); + tracing::info!( invalid_tx_count, valid_tx_count, - "Processed proposal with {} transactions for height: {}, round: {}", - valid_tx_count, + elapsed_time_ms, + "Processed proposal with {} transactions for height: {}, round: {} in {} ms", + valid_tx_count + invalid_tx_count, request.height, request.round, + elapsed_time_ms, ); Ok(response) diff --git a/packages/rs-drive-abci/src/metrics.rs b/packages/rs-drive-abci/src/metrics.rs index 6ecbd140b4..5aefbc843b 100644 --- a/packages/rs-drive-abci/src/metrics.rs +++ b/packages/rs-drive-abci/src/metrics.rs @@ -56,6 +56,11 @@ impl HistogramTiming { start: Instant::now(), } } + + /// Returns the elapsed time since the metric was started. + pub fn elapsed(&self) -> std::time::Duration { + self.start.elapsed() + } } impl Drop for HistogramTiming { From 31f84e4ec1a4191e9cd47de2716433f9257f5b7a Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Fri, 12 Jan 2024 14:28:50 +0300 Subject: [PATCH 014/191] chore(dashmate)!: adjust consensus params and enable re-check (#1669) --- .../configs/defaults/getBaseConfigFactory.js | 21 ++++++++++++-- .../defaults/getTestnetConfigFactory.js | 29 ------------------- .../configs/getConfigFileMigrationsFactory.js | 10 +++++++ 3 files changed, 29 insertions(+), 31 deletions(-) diff --git a/packages/dashmate/configs/defaults/getBaseConfigFactory.js b/packages/dashmate/configs/defaults/getBaseConfigFactory.js index 0f0d404023..76b639b516 100644 --- a/packages/dashmate/configs/defaults/getBaseConfigFactory.js +++ b/packages/dashmate/configs/defaults/getBaseConfigFactory.js @@ -230,10 +230,12 @@ export default function getBaseConfigFactory(homeDir) { genesis: { consensus_params: { block: { - max_bytes: '22020096', max_gas: '-1', time_iota_ms: '5000', + max_bytes: '2097152', max_gas: '57631392000', time_iota_ms: '5000', }, evidence: { - max_age: '100000', max_age_num_blocks: '100000', max_age_duration: '172800000000000', + max_age: '100000', + max_age_num_blocks: '100000', + max_age_duration: '172800000000000', }, validator: { pub_key_types: ['bls12381'], @@ -241,6 +243,21 @@ export default function getBaseConfigFactory(homeDir) { version: { app_version: '1', }, + timeout: { + propose: '30000000000', + propose_delta: '1000000000', + vote: '2000000000', + vote_delta: '500000000', + commit: '1000000000', + bypass_commit_timeout: false, + }, + synchrony: { + message_delay: '32000000000', + precision: '500000000', + }, + abci: { + recheck_tx: true, + }, }, }, moniker: null, diff --git a/packages/dashmate/configs/defaults/getTestnetConfigFactory.js b/packages/dashmate/configs/defaults/getTestnetConfigFactory.js index df5e05056f..26e75f5b74 100644 --- a/packages/dashmate/configs/defaults/getTestnetConfigFactory.js +++ b/packages/dashmate/configs/defaults/getTestnetConfigFactory.js @@ -82,35 +82,6 @@ export default function getTestnetConfigFactory(homeDir, getBaseConfig) { genesis: { genesis_time: '2023-11-02T10:18:00.000Z', chain_id: 'dash-testnet-37', - initial_core_chain_locked_height: 918609, - consensus_params: { - timeout: { - propose: '50000000000', - propose_delta: '10000000000', - vote: '500000000', - vote_delta: '100000000', - commit: '1000000000', - bypass_commit_timeout: false, - }, - block: { - max_bytes: '22020096', - max_gas: '-1', - time_iota_ms: '5000', - }, - evidence: { - max_age: '100000', - max_age_num_blocks: '100000', - max_age_duration: '172800000000000', - }, - validator: { - pub_key_types: [ - 'bls12381', - ], - }, - version: { - app_version: '1', - }, - }, validator_quorum_type: 6, }, }, diff --git a/packages/dashmate/configs/getConfigFileMigrationsFactory.js b/packages/dashmate/configs/getConfigFileMigrationsFactory.js index 205271a723..9c3bf957d3 100644 --- a/packages/dashmate/configs/getConfigFileMigrationsFactory.js +++ b/packages/dashmate/configs/getConfigFileMigrationsFactory.js @@ -406,6 +406,16 @@ export default function getConfigFileMigrationsFactory(homeDir, defaultConfigs) return configFile; }, + '1.0.0-dev.2': (configFile) => { + Object.entries(configFile.configs) + .forEach(([name, options]) => { + if (defaultConfigs.has(name)) { + options.platform.drive.tenderdash.genesis = defaultConfigs.get(name).get('options.platform.drive.tenderdash.genesis'); + } + }); + + return configFile; + }, }; } From d3205788fb33dbba24a99d8e054b18573983dffc Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Fri, 12 Jan 2024 19:54:02 +0300 Subject: [PATCH 015/191] fix(dashmate): dapi kills host machine on container stop (#1670) --- .dockerignore | 1 + .github/package-filters/js-packages.yml | 7 ++++- .pnp.cjs | 1 + Dockerfile | 5 ---- .../lib/externalApis/tenderdash/WsClient.js | 22 ++++---------- packages/dapi/pm2.yml | 24 --------------- packages/dapi/scripts/api.js | 3 -- packages/dapi/scripts/core-streams.js | 3 -- .../configs/defaults/getBaseConfigFactory.js | 3 ++ .../defaults/getTestnetConfigFactory.js | 1 + .../configs/getConfigFileMigrationsFactory.js | 3 +- packages/dashmate/docker-compose.yml | 15 ++++++++-- packages/dashmate/package.json | 1 + .../dashmate/src/config/configJsonSchema.js | 24 ++++++++++++++- .../src/core/waitForMasternodesSync.js | 17 ++++++----- .../waitForNodeToBeReadyTaskFactory.js | 30 ++++++++++++------- .../migrateConfigFileFactory.spec.js | 8 ++--- packages/js-dapi-client/lib/DAPIClient.js | 7 ++++- packages/js-dapi-client/lib/logger/index.js | 6 +++- .../transport/GrpcTransport/GrpcTransport.js | 2 ++ .../test/unit/DAPIClient.spec.js | 4 +++ yarn.lock | 1 + 22 files changed, 107 insertions(+), 81 deletions(-) delete mode 100644 packages/dapi/pm2.yml rename packages/dashmate/test/unit/{commands => }/config/configFile/migrateConfigFileFactory.spec.js (82%) diff --git a/.dockerignore b/.dockerignore index 2d179b88e9..d93249fec2 100644 --- a/.dockerignore +++ b/.dockerignore @@ -23,6 +23,7 @@ packages/*/dist packages/*/wasm packages/*/lib/wasm packages/*/node_modules +packages/*/.env !packages/platform-test-suite/test diff --git a/.github/package-filters/js-packages.yml b/.github/package-filters/js-packages.yml index b9e3618155..d158bb39f6 100644 --- a/.github/package-filters/js-packages.yml +++ b/.github/package-filters/js-packages.yml @@ -71,7 +71,12 @@ dash: &dash dashmate: - .github/workflows/tests* - packages/dashmate/** - - *dash + - *dashpay-contract + - *masternode-reward-shares-contract + - *dpns-contract + - *withdrawals-contract + - *wallet-lib + - *dapi-client '@dashevo/platform-test-suite': - .github/workflows/tests* diff --git a/.pnp.cjs b/.pnp.cjs index 508c94cd6e..7bd36798d5 100755 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -8702,6 +8702,7 @@ const RAW_RUNTIME_STATE = ["@babel/core", "npm:7.23.3"],\ ["@babel/eslint-parser", "virtual:880cda903c2a2be387819a3f857d21494004437a03c92969b9853f7bdeebdfed08d417e68364ee9e158338603a6d78d690c457a55ab11e56398bc10f0ad232fc#npm:7.23.3"],\ ["@dashevo/bls", "npm:1.2.9"],\ + ["@dashevo/dapi-client", "workspace:packages/js-dapi-client"],\ ["@dashevo/dashcore-lib", "npm:0.21.0"],\ ["@dashevo/dashd-rpc", "npm:18.2.0"],\ ["@dashevo/dashpay-contract", "workspace:packages/dashpay-contract"],\ diff --git a/Dockerfile b/Dockerfile index 25ab93f437..756e0ae73b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -392,9 +392,6 @@ LABEL description="DAPI Node.JS" # Install ZMQ shared library RUN apk add --no-cache zeromq-dev -# Install pm2 -RUN npm install -g pm2 - WORKDIR /platform/packages/dapi COPY --from=build-dapi /platform/.yarn /platform/.yarn @@ -411,5 +408,3 @@ RUN cp /platform/packages/dapi/.env.example /platform/packages/dapi/.env EXPOSE 2500 2501 2510 USER node - -ENTRYPOINT ["yarn", "node", "/usr/local/bin/pm2-runtime", "pm2.yml"] diff --git a/packages/dapi/lib/externalApis/tenderdash/WsClient.js b/packages/dapi/lib/externalApis/tenderdash/WsClient.js index 1bf9e260bc..f886483bf2 100644 --- a/packages/dapi/lib/externalApis/tenderdash/WsClient.js +++ b/packages/dapi/lib/externalApis/tenderdash/WsClient.js @@ -43,6 +43,11 @@ class WsClient extends EventEmitter { this.emit(event.type, event); + this.ws.removeAllListeners(); + this.ws.terminate(); + this.ws = null; + this.isConnected = false; + setTimeout(this.open.bind(this), this.autoReconnectInterval); } else { const event = { @@ -82,12 +87,6 @@ class WsClient extends EventEmitter { this.emit(event.type, event); - if (e.code === 1000) { // close normal - this.disconnect(); - - return; - } - reconnect(); }; @@ -100,16 +99,7 @@ class WsClient extends EventEmitter { this.emit(event.type, event); - switch (e.code) { - case 'ENOTFOUND': - case 'EAI_AGAIN': - case 'ECONNREFUSED': - reconnect(); - break; - default: - this.disconnect(); - break; - } + reconnect(); }; const onMessageListener = (rawData) => { diff --git a/packages/dapi/pm2.yml b/packages/dapi/pm2.yml deleted file mode 100644 index df8f450e3a..0000000000 --- a/packages/dapi/pm2.yml +++ /dev/null @@ -1,24 +0,0 @@ -- script: scripts/api.js - name: api - exec_mode: cluster - watch: false - instances: 2 - source_map_support: false - merge_logs: true - autorestart: true - out_file: "/dev/null" - error_file: "/dev/null" - vizion: false - wait_ready: true -- script: scripts/core-streams.js - name: core-streams - exec_mode: cluster - watch: false - instances: 2 - source_map_support: false - merge_logs: true - autorestart: true - out_file: "/dev/null" - error_file: "/dev/null" - vizion: false - wait_ready: true diff --git a/packages/dapi/scripts/api.js b/packages/dapi/scripts/api.js index 5339ed977a..72d3b1f033 100644 --- a/packages/dapi/scripts/api.js +++ b/packages/dapi/scripts/api.js @@ -170,6 +170,3 @@ process.on('SIGINT', () => { process.exit(); }); - -// Tell PM2 that process ready to receive connections -process.send('ready'); diff --git a/packages/dapi/scripts/core-streams.js b/packages/dapi/scripts/core-streams.js index 7c3620781f..0bc1a11522 100644 --- a/packages/dapi/scripts/core-streams.js +++ b/packages/dapi/scripts/core-streams.js @@ -219,6 +219,3 @@ process.on('SIGINT', () => { process.exit(); }); - -// Tell PM2 that process ready to receive connections -process.send('ready'); diff --git a/packages/dashmate/configs/defaults/getBaseConfigFactory.js b/packages/dashmate/configs/defaults/getBaseConfigFactory.js index 76b639b516..f8645fa8eb 100644 --- a/packages/dashmate/configs/defaults/getBaseConfigFactory.js +++ b/packages/dashmate/configs/defaults/getBaseConfigFactory.js @@ -137,6 +137,9 @@ export default function getBaseConfigFactory(homeDir) { api: { docker: { image: `dashpay/dapi:${dockerImageVersion}`, + deploy: { + replicas: 1, + }, build: { enabled: false, context: path.join(PACKAGE_ROOT_DIR, '..', '..'), diff --git a/packages/dashmate/configs/defaults/getTestnetConfigFactory.js b/packages/dashmate/configs/defaults/getTestnetConfigFactory.js index 26e75f5b74..7ea6d6f3f3 100644 --- a/packages/dashmate/configs/defaults/getTestnetConfigFactory.js +++ b/packages/dashmate/configs/defaults/getTestnetConfigFactory.js @@ -83,6 +83,7 @@ export default function getTestnetConfigFactory(homeDir, getBaseConfig) { genesis_time: '2023-11-02T10:18:00.000Z', chain_id: 'dash-testnet-37', validator_quorum_type: 6, + initial_core_chain_locked_height: 918609, }, }, }, diff --git a/packages/dashmate/configs/getConfigFileMigrationsFactory.js b/packages/dashmate/configs/getConfigFileMigrationsFactory.js index 9c3bf957d3..e13d4acc19 100644 --- a/packages/dashmate/configs/getConfigFileMigrationsFactory.js +++ b/packages/dashmate/configs/getConfigFileMigrationsFactory.js @@ -410,8 +410,9 @@ export default function getConfigFileMigrationsFactory(homeDir, defaultConfigs) Object.entries(configFile.configs) .forEach(([name, options]) => { if (defaultConfigs.has(name)) { - options.platform.drive.tenderdash.genesis = defaultConfigs.get(name).get('options.platform.drive.tenderdash.genesis'); + options.platform.drive.tenderdash.genesis = defaultConfigs.get(name).get('platform.drive.tenderdash.genesis'); } + options.platform.dapi.api.docker.deploy = base.get('platform.dapi.api.docker.deploy'); }); return configFile; diff --git a/packages/dashmate/docker-compose.yml b/packages/dashmate/docker-compose.yml index 8ecff50b5b..5dcdba9f8f 100644 --- a/packages/dashmate/docker-compose.yml +++ b/packages/dashmate/docker-compose.yml @@ -102,6 +102,9 @@ services: labels: org.dashmate.service.title: "DAPI API" restart: unless-stopped + deploy: + mode: replicated + replicas: ${PLATFORM_DAPI_API_DOCKER_DEPLOY_REPLICAS:-1} depends_on: - drive_tenderdash environment: @@ -120,16 +123,22 @@ services: - TENDERMINT_RPC_HOST=drive_tenderdash - TENDERMINT_RPC_PORT=${PLATFORM_DRIVE_TENDERDASH_RPC_PORT:?err} - NODE_ENV=${ENVIRONMENT:?err} - command: --only api + command: yarn run api stop_grace_period: 10s profiles: - platform + expose: + - 3004 + - 3005 dapi_tx_filter_stream: image: ${PLATFORM_DAPI_API_DOCKER_IMAGE:?err} labels: org.dashmate.service.title: "DAPI Transactions Filter Stream" restart: unless-stopped + deploy: + mode: replicated + replicas: ${PLATFORM_DAPI_API_DOCKER_DEPLOY_REPLICAS:-1} environment: - TX_FILTER_STREAM_GRPC_PORT=3006 - DASHCORE_RPC_HOST=core @@ -144,10 +153,12 @@ services: - NETWORK=devnet - TENDERMINT_RPC_HOST=drive_tenderdash - TENDERMINT_RPC_PORT=26657 - command: --only core-streams + command: yarn run core-streams stop_grace_period: 10s profiles: - platform + expose: + - 3006 dapi_envoy: image: ${PLATFORM_DAPI_ENVOY_DOCKER_IMAGE:?err} diff --git a/packages/dashmate/package.json b/packages/dashmate/package.json index fe46f6854a..d91d65b18e 100644 --- a/packages/dashmate/package.json +++ b/packages/dashmate/package.json @@ -57,6 +57,7 @@ "@babel/core": "^7.23.3", "@babel/eslint-parser": "^7.23.3", "@dashevo/bls": "~1.2.9", + "@dashevo/dapi-client": "workspace:*", "@dashevo/dashcore-lib": "~0.21.0", "@dashevo/dashd-rpc": "^18.2.0", "@dashevo/dashpay-contract": "workspace:*", diff --git a/packages/dashmate/src/config/configJsonSchema.js b/packages/dashmate/src/config/configJsonSchema.js index d60a43e2d9..90d2b9fe0c 100644 --- a/packages/dashmate/src/config/configJsonSchema.js +++ b/packages/dashmate/src/config/configJsonSchema.js @@ -440,7 +440,29 @@ export default { type: 'object', properties: { docker: { - $ref: '#/definitions/dockerWithBuild', + type: 'object', + properties: { + image: { + type: 'string', + minLength: 1, + }, + deploy: { + type: 'object', + properties: { + replicas: { + type: 'integer', + minimum: 0, + }, + }, + additionalProperties: false, + required: ['replicas'], + }, + build: { + $ref: '#/definitions/dockerBuild', + }, + }, + required: ['image', 'build', 'deploy'], + additionalProperties: false, }, }, required: ['docker'], diff --git a/packages/dashmate/src/core/waitForMasternodesSync.js b/packages/dashmate/src/core/waitForMasternodesSync.js index fdb686cd17..8f115410ea 100644 --- a/packages/dashmate/src/core/waitForMasternodesSync.js +++ b/packages/dashmate/src/core/waitForMasternodesSync.js @@ -15,9 +15,17 @@ export default async function waitForMasternodesSync(rpcClient, progressCallback do { try { await rpcClient.mnsync('next'); + + ({ + result: { IsSynced: isSynced }, + } = await rpcClient.mnsync('status')); + + ({ + result: { verificationprogress: verificationProgress }, + } = await rpcClient.getBlockchainInfo()); } catch (e) { // Core RPC is not started yet - if (!e.message.includes('Dash JSON-RPC: Request Error: ') && e.code !== -28) { + if (!e.message.includes('Dash JSON-RPC: Request Error: ') && !e.message.includes('Timeout') && e.code !== -28) { throw e; } @@ -29,13 +37,6 @@ export default async function waitForMasternodesSync(rpcClient, progressCallback continue; } - ({ - result: { IsSynced: isSynced }, - } = await rpcClient.mnsync('status')); - ({ - result: { verificationprogress: verificationProgress }, - } = await rpcClient.getBlockchainInfo()); - if (!isSynced) { progressCallback(verificationProgress); diff --git a/packages/dashmate/src/listr/tasks/platform/waitForNodeToBeReadyTaskFactory.js b/packages/dashmate/src/listr/tasks/platform/waitForNodeToBeReadyTaskFactory.js index 371097e061..e1dd60ee28 100644 --- a/packages/dashmate/src/listr/tasks/platform/waitForNodeToBeReadyTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/platform/waitForNodeToBeReadyTaskFactory.js @@ -1,14 +1,12 @@ +import DAPIClient from '@dashevo/dapi-client'; import { Listr } from 'listr2'; import wait from '../../../util/wait.js'; /** * - * @param {createTenderdashRpcClient} createTenderdashRpcClient * @return {waitForNodeToBeReadyTask} */ -export default function waitForNodeToBeReadyTaskFactory( - createTenderdashRpcClient, -) { +export default function waitForNodeToBeReadyTaskFactory() { /** * @typedef waitForNodeToBeReadyTask * @param {Config} config @@ -19,18 +17,28 @@ export default function waitForNodeToBeReadyTaskFactory( { title: `Wait for node ${config.getName()} to be ready`, task: async () => { - const host = config.get('platform.drive.tenderdash.rpc.host'); - const port = config.get('platform.drive.tenderdash.rpc.port'); + let host = config.get('platform.dapi.envoy.http.host'); + const port = config.get('platform.dapi.envoy.http.port'); - const tenderdashRpcClient = createTenderdashRpcClient({ host, port }); + if (host === '0.0.0.0') { + host = '127.0.0.1'; + } + + const dapiClient = new DAPIClient({ + dapiAddresses: [`${host}:${port}:no-ssl`], + loggerOptions: { + level: 'silent', + }, + }); let success = false; do { - const response = await tenderdashRpcClient.request('status', {}).catch(() => {}); + const response = await dapiClient.platform.getEpochsInfo(0, 1, { + retries: 0, + }) + .catch(() => {}); - if (response) { - success = !response.result.sync_info.catching_up; - } + success = Boolean(response); if (!success) { await wait(500); diff --git a/packages/dashmate/test/unit/commands/config/configFile/migrateConfigFileFactory.spec.js b/packages/dashmate/test/unit/config/configFile/migrateConfigFileFactory.spec.js similarity index 82% rename from packages/dashmate/test/unit/commands/config/configFile/migrateConfigFileFactory.spec.js rename to packages/dashmate/test/unit/config/configFile/migrateConfigFileFactory.spec.js index dae0bbe871..eb7efe51ae 100644 --- a/packages/dashmate/test/unit/commands/config/configFile/migrateConfigFileFactory.spec.js +++ b/packages/dashmate/test/unit/config/configFile/migrateConfigFileFactory.spec.js @@ -1,9 +1,9 @@ import fs from 'fs'; import path from 'path'; -import HomeDir from '../../../../../src/config/HomeDir.js'; -import { PACKAGE_ROOT_DIR } from '../../../../../src/constants.js'; -import createDIContainer from '../../../../../src/createDIContainer.js'; -import getConfigFileDataV0250 from '../../../../../src/test/fixtures/getConfigFileDataV0250.js'; +import HomeDir from '../../../../src/config/HomeDir.js'; +import { PACKAGE_ROOT_DIR } from '../../../../src/constants.js'; +import createDIContainer from '../../../../src/createDIContainer.js'; +import getConfigFileDataV0250 from '../../../../src/test/fixtures/getConfigFileDataV0250.js'; describe('migrateConfigFileFactory', () => { let mockConfigFileData; diff --git a/packages/js-dapi-client/lib/DAPIClient.js b/packages/js-dapi-client/lib/DAPIClient.js index d6561c2468..026cb51d18 100644 --- a/packages/js-dapi-client/lib/DAPIClient.js +++ b/packages/js-dapi-client/lib/DAPIClient.js @@ -34,6 +34,7 @@ class DAPIClient extends EventEmitter { blockHeadersProviderOptions: BlockHeadersProvider.defaultOptions, loggerOptions: { identifier: '', + level: undefined, }, ...options, }; @@ -57,7 +58,10 @@ class DAPIClient extends EventEmitter { this.core = new CoreMethodsFacade(jsonRpcTransport, grpcTransport); this.platform = new PlatformMethodsFacade(grpcTransport); - this.logger = logger.getForId(this.options.loggerOptions.identifier); + this.logger = logger.getForId( + this.options.loggerOptions.identifier, + this.options.loggerOptions.level, + ); this.initBlockHeadersProvider(); } @@ -89,6 +93,7 @@ DAPIClient.EVENTS = EVENTS; * @property {boolean} [throwDeadlineExceeded] * @property {object} [loggerOptions] * @property {string} [loggerOptions.identifier] + * @property {string} [loggerOptions.level] * @property {BlockHeadersProvider} [blockHeadersProvider] * @property {BlockHeadersProviderOptions} [blockHeadersProviderOptions] */ diff --git a/packages/js-dapi-client/lib/logger/index.js b/packages/js-dapi-client/lib/logger/index.js index c59df018a9..a06b34c145 100644 --- a/packages/js-dapi-client/lib/logger/index.js +++ b/packages/js-dapi-client/lib/logger/index.js @@ -1,7 +1,9 @@ const util = require('util'); const winston = require('winston'); -const LOG_LEVEL = process.env.LOG_LEVEL || 'info'; +// TODO: Refactor to use params instead on envs + +const LOG_LEVEL = process.env.LOG_LEVEL || 'silent'; const LOG_TO_FILE = process.env.LOG_WALLET_TO_FILE || 'false'; // Log levels: @@ -36,6 +38,7 @@ const createLogger = (formats = [], id = '') => { const transports = [ new winston.transports.Console({ format, + silent: LOG_LEVEL === 'silent', }), ]; @@ -44,6 +47,7 @@ const createLogger = (formats = [], id = '') => { new winston.transports.File({ filename: `wallet${id !== '' ? `_${id}` : ''}`, format, + silent: LOG_LEVEL === 'silent', }), ); } diff --git a/packages/js-dapi-client/lib/transport/GrpcTransport/GrpcTransport.js b/packages/js-dapi-client/lib/transport/GrpcTransport/GrpcTransport.js index f792c0738a..0618ca42ad 100644 --- a/packages/js-dapi-client/lib/transport/GrpcTransport/GrpcTransport.js +++ b/packages/js-dapi-client/lib/transport/GrpcTransport/GrpcTransport.js @@ -98,6 +98,8 @@ class GrpcTransport { throw responseError; } + // TODO: Shouldn't we call address.markAsBanned() here? + if (options.retries === 0) { throw new MaxRetriesReachedError(responseError); } diff --git a/packages/js-dapi-client/test/unit/DAPIClient.spec.js b/packages/js-dapi-client/test/unit/DAPIClient.spec.js index 73283a9d8a..dd57d1ff7e 100644 --- a/packages/js-dapi-client/test/unit/DAPIClient.spec.js +++ b/packages/js-dapi-client/test/unit/DAPIClient.spec.js @@ -26,6 +26,7 @@ describe('DAPIClient', () => { blockHeadersProviderOptions: BlockHeadersProvider.defaultOptions, loggerOptions: { identifier: '', + level: undefined, }, }); @@ -51,6 +52,7 @@ describe('DAPIClient', () => { blockHeadersProviderOptions: BlockHeadersProvider.defaultOptions, loggerOptions: { identifier: '', + level: undefined, }, }); @@ -82,6 +84,7 @@ describe('DAPIClient', () => { blockHeadersProviderOptions: BlockHeadersProvider.defaultOptions, loggerOptions: { identifier: '', + level: undefined, }, }); @@ -109,6 +112,7 @@ describe('DAPIClient', () => { blockHeadersProviderOptions: BlockHeadersProvider.defaultOptions, loggerOptions: { identifier: '', + level: undefined, }, }); diff --git a/yarn.lock b/yarn.lock index 3c98e0fa3d..3cc59e34fb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6557,6 +6557,7 @@ __metadata: "@babel/core": "npm:^7.23.3" "@babel/eslint-parser": "npm:^7.23.3" "@dashevo/bls": "npm:~1.2.9" + "@dashevo/dapi-client": "workspace:*" "@dashevo/dashcore-lib": "npm:~0.21.0" "@dashevo/dashd-rpc": "npm:^18.2.0" "@dashevo/dashpay-contract": "workspace:*" From 535429ae54817be2708aecd00711e4fe9893f5a1 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Fri, 12 Jan 2024 20:01:07 +0300 Subject: [PATCH 016/191] chore(release): update changelog and bump version to 1.0.0-dev.2 (#1671) --- CHANGELOG.md | 21 +++++++++ Cargo.lock | 46 +++++++++---------- package.json | 2 +- packages/bench-suite/package.json | 2 +- packages/dapi-grpc/Cargo.toml | 2 +- packages/dapi-grpc/package.json | 2 +- packages/dapi/package.json | 2 +- packages/dash-spv/package.json | 2 +- packages/dashmate/package.json | 2 +- packages/dashpay-contract/Cargo.toml | 2 +- packages/dashpay-contract/package.json | 2 +- packages/data-contracts/Cargo.toml | 2 +- packages/dpns-contract/Cargo.toml | 2 +- packages/dpns-contract/package.json | 2 +- packages/feature-flags-contract/Cargo.toml | 2 +- packages/feature-flags-contract/package.json | 2 +- packages/js-dapi-client/package.json | 2 +- packages/js-dash-sdk/package.json | 2 +- packages/js-grpc-common/package.json | 2 +- .../Cargo.toml | 2 +- .../package.json | 2 +- packages/platform-test-suite/package.json | 2 +- packages/rs-dapi-client/Cargo.toml | 2 +- packages/rs-dapi-grpc-macros/Cargo.toml | 2 +- packages/rs-dpp/Cargo.toml | 2 +- packages/rs-drive-abci/Cargo.toml | 2 +- packages/rs-drive-proof-verifier/Cargo.toml | 2 +- packages/rs-drive/Cargo.toml | 2 +- .../Cargo.toml | 2 +- packages/rs-platform-serialization/Cargo.toml | 2 +- .../rs-platform-value-convertible/Cargo.toml | 2 +- packages/rs-platform-value/Cargo.toml | 2 +- packages/rs-platform-version/Cargo.toml | 2 +- packages/rs-platform-versioning/Cargo.toml | 2 +- packages/rs-sdk/Cargo.toml | 2 +- packages/simple-signer/Cargo.toml | 2 +- packages/strategy-tests/Cargo.toml | 2 +- packages/wallet-lib/package.json | 2 +- packages/wasm-dpp/Cargo.toml | 2 +- packages/wasm-dpp/package.json | 2 +- packages/withdrawals-contract/Cargo.toml | 2 +- packages/withdrawals-contract/package.json | 2 +- 42 files changed, 84 insertions(+), 63 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1dd42d0815..b241f6f049 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,24 @@ +## [1.0.0-dev.2](https://github.com/dashpay/platform/compare/v1.0.0-dev.1...v1.0.0-dev.2) (2024-01-12) + + +### ⚠ BREAKING CHANGES + +* **dashmate:** adjust consensus params and enable re-check (#1669) +* **drive-abci:** internal error if vote extension block is already committed (#1663) + +### Bug Fixes + +* broadcasting already invalidated transitions ([#1668](https://github.com/dashpay/platform/issues/1668)) +* **dashmate:** dapi kills host machine on container stop ([#1670](https://github.com/dashpay/platform/issues/1670)) +* **drive-abci:** internal error if vote extension block is already committed ([#1663](https://github.com/dashpay/platform/issues/1663)) + + +### Miscellaneous Chores + +* **dashmate:** adjust consensus params and enable re-check ([#1669](https://github.com/dashpay/platform/issues/1669)) +* **drive-abci:** fix state transition logging ([#1664](https://github.com/dashpay/platform/issues/1664)) +* various logging improvements ([#1666](https://github.com/dashpay/platform/issues/1666)) + ## [1.0.0-dev.1](https://github.com/dashpay/platform/compare/v0.25.21...v1.0.0-dev.1) (2024-01-11) diff --git a/Cargo.lock b/Cargo.lock index fc333747d1..18756fe796 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -945,7 +945,7 @@ dependencies = [ [[package]] name = "dapi-grpc" -version = "1.0.0-dev.1" +version = "1.0.0-dev.2" dependencies = [ "dapi-grpc-macros", "platform-version", @@ -959,7 +959,7 @@ dependencies = [ [[package]] name = "dapi-grpc-macros" -version = "1.0.0-dev.1" +version = "1.0.0-dev.2" dependencies = [ "dapi-grpc", "heck", @@ -1065,7 +1065,7 @@ dependencies = [ [[package]] name = "dashpay-contract" -version = "1.0.0-dev.1" +version = "1.0.0-dev.2" dependencies = [ "platform-value", "serde_json", @@ -1073,7 +1073,7 @@ dependencies = [ [[package]] name = "data-contracts" -version = "1.0.0-dev.1" +version = "1.0.0-dev.2" dependencies = [ "dashpay-contract", "dpns-contract", @@ -1164,7 +1164,7 @@ checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" [[package]] name = "dpns-contract" -version = "1.0.0-dev.1" +version = "1.0.0-dev.2" dependencies = [ "platform-value", "serde_json", @@ -1172,7 +1172,7 @@ dependencies = [ [[package]] name = "dpp" -version = "1.0.0-dev.1" +version = "1.0.0-dev.2" dependencies = [ "anyhow", "async-trait", @@ -1222,7 +1222,7 @@ dependencies = [ [[package]] name = "drive" -version = "1.0.0-dev.1" +version = "1.0.0-dev.2" dependencies = [ "anyhow", "base64 0.21.5", @@ -1257,7 +1257,7 @@ dependencies = [ [[package]] name = "drive-abci" -version = "1.0.0-dev.1" +version = "1.0.0-dev.2" dependencies = [ "atty", "base64 0.20.0", @@ -1311,7 +1311,7 @@ dependencies = [ [[package]] name = "drive-proof-verifier" -version = "1.0.0-dev.1" +version = "1.0.0-dev.2" dependencies = [ "dapi-grpc", "dpp", @@ -1512,7 +1512,7 @@ checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" [[package]] name = "feature-flags-contract" -version = "1.0.0-dev.1" +version = "1.0.0-dev.2" dependencies = [ "platform-value", "serde_json", @@ -2360,7 +2360,7 @@ dependencies = [ [[package]] name = "masternode-reward-shares-contract" -version = "1.0.0-dev.1" +version = "1.0.0-dev.2" dependencies = [ "platform-value", "serde_json", @@ -2838,7 +2838,7 @@ checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" [[package]] name = "platform-serialization" -version = "1.0.0-dev.1" +version = "1.0.0-dev.2" dependencies = [ "bincode 2.0.0-rc.3", "platform-version", @@ -2846,7 +2846,7 @@ dependencies = [ [[package]] name = "platform-serialization-derive" -version = "1.0.0-dev.1" +version = "1.0.0-dev.2" dependencies = [ "proc-macro2", "quote", @@ -2856,7 +2856,7 @@ dependencies = [ [[package]] name = "platform-value" -version = "1.0.0-dev.1" +version = "1.0.0-dev.2" dependencies = [ "base64 0.13.1", "bincode 2.0.0-rc.3", @@ -2877,7 +2877,7 @@ dependencies = [ [[package]] name = "platform-value-convertible" -version = "1.0.0-dev.1" +version = "1.0.0-dev.2" dependencies = [ "quote", "syn 2.0.41", @@ -2885,14 +2885,14 @@ dependencies = [ [[package]] name = "platform-version" -version = "1.0.0-dev.1" +version = "1.0.0-dev.2" dependencies = [ "thiserror", ] [[package]] name = "platform-versioning" -version = "1.0.0-dev.1" +version = "1.0.0-dev.2" dependencies = [ "proc-macro2", "quote", @@ -3435,7 +3435,7 @@ dependencies = [ [[package]] name = "rs-dapi-client" -version = "1.0.0-dev.1" +version = "1.0.0-dev.2" dependencies = [ "backon", "chrono", @@ -3455,7 +3455,7 @@ dependencies = [ [[package]] name = "rs-sdk" -version = "1.0.0-dev.1" +version = "1.0.0-dev.2" dependencies = [ "async-trait", "base64 0.21.5", @@ -3905,7 +3905,7 @@ checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" [[package]] name = "simple-signer" -version = "1.0.0-dev.1" +version = "1.0.0-dev.2" dependencies = [ "anyhow", "bincode 2.0.0-rc.3", @@ -3996,7 +3996,7 @@ dependencies = [ [[package]] name = "strategy-tests" -version = "1.0.0-dev.1" +version = "1.0.0-dev.2" dependencies = [ "bincode 2.0.0-rc.3", "dpp", @@ -4903,7 +4903,7 @@ checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93" [[package]] name = "wasm-dpp" -version = "1.0.0-dev.1" +version = "1.0.0-dev.2" dependencies = [ "anyhow", "async-trait", @@ -5145,7 +5145,7 @@ dependencies = [ [[package]] name = "withdrawals-contract" -version = "1.0.0-dev.1" +version = "1.0.0-dev.2" dependencies = [ "num_enum", "platform-value", diff --git a/package.json b/package.json index 59631bf083..4b5ef6f351 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/platform", - "version": "1.0.0-dev.1", + "version": "1.0.0-dev.2", "private": true, "scripts": { "setup": "yarn install && yarn run build && yarn run configure", diff --git a/packages/bench-suite/package.json b/packages/bench-suite/package.json index bd5e216958..9ff18690ef 100644 --- a/packages/bench-suite/package.json +++ b/packages/bench-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/bench-suite", "private": true, - "version": "1.0.0-dev.1", + "version": "1.0.0-dev.2", "description": "Dash Platform benchmark tool", "scripts": { "bench": "node ./bin/bench.js", diff --git a/packages/dapi-grpc/Cargo.toml b/packages/dapi-grpc/Cargo.toml index 63a481d993..6842849c39 100644 --- a/packages/dapi-grpc/Cargo.toml +++ b/packages/dapi-grpc/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc" description = "GRPC client for Dash Platform" -version = "1.0.0-dev.1" +version = "1.0.0-dev.2" authors = [ "Samuel Westrich ", "Igor Markin ", diff --git a/packages/dapi-grpc/package.json b/packages/dapi-grpc/package.json index e0ffb5137e..bb050288b0 100644 --- a/packages/dapi-grpc/package.json +++ b/packages/dapi-grpc/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-grpc", - "version": "1.0.0-dev.1", + "version": "1.0.0-dev.2", "description": "DAPI GRPC definition file and generated clients", "browser": "browser.js", "main": "node.js", diff --git a/packages/dapi/package.json b/packages/dapi/package.json index 61d36204a3..e003e3f471 100644 --- a/packages/dapi/package.json +++ b/packages/dapi/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/dapi", "private": true, - "version": "1.0.0-dev.1", + "version": "1.0.0-dev.2", "description": "A decentralized API for the Dash network", "scripts": { "api": "node scripts/api.js", diff --git a/packages/dash-spv/package.json b/packages/dash-spv/package.json index 643fb73c67..4c5aebf033 100644 --- a/packages/dash-spv/package.json +++ b/packages/dash-spv/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dash-spv", - "version": "1.0.0-dev.1", + "version": "1.0.0-dev.2", "description": "Repository containing SPV functions used by @dashevo", "main": "index.js", "scripts": { diff --git a/packages/dashmate/package.json b/packages/dashmate/package.json index d91d65b18e..04735e7b5c 100644 --- a/packages/dashmate/package.json +++ b/packages/dashmate/package.json @@ -1,6 +1,6 @@ { "name": "dashmate", - "version": "1.0.0-dev.1", + "version": "1.0.0-dev.2", "description": "Distribution package for Dash node installation", "scripts": { "lint": "eslint .", diff --git a/packages/dashpay-contract/Cargo.toml b/packages/dashpay-contract/Cargo.toml index 2c46e2df52..1accd60795 100644 --- a/packages/dashpay-contract/Cargo.toml +++ b/packages/dashpay-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dashpay-contract" description = "DashPay data contract schema and tools" -version = "1.0.0-dev.1" +version = "1.0.0-dev.2" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/dashpay-contract/package.json b/packages/dashpay-contract/package.json index 93e3f5fd6b..b061e43312 100644 --- a/packages/dashpay-contract/package.json +++ b/packages/dashpay-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dashpay-contract", - "version": "1.0.0-dev.1", + "version": "1.0.0-dev.2", "description": "Reference contract of the DashPay DPA on Dash Evolution", "scripts": { "lint": "eslint .", diff --git a/packages/data-contracts/Cargo.toml b/packages/data-contracts/Cargo.toml index 2d77d81195..b4104246c2 100644 --- a/packages/data-contracts/Cargo.toml +++ b/packages/data-contracts/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "data-contracts" description = "Dash Platform system data contracts" -version = "1.0.0-dev.1" +version = "1.0.0-dev.2" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/dpns-contract/Cargo.toml b/packages/dpns-contract/Cargo.toml index 38cd367939..bd9f92d2e6 100644 --- a/packages/dpns-contract/Cargo.toml +++ b/packages/dpns-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dpns-contract" description = "DPNS data contract schema and tools" -version = "1.0.0-dev.1" +version = "1.0.0-dev.2" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/dpns-contract/package.json b/packages/dpns-contract/package.json index 4df6fa64fe..a4dd06efd7 100644 --- a/packages/dpns-contract/package.json +++ b/packages/dpns-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dpns-contract", - "version": "1.0.0-dev.1", + "version": "1.0.0-dev.2", "description": "A contract and helper scripts for DPNS DApp", "scripts": { "lint": "eslint .", diff --git a/packages/feature-flags-contract/Cargo.toml b/packages/feature-flags-contract/Cargo.toml index cac456ed13..ef68a32211 100644 --- a/packages/feature-flags-contract/Cargo.toml +++ b/packages/feature-flags-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "feature-flags-contract" description = "Feature flags data contract schema and tools" -version = "1.0.0-dev.1" +version = "1.0.0-dev.2" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/feature-flags-contract/package.json b/packages/feature-flags-contract/package.json index 5c9772bc48..330322b579 100644 --- a/packages/feature-flags-contract/package.json +++ b/packages/feature-flags-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/feature-flags-contract", - "version": "1.0.0-dev.1", + "version": "1.0.0-dev.2", "description": "Data Contract to store Dash Platform feature flags", "scripts": { "build": "", diff --git a/packages/js-dapi-client/package.json b/packages/js-dapi-client/package.json index bec57c0ca8..d5b3e22bf3 100644 --- a/packages/js-dapi-client/package.json +++ b/packages/js-dapi-client/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-client", - "version": "1.0.0-dev.1", + "version": "1.0.0-dev.2", "description": "Client library used to access Dash DAPI endpoints", "main": "lib/index.js", "contributors": [ diff --git a/packages/js-dash-sdk/package.json b/packages/js-dash-sdk/package.json index eed3034c6a..3260ec9db1 100644 --- a/packages/js-dash-sdk/package.json +++ b/packages/js-dash-sdk/package.json @@ -1,6 +1,6 @@ { "name": "dash", - "version": "4.0.0-dev.1", + "version": "4.0.0-dev.2", "description": "Dash library for JavaScript/TypeScript ecosystem (Wallet, DAPI, Primitives, BLS, ...)", "main": "build/index.js", "unpkg": "dist/dash.min.js", diff --git a/packages/js-grpc-common/package.json b/packages/js-grpc-common/package.json index c9da4a1c55..e1d049a8d1 100644 --- a/packages/js-grpc-common/package.json +++ b/packages/js-grpc-common/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/grpc-common", - "version": "1.0.0-dev.1", + "version": "1.0.0-dev.2", "description": "Common GRPC library", "main": "index.js", "scripts": { diff --git a/packages/masternode-reward-shares-contract/Cargo.toml b/packages/masternode-reward-shares-contract/Cargo.toml index 31e0a868b9..20dadf5b9a 100644 --- a/packages/masternode-reward-shares-contract/Cargo.toml +++ b/packages/masternode-reward-shares-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "masternode-reward-shares-contract" description = "Masternode reward shares data contract schema and tools" -version = "1.0.0-dev.1" +version = "1.0.0-dev.2" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/masternode-reward-shares-contract/package.json b/packages/masternode-reward-shares-contract/package.json index 1774bb85b2..7651875a14 100644 --- a/packages/masternode-reward-shares-contract/package.json +++ b/packages/masternode-reward-shares-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/masternode-reward-shares-contract", - "version": "1.0.0-dev.1", + "version": "1.0.0-dev.2", "description": "A contract and helper scripts for reward sharing", "scripts": { "lint": "eslint .", diff --git a/packages/platform-test-suite/package.json b/packages/platform-test-suite/package.json index 30d3154929..c39bc9f09d 100644 --- a/packages/platform-test-suite/package.json +++ b/packages/platform-test-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/platform-test-suite", "private": true, - "version": "1.0.0-dev.1", + "version": "1.0.0-dev.2", "description": "Dash Network end-to-end tests", "scripts": { "test": "yarn exec bin/test.sh", diff --git a/packages/rs-dapi-client/Cargo.toml b/packages/rs-dapi-client/Cargo.toml index 7b97773e70..667d639c19 100644 --- a/packages/rs-dapi-client/Cargo.toml +++ b/packages/rs-dapi-client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rs-dapi-client" -version = "1.0.0-dev.1" +version = "1.0.0-dev.2" edition = "2021" [features] diff --git a/packages/rs-dapi-grpc-macros/Cargo.toml b/packages/rs-dapi-grpc-macros/Cargo.toml index f3b93170f2..4a424e125f 100644 --- a/packages/rs-dapi-grpc-macros/Cargo.toml +++ b/packages/rs-dapi-grpc-macros/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc-macros" -version = "1.0.0-dev.1" +version = "1.0.0-dev.2" edition = "2021" description = "Macros used by dapi-grpc. Internal use only." diff --git a/packages/rs-dpp/Cargo.toml b/packages/rs-dpp/Cargo.toml index 3d95f0d036..c61f252234 100644 --- a/packages/rs-dpp/Cargo.toml +++ b/packages/rs-dpp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dpp" -version = "1.0.0-dev.1" +version = "1.0.0-dev.2" edition = "2021" rust-version = "1.73" authors = [ diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index ae1d90b591..8e1c33f393 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drive-abci" -version = "1.0.0-dev.1" +version = "1.0.0-dev.2" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/rs-drive-proof-verifier/Cargo.toml b/packages/rs-drive-proof-verifier/Cargo.toml index 495d38b178..b2fb935605 100644 --- a/packages/rs-drive-proof-verifier/Cargo.toml +++ b/packages/rs-drive-proof-verifier/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drive-proof-verifier" -version = "1.0.0-dev.1" +version = "1.0.0-dev.2" edition = "2021" rust-version = "1.73" diff --git a/packages/rs-drive/Cargo.toml b/packages/rs-drive/Cargo.toml index 1fb1f3f872..b4305597bd 100644 --- a/packages/rs-drive/Cargo.toml +++ b/packages/rs-drive/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "drive" description = "Dash drive built on top of GroveDB" -version = "1.0.0-dev.1" +version = "1.0.0-dev.2" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/rs-platform-serialization-derive/Cargo.toml b/packages/rs-platform-serialization-derive/Cargo.toml index 11057a85b3..0bb3a2491f 100644 --- a/packages/rs-platform-serialization-derive/Cargo.toml +++ b/packages/rs-platform-serialization-derive/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization-derive" authors = ["Samuel Westrich "] description = "Bincode serialization and deserialization derivations" -version = "1.0.0-dev.1" +version = "1.0.0-dev.2" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/rs-platform-serialization/Cargo.toml b/packages/rs-platform-serialization/Cargo.toml index aac87ecee4..5621eae8e1 100644 --- a/packages/rs-platform-serialization/Cargo.toml +++ b/packages/rs-platform-serialization/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization" authors = ["Samuel Westrich "] description = "Bincode based serialization and deserialization" -version = "1.0.0-dev.1" +version = "1.0.0-dev.2" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/rs-platform-value-convertible/Cargo.toml b/packages/rs-platform-value-convertible/Cargo.toml index fc8ce061d5..7a5e0bec76 100644 --- a/packages/rs-platform-value-convertible/Cargo.toml +++ b/packages/rs-platform-value-convertible/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-value-convertible" authors = ["Samuel Westrich "] description = "Convertion to and from platform values" -version = "1.0.0-dev.1" +version = "1.0.0-dev.2" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/rs-platform-value/Cargo.toml b/packages/rs-platform-value/Cargo.toml index 4578e9fb1c..fbc905428a 100644 --- a/packages/rs-platform-value/Cargo.toml +++ b/packages/rs-platform-value/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-value" authors = ["Samuel Westrich "] description = "A simple value module" -version = "1.0.0-dev.1" +version = "1.0.0-dev.2" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/rs-platform-version/Cargo.toml b/packages/rs-platform-version/Cargo.toml index 3fec1cab1d..fd364e4067 100644 --- a/packages/rs-platform-version/Cargo.toml +++ b/packages/rs-platform-version/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-version" authors = ["Samuel Westrich "] description = "Bincode based serialization and deserialization" -version = "1.0.0-dev.1" +version = "1.0.0-dev.2" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/rs-platform-versioning/Cargo.toml b/packages/rs-platform-versioning/Cargo.toml index 55b39f19a9..6cba3925f7 100644 --- a/packages/rs-platform-versioning/Cargo.toml +++ b/packages/rs-platform-versioning/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-versioning" authors = ["Samuel Westrich "] description = "Version derivation" -version = "1.0.0-dev.1" +version = "1.0.0-dev.2" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/rs-sdk/Cargo.toml b/packages/rs-sdk/Cargo.toml index b178ece870..b4e7f14f5a 100644 --- a/packages/rs-sdk/Cargo.toml +++ b/packages/rs-sdk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rs-sdk" -version = "1.0.0-dev.1" +version = "1.0.0-dev.2" edition = "2021" [dependencies] diff --git a/packages/simple-signer/Cargo.toml b/packages/simple-signer/Cargo.toml index 484074d2d9..f85b1fea9a 100644 --- a/packages/simple-signer/Cargo.toml +++ b/packages/simple-signer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "simple-signer" -version = "1.0.0-dev.1" +version = "1.0.0-dev.2" edition = "2021" rust-version = "1.73" diff --git a/packages/strategy-tests/Cargo.toml b/packages/strategy-tests/Cargo.toml index 446c5a8a60..cd2c2d12f0 100644 --- a/packages/strategy-tests/Cargo.toml +++ b/packages/strategy-tests/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "strategy-tests" -version = "1.0.0-dev.1" +version = "1.0.0-dev.2" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/wallet-lib/package.json b/packages/wallet-lib/package.json index 2fdb79e237..4133520d7c 100644 --- a/packages/wallet-lib/package.json +++ b/packages/wallet-lib/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wallet-lib", - "version": "8.0.0-dev.1", + "version": "8.0.0-dev.2", "description": "Light wallet library for Dash", "main": "src/index.js", "unpkg": "dist/wallet-lib.min.js", diff --git a/packages/wasm-dpp/Cargo.toml b/packages/wasm-dpp/Cargo.toml index 8a462fb4cd..aa3005a7e2 100644 --- a/packages/wasm-dpp/Cargo.toml +++ b/packages/wasm-dpp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasm-dpp" -version = "1.0.0-dev.1" +version = "1.0.0-dev.2" edition = "2021" rust-version = "1.73" authors = ["Anton Suprunchuk "] diff --git a/packages/wasm-dpp/package.json b/packages/wasm-dpp/package.json index 2f6082e64a..a04693fc36 100644 --- a/packages/wasm-dpp/package.json +++ b/packages/wasm-dpp/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wasm-dpp", - "version": "1.0.0-dev.1", + "version": "1.0.0-dev.2", "description": "The JavaScript implementation of the Dash Platform Protocol", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/withdrawals-contract/Cargo.toml b/packages/withdrawals-contract/Cargo.toml index 07aa8be38a..acdc459cba 100644 --- a/packages/withdrawals-contract/Cargo.toml +++ b/packages/withdrawals-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "withdrawals-contract" description = "Witdrawals data contract schema and tools" -version = "1.0.0-dev.1" +version = "1.0.0-dev.2" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/withdrawals-contract/package.json b/packages/withdrawals-contract/package.json index 4691da2234..c61769093d 100644 --- a/packages/withdrawals-contract/package.json +++ b/packages/withdrawals-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/withdrawals-contract", - "version": "1.0.0-dev.1", + "version": "1.0.0-dev.2", "description": "Data Contract to manipulate and track withdrawals", "scripts": { "build": "", From 77febff14477118869bdf2b6bcccff5b03d54066 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Tue, 16 Jan 2024 18:57:50 +0300 Subject: [PATCH 017/191] fix(dapi): internal errors if broadcasting failed (#1673) --- .../broadcastStateTransitionHandlerFactory.js | 15 +++- ...dcastStateTransitionHandlerFactory.spec.js | 85 +++++++++++++++++-- 2 files changed, 89 insertions(+), 11 deletions(-) diff --git a/packages/dapi/lib/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.js b/packages/dapi/lib/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.js index 335794d42f..245d95c4dc 100644 --- a/packages/dapi/lib/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.js +++ b/packages/dapi/lib/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.js @@ -4,6 +4,7 @@ const { InvalidArgumentGrpcError, AlreadyExistsGrpcError, ResourceExhaustedGrpcError, + UnavailableGrpcError, }, }, } = require('@dashevo/grpc-common'); @@ -44,7 +45,11 @@ function broadcastStateTransitionHandlerFactory(rpcClient, createGrpcErrorFromDr try { response = await rpcClient.request('broadcast_tx_sync', { tx }); } catch (e) { - logger.error(e, 'Failed broadcasting state transition'); + logger.error(`Failed broadcasting state transition: ${e}`); + + if (e.message === 'socket hang up') { + throw new UnavailableGrpcError('Tenderdash is not available'); + } throw e; } @@ -65,12 +70,18 @@ function broadcastStateTransitionHandlerFactory(rpcClient, createGrpcErrorFromDr if (jsonRpcError.data.startsWith('mempool is full')) { throw new ResourceExhaustedGrpcError(jsonRpcError.data); } + + if (jsonRpcError.data.startsWith('broadcast confirmation not received:')) { + logger.error(`Failed broadcasting state transition: ${jsonRpcError.data}`); + + throw new UnavailableGrpcError(jsonRpcError.data); + } } const error = new Error(); Object.assign(error, jsonRpcError); - logger.error(error, 'Unexpected JSON RPC error during broadcasting state transition'); + logger.error(error, `Unexpected JSON RPC error during broadcasting state transition: ${JSON.stringify(jsonRpcError)}`); throw error; } diff --git a/packages/dapi/test/unit/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.spec.js b/packages/dapi/test/unit/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.spec.js index 1b9fa6867c..4a1b09a9a9 100644 --- a/packages/dapi/test/unit/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.spec.js +++ b/packages/dapi/test/unit/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.spec.js @@ -3,6 +3,8 @@ const { error: { InvalidArgumentGrpcError, AlreadyExistsGrpcError, + UnavailableGrpcError, + ResourceExhaustedGrpcError, }, }, } = require('@dashevo/grpc-common'); @@ -115,23 +117,72 @@ describe('broadcastStateTransitionHandlerFactory', () => { expect(rpcClientMock.request).to.be.calledOnceWith('broadcast_tx_sync', { tx }); }); - it('should throw an error if transaction broadcast returns error', async () => { - const error = { code: -1, message: "Something didn't work", data: 'Some data' }; + it('should throw a UnavailableGrpcError if tenderdash hands up', async () => { + const error = new Error('socket hang up'); + rpcClientMock.request.throws(error); - response.error = error; + try { + await broadcastStateTransitionHandler(call); + + expect.fail('should throw UnavailableGrpcError'); + } catch (e) { + expect(e).to.be.an.instanceOf(UnavailableGrpcError); + expect(e.getMessage()).to.equal('Tenderdash is not available'); + } + }); + + it('should throw a UnavailableGrpcError if broadcast confirmation not received', async () => { + response.error = { + code: -32603, + message: 'Internal error', + data: 'broadcast confirmation not received: heya', + }; try { await broadcastStateTransitionHandler(call); - expect.fail('should throw an error'); + expect.fail('should throw UnavailableGrpcError'); } catch (e) { - expect(e.message).to.equal(error.message); - expect(e.data).to.equal(error.data); - expect(e.code).to.equal(error.code); + expect(e).to.be.an.instanceOf(UnavailableGrpcError); + expect(e.getMessage()).to.equal(response.error.data); } }); - it('should throw FailedPreconditionGrpcError if transaction was broadcasted twice', async () => { + it('should throw an InvalidArgumentGrpcError if state transition size is too big', async () => { + response.error = { + code: -32603, + message: 'Internal error', + data: 'Tx too large. La la la', + }; + + try { + await broadcastStateTransitionHandler(call); + + expect.fail('should throw UnavailableGrpcError'); + } catch (e) { + expect(e).to.be.an.instanceOf(InvalidArgumentGrpcError); + expect(e.getMessage()).to.equal('state transition is too large. La la la'); + } + }); + + it('should throw a ResourceExhaustedGrpcError if mempool is full', async () => { + response.error = { + code: -32603, + message: 'Internal error', + data: 'mempool is full: heya', + }; + + try { + await broadcastStateTransitionHandler(call); + + expect.fail('should throw UnavailableGrpcError'); + } catch (e) { + expect(e).to.be.an.instanceOf(ResourceExhaustedGrpcError); + expect(e.getMessage()).to.equal(response.error.data); + } + }); + + it('should throw AlreadyExistsGrpcError if transaction was broadcasted twice', async () => { response.error = { code: -32603, message: 'Internal error', @@ -148,7 +199,7 @@ describe('broadcastStateTransitionHandlerFactory', () => { } }); - it('should throw call createGrpcErrorFromDriveResponse if error code is not 0', async () => { + it('should throw a gRPC error based on drive\'s response', async () => { const message = 'not found'; const metadata = { data: 'some data', @@ -176,4 +227,20 @@ describe('broadcastStateTransitionHandlerFactory', () => { ); } }); + + it('should throw an error if transaction broadcast returns unknown error', async () => { + const error = { code: -1, message: "Something didn't work", data: 'Some data' }; + + response.error = error; + + try { + await broadcastStateTransitionHandler(call); + + expect.fail('should throw an error'); + } catch (e) { + expect(e.message).to.equal(error.message); + expect(e.data).to.equal(error.data); + expect(e.code).to.equal(error.code); + } + }); }); From 2c0c579f0a9aebb97ca411eeba161af44f4521ae Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Tue, 16 Jan 2024 19:34:14 +0300 Subject: [PATCH 018/191] chore(release): update changelog and bump version to 1.0.0-dev.3 (#1674) --- CHANGELOG.md | 7 +++ Cargo.lock | 46 +++++++++---------- package.json | 2 +- packages/bench-suite/package.json | 2 +- packages/dapi-grpc/Cargo.toml | 2 +- packages/dapi-grpc/package.json | 2 +- packages/dapi/package.json | 2 +- packages/dash-spv/package.json | 2 +- packages/dashmate/package.json | 2 +- packages/dashpay-contract/Cargo.toml | 2 +- packages/dashpay-contract/package.json | 2 +- packages/data-contracts/Cargo.toml | 2 +- packages/dpns-contract/Cargo.toml | 2 +- packages/dpns-contract/package.json | 2 +- packages/feature-flags-contract/Cargo.toml | 2 +- packages/feature-flags-contract/package.json | 2 +- packages/js-dapi-client/package.json | 2 +- packages/js-dash-sdk/package.json | 2 +- packages/js-grpc-common/package.json | 2 +- .../Cargo.toml | 2 +- .../package.json | 2 +- packages/platform-test-suite/package.json | 2 +- packages/rs-dapi-client/Cargo.toml | 2 +- packages/rs-dapi-grpc-macros/Cargo.toml | 2 +- packages/rs-dpp/Cargo.toml | 2 +- packages/rs-drive-abci/Cargo.toml | 2 +- packages/rs-drive-proof-verifier/Cargo.toml | 2 +- packages/rs-drive/Cargo.toml | 2 +- .../Cargo.toml | 2 +- packages/rs-platform-serialization/Cargo.toml | 2 +- .../rs-platform-value-convertible/Cargo.toml | 2 +- packages/rs-platform-value/Cargo.toml | 2 +- packages/rs-platform-version/Cargo.toml | 2 +- packages/rs-platform-versioning/Cargo.toml | 2 +- packages/rs-sdk/Cargo.toml | 2 +- packages/simple-signer/Cargo.toml | 2 +- packages/strategy-tests/Cargo.toml | 2 +- packages/wallet-lib/package.json | 2 +- packages/wasm-dpp/Cargo.toml | 2 +- packages/wasm-dpp/package.json | 2 +- packages/withdrawals-contract/Cargo.toml | 2 +- packages/withdrawals-contract/package.json | 2 +- 42 files changed, 70 insertions(+), 63 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b241f6f049..35c0b7ef0f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [1.0.0-dev.3](https://github.com/dashpay/platform/compare/v1.0.0-dev.2...v1.0.0-dev.3) (2024-01-16) + + +### Bug Fixes + +* **dapi:** internal errors if broadcasting failed ([#1673](https://github.com/dashpay/platform/issues/1673)) + ## [1.0.0-dev.2](https://github.com/dashpay/platform/compare/v1.0.0-dev.1...v1.0.0-dev.2) (2024-01-12) diff --git a/Cargo.lock b/Cargo.lock index 18756fe796..fd5dc32b09 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -945,7 +945,7 @@ dependencies = [ [[package]] name = "dapi-grpc" -version = "1.0.0-dev.2" +version = "1.0.0-dev.3" dependencies = [ "dapi-grpc-macros", "platform-version", @@ -959,7 +959,7 @@ dependencies = [ [[package]] name = "dapi-grpc-macros" -version = "1.0.0-dev.2" +version = "1.0.0-dev.3" dependencies = [ "dapi-grpc", "heck", @@ -1065,7 +1065,7 @@ dependencies = [ [[package]] name = "dashpay-contract" -version = "1.0.0-dev.2" +version = "1.0.0-dev.3" dependencies = [ "platform-value", "serde_json", @@ -1073,7 +1073,7 @@ dependencies = [ [[package]] name = "data-contracts" -version = "1.0.0-dev.2" +version = "1.0.0-dev.3" dependencies = [ "dashpay-contract", "dpns-contract", @@ -1164,7 +1164,7 @@ checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" [[package]] name = "dpns-contract" -version = "1.0.0-dev.2" +version = "1.0.0-dev.3" dependencies = [ "platform-value", "serde_json", @@ -1172,7 +1172,7 @@ dependencies = [ [[package]] name = "dpp" -version = "1.0.0-dev.2" +version = "1.0.0-dev.3" dependencies = [ "anyhow", "async-trait", @@ -1222,7 +1222,7 @@ dependencies = [ [[package]] name = "drive" -version = "1.0.0-dev.2" +version = "1.0.0-dev.3" dependencies = [ "anyhow", "base64 0.21.5", @@ -1257,7 +1257,7 @@ dependencies = [ [[package]] name = "drive-abci" -version = "1.0.0-dev.2" +version = "1.0.0-dev.3" dependencies = [ "atty", "base64 0.20.0", @@ -1311,7 +1311,7 @@ dependencies = [ [[package]] name = "drive-proof-verifier" -version = "1.0.0-dev.2" +version = "1.0.0-dev.3" dependencies = [ "dapi-grpc", "dpp", @@ -1512,7 +1512,7 @@ checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" [[package]] name = "feature-flags-contract" -version = "1.0.0-dev.2" +version = "1.0.0-dev.3" dependencies = [ "platform-value", "serde_json", @@ -2360,7 +2360,7 @@ dependencies = [ [[package]] name = "masternode-reward-shares-contract" -version = "1.0.0-dev.2" +version = "1.0.0-dev.3" dependencies = [ "platform-value", "serde_json", @@ -2838,7 +2838,7 @@ checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" [[package]] name = "platform-serialization" -version = "1.0.0-dev.2" +version = "1.0.0-dev.3" dependencies = [ "bincode 2.0.0-rc.3", "platform-version", @@ -2846,7 +2846,7 @@ dependencies = [ [[package]] name = "platform-serialization-derive" -version = "1.0.0-dev.2" +version = "1.0.0-dev.3" dependencies = [ "proc-macro2", "quote", @@ -2856,7 +2856,7 @@ dependencies = [ [[package]] name = "platform-value" -version = "1.0.0-dev.2" +version = "1.0.0-dev.3" dependencies = [ "base64 0.13.1", "bincode 2.0.0-rc.3", @@ -2877,7 +2877,7 @@ dependencies = [ [[package]] name = "platform-value-convertible" -version = "1.0.0-dev.2" +version = "1.0.0-dev.3" dependencies = [ "quote", "syn 2.0.41", @@ -2885,14 +2885,14 @@ dependencies = [ [[package]] name = "platform-version" -version = "1.0.0-dev.2" +version = "1.0.0-dev.3" dependencies = [ "thiserror", ] [[package]] name = "platform-versioning" -version = "1.0.0-dev.2" +version = "1.0.0-dev.3" dependencies = [ "proc-macro2", "quote", @@ -3435,7 +3435,7 @@ dependencies = [ [[package]] name = "rs-dapi-client" -version = "1.0.0-dev.2" +version = "1.0.0-dev.3" dependencies = [ "backon", "chrono", @@ -3455,7 +3455,7 @@ dependencies = [ [[package]] name = "rs-sdk" -version = "1.0.0-dev.2" +version = "1.0.0-dev.3" dependencies = [ "async-trait", "base64 0.21.5", @@ -3905,7 +3905,7 @@ checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" [[package]] name = "simple-signer" -version = "1.0.0-dev.2" +version = "1.0.0-dev.3" dependencies = [ "anyhow", "bincode 2.0.0-rc.3", @@ -3996,7 +3996,7 @@ dependencies = [ [[package]] name = "strategy-tests" -version = "1.0.0-dev.2" +version = "1.0.0-dev.3" dependencies = [ "bincode 2.0.0-rc.3", "dpp", @@ -4903,7 +4903,7 @@ checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93" [[package]] name = "wasm-dpp" -version = "1.0.0-dev.2" +version = "1.0.0-dev.3" dependencies = [ "anyhow", "async-trait", @@ -5145,7 +5145,7 @@ dependencies = [ [[package]] name = "withdrawals-contract" -version = "1.0.0-dev.2" +version = "1.0.0-dev.3" dependencies = [ "num_enum", "platform-value", diff --git a/package.json b/package.json index 4b5ef6f351..9367ba41ab 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/platform", - "version": "1.0.0-dev.2", + "version": "1.0.0-dev.3", "private": true, "scripts": { "setup": "yarn install && yarn run build && yarn run configure", diff --git a/packages/bench-suite/package.json b/packages/bench-suite/package.json index 9ff18690ef..3d249a0e74 100644 --- a/packages/bench-suite/package.json +++ b/packages/bench-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/bench-suite", "private": true, - "version": "1.0.0-dev.2", + "version": "1.0.0-dev.3", "description": "Dash Platform benchmark tool", "scripts": { "bench": "node ./bin/bench.js", diff --git a/packages/dapi-grpc/Cargo.toml b/packages/dapi-grpc/Cargo.toml index 6842849c39..0b07aa2426 100644 --- a/packages/dapi-grpc/Cargo.toml +++ b/packages/dapi-grpc/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc" description = "GRPC client for Dash Platform" -version = "1.0.0-dev.2" +version = "1.0.0-dev.3" authors = [ "Samuel Westrich ", "Igor Markin ", diff --git a/packages/dapi-grpc/package.json b/packages/dapi-grpc/package.json index bb050288b0..520e07d885 100644 --- a/packages/dapi-grpc/package.json +++ b/packages/dapi-grpc/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-grpc", - "version": "1.0.0-dev.2", + "version": "1.0.0-dev.3", "description": "DAPI GRPC definition file and generated clients", "browser": "browser.js", "main": "node.js", diff --git a/packages/dapi/package.json b/packages/dapi/package.json index e003e3f471..982f6b9312 100644 --- a/packages/dapi/package.json +++ b/packages/dapi/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/dapi", "private": true, - "version": "1.0.0-dev.2", + "version": "1.0.0-dev.3", "description": "A decentralized API for the Dash network", "scripts": { "api": "node scripts/api.js", diff --git a/packages/dash-spv/package.json b/packages/dash-spv/package.json index 4c5aebf033..90a85daeae 100644 --- a/packages/dash-spv/package.json +++ b/packages/dash-spv/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dash-spv", - "version": "1.0.0-dev.2", + "version": "1.0.0-dev.3", "description": "Repository containing SPV functions used by @dashevo", "main": "index.js", "scripts": { diff --git a/packages/dashmate/package.json b/packages/dashmate/package.json index 04735e7b5c..eddc62b2a0 100644 --- a/packages/dashmate/package.json +++ b/packages/dashmate/package.json @@ -1,6 +1,6 @@ { "name": "dashmate", - "version": "1.0.0-dev.2", + "version": "1.0.0-dev.3", "description": "Distribution package for Dash node installation", "scripts": { "lint": "eslint .", diff --git a/packages/dashpay-contract/Cargo.toml b/packages/dashpay-contract/Cargo.toml index 1accd60795..ea69f871c8 100644 --- a/packages/dashpay-contract/Cargo.toml +++ b/packages/dashpay-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dashpay-contract" description = "DashPay data contract schema and tools" -version = "1.0.0-dev.2" +version = "1.0.0-dev.3" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/dashpay-contract/package.json b/packages/dashpay-contract/package.json index b061e43312..b159d7d7e9 100644 --- a/packages/dashpay-contract/package.json +++ b/packages/dashpay-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dashpay-contract", - "version": "1.0.0-dev.2", + "version": "1.0.0-dev.3", "description": "Reference contract of the DashPay DPA on Dash Evolution", "scripts": { "lint": "eslint .", diff --git a/packages/data-contracts/Cargo.toml b/packages/data-contracts/Cargo.toml index b4104246c2..9ca1fc9250 100644 --- a/packages/data-contracts/Cargo.toml +++ b/packages/data-contracts/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "data-contracts" description = "Dash Platform system data contracts" -version = "1.0.0-dev.2" +version = "1.0.0-dev.3" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/dpns-contract/Cargo.toml b/packages/dpns-contract/Cargo.toml index bd9f92d2e6..4b1156421a 100644 --- a/packages/dpns-contract/Cargo.toml +++ b/packages/dpns-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dpns-contract" description = "DPNS data contract schema and tools" -version = "1.0.0-dev.2" +version = "1.0.0-dev.3" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/dpns-contract/package.json b/packages/dpns-contract/package.json index a4dd06efd7..6443f17ec1 100644 --- a/packages/dpns-contract/package.json +++ b/packages/dpns-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dpns-contract", - "version": "1.0.0-dev.2", + "version": "1.0.0-dev.3", "description": "A contract and helper scripts for DPNS DApp", "scripts": { "lint": "eslint .", diff --git a/packages/feature-flags-contract/Cargo.toml b/packages/feature-flags-contract/Cargo.toml index ef68a32211..d7fc4fcabf 100644 --- a/packages/feature-flags-contract/Cargo.toml +++ b/packages/feature-flags-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "feature-flags-contract" description = "Feature flags data contract schema and tools" -version = "1.0.0-dev.2" +version = "1.0.0-dev.3" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/feature-flags-contract/package.json b/packages/feature-flags-contract/package.json index 330322b579..016df4eed2 100644 --- a/packages/feature-flags-contract/package.json +++ b/packages/feature-flags-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/feature-flags-contract", - "version": "1.0.0-dev.2", + "version": "1.0.0-dev.3", "description": "Data Contract to store Dash Platform feature flags", "scripts": { "build": "", diff --git a/packages/js-dapi-client/package.json b/packages/js-dapi-client/package.json index d5b3e22bf3..7567d81fa9 100644 --- a/packages/js-dapi-client/package.json +++ b/packages/js-dapi-client/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-client", - "version": "1.0.0-dev.2", + "version": "1.0.0-dev.3", "description": "Client library used to access Dash DAPI endpoints", "main": "lib/index.js", "contributors": [ diff --git a/packages/js-dash-sdk/package.json b/packages/js-dash-sdk/package.json index 3260ec9db1..78da9c3cb8 100644 --- a/packages/js-dash-sdk/package.json +++ b/packages/js-dash-sdk/package.json @@ -1,6 +1,6 @@ { "name": "dash", - "version": "4.0.0-dev.2", + "version": "4.0.0-dev.3", "description": "Dash library for JavaScript/TypeScript ecosystem (Wallet, DAPI, Primitives, BLS, ...)", "main": "build/index.js", "unpkg": "dist/dash.min.js", diff --git a/packages/js-grpc-common/package.json b/packages/js-grpc-common/package.json index e1d049a8d1..1c5851b75b 100644 --- a/packages/js-grpc-common/package.json +++ b/packages/js-grpc-common/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/grpc-common", - "version": "1.0.0-dev.2", + "version": "1.0.0-dev.3", "description": "Common GRPC library", "main": "index.js", "scripts": { diff --git a/packages/masternode-reward-shares-contract/Cargo.toml b/packages/masternode-reward-shares-contract/Cargo.toml index 20dadf5b9a..29a0bc1851 100644 --- a/packages/masternode-reward-shares-contract/Cargo.toml +++ b/packages/masternode-reward-shares-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "masternode-reward-shares-contract" description = "Masternode reward shares data contract schema and tools" -version = "1.0.0-dev.2" +version = "1.0.0-dev.3" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/masternode-reward-shares-contract/package.json b/packages/masternode-reward-shares-contract/package.json index 7651875a14..940d19628c 100644 --- a/packages/masternode-reward-shares-contract/package.json +++ b/packages/masternode-reward-shares-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/masternode-reward-shares-contract", - "version": "1.0.0-dev.2", + "version": "1.0.0-dev.3", "description": "A contract and helper scripts for reward sharing", "scripts": { "lint": "eslint .", diff --git a/packages/platform-test-suite/package.json b/packages/platform-test-suite/package.json index c39bc9f09d..d07d51f736 100644 --- a/packages/platform-test-suite/package.json +++ b/packages/platform-test-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/platform-test-suite", "private": true, - "version": "1.0.0-dev.2", + "version": "1.0.0-dev.3", "description": "Dash Network end-to-end tests", "scripts": { "test": "yarn exec bin/test.sh", diff --git a/packages/rs-dapi-client/Cargo.toml b/packages/rs-dapi-client/Cargo.toml index 667d639c19..ae68cf9d3e 100644 --- a/packages/rs-dapi-client/Cargo.toml +++ b/packages/rs-dapi-client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rs-dapi-client" -version = "1.0.0-dev.2" +version = "1.0.0-dev.3" edition = "2021" [features] diff --git a/packages/rs-dapi-grpc-macros/Cargo.toml b/packages/rs-dapi-grpc-macros/Cargo.toml index 4a424e125f..198feae727 100644 --- a/packages/rs-dapi-grpc-macros/Cargo.toml +++ b/packages/rs-dapi-grpc-macros/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc-macros" -version = "1.0.0-dev.2" +version = "1.0.0-dev.3" edition = "2021" description = "Macros used by dapi-grpc. Internal use only." diff --git a/packages/rs-dpp/Cargo.toml b/packages/rs-dpp/Cargo.toml index c61f252234..f952233c4d 100644 --- a/packages/rs-dpp/Cargo.toml +++ b/packages/rs-dpp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dpp" -version = "1.0.0-dev.2" +version = "1.0.0-dev.3" edition = "2021" rust-version = "1.73" authors = [ diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index 8e1c33f393..9d8657b555 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drive-abci" -version = "1.0.0-dev.2" +version = "1.0.0-dev.3" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/rs-drive-proof-verifier/Cargo.toml b/packages/rs-drive-proof-verifier/Cargo.toml index b2fb935605..ec67564352 100644 --- a/packages/rs-drive-proof-verifier/Cargo.toml +++ b/packages/rs-drive-proof-verifier/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drive-proof-verifier" -version = "1.0.0-dev.2" +version = "1.0.0-dev.3" edition = "2021" rust-version = "1.73" diff --git a/packages/rs-drive/Cargo.toml b/packages/rs-drive/Cargo.toml index b4305597bd..a0cda6ef57 100644 --- a/packages/rs-drive/Cargo.toml +++ b/packages/rs-drive/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "drive" description = "Dash drive built on top of GroveDB" -version = "1.0.0-dev.2" +version = "1.0.0-dev.3" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/rs-platform-serialization-derive/Cargo.toml b/packages/rs-platform-serialization-derive/Cargo.toml index 0bb3a2491f..01c46b7fbc 100644 --- a/packages/rs-platform-serialization-derive/Cargo.toml +++ b/packages/rs-platform-serialization-derive/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization-derive" authors = ["Samuel Westrich "] description = "Bincode serialization and deserialization derivations" -version = "1.0.0-dev.2" +version = "1.0.0-dev.3" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/rs-platform-serialization/Cargo.toml b/packages/rs-platform-serialization/Cargo.toml index 5621eae8e1..01efda7169 100644 --- a/packages/rs-platform-serialization/Cargo.toml +++ b/packages/rs-platform-serialization/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization" authors = ["Samuel Westrich "] description = "Bincode based serialization and deserialization" -version = "1.0.0-dev.2" +version = "1.0.0-dev.3" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/rs-platform-value-convertible/Cargo.toml b/packages/rs-platform-value-convertible/Cargo.toml index 7a5e0bec76..85da3f10c0 100644 --- a/packages/rs-platform-value-convertible/Cargo.toml +++ b/packages/rs-platform-value-convertible/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-value-convertible" authors = ["Samuel Westrich "] description = "Convertion to and from platform values" -version = "1.0.0-dev.2" +version = "1.0.0-dev.3" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/rs-platform-value/Cargo.toml b/packages/rs-platform-value/Cargo.toml index fbc905428a..f27e33cca8 100644 --- a/packages/rs-platform-value/Cargo.toml +++ b/packages/rs-platform-value/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-value" authors = ["Samuel Westrich "] description = "A simple value module" -version = "1.0.0-dev.2" +version = "1.0.0-dev.3" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/rs-platform-version/Cargo.toml b/packages/rs-platform-version/Cargo.toml index fd364e4067..456e152e88 100644 --- a/packages/rs-platform-version/Cargo.toml +++ b/packages/rs-platform-version/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-version" authors = ["Samuel Westrich "] description = "Bincode based serialization and deserialization" -version = "1.0.0-dev.2" +version = "1.0.0-dev.3" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/rs-platform-versioning/Cargo.toml b/packages/rs-platform-versioning/Cargo.toml index 6cba3925f7..fc197caa00 100644 --- a/packages/rs-platform-versioning/Cargo.toml +++ b/packages/rs-platform-versioning/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-versioning" authors = ["Samuel Westrich "] description = "Version derivation" -version = "1.0.0-dev.2" +version = "1.0.0-dev.3" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/rs-sdk/Cargo.toml b/packages/rs-sdk/Cargo.toml index b4e7f14f5a..0712383f30 100644 --- a/packages/rs-sdk/Cargo.toml +++ b/packages/rs-sdk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rs-sdk" -version = "1.0.0-dev.2" +version = "1.0.0-dev.3" edition = "2021" [dependencies] diff --git a/packages/simple-signer/Cargo.toml b/packages/simple-signer/Cargo.toml index f85b1fea9a..66abcd42f9 100644 --- a/packages/simple-signer/Cargo.toml +++ b/packages/simple-signer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "simple-signer" -version = "1.0.0-dev.2" +version = "1.0.0-dev.3" edition = "2021" rust-version = "1.73" diff --git a/packages/strategy-tests/Cargo.toml b/packages/strategy-tests/Cargo.toml index cd2c2d12f0..f78a30a8a0 100644 --- a/packages/strategy-tests/Cargo.toml +++ b/packages/strategy-tests/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "strategy-tests" -version = "1.0.0-dev.2" +version = "1.0.0-dev.3" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/wallet-lib/package.json b/packages/wallet-lib/package.json index 4133520d7c..4795d04676 100644 --- a/packages/wallet-lib/package.json +++ b/packages/wallet-lib/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wallet-lib", - "version": "8.0.0-dev.2", + "version": "8.0.0-dev.3", "description": "Light wallet library for Dash", "main": "src/index.js", "unpkg": "dist/wallet-lib.min.js", diff --git a/packages/wasm-dpp/Cargo.toml b/packages/wasm-dpp/Cargo.toml index aa3005a7e2..fccb89012e 100644 --- a/packages/wasm-dpp/Cargo.toml +++ b/packages/wasm-dpp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasm-dpp" -version = "1.0.0-dev.2" +version = "1.0.0-dev.3" edition = "2021" rust-version = "1.73" authors = ["Anton Suprunchuk "] diff --git a/packages/wasm-dpp/package.json b/packages/wasm-dpp/package.json index a04693fc36..7dd92cab9c 100644 --- a/packages/wasm-dpp/package.json +++ b/packages/wasm-dpp/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wasm-dpp", - "version": "1.0.0-dev.2", + "version": "1.0.0-dev.3", "description": "The JavaScript implementation of the Dash Platform Protocol", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/withdrawals-contract/Cargo.toml b/packages/withdrawals-contract/Cargo.toml index acdc459cba..c0e4c43fa9 100644 --- a/packages/withdrawals-contract/Cargo.toml +++ b/packages/withdrawals-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "withdrawals-contract" description = "Witdrawals data contract schema and tools" -version = "1.0.0-dev.2" +version = "1.0.0-dev.3" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/withdrawals-contract/package.json b/packages/withdrawals-contract/package.json index c61769093d..b5b7b083c1 100644 --- a/packages/withdrawals-contract/package.json +++ b/packages/withdrawals-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/withdrawals-contract", - "version": "1.0.0-dev.2", + "version": "1.0.0-dev.3", "description": "Data Contract to manipulate and track withdrawals", "scripts": { "build": "", From f8c88f3f19aa2fdc38f8dc5b1fc18aa9b7c436f8 Mon Sep 17 00:00:00 2001 From: Igor Markin Date: Tue, 23 Jan 2024 12:28:09 +0000 Subject: [PATCH 019/191] chore(dashmate): update to core v20.1.0-devpr5806.a1814ce2 (#1665) --- .../configs/defaults/getBaseConfigFactory.js | 2 +- packages/dashmate/src/constants.js | 2 ++ .../setup/local/enableCoreQuorumsTaskFactory.js | 12 +++++------- packages/dashmate/templates/core/dash.conf.dot | 1 - 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/packages/dashmate/configs/defaults/getBaseConfigFactory.js b/packages/dashmate/configs/defaults/getBaseConfigFactory.js index f8645fa8eb..2339a592cd 100644 --- a/packages/dashmate/configs/defaults/getBaseConfigFactory.js +++ b/packages/dashmate/configs/defaults/getBaseConfigFactory.js @@ -72,7 +72,7 @@ export default function getBaseConfigFactory(homeDir) { port: 3001, }, docker: { - image: 'dashpay/dashd:20', commandArgs: [], + image: 'dashpay/dashd:20.1.0-devpr5806.a1814ce2', commandArgs: [], }, p2p: { host: '0.0.0.0', diff --git a/packages/dashmate/src/constants.js b/packages/dashmate/src/constants.js index b7f7e7c464..35b8707b9a 100644 --- a/packages/dashmate/src/constants.js +++ b/packages/dashmate/src/constants.js @@ -28,9 +28,11 @@ export const NODE_TYPE_MASTERNODE = 'masternode'; export const NODE_TYPE_FULLNODE = 'fullnode'; export const LLMQ_TYPE_TEST = 'llmq_test'; +export const LLMQ_TYPE_TEST_PLATFORM = 'llmq_test_platform'; export const QUORUM_TYPES = { LLMQ_TYPE_TEST: 100, + LLMQ_TYPE_TEST_PLATFORM: 106, }; export const MASTERNODE_COLLATERAL_AMOUNT = 1000; diff --git a/packages/dashmate/src/listr/tasks/setup/local/enableCoreQuorumsTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/local/enableCoreQuorumsTaskFactory.js index 78d7c11788..9dd3f68699 100644 --- a/packages/dashmate/src/listr/tasks/setup/local/enableCoreQuorumsTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/local/enableCoreQuorumsTaskFactory.js @@ -1,15 +1,11 @@ import { Listr } from 'listr2'; -import lodash from 'lodash'; -import { LLMQ_TYPE_TEST, NETWORK_LOCAL } from '../../../../constants.js'; +import { LLMQ_TYPE_TEST_PLATFORM, NETWORK_LOCAL } from '../../../../constants.js'; import waitForNodesToHaveTheSameHeight from '../../../../core/waitForNodesToHaveTheSameHeight.js'; import waitForQuorumPhase from '../../../../core/quorum/waitForQuorumPhase.js'; import waitForQuorumConnections from '../../../../core/quorum/waitForQuorumConnections.js'; import waitForQuorumCommitments from '../../../../core/quorum/waitForQuorumCommitements.js'; import wait from '../../../../util/wait.js'; import waitForMasternodeProbes from '../../../../core/quorum/waitForMasternodeProbes.js'; - -const { isEqual } = lodash; - /** * @param {generateBlocks} generateBlocks * @return {enableCoreQuorumsTask} @@ -245,8 +241,9 @@ export default function enableCoreQuorumsTaskFactory(generateBlocks) { ); let { result: newQuorumList } = await ctx.seedRpcClient.quorum('list'); + let testPlatformQuorumEnabled = !!newQuorumList[LLMQ_TYPE_TEST_PLATFORM][0]; - while (isEqual(ctx.initialQuorumList, newQuorumList)) { + while (!testPlatformQuorumEnabled) { await wait(300); await ctx.bumpMockTime(); @@ -263,12 +260,13 @@ export default function enableCoreQuorumsTaskFactory(generateBlocks) { ); ({ result: newQuorumList } = await ctx.seedRpcClient.quorum('list')); + testPlatformQuorumEnabled = !!newQuorumList[LLMQ_TYPE_TEST_PLATFORM][0]; } const { result: quorumList } = await ctx.seedRpcClient.quorum('list', 1); // eslint-disable-next-line prefer-destructuring - ctx.quorumHash = quorumList[LLMQ_TYPE_TEST][0]; + ctx.quorumHash = quorumList[LLMQ_TYPE_TEST_PLATFORM][0]; const llmqType = ctx.masternodeCoreServices[0].getConfig().get('platform.drive.abci.validatorSet.llmqType'); diff --git a/packages/dashmate/templates/core/dash.conf.dot b/packages/dashmate/templates/core/dash.conf.dot index 3907b248d8..08885afa6c 100644 --- a/packages/dashmate/templates/core/dash.conf.dot +++ b/packages/dashmate/templates/core/dash.conf.dot @@ -69,7 +69,6 @@ regtest=1 {{? it.core.spork.address}}sporkaddr={{=it.core.spork.address}}{{?}} {{? it.core.spork.privateKey}}sporkkey={{=it.core.spork.privateKey}}{{?}} {{? it.core.miner.mediantime}}mocktime={{=it.core.miner.mediantime}}{{?}} -llmqtestinstantsend=llmq_test llmqtestinstantsenddip0024=llmq_test_instantsend {{?? it.network === 'devnet'}} From 30929ea6ff8fd64cadb1352b7b0dc7f68d4ed37f Mon Sep 17 00:00:00 2001 From: Igor Markin Date: Tue, 23 Jan 2024 14:33:10 +0000 Subject: [PATCH 020/191] feat(drive): validate asset lock proof minimal value (#1667) Co-authored-by: QuantumExplorer --- .../platform-test-suite/test/e2e/dpns.spec.js | 2 +- .../test/functional/platform/Identity.spec.js | 19 +++++++- packages/rs-dpp/src/errors/consensus/codes.rs | 1 + .../invalid_asset_lock_proof_value.rs | 43 +++++++++++++++++++ .../errors/consensus/state/identity/mod.rs | 1 + .../src/errors/consensus/state/state_error.rs | 4 ++ .../identity_create_transition/mod.rs | 22 ++++++++++ .../identity/identity_topup_transition/mod.rs | 22 ++++++++++ .../v0/mod.rs | 1 - .../identity_create/state/v0/mod.rs | 8 ++++ .../identity_top_up/state/v0/mod.rs | 8 ++++ .../src/version/dpp_versions.rs | 1 + .../src/version/mocks/v2_test.rs | 1 + .../src/version/mocks/v3_test.rs | 1 + .../rs-platform-version/src/version/v1.rs | 1 + .../invalid_asset_lock_proof_value_error.rs | 39 +++++++++++++++++ .../errors/consensus/basic/identity/mod.rs | 2 + .../src/errors/consensus/consensus_error.rs | 5 ++- 18 files changed, 177 insertions(+), 4 deletions(-) create mode 100644 packages/rs-dpp/src/errors/consensus/state/identity/invalid_asset_lock_proof_value.rs create mode 100644 packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_asset_lock_proof_value_error.rs diff --git a/packages/platform-test-suite/test/e2e/dpns.spec.js b/packages/platform-test-suite/test/e2e/dpns.spec.js index e8cc3218a4..f5146dfc55 100644 --- a/packages/platform-test-suite/test/e2e/dpns.spec.js +++ b/packages/platform-test-suite/test/e2e/dpns.spec.js @@ -67,7 +67,7 @@ describe('DPNS', () => { identity = await ownerClient.platform.identities.get(dpnsOwnerId); expect(identity).to.exist(); - await ownerClient.platform.identities.topUp(dpnsOwnerId, 500); + await ownerClient.platform.identities.topUp(dpnsOwnerId, 1000); }); after(async () => { diff --git a/packages/platform-test-suite/test/functional/platform/Identity.spec.js b/packages/platform-test-suite/test/functional/platform/Identity.spec.js index 3a1bf18e5a..d3c4c4378f 100644 --- a/packages/platform-test-suite/test/functional/platform/Identity.spec.js +++ b/packages/platform-test-suite/test/functional/platform/Identity.spec.js @@ -22,6 +22,7 @@ const { Identifier, IdentityPublicKey, InvalidInstantAssetLockProofSignatureError, + InvalidAssetLockProofValueError, IdentityAssetLockTransactionOutPointAlreadyExistsError, BasicECDSAError, IdentityPublicKeyWithWitness, @@ -55,6 +56,22 @@ describe('Platform', () => { expect(identity).to.exist(); }); + it('should fail to create an identity if asset lock amount is less than minimal', async () => { + let broadcastError; + + try { + await client.platform.identities.register(117000); + } catch (e) { + broadcastError = e; + } + + expect(broadcastError).to.be.an.instanceOf(StateTransitionBroadcastError); + expect(broadcastError.getCause().getCode()).to.equal(4028); + expect(broadcastError.getCause()).to.be.an.instanceOf( + InvalidAssetLockProofValueError, + ); + }); + it('should fail to create an identity if instantLock is not valid', async () => { await client.platform.initialize(); @@ -440,7 +457,7 @@ describe('Platform', () => { transaction, privateKey, outputIndex, - } = await client.platform.identities.utils.createAssetLockTransaction(1); + } = await client.platform.identities.utils.createAssetLockTransaction(1000); const account = await client.getWalletAccount(); diff --git a/packages/rs-dpp/src/errors/consensus/codes.rs b/packages/rs-dpp/src/errors/consensus/codes.rs index ea032c311b..16ba3bd862 100644 --- a/packages/rs-dpp/src/errors/consensus/codes.rs +++ b/packages/rs-dpp/src/errors/consensus/codes.rs @@ -177,6 +177,7 @@ impl ErrorWithCode for StateError { Self::MissingIdentityPublicKeyIdsError { .. } => 4024, Self::IdentityInsufficientBalanceError(_) => 4026, Self::IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError(_) => 4027, + Self::InvalidAssetLockProofValueError(_) => 4028, } } } diff --git a/packages/rs-dpp/src/errors/consensus/state/identity/invalid_asset_lock_proof_value.rs b/packages/rs-dpp/src/errors/consensus/state/identity/invalid_asset_lock_proof_value.rs new file mode 100644 index 0000000000..9e4326620b --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/state/identity/invalid_asset_lock_proof_value.rs @@ -0,0 +1,43 @@ +use crate::errors::ProtocolError; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use thiserror::Error; + +use crate::consensus::ConsensusError; + +use crate::consensus::state::state_error::StateError; +use bincode::{Decode, Encode}; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error("Asset lock value {value:?} must be higher than minimal value of {min_value:?}")] +#[platform_serialize(unversioned)] +pub struct InvalidAssetLockProofValueError { + /* + + DO NOT CHANGE ORDER OF FIELDS WITHOUT INTRODUCING OF NEW VERSION + + */ + value: u64, + min_value: u64, +} + +impl InvalidAssetLockProofValueError { + pub fn new(value: u64, min_value: u64) -> Self { + Self { value, min_value } + } + + pub fn value(&self) -> u64 { + self.value + } + + pub fn min_value(&self) -> u64 { + self.min_value + } +} + +impl From for ConsensusError { + fn from(err: InvalidAssetLockProofValueError) -> Self { + Self::StateError(StateError::InvalidAssetLockProofValueError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/state/identity/mod.rs b/packages/rs-dpp/src/errors/consensus/state/identity/mod.rs index 01ec04bb52..0aaa101f6c 100644 --- a/packages/rs-dpp/src/errors/consensus/state/identity/mod.rs +++ b/packages/rs-dpp/src/errors/consensus/state/identity/mod.rs @@ -9,6 +9,7 @@ pub mod identity_public_key_already_exists_for_unique_contract_bounds_error; pub mod identity_public_key_disabled_at_window_violation_error; pub mod identity_public_key_is_disabled_error; pub mod identity_public_key_is_read_only_error; +pub mod invalid_asset_lock_proof_value; pub mod invalid_identity_public_key_id_error; pub mod invalid_identity_revision_error; pub mod max_identity_public_key_limit_reached_error; diff --git a/packages/rs-dpp/src/errors/consensus/state/state_error.rs b/packages/rs-dpp/src/errors/consensus/state/state_error.rs index 4098b85042..d79f5656e8 100644 --- a/packages/rs-dpp/src/errors/consensus/state/state_error.rs +++ b/packages/rs-dpp/src/errors/consensus/state/state_error.rs @@ -29,6 +29,7 @@ use crate::consensus::state::identity::{ }; use crate::consensus::ConsensusError; use crate::consensus::state::identity::identity_public_key_already_exists_for_unique_contract_bounds_error::IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError; +use crate::consensus::state::identity::invalid_asset_lock_proof_value::InvalidAssetLockProofValueError; use super::document::document_timestamps_are_equal_error::DocumentTimestampsAreEqualError; @@ -85,6 +86,9 @@ pub enum StateError { #[error(transparent)] IdentityPublicKeyIsReadOnlyError(IdentityPublicKeyIsReadOnlyError), + #[error(transparent)] + InvalidAssetLockProofValueError(InvalidAssetLockProofValueError), + #[error(transparent)] MissingIdentityPublicKeyIdsError(MissingIdentityPublicKeyIdsError), diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/mod.rs index 91aab6d499..15cd5a6ef4 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/mod.rs @@ -68,6 +68,23 @@ impl IdentityCreateTransition { }), } } + + pub fn get_minimal_asset_lock_value( + platform_version: &PlatformVersion, + ) -> Result { + match platform_version + .dpp + .state_transitions + .identities + .asset_locks + .minimal_asset_lock_value + { + 0 => Ok(MinimalAssetLockValue::V0 as u64), + v => Err(ProtocolError::UnknownVersionError(format!( + "Unknown IdentityCreateTransition version for minimal_asset_lock_value {v}" + ))), + } + } } impl StateTransitionFieldTypes for IdentityCreateTransition { @@ -83,3 +100,8 @@ impl StateTransitionFieldTypes for IdentityCreateTransition { vec![] } } + +#[repr(u64)] +pub enum MinimalAssetLockValue { + V0 = 120000, +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/mod.rs index 21f72678d8..fb009a867e 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/mod.rs @@ -67,6 +67,23 @@ impl IdentityTopUpTransition { }), } } + + pub fn get_minimal_asset_lock_value( + platform_version: &PlatformVersion, + ) -> Result { + match platform_version + .dpp + .state_transitions + .identities + .asset_locks + .minimal_asset_lock_value + { + 0 => Ok(MinimalAssetLockValue::V0 as u64), + v => Err(ProtocolError::UnknownVersionError(format!( + "Unknown IdentityTopUpTransition version for minimal_asset_lock_value {v}" + ))), + } + } } impl StateTransitionFieldTypes for IdentityTopUpTransition { @@ -82,3 +99,8 @@ impl StateTransitionFieldTypes for IdentityTopUpTransition { vec![] } } + +#[repr(u64)] +enum MinimalAssetLockValue { + V0 = 1000, +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/transaction/fetch_asset_lock_transaction_output_sync/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/transaction/fetch_asset_lock_transaction_output_sync/v0/mod.rs index d4e70a394e..2e3e1de1f1 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/transaction/fetch_asset_lock_transaction_output_sync/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/transaction/fetch_asset_lock_transaction_output_sync/v0/mod.rs @@ -114,7 +114,6 @@ pub fn fetch_asset_lock_transaction_output_sync_v0( // We are dealing with old Rust edition so we can't use optional remove if payload.credit_outputs.get(output_index as usize).is_some() { let output = payload.credit_outputs.remove(output_index as usize); - return Ok(ValidationResult::new_with_data(output)); } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/state/v0/mod.rs index ef090ac682..04e89cb367 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/state/v0/mod.rs @@ -3,6 +3,7 @@ use crate::platform_types::platform::PlatformRef; use crate::rpc::core::CoreRPCLike; use dpp::consensus::signature::{BasicECDSAError, SignatureError}; +use dpp::consensus::state::identity::invalid_asset_lock_proof_value::InvalidAssetLockProofValueError; use dpp::consensus::state::identity::IdentityAlreadyExistsError; use dpp::dashcore::signer; use dpp::dashcore::signer::double_sha; @@ -12,6 +13,7 @@ use dpp::identity::state_transition::AssetLockProved; use dpp::prelude::ConsensusValidationResult; use dpp::serialization::Signable; use dpp::state_transition::identity_create_transition::accessors::IdentityCreateTransitionAccessorsV0; +use dpp::state_transition::identity_create_transition::methods::IdentityCreateTransitionMethodsV0; use dpp::state_transition::identity_create_transition::IdentityCreateTransition; use dpp::state_transition::{StateTransition, StateTransitionLike}; @@ -125,6 +127,12 @@ impl IdentityCreateStateTransitionStateValidationV0 for IdentityCreateTransition } let tx_out = tx_out_validation.into_data()?; + let min_value = IdentityCreateTransition::get_minimal_asset_lock_value(platform_version)?; + if tx_out.value < min_value { + return Ok(ConsensusValidationResult::new_with_error( + InvalidAssetLockProofValueError::new(tx_out.value, min_value).into(), + )); + } // Verify one time signature diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/state/v0/mod.rs index 66ece6b365..a78c072465 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/state/v0/mod.rs @@ -3,6 +3,7 @@ use crate::platform_types::platform::PlatformRef; use crate::rpc::core::CoreRPCLike; use dpp::consensus::signature::{BasicECDSAError, SignatureError}; +use dpp::consensus::state::identity::invalid_asset_lock_proof_value::InvalidAssetLockProofValueError; use dpp::dashcore::signer; use dpp::dashcore::signer::double_sha; use dpp::identity::state_transition::AssetLockProved; @@ -10,6 +11,7 @@ use dpp::identity::KeyType; use dpp::prelude::ConsensusValidationResult; use dpp::serialization::Signable; +use dpp::state_transition::identity_topup_transition::methods::IdentityTopUpTransitionMethodsV0; use dpp::state_transition::identity_topup_transition::IdentityTopUpTransition; use dpp::state_transition::{StateTransition, StateTransitionLike}; @@ -88,6 +90,12 @@ impl IdentityTopUpStateTransitionStateValidationV0 for IdentityTopUpTransition { } let tx_out = tx_out_validation.into_data()?; + let min_value = IdentityTopUpTransition::get_minimal_asset_lock_value(platform_version)?; + if tx_out.value < min_value { + return Ok(ConsensusValidationResult::new_with_error( + InvalidAssetLockProofValueError::new(tx_out.value, min_value).into(), + )); + } // Verify one time signature diff --git a/packages/rs-platform-version/src/version/dpp_versions.rs b/packages/rs-platform-version/src/version/dpp_versions.rs index 6c271f17f2..dd3999be5c 100644 --- a/packages/rs-platform-version/src/version/dpp_versions.rs +++ b/packages/rs-platform-version/src/version/dpp_versions.rs @@ -29,6 +29,7 @@ pub struct IdentityTransitionVersions { pub struct IdentityTransitionAssetLockVersions { pub validate_asset_lock_transaction_structure: FeatureVersion, pub validate_instant_asset_lock_proof_structure: FeatureVersion, + pub minimal_asset_lock_value: FeatureVersion, } #[derive(Clone, Debug, Default)] diff --git a/packages/rs-platform-version/src/version/mocks/v2_test.rs b/packages/rs-platform-version/src/version/mocks/v2_test.rs index a1a8d82143..3d9e442214 100644 --- a/packages/rs-platform-version/src/version/mocks/v2_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v2_test.rs @@ -827,6 +827,7 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { asset_locks: IdentityTransitionAssetLockVersions { validate_asset_lock_transaction_structure: 0, validate_instant_asset_lock_proof_structure: 0, + minimal_asset_lock_value: 0, }, }, }, diff --git a/packages/rs-platform-version/src/version/mocks/v3_test.rs b/packages/rs-platform-version/src/version/mocks/v3_test.rs index 4a87ecde42..da4bde1154 100644 --- a/packages/rs-platform-version/src/version/mocks/v3_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v3_test.rs @@ -827,6 +827,7 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { asset_locks: IdentityTransitionAssetLockVersions { validate_asset_lock_transaction_structure: 0, validate_instant_asset_lock_proof_structure: 0, + minimal_asset_lock_value: 0, }, }, }, diff --git a/packages/rs-platform-version/src/version/v1.rs b/packages/rs-platform-version/src/version/v1.rs index cc0fc782c6..8ffb8fddb1 100644 --- a/packages/rs-platform-version/src/version/v1.rs +++ b/packages/rs-platform-version/src/version/v1.rs @@ -824,6 +824,7 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { asset_locks: IdentityTransitionAssetLockVersions { validate_asset_lock_transaction_structure: 0, validate_instant_asset_lock_proof_structure: 0, + minimal_asset_lock_value: 0, }, }, }, diff --git a/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_asset_lock_proof_value_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_asset_lock_proof_value_error.rs new file mode 100644 index 0000000000..18fbfb1436 --- /dev/null +++ b/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_asset_lock_proof_value_error.rs @@ -0,0 +1,39 @@ +use dpp::consensus::codes::ErrorWithCode; +use dpp::consensus::ConsensusError; + +use dpp::consensus::state::identity::invalid_asset_lock_proof_value::InvalidAssetLockProofValueError; +use wasm_bindgen::prelude::*; + +#[wasm_bindgen(js_name=InvalidAssetLockProofValueError)] +pub struct InvalidAssetLockProofValueErrorWasm { + inner: InvalidAssetLockProofValueError, +} + +impl From<&InvalidAssetLockProofValueError> for InvalidAssetLockProofValueErrorWasm { + fn from(e: &InvalidAssetLockProofValueError) -> Self { + Self { inner: e.clone() } + } +} + +#[wasm_bindgen(js_class=InvalidAssetLockProofValueError)] +impl InvalidAssetLockProofValueErrorWasm { + #[wasm_bindgen(js_name=getValue)] + pub fn value(&self) -> u64 { + self.inner.value() + } + + #[wasm_bindgen(js_name=getMinValue)] + pub fn min_value(&self) -> u64 { + self.inner.min_value() + } + + #[wasm_bindgen(js_name=getCode)] + pub fn get_code(&self) -> u32 { + ConsensusError::from(self.inner.clone()).code() + } + + #[wasm_bindgen(getter)] + pub fn message(&self) -> String { + self.inner.to_string() + } +} diff --git a/packages/wasm-dpp/src/errors/consensus/basic/identity/mod.rs b/packages/wasm-dpp/src/errors/consensus/basic/identity/mod.rs index 87dfbdc1ba..dc1a57edc2 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/identity/mod.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/identity/mod.rs @@ -8,6 +8,7 @@ mod identity_credit_transfer_to_self_error; mod identity_insufficient_balance_error; mod invalid_asset_lock_proof_core_chain_height_error; mod invalid_asset_lock_proof_transaction_height_error; +mod invalid_asset_lock_proof_value_error; mod invalid_asset_lock_transaction_output_return_size_error; mod invalid_identity_asset_lock_proof_chain_lock_validation_error; mod invalid_identity_asset_lock_transaction_error; @@ -34,6 +35,7 @@ pub use identity_credit_transfer_to_self_error::*; pub use identity_insufficient_balance_error::*; pub use invalid_asset_lock_proof_core_chain_height_error::*; pub use invalid_asset_lock_proof_transaction_height_error::*; +pub use invalid_asset_lock_proof_value_error::*; pub use invalid_asset_lock_transaction_output_return_size_error::*; pub use invalid_identity_asset_lock_proof_chain_lock_validation_error::*; pub use invalid_identity_asset_lock_transaction_error::*; diff --git a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs index 2e88186f20..b2e514a294 100644 --- a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs @@ -12,7 +12,7 @@ use crate::errors::consensus::basic::identity::{ IdentityAssetLockTransactionOutPointAlreadyExistsErrorWasm, IdentityAssetLockTransactionOutputNotFoundErrorWasm, IdentityCreditTransferToSelfErrorWasm, IdentityInsufficientBalanceErrorWasm, InvalidAssetLockProofCoreChainHeightErrorWasm, - InvalidAssetLockProofTransactionHeightErrorWasm, + InvalidAssetLockProofTransactionHeightErrorWasm, InvalidAssetLockProofValueErrorWasm, InvalidAssetLockTransactionOutputReturnSizeErrorWasm, InvalidIdentityAssetLockProofChainLockValidationErrorWasm, InvalidIdentityAssetLockTransactionErrorWasm, @@ -215,6 +215,9 @@ pub fn from_state_error(state_error: &StateError) -> JsValue { StateError::DataContractConfigUpdateError(e) => { DataContractConfigUpdateErrorWasm::from(e).into() } + StateError::InvalidAssetLockProofValueError(e) => { + InvalidAssetLockProofValueErrorWasm::from(e).into() + } // TODO(versioning): restore _ => todo!(), } From 26e775ffcb49fd6d04453a21b08c677dd0e74e47 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Fri, 26 Jan 2024 16:57:57 +0300 Subject: [PATCH 021/191] fix(drive): invalid protocol version is using to deserialize state (#1679) --- .../src/abci/handler/execution_result.rs | 7 +- .../initialization/init_chain/v0/mod.rs | 8 ++ packages/rs-drive-abci/src/execution/mod.rs | 2 + .../platform_events/block_end/mod.rs | 2 - .../block_end/store_ephemeral_state/mod.rs | 53 ------------- .../block_end/store_ephemeral_state/v0/mod.rs | 51 ------------ .../block_end/update_state_cache/v0/mod.rs | 8 +- .../storage/fetch_platform_state/mod.rs | 32 ++++++++ .../storage/fetch_platform_state/v0/mod.rs | 24 ++++++ .../src/execution/storage/mod.rs | 5 ++ .../storage/store_platform_state/mod.rs | 32 ++++++++ .../storage/store_platform_state/v0/mod.rs | 19 +++++ packages/rs-drive-abci/src/main.rs | 4 +- .../v0/mod.rs | 14 ++++ .../src/platform_types/platform/mod.rs | 77 ++++++++---------- .../src/platform_types/platform_state/mod.rs | 46 ++++------- .../platform_types/platform_state/v0/mod.rs | 3 +- .../rs-drive-abci/src/test/fixture/abci.rs | 15 +++- .../tests/strategy_tests/execution.rs | 2 +- .../tests/strategy_tests/main.rs | 12 +-- .../rs-drive/src/drive/document/delete/mod.rs | 5 +- packages/rs-drive/src/drive/mod.rs | 2 + packages/rs-drive/src/drive/open/mod.rs | 8 +- .../fetch_platform_state_bytes/mod.rs | 30 +++++++ .../fetch_platform_state_bytes/v0/mod.rs | 16 ++++ .../rs-drive/src/drive/platform_state/mod.rs | 7 ++ .../store_platform_state_bytes/mod.rs | 31 ++++++++ .../store_platform_state_bytes/v0/mod.rs | 17 ++++ .../v0/mod.rs | 1 - ...d.rs => fetch_current_protocol_version.rs} | 26 ++++++- .../fetch_current_protocol_version/mod.rs | 44 ----------- .../src/drive/system/protocol_version/mod.rs | 4 +- .../mod.rs | 54 ------------- .../v0/mod.rs | 35 --------- .../store_current_protocol_version.rs | 78 +++++++++++++++++++ packages/rs-drive/src/query/mod.rs | 5 +- packages/rs-drive/src/tests/helpers/setup.rs | 5 +- .../src/version/drive_abci_versions.rs | 8 +- .../src/version/drive_versions.rs | 9 ++- .../src/version/mocks/v2_test.rs | 30 ++++--- .../src/version/mocks/v3_test.rs | 30 ++++--- .../rs-platform-version/src/version/v1.rs | 30 ++++--- 42 files changed, 497 insertions(+), 394 deletions(-) delete mode 100644 packages/rs-drive-abci/src/execution/platform_events/block_end/store_ephemeral_state/mod.rs delete mode 100644 packages/rs-drive-abci/src/execution/platform_events/block_end/store_ephemeral_state/v0/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/storage/fetch_platform_state/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/storage/fetch_platform_state/v0/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/storage/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/storage/store_platform_state/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/storage/store_platform_state/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/platform_state/fetch_platform_state_bytes/mod.rs create mode 100644 packages/rs-drive/src/drive/platform_state/fetch_platform_state_bytes/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/platform_state/mod.rs create mode 100644 packages/rs-drive/src/drive/platform_state/store_platform_state_bytes/mod.rs create mode 100644 packages/rs-drive/src/drive/platform_state/store_platform_state_bytes/v0/mod.rs rename packages/rs-drive/src/drive/system/protocol_version/{fetch_current_protocol_version/v0/mod.rs => fetch_current_protocol_version.rs} (64%) delete mode 100644 packages/rs-drive/src/drive/system/protocol_version/fetch_current_protocol_version/mod.rs delete mode 100644 packages/rs-drive/src/drive/system/protocol_version/set_current_protocol_version_operations/mod.rs delete mode 100644 packages/rs-drive/src/drive/system/protocol_version/set_current_protocol_version_operations/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/system/protocol_version/store_current_protocol_version.rs diff --git a/packages/rs-drive-abci/src/abci/handler/execution_result.rs b/packages/rs-drive-abci/src/abci/handler/execution_result.rs index e3b0c0ff2f..4f7b123017 100644 --- a/packages/rs-drive-abci/src/abci/handler/execution_result.rs +++ b/packages/rs-drive-abci/src/abci/handler/execution_result.rs @@ -1,14 +1,11 @@ use crate::abci::handler::error::consensus::AbciResponseInfoGetter; use crate::abci::handler::error::HandlerError; use crate::error::Error; -use crate::platform_types::state_transitions_processing_result::{ - StateTransitionExecutionResult, StateTransitionsProcessingResult, -}; +use crate::platform_types::state_transitions_processing_result::StateTransitionExecutionResult; use dpp::fee::SignedCredits; use dpp::version::PlatformVersion; use dpp::version::TryIntoPlatformVersioned; -use tenderdash_abci::proto::abci::tx_record::TxAction; -use tenderdash_abci::proto::abci::{ExecTxResult, TxRecord}; +use tenderdash_abci::proto::abci::ExecTxResult; impl TryIntoPlatformVersioned for StateTransitionExecutionResult { type Error = Error; diff --git a/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/v0/mod.rs b/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/v0/mod.rs index 7a585aa562..2aa68d7f04 100644 --- a/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/v0/mod.rs @@ -79,6 +79,14 @@ where state_guard.set_genesis_block_info(Some(genesis_block_info)); + state_guard.set_current_protocol_version_in_consensus(request.initial_protocol_version); + + self.drive.store_current_protocol_version( + request.initial_protocol_version, + Some(transaction), + &platform_version.drive, + )?; + if tracing::enabled!(tracing::Level::TRACE) { tracing::trace!( platform_state_fingerprint = hex::encode(state_guard.fingerprint()), diff --git a/packages/rs-drive-abci/src/execution/mod.rs b/packages/rs-drive-abci/src/execution/mod.rs index 4352caa571..0e4b73c3f0 100644 --- a/packages/rs-drive-abci/src/execution/mod.rs +++ b/packages/rs-drive-abci/src/execution/mod.rs @@ -4,6 +4,8 @@ mod check_tx; pub mod engine; /// platform execution events pub(in crate::execution) mod platform_events; +/// Storage implementation for the execution state +pub mod storage; /// Types needed in execution pub mod types; /// Validation module diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_end/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_end/mod.rs index ee3ad883d9..f881cea1dd 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/block_end/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/block_end/mod.rs @@ -1,5 +1,3 @@ -/// Storage of the ephemeral state -pub(in crate::execution) mod store_ephemeral_state; /// Updating the state cache happens as the final part of block finalization pub(in crate::execution) mod update_state_cache; /// Validator set update diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_end/store_ephemeral_state/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_end/store_ephemeral_state/mod.rs deleted file mode 100644 index bef276301d..0000000000 --- a/packages/rs-drive-abci/src/execution/platform_events/block_end/store_ephemeral_state/mod.rs +++ /dev/null @@ -1,53 +0,0 @@ -mod v0; - -use crate::error::execution::ExecutionError; -use crate::error::Error; -use crate::platform_types::platform::Platform; -use crate::platform_types::platform_state::PlatformState; -use crate::rpc::core::CoreRPCLike; - -use dpp::version::PlatformVersion; - -use drive::grovedb::Transaction; - -impl Platform -where - C: CoreRPCLike, -{ - /// Stores ephemeral state data, including the block information and quorum hash in GroveDB. - /// - /// This function is a version handler that directs to specific version implementations - /// of the store_ephemeral_state function. - /// - /// # Arguments - /// - /// * `platform_state` - A `PlatformState` reference. - /// * `transaction` - A `Transaction` reference. - /// * `platform_version` - A `PlatformVersion` reference that dictates which version of - /// the method to call. - /// - /// # Returns - /// - /// * `Result<(), Error>` - Returns an empty `Result` if the data is successfully stored, otherwise returns an `Error`. - /// - pub fn store_ephemeral_state( - &self, - platform_state: &PlatformState, - transaction: &Transaction, - platform_version: &PlatformVersion, - ) -> Result<(), Error> { - match platform_version - .drive_abci - .methods - .block_end - .store_ephemeral_state - { - 0 => self.store_ephemeral_state_v0(platform_state, transaction), - version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { - method: "store_ephemeral_state".to_string(), - known_versions: vec![0], - received: version, - })), - } - } -} diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_end/store_ephemeral_state/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_end/store_ephemeral_state/v0/mod.rs deleted file mode 100644 index 016b67d207..0000000000 --- a/packages/rs-drive-abci/src/execution/platform_events/block_end/store_ephemeral_state/v0/mod.rs +++ /dev/null @@ -1,51 +0,0 @@ -use crate::error::Error; -use crate::platform_types::platform::Platform; -use crate::rpc::core::CoreRPCLike; - -use crate::platform_types::platform_state::PlatformState; -use dpp::serialization::PlatformSerializable; - -use drive::error::Error::GroveDB; -use drive::grovedb::Transaction; - -impl Platform -where - C: CoreRPCLike, -{ - /// Stores ephemeral state data, including the block information and quorum hash in GroveDB. - /// - /// This function should be removed from the current location. - /// - /// # Arguments - /// - /// * `platform_state` - A `PlatformState` reference. - /// * `transaction` - A `Transaction` reference. - /// - /// # Returns - /// - /// * `Result<(), Error>` - Returns an empty `Result` if the data is successfully stored, otherwise returns an `Error`. - /// - pub(super) fn store_ephemeral_state_v0( - &self, - platform_state: &PlatformState, - transaction: &Transaction, - ) -> Result<(), Error> { - // we need to serialize the platform state - let serialized_platform_state = platform_state.serialize_to_bytes()?; - - // next we need to store this data in grovedb - //todo:: maybe this should be in actual state - self.drive - .grove - .put_aux( - b"saved_state", - &serialized_platform_state, - None, - Some(transaction), - ) - .unwrap() - .map_err(|e| Error::Drive(GroveDB(e)))?; - - Ok(()) - } -} diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_end/update_state_cache/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_end/update_state_cache/v0/mod.rs index 5803180c65..115f360179 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/block_end/update_state_cache/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/block_end/update_state_cache/v0/mod.rs @@ -61,10 +61,12 @@ where state_cache.set_genesis_block_info(None); //todo: verify this with an update - PlatformVersion::set_current(PlatformVersion::get(platform_version.protocol_version)?); + let version = PlatformVersion::get(platform_version.protocol_version)?; - // Persist ephemeral data - self.store_ephemeral_state(&state_cache, transaction, platform_version)?; + PlatformVersion::set_current(version); + + // Persist state cache + self.store_platform_state(&state_cache, Some(transaction), platform_version)?; Ok(()) } diff --git a/packages/rs-drive-abci/src/execution/storage/fetch_platform_state/mod.rs b/packages/rs-drive-abci/src/execution/storage/fetch_platform_state/mod.rs new file mode 100644 index 0000000000..f2537eca34 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/storage/fetch_platform_state/mod.rs @@ -0,0 +1,32 @@ +use crate::error::execution::ExecutionError; +use crate::error::Error; +use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; +use dpp::version::PlatformVersion; +use drive::drive::Drive; +use drive::query::TransactionArg; + +mod v0; + +impl Platform { + /// Fetches execution state from grovedb storage + pub fn fetch_platform_state( + drive: &Drive, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result, Error> { + match platform_version + .drive_abci + .methods + .platform_state_storage + .fetch_platform_state + { + 0 => Platform::::fetch_platform_state_v0(drive, transaction, platform_version), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "fetch_platform_state".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive-abci/src/execution/storage/fetch_platform_state/v0/mod.rs b/packages/rs-drive-abci/src/execution/storage/fetch_platform_state/v0/mod.rs new file mode 100644 index 0000000000..25960bf5b3 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/storage/fetch_platform_state/v0/mod.rs @@ -0,0 +1,24 @@ +use crate::error::Error; +use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; +use dpp::serialization::PlatformDeserializableFromVersionedStructure; +use dpp::version::PlatformVersion; +use drive::drive::Drive; +use drive::query::TransactionArg; + +impl Platform { + pub(super) fn fetch_platform_state_v0( + drive: &Drive, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result, Error> { + drive + .fetch_platform_state_bytes(transaction, platform_version) + .map_err(Error::Drive)? + .map(|bytes| { + PlatformState::versioned_deserialize(&bytes, platform_version) + .map_err(Error::Protocol) + }) + .transpose() + } +} diff --git a/packages/rs-drive-abci/src/execution/storage/mod.rs b/packages/rs-drive-abci/src/execution/storage/mod.rs new file mode 100644 index 0000000000..c45853e259 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/storage/mod.rs @@ -0,0 +1,5 @@ +mod fetch_platform_state; +mod store_platform_state; + +pub use fetch_platform_state::*; +pub use store_platform_state::*; diff --git a/packages/rs-drive-abci/src/execution/storage/store_platform_state/mod.rs b/packages/rs-drive-abci/src/execution/storage/store_platform_state/mod.rs new file mode 100644 index 0000000000..203b81d201 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/storage/store_platform_state/mod.rs @@ -0,0 +1,32 @@ +mod v0; + +use crate::error::execution::ExecutionError; +use crate::error::Error; +use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; +use dpp::version::PlatformVersion; +use drive::query::TransactionArg; + +impl Platform { + /// Store the execution state in grovedb storage + pub fn store_platform_state( + &self, + state: &PlatformState, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + match platform_version + .drive_abci + .methods + .platform_state_storage + .store_platform_state + { + 0 => self.store_platform_state_v0(state, transaction, platform_version), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "store_platform_state".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive-abci/src/execution/storage/store_platform_state/v0/mod.rs b/packages/rs-drive-abci/src/execution/storage/store_platform_state/v0/mod.rs new file mode 100644 index 0000000000..b41100eb47 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/storage/store_platform_state/v0/mod.rs @@ -0,0 +1,19 @@ +use crate::error::Error; +use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; +use dpp::serialization::PlatformSerializable; +use dpp::version::PlatformVersion; +use drive::query::TransactionArg; + +impl Platform { + pub(super) fn store_platform_state_v0( + &self, + state: &PlatformState, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + self.drive + .store_platform_state_bytes(&state.serialize_to_bytes()?, transaction, platform_version) + .map_err(Error::Drive) + } +} diff --git a/packages/rs-drive-abci/src/main.rs b/packages/rs-drive-abci/src/main.rs index 53876c3f33..dec4bc0a6e 100644 --- a/packages/rs-drive-abci/src/main.rs +++ b/packages/rs-drive-abci/src/main.rs @@ -372,9 +372,9 @@ mod test { let path = tempdir.join("db"); fs::create_dir(&path).expect("create db dir"); - let platform_version = PlatformVersion::latest(); + let drive = Drive::open(&path, None).expect("open drive"); - let drive = Drive::open(&path, None, platform_version).expect("open drive"); + let platform_version = PlatformVersion::latest(); drive .create_initial_state_structure(None, platform_version) diff --git a/packages/rs-drive-abci/src/platform_types/cleaned_abci_messages/request_init_chain_cleaned_params/v0/mod.rs b/packages/rs-drive-abci/src/platform_types/cleaned_abci_messages/request_init_chain_cleaned_params/v0/mod.rs index 6f6c0a5339..b82e36261d 100644 --- a/packages/rs-drive-abci/src/platform_types/cleaned_abci_messages/request_init_chain_cleaned_params/v0/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/cleaned_abci_messages/request_init_chain_cleaned_params/v0/mod.rs @@ -34,6 +34,7 @@ //! use crate::abci::AbciError; +use dpp::util::deserializer::ProtocolVersion; use drive::dpp::identity::TimestampMillis; use serde::{Deserialize, Serialize}; use tenderdash_abci::proto::abci::RequestInitChain; @@ -51,6 +52,9 @@ pub struct RequestInitChainCleanedParams { /// Initial core chain lock height. pub initial_core_height: Option, + + /// Initial protocol version + pub initial_protocol_version: ProtocolVersion, } impl TryFrom for RequestInitChainCleanedParams { @@ -67,10 +71,20 @@ impl TryFrom for RequestInitChainCleanedParams { h => Some(h), }; + let consensus_params = request.consensus_params.ok_or(AbciError::BadRequest( + "consensus params are required in init chain".to_string(), + ))?; + + let tenderdash_abci::proto::types::VersionParams { app_version } = + consensus_params.version.ok_or(AbciError::BadRequest( + "consensus params version is required in init chain".to_string(), + ))?; + Ok(Self { genesis_time, initial_height: request.initial_height as u64, initial_core_height, + initial_protocol_version: app_version as ProtocolVersion, }) } } diff --git a/packages/rs-drive-abci/src/platform_types/platform/mod.rs b/packages/rs-drive-abci/src/platform_types/platform/mod.rs index c1519be922..619c02bd0e 100644 --- a/packages/rs-drive-abci/src/platform_types/platform/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/platform/mod.rs @@ -18,9 +18,7 @@ use crate::execution::types::block_execution_context::BlockExecutionContext; use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::platform_types::platform_state::PlatformState; use dpp::block::block_info::BlockInfo; -use dpp::serialization::PlatformDeserializable; use dpp::version::{PlatformVersion, PlatformVersionCurrentVersion}; -use drive::error::Error::GroveDB; use serde_json::json; /// Platform is not versioned as it holds the main logic, we could not switch from one structure @@ -93,8 +91,8 @@ impl<'a, C> From<&PlatformRef<'a, C>> for PlatformStateRef<'a> { } } -impl std::fmt::Debug for Platform { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { +impl Debug for Platform { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { f.debug_struct("Platform").finish() } } @@ -144,27 +142,24 @@ impl Platform { Self::open_with_client(path, config, core_rpc_mock) } - /// Recreate the state from the backing store - pub fn recreate_state(&self, _platform_version: &PlatformVersion) -> Result { - let Some(serialized_platform_state) = self - .drive - .grove - .get_aux(b"saved_state", None) - .unwrap() - .map_err(|e| Error::Drive(GroveDB(e)))? + /// Fetch and reload the state from the backing store + pub fn reload_state_from_storage( + &self, + platform_version: &PlatformVersion, + ) -> Result { + let Some(persisted_state) = + Platform::::fetch_platform_state(&self.drive, None, platform_version)? else { return Ok(false); }; - let recreated_state = - PlatformState::deserialize_from_bytes_no_limit(&serialized_platform_state)?; - PlatformVersion::set_current(PlatformVersion::get( - recreated_state.current_protocol_version_in_consensus(), + persisted_state.current_protocol_version_in_consensus(), )?); let mut state_cache = self.state.write().unwrap(); - *state_cache = recreated_state; + *state_cache = persisted_state; + Ok(true) } } @@ -181,35 +176,34 @@ impl Platform { { let config = config.unwrap_or_default(); - // TODO: Replace with version from the disk if present or latest? - let platform_version = PlatformVersion::latest(); + let drive = Drive::open(path, Some(config.drive.clone())).map_err(Error::Drive)?; - let drive = Drive::open(path, Some(config.drive.clone()), platform_version) - .map_err(Error::Drive)?; + if let Some(protocol_version) = drive.fetch_current_protocol_version(None)? { + let platform_version = PlatformVersion::get(protocol_version)?; - // TODO: factor out key so we don't duplicate - let maybe_serialized_platform_state = drive - .grove - .get_aux(b"saved_state", None) - .unwrap() - .map_err(|e| Error::Drive(GroveDB(e)))?; + let Some(execution_state) = + Platform::::fetch_platform_state(&drive, None, platform_version)? + else { + return Err(Error::Execution(ExecutionError::CorruptedCachedState( + "execution state should be stored as well as protocol version", + ))); + }; - if let Some(serialized_platform_state) = maybe_serialized_platform_state { - Platform::open_with_client_saved_state::

( - drive, - core_rpc, - config, - serialized_platform_state, - ) - } else { - Platform::open_with_client_no_saved_state::

( + return Platform::open_with_client_saved_state::

( drive, core_rpc, config, - PROTOCOL_VERSION, - PROTOCOL_VERSION, - ) + execution_state, + ); } + + Platform::open_with_client_no_saved_state::

( + drive, + core_rpc, + config, + PROTOCOL_VERSION, + PROTOCOL_VERSION, + ) } /// Open Platform with Drive and block execution context from saved state. @@ -217,14 +211,11 @@ impl Platform { drive: Drive, core_rpc: C, config: PlatformConfig, - serialized_platform_state: Vec, + platform_state: PlatformState, ) -> Result, Error> where C: CoreRPCLike, { - let platform_state = - PlatformState::deserialize_from_bytes_no_limit(&serialized_platform_state)?; - PlatformVersion::set_current(PlatformVersion::get( platform_state.current_protocol_version_in_consensus(), )?); diff --git a/packages/rs-drive-abci/src/platform_types/platform_state/mod.rs b/packages/rs-drive-abci/src/platform_types/platform_state/mod.rs index d4b08b9ecb..9e03b3f2b2 100644 --- a/packages/rs-drive-abci/src/platform_types/platform_state/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/platform_state/mod.rs @@ -20,7 +20,6 @@ use dpp::util::deserializer::ProtocolVersion; use dpp::version::{PlatformVersion, TryFromPlatformVersioned, TryIntoPlatformVersioned}; use dpp::ProtocolError; -use dpp::ProtocolError::{PlatformDeserializationError, PlatformSerializationError}; use indexmap::IndexMap; use crate::error::execution::ExecutionError; @@ -59,34 +58,15 @@ impl PlatformSerializable for PlatformState { let platform_state_for_saving: PlatformStateForSaving = self.clone().try_into_platform_versioned(platform_version)?; bincode::encode_to_vec(platform_state_for_saving, config).map_err(|e| { - PlatformSerializationError(format!("unable to serialize PlatformState: {}", e)).into() + ProtocolError::PlatformSerializationError(format!( + "unable to serialize PlatformState: {}", + e + )) + .into() }) } } -// The version we should deserialize this into is determined by the actual saved state -impl PlatformDeserializable for PlatformState { - fn deserialize_from_bytes_no_limit(data: &[u8]) -> Result - where - Self: Sized, - { - let config = config::standard().with_big_endian().with_no_limit(); - let platform_state_in_save_format: PlatformStateForSaving = - bincode::decode_from_slice(data, config) - .map_err(|e| { - PlatformDeserializationError(format!( - "unable to deserialize PlatformStateForSaving: {}", - e - )) - })? - .0; - let platform_version = PlatformVersion::get( - platform_state_in_save_format.current_protocol_version_in_consensus(), - )?; - platform_state_in_save_format.try_into_platform_versioned(platform_version) - } -} - impl PlatformDeserializableFromVersionedStructure for PlatformState { fn versioned_deserialize( data: &[u8], @@ -99,13 +79,16 @@ impl PlatformDeserializableFromVersionedStructure for PlatformState { let platform_state_in_save_format: PlatformStateForSaving = bincode::decode_from_slice(data, config) .map_err(|e| { - PlatformDeserializationError(format!( + ProtocolError::PlatformDeserializationError(format!( "unable to deserialize PlatformStateForSaving: {}", e )) })? .0; - platform_state_in_save_format.try_into_platform_versioned(platform_version) + + platform_state_in_save_format + .try_into_platform_versioned(platform_version) + .map_err(|e: Error| ProtocolError::Generic(e.to_string())) } } @@ -183,7 +166,7 @@ impl TryFromPlatformVersioned for PlatformStateForSaving { } impl TryFromPlatformVersioned for PlatformState { - type Error = ProtocolError; + type Error = Error; fn try_from_platform_versioned( value: PlatformStateForSaving, @@ -193,16 +176,17 @@ impl TryFromPlatformVersioned for PlatformState { PlatformStateForSaving::V0(v0) => { match platform_version.drive_abci.structs.platform_state_structure { 0 => { - let platform_state_v0: PlatformStateV0 = v0.into(); + let platform_state_v0 = PlatformStateV0::from(v0); + Ok(platform_state_v0.into()) } - version => Err(ProtocolError::UnknownVersionMismatch { + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "PlatformState::try_from_platform_versioned(PlatformStateForSaving)" .to_string(), known_versions: vec![0], received: version, - }), + })), } } } diff --git a/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs b/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs index b15dce4743..af69a73643 100644 --- a/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs @@ -25,7 +25,7 @@ use std::fmt::{Debug, Formatter}; #[derive(Clone)] pub struct PlatformStateV0 { /// Information about the genesis block - pub genesis_block_info: Option, + pub genesis_block_info: Option, // TODO: we already have it in epoch 0 /// Information about the last block pub last_committed_block_info: Option, /// Current Version @@ -51,6 +51,7 @@ pub struct PlatformStateV0 { impl Debug for PlatformStateV0 { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { f.debug_struct("PlatformStateV0") + .field("genesis_block_info", &self.genesis_block_info) .field("last_committed_block_info", &self.last_committed_block_info) .field( "current_protocol_version_in_consensus", diff --git a/packages/rs-drive-abci/src/test/fixture/abci.rs b/packages/rs-drive-abci/src/test/fixture/abci.rs index afe4f6fb0c..0330ac740c 100644 --- a/packages/rs-drive-abci/src/test/fixture/abci.rs +++ b/packages/rs-drive-abci/src/test/fixture/abci.rs @@ -30,6 +30,7 @@ //! Execution Tests //! +use crate::config::PlatformConfig; use crate::platform_types::required_identity_public_key_set::v0::RequiredIdentityPublicKeysSet; use crate::platform_types::system_identity_public_keys::v0::SystemIdentityPublicKeysV0; use dpp::version::PlatformVersion; @@ -38,20 +39,26 @@ use rand::rngs::StdRng; use rand::SeedableRng; use tenderdash_abci::proto::abci::RequestInitChain; use tenderdash_abci::proto::google::protobuf::Timestamp; +use tenderdash_abci::proto::types::{ConsensusParams, VersionParams}; /// Creates static init chain request fixture -pub fn static_init_chain_request() -> RequestInitChain { +pub fn static_init_chain_request(config: &PlatformConfig) -> RequestInitChain { RequestInitChain { time: Some(Timestamp { seconds: 0, nanos: 0, }), chain_id: "strategy_tests".to_string(), - consensus_params: None, + consensus_params: Some(ConsensusParams { + version: Some(VersionParams { + app_version: config.initial_protocol_version as u64, + }), + ..Default::default() + }), validator_set: None, app_state_bytes: [0u8; 32].to_vec(), - initial_height: 0, - initial_core_height: 1, + initial_height: config.abci.genesis_height as i64, + initial_core_height: config.abci.genesis_core_height, } } diff --git a/packages/rs-drive-abci/tests/strategy_tests/execution.rs b/packages/rs-drive-abci/tests/strategy_tests/execution.rs index 313f68eb50..c51a376673 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/execution.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/execution.rs @@ -530,7 +530,7 @@ pub(crate) fn start_chain_for_strategy( .expect("expected a quorum to be found"); // init chain - let mut init_chain_request = static_init_chain_request(); + let mut init_chain_request = static_init_chain_request(&config); init_chain_request.initial_core_height = config.abci.genesis_core_height; init_chain_request.validator_set = Some(ValidatorSetUpdate { diff --git a/packages/rs-drive-abci/tests/strategy_tests/main.rs b/packages/rs-drive-abci/tests/strategy_tests/main.rs index 0fd3a7efea..3e4070df12 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/main.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/main.rs @@ -312,7 +312,7 @@ mod tests { abci_app .platform - .recreate_state(platform_version) + .reload_state_from_storage(platform_version) .expect("expected to recreate state"); let ResponseInfo { @@ -454,7 +454,7 @@ mod tests { abci_app .platform - .recreate_state(platform_version) + .reload_state_from_storage(platform_version) .expect("expected to recreate state"); let ResponseInfo { @@ -573,7 +573,7 @@ mod tests { .expect("expected to fetch balances") .expect("expected to have an identity to get balance from"); - assert_eq!(balance, 99869074420) + assert_eq!(balance, 99869044820) } #[test] @@ -1228,7 +1228,7 @@ mod tests { .unwrap() .unwrap() ), - "7185a9b987f4fe7290f048ccdb2935d92446c240b9361be46a20f956164a9378".to_string() + "31479dd805715e196773106ae8f00e1f28f8e5d4f8e3cbf21e6dd59f94643207".to_string() ) } @@ -1838,7 +1838,7 @@ mod tests { .unwrap() .unwrap() ), - "5dfc31d164388c22154e10629030edb5557620c5fcd5c87ffeff5f4e81bdb657".to_string() + "1a1b119866b5cdff20d2fa04f3d2ff8e8d7349aa4b83e7ea05adeae0cfc9cb2c".to_string() ) } @@ -2921,7 +2921,7 @@ mod tests { abci_app .platform - .recreate_state(platform_version) + .reload_state_from_storage(platform_version) .expect("expected to recreate state"); let ResponseInfo { diff --git a/packages/rs-drive/src/drive/document/delete/mod.rs b/packages/rs-drive/src/drive/document/delete/mod.rs index 01a7df4435..a43971fef0 100644 --- a/packages/rs-drive/src/drive/document/delete/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/mod.rs @@ -118,9 +118,10 @@ mod tests { #[test] fn test_add_and_remove_family_one_document_no_transaction() { let tmp_dir = TempDir::new().unwrap(); + + let drive: Drive = Drive::open(tmp_dir, None).expect("expected to open Drive successfully"); + let platform_version = PlatformVersion::latest(); - let drive: Drive = Drive::open(tmp_dir, None, platform_version) - .expect("expected to open Drive successfully"); drive .create_initial_state_structure(None, platform_version) diff --git a/packages/rs-drive/src/drive/mod.rs b/packages/rs-drive/src/drive/mod.rs index 053a051452..d7fbda7eee 100644 --- a/packages/rs-drive/src/drive/mod.rs +++ b/packages/rs-drive/src/drive/mod.rs @@ -93,6 +93,8 @@ mod open; #[cfg(feature = "full")] mod operations; #[cfg(feature = "full")] +mod platform_state; +#[cfg(feature = "full")] mod prove; #[cfg(feature = "full")] mod system_contracts_cache; diff --git a/packages/rs-drive/src/drive/open/mod.rs b/packages/rs-drive/src/drive/open/mod.rs index 7496a651cd..3c5cb66192 100644 --- a/packages/rs-drive/src/drive/open/mod.rs +++ b/packages/rs-drive/src/drive/open/mod.rs @@ -24,11 +24,7 @@ impl Drive { /// /// * `Result` - On success, returns `Ok(Self)`, where `Self` is a `Drive` instance. On error, returns an `Error`. /// - pub fn open>( - path: P, - config: Option, - platform_version: &PlatformVersion, - ) -> Result { + pub fn open>(path: P, config: Option) -> Result { match GroveDb::open(path) { Ok(grove) => { let config = config.unwrap_or_default(); @@ -40,7 +36,7 @@ impl Drive { grove, config, system_contracts: SystemContracts::load_genesis_system_contracts( - platform_version.protocol_version, + 1, // TODO: Will be fixed in #1676 )?, cache: RwLock::new(DriveCache { cached_contracts: DataContractCache::new( diff --git a/packages/rs-drive/src/drive/platform_state/fetch_platform_state_bytes/mod.rs b/packages/rs-drive/src/drive/platform_state/fetch_platform_state_bytes/mod.rs new file mode 100644 index 0000000000..1f341d57ea --- /dev/null +++ b/packages/rs-drive/src/drive/platform_state/fetch_platform_state_bytes/mod.rs @@ -0,0 +1,30 @@ +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use dpp::version::PlatformVersion; +use grovedb::TransactionArg; + +mod v0; + +impl Drive { + /// Fetches execution state from grovedb storage + pub fn fetch_platform_state_bytes( + &self, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result>, Error> { + match platform_version + .drive + .methods + .platform_state + .fetch_platform_state_bytes + { + 0 => self.fetch_platform_state_bytes_v0(transaction), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "fetch_platform_state_bytes".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/platform_state/fetch_platform_state_bytes/v0/mod.rs b/packages/rs-drive/src/drive/platform_state/fetch_platform_state_bytes/v0/mod.rs new file mode 100644 index 0000000000..7a0bf1f18c --- /dev/null +++ b/packages/rs-drive/src/drive/platform_state/fetch_platform_state_bytes/v0/mod.rs @@ -0,0 +1,16 @@ +use crate::drive::platform_state::PLATFORM_STATE_KEY; +use crate::drive::Drive; +use crate::error::Error; +use grovedb::TransactionArg; + +impl Drive { + pub(super) fn fetch_platform_state_bytes_v0( + &self, + transaction: TransactionArg, + ) -> Result>, Error> { + self.grove + .get_aux(PLATFORM_STATE_KEY, transaction) + .unwrap() + .map_err(Error::GroveDB) + } +} diff --git a/packages/rs-drive/src/drive/platform_state/mod.rs b/packages/rs-drive/src/drive/platform_state/mod.rs new file mode 100644 index 0000000000..eb34a17d33 --- /dev/null +++ b/packages/rs-drive/src/drive/platform_state/mod.rs @@ -0,0 +1,7 @@ +mod fetch_platform_state_bytes; +mod store_platform_state_bytes; + +pub use fetch_platform_state_bytes::*; +pub use store_platform_state_bytes::*; + +const PLATFORM_STATE_KEY: &[u8; 11] = b"saved_state"; diff --git a/packages/rs-drive/src/drive/platform_state/store_platform_state_bytes/mod.rs b/packages/rs-drive/src/drive/platform_state/store_platform_state_bytes/mod.rs new file mode 100644 index 0000000000..4b5bb4be29 --- /dev/null +++ b/packages/rs-drive/src/drive/platform_state/store_platform_state_bytes/mod.rs @@ -0,0 +1,31 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use dpp::version::PlatformVersion; +use grovedb::TransactionArg; + +impl Drive { + /// Store the execution state in grovedb storage + pub fn store_platform_state_bytes( + &self, + state_bytes: &[u8], + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + match platform_version + .drive + .methods + .platform_state + .store_platform_state_bytes + { + 0 => self.store_platform_state_bytes_v0(state_bytes, transaction), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "store_platform_state_bytes".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/platform_state/store_platform_state_bytes/v0/mod.rs b/packages/rs-drive/src/drive/platform_state/store_platform_state_bytes/v0/mod.rs new file mode 100644 index 0000000000..57401f43a6 --- /dev/null +++ b/packages/rs-drive/src/drive/platform_state/store_platform_state_bytes/v0/mod.rs @@ -0,0 +1,17 @@ +use crate::drive::platform_state::PLATFORM_STATE_KEY; +use crate::drive::Drive; +use crate::error::Error; +use grovedb::TransactionArg; + +impl Drive { + pub(super) fn store_platform_state_bytes_v0( + &self, + state_bytes: &[u8], + transaction: TransactionArg, + ) -> Result<(), Error> { + self.grove + .put_aux(PLATFORM_STATE_KEY, state_bytes, None, transaction) + .unwrap() + .map_err(Error::GroveDB) + } +} diff --git a/packages/rs-drive/src/drive/protocol_upgrade/change_to_new_version_and_clear_version_information/v0/mod.rs b/packages/rs-drive/src/drive/protocol_upgrade/change_to_new_version_and_clear_version_information/v0/mod.rs index 42fbb2a643..fd37f923f7 100644 --- a/packages/rs-drive/src/drive/protocol_upgrade/change_to_new_version_and_clear_version_information/v0/mod.rs +++ b/packages/rs-drive/src/drive/protocol_upgrade/change_to_new_version_and_clear_version_information/v0/mod.rs @@ -27,7 +27,6 @@ impl Drive { self.set_current_protocol_version_operations( current_version, - transaction, &mut batch_operations, &platform_version.drive, )?; diff --git a/packages/rs-drive/src/drive/system/protocol_version/fetch_current_protocol_version/v0/mod.rs b/packages/rs-drive/src/drive/system/protocol_version/fetch_current_protocol_version.rs similarity index 64% rename from packages/rs-drive/src/drive/system/protocol_version/fetch_current_protocol_version/v0/mod.rs rename to packages/rs-drive/src/drive/system/protocol_version/fetch_current_protocol_version.rs index a8035d3049..2a38de6766 100644 --- a/packages/rs-drive/src/drive/system/protocol_version/fetch_current_protocol_version/v0/mod.rs +++ b/packages/rs-drive/src/drive/system/protocol_version/fetch_current_protocol_version.rs @@ -1,16 +1,36 @@ -use crate::drive::system::misc_path; -use crate::drive::system::misc_tree_constants::PROTOCOL_VERSION_STORAGE_KEY; use crate::drive::Drive; use crate::error::drive::DriveError; use crate::error::Error; +use crate::drive::system::misc_path; +use crate::drive::system::misc_tree_constants::PROTOCOL_VERSION_STORAGE_KEY; use dpp::util::deserializer::ProtocolVersion; use grovedb::TransactionArg; use integer_encoding::VarInt; +/// impl Drive { /// Gets the current protocol version from the backing store - pub(super) fn fetch_current_protocol_version_v0( + /// + /// !!!DON'T CHANGE!!!! + /// + /// This function should never be changed !!! since it's using + /// to get protocol version to read the state from the storage. + /// In plain English, this is the first function that we call, + /// so we don't know version yet. + /// + /// # Arguments + /// + /// * `transaction` - A `TransactionArg` object representing the transaction. + /// + /// # Returns + /// + /// * `Result, Error>` - If successful, returns an `Ok(Option)`. If an error occurs during the operation, returns an `Error`. + /// + /// # Errors + /// + /// This function will return an error if the Drive version is unknown. + pub fn fetch_current_protocol_version( &self, transaction: TransactionArg, ) -> Result, Error> { diff --git a/packages/rs-drive/src/drive/system/protocol_version/fetch_current_protocol_version/mod.rs b/packages/rs-drive/src/drive/system/protocol_version/fetch_current_protocol_version/mod.rs deleted file mode 100644 index 78e654cc38..0000000000 --- a/packages/rs-drive/src/drive/system/protocol_version/fetch_current_protocol_version/mod.rs +++ /dev/null @@ -1,44 +0,0 @@ -mod v0; - -use crate::drive::Drive; -use crate::error::drive::DriveError; -use crate::error::Error; - -use dpp::util::deserializer::ProtocolVersion; -use dpp::version::drive_versions::DriveVersion; -use grovedb::TransactionArg; - -impl Drive { - /// Gets the current protocol version from the backing store - /// - /// # Arguments - /// - /// * `transaction` - A `TransactionArg` object representing the transaction. - /// - /// # Returns - /// - /// * `Result, Error>` - If successful, returns an `Ok(Option)`. If an error occurs during the operation, returns an `Error`. - /// - /// # Errors - /// - /// This function will return an error if the Drive version is unknown. - pub fn fetch_current_protocol_version( - &self, - transaction: TransactionArg, - drive_version: &DriveVersion, - ) -> Result, Error> { - match drive_version - .methods - .platform_system - .protocol_version - .fetch_current_protocol_version - { - 0 => self.fetch_current_protocol_version_v0(transaction), - version => Err(Error::Drive(DriveError::UnknownVersionMismatch { - method: "fetch_current_protocol_version".to_string(), - known_versions: vec![0], - received: version, - })), - } - } -} diff --git a/packages/rs-drive/src/drive/system/protocol_version/mod.rs b/packages/rs-drive/src/drive/system/protocol_version/mod.rs index 2f93b44a5c..d561094fc8 100644 --- a/packages/rs-drive/src/drive/system/protocol_version/mod.rs +++ b/packages/rs-drive/src/drive/system/protocol_version/mod.rs @@ -2,7 +2,7 @@ mod fetch_current_protocol_version; pub use fetch_current_protocol_version::*; mod fetch_next_protocol_version; pub use fetch_next_protocol_version::*; -mod set_current_protocol_version_operations; -pub use set_current_protocol_version_operations::*; +mod store_current_protocol_version; +pub use store_current_protocol_version::*; mod set_next_protocol_version_operations; pub use set_next_protocol_version_operations::*; diff --git a/packages/rs-drive/src/drive/system/protocol_version/set_current_protocol_version_operations/mod.rs b/packages/rs-drive/src/drive/system/protocol_version/set_current_protocol_version_operations/mod.rs deleted file mode 100644 index 8e271bb055..0000000000 --- a/packages/rs-drive/src/drive/system/protocol_version/set_current_protocol_version_operations/mod.rs +++ /dev/null @@ -1,54 +0,0 @@ -mod v0; - -use crate::drive::Drive; -use crate::error::drive::DriveError; -use crate::error::Error; -use crate::fee::op::LowLevelDriveOperation; -use dpp::util::deserializer::ProtocolVersion; -use dpp::version::drive_versions::DriveVersion; -use grovedb::TransactionArg; - -impl Drive { - /// Sets the current protocol version - /// - /// # Arguments - /// - /// * `protocol_version` - A `ProtocolVersion` object representing the current protocol version. - /// * `transaction` - A `TransactionArg` object representing the transaction. - /// * `drive_operations` - A mutable reference to a vector of `LowLevelDriveOperation` objects. - /// * `drive_version` - A `DriveVersion` object representing the version of the Drive. - /// - /// # Returns - /// - /// * `Result<(), Error>` - If successful, returns an `Ok(())`. If an error occurs during the operation, returns an `Error`. - /// - /// # Errors - /// - /// This function will return an error if the version of the Drive is unknown. - pub fn set_current_protocol_version_operations( - &self, - protocol_version: ProtocolVersion, - transaction: TransactionArg, - drive_operations: &mut Vec, - drive_version: &DriveVersion, - ) -> Result<(), Error> { - match drive_version - .methods - .platform_system - .protocol_version - .set_current_protocol_version_operations - { - 0 => self.set_current_protocol_version_operations_v0( - protocol_version, - transaction, - drive_operations, - drive_version, - ), - version => Err(Error::Drive(DriveError::UnknownVersionMismatch { - method: "set_current_protocol_version_operations".to_string(), - known_versions: vec![0], - received: version, - })), - } - } -} diff --git a/packages/rs-drive/src/drive/system/protocol_version/set_current_protocol_version_operations/v0/mod.rs b/packages/rs-drive/src/drive/system/protocol_version/set_current_protocol_version_operations/v0/mod.rs deleted file mode 100644 index c91ec847d9..0000000000 --- a/packages/rs-drive/src/drive/system/protocol_version/set_current_protocol_version_operations/v0/mod.rs +++ /dev/null @@ -1,35 +0,0 @@ -use crate::drive::grove_operations::BatchInsertApplyType; -use crate::drive::object_size_info::PathKeyElementInfo; -use crate::drive::system::misc_path; -use crate::drive::system::misc_tree_constants::PROTOCOL_VERSION_STORAGE_KEY; -use crate::drive::Drive; -use crate::error::Error; -use crate::fee::op::LowLevelDriveOperation; -use dpp::util::deserializer::ProtocolVersion; -use dpp::version::drive_versions::DriveVersion; -use grovedb::{Element, TransactionArg}; -use integer_encoding::VarInt; - -impl Drive { - /// Sets the current protocol version - pub(super) fn set_current_protocol_version_operations_v0( - &self, - protocol_version: ProtocolVersion, - transaction: TransactionArg, - drive_operations: &mut Vec, - drive_version: &DriveVersion, - ) -> Result<(), Error> { - self.batch_insert_if_changed_value( - PathKeyElementInfo::PathFixedSizeKeyRefElement(( - misc_path(), - PROTOCOL_VERSION_STORAGE_KEY, - Element::new_item(protocol_version.encode_var_vec()), - )), - BatchInsertApplyType::StatefulBatchInsert, - transaction, - drive_operations, - drive_version, - )?; - Ok(()) - } -} diff --git a/packages/rs-drive/src/drive/system/protocol_version/store_current_protocol_version.rs b/packages/rs-drive/src/drive/system/protocol_version/store_current_protocol_version.rs new file mode 100644 index 0000000000..bb95476412 --- /dev/null +++ b/packages/rs-drive/src/drive/system/protocol_version/store_current_protocol_version.rs @@ -0,0 +1,78 @@ +use crate::drive::grove_operations::BatchInsertApplyType; +use crate::drive::object_size_info::PathKeyElementInfo; +use crate::drive::system::misc_path; +use crate::drive::system::misc_tree_constants::PROTOCOL_VERSION_STORAGE_KEY; +use crate::drive::Drive; +use crate::error::Error; +use crate::fee::op::LowLevelDriveOperation; +use dpp::util::deserializer::ProtocolVersion; +use dpp::version::drive_versions::DriveVersion; +use grovedb::{Element, TransactionArg}; +use integer_encoding::VarInt; + +impl Drive { + /// Store the current protocol version in grovedb storage + /// + /// !!!DON'T CHANGE!!!! + /// This function should never be changed !!! since it must always be compatible + /// with fetch_current_protocol_version which is should never be changed. + pub fn store_current_protocol_version( + &self, + protocol_version: ProtocolVersion, + transaction: TransactionArg, + drive_version: &DriveVersion, + ) -> Result<(), Error> { + let mut batch_operations = vec![]; + + self.set_current_protocol_version_operations( + protocol_version, + &mut batch_operations, + drive_version, + )?; + + self.apply_batch_low_level_drive_operations( + None, + transaction, + batch_operations, + &mut vec![], + drive_version, + ) + } + + /// Sets the current protocol version operations to batch + /// + /// !!!DON'T CHANGE!!!! + /// This function should never be changed !!! since it must always be compatible + /// with fetch_current_protocol_version which is should never be changed. + /// + /// # Arguments + /// + /// * `protocol_version` - A `ProtocolVersion` object representing the current protocol version. + /// * `transaction` - A `TransactionArg` object representing the transaction. + /// * `drive_operations` - A mutable reference to a vector of `LowLevelDriveOperation` objects. + /// * `drive_version` - A `DriveVersion` object representing the version of the Drive. + /// + /// # Returns + /// + /// * `Result<(), Error>` - If successful, returns an `Ok(())`. If an error occurs during the operation, returns an `Error`. + /// + /// # Errors + /// + /// This function will return an error if the version of the Drive is unknown. + pub fn set_current_protocol_version_operations( + &self, + protocol_version: ProtocolVersion, + drive_operations: &mut Vec, + drive_version: &DriveVersion, + ) -> Result<(), Error> { + self.batch_insert( + PathKeyElementInfo::PathFixedSizeKeyRefElement(( + misc_path(), + PROTOCOL_VERSION_STORAGE_KEY, + Element::new_item(protocol_version.encode_var_vec()), + )), + drive_operations, + drive_version, + ) + } +} diff --git a/packages/rs-drive/src/query/mod.rs b/packages/rs-drive/src/query/mod.rs index 0023c0681f..7217e72c10 100644 --- a/packages/rs-drive/src/query/mod.rs +++ b/packages/rs-drive/src/query/mod.rs @@ -1974,10 +1974,9 @@ mod tests { fn setup_family_contract() -> (Drive, DataContract) { let tmp_dir = TempDir::new().unwrap(); - let platform_version = PlatformVersion::latest(); + let drive: Drive = Drive::open(tmp_dir, None).expect("expected to open Drive successfully"); - let drive: Drive = Drive::open(tmp_dir, None, platform_version) - .expect("expected to open Drive successfully"); + let platform_version = PlatformVersion::latest(); drive .create_initial_state_structure(None, platform_version) diff --git a/packages/rs-drive/src/tests/helpers/setup.rs b/packages/rs-drive/src/tests/helpers/setup.rs index 15095a15f2..a62e55de43 100644 --- a/packages/rs-drive/src/tests/helpers/setup.rs +++ b/packages/rs-drive/src/tests/helpers/setup.rs @@ -64,9 +64,8 @@ impl Default for SetupFeePoolsOptions { /// Sets up Drive using a temporary directory and the optionally given Drive configuration settings. pub fn setup_drive(drive_config: Option) -> Drive { let tmp_dir = TempDir::new().unwrap(); - let platform_version = PlatformVersion::latest(); - let drive: Drive = Drive::open(tmp_dir, drive_config, platform_version) - .expect("should open Drive successfully"); + + let drive: Drive = Drive::open(tmp_dir, drive_config).expect("should open Drive successfully"); drive } diff --git a/packages/rs-platform-version/src/version/drive_abci_versions.rs b/packages/rs-platform-version/src/version/drive_abci_versions.rs index 36c5af5308..e39f192cf8 100644 --- a/packages/rs-platform-version/src/version/drive_abci_versions.rs +++ b/packages/rs-platform-version/src/version/drive_abci_versions.rs @@ -69,6 +69,7 @@ pub struct DriveAbciMethodVersions { pub epoch: DriveAbciEpochMethodVersions, pub block_start: DriveAbciBlockStartMethodVersions, pub block_end: DriveAbciBlockEndMethodVersions, + pub platform_state_storage: DriveAbciPlatformStateStorageMethodVersions, } #[derive(Clone, Debug, Default)] @@ -78,6 +79,12 @@ pub struct DriveAbciValidationVersions { pub state_transition_to_execution_event_for_check_tx: FeatureVersion, } +#[derive(Clone, Debug, Default)] +pub struct DriveAbciPlatformStateStorageMethodVersions { + pub fetch_platform_state: FeatureVersion, + pub store_platform_state: FeatureVersion, +} + #[derive(Clone, Debug, Default)] pub struct DriveAbciDocumentsStateTransitionValidationVersions { pub structure: FeatureVersion, @@ -223,7 +230,6 @@ pub struct DriveAbciBlockStartMethodVersions { #[derive(Clone, Debug, Default)] pub struct DriveAbciBlockEndMethodVersions { - pub store_ephemeral_state: FeatureVersion, pub update_state_cache: FeatureVersion, pub update_drive_cache: FeatureVersion, pub validator_set_update: FeatureVersion, diff --git a/packages/rs-platform-version/src/version/drive_versions.rs b/packages/rs-platform-version/src/version/drive_versions.rs index eb8d6f7da7..7afa099da9 100644 --- a/packages/rs-platform-version/src/version/drive_versions.rs +++ b/packages/rs-platform-version/src/version/drive_versions.rs @@ -31,6 +31,13 @@ pub struct DriveMethodVersions { pub batch_operations: DriveBatchOperationsMethodVersion, pub prove: DriveProveMethodVersions, pub state_transitions: DriveStateTransitionMethodVersions, + pub platform_state: DrivePlatformStateMethodVersions, +} + +#[derive(Clone, Debug, Default)] +pub struct DrivePlatformStateMethodVersions { + pub fetch_platform_state_bytes: FeatureVersion, + pub store_platform_state_bytes: FeatureVersion, } #[derive(Clone, Debug, Default)] @@ -211,8 +218,6 @@ pub struct DriveBatchOperationsMethodVersion { #[derive(Clone, Debug, Default)] pub struct DriveSystemProtocolVersionMethodVersions { - pub fetch_current_protocol_version: FeatureVersion, - pub set_current_protocol_version_operations: FeatureVersion, pub fetch_next_protocol_version: FeatureVersion, pub set_next_protocol_version_operations: FeatureVersion, } diff --git a/packages/rs-platform-version/src/version/mocks/v2_test.rs b/packages/rs-platform-version/src/version/mocks/v2_test.rs index 3d9e442214..9805027977 100644 --- a/packages/rs-platform-version/src/version/mocks/v2_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v2_test.rs @@ -18,8 +18,9 @@ use crate::version::drive_abci_versions::{ DriveAbciFeePoolOutwardsDistributionMethodVersions, DriveAbciIdentityCreditWithdrawalMethodVersions, DriveAbciInitializationMethodVersions, DriveAbciMasternodeIdentitiesUpdatesMethodVersions, DriveAbciMethodVersions, - DriveAbciProtocolUpgradeMethodVersions, DriveAbciQueryDataContractVersions, - DriveAbciQueryIdentityVersions, DriveAbciQuerySystemVersions, DriveAbciQueryVersions, + DriveAbciPlatformStateStorageMethodVersions, DriveAbciProtocolUpgradeMethodVersions, + DriveAbciQueryDataContractVersions, DriveAbciQueryIdentityVersions, + DriveAbciQuerySystemVersions, DriveAbciQueryVersions, DriveAbciStateTransitionCommonValidationVersions, DriveAbciStateTransitionProcessingMethodVersions, DriveAbciStateTransitionValidationVersion, DriveAbciStateTransitionValidationVersions, DriveAbciStructureVersions, @@ -50,13 +51,13 @@ use crate::version::drive_versions::{ DriveIdentityKeysProveMethodVersions, DriveIdentityMethodVersions, DriveIdentityProveMethodVersions, DriveIdentityUpdateMethodVersions, DriveInitializationMethodVersions, DriveMethodVersions, DriveOperationsMethodVersion, - DrivePlatformSystemMethodVersions, DriveProtocolUpgradeVersions, DriveProveMethodVersions, - DriveStateTransitionMethodVersions, DriveStateTransitionOperationMethodVersions, - DriveStructureVersion, DriveSystemEstimationCostsMethodVersions, - DriveSystemProtocolVersionMethodVersions, DriveVerifyContractMethodVersions, - DriveVerifyDocumentMethodVersions, DriveVerifyIdentityMethodVersions, - DriveVerifyMethodVersions, DriveVerifySingleDocumentMethodVersions, - DriveVerifySystemMethodVersions, DriveVersion, + DrivePlatformStateMethodVersions, DrivePlatformSystemMethodVersions, + DriveProtocolUpgradeVersions, DriveProveMethodVersions, DriveStateTransitionMethodVersions, + DriveStateTransitionOperationMethodVersions, DriveStructureVersion, + DriveSystemEstimationCostsMethodVersions, DriveSystemProtocolVersionMethodVersions, + DriveVerifyContractMethodVersions, DriveVerifyDocumentMethodVersions, + DriveVerifyIdentityMethodVersions, DriveVerifyMethodVersions, + DriveVerifySingleDocumentMethodVersions, DriveVerifySystemMethodVersions, DriveVersion, }; use crate::version::mocks::TEST_BYTES; use crate::version::protocol_version::{FeatureVersionBounds, PlatformVersion}; @@ -361,8 +362,6 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { }, platform_system: DrivePlatformSystemMethodVersions { protocol_version: DriveSystemProtocolVersionMethodVersions { - fetch_current_protocol_version: 0, - set_current_protocol_version_operations: 0, fetch_next_protocol_version: 0, set_next_protocol_version_operations: 0, }, @@ -391,6 +390,10 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { }, }, }, + platform_state: DrivePlatformStateMethodVersions { + fetch_platform_state_bytes: 0, + store_platform_state_bytes: 0, + }, }, grove_methods: DriveGroveMethodVersions { basic: DriveGroveBasicMethodVersions { @@ -531,11 +534,14 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { clear_drive_block_cache: 0, }, block_end: DriveAbciBlockEndMethodVersions { - store_ephemeral_state: 0, update_state_cache: 0, update_drive_cache: 0, validator_set_update: 0, }, + platform_state_storage: DriveAbciPlatformStateStorageMethodVersions { + fetch_platform_state: 0, + store_platform_state: 0, + }, }, validation_and_processing: DriveAbciValidationVersions { state_transitions: DriveAbciStateTransitionValidationVersions { diff --git a/packages/rs-platform-version/src/version/mocks/v3_test.rs b/packages/rs-platform-version/src/version/mocks/v3_test.rs index da4bde1154..2825786c60 100644 --- a/packages/rs-platform-version/src/version/mocks/v3_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v3_test.rs @@ -18,8 +18,9 @@ use crate::version::drive_abci_versions::{ DriveAbciFeePoolOutwardsDistributionMethodVersions, DriveAbciIdentityCreditWithdrawalMethodVersions, DriveAbciInitializationMethodVersions, DriveAbciMasternodeIdentitiesUpdatesMethodVersions, DriveAbciMethodVersions, - DriveAbciProtocolUpgradeMethodVersions, DriveAbciQueryDataContractVersions, - DriveAbciQueryIdentityVersions, DriveAbciQuerySystemVersions, DriveAbciQueryVersions, + DriveAbciPlatformStateStorageMethodVersions, DriveAbciProtocolUpgradeMethodVersions, + DriveAbciQueryDataContractVersions, DriveAbciQueryIdentityVersions, + DriveAbciQuerySystemVersions, DriveAbciQueryVersions, DriveAbciStateTransitionCommonValidationVersions, DriveAbciStateTransitionProcessingMethodVersions, DriveAbciStateTransitionValidationVersion, DriveAbciStateTransitionValidationVersions, DriveAbciStructureVersions, @@ -50,13 +51,13 @@ use crate::version::drive_versions::{ DriveIdentityKeysProveMethodVersions, DriveIdentityMethodVersions, DriveIdentityProveMethodVersions, DriveIdentityUpdateMethodVersions, DriveInitializationMethodVersions, DriveMethodVersions, DriveOperationsMethodVersion, - DrivePlatformSystemMethodVersions, DriveProtocolUpgradeVersions, DriveProveMethodVersions, - DriveStateTransitionMethodVersions, DriveStateTransitionOperationMethodVersions, - DriveStructureVersion, DriveSystemEstimationCostsMethodVersions, - DriveSystemProtocolVersionMethodVersions, DriveVerifyContractMethodVersions, - DriveVerifyDocumentMethodVersions, DriveVerifyIdentityMethodVersions, - DriveVerifyMethodVersions, DriveVerifySingleDocumentMethodVersions, - DriveVerifySystemMethodVersions, DriveVersion, + DrivePlatformStateMethodVersions, DrivePlatformSystemMethodVersions, + DriveProtocolUpgradeVersions, DriveProveMethodVersions, DriveStateTransitionMethodVersions, + DriveStateTransitionOperationMethodVersions, DriveStructureVersion, + DriveSystemEstimationCostsMethodVersions, DriveSystemProtocolVersionMethodVersions, + DriveVerifyContractMethodVersions, DriveVerifyDocumentMethodVersions, + DriveVerifyIdentityMethodVersions, DriveVerifyMethodVersions, + DriveVerifySingleDocumentMethodVersions, DriveVerifySystemMethodVersions, DriveVersion, }; use crate::version::mocks::TEST_BYTES; use crate::version::protocol_version::{FeatureVersionBounds, PlatformVersion}; @@ -369,8 +370,6 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { }, platform_system: DrivePlatformSystemMethodVersions { protocol_version: DriveSystemProtocolVersionMethodVersions { - fetch_current_protocol_version: 0, - set_current_protocol_version_operations: 0, fetch_next_protocol_version: 0, set_next_protocol_version_operations: 0, }, @@ -391,6 +390,10 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { convert_drive_operations_to_grove_operations: 0, apply_drive_operations: 0, }, + platform_state: DrivePlatformStateMethodVersions { + fetch_platform_state_bytes: 0, + store_platform_state_bytes: 0, + }, }, grove_methods: DriveGroveMethodVersions { basic: DriveGroveBasicMethodVersions { @@ -531,11 +534,14 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { clear_drive_block_cache: 0, }, block_end: DriveAbciBlockEndMethodVersions { - store_ephemeral_state: 0, update_state_cache: 0, update_drive_cache: 0, validator_set_update: 0, }, + platform_state_storage: DriveAbciPlatformStateStorageMethodVersions { + fetch_platform_state: 0, + store_platform_state: 0, + }, }, validation_and_processing: DriveAbciValidationVersions { state_transitions: DriveAbciStateTransitionValidationVersions { diff --git a/packages/rs-platform-version/src/version/v1.rs b/packages/rs-platform-version/src/version/v1.rs index 8ffb8fddb1..057e9eb041 100644 --- a/packages/rs-platform-version/src/version/v1.rs +++ b/packages/rs-platform-version/src/version/v1.rs @@ -18,8 +18,9 @@ use crate::version::drive_abci_versions::{ DriveAbciFeePoolOutwardsDistributionMethodVersions, DriveAbciIdentityCreditWithdrawalMethodVersions, DriveAbciInitializationMethodVersions, DriveAbciMasternodeIdentitiesUpdatesMethodVersions, DriveAbciMethodVersions, - DriveAbciProtocolUpgradeMethodVersions, DriveAbciQueryDataContractVersions, - DriveAbciQueryIdentityVersions, DriveAbciQuerySystemVersions, DriveAbciQueryVersions, + DriveAbciPlatformStateStorageMethodVersions, DriveAbciProtocolUpgradeMethodVersions, + DriveAbciQueryDataContractVersions, DriveAbciQueryIdentityVersions, + DriveAbciQuerySystemVersions, DriveAbciQueryVersions, DriveAbciStateTransitionCommonValidationVersions, DriveAbciStateTransitionProcessingMethodVersions, DriveAbciStateTransitionValidationVersion, DriveAbciStateTransitionValidationVersions, DriveAbciStructureVersions, @@ -50,13 +51,13 @@ use crate::version::drive_versions::{ DriveIdentityKeysProveMethodVersions, DriveIdentityMethodVersions, DriveIdentityProveMethodVersions, DriveIdentityUpdateMethodVersions, DriveInitializationMethodVersions, DriveMethodVersions, DriveOperationsMethodVersion, - DrivePlatformSystemMethodVersions, DriveProtocolUpgradeVersions, DriveProveMethodVersions, - DriveStateTransitionMethodVersions, DriveStateTransitionOperationMethodVersions, - DriveStructureVersion, DriveSystemEstimationCostsMethodVersions, - DriveSystemProtocolVersionMethodVersions, DriveVerifyContractMethodVersions, - DriveVerifyDocumentMethodVersions, DriveVerifyIdentityMethodVersions, - DriveVerifyMethodVersions, DriveVerifySingleDocumentMethodVersions, - DriveVerifySystemMethodVersions, DriveVersion, + DrivePlatformStateMethodVersions, DrivePlatformSystemMethodVersions, + DriveProtocolUpgradeVersions, DriveProveMethodVersions, DriveStateTransitionMethodVersions, + DriveStateTransitionOperationMethodVersions, DriveStructureVersion, + DriveSystemEstimationCostsMethodVersions, DriveSystemProtocolVersionMethodVersions, + DriveVerifyContractMethodVersions, DriveVerifyDocumentMethodVersions, + DriveVerifyIdentityMethodVersions, DriveVerifyMethodVersions, + DriveVerifySingleDocumentMethodVersions, DriveVerifySystemMethodVersions, DriveVersion, }; use crate::version::protocol_version::{FeatureVersionBounds, PlatformVersion}; use crate::version::{AbciStructureVersion, PlatformArchitectureVersion}; @@ -358,8 +359,6 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { }, platform_system: DrivePlatformSystemMethodVersions { protocol_version: DriveSystemProtocolVersionMethodVersions { - fetch_current_protocol_version: 0, - set_current_protocol_version_operations: 0, fetch_next_protocol_version: 0, set_next_protocol_version_operations: 0, }, @@ -388,6 +387,10 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { convert_drive_operations_to_grove_operations: 0, apply_drive_operations: 0, }, + platform_state: DrivePlatformStateMethodVersions { + fetch_platform_state_bytes: 0, + store_platform_state_bytes: 0, + }, }, grove_methods: DriveGroveMethodVersions { basic: DriveGroveBasicMethodVersions { @@ -528,11 +531,14 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { clear_drive_block_cache: 0, }, block_end: DriveAbciBlockEndMethodVersions { - store_ephemeral_state: 0, update_state_cache: 0, update_drive_cache: 0, validator_set_update: 0, }, + platform_state_storage: DriveAbciPlatformStateStorageMethodVersions { + fetch_platform_state: 0, + store_platform_state: 0, + }, }, validation_and_processing: DriveAbciValidationVersions { state_transitions: DriveAbciStateTransitionValidationVersions { From 20b39d65157d4858099e317cef589a7fca7a9eca Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Sun, 28 Jan 2024 07:13:17 -0800 Subject: [PATCH 022/191] feat!: chainlock optimized verification (#1621) Co-authored-by: Odysseas Gabrielides Co-authored-by: Ivan Shumkov --- Cargo.lock | 596 ++++++------- Dockerfile | 2 +- packages/dapi-grpc/Cargo.toml | 2 +- .../configs/defaults/getBaseConfigFactory.js | 5 + .../configs/defaults/getLocalConfigFactory.js | 5 + .../defaults/getTestnetConfigFactory.js | 5 + .../configs/getConfigFileMigrationsFactory.js | 9 + packages/dashmate/docker-compose.yml | 11 +- .../dashmate/src/config/configJsonSchema.js | 22 +- packages/rs-drive-abci/.env.local | 63 ++ .../{.env.example => .env.mainnet} | 21 +- packages/rs-drive-abci/.env.testnet | 62 ++ packages/rs-drive-abci/Cargo.toml | 2 +- packages/rs-drive-abci/src/abci/error.rs | 8 + .../rs-drive-abci/src/abci/handler/mod.rs | 49 +- packages/rs-drive-abci/src/config.rs | 147 ++-- .../src/core/wait_for_core_to_sync/v0/mod.rs | 10 +- packages/rs-drive-abci/src/error/mod.rs | 4 + .../engine/finalize_block_proposal/v0/mod.rs | 2 +- .../engine/run_block_proposal/mod.rs | 3 + .../engine/run_block_proposal/v0/mod.rs | 94 ++- .../block_end/validator_set_update/v0/mod.rs | 5 +- .../update_core_info/v0/mod.rs | 8 + .../update_state_masternode_list/v0/mod.rs | 2 +- .../update_masternode_list/v0/mod.rs | 6 +- .../update_quorum_info/mod.rs | 2 + .../update_quorum_info/v0/mod.rs | 180 +++- .../core_chain_lock/choose_quorum/mod.rs | 76 ++ .../core_chain_lock/choose_quorum/v0/mod.rs | 359 ++++++++ .../mod.rs | 54 ++ .../v0/mod.rs | 37 + .../platform_events/core_chain_lock/mod.rs | 5 + .../core_chain_lock/verify_chain_lock/mod.rs | 50 ++ .../verify_chain_lock/v0/mod.rs | 157 ++++ .../verify_chain_lock_locally/mod.rs | 47 ++ .../verify_chain_lock_locally/v0/mod.rs | 315 +++++++ .../verify_chain_lock_through_core/mod.rs | 39 + .../verify_chain_lock_through_core/v0/mod.rs | 43 + .../epoch/gather_epoch_info/v0/mod.rs | 2 +- .../v0/mod.rs | 2 + .../v0/mod.rs | 2 + .../initial_core_height/v0/mod.rs | 2 +- .../src/execution/platform_events/mod.rs | 3 + .../withdrawals/check_withdrawals/v0/mod.rs | 2 +- .../types/block_execution_context/mod.rs | 2 +- .../types/block_execution_context/v0/mod.rs | 2 +- .../execution/types/block_state_info/mod.rs | 2 +- .../types/block_state_info/v0/mod.rs | 2 +- .../check_tx_verification/v0/mod.rs | 4 +- .../state_transition/processor/v0/mod.rs | 2 +- .../data_contract_update/mod.rs | 4 +- .../structure_v0/mod.rs | 2 +- .../structure_v0/mod.rs | 2 +- .../data_triggers/triggers/dashpay/v0/mod.rs | 2 +- .../triggers/feature_flags/v0/mod.rs | 2 +- .../state/v0/fetch_documents.rs | 2 +- .../state/v0/mod.rs | 12 +- .../identity_update/state/v0/mod.rs | 12 +- packages/rs-drive-abci/src/mimic/mod.rs | 147 +++- .../src/platform_types/block_proposal/v0.rs | 34 +- .../src/platform_types/epoch_info/mod.rs | 2 +- .../src/platform_types/epoch_info/v0/mod.rs | 2 +- .../rs-drive-abci/src/platform_types/mod.rs | 3 + .../src/platform_types/platform/mod.rs | 4 +- .../src/platform_types/platform_state/mod.rs | 160 +++- .../platform_types/platform_state/v0/mod.rs | 248 +++++- .../verify_chain_lock_result/mod.rs | 2 + .../verify_chain_lock_result/v0/mod.rs | 12 + .../data_contract/v0/mod.rs | 10 +- .../data_contract_history/v0/mod.rs | 10 +- .../data_contracts/v0/mod.rs | 10 +- .../src/query/document_query/v0/mod.rs | 10 +- .../identity_based_queries/balance/v0/mod.rs | 10 +- .../balance_and_revision/v0/mod.rs | 10 +- .../identities/v0/mod.rs | 10 +- .../identities_by_public_key_hashes/v0/mod.rs | 10 +- .../identity_based_queries/identity/v0/mod.rs | 10 +- .../identity_by_public_key_hash/v0/mod.rs | 10 +- .../identity_based_queries/keys/v0/mod.rs | 10 +- .../rs-drive-abci/src/query/proofs/v0/mod.rs | 10 +- .../src/query/response_metadata/v0/mod.rs | 8 +- .../src/query/system/epoch_infos/v0/mod.rs | 12 +- .../system/version_upgrade_state/v0/mod.rs | 10 +- .../version_upgrade_vote_status/v0/mod.rs | 10 +- packages/rs-drive-abci/src/rpc/core.rs | 50 +- .../tests/strategy_tests/chain_lock_update.rs | 87 ++ .../tests/strategy_tests/core_update_tests.rs | 72 +- .../tests/strategy_tests/execution.rs | 268 +++++- .../tests/strategy_tests/failures.rs | 84 +- .../tests/strategy_tests/main.rs | 797 ++++++------------ .../tests/strategy_tests/query.rs | 77 +- .../tests/strategy_tests/strategy.rs | 72 +- .../strategy_tests/upgrade_fork_tests.rs | 142 ++-- packages/rs-drive-proof-verifier/Cargo.toml | 2 +- .../src/version/drive_abci_versions.rs | 11 + .../src/version/mocks/v2_test.rs | 15 +- .../src/version/mocks/v3_test.rs | 15 +- .../rs-platform-version/src/version/v1.rs | 15 +- packages/strategy-tests/src/frequency.rs | 4 + .../src/errors/consensus/consensus_error.rs | 1 - scripts/configure_dotenv.sh | 2 +- 101 files changed, 3586 insertions(+), 1474 deletions(-) create mode 100644 packages/rs-drive-abci/.env.local rename packages/rs-drive-abci/{.env.example => .env.mainnet} (87%) create mode 100644 packages/rs-drive-abci/.env.testnet create mode 100644 packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/choose_quorum/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/choose_quorum/v0/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/make_sure_core_is_synced_to_chain_lock/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/make_sure_core_is_synced_to_chain_lock/v0/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock/v0/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_locally/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_locally/v0/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_through_core/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_through_core/v0/mod.rs create mode 100644 packages/rs-drive-abci/src/platform_types/verify_chain_lock_result/mod.rs create mode 100644 packages/rs-drive-abci/src/platform_types/verify_chain_lock_result/v0/mod.rs create mode 100644 packages/rs-drive-abci/tests/strategy_tests/chain_lock_update.rs diff --git a/Cargo.lock b/Cargo.lock index fd5dc32b09..fb03b94146 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -31,9 +31,9 @@ dependencies = [ [[package]] name = "ahash" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" +checksum = "77c3a9648d43b9cd48db467b3f87fdd6e146bcc88ab0180006cef2179fe11d01" dependencies = [ "cfg-if", "once_cell", @@ -67,9 +67,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.5" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d664a92ecae85fd0a7392615844904654d1d5f5514837f471ddef4a057aba1b6" +checksum = "6e2e1ebcb11de5c03c67de28a7df593d32191b44939c482e97702baaaa6ab6a5" dependencies = [ "anstyle", "anstyle-parse", @@ -115,9 +115,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.75" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" +checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" [[package]] name = "arrayref" @@ -179,18 +179,18 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.48", ] [[package]] name = "async-trait" -version = "0.1.74" +version = "0.1.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" +checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.48", ] [[package]] @@ -296,9 +296,9 @@ checksum = "0ea22880d78093b0cbe17c89f64a7d457941e65759157ec6cb31a31d652b05e5" [[package]] name = "base64" -version = "0.21.5" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "base64ct" @@ -353,13 +353,13 @@ dependencies = [ "lazycell", "log", "peeking_take_while", - "prettyplease 0.2.15", + "prettyplease 0.2.16", "proc-macro2", "quote", "regex", "rustc-hash", "shlex", - "syn 2.0.41", + "syn 2.0.48", "which", ] @@ -401,9 +401,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.1" +version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" +checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" [[package]] name = "bitvec" @@ -462,9 +462,9 @@ dependencies = [ [[package]] name = "borsh" -version = "1.2.1" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9897ef0f1bd2362169de6d7e436ea2237dc1085d7d1e4db75f4be34d86f309d1" +checksum = "f58b559fd6448c6e2fd0adb5720cd98a2506594cafa4737ff98c396f3e82f667" dependencies = [ "borsh-derive", "cfg_aliases", @@ -472,15 +472,15 @@ dependencies = [ [[package]] name = "borsh-derive" -version = "1.2.1" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478b41ff04256c5c8330f3dfdaaae2a5cc976a8e75088bafa4625b0d0208de8c" +checksum = "7aadb5b6ccbd078890f6d7003694e33816e6b784358f18e15e7e6d9f065a57cd" dependencies = [ "once_cell", - "proc-macro-crate 2.0.1", + "proc-macro-crate 3.1.0", "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.48", "syn_derive", ] @@ -570,9 +570,9 @@ dependencies = [ [[package]] name = "cargo-platform" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e34637b3140142bdf929fb439e8aa4ebad7651ebf7b1080b3930aa16ac1459ff" +checksum = "ceed8ef69d8518a5dda55c07425450b58a4e1946f4951eab6d7191ee86c2443d" dependencies = [ "serde", ] @@ -629,9 +629,9 @@ checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" [[package]] name = "chrono" -version = "0.4.31" +version = "0.4.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" +checksum = "41daef31d7a747c5c847246f36de49ced6f7403b4cdabc807a97b5cc184cda7a" dependencies = [ "android-tzdata", "iana-time-zone", @@ -639,7 +639,7 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-targets 0.48.5", + "windows-targets 0.52.0", ] [[package]] @@ -668,9 +668,9 @@ dependencies = [ [[package]] name = "clang-sys" -version = "1.6.1" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c688fc74432808e3eb684cae8830a86be1d66a2bd58e1f248ed0960a590baf6f" +checksum = "67523a3b4be3ce1989d607a828d036249522dd9c1c8de7f4dd2dae43a37369d1" dependencies = [ "glob", "libc", @@ -690,9 +690,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.4.11" +version = "4.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfaff671f6b22ca62406885ece523383b9b64022e341e53e009a62ebc47a45f2" +checksum = "1e578d6ec4194633722ccf9544794b71b1385c3c027efe0c55db226fc880865c" dependencies = [ "clap_builder", "clap_derive", @@ -700,9 +700,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.11" +version = "4.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a216b506622bb1d316cd51328dce24e07bdff4a6128a47c7e7fad11878d5adbb" +checksum = "4df4df40ec50c46000231c914968278b1eb05098cf8f1b3a518a95030e71d1c7" dependencies = [ "anstream", "anstyle", @@ -719,7 +719,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.48", ] [[package]] @@ -790,9 +790,9 @@ checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "cpufeatures" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" dependencies = [ "libc", ] @@ -817,7 +817,7 @@ dependencies = [ "clap 2.34.0", "criterion-plot", "csv", - "itertools", + "itertools 0.10.5", "lazy_static", "num-traits", "oorandom", @@ -839,50 +839,42 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2673cc8207403546f45f5fd319a974b1e6983ad1a3ee7e6041650013be041876" dependencies = [ "cast", - "itertools", + "itertools 0.10.5", ] [[package]] name = "crossbeam-channel" -version = "0.5.9" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c3242926edf34aec4ac3a77108ad4854bffaa2e4ddc1824124ce59231302d5" +checksum = "176dc175b78f56c0f321911d9c8eb2b77a78a4860b9c19db83835fea1a46649b" dependencies = [ - "cfg-if", "crossbeam-utils", ] [[package]] name = "crossbeam-deque" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fca89a0e215bab21874660c67903c5f143333cab1da83d041c7ded6053774751" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" dependencies = [ - "cfg-if", "crossbeam-epoch", "crossbeam-utils", ] [[package]] name = "crossbeam-epoch" -version = "0.9.16" +version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d2fe95351b870527a5d09bf563ed3c97c0cffb87cf1c78a591bf48bb218d9aa" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" dependencies = [ - "autocfg", - "cfg-if", "crossbeam-utils", - "memoffset", ] [[package]] name = "crossbeam-utils" -version = "0.8.17" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d96137f14f244c37f989d9fff8f95e6c18b918e71f36638f8c49112e4c78f" -dependencies = [ - "cfg-if", -] +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" [[package]] name = "crypto-common" @@ -940,7 +932,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.48", ] [[package]] @@ -952,7 +944,7 @@ dependencies = [ "prost 0.11.9", "serde", "serde_bytes", - "tenderdash-proto 0.14.0-dev.1 (git+https://github.com/dashpay/rs-tenderdash-abci)", + "tenderdash-proto", "tonic", "tonic-build", ] @@ -964,7 +956,7 @@ dependencies = [ "dapi-grpc", "heck", "quote", - "syn 2.0.41", + "syn 2.0.48", ] [[package]] @@ -988,7 +980,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.41", + "syn 2.0.48", ] [[package]] @@ -999,7 +991,7 @@ checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" dependencies = [ "darling_core", "quote", - "syn 2.0.41", + "syn 2.0.48", ] [[package]] @@ -1026,11 +1018,11 @@ source = "git+https://github.com/dashpay/rust-dashcore?branch=master#35a166e7625 [[package]] name = "dashcore-rpc" version = "0.15.1" -source = "git+https://github.com/dashpay/rust-dashcore-rpc?branch=master#016e3af953fe92e0e58a8fe2b3958334e318b6c0" +source = "git+https://github.com/dashpay/rust-dashcore-rpc?branch=master#d7df63efcd59815bb9a5bbc05d6c82dfc24df2c6" dependencies = [ "dashcore-private", "dashcore-rpc-json", - "env_logger 0.10.1", + "env_logger 0.10.2", "hex", "jsonrpc", "log", @@ -1041,7 +1033,7 @@ dependencies = [ [[package]] name = "dashcore-rpc-json" version = "0.15.1" -source = "git+https://github.com/dashpay/rust-dashcore-rpc?branch=master#016e3af953fe92e0e58a8fe2b3958334e318b6c0" +source = "git+https://github.com/dashpay/rust-dashcore-rpc?branch=master#d7df63efcd59815bb9a5bbc05d6c82dfc24df2c6" dependencies = [ "bincode 2.0.0-rc.3", "dashcore", @@ -1107,9 +1099,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.3.10" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eb30d70a07a3b04884d2677f06bec33509dc67ca60d92949e5535352d3191dc" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" dependencies = [ "powerfmt", "serde", @@ -1193,7 +1185,7 @@ dependencies = [ "hex", "indexmap 2.1.0", "integer-encoding 4.0.0", - "itertools", + "itertools 0.10.5", "json-patch", "jsonptr", "jsonschema", @@ -1225,7 +1217,7 @@ name = "drive" version = "1.0.0-dev.3" dependencies = [ "anyhow", - "base64 0.21.5", + "base64 0.21.7", "bs58 0.5.0", "byteorder", "chrono", @@ -1242,7 +1234,7 @@ dependencies = [ "indexmap 1.9.3", "integer-encoding 4.0.0", "intmap", - "itertools", + "itertools 0.10.5", "moka", "nohash-hasher", "platform-version", @@ -1266,7 +1258,7 @@ dependencies = [ "bytes", "chrono", "ciborium", - "clap 4.4.11", + "clap 4.4.18", "dapi-grpc", "dashcore-rpc", "delegate", @@ -1279,7 +1271,7 @@ dependencies = [ "hex", "indexmap 1.9.3", "integer-encoding 4.0.0", - "itertools", + "itertools 0.10.5", "lazy_static", "metrics", "metrics-exporter-prometheus", @@ -1294,12 +1286,12 @@ dependencies = [ "rust_decimal_macros", "serde", "serde_json", - "serde_with 3.4.0", + "serde_with 3.5.0", "sha2", "simple-signer", "strategy-tests", "tempfile", - "tenderdash-abci 0.14.0-dev.1 (git+https://github.com/dashpay/rs-tenderdash-abci?tag=v0.14.0-dev.2)", + "tenderdash-abci", "thiserror", "tokio", "tokio-util", @@ -1320,7 +1312,7 @@ dependencies = [ "lazy_static", "serde", "serde_json", - "tenderdash-abci 0.14.0-dev.1 (git+https://github.com/dashpay/rs-tenderdash-abci)", + "tenderdash-abci", "thiserror", "tracing", ] @@ -1394,7 +1386,7 @@ checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.48", ] [[package]] @@ -1412,9 +1404,9 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.10.1" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95b3f3e67048839cb0d0781f445682a35113da7121f7c949db0e2be96a4fbece" +checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" dependencies = [ "humantime", "is-terminal", @@ -1613,9 +1605,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" dependencies = [ "futures-channel", "futures-core", @@ -1628,9 +1620,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" dependencies = [ "futures-core", "futures-sink", @@ -1638,15 +1630,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" [[package]] name = "futures-executor" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" dependencies = [ "futures-core", "futures-task", @@ -1655,9 +1647,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" [[package]] name = "futures-lite" @@ -1676,32 +1668,32 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.48", ] [[package]] name = "futures-sink" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" [[package]] name = "futures-task" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" [[package]] name = "futures-util" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ "futures-channel", "futures-core", @@ -1727,9 +1719,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" dependencies = [ "cfg-if", "js-sys", @@ -1765,7 +1757,7 @@ dependencies = [ "indexmap 1.9.3", "integer-encoding 3.0.4", "intmap", - "itertools", + "itertools 0.10.5", "nohash-hasher", "serde", "tempfile", @@ -1836,14 +1828,14 @@ version = "1.0.0-rc.2" source = "git+https://github.com/dashpay/grovedb?rev=b40dd1a35f852c81caeda2d3c2910c40fae3a67f#b40dd1a35f852c81caeda2d3c2910c40fae3a67f" dependencies = [ "hex", - "itertools", + "itertools 0.10.5", ] [[package]] name = "h2" -version = "0.3.22" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d6250322ef6e60f93f9a2162799302cd6f68f79f6e5d85c8c16f14d1d958178" +checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9" dependencies = [ "bytes", "fnv", @@ -1879,7 +1871,7 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ff8ae62cd3a9102e5637afc8452c55acf3844001bd5374e0b0bd7b6616c038" dependencies = [ - "ahash 0.8.6", + "ahash 0.8.7", ] [[package]] @@ -1905,9 +1897,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" +checksum = "5d3d0e0f38255e7fa3cf31335b3a56f05febd18025f4db5ef7a0cfb4f8da651f" [[package]] name = "hex" @@ -1975,9 +1967,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.27" +version = "0.14.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" +checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" dependencies = [ "bytes", "futures-channel", @@ -1990,7 +1982,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.4.10", + "socket2 0.5.5", "tokio", "tower-service", "tracing", @@ -2011,9 +2003,9 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.58" +version = "0.1.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8326b86b6cff230b97d0d312a6c40a60726df3332e721f72a1b035f451663b20" +checksum = "b6a67363e2aa4443928ce15e57ebae94fd8949958fd1223c4cfc0cd473ad7539" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -2106,7 +2098,7 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" dependencies = [ - "hermit-abi 0.3.3", + "hermit-abi 0.3.4", "libc", "windows-sys 0.48.0", ] @@ -2119,13 +2111,13 @@ checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" [[package]] name = "is-terminal" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" +checksum = "0bad00257d07be169d870ab665980b06cdb366d792ad690bf2e76876dc503455" dependencies = [ - "hermit-abi 0.3.3", - "rustix 0.38.28", - "windows-sys 0.48.0", + "hermit-abi 0.3.4", + "rustix 0.38.30", + "windows-sys 0.52.0", ] [[package]] @@ -2146,6 +2138,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.10" @@ -2231,7 +2232,7 @@ source = "git+https://github.com/fominok/jsonschema-rs?branch=feat-unevaluated-p dependencies = [ "ahash 0.7.7", "anyhow", - "base64 0.13.1", + "base64 0.21.7", "bytecount", "fancy-regex", "fraction", @@ -2264,24 +2265,24 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "lhash" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6df04c84bd3f83849dd23c51be4cbb22a02d80ebdea22741558fe30127d837ae" +checksum = "744a4c881f502e98c2241d2e5f50040ac73b30194d64452bb6260393b53f0dc9" [[package]] name = "libc" -version = "0.2.151" +version = "0.2.152" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" [[package]] name = "libloading" -version = "0.7.4" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +checksum = "c571b676ddfc9a8c12f1f3d3085a7b163966a8fd8098a90640953ce5f6170161" dependencies = [ "cfg-if", - "winapi", + "windows-sys 0.48.0", ] [[package]] @@ -2302,9 +2303,9 @@ dependencies = [ [[package]] name = "libz-sys" -version = "1.1.12" +version = "1.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d97137b25e321a73eef1418d1d5d2eda4d77e12813f8e6dead84bc52c5870a7b" +checksum = "295c17e837573c8c821dbaeb3cceb3d745ad082f7572191409e69cbc1b3fd050" dependencies = [ "cc", "pkg-config", @@ -2319,9 +2320,9 @@ checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" [[package]] name = "linux-raw-sys" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456" +checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" [[package]] name = "lock_api" @@ -2351,9 +2352,9 @@ dependencies = [ [[package]] name = "mach2" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d0d1830bcd151a6fc4aea1369af235b36c1528fe976b8ff678683c9995eade8" +checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" dependencies = [ "libc", ] @@ -2383,18 +2384,9 @@ checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" [[package]] name = "memchr" -version = "2.6.4" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" - -[[package]] -name = "memoffset" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" -dependencies = [ - "autocfg", -] +checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" [[package]] name = "metrics" @@ -2402,7 +2394,7 @@ version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fde3af1a009ed76a778cb84fdef9e7dbbdf5775ae3e4cc1f434a6a307f6f76c5" dependencies = [ - "ahash 0.8.6", + "ahash 0.8.7", "metrics-macros", "portable-atomic", ] @@ -2413,7 +2405,7 @@ version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d4fa7ce7c4862db464a37b0b31d89bca874562f034bd7993895572783d02950" dependencies = [ - "base64 0.21.5", + "base64 0.21.7", "hyper", "indexmap 1.9.3", "ipnet", @@ -2427,13 +2419,13 @@ dependencies = [ [[package]] name = "metrics-macros" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddece26afd34c31585c74a4db0630c376df271c285d682d1e55012197830b6df" +checksum = "38b4faf00617defe497754acde3024865bc143d44a86799b24e191ecff91354f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.48", ] [[package]] @@ -2532,7 +2524,7 @@ dependencies = [ "tagptr", "thiserror", "triomphe", - "uuid 1.6.1", + "uuid 1.7.0", ] [[package]] @@ -2622,7 +2614,7 @@ checksum = "cfb77679af88f8b125209d354a202862602672222e7f2313fdd6dc349bad4712" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.48", ] [[package]] @@ -2673,7 +2665,7 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.3.3", + "hermit-abi 0.3.4", "libc", ] @@ -2700,9 +2692,9 @@ dependencies = [ [[package]] name = "object" -version = "0.32.1" +version = "0.32.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" dependencies = [ "memchr", ] @@ -2805,7 +2797,7 @@ checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.48", ] [[package]] @@ -2832,9 +2824,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.27" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" +checksum = "2900ede94e305130c13ddd391e0ab7cbaeb783945ae07a279c268cb05109c6cb" [[package]] name = "platform-serialization" @@ -2850,7 +2842,7 @@ version = "1.0.0-dev.3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.48", "virtue 0.0.14", ] @@ -2880,7 +2872,7 @@ name = "platform-value-convertible" version = "1.0.0-dev.3" dependencies = [ "quote", - "syn 2.0.41", + "syn 2.0.48", ] [[package]] @@ -2896,14 +2888,14 @@ version = "1.0.0-dev.3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.48", ] [[package]] name = "platforms" -version = "3.2.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14e6ab3f592e6fb464fc9712d8d6e6912de6473954635fd76a589d832cffcbb0" +checksum = "626dec3cac7cc0e1577a2ec3fc496277ec2baa084bebad95bb6fdbfae235f84c" [[package]] name = "plotters" @@ -2975,7 +2967,7 @@ checksum = "59230a63c37f3e18569bdb90e4a89cbf5bf8b06fea0b84e65ea10cc4df47addd" dependencies = [ "difflib", "float-cmp", - "itertools", + "itertools 0.10.5", "normalize-line-endings", "predicates-core", "regex", @@ -3019,12 +3011,12 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae005bd773ab59b4725093fd7df83fd7892f7d8eafb48dbd7de6e024e4215f9d" +checksum = "a41cf62165e97c7f814d2221421dbb9afcbcdb0a88068e5ea206e19951c2cbb5" dependencies = [ "proc-macro2", - "syn 2.0.41", + "syn 2.0.48", ] [[package]] @@ -3039,12 +3031,11 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "2.0.1" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97dc5fea232fc28d2f597b37c4876b348a40e33f3b02cc975c8d006d78d94b1a" +checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" dependencies = [ - "toml_datetime", - "toml_edit 0.20.2", + "toml_edit 0.21.0", ] [[package]] @@ -3073,9 +3064,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.70" +version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" +checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" dependencies = [ "unicode-ident", ] @@ -3108,7 +3099,7 @@ checksum = "119533552c9a7ffacc21e099c24a0ac8bb19c2a2a3f363de84cd9b844feab270" dependencies = [ "bytes", "heck", - "itertools", + "itertools 0.10.5", "lazy_static", "log", "multimap", @@ -3130,16 +3121,16 @@ checksum = "c55e02e35260070b6f716a2423c2ff1c3bb1642ddca6f99e1f26d06268a0e2d2" dependencies = [ "bytes", "heck", - "itertools", + "itertools 0.11.0", "log", "multimap", "once_cell", "petgraph", - "prettyplease 0.2.15", + "prettyplease 0.2.16", "prost 0.12.3", "prost-types 0.12.3", "regex", - "syn 2.0.41", + "syn 2.0.48", "tempfile", "which", ] @@ -3151,7 +3142,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" dependencies = [ "anyhow", - "itertools", + "itertools 0.10.5", "proc-macro2", "quote", "syn 1.0.109", @@ -3164,10 +3155,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "efb6c9a1dd1def8e2124d17e83a20af56f1570d6c2d2bd9e266ccb768df3840e" dependencies = [ "anyhow", - "itertools", + "itertools 0.11.0", "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.48", ] [[package]] @@ -3237,9 +3228,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.33" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ "proc-macro2", ] @@ -3291,9 +3282,9 @@ dependencies = [ [[package]] name = "rayon" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" +checksum = "fa7237101a77a10773db45d62004a272517633fbcc3df19d96455ede1122e051" dependencies = [ "either", "rayon-core", @@ -3301,9 +3292,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.12.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" dependencies = [ "crossbeam-deque", "crossbeam-utils", @@ -3320,13 +3311,13 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.2" +version = "1.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.3", + "regex-automata 0.4.4", "regex-syntax 0.8.2", ] @@ -3341,9 +3332,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +checksum = "3b7fa1134405e2ec9353fd416b17f8dacd46c473d7d3fd1cf202706a14eb792a" dependencies = [ "aho-corasick", "memchr", @@ -3409,7 +3400,7 @@ dependencies = [ "rkyv_derive", "seahash", "tinyvec", - "uuid 1.6.1", + "uuid 1.7.0", ] [[package]] @@ -3458,7 +3449,7 @@ name = "rs-sdk" version = "1.0.0-dev.3" dependencies = [ "async-trait", - "base64 0.21.5", + "base64 0.21.7", "bincode 2.0.0-rc.3", "ciborium", "dapi-grpc", @@ -3558,14 +3549,14 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.28" +version = "0.38.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72e572a5e8ca657d7366229cdde4bd14c4eb5499a9573d4d366fe1b599daa316" +checksum = "322394588aaf33c24007e8bb3238ee3e4c5c09c084ab32bc73890b99ff326bca" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "errno", "libc", - "linux-raw-sys 0.4.12", + "linux-raw-sys 0.4.13", "windows-sys 0.52.0", ] @@ -3599,7 +3590,7 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" dependencies = [ - "base64 0.21.5", + "base64 0.21.7", ] [[package]] @@ -3635,11 +3626,11 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.22" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -3719,18 +3710,18 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.20" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" +checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" dependencies = [ "serde", ] [[package]] name = "serde" -version = "1.0.193" +version = "1.0.195" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" +checksum = "63261df402c67811e9ac6def069e4786148c4563f4b50fd4bf30aa370d626b02" dependencies = [ "serde_derive", ] @@ -3747,9 +3738,9 @@ dependencies = [ [[package]] name = "serde_bytes" -version = "0.11.12" +version = "0.11.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab33ec92f677585af6d88c65593ae2375adde54efdbf16d597f2cbc7a6d368ff" +checksum = "8b8497c313fd43ab992087548117643f6fcd935cbf36f176ffda0aacf9591734" dependencies = [ "serde", ] @@ -3766,20 +3757,20 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.193" +version = "1.0.195" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" +checksum = "46fe8f8603d81ba86327b23a2e9cdf49e1255fb94a4c5f297f6ee0547178ea2c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.48", ] [[package]] name = "serde_json" -version = "1.0.108" +version = "1.0.111" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" +checksum = "176e46fa42316f18edd598015a5166857fc835ec732f5215eac6b7bdbf0a84f4" dependencies = [ "indexmap 2.1.0", "itoa", @@ -3789,13 +3780,13 @@ dependencies = [ [[package]] name = "serde_repr" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3081f5ffbb02284dda55132aa26daecedd7372a42417bbbab6f14ab7d6bb9145" +checksum = "0b2e6b945e9d3df726b65d6ee24060aff8e3533d431f677a9695db04eff9dfdb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.48", ] [[package]] @@ -3816,16 +3807,16 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.4.0" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64cd236ccc1b7a29e7e2739f27c0b2dd199804abc4290e32f59f3b68d6405c23" +checksum = "f58c3a1b3e418f61c25b2aeb43fc6c95eaa252b8cecdda67f401943e9e08d33f" dependencies = [ - "base64 0.21.5", + "base64 0.21.7", "chrono", "hex", "serde", "serde_json", - "serde_with_macros 3.4.0", + "serde_with_macros 3.5.0", "time", ] @@ -3838,19 +3829,19 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.48", ] [[package]] name = "serde_with_macros" -version = "3.4.0" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93634eb5f75a2323b16de4748022ac4297f9e76b6dced2be287a099f41b5e788" +checksum = "d2068b437a31fc68f25dd7edc296b078f04b45145c199d8eed9866e45f1ff274" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.48", ] [[package]] @@ -3875,9 +3866,9 @@ dependencies = [ [[package]] name = "shlex" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7cee0529a6d40f580e7a5e6c495c8fbfe21b7b52795ed4bb5e62cdf92bc6380" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" @@ -3945,9 +3936,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.11.2" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" +checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" [[package]] name = "socket2" @@ -4065,9 +4056,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.41" +version = "2.0.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c8b28c477cc3bf0e7966561e3460130e1255f7a1cf71931075f1c5e7a7e269" +checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" dependencies = [ "proc-macro2", "quote", @@ -4083,7 +4074,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.48", ] [[package]] @@ -4118,42 +4109,21 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tempfile" -version = "3.8.1" +version = "3.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" +checksum = "01ce4141aa927a6d1bd34a041795abd0db1cccba5d5f24b009f694bdf3a1f3fa" dependencies = [ "cfg-if", "fastrand 2.0.1", "redox_syscall", - "rustix 0.38.28", - "windows-sys 0.48.0", -] - -[[package]] -name = "tenderdash-abci" -version = "0.14.0-dev.1" -source = "git+https://github.com/dashpay/rs-tenderdash-abci?tag=v0.14.0-dev.2#6ebfaa31052f7ad538d6589323e5daf7e5e55999" -dependencies = [ - "bytes", - "futures", - "hex", - "lhash", - "prost 0.12.3", - "semver", - "tenderdash-proto 0.14.0-dev.1 (git+https://github.com/dashpay/rs-tenderdash-abci?tag=v0.14.0-dev.2)", - "thiserror", - "tokio", - "tokio-util", - "tracing", - "tracing-subscriber", - "url", - "uuid 1.6.1", + "rustix 0.38.30", + "windows-sys 0.52.0", ] [[package]] name = "tenderdash-abci" -version = "0.14.0-dev.1" -source = "git+https://github.com/dashpay/rs-tenderdash-abci#b4df6543efb0457a477db30153131495da1b8bbb" +version = "0.14.0-dev.5" +source = "git+https://github.com/dashpay/rs-tenderdash-abci?tag=v0.14.0-dev.5#556f3a9b6724bdbe44acf8045cd87144a997bccb" dependencies = [ "bytes", "futures", @@ -4161,20 +4131,20 @@ dependencies = [ "lhash", "prost 0.12.3", "semver", - "tenderdash-proto 0.14.0-dev.1 (git+https://github.com/dashpay/rs-tenderdash-abci)", + "tenderdash-proto", "thiserror", "tokio", "tokio-util", "tracing", "tracing-subscriber", "url", - "uuid 1.6.1", + "uuid 1.7.0", ] [[package]] name = "tenderdash-proto" -version = "0.14.0-dev.1" -source = "git+https://github.com/dashpay/rs-tenderdash-abci?tag=v0.14.0-dev.2#6ebfaa31052f7ad538d6589323e5daf7e5e55999" +version = "0.14.0-dev.5" +source = "git+https://github.com/dashpay/rs-tenderdash-abci?tag=v0.14.0-dev.5#556f3a9b6724bdbe44acf8045cd87144a997bccb" dependencies = [ "bytes", "chrono", @@ -4185,46 +4155,14 @@ dependencies = [ "prost 0.12.3", "serde", "subtle-encoding", - "tenderdash-proto-compiler 0.14.0-dev.1 (git+https://github.com/dashpay/rs-tenderdash-abci?tag=v0.14.0-dev.2)", + "tenderdash-proto-compiler", "time", ] -[[package]] -name = "tenderdash-proto" -version = "0.14.0-dev.1" -source = "git+https://github.com/dashpay/rs-tenderdash-abci#b4df6543efb0457a477db30153131495da1b8bbb" -dependencies = [ - "bytes", - "chrono", - "derive_more", - "flex-error", - "num-derive", - "num-traits", - "prost 0.12.3", - "serde", - "subtle-encoding", - "tenderdash-proto-compiler 0.14.0-dev.1 (git+https://github.com/dashpay/rs-tenderdash-abci)", - "time", -] - -[[package]] -name = "tenderdash-proto-compiler" -version = "0.14.0-dev.1" -source = "git+https://github.com/dashpay/rs-tenderdash-abci?tag=v0.14.0-dev.2#6ebfaa31052f7ad538d6589323e5daf7e5e55999" -dependencies = [ - "fs_extra", - "prost-build 0.12.3", - "regex", - "tempfile", - "ureq", - "walkdir", - "zip", -] - [[package]] name = "tenderdash-proto-compiler" -version = "0.14.0-dev.1" -source = "git+https://github.com/dashpay/rs-tenderdash-abci#b4df6543efb0457a477db30153131495da1b8bbb" +version = "0.14.0-dev.5" +source = "git+https://github.com/dashpay/rs-tenderdash-abci?tag=v0.14.0-dev.5#556f3a9b6724bdbe44acf8045cd87144a997bccb" dependencies = [ "fs_extra", "prost-build 0.12.3", @@ -4237,9 +4175,9 @@ dependencies = [ [[package]] name = "termcolor" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff1bc3d3f05aff0403e8ac0d92ced918ec05b666a43f83297ccef5bea8a3d449" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" dependencies = [ "winapi-util", ] @@ -4283,22 +4221,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.51" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f11c217e1416d6f036b870f14e0413d480dbf28edbee1f877abaf0206af43bb7" +checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.51" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01742297787513b79cf8e29d1056ede1313e2420b7b3b15d0a768b4921f549df" +checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.48", ] [[package]] @@ -4313,9 +4251,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" +checksum = "f657ba42c3f86e7680e53c8cd3af8abbe56b5491790b46e22e19c0d57463583e" dependencies = [ "deranged", "itoa", @@ -4333,9 +4271,9 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20" +checksum = "26197e33420244aeb70c3e8c78376ca46571bc4e701e4791c2cd9f57dcb3a43f" dependencies = [ "time-core", ] @@ -4367,9 +4305,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.35.0" +version = "1.35.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841d45b238a16291a4e1584e61820b8ae57d696cc5015c459c229ccc6990cc1c" +checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104" dependencies = [ "backtrace", "bytes", @@ -4402,7 +4340,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.48", ] [[package]] @@ -4455,9 +4393,9 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.3" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" [[package]] name = "toml_edit" @@ -4472,9 +4410,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.20.2" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03" dependencies = [ "indexmap 2.1.0", "toml_datetime", @@ -4490,7 +4428,7 @@ dependencies = [ "async-stream", "async-trait", "axum", - "base64 0.21.5", + "base64 0.21.7", "bytes", "futures-core", "futures-util", @@ -4577,7 +4515,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.48", ] [[package]] @@ -4676,9 +4614,9 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.14" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f2528f27a9eb2b21e69c95319b30bd0efd85d09c379741b0f78ea1d86be2416" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" [[package]] name = "unicode-ident" @@ -4731,7 +4669,7 @@ version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8cdd25c339e200129fe4de81451814e5228c9b771d57378817d6117cc2b3f97" dependencies = [ - "base64 0.21.5", + "base64 0.21.7", "flate2", "log", "once_cell", @@ -4766,9 +4704,9 @@ checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" [[package]] name = "uuid" -version = "1.6.1" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" +checksum = "f00cc9702ca12d3c81455259621e676d0f7251cec66a21e98fe2e9a37db93b2a" dependencies = [ "getrandom", "rand", @@ -4856,7 +4794,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.48", "wasm-bindgen-shared", ] @@ -4890,7 +4828,7 @@ checksum = "e128beba882dd1eb6200e1dc92ae6c5dbaa4311aa7bb211ca035779e5efc39f8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.48", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -4909,7 +4847,7 @@ dependencies = [ "async-trait", "dpp", "hex", - "itertools", + "itertools 0.10.5", "js-sys", "log", "num_enum", @@ -4959,7 +4897,7 @@ dependencies = [ "either", "home", "once_cell", - "rustix 0.38.28", + "rustix 0.38.30", ] [[package]] @@ -4995,11 +4933,11 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-core" -version = "0.51.1" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.48.5", + "windows-targets 0.52.0", ] [[package]] @@ -5136,9 +5074,9 @@ checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" [[package]] name = "winnow" -version = "0.5.28" +version = "0.5.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c830786f7720c2fd27a1a0e27a709dbd3c4d009b56d098fc742d4f4eab91fe2" +checksum = "b7cf47b659b318dccbd69cc4797a39ae128f533dce7902a1096044d1967b9c16" dependencies = [ "memchr", ] @@ -5171,22 +5109,22 @@ checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" [[package]] name = "zerocopy" -version = "0.7.31" +version = "0.7.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c4061bedbb353041c12f413700357bec76df2c7e2ca8e4df8bac24c6bf68e3d" +checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.31" +version = "0.7.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3c129550b3e6de3fd0ba67ba5c81818f9805e58b8d7fee80a3a59d2c9fc601a" +checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.48", ] [[package]] diff --git a/Dockerfile b/Dockerfile index 756e0ae73b..497877cd49 100644 --- a/Dockerfile +++ b/Dockerfile @@ -236,7 +236,7 @@ RUN mkdir -p /var/log/dash \ /var/lib/dash/rs-drive-abci/db COPY --from=build-drive-abci /artifacts/drive-abci /usr/bin/drive-abci -COPY --from=build-drive-abci /platform/packages/rs-drive-abci/.env.example /var/lib/dash/rs-drive-abci/.env +COPY --from=build-drive-abci /platform/packages/rs-drive-abci/.env.mainnet /var/lib/dash/rs-drive-abci/.env # Create a volume VOLUME /var/lib/dash/rs-drive-abci/db diff --git a/packages/dapi-grpc/Cargo.toml b/packages/dapi-grpc/Cargo.toml index 0b07aa2426..5936b3fce8 100644 --- a/packages/dapi-grpc/Cargo.toml +++ b/packages/dapi-grpc/Cargo.toml @@ -30,7 +30,7 @@ tonic = { version = "0.9.2", features = [ ], default-features = false } serde = { version = "1.0.171", optional = true, features = ["derive"] } serde_bytes = { version = "0.11.12", optional = true } -tenderdash-proto = { git = "https://github.com/dashpay/rs-tenderdash-abci" } +tenderdash-proto = { git = "https://github.com/dashpay/rs-tenderdash-abci", tag = "v0.14.0-dev.5" } dapi-grpc-macros = { path = "../rs-dapi-grpc-macros" } platform-version = { path = "../rs-platform-version" } diff --git a/packages/dashmate/configs/defaults/getBaseConfigFactory.js b/packages/dashmate/configs/defaults/getBaseConfigFactory.js index 2339a592cd..e7d67da255 100644 --- a/packages/dashmate/configs/defaults/getBaseConfigFactory.js +++ b/packages/dashmate/configs/defaults/getBaseConfigFactory.js @@ -168,6 +168,11 @@ export default function getBaseConfigFactory(homeDir) { validatorSet: { llmqType: 4, }, + chainLock: { + llmqType: 2, + dkgInterval: 288, + llmqSize: 400, + }, epochTime: 788400, }, tenderdash: { diff --git a/packages/dashmate/configs/defaults/getLocalConfigFactory.js b/packages/dashmate/configs/defaults/getLocalConfigFactory.js index 56b87efabc..b546251196 100644 --- a/packages/dashmate/configs/defaults/getLocalConfigFactory.js +++ b/packages/dashmate/configs/defaults/getLocalConfigFactory.js @@ -68,6 +68,11 @@ export default function getLocalConfigFactory(getBaseConfig) { validatorSet: { llmqType: 106, }, + chainLock: { + llmqType: 100, + dkgInterval: 24, + llmqSize: 3, + }, }, }, }, diff --git a/packages/dashmate/configs/defaults/getTestnetConfigFactory.js b/packages/dashmate/configs/defaults/getTestnetConfigFactory.js index 7ea6d6f3f3..83bdb95383 100644 --- a/packages/dashmate/configs/defaults/getTestnetConfigFactory.js +++ b/packages/dashmate/configs/defaults/getTestnetConfigFactory.js @@ -53,6 +53,11 @@ export default function getTestnetConfigFactory(homeDir, getBaseConfig) { validatorSet: { llmqType: 6, }, + chainLock: { + llmqType: 1, + dkgInterval: 24, + llmqSize: 50, + }, }, tenderdash: { p2p: { diff --git a/packages/dashmate/configs/getConfigFileMigrationsFactory.js b/packages/dashmate/configs/getConfigFileMigrationsFactory.js index e13d4acc19..b68d792c31 100644 --- a/packages/dashmate/configs/getConfigFileMigrationsFactory.js +++ b/packages/dashmate/configs/getConfigFileMigrationsFactory.js @@ -413,6 +413,15 @@ export default function getConfigFileMigrationsFactory(homeDir, defaultConfigs) options.platform.drive.tenderdash.genesis = defaultConfigs.get(name).get('platform.drive.tenderdash.genesis'); } options.platform.dapi.api.docker.deploy = base.get('platform.dapi.api.docker.deploy'); + + let baseConfigName = name; + if (options.group !== null && defaultConfigs.has(options.group)) { + baseConfigName = options.group; + } else if (!defaultConfigs.has(baseConfigName)) { + baseConfigName = 'testnet'; + } + + options.platform.drive.abci.chainLock = defaultConfigs.get(baseConfigName).get('platform.drive.abci.chainLock'); }); return configFile; diff --git a/packages/dashmate/docker-compose.yml b/packages/dashmate/docker-compose.yml index 5dcdba9f8f..d5edfc86ff 100644 --- a/packages/dashmate/docker-compose.yml +++ b/packages/dashmate/docker-compose.yml @@ -47,14 +47,11 @@ services: volumes: - drive_abci_data:/var/lib/dash/rs-drive-abci/db environment: - - BLOCK_SPACING_MS=3000 # TODO: sync with tenderdash - CHAIN_ID=${PLATFORM_DRIVE_TENDERDASH_GENESIS_CHAIN_ID:-devnet} - CORE_JSON_RPC_USERNAME=${CORE_RPC_USER:?err} - CORE_JSON_RPC_PASSWORD=${CORE_RPC_PASSWORD:?err} - CORE_JSON_RPC_HOST=core - CORE_JSON_RPC_PORT=${CORE_RPC_PORT:?err} - - CORE_ZMQ_HOST=core - - CORE_ZMQ_PORT=29998 - DPNS_MASTER_PUBLIC_KEY=${PLATFORM_DPNS_MASTER_PUBLIC_KEY} - DPNS_SECOND_PUBLIC_KEY=${PLATFORM_DPNS_SECOND_PUBLIC_KEY} - DASHPAY_MASTER_PUBLIC_KEY=${PLATFORM_DASHPAY_MASTER_PUBLIC_KEY} @@ -66,10 +63,10 @@ services: - MASTERNODE_REWARD_SHARES_SECOND_PUBLIC_KEY=${PLATFORM_MASTERNODE_REWARD_SHARES_SECOND_PUBLIC_KEY} - WITHDRAWALS_MASTER_PUBLIC_KEY=${PLATFORM_WITHDRAWALS_MASTER_PUBLIC_KEY} - WITHDRAWALS_SECOND_PUBLIC_KEY=${PLATFORM_WITHDRAWALS_SECOND_PUBLIC_KEY} - - QUORUM_SIZE=5 # TODO: sync with Tenderdash - - QUORUM_TYPE=${PLATFORM_DRIVE_ABCI_VALIDATOR_SET_LLMQ_TYPE:?err} - - NETWORK=${NETWORK:?err} - - TENDERDASH_P2P_PORT=${PLATFORM_DRIVE_TENDERDASH_P2P_PORT:?err} + - VALIDATOR_SET_QUORUM_TYPE=${PLATFORM_DRIVE_ABCI_VALIDATOR_SET_LLMQ_TYPE:?err} + - CHAIN_LOCK_QUORUM_TYPE=${PLATFORM_DRIVE_ABCI_CHAIN_LOCK_LLMQ_TYPE:?err} + - CHAIN_LOCK_QUORUM_WINDOW=${PLATFORM_DRIVE_ABCI_CHAIN_LOCK_DKG_INTERVAL:?err} + - CHAIN_LOCK_QUORUM_SIZE=${PLATFORM_DRIVE_ABCI_CHAIN_LOCK_LLMQ_SIZE:?err} stop_grace_period: 30s env_file: # Logger settings diff --git a/packages/dashmate/src/config/configJsonSchema.js b/packages/dashmate/src/config/configJsonSchema.js index 90d2b9fe0c..3892fc6fe0 100644 --- a/packages/dashmate/src/config/configJsonSchema.js +++ b/packages/dashmate/src/config/configJsonSchema.js @@ -525,13 +525,33 @@ export default { additionalProperties: false, required: ['llmqType'], }, + chainLock: { + type: 'object', + properties: { + llmqType: { + type: 'number', + // https://github.com/dashpay/dashcore-lib/blob/843176fed9fc81feae43ccf319d99e2dd942fe1f/lib/constants/index.js#L50-L99 + enum: [1, 2, 3, 4, 5, 6, 100, 101, 102, 103, 104, 105, 106, 107], + }, + llmqSize: { + type: 'integer', + minimum: 0, + }, + dkgInterval: { + type: 'integer', + minimum: 0, + }, + }, + additionalProperties: false, + required: ['llmqType', 'llmqSize', 'dkgInterval'], + }, epochTime: { type: 'integer', minimum: 180, }, }, additionalProperties: false, - required: ['docker', 'logs', 'validatorSet', 'epochTime'], + required: ['docker', 'logs', 'validatorSet', 'chainLock', 'epochTime'], }, tenderdash: { type: 'object', diff --git a/packages/rs-drive-abci/.env.local b/packages/rs-drive-abci/.env.local new file mode 100644 index 0000000000..c131e8c240 --- /dev/null +++ b/packages/rs-drive-abci/.env.local @@ -0,0 +1,63 @@ +# ABCI host and port to listen +ABCI_BIND_ADDRESS="tcp://0.0.0.0:26658" +ABCI_PROMETHEUS_BIND_ADDRESS="http://0.0.0.0:29090" + +# stderr logging for humans +ABCI_LOG_STDOUT_DESTINATION=stdout +ABCI_LOG_STDOUT_LEVEL=info +ABCI_LOG_STDOUT_FORMAT=pretty +ABCI_LOG_STDOUT_COLOR=true + +DB_PATH=/tmp/db + +# Cache size for Data Contracts +DATA_CONTRACTS_GLOBAL_CACHE_SIZE=500 +DATA_CONTRACTS_BLOCK_CACHE_SIZE=200 + +# DashCore JSON-RPC host, port and credentials +# Read more: https://dashcore.readme.io/docs/core-api-ref-remote-procedure-calls +CORE_JSON_RPC_HOST=127.0.0.1 +CORE_JSON_RPC_PORT=9998 +CORE_JSON_RPC_USERNAME=dashrpc +CORE_JSON_RPC_PASSWORD=password + +INITIAL_CORE_CHAINLOCKED_HEIGHT=1243 + +# https://github.com/dashevo/dashcore-lib/blob/286c33a9d29d33f05d874c47a9b33764a0be0cf1/lib/constants/index.js#L42-L57 +VALIDATOR_SET_QUORUM_TYPE=llmq_test +VALIDATOR_SET_QUORUM_SIZE=3 +VALIDATOR_SET_ROTATION_BLOCK_COUNT=64 + +CHAIN_LOCK_QUORUM_TYPE=llmq_test +CHAIN_LOCK_QUORUM_WINDOW=24 +CHAIN_LOCK_QUORUM_SIZE=3 + +# DPNS Contract + +DPNS_MASTER_PUBLIC_KEY=02649a81b760e8635dd3a4fad8911388ed09d7c1680558a890180d4edc8bcece7e +DPNS_SECOND_PUBLIC_KEY=03f5ea3ab4bf594c28997eb8f83873532275ac2edd36e586b137ed42d15d510948 + +# Dashpay Contract + +DASHPAY_MASTER_PUBLIC_KEY=022d6d70c9d24d03904713db17fb74c9201801ba0e3aed0f5d91e89df388e94aa6 +DASHPAY_SECOND_PUBLIC_KEY=028c0a26c87b2e7f1aebbbeace9e687d774e037f5b50a6905b5f6fa24495b502cd + +# Feature flags contract + +FEATURE_FLAGS_MASTER_PUBLIC_KEY=034ee04c509083ecd09e76fa53e0b5331b39120c19607cd04c4f167707dbb42302 +FEATURE_FLAGS_SECOND_PUBLIC_KEY=03c755ae1b79dbcc79020aad3ccdfcb142fc6e74f1afc220fca1e275a87aa12cf8 + +# Masternode reward shares contract + +MASTERNODE_REWARD_SHARES_MASTER_PUBLIC_KEY=02099cc210c7b6c7f566099046ddc92615342db326184940bf3811026ea328c85e +MASTERNODE_REWARD_SHARES_SECOND_PUBLIC_KEY=02bf55f97f189895da29824781053140ee66b2bf47760246504fbe502985096af5 + +# Withdrawals contract + +WITHDRAWALS_MASTER_PUBLIC_KEY=027057cdf58628635ef7b75e6b6c90dd996a16929cd68130e16b9328d429e5e03a +WITHDRAWALS_SECOND_PUBLIC_KEY=022084d827fea4823a69aa7c8d3e02fe780eaa0ef1e5e9841af395ba7e40465ab6 + +EPOCH_TIME_LENGTH_S=788400 + +CHAIN_ID=devnet +BLOCK_SPACING_MS=5000 diff --git a/packages/rs-drive-abci/.env.example b/packages/rs-drive-abci/.env.mainnet similarity index 87% rename from packages/rs-drive-abci/.env.example rename to packages/rs-drive-abci/.env.mainnet index 6bde9c76a6..a6733bc78b 100644 --- a/packages/rs-drive-abci/.env.example +++ b/packages/rs-drive-abci/.env.mainnet @@ -10,9 +10,6 @@ ABCI_LOG_STDOUT_COLOR=true DB_PATH=/tmp/db -# GroveDB database file -GROVEDB_LATEST_FILE=${DB_PATH}/latest_state - # Cache size for Data Contracts DATA_CONTRACTS_GLOBAL_CACHE_SIZE=500 DATA_CONTRACTS_BLOCK_CACHE_SIZE=200 @@ -29,16 +26,15 @@ CORE_ZMQ_HOST=127.0.0.1 CORE_ZMQ_PORT=29998 CORE_ZMQ_CONNECTION_RETRIES=16 -NETWORK=testnet - INITIAL_CORE_CHAINLOCKED_HEIGHT=1243 # https://github.com/dashevo/dashcore-lib/blob/286c33a9d29d33f05d874c47a9b33764a0be0cf1/lib/constants/index.js#L42-L57 -VALIDATOR_SET_LLMQ_TYPE=100 -VALIDATOR_SET_QUORUM_ROTATION_BLOCK_COUNT=64 +VALIDATOR_SET_LLMQ_TYPE=llmq_100_67 +VALIDATOR_SET_QUORUM_SIZE=100 +VALIDATOR_SET_ROTATION_BLOCK_COUNT=64 -DKG_INTERVAL=24 -MIN_QUORUM_VALID_MEMBERS=3 +CHAIN_LOCK_QUORUM_TYPE=llmq_400_60 +CHAIN_LOCK_QUORUM_WINDOW=288 # DPNS Contract @@ -65,10 +61,7 @@ MASTERNODE_REWARD_SHARES_SECOND_PUBLIC_KEY=02bf55f97f189895da29824781053140ee66b WITHDRAWALS_MASTER_PUBLIC_KEY=027057cdf58628635ef7b75e6b6c90dd996a16929cd68130e16b9328d429e5e03a WITHDRAWALS_SECOND_PUBLIC_KEY=022084d827fea4823a69aa7c8d3e02fe780eaa0ef1e5e9841af395ba7e40465ab6 -TENDERDASH_P2P_PORT=26656 - EPOCH_TIME_LENGTH_S=788400 -QUORUM_SIZE=5 -QUORUM_TYPE=llmq_25_67 + CHAIN_ID=devnet -BLOCK_SPACING_MS=3000 +BLOCK_SPACING_MS=5000 diff --git a/packages/rs-drive-abci/.env.testnet b/packages/rs-drive-abci/.env.testnet new file mode 100644 index 0000000000..202a78efaf --- /dev/null +++ b/packages/rs-drive-abci/.env.testnet @@ -0,0 +1,62 @@ +# ABCI host and port to listen +ABCI_BIND_ADDRESS="tcp://0.0.0.0:26658" +ABCI_PROMETHEUS_BIND_ADDRESS="http://0.0.0.0:29090" + +# stderr logging for humans +ABCI_LOG_STDOUT_DESTINATION=stdout +ABCI_LOG_STDOUT_LEVEL=info +ABCI_LOG_STDOUT_FORMAT=pretty +ABCI_LOG_STDOUT_COLOR=true + +DB_PATH=/tmp/db + +# Cache size for Data Contracts +DATA_CONTRACTS_GLOBAL_CACHE_SIZE=500 +DATA_CONTRACTS_BLOCK_CACHE_SIZE=200 + +# DashCore JSON-RPC host, port and credentials +# Read more: https://dashcore.readme.io/docs/core-api-ref-remote-procedure-calls +CORE_JSON_RPC_HOST=127.0.0.1 +CORE_JSON_RPC_PORT=9998 +CORE_JSON_RPC_USERNAME=dashrpc +CORE_JSON_RPC_PASSWORD=password + +INITIAL_CORE_CHAINLOCKED_HEIGHT=1243 + +# https://github.com/dashevo/dashcore-lib/blob/286c33a9d29d33f05d874c47a9b33764a0be0cf1/lib/constants/index.js#L42-L57 +VALIDATOR_SET_LLMQ_TYPE=llmq_25_67 +VALIDATOR_SET_QUORUM_SIZE=25 +VALIDATOR_SET_ROTATION_BLOCK_COUNT=64 + +CHAIN_LOCK_QUORUM_TYPE=llmq_50_60 +CHAIN_LOCK_QUORUM_WINDOW=24 + +# DPNS Contract + +DPNS_MASTER_PUBLIC_KEY=02649a81b760e8635dd3a4fad8911388ed09d7c1680558a890180d4edc8bcece7e +DPNS_SECOND_PUBLIC_KEY=03f5ea3ab4bf594c28997eb8f83873532275ac2edd36e586b137ed42d15d510948 + +# Dashpay Contract + +DASHPAY_MASTER_PUBLIC_KEY=022d6d70c9d24d03904713db17fb74c9201801ba0e3aed0f5d91e89df388e94aa6 +DASHPAY_SECOND_PUBLIC_KEY=028c0a26c87b2e7f1aebbbeace9e687d774e037f5b50a6905b5f6fa24495b502cd + +# Feature flags contract + +FEATURE_FLAGS_MASTER_PUBLIC_KEY=034ee04c509083ecd09e76fa53e0b5331b39120c19607cd04c4f167707dbb42302 +FEATURE_FLAGS_SECOND_PUBLIC_KEY=03c755ae1b79dbcc79020aad3ccdfcb142fc6e74f1afc220fca1e275a87aa12cf8 + +# Masternode reward shares contract + +MASTERNODE_REWARD_SHARES_MASTER_PUBLIC_KEY=02099cc210c7b6c7f566099046ddc92615342db326184940bf3811026ea328c85e +MASTERNODE_REWARD_SHARES_SECOND_PUBLIC_KEY=02bf55f97f189895da29824781053140ee66b2bf47760246504fbe502985096af5 + +# Withdrawals contract + +WITHDRAWALS_MASTER_PUBLIC_KEY=027057cdf58628635ef7b75e6b6c90dd996a16929cd68130e16b9328d429e5e03a +WITHDRAWALS_SECOND_PUBLIC_KEY=022084d827fea4823a69aa7c8d3e02fe780eaa0ef1e5e9841af395ba7e40465ab6 + +EPOCH_TIME_LENGTH_S=788400 + +CHAIN_ID=devnet +BLOCK_SPACING_MS=5000 diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index 9d8657b555..ea9f1bf565 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -58,7 +58,7 @@ tracing-subscriber = { version = "0.3.16", default-features = false, features = "tracing-log", ], optional = false } atty = { version = "0.2.14", optional = false } -tenderdash-abci = { git = "https://github.com/dashpay/rs-tenderdash-abci", tag = "v0.14.0-dev.2" } +tenderdash-abci = { git = "https://github.com/dashpay/rs-tenderdash-abci", tag = "v0.14.0-dev.5" } lazy_static = "1.4.0" itertools = { version = "0.10.5" } file-rotate = { version = "0.7.3" } diff --git a/packages/rs-drive-abci/src/abci/error.rs b/packages/rs-drive-abci/src/abci/error.rs index ce2016900c..800ee6eaed 100644 --- a/packages/rs-drive-abci/src/abci/error.rs +++ b/packages/rs-drive-abci/src/abci/error.rs @@ -45,6 +45,14 @@ pub enum AbciError { #[error("bad commit signature: {0}")] BadCommitSignature(String), + /// The chain lock received was invalid + #[error("invalid chain lock: {0}")] + InvalidChainLock(String), + + /// The chain lock received was invalid + #[error("chain lock is for a block not known by core: {0}")] + ChainLockedBlockNotKnownByCore(String), + /// Error returned by Tenderdash-abci library #[error("tenderdash: {0}")] Tenderdash(#[from] tenderdash_abci::Error), diff --git a/packages/rs-drive-abci/src/abci/handler/mod.rs b/packages/rs-drive-abci/src/abci/handler/mod.rs index 2c96f03ad1..fc935446f6 100644 --- a/packages/rs-drive-abci/src/abci/handler/mod.rs +++ b/packages/rs-drive-abci/src/abci/handler/mod.rs @@ -52,6 +52,7 @@ use tenderdash_abci::proto::abci::{ RequestProcessProposal, RequestQuery, ResponseCheckTx, ResponseFinalizeBlock, ResponseInitChain, ResponsePrepareProposal, ResponseProcessProposal, ResponseQuery, TxRecord, }; +use tenderdash_abci::proto::types::CoreChainLock; use tenderdash_abci::proto::types::VoteExtensionType; use super::AbciError; @@ -95,7 +96,7 @@ where } let state_app_hash = state_guard - .last_block_app_hash() + .last_committed_block_app_hash() .map(|app_hash| app_hash.to_vec()) .unwrap_or_default(); @@ -104,7 +105,7 @@ where let response = proto::ResponseInfo { data: "".to_string(), app_version: latest_platform_version.protocol_version as u64, - last_block_height: state_guard.last_block_height() as i64, + last_block_height: state_guard.last_committed_block_height() as i64, version: env!("CARGO_PKG_VERSION").to_string(), last_block_app_hash: state_app_hash.clone(), }; @@ -115,7 +116,7 @@ where block_version = request.block_version, p2p_version = request.p2p_version, app_hash = hex::encode(state_app_hash), - height = state_guard.last_block_height(), + height = state_guard.last_committed_block_height(), "Handshake with consensus engine", ); @@ -179,9 +180,15 @@ where // propose one // This is done before all else + let state = self.platform.state.read().unwrap(); + + let last_committed_core_height = state.last_committed_core_height(); + let core_chain_lock_update = match self.platform.core_rpc.get_best_chain_lock() { Ok(latest_chain_lock) => { - if request.core_chain_locked_height < latest_chain_lock.core_block_height { + if state.last_committed_block_info().is_none() + || latest_chain_lock.block_height > last_committed_core_height + { Some(latest_chain_lock) } else { None @@ -190,6 +197,8 @@ where Err(_) => None, }; + drop(state); + // Filter out transactions exceeding max_block_size let mut transactions_exceeding_max_block_size = Vec::new(); { @@ -217,10 +226,12 @@ where // todo: find a way to re-enable this without destroying CI tracing::debug!( "propose chain lock update to height {} at block {}", - core_chain_lock_update.core_block_height, + core_chain_lock_update.block_height, request.height ); - block_proposal.core_chain_locked_height = core_chain_lock_update.core_block_height; + block_proposal.core_chain_locked_height = core_chain_lock_update.block_height; + } else { + block_proposal.core_chain_locked_height = last_committed_core_height; } // Prepare transaction @@ -245,7 +256,7 @@ where // Running the proposal executes all the state transitions for the block let run_result = self .platform - .run_block_proposal(block_proposal, transaction)?; + .run_block_proposal(block_proposal, true, transaction)?; if !run_result.is_valid() { // This is a system error, because we are proposing @@ -328,7 +339,11 @@ where tx_results, app_hash: app_hash.to_vec(), tx_records, - core_chain_lock_update, + core_chain_lock_update: core_chain_lock_update.map(|chain_lock| CoreChainLock { + core_block_hash: chain_lock.block_hash.to_byte_array().to_vec(), + core_block_height: chain_lock.block_height, + signature: chain_lock.signature.to_bytes().to_vec(), + }), validator_set_update, // TODO: implement consensus param updates consensus_param_updates: None, @@ -372,7 +387,7 @@ where let mut drop_block_execution_context = false; if let Some(block_execution_context) = block_execution_context_guard.as_mut() { - // We are already in a block + // We are already in a block, or in init chain. // This only makes sense if we were the proposer unless we are at a future round if block_execution_context.block_state_info().round() != (request.round as u32) { // We were not the proposer, and we should process something new @@ -511,20 +526,16 @@ where }; let transaction = transaction_guard.as_ref().unwrap(); - // We can take the core chain lock update here because it won't be used anywhere else - if let Some(_c) = request.core_chain_lock_update.take() { - //todo: if there is a core chain lock update we need to validate it - } - // Running the proposal executes all the state transitions for the block - let run_result = self - .platform - .run_block_proposal((&request).try_into()?, transaction)?; + let run_result = + self.platform + .run_block_proposal((&request).try_into()?, false, transaction)?; if !run_result.is_valid() { // This was an error running this proposal, tell tenderdash that the block isn't valid let response = ResponseProcessProposal { status: proto::response_process_proposal::ProposalStatus::Reject.into(), + app_hash: [0; 32].to_vec(), // we must send 32 bytes ..Default::default() }; @@ -880,7 +891,7 @@ where key: vec![], value: vec![], proof_ops: None, - height: self.platform.state.read().unwrap().height() as i64, + height: self.platform.state.read().unwrap().last_committed_height() as i64, codespace: "".to_string(), }; @@ -916,7 +927,7 @@ where key: vec![], value: data, proof_ops: None, - height: self.platform.state.read().unwrap().height() as i64, + height: self.platform.state.read().unwrap().last_committed_height() as i64, codespace: "".to_string(), }; diff --git a/packages/rs-drive-abci/src/config.rs b/packages/rs-drive-abci/src/config.rs index f325924e25..1667097503 100644 --- a/packages/rs-drive-abci/src/config.rs +++ b/packages/rs-drive-abci/src/config.rs @@ -76,41 +76,12 @@ impl Default for CoreRpcConfig { } /// Configuration for Dash Core related things -#[derive(Clone, Debug, Serialize, Deserialize)] +#[derive(Clone, Debug, Serialize, Deserialize, Default)] #[serde(default)] pub struct CoreConfig { /// Core RPC config #[serde(flatten)] pub rpc: CoreRpcConfig, - - /// DKG interval - pub dkg_interval: String, // String due to https://github.com/softprops/envy/issues/26 - /// Minimum number of valid members to use the quorum - pub min_quorum_valid_members: String, // String due to https://github.com/softprops/envy/issues/26 -} - -impl CoreConfig { - /// return dkg_interval - pub fn dkg_interval(&self) -> u32 { - self.dkg_interval - .parse::() - .expect("DKG_INTERVAL is not an int") - } - /// Returns minimal number of quorum members - pub fn min_quorum_valid_members(&self) -> u32 { - self.min_quorum_valid_members - .parse::() - .expect("MIN_QUORUM_VALID_MEMBERS is not an int") - } -} -impl Default for CoreConfig { - fn default() -> Self { - Self { - dkg_interval: String::from("24"), - min_quorum_valid_members: String::from("3"), - rpc: Default::default(), - } - } } /// Configuration of the execution part of Dash Platform. @@ -128,10 +99,10 @@ pub struct ExecutionConfig { /// How often should quorums change? #[serde( - default = "ExecutionConfig::default_validator_set_quorum_rotation_block_count", + default = "ExecutionConfig::default_validator_set_rotation_block_count", deserialize_with = "from_str_or_number" )] - pub validator_set_quorum_rotation_block_count: u32, + pub validator_set_rotation_block_count: u32, /// How long in seconds should an epoch last /// It might last a lot longer if the chain is halted @@ -190,12 +161,23 @@ pub struct PlatformConfig { pub execution: ExecutionConfig, /// The default quorum type - pub quorum_type: String, + pub validator_set_quorum_type: String, + + /// The quorum type used for verifying chain locks + pub chain_lock_quorum_type: String, + + /// The validator set quorum size + pub validator_set_quorum_size: u16, - /// The default quorum size - pub quorum_size: u16, + /// The chain lock quorum size + pub chain_lock_quorum_size: u16, - // todo: this should probably be coming from Tenderdash config + /// The window for chain locks + /// On Mainnet Chain Locks are signed using 400_60: One quorum in every 288 blocks and activeQuorumCount is 4. + /// On Testnet Chain Locks are signed using 50_60: One quorum in every 24 blocks and activeQuorumCount is 24. + pub chain_lock_quorum_window: u32, + + // todo: this should probably be coming from Tenderdash config. It's a test only param /// Approximately how often are blocks produced pub block_spacing_ms: u64, @@ -221,7 +203,7 @@ impl ExecutionConfig { true } - fn default_validator_set_quorum_rotation_block_count() -> u32 { + fn default_validator_set_rotation_block_count() -> u32 { 15 } @@ -237,15 +219,36 @@ impl PlatformConfig { } /// Return type of quorum - pub fn quorum_type(&self) -> QuorumType { - let found = if let Ok(t) = self.quorum_type.trim().parse::() { + pub fn validator_set_quorum_type(&self) -> QuorumType { + let found = if let Ok(t) = self.validator_set_quorum_type.trim().parse::() { QuorumType::from(t) } else { - QuorumType::from(self.quorum_type.as_str()) + QuorumType::from(self.validator_set_quorum_type.as_str()) }; if found == QuorumType::UNKNOWN { - panic!("config: unsupported QUORUM_TYPE: {}", self.quorum_type); + panic!( + "config: unsupported QUORUM_TYPE: {}", + self.validator_set_quorum_type + ); + } + + found + } + + /// Return type of quorum for validating chain locks + pub fn chain_lock_quorum_type(&self) -> QuorumType { + let found = if let Ok(t) = self.chain_lock_quorum_type.trim().parse::() { + QuorumType::from(t) + } else { + QuorumType::from(self.chain_lock_quorum_type.as_str()) + }; + + if found == QuorumType::UNKNOWN { + panic!( + "config: unsupported QUORUM_TYPE: {}", + self.chain_lock_quorum_type + ); } found @@ -279,8 +282,8 @@ impl Default for ExecutionConfig { Self { use_document_triggers: ExecutionConfig::default_use_document_triggers(), verify_sum_trees: ExecutionConfig::default_verify_sum_trees(), - validator_set_quorum_rotation_block_count: - ExecutionConfig::default_validator_set_quorum_rotation_block_count(), + validator_set_rotation_block_count: + ExecutionConfig::default_validator_set_rotation_block_count(), epoch_time_length_s: ExecutionConfig::default_epoch_time_length_s(), } } @@ -288,9 +291,55 @@ impl Default for ExecutionConfig { impl Default for PlatformConfig { fn default() -> Self { + Self::default_mainnet() + } +} + +#[allow(missing_docs)] +impl PlatformConfig { + pub fn default_local() -> Self { + Self { + validator_set_quorum_type: "llmq_test_platform".to_string(), + chain_lock_quorum_type: "llmq_test".to_string(), + validator_set_quorum_size: 3, + chain_lock_quorum_size: 3, + chain_lock_quorum_window: 24, + block_spacing_ms: 5000, + drive: Default::default(), + abci: Default::default(), + core: Default::default(), + execution: Default::default(), + db_path: PathBuf::from("/var/lib/dash-platform/data"), + testing_configs: PlatformTestConfig::default(), + initial_protocol_version: 1, + } + } + + pub fn default_testnet() -> Self { + Self { + validator_set_quorum_type: "llmq_25_67".to_string(), + chain_lock_quorum_type: "llmq_50_60".to_string(), + validator_set_quorum_size: 25, + chain_lock_quorum_size: 50, + chain_lock_quorum_window: 24, + block_spacing_ms: 5000, + drive: Default::default(), + abci: Default::default(), + core: Default::default(), + execution: Default::default(), + db_path: PathBuf::from("/var/lib/dash-platform/data"), + testing_configs: PlatformTestConfig::default(), + initial_protocol_version: 1, + } + } + + pub fn default_mainnet() -> Self { Self { - quorum_type: "llmq_100_67".to_string(), - quorum_size: 100, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_400_60".to_string(), + validator_set_quorum_size: 100, + chain_lock_quorum_size: 400, + chain_lock_quorum_window: 288, block_spacing_ms: 5000, drive: Default::default(), abci: Default::default(), @@ -341,7 +390,7 @@ mod tests { #[test] fn test_config_from_env() { // ABCI log configs are parsed manually, so they deserve separate handling - // Notat that STDOUT is also defined in .env.example, but env var should overwrite it. + // Note that STDOUT is also defined in .env.example, but env var should overwrite it. let vectors = &[ ("STDOUT", "pretty"), ("UPPERCASE", "json"), @@ -354,14 +403,14 @@ mod tests { env::set_var(format!("ABCI_LOG_{}_FORMAT", vector.0), vector.1); } - let envfile = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")).join(".env.example"); + let envfile = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")).join(".env.local"); dotenvy::from_path(envfile.as_path()).expect("cannot load .env file"); - assert_eq!("5", env::var("QUORUM_SIZE").unwrap()); + assert_eq!("/tmp/db", env::var("DB_PATH").unwrap()); let config = super::PlatformConfig::from_env().expect("expected config from env"); assert!(config.execution.verify_sum_trees); - assert_ne!(config.quorum_type(), QuorumType::UNKNOWN); + assert_ne!(config.validator_set_quorum_type(), QuorumType::UNKNOWN); for id in vectors { matches!(config.abci.log[id.0].destination, LogDestination::Bytes); } diff --git a/packages/rs-drive-abci/src/core/wait_for_core_to_sync/v0/mod.rs b/packages/rs-drive-abci/src/core/wait_for_core_to_sync/v0/mod.rs index 47e8dbbc8d..d1f79b1e55 100644 --- a/packages/rs-drive-abci/src/core/wait_for_core_to_sync/v0/mod.rs +++ b/packages/rs-drive-abci/src/core/wait_for_core_to_sync/v0/mod.rs @@ -17,6 +17,14 @@ pub fn wait_for_core_to_sync_v0( tracing::info!(?core_rpc, "waiting for core rpc to start"); while !cancel.is_cancelled() { + let has_chain_locked = match core_rpc.get_best_chain_lock() { + Ok(_) => true, + Err(error) => { + tracing::warn!(?error, "cannot get best chain lock"); + false + } + }; + let mn_sync_status = match core_rpc.masternode_sync_status() { Ok(status) => status, Err(error) => { @@ -25,7 +33,7 @@ pub fn wait_for_core_to_sync_v0( } }; - if !mn_sync_status.is_synced || !mn_sync_status.is_blockchain_synced { + if !has_chain_locked || !mn_sync_status.is_synced || !mn_sync_status.is_blockchain_synced { std::thread::sleep(CORE_SYNC_STATUS_CHECK_TIMEOUT); tracing::info!("waiting for core to sync..."); diff --git a/packages/rs-drive-abci/src/error/mod.rs b/packages/rs-drive-abci/src/error/mod.rs index 3658a8169d..27300dc32c 100644 --- a/packages/rs-drive-abci/src/error/mod.rs +++ b/packages/rs-drive-abci/src/error/mod.rs @@ -3,6 +3,7 @@ use crate::error::execution::ExecutionError; use crate::error::serialization::SerializationError; use crate::logging; use dashcore_rpc::Error as CoreRpcError; +use dpp::bls_signatures::BlsError; use dpp::platform_value::Error as ValueError; use dpp::version::PlatformVersionError; use drive::dpp::ProtocolError; @@ -36,6 +37,9 @@ pub enum Error { /// Core RPC Error #[error("core rpc error: {0}")] CoreRpc(#[from] CoreRpcError), + /// BLS Error + #[error("BLS error: {0}")] + BLSError(#[from] BlsError), /// Serialization Error #[error("serialization: {0}")] Serialization(#[from] SerializationError), diff --git a/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/v0/mod.rs b/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/v0/mod.rs index 7c0cf75f7a..51b6db6352 100644 --- a/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/v0/mod.rs @@ -150,7 +150,7 @@ where { // Verify commit - let quorum_type = self.config.quorum_type(); + let quorum_type = self.config.validator_set_quorum_type(); let commit = Commit::new_from_cleaned( commit_info.clone(), block_id, diff --git a/packages/rs-drive-abci/src/execution/engine/run_block_proposal/mod.rs b/packages/rs-drive-abci/src/execution/engine/run_block_proposal/mod.rs index 01b951d49e..aee3c50528 100644 --- a/packages/rs-drive-abci/src/execution/engine/run_block_proposal/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/run_block_proposal/mod.rs @@ -23,6 +23,7 @@ where /// # Arguments /// /// * `block_proposal` - The block proposal to be processed. + /// * `known_from_us` - Do we know that we made this block proposal? /// * `transaction` - The transaction associated with the block proposal. /// /// # Returns @@ -40,6 +41,7 @@ where pub fn run_block_proposal( &self, block_proposal: block_proposal::v0::BlockProposal, + known_from_us: bool, transaction: &Transaction, ) -> Result, Error> { @@ -57,6 +59,7 @@ where { 0 => self.run_block_proposal_v0( block_proposal, + known_from_us, epoch_info.into(), transaction, platform_version, diff --git a/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs b/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs index 2408b92005..b10494886a 100644 --- a/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs @@ -31,6 +31,7 @@ use crate::platform_types::epoch_info::v0::{EpochInfoV0Getters, EpochInfoV0Metho use crate::platform_types::epoch_info::EpochInfo; use crate::platform_types::platform::Platform; use crate::platform_types::platform_state::v0::PlatformStateV0Methods; +use crate::platform_types::verify_chain_lock_result::v0::VerifyChainLockResult; use crate::rpc::core::CoreRPCLike; impl Platform @@ -46,6 +47,7 @@ where /// # Arguments /// /// * `block_proposal` - The block proposal to be processed. + /// * `known_from_us` - Do we know that we made this block proposal?. /// * `transaction` - The transaction associated with the block proposal. /// /// # Returns @@ -63,6 +65,7 @@ where pub(super) fn run_block_proposal_v0( &self, block_proposal: block_proposal::v0::BlockProposal, + known_from_us: bool, epoch_info: EpochInfo, transaction: &Transaction, platform_version: &PlatformVersion, @@ -80,11 +83,11 @@ where block_proposal.round, ); - let last_block_time_ms = state.last_block_time_ms(); + let last_block_time_ms = state.last_committed_block_time_ms(); let last_block_height = - state.known_height_or(self.config.abci.genesis_height.saturating_sub(1)); + state.last_committed_known_height_or(self.config.abci.genesis_height.saturating_sub(1)); let last_block_core_height = - state.known_core_height_or(self.config.abci.genesis_core_height); + state.last_committed_known_core_height_or(self.config.abci.genesis_core_height); let hpmn_list_len = state.hpmn_list_len(); let mut block_platform_state = state.clone(); @@ -110,6 +113,7 @@ where // destructure the block proposal let block_proposal::v0::BlockProposal { core_chain_locked_height, + core_chain_lock_update, proposed_app_version, proposer_pro_tx_hash, validator_set_quorum_hash, @@ -122,6 +126,90 @@ where .expect("current epoch index should be in range"), ); + // If there is a core chain lock update, we should start by verifying it + if let Some(core_chain_lock_update) = core_chain_lock_update.as_ref() { + if !known_from_us { + let verification_result = self.verify_chain_lock( + block_state_info.round, // the round is to allow us to bypass local verification in case of chain stall + &block_platform_state, + core_chain_lock_update, + true, // if it's not known from us, then we should try submitting it + platform_version, + ); + + let VerifyChainLockResult { + chain_lock_signature_is_deserializable, + found_valid_locally, + found_valid_by_core, + core_is_synced, + } = match verification_result { + Ok(verification_result) => verification_result, + Err(Error::Execution(e)) => { + // This will happen only if an internal version error + return Err(Error::Execution(e)); + } + Err(e) => { + // This will happen only if a core rpc error + return Ok(ValidationResult::new_with_error( + AbciError::InvalidChainLock(e.to_string()).into(), + )); + } + }; + + if !chain_lock_signature_is_deserializable { + return Ok(ValidationResult::new_with_error( + AbciError::InvalidChainLock(format!( + "received a chain lock for height {} that has a signature that can not be deserialized {:?}", + block_info.height, core_chain_lock_update, + )) + .into(), + )); + } + + if let Some(found_valid_locally) = found_valid_locally { + // This means we are able to check if the chain lock is valid + if !found_valid_locally { + // The signature was not valid + return Ok(ValidationResult::new_with_error( + AbciError::InvalidChainLock(format!( + "received a chain lock for height {} that we figured out was invalid based on platform state {:?}", + block_info.height, core_chain_lock_update, + )) + .into(), + )); + } + } + + if let Some(found_valid_by_core) = found_valid_by_core { + // This means we asked core if the chain lock was valid + if !found_valid_by_core { + // Core said it wasn't valid + return Ok(ValidationResult::new_with_error( + AbciError::InvalidChainLock(format!( + "received a chain lock for height {} that is invalid based on a core request {:?}", + block_info.height, core_chain_lock_update, + )) + .into(), + )); + } + } + + if let Some(core_is_synced) = core_is_synced { + // Core is just not synced + if !core_is_synced { + // The submission was not accepted by core + return Ok(ValidationResult::new_with_error( + AbciError::ChainLockedBlockNotKnownByCore(format!( + "received a chain lock for height {} that we could not accept because core is not synced {:?}", + block_info.height, core_chain_lock_update, + )) + .into(), + )); + } + } + } + } + // Update the masternode list and create masternode identities and also update the active quorums self.update_core_info( Some(&state), diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_end/validator_set_update/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_end/validator_set_update/v0/mod.rs index 3a1ead24fb..27b5fc3714 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/block_end/validator_set_update/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/block_end/validator_set_update/v0/mod.rs @@ -27,10 +27,7 @@ where let mut perform_rotation = false; if block_execution_context.block_state_info().height() - % self - .config - .execution - .validator_set_quorum_rotation_block_count as u64 + % self.config.execution.validator_set_rotation_block_count as u64 == 0 { tracing::debug!( diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_core_info/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_core_info/v0/mod.rs index 467af1138b..912114b1bb 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_core_info/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_core_info/v0/mod.rs @@ -1,5 +1,6 @@ use crate::error::Error; use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::platform_types::platform_state::PlatformState; use crate::rpc::core::CoreRPCLike; use dpp::block::block_info::BlockInfo; @@ -40,6 +41,12 @@ where transaction: &Transaction, platform_version: &PlatformVersion, ) -> Result<(), Error> { + // the core height of the block platform state is the last committed + if !is_init_chain && block_platform_state.last_committed_core_height() == core_block_height + { + // if we get the same height that we know we do not need to update core info + return Ok(()); + } self.update_masternode_list( platform_state, block_platform_state, @@ -51,6 +58,7 @@ where )?; self.update_quorum_info( + platform_state, block_platform_state, core_block_height, false, diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_list/update_state_masternode_list/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_list/update_state_masternode_list/v0/mod.rs index fc0f4c3ea9..b6c447fa75 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_list/update_state_masternode_list/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_list/update_state_masternode_list/v0/mod.rs @@ -90,7 +90,7 @@ where // baseBlock must be a chain height and not 0 None } else { - let state_core_height = state.core_height(); + let state_core_height = state.last_committed_core_height(); if core_block_height == state_core_height { return Ok(update_state_masternode_list_outcome::v0::UpdateStateMasternodeListOutcome::default()); // no need to do anything diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_list/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_list/v0/mod.rs index e9372043b1..f60a915994 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_list/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_list/v0/mod.rs @@ -40,10 +40,10 @@ where transaction: &Transaction, platform_version: &PlatformVersion, ) -> Result<(), Error> { - if let Some(last_commited_block_info) = + if let Some(last_committed_block_info) = block_platform_state.last_committed_block_info().as_ref() { - if core_block_height == last_commited_block_info.basic_info().core_height { + if core_block_height == last_committed_block_info.basic_info().core_height { tracing::debug!( method = "update_masternode_list_v0", "no update mnl at height {}", @@ -56,7 +56,7 @@ where method = "update_masternode_list_v0", "update mnl to height {} at block {}", core_block_height, - block_platform_state.core_height() + block_platform_state.last_committed_core_height() ); //todo: there's a weird condition that can happen if we are not on init chain, but we are // in the genesis and we are not on round 0, and the core height changed diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_quorum_info/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_quorum_info/mod.rs index 535f5e5ff0..87510c7117 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_quorum_info/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_quorum_info/mod.rs @@ -26,6 +26,7 @@ where /// on success, or an `Error` on failure. pub(in crate::execution::platform_events::core_based_updates) fn update_quorum_info( &self, + platform_state: Option<&PlatformState>, block_platform_state: &mut PlatformState, core_block_height: u32, start_from_scratch: bool, @@ -38,6 +39,7 @@ where .update_quorum_info { 0 => self.update_quorum_info_v0( + platform_state, block_platform_state, core_block_height, start_from_scratch, diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_quorum_info/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_quorum_info/v0/mod.rs index 24130b279d..26035b5e20 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_quorum_info/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_quorum_info/v0/mod.rs @@ -9,6 +9,7 @@ use crate::platform_types::validator_set::v0::{ValidatorSetV0, ValidatorSetV0Get use crate::platform_types::validator_set::ValidatorSet; use crate::rpc::core::CoreRPCLike; +use dpp::bls_signatures::PublicKey as BlsPublicKey; use dpp::dashcore::QuorumHash; use tracing::Level; @@ -29,6 +30,7 @@ where /// on success, or an `Error` on failure. pub(super) fn update_quorum_info_v0( &self, + platform_state: Option<&PlatformState>, block_platform_state: &mut PlatformState, core_block_height: u32, start_from_scratch: bool, @@ -37,11 +39,11 @@ where if start_from_scratch { tracing::debug!("update quorum info from scratch up to {core_block_height}"); - } else if core_block_height != block_platform_state.core_height() { + } else if core_block_height != block_platform_state.last_committed_core_height() { tracing::debug!( - previous_core_block_height = block_platform_state.core_height(), + previous_core_block_height = block_platform_state.last_committed_core_height(), "update quorum info from {} to {}", - block_platform_state.core_height(), + block_platform_state.last_committed_core_height(), core_block_height ); } else { @@ -50,39 +52,49 @@ where return Ok(()); // no need to do anything } + // We request the quorum list from the current core block height, this is because we also keep + // the previous chain lock validating quorum. Core will sign from 8 blocks before the current + // core block height, so often we will use the previous chain lock validating quorums instead. + let mut extended_quorum_list = self .core_rpc .get_quorum_listextended(Some(core_block_height))?; + let validator_set_quorum_type = self.config.validator_set_quorum_type(); + let chain_lock_quorum_type = self.config.chain_lock_quorum_type(); + let validator_quorums_list: BTreeMap<_, _> = extended_quorum_list .quorums_by_type - .remove(&self.config.quorum_type()) + .remove(&validator_set_quorum_type) .ok_or(Error::Execution(ExecutionError::DashCoreBadResponseError( format!( "expected quorums of type {}, but did not receive any from Dash Core", - self.config.quorum_type + self.config.validator_set_quorum_type ), )))? .into_iter() .collect(); + let mut removed_a_validator_set = false; + // Remove validator_sets entries that are no longer valid for the core block height block_platform_state .validator_sets_mut() .retain(|quorum_hash, _| { - let has_quorum = validator_quorums_list.contains_key::(quorum_hash); + let retain = validator_quorums_list.contains_key::(quorum_hash); + removed_a_validator_set |= !retain; - if has_quorum { + if !retain { tracing::trace!( ?quorum_hash, - quorum_type = ?self.config.quorum_type(), - "remove validator set {} with quorum type {}", + quorum_type = ?self.config.validator_set_quorum_type(), + "removed validator set {} with quorum type {}", quorum_hash, - self.config.quorum_type() + self.config.validator_set_quorum_type() ) } - has_quorum + retain }); // Fetch quorum info and their keys from the RPC for new quorums @@ -94,9 +106,11 @@ where .contains_key::(key) }) .map(|(key, _)| { - let quorum_info_result = - self.core_rpc - .get_quorum_info(self.config.quorum_type(), key, None)?; + let quorum_info_result = self.core_rpc.get_quorum_info( + self.config.validator_set_quorum_type(), + key, + None, + )?; Ok((*key, quorum_info_result)) }) @@ -124,16 +138,18 @@ where tracing::trace!( ?validator_set, ?quorum_hash, - quorum_type = ?self.config.quorum_type(), + quorum_type = ?self.config.validator_set_quorum_type(), "add new validator set {} with quorum type {}", quorum_hash, - self.config.quorum_type() + self.config.validator_set_quorum_type() ); Ok((quorum_hash, validator_set)) }) .collect::, Error>>()?; + let added_a_validator_set = !new_validator_sets.is_empty(); + // Add new validator_sets entries block_platform_state .validator_sets_mut() @@ -154,6 +170,138 @@ where } }); + if validator_set_quorum_type == chain_lock_quorum_type { + // Remove validator_sets entries that are no longer valid for the core block height + if removed_a_validator_set || added_a_validator_set { + let chain_lock_validating_quorums = block_platform_state + .validator_sets() + .iter() + .map(|(quorum_hash, validator_set)| { + ( + quorum_hash.clone(), + validator_set.threshold_public_key().clone(), + ) + }) + .collect(); + let previous_quorums = block_platform_state + .replace_chain_lock_validating_quorums(chain_lock_validating_quorums); + tracing::trace!("updated chain lock validating quorums to current validator set",); + // the only case where there will be no platform_state is init chain where we + if platform_state.is_some() { + block_platform_state.set_previous_chain_lock_validating_quorums( + block_platform_state.last_committed_core_height(), + core_block_height, + block_platform_state + .previous_height_chain_lock_validating_quorums() + .map(|(_, previous_change_height, _, _)| *previous_change_height), + previous_quorums, + ); + } + } + } else { + let chain_lock_quorums_list: BTreeMap<_, _> = extended_quorum_list + .quorums_by_type + .remove(&chain_lock_quorum_type) + .ok_or(Error::Execution(ExecutionError::DashCoreBadResponseError( + format!( + "expected quorums of type {}, but did not receive any from Dash Core", + self.config.chain_lock_quorum_type + ), + )))? + .into_iter() + .map(|(quorum_hash, extended_quorum_details)| { + (quorum_hash, extended_quorum_details.quorum_index) + }) + .collect(); + + let mut removed_a_chain_lock_validating_quorum = false; + + // Remove chain_lock_validating_quorums entries that are no longer valid for the core block height + block_platform_state + .chain_lock_validating_quorums_mut() + .retain(|quorum_hash, _| { + let retain = chain_lock_quorums_list.contains_key::(quorum_hash); + if !retain { + tracing::trace!( + ?quorum_hash, + quorum_type = ?chain_lock_quorum_type, + "removed old chain lock quorum {} with quorum type {}", + quorum_hash, + chain_lock_quorum_type + ); + } + removed_a_chain_lock_validating_quorum |= !retain; + retain + }); + + // Fetch quorum info and their keys from the RPC for new quorums + let quorum_infos = chain_lock_quorums_list + .iter() + .filter(|(key, _)| { + !block_platform_state + .chain_lock_validating_quorums() + .contains_key::(key) + }) + .map(|(key, _)| { + let quorum_info_result = + self.core_rpc + .get_quorum_info(chain_lock_quorum_type, key, None)?; + + Ok((*key, quorum_info_result)) + }) + .collect::, Error>>()?; + + let added_a_chain_lock_validating_quorum = !quorum_infos.is_empty(); + + if added_a_chain_lock_validating_quorum { + // Map to chain lock validating quorums + let new_chain_lock_quorums = quorum_infos + .into_iter() + .map(|(quorum_hash, info_result)| { + let public_key = match BlsPublicKey::from_bytes( + info_result.quorum_public_key.as_slice(), + ) + .map_err(ExecutionError::BlsErrorFromDashCoreResponse) + { + Ok(public_key) => public_key, + Err(e) => return Err(e.into()), + }; + + tracing::trace!( + ?public_key, + ?quorum_hash, + quorum_type = ?chain_lock_quorum_type, + "add new chain lock quorum {} with quorum type {}", + quorum_hash, + chain_lock_quorum_type + ); + + Ok((quorum_hash, public_key)) + }) + .collect::, Error>>()?; + + // Add new validator_sets entries + block_platform_state + .chain_lock_validating_quorums_mut() + .extend(new_chain_lock_quorums); + } + + if added_a_chain_lock_validating_quorum || removed_a_chain_lock_validating_quorum { + if let Some(old_state) = platform_state { + let previous_chain_lock_validating_quorums = + old_state.chain_lock_validating_quorums().clone(); + block_platform_state.set_previous_chain_lock_validating_quorums( + block_platform_state.last_committed_core_height(), + core_block_height, + block_platform_state + .previous_height_chain_lock_validating_quorums() + .map(|(_, previous_change_height, _, _)| *previous_change_height), + previous_chain_lock_validating_quorums, + ); + } + } + } + Ok(()) } } diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/choose_quorum/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/choose_quorum/mod.rs new file mode 100644 index 0000000000..f939ef727c --- /dev/null +++ b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/choose_quorum/mod.rs @@ -0,0 +1,76 @@ +mod v0; + +use crate::error::execution::ExecutionError; +use crate::error::Error; +use dashcore_rpc::dashcore_rpc_json::QuorumType; +use dpp::bls_signatures::PublicKey as BlsPublicKey; +use dpp::dashcore::{ChainLock, QuorumHash}; +use dpp::platform_value::Bytes32; +use std::collections::BTreeMap; + +use crate::platform_types::platform::Platform; + +use crate::rpc::core::CoreRPCLike; + +use dpp::version::PlatformVersion; + +pub type ReversedQuorumHashBytes = Vec; + +impl Platform +where + C: CoreRPCLike, +{ + /// Based on DIP8 deterministically chooses a pseudorandom quorum from the list of quorums + /// + pub fn choose_quorum<'a>( + llmq_quorum_type: QuorumType, + quorums: &'a BTreeMap, + request_id: &[u8; 32], + platform_version: &PlatformVersion, + ) -> Result, Error> { + match platform_version + .drive_abci + .methods + .core_chain_lock + .choose_quorum + { + 0 => Ok(Self::choose_quorum_v0( + llmq_quorum_type, + quorums, + request_id, + )), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "choose_quorum".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// Based on DIP8 deterministically chooses a pseudorandom quorum from the list of quorums + /// + pub fn choose_quorum_thread_safe<'a, const T: usize>( + llmq_quorum_type: QuorumType, + quorums: &'a BTreeMap, + request_id: &[u8; 32], + platform_version: &PlatformVersion, + ) -> Result, Error> { + match platform_version + .drive_abci + .methods + .core_chain_lock + .choose_quorum + { + 0 => Ok(Self::choose_quorum_thread_safe_v0( + llmq_quorum_type, + quorums, + request_id, + )), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "choose_quorum_thread_safe".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/choose_quorum/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/choose_quorum/v0/mod.rs new file mode 100644 index 0000000000..8fd8156732 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/choose_quorum/v0/mod.rs @@ -0,0 +1,359 @@ +use dashcore_rpc::dashcore_rpc_json::QuorumType; +use dpp::bls_signatures::PublicKey as BlsPublicKey; +use dpp::dashcore::hashes::{sha256d, Hash, HashEngine}; +use dpp::dashcore::{ChainLock, QuorumHash}; +use std::collections::BTreeMap; + +use crate::platform_types::platform::Platform; + +use crate::rpc::core::CoreRPCLike; + +use crate::execution::platform_events::core_chain_lock::choose_quorum::ReversedQuorumHashBytes; + +impl Platform { + /// Based on DIP8 deterministically chooses a pseudorandom quorum from the list of quorums + pub(super) fn choose_quorum_v0<'a>( + llmq_quorum_type: QuorumType, + quorums: &'a BTreeMap, + request_id: &[u8; 32], + ) -> Option<(ReversedQuorumHashBytes, &'a BlsPublicKey)> { + // Scoring system logic + let mut scores: Vec<(ReversedQuorumHashBytes, &BlsPublicKey, [u8; 32])> = Vec::new(); + + for (quorum_hash, public_key) in quorums { + let mut quorum_hash_bytes = quorum_hash.to_byte_array().to_vec(); + + // Only the quorum hash needs reversal. + quorum_hash_bytes.reverse(); + + let mut hasher = sha256d::Hash::engine(); + + // Serialize and hash the LLMQ type + hasher.input(&[llmq_quorum_type as u8]); + + // Serialize and add the quorum hash + hasher.input(quorum_hash_bytes.as_slice()); + + // Serialize and add the selection hash from the chain lock + hasher.input(request_id.as_slice()); + + // Finalize the hash + let hash_result = sha256d::Hash::from_engine(hasher); + scores.push((quorum_hash_bytes, public_key, hash_result.into())); + } + + if scores.is_empty() { + None + } else { + scores.sort_by_key(|k| k.2); + + let (quorum_hash, key, _) = scores.remove(0); + + Some((quorum_hash, key)) + } + } + + /// Based on DIP8 deterministically chooses a pseudorandom quorum from the list of quorums + pub(super) fn choose_quorum_thread_safe_v0<'a, const T: usize>( + llmq_quorum_type: QuorumType, + quorums: &'a BTreeMap, + request_id: &[u8; 32], + ) -> Option<(ReversedQuorumHashBytes, &'a [u8; T])> { + // Scoring system logic + let mut scores: Vec<(ReversedQuorumHashBytes, &[u8; T], [u8; 32])> = Vec::new(); + + for (quorum_hash, key) in quorums { + let mut quorum_hash_bytes = quorum_hash.to_byte_array().to_vec(); + + // Only the quorum hash needs reversal. + quorum_hash_bytes.reverse(); + + let mut hasher = sha256d::Hash::engine(); + + // Serialize and hash the LLMQ type + hasher.input(&[llmq_quorum_type as u8]); + + // Serialize and add the quorum hash + hasher.input(quorum_hash_bytes.as_slice()); + + // Serialize and add the selection hash from the chain lock + hasher.input(request_id.as_slice()); + + // Finalize the hash + let hash_result = sha256d::Hash::from_engine(hasher); + scores.push((quorum_hash_bytes, key, hash_result.into())); + } + + scores.sort_by_key(|k| k.2); + scores.pop().map(|(hash, key, _)| (hash, key)) + } +} + +#[cfg(test)] +mod tests { + use crate::platform_types::platform::Platform; + use crate::rpc::core::{CoreRPCLike, MockCoreRPCLike}; + use dashcore_rpc::dashcore_rpc_json::QuorumType; + use dpp::bls_signatures::PublicKey as BlsPublicKey; + use dpp::dashcore::hashes::Hash; + use dpp::dashcore::QuorumHash; + use std::collections::BTreeMap; + + #[test] + fn test_choose_quorum() { + // Active quorums: + let quorum_hash1 = QuorumHash::from_slice( + hex::decode("000000dc07d722238a994116c3395c334211d9864ff5b37c3be51d5fdda66223") + .unwrap() + .as_slice(), + ) + .unwrap(); + let quorum_hash2 = QuorumHash::from_slice( + hex::decode("000000bd5639c21dd8abf60253c3fe0343d87a9762b5b8f57e2b4ea1523fd071") + .unwrap() + .as_slice(), + ) + .unwrap(); + let quorum_hash3 = QuorumHash::from_slice( + hex::decode("0000006faac9003919a6d5456a0a46ae10db517f572221279f0540b79fd9cf1b") + .unwrap() + .as_slice(), + ) + .unwrap(); + let quorum_hash4 = QuorumHash::from_slice( + hex::decode("0000000e6d15a11825211c943c4a995c44ebb2b0834b7848c2e080b48ca0148e") + .unwrap() + .as_slice(), + ) + .unwrap(); + let quorums = BTreeMap::from([ + (quorum_hash1, BlsPublicKey::generate()), + (quorum_hash2, BlsPublicKey::generate()), + (quorum_hash3, BlsPublicKey::generate()), + (quorum_hash4, BlsPublicKey::generate()), + ]); + + // + // ############### + // llmqType[1] requestID[bdcf9fb3ef01209a09db19170a1950775afb5f824c5f0662b9cdae2bf3bb36d5] -> 0000000e6d15a11825211c943c4a995c44ebb2b0834b7848c2e080b48ca0148e + // llmqType[4] requestID[bdcf9fb3ef01209a09db19170a1950775afb5f824c5f0662b9cdae2bf3bb36d5] -> 000000bd5639c21dd8abf60253c3fe0343d87a9762b5b8f57e2b4ea1523fd071 + // llmqType[5] requestID[bdcf9fb3ef01209a09db19170a1950775afb5f824c5f0662b9cdae2bf3bb36d5] -> 000000dc07d722238a994116c3395c334211d9864ff5b37c3be51d5fdda66223 + // llmqType[100] requestID[bdcf9fb3ef01209a09db19170a1950775afb5f824c5f0662b9cdae2bf3bb36d5] -> 0000000e6d15a11825211c943c4a995c44ebb2b0834b7848c2e080b48ca0148e + + let mut request_id: [u8; 32] = + hex::decode("bdcf9fb3ef01209a09db19170a1950775afb5f824c5f0662b9cdae2bf3bb36d5") + .unwrap() + .try_into() + .unwrap(); + + request_id.reverse(); + + let mut quorum = Platform::::choose_quorum_v0( + QuorumType::Llmq50_60, + &quorums, + &request_id, + ) + .unwrap() + .0; + + quorum.reverse(); + + assert_eq!( + hex::encode(quorum), + "0000000e6d15a11825211c943c4a995c44ebb2b0834b7848c2e080b48ca0148e" + ); + + let mut quorum = Platform::::choose_quorum_v0( + QuorumType::Llmq100_67, + &quorums, + &request_id, + ) + .unwrap() + .0; + + quorum.reverse(); + + assert_eq!( + hex::encode(quorum), + "000000bd5639c21dd8abf60253c3fe0343d87a9762b5b8f57e2b4ea1523fd071" + ); + + let mut quorum = Platform::::choose_quorum_v0( + QuorumType::Llmq60_75, + &quorums, + &request_id, + ) + .unwrap() + .0; + + quorum.reverse(); + + assert_eq!( + hex::encode(quorum), + "000000dc07d722238a994116c3395c334211d9864ff5b37c3be51d5fdda66223" + ); + + let mut quorum = Platform::::choose_quorum_v0( + QuorumType::LlmqTest, + &quorums, + &request_id, + ) + .unwrap() + .0; + + quorum.reverse(); + + assert_eq!( + hex::encode(quorum), + "0000000e6d15a11825211c943c4a995c44ebb2b0834b7848c2e080b48ca0148e" + ); + + // ############### + // llmqType[1] requestID[b06aa45eb35423f988e36c022967b4c02bb719b037717df13fa57c0f503d8a20] -> 0000000e6d15a11825211c943c4a995c44ebb2b0834b7848c2e080b48ca0148e + // llmqType[4] requestID[b06aa45eb35423f988e36c022967b4c02bb719b037717df13fa57c0f503d8a20] -> 000000bd5639c21dd8abf60253c3fe0343d87a9762b5b8f57e2b4ea1523fd071 + // llmqType[5] requestID[b06aa45eb35423f988e36c022967b4c02bb719b037717df13fa57c0f503d8a20] -> 000000bd5639c21dd8abf60253c3fe0343d87a9762b5b8f57e2b4ea1523fd071 + // llmqType[100] requestID[b06aa45eb35423f988e36c022967b4c02bb719b037717df13fa57c0f503d8a20] -> 0000006faac9003919a6d5456a0a46ae10db517f572221279f0540b79fd9cf1b + + let mut request_id: [u8; 32] = + hex::decode("b06aa45eb35423f988e36c022967b4c02bb719b037717df13fa57c0f503d8a20") + .unwrap() + .try_into() + .unwrap(); + + request_id.reverse(); + + let mut quorum = Platform::::choose_quorum_v0( + QuorumType::Llmq50_60, + &quorums, + &request_id, + ) + .unwrap() + .0; + + quorum.reverse(); + + assert_eq!( + hex::encode(quorum), + "0000000e6d15a11825211c943c4a995c44ebb2b0834b7848c2e080b48ca0148e" + ); + + let mut quorum = Platform::::choose_quorum_v0( + QuorumType::Llmq100_67, + &quorums, + &request_id, + ) + .unwrap() + .0; + + quorum.reverse(); + + assert_eq!( + hex::encode(quorum), + "000000bd5639c21dd8abf60253c3fe0343d87a9762b5b8f57e2b4ea1523fd071" + ); + + let mut quorum = Platform::::choose_quorum_v0( + QuorumType::Llmq60_75, + &quorums, + &request_id, + ) + .unwrap() + .0; + + quorum.reverse(); + + assert_eq!( + hex::encode(quorum), + "000000bd5639c21dd8abf60253c3fe0343d87a9762b5b8f57e2b4ea1523fd071" + ); + + let mut quorum = Platform::::choose_quorum_v0( + QuorumType::LlmqTest, + &quorums, + &request_id, + ) + .unwrap() + .0; + + quorum.reverse(); + + assert_eq!( + hex::encode(quorum), + "0000006faac9003919a6d5456a0a46ae10db517f572221279f0540b79fd9cf1b" + ); + + // ############### + // llmqType[1] requestID[2fc41ef02a3216e4311805a9a11405a41a8d7a9f179526b4f6f2866bff009a10] -> 000000bd5639c21dd8abf60253c3fe0343d87a9762b5b8f57e2b4ea1523fd071 + // llmqType[4] requestID[2fc41ef02a3216e4311805a9a11405a41a8d7a9f179526b4f6f2866bff009a10] -> 0000000e6d15a11825211c943c4a995c44ebb2b0834b7848c2e080b48ca0148e + // llmqType[5] requestID[2fc41ef02a3216e4311805a9a11405a41a8d7a9f179526b4f6f2866bff009a10] -> 000000bd5639c21dd8abf60253c3fe0343d87a9762b5b8f57e2b4ea1523fd071 + // llmqType[100] requestID[2fc41ef02a3216e4311805a9a11405a41a8d7a9f179526b4f6f2866bff009a10] -> 000000dc07d722238a994116c3395c334211d9864ff5b37c3be51d5fdda66223 + + let mut request_id: [u8; 32] = + hex::decode("2fc41ef02a3216e4311805a9a11405a41a8d7a9f179526b4f6f2866bff009a10") + .unwrap() + .try_into() + .unwrap(); + + request_id.reverse(); + + let mut quorum = Platform::::choose_quorum_v0( + QuorumType::Llmq50_60, + &quorums, + &request_id, + ) + .unwrap() + .0; + + quorum.reverse(); + + assert_eq!( + hex::encode(quorum), + "000000bd5639c21dd8abf60253c3fe0343d87a9762b5b8f57e2b4ea1523fd071" + ); + + let mut quorum = Platform::::choose_quorum_v0( + QuorumType::Llmq100_67, + &quorums, + &request_id, + ) + .unwrap() + .0; + + quorum.reverse(); + + assert_eq!( + hex::encode(quorum), + "0000000e6d15a11825211c943c4a995c44ebb2b0834b7848c2e080b48ca0148e" + ); + + let mut quorum = Platform::::choose_quorum_v0( + QuorumType::Llmq60_75, + &quorums, + &request_id, + ) + .unwrap() + .0; + + quorum.reverse(); + + assert_eq!( + hex::encode(quorum), + "000000bd5639c21dd8abf60253c3fe0343d87a9762b5b8f57e2b4ea1523fd071" + ); + + let mut quorum = Platform::::choose_quorum_v0( + QuorumType::LlmqTest, + &quorums, + &request_id, + ) + .unwrap() + .0; + + quorum.reverse(); + + assert_eq!( + hex::encode(quorum), + "000000dc07d722238a994116c3395c334211d9864ff5b37c3be51d5fdda66223" + ); + } +} diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/make_sure_core_is_synced_to_chain_lock/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/make_sure_core_is_synced_to_chain_lock/mod.rs new file mode 100644 index 0000000000..59abfb78f6 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/make_sure_core_is_synced_to_chain_lock/mod.rs @@ -0,0 +1,54 @@ +use crate::error::execution::ExecutionError; +use crate::error::Error; +use crate::platform_types::platform::Platform; +use crate::rpc::core::CoreRPCLike; +use dashcore_rpc::dashcore::ChainLock; +use dpp::version::PlatformVersion; + +/// Version 0 +pub mod v0; + +/// As we ask to make sure that core is synced to the chain lock, we get back one of 3 +pub enum CoreSyncStatus { + /// Core is synced + CoreIsSynced, + /// Core is 1 or 2 blocks off, we should retry shortly + CoreAlmostSynced, + /// Core is more than 2 blocks off + CoreNotSynced, +} + +impl Platform +where + C: CoreRPCLike, +{ + /// The point of this call is to make sure core is synced. + /// Before this call we had previously validated that the chain lock is valid. + /// Right now the core height should be the same as the chain lock height. + /// + /// Todo: In the future: The core height passed here is the core height that we need to be able to validate all + /// asset lock proofs. + /// It should be chosen by taking the highest height of all state transitions that require core. + /// State transitions that require core are: + /// *Identity Create State transition + /// *Identity Top up State transition + pub fn make_sure_core_is_synced_to_chain_lock( + &self, + chain_lock: &ChainLock, + platform_version: &PlatformVersion, + ) -> Result { + match platform_version + .drive_abci + .methods + .core_chain_lock + .make_sure_core_is_synced_to_chain_lock + { + 0 => self.make_sure_core_is_synced_to_chain_lock_v0(chain_lock, platform_version), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "make_sure_core_is_synced_to_chain_lock".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/make_sure_core_is_synced_to_chain_lock/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/make_sure_core_is_synced_to_chain_lock/v0/mod.rs new file mode 100644 index 0000000000..68fafb2020 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/make_sure_core_is_synced_to_chain_lock/v0/mod.rs @@ -0,0 +1,37 @@ +use crate::error::Error; +use crate::platform_types::platform::Platform; +use crate::rpc::core::CoreRPCLike; +use dashcore_rpc::dashcore::ChainLock; +use dpp::version::PlatformVersion; +use crate::execution::platform_events::core_chain_lock::make_sure_core_is_synced_to_chain_lock::CoreSyncStatus; +use crate::execution::platform_events::core_chain_lock::make_sure_core_is_synced_to_chain_lock::CoreSyncStatus::{CoreIsSynced, CoreAlmostSynced, CoreNotSynced}; + +impl Platform +where + C: CoreRPCLike, +{ + /// The point of this call is to make sure core is synced. + /// Before this call we had previously validated that the chain lock is valid. + pub(super) fn make_sure_core_is_synced_to_chain_lock_v0( + &self, + chain_lock: &ChainLock, + platform_version: &PlatformVersion, + ) -> Result { + let given_chain_lock_height = chain_lock.block_height; + // We need to make sure core is synced to the core height we see as valid for the state transitions + let best_chain_locked_height = self.core_rpc.submit_chain_lock(chain_lock)?; + Ok(if best_chain_locked_height >= given_chain_lock_height { + CoreIsSynced + } else if best_chain_locked_height - given_chain_lock_height + <= platform_version + .drive_abci + .methods + .core_chain_lock + .recent_block_count_amount + { + CoreAlmostSynced + } else { + CoreNotSynced + }) + } +} diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/mod.rs new file mode 100644 index 0000000000..a44b48464e --- /dev/null +++ b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/mod.rs @@ -0,0 +1,5 @@ +mod choose_quorum; +mod make_sure_core_is_synced_to_chain_lock; +mod verify_chain_lock; +mod verify_chain_lock_locally; +mod verify_chain_lock_through_core; diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock/mod.rs new file mode 100644 index 0000000000..038a7365ac --- /dev/null +++ b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock/mod.rs @@ -0,0 +1,50 @@ +mod v0; + +use crate::error::execution::ExecutionError; +use crate::error::Error; +use dpp::dashcore::ChainLock; + +use crate::platform_types::platform::Platform; + +use crate::rpc::core::CoreRPCLike; + +use crate::platform_types::platform_state::PlatformState; +use crate::platform_types::verify_chain_lock_result::v0::VerifyChainLockResult; +use dpp::version::PlatformVersion; + +impl Platform +where + C: CoreRPCLike, +{ + /// Verify the chain lock + /// If submit is true, we try to submit the chain lock if it is considered valid or we can not check to see if it is + /// valid on platform. + pub fn verify_chain_lock( + &self, + round: u32, + platform_state: &PlatformState, + chain_lock: &ChainLock, + make_sure_core_is_synced: bool, + platform_version: &PlatformVersion, + ) -> Result { + match platform_version + .drive_abci + .methods + .core_chain_lock + .verify_chain_lock + { + 0 => self.verify_chain_lock_v0( + round, + platform_state, + chain_lock, + make_sure_core_is_synced, + platform_version, + ), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "verify_chain_lock".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock/v0/mod.rs new file mode 100644 index 0000000000..136ba114e0 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock/v0/mod.rs @@ -0,0 +1,157 @@ +use crate::error::Error; +use crate::execution::platform_events::core_chain_lock::make_sure_core_is_synced_to_chain_lock::CoreSyncStatus; +use crate::execution::platform_events::core_chain_lock::verify_chain_lock::VerifyChainLockResult; +use dpp::dashcore::ChainLock; +use dpp::version::PlatformVersion; +use std::thread::sleep; +use std::time::Duration; + +use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; + +use crate::rpc::core::CoreRPCLike; + +const CORE_ALMOST_SYNCED_RETRIES: u32 = 5; +const CORE_ALMOST_SYNCED_SLEEP_TIME: u64 = 200; + +impl Platform +where + C: CoreRPCLike, +{ + pub(super) fn verify_chain_lock_v0( + &self, + round: u32, + platform_state: &PlatformState, + chain_lock: &ChainLock, + make_sure_core_is_synced: bool, + platform_version: &PlatformVersion, + ) -> Result { + // first we try to verify the chain lock locally + match self.verify_chain_lock_locally(round, platform_state, chain_lock, platform_version) { + Ok(Some(valid)) => { + if valid && make_sure_core_is_synced { + match self.make_sure_core_is_synced_to_chain_lock(chain_lock, platform_version) + { + Ok(sync_status) => { + match sync_status { + CoreSyncStatus::CoreIsSynced => Ok(VerifyChainLockResult { + chain_lock_signature_is_deserializable: true, + found_valid_locally: Some(true), + found_valid_by_core: None, + core_is_synced: Some(true), + }), + CoreSyncStatus::CoreAlmostSynced => { + for _i in 0..CORE_ALMOST_SYNCED_RETRIES { + // The chain lock is valid we just need to sleep a bit and retry + sleep(Duration::from_millis(CORE_ALMOST_SYNCED_SLEEP_TIME)); + let best_chain_locked = + self.core_rpc.get_best_chain_lock()?; + if best_chain_locked.block_height >= chain_lock.block_height + { + return Ok(VerifyChainLockResult { + chain_lock_signature_is_deserializable: true, + found_valid_locally: Some(valid), + found_valid_by_core: Some(true), + core_is_synced: Some(true), + }); + } + } + Ok(VerifyChainLockResult { + chain_lock_signature_is_deserializable: true, + found_valid_locally: Some(true), + found_valid_by_core: Some(true), + core_is_synced: Some(false), + }) + } + CoreSyncStatus::CoreNotSynced => Ok(VerifyChainLockResult { + chain_lock_signature_is_deserializable: true, + found_valid_locally: Some(valid), + found_valid_by_core: Some(true), + core_is_synced: Some(false), + }), + } + } + Err(Error::CoreRpc(..)) => { + //ToDO (important), separate errors from core, connection Errors -> Err, others should be part of the result + Ok(VerifyChainLockResult { + chain_lock_signature_is_deserializable: true, + found_valid_locally: Some(valid), + found_valid_by_core: Some(false), + core_is_synced: None, //we do not know + }) + } + Err(e) => Err(e), + } + } else { + Ok(VerifyChainLockResult { + chain_lock_signature_is_deserializable: true, + found_valid_locally: Some(valid), + found_valid_by_core: None, + core_is_synced: None, + }) + } + } + Ok(None) => { + // we were not able to verify locally + let (verified, status) = self.verify_chain_lock_through_core( + chain_lock, + make_sure_core_is_synced, + platform_version, + )?; + + if let Some(sync_status) = status { + // if we had make_sure_core_is_synced set to true + match sync_status { + CoreSyncStatus::CoreIsSynced => Ok(VerifyChainLockResult { + chain_lock_signature_is_deserializable: true, + found_valid_locally: None, + found_valid_by_core: None, + core_is_synced: Some(true), + }), + CoreSyncStatus::CoreAlmostSynced => { + for _i in 0..CORE_ALMOST_SYNCED_RETRIES { + // The chain lock is valid we just need to sleep a bit and retry + sleep(Duration::from_millis(CORE_ALMOST_SYNCED_SLEEP_TIME)); + let best_chain_locked = self.core_rpc.get_best_chain_lock()?; + if best_chain_locked.block_height >= chain_lock.block_height { + return Ok(VerifyChainLockResult { + chain_lock_signature_is_deserializable: true, + found_valid_locally: None, + found_valid_by_core: Some(true), + core_is_synced: Some(true), + }); + } + } + Ok(VerifyChainLockResult { + chain_lock_signature_is_deserializable: true, + found_valid_locally: None, + found_valid_by_core: Some(true), + core_is_synced: Some(false), + }) + } + CoreSyncStatus::CoreNotSynced => Ok(VerifyChainLockResult { + chain_lock_signature_is_deserializable: true, + found_valid_locally: None, + found_valid_by_core: Some(true), + core_is_synced: Some(false), + }), + } + } else { + Ok(VerifyChainLockResult { + chain_lock_signature_is_deserializable: true, + found_valid_locally: None, + found_valid_by_core: Some(verified), + core_is_synced: None, + }) + } + } + Err(Error::BLSError(_)) => Ok(VerifyChainLockResult { + chain_lock_signature_is_deserializable: false, + found_valid_locally: None, + found_valid_by_core: None, + core_is_synced: None, + }), + Err(e) => Err(e), + } + } +} diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_locally/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_locally/mod.rs new file mode 100644 index 0000000000..21df37ba30 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_locally/mod.rs @@ -0,0 +1,47 @@ +mod v0; + +use crate::error::execution::ExecutionError; +use crate::error::Error; +use dpp::dashcore::ChainLock; + +use crate::platform_types::platform::Platform; + +use crate::rpc::core::CoreRPCLike; + +use crate::config::PlatformConfig; +use crate::platform_types::platform_state::PlatformState; +use dpp::version::PlatformVersion; + +impl Platform +where + C: CoreRPCLike, +{ + /// Returning None here means we were unable to verify the chain lock because of an absence of + /// the quorum + pub fn verify_chain_lock_locally( + &self, + round: u32, + platform_state: &PlatformState, + chain_lock: &ChainLock, + platform_version: &PlatformVersion, + ) -> Result, Error> { + match platform_version + .drive_abci + .methods + .core_chain_lock + .verify_chain_lock_locally + { + 0 => self.verify_chain_lock_locally_v0( + round, + platform_state, + chain_lock, + platform_version, + ), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "verify_chain_lock_locally".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_locally/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_locally/v0/mod.rs new file mode 100644 index 0000000000..815532e869 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_locally/v0/mod.rs @@ -0,0 +1,315 @@ +use dpp::block::block_info::BlockInfo; +use dpp::bls_signatures::G2Element; +use dpp::dashcore::consensus::Encodable; +use dpp::dashcore::hashes::{sha256d, Hash, HashEngine}; +use dpp::dashcore::{ChainLock, QuorumSigningRequestId, VarInt}; + +use crate::error::Error; + +use crate::platform_types::platform::Platform; + +use crate::rpc::core::CoreRPCLike; + +use crate::config::PlatformConfig; +use crate::platform_types::platform_state::v0::PlatformStateV0Methods; +use crate::platform_types::platform_state::PlatformState; +use dpp::version::PlatformVersion; + +const CHAIN_LOCK_REQUEST_ID_PREFIX: &str = "clsig"; + +const SIGN_OFFSET: u32 = 8; + +impl Platform +where + C: CoreRPCLike, +{ + /// Returning None here means we were unable to verify the chain lock because of an absence of + /// the quorum + pub fn verify_chain_lock_locally_v0( + &self, + round: u32, + platform_state: &PlatformState, + chain_lock: &ChainLock, + platform_version: &PlatformVersion, + ) -> Result, Error> { + // First verify that the signature conforms to a signature + let signature = G2Element::from_bytes(chain_lock.signature.as_bytes())?; + + // we attempt to verify the chain lock locally + let chain_lock_height = chain_lock.block_height; + + let window_width = self.config.chain_lock_quorum_window; + + // The last block in the window where the quorums would be the same + let last_block_in_window = platform_state.last_committed_core_height() + - platform_state.last_committed_core_height() % window_width + + window_width + - 1; + + let verification_height = chain_lock_height.saturating_sub(SIGN_OFFSET); + + if verification_height > last_block_in_window { + tracing::debug!( + ?chain_lock, + "h:{} r:{} skipped message_digest for chain lock at core height {} is {}, verification height {}, last block in window {}", + platform_state.last_committed_block_height() + 1, + round, + chain_lock.block_height, + platform_state.last_committed_core_height(), + verification_height, + last_block_in_window, + ); + return Ok(None); // the chain lock is too far in the future or the past to verify locally + } + + let (probable_quorums, second_to_check_quorums, should_be_verifiable) = if let Some(( + previous_quorum_height, + change_quorum_height, + previous_quorums_change_height, + previous_quorums, + )) = + platform_state.previous_height_chain_lock_validating_quorums() + { + if chain_lock_height > 8 && verification_height >= *change_quorum_height { + // in this case we are sure that we should be targeting the current quorum + // We updated core chain lock height from 100 to 105, new chain lock comes in for block 114 + // ------- 100 (previous_quorum_height) ------ 105 (change_quorum_height) ------ 106 (new chain lock verification height 114 - 8) + // We are sure that we should use current quorums + // If we have + // ------- 100 (previous_quorum_height) ------ 105 (change_quorum_height) ------ 105 (new chain lock verification height 113 - 8) + // We should also use current quorums, this is because at 105 we are sure new chain lock validating quorums are active + (platform_state.chain_lock_validating_quorums(), None, true) + } else if chain_lock_height > 8 && verification_height <= *previous_quorum_height { + let should_be_verifiable = previous_quorums_change_height + .map(|previous_quorums_change_height| { + verification_height > previous_quorums_change_height + }) + .unwrap_or(false); + // In this case the quorums were changed recently meaning that we should use the previous quorums to verify the chain lock + // We updated core chain lock height from 100 to 105, new chain lock comes in for block 106 + // -------- 98 (new chain lock verification height 106 - 8) ------- 100 (previous_quorum_height) ------ 105 (change_quorum_height) + // We are sure that we should use previous quorums + // If we have + // -------- 100 (new chain lock verification height 108 - 8) ------- 100 (previous_quorum_height) ------ 105 (change_quorum_height) + // We should also use previous quorums, this is because at 100 we are sure the old quorum set was active + (previous_quorums, None, should_be_verifiable) + } else { + let should_be_verifiable = previous_quorums_change_height + .map(|previous_quorums_change_height| { + verification_height > previous_quorums_change_height + }) + .unwrap_or(false); + // we are in between, so we don't actually know if it was the old one or the new one to be used. + // ------- 100 (previous_quorum_height) ------ 104 (new chain lock verification height 112 - 8) -------105 (change_quorum_height) + // we should just try both, starting with the current quorums + ( + platform_state.chain_lock_validating_quorums(), + Some(previous_quorums), + should_be_verifiable, + ) + } + } else { + (platform_state.chain_lock_validating_quorums(), None, false) + }; + + // From DIP 8: https://github.com/dashpay/dips/blob/master/dip-0008.md#finalization-of-signed-blocks + // The request id is SHA256("clsig", blockHeight) and the message hash is the block hash of the previously successful attempt. + + let mut engine = QuorumSigningRequestId::engine(); + + engine.input(&[CHAIN_LOCK_REQUEST_ID_PREFIX.len() as u8]); + engine.input(CHAIN_LOCK_REQUEST_ID_PREFIX.as_bytes()); + engine.input(chain_lock.block_height.to_le_bytes().as_slice()); + + let request_id = QuorumSigningRequestId::from_engine(engine); + + tracing::trace!( + ?chain_lock, + "request id for chain lock at height {} is {}", + chain_lock.block_height, + hex::encode(request_id.as_byte_array()) + ); + + // Based on the deterministic masternode list at the given height, a quorum must be selected that was active at the time this block was mined + + let quorum = Platform::::choose_quorum( + self.config.chain_lock_quorum_type(), + probable_quorums, + request_id.as_ref(), + platform_version, + )?; + + let Some((quorum_hash, public_key)) = quorum else { + return Ok(None); + }; + + // The signature must verify against the quorum public key and SHA256(llmqType, quorumHash, SHA256(height), blockHash). llmqType and quorumHash must be taken from the quorum selected in 1. + + let mut engine = sha256d::Hash::engine(); + + engine.input(&[self.config.chain_lock_quorum_type() as u8]); + engine.input(quorum_hash.as_slice()); + engine.input(request_id.as_byte_array()); + engine.input(chain_lock.block_hash.as_byte_array()); + + let message_digest = sha256d::Hash::from_engine(engine); + + let mut chain_lock_verified = public_key.verify(&signature, message_digest.as_ref()); + + tracing::debug!( + ?chain_lock, + "h:{} r:{} message_digest for chain lock at core height {} is {}, quorum hash is {}, block hash is {}, chain lock was {}, last committed core height {}, verification height {}, last block in window {}", + platform_state.last_committed_block_height() + 1, + round, + chain_lock.block_height, + hex::encode(message_digest.as_byte_array()), + hex::encode(quorum_hash.as_slice()), + hex::encode(chain_lock.block_hash.as_byte_array()), + if chain_lock_verified { "verified"} else {"not verified"}, + platform_state.last_committed_core_height(), + verification_height, + last_block_in_window, + ); + + if !chain_lock_verified { + // We should also check the other quorum, as there could be the situation where the core height wasn't updated every block. + if let Some(second_to_check_quorums) = second_to_check_quorums { + let quorum = Platform::::choose_quorum( + self.config.chain_lock_quorum_type(), + second_to_check_quorums, + request_id.as_ref(), + platform_version, + )?; + + let Some((quorum_hash, public_key)) = quorum else { + // we return that we are not able to verify + return Ok(None); + }; + + // The signature must verify against the quorum public key and SHA256(llmqType, quorumHash, SHA256(height), blockHash). llmqType and quorumHash must be taken from the quorum selected in 1. + + let mut engine = sha256d::Hash::engine(); + + engine.input(&[self.config.chain_lock_quorum_type() as u8]); + engine.input(quorum_hash.as_slice()); + engine.input(request_id.as_byte_array()); + engine.input(chain_lock.block_hash.as_byte_array()); + + let message_digest = sha256d::Hash::from_engine(engine); + + chain_lock_verified = public_key.verify(&signature, message_digest.as_ref()); + + tracing::debug!( + ?chain_lock, + "h:{} r:{} tried second quorums message_digest for chain lock at height {} is {}, quorum hash is {}, block hash is {}, chain lock was {}", + platform_state.last_committed_block_height() + 1, + round, + chain_lock.block_height, + hex::encode(message_digest.as_byte_array()), + hex::encode(quorum_hash.as_slice()), + hex::encode(chain_lock.block_hash.as_byte_array()), + if chain_lock_verified { "verified"} else {"not verified"} + ); + if !chain_lock_verified { + tracing::debug!( + "chain lock was invalid for both recent and old chain lock quorums" + ); + } + } else if platform_state + .previous_height_chain_lock_validating_quorums() + .is_none() + { + // we don't have old quorums, this means our node is very new. + tracing::debug!( + "we had no previous quorums locally, we should validate through core", + ); + return Ok(None); + } else if !should_be_verifiable { + tracing::debug!( + "we were in a situation where it would be possible we didn't have all quorums and we couldn't verify locally, we should validate through core", + ); + return Ok(None); + } else if round >= 10 { + tracing::debug!("high round when chain lock was invalid, asking core to verify"); + } else { + tracing::debug!("chain lock was invalid, and we deemed there was no reason to check old quorums"); + } + } + + return Ok(Some(chain_lock_verified)); + } +} + +#[cfg(test)] +mod tests { + use crate::execution::platform_events::core_chain_lock::verify_chain_lock_locally::v0::CHAIN_LOCK_REQUEST_ID_PREFIX; + use dpp::dashcore::hashes::{sha256d, Hash, HashEngine}; + use dpp::dashcore::QuorumSigningRequestId; + + #[test] + fn verify_request_id() { + assert_eq!( + hex::encode(CHAIN_LOCK_REQUEST_ID_PREFIX.as_bytes()), + "636c736967" + ); + assert_eq!(hex::encode(122u32.to_le_bytes()), "7a000000"); + + let mut engine = QuorumSigningRequestId::engine(); + + engine.input(&[CHAIN_LOCK_REQUEST_ID_PREFIX.len() as u8]); + engine.input(CHAIN_LOCK_REQUEST_ID_PREFIX.as_bytes()); + engine.input(122u32.to_le_bytes().as_slice()); + + let request_id = QuorumSigningRequestId::from_engine(engine); + + assert_eq!( + hex::encode(request_id.as_byte_array()), + "e1a9d40e5145fdc168819125b5ae1b8f12d5115471624eb363a6c7a3693be2e6" + ); + + // + // let mut chain_lock_verified = public_key.verify(&signature, message_digest.as_ref()); + } + + #[test] + fn verify_message_digest() { + let mut engine = QuorumSigningRequestId::engine(); + + engine.input(&[CHAIN_LOCK_REQUEST_ID_PREFIX.len() as u8]); + engine.input(CHAIN_LOCK_REQUEST_ID_PREFIX.as_bytes()); + engine.input(956087u32.to_le_bytes().as_slice()); + + let request_id = QuorumSigningRequestId::from_engine(engine); + + assert_eq!( + hex::encode(request_id.as_byte_array()), + "ea04b27adfaa698487aee46b922fb8f1c77a562787b6afe65eecf7e685888928" + ); + + let mut block_hash = + hex::decode("000000d94ea7ac4f86c5f583e7da0feb90b9f8d038f25e55cc305524c5327266") + .unwrap(); + let mut quorum_hash = + hex::decode("0000009d376e73a22aa997bb6542bd1fc3018f61c2301a817126a737ffdcdc80") + .unwrap(); + + block_hash.reverse(); + quorum_hash.reverse(); + + let mut engine = sha256d::Hash::engine(); + + engine.input(&[1u8]); + engine.input(quorum_hash.as_slice()); + engine.input(request_id.to_byte_array().as_slice()); + engine.input(block_hash.as_slice()); + + let mut message_digest = sha256d::Hash::from_engine(engine).as_byte_array().to_vec(); + + message_digest.reverse(); + + assert_eq!( + hex::encode(message_digest.as_slice()), + "5ec53e83b8ff390b970e28db21da5b8e45fbe3b69d9f11a2c39062769b1f5e47" + ); + } +} diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_through_core/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_through_core/mod.rs new file mode 100644 index 0000000000..e7c585498d --- /dev/null +++ b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_through_core/mod.rs @@ -0,0 +1,39 @@ +mod v0; + +use crate::error::execution::ExecutionError; +use crate::error::Error; +use dpp::dashcore::ChainLock; + +use crate::platform_types::platform::Platform; + +use crate::rpc::core::CoreRPCLike; + +use crate::execution::platform_events::core_chain_lock::make_sure_core_is_synced_to_chain_lock::CoreSyncStatus; +use dpp::version::PlatformVersion; + +impl Platform +where + C: CoreRPCLike, +{ + /// Verify the chain lock through core + pub fn verify_chain_lock_through_core( + &self, + chain_lock: &ChainLock, + submit: bool, + platform_version: &PlatformVersion, + ) -> Result<(bool, Option), Error> { + match platform_version + .drive_abci + .methods + .core_chain_lock + .verify_chain_lock_through_core + { + 0 => self.verify_chain_lock_through_core_v0(chain_lock, submit, platform_version), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "verify_chain_lock_through_core".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_through_core/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_through_core/v0/mod.rs new file mode 100644 index 0000000000..063794afc1 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_through_core/v0/mod.rs @@ -0,0 +1,43 @@ +use crate::error::Error; +use dpp::dashcore::ChainLock; +use dpp::version::PlatformVersion; +use crate::execution::platform_events::core_chain_lock::make_sure_core_is_synced_to_chain_lock::CoreSyncStatus; +use crate::execution::platform_events::core_chain_lock::make_sure_core_is_synced_to_chain_lock::CoreSyncStatus::{CoreAlmostSynced, CoreIsSynced, CoreNotSynced}; + +use crate::platform_types::platform::Platform; + +use crate::rpc::core::CoreRPCLike; + +impl Platform +where + C: CoreRPCLike, +{ + /// Verify the chain lock through core v0 + pub fn verify_chain_lock_through_core_v0( + &self, + chain_lock: &ChainLock, + submit: bool, + platform_version: &PlatformVersion, + ) -> Result<(bool, Option), Error> { + if submit { + let given_chain_lock_height = chain_lock.block_height; + + let best_chain_locked_height = self.core_rpc.submit_chain_lock(chain_lock)?; + Ok(if best_chain_locked_height >= given_chain_lock_height { + (true, Some(CoreIsSynced)) + } else if best_chain_locked_height - given_chain_lock_height + <= platform_version + .drive_abci + .methods + .core_chain_lock + .recent_block_count_amount + { + (true, Some(CoreAlmostSynced)) + } else { + (true, Some(CoreNotSynced)) + }) + } else { + Ok((self.core_rpc.verify_chain_lock(chain_lock)?, None)) + } + } +} diff --git a/packages/rs-drive-abci/src/execution/platform_events/epoch/gather_epoch_info/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/epoch/gather_epoch_info/v0/mod.rs index a64fb5ac28..ea3dd74b65 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/epoch/gather_epoch_info/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/epoch/gather_epoch_info/v0/mod.rs @@ -19,7 +19,7 @@ impl Platform { // Start by getting information from the state let state = self.state.read().unwrap(); - let last_block_time_ms = state.last_block_time_ms(); + let last_block_time_ms = state.last_committed_block_time_ms(); // Init block execution context let block_state_info = block_state_info::v0::BlockStateInfoV0::from_block_proposal( diff --git a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/pool_withdrawals_into_transactions_queue/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/pool_withdrawals_into_transactions_queue/v0/mod.rs index 139820ec9a..5e17d00ffc 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/pool_withdrawals_into_transactions_queue/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/pool_withdrawals_into_transactions_queue/v0/mod.rs @@ -209,6 +209,8 @@ mod tests { current_validator_set_quorum_hash: QuorumHash::all_zeros(), next_validator_set_quorum_hash: None, validator_sets: Default::default(), + chain_lock_validating_quorums: Default::default(), + previous_height_chain_lock_validating_quorums: None, full_masternode_list: Default::default(), hpmn_masternode_list: Default::default(), genesis_block_info: None, diff --git a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/update_broadcasted_withdrawal_transaction_statuses/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/update_broadcasted_withdrawal_transaction_statuses/v0/mod.rs index d0d503ada1..5a8c4e13e1 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/update_broadcasted_withdrawal_transaction_statuses/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/update_broadcasted_withdrawal_transaction_statuses/v0/mod.rs @@ -348,6 +348,8 @@ mod tests { current_validator_set_quorum_hash: QuorumHash::all_zeros(), next_validator_set_quorum_hash: None, validator_sets: Default::default(), + chain_lock_validating_quorums: Default::default(), + previous_height_chain_lock_validating_quorums: None, full_masternode_list: Default::default(), hpmn_masternode_list: Default::default(), genesis_block_info: None, diff --git a/packages/rs-drive-abci/src/execution/platform_events/initialization/initial_core_height/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/initialization/initial_core_height/v0/mod.rs index 3df1edb88d..ab50a9e6de 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/initialization/initial_core_height/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/initialization/initial_core_height/v0/mod.rs @@ -44,7 +44,7 @@ where let v20_fork = fork_info.height.unwrap(); if let Some(requested) = requested { - let best = self.core_rpc.get_best_chain_lock()?.core_block_height; + let best = self.core_rpc.get_best_chain_lock()?.block_height; tracing::trace!( requested, diff --git a/packages/rs-drive-abci/src/execution/platform_events/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/mod.rs index 51efcb0866..7e79189add 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/mod.rs @@ -25,3 +25,6 @@ pub(in crate::execution) mod withdrawals; /// Events happening what starting to process a block pub(in crate::execution) mod block_start; + +/// Verify the chain lock +pub(in crate::execution) mod core_chain_lock; diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/check_withdrawals/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/check_withdrawals/v0/mod.rs index 7c7594d1bb..32a957cf4f 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/check_withdrawals/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/check_withdrawals/v0/mod.rs @@ -53,7 +53,7 @@ where let quorum_hash = quorum_hash.expect("quorum hash is required to verify signature"); let validation_result = received_withdrawals.verify_signatures( &self.config.abci.chain_id, - self.config.quorum_type(), + self.config.validator_set_quorum_type(), quorum_hash, height, round, diff --git a/packages/rs-drive-abci/src/execution/types/block_execution_context/mod.rs b/packages/rs-drive-abci/src/execution/types/block_execution_context/mod.rs index 0ff0b61749..89e78136e9 100644 --- a/packages/rs-drive-abci/src/execution/types/block_execution_context/mod.rs +++ b/packages/rs-drive-abci/src/execution/types/block_execution_context/mod.rs @@ -15,7 +15,7 @@ use std::collections::BTreeMap; use tenderdash_abci::proto::abci::ResponsePrepareProposal; /// The versioned block execution context -#[derive(Debug, From)] +#[derive(Debug, From, Clone)] pub enum BlockExecutionContext { /// Version 0 V0(v0::BlockExecutionContextV0), diff --git a/packages/rs-drive-abci/src/execution/types/block_execution_context/v0/mod.rs b/packages/rs-drive-abci/src/execution/types/block_execution_context/v0/mod.rs index 33cd7fa2f1..587407bb47 100644 --- a/packages/rs-drive-abci/src/execution/types/block_execution_context/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/types/block_execution_context/v0/mod.rs @@ -36,7 +36,7 @@ use std::collections::BTreeMap; use tenderdash_abci::proto::abci::ResponsePrepareProposal; /// V0 of the Block execution context -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct BlockExecutionContextV0 { /// Block info pub block_state_info: BlockStateInfo, diff --git a/packages/rs-drive-abci/src/execution/types/block_state_info/mod.rs b/packages/rs-drive-abci/src/execution/types/block_state_info/mod.rs index 86e794cc00..684bcaaa56 100644 --- a/packages/rs-drive-abci/src/execution/types/block_state_info/mod.rs +++ b/packages/rs-drive-abci/src/execution/types/block_state_info/mod.rs @@ -11,7 +11,7 @@ use dpp::block::block_info::BlockInfo; use dpp::block::epoch::Epoch; /// The versioned block state info -#[derive(Debug, From)] +#[derive(Debug, From, Clone, Eq, PartialEq)] pub enum BlockStateInfo { /// Version 0 V0(v0::BlockStateInfoV0), diff --git a/packages/rs-drive-abci/src/execution/types/block_state_info/v0/mod.rs b/packages/rs-drive-abci/src/execution/types/block_state_info/v0/mod.rs index 1b58804fdb..8e3b405e65 100644 --- a/packages/rs-drive-abci/src/execution/types/block_state_info/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/types/block_state_info/v0/mod.rs @@ -34,7 +34,7 @@ use dpp::block::block_info::BlockInfo; use dpp::block::epoch::Epoch; /// Block info -#[derive(Debug, Clone)] +#[derive(Debug, Clone, PartialEq, Eq)] pub struct BlockStateInfoV0 { /// Block height pub height: u64, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs index 20d35ea0b2..e3864c27c4 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs @@ -146,7 +146,7 @@ pub(super) fn state_transition_to_execution_event_for_check_tx_v0<'a, C: CoreRPC let execution_event = ExecutionEvent::create_from_state_transition_action( action, maybe_identity, - platform.state.epoch_ref(), + platform.state.last_committed_block_epoch_ref(), state_transition_execution_context, platform_version, )?; @@ -206,7 +206,7 @@ pub(super) fn state_transition_to_execution_event_for_check_tx_v0<'a, C: CoreRPC let execution_event = ExecutionEvent::create_from_state_transition_action( action, maybe_identity, - platform.state.epoch_ref(), + platform.state.last_committed_block_epoch_ref(), state_transition_execution_context, platform_version, )?; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs index ac909f52e0..f9d712bc9a 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs @@ -111,7 +111,7 @@ pub(in crate::execution) fn process_state_transition_v0<'a, C: CoreRPCLike>( ExecutionEvent::create_from_state_transition_action( action, maybe_identity, - platform.state.epoch_ref(), + platform.state.last_committed_block_epoch_ref(), state_transition_execution_context, platform_version, ) diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs index 151eca048e..cd571da9b8 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs @@ -147,10 +147,10 @@ mod tests { .data_contract_owned(); let config = PlatformConfig { - quorum_size: 10, + validator_set_quorum_size: 10, execution: ExecutionConfig { verify_sum_trees: true, - validator_set_quorum_rotation_block_count: 25, + validator_set_rotation_block_count: 25, ..Default::default() }, block_spacing_ms: 300, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/structure_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/structure_v0/mod.rs index 22409379a8..be05c9bd56 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/structure_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/structure_v0/mod.rs @@ -78,7 +78,7 @@ impl DocumentCreateTransitionActionStructureValidationV0 for DocumentCreateTrans // Validate timestamps against block time // we do validation here but not in validate state because it's a cheap validation // and validate state implements expensive validation only - let latest_block_time_ms = platform.state.last_block_time_ms(); + let latest_block_time_ms = platform.state.last_committed_block_time_ms(); let average_block_spacing_ms = platform.config.block_spacing_ms; // We do not need to perform these checks on genesis diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/structure_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/structure_v0/mod.rs index 1bf0ba9b8d..8430b1a1fa 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/structure_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/structure_v0/mod.rs @@ -58,7 +58,7 @@ impl DocumentReplaceTransitionActionStructureValidationV0 for DocumentReplaceTra // Validate timestamps against block time // we do validation here but not in validate state because it's a cheap validation // and validate state implements expensive validation only - let latest_block_time_ms = platform.state.last_block_time_ms(); + let latest_block_time_ms = platform.state.last_committed_block_time_ms(); let average_block_spacing_ms = platform.config.block_spacing_ms; if let Some(latest_block_time_ms) = latest_block_time_ms { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/v0/mod.rs index 42b0751659..61da179ca6 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/v0/mod.rs @@ -77,7 +77,7 @@ pub fn create_contact_request_data_trigger_v0( } if let Some(core_height_created_at) = maybe_core_height_created_at { - let core_chain_locked_height = context.platform.state.core_height(); + let core_chain_locked_height = context.platform.state.last_committed_core_height(); let height_window_start = core_chain_locked_height.saturating_sub(BLOCKS_SIZE_WINDOW); let height_window_end = core_chain_locked_height.saturating_add(BLOCKS_SIZE_WINDOW); diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/feature_flags/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/feature_flags/v0/mod.rs index 2a307ea5da..6300fdcc57 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/feature_flags/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/feature_flags/v0/mod.rs @@ -60,7 +60,7 @@ pub fn create_feature_flag_data_trigger_v0( ))) })?; - let latest_block_height = context.platform.state.height(); + let latest_block_height = context.platform.state.last_committed_height(); if enable_at_height < latest_block_height { let err = DataTriggerConditionError::new( diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/fetch_documents.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/fetch_documents.rs index 1b55ac6a67..6ca0dc3544 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/fetch_documents.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/fetch_documents.rs @@ -82,7 +82,7 @@ pub(crate) fn fetch_documents_for_transitions_knowing_contract_id_and_document_t let add_to_cache_if_pulled = transaction.is_some(); let (_, contract_fetch_info) = drive.get_contract_with_fetch_info_and_fee( contract_id.to_buffer(), - Some(&platform.state.epoch()), + Some(&platform.state.last_committed_block_epoch()), add_to_cache_if_pulled, transaction, platform_version, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/state/v0/mod.rs index 335bec12a7..aef587218e 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/state/v0/mod.rs @@ -91,11 +91,13 @@ impl IdentityCreditWithdrawalStateTransitionStateValidationV0 &self, platform: &PlatformRef, ) -> Result, Error> { - let last_block_time = platform.state.last_block_time_ms().ok_or(Error::Execution( - ExecutionError::StateNotInitialized( - "expected a last platform block during identity update validation", - ), - ))?; + let last_block_time = + platform + .state + .last_committed_block_time_ms() + .ok_or(Error::Execution(ExecutionError::StateNotInitialized( + "expected a last platform block during identity update validation", + )))?; Ok(ConsensusValidationResult::new_with_data( IdentityCreditWithdrawalTransitionAction::from_identity_credit_withdrawal( diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/state/v0/mod.rs index 7619699f12..828635abb0 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/state/v0/mod.rs @@ -123,11 +123,13 @@ impl IdentityUpdateStateTransitionStateValidationV0 for IdentityUpdateTransition if let Some(disabled_at_ms) = self.public_keys_disabled_at() { // We need to verify the time the keys were disabled - let last_block_time = platform.state.last_block_time_ms().ok_or( - Error::Execution(ExecutionError::StateNotInitialized( - "expected a last platform block during identity update validation", - )), - )?; + let last_block_time = + platform + .state + .last_committed_block_time_ms() + .ok_or(Error::Execution(ExecutionError::StateNotInitialized( + "expected a last platform block during identity update validation", + )))?; let window_validation_result = validate_time_in_block_time_window( last_block_time, diff --git a/packages/rs-drive-abci/src/mimic/mod.rs b/packages/rs-drive-abci/src/mimic/mod.rs index 1c532fba21..640a6baa1a 100644 --- a/packages/rs-drive-abci/src/mimic/mod.rs +++ b/packages/rs-drive-abci/src/mimic/mod.rs @@ -29,6 +29,8 @@ use tenderdash_abci::proto::types::{ use tenderdash_abci::signatures::SignBytes; use tenderdash_abci::{signatures::SignDigest, proto::version::Consensus, Application}; use tenderdash_abci::proto::abci::tx_record::TxAction; +use crate::execution::types::block_execution_context::v0::BlockExecutionContextV0Getters; +use crate::execution::types::block_state_info::v0::BlockStateInfoV0Getters; use crate::mimic::test_quorum::TestQuorumInfo; /// Test quorum for mimic block execution @@ -65,6 +67,10 @@ pub struct MimicExecuteBlockOptions { pub dont_finalize_block: bool, /// rounds before finalization pub rounds_before_finalization: Option, + /// max tx bytes per block + pub max_tx_bytes_per_block: u64, + /// run process proposal independently + pub independent_process_proposal_verification: bool, } impl<'a, C: CoreRPCLike> AbciApplication<'a, C> { @@ -80,9 +86,30 @@ impl<'a, C: CoreRPCLike> AbciApplication<'a, C> { expect_validation_errors: &[u32], expect_vote_extension_errors: bool, state_transitions: Vec, - max_tx_bytes_per_block: i64, options: MimicExecuteBlockOptions, ) -> Result { + // This will be NONE, except on init chain + let original_block_execution_context = self + .platform + .block_execution_context + .read() + .unwrap() + .as_ref() + .cloned(); + + let transaction_guard = self.transaction.read().unwrap(); + + let init_chain_root_hash = transaction_guard.as_ref().map(|transaction| { + self.platform + .drive + .grove + .root_hash(Some(transaction)) + .unwrap() + .unwrap() + }); + + drop(transaction_guard); + const APP_VERSION: u64 = 0; let mut rng = StdRng::seed_from_u64(block_info.height); @@ -106,7 +133,7 @@ impl<'a, C: CoreRPCLike> AbciApplication<'a, C> { // PREPARE (also processes internally) let request_prepare_proposal = RequestPrepareProposal { - max_tx_bytes: max_tx_bytes_per_block, + max_tx_bytes: options.max_tx_bytes_per_block as i64, txs: serialized_state_transitions.clone(), local_last_commit: None, misbehavior: vec![], @@ -217,14 +244,112 @@ impl<'a, C: CoreRPCLike> AbciApplication<'a, C> { quorum_hash: current_quorum.quorum_hash.to_byte_array().to_vec(), }; - //we must call process proposal so the app hash is set - self.process_proposal(request_process_proposal) - .unwrap_or_else(|e| { - panic!( - "should skip processing (because we prepared it) block #{} at time #{} : {:?}", - block_info.height, block_info.time_ms, e - ) - }); + if !options.independent_process_proposal_verification { + //we just check as if we were the proposer + //we must call process proposal so the app hash is set + self.process_proposal(request_process_proposal) + .unwrap_or_else(|e| { + panic!( + "should skip processing (because we prepared it) block #{} at time #{} : {:?}", + block_info.height, block_info.time_ms, e + ) + }); + } else { + //we first call process proposal as the proposer + //we must call process proposal so the app hash is set + self.process_proposal(request_process_proposal.clone()) + .unwrap_or_else(|e| { + panic!( + "should skip processing (because we prepared it) block #{} at time #{} : {:?}", + block_info.height, block_info.time_ms, e + ) + }); + + let mut block_execution_context = + self.platform.block_execution_context.write().unwrap(); + + let application_hash = block_execution_context + .as_ref() + .expect("expected a block execution context") + .block_state_info() + .app_hash() + .expect("expected an application hash after process proposal"); + + *block_execution_context = original_block_execution_context.clone(); + drop(block_execution_context); + + if let Some(init_chain_root_hash) = init_chain_root_hash + //we are in init chain + { + // special logic on init chain + let transaction = self.transaction.write().unwrap(); + + let transaction = transaction.as_ref().ok_or(Error::Execution( + ExecutionError::NotInTransaction( + "trying to finalize block without a current transaction", + ), + ))?; + + transaction + .rollback_to_savepoint() + .expect("expected to rollback to savepoint"); + + let start_root_hash = self + .platform + .drive + .grove + .root_hash(Some(transaction)) + .unwrap() + .unwrap(); + assert_eq!(start_root_hash, init_chain_root_hash); + // this is just to verify that the rollback worked. + }; + + //we call process proposal as if we are a processor + self.process_proposal(request_process_proposal) + .unwrap_or_else(|e| { + panic!( + "should skip processing (because we prepared it) block #{} at time #{} : {:?}", + block_info.height, block_info.time_ms, e + ) + }); + + let block_execution_context = self.platform.block_execution_context.read().unwrap(); + + let process_proposal_application_hash = block_execution_context + .as_ref() + .expect("expected a block execution context") + .block_state_info() + .app_hash() + .expect("expected an application hash after process proposal"); + + assert_eq!( + application_hash, process_proposal_application_hash, + "the application hashed are not valid for height {}", + block_info.height + ); + + let transaction_guard = self.transaction.read().unwrap(); + + let transaction = transaction_guard.as_ref().ok_or(Error::Execution( + ExecutionError::NotInTransaction( + "trying to finalize block without a current transaction", + ), + ))?; + + let direct_root_hash = self + .platform + .drive + .grove + .root_hash(Some(transaction)) + .unwrap() + .unwrap(); + assert_eq!( + application_hash, direct_root_hash, + "the application hashed are not valid for height {}", + block_info.height + ); + } let request_extend_vote = RequestExtendVote { hash: block_header_hash.to_vec(), @@ -321,7 +446,7 @@ impl<'a, C: CoreRPCLike> AbciApplication<'a, C> { // We need to sign the block - let quorum_type = self.platform.config.quorum_type(); + let quorum_type = self.platform.config.validator_set_quorum_type(); let state_id_hash = state_id .sha256(CHAIN_ID, height as i64, round as i32) .expect("cannot calculate state id hash"); diff --git a/packages/rs-drive-abci/src/platform_types/block_proposal/v0.rs b/packages/rs-drive-abci/src/platform_types/block_proposal/v0.rs index 31486f97e0..7ed2273d95 100644 --- a/packages/rs-drive-abci/src/platform_types/block_proposal/v0.rs +++ b/packages/rs-drive-abci/src/platform_types/block_proposal/v0.rs @@ -1,8 +1,13 @@ use crate::abci::AbciError; use crate::error::Error; +use dpp::dashcore::bls_sig_utils::BLSSignature; +use dpp::dashcore::hashes::Hash; +use dpp::dashcore::{BlockHash, ChainLock}; +use dpp::platform_value::Bytes32; use std::fmt; use tenderdash_abci::proto::abci::{RequestPrepareProposal, RequestProcessProposal}; use tenderdash_abci::proto::serializers::timestamp::ToMilis; +use tenderdash_abci::proto::types::CoreChainLock; use tenderdash_abci::proto::version::Consensus; /// The block proposal is the combination of information that a proposer will propose, @@ -20,6 +25,8 @@ pub struct BlockProposal<'a> { pub block_time_ms: u64, /// Block height of the core chain pub core_chain_locked_height: u32, + /// Potential update core chain lock + pub core_chain_lock_update: Option, /// The proposed app version pub proposed_app_version: u64, /// Block proposer's proTxHash @@ -133,6 +140,7 @@ impl<'a> TryFrom<&'a RequestPrepareProposal> for BlockProposal<'a> { height: *height as u64, round: *round as u32, core_chain_locked_height: *core_chain_locked_height, + core_chain_lock_update: None, //there is no need to verify a chain lock we are proposing proposed_app_version: *proposed_app_version, proposer_pro_tx_hash, validator_set_quorum_hash, @@ -157,7 +165,7 @@ impl<'a> TryFrom<&'a RequestProcessProposal> for BlockProposal<'a> { time, next_validators_hash: _, core_chain_locked_height, - core_chain_lock_update: _, + core_chain_lock_update, proposer_pro_tx_hash, proposed_app_version, version, @@ -207,12 +215,36 @@ impl<'a> TryFrom<&'a RequestProcessProposal> for BlockProposal<'a> { ) .into()); } + + let core_chain_lock_update = core_chain_lock_update + .as_ref() + .map(|core_chain_lock| { + let CoreChainLock { + core_block_height, + core_block_hash, + signature, + } = core_chain_lock; + + let block_hash: Bytes32 = Bytes32::from_vec(core_block_hash.clone())?; + + let signature: [u8; 96] = signature.clone().try_into().map_err(|_| { + AbciError::BadRequest("core chain lock signature not 96 bytes".to_string()) + })?; + + Ok::(ChainLock { + block_height: *core_block_height, + block_hash: BlockHash::from_byte_array(block_hash.0), + signature: BLSSignature::from(signature), + }) + }) + .transpose()?; Ok(Self { consensus_versions, block_hash: Some(block_hash), height: *height as u64, round: *round as u32, core_chain_locked_height: *core_chain_locked_height, + core_chain_lock_update, proposed_app_version: *proposed_app_version, proposer_pro_tx_hash, validator_set_quorum_hash, diff --git a/packages/rs-drive-abci/src/platform_types/epoch_info/mod.rs b/packages/rs-drive-abci/src/platform_types/epoch_info/mod.rs index 4d20118a55..78dac32a8c 100644 --- a/packages/rs-drive-abci/src/platform_types/epoch_info/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/epoch_info/mod.rs @@ -15,7 +15,7 @@ use serde::{Deserialize, Serialize}; pub mod v0; /// Info pertinent to the current epoch. -#[derive(Clone, Serialize, Deserialize, Debug, From)] +#[derive(Clone, Serialize, Deserialize, Debug, From, Eq, PartialEq)] #[serde(rename_all = "camelCase")] pub enum EpochInfo { /// Version 0 diff --git a/packages/rs-drive-abci/src/platform_types/epoch_info/v0/mod.rs b/packages/rs-drive-abci/src/platform_types/epoch_info/v0/mod.rs index 81a1c62c3b..b0891428c7 100644 --- a/packages/rs-drive-abci/src/platform_types/epoch_info/v0/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/epoch_info/v0/mod.rs @@ -45,7 +45,7 @@ use rust_decimal::Decimal; use serde::{Deserialize, Serialize}; /// Info pertinent to the current epoch. -#[derive(Clone, Serialize, Deserialize, Debug)] +#[derive(Clone, Serialize, Deserialize, Debug, Eq, PartialEq)] #[serde(rename_all = "camelCase")] pub struct EpochInfoV0 { /// Current epoch index diff --git a/packages/rs-drive-abci/src/platform_types/mod.rs b/packages/rs-drive-abci/src/platform_types/mod.rs index 3c9ea91fde..7602529bab 100644 --- a/packages/rs-drive-abci/src/platform_types/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/mod.rs @@ -58,3 +58,6 @@ pub mod validator; pub mod validator_set; /// Withdrawal types pub mod withdrawal; + +/// Verify chain lock result +pub mod verify_chain_lock_result; diff --git a/packages/rs-drive-abci/src/platform_types/platform/mod.rs b/packages/rs-drive-abci/src/platform_types/platform/mod.rs index 619c02bd0e..54c9f8cea4 100644 --- a/packages/rs-drive-abci/src/platform_types/platform/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/platform/mod.rs @@ -103,7 +103,7 @@ impl Platform { path: P, config: Option, ) -> Result, Error> { - let config = config.unwrap_or_default(); + let config = config.unwrap_or(PlatformConfig::default_testnet()); let core_rpc = DefaultCoreRPC::open( config.core.rpc.url().as_str(), config.core.rpc.username.clone(), @@ -174,7 +174,7 @@ impl Platform { where C: CoreRPCLike, { - let config = config.unwrap_or_default(); + let config = config.unwrap_or(PlatformConfig::default_testnet()); let drive = Drive::open(path, Some(config.drive.clone())).map_err(Error::Drive)?; diff --git a/packages/rs-drive-abci/src/platform_types/platform_state/mod.rs b/packages/rs-drive-abci/src/platform_types/platform_state/mod.rs index 9e03b3f2b2..8c7bf8ddc5 100644 --- a/packages/rs-drive-abci/src/platform_types/platform_state/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/platform_state/mod.rs @@ -24,6 +24,7 @@ use indexmap::IndexMap; use crate::error::execution::ExecutionError; use dpp::block::block_info::BlockInfo; +use dpp::bls_signatures::PublicKey as ThresholdBlsPublicKey; use dpp::util::hash::hash; use std::collections::BTreeMap; @@ -194,75 +195,69 @@ impl TryFromPlatformVersioned for PlatformState { } impl PlatformStateV0Methods for PlatformState { - fn height(&self) -> u64 { + fn last_committed_height(&self) -> u64 { match self { - PlatformState::V0(v0) => v0.height(), + PlatformState::V0(v0) => v0.last_committed_height(), } } - fn known_height_or(&self, default: u64) -> u64 { + fn last_committed_known_height_or(&self, default: u64) -> u64 { match self { - PlatformState::V0(v0) => v0.known_height_or(default), + PlatformState::V0(v0) => v0.last_committed_known_height_or(default), } } - fn core_height(&self) -> u32 { + fn last_committed_core_height(&self) -> u32 { match self { - PlatformState::V0(v0) => v0.core_height(), + PlatformState::V0(v0) => v0.last_committed_core_height(), } } - fn known_core_height_or(&self, default: u32) -> u32 { + fn last_committed_known_core_height_or(&self, default: u32) -> u32 { match self { - PlatformState::V0(v0) => v0.known_core_height_or(default), + PlatformState::V0(v0) => v0.last_committed_known_core_height_or(default), } } - fn last_block_time_ms(&self) -> Option { + fn last_committed_block_time_ms(&self) -> Option { match self { - PlatformState::V0(v0) => v0.last_block_time_ms(), + PlatformState::V0(v0) => v0.last_committed_block_time_ms(), } } - fn last_quorum_hash(&self) -> [u8; 32] { + fn last_committed_quorum_hash(&self) -> [u8; 32] { match self { - PlatformState::V0(v0) => v0.last_quorum_hash(), + PlatformState::V0(v0) => v0.last_committed_quorum_hash(), } } - fn last_block_signature(&self) -> [u8; 96] { + fn last_committed_block_signature(&self) -> [u8; 96] { match self { - PlatformState::V0(v0) => v0.last_block_signature(), + PlatformState::V0(v0) => v0.last_committed_block_signature(), } } - fn last_block_app_hash(&self) -> Option<[u8; 32]> { + fn last_committed_block_app_hash(&self) -> Option<[u8; 32]> { match self { - PlatformState::V0(v0) => v0.last_block_app_hash(), + PlatformState::V0(v0) => v0.last_committed_block_app_hash(), } } - fn last_block_height(&self) -> u64 { + fn last_committed_block_height(&self) -> u64 { match self { - PlatformState::V0(v0) => v0.last_block_height(), + PlatformState::V0(v0) => v0.last_committed_block_height(), } } - fn last_block_round(&self) -> u32 { + fn last_committed_block_round(&self) -> u32 { match self { - PlatformState::V0(v0) => v0.last_block_round(), + PlatformState::V0(v0) => v0.last_committed_block_round(), } } - fn epoch(&self) -> Epoch { + fn last_committed_block_epoch(&self) -> Epoch { match self { - PlatformState::V0(v0) => v0.epoch(), - } - } - - fn epoch_ref(&self) -> &Epoch { - match self { - PlatformState::V0(v0) => v0.epoch_ref(), + PlatformState::V0(v0) => v0.last_committed_block_epoch(), } } @@ -278,15 +273,15 @@ impl PlatformStateV0Methods for PlatformState { } } - fn current_protocol_version_in_consensus(&self) -> ProtocolVersion { + fn last_committed_block_info(&self) -> &Option { match self { - PlatformState::V0(v0) => v0.current_protocol_version_in_consensus(), + PlatformState::V0(v0) => &v0.last_committed_block_info, } } - fn last_committed_block_info(&self) -> &Option { + fn current_protocol_version_in_consensus(&self) -> ProtocolVersion { match self { - PlatformState::V0(v0) => &v0.last_committed_block_info, + PlatformState::V0(v0) => v0.current_protocol_version_in_consensus(), } } @@ -308,12 +303,24 @@ impl PlatformStateV0Methods for PlatformState { } } + fn take_next_validator_set_quorum_hash(&mut self) -> Option { + match self { + PlatformState::V0(v0) => v0.take_next_validator_set_quorum_hash(), + } + } + fn validator_sets(&self) -> &IndexMap { match self { PlatformState::V0(v0) => &v0.validator_sets, } } + fn chain_lock_validating_quorums(&self) -> &BTreeMap { + match self { + PlatformState::V0(v0) => &v0.chain_lock_validating_quorums, + } + } + fn full_masternode_list(&self) -> &BTreeMap { match self { PlatformState::V0(v0) => &v0.full_masternode_list, @@ -332,6 +339,12 @@ impl PlatformStateV0Methods for PlatformState { } } + fn any_block_info(&self) -> &BlockInfo { + match self { + PlatformState::V0(v0) => v0.any_block_info(), + } + } + fn set_last_committed_block_info(&mut self, info: Option) { match self { PlatformState::V0(v0) => v0.set_last_committed_block_info(info), @@ -368,6 +381,41 @@ impl PlatformStateV0Methods for PlatformState { } } + fn set_chain_lock_validating_quorums( + &mut self, + quorums: BTreeMap, + ) { + match self { + PlatformState::V0(v0) => v0.set_chain_lock_validating_quorums(quorums), + } + } + + fn replace_chain_lock_validating_quorums( + &mut self, + quorums: BTreeMap, + ) -> BTreeMap { + match self { + PlatformState::V0(v0) => v0.replace_chain_lock_validating_quorums(quorums), + } + } + + fn set_previous_chain_lock_validating_quorums( + &mut self, + previous_core_height: u32, + change_core_height: u32, + previous_quorums_change_height: Option, + quorums: BTreeMap, + ) { + match self { + PlatformState::V0(v0) => v0.set_previous_chain_lock_validating_quorums( + previous_core_height, + change_core_height, + previous_quorums_change_height, + quorums, + ), + } + } + fn set_full_masternode_list(&mut self, list: BTreeMap) { match self { PlatformState::V0(v0) => v0.set_full_masternode_list(list), @@ -422,33 +470,61 @@ impl PlatformStateV0Methods for PlatformState { } } - fn full_masternode_list_mut(&mut self) -> &mut BTreeMap { + fn chain_lock_validating_quorums_mut( + &mut self, + ) -> &mut BTreeMap { match self { - PlatformState::V0(v0) => v0.full_masternode_list_mut(), + PlatformState::V0(v0) => v0.chain_lock_validating_quorums_mut(), } } - fn hpmn_masternode_list_mut(&mut self) -> &mut BTreeMap { + fn previous_height_chain_lock_validating_quorums( + &self, + ) -> Option<&( + u32, + u32, + Option, + BTreeMap, + )> { match self { - PlatformState::V0(v0) => v0.hpmn_masternode_list_mut(), + PlatformState::V0(v0) => v0.previous_height_chain_lock_validating_quorums(), } } - fn take_next_validator_set_quorum_hash(&mut self) -> Option { + fn previous_height_chain_lock_validating_quorums_mut( + &mut self, + ) -> &mut Option<( + u32, + u32, + Option, + BTreeMap, + )> { match self { - PlatformState::V0(v0) => v0.take_next_validator_set_quorum_hash(), + PlatformState::V0(v0) => v0.previous_height_chain_lock_validating_quorums_mut(), } } - fn last_block_id_hash(&self) -> [u8; 32] { + fn full_masternode_list_mut(&mut self) -> &mut BTreeMap { match self { - PlatformState::V0(v0) => v0.last_block_id_hash(), + PlatformState::V0(v0) => v0.full_masternode_list_mut(), } } - fn any_block_info(&self) -> &BlockInfo { + fn hpmn_masternode_list_mut(&mut self) -> &mut BTreeMap { match self { - PlatformState::V0(v0) => v0.any_block_info(), + PlatformState::V0(v0) => v0.hpmn_masternode_list_mut(), + } + } + + fn last_committed_block_epoch_ref(&self) -> &Epoch { + match self { + PlatformState::V0(v0) => v0.last_committed_block_epoch_ref(), + } + } + + fn last_committed_block_id_hash(&self) -> [u8; 32] { + match self { + PlatformState::V0(v0) => v0.last_committed_block_id_hash(), } } } diff --git a/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs b/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs index af69a73643..2cb112bdaf 100644 --- a/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs @@ -17,7 +17,9 @@ use crate::platform_types::masternode::Masternode; use crate::platform_types::validator_set::ValidatorSet; use dpp::block::block_info::{BlockInfo, DEFAULT_BLOCK_INFO}; use dpp::block::extended_block_info::v0::ExtendedBlockInfoV0Getters; +use dpp::bls_signatures::PublicKey as ThresholdBlsPublicKey; use dpp::version::{PlatformVersion, TryIntoPlatformVersioned}; +use drive::grovedb::batch::Op; use std::collections::BTreeMap; use std::fmt::{Debug, Formatter}; @@ -41,6 +43,25 @@ pub struct PlatformStateV0 { /// all members pub validator_sets: IndexMap, + /// The current quorums used for validating chain locks (400 60 for mainnet) + pub chain_lock_validating_quorums: BTreeMap, + + /// The slightly old quorums used for validating chain locks, it's important to keep + /// these because validation of signatures happens for the quorums that are 8 blocks before the + /// height written in the chain lock (400 60 for mainnet) + /// The first u32 is the core height at which these chain lock validating quorums were last active + /// The second u32 is the core height we are changing at. + /// The third u32 is the core height the previous chain lock validating quorums became active. + /// Keeping all three is important for verifying the chain locks, as we can detect edge cases where we + /// must check a chain lock with both the previous height chain lock validating quorums and the + /// current ones + pub previous_height_chain_lock_validating_quorums: Option<( + u32, + u32, + Option, + BTreeMap, + )>, + /// current full masternode list pub full_masternode_list: BTreeMap, @@ -112,6 +133,15 @@ pub(super) struct PlatformStateForSavingV0 { #[bincode(with_serde)] pub validator_sets: Vec<(Bytes32, ValidatorSet)>, + /// The 400 60 quorums used for validating chain locks + #[bincode(with_serde)] + pub chain_lock_validating_quorums: Vec<(Bytes32, ThresholdBlsPublicKey)>, + + /// The quorums used for validating chain locks from a slightly previous height. + #[bincode(with_serde)] + pub previous_height_chain_lock_validating_quorums: + Option<(u32, u32, Option, Vec<(Bytes32, ThresholdBlsPublicKey)>)>, + /// current full masternode list pub full_masternode_list: BTreeMap, @@ -141,6 +171,31 @@ impl TryFrom for PlatformStateForSavingV0 { .into_iter() .map(|(k, v)| (k.to_byte_array().into(), v)) .collect(), + chain_lock_validating_quorums: value + .chain_lock_validating_quorums + .into_iter() + .map(|(k, v)| (k.to_byte_array().into(), v)) + .collect(), + previous_height_chain_lock_validating_quorums: value + .previous_height_chain_lock_validating_quorums + .map( + |( + previous_height, + change_height, + previous_quorums_change_height, + inner_value, + )| { + ( + previous_height, + change_height, + previous_quorums_change_height, + inner_value + .into_iter() + .map(|(k, v)| (k.to_byte_array().into(), v)) + .collect(), + ) + }, + ), full_masternode_list: value .full_masternode_list .into_iter() @@ -183,6 +238,31 @@ impl From for PlatformStateV0 { .into_iter() .map(|(k, v)| (QuorumHash::from_byte_array(k.to_buffer()), v)) .collect(), + chain_lock_validating_quorums: value + .chain_lock_validating_quorums + .into_iter() + .map(|(k, v)| (QuorumHash::from_byte_array(k.to_buffer()), v)) + .collect(), + previous_height_chain_lock_validating_quorums: value + .previous_height_chain_lock_validating_quorums + .map( + |( + previous_height, + change_height, + previous_quorums_change_height, + inner_value, + )| { + ( + previous_height, + change_height, + previous_quorums_change_height, + inner_value + .into_iter() + .map(|(k, v)| (QuorumHash::from_byte_array(k.to_buffer()), v)) + .collect(), + ) + }, + ), full_masternode_list: value .full_masternode_list .into_iter() @@ -210,6 +290,8 @@ impl PlatformStateV0 { current_validator_set_quorum_hash: QuorumHash::all_zeros(), next_validator_set_quorum_hash: None, validator_sets: Default::default(), + chain_lock_validating_quorums: Default::default(), + previous_height_chain_lock_validating_quorums: None, full_masternode_list: Default::default(), hpmn_masternode_list: Default::default(), genesis_block_info: None, @@ -220,27 +302,27 @@ impl PlatformStateV0 { /// Platform state methods introduced in version 0 of Platform State Struct pub trait PlatformStateV0Methods { /// The height of the platform, only committed blocks increase height - fn height(&self) -> u64; + fn last_committed_height(&self) -> u64; /// The height of the platform, only committed blocks increase height - fn known_height_or(&self, default: u64) -> u64; + fn last_committed_known_height_or(&self, default: u64) -> u64; /// The height of the core blockchain that Platform knows about through chain locks - fn core_height(&self) -> u32; + fn last_committed_core_height(&self) -> u32; /// The height of the core blockchain that Platform knows about through chain locks - fn known_core_height_or(&self, default: u32) -> u32; + fn last_committed_known_core_height_or(&self, default: u32) -> u32; /// The last block time in milliseconds - fn last_block_time_ms(&self) -> Option; + fn last_committed_block_time_ms(&self) -> Option; /// The last quorum hash - fn last_quorum_hash(&self) -> [u8; 32]; + fn last_committed_quorum_hash(&self) -> [u8; 32]; /// The last block signature - fn last_block_signature(&self) -> [u8; 96]; + fn last_committed_block_signature(&self) -> [u8; 96]; /// The last block app hash - fn last_block_app_hash(&self) -> Option<[u8; 32]>; + fn last_committed_block_app_hash(&self) -> Option<[u8; 32]>; /// The last block height or 0 for genesis - fn last_block_height(&self) -> u64; + fn last_committed_block_height(&self) -> u64; /// The last block round - fn last_block_round(&self) -> u32; + fn last_committed_block_round(&self) -> u32; /// The current epoch - fn epoch(&self) -> Epoch; + fn last_committed_block_epoch(&self) -> Epoch; /// HPMN list len fn hpmn_list_len(&self) -> usize; /// Get the current quorum @@ -265,6 +347,9 @@ pub trait PlatformStateV0Methods { /// Returns the current validator sets. fn validator_sets(&self) -> &IndexMap; + /// Returns the current 400 60 quorums used to validate chain locks. + fn chain_lock_validating_quorums(&self) -> &BTreeMap; + /// Returns the full list of masternodes. fn full_masternode_list(&self) -> &BTreeMap; @@ -295,6 +380,27 @@ pub trait PlatformStateV0Methods { /// Sets the current validator sets. fn set_validator_sets(&mut self, sets: IndexMap); + /// Sets the current chain lock validating quorums. + fn set_chain_lock_validating_quorums( + &mut self, + quorums: BTreeMap, + ); + + /// Sets the current chain lock validating quorums and returns the old value. + fn replace_chain_lock_validating_quorums( + &mut self, + quorums: BTreeMap, + ) -> BTreeMap; + + /// Sets the previous chain lock validating quorums. + fn set_previous_chain_lock_validating_quorums( + &mut self, + previous_core_height: u32, + change_core_height: u32, + previous_quorums_change_height: Option, + quorums: BTreeMap, + ); + /// Sets the full masternode list. fn set_full_masternode_list(&mut self, list: BTreeMap); @@ -321,6 +427,21 @@ pub trait PlatformStateV0Methods { /// Returns a mutable reference to the current validator sets. fn validator_sets_mut(&mut self) -> &mut IndexMap; + /// Returns a mutable reference to the current chain lock validating quorums. + fn chain_lock_validating_quorums_mut( + &mut self, + ) -> &mut BTreeMap; + + /// Returns a mutable reference to the previous chain lock validating quorums. + fn previous_height_chain_lock_validating_quorums_mut( + &mut self, + ) -> &mut Option<( + u32, + u32, + Option, + BTreeMap, + )>; + /// Returns a mutable reference to the full masternode list. fn full_masternode_list_mut(&mut self) -> &mut BTreeMap; @@ -328,14 +449,24 @@ pub trait PlatformStateV0Methods { fn hpmn_masternode_list_mut(&mut self) -> &mut BTreeMap; /// The epoch ref - fn epoch_ref(&self) -> &Epoch; + fn last_committed_block_epoch_ref(&self) -> &Epoch; /// The last block id hash - fn last_block_id_hash(&self) -> [u8; 32]; + fn last_committed_block_id_hash(&self) -> [u8; 32]; + + /// The previous height chain lock validating quorums + fn previous_height_chain_lock_validating_quorums( + &self, + ) -> Option<&( + u32, + u32, + Option, + BTreeMap, + )>; } impl PlatformStateV0Methods for PlatformStateV0 { /// The height of the platform, only committed blocks increase height - fn height(&self) -> u64 { + fn last_committed_height(&self) -> u64 { self.last_committed_block_info .as_ref() .map(|block_info| block_info.basic_info().height) @@ -343,7 +474,7 @@ impl PlatformStateV0Methods for PlatformStateV0 { } /// The height of the platform, only committed blocks increase height - fn known_height_or(&self, default: u64) -> u64 { + fn last_committed_known_height_or(&self, default: u64) -> u64 { self.last_committed_block_info .as_ref() .map(|block_info| block_info.basic_info().height) @@ -351,7 +482,7 @@ impl PlatformStateV0Methods for PlatformStateV0 { } /// The height of the core blockchain that Platform knows about through chain locks - fn core_height(&self) -> u32 { + fn last_committed_core_height(&self) -> u32 { self.last_committed_block_info .as_ref() .map(|block_info| block_info.basic_info().core_height) @@ -364,7 +495,7 @@ impl PlatformStateV0Methods for PlatformStateV0 { } /// The height of the core blockchain that Platform knows about through chain locks - fn known_core_height_or(&self, default: u32) -> u32 { + fn last_committed_known_core_height_or(&self, default: u32) -> u32 { self.last_committed_block_info .as_ref() .map(|block_info| block_info.basic_info().core_height) @@ -377,14 +508,14 @@ impl PlatformStateV0Methods for PlatformStateV0 { } /// The last block time in milliseconds - fn last_block_time_ms(&self) -> Option { + fn last_committed_block_time_ms(&self) -> Option { self.last_committed_block_info .as_ref() .map(|block_info| block_info.basic_info().time_ms) } /// The last quorum hash - fn last_quorum_hash(&self) -> [u8; 32] { + fn last_committed_quorum_hash(&self) -> [u8; 32] { self.last_committed_block_info .as_ref() .map(|block_info| *block_info.quorum_hash()) @@ -392,7 +523,7 @@ impl PlatformStateV0Methods for PlatformStateV0 { } /// The last block id hash - fn last_block_id_hash(&self) -> [u8; 32] { + fn last_committed_block_id_hash(&self) -> [u8; 32] { self.last_committed_block_info .as_ref() .map(|block_info| *block_info.block_id_hash()) @@ -400,7 +531,7 @@ impl PlatformStateV0Methods for PlatformStateV0 { } /// The last block signature - fn last_block_signature(&self) -> [u8; 96] { + fn last_committed_block_signature(&self) -> [u8; 96] { self.last_committed_block_info .as_ref() .map(|block_info| *block_info.signature()) @@ -408,14 +539,14 @@ impl PlatformStateV0Methods for PlatformStateV0 { } /// The last block app hash - fn last_block_app_hash(&self) -> Option<[u8; 32]> { + fn last_committed_block_app_hash(&self) -> Option<[u8; 32]> { self.last_committed_block_info .as_ref() .map(|block_info| *block_info.app_hash()) } /// The last block height or 0 for genesis - fn last_block_height(&self) -> u64 { + fn last_committed_block_height(&self) -> u64 { self.last_committed_block_info .as_ref() .map(|block_info| block_info.basic_info().height) @@ -423,7 +554,7 @@ impl PlatformStateV0Methods for PlatformStateV0 { } /// The last block round - fn last_block_round(&self) -> u32 { + fn last_committed_block_round(&self) -> u32 { self.last_committed_block_info .as_ref() .map(|block_info| block_info.round()) @@ -431,14 +562,14 @@ impl PlatformStateV0Methods for PlatformStateV0 { } /// The current epoch - fn epoch(&self) -> Epoch { + fn last_committed_block_epoch(&self) -> Epoch { self.last_committed_block_info .as_ref() .map(|block_info| block_info.basic_info().epoch) .unwrap_or_default() } - fn epoch_ref(&self) -> &Epoch { + fn last_committed_block_epoch_ref(&self) -> &Epoch { self.last_committed_block_info .as_ref() .map(|block_info| &block_info.basic_info().epoch) @@ -489,6 +620,11 @@ impl PlatformStateV0Methods for PlatformStateV0 { &self.validator_sets } + /// Returns the current 400 60 quorums used to validate chain locks. + fn chain_lock_validating_quorums(&self) -> &BTreeMap { + &self.chain_lock_validating_quorums + } + /// Returns the full list of masternodes. fn full_masternode_list(&self) -> &BTreeMap { &self.full_masternode_list @@ -539,6 +675,38 @@ impl PlatformStateV0Methods for PlatformStateV0 { self.validator_sets = sets; } + /// Sets the current chain lock validating quorums. + fn set_chain_lock_validating_quorums( + &mut self, + quorums: BTreeMap, + ) { + self.chain_lock_validating_quorums = quorums; + } + + /// Swaps the current chain lock validating quorums and returns the old one + fn replace_chain_lock_validating_quorums( + &mut self, + quorums: BTreeMap, + ) -> BTreeMap { + std::mem::replace(&mut self.chain_lock_validating_quorums, quorums) + } + + /// Sets the previous chain lock validating quorums. + fn set_previous_chain_lock_validating_quorums( + &mut self, + previous_core_height: u32, + change_core_height: u32, + previous_quorums_change_height: Option, + quorums: BTreeMap, + ) { + self.previous_height_chain_lock_validating_quorums = Some(( + previous_core_height, + change_core_height, + previous_quorums_change_height, + quorums, + )); + } + /// Sets the full masternode list. fn set_full_masternode_list(&mut self, list: BTreeMap) { self.full_masternode_list = list; @@ -578,6 +746,34 @@ impl PlatformStateV0Methods for PlatformStateV0 { &mut self.validator_sets } + fn chain_lock_validating_quorums_mut( + &mut self, + ) -> &mut BTreeMap { + &mut self.chain_lock_validating_quorums + } + + fn previous_height_chain_lock_validating_quorums( + &self, + ) -> Option<&( + u32, + u32, + Option, + BTreeMap, + )> { + self.previous_height_chain_lock_validating_quorums.as_ref() + } + + fn previous_height_chain_lock_validating_quorums_mut( + &mut self, + ) -> &mut Option<( + u32, + u32, + Option, + BTreeMap, + )> { + &mut self.previous_height_chain_lock_validating_quorums + } + fn full_masternode_list_mut(&mut self) -> &mut BTreeMap { &mut self.full_masternode_list } diff --git a/packages/rs-drive-abci/src/platform_types/verify_chain_lock_result/mod.rs b/packages/rs-drive-abci/src/platform_types/verify_chain_lock_result/mod.rs new file mode 100644 index 0000000000..d09310b584 --- /dev/null +++ b/packages/rs-drive-abci/src/platform_types/verify_chain_lock_result/mod.rs @@ -0,0 +1,2 @@ +/// V0 +pub mod v0; diff --git a/packages/rs-drive-abci/src/platform_types/verify_chain_lock_result/v0/mod.rs b/packages/rs-drive-abci/src/platform_types/verify_chain_lock_result/v0/mod.rs new file mode 100644 index 0000000000..57d0293ba8 --- /dev/null +++ b/packages/rs-drive-abci/src/platform_types/verify_chain_lock_result/v0/mod.rs @@ -0,0 +1,12 @@ +/// A structure for returning the result of verification of a chain lock +pub struct VerifyChainLockResult { + /// If the chain lock signature represents a valid G2 BLS Element + pub(crate) chain_lock_signature_is_deserializable: bool, + /// If the chain lock was found to be valid based on platform state + pub(crate) found_valid_locally: Option, + /// If we were not able to validate based on platform state - ie the chain lock is too far in + /// the future + pub(crate) found_valid_by_core: Option, + /// Core is synced + pub(crate) core_is_synced: Option, +} diff --git a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract/v0/mod.rs b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract/v0/mod.rs index ab9cb627f2..39da61433c 100644 --- a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract/v0/mod.rs @@ -22,7 +22,7 @@ impl Platform { platform_version: &PlatformVersion, ) -> Result>, Error> { let metadata = self.response_metadata_v0(state); - let quorum_type = self.config.quorum_type() as u32; + let quorum_type = self.config.validator_set_quorum_type() as u32; let GetDataContractRequestV0 { id, prove } = request; let contract_id: Identifier = check_validation_result_with_data!(id.try_into().map_err(|_| { @@ -39,11 +39,11 @@ impl Platform { version: Some(get_data_contract_response::Version::V0(GetDataContractResponseV0 { result: Some(get_data_contract_response::get_data_contract_response_v0::Result::Proof(Proof { grovedb_proof: proof, - quorum_hash: state.last_quorum_hash().to_vec(), + quorum_hash: state.last_committed_quorum_hash().to_vec(), quorum_type, - block_id_hash: state.last_block_id_hash().to_vec(), - signature: state.last_block_signature().to_vec(), - round: state.last_block_round(), + block_id_hash: state.last_committed_block_id_hash().to_vec(), + signature: state.last_committed_block_signature().to_vec(), + round: state.last_committed_block_round(), })), metadata: Some(metadata), })), diff --git a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/v0/mod.rs b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/v0/mod.rs index fad0100be9..ad58118f60 100644 --- a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/v0/mod.rs @@ -25,7 +25,7 @@ impl Platform { platform_version: &PlatformVersion, ) -> Result>, Error> { let metadata = self.response_metadata_v0(state); - let quorum_type = self.config.quorum_type() as u32; + let quorum_type = self.config.validator_set_quorum_type() as u32; let GetDataContractHistoryRequestV0 { id, limit, @@ -66,11 +66,11 @@ impl Platform { version: Some(get_data_contract_history_response::Version::V0(GetDataContractHistoryResponseV0 { result: Some(get_data_contract_history_response::get_data_contract_history_response_v0::Result::Proof(Proof { grovedb_proof: proof, - quorum_hash: state.last_quorum_hash().to_vec(), + quorum_hash: state.last_committed_quorum_hash().to_vec(), quorum_type, - block_id_hash: state.last_block_id_hash().to_vec(), - signature: state.last_block_signature().to_vec(), - round: state.last_block_round(), + block_id_hash: state.last_committed_block_id_hash().to_vec(), + signature: state.last_committed_block_signature().to_vec(), + round: state.last_committed_block_round(), })), metadata: Some(metadata), })), diff --git a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contracts/v0/mod.rs b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contracts/v0/mod.rs index b5f3e7f78e..c3a2da2dc2 100644 --- a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contracts/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contracts/v0/mod.rs @@ -23,7 +23,7 @@ impl Platform { platform_version: &PlatformVersion, ) -> Result>, Error> { let metadata = self.response_metadata_v0(state); - let quorum_type = self.config.quorum_type() as u32; + let quorum_type = self.config.validator_set_quorum_type() as u32; let GetDataContractsRequestV0 { ids, prove } = request; let contract_ids = check_validation_result_with_data!(ids .into_iter() @@ -45,11 +45,11 @@ impl Platform { version: Some(get_data_contracts_response::Version::V0(GetDataContractsResponseV0 { result: Some(get_data_contracts_response::get_data_contracts_response_v0::Result::Proof(Proof { grovedb_proof: proof, - quorum_hash: state.last_quorum_hash().to_vec(), + quorum_hash: state.last_committed_quorum_hash().to_vec(), quorum_type, - block_id_hash: state.last_block_id_hash().to_vec(), - signature: state.last_block_signature().to_vec(), - round: state.last_block_round(), + block_id_hash: state.last_committed_block_id_hash().to_vec(), + signature: state.last_committed_block_signature().to_vec(), + round: state.last_committed_block_round(), })), metadata: Some(metadata), })), diff --git a/packages/rs-drive-abci/src/query/document_query/v0/mod.rs b/packages/rs-drive-abci/src/query/document_query/v0/mod.rs index e635c7d744..0f52f904e1 100644 --- a/packages/rs-drive-abci/src/query/document_query/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/document_query/v0/mod.rs @@ -26,7 +26,7 @@ impl Platform { platform_version: &PlatformVersion, ) -> Result>, Error> { let metadata = self.response_metadata_v0(state); - let quorum_type = self.config.quorum_type() as u32; + let quorum_type = self.config.validator_set_quorum_type() as u32; let GetDocumentsRequestV0 { data_contract_id, document_type: document_type_name, @@ -147,11 +147,11 @@ impl Platform { get_documents_response::get_documents_response_v0::Result::Proof( Proof { grovedb_proof: proof, - quorum_hash: state.last_quorum_hash().to_vec(), + quorum_hash: state.last_committed_quorum_hash().to_vec(), quorum_type, - block_id_hash: state.last_block_id_hash().to_vec(), - signature: state.last_block_signature().to_vec(), - round: state.last_block_round(), + block_id_hash: state.last_committed_block_id_hash().to_vec(), + signature: state.last_committed_block_signature().to_vec(), + round: state.last_committed_block_round(), }, ), ), diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/balance/v0/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/balance/v0/mod.rs index 8865f6c46a..e271ce29c5 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/balance/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/balance/v0/mod.rs @@ -21,7 +21,7 @@ impl Platform { platform_version: &PlatformVersion, ) -> Result>, Error> { let metadata = self.response_metadata_v0(state); - let quorum_type = self.config.quorum_type() as u32; + let quorum_type = self.config.validator_set_quorum_type() as u32; let GetIdentityRequestV0 { id, prove } = get_identity_request; let identity_id: Identifier = check_validation_result_with_data!(id.try_into().map_err(|_| { @@ -40,11 +40,11 @@ impl Platform { version: Some(get_identity_balance_response::Version::V0(GetIdentityBalanceResponseV0 { result: Some(get_identity_balance_response::get_identity_balance_response_v0::Result::Proof(Proof { grovedb_proof: proof, - quorum_hash: state.last_quorum_hash().to_vec(), + quorum_hash: state.last_committed_quorum_hash().to_vec(), quorum_type, - block_id_hash: state.last_block_id_hash().to_vec(), - signature: state.last_block_signature().to_vec(), - round: state.last_block_round(), + block_id_hash: state.last_committed_block_id_hash().to_vec(), + signature: state.last_committed_block_signature().to_vec(), + round: state.last_committed_block_round(), })), metadata: Some(metadata), })), diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/balance_and_revision/v0/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/balance_and_revision/v0/mod.rs index 20b851ed4d..2488a82fc2 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/balance_and_revision/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/balance_and_revision/v0/mod.rs @@ -25,7 +25,7 @@ impl Platform { platform_version: &PlatformVersion, ) -> Result>, Error> { let metadata = self.response_metadata_v0(state); - let quorum_type = self.config.quorum_type() as u32; + let quorum_type = self.config.validator_set_quorum_type() as u32; let GetIdentityRequestV0 { id, prove } = get_identity_request; let identity_id: Identifier = check_validation_result_with_data!(id.try_into().map_err(|_| { @@ -44,11 +44,11 @@ impl Platform { version: Some(get_identity_balance_and_revision_response::Version::V0(GetIdentityBalanceAndRevisionResponseV0 { result: Some(get_identity_balance_and_revision_response::get_identity_balance_and_revision_response_v0::Result::Proof(Proof { grovedb_proof: proof, - quorum_hash: state.last_quorum_hash().to_vec(), + quorum_hash: state.last_committed_quorum_hash().to_vec(), quorum_type, - block_id_hash: state.last_block_id_hash().to_vec(), - signature: state.last_block_signature().to_vec(), - round: state.last_block_round(), + block_id_hash: state.last_committed_block_id_hash().to_vec(), + signature: state.last_committed_block_signature().to_vec(), + round: state.last_committed_block_round(), })), metadata: Some(metadata), })), diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identities/v0/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identities/v0/mod.rs index d585053f71..4ea7ad8fea 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/identities/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identities/v0/mod.rs @@ -22,7 +22,7 @@ impl Platform { platform_version: &PlatformVersion, ) -> Result>, Error> { let metadata = self.response_metadata_v0(state); - let quorum_type = self.config.quorum_type() as u32; + let quorum_type = self.config.validator_set_quorum_type() as u32; let GetIdentitiesRequestV0 { ids, prove } = get_identities_request; let identity_ids = check_validation_result_with_data!(ids .into_iter() @@ -50,11 +50,11 @@ impl Platform { get_identities_response::get_identities_response_v0::Result::Proof( Proof { grovedb_proof: proof, - quorum_hash: state.last_quorum_hash().to_vec(), + quorum_hash: state.last_committed_quorum_hash().to_vec(), quorum_type, - block_id_hash: state.last_block_id_hash().to_vec(), - signature: state.last_block_signature().to_vec(), - round: state.last_block_round(), + block_id_hash: state.last_committed_block_id_hash().to_vec(), + signature: state.last_committed_block_signature().to_vec(), + round: state.last_committed_block_round(), }, ), ), diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identities_by_public_key_hashes/v0/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identities_by_public_key_hashes/v0/mod.rs index 7235e4adbe..d6ed8f5b99 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/identities_by_public_key_hashes/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identities_by_public_key_hashes/v0/mod.rs @@ -26,7 +26,7 @@ impl Platform { platform_version: &PlatformVersion, ) -> Result>, Error> { let metadata = self.response_metadata_v0(state); - let quorum_type = self.config.quorum_type() as u32; + let quorum_type = self.config.validator_set_quorum_type() as u32; let GetIdentitiesByPublicKeyHashesRequestV0 { public_key_hashes, prove, @@ -56,11 +56,11 @@ impl Platform { version: Some(get_identities_by_public_key_hashes_response::Version::V0(GetIdentitiesByPublicKeyHashesResponseV0 { result: Some(get_identities_by_public_key_hashes_response::get_identities_by_public_key_hashes_response_v0::Result::Proof(Proof { grovedb_proof: proof, - quorum_hash: state.last_quorum_hash().to_vec(), + quorum_hash: state.last_committed_quorum_hash().to_vec(), quorum_type, - block_id_hash: state.last_block_id_hash().to_vec(), - signature: state.last_block_signature().to_vec(), - round: state.last_block_round(), + block_id_hash: state.last_committed_block_id_hash().to_vec(), + signature: state.last_committed_block_signature().to_vec(), + round: state.last_committed_block_round(), })), metadata: Some(metadata), })), diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identity/v0/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identity/v0/mod.rs index 358ebd142b..1fdc04da05 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/identity/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identity/v0/mod.rs @@ -22,7 +22,7 @@ impl Platform { platform_version: &PlatformVersion, ) -> Result>, Error> { let metadata = self.response_metadata_v0(state); - let quorum_type = self.config.quorum_type() as u32; + let quorum_type = self.config.validator_set_quorum_type() as u32; let GetIdentityRequestV0 { id, prove } = get_identity_request; let identity_id: Identifier = check_validation_result_with_data!(id.try_into().map_err(|_| { @@ -42,11 +42,11 @@ impl Platform { result: Some( get_identity_response::get_identity_response_v0::Result::Proof(Proof { grovedb_proof: proof, - quorum_hash: state.last_quorum_hash().to_vec(), + quorum_hash: state.last_committed_quorum_hash().to_vec(), quorum_type, - block_id_hash: state.last_block_id_hash().to_vec(), - signature: state.last_block_signature().to_vec(), - round: state.last_block_round(), + block_id_hash: state.last_committed_block_id_hash().to_vec(), + signature: state.last_committed_block_signature().to_vec(), + round: state.last_committed_block_round(), }), ), metadata: Some(metadata), diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identity_by_public_key_hash/v0/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identity_by_public_key_hash/v0/mod.rs index 988a3e5d85..f25c0a85f2 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/identity_by_public_key_hash/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identity_by_public_key_hash/v0/mod.rs @@ -24,7 +24,7 @@ impl Platform { platform_version: &PlatformVersion, ) -> Result>, Error> { let metadata = self.response_metadata_v0(state); - let quorum_type = self.config.quorum_type() as u32; + let quorum_type = self.config.validator_set_quorum_type() as u32; let GetIdentityByPublicKeyHashRequestV0 { public_key_hash, prove, @@ -46,11 +46,11 @@ impl Platform { version: Some(get_identity_by_public_key_hash_response::Version::V0(GetIdentityByPublicKeyHashResponseV0 { result: Some(get_identity_by_public_key_hash_response::get_identity_by_public_key_hash_response_v0::Result::Proof(Proof { grovedb_proof: proof, - quorum_hash: state.last_quorum_hash().to_vec(), + quorum_hash: state.last_committed_quorum_hash().to_vec(), quorum_type, - block_id_hash: state.last_block_id_hash().to_vec(), - signature: state.last_block_signature().to_vec(), - round: state.last_block_round(), + block_id_hash: state.last_committed_block_id_hash().to_vec(), + signature: state.last_committed_block_signature().to_vec(), + round: state.last_committed_block_round(), })), metadata: Some(metadata), })), diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/keys/v0/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/keys/v0/mod.rs index 80b3bbb608..374057d1e3 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/keys/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/keys/v0/mod.rs @@ -79,7 +79,7 @@ impl Platform { platform_version: &PlatformVersion, ) -> Result>, Error> { let metadata = self.response_metadata_v0(state); - let quorum_type = self.config.quorum_type() as u32; + let quorum_type = self.config.validator_set_quorum_type() as u32; let GetIdentityKeysRequestV0 { identity_id, request_type, @@ -142,11 +142,11 @@ impl Platform { version: Some(get_identity_keys_response::Version::V0(GetIdentityKeysResponseV0 { result: Some(get_identity_keys_response::get_identity_keys_response_v0::Result::Proof(Proof { grovedb_proof: proof, - quorum_hash: state.last_quorum_hash().to_vec(), + quorum_hash: state.last_committed_quorum_hash().to_vec(), quorum_type, - block_id_hash: state.last_block_id_hash().to_vec(), - signature: state.last_block_signature().to_vec(), - round: state.last_block_round(), + block_id_hash: state.last_committed_block_id_hash().to_vec(), + signature: state.last_committed_block_signature().to_vec(), + round: state.last_committed_block_round(), })), metadata: Some(metadata), })), diff --git a/packages/rs-drive-abci/src/query/proofs/v0/mod.rs b/packages/rs-drive-abci/src/query/proofs/v0/mod.rs index 7969042161..584eac412e 100644 --- a/packages/rs-drive-abci/src/query/proofs/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/proofs/v0/mod.rs @@ -24,7 +24,7 @@ impl Platform { platform_version: &PlatformVersion, ) -> Result>, Error> { let metadata = self.response_metadata_v0(state); - let quorum_type = self.config.quorum_type() as u32; + let quorum_type = self.config.validator_set_quorum_type() as u32; let GetProofsRequestV0 { identities, contracts, @@ -109,11 +109,11 @@ impl Platform { result: Some(get_proofs_response::get_proofs_response_v0::Result::Proof( Proof { grovedb_proof: proof, - quorum_hash: state.last_quorum_hash().to_vec(), + quorum_hash: state.last_committed_quorum_hash().to_vec(), quorum_type, - block_id_hash: state.last_block_id_hash().to_vec(), - signature: state.last_block_signature().to_vec(), - round: state.last_block_round(), + block_id_hash: state.last_committed_block_id_hash().to_vec(), + signature: state.last_committed_block_signature().to_vec(), + round: state.last_committed_block_round(), }, )), metadata: Some(metadata), diff --git a/packages/rs-drive-abci/src/query/response_metadata/v0/mod.rs b/packages/rs-drive-abci/src/query/response_metadata/v0/mod.rs index a13e0878c5..492db68f4c 100644 --- a/packages/rs-drive-abci/src/query/response_metadata/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/response_metadata/v0/mod.rs @@ -6,10 +6,10 @@ use dapi_grpc::platform::v0::ResponseMetadata; impl Platform { pub(in crate::query) fn response_metadata_v0(&self, state: &PlatformState) -> ResponseMetadata { ResponseMetadata { - height: state.height(), - core_chain_locked_height: state.core_height(), - epoch: state.epoch().index as u32, - time_ms: state.last_block_time_ms().unwrap_or_default(), + height: state.last_committed_height(), + core_chain_locked_height: state.last_committed_core_height(), + epoch: state.last_committed_block_epoch().index as u32, + time_ms: state.last_committed_block_time_ms().unwrap_or_default(), chain_id: self.config.abci.chain_id.clone(), protocol_version: state.current_protocol_version_in_consensus(), } diff --git a/packages/rs-drive-abci/src/query/system/epoch_infos/v0/mod.rs b/packages/rs-drive-abci/src/query/system/epoch_infos/v0/mod.rs index 9bc9448df8..a4961af007 100644 --- a/packages/rs-drive-abci/src/query/system/epoch_infos/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/system/epoch_infos/v0/mod.rs @@ -23,7 +23,7 @@ impl Platform { platform_version: &PlatformVersion, ) -> Result>, Error> { let metadata = self.response_metadata_v0(state); - let quorum_type = self.config.quorum_type() as u32; + let quorum_type = self.config.validator_set_quorum_type() as u32; let GetEpochsInfoRequestV0 { start_epoch, count, @@ -35,7 +35,7 @@ impl Platform { if ascending { 0 } else { - state.epoch_ref().index as u32 + state.last_committed_block_epoch_ref().index as u32 } }); @@ -70,11 +70,11 @@ impl Platform { get_epochs_info_response::get_epochs_info_response_v0::Result::Proof( Proof { grovedb_proof: proof, - quorum_hash: state.last_quorum_hash().to_vec(), + quorum_hash: state.last_committed_quorum_hash().to_vec(), quorum_type, - block_id_hash: state.last_block_id_hash().to_vec(), - signature: state.last_block_signature().to_vec(), - round: state.last_block_round(), + block_id_hash: state.last_committed_block_id_hash().to_vec(), + signature: state.last_committed_block_signature().to_vec(), + round: state.last_committed_block_round(), }, ), ), diff --git a/packages/rs-drive-abci/src/query/system/version_upgrade_state/v0/mod.rs b/packages/rs-drive-abci/src/query/system/version_upgrade_state/v0/mod.rs index c891b47906..44a2cbc283 100644 --- a/packages/rs-drive-abci/src/query/system/version_upgrade_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/system/version_upgrade_state/v0/mod.rs @@ -23,7 +23,7 @@ impl Platform { platform_version: &PlatformVersion, ) -> Result>, Error> { let metadata = self.response_metadata_v0(state); - let quorum_type = self.config.quorum_type() as u32; + let quorum_type = self.config.validator_set_quorum_type() as u32; let GetProtocolVersionUpgradeStateRequestV0 { prove } = request; let response_data = if prove { @@ -38,11 +38,11 @@ impl Platform { get_protocol_version_upgrade_state_response::get_protocol_version_upgrade_state_response_v0::Result::Proof( Proof { grovedb_proof: proof, - quorum_hash: state.last_quorum_hash().to_vec(), + quorum_hash: state.last_committed_quorum_hash().to_vec(), quorum_type, - block_id_hash: state.last_block_id_hash().to_vec(), - signature: state.last_block_signature().to_vec(), - round: state.last_block_round(), + block_id_hash: state.last_committed_block_id_hash().to_vec(), + signature: state.last_committed_block_signature().to_vec(), + round: state.last_committed_block_round(), }, ), ), diff --git a/packages/rs-drive-abci/src/query/system/version_upgrade_vote_status/v0/mod.rs b/packages/rs-drive-abci/src/query/system/version_upgrade_vote_status/v0/mod.rs index 1948a1f718..661a266011 100644 --- a/packages/rs-drive-abci/src/query/system/version_upgrade_vote_status/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/system/version_upgrade_vote_status/v0/mod.rs @@ -25,7 +25,7 @@ impl Platform { platform_version: &PlatformVersion, ) -> Result>, Error> { let metadata = self.response_metadata_v0(state); - let quorum_type = self.config.quorum_type() as u32; + let quorum_type = self.config.validator_set_quorum_type() as u32; let GetProtocolVersionUpgradeVoteStatusRequestV0 { start_pro_tx_hash, count, @@ -71,11 +71,11 @@ impl Platform { get_protocol_version_upgrade_vote_status_response::get_protocol_version_upgrade_vote_status_response_v0::Result::Proof( Proof { grovedb_proof: proof, - quorum_hash: state.last_quorum_hash().to_vec(), + quorum_hash: state.last_committed_quorum_hash().to_vec(), quorum_type, - block_id_hash: state.last_block_id_hash().to_vec(), - signature: state.last_block_signature().to_vec(), - round: state.last_block_round(), + block_id_hash: state.last_committed_block_id_hash().to_vec(), + signature: state.last_committed_block_signature().to_vec(), + round: state.last_committed_block_round(), }, ), ), diff --git a/packages/rs-drive-abci/src/rpc/core.rs b/packages/rs-drive-abci/src/rpc/core.rs index ab0c9b59a5..941459325f 100644 --- a/packages/rs-drive-abci/src/rpc/core.rs +++ b/packages/rs-drive-abci/src/rpc/core.rs @@ -24,8 +24,11 @@ pub trait CoreRPCLike { /// Get block hash by height fn get_block_hash(&self, height: CoreHeight) -> Result; - /// Get block hash by height - fn get_best_chain_lock(&self) -> Result; + /// Get the best chain lock + fn get_best_chain_lock(&self) -> Result; + + /// Submit a chain lock + fn submit_chain_lock(&self, chain_lock: &ChainLock) -> Result; /// Get transaction fn get_transaction(&self, tx_id: &Txid) -> Result; @@ -109,13 +112,7 @@ pub trait CoreRPCLike { ) -> Result; /// Verify a chain lock signature - /// If `max_height` is provided the chain lock will be verified - /// against quorums available at this height - fn verify_chain_lock( - &self, - chain_lock: &ChainLock, - max_height: Option, - ) -> Result; + fn verify_chain_lock(&self, chain_lock: &ChainLock) -> Result; /// Returns masternode sync status fn masternode_sync_status(&self) -> Result; @@ -202,19 +199,12 @@ impl CoreRPCLike for DefaultCoreRPC { retry!(self.inner.get_block_hash(height)) } - fn get_best_chain_lock(&self) -> Result { - //no need to retry on this one - let GetBestChainLockResult { - blockhash, - height, - signature, - known_block: _, - } = self.inner.get_best_chain_lock()?; - Ok(CoreChainLock { - core_block_height: height, - core_block_hash: blockhash.to_byte_array().to_vec(), - signature, - }) + fn get_best_chain_lock(&self) -> Result { + retry!(self.inner.get_best_chain_lock()) + } + + fn submit_chain_lock(&self, chain_lock: &ChainLock) -> Result { + retry!(self.inner.submit_chain_lock(chain_lock)) } fn get_transaction(&self, tx_id: &Txid) -> Result { @@ -300,19 +290,15 @@ impl CoreRPCLike for DefaultCoreRPC { } /// Verify a chain lock signature - /// If `max_height` is provided the chain lock will be verified - /// against quorums available at this height - fn verify_chain_lock( - &self, - chain_lock: &ChainLock, - max_height: Option, - ) -> Result { + fn verify_chain_lock(&self, chain_lock: &ChainLock) -> Result { let block_hash = chain_lock.block_hash.to_string(); let signature = hex::encode(chain_lock.signature); - retry!(self - .inner - .get_verifychainlock(block_hash.as_str(), &signature, max_height)) + retry!(self.inner.get_verifychainlock( + block_hash.as_str(), + &signature, + Some(chain_lock.block_height) + )) } /// Returns masternode sync status diff --git a/packages/rs-drive-abci/tests/strategy_tests/chain_lock_update.rs b/packages/rs-drive-abci/tests/strategy_tests/chain_lock_update.rs new file mode 100644 index 0000000000..a6a3e57e89 --- /dev/null +++ b/packages/rs-drive-abci/tests/strategy_tests/chain_lock_update.rs @@ -0,0 +1,87 @@ +#[cfg(test)] +mod tests { + use dpp::dashcore::hashes::Hash; + use dpp::dashcore::{BlockHash, ChainLock}; + use tenderdash_abci::proto::types::CoreChainLock; + + use crate::execution::run_chain_for_strategy; + use crate::strategy::CoreHeightIncrease::RandomCoreHeightIncrease; + use crate::strategy::{MasternodeListChangesStrategy, NetworkStrategy}; + use drive_abci::config::{ExecutionConfig, PlatformConfig, PlatformTestConfig}; + use drive_abci::platform_types::platform_state::v0::PlatformStateV0Methods; + use drive_abci::platform_types::validator_set::v0::ValidatorSetV0Getters; + use drive_abci::test::helpers::setup::TestPlatformBuilder; + use strategy_tests::frequency::Frequency; + use strategy_tests::Strategy; + + #[test] + fn run_chain_lock_update_quorums_not_changing() { + // The point of this test is to check that chain locks can be validated in the + // simple case where quorums do not change + let strategy = NetworkStrategy { + strategy: Strategy { + contracts_with_updates: vec![], + operations: vec![], + start_identities: vec![], + identities_inserts: Frequency { + times_per_block_range: Default::default(), + chance_per_block: None, + }, + signer: None, + }, + total_hpmns: 100, + extra_normal_mns: 400, + validator_quorum_count: 24, + chain_lock_quorum_count: 4, + upgrading_info: None, + core_height_increase: RandomCoreHeightIncrease(Frequency { + times_per_block_range: 1..2, + chance_per_block: None, + }), + proposer_strategy: MasternodeListChangesStrategy { + new_hpmns: Default::default(), + removed_hpmns: Default::default(), + updated_hpmns: Default::default(), + banned_hpmns: Default::default(), + unbanned_hpmns: Default::default(), + changed_ip_hpmns: Default::default(), + changed_p2p_port_hpmns: Default::default(), + changed_http_port_hpmns: Default::default(), + new_masternodes: Default::default(), + removed_masternodes: Default::default(), + updated_masternodes: Default::default(), + banned_masternodes: Default::default(), + unbanned_masternodes: Default::default(), + changed_ip_masternodes: Default::default(), + }, + rotate_quorums: true, + failure_testing: None, + query_testing: None, + verify_state_transition_results: false, + independent_process_proposal_verification: true, + sign_chain_locks: true, + ..Default::default() + }; + + let quorum_size = 100; + + let config = PlatformConfig { + validator_set_quorum_size: quorum_size, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_400_60".to_string(), + execution: ExecutionConfig { + verify_sum_trees: true, + validator_set_rotation_block_count: 25, + ..Default::default() + }, + block_spacing_ms: 3000, + testing_configs: PlatformTestConfig::default_with_no_block_signing(), + ..Default::default() + }; + let mut platform = TestPlatformBuilder::new() + .with_config(config.clone()) + .build_with_mock_rpc(); + + run_chain_for_strategy(&mut platform, 50, strategy, config, 13); + } +} diff --git a/packages/rs-drive-abci/tests/strategy_tests/core_update_tests.rs b/packages/rs-drive-abci/tests/strategy_tests/core_update_tests.rs index 223f9ee0f2..9c09750625 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/core_update_tests.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/core_update_tests.rs @@ -1,8 +1,11 @@ #[cfg(test)] mod tests { + use dpp::dashcore::hashes::Hash; + use dpp::dashcore::{BlockHash, ChainLock}; use tenderdash_abci::proto::types::CoreChainLock; use crate::execution::run_chain_for_strategy; + use crate::strategy::CoreHeightIncrease::RandomCoreHeightIncrease; use crate::strategy::{MasternodeListChangesStrategy, NetworkStrategy}; use drive_abci::config::{ExecutionConfig, PlatformConfig, PlatformTestConfig}; use drive_abci::platform_types::platform_state::v0::PlatformStateV0Methods; @@ -26,12 +29,13 @@ mod tests { }, total_hpmns: 100, extra_normal_mns: 0, - quorum_count: 24, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, upgrading_info: None, - core_height_increase: Frequency { + core_height_increase: RandomCoreHeightIncrease(Frequency { times_per_block_range: 1..2, chance_per_block: None, - }, + }), proposer_strategy: MasternodeListChangesStrategy { new_hpmns: Default::default(), removed_hpmns: Default::default(), @@ -61,10 +65,12 @@ mod tests { let quorum_size = 100; let config = PlatformConfig { - quorum_size, + validator_set_quorum_size: quorum_size, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), execution: ExecutionConfig { verify_sum_trees: true, - validator_set_quorum_rotation_block_count: 25, + validator_set_rotation_block_count: 25, ..Default::default() }, block_spacing_ms: 3000, @@ -75,16 +81,6 @@ mod tests { .with_config(config.clone()) .build_with_mock_rpc(); - platform - .core_rpc - .expect_get_best_chain_lock() - .returning(move || { - Ok(CoreChainLock { - core_block_height: 1, - core_block_hash: [1; 32].to_vec(), - signature: [2; 96].to_vec(), - }) - }); let outcome = run_chain_for_strategy(&mut platform, 50, strategy, config, 13); // we expect to see quorums with banned members @@ -132,12 +128,13 @@ mod tests { }, total_hpmns: 100, extra_normal_mns: 0, - quorum_count: 24, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, upgrading_info: None, - core_height_increase: Frequency { + core_height_increase: RandomCoreHeightIncrease(Frequency { times_per_block_range: 1..2, chance_per_block: None, - }, + }), proposer_strategy: MasternodeListChangesStrategy { new_hpmns: Default::default(), removed_hpmns: Frequency { @@ -167,10 +164,12 @@ mod tests { let quorum_size = 100; let config = PlatformConfig { - quorum_size, + validator_set_quorum_size: quorum_size, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), execution: ExecutionConfig { verify_sum_trees: true, - validator_set_quorum_rotation_block_count: 25, + validator_set_rotation_block_count: 25, ..Default::default() }, block_spacing_ms: 3000, @@ -181,16 +180,6 @@ mod tests { .with_config(config.clone()) .build_with_mock_rpc(); - platform - .core_rpc - .expect_get_best_chain_lock() - .returning(move || { - Ok(CoreChainLock { - core_block_height: 1, - core_block_hash: [1; 32].to_vec(), - signature: [2; 96].to_vec(), - }) - }); let outcome = run_chain_for_strategy(&mut platform, 50, strategy, config, 13); // we expect to see quorums with banned members @@ -224,12 +213,13 @@ mod tests { }, total_hpmns: 100, extra_normal_mns: 0, - quorum_count: 24, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, upgrading_info: None, - core_height_increase: Frequency { + core_height_increase: RandomCoreHeightIncrease(Frequency { times_per_block_range: 1..2, chance_per_block: None, - }, + }), proposer_strategy: MasternodeListChangesStrategy { new_hpmns: Default::default(), removed_hpmns: Default::default(), @@ -262,10 +252,12 @@ mod tests { let quorum_size = 100; let config = PlatformConfig { - quorum_size, + validator_set_quorum_size: quorum_size, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), execution: ExecutionConfig { verify_sum_trees: true, - validator_set_quorum_rotation_block_count: 25, + validator_set_rotation_block_count: 25, ..Default::default() }, block_spacing_ms: 3000, @@ -276,16 +268,6 @@ mod tests { .with_config(config.clone()) .build_with_mock_rpc(); - platform - .core_rpc - .expect_get_best_chain_lock() - .returning(move || { - Ok(CoreChainLock { - core_block_height: 1, - core_block_hash: [1; 32].to_vec(), - signature: [2; 96].to_vec(), - }) - }); let outcome = run_chain_for_strategy(&mut platform, 26, strategy, config, 13); // We should also see validator sets with less than the quorum size diff --git a/packages/rs-drive-abci/tests/strategy_tests/execution.rs b/packages/rs-drive-abci/tests/strategy_tests/execution.rs index c51a376673..57f809f922 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/execution.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/execution.rs @@ -2,8 +2,8 @@ use crate::masternodes; use crate::masternodes::{GenerateTestMasternodeUpdates, MasternodeListItemWithUpdates}; use crate::query::ProofVerification; use crate::strategy::{ - ChainExecutionOutcome, ChainExecutionParameters, NetworkStrategy, StrategyRandomness, - ValidatorVersionMigration, + ChainExecutionOutcome, ChainExecutionParameters, CoreHeightIncrease, NetworkStrategy, + StrategyRandomness, ValidatorVersionMigration, }; use crate::verify_state_transitions::verify_state_transitions_were_or_were_not_executed; use dashcore_rpc::dashcore::hashes::Hash; @@ -20,6 +20,10 @@ use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV use strategy_tests::operations::FinalizeBlockOperation::IdentityAddKeys; use dashcore_rpc::json::{ExtendedQuorumListResult, SoftforkInfo}; +use dpp::bls_signatures::PrivateKey; +use dpp::dashcore::consensus::Encodable; +use dpp::dashcore::hashes::{sha256d, HashEngine}; +use dpp::dashcore::{ChainLock, QuorumSigningRequestId, VarInt}; use drive_abci::abci::AbciApplication; use drive_abci::config::PlatformConfig; use drive_abci::mimic::test_quorum::TestQuorumInfo; @@ -27,10 +31,11 @@ use drive_abci::mimic::{MimicExecuteBlockOptions, MimicExecuteBlockOutcome}; use drive_abci::platform_types::epoch_info::v0::EpochInfoV0; use drive_abci::platform_types::platform::Platform; use drive_abci::platform_types::platform_state::v0::PlatformStateV0Methods; -use drive_abci::rpc::core::MockCoreRPCLike; +use drive_abci::rpc::core::{CoreRPCLike, MockCoreRPCLike}; use drive_abci::test::fixture::abci::static_init_chain_request; +use platform_version::version::PlatformVersion; use rand::prelude::{SliceRandom, StdRng}; -use rand::SeedableRng; +use rand::{Rng, SeedableRng}; use std::collections::{BTreeMap, HashMap}; use tenderdash_abci::proto::abci::{ResponseInitChain, ValidatorSetUpdate}; use tenderdash_abci::proto::crypto::public_key::Sum::Bls12381; @@ -45,23 +50,42 @@ pub(crate) fn run_chain_for_strategy( config: PlatformConfig, seed: u64, ) -> ChainExecutionOutcome { - let quorum_count = strategy.quorum_count; // We assume 24 quorums - let quorum_size = config.quorum_size; + let validator_quorum_count = strategy.validator_quorum_count; // In most tests 24 quorums + let chain_lock_quorum_count = strategy.chain_lock_quorum_count; // In most tests 4 quorums when not the same as validator + let validator_set_quorum_size = config.validator_set_quorum_size; + let chain_lock_quorum_size = config.chain_lock_quorum_size; let mut rng = StdRng::seed_from_u64(seed); let any_changes_in_strategy = strategy.proposer_strategy.any_is_set(); let updated_proposers_in_strategy = strategy.proposer_strategy.any_kind_of_update_is_set(); + let core_height_increase = strategy.core_height_increase.clone(); + + let max_core_height = + core_height_increase.max_core_height(block_count, strategy.initial_core_height); + + let chain_lock_quorum_type = config.chain_lock_quorum_type(); + + let sign_chain_locks = strategy.sign_chain_locks; + + let mut core_blocks = BTreeMap::new(); + let mut block_rng = StdRng::seed_from_u64(rng.gen()); // so we don't need to regenerate tests + + for x in strategy.initial_core_height..max_core_height + 1 { + let block_hash: [u8; 32] = block_rng.gen(); + core_blocks.insert(x, block_hash); + } + let ( initial_masternodes_with_updates, initial_hpmns_with_updates, with_extra_masternodes_with_updates, with_extra_hpmns_with_updates, ) = if any_changes_in_strategy { - let approximate_end_core_height = - ((block_count as f64) * strategy.core_height_increase.average_event_count()) as u32; - let end_core_height = approximate_end_core_height * 2; //let's be safe + let end_core_height = strategy + .core_height_increase + .max_core_height(block_count, strategy.initial_core_height); let generate_updates = if updated_proposers_in_strategy { Some(GenerateTestMasternodeUpdates { start_core_height: config.abci.genesis_core_height, @@ -189,28 +213,33 @@ pub(crate) fn run_chain_for_strategy( ) }; + let initial_all_masternodes: Vec<_> = initial_masternodes_with_updates + .into_iter() + .chain(initial_hpmns_with_updates.clone()) + .collect(); + let all_hpmns_with_updates = with_extra_hpmns_with_updates .iter() .max_by_key(|(key, _)| *key) .map(|(_, v)| v.clone()) .unwrap_or(initial_hpmns_with_updates.clone()); - let total_quorums = if strategy.rotate_quorums { - quorum_count * 10 + let total_validator_quorums = if strategy.rotate_quorums { + validator_quorum_count * 10 } else { - quorum_count + validator_quorum_count }; - let quorums = masternodes::generate_test_quorums( - total_quorums as usize, + let validator_quorums = masternodes::generate_test_quorums( + total_validator_quorums as usize, initial_hpmns_with_updates .iter() .map(|hpmn| &hpmn.masternode), - quorum_size as usize, + validator_set_quorum_size as usize, &mut rng, ); - let mut quorums_details: Vec<(QuorumHash, ExtendedQuorumDetails)> = quorums + let mut quorums_details: Vec<(QuorumHash, ExtendedQuorumDetails)> = validator_quorums .keys() .map(|quorum_hash| { ( @@ -228,6 +257,47 @@ pub(crate) fn run_chain_for_strategy( quorums_details.shuffle(&mut rng); + let (chain_lock_quorums, chain_lock_quorums_details) = + if config.validator_set_quorum_type != config.chain_lock_quorum_type { + let total_chain_lock_quorums = if strategy.rotate_quorums { + chain_lock_quorum_count * 10 + } else { + chain_lock_quorum_count + }; + + let chain_lock_quorums = masternodes::generate_test_quorums( + total_chain_lock_quorums as usize, + initial_all_masternodes + .iter() + .map(|masternode| &masternode.masternode), + chain_lock_quorum_size as usize, + &mut rng, + ); + + let mut chain_lock_quorums_details: Vec<(QuorumHash, ExtendedQuorumDetails)> = + chain_lock_quorums + .keys() + .map(|quorum_hash| { + ( + *quorum_hash, + ExtendedQuorumDetails { + creation_height: 0, + quorum_index: None, + mined_block_hash: BlockHash::all_zeros(), + num_valid_members: 0, + health_ratio: 0.0, + }, + ) + }) + .collect(); + + chain_lock_quorums_details.shuffle(&mut rng); + + (chain_lock_quorums, chain_lock_quorums_details) + } else { + (BTreeMap::new(), vec![]) + }; + let start_core_height = platform.config.abci.genesis_core_height; platform @@ -266,15 +336,15 @@ pub(crate) fn run_chain_for_strategy( .core_rpc .expect_get_quorum_listextended() .returning(move |core_height: Option| { - let extended_info = if !strategy.rotate_quorums { + let validator_set_extended_info = if !strategy.rotate_quorums { quorums_details.clone().into_iter().collect() } else { let core_height = core_height.expect("expected a core height"); // if we rotate quorums we shouldn't give back the same ones every time let start_range = core_height / 24; - let end_range = start_range + quorum_count as u32; - let start_range = start_range % total_quorums as u32; - let end_range = end_range % total_quorums as u32; + let end_range = start_range + validator_quorum_count as u32; + let start_range = start_range % total_validator_quorums as u32; + let end_range = end_range % total_validator_quorums as u32; if end_range > start_range { quorums_details @@ -287,7 +357,7 @@ pub(crate) fn run_chain_for_strategy( let first_range = quorums_details .iter() .skip(start_range as usize) - .take((total_quorums as u32 - start_range) as usize); + .take((total_validator_quorums as u32 - start_range) as usize); let second_range = quorums_details.iter().take(end_range as usize); first_range .chain(second_range) @@ -296,15 +366,24 @@ pub(crate) fn run_chain_for_strategy( } }; - let result = ExtendedQuorumListResult { - quorums_by_type: HashMap::from([(QuorumType::Llmq100_67, extended_info)]), - }; + let mut quorums_by_type = + HashMap::from([(QuorumType::Llmq100_67, validator_set_extended_info)]); + + if !chain_lock_quorums_details.is_empty() { + quorums_by_type.insert( + QuorumType::Llmq400_60, + chain_lock_quorums_details.clone().into_iter().collect(), + ); + } + + let result = ExtendedQuorumListResult { quorums_by_type }; Ok(result) }); - let quorums_info: HashMap = quorums + let all_quorums_info: HashMap = validator_quorums .iter() + .chain(chain_lock_quorums.iter()) .map(|(quorum_hash, test_quorum_info)| (*quorum_hash, test_quorum_info.into())) .collect(); @@ -312,17 +391,12 @@ pub(crate) fn run_chain_for_strategy( .core_rpc .expect_get_quorum_info() .returning(move |_, quorum_hash: &QuorumHash, _| { - Ok(quorums_info + Ok(all_quorums_info .get::(quorum_hash) .unwrap_or_else(|| panic!("expected to get quorum {}", hex::encode(quorum_hash))) .clone()) }); - let initial_all_masternodes: Vec<_> = initial_masternodes_with_updates - .into_iter() - .chain(initial_hpmns_with_updates.clone()) - .collect(); - platform .core_rpc .expect_get_protx_diff_with_masternodes() @@ -467,11 +541,123 @@ pub(crate) fn run_chain_for_strategy( Ok(diff) }); + let mut core_height = strategy.initial_core_height; + + let mut core_height_increase = strategy.core_height_increase.clone(); + let mut core_height_rng = rng.clone(); + + let chain_lock_quorums_private_keys: BTreeMap = chain_lock_quorums + .iter() + .map(|(quorum_hash, info)| { + let bytes = info.private_key.to_bytes(); + let fixed_bytes: [u8; 32] = bytes + .as_slice() + .try_into() + .expect("Expected a byte array of length 32"); + (quorum_hash.clone(), fixed_bytes) + }) + .collect(); + + platform + .core_rpc + .expect_get_best_chain_lock() + .returning(move || { + let block_height = match &mut core_height_increase { + CoreHeightIncrease::NoCoreHeightIncrease + | CoreHeightIncrease::RandomCoreHeightIncrease(_) => core_height, + CoreHeightIncrease::KnownCoreHeightIncreases(core_block_heights) => { + if core_block_heights.len() == 1 { + *core_block_heights.first().unwrap() + } else { + core_block_heights.remove(0) + } + } + }; + + let block_hash = *core_blocks + .get(&block_height) + .expect(format!("expected a block hash to be known for {}", core_height).as_str()); + + let chain_lock = if sign_chain_locks { + // From DIP 8: https://github.com/dashpay/dips/blob/master/dip-0008.md#finalization-of-signed-blocks + // The request id is SHA256("clsig", blockHeight) and the message hash is the block hash of the previously successful attempt. + + let mut engine = QuorumSigningRequestId::engine(); + + // Prefix + let prefix_len = VarInt("clsig".len() as u64); + prefix_len + .consensus_encode(&mut engine) + .expect("expected to encode the prefix"); + + engine.input("clsig".as_bytes()); + engine.input(core_height.to_le_bytes().as_slice()); + + let request_id = QuorumSigningRequestId::from_engine(engine); + + // Based on the deterministic masternode list at the given height, a quorum must be selected that was active at the time this block was mined + + let quorum = Platform::::choose_quorum_thread_safe( + chain_lock_quorum_type, + &chain_lock_quorums_private_keys, + request_id.as_ref(), + PlatformVersion::latest(), //it should be okay to use latest here + ) + .expect("expected a quorum"); + + let (quorum_hash, quorum_private_key) = quorum.expect("expected to find a quorum"); + + // The signature must verify against the quorum public key and SHA256(llmqType, quorumHash, SHA256(height), blockHash). llmqType and quorumHash must be taken from the quorum selected in 1. + + let mut engine = sha256d::Hash::engine(); + + engine.input(&[chain_lock_quorum_type as u8]); + engine.input(quorum_hash.as_slice()); + engine.input(request_id.as_byte_array()); + engine.input(&block_hash); + + let message_digest = sha256d::Hash::from_engine(engine); + + let quorum_private_key = + PrivateKey::from_bytes(quorum_private_key.as_slice(), false) + .expect("expected to have a valid private key"); + let signature = quorum_private_key.sign(message_digest.as_byte_array()); + let chain_lock = ChainLock { + block_height: core_height, + block_hash: BlockHash::from_byte_array(block_hash), + signature: (*signature.to_bytes()).into(), + }; + + Ok(chain_lock) + } else { + let chain_lock = ChainLock { + block_height: core_height, + block_hash: BlockHash::from_byte_array(block_hash), + signature: [2; 96].into(), + }; + + Ok(chain_lock) + }; + + if let CoreHeightIncrease::RandomCoreHeightIncrease(core_height_increase) = + &core_height_increase + { + core_height += core_height_increase.events_if_hit(&mut core_height_rng) as u32; + }; + + chain_lock + }); + + platform + .core_rpc + .expect_submit_chain_lock() + .returning(move |chain_lock: &ChainLock| return Ok(chain_lock.block_height)); + create_chain_for_strategy( platform, block_count, all_hpmns_with_updates, - quorums, + validator_quorums, strategy, config, rng, @@ -613,7 +799,7 @@ pub(crate) fn continue_chain_for_strategy( StrategyRandomness::SeedEntropy(seed) => StdRng::seed_from_u64(seed), StrategyRandomness::RNGEntropy(rng) => rng, }; - let quorum_size = config.quorum_size; + let quorum_size = config.validator_set_quorum_size; let first_block_time = start_time_ms; let mut current_identities = vec![]; let mut signer = strategy.strategy.signer.clone().unwrap_or_default(); @@ -647,13 +833,11 @@ pub(crate) fn continue_chain_for_strategy( let mut state_transition_results_per_block = BTreeMap::new(); for block_height in block_start..(block_start + block_count) { + let state = platform.state.read().expect("lock is poisoned"); let epoch_info = EpochInfoV0::calculate( first_block_time, current_time_ms, - platform - .state - .read() - .expect("lock is poisoned") + state .last_committed_block_info() .as_ref() .map(|block_info| block_info.basic_info().time_ms), @@ -661,7 +845,9 @@ pub(crate) fn continue_chain_for_strategy( ) .expect("should calculate epoch info"); - current_core_height += strategy.core_height_increase.events_if_hit(&mut rng) as u32; + current_core_height = state.last_committed_core_height(); + + drop(state); let block_info = BlockInfo { time_ms: current_time_ms, @@ -747,12 +933,14 @@ pub(crate) fn continue_chain_for_strategy( expected_validation_errors.as_slice(), false, state_transitions.clone(), - strategy.max_tx_bytes_per_block, MimicExecuteBlockOptions { dont_finalize_block: strategy.dont_finalize_block(), rounds_before_finalization: strategy.failure_testing.as_ref().and_then( |failure_testing| failure_testing.rounds_before_successful_block, ), + max_tx_bytes_per_block: strategy.max_tx_bytes_per_block, + independent_process_proposal_verification: strategy + .independent_process_proposal_verification, }, ) .expect("expected to execute a block"), @@ -820,7 +1008,7 @@ pub(crate) fn continue_chain_for_strategy( query_strategy.query_chain_for_strategy( &ProofVerification { quorum_hash: ¤t_quorum_with_test_info.quorum_hash.into(), - quorum_type: config.quorum_type(), + quorum_type: config.validator_set_quorum_type(), app_version, chain_id: drive_abci::mimic::CHAIN_ID.to_string(), core_chain_locked_height: state_id.core_chain_locked_height, diff --git a/packages/rs-drive-abci/tests/strategy_tests/failures.rs b/packages/rs-drive-abci/tests/strategy_tests/failures.rs index 6f55d48d65..52fd3d1ef6 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/failures.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/failures.rs @@ -11,6 +11,9 @@ mod tests { use drive_abci::config::{ExecutionConfig, PlatformConfig, PlatformTestConfig}; + use crate::strategy::CoreHeightIncrease::{KnownCoreHeightIncreases, NoCoreHeightIncrease}; + use dpp::dashcore::hashes::Hash; + use dpp::dashcore::{BlockHash, ChainLock}; use dpp::data_contract::accessors::v0::{DataContractV0Getters, DataContractV0Setters}; use dpp::data_contract::document_type::random_document::{ DocumentFieldFillSize, DocumentFieldFillType, @@ -61,12 +64,10 @@ mod tests { }, total_hpmns: 100, extra_normal_mns: 0, - quorum_count: 24, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, upgrading_info: None, - core_height_increase: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + proposer_strategy: Default::default(), rotate_quorums: false, failure_testing: Some(FailureStrategy { @@ -81,10 +82,12 @@ mod tests { ..Default::default() }; let config = PlatformConfig { - quorum_size: 100, + validator_set_quorum_size: 100, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), execution: ExecutionConfig { verify_sum_trees: true, - validator_set_quorum_rotation_block_count: 25, + validator_set_rotation_block_count: 25, ..Default::default() }, block_spacing_ms: 3000, @@ -94,16 +97,7 @@ mod tests { let mut platform = TestPlatformBuilder::new() .with_config(config.clone()) .build_with_mock_rpc(); - platform - .core_rpc - .expect_get_best_chain_lock() - .returning(move || { - Ok(CoreChainLock { - core_block_height: 10, - core_block_hash: [1; 32].to_vec(), - signature: [2; 96].to_vec(), - }) - }); + let outcome = run_chain_for_strategy(&mut platform, 10, strategy, config, 15); outcome @@ -146,12 +140,10 @@ mod tests { }, total_hpmns: 100, extra_normal_mns: 0, - quorum_count: 24, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, upgrading_info: None, - core_height_increase: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + proposer_strategy: Default::default(), rotate_quorums: false, failure_testing: Some(FailureStrategy { @@ -166,10 +158,12 @@ mod tests { ..Default::default() }; let config = PlatformConfig { - quorum_size: 100, + validator_set_quorum_size: 100, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), execution: ExecutionConfig { verify_sum_trees: true, - validator_set_quorum_rotation_block_count: 25, + validator_set_rotation_block_count: 25, ..Default::default() }, block_spacing_ms: 3000, @@ -186,15 +180,15 @@ mod tests { .core_rpc .expect_get_best_chain_lock() .returning(move || { - let core_block_height = if core_block_heights.len() == 1 { + let block_height = if core_block_heights.len() == 1 { *core_block_heights.first().unwrap() } else { core_block_heights.remove(0) }; - Ok(CoreChainLock { - core_block_height, - core_block_hash: [1; 32].to_vec(), - signature: [2; 96].to_vec(), + Ok(ChainLock { + block_height, + block_hash: BlockHash::from_byte_array([1; 32]), + signature: [2; 96].into(), }) }); run_chain_for_strategy(&mut platform, 1, strategy.clone(), config.clone(), 15); @@ -212,11 +206,13 @@ mod tests { // We use the dpns contract and we insert two documents both with the same "name" // This is a common scenario we should see quite often let config = PlatformConfig { - quorum_size: 100, + validator_set_quorum_size: 100, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), execution: ExecutionConfig { //we disable document triggers because we are using dpns and dpns needs a preorder use_document_triggers: false, - validator_set_quorum_rotation_block_count: 25, + validator_set_rotation_block_count: 25, ..Default::default() }, block_spacing_ms: 3000, @@ -346,13 +342,10 @@ mod tests { }, total_hpmns: 100, extra_normal_mns: 0, - quorum_count: 24, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, upgrading_info: None, - core_height_increase: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, - + core_height_increase: KnownCoreHeightIncreases(vec![10, 11]), proposer_strategy: Default::default(), rotate_quorums: false, failure_testing: Some(FailureStrategy { @@ -367,23 +360,6 @@ mod tests { ..Default::default() }; - let mut core_block_heights = vec![10, 11]; - - platform - .core_rpc - .expect_get_best_chain_lock() - .returning(move || { - let core_block_height = if core_block_heights.len() == 1 { - *core_block_heights.first().unwrap() - } else { - core_block_heights.remove(0) - }; - Ok(CoreChainLock { - core_block_height, - core_block_hash: [1; 32].to_vec(), - signature: [2; 96].to_vec(), - }) - }); // On the first block we only have identities and contracts let outcome = run_chain_for_strategy(&mut platform, 2, strategy.clone(), config.clone(), 15); diff --git a/packages/rs-drive-abci/tests/strategy_tests/main.rs b/packages/rs-drive-abci/tests/strategy_tests/main.rs index 3e4070df12..6a528ee5ad 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/main.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/main.rs @@ -47,6 +47,7 @@ use strategy::{ }; use strategy_tests::Strategy; +mod chain_lock_update; mod core_update_tests; mod execution; mod failures; @@ -74,6 +75,8 @@ mod tests { DocumentAction, DocumentOp, IdentityUpdateOp, Operation, OperationType, }; + use crate::strategy::CoreHeightIncrease::RandomCoreHeightIncrease; + use dpp::dashcore::ChainLock; use dpp::data_contract::accessors::v0::{DataContractV0Getters, DataContractV0Setters}; use dpp::data_contract::document_type::random_document::{ DocumentFieldFillSize, DocumentFieldFillType, @@ -131,12 +134,9 @@ mod tests { }, total_hpmns: 100, extra_normal_mns: 0, - quorum_count: 24, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, upgrading_info: None, - core_height_increase: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, proposer_strategy: Default::default(), rotate_quorums: false, failure_testing: None, @@ -145,10 +145,12 @@ mod tests { ..Default::default() }; let config = PlatformConfig { - quorum_size: 100, + validator_set_quorum_size: 100, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), execution: ExecutionConfig { verify_sum_trees: true, - validator_set_quorum_rotation_block_count: 25, + validator_set_rotation_block_count: 25, ..ExecutionConfig::default() }, block_spacing_ms: 3000, @@ -159,16 +161,6 @@ mod tests { .with_config(config.clone()) .build_with_mock_rpc(); - platform - .core_rpc - .expect_get_best_chain_lock() - .returning(move || { - Ok(CoreChainLock { - core_block_height: 10, - core_block_hash: [1; 32].to_vec(), - signature: [2; 96].to_vec(), - }) - }); run_chain_for_strategy(&mut platform, 100, strategy, config, 15); } @@ -187,12 +179,10 @@ mod tests { }, total_hpmns: 100, extra_normal_mns: 0, - quorum_count: 24, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, upgrading_info: None, - core_height_increase: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + proposer_strategy: Default::default(), rotate_quorums: false, failure_testing: None, @@ -201,10 +191,12 @@ mod tests { ..Default::default() }; let config = PlatformConfig { - quorum_size: 100, + validator_set_quorum_size: 100, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), execution: ExecutionConfig { verify_sum_trees: true, - validator_set_quorum_rotation_block_count: 25, + validator_set_rotation_block_count: 25, ..ExecutionConfig::default() }, block_spacing_ms: 3000, @@ -215,16 +207,6 @@ mod tests { .with_config(config.clone()) .build_with_mock_rpc(); - platform - .core_rpc - .expect_get_best_chain_lock() - .returning(move || { - Ok(CoreChainLock { - core_block_height: 10, - core_block_hash: [1; 32].to_vec(), - signature: [2; 96].to_vec(), - }) - }); run_chain_for_strategy(&mut platform, 50, strategy, config, 13); } @@ -243,12 +225,10 @@ mod tests { }, total_hpmns: 100, extra_normal_mns: 0, - quorum_count: 24, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, upgrading_info: None, - core_height_increase: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + proposer_strategy: Default::default(), rotate_quorums: false, failure_testing: None, @@ -257,10 +237,12 @@ mod tests { ..Default::default() }; let config = PlatformConfig { - quorum_size: 100, + validator_set_quorum_size: 100, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), execution: ExecutionConfig { verify_sum_trees: true, - validator_set_quorum_rotation_block_count: 25, + validator_set_rotation_block_count: 25, ..ExecutionConfig::default() }, block_spacing_ms: 3000, @@ -274,17 +256,6 @@ mod tests { .with_config(config.clone()) .build_with_mock_rpc(); - platform - .core_rpc - .expect_get_best_chain_lock() - .returning(move || { - Ok(CoreChainLock { - core_block_height: 10, - core_block_hash: [1; 32].to_vec(), - signature: [2; 96].to_vec(), - }) - }); - let ChainExecutionOutcome { abci_app, proposers, @@ -379,12 +350,10 @@ mod tests { }, total_hpmns: 100, extra_normal_mns: 0, - quorum_count: 24, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, upgrading_info: None, - core_height_increase: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + proposer_strategy: Default::default(), rotate_quorums: false, failure_testing: Some(FailureStrategy { @@ -399,10 +368,12 @@ mod tests { ..Default::default() }; let config = PlatformConfig { - quorum_size: 100, + validator_set_quorum_size: 100, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), execution: ExecutionConfig { verify_sum_trees: true, - validator_set_quorum_rotation_block_count: 25, + validator_set_rotation_block_count: 25, ..ExecutionConfig::default() }, block_spacing_ms: 3000, @@ -416,17 +387,6 @@ mod tests { .with_config(config.clone()) .build_with_mock_rpc(); - platform - .core_rpc - .expect_get_best_chain_lock() - .returning(move || { - Ok(CoreChainLock { - core_block_height: 10, - core_block_hash: [1; 32].to_vec(), - signature: [2; 96].to_vec(), - }) - }); - let ChainExecutionOutcome { abci_app, proposers, @@ -522,12 +482,10 @@ mod tests { }, total_hpmns: 100, extra_normal_mns: 0, - quorum_count: 24, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, upgrading_info: None, - core_height_increase: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + proposer_strategy: Default::default(), rotate_quorums: false, failure_testing: None, @@ -536,10 +494,12 @@ mod tests { ..Default::default() }; let config = PlatformConfig { - quorum_size: 100, + validator_set_quorum_size: 100, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), execution: ExecutionConfig { verify_sum_trees: true, - validator_set_quorum_rotation_block_count: 25, + validator_set_rotation_block_count: 25, ..Default::default() }, block_spacing_ms: 3000, @@ -549,16 +509,7 @@ mod tests { let mut platform = TestPlatformBuilder::new() .with_config(config.clone()) .build_with_mock_rpc(); - platform - .core_rpc - .expect_get_best_chain_lock() - .returning(move || { - Ok(CoreChainLock { - core_block_height: 10, - core_block_hash: [1; 32].to_vec(), - signature: [2; 96].to_vec(), - }) - }); + let outcome = run_chain_for_strategy(&mut platform, 100, strategy, config, 15); let balance = outcome @@ -573,7 +524,7 @@ mod tests { .expect("expected to fetch balances") .expect("expected to have an identity to get balance from"); - assert_eq!(balance, 99869044820) + assert_eq!(balance, 99868861500) } #[test] @@ -591,12 +542,13 @@ mod tests { }, total_hpmns: 100, extra_normal_mns: 0, - quorum_count: 24, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, upgrading_info: None, - core_height_increase: Frequency { + core_height_increase: RandomCoreHeightIncrease(Frequency { times_per_block_range: 1..3, chance_per_block: Some(0.01), - }, + }), proposer_strategy: Default::default(), rotate_quorums: false, failure_testing: None, @@ -605,10 +557,12 @@ mod tests { ..Default::default() }; let config = PlatformConfig { - quorum_size: 100, + validator_set_quorum_size: 100, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), execution: ExecutionConfig { verify_sum_trees: true, - validator_set_quorum_rotation_block_count: 25, + validator_set_rotation_block_count: 25, ..Default::default() }, block_spacing_ms: 3000, @@ -619,16 +573,6 @@ mod tests { .with_config(config.clone()) .build_with_mock_rpc(); - platform - .core_rpc - .expect_get_best_chain_lock() - .returning(move || { - Ok(CoreChainLock { - core_block_height: 10, - core_block_hash: [1; 32].to_vec(), - signature: [2; 96].to_vec(), - }) - }); run_chain_for_strategy(&mut platform, 1000, strategy, config, 15); } @@ -647,12 +591,13 @@ mod tests { }, total_hpmns: 100, extra_normal_mns: 0, - quorum_count: 24, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, upgrading_info: None, - core_height_increase: Frequency { + core_height_increase: RandomCoreHeightIncrease(Frequency { times_per_block_range: 1..3, chance_per_block: Some(0.5), - }, + }), proposer_strategy: Default::default(), rotate_quorums: false, failure_testing: None, @@ -662,10 +607,12 @@ mod tests { }; let hour_in_ms = 1000 * 60 * 60; let config = PlatformConfig { - quorum_size: 100, + validator_set_quorum_size: 100, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), execution: ExecutionConfig { verify_sum_trees: true, - validator_set_quorum_rotation_block_count: 100, + validator_set_rotation_block_count: 100, ..Default::default() }, block_spacing_ms: hour_in_ms, @@ -676,16 +623,7 @@ mod tests { let mut platform = TestPlatformBuilder::new() .with_config(config.clone()) .build_with_mock_rpc(); - platform - .core_rpc - .expect_get_best_chain_lock() - .returning(move || { - Ok(CoreChainLock { - core_block_height: 10, - core_block_hash: [1; 32].to_vec(), - signature: [2; 96].to_vec(), - }) - }); + let outcome = run_chain_for_strategy(&mut platform, 1000, strategy, config, 15); assert_eq!(outcome.masternode_identity_balances.len(), 100); let all_have_balances = outcome @@ -710,12 +648,13 @@ mod tests { }, total_hpmns: 100, extra_normal_mns: 0, - quorum_count: 24, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, upgrading_info: None, - core_height_increase: Frequency { + core_height_increase: RandomCoreHeightIncrease(Frequency { times_per_block_range: 1..3, chance_per_block: Some(0.5), - }, + }), proposer_strategy: Default::default(), rotate_quorums: false, failure_testing: None, @@ -726,10 +665,12 @@ mod tests { let hour_in_s = 60 * 60; let three_mins_in_ms = 1000 * 60 * 3; let config = PlatformConfig { - quorum_size: 100, + validator_set_quorum_size: 100, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), execution: ExecutionConfig { verify_sum_trees: true, - validator_set_quorum_rotation_block_count: 100, + validator_set_rotation_block_count: 100, epoch_time_length_s: hour_in_s, ..Default::default() }, @@ -741,16 +682,7 @@ mod tests { let mut platform = TestPlatformBuilder::new() .with_config(config.clone()) .build_with_mock_rpc(); - platform - .core_rpc - .expect_get_best_chain_lock() - .returning(move || { - Ok(CoreChainLock { - core_block_height: 10, - core_block_hash: [1; 32].to_vec(), - signature: [2; 96].to_vec(), - }) - }); + let outcome = run_chain_for_strategy(&mut platform, 1000, strategy, config, 15); assert_eq!(outcome.masternode_identity_balances.len(), 100); let all_have_balances = outcome @@ -778,12 +710,13 @@ mod tests { }, total_hpmns: 500, extra_normal_mns: 0, - quorum_count: 24, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, upgrading_info: None, - core_height_increase: Frequency { + core_height_increase: RandomCoreHeightIncrease(Frequency { times_per_block_range: 5..6, chance_per_block: Some(0.5), - }, + }), proposer_strategy: Default::default(), rotate_quorums: true, failure_testing: None, @@ -792,10 +725,12 @@ mod tests { ..Default::default() }; let config = PlatformConfig { - quorum_size: 10, + validator_set_quorum_size: 10, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), execution: ExecutionConfig { verify_sum_trees: true, - validator_set_quorum_rotation_block_count: 25, + validator_set_rotation_block_count: 25, ..Default::default() }, block_spacing_ms: 300, @@ -806,16 +741,6 @@ mod tests { .with_config(config.clone()) .build_with_mock_rpc(); - platform - .core_rpc - .expect_get_best_chain_lock() - .returning(move || { - Ok(CoreChainLock { - core_block_height: 10, - core_block_hash: [1; 32].to_vec(), - signature: [2; 96].to_vec(), - }) - }); let ChainExecutionOutcome { abci_app, .. } = run_chain_for_strategy(&mut platform, 2000, strategy, config, 40); @@ -862,12 +787,13 @@ mod tests { }, total_hpmns: 100, extra_normal_mns: 0, - quorum_count: 24, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, upgrading_info: None, - core_height_increase: Frequency { + core_height_increase: RandomCoreHeightIncrease(Frequency { times_per_block_range: 1..2, chance_per_block: Some(0.2), - }, + }), proposer_strategy: MasternodeListChangesStrategy { new_hpmns: Frequency { times_per_block_range: 1..3, @@ -882,10 +808,12 @@ mod tests { ..Default::default() }; let config = PlatformConfig { - quorum_size: 10, + validator_set_quorum_size: 10, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), execution: ExecutionConfig { verify_sum_trees: true, - validator_set_quorum_rotation_block_count: 25, + validator_set_rotation_block_count: 25, ..Default::default() }, block_spacing_ms: 300, @@ -896,16 +824,6 @@ mod tests { .with_config(config.clone()) .build_with_mock_rpc(); - platform - .core_rpc - .expect_get_best_chain_lock() - .returning(move || { - Ok(CoreChainLock { - core_block_height: 10, - core_block_hash: [1; 32].to_vec(), - signature: [2; 96].to_vec(), - }) - }); let ChainExecutionOutcome { abci_app, .. } = run_chain_for_strategy(&mut platform, 300, strategy, config, 43); @@ -933,12 +851,13 @@ mod tests { }, total_hpmns: 100, extra_normal_mns: 0, - quorum_count: 24, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, upgrading_info: None, - core_height_increase: Frequency { + core_height_increase: RandomCoreHeightIncrease(Frequency { times_per_block_range: 1..2, chance_per_block: Some(0.2), - }, + }), proposer_strategy: MasternodeListChangesStrategy { new_hpmns: Frequency { times_per_block_range: 1..3, @@ -957,10 +876,12 @@ mod tests { ..Default::default() }; let config = PlatformConfig { - quorum_size: 10, + validator_set_quorum_size: 10, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), execution: ExecutionConfig { verify_sum_trees: true, - validator_set_quorum_rotation_block_count: 25, + validator_set_rotation_block_count: 25, ..Default::default() }, block_spacing_ms: 300, @@ -971,16 +892,6 @@ mod tests { .with_config(config.clone()) .build_with_mock_rpc(); - platform - .core_rpc - .expect_get_best_chain_lock() - .returning(move || { - Ok(CoreChainLock { - core_block_height: 10, - core_block_hash: [1; 32].to_vec(), - signature: [2; 96].to_vec(), - }) - }); let ChainExecutionOutcome { abci_app, .. } = run_chain_for_strategy(&mut platform, 300, strategy, config, 43); @@ -1007,12 +918,13 @@ mod tests { }, total_hpmns: 100, extra_normal_mns: 0, - quorum_count: 24, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, upgrading_info: None, - core_height_increase: Frequency { + core_height_increase: RandomCoreHeightIncrease(Frequency { times_per_block_range: 1..2, chance_per_block: Some(0.2), - }, + }), proposer_strategy: MasternodeListChangesStrategy { updated_hpmns: Frequency { times_per_block_range: 1..3, @@ -1027,10 +939,12 @@ mod tests { ..Default::default() }; let config = PlatformConfig { - quorum_size: 10, + validator_set_quorum_size: 10, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), execution: ExecutionConfig { verify_sum_trees: true, - validator_set_quorum_rotation_block_count: 25, + validator_set_rotation_block_count: 25, ..Default::default() }, block_spacing_ms: 300, @@ -1041,16 +955,6 @@ mod tests { .with_config(config.clone()) .build_with_mock_rpc(); - platform - .core_rpc - .expect_get_best_chain_lock() - .returning(move || { - Ok(CoreChainLock { - core_block_height: 10, - core_block_hash: [1; 32].to_vec(), - signature: [2; 96].to_vec(), - }) - }); let ChainExecutionOutcome { abci_app, proposers, @@ -1108,12 +1012,10 @@ mod tests { }, total_hpmns: 100, extra_normal_mns: 0, - quorum_count: 24, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, upgrading_info: None, - core_height_increase: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + proposer_strategy: Default::default(), rotate_quorums: false, failure_testing: None, @@ -1127,10 +1029,12 @@ mod tests { ..Default::default() }; let config = PlatformConfig { - quorum_size: 100, + validator_set_quorum_size: 100, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), execution: ExecutionConfig { verify_sum_trees: true, - validator_set_quorum_rotation_block_count: 25, + validator_set_rotation_block_count: 25, ..Default::default() }, block_spacing_ms: 3000, @@ -1140,16 +1044,7 @@ mod tests { let mut platform = TestPlatformBuilder::new() .with_config(config.clone()) .build_with_mock_rpc(); - platform - .core_rpc - .expect_get_best_chain_lock() - .returning(move || { - Ok(CoreChainLock { - core_block_height: 10, - core_block_hash: [1; 32].to_vec(), - signature: [2; 96].to_vec(), - }) - }); + let outcome = run_chain_for_strategy(&mut platform, 100, strategy, config, 15); assert_eq!(outcome.identities.len(), 100); @@ -1170,12 +1065,10 @@ mod tests { }, total_hpmns: 100, extra_normal_mns: 0, - quorum_count: 24, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, upgrading_info: None, - core_height_increase: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + proposer_strategy: Default::default(), rotate_quorums: false, failure_testing: None, @@ -1185,10 +1078,12 @@ mod tests { }; let day_in_ms = 1000 * 60 * 60 * 24; let config = PlatformConfig { - quorum_size: 100, + validator_set_quorum_size: 100, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), execution: ExecutionConfig { verify_sum_trees: true, - validator_set_quorum_rotation_block_count: 100, + validator_set_rotation_block_count: 100, ..Default::default() }, block_spacing_ms: day_in_ms, @@ -1199,16 +1094,7 @@ mod tests { let mut platform = TestPlatformBuilder::new() .with_config(config.clone()) .build_with_mock_rpc(); - platform - .core_rpc - .expect_get_best_chain_lock() - .returning(move || { - Ok(CoreChainLock { - core_block_height: 10, - core_block_hash: [1; 32].to_vec(), - signature: [2; 96].to_vec(), - }) - }); + let outcome = run_chain_for_strategy(&mut platform, 150, strategy, config, 15); assert_eq!(outcome.identities.len(), 150); assert_eq!(outcome.masternode_identity_balances.len(), 100); @@ -1228,7 +1114,7 @@ mod tests { .unwrap() .unwrap() ), - "31479dd805715e196773106ae8f00e1f28f8e5d4f8e3cbf21e6dd59f94643207".to_string() + "b1717304d3ce607569ca53d7f801df874578f510b352f23d8e4c087cdfed5697".to_string() ) } @@ -1255,12 +1141,10 @@ mod tests { }, total_hpmns: 100, extra_normal_mns: 0, - quorum_count: 24, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, upgrading_info: None, - core_height_increase: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + proposer_strategy: Default::default(), rotate_quorums: false, failure_testing: None, @@ -1269,10 +1153,12 @@ mod tests { ..Default::default() }; let config = PlatformConfig { - quorum_size: 100, + validator_set_quorum_size: 100, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), execution: ExecutionConfig { verify_sum_trees: true, - validator_set_quorum_rotation_block_count: 25, + validator_set_rotation_block_count: 25, ..Default::default() }, block_spacing_ms: 3000, @@ -1282,16 +1168,7 @@ mod tests { let mut platform = TestPlatformBuilder::new() .with_config(config.clone()) .build_with_mock_rpc(); - platform - .core_rpc - .expect_get_best_chain_lock() - .returning(move || { - Ok(CoreChainLock { - core_block_height: 10, - core_block_hash: [1; 32].to_vec(), - signature: [2; 96].to_vec(), - }) - }); + let outcome = run_chain_for_strategy(&mut platform, 1, strategy, config, 15); outcome @@ -1367,12 +1244,10 @@ mod tests { }, total_hpmns: 100, extra_normal_mns: 0, - quorum_count: 24, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, upgrading_info: None, - core_height_increase: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + proposer_strategy: Default::default(), rotate_quorums: false, failure_testing: None, @@ -1381,10 +1256,12 @@ mod tests { ..Default::default() }; let config = PlatformConfig { - quorum_size: 100, + validator_set_quorum_size: 100, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), execution: ExecutionConfig { verify_sum_trees: true, - validator_set_quorum_rotation_block_count: 25, + validator_set_rotation_block_count: 25, ..Default::default() }, block_spacing_ms: 3000, @@ -1394,16 +1271,7 @@ mod tests { let mut platform = TestPlatformBuilder::new() .with_config(config.clone()) .build_with_mock_rpc(); - platform - .core_rpc - .expect_get_best_chain_lock() - .returning(move || { - Ok(CoreChainLock { - core_block_height: 10, - core_block_hash: [1; 32].to_vec(), - signature: [2; 96].to_vec(), - }) - }); + let outcome = run_chain_for_strategy(&mut platform, 10, strategy, config, 15); outcome @@ -1474,12 +1342,10 @@ mod tests { }, total_hpmns: 100, extra_normal_mns: 0, - quorum_count: 24, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, upgrading_info: None, - core_height_increase: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + proposer_strategy: Default::default(), rotate_quorums: false, failure_testing: None, @@ -1488,10 +1354,12 @@ mod tests { ..Default::default() }; let config = PlatformConfig { - quorum_size: 100, + validator_set_quorum_size: 100, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), execution: ExecutionConfig { verify_sum_trees: true, - validator_set_quorum_rotation_block_count: 25, + validator_set_rotation_block_count: 25, ..Default::default() }, block_spacing_ms: 3000, @@ -1501,16 +1369,7 @@ mod tests { let mut platform = TestPlatformBuilder::new() .with_config(config.clone()) .build_with_mock_rpc(); - platform - .core_rpc - .expect_get_best_chain_lock() - .returning(move || { - Ok(CoreChainLock { - core_block_height: 10, - core_block_hash: [1; 32].to_vec(), - signature: [2; 96].to_vec(), - }) - }); + run_chain_for_strategy(&mut platform, 100, strategy, config, 15); } @@ -1557,12 +1416,10 @@ mod tests { }, total_hpmns: 100, extra_normal_mns: 0, - quorum_count: 24, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, upgrading_info: None, - core_height_increase: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + proposer_strategy: Default::default(), rotate_quorums: false, failure_testing: None, @@ -1572,10 +1429,12 @@ mod tests { }; let day_in_ms = 1000 * 60 * 60 * 24; let config = PlatformConfig { - quorum_size: 100, + validator_set_quorum_size: 100, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), execution: ExecutionConfig { verify_sum_trees: true, - validator_set_quorum_rotation_block_count: 100, + validator_set_rotation_block_count: 100, ..Default::default() }, block_spacing_ms: day_in_ms, @@ -1586,16 +1445,7 @@ mod tests { let mut platform = TestPlatformBuilder::new() .with_config(config.clone()) .build_with_mock_rpc(); - platform - .core_rpc - .expect_get_best_chain_lock() - .returning(move || { - Ok(CoreChainLock { - core_block_height: 10, - core_block_hash: [1; 32].to_vec(), - signature: [2; 96].to_vec(), - }) - }); + let outcome = run_chain_for_strategy(&mut platform, block_count, strategy, config, 15); assert_eq!(outcome.identities.len() as u64, block_count); assert_eq!(outcome.masternode_identity_balances.len(), 100); @@ -1668,12 +1518,10 @@ mod tests { }, total_hpmns: 100, extra_normal_mns: 0, - quorum_count: 24, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, upgrading_info: None, - core_height_increase: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + proposer_strategy: Default::default(), rotate_quorums: false, failure_testing: None, @@ -1683,10 +1531,12 @@ mod tests { }; let day_in_ms = 1000 * 60 * 60 * 24; let config = PlatformConfig { - quorum_size: 100, + validator_set_quorum_size: 100, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), execution: ExecutionConfig { verify_sum_trees: true, - validator_set_quorum_rotation_block_count: 100, + validator_set_rotation_block_count: 100, ..Default::default() }, block_spacing_ms: day_in_ms, @@ -1697,16 +1547,7 @@ mod tests { let mut platform = TestPlatformBuilder::new() .with_config(config.clone()) .build_with_mock_rpc(); - platform - .core_rpc - .expect_get_best_chain_lock() - .returning(move || { - Ok(CoreChainLock { - core_block_height: 10, - core_block_hash: [1; 32].to_vec(), - signature: [2; 96].to_vec(), - }) - }); + let outcome = run_chain_for_strategy(&mut platform, block_count, strategy, config, 15); assert_eq!(outcome.identities.len() as u64, block_count); assert_eq!(outcome.masternode_identity_balances.len(), 100); @@ -1779,12 +1620,10 @@ mod tests { }, total_hpmns: 100, extra_normal_mns: 0, - quorum_count: 24, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, upgrading_info: None, - core_height_increase: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + proposer_strategy: Default::default(), rotate_quorums: false, failure_testing: None, @@ -1794,10 +1633,12 @@ mod tests { }; let day_in_ms = 1000 * 60 * 60 * 24; let config = PlatformConfig { - quorum_size: 100, + validator_set_quorum_size: 100, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), execution: ExecutionConfig { verify_sum_trees: true, - validator_set_quorum_rotation_block_count: 100, + validator_set_rotation_block_count: 100, ..Default::default() }, block_spacing_ms: day_in_ms, @@ -1809,16 +1650,7 @@ mod tests { let mut platform = TestPlatformBuilder::new() .with_config(config.clone()) .build_with_mock_rpc(); - platform - .core_rpc - .expect_get_best_chain_lock() - .returning(move || { - Ok(CoreChainLock { - core_block_height: 10, - core_block_hash: [1; 32].to_vec(), - signature: [2; 96].to_vec(), - }) - }); + let outcome = run_chain_for_strategy(&mut platform, block_count, strategy, config, 15); assert_eq!(outcome.identities.len() as u64, block_count); assert_eq!(outcome.masternode_identity_balances.len(), 100); @@ -1838,7 +1670,7 @@ mod tests { .unwrap() .unwrap() ), - "1a1b119866b5cdff20d2fa04f3d2ff8e8d7349aa4b83e7ea05adeae0cfc9cb2c".to_string() + "40b51654a73ab89e98076819498a746dc179d54c53f599fa5ceeec57cec3576e".to_string() ) } @@ -1904,12 +1736,10 @@ mod tests { }, total_hpmns: 100, extra_normal_mns: 0, - quorum_count: 24, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, upgrading_info: None, - core_height_increase: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + proposer_strategy: Default::default(), rotate_quorums: false, failure_testing: None, @@ -1921,10 +1751,12 @@ mod tests { let day_in_ms = 1000 * 60 * 60 * 24; let config = PlatformConfig { - quorum_size: 100, + validator_set_quorum_size: 100, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), execution: ExecutionConfig { verify_sum_trees: true, - validator_set_quorum_rotation_block_count: 100, + validator_set_rotation_block_count: 100, epoch_time_length_s: 1576800, ..Default::default() }, @@ -1936,16 +1768,7 @@ mod tests { let mut platform = TestPlatformBuilder::new() .with_config(config.clone()) .build_with_mock_rpc(); - platform - .core_rpc - .expect_get_best_chain_lock() - .returning(move || { - Ok(CoreChainLock { - core_block_height: 10, - core_block_hash: [1; 32].to_vec(), - signature: [2; 96].to_vec(), - }) - }); + let outcome = run_chain_for_strategy(&mut platform, block_count, strategy, config, 15); assert_eq!(outcome.identities.len() as u64, 421); assert_eq!(outcome.masternode_identity_balances.len(), 100); @@ -2035,12 +1858,10 @@ mod tests { }, total_hpmns: 100, extra_normal_mns: 0, - quorum_count: 24, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, upgrading_info: None, - core_height_increase: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + proposer_strategy: Default::default(), rotate_quorums: false, failure_testing: None, @@ -2052,10 +1873,12 @@ mod tests { let day_in_ms = 1000 * 60 * 60 * 24; let config = PlatformConfig { - quorum_size: 100, + validator_set_quorum_size: 100, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), execution: ExecutionConfig { verify_sum_trees: true, - validator_set_quorum_rotation_block_count: 100, + validator_set_rotation_block_count: 100, epoch_time_length_s: 1576800, ..Default::default() }, @@ -2067,16 +1890,7 @@ mod tests { let mut platform = TestPlatformBuilder::new() .with_config(config.clone()) .build_with_mock_rpc(); - platform - .core_rpc - .expect_get_best_chain_lock() - .returning(move || { - Ok(CoreChainLock { - core_block_height: 10, - core_block_hash: [1; 32].to_vec(), - signature: [2; 96].to_vec(), - }) - }); + let outcome = run_chain_for_strategy(&mut platform, block_count, strategy, config, 15); assert_eq!(outcome.identities.len() as u64, 86); assert_eq!(outcome.masternode_identity_balances.len(), 100); @@ -2111,12 +1925,10 @@ mod tests { }, total_hpmns: 100, extra_normal_mns: 0, - quorum_count: 24, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, upgrading_info: None, - core_height_increase: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + proposer_strategy: Default::default(), rotate_quorums: false, failure_testing: None, @@ -2125,10 +1937,12 @@ mod tests { ..Default::default() }; let config = PlatformConfig { - quorum_size: 100, + validator_set_quorum_size: 100, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), execution: ExecutionConfig { verify_sum_trees: true, - validator_set_quorum_rotation_block_count: 25, + validator_set_rotation_block_count: 25, ..Default::default() }, block_spacing_ms: 3000, @@ -2138,16 +1952,7 @@ mod tests { let mut platform = TestPlatformBuilder::new() .with_config(config.clone()) .build_with_mock_rpc(); - platform - .core_rpc - .expect_get_best_chain_lock() - .returning(move || { - Ok(CoreChainLock { - core_block_height: 10, - core_block_hash: [1; 32].to_vec(), - signature: [2; 96].to_vec(), - }) - }); + let outcome = run_chain_for_strategy(&mut platform, 10, strategy, config, 15); let max_initial_balance = 100000000000u64; // TODO: some centralized way for random test data (`arbitrary` maybe?) @@ -2193,12 +1998,10 @@ mod tests { }, total_hpmns: 100, extra_normal_mns: 0, - quorum_count: 24, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, upgrading_info: None, - core_height_increase: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + proposer_strategy: Default::default(), rotate_quorums: false, failure_testing: None, @@ -2209,10 +2012,12 @@ mod tests { ..Default::default() }; let config = PlatformConfig { - quorum_size: 100, + validator_set_quorum_size: 100, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), execution: ExecutionConfig { verify_sum_trees: true, - validator_set_quorum_rotation_block_count: 25, + validator_set_rotation_block_count: 25, ..Default::default() }, block_spacing_ms: 3000, @@ -2222,16 +2027,7 @@ mod tests { let mut platform = TestPlatformBuilder::new() .with_config(config.clone()) .build_with_mock_rpc(); - platform - .core_rpc - .expect_get_best_chain_lock() - .returning(move || { - Ok(CoreChainLock { - core_block_height: 10, - core_block_hash: [1; 32].to_vec(), - signature: [2; 96].to_vec(), - }) - }); + let outcome = run_chain_for_strategy(&mut platform, 10, strategy, config, 15); let state = outcome.abci_app.platform.state.read().unwrap(); let protocol_version = state.current_protocol_version_in_consensus(); @@ -2282,12 +2078,10 @@ mod tests { }, total_hpmns: 100, extra_normal_mns: 0, - quorum_count: 24, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, upgrading_info: None, - core_height_increase: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + proposer_strategy: Default::default(), rotate_quorums: false, failure_testing: None, @@ -2298,10 +2092,12 @@ mod tests { ..Default::default() }; let config = PlatformConfig { - quorum_size: 100, + validator_set_quorum_size: 100, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), execution: ExecutionConfig { verify_sum_trees: true, - validator_set_quorum_rotation_block_count: 25, + validator_set_rotation_block_count: 25, ..Default::default() }, block_spacing_ms: 3000, @@ -2311,16 +2107,7 @@ mod tests { let mut platform = TestPlatformBuilder::new() .with_config(config.clone()) .build_with_mock_rpc(); - platform - .core_rpc - .expect_get_best_chain_lock() - .returning(move || { - Ok(CoreChainLock { - core_block_height: 10, - core_block_hash: [1; 32].to_vec(), - signature: [2; 96].to_vec(), - }) - }); + let outcome = run_chain_for_strategy(&mut platform, 10, strategy, config, 15); let identities = outcome @@ -2378,12 +2165,10 @@ mod tests { }, total_hpmns: 100, extra_normal_mns: 0, - quorum_count: 24, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, upgrading_info: None, - core_height_increase: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + proposer_strategy: Default::default(), rotate_quorums: false, failure_testing: None, @@ -2394,10 +2179,12 @@ mod tests { ..Default::default() }; let config = PlatformConfig { - quorum_size: 100, + validator_set_quorum_size: 100, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), execution: ExecutionConfig { verify_sum_trees: true, - validator_set_quorum_rotation_block_count: 25, + validator_set_rotation_block_count: 25, ..Default::default() }, block_spacing_ms: 3000, @@ -2407,16 +2194,7 @@ mod tests { let mut platform = TestPlatformBuilder::new() .with_config(config.clone()) .build_with_mock_rpc(); - platform - .core_rpc - .expect_get_best_chain_lock() - .returning(move || { - Ok(CoreChainLock { - core_block_height: 10, - core_block_hash: [1; 32].to_vec(), - signature: [2; 96].to_vec(), - }) - }); + let outcome = run_chain_for_strategy(&mut platform, 10, strategy, config, 15); assert_eq!(outcome.identities.len(), 10); @@ -2439,12 +2217,12 @@ mod tests { }, total_hpmns: 50, extra_normal_mns: 0, - quorum_count: 10, + validator_quorum_count: 10, upgrading_info: None, - core_height_increase: Frequency { + core_height_increase: RandomCoreHeightIncrease(Frequency { times_per_block_range: 1..2, chance_per_block: None, - }, + }), proposer_strategy: Default::default(), rotate_quorums: true, failure_testing: None, @@ -2454,10 +2232,12 @@ mod tests { }; let day_in_ms = 1000 * 60 * 60 * 24; let config = PlatformConfig { - quorum_size: 3, + validator_set_quorum_size: 3, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), execution: ExecutionConfig { verify_sum_trees: true, - validator_set_quorum_rotation_block_count: 1, + validator_set_rotation_block_count: 1, ..Default::default() }, block_spacing_ms: day_in_ms, @@ -2480,10 +2260,10 @@ mod tests { .core_rpc .expect_get_best_chain_lock() .returning(move || { - Ok(CoreChainLock { - core_block_height: 10, - core_block_hash: [1; 32].to_vec(), - signature: [2; 96].to_vec(), + Ok(ChainLock { + block_height: 10, + block_hash: BlockHash::from_byte_array([1; 32]), + signature: [2; 96].into(), }) }); @@ -2596,12 +2376,12 @@ mod tests { }, total_hpmns: 500, extra_normal_mns: 0, - quorum_count: 100, + validator_quorum_count: 100, upgrading_info: None, - core_height_increase: Frequency { + core_height_increase: RandomCoreHeightIncrease(Frequency { times_per_block_range: 1..2, chance_per_block: None, - }, + }), proposer_strategy: Default::default(), rotate_quorums: true, failure_testing: None, @@ -2611,10 +2391,12 @@ mod tests { }; let day_in_ms = 1000 * 60 * 60 * 24; let config = PlatformConfig { - quorum_size: 3, + validator_set_quorum_size: 3, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), execution: ExecutionConfig { verify_sum_trees: true, - validator_set_quorum_rotation_block_count: 1, + validator_set_rotation_block_count: 1, epoch_time_length_s: 1576800, ..Default::default() }, @@ -2632,20 +2414,20 @@ mod tests { .core_rpc .expect_get_best_chain_lock() .returning(move || { - Ok(CoreChainLock { - core_block_height: 10, - core_block_hash: [1; 32].to_vec(), - signature: [2; 96].to_vec(), + Ok(ChainLock { + block_height: 10, + block_hash: BlockHash::from_byte_array([1; 32]), + signature: [2; 96].into(), }) }); platform_b .core_rpc .expect_get_best_chain_lock() .returning(move || { - Ok(CoreChainLock { - core_block_height: 10, - core_block_hash: [1; 32].to_vec(), - signature: [2; 96].to_vec(), + Ok(ChainLock { + block_height: 10, + block_hash: BlockHash::from_byte_array([1; 32]), + signature: [2; 96].into(), }) }); @@ -2665,7 +2447,7 @@ mod tests { ); assert_eq!( masternodes_fingerprint_a, - "3f13e499c5c49b04ab1edf2bbddca733fd9cf6f92875ccf51e827a6f4bf044e8".to_string() + "0154fd29f0062819ee6b8063ea02c9f3296ed9af33a4538ae98087edb1a75029".to_string() ); let masternodes_fingerprint_b = hash_to_hex_string( outcome_b @@ -2676,7 +2458,7 @@ mod tests { ); assert_eq!( masternodes_fingerprint_b, - "3f13e499c5c49b04ab1edf2bbddca733fd9cf6f92875ccf51e827a6f4bf044e8".to_string() + "0154fd29f0062819ee6b8063ea02c9f3296ed9af33a4538ae98087edb1a75029".to_string() ); let last_app_hash_a = outcome_a @@ -2724,12 +2506,12 @@ mod tests { }, total_hpmns: 500, extra_normal_mns: 0, - quorum_count: 100, + validator_quorum_count: 100, upgrading_info: None, - core_height_increase: Frequency { + core_height_increase: RandomCoreHeightIncrease(Frequency { times_per_block_range: 1..2, chance_per_block: None, - }, + }), proposer_strategy: Default::default(), rotate_quorums: true, failure_testing: None, @@ -2739,10 +2521,12 @@ mod tests { }; let day_in_ms = 1000 * 60 * 60 * 24; let config = PlatformConfig { - quorum_size: 3, + validator_set_quorum_size: 3, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), execution: ExecutionConfig { verify_sum_trees: true, - validator_set_quorum_rotation_block_count: 1, + validator_set_rotation_block_count: 1, ..Default::default() }, block_spacing_ms: day_in_ms, @@ -2759,20 +2543,20 @@ mod tests { .core_rpc .expect_get_best_chain_lock() .returning(move || { - Ok(CoreChainLock { - core_block_height: 10, - core_block_hash: [1; 32].to_vec(), - signature: [2; 96].to_vec(), + Ok(ChainLock { + block_height: 10, + block_hash: BlockHash::from_byte_array([1; 32]), + signature: [2; 96].into(), }) }); platform_b .core_rpc .expect_get_best_chain_lock() .returning(move || { - Ok(CoreChainLock { - core_block_height: 10, - core_block_hash: [1; 32].to_vec(), - signature: [2; 96].to_vec(), + Ok(ChainLock { + block_height: 10, + block_hash: BlockHash::from_byte_array([1; 32]), + signature: [2; 96].into(), }) }); @@ -2792,7 +2576,7 @@ mod tests { ); assert_eq!( masternodes_fingerprint_a, - "3f13e499c5c49b04ab1edf2bbddca733fd9cf6f92875ccf51e827a6f4bf044e8".to_string() + "0154fd29f0062819ee6b8063ea02c9f3296ed9af33a4538ae98087edb1a75029".to_string() ); let masternodes_fingerprint_b = hash_to_hex_string( outcome_b @@ -2803,7 +2587,7 @@ mod tests { ); assert_eq!( masternodes_fingerprint_b, - "3f13e499c5c49b04ab1edf2bbddca733fd9cf6f92875ccf51e827a6f4bf044e8".to_string() + "0154fd29f0062819ee6b8063ea02c9f3296ed9af33a4538ae98087edb1a75029".to_string() ); let last_app_hash_a = outcome_a @@ -2831,8 +2615,8 @@ mod tests { .into_iter() .filter(|(_, balance)| *balance != 0) .count(); - // we have a maximum 90 quorums, that could have been used, 4 were used twice - assert_eq!(balance_count, 86); + // we have a maximum 90 quorums, that could have been used, 6 were used twice + assert_eq!(balance_count, 84); } #[test] @@ -2852,12 +2636,9 @@ mod tests { }, total_hpmns: 500, extra_normal_mns: 0, - quorum_count: 100, + validator_quorum_count: 100, upgrading_info: None, - core_height_increase: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + proposer_strategy: Default::default(), rotate_quorums: false, failure_testing: None, @@ -2867,10 +2648,12 @@ mod tests { }; let day_in_ms = 1000 * 60 * 60 * 24; let config = PlatformConfig { - quorum_size: 3, + validator_set_quorum_size: 3, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), execution: ExecutionConfig { verify_sum_trees: true, - validator_set_quorum_rotation_block_count: 1, + validator_set_rotation_block_count: 1, epoch_time_length_s: 1576800, ..Default::default() }, @@ -2885,17 +2668,6 @@ mod tests { .with_config(config.clone()) .build_with_mock_rpc(); - platform - .core_rpc - .expect_get_best_chain_lock() - .returning(move || { - Ok(CoreChainLock { - core_block_height: 10, - core_block_hash: [1; 32].to_vec(), - signature: [2; 96].to_vec(), - }) - }); - let ChainExecutionOutcome { abci_app, proposers, @@ -2994,12 +2766,10 @@ mod tests { }, total_hpmns: 100, extra_normal_mns: 0, - quorum_count: 24, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, upgrading_info: None, - core_height_increase: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + proposer_strategy: Default::default(), rotate_quorums: false, failure_testing: None, @@ -3009,10 +2779,12 @@ mod tests { }; let config = PlatformConfig { - quorum_size: 100, + validator_set_quorum_size: 100, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), execution: ExecutionConfig { verify_sum_trees: true, - validator_set_quorum_rotation_block_count: 25, + validator_set_rotation_block_count: 25, ..Default::default() }, block_spacing_ms: 3000, @@ -3023,16 +2795,7 @@ mod tests { let mut platform = TestPlatformBuilder::new() .with_config(config.clone()) .build_with_mock_rpc(); - platform - .core_rpc - .expect_get_best_chain_lock() - .returning(move || { - Ok(CoreChainLock { - core_block_height: 10, - core_block_hash: [1; 32].to_vec(), - signature: [2; 96].to_vec(), - }) - }); + let outcome = run_chain_for_strategy(&mut platform, 15, strategy, config, 15); let balances = &outcome @@ -3067,10 +2830,12 @@ mod tests { ..Default::default() }; let config = PlatformConfig { - quorum_size: 100, + validator_set_quorum_size: 100, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), execution: ExecutionConfig { verify_sum_trees: true, - validator_set_quorum_rotation_block_count: 25, + validator_set_rotation_block_count: 25, ..Default::default() }, block_spacing_ms: 3000, @@ -3080,16 +2845,6 @@ mod tests { let mut platform = TestPlatformBuilder::new() .with_config(config.clone()) .build_with_mock_rpc(); - platform - .core_rpc - .expect_get_best_chain_lock() - .returning(move || { - Ok(CoreChainLock { - core_block_height: 10, - core_block_hash: [1; 32].to_vec(), - signature: [2; 96].to_vec(), - }) - }); let outcome = run_chain_for_strategy(&mut platform, 1, strategy, config, 15); let state_transitions = outcome diff --git a/packages/rs-drive-abci/tests/strategy_tests/query.rs b/packages/rs-drive-abci/tests/strategy_tests/query.rs index 0da1dc98d9..17ae1ce383 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/query.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/query.rs @@ -349,6 +349,9 @@ mod tests { use strategy_tests::Strategy; + use crate::strategy::CoreHeightIncrease::RandomCoreHeightIncrease; + use dpp::dashcore::hashes::Hash; + use dpp::dashcore::{BlockHash, ChainLock}; use tenderdash_abci::proto::types::CoreChainLock; use tenderdash_abci::Application; @@ -391,12 +394,13 @@ mod tests { }, total_hpmns: 100, extra_normal_mns: 0, - quorum_count: 24, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, upgrading_info: None, - core_height_increase: Frequency { + core_height_increase: RandomCoreHeightIncrease(Frequency { times_per_block_range: 1..3, chance_per_block: Some(0.5), - }, + }), proposer_strategy: Default::default(), rotate_quorums: false, failure_testing: None, @@ -406,10 +410,12 @@ mod tests { }; let hour_in_ms = 1000 * 60 * 60; let config = PlatformConfig { - quorum_size: 100, + validator_set_quorum_size: 100, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), execution: ExecutionConfig { verify_sum_trees: true, - validator_set_quorum_rotation_block_count: 100, + validator_set_rotation_block_count: 100, ..Default::default() }, block_spacing_ms: hour_in_ms, @@ -420,16 +426,7 @@ mod tests { let mut platform = TestPlatformBuilder::new() .with_config(config.clone()) .build_with_mock_rpc(); - platform - .core_rpc - .expect_get_best_chain_lock() - .returning(move || { - Ok(CoreChainLock { - core_block_height: 10, - core_block_hash: [1; 32].to_vec(), - signature: [2; 96].to_vec(), - }) - }); + let outcome = run_chain_for_strategy(&mut platform, 1000, strategy, config, 15); assert_eq!(outcome.masternode_identity_balances.len(), 100); let all_have_balances = outcome @@ -502,12 +499,13 @@ mod tests { }, total_hpmns: 100, extra_normal_mns: 0, - quorum_count: 24, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, upgrading_info: None, - core_height_increase: Frequency { + core_height_increase: RandomCoreHeightIncrease(Frequency { times_per_block_range: 1..3, chance_per_block: Some(0.5), - }, + }), proposer_strategy: Default::default(), rotate_quorums: false, failure_testing: None, @@ -517,10 +515,12 @@ mod tests { }; let hour_in_ms = 1000 * 60 * 60; let config = PlatformConfig { - quorum_size: 100, + validator_set_quorum_size: 100, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), execution: ExecutionConfig { verify_sum_trees: true, - validator_set_quorum_rotation_block_count: 100, + validator_set_rotation_block_count: 100, ..Default::default() }, block_spacing_ms: hour_in_ms, @@ -531,16 +531,7 @@ mod tests { let mut platform = TestPlatformBuilder::new() .with_config(config.clone()) .build_with_mock_rpc(); - platform - .core_rpc - .expect_get_best_chain_lock() - .returning(move || { - Ok(CoreChainLock { - core_block_height: 10, - core_block_hash: [1; 32].to_vec(), - signature: [2; 96].to_vec(), - }) - }); + let outcome = run_chain_for_strategy(&mut platform, 1000, strategy, config, 15); assert_eq!(outcome.masternode_identity_balances.len(), 100); let all_have_balances = outcome @@ -614,12 +605,13 @@ mod tests { }, total_hpmns: 100, extra_normal_mns: 0, - quorum_count: 24, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, upgrading_info: None, - core_height_increase: Frequency { + core_height_increase: RandomCoreHeightIncrease(Frequency { times_per_block_range: 1..3, chance_per_block: Some(0.5), - }, + }), proposer_strategy: Default::default(), rotate_quorums: false, failure_testing: None, @@ -629,10 +621,12 @@ mod tests { }; let hour_in_ms = 1000 * 60 * 60; let config = PlatformConfig { - quorum_size: 100, + validator_set_quorum_size: 100, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), execution: ExecutionConfig { verify_sum_trees: true, - validator_set_quorum_rotation_block_count: 100, + validator_set_rotation_block_count: 100, ..Default::default() }, block_spacing_ms: hour_in_ms, @@ -643,16 +637,7 @@ mod tests { let mut platform = TestPlatformBuilder::new() .with_config(config.clone()) .build_with_mock_rpc(); - platform - .core_rpc - .expect_get_best_chain_lock() - .returning(move || { - Ok(CoreChainLock { - core_block_height: 10, - core_block_hash: [1; 32].to_vec(), - signature: [2; 96].to_vec(), - }) - }); + let outcome = run_chain_for_strategy(&mut platform, 1000, strategy, config, 15); assert_eq!(outcome.masternode_identity_balances.len(), 100); let all_have_balances = outcome @@ -678,7 +663,7 @@ mod tests { .read() .expect("expected to read state"); let protocol_version = platform_state.current_protocol_version_in_consensus(); - let current_epoch = platform_state.epoch_ref().index; + let current_epoch = platform_state.last_committed_block_epoch_ref().index; drop(platform_state); let platform_version = PlatformVersion::get(protocol_version) .expect("expected to get current platform version"); diff --git a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs index 9bb4013dad..1cae313520 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs @@ -51,6 +51,7 @@ use dpp::state_transition::documents_batch_transition::document_transition::{Doc use drive::drive::document::query::QueryDocumentsOutcomeV0Methods; use dpp::state_transition::data_contract_create_transition::methods::v0::DataContractCreateTransitionMethodsV0; +use crate::strategy::CoreHeightIncrease::NoCoreHeightIncrease; use simple_signer::signer::SimpleSigner; #[derive(Clone, Debug, Default)] @@ -154,20 +155,74 @@ pub struct MasternodeChanges { pub masternode_change_port_chance: Frequency, } +#[derive(Clone, Debug, Default)] +pub enum CoreHeightIncrease { + #[default] + NoCoreHeightIncrease, + RandomCoreHeightIncrease(Frequency), + KnownCoreHeightIncreases(Vec), +} + +impl CoreHeightIncrease { + pub fn max_core_height(&self, block_count: u64, initial_core_height: u32) -> u32 { + match self { + NoCoreHeightIncrease => initial_core_height, + CoreHeightIncrease::RandomCoreHeightIncrease(frequency) => { + initial_core_height + frequency.max_event_count() as u32 * block_count as u32 + } + CoreHeightIncrease::KnownCoreHeightIncreases(values) => { + values.last().copied().unwrap_or(initial_core_height) + } + } + } + pub fn average_core_height(&self, block_count: u64, initial_core_height: u32) -> u32 { + match self { + NoCoreHeightIncrease => initial_core_height, + CoreHeightIncrease::RandomCoreHeightIncrease(frequency) => { + initial_core_height + frequency.average_event_count() as u32 * block_count as u32 + } + CoreHeightIncrease::KnownCoreHeightIncreases(values) => values + .get(values.len() / 2) + .copied() + .unwrap_or(initial_core_height), + } + } + + pub fn add_events_if_hit(&mut self, core_height: u32, rng: &mut StdRng) -> u32 { + match self { + NoCoreHeightIncrease => 0, + CoreHeightIncrease::RandomCoreHeightIncrease(frequency) => { + core_height + frequency.events_if_hit(rng) as u32 + } + CoreHeightIncrease::KnownCoreHeightIncreases(values) => { + if values.len() == 1 { + *values.get(0).unwrap() + } else { + values.pop().unwrap() + } + } + } + } +} + #[derive(Clone, Debug)] pub struct NetworkStrategy { pub strategy: Strategy, pub total_hpmns: u16, pub extra_normal_mns: u16, - pub quorum_count: u16, + pub validator_quorum_count: u16, + pub chain_lock_quorum_count: u16, + pub initial_core_height: u32, pub upgrading_info: Option, - pub core_height_increase: Frequency, + pub core_height_increase: CoreHeightIncrease, pub proposer_strategy: MasternodeListChangesStrategy, pub rotate_quorums: bool, pub failure_testing: Option, pub query_testing: Option, pub verify_state_transition_results: bool, - pub max_tx_bytes_per_block: i64, + pub max_tx_bytes_per_block: u64, + pub independent_process_proposal_verification: bool, + pub sign_chain_locks: bool, } impl Default for NetworkStrategy { @@ -176,18 +231,19 @@ impl Default for NetworkStrategy { strategy: Default::default(), total_hpmns: 100, extra_normal_mns: 0, - quorum_count: 24, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, + initial_core_height: 1, upgrading_info: None, - core_height_increase: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + core_height_increase: NoCoreHeightIncrease, proposer_strategy: Default::default(), rotate_quorums: false, failure_testing: None, query_testing: None, verify_state_transition_results: false, max_tx_bytes_per_block: 44800, + independent_process_proposal_verification: false, + sign_chain_locks: false, } } } diff --git a/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs b/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs index 8fe6259375..e3954dfd10 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs @@ -1,6 +1,8 @@ #[cfg(test)] mod tests { use dpp::block::extended_block_info::v0::ExtendedBlockInfoV0Getters; + use dpp::dashcore::hashes::Hash; + use dpp::dashcore::{BlockHash, ChainLock}; use dpp::version::PlatformVersion; use drive::drive::config::DriveConfig; use tenderdash_abci::proto::types::CoreChainLock; @@ -43,16 +45,14 @@ mod tests { }, total_hpmns: 460, extra_normal_mns: 0, - quorum_count: 24, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, upgrading_info: Some(UpgradingInfo { current_protocol_version: 1, proposed_protocol_versions_with_weight: vec![(TEST_PROTOCOL_VERSION_2, 1)], upgrade_three_quarters_life: 0.1, }), - core_height_increase: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + proposer_strategy: Default::default(), rotate_quorums: false, failure_testing: None, @@ -62,10 +62,12 @@ mod tests { }; let twenty_minutes_in_ms = 1000 * 60 * 20; let mut config = PlatformConfig { - quorum_size: 100, + validator_set_quorum_size: 100, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), execution: ExecutionConfig { verify_sum_trees: true, - validator_set_quorum_rotation_block_count: 125, + validator_set_rotation_block_count: 125, epoch_time_length_s: 1576800, ..Default::default() }, @@ -85,10 +87,10 @@ mod tests { .core_rpc .expect_get_best_chain_lock() .returning(move || { - Ok(CoreChainLock { - core_block_height: 10, - core_block_hash: [1; 32].to_vec(), - signature: [2; 96].to_vec(), + Ok(ChainLock { + block_height: 10, + block_hash: BlockHash::from_byte_array([1; 32]), + signature: [2; 96].into(), }) }); let ChainExecutionOutcome { @@ -138,7 +140,7 @@ mod tests { ); assert_eq!( (counter.get(&1), counter.get(&TEST_PROTOCOL_VERSION_2)), - (Some(&16), Some(&416)) + (Some(&17), Some(&414)) ); //most nodes were hit (63 were not) } @@ -216,7 +218,7 @@ mod tests { TEST_PROTOCOL_VERSION_2 ); assert_eq!(counter.get(&1), None); //no one has proposed 1 yet - assert_eq!(counter.get(&TEST_PROTOCOL_VERSION_2), Some(&157)); + assert_eq!(counter.get(&TEST_PROTOCOL_VERSION_2), Some(&154)); } // we locked in @@ -278,7 +280,7 @@ mod tests { TEST_PROTOCOL_VERSION_2 ); assert_eq!(counter.get(&1), None); //no one has proposed 1 yet - assert_eq!(counter.get(&TEST_PROTOCOL_VERSION_2), Some(&120)); + assert_eq!(counter.get(&TEST_PROTOCOL_VERSION_2), Some(&122)); } }) .expect("Failed to create thread with custom stack size"); @@ -312,16 +314,14 @@ mod tests { }, total_hpmns: 50, extra_normal_mns: 0, - quorum_count: 24, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, upgrading_info: Some(UpgradingInfo { current_protocol_version: 1, proposed_protocol_versions_with_weight: vec![(TEST_PROTOCOL_VERSION_2, 1)], upgrade_three_quarters_life: 0.2, }), - core_height_increase: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + proposer_strategy: Default::default(), rotate_quorums: false, failure_testing: None, @@ -332,10 +332,12 @@ mod tests { let one_hour_in_s = 60 * 60; let thirty_seconds_in_ms = 1000 * 30; let config = PlatformConfig { - quorum_size: 30, + validator_set_quorum_size: 30, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), execution: ExecutionConfig { verify_sum_trees: true, - validator_set_quorum_rotation_block_count: 30, + validator_set_rotation_block_count: 30, epoch_time_length_s: one_hour_in_s, ..Default::default() }, @@ -351,10 +353,10 @@ mod tests { .core_rpc .expect_get_best_chain_lock() .returning(move || { - Ok(CoreChainLock { - core_block_height: 10, - core_block_hash: [1; 32].to_vec(), - signature: [2; 96].to_vec(), + Ok(ChainLock { + block_height: 10, + block_hash: BlockHash::from_byte_array([1; 32]), + signature: [2; 96].into(), }) }); let ChainExecutionOutcome { @@ -574,16 +576,13 @@ mod tests { }, total_hpmns: 120, extra_normal_mns: 0, - quorum_count: 200, + validator_quorum_count: 200, upgrading_info: Some(UpgradingInfo { current_protocol_version: 1, proposed_protocol_versions_with_weight: vec![(TEST_PROTOCOL_VERSION_2, 1)], upgrade_three_quarters_life: 5.0, //it will take many epochs before we get enough nodes }), - core_height_increase: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + proposer_strategy: Default::default(), rotate_quorums: false, failure_testing: None, @@ -593,10 +592,12 @@ mod tests { }; let hour_in_ms = 1000 * 60 * 60; let config = PlatformConfig { - quorum_size: 40, + validator_set_quorum_size: 40, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), execution: ExecutionConfig { verify_sum_trees: true, - validator_set_quorum_rotation_block_count: 80, + validator_set_rotation_block_count: 80, epoch_time_length_s: 1576800, ..Default::default() }, @@ -616,10 +617,10 @@ mod tests { .core_rpc .expect_get_best_chain_lock() .returning(move || { - Ok(CoreChainLock { - core_block_height: 10, - core_block_hash: [1; 32].to_vec(), - signature: [2; 96].to_vec(), + Ok(ChainLock { + block_height: 10, + block_hash: BlockHash::from_byte_array([1; 32]), + signature: [2; 96].into(), }) }); @@ -835,16 +836,13 @@ mod tests { }, total_hpmns: 200, extra_normal_mns: 0, - quorum_count: 100, + validator_quorum_count: 100, upgrading_info: Some(UpgradingInfo { current_protocol_version: 1, proposed_protocol_versions_with_weight: vec![(TEST_PROTOCOL_VERSION_2, 1)], upgrade_three_quarters_life: 5.0, }), - core_height_increase: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + proposer_strategy: Default::default(), rotate_quorums: false, failure_testing: None, @@ -854,10 +852,12 @@ mod tests { }; let hour_in_ms = 1000 * 60 * 60; let mut config = PlatformConfig { - quorum_size: 50, + validator_set_quorum_size: 50, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), execution: ExecutionConfig { verify_sum_trees: true, - validator_set_quorum_rotation_block_count: 50, + validator_set_rotation_block_count: 50, epoch_time_length_s: 1576800, ..Default::default() }, @@ -877,10 +877,10 @@ mod tests { .core_rpc .expect_get_best_chain_lock() .returning(move || { - Ok(CoreChainLock { - core_block_height: 10, - core_block_hash: [1; 32].to_vec(), - signature: [2; 96].to_vec(), + Ok(ChainLock { + block_height: 10, + block_hash: BlockHash::from_byte_array([1; 32]), + signature: [2; 96].into(), }) }); let ChainExecutionOutcome { @@ -1013,7 +1013,7 @@ mod tests { }, total_hpmns: 200, extra_normal_mns: 0, - quorum_count: 100, + validator_quorum_count: 100, upgrading_info: Some(UpgradingInfo { current_protocol_version: 2, proposed_protocol_versions_with_weight: vec![ @@ -1022,10 +1022,7 @@ mod tests { ], upgrade_three_quarters_life: 0.1, }), - core_height_increase: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + proposer_strategy: Default::default(), rotate_quorums: false, failure_testing: None, @@ -1075,7 +1072,7 @@ mod tests { let counter = &drive_cache.protocol_versions_counter; assert_eq!( (counter.get(&1), counter.get(&TEST_PROTOCOL_VERSION_2)), - (Some(&170), Some(&24)) + (Some(&172), Some(&24)) ); //a lot nodes reverted to previous version, however this won't impact things assert_eq!( @@ -1138,7 +1135,7 @@ mod tests { let counter = &drive_cache.protocol_versions_counter; assert_eq!( (counter.get(&1), counter.get(&TEST_PROTOCOL_VERSION_2)), - (Some(&22), Some(&3)) + (Some(&23), Some(&2)) ); assert_eq!( platform @@ -1197,7 +1194,7 @@ mod tests { }, total_hpmns: 200, extra_normal_mns: 0, - quorum_count: 100, + validator_quorum_count: 100, upgrading_info: Some(UpgradingInfo { current_protocol_version: 1, proposed_protocol_versions_with_weight: vec![ @@ -1207,10 +1204,7 @@ mod tests { ], upgrade_three_quarters_life: 0.75, }), - core_height_increase: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + proposer_strategy: Default::default(), rotate_quorums: false, failure_testing: None, @@ -1220,10 +1214,12 @@ mod tests { }; let hour_in_ms = 1000 * 60 * 60; let config = PlatformConfig { - quorum_size: 50, + validator_set_quorum_size: 50, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), execution: ExecutionConfig { verify_sum_trees: true, - validator_set_quorum_rotation_block_count: 30, + validator_set_rotation_block_count: 30, epoch_time_length_s: 1576800, ..Default::default() }, @@ -1243,10 +1239,10 @@ mod tests { .core_rpc .expect_get_best_chain_lock() .returning(move || { - Ok(CoreChainLock { - core_block_height: 10, - core_block_hash: [1; 32].to_vec(), - signature: [2; 96].to_vec(), + Ok(ChainLock { + block_height: 10, + block_hash: BlockHash::from_byte_array([1; 32]), + signature: [2; 96].into(), }) }); let ChainExecutionOutcome { @@ -1293,7 +1289,7 @@ mod tests { counter.get(&TEST_PROTOCOL_VERSION_2), counter.get(&TEST_PROTOCOL_VERSION_3) ), - (Some(&2), Some(&69), Some(&3)) + (Some(&2), Some(&68), Some(&3)) ); //some nodes reverted to previous version } @@ -1310,7 +1306,8 @@ mod tests { }, total_hpmns: 200, extra_normal_mns: 0, - quorum_count: 24, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, upgrading_info: Some(UpgradingInfo { current_protocol_version: 1, proposed_protocol_versions_with_weight: vec![ @@ -1319,10 +1316,7 @@ mod tests { ], upgrade_three_quarters_life: 0.5, }), - core_height_increase: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + proposer_strategy: Default::default(), rotate_quorums: false, failure_testing: None, @@ -1349,7 +1343,7 @@ mod tests { ChainExecutionParameters { block_start, core_height_start: 1, - block_count: 700, + block_count: 1100, proposers, quorums, current_quorum_hash, @@ -1375,7 +1369,7 @@ mod tests { .basic_info() .epoch .index, - 4 + 5 ); assert_eq!( platform @@ -1395,7 +1389,7 @@ mod tests { counter.get(&TEST_PROTOCOL_VERSION_2), counter.get(&TEST_PROTOCOL_VERSION_3) ), - (None, Some(&3), Some(&155)) + (None, Some(&3), Some(&143)) ); } }) diff --git a/packages/rs-drive-proof-verifier/Cargo.toml b/packages/rs-drive-proof-verifier/Cargo.toml index ec67564352..3b42107d9e 100644 --- a/packages/rs-drive-proof-verifier/Cargo.toml +++ b/packages/rs-drive-proof-verifier/Cargo.toml @@ -20,7 +20,7 @@ drive = { path = "../rs-drive", default-features = false, features = [ "verify", ] } dpp = { path = "../rs-dpp" } -tenderdash-abci = { git = "https://github.com/dashpay/rs-tenderdash-abci" } +tenderdash-abci = { git = "https://github.com/dashpay/rs-tenderdash-abci", tag = "v0.14.0-dev.5" } # tenderdash-abci = { path = "../../../rs-tenderdash-abci/abci" } tracing = { version = "0.1.37" } serde = { version = "1.0.171", default-features = false, optional = true } diff --git a/packages/rs-platform-version/src/version/drive_abci_versions.rs b/packages/rs-platform-version/src/version/drive_abci_versions.rs index e39f192cf8..62fa30ba2c 100644 --- a/packages/rs-platform-version/src/version/drive_abci_versions.rs +++ b/packages/rs-platform-version/src/version/drive_abci_versions.rs @@ -61,6 +61,7 @@ pub struct DriveAbciMethodVersions { pub protocol_upgrade: DriveAbciProtocolUpgradeMethodVersions, pub block_fee_processing: DriveAbciBlockFeeProcessingMethodVersions, pub core_subsidy: DriveAbciCoreSubsidyMethodVersions, + pub core_chain_lock: DriveAbciCoreChainLockMethodVersionsAndConstants, pub fee_pool_inwards_distribution: DriveAbciFeePoolInwardsDistributionMethodVersions, pub fee_pool_outwards_distribution: DriveAbciFeePoolOutwardsDistributionMethodVersions, pub identity_credit_withdrawal: DriveAbciIdentityCreditWithdrawalMethodVersions, @@ -203,6 +204,16 @@ pub struct DriveAbciCoreSubsidyMethodVersions { pub epoch_core_reward_credits_for_distribution: FeatureVersion, } +#[derive(Clone, Debug, Default)] +pub struct DriveAbciCoreChainLockMethodVersionsAndConstants { + pub choose_quorum: FeatureVersion, + pub verify_chain_lock: FeatureVersion, + pub verify_chain_lock_locally: FeatureVersion, + pub verify_chain_lock_through_core: FeatureVersion, + pub make_sure_core_is_synced_to_chain_lock: FeatureVersion, + pub recent_block_count_amount: u32, //what constitutes a recent block, for v0 it's 2. +} + #[derive(Clone, Debug, Default)] pub struct DriveAbciFeePoolInwardsDistributionMethodVersions { pub add_distribute_block_fees_into_pools_operations: FeatureVersion, diff --git a/packages/rs-platform-version/src/version/mocks/v2_test.rs b/packages/rs-platform-version/src/version/mocks/v2_test.rs index 9805027977..bef04b0d40 100644 --- a/packages/rs-platform-version/src/version/mocks/v2_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v2_test.rs @@ -12,9 +12,10 @@ use crate::version::dpp_versions::{ use crate::version::drive_abci_versions::{ DriveAbciAssetLockValidationVersions, DriveAbciBlockEndMethodVersions, DriveAbciBlockFeeProcessingMethodVersions, DriveAbciBlockStartMethodVersions, - DriveAbciCoreBasedUpdatesMethodVersions, DriveAbciCoreSubsidyMethodVersions, - DriveAbciDocumentsStateTransitionValidationVersions, DriveAbciEngineMethodVersions, - DriveAbciEpochMethodVersions, DriveAbciFeePoolInwardsDistributionMethodVersions, + DriveAbciCoreBasedUpdatesMethodVersions, DriveAbciCoreChainLockMethodVersionsAndConstants, + DriveAbciCoreSubsidyMethodVersions, DriveAbciDocumentsStateTransitionValidationVersions, + DriveAbciEngineMethodVersions, DriveAbciEpochMethodVersions, + DriveAbciFeePoolInwardsDistributionMethodVersions, DriveAbciFeePoolOutwardsDistributionMethodVersions, DriveAbciIdentityCreditWithdrawalMethodVersions, DriveAbciInitializationMethodVersions, DriveAbciMasternodeIdentitiesUpdatesMethodVersions, DriveAbciMethodVersions, @@ -501,6 +502,14 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { core_subsidy: DriveAbciCoreSubsidyMethodVersions { epoch_core_reward_credits_for_distribution: 0, }, + core_chain_lock: DriveAbciCoreChainLockMethodVersionsAndConstants { + choose_quorum: 0, + verify_chain_lock: 0, + verify_chain_lock_locally: 0, + verify_chain_lock_through_core: 0, + make_sure_core_is_synced_to_chain_lock: 0, + recent_block_count_amount: 2, + }, fee_pool_inwards_distribution: DriveAbciFeePoolInwardsDistributionMethodVersions { add_distribute_block_fees_into_pools_operations: 0, add_distribute_storage_fee_to_epochs_operations: 0, diff --git a/packages/rs-platform-version/src/version/mocks/v3_test.rs b/packages/rs-platform-version/src/version/mocks/v3_test.rs index 2825786c60..19ed1497bb 100644 --- a/packages/rs-platform-version/src/version/mocks/v3_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v3_test.rs @@ -12,9 +12,10 @@ use crate::version::dpp_versions::{ use crate::version::drive_abci_versions::{ DriveAbciAssetLockValidationVersions, DriveAbciBlockEndMethodVersions, DriveAbciBlockFeeProcessingMethodVersions, DriveAbciBlockStartMethodVersions, - DriveAbciCoreBasedUpdatesMethodVersions, DriveAbciCoreSubsidyMethodVersions, - DriveAbciDocumentsStateTransitionValidationVersions, DriveAbciEngineMethodVersions, - DriveAbciEpochMethodVersions, DriveAbciFeePoolInwardsDistributionMethodVersions, + DriveAbciCoreBasedUpdatesMethodVersions, DriveAbciCoreChainLockMethodVersionsAndConstants, + DriveAbciCoreSubsidyMethodVersions, DriveAbciDocumentsStateTransitionValidationVersions, + DriveAbciEngineMethodVersions, DriveAbciEpochMethodVersions, + DriveAbciFeePoolInwardsDistributionMethodVersions, DriveAbciFeePoolOutwardsDistributionMethodVersions, DriveAbciIdentityCreditWithdrawalMethodVersions, DriveAbciInitializationMethodVersions, DriveAbciMasternodeIdentitiesUpdatesMethodVersions, DriveAbciMethodVersions, @@ -501,6 +502,14 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { core_subsidy: DriveAbciCoreSubsidyMethodVersions { epoch_core_reward_credits_for_distribution: 0, }, + core_chain_lock: DriveAbciCoreChainLockMethodVersionsAndConstants { + choose_quorum: 0, + verify_chain_lock: 0, + verify_chain_lock_locally: 0, + verify_chain_lock_through_core: 0, + make_sure_core_is_synced_to_chain_lock: 0, + recent_block_count_amount: 2, + }, fee_pool_inwards_distribution: DriveAbciFeePoolInwardsDistributionMethodVersions { add_distribute_block_fees_into_pools_operations: 0, add_distribute_storage_fee_to_epochs_operations: 0, diff --git a/packages/rs-platform-version/src/version/v1.rs b/packages/rs-platform-version/src/version/v1.rs index 057e9eb041..e7122638dc 100644 --- a/packages/rs-platform-version/src/version/v1.rs +++ b/packages/rs-platform-version/src/version/v1.rs @@ -12,9 +12,10 @@ use crate::version::dpp_versions::{ use crate::version::drive_abci_versions::{ DriveAbciAssetLockValidationVersions, DriveAbciBlockEndMethodVersions, DriveAbciBlockFeeProcessingMethodVersions, DriveAbciBlockStartMethodVersions, - DriveAbciCoreBasedUpdatesMethodVersions, DriveAbciCoreSubsidyMethodVersions, - DriveAbciDocumentsStateTransitionValidationVersions, DriveAbciEngineMethodVersions, - DriveAbciEpochMethodVersions, DriveAbciFeePoolInwardsDistributionMethodVersions, + DriveAbciCoreBasedUpdatesMethodVersions, DriveAbciCoreChainLockMethodVersionsAndConstants, + DriveAbciCoreSubsidyMethodVersions, DriveAbciDocumentsStateTransitionValidationVersions, + DriveAbciEngineMethodVersions, DriveAbciEpochMethodVersions, + DriveAbciFeePoolInwardsDistributionMethodVersions, DriveAbciFeePoolOutwardsDistributionMethodVersions, DriveAbciIdentityCreditWithdrawalMethodVersions, DriveAbciInitializationMethodVersions, DriveAbciMasternodeIdentitiesUpdatesMethodVersions, DriveAbciMethodVersions, @@ -498,6 +499,14 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { core_subsidy: DriveAbciCoreSubsidyMethodVersions { epoch_core_reward_credits_for_distribution: 0, }, + core_chain_lock: DriveAbciCoreChainLockMethodVersionsAndConstants { + choose_quorum: 0, + verify_chain_lock: 0, + verify_chain_lock_locally: 0, + verify_chain_lock_through_core: 0, + make_sure_core_is_synced_to_chain_lock: 0, + recent_block_count_amount: 2, + }, fee_pool_inwards_distribution: DriveAbciFeePoolInwardsDistributionMethodVersions { add_distribute_block_fees_into_pools_operations: 0, add_distribute_storage_fee_to_epochs_operations: 0, diff --git a/packages/strategy-tests/src/frequency.rs b/packages/strategy-tests/src/frequency.rs index a846a27f31..8b46d8ec7f 100644 --- a/packages/strategy-tests/src/frequency.rs +++ b/packages/strategy-tests/src/frequency.rs @@ -64,6 +64,10 @@ impl Frequency { } } + pub fn max_event_count(&self) -> u16 { + self.times_per_block_range.end + } + pub fn pick_in_range(&self, rng: &mut impl Rng, range: Range) -> Vec { if !self.is_set() || range.is_empty() { return vec![]; diff --git a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs index b2e514a294..4dde494106 100644 --- a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs @@ -3,7 +3,6 @@ use crate::errors::consensus::basic::{ UnsupportedProtocolVersionErrorWasm, UnsupportedVersionErrorWasm, }; use dpp::consensus::ConsensusError as DPPConsensusError; -use std::ops::Deref; use crate::errors::consensus::basic::identity::{ DuplicatedIdentityPublicKeyErrorWasm, DuplicatedIdentityPublicKeyIdErrorWasm, diff --git a/scripts/configure_dotenv.sh b/scripts/configure_dotenv.sh index 2074b73ca3..f5f6fa4636 100755 --- a/scripts/configure_dotenv.sh +++ b/scripts/configure_dotenv.sh @@ -50,7 +50,7 @@ NETWORK=regtest" >>"${SDK_ENV_FILE_PATH}" #EOF # DRIVE: -cp "${DRIVE_PATH}"/.env.example "${DRIVE_PATH}"/.env +cp "${DRIVE_PATH}"/.env.local "${DRIVE_PATH}"/.env # WALLET-LIB: WALLET_LIB_ENV_FILE_PATH=${WALLET_LIB_PATH}/.env From 6b8df269b1d47d5b058d62f758fc9f7d729a374a Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Tue, 30 Jan 2024 10:33:14 +0300 Subject: [PATCH 023/191] chore: system data contracts versioning (#1676) --- Cargo.lock | 12 ++ .../bench-suite/benchmarks/basicValidation.js | 2 +- .../bench-suite/benchmarks/documents/dpns.js | 2 +- packages/dashpay-contract/Cargo.toml | 2 + .../schema/{ => v1}/dashpay.schema.json | 0 packages/dashpay-contract/src/error.rs | 17 +++ packages/dashpay-contract/src/lib.rs | 39 ++++--- packages/dashpay-contract/src/v1/mod.rs | 19 ++++ .../dashpay-contract/test/unit/schema.spec.js | 2 +- packages/data-contracts/Cargo.toml | 2 + packages/data-contracts/src/error.rs | 104 ++++++++++++++++++ packages/data-contracts/src/lib.rs | 40 ++++--- packages/dpns-contract/Cargo.toml | 2 + .../{ => v1}/dpns-contract-documents.json | 0 packages/dpns-contract/src/error.rs | 17 +++ packages/dpns-contract/src/lib.rs | 47 ++++---- packages/dpns-contract/src/v1/mod.rs | 25 +++++ .../test/unit/dpnsContract.spec.js | 2 +- packages/feature-flags-contract/Cargo.toml | 2 + .../{ => v1}/feature-flags-documents.json | 0 packages/feature-flags-contract/src/error.rs | 17 +++ packages/feature-flags-contract/src/lib.rs | 38 ++++--- packages/feature-flags-contract/src/v1/mod.rs | 18 +++ .../test/unit/featureFlagsContract.spec.js | 2 +- .../Cargo.toml | 2 + .../masternode-reward-shares-documents.json | 0 .../src/error.rs | 17 +++ .../src/lib.rs | 36 +++--- .../src/v1/mod.rs | 20 ++++ .../masternodeRewardSharesContract.spec.js | 2 +- packages/rs-dpp/src/data_contract/mod.rs | 2 +- .../src/document/extended_document/mod.rs | 23 ++-- .../mod.rs | 2 +- packages/rs-dpp/src/system_data_contracts.rs | 18 +-- .../fixtures/get_dashpay_contract_fixture.rs | 6 +- ...with_generalized_encryption_key_fixture.rs | 6 +- .../tests/fixtures/get_documents_fixture.rs | 2 +- .../tests/fixtures/get_dpns_data_contract.rs | 6 +- ...ternode_reward_shares_documents_fixture.rs | 15 ++- .../create_mn_shares_contract/mod.rs | 8 +- .../v0/mod.rs | 14 ++- .../v0/mod.rs | 12 +- .../v0/mod.rs | 2 +- .../v0/mod.rs | 10 +- .../v0/mod.rs | 12 +- .../create_genesis_state/v0/mod.rs | 28 ++--- .../data_triggers/bindings/list/v0/mod.rs | 4 +- .../data_triggers/triggers/dashpay/v0/mod.rs | 3 +- .../data_triggers/triggers/dpns/v0/mod.rs | 5 +- .../triggers/feature_flags/v0/mod.rs | 3 +- .../triggers/reward_share/v0/mod.rs | 3 +- .../triggers/withdrawals/v0/mod.rs | 18 ++- packages/rs-drive-abci/src/main.rs | 2 +- .../src/platform_types/platform/mod.rs | 11 +- .../src/test/helpers/fee_pools.rs | 2 +- .../tests/strategy_tests/failures.rs | 37 ++++--- .../drive/batch/drive_op_batch/document.rs | 7 +- packages/rs-drive/src/drive/cache.rs | 6 + .../src/drive/cache/system_contracts_cache.rs | 36 ++++++ .../src/drive/contract/contract_fetch_info.rs | 7 +- packages/rs-drive/src/drive/defaults.rs | 2 +- .../rs-drive/src/drive/document/delete/mod.rs | 2 +- .../drive/identity/withdrawals/documents.rs | 22 ++-- packages/rs-drive/src/drive/mod.rs | 8 -- packages/rs-drive/src/drive/open/mod.rs | 25 ++++- .../fetch_current_protocol_version.rs | 11 +- .../src/drive/system_contracts_cache.rs | 36 ------ packages/rs-drive/src/query/mod.rs | 2 +- .../v0/transformer.rs | 2 +- packages/rs-drive/src/tests/helpers/setup.rs | 2 +- .../rs-drive/tests/deterministic_root_hash.rs | 5 +- .../src/version/contracts.rs | 10 ++ .../src/version/mocks/v2_test.rs | 8 ++ .../src/version/mocks/v3_test.rs | 8 ++ .../rs-platform-version/src/version/mod.rs | 1 + .../src/version/protocol_version.rs | 2 + .../rs-platform-version/src/version/v1.rs | 8 ++ packages/rs-sdk/tests/fetch/config.rs | 8 +- packages/strategy-tests/src/lib.rs | 5 +- packages/withdrawals-contract/Cargo.toml | 2 + .../{ => v1}/withdrawals-documents.json | 0 packages/withdrawals-contract/src/error.rs | 17 +++ packages/withdrawals-contract/src/lib.rs | 69 ++++++------ packages/withdrawals-contract/src/v1/mod.rs | 27 +++++ .../test/unit/withdrawalsContract.spec.js | 2 +- 85 files changed, 756 insertions(+), 326 deletions(-) rename packages/dashpay-contract/schema/{ => v1}/dashpay.schema.json (100%) create mode 100644 packages/dashpay-contract/src/error.rs create mode 100644 packages/dashpay-contract/src/v1/mod.rs create mode 100644 packages/data-contracts/src/error.rs rename packages/dpns-contract/schema/{ => v1}/dpns-contract-documents.json (100%) create mode 100644 packages/dpns-contract/src/error.rs create mode 100644 packages/dpns-contract/src/v1/mod.rs rename packages/feature-flags-contract/schema/{ => v1}/feature-flags-documents.json (100%) create mode 100644 packages/feature-flags-contract/src/error.rs create mode 100644 packages/feature-flags-contract/src/v1/mod.rs rename packages/masternode-reward-shares-contract/schema/{ => v1}/masternode-reward-shares-documents.json (100%) create mode 100644 packages/masternode-reward-shares-contract/src/error.rs create mode 100644 packages/masternode-reward-shares-contract/src/v1/mod.rs create mode 100644 packages/rs-drive/src/drive/cache/system_contracts_cache.rs delete mode 100644 packages/rs-drive/src/drive/system_contracts_cache.rs create mode 100644 packages/rs-platform-version/src/version/contracts.rs rename packages/withdrawals-contract/schema/{ => v1}/withdrawals-documents.json (100%) create mode 100644 packages/withdrawals-contract/src/error.rs create mode 100644 packages/withdrawals-contract/src/v1/mod.rs diff --git a/Cargo.lock b/Cargo.lock index fb03b94146..c7ff029c4a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1060,7 +1060,9 @@ name = "dashpay-contract" version = "1.0.0-dev.3" dependencies = [ "platform-value", + "platform-version", "serde_json", + "thiserror", ] [[package]] @@ -1072,7 +1074,9 @@ dependencies = [ "feature-flags-contract", "masternode-reward-shares-contract", "platform-value", + "platform-version", "serde_json", + "thiserror", "withdrawals-contract", ] @@ -1159,7 +1163,9 @@ name = "dpns-contract" version = "1.0.0-dev.3" dependencies = [ "platform-value", + "platform-version", "serde_json", + "thiserror", ] [[package]] @@ -1507,7 +1513,9 @@ name = "feature-flags-contract" version = "1.0.0-dev.3" dependencies = [ "platform-value", + "platform-version", "serde_json", + "thiserror", ] [[package]] @@ -2364,7 +2372,9 @@ name = "masternode-reward-shares-contract" version = "1.0.0-dev.3" dependencies = [ "platform-value", + "platform-version", "serde_json", + "thiserror", ] [[package]] @@ -5087,9 +5097,11 @@ version = "1.0.0-dev.3" dependencies = [ "num_enum", "platform-value", + "platform-version", "serde", "serde_json", "serde_repr", + "thiserror", ] [[package]] diff --git a/packages/bench-suite/benchmarks/basicValidation.js b/packages/bench-suite/benchmarks/basicValidation.js index cc1eb900d5..40c0944241 100644 --- a/packages/bench-suite/benchmarks/basicValidation.js +++ b/packages/bench-suite/benchmarks/basicValidation.js @@ -1,6 +1,6 @@ const { PrivateKey } = require('@dashevo/dashcore-lib'); -const dpnsDocumentTypes = require('@dashevo/dpns-contract/schema/dpns-contract-documents'); +const dpnsDocumentTypes = require('@dashevo/dpns-contract/schema/v1/dpns-contract-documents.json'); // const { DashPlatformProtocol, Identity, Identifier, default: loadWasmDpp } = require('@dashevo/wasm-dpp'); const generateRandomIdentifier = require('@dashevo/wasm-dpp/lib/test/utils/generateRandomIdentifierAsync'); diff --git a/packages/bench-suite/benchmarks/documents/dpns.js b/packages/bench-suite/benchmarks/documents/dpns.js index 605862943c..a1062007b1 100644 --- a/packages/bench-suite/benchmarks/documents/dpns.js +++ b/packages/bench-suite/benchmarks/documents/dpns.js @@ -1,6 +1,6 @@ const crypto = require('crypto'); -const dpnsDocumentTypes = require('@dashevo/dpns-contract/schema/dpns-contract-documents'); +const dpnsDocumentTypes = require('@dashevo/dpns-contract/schema/v1/dpns-contract-documents.json'); const generateRandomIdentifier = require('@dashevo/wasm-dpp/lib/test/utils/generateRandomIdentifierAsync'); diff --git a/packages/dashpay-contract/Cargo.toml b/packages/dashpay-contract/Cargo.toml index ea69f871c8..6a57b5a220 100644 --- a/packages/dashpay-contract/Cargo.toml +++ b/packages/dashpay-contract/Cargo.toml @@ -7,5 +7,7 @@ rust-version = "1.73" license = "MIT" [dependencies] +platform-version = { path = "../rs-platform-version" } +thiserror = "1.0.56" serde_json = { version = "1.0" } platform-value = { path = "../rs-platform-value" } diff --git a/packages/dashpay-contract/schema/dashpay.schema.json b/packages/dashpay-contract/schema/v1/dashpay.schema.json similarity index 100% rename from packages/dashpay-contract/schema/dashpay.schema.json rename to packages/dashpay-contract/schema/v1/dashpay.schema.json diff --git a/packages/dashpay-contract/src/error.rs b/packages/dashpay-contract/src/error.rs new file mode 100644 index 0000000000..d01bbcc91c --- /dev/null +++ b/packages/dashpay-contract/src/error.rs @@ -0,0 +1,17 @@ +use platform_version::version::FeatureVersion; + +#[derive(thiserror::Error, Debug)] +pub enum Error { + /// Platform expected some specific versions + #[error("platform unknown version on {method}, received: {received}")] + UnknownVersionMismatch { + /// method + method: String, + /// the allowed versions for this method + known_versions: Vec, + /// requested core height + received: FeatureVersion, + }, + #[error("schema deserialize error: {0}")] + InvalidSchemaJson(#[from] serde_json::Error), +} diff --git a/packages/dashpay-contract/src/lib.rs b/packages/dashpay-contract/src/lib.rs index 737eba57c6..8d443aeaa0 100644 --- a/packages/dashpay-contract/src/lib.rs +++ b/packages/dashpay-contract/src/lib.rs @@ -1,5 +1,9 @@ +mod error; +pub mod v1; + +pub use crate::error::Error; use platform_value::{Identifier, IdentifierBytes32}; -use serde_json::Error; +use platform_version::version::PlatformVersion; use serde_json::Value; pub const ID_BYTES: [u8; 32] = [ @@ -12,21 +16,26 @@ pub const OWNER_ID_BYTES: [u8; 32] = [ 215, 90, 101, 229, 15, 115, 5, 44, 117, 182, 217, ]; -pub mod document_types { - pub mod contact_request { - pub const NAME: &str = "contactRequest"; - - pub mod properties { - pub const TO_USER_ID: &str = "toUserId"; - pub const CORE_HEIGHT_CREATED_AT: &str = "coreHeightCreatedAt"; - pub const CORE_CHAIN_LOCKED_HEIGHT: &str = "coreChainLockedHeight"; - } - } -} - pub const ID: Identifier = Identifier(IdentifierBytes32(ID_BYTES)); pub const OWNER_ID: Identifier = Identifier(IdentifierBytes32(OWNER_ID_BYTES)); -pub fn load_documents_schemas() -> Result { - serde_json::from_str(include_str!("../schema/dashpay.schema.json")) +pub fn load_definitions(platform_version: &PlatformVersion) -> Result, Error> { + match platform_version.system_data_contracts.dashpay { + 1 => Ok(None), + version => Err(Error::UnknownVersionMismatch { + method: "dashpay_contract::load_definitions".to_string(), + known_versions: vec![1], + received: version, + }), + } +} +pub fn load_documents_schemas(platform_version: &PlatformVersion) -> Result { + match platform_version.system_data_contracts.dashpay { + 1 => v1::load_documents_schemas(), + version => Err(Error::UnknownVersionMismatch { + method: "dashpay_contract::load_documents_schemas".to_string(), + known_versions: vec![1], + received: version, + }), + } } diff --git a/packages/dashpay-contract/src/v1/mod.rs b/packages/dashpay-contract/src/v1/mod.rs new file mode 100644 index 0000000000..051b0819ac --- /dev/null +++ b/packages/dashpay-contract/src/v1/mod.rs @@ -0,0 +1,19 @@ +use crate::error::Error; +use serde_json::Value; + +pub mod document_types { + pub mod contact_request { + pub const NAME: &str = "contactRequest"; + + pub mod properties { + pub const TO_USER_ID: &str = "toUserId"; + pub const CORE_HEIGHT_CREATED_AT: &str = "coreHeightCreatedAt"; + pub const CORE_CHAIN_LOCKED_HEIGHT: &str = "coreChainLockedHeight"; + } + } +} + +pub fn load_documents_schemas() -> Result { + serde_json::from_str(include_str!("../../schema/v1/dashpay.schema.json")) + .map_err(Error::InvalidSchemaJson) +} diff --git a/packages/dashpay-contract/test/unit/schema.spec.js b/packages/dashpay-contract/test/unit/schema.spec.js index a5407a94b1..1d7523d296 100644 --- a/packages/dashpay-contract/test/unit/schema.spec.js +++ b/packages/dashpay-contract/test/unit/schema.spec.js @@ -2,7 +2,7 @@ const { expect } = require('chai'); const crypto = require('crypto'); const { DashPlatformProtocol, JsonSchemaError } = require('@dashevo/wasm-dpp'); const generateRandomIdentifier = require('@dashevo/wasm-dpp/lib/test/utils/generateRandomIdentifierAsync'); -const schema = require('../../schema/dashpay.schema.json'); +const schema = require('../../schema/v1/dashpay.schema.json'); const whitepaperMasternodeText = 'Full nodes are servers running on a P2P network that allow peers to use them to receive updates about the events on the network. These nodes utilize significant amounts of traffic and other resources that incur a substantial cost. As a result, a steady decrease in the amount of these nodes has been observed for some time on the Bitcoin network and as a result, block propagation times have been upwards of 40 seconds. Many solutions have been proposed such as a new reward scheme by Microsoft Research and the Bitnodes incentive program'; const encoded32Chars = '4fafc98bbfe597f7ba2c9f767d52036d'; diff --git a/packages/data-contracts/Cargo.toml b/packages/data-contracts/Cargo.toml index 9ca1fc9250..ccf596d97b 100644 --- a/packages/data-contracts/Cargo.toml +++ b/packages/data-contracts/Cargo.toml @@ -7,6 +7,8 @@ rust-version = "1.73" license = "MIT" [dependencies] +thiserror = "1.0.56" +platform-version = { path = "../rs-platform-version" } serde_json = { version = "1.0" } withdrawals-contract = { path = "../withdrawals-contract" } masternode-reward-shares-contract = { path = "../masternode-reward-shares-contract" } diff --git a/packages/data-contracts/src/error.rs b/packages/data-contracts/src/error.rs new file mode 100644 index 0000000000..b9a5dd5d24 --- /dev/null +++ b/packages/data-contracts/src/error.rs @@ -0,0 +1,104 @@ +use platform_version::version::FeatureVersion; + +#[derive(thiserror::Error, Debug)] +pub enum Error { + /// Platform expected some specific versions + #[error("platform unknown version on {method}, received: {received}")] + UnknownVersionMismatch { + /// method + method: String, + /// the allowed versions for this method + known_versions: Vec, + /// requested core height + received: FeatureVersion, + }, + #[error("schema deserialize error: {0}")] + InvalidSchemaJson(#[from] serde_json::Error), +} + +impl From for Error { + fn from(e: withdrawals_contract::Error) -> Self { + match e { + withdrawals_contract::Error::UnknownVersionMismatch { + method, + known_versions, + received, + } => Error::UnknownVersionMismatch { + method, + known_versions, + received, + }, + withdrawals_contract::Error::InvalidSchemaJson(e) => Error::InvalidSchemaJson(e), + } + } +} + +impl From for Error { + fn from(e: dashpay_contract::Error) -> Self { + match e { + dashpay_contract::Error::UnknownVersionMismatch { + method, + known_versions, + received, + } => Error::UnknownVersionMismatch { + method, + known_versions, + received, + }, + dashpay_contract::Error::InvalidSchemaJson(e) => Error::InvalidSchemaJson(e), + } + } +} + +impl From for Error { + fn from(e: dpns_contract::Error) -> Self { + match e { + dpns_contract::Error::UnknownVersionMismatch { + method, + known_versions, + received, + } => Error::UnknownVersionMismatch { + method, + known_versions, + received, + }, + dpns_contract::Error::InvalidSchemaJson(e) => Error::InvalidSchemaJson(e), + } + } +} + +impl From for Error { + fn from(e: masternode_reward_shares_contract::Error) -> Self { + match e { + masternode_reward_shares_contract::Error::UnknownVersionMismatch { + method, + known_versions, + received, + } => Error::UnknownVersionMismatch { + method, + known_versions, + received, + }, + masternode_reward_shares_contract::Error::InvalidSchemaJson(e) => { + Error::InvalidSchemaJson(e) + } + } + } +} + +impl From for Error { + fn from(e: feature_flags_contract::Error) -> Self { + match e { + feature_flags_contract::Error::UnknownVersionMismatch { + method, + known_versions, + received, + } => Error::UnknownVersionMismatch { + method, + known_versions, + received, + }, + feature_flags_contract::Error::InvalidSchemaJson(e) => Error::InvalidSchemaJson(e), + } + } +} diff --git a/packages/data-contracts/src/lib.rs b/packages/data-contracts/src/lib.rs index 460233bb22..f6761d1eb8 100644 --- a/packages/data-contracts/src/lib.rs +++ b/packages/data-contracts/src/lib.rs @@ -1,14 +1,18 @@ -use serde_json::{Error, Value}; +mod error; +use serde_json::Value; + +use crate::error::Error; pub use dashpay_contract; pub use dpns_contract; pub use feature_flags_contract; pub use masternode_reward_shares_contract; use platform_value::Identifier; +use platform_version::version::PlatformVersion; pub use withdrawals_contract; #[repr(u8)] -#[derive(PartialEq, Eq, Clone, Copy, Debug, Ord, PartialOrd)] +#[derive(PartialEq, Eq, Clone, Copy, Debug, Ord, PartialOrd, Hash)] pub enum SystemDataContract { Withdrawals = 0, MasternodeRewards = 1, @@ -20,6 +24,7 @@ pub enum SystemDataContract { pub struct DataContractSource { pub id_bytes: [u8; 32], pub owner_id_bytes: [u8; 32], + pub version: u32, pub definitions: Option, pub document_schemas: Value, } @@ -36,37 +41,46 @@ impl SystemDataContract { Identifier::new(bytes) } /// Returns [DataContractSource] - pub fn source(self) -> Result { + pub fn source(self, platform_version: &PlatformVersion) -> Result { let data = match self { SystemDataContract::Withdrawals => DataContractSource { id_bytes: withdrawals_contract::ID_BYTES, owner_id_bytes: withdrawals_contract::OWNER_ID_BYTES, - definitions: None, - document_schemas: withdrawals_contract::load_documents_schemas()?, + version: platform_version.system_data_contracts.withdrawals as u32, + definitions: withdrawals_contract::load_definitions(platform_version)?, + document_schemas: withdrawals_contract::load_documents_schemas(platform_version)?, }, SystemDataContract::MasternodeRewards => DataContractSource { id_bytes: masternode_reward_shares_contract::ID_BYTES, owner_id_bytes: masternode_reward_shares_contract::OWNER_ID_BYTES, - definitions: None, - document_schemas: masternode_reward_shares_contract::load_documents_schemas()?, + version: platform_version + .system_data_contracts + .masternode_reward_shares as u32, + definitions: withdrawals_contract::load_definitions(platform_version)?, + document_schemas: masternode_reward_shares_contract::load_documents_schemas( + platform_version, + )?, }, SystemDataContract::FeatureFlags => DataContractSource { id_bytes: feature_flags_contract::ID_BYTES, owner_id_bytes: feature_flags_contract::OWNER_ID_BYTES, - definitions: None, - document_schemas: feature_flags_contract::load_documents_schemas()?, + version: platform_version.system_data_contracts.feature_flags as u32, + definitions: feature_flags_contract::load_definitions(platform_version)?, + document_schemas: feature_flags_contract::load_documents_schemas(platform_version)?, }, SystemDataContract::DPNS => DataContractSource { id_bytes: dpns_contract::ID_BYTES, owner_id_bytes: dpns_contract::OWNER_ID_BYTES, - definitions: None, - document_schemas: dpns_contract::load_documents_schemas()?, + version: platform_version.system_data_contracts.dpns as u32, + definitions: dpns_contract::load_definitions(platform_version)?, + document_schemas: dpns_contract::load_documents_schemas(platform_version)?, }, SystemDataContract::Dashpay => DataContractSource { id_bytes: dashpay_contract::ID_BYTES, owner_id_bytes: dashpay_contract::OWNER_ID_BYTES, - definitions: None, - document_schemas: dashpay_contract::load_documents_schemas()?, + version: platform_version.system_data_contracts.dashpay as u32, + definitions: dashpay_contract::load_definitions(platform_version)?, + document_schemas: dashpay_contract::load_documents_schemas(platform_version)?, }, }; diff --git a/packages/dpns-contract/Cargo.toml b/packages/dpns-contract/Cargo.toml index 4b1156421a..0ab6051c1e 100644 --- a/packages/dpns-contract/Cargo.toml +++ b/packages/dpns-contract/Cargo.toml @@ -7,5 +7,7 @@ rust-version = "1.73" license = "MIT" [dependencies] +thiserror = "1.0.56" +platform-version = { path = "../rs-platform-version" } serde_json = { version = "1.0" } platform-value = { path = "../rs-platform-value" } diff --git a/packages/dpns-contract/schema/dpns-contract-documents.json b/packages/dpns-contract/schema/v1/dpns-contract-documents.json similarity index 100% rename from packages/dpns-contract/schema/dpns-contract-documents.json rename to packages/dpns-contract/schema/v1/dpns-contract-documents.json diff --git a/packages/dpns-contract/src/error.rs b/packages/dpns-contract/src/error.rs new file mode 100644 index 0000000000..d01bbcc91c --- /dev/null +++ b/packages/dpns-contract/src/error.rs @@ -0,0 +1,17 @@ +use platform_version::version::FeatureVersion; + +#[derive(thiserror::Error, Debug)] +pub enum Error { + /// Platform expected some specific versions + #[error("platform unknown version on {method}, received: {received}")] + UnknownVersionMismatch { + /// method + method: String, + /// the allowed versions for this method + known_versions: Vec, + /// requested core height + received: FeatureVersion, + }, + #[error("schema deserialize error: {0}")] + InvalidSchemaJson(#[from] serde_json::Error), +} diff --git a/packages/dpns-contract/src/lib.rs b/packages/dpns-contract/src/lib.rs index 0321c3823c..6c379e9024 100644 --- a/packages/dpns-contract/src/lib.rs +++ b/packages/dpns-contract/src/lib.rs @@ -1,5 +1,10 @@ +mod error; +pub mod v1; + +pub use crate::error::Error; use platform_value::{Identifier, IdentifierBytes32}; -use serde_json::{Error, Value}; +use platform_version::version::PlatformVersion; +use serde_json::Value; pub const ID_BYTES: [u8; 32] = [ 230, 104, 198, 89, 175, 102, 174, 225, 231, 44, 24, 109, 222, 123, 91, 126, 10, 29, 113, 42, 9, @@ -11,27 +16,25 @@ pub const OWNER_ID_BYTES: [u8; 32] = [ 67, 4, 181, 246, 153, 65, 68, 40, 110, 253, 172, ]; -pub mod document_types { - pub mod domain { - pub const NAME: &str = "domain"; - - pub mod properties { - pub const LABEL: &str = "label"; - pub const NORMALIZED_LABEL: &str = "normalizedLabel"; - pub const PARENT_DOMAIN_NAME: &str = "parentDomainName"; - pub const NORMALIZED_PARENT_DOMAIN_NAME: &str = "normalizedParentDomainName"; - pub const PREORDER_SALT: &str = "preorderSalt"; - pub const ALLOW_SUBDOMAINS: &str = "subdomainRules.allowSubdomains"; - pub const RECORDS: &str = "records"; - pub const DASH_UNIQUE_IDENTITY_ID: &str = "dashUniqueIdentityId"; - pub const DASH_ALIAS_IDENTITY_ID: &str = "dashAliasIdentityId"; - } - } -} - pub const ID: Identifier = Identifier(IdentifierBytes32(ID_BYTES)); pub const OWNER_ID: Identifier = Identifier(IdentifierBytes32(OWNER_ID_BYTES)); - -pub fn load_documents_schemas() -> Result { - serde_json::from_str(include_str!("../schema/dpns-contract-documents.json")) +pub fn load_definitions(platform_version: &PlatformVersion) -> Result, Error> { + match platform_version.system_data_contracts.withdrawals { + 1 => Ok(None), + version => Err(Error::UnknownVersionMismatch { + method: "dpns_contract::load_definitions".to_string(), + known_versions: vec![1], + received: version, + }), + } +} +pub fn load_documents_schemas(platform_version: &PlatformVersion) -> Result { + match platform_version.system_data_contracts.withdrawals { + 1 => v1::load_documents_schemas(), + version => Err(Error::UnknownVersionMismatch { + method: "dpns_contract::load_documents_schemas".to_string(), + known_versions: vec![1], + received: version, + }), + } } diff --git a/packages/dpns-contract/src/v1/mod.rs b/packages/dpns-contract/src/v1/mod.rs new file mode 100644 index 0000000000..fb2117245e --- /dev/null +++ b/packages/dpns-contract/src/v1/mod.rs @@ -0,0 +1,25 @@ +use crate::Error; +use serde_json::Value; + +pub mod document_types { + pub mod domain { + pub const NAME: &str = "domain"; + + pub mod properties { + pub const LABEL: &str = "label"; + pub const NORMALIZED_LABEL: &str = "normalizedLabel"; + pub const PARENT_DOMAIN_NAME: &str = "parentDomainName"; + pub const NORMALIZED_PARENT_DOMAIN_NAME: &str = "normalizedParentDomainName"; + pub const PREORDER_SALT: &str = "preorderSalt"; + pub const ALLOW_SUBDOMAINS: &str = "subdomainRules.allowSubdomains"; + pub const RECORDS: &str = "records"; + pub const DASH_UNIQUE_IDENTITY_ID: &str = "dashUniqueIdentityId"; + pub const DASH_ALIAS_IDENTITY_ID: &str = "dashAliasIdentityId"; + } + } +} + +pub fn load_documents_schemas() -> Result { + serde_json::from_str(include_str!("../../schema/v1/dpns-contract-documents.json")) + .map_err(Error::InvalidSchemaJson) +} diff --git a/packages/dpns-contract/test/unit/dpnsContract.spec.js b/packages/dpns-contract/test/unit/dpnsContract.spec.js index 148d79f51c..e0b4c46f55 100644 --- a/packages/dpns-contract/test/unit/dpnsContract.spec.js +++ b/packages/dpns-contract/test/unit/dpnsContract.spec.js @@ -6,7 +6,7 @@ const { const generateRandomIdentifier = require('@dashevo/wasm-dpp/lib/test/utils/generateRandomIdentifierAsync'); const { expect } = require('chai'); -const dpnsContractDocumentsSchema = require('../../schema/dpns-contract-documents.json'); +const dpnsContractDocumentsSchema = require('../../schema/v1/dpns-contract-documents.json'); const expectJsonSchemaError = (validationResult, errorCount = 1) => { const errors = validationResult.getErrors(); diff --git a/packages/feature-flags-contract/Cargo.toml b/packages/feature-flags-contract/Cargo.toml index d7fc4fcabf..1114df3030 100644 --- a/packages/feature-flags-contract/Cargo.toml +++ b/packages/feature-flags-contract/Cargo.toml @@ -7,5 +7,7 @@ rust-version = "1.73" license = "MIT" [dependencies] +thiserror = "1.0.56" +platform-version = { path = "../rs-platform-version" } serde_json = { version = "1.0" } platform-value = { path = "../rs-platform-value" } diff --git a/packages/feature-flags-contract/schema/feature-flags-documents.json b/packages/feature-flags-contract/schema/v1/feature-flags-documents.json similarity index 100% rename from packages/feature-flags-contract/schema/feature-flags-documents.json rename to packages/feature-flags-contract/schema/v1/feature-flags-documents.json diff --git a/packages/feature-flags-contract/src/error.rs b/packages/feature-flags-contract/src/error.rs new file mode 100644 index 0000000000..d01bbcc91c --- /dev/null +++ b/packages/feature-flags-contract/src/error.rs @@ -0,0 +1,17 @@ +use platform_version::version::FeatureVersion; + +#[derive(thiserror::Error, Debug)] +pub enum Error { + /// Platform expected some specific versions + #[error("platform unknown version on {method}, received: {received}")] + UnknownVersionMismatch { + /// method + method: String, + /// the allowed versions for this method + known_versions: Vec, + /// requested core height + received: FeatureVersion, + }, + #[error("schema deserialize error: {0}")] + InvalidSchemaJson(#[from] serde_json::Error), +} diff --git a/packages/feature-flags-contract/src/lib.rs b/packages/feature-flags-contract/src/lib.rs index 50264845df..a509ebc2e0 100644 --- a/packages/feature-flags-contract/src/lib.rs +++ b/packages/feature-flags-contract/src/lib.rs @@ -1,5 +1,9 @@ +mod error; +pub mod v1; + +pub use crate::error::Error; use platform_value::{Identifier, IdentifierBytes32}; -use serde_json::Error; +use platform_version::version::PlatformVersion; use serde_json::Value; pub const ID_BYTES: [u8; 32] = [ @@ -12,20 +16,26 @@ pub const OWNER_ID_BYTES: [u8; 32] = [ 154, 191, 43, 51, 101, 131, 190, 89, 135, 167, 21, ]; -pub mod document_types { - pub mod update_consensus_params { - pub const NAME: &str = "updateConsensusParams"; - - pub mod properties { - pub const PROPERTY_BLOCK_HEIGHT: &str = "height"; - pub const PROPERTY_ENABLE_AT_HEIGHT: &str = "enableAtHeight"; - } - } -} - pub const ID: Identifier = Identifier(IdentifierBytes32(ID_BYTES)); pub const OWNER_ID: Identifier = Identifier(IdentifierBytes32(OWNER_ID_BYTES)); -pub fn load_documents_schemas() -> Result { - serde_json::from_str(include_str!("../schema/feature-flags-documents.json")) +pub fn load_definitions(platform_version: &PlatformVersion) -> Result, Error> { + match platform_version.system_data_contracts.withdrawals { + 1 => Ok(None), + version => Err(Error::UnknownVersionMismatch { + method: "feature_flags_contract::load_definitions".to_string(), + known_versions: vec![1], + received: version, + }), + } +} +pub fn load_documents_schemas(platform_version: &PlatformVersion) -> Result { + match platform_version.system_data_contracts.withdrawals { + 1 => v1::load_documents_schemas(), + version => Err(Error::UnknownVersionMismatch { + method: "feature_flags_contract::load_documents_schemas".to_string(), + known_versions: vec![1], + received: version, + }), + } } diff --git a/packages/feature-flags-contract/src/v1/mod.rs b/packages/feature-flags-contract/src/v1/mod.rs new file mode 100644 index 0000000000..43ccaf608a --- /dev/null +++ b/packages/feature-flags-contract/src/v1/mod.rs @@ -0,0 +1,18 @@ +use crate::error::Error; +use serde_json::Value; + +pub mod document_types { + pub mod update_consensus_params { + pub const NAME: &str = "updateConsensusParams"; + + pub mod properties { + pub const PROPERTY_BLOCK_HEIGHT: &str = "height"; + pub const PROPERTY_ENABLE_AT_HEIGHT: &str = "enableAtHeight"; + } + } +} + +pub fn load_documents_schemas() -> Result { + serde_json::from_str(include_str!("../../schema/v1/feature-flags-documents.json")) + .map_err(Error::InvalidSchemaJson) +} diff --git a/packages/feature-flags-contract/test/unit/featureFlagsContract.spec.js b/packages/feature-flags-contract/test/unit/featureFlagsContract.spec.js index f06deea8d4..217a5122b5 100644 --- a/packages/feature-flags-contract/test/unit/featureFlagsContract.spec.js +++ b/packages/feature-flags-contract/test/unit/featureFlagsContract.spec.js @@ -4,7 +4,7 @@ const generateRandomIdentifier = require('@dashevo/wasm-dpp/lib/test/utils/gener const { expect } = require('chai'); const crypto = require('crypto'); -const featureFlagsContractDocumentsSchema = require('../../schema/feature-flags-documents.json'); +const featureFlagsContractDocumentsSchema = require('../../schema/v1/feature-flags-documents.json'); const expectJsonSchemaError = (validationResult, errorCount = 1) => { const errors = validationResult.getErrors(); diff --git a/packages/masternode-reward-shares-contract/Cargo.toml b/packages/masternode-reward-shares-contract/Cargo.toml index 29a0bc1851..c2863a4a4e 100644 --- a/packages/masternode-reward-shares-contract/Cargo.toml +++ b/packages/masternode-reward-shares-contract/Cargo.toml @@ -7,5 +7,7 @@ rust-version = "1.73" license = "MIT" [dependencies] +thiserror = "1.0.56" +platform-version = { path = "../rs-platform-version" } serde_json = { version = "1.0" } platform-value = { path = "../rs-platform-value" } diff --git a/packages/masternode-reward-shares-contract/schema/masternode-reward-shares-documents.json b/packages/masternode-reward-shares-contract/schema/v1/masternode-reward-shares-documents.json similarity index 100% rename from packages/masternode-reward-shares-contract/schema/masternode-reward-shares-documents.json rename to packages/masternode-reward-shares-contract/schema/v1/masternode-reward-shares-documents.json diff --git a/packages/masternode-reward-shares-contract/src/error.rs b/packages/masternode-reward-shares-contract/src/error.rs new file mode 100644 index 0000000000..d01bbcc91c --- /dev/null +++ b/packages/masternode-reward-shares-contract/src/error.rs @@ -0,0 +1,17 @@ +use platform_version::version::FeatureVersion; + +#[derive(thiserror::Error, Debug)] +pub enum Error { + /// Platform expected some specific versions + #[error("platform unknown version on {method}, received: {received}")] + UnknownVersionMismatch { + /// method + method: String, + /// the allowed versions for this method + known_versions: Vec, + /// requested core height + received: FeatureVersion, + }, + #[error("schema deserialize error: {0}")] + InvalidSchemaJson(#[from] serde_json::Error), +} diff --git a/packages/masternode-reward-shares-contract/src/lib.rs b/packages/masternode-reward-shares-contract/src/lib.rs index 5d9a0fe400..124f0e6627 100644 --- a/packages/masternode-reward-shares-contract/src/lib.rs +++ b/packages/masternode-reward-shares-contract/src/lib.rs @@ -1,5 +1,9 @@ +mod error; +pub mod v1; + +pub use crate::error::Error; use platform_value::{Identifier, IdentifierBytes32}; -use serde_json::Error; +use platform_version::version::PlatformVersion; use serde_json::Value; pub const ID_BYTES: [u8; 32] = [ @@ -15,19 +19,23 @@ pub const OWNER_ID_BYTES: [u8; 32] = [ pub const ID: Identifier = Identifier(IdentifierBytes32(ID_BYTES)); pub const OWNER_ID: Identifier = Identifier(IdentifierBytes32(OWNER_ID_BYTES)); -pub mod document_types { - pub mod reward_share { - pub const NAME: &str = "rewardShare"; - - pub mod properties { - pub const PAY_TO_ID: &str = "payToId"; - pub const PERCENTAGE: &str = "percentage"; - } +pub fn load_definitions(platform_version: &PlatformVersion) -> Result, Error> { + match platform_version.system_data_contracts.withdrawals { + 0 => Ok(None), + version => Err(Error::UnknownVersionMismatch { + method: "masternode_reward_shares_contract::load_definitions".to_string(), + known_versions: vec![0], + received: version, + }), } } - -pub fn load_documents_schemas() -> Result { - serde_json::from_str(include_str!( - "../schema/masternode-reward-shares-documents.json" - )) +pub fn load_documents_schemas(platform_version: &PlatformVersion) -> Result { + match platform_version.system_data_contracts.withdrawals { + 1 => v1::load_documents_schemas(), + version => Err(Error::UnknownVersionMismatch { + method: "masternode_reward_shares_contract::load_documents_schemas".to_string(), + known_versions: vec![1], + received: version, + }), + } } diff --git a/packages/masternode-reward-shares-contract/src/v1/mod.rs b/packages/masternode-reward-shares-contract/src/v1/mod.rs new file mode 100644 index 0000000000..0af222aa0b --- /dev/null +++ b/packages/masternode-reward-shares-contract/src/v1/mod.rs @@ -0,0 +1,20 @@ +use crate::error::Error; +use serde_json::Value; + +pub mod document_types { + pub mod reward_share { + pub const NAME: &str = "rewardShare"; + + pub mod properties { + pub const PAY_TO_ID: &str = "payToId"; + pub const PERCENTAGE: &str = "percentage"; + } + } +} + +pub(super) fn load_documents_schemas() -> Result { + serde_json::from_str(include_str!( + "../../schema/v1/masternode-reward-shares-documents.json" + )) + .map_err(Error::InvalidSchemaJson) +} diff --git a/packages/masternode-reward-shares-contract/test/unit/masternodeRewardSharesContract.spec.js b/packages/masternode-reward-shares-contract/test/unit/masternodeRewardSharesContract.spec.js index 704249bc68..adac76bbe9 100644 --- a/packages/masternode-reward-shares-contract/test/unit/masternodeRewardSharesContract.spec.js +++ b/packages/masternode-reward-shares-contract/test/unit/masternodeRewardSharesContract.spec.js @@ -4,7 +4,7 @@ const generateRandomIdentifier = require('@dashevo/wasm-dpp/lib/test/utils/gener const { expect } = require('chai'); const crypto = require('crypto'); -const rewardSharingContractSchema = require('../../schema/masternode-reward-shares-documents.json'); +const rewardSharingContractSchema = require('../../schema/v1/masternode-reward-shares-documents.json'); const expectJsonSchemaError = (validationResult, errorCount = 1) => { const errors = validationResult.getErrors(); diff --git a/packages/rs-dpp/src/data_contract/mod.rs b/packages/rs-dpp/src/data_contract/mod.rs index 83536ce7b4..d6572b53db 100644 --- a/packages/rs-dpp/src/data_contract/mod.rs +++ b/packages/rs-dpp/src/data_contract/mod.rs @@ -264,7 +264,7 @@ mod tests { #[test] fn test_contract_serialization() { let platform_version = PlatformVersion::latest(); - let data_contract = load_system_data_contract(Dashpay, platform_version.protocol_version) + let data_contract = load_system_data_contract(Dashpay, platform_version) .expect("expected dashpay contract"); let platform_version = PlatformVersion::latest(); let serialized = data_contract diff --git a/packages/rs-dpp/src/document/extended_document/mod.rs b/packages/rs-dpp/src/document/extended_document/mod.rs index fe16af6118..393430ac62 100644 --- a/packages/rs-dpp/src/document/extended_document/mod.rs +++ b/packages/rs-dpp/src/document/extended_document/mod.rs @@ -410,8 +410,7 @@ mod test { fn test_document_json_deserialize() -> Result<()> { init(); let platform_version = PlatformVersion::latest(); - let dpns_contract = - load_system_data_contract(SystemDataContract::DPNS, platform_version.protocol_version)?; + let dpns_contract = load_system_data_contract(SystemDataContract::DPNS, platform_version)?; let document_json = get_data_from_file("src/tests/payloads/document_dpns.json")?; let doc = ExtendedDocument::from_json_string(&document_json, dpns_contract, platform_version)?; @@ -489,11 +488,8 @@ mod test { #[test] fn test_to_object() { init(); - let dpns_contract = load_system_data_contract( - SystemDataContract::DPNS, - LATEST_PLATFORM_VERSION.protocol_version, - ) - .unwrap(); + let dpns_contract = + load_system_data_contract(SystemDataContract::DPNS, LATEST_PLATFORM_VERSION).unwrap(); let document_json = get_data_from_file("src/tests/payloads/document_dpns.json").unwrap(); let document = ExtendedDocument::from_json_string( &document_json, @@ -517,10 +513,8 @@ mod test { fn test_json_serialize() -> Result<()> { init(); - let dpns_contract = load_system_data_contract( - SystemDataContract::DPNS, - LATEST_PLATFORM_VERSION.protocol_version, - )?; + let dpns_contract = + load_system_data_contract(SystemDataContract::DPNS, LATEST_PLATFORM_VERSION)?; let document_json = get_data_from_file("src/tests/payloads/document_dpns.json")?; let document = ExtendedDocument::from_json_string( &document_json, @@ -542,11 +536,8 @@ mod test { init(); let document_json = get_data_from_file("src/tests/payloads/document_dpns.json")?; - let dpns_contract = load_system_data_contract( - SystemDataContract::DPNS, - LATEST_PLATFORM_VERSION.protocol_version, - ) - .unwrap(); + let dpns_contract = + load_system_data_contract(SystemDataContract::DPNS, LATEST_PLATFORM_VERSION).unwrap(); ExtendedDocument::from_json_string(&document_json, dpns_contract, LATEST_PLATFORM_VERSION) .expect("expected extended document"); Ok(()) diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/mod.rs index c7b052160e..87786d4a3e 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/mod.rs @@ -18,7 +18,7 @@ use crate::state_transition::StateTransitionFieldTypes; use crate::identity::state_transition::OptionallyAssetLockProved; use crate::ProtocolError; use bincode::{Decode, Encode}; -use data_contracts::withdrawals_contract::document_types::withdrawal::properties::OUTPUT_SCRIPT; +use data_contracts::withdrawals_contract::v1::document_types::withdrawal::properties::OUTPUT_SCRIPT; use derive_more::From; use fields::*; use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize, PlatformSignable}; diff --git a/packages/rs-dpp/src/system_data_contracts.rs b/packages/rs-dpp/src/system_data_contracts.rs index 7857cf112a..3007df8bc4 100644 --- a/packages/rs-dpp/src/system_data_contracts.rs +++ b/packages/rs-dpp/src/system_data_contracts.rs @@ -5,18 +5,21 @@ use std::collections::{BTreeMap, BTreeSet}; use crate::data_contract::accessors::v0::DataContractV0Setters; pub use data_contracts::*; +use platform_version::version::PlatformVersion; fn create_data_contract( factory: &DataContractFactory, system_contract: SystemDataContract, + platform_version: &PlatformVersion, ) -> Result { let DataContractSource { id_bytes, owner_id_bytes, + version, definitions, document_schemas, } = system_contract - .source() + .source(platform_version) .map_err(|e| ProtocolError::Generic(e.to_string()))?; let id = Identifier::from(id_bytes); @@ -30,29 +33,30 @@ fn create_data_contract( )?; data_contract.data_contract_mut().set_id(id); + data_contract.data_contract_mut().set_version(version); Ok(data_contract.data_contract_owned()) } pub fn load_system_data_contract( system_contract: SystemDataContract, - protocol_version: u32, + platform_version: &PlatformVersion, ) -> Result { - let factory = DataContractFactory::new(protocol_version, None)?; + let factory = DataContractFactory::new(platform_version.protocol_version, None)?; - create_data_contract(&factory, system_contract) + create_data_contract(&factory, system_contract, platform_version) } pub fn load_system_data_contracts( system_contracts: BTreeSet, - protocol_version: u32, + platform_version: &PlatformVersion, ) -> Result, ProtocolError> { - let factory = DataContractFactory::new(protocol_version, None)?; + let factory = DataContractFactory::new(platform_version.protocol_version, None)?; system_contracts .into_iter() .map(|system_contract| { - let data_contract = create_data_contract(&factory, system_contract)?; + let data_contract = create_data_contract(&factory, system_contract, platform_version)?; Ok((system_contract, data_contract)) }) diff --git a/packages/rs-dpp/src/tests/fixtures/get_dashpay_contract_fixture.rs b/packages/rs-dpp/src/tests/fixtures/get_dashpay_contract_fixture.rs index 078d486e86..8f0866fe09 100644 --- a/packages/rs-dpp/src/tests/fixtures/get_dashpay_contract_fixture.rs +++ b/packages/rs-dpp/src/tests/fixtures/get_dashpay_contract_fixture.rs @@ -5,6 +5,7 @@ use crate::{ use crate::data_contract::created_data_contract::CreatedDataContract; use data_contracts::SystemDataContract; +use platform_version::version::PlatformVersion; pub fn get_dashpay_contract_fixture( owner_id: Option, @@ -12,8 +13,11 @@ pub fn get_dashpay_contract_fixture( ) -> CreatedDataContract { let factory = DataContractFactory::new(protocol_version, None).expect("expected to create factory"); + + let platform_version = PlatformVersion::get(protocol_version).expect("expected to get version"); + let dpns_schema = SystemDataContract::Dashpay - .source() + .source(platform_version) .expect("DPNS contract must be defined") .document_schemas; let owner_id = owner_id.unwrap_or_else(generate_random_identifier_struct); diff --git a/packages/rs-dpp/src/tests/fixtures/get_dashpay_contract_with_generalized_encryption_key_fixture.rs b/packages/rs-dpp/src/tests/fixtures/get_dashpay_contract_with_generalized_encryption_key_fixture.rs index 61d3ac6173..9d58df2e70 100644 --- a/packages/rs-dpp/src/tests/fixtures/get_dashpay_contract_with_generalized_encryption_key_fixture.rs +++ b/packages/rs-dpp/src/tests/fixtures/get_dashpay_contract_with_generalized_encryption_key_fixture.rs @@ -7,6 +7,7 @@ use crate::data_contract::config::v0::DataContractConfigV0; use crate::data_contract::created_data_contract::CreatedDataContract; use crate::data_contract::storage_requirements::keys_for_document_type::StorageKeyRequirements; use data_contracts::SystemDataContract; +use platform_version::version::PlatformVersion; pub fn get_dashpay_contract_with_generalized_encryption_key_fixture( owner_id: Option, @@ -14,8 +15,11 @@ pub fn get_dashpay_contract_with_generalized_encryption_key_fixture( ) -> CreatedDataContract { let factory = DataContractFactory::new(protocol_version, None).expect("expected to create factory"); + + let platform_version = PlatformVersion::get(protocol_version).expect("expected to get version"); + let dpns_schema = SystemDataContract::Dashpay - .source() + .source(platform_version) .expect("DPNS contract must be defined") .document_schemas; let owner_id = owner_id.unwrap_or_else(generate_random_identifier_struct); diff --git a/packages/rs-dpp/src/tests/fixtures/get_documents_fixture.rs b/packages/rs-dpp/src/tests/fixtures/get_documents_fixture.rs index 8af470b148..ed44af2ffa 100644 --- a/packages/rs-dpp/src/tests/fixtures/get_documents_fixture.rs +++ b/packages/rs-dpp/src/tests/fixtures/get_documents_fixture.rs @@ -198,7 +198,7 @@ pub fn get_withdrawal_document_fixture( }; let document_type = data_contract.document_type_for_name( - data_contracts::withdrawals_contract::document_types::withdrawal::NAME, + data_contracts::withdrawals_contract::v1::document_types::withdrawal::NAME, )?; let properties = data diff --git a/packages/rs-dpp/src/tests/fixtures/get_dpns_data_contract.rs b/packages/rs-dpp/src/tests/fixtures/get_dpns_data_contract.rs index 46edce1660..77e1467973 100644 --- a/packages/rs-dpp/src/tests/fixtures/get_dpns_data_contract.rs +++ b/packages/rs-dpp/src/tests/fixtures/get_dpns_data_contract.rs @@ -1,4 +1,5 @@ use data_contracts::{DataContractSource, SystemDataContract}; +use platform_version::version::PlatformVersion; use crate::data_contract::created_data_contract::CreatedDataContract; use crate::data_contract::DataContractFactory; @@ -14,10 +15,13 @@ pub fn get_dpns_data_contract_fixture( let owner_id = owner_id.unwrap_or_else(generate_random_identifier_struct); + let platform_version = + PlatformVersion::get(protocol_version).expect("expected to get platform version"); + let DataContractSource { document_schemas, .. } = SystemDataContract::DPNS - .source() + .source(platform_version) .expect("should return DPNS data contract source"); //Todo create config diff --git a/packages/rs-dpp/src/tests/fixtures/get_masternode_reward_shares_documents_fixture.rs b/packages/rs-dpp/src/tests/fixtures/get_masternode_reward_shares_documents_fixture.rs index 66b50f6df1..b6f0ae7cef 100644 --- a/packages/rs-dpp/src/tests/fixtures/get_masternode_reward_shares_documents_fixture.rs +++ b/packages/rs-dpp/src/tests/fixtures/get_masternode_reward_shares_documents_fixture.rs @@ -8,14 +8,19 @@ use crate::{ }; use data_contracts::SystemDataContract; use platform_value::platform_value; +use platform_version::version::PlatformVersion; pub fn get_masternode_reward_shares_documents_fixture( protocol_version: u32, ) -> (Vec, DataContract) { let owner_id = generate_random_identifier_struct(); let pay_to_id = generate_random_identifier_struct(); + + let platform_version = + PlatformVersion::get(protocol_version).expect("expected to get platform version"); + let data_contract = - load_system_data_contract(SystemDataContract::MasternodeRewards, protocol_version) + load_system_data_contract(SystemDataContract::MasternodeRewards, platform_version) .expect("should load masternode rewards contract"); let factory = DocumentFactory::new(protocol_version).expect("expected to make factory"); @@ -37,7 +42,9 @@ pub fn get_masternode_reward_shares_documents_fixture( } pub fn get_masternode_reward_shares_data_contract_fixture(protocol_version: u32) -> DataContract { - load_system_data_contract(SystemDataContract::MasternodeRewards, protocol_version) + let platform_version = PlatformVersion::get(protocol_version).expect("expected to get version"); + + load_system_data_contract(SystemDataContract::MasternodeRewards, platform_version) .expect("should load masternode rewards contract") } @@ -45,10 +52,12 @@ pub fn get_masternode_reward_shares_data_contract_fixture(protocol_version: u32) pub fn get_masternode_reward_shares_extended_documents_fixture( protocol_version: u32, ) -> (Vec, DataContract) { + let platform_version = PlatformVersion::get(protocol_version).expect("expected to get version"); + let owner_id = generate_random_identifier_struct(); let pay_to_id = generate_random_identifier_struct(); let data_contract = - load_system_data_contract(SystemDataContract::MasternodeRewards, protocol_version) + load_system_data_contract(SystemDataContract::MasternodeRewards, platform_version) .expect("should load masternode rewards contract"); let factory = DocumentFactory::new(protocol_version).expect("expected to make factory"); diff --git a/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/create_mn_shares_contract/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/create_mn_shares_contract/mod.rs index 6dd0da0683..213b9ac0da 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/create_mn_shares_contract/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/create_mn_shares_contract/mod.rs @@ -20,11 +20,9 @@ impl Platform { transaction: TransactionArg, platform_version: &PlatformVersion, ) -> DataContract { - let contract = load_system_data_contract( - SystemDataContract::MasternodeRewards, - platform_version.protocol_version, - ) - .expect("should load masternode reward contract"); + let contract = + load_system_data_contract(SystemDataContract::MasternodeRewards, &platform_version) + .expect("should load masternode reward contract"); let storage_flags = Some(Cow::Owned(StorageFlags::SingleEpoch(0))); diff --git a/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/fetch_reward_shares_list_for_masternode/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/fetch_reward_shares_list_for_masternode/v0/mod.rs index 6f84e0799f..010c5e7f77 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/fetch_reward_shares_list_for_masternode/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/fetch_reward_shares_list_for_masternode/v0/mod.rs @@ -21,6 +21,7 @@ use dpp::version::PlatformVersion; use drive::drive::document::query::{QueryDocumentsOutcomeV0Methods}; use std::collections::BTreeMap; use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contracts::SystemDataContract; use crate::execution::platform_events::fee_pool_outwards_distribution::fetch_reward_shares_list_for_masternode::MN_REWARD_SHARES_DOCUMENT_TYPE; impl Platform { @@ -31,14 +32,15 @@ impl Platform { transaction: TransactionArg, platform_version: &PlatformVersion, ) -> Result, Error> { - let document_type = self - .drive - .system_contracts - .masternode_rewards - .document_type_for_name(MN_REWARD_SHARES_DOCUMENT_TYPE)?; + let cache = self.drive.cache.read().unwrap(); + + let masternode_rewards_contract = &cache.system_data_contracts.masternode_reward_shares; + + let document_type = + masternode_rewards_contract.document_type_for_name(MN_REWARD_SHARES_DOCUMENT_TYPE)?; let drive_query = DriveQuery { - contract: &self.drive.system_contracts.masternode_rewards, + contract: masternode_rewards_contract, document_type, internal_clauses: InternalClauses { primary_key_in_clause: None, diff --git a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/build_withdrawal_transactions_from_documents/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/build_withdrawal_transactions_from_documents/v0/mod.rs index 09b1c48c78..e69975245d 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/build_withdrawal_transactions_from_documents/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/build_withdrawal_transactions_from_documents/v0/mod.rs @@ -9,7 +9,7 @@ use dashcore_rpc::dashcore::{ }; use dpp::document::{Document, DocumentV0Getters}; use dpp::platform_value::btreemap_extensions::BTreeValueMapHelper; -use dpp::system_data_contracts::withdrawals_contract::document_types::withdrawal; +use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; use drive::dpp::identifier::Identifier; use drive::dpp::identity::convert_credits_to_duffs; @@ -125,7 +125,7 @@ mod tests { use dpp::block::block_info::BlockInfo; use dpp::data_contract::accessors::v0::DataContractV0Getters; - use dpp::data_contracts::withdrawals_contract::document_types::withdrawal; + use dpp::data_contracts::withdrawals_contract::v1::document_types::withdrawal; use dpp::identity::core_script::CoreScript; use dpp::platform_value::platform_value; use dpp::prelude::Identifier; @@ -148,11 +148,9 @@ mod tests { let transaction = platform.drive.grove.start_transaction(); - let data_contract = load_system_data_contract( - SystemDataContract::Withdrawals, - platform_version.protocol_version, - ) - .expect("to load system data contract"); + let data_contract = + load_system_data_contract(SystemDataContract::Withdrawals, &platform_version) + .expect("to load system data contract"); setup_system_data_contract(&platform.drive, &data_contract, Some(&transaction)); diff --git a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/fetch_and_prepare_unsigned_withdrawal_transactions/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/fetch_and_prepare_unsigned_withdrawal_transactions/v0/mod.rs index f388172b26..8a218da798 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/fetch_and_prepare_unsigned_withdrawal_transactions/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/fetch_and_prepare_unsigned_withdrawal_transactions/v0/mod.rs @@ -10,7 +10,7 @@ use dpp::document::{Document, DocumentV0Setters}; use dpp::version::PlatformVersion; use drive::dpp::system_data_contracts::withdrawals_contract; -use drive::dpp::system_data_contracts::withdrawals_contract::document_types::withdrawal; +use drive::dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; use drive::dpp::util::hash; diff --git a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/pool_withdrawals_into_transactions_queue/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/pool_withdrawals_into_transactions_queue/v0/mod.rs index 5e17d00ffc..5778cc00b9 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/pool_withdrawals_into_transactions_queue/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/pool_withdrawals_into_transactions_queue/v0/mod.rs @@ -10,7 +10,7 @@ use drive::drive::identity::withdrawals::WithdrawalTransactionIdAndBytes; use drive::grovedb::Transaction; use dpp::system_data_contracts::withdrawals_contract; -use dpp::system_data_contracts::withdrawals_contract::document_types::withdrawal; +use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; use crate::execution::types::block_execution_context::v0::BlockExecutionContextV0Getters; use crate::execution::types::block_execution_context::BlockExecutionContext; @@ -221,11 +221,9 @@ mod tests { .into(), ); - let data_contract = load_system_data_contract( - SystemDataContract::Withdrawals, - platform_version.protocol_version, - ) - .expect("to load system data contract"); + let data_contract = + load_system_data_contract(SystemDataContract::Withdrawals, &platform_version) + .expect("to load system data contract"); setup_system_data_contract(&platform.drive, &data_contract, Some(&transaction)); diff --git a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/update_broadcasted_withdrawal_transaction_statuses/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/update_broadcasted_withdrawal_transaction_statuses/v0/mod.rs index 5a8c4e13e1..83d3cec023 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/update_broadcasted_withdrawal_transaction_statuses/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/update_broadcasted_withdrawal_transaction_statuses/v0/mod.rs @@ -6,7 +6,7 @@ use dpp::document::document_methods::DocumentMethodsV0; use dpp::document::{Document, DocumentV0Getters, DocumentV0Setters}; use dpp::platform_value::btreemap_extensions::BTreeValueMapHelper; use dpp::system_data_contracts::withdrawals_contract; -use dpp::system_data_contracts::withdrawals_contract::document_types::withdrawal; +use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; use dpp::version::PlatformVersion; use std::collections::BTreeMap; @@ -220,7 +220,7 @@ mod tests { use dpp::document::DocumentV0Getters; use dpp::identity::core_script::CoreScript; use dpp::platform_value::platform_value; - use dpp::system_data_contracts::withdrawals_contract::document_types::withdrawal; + use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; use dpp::version::PlatformVersion; use dpp::withdrawal::Pooling; use dpp::{ @@ -358,11 +358,9 @@ mod tests { proposer_results: None, }; - let data_contract = load_system_data_contract( - SystemDataContract::Withdrawals, - platform_version.protocol_version, - ) - .expect("to load system data contract"); + let data_contract = + load_system_data_contract(SystemDataContract::Withdrawals, &platform_version) + .expect("to load system data contract"); setup_system_data_contract(&platform.drive, &data_contract, Some(&transaction)); diff --git a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs index ba2a1044d6..8c034f320a 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs @@ -44,7 +44,7 @@ use dpp::identity::identity_public_key::v0::IdentityPublicKeyV0; use dpp::identity::IdentityV0; use dpp::serialization::PlatformSerializableWithPlatformVersion; use dpp::version::PlatformVersion; -use drive::dpp::system_data_contracts::{load_system_data_contract, SystemDataContract}; +use drive::dpp::system_data_contracts::SystemDataContract; use drive::drive::batch::{ DataContractOperationType, DocumentOperationType, DriveOperation, IdentityOperationType, }; @@ -81,24 +81,22 @@ impl Platform { // Create system identities and contracts - let dpns_contract = - load_system_data_contract(SystemDataContract::DPNS, platform_version.protocol_version)?; + let cache = self.drive.cache.read().unwrap(); + + let dpns_data_contract = cache.system_data_contracts.dpns.clone(); let system_data_contract_types = BTreeMap::from_iter([ ( SystemDataContract::DPNS, ( - dpns_contract.clone(), + cache.system_data_contracts.dpns.clone(), system_identity_public_keys.dpns_contract_owner(), ), ), ( SystemDataContract::Withdrawals, ( - load_system_data_contract( - SystemDataContract::Withdrawals, - platform_version.protocol_version, - )?, + cache.system_data_contracts.withdrawals.clone(), system_identity_public_keys.withdrawals_contract_owner(), ), ), @@ -116,25 +114,21 @@ impl Platform { ( SystemDataContract::Dashpay, ( - load_system_data_contract( - SystemDataContract::Dashpay, - platform_version.protocol_version, - )?, + cache.system_data_contracts.dashpay.clone(), system_identity_public_keys.dashpay_contract_owner(), ), ), ( SystemDataContract::MasternodeRewards, ( - load_system_data_contract( - SystemDataContract::MasternodeRewards, - platform_version.protocol_version, - )?, + cache.system_data_contracts.masternode_reward_shares.clone(), system_identity_public_keys.masternode_reward_shares_contract_owner(), ), ), ]); + drop(cache); + for (_, (data_contract, identity_public_keys_set)) in system_data_contract_types { let public_keys = [ ( @@ -184,7 +178,7 @@ impl Platform { self.register_system_identity_operations(identity, &mut operations); } - self.register_dpns_top_level_domain_operations(&dpns_contract, &mut operations)?; + self.register_dpns_top_level_domain_operations(&dpns_data_contract, &mut operations)?; let block_info = BlockInfo::default_with_time(genesis_time); diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/bindings/list/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/bindings/list/v0/mod.rs index d4498a5424..954ce1f2ff 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/bindings/list/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/bindings/list/v0/mod.rs @@ -7,8 +7,8 @@ use crate::execution::validation::state_transition::documents_batch::data_trigge use crate::execution::validation::state_transition::documents_batch::data_triggers::bindings::data_trigger_binding::DataTriggerBindingV0; use dpp::errors::ProtocolError; -use dpp::system_data_contracts::feature_flags_contract::document_types::update_consensus_params; -use dpp::system_data_contracts::withdrawals_contract::document_types::withdrawal; +use dpp::system_data_contracts::feature_flags_contract::v1::document_types::update_consensus_params; +use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; use dpp::system_data_contracts::{dashpay_contract, dpns_contract, SystemDataContract}; use drive::state_transition_action::document::documents_batch::document_transition::DocumentTransitionActionType; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/v0/mod.rs index 61da179ca6..feab7c074c 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/v0/mod.rs @@ -10,7 +10,8 @@ use dpp::ProtocolError; use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; use drive::state_transition_action::document::documents_batch::document_transition::DocumentTransitionAction; use drive::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::DocumentCreateTransitionActionAccessorsV0; -use dpp::system_data_contracts::dashpay_contract::document_types::contact_request::properties::{CORE_HEIGHT_CREATED_AT, TO_USER_ID}; +use dpp::system_data_contracts::dashpay_contract::v1::document_types::contact_request::properties +::{CORE_HEIGHT_CREATED_AT, TO_USER_ID}; use dpp::version::PlatformVersion; use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContextMethodsV0; use crate::execution::validation::state_transition::documents_batch::data_triggers::{DataTriggerExecutionContext, DataTriggerExecutionResult}; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs index c4a0ab9ae7..419f9b1c9f 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs @@ -1,6 +1,6 @@ use dpp::consensus::state::data_trigger::data_trigger_condition_error::DataTriggerConditionError; use dpp::data_contract::accessors::v0::DataContractV0Getters; -use dpp::data_contracts::dpns_contract::document_types::domain::properties::PARENT_DOMAIN_NAME; +use dpp::data_contracts::dpns_contract::v1::document_types::domain::properties::PARENT_DOMAIN_NAME; ///! The `dpns_triggers` module contains data triggers specific to the DPNS data contract. use dpp::util::hash::hash; use std::collections::BTreeMap; @@ -19,7 +19,8 @@ use drive::state_transition_action::document::documents_batch::document_transiti use drive::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::DocumentCreateTransitionActionAccessorsV0; use drive::state_transition_action::document::documents_batch::document_transition::DocumentTransitionAction; use dpp::system_data_contracts::dpns_contract; -use dpp::system_data_contracts::dpns_contract::document_types::domain::properties::{ALLOW_SUBDOMAINS, DASH_ALIAS_IDENTITY_ID, DASH_UNIQUE_IDENTITY_ID, LABEL, NORMALIZED_LABEL, NORMALIZED_PARENT_DOMAIN_NAME, PREORDER_SALT, RECORDS}; +use dpp::system_data_contracts::dpns_contract::v1::document_types::domain::properties::{ALLOW_SUBDOMAINS, + DASH_ALIAS_IDENTITY_ID, DASH_UNIQUE_IDENTITY_ID, LABEL, NORMALIZED_LABEL, NORMALIZED_PARENT_DOMAIN_NAME, PREORDER_SALT, RECORDS}; use dpp::util::strings::convert_to_homograph_safe_chars; use dpp::version::PlatformVersion; use drive::drive::document::query::QueryDocumentsOutcomeV0Methods; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/feature_flags/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/feature_flags/v0/mod.rs index 6300fdcc57..5d559cab7d 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/feature_flags/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/feature_flags/v0/mod.rs @@ -10,7 +10,8 @@ use drive::state_transition_action::document::documents_batch::document_transiti use drive::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::DocumentCreateTransitionActionAccessorsV0; use drive::state_transition_action::document::documents_batch::document_transition::DocumentTransitionAction; use dpp::system_data_contracts::feature_flags_contract; -use dpp::system_data_contracts::feature_flags_contract::document_types::update_consensus_params::properties::PROPERTY_ENABLE_AT_HEIGHT; +use dpp::system_data_contracts::feature_flags_contract::v1::document_types::update_consensus_params::properties +::PROPERTY_ENABLE_AT_HEIGHT; use dpp::version::PlatformVersion; use super::{DataTriggerExecutionContext, DataTriggerExecutionResult}; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/reward_share/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/reward_share/v0/mod.rs index 78c48f1e90..5fd7a63aa7 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/reward_share/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/reward_share/v0/mod.rs @@ -12,7 +12,8 @@ use dpp::document::DocumentV0Getters; use dpp::ProtocolError; use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; use drive::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::DocumentCreateTransitionActionAccessorsV0; -use dpp::system_data_contracts::masternode_reward_shares_contract::document_types::reward_share::properties::{PAY_TO_ID, PERCENTAGE}; +use dpp::system_data_contracts::masternode_reward_shares_contract::v1::document_types::reward_share::properties +::{PAY_TO_ID, PERCENTAGE}; use drive::drive::document::query::QueryDocumentsOutcomeV0Methods; use crate::error::execution::ExecutionError; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs index 466f0154fd..3e6e7937a7 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs @@ -15,7 +15,7 @@ use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::document::DocumentV0Getters; use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; use drive::state_transition_action::document::documents_batch::document_transition::document_delete_transition_action::v0::DocumentDeleteTransitionActionAccessorsV0; -use dpp::system_data_contracts::withdrawals_contract::document_types::withdrawal; +use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; use drive::drive::document::query::QueryDocumentsOutcomeV0Methods; use crate::execution::validation::state_transition::documents_batch::data_triggers::{DataTriggerExecutionContext, DataTriggerExecutionResult}; @@ -202,11 +202,9 @@ mod tests { fn can_serialize_and_deserialize_withdrawal() { let platform_version = PlatformVersion::first(); - let data_contract = load_system_data_contract( - SystemDataContract::Withdrawals, - platform_version.protocol_version, - ) - .expect("to load system data contract"); + let data_contract = + load_system_data_contract(SystemDataContract::Withdrawals, &platform_version) + .expect("to load system data contract"); let owner_id = data_contract.owner_id(); let document_type = data_contract @@ -257,11 +255,9 @@ mod tests { .current_platform_version() .expect("should return a platform version"); - let data_contract = load_system_data_contract( - SystemDataContract::Withdrawals, - platform_version.protocol_version, - ) - .expect("to load system data contract"); + let data_contract = + load_system_data_contract(SystemDataContract::Withdrawals, &platform_version) + .expect("to load system data contract"); let owner_id = data_contract.owner_id(); let document_type = data_contract diff --git a/packages/rs-drive-abci/src/main.rs b/packages/rs-drive-abci/src/main.rs index dec4bc0a6e..40c71f7e4c 100644 --- a/packages/rs-drive-abci/src/main.rs +++ b/packages/rs-drive-abci/src/main.rs @@ -372,7 +372,7 @@ mod test { let path = tempdir.join("db"); fs::create_dir(&path).expect("create db dir"); - let drive = Drive::open(&path, None).expect("open drive"); + let (drive, _) = Drive::open(&path, None).expect("open drive"); let platform_version = PlatformVersion::latest(); diff --git a/packages/rs-drive-abci/src/platform_types/platform/mod.rs b/packages/rs-drive-abci/src/platform_types/platform/mod.rs index 54c9f8cea4..4ab7ecfe28 100644 --- a/packages/rs-drive-abci/src/platform_types/platform/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/platform/mod.rs @@ -7,7 +7,7 @@ use std::fmt::{Debug, Formatter}; #[cfg(any(feature = "mocks", test))] use crate::rpc::core::MockCoreRPCLike; -use drive::drive::defaults::PROTOCOL_VERSION; +use drive::drive::defaults::INITIAL_PROTOCOL_VERSION; use std::path::Path; use std::str::FromStr; use std::sync::RwLock; @@ -176,9 +176,10 @@ impl Platform { { let config = config.unwrap_or(PlatformConfig::default_testnet()); - let drive = Drive::open(path, Some(config.drive.clone())).map_err(Error::Drive)?; + let (drive, current_protocol_version) = + Drive::open(path, Some(config.drive.clone())).map_err(Error::Drive)?; - if let Some(protocol_version) = drive.fetch_current_protocol_version(None)? { + if let Some(protocol_version) = current_protocol_version { let platform_version = PlatformVersion::get(protocol_version)?; let Some(execution_state) = @@ -201,8 +202,8 @@ impl Platform { drive, core_rpc, config, - PROTOCOL_VERSION, - PROTOCOL_VERSION, + INITIAL_PROTOCOL_VERSION, + INITIAL_PROTOCOL_VERSION, ) } diff --git a/packages/rs-drive-abci/src/test/helpers/fee_pools.rs b/packages/rs-drive-abci/src/test/helpers/fee_pools.rs index ea323d94c8..d54805b332 100644 --- a/packages/rs-drive-abci/src/test/helpers/fee_pools.rs +++ b/packages/rs-drive-abci/src/test/helpers/fee_pools.rs @@ -47,7 +47,7 @@ use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::DataContract; use dpp::document::{DocumentV0, INITIAL_REVISION}; use dpp::identity::accessors::IdentityGettersV0; -use dpp::system_data_contracts::masternode_reward_shares_contract::document_types; +use dpp::system_data_contracts::masternode_reward_shares_contract::v1::document_types; use dpp::version::PlatformVersion; use drive::common::identities::create_test_identity_with_rng; use drive::dpp::document::Document; diff --git a/packages/rs-drive-abci/tests/strategy_tests/failures.rs b/packages/rs-drive-abci/tests/strategy_tests/failures.rs index 52fd3d1ef6..bf8df7f8a4 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/failures.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/failures.rs @@ -18,6 +18,7 @@ mod tests { use dpp::data_contract::document_type::random_document::{ DocumentFieldFillSize, DocumentFieldFillType, }; + use dpp::data_contracts::SystemDataContract; use dpp::identity::accessors::IdentityGettersV0; use dpp::platform_value::Value; use dpp::prelude::Identity; @@ -256,8 +257,24 @@ mod tests { platform_version, ); + let cache = platform + .drive + .cache + .read() + .expect("expected to get a read lock on the cache"); + + let dpns_contract = cache.system_data_contracts.dpns.clone(); + + drop(cache); + + let dpns_contract_for_type = dpns_contract.clone(); + + let domain_document_type_ref = dpns_contract_for_type + .document_type_for_name("domain") + .expect("expected a profile document type"); + let document_op_1 = DocumentOp { - contract: platform.drive.system_contracts.dpns_contract.clone(), + contract: dpns_contract.clone(), action: DocumentAction::DocumentActionInsertSpecific( BTreeMap::from([ ("label".into(), "simon1".into()), @@ -276,17 +293,11 @@ mod tests { DocumentFieldFillType::FillIfNotRequired, DocumentFieldFillSize::AnyDocumentFillSize, ), - document_type: platform - .drive - .system_contracts - .dpns_contract - .document_type_for_name("domain") - .expect("expected a profile document type") - .to_owned_document_type(), + document_type: domain_document_type_ref.to_owned_document_type(), }; let document_op_2 = DocumentOp { - contract: platform.drive.system_contracts.dpns_contract.clone(), + contract: dpns_contract, action: DocumentAction::DocumentActionInsertSpecific( BTreeMap::from([ ("label".into(), "simon1".into()), @@ -305,13 +316,7 @@ mod tests { DocumentFieldFillType::FillIfNotRequired, DocumentFieldFillSize::AnyDocumentFillSize, ), - document_type: platform - .drive - .system_contracts - .dpns_contract - .document_type_for_name("domain") - .expect("expected a profile document type") - .to_owned_document_type(), + document_type: domain_document_type_ref.to_owned_document_type(), }; let strategy = NetworkStrategy { diff --git a/packages/rs-drive/src/drive/batch/drive_op_batch/document.rs b/packages/rs-drive/src/drive/batch/drive_op_batch/document.rs index 4fd13a99cc..b5fc6a2772 100644 --- a/packages/rs-drive/src/drive/batch/drive_op_batch/document.rs +++ b/packages/rs-drive/src/drive/batch/drive_op_batch/document.rs @@ -14,8 +14,9 @@ use dpp::document::serialization_traits::DocumentPlatformConversionMethodsV0; use dpp::document::Document; use dpp::prelude::Identifier; -use dpp::system_data_contracts::withdrawals_contract::document_types::withdrawal; +use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; +use dpp::data_contracts::SystemDataContract; use dpp::version::PlatformVersion; use grovedb::batch::KeyInfoPath; use grovedb::{EstimatedLayerInformation, TransactionArg}; @@ -247,7 +248,9 @@ impl DriveLowLevelOperationConverter for DocumentOperationType<'_> { DocumentOperationType::AddWithdrawalDocument { owned_document_info, } => { - let contract = &drive.system_contracts.withdrawal_contract; + let cache = drive.cache.read().expect("should get cache lock"); + + let contract = &cache.system_data_contracts.withdrawals; let document_type = contract.document_type_for_name(withdrawal::NAME)?; diff --git a/packages/rs-drive/src/drive/cache.rs b/packages/rs-drive/src/drive/cache.rs index 8e15643bfb..6639008901 100644 --- a/packages/rs-drive/src/drive/cache.rs +++ b/packages/rs-drive/src/drive/cache.rs @@ -1,3 +1,4 @@ +pub use crate::drive::cache::system_contracts_cache::SystemDataContracts; #[cfg(any(feature = "full", feature = "verify"))] use crate::drive::contract::DataContractFetchInfo; use crate::drive::Drive; @@ -16,6 +17,9 @@ use platform_version::version::drive_versions::DriveVersion; #[cfg(any(feature = "full", feature = "verify"))] use std::sync::Arc; +#[cfg(feature = "full")] +mod system_contracts_cache; + /// Drive cache struct #[cfg(feature = "full")] pub struct DriveCache { @@ -25,6 +29,8 @@ pub struct DriveCache { pub genesis_time_ms: Option, /// Lazy loaded counter of votes to upgrade protocol version pub protocol_versions_counter: ProtocolVersionsCache, + /// Versioned system data contracts + pub system_data_contracts: SystemDataContracts, } /// ProtocolVersion cache that handles both global and block data diff --git a/packages/rs-drive/src/drive/cache/system_contracts_cache.rs b/packages/rs-drive/src/drive/cache/system_contracts_cache.rs new file mode 100644 index 0000000000..d9a4af3288 --- /dev/null +++ b/packages/rs-drive/src/drive/cache/system_contracts_cache.rs @@ -0,0 +1,36 @@ +use crate::error::Error; +use dpp::data_contract::DataContract; +use dpp::system_data_contracts::{load_system_data_contract, SystemDataContract}; +use platform_version::version::PlatformVersion; + +/// System contracts +pub struct SystemDataContracts { + /// Withdrawal contract + pub withdrawals: DataContract, + /// DPNS contract + pub dpns: DataContract, + /// Dashpay contract + pub dashpay: DataContract, + /// Masternode reward shares contract + pub masternode_reward_shares: DataContract, +} + +impl SystemDataContracts { + /// load genesis system contracts + pub fn load_genesis_system_contracts( + platform_version: &PlatformVersion, + ) -> Result { + Ok(Self { + withdrawals: load_system_data_contract( + SystemDataContract::Withdrawals, + platform_version, + )?, + dpns: load_system_data_contract(SystemDataContract::DPNS, platform_version)?, + dashpay: load_system_data_contract(SystemDataContract::Dashpay, platform_version)?, + masternode_reward_shares: load_system_data_contract( + SystemDataContract::MasternodeRewards, + platform_version, + )?, + }) + } +} diff --git a/packages/rs-drive/src/drive/contract/contract_fetch_info.rs b/packages/rs-drive/src/drive/contract/contract_fetch_info.rs index 3565b1ccc6..42d865b78f 100644 --- a/packages/rs-drive/src/drive/contract/contract_fetch_info.rs +++ b/packages/rs-drive/src/drive/contract/contract_fetch_info.rs @@ -10,6 +10,7 @@ use dpp::tests::fixtures::get_dpns_data_contract_fixture; #[cfg(feature = "fixtures-and-mocks")] use dpp::tests::fixtures::get_masternode_reward_shares_data_contract_fixture; use grovedb_costs::OperationCost; +use platform_version::version::PlatformVersion; #[cfg(any(feature = "full", feature = "verify"))] /// DataContract and fetch information @@ -65,11 +66,15 @@ impl DataContractFetchInfo { /// This should ONLY be used for tests pub fn withdrawals_contract_fixture(protocol_version: u32) -> Self { + let platform_version = + PlatformVersion::get(protocol_version).expect("expected to get version"); + let contract = load_system_data_contract( data_contracts::SystemDataContract::Withdrawals, - protocol_version, + platform_version, ) .expect("to load system data contract"); + DataContractFetchInfo { contract, storage_flags: None, diff --git a/packages/rs-drive/src/drive/defaults.rs b/packages/rs-drive/src/drive/defaults.rs index 3440843d64..8dc5e8385b 100644 --- a/packages/rs-drive/src/drive/defaults.rs +++ b/packages/rs-drive/src/drive/defaults.rs @@ -33,7 +33,7 @@ //! /// Protocol version -pub const PROTOCOL_VERSION: u32 = 1; +pub const INITIAL_PROTOCOL_VERSION: u32 = 1; ///DataContract Documents subtree path height pub const CONTRACT_DOCUMENTS_PATH_HEIGHT: u16 = 4; /// Base contract root path size diff --git a/packages/rs-drive/src/drive/document/delete/mod.rs b/packages/rs-drive/src/drive/document/delete/mod.rs index a43971fef0..8f88c41c9a 100644 --- a/packages/rs-drive/src/drive/document/delete/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/mod.rs @@ -119,7 +119,7 @@ mod tests { fn test_add_and_remove_family_one_document_no_transaction() { let tmp_dir = TempDir::new().unwrap(); - let drive: Drive = Drive::open(tmp_dir, None).expect("expected to open Drive successfully"); + let (drive, _) = Drive::open(tmp_dir, None).expect("expected to open Drive successfully"); let platform_version = PlatformVersion::latest(); diff --git a/packages/rs-drive/src/drive/identity/withdrawals/documents.rs b/packages/rs-drive/src/drive/identity/withdrawals/documents.rs index 52ffe87fa4..998e3c296f 100644 --- a/packages/rs-drive/src/drive/identity/withdrawals/documents.rs +++ b/packages/rs-drive/src/drive/identity/withdrawals/documents.rs @@ -5,7 +5,7 @@ use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::document::Document; use dpp::platform_value::Value; use dpp::system_data_contracts::withdrawals_contract; -use dpp::system_data_contracts::withdrawals_contract::document_types::withdrawal; +use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; use dpp::version::PlatformVersion; use grovedb::TransactionArg; use indexmap::IndexMap; @@ -193,7 +193,7 @@ mod tests { use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::identity::core_script::CoreScript; use dpp::platform_value::platform_value; - use dpp::system_data_contracts::withdrawals_contract::document_types::withdrawal; + use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; use dpp::system_data_contracts::{load_system_data_contract, SystemDataContract}; use dpp::version::PlatformVersion; use dpp::withdrawal::Pooling; @@ -206,11 +206,9 @@ mod tests { let platform_version = PlatformVersion::latest(); - let data_contract = load_system_data_contract( - SystemDataContract::Withdrawals, - platform_version.protocol_version, - ) - .expect("to load system data contract"); + let data_contract = + load_system_data_contract(SystemDataContract::Withdrawals, platform_version) + .expect("to load system data contract"); setup_system_data_contract(&drive, &data_contract, Some(&transaction)); @@ -305,7 +303,7 @@ mod tests { use dpp::document::DocumentV0Getters; use dpp::identity::core_script::CoreScript; use dpp::platform_value::{platform_value, Bytes32}; - use dpp::system_data_contracts::withdrawals_contract::document_types::withdrawal; + use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; use dpp::system_data_contracts::{load_system_data_contract, SystemDataContract}; use dpp::version::PlatformVersion; use dpp::withdrawal::Pooling; @@ -320,11 +318,9 @@ mod tests { let platform_version = PlatformVersion::latest(); - let data_contract = load_system_data_contract( - SystemDataContract::Withdrawals, - platform_version.protocol_version, - ) - .expect("to load system data contract"); + let data_contract = + load_system_data_contract(SystemDataContract::Withdrawals, platform_version) + .expect("to load system data contract"); setup_system_data_contract(&drive, &data_contract, Some(&transaction)); diff --git a/packages/rs-drive/src/drive/mod.rs b/packages/rs-drive/src/drive/mod.rs index d7fbda7eee..f89315e59e 100644 --- a/packages/rs-drive/src/drive/mod.rs +++ b/packages/rs-drive/src/drive/mod.rs @@ -96,8 +96,6 @@ mod operations; mod platform_state; #[cfg(feature = "full")] mod prove; -#[cfg(feature = "full")] -mod system_contracts_cache; /// Contains a set of useful grovedb proof verification functions #[cfg(any(feature = "full", feature = "verify"))] pub mod verify; @@ -105,9 +103,6 @@ pub mod verify; #[cfg(feature = "full")] use crate::drive::cache::DriveCache; -#[cfg(feature = "full")] -use crate::drive::system_contracts_cache::SystemContracts; - /// Drive struct #[cfg(any(feature = "full", feature = "verify"))] pub struct Drive { @@ -115,9 +110,6 @@ pub struct Drive { pub grove: GroveDb, /// Drive config pub config: DriveConfig, - /// Main contracts in the system - #[cfg(feature = "full")] - pub system_contracts: SystemContracts, /// Drive Cache #[cfg(feature = "full")] pub cache: RwLock, diff --git a/packages/rs-drive/src/drive/open/mod.rs b/packages/rs-drive/src/drive/open/mod.rs index 3c5cb66192..457b88f4e7 100644 --- a/packages/rs-drive/src/drive/open/mod.rs +++ b/packages/rs-drive/src/drive/open/mod.rs @@ -1,8 +1,11 @@ +use crate::drive::cache::SystemDataContracts; use crate::drive::cache::{DataContractCache, DriveCache, ProtocolVersionsCache}; use crate::drive::config::DriveConfig; -use crate::drive::system_contracts_cache::SystemContracts; +use crate::drive::defaults::INITIAL_PROTOCOL_VERSION; use crate::drive::Drive; use crate::error::Error; +use dpp::errors::ProtocolError; +use dpp::util::deserializer::ProtocolVersion; use grovedb::GroveDb; use platform_version::version::PlatformVersion; use std::path::Path; @@ -24,7 +27,10 @@ impl Drive { /// /// * `Result` - On success, returns `Ok(Self)`, where `Self` is a `Drive` instance. On error, returns an `Error`. /// - pub fn open>(path: P, config: Option) -> Result { + pub fn open>( + path: P, + config: Option, + ) -> Result<(Self, Option), Error> { match GroveDb::open(path) { Ok(grove) => { let config = config.unwrap_or_default(); @@ -32,12 +38,16 @@ impl Drive { let data_contracts_global_cache_size = config.data_contracts_global_cache_size; let data_contracts_block_cache_size = config.data_contracts_block_cache_size; + let protocol_version = + Drive::fetch_current_protocol_version_with_grovedb(&grove, None)?; + + let platform_version = + PlatformVersion::get(protocol_version.unwrap_or(INITIAL_PROTOCOL_VERSION)) + .map_err(ProtocolError::PlatformVersionError)?; + let drive = Drive { grove, config, - system_contracts: SystemContracts::load_genesis_system_contracts( - 1, // TODO: Will be fixed in #1676 - )?, cache: RwLock::new(DriveCache { cached_contracts: DataContractCache::new( data_contracts_global_cache_size, @@ -45,10 +55,13 @@ impl Drive { ), genesis_time_ms, protocol_versions_counter: ProtocolVersionsCache::new(), + system_data_contracts: SystemDataContracts::load_genesis_system_contracts( + platform_version, + )?, }), }; - Ok(drive) + Ok((drive, protocol_version)) } Err(e) => Err(Error::GroveDB(e)), } diff --git a/packages/rs-drive/src/drive/system/protocol_version/fetch_current_protocol_version.rs b/packages/rs-drive/src/drive/system/protocol_version/fetch_current_protocol_version.rs index 2a38de6766..fbd2e81b45 100644 --- a/packages/rs-drive/src/drive/system/protocol_version/fetch_current_protocol_version.rs +++ b/packages/rs-drive/src/drive/system/protocol_version/fetch_current_protocol_version.rs @@ -5,7 +5,7 @@ use crate::error::Error; use crate::drive::system::misc_path; use crate::drive::system::misc_tree_constants::PROTOCOL_VERSION_STORAGE_KEY; use dpp::util::deserializer::ProtocolVersion; -use grovedb::TransactionArg; +use grovedb::{GroveDb, TransactionArg}; use integer_encoding::VarInt; /// @@ -33,9 +33,16 @@ impl Drive { pub fn fetch_current_protocol_version( &self, transaction: TransactionArg, + ) -> Result, Error> { + Drive::fetch_current_protocol_version_with_grovedb(&self.grove, transaction) + } + + pub(crate) fn fetch_current_protocol_version_with_grovedb( + grove: &GroveDb, + transaction: TransactionArg, ) -> Result, Error> { let misc_path = misc_path(); - self.grove + grove .get_raw_optional( (&misc_path).into(), PROTOCOL_VERSION_STORAGE_KEY, diff --git a/packages/rs-drive/src/drive/system_contracts_cache.rs b/packages/rs-drive/src/drive/system_contracts_cache.rs deleted file mode 100644 index 71e9526244..0000000000 --- a/packages/rs-drive/src/drive/system_contracts_cache.rs +++ /dev/null @@ -1,36 +0,0 @@ -use crate::error::Error; -use dpp::data_contract::DataContract; -use dpp::system_data_contracts::{load_system_data_contract, SystemDataContract}; - -/// System contracts -pub struct SystemContracts { - /// Withdrawal contract - pub withdrawal_contract: DataContract, - /// DPNS contract - pub dpns_contract: DataContract, - /// Dashpay contract - pub dashpay_contract: DataContract, - /// Masternode reward shares contract - pub masternode_rewards: DataContract, -} - -impl SystemContracts { - /// load genesis system contracts - pub fn load_genesis_system_contracts(protocol_version: u32) -> Result { - Ok(SystemContracts { - withdrawal_contract: load_system_data_contract( - SystemDataContract::Withdrawals, - protocol_version, - )?, - dpns_contract: load_system_data_contract(SystemDataContract::DPNS, protocol_version)?, - dashpay_contract: load_system_data_contract( - SystemDataContract::Dashpay, - protocol_version, - )?, - masternode_rewards: load_system_data_contract( - SystemDataContract::MasternodeRewards, - protocol_version, - )?, - }) - } -} diff --git a/packages/rs-drive/src/query/mod.rs b/packages/rs-drive/src/query/mod.rs index 7217e72c10..0529cedbe3 100644 --- a/packages/rs-drive/src/query/mod.rs +++ b/packages/rs-drive/src/query/mod.rs @@ -1974,7 +1974,7 @@ mod tests { fn setup_family_contract() -> (Drive, DataContract) { let tmp_dir = TempDir::new().unwrap(); - let drive: Drive = Drive::open(tmp_dir, None).expect("expected to open Drive successfully"); + let (drive, _) = Drive::open(tmp_dir, None).expect("expected to open Drive successfully"); let platform_version = PlatformVersion::latest(); diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs index 0d3b41099d..9cebee4064 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs @@ -1,6 +1,6 @@ use crate::state_transition_action::identity::identity_credit_withdrawal::v0::IdentityCreditWithdrawalTransitionActionV0; use dpp::data_contracts::withdrawals_contract; -use dpp::data_contracts::withdrawals_contract::document_types::withdrawal; +use dpp::data_contracts::withdrawals_contract::v1::document_types::withdrawal; use dpp::document::{Document, DocumentV0}; use dpp::platform_value::platform_value; use dpp::state_transition::state_transitions::identity::identity_credit_withdrawal_transition::v0::IdentityCreditWithdrawalTransitionV0; diff --git a/packages/rs-drive/src/tests/helpers/setup.rs b/packages/rs-drive/src/tests/helpers/setup.rs index a62e55de43..7eaacc586f 100644 --- a/packages/rs-drive/src/tests/helpers/setup.rs +++ b/packages/rs-drive/src/tests/helpers/setup.rs @@ -65,7 +65,7 @@ impl Default for SetupFeePoolsOptions { pub fn setup_drive(drive_config: Option) -> Drive { let tmp_dir = TempDir::new().unwrap(); - let drive: Drive = Drive::open(tmp_dir, drive_config).expect("should open Drive successfully"); + let (drive, _) = Drive::open(tmp_dir, drive_config).expect("should open Drive successfully"); drive } diff --git a/packages/rs-drive/tests/deterministic_root_hash.rs b/packages/rs-drive/tests/deterministic_root_hash.rs index b0856635f7..0eb4c39d5f 100644 --- a/packages/rs-drive/tests/deterministic_root_hash.rs +++ b/packages/rs-drive/tests/deterministic_root_hash.rs @@ -426,9 +426,8 @@ fn test_root_hash_with_batches(drive: &Drive, db_transaction: &Transaction) { "e34e316e84c4639f44c512c5e602ee7d674d33ce69f02237de87af5f6151cdf6" ); - let dpns_contract = - load_system_data_contract(SystemDataContract::DPNS, platform_version.protocol_version) - .expect("should load dpns contract"); + let dpns_contract = load_system_data_contract(SystemDataContract::DPNS, platform_version) + .expect("should load dpns contract"); drive .apply_contract( diff --git a/packages/rs-platform-version/src/version/contracts.rs b/packages/rs-platform-version/src/version/contracts.rs new file mode 100644 index 0000000000..84c0d874b1 --- /dev/null +++ b/packages/rs-platform-version/src/version/contracts.rs @@ -0,0 +1,10 @@ +use crate::version::FeatureVersion; + +#[derive(Clone, Debug, Default)] +pub struct SystemDataContractVersions { + pub withdrawals: FeatureVersion, + pub dpns: FeatureVersion, + pub dashpay: FeatureVersion, + pub masternode_reward_shares: FeatureVersion, + pub feature_flags: FeatureVersion, +} diff --git a/packages/rs-platform-version/src/version/mocks/v2_test.rs b/packages/rs-platform-version/src/version/mocks/v2_test.rs index bef04b0d40..a9fb7d79d4 100644 --- a/packages/rs-platform-version/src/version/mocks/v2_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v2_test.rs @@ -1,3 +1,4 @@ +use crate::version::contracts::SystemDataContractVersions; use crate::version::dpp_versions::{ ContractVersions, CostVersions, DPPValidationVersions, DPPVersion, DataContractMethodVersions, DataContractValidationVersions, DocumentFeatureVersionBounds, DocumentMethodVersions, @@ -922,4 +923,11 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { }, }, }, + system_data_contracts: SystemDataContractVersions { + withdrawals: 1, + dpns: 1, + dashpay: 1, + masternode_reward_shares: 1, + feature_flags: 1, + }, }; diff --git a/packages/rs-platform-version/src/version/mocks/v3_test.rs b/packages/rs-platform-version/src/version/mocks/v3_test.rs index 19ed1497bb..432e417dbf 100644 --- a/packages/rs-platform-version/src/version/mocks/v3_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v3_test.rs @@ -1,3 +1,4 @@ +use crate::version::contracts::SystemDataContractVersions; use crate::version::dpp_versions::{ ContractVersions, CostVersions, DPPValidationVersions, DPPVersion, DataContractMethodVersions, DataContractValidationVersions, DocumentFeatureVersionBounds, DocumentMethodVersions, @@ -922,4 +923,11 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { }, }, }, + system_data_contracts: SystemDataContractVersions { + withdrawals: 1, + dpns: 1, + dashpay: 1, + masternode_reward_shares: 1, + feature_flags: 1, + }, }; diff --git a/packages/rs-platform-version/src/version/mod.rs b/packages/rs-platform-version/src/version/mod.rs index 040c413e50..486f8db5ff 100644 --- a/packages/rs-platform-version/src/version/mod.rs +++ b/packages/rs-platform-version/src/version/mod.rs @@ -1,5 +1,6 @@ mod protocol_version; pub use protocol_version::*; +pub mod contracts; pub mod dpp_versions; pub mod drive_abci_versions; pub mod drive_versions; diff --git a/packages/rs-platform-version/src/version/protocol_version.rs b/packages/rs-platform-version/src/version/protocol_version.rs index e657748606..2b6763aee6 100644 --- a/packages/rs-platform-version/src/version/protocol_version.rs +++ b/packages/rs-platform-version/src/version/protocol_version.rs @@ -1,4 +1,5 @@ use crate::error::PlatformVersionError; +use crate::version::contracts::SystemDataContractVersions; use crate::version::dpp_versions::DPPVersion; use crate::version::drive_abci_versions::DriveAbciVersion; use crate::version::drive_versions::DriveVersion; @@ -48,6 +49,7 @@ pub struct PlatformVersion { pub drive_abci: DriveAbciVersion, pub abci_structure: AbciStructureVersion, pub platform_architecture: PlatformArchitectureVersion, + pub system_data_contracts: SystemDataContractVersions, } pub const PLATFORM_VERSIONS: &[PlatformVersion] = &[PLATFORM_V1]; diff --git a/packages/rs-platform-version/src/version/v1.rs b/packages/rs-platform-version/src/version/v1.rs index e7122638dc..758332ee62 100644 --- a/packages/rs-platform-version/src/version/v1.rs +++ b/packages/rs-platform-version/src/version/v1.rs @@ -1,3 +1,4 @@ +use crate::version::contracts::SystemDataContractVersions; use crate::version::dpp_versions::{ ContractVersions, CostVersions, DPPValidationVersions, DPPVersion, DataContractMethodVersions, DataContractValidationVersions, DocumentFeatureVersionBounds, DocumentMethodVersions, @@ -919,4 +920,11 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { }, }, }, + system_data_contracts: SystemDataContractVersions { + withdrawals: 1, + dpns: 1, + dashpay: 1, + masternode_reward_shares: 1, + feature_flags: 1, + }, }; diff --git a/packages/rs-sdk/tests/fetch/config.rs b/packages/rs-sdk/tests/fetch/config.rs index 6dd9010f5c..cc4d7e956e 100644 --- a/packages/rs-sdk/tests/fetch/config.rs +++ b/packages/rs-sdk/tests/fetch/config.rs @@ -168,15 +168,11 @@ impl Config { } fn default_identity_id() -> Identifier { - data_contracts::SystemDataContract::DPNS - .source() - .expect("data contract source") - .owner_id_bytes - .into() + data_contracts::dpns_contract::OWNER_ID_BYTES.into() } fn default_data_contract_id() -> Identifier { - data_contracts::SystemDataContract::DPNS.id() + data_contracts::dpns_contract::ID_BYTES.into() } fn default_document_type_name() -> String { diff --git a/packages/strategy-tests/src/lib.rs b/packages/strategy-tests/src/lib.rs index d6deff5afa..d48daf02d6 100644 --- a/packages/strategy-tests/src/lib.rs +++ b/packages/strategy-tests/src/lib.rs @@ -1191,9 +1191,8 @@ mod tests { platform_version, ); - let dpns_contract = - load_system_data_contract(SystemDataContract::DPNS, platform_version.protocol_version) - .expect("data contract"); + let dpns_contract = load_system_data_contract(SystemDataContract::DPNS, platform_version) + .expect("data contract"); let document_op_1 = DocumentOp { contract: dpns_contract.clone(), diff --git a/packages/withdrawals-contract/Cargo.toml b/packages/withdrawals-contract/Cargo.toml index c0e4c43fa9..61d4b0dae5 100644 --- a/packages/withdrawals-contract/Cargo.toml +++ b/packages/withdrawals-contract/Cargo.toml @@ -7,6 +7,8 @@ rust-version = "1.73" license = "MIT" [dependencies] +thiserror = "1.0.56" +platform-version = { path = "../rs-platform-version" } platform-value = { path = "../rs-platform-value" } num_enum = "0.5.7" serde = { version = "1.0.152", features = ["derive"] } diff --git a/packages/withdrawals-contract/schema/withdrawals-documents.json b/packages/withdrawals-contract/schema/v1/withdrawals-documents.json similarity index 100% rename from packages/withdrawals-contract/schema/withdrawals-documents.json rename to packages/withdrawals-contract/schema/v1/withdrawals-documents.json diff --git a/packages/withdrawals-contract/src/error.rs b/packages/withdrawals-contract/src/error.rs new file mode 100644 index 0000000000..d01bbcc91c --- /dev/null +++ b/packages/withdrawals-contract/src/error.rs @@ -0,0 +1,17 @@ +use platform_version::version::FeatureVersion; + +#[derive(thiserror::Error, Debug)] +pub enum Error { + /// Platform expected some specific versions + #[error("platform unknown version on {method}, received: {received}")] + UnknownVersionMismatch { + /// method + method: String, + /// the allowed versions for this method + known_versions: Vec, + /// requested core height + received: FeatureVersion, + }, + #[error("schema deserialize error: {0}")] + InvalidSchemaJson(#[from] serde_json::Error), +} diff --git a/packages/withdrawals-contract/src/lib.rs b/packages/withdrawals-contract/src/lib.rs index f041acc820..acb8703c54 100644 --- a/packages/withdrawals-contract/src/lib.rs +++ b/packages/withdrawals-contract/src/lib.rs @@ -1,28 +1,25 @@ +pub use crate::error::Error; use num_enum::{IntoPrimitive, TryFromPrimitive}; use platform_value::{Identifier, IdentifierBytes32}; -use serde_json::Error; +use platform_version::version::PlatformVersion; use serde_json::Value; use serde_repr::{Deserialize_repr, Serialize_repr}; -pub mod document_types { - pub mod withdrawal { - pub const NAME: &str = "withdrawal"; +mod error; +pub mod v1; - pub mod properties { - pub const TRANSACTION_ID: &str = "transactionId"; - pub const TRANSACTION_SIGN_HEIGHT: &str = "transactionSignHeight"; - pub const TRANSACTION_INDEX: &str = "transactionIndex"; - pub const AMOUNT: &str = "amount"; - pub const CORE_FEE_PER_BYTE: &str = "coreFeePerByte"; - pub const POOLING: &str = "pooling"; - pub const OUTPUT_SCRIPT: &str = "outputScript"; - pub const STATUS: &str = "status"; - pub const CREATED_AT: &str = "$createdAt"; - pub const UPDATED_AT: &str = "$updatedAt"; - pub const OWNER_ID: &str = "$ownerId"; - } - } -} +pub const ID_BYTES: [u8; 32] = [ + 54, 98, 187, 97, 225, 127, 174, 62, 162, 148, 207, 96, 49, 151, 251, 10, 171, 109, 81, 24, 11, + 216, 182, 16, 76, 73, 68, 166, 47, 226, 217, 127, +]; + +pub const OWNER_ID_BYTES: [u8; 32] = [ + 170, 138, 235, 213, 173, 122, 202, 36, 243, 48, 61, 185, 146, 50, 146, 255, 194, 133, 221, 176, + 188, 82, 144, 69, 234, 198, 106, 35, 245, 167, 46, 192, +]; + +pub const ID: Identifier = Identifier(IdentifierBytes32(ID_BYTES)); +pub const OWNER_ID: Identifier = Identifier(IdentifierBytes32(OWNER_ID_BYTES)); // @append_only #[repr(u8)] @@ -45,19 +42,23 @@ pub enum WithdrawalStatus { EXPIRED = 4, } -pub const ID_BYTES: [u8; 32] = [ - 54, 98, 187, 97, 225, 127, 174, 62, 162, 148, 207, 96, 49, 151, 251, 10, 171, 109, 81, 24, 11, - 216, 182, 16, 76, 73, 68, 166, 47, 226, 217, 127, -]; - -pub const OWNER_ID_BYTES: [u8; 32] = [ - 170, 138, 235, 213, 173, 122, 202, 36, 243, 48, 61, 185, 146, 50, 146, 255, 194, 133, 221, 176, - 188, 82, 144, 69, 234, 198, 106, 35, 245, 167, 46, 192, -]; - -pub const ID: Identifier = Identifier(IdentifierBytes32(ID_BYTES)); -pub const OWNER_ID: Identifier = Identifier(IdentifierBytes32(OWNER_ID_BYTES)); - -pub fn load_documents_schemas() -> Result { - serde_json::from_str(include_str!("../schema/withdrawals-documents.json")) +pub fn load_definitions(platform_version: &PlatformVersion) -> Result, Error> { + match platform_version.system_data_contracts.withdrawals { + 1 => Ok(None), + version => Err(Error::UnknownVersionMismatch { + method: "withdrawals_contract::load_definitions".to_string(), + known_versions: vec![1], + received: version, + }), + } +} +pub fn load_documents_schemas(platform_version: &PlatformVersion) -> Result { + match platform_version.system_data_contracts.withdrawals { + 1 => v1::load_documents_schemas(), + version => Err(Error::UnknownVersionMismatch { + method: "withdrawals_contract::load_documents_schemas".to_string(), + known_versions: vec![1], + received: version, + }), + } } diff --git a/packages/withdrawals-contract/src/v1/mod.rs b/packages/withdrawals-contract/src/v1/mod.rs new file mode 100644 index 0000000000..df86928bb1 --- /dev/null +++ b/packages/withdrawals-contract/src/v1/mod.rs @@ -0,0 +1,27 @@ +use crate::error::Error; +use serde_json::Value; + +pub mod document_types { + pub mod withdrawal { + pub const NAME: &str = "withdrawal"; + + pub mod properties { + pub const TRANSACTION_ID: &str = "transactionId"; + pub const TRANSACTION_SIGN_HEIGHT: &str = "transactionSignHeight"; + pub const TRANSACTION_INDEX: &str = "transactionIndex"; + pub const AMOUNT: &str = "amount"; + pub const CORE_FEE_PER_BYTE: &str = "coreFeePerByte"; + pub const POOLING: &str = "pooling"; + pub const OUTPUT_SCRIPT: &str = "outputScript"; + pub const STATUS: &str = "status"; + pub const CREATED_AT: &str = "$createdAt"; + pub const UPDATED_AT: &str = "$updatedAt"; + pub const OWNER_ID: &str = "$ownerId"; + } + } +} + +pub(super) fn load_documents_schemas() -> Result { + serde_json::from_str(include_str!("../../schema/v1/withdrawals-documents.json")) + .map_err(Error::InvalidSchemaJson) +} diff --git a/packages/withdrawals-contract/test/unit/withdrawalsContract.spec.js b/packages/withdrawals-contract/test/unit/withdrawalsContract.spec.js index 61c8c06451..7f1d638a0c 100644 --- a/packages/withdrawals-contract/test/unit/withdrawalsContract.spec.js +++ b/packages/withdrawals-contract/test/unit/withdrawalsContract.spec.js @@ -4,7 +4,7 @@ const generateRandomIdentifier = require('@dashevo/wasm-dpp/lib/test/utils/gener const { expect } = require('chai'); const crypto = require('crypto'); -const withdrawalContractDocumentsSchema = require('../../schema/withdrawals-documents.json'); +const withdrawalContractDocumentsSchema = require('../../schema/v1/withdrawals-documents.json'); const expectJsonSchemaError = (validationResult, errorCount = 1) => { const errors = validationResult.getErrors(); From 0e78075024f8b48e1914086ea76be2028bdf135d Mon Sep 17 00:00:00 2001 From: pshenmic Date: Thu, 1 Feb 2024 11:38:07 +0400 Subject: [PATCH 024/191] fix(dashmate): service status when tenderdash is syncing (#1682) --- .../dashmate/src/status/scopes/platform.js | 4 ++ .../test/unit/status/scopes/platform.spec.js | 66 +++++++++++++++++++ 2 files changed, 70 insertions(+) diff --git a/packages/dashmate/src/status/scopes/platform.js b/packages/dashmate/src/status/scopes/platform.js index 74d961e63c..ad640a3076 100644 --- a/packages/dashmate/src/status/scopes/platform.js +++ b/packages/dashmate/src/status/scopes/platform.js @@ -115,6 +115,10 @@ export default function getPlatformScopeFactory( const platformPeers = parseInt(tenderdashNetInfo.n_peers, 10); const { listening } = tenderdashNetInfo; + if (catchingUp) { + info.serviceStatus = ServiceStatusEnum.syncing; + } + info.version = version; info.listening = listening; info.latestBlockHeight = latestBlockHeight; diff --git a/packages/dashmate/test/unit/status/scopes/platform.spec.js b/packages/dashmate/test/unit/status/scopes/platform.spec.js index 59053d5ae9..985ff18fa3 100644 --- a/packages/dashmate/test/unit/status/scopes/platform.spec.js +++ b/packages/dashmate/test/unit/status/scopes/platform.spec.js @@ -126,6 +126,72 @@ describe('getPlatformScopeFactory', () => { expect(scope).to.deep.equal(expectedScope); }); + it('should return platform syncing when it is catching up', async () => { + mockDetermineDockerStatus.returns(DockerStatusEnum.running); + mockRpcClient.mnsync.withArgs('status').returns({ result: { IsSynced: true } }); + mockDockerCompose.isServiceRunning.returns(true); + mockDockerCompose.execCommand.returns({ exitCode: 0, out: '' }); + mockMNOWatchProvider.returns(Promise.resolve('OPEN')); + + const mockStatus = { + node_info: { + version: '0', + network: 'test', + moniker: 'test', + }, + sync_info: { + catching_up: true, + latest_app_hash: 'DEADBEEF', + latest_block_height: 1337, + latest_block_hash: 'DEADBEEF', + latest_block_time: 1337, + }, + }; + const mockNetInfo = { n_peers: 6, listening: true }; + + const expectedScope = { + coreIsSynced: true, + httpPort, + httpService, + p2pPort, + p2pService, + rpcService, + httpPortState: PortStateEnum.OPEN, + p2pPortState: PortStateEnum.OPEN, + tenderdash: { + httpPortState: PortStateEnum.OPEN, + p2pPortState: PortStateEnum.OPEN, + dockerStatus: DockerStatusEnum.running, + serviceStatus: ServiceStatusEnum.syncing, + version: '0', + listening: true, + catchingUp: true, + latestBlockHash: 'DEADBEEF', + latestBlockHeight: 1337, + latestBlockTime: 1337, + latestAppHash: 'DEADBEEF', + peers: 6, + moniker: 'test', + network: 'test', + }, + drive: { + dockerStatus: DockerStatusEnum.running, + serviceStatus: ServiceStatusEnum.up, + }, + }; + + mockFetch + .onFirstCall() + .returns(Promise.resolve({ json: () => Promise.resolve(mockStatus) })) + .onSecondCall() + .returns(Promise.resolve({ json: () => Promise.resolve(mockNetInfo) })); + mockMNOWatchProvider.returns(Promise.resolve('OPEN')); + + const scope = await getPlatformScope(config); + + expect(scope).to.deep.equal(expectedScope); + }); + it('should return empty scope if error during request to core', async () => { mockRpcClient.mnsync.withArgs('status').throws(new Error()); mockDockerCompose.execCommand.returns({ exitCode: 0, out: '' }); From 63e53660a7a05b077696e8bad78910205198c435 Mon Sep 17 00:00:00 2001 From: lklimek <842586+lklimek@users.noreply.github.com> Date: Thu, 1 Feb 2024 14:53:19 +0100 Subject: [PATCH 025/191] chore: update rs-tenderdash-abci to v0.14.0-dev.6 and tenderdash to v0.14.0-dev.2 (#1686) --- Cargo.lock | 12 +++++------ packages/dapi-grpc/Cargo.toml | 2 +- .../configs/defaults/getBaseConfigFactory.js | 2 +- packages/rs-drive-abci/Cargo.toml | 2 +- .../rs-drive-abci/src/abci/handler/mod.rs | 2 ++ .../engine/finalize_block_proposal/v0/mod.rs | 4 ++-- packages/rs-drive-abci/src/mimic/mod.rs | 11 +++++----- .../src/platform_types/commit/v0/mod.rs | 21 +++++++++++-------- .../withdrawal/withdrawal_txs/v0/mod.rs | 7 ++++++- .../tests/strategy_tests/query.rs | 11 +++++----- packages/rs-drive-proof-verifier/Cargo.toml | 2 +- .../rs-drive-proof-verifier/src/verify.rs | 4 ++-- 12 files changed, 46 insertions(+), 34 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c7ff029c4a..1f32aa20cb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4132,8 +4132,8 @@ dependencies = [ [[package]] name = "tenderdash-abci" -version = "0.14.0-dev.5" -source = "git+https://github.com/dashpay/rs-tenderdash-abci?tag=v0.14.0-dev.5#556f3a9b6724bdbe44acf8045cd87144a997bccb" +version = "0.14.0-dev.6" +source = "git+https://github.com/dashpay/rs-tenderdash-abci?rev=251386f9e4109c89ca628226c981c489b80aed80#251386f9e4109c89ca628226c981c489b80aed80" dependencies = [ "bytes", "futures", @@ -4153,8 +4153,8 @@ dependencies = [ [[package]] name = "tenderdash-proto" -version = "0.14.0-dev.5" -source = "git+https://github.com/dashpay/rs-tenderdash-abci?tag=v0.14.0-dev.5#556f3a9b6724bdbe44acf8045cd87144a997bccb" +version = "0.14.0-dev.6" +source = "git+https://github.com/dashpay/rs-tenderdash-abci?rev=251386f9e4109c89ca628226c981c489b80aed80#251386f9e4109c89ca628226c981c489b80aed80" dependencies = [ "bytes", "chrono", @@ -4171,8 +4171,8 @@ dependencies = [ [[package]] name = "tenderdash-proto-compiler" -version = "0.14.0-dev.5" -source = "git+https://github.com/dashpay/rs-tenderdash-abci?tag=v0.14.0-dev.5#556f3a9b6724bdbe44acf8045cd87144a997bccb" +version = "0.14.0-dev.6" +source = "git+https://github.com/dashpay/rs-tenderdash-abci?rev=251386f9e4109c89ca628226c981c489b80aed80#251386f9e4109c89ca628226c981c489b80aed80" dependencies = [ "fs_extra", "prost-build 0.12.3", diff --git a/packages/dapi-grpc/Cargo.toml b/packages/dapi-grpc/Cargo.toml index 5936b3fce8..e16b24b1f3 100644 --- a/packages/dapi-grpc/Cargo.toml +++ b/packages/dapi-grpc/Cargo.toml @@ -30,7 +30,7 @@ tonic = { version = "0.9.2", features = [ ], default-features = false } serde = { version = "1.0.171", optional = true, features = ["derive"] } serde_bytes = { version = "0.11.12", optional = true } -tenderdash-proto = { git = "https://github.com/dashpay/rs-tenderdash-abci", tag = "v0.14.0-dev.5" } +tenderdash-proto = { git = "https://github.com/dashpay/rs-tenderdash-abci", rev = "251386f9e4109c89ca628226c981c489b80aed80" } dapi-grpc-macros = { path = "../rs-dapi-grpc-macros" } platform-version = { path = "../rs-platform-version" } diff --git a/packages/dashmate/configs/defaults/getBaseConfigFactory.js b/packages/dashmate/configs/defaults/getBaseConfigFactory.js index e7d67da255..ab4227806d 100644 --- a/packages/dashmate/configs/defaults/getBaseConfigFactory.js +++ b/packages/dashmate/configs/defaults/getBaseConfigFactory.js @@ -178,7 +178,7 @@ export default function getBaseConfigFactory(homeDir) { tenderdash: { mode: 'full', docker: { - image: 'dashpay/tenderdash:fix-ordered-map', + image: 'dashpay/tenderdash:0.14.0-dev.2', }, p2p: { host: '0.0.0.0', diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index ea9f1bf565..10f1ec4744 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -58,7 +58,7 @@ tracing-subscriber = { version = "0.3.16", default-features = false, features = "tracing-log", ], optional = false } atty = { version = "0.2.14", optional = false } -tenderdash-abci = { git = "https://github.com/dashpay/rs-tenderdash-abci", tag = "v0.14.0-dev.5" } +tenderdash-abci = { git = "https://github.com/dashpay/rs-tenderdash-abci", rev = "251386f9e4109c89ca628226c981c489b80aed80" } lazy_static = "1.4.0" itertools = { version = "0.10.5" } file-rotate = { version = "0.7.3" } diff --git a/packages/rs-drive-abci/src/abci/handler/mod.rs b/packages/rs-drive-abci/src/abci/handler/mod.rs index fc935446f6..514f046b87 100644 --- a/packages/rs-drive-abci/src/abci/handler/mod.rs +++ b/packages/rs-drive-abci/src/abci/handler/mod.rs @@ -644,6 +644,7 @@ where .map(|tx_id| proto::ExtendVoteExtension { r#type: VoteExtensionType::ThresholdRecover as i32, extension: tx_id.to_byte_array().to_vec(), + sign_request_id: None, }) .collect(); Ok(proto::ResponseExtendVote { @@ -693,6 +694,7 @@ where .map(|tx_id| proto::ExtendVoteExtension { r#type: VoteExtensionType::ThresholdRecover as i32, extension: tx_id.to_byte_array().to_vec(), + sign_request_id: None, }) .collect::>() .into(); diff --git a/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/v0/mod.rs b/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/v0/mod.rs index 51b6db6352..b949f9c760 100644 --- a/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/v0/mod.rs @@ -10,7 +10,7 @@ use dpp::version::PlatformVersion; use tenderdash_abci::{ proto::{serializers::timestamp::ToMilis, types::BlockId as ProtoBlockId}, - signatures::SignBytes, + signatures::Hashable, }; use crate::abci::AbciError; @@ -99,7 +99,7 @@ where } = block; let block_id_hash = Into::::into(block_id.clone()) - .sha256(&self.config.abci.chain_id, height as i64, round as i32) + .calculate_msg_hash(&self.config.abci.chain_id, height as i64, round as i32) .map_err(AbciError::from)? .try_into() .expect("invalid sha256 length"); diff --git a/packages/rs-drive-abci/src/mimic/mod.rs b/packages/rs-drive-abci/src/mimic/mod.rs index 640a6baa1a..a3942c779f 100644 --- a/packages/rs-drive-abci/src/mimic/mod.rs +++ b/packages/rs-drive-abci/src/mimic/mod.rs @@ -26,8 +26,8 @@ use tenderdash_abci::proto::serializers::timestamp::ToMilis; use tenderdash_abci::proto::types::{ Block, BlockId, Data, EvidenceList, Header, PartSetHeader, VoteExtension, VoteExtensionType, StateId, CanonicalVote, SignedMsgType, }; -use tenderdash_abci::signatures::SignBytes; -use tenderdash_abci::{signatures::SignDigest, proto::version::Consensus, Application}; +use tenderdash_abci::signatures::Hashable; +use tenderdash_abci::{signatures::Signable, proto::version::Consensus, Application}; use tenderdash_abci::proto::abci::tx_record::TxAction; use crate::execution::types::block_execution_context::v0::BlockExecutionContextV0Getters; use crate::execution::types::block_state_info::v0::BlockStateInfoV0Getters; @@ -205,7 +205,7 @@ impl<'a, C: CoreRPCLike> AbciApplication<'a, C> { time: time.to_milis(), }; let state_id_hash = state_id - .sha256(CHAIN_ID, height as i64, round as i32) + .calculate_msg_hash(CHAIN_ID, height as i64, round as i32) .expect("cannot hash state id"); let block_header_hash: [u8; 32] = rng.gen(); @@ -218,7 +218,7 @@ impl<'a, C: CoreRPCLike> AbciApplication<'a, C> { state_id: state_id_hash, }; let block_id_hash = block_id - .sha256(CHAIN_ID, height as i64, round as i32) + .calculate_msg_hash(CHAIN_ID, height as i64, round as i32) .expect("cannot hash block id"); let request_process_proposal = RequestProcessProposal { @@ -410,6 +410,7 @@ impl<'a, C: CoreRPCLike> AbciApplication<'a, C> { r#type: VoteExtensionType::ThresholdRecover as i32, extension: tx_id.to_byte_array().to_vec(), signature: vec![], //todo: signature + sign_request_id: None, } }) .collect(); @@ -448,7 +449,7 @@ impl<'a, C: CoreRPCLike> AbciApplication<'a, C> { let quorum_type = self.platform.config.validator_set_quorum_type(); let state_id_hash = state_id - .sha256(CHAIN_ID, height as i64, round as i32) + .calculate_msg_hash(CHAIN_ID, height as i64, round as i32) .expect("cannot calculate state id hash"); let commit = CanonicalVote { diff --git a/packages/rs-drive-abci/src/platform_types/commit/v0/mod.rs b/packages/rs-drive-abci/src/platform_types/commit/v0/mod.rs index a85505b57c..07bb19c51b 100644 --- a/packages/rs-drive-abci/src/platform_types/commit/v0/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/commit/v0/mod.rs @@ -10,7 +10,7 @@ use dpp::validation::{SimpleValidationResult, ValidationResult}; use tenderdash_abci::proto; use tenderdash_abci::proto::abci::CommitInfo; use tenderdash_abci::proto::types::BlockId; -use tenderdash_abci::signatures::SignDigest; +use tenderdash_abci::signatures::Signable; /// Represents block commit #[derive(Clone, Debug)] @@ -141,7 +141,7 @@ mod test { use dpp::bls_signatures::PublicKey; use tenderdash_abci::proto::types::{BlockId, PartSetHeader, StateId}; - use tenderdash_abci::signatures::{SignBytes, SignDigest}; + use tenderdash_abci::signatures::{Hashable, Signable}; /// Given a commit info and a signature, check that the signature is verified correctly #[test] @@ -178,7 +178,9 @@ mod test { .to_byte_array() .to_vec(), }), - state_id: state_id.sha256(CHAIN_ID, HEIGHT, ROUND as i32).unwrap(), + state_id: state_id + .calculate_msg_hash(CHAIN_ID, HEIGHT, ROUND as i32) + .unwrap(), }; let pubkey = hex::decode("8d63d603fe858be4d7c14a8f308936bd3447c1f361148ad508a04df92f48cd3b2f2b374ef5d1ee8a75f5aeda2f6f3418").unwrap(); @@ -192,27 +194,28 @@ mod test { QuorumType::LlmqTest, CHAIN_ID, ); - let expect_sign_bytes = hex::decode( + let expect_msg = hex::decode( "020000003930000000000000020000000000000035117edfe49351da1e81d1b0f2edfa0b984a7508\ 958870337126efb352f1210715e56fe9d267359b4b437a52636174ac64aa9a021671aabc9985023695bc6e3\ 6746573745f636861696e5f6964", ) .unwrap(); - let expect_sign_id = + let expect_msg_hash = sha256::Hash::hash(&expect_msg).to_byte_array().to_vec(); + let expect_sign_hash = hex::decode("58fb34b03f9028e6ac181418c753f33e471ae223bb66b2bef7b46732a15b7eac") .unwrap(); assert_eq!( - expect_sign_bytes, + expect_msg_hash, commit .inner - .sign_bytes(CHAIN_ID, HEIGHT, ROUND as i32) + .calculate_msg_hash(CHAIN_ID, HEIGHT, ROUND as i32) .unwrap() ); assert_eq!( - expect_sign_id, + expect_sign_hash, commit .inner - .sign_digest( + .calculate_sign_hash( CHAIN_ID, QuorumType::LlmqTest as u8, &QUORUM_HASH, diff --git a/packages/rs-drive-abci/src/platform_types/withdrawal/withdrawal_txs/v0/mod.rs b/packages/rs-drive-abci/src/platform_types/withdrawal/withdrawal_txs/v0/mod.rs index 0293eb65f1..a1e129a4b5 100644 --- a/packages/rs-drive-abci/src/platform_types/withdrawal/withdrawal_txs/v0/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/withdrawal/withdrawal_txs/v0/mod.rs @@ -15,7 +15,7 @@ use tenderdash_abci::proto::{ abci::ExtendVoteExtension, types::{VoteExtension, VoteExtensionType}, }; -use tenderdash_abci::signatures::SignDigest; +use tenderdash_abci::signatures::Signable; const MAX_WITHDRAWAL_TXS: u16 = 16; @@ -39,6 +39,7 @@ impl<'a> WithdrawalTxs<'a> { r#type: VoteExtensionType::ThresholdRecover.into(), extension: v, signature: Default::default(), + sign_request_id: None, }) .collect::>(); @@ -96,6 +97,7 @@ impl<'a> WithdrawalTxs<'a> { .map(|v| ExtendVoteExtension { r#type: v.r#type, extension: v.extension.clone(), + sign_request_id: None, }) .collect::>() } @@ -106,6 +108,7 @@ impl<'a> WithdrawalTxs<'a> { .map(|v| ExtendVoteExtension { r#type: v.r#type, extension: v.extension, + sign_request_id: None, }) .collect::>() } @@ -190,6 +193,7 @@ impl<'a> From> for WithdrawalTxs<'a> { r#type: v.r#type, extension: v.extension, signature: Default::default(), + sign_request_id: None, }) .collect::>(), drive_operations: Vec::::new(), @@ -261,6 +265,7 @@ mod test { .into(), signature, r#type: VoteExtensionType::ThresholdRecover.into(), + sign_request_id: None, }); assert!(wt diff --git a/packages/rs-drive-abci/tests/strategy_tests/query.rs b/packages/rs-drive-abci/tests/strategy_tests/query.rs index 17ae1ce383..9ecef4c714 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/query.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/query.rs @@ -26,7 +26,7 @@ use strategy_tests::frequency::Frequency; use tenderdash_abci::proto::google::protobuf::Timestamp; use tenderdash_abci::proto::serializers::timestamp::ToMilis; use tenderdash_abci::proto::types::{CanonicalVote, SignedMsgType, StateId}; -use tenderdash_abci::signatures::{SignBytes, SignDigest}; +use tenderdash_abci::signatures::{Hashable, Signable}; #[derive(Clone, Debug, Default)] pub struct QueryStrategy { @@ -80,10 +80,11 @@ impl<'a> ProofVerification<'a> { /// Implements algorithm described at: /// https://github.com/dashpay/tenderdash/blob/v0.12-dev/spec/consensus/signing.md#block-signature-verification-on-light-client fn verify_signature(&self, state_id: StateId, round: u32) -> SimpleValidationResult { - let state_id_hash = match state_id.sha256(&self.chain_id, self.height, round as i32) { - Ok(s) => s, - Err(e) => return SimpleValidationResult::new_with_error(AbciError::from(e)), - }; + let state_id_hash = + match state_id.calculate_msg_hash(&self.chain_id, self.height, round as i32) { + Ok(s) => s, + Err(e) => return SimpleValidationResult::new_with_error(AbciError::from(e)), + }; let v = CanonicalVote { block_id: self.block_hash.to_vec(), diff --git a/packages/rs-drive-proof-verifier/Cargo.toml b/packages/rs-drive-proof-verifier/Cargo.toml index 3b42107d9e..45a8a436ee 100644 --- a/packages/rs-drive-proof-verifier/Cargo.toml +++ b/packages/rs-drive-proof-verifier/Cargo.toml @@ -20,7 +20,7 @@ drive = { path = "../rs-drive", default-features = false, features = [ "verify", ] } dpp = { path = "../rs-dpp" } -tenderdash-abci = { git = "https://github.com/dashpay/rs-tenderdash-abci", tag = "v0.14.0-dev.5" } +tenderdash-abci = { git = "https://github.com/dashpay/rs-tenderdash-abci", rev = "251386f9e4109c89ca628226c981c489b80aed80" } # tenderdash-abci = { path = "../../../rs-tenderdash-abci/abci" } tracing = { version = "0.1.37" } serde = { version = "1.0.171", default-features = false, optional = true } diff --git a/packages/rs-drive-proof-verifier/src/verify.rs b/packages/rs-drive-proof-verifier/src/verify.rs index 70ea440660..51cb55d909 100644 --- a/packages/rs-drive-proof-verifier/src/verify.rs +++ b/packages/rs-drive-proof-verifier/src/verify.rs @@ -3,7 +3,7 @@ use dpp::bls_signatures; pub use drive::drive::verify::RootHash; use tenderdash_abci::{ proto::types::{CanonicalVote, SignedMsgType, StateId}, - signatures::{SignBytes, SignDigest}, + signatures::{Hashable, Signable}, }; use crate::Error; @@ -61,7 +61,7 @@ pub(crate) fn verify_tenderdash_proof( }; let state_id_hash = state_id - .sha256(&chain_id, mtd.height as i64, proof.round as i32) + .calculate_msg_hash(&chain_id, mtd.height as i64, proof.round as i32) .expect("failed to calculate state id hash"); let commit = CanonicalVote { From 959175290f549e8815009e2669b530e876fd3754 Mon Sep 17 00:00:00 2001 From: Igor Markin Date: Tue, 6 Feb 2024 14:47:33 +0000 Subject: [PATCH 026/191] feat(drive): withdrawals finalization (#1601) Co-authored-by: Odysseas Gabrielides Co-authored-by: Ivan Shumkov --- .pnp.cjs | 26 +- ...e-lib-npm-0.21.0-1997e852e6-fb4419623f.zip | Bin 888353 -> 0 bytes ...e-lib-npm-0.21.1-2fe9b7647d-68502e4078.zip | Bin 0 -> 891028 bytes Cargo.lock | 55 +- packages/bench-suite/package.json | 2 +- packages/dapi-grpc/Cargo.toml | 2 +- packages/dapi/package.json | 2 +- packages/dash-spv/package.json | 2 +- .../configs/defaults/getBaseConfigFactory.js | 2 +- .../configs/defaults/getLocalConfigFactory.js | 3 + .../defaults/getTestnetConfigFactory.js | 3 + .../configs/getConfigFileMigrationsFactory.js | 27 + packages/dashmate/package.json | 2 +- packages/dashmate/src/core/CoreService.js | 1 + packages/js-dapi-client/package.json | 2 +- packages/js-dash-sdk/package.json | 3 +- packages/js-dash-sdk/src/SDK/Client/Client.ts | 4 + .../SDK/Client/Platform/Fetcher/withRetry.ts | 2 +- .../src/SDK/Client/Platform/Platform.ts | 3 + .../methods/identities/creditWithdrawal.ts | 114 ++++ packages/js-dash-sdk/src/utils/fibonacci.ts | 12 +- packages/platform-test-suite/package.json | 3 +- .../test/e2e/withdrawals.spec.js | 243 ++++++++ packages/rs-dpp/src/balances/credits.rs | 2 + ...it_withdrawal_transition_core_fee_error.rs | 13 +- .../rs-dpp/src/identity/identity_facade.rs | 25 +- .../rs-dpp/src/identity/identity_factory.rs | 29 + .../accessors/mod.rs | 40 ++ .../accessors/v0/mod.rs | 7 +- .../mod.rs | 22 +- .../v0/mod.rs | 11 +- .../traits/state_transition_like.rs | 3 +- .../rs-dpp/src/util/is_fibonacci_number.rs | 19 +- packages/rs-drive-abci/Cargo.toml | 5 +- packages/rs-drive-abci/src/abci/error.rs | 9 +- .../rs-drive-abci/src/abci/handler/mod.rs | 156 ++--- .../engine/finalize_block_proposal/v0/mod.rs | 100 +++- .../engine/run_block_proposal/v0/mod.rs | 62 +- .../v0/mod.rs | 168 ------ .../v0/mod.rs | 37 -- .../identity_credit_withdrawal/mod.rs | 5 - .../v0/mod.rs | 462 --------------- .../create_genesis_state/v0/mod.rs | 4 +- .../src/execution/platform_events/mod.rs | 4 +- .../mod.rs | 39 ++ .../v0/mod.rs | 91 +++ .../mod.rs | 27 +- .../v0/mod.rs | 75 +-- .../withdrawals/check_withdrawals/mod.rs | 74 --- .../withdrawals/check_withdrawals/v0/mod.rs | 78 --- .../mod.rs | 23 +- .../v0/mod.rs | 199 +++++++ .../mod.rs | 12 +- .../v0/mod.rs | 31 + .../platform_events/withdrawals/mod.rs | 7 +- .../mod.rs | 12 +- .../v0/mod.rs | 207 +++---- .../mod.rs | 18 +- .../v0/mod.rs | 327 +++++++++++ .../types/block_execution_context/mod.rs | 30 +- .../types/block_execution_context/v0/mod.rs | 42 +- .../triggers/withdrawals/v0/mod.rs | 10 +- .../identity_create/state/v0/mod.rs | 6 +- .../structure/v0/mod.rs | 17 +- .../identity_top_up/state/v0/mod.rs | 6 +- packages/rs-drive-abci/src/mimic/mod.rs | 86 ++- .../mod.rs | 22 +- .../src/platform_types/withdrawal/mod.rs | 3 +- .../mod.rs | 0 .../unsigned_withdrawal_txs/v0/mod.rs | 142 +++++ .../withdrawal/withdrawal_txs/v0/mod.rs | 295 ---------- packages/rs-drive-abci/src/rpc/core.rs | 50 +- .../tests/strategy_tests/execution.rs | 13 +- .../tests/strategy_tests/main.rs | 531 +++++++++++++++++- .../tests/strategy_tests/strategy.rs | 3 +- packages/rs-drive-proof-verifier/Cargo.toml | 3 +- .../src/drive/batch/drive_op_batch/mod.rs | 2 +- .../drive/batch/drive_op_batch/withdrawals.rs | 78 +-- .../identity_credit_withdrawal_transition.rs | 14 +- packages/rs-drive/src/drive/config.rs | 6 +- .../mod.rs | 40 ++ .../v0/mod.rs | 215 +++++++ .../mod.rs | 45 ++ .../v0/mod.rs | 177 ++++++ .../identity/withdrawals/document/mod.rs | 4 + .../drive/identity/withdrawals/documents.rs | 369 ------------ .../src/drive/identity/withdrawals/mod.rs | 17 +- .../src/drive/identity/withdrawals/paths.rs | 37 +- .../src/drive/identity/withdrawals/queue.rs | 178 ------ .../mod.rs | 42 ++ .../v0/mod.rs | 16 + .../mod.rs | 34 ++ .../v0/mod.rs | 40 ++ .../withdrawals/transaction/index/mod.rs | 72 +++ .../identity/withdrawals/transaction/mod.rs | 5 + .../mod.rs | 42 ++ .../v0/mod.rs | 20 + .../mod.rs | 41 ++ .../v0/mod.rs | 80 +++ .../withdrawals/transaction/queue/mod.rs | 117 ++++ .../identity/withdrawals/transaction_index.rs | 239 -------- .../identity_credit_withdrawal/mod.rs | 7 + .../identity_credit_withdrawal/v0/mod.rs | 2 + .../v0/transformer.rs | 8 +- .../src/version/drive_abci_versions.rs | 15 +- .../src/version/drive_versions.rs | 31 + .../src/version/mocks/v2_test.rs | 50 +- .../src/version/mocks/v3_test.rs | 50 +- .../rs-platform-version/src/version/v1.rs | 50 +- packages/rs-sdk/Cargo.toml | 2 +- packages/simple-signer/Cargo.toml | 2 +- packages/strategy-tests/src/transitions.rs | 6 +- packages/wallet-lib/package.json | 2 +- .../wallet-lib/src/types/Storage/Storage.d.ts | 3 + ...entityCreditWithdrawalTransitionFixture.js | 20 + .../test/utils/generateRandomIdentifier.js | 13 + packages/wasm-dpp/package.json | 2 +- .../src/errors/consensus/consensus_error.rs | 28 +- .../data_trigger_condition_error.rs | 5 +- .../data_trigger_execution_error.rs | 5 +- .../data_trigger_invalid_result_error.rs | 5 +- .../consensus/state/data_contract/mod.rs | 3 +- .../wasm-dpp/src/identity/identity_facade.rs | 36 +- .../wasm-dpp/src/identity/identity_factory.rs | 40 +- .../mod.rs | 3 + .../to_object.rs | 58 ++ .../transition.rs | 418 ++++++++++++++ .../src/identity/state_transition/mod.rs | 2 + .../state_transition_factory.rs | 6 +- .../identity/IdentityFacade.spec.js | 24 + .../unit/identity/IdentityFactory.spec.js | 22 + ...IdentityCreditWithdrawalTransition.spec.js | 155 +++++ .../schema/v1/withdrawals-documents.json | 29 +- packages/withdrawals-contract/src/v1/mod.rs | 1 - .../test/unit/withdrawalsContract.spec.js | 58 -- yarn.lock | 28 +- 136 files changed, 4503 insertions(+), 2791 deletions(-) delete mode 100644 .yarn/cache/@dashevo-dashcore-lib-npm-0.21.0-1997e852e6-fb4419623f.zip create mode 100644 .yarn/cache/@dashevo-dashcore-lib-npm-0.21.1-2fe9b7647d-68502e4078.zip create mode 100644 packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/creditWithdrawal.ts create mode 100644 packages/platform-test-suite/test/e2e/withdrawals.spec.js delete mode 100644 packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/fetch_and_prepare_unsigned_withdrawal_transactions/v0/mod.rs delete mode 100644 packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/fetch_transactions_block_inclusion_status/v0/mod.rs delete mode 100644 packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/mod.rs delete mode 100644 packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/update_broadcasted_withdrawal_transaction_statuses/v0/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/platform_events/withdrawals/append_signatures_and_broadcast_withdrawal_transactions/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/platform_events/withdrawals/append_signatures_and_broadcast_withdrawal_transactions/v0/mod.rs rename packages/rs-drive-abci/src/execution/platform_events/{identity_credit_withdrawal/build_withdrawal_transactions_from_documents => withdrawals/build_untied_withdrawal_transactions_from_documents}/mod.rs (64%) rename packages/rs-drive-abci/src/execution/platform_events/{identity_credit_withdrawal/build_withdrawal_transactions_from_documents => withdrawals/build_untied_withdrawal_transactions_from_documents}/v0/mod.rs (77%) delete mode 100644 packages/rs-drive-abci/src/execution/platform_events/withdrawals/check_withdrawals/mod.rs delete mode 100644 packages/rs-drive-abci/src/execution/platform_events/withdrawals/check_withdrawals/v0/mod.rs rename packages/rs-drive-abci/src/execution/platform_events/{identity_credit_withdrawal/fetch_and_prepare_unsigned_withdrawal_transactions => withdrawals/dequeue_and_build_unsigned_withdrawal_transactions}/mod.rs (72%) create mode 100644 packages/rs-drive-abci/src/execution/platform_events/withdrawals/dequeue_and_build_unsigned_withdrawal_transactions/v0/mod.rs rename packages/rs-drive-abci/src/execution/platform_events/{identity_credit_withdrawal => withdrawals}/fetch_transactions_block_inclusion_status/mod.rs (79%) create mode 100644 packages/rs-drive-abci/src/execution/platform_events/withdrawals/fetch_transactions_block_inclusion_status/v0/mod.rs rename packages/rs-drive-abci/src/execution/platform_events/{identity_credit_withdrawal => withdrawals}/pool_withdrawals_into_transactions_queue/mod.rs (85%) rename packages/rs-drive-abci/src/execution/platform_events/{identity_credit_withdrawal => withdrawals}/pool_withdrawals_into_transactions_queue/v0/mod.rs (52%) rename packages/rs-drive-abci/src/execution/platform_events/{identity_credit_withdrawal/update_broadcasted_withdrawal_transaction_statuses => withdrawals/update_broadcasted_withdrawal_statuses}/mod.rs (76%) create mode 100644 packages/rs-drive-abci/src/execution/platform_events/withdrawals/update_broadcasted_withdrawal_statuses/v0/mod.rs rename packages/rs-drive-abci/src/platform_types/withdrawal/{withdrawal_txs => unsigned_withdrawal_txs}/mod.rs (100%) create mode 100644 packages/rs-drive-abci/src/platform_types/withdrawal/unsigned_withdrawal_txs/v0/mod.rs delete mode 100644 packages/rs-drive-abci/src/platform_types/withdrawal/withdrawal_txs/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/identity/withdrawals/document/fetch_oldest_withdrawal_documents_by_status/mod.rs create mode 100644 packages/rs-drive/src/drive/identity/withdrawals/document/fetch_oldest_withdrawal_documents_by_status/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/identity/withdrawals/document/find_withdrawal_documents_by_status_and_transaction_indices/mod.rs create mode 100644 packages/rs-drive/src/drive/identity/withdrawals/document/find_withdrawal_documents_by_status_and_transaction_indices/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/identity/withdrawals/document/mod.rs delete mode 100644 packages/rs-drive/src/drive/identity/withdrawals/documents.rs delete mode 100644 packages/rs-drive/src/drive/identity/withdrawals/queue.rs create mode 100644 packages/rs-drive/src/drive/identity/withdrawals/transaction/index/add_update_next_withdrawal_transaction_index_operation/mod.rs create mode 100644 packages/rs-drive/src/drive/identity/withdrawals/transaction/index/add_update_next_withdrawal_transaction_index_operation/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/identity/withdrawals/transaction/index/fetch_next_withdrawal_transaction_index/mod.rs create mode 100644 packages/rs-drive/src/drive/identity/withdrawals/transaction/index/fetch_next_withdrawal_transaction_index/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/identity/withdrawals/transaction/index/mod.rs create mode 100644 packages/rs-drive/src/drive/identity/withdrawals/transaction/mod.rs create mode 100644 packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/add_enqueue_untied_withdrawal_transaction_operations/mod.rs create mode 100644 packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/add_enqueue_untied_withdrawal_transaction_operations/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/dequeue_untied_withdrawal_transactions/mod.rs create mode 100644 packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/dequeue_untied_withdrawal_transactions/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/mod.rs delete mode 100644 packages/rs-drive/src/drive/identity/withdrawals/transaction_index.rs create mode 100644 packages/wasm-dpp/lib/test/fixtures/getIdentityCreditWithdrawalTransitionFixture.js create mode 100644 packages/wasm-dpp/lib/test/utils/generateRandomIdentifier.js create mode 100644 packages/wasm-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/mod.rs create mode 100644 packages/wasm-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/to_object.rs create mode 100644 packages/wasm-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/transition.rs create mode 100644 packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreditWithdrawalTransition/IdentityCreditWithdrawalTransition.spec.js diff --git a/.pnp.cjs b/.pnp.cjs index 7bd36798d5..fb560b39ab 100755 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -2698,7 +2698,7 @@ const RAW_RUNTIME_STATE = "packageLocation": "./packages/bench-suite/",\ "packageDependencies": [\ ["@dashevo/bench-suite", "workspace:packages/bench-suite"],\ - ["@dashevo/dashcore-lib", "npm:0.21.0"],\ + ["@dashevo/dashcore-lib", "npm:0.21.1"],\ ["@dashevo/dpns-contract", "workspace:packages/dpns-contract"],\ ["@dashevo/wallet-lib", "workspace:packages/wallet-lib"],\ ["@dashevo/wasm-dpp", "workspace:packages/wasm-dpp"],\ @@ -2734,7 +2734,7 @@ const RAW_RUNTIME_STATE = ["@dashevo/bls", "npm:1.2.9"],\ ["@dashevo/dapi-client", "workspace:packages/js-dapi-client"],\ ["@dashevo/dapi-grpc", "workspace:packages/dapi-grpc"],\ - ["@dashevo/dashcore-lib", "npm:0.21.0"],\ + ["@dashevo/dashcore-lib", "npm:0.21.1"],\ ["@dashevo/dashd-rpc", "npm:18.2.0"],\ ["@dashevo/dp-services-ctl", "https://github.com/dashevo/js-dp-services-ctl.git#commit=3976076b0018c5b4632ceda4c752fc597f27a640"],\ ["@dashevo/grpc-common", "workspace:packages/js-grpc-common"],\ @@ -2779,7 +2779,7 @@ const RAW_RUNTIME_STATE = ["@babel/core", "npm:7.23.3"],\ ["@dashevo/dapi-grpc", "workspace:packages/dapi-grpc"],\ ["@dashevo/dash-spv", "workspace:packages/dash-spv"],\ - ["@dashevo/dashcore-lib", "npm:0.21.0"],\ + ["@dashevo/dashcore-lib", "npm:0.21.1"],\ ["@dashevo/grpc-common", "workspace:packages/js-grpc-common"],\ ["@dashevo/wasm-dpp", "workspace:packages/wasm-dpp"],\ ["assert-browserify", "npm:2.0.0"],\ @@ -2871,7 +2871,7 @@ const RAW_RUNTIME_STATE = ["@dashevo/dash-spv", "workspace:packages/dash-spv"],\ ["@dashevo/dark-gravity-wave", "npm:1.1.1"],\ ["@dashevo/dash-util", "npm:2.0.3"],\ - ["@dashevo/dashcore-lib", "npm:0.21.0"],\ + ["@dashevo/dashcore-lib", "npm:0.21.1"],\ ["chai", "npm:4.3.10"],\ ["eslint", "npm:8.53.0"],\ ["eslint-config-airbnb-base", "virtual:e2d057e7cc143d3cb9bec864f4a2d862441b5a09f81f8e6c46e7a098cbc89e4d07017cc6e2e2142d5704bb55da853cbec2d025ebc0b30e8696c31380c00f2c7d#npm:15.0.0"],\ @@ -2898,10 +2898,10 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["@dashevo/dashcore-lib", [\ - ["npm:0.21.0", {\ - "packageLocation": "./.yarn/cache/@dashevo-dashcore-lib-npm-0.21.0-1997e852e6-fb4419623f.zip/node_modules/@dashevo/dashcore-lib/",\ + ["npm:0.21.1", {\ + "packageLocation": "./.yarn/cache/@dashevo-dashcore-lib-npm-0.21.1-2fe9b7647d-68502e4078.zip/node_modules/@dashevo/dashcore-lib/",\ "packageDependencies": [\ - ["@dashevo/dashcore-lib", "npm:0.21.0"],\ + ["@dashevo/dashcore-lib", "npm:0.21.1"],\ ["@dashevo/bls", "npm:1.2.9"],\ ["@dashevo/x11-hash-js", "npm:1.0.2"],\ ["@types/node", "npm:12.20.37"],\ @@ -3084,13 +3084,14 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["@dashevo/platform-test-suite", "workspace:packages/platform-test-suite"],\ ["@dashevo/dapi-client", "workspace:packages/js-dapi-client"],\ - ["@dashevo/dashcore-lib", "npm:0.21.0"],\ + ["@dashevo/dashcore-lib", "npm:0.21.1"],\ ["@dashevo/dpns-contract", "workspace:packages/dpns-contract"],\ ["@dashevo/feature-flags-contract", "workspace:packages/feature-flags-contract"],\ ["@dashevo/grpc-common", "workspace:packages/js-grpc-common"],\ ["@dashevo/masternode-reward-shares-contract", "workspace:packages/masternode-reward-shares-contract"],\ ["@dashevo/wallet-lib", "workspace:packages/wallet-lib"],\ ["@dashevo/wasm-dpp", "workspace:packages/wasm-dpp"],\ + ["@dashevo/withdrawals-contract", "workspace:packages/withdrawals-contract"],\ ["assert", "npm:2.0.0"],\ ["assert-browserify", "npm:2.0.0"],\ ["browserify-zlib", "npm:0.2.0"],\ @@ -3177,7 +3178,7 @@ const RAW_RUNTIME_STATE = ["@dashevo/wallet-lib", "workspace:packages/wallet-lib"],\ ["@dashevo/dapi-client", "workspace:packages/js-dapi-client"],\ ["@dashevo/dash-spv", "workspace:packages/dash-spv"],\ - ["@dashevo/dashcore-lib", "npm:0.21.0"],\ + ["@dashevo/dashcore-lib", "npm:0.21.1"],\ ["@dashevo/grpc-common", "workspace:packages/js-grpc-common"],\ ["@dashevo/wasm-dpp", "workspace:packages/wasm-dpp"],\ ["@yarnpkg/pnpify", "npm:4.0.0-rc.42"],\ @@ -3239,7 +3240,7 @@ const RAW_RUNTIME_STATE = ["@babel/core", "npm:7.23.3"],\ ["@babel/preset-env", "virtual:e2d057e7cc143d3cb9bec864f4a2d862441b5a09f81f8e6c46e7a098cbc89e4d07017cc6e2e2142d5704bb55da853cbec2d025ebc0b30e8696c31380c00f2c7d#npm:7.23.3"],\ ["@dashevo/bls", "npm:1.2.9"],\ - ["@dashevo/dashcore-lib", "npm:0.21.0"],\ + ["@dashevo/dashcore-lib", "npm:0.21.1"],\ ["@dashevo/dpns-contract", "workspace:packages/dpns-contract"],\ ["@types/bs58", "npm:4.0.1"],\ ["@types/node", "npm:14.17.34"],\ @@ -8625,13 +8626,14 @@ const RAW_RUNTIME_STATE = ["@dashevo/bls", "npm:1.2.9"],\ ["@dashevo/dapi-client", "workspace:packages/js-dapi-client"],\ ["@dashevo/dapi-grpc", "workspace:packages/dapi-grpc"],\ - ["@dashevo/dashcore-lib", "npm:0.21.0"],\ + ["@dashevo/dashcore-lib", "npm:0.21.1"],\ ["@dashevo/dashpay-contract", "workspace:packages/dashpay-contract"],\ ["@dashevo/dpns-contract", "workspace:packages/dpns-contract"],\ ["@dashevo/grpc-common", "workspace:packages/js-grpc-common"],\ ["@dashevo/masternode-reward-shares-contract", "workspace:packages/masternode-reward-shares-contract"],\ ["@dashevo/wallet-lib", "workspace:packages/wallet-lib"],\ ["@dashevo/wasm-dpp", "workspace:packages/wasm-dpp"],\ + ["@dashevo/withdrawals-contract", "workspace:packages/withdrawals-contract"],\ ["@types/chai", "npm:4.2.22"],\ ["@types/dirty-chai", "npm:2.0.2"],\ ["@types/mocha", "npm:8.2.3"],\ @@ -8703,7 +8705,7 @@ const RAW_RUNTIME_STATE = ["@babel/eslint-parser", "virtual:880cda903c2a2be387819a3f857d21494004437a03c92969b9853f7bdeebdfed08d417e68364ee9e158338603a6d78d690c457a55ab11e56398bc10f0ad232fc#npm:7.23.3"],\ ["@dashevo/bls", "npm:1.2.9"],\ ["@dashevo/dapi-client", "workspace:packages/js-dapi-client"],\ - ["@dashevo/dashcore-lib", "npm:0.21.0"],\ + ["@dashevo/dashcore-lib", "npm:0.21.1"],\ ["@dashevo/dashd-rpc", "npm:18.2.0"],\ ["@dashevo/dashpay-contract", "workspace:packages/dashpay-contract"],\ ["@dashevo/docker-compose", "npm:0.24.4"],\ diff --git a/.yarn/cache/@dashevo-dashcore-lib-npm-0.21.0-1997e852e6-fb4419623f.zip b/.yarn/cache/@dashevo-dashcore-lib-npm-0.21.0-1997e852e6-fb4419623f.zip deleted file mode 100644 index 81560d8bc59f6f383514b6e60dfebcd23076c394..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 888353 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%0DyluJiXDu=-!?&H}@q`vThv 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 SLZ_{=?AAP(`P2Nnkyp=J-MMS6f=4g^C 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ⅈ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

;J$Q}~OT%mDb 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 z

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

Vt! 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%0APS5 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≻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

qXP8c>qDazX!Cd|PweeuOi_hMyl`j8sJ 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 =yX4A9F#|i7 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%0AoBgDRufpi(+F*xsa-;c? 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

~8C7hWJ2CugJlE!zZChHY-%-d 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

Y?-(h?>hpE;$+zSE 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�L_$)1?QR!OZYUny)g!|c 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 ycS3}2iG~DH>rnd%9u~`f)Fgx*)Xfl { Object.entries(configFile.configs) @@ -426,6 +442,17 @@ export default function getConfigFileMigrationsFactory(homeDir, defaultConfigs) return configFile; }, + '1.0.0-dev.4': (configFile) => { + Object.entries(configFile.configs) + .forEach(([name, options]) => { + const defaultConfig = getDefaultConfigByNameOrGroup(name, options.group); + options.core.docker.image = defaultConfig.get('core.docker.image'); + + options.platform.drive.tenderdash.docker.image = defaultConfig.get('platform.drive.tenderdash.docker.image'); + }); + + return configFile; + }, }; } diff --git a/packages/dashmate/package.json b/packages/dashmate/package.json index eddc62b2a0..9cdde2c9c6 100644 --- a/packages/dashmate/package.json +++ b/packages/dashmate/package.json @@ -58,7 +58,7 @@ "@babel/eslint-parser": "^7.23.3", "@dashevo/bls": "~1.2.9", "@dashevo/dapi-client": "workspace:*", - "@dashevo/dashcore-lib": "~0.21.0", + "@dashevo/dashcore-lib": "~0.21.1", "@dashevo/dashd-rpc": "^18.2.0", "@dashevo/dashpay-contract": "workspace:*", "@dashevo/docker-compose": "^0.24.4", diff --git a/packages/dashmate/src/core/CoreService.js b/packages/dashmate/src/core/CoreService.js index 73c2c24315..88bd883bd0 100644 --- a/packages/dashmate/src/core/CoreService.js +++ b/packages/dashmate/src/core/CoreService.js @@ -8,6 +8,7 @@ export default class CoreService { constructor(config, rpcClient, dockerContainer) { this.config = config; this.rpcClient = rpcClient; + rpcClient.setTimeout(240 * 1000); this.dockerContainer = dockerContainer; } diff --git a/packages/js-dapi-client/package.json b/packages/js-dapi-client/package.json index 7567d81fa9..2bef1169e5 100644 --- a/packages/js-dapi-client/package.json +++ b/packages/js-dapi-client/package.json @@ -28,7 +28,7 @@ "dependencies": { "@dashevo/dapi-grpc": "workspace:*", "@dashevo/dash-spv": "workspace:*", - "@dashevo/dashcore-lib": "~0.21.0", + "@dashevo/dashcore-lib": "~0.21.1", "@dashevo/grpc-common": "workspace:*", "@dashevo/wasm-dpp": "workspace:*", "bs58": "^4.0.1", diff --git a/packages/js-dash-sdk/package.json b/packages/js-dash-sdk/package.json index 78da9c3cb8..932fdc438d 100644 --- a/packages/js-dash-sdk/package.json +++ b/packages/js-dash-sdk/package.json @@ -41,13 +41,14 @@ "@dashevo/bls": "~1.2.9", "@dashevo/dapi-client": "workspace:*", "@dashevo/dapi-grpc": "workspace:*", - "@dashevo/dashcore-lib": "~0.21.0", + "@dashevo/dashcore-lib": "~0.21.1", "@dashevo/dashpay-contract": "workspace:*", "@dashevo/dpns-contract": "workspace:*", "@dashevo/grpc-common": "workspace:*", "@dashevo/masternode-reward-shares-contract": "workspace:*", "@dashevo/wallet-lib": "workspace:*", "@dashevo/wasm-dpp": "workspace:*", + "@dashevo/withdrawals-contract": "workspace:*", "bs58": "^4.0.1", "node-inspect-extracted": "^1.0.8", "winston": "^3.2.1" diff --git a/packages/js-dash-sdk/src/SDK/Client/Client.ts b/packages/js-dash-sdk/src/SDK/Client/Client.ts index c5ed17cec5..aab3eecfba 100644 --- a/packages/js-dash-sdk/src/SDK/Client/Client.ts +++ b/packages/js-dash-sdk/src/SDK/Client/Client.ts @@ -6,6 +6,7 @@ import DAPIClient from '@dashevo/dapi-client'; import { contractId as dpnsContractId } from '@dashevo/dpns-contract/lib/systemIds'; import { contractId as dashpayContractId } from '@dashevo/dashpay-contract/lib/systemIds'; import { contractId as masternodeRewardSharesContractId } from '@dashevo/masternode-reward-shares-contract/lib/systemIds'; +import { contractId as withdrawalsContractId } from '@dashevo/withdrawals-contract/lib/systemIds'; import { Platform } from './Platform'; import { ClientApps, ClientAppsOptions } from './ClientApps'; @@ -138,6 +139,9 @@ export class Client extends EventEmitter { masternodeRewardShares: { contractId: masternodeRewardSharesContractId, }, + withdrawals: { + contractId: withdrawalsContractId, + }, ...this.options.apps, }); diff --git a/packages/js-dash-sdk/src/SDK/Client/Platform/Fetcher/withRetry.ts b/packages/js-dash-sdk/src/SDK/Client/Platform/Fetcher/withRetry.ts index b13472a06d..031601620e 100644 --- a/packages/js-dash-sdk/src/SDK/Client/Platform/Fetcher/withRetry.ts +++ b/packages/js-dash-sdk/src/SDK/Client/Platform/Fetcher/withRetry.ts @@ -1,4 +1,4 @@ -import fibonacci from '../../../../utils/fibonacci'; +import { fibonacci } from '../../../../utils/fibonacci'; import { wait } from '../../../../utils/wait'; /** diff --git a/packages/js-dash-sdk/src/SDK/Client/Platform/Platform.ts b/packages/js-dash-sdk/src/SDK/Client/Platform/Platform.ts index 07e26cb522..b689488bfd 100644 --- a/packages/js-dash-sdk/src/SDK/Client/Platform/Platform.ts +++ b/packages/js-dash-sdk/src/SDK/Client/Platform/Platform.ts @@ -21,6 +21,7 @@ import getIdentity from './methods/identities/get'; import registerIdentity from './methods/identities/register'; import topUpIdentity from './methods/identities/topUp'; import creditTransferIdentity from './methods/identities/creditTransfer'; +import creditWithdrawal from './methods/identities/creditWithdrawal'; import updateIdentity from './methods/identities/update'; import createIdentityCreateTransition from './methods/identities/internal/createIdentityCreateTransition'; import createIdentityTopUpTransition from './methods/identities/internal/createIdentityTopUpTransition'; @@ -77,6 +78,7 @@ interface Identities { register: Function, topUp: Function, creditTransfer: Function, + withdrawCredits: Function, update: Function, utils: { createAssetLockTransaction: Function @@ -181,6 +183,7 @@ export class Platform { topUp: topUpIdentity.bind(this), creditTransfer: creditTransferIdentity.bind(this), update: updateIdentity.bind(this), + withdrawCredits: creditWithdrawal.bind(this), utils: { createAssetLockProof: createAssetLockProof.bind(this), createAssetLockTransaction: createAssetLockTransaction.bind(this), diff --git a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/creditWithdrawal.ts b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/creditWithdrawal.ts new file mode 100644 index 0000000000..3d1ad5e990 --- /dev/null +++ b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/creditWithdrawal.ts @@ -0,0 +1,114 @@ +import { Identity } from '@dashevo/wasm-dpp'; +import { Address, Script } from '@dashevo/dashcore-lib'; +import broadcastStateTransition from '../../broadcastStateTransition'; +import { Platform } from '../../Platform'; +import { signStateTransition } from '../../signStateTransition'; +import { nearestGreaterFibonacci } from '../../../../../utils/fibonacci'; + +export const STATUSES = { + PENDING: 0, + POOLED: 1, + BROADCASTED: 2, + COMPLETED: 3, +}; + +// Implement remaining pooling types when they ready on drive side +const DEFAULT_POOLING = 0; + +// TODO: add to dashcore-lib +// Asset unlock TX size is fixed with the default pooling +// since it has zero inputs and only one output +const ASSET_UNLOCK_TX_SIZE = 190; + +// Minimal accepted core fee per byte to avoid low fee error from core +const MIN_ASSET_UNLOCK_CORE_FEE_PER_BYTE = 5; + +// Minimal withdrawal amount in credits to avoid dust error from core +const MINIMAL_WITHDRAWAL_AMOUNT = ASSET_UNLOCK_TX_SIZE * MIN_ASSET_UNLOCK_CORE_FEE_PER_BYTE * 1000; + +type WithdrawalOptions = { + signingKeyIndex: number +}; + +/** Creates platform credits withdrawal request + * @param identity - identity to withdraw from + * @param amount - amount of credits to withdraw + * @param to - Dash L1 address + * @param options - withdrawal options + */ +export async function creditWithdrawal( + this: Platform, + identity: Identity, + amount: number, + to: string, + options: WithdrawalOptions = { + signingKeyIndex: 2, + }, +): Promise { + await this.initialize(); + + const { dpp } = this; + + let toAddress: Address; + try { + toAddress = new Address(to, this.client.network); + } catch (e) { + throw new Error(`Invalid core recipient "${to}" for network ${this.client.network}`); + } + this.logger.debug(`[Identity#creditWithdrawal] credits withdrawal from ${identity.getId().toString()} to ${toAddress.toString()} with amount ${amount}`); + + const outputScript = Script.buildPublicKeyHashOut(toAddress); + + const balance = identity.getBalance(); + if (amount > balance) { + throw new Error(`Withdrawal amount "${amount}" is bigger that identity balance "${balance}"`); + } + + if (amount < MINIMAL_WITHDRAWAL_AMOUNT) { + throw new Error(`Withdrawal amount "${amount}" is less than minimal allowed withdrawal amount "${MINIMAL_WITHDRAWAL_AMOUNT}"`); + } + + if (!this.client.wallet) { + throw new Error('Wallet is not initialized'); + } + + // Divide by 1000 as stated in policy for GetDustThreshold + // https://github.com/dashpay/dash/blob/master/src/policy/policy.cpp#L23 + const minRelayFeePerByte = Math.ceil(this.client.wallet.storage + .getDefaultChainStore().state.fees.minRelay / 1000); + + const coreFeePerByte = minRelayFeePerByte > MIN_ASSET_UNLOCK_CORE_FEE_PER_BYTE + ? nearestGreaterFibonacci(minRelayFeePerByte) : MIN_ASSET_UNLOCK_CORE_FEE_PER_BYTE; + + const revision = identity.getRevision(); + + const identityCreditWithdrawalTransition = dpp.identity + .createIdentityCreditWithdrawalTransition( + identity.getId(), + BigInt(amount), + coreFeePerByte, + DEFAULT_POOLING, + // @ts-ignore + outputScript.toBuffer(), + BigInt(revision + 1), + ); + + this.logger.silly('[Identity#creditWithdrawal] Created IdentityCreditWithdrawalTransition'); + + await signStateTransition( + this, + identityCreditWithdrawalTransition, + identity, + options.signingKeyIndex, + ); + + await broadcastStateTransition(this, identityCreditWithdrawalTransition, { + skipValidation: true, + }); + + this.logger.silly('[Identity#creditWithdrawal] Broadcasted IdentityCreditWithdrawalTransition'); + + return true; +} + +export default creditWithdrawal; diff --git a/packages/js-dash-sdk/src/utils/fibonacci.ts b/packages/js-dash-sdk/src/utils/fibonacci.ts index 22ceb5c1c4..3a8fd66b88 100644 --- a/packages/js-dash-sdk/src/utils/fibonacci.ts +++ b/packages/js-dash-sdk/src/utils/fibonacci.ts @@ -1,8 +1,16 @@ -const fibonacci = (n) => { +export const fibonacci = (n: number): number => { if (n < 2) { return n; } return fibonacci(n - 1) + fibonacci(n - 2); }; -export default fibonacci; +export const nearestGreaterFibonacci = (value: number) => { + const phi = (1 + Math.sqrt(5)) / 2; + + // Use the rearranged Binet's formula to find the nearest index + const n = Math.ceil(Math.log(value * Math.sqrt(5) + 0.5) / Math.log(phi)); + + // Calculate the Fibonacci number using Binet's formula + return Math.round(phi ** n / Math.sqrt(5)); +}; diff --git a/packages/platform-test-suite/package.json b/packages/platform-test-suite/package.json index d07d51f736..8ced829945 100644 --- a/packages/platform-test-suite/package.json +++ b/packages/platform-test-suite/package.json @@ -24,13 +24,14 @@ "homepage": "https://github.com/dashevo/platform-test-suite#readme", "dependencies": { "@dashevo/dapi-client": "workspace:*", - "@dashevo/dashcore-lib": "~0.21.0", + "@dashevo/dashcore-lib": "~0.21.1", "@dashevo/dpns-contract": "workspace:*", "@dashevo/feature-flags-contract": "workspace:*", "@dashevo/grpc-common": "workspace:*", "@dashevo/masternode-reward-shares-contract": "workspace:*", "@dashevo/wallet-lib": "workspace:*", "@dashevo/wasm-dpp": "workspace:*", + "@dashevo/withdrawals-contract": "workspace:*", "assert": "^2.0.0", "assert-browserify": "^2.0.0", "browserify-zlib": "^0.2.0", diff --git a/packages/platform-test-suite/test/e2e/withdrawals.spec.js b/packages/platform-test-suite/test/e2e/withdrawals.spec.js new file mode 100644 index 0000000000..50b3b43b82 --- /dev/null +++ b/packages/platform-test-suite/test/e2e/withdrawals.spec.js @@ -0,0 +1,243 @@ +const { expect } = require('chai'); + +const wait = require('@dashevo/dapi-client/lib/utils/wait'); +const { STATUSES: WITHDRAWAL_STATUSES } = require('dash/build/SDK/Client/Platform/methods/identities/creditWithdrawal'); + +const createClientWithFundedWallet = require('../../lib/test/createClientWithFundedWallet'); +const waitForSTPropagated = require('../../lib/waitForSTPropagated'); + +describe('Withdrawals', function withdrawalsTest() { + this.bail(true); + let client; + let identity; + + before(async () => { + client = await createClientWithFundedWallet( + 10000000, + ); + + await client.platform.initialize(); + }); + + after(async () => { + if (client) { + await client.disconnect(); + } + }); + + describe('Any Identity', () => { + const INITIAL_BALANCE = 1000000; + + before(async () => { + identity = await client.platform.identities.register(INITIAL_BALANCE); + + // Additional wait time to mitigate testnet latency + await waitForSTPropagated(); + }); + + it('should be able to withdraw credits', async () => { + const account = await client.getWalletAccount(); + const walletBalanceBefore = account.getTotalBalance(); + const identityBalanceBefore = identity.getBalance(); + const withdrawTo = await account.getUnusedAddress(); + const amountToWithdraw = 1000000; + + await client.platform.identities.withdrawCredits( + identity, + BigInt(amountToWithdraw), + withdrawTo.address, + ); + + // Re-fetch identity to obtain latest core chain lock height + identity = await client.platform.identities.get(identity.getId()); + const identityMetadata = identity.getMetadata().toObject(); + const { coreChainLockedHeight: initialCoreChainLockedHeight } = identityMetadata; + + // Wait for core chain lock update. + // After that drive should update document status to completed. + // (Wait 2 chainlocks on regtest since they are processed quicker, + // and withdrawal might not complete yet) + const chainLocksToWait = process.env.NETWORK === 'regtest' ? 2 : 1; + const { promise } = await client.platform.identities.utils + .waitForCoreChainLockedHeight(initialCoreChainLockedHeight + chainLocksToWait); + await promise; + + // Wait for document completion to propagate + await waitForSTPropagated(); + + // Wait for document status to be changed to COMPLETED. + let withdrawalCompleted = false; + let withdrawalDocument; + for (let i = 0; i < 10; i++) { + const withdrawals = await client.platform + .documents.get( + 'withdrawals.withdrawal', + { + where: [['$ownerId', '==', identity.getId()]], + }, + ); + + withdrawalDocument = withdrawals[withdrawals.length - 1]; + withdrawalCompleted = withdrawalDocument.get('status') === WITHDRAWAL_STATUSES.COMPLETED; + + if (withdrawalCompleted) { + break; + } + + await waitForSTPropagated(); + } + + expect(withdrawalCompleted).to.be.true(); + + const walletBalanceUpdated = account.getTotalBalance(); + + identity = await client.platform.identities.get(identity.getId()); + const identityBalanceUpdated = identity.getBalance(); + + // Should ensure balances are right + expect(walletBalanceUpdated).to.be.greaterThan(walletBalanceBefore); + expect(identityBalanceUpdated).to.be.lessThan(identityBalanceBefore); + + // Should allow deleting of the withdrawal document + await client.platform.documents.broadcast({ + delete: [withdrawalDocument], + }, identity); + }); + + it('should not be able to withdraw more than balance available', async () => { + const account = await client.getWalletAccount(); + const identityBalanceBefore = identity.getBalance(); + const withdrawTo = await account.getUnusedAddress(); + const amountToWithdraw = identityBalanceBefore * 2; + + await expect(client.platform.identities.withdrawCredits( + identity, + BigInt(amountToWithdraw), + withdrawTo.address, + )).to.be.rejectedWith(`Withdrawal amount "${amountToWithdraw}" is bigger that identity balance "${identityBalanceBefore}"`); + }); + + it('should not allow to create withdrawal with wrong security key type', async () => { + const account = await client.getWalletAccount(); + const identityBalanceBefore = identity.getBalance(); + const withdrawTo = await account.getUnusedAddress(); + const amountToWithdraw = identityBalanceBefore / 2; + + await expect(client.platform.identities.withdrawCredits( + identity, + BigInt(amountToWithdraw), + withdrawTo.address, + { + signingKeyIndex: 1, + }, + )).to.be.rejectedWith('Error conversion not implemented: Invalid public key security level HIGH. The state transition requires one of CRITICAL'); + }); + + it('should not be able to create withdrawal document', async () => { + const withdrawal = await client.platform.documents.create( + 'withdrawals.withdrawal', + identity, + { + amount: 1000, + coreFeePerByte: 1365, + pooling: 0, + outputScript: Buffer.alloc(23), + status: 0, + }, + ); + const stateTransition = client.platform.dpp.document.createStateTransition({ + create: [withdrawal], + }); + + stateTransition.setSignaturePublicKeyId(1); + + const account = await client.getWalletAccount(); + + const { privateKey } = account.identities.getIdentityHDKeyById( + identity.getId().toString(), + 1, + ); + + await stateTransition.sign( + identity.getPublicKeyById(1), + privateKey.toBuffer(), + ); + + try { + await client.platform.documents.broadcast({ + create: [withdrawal], + }, identity); + + expect.fail('should throw broadcast error'); + } catch (e) { + expect(e.message).to.be.equal('Action is not allowed'); + expect(e.code).to.equal(4001); + } + }); + + it('should not be able to delete incomplete withdrawal document', async () => { + const account = await client.getWalletAccount(); + const withdrawTo = await account.getUnusedAddress(); + + await client.platform.identities.withdrawCredits( + identity, + BigInt(1000000), + withdrawTo.address, + ); + + await waitForSTPropagated(); + + let withdrawalBroadcasted = false; + let withdrawalDocument; + // Wait for withdrawal to broadcast, otherwise there's a chance + // that test will try update document at the same time with the drive itself + while (!withdrawalBroadcasted) { + ([withdrawalDocument] = await client.platform + .documents.get( + 'withdrawals.withdrawal', + { + where: [['$ownerId', '==', identity.getId()]], + }, + )); + + withdrawalBroadcasted = withdrawalDocument.get('status') === WITHDRAWAL_STATUSES.BROADCASTED; + + await wait(1000); + } + + try { + await client.platform.documents.broadcast({ + delete: [withdrawalDocument], + }, identity); + + expect.fail('should throw broadcast error'); + } catch (e) { + expect(e.message).to.be.equal('withdrawal deletion is allowed only for COMPLETE statuses'); + expect(e.code).to.equal(4001); + } + }); + + it('should not be able to update withdrawal document', async () => { + const [withdrawalDocument] = await client.platform + .documents.get( + 'withdrawals.withdrawal', + { + where: [['$ownerId', '==', identity.getId()]], + }, + ); + + withdrawalDocument.set('status', 3); + + try { + await client.platform.documents.broadcast({ + replace: [withdrawalDocument], + }, identity); + + expect.fail('should throw broadcast error'); + } catch (e) { + expect(e.message).to.be.equal('Action is not allowed'); + expect(e.code).to.equal(4001); + } + }); + }); +}); diff --git a/packages/rs-dpp/src/balances/credits.rs b/packages/rs-dpp/src/balances/credits.rs index 6febee1005..e9568bec74 100644 --- a/packages/rs-dpp/src/balances/credits.rs +++ b/packages/rs-dpp/src/balances/credits.rs @@ -25,6 +25,8 @@ pub type SignedCredits = i64; pub const MAX_CREDITS: Credits = 9223372036854775807 as Credits; //i64 Max +pub const CREDITS_PER_DUFF: Credits = 1000; + /// Trait for signed and unsigned credits pub trait Creditable { diff --git a/packages/rs-dpp/src/errors/consensus/basic/identity/invalid_identity_credit_withdrawal_transition_core_fee_error.rs b/packages/rs-dpp/src/errors/consensus/basic/identity/invalid_identity_credit_withdrawal_transition_core_fee_error.rs index 357b3389fd..2c3be767a3 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/identity/invalid_identity_credit_withdrawal_transition_core_fee_error.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/identity/invalid_identity_credit_withdrawal_transition_core_fee_error.rs @@ -10,7 +10,7 @@ use bincode::{Decode, Encode}; #[derive( Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, )] -#[error("Core fee per byte {core_fee_per_byte:?} must be part of fibonacci sequence")] +#[error("Core fee per byte {core_fee_per_byte:?} must be part of fibonacci sequence and not less than {min_core_fee_per_byte:?}")] #[platform_serialize(unversioned)] pub struct InvalidIdentityCreditWithdrawalTransitionCoreFeeError { /* @@ -19,16 +19,23 @@ pub struct InvalidIdentityCreditWithdrawalTransitionCoreFeeError { */ core_fee_per_byte: u32, + min_core_fee_per_byte: u32, } impl InvalidIdentityCreditWithdrawalTransitionCoreFeeError { - pub fn new(core_fee_per_byte: u32) -> Self { - Self { core_fee_per_byte } + pub fn new(core_fee_per_byte: u32, min_core_fee_per_byte: u32) -> Self { + Self { + core_fee_per_byte, + min_core_fee_per_byte, + } } pub fn core_fee_per_byte(&self) -> u32 { self.core_fee_per_byte } + pub fn min_core_fee_per_byte(&self) -> u32 { + self.min_core_fee_per_byte + } } impl From for ConsensusError { diff --git a/packages/rs-dpp/src/identity/identity_facade.rs b/packages/rs-dpp/src/identity/identity_facade.rs index d3899bda96..d3de538006 100644 --- a/packages/rs-dpp/src/identity/identity_facade.rs +++ b/packages/rs-dpp/src/identity/identity_facade.rs @@ -5,7 +5,7 @@ use std::collections::BTreeMap; use crate::identity::state_transition::asset_lock_proof::chain::ChainAssetLockProof; use crate::identity::state_transition::asset_lock_proof::{AssetLockProof, InstantAssetLockProof}; use crate::identity::{Identity, IdentityPublicKey, KeyID, TimestampMillis}; -use crate::prelude::Identifier; +use crate::prelude::{Identifier, Revision}; use crate::identity::identity_factory::IdentityFactory; #[cfg(feature = "state-transitions")] @@ -19,6 +19,9 @@ use crate::state_transition::identity_update_transition::IdentityUpdateTransitio #[cfg(feature = "state-transitions")] use crate::state_transition::public_key_in_creation::IdentityPublicKeyInCreation; +use crate::identity::core_script::CoreScript; +use crate::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition; +use crate::withdrawal::Pooling; use crate::ProtocolError; #[derive(Clone)] @@ -109,6 +112,26 @@ impl IdentityFacade { .create_identity_credit_transfer_transition(identity, recipient_id, amount) } + #[cfg(feature = "state-transitions")] + pub fn create_identity_credit_withdrawal_transition( + &self, + identity_id: Identifier, + amount: u64, + core_fee_per_byte: u32, + pooling: Pooling, + output_script: CoreScript, + revision: Revision, + ) -> Result { + self.factory.create_identity_credit_withdrawal_transition( + identity_id, + amount, + core_fee_per_byte, + pooling, + output_script, + revision, + ) + } + #[cfg(feature = "state-transitions")] pub fn create_identity_update_transition( &self, diff --git a/packages/rs-dpp/src/identity/identity_factory.rs b/packages/rs-dpp/src/identity/identity_factory.rs index b00060d7f3..8384f55ae1 100644 --- a/packages/rs-dpp/src/identity/identity_factory.rs +++ b/packages/rs-dpp/src/identity/identity_factory.rs @@ -23,6 +23,8 @@ use crate::identity::accessors::IdentityGettersV0; #[cfg(all(feature = "validation", feature = "identity-value-conversion"))] use crate::identity::conversion::platform_value::IdentityPlatformValueConversionMethodsV0; +use crate::identity::core_script::CoreScript; +use crate::prelude::Revision; #[cfg(all(feature = "identity-serialization", feature = "client"))] use crate::serialization::PlatformDeserializable; #[cfg(all(feature = "state-transitions", feature = "client"))] @@ -33,6 +35,8 @@ use crate::state_transition::identity_create_transition::IdentityCreateTransitio use crate::state_transition::identity_credit_transfer_transition::v0::IdentityCreditTransferTransitionV0; #[cfg(all(feature = "state-transitions", feature = "client"))] use crate::state_transition::identity_credit_transfer_transition::IdentityCreditTransferTransition; +use crate::state_transition::identity_credit_withdrawal_transition::v0::IdentityCreditWithdrawalTransitionV0; +use crate::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition; #[cfg(all(feature = "state-transitions", feature = "client"))] use crate::state_transition::identity_topup_transition::accessors::IdentityTopUpTransitionAccessorsV0; #[cfg(all(feature = "state-transitions", feature = "client"))] @@ -48,6 +52,7 @@ use crate::state_transition::identity_update_transition::IdentityUpdateTransitio #[cfg(all(feature = "state-transitions", feature = "client"))] use crate::state_transition::public_key_in_creation::IdentityPublicKeyInCreation; use crate::version::PlatformVersion; +use crate::withdrawal::Pooling; #[cfg(any( all(feature = "identity-serialization", feature = "client"), feature = "identity-value-conversion" @@ -212,6 +217,30 @@ impl IdentityFactory { )) } + #[cfg(all(feature = "state-transitions", feature = "client"))] + pub fn create_identity_credit_withdrawal_transition( + &self, + identity_id: Identifier, + amount: u64, + core_fee_per_byte: u32, + pooling: Pooling, + output_script: CoreScript, + revision: Revision, + ) -> Result { + let mut identity_credit_withdrawal_transition = + IdentityCreditWithdrawalTransitionV0::default(); + identity_credit_withdrawal_transition.identity_id = identity_id; + identity_credit_withdrawal_transition.amount = amount; + identity_credit_withdrawal_transition.core_fee_per_byte = core_fee_per_byte; + identity_credit_withdrawal_transition.pooling = pooling; + identity_credit_withdrawal_transition.output_script = output_script; + identity_credit_withdrawal_transition.revision = revision; + + Ok(IdentityCreditWithdrawalTransition::from( + identity_credit_withdrawal_transition, + )) + } + #[cfg(all(feature = "state-transitions", feature = "client"))] pub fn create_identity_update_transition( &self, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/accessors/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/accessors/mod.rs index 187a59c4ae..60b8d22f97 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/accessors/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/accessors/mod.rs @@ -16,12 +16,28 @@ impl IdentityCreditWithdrawalTransitionAccessorsV0 for IdentityCreditWithdrawalT } } + fn set_identity_id(&mut self, identity_id: Identifier) { + match self { + IdentityCreditWithdrawalTransition::V0(transition) => { + transition.identity_id = identity_id; + } + } + } + fn amount(&self) -> u64 { match self { IdentityCreditWithdrawalTransition::V0(transition) => transition.amount, } } + fn set_amount(&mut self, amount: u64) { + match self { + IdentityCreditWithdrawalTransition::V0(transition) => { + transition.amount = amount; + } + } + } + fn set_revision(&mut self, revision: Revision) { match self { IdentityCreditWithdrawalTransition::V0(transition) => transition.revision = revision, @@ -40,15 +56,39 @@ impl IdentityCreditWithdrawalTransitionAccessorsV0 for IdentityCreditWithdrawalT } } + fn set_pooling(&mut self, pooling: Pooling) { + match self { + IdentityCreditWithdrawalTransition::V0(transition) => { + transition.pooling = pooling; + } + } + } + fn core_fee_per_byte(&self) -> u32 { match self { IdentityCreditWithdrawalTransition::V0(transition) => transition.core_fee_per_byte, } } + fn set_core_fee_per_byte(&mut self, core_fee_per_byte: u32) { + match self { + IdentityCreditWithdrawalTransition::V0(transition) => { + transition.core_fee_per_byte = core_fee_per_byte; + } + } + } + fn output_script(&self) -> CoreScript { match self { IdentityCreditWithdrawalTransition::V0(transition) => transition.output_script.clone(), } } + + fn set_output_script(&mut self, output_script: CoreScript) { + match self { + IdentityCreditWithdrawalTransition::V0(transition) => { + transition.output_script = output_script; + } + } + } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/accessors/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/accessors/v0/mod.rs index f59529f8f8..540c1e8bb8 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/accessors/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/accessors/v0/mod.rs @@ -5,10 +5,15 @@ use platform_value::Identifier; pub trait IdentityCreditWithdrawalTransitionAccessorsV0 { fn identity_id(&self) -> Identifier; + fn set_identity_id(&mut self, identity_id: Identifier); fn amount(&self) -> u64; - fn set_revision(&mut self, revision: Revision); + fn set_amount(&mut self, amount: u64); fn revision(&self) -> Revision; + fn set_revision(&mut self, revision: Revision); fn pooling(&self) -> Pooling; + fn set_pooling(&mut self, pooling: Pooling); fn core_fee_per_byte(&self) -> u32; + fn set_core_fee_per_byte(&mut self, amount: u32); fn output_script(&self) -> CoreScript; + fn set_output_script(&mut self, output_script: CoreScript); } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/mod.rs index 87786d4a3e..0f9533af4a 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/mod.rs @@ -1,7 +1,7 @@ use crate::state_transition::identity_credit_withdrawal_transition::v0::IdentityCreditWithdrawalTransitionV0; pub mod accessors; -mod fields; +pub mod fields; mod identity_signed; #[cfg(feature = "state-transition-json-conversion")] mod json_conversion; @@ -22,6 +22,7 @@ use data_contracts::withdrawals_contract::v1::document_types::withdrawal::proper use derive_more::From; use fields::*; use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize, PlatformSignable}; +use platform_version::version::PlatformVersion; use platform_versioning::PlatformVersioned; use serde::{Deserialize, Serialize}; @@ -53,6 +54,25 @@ pub enum IdentityCreditWithdrawalTransition { V0(IdentityCreditWithdrawalTransitionV0), } +impl IdentityCreditWithdrawalTransition { + pub fn default_versioned(platform_version: &PlatformVersion) -> Result { + match platform_version + .dpp + .identity_versions + .identity_structure_version + { + 0 => Ok(IdentityCreditWithdrawalTransition::V0( + IdentityCreditWithdrawalTransitionV0::default(), + )), + version => Err(ProtocolError::UnknownVersionMismatch { + method: "IdentityCreditWithdrawalTransition::default_versioned".to_string(), + known_versions: vec![0], + received: version, + }), + } + } +} + impl StateTransitionFieldTypes for IdentityCreditWithdrawalTransition { fn signature_property_paths() -> Vec<&'static str> { vec![SIGNATURE, SIGNATURE_PUBLIC_KEY_ID] diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/mod.rs index 485801e548..33caa66c3d 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/mod.rs @@ -8,17 +8,26 @@ mod value_conversion; mod version; use bincode::{Decode, Encode}; +use dashcore::transaction::special_transaction::asset_unlock::qualified_asset_unlock::ASSET_UNLOCK_TX_SIZE; use platform_serialization_derive::PlatformSignable; use platform_value::BinaryData; use serde::{Deserialize, Serialize}; +use crate::balances::credits::CREDITS_PER_DUFF; use crate::{ identity::{core_script::CoreScript, KeyID}, prelude::{Identifier, Revision}, + withdrawal::Pooling, ProtocolError, }; -use crate::withdrawal::Pooling; +// TODO: unsafe - we must use actual relay fee from core +/// Minimal core per byte. Must be a fibonacci number +pub const MIN_CORE_FEE_PER_BYTE: u32 = 5; + +/// Minimal amount in credits (x1000) to avoid "dust" error in Core +pub const MIN_WITHDRAWAL_AMOUNT: u64 = + (ASSET_UNLOCK_TX_SIZE as u64) * (MIN_CORE_FEE_PER_BYTE as u64) * CREDITS_PER_DUFF; #[derive(Debug, Clone, Encode, Decode, PlatformSignable, PartialEq)] #[cfg_attr( diff --git a/packages/rs-dpp/src/state_transition/traits/state_transition_like.rs b/packages/rs-dpp/src/state_transition/traits/state_transition_like.rs index 28d53f16dc..d9282eeb2f 100644 --- a/packages/rs-dpp/src/state_transition/traits/state_transition_like.rs +++ b/packages/rs-dpp/src/state_transition/traits/state_transition_like.rs @@ -11,11 +11,12 @@ use crate::state_transition::{StateTransition, StateTransitionFieldTypes}; pub const DOCUMENT_TRANSITION_TYPES: [StateTransitionType; 1] = [StateTransitionType::DocumentsBatch]; -pub const IDENTITY_TRANSITION_TYPE: [StateTransitionType; 4] = [ +pub const IDENTITY_TRANSITION_TYPE: [StateTransitionType; 5] = [ StateTransitionType::IdentityCreate, StateTransitionType::IdentityTopUp, StateTransitionType::IdentityUpdate, StateTransitionType::IdentityCreditTransfer, + StateTransitionType::IdentityCreditWithdrawal, ]; pub const DATA_CONTRACT_TRANSITION_TYPES: [StateTransitionType; 2] = [ diff --git a/packages/rs-dpp/src/util/is_fibonacci_number.rs b/packages/rs-dpp/src/util/is_fibonacci_number.rs index fab42b9387..4c736e0a9a 100644 --- a/packages/rs-dpp/src/util/is_fibonacci_number.rs +++ b/packages/rs-dpp/src/util/is_fibonacci_number.rs @@ -1,7 +1,20 @@ -fn is_perfect_square(number: u32) -> bool { +fn is_perfect_square(number: u64) -> bool { (number as f64).sqrt().fract() == 0.0 } -pub fn is_fibonacci_number(number: u32) -> bool { - is_perfect_square(5 * number * number + 4) || is_perfect_square(5 * number * number - 4) +pub fn is_fibonacci_number(number: u64) -> bool { + let square_check_up = 5u64 + .checked_mul(number) + .and_then(|n| n.checked_mul(number)) + .and_then(|n| n.checked_add(4)); + + let square_check_down = 5u64 + .checked_mul(number) + .and_then(|n| n.checked_mul(number)) + .and_then(|n| n.checked_sub(4)); + + match (square_check_up, square_check_down) { + (Some(n1), Some(n2)) => is_perfect_square(n1) || is_perfect_square(n2), + _ => false, // Return false if either calculation overflows + } } diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index 10f1ec4744..5e8d4954b8 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -35,13 +35,12 @@ bs58 = "0.4.0" hex = "0.4.3" indexmap = { version = "1.9.3", features = ["serde"] } sha2 = "0.10.6" -dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", branch = "master" } +dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.2" } dpp = { path = "../rs-dpp", features = ["abci"] } simple-signer = { path = "../simple-signer" } rust_decimal = "1.2.5" rust_decimal_macros = "1.25.0" mockall = { version = "0.11", optional = true } -bytes = { version = "1.4.0", default-features = false } prost = { version = "0.11.6", default-features = false } tracing = { version = "0.1.37", default-features = false, features = [] } clap = { version = "4.1.8", optional = true, features = ["derive"] } @@ -58,7 +57,7 @@ tracing-subscriber = { version = "0.3.16", default-features = false, features = "tracing-log", ], optional = false } atty = { version = "0.2.14", optional = false } -tenderdash-abci = { git = "https://github.com/dashpay/rs-tenderdash-abci", rev = "251386f9e4109c89ca628226c981c489b80aed80" } +tenderdash-abci = { git = "https://github.com/dashpay/rs-tenderdash-abci", tag = "v0.14.0-dev.6" } lazy_static = "1.4.0" itertools = { version = "0.10.5" } file-rotate = { version = "0.7.3" } diff --git a/packages/rs-drive-abci/src/abci/error.rs b/packages/rs-drive-abci/src/abci/error.rs index 800ee6eaed..9f0c31d663 100644 --- a/packages/rs-drive-abci/src/abci/error.rs +++ b/packages/rs-drive-abci/src/abci/error.rs @@ -1,4 +1,6 @@ use dpp::bls_signatures::BlsError; +use tenderdash_abci::proto::abci::ExtendVoteExtension; +use tenderdash_abci::proto::types::VoteExtension; // @append_only /// Error returned within ABCI server @@ -10,10 +12,13 @@ pub enum AbciError { /// Request does not match currently processed block #[error("request does not match current block: {0}")] RequestForWrongBlockReceived(String), - /// Withdrawal transactions mismatch + /// Withdrawal vote extensions mismatch #[error("vote extensions mismatch: got {got:?}, expected {expected:?}")] #[allow(missing_docs)] - VoteExtensionMismatchReceived { got: String, expected: String }, + VoteExtensionMismatchReceived { + got: Vec, + expected: Vec, + }, /// Vote extensions signature is invalid #[error("one of vote extension signatures is invalid")] VoteExtensionsSignatureInvalid, diff --git a/packages/rs-drive-abci/src/abci/handler/mod.rs b/packages/rs-drive-abci/src/abci/handler/mod.rs index 514f046b87..8797a3b726 100644 --- a/packages/rs-drive-abci/src/abci/handler/mod.rs +++ b/packages/rs-drive-abci/src/abci/handler/mod.rs @@ -40,7 +40,10 @@ mod execution_result; use crate::abci::server::AbciApplication; use crate::error::execution::ExecutionError; +use dashcore_rpc::dashcore::consensus::Encodable; +use dashcore_rpc::dashcore::hashes::HashEngine; +use super::AbciError; use crate::error::Error; use crate::rpc::core::CoreRPCLike; use dpp::errors::consensus::codes::ErrorWithCode; @@ -48,14 +51,12 @@ use tenderdash_abci::proto::abci as proto; use tenderdash_abci::proto::abci::response_verify_vote_extension::VerifyStatus; use tenderdash_abci::proto::abci::tx_record::TxAction; use tenderdash_abci::proto::abci::{ - ExecTxResult, RequestCheckTx, RequestFinalizeBlock, RequestInitChain, RequestPrepareProposal, - RequestProcessProposal, RequestQuery, ResponseCheckTx, ResponseFinalizeBlock, - ResponseInitChain, ResponsePrepareProposal, ResponseProcessProposal, ResponseQuery, TxRecord, + ExecTxResult, ExtendVoteExtension, RequestCheckTx, RequestFinalizeBlock, RequestInitChain, + RequestPrepareProposal, RequestProcessProposal, RequestQuery, ResponseCheckTx, + ResponseFinalizeBlock, ResponseInitChain, ResponsePrepareProposal, ResponseProcessProposal, + ResponseQuery, TxRecord, }; use tenderdash_abci::proto::types::CoreChainLock; -use tenderdash_abci::proto::types::VoteExtensionType; - -use super::AbciError; use crate::execution::types::block_execution_context::v0::{ BlockExecutionContextV0Getters, BlockExecutionContextV0MutableGetters, @@ -69,7 +70,6 @@ use crate::platform_types::block_proposal::v0::BlockProposal; use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::platform_types::platform_state::PlatformState; use crate::platform_types::state_transitions_processing_result::StateTransitionExecutionResult; -use crate::platform_types::withdrawal::withdrawal_txs; use dpp::dashcore::hashes::Hash; use dpp::fee::SignedCredits; use dpp::version::TryIntoPlatformVersioned; @@ -275,11 +275,10 @@ where // We need to let Tenderdash know about the transactions we should remove from execution let valid_tx_count = state_transitions_result.valid_count(); - let invalid_all_tx_count = state_transitions_result.invalid_count(); let failed_tx_count = state_transitions_result.failed_count(); let delayed_tx_count = transactions_exceeding_max_block_size.len(); - let mut invalid_paid_tx_count = state_transitions_result.invalid_count(); - let mut invalid_unpaid_tx_count = state_transitions_result.invalid_count(); + let invalid_paid_tx_count = state_transitions_result.invalid_paid_count(); + let invalid_unpaid_tx_count = state_transitions_result.invalid_unpaid_count(); let mut tx_results = Vec::new(); let mut tx_records = Vec::new(); @@ -292,21 +291,13 @@ where let tx_action = match &state_transition_execution_result { StateTransitionExecutionResult::SuccessfulExecution(_, _) => TxAction::Unmodified, // We have identity to pay for the state transition, so we keep it in the block - StateTransitionExecutionResult::PaidConsensusError(_) => { - invalid_paid_tx_count += 1; - - TxAction::Unmodified - } + StateTransitionExecutionResult::PaidConsensusError(_) => TxAction::Unmodified, // We don't have any associated identity to pay for the state transition, // so we remove it from the block to prevent spam attacks. // Such state transitions must be invalidated by check tx, but they might // still be added to mempool due to inconsistency between check tx and tx processing // (fees calculation) or malicious proposer. - StateTransitionExecutionResult::UnpaidConsensusError(_) => { - invalid_unpaid_tx_count += 1; - - TxAction::Removed - } + StateTransitionExecutionResult::UnpaidConsensusError(_) => TxAction::Removed, // We shouldn't include in the block any state transitions that produced an internal error // during execution StateTransitionExecutionResult::DriveAbciError(_) => TxAction::Removed, @@ -365,7 +356,6 @@ where valid_tx_count, delayed_tx_count, failed_tx_count, - invalid_unpaid_tx_count, "Prepared proposal with {} transitions for height: {}, round: {} in {} ms", valid_tx_count + invalid_paid_tx_count, request.height, @@ -558,7 +548,7 @@ where let platform_version = PlatformVersion::get(protocol_version) .expect("must be set in run block proposer from existing platform version"); - let invalid_tx_count = state_transition_results.invalid_count(); + let invalid_tx_count = state_transition_results.invalid_paid_count(); let valid_tx_count = state_transition_results.valid_count(); let tx_results = state_transition_results @@ -630,27 +620,21 @@ where round as u32, block_hash.clone(), )? { - Err(Error::from(AbciError::RequestForWrongBlockReceived(format!( + return Err(Error::from(AbciError::RequestForWrongBlockReceived(format!( "received extend vote request for height: {} round: {}, block: {}; expected height: {} round: {}, block: {}", height, round, hex::encode(block_hash), block_state_info.height(), block_state_info.round(), block_state_info.block_hash().map(hex::encode).unwrap_or("None".to_string()) ))) - .into()) - } else { - // we only want to sign the hash of the transaction - let extensions = block_execution_context - .withdrawal_transactions() - .keys() - .map(|tx_id| proto::ExtendVoteExtension { - r#type: VoteExtensionType::ThresholdRecover as i32, - extension: tx_id.to_byte_array().to_vec(), - sign_request_id: None, - }) - .collect(); - Ok(proto::ResponseExtendVote { - vote_extensions: extensions, - }) + .into()); } + + // Extend vote with unsigned withdrawal transactions + // we only want to sign the hash of the transaction + let vote_extensions = block_execution_context + .unsigned_withdrawal_transactions() + .into(); + + Ok(proto::ResponseExtendVote { vote_extensions }) } /// Todo: Verify vote extension not really needed because extend vote is deterministic @@ -660,6 +644,7 @@ where ) -> Result { let _timer = crate::metrics::abci_request_duration("verify_vote_extension"); + // Verify that this is a vote extension for our current executed block and our proposer let proto::RequestVerifyVoteExtension { height, round, @@ -670,10 +655,11 @@ where let height: u64 = height as u64; let round: u32 = round as u32; + // Make sure we are in a block execution phase let guarded_block_execution_context = self.platform.block_execution_context.read().unwrap(); let Some(block_execution_context) = guarded_block_execution_context.as_ref() else { tracing::warn!( - "vote extension for height: {}, round: {} is rejected because we are not in a block execution phase", + "vote extensions for height: {}, round: {} are rejected because we are not in a block execution phase", height, round, ); @@ -683,52 +669,20 @@ where }); }; - let platform_version = block_execution_context - .block_platform_state() - .current_platform_version()?; - - let got: withdrawal_txs::v0::WithdrawalTxs = vote_extensions.into(); - let expected = block_execution_context - .withdrawal_transactions() - .keys() - .map(|tx_id| proto::ExtendVoteExtension { - r#type: VoteExtensionType::ThresholdRecover as i32, - extension: tx_id.to_byte_array().to_vec(), - sign_request_id: None, - }) - .collect::>() - .into(); - - // let state = self.platform.state.read().unwrap(); - // - // let quorum = state.current_validator_set()?; - - // let validator_pro_tx_hash = ProTxHash::from_slice(validator_pro_tx_hash.as_slice()) - // .map_err(|_| { - // Error::Abci(AbciError::BadRequestDataSize(format!( - // "invalid vote extension protxhash: {}", - // hex::encode(validator_pro_tx_hash.as_slice()) - // ))) - // })?; - // - // let Some(validator) = quorum.validator_set.get(&validator_pro_tx_hash) else { - // return Ok(proto::ResponseVerifyVoteExtension { - // status: VerifyStatus::Unknown.into(), - // }); - // }; + // Make sure vote extension is for our currently executing block let block_state_info = block_execution_context.block_state_info(); - //// Verification that vote extension is for our current executed block - // When receiving the vote extension, we need to make sure that info matches our current block - - if block_state_info.height() != height || block_state_info.round() != round { + // We might get vote extension to verify for previous (in case if other node is behind) + // or future round (in case if the current node is behind), so we make sure that only height + // is matching. It's fine because withdrawal transactions to sign are the same for any round + // of the same height + if block_state_info.height() != height { tracing::warn!( - "vote extension for height: {}, round: {} is rejected because we are at height: {} round {}", + "vote extensions for height: {}, round: {} are rejected because we are at height: {}", height, round, block_state_info.height(), - block_state_info.round() ); return Ok(proto::ResponseVerifyVoteExtension { @@ -736,39 +690,35 @@ where }); } - let validation_result = self.platform.check_withdrawals( - &got, - &expected, - height as u64, - round as u32, - None, - None, - platform_version, - )?; + // Verify that a validator is requesting a signatures + // for a correct set of withdrawal transactions - if validation_result.is_valid() { - tracing::debug!( - "vote extension for height: {}, round: {} is successfully verified", - height, - round, - ); + let expected_withdrawals = block_execution_context.unsigned_withdrawal_transactions(); + + if expected_withdrawals != &vote_extensions { + let expected_extensions: Vec = expected_withdrawals.into(); - Ok(proto::ResponseVerifyVoteExtension { - status: VerifyStatus::Accept.into(), - }) - } else { tracing::error!( - ?got, - ?expected, - ?validation_result.errors, - "vote extension for height: {}, round: {} mismatch", + received_extensions = ?vote_extensions, + ?expected_extensions, + "vote extensions for height: {}, round: {} mismatch", height, round ); - Ok(proto::ResponseVerifyVoteExtension { + return Ok(proto::ResponseVerifyVoteExtension { status: VerifyStatus::Reject.into(), - }) + }); } + + tracing::debug!( + "vote extensions for height: {}, round: {} are successfully verified", + height, + round, + ); + + Ok(proto::ResponseVerifyVoteExtension { + status: VerifyStatus::Accept.into(), + }) } fn finalize_block( diff --git a/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/v0/mod.rs b/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/v0/mod.rs index b949f9c760..b807a1e564 100644 --- a/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/v0/mod.rs @@ -1,3 +1,4 @@ +use dashcore_rpc::dashcore::transaction::special_transaction::TransactionPayload::AssetUnlockPayloadType; use dpp::block::epoch::Epoch; use dpp::validation::SimpleValidationResult; @@ -8,6 +9,9 @@ use dpp::block::block_info::BlockInfo; use dpp::block::extended_block_info::v0::ExtendedBlockInfoV0; use dpp::version::PlatformVersion; +use dpp::dashcore::bls_sig_utils::BLSSignature; +use dpp::dashcore::consensus::Encodable; +use dpp::dashcore::hashes::Hash; use tenderdash_abci::{ proto::{serializers::timestamp::ToMilis, types::BlockId as ProtoBlockId}, signatures::Hashable, @@ -17,7 +21,9 @@ use crate::abci::AbciError; use crate::error::execution::ExecutionError; use crate::error::Error; -use crate::execution::types::block_execution_context::v0::BlockExecutionContextV0Getters; +use crate::execution::types::block_execution_context::v0::{ + BlockExecutionContextV0Getters, BlockExecutionContextV0MutableGetters, +}; use crate::execution::types::block_state_info::v0::{ BlockStateInfoV0Getters, BlockStateInfoV0Methods, }; @@ -56,7 +62,7 @@ where /// pub(super) fn finalize_block_proposal_v0( &self, - request_finalize_block: FinalizeBlockCleanedRequest, + mut request_finalize_block: FinalizeBlockCleanedRequest, transaction: &Transaction, _platform_version: &PlatformVersion, ) -> Result { @@ -81,7 +87,7 @@ where // Let's decompose the request let FinalizeBlockCleanedRequest { - commit: commit_info, + commit: mut commit_info, misbehavior: _, hash, height, @@ -105,7 +111,7 @@ where .expect("invalid sha256 length"); //// Verification that commit is for our current executed block - // When receiving the finalized block, we need to make sure that info matches our current block + // When receiving the finalized block, we need to make sure info matches our current block // First let's check the basics, height, round and hash if !block_state_info.matches_expected_block_info( @@ -140,7 +146,23 @@ where return Ok(validation_result.into()); } - let quorum_public_key = &state_cache.current_validator_set()?.threshold_public_key(); + // Verify vote extensions + // We don't need to verify vote extension signatures once again after tenderdash + // here, because we will do it bellow broadcasting withdrawal transactions. + // The sendrawtransaction RPC method returns an error if quorum signature is invalid + let expected_withdrawal_transactions = + block_execution_context.unsigned_withdrawal_transactions(); + + if !expected_withdrawal_transactions + .are_matching_with_vote_extensions(&commit_info.threshold_vote_extensions) + { + validation_result.add_error(AbciError::VoteExtensionMismatchReceived { + got: commit_info.threshold_vote_extensions, + expected: expected_withdrawal_transactions.into(), + }); + + return Ok(validation_result.into()); + } // In production this will always be true if self @@ -150,7 +172,9 @@ where { // Verify commit + let quorum_public_key = &state_cache.current_validator_set()?.threshold_public_key(); let quorum_type = self.config.validator_set_quorum_type(); + // TODO: We already had commit in the function above, why do we need to create it again with clone? let commit = Commit::new_from_cleaned( commit_info.clone(), block_id, @@ -168,23 +192,6 @@ where } drop(state_cache); - // Verify vote extensions - // let received_withdrawals = WithdrawalTxs::from(&commit.threshold_vote_extensions); - // let our_withdrawals = WithdrawalTxs::load(Some(transaction), &self.drive) - // .map_err(|e| AbciError::WithdrawalTransactionsDBLoadError(e.to_string()))?; - //todo: reenable check - // - // if let Err(e) = self.check_withdrawals( - // &received_withdrawals, - // &our_withdrawals, - // Some(quorum_public_key), - // ) { - // validation_result.add_error(e); - // return Ok(validation_result.into()); - // } - - // Next let's check that the hash received is the same as the hash we expect - if height == self.config.abci.genesis_height { self.drive .set_genesis_time(block_state_info.block_time_ms()); @@ -195,17 +202,56 @@ where .expect("current epoch info should be in range"), ); - // we need to add the block time to_commit_block_info.time_ms = block_header.time.to_milis(); to_commit_block_info.core_height = block_header.core_chain_locked_height; - // // Finalize withdrawal processing - // our_withdrawals.finalize(Some(transaction), &self.drive, &to_commit_block_info)?; + drop(guarded_block_execution_context); - // At the end we update the state cache + // Append signatures and broadcast asset unlock transactions to Core - drop(guarded_block_execution_context); + // Borrow execution context as mutable + let mut mutable_block_execution_context_guard = + self.block_execution_context.write().unwrap(); + let mutable_block_execution_context = + mutable_block_execution_context_guard + .as_mut() + .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( + "block execution context must be set in block begin handler for finalize block proposal", + )))?; + + // Drain withdrawal transaction instead of cloning + let unsigned_withdrawal_transactions = mutable_block_execution_context + .unsigned_withdrawal_transactions_mut() + .drain(); + + drop(mutable_block_execution_context_guard); + + // Drain signatures instead of cloning + let signatures = commit_info + .threshold_vote_extensions + .drain(..) + .into_iter() + .map(|vote_extension| { + let signature_bytes: [u8; 96] = + vote_extension.signature.try_into().map_err(|e| { + AbciError::BadRequestDataSize(format!( + "invalid vote extension signature size: {}", + hex::encode(e) + )) + })?; + + Ok(BLSSignature::from(signature_bytes)) + }) + .collect::>()?; + + self.append_signatures_and_broadcast_withdrawal_transactions( + unsigned_withdrawal_transactions, + signatures, + platform_version, + )?; + + // Update platform (drive abci) state let extended_block_info = ExtendedBlockInfoV0 { basic_info: to_commit_block_info, diff --git a/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs b/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs index b10494886a..8c06b7344f 100644 --- a/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs @@ -1,6 +1,3 @@ -use dashcore_rpc::dashcore::hashes::Hash; -use dashcore_rpc::dashcore::Txid; - use dpp::block::epoch::Epoch; use dpp::validation::ValidationResult; @@ -8,7 +5,6 @@ use drive::error::Error::GroveDB; use dpp::version::PlatformVersion; use drive::grovedb::Transaction; -use std::collections::BTreeMap; use crate::abci::AbciError; use crate::error::execution::ExecutionError; @@ -238,7 +234,7 @@ where block_state_info: block_state_info.into(), epoch_info: epoch_info.clone(), hpmn_count: hpmn_list_len as u32, - withdrawal_transactions: BTreeMap::new(), + unsigned_withdrawal_transactions: Default::default(), block_platform_state, proposer_results: None, }; @@ -320,43 +316,38 @@ where let mut block_execution_context: BlockExecutionContext = block_execution_context.into(); - // >>>>>> Withdrawal Status Update <<<<<<< - // Only update the broadcasted withdrawal statuses if the core chain lock height has - // changed. If it hasn't changed there should be no way a status could update - + // Mark all previously broadcasted and chainlocked withdrawals as complete + // only when we are on a new core height if block_execution_context .block_state_info() .core_chain_locked_height() != last_block_core_height { - self.update_broadcasted_withdrawal_transaction_statuses( - &block_execution_context, + self.update_broadcasted_withdrawal_statuses( + &block_info, transaction, platform_version, )?; } - // This takes withdrawals from the transaction queue - let unsigned_withdrawal_transaction_bytes = self - .fetch_and_prepare_unsigned_withdrawal_transactions( - validator_set_quorum_hash, - &block_execution_context, - transaction, - platform_version, - )?; + // Preparing withdrawal transactions for signing and broadcasting + { + // To process withdrawals we need to dequeue untiled transactions from the withdrawal transactions queue + // Untiled transactions then converted to unsigned transactions, appending current block information + // required for signature verification (core height and quorum hash) + let unsigned_withdrawal_transaction_bytes = self + .dequeue_and_build_unsigned_withdrawal_transactions( + validator_set_quorum_hash, + &block_info, + Some(transaction), + platform_version, + )?; - // Set the withdrawal transactions that were done in the previous block - block_execution_context.set_withdrawal_transactions( - unsigned_withdrawal_transaction_bytes - .into_iter() - .map(|withdrawal_transaction| { - ( - Txid::hash(withdrawal_transaction.as_slice()), - withdrawal_transaction, - ) - }) - .collect(), - ); + // Save unsigned transaction bytes to block execution context + // to be signed (on extend_vote), verified (on verify_vote) and broadcasted (on finalize_block) + block_execution_context + .set_unsigned_withdrawal_transactions(unsigned_withdrawal_transaction_bytes); + } let state_transitions_result = self.process_raw_state_transitions( raw_state_transitions, @@ -368,14 +359,17 @@ where let mut block_execution_context: BlockExecutionContext = block_execution_context; + // Pool withdrawals into transactions queue + + // Takes queued withdrawals, creates untiled withdrawal transaction payload, saves them to queue + // Corresponding withdrawal documents are changed from queued to pooled self.pool_withdrawals_into_transactions_queue( - &block_execution_context, - transaction, + &block_info, + Some(transaction), platform_version, )?; // while we have the state transitions executed, we now need to process the block fees - let block_fees_v0: BlockFeesV0 = state_transitions_result.aggregated_fees().clone().into(); // Process fees diff --git a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/fetch_and_prepare_unsigned_withdrawal_transactions/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/fetch_and_prepare_unsigned_withdrawal_transactions/v0/mod.rs deleted file mode 100644 index 8a218da798..0000000000 --- a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/fetch_and_prepare_unsigned_withdrawal_transactions/v0/mod.rs +++ /dev/null @@ -1,168 +0,0 @@ -use dashcore_rpc::dashcore::{ - blockdata::transaction::special_transaction::asset_unlock::request_info::AssetUnlockRequestInfo, - hashes::Hash, QuorumHash, -}; -use dpp::block::block_info::BlockInfo; -use dpp::block::epoch::Epoch; -use dpp::data_contract::accessors::v0::DataContractV0Getters; -use dpp::document::document_methods::DocumentMethodsV0; -use dpp::document::{Document, DocumentV0Setters}; -use dpp::version::PlatformVersion; - -use drive::dpp::system_data_contracts::withdrawals_contract; -use drive::dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; - -use drive::dpp::util::hash; - -use drive::drive::batch::DriveOperation; -use drive::grovedb::Transaction; - -use crate::execution::types::block_execution_context::v0::BlockExecutionContextV0Getters; -use crate::execution::types::block_execution_context::BlockExecutionContext; -use crate::execution::types::block_state_info::v0::BlockStateInfoV0Getters; -use crate::platform_types::epoch_info::v0::EpochInfoV0Getters; -use crate::{ - error::{execution::ExecutionError, Error}, - platform_types::platform::Platform, - rpc::core::CoreRPCLike, -}; - -const WITHDRAWAL_TRANSACTIONS_QUERY_LIMIT: u16 = 16; - -impl Platform -where - C: CoreRPCLike, -{ - /// Prepares a list of an unsigned withdrawal transaction bytes - pub(super) fn fetch_and_prepare_unsigned_withdrawal_transactions_v0( - &self, - validator_set_quorum_hash: [u8; 32], - block_execution_context: &BlockExecutionContext, - transaction: &Transaction, - platform_version: &PlatformVersion, - ) -> Result>, Error> { - let block_info = BlockInfo { - time_ms: block_execution_context.block_state_info().block_time_ms(), - height: block_execution_context.block_state_info().height(), - core_height: block_execution_context - .block_state_info() - .core_chain_locked_height(), - epoch: Epoch::new(block_execution_context.epoch_info().current_epoch_index())?, - }; - - let data_contract_id = withdrawals_contract::ID; - - let (_, Some(contract_fetch_info)) = self.drive.get_contract_with_fetch_info_and_fee( - data_contract_id.to_buffer(), - None, - true, - Some(transaction), - platform_version, - )? - else { - return Err(Error::Execution(ExecutionError::CorruptedCodeExecution( - "can't fetch withdrawal data contract", - ))); - }; - - let mut drive_operations: Vec = vec![]; - - // Get 16 latest withdrawal transactions from the queue - let untied_withdrawal_transactions = self.drive.dequeue_withdrawal_transactions( - WITHDRAWAL_TRANSACTIONS_QUERY_LIMIT, - Some(transaction), - &mut drive_operations, - )?; - - if untied_withdrawal_transactions.is_empty() { - return Ok(Vec::new()); - } - - // Appending request_height and quorum_hash to withdrawal transaction - // and pass it to JS Drive for singing and broadcasting - let (unsigned_withdrawal_transactions, documents_to_update): (Vec<_>, Vec<_>) = - untied_withdrawal_transactions - .into_iter() - .map(|(_, untied_transaction_bytes)| { - let request_info = AssetUnlockRequestInfo { - request_height: block_execution_context - .block_state_info() - .core_chain_locked_height(), - quorum_hash: QuorumHash::hash(&validator_set_quorum_hash), - }; - - let mut unsigned_transaction_bytes = vec![]; - - request_info - .consensus_append_to_base_encode( - untied_transaction_bytes.clone(), - &mut unsigned_transaction_bytes, - ) - .map_err(|_| { - Error::Execution(ExecutionError::CorruptedCodeExecution( - "could not add additional request info to asset unlock transaction", - )) - })?; - - let original_transaction_id = hash::hash_to_vec(untied_transaction_bytes); - let update_transaction_id = - hash::hash_to_vec(unsigned_transaction_bytes.clone()); - - let mut document = self.drive.find_withdrawal_document_by_transaction_id( - &original_transaction_id, - Some(transaction), - platform_version, - )?; - - document.set_bytes( - withdrawal::properties::TRANSACTION_ID, - update_transaction_id, - ); - - document.set_i64( - withdrawal::properties::UPDATED_AT, - block_info.time_ms.try_into().map_err(|_| { - Error::Execution(ExecutionError::CorruptedCodeExecution( - "Can't convert u64 block time to i64 updated_at", - )) - })?, - ); - - document.increment_revision().map_err(|_| { - Error::Execution(ExecutionError::CorruptedCodeExecution( - "Could not increment document revision", - )) - })?; - - Ok((unsigned_transaction_bytes, document)) - }) - .collect::, Document)>, Error>>()? - .into_iter() - .unzip(); - - self.drive.add_update_multiple_documents_operations( - &documents_to_update, - &contract_fetch_info.contract, - contract_fetch_info - .contract - .document_type_for_name(withdrawal::NAME) - .map_err(|_| { - Error::Execution(ExecutionError::CorruptedCodeExecution( - "could not get document type", - )) - })?, - &mut drive_operations, - &platform_version.drive, - )?; - - self.drive.apply_drive_operations( - drive_operations, - true, - &block_info, - Some(transaction), - platform_version, - )?; - - Ok(unsigned_withdrawal_transactions) - } -} diff --git a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/fetch_transactions_block_inclusion_status/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/fetch_transactions_block_inclusion_status/v0/mod.rs deleted file mode 100644 index 79620e55f0..0000000000 --- a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/fetch_transactions_block_inclusion_status/v0/mod.rs +++ /dev/null @@ -1,37 +0,0 @@ -use dpp::dashcore::hashes::Hash; -use dpp::dashcore::Txid; -use std::collections::BTreeMap; - -use crate::{error::Error, platform_types::platform::Platform, rpc::core::CoreRPCLike}; - -impl Platform -where - C: CoreRPCLike, -{ - /// Fetch Core transactions by range of Core heights - pub(super) fn fetch_transactions_block_inclusion_status_v0( - &self, - current_chain_locked_core_height: u32, - transaction_identifiers: Vec<[u8; 32]>, - ) -> Result, Error> { - let tx_ids: Vec = transaction_identifiers - .iter() - .map(|transaction_id| Txid::from_byte_array(*transaction_id)) - .collect(); - let transactions_are_chain_locked_result = - self.core_rpc.get_transactions_are_chain_locked(tx_ids)?; - - Ok(transactions_are_chain_locked_result - .into_iter() - .zip(transaction_identifiers) - .map(|(lock_result, identifier)| { - let Some(mined_height) = lock_result.height else { - return (identifier, false); - }; - let withdrawal_chain_locked = - lock_result.chain_lock && current_chain_locked_core_height >= mined_height; - (identifier, withdrawal_chain_locked) - }) - .collect()) - } -} diff --git a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/mod.rs deleted file mode 100644 index 60843ec380..0000000000 --- a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/mod.rs +++ /dev/null @@ -1,5 +0,0 @@ -pub(in crate::execution) mod build_withdrawal_transactions_from_documents; -pub(in crate::execution) mod fetch_and_prepare_unsigned_withdrawal_transactions; -mod fetch_transactions_block_inclusion_status; -pub(in crate::execution) mod pool_withdrawals_into_transactions_queue; -pub(in crate::execution) mod update_broadcasted_withdrawal_transaction_statuses; diff --git a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/update_broadcasted_withdrawal_transaction_statuses/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/update_broadcasted_withdrawal_transaction_statuses/v0/mod.rs deleted file mode 100644 index 83d3cec023..0000000000 --- a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/update_broadcasted_withdrawal_transaction_statuses/v0/mod.rs +++ /dev/null @@ -1,462 +0,0 @@ -use dpp::block::block_info::BlockInfo; -use dpp::block::epoch::Epoch; -use dpp::data_contract::accessors::v0::DataContractV0Getters; -use dpp::data_contracts::withdrawals_contract::WithdrawalStatus; -use dpp::document::document_methods::DocumentMethodsV0; -use dpp::document::{Document, DocumentV0Getters, DocumentV0Setters}; -use dpp::platform_value::btreemap_extensions::BTreeValueMapHelper; -use dpp::system_data_contracts::withdrawals_contract; -use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; -use dpp::version::PlatformVersion; -use std::collections::BTreeMap; - -use drive::drive::batch::DriveOperation; -use drive::grovedb::Transaction; - -use crate::execution::types::block_execution_context::v0::BlockExecutionContextV0Getters; -use crate::execution::types::block_execution_context::BlockExecutionContext; -use crate::execution::types::block_state_info::v0::BlockStateInfoV0Getters; -use crate::platform_types::epoch_info::v0::EpochInfoV0Getters; -use crate::{ - error::{execution::ExecutionError, Error}, - platform_types::platform::Platform, - rpc::core::CoreRPCLike, -}; - -const NUMBER_OF_BLOCKS_BEFORE_EXPIRED: u32 = 48; - -impl Platform -where - C: CoreRPCLike, -{ - /// Update statuses for broadcasted withdrawals - pub(super) fn update_broadcasted_withdrawal_transaction_statuses_v0( - &self, - block_execution_context: &BlockExecutionContext, - transaction: &Transaction, - platform_version: &PlatformVersion, - ) -> Result<(), Error> { - let block_info = BlockInfo { - time_ms: block_execution_context.block_state_info().block_time_ms(), - height: block_execution_context.block_state_info().height(), - core_height: block_execution_context - .block_state_info() - .core_chain_locked_height(), - epoch: Epoch::new(block_execution_context.epoch_info().current_epoch_index())?, - }; - - let data_contract_id = withdrawals_contract::ID; - - let (_, Some(contract_fetch_info)) = self.drive.get_contract_with_fetch_info_and_fee( - data_contract_id.to_buffer(), - None, - true, - Some(transaction), - platform_version, - )? - else { - return Err(Error::Execution(ExecutionError::CorruptedCodeExecution( - "can't fetch withdrawal data contract", - ))); - }; - - let broadcasted_withdrawal_documents = self.drive.fetch_withdrawal_documents_by_status( - withdrawals_contract::WithdrawalStatus::BROADCASTED.into(), - Some(transaction), - platform_version, - )?; - - // Collecting only documents that have been updated - let transactions_to_check: Vec<[u8; 32]> = broadcasted_withdrawal_documents - .iter() - .map(|document| { - document - .properties() - .get_hash256_bytes(withdrawal::properties::TRANSACTION_ID) - .map_err(|_| { - Error::Execution(ExecutionError::CorruptedDriveResponse( - "Can't get transactionId from withdrawal document".to_string(), - )) - }) - }) - .collect::, Error>>()?; - - let core_transactions_statuses = if transactions_to_check.is_empty() { - BTreeMap::new() - } else { - self.fetch_transactions_block_inclusion_status( - block_execution_context - .block_state_info() - .core_chain_locked_height(), - transactions_to_check, - platform_version, - )? - }; - - let mut drive_operations: Vec = vec![]; - - // Collecting only documents that have been updated - let documents_to_update: Vec = broadcasted_withdrawal_documents - .into_iter() - .map(|mut document| { - let transaction_sign_height: u32 = document - .properties() - .get_optional_integer(withdrawal::properties::TRANSACTION_SIGN_HEIGHT)? - .ok_or(Error::Execution(ExecutionError::CorruptedDriveResponse( - "Can't get transactionSignHeight from withdrawal document".to_string(), - )))?; - - let transaction_id = document - .properties() - .get_optional_hash256_bytes(withdrawal::properties::TRANSACTION_ID)? - .ok_or(Error::Execution(ExecutionError::CorruptedDriveResponse( - "Can't get transactionId from withdrawal document".to_string(), - )))?; - - let transaction_index = document - .properties() - .get_optional_integer(withdrawal::properties::TRANSACTION_INDEX)? - .ok_or(Error::Execution(ExecutionError::CorruptedDriveResponse( - "Can't get transaction index from withdrawal document".to_string(), - )))?; - - let current_status: WithdrawalStatus = document - .properties() - .get_optional_integer::(withdrawal::properties::STATUS)? - .ok_or(Error::Execution(ExecutionError::CorruptedDriveResponse( - "Can't get transaction index from withdrawal document".to_string(), - )))? - .try_into() - .map_err(|_| { - Error::Execution(ExecutionError::CorruptedDriveResponse( - "Withdrawal status unknown".to_string(), - )) - })?; - - let block_height_difference = block_execution_context - .block_state_info() - .core_chain_locked_height() - - transaction_sign_height; - - let is_chain_locked = - *core_transactions_statuses - .get(&transaction_id) - .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( - "we should always have a withdrawal status", - )))?; - - let mut status = current_status; - - if is_chain_locked { - status = WithdrawalStatus::COMPLETE; - } else if block_height_difference > NUMBER_OF_BLOCKS_BEFORE_EXPIRED { - status = WithdrawalStatus::EXPIRED; - } else { - // todo: there could be a problem here where we always get the same withdrawals - // and don't cycle them most likely when we query withdrawals - return Ok(None); - } - - document.set_u8(withdrawal::properties::STATUS, status.into()); - - document.set_u64(withdrawal::properties::UPDATED_AT, block_info.time_ms); - - document.increment_revision().map_err(Error::Protocol)?; - - if status == WithdrawalStatus::EXPIRED { - self.drive.add_insert_expired_index_operation( - transaction_index, - &mut drive_operations, - ); - } - - Ok(Some(document)) - }) - .collect::>, Error>>()? - .into_iter() - .flatten() - .collect(); - - self.drive.add_update_multiple_documents_operations( - &documents_to_update, - &contract_fetch_info.contract, - contract_fetch_info - .contract - .document_type_for_name(withdrawal::NAME) - .map_err(|_| { - Error::Execution(ExecutionError::CorruptedCodeExecution( - "Can't fetch withdrawal data contract", - )) - })?, - &mut drive_operations, - &platform_version.drive, - )?; - - self.drive.apply_drive_operations( - drive_operations, - true, - &block_info, - Some(transaction), - platform_version, - )?; - - Ok(()) - } -} - -#[cfg(test)] -mod tests { - use crate::execution::types::block_execution_context::v0::BlockExecutionContextV0; - use crate::execution::types::block_state_info::v0::BlockStateInfoV0; - use crate::platform_types::epoch_info::v0::EpochInfoV0; - use crate::platform_types::platform_state::v0::PlatformStateV0; - use crate::rpc::core::MockCoreRPCLike; - use crate::test::helpers::setup::TestPlatformBuilder; - use dashcore_rpc::dashcore::{BlockHash, QuorumHash}; - use dashcore_rpc::dashcore_rpc_json::GetTransactionLockedResult; - use dpp::dashcore::hashes::Hash; - use dpp::dashcore::Txid; - use dpp::data_contract::accessors::v0::DataContractV0Getters; - use dpp::document::DocumentV0Getters; - use dpp::identity::core_script::CoreScript; - use dpp::platform_value::platform_value; - use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; - use dpp::version::PlatformVersion; - use dpp::withdrawal::Pooling; - use dpp::{ - data_contracts::withdrawals_contract, tests::fixtures::get_withdrawal_document_fixture, - }; - use dpp::{ - prelude::Identifier, - system_data_contracts::{load_system_data_contract, SystemDataContract}, - }; - use drive::tests::helpers::setup::setup_document; - use drive::tests::helpers::setup::setup_system_data_contract; - use serde_json::json; - use std::str::FromStr; - - #[test] - fn test_statuses_are_updated() { - let platform_version = PlatformVersion::latest(); - let mut platform = TestPlatformBuilder::new() - .build_with_mock_rpc() - .set_initial_state_structure(); - - let mut mock_rpc_client = MockCoreRPCLike::new(); - - mock_rpc_client - .expect_get_transactions_are_chain_locked() - .returning(move |tx_ids: Vec| { - Ok(tx_ids - .into_iter() - .map(|tx_id| { - if tx_id.to_byte_array() - == [ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - ] - { - GetTransactionLockedResult { - height: Some(93), - chain_lock: true, - } - } else { - GetTransactionLockedResult { - height: None, - chain_lock: false, - } - } - }) - .collect()) - }); - - mock_rpc_client - .expect_get_block_hash() - .withf(|height| *height == 95) - .returning(|_| { - Ok(BlockHash::from_str( - "0000000000000000000000000000000000000000000000000000000000000000", - ) - .unwrap()) - }); - - mock_rpc_client - .expect_get_block_hash() - .withf(|height| *height == 96) - .returning(|_| { - Ok(BlockHash::from_str( - "1111111111111111111111111111111111111111111111111111111111111111", - ) - .unwrap()) - }); - - mock_rpc_client - .expect_get_block_json() - .withf(|bh| { - hex::encode(bh) - == "0000000000000000000000000000000000000000000000000000000000000000" - }) - .returning(|_| { - Ok(json!({ - "tx": ["0101010101010101010101010101010101010101010101010101010101010101"] - })) - }); - - mock_rpc_client - .expect_get_block_json() - .withf(|bh| { - hex::encode(bh) - == "1111111111111111111111111111111111111111111111111111111111111111" - }) - .returning(|_| { - Ok(json!({ - "tx": ["0202020202020202020202020202020202020202020202020202020202020202"] - })) - }); - - platform.core_rpc = mock_rpc_client; - - let transaction = platform.drive.grove.start_transaction(); - - let block_execution_context = BlockExecutionContextV0 { - block_state_info: BlockStateInfoV0 { - height: 1, - round: 0, - block_time_ms: 1, - previous_block_time_ms: Some(1), - proposer_pro_tx_hash: [ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - ], - core_chain_locked_height: 96, - block_hash: None, - app_hash: None, - } - .into(), - epoch_info: EpochInfoV0 { - current_epoch_index: 1, - previous_epoch_index: None, - is_epoch_change: false, - } - .into(), - hpmn_count: 100, - withdrawal_transactions: Default::default(), - block_platform_state: PlatformStateV0 { - last_committed_block_info: None, - current_protocol_version_in_consensus: 0, - next_epoch_protocol_version: 0, - current_validator_set_quorum_hash: QuorumHash::all_zeros(), - next_validator_set_quorum_hash: None, - validator_sets: Default::default(), - chain_lock_validating_quorums: Default::default(), - previous_height_chain_lock_validating_quorums: None, - full_masternode_list: Default::default(), - hpmn_masternode_list: Default::default(), - genesis_block_info: None, - } - .into(), - proposer_results: None, - }; - - let data_contract = - load_system_data_contract(SystemDataContract::Withdrawals, &platform_version) - .expect("to load system data contract"); - - setup_system_data_contract(&platform.drive, &data_contract, Some(&transaction)); - - let owner_id = Identifier::new([1u8; 32]); - - let document_1 = get_withdrawal_document_fixture( - &data_contract, - owner_id, - platform_value!({ - "amount": 1000u64, - "coreFeePerByte": 1u32, - "pooling": Pooling::Never, - "outputScript": CoreScript::from_bytes((0..23).collect::>()), - "status": withdrawals_contract::WithdrawalStatus::BROADCASTED as u8, - "transactionIndex": 1u64, - "transactionSignHeight": 93u64, - "transactionId": Identifier::new([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]), - }), - None, - platform_version.protocol_version, - ).expect("expected withdrawal document"); - - let document_type = data_contract - .document_type_for_name(withdrawal::NAME) - .expect("expected to get document type"); - - setup_document( - &platform.drive, - &document_1, - &data_contract, - document_type, - Some(&transaction), - ); - - let document_2 = get_withdrawal_document_fixture( - &data_contract, - owner_id, - platform_value!({ - "amount": 1000u64, - "coreFeePerByte": 1u32, - "pooling": Pooling::Never as u8, - "outputScript": CoreScript::from_bytes((0..23).collect::>()), - "status": withdrawals_contract::WithdrawalStatus::BROADCASTED as u8, - "transactionIndex": 2u64, - "transactionSignHeight": 10u64, - "transactionId": Identifier::new([3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]), - }), - None, - platform_version.protocol_version, - ) - .expect("expected withdrawal document"); - - setup_document( - &platform.drive, - &document_2, - &data_contract, - document_type, - Some(&transaction), - ); - - platform - .update_broadcasted_withdrawal_transaction_statuses_v0( - &block_execution_context.into(), - &transaction, - platform_version, - ) - .expect("to update withdrawal statuses"); - - let documents = platform - .drive - .fetch_withdrawal_documents_by_status( - withdrawals_contract::WithdrawalStatus::EXPIRED.into(), - Some(&transaction), - platform_version, - ) - .expect("to fetch documents by status"); - - assert_eq!(documents.len(), 1); - assert_eq!( - documents.get(0).unwrap().id().to_vec(), - document_2.id().to_vec() - ); - - let documents = platform - .drive - .fetch_withdrawal_documents_by_status( - withdrawals_contract::WithdrawalStatus::COMPLETE.into(), - Some(&transaction), - platform_version, - ) - .expect("to fetch documents by status"); - - assert_eq!(documents.len(), 1); - assert_eq!( - documents.get(0).unwrap().id().to_vec(), - document_1.id().to_vec() - ); - } -} diff --git a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs index 8c034f320a..62e472e41d 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs @@ -311,8 +311,8 @@ mod tests { assert_eq!( root_hash, [ - 148, 196, 101, 163, 1, 56, 137, 50, 117, 196, 107, 103, 222, 55, 110, 59, 11, - 177, 172, 37, 17, 234, 56, 154, 232, 24, 208, 220, 27, 128, 201, 97 + 27, 145, 206, 187, 152, 191, 68, 167, 189, 194, 115, 111, 104, 166, 61, 254, + 94, 149, 9, 131, 231, 106, 224, 64, 180, 247, 129, 223, 128, 12, 42, 39 ] ) } diff --git a/packages/rs-drive-abci/src/execution/platform_events/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/mod.rs index 7e79189add..79821827be 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/mod.rs @@ -12,15 +12,13 @@ pub(in crate::execution) mod epoch; pub(in crate::execution) mod fee_pool_inwards_distribution; /// Fee pool outwards distribution towards proposers pub(in crate::execution) mod fee_pool_outwards_distribution; -/// Functions related to IdentityCreditWithdrawalTransaction -pub(in crate::execution) mod identity_credit_withdrawal; /// Initialization pub(in crate::execution) mod initialization; /// Protocol upgrade events pub(in crate::execution) mod protocol_upgrade; /// State transition processing pub(in crate::execution) mod state_transition_processing; -/// Platform withdrawals +/// Withdrawal methods pub(in crate::execution) mod withdrawals; /// Events happening what starting to process a block diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/append_signatures_and_broadcast_withdrawal_transactions/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/append_signatures_and_broadcast_withdrawal_transactions/mod.rs new file mode 100644 index 0000000000..de42c73bda --- /dev/null +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/append_signatures_and_broadcast_withdrawal_transactions/mod.rs @@ -0,0 +1,39 @@ +use crate::error::execution::ExecutionError; +use crate::error::Error; +use crate::platform_types::platform::Platform; +use crate::platform_types::withdrawal::unsigned_withdrawal_txs::v0::UnsignedWithdrawalTxs; +use crate::rpc::core::CoreRPCLike; +use dpp::dashcore::bls_sig_utils::BLSSignature; +use dpp::version::PlatformVersion; + +mod v0; + +impl Platform +where + C: CoreRPCLike, +{ + /// Appends signatures to unsigned withdrawal transactions and broadcast them to Core + pub(in crate::execution) fn append_signatures_and_broadcast_withdrawal_transactions( + &self, + unsigned_withdrawal_transactions: UnsignedWithdrawalTxs, + signatures: Vec, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + match platform_version + .drive_abci + .methods + .withdrawals + .append_signatures_and_broadcast_withdrawal_transactions + { + 0 => self.append_signatures_and_broadcast_withdrawal_transactions_v0( + unsigned_withdrawal_transactions, + signatures, + ), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "append_signatures_and_broadcast_withdrawal_transactions".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/append_signatures_and_broadcast_withdrawal_transactions/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/append_signatures_and_broadcast_withdrawal_transactions/v0/mod.rs new file mode 100644 index 0000000000..035bc11a79 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/append_signatures_and_broadcast_withdrawal_transactions/v0/mod.rs @@ -0,0 +1,91 @@ +use crate::error::execution::ExecutionError; +use crate::error::Error; +use crate::platform_types::platform::Platform; +use crate::platform_types::withdrawal::unsigned_withdrawal_txs::v0::UnsignedWithdrawalTxs; +use crate::rpc::core::{ + CoreRPCLike, CORE_RPC_ERROR_ASSET_UNLOCK_EXPIRED, CORE_RPC_ERROR_ASSET_UNLOCK_NO_ACTIVE_QUORUM, + CORE_RPC_TX_ALREADY_IN_CHAIN, +}; +use dashcore_rpc::jsonrpc; +use dashcore_rpc::Error as CoreRPCError; +use dpp::dashcore::bls_sig_utils::BLSSignature; +use dpp::dashcore::consensus; +use dpp::dashcore::transaction::special_transaction::TransactionPayload::AssetUnlockPayloadType; + +impl Platform +where + C: CoreRPCLike, +{ + pub(super) fn append_signatures_and_broadcast_withdrawal_transactions_v0( + &self, + unsigned_withdrawal_transactions: UnsignedWithdrawalTxs, + signatures: Vec, + ) -> Result<(), Error> { + if unsigned_withdrawal_transactions.is_empty() { + return Ok(()); + } + + if unsigned_withdrawal_transactions.len() != signatures.len() { + return Err(Error::Execution(ExecutionError::CorruptedCodeExecution( + "number of signatures must match number of withdrawal transactions", + ))); + } + + tracing::debug!( + "Broadcasting {} withdrawal transactions", + unsigned_withdrawal_transactions.len(), + ); + + for (mut transaction, signature) in + unsigned_withdrawal_transactions.into_iter().zip(signatures) + { + let Some(AssetUnlockPayloadType(mut payload)) = transaction.special_transaction_payload + else { + return Err(Error::Execution(ExecutionError::CorruptedCodeExecution( + "withdrawal transaction payload must be AssetUnlockPayloadType", + ))); + }; + + payload.quorum_sig = signature; + + let index = payload.base.index; + + transaction.special_transaction_payload = Some(AssetUnlockPayloadType(payload)); + + let tx_bytes = consensus::serialize(&transaction); + + // TODO: We need to broadcast all or none of the transactions (in case of error) + // will be fixed in upcoming PR + match self.core_rpc.send_raw_transaction(&tx_bytes) { + Ok(_) => { + tracing::debug!( + tx_id = transaction.txid().to_hex(), + index, + "Successfully broadcasted withdrawal transaction with index {}", + index + ); + } + // Ignore errors that can happen during blockchain catching. + // They will be logged with dashcore_rpc + Err(CoreRPCError::JsonRpc(jsonrpc::error::Error::Rpc(e))) + if e.code == CORE_RPC_TX_ALREADY_IN_CHAIN + || e.message == CORE_RPC_ERROR_ASSET_UNLOCK_NO_ACTIVE_QUORUM + || e.message == CORE_RPC_ERROR_ASSET_UNLOCK_EXPIRED => {} + // Errors that can happen if we created invalid tx or Core isn't responding + Err(e) => { + tracing::error!( + tx_id = transaction.txid().to_string(), + index, + "Failed to broadcast asset unlock transaction {}: {}", + index, + e + ); + + return Err(e.into()); + } + } + } + + Ok(()) + } +} diff --git a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/build_withdrawal_transactions_from_documents/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/build_untied_withdrawal_transactions_from_documents/mod.rs similarity index 64% rename from packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/build_withdrawal_transactions_from_documents/mod.rs rename to packages/rs-drive-abci/src/execution/platform_events/withdrawals/build_untied_withdrawal_transactions_from_documents/mod.rs index 5ee1549005..e4cd110298 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/build_withdrawal_transactions_from_documents/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/build_untied_withdrawal_transactions_from_documents/mod.rs @@ -5,9 +5,9 @@ use crate::rpc::core::CoreRPCLike; use dpp::document::Document; use dpp::identifier::Identifier; use dpp::version::PlatformVersion; -use drive::drive::batch::DriveOperation; -use drive::drive::identity::withdrawals::WithdrawalTransactionIdAndBytes; -use drive::grovedb::TransactionArg; +use drive::drive::identity::withdrawals::{ + WithdrawalTransactionIndex, WithdrawalTransactionIndexAndBytes, +}; use std::collections::HashMap; mod v0; @@ -30,26 +30,23 @@ where /// # Returns /// /// * `Result, Error>` - Returns a HashMap containing withdrawal transactions if found, otherwise returns an `Error`. - pub(in crate::execution::platform_events::identity_credit_withdrawal) fn build_withdrawal_transactions_from_documents( + pub(in crate::execution::platform_events::withdrawals) fn build_untied_withdrawal_transactions_from_documents( &self, documents: &[Document], - drive_operation_types: &mut Vec, - transaction: TransactionArg, + start_index: WithdrawalTransactionIndex, platform_version: &PlatformVersion, - ) -> Result, Error> { + ) -> Result, Error> { match platform_version .drive_abci .methods - .identity_credit_withdrawal - .build_withdrawal_transactions_from_documents + .withdrawals + .build_untied_withdrawal_transactions_from_documents { - 0 => self.build_withdrawal_transactions_from_documents_v0( - documents, - drive_operation_types, - transaction, - ), + 0 => { + self.build_untied_withdrawal_transactions_from_documents_v0(documents, start_index) + } version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { - method: "build_withdrawal_transactions_from_documents".to_string(), + method: "build_untied_withdrawal_transactions_from_documents".to_string(), known_versions: vec![0], received: version, })), diff --git a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/build_withdrawal_transactions_from_documents/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/build_untied_withdrawal_transactions_from_documents/v0/mod.rs similarity index 77% rename from packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/build_withdrawal_transactions_from_documents/v0/mod.rs rename to packages/rs-drive-abci/src/execution/platform_events/withdrawals/build_untied_withdrawal_transactions_from_documents/v0/mod.rs index e69975245d..e86aa33f61 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/build_withdrawal_transactions_from_documents/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/build_untied_withdrawal_transactions_from_documents/v0/mod.rs @@ -1,8 +1,9 @@ use std::collections::HashMap; use dashcore_rpc::dashcore::{ - blockdata::transaction::special_transaction::asset_unlock::unqualified_asset_unlock::{ - AssetUnlockBasePayload, AssetUnlockBaseTransactionInfo, + blockdata::transaction::special_transaction::asset_unlock::{ + qualified_asset_unlock::ASSET_UNLOCK_TX_SIZE, + unqualified_asset_unlock::{AssetUnlockBasePayload, AssetUnlockBaseTransactionInfo}, }, consensus::Encodable, ScriptBuf, TxOut, @@ -13,8 +14,9 @@ use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdr use drive::dpp::identifier::Identifier; use drive::dpp::identity::convert_credits_to_duffs; -use drive::drive::identity::withdrawals::WithdrawalTransactionIdAndBytes; -use drive::{drive::batch::DriveOperation, query::TransactionArg}; +use drive::drive::identity::withdrawals::{ + WithdrawalTransactionIndex, WithdrawalTransactionIndexAndBytes, +}; use crate::{ error::{execution::ExecutionError, Error}, @@ -27,20 +29,13 @@ where C: CoreRPCLike, { /// Build list of Core transactions from withdrawal documents - pub(super) fn build_withdrawal_transactions_from_documents_v0( + pub(super) fn build_untied_withdrawal_transactions_from_documents_v0( &self, documents: &[Document], - drive_operation_types: &mut Vec, - transaction: TransactionArg, - ) -> Result, Error> { - let mut withdrawals: HashMap = HashMap::new(); - - let latest_withdrawal_index = self - .drive - .fetch_and_remove_latest_withdrawal_transaction_index_operations( - drive_operation_types, - transaction, - )?; + start_index: WithdrawalTransactionIndex, + ) -> Result, Error> { + let mut withdrawals: HashMap = + HashMap::new(); for (i, document) in documents.iter().enumerate() { let output_script_bytes = document @@ -70,8 +65,6 @@ where )) })?; - let state_transition_size = 190; - let output_script = ScriptBuf::from_bytes(output_script_bytes); let tx_out = TxOut { @@ -79,7 +72,7 @@ where script_pubkey: output_script, }; - let transaction_index = latest_withdrawal_index + i as u64; + let transaction_index = start_index + i as WithdrawalTransactionIndex; let withdrawal_transaction = AssetUnlockBaseTransactionInfo { version: 1, @@ -88,7 +81,7 @@ where base_payload: AssetUnlockBasePayload { version: 1, index: transaction_index, - fee: (state_transition_size * core_fee_per_byte * 1000), + fee: ASSET_UNLOCK_TX_SIZE as u32 * core_fee_per_byte, }, }; @@ -102,10 +95,7 @@ where )) })?; - withdrawals.insert( - document.id(), - (transaction_index.to_be_bytes().to_vec(), transaction_buffer), - ); + withdrawals.insert(document.id(), (transaction_index, transaction_buffer)); } Ok(withdrawals) @@ -122,8 +112,6 @@ mod tests { use drive::tests::helpers::setup::setup_document; mod build_withdrawal_transactions_from_documents { - use dpp::block::block_info::BlockInfo; - use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contracts::withdrawals_contract::v1::document_types::withdrawal; use dpp::identity::core_script::CoreScript; @@ -131,7 +119,7 @@ mod tests { use dpp::prelude::Identifier; use dpp::system_data_contracts::{load_system_data_contract, SystemDataContract}; use dpp::version::PlatformVersion; - use drive::drive::identity::withdrawals::WithdrawalTransactionIdAndBytes; + use drive::drive::identity::withdrawals::WithdrawalTransactionIndexAndBytes; use drive::tests::helpers::setup::setup_system_data_contract; use itertools::Itertools; @@ -149,7 +137,7 @@ mod tests { let transaction = platform.drive.grove.start_transaction(); let data_contract = - load_system_data_contract(SystemDataContract::Withdrawals, &platform_version) + load_system_data_contract(SystemDataContract::Withdrawals, platform_version) .expect("to load system data contract"); setup_system_data_contract(&platform.drive, &data_contract, Some(&transaction)); @@ -210,54 +198,37 @@ mod tests { let documents = vec![document_1, document_2]; - let mut batch = vec![]; - let transactions = platform - .build_withdrawal_transactions_from_documents_v0( - &documents, - &mut batch, - Some(&transaction), - ) + .build_untied_withdrawal_transactions_from_documents_v0(&documents, 50) .expect("to build transactions from documents"); - platform - .drive - .apply_drive_operations( - batch, - true, - &BlockInfo::default(), - Some(&transaction), - platform_version, - ) - .expect("to apply drive op batch"); - assert_eq!( transactions .values() .cloned() .sorted() - .collect::>(), + .collect::>(), vec![ ( - vec![0, 0, 0, 0, 0, 0, 0, 0], + 50, vec![ 1, 0, 9, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 23, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 48, 230, 2, 0 + 1, 50, 0, 0, 0, 0, 0, 0, 0, 190, 0, 0, 0 ], ), ( - vec![0, 0, 0, 0, 0, 0, 0, 1], + 51, vec![ 1, 0, 9, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 23, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 0, 0, 0, 0, - 1, 1, 0, 0, 0, 0, 0, 0, 0, 48, 230, 2, 0 + 1, 51, 0, 0, 0, 0, 0, 0, 0, 190, 0, 0, 0 ], ), ] .into_iter() .sorted() - .collect::>(), + .collect::>(), ); } } diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/check_withdrawals/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/check_withdrawals/mod.rs deleted file mode 100644 index a1f73a4753..0000000000 --- a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/check_withdrawals/mod.rs +++ /dev/null @@ -1,74 +0,0 @@ -use crate::abci::AbciError; -use crate::error::execution::ExecutionError; -use crate::error::Error; -use crate::platform_types::platform::Platform; -use crate::platform_types::withdrawal::withdrawal_txs; -use crate::rpc::core::CoreRPCLike; -use dpp::bls_signatures; -use dpp::validation::SimpleValidationResult; -use dpp::version::PlatformVersion; - -mod v0; - -impl Platform -where - C: CoreRPCLike, -{ - /// Version-dependent method that checks the validity of withdrawal transactions. - /// - /// Based on the `platform_version` passed, this function will route to the appropriate versioned - /// implementation of the `check_withdrawals` method. Each implementation will compare the received - /// withdrawal transactions with the expected ones, returning an error if they do not match. - /// - /// If a validator public key is provided, each versioned method also verifies the withdrawal - /// transactions' signatures. The `platform_version` parameter dictates which version of the - /// method to call. If an unsupported version is passed, the function will return an - /// `Error::Execution` with an `ExecutionError::UnknownVersionMismatch` error. - /// - /// # Arguments - /// - /// * `received_withdrawals` - The withdrawal transactions received. - /// * `our_withdrawals` - The expected withdrawal transactions. - /// * `height` - The block height. - /// * `round` - The consensus round. - /// * `verify_with_validator_public_key` - An optional reference to a validator public key. - /// * `quorum_hash` - An optional byte slice reference containing the quorum hash. - /// * `platform_version` - A `PlatformVersion` reference dictating which version of the method to call. - /// - /// # Returns - /// - /// * `Result, Error>` - On success, a `SimpleValidationResult` - /// containing an `AbciError` is returned. On error, an `Error` is returned. - /// - pub(crate) fn check_withdrawals( - &self, - received_withdrawals: &withdrawal_txs::v0::WithdrawalTxs, - our_withdrawals: &withdrawal_txs::v0::WithdrawalTxs, - height: u64, - round: u32, - verify_with_validator_public_key: Option<&bls_signatures::PublicKey>, - quorum_hash: Option<&[u8]>, - platform_version: &PlatformVersion, - ) -> Result, Error> { - match platform_version - .drive_abci - .methods - .withdrawals - .check_withdrawals - { - 0 => Ok(self.check_withdrawals_v0( - received_withdrawals, - our_withdrawals, - height, - round, - verify_with_validator_public_key, - quorum_hash, - )), - version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { - method: "check_withdrawals".to_string(), - known_versions: vec![0], - received: version, - })), - } - } -} diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/check_withdrawals/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/check_withdrawals/v0/mod.rs deleted file mode 100644 index 32a957cf4f..0000000000 --- a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/check_withdrawals/v0/mod.rs +++ /dev/null @@ -1,78 +0,0 @@ -use crate::abci::AbciError; -use crate::platform_types::platform::Platform; -use crate::platform_types::withdrawal::withdrawal_txs; -use crate::rpc::core::CoreRPCLike; -use dpp::bls_signatures; -use dpp::validation::SimpleValidationResult; - -impl Platform -where - C: CoreRPCLike, -{ - /// Checks if the received withdrawal transactions are correct and match the expected withdrawal transactions. - /// - /// This function compares the received withdrawal transactions with the expected ones. If they don't match, - /// an error is returned. If a validator public key is provided, the function also verifies the withdrawal - /// transactions' signatures. - /// - /// # Arguments - /// - /// * `received_withdrawals` - The withdrawal transactions received. - /// * `our_withdrawals` - The expected withdrawal transactions. - /// * `height` - The block height. - /// * `round` - The consensus round. - /// * `verify_with_validator_public_key` - An optional reference to a validator public key. - /// * `quorum_hash` - An optional byte slice reference containing the quorum hash. - /// - /// # Returns - /// - /// * `SimpleValidationResult` - If the received withdrawal transactions match the expected ones - /// and the signatures are valid (if provided), it returns a default `SimpleValidationResult`. Otherwise, - /// it returns a `SimpleValidationResult` with an error. - /// - pub(super) fn check_withdrawals_v0( - &self, - received_withdrawals: &withdrawal_txs::v0::WithdrawalTxs, - our_withdrawals: &withdrawal_txs::v0::WithdrawalTxs, - height: u64, - round: u32, - verify_with_validator_public_key: Option<&bls_signatures::PublicKey>, - quorum_hash: Option<&[u8]>, - ) -> SimpleValidationResult { - if received_withdrawals.ne(our_withdrawals) { - return SimpleValidationResult::new_with_error( - AbciError::VoteExtensionMismatchReceived { - got: received_withdrawals.to_string(), - expected: our_withdrawals.to_string(), - }, - ); - } - - // we only verify if verify_with_validator_public_key exists - if let Some(validator_public_key) = verify_with_validator_public_key { - let quorum_hash = quorum_hash.expect("quorum hash is required to verify signature"); - let validation_result = received_withdrawals.verify_signatures( - &self.config.abci.chain_id, - self.config.validator_set_quorum_type(), - quorum_hash, - height, - round, - validator_public_key, - ); - - if validation_result.is_valid() { - SimpleValidationResult::default() - } else { - SimpleValidationResult::new_with_error( - validation_result - .errors - .into_iter() - .next() - .expect("expected an error"), - ) - } - } else { - SimpleValidationResult::default() - } - } -} diff --git a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/fetch_and_prepare_unsigned_withdrawal_transactions/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/dequeue_and_build_unsigned_withdrawal_transactions/mod.rs similarity index 72% rename from packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/fetch_and_prepare_unsigned_withdrawal_transactions/mod.rs rename to packages/rs-drive-abci/src/execution/platform_events/withdrawals/dequeue_and_build_unsigned_withdrawal_transactions/mod.rs index aa0430c75f..b67a25a1b3 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/fetch_and_prepare_unsigned_withdrawal_transactions/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/dequeue_and_build_unsigned_withdrawal_transactions/mod.rs @@ -1,10 +1,11 @@ use crate::error::execution::ExecutionError; use crate::error::Error; -use crate::execution::types::block_execution_context::BlockExecutionContext; use crate::platform_types::platform::Platform; +use crate::platform_types::withdrawal::unsigned_withdrawal_txs::v0::UnsignedWithdrawalTxs; use crate::rpc::core::CoreRPCLike; +use dpp::block::block_info::BlockInfo; use dpp::version::PlatformVersion; -use drive::grovedb::Transaction; +use drive::grovedb::TransactionArg; mod v0; @@ -26,27 +27,27 @@ where /// # Returns /// /// * `Result>, Error>` - Returns a Vector of unsigned withdrawal transactions if found, otherwise returns an `Error`. - pub(in crate::execution) fn fetch_and_prepare_unsigned_withdrawal_transactions( + pub(in crate::execution) fn dequeue_and_build_unsigned_withdrawal_transactions( &self, validator_set_quorum_hash: [u8; 32], - block_execution_context: &BlockExecutionContext, - transaction: &Transaction, + block_info: &BlockInfo, + transaction: TransactionArg, platform_version: &PlatformVersion, - ) -> Result>, Error> { + ) -> Result { match platform_version .drive_abci .methods - .identity_credit_withdrawal - .fetch_and_prepare_unsigned_withdrawal_transactions + .withdrawals + .dequeue_and_build_unsigned_withdrawal_transactions { - 0 => self.fetch_and_prepare_unsigned_withdrawal_transactions_v0( + 0 => self.dequeue_and_build_unsigned_withdrawal_transactions_v0( validator_set_quorum_hash, - block_execution_context, + block_info, transaction, platform_version, ), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { - method: "fetch_and_prepare_unsigned_withdrawal_transactions".to_string(), + method: "dequeue_and_build_unsigned_withdrawal_transactions".to_string(), known_versions: vec![0], received: version, })), diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/dequeue_and_build_unsigned_withdrawal_transactions/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/dequeue_and_build_unsigned_withdrawal_transactions/v0/mod.rs new file mode 100644 index 0000000000..b654a1e56b --- /dev/null +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/dequeue_and_build_unsigned_withdrawal_transactions/v0/mod.rs @@ -0,0 +1,199 @@ +use dashcore_rpc::dashcore::{ + blockdata::transaction::special_transaction::asset_unlock::request_info::AssetUnlockRequestInfo, + hashes::Hash, QuorumHash, +}; +use dpp::block::block_info::BlockInfo; +use dpp::dashcore::transaction::special_transaction::asset_unlock::qualified_asset_unlock::build_asset_unlock_tx; +use dpp::dashcore::Transaction; +use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::document::document_methods::DocumentMethodsV0; +use dpp::document::{Document, DocumentV0Setters}; +use dpp::version::PlatformVersion; + +use drive::dpp::system_data_contracts::withdrawals_contract; +use drive::dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; + +use drive::drive::batch::DriveOperation; +use drive::drive::identity::withdrawals::WithdrawalTransactionIndex; +use drive::query::TransactionArg; + +use crate::platform_types::withdrawal::unsigned_withdrawal_txs::v0::UnsignedWithdrawalTxs; +use crate::rpc::core::CoreHeight; +use crate::{ + error::{execution::ExecutionError, Error}, + platform_types::platform::Platform, + rpc::core::CoreRPCLike, +}; +use dpp::errors::ProtocolError; +use drive::drive::config::DEFAULT_QUERY_LIMIT; + +const WITHDRAWAL_TRANSACTIONS_QUERY_LIMIT: u16 = 16; + +impl Platform +where + C: CoreRPCLike, +{ + /// Prepares a list of an unsigned withdrawal transaction bytes + pub(super) fn dequeue_and_build_unsigned_withdrawal_transactions_v0( + &self, + validator_set_quorum_hash: [u8; 32], + block_info: &BlockInfo, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result { + let mut drive_operations: Vec = vec![]; + + // Get 16 latest withdrawal transactions from the queue + let untied_withdrawal_transactions = self.drive.dequeue_untied_withdrawal_transactions( + WITHDRAWAL_TRANSACTIONS_QUERY_LIMIT, + transaction, + &mut drive_operations, + platform_version, + )?; + + if untied_withdrawal_transactions.is_empty() { + return Ok(UnsignedWithdrawalTxs::default()); + } + + let transaction_indices = untied_withdrawal_transactions + .iter() + .map(|(transaction_id, _)| *transaction_id) + .collect::>(); + + let documents = self.fetch_and_modify_withdrawal_documents_to_broadcasted_by_indices( + &transaction_indices, + block_info, + transaction, + platform_version, + )?; + + tracing::debug!( + "Deque {} unsigned withdrawal transactions for signing with indices from {} to {}", + documents.len(), + transaction_indices.first().expect("must be present"), + transaction_indices.last().expect("must be present") + ); + + let cache = self.drive.cache.read().unwrap(); + + self.drive.add_update_multiple_documents_operations( + &documents, + &cache.system_data_contracts.withdrawals, + cache + .system_data_contracts + .withdrawals + .document_type_for_name(withdrawal::NAME) + .map_err(|_| { + Error::Execution(ExecutionError::CorruptedCodeExecution( + "could not get document type", + )) + })?, + &mut drive_operations, + &platform_version.drive, + )?; + + // Appending request_height and quorum_hash to withdrawal transaction + let unsigned_withdrawal_transactions = untied_withdrawal_transactions + .into_iter() + .map(|(_, untied_transaction_bytes)| { + build_unsigned_transaction( + untied_transaction_bytes, + validator_set_quorum_hash, + block_info.core_height, + ) + }) + .collect::>()?; + + self.drive.apply_drive_operations( + drive_operations, + true, + block_info, + transaction, + platform_version, + )?; + + Ok(UnsignedWithdrawalTxs::from_vec( + unsigned_withdrawal_transactions, + )) + } + + fn fetch_and_modify_withdrawal_documents_to_broadcasted_by_indices( + &self, + transaction_indices: &[WithdrawalTransactionIndex], + block_info: &BlockInfo, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result, Error> { + let documents = self + .drive + .find_withdrawal_documents_by_status_and_transaction_indices( + withdrawals_contract::WithdrawalStatus::POOLED, + transaction_indices, + DEFAULT_QUERY_LIMIT, + transaction, + platform_version, + )?; + + documents + .into_iter() + .map(|mut document| { + document.set_i64( + withdrawal::properties::STATUS, + withdrawals_contract::WithdrawalStatus::BROADCASTED as i64, + ); + + document.set_u64( + withdrawal::properties::TRANSACTION_SIGN_HEIGHT, + block_info.core_height as u64, + ); + + document.set_i64( + withdrawal::properties::UPDATED_AT, + block_info.time_ms.try_into().map_err(|_| { + Error::Execution(ExecutionError::CorruptedCodeExecution( + "Can't convert u64 block time to i64 updated_at", + )) + })?, + ); + + document.increment_revision().map_err(|_| { + Error::Execution(ExecutionError::CorruptedCodeExecution( + "Could not increment document revision", + )) + })?; + + Ok(document) + }) + .collect() + } +} + +fn build_unsigned_transaction( + untied_transaction_bytes: Vec, + mut validator_set_quorum_hash: [u8; 32], + core_chain_locked_height: CoreHeight, +) -> Result { + // Core expects it reversed + validator_set_quorum_hash.reverse(); + + let request_info = AssetUnlockRequestInfo { + request_height: core_chain_locked_height, + quorum_hash: QuorumHash::from_byte_array(validator_set_quorum_hash), + }; + + let mut unsigned_transaction_bytes = vec![]; + + request_info + .consensus_append_to_base_encode( + untied_transaction_bytes.clone(), + &mut unsigned_transaction_bytes, + ) + .map_err(|_| { + Error::Execution(ExecutionError::CorruptedCodeExecution( + "could not add additional request info to asset unlock transaction", + )) + })?; + + build_asset_unlock_tx(&unsigned_transaction_bytes) + .map_err(|error| Error::Protocol(ProtocolError::DashCoreError(error))) +} diff --git a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/fetch_transactions_block_inclusion_status/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/fetch_transactions_block_inclusion_status/mod.rs similarity index 79% rename from packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/fetch_transactions_block_inclusion_status/mod.rs rename to packages/rs-drive-abci/src/execution/platform_events/withdrawals/fetch_transactions_block_inclusion_status/mod.rs index d882062c88..0a4b17062e 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/fetch_transactions_block_inclusion_status/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/fetch_transactions_block_inclusion_status/mod.rs @@ -2,7 +2,9 @@ use crate::error::execution::ExecutionError; use crate::error::Error; use crate::platform_types::platform::Platform; use crate::rpc::core::CoreRPCLike; +use dashcore_rpc::json::AssetUnlockStatus; use dpp::version::PlatformVersion; +use drive::drive::identity::withdrawals::WithdrawalTransactionIndex; use std::collections::BTreeMap; mod v0; @@ -24,21 +26,21 @@ where /// # Returns /// /// * `Result, Error>` - Returns a Vector of transaction hashes if found, otherwise returns an `Error`. - pub(in crate::execution::platform_events::identity_credit_withdrawal) fn fetch_transactions_block_inclusion_status( + pub(in crate::execution::platform_events::withdrawals) fn fetch_transactions_block_inclusion_status( &self, current_chain_locked_core_height: u32, - transaction_identifiers: Vec<[u8; 32]>, + withdrawal_indices: &[WithdrawalTransactionIndex], platform_version: &PlatformVersion, - ) -> Result, Error> { + ) -> Result, Error> { match platform_version .drive_abci .methods - .identity_credit_withdrawal + .withdrawals .fetch_transactions_block_inclusion_status { 0 => self.fetch_transactions_block_inclusion_status_v0( current_chain_locked_core_height, - transaction_identifiers, + withdrawal_indices, ), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "fetch_transactions_block_inclusion_status".to_string(), diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/fetch_transactions_block_inclusion_status/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/fetch_transactions_block_inclusion_status/v0/mod.rs new file mode 100644 index 0000000000..86433d8c03 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/fetch_transactions_block_inclusion_status/v0/mod.rs @@ -0,0 +1,31 @@ +use dashcore_rpc::dashcore_rpc_json::AssetUnlockStatus; +use drive::drive::identity::withdrawals::WithdrawalTransactionIndex; +use std::collections::BTreeMap; + +use crate::{error::Error, platform_types::platform::Platform, rpc::core::CoreRPCLike}; + +impl Platform +where + C: CoreRPCLike, +{ + /// Fetch Core transactions by range of Core heights + pub(super) fn fetch_transactions_block_inclusion_status_v0( + &self, + current_chain_locked_core_height: u32, + withdrawal_indices: &[WithdrawalTransactionIndex], + ) -> Result, Error> { + let asset_unlock_statuses_result = self + .core_rpc + .get_asset_unlock_statuses(withdrawal_indices, current_chain_locked_core_height)?; + + Ok(asset_unlock_statuses_result + .into_iter() + .map(|asset_unlock_status_result| { + ( + asset_unlock_status_result.index, + asset_unlock_status_result.status, + ) + }) + .collect()) + } +} diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/mod.rs index 2c5c4be28e..7541211056 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/mod.rs @@ -1 +1,6 @@ -mod check_withdrawals; +pub(in crate::execution) mod append_signatures_and_broadcast_withdrawal_transactions; +pub(in crate::execution) mod build_untied_withdrawal_transactions_from_documents; +pub(in crate::execution) mod dequeue_and_build_unsigned_withdrawal_transactions; +pub(in crate::execution) mod fetch_transactions_block_inclusion_status; +pub(in crate::execution) mod pool_withdrawals_into_transactions_queue; +pub(in crate::execution) mod update_broadcasted_withdrawal_statuses; diff --git a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/pool_withdrawals_into_transactions_queue/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/mod.rs similarity index 85% rename from packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/pool_withdrawals_into_transactions_queue/mod.rs rename to packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/mod.rs index fded57be05..5d79a1c601 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/pool_withdrawals_into_transactions_queue/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/mod.rs @@ -1,10 +1,10 @@ use crate::error::execution::ExecutionError; use crate::error::Error; -use crate::execution::types::block_execution_context::BlockExecutionContext; use crate::platform_types::platform::Platform; use crate::rpc::core::CoreRPCLike; +use dpp::block::block_info::BlockInfo; use dpp::version::PlatformVersion; -use drive::grovedb::Transaction; +use drive::grovedb::TransactionArg; mod v0; @@ -27,18 +27,18 @@ where /// * `Result<(), Error>` - Returns `Ok(())` if successful, otherwise returns an `Error`. pub(in crate::execution) fn pool_withdrawals_into_transactions_queue( &self, - block_execution_context: &BlockExecutionContext, - transaction: &Transaction, + block_info: &BlockInfo, + transaction: TransactionArg, platform_version: &PlatformVersion, ) -> Result<(), Error> { match platform_version .drive_abci .methods - .identity_credit_withdrawal + .withdrawals .pool_withdrawals_into_transactions_queue { 0 => self.pool_withdrawals_into_transactions_queue_v0( - block_execution_context, + block_info, transaction, platform_version, ), diff --git a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/pool_withdrawals_into_transactions_queue/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v0/mod.rs similarity index 52% rename from packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/pool_withdrawals_into_transactions_queue/v0/mod.rs rename to packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v0/mod.rs index 5778cc00b9..8562c69f25 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/pool_withdrawals_into_transactions_queue/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v0/mod.rs @@ -5,17 +5,16 @@ use dpp::document::document_methods::DocumentMethodsV0; use dpp::document::{DocumentV0Getters, DocumentV0Setters}; use dpp::version::PlatformVersion; -use drive::dpp::util::hash; -use drive::drive::identity::withdrawals::WithdrawalTransactionIdAndBytes; -use drive::grovedb::Transaction; +use drive::drive::identity::withdrawals::{ + WithdrawalTransactionIndex, WithdrawalTransactionIndexAndBytes, +}; +use drive::grovedb::TransactionArg; use dpp::system_data_contracts::withdrawals_contract; use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; +use drive::drive::config::DEFAULT_QUERY_LIMIT; +use drive::query::DriveQuery; -use crate::execution::types::block_execution_context::v0::BlockExecutionContextV0Getters; -use crate::execution::types::block_execution_context::BlockExecutionContext; -use crate::execution::types::block_state_info::v0::BlockStateInfoV0Getters; -use crate::platform_types::epoch_info::v0::EpochInfoV0Getters; use crate::{ error::{execution::ExecutionError, Error}, platform_types::platform::Platform, @@ -29,37 +28,14 @@ where /// Pool withdrawal documents into transactions pub(super) fn pool_withdrawals_into_transactions_queue_v0( &self, - block_execution_context: &BlockExecutionContext, - transaction: &Transaction, + block_info: &BlockInfo, + transaction: TransactionArg, platform_version: &PlatformVersion, ) -> Result<(), Error> { - let block_info = BlockInfo { - time_ms: block_execution_context.block_state_info().block_time_ms(), - height: block_execution_context.block_state_info().height(), - core_height: block_execution_context - .block_state_info() - .core_chain_locked_height(), - epoch: Epoch::new(block_execution_context.epoch_info().current_epoch_index())?, - }; - - let data_contract_id = withdrawals_contract::ID; - - let (_, Some(contract_fetch_info)) = self.drive.get_contract_with_fetch_info_and_fee( - data_contract_id.to_buffer(), - None, - true, - Some(transaction), - platform_version, - )? - else { - return Err(Error::Execution(ExecutionError::CorruptedCodeExecution( - "can't fetch withdrawal data contract", - ))); - }; - - let mut documents = self.drive.fetch_withdrawal_documents_by_status( + let mut documents = self.drive.fetch_oldest_withdrawal_documents_by_status( withdrawals_contract::WithdrawalStatus::QUEUED.into(), - Some(transaction), + DEFAULT_QUERY_LIMIT, + transaction, platform_version, )?; @@ -67,27 +43,28 @@ where return Ok(()); } - let mut drive_operations = vec![]; + let start_transaction_index = self + .drive + .fetch_next_withdrawal_transaction_index(transaction, platform_version)?; - let withdrawal_transactions = self.build_withdrawal_transactions_from_documents( - &documents, - &mut drive_operations, - Some(transaction), - platform_version, - )?; + let untied_withdrawal_transactions = self + .build_untied_withdrawal_transactions_from_documents( + &documents, + start_transaction_index, + platform_version, + )?; for document in documents.iter_mut() { - let Some((_, transaction_bytes)) = withdrawal_transactions.get(&document.id()) else { + let Some((transaction_index, _)) = untied_withdrawal_transactions.get(&document.id()) + else { return Err(Error::Execution(ExecutionError::CorruptedCodeExecution( "transactions must contain a transaction", ))); }; - let transaction_id = hash::hash_to_vec(transaction_bytes); - - document.set_bytes( - withdrawal::properties::TRANSACTION_ID, - transaction_id.clone(), + document.set_u64( + withdrawal::properties::TRANSACTION_INDEX, + *transaction_index, ); document.set_u8( @@ -111,11 +88,45 @@ where })?; } + let withdrawal_transactions: Vec = + untied_withdrawal_transactions.into_values().collect(); + + let withdrawal_transactions_count = withdrawal_transactions.len(); + + let mut drive_operations = Vec::new(); + + self.drive + .add_enqueue_untied_withdrawal_transaction_operations( + withdrawal_transactions, + &mut drive_operations, + platform_version, + )?; + + let end_transaction_index = start_transaction_index + withdrawal_transactions_count as u64; + + self.drive + .add_update_next_withdrawal_transaction_index_operation( + end_transaction_index, + &mut drive_operations, + platform_version, + )?; + + tracing::debug!( + "Pooled {} withdrawal documents into {} transactions with indices from {} to {}", + documents.len(), + withdrawal_transactions_count, + start_transaction_index, + end_transaction_index, + ); + + let cache = self.drive.cache.read().unwrap(); + self.drive.add_update_multiple_documents_operations( &documents, - &contract_fetch_info.contract, - contract_fetch_info - .contract + &cache.system_data_contracts.withdrawals, + cache + .system_data_contracts + .withdrawals .document_type_for_name(withdrawal::NAME) .map_err(|_| { Error::Execution(ExecutionError::CorruptedCodeExecution( @@ -126,19 +137,11 @@ where &platform_version.drive, )?; - let withdrawal_transactions: Vec = - withdrawal_transactions.values().cloned().collect(); - - self.drive.add_enqueue_withdrawal_transaction_operations( - &withdrawal_transactions, - &mut drive_operations, - ); - self.drive.apply_drive_operations( drive_operations, true, - &block_info, - Some(transaction), + block_info, + transaction, platform_version, )?; @@ -149,8 +152,6 @@ where #[cfg(test)] mod tests { use super::*; - use dashcore_rpc::dashcore::QuorumHash; - use dpp::dashcore::hashes::Hash; use dpp::data_contracts::SystemDataContract; use dpp::identifier::Identifier; @@ -159,10 +160,6 @@ mod tests { use dpp::withdrawal::Pooling; use drive::tests::helpers::setup::{setup_document, setup_system_data_contract}; - use crate::execution::types::block_execution_context::v0::BlockExecutionContextV0; - use crate::execution::types::block_state_info::v0::BlockStateInfoV0; - use crate::platform_types::epoch_info::v0::EpochInfoV0; - use crate::platform_types::platform_state::v0::PlatformStateV0; use crate::test::helpers::setup::TestPlatformBuilder; use dpp::platform_value::btreemap_extensions::BTreeValueMapHelper; use dpp::platform_value::platform_value; @@ -178,51 +175,15 @@ mod tests { let transaction = platform.drive.grove.start_transaction(); - platform.block_execution_context.write().unwrap().replace( - BlockExecutionContextV0 { - block_state_info: BlockStateInfoV0 { - height: 1, - round: 0, - block_time_ms: 1, - previous_block_time_ms: Some(1), - proposer_pro_tx_hash: [ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, - ], - core_chain_locked_height: 96, - block_hash: None, - app_hash: None, - } - .into(), - epoch_info: EpochInfoV0 { - current_epoch_index: 1, - previous_epoch_index: None, - is_epoch_change: false, - } - .into(), - hpmn_count: 100, - withdrawal_transactions: Default::default(), - block_platform_state: PlatformStateV0 { - last_committed_block_info: None, - current_protocol_version_in_consensus: 0, - next_epoch_protocol_version: 0, - current_validator_set_quorum_hash: QuorumHash::all_zeros(), - next_validator_set_quorum_hash: None, - validator_sets: Default::default(), - chain_lock_validating_quorums: Default::default(), - previous_height_chain_lock_validating_quorums: None, - full_masternode_list: Default::default(), - hpmn_masternode_list: Default::default(), - genesis_block_info: None, - } - .into(), - proposer_results: None, - } - .into(), - ); + let block_info = BlockInfo { + time_ms: 1, + height: 1, + core_height: 96, + epoch: Epoch::default(), + }; let data_contract = - load_system_data_contract(SystemDataContract::Withdrawals, &platform_version) + load_system_data_contract(SystemDataContract::Withdrawals, platform_version) .expect("to load system data contract"); setup_system_data_contract(&platform.drive, &data_contract, Some(&transaction)); @@ -281,41 +242,33 @@ mod tests { Some(&transaction), ); - let guarded_block_execution_context = platform.block_execution_context.write().unwrap(); - let block_execution_context = guarded_block_execution_context.as_ref().unwrap(); platform .pool_withdrawals_into_transactions_queue_v0( - block_execution_context, - &transaction, + &block_info, + Some(&transaction), platform_version, ) .expect("to pool withdrawal documents into transactions"); let updated_documents = platform .drive - .fetch_withdrawal_documents_by_status( + .fetch_oldest_withdrawal_documents_by_status( withdrawals_contract::WithdrawalStatus::POOLED.into(), + DEFAULT_QUERY_LIMIT, Some(&transaction), platform_version, ) .expect("to fetch withdrawal documents"); - let tx_ids = [ - "4b74f91644215904ff1aa4122b204ba674aea74d99a17c03fbda483692bf735b", - "897ec16cb13d802ee6acdaf55274c59f3509a4929d726bab919a962ed4a8703c", - ]; - - for document in updated_documents { + for (i, document) in updated_documents.into_iter().enumerate() { assert_eq!(document.revision(), Some(2)); - let tx_id: Vec = document + let tx_index = document .properties() - .get_bytes("transactionId") - .expect("to get transactionId"); - - let tx_id_hex = hex::encode(tx_id); + .get_u64(withdrawal::properties::TRANSACTION_INDEX) + .expect("to get transactionIndex"); - assert!(tx_ids.contains(&tx_id_hex.as_str())); + assert_eq!(tx_index, i as u64); } } } diff --git a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/update_broadcasted_withdrawal_transaction_statuses/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/update_broadcasted_withdrawal_statuses/mod.rs similarity index 76% rename from packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/update_broadcasted_withdrawal_transaction_statuses/mod.rs rename to packages/rs-drive-abci/src/execution/platform_events/withdrawals/update_broadcasted_withdrawal_statuses/mod.rs index d764c5a33c..af76346763 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/identity_credit_withdrawal/update_broadcasted_withdrawal_transaction_statuses/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/update_broadcasted_withdrawal_statuses/mod.rs @@ -1,8 +1,8 @@ use crate::error::execution::ExecutionError; use crate::error::Error; -use crate::execution::types::block_execution_context::BlockExecutionContext; use crate::platform_types::platform::Platform; use crate::rpc::core::CoreRPCLike; +use dpp::block::block_info::BlockInfo; use dpp::version::PlatformVersion; use drive::grovedb::Transaction; @@ -14,7 +14,7 @@ where { /// Update statuses for broadcasted withdrawals /// - /// This method is responsible for updating the status of withdrawal transactions that have been broadcasted. + /// This method is responsible for updating the status of withdrawal transactions that have been broadcasted and reached finality. /// This is done based on the height of the last synced core block, which helps in determining whether the withdrawal /// transaction has been completed or expired. /// @@ -35,25 +35,25 @@ where /// * There is an issue interacting with the underlying storage. /// * There is an error fetching the withdrawal data contract. /// * There is an error getting the transactionId or transactionSignHeight from the withdrawal document. - pub fn update_broadcasted_withdrawal_transaction_statuses( + pub fn update_broadcasted_withdrawal_statuses( &self, - block_execution_context: &BlockExecutionContext, + block_info: &BlockInfo, transaction: &Transaction, platform_version: &PlatformVersion, ) -> Result<(), Error> { match platform_version .drive_abci .methods - .identity_credit_withdrawal - .update_broadcasted_withdrawal_transaction_statuses + .withdrawals + .update_broadcasted_withdrawal_statuses { - 0 => self.update_broadcasted_withdrawal_transaction_statuses_v0( - block_execution_context, + 0 => self.update_broadcasted_withdrawal_statuses_v0( + block_info, transaction, platform_version, ), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { - method: "update_broadcasted_withdrawal_transaction_statuses".to_string(), + method: "update_broadcasted_withdrawal_statuses".to_string(), known_versions: vec![0], received: version, })), diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/update_broadcasted_withdrawal_statuses/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/update_broadcasted_withdrawal_statuses/v0/mod.rs new file mode 100644 index 0000000000..d092769021 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/update_broadcasted_withdrawal_statuses/v0/mod.rs @@ -0,0 +1,327 @@ +use dashcore_rpc::json::AssetUnlockStatus; +use dpp::block::block_info::BlockInfo; +use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contracts::withdrawals_contract::WithdrawalStatus; +use dpp::document::document_methods::DocumentMethodsV0; +use dpp::document::{DocumentV0Getters, DocumentV0Setters}; +use dpp::platform_value::btreemap_extensions::BTreeValueMapHelper; +use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; +use dpp::version::PlatformVersion; +use itertools::Itertools; +use std::collections::HashSet; + +use drive::drive::batch::DriveOperation; +use drive::drive::config::DEFAULT_QUERY_LIMIT; +use drive::drive::identity::withdrawals::WithdrawalTransactionIndex; +use drive::grovedb::Transaction; + +use crate::{ + error::{execution::ExecutionError, Error}, + platform_types::platform::Platform, + rpc::core::CoreRPCLike, +}; + +const NUMBER_OF_BLOCKS_BEFORE_EXPIRED: u32 = 48; + +impl Platform +where + C: CoreRPCLike, +{ + /// Update statuses for broadcasted withdrawals + pub(super) fn update_broadcasted_withdrawal_statuses_v0( + &self, + block_info: &BlockInfo, + transaction: &Transaction, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + let broadcasted_withdrawal_documents = + self.drive.fetch_oldest_withdrawal_documents_by_status( + WithdrawalStatus::BROADCASTED.into(), + DEFAULT_QUERY_LIMIT, + transaction.into(), + platform_version, + )?; + + if broadcasted_withdrawal_documents.is_empty() { + return Ok(()); + } + + // Collecting unique withdrawal indices + let broadcasted_withdrawal_indices = broadcasted_withdrawal_documents + .iter() + .map(|document| { + document + .properties() + .get_optional_u64(withdrawal::properties::TRANSACTION_INDEX)? + .ok_or(Error::Execution(ExecutionError::CorruptedDriveResponse( + "Can't get transaction index from withdrawal document".to_string(), + ))) + }) + .collect::, Error>>()? + .into_iter() + .collect_vec(); + + let withdrawal_transaction_statuses = self.fetch_transactions_block_inclusion_status( + block_info.core_height, + &broadcasted_withdrawal_indices, + platform_version, + )?; + + let mut drive_operations: Vec = vec![]; + + // Collecting only documents that have been updated + let mut documents_to_update = Vec::new(); + + for mut document in broadcasted_withdrawal_documents { + let withdrawal_index = document + .properties() + .get_optional_u64(withdrawal::properties::TRANSACTION_INDEX)? + .ok_or(Error::Execution(ExecutionError::CorruptedDriveResponse( + "Can't get transaction index from withdrawal document".to_string(), + )))?; + + let transaction_sign_height = document + .properties() + .get_optional_u64(withdrawal::properties::TRANSACTION_SIGN_HEIGHT)? + .ok_or(Error::Execution(ExecutionError::CorruptedDriveResponse( + "Can't get transaction sign height from withdrawal document".to_string(), + )))? as u32; + + let withdrawal_transaction_status = withdrawal_transaction_statuses + .get(&withdrawal_index) + .unwrap_or_else(|| { + tracing::warn!( + "Withdrawal transaction with index {} is not found in Core", + withdrawal_index + ); + + &AssetUnlockStatus::Unknown + }); + + let block_height_difference = block_info.core_height - transaction_sign_height; + + let status = if withdrawal_transaction_status == &AssetUnlockStatus::Chainlocked { + tracing::debug!( + transaction_sign_height, + "Withdrawal with transaction index {} is marked as complete", + withdrawal_index + ); + + WithdrawalStatus::COMPLETE + } else if block_height_difference > NUMBER_OF_BLOCKS_BEFORE_EXPIRED { + tracing::debug!( + transaction_sign_height, + "Withdrawal with transaction index {} is marked as expired", + withdrawal_index + ); + + WithdrawalStatus::EXPIRED + } else { + continue; + }; + + document.set_u8(withdrawal::properties::STATUS, status.into()); + + document.set_u64(withdrawal::properties::UPDATED_AT, block_info.time_ms); + + document.increment_revision().map_err(Error::Protocol)?; + + documents_to_update.push(document); + } + + if documents_to_update.is_empty() { + return Ok(()); + } + + let cache = self.drive.cache.read().unwrap(); + + self.drive.add_update_multiple_documents_operations( + &documents_to_update, + &cache.system_data_contracts.withdrawals, + cache + .system_data_contracts + .withdrawals + .document_type_for_name(withdrawal::NAME) + .map_err(|_| { + Error::Execution(ExecutionError::CorruptedCodeExecution( + "Can't fetch withdrawal data contract", + )) + })?, + &mut drive_operations, + &platform_version.drive, + )?; + + self.drive.apply_drive_operations( + drive_operations, + true, + block_info, + transaction.into(), + platform_version, + )?; + + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::rpc::core::MockCoreRPCLike; + use crate::test::helpers::setup::TestPlatformBuilder; + use dashcore_rpc::json::{AssetUnlockStatus, AssetUnlockStatusResult}; + use dpp::data_contract::accessors::v0::DataContractV0Getters; + use dpp::document::DocumentV0Getters; + use dpp::identity::core_script::CoreScript; + use dpp::platform_value::platform_value; + use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; + use dpp::version::PlatformVersion; + use dpp::withdrawal::Pooling; + use dpp::{ + data_contracts::withdrawals_contract, tests::fixtures::get_withdrawal_document_fixture, + }; + use dpp::{ + prelude::Identifier, + system_data_contracts::{load_system_data_contract, SystemDataContract}, + }; + use drive::tests::helpers::setup::setup_document; + use drive::tests::helpers::setup::setup_system_data_contract; + + #[test] + fn test_statuses_are_updated() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure(); + + let mut mock_rpc_client = MockCoreRPCLike::new(); + + mock_rpc_client + .expect_get_asset_unlock_statuses() + .returning(move |indices: &[u64], _core_chain_locked_height| { + Ok(indices + .iter() + .map(|index| { + let status = if index == &1 { + AssetUnlockStatus::Chainlocked + } else { + AssetUnlockStatus::Unknown + }; + + AssetUnlockStatusResult { + index: *index, + status, + } + }) + .collect()) + }); + + platform.core_rpc = mock_rpc_client; + + let transaction = platform.drive.grove.start_transaction(); + + let block_info = BlockInfo { + time_ms: 0, + height: 1, + core_height: 96, + epoch: Default::default(), + }; + + let data_contract = + load_system_data_contract(SystemDataContract::Withdrawals, platform_version) + .expect("to load system data contract"); + + setup_system_data_contract(&platform.drive, &data_contract, Some(&transaction)); + + let owner_id = Identifier::new([1u8; 32]); + + let document_1 = get_withdrawal_document_fixture( + &data_contract, + owner_id, + platform_value!({ + "amount": 1000u64, + "coreFeePerByte": 1u32, + "pooling": Pooling::Never, + "outputScript": CoreScript::from_bytes((0..23).collect::>()), + "status": withdrawals_contract::WithdrawalStatus::BROADCASTED as u8, + "transactionIndex": 1u64, + "transactionSignHeight": 1, + }), + None, + platform_version.protocol_version, + ) + .expect("expected withdrawal document"); + + let document_type = data_contract + .document_type_for_name(withdrawal::NAME) + .expect("expected to get document type"); + + setup_document( + &platform.drive, + &document_1, + &data_contract, + document_type, + Some(&transaction), + ); + + let document_2 = get_withdrawal_document_fixture( + &data_contract, + owner_id, + platform_value!({ + "amount": 1000u64, + "coreFeePerByte": 1u32, + "pooling": Pooling::Never as u8, + "outputScript": CoreScript::from_bytes((0..23).collect::>()), + "status": withdrawals_contract::WithdrawalStatus::BROADCASTED as u8, + "transactionIndex": 2u64, + "transactionSignHeight": 1, + }), + None, + platform_version.protocol_version, + ) + .expect("expected withdrawal document"); + + setup_document( + &platform.drive, + &document_2, + &data_contract, + document_type, + Some(&transaction), + ); + + platform + .update_broadcasted_withdrawal_statuses_v0(&block_info, &transaction, platform_version) + .expect("to update withdrawal statuses"); + + let documents = platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + WithdrawalStatus::EXPIRED.into(), + DEFAULT_QUERY_LIMIT, + Some(&transaction), + platform_version, + ) + .expect("to fetch documents by status"); + + assert_eq!(documents.len(), 1); + assert_eq!( + documents.first().unwrap().id().to_vec(), + document_2.id().to_vec() + ); + + let documents = platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + WithdrawalStatus::COMPLETE.into(), + DEFAULT_QUERY_LIMIT, + Some(&transaction), + platform_version, + ) + .expect("to fetch documents by status"); + + assert_eq!(documents.len(), 1); + assert_eq!( + documents.first().unwrap().id().to_vec(), + document_1.id().to_vec() + ); + } +} diff --git a/packages/rs-drive-abci/src/execution/types/block_execution_context/mod.rs b/packages/rs-drive-abci/src/execution/types/block_execution_context/mod.rs index 89e78136e9..a0054fff7a 100644 --- a/packages/rs-drive-abci/src/execution/types/block_execution_context/mod.rs +++ b/packages/rs-drive-abci/src/execution/types/block_execution_context/mod.rs @@ -9,9 +9,8 @@ use crate::execution::types::block_execution_context::v0::{ use crate::execution::types::block_state_info::BlockStateInfo; use crate::platform_types::epoch_info::EpochInfo; use crate::platform_types::platform_state::PlatformState; +use crate::platform_types::withdrawal::unsigned_withdrawal_txs::v0::UnsignedWithdrawalTxs; use derive_more::From; -use dpp::dashcore::Txid; -use std::collections::BTreeMap; use tenderdash_abci::proto::abci::ResponsePrepareProposal; /// The versioned block execution context @@ -49,9 +48,9 @@ impl BlockExecutionContextV0Getters for BlockExecutionContext { } } - fn withdrawal_transactions(&self) -> &BTreeMap> { + fn unsigned_withdrawal_transactions(&self) -> &UnsignedWithdrawalTxs { match self { - BlockExecutionContext::V0(v0) => &v0.withdrawal_transactions, + BlockExecutionContext::V0(v0) => &v0.unsigned_withdrawal_transactions, } } @@ -87,9 +86,9 @@ impl BlockExecutionContextV0Setters for BlockExecutionContext { } } - fn set_withdrawal_transactions(&mut self, transactions: BTreeMap>) { + fn set_unsigned_withdrawal_transactions(&mut self, transactions: UnsignedWithdrawalTxs) { match self { - BlockExecutionContext::V0(v0) => v0.withdrawal_transactions = transactions, + BlockExecutionContext::V0(v0) => v0.unsigned_withdrawal_transactions = transactions, } } @@ -119,12 +118,6 @@ impl BlockExecutionContextV0MutableGetters for BlockExecutionContext { } } - fn withdrawal_transactions_mut(&mut self) -> &mut BTreeMap> { - match self { - BlockExecutionContext::V0(v0) => v0.withdrawal_transactions_mut(), - } - } - fn block_platform_state_mut(&mut self) -> &mut PlatformState { match self { BlockExecutionContext::V0(v0) => v0.block_platform_state_mut(), @@ -136,6 +129,12 @@ impl BlockExecutionContextV0MutableGetters for BlockExecutionContext { BlockExecutionContext::V0(v0) => v0.proposer_results_mut(), } } + + fn unsigned_withdrawal_transactions_mut(&mut self) -> &mut UnsignedWithdrawalTxs { + match self { + BlockExecutionContext::V0(v0) => v0.unsigned_withdrawal_transactions_mut(), + } + } } impl BlockExecutionContextV0OwnedGetters for BlockExecutionContext { @@ -153,13 +152,6 @@ impl BlockExecutionContextV0OwnedGetters for BlockExecutionContext { } } - /// Consumes the object and returns the owned `withdrawal_transactions`. - fn withdrawal_transactions_owned(self) -> BTreeMap> { - match self { - BlockExecutionContext::V0(v0) => v0.withdrawal_transactions, - } - } - /// Consumes the object and returns the owned `PlatformState`. fn block_platform_state_owned(self) -> PlatformState { match self { diff --git a/packages/rs-drive-abci/src/execution/types/block_execution_context/v0/mod.rs b/packages/rs-drive-abci/src/execution/types/block_execution_context/v0/mod.rs index 587407bb47..0ae169080c 100644 --- a/packages/rs-drive-abci/src/execution/types/block_execution_context/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/types/block_execution_context/v0/mod.rs @@ -31,6 +31,7 @@ use crate::execution::types::block_state_info::BlockStateInfo; use crate::platform_types::epoch_info::EpochInfo; use crate::platform_types::platform_state::PlatformState; +use crate::platform_types::withdrawal::unsigned_withdrawal_txs::v0::UnsignedWithdrawalTxs; use dashcore_rpc::dashcore::Txid; use std::collections::BTreeMap; use tenderdash_abci::proto::abci::ResponsePrepareProposal; @@ -44,8 +45,8 @@ pub struct BlockExecutionContextV0 { pub epoch_info: EpochInfo, /// Total hpmn count pub hpmn_count: u32, - /// Current withdrawal transactions hash -> Transaction - pub withdrawal_transactions: BTreeMap>, + /// Unsigned withdrawal transactions to be available for extend and verify vote handlers + pub unsigned_withdrawal_transactions: UnsignedWithdrawalTxs, /// Block state pub block_platform_state: PlatformState, /// The response prepare proposal if proposed by us @@ -63,7 +64,7 @@ pub trait BlockExecutionContextV0Getters { fn hpmn_count(&self) -> u32; /// Returns a reference of the withdrawal_transactions field. - fn withdrawal_transactions(&self) -> &BTreeMap>; + fn unsigned_withdrawal_transactions(&self) -> &UnsignedWithdrawalTxs; /// Returns a reference of the block_platform_state field. fn block_platform_state(&self) -> &PlatformState; @@ -84,7 +85,7 @@ pub trait BlockExecutionContextV0Setters { fn set_hpmn_count(&mut self, count: u32); /// Sets the withdrawal_transactions field. - fn set_withdrawal_transactions(&mut self, transactions: BTreeMap>); + fn set_unsigned_withdrawal_transactions(&mut self, transactions: UnsignedWithdrawalTxs); /// Sets the block_platform_state field. fn set_block_platform_state(&mut self, state: PlatformState); @@ -101,14 +102,14 @@ pub trait BlockExecutionContextV0MutableGetters { /// Returns a mutable reference to the epoch_info field. fn epoch_info_mut(&mut self) -> &mut EpochInfo; - /// Returns a mutable reference to the withdrawal_transactions field. - fn withdrawal_transactions_mut(&mut self) -> &mut BTreeMap>; - /// Returns a mutable reference to the block_platform_state field. fn block_platform_state_mut(&mut self) -> &mut PlatformState; /// Returns a mutable reference to the proposer_results field. fn proposer_results_mut(&mut self) -> Option<&mut ResponsePrepareProposal>; + + /// Returns a mut reference of the withdrawal_transactions field. + fn unsigned_withdrawal_transactions_mut(&mut self) -> &mut UnsignedWithdrawalTxs; } /// A trait defining methods for interacting with a BlockExecutionContextV0. @@ -119,9 +120,6 @@ pub trait BlockExecutionContextV0OwnedGetters { /// Consumes the BlockExecutionContextV0 and returns the epoch_info field. fn epoch_info_owned(self) -> EpochInfo; - /// Consumes the BlockExecutionContextV0 and returns the withdrawal_transactions field. - fn withdrawal_transactions_owned(self) -> BTreeMap>; - /// Consumes the BlockExecutionContextV0 and returns the block_platform_state field. fn block_platform_state_owned(self) -> PlatformState; @@ -145,9 +143,9 @@ impl BlockExecutionContextV0Getters for BlockExecutionContextV0 { self.hpmn_count } - /// Returns a reference to the withdrawal_transactions field. - fn withdrawal_transactions(&self) -> &BTreeMap> { - &self.withdrawal_transactions + /// Returns a reference to the unsigned withdrawal transactions + fn unsigned_withdrawal_transactions(&self) -> &UnsignedWithdrawalTxs { + &self.unsigned_withdrawal_transactions } /// Returns a reference to the block_platform_state field. @@ -175,8 +173,8 @@ impl BlockExecutionContextV0Setters for BlockExecutionContextV0 { self.hpmn_count = count; } /// Sets the withdrawal_transactions field. - fn set_withdrawal_transactions(&mut self, transactions: BTreeMap>) { - self.withdrawal_transactions = transactions; + fn set_unsigned_withdrawal_transactions(&mut self, transactions: UnsignedWithdrawalTxs) { + self.unsigned_withdrawal_transactions = transactions; } /// Sets the block_platform_state field. fn set_block_platform_state(&mut self, state: PlatformState) { @@ -199,11 +197,6 @@ impl BlockExecutionContextV0MutableGetters for BlockExecutionContextV0 { &mut self.epoch_info } - /// Returns a mutable reference to the withdrawal_transactions field. - fn withdrawal_transactions_mut(&mut self) -> &mut BTreeMap> { - &mut self.withdrawal_transactions - } - /// Returns a mutable reference to the block_platform_state field. fn block_platform_state_mut(&mut self) -> &mut PlatformState { &mut self.block_platform_state @@ -213,6 +206,10 @@ impl BlockExecutionContextV0MutableGetters for BlockExecutionContextV0 { fn proposer_results_mut(&mut self) -> Option<&mut ResponsePrepareProposal> { self.proposer_results.as_mut() } + + fn unsigned_withdrawal_transactions_mut(&mut self) -> &mut UnsignedWithdrawalTxs { + &mut self.unsigned_withdrawal_transactions + } } impl BlockExecutionContextV0OwnedGetters for BlockExecutionContextV0 { @@ -226,11 +223,6 @@ impl BlockExecutionContextV0OwnedGetters for BlockExecutionContextV0 { self.epoch_info } - /// Consumes the object and returns the owned `BTreeMap` of withdrawal transactions. - fn withdrawal_transactions_owned(self) -> BTreeMap> { - self.withdrawal_transactions - } - /// Consumes the object and returns the owned `PlatformState`. fn block_platform_state_owned(self) -> PlatformState { self.block_platform_state diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs index 3e6e7937a7..3f70ebd708 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs @@ -104,13 +104,11 @@ pub fn delete_withdrawal_data_trigger_v0( .get_integer("status") .map_err(ProtocolError::ValueError)?; - if status != withdrawals_contract::WithdrawalStatus::COMPLETE as u8 - || status != withdrawals_contract::WithdrawalStatus::EXPIRED as u8 - { + if status != withdrawals_contract::WithdrawalStatus::COMPLETE as u8 { let err = DataTriggerConditionError::new( data_contract.id(), dt_delete.base().id(), - "withdrawal deletion is allowed only for COMPLETE and EXPIRED statuses".to_string(), + "withdrawal deletion is allowed only for COMPLETE statuses".to_string(), ); result.add_error(err); @@ -221,7 +219,6 @@ mod tests { "status": withdrawals_contract::WithdrawalStatus::BROADCASTED as u8, "transactionIndex": 1u64, "transactionSignHeight": 93u64, - "transactionId": Bytes32::new([1;32]), }), None, platform_version.protocol_version, @@ -275,7 +272,6 @@ mod tests { "status": withdrawals_contract::WithdrawalStatus::BROADCASTED as u8, "transactionIndex": 1u64, "transactionSignHeight": 93u64, - "transactionId": Bytes32::new([1;32]), }), None, platform_version.protocol_version, @@ -332,7 +328,7 @@ mod tests { assert_eq!( error.to_string(), - "withdrawal deletion is allowed only for COMPLETE and EXPIRED statuses" + "withdrawal deletion is allowed only for COMPLETE statuses" ); } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/state/v0/mod.rs index 04e89cb367..97f654619a 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/state/v0/mod.rs @@ -1,6 +1,7 @@ use crate::error::Error; use crate::platform_types::platform::PlatformRef; use crate::rpc::core::CoreRPCLike; +use dpp::balances::credits::CREDITS_PER_DUFF; use dpp::consensus::signature::{BasicECDSAError, SignatureError}; use dpp::consensus::state::identity::invalid_asset_lock_proof_value::InvalidAssetLockProofValueError; @@ -162,7 +163,10 @@ impl IdentityCreateStateTransitionStateValidationV0 for IdentityCreateTransition )); } - match IdentityCreateTransitionAction::try_from_borrowed(self, tx_out.value * 1000) { + match IdentityCreateTransitionAction::try_from_borrowed( + self, + tx_out.value * CREDITS_PER_DUFF, + ) { Ok(action) => { validation_result.set_data(action.into()); } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/structure/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/structure/v0/mod.rs index d50df91f7c..f1680dbcd0 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/structure/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/structure/v0/mod.rs @@ -8,13 +8,14 @@ use dpp::consensus::ConsensusError; use crate::error::Error; use dpp::state_transition::identity_credit_withdrawal_transition::accessors::IdentityCreditWithdrawalTransitionAccessorsV0; +use dpp::state_transition::identity_credit_withdrawal_transition::v0::{ + MIN_CORE_FEE_PER_BYTE, MIN_WITHDRAWAL_AMOUNT, +}; use dpp::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition; use dpp::util::is_fibonacci_number::is_fibonacci_number; use dpp::validation::SimpleConsensusValidationResult; use dpp::withdrawal::Pooling; -const MIN_WITHDRAWAL_AMOUNT: u64 = 1000; - pub(in crate::execution::validation::state_transition::state_transitions::identity_credit_withdrawal) trait IdentityCreditWithdrawalStateTransitionStructureValidationV0 { fn validate_base_structure_v0(&self) -> Result; } @@ -47,10 +48,20 @@ impl IdentityCreditWithdrawalStateTransitionStructureValidationV0 } // validate core_fee is in fibonacci sequence + if !is_fibonacci_number(self.core_fee_per_byte() as u64) { + result.add_error(InvalidIdentityCreditWithdrawalTransitionCoreFeeError::new( + self.core_fee_per_byte(), + MIN_CORE_FEE_PER_BYTE, + )); + + return Ok(result); + } - if !is_fibonacci_number(self.core_fee_per_byte()) { + // validate core_fee is in not less than minimal relay fee + if self.core_fee_per_byte() < MIN_CORE_FEE_PER_BYTE { result.add_error(InvalidIdentityCreditWithdrawalTransitionCoreFeeError::new( self.core_fee_per_byte(), + MIN_CORE_FEE_PER_BYTE, )); return Ok(result); diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/state/v0/mod.rs index a78c072465..6532f3ba87 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/state/v0/mod.rs @@ -1,6 +1,7 @@ use crate::error::Error; use crate::platform_types::platform::PlatformRef; use crate::rpc::core::CoreRPCLike; +use dpp::balances::credits::CREDITS_PER_DUFF; use dpp::consensus::signature::{BasicECDSAError, SignatureError}; use dpp::consensus::state::identity::invalid_asset_lock_proof_value::InvalidAssetLockProofValueError; @@ -125,7 +126,10 @@ impl IdentityTopUpStateTransitionStateValidationV0 for IdentityTopUpTransition { )); } - match IdentityTopUpTransitionAction::try_from_borrowed(self, &tx_out.value * 1000) { + match IdentityTopUpTransitionAction::try_from_borrowed( + self, + tx_out.value * CREDITS_PER_DUFF, + ) { Ok(action) => { validation_result.set_data(action.into()); } diff --git a/packages/rs-drive-abci/src/mimic/mod.rs b/packages/rs-drive-abci/src/mimic/mod.rs index a3942c779f..05780e1dbf 100644 --- a/packages/rs-drive-abci/src/mimic/mod.rs +++ b/packages/rs-drive-abci/src/mimic/mod.rs @@ -2,36 +2,36 @@ use crate::abci::server::AbciApplication; use crate::abci::AbciError; use crate::error::execution::ExecutionError; use crate::error::Error; -use bytes::Buf; +use crate::execution::types::block_execution_context::v0::BlockExecutionContextV0Getters; +use crate::execution::types::block_state_info::v0::BlockStateInfoV0Getters; +use crate::mimic::test_quorum::TestQuorumInfo; +use crate::platform_types::withdrawal::unsigned_withdrawal_txs::v0::{ + make_extend_vote_request_id, UnsignedWithdrawalTxs, +}; use crate::rpc::core::CoreRPCLike; -use dashcore_rpc::dashcore::blockdata::transaction::special_transaction::asset_unlock::qualified_asset_unlock::AssetUnlockPayload; -use dashcore_rpc::dashcore::blockdata::transaction::special_transaction::asset_unlock::request_info::AssetUnlockRequestInfo; -use dashcore_rpc::dashcore::blockdata::transaction::special_transaction::asset_unlock::unqualified_asset_unlock::AssetUnlockBaseTransactionInfo; -use dashcore_rpc::dashcore::blockdata::transaction::special_transaction::TransactionPayload::AssetUnlockPayloadType; -use dashcore_rpc::dashcore::bls_sig_utils::BLSSignature; -use dashcore_rpc::dashcore::consensus::Decodable; -use dashcore_rpc::dashcore; -use rand::rngs::StdRng; -use rand::{Rng, SeedableRng}; -use dpp::dashcore::hashes::Hash; use dpp::block::block_info::BlockInfo; +use dpp::dashcore::hashes::Hash; use dpp::serialization::PlatformSerializable; use dpp::state_transition::StateTransition; use dpp::util::deserializer::ProtocolVersion; +use rand::rngs::StdRng; +use rand::{Rng, SeedableRng}; use tenderdash_abci::proto::abci::response_verify_vote_extension::VerifyStatus; -use tenderdash_abci::proto::abci::{CommitInfo, ExecTxResult, RequestExtendVote, RequestFinalizeBlock, RequestPrepareProposal, RequestProcessProposal, RequestVerifyVoteExtension, ResponsePrepareProposal, ValidatorSetUpdate}; +use tenderdash_abci::proto::abci::tx_record::TxAction; +use tenderdash_abci::proto::abci::{ + CommitInfo, ExecTxResult, RequestExtendVote, RequestFinalizeBlock, RequestPrepareProposal, + RequestProcessProposal, RequestVerifyVoteExtension, ResponsePrepareProposal, + ValidatorSetUpdate, +}; use tenderdash_abci::proto::google::protobuf::Timestamp; use tenderdash_abci::proto::serializers::timestamp::ToMilis; use tenderdash_abci::proto::types::{ - Block, BlockId, Data, EvidenceList, Header, PartSetHeader, VoteExtension, VoteExtensionType, StateId, CanonicalVote, SignedMsgType, + Block, BlockId, CanonicalVote, Data, EvidenceList, Header, PartSetHeader, SignedMsgType, + StateId, VoteExtension, VoteExtensionType, }; use tenderdash_abci::signatures::Hashable; -use tenderdash_abci::{signatures::Signable, proto::version::Consensus, Application}; -use tenderdash_abci::proto::abci::tx_record::TxAction; -use crate::execution::types::block_execution_context::v0::BlockExecutionContextV0Getters; -use crate::execution::types::block_state_info::v0::BlockStateInfoV0Getters; -use crate::mimic::test_quorum::TestQuorumInfo; +use tenderdash_abci::{proto::version::Consensus, signatures::Signable, Application}; /// Test quorum for mimic block execution pub mod test_quorum; @@ -44,7 +44,7 @@ pub struct MimicExecuteBlockOutcome { /// state transaction results pub state_transaction_results: Vec<(StateTransition, ExecTxResult)>, /// withdrawal transactions - pub withdrawal_transactions: Vec, + pub withdrawal_transactions: UnsignedWithdrawalTxs, /// The next validators pub validator_set_update: Option, /// The next validators hash @@ -403,45 +403,23 @@ impl<'a, C: CoreRPCLike> AbciApplication<'a, C> { )))?.v0()?; let extensions = block_execution_context - .withdrawal_transactions - .keys() - .map(|tx_id| { + .unsigned_withdrawal_transactions + .iter() + .map(|tx| { + let sign_request_id = Some(make_extend_vote_request_id(tx)); + VoteExtension { - r#type: VoteExtensionType::ThresholdRecover as i32, - extension: tx_id.to_byte_array().to_vec(), - signature: vec![], //todo: signature - sign_request_id: None, + r#type: VoteExtensionType::ThresholdRecoverRaw as i32, + extension: tx.txid().to_byte_array().to_vec(), + sign_request_id, + signature: vec![0; 96], //todo: signature } }) .collect(); - //todo: tidy up and fix - let withdrawals = block_execution_context - .withdrawal_transactions - .values() - .map(|transaction| { - let AssetUnlockBaseTransactionInfo { - version, - lock_time, - output, - base_payload, - } = Decodable::consensus_decode(&mut transaction.reader()).expect("a"); - dashcore::Transaction { - version, - lock_time, - input: vec![], - output, - special_transaction_payload: Some(AssetUnlockPayloadType(AssetUnlockPayload { - base: base_payload, - request_info: AssetUnlockRequestInfo { - request_height: core_height, - quorum_hash: current_quorum.quorum_hash, - }, - quorum_sig: BLSSignature::from([0; 96]), - })), - } - }) - .collect(); + let withdrawal_transactions = block_execution_context + .unsigned_withdrawal_transactions + .clone(); drop(guarded_block_execution_context); @@ -583,7 +561,7 @@ impl<'a, C: CoreRPCLike> AbciApplication<'a, C> { Ok(MimicExecuteBlockOutcome { state_transaction_results, app_version: APP_VERSION, - withdrawal_transactions: withdrawals, + withdrawal_transactions, validator_set_update, next_validator_set_hash, root_app_hash: app_hash diff --git a/packages/rs-drive-abci/src/platform_types/state_transitions_processing_result/mod.rs b/packages/rs-drive-abci/src/platform_types/state_transitions_processing_result/mod.rs index d565277a72..0e07ae1d8b 100644 --- a/packages/rs-drive-abci/src/platform_types/state_transitions_processing_result/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/state_transitions_processing_result/mod.rs @@ -27,7 +27,8 @@ pub enum StateTransitionExecutionResult { #[derive(Debug, Default, Clone)] pub struct StateTransitionsProcessingResult { execution_results: Vec, - invalid_count: usize, + invalid_paid_count: usize, + invalid_unpaid_count: usize, valid_count: usize, failed_count: usize, fees: FeeResult, @@ -40,9 +41,11 @@ impl StateTransitionsProcessingResult { StateTransitionExecutionResult::DriveAbciError(_) => { self.failed_count += 1; } - StateTransitionExecutionResult::PaidConsensusError(_) - | StateTransitionExecutionResult::UnpaidConsensusError(_) => { - self.invalid_count += 1; + StateTransitionExecutionResult::PaidConsensusError(_) => { + self.invalid_paid_count += 1; + } + StateTransitionExecutionResult::UnpaidConsensusError(_) => { + self.invalid_unpaid_count += 1; } StateTransitionExecutionResult::SuccessfulExecution(_, actual_fees) => { self.valid_count += 1; @@ -56,9 +59,14 @@ impl StateTransitionsProcessingResult { Ok(()) } - /// Returns the number of invalid state transitions - pub fn invalid_count(&self) -> usize { - self.invalid_count + /// Returns the number of paid invalid state transitions + pub fn invalid_paid_count(&self) -> usize { + self.invalid_paid_count + } + + /// Returns the number of unpaid invalid state transitions + pub fn invalid_unpaid_count(&self) -> usize { + self.invalid_unpaid_count } /// Returns the number of valid state transitions diff --git a/packages/rs-drive-abci/src/platform_types/withdrawal/mod.rs b/packages/rs-drive-abci/src/platform_types/withdrawal/mod.rs index 39627a36d3..ec9a669431 100644 --- a/packages/rs-drive-abci/src/platform_types/withdrawal/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/withdrawal/mod.rs @@ -1 +1,2 @@ -pub(crate) mod withdrawal_txs; +/// Collection of unsigned withdrawal transactions +pub mod unsigned_withdrawal_txs; diff --git a/packages/rs-drive-abci/src/platform_types/withdrawal/withdrawal_txs/mod.rs b/packages/rs-drive-abci/src/platform_types/withdrawal/unsigned_withdrawal_txs/mod.rs similarity index 100% rename from packages/rs-drive-abci/src/platform_types/withdrawal/withdrawal_txs/mod.rs rename to packages/rs-drive-abci/src/platform_types/withdrawal/unsigned_withdrawal_txs/mod.rs diff --git a/packages/rs-drive-abci/src/platform_types/withdrawal/unsigned_withdrawal_txs/v0/mod.rs b/packages/rs-drive-abci/src/platform_types/withdrawal/unsigned_withdrawal_txs/v0/mod.rs new file mode 100644 index 0000000000..626a9ed710 --- /dev/null +++ b/packages/rs-drive-abci/src/platform_types/withdrawal/unsigned_withdrawal_txs/v0/mod.rs @@ -0,0 +1,142 @@ +//! Withdrawal transactions definitions and processing +use dpp::dashcore::consensus::Encodable; +use dpp::dashcore::hashes::Hash; +use dpp::dashcore::transaction::special_transaction::TransactionPayload::AssetUnlockPayloadType; +use dpp::dashcore::{Transaction, VarInt}; +use std::fmt::Display; +use tenderdash_abci::proto::types::VoteExtension; +use tenderdash_abci::proto::{abci::ExtendVoteExtension, types::VoteExtensionType}; + +/// Collection of withdrawal transactions processed at some height/round +#[derive(Debug, Default, Clone)] +pub struct UnsignedWithdrawalTxs(Vec); + +impl UnsignedWithdrawalTxs { + /// Returns iterator over borrowed withdrawal transactions + pub fn iter(&self) -> std::slice::Iter { + self.0.iter() + } + /// Returns a number of withdrawal transactions + pub fn len(&self) -> usize { + self.0.len() + } + /// Returns a reference to the first withdrawal transaction + pub fn first(&self) -> Option<&Transaction> { + self.0.first() + } + /// Returns a reference to the last withdrawal transaction + pub fn last(&self) -> Option<&Transaction> { + self.0.last() + } + /// Returns true if there are no withdrawal transactions + pub fn is_empty(&self) -> bool { + self.0.is_empty() + } + /// Creates a new collection of withdrawal transactions for Vec + pub fn from_vec(transactions: Vec) -> Self { + Self(transactions) + } + /// Drains all withdrawal transactions from the collection + + pub fn drain(&mut self) -> UnsignedWithdrawalTxs { + Self(self.0.drain(..).collect()) + } + + /// Appends another collection of unsigned withdrawal transactions + pub fn append(&mut self, mut other: Self) { + self.0.append(&mut other.0); + } + + /// Verifies that the collection of unsigned withdrawal transactions matches the given vote extensions + /// created based on these transactions + pub fn are_matching_with_vote_extensions(&self, other: &Vec) -> bool { + if self.0.len() != other.len() { + return false; + }; + + !self.0.iter().zip(other.iter()).any(|(tx, vote_extension)| { + let extend_vote_extension = tx_to_extend_vote_extension(tx); + + vote_extension.r#type != extend_vote_extension.r#type + || vote_extension.sign_request_id != extend_vote_extension.sign_request_id + || vote_extension.extension != extend_vote_extension.extension + }) + } +} + +impl IntoIterator for UnsignedWithdrawalTxs { + type Item = Transaction; + type IntoIter = std::vec::IntoIter; + + fn into_iter(self) -> Self::IntoIter { + self.0.into_iter() + } +} + +impl Display for UnsignedWithdrawalTxs { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.write_fmt(format_args!("txs:["))?; + for tx in &self.0 { + f.write_fmt(format_args!("{}", tx.txid().to_hex()))?; + } + f.write_str("]\n")?; + Ok(()) + } +} + +impl PartialEq> for UnsignedWithdrawalTxs { + fn eq(&self, other: &Vec) -> bool { + if self.0.len() != other.len() { + return false; + }; + + !self + .0 + .iter() + .zip(other.iter()) + .any(|(tx, other_vote_extension)| { + let self_vote_extension = tx_to_extend_vote_extension(tx); + + &self_vote_extension != other_vote_extension + }) + } +} + +impl From<&UnsignedWithdrawalTxs> for Vec { + fn from(value: &UnsignedWithdrawalTxs) -> Self { + value + .0 + .iter() + .map(tx_to_extend_vote_extension) + .collect::>() + } +} + +fn tx_to_extend_vote_extension(tx: &Transaction) -> ExtendVoteExtension { + let request_id = make_extend_vote_request_id(tx); + let extension = tx.txid().as_byte_array().to_vec(); + + ExtendVoteExtension { + r#type: VoteExtensionType::ThresholdRecoverRaw as i32, + extension, + sign_request_id: Some(request_id), + } +} + +pub(crate) fn make_extend_vote_request_id(asset_unlock_tx: &Transaction) -> Vec { + let Some(AssetUnlockPayloadType(ref payload)) = asset_unlock_tx.special_transaction_payload + else { + panic!("expected to get AssetUnlockPayloadType"); + }; + + let mut request_id = vec![]; + const ASSET_UNLOCK_REQUEST_ID_PREFIX: &str = "plwdtx"; + let prefix_len = VarInt(ASSET_UNLOCK_REQUEST_ID_PREFIX.len() as u64); + let index = payload.base.index.to_le_bytes(); + + prefix_len.consensus_encode(&mut request_id).unwrap(); + request_id.extend_from_slice(ASSET_UNLOCK_REQUEST_ID_PREFIX.as_bytes()); + request_id.extend_from_slice(&index); + + request_id +} diff --git a/packages/rs-drive-abci/src/platform_types/withdrawal/withdrawal_txs/v0/mod.rs b/packages/rs-drive-abci/src/platform_types/withdrawal/withdrawal_txs/v0/mod.rs deleted file mode 100644 index a1e129a4b5..0000000000 --- a/packages/rs-drive-abci/src/platform_types/withdrawal/withdrawal_txs/v0/mod.rs +++ /dev/null @@ -1,295 +0,0 @@ -//! Withdrawal transactions definitions and processing -use crate::abci::AbciError; -use dashcore_rpc::dashcore_rpc_json::QuorumType; -use dpp::block::block_info::BlockInfo; -use dpp::bls_signatures; -use dpp::fee::fee_result::FeeResult; -use dpp::validation::SimpleValidationResult; -use dpp::version::PlatformVersion; -use drive::{ - drive::{batch::DriveOperation, Drive}, - query::TransactionArg, -}; -use std::fmt::Display; -use tenderdash_abci::proto::{ - abci::ExtendVoteExtension, - types::{VoteExtension, VoteExtensionType}, -}; -use tenderdash_abci::signatures::Signable; - -const MAX_WITHDRAWAL_TXS: u16 = 16; - -/// Collection of withdrawal transactions processed at some height/round -#[derive(Debug)] -pub struct WithdrawalTxs<'a> { - inner: Vec, - drive_operations: Vec>, -} - -impl<'a> WithdrawalTxs<'a> { - /// Load pending withdrawal transactions from database - pub fn load(transaction: TransactionArg, drive: &Drive) -> Result { - let mut drive_operations = Vec::::new(); - - let inner = drive - .dequeue_withdrawal_transactions(MAX_WITHDRAWAL_TXS, transaction, &mut drive_operations) - .map_err(|e| AbciError::WithdrawalTransactionsDBLoadError(e.to_string()))? - .into_iter() - .map(|(_k, v)| VoteExtension { - r#type: VoteExtensionType::ThresholdRecover.into(), - extension: v, - signature: Default::default(), - sign_request_id: None, - }) - .collect::>(); - - Ok(Self { - drive_operations, - inner, - }) - } - - /// Basic validation of withdrawals. - /// - /// TODO: validate signature, etc. - pub fn validate(&self) -> Result<(), AbciError> { - if self.drive_operations.len() != self.inner.len() { - return Err(AbciError::InvalidState(format!( - "num of drive operations {} must match num of withdrawal transactions {}", - self.drive_operations.len(), - self.inner.len(), - ))); - } - - Ok(()) - } - - /// Finalize operations related to this withdrawal, as part of FinalizeBlock logic. - /// - /// Deletes withdrawal transactions that were executed. - pub fn finalize( - &self, - transaction: TransactionArg, - drive: &Drive, - block_info: &BlockInfo, - platform_version: &PlatformVersion, - ) -> Result { - self.validate()?; - // TODO: Do we need to do sth with withdrawal txs to actually execute them? - // FIXME: check if this is correct, esp. "apply" arg - drive - .apply_drive_operations( - self.drive_operations.clone(), - true, - block_info, - transaction, - platform_version, - ) - .map_err(|e| AbciError::WithdrawalTransactionsDBLoadError(e.to_string())) - } -} - -impl<'a> WithdrawalTxs<'a> { - /// Convert withdrawal transactions to vector of ExtendVoteExtension - pub fn to_vec(&self) -> Vec { - self.inner - .iter() - .map(|v| ExtendVoteExtension { - r#type: v.r#type, - extension: v.extension.clone(), - sign_request_id: None, - }) - .collect::>() - } - /// Convert withdrawal transactions to vector of ExtendVoteExtension - pub fn into_vec(self) -> Vec { - self.inner - .into_iter() - .map(|v| ExtendVoteExtension { - r#type: v.r#type, - extension: v.extension, - sign_request_id: None, - }) - .collect::>() - } - - /// Verify signatures of all withdrawal TXs - /// - /// ## Return value - /// - /// There are the following types of errors during verification: - /// - /// 1. The signature was invalid, most likely due to change in the data; in this case, - /// [AbciError::VoteExtensionsSignatureInvalid] is returned. - /// 2. Signature or public key is malformed - in this case, [AbciError::BlsErrorOfTenderdashThresholdMechanism] is returned - /// 3. Provided data is invalid - [AbciError::TenderdashProto] is returned - /// - /// As all these conditions, in normal circumstances, should cause processing to be terminated, they are all - /// treated as errors. - pub fn verify_signatures( - &self, - chain_id: &str, - quorum_type: QuorumType, - quorum_hash: &[u8], - height: u64, - round: u32, - public_key: &bls_signatures::PublicKey, - ) -> SimpleValidationResult { - for s in &self.inner { - let hash = match s.sign_digest( - chain_id, - quorum_type as u8, - quorum_hash.try_into().expect("invalid quorum hash length"), - height as i64, - round as i32, - ) { - Ok(h) => h, - Err(e) => return SimpleValidationResult::new_with_error(AbciError::Tenderdash(e)), - }; - - let signature = match bls_signatures::Signature::from_bytes(&s.signature) { - Ok(s) => s, - Err(e) => { - return SimpleValidationResult::new_with_error( - AbciError::BlsErrorOfTenderdashThresholdMechanism( - e, - "signature withdrawal verification".to_string(), - ), - ) - } - }; - - if !public_key.verify(&signature, &hash) { - return SimpleValidationResult::new_with_error( - AbciError::VoteExtensionsSignatureInvalid, - ); - } - } - - SimpleValidationResult::default() - } -} - -impl<'a> Display for WithdrawalTxs<'a> { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.write_fmt(format_args!("txs:["))?; - for item in &self.inner { - f.write_fmt(format_args!( - "tx:{},sig:{}\n", - hex::encode(&item.extension), - hex::encode(&item.signature) - ))?; - } - f.write_str("]\n")?; - Ok(()) - } -} -impl<'a> From> for WithdrawalTxs<'a> { - fn from(value: Vec) -> Self { - WithdrawalTxs { - inner: value - .into_iter() - .map(|v| VoteExtension { - r#type: v.r#type, - extension: v.extension, - signature: Default::default(), - sign_request_id: None, - }) - .collect::>(), - drive_operations: Vec::::new(), - } - } -} - -impl<'a> From<&Vec> for WithdrawalTxs<'a> { - fn from(value: &Vec) -> Self { - WithdrawalTxs { - inner: value.clone(), - drive_operations: Vec::::new(), - } - } -} - -impl<'a> PartialEq for WithdrawalTxs<'a> { - /// Two sets of withdrawal transactions are equal if all their inner raw transactions are equal. - /// - /// ## Notes - /// - /// 1. We don't compare `drive_operations`, as this is internal utility fields - /// 2. For a transaction, we don't compare signatures if at least one of them is empty - fn eq(&self, other: &Self) -> bool { - if self.inner.len() != other.inner.len() { - return false; - } - - std::iter::zip(&self.inner, &other.inner).all(|(left, right)| { - left.r#type == right.r#type - && left.extension == right.extension - && (left.signature.is_empty() - || right.signature.is_empty() - || left.signature == right.signature) - }) - } -} -#[cfg(test)] -mod test { - use dashcore_rpc::dashcore_rpc_json::QuorumType; - use dpp::bls_signatures; - use tenderdash_abci::proto::types::{VoteExtension, VoteExtensionType}; - - #[test] - fn verify_signature() { - const HEIGHT: u64 = 100; - const ROUND: u32 = 0; - const CHAIN_ID: &str = "test-chain"; - - let quorum_hash = - hex::decode("D6711FA18C7DA6D3FF8615D3CD3C14500EE91DA5FA942425B8E2B79A30FD8E6C") - .unwrap(); - - let mut wt = super::WithdrawalTxs { - inner: Vec::new(), - drive_operations: Vec::new(), - }; - let pubkey = hex::decode("8280cb6694f181db486c59dfa0c6d12d1c4ca26789340aebad0540ffe2edeac387aceec979454c2cfbe75fd8cf04d56d").unwrap(); - let pubkey = bls_signatures::PublicKey::from_bytes(&pubkey).unwrap(); - - let signature = hex::decode("A1022D9503CCAFC94FF76FA2E58E10A0474E6EB46305009274FAFCE57E28C7DE57602277777D07855567FAEF6A2F27590258858A875707F4DA32936DDD556BA28455AB04D9301E5F6F0762AC5B9FC036A302EE26116B1F89B74E1457C2D7383A").unwrap(); - // check if signature is correct - bls_signatures::Signature::from_bytes(&signature).unwrap(); - wt.inner.push(VoteExtension { - extension: [ - 82u8, 79, 29, 3, 209, 216, 30, 148, 160, 153, 4, 39, 54, 212, 11, 217, 104, 27, - 134, 115, 33, 68, 63, 245, 138, 69, 104, 226, 116, 219, 216, 59, - ] - .into(), - signature, - r#type: VoteExtensionType::ThresholdRecover.into(), - sign_request_id: None, - }); - - assert!(wt - .verify_signatures( - CHAIN_ID, - QuorumType::LlmqTest, - &quorum_hash, - HEIGHT, - ROUND, - &pubkey - ) - .is_valid()); - - // Now break the data - wt.inner[0].extension[3] = 0; - assert!(!wt - .verify_signatures( - CHAIN_ID, - QuorumType::LlmqTest, - &quorum_hash, - HEIGHT, - ROUND, - &pubkey - ) - .is_valid()); - } -} diff --git a/packages/rs-drive-abci/src/rpc/core.rs b/packages/rs-drive-abci/src/rpc/core.rs index 941459325f..4693c20ffb 100644 --- a/packages/rs-drive-abci/src/rpc/core.rs +++ b/packages/rs-drive-abci/src/rpc/core.rs @@ -1,9 +1,9 @@ use dashcore_rpc::dashcore::ephemerealdata::chain_lock::ChainLock; use dashcore_rpc::dashcore::{Block, BlockHash, QuorumHash, Transaction, Txid}; use dashcore_rpc::dashcore_rpc_json::{ - ExtendedQuorumDetails, ExtendedQuorumListResult, GetBestChainLockResult, GetChainTipsResult, - GetTransactionLockedResult, MasternodeListDiff, MnSyncStatus, QuorumInfoResult, QuorumType, - SoftforkInfo, + AssetUnlockStatusResult, ExtendedQuorumDetails, ExtendedQuorumListResult, + GetBestChainLockResult, GetChainTipsResult, GetTransactionLockedResult, MasternodeListDiff, + MnSyncStatus, QuorumInfoResult, QuorumType, SoftforkInfo, }; use dashcore_rpc::json::GetRawTransactionResult; use dashcore_rpc::{Auth, Client, Error, RpcApi}; @@ -33,11 +33,12 @@ pub trait CoreRPCLike { /// Get transaction fn get_transaction(&self, tx_id: &Txid) -> Result; - /// Get transaction finalization status - fn get_transactions_are_chain_locked( + /// Get asset unlock statuses + fn get_asset_unlock_statuses( &self, - tx_ids: Vec, - ) -> Result, Error>; + indices: &[u64], + core_chain_locked_height: u32, + ) -> Result, Error>; /// Get transaction fn get_transaction_extended_info(&self, tx_id: &Txid) @@ -116,6 +117,9 @@ pub trait CoreRPCLike { /// Returns masternode sync status fn masternode_sync_status(&self) -> Result; + + /// Sends raw transaction to the network + fn send_raw_transaction(&self, transaction: &Vec) -> Result; } #[derive(Debug)] @@ -124,6 +128,12 @@ pub struct DefaultCoreRPC { inner: Client, } +// TODO: Create errors for these error codes in dashcore_rpc + +/// TX is invalid due to consensus rules +pub const CORE_RPC_TX_CONSENSUS_ERROR: i32 = -26; +/// Tx already broadcasted and included in the chain +pub const CORE_RPC_TX_ALREADY_IN_CHAIN: i32 = -27; /// Client still warming up pub const CORE_RPC_ERROR_IN_WARMUP: i32 = -28; /// Dash is not connected @@ -137,6 +147,11 @@ pub const CORE_RPC_INVALID_ADDRESS_OR_KEY: i32 = -5; /// Invalid, missing or duplicate parameter pub const CORE_RPC_INVALID_PARAMETER: i32 = -8; +/// Asset Unlock consenus error "bad-assetunlock-not-active-quorum" +pub const CORE_RPC_ERROR_ASSET_UNLOCK_NO_ACTIVE_QUORUM: &str = "bad-assetunlock-not-active-quorum"; +/// Asset Unlock consenus error "bad-assetunlock-not-active-quorum" +pub const CORE_RPC_ERROR_ASSET_UNLOCK_EXPIRED: &str = "bad-assetunlock-too-late"; + macro_rules! retry { ($action:expr) => {{ /// Maximum number of retry attempts @@ -211,13 +226,6 @@ impl CoreRPCLike for DefaultCoreRPC { retry!(self.inner.get_raw_transaction(tx_id, None)) } - fn get_transactions_are_chain_locked( - &self, - tx_ids: Vec, - ) -> Result, Error> { - retry!(self.inner.get_transaction_are_locked(&tx_ids)) - } - fn get_transaction_extended_info( &self, tx_id: &Txid, @@ -305,4 +313,18 @@ impl CoreRPCLike for DefaultCoreRPC { fn masternode_sync_status(&self) -> Result { retry!(self.inner.mnsync_status()) } + + fn send_raw_transaction(&self, transaction: &Vec) -> Result { + retry!(self.inner.send_raw_transaction(transaction.as_slice())) + } + + fn get_asset_unlock_statuses( + &self, + indices: &[u64], + core_chain_locked_height: u32, + ) -> Result, Error> { + retry!(self + .inner + .get_asset_unlock_statuses(indices, Some(core_chain_locked_height))) + } } diff --git a/packages/rs-drive-abci/tests/strategy_tests/execution.rs b/packages/rs-drive-abci/tests/strategy_tests/execution.rs index 57f809f922..4d4ac7c6ff 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/execution.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/execution.rs @@ -31,7 +31,8 @@ use drive_abci::mimic::{MimicExecuteBlockOptions, MimicExecuteBlockOutcome}; use drive_abci::platform_types::epoch_info::v0::EpochInfoV0; use drive_abci::platform_types::platform::Platform; use drive_abci::platform_types::platform_state::v0::PlatformStateV0Methods; -use drive_abci::rpc::core::{CoreRPCLike, MockCoreRPCLike}; +use drive_abci::platform_types::withdrawal::unsigned_withdrawal_txs::v0::UnsignedWithdrawalTxs; +use drive_abci::rpc::core::MockCoreRPCLike; use drive_abci::test::fixture::abci::static_init_chain_request; use platform_version::version::PlatformVersion; use rand::prelude::{SliceRandom, StdRng}; @@ -43,6 +44,8 @@ use tenderdash_abci::proto::google::protobuf::Timestamp; use tenderdash_abci::proto::serializers::timestamp::FromMilis; use tenderdash_abci::Application; +pub const GENESIS_TIME_MS: u64 = 1681094380000; + pub(crate) fn run_chain_for_strategy( platform: &mut Platform, block_count: u64, @@ -767,8 +770,8 @@ pub(crate) fn start_chain_for_strategy( quorums, current_quorum_hash, current_proposer_versions: None, - start_time_ms: 1681094380000, - current_time_ms: 1681094380000, + start_time_ms: GENESIS_TIME_MS, + current_time_ms: GENESIS_TIME_MS, }, strategy, config, @@ -822,7 +825,7 @@ pub(crate) fn continue_chain_for_strategy( let mut current_core_height = core_height_start; - let mut total_withdrawals = vec![]; + let mut total_withdrawals = UnsignedWithdrawalTxs::default(); let mut current_quorum_with_test_info = quorums.get::(¤t_quorum_hash).unwrap(); @@ -971,7 +974,7 @@ pub(crate) fn continue_chain_for_strategy( let platform_version = platform_state.current_platform_version().unwrap(); - total_withdrawals.append(&mut withdrawals_this_block); + total_withdrawals.append(withdrawals_this_block); for finalize_block_operation in finalize_block_operations { match finalize_block_operation { diff --git a/packages/rs-drive-abci/tests/strategy_tests/main.rs b/packages/rs-drive-abci/tests/strategy_tests/main.rs index 6a528ee5ad..3a749b6fc8 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/main.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/main.rs @@ -40,6 +40,8 @@ use drive_abci::test::helpers::setup::TestPlatformBuilder; use drive_abci::{config::PlatformConfig, test::helpers::setup::TempPlatform}; use strategy_tests::frequency::Frequency; +use dpp::dashcore::transaction::special_transaction::TransactionPayload::AssetUnlockPayloadType; +use dpp::dashcore::Transaction; use std::collections::BTreeMap; use strategy::{ @@ -63,35 +65,43 @@ pub type BlockHeight = u64; #[cfg(test)] mod tests { use super::*; - use crate::execution::{continue_chain_for_strategy, run_chain_for_strategy}; + use crate::execution::{continue_chain_for_strategy, run_chain_for_strategy, GENESIS_TIME_MS}; use crate::query::QueryStrategy; use crate::strategy::{FailureStrategy, MasternodeListChangesStrategy}; use dashcore_rpc::dashcore::hashes::Hash; use dashcore_rpc::dashcore::BlockHash; - use dashcore_rpc::dashcore_rpc_json::ExtendedQuorumDetails; + use dashcore_rpc::dashcore_rpc_json::{AssetUnlockStatus, ExtendedQuorumDetails}; + use dashcore_rpc::json::AssetUnlockStatusResult; use dpp::block::extended_block_info::v0::ExtendedBlockInfoV0Getters; + use std::sync::{Arc, Mutex}; use strategy_tests::operations::DocumentAction::DocumentActionReplace; use strategy_tests::operations::{ DocumentAction, DocumentOp, IdentityUpdateOp, Operation, OperationType, }; use crate::strategy::CoreHeightIncrease::RandomCoreHeightIncrease; + use dpp::dashcore::bls_sig_utils::BLSSignature; use dpp::dashcore::ChainLock; + use dpp::dashcore::Txid; use dpp::data_contract::accessors::v0::{DataContractV0Getters, DataContractV0Setters}; use dpp::data_contract::document_type::random_document::{ DocumentFieldFillSize, DocumentFieldFillType, }; use dpp::identity::accessors::IdentityGettersV0; use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; + use dpp::system_data_contracts::withdrawals_contract; use dpp::tests::json_document::json_document_to_created_contract; use dpp::util::hash::hash_to_hex_string; use dpp::version::PlatformVersion; + use drive::drive::config::DEFAULT_QUERY_LIMIT; + use drive::drive::identity::withdrawals::WithdrawalTransactionIndex; use drive_abci::config::{ExecutionConfig, PlatformTestConfig}; + use drive_abci::error::execution::ExecutionError; + use drive_abci::error::Error; use drive_abci::logging::LogLevel; use drive_abci::platform_types::platform_state::v0::PlatformStateV0Methods; use drive_abci::rpc::core::QuorumListExtendedInfo; use itertools::Itertools; - use rand::distributions::uniform::SampleBorrow; use tenderdash_abci::proto::abci::{RequestInfo, ResponseInfo}; use tenderdash_abci::proto::types::CoreChainLock; use tenderdash_abci::Application; @@ -1114,7 +1124,7 @@ mod tests { .unwrap() .unwrap() ), - "b1717304d3ce607569ca53d7f801df874578f510b352f23d8e4c087cdfed5697".to_string() + "fa6e1d4977b35a5b9d9be63afb65d9cd3cf607e79a733bf743b96bfd6de48eed".to_string() ) } @@ -1670,7 +1680,7 @@ mod tests { .unwrap() .unwrap() ), - "40b51654a73ab89e98076819498a746dc179d54c53f599fa5ceeec57cec3576e".to_string() + "301a9e2630e5017a1d45a492a1e23837ab7369049c617d8202db22f924a911f3".to_string() ) } @@ -2137,6 +2147,7 @@ mod tests { #[test] fn run_chain_top_up_and_withdraw_from_identities() { + let platform_version = PlatformVersion::latest(); let strategy = NetworkStrategy { strategy: Strategy { contracts_with_updates: vec![], @@ -2191,14 +2202,511 @@ mod tests { testing_configs: PlatformTestConfig::default_with_no_block_signing(), ..Default::default() }; + let mut platform = TestPlatformBuilder::new() .with_config(config.clone()) .build_with_mock_rpc(); - let outcome = run_chain_for_strategy(&mut platform, 10, strategy, config, 15); + platform + .core_rpc + .expect_send_raw_transaction() + .returning(move |_| Ok(Txid::all_zeros())); + + struct CoreState { + asset_unlock_statuses: BTreeMap, + chain_lock: ChainLock, + } + + let mut chain_locked_height = 1; + + // Have to go with a complicated shared object for the core state because we need to change + // rpc response along the way but we can't mutate `platform.core_rpc` later + // because platform reference is moved into the AbciApplication. + let shared_core_state = Arc::new(Mutex::new(CoreState { + asset_unlock_statuses: BTreeMap::new(), + chain_lock: ChainLock { + block_height: chain_locked_height, + block_hash: BlockHash::from_byte_array([1; 32]), + signature: BLSSignature::from([2; 96]), + }, + })); + + // Set up Core RPC responses + { + let core_state = shared_core_state.clone(); + + platform + .core_rpc + .expect_get_asset_unlock_statuses() + .returning(move |indices, _| { + Ok(indices + .iter() + .map(|index| { + core_state + .lock() + .unwrap() + .asset_unlock_statuses + .get(index) + .map(|status| status.clone()) + .unwrap() + }) + .collect()) + }); + + let core_state = shared_core_state.clone(); + platform + .core_rpc + .expect_get_best_chain_lock() + .returning(move || Ok(core_state.lock().unwrap().chain_lock.clone())); + } + + // Run first two blocks: + // - Block 1: creates identity + // - Block 2: tops up identity and initiates withdrawals + let ( + ChainExecutionOutcome { + abci_app, + proposers, + quorums, + current_quorum_hash, + current_proposer_versions, + end_time_ms, + .. + }, + last_block_pooled_withdrawals_amount, + ) = { + let outcome = + run_chain_for_strategy(&mut platform, 2, strategy.clone(), config.clone(), 1); + + // Withdrawal transactions are not populated to block execution context yet + assert_eq!(outcome.withdrawals.len(), 0); + + // Withdrawal documents with pooled status should exist. + let withdrawal_documents_pooled = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::POOLED.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + assert!(withdrawal_documents_pooled.len() > 0); + let pooled_withdrawals = withdrawal_documents_pooled.len(); + + (outcome, pooled_withdrawals) + }; + + // Run block 3 + // Should broadcast previously pooled withdrawals to core + let ChainExecutionOutcome { + abci_app, + proposers, + quorums, + current_quorum_hash, + current_proposer_versions, + end_time_ms, + withdrawals: last_block_withdrawals, + .. + } = { + let outcome = continue_chain_for_strategy( + abci_app, + ChainExecutionParameters { + block_start: 3, + core_height_start: 1, + block_count: 1, + proposers, + quorums, + current_quorum_hash, + current_proposer_versions: Some(current_proposer_versions), + start_time_ms: GENESIS_TIME_MS, + current_time_ms: end_time_ms, + }, + strategy.clone(), + config.clone(), + StrategyRandomness::SeedEntropy(2), + ); + + // Withdrawal documents with pooled status should exist. + let withdrawal_documents_broadcasted = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::BROADCASTED.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + // In this block all previously pooled withdrawals should be broadcasted + assert_eq!( + outcome.withdrawals.len(), + last_block_pooled_withdrawals_amount + ); + assert_eq!( + withdrawal_documents_broadcasted.len(), + last_block_pooled_withdrawals_amount + ); + + outcome + }; + + // Update core state before running next block. + // Asset unlocks broadcasted in the last block should have Unknown status + { + let mut core_state = shared_core_state.lock().unwrap(); + last_block_withdrawals.iter().for_each(|tx| { + let index = asset_unlock_index(tx); + + core_state.asset_unlock_statuses.insert( + index, + AssetUnlockStatusResult { + index, + status: AssetUnlockStatus::Unknown, + }, + ); + }); + } + + // Run block 4 + // Should change pooled status to broadcasted + let last_block_broadcased_withdrawals_amount = last_block_withdrawals.len(); + let ( + ChainExecutionOutcome { + abci_app, + proposers, + quorums, + current_quorum_hash, + current_proposer_versions, + end_time_ms, + withdrawals: last_block_withdrawals, + .. + }, + last_block_broadcased_withdrawals_amount, + ) = { + let outcome = continue_chain_for_strategy( + abci_app, + ChainExecutionParameters { + block_start: 4, + core_height_start: 1, + block_count: 1, + proposers, + quorums, + current_quorum_hash, + current_proposer_versions: Some(current_proposer_versions), + start_time_ms: GENESIS_TIME_MS, + current_time_ms: end_time_ms + 1000, + }, + strategy.clone(), + config.clone(), + StrategyRandomness::SeedEntropy(3), + ); + + let withdrawal_documents_pooled = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::POOLED.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + let withdrawal_documents_broadcasted = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::BROADCASTED.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + // In this block we should have new withdrawals pooled + assert!(withdrawal_documents_pooled.len() > 0); + + // And extra withdrawals broadcasted + let withdrawals_broadcasted_expected = + last_block_broadcased_withdrawals_amount + outcome.withdrawals.len(); + assert_eq!( + withdrawal_documents_broadcasted.len(), + withdrawals_broadcasted_expected + ); + + (outcome, withdrawal_documents_broadcasted.len()) + }; - assert_eq!(outcome.identities.len(), 10); - assert_eq!(outcome.withdrawals.len(), 18); + // Update core state for newly broadcasted transactions + { + let mut core_state = shared_core_state.lock().unwrap(); + + // First, set all previously broadcasted transactions to Chainlocked + core_state + .asset_unlock_statuses + .iter_mut() + .for_each(|(index, status_result)| { + // Do not settle yet transactions that were broadcasted in the last block + status_result.index = *index; + status_result.status = AssetUnlockStatus::Chainlocked; + }); + + // Then increase chainlocked height, so that withdrawals for chainlocked tranasctions + // could be completed in the next block + // TODO: do we need this var? + chain_locked_height += 1; + core_state.chain_lock.block_height = chain_locked_height; + + // Then set all newly broadcasted transactions to Unknown + last_block_withdrawals.iter().for_each(|tx| { + let index = asset_unlock_index(tx); + + core_state.asset_unlock_statuses.insert( + index, + AssetUnlockStatusResult { + index, + status: AssetUnlockStatus::Unknown, + }, + ); + }); + + drop(core_state); + } + + // Run block 5 + // Previously broadcasted transactions should be settled after block 5, + // and their corresponding statuses should be changed to COMPLETED + let ( + ChainExecutionOutcome { + abci_app, + proposers, + quorums, + current_quorum_hash, + current_proposer_versions, + end_time_ms, + withdrawals: last_block_withdrawals, + .. + }, + last_block_withdrawals_completed_amount, + ) = { + let outcome = continue_chain_for_strategy( + abci_app, + ChainExecutionParameters { + block_start: 5, + core_height_start: 1, + block_count: 1, + proposers, + quorums, + current_quorum_hash, + current_proposer_versions: Some(current_proposer_versions), + start_time_ms: GENESIS_TIME_MS, + current_time_ms: end_time_ms + 1000, + }, + strategy.clone(), + config.clone(), + StrategyRandomness::SeedEntropy(4), + ); + + let withdrawal_documents_pooled = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::POOLED.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + let withdrawal_documents_broadcasted = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::BROADCASTED.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + let withdrawal_documents_completed = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::COMPLETE.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + // In this block we should have new withdrawals pooled + assert!(withdrawal_documents_pooled.len() > 0); + + // And some withdrawals completed + let withdrawals_completed_expected = + // Withdrawals issued on {previous_block - 1} considered completed + last_block_broadcased_withdrawals_amount - last_block_withdrawals.len(); + assert_eq!( + withdrawal_documents_completed.len(), + withdrawals_completed_expected + ); + + // And extra withdrawals broadcasted + let withdrawals_broadcasted_expected = + // Withdrawals issued on previous block + withdrawals from this block are still in broadcasted state + last_block_withdrawals.len() + outcome.withdrawals.len(); + + assert_eq!( + withdrawal_documents_broadcasted.len(), + withdrawals_broadcasted_expected + ); + + (outcome, withdrawal_documents_completed.len()) + }; + + // Update state of the core before proceeding to the next block + { + // Simulate transactions being added to the core mempool + let mut core_state = shared_core_state.lock().unwrap(); + + let number_of_blocks_before_expiration: u32 = 48; + chain_locked_height += number_of_blocks_before_expiration; + + core_state.chain_lock.block_height = chain_locked_height; + + last_block_withdrawals.iter().for_each(|tx| { + let index = asset_unlock_index(tx); + + core_state.asset_unlock_statuses.insert( + index, + AssetUnlockStatusResult { + index, + status: AssetUnlockStatus::Unknown, + }, + ); + }); + } + + // Run block 6. + // Tests withdrawal expiration + let ChainExecutionOutcome { + abci_app, + proposers, + quorums, + current_quorum_hash, + current_proposer_versions, + end_time_ms, + withdrawals, + .. + } = { + let outcome = continue_chain_for_strategy( + abci_app, + ChainExecutionParameters { + block_start: 6, + core_height_start: 1, + block_count: 1, + proposers, + quorums, + current_quorum_hash, + current_proposer_versions: Some(current_proposer_versions), + start_time_ms: GENESIS_TIME_MS, + current_time_ms: end_time_ms + 1000, + }, + strategy.clone(), + config.clone(), + StrategyRandomness::SeedEntropy(5), + ); + + let withdrawal_documents_pooled = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::POOLED.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + let withdrawal_documents_broadcasted = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::BROADCASTED.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + let withdrawal_documents_completed = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::COMPLETE.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + let withdrawal_documents_expired = outcome + .abci_app + .platform + .drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::EXPIRED.into(), + DEFAULT_QUERY_LIMIT, + None, + platform_version, + ) + .unwrap(); + + // In this block we should have new withdrawals pooled + assert!(withdrawal_documents_pooled.len() > 0); + + // Amount of completed withdrawals stays the same as in the last block + assert_eq!( + withdrawal_documents_completed.len(), + last_block_withdrawals_completed_amount + ); + + // And some withdrawals got expired + let withdrawals_expired_expected = + // Withdrawals issued on {previous_block - 1}, but not chainlocked yet, considered expired + last_block_broadcased_withdrawals_amount - last_block_withdrawals.len(); + + assert_eq!( + withdrawal_documents_expired.len(), + withdrawals_expired_expected + ); + + // And extra withdrawals broadcasted + let withdrawals_broadcasted_expected = + // Withdrawals issued on previous block + withdrawals from this block are still in broadcasted state + last_block_withdrawals.len() + outcome.withdrawals.len(); + + assert_eq!( + withdrawal_documents_broadcasted.len(), + withdrawals_broadcasted_expected + ); + + outcome + }; } #[test] @@ -2856,3 +3364,10 @@ mod tests { assert_eq!(state_transitions.len(), 3); } } + +fn asset_unlock_index(tx: &Transaction) -> u64 { + let Some(AssetUnlockPayloadType(ref payload)) = tx.special_transaction_payload else { + panic!("expected to get AssetUnlockPayloadType"); + }; + payload.base.index +} diff --git a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs index 1cae313520..5dcc6c55f8 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs @@ -50,6 +50,7 @@ use dpp::state_transition::documents_batch_transition::{DocumentsBatchTransition use dpp::state_transition::documents_batch_transition::document_transition::{DocumentDeleteTransition, DocumentReplaceTransition}; use drive::drive::document::query::QueryDocumentsOutcomeV0Methods; use dpp::state_transition::data_contract_create_transition::methods::v0::DataContractCreateTransitionMethodsV0; +use drive_abci::platform_types::withdrawal::unsigned_withdrawal_txs::v0::UnsignedWithdrawalTxs; use crate::strategy::CoreHeightIncrease::NoCoreHeightIncrease; use simple_signer::signer::SimpleSigner; @@ -1018,7 +1019,7 @@ pub struct ChainExecutionOutcome<'a> { pub end_epoch_index: u16, pub end_time_ms: u64, pub strategy: NetworkStrategy, - pub withdrawals: Vec, + pub withdrawals: UnsignedWithdrawalTxs, /// height to the validator set update at that height pub validator_set_updates: BTreeMap, pub state_transition_results_per_block: BTreeMap>, diff --git a/packages/rs-drive-proof-verifier/Cargo.toml b/packages/rs-drive-proof-verifier/Cargo.toml index 45a8a436ee..b0768476c5 100644 --- a/packages/rs-drive-proof-verifier/Cargo.toml +++ b/packages/rs-drive-proof-verifier/Cargo.toml @@ -20,8 +20,7 @@ drive = { path = "../rs-drive", default-features = false, features = [ "verify", ] } dpp = { path = "../rs-dpp" } -tenderdash-abci = { git = "https://github.com/dashpay/rs-tenderdash-abci", rev = "251386f9e4109c89ca628226c981c489b80aed80" } -# tenderdash-abci = { path = "../../../rs-tenderdash-abci/abci" } +tenderdash-abci = { git = "https://github.com/dashpay/rs-tenderdash-abci", tag = "v0.14.0-dev.6" } tracing = { version = "0.1.37" } serde = { version = "1.0.171", default-features = false, optional = true } serde_json = { version = "1.0.103", features = [ diff --git a/packages/rs-drive/src/drive/batch/drive_op_batch/mod.rs b/packages/rs-drive/src/drive/batch/drive_op_batch/mod.rs index ba0769328b..123580df30 100644 --- a/packages/rs-drive/src/drive/batch/drive_op_batch/mod.rs +++ b/packages/rs-drive/src/drive/batch/drive_op_batch/mod.rs @@ -65,7 +65,7 @@ pub enum DriveOperation<'a> { /// A document operation DocumentOperation(DocumentOperationType<'a>), /// Withdrawal operation - WithdrawalOperation(WithdrawalOperationType<'a>), + WithdrawalOperation(WithdrawalOperationType), /// An identity operation IdentityOperation(IdentityOperationType), /// A system operation diff --git a/packages/rs-drive/src/drive/batch/drive_op_batch/withdrawals.rs b/packages/rs-drive/src/drive/batch/drive_op_batch/withdrawals.rs index 9032fa6064..d7ec21a09f 100644 --- a/packages/rs-drive/src/drive/batch/drive_op_batch/withdrawals.rs +++ b/packages/rs-drive/src/drive/batch/drive_op_batch/withdrawals.rs @@ -7,11 +7,12 @@ use grovedb::{batch::KeyInfoPath, EstimatedLayerInformation, TransactionArg}; use crate::drive::grove_operations::BatchDeleteApplyType; use crate::drive::identity::withdrawals::paths::{ - get_withdrawal_root_path_vec, get_withdrawal_transactions_expired_ids_path, - get_withdrawal_transactions_expired_ids_path_vec, get_withdrawal_transactions_queue_path, - get_withdrawal_transactions_queue_path_vec, WITHDRAWAL_TRANSACTIONS_COUNTER_ID, + get_withdrawal_root_path_vec, get_withdrawal_transactions_queue_path, + get_withdrawal_transactions_queue_path_vec, WITHDRAWAL_TRANSACTIONS_NEXT_INDEX_KEY, +}; +use crate::drive::identity::withdrawals::{ + WithdrawalTransactionIndex, WithdrawalTransactionIndexAndBytes, }; -use crate::drive::identity::withdrawals::WithdrawalTransactionIdAndBytes; use crate::drive::object_size_info::PathKeyElementInfo; use crate::{drive::Drive, error::Error, fee::op::LowLevelDriveOperation}; @@ -19,35 +20,25 @@ use super::DriveLowLevelOperationConverter; /// Operations for Withdrawals #[derive(Clone, Debug)] -pub enum WithdrawalOperationType<'a> { - /// Inserts expired index into it's tree - InsertExpiredIndex { - /// index value - index: u64, - }, - /// Removes expired index from the tree - DeleteExpiredIndex { - /// index value - key: Vec, - }, +pub enum WithdrawalOperationType { /// Update index counter UpdateIndexCounter { /// index counter value - index: u64, + index: WithdrawalTransactionIndex, }, /// Insert Core Transaction into queue InsertTransactions { /// transaction id bytes - withdrawal_transactions: &'a [WithdrawalTransactionIdAndBytes], + withdrawal_transactions: Vec, }, /// Delete withdrawal DeleteWithdrawalTransaction { /// withdrawal transaction tuple with id and bytes - id: Vec, + index: WithdrawalTransactionIndex, }, } -impl DriveLowLevelOperationConverter for WithdrawalOperationType<'_> { +impl DriveLowLevelOperationConverter for WithdrawalOperationType { fn into_low_level_drive_operations( self, drive: &Drive, @@ -59,43 +50,6 @@ impl DriveLowLevelOperationConverter for WithdrawalOperationType<'_> { platform_version: &PlatformVersion, ) -> Result, Error> { match self { - WithdrawalOperationType::InsertExpiredIndex { index } => { - let mut drive_operations = vec![]; - - let index_bytes = index.to_be_bytes(); - - let path = get_withdrawal_transactions_expired_ids_path_vec(); - - drive.batch_insert( - PathKeyElementInfo::PathKeyElement::<'_, 1>(( - path, - index_bytes.to_vec(), - Element::Item(vec![], None), - )), - &mut drive_operations, - &platform_version.drive, - )?; - - Ok(drive_operations) - } - WithdrawalOperationType::DeleteExpiredIndex { key } => { - let mut drive_operations = vec![]; - - let path: [&[u8]; 2] = get_withdrawal_transactions_expired_ids_path(); - - drive.batch_delete( - (&path).into(), - &key, - BatchDeleteApplyType::StatefulBatchDelete { - is_known_to_be_subtree_with_sum: Some((false, false)), - }, - transaction, - &mut drive_operations, - &platform_version.drive, - )?; - - Ok(drive_operations) - } WithdrawalOperationType::UpdateIndexCounter { index } => { let mut drive_operations = vec![]; @@ -104,7 +58,7 @@ impl DriveLowLevelOperationConverter for WithdrawalOperationType<'_> { drive.batch_insert( PathKeyElementInfo::PathKeyRefElement::<'_, 1>(( path, - &WITHDRAWAL_TRANSACTIONS_COUNTER_ID, + &WITHDRAWAL_TRANSACTIONS_NEXT_INDEX_KEY, Element::Item(index.to_be_bytes().to_vec(), None), )), &mut drive_operations, @@ -120,12 +74,12 @@ impl DriveLowLevelOperationConverter for WithdrawalOperationType<'_> { let path = get_withdrawal_transactions_queue_path_vec(); - for (id, bytes) in withdrawal_transactions { + for (index, bytes) in withdrawal_transactions { drive.batch_insert( PathKeyElementInfo::PathKeyElement::<'_, 1>(( path.clone(), - id.clone(), - Element::Item(bytes.clone(), None), + index.to_be_bytes().to_vec(), + Element::Item(bytes, None), )), &mut drive_operations, &platform_version.drive, @@ -134,14 +88,14 @@ impl DriveLowLevelOperationConverter for WithdrawalOperationType<'_> { Ok(drive_operations) } - WithdrawalOperationType::DeleteWithdrawalTransaction { id } => { + WithdrawalOperationType::DeleteWithdrawalTransaction { index } => { let mut drive_operations = vec![]; let path = get_withdrawal_transactions_queue_path(); drive.batch_delete( (&path).into(), - &id, + &index.to_be_bytes(), // we know that we are not deleting a subtree BatchDeleteApplyType::StatefulBatchDelete { is_known_to_be_subtree_with_sum: Some((false, false)), diff --git a/packages/rs-drive/src/drive/batch/transitions/identity/identity_credit_withdrawal_transition.rs b/packages/rs-drive/src/drive/batch/transitions/identity/identity_credit_withdrawal_transition.rs index fc03bd39ac..b9034fcc18 100644 --- a/packages/rs-drive/src/drive/batch/transitions/identity/identity_credit_withdrawal_transition.rs +++ b/packages/rs-drive/src/drive/batch/transitions/identity/identity_credit_withdrawal_transition.rs @@ -1,6 +1,8 @@ use crate::drive::batch::transitions::DriveHighLevelOperationConverter; -use crate::drive::batch::DriveOperation::{DocumentOperation, IdentityOperation}; -use crate::drive::batch::{DocumentOperationType, DriveOperation, IdentityOperationType}; +use crate::drive::batch::DriveOperation::{DocumentOperation, IdentityOperation, SystemOperation}; +use crate::drive::batch::{ + DocumentOperationType, DriveOperation, IdentityOperationType, SystemOperationType, +}; use crate::drive::object_size_info::{DocumentInfo, OwnedDocumentInfo}; use crate::error::Error; use dpp::block::epoch::Epoch; @@ -16,9 +18,14 @@ impl DriveHighLevelOperationConverter for IdentityCreditWithdrawalTransitionActi ) -> Result>, Error> { let identity_id = self.identity_id(); let revision = self.revision(); + let balance_to_remove = self.amount(); let prepared_withdrawal_document = self.prepared_withdrawal_document_owned(); let drive_operations = vec![ + IdentityOperation(IdentityOperationType::RemoveFromIdentityBalance { + identity_id: identity_id.to_buffer(), + balance_to_remove, + }), IdentityOperation(IdentityOperationType::UpdateIdentityRevision { identity_id: identity_id.into_buffer(), revision, @@ -32,6 +39,9 @@ impl DriveHighLevelOperationConverter for IdentityCreditWithdrawalTransitionActi owner_id: None, }, }), + SystemOperation(SystemOperationType::RemoveFromSystemCredits { + amount: balance_to_remove, + }), ]; Ok(drive_operations) diff --git a/packages/rs-drive/src/drive/config.rs b/packages/rs-drive/src/drive/config.rs index 0f4e417d77..3a7f2adcb4 100644 --- a/packages/rs-drive/src/drive/config.rs +++ b/packages/rs-drive/src/drive/config.rs @@ -38,7 +38,7 @@ pub const DEFAULT_GROVE_BATCHING_CONSISTENCY_VERIFICATION_ENABLED: bool = false; /// Boolean if GroveDB has_raw in enabled by default pub const DEFAULT_GROVE_HAS_RAW_ENABLED: bool = true; /// The default default query limit -pub const DEFAULT_DEFAULT_QUERY_LIMIT: u16 = 100; +pub const DEFAULT_QUERY_LIMIT: u16 = 100; /// The default max query limit pub const DEFAULT_MAX_QUERY_LIMIT: u16 = 100; /// Default maximum number of contracts in cache @@ -126,7 +126,7 @@ fn default_has_raw_enabled() -> bool { } fn default_default_query_limit() -> u16 { - DEFAULT_DEFAULT_QUERY_LIMIT + DEFAULT_QUERY_LIMIT } fn default_epochs_per_era() -> u16 { @@ -147,7 +147,7 @@ impl Default for DriveConfig { batching_consistency_verification: DEFAULT_GROVE_BATCHING_CONSISTENCY_VERIFICATION_ENABLED, has_raw_enabled: DEFAULT_GROVE_HAS_RAW_ENABLED, - default_query_limit: DEFAULT_DEFAULT_QUERY_LIMIT, + default_query_limit: DEFAULT_QUERY_LIMIT, epochs_per_era: DEFAULT_EPOCHS_PER_ERA, max_query_limit: DEFAULT_MAX_QUERY_LIMIT, default_genesis_time: None, diff --git a/packages/rs-drive/src/drive/identity/withdrawals/document/fetch_oldest_withdrawal_documents_by_status/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/document/fetch_oldest_withdrawal_documents_by_status/mod.rs new file mode 100644 index 0000000000..a82c2cc2db --- /dev/null +++ b/packages/rs-drive/src/drive/identity/withdrawals/document/fetch_oldest_withdrawal_documents_by_status/mod.rs @@ -0,0 +1,40 @@ +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use dpp::document::Document; +use grovedb::TransactionArg; +use platform_version::version::PlatformVersion; + +mod v0; + +impl Drive { + /// Fetch withdrawal documents by it's status ordered by updated_at ascending + pub fn fetch_oldest_withdrawal_documents_by_status( + &self, + status: u8, + limit: u16, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result, Error> { + match platform_version + .drive + .methods + .identity + .withdrawals + .document + .fetch_oldest_withdrawal_documents_by_status + { + 0 => self.fetch_oldest_withdrawal_documents_by_status_v0( + status, + limit, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "fetch_up_to_100_oldest_withdrawal_documents_by_status".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/identity/withdrawals/document/fetch_oldest_withdrawal_documents_by_status/v0/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/document/fetch_oldest_withdrawal_documents_by_status/v0/mod.rs new file mode 100644 index 0000000000..deb00e9154 --- /dev/null +++ b/packages/rs-drive/src/drive/identity/withdrawals/document/fetch_oldest_withdrawal_documents_by_status/v0/mod.rs @@ -0,0 +1,215 @@ +use crate::drive::document::query::QueryDocumentsOutcomeV0Methods; +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::query::{DriveQuery, InternalClauses, OrderClause, WhereClause}; +use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contracts::withdrawals_contract; +use dpp::data_contracts::withdrawals_contract::v1::document_types::withdrawal; +use dpp::document::Document; +use dpp::platform_value::Value; +use grovedb::TransactionArg; +use indexmap::IndexMap; +use platform_version::version::PlatformVersion; +use std::collections::BTreeMap; + +impl Drive { + pub(super) fn fetch_oldest_withdrawal_documents_by_status_v0( + &self, + status: u8, + limit: u16, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result, Error> { + let data_contract_id = withdrawals_contract::ID; + + let contract_fetch_info = self + .get_contract_with_fetch_info_and_fee( + data_contract_id.to_buffer(), + None, + true, + transaction, + platform_version, + )? + .1 + .ok_or_else(|| { + Error::Drive(DriveError::CorruptedCodeExecution( + "Can't fetch data contract", + )) + })?; + + let document_type = contract_fetch_info + .contract + .document_type_for_name(withdrawal::NAME)?; + + let mut where_clauses = BTreeMap::new(); + + //todo: make this lazy loaded or const + where_clauses.insert( + withdrawal::properties::STATUS.to_string(), + WhereClause { + field: withdrawal::properties::STATUS.to_string(), + operator: crate::query::WhereOperator::Equal, + value: Value::U8(status), + }, + ); + + let mut order_by = IndexMap::new(); + + order_by.insert( + withdrawal::properties::UPDATED_AT.to_string(), + OrderClause { + field: withdrawal::properties::UPDATED_AT.to_string(), + ascending: true, + }, + ); + + let drive_query = DriveQuery { + contract: &contract_fetch_info.contract, + document_type, + internal_clauses: InternalClauses { + primary_key_in_clause: None, + primary_key_equal_clause: None, + in_clause: None, + range_clause: None, + equal_clauses: where_clauses, + }, + offset: None, + limit: Some(limit), + order_by, + start_at: None, + start_at_included: false, + block_time_ms: None, + }; + + let outcome = self.query_documents( + drive_query, + None, + false, + transaction, + Some(platform_version.protocol_version), + )?; + + Ok(outcome.documents_owned()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::drive::config::DEFAULT_QUERY_LIMIT; + use crate::tests::helpers::setup::{ + setup_document, setup_drive_with_initial_state_structure, setup_system_data_contract, + }; + use dpp::data_contract::accessors::v0::DataContractV0Getters; + use dpp::identifier::Identifier; + use dpp::identity::core_script::CoreScript; + use dpp::platform_value::platform_value; + use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; + use dpp::system_data_contracts::{load_system_data_contract, SystemDataContract}; + use dpp::tests::fixtures::get_withdrawal_document_fixture; + use dpp::version::PlatformVersion; + use dpp::withdrawal::Pooling; + + #[test] + fn test_return_list_of_documents() { + let drive = setup_drive_with_initial_state_structure(); + + let transaction = drive.grove.start_transaction(); + + let platform_version = PlatformVersion::latest(); + + let data_contract = + load_system_data_contract(SystemDataContract::Withdrawals, platform_version) + .expect("to load system data contract"); + + setup_system_data_contract(&drive, &data_contract, Some(&transaction)); + + let documents = drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::QUEUED.into(), + DEFAULT_QUERY_LIMIT, + Some(&transaction), + platform_version, + ) + .expect("to fetch documents by status"); + + assert_eq!(documents.len(), 0); + + let owner_id = Identifier::new([1u8; 32]); + + let document = get_withdrawal_document_fixture( + &data_contract, + owner_id, + platform_value!({ + "amount": 1000u64, + "coreFeePerByte": 1u32, + "pooling": Pooling::Never as u8, + "outputScript": CoreScript::from_bytes((0..23).collect::>()), + "status": withdrawals_contract::WithdrawalStatus::QUEUED as u8, + "transactionIndex": 1u64, + }), + None, + platform_version.protocol_version, + ) + .expect("expected withdrawal document"); + + let document_type = data_contract + .document_type_for_name(withdrawal::NAME) + .expect("expected to get document type"); + + setup_document( + &drive, + &document, + &data_contract, + document_type, + Some(&transaction), + ); + + let document = get_withdrawal_document_fixture( + &data_contract, + owner_id, + platform_value!({ + "amount": 1000u64, + "coreFeePerByte": 1u32, + "pooling": Pooling::Never as u8, + "outputScript": CoreScript::from_bytes((0..23).collect::>()), + "status": withdrawals_contract::WithdrawalStatus::POOLED, + "transactionIndex": 2u64, + }), + None, + platform_version.protocol_version, + ) + .expect("expected withdrawal document"); + + setup_document( + &drive, + &document, + &data_contract, + document_type, + Some(&transaction), + ); + + let documents = drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::QUEUED.into(), + DEFAULT_QUERY_LIMIT, + Some(&transaction), + platform_version, + ) + .expect("to fetch documents by status"); + + assert_eq!(documents.len(), 1); + + let documents = drive + .fetch_oldest_withdrawal_documents_by_status( + withdrawals_contract::WithdrawalStatus::POOLED.into(), + DEFAULT_QUERY_LIMIT, + Some(&transaction), + platform_version, + ) + .expect("to fetch documents by status"); + + assert_eq!(documents.len(), 1); + } +} diff --git a/packages/rs-drive/src/drive/identity/withdrawals/document/find_withdrawal_documents_by_status_and_transaction_indices/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/document/find_withdrawal_documents_by_status_and_transaction_indices/mod.rs new file mode 100644 index 0000000000..a3545ad539 --- /dev/null +++ b/packages/rs-drive/src/drive/identity/withdrawals/document/find_withdrawal_documents_by_status_and_transaction_indices/mod.rs @@ -0,0 +1,45 @@ +mod v0; + +use crate::drive::identity::withdrawals::WithdrawalTransactionIndex; +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use dpp::data_contracts::withdrawals_contract; +use dpp::document::Document; +use grovedb::TransactionArg; +use platform_version::version::PlatformVersion; + +impl Drive { + /// Find withdrawal documents by status and transaction indices + pub fn find_withdrawal_documents_by_status_and_transaction_indices( + &self, + status: withdrawals_contract::WithdrawalStatus, + transaction_indices: &[WithdrawalTransactionIndex], + limit: u16, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result, Error> { + match platform_version + .drive + .methods + .identity + .withdrawals + .document + .find_up_to_100_withdrawal_documents_by_status_and_transaction_indices + { + 0 => self.find_withdrawal_documents_by_status_and_transaction_indices_v0( + status, + transaction_indices, + limit, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "find_up_to_100_withdrawal_documents_by_status_and_transaction_indices" + .to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/identity/withdrawals/document/find_withdrawal_documents_by_status_and_transaction_indices/v0/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/document/find_withdrawal_documents_by_status_and_transaction_indices/v0/mod.rs new file mode 100644 index 0000000000..ad7536faeb --- /dev/null +++ b/packages/rs-drive/src/drive/identity/withdrawals/document/find_withdrawal_documents_by_status_and_transaction_indices/v0/mod.rs @@ -0,0 +1,177 @@ +use crate::drive::document::query::QueryDocumentsOutcomeV0Methods; +use crate::drive::identity::withdrawals::WithdrawalTransactionIndex; +use crate::drive::Drive; +use crate::error::Error; +use crate::query::{DriveQuery, InternalClauses, OrderClause, WhereClause}; +use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contracts::withdrawals_contract; +use dpp::data_contracts::withdrawals_contract::v1::document_types::withdrawal; +use dpp::document::Document; +use dpp::platform_value::Value; +use grovedb::TransactionArg; +use indexmap::IndexMap; +use platform_version::version::PlatformVersion; +use std::collections::BTreeMap; + +impl Drive { + // TODO(withdrawals): Currently it queries only up to 100 documents. + // It works while we don't have pooling + + pub(super) fn find_withdrawal_documents_by_status_and_transaction_indices_v0( + &self, + status: withdrawals_contract::WithdrawalStatus, + transaction_indices: &[WithdrawalTransactionIndex], + limit: u16, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result, Error> { + let mut where_clauses = BTreeMap::new(); + + where_clauses.insert( + withdrawal::properties::STATUS.to_string(), + WhereClause { + field: withdrawal::properties::STATUS.to_string(), + operator: crate::query::WhereOperator::Equal, + value: Value::U8(status as u8), + }, + ); + + where_clauses.insert( + withdrawal::properties::TRANSACTION_INDEX.to_string(), + WhereClause { + field: withdrawal::properties::TRANSACTION_INDEX.to_string(), + operator: crate::query::WhereOperator::In, + value: Value::Array( + transaction_indices + .iter() + .map(|index| Value::U64(*index)) + .collect::>(), + ), + }, + ); + + let mut order_by = IndexMap::new(); + + order_by.insert( + withdrawal::properties::TRANSACTION_INDEX.to_string(), + OrderClause { + field: withdrawal::properties::TRANSACTION_INDEX.to_string(), + ascending: true, + }, + ); + + let cache = self.cache.read().unwrap(); + + let document_type = cache + .system_data_contracts + .withdrawals + .document_type_for_name(withdrawal::NAME)?; + + let drive_query = DriveQuery { + contract: &cache.system_data_contracts.withdrawals, + document_type, + internal_clauses: InternalClauses { + primary_key_in_clause: None, + primary_key_equal_clause: None, + in_clause: None, + range_clause: None, + equal_clauses: where_clauses, + }, + offset: None, + limit: Some(limit), + order_by, + start_at: None, + start_at_included: false, + block_time_ms: None, + }; + + let outcome = self.query_documents( + drive_query, + None, + false, + transaction, + Some(platform_version.protocol_version), + )?; + + Ok(outcome.documents_owned()) + } +} + +#[cfg(test)] +mod tests { + use crate::drive::config::DEFAULT_QUERY_LIMIT; + use crate::drive::identity::withdrawals::WithdrawalTransactionIndex; + use crate::tests::helpers::setup::{ + setup_document, setup_drive_with_initial_state_structure, setup_system_data_contract, + }; + use dpp::data_contract::accessors::v0::DataContractV0Getters; + use dpp::identifier::Identifier; + use dpp::identity::core_script::CoreScript; + use dpp::platform_value::platform_value; + use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; + use dpp::system_data_contracts::{load_system_data_contract, SystemDataContract}; + use dpp::tests::fixtures::get_withdrawal_document_fixture; + use dpp::version::PlatformVersion; + use dpp::withdrawal::Pooling; + + use super::*; + + #[test] + fn test_find_pooled_withdrawal_documents_by_transaction_index() { + let drive = setup_drive_with_initial_state_structure(); + + let transaction = drive.grove.start_transaction(); + + let platform_version = PlatformVersion::latest(); + + let data_contract = + load_system_data_contract(SystemDataContract::Withdrawals, platform_version) + .expect("to load system data contract"); + + setup_system_data_contract(&drive, &data_contract, Some(&transaction)); + + let owner_id = Identifier::new([1u8; 32]); + + let transaction_index: WithdrawalTransactionIndex = 1; + + let document = get_withdrawal_document_fixture( + &data_contract, + owner_id, + platform_value!({ + "amount": 1000u64, + "coreFeePerByte": 1u32, + "pooling": Pooling::Never as u8, + "outputScript": CoreScript::from_bytes((0..23).collect::>()), + "status": withdrawals_contract::WithdrawalStatus::POOLED as u8, + "transactionIndex": transaction_index, + }), + None, + platform_version.protocol_version, + ) + .expect("expected to get withdrawal document"); + + let document_type = data_contract + .document_type_for_name(withdrawal::NAME) + .expect("expected to get document type"); + + setup_document( + &drive, + &document, + &data_contract, + document_type, + Some(&transaction), + ); + + let found_document = drive + .find_withdrawal_documents_by_status_and_transaction_indices( + withdrawals_contract::WithdrawalStatus::POOLED, + &[transaction_index], + DEFAULT_QUERY_LIMIT, + Some(&transaction), + platform_version, + ) + .expect("to find document by it's transaction id"); + + assert_eq!(found_document.len(), 1); + } +} diff --git a/packages/rs-drive/src/drive/identity/withdrawals/document/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/document/mod.rs new file mode 100644 index 0000000000..0f3e6aec29 --- /dev/null +++ b/packages/rs-drive/src/drive/identity/withdrawals/document/mod.rs @@ -0,0 +1,4 @@ +/// This module dedicated for a versioned fetch_up_to_100_oldest_withdrawal_documents_by_status +pub mod fetch_oldest_withdrawal_documents_by_status; +/// This module dedicated for a versioned find_up_to_100_withdrawal_documents_by_status_and_transaction_indices +pub mod find_withdrawal_documents_by_status_and_transaction_indices; diff --git a/packages/rs-drive/src/drive/identity/withdrawals/documents.rs b/packages/rs-drive/src/drive/identity/withdrawals/documents.rs deleted file mode 100644 index 998e3c296f..0000000000 --- a/packages/rs-drive/src/drive/identity/withdrawals/documents.rs +++ /dev/null @@ -1,369 +0,0 @@ -use std::collections::BTreeMap; - -use dpp::data_contract::accessors::v0::DataContractV0Getters; - -use dpp::document::Document; -use dpp::platform_value::Value; -use dpp::system_data_contracts::withdrawals_contract; -use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; -use dpp::version::PlatformVersion; -use grovedb::TransactionArg; -use indexmap::IndexMap; - -use crate::drive::document::query::QueryDocumentsOutcomeV0Methods; -use crate::{ - drive::Drive, - error::{drive::DriveError, Error}, - query::{DriveQuery, InternalClauses, OrderClause, WhereClause}, -}; - -impl Drive { - /// Fetch withdrawal documents by it's status - pub fn fetch_withdrawal_documents_by_status( - &self, - status: u8, - transaction: TransactionArg, - platform_version: &PlatformVersion, - ) -> Result, Error> { - let data_contract_id = withdrawals_contract::ID; - - let contract_fetch_info = self - .get_contract_with_fetch_info_and_fee( - data_contract_id.to_buffer(), - None, - true, - transaction, - platform_version, - )? - .1 - .ok_or_else(|| { - Error::Drive(DriveError::CorruptedCodeExecution( - "Can't fetch data contract", - )) - })?; - - let document_type = contract_fetch_info - .contract - .document_type_for_name(withdrawal::NAME)?; - - let mut where_clauses = BTreeMap::new(); - - //todo: make this lazy loaded or const - where_clauses.insert( - withdrawal::properties::STATUS.to_string(), - WhereClause { - field: withdrawal::properties::STATUS.to_string(), - operator: crate::query::WhereOperator::Equal, - value: Value::U8(status), - }, - ); - - let mut order_by = IndexMap::new(); - - order_by.insert( - withdrawal::properties::UPDATED_AT.to_string(), - OrderClause { - field: withdrawal::properties::UPDATED_AT.to_string(), - ascending: true, - }, - ); - - let drive_query = DriveQuery { - contract: &contract_fetch_info.contract, - document_type, - internal_clauses: InternalClauses { - primary_key_in_clause: None, - primary_key_equal_clause: None, - in_clause: None, - range_clause: None, - equal_clauses: where_clauses, - }, - offset: None, - limit: Some(100), - order_by, - start_at: None, - start_at_included: false, - block_time_ms: None, - }; - - let outcome = self.query_documents( - drive_query, - None, - false, - transaction, - Some(platform_version.protocol_version), - )?; - - Ok(outcome.documents_owned()) - } - - /// Find one document by it's transactionId field - pub fn find_withdrawal_document_by_transaction_id( - &self, - original_transaction_id: &[u8], - transaction: TransactionArg, - platform_version: &PlatformVersion, - ) -> Result { - let data_contract_id = withdrawals_contract::ID; - - let contract_fetch_info = self - .get_contract_with_fetch_info_and_fee( - data_contract_id.to_buffer(), - None, - true, - transaction, - platform_version, - )? - .1 - .ok_or_else(|| { - Error::Drive(DriveError::CorruptedCodeExecution( - "Can't fetch data contract", - )) - })?; - - let document_type = contract_fetch_info - .contract - .document_type_for_name(withdrawal::NAME)?; - - let mut where_clauses = BTreeMap::new(); - - where_clauses.insert( - withdrawal::properties::TRANSACTION_ID.to_string(), - WhereClause { - field: withdrawal::properties::TRANSACTION_ID.to_string(), - operator: crate::query::WhereOperator::Equal, - value: Value::Bytes(original_transaction_id.to_vec()), - }, - ); - - where_clauses.insert( - withdrawal::properties::STATUS.to_string(), - WhereClause { - field: withdrawal::properties::STATUS.to_string(), - operator: crate::query::WhereOperator::Equal, - value: Value::U8(withdrawals_contract::WithdrawalStatus::POOLED as u8), - }, - ); - - let drive_query = DriveQuery { - contract: &contract_fetch_info.contract, - document_type, - internal_clauses: InternalClauses { - primary_key_in_clause: None, - primary_key_equal_clause: None, - in_clause: None, - range_clause: None, - equal_clauses: where_clauses, - }, - offset: None, - limit: Some(1), - order_by: IndexMap::new(), - start_at: None, - start_at_included: false, - block_time_ms: None, - }; - - let outcome = self.query_documents( - drive_query, - None, - false, - transaction, - Some(platform_version.protocol_version), - )?; - - let document = outcome.documents_owned().pop().ok_or(Error::Drive( - DriveError::CorruptedDriveState("document was not found by transactionId".to_string()), - ))?; - - Ok(document) - } -} - -#[cfg(test)] -mod tests { - use dpp::prelude::Identifier; - use dpp::system_data_contracts::withdrawals_contract; - use dpp::tests::fixtures::get_withdrawal_document_fixture; - - use crate::tests::helpers::setup::setup_drive_with_initial_state_structure; - use crate::tests::helpers::setup::{setup_document, setup_system_data_contract}; - - mod fetch_withdrawal_documents_by_status { - use super::*; - use dpp::data_contract::accessors::v0::DataContractV0Getters; - use dpp::identity::core_script::CoreScript; - use dpp::platform_value::platform_value; - use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; - use dpp::system_data_contracts::{load_system_data_contract, SystemDataContract}; - use dpp::version::PlatformVersion; - use dpp::withdrawal::Pooling; - - #[test] - fn test_return_list_of_documents() { - let drive = setup_drive_with_initial_state_structure(); - - let transaction = drive.grove.start_transaction(); - - let platform_version = PlatformVersion::latest(); - - let data_contract = - load_system_data_contract(SystemDataContract::Withdrawals, platform_version) - .expect("to load system data contract"); - - setup_system_data_contract(&drive, &data_contract, Some(&transaction)); - - let documents = drive - .fetch_withdrawal_documents_by_status( - withdrawals_contract::WithdrawalStatus::QUEUED.into(), - Some(&transaction), - platform_version, - ) - .expect("to fetch documents by status"); - - assert_eq!(documents.len(), 0); - - let owner_id = Identifier::new([1u8; 32]); - - let document = get_withdrawal_document_fixture( - &data_contract, - owner_id, - platform_value!({ - "amount": 1000u64, - "coreFeePerByte": 1u32, - "pooling": Pooling::Never as u8, - "outputScript": CoreScript::from_bytes((0..23).collect::>()), - "status": withdrawals_contract::WithdrawalStatus::QUEUED as u8, - "transactionIndex": 1u64, - }), - None, - platform_version.protocol_version, - ) - .expect("expected withdrawal document"); - - let document_type = data_contract - .document_type_for_name(withdrawal::NAME) - .expect("expected to get document type"); - - setup_document( - &drive, - &document, - &data_contract, - document_type, - Some(&transaction), - ); - - let document = get_withdrawal_document_fixture( - &data_contract, - owner_id, - platform_value!({ - "amount": 1000u64, - "coreFeePerByte": 1u32, - "pooling": Pooling::Never as u8, - "outputScript": CoreScript::from_bytes((0..23).collect::>()), - "status": withdrawals_contract::WithdrawalStatus::POOLED, - "transactionIndex": 2u64, - }), - None, - platform_version.protocol_version, - ) - .expect("expected withdrawal document"); - - setup_document( - &drive, - &document, - &data_contract, - document_type, - Some(&transaction), - ); - - let documents = drive - .fetch_withdrawal_documents_by_status( - withdrawals_contract::WithdrawalStatus::QUEUED.into(), - Some(&transaction), - platform_version, - ) - .expect("to fetch documents by status"); - - assert_eq!(documents.len(), 1); - - let documents = drive - .fetch_withdrawal_documents_by_status( - withdrawals_contract::WithdrawalStatus::POOLED.into(), - Some(&transaction), - platform_version, - ) - .expect("to fetch documents by status"); - - assert_eq!(documents.len(), 1); - } - } - - mod find_document_by_transaction_id { - use dpp::data_contract::accessors::v0::DataContractV0Getters; - use dpp::document::DocumentV0Getters; - use dpp::identity::core_script::CoreScript; - use dpp::platform_value::{platform_value, Bytes32}; - use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; - use dpp::system_data_contracts::{load_system_data_contract, SystemDataContract}; - use dpp::version::PlatformVersion; - use dpp::withdrawal::Pooling; - - use super::*; - - #[test] - fn test_find_document_by_transaction_id() { - let drive = setup_drive_with_initial_state_structure(); - - let transaction = drive.grove.start_transaction(); - - let platform_version = PlatformVersion::latest(); - - let data_contract = - load_system_data_contract(SystemDataContract::Withdrawals, platform_version) - .expect("to load system data contract"); - - setup_system_data_contract(&drive, &data_contract, Some(&transaction)); - - let owner_id = Identifier::new([1u8; 32]); - - let document = get_withdrawal_document_fixture( - &data_contract, - owner_id, - platform_value!({ - "amount": 1000u64, - "coreFeePerByte": 1u32, - "pooling": Pooling::Never as u8, - "outputScript": CoreScript::from_bytes((0..23).collect::>()), - "status": withdrawals_contract::WithdrawalStatus::POOLED as u8, - "transactionIndex": 1u64, - "transactionId": Bytes32::default(), - }), - None, - platform_version.protocol_version, - ) - .expect("expected to get withdrawal document"); - - let document_type = data_contract - .document_type_for_name(withdrawal::NAME) - .expect("expected to get document type"); - - setup_document( - &drive, - &document, - &data_contract, - document_type, - Some(&transaction), - ); - - let found_document = drive - .find_withdrawal_document_by_transaction_id( - Bytes32::default().as_slice(), - Some(&transaction), - platform_version, - ) - .expect("to find document by it's transaction id"); - - assert_eq!(found_document.id().to_vec(), document.id().to_vec()); - } - } -} diff --git a/packages/rs-drive/src/drive/identity/withdrawals/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/mod.rs index f528534951..57f26a5b5e 100644 --- a/packages/rs-drive/src/drive/identity/withdrawals/mod.rs +++ b/packages/rs-drive/src/drive/identity/withdrawals/mod.rs @@ -1,11 +1,12 @@ -/// Functions related to updating of a withdrawal status -pub mod documents; +/// Functions related to withdrawal documents +pub mod document; + /// Functions and constants related to GroveDB paths pub mod paths; -/// Functions related to withdrawal queue -pub mod queue; -/// Functions related to transaction index counter -pub mod transaction_index; +/// Functions related to withdrawal transactions +pub mod transaction; -/// Simple type alias for withdrawal transaction with it's id -pub type WithdrawalTransactionIdAndBytes = (Vec, Vec); +/// Simple type alias for withdrawal transaction with it's index +pub type WithdrawalTransactionIndexAndBytes = (WithdrawalTransactionIndex, Vec); +/// Transaction index type +pub type WithdrawalTransactionIndex = u64; diff --git a/packages/rs-drive/src/drive/identity/withdrawals/paths.rs b/packages/rs-drive/src/drive/identity/withdrawals/paths.rs index b4e53314a9..6f73afe5d8 100644 --- a/packages/rs-drive/src/drive/identity/withdrawals/paths.rs +++ b/packages/rs-drive/src/drive/identity/withdrawals/paths.rs @@ -3,29 +3,22 @@ use grovedb::Element; use crate::drive::batch::grovedb_op_batch::GroveDbOpBatchV0Methods; use crate::drive::{batch::GroveDbOpBatch, RootTree}; -/// constant id for transaction counter -pub const WITHDRAWAL_TRANSACTIONS_COUNTER_ID: [u8; 1] = [0]; +/// constant key for transaction counter +pub const WITHDRAWAL_TRANSACTIONS_NEXT_INDEX_KEY: [u8; 1] = [0]; /// constant id for subtree containing transactions queue -pub const WITHDRAWAL_TRANSACTIONS_QUEUE_ID: [u8; 1] = [1]; -/// constant id for subtree containing expired transaction ids -pub const WITHDRAWAL_TRANSACTIONS_EXPIRED_IDS: [u8; 1] = [2]; +pub const WITHDRAWAL_TRANSACTIONS_QUEUE_KEY: [u8; 1] = [1]; /// Add operations for creating initial withdrawal state structure pub fn add_initial_withdrawal_state_structure_operations(batch: &mut GroveDbOpBatch) { batch.add_insert( vec![vec![RootTree::WithdrawalTransactions as u8]], - WITHDRAWAL_TRANSACTIONS_COUNTER_ID.to_vec(), + WITHDRAWAL_TRANSACTIONS_NEXT_INDEX_KEY.to_vec(), Element::Item(0u64.to_be_bytes().to_vec(), None), ); batch.add_insert_empty_tree( vec![vec![RootTree::WithdrawalTransactions as u8]], - WITHDRAWAL_TRANSACTIONS_QUEUE_ID.to_vec(), - ); - - batch.add_insert_empty_tree( - vec![vec![RootTree::WithdrawalTransactions as u8]], - WITHDRAWAL_TRANSACTIONS_EXPIRED_IDS.to_vec(), + WITHDRAWAL_TRANSACTIONS_QUEUE_KEY.to_vec(), ); } @@ -43,7 +36,7 @@ pub fn get_withdrawal_root_path() -> [&'static [u8]; 1] { pub fn get_withdrawal_transactions_queue_path_vec() -> Vec> { vec![ vec![RootTree::WithdrawalTransactions as u8], - WITHDRAWAL_TRANSACTIONS_QUEUE_ID.to_vec(), + WITHDRAWAL_TRANSACTIONS_QUEUE_KEY.to_vec(), ] } @@ -51,22 +44,6 @@ pub fn get_withdrawal_transactions_queue_path_vec() -> Vec> { pub fn get_withdrawal_transactions_queue_path() -> [&'static [u8]; 2] { [ Into::<&[u8; 1]>::into(RootTree::WithdrawalTransactions), - &WITHDRAWAL_TRANSACTIONS_QUEUE_ID, - ] -} - -/// Helper function to get expired ids path as Vec -pub fn get_withdrawal_transactions_expired_ids_path_vec() -> Vec> { - vec![ - vec![RootTree::WithdrawalTransactions as u8], - WITHDRAWAL_TRANSACTIONS_EXPIRED_IDS.to_vec(), - ] -} - -/// Helper function to get expired ids path as [u8] -pub fn get_withdrawal_transactions_expired_ids_path() -> [&'static [u8]; 2] { - [ - Into::<&[u8; 1]>::into(RootTree::WithdrawalTransactions), - &WITHDRAWAL_TRANSACTIONS_EXPIRED_IDS, + &WITHDRAWAL_TRANSACTIONS_QUEUE_KEY, ] } diff --git a/packages/rs-drive/src/drive/identity/withdrawals/queue.rs b/packages/rs-drive/src/drive/identity/withdrawals/queue.rs deleted file mode 100644 index 17c00a5c9b..0000000000 --- a/packages/rs-drive/src/drive/identity/withdrawals/queue.rs +++ /dev/null @@ -1,178 +0,0 @@ -use std::ops::RangeFull; - -use grovedb::{ - query_result_type::QueryResultType, Element, PathQuery, Query, QueryItem, SizedQuery, - TransactionArg, -}; - -use crate::drive::identity::withdrawals::WithdrawalTransactionIdAndBytes; -use crate::{ - drive::{ - batch::{drive_op_batch::WithdrawalOperationType, DriveOperation}, - Drive, - }, - error::{drive::DriveError, Error}, -}; - -use super::paths::get_withdrawal_transactions_queue_path_vec; - -impl Drive { - /// Add insert operations for withdrawal transactions to the batch - pub fn add_enqueue_withdrawal_transaction_operations<'a>( - &self, - withdrawals: &'a [WithdrawalTransactionIdAndBytes], - drive_operation_types: &mut Vec>, - ) { - if !withdrawals.is_empty() { - drive_operation_types.push(DriveOperation::WithdrawalOperation( - WithdrawalOperationType::InsertTransactions { - withdrawal_transactions: withdrawals, - }, - )); - } - } - - /// Get specified amount of withdrawal transactions from the DB - pub fn dequeue_withdrawal_transactions( - &self, - max_amount: u16, - transaction: TransactionArg, - drive_operation_types: &mut Vec, - ) -> Result, Error> { - let mut query = Query::new(); - - query.insert_item(QueryItem::RangeFull(RangeFull)); - - let path_query = PathQuery { - path: get_withdrawal_transactions_queue_path_vec(), - query: SizedQuery { - query, - limit: Some(max_amount), - offset: None, - }, - }; - - let result_items = self - .grove - .query_raw( - &path_query, - transaction.is_some(), - true, - QueryResultType::QueryKeyElementPairResultType, - transaction, - ) - .unwrap() - .map_err(Error::GroveDB)? - .0 - .to_key_elements(); - - let withdrawals = result_items - .into_iter() - .map(|(id, element)| match element { - Element::Item(bytes, _) => Ok((id, bytes)), - _ => Err(Error::Drive(DriveError::CorruptedWithdrawalNotItem( - "withdrawal is not an item", - ))), - }) - .collect::, Vec)>, Error>>()?; - - if !withdrawals.is_empty() { - for (id, _) in withdrawals.iter() { - drive_operation_types.push(DriveOperation::WithdrawalOperation( - WithdrawalOperationType::DeleteWithdrawalTransaction { id: id.clone() }, - )); - } - } - - Ok(withdrawals) - } -} - -#[cfg(test)] -mod tests { - use crate::{ - drive::batch::DriveOperation, - tests::helpers::setup::setup_drive_with_initial_state_structure, - }; - use dpp::block::block_info::BlockInfo; - use dpp::block::epoch::Epoch; - use dpp::version::PlatformVersion; - - #[test] - fn test_enqueue_and_dequeue() { - let drive = setup_drive_with_initial_state_structure(); - - let platform_version = PlatformVersion::latest(); - - let transaction = drive.grove.start_transaction(); - - let withdrawals: Vec<(Vec, Vec)> = (0..17) - .map(|i: u8| (i.to_be_bytes().to_vec(), vec![i; 32])) - .collect(); - - let block_info = BlockInfo { - time_ms: 1, - height: 1, - core_height: 1, - epoch: Epoch::new(1).unwrap(), - }; - - let mut drive_operations: Vec = vec![]; - - drive.add_enqueue_withdrawal_transaction_operations(&withdrawals, &mut drive_operations); - - drive - .apply_drive_operations( - drive_operations, - true, - &block_info, - Some(&transaction), - platform_version, - ) - .expect("to apply batch"); - - let mut drive_operations: Vec = vec![]; - - let withdrawals = drive - .dequeue_withdrawal_transactions(16, Some(&transaction), &mut drive_operations) - .expect("to dequeue withdrawals"); - - drive - .apply_drive_operations( - drive_operations, - true, - &block_info, - Some(&transaction), - platform_version, - ) - .expect("to apply batch"); - - assert_eq!(withdrawals.len(), 16); - - let mut drive_operations: Vec = vec![]; - - let withdrawals = drive - .dequeue_withdrawal_transactions(16, Some(&transaction), &mut drive_operations) - .expect("to dequeue withdrawals"); - - drive - .apply_drive_operations( - drive_operations, - true, - &block_info, - Some(&transaction), - platform_version, - ) - .expect("to apply batch"); - - assert_eq!(withdrawals.len(), 1); - - let mut drive_operations: Vec = vec![]; - - drive - .dequeue_withdrawal_transactions(16, Some(&transaction), &mut drive_operations) - .expect("to dequeue withdrawals"); - - assert_eq!(drive_operations.len(), 0); - } -} diff --git a/packages/rs-drive/src/drive/identity/withdrawals/transaction/index/add_update_next_withdrawal_transaction_index_operation/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/transaction/index/add_update_next_withdrawal_transaction_index_operation/mod.rs new file mode 100644 index 0000000000..9390683d27 --- /dev/null +++ b/packages/rs-drive/src/drive/identity/withdrawals/transaction/index/add_update_next_withdrawal_transaction_index_operation/mod.rs @@ -0,0 +1,42 @@ +mod v0; + +use crate::drive::batch::DriveOperation; +use crate::drive::identity::withdrawals::WithdrawalTransactionIndex; +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use platform_version::version::PlatformVersion; + +impl Drive { + /// Add next transaction index increment operation to the batch + pub fn add_update_next_withdrawal_transaction_index_operation( + &self, + index: WithdrawalTransactionIndex, + drive_operation_types: &mut Vec, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + match platform_version + .drive + .methods + .identity + .withdrawals + .transaction + .index + .add_update_next_withdrawal_transaction_index_operation + { + 0 => { + self.add_update_next_withdrawal_transaction_index_operation_v0( + index, + drive_operation_types, + ); + + Ok(()) + } + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "add_update_next_withdrawal_transaction_index_operation".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/identity/withdrawals/transaction/index/add_update_next_withdrawal_transaction_index_operation/v0/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/transaction/index/add_update_next_withdrawal_transaction_index_operation/v0/mod.rs new file mode 100644 index 0000000000..eb0bb01f20 --- /dev/null +++ b/packages/rs-drive/src/drive/identity/withdrawals/transaction/index/add_update_next_withdrawal_transaction_index_operation/v0/mod.rs @@ -0,0 +1,16 @@ +use crate::drive::batch::drive_op_batch::WithdrawalOperationType; +use crate::drive::batch::DriveOperation; +use crate::drive::identity::withdrawals::WithdrawalTransactionIndex; +use crate::drive::Drive; + +impl Drive { + pub(super) fn add_update_next_withdrawal_transaction_index_operation_v0( + &self, + index: WithdrawalTransactionIndex, + drive_operation_types: &mut Vec, + ) { + drive_operation_types.push(DriveOperation::WithdrawalOperation( + WithdrawalOperationType::UpdateIndexCounter { index }, + )); + } +} diff --git a/packages/rs-drive/src/drive/identity/withdrawals/transaction/index/fetch_next_withdrawal_transaction_index/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/transaction/index/fetch_next_withdrawal_transaction_index/mod.rs new file mode 100644 index 0000000000..50a84c82f3 --- /dev/null +++ b/packages/rs-drive/src/drive/identity/withdrawals/transaction/index/fetch_next_withdrawal_transaction_index/mod.rs @@ -0,0 +1,34 @@ +use crate::drive::identity::withdrawals::WithdrawalTransactionIndex; +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use grovedb::TransactionArg; +use platform_version::version::PlatformVersion; + +mod v0; + +impl Drive { + /// Fetches next withdrawal transaction index + pub fn fetch_next_withdrawal_transaction_index( + &self, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result { + match platform_version + .drive + .methods + .identity + .withdrawals + .transaction + .index + .fetch_next_withdrawal_transaction_index + { + 0 => self.fetch_next_withdrawal_transaction_index_v0(transaction), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "fetch_next_withdrawal_transaction_index".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/identity/withdrawals/transaction/index/fetch_next_withdrawal_transaction_index/v0/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/transaction/index/fetch_next_withdrawal_transaction_index/v0/mod.rs new file mode 100644 index 0000000000..56a9f14959 --- /dev/null +++ b/packages/rs-drive/src/drive/identity/withdrawals/transaction/index/fetch_next_withdrawal_transaction_index/v0/mod.rs @@ -0,0 +1,40 @@ +use crate::drive::identity::withdrawals::paths::WITHDRAWAL_TRANSACTIONS_NEXT_INDEX_KEY; +use crate::drive::identity::withdrawals::WithdrawalTransactionIndex; +use crate::drive::{Drive, RootTree}; +use crate::error::drive::DriveError; +use crate::error::Error; +use grovedb::{Element, TransactionArg}; + +impl Drive { + pub(super) fn fetch_next_withdrawal_transaction_index_v0( + &self, + transaction: TransactionArg, + ) -> Result { + let element = self + .grove + .get( + &[Into::<&[u8; 1]>::into(RootTree::WithdrawalTransactions).as_slice()], + &WITHDRAWAL_TRANSACTIONS_NEXT_INDEX_KEY, + transaction, + ) + .unwrap() + .map_err(Error::GroveDB)?; + + let Element::Item(counter_bytes, _) = element else { + return Err(Error::Drive( + DriveError::CorruptedWithdrawalTransactionsCounterNotItem( + "withdrawal transactions counter must be an item", + ), + )); + }; + + let counter = + WithdrawalTransactionIndex::from_be_bytes(counter_bytes.try_into().map_err(|_| { + DriveError::CorruptedWithdrawalTransactionsCounterInvalidLength( + "withdrawal transactions counter must be an u64", + ) + })?); + + Ok(counter) + } +} diff --git a/packages/rs-drive/src/drive/identity/withdrawals/transaction/index/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/transaction/index/mod.rs new file mode 100644 index 0000000000..d1882c72d7 --- /dev/null +++ b/packages/rs-drive/src/drive/identity/withdrawals/transaction/index/mod.rs @@ -0,0 +1,72 @@ +/// This module dedicated for a versioned add_update_next_withdrawal_transaction_index_operation +pub mod add_update_next_withdrawal_transaction_index_operation; +/// This module dedicated for a versioned fetch_next_withdrawal_transaction_index +pub mod fetch_next_withdrawal_transaction_index; + +#[cfg(test)] +mod tests { + use dpp::block::block_info::BlockInfo; + use dpp::block::epoch::Epoch; + use dpp::version::PlatformVersion; + + use crate::tests::helpers::setup::setup_drive_with_initial_state_structure; + + #[test] + fn test_next_withdrawal_transaction_index() { + let drive = setup_drive_with_initial_state_structure(); + + let platform_version = PlatformVersion::latest(); + + let transaction = drive.grove.start_transaction(); + + let block_info = BlockInfo { + time_ms: 1, + height: 1, + core_height: 1, + epoch: Epoch::new(1).unwrap(), + }; + + let mut batch = vec![]; + + let counter: u64 = 42; + + drive + .add_update_next_withdrawal_transaction_index_operation( + counter, + &mut batch, + platform_version, + ) + .expect("to add update next withdrawal transaction index operation"); + + drive + .apply_drive_operations( + batch, + true, + &block_info, + Some(&transaction), + platform_version, + ) + .expect("to apply drive ops"); + + let stored_counter = drive + .fetch_next_withdrawal_transaction_index(Some(&transaction), platform_version) + .expect("to withdraw counter"); + + assert_eq!(stored_counter, counter); + } + + #[test] + fn test_initial_withdrawal_transaction_index() { + let drive = setup_drive_with_initial_state_structure(); + + let platform_version = PlatformVersion::latest(); + + let transaction = drive.grove.start_transaction(); + + let stored_counter = drive + .fetch_next_withdrawal_transaction_index(Some(&transaction), platform_version) + .expect("to withdraw counter"); + + assert_eq!(stored_counter, 0); + } +} diff --git a/packages/rs-drive/src/drive/identity/withdrawals/transaction/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/transaction/mod.rs new file mode 100644 index 0000000000..03b9ea47d8 --- /dev/null +++ b/packages/rs-drive/src/drive/identity/withdrawals/transaction/mod.rs @@ -0,0 +1,5 @@ +/// Functions related to withdrawal queue +pub mod queue; + +/// Functions related to transaction index counter +pub mod index; diff --git a/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/add_enqueue_untied_withdrawal_transaction_operations/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/add_enqueue_untied_withdrawal_transaction_operations/mod.rs new file mode 100644 index 0000000000..a48f4f45ce --- /dev/null +++ b/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/add_enqueue_untied_withdrawal_transaction_operations/mod.rs @@ -0,0 +1,42 @@ +use crate::drive::batch::DriveOperation; +use crate::drive::identity::withdrawals::WithdrawalTransactionIndexAndBytes; +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use platform_version::version::PlatformVersion; + +mod v0; + +impl Drive { + /// Add insert operations for withdrawal transactions to the batch + pub fn add_enqueue_untied_withdrawal_transaction_operations( + &self, + withdrawal_transactions: Vec, + drive_operation_types: &mut Vec, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + match platform_version + .drive + .methods + .identity + .withdrawals + .transaction + .queue + .add_enqueue_untied_withdrawal_transaction_operations + { + 0 => { + self.add_enqueue_untied_withdrawal_transaction_operations_v0( + withdrawal_transactions, + drive_operation_types, + ); + + Ok(()) + } + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "add_enqueue_untied_withdrawal_transaction_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/add_enqueue_untied_withdrawal_transaction_operations/v0/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/add_enqueue_untied_withdrawal_transaction_operations/v0/mod.rs new file mode 100644 index 0000000000..fb25f04490 --- /dev/null +++ b/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/add_enqueue_untied_withdrawal_transaction_operations/v0/mod.rs @@ -0,0 +1,20 @@ +use crate::drive::batch::drive_op_batch::WithdrawalOperationType; +use crate::drive::batch::DriveOperation; +use crate::drive::identity::withdrawals::WithdrawalTransactionIndexAndBytes; +use crate::drive::Drive; + +impl Drive { + pub(super) fn add_enqueue_untied_withdrawal_transaction_operations_v0( + &self, + withdrawal_transactions: Vec, + drive_operation_types: &mut Vec, + ) { + if !withdrawal_transactions.is_empty() { + drive_operation_types.push(DriveOperation::WithdrawalOperation( + WithdrawalOperationType::InsertTransactions { + withdrawal_transactions, + }, + )); + } + } +} diff --git a/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/dequeue_untied_withdrawal_transactions/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/dequeue_untied_withdrawal_transactions/mod.rs new file mode 100644 index 0000000000..2aa39d18a1 --- /dev/null +++ b/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/dequeue_untied_withdrawal_transactions/mod.rs @@ -0,0 +1,41 @@ +mod v0; + +use crate::drive::batch::DriveOperation; +use crate::drive::identity::withdrawals::WithdrawalTransactionIndexAndBytes; +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use grovedb::TransactionArg; +use platform_version::version::PlatformVersion; + +impl Drive { + /// Get specified amount of withdrawal transactions from the DB + pub fn dequeue_untied_withdrawal_transactions( + &self, + limit: u16, + transaction: TransactionArg, + drive_operation_types: &mut Vec, + platform_version: &PlatformVersion, + ) -> Result, Error> { + match platform_version + .drive + .methods + .identity + .withdrawals + .transaction + .queue + .dequeue_untied_withdrawal_transactions + { + 0 => self.dequeue_untied_withdrawal_transactions_v0( + limit, + transaction, + drive_operation_types, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "dequeue_untied_withdrawal_transactions".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/dequeue_untied_withdrawal_transactions/v0/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/dequeue_untied_withdrawal_transactions/v0/mod.rs new file mode 100644 index 0000000000..6de788887d --- /dev/null +++ b/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/dequeue_untied_withdrawal_transactions/v0/mod.rs @@ -0,0 +1,80 @@ +use crate::drive::batch::drive_op_batch::WithdrawalOperationType; +use crate::drive::batch::DriveOperation; +use crate::drive::identity::withdrawals::paths::get_withdrawal_transactions_queue_path_vec; +use crate::drive::identity::withdrawals::{ + WithdrawalTransactionIndex, WithdrawalTransactionIndexAndBytes, +}; +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::query::{Query, QueryItem}; +use grovedb::query_result_type::QueryResultType; +use grovedb::{Element, PathQuery, SizedQuery, TransactionArg}; +use std::convert::TryInto; +use std::ops::RangeFull; + +impl Drive { + pub(super) fn dequeue_untied_withdrawal_transactions_v0( + &self, + limit: u16, + transaction: TransactionArg, + drive_operation_types: &mut Vec, + ) -> Result, Error> { + let mut query = Query::new(); + + query.insert_item(QueryItem::RangeFull(RangeFull)); + + let path_query = PathQuery { + path: get_withdrawal_transactions_queue_path_vec(), + query: SizedQuery { + query, + limit: Some(limit), + offset: None, + }, + }; + + let result_items = self + .grove + .query_raw( + &path_query, + transaction.is_some(), + true, + QueryResultType::QueryKeyElementPairResultType, + transaction, + ) + .unwrap() + .map_err(Error::GroveDB)? + .0 + .to_key_elements(); + + let withdrawal_transactions = result_items + .into_iter() + .map(|(index_bytes, element)| match element { + Element::Item(bytes, _) => { + let index = WithdrawalTransactionIndex::from_be_bytes( + index_bytes.try_into().map_err(|_| { + Error::Drive(DriveError::CorruptedSerialization(String::from( + "withdrawal index must be u64", + ))) + })?, + ); + + Ok((index, bytes)) + } + _ => Err(Error::Drive(DriveError::CorruptedWithdrawalNotItem( + "withdrawal is not an item", + ))), + }) + .collect::, Error>>()?; + + if !withdrawal_transactions.is_empty() { + for (index, _) in withdrawal_transactions.iter() { + drive_operation_types.push(DriveOperation::WithdrawalOperation( + WithdrawalOperationType::DeleteWithdrawalTransaction { index: *index }, + )); + } + } + + Ok(withdrawal_transactions) + } +} diff --git a/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/mod.rs new file mode 100644 index 0000000000..b404dc9088 --- /dev/null +++ b/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/mod.rs @@ -0,0 +1,117 @@ +/// This module dedicated for a versioned add_enqueue_untied_withdrawal_transaction_operations +pub mod add_enqueue_untied_withdrawal_transaction_operations; +/// This module dedicated for a versioned dequeue_untied_withdrawal_transactions +pub mod dequeue_untied_withdrawal_transactions; + +#[cfg(test)] +mod tests { + use crate::drive::identity::withdrawals::{ + WithdrawalTransactionIndex, WithdrawalTransactionIndexAndBytes, + }; + use crate::{ + drive::batch::DriveOperation, + tests::helpers::setup::setup_drive_with_initial_state_structure, + }; + use dpp::block::block_info::BlockInfo; + use dpp::block::epoch::Epoch; + use dpp::version::PlatformVersion; + + #[test] + fn test_enqueue_and_dequeue() { + let drive = setup_drive_with_initial_state_structure(); + + let platform_version = PlatformVersion::latest(); + + let transaction = drive.grove.start_transaction(); + + let withdrawals: Vec = (0..17) + .map(|i: u8| (i as WithdrawalTransactionIndex, vec![i; 32])) + .collect(); + + let block_info = BlockInfo { + time_ms: 1, + height: 1, + core_height: 1, + epoch: Epoch::new(1).unwrap(), + }; + + let mut drive_operations: Vec = vec![]; + + drive + .add_enqueue_untied_withdrawal_transaction_operations( + withdrawals, + &mut drive_operations, + platform_version, + ) + .expect("to add enqueue untied withdrawal transaction operations"); + + drive + .apply_drive_operations( + drive_operations, + true, + &block_info, + Some(&transaction), + platform_version, + ) + .expect("to apply batch"); + + let mut drive_operations: Vec = vec![]; + + let withdrawals = drive + .dequeue_untied_withdrawal_transactions( + 16, + Some(&transaction), + &mut drive_operations, + platform_version, + ) + .expect("to dequeue withdrawals"); + + drive + .apply_drive_operations( + drive_operations, + true, + &block_info, + Some(&transaction), + platform_version, + ) + .expect("to apply batch"); + + assert_eq!(withdrawals.len(), 16); + + let mut drive_operations: Vec = vec![]; + + let withdrawals = drive + .dequeue_untied_withdrawal_transactions( + 16, + Some(&transaction), + &mut drive_operations, + platform_version, + ) + .expect("to dequeue withdrawals"); + + drive + .apply_drive_operations( + drive_operations, + true, + &block_info, + Some(&transaction), + platform_version, + ) + .expect("to apply batch"); + + assert_eq!(withdrawals.len(), 1); + + let mut drive_operations: Vec = vec![]; + + drive + .dequeue_untied_withdrawal_transactions( + 16, + Some(&transaction), + &mut drive_operations, + platform_version, + ) + .expect("to dequeue withdrawals"); + + assert_eq!(drive_operations.len(), 0); + } +} diff --git a/packages/rs-drive/src/drive/identity/withdrawals/transaction_index.rs b/packages/rs-drive/src/drive/identity/withdrawals/transaction_index.rs deleted file mode 100644 index f87bc09264..0000000000 --- a/packages/rs-drive/src/drive/identity/withdrawals/transaction_index.rs +++ /dev/null @@ -1,239 +0,0 @@ -use grovedb::{ - query_result_type::{QueryResultElement, QueryResultType}, - Element, PathQuery, Query, SizedQuery, TransactionArg, -}; - -use crate::{ - drive::{ - batch::{drive_op_batch::WithdrawalOperationType, DriveOperation}, - Drive, RootTree, - }, - error::{drive::DriveError, Error}, -}; - -use super::paths::{ - get_withdrawal_transactions_expired_ids_path_vec, WITHDRAWAL_TRANSACTIONS_COUNTER_ID, -}; - -impl Drive { - /// Get and remove latest withdrawal index in a queue - pub fn fetch_and_remove_latest_withdrawal_transaction_index_operations( - &self, - drive_operation_types: &mut Vec, - transaction: TransactionArg, - ) -> Result { - let mut inner_query = Query::new(); - - inner_query.insert_all(); - - let expired_index_query = PathQuery::new( - get_withdrawal_transactions_expired_ids_path_vec(), - SizedQuery::new(inner_query, Some(1), None), - ); - - let (expired_index_elements, _) = self - .grove - .query_raw( - &expired_index_query, - transaction.is_some(), - true, - QueryResultType::QueryKeyElementPairResultType, - transaction, - ) - .unwrap()?; - - if !expired_index_elements.is_empty() { - let expired_index_element_pair = expired_index_elements.elements.get(0).unwrap(); - - if let QueryResultElement::KeyElementPairResultItem((key, _)) = - expired_index_element_pair - { - drive_operation_types.push(DriveOperation::WithdrawalOperation( - WithdrawalOperationType::DeleteExpiredIndex { key: key.clone() }, - )); - - let index = u64::from_be_bytes(key.clone().try_into().map_err(|_| { - Error::Drive(DriveError::CorruptedCodeExecution( - "Transaction index has wrong length", - )) - })?); - - return Ok(index); - } - } - - let result = self - .grove - .get( - &[Into::<&[u8; 1]>::into(RootTree::WithdrawalTransactions).as_slice()], - &WITHDRAWAL_TRANSACTIONS_COUNTER_ID, - transaction, - ) - .unwrap() - .map_err(Error::GroveDB); - - if let Err(Error::GroveDB(grovedb::Error::PathKeyNotFound(_))) = &result { - return Ok(0); - } - - let element = result?; - - if let Element::Item(counter_bytes, _) = element { - let counter = u64::from_be_bytes(counter_bytes.try_into().map_err(|_| { - DriveError::CorruptedWithdrawalTransactionsCounterInvalidLength( - "withdrawal transactions counter must be an u64", - ) - })?); - - Ok(counter) - } else { - Err(Error::Drive( - DriveError::CorruptedWithdrawalTransactionsCounterNotItem( - "withdrawal transactions counter must be an item", - ), - )) - } - } - - /// Add counter update operations to the batch - pub fn add_update_withdrawal_index_counter_operation( - &self, - value: u64, - drive_operation_types: &mut Vec, - ) { - drive_operation_types.push(DriveOperation::WithdrawalOperation( - WithdrawalOperationType::UpdateIndexCounter { index: value }, - )); - } - - /// Add insert expired counter operations - pub fn add_insert_expired_index_operation( - &self, - transaction_index: u64, - drive_operation_types: &mut Vec, - ) { - drive_operation_types.push(DriveOperation::WithdrawalOperation( - WithdrawalOperationType::InsertExpiredIndex { - index: transaction_index, - }, - )); - } -} - -#[cfg(test)] -mod tests { - use dpp::block::block_info::BlockInfo; - use dpp::block::epoch::Epoch; - use dpp::version::PlatformVersion; - use grovedb::Element; - - use crate::{ - drive::identity::withdrawals::paths::get_withdrawal_transactions_expired_ids_path, - tests::helpers::setup::setup_drive_with_initial_state_structure, - }; - - #[test] - fn test_withdrawal_transaction_counter() { - let drive = setup_drive_with_initial_state_structure(); - - let platform_version = PlatformVersion::latest(); - - let transaction = drive.grove.start_transaction(); - - let block_info = BlockInfo { - time_ms: 1, - height: 1, - core_height: 1, - epoch: Epoch::new(1).unwrap(), - }; - - let mut batch = vec![]; - - let counter: u64 = 42; - - drive.add_update_withdrawal_index_counter_operation(counter, &mut batch); - - drive - .apply_drive_operations( - batch, - true, - &block_info, - Some(&transaction), - platform_version, - ) - .expect("to apply drive ops"); - - let mut batch = vec![]; - - let stored_counter = drive - .fetch_and_remove_latest_withdrawal_transaction_index_operations( - &mut batch, - Some(&transaction), - ) - .expect("to withdraw counter"); - - drive - .apply_drive_operations( - batch, - true, - &block_info, - Some(&transaction), - platform_version, - ) - .expect("to apply drive ops"); - - assert_eq!(stored_counter, counter); - } - - #[test] - fn test_returns_0_if_empty() { - let drive = setup_drive_with_initial_state_structure(); - - let transaction = drive.grove.start_transaction(); - - let mut batch = vec![]; - - let stored_counter = drive - .fetch_and_remove_latest_withdrawal_transaction_index_operations( - &mut batch, - Some(&transaction), - ) - .expect("to withdraw counter"); - - assert_eq!(stored_counter, 0); - } - - #[test] - fn test_should_return_expired_index_if_any() { - let drive = setup_drive_with_initial_state_structure(); - - let transaction = drive.grove.start_transaction(); - - let bytes = 42u64.to_be_bytes(); - - let path = get_withdrawal_transactions_expired_ids_path(); - - drive - .grove - .insert( - &path, - &bytes, - Element::Item(bytes.to_vec(), None), - None, - Some(&transaction), - ) - .unwrap() - .expect("to update index counter"); - - let mut batch = vec![]; - - let stored_counter = drive - .fetch_and_remove_latest_withdrawal_transaction_index_operations( - &mut batch, - Some(&transaction), - ) - .expect("to withdraw counter"); - - assert_eq!(stored_counter, 42); - } -} diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/mod.rs b/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/mod.rs index 4706950d11..a3ebd13913 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/mod.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/mod.rs @@ -32,6 +32,13 @@ impl IdentityCreditWithdrawalTransitionAction { } } + /// Amount + pub fn amount(&self) -> u64 { + match self { + IdentityCreditWithdrawalTransitionAction::V0(transition) => transition.amount, + } + } + /// Recipient Id pub fn prepared_withdrawal_document(&self) -> &Document { match self { diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/mod.rs b/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/mod.rs index e41f127ebc..5f76a38e21 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/mod.rs @@ -16,4 +16,6 @@ pub struct IdentityCreditWithdrawalTransitionActionV0 { pub revision: Revision, /// prepared withdrawal document pub prepared_withdrawal_document: Document, + /// amount + pub amount: u64, } diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs index 9cebee4064..9a6e8f92af 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs @@ -12,16 +12,21 @@ impl IdentityCreditWithdrawalTransitionActionV0 { identity_credit_withdrawal: &IdentityCreditWithdrawalTransitionV0, creation_time_ms: u64, ) -> Self { + let mut entropy = Vec::new(); + entropy.extend_from_slice(&identity_credit_withdrawal.revision.to_be_bytes()); + entropy.extend_from_slice(identity_credit_withdrawal.output_script.as_bytes()); + let document_id = Document::generate_document_id_v0( &withdrawals_contract::ID, &identity_credit_withdrawal.identity_id, withdrawal::NAME, - identity_credit_withdrawal.output_script.as_bytes(), + &entropy, ); let document_data = platform_value!({ withdrawal::properties::AMOUNT: identity_credit_withdrawal.amount, withdrawal::properties::CORE_FEE_PER_BYTE: identity_credit_withdrawal.core_fee_per_byte, + // TODO(withdrawals): replace with actual value from state transition once pooling is done withdrawal::properties::POOLING: Pooling::Never, withdrawal::properties::OUTPUT_SCRIPT: identity_credit_withdrawal.output_script.as_bytes(), withdrawal::properties::STATUS: withdrawals_contract::WithdrawalStatus::QUEUED, @@ -41,6 +46,7 @@ impl IdentityCreditWithdrawalTransitionActionV0 { identity_id: identity_credit_withdrawal.identity_id, revision: identity_credit_withdrawal.revision, prepared_withdrawal_document: withdrawal_document, + amount: identity_credit_withdrawal.amount, } } } diff --git a/packages/rs-platform-version/src/version/drive_abci_versions.rs b/packages/rs-platform-version/src/version/drive_abci_versions.rs index 62fa30ba2c..cede88f48c 100644 --- a/packages/rs-platform-version/src/version/drive_abci_versions.rs +++ b/packages/rs-platform-version/src/version/drive_abci_versions.rs @@ -64,9 +64,8 @@ pub struct DriveAbciMethodVersions { pub core_chain_lock: DriveAbciCoreChainLockMethodVersionsAndConstants, pub fee_pool_inwards_distribution: DriveAbciFeePoolInwardsDistributionMethodVersions, pub fee_pool_outwards_distribution: DriveAbciFeePoolOutwardsDistributionMethodVersions, - pub identity_credit_withdrawal: DriveAbciIdentityCreditWithdrawalMethodVersions, + pub withdrawals: DriveAbciIdentityCreditWithdrawalMethodVersions, pub state_transition_processing: DriveAbciStateTransitionProcessingMethodVersions, - pub withdrawals: DriveAbciWithdrawalsMethodVersions, pub epoch: DriveAbciEpochMethodVersions, pub block_start: DriveAbciBlockStartMethodVersions, pub block_end: DriveAbciBlockEndMethodVersions, @@ -248,11 +247,12 @@ pub struct DriveAbciBlockEndMethodVersions { #[derive(Clone, Debug, Default)] pub struct DriveAbciIdentityCreditWithdrawalMethodVersions { - pub build_withdrawal_transactions_from_documents: FeatureVersion, - pub fetch_and_prepare_unsigned_withdrawal_transactions: FeatureVersion, + pub build_untied_withdrawal_transactions_from_documents: FeatureVersion, + pub dequeue_and_build_unsigned_withdrawal_transactions: FeatureVersion, pub fetch_transactions_block_inclusion_status: FeatureVersion, pub pool_withdrawals_into_transactions_queue: FeatureVersion, - pub update_broadcasted_withdrawal_transaction_statuses: FeatureVersion, + pub update_broadcasted_withdrawal_statuses: FeatureVersion, + pub append_signatures_and_broadcast_withdrawal_transactions: FeatureVersion, } #[derive(Clone, Debug, Default)] @@ -266,8 +266,3 @@ pub struct DriveAbciStateTransitionProcessingMethodVersions { pub process_raw_state_transitions: FeatureVersion, pub validate_fees_of_event: FeatureVersion, } - -#[derive(Clone, Debug, Default)] -pub struct DriveAbciWithdrawalsMethodVersions { - pub check_withdrawals: FeatureVersion, -} diff --git a/packages/rs-platform-version/src/version/drive_versions.rs b/packages/rs-platform-version/src/version/drive_versions.rs index 7afa099da9..afb7bcd623 100644 --- a/packages/rs-platform-version/src/version/drive_versions.rs +++ b/packages/rs-platform-version/src/version/drive_versions.rs @@ -416,6 +416,37 @@ pub struct DriveIdentityMethodVersions { pub insert: DriveIdentityInsertMethodVersions, pub contract_info: DriveIdentityContractInfoMethodVersions, pub cost_estimation: DriveIdentityCostEstimationMethodVersions, + pub withdrawals: DriveIdentityWithdrawalMethodVersions, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveIdentityWithdrawalMethodVersions { + pub document: DriveIdentityWithdrawalDocumentMethodVersions, + pub transaction: DriveIdentityWithdrawalTransactionMethodVersions, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveIdentityWithdrawalDocumentMethodVersions { + pub fetch_oldest_withdrawal_documents_by_status: FeatureVersion, + pub find_up_to_100_withdrawal_documents_by_status_and_transaction_indices: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveIdentityWithdrawalTransactionMethodVersions { + pub index: DriveIdentityWithdrawalTransactionIndexMethodVersions, + pub queue: DriveIdentityWithdrawalTransactionQueueMethodVersions, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveIdentityWithdrawalTransactionIndexMethodVersions { + pub fetch_next_withdrawal_transaction_index: FeatureVersion, + pub add_update_next_withdrawal_transaction_index_operation: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveIdentityWithdrawalTransactionQueueMethodVersions { + pub add_enqueue_untied_withdrawal_transaction_operations: FeatureVersion, + pub dequeue_untied_withdrawal_transactions: FeatureVersion, } #[derive(Clone, Debug, Default)] diff --git a/packages/rs-platform-version/src/version/mocks/v2_test.rs b/packages/rs-platform-version/src/version/mocks/v2_test.rs index a9fb7d79d4..840ba8582a 100644 --- a/packages/rs-platform-version/src/version/mocks/v2_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v2_test.rs @@ -27,7 +27,7 @@ use crate::version::drive_abci_versions::{ DriveAbciStateTransitionProcessingMethodVersions, DriveAbciStateTransitionValidationVersion, DriveAbciStateTransitionValidationVersions, DriveAbciStructureVersions, DriveAbciValidationDataTriggerAndBindingVersions, DriveAbciValidationDataTriggerVersions, - DriveAbciValidationVersions, DriveAbciVersion, DriveAbciWithdrawalsMethodVersions, + DriveAbciValidationVersions, DriveAbciVersion, }; use crate::version::drive_versions::{ DriveAssetLockMethodVersions, DriveBalancesMethodVersions, DriveBatchOperationsMethodVersion, @@ -52,14 +52,18 @@ use crate::version::drive_versions::{ DriveIdentityKeysInsertMethodVersions, DriveIdentityKeysMethodVersions, DriveIdentityKeysProveMethodVersions, DriveIdentityMethodVersions, DriveIdentityProveMethodVersions, DriveIdentityUpdateMethodVersions, - DriveInitializationMethodVersions, DriveMethodVersions, DriveOperationsMethodVersion, - DrivePlatformStateMethodVersions, DrivePlatformSystemMethodVersions, - DriveProtocolUpgradeVersions, DriveProveMethodVersions, DriveStateTransitionMethodVersions, - DriveStateTransitionOperationMethodVersions, DriveStructureVersion, - DriveSystemEstimationCostsMethodVersions, DriveSystemProtocolVersionMethodVersions, - DriveVerifyContractMethodVersions, DriveVerifyDocumentMethodVersions, - DriveVerifyIdentityMethodVersions, DriveVerifyMethodVersions, - DriveVerifySingleDocumentMethodVersions, DriveVerifySystemMethodVersions, DriveVersion, + DriveIdentityWithdrawalDocumentMethodVersions, DriveIdentityWithdrawalMethodVersions, + DriveIdentityWithdrawalTransactionIndexMethodVersions, + DriveIdentityWithdrawalTransactionMethodVersions, + DriveIdentityWithdrawalTransactionQueueMethodVersions, DriveInitializationMethodVersions, + DriveMethodVersions, DriveOperationsMethodVersion, DrivePlatformStateMethodVersions, + DrivePlatformSystemMethodVersions, DriveProtocolUpgradeVersions, DriveProveMethodVersions, + DriveStateTransitionMethodVersions, DriveStateTransitionOperationMethodVersions, + DriveStructureVersion, DriveSystemEstimationCostsMethodVersions, + DriveSystemProtocolVersionMethodVersions, DriveVerifyContractMethodVersions, + DriveVerifyDocumentMethodVersions, DriveVerifyIdentityMethodVersions, + DriveVerifyMethodVersions, DriveVerifySingleDocumentMethodVersions, + DriveVerifySystemMethodVersions, DriveVersion, }; use crate::version::mocks::TEST_BYTES; use crate::version::protocol_version::{FeatureVersionBounds, PlatformVersion}; @@ -361,6 +365,22 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { for_root_key_reference_tree: 0, for_update_revision: 0, }, + withdrawals: DriveIdentityWithdrawalMethodVersions { + document: DriveIdentityWithdrawalDocumentMethodVersions { + fetch_oldest_withdrawal_documents_by_status: 0, + find_up_to_100_withdrawal_documents_by_status_and_transaction_indices: 0, + }, + transaction: DriveIdentityWithdrawalTransactionMethodVersions { + index: DriveIdentityWithdrawalTransactionIndexMethodVersions { + fetch_next_withdrawal_transaction_index: 0, + add_update_next_withdrawal_transaction_index_operation: 0, + }, + queue: DriveIdentityWithdrawalTransactionQueueMethodVersions { + add_enqueue_untied_withdrawal_transaction_operations: 0, + dequeue_untied_withdrawal_transactions: 0, + }, + }, + }, }, platform_system: DrivePlatformSystemMethodVersions { protocol_version: DriveSystemProtocolVersionMethodVersions { @@ -521,21 +541,19 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { find_oldest_epoch_needing_payment: 0, fetch_reward_shares_list_for_masternode: 0, }, - identity_credit_withdrawal: DriveAbciIdentityCreditWithdrawalMethodVersions { - build_withdrawal_transactions_from_documents: 0, - fetch_and_prepare_unsigned_withdrawal_transactions: 0, + withdrawals: DriveAbciIdentityCreditWithdrawalMethodVersions { + build_untied_withdrawal_transactions_from_documents: 0, + dequeue_and_build_unsigned_withdrawal_transactions: 0, fetch_transactions_block_inclusion_status: 0, pool_withdrawals_into_transactions_queue: 0, - update_broadcasted_withdrawal_transaction_statuses: 0, + update_broadcasted_withdrawal_statuses: 0, + append_signatures_and_broadcast_withdrawal_transactions: 0, }, state_transition_processing: DriveAbciStateTransitionProcessingMethodVersions { execute_event: 0, process_raw_state_transitions: 0, validate_fees_of_event: 0, }, - withdrawals: DriveAbciWithdrawalsMethodVersions { - check_withdrawals: 0, - }, epoch: DriveAbciEpochMethodVersions { gather_epoch_info: 0, get_genesis_time: 0, diff --git a/packages/rs-platform-version/src/version/mocks/v3_test.rs b/packages/rs-platform-version/src/version/mocks/v3_test.rs index 432e417dbf..3e47bae6dc 100644 --- a/packages/rs-platform-version/src/version/mocks/v3_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v3_test.rs @@ -27,7 +27,7 @@ use crate::version::drive_abci_versions::{ DriveAbciStateTransitionProcessingMethodVersions, DriveAbciStateTransitionValidationVersion, DriveAbciStateTransitionValidationVersions, DriveAbciStructureVersions, DriveAbciValidationDataTriggerAndBindingVersions, DriveAbciValidationDataTriggerVersions, - DriveAbciValidationVersions, DriveAbciVersion, DriveAbciWithdrawalsMethodVersions, + DriveAbciValidationVersions, DriveAbciVersion, }; use crate::version::drive_versions::{ DriveAssetLockMethodVersions, DriveBalancesMethodVersions, DriveBatchOperationsMethodVersion, @@ -52,14 +52,18 @@ use crate::version::drive_versions::{ DriveIdentityKeysInsertMethodVersions, DriveIdentityKeysMethodVersions, DriveIdentityKeysProveMethodVersions, DriveIdentityMethodVersions, DriveIdentityProveMethodVersions, DriveIdentityUpdateMethodVersions, - DriveInitializationMethodVersions, DriveMethodVersions, DriveOperationsMethodVersion, - DrivePlatformStateMethodVersions, DrivePlatformSystemMethodVersions, - DriveProtocolUpgradeVersions, DriveProveMethodVersions, DriveStateTransitionMethodVersions, - DriveStateTransitionOperationMethodVersions, DriveStructureVersion, - DriveSystemEstimationCostsMethodVersions, DriveSystemProtocolVersionMethodVersions, - DriveVerifyContractMethodVersions, DriveVerifyDocumentMethodVersions, - DriveVerifyIdentityMethodVersions, DriveVerifyMethodVersions, - DriveVerifySingleDocumentMethodVersions, DriveVerifySystemMethodVersions, DriveVersion, + DriveIdentityWithdrawalDocumentMethodVersions, DriveIdentityWithdrawalMethodVersions, + DriveIdentityWithdrawalTransactionIndexMethodVersions, + DriveIdentityWithdrawalTransactionMethodVersions, + DriveIdentityWithdrawalTransactionQueueMethodVersions, DriveInitializationMethodVersions, + DriveMethodVersions, DriveOperationsMethodVersion, DrivePlatformStateMethodVersions, + DrivePlatformSystemMethodVersions, DriveProtocolUpgradeVersions, DriveProveMethodVersions, + DriveStateTransitionMethodVersions, DriveStateTransitionOperationMethodVersions, + DriveStructureVersion, DriveSystemEstimationCostsMethodVersions, + DriveSystemProtocolVersionMethodVersions, DriveVerifyContractMethodVersions, + DriveVerifyDocumentMethodVersions, DriveVerifyIdentityMethodVersions, + DriveVerifyMethodVersions, DriveVerifySingleDocumentMethodVersions, + DriveVerifySystemMethodVersions, DriveVersion, }; use crate::version::mocks::TEST_BYTES; use crate::version::protocol_version::{FeatureVersionBounds, PlatformVersion}; @@ -369,6 +373,22 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { for_root_key_reference_tree: 0, for_update_revision: 0, }, + withdrawals: DriveIdentityWithdrawalMethodVersions { + document: DriveIdentityWithdrawalDocumentMethodVersions { + fetch_oldest_withdrawal_documents_by_status: 0, + find_up_to_100_withdrawal_documents_by_status_and_transaction_indices: 0, + }, + transaction: DriveIdentityWithdrawalTransactionMethodVersions { + index: DriveIdentityWithdrawalTransactionIndexMethodVersions { + fetch_next_withdrawal_transaction_index: 0, + add_update_next_withdrawal_transaction_index_operation: 0, + }, + queue: DriveIdentityWithdrawalTransactionQueueMethodVersions { + add_enqueue_untied_withdrawal_transaction_operations: 0, + dequeue_untied_withdrawal_transactions: 0, + }, + }, + }, }, platform_system: DrivePlatformSystemMethodVersions { protocol_version: DriveSystemProtocolVersionMethodVersions { @@ -521,21 +541,19 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { find_oldest_epoch_needing_payment: 0, fetch_reward_shares_list_for_masternode: 0, }, - identity_credit_withdrawal: DriveAbciIdentityCreditWithdrawalMethodVersions { - build_withdrawal_transactions_from_documents: 0, - fetch_and_prepare_unsigned_withdrawal_transactions: 0, + withdrawals: DriveAbciIdentityCreditWithdrawalMethodVersions { + build_untied_withdrawal_transactions_from_documents: 0, + dequeue_and_build_unsigned_withdrawal_transactions: 0, fetch_transactions_block_inclusion_status: 0, pool_withdrawals_into_transactions_queue: 0, - update_broadcasted_withdrawal_transaction_statuses: 0, + update_broadcasted_withdrawal_statuses: 0, + append_signatures_and_broadcast_withdrawal_transactions: 0, }, state_transition_processing: DriveAbciStateTransitionProcessingMethodVersions { execute_event: 0, process_raw_state_transitions: 0, validate_fees_of_event: 0, }, - withdrawals: DriveAbciWithdrawalsMethodVersions { - check_withdrawals: 0, - }, epoch: DriveAbciEpochMethodVersions { gather_epoch_info: 0, get_genesis_time: 0, diff --git a/packages/rs-platform-version/src/version/v1.rs b/packages/rs-platform-version/src/version/v1.rs index 758332ee62..ca2ba27170 100644 --- a/packages/rs-platform-version/src/version/v1.rs +++ b/packages/rs-platform-version/src/version/v1.rs @@ -27,7 +27,7 @@ use crate::version::drive_abci_versions::{ DriveAbciStateTransitionProcessingMethodVersions, DriveAbciStateTransitionValidationVersion, DriveAbciStateTransitionValidationVersions, DriveAbciStructureVersions, DriveAbciValidationDataTriggerAndBindingVersions, DriveAbciValidationDataTriggerVersions, - DriveAbciValidationVersions, DriveAbciVersion, DriveAbciWithdrawalsMethodVersions, + DriveAbciValidationVersions, DriveAbciVersion, }; use crate::version::drive_versions::{ DriveAssetLockMethodVersions, DriveBalancesMethodVersions, DriveBatchOperationsMethodVersion, @@ -52,14 +52,18 @@ use crate::version::drive_versions::{ DriveIdentityKeysInsertMethodVersions, DriveIdentityKeysMethodVersions, DriveIdentityKeysProveMethodVersions, DriveIdentityMethodVersions, DriveIdentityProveMethodVersions, DriveIdentityUpdateMethodVersions, - DriveInitializationMethodVersions, DriveMethodVersions, DriveOperationsMethodVersion, - DrivePlatformStateMethodVersions, DrivePlatformSystemMethodVersions, - DriveProtocolUpgradeVersions, DriveProveMethodVersions, DriveStateTransitionMethodVersions, - DriveStateTransitionOperationMethodVersions, DriveStructureVersion, - DriveSystemEstimationCostsMethodVersions, DriveSystemProtocolVersionMethodVersions, - DriveVerifyContractMethodVersions, DriveVerifyDocumentMethodVersions, - DriveVerifyIdentityMethodVersions, DriveVerifyMethodVersions, - DriveVerifySingleDocumentMethodVersions, DriveVerifySystemMethodVersions, DriveVersion, + DriveIdentityWithdrawalDocumentMethodVersions, DriveIdentityWithdrawalMethodVersions, + DriveIdentityWithdrawalTransactionIndexMethodVersions, + DriveIdentityWithdrawalTransactionMethodVersions, + DriveIdentityWithdrawalTransactionQueueMethodVersions, DriveInitializationMethodVersions, + DriveMethodVersions, DriveOperationsMethodVersion, DrivePlatformStateMethodVersions, + DrivePlatformSystemMethodVersions, DriveProtocolUpgradeVersions, DriveProveMethodVersions, + DriveStateTransitionMethodVersions, DriveStateTransitionOperationMethodVersions, + DriveStructureVersion, DriveSystemEstimationCostsMethodVersions, + DriveSystemProtocolVersionMethodVersions, DriveVerifyContractMethodVersions, + DriveVerifyDocumentMethodVersions, DriveVerifyIdentityMethodVersions, + DriveVerifyMethodVersions, DriveVerifySingleDocumentMethodVersions, + DriveVerifySystemMethodVersions, DriveVersion, }; use crate::version::protocol_version::{FeatureVersionBounds, PlatformVersion}; use crate::version::{AbciStructureVersion, PlatformArchitectureVersion}; @@ -358,6 +362,22 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { for_root_key_reference_tree: 0, for_update_revision: 0, }, + withdrawals: DriveIdentityWithdrawalMethodVersions { + document: DriveIdentityWithdrawalDocumentMethodVersions { + fetch_oldest_withdrawal_documents_by_status: 0, + find_up_to_100_withdrawal_documents_by_status_and_transaction_indices: 0, + }, + transaction: DriveIdentityWithdrawalTransactionMethodVersions { + index: DriveIdentityWithdrawalTransactionIndexMethodVersions { + fetch_next_withdrawal_transaction_index: 0, + add_update_next_withdrawal_transaction_index_operation: 0, + }, + queue: DriveIdentityWithdrawalTransactionQueueMethodVersions { + add_enqueue_untied_withdrawal_transaction_operations: 0, + dequeue_untied_withdrawal_transactions: 0, + }, + }, + }, }, platform_system: DrivePlatformSystemMethodVersions { protocol_version: DriveSystemProtocolVersionMethodVersions { @@ -518,21 +538,19 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { find_oldest_epoch_needing_payment: 0, fetch_reward_shares_list_for_masternode: 0, }, - identity_credit_withdrawal: DriveAbciIdentityCreditWithdrawalMethodVersions { - build_withdrawal_transactions_from_documents: 0, - fetch_and_prepare_unsigned_withdrawal_transactions: 0, + withdrawals: DriveAbciIdentityCreditWithdrawalMethodVersions { + build_untied_withdrawal_transactions_from_documents: 0, + dequeue_and_build_unsigned_withdrawal_transactions: 0, fetch_transactions_block_inclusion_status: 0, pool_withdrawals_into_transactions_queue: 0, - update_broadcasted_withdrawal_transaction_statuses: 0, + update_broadcasted_withdrawal_statuses: 0, + append_signatures_and_broadcast_withdrawal_transactions: 0, }, state_transition_processing: DriveAbciStateTransitionProcessingMethodVersions { execute_event: 0, process_raw_state_transitions: 0, validate_fees_of_event: 0, }, - withdrawals: DriveAbciWithdrawalsMethodVersions { - check_withdrawals: 0, - }, epoch: DriveAbciEpochMethodVersions { gather_epoch_info: 0, get_genesis_time: 0, diff --git a/packages/rs-sdk/Cargo.toml b/packages/rs-sdk/Cargo.toml index 0712383f30..401889f592 100644 --- a/packages/rs-sdk/Cargo.toml +++ b/packages/rs-sdk/Cargo.toml @@ -33,7 +33,7 @@ envy = { version = "0.4.2", optional = true } futures = { version = "0.3.28" } derive_more = { version = "0.99.16" } # dashcore-rpc is only needed for core rpc; TODO remove once we have correct core rpc impl -dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", branch = "master" } +dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.2" } [dev-dependencies] rs-dapi-client = { path = "../rs-dapi-client", features = ["mocks"] } diff --git a/packages/simple-signer/Cargo.toml b/packages/simple-signer/Cargo.toml index 66abcd42f9..d1828c744f 100644 --- a/packages/simple-signer/Cargo.toml +++ b/packages/simple-signer/Cargo.toml @@ -9,5 +9,5 @@ rust-version = "1.73" [dependencies] anyhow = { version = "1.0.70" } bincode = { version = "2.0.0-rc.3", features = ["serde"] } -dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", branch = "master" } +dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.2" } dpp = { path = "../rs-dpp", features = ["abci"] } diff --git a/packages/strategy-tests/src/transitions.rs b/packages/strategy-tests/src/transitions.rs index 3c783e2fd1..db7821ff0b 100644 --- a/packages/strategy-tests/src/transitions.rs +++ b/packages/strategy-tests/src/transitions.rs @@ -21,7 +21,9 @@ use dpp::state_transition::identity_create_transition::methods::IdentityCreateTr use dpp::state_transition::identity_create_transition::IdentityCreateTransition; use dpp::state_transition::identity_credit_transfer_transition::v0::IdentityCreditTransferTransitionV0; -use dpp::state_transition::identity_credit_withdrawal_transition::v0::IdentityCreditWithdrawalTransitionV0; +use dpp::state_transition::identity_credit_withdrawal_transition::v0::{ + IdentityCreditWithdrawalTransitionV0, MIN_CORE_FEE_PER_BYTE, +}; use dpp::state_transition::identity_topup_transition::methods::IdentityTopUpTransitionMethodsV0; use dpp::state_transition::identity_topup_transition::IdentityTopUpTransition; @@ -459,7 +461,7 @@ pub fn create_identity_withdrawal_transition( let mut withdrawal: StateTransition = IdentityCreditWithdrawalTransitionV0 { identity_id: identity.id(), amount: 100000000, // 0.001 Dash - core_fee_per_byte: 1, + core_fee_per_byte: MIN_CORE_FEE_PER_BYTE, pooling: Pooling::Never, output_script: CoreScript::random_p2sh(rng), revision: identity.revision(), diff --git a/packages/wallet-lib/package.json b/packages/wallet-lib/package.json index 4795d04676..9823cd9294 100644 --- a/packages/wallet-lib/package.json +++ b/packages/wallet-lib/package.json @@ -46,7 +46,7 @@ "homepage": "https://github.com/dashevo/wallet-lib#readme", "dependencies": { "@dashevo/dapi-client": "workspace:*", - "@dashevo/dashcore-lib": "~0.21.0", + "@dashevo/dashcore-lib": "~0.21.1", "@dashevo/grpc-common": "workspace:*", "@dashevo/wasm-dpp": "workspace:*", "@yarnpkg/pnpify": "^4.0.0-rc.42", diff --git a/packages/wallet-lib/src/types/Storage/Storage.d.ts b/packages/wallet-lib/src/types/Storage/Storage.d.ts index 5889483300..7e10ad2aca 100644 --- a/packages/wallet-lib/src/types/Storage/Storage.d.ts +++ b/packages/wallet-lib/src/types/Storage/Storage.d.ts @@ -1,9 +1,12 @@ import { WalletStore } from '../WalletStore/WalletStore' +import {ChainStore} from "../ChainStore/ChainStore"; export declare class Storage { constructor(options?: Storage.Options); getWalletStore(walletId: string): WalletStore + getChainStore(network: string): ChainStore + getDefaultChainStore(): ChainStore } export declare namespace Storage { diff --git a/packages/wasm-dpp/lib/test/fixtures/getIdentityCreditWithdrawalTransitionFixture.js b/packages/wasm-dpp/lib/test/fixtures/getIdentityCreditWithdrawalTransitionFixture.js new file mode 100644 index 0000000000..97c73146bb --- /dev/null +++ b/packages/wasm-dpp/lib/test/fixtures/getIdentityCreditWithdrawalTransitionFixture.js @@ -0,0 +1,20 @@ +const { Script, PrivateKey } = require('@dashevo/dashcore-lib'); +const { IdentityCreditWithdrawalTransition } = require('../../..'); +const generateRandomIdentifier = require('../utils/generateRandomIdentifier'); + +module.exports = function getIdentityCreditWithdrawalTransitionFixture() { + const privateKey = new PrivateKey('cSBnVM4xvxarwGQuAfQFwqDg9k5tErHUHzgWsEfD4zdwUasvqRVY'); + const address = privateKey.toAddress(); + + const stateTransition = new IdentityCreditWithdrawalTransition(1); + stateTransition.setIdentityId(generateRandomIdentifier()); + // eslint-disable-next-line + stateTransition.setAmount(BigInt(1000)); + stateTransition.setCoreFeePerByte(1000); + stateTransition.setPooling(0); + stateTransition.setOutputScript(Script.buildPublicKeyHashOut(address).toBuffer()); + // eslint-disable-next-line + stateTransition.setRevision(BigInt(1)); + + return stateTransition; +}; diff --git a/packages/wasm-dpp/lib/test/utils/generateRandomIdentifier.js b/packages/wasm-dpp/lib/test/utils/generateRandomIdentifier.js new file mode 100644 index 0000000000..18f67540a5 --- /dev/null +++ b/packages/wasm-dpp/lib/test/utils/generateRandomIdentifier.js @@ -0,0 +1,13 @@ +const crypto = require('crypto'); +const { Identifier } = require('../../..'); + +/** + * Generate random identity ID + * + * @return {Identifier} + */ +function generateRandomIdentifier() { + return new Identifier(crypto.randomBytes(32)); +} + +module.exports = generateRandomIdentifier; diff --git a/packages/wasm-dpp/package.json b/packages/wasm-dpp/package.json index 7dd92cab9c..f3cadfde28 100644 --- a/packages/wasm-dpp/package.json +++ b/packages/wasm-dpp/package.json @@ -43,7 +43,7 @@ "@babel/cli": "^7.23.0", "@babel/core": "^7.23.3", "@babel/preset-env": "^7.23.3", - "@dashevo/dashcore-lib": "~0.21.0", + "@dashevo/dashcore-lib": "~0.21.1", "@dashevo/dpns-contract": "workspace:*", "@types/bs58": "^4.0.1", "@types/node": "^14.6.0", diff --git a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs index 4dde494106..1d958e7b95 100644 --- a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs @@ -53,6 +53,9 @@ use dpp::consensus::signature::SignatureError; // use dpp::consensus::state::data_trigger::data_trigger_error::DataTriggerError; use dpp::consensus::state::state_error::StateError; +use dpp::consensus::state::data_trigger::DataTriggerError::{ + DataTriggerConditionError, DataTriggerExecutionError, DataTriggerInvalidResultError, +}; use wasm_bindgen::{JsError, JsValue}; use crate::errors::consensus::basic::data_contract::{ @@ -73,9 +76,9 @@ use crate::errors::consensus::signature::{ BasicBLSErrorWasm, BasicECDSAErrorWasm, IdentityNotFoundErrorWasm, SignatureShouldNotBePresentErrorWasm, }; -// use crate::errors::consensus::state::data_contract::data_trigger::{ -// DataTriggerConditionErrorWasm, DataTriggerExecutionErrorWasm, -// }; +use crate::errors::consensus::state::data_contract::data_trigger::{ + DataTriggerConditionErrorWasm, DataTriggerExecutionErrorWasm, DataTriggerInvalidResultErrorWasm, +}; use crate::errors::consensus::state::data_contract::{ DataContractAlreadyPresentErrorWasm, DataContractConfigUpdateErrorWasm, DataContractIsReadonlyErrorWasm, @@ -183,20 +186,11 @@ pub fn from_state_error(state_error: &StateError) -> JsValue { StateError::MissingIdentityPublicKeyIdsError(e) => { MissingIdentityPublicKeyIdsErrorWasm::from(e).into() } - // TODO(versioning): restore - // StateError::DataTriggerError(data_trigger_error) => match data_trigger_error.deref() { - // DataTriggerError::DataTriggerConditionError(e) => { - // DataTriggerConditionErrorWasm::from(e).into() - // } - // DataTriggerError::DataTriggerExecutionError(e) => { - // DataTriggerExecutionErrorWasm::from(e).into() - // } - // DataTriggerError::DataTriggerInvalidResultError(e) => { - // DataTriggerInvalidResultErrorWasm::from(e).into() - // } - // }, - // TODO(versioning): restore - // StateError::DataTriggerActionError(_) => JsError::new("Data Trigger action error").into(), + StateError::DataTriggerError(data_trigger_error) => match data_trigger_error { + DataTriggerConditionError(e) => DataTriggerConditionErrorWasm::from(e).into(), + DataTriggerExecutionError(e) => DataTriggerExecutionErrorWasm::from(e).into(), + DataTriggerInvalidResultError(e) => DataTriggerInvalidResultErrorWasm::from(e).into(), + }, StateError::IdentityAlreadyExistsError(e) => { let wasm_error: IdentityAlreadyExistsErrorWasm = e.into(); wasm_error.into() diff --git a/packages/wasm-dpp/src/errors/consensus/state/data_contract/data_trigger/data_trigger_condition_error.rs b/packages/wasm-dpp/src/errors/consensus/state/data_contract/data_trigger/data_trigger_condition_error.rs index 626e126e79..d38e84fdb3 100644 --- a/packages/wasm-dpp/src/errors/consensus/state/data_contract/data_trigger/data_trigger_condition_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/state/data_contract/data_trigger/data_trigger_condition_error.rs @@ -4,7 +4,8 @@ use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::state::data_trigger::data_trigger_condition_error::DataTriggerConditionError; use dpp::consensus::ConsensusError; use dpp::identifier::Identifier; -use dpp::serialization::PlatformSerializable; +use dpp::serialization::PlatformSerializableWithPlatformVersion; +use dpp::version::PlatformVersion; use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=DataTriggerConditionError)] @@ -48,7 +49,7 @@ impl DataTriggerConditionErrorWasm { #[wasm_bindgen(js_name=serialize)] pub fn serialize(&self) -> Result { let bytes = ConsensusError::from(self.inner.clone()) - .serialize_to_bytes() + .serialize_to_bytes_with_platform_version(PlatformVersion::first()) .map_err(JsError::from)?; Ok(Buffer::from_bytes(bytes.as_slice())) diff --git a/packages/wasm-dpp/src/errors/consensus/state/data_contract/data_trigger/data_trigger_execution_error.rs b/packages/wasm-dpp/src/errors/consensus/state/data_contract/data_trigger/data_trigger_execution_error.rs index f3ff1b4b76..b4a928db3c 100644 --- a/packages/wasm-dpp/src/errors/consensus/state/data_contract/data_trigger/data_trigger_execution_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/state/data_contract/data_trigger/data_trigger_execution_error.rs @@ -3,7 +3,8 @@ use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::state::data_trigger::data_trigger_execution_error::DataTriggerExecutionError; use dpp::consensus::ConsensusError; use dpp::identifier::Identifier; -use dpp::serialization::PlatformSerializable; +use dpp::serialization::PlatformSerializableWithPlatformVersion; +use dpp::version::PlatformVersion; use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=DataTriggerExecutionError)] @@ -47,7 +48,7 @@ impl DataTriggerExecutionErrorWasm { #[wasm_bindgen(js_name=serialize)] pub fn serialize(&self) -> Result { let bytes = ConsensusError::from(self.inner.clone()) - .serialize_to_bytes() + .serialize_to_bytes_with_platform_version(PlatformVersion::first()) .map_err(JsError::from)?; Ok(Buffer::from_bytes(bytes.as_slice())) diff --git a/packages/wasm-dpp/src/errors/consensus/state/data_contract/data_trigger/data_trigger_invalid_result_error.rs b/packages/wasm-dpp/src/errors/consensus/state/data_contract/data_trigger/data_trigger_invalid_result_error.rs index 909c57b637..ea7dc0d5e7 100644 --- a/packages/wasm-dpp/src/errors/consensus/state/data_contract/data_trigger/data_trigger_invalid_result_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/state/data_contract/data_trigger/data_trigger_invalid_result_error.rs @@ -4,7 +4,8 @@ use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::state::data_trigger::data_trigger_invalid_result_error::DataTriggerInvalidResultError; use dpp::consensus::ConsensusError; use dpp::identifier::Identifier; -use dpp::serialization::PlatformSerializable; +use dpp::serialization::PlatformSerializableWithPlatformVersion; +use dpp::version::PlatformVersion; use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=DataTriggerInvalidResultError)] @@ -43,7 +44,7 @@ impl DataTriggerInvalidResultErrorWasm { #[wasm_bindgen(js_name=serialize)] pub fn serialize(&self) -> Result { let bytes = ConsensusError::from(self.inner.clone()) - .serialize_to_bytes() + .serialize_to_bytes_with_platform_version(PlatformVersion::first()) .map_err(JsError::from)?; Ok(Buffer::from_bytes(bytes.as_slice())) diff --git a/packages/wasm-dpp/src/errors/consensus/state/data_contract/mod.rs b/packages/wasm-dpp/src/errors/consensus/state/data_contract/mod.rs index 78ef7460ac..ac3a318055 100644 --- a/packages/wasm-dpp/src/errors/consensus/state/data_contract/mod.rs +++ b/packages/wasm-dpp/src/errors/consensus/state/data_contract/mod.rs @@ -2,8 +2,7 @@ mod data_contract_already_present_error; mod data_contract_config_update_error; mod data_contract_is_readonly_error; -// TODO(versioning): remove -// pub mod data_trigger; +pub mod data_trigger; pub use data_contract_already_present_error::*; pub use data_contract_config_update_error::*; diff --git a/packages/wasm-dpp/src/identity/identity_facade.rs b/packages/wasm-dpp/src/identity/identity_facade.rs index 0ab0e8cb51..752d0640de 100644 --- a/packages/wasm-dpp/src/identity/identity_facade.rs +++ b/packages/wasm-dpp/src/identity/identity_facade.rs @@ -12,7 +12,8 @@ use crate::identity::errors::InvalidIdentityError; use crate::identity::state_transition::{ create_asset_lock_proof_from_wasm_instance, ChainAssetLockProofWasm, IdentityCreateTransitionWasm, IdentityCreditTransferTransitionWasm, - IdentityTopUpTransitionWasm, IdentityUpdateTransitionWasm, InstantAssetLockProofWasm, + IdentityCreditWithdrawalTransitionWasm, IdentityTopUpTransitionWasm, + IdentityUpdateTransitionWasm, InstantAssetLockProofWasm, }; use crate::utils::Inner; @@ -22,6 +23,9 @@ use crate::with_js_error; use dpp::dashcore::{consensus, InstantLock, Transaction}; use crate::identity::IdentityWasm; +use dpp::identity::core_script::CoreScript; +use dpp::prelude::Revision; +use dpp::withdrawal::Pooling; use dpp::NonConsensusError; use serde::Deserialize; @@ -195,6 +199,36 @@ impl IdentityFacadeWasm { .with_js_error() } + #[wasm_bindgen(js_name=createIdentityCreditWithdrawalTransition)] + pub fn create_identity_credit_withdrawal_transition( + &self, + identity_id: &IdentifierWrapper, + amount: u64, + core_fee_per_byte: u32, + pooling: u8, + output_script: Vec, + revision: u64, + ) -> Result { + let pooling = match pooling { + 0 => Pooling::Never, + 1 => Pooling::IfAvailable, + 2 => Pooling::Standard, + _ => return Err(JsError::new("Invalid pooling value").into()), + }; + + self.0 + .create_identity_credit_withdrawal_transition( + identity_id.to_owned().into(), + amount, + core_fee_per_byte, + pooling, + CoreScript::from_bytes(output_script), + revision as Revision, + ) + .map(Into::into) + .with_js_error() + } + #[wasm_bindgen(js_name=createIdentityCreditTransferTransition)] pub fn create_identity_credit_transfer_transition( &self, diff --git a/packages/wasm-dpp/src/identity/identity_factory.rs b/packages/wasm-dpp/src/identity/identity_factory.rs index ee46f17562..384cd38226 100644 --- a/packages/wasm-dpp/src/identity/identity_factory.rs +++ b/packages/wasm-dpp/src/identity/identity_factory.rs @@ -4,9 +4,11 @@ use crate::identifier::IdentifierWrapper; use crate::identity::errors::InvalidIdentityError; use crate::identity::identity::IdentityWasm; -use crate::identity::state_transition::ChainAssetLockProofWasm; use crate::identity::state_transition::IdentityCreditTransferTransitionWasm; use crate::identity::state_transition::InstantAssetLockProofWasm; +use crate::identity::state_transition::{ + ChainAssetLockProofWasm, IdentityCreditWithdrawalTransitionWasm, +}; use crate::{ identity::state_transition::create_asset_lock_proof_from_wasm_instance, @@ -16,7 +18,7 @@ use crate::{ }; use dpp::dashcore::{consensus, InstantLock, Transaction}; -use dpp::prelude::Identity; +use dpp::prelude::{Identity, Revision}; use serde::Deserialize; use std::convert::TryInto; @@ -24,8 +26,10 @@ use std::convert::TryInto; use crate::utils::{Inner, WithJsError}; use dpp::identity::identity_factory::IdentityFactory; +use dpp::identity::core_script::CoreScript; +use dpp::withdrawal::Pooling; use wasm_bindgen::prelude::wasm_bindgen; -use wasm_bindgen::JsValue; +use wasm_bindgen::{JsError, JsValue}; #[wasm_bindgen(js_name=IdentityFactory)] pub struct IdentityFactoryWasm(IdentityFactory); @@ -197,6 +201,36 @@ impl IdentityFactoryWasm { .with_js_error() } + #[wasm_bindgen(js_name=createIdentityCreditWithdrawalTransition)] + pub fn create_identity_credit_withdrawal_transition( + &self, + identity_id: &IdentifierWrapper, + amount: u64, + core_fee_per_byte: u32, + pooling: u8, + output_script: Vec, + revision: u64, + ) -> Result { + let pooling = match pooling { + 0 => Pooling::Never, + 1 => Pooling::IfAvailable, + 2 => Pooling::Standard, + _ => return Err(JsError::new("Invalid pooling value").into()), + }; + + self.0 + .create_identity_credit_withdrawal_transition( + identity_id.to_owned().into(), + amount, + core_fee_per_byte, + pooling, + CoreScript::from_bytes(output_script), + revision as Revision, + ) + .map(Into::into) + .with_js_error() + } + #[wasm_bindgen(js_name=createIdentityUpdateTransition)] pub fn create_identity_update_transition( &self, diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/mod.rs b/packages/wasm-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/mod.rs new file mode 100644 index 0000000000..ea05af1cf5 --- /dev/null +++ b/packages/wasm-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/mod.rs @@ -0,0 +1,3 @@ +pub use transition::*; +mod to_object; +pub mod transition; diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/to_object.rs b/packages/wasm-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/to_object.rs new file mode 100644 index 0000000000..b94fd8a8d2 --- /dev/null +++ b/packages/wasm-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/to_object.rs @@ -0,0 +1,58 @@ +use dpp::identity::KeyID; + +use dpp::identity::core_script::CoreScript; +use dpp::prelude::Revision; +use dpp::state_transition::identity_credit_withdrawal_transition::accessors::IdentityCreditWithdrawalTransitionAccessorsV0; +use dpp::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition; +use dpp::state_transition::StateTransitionIdentitySigned; +use dpp::withdrawal::Pooling; +use dpp::{identifier::Identifier, state_transition::StateTransitionLike}; +use serde::Deserialize; +use std::default::Default; + +#[derive(Deserialize, Default)] +#[serde(rename_all = "camelCase")] +pub struct ToObjectOptions { + pub skip_signature: Option, +} + +#[derive(Default)] +pub struct ToObject { + pub transition_type: u8, + pub identity_id: Identifier, + pub amount: u64, + pub core_fee_per_byte: u32, + pub pooling: Pooling, + pub output_script: CoreScript, + pub revision: Revision, + pub signature: Option>, + pub signature_public_key_id: Option, +} + +pub fn to_object_struct( + transition: &IdentityCreditWithdrawalTransition, + options: ToObjectOptions, +) -> ToObject { + let mut to_object = ToObject { + transition_type: transition.state_transition_type() as u8, + identity_id: transition.identity_id(), + amount: transition.amount(), + core_fee_per_byte: transition.core_fee_per_byte(), + pooling: transition.pooling(), + output_script: transition.output_script(), + revision: transition.revision(), + ..ToObject::default() + }; + + if !options.skip_signature.unwrap_or(false) { + let signature = Some(transition.signature().to_vec()); + if let Some(signature) = &signature { + if !signature.is_empty() { + to_object.signature_public_key_id = Some(transition.signature_public_key_id()) + } + } + to_object.signature = signature; + } + + to_object +} diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/transition.rs b/packages/wasm-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/transition.rs new file mode 100644 index 0000000000..b823f39cda --- /dev/null +++ b/packages/wasm-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/transition.rs @@ -0,0 +1,418 @@ +use crate::utils::WithJsError; +use std::convert::TryInto; +use std::default::Default; + +use dpp::version::PlatformVersion; +use wasm_bindgen::prelude::*; + +use crate::bls_adapter::{BlsAdapter, JsBlsAdapter}; +use crate::errors::from_dpp_err; +use crate::identifier::IdentifierWrapper; +use crate::identity::IdentityPublicKeyWasm; +use crate::{buffer::Buffer, with_js_error}; +use dpp::identifier::Identifier; +use dpp::identity::core_script::CoreScript; +use dpp::identity::KeyType; +use dpp::platform_value; +use dpp::platform_value::string_encoding::Encoding; +use dpp::platform_value::{string_encoding, BinaryData}; +use dpp::serialization::{PlatformSerializable, ValueConvertible}; +use dpp::state_transition::identity_credit_withdrawal_transition::accessors::IdentityCreditWithdrawalTransitionAccessorsV0; +use dpp::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition; +use dpp::state_transition::StateTransitionLike; +use dpp::state_transition::{StateTransition, StateTransitionIdentitySigned}; +use dpp::withdrawal::Pooling; + +#[wasm_bindgen(js_name=IdentityCreditWithdrawalTransition)] +#[derive(Clone)] +pub struct IdentityCreditWithdrawalTransitionWasm(IdentityCreditWithdrawalTransition); + +impl From for IdentityCreditWithdrawalTransitionWasm { + fn from(v: IdentityCreditWithdrawalTransition) -> Self { + IdentityCreditWithdrawalTransitionWasm(v) + } +} + +impl From for IdentityCreditWithdrawalTransition { + fn from(v: IdentityCreditWithdrawalTransitionWasm) -> Self { + v.0 + } +} + +#[wasm_bindgen(js_class = IdentityCreditWithdrawalTransition)] +impl IdentityCreditWithdrawalTransitionWasm { + #[wasm_bindgen(constructor)] + pub fn new(platform_version: u32) -> Result { + let platform_version = + &PlatformVersion::get(platform_version).map_err(|e| JsValue::from(e.to_string()))?; + + IdentityCreditWithdrawalTransition::default_versioned(&platform_version) + .map(Into::into) + .map_err(from_dpp_err) + } + + #[wasm_bindgen(js_name=getType)] + pub fn get_type(&self) -> u8 { + self.0.state_transition_type() as u8 + } + + #[wasm_bindgen(getter, js_name=identityId)] + pub fn identity_id(&self) -> IdentifierWrapper { + self.get_identity_id() + } + + #[wasm_bindgen(getter, js_name=amount)] + pub fn amount(&self) -> u64 { + self.0.amount() + } + + #[wasm_bindgen(js_name=getIdentityId)] + pub fn get_identity_id(&self) -> IdentifierWrapper { + self.0.identity_id().into() + } + + #[wasm_bindgen(js_name=setIdentityId)] + pub fn set_identity_id(&mut self, identity_id: &IdentifierWrapper) { + self.0.set_identity_id(identity_id.into()); + } + + #[wasm_bindgen(js_name=getAmount)] + pub fn get_amount(&self) -> u64 { + self.0.amount() as u64 + } + + #[wasm_bindgen(js_name=setAmount)] + pub fn set_amount(&mut self, amount: u64) { + self.0.set_amount(amount); + } + + #[wasm_bindgen(js_name=getCoreFeePerByte)] + pub fn get_core_fee_per_byte(&self) -> u32 { + self.0.core_fee_per_byte() as u32 + } + + #[wasm_bindgen(js_name=setCoreFeePerByte)] + pub fn set_core_fee_per_byte(&mut self, core_fee_per_byte: u32) { + self.0.set_core_fee_per_byte(core_fee_per_byte as u32); + } + + #[wasm_bindgen(js_name=getPooling)] + pub fn get_pooling(&self) -> u8 { + self.0.pooling() as u8 + } + + #[wasm_bindgen(js_name=setPooling)] + pub fn set_pooling(&mut self, pooling: u8) -> Result<(), JsError> { + match pooling { + 0 => self.0.set_pooling(Pooling::Never), + 1 => self.0.set_pooling(Pooling::IfAvailable), + 2 => self.0.set_pooling(Pooling::Standard), + _ => return Err(JsError::new("Invalid pooling value")), + } + + Ok(()) + } + + #[wasm_bindgen(js_name=getOutputScript)] + pub fn get_output_script(&self) -> Buffer { + Buffer::from_bytes(self.0.output_script().as_bytes()) + } + + #[wasm_bindgen(js_name=setOutputScript)] + pub fn set_output_script(&mut self, output_script: Vec) { + self.0 + .set_output_script(CoreScript::from_bytes(output_script)); + } + + #[wasm_bindgen(js_name=getRevision)] + pub fn get_revision(&self) -> u64 { + self.0.revision() as u64 + } + + #[wasm_bindgen(js_name=setRevision)] + pub fn set_revision(&mut self, revision: u64) { + self.0.set_revision(revision); + } + + #[wasm_bindgen(js_name=toObject)] + pub fn to_object(&self, options: JsValue) -> Result { + let opts: super::to_object::ToObjectOptions = if options.is_object() { + with_js_error!(serde_wasm_bindgen::from_value(options))? + } else { + Default::default() + }; + + let object = super::to_object::to_object_struct(&self.0, opts); + let js_object = js_sys::Object::new(); + + js_sys::Reflect::set( + &js_object, + &"type".to_owned().into(), + &object.transition_type.into(), + )?; + + let version = match self.0 { + IdentityCreditWithdrawalTransition::V0(_) => "0", + }; + + js_sys::Reflect::set(&js_object, &"$version".to_owned().into(), &version.into())?; + + if let Some(signature) = object.signature { + let signature_value: JsValue = if signature.is_empty() { + JsValue::undefined() + } else { + Buffer::from_bytes(signature.as_slice()).into() + }; + + js_sys::Reflect::set(&js_object, &"signature".to_owned().into(), &signature_value)?; + + if let Some(signature_public_key_id) = object.signature_public_key_id { + js_sys::Reflect::set( + &js_object, + &"signaturePublicKeyId".to_owned().into(), + &JsValue::from(signature_public_key_id), + )?; + } else { + js_sys::Reflect::set( + &js_object, + &"signaturePublicKeyId".to_owned().into(), + &JsValue::undefined(), + )?; + } + } + + js_sys::Reflect::set( + &js_object, + &"identityId".to_owned().into(), + &Buffer::from_bytes(object.identity_id.to_buffer().as_slice()), + )?; + + js_sys::Reflect::set( + &js_object, + &"amount".to_owned().into(), + &JsValue::from(object.amount), + )?; + + js_sys::Reflect::set( + &js_object, + &"coreFeePerByte".to_owned().into(), + &JsValue::from_f64(object.core_fee_per_byte as f64), + )?; + + js_sys::Reflect::set( + &js_object, + &"pooling".to_owned().into(), + &JsValue::from_f64((object.pooling as u8) as f64), + )?; + + let output_script = Buffer::from_bytes(object.output_script.as_bytes()); + js_sys::Reflect::set( + &js_object, + &"outputScript".to_owned().into(), + &output_script.into(), + )?; + + js_sys::Reflect::set( + &js_object, + &"revision".to_owned().into(), + &JsValue::from(object.revision), + )?; + + Ok(js_object.into()) + } + + #[wasm_bindgen(js_name=toBuffer)] + pub fn to_buffer(&self) -> Result { + let bytes = PlatformSerializable::serialize_to_bytes( + &StateTransition::IdentityCreditWithdrawal(self.0.clone()), + ) + .with_js_error()?; + Ok(Buffer::from_bytes(&bytes)) + } + + #[wasm_bindgen(js_name=toJSON)] + pub fn to_json(&self) -> Result { + let object = super::to_object::to_object_struct(&self.0, Default::default()); + let js_object = js_sys::Object::new(); + + js_sys::Reflect::set( + &js_object, + &"type".to_owned().into(), + &object.transition_type.into(), + )?; + + let version = match self.0 { + IdentityCreditWithdrawalTransition::V0(_) => "0", + }; + + js_sys::Reflect::set(&js_object, &"$version".to_owned().into(), &version.into())?; + + if let Some(signature) = object.signature { + let signature_value: JsValue = if signature.is_empty() { + JsValue::undefined() + } else { + string_encoding::encode(signature.as_slice(), Encoding::Base64).into() + }; + + js_sys::Reflect::set(&js_object, &"signature".to_owned().into(), &signature_value)?; + + if let Some(signature_public_key_id) = object.signature_public_key_id { + js_sys::Reflect::set( + &js_object, + &"signaturePublicKeyId".to_owned().into(), + &signature_public_key_id.into(), + )?; + } else { + js_sys::Reflect::set( + &js_object, + &"signaturePublicKeyId".to_owned().into(), + &JsValue::undefined(), + )?; + } + } + + let identity_id = object.identity_id.to_string(Encoding::Base58); + + js_sys::Reflect::set( + &js_object, + &"identityId".to_owned().into(), + &identity_id.into(), + )?; + + js_sys::Reflect::set( + &js_object, + &"amount".to_owned().into(), + &JsValue::from(&format!("{}", object.amount)), + )?; + + js_sys::Reflect::set( + &js_object, + &"coreFeePerByte".to_owned().into(), + &JsValue::from_f64(object.core_fee_per_byte as f64), + )?; + + js_sys::Reflect::set( + &js_object, + &"pooling".to_owned().into(), + &JsValue::from_f64((object.pooling as u8) as f64), + )?; + + let output_script = platform_value::string_encoding::encode( + object.output_script.as_bytes(), + Encoding::Base64, + ); + + js_sys::Reflect::set( + &js_object, + &"outputScript".to_owned().into(), + &output_script.into(), + )?; + + js_sys::Reflect::set( + &js_object, + &"revision".to_owned().into(), + &JsValue::from(&format!("{}", object.revision)), + )?; + + Ok(js_object.into()) + } + + #[wasm_bindgen(js_name=getModifiedDataIds)] + pub fn modified_data_ids(&self) -> Vec { + let ids = self.0.modified_data_ids(); + + ids.into_iter() + .map(|id| >::from(id).into()) + .collect() + } + + #[wasm_bindgen(js_name=isDataContractStateTransition)] + pub fn is_data_contract_state_transition(&self) -> bool { + self.0.is_data_contract_state_transition() + } + + #[wasm_bindgen(js_name=isDocumentStateTransition)] + pub fn is_document_state_transition(&self) -> bool { + self.0.is_document_state_transition() + } + + #[wasm_bindgen(js_name=isIdentityStateTransition)] + pub fn is_identity_state_transition(&self) -> bool { + self.0.is_identity_state_transition() + } + + #[wasm_bindgen(js_name=signByPrivateKey)] + pub fn sign_by_private_key( + &mut self, + private_key: Vec, + key_type: u8, + bls: Option, + ) -> Result<(), JsValue> { + let key_type = key_type + .try_into() + .map_err(|e: anyhow::Error| e.to_string())?; + + if bls.is_none() && key_type == KeyType::BLS12_381 { + return Err(JsError::new( + format!("BLS adapter is required for BLS key type '{}'", key_type).as_str(), + ) + .into()); + } + + let bls_adapter = if let Some(adapter) = bls { + BlsAdapter(adapter) + } else { + BlsAdapter(JsValue::undefined().into()) + }; + + // TODO: not the best approach because it involves cloning the transition + // Probably it worth to return `sign_by_private_key` per state transition + let mut wrapper = StateTransition::IdentityCreditWithdrawal(self.0.clone()); + wrapper + .sign_by_private_key(private_key.as_slice(), key_type, &bls_adapter) + .with_js_error()?; + + self.0.set_signature(wrapper.signature().to_owned()); + + Ok(()) + } + + #[wasm_bindgen(js_name=getSignature)] + pub fn get_signature(&self) -> Buffer { + Buffer::from_bytes(self.0.signature().as_slice()) + } + + #[wasm_bindgen(js_name=setSignature)] + pub fn set_signature(&mut self, signature: Option>) { + self.0 + .set_signature(BinaryData::new(signature.unwrap_or(vec![]))) + } + + #[wasm_bindgen] + pub fn sign( + &mut self, + identity_public_key: &IdentityPublicKeyWasm, + private_key: Vec, + bls: JsBlsAdapter, + ) -> Result<(), JsValue> { + let bls_adapter = BlsAdapter(bls); + + // TODO: come up with a better way to set signature to the binding. + let mut state_transition = StateTransition::IdentityCreditWithdrawal(self.0.clone()); + state_transition + .sign( + &identity_public_key.to_owned().into(), + &private_key, + &bls_adapter, + ) + .with_js_error()?; + + let signature = state_transition.signature().to_owned(); + let signature_public_key_id = state_transition.signature_public_key_id().unwrap_or(0); + + self.0.set_signature(signature); + self.0.set_signature_public_key_id(signature_public_key_id); + + Ok(()) + } +} diff --git a/packages/wasm-dpp/src/identity/state_transition/mod.rs b/packages/wasm-dpp/src/identity/state_transition/mod.rs index d724e9743c..27e8ae4113 100644 --- a/packages/wasm-dpp/src/identity/state_transition/mod.rs +++ b/packages/wasm-dpp/src/identity/state_transition/mod.rs @@ -1,6 +1,7 @@ pub use asset_lock_proof::*; pub use identity_create_transition::*; pub use identity_credit_transfer_transition::*; +pub use identity_credit_withdrawal_transition::*; pub use identity_topup_transition::*; pub use identity_update_transition::*; // pub use validate_public_key_signatures::*; @@ -8,6 +9,7 @@ pub use identity_update_transition::*; mod asset_lock_proof; mod identity_create_transition; mod identity_credit_transfer_transition; +mod identity_credit_withdrawal_transition; pub(crate) mod identity_public_key_transitions; mod identity_topup_transition; mod identity_update_transition; diff --git a/packages/wasm-dpp/src/state_transition/state_transition_factory.rs b/packages/wasm-dpp/src/state_transition/state_transition_factory.rs index 73abb16348..63d53bf4dd 100644 --- a/packages/wasm-dpp/src/state_transition/state_transition_factory.rs +++ b/packages/wasm-dpp/src/state_transition/state_transition_factory.rs @@ -3,7 +3,8 @@ use crate::document_batch_transition::DocumentsBatchTransitionWasm; use crate::errors::from_dpp_err; use crate::identity::state_transition::{ IdentityCreateTransitionWasm, IdentityCreditTransferTransitionWasm, - IdentityTopUpTransitionWasm, IdentityUpdateTransitionWasm, + IdentityCreditWithdrawalTransitionWasm, IdentityTopUpTransitionWasm, + IdentityUpdateTransitionWasm, }; use crate::state_transition::errors::invalid_state_transition_error::InvalidStateTransitionErrorWasm; use dpp::state_transition::errors::StateTransitionError; @@ -51,6 +52,9 @@ impl StateTransitionFactoryWasm { StateTransition::IdentityCreditTransfer(st) => { Ok(IdentityCreditTransferTransitionWasm::from(st).into()) } + StateTransition::IdentityCreditWithdrawal(st) => { + Ok(IdentityCreditWithdrawalTransitionWasm::from(st).into()) + } StateTransition::DocumentsBatch(st) => { Ok(DocumentsBatchTransitionWasm::from(st).into()) } diff --git a/packages/wasm-dpp/test/integration/identity/IdentityFacade.spec.js b/packages/wasm-dpp/test/integration/identity/IdentityFacade.spec.js index f3fa71fbbd..fb1db63134 100644 --- a/packages/wasm-dpp/test/integration/identity/IdentityFacade.spec.js +++ b/packages/wasm-dpp/test/integration/identity/IdentityFacade.spec.js @@ -5,10 +5,12 @@ const getInstantAssetLockProofFixture = require('../../../lib/test/fixtures/getI const getChainAssetLockProofFixture = require('../../../lib/test/fixtures/getChainAssetLockProofFixture'); const { + default: loadWasmDpp, Identity, InstantAssetLockProof, ChainAssetLockProof, IdentityUpdateTransition, IdentityCreateTransition, IdentityTopUpTransition, IdentityPublicKeyWithWitness, DashPlatformProtocol, ValidationResult, } = require('../../..'); +const getIdentityCreditWithdrawalTransitionFixture = require('../../../lib/test/fixtures/getIdentityCreditWithdrawalTransitionFixture'); describe('IdentityFacade', () => { let dpp; @@ -17,6 +19,8 @@ describe('IdentityFacade', () => { let instantAssetLockProof; let chainAssetLockProof; + before(loadWasmDpp); + beforeEach(async () => { dpp = new DashPlatformProtocol( { generate: () => crypto.randomBytes(32) }, @@ -189,4 +193,24 @@ describe('IdentityFacade', () => { expect(stateTransition.getPublicKeysDisabledAt()).to.equal(undefined); }); }); + + describe('createIdentityCreditWithdrawalTransition', () => { + it('should create IdentityCreditWithdrawalTransition', () => { + const stateTransitionFixture = getIdentityCreditWithdrawalTransitionFixture(); + const stateTransition = dpp.identity + .createIdentityCreditWithdrawalTransition( + stateTransitionFixture.getIdentityId(), + stateTransitionFixture.getAmount(), + stateTransitionFixture.getCoreFeePerByte(), + stateTransitionFixture.getPooling(), + stateTransitionFixture.getOutputScript(), + stateTransitionFixture.getRevision(), + ); + + expect(stateTransition.toObject()) + .to.deep.equal( + stateTransitionFixture.toObject(), + ); + }); + }); }); diff --git a/packages/wasm-dpp/test/unit/identity/IdentityFactory.spec.js b/packages/wasm-dpp/test/unit/identity/IdentityFactory.spec.js index 240088e441..cc431e205a 100644 --- a/packages/wasm-dpp/test/unit/identity/IdentityFactory.spec.js +++ b/packages/wasm-dpp/test/unit/identity/IdentityFactory.spec.js @@ -1,6 +1,8 @@ const getInstantAssetLockProofFixture = require('../../../lib/test/fixtures/getInstantAssetLockProofFixture'); const getIdentityFixture = require('../../../lib/test/fixtures/getIdentityFixture'); const getChainAssetLockProofFixture = require('../../../lib/test/fixtures/getChainAssetLockProofFixture'); +const getIdentityCreditWithdrawalTransitionFixture = require('../../../lib/test/fixtures/getIdentityCreditWithdrawalTransitionFixture'); + const { Identity, IdentityFactory, InstantAssetLockProof, ChainAssetLockProof, IdentityUpdateTransition, @@ -249,4 +251,24 @@ describe('IdentityFactory', () => { expect(stateTransition.getPublicKeysDisabledAt()).to.deep.equal(new Date()); }); }); + + describe('createIdentityCreditWithdrawalTransition', () => { + it('should create IdentityCreditWithdrawalTransition', () => { + const stateTransitionFixture = getIdentityCreditWithdrawalTransitionFixture(); + const stateTransition = factory + .createIdentityCreditWithdrawalTransition( + stateTransitionFixture.getIdentityId(), + stateTransitionFixture.getAmount(), + stateTransitionFixture.getCoreFeePerByte(), + stateTransitionFixture.getPooling(), + stateTransitionFixture.getOutputScript(), + stateTransitionFixture.getRevision(), + ); + + expect(stateTransition.toObject()) + .to.deep.equal( + stateTransitionFixture.toObject(), + ); + }); + }); }); diff --git a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreditWithdrawalTransition/IdentityCreditWithdrawalTransition.spec.js b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreditWithdrawalTransition/IdentityCreditWithdrawalTransition.spec.js new file mode 100644 index 0000000000..76e6a8d32f --- /dev/null +++ b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreditWithdrawalTransition/IdentityCreditWithdrawalTransition.spec.js @@ -0,0 +1,155 @@ +const getIdentityCreditWithdrawalTransitionFixture = require('../../../../../lib/test/fixtures/getIdentityCreditWithdrawalTransitionFixture'); + +const { + default: loadWasmDpp, + Identifier, StateTransitionTypes, +} = require('../../../../..'); + +describe('IdentityCreditWithdrawalTransition', () => { + let rawStateTransition; + let stateTransition; + + before(loadWasmDpp); + + beforeEach(async () => { + stateTransition = await getIdentityCreditWithdrawalTransitionFixture(); + rawStateTransition = stateTransition.toObject(); + }); + + describe('#getType', () => { + it('should return IDENTITY_CREDIT_WITHDRAWAL type', () => { + expect(stateTransition.getType()).to.equal(StateTransitionTypes.IdentityCreditWithdrawal); + }); + }); + + describe('#getIdentityId', () => { + it('should return identity id', () => { + expect(stateTransition.getIdentityId().toBuffer()).to.deep.equal( + rawStateTransition.identityId, + ); + }); + }); + + describe('#getAmount', () => { + it('should return amount', () => { + expect(stateTransition.getAmount()).to.be.equal( + rawStateTransition.amount, + ); + }); + }); + + describe('#getCoreFeePerByte', () => { + it('should return core fee per byte', () => { + expect(stateTransition.getCoreFeePerByte()).to.be.equal( + rawStateTransition.coreFeePerByte, + ); + }); + }); + + describe('#getPooling', () => { + it('should return pooling', () => { + expect(stateTransition.getPooling()).to.be.equal( + rawStateTransition.pooling, + ); + }); + }); + + describe('#getOutputScript', () => { + it('should return output script', () => { + expect(stateTransition.getOutputScript()).to.be.deep.equal( + rawStateTransition.outputScript, + ); + }); + }); + + describe('#getRevision', () => { + it('should return revision', () => { + expect(stateTransition.getRevision()).to.be.equal( + rawStateTransition.revision, + ); + }); + }); + + describe('#toObject', () => { + it('should return raw state transition', () => { + rawStateTransition = stateTransition.toObject(); + + expect(rawStateTransition).to.deep.equal({ + $version: '0', + type: StateTransitionTypes.IdentityCreditWithdrawal, + identityId: stateTransition.getIdentityId().toBuffer(), + amount: stateTransition.getAmount(), + coreFeePerByte: stateTransition.getCoreFeePerByte(), + pooling: stateTransition.getPooling(), + outputScript: stateTransition.getOutputScript(), + revision: stateTransition.getRevision(), + signature: undefined, + signaturePublicKeyId: undefined, + }); + }); + + it('should return raw state transition without signature', () => { + rawStateTransition = stateTransition.toObject({ skipSignature: true }); + + expect(rawStateTransition).to.deep.equal({ + $version: '0', + type: StateTransitionTypes.IdentityCreditWithdrawal, + identityId: stateTransition.getIdentityId().toBuffer(), + amount: stateTransition.getAmount(), + coreFeePerByte: stateTransition.getCoreFeePerByte(), + pooling: stateTransition.getPooling(), + outputScript: stateTransition.getOutputScript(), + revision: stateTransition.getRevision(), + }); + }); + }); + + describe('#toJSON', () => { + it('should return JSON representation of state transition', () => { + const jsonStateTransition = stateTransition.toJSON(); + + expect(jsonStateTransition).to.deep.equal({ + $version: '0', + type: StateTransitionTypes.IdentityCreditWithdrawal, + identityId: stateTransition.getIdentityId().toString(), + amount: stateTransition.getAmount().toString(), + coreFeePerByte: stateTransition.getCoreFeePerByte(), + pooling: stateTransition.getPooling(), + outputScript: stateTransition.getOutputScript().toString('base64'), + revision: stateTransition.getRevision().toString(), + signature: undefined, + signaturePublicKeyId: undefined, + }); + }); + }); + + describe('#getModifiedDataIds', () => { + it('should return ids of topped up identity', () => { + const result = stateTransition.getModifiedDataIds(); + + expect(result.length).to.be.equal(1); + const [identityId] = result; + + expect(identityId).to.be.an.instanceOf(Identifier); + expect(identityId.toBuffer()).to.be.deep.equal(rawStateTransition.identityId); + }); + }); + + describe('#isDataContractStateTransition', () => { + it('should return false', () => { + expect(stateTransition.isDataContractStateTransition()).to.be.false(); + }); + }); + + describe('#isDocumentStateTransition', () => { + it('should return false', () => { + expect(stateTransition.isDocumentStateTransition()).to.be.false(); + }); + }); + + describe('#isIdentityStateTransition', () => { + it('should return true', () => { + expect(stateTransition.isIdentityStateTransition()).to.be.true(); + }); + }); +}); diff --git a/packages/withdrawals-contract/schema/v1/withdrawals-documents.json b/packages/withdrawals-contract/schema/v1/withdrawals-documents.json index b51b2a8360..bff066ac4f 100644 --- a/packages/withdrawals-contract/schema/v1/withdrawals-documents.json +++ b/packages/withdrawals-contract/schema/v1/withdrawals-documents.json @@ -58,19 +58,17 @@ "status": "asc" }, { - "transactionId": "asc" + "transactionIndex": "asc" } ], "unique": false } ], "properties": { - "transactionId": { - "description": "Hash of asset unlock transaction. Populated with untied transaction hash on “pooled” stage and with signed transaction on “broadcasted” stage", - "type": "array", - "byteArray": true, - "minItems": 32, - "maxItems": 32, + "transactionIndex": { + "type": "integer", + "description": "Sequential index of asset unlock (withdrawal) transaction. Populated when a withdrawal pooled into withdrawal transaction", + "minimum": 1, "position": 0 }, "transactionSignHeight": { @@ -79,24 +77,18 @@ "minimum": 1, "position": 1 }, - "transactionIndex": { - "type": "integer", - "description": "Sequential index used to create withdrawal transaction", - "minimum": 1, - "position": 2 - }, "amount": { "type": "integer", "description": "The amount to be withdrawn", "minimum": 1000, - "position": 3 + "position": 2 }, "coreFeePerByte": { "type": "integer", "description": "This is the fee that you are willing to spend for this transaction in Duffs/Byte", "minimum": 1, "maximum": 4294967295, - "position": 4 + "position": 3 }, "pooling": { "type": "integer", @@ -106,14 +98,14 @@ 1, 2 ], - "position": 5 + "position": 4 }, "outputScript": { "type": "array", "byteArray": true, "minItems": 23, "maxItems": 25, - "position": 6 + "position": 5 }, "status": { "type": "integer", @@ -124,7 +116,8 @@ 3, 4 ], - "position": 7 + "description": "0 - Pending, 1 - Signed, 2 - Broadcasted, 3 - Complete, 4 - Expired", + "position": 6 } }, "additionalProperties": false, diff --git a/packages/withdrawals-contract/src/v1/mod.rs b/packages/withdrawals-contract/src/v1/mod.rs index df86928bb1..826ec9a40f 100644 --- a/packages/withdrawals-contract/src/v1/mod.rs +++ b/packages/withdrawals-contract/src/v1/mod.rs @@ -6,7 +6,6 @@ pub mod document_types { pub const NAME: &str = "withdrawal"; pub mod properties { - pub const TRANSACTION_ID: &str = "transactionId"; pub const TRANSACTION_SIGN_HEIGHT: &str = "transactionSignHeight"; pub const TRANSACTION_INDEX: &str = "transactionIndex"; pub const AMOUNT: &str = "amount"; diff --git a/packages/withdrawals-contract/test/unit/withdrawalsContract.spec.js b/packages/withdrawals-contract/test/unit/withdrawalsContract.spec.js index 7f1d638a0c..70e573318b 100644 --- a/packages/withdrawals-contract/test/unit/withdrawalsContract.spec.js +++ b/packages/withdrawals-contract/test/unit/withdrawalsContract.spec.js @@ -42,7 +42,6 @@ describe('Withdrawals contract', () => { beforeEach(() => { rawWithdrawalDocument = { - transactionId: Buffer.alloc(32, 1), transactionIndex: 42, amount: 1000, coreFeePerByte: 1, @@ -52,63 +51,6 @@ describe('Withdrawals contract', () => { }; }); - it('should have at least five properties', () => { - rawWithdrawalDocument = {}; - - const document = dpp.document.create(dataContract, identityId, 'withdrawal', rawWithdrawalDocument); - const validationResult = document.validate(dpp.protocolVersion); - const error = expectJsonSchemaError(validationResult, 5); - - expect(error.keyword).to.equal('required'); - expect(error.params.missingProperty).to.equal('amount'); - }); - - it('should not have additional properties', async () => { - rawWithdrawalDocument.someOtherProperty = 42; - - const document = dpp.document.create(dataContract, identityId, 'withdrawal', rawWithdrawalDocument); - const validationResult = document.validate(dpp.protocolVersion); - const error = expectJsonSchemaError(validationResult); - - expect(error.keyword).to.equal('additionalProperties'); - expect(error.params.additionalProperties).to.deep.equal(['someOtherProperty']); - }); - - describe('transactionId', () => { - it('should be byte array', () => { - rawWithdrawalDocument.transactionId = 1; - - const document = dpp.document.create(dataContract, identityId, 'withdrawal', rawWithdrawalDocument); - const validationResult = document.validate(dpp.protocolVersion); - const error = expectJsonSchemaError(validationResult); - - expect(error.keyword).to.equal('type'); - expect(error.params.type).to.equal('array'); - }); - - it('should be not less then 32 bytes long', () => { - rawWithdrawalDocument.transactionId = [0]; - - const document = dpp.document.create(dataContract, identityId, 'withdrawal', rawWithdrawalDocument); - const validationResult = document.validate(dpp.protocolVersion); - const error = expectJsonSchemaError(validationResult); - - expect(error.keyword).to.equal('minItems'); - expect(error.params.minItems).to.equal(32); - }); - - it('should be not more then 32 bytes long', () => { - rawWithdrawalDocument.transactionId = Buffer.alloc(33); - - const document = dpp.document.create(dataContract, identityId, 'withdrawal', rawWithdrawalDocument); - const validationResult = document.validate(dpp.protocolVersion); - const error = expectJsonSchemaError(validationResult); - - expect(error.keyword).to.equal('maxItems'); - expect(error.params.maxItems).to.equal(32); - }); - }); - describe('amount', () => { it('should be present', async () => { delete rawWithdrawalDocument.amount; diff --git a/yarn.lock b/yarn.lock index 3cc59e34fb..2b6846d32b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1592,7 +1592,7 @@ __metadata: version: 0.0.0-use.local resolution: "@dashevo/bench-suite@workspace:packages/bench-suite" dependencies: - "@dashevo/dashcore-lib": "npm:~0.21.0" + "@dashevo/dashcore-lib": "npm:~0.21.1" "@dashevo/dpns-contract": "workspace:*" "@dashevo/wallet-lib": "workspace:*" "@dashevo/wasm-dpp": "workspace:*" @@ -1625,7 +1625,7 @@ __metadata: "@babel/core": "npm:^7.23.3" "@dashevo/dapi-grpc": "workspace:*" "@dashevo/dash-spv": "workspace:*" - "@dashevo/dashcore-lib": "npm:~0.21.0" + "@dashevo/dashcore-lib": "npm:~0.21.1" "@dashevo/grpc-common": "workspace:*" "@dashevo/wasm-dpp": "workspace:*" assert-browserify: "npm:^2.0.0" @@ -1705,7 +1705,7 @@ __metadata: "@dashevo/bls": "npm:~1.2.9" "@dashevo/dapi-client": "workspace:*" "@dashevo/dapi-grpc": "workspace:*" - "@dashevo/dashcore-lib": "npm:~0.21.0" + "@dashevo/dashcore-lib": "npm:~0.21.1" "@dashevo/dashd-rpc": "npm:^18.2.0" "@dashevo/dp-services-ctl": "github:dashevo/js-dp-services-ctl#v0.19-dev" "@dashevo/grpc-common": "workspace:*" @@ -1754,7 +1754,7 @@ __metadata: dependencies: "@dashevo/dark-gravity-wave": "npm:^1.1.1" "@dashevo/dash-util": "npm:^2.0.3" - "@dashevo/dashcore-lib": "npm:~0.21.0" + "@dashevo/dashcore-lib": "npm:~0.21.1" chai: "npm:^4.3.10" eslint: "npm:^8.53.0" eslint-config-airbnb-base: "npm:^15.0.0" @@ -1778,9 +1778,9 @@ __metadata: languageName: node linkType: hard -"@dashevo/dashcore-lib@npm:~0.21.0": - version: 0.21.0 - resolution: "@dashevo/dashcore-lib@npm:0.21.0" +"@dashevo/dashcore-lib@npm:~0.21.1": + version: 0.21.1 + resolution: "@dashevo/dashcore-lib@npm:0.21.1" dependencies: "@dashevo/bls": "npm:~1.2.9" "@dashevo/x11-hash-js": "npm:^1.0.2" @@ -1794,7 +1794,7 @@ __metadata: ripemd160: "npm:^2.0.2" tsd: "npm:^0.28.1" unorm: "npm:^1.6.0" - checksum: fb4419623f0e98e9c32e8f567ad1eb7f8f68c9e89c1f0216362771bf08cbf5e7115ea3c6eea722f6992d4460de7c6c5b1abca5c1c1790a8f5a1987baef78cbbb + checksum: 68502e40788cba834e3ac2199998b2b47965d1b900a838899cab1085e20bd10c7c5595d9667416eaac7174859f18da718ab13a9846eb6e77cc2b234c991a6e7f languageName: node linkType: hard @@ -1934,13 +1934,14 @@ __metadata: resolution: "@dashevo/platform-test-suite@workspace:packages/platform-test-suite" dependencies: "@dashevo/dapi-client": "workspace:*" - "@dashevo/dashcore-lib": "npm:~0.21.0" + "@dashevo/dashcore-lib": "npm:~0.21.1" "@dashevo/dpns-contract": "workspace:*" "@dashevo/feature-flags-contract": "workspace:*" "@dashevo/grpc-common": "workspace:*" "@dashevo/masternode-reward-shares-contract": "workspace:*" "@dashevo/wallet-lib": "workspace:*" "@dashevo/wasm-dpp": "workspace:*" + "@dashevo/withdrawals-contract": "workspace:*" assert: "npm:^2.0.0" assert-browserify: "npm:^2.0.0" browserify-zlib: "npm:^0.2.0" @@ -2036,7 +2037,7 @@ __metadata: dependencies: "@dashevo/dapi-client": "workspace:*" "@dashevo/dash-spv": "workspace:*" - "@dashevo/dashcore-lib": "npm:~0.21.0" + "@dashevo/dashcore-lib": "npm:~0.21.1" "@dashevo/grpc-common": "workspace:*" "@dashevo/wasm-dpp": "workspace:*" "@yarnpkg/pnpify": "npm:^4.0.0-rc.42" @@ -2096,7 +2097,7 @@ __metadata: "@babel/core": "npm:^7.23.3" "@babel/preset-env": "npm:^7.23.3" "@dashevo/bls": "npm:~1.2.9" - "@dashevo/dashcore-lib": "npm:~0.21.0" + "@dashevo/dashcore-lib": "npm:~0.21.1" "@dashevo/dpns-contract": "workspace:*" "@types/bs58": "npm:^4.0.1" "@types/node": "npm:^14.6.0" @@ -6482,13 +6483,14 @@ __metadata: "@dashevo/bls": "npm:~1.2.9" "@dashevo/dapi-client": "workspace:*" "@dashevo/dapi-grpc": "workspace:*" - "@dashevo/dashcore-lib": "npm:~0.21.0" + "@dashevo/dashcore-lib": "npm:~0.21.1" "@dashevo/dashpay-contract": "workspace:*" "@dashevo/dpns-contract": "workspace:*" "@dashevo/grpc-common": "workspace:*" "@dashevo/masternode-reward-shares-contract": "workspace:*" "@dashevo/wallet-lib": "workspace:*" "@dashevo/wasm-dpp": "workspace:*" + "@dashevo/withdrawals-contract": "workspace:*" "@types/chai": "npm:^4.2.12" "@types/dirty-chai": "npm:^2.0.2" "@types/mocha": "npm:^8.0.3" @@ -6558,7 +6560,7 @@ __metadata: "@babel/eslint-parser": "npm:^7.23.3" "@dashevo/bls": "npm:~1.2.9" "@dashevo/dapi-client": "workspace:*" - "@dashevo/dashcore-lib": "npm:~0.21.0" + "@dashevo/dashcore-lib": "npm:~0.21.1" "@dashevo/dashd-rpc": "npm:^18.2.0" "@dashevo/dashpay-contract": "workspace:*" "@dashevo/docker-compose": "npm:^0.24.4" From bf8e7b4cec002ec010dc969317ed5b9c8f6af07a Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Wed, 7 Feb 2024 14:43:52 +0300 Subject: [PATCH 027/191] chore(release): update changelog and bump version to 1.0.0-dev.4 (#1688) --- CHANGELOG.md | 29 ++++++++++++ Cargo.lock | 46 +++++++++---------- package.json | 2 +- packages/bench-suite/package.json | 2 +- packages/dapi-grpc/Cargo.toml | 2 +- packages/dapi-grpc/package.json | 2 +- packages/dapi/package.json | 2 +- packages/dash-spv/package.json | 2 +- packages/dashmate/package.json | 2 +- packages/dashpay-contract/Cargo.toml | 2 +- packages/dashpay-contract/package.json | 2 +- packages/data-contracts/Cargo.toml | 2 +- packages/dpns-contract/Cargo.toml | 2 +- packages/dpns-contract/package.json | 2 +- packages/feature-flags-contract/Cargo.toml | 2 +- packages/feature-flags-contract/package.json | 2 +- packages/js-dapi-client/package.json | 2 +- packages/js-dash-sdk/package.json | 2 +- packages/js-grpc-common/package.json | 2 +- .../Cargo.toml | 2 +- .../package.json | 2 +- packages/platform-test-suite/package.json | 2 +- packages/rs-dapi-client/Cargo.toml | 2 +- packages/rs-dapi-grpc-macros/Cargo.toml | 2 +- packages/rs-dpp/Cargo.toml | 2 +- packages/rs-drive-abci/Cargo.toml | 2 +- packages/rs-drive-proof-verifier/Cargo.toml | 2 +- packages/rs-drive/Cargo.toml | 2 +- .../Cargo.toml | 2 +- packages/rs-platform-serialization/Cargo.toml | 2 +- .../rs-platform-value-convertible/Cargo.toml | 2 +- packages/rs-platform-value/Cargo.toml | 2 +- packages/rs-platform-version/Cargo.toml | 2 +- packages/rs-platform-versioning/Cargo.toml | 2 +- packages/rs-sdk/Cargo.toml | 2 +- packages/simple-signer/Cargo.toml | 2 +- packages/strategy-tests/Cargo.toml | 2 +- packages/wallet-lib/package.json | 2 +- packages/wasm-dpp/Cargo.toml | 2 +- packages/wasm-dpp/package.json | 2 +- packages/withdrawals-contract/Cargo.toml | 2 +- packages/withdrawals-contract/package.json | 2 +- 42 files changed, 92 insertions(+), 63 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 35c0b7ef0f..e478496b54 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,32 @@ +## [1.0.0-dev.4](https://github.com/dashpay/platform/compare/v1.0.0-dev.3...v1.0.0-dev.4) (2024-02-07) + + +### ⚠ BREAKING CHANGES + +* The state now contains information about chain lock quorums (#1621) +* Minimal asset lock amount is introduced that makes previous data invalid (#1667) +* The initial state is changed (#1601) + + +### Features + +* chainlock optimized verification ([#1621](https://github.com/dashpay/platform/issues/1621)) +* **drive:** validate asset lock proof minimal value ([#1667](https://github.com/dashpay/platform/issues/1667)) +* **drive:** withdrawals finalization ([#1601](https://github.com/dashpay/platform/issues/1601)) + + +### Bug Fixes + +* **dashmate:** service status when tenderdash is syncing ([#1682](https://github.com/dashpay/platform/issues/1682)) +* **drive:** invalid protocol version is using to deserialize state ([#1679](https://github.com/dashpay/platform/issues/1679)) + + +### Miscellaneous Chores + +* **dashmate:** update to core v20.1.0-devpr5806.a1814ce2 ([#1665](https://github.com/dashpay/platform/issues/1665)) +* system data contracts versioning ([#1676](https://github.com/dashpay/platform/issues/1676)) +* update rs-tenderdash-abci to v0.14.0-dev.6 and tenderdash to v0.14.0-dev.2 ([#1686](https://github.com/dashpay/platform/issues/1686)) + ## [1.0.0-dev.3](https://github.com/dashpay/platform/compare/v1.0.0-dev.2...v1.0.0-dev.3) (2024-01-16) diff --git a/Cargo.lock b/Cargo.lock index a7ff27e8cb..595e903eb5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -937,7 +937,7 @@ dependencies = [ [[package]] name = "dapi-grpc" -version = "1.0.0-dev.3" +version = "1.0.0-dev.4" dependencies = [ "dapi-grpc-macros", "platform-version", @@ -951,7 +951,7 @@ dependencies = [ [[package]] name = "dapi-grpc-macros" -version = "1.0.0-dev.3" +version = "1.0.0-dev.4" dependencies = [ "dapi-grpc", "heck", @@ -1057,7 +1057,7 @@ dependencies = [ [[package]] name = "dashpay-contract" -version = "1.0.0-dev.3" +version = "1.0.0-dev.4" dependencies = [ "platform-value", "platform-version", @@ -1067,7 +1067,7 @@ dependencies = [ [[package]] name = "data-contracts" -version = "1.0.0-dev.3" +version = "1.0.0-dev.4" dependencies = [ "dashpay-contract", "dpns-contract", @@ -1160,7 +1160,7 @@ checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" [[package]] name = "dpns-contract" -version = "1.0.0-dev.3" +version = "1.0.0-dev.4" dependencies = [ "platform-value", "platform-version", @@ -1170,7 +1170,7 @@ dependencies = [ [[package]] name = "dpp" -version = "1.0.0-dev.3" +version = "1.0.0-dev.4" dependencies = [ "anyhow", "async-trait", @@ -1220,7 +1220,7 @@ dependencies = [ [[package]] name = "drive" -version = "1.0.0-dev.3" +version = "1.0.0-dev.4" dependencies = [ "anyhow", "base64 0.21.7", @@ -1255,7 +1255,7 @@ dependencies = [ [[package]] name = "drive-abci" -version = "1.0.0-dev.3" +version = "1.0.0-dev.4" dependencies = [ "atty", "base64 0.20.0", @@ -1308,7 +1308,7 @@ dependencies = [ [[package]] name = "drive-proof-verifier" -version = "1.0.0-dev.3" +version = "1.0.0-dev.4" dependencies = [ "dapi-grpc", "dpp", @@ -1509,7 +1509,7 @@ checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" [[package]] name = "feature-flags-contract" -version = "1.0.0-dev.3" +version = "1.0.0-dev.4" dependencies = [ "platform-value", "platform-version", @@ -2368,7 +2368,7 @@ dependencies = [ [[package]] name = "masternode-reward-shares-contract" -version = "1.0.0-dev.3" +version = "1.0.0-dev.4" dependencies = [ "platform-value", "platform-version", @@ -2839,7 +2839,7 @@ checksum = "2900ede94e305130c13ddd391e0ab7cbaeb783945ae07a279c268cb05109c6cb" [[package]] name = "platform-serialization" -version = "1.0.0-dev.3" +version = "1.0.0-dev.4" dependencies = [ "bincode 2.0.0-rc.3", "platform-version", @@ -2847,7 +2847,7 @@ dependencies = [ [[package]] name = "platform-serialization-derive" -version = "1.0.0-dev.3" +version = "1.0.0-dev.4" dependencies = [ "proc-macro2", "quote", @@ -2857,7 +2857,7 @@ dependencies = [ [[package]] name = "platform-value" -version = "1.0.0-dev.3" +version = "1.0.0-dev.4" dependencies = [ "base64 0.13.1", "bincode 2.0.0-rc.3", @@ -2878,7 +2878,7 @@ dependencies = [ [[package]] name = "platform-value-convertible" -version = "1.0.0-dev.3" +version = "1.0.0-dev.4" dependencies = [ "quote", "syn 2.0.48", @@ -2886,14 +2886,14 @@ dependencies = [ [[package]] name = "platform-version" -version = "1.0.0-dev.3" +version = "1.0.0-dev.4" dependencies = [ "thiserror", ] [[package]] name = "platform-versioning" -version = "1.0.0-dev.3" +version = "1.0.0-dev.4" dependencies = [ "proc-macro2", "quote", @@ -3435,7 +3435,7 @@ dependencies = [ [[package]] name = "rs-dapi-client" -version = "1.0.0-dev.3" +version = "1.0.0-dev.4" dependencies = [ "backon", "chrono", @@ -3455,7 +3455,7 @@ dependencies = [ [[package]] name = "rs-sdk" -version = "1.0.0-dev.3" +version = "1.0.0-dev.4" dependencies = [ "async-trait", "base64 0.21.7", @@ -3905,7 +3905,7 @@ checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" [[package]] name = "simple-signer" -version = "1.0.0-dev.3" +version = "1.0.0-dev.4" dependencies = [ "anyhow", "bincode 2.0.0-rc.3", @@ -3996,7 +3996,7 @@ dependencies = [ [[package]] name = "strategy-tests" -version = "1.0.0-dev.3" +version = "1.0.0-dev.4" dependencies = [ "bincode 2.0.0-rc.3", "dpp", @@ -4882,7 +4882,7 @@ checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93" [[package]] name = "wasm-dpp" -version = "1.0.0-dev.3" +version = "1.0.0-dev.4" dependencies = [ "anyhow", "async-trait", @@ -5124,7 +5124,7 @@ dependencies = [ [[package]] name = "withdrawals-contract" -version = "1.0.0-dev.3" +version = "1.0.0-dev.4" dependencies = [ "num_enum", "platform-value", diff --git a/package.json b/package.json index 9367ba41ab..cec8057632 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/platform", - "version": "1.0.0-dev.3", + "version": "1.0.0-dev.4", "private": true, "scripts": { "setup": "yarn install && yarn run build && yarn run configure", diff --git a/packages/bench-suite/package.json b/packages/bench-suite/package.json index ecaff2a10c..16994bc682 100644 --- a/packages/bench-suite/package.json +++ b/packages/bench-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/bench-suite", "private": true, - "version": "1.0.0-dev.3", + "version": "1.0.0-dev.4", "description": "Dash Platform benchmark tool", "scripts": { "bench": "node ./bin/bench.js", diff --git a/packages/dapi-grpc/Cargo.toml b/packages/dapi-grpc/Cargo.toml index d57450e00d..9bcc325f72 100644 --- a/packages/dapi-grpc/Cargo.toml +++ b/packages/dapi-grpc/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc" description = "GRPC client for Dash Platform" -version = "1.0.0-dev.3" +version = "1.0.0-dev.4" authors = [ "Samuel Westrich ", "Igor Markin ", diff --git a/packages/dapi-grpc/package.json b/packages/dapi-grpc/package.json index 520e07d885..a91238d420 100644 --- a/packages/dapi-grpc/package.json +++ b/packages/dapi-grpc/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-grpc", - "version": "1.0.0-dev.3", + "version": "1.0.0-dev.4", "description": "DAPI GRPC definition file and generated clients", "browser": "browser.js", "main": "node.js", diff --git a/packages/dapi/package.json b/packages/dapi/package.json index 1ba96917fa..19a13b5bb7 100644 --- a/packages/dapi/package.json +++ b/packages/dapi/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/dapi", "private": true, - "version": "1.0.0-dev.3", + "version": "1.0.0-dev.4", "description": "A decentralized API for the Dash network", "scripts": { "api": "node scripts/api.js", diff --git a/packages/dash-spv/package.json b/packages/dash-spv/package.json index 3a10406d15..aa7fcf9079 100644 --- a/packages/dash-spv/package.json +++ b/packages/dash-spv/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dash-spv", - "version": "1.0.0-dev.3", + "version": "1.0.0-dev.4", "description": "Repository containing SPV functions used by @dashevo", "main": "index.js", "scripts": { diff --git a/packages/dashmate/package.json b/packages/dashmate/package.json index 9cdde2c9c6..a9f8dc2949 100644 --- a/packages/dashmate/package.json +++ b/packages/dashmate/package.json @@ -1,6 +1,6 @@ { "name": "dashmate", - "version": "1.0.0-dev.3", + "version": "1.0.0-dev.4", "description": "Distribution package for Dash node installation", "scripts": { "lint": "eslint .", diff --git a/packages/dashpay-contract/Cargo.toml b/packages/dashpay-contract/Cargo.toml index 6a57b5a220..2403a1eb23 100644 --- a/packages/dashpay-contract/Cargo.toml +++ b/packages/dashpay-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dashpay-contract" description = "DashPay data contract schema and tools" -version = "1.0.0-dev.3" +version = "1.0.0-dev.4" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/dashpay-contract/package.json b/packages/dashpay-contract/package.json index b159d7d7e9..ba77b6aa86 100644 --- a/packages/dashpay-contract/package.json +++ b/packages/dashpay-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dashpay-contract", - "version": "1.0.0-dev.3", + "version": "1.0.0-dev.4", "description": "Reference contract of the DashPay DPA on Dash Evolution", "scripts": { "lint": "eslint .", diff --git a/packages/data-contracts/Cargo.toml b/packages/data-contracts/Cargo.toml index ccf596d97b..eece64000c 100644 --- a/packages/data-contracts/Cargo.toml +++ b/packages/data-contracts/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "data-contracts" description = "Dash Platform system data contracts" -version = "1.0.0-dev.3" +version = "1.0.0-dev.4" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/dpns-contract/Cargo.toml b/packages/dpns-contract/Cargo.toml index 0ab6051c1e..2c961e05c2 100644 --- a/packages/dpns-contract/Cargo.toml +++ b/packages/dpns-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dpns-contract" description = "DPNS data contract schema and tools" -version = "1.0.0-dev.3" +version = "1.0.0-dev.4" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/dpns-contract/package.json b/packages/dpns-contract/package.json index 6443f17ec1..94fb795b02 100644 --- a/packages/dpns-contract/package.json +++ b/packages/dpns-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dpns-contract", - "version": "1.0.0-dev.3", + "version": "1.0.0-dev.4", "description": "A contract and helper scripts for DPNS DApp", "scripts": { "lint": "eslint .", diff --git a/packages/feature-flags-contract/Cargo.toml b/packages/feature-flags-contract/Cargo.toml index 1114df3030..e4f30d4225 100644 --- a/packages/feature-flags-contract/Cargo.toml +++ b/packages/feature-flags-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "feature-flags-contract" description = "Feature flags data contract schema and tools" -version = "1.0.0-dev.3" +version = "1.0.0-dev.4" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/feature-flags-contract/package.json b/packages/feature-flags-contract/package.json index 016df4eed2..4bf437752c 100644 --- a/packages/feature-flags-contract/package.json +++ b/packages/feature-flags-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/feature-flags-contract", - "version": "1.0.0-dev.3", + "version": "1.0.0-dev.4", "description": "Data Contract to store Dash Platform feature flags", "scripts": { "build": "", diff --git a/packages/js-dapi-client/package.json b/packages/js-dapi-client/package.json index 2bef1169e5..cc68c54f08 100644 --- a/packages/js-dapi-client/package.json +++ b/packages/js-dapi-client/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-client", - "version": "1.0.0-dev.3", + "version": "1.0.0-dev.4", "description": "Client library used to access Dash DAPI endpoints", "main": "lib/index.js", "contributors": [ diff --git a/packages/js-dash-sdk/package.json b/packages/js-dash-sdk/package.json index 932fdc438d..684b53dd26 100644 --- a/packages/js-dash-sdk/package.json +++ b/packages/js-dash-sdk/package.json @@ -1,6 +1,6 @@ { "name": "dash", - "version": "4.0.0-dev.3", + "version": "4.0.0-dev.4", "description": "Dash library for JavaScript/TypeScript ecosystem (Wallet, DAPI, Primitives, BLS, ...)", "main": "build/index.js", "unpkg": "dist/dash.min.js", diff --git a/packages/js-grpc-common/package.json b/packages/js-grpc-common/package.json index 1c5851b75b..b8e0b2f166 100644 --- a/packages/js-grpc-common/package.json +++ b/packages/js-grpc-common/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/grpc-common", - "version": "1.0.0-dev.3", + "version": "1.0.0-dev.4", "description": "Common GRPC library", "main": "index.js", "scripts": { diff --git a/packages/masternode-reward-shares-contract/Cargo.toml b/packages/masternode-reward-shares-contract/Cargo.toml index c2863a4a4e..35dbf45f57 100644 --- a/packages/masternode-reward-shares-contract/Cargo.toml +++ b/packages/masternode-reward-shares-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "masternode-reward-shares-contract" description = "Masternode reward shares data contract schema and tools" -version = "1.0.0-dev.3" +version = "1.0.0-dev.4" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/masternode-reward-shares-contract/package.json b/packages/masternode-reward-shares-contract/package.json index 940d19628c..0cf2f4f2bb 100644 --- a/packages/masternode-reward-shares-contract/package.json +++ b/packages/masternode-reward-shares-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/masternode-reward-shares-contract", - "version": "1.0.0-dev.3", + "version": "1.0.0-dev.4", "description": "A contract and helper scripts for reward sharing", "scripts": { "lint": "eslint .", diff --git a/packages/platform-test-suite/package.json b/packages/platform-test-suite/package.json index 8ced829945..85c0994a22 100644 --- a/packages/platform-test-suite/package.json +++ b/packages/platform-test-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/platform-test-suite", "private": true, - "version": "1.0.0-dev.3", + "version": "1.0.0-dev.4", "description": "Dash Network end-to-end tests", "scripts": { "test": "yarn exec bin/test.sh", diff --git a/packages/rs-dapi-client/Cargo.toml b/packages/rs-dapi-client/Cargo.toml index ae68cf9d3e..eaeb74d573 100644 --- a/packages/rs-dapi-client/Cargo.toml +++ b/packages/rs-dapi-client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rs-dapi-client" -version = "1.0.0-dev.3" +version = "1.0.0-dev.4" edition = "2021" [features] diff --git a/packages/rs-dapi-grpc-macros/Cargo.toml b/packages/rs-dapi-grpc-macros/Cargo.toml index 198feae727..f6f00d3ed9 100644 --- a/packages/rs-dapi-grpc-macros/Cargo.toml +++ b/packages/rs-dapi-grpc-macros/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc-macros" -version = "1.0.0-dev.3" +version = "1.0.0-dev.4" edition = "2021" description = "Macros used by dapi-grpc. Internal use only." diff --git a/packages/rs-dpp/Cargo.toml b/packages/rs-dpp/Cargo.toml index f952233c4d..30a2f2920d 100644 --- a/packages/rs-dpp/Cargo.toml +++ b/packages/rs-dpp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dpp" -version = "1.0.0-dev.3" +version = "1.0.0-dev.4" edition = "2021" rust-version = "1.73" authors = [ diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index 5e8d4954b8..90372484ad 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drive-abci" -version = "1.0.0-dev.3" +version = "1.0.0-dev.4" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/rs-drive-proof-verifier/Cargo.toml b/packages/rs-drive-proof-verifier/Cargo.toml index b0768476c5..264c3fab22 100644 --- a/packages/rs-drive-proof-verifier/Cargo.toml +++ b/packages/rs-drive-proof-verifier/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drive-proof-verifier" -version = "1.0.0-dev.3" +version = "1.0.0-dev.4" edition = "2021" rust-version = "1.73" diff --git a/packages/rs-drive/Cargo.toml b/packages/rs-drive/Cargo.toml index a0cda6ef57..037eed04ce 100644 --- a/packages/rs-drive/Cargo.toml +++ b/packages/rs-drive/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "drive" description = "Dash drive built on top of GroveDB" -version = "1.0.0-dev.3" +version = "1.0.0-dev.4" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/rs-platform-serialization-derive/Cargo.toml b/packages/rs-platform-serialization-derive/Cargo.toml index 01c46b7fbc..34d654c532 100644 --- a/packages/rs-platform-serialization-derive/Cargo.toml +++ b/packages/rs-platform-serialization-derive/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization-derive" authors = ["Samuel Westrich "] description = "Bincode serialization and deserialization derivations" -version = "1.0.0-dev.3" +version = "1.0.0-dev.4" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/rs-platform-serialization/Cargo.toml b/packages/rs-platform-serialization/Cargo.toml index 01efda7169..84b789941a 100644 --- a/packages/rs-platform-serialization/Cargo.toml +++ b/packages/rs-platform-serialization/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization" authors = ["Samuel Westrich "] description = "Bincode based serialization and deserialization" -version = "1.0.0-dev.3" +version = "1.0.0-dev.4" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/rs-platform-value-convertible/Cargo.toml b/packages/rs-platform-value-convertible/Cargo.toml index 85da3f10c0..bb21c68874 100644 --- a/packages/rs-platform-value-convertible/Cargo.toml +++ b/packages/rs-platform-value-convertible/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-value-convertible" authors = ["Samuel Westrich "] description = "Convertion to and from platform values" -version = "1.0.0-dev.3" +version = "1.0.0-dev.4" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/rs-platform-value/Cargo.toml b/packages/rs-platform-value/Cargo.toml index f27e33cca8..d4cb4e1cc3 100644 --- a/packages/rs-platform-value/Cargo.toml +++ b/packages/rs-platform-value/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-value" authors = ["Samuel Westrich "] description = "A simple value module" -version = "1.0.0-dev.3" +version = "1.0.0-dev.4" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/rs-platform-version/Cargo.toml b/packages/rs-platform-version/Cargo.toml index 456e152e88..44635c8ba4 100644 --- a/packages/rs-platform-version/Cargo.toml +++ b/packages/rs-platform-version/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-version" authors = ["Samuel Westrich "] description = "Bincode based serialization and deserialization" -version = "1.0.0-dev.3" +version = "1.0.0-dev.4" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/rs-platform-versioning/Cargo.toml b/packages/rs-platform-versioning/Cargo.toml index fc197caa00..0734256f3d 100644 --- a/packages/rs-platform-versioning/Cargo.toml +++ b/packages/rs-platform-versioning/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-versioning" authors = ["Samuel Westrich "] description = "Version derivation" -version = "1.0.0-dev.3" +version = "1.0.0-dev.4" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/rs-sdk/Cargo.toml b/packages/rs-sdk/Cargo.toml index 401889f592..5b615c2ea3 100644 --- a/packages/rs-sdk/Cargo.toml +++ b/packages/rs-sdk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rs-sdk" -version = "1.0.0-dev.3" +version = "1.0.0-dev.4" edition = "2021" [dependencies] diff --git a/packages/simple-signer/Cargo.toml b/packages/simple-signer/Cargo.toml index d1828c744f..5087631736 100644 --- a/packages/simple-signer/Cargo.toml +++ b/packages/simple-signer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "simple-signer" -version = "1.0.0-dev.3" +version = "1.0.0-dev.4" edition = "2021" rust-version = "1.73" diff --git a/packages/strategy-tests/Cargo.toml b/packages/strategy-tests/Cargo.toml index f78a30a8a0..1deb64aa55 100644 --- a/packages/strategy-tests/Cargo.toml +++ b/packages/strategy-tests/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "strategy-tests" -version = "1.0.0-dev.3" +version = "1.0.0-dev.4" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/wallet-lib/package.json b/packages/wallet-lib/package.json index 9823cd9294..fcf337e6cb 100644 --- a/packages/wallet-lib/package.json +++ b/packages/wallet-lib/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wallet-lib", - "version": "8.0.0-dev.3", + "version": "8.0.0-dev.4", "description": "Light wallet library for Dash", "main": "src/index.js", "unpkg": "dist/wallet-lib.min.js", diff --git a/packages/wasm-dpp/Cargo.toml b/packages/wasm-dpp/Cargo.toml index fccb89012e..708ef2f09a 100644 --- a/packages/wasm-dpp/Cargo.toml +++ b/packages/wasm-dpp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasm-dpp" -version = "1.0.0-dev.3" +version = "1.0.0-dev.4" edition = "2021" rust-version = "1.73" authors = ["Anton Suprunchuk "] diff --git a/packages/wasm-dpp/package.json b/packages/wasm-dpp/package.json index f3cadfde28..b6af1827cc 100644 --- a/packages/wasm-dpp/package.json +++ b/packages/wasm-dpp/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wasm-dpp", - "version": "1.0.0-dev.3", + "version": "1.0.0-dev.4", "description": "The JavaScript implementation of the Dash Platform Protocol", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/withdrawals-contract/Cargo.toml b/packages/withdrawals-contract/Cargo.toml index 61d4b0dae5..886bb5c8e3 100644 --- a/packages/withdrawals-contract/Cargo.toml +++ b/packages/withdrawals-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "withdrawals-contract" description = "Witdrawals data contract schema and tools" -version = "1.0.0-dev.3" +version = "1.0.0-dev.4" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/withdrawals-contract/package.json b/packages/withdrawals-contract/package.json index b5b7b083c1..05604a7a3a 100644 --- a/packages/withdrawals-contract/package.json +++ b/packages/withdrawals-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/withdrawals-contract", - "version": "1.0.0-dev.3", + "version": "1.0.0-dev.4", "description": "Data Contract to manipulate and track withdrawals", "scripts": { "build": "", From 7fc1cd9f39390bf33bf808fb68d00f9652965336 Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Fri, 9 Feb 2024 06:52:13 +0700 Subject: [PATCH 028/191] refactor(platform): autogenerated clippy fixes for rust version 1.76 (#1691) --- .../document_type/methods/mod.rs | 2 +- .../data_contract/document_type/schema/mod.rs | 1 - .../schema/recursive_schema_validator/mod.rs | 6 +-- packages/rs-dpp/src/data_contract/mod.rs | 2 - .../consensus/basic/data_contract/mod.rs | 2 +- .../document_transitions_are_absent_error.rs | 6 +++ ...ty_update_transition_disable_keys_error.rs | 6 +++ ..._identity_update_transition_empty_error.rs | 6 +++ .../src/identity/conversion/cbor/mod.rs | 1 - packages/rs-dpp/src/identity/mod.rs | 3 +- .../state_transition/asset_lock_proof/mod.rs | 2 +- .../data_contract_create_transition/fields.rs | 2 +- .../identity_create_transition/fields.rs | 2 +- .../accessors/v0/mod.rs | 2 +- packages/rs-dpp/src/tests/fixtures/mod.rs | 4 +- .../rs-drive-abci/src/abci/handler/mod.rs | 4 +- .../src/execution/check_tx/v0/mod.rs | 4 +- .../engine/finalize_block_proposal/v0/mod.rs | 7 +--- .../hash_protxhash_with_key_data/v0/mod.rs | 5 +-- .../update_quorum_info/v0/mod.rs | 5 +-- .../core_chain_lock/choose_quorum/mod.rs | 4 +- .../core_chain_lock/choose_quorum/v0/mod.rs | 6 +-- .../verify_chain_lock_locally/mod.rs | 1 - .../verify_chain_lock_locally/v0/mod.rs | 8 ++-- .../create_mn_shares_contract/mod.rs | 2 +- .../v0/mod.rs | 6 +-- .../execute_event/v0/mod.rs | 3 +- .../validate_fees_of_event/v0/mod.rs | 6 +-- .../v0/mod.rs | 8 ++-- .../src/execution/storage/mod.rs | 3 -- .../types/block_execution_context/v0/mod.rs | 3 +- .../asset_lock/proof/validate/instant/mod.rs | 8 +--- .../proof/verify_is_not_spent/instant/mod.rs | 2 +- .../proof/verify_is_not_spent/mod.rs | 2 +- .../state_transition/processor/v0/mod.rs | 13 +++--- .../data_contract_update/mod.rs | 2 +- .../documents_batch/data_triggers/mod.rs | 6 +-- .../data_triggers/triggers/dashpay/v0/mod.rs | 12 +++--- .../data_triggers/triggers/dpns/v0/mod.rs | 2 +- .../triggers/withdrawals/v0/mod.rs | 8 ++-- .../identity_create/state/v0/mod.rs | 2 +- .../identity_top_up/state/v0/mod.rs | 2 +- .../rs-drive-abci/src/logging/destination.rs | 2 +- .../src/platform_types/commit/v0/mod.rs | 2 +- .../src/platform_types/platform_state/mod.rs | 4 +- .../platform_types/platform_state/v0/mod.rs | 2 +- packages/rs-drive-abci/src/query/mod.rs | 5 +-- packages/rs-drive-abci/src/rpc/core.rs | 8 ++-- .../tests/strategy_tests/chain_lock_update.rs | 6 +-- .../tests/strategy_tests/core_update_tests.rs | 3 -- .../tests/strategy_tests/execution.rs | 8 ++-- .../tests/strategy_tests/failures.rs | 5 +-- .../tests/strategy_tests/main.rs | 42 +++++++------------ .../tests/strategy_tests/masternodes.rs | 16 +++---- .../tests/strategy_tests/query.rs | 4 +- .../tests/strategy_tests/strategy.rs | 4 +- .../strategy_tests/upgrade_fork_tests.rs | 1 - .../verify_state_transitions.rs | 2 +- packages/rs-drive-proof-verifier/src/proof.rs | 2 +- .../rs-drive-proof-verifier/src/verify.rs | 2 +- packages/rs-drive/src/drive/balances/mod.rs | 10 ----- .../drive/batch/drive_op_batch/document.rs | 1 - .../batch/drive_op_batch/drive_methods/mod.rs | 3 -- .../src/drive/batch/grovedb_op_batch/mod.rs | 4 +- .../drive/contract/estimation_costs/mod.rs | 1 - .../rs-drive/src/drive/contract/prove/mod.rs | 3 -- .../contract/prove/prove_contract/v0/mod.rs | 2 +- .../credit_pools/pending_epoch_refunds/mod.rs | 2 - .../rs-drive/src/drive/document/delete/mod.rs | 10 ----- .../drive/document/estimation_costs/mod.rs | 2 - .../drive/document/index_uniqueness/mod.rs | 5 +-- .../rs-drive/src/drive/document/insert/mod.rs | 8 ---- .../v0/mod.rs | 2 +- .../rs-drive/src/drive/document/update/mod.rs | 8 ---- .../v0/mod.rs | 4 +- .../v0/mod.rs | 4 +- .../rs-drive/src/drive/platform_state/mod.rs | 3 -- .../src/drive/system/protocol_version/mod.rs | 7 ++-- .../store_current_protocol_version.rs | 1 - .../mod.rs | 2 +- .../v0/mod.rs | 2 +- .../mod.rs | 2 +- .../mod.rs | 2 +- .../v0/mod.rs | 2 +- .../mod.rs | 2 - .../v0/mod.rs | 2 - .../mod.rs | 2 - .../v0/mod.rs | 2 - .../mod.rs | 2 - .../v0/mod.rs | 2 - .../mod.rs | 2 - .../v0/mod.rs | 2 - .../mod.rs | 1 - .../v0/mod.rs | 2 +- .../fee_pools/epochs/operations_factory.rs | 2 +- packages/rs-drive/src/query/conditions.rs | 20 ++++----- packages/rs-drive/src/query/mod.rs | 10 ++--- packages/rs-drive/src/query/ordering.rs | 2 +- packages/rs-drive/src/query/test_index.rs | 2 +- .../src/converter/serde_json.rs | 2 +- .../src/value_serialization/de.rs | 2 +- packages/rs-sdk/tests/fetch/config.rs | 2 +- packages/strategy-tests/src/lib.rs | 14 +------ 103 files changed, 166 insertions(+), 298 deletions(-) diff --git a/packages/rs-dpp/src/data_contract/document_type/methods/mod.rs b/packages/rs-dpp/src/data_contract/document_type/methods/mod.rs index 337128e099..576d821348 100644 --- a/packages/rs-dpp/src/data_contract/document_type/methods/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/methods/mod.rs @@ -188,7 +188,7 @@ impl DocumentTypeV0Methods for DocumentTypeV0 { fn top_level_indices(&self) -> Vec<&IndexProperty> { let mut index_properties: Vec<&IndexProperty> = Vec::with_capacity(self.indices.len()); for index in &self.indices { - if let Some(property) = index.properties.get(0) { + if let Some(property) = index.properties.first() { index_properties.push(property); } } diff --git a/packages/rs-dpp/src/data_contract/document_type/schema/mod.rs b/packages/rs-dpp/src/data_contract/document_type/schema/mod.rs index 7016579b69..6e739dfc49 100644 --- a/packages/rs-dpp/src/data_contract/document_type/schema/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/schema/mod.rs @@ -2,7 +2,6 @@ mod enrich_with_base_schema; pub use enrich_with_base_schema::*; mod find_identifier_and_binary_paths; -pub use find_identifier_and_binary_paths::*; #[cfg(feature = "validation")] mod recursive_schema_validator; diff --git a/packages/rs-dpp/src/data_contract/document_type/schema/recursive_schema_validator/mod.rs b/packages/rs-dpp/src/data_contract/document_type/schema/recursive_schema_validator/mod.rs index 15a5377cd9..4a550196fa 100644 --- a/packages/rs-dpp/src/data_contract/document_type/schema/recursive_schema_validator/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/schema/recursive_schema_validator/mod.rs @@ -105,7 +105,7 @@ mod test { PlatformVersion::first(), ) .expect("expected traversal validator to succeed"); - let consensus_error = result.errors.get(0).expect("the error should be returned"); + let consensus_error = result.errors.first().expect("the error should be returned"); match consensus_error { ConsensusError::BasicError(BasicError::IncompatibleRe2PatternError(err)) => { @@ -145,7 +145,7 @@ mod test { PlatformVersion::first(), ) .expect("expected traversal validator to exist for first protocol version"); - let consensus_error = result.errors.get(0).expect("the error should be returned"); + let consensus_error = result.errors.first().expect("the error should be returned"); match consensus_error { ConsensusError::BasicError(BasicError::IncompatibleRe2PatternError(err)) => { @@ -175,7 +175,7 @@ mod test { PlatformVersion::first(), ) .expect("expected traversal validator to exist for first protocol version"); - let consensus_error = result.errors.get(0).expect("the error should be returned"); + let consensus_error = result.errors.first().expect("the error should be returned"); match consensus_error { ConsensusError::BasicError(BasicError::IncompatibleRe2PatternError(err)) => { diff --git a/packages/rs-dpp/src/data_contract/mod.rs b/packages/rs-dpp/src/data_contract/mod.rs index d6572b53db..e3923858f4 100644 --- a/packages/rs-dpp/src/data_contract/mod.rs +++ b/packages/rs-dpp/src/data_contract/mod.rs @@ -4,11 +4,9 @@ use crate::serialization::{ PlatformLimitDeserializableFromVersionedStructure, PlatformSerializableWithPlatformVersion, }; -pub use data_contract::*; use derive_more::From; use bincode::config::{BigEndian, Configuration}; -pub use generate_data_contract::*; pub mod errors; pub mod extra; diff --git a/packages/rs-dpp/src/errors/consensus/basic/data_contract/mod.rs b/packages/rs-dpp/src/errors/consensus/basic/data_contract/mod.rs index 8c76d586b5..9d90ec16fb 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/data_contract/mod.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/data_contract/mod.rs @@ -31,7 +31,7 @@ pub use invalid_data_contract_version_error::*; pub use invalid_index_property_type_error::*; pub use invalid_indexed_property_constraint_error::*; pub use invalid_json_schema_ref_error::*; -pub use invalid_json_schema_ref_error::*; + pub use system_property_index_already_present_error::*; pub use undefined_index_property_error::*; pub use unique_indices_limit_reached_error::*; diff --git a/packages/rs-dpp/src/errors/consensus/basic/document/document_transitions_are_absent_error.rs b/packages/rs-dpp/src/errors/consensus/basic/document/document_transitions_are_absent_error.rs index 932c01d4c4..854a530cb3 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/document/document_transitions_are_absent_error.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/document/document_transitions_are_absent_error.rs @@ -13,6 +13,12 @@ use thiserror::Error; #[platform_serialize(unversioned)] pub struct DocumentTransitionsAreAbsentError {} +impl Default for DocumentTransitionsAreAbsentError { + fn default() -> Self { + Self::new() + } +} + impl DocumentTransitionsAreAbsentError { pub fn new() -> Self { Self {} diff --git a/packages/rs-dpp/src/errors/consensus/basic/identity/invalid_identity_update_transition_disable_keys_error.rs b/packages/rs-dpp/src/errors/consensus/basic/identity/invalid_identity_update_transition_disable_keys_error.rs index dc6fa9e9c8..81bff1d14a 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/identity/invalid_identity_update_transition_disable_keys_error.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/identity/invalid_identity_update_transition_disable_keys_error.rs @@ -14,6 +14,12 @@ use bincode::{Decode, Encode}; #[platform_serialize(unversioned)] pub struct InvalidIdentityUpdateTransitionDisableKeysError; +impl Default for InvalidIdentityUpdateTransitionDisableKeysError { + fn default() -> Self { + Self::new() + } +} + impl InvalidIdentityUpdateTransitionDisableKeysError { pub fn new() -> Self { Self {} diff --git a/packages/rs-dpp/src/errors/consensus/basic/identity/invalid_identity_update_transition_empty_error.rs b/packages/rs-dpp/src/errors/consensus/basic/identity/invalid_identity_update_transition_empty_error.rs index a553800f60..0304878987 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/identity/invalid_identity_update_transition_empty_error.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/identity/invalid_identity_update_transition_empty_error.rs @@ -14,6 +14,12 @@ use bincode::{Decode, Encode}; #[platform_serialize(unversioned)] pub struct InvalidIdentityUpdateTransitionEmptyError; +impl Default for InvalidIdentityUpdateTransitionEmptyError { + fn default() -> Self { + Self::new() + } +} + impl InvalidIdentityUpdateTransitionEmptyError { pub fn new() -> Self { Self {} diff --git a/packages/rs-dpp/src/identity/conversion/cbor/mod.rs b/packages/rs-dpp/src/identity/conversion/cbor/mod.rs index c0000c8b0d..e084dffc38 100644 --- a/packages/rs-dpp/src/identity/conversion/cbor/mod.rs +++ b/packages/rs-dpp/src/identity/conversion/cbor/mod.rs @@ -1,2 +1 @@ mod v0; -pub use v0::*; diff --git a/packages/rs-dpp/src/identity/mod.rs b/packages/rs-dpp/src/identity/mod.rs index 4260fccf52..902dc9aef4 100644 --- a/packages/rs-dpp/src/identity/mod.rs +++ b/packages/rs-dpp/src/identity/mod.rs @@ -1,6 +1,5 @@ pub use credits_converter::*; -pub use credits_converter::*; -pub use get_biggest_possible_identity::*; + pub use identity::*; #[cfg(feature = "client")] pub use identity_facade::*; diff --git a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/mod.rs b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/mod.rs index 7731b02c3d..dd69e8e935 100644 --- a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/mod.rs +++ b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/mod.rs @@ -5,7 +5,7 @@ use dashcore::{OutPoint, Transaction}; use serde::{Deserialize, Deserializer, Serialize}; pub use bincode::{Decode, Encode}; -pub use chain::*; + pub use instant::*; use platform_value::Value; use platform_version::version::PlatformVersion; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/fields.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/fields.rs index 4d29a981c1..c49c87db81 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/fields.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/fields.rs @@ -1,7 +1,7 @@ use crate::state_transition::state_transitions; pub use state_transitions::common_fields::property_names::{ - ENTROPY, SIGNATURE, SIGNATURE_PUBLIC_KEY_ID, STATE_TRANSITION_PROTOCOL_VERSION, TRANSITION_TYPE, + ENTROPY, SIGNATURE, SIGNATURE_PUBLIC_KEY_ID, STATE_TRANSITION_PROTOCOL_VERSION, }; pub use state_transitions::contract::common_fields::property_names::{ DATA_CONTRACT, DATA_CONTRACT_ENTROPY, DATA_CONTRACT_ID, DATA_CONTRACT_OWNER_ID, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/fields.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/fields.rs index 40b5fc6173..74fc567172 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/fields.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/fields.rs @@ -1,7 +1,7 @@ use crate::state_transition::state_transitions; pub use state_transitions::common_fields::property_names::{ - ENTROPY, SIGNATURE, SIGNATURE_PUBLIC_KEY_ID, STATE_TRANSITION_PROTOCOL_VERSION, TRANSITION_TYPE, + SIGNATURE, STATE_TRANSITION_PROTOCOL_VERSION, }; pub use state_transitions::identity::common_fields::property_names::{ ASSET_LOCK_PROOF, IDENTITY_ID, PUBLIC_KEYS, PUBLIC_KEYS_DATA, PUBLIC_KEYS_SIGNATURE, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/accessors/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/accessors/v0/mod.rs index 32d7866c5b..46f3e15144 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/accessors/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/accessors/v0/mod.rs @@ -1,5 +1,5 @@ use crate::prelude::Revision; -use crate::state_transition::identity_credit_transfer_transition::IdentityCreditTransferTransition; + use platform_value::Identifier; pub trait IdentityCreditTransferTransitionAccessorsV0 { diff --git a/packages/rs-dpp/src/tests/fixtures/mod.rs b/packages/rs-dpp/src/tests/fixtures/mod.rs index 7d999752c4..60b5cd4dfe 100644 --- a/packages/rs-dpp/src/tests/fixtures/mod.rs +++ b/packages/rs-dpp/src/tests/fixtures/mod.rs @@ -7,7 +7,7 @@ pub use get_document_transitions_fixture::*; pub use get_documents_fixture::*; pub use get_dpns_data_contract::*; pub use get_dpns_document_fixture::*; -pub use get_dpp::*; + #[cfg(feature = "state-transitions")] pub use get_identity_update_transition_fixture::*; #[cfg(feature = "state-transitions")] @@ -29,8 +29,6 @@ mod get_document_transitions_fixture; pub use get_masternode_reward_shares_documents_fixture::*; -pub use get_documents_fixture::*; - mod get_dashpay_contract_fixture; mod get_dashpay_contract_with_generalized_encryption_key_fixture; mod get_data_contract; diff --git a/packages/rs-drive-abci/src/abci/handler/mod.rs b/packages/rs-drive-abci/src/abci/handler/mod.rs index 8797a3b726..25fbf1a7a6 100644 --- a/packages/rs-drive-abci/src/abci/handler/mod.rs +++ b/packages/rs-drive-abci/src/abci/handler/mod.rs @@ -40,8 +40,6 @@ mod execution_result; use crate::abci::server::AbciApplication; use crate::error::execution::ExecutionError; -use dashcore_rpc::dashcore::consensus::Encodable; -use dashcore_rpc::dashcore::hashes::HashEngine; use super::AbciError; use crate::error::Error; @@ -368,7 +366,7 @@ where fn process_proposal( &self, - mut request: RequestProcessProposal, + request: RequestProcessProposal, ) -> Result { let timer = crate::metrics::abci_request_duration("process_proposal"); diff --git a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs index cafa016da3..694c219146 100644 --- a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs @@ -1,7 +1,7 @@ use crate::error::Error; use crate::execution::check_tx::CheckTxLevel; use crate::execution::validation::state_transition::check_tx_verification::state_transition_to_execution_event_for_check_tx; -use crate::execution::validation::state_transition::processor::process_state_transition; + #[cfg(test)] use crate::platform_types::event_execution_result::EventExecutionResult; #[cfg(test)] @@ -14,6 +14,8 @@ use dpp::consensus::basic::decode::SerializedObjectParsingError; use dpp::consensus::basic::BasicError; use dpp::consensus::ConsensusError; +#[cfg(test)] +use crate::execution::validation::state_transition::processor::process_state_transition; use dpp::fee::fee_result::FeeResult; use dpp::serialization::PlatformDeserializable; use dpp::state_transition::StateTransition; diff --git a/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/v0/mod.rs b/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/v0/mod.rs index b807a1e564..1ee33c8596 100644 --- a/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/v0/mod.rs @@ -1,4 +1,3 @@ -use dashcore_rpc::dashcore::transaction::special_transaction::TransactionPayload::AssetUnlockPayloadType; use dpp::block::epoch::Epoch; use dpp::validation::SimpleValidationResult; @@ -10,8 +9,7 @@ use dpp::block::extended_block_info::v0::ExtendedBlockInfoV0; use dpp::version::PlatformVersion; use dpp::dashcore::bls_sig_utils::BLSSignature; -use dpp::dashcore::consensus::Encodable; -use dpp::dashcore::hashes::Hash; + use tenderdash_abci::{ proto::{serializers::timestamp::ToMilis, types::BlockId as ProtoBlockId}, signatures::Hashable, @@ -62,7 +60,7 @@ where /// pub(super) fn finalize_block_proposal_v0( &self, - mut request_finalize_block: FinalizeBlockCleanedRequest, + request_finalize_block: FinalizeBlockCleanedRequest, transaction: &Transaction, _platform_version: &PlatformVersion, ) -> Result { @@ -231,7 +229,6 @@ where let signatures = commit_info .threshold_vote_extensions .drain(..) - .into_iter() .map(|vote_extension| { let signature_bytes: [u8; 96] = vote_extension.signature.try_into().map_err(|e| { diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/hash_protxhash_with_key_data/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/hash_protxhash_with_key_data/v0/mod.rs index 8e696e032b..3758afe7c5 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/hash_protxhash_with_key_data/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/hash_protxhash_with_key_data/v0/mod.rs @@ -15,9 +15,6 @@ where let mut hasher = Sha256::new(); hasher.update(pro_tx_hash); hasher.update(key_data); - Ok(hasher - .finalize() - .try_into() - .expect("expected a 32 byte hash")) + Ok(hasher.finalize().into()) } } diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_quorum_info/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_quorum_info/v0/mod.rs index 26035b5e20..323918cf39 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_quorum_info/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_quorum_info/v0/mod.rs @@ -177,10 +177,7 @@ where .validator_sets() .iter() .map(|(quorum_hash, validator_set)| { - ( - quorum_hash.clone(), - validator_set.threshold_public_key().clone(), - ) + (*quorum_hash, validator_set.threshold_public_key().clone()) }) .collect(); let previous_quorums = block_platform_state diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/choose_quorum/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/choose_quorum/mod.rs index f939ef727c..11d1b02f78 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/choose_quorum/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/choose_quorum/mod.rs @@ -4,8 +4,8 @@ use crate::error::execution::ExecutionError; use crate::error::Error; use dashcore_rpc::dashcore_rpc_json::QuorumType; use dpp::bls_signatures::PublicKey as BlsPublicKey; -use dpp::dashcore::{ChainLock, QuorumHash}; -use dpp::platform_value::Bytes32; +use dpp::dashcore::QuorumHash; + use std::collections::BTreeMap; use crate::platform_types::platform::Platform; diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/choose_quorum/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/choose_quorum/v0/mod.rs index 8fd8156732..0d8ac563e3 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/choose_quorum/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/choose_quorum/v0/mod.rs @@ -1,13 +1,11 @@ use dashcore_rpc::dashcore_rpc_json::QuorumType; use dpp::bls_signatures::PublicKey as BlsPublicKey; use dpp::dashcore::hashes::{sha256d, Hash, HashEngine}; -use dpp::dashcore::{ChainLock, QuorumHash}; +use dpp::dashcore::QuorumHash; use std::collections::BTreeMap; use crate::platform_types::platform::Platform; -use crate::rpc::core::CoreRPCLike; - use crate::execution::platform_events::core_chain_lock::choose_quorum::ReversedQuorumHashBytes; impl Platform { @@ -92,7 +90,7 @@ impl Platform { #[cfg(test)] mod tests { use crate::platform_types::platform::Platform; - use crate::rpc::core::{CoreRPCLike, MockCoreRPCLike}; + use crate::rpc::core::MockCoreRPCLike; use dashcore_rpc::dashcore_rpc_json::QuorumType; use dpp::bls_signatures::PublicKey as BlsPublicKey; use dpp::dashcore::hashes::Hash; diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_locally/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_locally/mod.rs index 21df37ba30..2e022adf5d 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_locally/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_locally/mod.rs @@ -8,7 +8,6 @@ use crate::platform_types::platform::Platform; use crate::rpc::core::CoreRPCLike; -use crate::config::PlatformConfig; use crate::platform_types::platform_state::PlatformState; use dpp::version::PlatformVersion; diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_locally/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_locally/v0/mod.rs index 815532e869..d6ea9922c2 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_locally/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_locally/v0/mod.rs @@ -1,8 +1,7 @@ -use dpp::block::block_info::BlockInfo; use dpp::bls_signatures::G2Element; -use dpp::dashcore::consensus::Encodable; + use dpp::dashcore::hashes::{sha256d, Hash, HashEngine}; -use dpp::dashcore::{ChainLock, QuorumSigningRequestId, VarInt}; +use dpp::dashcore::{ChainLock, QuorumSigningRequestId}; use crate::error::Error; @@ -10,7 +9,6 @@ use crate::platform_types::platform::Platform; use crate::rpc::core::CoreRPCLike; -use crate::config::PlatformConfig; use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::platform_types::platform_state::PlatformState; use dpp::version::PlatformVersion; @@ -236,7 +234,7 @@ where } } - return Ok(Some(chain_lock_verified)); + Ok(Some(chain_lock_verified)) } } diff --git a/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/create_mn_shares_contract/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/create_mn_shares_contract/mod.rs index 213b9ac0da..e0a2e2306f 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/create_mn_shares_contract/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/create_mn_shares_contract/mod.rs @@ -21,7 +21,7 @@ impl Platform { platform_version: &PlatformVersion, ) -> DataContract { let contract = - load_system_data_contract(SystemDataContract::MasternodeRewards, &platform_version) + load_system_data_contract(SystemDataContract::MasternodeRewards, platform_version) .expect("should load masternode reward contract"); let storage_flags = Some(Cow::Owned(StorageFlags::SingleEpoch(0))); diff --git a/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/fetch_reward_shares_list_for_masternode/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/fetch_reward_shares_list_for_masternode/v0/mod.rs index 010c5e7f77..ab98ca11eb 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/fetch_reward_shares_list_for_masternode/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/fetch_reward_shares_list_for_masternode/v0/mod.rs @@ -17,11 +17,11 @@ use drive::dpp::document::Document; use drive::grovedb::TransactionArg; use drive::query::{DriveQuery, InternalClauses, WhereClause, WhereOperator}; +use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::version::PlatformVersion; -use drive::drive::document::query::{QueryDocumentsOutcomeV0Methods}; +use drive::drive::document::query::QueryDocumentsOutcomeV0Methods; use std::collections::BTreeMap; -use dpp::data_contract::accessors::v0::DataContractV0Getters; -use dpp::data_contracts::SystemDataContract; + use crate::execution::platform_events::fee_pool_outwards_distribution::fetch_reward_shares_list_for_masternode::MN_REWARD_SHARES_DOCUMENT_TYPE; impl Platform { diff --git a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/execute_event/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/execute_event/v0/mod.rs index d1b50852dd..5b5954fcb2 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/execute_event/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/execute_event/v0/mod.rs @@ -1,7 +1,6 @@ -use crate::error::execution::ExecutionError; use crate::error::Error; use crate::execution::types::execution_event::ExecutionEvent; -use crate::execution::types::execution_operation::{ExecutionOperation, OperationLike}; +use crate::execution::types::execution_operation::ExecutionOperation; use crate::platform_types::event_execution_result::EventExecutionResult; use crate::platform_types::event_execution_result::EventExecutionResult::{ ConsensusExecutionError, SuccessfulFreeExecution, SuccessfulPaidExecution, diff --git a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/validate_fees_of_event/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/validate_fees_of_event/v0/mod.rs index fdb4bccf7f..b273d7d29f 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/validate_fees_of_event/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/validate_fees_of_event/v0/mod.rs @@ -1,17 +1,17 @@ use crate::error::execution::ExecutionError; use crate::error::Error; use crate::execution::types::execution_event::ExecutionEvent; -use crate::execution::types::execution_operation::{ExecutionOperation, OperationLike}; +use crate::execution::types::execution_operation::ExecutionOperation; use crate::platform_types::platform::Platform; use crate::rpc::core::CoreRPCLike; use dpp::block::block_info::BlockInfo; use dpp::consensus::state::identity::IdentityInsufficientBalanceError; use dpp::consensus::state::state_error::StateError; use dpp::fee::fee_result::FeeResult; -use dpp::fee::Credits; + use dpp::prelude::ConsensusValidationResult; use dpp::version::PlatformVersion; -use dpp::ProtocolError; + use drive::grovedb::TransactionArg; impl Platform diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v0/mod.rs index 8562c69f25..1c01f85ff2 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v0/mod.rs @@ -1,19 +1,16 @@ use dpp::block::block_info::BlockInfo; -use dpp::block::epoch::Epoch; + use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::document::document_methods::DocumentMethodsV0; use dpp::document::{DocumentV0Getters, DocumentV0Setters}; use dpp::version::PlatformVersion; -use drive::drive::identity::withdrawals::{ - WithdrawalTransactionIndex, WithdrawalTransactionIndexAndBytes, -}; +use drive::drive::identity::withdrawals::WithdrawalTransactionIndexAndBytes; use drive::grovedb::TransactionArg; use dpp::system_data_contracts::withdrawals_contract; use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; use drive::drive::config::DEFAULT_QUERY_LIMIT; -use drive::query::DriveQuery; use crate::{ error::{execution::ExecutionError, Error}, @@ -152,6 +149,7 @@ where #[cfg(test)] mod tests { use super::*; + use dpp::block::epoch::Epoch; use dpp::data_contracts::SystemDataContract; use dpp::identifier::Identifier; diff --git a/packages/rs-drive-abci/src/execution/storage/mod.rs b/packages/rs-drive-abci/src/execution/storage/mod.rs index c45853e259..54302920e5 100644 --- a/packages/rs-drive-abci/src/execution/storage/mod.rs +++ b/packages/rs-drive-abci/src/execution/storage/mod.rs @@ -1,5 +1,2 @@ mod fetch_platform_state; mod store_platform_state; - -pub use fetch_platform_state::*; -pub use store_platform_state::*; diff --git a/packages/rs-drive-abci/src/execution/types/block_execution_context/v0/mod.rs b/packages/rs-drive-abci/src/execution/types/block_execution_context/v0/mod.rs index 0ae169080c..9f6aaa8f4e 100644 --- a/packages/rs-drive-abci/src/execution/types/block_execution_context/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/types/block_execution_context/v0/mod.rs @@ -32,8 +32,7 @@ use crate::execution::types::block_state_info::BlockStateInfo; use crate::platform_types::epoch_info::EpochInfo; use crate::platform_types::platform_state::PlatformState; use crate::platform_types::withdrawal::unsigned_withdrawal_txs::v0::UnsignedWithdrawalTxs; -use dashcore_rpc::dashcore::Txid; -use std::collections::BTreeMap; + use tenderdash_abci::proto::abci::ResponsePrepareProposal; /// V0 of the Block execution context diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/validate/instant/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/validate/instant/mod.rs index ce09c729f6..7972ad50cf 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/validate/instant/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/validate/instant/mod.rs @@ -1,14 +1,10 @@ -use crate::error::execution::ExecutionError; use crate::error::Error; use crate::platform_types::platform::PlatformRef; use crate::rpc::core::CoreRPCLike; use crate::rpc::signature::CoreSignatureVerification; -use dpp::consensus::basic::identity::{ - IdentityAssetLockTransactionOutPointAlreadyExistsError, - InvalidInstantAssetLockProofSignatureError, -}; +use dpp::consensus::basic::identity::InvalidInstantAssetLockProofSignatureError; use dpp::identity::state_transition::asset_lock_proof::InstantAssetLockProof; -use dpp::platform_value::Bytes36; + use dpp::validation::SimpleConsensusValidationResult; use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/verify_is_not_spent/instant/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/verify_is_not_spent/instant/mod.rs index cff397074b..3896860342 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/verify_is_not_spent/instant/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/verify_is_not_spent/instant/mod.rs @@ -1,7 +1,7 @@ use crate::error::execution::ExecutionError; use crate::error::Error; use crate::platform_types::platform::PlatformRef; -use crate::rpc::core::CoreRPCLike; + use dpp::consensus::basic::identity::{ IdentityAssetLockTransactionOutPointAlreadyExistsError, }; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/verify_is_not_spent/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/verify_is_not_spent/mod.rs index 9a864e4492..b3bb74b03d 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/verify_is_not_spent/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/verify_is_not_spent/mod.rs @@ -3,7 +3,7 @@ mod instant; use crate::error::Error; use crate::platform_types::platform::PlatformRef; -use crate::rpc::core::CoreRPCLike; + use dpp::prelude::AssetLockProof; use dpp::validation::SimpleConsensusValidationResult; use dpp::version::PlatformVersion; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs index f9d712bc9a..83da291026 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs @@ -4,20 +4,19 @@ use crate::execution::validation::state_transition::transformer::StateTransition use crate::platform_types::platform::{PlatformRef, PlatformStateRef}; use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::rpc::core::CoreRPCLike; -use dpp::identity::{KeyType, PartialIdentity}; +use dpp::identity::PartialIdentity; use dpp::prelude::ConsensusValidationResult; +use crate::error::execution::ExecutionError; use dpp::serialization::Signable; -use dpp::state_transition::{StateTransition}; -use drive::state_transition_action::StateTransitionAction; +use dpp::state_transition::StateTransition; use dpp::validation::SimpleConsensusValidationResult; use dpp::version::{DefaultForPlatformVersion, PlatformVersion}; use drive::drive::Drive; use drive::grovedb::TransactionArg; -use crate::error::execution::ExecutionError; -use crate::execution::types::execution_operation::ExecutionOperation; -use crate::execution::types::execution_operation::signature_verification_operation::SignatureVerificationOperation; -use crate::execution::types::state_transition_execution_context::{StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0}; +use drive::state_transition_action::StateTransitionAction; + +use crate::execution::types::state_transition_execution_context::{StateTransitionExecutionContext}; use crate::execution::validation::state_transition::common::validate_state_transition_identity_signed::{ValidateStateTransitionIdentitySignature}; use crate::execution::validation::state_transition::state_transitions::identity_update::identity_and_signatures::v0::IdentityUpdateStateTransitionIdentityAndSignaturesValidationV0; use crate::execution::validation::state_transition::state_transitions::identity_create::identity_and_signatures::v0::IdentityCreateStateTransitionIdentityAndSignaturesValidationV0; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs index cd571da9b8..e555f1436a 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs @@ -486,7 +486,7 @@ mod tests { StateError::DataContractConfigUpdateError, 1 ); - let error = errors.get(0).expect("to have an error"); + let error = errors.first().expect("to have an error"); assert_eq!( error.additional_message(), "contract can not change whether it keeps history: changing from true to false" diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/mod.rs index 0cc6304e02..9920418f53 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/mod.rs @@ -1,7 +1,7 @@ use dpp::validation::SimpleValidationResult; -///! Data triggers implement custom validation logic for state transitions -///! that modifies documents in a specific data contract. -///! Data triggers can be assigned based on the data contract ID, document type, and action. +/// Data triggers implement custom validation logic for state transitions +/// that modifies documents in a specific data contract. +/// Data triggers can be assigned based on the data contract ID, document type, and action. use drive::state_transition_action::document::documents_batch::document_transition::DocumentTransitionAction; use crate::error::Error; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/v0/mod.rs index feab7c074c..a4afc463f1 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/v0/mod.rs @@ -1,4 +1,4 @@ -///! The `dashpay_data_triggers` module contains data triggers specific to the DashPay data contract. +//! The `dashpay_data_triggers` module contains data triggers specific to the DashPay data contract. use crate::error::execution::ExecutionError; use crate::error::Error; use crate::platform_types::platform_state::v0::PlatformStateV0Methods; @@ -180,7 +180,7 @@ mod test { vec![(contact_request_document, document_type, Bytes32::default())], )]); let document_transition = document_transitions - .get(0) + .first() .expect("document transition should be present"); let document_create_transition = document_transition @@ -267,7 +267,7 @@ mod test { vec![(contact_request_document, document_type, Bytes32::default())], )]); let document_transition = document_transitions - .get(0) + .first() .expect("document transition should be present"); let document_create_transition = document_transition @@ -316,7 +316,7 @@ mod test { assert!(matches!( &result.errors.first().unwrap(), &DataTriggerError::DataTriggerConditionError(e) if { - e.message() == &format!("Identity {owner_id} must not be equal to owner id") + e.message() == format!("Identity {owner_id} must not be equal to owner id") } )); } @@ -379,7 +379,7 @@ mod test { vec![(contact_request_document, document_type, Bytes32::default())], )]); let document_transition = document_transitions - .get(0) + .first() .expect("document transition should be present"); let document_create_transition = document_transition @@ -414,7 +414,7 @@ mod test { assert!(matches!( data_trigger_error, DataTriggerError::DataTriggerConditionError(e) if { - e.message() == &format!("Identity {contract_request_to_user_id} doesn't exist") + e.message() == format!("Identity {contract_request_to_user_id} doesn't exist") } )); } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs index 419f9b1c9f..dcd5f5163e 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs @@ -416,7 +416,7 @@ mod test { DocumentTransitionActionType::Create, vec![(document, document_type, Bytes32::default())], )]); - let first_transition = transitions.get(0).expect("transition should be present"); + let first_transition = transitions.first().expect("transition should be present"); let document_create_transition = first_transition .as_transition_create() diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs index 3f70ebd708..add9218716 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs @@ -87,7 +87,7 @@ pub fn delete_withdrawal_data_trigger_v0( )? .documents_owned(); - let Some(withdrawal) = withdrawals.get(0) else { + let Some(withdrawal) = withdrawals.first() else { let err = DataTriggerConditionError::new( data_contract.id(), dt_delete.base().id(), @@ -129,7 +129,7 @@ mod tests { use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::document::serialization_traits::DocumentPlatformConversionMethodsV0; use dpp::document::{Document, DocumentV0Getters}; - use dpp::platform_value::{platform_value, Bytes32}; + use dpp::platform_value::platform_value; use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::{DocumentBaseTransitionAction, DocumentBaseTransitionActionV0}; use drive::state_transition_action::document::documents_batch::document_transition::document_delete_transition_action::DocumentDeleteTransitionAction; use drive::state_transition_action::document::documents_batch::document_transition::document_delete_transition_action::v0::DocumentDeleteTransitionActionV0; @@ -201,7 +201,7 @@ mod tests { let platform_version = PlatformVersion::first(); let data_contract = - load_system_data_contract(SystemDataContract::Withdrawals, &platform_version) + load_system_data_contract(SystemDataContract::Withdrawals, platform_version) .expect("to load system data contract"); let owner_id = data_contract.owner_id(); @@ -253,7 +253,7 @@ mod tests { .expect("should return a platform version"); let data_contract = - load_system_data_contract(SystemDataContract::Withdrawals, &platform_version) + load_system_data_contract(SystemDataContract::Withdrawals, platform_version) .expect("to load system data contract"); let owner_id = data_contract.owner_id(); diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/state/v0/mod.rs index 97f654619a..b7e249c1f2 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/state/v0/mod.rs @@ -14,7 +14,7 @@ use dpp::identity::state_transition::AssetLockProved; use dpp::prelude::ConsensusValidationResult; use dpp::serialization::Signable; use dpp::state_transition::identity_create_transition::accessors::IdentityCreateTransitionAccessorsV0; -use dpp::state_transition::identity_create_transition::methods::IdentityCreateTransitionMethodsV0; + use dpp::state_transition::identity_create_transition::IdentityCreateTransition; use dpp::state_transition::{StateTransition, StateTransitionLike}; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/state/v0/mod.rs index 6532f3ba87..564ca18b08 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/state/v0/mod.rs @@ -12,7 +12,7 @@ use dpp::identity::KeyType; use dpp::prelude::ConsensusValidationResult; use dpp::serialization::Signable; -use dpp::state_transition::identity_topup_transition::methods::IdentityTopUpTransitionMethodsV0; + use dpp::state_transition::identity_topup_transition::IdentityTopUpTransition; use dpp::state_transition::{StateTransition, StateTransitionLike}; diff --git a/packages/rs-drive-abci/src/logging/destination.rs b/packages/rs-drive-abci/src/logging/destination.rs index 200a2b538d..26f5e3c070 100644 --- a/packages/rs-drive-abci/src/logging/destination.rs +++ b/packages/rs-drive-abci/src/logging/destination.rs @@ -219,7 +219,7 @@ impl LogDestinationWriter { } LogDestinationWriter::RotationWriter(w) => { let paths = w.0.lock().unwrap().log_paths(); - let path = paths.get(0).expect("exactly one path excepted"); + let path = paths.first().expect("exactly one path excepted"); fs::read_to_string(path).unwrap() } _ => todo!(), diff --git a/packages/rs-drive-abci/src/platform_types/commit/v0/mod.rs b/packages/rs-drive-abci/src/platform_types/commit/v0/mod.rs index 07bb19c51b..0d0513aa47 100644 --- a/packages/rs-drive-abci/src/platform_types/commit/v0/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/commit/v0/mod.rs @@ -37,7 +37,7 @@ impl CommitV0 { quorum_type, inner: proto::types::Commit { - block_id: Some(block_id.try_into().expect("cannot convert block id")), + block_id: Some(block_id.into()), height: height as i64, round: ci.round as i32, // we need to "un-reverse" quorum hash, as it was reversed in [CleanedCommitInfo::try_from] diff --git a/packages/rs-drive-abci/src/platform_types/platform_state/mod.rs b/packages/rs-drive-abci/src/platform_types/platform_state/mod.rs index 8c7bf8ddc5..4a7b87d463 100644 --- a/packages/rs-drive-abci/src/platform_types/platform_state/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/platform_state/mod.rs @@ -13,9 +13,7 @@ use dpp::bincode::{config, Decode, Encode}; use dpp::block::epoch::Epoch; use dpp::block::extended_block_info::ExtendedBlockInfo; use dpp::dashcore::{ProTxHash, QuorumHash}; -use dpp::serialization::{ - PlatformDeserializable, PlatformDeserializableFromVersionedStructure, PlatformSerializable, -}; +use dpp::serialization::{PlatformDeserializableFromVersionedStructure, PlatformSerializable}; use dpp::util::deserializer::ProtocolVersion; use dpp::version::{PlatformVersion, TryFromPlatformVersioned, TryIntoPlatformVersioned}; diff --git a/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs b/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs index 2cb112bdaf..556f81da55 100644 --- a/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs @@ -19,7 +19,7 @@ use dpp::block::block_info::{BlockInfo, DEFAULT_BLOCK_INFO}; use dpp::block::extended_block_info::v0::ExtendedBlockInfoV0Getters; use dpp::bls_signatures::PublicKey as ThresholdBlsPublicKey; use dpp::version::{PlatformVersion, TryIntoPlatformVersioned}; -use drive::grovedb::batch::Op; + use std::collections::BTreeMap; use std::fmt::{Debug, Formatter}; diff --git a/packages/rs-drive-abci/src/query/mod.rs b/packages/rs-drive-abci/src/query/mod.rs index 9d3225e674..6bc247b75b 100644 --- a/packages/rs-drive-abci/src/query/mod.rs +++ b/packages/rs-drive-abci/src/query/mod.rs @@ -368,7 +368,7 @@ mod tests { mod identity_balance { use crate::error::query::QueryError; - use bs58::encode; + use dapi_grpc::platform::v0::get_identity_balance_request::{ GetIdentityBalanceRequestV0, Version, }; @@ -458,7 +458,6 @@ mod tests { mod identity_balance_and_revision { use crate::error::query::QueryError; - use bs58::encode; use dapi_grpc::platform::v0::get_identity_balance_and_revision_request::{ GetIdentityBalanceAndRevisionRequestV0, Version, }; @@ -1711,7 +1710,7 @@ mod tests { ContractRequest, DocumentRequest, IdentityRequest, }; use dapi_grpc::platform::v0::get_proofs_request::{GetProofsRequestV0, Version}; - use dapi_grpc::platform::v0::{get_proofs_response, GetProofsRequest, GetProofsResponse}; + use dapi_grpc::platform::v0::{GetProofsRequest, GetProofsResponse}; use dapi_grpc::platform::VersionedGrpcResponse; use prost::Message; diff --git a/packages/rs-drive-abci/src/rpc/core.rs b/packages/rs-drive-abci/src/rpc/core.rs index 4693c20ffb..48e3e839be 100644 --- a/packages/rs-drive-abci/src/rpc/core.rs +++ b/packages/rs-drive-abci/src/rpc/core.rs @@ -1,17 +1,15 @@ use dashcore_rpc::dashcore::ephemerealdata::chain_lock::ChainLock; use dashcore_rpc::dashcore::{Block, BlockHash, QuorumHash, Transaction, Txid}; use dashcore_rpc::dashcore_rpc_json::{ - AssetUnlockStatusResult, ExtendedQuorumDetails, ExtendedQuorumListResult, - GetBestChainLockResult, GetChainTipsResult, GetTransactionLockedResult, MasternodeListDiff, - MnSyncStatus, QuorumInfoResult, QuorumType, SoftforkInfo, + AssetUnlockStatusResult, ExtendedQuorumDetails, ExtendedQuorumListResult, GetChainTipsResult, + MasternodeListDiff, MnSyncStatus, QuorumInfoResult, QuorumType, SoftforkInfo, }; use dashcore_rpc::json::GetRawTransactionResult; use dashcore_rpc::{Auth, Client, Error, RpcApi}; -use dpp::dashcore::{hashes::Hash, InstantLock}; +use dpp::dashcore::InstantLock; use serde_json::Value; use std::collections::HashMap; use std::time::Duration; -use tenderdash_abci::proto::types::CoreChainLock; /// Information returned by QuorumListExtended pub type QuorumListExtendedInfo = HashMap; diff --git a/packages/rs-drive-abci/tests/strategy_tests/chain_lock_update.rs b/packages/rs-drive-abci/tests/strategy_tests/chain_lock_update.rs index a6a3e57e89..38e902fdb0 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/chain_lock_update.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/chain_lock_update.rs @@ -1,15 +1,11 @@ #[cfg(test)] mod tests { - use dpp::dashcore::hashes::Hash; - use dpp::dashcore::{BlockHash, ChainLock}; - use tenderdash_abci::proto::types::CoreChainLock; use crate::execution::run_chain_for_strategy; use crate::strategy::CoreHeightIncrease::RandomCoreHeightIncrease; use crate::strategy::{MasternodeListChangesStrategy, NetworkStrategy}; use drive_abci::config::{ExecutionConfig, PlatformConfig, PlatformTestConfig}; - use drive_abci::platform_types::platform_state::v0::PlatformStateV0Methods; - use drive_abci::platform_types::validator_set::v0::ValidatorSetV0Getters; + use drive_abci::test::helpers::setup::TestPlatformBuilder; use strategy_tests::frequency::Frequency; use strategy_tests::Strategy; diff --git a/packages/rs-drive-abci/tests/strategy_tests/core_update_tests.rs b/packages/rs-drive-abci/tests/strategy_tests/core_update_tests.rs index 9c09750625..4f4e4b8bba 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/core_update_tests.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/core_update_tests.rs @@ -1,8 +1,5 @@ #[cfg(test)] mod tests { - use dpp::dashcore::hashes::Hash; - use dpp::dashcore::{BlockHash, ChainLock}; - use tenderdash_abci::proto::types::CoreChainLock; use crate::execution::run_chain_for_strategy; use crate::strategy::CoreHeightIncrease::RandomCoreHeightIncrease; diff --git a/packages/rs-drive-abci/tests/strategy_tests/execution.rs b/packages/rs-drive-abci/tests/strategy_tests/execution.rs index 4d4ac7c6ff..bc0573098b 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/execution.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/execution.rs @@ -557,7 +557,7 @@ pub(crate) fn run_chain_for_strategy( .as_slice() .try_into() .expect("Expected a byte array of length 32"); - (quorum_hash.clone(), fixed_bytes) + (*quorum_hash, fixed_bytes) }) .collect(); @@ -579,7 +579,7 @@ pub(crate) fn run_chain_for_strategy( let block_hash = *core_blocks .get(&block_height) - .expect(format!("expected a block hash to be known for {}", core_height).as_str()); + .unwrap_or_else(|| panic!("expected a block hash to be known for {}", core_height)); let chain_lock = if sign_chain_locks { // From DIP 8: https://github.com/dashpay/dips/blob/master/dip-0008.md#finalization-of-signed-blocks @@ -654,7 +654,7 @@ pub(crate) fn run_chain_for_strategy( platform .core_rpc .expect_submit_chain_lock() - .returning(move |chain_lock: &ChainLock| return Ok(chain_lock.block_height)); + .returning(move |chain_lock: &ChainLock| Ok(chain_lock.block_height)); create_chain_for_strategy( platform, @@ -952,7 +952,7 @@ pub(crate) fn continue_chain_for_strategy( let MimicExecuteBlockOutcome { state_transaction_results, - withdrawal_transactions: mut withdrawals_this_block, + withdrawal_transactions: withdrawals_this_block, validator_set_update, next_validator_set_hash, root_app_hash, diff --git a/packages/rs-drive-abci/tests/strategy_tests/failures.rs b/packages/rs-drive-abci/tests/strategy_tests/failures.rs index bf8df7f8a4..82199d963e 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/failures.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/failures.rs @@ -11,14 +11,14 @@ mod tests { use drive_abci::config::{ExecutionConfig, PlatformConfig, PlatformTestConfig}; - use crate::strategy::CoreHeightIncrease::{KnownCoreHeightIncreases, NoCoreHeightIncrease}; + use crate::strategy::CoreHeightIncrease::KnownCoreHeightIncreases; use dpp::dashcore::hashes::Hash; use dpp::dashcore::{BlockHash, ChainLock}; use dpp::data_contract::accessors::v0::{DataContractV0Getters, DataContractV0Setters}; use dpp::data_contract::document_type::random_document::{ DocumentFieldFillSize, DocumentFieldFillType, }; - use dpp::data_contracts::SystemDataContract; + use dpp::identity::accessors::IdentityGettersV0; use dpp::platform_value::Value; use dpp::prelude::Identity; @@ -27,7 +27,6 @@ mod tests { use drive_abci::test::helpers::setup::TestPlatformBuilder; use simple_signer::signer::SimpleSigner; use strategy_tests::operations::{DocumentAction, DocumentOp, Operation, OperationType}; - use tenderdash_abci::proto::types::CoreChainLock; #[test] fn run_chain_insert_one_new_identity_and_a_contract_with_bad_update() { diff --git a/packages/rs-drive-abci/tests/strategy_tests/main.rs b/packages/rs-drive-abci/tests/strategy_tests/main.rs index 3a749b6fc8..e1eb94857a 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/main.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/main.rs @@ -62,6 +62,13 @@ mod verify_state_transitions; pub type BlockHeight = u64; +fn asset_unlock_index(tx: &Transaction) -> u64 { + let Some(AssetUnlockPayloadType(ref payload)) = tx.special_transaction_payload else { + panic!("expected to get AssetUnlockPayloadType"); + }; + payload.base.index +} + #[cfg(test)] mod tests { use super::*; @@ -96,14 +103,13 @@ mod tests { use drive::drive::config::DEFAULT_QUERY_LIMIT; use drive::drive::identity::withdrawals::WithdrawalTransactionIndex; use drive_abci::config::{ExecutionConfig, PlatformTestConfig}; - use drive_abci::error::execution::ExecutionError; - use drive_abci::error::Error; + use drive_abci::logging::LogLevel; use drive_abci::platform_types::platform_state::v0::PlatformStateV0Methods; use drive_abci::rpc::core::QuorumListExtendedInfo; use itertools::Itertools; use tenderdash_abci::proto::abci::{RequestInfo, ResponseInfo}; - use tenderdash_abci::proto::types::CoreChainLock; + use tenderdash_abci::Application; pub fn generate_quorums_extended_info(n: u32) -> QuorumListExtendedInfo { @@ -2247,7 +2253,7 @@ mod tests { .unwrap() .asset_unlock_statuses .get(index) - .map(|status| status.clone()) + .cloned() .unwrap() }) .collect()) @@ -2293,7 +2299,7 @@ mod tests { platform_version, ) .unwrap(); - assert!(withdrawal_documents_pooled.len() > 0); + assert!(!withdrawal_documents_pooled.is_empty()); let pooled_withdrawals = withdrawal_documents_pooled.len(); (outcome, pooled_withdrawals) @@ -2431,7 +2437,7 @@ mod tests { .unwrap(); // In this block we should have new withdrawals pooled - assert!(withdrawal_documents_pooled.len() > 0); + assert!(!withdrawal_documents_pooled.is_empty()); // And extra withdrawals broadcasted let withdrawals_broadcasted_expected = @@ -2551,7 +2557,7 @@ mod tests { .unwrap(); // In this block we should have new withdrawals pooled - assert!(withdrawal_documents_pooled.len() > 0); + assert!(!withdrawal_documents_pooled.is_empty()); // And some withdrawals completed let withdrawals_completed_expected = @@ -2600,16 +2606,7 @@ mod tests { // Run block 6. // Tests withdrawal expiration - let ChainExecutionOutcome { - abci_app, - proposers, - quorums, - current_quorum_hash, - current_proposer_versions, - end_time_ms, - withdrawals, - .. - } = { + let ChainExecutionOutcome { .. } = { let outcome = continue_chain_for_strategy( abci_app, ChainExecutionParameters { @@ -2677,7 +2674,7 @@ mod tests { .unwrap(); // In this block we should have new withdrawals pooled - assert!(withdrawal_documents_pooled.len() > 0); + assert!(!withdrawal_documents_pooled.is_empty()); // Amount of completed withdrawals stays the same as in the last block assert_eq!( @@ -3306,7 +3303,7 @@ mod tests { let outcome = run_chain_for_strategy(&mut platform, 15, strategy, config, 15); - let balances = &outcome + let _balances = &outcome .abci_app .platform .drive @@ -3364,10 +3361,3 @@ mod tests { assert_eq!(state_transitions.len(), 3); } } - -fn asset_unlock_index(tx: &Transaction) -> u64 { - let Some(AssetUnlockPayloadType(ref payload)) = tx.special_transaction_payload else { - panic!("expected to get AssetUnlockPayloadType"); - }; - payload.base.index -} diff --git a/packages/rs-drive-abci/tests/strategy_tests/masternodes.rs b/packages/rs-drive-abci/tests/strategy_tests/masternodes.rs index 75acbf8a11..d240752a26 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/masternodes.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/masternodes.rs @@ -486,18 +486,14 @@ pub fn generate_test_masternodes( SocketAddr::new(IpAddr::V4(random_ip), old_port); } if update.p2p_port { - hpmn_list_item_b - .state - .platform_p2p_port - .as_mut() - .map(|port| *port += 1); + if let Some(port) = hpmn_list_item_b.state.platform_p2p_port.as_mut() { + *port += 1 + } } if update.http_port { - hpmn_list_item_b - .state - .platform_http_port - .as_mut() - .map(|port| *port += 1); + if let Some(port) = hpmn_list_item_b.state.platform_http_port.as_mut() { + *port += 1 + } } latest_masternode_list_item = hpmn_list_item_b.clone(); diff --git a/packages/rs-drive-abci/tests/strategy_tests/query.rs b/packages/rs-drive-abci/tests/strategy_tests/query.rs index 9ecef4c714..aa6d0cb822 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/query.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/query.rs @@ -351,9 +351,7 @@ mod tests { use strategy_tests::Strategy; use crate::strategy::CoreHeightIncrease::RandomCoreHeightIncrease; - use dpp::dashcore::hashes::Hash; - use dpp::dashcore::{BlockHash, ChainLock}; - use tenderdash_abci::proto::types::CoreChainLock; + use tenderdash_abci::Application; macro_rules! extract_single_variant_or_panic { diff --git a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs index 5dcc6c55f8..a2b09b9763 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs @@ -1,7 +1,7 @@ use crate::masternodes::MasternodeListItemWithUpdates; use crate::query::QueryStrategy; use crate::BlockHeight; -use dashcore_rpc::dashcore; + use dashcore_rpc::dashcore::{ProTxHash, QuorumHash}; use dpp::block::block_info::BlockInfo; @@ -197,7 +197,7 @@ impl CoreHeightIncrease { } CoreHeightIncrease::KnownCoreHeightIncreases(values) => { if values.len() == 1 { - *values.get(0).unwrap() + *values.first().unwrap() } else { values.pop().unwrap() } diff --git a/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs b/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs index e3954dfd10..79796d00af 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs @@ -5,7 +5,6 @@ mod tests { use dpp::dashcore::{BlockHash, ChainLock}; use dpp::version::PlatformVersion; use drive::drive::config::DriveConfig; - use tenderdash_abci::proto::types::CoreChainLock; use crate::execution::{continue_chain_for_strategy, run_chain_for_strategy}; use crate::strategy::{ diff --git a/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs b/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs index 950b8138a7..ac834290a9 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs @@ -6,7 +6,7 @@ use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::document::Document; use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; -use dpp::identity::PartialIdentity; + use dpp::state_transition::StateTransition; use dpp::version::PlatformVersion; use drive::drive::identity::key::fetch::IdentityKeysRequest; diff --git a/packages/rs-drive-proof-verifier/src/proof.rs b/packages/rs-drive-proof-verifier/src/proof.rs index 005b678796..c26547e1d3 100644 --- a/packages/rs-drive-proof-verifier/src/proof.rs +++ b/packages/rs-drive-proof-verifier/src/proof.rs @@ -29,7 +29,7 @@ use dpp::version::PlatformVersion; use drive::drive::identity::key::fetch::{ IdentityKeysRequest, KeyKindRequestType, KeyRequestType, PurposeU8, SecurityLevelU8, }; -pub use drive::drive::verify::RootHash; + use drive::drive::Drive; use drive::query::DriveQuery; diff --git a/packages/rs-drive-proof-verifier/src/verify.rs b/packages/rs-drive-proof-verifier/src/verify.rs index 51cb55d909..534e5056ff 100644 --- a/packages/rs-drive-proof-verifier/src/verify.rs +++ b/packages/rs-drive-proof-verifier/src/verify.rs @@ -1,6 +1,6 @@ use dapi_grpc::platform::v0::{Proof, ResponseMetadata}; use dpp::bls_signatures; -pub use drive::drive::verify::RootHash; + use tenderdash_abci::{ proto::types::{CanonicalVote, SignedMsgType, StateId}, signatures::{Hashable, Signable}, diff --git a/packages/rs-drive/src/drive/balances/mod.rs b/packages/rs-drive/src/drive/balances/mod.rs index 24970fe316..75c1d02e24 100644 --- a/packages/rs-drive/src/drive/balances/mod.rs +++ b/packages/rs-drive/src/drive/balances/mod.rs @@ -4,28 +4,18 @@ #[cfg(feature = "full")] mod add_to_system_credits; -#[cfg(feature = "full")] -pub use add_to_system_credits::*; #[cfg(feature = "full")] mod add_to_system_credits_operations; -#[cfg(feature = "full")] -pub use add_to_system_credits_operations::*; #[cfg(feature = "full")] mod remove_from_system_credits; -#[cfg(feature = "full")] -pub use remove_from_system_credits::*; #[cfg(feature = "full")] mod remove_from_system_credits_operations; -#[cfg(feature = "full")] -pub use remove_from_system_credits_operations::*; #[cfg(feature = "full")] mod calculate_total_credits_balance; -#[cfg(feature = "full")] -pub use calculate_total_credits_balance::*; #[cfg(any(feature = "full", feature = "verify"))] use crate::drive::RootTree; diff --git a/packages/rs-drive/src/drive/batch/drive_op_batch/document.rs b/packages/rs-drive/src/drive/batch/drive_op_batch/document.rs index b5fc6a2772..6945edd286 100644 --- a/packages/rs-drive/src/drive/batch/drive_op_batch/document.rs +++ b/packages/rs-drive/src/drive/batch/drive_op_batch/document.rs @@ -16,7 +16,6 @@ use dpp::prelude::Identifier; use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; -use dpp::data_contracts::SystemDataContract; use dpp::version::PlatformVersion; use grovedb::batch::KeyInfoPath; use grovedb::{EstimatedLayerInformation, TransactionArg}; diff --git a/packages/rs-drive/src/drive/batch/drive_op_batch/drive_methods/mod.rs b/packages/rs-drive/src/drive/batch/drive_op_batch/drive_methods/mod.rs index 9f5f5f3fac..b58a435e66 100644 --- a/packages/rs-drive/src/drive/batch/drive_op_batch/drive_methods/mod.rs +++ b/packages/rs-drive/src/drive/batch/drive_op_batch/drive_methods/mod.rs @@ -1,5 +1,2 @@ mod apply_drive_operations; mod convert_drive_operations_to_grove_operations; - -pub use apply_drive_operations::*; -pub use convert_drive_operations_to_grove_operations::*; diff --git a/packages/rs-drive/src/drive/batch/grovedb_op_batch/mod.rs b/packages/rs-drive/src/drive/batch/grovedb_op_batch/mod.rs index 215fd9bfe7..9c16b1ff61 100644 --- a/packages/rs-drive/src/drive/batch/grovedb_op_batch/mod.rs +++ b/packages/rs-drive/src/drive/batch/grovedb_op_batch/mod.rs @@ -277,7 +277,7 @@ impl GroveDbOpBatchV0Methods for GroveDbOpBatch { if let Some(index) = self .operations .iter() - .position(|op| &op.path == &path && op.key == KeyInfo::KnownKey(key.to_vec())) + .position(|op| op.path == path && op.key == KeyInfo::KnownKey(key.to_vec())) { Some(self.operations.remove(index).op) } else { @@ -307,7 +307,7 @@ impl GroveDbOpBatchV0Methods for GroveDbOpBatch { if let Some(index) = self .operations .iter() - .position(|op| &op.path == &path && op.key == KeyInfo::KnownKey(key.to_vec())) + .position(|op| op.path == path && op.key == KeyInfo::KnownKey(key.to_vec())) { let op = &self.operations[index].op; let op = if matches!( diff --git a/packages/rs-drive/src/drive/contract/estimation_costs/mod.rs b/packages/rs-drive/src/drive/contract/estimation_costs/mod.rs index 43fcd9c603..11258554b4 100644 --- a/packages/rs-drive/src/drive/contract/estimation_costs/mod.rs +++ b/packages/rs-drive/src/drive/contract/estimation_costs/mod.rs @@ -1,3 +1,2 @@ /// The estimated costs for a contract insert mod add_estimation_costs_for_contract_insertion; -pub use add_estimation_costs_for_contract_insertion::*; diff --git a/packages/rs-drive/src/drive/contract/prove/mod.rs b/packages/rs-drive/src/drive/contract/prove/mod.rs index e1776aff43..6b3e674d2d 100644 --- a/packages/rs-drive/src/drive/contract/prove/mod.rs +++ b/packages/rs-drive/src/drive/contract/prove/mod.rs @@ -1,11 +1,8 @@ /// The `prove_contract` module provides functionality for getting a proved contract. mod prove_contract; -pub use prove_contract::*; /// The `prove_contract_history` module provides functionality for getting contract historical proofs. mod prove_contract_history; -pub use prove_contract_history::*; /// The `prove_contract` module provides functionality for getting multiple proved contracts. mod prove_contracts; -pub use prove_contracts::*; diff --git a/packages/rs-drive/src/drive/contract/prove/prove_contract/v0/mod.rs b/packages/rs-drive/src/drive/contract/prove/prove_contract/v0/mod.rs index a80e7bc13a..cf0af39734 100644 --- a/packages/rs-drive/src/drive/contract/prove/prove_contract/v0/mod.rs +++ b/packages/rs-drive/src/drive/contract/prove/prove_contract/v0/mod.rs @@ -50,7 +50,7 @@ impl Drive { ); match result { Ok(_) => Ok(contract_proof), - Err(Error::GroveDB(grovedb::Error::WrongElementType(s))) if s == "expected an item" => { + Err(Error::GroveDB(grovedb::Error::WrongElementType("expected an item"))) => { // In this case we are trying to prove a historical type contract let contract_query = Self::fetch_contract_with_history_latest_query(contract_id, true); diff --git a/packages/rs-drive/src/drive/credit_pools/pending_epoch_refunds/mod.rs b/packages/rs-drive/src/drive/credit_pools/pending_epoch_refunds/mod.rs index 27cc0484b0..81a2f38751 100644 --- a/packages/rs-drive/src/drive/credit_pools/pending_epoch_refunds/mod.rs +++ b/packages/rs-drive/src/drive/credit_pools/pending_epoch_refunds/mod.rs @@ -41,6 +41,4 @@ mod methods; mod operations; mod paths; -pub use methods::*; -pub use operations::*; pub use paths::*; diff --git a/packages/rs-drive/src/drive/document/delete/mod.rs b/packages/rs-drive/src/drive/document/delete/mod.rs index 8f88c41c9a..62f1eb61bf 100644 --- a/packages/rs-drive/src/drive/document/delete/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/mod.rs @@ -35,52 +35,42 @@ // Module: delete_document_for_contract // This module contains functionality for deleting a document associated with a given contract mod delete_document_for_contract; -pub use delete_document_for_contract::*; // Module: delete_document_for_contract_id // This module contains functionality for deleting a document associated with a given contract id mod delete_document_for_contract_id; -pub use delete_document_for_contract_id::*; // Module: delete_document_for_contract_apply_and_add_to_operations // This module contains functionality to apply a delete operation and add to the operations of a contract mod delete_document_for_contract_apply_and_add_to_operations; -pub use delete_document_for_contract_apply_and_add_to_operations::*; // Module: remove_document_from_primary_storage // This module contains functionality to remove a document from primary storage mod remove_document_from_primary_storage; -pub use remove_document_from_primary_storage::*; // Module: remove_reference_for_index_level_for_contract_operations // This module contains functionality to remove a reference for an index level for contract operations mod remove_reference_for_index_level_for_contract_operations; -pub use remove_reference_for_index_level_for_contract_operations::*; // Module: remove_indices_for_index_level_for_contract_operations // This module contains functionality to remove indices for an index level for contract operations mod remove_indices_for_index_level_for_contract_operations; -pub use remove_indices_for_index_level_for_contract_operations::*; // Module: remove_indices_for_top_index_level_for_contract_operations // This module contains functionality to remove indices for the top index level for contract operations mod remove_indices_for_top_index_level_for_contract_operations; -pub use remove_indices_for_top_index_level_for_contract_operations::*; // Module: delete_document_for_contract_id_with_named_type_operations // This module contains functionality to delete a document for a contract id with named type operations mod delete_document_for_contract_id_with_named_type_operations; -pub use delete_document_for_contract_id_with_named_type_operations::*; // Module: delete_document_for_contract_with_named_type_operations // This module contains functionality to delete a document for a contract with named type operations mod delete_document_for_contract_with_named_type_operations; -pub use delete_document_for_contract_with_named_type_operations::*; // Module: delete_document_for_contract_operations // This module contains functionality to delete a document for contract operations mod delete_document_for_contract_operations; -pub use delete_document_for_contract_operations::*; mod internal; diff --git a/packages/rs-drive/src/drive/document/estimation_costs/mod.rs b/packages/rs-drive/src/drive/document/estimation_costs/mod.rs index 51c4069662..609c8ef518 100644 --- a/packages/rs-drive/src/drive/document/estimation_costs/mod.rs +++ b/packages/rs-drive/src/drive/document/estimation_costs/mod.rs @@ -1,5 +1,3 @@ mod stateless_delete_of_non_tree_for_costs; -pub use stateless_delete_of_non_tree_for_costs::*; mod add_estimation_costs_for_add_document_to_primary_storage; -pub use add_estimation_costs_for_add_document_to_primary_storage::*; diff --git a/packages/rs-drive/src/drive/document/index_uniqueness/mod.rs b/packages/rs-drive/src/drive/document/index_uniqueness/mod.rs index 0a35800771..1e84677b01 100644 --- a/packages/rs-drive/src/drive/document/index_uniqueness/mod.rs +++ b/packages/rs-drive/src/drive/document/index_uniqueness/mod.rs @@ -36,8 +36,7 @@ mod internal; mod validate_document_create_transition_action_uniqueness; -pub use validate_document_create_transition_action_uniqueness::*; + mod validate_document_replace_transition_action_uniqueness; -pub use validate_document_replace_transition_action_uniqueness::*; + mod validate_document_uniqueness; -pub use validate_document_uniqueness::*; diff --git a/packages/rs-drive/src/drive/document/insert/mod.rs b/packages/rs-drive/src/drive/document/insert/mod.rs index 8bff50895c..618d66c5e9 100644 --- a/packages/rs-drive/src/drive/document/insert/mod.rs +++ b/packages/rs-drive/src/drive/document/insert/mod.rs @@ -35,42 +35,34 @@ // Module: add_document // This module contains functionality for adding a document mod add_document; -pub use add_document::*; // Module: add_document_for_contract // This module contains functionality for adding a document for a given contract mod add_document_for_contract; -pub use add_document_for_contract::*; // Module: add_document_for_contract_apply_and_add_to_operations // This module contains functionality for applying and adding operations for a contract document mod add_document_for_contract_apply_and_add_to_operations; -pub use add_document_for_contract_apply_and_add_to_operations::*; // Module: add_document_for_contract_operations // This module contains functionality for adding a document for contract operations mod add_document_for_contract_operations; -pub use add_document_for_contract_operations::*; // Module: add_document_to_primary_storage // This module contains functionality for adding a document to primary storage mod add_document_to_primary_storage; -pub use add_document_to_primary_storage::*; // Module: add_indices_for_index_level_for_contract_operations // This module contains functionality for adding indices for an index level for contract operations mod add_indices_for_index_level_for_contract_operations; -pub use add_indices_for_index_level_for_contract_operations::*; // Module: add_indices_for_top_index_level_for_contract_operations // This module contains functionality for adding indices for the top index level for contract operations mod add_indices_for_top_index_level_for_contract_operations; -pub use add_indices_for_top_index_level_for_contract_operations::*; // Module: add_reference_for_index_level_for_contract_operations // This module contains functionality for adding a reference for an index level for contract operations mod add_reference_for_index_level_for_contract_operations; -pub use add_reference_for_index_level_for_contract_operations::*; #[cfg(all( feature = "fixtures-and-mocks", diff --git a/packages/rs-drive/src/drive/document/update/internal/update_document_for_contract_operations/v0/mod.rs b/packages/rs-drive/src/drive/document/update/internal/update_document_for_contract_operations/v0/mod.rs index 082b51ed4e..f6decc23b6 100644 --- a/packages/rs-drive/src/drive/document/update/internal/update_document_for_contract_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/update/internal/update_document_for_contract_operations/v0/mod.rs @@ -175,7 +175,7 @@ impl Drive { .iter() .map(|&x| Vec::from(x)) .collect(); - let top_index_property = index.properties.get(0).ok_or(Error::Drive( + let top_index_property = index.properties.first().ok_or(Error::Drive( DriveError::CorruptedContractIndexes("invalid contract indices"), ))?; index_path.push(Vec::from(top_index_property.name.as_bytes())); diff --git a/packages/rs-drive/src/drive/document/update/mod.rs b/packages/rs-drive/src/drive/document/update/mod.rs index d0eacee6ce..1f627982f0 100644 --- a/packages/rs-drive/src/drive/document/update/mod.rs +++ b/packages/rs-drive/src/drive/document/update/mod.rs @@ -36,30 +36,22 @@ // This module contains functionality for adding operations to update multiple documents #[cfg(feature = "full")] mod add_update_multiple_documents_operations; -#[cfg(feature = "full")] -pub use add_update_multiple_documents_operations::*; // Module: update_document_for_contract // This module contains functionality for updating a document for a given contract #[cfg(feature = "full")] mod update_document_for_contract; -#[cfg(feature = "full")] -pub use update_document_for_contract::*; // Module: update_document_for_contract_id // This module contains functionality for updating a document associated with a given contract id #[cfg(feature = "full")] mod update_document_for_contract_id; -#[cfg(feature = "full")] -pub use update_document_for_contract_id::*; // Module: update_document_with_serialization_for_contract // This module contains functionality for updating a document (with serialization) for a contract mod internal; mod update_document_with_serialization_for_contract; -pub use update_document_with_serialization_for_contract::*; - #[cfg(test)] mod tests { use grovedb::TransactionArg; diff --git a/packages/rs-drive/src/drive/identity/fetch/prove/prove_full_identity_by_unique_public_key_hash/v0/mod.rs b/packages/rs-drive/src/drive/identity/fetch/prove/prove_full_identity_by_unique_public_key_hash/v0/mod.rs index 1c0362898c..51a3f8f3ef 100644 --- a/packages/rs-drive/src/drive/identity/fetch/prove/prove_full_identity_by_unique_public_key_hash/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/fetch/prove/prove_full_identity_by_unique_public_key_hash/v0/mod.rs @@ -80,9 +80,7 @@ mod tests { .find(|public_key| public_key.key_type().is_unique_key_type()) .expect("expected a unique key") .hash() - .expect("expected to hash data") - .try_into() - .expect("expected to be 20 bytes"); + .expect("expected to hash data"); let proof = drive .prove_full_identity_by_unique_public_key_hash(first_key_hash, None, platform_version) diff --git a/packages/rs-drive/src/drive/identity/fetch/prove/prove_identity_id_by_unique_public_key_hash/v0/mod.rs b/packages/rs-drive/src/drive/identity/fetch/prove/prove_identity_id_by_unique_public_key_hash/v0/mod.rs index 34d5e219be..38ba9a005c 100644 --- a/packages/rs-drive/src/drive/identity/fetch/prove/prove_identity_id_by_unique_public_key_hash/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/fetch/prove/prove_identity_id_by_unique_public_key_hash/v0/mod.rs @@ -61,9 +61,7 @@ mod tests { .find(|public_key| public_key.key_type().is_unique_key_type()) .expect("expected a unique key") .hash() - .expect("expected to hash data") - .try_into() - .expect("expected to be 20 bytes"); + .expect("expected to hash data"); let proof = drive .prove_identity_id_by_unique_public_key_hash_v0( diff --git a/packages/rs-drive/src/drive/platform_state/mod.rs b/packages/rs-drive/src/drive/platform_state/mod.rs index eb34a17d33..d6a0ce16c4 100644 --- a/packages/rs-drive/src/drive/platform_state/mod.rs +++ b/packages/rs-drive/src/drive/platform_state/mod.rs @@ -1,7 +1,4 @@ mod fetch_platform_state_bytes; mod store_platform_state_bytes; -pub use fetch_platform_state_bytes::*; -pub use store_platform_state_bytes::*; - const PLATFORM_STATE_KEY: &[u8; 11] = b"saved_state"; diff --git a/packages/rs-drive/src/drive/system/protocol_version/mod.rs b/packages/rs-drive/src/drive/system/protocol_version/mod.rs index d561094fc8..82b984d14b 100644 --- a/packages/rs-drive/src/drive/system/protocol_version/mod.rs +++ b/packages/rs-drive/src/drive/system/protocol_version/mod.rs @@ -1,8 +1,7 @@ mod fetch_current_protocol_version; -pub use fetch_current_protocol_version::*; + mod fetch_next_protocol_version; -pub use fetch_next_protocol_version::*; + mod store_current_protocol_version; -pub use store_current_protocol_version::*; + mod set_next_protocol_version_operations; -pub use set_next_protocol_version_operations::*; diff --git a/packages/rs-drive/src/drive/system/protocol_version/store_current_protocol_version.rs b/packages/rs-drive/src/drive/system/protocol_version/store_current_protocol_version.rs index bb95476412..dd4b537a5a 100644 --- a/packages/rs-drive/src/drive/system/protocol_version/store_current_protocol_version.rs +++ b/packages/rs-drive/src/drive/system/protocol_version/store_current_protocol_version.rs @@ -1,4 +1,3 @@ -use crate::drive::grove_operations::BatchInsertApplyType; use crate::drive::object_size_info::PathKeyElementInfo; use crate::drive::system::misc_path; use crate::drive::system::misc_tree_constants::PROTOCOL_VERSION_STORAGE_KEY; diff --git a/packages/rs-drive/src/drive/verify/identity/verify_full_identities_by_public_key_hashes/mod.rs b/packages/rs-drive/src/drive/verify/identity/verify_full_identities_by_public_key_hashes/mod.rs index 85274d9d63..fd1b6c15aa 100644 --- a/packages/rs-drive/src/drive/verify/identity/verify_full_identities_by_public_key_hashes/mod.rs +++ b/packages/rs-drive/src/drive/verify/identity/verify_full_identities_by_public_key_hashes/mod.rs @@ -8,7 +8,7 @@ use crate::error::Error; use crate::drive::verify::RootHash; -pub use dpp::prelude::{Identity, Revision}; +pub use dpp::prelude::Identity; use dpp::version::PlatformVersion; diff --git a/packages/rs-drive/src/drive/verify/identity/verify_full_identities_by_public_key_hashes/v0/mod.rs b/packages/rs-drive/src/drive/verify/identity/verify_full_identities_by_public_key_hashes/v0/mod.rs index 24c41e3471..cbbf72ba6d 100644 --- a/packages/rs-drive/src/drive/verify/identity/verify_full_identities_by_public_key_hashes/v0/mod.rs +++ b/packages/rs-drive/src/drive/verify/identity/verify_full_identities_by_public_key_hashes/v0/mod.rs @@ -5,7 +5,7 @@ use crate::error::Error; use crate::drive::verify::RootHash; -pub use dpp::prelude::{Identity, Revision}; +pub use dpp::prelude::Identity; use dpp::version::PlatformVersion; diff --git a/packages/rs-drive/src/drive/verify/identity/verify_full_identity_by_identity_id/mod.rs b/packages/rs-drive/src/drive/verify/identity/verify_full_identity_by_identity_id/mod.rs index 8a43835193..23aa069a5f 100644 --- a/packages/rs-drive/src/drive/verify/identity/verify_full_identity_by_identity_id/mod.rs +++ b/packages/rs-drive/src/drive/verify/identity/verify_full_identity_by_identity_id/mod.rs @@ -8,7 +8,7 @@ use crate::error::Error; use crate::drive::verify::RootHash; -pub use dpp::prelude::{Identity, Revision}; +pub use dpp::prelude::Identity; use dpp::version::PlatformVersion; diff --git a/packages/rs-drive/src/drive/verify/identity/verify_full_identity_by_public_key_hash/mod.rs b/packages/rs-drive/src/drive/verify/identity/verify_full_identity_by_public_key_hash/mod.rs index 974d9c41b7..a84401becf 100644 --- a/packages/rs-drive/src/drive/verify/identity/verify_full_identity_by_public_key_hash/mod.rs +++ b/packages/rs-drive/src/drive/verify/identity/verify_full_identity_by_public_key_hash/mod.rs @@ -8,7 +8,7 @@ use crate::error::Error; use crate::drive::verify::RootHash; -pub use dpp::prelude::{Identity, Revision}; +pub use dpp::prelude::Identity; use dpp::version::PlatformVersion; diff --git a/packages/rs-drive/src/drive/verify/identity/verify_full_identity_by_public_key_hash/v0/mod.rs b/packages/rs-drive/src/drive/verify/identity/verify_full_identity_by_public_key_hash/v0/mod.rs index 21008f7516..9f8c971c81 100644 --- a/packages/rs-drive/src/drive/verify/identity/verify_full_identity_by_public_key_hash/v0/mod.rs +++ b/packages/rs-drive/src/drive/verify/identity/verify_full_identity_by_public_key_hash/v0/mod.rs @@ -4,7 +4,7 @@ use crate::error::Error; use crate::drive::verify::RootHash; -pub use dpp::prelude::{Identity, Revision}; +pub use dpp::prelude::Identity; use dpp::version::PlatformVersion; diff --git a/packages/rs-drive/src/drive/verify/identity/verify_identity_balance_for_identity_id/mod.rs b/packages/rs-drive/src/drive/verify/identity/verify_identity_balance_for_identity_id/mod.rs index c2336bc42c..4aa3d7a51f 100644 --- a/packages/rs-drive/src/drive/verify/identity/verify_identity_balance_for_identity_id/mod.rs +++ b/packages/rs-drive/src/drive/verify/identity/verify_identity_balance_for_identity_id/mod.rs @@ -8,8 +8,6 @@ use crate::error::Error; use crate::drive::verify::RootHash; -pub use dpp::prelude::{Identity, Revision}; - use dpp::version::PlatformVersion; impl Drive { diff --git a/packages/rs-drive/src/drive/verify/identity/verify_identity_balance_for_identity_id/v0/mod.rs b/packages/rs-drive/src/drive/verify/identity/verify_identity_balance_for_identity_id/v0/mod.rs index 93d8c5b228..89519d1e7f 100644 --- a/packages/rs-drive/src/drive/verify/identity/verify_identity_balance_for_identity_id/v0/mod.rs +++ b/packages/rs-drive/src/drive/verify/identity/verify_identity_balance_for_identity_id/v0/mod.rs @@ -7,8 +7,6 @@ use crate::error::Error; use crate::drive::verify::RootHash; -pub use dpp::prelude::{Identity, Revision}; - use grovedb::GroveDb; impl Drive { diff --git a/packages/rs-drive/src/drive/verify/identity/verify_identity_balances_for_identity_ids/mod.rs b/packages/rs-drive/src/drive/verify/identity/verify_identity_balances_for_identity_ids/mod.rs index 51da29aab8..d8adb1efac 100644 --- a/packages/rs-drive/src/drive/verify/identity/verify_identity_balances_for_identity_ids/mod.rs +++ b/packages/rs-drive/src/drive/verify/identity/verify_identity_balances_for_identity_ids/mod.rs @@ -9,8 +9,6 @@ use dpp::fee::Credits; use crate::drive::verify::RootHash; -pub use dpp::prelude::{Identity, Revision}; - use dpp::version::PlatformVersion; use std::iter::FromIterator; diff --git a/packages/rs-drive/src/drive/verify/identity/verify_identity_balances_for_identity_ids/v0/mod.rs b/packages/rs-drive/src/drive/verify/identity/verify_identity_balances_for_identity_ids/v0/mod.rs index 588e1ec865..3d265e802c 100644 --- a/packages/rs-drive/src/drive/verify/identity/verify_identity_balances_for_identity_ids/v0/mod.rs +++ b/packages/rs-drive/src/drive/verify/identity/verify_identity_balances_for_identity_ids/v0/mod.rs @@ -6,8 +6,6 @@ use dpp::fee::Credits; use crate::drive::verify::RootHash; -pub use dpp::prelude::{Identity, Revision}; - use grovedb::GroveDb; impl Drive { diff --git a/packages/rs-drive/src/drive/verify/identity/verify_identity_id_by_public_key_hash/mod.rs b/packages/rs-drive/src/drive/verify/identity/verify_identity_id_by_public_key_hash/mod.rs index 253b7aeba3..830fbc31b5 100644 --- a/packages/rs-drive/src/drive/verify/identity/verify_identity_id_by_public_key_hash/mod.rs +++ b/packages/rs-drive/src/drive/verify/identity/verify_identity_id_by_public_key_hash/mod.rs @@ -8,8 +8,6 @@ use crate::error::Error; use crate::drive::verify::RootHash; -pub use dpp::prelude::{Identity, Revision}; - use dpp::version::PlatformVersion; impl Drive { diff --git a/packages/rs-drive/src/drive/verify/identity/verify_identity_id_by_public_key_hash/v0/mod.rs b/packages/rs-drive/src/drive/verify/identity/verify_identity_id_by_public_key_hash/v0/mod.rs index 578f508ffa..fb83fac0dc 100644 --- a/packages/rs-drive/src/drive/verify/identity/verify_identity_id_by_public_key_hash/v0/mod.rs +++ b/packages/rs-drive/src/drive/verify/identity/verify_identity_id_by_public_key_hash/v0/mod.rs @@ -5,8 +5,6 @@ use crate::error::Error; use crate::drive::verify::RootHash; -pub use dpp::prelude::{Identity, Revision}; - use grovedb::GroveDb; impl Drive { diff --git a/packages/rs-drive/src/drive/verify/identity/verify_identity_ids_by_public_key_hashes/mod.rs b/packages/rs-drive/src/drive/verify/identity/verify_identity_ids_by_public_key_hashes/mod.rs index 7ea0494031..0087600433 100644 --- a/packages/rs-drive/src/drive/verify/identity/verify_identity_ids_by_public_key_hashes/mod.rs +++ b/packages/rs-drive/src/drive/verify/identity/verify_identity_ids_by_public_key_hashes/mod.rs @@ -8,8 +8,6 @@ use crate::error::Error; use crate::drive::verify::RootHash; -pub use dpp::prelude::{Identity, Revision}; - use dpp::version::PlatformVersion; use std::iter::FromIterator; diff --git a/packages/rs-drive/src/drive/verify/identity/verify_identity_ids_by_public_key_hashes/v0/mod.rs b/packages/rs-drive/src/drive/verify/identity/verify_identity_ids_by_public_key_hashes/v0/mod.rs index b6d9245e46..96ec383a40 100644 --- a/packages/rs-drive/src/drive/verify/identity/verify_identity_ids_by_public_key_hashes/v0/mod.rs +++ b/packages/rs-drive/src/drive/verify/identity/verify_identity_ids_by_public_key_hashes/v0/mod.rs @@ -5,8 +5,6 @@ use crate::error::Error; use crate::drive::verify::RootHash; -pub use dpp::prelude::{Identity, Revision}; - use grovedb::GroveDb; impl Drive { diff --git a/packages/rs-drive/src/drive/verify/identity/verify_identity_keys_by_identity_id/mod.rs b/packages/rs-drive/src/drive/verify/identity/verify_identity_keys_by_identity_id/mod.rs index 934c1ad035..d50813ca00 100644 --- a/packages/rs-drive/src/drive/verify/identity/verify_identity_keys_by_identity_id/mod.rs +++ b/packages/rs-drive/src/drive/verify/identity/verify_identity_keys_by_identity_id/mod.rs @@ -9,7 +9,6 @@ use crate::error::Error; use crate::drive::verify::RootHash; use dpp::identity::PartialIdentity; -pub use dpp::prelude::{Identity, Revision}; use dpp::version::PlatformVersion; diff --git a/packages/rs-drive/src/drive/verify/identity/verify_identity_keys_by_identity_id/v0/mod.rs b/packages/rs-drive/src/drive/verify/identity/verify_identity_keys_by_identity_id/v0/mod.rs index 280cc8addd..4aff6ff97b 100644 --- a/packages/rs-drive/src/drive/verify/identity/verify_identity_keys_by_identity_id/v0/mod.rs +++ b/packages/rs-drive/src/drive/verify/identity/verify_identity_keys_by_identity_id/v0/mod.rs @@ -9,7 +9,7 @@ use crate::drive::verify::RootHash; use dpp::identifier::Identifier; use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; use dpp::identity::{IdentityPublicKey, KeyID, PartialIdentity}; -pub use dpp::prelude::{Identity, Revision}; + use dpp::serialization::PlatformDeserializable; use dpp::version::PlatformVersion; use grovedb::GroveDb; diff --git a/packages/rs-drive/src/fee_pools/epochs/operations_factory.rs b/packages/rs-drive/src/fee_pools/epochs/operations_factory.rs index 34df1ce3ec..a3b504b4cb 100644 --- a/packages/rs-drive/src/fee_pools/epochs/operations_factory.rs +++ b/packages/rs-drive/src/fee_pools/epochs/operations_factory.rs @@ -928,7 +928,7 @@ mod tests { assert_eq!(stored_proposers, awaited_result); let deleted_pro_tx_hashes = vec![ - awaited_result.get(0).unwrap().0.clone(), + awaited_result.first().unwrap().0.clone(), awaited_result.get(1).unwrap().0.clone(), ]; diff --git a/packages/rs-drive/src/query/conditions.rs b/packages/rs-drive/src/query/conditions.rs index 83519815b2..1532d36976 100644 --- a/packages/rs-drive/src/query/conditions.rs +++ b/packages/rs-drive/src/query/conditions.rs @@ -389,7 +389,7 @@ impl<'a> WhereClause { } let field_value = clause_components - .get(0) + .first() .expect("check above enforces it exists"); let field_ref = field_value.as_text().ok_or(Error::Query( QuerySyntaxError::InvalidWhereClauseComponents( @@ -438,7 +438,7 @@ impl<'a> WhereClause { .collect::>(); match lower_range_clauses.len() { 0 => Ok(None), - 1 => Ok(Some(lower_range_clauses.get(0).unwrap())), + 1 => Ok(Some(lower_range_clauses.first().unwrap())), _ => Err(Error::Query(QuerySyntaxError::MultipleRangeClauses( "there can only at most one range clause with a lower bound", ))), @@ -452,7 +452,7 @@ impl<'a> WhereClause { .collect::>(); match upper_range_clauses.len() { 0 => Ok(None), - 1 => Ok(Some(upper_range_clauses.get(0).unwrap())), + 1 => Ok(Some(upper_range_clauses.first().unwrap())), _ => Err(Error::Query(QuerySyntaxError::MultipleRangeClauses( "there can only at most one range clause with a lower bound", ))), @@ -507,7 +507,7 @@ impl<'a> WhereClause { let in_clause = match in_clauses_array.len() { 0 => Ok(None), 1 => { - let clause = in_clauses_array.get(0).expect("there must be a value"); + let clause = in_clauses_array.first().expect("there must be a value"); if known_fields.contains(&clause.field) { Err(Error::Query( QuerySyntaxError::DuplicateNonGroupableClauseSameField( @@ -637,7 +637,7 @@ impl<'a> WhereClause { } } } else if non_groupable_range_clauses.len() == 1 && groupable_range_clauses.is_empty() { - let where_clause = *non_groupable_range_clauses.get(0).unwrap(); + let where_clause = *non_groupable_range_clauses.first().unwrap(); if where_clause.operator == StartsWith { // Starts with must null be against an empty string if let Value::Text(text) = &where_clause.value { @@ -689,7 +689,7 @@ impl<'a> WhereClause { } let left_key = document_type.serialize_value_for_key( self.field.as_str(), - in_values.get(0).unwrap(), + in_values.first().unwrap(), platform_version, )?; let right_key = document_type.serialize_value_for_key( @@ -1232,7 +1232,7 @@ mod tests { let where_clauses = vec![ WhereClause { field: "a".to_string(), - operator: *query_pair.get(0).unwrap(), + operator: *query_pair.first().unwrap(), value: Value::Float(0.0), }, WhereClause { @@ -1258,7 +1258,7 @@ mod tests { let where_clauses = vec![ WhereClause { field: "a".to_string(), - operator: *query_pair.get(0).unwrap(), + operator: *query_pair.first().unwrap(), value: Value::Float(1.0), }, WhereClause { @@ -1280,7 +1280,7 @@ mod tests { let where_clauses = vec![ WhereClause { field: "a".to_string(), - operator: *query_pair.get(0).unwrap(), + operator: *query_pair.first().unwrap(), value: Value::Float(1.0), }, WhereClause { @@ -1331,7 +1331,7 @@ mod tests { let where_clauses = vec![ WhereClause { field: "a".to_string(), - operator: *query_pair.get(0).unwrap(), + operator: *query_pair.first().unwrap(), value: Value::Float(0.0), }, WhereClause { diff --git a/packages/rs-drive/src/query/mod.rs b/packages/rs-drive/src/query/mod.rs index 0529cedbe3..7f3f9f0d01 100644 --- a/packages/rs-drive/src/query/mod.rs +++ b/packages/rs-drive/src/query/mod.rs @@ -214,7 +214,7 @@ impl InternalClauses { 0 => Ok(None), 1 => Ok(Some( primary_key_equal_clauses_array - .get(0) + .first() .expect("there must be a value") .clone(), )), @@ -229,7 +229,7 @@ impl InternalClauses { 0 => Ok(None), 1 => Ok(Some( primary_key_in_clauses_array - .get(0) + .first() .expect("there must be a value") .clone(), )), @@ -652,7 +652,7 @@ impl<'a> DriveQuery<'a> { // Should ideally iterate over each statement let first_statement = statements - .get(0) + .first() .ok_or(Error::Query(QuerySyntaxError::InvalidSQL( "Issue parsing sql", )))?; @@ -703,7 +703,7 @@ impl<'a> DriveQuery<'a> { // Get the document type from the 'from' section let document_type_name = match &select .from - .get(0) + .first() .ok_or(Error::Query(QuerySyntaxError::InvalidSQL( "Invalid query: missing from section", )))? @@ -714,7 +714,7 @@ impl<'a> DriveQuery<'a> { alias: _, args: _, with_hints: _, - } => name.0.get(0).as_ref().map(|identifier| &identifier.value), + } => name.0.first().as_ref().map(|identifier| &identifier.value), _ => None, } .ok_or(Error::Query(QuerySyntaxError::InvalidSQL( diff --git a/packages/rs-drive/src/query/ordering.rs b/packages/rs-drive/src/query/ordering.rs index eb033ce14d..d671e909ed 100644 --- a/packages/rs-drive/src/query/ordering.rs +++ b/packages/rs-drive/src/query/ordering.rs @@ -52,7 +52,7 @@ impl<'a> OrderClause { } let field_value = clause_components - .get(0) + .first() .expect("check above enforces it exists"); let field_ref = field_value.as_text().ok_or(Error::InvalidQuery( "first field of where component should be a string", diff --git a/packages/rs-drive/src/query/test_index.rs b/packages/rs-drive/src/query/test_index.rs index 16413d72c2..c66862fbb7 100644 --- a/packages/rs-drive/src/query/test_index.rs +++ b/packages/rs-drive/src/query/test_index.rs @@ -134,7 +134,7 @@ mod tests { let index = query .find_best_index(platform_version) .expect("expected to find index"); - assert_eq!(index, document_type.indices().get(0).unwrap()); + assert_eq!(index, document_type.indices().first().unwrap()); } #[test] diff --git a/packages/rs-platform-value/src/converter/serde_json.rs b/packages/rs-platform-value/src/converter/serde_json.rs index f064c831d4..bdd8025569 100644 --- a/packages/rs-platform-value/src/converter/serde_json.rs +++ b/packages/rs-platform-value/src/converter/serde_json.rs @@ -435,7 +435,7 @@ mod tests { .expect("expected to get array slice") .unwrap(); assert_eq!(array.len(), 1); - assert!(array.get(0).unwrap().is_map()); + assert!(array.first().unwrap().is_map()); let array = value .get_optional_array_slice("disablePublicKeys") .expect("expected to get array slice") diff --git a/packages/rs-platform-value/src/value_serialization/de.rs b/packages/rs-platform-value/src/value_serialization/de.rs index 34ab78ec22..e64a6fffa4 100644 --- a/packages/rs-platform-value/src/value_serialization/de.rs +++ b/packages/rs-platform-value/src/value_serialization/de.rs @@ -453,7 +453,7 @@ impl<'de> de::Deserializer<'de> for Deserializer { } Value::EnumString(x) => { let variant_name = x - .get(0) + .first() .ok_or_else(|| de::Error::invalid_length(0, &"at least one variant expected"))? .clone(); visitor.visit_enum(variant_name.into_deserializer()) diff --git a/packages/rs-sdk/tests/fetch/config.rs b/packages/rs-sdk/tests/fetch/config.rs index cc4d7e956e..20d17bdaec 100644 --- a/packages/rs-sdk/tests/fetch/config.rs +++ b/packages/rs-sdk/tests/fetch/config.rs @@ -69,7 +69,7 @@ pub struct Config { impl Config { /// Prefix of configuration options in the environment variables and `.env` file. - pub const CONFIG_PREFIX: &str = "RS_SDK_"; + pub const CONFIG_PREFIX: &'static str = "RS_SDK_"; /// Load configuration from operating system environment variables and `.env` file. /// /// Create new [Config] with data from environment variables and `${CARGO_MANIFEST_DIR}/tests/.env` file. diff --git a/packages/strategy-tests/src/lib.rs b/packages/strategy-tests/src/lib.rs index d48daf02d6..8d27bcebc0 100644 --- a/packages/strategy-tests/src/lib.rs +++ b/packages/strategy-tests/src/lib.rs @@ -82,7 +82,7 @@ pub mod transitions; /// /// # Note /// Ensure that when using or updating the `Strategy`, all associated operations, identities, and contracts are coherent with the intended workflow or simulation. Inconsistencies might lead to unexpected behaviors or simulation failures. -#[derive(Clone, Debug, PartialEq)] +#[derive(Clone, Debug, PartialEq, Default)] pub struct Strategy { pub contracts_with_updates: Vec<( CreatedDataContract, @@ -94,18 +94,6 @@ pub struct Strategy { pub signer: Option, } -impl Default for Strategy { - fn default() -> Self { - Strategy { - contracts_with_updates: vec![], - operations: vec![], - start_identities: vec![], - identities_inserts: Frequency::default(), - signer: None, - } - } -} - #[derive(Clone, Debug, Encode, Decode)] struct StrategyInSerializationFormat { pub contracts_with_updates: Vec<(Vec, Option>>)>, From 865ed22117fb0fb303a26912e3a95ea9ab4dc574 Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Fri, 9 Feb 2024 08:36:07 +0700 Subject: [PATCH 029/191] chore: remove anton as code owner --- CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CODEOWNERS b/CODEOWNERS index 6bf6cba8c9..0af1265884 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1 +1 @@ -* @shumkov @antouhou @QuantumExplorer \ No newline at end of file +* @shumkov @QuantumExplorer \ No newline at end of file From c97922ff48ad05e8a01bda94a77f55336fb5150e Mon Sep 17 00:00:00 2001 From: lklimek <842586+lklimek@users.noreply.github.com> Date: Fri, 9 Feb 2024 12:50:21 +0100 Subject: [PATCH 030/191] build: bump protoc to 25.2 (#1692) --- .github/actions/rust/action.yaml | 2 +- Dockerfile | 5 +++-- README.md | 9 +++------ 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/.github/actions/rust/action.yaml b/.github/actions/rust/action.yaml index b01cd0a5dc..a6aa86446e 100644 --- a/.github/actions/rust/action.yaml +++ b/.github/actions/rust/action.yaml @@ -54,7 +54,7 @@ runs: shell: bash run: | curl -Lo /tmp/protoc.zip \ - "https://github.com/protocolbuffers/protobuf/releases/download/v22.0/protoc-22.0-linux-${{ steps.protoc_arch.outputs.arch }}.zip" + "https://github.com/protocolbuffers/protobuf/releases/download/v25.2/protoc-25.2-linux-${{ steps.protoc_arch.outputs.arch }}.zip" unzip /tmp/protoc.zip -d ${HOME}/.local echo "PROTOC=${HOME}/.local/bin/protoc" >> $GITHUB_ENV export PATH="${PATH}:${HOME}/.local/bin" diff --git a/Dockerfile b/Dockerfile index 497877cd49..c71825b40f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -30,7 +30,7 @@ # SCCACHE_SERVER_PORT port to avoid conflicts in case of parallel compilation ARG ALPINE_VERSION=3.18 - +ARG PROTOC_VERSION=25.2 ARG RUSTC_WRAPPER # @@ -78,8 +78,9 @@ RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- \ # Install protoc - protobuf compiler # The one shipped with Alpine does not work +ARG PROTOC_VERSION RUN if [[ "$TARGETARCH" == "arm64" ]] ; then export PROTOC_ARCH=aarch_64; else export PROTOC_ARCH=x86_64; fi; \ - curl -Ls https://github.com/protocolbuffers/protobuf/releases/download/v22.4/protoc-22.4-linux-${PROTOC_ARCH}.zip \ + curl -Ls https://github.com/protocolbuffers/protobuf/releases/download/v${PROTOC_VERSION}/protoc-${PROTOC_VERSION}-linux-${PROTOC_ARCH}.zip \ -o /tmp/protoc.zip && \ unzip -qd /opt/protoc /tmp/protoc.zip && \ rm /tmp/protoc.zip && \ diff --git a/README.md b/README.md index dfcebf86e0..c01ce4f23c 100644 --- a/README.md +++ b/README.md @@ -54,18 +54,15 @@ this repository may be used on the following networks: - [node.js](https://nodejs.org/) v20 - [docker](https://docs.docker.com/get-docker/) v20.10+ - [rust](https://www.rust-lang.org/tools/install) v1.73+, with wasm32 target (`rustup target add wasm32-unknown-unknown`) + - [protoc - protobuf compiler](https://github.com/protocolbuffers/protobuf/releases) v25.2+ + - if needed, set PROTOC environment variable to location of `protoc` binary - [wasm-bingen toolchain](https://rustwasm.github.io/wasm-bindgen/): - **IMPORTANT (OSX only)**: built-in `llvm` on OSX does not work, needs to be installed from brew: - `brew install llvm` - LLVM installed from brew is keg only, and path to it must be provided in the profile file, in terminal run `echo 'export PATH="/opt/homebrew/opt/llvm/bin:$PATH"' >> ~/.zshrc` or `echo 'export PATH="/opt/homebrew/opt/llvm/bin:$PATH"' >> ~/.bash_profile` depending on your default shell. You can find your default shell with `echo $SHELL` - - Reload your shell with `source ~/.zshrc` or `source ~/.bash_profile` - - install `protoc` - protobuf compiler: - - on debian/ubuntu: `apt install -y protobuf-compiler` - - on Mac: `brew install protobuf` - - on other systems, install most recent version from [Protocol Buffers releases page](https://github.com/protocolbuffers/protobuf/releases) (tested with protobuf 22.4) - - if needed, set PROTOC environment variable to location of `protoc` binary + - Reload your shell with `source ~/.zshrc` or `source ~/.bash_profile` - `cargo install wasm-bindgen-cli@0.2.85` - *double-check that wasm-bindgen-cli version above matches wasm-bindgen version in Cargo.lock file* - *Depending on system, additional packages may need to be installed as a prerequisite for wasm-bindgen-cli. If anything is missing, installation will error and prompt what packages are missing (i.e. clang, llvm, libssl-dev)* From 5a145d5313b1ef29607de04ce292b649bf9710fd Mon Sep 17 00:00:00 2001 From: lklimek <842586+lklimek@users.noreply.github.com> Date: Mon, 12 Feb 2024 17:44:13 +0100 Subject: [PATCH 031/191] feat(sdk): state transitions support in rust sdk (#1596) Co-authored-by: Djavid Gabibiyan Co-authored-by: Dmitrii Golubev Co-authored-by: strophy <32928115+strophy@users.noreply.github.com> Co-authored-by: QuantumExplorer Co-authored-by: fominok Co-authored-by: Ivan Shumkov Co-authored-by: markin.io --- .github/workflows/tests-rs-package.yml | 4 + .github/workflows/tests.yml | 7 +- Cargo.lock | 80 ++++- Cargo.toml | 2 + packages/dapi-grpc/Cargo.toml | 2 + packages/dapi-grpc/build.rs | 48 ++- .../clients/core/v0/nodejs/core_protoc.js | 66 ++-- .../clients/core/v0/rust/core_example.rs | 2 +- .../dapi-grpc/clients/core/v0/web/core_pb.js | 66 ++-- .../platform/v0/rust/platform_example.rs | 2 +- .../core/proto/org.dash.platform.dapi.v0.rs | 55 +++ packages/dapi-grpc/src/lib.rs | 6 + packages/dapi-grpc/src/mock.rs | 68 ++++ .../proto/org.dash.platform.dapi.v0.rs | 101 ++++++ .../createGrpcErrorFromDriveResponse.js | 14 +- ...eToTransactionsWithProofsHandlerFactory.js | 6 +- ...mitInstantLockToFilterCollectionFactory.js | 4 +- .../platform/dapi/envoy/envoy.yaml.dot | 6 + packages/rs-dapi-client/Cargo.toml | 11 +- packages/rs-dapi-client/src/address_list.rs | 144 ++++++-- packages/rs-dapi-client/src/dapi_client.rs | 164 ++++++--- packages/rs-dapi-client/src/dump.rs | 138 ++++++-- packages/rs-dapi-client/src/lib.rs | 13 +- packages/rs-dapi-client/src/mock.rs | 96 +++--- .../rs-dapi-client/src/request_settings.rs | 21 +- packages/rs-dapi-client/src/transport.rs | 30 +- packages/rs-dapi-client/src/transport/grpc.rs | 75 +++- .../rs-dapi-client/tests/mock_dapi_client.rs | 4 +- packages/rs-dapi-grpc-macros/src/lib.rs | 41 +++ packages/rs-dpp/Cargo.toml | 18 +- .../src/data_contract/data_contract_facade.rs | 2 + .../document_type/v0/random_document_type.rs | 6 +- .../data_contract/generate_data_contract.rs | 4 +- packages/rs-dpp/src/data_contract/mod.rs | 8 +- .../src/document/document_factory/mod.rs | 7 +- .../src/document/document_factory/v0/mod.rs | 14 +- .../document/document_methods/hash/v0/mod.rs | 4 +- .../src/document/extended_document/v0/mod.rs | 4 +- .../src/document/generate_document_id.rs | 4 +- .../specialized_document_factory/mod.rs | 7 +- .../specialized_document_factory/v0/mod.rs | 14 +- packages/rs-dpp/src/errors/consensus/codes.rs | 2 +- packages/rs-dpp/src/errors/protocol_error.rs | 28 +- packages/rs-dpp/src/identity/identity.rs | 6 +- .../rs-dpp/src/identity/identity_facade.rs | 21 +- .../rs-dpp/src/identity/identity_factory.rs | 6 +- .../identity/identity_public_key/key_type.rs | 12 + .../identity/identity_public_key/purpose.rs | 1 + .../identity_public_key/security_level.rs | 1 + packages/rs-dpp/src/identity/signer.rs | 2 +- .../chain/chain_asset_lock_proof.rs | 4 +- .../instant/instant_asset_lock_proof.rs | 10 +- packages/rs-dpp/src/lib.rs | 5 +- .../src/serialization/serialization_traits.rs | 2 + packages/rs-dpp/src/signing.rs | 14 +- .../rs-dpp/src/state_transition/errors/mod.rs | 3 +- packages/rs-dpp/src/state_transition/mod.rs | 14 +- .../src/state_transition/proof_result.rs | 14 + .../src/state_transition/serialization.rs | 2 +- .../document_create_transition/mod.rs | 83 +++++ .../document_create_transition/v0/mod.rs | 152 +++++++- .../document_replace_transition/mod.rs | 75 ++++ .../document_replace_transition/v0/mod.rs | 124 ++++++- .../identity_create_transition/methods/mod.rs | 2 +- .../methods/v0/mod.rs | 2 +- .../identity_create_transition/v0/mod.rs | 4 +- .../v0/v0_methods.rs | 2 +- .../methods/mod.rs | 47 ++- .../methods/v0/mod.rs | 20 +- .../v0/mod.rs | 1 + .../v0/v0_methods.rs | 57 +++ .../identity_topup_transition/methods/mod.rs | 11 +- .../methods/v0/mod.rs | 5 +- .../v0/v0_methods.rs | 13 +- packages/rs-dpp/src/util/hash.rs | 10 +- packages/rs-dpp/src/version/mod.rs | 3 + packages/rs-drive-abci/Cargo.toml | 6 +- .../src/execution/check_tx/v0/mod.rs | 22 +- .../data_triggers/triggers/dpns/v0/mod.rs | 4 +- .../src/platform_types/platform_state/mod.rs | 4 +- .../data_contract/mod.rs | 2 +- .../data_contract/v0/mod.rs | 2 +- .../data_contract_history/mod.rs | 2 +- .../data_contract_history/v0/mod.rs | 2 +- .../data_contracts/mod.rs | 2 +- .../data_contracts/v0/mod.rs | 2 +- .../src/query/document_query/mod.rs | 2 +- .../src/query/document_query/v0/mod.rs | 2 +- .../identity_based_queries/balance/mod.rs | 2 +- .../identity_based_queries/balance/v0/mod.rs | 2 +- .../balance_and_revision/mod.rs | 2 +- .../balance_and_revision/v0/mod.rs | 2 +- .../identity_based_queries/identities/mod.rs | 2 +- .../identities/v0/mod.rs | 2 +- .../identities_by_public_key_hashes/mod.rs | 2 +- .../identities_by_public_key_hashes/v0/mod.rs | 2 +- .../identity_based_queries/identity/mod.rs | 2 +- .../identity_based_queries/identity/v0/mod.rs | 2 +- .../identity_by_public_key_hash/mod.rs | 2 +- .../identity_by_public_key_hash/v0/mod.rs | 2 +- .../query/identity_based_queries/keys/mod.rs | 2 +- .../identity_based_queries/keys/v0/mod.rs | 2 +- packages/rs-drive-abci/src/query/mod.rs | 30 +- .../rs-drive-abci/src/query/proofs/mod.rs | 2 +- .../rs-drive-abci/src/query/proofs/v0/mod.rs | 2 +- .../src/query/system/epoch_infos/mod.rs | 2 +- .../src/query/system/epoch_infos/v0/mod.rs | 2 +- .../query/system/version_upgrade_state/mod.rs | 2 +- .../system/version_upgrade_state/v0/mod.rs | 2 +- .../system/version_upgrade_vote_status/mod.rs | 2 +- .../version_upgrade_vote_status/v0/mod.rs | 2 +- packages/rs-drive-abci/src/query/v0/mod.rs | 2 +- .../tests/strategy_tests/query.rs | 2 +- .../verify_state_transitions.rs | 14 +- packages/rs-drive-proof-verifier/Cargo.toml | 1 - packages/rs-drive-proof-verifier/src/error.rs | 32 +- packages/rs-drive-proof-verifier/src/lib.rs | 6 +- packages/rs-drive-proof-verifier/src/proof.rs | 138 +++++--- .../rs-drive-proof-verifier/src/provider.rs | 134 ++++++-- packages/rs-drive-proof-verifier/src/types.rs | 7 +- .../rs-drive-proof-verifier/src/verify.rs | 13 +- packages/rs-drive/Cargo.toml | 6 +- .../document/document_create_transition.rs | 4 +- .../document/document_update_transition.rs | 4 +- packages/rs-drive/src/drive/cache.rs | 4 +- .../rs-drive/src/drive/credit_pools/mod.rs | 26 ++ .../rs-drive/src/drive/document/delete/mod.rs | 14 +- .../rs-drive/src/drive/document/update/mod.rs | 6 +- packages/rs-drive/src/drive/mod.rs | 4 +- .../src/drive/protocol_upgrade/mod.rs | 19 + .../mod.rs | 4 + .../v0/mod.rs | 85 ++++- packages/rs-drive/src/drive/verify/mod.rs | 3 + .../src/drive/verify/state_transition/mod.rs | 1 + .../mod.rs | 69 ++++ .../v0/mod.rs | 286 ++++++++++++++++ packages/rs-drive/src/error/contract.rs | 4 + packages/rs-drive/src/error/proof.rs | 21 ++ packages/rs-drive/src/error/query.rs | 9 +- packages/rs-drive/src/fee_pools/epochs/mod.rs | 4 + packages/rs-drive/src/fee_pools/mod.rs | 22 +- packages/rs-drive/src/lib.rs | 2 +- packages/rs-drive/src/query/conditions.rs | 163 ++++++--- packages/rs-drive/src/query/mod.rs | 61 ++-- .../document_create_transition_action/mod.rs | 48 +-- .../v0/mod.rs | 39 +-- .../document_replace_transition_action/mod.rs | 49 +-- .../v0/mod.rs | 34 +- packages/rs-drive/tests/query_tests.rs | 12 +- .../rs-platform-serialization/src/de/mod.rs | 5 +- .../src/features/impl_std.rs | 1 - .../src/value_serialization/de.rs | 2 +- .../src/version/dpp_versions.rs | 2 + .../src/version/drive_versions.rs | 6 + .../src/version/mocks/v2_test.rs | 7 +- .../src/version/mocks/v3_test.rs | 7 +- .../rs-platform-version/src/version/v1.rs | 7 +- packages/rs-sdk/Cargo.toml | 21 +- packages/rs-sdk/README.md | 42 ++- packages/rs-sdk/examples/read_contract.rs | 97 +++++- .../rs-sdk/scripts/generate_test_vectors.sh | 2 +- packages/rs-sdk/src/core.rs | 79 ----- packages/rs-sdk/src/core/mod.rs | 4 + packages/rs-sdk/src/core/transaction.rs | 275 +++++++++++++++ packages/rs-sdk/src/core_client.rs | 125 +++++++ packages/rs-sdk/src/error.rs | 39 +++ packages/rs-sdk/src/lib.rs | 6 +- packages/rs-sdk/src/mock.rs | 20 +- packages/rs-sdk/src/mock/noop.rs | 4 - packages/rs-sdk/src/mock/provider.rs | 222 ++++++++++++ packages/rs-sdk/src/mock/requests.rs | 18 - packages/rs-sdk/src/mock/sdk.rs | 72 ++-- packages/rs-sdk/src/platform.rs | 23 +- packages/rs-sdk/src/platform/delegate.rs | 14 +- .../rs-sdk/src/platform/document_query.rs | 44 ++- packages/rs-sdk/src/platform/fetch.rs | 14 +- packages/rs-sdk/src/platform/fetch_many.rs | 23 +- packages/rs-sdk/src/platform/query.rs | 17 +- packages/rs-sdk/src/platform/transition.rs | 14 + .../src/platform/transition/broadcast.rs | 58 ++++ .../platform/transition/broadcast_identity.rs | 118 +++++++ .../platform/transition/broadcast_request.rs | 113 ++++++ .../rs-sdk/src/platform/transition/context.rs | 5 + .../src/platform/transition/put_document.rs | 176 ++++++++++ .../src/platform/transition/put_identity.rs | 115 +++++++ .../platform/transition/top_up_identity.rs | 68 ++++ .../rs-sdk/src/platform/transition/txid.rs | 22 ++ .../transition/withdraw_from_identity.rs | 80 +++++ packages/rs-sdk/src/platform/types/epoch.rs | 4 +- .../src/platform/types/version_votes.rs | 6 +- packages/rs-sdk/src/sdk.rs | 324 ++++++++++++------ packages/rs-sdk/tests/.env.example | 1 + packages/rs-sdk/tests/fetch/broadcast.rs | 48 +++ packages/rs-sdk/tests/fetch/config.rs | 22 +- packages/rs-sdk/tests/fetch/data_contract.rs | 18 +- packages/rs-sdk/tests/fetch/document.rs | 52 +-- packages/rs-sdk/tests/fetch/epoch.rs | 40 +-- packages/rs-sdk/tests/fetch/identity.rs | 26 +- packages/rs-sdk/tests/fetch/mock_fetch.rs | 18 +- .../rs-sdk/tests/fetch/mock_fetch_many.rs | 7 +- .../rs-sdk/tests/fetch/{main.rs => mod.rs} | 3 + .../fetch/protocol_version_vote_count.rs | 8 +- .../tests/fetch/protocol_version_votes.rs | 22 +- packages/rs-sdk/tests/main.rs | 9 + ...1f53264482cc34d82cf95e06bfa0b608c1dbd.json | 1 - ...1f53264482cc34d82cf95e06bfa0b608c1dbd.json | 1 - ...37850589acb5ba186d9aca3b1cf78af19ed50.json | 1 - ...37850589acb5ba186d9aca3b1cf78af19ed50.json | 1 - ...37850589acb5ba186d9aca3b1cf78af19ed50.json | 1 - ...4fc6a27f8e61d6997cf0067a946a712a05e89.json | 1 - ...884fc36686387fa18831256ae2ada60474de4.json | 1 - ...37850589acb5ba186d9aca3b1cf78af19ed50.json | 1 - ...37850589acb5ba186d9aca3b1cf78af19ed50.json | 1 - ...7a351b90718e7a553fd96ad24988f7942a351.json | 1 - ...1f53264482cc34d82cf95e06bfa0b608c1dbd.json | 1 - ...6150693595e65a199f53e401cb7cd3ac82256.json | 1 - ...1454c0d455b5b1be6365d7e3c2bca36dbc42c.json | 1 - ...5b44ad2d78827e5cff18e4aee445ae1517d4d.json | 1 - ...0274e274af4fcc3a2671cb2d48ad78f095d15.json | 1 - ...94f09befdbcd37bf82f70051c8cd3e4eddeba.json | 1 - ...1f53264482cc34d82cf95e06bfa0b608c1dbd.json | 1 - ...48f1e24eeeeb3be5c0022cb5152ede68630e7.json | 1 - ...35bcc0c8b470f5df2c4ba8144fde70867ab69.json | 1 - ...be02efc1cc57010e9fc2e46ed6bf8a34d2e1c.json | 1 - ...433e48d1ccf07e8797bcf89ff8d3941ba3919.json | 1 - ...48f1e24eeeeb3be5c0022cb5152ede68630e7.json | 1 - ...22903565f51d88dd92e4c366ab2d2a5f49b5a.json | 1 - ...22903565f51d88dd92e4c366ab2d2a5f49b5a.json | 1 - ...cce3ad227e8411eab4d6f28d6250f4996dc21.json | 1 - ...43efa7bd8ad573b26b5a9c2258707b6130b1a.json | 1 - ...1352f30f654f6503d1d6914867355a203caba.json | 1 - ...6366cd76d51c080ede13275caaa4e495dc40d.json | 1 - ...9f61ad490a07e7dd3beb74eece388772bcfbd.json | 1 - ...f38dd6669a50d8640eebb79d1c86be24e176a.json | 1 - ...8ad4aecd97420126c4ae060b535732724e5ad.json | 1 - ...8b82332900ef1b64ea14bca39c294407dfce1.json | 1 - ...cd7c8b0ccf4a3b7755f5e0c013bfcc6fdd875.json | 1 - ...1f53264482cc34d82cf95e06bfa0b608c1dbd.json | 1 - ...1f53264482cc34d82cf95e06bfa0b608c1dbd.json | 1 - ...1f53264482cc34d82cf95e06bfa0b608c1dbd.json | 1 - ...1f53264482cc34d82cf95e06bfa0b608c1dbd.json | 1 - ...1f53264482cc34d82cf95e06bfa0b608c1dbd.json | 1 - ...d0c59d00e38c1dddc2b0830c07efc7fdcf609.json | 1 - ...3f083c2ceb802bbe764135021b32a1c684183.json | 1 - ...d7dd78bd88ffe63099d2128e0fb388aae50ab.json | 1 - ...2da649dce3dcbd207484424288382ece054f2.json | 1 - ...19e7631c1fc51bcbda1a4b854be8c566acb17.json | 1 - ...abbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json | Bin 0 -> 8694 bytes ...48c03122daf7ab2e77108f4bf44af1ad15eae.json | Bin 0 -> 8841 bytes ...067bd9ccc29eca3092a5664a5a9ba3bb7e967.json | Bin 0 -> 75591 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 0 -> 74126 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 0 -> 74126 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 0 -> 74126 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 0 -> 74126 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 0 -> 74126 bytes ...7776113debe4287515ae60d0645da450a80a1.json | Bin 0 -> 21930 bytes ...501c1ba166a2dd8f6efb31b0289dc011da983.json | Bin 0 -> 8841 bytes ...7776113debe4287515ae60d0645da450a80a1.json | Bin 0 -> 21930 bytes ...67089535588985622579e77969e0ffd68afc7.json | Bin 0 -> 20999 bytes ...7776113debe4287515ae60d0645da450a80a1.json | Bin 0 -> 21930 bytes ...7776113debe4287515ae60d0645da450a80a1.json | Bin 0 -> 21930 bytes ...6caf3663c40a12d3b03827006d66058e439ac.json | Bin 0 -> 1466413 bytes ...7776113debe4287515ae60d0645da450a80a1.json | Bin 0 -> 21930 bytes ...093d92d2c84b425f8393ffa9599b06a3a77be.json | Bin 0 -> 24202 bytes ...625892e0011f1264c65e1474532f59456ff51.json | Bin 0 -> 24202 bytes ...7776113debe4287515ae60d0645da450a80a1.json | Bin 0 -> 11759 bytes ...d592c8fe7361bed628d9a36747664c9789bf1.json | Bin 0 -> 2437723 bytes ...093d92d2c84b425f8393ffa9599b06a3a77be.json | Bin 0 -> 24202 bytes ...7776113debe4287515ae60d0645da450a80a1.json | Bin 0 -> 20800 bytes ...fcf0df7bf150009b1ced887a6f051ab86085b.json | Bin 0 -> 22292 bytes ...4a459dc7a67570ea6df3f8858d3fae7820ffe.json | Bin 0 -> 16029 bytes ...c53464633a072722c5a04b15ee01f3a45de99.json | Bin 0 -> 24658 bytes ...c53464633a072722c5a04b15ee01f3a45de99.json | Bin 0 -> 24658 bytes ...add01a7428085ffdcf1e11cccf19c48c5f7a1.json | Bin 0 -> 2668624 bytes ...9550f0ea4a6af6f68037e7d50ff4e4de74509.json | Bin 0 -> 8224 bytes ...bf1acc3394d29ac72f662d38e81344496631e.json | Bin 0 -> 10652 bytes ...106e5eda740be44679cc960ea35f2134af628.json | Bin 0 -> 10901 bytes ...3c7bc00df8bb9df6382f1d8cee10a503c01af.json | Bin 0 -> 29472 bytes ...9b1a05862cb8d40c088b193b59ca3564210bc.json | Bin 0 -> 11321 bytes ...af38ff6415d9cabab87315b9d9d736194597f.json | Bin 0 -> 24328 bytes ...22dfc69cc7b123be24b7ad993281979b2a3a2.json | Bin 0 -> 11010 bytes ...b0b93d9d2e841a5e3d60755f8e7be3b93315b.json | Bin 0 -> 2425349 bytes ...0c5983a47736b8d541f748d2d6c2848828110.json | 1 - ...475024d266e0c12522b28f20e10da0b1a1eb7.json | 1 + ...8201d413457dc90b5ecd24f4289973f36769d.json | 1 - packages/simple-signer/Cargo.toml | 2 +- packages/strategy-tests/Cargo.toml | 5 - packages/strategy-tests/src/transitions.rs | 5 +- packages/wasm-dpp/Cargo.toml | 4 +- .../wasm-dpp/src/identity/identity_facade.rs | 2 +- .../wasm-dpp/src/identity/identity_factory.rs | 2 +- packages/withdrawals-contract/Cargo.toml | 1 + rust-toolchain.toml | 2 +- 293 files changed, 4933 insertions(+), 1315 deletions(-) create mode 100644 packages/dapi-grpc/src/mock.rs create mode 100644 packages/rs-dpp/src/state_transition/proof_result.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/v0_methods.rs create mode 100644 packages/rs-drive/src/drive/verify/state_transition/mod.rs create mode 100644 packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/mod.rs create mode 100644 packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs delete mode 100644 packages/rs-sdk/src/core.rs create mode 100644 packages/rs-sdk/src/core/mod.rs create mode 100644 packages/rs-sdk/src/core/transaction.rs create mode 100644 packages/rs-sdk/src/core_client.rs create mode 100644 packages/rs-sdk/src/mock/provider.rs create mode 100644 packages/rs-sdk/src/platform/transition.rs create mode 100644 packages/rs-sdk/src/platform/transition/broadcast.rs create mode 100644 packages/rs-sdk/src/platform/transition/broadcast_identity.rs create mode 100644 packages/rs-sdk/src/platform/transition/broadcast_request.rs create mode 100644 packages/rs-sdk/src/platform/transition/context.rs create mode 100644 packages/rs-sdk/src/platform/transition/put_document.rs create mode 100644 packages/rs-sdk/src/platform/transition/put_identity.rs create mode 100644 packages/rs-sdk/src/platform/transition/top_up_identity.rs create mode 100644 packages/rs-sdk/src/platform/transition/txid.rs create mode 100644 packages/rs-sdk/src/platform/transition/withdraw_from_identity.rs create mode 100644 packages/rs-sdk/tests/fetch/broadcast.rs rename packages/rs-sdk/tests/fetch/{main.rs => mod.rs} (77%) create mode 100644 packages/rs-sdk/tests/main.rs delete mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.335955511Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.335957885Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.342863939Z_GetDataContractRequest_36b3cb705d54b996dccf0f8332c37850589acb5ba186d9aca3b1cf78af19ed50.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.342864079Z_GetDataContractRequest_36b3cb705d54b996dccf0f8332c37850589acb5ba186d9aca3b1cf78af19ed50.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.342864230Z_GetDataContractRequest_36b3cb705d54b996dccf0f8332c37850589acb5ba186d9aca3b1cf78af19ed50.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.350064490Z_GetDataContractsRequest_be241f4243faa3a04a20a229a214fc6a27f8e61d6997cf0067a946a712a05e89.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.354440227Z_GetDataContractRequest_ce01e85155ee6482c89778e5214884fc36686387fa18831256ae2ada60474de4.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.354440387Z_GetDataContractRequest_36b3cb705d54b996dccf0f8332c37850589acb5ba186d9aca3b1cf78af19ed50.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.356639993Z_GetDataContractRequest_36b3cb705d54b996dccf0f8332c37850589acb5ba186d9aca3b1cf78af19ed50.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.356676471Z_GetDataContractRequest_7536c32e37cebf6071e74b591067a351b90718e7a553fd96ad24988f7942a351.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.357095280Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.357095531Z_GetDataContractsRequest_bd87a638d172101113991a534d56150693595e65a199f53e401cb7cd3ac82256.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.751819754Z_GetEpochsInfoRequest_ef9bdb4da13c406de86be6d66c61454c0d455b5b1be6365d7e3c2bca36dbc42c.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.080124542Z_GetEpochsInfoRequest_9cce33953db8841b6123b9ed1855b44ad2d78827e5cff18e4aee445ae1517d4d.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.426422030Z_DocumentQuery_93ef8e9afdc1e6a8453c1751ff30274e274af4fcc3a2671cb2d48ad78f095d15.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.433229690Z_DocumentQuery_a818ac2a04eea1a026dc55c30ab94f09befdbcd37bf82f70051c8cd3e4eddeba.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.433230211Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.444691450Z_DocumentQuery_100720a9c5d8a4f4c5af90b57a848f1e24eeeeb3be5c0022cb5152ede68630e7.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.447019688Z_GetIdentityBalanceRequest_e91c9897a9689e1986cf1b9579535bcc0c8b470f5df2c4ba8144fde70867ab69.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.453685360Z_GetIdentityBalanceAndRevisionRequest_4809aada385f6c04f595ff8b7ecbe02efc1cc57010e9fc2e46ed6bf8a34d2e1c.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.453726197Z_GetIdentityKeysRequest_105e9b32f84ce4eadea49154f2f433e48d1ccf07e8797bcf89ff8d3941ba3919.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.453938207Z_DocumentQuery_100720a9c5d8a4f4c5af90b57a848f1e24eeeeb3be5c0022cb5152ede68630e7.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.454423973Z_IdentityRequest_fa68a24d7c0ef611bc762c3703122903565f51d88dd92e4c366ab2d2a5f49b5a.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.467303996Z_IdentityRequest_fa68a24d7c0ef611bc762c3703122903565f51d88dd92e4c366ab2d2a5f49b5a.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.467325937Z_GetEpochsInfoRequest_9bbde71623deeaa5c2fc1650705cce3ad227e8411eab4d6f28d6250f4996dc21.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.527888214Z_GetProtocolVersionUpgradeStateRequest_4ed3fce5a29b6727723dc6a61de43efa7bd8ad573b26b5a9c2258707b6130b1a.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.532752692Z_DocumentQuery_66b0ef1d6b1f37230412b8f86821352f30f654f6503d1d6914867355a203caba.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.532753684Z_GetProtocolVersionUpgradeVoteStatusRequest_23ba016b971c6bf8861d9be485c6366cd76d51c080ede13275caaa4e495dc40d.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.532766888Z_GetEpochsInfoRequest_1a593ca7a1115a6cb2f60ad11269f61ad490a07e7dd3beb74eece388772bcfbd.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.535104374Z_GetProtocolVersionUpgradeVoteStatusRequest_b48106c894c1a70687d01655ff8f38dd6669a50d8640eebb79d1c86be24e176a.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.541183290Z_IdentityRequest_4c846d4b578d59c6520ad92e6c58ad4aecd97420126c4ae060b535732724e5ad.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.856697924Z_GetProtocolVersionUpgradeVoteStatusRequest_44e38c7d942ddc931c62af824bd8b82332900ef1b64ea14bca39c294407dfce1.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.857223575Z_GetProtocolVersionUpgradeVoteStatusRequest_cba09aff3f31ba1e6ec0092c331cd7c8b0ccf4a3b7755f5e0c013bfcc6fdd875.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:15.778699353Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:15.796630936Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:15.800193897Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:15.800233442Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:15.800635171Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:16.134231820Z_GetEpochsInfoRequest_73b10756ba7ed485a1871d443f8d0c59d00e38c1dddc2b0830c07efc7fdcf609.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:16.142398899Z_GetEpochsInfoRequest_d4fe9a388a1862a7db319738fb63f083c2ceb802bbe764135021b32a1c684183.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:16.536016360Z_GetEpochsInfoRequest_0df25d4dcb12ff24d9128fdcc91d7dd78bd88ffe63099d2128e0fb388aae50ab.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:16.879310928Z_GetEpochsInfoRequest_61b3e0349172ec26465ec79f45b2da649dce3dcbd207484424288382ece054f2.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:16.921837334Z_GetEpochsInfoRequest_93f0d7a77c909a6170f653a4b4b19e7631c1fc51bcbda1a4b854be8c566acb17.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:12.910262643Z_GetDataContractsRequest_93bdf343bce1bafb96fd873236cabbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:12.914269172Z_GetDataContractRequest_1d1e53ab5e04d9ec5dce4ff9ac048c03122daf7ab2e77108f4bf44af1ad15eae.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:12.915469587Z_GetDataContractsRequest_f229a0e58a5c4fb050f57c087bf067bd9ccc29eca3092a5664a5a9ba3bb7e967.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:12.918456374Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:12.922616653Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:12.933439115Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:12.941127753Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:12.944990422Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:12.951101193Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:12.952713926Z_GetDataContractRequest_e4cf74168e03a40bd159451456b501c1ba166a2dd8f6efb31b0289dc011da983.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:12.958970753Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:13.034346873Z_GetEpochsInfoRequest_1b87e649557ccb609adb9e2904c67089535588985622579e77969e0ffd68afc7.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:13.046240415Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:13.048252342Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:13.069937570Z_GetEpochsInfoRequest_b2b426ac4a52cb4cb08904c63386caf3663c40a12d3b03827006d66058e439ac.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:13.368215618Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:13.372271271Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:13.372463774Z_DocumentQuery_c104c67292061fe0b8e2f959cd2625892e0011f1264c65e1474532f59456ff51.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:13.376226003Z_GetIdentityBalanceRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:13.416839239Z_GetEpochsInfoRequest_734f6594c67fe6a9ab170191031d592c8fe7361bed628d9a36747664c9789bf1.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:13.694486416Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:13.696798309Z_GetIdentityBalanceAndRevisionRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:13.706232100Z_DocumentQuery_fb3b25c8fa37750a6c1b18d9085fcf0df7bf150009b1ced887a6f051ab86085b.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:13.709021613Z_GetIdentityKeysRequest_b4ecff7acf52818aef9ed37a98d4a459dc7a67570ea6df3f8858d3fae7820ffe.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:13.709234435Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:13.711953786Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:13.754344045Z_GetEpochsInfoRequest_6a828350e795a088dbc835260a1add01a7428085ffdcf1e11cccf19c48c5f7a1.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:14.019269155Z_GetProtocolVersionUpgradeStateRequest_bb149e1933b9dc561bbfacfb6d09550f0ea4a6af6f68037e7d50ff4e4de74509.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:14.022689129Z_GetProtocolVersionUpgradeVoteStatusRequest_983670ac95678b1166deab32209bf1acc3394d29ac72f662d38e81344496631e.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:14.023193261Z_GetProtocolVersionUpgradeVoteStatusRequest_ec9dca65a964669b3bc8195d5ff106e5eda740be44679cc960ea35f2134af628.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:14.032126958Z_IdentityRequest_68658eccbc00d6ee8168459f8be3c7bc00df8bb9df6382f1d8cee10a503c01af.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:14.034739998Z_GetProtocolVersionUpgradeVoteStatusRequest_8534be7e0b4dd648520dc3a67209b1a05862cb8d40c088b193b59ca3564210bc.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:14.035375207Z_DocumentQuery_90af5a08200f1b0e42dbd3ad7a6af38ff6415d9cabab87315b9d9d736194597f.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:14.035494051Z_GetProtocolVersionUpgradeVoteStatusRequest_92a45a0fe4f69d355022d2f2f7622dfc69cc7b123be24b7ad993281979b2a3a2.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:14.065452692Z_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json delete mode 100644 packages/rs-sdk/tests/vectors/quorum_pubkey-106-229983404293f0205c1bbd8df060c5983a47736b8d541f748d2d6c2848828110.json create mode 100644 packages/rs-sdk/tests/vectors/quorum_pubkey-106-50df0cfb07677aa8cf0272f3fce475024d266e0c12522b28f20e10da0b1a1eb7.json delete mode 100644 packages/rs-sdk/tests/vectors/quorum_pubkey-106-7b90b0a3c4f2577b80875327ef78201d413457dc90b5ecd24f4289973f36769d.json diff --git a/.github/workflows/tests-rs-package.yml b/.github/workflows/tests-rs-package.yml index bd574fdffb..0690b7d03d 100644 --- a/.github/workflows/tests-rs-package.yml +++ b/.github/workflows/tests-rs-package.yml @@ -106,6 +106,10 @@ jobs: detect_structure_changes: name: Detect immutable structure changes runs-on: ubuntu-22.04 + # FIXME: as we use `gh pr view` below, this check can only + # run on pull requests. We should find a way to run it + # when manual triggers are used. + if: github.event_name == 'pull_request' steps: - name: Checkout base commit uses: actions/checkout@v4 diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index dd65706849..5a3bbed51a 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -6,7 +6,7 @@ on: types: [opened, synchronize, reopened, ready_for_review] branches: - master - - v[0-9]+\.[0-9]+-dev + - 'v[0-9]+\.[0-9]+-dev' push: branches: - master @@ -83,8 +83,9 @@ jobs: uses: ./.github/workflows/tests-rs-package.yml with: package: ${{ matrix.rs-package }} - # Run drive and drive-abci linter on self-hosted 2x - lint-runner: ${{ contains(fromJSON('["drive-abci", "drive"]'), matrix.rs-package) && '[ "self-hosted", "linux", "arm64", "ubuntu-platform" ]' || '"ubuntu-22.04"' }} + # lint-runner: ${{ contains(fromJSON('["drive-abci", "drive"]'), matrix.rs-package) && '[ "self-hosted", "linux", "arm64", "ubuntu-platform" ]' || '"ubuntu-22.04"' }} + # FIXME: Clippy fails on github hosted runners, most likely due to RAM usage. Using self-hosted runners for now. + lint-runner: '[ "self-hosted", "linux", "arm64", "ubuntu-platform" ]' # Run drive tests on self-hosted 4x test-runner: ${{ contains(fromJSON('["drive-abci"]'), matrix.rs-package) && '[ "self-hosted", "linux", "arm64", "ubuntu-platform-4x" ]' || '[ "self-hosted", "linux", "arm64", "ubuntu-platform" ]' }} check-each-feature: ${{ contains(fromJSON('["rs-sdk","rs-dapi-client","dapi-grpc","dpp","drive-abci"]'), matrix.rs-package) }} diff --git a/Cargo.lock b/Cargo.lock index 595e903eb5..d04bdd0f5e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -50,6 +50,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "allocator-api2" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" + [[package]] name = "android-tzdata" version = "0.1.1" @@ -363,6 +369,16 @@ dependencies = [ "which", ] +[[package]] +name = "bip37-bloom-filter" +version = "0.1.0" +source = "git+https://github.com/dashpay/rs-bip37-bloom-filter?branch=develop#352fa2312fd6e0f47bf4cba3a67bfd78c3ba763b" +dependencies = [ + "bitvec", + "murmur3", + "thiserror", +] + [[package]] name = "bit-set" version = "0.5.3" @@ -944,6 +960,7 @@ dependencies = [ "prost 0.11.9", "serde", "serde_bytes", + "serde_json", "tenderdash-proto 0.14.0-dev.6 (git+https://github.com/dashpay/rs-tenderdash-abci)", "tonic", "tonic-build", @@ -1213,6 +1230,7 @@ dependencies = [ "serde_json", "serde_repr", "sha2", + "strum 0.25.0", "test-case", "thiserror", "tokio", @@ -1282,7 +1300,7 @@ dependencies = [ "metrics-exporter-prometheus", "mockall", "platform-version", - "prost 0.11.9", + "prost 0.12.3", "rand", "regex", "reopen", @@ -1314,7 +1332,6 @@ dependencies = [ "dpp", "drive", "hex", - "lazy_static", "serde", "serde_json", "tenderdash-abci", @@ -1824,7 +1841,7 @@ dependencies = [ "lazy_static", "num_cpus", "rocksdb", - "strum", + "strum 0.24.1", "tempfile", "thiserror", ] @@ -1886,6 +1903,10 @@ name = "hashbrown" version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +dependencies = [ + "ahash 0.8.7", + "allocator-api2", +] [[package]] name = "heck" @@ -2347,6 +2368,15 @@ version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +[[package]] +name = "lru" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2c024b41519440580066ba82aab04092b333e09066a5eb86c7c4890df31f22" +dependencies = [ + "hashbrown 0.14.3", +] + [[package]] name = "lz4-sys" version = "1.9.4" @@ -2542,6 +2572,12 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" +[[package]] +name = "murmur3" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9252111cf132ba0929b6f8e030cac2a24b507f3a4d6db6fb2896f27b354c714b" + [[package]] name = "nohash-hasher" version = "0.2.0" @@ -3444,12 +3480,9 @@ dependencies = [ "hex", "http", "rand", - "serde", - "serde_json", "sha2", "thiserror", "tokio", - "tonic", "tracing", ] @@ -3460,26 +3493,30 @@ dependencies = [ "async-trait", "base64 0.21.7", "bincode 2.0.0-rc.3", + "bip37-bloom-filter", "ciborium", + "clap 4.4.18", "dapi-grpc", + "dapi-grpc-macros", "dashcore-rpc", "data-contracts", "derive_more", "dotenvy", "dpp", "drive", - "drive-abci", "drive-proof-verifier", "envy", "futures", "hex", "http", + "lru", "rs-dapi-client", "serde", "serde_json", "thiserror", "tokio", "tokio-test", + "tokio-util", "tracing", "tracing-subscriber", ] @@ -3987,9 +4024,9 @@ dependencies = [ [[package]] name = "sqlparser" -version = "0.13.0" +version = "0.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9907f54bd0f7b6ce72c2be1e570a614819ee08e3deb66d90480df341d8a12a8" +checksum = "0272b7bb0a225320170c99901b4b5fb3a4384e255a7f2cc228f61e2ba3893e75" dependencies = [ "log", ] @@ -4002,7 +4039,6 @@ dependencies = [ "dpp", "drive", "hex", - "platform-serialization-derive", "platform-version", "rand", "rocksdb", @@ -4021,7 +4057,16 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" dependencies = [ - "strum_macros", + "strum_macros 0.24.3", +] + +[[package]] +name = "strum" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" +dependencies = [ + "strum_macros 0.25.3", ] [[package]] @@ -4037,6 +4082,19 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "strum_macros" +version = "0.25.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.48", +] + [[package]] name = "subtle" version = "2.5.0" diff --git a/Cargo.toml b/Cargo.toml index 8fe09c67d2..516d32e420 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,7 @@ [workspace] +resolver = "2" + members = [ "packages/dapi-grpc", "packages/rs-dapi-grpc-macros", diff --git a/packages/dapi-grpc/Cargo.toml b/packages/dapi-grpc/Cargo.toml index 9bcc325f72..fd9c07d0eb 100644 --- a/packages/dapi-grpc/Cargo.toml +++ b/packages/dapi-grpc/Cargo.toml @@ -21,6 +21,7 @@ platform = [] tenderdash-proto = [] client = ["tonic/channel", "tonic/tls", "tonic/tls-roots", "platform"] serde = ["dep:serde", "dep:serde_bytes"] +mocks = ["dep:serde_json"] [dependencies] prost = { version = "0.11.9" } @@ -30,6 +31,7 @@ tonic = { version = "0.9.2", features = [ ], default-features = false } serde = { version = "1.0.171", optional = true, features = ["derive"] } serde_bytes = { version = "0.11.12", optional = true } +serde_json = { version = "1.0", optional = true } tenderdash-proto = { git = "https://github.com/dashpay/rs-tenderdash-abci", version = "0.14.0-dev.6" } dapi-grpc-macros = { path = "../rs-dapi-grpc-macros" } platform-version = { path = "../rs-platform-version" } diff --git a/packages/dapi-grpc/build.rs b/packages/dapi-grpc/build.rs index 713494f292..fae5c12b0c 100644 --- a/packages/dapi-grpc/build.rs +++ b/packages/dapi-grpc/build.rs @@ -6,7 +6,21 @@ use std::{ use tonic_build::Builder; fn main() { - generate().expect("failed to compile protobuf definitions"); + let core = MappingConfig::new( + PathBuf::from("protos/core/v0/core.proto"), + PathBuf::from("src/core/proto"), + ); + configure_core(core) + .generate() + .expect("generate core proto"); + + let platform = MappingConfig::new( + PathBuf::from("protos/platform/v0/platform.proto"), + PathBuf::from("src/platform/proto"), + ); + configure_platform(platform) + .generate() + .expect("generate platform proto"); println!("cargo:rerun-if-changed=./protos"); println!("cargo:rerun-if-env-changed=CARGO_FEATURE_SERDE"); @@ -18,19 +32,8 @@ struct MappingConfig { builder: Builder, proto_includes: Vec, } -/// Generate Rust definitions from Protobuf definitions -pub fn generate() -> Result<(), std::io::Error> { - let core = MappingConfig::new( - PathBuf::from("protos/core/v0/core.proto"), - PathBuf::from("src/core/proto"), - ); - core.generate().unwrap(); - - let mut platform = MappingConfig::new( - PathBuf::from("protos/platform/v0/platform.proto"), - PathBuf::from("src/platform/proto"), - ); +fn configure_platform(mut platform: MappingConfig) -> MappingConfig { // Derive features for versioned messages // // "GetConsensusParamsRequest" is excluded as this message does not support proofs @@ -92,6 +95,9 @@ pub fn generate() -> Result<(), std::io::Error> { .message_attribute(msg, r#"#[grpc_versions(0)]"#); } + // All messages can be mocked. + platform = platform.message_attribute(".", r#"#[derive( ::dapi_grpc_macros::Mockable)]"#); + #[cfg(feature = "serde")] let platform = platform .type_attribute( @@ -132,9 +138,21 @@ pub fn generate() -> Result<(), std::io::Error> { .field_attribute("Proof.signature", r#"#[serde(with = "serde_bytes")]"#) .field_attribute("Proof.block_id_hash", r#"#[serde(with = "serde_bytes")]"#); - platform.generate().unwrap(); + platform +} + +fn configure_core(mut core: MappingConfig) -> MappingConfig { + // All messages can be mocked. + core = core.message_attribute(".", r#"#[derive( ::dapi_grpc_macros::Mockable)]"#); + + // Serde support + #[cfg(feature = "serde")] + let core = core.type_attribute( + ".", + r#"#[derive(::serde::Serialize, ::serde::Deserialize)]"#, + ); - Ok(()) + core } impl MappingConfig { diff --git a/packages/dapi-grpc/clients/core/v0/nodejs/core_protoc.js b/packages/dapi-grpc/clients/core/v0/nodejs/core_protoc.js index ae974b2f81..e286a31c46 100644 --- a/packages/dapi-grpc/clients/core/v0/nodejs/core_protoc.js +++ b/packages/dapi-grpc/clients/core/v0/nodejs/core_protoc.js @@ -13,39 +13,39 @@ var jspb = require('google-protobuf'); var goog = jspb; -const proto = {}; - -goog.exportSymbol('proto.org.dash.platform.dapi.v0.BlockHeaders', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.BlockHeadersWithChainLocksRequest', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.BlockHeadersWithChainLocksRequest.FromBlockCase', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.BlockHeadersWithChainLocksResponse', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.BlockHeadersWithChainLocksResponse.ResponsesCase', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.BloomFilter', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.BroadcastTransactionRequest', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.BroadcastTransactionResponse', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetBlockRequest', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetBlockRequest.BlockCase', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetBlockResponse', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetEstimatedTransactionFeeRequest', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetEstimatedTransactionFeeResponse', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusRequest', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.Status', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Network', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Status', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Time', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Version', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTransactionRequest', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTransactionResponse', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.InstantSendLockMessages', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.RawTransactions', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.TransactionsWithProofsRequest', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.TransactionsWithProofsRequest.FromBlockCase', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.TransactionsWithProofsResponse', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.TransactionsWithProofsResponse.ResponsesCase', null, { proto }); +var global = Function('return this')(); + +goog.exportSymbol('proto.org.dash.platform.dapi.v0.BlockHeaders', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.BlockHeadersWithChainLocksRequest', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.BlockHeadersWithChainLocksRequest.FromBlockCase', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.BlockHeadersWithChainLocksResponse', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.BlockHeadersWithChainLocksResponse.ResponsesCase', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.BloomFilter', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.BroadcastTransactionRequest', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.BroadcastTransactionResponse', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetBlockRequest', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetBlockRequest.BlockCase', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetBlockResponse', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetEstimatedTransactionFeeRequest', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetEstimatedTransactionFeeResponse', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusRequest', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.Status', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Network', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Status', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Time', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Version', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTransactionRequest', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTransactionResponse', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.InstantSendLockMessages', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.RawTransactions', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.TransactionsWithProofsRequest', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.TransactionsWithProofsRequest.FromBlockCase', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.TransactionsWithProofsResponse', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.TransactionsWithProofsResponse.ResponsesCase', null, global); /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a diff --git a/packages/dapi-grpc/clients/core/v0/rust/core_example.rs b/packages/dapi-grpc/clients/core/v0/rust/core_example.rs index 8acc5f5030..e33cf00014 100644 --- a/packages/dapi-grpc/clients/core/v0/rust/core_example.rs +++ b/packages/dapi-grpc/clients/core/v0/rust/core_example.rs @@ -1,5 +1,5 @@ use dapi_grpc::core::v0 as core; -use prost::Message; +use dapi_grpc::Message; fn main() { let request = core::GetBlockRequest { diff --git a/packages/dapi-grpc/clients/core/v0/web/core_pb.js b/packages/dapi-grpc/clients/core/v0/web/core_pb.js index ae974b2f81..e286a31c46 100644 --- a/packages/dapi-grpc/clients/core/v0/web/core_pb.js +++ b/packages/dapi-grpc/clients/core/v0/web/core_pb.js @@ -13,39 +13,39 @@ var jspb = require('google-protobuf'); var goog = jspb; -const proto = {}; - -goog.exportSymbol('proto.org.dash.platform.dapi.v0.BlockHeaders', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.BlockHeadersWithChainLocksRequest', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.BlockHeadersWithChainLocksRequest.FromBlockCase', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.BlockHeadersWithChainLocksResponse', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.BlockHeadersWithChainLocksResponse.ResponsesCase', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.BloomFilter', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.BroadcastTransactionRequest', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.BroadcastTransactionResponse', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetBlockRequest', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetBlockRequest.BlockCase', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetBlockResponse', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetEstimatedTransactionFeeRequest', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetEstimatedTransactionFeeResponse', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusRequest', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.Status', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Network', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Status', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Time', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Version', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTransactionRequest', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTransactionResponse', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.InstantSendLockMessages', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.RawTransactions', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.TransactionsWithProofsRequest', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.TransactionsWithProofsRequest.FromBlockCase', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.TransactionsWithProofsResponse', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.TransactionsWithProofsResponse.ResponsesCase', null, { proto }); +var global = Function('return this')(); + +goog.exportSymbol('proto.org.dash.platform.dapi.v0.BlockHeaders', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.BlockHeadersWithChainLocksRequest', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.BlockHeadersWithChainLocksRequest.FromBlockCase', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.BlockHeadersWithChainLocksResponse', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.BlockHeadersWithChainLocksResponse.ResponsesCase', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.BloomFilter', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.BroadcastTransactionRequest', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.BroadcastTransactionResponse', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetBlockRequest', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetBlockRequest.BlockCase', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetBlockResponse', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetEstimatedTransactionFeeRequest', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetEstimatedTransactionFeeResponse', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusRequest', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.Status', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Network', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Status', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Time', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Version', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTransactionRequest', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTransactionResponse', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.InstantSendLockMessages', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.RawTransactions', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.TransactionsWithProofsRequest', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.TransactionsWithProofsRequest.FromBlockCase', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.TransactionsWithProofsResponse', null, global); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.TransactionsWithProofsResponse.ResponsesCase', null, global); /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a diff --git a/packages/dapi-grpc/clients/platform/v0/rust/platform_example.rs b/packages/dapi-grpc/clients/platform/v0/rust/platform_example.rs index 84b1ab6c00..855bec65b3 100644 --- a/packages/dapi-grpc/clients/platform/v0/rust/platform_example.rs +++ b/packages/dapi-grpc/clients/platform/v0/rust/platform_example.rs @@ -1,6 +1,6 @@ use dapi_grpc::platform::v0 as platform; use dapi_grpc::platform::v0::get_consensus_params_request::GetConsensusParamsRequestV0; -use prost::Message; +use dapi_grpc::Message; fn main() { let request = platform::GetConsensusParamsRequest { diff --git a/packages/dapi-grpc/src/core/proto/org.dash.platform.dapi.v0.rs b/packages/dapi-grpc/src/core/proto/org.dash.platform.dapi.v0.rs index 322464c795..b8fb055c6c 100644 --- a/packages/dapi-grpc/src/core/proto/org.dash.platform.dapi.v0.rs +++ b/packages/dapi-grpc/src/core/proto/org.dash.platform.dapi.v0.rs @@ -1,6 +1,10 @@ +#[derive(::serde::Serialize, ::serde::Deserialize)] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetStatusRequest {} +#[derive(::serde::Serialize, ::serde::Deserialize)] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetStatusResponse { @@ -21,6 +25,8 @@ pub struct GetStatusResponse { } /// Nested message and enum types in `GetStatusResponse`. pub mod get_status_response { + #[derive(::serde::Serialize, ::serde::Deserialize)] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct Version { @@ -31,6 +37,8 @@ pub mod get_status_response { #[prost(string, tag = "3")] pub agent: ::prost::alloc::string::String, } + #[derive(::serde::Serialize, ::serde::Deserialize)] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct Time { @@ -41,6 +49,8 @@ pub mod get_status_response { #[prost(uint32, tag = "3")] pub median: u32, } + #[derive(::serde::Serialize, ::serde::Deserialize)] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct Chain { @@ -61,6 +71,8 @@ pub mod get_status_response { #[prost(double, tag = "8")] pub sync_progress: f64, } + #[derive(::serde::Serialize, ::serde::Deserialize)] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct Masternode { @@ -77,6 +89,7 @@ pub mod get_status_response { } /// Nested message and enum types in `Masternode`. pub mod masternode { + #[derive(::serde::Serialize, ::serde::Deserialize)] #[derive( Clone, Copy, @@ -132,6 +145,8 @@ pub mod get_status_response { } } } + #[derive(::serde::Serialize, ::serde::Deserialize)] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct NetworkFee { @@ -140,6 +155,8 @@ pub mod get_status_response { #[prost(double, tag = "2")] pub incremental: f64, } + #[derive(::serde::Serialize, ::serde::Deserialize)] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct Network { @@ -148,6 +165,7 @@ pub mod get_status_response { #[prost(message, optional, tag = "2")] pub fee: ::core::option::Option, } + #[derive(::serde::Serialize, ::serde::Deserialize)] #[derive( Clone, Copy, @@ -191,6 +209,8 @@ pub mod get_status_response { } } } +#[derive(::serde::Serialize, ::serde::Deserialize)] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetBlockRequest { @@ -199,6 +219,7 @@ pub struct GetBlockRequest { } /// Nested message and enum types in `GetBlockRequest`. pub mod get_block_request { + #[derive(::serde::Serialize, ::serde::Deserialize)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Oneof)] pub enum Block { @@ -208,12 +229,16 @@ pub mod get_block_request { Hash(::prost::alloc::string::String), } } +#[derive(::serde::Serialize, ::serde::Deserialize)] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetBlockResponse { #[prost(bytes = "vec", tag = "1")] pub block: ::prost::alloc::vec::Vec, } +#[derive(::serde::Serialize, ::serde::Deserialize)] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct BroadcastTransactionRequest { @@ -224,18 +249,24 @@ pub struct BroadcastTransactionRequest { #[prost(bool, tag = "3")] pub bypass_limits: bool, } +#[derive(::serde::Serialize, ::serde::Deserialize)] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct BroadcastTransactionResponse { #[prost(string, tag = "1")] pub transaction_id: ::prost::alloc::string::String, } +#[derive(::serde::Serialize, ::serde::Deserialize)] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetTransactionRequest { #[prost(string, tag = "1")] pub id: ::prost::alloc::string::String, } +#[derive(::serde::Serialize, ::serde::Deserialize)] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetTransactionResponse { @@ -252,6 +283,8 @@ pub struct GetTransactionResponse { #[prost(bool, tag = "6")] pub is_chain_locked: bool, } +#[derive(::serde::Serialize, ::serde::Deserialize)] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct BlockHeadersWithChainLocksRequest { @@ -264,6 +297,7 @@ pub struct BlockHeadersWithChainLocksRequest { } /// Nested message and enum types in `BlockHeadersWithChainLocksRequest`. pub mod block_headers_with_chain_locks_request { + #[derive(::serde::Serialize, ::serde::Deserialize)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Oneof)] pub enum FromBlock { @@ -273,6 +307,8 @@ pub mod block_headers_with_chain_locks_request { FromBlockHeight(u32), } } +#[derive(::serde::Serialize, ::serde::Deserialize)] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct BlockHeadersWithChainLocksResponse { @@ -283,6 +319,7 @@ pub struct BlockHeadersWithChainLocksResponse { } /// Nested message and enum types in `BlockHeadersWithChainLocksResponse`. pub mod block_headers_with_chain_locks_response { + #[derive(::serde::Serialize, ::serde::Deserialize)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Oneof)] pub enum Responses { @@ -292,24 +329,32 @@ pub mod block_headers_with_chain_locks_response { ChainLock(::prost::alloc::vec::Vec), } } +#[derive(::serde::Serialize, ::serde::Deserialize)] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct BlockHeaders { #[prost(bytes = "vec", repeated, tag = "1")] pub headers: ::prost::alloc::vec::Vec<::prost::alloc::vec::Vec>, } +#[derive(::serde::Serialize, ::serde::Deserialize)] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetEstimatedTransactionFeeRequest { #[prost(uint32, tag = "1")] pub blocks: u32, } +#[derive(::serde::Serialize, ::serde::Deserialize)] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetEstimatedTransactionFeeResponse { #[prost(double, tag = "1")] pub fee: f64, } +#[derive(::serde::Serialize, ::serde::Deserialize)] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct TransactionsWithProofsRequest { @@ -324,6 +369,7 @@ pub struct TransactionsWithProofsRequest { } /// Nested message and enum types in `TransactionsWithProofsRequest`. pub mod transactions_with_proofs_request { + #[derive(::serde::Serialize, ::serde::Deserialize)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Oneof)] pub enum FromBlock { @@ -333,6 +379,8 @@ pub mod transactions_with_proofs_request { FromBlockHeight(u32), } } +#[derive(::serde::Serialize, ::serde::Deserialize)] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct BloomFilter { @@ -345,6 +393,8 @@ pub struct BloomFilter { #[prost(uint32, tag = "4")] pub n_flags: u32, } +#[derive(::serde::Serialize, ::serde::Deserialize)] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct TransactionsWithProofsResponse { @@ -353,6 +403,7 @@ pub struct TransactionsWithProofsResponse { } /// Nested message and enum types in `TransactionsWithProofsResponse`. pub mod transactions_with_proofs_response { + #[derive(::serde::Serialize, ::serde::Deserialize)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Oneof)] pub enum Responses { @@ -364,12 +415,16 @@ pub mod transactions_with_proofs_response { RawMerkleBlock(::prost::alloc::vec::Vec), } } +#[derive(::serde::Serialize, ::serde::Deserialize)] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct RawTransactions { #[prost(bytes = "vec", repeated, tag = "1")] pub transactions: ::prost::alloc::vec::Vec<::prost::alloc::vec::Vec>, } +#[derive(::serde::Serialize, ::serde::Deserialize)] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct InstantSendLockMessages { diff --git a/packages/dapi-grpc/src/lib.rs b/packages/dapi-grpc/src/lib.rs index 32d1a1ac5d..debc593aca 100644 --- a/packages/dapi-grpc/src/lib.rs +++ b/packages/dapi-grpc/src/lib.rs @@ -22,3 +22,9 @@ pub mod platform { #[cfg(feature = "serde")] // Serde deserialization logic pub mod deserialization; + +// We need mock module even if the feature is disabled +pub mod mock; + +// Re-export tonic to ensure everyone uses the same version +pub use tonic; diff --git a/packages/dapi-grpc/src/mock.rs b/packages/dapi-grpc/src/mock.rs new file mode 100644 index 0000000000..3ff7972b32 --- /dev/null +++ b/packages/dapi-grpc/src/mock.rs @@ -0,0 +1,68 @@ +//! Mocking support for messages. +//! +//! Contains [Mockable] trait that should be implemented by any object that can be used in the DAPI. +//! +//! Note that this trait is defined even if mocks are not supported, but it should always return `None` on serialization. +use tonic::Streaming; + +/// Mocking support for messages. +/// +/// This trait should be implemented by any object that can be used in the DAPI. +/// +/// We use serde_json to serialize/deserialize messages. +// TODO: Move to a different crate where it can be easily shared by dapi-grpc, dash-platform-sdk, and rs-dapi-client. +pub trait Mockable +where + Self: std::marker::Sized, +{ + /// Serialize the message to bytes for mocking purposes. + /// + /// Returns None if the message is not serializable or mocking is disabled. + /// + /// # Panics + /// + /// Panics on any error. + fn mock_serialize(&self) -> Option> { + None + } + /// Deserialize the message serialized with [mock_serialize()]. + /// + /// Returns None if the message is not serializable or mocking is disabled. + /// + /// # Panics + /// + /// Panics on any error. + fn mock_deserialize(_data: &[u8]) -> Option { + None + } +} + +impl Mockable for Option { + #[cfg(feature = "mocks")] + fn mock_serialize(&self) -> Option> { + self.as_ref().and_then(|value| value.mock_serialize()) + } + + #[cfg(feature = "mocks")] + fn mock_deserialize(data: &[u8]) -> Option { + T::mock_deserialize(data).map(Some) + } +} + +impl Mockable for Vec { + #[cfg(feature = "mocks")] + fn mock_serialize(&self) -> Option> { + serde_json::to_vec(self).ok() + } + + #[cfg(feature = "mocks")] + fn mock_deserialize(data: &[u8]) -> Option { + serde_json::from_slice(data).ok() + } +} + +/// Mocking of gRPC streaming responses is not supported. +/// +/// This will return `None` on serialization, +/// effectively disabling mocking of streaming responses. +impl Mockable for Streaming {} diff --git a/packages/dapi-grpc/src/platform/proto/org.dash.platform.dapi.v0.rs b/packages/dapi-grpc/src/platform/proto/org.dash.platform.dapi.v0.rs index eb8b1b9123..d074b92f12 100644 --- a/packages/dapi-grpc/src/platform/proto/org.dash.platform.dapi.v0.rs +++ b/packages/dapi-grpc/src/platform/proto/org.dash.platform.dapi.v0.rs @@ -1,5 +1,6 @@ #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct Proof { @@ -22,6 +23,7 @@ pub struct Proof { } #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct ResponseMetadata { @@ -42,6 +44,7 @@ pub struct ResponseMetadata { } #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct StateTransitionBroadcastError { @@ -54,6 +57,7 @@ pub struct StateTransitionBroadcastError { } #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct BroadcastStateTransitionRequest { @@ -62,6 +66,7 @@ pub struct BroadcastStateTransitionRequest { } #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct BroadcastStateTransitionResponse {} @@ -69,6 +74,7 @@ pub struct BroadcastStateTransitionResponse {} #[serde(rename_all = "snake_case")] #[derive(::dapi_grpc_macros::VersionedGrpcMessage)] #[grpc_versions(0)] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetIdentityRequest { @@ -79,6 +85,7 @@ pub struct GetIdentityRequest { pub mod get_identity_request { #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetIdentityRequestV0 { @@ -101,6 +108,7 @@ pub mod get_identity_request { #[serde(rename_all = "snake_case")] #[derive(::dapi_grpc_macros::VersionedGrpcMessage)] #[grpc_versions(0)] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetIdentityBalanceRequest { @@ -111,6 +119,7 @@ pub struct GetIdentityBalanceRequest { pub mod get_identity_balance_request { #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetIdentityBalanceRequestV0 { @@ -133,6 +142,7 @@ pub mod get_identity_balance_request { #[serde(rename_all = "snake_case")] #[derive(::dapi_grpc_macros::VersionedGrpcMessage)] #[grpc_versions(0)] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetIdentityBalanceAndRevisionRequest { @@ -145,6 +155,7 @@ pub struct GetIdentityBalanceAndRevisionRequest { pub mod get_identity_balance_and_revision_request { #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetIdentityBalanceAndRevisionRequestV0 { @@ -170,6 +181,7 @@ pub mod get_identity_balance_and_revision_request { ::dapi_grpc_macros::VersionedGrpcResponse )] #[grpc_versions(0)] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetIdentityResponse { @@ -180,6 +192,7 @@ pub struct GetIdentityResponse { pub mod get_identity_response { #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetIdentityResponseV0 { @@ -214,6 +227,7 @@ pub mod get_identity_response { #[serde(rename_all = "snake_case")] #[derive(::dapi_grpc_macros::VersionedGrpcMessage)] #[grpc_versions(0)] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetIdentitiesRequest { @@ -224,6 +238,7 @@ pub struct GetIdentitiesRequest { pub mod get_identities_request { #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetIdentitiesRequestV0 { @@ -249,6 +264,7 @@ pub mod get_identities_request { ::dapi_grpc_macros::VersionedGrpcResponse )] #[grpc_versions(0)] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetIdentitiesResponse { @@ -259,6 +275,7 @@ pub struct GetIdentitiesResponse { pub mod get_identities_response { #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct IdentityValue { @@ -267,6 +284,7 @@ pub mod get_identities_response { } #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct IdentityEntry { @@ -277,6 +295,7 @@ pub mod get_identities_response { } #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct Identities { @@ -285,6 +304,7 @@ pub mod get_identities_response { } #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetIdentitiesResponseV0 { @@ -322,6 +342,7 @@ pub mod get_identities_response { ::dapi_grpc_macros::VersionedGrpcResponse )] #[grpc_versions(0)] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetIdentityBalanceResponse { @@ -332,6 +353,7 @@ pub struct GetIdentityBalanceResponse { pub mod get_identity_balance_response { #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetIdentityBalanceResponseV0 { @@ -369,6 +391,7 @@ pub mod get_identity_balance_response { ::dapi_grpc_macros::VersionedGrpcResponse )] #[grpc_versions(0)] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetIdentityBalanceAndRevisionResponse { @@ -381,6 +404,7 @@ pub struct GetIdentityBalanceAndRevisionResponse { pub mod get_identity_balance_and_revision_response { #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetIdentityBalanceAndRevisionResponseV0 { @@ -398,6 +422,7 @@ pub mod get_identity_balance_and_revision_response { pub mod get_identity_balance_and_revision_response_v0 { #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct BalanceAndRevision { @@ -428,6 +453,7 @@ pub mod get_identity_balance_and_revision_response { } #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct KeyRequestType { @@ -451,11 +477,13 @@ pub mod key_request_type { } #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct AllKeys {} #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct SpecificKeys { @@ -464,6 +492,7 @@ pub struct SpecificKeys { } #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct SearchKey { @@ -472,6 +501,7 @@ pub struct SearchKey { } #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct SecurityLevelMap { @@ -528,6 +558,7 @@ pub mod security_level_map { #[serde(rename_all = "snake_case")] #[derive(::dapi_grpc_macros::VersionedGrpcMessage)] #[grpc_versions(0)] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetIdentityKeysRequest { @@ -538,6 +569,7 @@ pub struct GetIdentityKeysRequest { pub mod get_identity_keys_request { #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetIdentityKeysRequestV0 { @@ -569,6 +601,7 @@ pub mod get_identity_keys_request { ::dapi_grpc_macros::VersionedGrpcResponse )] #[grpc_versions(0)] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetIdentityKeysResponse { @@ -579,6 +612,7 @@ pub struct GetIdentityKeysResponse { pub mod get_identity_keys_response { #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetIdentityKeysResponseV0 { @@ -591,6 +625,7 @@ pub mod get_identity_keys_response { pub mod get_identity_keys_response_v0 { #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct Keys { @@ -621,6 +656,7 @@ pub mod get_identity_keys_response { #[serde(rename_all = "snake_case")] #[derive(::dapi_grpc_macros::VersionedGrpcMessage)] #[grpc_versions(0)] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetProofsRequest { @@ -631,6 +667,7 @@ pub struct GetProofsRequest { pub mod get_proofs_request { #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetProofsRequestV0 { @@ -645,6 +682,7 @@ pub mod get_proofs_request { pub mod get_proofs_request_v0 { #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct DocumentRequest { @@ -659,6 +697,7 @@ pub mod get_proofs_request { } #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct IdentityRequest { @@ -714,6 +753,7 @@ pub mod get_proofs_request { } #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct ContractRequest { @@ -737,6 +777,7 @@ pub mod get_proofs_request { ::dapi_grpc_macros::VersionedGrpcResponse )] #[grpc_versions(0)] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetProofsResponse { @@ -747,6 +788,7 @@ pub struct GetProofsResponse { pub mod get_proofs_response { #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetProofsResponseV0 { @@ -779,6 +821,7 @@ pub mod get_proofs_response { #[serde(rename_all = "snake_case")] #[derive(::dapi_grpc_macros::VersionedGrpcMessage)] #[grpc_versions(0)] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetDataContractRequest { @@ -789,6 +832,7 @@ pub struct GetDataContractRequest { pub mod get_data_contract_request { #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetDataContractRequestV0 { @@ -814,6 +858,7 @@ pub mod get_data_contract_request { ::dapi_grpc_macros::VersionedGrpcResponse )] #[grpc_versions(0)] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetDataContractResponse { @@ -824,6 +869,7 @@ pub struct GetDataContractResponse { pub mod get_data_contract_response { #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetDataContractResponseV0 { @@ -858,6 +904,7 @@ pub mod get_data_contract_response { #[serde(rename_all = "snake_case")] #[derive(::dapi_grpc_macros::VersionedGrpcMessage)] #[grpc_versions(0)] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetDataContractsRequest { @@ -868,6 +915,7 @@ pub struct GetDataContractsRequest { pub mod get_data_contracts_request { #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetDataContractsRequestV0 { @@ -893,6 +941,7 @@ pub mod get_data_contracts_request { ::dapi_grpc_macros::VersionedGrpcResponse )] #[grpc_versions(0)] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetDataContractsResponse { @@ -903,6 +952,7 @@ pub struct GetDataContractsResponse { pub mod get_data_contracts_response { #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct DataContractEntry { @@ -913,6 +963,7 @@ pub mod get_data_contracts_response { } #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct DataContracts { @@ -921,6 +972,7 @@ pub mod get_data_contracts_response { } #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetDataContractsResponseV0 { @@ -955,6 +1007,7 @@ pub mod get_data_contracts_response { #[serde(rename_all = "snake_case")] #[derive(::dapi_grpc_macros::VersionedGrpcMessage)] #[grpc_versions(0)] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetDataContractHistoryRequest { @@ -965,6 +1018,7 @@ pub struct GetDataContractHistoryRequest { pub mod get_data_contract_history_request { #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetDataContractHistoryRequestV0 { @@ -997,6 +1051,7 @@ pub mod get_data_contract_history_request { ::dapi_grpc_macros::VersionedGrpcResponse )] #[grpc_versions(0)] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetDataContractHistoryResponse { @@ -1007,6 +1062,7 @@ pub struct GetDataContractHistoryResponse { pub mod get_data_contract_history_response { #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetDataContractHistoryResponseV0 { @@ -1021,6 +1077,7 @@ pub mod get_data_contract_history_response { pub mod get_data_contract_history_response_v0 { #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct DataContractHistoryEntry { @@ -1031,6 +1088,7 @@ pub mod get_data_contract_history_response { } #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct DataContractHistory { @@ -1063,6 +1121,7 @@ pub mod get_data_contract_history_response { #[serde(rename_all = "snake_case")] #[derive(::dapi_grpc_macros::VersionedGrpcMessage)] #[grpc_versions(0)] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetDocumentsRequest { @@ -1073,6 +1132,7 @@ pub struct GetDocumentsRequest { pub mod get_documents_request { #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetDocumentsRequestV0 { @@ -1123,6 +1183,7 @@ pub mod get_documents_request { ::dapi_grpc_macros::VersionedGrpcResponse )] #[grpc_versions(0)] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetDocumentsResponse { @@ -1133,6 +1194,7 @@ pub struct GetDocumentsResponse { pub mod get_documents_response { #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetDocumentsResponseV0 { @@ -1145,6 +1207,7 @@ pub mod get_documents_response { pub mod get_documents_response_v0 { #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct Documents { @@ -1175,6 +1238,7 @@ pub mod get_documents_response { #[serde(rename_all = "snake_case")] #[derive(::dapi_grpc_macros::VersionedGrpcMessage)] #[grpc_versions(0)] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetIdentitiesByPublicKeyHashesRequest { @@ -1187,6 +1251,7 @@ pub struct GetIdentitiesByPublicKeyHashesRequest { pub mod get_identities_by_public_key_hashes_request { #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetIdentitiesByPublicKeyHashesRequestV0 { @@ -1212,6 +1277,7 @@ pub mod get_identities_by_public_key_hashes_request { ::dapi_grpc_macros::VersionedGrpcResponse )] #[grpc_versions(0)] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetIdentitiesByPublicKeyHashesResponse { @@ -1224,6 +1290,7 @@ pub struct GetIdentitiesByPublicKeyHashesResponse { pub mod get_identities_by_public_key_hashes_response { #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct PublicKeyHashIdentityEntry { @@ -1235,6 +1302,7 @@ pub mod get_identities_by_public_key_hashes_response { } #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct IdentitiesByPublicKeyHashes { @@ -1243,6 +1311,7 @@ pub mod get_identities_by_public_key_hashes_response { } #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetIdentitiesByPublicKeyHashesResponseV0 { @@ -1282,6 +1351,7 @@ pub mod get_identities_by_public_key_hashes_response { #[serde(rename_all = "snake_case")] #[derive(::dapi_grpc_macros::VersionedGrpcMessage)] #[grpc_versions(0)] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetIdentityByPublicKeyHashRequest { @@ -1294,6 +1364,7 @@ pub struct GetIdentityByPublicKeyHashRequest { pub mod get_identity_by_public_key_hash_request { #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetIdentityByPublicKeyHashRequestV0 { @@ -1319,6 +1390,7 @@ pub mod get_identity_by_public_key_hash_request { ::dapi_grpc_macros::VersionedGrpcResponse )] #[grpc_versions(0)] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetIdentityByPublicKeyHashResponse { @@ -1331,6 +1403,7 @@ pub struct GetIdentityByPublicKeyHashResponse { pub mod get_identity_by_public_key_hash_response { #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetIdentityByPublicKeyHashResponseV0 { @@ -1370,6 +1443,7 @@ pub mod get_identity_by_public_key_hash_response { #[serde(rename_all = "snake_case")] #[derive(::dapi_grpc_macros::VersionedGrpcMessage)] #[grpc_versions(0)] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct WaitForStateTransitionResultRequest { @@ -1382,6 +1456,7 @@ pub struct WaitForStateTransitionResultRequest { pub mod wait_for_state_transition_result_request { #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct WaitForStateTransitionResultRequestV0 { @@ -1406,6 +1481,7 @@ pub mod wait_for_state_transition_result_request { ::dapi_grpc_macros::VersionedGrpcResponse )] #[grpc_versions(0)] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct WaitForStateTransitionResultResponse { @@ -1418,6 +1494,7 @@ pub struct WaitForStateTransitionResultResponse { pub mod wait_for_state_transition_result_response { #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct WaitForStateTransitionResultResponseV0 { @@ -1455,6 +1532,7 @@ pub mod wait_for_state_transition_result_response { } #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetConsensusParamsRequest { @@ -1465,6 +1543,7 @@ pub struct GetConsensusParamsRequest { pub mod get_consensus_params_request { #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetConsensusParamsRequestV0 { @@ -1484,6 +1563,7 @@ pub mod get_consensus_params_request { } #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetConsensusParamsResponse { @@ -1494,6 +1574,7 @@ pub struct GetConsensusParamsResponse { pub mod get_consensus_params_response { #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct ConsensusParamsBlock { @@ -1506,6 +1587,7 @@ pub mod get_consensus_params_response { } #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct ConsensusParamsEvidence { @@ -1518,6 +1600,7 @@ pub mod get_consensus_params_response { } #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetConsensusParamsResponseV0 { @@ -1539,6 +1622,7 @@ pub mod get_consensus_params_response { #[serde(rename_all = "snake_case")] #[derive(::dapi_grpc_macros::VersionedGrpcMessage)] #[grpc_versions(0)] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetProtocolVersionUpgradeStateRequest { @@ -1551,6 +1635,7 @@ pub struct GetProtocolVersionUpgradeStateRequest { pub mod get_protocol_version_upgrade_state_request { #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetProtocolVersionUpgradeStateRequestV0 { @@ -1573,6 +1658,7 @@ pub mod get_protocol_version_upgrade_state_request { ::dapi_grpc_macros::VersionedGrpcResponse )] #[grpc_versions(0)] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetProtocolVersionUpgradeStateResponse { @@ -1585,6 +1671,7 @@ pub struct GetProtocolVersionUpgradeStateResponse { pub mod get_protocol_version_upgrade_state_response { #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetProtocolVersionUpgradeStateResponseV0 { @@ -1602,6 +1689,7 @@ pub mod get_protocol_version_upgrade_state_response { pub mod get_protocol_version_upgrade_state_response_v0 { #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct Versions { @@ -1610,6 +1698,7 @@ pub mod get_protocol_version_upgrade_state_response { } #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct VersionEntry { @@ -1642,6 +1731,7 @@ pub mod get_protocol_version_upgrade_state_response { #[serde(rename_all = "snake_case")] #[derive(::dapi_grpc_macros::VersionedGrpcMessage)] #[grpc_versions(0)] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetProtocolVersionUpgradeVoteStatusRequest { @@ -1657,6 +1747,7 @@ pub struct GetProtocolVersionUpgradeVoteStatusRequest { pub mod get_protocol_version_upgrade_vote_status_request { #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetProtocolVersionUpgradeVoteStatusRequestV0 { @@ -1683,6 +1774,7 @@ pub mod get_protocol_version_upgrade_vote_status_request { ::dapi_grpc_macros::VersionedGrpcResponse )] #[grpc_versions(0)] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetProtocolVersionUpgradeVoteStatusResponse { @@ -1698,6 +1790,7 @@ pub struct GetProtocolVersionUpgradeVoteStatusResponse { pub mod get_protocol_version_upgrade_vote_status_response { #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetProtocolVersionUpgradeVoteStatusResponseV0 { @@ -1715,6 +1808,7 @@ pub mod get_protocol_version_upgrade_vote_status_response { pub mod get_protocol_version_upgrade_vote_status_response_v0 { #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct VersionSignals { @@ -1723,6 +1817,7 @@ pub mod get_protocol_version_upgrade_vote_status_response { } #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct VersionSignal { @@ -1753,6 +1848,7 @@ pub mod get_protocol_version_upgrade_vote_status_response { } #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetEpochsInfoRequest { @@ -1763,6 +1859,7 @@ pub struct GetEpochsInfoRequest { pub mod get_epochs_info_request { #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetEpochsInfoRequestV0 { @@ -1791,6 +1888,7 @@ pub mod get_epochs_info_request { ::dapi_grpc_macros::VersionedGrpcResponse )] #[grpc_versions(0)] +#[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetEpochsInfoResponse { @@ -1801,6 +1899,7 @@ pub struct GetEpochsInfoResponse { pub mod get_epochs_info_response { #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetEpochsInfoResponseV0 { @@ -1813,6 +1912,7 @@ pub mod get_epochs_info_response { pub mod get_epochs_info_response_v0 { #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct EpochInfos { @@ -1821,6 +1921,7 @@ pub mod get_epochs_info_response { } #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct EpochInfo { diff --git a/packages/dapi/lib/grpcServer/handlers/createGrpcErrorFromDriveResponse.js b/packages/dapi/lib/grpcServer/handlers/createGrpcErrorFromDriveResponse.js index 1d190d63bf..924b5a709e 100644 --- a/packages/dapi/lib/grpcServer/handlers/createGrpcErrorFromDriveResponse.js +++ b/packages/dapi/lib/grpcServer/handlers/createGrpcErrorFromDriveResponse.js @@ -19,6 +19,7 @@ const { default: loadWasmDpp, deserializeConsensusError } = require('@dashevo/wa const GrpcErrorCodes = require('@dashevo/grpc-common/lib/server/error/GrpcErrorCodes'); const AlreadyExistsGrpcError = require('@dashevo/grpc-common/lib/server/error/AlreadyExistsGrpcError'); +const logger = require('../../logger'); /** * @param {Object} data @@ -110,7 +111,18 @@ async function createGrpcErrorFromDriveResponse(code, info) { // DPP errors if (code >= 1000 && code < 5000) { - const consensusError = deserializeConsensusError(data.serializedError || []); + let consensusError; + try { + consensusError = deserializeConsensusError(data.serializedError || []); + } catch (e) { + logger.error({ + err: e, + data: data.serializedError, + code, + }, `Failed to deserialize consensus error with code ${code}: ${e.message}`); + + throw e; + } // Basic if (code >= 1000 && code < 2000) { diff --git a/packages/dapi/lib/grpcServer/handlers/tx-filter-stream/subscribeToTransactionsWithProofsHandlerFactory.js b/packages/dapi/lib/grpcServer/handlers/tx-filter-stream/subscribeToTransactionsWithProofsHandlerFactory.js index 4246616c0c..e71087f0cd 100644 --- a/packages/dapi/lib/grpcServer/handlers/tx-filter-stream/subscribeToTransactionsWithProofsHandlerFactory.js +++ b/packages/dapi/lib/grpcServer/handlers/tx-filter-stream/subscribeToTransactionsWithProofsHandlerFactory.js @@ -159,7 +159,7 @@ function subscribeToTransactionsWithProofsHandlerFactory( mediator.on( ProcessMediator.EVENTS.TRANSACTION, async (tx) => { - requestLogger.debug(`send transaction ${tx.hash}`); + requestLogger.debug(`sent transaction ${tx.hash}`); await sendTransactionsResponse(acknowledgingCall, [tx]); }, @@ -168,7 +168,7 @@ function subscribeToTransactionsWithProofsHandlerFactory( mediator.on( ProcessMediator.EVENTS.MERKLE_BLOCK, async (merkleBlock) => { - requestLogger.debug('send merkle block'); + requestLogger.debug(`sent merkle block ${merkleBlock.header.hash}`); await sendMerkleBlockResponse(acknowledgingCall, merkleBlock); }, @@ -179,7 +179,7 @@ function subscribeToTransactionsWithProofsHandlerFactory( async (instantLock) => { requestLogger.debug({ instantLock, - }, `send instant lock for ${instantLock.txid}`); + }, `sent instant lock for ${instantLock.txid}`); await sendInstantLockResponse(acknowledgingCall, instantLock); }, diff --git a/packages/dapi/lib/transactionsFilter/emitInstantLockToFilterCollectionFactory.js b/packages/dapi/lib/transactionsFilter/emitInstantLockToFilterCollectionFactory.js index 8958bad1f8..6c60898f8f 100644 --- a/packages/dapi/lib/transactionsFilter/emitInstantLockToFilterCollectionFactory.js +++ b/packages/dapi/lib/transactionsFilter/emitInstantLockToFilterCollectionFactory.js @@ -19,9 +19,7 @@ function emitInstantLockToFilterCollectionFactory(bloomFilterEmitterCollection) const instantLock = new InstantLock(txLockBuffer); - logger.debug({ - instantLock, - }, `instant lock received for ${transaction.hash}`); + logger.debug(`instant lock received for ${transaction.hash}`); bloomFilterEmitterCollection.emit('instantLock', { transaction, diff --git a/packages/dashmate/templates/platform/dapi/envoy/envoy.yaml.dot b/packages/dashmate/templates/platform/dapi/envoy/envoy.yaml.dot index 72447cb811..494f1cc52a 100644 --- a/packages/dashmate/templates/platform/dapi/envoy/envoy.yaml.dot +++ b/packages/dashmate/templates/platform/dapi/envoy/envoy.yaml.dot @@ -80,6 +80,12 @@ timeout: 660s max_stream_duration: grpc_timeout_header_max: 600s + # set timeout for waitForStateTransitionResult + - match: + prefix: "/org.dash.platform.dapi.v0.Platform/waitForStateTransitionResult" + route: + cluster: core_and_platform + timeout: 80s # core unary endpoints - match: prefix: "/org.dash.platform.dapi.v0.Core" diff --git a/packages/rs-dapi-client/Cargo.toml b/packages/rs-dapi-client/Cargo.toml index eaeb74d573..f479f4cd95 100644 --- a/packages/rs-dapi-client/Cargo.toml +++ b/packages/rs-dapi-client/Cargo.toml @@ -5,9 +5,9 @@ edition = "2021" [features] default = ["mocks", "offline-testing"] -mocks = ["dep:serde_json", "dep:sha2", "dep:hex"] +mocks = ["dep:sha2", "dep:hex", "dapi-grpc/mocks"] # dump requests and responses to file -dump = ["mocks", "dep:serde_json", "dep:sha2", "dep:chrono", "dep:hex"] +dump = ["mocks", "dep:chrono"] # skip tests that require connection to the platform; enabled by default offline-testing = [] @@ -19,12 +19,7 @@ futures = "0.3.28" http = "0.2.9" rand = { version = "0.8.5", features = ["small_rng"] } thiserror = "1.0.41" -tonic = "0.9.2" -tracing = "0.1.37" -serde = { version = "1.0.171", default-features = false } -serde_json = { version = "1.0.103", features = [ - "preserve_order", -], optional = true } +tracing = "0.1.40" tokio = { version = "1.32.0", default-features = false } sha2 = { version = "0.10", optional = true } chrono = { version = "0.4.31", optional = true } diff --git a/packages/rs-dapi-client/src/address_list.rs b/packages/rs-dapi-client/src/address_list.rs index 7d6aa6845f..6f1d2e8cf9 100644 --- a/packages/rs-dapi-client/src/address_list.rs +++ b/packages/rs-dapi-client/src/address_list.rs @@ -1,50 +1,92 @@ -//! Subsystem to manage peers. +//! Subsystem to manage DAPI nodes. +use std::collections::HashSet; +use std::hash::{Hash, Hasher}; +use std::str::FromStr; use std::time; +use std::time::Duration; use http::Uri; use rand::{rngs::SmallRng, seq::IteratorRandom, SeedableRng}; -const DEFAULT_BASE_BAN_PERIOD: time::Duration = time::Duration::from_secs(60); +const DEFAULT_BASE_BAN_PERIOD: Duration = Duration::from_secs(60); -/// Peer's address. -#[derive(Debug)] +/// DAPI address. +#[derive(Debug, Clone, Eq)] pub struct Address { - base_ban_period: time::Duration, ban_count: usize, banned_until: Option, uri: Uri, } +impl PartialEq for Address { + fn eq(&self, other: &Self) -> bool { + self.uri == other.uri + } +} + +impl PartialEq for Address { + fn eq(&self, other: &Uri) -> bool { + self.uri == *other + } +} + +impl Hash for Address { + fn hash(&self, state: &mut H) { + self.uri.hash(state); + } +} + +impl From for Address { + fn from(uri: Uri) -> Self { + Address { + ban_count: 0, + banned_until: None, + uri, + } + } +} + impl Address { /// Ban the [Address] so it won't be available through [AddressList::get_live_address] for some time. - pub fn ban(&mut self) { + fn ban(&mut self, base_ban_period: &Duration) { let coefficient = (self.ban_count as f64).exp(); - let ban_period = - time::Duration::from_secs_f64(self.base_ban_period.as_secs_f64() * coefficient); + let ban_period = Duration::from_secs_f64(base_ban_period.as_secs_f64() * coefficient); self.banned_until = Some(time::Instant::now() + ban_period); self.ban_count += 1; } + /// Check if [Address] is banned. + pub fn is_banned(&self) -> bool { + self.ban_count > 0 + } + /// Clears ban record. - pub fn clear_ban(&mut self) { + fn unban(&mut self) { self.ban_count = 0; self.banned_until = None; } - /// Get [Uri] of a peer. + /// Get [Uri] of a node. pub fn uri(&self) -> &Uri { &self.uri } } -/// A structure to manage peer's addresses to select from +/// [AddressList] errors +#[derive(Debug, thiserror::Error)] +pub enum AddressListError { + #[error("address {0} not found in the list")] + AddressNotFound(Uri), +} + +/// A structure to manage DAPI addresses to select from /// for [DapiRequest](crate::DapiRequest) execution. #[derive(Debug)] pub struct AddressList { - addresses: Vec

, - base_ban_period: time::Duration, + addresses: HashSet
, + base_ban_period: Duration, } impl Default for AddressList { @@ -53,6 +95,12 @@ impl Default for AddressList { } } +impl std::fmt::Display for Address { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + self.uri.fmt(f) + } +} + impl AddressList { /// Creates an empty [AddressList] with default base ban time. pub fn new() -> Self { @@ -60,32 +108,63 @@ impl AddressList { } /// Creates an empty [AddressList] with adjustable base ban time. - pub fn with_settings(base_ban_period: time::Duration) -> Self { + pub fn with_settings(base_ban_period: Duration) -> Self { AddressList { - addresses: Vec::new(), + addresses: HashSet::new(), base_ban_period, } } + /// Bans address + pub(crate) fn ban_address(&mut self, address: &Address) -> Result<(), AddressListError> { + if !self.addresses.remove(address) { + return Err(AddressListError::AddressNotFound(address.uri.clone())); + }; + + let mut banned_address = address.clone(); + banned_address.ban(&self.base_ban_period); + + self.addresses.insert(banned_address); + + Ok(()) + } + + /// Clears address' ban record + pub(crate) fn unban_address(&mut self, address: &Address) -> Result<(), AddressListError> { + if !self.addresses.remove(address) { + return Err(AddressListError::AddressNotFound(address.uri.clone())); + }; + + let mut unbanned_address = address.clone(); + unbanned_address.unban(); + + self.addresses.insert(unbanned_address); + + Ok(()) + } + + /// Adds a node [Address] to [AddressList] + /// Returns false if the address is already in the list. + pub fn add(&mut self, address: Address) -> bool { + self.addresses.insert(address) + } + // TODO: this is the most simple way to add an address - // however we need to support bulk loading (e.g. providing a network name) - // and also fetch updated from SML. - /// Manually add a peer to [AddressList]. - pub fn add_uri(&mut self, uri: Uri) { - self.addresses.push(Address { - ban_count: 0, - banned_until: None, - base_ban_period: self.base_ban_period, - uri, - }); + // however we need to support bulk loading (e.g. providing a network name) + // and also fetch updated from SML. + /// Add a node [Address] to [AddressList] by [Uri]. + /// Returns false if the address is already in the list. + pub fn add_uri(&mut self, uri: Uri) -> bool { + self.addresses.insert(uri.into()) } /// Randomly select a not banned address. - pub fn get_live_address(&mut self) -> Option<&mut Address> { + pub fn get_live_address(&self) -> Option<&Address> { let now = time::Instant::now(); let mut rng = SmallRng::from_entropy(); + self.addresses - .iter_mut() + .iter() .filter(|addr| { addr.banned_until .map(|banned_until| banned_until < now) @@ -95,6 +174,17 @@ impl AddressList { } } +impl From<&str> for AddressList { + fn from(value: &str) -> Self { + let uri_list: Vec = value + .split(',') + .map(|uri| Uri::from_str(uri).expect("invalid uri")) + .collect(); + + Self::from_iter(uri_list) + } +} + impl FromIterator for AddressList { fn from_iter>(iter: T) -> Self { let mut address_list = Self::new(); diff --git a/packages/rs-dapi-client/src/dapi_client.rs b/packages/rs-dapi-client/src/dapi_client.rs index ca50c08666..12962e9774 100644 --- a/packages/rs-dapi-client/src/dapi_client.rs +++ b/packages/rs-dapi-client/src/dapi_client.rs @@ -1,23 +1,30 @@ //! [DapiClient] definition. use backon::{ExponentialBuilder, Retryable}; -use tonic::async_trait; +use dapi_grpc::mock::Mockable; +use dapi_grpc::tonic::async_trait; +use std::sync::RwLock; +use std::time::Duration; use tracing::Instrument; +use crate::address_list::AddressListError; use crate::{ transport::{TransportClient, TransportRequest}, - AddressList, CanRetry, RequestSettings, + Address, AddressList, CanRetry, RequestSettings, }; /// General DAPI request error type. #[derive(Debug, thiserror::Error)] pub enum DapiClientError { /// The error happened on transport layer - #[error("transport error: {0}")] - Transport(TE), - /// There are no valid peer addresses to use. + #[error("transport error with {1}: {0}")] + Transport(TE, Address), + /// There are no valid DAPI addresses to use. #[error("no available addresses to use")] NoAvailableAddresses, + /// [AddressListError] errors + #[error("address list error: {0}")] + AddressList(AddressListError), #[cfg(feature = "mocks")] /// Expectation not found #[error("mock expectation not found for request: {0}")] @@ -25,11 +32,12 @@ pub enum DapiClientError { } impl CanRetry for DapiClientError { - fn can_retry(&self) -> bool { + fn is_node_failure(&self) -> bool { use DapiClientError::*; match self { NoAvailableAddresses => false, - Transport(transport_error) => transport_error.can_retry(), + Transport(transport_error, _) => transport_error.is_node_failure(), + AddressList(_) => false, #[cfg(feature = "mocks")] MockExpectationNotFound(_) => false, } @@ -37,36 +45,23 @@ impl CanRetry for DapiClientError { } #[async_trait] -/// DAPI client trait. -pub trait Dapi { +/// DAPI client executor trait. +pub trait DapiRequestExecutor { /// Execute request using this DAPI client. async fn execute( - &mut self, + &self, request: R, settings: RequestSettings, ) -> Result::Error>> where - R: TransportRequest; -} - -#[async_trait] -impl Dapi for &mut D { - async fn execute( - &mut self, - request: R, - settings: RequestSettings, - ) -> Result::Error>> - where - R: TransportRequest, - { - (**self).execute(request, settings).await - } + R: TransportRequest + Mockable, + R::Response: Mockable; } /// Access point to DAPI. #[derive(Debug)] pub struct DapiClient { - address_list: AddressList, + address_list: RwLock, settings: RequestSettings, #[cfg(feature = "dump")] pub(crate) dump_dir: Option, @@ -76,7 +71,7 @@ impl DapiClient { /// Initialize new [DapiClient] and optionally override default settings. pub fn new(address_list: AddressList, settings: RequestSettings) -> Self { Self { - address_list, + address_list: RwLock::new(address_list), settings, #[cfg(feature = "dump")] dump_dir: None, @@ -85,15 +80,16 @@ impl DapiClient { } #[async_trait] -impl Dapi for DapiClient { +impl DapiRequestExecutor for DapiClient { /// Execute the [DapiRequest](crate::DapiRequest). async fn execute( - &mut self, + &self, request: R, settings: RequestSettings, ) -> Result::Error>> where - R: TransportRequest, + R: TransportRequest + Mockable, + R::Response: Mockable, { // Join settings of different sources to get final version of the settings for this execution: let applied_settings = self @@ -103,7 +99,12 @@ impl Dapi for DapiClient { .finalize(); // Setup retry policy: - let retry_settings = ExponentialBuilder::default().with_max_times(applied_settings.retries); + let retry_settings = ExponentialBuilder::default() + .with_max_times(applied_settings.retries) + // backon doesn't accept 1.0 + .with_factor(1.001) + .with_min_delay(Duration::from_secs(0)) + .with_max_delay(Duration::from_secs(0)); // Save dump dir for later use, as self is moved into routine #[cfg(feature = "dump")] @@ -115,42 +116,117 @@ impl Dapi for DapiClient { // more once to build new future on each retry. let routine = move || { // Try to get an address to initialize transport on: - let address = self.address_list.get_live_address().ok_or( + + let address_list = self + .address_list + .read() + .expect("can't get address list for read"); + + let address_result = address_list.get_live_address().cloned().ok_or( DapiClientError::<::Error>::NoAvailableAddresses, ); - // Get a transport client requried by the DAPI request from this DAPI client. - // It stays wrapped in `Result` since we want to return - // `impl Future`, not a `Result` itself. - let transport_client = address.map(|addr| R::Client::with_uri(addr.uri().clone())); + drop(address_list); + + let _span = tracing::trace_span!( + "execute request", + address = ?address_result, + settings = ?applied_settings, + method = request.method_name(), + ) + .entered(); + + tracing::trace!( + ?request, + "calling {} with {} request", + request.method_name(), + request.request_name(), + ); let transport_request = request.clone(); + let response_name = request.response_name(); // Create a future using `async` block that will be returned from the closure on // each retry. Could be just a request future, but need to unpack client first. async move { - transport_request - .execute_transport(&mut transport_client?, &applied_settings) + // It stays wrapped in `Result` since we want to return + // `impl Future`, not a `Result` itself. + let address = address_result?; + + let mut transport_client = + R::Client::with_uri_and_settings(address.uri().clone(), &applied_settings); + + let response = transport_request + .execute_transport(&mut transport_client, &applied_settings) .await .map_err(|e| { - DapiClientError::<::Error>::Transport(e) - }) + DapiClientError::<::Error>::Transport( + e, + address.clone(), + ) + }); + + match &response { + Ok(_) => { + // Unban the address if it was banned and node responded successfully this time + if address.is_banned() { + let mut address_list = self + .address_list + .write() + .expect("can't get address list for write"); + + address_list.unban_address(&address) + .map_err(DapiClientError::<::Error>::AddressList)?; + } + + tracing::trace!(?response, "received {} response", response_name); + } + Err(error) => { + if error.is_node_failure() { + if applied_settings.ban_failed_address { + let mut address_list = self + .address_list + .write() + .expect("can't get address list for write"); + + address_list.ban_address(&address) + .map_err(DapiClientError::<::Error>::AddressList)?; + } + } else { + tracing::trace!(?error, "received error"); + } + } + }; + + response } }; // Start the routine with retry policy applied: // We allow let_and_return because `result` is used later if dump feature is enabled - #[allow(clippy::let_and_return)] let result = routine .retry(&retry_settings) - .when(|e| e.can_retry()) + .notify(|error, duration| { + tracing::warn!( + ?error, + "retrying error with sleeping {} secs", + duration.as_secs_f32() + ) + }) + .when(|e| e.is_node_failure()) .instrument(tracing::info_span!("request routine")) .await; + if let Err(error) = &result { + if error.is_node_failure() { + tracing::error!(?error, "request failed"); + } + } + // Dump request and response to disk if dump_dir is set: #[cfg(feature = "dump")] - if let Ok(ref result) = &result { - Self::dump_request_response(dump_request, result.clone(), dump_dir); + if let Ok(result) = &result { + Self::dump_request_response(&dump_request, result, dump_dir); } result diff --git a/packages/rs-dapi-client/src/dump.rs b/packages/rs-dapi-client/src/dump.rs index 4abafd6a65..26f90f57d9 100644 --- a/packages/rs-dapi-client/src/dump.rs +++ b/packages/rs-dapi-client/src/dump.rs @@ -1,21 +1,100 @@ //! Dumping of requests and responses to disk +use dapi_grpc::mock::Mockable; + use crate::{mock::Key, transport::TransportRequest, DapiClient}; -use std::path::PathBuf; +use std::{any::type_name, path::PathBuf}; -#[derive(serde::Serialize, serde::Deserialize)] /// Data format of dumps created with [DapiClient::dump_dir]. +#[derive(Clone)] pub struct DumpData { /// Request that was sent to DAPI. - pub request: T, + pub serialized_request: Vec, /// Response that was received from DAPI. - pub response: T::Response, + pub serialized_response: Vec, + + phantom: std::marker::PhantomData, +} +impl DumpData { + /// Return deserialized request + pub fn deserialize(&self) -> (T, T::Response) { + let req = T::mock_deserialize(&self.serialized_request).unwrap_or_else(|| { + panic!( + "unable to deserialize mock data of type {}", + type_name::() + ) + }); + let resp = T::Response::mock_deserialize(&self.serialized_response).unwrap_or_else(|| { + panic!( + "unable to deserialize mock data of type {}", + type_name::() + ) + }); + + (req, resp) + } +} + +impl dapi_grpc::mock::Mockable for DumpData +where + T: Mockable, + T::Response: Mockable, +{ + // We use null-delimited JSON as a format for dump data to make it readable. + fn mock_serialize(&self) -> Option> { + // nulls are not allowed in serialized data as we use it as a delimiter + if self.serialized_request.contains(&0) { + panic!("null byte in serialized request"); + } + if self.serialized_response.contains(&0) { + panic!("null byte in serialized response"); + } + + let data = [ + &self.serialized_request, + "\n\0\n".as_bytes(), + &self.serialized_response, + ] + .concat(); + + Some(data) + } + + fn mock_deserialize(buf: &[u8]) -> Option { + // we panic as we expect this to be called only with data serialized by mock_serialize() + + // Split data into request and response + let buf = buf.split(|&b| b == 0).collect::>(); + if buf.len() != 2 { + panic!("invalid mock data format, expected exactly two items separated by null byte"); + } + + let request = buf.first().expect("missing request in mock data"); + let response = buf.last().expect("missing response in mock data"); + + Some(Self { + serialized_request: request.to_vec(), + serialized_response: response.to_vec(), + phantom: std::marker::PhantomData, + }) + } } impl DumpData { /// Create new dump data. - pub fn new(request: T, response: T::Response) -> Self { - Self { request, response } + pub fn new(request: &T, response: &T::Response) -> Self { + let request = request + .mock_serialize() + .expect("unable to serialize request"); + let response = response + .mock_serialize() + .expect("unable to serialize response"); + + Self { + serialized_request: request, + serialized_response: response, + phantom: std::marker::PhantomData, + } } // Return request type (T) name without module prefix @@ -33,7 +112,7 @@ impl DumpData { /// * unique identifier (hash) of the request pub fn filename(&self) -> Result { let now = chrono::Utc::now().to_rfc3339_opts(chrono::SecondsFormat::Nanos, true); - let key = Key::try_new(&self.request)?; + let key = Key::try_new(&self.serialized_request)?; // get request type without underscores (which we use as a file name separator) let request_type = Self::request_type().replace('_', "-"); @@ -51,33 +130,30 @@ impl DumpData { /// Load dump data from file. pub fn load>(file: P) -> Result where - T: for<'de> serde::Deserialize<'de>, - T::Response: for<'de> serde::Deserialize<'de>, + T: Mockable, + T::Response: Mockable, { - let f = std::fs::File::open(file)?; - - let data: Self = serde_json::from_reader(f).map_err(|e| { - std::io::Error::new( - std::io::ErrorKind::InvalidData, - format!("unable to parse json: {}", e), - ) - })?; - - Ok(data) + let data = std::fs::read(file)?; + + Self::mock_deserialize(&data).ok_or(std::io::Error::new( + std::io::ErrorKind::InvalidData, + format!( + "unable to deserialize mock data of type {}", + type_name::() + ), + )) } /// Save dump data to file. pub fn save(&self, file: &std::path::Path) -> Result<(), std::io::Error> where - T: serde::Serialize, - T::Response: serde::Serialize, + T: Mockable, + T::Response: Mockable, { - let encoded = serde_json::to_vec(self).map_err(|e| { - std::io::Error::new( - std::io::ErrorKind::InvalidData, - format!("unable to serialize json: {}", e), - ) - })?; + let encoded = self.mock_serialize().ok_or(std::io::Error::new( + std::io::ErrorKind::InvalidData, + format!("unable to serialize mock data of type {}", type_name::()), + ))?; std::fs::write(file, encoded) } @@ -107,12 +183,12 @@ impl DapiClient { /// /// Any errors are logged on `warn` level and ignored. pub(crate) fn dump_request_response( - request: R, - response: R::Response, + request: &R, + response: &R::Response, dump_dir: Option, ) where - R: serde::Serialize, - R::Response: serde::Serialize, + R: Mockable, + R::Response: Mockable, { let path = match dump_dir { Some(p) => p, diff --git a/packages/rs-dapi-client/src/lib.rs b/packages/rs-dapi-client/src/lib.rs index 0b3c19b74b..597bc28acc 100644 --- a/packages/rs-dapi-client/src/lib.rs +++ b/packages/rs-dapi-client/src/lib.rs @@ -11,10 +11,11 @@ pub mod mock; mod request_settings; pub mod transport; -pub use dapi_client::Dapi; +pub use dapi_client::DapiRequestExecutor; use futures::{future::BoxFuture, FutureExt}; pub use http::Uri; +pub use address_list::Address; pub use address_list::AddressList; pub use dapi_client::{DapiClient, DapiClientError}; #[cfg(feature = "dump")] @@ -42,9 +43,9 @@ pub trait DapiRequest { type TransportError; /// Executes the request. - fn execute<'c, D: Dapi>( + fn execute<'c, D: DapiRequestExecutor>( self, - dapi_client: &'c mut D, + dapi_client: &'c D, settings: RequestSettings, ) -> BoxFuture<'c, Result>> where @@ -57,9 +58,9 @@ impl DapiRequest for T { type TransportError = ::Error; - fn execute<'c, D: Dapi>( + fn execute<'c, D: DapiRequestExecutor>( self, - dapi_client: &'c mut D, + dapi_client: &'c D, settings: RequestSettings, ) -> BoxFuture<'c, Result>> where @@ -73,5 +74,5 @@ impl DapiRequest for T { /// try to do a request again. pub trait CanRetry { /// Get boolean flag that indicates if the error is retryable. - fn can_retry(&self) -> bool; + fn is_node_failure(&self) -> bool; } diff --git a/packages/rs-dapi-client/src/mock.rs b/packages/rs-dapi-client/src/mock.rs index 142f767474..4b9d332552 100644 --- a/packages/rs-dapi-client/src/mock.rs +++ b/packages/rs-dapi-client/src/mock.rs @@ -13,8 +13,10 @@ use crate::{ transport::{TransportClient, TransportRequest}, - Dapi, DapiClientError, RequestSettings, + DapiClientError, DapiRequestExecutor, RequestSettings, }; +use dapi_grpc::mock::Mockable; +use dapi_grpc::tonic::async_trait; use hex::ToHex; use sha2::Digest; use std::{ @@ -22,17 +24,17 @@ use std::{ collections::HashMap, fmt::{Debug, Display}, }; -use tonic::async_trait; /// Mock DAPI client. /// -/// This is a mock implmeneation of [Dapi] that can be used for testing. +/// This is a mock implmeneation of [DapiRequestExecutor] that can be used for testing. /// /// See `tests/mock_dapi_client.rs` for an example. -#[derive(Default)] +#[derive(Default, Debug)] pub struct MockDapiClient { expectations: Expectations, } + impl MockDapiClient { /// Create a new mock client pub fn new() -> Self { @@ -42,7 +44,8 @@ impl MockDapiClient { /// Add a new expectation for a request pub fn expect(&mut self, request: &R, response: &R::Response) -> &mut Self where - R: TransportRequest, + R: TransportRequest + Mockable, + R::Response: Mockable, { let key = self.expectations.add(request, response); @@ -60,42 +63,43 @@ impl MockDapiClient { /// /// The file must contain JSON structure. /// See [DumpData](crate::DumpData) and [DapiClient::dump_dir()](crate::DapiClient::dump_dir()) more for details. + /// + /// # Panics + /// + /// Panics if the file can't be read or the data can't be parsed. #[cfg(feature = "dump")] pub fn load>( &mut self, file: P, ) -> Result<(T, T::Response), std::io::Error> where - T: for<'de> serde::Deserialize<'de>, - T::Response: for<'de> serde::Deserialize<'de>, + T: Mockable, + T::Response: Mockable, { - let f = std::fs::File::open(file)?; - - #[derive(serde::Deserialize)] - struct Data { - request: R, - response: R::Response, - } + use crate::DumpData; - let data: Data = serde_json::from_reader(f).map_err(|e| { - std::io::Error::new( - std::io::ErrorKind::InvalidData, - format!("unable to parse json: {}", e), - ) + let buf = std::fs::read(file)?; + let data = DumpData::::mock_deserialize(&buf).ok_or({ + std::io::Error::new(std::io::ErrorKind::InvalidData, "unable to parse json") })?; - self.expect(&data.request, &data.response); - Ok((data.request, data.response)) + let (request, response) = data.deserialize(); + self.expect(&request, &response); + Ok((request, response)) } } #[async_trait] -impl Dapi for MockDapiClient { +impl DapiRequestExecutor for MockDapiClient { async fn execute( - &mut self, + &self, request: R, _settings: RequestSettings, - ) -> Result::Error>> { + ) -> Result::Error>> + where + R: Mockable, + R::Response: Mockable, + { let (key, response) = self.expectations.get(&request); tracing::trace!( @@ -117,7 +121,7 @@ impl Dapi for MockDapiClient { } } -#[derive(Eq, Hash, PartialEq, PartialOrd, Ord, Clone)] +#[derive(Eq, Hash, PartialEq, PartialOrd, Ord, Clone, Debug)] /// Unique identifier of some serializable object (e.g. request) that can be used as a key in a hashmap. pub struct Key([u8; 32]); @@ -127,24 +131,20 @@ impl Key { /// # Panics /// /// Panics if the object can't be serialized. - pub fn new(request: S) -> Self { + pub fn new(request: &S) -> Self { Self::try_new(request).expect("unable to create a key") } /// Generate unique identifier of some serializable object (e.g. request). - pub fn try_new(request: S) -> Result { - let mut encoded = match serde_json::to_vec(&request) { - Ok(b) => b, - Err(e) => { - return Err(std::io::Error::new( - std::io::ErrorKind::InvalidData, - format!("unable to serialize json: {}", e), - )) - } - }; + pub fn try_new(request: &S) -> Result { // we append type name to the encoded value to make sure that different types // will have different keys let typ = type_name::().replace('&', ""); //remove & from type name + + let mut encoded = S::mock_serialize(request).ok_or(std::io::Error::new( + std::io::ErrorKind::InvalidData, + format!("mocking not supported for object of type {}", typ), + ))?; encoded.append(&mut typ.as_bytes().to_vec()); let mut e = sha2::Sha256::new(); @@ -175,21 +175,22 @@ impl Display for Key { } } +#[derive(Debug)] struct ExpectedResponse(Vec); impl ExpectedResponse { - fn serialize(request: &I) -> Self { + fn serialize(request: &I) -> Self { // We use json because bincode sometimes fail to deserialize - Self(serde_json::to_vec(request).expect("encode value")) + Self(request.mock_serialize().expect("encode value")) } - fn deserialize serde::Deserialize<'de>>(&self) -> O { + fn deserialize(&self) -> O { // We use json because bincode sometimes fail to deserialize - serde_json::from_slice(&self.0).expect("deserialize value") + O::mock_deserialize(&self.0).expect("deserialize value") } } -#[derive(Default)] +#[derive(Default, Debug)] /// Requests expected by a mock and their responses. struct Expectations { expectations: HashMap, @@ -199,11 +200,7 @@ impl Expectations { /// Add expected request and provide given response. /// /// If the expectation already exists, it will be silently replaced. - pub fn add( - &mut self, - request: &I, - response: &O, - ) -> Key { + pub fn add(&mut self, request: &I, response: &O) -> Key { let key = Key::new(request); let value = ExpectedResponse::serialize(response); @@ -215,11 +212,8 @@ impl Expectations { /// Get the response for a given request. /// /// Returns `None` if the request has not been expected. - pub fn get serde::Deserialize<'de> + Debug>( - &self, - request: I, - ) -> (Key, Option) { - let key = Key::new(&request); + pub fn get(&self, request: &I) -> (Key, Option) { + let key = Key::new(request); let response = self.expectations.get(&key).and_then(|v| v.deserialize()); diff --git a/packages/rs-dapi-client/src/request_settings.rs b/packages/rs-dapi-client/src/request_settings.rs index 79d94eb497..7c900a7829 100644 --- a/packages/rs-dapi-client/src/request_settings.rs +++ b/packages/rs-dapi-client/src/request_settings.rs @@ -2,8 +2,11 @@ use std::time::Duration; +/// Default low-level client timeout +const DEFAULT_CONNECT_TIMEOUT: Option = None; const DEFAULT_TIMEOUT: Duration = Duration::from_secs(10); const DEFAULT_RETRIES: usize = 5; +const DEFAULT_BAN_FAILED_ADDRESS: bool = true; /// DAPI request settings. /// @@ -12,12 +15,16 @@ const DEFAULT_RETRIES: usize = 5; /// 2. [crate::DapiClient] settings; /// 3. [crate::DapiRequest]-specific settings; /// 4. settings for an exact request execution call. -#[derive(Debug, Clone, Copy)] +#[derive(Debug, Clone, Copy, Default)] pub struct RequestSettings { + /// Timeout for establishing a connection. + pub connect_timeout: Option, /// Timeout for a request. pub timeout: Option, /// Number of retries until returning the last error. pub retries: Option, + /// Ban DAPI address if node not responded or responded with error. + pub ban_failed_address: Option, } impl RequestSettings { @@ -25,8 +32,10 @@ impl RequestSettings { /// Actually does the same as [Default], but it's `const`. pub const fn default() -> Self { RequestSettings { + connect_timeout: None, timeout: None, retries: None, + ban_failed_address: None, } } @@ -35,16 +44,22 @@ impl RequestSettings { /// 2. in case of two [Some] variants, right hand side argument will overwrite the value. pub fn override_by(self, rhs: RequestSettings) -> Self { RequestSettings { + connect_timeout: rhs.connect_timeout.or(self.connect_timeout), timeout: rhs.timeout.or(self.timeout), retries: rhs.retries.or(self.retries), + ban_failed_address: rhs.ban_failed_address.or(self.ban_failed_address), } } /// Fill in settings defaults. pub fn finalize(self) -> AppliedRequestSettings { AppliedRequestSettings { + connect_timeout: self.connect_timeout.or(DEFAULT_CONNECT_TIMEOUT), timeout: self.timeout.unwrap_or(DEFAULT_TIMEOUT), retries: self.retries.unwrap_or(DEFAULT_RETRIES), + ban_failed_address: self + .ban_failed_address + .unwrap_or(DEFAULT_BAN_FAILED_ADDRESS), } } } @@ -52,8 +67,12 @@ impl RequestSettings { /// DAPI settings ready to use. #[derive(Debug, Clone, Copy)] pub struct AppliedRequestSettings { + /// Timeout for establishing a connection. + pub connect_timeout: Option, /// Timeout for a request. pub timeout: Duration, /// Number of retries until returning the last error. pub retries: usize, + /// Ban DAPI address if node not responded or responded with error. + pub ban_failed_address: bool, } diff --git a/packages/rs-dapi-client/src/transport.rs b/packages/rs-dapi-client/src/transport.rs index 0af60c9bc5..81f343c777 100644 --- a/packages/rs-dapi-client/src/transport.rs +++ b/packages/rs-dapi-client/src/transport.rs @@ -4,23 +4,38 @@ pub(crate) mod grpc; pub use crate::request_settings::AppliedRequestSettings; use crate::{CanRetry, RequestSettings}; +use dapi_grpc::mock::Mockable; pub use futures::future::BoxFuture; pub use grpc::{CoreGrpcClient, PlatformGrpcClient}; use http::Uri; +use std::any; use std::fmt::Debug; /// Generic transport layer request. /// Requires [Clone] as could be retried and a client in general consumes a request. -pub trait TransportRequest: Clone + Send + Sync + Debug + serde::Serialize { +pub trait TransportRequest: Clone + Send + Sync + Debug + Mockable { /// A client specific to this type of transport. type Client: TransportClient; /// Transport layer response. - type Response: TransportResponse; + type Response: Mockable + Send + Debug; /// Settings that will override [DapiClient](crate::DapiClient)'s ones each time the request is executed. const SETTINGS_OVERRIDES: RequestSettings; + /// gRPC request name + fn request_name(&self) -> &'static str { + any::type_name::() + } + + /// gRPC response name + fn response_name(&self) -> &'static str { + any::type_name::() + } + + /// gRPC method name + fn method_name(&self) -> &'static str; + /// Perform transport request asynchronously. fn execute_transport<'c>( self, @@ -29,17 +44,14 @@ pub trait TransportRequest: Clone + Send + Sync + Debug + serde::Serialize { ) -> BoxFuture<'c, Result::Error>>; } -/// Generic transport layer response. -pub trait TransportResponse: - Clone + Send + Sync + Debug + serde::Serialize + for<'de> serde::Deserialize<'de> -{ -} - /// Generic way to create a transport client from provided [Uri]. pub trait TransportClient: Send + Sized { /// Error type for the specific client. type Error: CanRetry + Send + Debug; - /// Build client using peer's url. + /// Build client using node's url. fn with_uri(uri: Uri) -> Self; + + /// Build client using node's url and [AppliedRequestSettings]. + fn with_uri_and_settings(uri: Uri, settings: &AppliedRequestSettings) -> Self; } diff --git a/packages/rs-dapi-client/src/transport/grpc.rs b/packages/rs-dapi-client/src/transport/grpc.rs index 224229a735..0069e8efdb 100644 --- a/packages/rs-dapi-client/src/transport/grpc.rs +++ b/packages/rs-dapi-client/src/transport/grpc.rs @@ -2,41 +2,64 @@ use std::time::Duration; +use super::{CanRetry, TransportClient, TransportRequest}; +use crate::{request_settings::AppliedRequestSettings, RequestSettings}; use dapi_grpc::core::v0::core_client::CoreClient; +use dapi_grpc::core::v0::{self as core_proto}; use dapi_grpc::platform::v0::{self as platform_proto, platform_client::PlatformClient}; +use dapi_grpc::tonic::Streaming; +use dapi_grpc::tonic::{transport::Channel, IntoRequest}; use futures::{future::BoxFuture, FutureExt, TryFutureExt}; use http::Uri; -use tonic::{transport::Channel, IntoRequest}; - -use super::{CanRetry, TransportClient, TransportRequest, TransportResponse}; -use crate::{request_settings::AppliedRequestSettings, RequestSettings}; /// Platform Client using gRPC transport. pub type PlatformGrpcClient = PlatformClient; /// Core Client using gRPC transport. pub type CoreGrpcClient = CoreClient; +fn channel_with_uri(uri: Uri) -> Channel { + Channel::builder(uri).connect_lazy() +} + +fn channel_with_uri_and_settings(uri: Uri, settings: &AppliedRequestSettings) -> Channel { + let mut builder = Channel::builder(uri); + + if let Some(timeout) = settings.connect_timeout { + builder = builder.connect_timeout(timeout); + } + + builder.connect_lazy() +} + impl TransportClient for PlatformGrpcClient { - type Error = tonic::Status; + type Error = dapi_grpc::tonic::Status; fn with_uri(uri: Uri) -> Self { - Self::new(Channel::builder(uri).connect_lazy()) + Self::new(channel_with_uri(uri)) + } + + fn with_uri_and_settings(uri: Uri, settings: &AppliedRequestSettings) -> Self { + Self::new(channel_with_uri_and_settings(uri, settings)) } } impl TransportClient for CoreGrpcClient { - type Error = tonic::Status; + type Error = dapi_grpc::tonic::Status; fn with_uri(uri: Uri) -> Self { - Self::new(Channel::builder(uri).connect_lazy()) + Self::new(channel_with_uri(uri)) + } + + fn with_uri_and_settings(uri: Uri, settings: &AppliedRequestSettings) -> Self { + Self::new(channel_with_uri_and_settings(uri, settings)) } } -impl CanRetry for tonic::Status { - fn can_retry(&self) -> bool { +impl CanRetry for dapi_grpc::tonic::Status { + fn is_node_failure(&self) -> bool { let code = self.code(); - use tonic::Code::*; + use dapi_grpc::tonic::Code::*; matches!( code, Ok | DataLoss @@ -46,6 +69,7 @@ impl CanRetry for tonic::Status { | ResourceExhausted | Aborted | Internal + | Unavailable ) } } @@ -61,6 +85,10 @@ macro_rules! impl_transport_request_grpc { const SETTINGS_OVERRIDES: RequestSettings = $settings; + fn method_name(&self) -> &'static str { + stringify!($($method)+) + } + fn execute_transport<'c>( self, client: &'c mut Self::Client, @@ -68,7 +96,10 @@ macro_rules! impl_transport_request_grpc { ) -> BoxFuture<'c, Result::Error>> { let mut grpc_request = self.into_request(); - grpc_request.set_timeout(settings.timeout); + + if !settings.timeout.is_zero() { + grpc_request.set_timeout(settings.timeout); + } client .$($method)+(grpc_request) @@ -76,12 +107,13 @@ macro_rules! impl_transport_request_grpc { .boxed() } } - impl TransportResponse for $response {} }; } // Link to each platform gRPC request what client and method to use: +const STREAMING_TIMEOUT: Duration = Duration::from_secs(5 * 60); + impl_transport_request_grpc!( platform_proto::GetIdentityRequest, platform_proto::GetIdentityResponse, @@ -135,7 +167,8 @@ impl_transport_request_grpc!( platform_proto::WaitForStateTransitionResultResponse, PlatformGrpcClient, RequestSettings { - timeout: Some(Duration::from_secs(120)), + timeout: Some(Duration::from_secs(80)), + retries: Some(0), ..RequestSettings::default() }, wait_for_state_transition_result @@ -214,8 +247,6 @@ impl_transport_request_grpc!( ); // Link to each core gRPC request what client and method to use: -/* -TODO: Implement serde on Core gRPC requests and responses impl_transport_request_grpc!( core_proto::GetTransactionRequest, @@ -240,4 +271,14 @@ impl_transport_request_grpc!( RequestSettings::default(), broadcast_transaction ); -*/ + +impl_transport_request_grpc!( + core_proto::TransactionsWithProofsRequest, + Streaming, + CoreGrpcClient, + RequestSettings { + timeout: Some(STREAMING_TIMEOUT), + ..RequestSettings::default() + }, + subscribe_to_transactions_with_proofs +); diff --git a/packages/rs-dapi-client/tests/mock_dapi_client.rs b/packages/rs-dapi-client/tests/mock_dapi_client.rs index f5f67dce99..117106c821 100644 --- a/packages/rs-dapi-client/tests/mock_dapi_client.rs +++ b/packages/rs-dapi-client/tests/mock_dapi_client.rs @@ -1,6 +1,6 @@ use dapi_grpc::platform::v0::{GetIdentityRequest, GetIdentityResponse, Proof}; -use rs_dapi_client::{mock::MockDapiClient, Dapi, DapiRequest, RequestSettings}; +use rs_dapi_client::{mock::MockDapiClient, DapiRequest, DapiRequestExecutor, RequestSettings}; #[tokio::test] async fn test_mock_get_identity_dapi_client() { @@ -25,7 +25,7 @@ async fn test_mock_get_identity_dapi_client() { let result = dapi.execute(request.clone(), settings).await.unwrap(); - let result2 = request.execute(&mut dapi, settings).await.unwrap(); + let result2 = request.execute(&dapi, settings).await.unwrap(); assert_eq!(result, response); assert_eq!(result2, response); diff --git a/packages/rs-dapi-grpc-macros/src/lib.rs b/packages/rs-dapi-grpc-macros/src/lib.rs index f310de526f..740e09010b 100644 --- a/packages/rs-dapi-grpc-macros/src/lib.rs +++ b/packages/rs-dapi-grpc-macros/src/lib.rs @@ -182,3 +182,44 @@ pub fn versioned_grpc_response_derive(input: TokenStream) -> TokenStream { // Return the generated code TokenStream::from(expanded) } + +/// Implement mocking on gRPC messages +/// +/// This adds implementation of [dapi_grpc::mock::Mockable] to the message. +/// If the `mocks` feature is enabled, the implementation uses serde_json to serialize/deserialize the message. +/// Otherwise, it returns None. +/// +/// ## Requirements +/// +/// When `mocks` feature is enabled: +/// +/// * The message must implement [serde::Serialize] and [serde::Deserialize]. +/// * The crate must depend on `serde` and `serde_json` crates. +/// +#[proc_macro_derive(Mockable)] +pub fn mockable_derive(input: TokenStream) -> TokenStream { + // Parse the input tokens into a syntax tree + let input = parse_macro_input!(input as DeriveInput); + + let name = input.ident; + + // Generate the implementation + let expanded = quote! { + impl crate::mock::Mockable for #name { + #[cfg(feature = "mocks")] + fn mock_serialize(&self) -> Option> { + Some(serde_json::to_vec_pretty(self).expect("unable to serialize")) + } + + #[cfg(feature = "mocks")] + fn mock_deserialize(data: &[u8]) -> Option { + Some(serde_json::from_slice(data).expect("unable to deserialize")) + } + } + }; + + // println!("Expanded code: {}", expanded); + + // Return the generated code + TokenStream::from(expanded) +} diff --git a/packages/rs-dpp/Cargo.toml b/packages/rs-dpp/Cargo.toml index 30a2f2920d..1af846d2bc 100644 --- a/packages/rs-dpp/Cargo.toml +++ b/packages/rs-dpp/Cargo.toml @@ -12,7 +12,7 @@ authors = [ ] [dependencies] -anyhow = { version = "1.0.70" } +anyhow = { version = "1.0.75" } async-trait = { version = "0.1.68" } base64 = "0.20.0" bls-signatures = { git = "https://github.com/dashpay/bls-signatures", branch = "develop" } @@ -63,6 +63,7 @@ nohash-hasher = "0.2.0" rust_decimal = "1.29.1" rust_decimal_macros = "1.29.1" indexmap = { version = "2.0.2", features = ["serde"] } +strum = { version = "0.25.0", features = ["derive"] } [dev-dependencies] test-case = { version = "2.0" } @@ -170,14 +171,16 @@ validation = [ json-object = ["platform-value"] platform-value = [] identity-hashing = ["identity-serialization"] +message-signing = [] +message-signature-verification = [] document-serde-conversion = [] document-value-conversion = ["document-serde-conversion"] document-json-conversion = ["document-value-conversion"] -document-cbor-conversion = ["document-value-conversion"] +document-cbor-conversion = ["document-value-conversion", "cbor"] data-contract-serde-conversion = [] data-contract-value-conversion = ["data-contract-serde-conversion"] data-contract-json-conversion = ["data-contract-value-conversion"] -data-contract-cbor-conversion = ["data-contract-value-conversion"] +data-contract-cbor-conversion = ["data-contract-value-conversion", "cbor"] identity-serialization = [] identity-serde-conversion = [] identity-value-conversion = ["identity-serde-conversion"] @@ -193,11 +196,11 @@ state-transition-json-conversion = [ "json-object", "data-contract-json-conversion", ] -state-transition-validation = [] -state-transition-signing = [] +state-transition-validation = ["state-transitions", "message-signature-verification"] +state-transition-signing = ["state-transitions", "message-signing","state-transition-validation"] state-transitions = [] system_contracts = ["factories"] -fixtures-and-mocks = [] +fixtures-and-mocks = ["system_contracts"] random-public-keys = [] random-identities = ["random-public-keys"] random-documents = [] @@ -208,5 +211,6 @@ extended-document = [ "data-contract-serde-conversion", "data-contract-json-conversion", ] -client = [] + factories = [] +client = ["factories", "state-transitions"] diff --git a/packages/rs-dpp/src/data_contract/data_contract_facade.rs b/packages/rs-dpp/src/data_contract/data_contract_facade.rs index d07991b924..9b55740f0d 100644 --- a/packages/rs-dpp/src/data_contract/data_contract_facade.rs +++ b/packages/rs-dpp/src/data_contract/data_contract_facade.rs @@ -51,6 +51,7 @@ impl DataContractFacade { } /// Create Data Contract from plain object + #[cfg(all(feature = "identity-serialization", feature = "client"))] pub fn create_from_object( &self, raw_data_contract: Value, @@ -61,6 +62,7 @@ impl DataContractFacade { } /// Create Data Contract from buffer + #[cfg(all(feature = "identity-serialization", feature = "client"))] pub fn create_from_buffer( &self, buffer: Vec, diff --git a/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs b/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs index 822aa40609..fc9de48c81 100644 --- a/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs +++ b/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs @@ -98,9 +98,10 @@ impl RandomDocumentTypeParameters { } use crate::data_contract::document_type::index_level::IndexLevel; -use crate::data_contract::document_type::v0::{DocumentTypeV0, StatelessJsonSchemaLazyValidator}; +#[cfg(feature = "validation")] +use crate::data_contract::document_type::v0::StatelessJsonSchemaLazyValidator; use crate::data_contract::document_type::{ - DocumentProperty, DocumentPropertyType, DocumentType, Index, + v0::DocumentTypeV0, DocumentProperty, DocumentPropertyType, DocumentType, Index, }; use crate::identity::SecurityLevel; use crate::version::PlatformVersion; @@ -258,6 +259,7 @@ impl DocumentTypeV0 { requires_identity_encryption_bounded_key: None, requires_identity_decryption_bounded_key: None, security_level_requirement: SecurityLevel::HIGH, + #[cfg(feature = "validation")] json_schema_validator: StatelessJsonSchemaLazyValidator::new(), }) } diff --git a/packages/rs-dpp/src/data_contract/generate_data_contract.rs b/packages/rs-dpp/src/data_contract/generate_data_contract.rs index fa6caea7d1..3fe34a4ec2 100644 --- a/packages/rs-dpp/src/data_contract/generate_data_contract.rs +++ b/packages/rs-dpp/src/data_contract/generate_data_contract.rs @@ -2,7 +2,7 @@ use crate::data_contract::DataContract; use platform_value::Identifier; use std::io::Write; -use crate::util::hash::hash; +use crate::util::hash::hash_double; impl DataContract { /// Generate data contract id based on owner id and entropy @@ -13,6 +13,6 @@ impl DataContract { let mut b: Vec = vec![]; let _ = b.write(owner_id.as_ref()); let _ = b.write(entropy.as_ref()); - Identifier::from(hash(b)) + Identifier::from(hash_double(b)) } } diff --git a/packages/rs-dpp/src/data_contract/mod.rs b/packages/rs-dpp/src/data_contract/mod.rs index e3923858f4..312a3c6c38 100644 --- a/packages/rs-dpp/src/data_contract/mod.rs +++ b/packages/rs-dpp/src/data_contract/mod.rs @@ -40,7 +40,7 @@ pub use v0::*; use crate::data_contract::serialized_version::{ DataContractInSerializationFormat, CONTRACT_DESERIALIZATION_LIMIT, }; -use crate::util::hash::hash_to_vec; +use crate::util::hash::hash_double_to_vec; use crate::version::{FeatureVersion, PlatformVersion}; use crate::ProtocolError; @@ -237,9 +237,9 @@ impl DataContract { } pub fn hash(&self, platform_version: &PlatformVersion) -> Result, ProtocolError> { - Ok(hash_to_vec(self.serialize_to_bytes_with_platform_version( - platform_version, - )?)) + Ok(hash_double_to_vec( + self.serialize_to_bytes_with_platform_version(platform_version)?, + )) } } diff --git a/packages/rs-dpp/src/document/document_factory/mod.rs b/packages/rs-dpp/src/document/document_factory/mod.rs index 78cce0323e..a2e806c6a1 100644 --- a/packages/rs-dpp/src/document/document_factory/mod.rs +++ b/packages/rs-dpp/src/document/document_factory/mod.rs @@ -11,8 +11,10 @@ use crate::data_contract::document_type::DocumentTypeRef; use crate::document::Document; #[cfg(feature = "extended-document")] use crate::document::ExtendedDocument; -use crate::state_transition::documents_batch_transition::document_transition::action_type::DocumentTransitionActionType; -use crate::state_transition::documents_batch_transition::DocumentsBatchTransition; +#[cfg(feature = "state-transitions")] +use crate::state_transition::documents_batch_transition::{ + document_transition::action_type::DocumentTransitionActionType, DocumentsBatchTransition, +}; use crate::util::entropy_generator::EntropyGenerator; pub use v0::DocumentFactoryV0; @@ -117,6 +119,7 @@ impl DocumentFactory { } } + #[cfg(feature = "extended-document")] pub fn create_extended_from_document_buffer( &self, buffer: &[u8], diff --git a/packages/rs-dpp/src/document/document_factory/v0/mod.rs b/packages/rs-dpp/src/document/document_factory/v0/mod.rs index a017db8b2d..3b7faf38ae 100644 --- a/packages/rs-dpp/src/document/document_factory/v0/mod.rs +++ b/packages/rs-dpp/src/document/document_factory/v0/mod.rs @@ -22,12 +22,12 @@ use crate::document::serialization_traits::DocumentPlatformConversionMethodsV0; #[cfg(feature = "extended-document")] use crate::document::ExtendedDocument; use crate::prelude::TimestampMillis; -use crate::state_transition::documents_batch_transition::document_transition::action_type::DocumentTransitionActionType; -use crate::state_transition::documents_batch_transition::document_transition::{ - DocumentCreateTransition, DocumentDeleteTransition, DocumentReplaceTransition, - DocumentTransition, -}; +#[cfg(feature = "state-transitions")] use crate::state_transition::documents_batch_transition::{ + document_transition::{ + action_type::DocumentTransitionActionType, DocumentCreateTransition, + DocumentDeleteTransition, DocumentReplaceTransition, DocumentTransition, + }, DocumentsBatchTransition, DocumentsBatchTransitionV0, }; use itertools::Itertools; @@ -236,6 +236,7 @@ impl DocumentFactoryV0 { .into()) } + #[cfg(feature = "extended-document")] pub fn create_extended_from_document_buffer( &self, buffer: &[u8], @@ -328,6 +329,7 @@ impl DocumentFactoryV0 { // // Ok(data_contract) // // } // + #[cfg(feature = "state-transitions")] fn document_create_transitions( documents: Vec<(Document, DocumentTypeRef, Bytes32)>, platform_version: &PlatformVersion, @@ -363,6 +365,7 @@ impl DocumentFactoryV0 { .collect() } + #[cfg(feature = "state-transitions")] fn document_replace_transitions( documents: Vec<(Document, DocumentTypeRef)>, platform_version: &PlatformVersion, @@ -437,6 +440,7 @@ impl DocumentFactoryV0 { // Ok(raw_transitions) } + #[cfg(feature = "state-transitions")] fn document_delete_transitions( documents: Vec<(Document, DocumentTypeRef)>, platform_version: &PlatformVersion, diff --git a/packages/rs-dpp/src/document/document_methods/hash/v0/mod.rs b/packages/rs-dpp/src/document/document_methods/hash/v0/mod.rs index af2a92a3b0..4961a39f42 100644 --- a/packages/rs-dpp/src/document/document_methods/hash/v0/mod.rs +++ b/packages/rs-dpp/src/document/document_methods/hash/v0/mod.rs @@ -3,7 +3,7 @@ use crate::data_contract::document_type::accessors::DocumentTypeV0Getters; use crate::data_contract::document_type::DocumentTypeRef; use crate::data_contract::DataContract; use crate::document::serialization_traits::DocumentPlatformConversionMethodsV0; -use crate::util::hash::hash_to_vec; +use crate::util::hash::hash_double_to_vec; use crate::version::PlatformVersion; use crate::ProtocolError; @@ -19,6 +19,6 @@ pub trait DocumentHashV0Method: DocumentPlatformConversionMethodsV0 { let mut buf = contract.id().to_vec(); buf.extend(document_type.name().as_bytes()); // TODO: Why we put it here? buf.extend(self.serialize(document_type, platform_version)?); - Ok(hash_to_vec(buf)) + Ok(hash_double_to_vec(buf)) } } diff --git a/packages/rs-dpp/src/document/extended_document/v0/mod.rs b/packages/rs-dpp/src/document/extended_document/v0/mod.rs index 65f14f8424..a4f76ed7de 100644 --- a/packages/rs-dpp/src/document/extended_document/v0/mod.rs +++ b/packages/rs-dpp/src/document/extended_document/v0/mod.rs @@ -12,7 +12,7 @@ use crate::identity::TimestampMillis; use crate::metadata::Metadata; use crate::prelude::Revision; -use crate::util::hash::hash_to_vec; +use crate::util::hash::hash_double_to_vec; use crate::ProtocolError; use platform_value::btreemap_extensions::{ @@ -415,7 +415,7 @@ impl ExtendedDocumentV0 { } pub fn hash(&self, platform_version: &PlatformVersion) -> Result, ProtocolError> { - Ok(hash_to_vec( + Ok(hash_double_to_vec( ExtendedDocumentPlatformConversionMethodsV0::serialize_to_bytes( self, platform_version, diff --git a/packages/rs-dpp/src/document/generate_document_id.rs b/packages/rs-dpp/src/document/generate_document_id.rs index a1a7009d85..b14fc599a4 100644 --- a/packages/rs-dpp/src/document/generate_document_id.rs +++ b/packages/rs-dpp/src/document/generate_document_id.rs @@ -1,5 +1,5 @@ use crate::document::Document; -use crate::{prelude::Identifier, util::hash::hash_to_vec}; +use crate::{prelude::Identifier, util::hash::hash_double_to_vec}; impl Document { /// Generates the document ID @@ -16,6 +16,6 @@ impl Document { buf.extend_from_slice(document_type_name.as_bytes()); buf.extend_from_slice(entropy); - Identifier::from_bytes(&hash_to_vec(&buf)).unwrap() + Identifier::from_bytes(&hash_double_to_vec(&buf)).unwrap() } } diff --git a/packages/rs-dpp/src/document/specialized_document_factory/mod.rs b/packages/rs-dpp/src/document/specialized_document_factory/mod.rs index f4f2583501..27e342a12d 100644 --- a/packages/rs-dpp/src/document/specialized_document_factory/mod.rs +++ b/packages/rs-dpp/src/document/specialized_document_factory/mod.rs @@ -11,8 +11,10 @@ use crate::data_contract::document_type::DocumentTypeRef; use crate::document::Document; #[cfg(feature = "extended-document")] use crate::document::ExtendedDocument; -use crate::state_transition::documents_batch_transition::document_transition::action_type::DocumentTransitionActionType; -use crate::state_transition::documents_batch_transition::DocumentsBatchTransition; +#[cfg(feature = "state-transitions")] +use crate::state_transition::documents_batch_transition::{ + document_transition::action_type::DocumentTransitionActionType, DocumentsBatchTransition, +}; use crate::util::entropy_generator::EntropyGenerator; pub use v0::SpecializedDocumentFactoryV0; @@ -123,6 +125,7 @@ impl SpecializedDocumentFactory { } } + #[cfg(feature = "extended-document")] pub fn create_extended_from_document_buffer( &self, buffer: &[u8], diff --git a/packages/rs-dpp/src/document/specialized_document_factory/v0/mod.rs b/packages/rs-dpp/src/document/specialized_document_factory/v0/mod.rs index b469dc4fc0..0c475109ac 100644 --- a/packages/rs-dpp/src/document/specialized_document_factory/v0/mod.rs +++ b/packages/rs-dpp/src/document/specialized_document_factory/v0/mod.rs @@ -21,12 +21,12 @@ use crate::document::serialization_traits::DocumentPlatformConversionMethodsV0; #[cfg(feature = "extended-document")] use crate::document::ExtendedDocument; use crate::prelude::TimestampMillis; -use crate::state_transition::documents_batch_transition::document_transition::action_type::DocumentTransitionActionType; -use crate::state_transition::documents_batch_transition::document_transition::{ - DocumentCreateTransition, DocumentDeleteTransition, DocumentReplaceTransition, - DocumentTransition, -}; +#[cfg(feature = "state-transitions")] use crate::state_transition::documents_batch_transition::{ + document_transition::{ + action_type::DocumentTransitionActionType, DocumentCreateTransition, + DocumentDeleteTransition, DocumentReplaceTransition, DocumentTransition, + }, DocumentsBatchTransition, DocumentsBatchTransitionV0, }; use itertools::Itertools; @@ -245,6 +245,7 @@ impl SpecializedDocumentFactoryV0 { .into()) } + #[cfg(feature = "extended-document")] pub fn create_extended_from_document_buffer( &self, buffer: &[u8], @@ -338,6 +339,7 @@ impl SpecializedDocumentFactoryV0 { // // Ok(data_contract) // // } // + #[cfg(feature = "state-transitions")] fn document_create_transitions( documents: Vec<(Document, DocumentTypeRef, Bytes32)>, platform_version: &PlatformVersion, @@ -373,6 +375,7 @@ impl SpecializedDocumentFactoryV0 { .collect() } + #[cfg(feature = "state-transitions")] fn document_replace_transitions( documents: Vec<(Document, DocumentTypeRef)>, platform_version: &PlatformVersion, @@ -447,6 +450,7 @@ impl SpecializedDocumentFactoryV0 { // Ok(raw_transitions) } + #[cfg(feature = "state-transitions")] fn document_delete_transitions( documents: Vec<(Document, DocumentTypeRef)>, platform_version: &PlatformVersion, diff --git a/packages/rs-dpp/src/errors/consensus/codes.rs b/packages/rs-dpp/src/errors/consensus/codes.rs index 16ba3bd862..808d04d9b3 100644 --- a/packages/rs-dpp/src/errors/consensus/codes.rs +++ b/packages/rs-dpp/src/errors/consensus/codes.rs @@ -150,7 +150,7 @@ impl ErrorWithCode for StateError { // Data contract Self::DataContractAlreadyPresentError { .. } => 4000, Self::DataContractIsReadonlyError { .. } => 4026, - #[cfg(feature = "validation")] + #[cfg(feature = "state-transition-validation")] Self::DataTriggerError(ref e) => e.code(), Self::DataContractConfigUpdateError { .. } => 4027, diff --git a/packages/rs-dpp/src/errors/protocol_error.rs b/packages/rs-dpp/src/errors/protocol_error.rs index 1136eab12e..45952aa3ed 100644 --- a/packages/rs-dpp/src/errors/protocol_error.rs +++ b/packages/rs-dpp/src/errors/protocol_error.rs @@ -7,12 +7,11 @@ use crate::consensus::signature::{ use crate::consensus::ConsensusError; use crate::data_contract::errors::*; use crate::document::errors::*; -#[cfg(feature = "validation")] -use crate::state_transition::errors::InvalidIdentityPublicKeyTypeError; #[cfg(feature = "state-transition-validation")] use crate::state_transition::errors::{ - InvalidSignaturePublicKeyError, PublicKeyMismatchError, PublicKeySecurityLevelNotMetError, - StateTransitionError, StateTransitionIsNotSignedError, WrongPublicKeyPurposeError, + InvalidIdentityPublicKeyTypeError, InvalidSignaturePublicKeyError, PublicKeyMismatchError, + PublicKeySecurityLevelNotMetError, StateTransitionError, StateTransitionIsNotSignedError, + WrongPublicKeyPurposeError, }; use crate::{ CompatibleProtocolVersionIsNotDefinedError, DashPlatformProtocolInitError, @@ -115,23 +114,30 @@ pub enum ProtocolError { #[error("Generic Error: {0}")] Generic(String), + #[cfg(feature = "message-signing")] + #[error("Invalid signing type error: {0}")] + InvalidSigningKeyTypeError(String), + // State Transition Errors - #[cfg(all(feature = "state-transitions", feature = "validation"))] + #[cfg(any( + feature = "state-transition-validation", + feature = "state-transition-signing" + ))] #[error(transparent)] InvalidIdentityPublicKeyTypeError(InvalidIdentityPublicKeyTypeError), - #[cfg(all(feature = "state-transitions", feature = "validation"))] + #[cfg(feature = "state-transition-validation")] #[error(transparent)] StateTransitionIsNotSignedError(StateTransitionIsNotSignedError), - #[cfg(all(feature = "state-transitions", feature = "validation"))] + #[cfg(feature = "state-transition-validation")] #[error(transparent)] PublicKeySecurityLevelNotMetError(PublicKeySecurityLevelNotMetError), - #[cfg(all(feature = "state-transitions", feature = "validation"))] + #[cfg(feature = "state-transition-validation")] #[error(transparent)] WrongPublicKeyPurposeError(WrongPublicKeyPurposeError), - #[cfg(all(feature = "state-transitions", feature = "validation"))] + #[cfg(feature = "state-transition-validation")] #[error(transparent)] PublicKeyMismatchError(PublicKeyMismatchError), - #[cfg(all(feature = "state-transitions", feature = "validation"))] + #[cfg(feature = "state-transition-validation")] #[error(transparent)] InvalidSignaturePublicKeyError(InvalidSignaturePublicKeyError), @@ -172,7 +178,7 @@ pub enum ProtocolError { /// Error #[error("missing key: {0}")] - DocumentKeyMissing(String), + DesiredKeyWithTypePurposeSecurityLevelMissing(String), /// Value error #[error("value error: {0}")] diff --git a/packages/rs-dpp/src/identity/identity.rs b/packages/rs-dpp/src/identity/identity.rs index 72fc0662fd..3431f4071c 100644 --- a/packages/rs-dpp/src/identity/identity.rs +++ b/packages/rs-dpp/src/identity/identity.rs @@ -50,9 +50,9 @@ impl Identity { #[cfg(feature = "identity-hashing")] /// Computes the hash of an identity pub fn hash(&self) -> Result, ProtocolError> { - Ok(hash::hash_to_vec(PlatformSerializable::serialize_to_bytes( - self, - )?)) + Ok(hash::hash_double_to_vec( + PlatformSerializable::serialize_to_bytes(self)?, + )) } pub fn default_versioned( diff --git a/packages/rs-dpp/src/identity/identity_facade.rs b/packages/rs-dpp/src/identity/identity_facade.rs index d3de538006..0b55beff3d 100644 --- a/packages/rs-dpp/src/identity/identity_facade.rs +++ b/packages/rs-dpp/src/identity/identity_facade.rs @@ -9,18 +9,16 @@ use crate::prelude::{Identifier, Revision}; use crate::identity::identity_factory::IdentityFactory; #[cfg(feature = "state-transitions")] -use crate::state_transition::identity_create_transition::IdentityCreateTransition; -#[cfg(feature = "state-transitions")] -use crate::state_transition::identity_credit_transfer_transition::IdentityCreditTransferTransition; -#[cfg(feature = "state-transitions")] -use crate::state_transition::identity_topup_transition::IdentityTopUpTransition; -#[cfg(feature = "state-transitions")] -use crate::state_transition::identity_update_transition::IdentityUpdateTransition; -#[cfg(feature = "state-transitions")] -use crate::state_transition::public_key_in_creation::IdentityPublicKeyInCreation; +use crate::state_transition::{ + identity_create_transition::IdentityCreateTransition, + identity_credit_transfer_transition::IdentityCreditTransferTransition, + identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition, + identity_topup_transition::IdentityTopUpTransition, + identity_update_transition::IdentityUpdateTransition, + public_key_in_creation::IdentityPublicKeyInCreation, +}; use crate::identity::core_script::CoreScript; -use crate::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition; use crate::withdrawal::Pooling; use crate::ProtocolError; @@ -54,6 +52,7 @@ impl IdentityFacade { // .create_from_object(raw_identity) // } + #[cfg(all(feature = "identity-serialization", feature = "client"))] pub fn create_from_buffer( &self, buffer: Vec, @@ -84,7 +83,7 @@ impl IdentityFacade { #[cfg(feature = "state-transitions")] pub fn create_identity_create_transition( &self, - identity: Identity, + identity: &Identity, asset_lock_proof: AssetLockProof, ) -> Result { self.factory diff --git a/packages/rs-dpp/src/identity/identity_factory.rs b/packages/rs-dpp/src/identity/identity_factory.rs index 8384f55ae1..2255e41671 100644 --- a/packages/rs-dpp/src/identity/identity_factory.rs +++ b/packages/rs-dpp/src/identity/identity_factory.rs @@ -35,7 +35,9 @@ use crate::state_transition::identity_create_transition::IdentityCreateTransitio use crate::state_transition::identity_credit_transfer_transition::v0::IdentityCreditTransferTransitionV0; #[cfg(all(feature = "state-transitions", feature = "client"))] use crate::state_transition::identity_credit_transfer_transition::IdentityCreditTransferTransition; +#[cfg(all(feature = "state-transitions", feature = "client"))] use crate::state_transition::identity_credit_withdrawal_transition::v0::IdentityCreditWithdrawalTransitionV0; +#[cfg(all(feature = "state-transitions", feature = "client"))] use crate::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition; #[cfg(all(feature = "state-transitions", feature = "client"))] use crate::state_transition::identity_topup_transition::accessors::IdentityTopUpTransitionAccessorsV0; @@ -154,7 +156,7 @@ impl IdentityFactory { #[cfg(all(feature = "state-transitions", feature = "client"))] pub fn create_identity_create_transition( &self, - identity: Identity, + identity: &Identity, asset_lock_proof: AssetLockProof, ) -> Result { let transition = @@ -178,7 +180,7 @@ impl IdentityFactory { }); let identity_create_transition = IdentityCreateTransition::V0( - IdentityCreateTransitionV0::try_from_identity_v0(identity.clone(), asset_lock_proof)?, + IdentityCreateTransitionV0::try_from_identity_v0(&identity, asset_lock_proof)?, ); Ok((identity, identity_create_transition)) } diff --git a/packages/rs-dpp/src/identity/identity_public_key/key_type.rs b/packages/rs-dpp/src/identity/identity_public_key/key_type.rs index 5f813237f4..37140f7176 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/key_type.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/key_type.rs @@ -41,6 +41,7 @@ use std::convert::TryFrom; Encode, Decode, Default, + strum::EnumIter, )] pub enum KeyType { #[default] @@ -75,6 +76,17 @@ impl KeyType { KEY_TYPE_SIZES[self] } + /// All key types + pub fn all_key_types() -> [KeyType; 5] { + [ + Self::ECDSA_SECP256K1, + Self::BLS12_381, + Self::ECDSA_HASH160, + Self::BIP13_SCRIPT_HASH, + Self::EDDSA_25519_HASH160, + ] + } + /// Are keys of this type unique? pub fn is_unique_key_type(&self) -> bool { match self { diff --git a/packages/rs-dpp/src/identity/identity_public_key/purpose.rs b/packages/rs-dpp/src/identity/identity_public_key/purpose.rs index 1e4fb81b6d..be9a491177 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/purpose.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/purpose.rs @@ -21,6 +21,7 @@ use std::convert::TryFrom; Encode, Decode, Default, + strum::EnumIter, )] pub enum Purpose { /// at least one authentication key must be registered for all security levels diff --git a/packages/rs-dpp/src/identity/identity_public_key/security_level.rs b/packages/rs-dpp/src/identity/identity_public_key/security_level.rs index 668293963b..c0abe76f76 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/security_level.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/security_level.rs @@ -22,6 +22,7 @@ use std::convert::TryFrom; Encode, Decode, Default, + strum::EnumIter, )] pub enum SecurityLevel { #[default] diff --git a/packages/rs-dpp/src/identity/signer.rs b/packages/rs-dpp/src/identity/signer.rs index ff6d12d477..51d20dd7cd 100644 --- a/packages/rs-dpp/src/identity/signer.rs +++ b/packages/rs-dpp/src/identity/signer.rs @@ -2,7 +2,7 @@ use crate::prelude::IdentityPublicKey; use crate::ProtocolError; use platform_value::BinaryData; -pub trait Signer { +pub trait Signer: Sync { /// the public key bytes are only used to look up the private key fn sign( &self, diff --git a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs index ba16c59386..3116b104ef 100644 --- a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs +++ b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs @@ -3,7 +3,7 @@ use platform_value::Value; use std::convert::TryFrom; use std::io; -use crate::util::hash::hash; +use crate::util::hash::hash_double; use crate::{identifier::Identifier, ProtocolError}; pub use bincode::{Decode, Encode}; use dashcore::OutPoint; @@ -50,7 +50,7 @@ impl ChainAssetLockProof { .try_into() .map_err(|e: io::Error| ProtocolError::EncodingError(e.to_string()))?; - let hash = hash(output_vec); + let hash = hash_double(output_vec); Ok(Identifier::new(hash)) } diff --git a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs index da95683d18..1288ed5225 100644 --- a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs +++ b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs @@ -15,7 +15,7 @@ use serde::{Deserialize, Deserializer, Serialize, Serializer}; use crate::prelude::Identifier; #[cfg(feature = "cbor")] use crate::util::cbor_value::CborCanonicalMap; -use crate::util::hash::hash; +use crate::util::hash::hash_double; use crate::validation::SimpleConsensusValidationResult; use crate::ProtocolError; @@ -26,11 +26,11 @@ use crate::ProtocolError; #[derive(Clone, Debug, Eq, PartialEq)] pub struct InstantAssetLockProof { /// The transaction's Instant Lock - instant_lock: InstantLock, + pub instant_lock: InstantLock, /// Asset Lock Special Transaction - transaction: Transaction, + pub transaction: Transaction, /// Index of the output in the transaction payload - output_index: u32, + pub output_index: u32, } impl Serialize for InstantAssetLockProof { @@ -133,7 +133,7 @@ impl InstantAssetLockProof { .try_into() .map_err(|e: io::Error| ProtocolError::EncodingError(e.to_string()))?; - let hash = hash(output_vec); + let hash = hash_double(output_vec); Ok(Identifier::new(hash)) } diff --git a/packages/rs-dpp/src/lib.rs b/packages/rs-dpp/src/lib.rs index 9a648df706..3de29aab5c 100644 --- a/packages/rs-dpp/src/lib.rs +++ b/packages/rs-dpp/src/lib.rs @@ -39,7 +39,10 @@ pub mod balances; pub mod block; pub mod fee; pub mod serialization; -#[cfg(feature = "validation")] +#[cfg(any( + feature = "message-signing", + feature = "message-signature-verification" +))] pub mod signing; #[cfg(feature = "system_contracts")] pub mod system_data_contracts; diff --git a/packages/rs-dpp/src/serialization/serialization_traits.rs b/packages/rs-dpp/src/serialization/serialization_traits.rs index ff19a4f945..031532840b 100644 --- a/packages/rs-dpp/src/serialization/serialization_traits.rs +++ b/packages/rs-dpp/src/serialization/serialization_traits.rs @@ -159,6 +159,7 @@ pub trait ValueConvertible<'a>: Serialize + Deserialize<'a> { } pub trait PlatformMessageSignable { + #[cfg(feature = "message-signature-verification")] fn verify_signature( &self, public_key_type: KeyType, @@ -166,6 +167,7 @@ pub trait PlatformMessageSignable { signature: &[u8], ) -> Result; + #[cfg(feature = "message-signing")] fn sign_by_private_key( &self, private_key: &[u8], diff --git a/packages/rs-dpp/src/signing.rs b/packages/rs-dpp/src/signing.rs index ac2c7c511d..8bd84c4e2f 100644 --- a/packages/rs-dpp/src/signing.rs +++ b/packages/rs-dpp/src/signing.rs @@ -1,15 +1,16 @@ +#[cfg(feature = "message-signature-verification")] use crate::consensus::signature::{ BasicBLSError, BasicECDSAError, SignatureError, SignatureShouldNotBePresentError, }; use crate::identity::KeyType; use crate::serialization::PlatformMessageSignable; -#[cfg(any(feature = "state-transitions", feature = "validation"))] -use crate::state_transition::errors::InvalidIdentityPublicKeyTypeError; +#[cfg(feature = "message-signature-verification")] use crate::validation::SimpleConsensusValidationResult; use crate::{BlsModule, ProtocolError}; use dashcore::signer; impl PlatformMessageSignable for &[u8] { + #[cfg(feature = "message-signature-verification")] fn verify_signature( &self, public_key_type: KeyType, @@ -99,7 +100,7 @@ impl PlatformMessageSignable for &[u8] { } } } - + #[cfg(feature = "message-signing")] fn sign_by_private_key( &self, private_key: &[u8], @@ -119,9 +120,10 @@ impl PlatformMessageSignable for &[u8] { // https://github.com/dashevo/platform/blob/6b02b26e5cd3a7c877c5fdfe40c4a4385a8dda15/packages/js-dpp/lib/stateTransition/AbstractStateTransition.js#L187 // is to return the error for the BIP13_SCRIPT_HASH KeyType::BIP13_SCRIPT_HASH | KeyType::EDDSA_25519_HASH160 => { - Err(ProtocolError::InvalidIdentityPublicKeyTypeError( - InvalidIdentityPublicKeyTypeError::new(key_type), - )) + Err(ProtocolError::InvalidSigningKeyTypeError(format!( + "key type {} can not sign", + key_type.to_string() + ))) } } } diff --git a/packages/rs-dpp/src/state_transition/errors/mod.rs b/packages/rs-dpp/src/state_transition/errors/mod.rs index 59eb4570f6..2acefb9df1 100644 --- a/packages/rs-dpp/src/state_transition/errors/mod.rs +++ b/packages/rs-dpp/src/state_transition/errors/mod.rs @@ -1,6 +1,7 @@ #[cfg(any( feature = "state-transition-validation", - feature = "state-transition-signing" + feature = "state-transition-signing", + feature = "message-signing", ))] mod invalid_identity_public_key_type_error; #[cfg(any( diff --git a/packages/rs-dpp/src/state_transition/mod.rs b/packages/rs-dpp/src/state_transition/mod.rs index b874db7990..57c3e697a2 100644 --- a/packages/rs-dpp/src/state_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/mod.rs @@ -18,8 +18,9 @@ mod state_transition_types; pub mod state_transition_factory; pub mod errors; -use crate::util::hash::{hash_to_vec, ripemd160_sha256}; +use crate::util::hash::{hash_double_to_vec, hash_single, ripemd160_sha256}; +pub mod proof_result; mod serialization; pub mod state_transitions; mod traits; @@ -261,9 +262,9 @@ impl StateTransition { fn hash(&self, skip_signature: bool) -> Result, ProtocolError> { if skip_signature { - Ok(hash_to_vec(self.signable_bytes()?)) + Ok(hash_double_to_vec(self.signable_bytes()?)) } else { - Ok(hash_to_vec( + Ok(hash_double_to_vec( crate::serialization::PlatformSerializable::serialize_to_bytes(self)?, )) } @@ -289,6 +290,13 @@ impl StateTransition { call_method!(self, signature) } + /// The transaction id is a single hash of the data with the signature + pub fn transaction_id(&self) -> Result<[u8; 32], ProtocolError> { + Ok(hash_single( + crate::serialization::PlatformSerializable::serialize_to_bytes(self)?, + )) + } + /// returns the signature as a byte-array pub fn signature_public_key_id(&self) -> Option { call_getter_method_identity_signed!(self, signature_public_key_id) diff --git a/packages/rs-dpp/src/state_transition/proof_result.rs b/packages/rs-dpp/src/state_transition/proof_result.rs new file mode 100644 index 0000000000..6db974dc78 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/proof_result.rs @@ -0,0 +1,14 @@ +use crate::data_contract::DataContract; +use crate::document::Document; +use crate::identity::{Identity, PartialIdentity}; +use platform_value::Identifier; +use std::collections::BTreeMap; + +#[derive(Debug)] +pub enum StateTransitionProofResult { + VerifiedDataContract(DataContract), + VerifiedIdentity(Identity), + VerifiedPartialIdentity(PartialIdentity), + VerifiedBalanceTransfer(PartialIdentity, PartialIdentity), //from/to + VerifiedDocuments(BTreeMap>), +} diff --git a/packages/rs-dpp/src/state_transition/serialization.rs b/packages/rs-dpp/src/state_transition/serialization.rs index 002590bf8b..e7ed589e5a 100644 --- a/packages/rs-dpp/src/state_transition/serialization.rs +++ b/packages/rs-dpp/src/state_transition/serialization.rs @@ -61,7 +61,7 @@ mod tests { let identity_create_transition = IdentityCreateTransition::V0( IdentityCreateTransitionV0::try_from_identity( - identity, + &identity, AssetLockProof::Instant(asset_lock_proof), platform_version, ) diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/mod.rs index 752e0ad1d5..9dd9788263 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/mod.rs @@ -3,8 +3,14 @@ pub mod from_document; pub mod v0; mod v0_methods; +use crate::data_contract::DataContract; +use crate::document::Document; +use crate::state_transition::documents_batch_transition::document_create_transition::v0::DocumentFromCreateTransitionV0; +use crate::ProtocolError; use bincode::{Decode, Encode}; use derive_more::{Display, From}; +use platform_value::Identifier; +use platform_version::version::PlatformVersion; use serde::{Deserialize, Serialize}; pub use v0::DocumentCreateTransitionV0; @@ -23,3 +29,80 @@ impl Default for DocumentCreateTransition { DocumentCreateTransition::V0(DocumentCreateTransitionV0::default()) // since only v0 } } + +/// document from create transition +pub trait DocumentFromCreateTransition { + /// Attempts to create a new `Document` from the given `DocumentCreateTransition` reference and `owner_id`. + /// + /// # Arguments + /// + /// * `value` - A reference to the `DocumentCreateTransition` containing information about the document being created. + /// * `owner_id` - The `Identifier` of the document's owner. + /// + /// # Returns + /// + /// * `Result` - A new `Document` object if successful, otherwise a `ProtocolError`. + fn try_from_create_transition( + document_create_transition: &DocumentCreateTransition, + owner_id: Identifier, + data_contract: &DataContract, + platform_version: &PlatformVersion, + ) -> Result + where + Self: Sized; + /// Attempts to create a new `Document` from the given `DocumentCreateTransition` instance and `owner_id`. + /// + /// # Arguments + /// + /// * `value` - A `DocumentCreateTransition` instance containing information about the document being created. + /// * `owner_id` - The `Identifier` of the document's owner. + /// + /// # Returns + /// + /// * `Result` - A new `Document` object if successful, otherwise a `ProtocolError`. + fn try_from_owned_create_transition( + document_create_transition: DocumentCreateTransition, + owner_id: Identifier, + data_contract: &DataContract, + platform_version: &PlatformVersion, + ) -> Result + where + Self: Sized; +} + +impl DocumentFromCreateTransition for Document { + fn try_from_create_transition( + document_create_transition: &DocumentCreateTransition, + owner_id: Identifier, + data_contract: &DataContract, + platform_version: &PlatformVersion, + ) -> Result + where + Self: Sized, + { + match document_create_transition { + DocumentCreateTransition::V0(v0) => { + Self::try_from_create_transition_v0(v0, owner_id, data_contract, platform_version) + } + } + } + + fn try_from_owned_create_transition( + document_create_transition: DocumentCreateTransition, + owner_id: Identifier, + data_contract: &DataContract, + platform_version: &PlatformVersion, + ) -> Result + where + Self: Sized, + { + match document_create_transition { + DocumentCreateTransition::V0(v0) => Self::try_from_owned_create_transition_v0( + v0, + owner_id, + data_contract, + platform_version, + ), + } + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/mod.rs index 275398bbe2..26127c8fc8 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/mod.rs @@ -4,7 +4,7 @@ pub mod v0_methods; use bincode::{Decode, Encode}; use platform_value::btreemap_extensions::BTreeValueRemoveFromMapHelper; -use platform_value::Value; +use platform_value::{Identifier, Value}; use serde::{Deserialize, Serialize}; use std::collections::BTreeMap; @@ -15,11 +15,15 @@ use crate::identity::TimestampMillis; use crate::{data_contract::DataContract, errors::ProtocolError}; +use crate::data_contract::accessors::v0::DataContractV0Getters; +use crate::data_contract::document_type::methods::DocumentTypeV0Methods; +use crate::document::{Document, DocumentV0}; use crate::state_transition::documents_batch_transition::document_base_transition::v0::{ DocumentBaseTransitionV0, DocumentTransitionObjectLike, }; use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; use derive_more::Display; +use platform_version::version::PlatformVersion; mod property_names { pub const ENTROPY: &str = "$entropy"; @@ -176,6 +180,152 @@ impl DocumentCreateTransitionV0 { } } +/// documents from create transition v0 +pub trait DocumentFromCreateTransitionV0 { + /// Attempts to create a new `Document` from the given `DocumentCreateTransition` instance and `owner_id`. + /// + /// # Arguments + /// + /// * `value` - A `DocumentCreateTransition` instance containing information about the document being created. + /// * `owner_id` - The `Identifier` of the document's owner. + /// + /// # Returns + /// + /// * `Result` - A new `Document` object if successful, otherwise a `ProtocolError`. + fn try_from_owned_create_transition_v0( + v0: DocumentCreateTransitionV0, + owner_id: Identifier, + data_contract: &DataContract, + platform_version: &PlatformVersion, + ) -> Result + where + Self: Sized; + /// Attempts to create a new `Document` from the given `DocumentCreateTransition` reference and `owner_id`. + /// + /// # Arguments + /// + /// * `value` - A reference to the `DocumentCreateTransitionActionV0` containing information about the document being created. + /// * `owner_id` - The `Identifier` of the document's owner. + /// + /// # Returns + /// + /// * `Result` - A new `Document` object if successful, otherwise a `ProtocolError`. + fn try_from_create_transition_v0( + v0: &DocumentCreateTransitionV0, + owner_id: Identifier, + data_contract: &DataContract, + platform_version: &PlatformVersion, + ) -> Result + where + Self: Sized; +} + +impl DocumentFromCreateTransitionV0 for Document { + fn try_from_owned_create_transition_v0( + v0: DocumentCreateTransitionV0, + owner_id: Identifier, + data_contract: &DataContract, + platform_version: &PlatformVersion, + ) -> Result + where + Self: Sized, + { + let DocumentCreateTransitionV0 { + base, + created_at, + updated_at, + data, + .. + } = v0; + + match base { + DocumentBaseTransition::V0(base_v0) => { + let DocumentBaseTransitionV0 { + id, + document_type_name, + .. + } = base_v0; + + let document_type = + data_contract.document_type_for_name(document_type_name.as_str())?; + + match platform_version + .dpp + .document_versions + .document_structure_version + { + 0 => Ok(DocumentV0 { + id, + owner_id, + properties: data, + revision: document_type.initial_revision(), + created_at, + updated_at, + } + .into()), + version => Err(ProtocolError::UnknownVersionMismatch { + method: "Document::try_from_create_transition_v0".to_string(), + known_versions: vec![0], + received: version, + }), + } + } + } + } + + fn try_from_create_transition_v0( + v0: &DocumentCreateTransitionV0, + owner_id: Identifier, + data_contract: &DataContract, + platform_version: &PlatformVersion, + ) -> Result + where + Self: Sized, + { + let DocumentCreateTransitionV0 { + base, + created_at, + updated_at, + data, + .. + } = v0; + + match base { + DocumentBaseTransition::V0(base_v0) => { + let DocumentBaseTransitionV0 { + id, + document_type_name, + .. + } = base_v0; + + let document_type = + data_contract.document_type_for_name(document_type_name.as_str())?; + + match platform_version + .dpp + .document_versions + .document_structure_version + { + 0 => Ok(DocumentV0 { + id: *id, + owner_id, + properties: data.clone(), + revision: document_type.initial_revision(), + created_at: *created_at, + updated_at: *updated_at, + } + .into()), + version => Err(ProtocolError::UnknownVersionMismatch { + method: "Document::try_from_owned_create_transition_v0".to_string(), + known_versions: vec![0], + received: version, + }), + } + } + } + } +} + #[cfg(test)] mod test { use crate::data_contract::data_contract::DataContractV0; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/mod.rs index ea9cc31e76..655f4aad9f 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/mod.rs @@ -2,8 +2,12 @@ mod from_document; pub mod v0; mod v0_methods; +use crate::document::Document; +use crate::ProtocolError; use bincode::{Decode, Encode}; use derive_more::{Display, From}; +use platform_value::Identifier; +use platform_version::version::PlatformVersion; use serde::{Deserialize, Serialize}; pub use v0::*; @@ -16,3 +20,74 @@ pub enum DocumentReplaceTransition { #[display(fmt = "V0({})", "_0")] V0(DocumentReplaceTransitionV0), } + +/// document from replace transition +pub trait DocumentFromReplaceTransition { + /// Attempts to create a new `Document` from the given `DocumentReplaceTransition` reference and `owner_id`. + /// + /// # Arguments + /// + /// * `value` - A reference to the `DocumentReplaceTransition` containing information about the document being replaced. + /// * `owner_id` - The `Identifier` of the document's owner. + /// + /// # Returns + /// + /// * `Result` - A new `Document` object if successful, otherwise a `ProtocolError`. + fn try_from_replace_transition( + document_replace_transition_action: &DocumentReplaceTransition, + owner_id: Identifier, + created_at: Option, + platform_version: &PlatformVersion, + ) -> Result + where + Self: Sized; + /// Attempts to create a new `Document` from the given `DocumentReplaceTransition` instance and `owner_id`. + /// + /// # Arguments + /// + /// * `value` - A `DocumentReplaceTransition` instance containing information about the document being replaced. + /// * `owner_id` - The `Identifier` of the document's owner. + /// + /// # Returns + /// + /// * `Result` - A new `Document` object if successful, otherwise a `ProtocolError`. + fn try_from_owned_replace_transition( + document_replace_transition_action: DocumentReplaceTransition, + owner_id: Identifier, + created_at: Option, + platform_version: &PlatformVersion, + ) -> Result + where + Self: Sized; +} + +impl DocumentFromReplaceTransition for Document { + fn try_from_replace_transition( + document_replace_transition: &DocumentReplaceTransition, + owner_id: Identifier, + created_at: Option, + platform_version: &PlatformVersion, + ) -> Result { + match document_replace_transition { + DocumentReplaceTransition::V0(v0) => { + Self::try_from_replace_transition_v0(v0, owner_id, created_at, platform_version) + } + } + } + + fn try_from_owned_replace_transition( + document_replace_transition: DocumentReplaceTransition, + owner_id: Identifier, + created_at: Option, + platform_version: &PlatformVersion, + ) -> Result { + match document_replace_transition { + DocumentReplaceTransition::V0(v0) => Self::try_from_owned_replace_transition_v0( + v0, + owner_id, + created_at, + platform_version, + ), + } + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/mod.rs index ee32130575..ad303c02ad 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/mod.rs @@ -6,12 +6,16 @@ use crate::prelude::Revision; use bincode::{Decode, Encode}; use derive_more::Display; -use platform_value::Value; +use platform_value::{Identifier, Value}; use serde::{Deserialize, Serialize}; +use crate::document::{Document, DocumentV0}; +use crate::ProtocolError; +use platform_version::version::PlatformVersion; use std::collections::BTreeMap; pub use super::super::document_base_transition::IDENTIFIER_FIELDS; +use crate::state_transition::documents_batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; mod property_names { @@ -252,3 +256,121 @@ pub struct DocumentReplaceTransitionV0 { // assert_eq!(cdt.to_json().unwrap().to_string(), json_no_whitespace); // } // } + +/// document from replace transition v0 +pub trait DocumentFromReplaceTransitionV0 { + /// Attempts to create a new `Document` from the given `DocumentReplaceTransitionV0` reference and `owner_id`. + /// + /// # Arguments + /// + /// * `value` - A reference to the `DocumentReplaceTransitionAction` containing information about the document being created. + /// * `owner_id` - The `Identifier` of the document's owner. + /// * `created_at` - The time if it exists that the original document was created. + /// + /// # Returns + /// + /// * `Result` - A new `Document` object if successful, otherwise a `ProtocolError`. + fn try_from_replace_transition_v0( + value: &DocumentReplaceTransitionV0, + owner_id: Identifier, + created_at: Option, + platform_version: &PlatformVersion, + ) -> Result + where + Self: Sized; + /// Attempts to create a new `Document` from the given `DocumentReplaceTransitionV0` instance and `owner_id`. + /// + /// # Arguments + /// + /// * `value` - A `DocumentReplaceTransitionAction` instance containing information about the document being created. + /// * `owner_id` - The `Identifier` of the document's owner. + /// * `created_at` - The time if it exists that the original document was created. + /// + /// # Returns + /// + /// * `Result` - A new `Document` object if successful, otherwise a `ProtocolError`. + fn try_from_owned_replace_transition_v0( + value: DocumentReplaceTransitionV0, + owner_id: Identifier, + created_at: Option, + platform_version: &PlatformVersion, + ) -> Result + where + Self: Sized; +} + +impl DocumentFromReplaceTransitionV0 for Document { + fn try_from_replace_transition_v0( + value: &DocumentReplaceTransitionV0, + owner_id: Identifier, + created_at: Option, + platform_version: &PlatformVersion, + ) -> Result { + let DocumentReplaceTransitionV0 { + base, + revision, + updated_at, + data, + } = value; + + let id = base.id(); + + match platform_version + .dpp + .document_versions + .document_structure_version + { + 0 => Ok(DocumentV0 { + id, + owner_id, + properties: data.clone(), + revision: Some(*revision), + created_at, + updated_at: *updated_at, + } + .into()), + version => Err(ProtocolError::UnknownVersionMismatch { + method: "Document::try_from_replace_transition".to_string(), + known_versions: vec![0], + received: version, + }), + } + } + + fn try_from_owned_replace_transition_v0( + value: DocumentReplaceTransitionV0, + owner_id: Identifier, + created_at: Option, + platform_version: &PlatformVersion, + ) -> Result { + let DocumentReplaceTransitionV0 { + base, + revision, + updated_at, + data, + } = value; + + let id = base.id(); + + match platform_version + .dpp + .document_versions + .document_structure_version + { + 0 => Ok(DocumentV0 { + id, + owner_id, + properties: data, + revision: Some(revision), + created_at, + updated_at, + } + .into()), + version => Err(ProtocolError::UnknownVersionMismatch { + method: "Document::try_from_replace_transition".to_string(), + known_versions: vec![0], + received: version, + }), + } + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/methods/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/methods/mod.rs index 0128b6ce3d..9377c04bad 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/methods/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/methods/mod.rs @@ -15,7 +15,7 @@ use crate::{BlsModule, ProtocolError}; impl IdentityCreateTransitionMethodsV0 for IdentityCreateTransition { #[cfg(feature = "state-transition-signing")] fn try_from_identity_with_signer( - identity: Identity, + identity: &Identity, asset_lock_proof: AssetLockProof, asset_lock_proof_private_key: &[u8], signer: &S, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/methods/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/methods/v0/mod.rs index 65343d67c5..a2ff6b1663 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/methods/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/methods/v0/mod.rs @@ -8,7 +8,7 @@ use platform_version::version::PlatformVersion; pub trait IdentityCreateTransitionMethodsV0 { #[cfg(feature = "state-transition-signing")] fn try_from_identity_with_signer( - identity: Identity, + identity: &Identity, asset_lock_proof: AssetLockProof, asset_lock_proof_private_key: &[u8], signer: &S, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/mod.rs index 9b246d266b..91b155844c 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/mod.rs @@ -89,7 +89,7 @@ impl TryFrom for IdentityCreateTransitionV0 { impl IdentityCreateTransitionV0 { pub fn try_from_identity_v0( - identity: Identity, + identity: &Identity, asset_lock_proof: AssetLockProof, ) -> Result { let mut identity_create_transition = IdentityCreateTransitionV0::default(); @@ -109,7 +109,7 @@ impl IdentityCreateTransitionV0 { } pub fn try_from_identity( - identity: Identity, + identity: &Identity, asset_lock_proof: AssetLockProof, platform_version: &PlatformVersion, ) -> Result { diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/v0_methods.rs index df2025506e..2615ddfc2d 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/v0_methods.rs @@ -20,7 +20,7 @@ use crate::version::PlatformVersion; impl IdentityCreateTransitionMethodsV0 for IdentityCreateTransitionV0 { #[cfg(feature = "state-transition-signing")] fn try_from_identity_with_signer( - identity: Identity, + identity: &Identity, asset_lock_proof: AssetLockProof, asset_lock_proof_private_key: &[u8], signer: &S, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/methods/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/methods/mod.rs index 6b3e0a53c0..8fab5abff3 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/methods/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/methods/mod.rs @@ -1,5 +1,50 @@ mod v0; + use crate::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition; +use platform_version::version::FeatureVersion; pub use v0::*; -impl IdentityCreditWithdrawalTransitionMethodsV0 for IdentityCreditWithdrawalTransition {} +use crate::identity::signer::Signer; +use crate::identity::Identity; + +use crate::identity::core_script::CoreScript; +use crate::state_transition::identity_credit_withdrawal_transition::v0::IdentityCreditWithdrawalTransitionV0; +use crate::state_transition::StateTransition; +use crate::version::PlatformVersion; +use crate::withdrawal::Pooling; +use crate::ProtocolError; + +impl IdentityCreditWithdrawalTransitionMethodsV0 for IdentityCreditWithdrawalTransition { + #[cfg(feature = "state-transition-signing")] + fn try_from_identity( + identity: &Identity, + output_script: CoreScript, + amount: u64, + pooling: Pooling, + core_fee_per_byte: u32, + signer: S, + platform_version: &PlatformVersion, + version: Option, + ) -> Result { + match version.unwrap_or( + platform_version + .dpp + .state_transition_conversion_versions + .identity_to_identity_withdrawal_transition, + ) { + 0 => Ok(IdentityCreditWithdrawalTransitionV0::try_from_identity( + identity, + output_script, + amount, + pooling, + core_fee_per_byte, + signer, + platform_version, + version, + )?), + v => Err(ProtocolError::UnknownVersionError(format!( + "Unknown IdentityCreditWithdrawalTransition version for try_from_identity {v}" + ))), + } + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/methods/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/methods/v0/mod.rs index d6cf5253ff..48ffd9a916 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/methods/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/methods/v0/mod.rs @@ -1,6 +1,24 @@ -use crate::state_transition::StateTransitionType; +use crate::identity::core_script::CoreScript; +use crate::identity::signer::Signer; +use crate::identity::Identity; +use crate::state_transition::{StateTransition, StateTransitionType}; +use crate::withdrawal::Pooling; +use crate::ProtocolError; +use platform_version::version::{FeatureVersion, PlatformVersion}; pub trait IdentityCreditWithdrawalTransitionMethodsV0 { + #[cfg(feature = "state-transition-signing")] + fn try_from_identity( + identity: &Identity, + output_script: CoreScript, + amount: u64, + pooling: Pooling, + core_fee_per_byte: u32, + signer: S, + _platform_version: &PlatformVersion, + _version: Option, + ) -> Result; + /// Get State Transition Type fn get_type() -> StateTransitionType { StateTransitionType::IdentityCreditWithdrawal diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/mod.rs index 33caa66c3d..65d05fe107 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/mod.rs @@ -3,6 +3,7 @@ mod identity_signed; mod json_conversion; mod state_transition_like; mod types; +mod v0_methods; #[cfg(feature = "state-transition-value-conversion")] mod value_conversion; mod version; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/v0_methods.rs new file mode 100644 index 0000000000..52e77c3db6 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/v0_methods.rs @@ -0,0 +1,57 @@ +use crate::identity::accessors::IdentityGettersV0; +use crate::identity::core_script::CoreScript; +use crate::identity::signer::Signer; +use crate::identity::{Identity, KeyType, Purpose, SecurityLevel}; +use crate::ProtocolError; +use platform_version::version::{FeatureVersion, PlatformVersion}; + +use crate::state_transition::identity_credit_withdrawal_transition::methods::IdentityCreditWithdrawalTransitionMethodsV0; +use crate::state_transition::identity_credit_withdrawal_transition::v0::IdentityCreditWithdrawalTransitionV0; +use crate::state_transition::{GetDataContractSecurityLevelRequirementFn, StateTransition}; +use crate::withdrawal::Pooling; + +impl IdentityCreditWithdrawalTransitionMethodsV0 for IdentityCreditWithdrawalTransitionV0 { + #[cfg(feature = "state-transition-signing")] + fn try_from_identity( + identity: &Identity, + output_script: CoreScript, + amount: u64, + pooling: Pooling, + core_fee_per_byte: u32, + signer: S, + _platform_version: &PlatformVersion, + _version: Option, + ) -> Result { + let mut transition: StateTransition = IdentityCreditWithdrawalTransitionV0 { + identity_id: identity.id(), + amount, + core_fee_per_byte, + pooling, + output_script, + revision: identity.revision() + 1, + signature_public_key_id: 0, + signature: Default::default(), + } + .into(); + + let identity_public_key = identity + .get_first_public_key_matching( + Purpose::WITHDRAW, + SecurityLevel::full_range().into(), + KeyType::all_key_types().into(), + ) + .ok_or( + ProtocolError::DesiredKeyWithTypePurposeSecurityLevelMissing( + "no withdrawal public key".to_string(), + ), + )?; + + transition.sign_external( + identity_public_key, + &signer, + None::, + )?; + + Ok(transition) + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/methods/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/methods/mod.rs index 43e807d321..2983c6e067 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/methods/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/methods/mod.rs @@ -8,32 +8,29 @@ use crate::state_transition::identity_topup_transition::v0::IdentityTopUpTransit use crate::state_transition::identity_topup_transition::IdentityTopUpTransition; use crate::state_transition::StateTransition; use crate::version::FeatureVersion; -use crate::{BlsModule, ProtocolError}; +use crate::ProtocolError; use platform_version::version::PlatformVersion; impl IdentityTopUpTransitionMethodsV0 for IdentityTopUpTransition { #[cfg(feature = "state-transition-signing")] fn try_from_identity( - identity: Identity, + identity: &Identity, asset_lock_proof: AssetLockProof, asset_lock_proof_private_key: &[u8], - bls: &impl BlsModule, platform_version: &PlatformVersion, version: Option, ) -> Result { match version.unwrap_or( platform_version .dpp - .state_transition_serialization_versions - .identity_top_up_state_transition - .default_current_version, + .state_transition_conversion_versions + .identity_to_identity_top_up_transition, ) { 0 => Ok(IdentityTopUpTransitionV0::try_from_identity( identity, asset_lock_proof, asset_lock_proof_private_key, - bls, platform_version, version, )?), diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/methods/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/methods/v0/mod.rs index 65328f5072..64918489d8 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/methods/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/methods/v0/mod.rs @@ -1,16 +1,15 @@ use crate::identity::Identity; use crate::prelude::AssetLockProof; use crate::state_transition::{StateTransition, StateTransitionType}; -use crate::{BlsModule, ProtocolError}; +use crate::ProtocolError; use platform_version::version::{FeatureVersion, PlatformVersion}; pub trait IdentityTopUpTransitionMethodsV0 { #[cfg(feature = "state-transition-signing")] fn try_from_identity( - identity: Identity, + identity: &Identity, asset_lock_proof: AssetLockProof, asset_lock_proof_private_key: &[u8], - bls: &impl BlsModule, platform_version: &PlatformVersion, version: Option, ) -> Result; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/v0/v0_methods.rs index fb69de7320..425c50f012 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/v0/v0_methods.rs @@ -1,13 +1,14 @@ -use crate::{prelude::Identifier, BlsModule, ProtocolError}; +use crate::{prelude::Identifier, ProtocolError}; +use dashcore::signer; use crate::identity::accessors::IdentityGettersV0; use crate::identity::Identity; -use crate::identity::KeyType::ECDSA_HASH160; use crate::prelude::AssetLockProof; use crate::state_transition::identity_topup_transition::accessors::IdentityTopUpTransitionAccessorsV0; use crate::state_transition::identity_topup_transition::methods::IdentityTopUpTransitionMethodsV0; +use crate::serialization::Signable; use platform_version::version::PlatformVersion; use crate::state_transition::identity_topup_transition::v0::IdentityTopUpTransitionV0; @@ -17,10 +18,9 @@ use crate::version::FeatureVersion; impl IdentityTopUpTransitionMethodsV0 for IdentityTopUpTransitionV0 { #[cfg(feature = "state-transition-signing")] fn try_from_identity( - identity: Identity, + identity: &Identity, asset_lock_proof: AssetLockProof, asset_lock_proof_private_key: &[u8], - bls: &impl BlsModule, _platform_version: &PlatformVersion, _version: Option, ) -> Result { @@ -32,7 +32,10 @@ impl IdentityTopUpTransitionMethodsV0 for IdentityTopUpTransitionV0 { let mut state_transition: StateTransition = identity_top_up_transition.into(); - state_transition.sign_by_private_key(asset_lock_proof_private_key, ECDSA_HASH160, bls)?; + let data = state_transition.signable_bytes()?; + + let signature = signer::sign(&data, asset_lock_proof_private_key)?; + state_transition.set_signature(signature.to_vec().into()); Ok(state_transition) } diff --git a/packages/rs-dpp/src/util/hash.rs b/packages/rs-dpp/src/util/hash.rs index c21ce76edc..6f7e1235fc 100644 --- a/packages/rs-dpp/src/util/hash.rs +++ b/packages/rs-dpp/src/util/hash.rs @@ -1,16 +1,20 @@ use dashcore::hashes::{ripemd160, sha256, Hash}; use sha2::{Digest, Sha256}; -pub fn hash_to_vec(payload: impl AsRef<[u8]>) -> Vec { +pub fn hash_double_to_vec(payload: impl AsRef<[u8]>) -> Vec { Sha256::digest(Sha256::digest(payload)).to_vec() } -pub fn hash(payload: impl AsRef<[u8]>) -> [u8; 32] { +pub fn hash_double(payload: impl AsRef<[u8]>) -> [u8; 32] { Sha256::digest(Sha256::digest(payload)).into() } +pub fn hash_single(payload: impl AsRef<[u8]>) -> [u8; 32] { + Sha256::digest(payload).into() +} + pub fn hash_to_hex_string(payload: impl AsRef<[u8]>) -> String { - hex::encode(hash(payload)) + hex::encode(hash_double(payload)) } pub fn ripemd160_sha256(data: &[u8]) -> [u8; 20] { diff --git a/packages/rs-dpp/src/version/mod.rs b/packages/rs-dpp/src/version/mod.rs index 71e2b84d9b..7134764321 100644 --- a/packages/rs-dpp/src/version/mod.rs +++ b/packages/rs-dpp/src/version/mod.rs @@ -10,6 +10,9 @@ lazy_static! { RwLock::new(None); } +/// Number of votes for a protocol version upgrade. +pub type ProtocolVersionVoteCount = u64; + pub trait PlatformVersionCurrentVersion { fn set_current(platform_version: &'static PlatformVersion); fn get_current<'a>() -> Result<&'a Self, ProtocolError>; diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index 90372484ad..0bd3c046a2 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -12,8 +12,6 @@ edition = "2021" rust-version = "1.73" license = "MIT" -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - [dependencies] bincode = { version = "2.0.0-rc.3", features = ["serde"] } ciborium = { git = "https://github.com/qrayven/ciborium", branch = "feat-ser-null-as-undefined" } @@ -41,9 +39,9 @@ simple-signer = { path = "../simple-signer" } rust_decimal = "1.2.5" rust_decimal_macros = "1.25.0" mockall = { version = "0.11", optional = true } -prost = { version = "0.11.6", default-features = false } +prost = { version = "0.12", default-features = false } tracing = { version = "0.1.37", default-features = false, features = [] } -clap = { version = "4.1.8", optional = true, features = ["derive"] } +clap = { version = "4.4.10", optional = true, features = ["derive"] } envy = { version = "0.4.2" } dotenvy = { version = "0.15.7", optional = true } dapi-grpc = { path = "../dapi-grpc" } diff --git a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs index 694c219146..b60ed5ca2e 100644 --- a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs @@ -534,7 +534,7 @@ mod tests { let identity_create_transition: StateTransition = IdentityCreateTransition::try_from_identity_with_signer( - identity.clone(), + &identity, asset_lock_proof, pk.as_slice(), &signer, @@ -724,7 +724,7 @@ mod tests { let identity_create_transition: StateTransition = IdentityCreateTransition::try_from_identity_with_signer( - identity.clone(), + &identity, asset_lock_proof, pk.as_slice(), &signer, @@ -770,10 +770,9 @@ mod tests { let identity_top_up_transition: StateTransition = IdentityTopUpTransition::try_from_identity( - identity.clone(), + &identity, asset_lock_proof_top_up, pk.as_slice(), - &NativeBlsModule, platform_version, None, ) @@ -860,7 +859,7 @@ mod tests { let identity_create_transition: StateTransition = IdentityCreateTransition::try_from_identity_with_signer( - identity.clone(), + &identity, asset_lock_proof, pk.as_slice(), &signer, @@ -906,10 +905,9 @@ mod tests { let identity_top_up_transition: StateTransition = IdentityTopUpTransition::try_from_identity( - identity.clone(), + &identity, asset_lock_proof_top_up, pk.as_slice(), - &NativeBlsModule, platform_version, None, ) @@ -1034,10 +1032,9 @@ mod tests { let identity_top_up_transition: StateTransition = IdentityTopUpTransition::try_from_identity( - identity.clone(), + &identity, asset_lock_proof_top_up, pk.as_slice(), - &NativeBlsModule, platform_version, None, ) @@ -1111,7 +1108,7 @@ mod tests { let identity_create_transition: StateTransition = IdentityCreateTransition::try_from_identity_with_signer( - identity.clone(), + &identity, asset_lock_proof, pk.as_slice(), &signer, @@ -1157,10 +1154,9 @@ mod tests { let identity_top_up_transition: StateTransition = IdentityTopUpTransition::try_from_identity( - identity.clone(), + &identity, asset_lock_proof_top_up.clone(), pk.as_slice(), - &NativeBlsModule, platform_version, None, ) @@ -1224,7 +1220,7 @@ mod tests { let identity_create_transition: StateTransition = IdentityCreateTransition::try_from_identity_with_signer( - identity, + &identity, asset_lock_proof_top_up, pk.as_slice(), &signer, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs index dcd5f5163e..57051bd299 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs @@ -2,7 +2,7 @@ use dpp::consensus::state::data_trigger::data_trigger_condition_error::DataTrigg use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contracts::dpns_contract::v1::document_types::domain::properties::PARENT_DOMAIN_NAME; ///! The `dpns_triggers` module contains data triggers specific to the DPNS data contract. -use dpp::util::hash::hash; +use dpp::util::hash::hash_double; use std::collections::BTreeMap; use crate::error::execution::ExecutionError; @@ -303,7 +303,7 @@ pub fn create_domain_data_trigger_v0( salted_domain_buffer.extend(preorder_salt); salted_domain_buffer.extend(full_domain_name.as_bytes()); - let salted_domain_hash = hash(salted_domain_buffer); + let salted_domain_hash = hash_double(salted_domain_buffer); let document_type = data_contract.document_type_for_name("preorder")?; diff --git a/packages/rs-drive-abci/src/platform_types/platform_state/mod.rs b/packages/rs-drive-abci/src/platform_types/platform_state/mod.rs index 4a7b87d463..afd052a1b5 100644 --- a/packages/rs-drive-abci/src/platform_types/platform_state/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/platform_state/mod.rs @@ -23,7 +23,7 @@ use indexmap::IndexMap; use crate::error::execution::ExecutionError; use dpp::block::block_info::BlockInfo; use dpp::bls_signatures::PublicKey as ThresholdBlsPublicKey; -use dpp::util::hash::hash; +use dpp::util::hash::hash_double; use std::collections::BTreeMap; /// Platform state @@ -94,7 +94,7 @@ impl PlatformDeserializableFromVersionedStructure for PlatformState { impl PlatformState { /// Get the state fingerprint pub fn fingerprint(&self) -> [u8; 32] { - hash( + hash_double( self.serialize_to_bytes() .expect("expected to serialize state"), ) diff --git a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract/mod.rs b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract/mod.rs index 7573974aee..d86e337a80 100644 --- a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract/mod.rs +++ b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract/mod.rs @@ -5,10 +5,10 @@ use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_data_contract_request::Version; use dapi_grpc::platform::v0::GetDataContractRequest; +use dapi_grpc::Message; use dpp::check_validation_result_with_data; use dpp::validation::ValidationResult; use dpp::version::PlatformVersion; -use prost::Message; mod v0; diff --git a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract/v0/mod.rs b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract/v0/mod.rs index 39da61433c..8dcd67b4f4 100644 --- a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract/v0/mod.rs @@ -7,12 +7,12 @@ use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_data_contract_request::GetDataContractRequestV0; use dapi_grpc::platform::v0::get_data_contract_response::GetDataContractResponseV0; use dapi_grpc::platform::v0::{get_data_contract_response, GetDataContractResponse, Proof}; +use dapi_grpc::Message; use dpp::check_validation_result_with_data; use dpp::identifier::Identifier; use dpp::serialization::PlatformSerializableWithPlatformVersion; use dpp::validation::ValidationResult; use dpp::version::PlatformVersion; -use prost::Message; impl Platform { pub(super) fn query_data_contract_v0( diff --git a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/mod.rs b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/mod.rs index ea66c5cf8c..e9558a077c 100644 --- a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/mod.rs +++ b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/mod.rs @@ -8,8 +8,8 @@ use dapi_grpc::platform::v0::GetDataContractHistoryRequest; use dpp::check_validation_result_with_data; use dpp::validation::ValidationResult; +use dapi_grpc::Message; use dpp::version::PlatformVersion; -use prost::Message; mod v0; diff --git a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/v0/mod.rs b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/v0/mod.rs index ad58118f60..5ab84e76f6 100644 --- a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/v0/mod.rs @@ -14,7 +14,7 @@ use dpp::serialization::PlatformSerializableWithPlatformVersion; use dpp::validation::ValidationResult; use dpp::version::PlatformVersion; use dpp::{check_validation_result_with_data, ProtocolError}; -use prost::Message; +use dapi_grpc::Message; use dapi_grpc::platform::v0::get_data_contract_history_response::get_data_contract_history_response_v0::DataContractHistoryEntry; impl Platform { diff --git a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contracts/mod.rs b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contracts/mod.rs index e38af0ac8c..8fc0cf823b 100644 --- a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contracts/mod.rs +++ b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contracts/mod.rs @@ -5,10 +5,10 @@ use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_data_contracts_request::Version; use dapi_grpc::platform::v0::GetDataContractsRequest; +use dapi_grpc::Message; use dpp::check_validation_result_with_data; use dpp::validation::ValidationResult; use dpp::version::PlatformVersion; -use prost::Message; mod v0; diff --git a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contracts/v0/mod.rs b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contracts/v0/mod.rs index c3a2da2dc2..20c7bfbca0 100644 --- a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contracts/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contracts/v0/mod.rs @@ -8,12 +8,12 @@ use dapi_grpc::platform::v0::get_data_contracts_request::GetDataContractsRequest use dapi_grpc::platform::v0::get_data_contracts_response::DataContractEntry; use dapi_grpc::platform::v0::get_data_contracts_response::GetDataContractsResponseV0; use dapi_grpc::platform::v0::{get_data_contracts_response, GetDataContractsResponse, Proof}; +use dapi_grpc::Message; use dpp::platform_value::Bytes32; use dpp::serialization::PlatformSerializableWithPlatformVersion; use dpp::validation::ValidationResult; use dpp::version::PlatformVersion; use dpp::{check_validation_result_with_data, ProtocolError}; -use prost::Message; impl Platform { pub(super) fn query_data_contracts_v0( diff --git a/packages/rs-drive-abci/src/query/document_query/mod.rs b/packages/rs-drive-abci/src/query/document_query/mod.rs index 46587f5022..e9da1c417f 100644 --- a/packages/rs-drive-abci/src/query/document_query/mod.rs +++ b/packages/rs-drive-abci/src/query/document_query/mod.rs @@ -8,8 +8,8 @@ use dapi_grpc::platform::v0::GetDocumentsRequest; use dpp::check_validation_result_with_data; use dpp::validation::ValidationResult; +use dapi_grpc::Message; use dpp::version::PlatformVersion; -use prost::Message; mod v0; diff --git a/packages/rs-drive-abci/src/query/document_query/v0/mod.rs b/packages/rs-drive-abci/src/query/document_query/v0/mod.rs index 0f52f904e1..0f2b4c2b11 100644 --- a/packages/rs-drive-abci/src/query/document_query/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/document_query/v0/mod.rs @@ -8,6 +8,7 @@ use dapi_grpc::platform::v0::get_documents_request::get_documents_request_v0::St use dapi_grpc::platform::v0::get_documents_request::GetDocumentsRequestV0; use dapi_grpc::platform::v0::get_documents_response::GetDocumentsResponseV0; use dapi_grpc::platform::v0::{get_documents_response, GetDocumentsResponse, Proof}; +use dapi_grpc::Message; use dpp::check_validation_result_with_data; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::identifier::Identifier; @@ -16,7 +17,6 @@ use dpp::validation::ValidationResult; use dpp::version::PlatformVersion; use drive::error::query::QuerySyntaxError; use drive::query::DriveQuery; -use prost::Message; impl Platform { pub(super) fn query_documents_v0( diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/balance/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/balance/mod.rs index 6ed590f368..cd20f1fe62 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/balance/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/balance/mod.rs @@ -5,10 +5,10 @@ use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_identity_request::Version; use dapi_grpc::platform::v0::GetIdentityRequest; +use dapi_grpc::Message; use dpp::check_validation_result_with_data; use dpp::validation::ValidationResult; use dpp::version::PlatformVersion; -use prost::Message; mod v0; diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/balance/v0/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/balance/v0/mod.rs index e271ce29c5..1465f4e378 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/balance/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/balance/v0/mod.rs @@ -7,11 +7,11 @@ use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_identity_balance_response::GetIdentityBalanceResponseV0; use dapi_grpc::platform::v0::get_identity_request::GetIdentityRequestV0; use dapi_grpc::platform::v0::{get_identity_balance_response, GetIdentityBalanceResponse, Proof}; +use dapi_grpc::Message; use dpp::check_validation_result_with_data; use dpp::identifier::Identifier; use dpp::validation::ValidationResult; use dpp::version::PlatformVersion; -use prost::Message; impl Platform { pub(super) fn query_balance_v0( diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/balance_and_revision/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/balance_and_revision/mod.rs index 2f82f7b6e2..65f258eb2e 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/balance_and_revision/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/balance_and_revision/mod.rs @@ -5,10 +5,10 @@ use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_identity_request::Version; use dapi_grpc::platform::v0::GetIdentityRequest; +use dapi_grpc::Message; use dpp::check_validation_result_with_data; use dpp::validation::ValidationResult; use dpp::version::PlatformVersion; -use prost::Message; mod v0; diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/balance_and_revision/v0/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/balance_and_revision/v0/mod.rs index 2488a82fc2..32c0c21383 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/balance_and_revision/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/balance_and_revision/v0/mod.rs @@ -13,7 +13,7 @@ use dpp::check_validation_result_with_data; use dpp::identifier::Identifier; use dpp::validation::ValidationResult; use dpp::version::PlatformVersion; -use prost::Message; +use dapi_grpc::Message; use dapi_grpc::platform::v0::get_identity_balance_and_revision_response::get_identity_balance_and_revision_response_v0::BalanceAndRevision; use dapi_grpc::platform::v0::get_identity_request::GetIdentityRequestV0; diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identities/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identities/mod.rs index 9577c9986e..1e0febb697 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/identities/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identities/mod.rs @@ -5,10 +5,10 @@ use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_identities_request::Version; use dapi_grpc::platform::v0::GetIdentitiesRequest; +use dapi_grpc::Message; use dpp::check_validation_result_with_data; use dpp::validation::ValidationResult; use dpp::version::PlatformVersion; -use prost::Message; mod v0; diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identities/v0/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identities/v0/mod.rs index 4ea7ad8fea..c6e250452b 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/identities/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identities/v0/mod.rs @@ -7,12 +7,12 @@ use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_identities_request::GetIdentitiesRequestV0; use dapi_grpc::platform::v0::get_identities_response::{GetIdentitiesResponseV0, IdentityEntry}; use dapi_grpc::platform::v0::{get_identities_response, GetIdentitiesResponse, Proof}; +use dapi_grpc::Message; use dpp::platform_value::Bytes32; use dpp::serialization::PlatformSerializable; use dpp::validation::ValidationResult; use dpp::version::PlatformVersion; use dpp::{check_validation_result_with_data, ProtocolError}; -use prost::Message; impl Platform { pub(super) fn query_identities_v0( diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identities_by_public_key_hashes/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identities_by_public_key_hashes/mod.rs index c28a84220c..a5be0292b7 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/identities_by_public_key_hashes/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identities_by_public_key_hashes/mod.rs @@ -5,10 +5,10 @@ use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_identities_by_public_key_hashes_request::Version; use dapi_grpc::platform::v0::GetIdentitiesByPublicKeyHashesRequest; +use dapi_grpc::Message; use dpp::check_validation_result_with_data; use dpp::validation::ValidationResult; use dpp::version::PlatformVersion; -use prost::Message; mod v0; diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identities_by_public_key_hashes/v0/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identities_by_public_key_hashes/v0/mod.rs index d6ed8f5b99..b1fa2b20b9 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/identities_by_public_key_hashes/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identities_by_public_key_hashes/v0/mod.rs @@ -11,12 +11,12 @@ use dapi_grpc::platform::v0::get_identities_by_public_key_hashes_response::{ use dapi_grpc::platform::v0::{ get_identities_by_public_key_hashes_response, GetIdentitiesByPublicKeyHashesResponse, Proof, }; +use dapi_grpc::Message; use dpp::platform_value::Bytes20; use dpp::serialization::PlatformSerializable; use dpp::validation::ValidationResult; use dpp::version::PlatformVersion; use dpp::{check_validation_result_with_data, ProtocolError}; -use prost::Message; impl Platform { pub(super) fn query_identities_by_public_key_hashes_v0( diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identity/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identity/mod.rs index cd465ff771..c1364cabfa 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/identity/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identity/mod.rs @@ -5,10 +5,10 @@ use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_identity_request::Version; use dapi_grpc::platform::v0::GetIdentityRequest; +use dapi_grpc::Message; use dpp::check_validation_result_with_data; use dpp::validation::ValidationResult; use dpp::version::PlatformVersion; -use prost::Message; mod v0; diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identity/v0/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identity/v0/mod.rs index 1fdc04da05..57f6babe39 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/identity/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identity/v0/mod.rs @@ -7,12 +7,12 @@ use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_identity_request::GetIdentityRequestV0; use dapi_grpc::platform::v0::get_identity_response::GetIdentityResponseV0; use dapi_grpc::platform::v0::{get_identity_response, GetIdentityResponse, Proof}; +use dapi_grpc::Message; use dpp::check_validation_result_with_data; use dpp::identifier::Identifier; use dpp::serialization::PlatformSerializable; use dpp::validation::ValidationResult; use dpp::version::PlatformVersion; -use prost::Message; impl Platform { pub(super) fn query_identity_v0( diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identity_by_public_key_hash/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identity_by_public_key_hash/mod.rs index 009705453e..01ec853823 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/identity_by_public_key_hash/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identity_by_public_key_hash/mod.rs @@ -5,10 +5,10 @@ use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_identity_by_public_key_hash_request::Version; use dapi_grpc::platform::v0::GetIdentityByPublicKeyHashRequest; +use dapi_grpc::Message; use dpp::check_validation_result_with_data; use dpp::validation::ValidationResult; use dpp::version::PlatformVersion; -use prost::Message; mod v0; diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identity_by_public_key_hash/v0/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identity_by_public_key_hash/v0/mod.rs index f25c0a85f2..7177c71e60 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/identity_by_public_key_hash/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identity_by_public_key_hash/v0/mod.rs @@ -9,12 +9,12 @@ use dapi_grpc::platform::v0::get_identity_by_public_key_hash_response::GetIdenti use dapi_grpc::platform::v0::{ get_identity_by_public_key_hash_response, GetIdentityByPublicKeyHashResponse, Proof, }; +use dapi_grpc::Message; use dpp::check_validation_result_with_data; use dpp::platform_value::Bytes20; use dpp::serialization::PlatformSerializable; use dpp::validation::ValidationResult; use dpp::version::PlatformVersion; -use prost::Message; impl Platform { pub(super) fn query_identity_by_public_key_hash_v0( diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/keys/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/keys/mod.rs index fa87f7ba8a..b9c263f3dc 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/keys/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/keys/mod.rs @@ -5,10 +5,10 @@ use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_identity_keys_request::Version; use dapi_grpc::platform::v0::GetIdentityKeysRequest; +use dapi_grpc::Message; use dpp::check_validation_result_with_data; use dpp::validation::ValidationResult; use dpp::version::PlatformVersion; -use prost::Message; mod v0; diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/keys/v0/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/keys/v0/mod.rs index 374057d1e3..bd6bbee538 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/keys/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/keys/v0/mod.rs @@ -7,10 +7,10 @@ use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_identity_keys_request::GetIdentityKeysRequestV0; use dapi_grpc::platform::v0::get_identity_keys_response::GetIdentityKeysResponseV0; use dapi_grpc::platform::v0::{get_identity_keys_response, GetIdentityKeysResponse, Proof}; +use dapi_grpc::Message; use dpp::check_validation_result_with_data; use dpp::identifier::Identifier; use drive::error::query::QuerySyntaxError; -use prost::Message; use std::collections::BTreeMap; use dpp::identity::{KeyID, Purpose, SecurityLevel}; diff --git a/packages/rs-drive-abci/src/query/mod.rs b/packages/rs-drive-abci/src/query/mod.rs index 6bc247b75b..60ad703ed6 100644 --- a/packages/rs-drive-abci/src/query/mod.rs +++ b/packages/rs-drive-abci/src/query/mod.rs @@ -186,7 +186,7 @@ mod tests { use dapi_grpc::platform::v0::{ get_identity_request, get_identity_response, GetIdentityRequest, GetIdentityResponse, }; - use prost::Message; + use dapi_grpc::Message; const QUERY_PATH: &str = "/identity"; @@ -271,7 +271,7 @@ mod tests { get_identities_request, get_identities_response, GetIdentitiesRequest, GetIdentitiesResponse, }; - use prost::Message; + use dapi_grpc::Message; const QUERY_PATH: &str = "/identities"; @@ -375,7 +375,7 @@ mod tests { use dapi_grpc::platform::v0::{ get_identity_balance_response, GetIdentityBalanceRequest, GetIdentityBalanceResponse, }; - use prost::Message; + use dapi_grpc::Message; const QUERY_PATH: &str = "/identity/balance"; @@ -465,7 +465,7 @@ mod tests { get_identity_balance_and_revision_response, GetIdentityBalanceAndRevisionRequest, GetIdentityBalanceAndRevisionResponse, }; - use prost::Message; + use dapi_grpc::Message; const QUERY_PATH: &str = "/identity/balanceAndRevision"; @@ -551,8 +551,8 @@ mod tests { get_identity_keys_response, key_request_type::Request, AllKeys, GetIdentityKeysRequest, GetIdentityKeysResponse, KeyRequestType, SearchKey, SecurityLevelMap, }; + use dapi_grpc::Message; use drive::error::query::QuerySyntaxError; - use prost::Message; const QUERY_PATH: &str = "/identity/keys"; @@ -833,7 +833,7 @@ mod tests { use dapi_grpc::platform::v0::{ get_data_contract_response, GetDataContractRequest, GetDataContractResponse, }; - use prost::Message; + use dapi_grpc::Message; const QUERY_PATH: &str = "/dataContract"; @@ -920,7 +920,7 @@ mod tests { use dapi_grpc::platform::v0::{ get_data_contracts_response, GetDataContractsRequest, GetDataContractsResponse, }; - use prost::Message; + use dapi_grpc::Message; const QUERY_PATH: &str = "/dataContracts"; @@ -1020,7 +1020,7 @@ mod tests { get_data_contract_history_response, GetDataContractHistoryRequest, GetDataContractHistoryResponse, }; - use prost::Message; + use dapi_grpc::Message; const QUERY_PATH: &str = "/dataContractHistory"; @@ -1169,11 +1169,11 @@ mod tests { use dapi_grpc::platform::v0::get_documents_request::get_documents_request_v0::Start; use dapi_grpc::platform::v0::get_documents_request::{GetDocumentsRequestV0, Version}; + use dapi_grpc::Message; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::platform_value::string_encoding::Encoding; use dpp::tests::fixtures::get_data_contract_fixture; use drive::error::query::QuerySyntaxError; - use prost::Message; const QUERY_PATH: &str = "/documents"; @@ -1532,7 +1532,7 @@ mod tests { get_identity_by_public_key_hash_response, GetIdentityByPublicKeyHashRequest, GetIdentityByPublicKeyHashResponse, }; - use prost::Message; + use dapi_grpc::Message; const PATH: &str = "/identity/by-public-key-hash"; @@ -1620,7 +1620,7 @@ mod tests { get_identities_by_public_key_hashes_response, GetIdentitiesByPublicKeyHashesRequest, GetIdentitiesByPublicKeyHashesResponse, }; - use prost::Message; + use dapi_grpc::Message; const PATH: &str = "/identities/by-public-key-hash"; @@ -1712,7 +1712,7 @@ mod tests { use dapi_grpc::platform::v0::get_proofs_request::{GetProofsRequestV0, Version}; use dapi_grpc::platform::v0::{GetProofsRequest, GetProofsResponse}; use dapi_grpc::platform::VersionedGrpcResponse; - use prost::Message; + use dapi_grpc::Message; const PATH: &str = "/proofs"; @@ -1875,6 +1875,7 @@ mod tests { get_protocol_version_upgrade_state_response, GetProtocolVersionUpgradeStateRequest, GetProtocolVersionUpgradeStateResponse, }; + use dapi_grpc::Message; use drive::drive::grove_operations::BatchInsertApplyType; use drive::drive::object_size_info::PathKeyElementInfo; use drive::drive::protocol_upgrade::{ @@ -1884,7 +1885,6 @@ mod tests { use drive::grovedb::{Element, PathQuery, Query, QueryItem}; use drive::query::GroveDb; use integer_encoding::VarInt; - use prost::Message; use rand::rngs::StdRng; use rand::{Rng, SeedableRng}; use std::ops::RangeFull; @@ -2237,6 +2237,7 @@ mod tests { GetProtocolVersionUpgradeVoteStatusRequest, GetProtocolVersionUpgradeVoteStatusResponse, }; + use dapi_grpc::Message; use drive::drive::grove_operations::BatchInsertApplyType; use drive::drive::object_size_info::PathKeyElementInfo; use drive::drive::protocol_upgrade::{ @@ -2247,7 +2248,6 @@ mod tests { use drive::grovedb::{Element, PathQuery, Query, QueryItem, SizedQuery}; use drive::query::GroveDb; use integer_encoding::VarInt; - use prost::Message; use rand::rngs::StdRng; use rand::{Rng, SeedableRng}; @@ -2623,7 +2623,7 @@ mod tests { use dapi_grpc::platform::v0::{ get_epochs_info_response, GetEpochsInfoRequest, GetEpochsInfoResponse, }; - use prost::Message; + use dapi_grpc::Message; const PATH: &str = "/epochInfos"; diff --git a/packages/rs-drive-abci/src/query/proofs/mod.rs b/packages/rs-drive-abci/src/query/proofs/mod.rs index ca9ed6b063..b14a1b0654 100644 --- a/packages/rs-drive-abci/src/query/proofs/mod.rs +++ b/packages/rs-drive-abci/src/query/proofs/mod.rs @@ -5,10 +5,10 @@ use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_proofs_request::Version; use dapi_grpc::platform::v0::GetProofsRequest; +use dapi_grpc::Message; use dpp::check_validation_result_with_data; use dpp::validation::ValidationResult; use dpp::version::PlatformVersion; -use prost::Message; mod v0; diff --git a/packages/rs-drive-abci/src/query/proofs/v0/mod.rs b/packages/rs-drive-abci/src/query/proofs/v0/mod.rs index 584eac412e..c03403a8dd 100644 --- a/packages/rs-drive-abci/src/query/proofs/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/proofs/v0/mod.rs @@ -7,6 +7,7 @@ use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_proofs_request::GetProofsRequestV0; use dapi_grpc::platform::v0::get_proofs_response::GetProofsResponseV0; use dapi_grpc::platform::v0::{get_proofs_response, GetProofsResponse, Proof}; +use dapi_grpc::Message; use dpp::check_validation_result_with_data; use dpp::platform_value::Bytes32; use dpp::prelude::Identifier; @@ -14,7 +15,6 @@ use dpp::validation::ValidationResult; use dpp::version::PlatformVersion; use drive::drive::identity::{IdentityDriveQuery, IdentityProveRequestType}; use drive::query::SingleDocumentDriveQuery; -use prost::Message; impl Platform { pub(super) fn query_proofs_v0( diff --git a/packages/rs-drive-abci/src/query/system/epoch_infos/mod.rs b/packages/rs-drive-abci/src/query/system/epoch_infos/mod.rs index ac50348d9f..c9bc9b7e72 100644 --- a/packages/rs-drive-abci/src/query/system/epoch_infos/mod.rs +++ b/packages/rs-drive-abci/src/query/system/epoch_infos/mod.rs @@ -7,10 +7,10 @@ use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_epochs_info_request::Version; use dapi_grpc::platform::v0::GetEpochsInfoRequest; +use dapi_grpc::Message; use dpp::check_validation_result_with_data; use dpp::validation::ValidationResult; use dpp::version::PlatformVersion; -use prost::Message; impl Platform { /// Querying of version upgrade state diff --git a/packages/rs-drive-abci/src/query/system/epoch_infos/v0/mod.rs b/packages/rs-drive-abci/src/query/system/epoch_infos/v0/mod.rs index a4961af007..8ef742d5ee 100644 --- a/packages/rs-drive-abci/src/query/system/epoch_infos/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/system/epoch_infos/v0/mod.rs @@ -11,9 +11,9 @@ use dapi_grpc::platform::v0::{get_epochs_info_response, GetEpochsInfoResponse, P use dpp::block::extended_epoch_info::v0::ExtendedEpochInfoV0Getters; use dpp::check_validation_result_with_data; +use dapi_grpc::Message; use dpp::validation::ValidationResult; use dpp::version::PlatformVersion; -use prost::Message; impl Platform { pub(super) fn query_epoch_infos_v0( diff --git a/packages/rs-drive-abci/src/query/system/version_upgrade_state/mod.rs b/packages/rs-drive-abci/src/query/system/version_upgrade_state/mod.rs index 7f6c18414d..112fbc98c6 100644 --- a/packages/rs-drive-abci/src/query/system/version_upgrade_state/mod.rs +++ b/packages/rs-drive-abci/src/query/system/version_upgrade_state/mod.rs @@ -7,10 +7,10 @@ use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_protocol_version_upgrade_state_request::Version; use dapi_grpc::platform::v0::GetProtocolVersionUpgradeStateRequest; +use dapi_grpc::Message; use dpp::check_validation_result_with_data; use dpp::validation::ValidationResult; use dpp::version::PlatformVersion; -use prost::Message; impl Platform { /// Querying of version upgrade state diff --git a/packages/rs-drive-abci/src/query/system/version_upgrade_state/v0/mod.rs b/packages/rs-drive-abci/src/query/system/version_upgrade_state/v0/mod.rs index 44a2cbc283..27a751d246 100644 --- a/packages/rs-drive-abci/src/query/system/version_upgrade_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/system/version_upgrade_state/v0/mod.rs @@ -10,7 +10,7 @@ use dpp::check_validation_result_with_data; use dpp::validation::ValidationResult; use dpp::version::PlatformVersion; -use prost::Message; +use dapi_grpc::Message; use dapi_grpc::platform::v0::get_protocol_version_upgrade_state_request::GetProtocolVersionUpgradeStateRequestV0; use dapi_grpc::platform::v0::get_protocol_version_upgrade_state_response::get_protocol_version_upgrade_state_response_v0::{VersionEntry, Versions}; use dapi_grpc::platform::v0::get_protocol_version_upgrade_state_response::GetProtocolVersionUpgradeStateResponseV0; diff --git a/packages/rs-drive-abci/src/query/system/version_upgrade_vote_status/mod.rs b/packages/rs-drive-abci/src/query/system/version_upgrade_vote_status/mod.rs index 92fb1b1c2a..0d3ffa4e63 100644 --- a/packages/rs-drive-abci/src/query/system/version_upgrade_vote_status/mod.rs +++ b/packages/rs-drive-abci/src/query/system/version_upgrade_vote_status/mod.rs @@ -7,10 +7,10 @@ use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_protocol_version_upgrade_vote_status_request::Version; use dapi_grpc::platform::v0::GetProtocolVersionUpgradeVoteStatusRequest; +use dapi_grpc::Message; use dpp::check_validation_result_with_data; use dpp::validation::ValidationResult; use dpp::version::PlatformVersion; -use prost::Message; impl Platform { /// Querying of version upgrade vote status diff --git a/packages/rs-drive-abci/src/query/system/version_upgrade_vote_status/v0/mod.rs b/packages/rs-drive-abci/src/query/system/version_upgrade_vote_status/v0/mod.rs index 661a266011..f60e32785a 100644 --- a/packages/rs-drive-abci/src/query/system/version_upgrade_vote_status/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/system/version_upgrade_vote_status/v0/mod.rs @@ -11,7 +11,7 @@ use dpp::check_validation_result_with_data; use dpp::validation::ValidationResult; use dpp::version::PlatformVersion; -use prost::Message; +use dapi_grpc::Message; use dapi_grpc::platform::v0::get_protocol_version_upgrade_vote_status_request::GetProtocolVersionUpgradeVoteStatusRequestV0; use dapi_grpc::platform::v0::get_protocol_version_upgrade_vote_status_response::get_protocol_version_upgrade_vote_status_response_v0::{VersionSignal, VersionSignals}; use dapi_grpc::platform::v0::get_protocol_version_upgrade_vote_status_response::GetProtocolVersionUpgradeVoteStatusResponseV0; diff --git a/packages/rs-drive-abci/src/query/v0/mod.rs b/packages/rs-drive-abci/src/query/v0/mod.rs index 91b4aa84b8..28ca0fea26 100644 --- a/packages/rs-drive-abci/src/query/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/v0/mod.rs @@ -72,6 +72,7 @@ mod test { use dapi_grpc::platform::v0::get_data_contract_history_response::{ get_data_contract_history_response_v0, GetDataContractHistoryResponseV0, }; + use dapi_grpc::Message; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::data_contract::schema::DataContractSchemaMethodsV0; use dpp::data_contract::DataContract; @@ -81,7 +82,6 @@ mod test { use dpp::validation::ValidationResult; use dpp::version::PlatformVersion; use drive::drive::Drive; - use prost::Message; fn default_request_v0() -> GetDataContractHistoryRequestV0 { GetDataContractHistoryRequestV0 { diff --git a/packages/rs-drive-abci/tests/strategy_tests/query.rs b/packages/rs-drive-abci/tests/strategy_tests/query.rs index aa6d0cb822..cc4bc029c3 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/query.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/query.rs @@ -5,6 +5,7 @@ use dapi_grpc::platform::v0::{ get_identities_by_public_key_hashes_request, get_identities_by_public_key_hashes_response, GetIdentitiesByPublicKeyHashesRequest, GetIdentitiesByPublicKeyHashesResponse, Proof, }; +use dapi_grpc::Message; use dashcore_rpc::dashcore_rpc_json::QuorumType; use dpp::identity::accessors::IdentityGettersV0; use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; @@ -17,7 +18,6 @@ use drive::drive::verify::RootHash; use drive::drive::Drive; use drive_abci::abci::{AbciApplication, AbciError}; use drive_abci::rpc::core::MockCoreRPCLike; -use prost::Message; use rand::prelude::SliceRandom; use rand::rngs::StdRng; use rand::{Rng, SeedableRng}; diff --git a/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs b/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs index ac834290a9..bc4efa64c7 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs @@ -7,6 +7,7 @@ use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::document::Document; use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; +use dapi_grpc::Message; use dpp::state_transition::StateTransition; use dpp::version::PlatformVersion; use drive::drive::identity::key::fetch::IdentityKeysRequest; @@ -19,13 +20,12 @@ use drive_abci::execution::validation::state_transition::transformer::StateTrans use drive_abci::platform_types::platform::PlatformRef; use drive_abci::platform_types::platform_state::v0::PlatformStateV0Methods; use drive_abci::rpc::core::MockCoreRPCLike; -use prost::Message; use tenderdash_abci::proto::abci::ExecTxResult; use dpp::state_transition::documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; -use drive::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::DocumentFromCreateTransition; -use drive::state_transition_action::document::documents_batch::document_transition::document_replace_transition_action::DocumentFromReplaceTransition; +use drive::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::DocumentFromCreateTransitionAction; +use drive::state_transition_action::document::documents_batch::document_transition::document_replace_transition_action::DocumentFromReplaceTransitionAction; use drive_abci::execution::types::state_transition_execution_context::StateTransitionExecutionContext; use platform_version::DefaultForPlatformVersion; @@ -325,7 +325,7 @@ pub(crate) fn verify_state_transitions_were_or_were_not_executed( // ); assert_eq!( document, - Document::try_from_create_transition( + Document::try_from_create_transition_action( creation_action, documents_batch_transition.owner_id(), platform_version, @@ -344,7 +344,7 @@ pub(crate) fn verify_state_transitions_were_or_were_not_executed( if let Some(document) = document { assert_eq!( document, - Document::try_from_replace_transition( + Document::try_from_replace_transition_action( replace_action, documents_batch_transition.owner_id(), platform_version, @@ -358,7 +358,7 @@ pub(crate) fn verify_state_transitions_were_or_were_not_executed( if let Some(document) = document { assert_ne!( document, - Document::try_from_replace_transition( + Document::try_from_replace_transition_action( replace_action, documents_batch_transition.owner_id(), platform_version, @@ -578,6 +578,8 @@ pub(crate) fn verify_state_transitions_were_or_were_not_executed( None, ), false, + false, + false, platform_version, ) .expect("expected to verify identity keys"); diff --git a/packages/rs-drive-proof-verifier/Cargo.toml b/packages/rs-drive-proof-verifier/Cargo.toml index 264c3fab22..43034e9a01 100644 --- a/packages/rs-drive-proof-verifier/Cargo.toml +++ b/packages/rs-drive-proof-verifier/Cargo.toml @@ -26,5 +26,4 @@ serde = { version = "1.0.171", default-features = false, optional = true } serde_json = { version = "1.0.103", features = [ "preserve_order", ], optional = true } -lazy_static = { version = "1.4.0" } hex = { version = "0.4.3" } diff --git a/packages/rs-drive-proof-verifier/src/error.rs b/packages/rs-drive-proof-verifier/src/error.rs index a76ea2e788..300fd2c6e9 100644 --- a/packages/rs-drive-proof-verifier/src/error.rs +++ b/packages/rs-drive-proof-verifier/src/error.rs @@ -55,10 +55,6 @@ pub enum Error { #[error("error during signature verification: {error}")] SignatureVerificationError { error: String }, - /// Provided quorum is invalid - #[error("invalid quorum: {error}")] - InvalidQuorum { error: String }, - /// Signature format is invalid #[error("invalid signature format: {error}")] InvalidSignatureFormat { error: String }, @@ -78,6 +74,34 @@ pub enum Error { /// Invalid version of object in response #[error("invalid version of message")] InvalidVersion(#[from] dpp::version::PlatformVersionError), + + /// Context provider is not set + #[error("context provider is not set")] + ContextProviderNotSet, + + /// Context provider error + #[error("context provider error: {0}")] + ContextProviderError(#[from] ContextProviderError), +} + +/// Errors returned by the context provider +#[derive(Debug, thiserror::Error)] +pub enum ContextProviderError { + /// Generic Context provider error + #[error("Context provider error: {0}")] + Generic(String), + + /// Configuration error + #[error("Configuration error: {0}")] + Config(String), + + /// Data contract is invalid or not found, or some error occurred during data contract retrieval + #[error("cannot get data contract: {0}")] + InvalidDataContract(String), + + /// Provided quorum is invalid + #[error("invalid quorum: {0}")] + InvalidQuorum(String), } impl From for Error { diff --git a/packages/rs-drive-proof-verifier/src/lib.rs b/packages/rs-drive-proof-verifier/src/lib.rs index 8b2a916b3d..ffd35ac5a1 100644 --- a/packages/rs-drive-proof-verifier/src/lib.rs +++ b/packages/rs-drive-proof-verifier/src/lib.rs @@ -2,7 +2,7 @@ #![warn(missing_docs)] /// Errors that can occur during proof verification -mod error; +pub mod error; /// Implementation of proof verification mod proof; mod provider; @@ -10,6 +10,6 @@ pub mod types; mod verify; pub use error::Error; pub use proof::FromProof; +pub use provider::ContextProvider; #[cfg(feature = "mocks")] -pub use provider::MockQuorumInfoProvider; -pub use provider::QuorumInfoProvider; +pub use provider::MockContextProvider; diff --git a/packages/rs-drive-proof-verifier/src/proof.rs b/packages/rs-drive-proof-verifier/src/proof.rs index c26547e1d3..8cc2ab028d 100644 --- a/packages/rs-drive-proof-verifier/src/proof.rs +++ b/packages/rs-drive-proof-verifier/src/proof.rs @@ -1,8 +1,4 @@ -use std::array::TryFromSliceError; -use std::collections::BTreeMap; -use std::num::TryFromIntError; - -use crate::{types::*, Error, QuorumInfoProvider}; +use crate::{types::*, ContextProvider, Error}; use dapi_grpc::platform::v0::get_protocol_version_upgrade_vote_status_request::{ self, GetProtocolVersionUpgradeVoteStatusRequestV0, }; @@ -25,20 +21,24 @@ use dpp::dashcore::hashes::Hash; use dpp::dashcore::ProTxHash; use dpp::document::{Document, DocumentV0Getters}; use dpp::prelude::{DataContract, Identifier, Identity}; +use dpp::serialization::PlatformDeserializable; +use dpp::state_transition::proof_result::StateTransitionProofResult; +use dpp::state_transition::StateTransition; use dpp::version::PlatformVersion; use drive::drive::identity::key::fetch::{ IdentityKeysRequest, KeyKindRequestType, KeyRequestType, PurposeU8, SecurityLevelU8, }; use drive::drive::Drive; +use drive::error::proof::ProofError; use drive::query::DriveQuery; +use std::array::TryFromSliceError; +use std::collections::BTreeMap; +use std::num::TryFromIntError; +use std::sync::Arc; use crate::verify::verify_tenderdash_proof; -lazy_static::lazy_static! { - pub static ref PLATFORM_VERSION: PlatformVersion = PlatformVersion::latest().to_owned(); -} - /// Parse and verify the received proof and retrieve the requested object, if any. /// /// Use [`FromProof::maybe_from_proof()`] or [`FromProof::from_proof()`] to parse and verify proofs received @@ -63,7 +63,7 @@ pub trait FromProof { /// /// * `request`: The request sent to the server. /// * `response`: The response received from the server. - /// * `provider`: A callback implementing [QuorumInfoProvider] that provides quorum details required to verify the proof. + /// * `provider`: A callback implementing [ContextProvider] that provides quorum details required to verify the proof. /// /// # Returns /// @@ -75,7 +75,7 @@ pub trait FromProof { request: I, response: O, platform_version: &PlatformVersion, - provider: &'a dyn QuorumInfoProvider, + provider: &'a dyn ContextProvider, ) -> Result, Error> where Self: Sized + 'a; @@ -91,7 +91,7 @@ pub trait FromProof { /// /// * `request`: The request sent to the server. /// * `response`: The response received from the server. - /// * `provider`: A callback implementing [QuorumInfoProvider] that provides quorum details required to verify the proof. + /// * `provider`: A callback implementing [ContextProvider] that provides quorum details required to verify the proof. /// /// # Returns /// @@ -102,7 +102,7 @@ pub trait FromProof { request: I, response: O, platform_version: &PlatformVersion, - provider: &'a dyn QuorumInfoProvider, + provider: &'a dyn ContextProvider, ) -> Result where Self: Sized + 'a, @@ -119,8 +119,8 @@ impl FromProof for Identity { fn maybe_from_proof<'a, I: Into, O: Into>( request: I, response: O, - _platform_version: &PlatformVersion, - provider: &'a dyn QuorumInfoProvider, + platform_version: &PlatformVersion, + provider: &'a dyn ContextProvider, ) -> Result, Error> where Identity: Sized + 'a, @@ -146,7 +146,7 @@ impl FromProof for Identity { &proof.grovedb_proof, false, id.into_buffer(), - &PLATFORM_VERSION, + platform_version, ) .map_err(|e| Error::DriveError { error: e.to_string(), @@ -166,9 +166,9 @@ impl FromProof for Identity { fn maybe_from_proof<'a, I: Into, O: Into>( request: I, response: O, - _platform_version: &PlatformVersion, + platform_version: &PlatformVersion, - provider: &'a dyn QuorumInfoProvider, + provider: &'a dyn ContextProvider, ) -> Result, Error> where Identity: 'a, @@ -196,7 +196,7 @@ impl FromProof for Identity { let (root_hash, maybe_identity) = Drive::verify_full_identity_by_public_key_hash( &proof.grovedb_proof, public_key_hash, - &PLATFORM_VERSION, + platform_version, ) .map_err(|e| Error::DriveError { error: e.to_string(), @@ -215,9 +215,9 @@ impl FromProof for IdentityPublicKeys { fn maybe_from_proof<'a, I: Into, O: Into>( request: I, response: O, - _platform_version: &PlatformVersion, + platform_version: &PlatformVersion, - provider: &'a dyn QuorumInfoProvider, + provider: &'a dyn ContextProvider, ) -> Result, Error> where IdentityPublicKeys: 'a, @@ -281,7 +281,9 @@ impl FromProof for IdentityPublicKeys { &proof.grovedb_proof, key_request, false, - &PLATFORM_VERSION, + false, + false, + platform_version, ) .map_err(|e| Error::DriveError { error: e.to_string(), @@ -338,7 +340,7 @@ fn parse_key_request_type(request: &Option) -> Result for IdentityBalance { fn maybe_from_proof<'a, I: Into, O: Into>( request: I, response: O, - _platform_version: &PlatformVersion, + platform_version: &PlatformVersion, - provider: &'a dyn QuorumInfoProvider, + provider: &'a dyn ContextProvider, ) -> Result, Error> where IdentityBalance: 'a, @@ -407,7 +409,7 @@ impl FromProof for IdentityBalance { &proof.grovedb_proof, id.into_buffer(), false, - &PLATFORM_VERSION, + platform_version, ) .map_err(|e| Error::DriveError { error: e.to_string(), @@ -428,7 +430,7 @@ impl FromProof for IdentityBalan response: O, _platform_version: &PlatformVersion, - provider: &'a dyn QuorumInfoProvider, + provider: &'a dyn ContextProvider, ) -> Result, Error> where IdentityBalanceAndRevision: 'a, @@ -473,9 +475,9 @@ impl FromProof for DataContract { fn maybe_from_proof<'a, I: Into, O: Into>( request: I, response: O, - _platform_version: &PlatformVersion, + platform_version: &PlatformVersion, - provider: &'a dyn QuorumInfoProvider, + provider: &'a dyn ContextProvider, ) -> Result, Error> where DataContract: 'a, @@ -503,7 +505,7 @@ impl FromProof for DataContract { false, false, id.into_buffer(), - &PLATFORM_VERSION, + platform_version, ) .map_err(|e| Error::DriveError { error: e.to_string(), @@ -522,9 +524,9 @@ impl FromProof for DataContracts { fn maybe_from_proof<'a, I: Into, O: Into>( request: I, response: O, - _platform_version: &PlatformVersion, + platform_version: &PlatformVersion, - provider: &'a dyn QuorumInfoProvider, + provider: &'a dyn ContextProvider, ) -> Result, Error> where DataContracts: 'a, @@ -557,7 +559,7 @@ impl FromProof for DataContracts { &proof.grovedb_proof, false, ids.as_slice(), - &PLATFORM_VERSION, + platform_version, ) .map_err(|e| Error::DriveError { error: e.to_string(), @@ -595,9 +597,9 @@ impl FromProof for DataContractHistory fn maybe_from_proof<'a, I: Into, O: Into>( request: I, response: O, - _platform_version: &PlatformVersion, + platform_version: &PlatformVersion, - provider: &'a dyn QuorumInfoProvider, + provider: &'a dyn ContextProvider, ) -> Result, Error> where Self: Sized + 'a, @@ -629,7 +631,7 @@ impl FromProof for DataContractHistory start_at_ms, limit, offset, - &PLATFORM_VERSION, + platform_version, ) .map_err(|e| Error::DriveError { error: e.to_string(), @@ -641,6 +643,55 @@ impl FromProof for DataContractHistory } } +impl FromProof for StateTransitionProofResult { + type Request = platform::BroadcastStateTransitionRequest; + type Response = platform::WaitForStateTransitionResultResponse; + + fn maybe_from_proof<'a, I: Into, O: Into>( + request: I, + response: O, + platform_version: &PlatformVersion, + provider: &'a dyn ContextProvider, + ) -> Result, Error> + where + Self: Sized + 'a, + { + let request: Self::Request = request.into(); + let response: Self::Response = response.into(); + + // Parse response to read proof and metadata + let proof = response.proof().or(Err(Error::NoProofInResult))?; + + let state_transition = StateTransition::deserialize_from_bytes(&request.state_transition) + .map_err(|e| Error::ProtocolError { + error: e.to_string(), + })?; + + let mtd = response.metadata().or(Err(Error::EmptyResponseMetadata))?; + + let known_contracts_provider_fn = + |id: &Identifier| -> Result>, drive::error::Error> { + provider.get_data_contract(id).map_err(|e| { + drive::error::Error::Proof(ProofError::ErrorRetrievingContract(e.to_string())) + }) + }; + + let (root_hash, result) = Drive::verify_state_transition_was_executed_with_proof( + &state_transition, + &proof.grovedb_proof, + &known_contracts_provider_fn, + platform_version, + ) + .map_err(|e| Error::DriveError { + error: e.to_string(), + })?; + + verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + + Ok(Some(result)) + } +} + impl FromProof for ExtendedEpochInfo { type Request = platform::GetEpochsInfoRequest; type Response = platform::GetEpochsInfoResponse; @@ -649,7 +700,7 @@ impl FromProof for ExtendedEpochInfo { request: I, response: O, platform_version: &PlatformVersion, - provider: &'a dyn QuorumInfoProvider, + provider: &'a dyn ContextProvider, ) -> Result, Error> where Self: Sized + 'a, @@ -679,7 +730,7 @@ impl FromProof for ExtendedEpochInfos { request: I, response: O, platform_version: &PlatformVersion, - provider: &'a dyn QuorumInfoProvider, + provider: &'a dyn ContextProvider, ) -> Result, Error> where Self: Sized + 'a, @@ -754,7 +805,7 @@ impl FromProof for ProtocolVersionUpgrade _request: I, response: O, platform_version: &PlatformVersion, - provider: &'a dyn QuorumInfoProvider, + provider: &'a dyn ContextProvider, ) -> Result, Error> where Self: Sized + 'a, @@ -787,7 +838,7 @@ impl FromProof for MasternodeProtoco request: I, response: O, platform_version: &PlatformVersion, - provider: &'a dyn QuorumInfoProvider, + provider: &'a dyn ContextProvider, ) -> Result, Error> where Self: Sized + 'a, @@ -848,7 +899,6 @@ impl FromProof for MasternodeProtoco Ok(Some(votes)) } } - // #[cfg_attr(feature = "mocks", mockall::automock)] impl<'dq, Q> FromProof for Documents where @@ -861,9 +911,9 @@ where fn maybe_from_proof<'a, I: Into, O: Into>( request: I, response: O, - _platform_version: &PlatformVersion, + platform_version: &PlatformVersion, - provider: &'a dyn QuorumInfoProvider, + provider: &'a dyn ContextProvider, ) -> Result, Error> where Self: 'a, @@ -885,7 +935,7 @@ where let mtd = response.metadata().or(Err(Error::EmptyResponseMetadata))?; let (root_hash, documents) = request - .verify_proof(&proof.grovedb_proof, &PLATFORM_VERSION) + .verify_proof(&proof.grovedb_proof, platform_version) .map_err(|e| Error::DriveError { error: e.to_string(), })?; diff --git a/packages/rs-drive-proof-verifier/src/provider.rs b/packages/rs-drive-proof-verifier/src/provider.rs index 259b01e54e..eb8858c5f1 100644 --- a/packages/rs-drive-proof-verifier/src/provider.rs +++ b/packages/rs-drive-proof-verifier/src/provider.rs @@ -1,13 +1,21 @@ +use std::{ops::Deref, sync::Arc}; + +use crate::error::ContextProviderError; +use dpp::prelude::{DataContract, Identifier}; use hex::ToHex; -/// `QuorumInfoProvider` trait provides an interface to fetch quorum related information, required to verify the proof. +/// Interface between the Sdk and state of the application. +/// +/// ContextProvider is called by the [FromProof](crate::FromProof) trait (and similar) to get information about +/// the application and/or network state, including data contracts that might be cached by the application or +/// quorum public keys. /// -/// Developers should implement this trait to provide required quorum details to [FromProof](crate::FromProof) -/// implementations. +/// Developers using the Dash Platform SDK should implement this trait to provide required information +/// to the Sdk, especially implementation of [FromProof](crate::FromProof) trait. /// -/// It defines a single method [`get_quorum_public_key()`](QuorumInfoProvider::get_quorum_public_key()) -/// which retrieves the public key of a given quorum. -pub trait QuorumInfoProvider: Send + Sync { +/// A ContextProvider should be thread-safe and manage timeouts and other concurrency-related issues internally, +/// as the [FromProof](crate::FromProof) implementations can block on ContextProvider calls. +pub trait ContextProvider: Send + Sync { /// Fetches the public key for a specified quorum. /// /// # Arguments @@ -25,24 +33,84 @@ pub trait QuorumInfoProvider: Send + Sync { quorum_type: u32, quorum_hash: [u8; 32], // quorum hash is 32 bytes core_chain_locked_height: u32, - ) -> Result<[u8; 48], crate::Error>; // public key is 48 bytes + ) -> Result<[u8; 48], ContextProviderError>; // public key is 48 bytes + + /// Fetches the data contract for a specified data contract ID. + /// This method is used by [FromProof](crate::FromProof) implementations to fetch data contracts + /// referenced in proofs. + /// + /// # Arguments + /// + /// * `data_contract_id`: The ID of the data contract to fetch. + /// + /// # Returns + /// + /// * `Ok(Option>)`: On success, returns the data contract if it exists, or `None` if it does not. + /// We use Arc to avoid copying the data contract. + /// * `Err(Error)`: On failure, returns an error indicating why the operation failed. + fn get_data_contract( + &self, + id: &Identifier, + ) -> Result>, ContextProviderError>; +} + +impl + Send + Sync> ContextProvider for C { + fn get_quorum_public_key( + &self, + quorum_type: u32, + quorum_hash: [u8; 32], + core_chain_locked_height: u32, + ) -> Result<[u8; 48], ContextProviderError> { + self.as_ref() + .get_quorum_public_key(quorum_type, quorum_hash, core_chain_locked_height) + } + + fn get_data_contract( + &self, + id: &Identifier, + ) -> Result>, ContextProviderError> { + self.as_ref().get_data_contract(id) + } +} + +impl<'a, T: ContextProvider + 'a> ContextProvider for std::sync::Mutex +where + Self: Sync + Send, +{ + fn get_data_contract( + &self, + id: &Identifier, + ) -> Result>, ContextProviderError> { + let lock = self.lock().expect("lock poisoned"); + lock.get_data_contract(id) + } + fn get_quorum_public_key( + &self, + quorum_type: u32, + quorum_hash: [u8; 32], // quorum hash is 32 bytes + core_chain_locked_height: u32, + ) -> Result<[u8; 48], ContextProviderError> { + let lock = self.lock().expect("lock poisoned"); + lock.get_quorum_public_key(quorum_type, quorum_hash, core_chain_locked_height) + } } -/// Mock QuorumInfoProvider that can read quorum keys from files. +/// Mock ContextProvider that can read quorum keys from files. /// /// Use `rs_sdk::SdkBuilder::with_dump_dir()` to generate quorum keys files. #[cfg(feature = "mocks")] -pub struct MockQuorumInfoProvider { +#[derive(Debug)] +pub struct MockContextProvider { quorum_keys_dir: Option, } #[cfg(feature = "mocks")] -impl MockQuorumInfoProvider { - /// Create a new instance of [MockQuorumInfoProvider]. +impl MockContextProvider { + /// Create a new instance of [MockContextProvider]. /// /// This instance can be used to read quorum keys from files. /// You need to configure quorum keys dir using - /// [MockQuorumInfoProvider::quorum_keys_dir()](MockQuorumInfoProvider::quorum_keys_dir()) + /// [MockContextProvider::quorum_keys_dir()](MockContextProvider::quorum_keys_dir()) /// before using this instance. /// /// In future, we may add more methods to this struct to allow setting expectations. @@ -60,30 +128,26 @@ impl MockQuorumInfoProvider { } } -impl Default for MockQuorumInfoProvider { +impl Default for MockContextProvider { fn default() -> Self { Self::new() } } #[cfg(feature = "mocks")] -impl QuorumInfoProvider for MockQuorumInfoProvider { - /// Mock implementation of [QuorumInfoProvider] that returns keys from files saved on disk. +impl ContextProvider for MockContextProvider { + /// Mock implementation of [ContextProvider] that returns keys from files saved on disk. /// - /// Use `rs_sdk::SdkBuilder::with_dump_dir()` to generate quorum keys files. + /// Use `rs_sdk::SdkBuilder::with_dump_dir()` to generate quorum keys files. fn get_quorum_public_key( &self, quorum_type: u32, quorum_hash: [u8; 32], _core_chain_locked_height: u32, - ) -> Result<[u8; 48], crate::Error> { + ) -> Result<[u8; 48], ContextProviderError> { let path = match &self.quorum_keys_dir { Some(p) => p, - None => { - return Err(crate::Error::InvalidQuorum { - error: "dump dir not set".to_string(), - }) - } + None => return Err(ContextProviderError::Config("dump dir not set".to_string())), }; let file = path.join(format!( @@ -95,13 +159,11 @@ impl QuorumInfoProvider for MockQuorumInfoProvider { let f = match std::fs::File::open(&file) { Ok(f) => f, Err(e) => { - return Err(crate::Error::InvalidQuorum { - error: format!( - "cannot load quorum key file {}: {}", - file.to_string_lossy(), - e - ), - }) + return Err(ContextProviderError::InvalidQuorum(format!( + "cannot load quorum key file {}: {}", + file.to_string_lossy(), + e + ))) } }; @@ -109,4 +171,18 @@ impl QuorumInfoProvider for MockQuorumInfoProvider { Ok(key.try_into().expect("quorum key format mismatch")) } + + fn get_data_contract( + &self, + _data_contract_id: &Identifier, + ) -> Result>, ContextProviderError> { + todo!("not implemented yet"); + } +} +// the trait `std::convert::AsRef<(dyn drive_proof_verifier::ContextProvider + 'static)>` +// is not implemented for `std::sync::Arc>` +impl<'a, T: ContextProvider + 'a> AsRef for Arc { + fn as_ref(&self) -> &(dyn ContextProvider + 'a) { + self.deref() + } } diff --git a/packages/rs-drive-proof-verifier/src/types.rs b/packages/rs-drive-proof-verifier/src/types.rs index 1aa4a74453..6b4f99adc3 100644 --- a/packages/rs-drive-proof-verifier/src/types.rs +++ b/packages/rs-drive-proof-verifier/src/types.rs @@ -7,6 +7,7 @@ use std::collections::BTreeMap; +pub use dpp::version::ProtocolVersionVoteCount; use dpp::{ block::{epoch::EpochIndex, extended_epoch_info::ExtendedEpochInfo}, dashcore::ProTxHash, @@ -58,12 +59,6 @@ pub type Documents = RetrievedObjects; /// Collection of epoch information pub type ExtendedEpochInfos = RetrievedObjects; -/// Number of votes for a protocol version upgrade. -/// -/// Number of votes for a protocol version upgrade, returned by [ProtocolVersionVoteCount::fetch_many()]. -/// See [ProtocolVersionUpgrades]. -pub type ProtocolVersionVoteCount = u64; - /// Results of protocol version upgrade voting. /// /// Information about the protocol version upgrade states and number of received votes, indexed by protocol version. diff --git a/packages/rs-drive-proof-verifier/src/verify.rs b/packages/rs-drive-proof-verifier/src/verify.rs index 534e5056ff..77b3f8d657 100644 --- a/packages/rs-drive-proof-verifier/src/verify.rs +++ b/packages/rs-drive-proof-verifier/src/verify.rs @@ -8,7 +8,7 @@ use tenderdash_abci::{ use crate::Error; -use crate::QuorumInfoProvider; +use crate::ContextProvider; /// Verify cryptographic proof generated by Tenderdash /// @@ -32,7 +32,7 @@ pub(crate) fn verify_tenderdash_proof( proof: &Proof, mtd: &ResponseMetadata, root_hash: &[u8], - provider: &dyn QuorumInfoProvider, + provider: &dyn ContextProvider, ) -> Result<(), Error> { let block_id_hash = proof.block_id_hash.to_vec(); @@ -41,7 +41,7 @@ pub(crate) fn verify_tenderdash_proof( let round = proof.round; let core_locked_height = mtd.core_chain_locked_height; let quorum_hash = TryInto::<[u8; 32]>::try_into(proof.quorum_hash.as_slice()).map_err(|e| { - Error::InvalidQuorum { + Error::ResponseDecodeError { error: "invalid quorum hash size: ".to_string() + &e.to_string(), } })?; @@ -109,7 +109,12 @@ pub(crate) fn verify_tenderdash_proof( match verify_signature_digest(&sign_digest, &signature, &pubkey)? { true => Ok(()), false => Err(Error::InvalidSignature { - error: "signature mismatch".to_string(), + error: format!( + "signature {} could not be verified with public key {} for sign digest {}", + hex::encode(signature), + hex::encode(pubkey_bytes), + hex::encode(sign_digest) + ), }), } } diff --git a/packages/rs-drive/Cargo.toml b/packages/rs-drive/Cargo.toml index 037eed04ce..f0b9f06248 100644 --- a/packages/rs-drive/Cargo.toml +++ b/packages/rs-drive/Cargo.toml @@ -21,11 +21,11 @@ integer-encoding = { version = "4.0.0" } rand = { version = "0.8.4", features = ["small_rng"] } byteorder = { version = "1.4.3" } indexmap = { version = "1.8.0" } -sqlparser = { version = "0.13.0" } +sqlparser = { version = "0.38.0" } thiserror = { version = "1.0.30" } moka = { version = "0.11.1", features = ["future", "futures-util"] } nohash-hasher = { version = "0.2.0" } -dpp = { path = "../rs-dpp", features = ["drive", "cbor"] } +dpp = { path = "../rs-dpp", features = ["drive", "cbor", "random-public-keys"] } derive_more = "0.99.17" tracing = { version = "0.1.37", default-features = false, features = [] } @@ -45,11 +45,11 @@ grovedb-path = { git = "https://github.com/dashpay/grovedb", rev = "b40dd1a35f85 grovedb-storage = { git = "https://github.com/dashpay/grovedb", rev = "b40dd1a35f852c81caeda2d3c2910c40fae3a67f", optional = true } [dev-dependencies] +anyhow = { version = "1.0.75" } criterion = "0.3.5" platform-version = { path = "../rs-platform-version", features = [ "mock-versions", ] } -anyhow = "1.0.71" dpp = { path = "../rs-dpp", features = [ "drive", "document-cbor-conversion", diff --git a/packages/rs-drive/src/drive/batch/transitions/document/document_create_transition.rs b/packages/rs-drive/src/drive/batch/transitions/document/document_create_transition.rs index 68892e8eef..faf83b3b90 100644 --- a/packages/rs-drive/src/drive/batch/transitions/document/document_create_transition.rs +++ b/packages/rs-drive/src/drive/batch/transitions/document/document_create_transition.rs @@ -11,7 +11,7 @@ use dpp::document::Document; use dpp::prelude::Identifier; use std::borrow::Cow; use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; -use crate::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::{DocumentCreateTransitionAction, DocumentCreateTransitionActionAccessorsV0, DocumentFromCreateTransition}; +use crate::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::{DocumentCreateTransitionAction, DocumentCreateTransitionActionAccessorsV0, DocumentFromCreateTransitionAction}; use dpp::version::PlatformVersion; impl DriveHighLevelDocumentOperationConverter for DocumentCreateTransitionAction { @@ -26,7 +26,7 @@ impl DriveHighLevelDocumentOperationConverter for DocumentCreateTransitionAction let document_type_name = self.base().document_type_name().clone(); let document = - Document::try_from_owned_create_transition(self, owner_id, platform_version)?; + Document::try_from_owned_create_transition_action(self, owner_id, platform_version)?; let storage_flags = StorageFlags::new_single_epoch(epoch.index, Some(owner_id.to_buffer())); diff --git a/packages/rs-drive/src/drive/batch/transitions/document/document_update_transition.rs b/packages/rs-drive/src/drive/batch/transitions/document/document_update_transition.rs index 18e5e8d679..4f8269e453 100644 --- a/packages/rs-drive/src/drive/batch/transitions/document/document_update_transition.rs +++ b/packages/rs-drive/src/drive/batch/transitions/document/document_update_transition.rs @@ -11,7 +11,7 @@ use dpp::document::Document; use dpp::prelude::Identifier; use std::borrow::Cow; use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; -use crate::state_transition_action::document::documents_batch::document_transition::document_replace_transition_action::{DocumentFromReplaceTransition, DocumentReplaceTransitionAction, DocumentReplaceTransitionActionAccessorsV0}; +use crate::state_transition_action::document::documents_batch::document_transition::document_replace_transition_action::{DocumentFromReplaceTransitionAction, DocumentReplaceTransitionAction, DocumentReplaceTransitionActionAccessorsV0}; use dpp::version::PlatformVersion; impl DriveHighLevelDocumentOperationConverter for DocumentReplaceTransitionAction { @@ -24,7 +24,7 @@ impl DriveHighLevelDocumentOperationConverter for DocumentReplaceTransitionActio let data_contract_id = self.base().data_contract_id(); let document_type_name = self.base().document_type_name().clone(); let document = - Document::try_from_owned_replace_transition(self, owner_id, platform_version)?; + Document::try_from_owned_replace_transition_action(self, owner_id, platform_version)?; let storage_flags = StorageFlags::new_single_epoch(epoch.index, Some(owner_id.to_buffer())); diff --git a/packages/rs-drive/src/drive/cache.rs b/packages/rs-drive/src/drive/cache.rs index 6639008901..367e5b9ab1 100644 --- a/packages/rs-drive/src/drive/cache.rs +++ b/packages/rs-drive/src/drive/cache.rs @@ -1,4 +1,3 @@ -pub use crate::drive::cache::system_contracts_cache::SystemDataContracts; #[cfg(any(feature = "full", feature = "verify"))] use crate::drive::contract::DataContractFetchInfo; use crate::drive::Drive; @@ -20,6 +19,9 @@ use std::sync::Arc; #[cfg(feature = "full")] mod system_contracts_cache; +#[cfg(feature = "full")] +pub use system_contracts_cache::SystemDataContracts; + /// Drive cache struct #[cfg(feature = "full")] pub struct DriveCache { diff --git a/packages/rs-drive/src/drive/credit_pools/mod.rs b/packages/rs-drive/src/drive/credit_pools/mod.rs index 82f4c4f0b1..eec8d8e57c 100644 --- a/packages/rs-drive/src/drive/credit_pools/mod.rs +++ b/packages/rs-drive/src/drive/credit_pools/mod.rs @@ -27,33 +27,59 @@ // DEALINGS IN THE SOFTWARE. // +#[cfg(feature = "full")] use crate::drive::batch::GroveDbOpBatch; +#[cfg(feature = "full")] use crate::drive::Drive; +#[cfg(feature = "full")] use crate::error::drive::DriveError; +#[cfg(feature = "full")] use crate::error::Error; +#[cfg(feature = "full")] use crate::fee_pools::epochs::epoch_key_constants::KEY_POOL_STORAGE_FEES; +#[cfg(feature = "full")] use crate::fee_pools::epochs::paths::encode_epoch_index_key; +#[cfg(feature = "full")] use crate::fee_pools::epochs::paths::EpochProposers; +#[cfg(feature = "full")] use dpp::block::epoch::{Epoch, EpochIndex}; +#[cfg(feature = "full")] use dpp::fee::epoch::SignedCreditsPerEpoch; use dpp::fee::SignedCredits; +#[cfg(feature = "full")] use grovedb::query_result_type::QueryResultType; +#[cfg(feature = "full")] use grovedb::{Element, PathQuery, Query, TransactionArg}; +#[cfg(feature = "full")] use itertools::Itertools; +#[cfg(feature = "full")] /// Epochs module pub mod epochs; + +#[cfg(any(feature = "full", feature = "verify"))] pub(crate) mod paths; + +#[cfg(feature = "full")] pub mod pending_epoch_refunds; + +#[cfg(feature = "full")] pub mod storage_fee_distribution_pool; +#[cfg(feature = "full")] pub mod unpaid_epoch; +#[cfg(feature = "full")] use crate::drive::batch::grovedb_op_batch::GroveDbOpBatchV0Methods; + +#[cfg(feature = "full")] use crate::drive::fee::get_overflow_error; + +#[cfg(any(feature = "full", feature = "verify"))] pub use paths::*; +#[cfg(feature = "full")] impl Drive { /// Adds GroveDB operations to update epoch storage fee pools with specified map of credits to epochs /// This method optimized to update sequence of epoch pools without gaps diff --git a/packages/rs-drive/src/drive/document/delete/mod.rs b/packages/rs-drive/src/drive/document/delete/mod.rs index 62f1eb61bf..89d77501c6 100644 --- a/packages/rs-drive/src/drive/document/delete/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/mod.rs @@ -160,7 +160,7 @@ mod tests { let sql_string = "select * from person where firstName = 'Samuel' order by firstName asc limit 100"; - let query = DriveQuery::from_sql_expr(sql_string, &contract, &DriveConfig::default()) + let query = DriveQuery::from_sql_expr(sql_string, &contract, Some(&DriveConfig::default())) .expect("should build query"); let (results_no_transaction, _, _) = query @@ -257,7 +257,7 @@ mod tests { let sql_string = "select * from person where firstName = 'Samuel' order by firstName asc limit 100"; - let query = DriveQuery::from_sql_expr(sql_string, &contract, &DriveConfig::default()) + let query = DriveQuery::from_sql_expr(sql_string, &contract, Some(&DriveConfig::default())) .expect("should build query"); let (results_no_transaction, _, _) = query @@ -429,7 +429,7 @@ mod tests { let sql_string = "select * from person where firstName > 'A' order by firstName asc limit 5"; - let query = DriveQuery::from_sql_expr(sql_string, &contract, &DriveConfig::default()) + let query = DriveQuery::from_sql_expr(sql_string, &contract, Some(&DriveConfig::default())) .expect("should build query"); let (results_no_transaction, _, _) = query @@ -467,7 +467,7 @@ mod tests { let sql_string = "select * from person where firstName > 'A' order by firstName asc limit 5"; - let query = DriveQuery::from_sql_expr(sql_string, &contract, &DriveConfig::default()) + let query = DriveQuery::from_sql_expr(sql_string, &contract, Some(&DriveConfig::default())) .expect("should build query"); let (results_no_transaction, _, _) = query @@ -505,7 +505,7 @@ mod tests { let sql_string = "select * from person where firstName > 'A' order by firstName asc limit 5"; - let query = DriveQuery::from_sql_expr(sql_string, &contract, &DriveConfig::default()) + let query = DriveQuery::from_sql_expr(sql_string, &contract, Some(&DriveConfig::default())) .expect("should build query"); let (results_no_transaction, _, _) = query @@ -602,7 +602,7 @@ mod tests { let sql_string = "select * from person where firstName > 'A' order by firstName asc limit 5"; - let query = DriveQuery::from_sql_expr(sql_string, &contract, &DriveConfig::default()) + let query = DriveQuery::from_sql_expr(sql_string, &contract, Some(&DriveConfig::default())) .expect("should build query"); let (results_no_transaction, _, _) = query @@ -711,7 +711,7 @@ mod tests { let sql_string = "select * from person where firstName > 'A' order by firstName asc limit 5"; - let query = DriveQuery::from_sql_expr(sql_string, &contract, &DriveConfig::default()) + let query = DriveQuery::from_sql_expr(sql_string, &contract, Some(&DriveConfig::default())) .expect("should build query"); let (results_no_transaction, _, _) = query diff --git a/packages/rs-drive/src/drive/document/update/mod.rs b/packages/rs-drive/src/drive/document/update/mod.rs index 1f627982f0..0f3d59b32d 100644 --- a/packages/rs-drive/src/drive/document/update/mod.rs +++ b/packages/rs-drive/src/drive/document/update/mod.rs @@ -219,7 +219,7 @@ mod tests { // Check Alice profile let sql_string = "select * from profile"; - let query = DriveQuery::from_sql_expr(sql_string, &contract, &DriveConfig::default()) + let query = DriveQuery::from_sql_expr(sql_string, &contract, Some(&DriveConfig::default())) .expect("should build query"); let (results_no_transaction, _, _) = query @@ -319,7 +319,7 @@ mod tests { // Check Alice profile let sql_string = "select * from profile"; - let query = DriveQuery::from_sql_expr(sql_string, &contract, &DriveConfig::default()) + let query = DriveQuery::from_sql_expr(sql_string, &contract, Some(&DriveConfig::default())) .expect("should build query"); let (results_no_transaction, _, _) = query @@ -427,7 +427,7 @@ mod tests { // Check Alice profile let sql_string = "select * from profile"; - let query = DriveQuery::from_sql_expr(sql_string, &contract, &DriveConfig::default()) + let query = DriveQuery::from_sql_expr(sql_string, &contract, Some(&DriveConfig::default())) .expect("should build query"); let (results_no_transaction, _, _) = query diff --git a/packages/rs-drive/src/drive/mod.rs b/packages/rs-drive/src/drive/mod.rs index f89315e59e..8a5b04cd01 100644 --- a/packages/rs-drive/src/drive/mod.rs +++ b/packages/rs-drive/src/drive/mod.rs @@ -53,7 +53,7 @@ pub mod config; #[cfg(any(feature = "full", feature = "verify", feature = "fixtures-and-mocks"))] pub mod contract; /// Fee pools module -#[cfg(feature = "full")] +#[cfg(any(feature = "full", feature = "verify"))] pub mod credit_pools; #[cfg(any(feature = "full", feature = "verify"))] pub mod defaults; @@ -75,7 +75,7 @@ pub mod initialization; pub mod object_size_info; /// Protocol upgrade module -#[cfg(feature = "full")] +#[cfg(any(feature = "full", feature = "verify"))] pub mod protocol_upgrade; #[cfg(feature = "full")] mod shared_estimation_costs; diff --git a/packages/rs-drive/src/drive/protocol_upgrade/mod.rs b/packages/rs-drive/src/drive/protocol_upgrade/mod.rs index 7030db0bf2..75bc6ed984 100644 --- a/packages/rs-drive/src/drive/protocol_upgrade/mod.rs +++ b/packages/rs-drive/src/drive/protocol_upgrade/mod.rs @@ -1,21 +1,36 @@ +#[cfg(feature = "full")] use crate::drive::batch::grovedb_op_batch::GroveDbOpBatchV0Methods; +#[cfg(feature = "full")] use crate::drive::batch::GroveDbOpBatch; +#[cfg(any(feature = "full", feature = "verify"))] use crate::drive::RootTree; +#[cfg(feature = "full")] mod change_to_new_version_and_clear_version_information; +#[cfg(feature = "full")] mod clear_version_information; +#[cfg(feature = "full")] mod fetch_proved_validator_version_votes; +#[cfg(feature = "full")] mod fetch_proved_versions_with_counter; +#[cfg(feature = "full")] mod fetch_validator_version_votes; +#[cfg(feature = "full")] mod fetch_versions_with_counter; +#[cfg(feature = "full")] mod remove_validators_proposed_app_versions; +#[cfg(feature = "full")] mod update_validator_proposed_app_version; +#[cfg(any(feature = "full", feature = "verify"))] /// constant id for various versions counter pub const VERSIONS_COUNTER: [u8; 1] = [0]; + +#[cfg(any(feature = "full", feature = "verify"))] /// constant id for subtree containing the desired versions for each validator pub const VALIDATOR_DESIRED_VERSIONS: [u8; 1] = [1]; +#[cfg(feature = "full")] /// Add operations for creating initial versioning state structure pub fn add_initial_fork_update_structure_operations(batch: &mut GroveDbOpBatch) { batch.add_insert_empty_tree( @@ -29,6 +44,7 @@ pub fn add_initial_fork_update_structure_operations(batch: &mut GroveDbOpBatch) ); } +#[cfg(any(feature = "full", feature = "verify"))] /// versions counter path pub fn versions_counter_path() -> [&'static [u8]; 2] { [ @@ -37,11 +53,13 @@ pub fn versions_counter_path() -> [&'static [u8]; 2] { ] } +#[cfg(any(feature = "full", feature = "verify"))] /// versions counter path pub fn versions_counter_path_vec() -> Vec> { vec![vec![RootTree::Versions as u8], VERSIONS_COUNTER.to_vec()] } +#[cfg(any(feature = "full", feature = "verify"))] /// desired version for validators path pub fn desired_version_for_validators_path() -> [&'static [u8]; 2] { [ @@ -50,6 +68,7 @@ pub fn desired_version_for_validators_path() -> [&'static [u8]; 2] { ] } +#[cfg(any(feature = "full", feature = "verify"))] /// desired version for validators path pub fn desired_version_for_validators_path_vec() -> Vec> { vec![ diff --git a/packages/rs-drive/src/drive/verify/identity/verify_identity_keys_by_identity_id/mod.rs b/packages/rs-drive/src/drive/verify/identity/verify_identity_keys_by_identity_id/mod.rs index d50813ca00..3c68493633 100644 --- a/packages/rs-drive/src/drive/verify/identity/verify_identity_keys_by_identity_id/mod.rs +++ b/packages/rs-drive/src/drive/verify/identity/verify_identity_keys_by_identity_id/mod.rs @@ -38,6 +38,8 @@ impl Drive { pub fn verify_identity_keys_by_identity_id( proof: &[u8], key_request: IdentityKeysRequest, + with_revision: bool, + with_balance: bool, is_proof_subset: bool, platform_version: &PlatformVersion, ) -> Result<(RootHash, Option), Error> { @@ -51,6 +53,8 @@ impl Drive { 0 => Self::verify_identity_keys_by_identity_id_v0( proof, key_request, + with_revision, + with_balance, is_proof_subset, platform_version, ), diff --git a/packages/rs-drive/src/drive/verify/identity/verify_identity_keys_by_identity_id/v0/mod.rs b/packages/rs-drive/src/drive/verify/identity/verify_identity_keys_by_identity_id/v0/mod.rs index 4aff6ff97b..4c674300a4 100644 --- a/packages/rs-drive/src/drive/verify/identity/verify_identity_keys_by_identity_id/v0/mod.rs +++ b/packages/rs-drive/src/drive/verify/identity/verify_identity_keys_by_identity_id/v0/mod.rs @@ -1,4 +1,5 @@ -use crate::drive::identity::identity_key_tree_path; +use crate::drive::balances::{balance_path, balance_path_vec}; +use crate::drive::identity::{identity_key_tree_path, identity_path_vec, IdentityRootStructure}; use crate::drive::Drive; use crate::error::proof::ProofError; @@ -10,9 +11,10 @@ use dpp::identifier::Identifier; use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; use dpp::identity::{IdentityPublicKey, KeyID, PartialIdentity}; +use dpp::prelude::Revision; use dpp::serialization::PlatformDeserializable; use dpp::version::PlatformVersion; -use grovedb::GroveDb; +use grovedb::{GroveDb, PathQuery}; use std::collections::BTreeMap; impl Drive { @@ -41,47 +43,92 @@ impl Drive { pub(super) fn verify_identity_keys_by_identity_id_v0( proof: &[u8], key_request: IdentityKeysRequest, + with_revision: bool, + with_balance: bool, is_proof_subset: bool, _platform_version: &PlatformVersion, ) -> Result<(RootHash, Option), Error> { let identity_id = key_request.identity_id; - let path_query = key_request.into_path_query(); - let (root_hash, proved_key_values) = if is_proof_subset { + let keys_path_query = key_request.into_path_query(); + let mut path_queries = vec![&keys_path_query]; + + let revision_path_query = Drive::identity_revision_query(&identity_id); + let balance_path_query = Drive::balance_for_identity_id_query(identity_id); + + if with_balance { + path_queries.push(&balance_path_query); + } + if with_revision { + path_queries.push(&revision_path_query); + } + + let path_query = PathQuery::merge(path_queries)?; + let (root_hash, proved_values) = if is_proof_subset { GroveDb::verify_subset_query(proof, &path_query)? } else { GroveDb::verify_query(proof, &path_query)? }; - let mut keys = BTreeMap::::new(); + + let mut loaded_public_keys = BTreeMap::::new(); + let mut balance = None; + let mut revision = None; + let identity_keys_path = identity_key_tree_path(identity_id.as_slice()); - for proved_key_value in proved_key_values { - let (path, _key, maybe_element) = proved_key_value; + let identity_balance_path = balance_path(); + let identity_path = identity_path_vec(&identity_id); + + for proved_key_value in proved_values { + let (path, key, maybe_element) = proved_key_value; if path == identity_keys_path { if let Some(element) = maybe_element { let item_bytes = element.into_item_bytes().map_err(Error::GroveDB)?; let key = IdentityPublicKey::deserialize_from_bytes(&item_bytes)?; - keys.insert(key.id(), key); + loaded_public_keys.insert(key.id(), key); } else { return Err(Error::Proof(ProofError::CorruptedProof( "we received an absence proof for a key but didn't request one".to_string(), ))); } + } else if path == identity_balance_path && key == identity_id { + if let Some(grovedb::Element::SumItem(identity_balance, _)) = maybe_element { + balance = Some(identity_balance as u64); + } else { + return Err(Error::Proof(ProofError::CorruptedProof( + "balance proof must be an existing sum item".to_string(), + ))); + } + } else if path == identity_path + && key == [IdentityRootStructure::IdentityTreeRevision as u8] + { + if let Some(element) = maybe_element { + let item_bytes = element.into_item_bytes().map_err(Error::GroveDB)?; + revision = Some(Revision::from_be_bytes( + item_bytes.as_slice().try_into().map_err(|_| { + Error::GroveDB(grovedb::Error::WrongElementType( + "expecting 8 bytes of data for revision", + )) + })?, + )); + } else { + return Err(Error::Proof(ProofError::CorruptedProof( + "we received an absence proof for a revision but didn't request one" + .to_string(), + ))); + } } else { return Err(Error::Proof(ProofError::TooManyElements( "we got back items that we did not request", ))); } } - let maybe_identity = if keys.is_empty() { - Ok::, Error>(None) - } else { - Ok(Some(PartialIdentity { - id: Identifier::from(identity_id), - balance: None, - revision: None, - loaded_public_keys: keys, - not_found_public_keys: Default::default(), - })) - }?; + let maybe_identity = Some(PartialIdentity { + id: Identifier::from(identity_id), + balance, + revision, + loaded_public_keys, + not_found_public_keys: Default::default(), + }); + Ok((root_hash, maybe_identity)) } } diff --git a/packages/rs-drive/src/drive/verify/mod.rs b/packages/rs-drive/src/drive/verify/mod.rs index 3b1ce6ae85..01264d6837 100644 --- a/packages/rs-drive/src/drive/verify/mod.rs +++ b/packages/rs-drive/src/drive/verify/mod.rs @@ -10,5 +10,8 @@ pub mod single_document; /// System components (Epoch info etc...) verification methods on proofs pub mod system; +/// Verifies that a state transition contents exist in the proof +pub mod state_transition; + /// Represents the root hash of the grovedb tree pub type RootHash = [u8; 32]; diff --git a/packages/rs-drive/src/drive/verify/state_transition/mod.rs b/packages/rs-drive/src/drive/verify/state_transition/mod.rs new file mode 100644 index 0000000000..cc466d86d2 --- /dev/null +++ b/packages/rs-drive/src/drive/verify/state_transition/mod.rs @@ -0,0 +1 @@ +pub mod verify_state_transition_was_executed_with_proof; diff --git a/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/mod.rs b/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/mod.rs new file mode 100644 index 0000000000..7adb5fb5f5 --- /dev/null +++ b/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/mod.rs @@ -0,0 +1,69 @@ +//! Verifies the execution of a state transition using a provided proof. +//! +use crate::drive::verify::RootHash; +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use dpp::data_contract::DataContract; +use dpp::identifier::Identifier; +use dpp::state_transition::proof_result::StateTransitionProofResult; +use dpp::state_transition::StateTransition; +use dpp::version::PlatformVersion; +use std::sync::Arc; +mod v0; + +impl Drive { + /// Verifies the execution of a state transition using a provided proof. + /// + /// This method checks if the state transition has been executed and is included in the proof. + /// It supports different versions of the verification process, which are handled based on the + /// platform version specified. + /// + /// # Parameters + /// + /// - `state_transition`: A reference to the `StateTransition` that needs to be verified. + /// - `proof`: A byte slice representing the cryptographic proof to be verified. + /// - `known_contracts`: A `HashMap` mapping `Identifier`s to references of `DataContract`s that are known. + /// - `platform_version`: A reference to the `PlatformVersion` which dictates the verification method to be used. + /// + /// # Returns + /// + /// A `Result` containing either: + /// - On success: a tuple of `RootHash` and `StateTransitionProofResult`, where `RootHash` is the root hash of the + /// proof and `StateTransitionProofResult` contains the result of the proof verification. + /// - On failure: an `Error` encapsulating the reason for failure, such as proof corruption or a database query error. + /// + /// # Errors + /// + /// This function can return an `Error` in several cases, including but not limited to: + /// - The proof is invalid or corrupted. + /// - The verification process for the given platform version is not implemented. + /// - The database query required for the verification fails. + /// + pub fn verify_state_transition_was_executed_with_proof( + state_transition: &StateTransition, + proof: &[u8], + known_contracts_provider_fn: &impl Fn(&Identifier) -> Result>, Error>, + platform_version: &PlatformVersion, + ) -> Result<(RootHash, StateTransitionProofResult), Error> { + match platform_version + .drive + .methods + .verify + .state_transition + .verify_state_transition_was_executed_with_proof + { + 0 => Drive::verify_state_transition_was_executed_with_proof_v0( + state_transition, + proof, + known_contracts_provider_fn, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "verify_state_transition_was_executed_with_proof".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs b/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs new file mode 100644 index 0000000000..5ed18ed043 --- /dev/null +++ b/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs @@ -0,0 +1,286 @@ +use std::collections::{BTreeMap}; +use std::sync::Arc; +use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; +use dpp::data_contract::serialized_version::DataContractInSerializationFormat; +use dpp::document::{Document, DocumentV0Getters}; +use dpp::identity::PartialIdentity; +use dpp::prelude::{DataContract, Identifier}; +use dpp::state_transition::data_contract_create_transition::accessors::DataContractCreateTransitionAccessorsV0; +use dpp::state_transition::data_contract_update_transition::accessors::DataContractUpdateTransitionAccessorsV0; +use dpp::state_transition::documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; +use dpp::state_transition::documents_batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; +use dpp::state_transition::documents_batch_transition::document_create_transition::v0::v0_methods::DocumentCreateTransitionV0Methods; +use dpp::state_transition::documents_batch_transition::document_transition::{DocumentTransition, DocumentTransitionV0Methods}; +use dpp::state_transition::identity_create_transition::accessors::IdentityCreateTransitionAccessorsV0; +use dpp::state_transition::identity_credit_transfer_transition::accessors::IdentityCreditTransferTransitionAccessorsV0; +use dpp::state_transition::identity_credit_withdrawal_transition::accessors::IdentityCreditWithdrawalTransitionAccessorsV0; +use dpp::state_transition::identity_topup_transition::accessors::IdentityTopUpTransitionAccessorsV0; +use dpp::state_transition::identity_update_transition::accessors::IdentityUpdateTransitionAccessorsV0; +use dpp::state_transition::{StateTransition, StateTransitionLike}; +use dpp::state_transition::documents_batch_transition::document_create_transition::DocumentFromCreateTransition; +use dpp::state_transition::documents_batch_transition::document_delete_transition::v0::v0_methods::DocumentDeleteTransitionV0Methods; +use dpp::state_transition::documents_batch_transition::document_replace_transition::DocumentFromReplaceTransition; +use dpp::state_transition::documents_batch_transition::document_replace_transition::v0::v0_methods::DocumentReplaceTransitionV0Methods; +use dpp::state_transition::proof_result::StateTransitionProofResult; +use dpp::state_transition::proof_result::StateTransitionProofResult::{VerifiedBalanceTransfer, VerifiedDataContract, VerifiedDocuments, VerifiedIdentity, VerifiedPartialIdentity}; +use platform_version::TryIntoPlatformVersioned; +use platform_version::version::PlatformVersion; +use crate::drive::Drive; +use crate::drive::identity::key::fetch::IdentityKeysRequest; +use crate::drive::verify::RootHash; +use crate::error::Error; +use crate::error::proof::ProofError; +use crate::query::SingleDocumentDriveQuery; + +impl Drive { + pub(super) fn verify_state_transition_was_executed_with_proof_v0( + state_transition: &StateTransition, + proof: &[u8], + known_contracts_provider_fn: &impl Fn(&Identifier) -> Result>, Error>, + platform_version: &PlatformVersion, + ) -> Result<(RootHash, StateTransitionProofResult), Error> { + match state_transition { + StateTransition::DataContractCreate(data_contract_create) => { + // we expect to get a contract that matches the state transition + let (root_hash, contract) = Drive::verify_contract( + proof, + None, + false, + true, + data_contract_create.data_contract().id().into_buffer(), + platform_version, + )?; + let contract = contract.ok_or(Error::Proof(ProofError::IncorrectProof(format!("proof did not contain contract with id {} expected to exist because of state transition (create)", data_contract_create.data_contract().id()))))?; + let contract_for_serialization: DataContractInSerializationFormat = contract + .clone() + .try_into_platform_versioned(platform_version)?; + if &contract_for_serialization != data_contract_create.data_contract() { + return Err(Error::Proof(ProofError::IncorrectProof(format!("proof of state transition execution did not contain exact expected contract after create with id {}", data_contract_create.data_contract().id())))); + } + Ok((root_hash, VerifiedDataContract(contract))) + } + StateTransition::DataContractUpdate(data_contract_update) => { + // we expect to get a contract that matches the state transition + let (root_hash, contract) = Drive::verify_contract( + proof, + None, + false, + true, + data_contract_update.data_contract().id().into_buffer(), + platform_version, + )?; + let contract = contract.ok_or(Error::Proof(ProofError::IncorrectProof(format!("proof did not contain contract with id {} expected to exist because of state transition (update", data_contract_update.data_contract().id()))))?; + let contract_for_serialization: DataContractInSerializationFormat = contract + .clone() + .try_into_platform_versioned(platform_version)?; + if &contract_for_serialization != data_contract_update.data_contract() { + return Err(Error::Proof(ProofError::IncorrectProof(format!("proof of state transition execution did not contain exact expected contract after update with id {}", data_contract_update.data_contract().id())))); + } + Ok((root_hash, VerifiedDataContract(contract))) + } + StateTransition::DocumentsBatch(documents_batch_transition) => { + if documents_batch_transition.transitions().len() > 1 { + return Err(Error::Proof(ProofError::InvalidTransition(format!("version {} does not support more than one document in a document batch transition", platform_version.protocol_version)))); + } + let Some(transition) = documents_batch_transition.transitions().first() else { + return Err(Error::Proof(ProofError::InvalidTransition( + "no transition in a document batch transition".to_string(), + ))); + }; + + let data_contract_id = transition.data_contract_id(); + + let contract = known_contracts_provider_fn(&data_contract_id)?.ok_or( + Error::Proof(ProofError::UnknownContract(format!( + "unknown contract with id {}", + data_contract_id + ))), + )?; + + let document_type = contract + .document_type_for_name(transition.document_type_name()) + .map_err(|_| { + Error::Proof(ProofError::UnknownContract(format!( + "unknown contract document {} with id {}", + transition.document_type_name(), + transition.data_contract_id() + ))) + })?; + + let query = SingleDocumentDriveQuery { + contract_id: transition.data_contract_id().into_buffer(), + document_type_name: transition.document_type_name().clone(), + document_type_keeps_history: document_type.documents_keep_history(), + document_id: transition.base().id().into_buffer(), + block_time_ms: None, //None because we want latest + }; + let (root_hash, document) = + query.verify_proof(false, proof, document_type, platform_version)?; + + match transition { + DocumentTransition::Create(create_transition) => { + let document = document.ok_or(Error::Proof(ProofError::IncorrectProof(format!("proof did not contain document with id {} expected to exist because of state transition (create)", create_transition.base().id()))))?; + let expected_document = Document::try_from_create_transition( + create_transition, + documents_batch_transition.owner_id(), + &contract, + platform_version, + )?; + + if document != expected_document { + return Err(Error::Proof(ProofError::IncorrectProof(format!("proof of state transition execution did not contain exact expected document after create with id {}", create_transition.base().id())))); + } + Ok(( + root_hash, + VerifiedDocuments(BTreeMap::from([(document.id(), Some(document))])), + )) + } + DocumentTransition::Replace(replace_transition) => { + let document = document.ok_or(Error::Proof(ProofError::IncorrectProof(format!("proof did not contain document with id {} expected to exist because of state transition (replace)", replace_transition.base().id()))))?; + let expected_document = Document::try_from_replace_transition( + replace_transition, + documents_batch_transition.owner_id(), + document.created_at(), //we can trust the created at (as we don't care) + platform_version, + )?; + + if document != expected_document { + return Err(Error::Proof(ProofError::IncorrectProof(format!("proof of state transition execution did not contain exact expected document after replace with id {}", replace_transition.base().id())))); + } + Ok(( + root_hash, + VerifiedDocuments(BTreeMap::from([(document.id(), Some(document))])), + )) + } + DocumentTransition::Delete(delete_transition) => { + if document.is_some() { + return Err(Error::Proof(ProofError::IncorrectProof(format!("proof of state transition execution contained document after delete with id {}", delete_transition.base().id())))); + } + Ok(( + root_hash, + VerifiedDocuments(BTreeMap::from([( + delete_transition.base().id(), + None, + )])), + )) + } + } + } + StateTransition::IdentityCreate(identity_create_transition) => { + // we expect to get an identity that matches the state transition + let (root_hash, identity) = Drive::verify_full_identity_by_identity_id( + proof, + false, + identity_create_transition.identity_id().into_buffer(), + platform_version, + )?; + let identity = identity.ok_or(Error::Proof(ProofError::IncorrectProof(format!("proof did not contain identity {} expected to exist because of state transition (create)", identity_create_transition.identity_id()))))?; + Ok((root_hash, VerifiedIdentity(identity))) + } + StateTransition::IdentityTopUp(identity_top_up_transition) => { + // we expect to get an identity that matches the state transition + let (root_hash, balance) = Drive::verify_identity_balance_for_identity_id( + proof, + identity_top_up_transition.identity_id().into_buffer(), + false, + platform_version, + )?; + let balance = balance.ok_or(Error::Proof(ProofError::IncorrectProof(format!("proof did not contain balance for identity {} expected to exist because of state transition (top up)", identity_top_up_transition.identity_id()))))?; + Ok(( + root_hash, + VerifiedPartialIdentity(PartialIdentity { + id: *identity_top_up_transition.identity_id(), + loaded_public_keys: Default::default(), + balance: Some(balance), + revision: None, + not_found_public_keys: Default::default(), + }), + )) + } + StateTransition::IdentityCreditWithdrawal(identity_credit_withdrawal_transition) => { + // we expect to get an identity that matches the state transition + let (root_hash, balance) = Drive::verify_identity_balance_for_identity_id( + proof, + identity_credit_withdrawal_transition + .identity_id() + .into_buffer(), + false, + platform_version, + )?; + let balance = balance.ok_or(Error::Proof(ProofError::IncorrectProof(format!("proof did not contain balance for identity {} expected to exist because of state transition (withdrawal)", identity_credit_withdrawal_transition.identity_id()))))?; + Ok(( + root_hash, + VerifiedPartialIdentity(PartialIdentity { + id: identity_credit_withdrawal_transition.identity_id(), + loaded_public_keys: Default::default(), + balance: Some(balance), + revision: None, + not_found_public_keys: Default::default(), + }), + )) + } + StateTransition::IdentityUpdate(identity_update_transition) => { + // we expect to get an identity that matches the state transition + let (root_hash, identity) = Drive::verify_identity_keys_by_identity_id( + proof, + IdentityKeysRequest::new_all_keys_query( + &identity_update_transition.identity_id().into_buffer(), + None, + ), + true, + true, + false, + platform_version, + )?; + let identity = identity.ok_or(Error::Proof(ProofError::IncorrectProof(format!("proof did not contain update for identity {} expected to exist because of state transition (update)", identity_update_transition.identity_id()))))?; + Ok((root_hash, VerifiedPartialIdentity(identity))) + } + StateTransition::IdentityCreditTransfer(identity_credit_transfer) => { + // we expect to get an identity that matches the state transition + let (root_hash_identity, balance_identity) = + Drive::verify_identity_balance_for_identity_id( + proof, + identity_credit_transfer.identity_id().into_buffer(), + true, + platform_version, + )?; + + let (root_hash_recipient, balance_recipient) = + Drive::verify_identity_balance_for_identity_id( + proof, + identity_credit_transfer.recipient_id().into_buffer(), + true, + platform_version, + )?; + + if root_hash_identity != root_hash_recipient { + return Err(Error::Proof(ProofError::CorruptedProof("proof is expected to have same root hash for all subsets (identity transfer)".to_string()))); + } + + let balance_identity = balance_identity.ok_or(Error::Proof(ProofError::IncorrectProof(format!("proof did not contain balance for identity sender {} expected to exist because of state transition (transfer)", identity_credit_transfer.identity_id()))))?; + let balance_recipient = balance_recipient.ok_or(Error::Proof(ProofError::IncorrectProof(format!("proof did not contain balance for identity recipient {} expected to exist because of state transition (transfer)", identity_credit_transfer.recipient_id()))))?; + + Ok(( + root_hash_identity, + VerifiedBalanceTransfer( + PartialIdentity { + id: identity_credit_transfer.identity_id(), + loaded_public_keys: Default::default(), + balance: Some(balance_identity), + revision: None, + not_found_public_keys: Default::default(), + }, + PartialIdentity { + id: identity_credit_transfer.recipient_id(), + loaded_public_keys: Default::default(), + balance: Some(balance_recipient), + revision: None, + not_found_public_keys: Default::default(), + }, + ), + )) + } + } + } +} diff --git a/packages/rs-drive/src/error/contract.rs b/packages/rs-drive/src/error/contract.rs index 25f1ee232f..b947149bda 100644 --- a/packages/rs-drive/src/error/contract.rs +++ b/packages/rs-drive/src/error/contract.rs @@ -8,4 +8,8 @@ pub enum DataContractError { /// KeyBoundsExpectedButNotPresent error #[error("key bounds expected but not present error: {0}")] KeyBoundsExpectedButNotPresent(&'static str), + + /// Data contract missing or cannot be retrieved + #[error("data contract cannot be retrieved: {0}")] + MissingContract(String), } diff --git a/packages/rs-drive/src/error/proof.rs b/packages/rs-drive/src/error/proof.rs index 627d114b2b..1d2965d724 100644 --- a/packages/rs-drive/src/error/proof.rs +++ b/packages/rs-drive/src/error/proof.rs @@ -25,6 +25,23 @@ pub enum ProofError { #[error("corrupted error: {0}")] CorruptedProof(String), + /// The proof returned is said to be valid, data is what we asked for, but is not what was + /// expected, for example if we updated a contract, but we are getting back the old contract + #[error("incorrect proof error: {0}")] + IncorrectProof(String), + + /// The transition we are trying to prove was executed is invalid + #[error("invalid transition error: {0}")] + InvalidTransition(String), + + /// The transition we are trying to prove has an unknown contract + #[error("unknown contract in documents batch transition error: {0}")] + UnknownContract(String), + + /// We are trying to callback to retrieve a contract, but there was an error + #[error("the contract could not be retrieved during verification: {0}")] + ErrorRetrievingContract(String), + /// Incomplete proof error #[error("incomplete proof error: {0}")] IncompleteProof(&'static str), @@ -52,5 +69,9 @@ fn get_error_code(error: &ProofError) -> u32 { ProofError::IncompleteProof(_) => 6004, ProofError::IncorrectValueSize(_) => 6005, ProofError::IncorrectElementPath { .. } => 6006, + ProofError::IncorrectProof(_) => 6007, + ProofError::InvalidTransition(_) => 6008, + ProofError::UnknownContract(_) => 6009, + ProofError::ErrorRetrievingContract(_) => 6010, } } diff --git a/packages/rs-drive/src/error/query.rs b/packages/rs-drive/src/error/query.rs index ac7a6ce647..f472519ef0 100644 --- a/packages/rs-drive/src/error/query.rs +++ b/packages/rs-drive/src/error/query.rs @@ -1,3 +1,5 @@ +use sqlparser::parser::ParserError; + /// Query errors #[derive(Debug, thiserror::Error)] pub enum QuerySyntaxError { @@ -8,8 +10,11 @@ pub enum QuerySyntaxError { #[error("unsupported error: {0}")] Unsupported(String), /// Invalid SQL error + #[error("sql parsing error: {0}")] + SQLParsingError(#[from] ParserError), + /// Invalid SQL error #[error("invalid sql error: {0}")] - InvalidSQL(&'static str), + InvalidSQL(String), /// We asked for nothing #[error("no query items error: {0}")] @@ -39,7 +44,7 @@ pub enum QuerySyntaxError { InvalidBetweenClause(&'static str), /// Invalid in clause error #[error("invalid IN clause error: {0}")] - InvalidInClause(&'static str), + InvalidInClause(String), /// Invalid starts with clause error #[error("invalid STARTSWITH clause error: {0}")] InvalidStartsWithClause(&'static str), diff --git a/packages/rs-drive/src/fee_pools/epochs/mod.rs b/packages/rs-drive/src/fee_pools/epochs/mod.rs index f04253c1e5..35e18051e9 100644 --- a/packages/rs-drive/src/fee_pools/epochs/mod.rs +++ b/packages/rs-drive/src/fee_pools/epochs/mod.rs @@ -30,7 +30,11 @@ //! Epoch pools //! +#[cfg(any(feature = "full", feature = "verify"))] /// Epoch key constants module pub mod epoch_key_constants; + +#[cfg(feature = "full")] pub mod operations_factory; +#[cfg(any(feature = "full", feature = "verify"))] pub mod paths; diff --git a/packages/rs-drive/src/fee_pools/mod.rs b/packages/rs-drive/src/fee_pools/mod.rs index a38c12fd32..e6e74ccb33 100644 --- a/packages/rs-drive/src/fee_pools/mod.rs +++ b/packages/rs-drive/src/fee_pools/mod.rs @@ -27,27 +27,42 @@ // DEALINGS IN THE SOFTWARE. // +#[cfg(feature = "full")] +use crate::drive::batch::grovedb_op_batch::GroveDbOpBatchV0Methods; +#[cfg(feature = "full")] use crate::drive::batch::GroveDbOpBatch; +#[cfg(feature = "full")] use crate::drive::credit_pools::paths::pools_vec_path; +#[cfg(feature = "full")] use crate::error::Error; - -use crate::drive::batch::grovedb_op_batch::GroveDbOpBatchV0Methods; +#[cfg(feature = "full")] use crate::fee_pools::epochs::operations_factory::EpochOperations; +#[cfg(feature = "full")] use crate::fee_pools::epochs_root_tree_key_constants::{ KEY_PENDING_EPOCH_REFUNDS, KEY_STORAGE_FEE_POOL, KEY_UNPAID_EPOCH_INDEX, }; +#[cfg(feature = "full")] use dpp::balances::credits::Creditable; +#[cfg(feature = "full")] use dpp::block::epoch::{Epoch, EpochIndex}; +#[cfg(feature = "full")] use dpp::fee::epoch::{perpetual_storage_epochs, GENESIS_EPOCH_INDEX}; +#[cfg(feature = "full")] use dpp::fee::Credits; +#[cfg(feature = "full")] use grovedb::batch::GroveDbOp; +#[cfg(feature = "full")] use grovedb::Element; +#[cfg(any(feature = "full", feature = "verify"))] /// Epochs module pub mod epochs; + +#[cfg(any(feature = "full", feature = "verify"))] /// Epochs root tree key constants module pub mod epochs_root_tree_key_constants; +#[cfg(feature = "full")] /// Adds the operations to groveDB op batch to create the fee pool trees pub fn add_create_fee_pool_trees_operations( batch: &mut GroveDbOpBatch, @@ -72,11 +87,13 @@ pub fn add_create_fee_pool_trees_operations( Ok(()) } +#[cfg(feature = "full")] /// Adds operations to batch to create pending pool updates tree pub fn add_create_pending_epoch_refunds_tree_operations(batch: &mut GroveDbOpBatch) { batch.add_insert_empty_sum_tree(pools_vec_path(), KEY_PENDING_EPOCH_REFUNDS.to_vec()); } +#[cfg(feature = "full")] /// Updates the storage fee distribution pool with a new storage fee pub fn update_storage_fee_distribution_pool_operation( storage_fee: Credits, @@ -88,6 +105,7 @@ pub fn update_storage_fee_distribution_pool_operation( )) } +#[cfg(feature = "full")] /// Updates the unpaid epoch index pub fn update_unpaid_epoch_index_operation(epoch_index: EpochIndex) -> GroveDbOp { GroveDbOp::insert_op( diff --git a/packages/rs-drive/src/lib.rs b/packages/rs-drive/src/lib.rs index a0c00f38bf..51188eba9d 100644 --- a/packages/rs-drive/src/lib.rs +++ b/packages/rs-drive/src/lib.rs @@ -20,7 +20,7 @@ pub mod drive; #[cfg(any(feature = "full", feature = "verify"))] pub mod error; /// Fee pools module -#[cfg(feature = "full")] +#[cfg(any(feature = "full", feature = "verify"))] pub mod fee_pools; /// Query module #[cfg(any(feature = "full", feature = "verify"))] diff --git a/packages/rs-drive/src/query/conditions.rs b/packages/rs-drive/src/query/conditions.rs index 1532d36976..6e4dacf6db 100644 --- a/packages/rs-drive/src/query/conditions.rs +++ b/packages/rs-drive/src/query/conditions.rs @@ -30,6 +30,7 @@ //! Query Conditions //! +use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use grovedb::Query; use sqlparser::ast; use std::borrow::Cow; @@ -43,7 +44,7 @@ use WhereOperator::{ use crate::error::query::QuerySyntaxError; use crate::error::Error; use dpp::data_contract::document_type::methods::DocumentTypeV0Methods; -use dpp::data_contract::document_type::DocumentTypeRef; +use dpp::data_contract::document_type::{DocumentPropertyType, DocumentType, DocumentTypeRef}; use dpp::document::document_methods::DocumentMethodsV0; use dpp::document::Document; use dpp::platform_value::Value; @@ -195,7 +196,6 @@ impl WhereOperator { ast::BinaryOperator::GtEq => Some(WhereOperator::GreaterThanOrEquals), ast::BinaryOperator::Lt => Some(WhereOperator::LessThan), ast::BinaryOperator::LtEq => Some(WhereOperator::LessThanOrEquals), - ast::BinaryOperator::Like => Some(WhereOperator::StartsWith), _ => None, } } @@ -252,27 +252,27 @@ impl<'a> WhereClause { bytes.iter().map(|int| Value::U8(*int)).collect(), )), _ => Err(Error::Query(QuerySyntaxError::InvalidInClause( - "when using in operator you must provide an array of values", + "when using in operator you must provide an array of values".to_string(), ))), }?; let len = in_values.len(); if len == 0 { return Err(Error::Query(QuerySyntaxError::InvalidInClause( - "in clause must at least 1 value", + "in clause must have at least 1 value".to_string(), ))); } if len > 100 { return Err(Error::Query(QuerySyntaxError::InvalidInClause( - "in clause must at most 100 values", + "in clause must have at most 100 values".to_string(), ))); } // Throw an error if there are duplicates if (1..in_values.len()).any(|i| in_values[i..].contains(&in_values[i - 1])) { return Err(Error::Query(QuerySyntaxError::InvalidInClause( - "there should be no duplicates values for In query", + "there should be no duplicates values for In query".to_string(), ))); } Ok(in_values) @@ -1078,6 +1078,7 @@ impl<'a> WhereClause { /// Build where clauses from operations pub(crate) fn build_where_clauses_from_operations( binary_operation: &ast::Expr, + document_type: &DocumentType, where_clauses: &mut Vec, ) -> Result<(), Error> { match &binary_operation { @@ -1092,26 +1093,48 @@ impl<'a> WhereClause { ))); } - let field_name = if let ast::Expr::Identifier(ident) = &**expr { + let field_name: String = if let ast::Expr::Identifier(ident) = &**expr { ident.value.clone() } else { return Err(Error::Query(QuerySyntaxError::InvalidInClause( - "Invalid query: in clause should start with an identifier", + "Invalid query: in clause should start with an identifier".to_string(), ))); }; + let property_type = match field_name.as_str() { + "$id" | "$ownerId" => Cow::Owned(DocumentPropertyType::Identifier), + "$createdAt" | "$updatedAt" => Cow::Owned(DocumentPropertyType::Date), + "$revision" => Cow::Owned(DocumentPropertyType::Integer), + property_name => { + let Some(property) = document_type.properties().get(property_name) else { + return Err(Error::Query(QuerySyntaxError::InvalidInClause( + "Invalid query: in clause property not in document type" + .to_string(), + ))); + }; + Cow::Borrowed(&property.property_type) + } + }; + let mut in_values: Vec = Vec::new(); for value in list { if let ast::Expr::Value(sql_value) = value { - let cbor_val = sql_value_to_platform_value(sql_value.clone()).ok_or({ - Error::Query(QuerySyntaxError::InvalidSQL( - "Invalid query: unexpected value type", - )) - })?; - in_values.push(cbor_val); + let platform_value = + sql_value_to_platform_value(sql_value.clone()).ok_or({ + Error::Query(QuerySyntaxError::InvalidSQL( + "Invalid query: unexpected value type".to_string(), + )) + })?; + let transformed_value = if let Value::Text(text_value) = &platform_value { + property_type.value_from_string(text_value)? + } else { + platform_value + }; + + in_values.push(transformed_value); } else { return Err(Error::Query(QuerySyntaxError::InvalidSQL( - "Invalid query: expected a list of sql values", + "Invalid query: expected a list of sql values".to_string(), ))); } } @@ -1124,10 +1147,62 @@ impl<'a> WhereClause { Ok(()) } + ast::Expr::Like { + negated, + expr, + pattern, + escape_char, + } => { + let where_operator = WhereOperator::StartsWith; + if *negated { + return Err(Error::Query(QuerySyntaxError::Unsupported( + "Negated Like not supported".to_string(), + ))); + } + + let field_name: String = if let ast::Expr::Identifier(ident) = &**expr { + ident.value.clone() + } else { + panic!("unreachable: confirmed it's identifier variant"); + }; + + let transformed_value = if let ast::Expr::Value(value) = &**pattern { + let platform_value = sql_value_to_platform_value(value.clone()).ok_or({ + Error::Query(QuerySyntaxError::InvalidSQL( + "Invalid query: unexpected value type".to_string(), + )) + })?; + + // make sure the value is of the right format i.e prefix% + let inner_text = platform_value.as_text().ok_or({ + Error::Query(QuerySyntaxError::InvalidStartsWithClause( + "Invalid query: startsWith takes text", + )) + })?; + let match_locations: Vec<_> = inner_text.match_indices('%').collect(); + if match_locations.len() == 1 && match_locations[0].0 == inner_text.len() - 1 { + Value::Text(String::from(&inner_text[..(inner_text.len() - 1)])) + } else { + return Err(Error::Query(QuerySyntaxError::Unsupported( + "Invalid query: like can only be used to represent startswith" + .to_string(), + ))); + } + } else { + panic!("unreachable: confirmed it's value variant"); + }; + + where_clauses.push(WhereClause { + field: field_name, + operator: where_operator, + value: transformed_value, + }); + Ok(()) + } ast::Expr::BinaryOp { left, op, right } => { if *op == ast::BinaryOperator::And { - Self::build_where_clauses_from_operations(left, where_clauses)?; - Self::build_where_clauses_from_operations(right, where_clauses)?; + Self::build_where_clauses_from_operations(left, document_type, where_clauses)?; + Self::build_where_clauses_from_operations(right, document_type, where_clauses)?; } else { let mut where_operator = WhereOperator::from_sql_operator(op.clone()).ok_or(Error::Query( @@ -1150,42 +1225,44 @@ impl<'a> WhereClause { where_operator = where_operator.flip()?; } else { return Err(Error::Query(QuerySyntaxError::InvalidSQL( - "Invalid query: where clause should have field name and value", + "Invalid query: where clause should have field name and value" + .to_string(), ))); } - let field_name = if let ast::Expr::Identifier(ident) = identifier { + let field_name: String = if let ast::Expr::Identifier(ident) = identifier { ident.value.clone() } else { panic!("unreachable: confirmed it's identifier variant"); }; - let value = if let ast::Expr::Value(value) = value_expr { - let cbor_val = sql_value_to_platform_value(value.clone()).ok_or({ + let property_type = match field_name.as_str() { + "$id" | "$ownerId" => Cow::Owned(DocumentPropertyType::Identifier), + "$createdAt" | "$updatedAt" => Cow::Owned(DocumentPropertyType::Date), + "$revision" => Cow::Owned(DocumentPropertyType::Integer), + property_name => { + let Some(property) = document_type.properties().get(property_name) + else { + return Err(Error::Query(QuerySyntaxError::InvalidSQL(format!( + "Invalid query: property named {} not in document type", + field_name.as_str() + )))); + }; + Cow::Borrowed(&property.property_type) + } + }; + + let transformed_value = if let ast::Expr::Value(value) = value_expr { + let platform_value = sql_value_to_platform_value(value.clone()).ok_or({ Error::Query(QuerySyntaxError::InvalidSQL( - "Invalid query: unexpected value type", + "Invalid query: unexpected value type".to_string(), )) })?; - if where_operator == StartsWith { - // make sure the value is of the right format i.e prefix% - let inner_text = cbor_val.as_text().ok_or({ - Error::Query(QuerySyntaxError::InvalidStartsWithClause( - "Invalid query: startsWith takes text", - )) - })?; - let match_locations: Vec<_> = inner_text.match_indices('%').collect(); - if match_locations.len() == 1 - && match_locations[0].0 == inner_text.len() - 1 - { - Value::Text(String::from(&inner_text[..(inner_text.len() - 1)])) - } else { - return Err(Error::Query(QuerySyntaxError::Unsupported( - "Invalid query: like can only be used to represent startswith" - .to_string(), - ))); - } + + if let Value::Text(text_value) = &platform_value { + property_type.value_from_string(text_value)? } else { - cbor_val + platform_value } } else { panic!("unreachable: confirmed it's value variant"); @@ -1194,13 +1271,13 @@ impl<'a> WhereClause { where_clauses.push(WhereClause { field: field_name, operator: where_operator, - value, + value: transformed_value, }); } Ok(()) } _ => Err(Error::Query(QuerySyntaxError::InvalidSQL( - "Issue parsing sql: invalid selection format", + "Issue parsing sql: invalid selection format".to_string(), ))), } } diff --git a/packages/rs-drive/src/query/mod.rs b/packages/rs-drive/src/query/mod.rs index 7f3f9f0d01..6d1afdcf24 100644 --- a/packages/rs-drive/src/query/mod.rs +++ b/packages/rs-drive/src/query/mod.rs @@ -52,7 +52,7 @@ use sqlparser::ast::Value::Number; #[cfg(any(feature = "full", feature = "verify"))] use sqlparser::ast::{OrderByExpr, Select, Statement}; #[cfg(any(feature = "full", feature = "verify"))] -use sqlparser::dialect::GenericDialect; +use sqlparser::dialect::MySqlDialect; #[cfg(any(feature = "full", feature = "verify"))] use sqlparser::parser::Parser; @@ -643,18 +643,18 @@ impl<'a> DriveQuery<'a> { pub fn from_sql_expr( sql_string: &str, contract: &'a DataContract, - config: &DriveConfig, + config: Option<&DriveConfig>, ) -> Result { - let dialect: GenericDialect = sqlparser::dialect::GenericDialect {}; + let dialect: MySqlDialect = MySqlDialect {}; let statements: Vec = Parser::parse_sql(&dialect, sql_string) - .map_err(|_| Error::Query(QuerySyntaxError::InvalidSQL("Issue parsing sql")))?; + .map_err(|e| Error::Query(QuerySyntaxError::SQLParsingError(e)))?; // Should ideally iterate over each statement let first_statement = statements .first() .ok_or(Error::Query(QuerySyntaxError::InvalidSQL( - "Issue parsing sql", + "Issue parsing sql getting first statement".to_string(), )))?; let query: &ast::Query = match first_statement { @@ -662,23 +662,42 @@ impl<'a> DriveQuery<'a> { _ => None, } .ok_or(Error::Query(QuerySyntaxError::InvalidSQL( - "Issue parsing sql", + "Issue parsing sql: not a query".to_string(), )))?; + let max_limit = config + .map(|config| config.max_query_limit) + .unwrap_or(DriveConfig::default().max_query_limit); + let limit: u16 = if let Some(limit_expr) = &query.limit { match limit_expr { ast::Expr::Value(Number(num_string, _)) => { let cast_num_string: &String = num_string; - cast_num_string.parse::().ok() + let user_limit = cast_num_string.parse::().map_err(|e| { + Error::Query(QuerySyntaxError::InvalidLimit(format!( + "limit could not be parsed {}", + e + ))) + })?; + if user_limit > max_limit { + return Err(Error::Query(QuerySyntaxError::InvalidLimit(format!( + "limit {} greater than max limit {}", + user_limit, max_limit + )))); + } + user_limit + } + result => { + return Err(Error::Query(QuerySyntaxError::InvalidLimit(format!( + "expression not a limit {}", + result + )))); } - _ => None, } - .ok_or(Error::Query(QuerySyntaxError::InvalidLimit(format!( - "limit greater than max limit {}", - config.max_query_limit - ))))? } else { - config.default_query_limit + config + .map(|config| config.default_query_limit) + .unwrap_or(DriveConfig::default().default_query_limit) }; let order_by: IndexMap = query @@ -692,12 +711,12 @@ impl<'a> DriveQuery<'a> { .collect::>(); // Grab the select section of the query - let select: &Select = match &query.body { + let select: &Select = match &*query.body { ast::SetExpr::Select(select) => Some(select), _ => None, } .ok_or(Error::Query(QuerySyntaxError::InvalidSQL( - "Issue parsing sql", + "Issue parsing sql: Not a select".to_string(), )))?; // Get the document type from the 'from' section @@ -705,20 +724,15 @@ impl<'a> DriveQuery<'a> { .from .first() .ok_or(Error::Query(QuerySyntaxError::InvalidSQL( - "Invalid query: missing from section", + "Invalid query: missing from section".to_string(), )))? .relation { - Table { - name, - alias: _, - args: _, - with_hints: _, - } => name.0.first().as_ref().map(|identifier| &identifier.value), + Table { name, .. } => name.0.first().as_ref().map(|identifier| &identifier.value), _ => None, } .ok_or(Error::Query(QuerySyntaxError::InvalidSQL( - "Issue parsing sql: invalid from value", + "Issue parsing sql: invalid from value".to_string(), )))?; let document_type = @@ -745,6 +759,7 @@ impl<'a> DriveQuery<'a> { if let Some(selection_tree) = selection_tree { WhereClause::build_where_clauses_from_operations( selection_tree, + document_type, &mut all_where_clauses, )?; } diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/mod.rs index 08fcd022df..b535ae50a9 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/mod.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/mod.rs @@ -3,16 +3,18 @@ pub mod transformer; mod v0; use derive_more::From; + use dpp::identity::TimestampMillis; use dpp::platform_value::{Identifier, Value}; use std::collections::BTreeMap; use dpp::document::Document; + use dpp::ProtocolError; pub use v0::*; use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::{DocumentBaseTransitionAction}; -use dpp::version::{PlatformVersion}; +use dpp::version::PlatformVersion; /// document create transition action #[derive(Debug, Clone, From)] @@ -66,35 +68,35 @@ impl DocumentCreateTransitionActionAccessorsV0 for DocumentCreateTransitionActio } /// document from create transition -pub trait DocumentFromCreateTransition { - /// Attempts to create a new `Document` from the given `DocumentCreateTransition` reference and `owner_id`. +pub trait DocumentFromCreateTransitionAction { + /// Attempts to create a new `Document` from the given `DocumentCreateTransitionAction` reference and `owner_id`. /// /// # Arguments /// - /// * `value` - A reference to the `DocumentCreateTransition` containing information about the document being created. + /// * `value` - A reference to the `DocumentCreateTransitionAction` containing information about the document being created. /// * `owner_id` - The `Identifier` of the document's owner. /// /// # Returns /// /// * `Result` - A new `Document` object if successful, otherwise a `ProtocolError`. - fn try_from_create_transition( + fn try_from_create_transition_action( document_create_transition_action: &DocumentCreateTransitionAction, owner_id: Identifier, platform_version: &PlatformVersion, ) -> Result where Self: Sized; - /// Attempts to create a new `Document` from the given `DocumentCreateTransition` instance and `owner_id`. + /// Attempts to create a new `Document` from the given `DocumentCreateTransitionAction` instance and `owner_id`. /// /// # Arguments /// - /// * `value` - A `DocumentCreateTransition` instance containing information about the document being created. + /// * `value` - A `DocumentCreateTransitionAction` instance containing information about the document being created. /// * `owner_id` - The `Identifier` of the document's owner. /// /// # Returns /// /// * `Result` - A new `Document` object if successful, otherwise a `ProtocolError`. - fn try_from_owned_create_transition( + fn try_from_owned_create_transition_action( document_create_transition_action: DocumentCreateTransitionAction, owner_id: Identifier, platform_version: &PlatformVersion, @@ -103,47 +105,27 @@ pub trait DocumentFromCreateTransition { Self: Sized; } -impl DocumentFromCreateTransition for Document { - /// Attempts to create a new `Document` from the given `DocumentCreateTransition` reference and `owner_id`. - /// - /// # Arguments - /// - /// * `value` - A reference to the `DocumentCreateTransition` containing information about the document being created. - /// * `owner_id` - The `Identifier` of the document's owner. - /// - /// # Returns - /// - /// * `Result` - A new `Document` object if successful, otherwise a `ProtocolError`. - fn try_from_create_transition( +impl DocumentFromCreateTransitionAction for Document { + fn try_from_create_transition_action( document_create_transition_action: &DocumentCreateTransitionAction, owner_id: Identifier, platform_version: &PlatformVersion, ) -> Result { match document_create_transition_action { DocumentCreateTransitionAction::V0(v0) => { - Self::try_from_create_transition_v0(v0, owner_id, platform_version) + Self::try_from_create_transition_action_v0(v0, owner_id, platform_version) } } } - /// Attempts to create a new `Document` from the given `DocumentCreateTransition` instance and `owner_id`. - /// - /// # Arguments - /// - /// * `value` - A `DocumentCreateTransition` instance containing information about the document being created. - /// * `owner_id` - The `Identifier` of the document's owner. - /// - /// # Returns - /// - /// * `Result` - A new `Document` object if successful, otherwise a `ProtocolError`. - fn try_from_owned_create_transition( + fn try_from_owned_create_transition_action( document_create_transition_action: DocumentCreateTransitionAction, owner_id: Identifier, platform_version: &PlatformVersion, ) -> Result { match document_create_transition_action { DocumentCreateTransitionAction::V0(v0) => { - Self::try_from_owned_create_transition_v0(v0, owner_id, platform_version) + Self::try_from_owned_create_transition_action_v0(v0, owner_id, platform_version) } } } diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/mod.rs index d1e8265a11..74a0ee61bc 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/mod.rs @@ -9,6 +9,7 @@ use dpp::ProtocolError; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::document_type::methods::DocumentTypeV0Methods; + use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::{DocumentBaseTransitionAction, DocumentBaseTransitionActionV0}; use dpp::version::PlatformVersion; @@ -46,25 +47,25 @@ pub trait DocumentCreateTransitionActionAccessorsV0 { } /// documents from create transition v0 -pub trait DocumentFromCreateTransitionV0 { - /// Attempts to create a new `Document` from the given `DocumentCreateTransition` instance and `owner_id`. +pub trait DocumentFromCreateTransitionActionV0 { + /// Attempts to create a new `Document` from the given `DocumentCreateTransitionActionV0` instance and `owner_id`. /// /// # Arguments /// - /// * `value` - A `DocumentCreateTransition` instance containing information about the document being created. + /// * `value` - A `DocumentCreateTransitionActionV0` instance containing information about the document being created. /// * `owner_id` - The `Identifier` of the document's owner. /// /// # Returns /// /// * `Result` - A new `Document` object if successful, otherwise a `ProtocolError`. - fn try_from_owned_create_transition_v0( + fn try_from_owned_create_transition_action_v0( v0: DocumentCreateTransitionActionV0, owner_id: Identifier, platform_version: &PlatformVersion, ) -> Result where Self: Sized; - /// Attempts to create a new `Document` from the given `DocumentCreateTransition` reference and `owner_id`. + /// Attempts to create a new `Document` from the given `DocumentCreateTransitionActionV0` reference and `owner_id`. /// /// # Arguments /// @@ -74,7 +75,7 @@ pub trait DocumentFromCreateTransitionV0 { /// # Returns /// /// * `Result` - A new `Document` object if successful, otherwise a `ProtocolError`. - fn try_from_create_transition_v0( + fn try_from_create_transition_action_v0( v0: &DocumentCreateTransitionActionV0, owner_id: Identifier, platform_version: &PlatformVersion, @@ -83,18 +84,8 @@ pub trait DocumentFromCreateTransitionV0 { Self: Sized; } -impl DocumentFromCreateTransitionV0 for Document { - /// Attempts to create a new `Document` from the given `DocumentCreateTransition` reference and `owner_id`. - /// - /// # Arguments - /// - /// * `value` - A reference to the `DocumentCreateTransitionActionV0` containing information about the document being created. - /// * `owner_id` - The `Identifier` of the document's owner. - /// - /// # Returns - /// - /// * `Result` - A new `Document` object if successful, otherwise a `ProtocolError`. - fn try_from_create_transition_v0( +impl DocumentFromCreateTransitionActionV0 for Document { + fn try_from_create_transition_action_v0( v0: &DocumentCreateTransitionActionV0, owner_id: Identifier, platform_version: &PlatformVersion, @@ -143,17 +134,7 @@ impl DocumentFromCreateTransitionV0 for Document { } } - /// Attempts to create a new `Document` from the given `DocumentCreateTransition` instance and `owner_id`. - /// - /// # Arguments - /// - /// * `value` - A `DocumentCreateTransition` instance containing information about the document being created. - /// * `owner_id` - The `Identifier` of the document's owner. - /// - /// # Returns - /// - /// * `Result` - A new `Document` object if successful, otherwise a `ProtocolError`. - fn try_from_owned_create_transition_v0( + fn try_from_owned_create_transition_action_v0( v0: DocumentCreateTransitionActionV0, owner_id: Identifier, platform_version: &PlatformVersion, diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/mod.rs index 1bc0991e48..3569b4bc36 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/mod.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/mod.rs @@ -4,12 +4,13 @@ use std::collections::BTreeMap; use derive_more::From; -use dpp::platform_value::{Identifier, Value}; -pub use v0::*; use dpp::document::Document; use dpp::identity::TimestampMillis; +use dpp::platform_value::{Identifier, Value}; use dpp::prelude::Revision; use dpp::ProtocolError; +pub use v0::*; + use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionAction; use dpp::version::PlatformVersion; @@ -68,35 +69,35 @@ impl DocumentReplaceTransitionActionAccessorsV0 for DocumentReplaceTransitionAct } /// document from replace transition -pub trait DocumentFromReplaceTransition { - /// Attempts to create a new `Document` from the given `DocumentReplaceTransition` reference and `owner_id`. +pub trait DocumentFromReplaceTransitionAction { + /// Attempts to create a new `Document` from the given `DocumentReplaceTransitionAction` reference and `owner_id`. /// /// # Arguments /// - /// * `value` - A reference to the `DocumentReplaceTransition` containing information about the document being replaced. + /// * `value` - A reference to the `DocumentReplaceTransitionAction` containing information about the document being replaced. /// * `owner_id` - The `Identifier` of the document's owner. /// /// # Returns /// /// * `Result` - A new `Document` object if successful, otherwise a `ProtocolError`. - fn try_from_replace_transition( + fn try_from_replace_transition_action( document_replace_transition_action: &DocumentReplaceTransitionAction, owner_id: Identifier, platform_version: &PlatformVersion, ) -> Result where Self: Sized; - /// Attempts to create a new `Document` from the given `DocumentReplaceTransition` instance and `owner_id`. + /// Attempts to create a new `Document` from the given `DocumentReplaceTransitionAction` instance and `owner_id`. /// /// # Arguments /// - /// * `value` - A `DocumentReplaceTransition` instance containing information about the document being replaced. + /// * `value` - A `DocumentReplaceTransitionAction` instance containing information about the document being replaced. /// * `owner_id` - The `Identifier` of the document's owner. /// /// # Returns /// /// * `Result` - A new `Document` object if successful, otherwise a `ProtocolError`. - fn try_from_owned_replace_transition( + fn try_from_owned_replace_transition_action( document_replace_transition_action: DocumentReplaceTransitionAction, owner_id: Identifier, platform_version: &PlatformVersion, @@ -105,47 +106,27 @@ pub trait DocumentFromReplaceTransition { Self: Sized; } -impl DocumentFromReplaceTransition for Document { - /// Attempts to create a new `Document` from the given `DocumentReplaceTransition` reference and `owner_id`. - /// - /// # Arguments - /// - /// * `value` - A reference to the `DocumentReplaceTransition` containing information about the document being replaced. - /// * `owner_id` - The `Identifier` of the document's owner. - /// - /// # Returns - /// - /// * `Result` - A new `Document` object if successful, otherwise a `ProtocolError`. - fn try_from_replace_transition( +impl DocumentFromReplaceTransitionAction for Document { + fn try_from_replace_transition_action( document_replace_transition_action: &DocumentReplaceTransitionAction, owner_id: Identifier, platform_version: &PlatformVersion, ) -> Result { match document_replace_transition_action { DocumentReplaceTransitionAction::V0(v0) => { - Self::try_from_replace_transition_v0(v0, owner_id, platform_version) + Self::try_from_replace_transition_action_v0(v0, owner_id, platform_version) } } } - /// Attempts to create a new `Document` from the given `DocumentReplaceTransition` instance and `owner_id`. - /// - /// # Arguments - /// - /// * `value` - A `DocumentReplaceTransition` instance containing information about the document being replaced. - /// * `owner_id` - The `Identifier` of the document's owner. - /// - /// # Returns - /// - /// * `Result` - A new `Document` object if successful, otherwise a `ProtocolError`. - fn try_from_owned_replace_transition( + fn try_from_owned_replace_transition_action( document_replace_transition_action: DocumentReplaceTransitionAction, owner_id: Identifier, platform_version: &PlatformVersion, ) -> Result { match document_replace_transition_action { DocumentReplaceTransitionAction::V0(v0) => { - Self::try_from_owned_replace_transition_v0(v0, owner_id, platform_version) + Self::try_from_owned_replace_transition_action_v0(v0, owner_id, platform_version) } } } diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/v0/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/v0/mod.rs index 3da9163a22..5e1b75d016 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/v0/mod.rs @@ -6,6 +6,8 @@ use dpp::platform_value::{Identifier, Value}; use dpp::prelude::Revision; use dpp::ProtocolError; +use dpp::state_transition::documents_batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; + use std::collections::BTreeMap; use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::{DocumentBaseTransitionAction, DocumentBaseTransitionActionAccessorsV0}; @@ -45,7 +47,7 @@ pub trait DocumentReplaceTransitionActionAccessorsV0 { } /// document from replace transition v0 -pub trait DocumentFromReplaceTransitionV0 { +pub trait DocumentFromReplaceTransitionActionV0 { /// Attempts to create a new `Document` from the given `DocumentReplaceTransitionAction` reference and `owner_id`. /// /// # Arguments @@ -56,7 +58,7 @@ pub trait DocumentFromReplaceTransitionV0 { /// # Returns /// /// * `Result` - A new `Document` object if successful, otherwise a `ProtocolError`. - fn try_from_replace_transition_v0( + fn try_from_replace_transition_action_v0( value: &DocumentReplaceTransitionActionV0, owner_id: Identifier, platform_version: &PlatformVersion, @@ -73,7 +75,7 @@ pub trait DocumentFromReplaceTransitionV0 { /// # Returns /// /// * `Result` - A new `Document` object if successful, otherwise a `ProtocolError`. - fn try_from_owned_replace_transition_v0( + fn try_from_owned_replace_transition_action_v0( value: DocumentReplaceTransitionActionV0, owner_id: Identifier, platform_version: &PlatformVersion, @@ -82,18 +84,8 @@ pub trait DocumentFromReplaceTransitionV0 { Self: Sized; } -impl DocumentFromReplaceTransitionV0 for Document { - /// Attempts to create a new `Document` from the given `DocumentReplaceTransitionAction` reference and `owner_id`. - /// - /// # Arguments - /// - /// * `value` - A reference to the `DocumentReplaceTransitionAction` containing information about the document being created. - /// * `owner_id` - The `Identifier` of the document's owner. - /// - /// # Returns - /// - /// * `Result` - A new `Document` object if successful, otherwise a `ProtocolError`. - fn try_from_replace_transition_v0( +impl DocumentFromReplaceTransitionActionV0 for Document { + fn try_from_replace_transition_action_v0( value: &DocumentReplaceTransitionActionV0, owner_id: Identifier, platform_version: &PlatformVersion, @@ -130,17 +122,7 @@ impl DocumentFromReplaceTransitionV0 for Document { } } - /// Attempts to create a new `Document` from the given `DocumentReplaceTransitionAction` instance and `owner_id`. - /// - /// # Arguments - /// - /// * `value` - A `DocumentReplaceTransitionAction` instance containing information about the document being created. - /// * `owner_id` - The `Identifier` of the document's owner. - /// - /// # Returns - /// - /// * `Result` - A new `Document` object if successful, otherwise a `ProtocolError`. - fn try_from_owned_replace_transition_v0( + fn try_from_owned_replace_transition_action_v0( value: DocumentReplaceTransitionActionV0, owner_id: Identifier, platform_version: &PlatformVersion, diff --git a/packages/rs-drive/tests/query_tests.rs b/packages/rs-drive/tests/query_tests.rs index 3f0340141a..966136f105 100644 --- a/packages/rs-drive/tests/query_tests.rs +++ b/packages/rs-drive/tests/query_tests.rs @@ -2730,7 +2730,7 @@ fn test_family_sql_query() { .expect("should build query"); let sql_string = "select * from person order by firstName asc limit 100"; - let query2 = DriveQuery::from_sql_expr(sql_string, &contract, &DriveConfig::default()) + let query2 = DriveQuery::from_sql_expr(sql_string, &contract, Some(&DriveConfig::default())) .expect("should build query"); assert_eq!(query1, query2); @@ -2754,7 +2754,7 @@ fn test_family_sql_query() { .expect("should build query"); let sql_string = "select * from person where firstName = 'Chris'"; - let query2 = DriveQuery::from_sql_expr(sql_string, &contract, &DriveConfig::default()) + let query2 = DriveQuery::from_sql_expr(sql_string, &contract, Some(&DriveConfig::default())) .expect("should build query"); assert_eq!(query1, query2); @@ -2783,7 +2783,7 @@ fn test_family_sql_query() { let sql_string = "select * from person where firstName < 'Chris' order by firstName asc limit 100"; - let query2 = DriveQuery::from_sql_expr(sql_string, &contract, &DriveConfig::default()) + let query2 = DriveQuery::from_sql_expr(sql_string, &contract, Some(&DriveConfig::default())) .expect("should build query"); assert_eq!(query1, query2); @@ -2812,7 +2812,7 @@ fn test_family_sql_query() { let sql_string = "select * from person where firstName like 'C%' order by firstName asc limit 100"; - let query2 = DriveQuery::from_sql_expr(sql_string, &contract, &DriveConfig::default()) + let query2 = DriveQuery::from_sql_expr(sql_string, &contract, Some(&DriveConfig::default())) .expect("should build query"); assert_eq!(query1, query2); @@ -2841,7 +2841,7 @@ fn test_family_sql_query() { .expect("should build query"); let sql_string = "select * from person where firstName > 'Chris' and firstName <= 'Noellyn' order by firstName asc limit 100"; - let query2 = DriveQuery::from_sql_expr(sql_string, &contract, &DriveConfig::default()) + let query2 = DriveQuery::from_sql_expr(sql_string, &contract, Some(&DriveConfig::default())) .expect("should build query"); assert_eq!(query1, query2); @@ -2871,7 +2871,7 @@ fn test_family_sql_query() { let sql_string = "select * from person where firstName in ('a', 'b') order by firstName limit 100"; - let query2 = DriveQuery::from_sql_expr(sql_string, &contract, &DriveConfig::default()) + let query2 = DriveQuery::from_sql_expr(sql_string, &contract, Some(&DriveConfig::default())) .expect("should build query"); assert_eq!(query1, query2); diff --git a/packages/rs-platform-serialization/src/de/mod.rs b/packages/rs-platform-serialization/src/de/mod.rs index 3cdaf92619..b71ace8f6e 100644 --- a/packages/rs-platform-serialization/src/de/mod.rs +++ b/packages/rs-platform-serialization/src/de/mod.rs @@ -105,7 +105,10 @@ macro_rules! impl_platform_versioned_borrow_decode { decoder: &mut D, platform_version: &PlatformVersion, ) -> core::result::Result { - $crate::PlatformVersionedBorrowDecode::platform_versioned_borrow_decode( + // Here we directly call the platform_versioned_decode method from + // PlatformVersionedDecode, assuming it correctly handles decoding based + // on the platform version. + <$ty as $crate::PlatformVersionedDecode>::platform_versioned_decode( decoder, platform_version, ) diff --git a/packages/rs-platform-serialization/src/features/impl_std.rs b/packages/rs-platform-serialization/src/features/impl_std.rs index 119fe7dce0..620087e97b 100644 --- a/packages/rs-platform-serialization/src/features/impl_std.rs +++ b/packages/rs-platform-serialization/src/features/impl_std.rs @@ -14,7 +14,6 @@ use std::{ collections::{HashMap, HashSet}, ffi::{CStr, CString}, hash::Hash, - io::Read, net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6}, path::{Path, PathBuf}, sync::{Mutex, RwLock}, diff --git a/packages/rs-platform-value/src/value_serialization/de.rs b/packages/rs-platform-value/src/value_serialization/de.rs index e64a6fffa4..9971854a0f 100644 --- a/packages/rs-platform-value/src/value_serialization/de.rs +++ b/packages/rs-platform-value/src/value_serialization/de.rs @@ -134,7 +134,7 @@ impl<'de> de::Visitor<'de> for Visitor { } fn visit_seq>(self, mut acc: A) -> Result { match acc.size_hint() { - Some(size) if size == 1 => { + Some(1) => { let tag: u8 = acc .next_element()? .ok_or_else(|| de::Error::custom("expected tag"))?; diff --git a/packages/rs-platform-version/src/version/dpp_versions.rs b/packages/rs-platform-version/src/version/dpp_versions.rs index dd3999be5c..637645003f 100644 --- a/packages/rs-platform-version/src/version/dpp_versions.rs +++ b/packages/rs-platform-version/src/version/dpp_versions.rs @@ -95,6 +95,8 @@ pub struct PublicKeyInCreationMethodVersions { #[derive(Clone, Debug, Default)] pub struct StateTransitionConversionVersions { pub identity_to_identity_create_transition: FeatureVersion, + pub identity_to_identity_top_up_transition: FeatureVersion, + pub identity_to_identity_withdrawal_transition: FeatureVersion, pub identity_to_identity_create_transition_with_signer: FeatureVersion, } diff --git a/packages/rs-platform-version/src/version/drive_versions.rs b/packages/rs-platform-version/src/version/drive_versions.rs index afb7bcd623..364b8dd922 100644 --- a/packages/rs-platform-version/src/version/drive_versions.rs +++ b/packages/rs-platform-version/src/version/drive_versions.rs @@ -68,6 +68,7 @@ pub struct DriveVerifyMethodVersions { pub identity: DriveVerifyIdentityMethodVersions, pub single_document: DriveVerifySingleDocumentMethodVersions, pub system: DriveVerifySystemMethodVersions, + pub state_transition: DriveVerifyStateTransitionMethodVersions, } #[derive(Clone, Debug, Default)] @@ -108,6 +109,11 @@ pub struct DriveVerifySingleDocumentMethodVersions { pub verify_proof_keep_serialized: FeatureVersion, } +#[derive(Clone, Debug, Default)] +pub struct DriveVerifyStateTransitionMethodVersions { + pub verify_state_transition_was_executed_with_proof: FeatureVersion, +} + #[derive(Clone, Debug, Default)] pub struct DriveGroveMethodVersions { pub basic: DriveGroveBasicMethodVersions, diff --git a/packages/rs-platform-version/src/version/mocks/v2_test.rs b/packages/rs-platform-version/src/version/mocks/v2_test.rs index 840ba8582a..4ce52484ce 100644 --- a/packages/rs-platform-version/src/version/mocks/v2_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v2_test.rs @@ -63,7 +63,7 @@ use crate::version::drive_versions::{ DriveSystemProtocolVersionMethodVersions, DriveVerifyContractMethodVersions, DriveVerifyDocumentMethodVersions, DriveVerifyIdentityMethodVersions, DriveVerifyMethodVersions, DriveVerifySingleDocumentMethodVersions, - DriveVerifySystemMethodVersions, DriveVersion, + DriveVerifyStateTransitionMethodVersions, DriveVerifySystemMethodVersions, DriveVersion, }; use crate::version::mocks::TEST_BYTES; use crate::version::protocol_version::{FeatureVersionBounds, PlatformVersion}; @@ -262,6 +262,9 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { verify_upgrade_state: 0, verify_upgrade_vote_status: 0, }, + state_transition: DriveVerifyStateTransitionMethodVersions { + verify_state_transition_was_executed_with_proof: 0, + }, }, identity: DriveIdentityMethodVersions { fetch: DriveIdentityFetchMethodVersions { @@ -836,6 +839,8 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { }, state_transition_conversion_versions: StateTransitionConversionVersions { identity_to_identity_create_transition: 0, + identity_to_identity_top_up_transition: 0, + identity_to_identity_withdrawal_transition: 0, identity_to_identity_create_transition_with_signer: 0, }, state_transition_method_versions: StateTransitionMethodVersions { diff --git a/packages/rs-platform-version/src/version/mocks/v3_test.rs b/packages/rs-platform-version/src/version/mocks/v3_test.rs index 3e47bae6dc..abb9b8769a 100644 --- a/packages/rs-platform-version/src/version/mocks/v3_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v3_test.rs @@ -63,7 +63,7 @@ use crate::version::drive_versions::{ DriveSystemProtocolVersionMethodVersions, DriveVerifyContractMethodVersions, DriveVerifyDocumentMethodVersions, DriveVerifyIdentityMethodVersions, DriveVerifyMethodVersions, DriveVerifySingleDocumentMethodVersions, - DriveVerifySystemMethodVersions, DriveVersion, + DriveVerifyStateTransitionMethodVersions, DriveVerifySystemMethodVersions, DriveVersion, }; use crate::version::mocks::TEST_BYTES; use crate::version::protocol_version::{FeatureVersionBounds, PlatformVersion}; @@ -270,6 +270,9 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { verify_upgrade_state: 0, verify_upgrade_vote_status: 0, }, + state_transition: DriveVerifyStateTransitionMethodVersions { + verify_state_transition_was_executed_with_proof: 0, + }, }, identity: DriveIdentityMethodVersions { fetch: DriveIdentityFetchMethodVersions { @@ -836,6 +839,8 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { }, state_transition_conversion_versions: StateTransitionConversionVersions { identity_to_identity_create_transition: 0, + identity_to_identity_top_up_transition: 0, + identity_to_identity_withdrawal_transition: 0, identity_to_identity_create_transition_with_signer: 0, }, state_transition_method_versions: StateTransitionMethodVersions { diff --git a/packages/rs-platform-version/src/version/v1.rs b/packages/rs-platform-version/src/version/v1.rs index ca2ba27170..9cc56fa894 100644 --- a/packages/rs-platform-version/src/version/v1.rs +++ b/packages/rs-platform-version/src/version/v1.rs @@ -63,7 +63,7 @@ use crate::version::drive_versions::{ DriveSystemProtocolVersionMethodVersions, DriveVerifyContractMethodVersions, DriveVerifyDocumentMethodVersions, DriveVerifyIdentityMethodVersions, DriveVerifyMethodVersions, DriveVerifySingleDocumentMethodVersions, - DriveVerifySystemMethodVersions, DriveVersion, + DriveVerifyStateTransitionMethodVersions, DriveVerifySystemMethodVersions, DriveVersion, }; use crate::version::protocol_version::{FeatureVersionBounds, PlatformVersion}; use crate::version::{AbciStructureVersion, PlatformArchitectureVersion}; @@ -259,6 +259,9 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { verify_upgrade_state: 0, verify_upgrade_vote_status: 0, }, + state_transition: DriveVerifyStateTransitionMethodVersions { + verify_state_transition_was_executed_with_proof: 0, + }, }, identity: DriveIdentityMethodVersions { fetch: DriveIdentityFetchMethodVersions { @@ -833,6 +836,8 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { }, state_transition_conversion_versions: StateTransitionConversionVersions { identity_to_identity_create_transition: 0, + identity_to_identity_top_up_transition: 0, + identity_to_identity_withdrawal_transition: 0, identity_to_identity_create_transition_with_signer: 0, }, state_transition_method_versions: StateTransitionMethodVersions { diff --git a/packages/rs-sdk/Cargo.toml b/packages/rs-sdk/Cargo.toml index 5b615c2ea3..df526a355e 100644 --- a/packages/rs-sdk/Cargo.toml +++ b/packages/rs-sdk/Cargo.toml @@ -4,23 +4,19 @@ version = "1.0.0-dev.4" edition = "2021" [dependencies] -dpp = { path = "../rs-dpp", features = [ - "client", - "validation", - "identity-value-conversion", -] } +dpp = { path = "../rs-dpp", features = ["all_features"] } dapi-grpc = { path = "../dapi-grpc", features = ["client"] } rs-dapi-client = { path = "../rs-dapi-client", default-features = false } drive = { path = "../rs-drive", default-features = false, features = [ "verify", ] } drive-proof-verifier = { path = "../rs-drive-proof-verifier" } -# drive-abci is only needed for core rpc; TODO remove once we have correct core rpc impl -drive-abci = { path = "../rs-drive-abci", default-features = false } +dapi-grpc-macros = { path = "../rs-dapi-grpc-macros" } bincode = { version = "2.0.0-rc.3", features = ["serde"], optional = true } thiserror = "1.0.47" tokio = { version = "1.32.0", features = ["macros"] } +tokio-util = { version = "0.7.8" } async-trait = { version = "0.1.73" } http = { version = "0.2.9" } ciborium = { git = "https://github.com/qrayven/ciborium", branch = "feat-ser-null-as-undefined" } @@ -34,6 +30,9 @@ futures = { version = "0.3.28" } derive_more = { version = "0.99.16" } # dashcore-rpc is only needed for core rpc; TODO remove once we have correct core rpc impl dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.2" } +lru = { version = "0.12.2", optional = true } +bip37-bloom-filter = { git = "https://github.com/dashpay/rs-bip37-bloom-filter", branch = "develop" } + [dev-dependencies] rs-dapi-client = { path = "../rs-dapi-client", features = ["mocks"] } @@ -46,6 +45,7 @@ dpp = { path = "../rs-dpp", features = [ ] } data-contracts = { path = "../data-contracts" } tokio-test = { version = "0.4.3" } +clap = { version = "4.4.18", features = ["derive"] } [features] default = ["mocks", "offline-testing"] @@ -61,6 +61,7 @@ mocks = [ "dep:hex", "dep:dotenvy", "dep:envy", + "dep:lru", ] # Run integration tests using test vectors from `tests/vectors/` instead of connecting to live Dash Platform. @@ -85,3 +86,9 @@ network-testing = ["mocks"] # dump all requests and responses to `tests/vectors/`, # so that they can be used later for `offline-testing`. generate-test-vectors = ["network-testing"] + + +[[example]] + +name = "read_contract" +required-features = ["mocks"] diff --git a/packages/rs-sdk/README.md b/packages/rs-sdk/README.md index 0d6bba8dce..31945bd0a2 100644 --- a/packages/rs-sdk/README.md +++ b/packages/rs-sdk/README.md @@ -4,12 +4,52 @@ This is the official Rust SDK for the Dash Platform. Dash Platform is a Layer 2 See Rust documentation of this crate for more details. +## Quick start + +### Cargo.toml + +To use this crate, define it as a dependency in your `Cargo.toml`: + +```toml +[dependencies] + +dash-platform-sdk = { git="https://github.com/dashpay/platform"0 } +``` + +### Implementing Dash Platform SDK application + +In order to build application that uses Dash Platform SDK, you need to: + +1. Implement a [Wallet](src/wallet.rs) that will store, manage and use your keys to sign transactions and state transitions. + An example implementation of wallet can be found in [src/mock/wallet.rs](src/mock/wallet.rs). +2. Implement Dash SPV client that will sync your application with Dash Core state, including quorum public keys. + + TODO: Add more details here. + + For testing and development purposes, while you don't have your SPV client implementation ready, you can setup local Dash Core node and access it using RPC interface (see below). + +3. Implement `ContextProvider` gives Dash Platform SDK access to state of your application, like: + * quorum public keys retrieved using SPV, + * data contracts configured and/or fetched from the server. + + See [GrpcContextProvider](../rs-sdk/src/mock/provider.rs) for an example implementation. + +### Mocking + +Dash Platform SDK supports mocking with `mocks` feature which provides a +convenient way to define mock expectations and use the SDK without actual +connection to the Platform. + +You can see examples of mocking in [mock_fetch.rs](tests/fetch/mock_fetch.rs) and [mock_fetch_many.rs](tests/fetch/mock_fetch_many.rs). + ## Examples You can find quick start example in `examples/` folder. Examples must be configured by setting constants. You can also inspect tests in `tests/` folder for more detailed examples. +Also refer to [Platform Explorer](https://github.com/dashpay/rs-platform-explorer/) which uses the SDK to execute various state transitions. + ## Tests This section provides instructions on how to test the RS-SDK for Dash Platform. The tests can be run in two modes: **offline** (without connectivity to the Dash Platform) and **network** (with connectivity to the Dash Platform). **Offline** mode is the default one. @@ -54,7 +94,7 @@ To generate test vectors: Run the offline test using the following command: ```bash -cargo test -p rs-sdk +cargo test -p dash-platform-sdk ``` ## Implementing Fetch and FetchAny on new objects diff --git a/packages/rs-sdk/examples/read_contract.rs b/packages/rs-sdk/examples/read_contract.rs index 03c7ed76a4..5178858fc7 100644 --- a/packages/rs-sdk/examples/read_contract.rs +++ b/packages/rs-sdk/examples/read_contract.rs @@ -1,41 +1,102 @@ -use std::str::FromStr; +use std::{num::NonZeroUsize, str::FromStr, sync::Arc}; +use clap::Parser; use dpp::prelude::{DataContract, Identifier}; use rs_dapi_client::AddressList; -use rs_sdk::platform::Fetch; +use rs_sdk::{mock::provider::GrpcContextProvider, platform::Fetch, Sdk, SdkBuilder}; -pub const PLATFORM_IP: &str = "127.0.0.1"; -pub const CORE_PORT: u16 = 20002; -pub const CORE_USER: &str = "someuser"; -pub const CORE_PASSWORD: &str = "verysecretpassword"; -pub const PLATFORM_PORT: u16 = 2443; +#[derive(clap::Parser, Debug)] +#[command(version)] +pub struct Config { + /// Dash Platform server hostname or IPv4 address + #[arg(short = 'i', long = "address")] + pub server_address: String, + + /// Dash Core IP port + #[arg(short = 'c', long)] + pub core_port: u16, + + // Dash Core RPC user + #[arg(short = 'u', long)] + pub core_user: String, + + // Dash Core RPC password + #[arg(short = 'p', long)] + pub core_password: String, + + /// Dash Platform DAPI port + #[arg(short = 'd', long)] + pub platform_port: u16, +} /// Read data contract. /// /// This example demonstrates how to connect to running platform and try to read a data contract. +/// TODO: add wallet, context provider, etc. #[tokio::main(flavor = "multi_thread", worker_threads = 1)] async fn main() { // Replace const below with data contract identifier of data contract, 32 bytes const DATA_CONTRACT_ID_BYTES: [u8; 32] = [1; 32]; - // Configure the SDK to connect to the Platform. - // Note that in future versions of the SDK, core user and password will not be needed. - let uri = http::Uri::from_str(&format!("http://{}:{}", PLATFORM_IP, PLATFORM_PORT)) - .expect("platform address uri"); - let mut sdk = rs_sdk::SdkBuilder::new(AddressList::from_iter([uri])) - .with_core(PLATFORM_IP, CORE_PORT, CORE_USER, CORE_PASSWORD) - .build() - .expect("cannot initialize api"); + // Read configuration + let config = Config::parse(); + // Configure the Sdk + let sdk = setup_sdk(&config); + + // read data contract // Convert bytes to identifier object that can be used as a Query let id = Identifier::from_bytes(&DATA_CONTRACT_ID_BYTES).expect("parse data contract id"); // Fetch identity from the Platform - let contract: Option = DataContract::fetch(&mut sdk, id) - .await - .expect("fetch identity"); + let contract: Option = + DataContract::fetch(&sdk, id).await.expect("fetch identity"); // Check the result; note that in our case, we expect to not find the data contract, as the // identifier is not valid. assert!(contract.is_none(), "result: {:?}", contract); } + +/// Setup Rust SDK +fn setup_sdk(config: &Config) -> Arc { + // We need to implement a ContextProvider. + // Here, we will just use a mock implementation. + // Tricky thing here is that this implementation requires SDK, so we have a + // circular dependency between SDK and ContextProvider. + // We'll first provide `None` Sdk, and then update it later. + // + // To modify context provider, we need locks and Arc to overcome ownership rules. + let context_provider = GrpcContextProvider::new( + None, + &config.server_address, + config.core_port, + &config.core_user, + &config.core_password, + NonZeroUsize::new(100).expect("data contracts cache size"), + NonZeroUsize::new(100).expect("quorum public keys cache size"), + ) + .expect("context provider"); + let context_provider = Arc::new(std::sync::Mutex::new(context_provider)); + + // Let's build the Sdk. + // First, we need an URI of some Dash Platform DAPI host to connect to and use as seed. + let uri = http::Uri::from_str(&format!( + "http://{}:{}", + config.server_address, config.platform_port + )) + .expect("parse uri"); + + // Now, we create the Sdk with the wallet and context provider. + let sdk = SdkBuilder::new(AddressList::from_iter([uri])) + .with_context_provider(Arc::clone(&context_provider)) + .build() + .expect("cannot build sdk"); + + // Reconfigure context provider with Sdk + let mut guard = context_provider.lock().expect("lock context provider"); + guard.set_sdk(Some(Arc::clone(&sdk))); + drop(guard); + + // Return the SDK we created + sdk +} diff --git a/packages/rs-sdk/scripts/generate_test_vectors.sh b/packages/rs-sdk/scripts/generate_test_vectors.sh index 240b1a8e4a..209052a735 100755 --- a/packages/rs-sdk/scripts/generate_test_vectors.sh +++ b/packages/rs-sdk/scripts/generate_test_vectors.sh @@ -24,7 +24,7 @@ if [ -z "$1" ]; then rm -f "${CARGO_DIR}"/tests/vectors/* fi -cargo test -p rs-sdk \ +cargo test -p dash-platform-sdk \ --no-default-features \ --features generate-test-vectors \ "$1" diff --git a/packages/rs-sdk/src/core.rs b/packages/rs-sdk/src/core.rs deleted file mode 100644 index 16e5f6f9fb..0000000000 --- a/packages/rs-sdk/src/core.rs +++ /dev/null @@ -1,79 +0,0 @@ -//! Core RPC client used to retrieve quorum keys from core. -//! -//! TODO: This is a temporary implementation, effective until we integrate SPV -//! into rs-sdk. - -use dashcore_rpc::{ - dashcore::{hashes::Hash, QuorumHash}, - dashcore_rpc_json::QuorumType, -}; -use drive_abci::rpc::core::{CoreRPCLike, DefaultCoreRPC}; -use drive_proof_verifier::QuorumInfoProvider; -use std::sync::Mutex; - -use crate::error::Error; - -/// Core RPC client that can be used to retrieve quorum keys from core. -/// -/// Implements [`QuorumInfoProvider`] trait. -/// -/// TODO: This is a temporary implementation, effective until we integrate SPV. -pub struct CoreClient { - core: Mutex>, -} - -impl CoreClient { - /// Create new Dash Core client. - /// - /// # Arguments - /// - /// * `server_address` - Dash Core server address. - /// * `core_port` - Dash Core port. - /// * `core_user` - Dash Core user. - /// * `core_password` - Dash Core password. - pub fn new( - server_address: &str, - core_port: u16, - core_user: &str, - core_password: &str, - ) -> Result { - let core_addr = format!("http://{}:{}", server_address, core_port); - let core = - DefaultCoreRPC::open(&core_addr, core_user.to_string(), core_password.to_string())?; - - Ok(Self { - core: Mutex::new(Box::new(core)), - }) - } -} - -impl QuorumInfoProvider for CoreClient { - fn get_quorum_public_key( - &self, - quorum_type: u32, - quorum_hash: [u8; 32], - _core_chain_locked_height: u32, - ) -> Result<[u8; 48], drive_proof_verifier::Error> { - let quorum_hash = QuorumHash::from_slice(&quorum_hash).map_err(|e| { - drive_proof_verifier::Error::InvalidQuorum { - error: e.to_string(), - } - })?; - - let core = self.core.lock().expect("Core lock poisoned"); - let quorum_info = core - .get_quorum_info(QuorumType::from(quorum_type), &quorum_hash, None) - .map_err( - |e: dashcore_rpc::Error| drive_proof_verifier::Error::InvalidQuorum { - error: e.to_string(), - }, - )?; - let key = quorum_info.quorum_public_key; - let pubkey = as TryInto<[u8; 48]>>::try_into(key).map_err(|_e| { - drive_proof_verifier::Error::InvalidQuorum { - error: "quorum public key is not 48 bytes long".to_string(), - } - })?; - Ok(pubkey) - } -} diff --git a/packages/rs-sdk/src/core/mod.rs b/packages/rs-sdk/src/core/mod.rs new file mode 100644 index 0000000000..ed7d4726cf --- /dev/null +++ b/packages/rs-sdk/src/core/mod.rs @@ -0,0 +1,4 @@ +//! Dash Core SDK implementation. +//! +//! TODO: This is work in progress. +mod transaction; diff --git a/packages/rs-sdk/src/core/transaction.rs b/packages/rs-sdk/src/core/transaction.rs new file mode 100644 index 0000000000..a7046a2fdb --- /dev/null +++ b/packages/rs-sdk/src/core/transaction.rs @@ -0,0 +1,275 @@ +use crate::{Error, Sdk}; +use bip37_bloom_filter::{BloomFilter, BloomFilterData}; +use dapi_grpc::core::v0::{ + transactions_with_proofs_request, transactions_with_proofs_response, GetTransactionRequest, + GetTransactionResponse, TransactionsWithProofsRequest, TransactionsWithProofsResponse, +}; +use dapi_grpc::platform::v0::{ + get_epochs_info_request, get_epochs_info_response, GetEpochsInfoRequest, GetEpochsInfoResponse, +}; +use dpp::dashcore::consensus::Decodable; +use dpp::dashcore::{Address, InstantLock, MerkleBlock, OutPoint, Transaction, Txid}; +use dpp::identity::state_transition::asset_lock_proof::chain::ChainAssetLockProof; +use dpp::identity::state_transition::asset_lock_proof::InstantAssetLockProof; +use dpp::prelude::AssetLockProof; + +use rs_dapi_client::{DapiRequestExecutor, RequestSettings}; +use std::time::Duration; +use tokio::time::{sleep, timeout}; + +impl Sdk { + /// Starts the stream to listen for instant send lock messages + pub async fn start_instant_send_lock_stream( + &self, + from_block_hash: Vec, + address: &Address, + ) -> Result, Error> { + let address_bytes = address.as_unchecked().payload_to_vec(); + + // create the bloom filter + let bloom_filter = BloomFilter::builder(1, 0.001) + .expect("this FP rate allows up to 10000 items") + .add_element(&address_bytes) + .build(); + + let bloom_filter_proto = { + let BloomFilterData { + v_data, + n_hash_funcs, + n_tweak, + n_flags, + } = bloom_filter.into(); + dapi_grpc::core::v0::BloomFilter { + v_data, + n_hash_funcs, + n_tweak, + n_flags, + } + }; + + let core_transactions_stream = TransactionsWithProofsRequest { + bloom_filter: Some(bloom_filter_proto), + count: 0, // Subscribing to new transactions as well + send_transaction_hashes: true, + from_block: Some(transactions_with_proofs_request::FromBlock::FromBlockHash( + from_block_hash, + )), + }; + self.execute(core_transactions_stream, RequestSettings::default()) + .await + .map_err(|e| Error::DapiClientError(e.to_string())) + } + + /// Waits for a response for the asset lock proof + pub async fn wait_for_asset_lock_proof_for_transaction( + &self, + mut stream: dapi_grpc::tonic::Streaming, + transaction: &Transaction, + time_out: Option, + ) -> Result { + let transaction_id = transaction.txid(); + + let _span = tracing::debug_span!( + "wait_for_asset_lock_proof_for_transaction", + transaction_id = transaction_id.to_string(), + ) + .entered(); + + tracing::debug!("waiting for messages from stream"); + + // Define an inner async block to handle the stream processing. + let stream_processing = async { + loop { + // TODO: We should retry if Err is returned + let message = stream + .message() + .await + .map_err(|e| Error::DapiClientError(format!("can't receive message: {e}")))?; + + let Some(TransactionsWithProofsResponse { responses }) = message else { + return Err(Error::DapiClientError( + "stream closed unexpectedly".to_string(), + )); + }; + + match responses { + Some( + transactions_with_proofs_response::Responses::InstantSendLockMessages( + instant_send_lock_messages, + ), + ) => { + tracing::debug!( + "received {} instant lock message(s)", + instant_send_lock_messages.messages.len() + ); + + for instant_lock_bytes in instant_send_lock_messages.messages { + let instant_lock = + InstantLock::consensus_decode(&mut instant_lock_bytes.as_slice()) + .map_err(|e| { + tracing::error!("invalid asset lock: {}", e); + + Error::CoreError(e.into()) + })?; + + if instant_lock.txid == transaction_id { + let asset_lock_proof = + AssetLockProof::Instant(InstantAssetLockProof { + instant_lock, + transaction: transaction.clone(), + output_index: 0, + }); + + tracing::debug!( + ?asset_lock_proof, + "instant lock is matching to the broadcasted transaction, returning instant asset lock proof" + ); + + return Ok(asset_lock_proof); + } else { + tracing::debug!( + "instant lock is not matching, waiting for the next message" + ); + } + } + } + Some(transactions_with_proofs_response::Responses::RawMerkleBlock( + raw_merkle_block, + )) => { + tracing::debug!("received merkle block"); + + let merkle_block = + MerkleBlock::consensus_decode(&mut raw_merkle_block.as_slice()) + .map_err(|e| { + tracing::error!("can't decode merkle block: {}", e); + + Error::CoreError(e.into()) + })?; + + let mut matches: Vec = vec![]; + let mut index: Vec = vec![]; + + merkle_block.extract_matches(&mut matches, &mut index)?; + + // Continue receiving messages until we find the transaction + if !matches.contains(&transaction_id) { + tracing::debug!( + "merkle block doesn't contain the transaction, waiting for the next message" + ); + + continue; + } + + tracing::debug!( + "merkle block contains the transaction, obtaining core chain locked height" + ); + + // TODO: This a temporary implementation until we have headers stream running in background + // so we can always get actual height and chain locks + + // Wait until the block is chainlocked + let mut core_chain_locked_height; + loop { + let GetTransactionResponse { + height, + is_chain_locked, + .. + } = self + .execute( + GetTransactionRequest { + id: transaction_id.to_string(), + }, + RequestSettings::default(), + ) + .await?; + + core_chain_locked_height = height; + + if is_chain_locked { + break; + } + + tracing::trace!("the transaction is on height {} but not chainlocked. try again in 1 sec", height); + + sleep(Duration::from_secs(1)).await; + } + + tracing::debug!( + "the transaction is chainlocked on height {}, waiting platform for reaching the same core height", + core_chain_locked_height + ); + + // Wait until platform chain is on the block's chain locked height + loop { + let request = GetEpochsInfoRequest { + version: Some(get_epochs_info_request::Version::V0( + get_epochs_info_request::GetEpochsInfoRequestV0 { + start_epoch: Some(0), + count: 1, + ..Default::default() + }, + )), + }; + + let GetEpochsInfoResponse { + version: + Some(get_epochs_info_response::Version::V0( + get_epochs_info_response::GetEpochsInfoResponseV0 { + metadata: Some(metadata), + .. + }, + )), + } = self.execute(request, RequestSettings::default()).await? + else { + return Err(Error::DapiClientError(String::from( + "missing V0 `metadata` field", + ))); + }; + + if metadata.core_chain_locked_height >= core_chain_locked_height { + break; + } + + tracing::trace!( + "platform chain locked core height {} but we need {}. try again in 1 sec", + metadata.core_chain_locked_height, + core_chain_locked_height, + ); + + sleep(Duration::from_secs(1)).await; + } + + let asset_lock_proof = AssetLockProof::Chain(ChainAssetLockProof { + core_chain_locked_height, + out_point: OutPoint { + txid: transaction.txid(), + vout: 0, + }, + }); + + tracing::debug!( + ?asset_lock_proof, + "merkle block contains the broadcasted transaction, returning chain asset lock proof" + ); + + return Ok(asset_lock_proof); + } + Some(transactions_with_proofs_response::Responses::RawTransactions(_)) => { + tracing::trace!("received transaction(s), ignoring") + } + None => tracing::trace!( + "received empty response as a workaround for the bug in tonic, ignoring" + ), + } + } + }; + + // Apply the timeout if `time_out_ms` is Some, otherwise just await the processing. + match time_out { + Some(duration) => timeout(duration, stream_processing).await.map_err(|_| { + Error::TimeoutReached(duration, String::from("receiving asset lock proof")) + })?, + None => stream_processing.await, + } + } +} diff --git a/packages/rs-sdk/src/core_client.rs b/packages/rs-sdk/src/core_client.rs new file mode 100644 index 0000000000..228ea3e5b9 --- /dev/null +++ b/packages/rs-sdk/src/core_client.rs @@ -0,0 +1,125 @@ +//! Core RPC client used to retrieve quorum keys from core. +//! +//! TODO: This is a temporary implementation, effective until we integrate SPV +//! into dash-platform-sdk. + +use dashcore_rpc::{ + dashcore::{hashes::Hash, Amount, QuorumHash}, + dashcore_rpc_json as json, Auth, Client, RpcApi, +}; +use drive_proof_verifier::error::ContextProviderError; +use std::{fmt::Debug, sync::Mutex}; + +use crate::error::Error; + +/// Core RPC client that can be used to retrieve quorum keys from core. +/// +/// Implements [`ContextProvider`] trait. +/// +/// TODO: This is a temporary implementation, effective until we integrate SPV. +pub struct CoreClient { + core: Mutex, + server_address: String, + core_user: String, + core_port: u16, +} + +impl Debug for CoreClient { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("CoreClient") + .field("server_address", &self.server_address) + .field("core_user", &self.core_user) + .field("core_port", &self.core_port) + .finish() + } +} + +impl CoreClient { + /// Create new Dash Core client. + /// + /// # Arguments + /// + /// * `server_address` - Dash Core server address. + /// * `core_port` - Dash Core port. + /// * `core_user` - Dash Core user. + /// * `core_password` - Dash Core password. + pub fn new( + server_address: &str, + core_port: u16, + core_user: &str, + core_password: &str, + ) -> Result { + let addr = format!("http://{}:{}", server_address, core_port); + let core = Client::new( + &addr, + Auth::UserPass(core_user.to_string(), core_password.to_string()), + ) + .map_err(Error::CoreClientError)?; + + Ok(Self { + core: Mutex::new(core), + server_address: server_address.to_string(), + core_user: core_user.to_string(), + core_port, + }) + } +} + +// Wallet functions +impl CoreClient { + /// List unspent transactions + /// + /// ## Arguments + /// + /// * `minimum_sum_satoshi` - Minimum total sum of all returned unspent transactions + /// + /// ## See also + /// + /// * [Dash Core documentation](https://docs.dash.org/projects/core/en/stable/docs/api/remote-procedure-calls-wallet.html#listunspent) + pub fn list_unspent( + &self, + minimum_sum_satoshi: Option, + ) -> Result, Error> { + let options = json::ListUnspentQueryOptions { + minimum_sum_amount: minimum_sum_satoshi.map(Amount::from_sat), + ..Default::default() + }; + + self.core + .lock() + .expect("Core lock poisoned") + .list_unspent(None, None, None, None, Some(options)) + .map_err(Error::CoreClientError) + } + + /// Return address to which change of transaction can be sent. + pub fn get_balance(&self) -> Result { + self.core + .lock() + .expect("Core lock poisoned") + .get_balance(None, None) + .map_err(Error::CoreClientError) + } + + /// Retrieve quorum public key from core. + pub fn get_quorum_public_key( + &self, + quorum_type: u32, + quorum_hash: [u8; 32], + ) -> Result<[u8; 48], ContextProviderError> { + let quorum_hash = QuorumHash::from_slice(&quorum_hash) + .map_err(|e| ContextProviderError::InvalidQuorum(e.to_string()))?; + + let core = self.core.lock().expect("Core lock poisoned"); + let quorum_info = core + .get_quorum_info(json::QuorumType::from(quorum_type), &quorum_hash, None) + .map_err(|e: dashcore_rpc::Error| ContextProviderError::InvalidQuorum(e.to_string()))?; + let key = quorum_info.quorum_public_key; + let pubkey = as TryInto<[u8; 48]>>::try_into(key).map_err(|_e| { + ContextProviderError::InvalidQuorum( + "quorum public key is not 48 bytes long".to_string(), + ) + })?; + Ok(pubkey) + } +} diff --git a/packages/rs-sdk/src/error.rs b/packages/rs-sdk/src/error.rs index a1cd6096c9..5b68ff6246 100644 --- a/packages/rs-sdk/src/error.rs +++ b/packages/rs-sdk/src/error.rs @@ -1,9 +1,14 @@ //! Definitions of errors use std::fmt::Debug; +use std::time::Duration; +use dpp::bls_signatures::BlsError; +use dpp::version::PlatformVersionError; use dpp::ProtocolError; use rs_dapi_client::DapiClientError; +pub use drive_proof_verifier::error::ContextProviderError; + /// Error type for the SDK #[derive(Debug, thiserror::Error)] pub enum Error { @@ -19,9 +24,18 @@ pub enum Error { /// Proof verification error #[error("Proof verification error: {0}")] Proof(#[from] drive_proof_verifier::Error), + /// Invalid Proved Response error + #[error("Invalid Proved Response error: {0}")] + InvalidProvedResponse(String), /// DAPI client error, for example, connection error #[error("Dapi client error: {0}")] DapiClientError(String), + /// Dash core error + #[error("Dash core error: {0}")] + CoreError(#[from] dpp::dashcore::Error), + /// MerkleBlockError + #[error("Dash core error: {0}")] + MerkleBlockError(#[from] dpp::dashcore::merkle_tree::MerkleBlockError), /// Core client error, for example, connection error #[error("Core client error: {0}")] CoreClientError(#[from] dashcore_rpc::Error), @@ -31,6 +45,25 @@ pub enum Error { /// Epoch not found; we must have at least one epoch #[error("No epoch found on the Platform; it should never happen")] EpochNotFound, + /// SDK operation timeout reached error + #[error("SDK operation timeout {} secs reached: {1}", .0.as_secs())] + TimeoutReached(Duration, String), + /// Generic error + // TODO: Use domain specific errors instead of generic ones + #[error("SDK error: {0}")] + Generic(String), + + /// Cryptographic error + #[error("Cryptographic error: {0}")] + CryptoError(#[from] BlsError), + + /// Context provider error + #[error("Context provider error: {0}")] + ContextProviderError(#[from] ContextProviderError), + + /// Operation cancelled - cancel token was triggered, timeout, etc. + #[error("Operation cancelled: {0}")] + Cancelled(String), } impl From> for Error { @@ -38,3 +71,9 @@ impl From> for Error { Self::DapiClientError(format!("{:?}", value)) } } + +impl From for Error { + fn from(value: PlatformVersionError) -> Self { + Self::Protocol(value.into()) + } +} diff --git a/packages/rs-sdk/src/lib.rs b/packages/rs-sdk/src/lib.rs index f7d66d3ab4..d1e5918caf 100644 --- a/packages/rs-sdk/src/lib.rs +++ b/packages/rs-sdk/src/lib.rs @@ -44,7 +44,7 @@ //! //! ## Error handling //! -//! Errors of type [Error] are returned by the rs-sdk. Note that missing objects ("not found") are not +//! Errors of type [Error] are returned by the dash-platform-sdk. Note that missing objects ("not found") are not //! treated as errors; `Ok(None)` is returned instead. //! //! Mocking functions often panic instead of returning an error. @@ -61,12 +61,14 @@ #![allow(rustdoc::private_intra_doc_links)] pub mod core; +mod core_client; pub mod error; pub mod mock; pub mod platform; pub mod sdk; + pub use error::Error; -pub use sdk::{Sdk, SdkBuilder}; +pub use sdk::{RequestSettings, Sdk, SdkBuilder}; /// Version of the SDK pub const VERSION: &str = env!("CARGO_PKG_VERSION"); diff --git a/packages/rs-sdk/src/mock.rs b/packages/rs-sdk/src/mock.rs index 7fb0ac974a..9cd4a16e04 100644 --- a/packages/rs-sdk/src/mock.rs +++ b/packages/rs-sdk/src/mock.rs @@ -12,25 +12,33 @@ //! ## Example //! //! ```no_run -//! let mut sdk = rs_sdk::Sdk::new_mock(); +//! let sdk = rs_sdk::Sdk::new_mock(); //! let query = rs_sdk::platform::Identifier::random(); //! sdk.mock().expect_fetch(query, None as Option); //! ``` //! //! See tests/mock_*.rs for more detailed examples. +#[cfg(not(feature = "mocks"))] +mod noop; +#[cfg(feature = "mocks")] +pub mod provider; #[cfg(feature = "mocks")] mod requests; #[cfg(feature = "mocks")] pub mod sdk; -#[cfg(not(feature = "mocks"))] -mod noop; +// Mockable reexport is needed even if mocks feature is disabled - it just does nothing. +// Otherwise dapi_grpc_macros::Mockable fails. +// TODO: move Mockable to some crate that can be shared between dapi-grpc, rs-dapi-client, and dash-sdk +pub use dapi_grpc::mock::Mockable; +// MockResponse is needed even if mocks feature is disabled - it just does nothing. +#[cfg(not(feature = "mocks"))] +pub use noop::MockResponse; +#[cfg(feature = "mocks")] +pub use requests::MockResponse; #[cfg(feature = "mocks")] pub use requests::*; #[cfg(feature = "mocks")] pub use sdk::MockDashPlatformSdk; - -#[cfg(not(feature = "mocks"))] -pub use noop::*; diff --git a/packages/rs-sdk/src/mock/noop.rs b/packages/rs-sdk/src/mock/noop.rs index 2c0d878152..f99054c762 100644 --- a/packages/rs-sdk/src/mock/noop.rs +++ b/packages/rs-sdk/src/mock/noop.rs @@ -1,7 +1,3 @@ -/// Noop mock request trait; used only when `mocks` feature is disabled. -pub trait MockRequest {} -impl MockRequest for T {} - /// Noop mock response trait; used only when `mocks` feature is disabled. pub trait MockResponse {} impl MockResponse for T {} diff --git a/packages/rs-sdk/src/mock/provider.rs b/packages/rs-sdk/src/mock/provider.rs new file mode 100644 index 0000000000..7e0d928c3a --- /dev/null +++ b/packages/rs-sdk/src/mock/provider.rs @@ -0,0 +1,222 @@ +//! Example ContextProvider that uses the Core gRPC API to fetch data from the platform. + +use std::hash::Hash; +use std::num::NonZeroUsize; +use std::sync::Arc; + +use dpp::prelude::{DataContract, Identifier}; +use drive_proof_verifier::error::ContextProviderError; +use drive_proof_verifier::ContextProvider; + +use crate::core_client::CoreClient; +use crate::platform::Fetch; +use crate::{Error, Sdk}; + +/// Context provider that uses the Core gRPC API to fetch data from the platform. +/// +/// Example [ContextProvider] used by the Sdk for testing purposes. +pub struct GrpcContextProvider { + /// Core client + core: CoreClient, + /// [Sdk] to use when fetching data from Platform + /// + /// Note that if the `sdk` is `None`, the context provider will not be able to fetch data itself and will rely on + /// values set by the user in the caches: `data_contracts_cache`, `quorum_public_keys_cache`. + /// + /// We use [Arc] as we have circular dependencies between Sdk and ContextProvider. + sdk: Option>, + + /// Data contracts cache. + /// + /// Users can insert new data contracts into the cache using [`Cache::put`]. + pub data_contracts_cache: Cache, + + /// Quorum public keys cache. + /// + /// Key is a tuple of quorum hash and quorum type. Value is a quorum public key. + /// + /// Users can insert new quorum public keys into the cache using [`Cache::put`]. + pub quorum_public_keys_cache: Cache<([u8; 32], u32), [u8; 48]>, + + /// Directory where to store dumped data. + /// + /// This is used to store data that is fetched from the platform and can be used for testing purposes. + #[cfg(feature = "mocks")] + pub dump_dir: Option, +} + +impl GrpcContextProvider { + /// Create new context provider. + /// + /// Note that if the `sdk` is `None`, the context provider will not be able to fetch data itself and will rely on + /// values set by the user in the caches: `data_contracts_cache`, `quorum_public_keys_cache`. + /// + /// Sdk can be set later with [`GrpcContextProvider::set_sdk`]. + pub fn new( + sdk: Option>, + core_ip: &str, + core_port: u16, + core_user: &str, + core_password: &str, + + data_contracts_cache_size: NonZeroUsize, + quorum_public_keys_cache_size: NonZeroUsize, + ) -> Result { + let core_client = CoreClient::new(core_ip, core_port, core_user, core_password)?; + Ok(Self { + core: core_client, + sdk, + data_contracts_cache: Cache::new(data_contracts_cache_size), + quorum_public_keys_cache: Cache::new(quorum_public_keys_cache_size), + #[cfg(feature = "mocks")] + dump_dir: None, + }) + } + + /// Set the Sdk to use when fetching data from Platform. + /// This is useful when the Sdk is created after the ContextProvider. + /// + /// Note that if the `sdk` is `None`, the context provider will not be able to fetch data itself and will rely on + /// values set by the user in the caches: `data_contracts_cache`, `quorum_public_keys_cache`. + pub fn set_sdk(&mut self, sdk: Option>) { + self.sdk = sdk; + } + /// Set the directory where to store dumped data. + /// + /// When set, the context provider will store data fetched from the platform into this directory. + #[cfg(feature = "mocks")] + pub fn set_dump_dir(&mut self, dump_dir: Option) { + self.dump_dir = dump_dir; + } + + /// Save quorum public key to disk. + /// + /// Files are named: `quorum_pubkey--.json` + /// + /// Note that this will overwrite files with the same quorum type and quorum hash. + /// + /// Any errors are logged on `warn` level and ignored. + #[cfg(feature = "mocks")] + fn dump_quorum_public_key( + &self, + quorum_type: u32, + quorum_hash: [u8; 32], + _core_chain_locked_height: u32, + public_key: &[u8], + ) { + use hex::ToHex; + + let path = match &self.dump_dir { + Some(p) => p, + None => return, + }; + + let encoded = serde_json::to_vec(public_key).expect("encode quorum hash to json"); + + let file = path.join(format!( + "quorum_pubkey-{}-{}.json", + quorum_type, + quorum_hash.encode_hex::() + )); + + if let Err(e) = std::fs::write(file, encoded) { + tracing::warn!("Unable to write dump file {:?}: {}", path, e); + } + } +} + +impl ContextProvider for GrpcContextProvider { + fn get_quorum_public_key( + &self, + quorum_type: u32, + quorum_hash: [u8; 32], // quorum hash is 32 bytes + core_chain_locked_height: u32, + ) -> Result<[u8; 48], ContextProviderError> { + if let Some(key) = self + .quorum_public_keys_cache + .get(&(quorum_hash, quorum_type)) + { + return Ok(*key); + }; + + let key = self.core.get_quorum_public_key(quorum_type, quorum_hash)?; + + self.quorum_public_keys_cache + .put((quorum_hash, quorum_type), key); + + #[cfg(feature = "mocks")] + self.dump_quorum_public_key(quorum_type, quorum_hash, core_chain_locked_height, &key); + + Ok(key) + } + + fn get_data_contract( + &self, + data_contract_id: &Identifier, + ) -> Result>, ContextProviderError> { + if let Some(contract) = self.data_contracts_cache.get(data_contract_id) { + return Ok(Some(contract)); + }; + + let sdk = match &self.sdk { + Some(sdk) => sdk, + None => { + tracing::warn!("data contract cache miss and no sdk provided, skipping fetch"); + return Ok(None); + } + }; + + let handle = match tokio::runtime::Handle::try_current() { + Ok(handle) => handle, + // not an error, we rely on the caller to provide a data contract using + Err(e) => { + tracing::warn!( + error = e.to_string(), + "data contract cache miss and no tokio runtime detected, skipping fetch" + ); + return Ok(None); + } + }; + + let data_contract = handle + .block_on(DataContract::fetch(sdk, *data_contract_id)) + .map_err(|e| ContextProviderError::InvalidDataContract(e.to_string()))?; + + if let Some(ref dc) = data_contract { + self.data_contracts_cache.put(*data_contract_id, dc.clone()); + }; + + Ok(data_contract.map(Arc::new)) + } +} + +/// Thread-safe cache of various objects inside the SDK. +/// +/// This is used to cache objects that are expensive to fetch from the platform, like data contracts. +pub struct Cache { + // We use a Mutex to allow access to the cache when we don't have mutable &self + // And we use Arc to allow multiple threads to access the cache without having to clone it + inner: std::sync::RwLock>>, +} + +impl Cache { + /// Create new cache + pub fn new(capacity: NonZeroUsize) -> Self { + Self { + // inner: std::sync::Mutex::new(lru::LruCache::new(capacity)), + inner: std::sync::RwLock::new(lru::LruCache::new(capacity)), + } + } + + /// Get a reference to the value stored under `k`. + pub fn get(&self, k: &K) -> Option> { + let mut guard = self.inner.write().expect("cache lock poisoned"); + guard.get(k).map(Arc::clone) + } + + /// Insert a new value into the cache. + pub fn put(&self, k: K, v: V) { + let mut guard = self.inner.write().expect("cache lock poisoned"); + guard.put(k, Arc::new(v)); + } +} diff --git a/packages/rs-sdk/src/mock/requests.rs b/packages/rs-sdk/src/mock/requests.rs index ffc816aea6..fb2e3918fc 100644 --- a/packages/rs-sdk/src/mock/requests.rs +++ b/packages/rs-sdk/src/mock/requests.rs @@ -14,28 +14,10 @@ use dpp::{ PlatformSerializableWithPlatformVersion, }, }; - -use rs_dapi_client::mock::Key; use serde::{Deserialize, Serialize}; use super::MockDashPlatformSdk; -/// Trait implemented by objects that can be used as requests in mock expectations. -pub trait MockRequest { - /// Format the object as a key that will be used to match the request with the expectation. - /// - /// ## Panics - /// - /// Can panic on errors. - fn mock_key(&self) -> Key; -} - -impl MockRequest for T { - fn mock_key(&self) -> Key { - Key::new(self) - } -} - /// Trait implemented by objects that can be used in mock expectation responses. /// /// ## Panics diff --git a/packages/rs-sdk/src/mock/sdk.rs b/packages/rs-sdk/src/mock/sdk.rs index 81760166b1..381283ab53 100644 --- a/packages/rs-sdk/src/mock/sdk.rs +++ b/packages/rs-sdk/src/mock/sdk.rs @@ -1,15 +1,17 @@ //! Mocking mechanisms for Dash Platform SDK. //! //! See [MockDashPlatformSdk] for more details. -use dapi_grpc::platform::v0::{self as proto}; +use dapi_grpc::{ + mock::Mockable, + platform::v0::{self as proto}, +}; use dpp::version::PlatformVersion; -use drive_proof_verifier::{FromProof, MockQuorumInfoProvider}; +use drive_proof_verifier::{error::ContextProviderError, FromProof, MockContextProvider}; use rs_dapi_client::{ mock::{Key, MockDapiClient}, transport::TransportRequest, DapiClient, DumpData, }; -use serde::Deserialize; use std::{collections::BTreeMap, path::PathBuf, sync::Arc}; use tokio::sync::Mutex; @@ -18,7 +20,7 @@ use crate::{ Error, }; -use super::{MockRequest, MockResponse}; +use super::MockResponse; /// Mechanisms to mock Dash Platform SDK. /// @@ -30,12 +32,13 @@ use super::{MockRequest, MockResponse}; /// ## Panics /// /// Can panic on errors. +#[derive(Debug)] pub struct MockDashPlatformSdk { from_proof_expectations: BTreeMap>, platform_version: &'static PlatformVersion, dapi: Arc>, prove: bool, - quorum_provider: Option, + quorum_provider: Option, } impl MockDashPlatformSdk { @@ -61,7 +64,7 @@ impl MockDashPlatformSdk { /// This directory will be used to load quorum information from files. /// You can use [SdkBuilder::with_dump_dir()](crate::SdkBuilder::with_dump_dir()) to generate these files. pub fn quorum_info_dir>(&mut self, dir: P) -> &mut Self { - let mut provider = MockQuorumInfoProvider::new(); + let mut provider = MockContextProvider::new(); provider.quorum_keys_dir(Some(dir.as_ref().to_path_buf())); self.quorum_provider = Some(provider); @@ -156,19 +159,18 @@ impl MockDashPlatformSdk { Ok(self) } - async fn load_expectation Deserialize<'de> + MockRequest>( - &mut self, - path: &PathBuf, - ) -> Result<(), Error> { - let data = DumpData::::load(path).map_err(|e| { - Error::Config(format!( - "cannot load mock expectations from {}: {}", - path.display(), - e - )) - })?; + async fn load_expectation(&mut self, path: &PathBuf) -> Result<(), Error> { + let data = DumpData::::load(path) + .map_err(|e| { + Error::Config(format!( + "cannot load mock expectations from {}: {}", + path.display(), + e + )) + })? + .deserialize(); - self.dapi.lock().await.expect(&data.request, &data.response); + self.dapi.lock().await.expect(&data.0, &data.1); Ok(()) } @@ -179,7 +181,7 @@ impl MockDashPlatformSdk { /// ## Generic Parameters /// /// - `O`: Type of the object that will be returned in response to the query. Must implement [Fetch] and [MockResponse]. - /// - `Q`: Type of the query that will be sent to the platform. Must implement [Query] and [MockRequest]. + /// - `Q`: Type of the query that will be sent to the platform. Must implement [Query] and [Mockable]. /// /// ## Arguments /// @@ -213,7 +215,7 @@ impl MockDashPlatformSdk { /// api.mock().expect_fetch(query, Some(expected.clone())).await; /// /// // Fetch the identity - /// let retrieved = dpp::prelude::Identity::fetch(&mut api, query) + /// let retrieved = dpp::prelude::Identity::fetch(&api, query) /// .await /// .unwrap() /// .expect("object should exist"); @@ -222,16 +224,12 @@ impl MockDashPlatformSdk { /// assert_eq!(retrieved, expected); /// # }); /// ``` - pub async fn expect_fetch< - O: Fetch + MockResponse, - Q: Query<::Request> + MockRequest, - >( + pub async fn expect_fetch::Request>>( &mut self, query: Q, object: Option, ) -> &mut Self where - ::Request: MockRequest, <::Request as TransportRequest>::Response: Default, { let grpc_request = query.query(self.prove).expect("query must be correct"); @@ -248,7 +246,7 @@ impl MockDashPlatformSdk { /// /// - `O`: Type of the object that will be returned in response to the query. /// Must implement [FetchMany]. `Vec` must implement [MockResponse]. - /// - `Q`: Type of the query that will be sent to the platform. Must implement [Query] and [MockRequest]. + /// - `Q`: Type of the query that will be sent to the platform. Must implement [Query] and [Mockable]. /// /// ## Arguments /// @@ -272,7 +270,7 @@ impl MockDashPlatformSdk { pub async fn expect_fetch_many< K: Ord, O: FetchMany, - Q: Query<>::Request> + MockRequest, + Q: Query<>::Request>, >( &mut self, query: Q, @@ -280,7 +278,6 @@ impl MockDashPlatformSdk { ) -> &mut Self where BTreeMap>: MockResponse, - >::Request: MockRequest, <>::Request as TransportRequest>::Response: Default, BTreeMap>: FromProof< >::Request, @@ -295,14 +292,14 @@ impl MockDashPlatformSdk { } /// Save expectations for a request. - async fn expect( + async fn expect( &mut self, grpc_request: I, returned_object: Option, ) where I::Response: Default, { - let key = grpc_request.mock_key(); + let key = Key::new(&grpc_request); // This expectation will work for from_proof self.from_proof_expectations @@ -321,18 +318,21 @@ impl MockDashPlatformSdk { response: O::Response, ) -> Result, drive_proof_verifier::Error> where - O::Request: MockRequest, + O::Request: Mockable, Option: MockResponse, // O: FromProof<>::Request>, { - let data = match self.from_proof_expectations.get(&request.mock_key()) { + let key = Key::new(&request); + + let data = match self.from_proof_expectations.get(&key) { Some(d) => Option::::mock_deserialize(self, d), None => { + let version = self.version(); let provider = self.quorum_provider.as_ref() - .ok_or(drive_proof_verifier::Error::InvalidQuorum{ - error:"expectation not found and quorum info provider not initialized with sdk.mock().quorum_info_dir()".to_string() - })?; - O::maybe_from_proof(request, response, self.version(), provider)? + .ok_or(ContextProviderError::InvalidQuorum( + "expectation not found and quorum info provider not initialized with sdk.mock().quorum_info_dir()".to_string() + ))?; + O::maybe_from_proof(request, response, version, provider)? } }; diff --git a/packages/rs-sdk/src/platform.rs b/packages/rs-sdk/src/platform.rs index 34609ffdff..56d224a4e8 100644 --- a/packages/rs-sdk/src/platform.rs +++ b/packages/rs-sdk/src/platform.rs @@ -1,8 +1,8 @@ //! Platform DAPI requests. -// TODO: rs-sdk should define a proper user-facing API hiding transport and serialization +// TODO: dash-platform-sdk should define a proper user-facing API hiding transport and serialization // details, however we don't have any data model yet, so for now it will re-export proto -// generated types. Later these re-exports could be swapped with actual rs-sdk's requests +// generated types. Later these re-exports could be swapped with actual dash-platform-sdk's requests // and while it will change the substance, the API structure will remain the same. mod delegate; @@ -10,22 +10,23 @@ mod document_query; mod fetch; mod fetch_many; mod query; +pub mod transition; pub mod types; pub use dapi_grpc::platform::v0::{self as proto}; -pub use drive::{ - dpp::{ - self as dpp, - document::Document, - prelude::{DataContract, Identifier, Identity, IdentityPublicKey, Revision}, - }, - query::DriveQuery, +pub use dpp::{ + self as dpp, + document::Document, + prelude::{DataContract, Identifier, Identity, IdentityPublicKey, Revision}, }; +pub use drive::query::DriveQuery; +pub use drive_proof_verifier::ContextProvider; +#[cfg(feature = "mocks")] +pub use drive_proof_verifier::MockContextProvider; +pub use rs_dapi_client as dapi; pub use { document_query::DocumentQuery, fetch::Fetch, fetch_many::FetchMany, query::{LimitQuery, Query, DEFAULT_EPOCH_QUERY_LIMIT}, }; - -pub use rs_dapi_client as dapi; diff --git a/packages/rs-sdk/src/platform/delegate.rs b/packages/rs-sdk/src/platform/delegate.rs index 733a29c23f..d684db448c 100644 --- a/packages/rs-sdk/src/platform/delegate.rs +++ b/packages/rs-sdk/src/platform/delegate.rs @@ -34,6 +34,11 @@ macro_rules! delegate_transport_request_variant { const SETTINGS_OVERRIDES: $crate::platform::dapi::RequestSettings = $crate::platform::dapi::RequestSettings::default(); + /// TODO: Not sure how to do that + fn method_name(&self) -> &'static str { + "" + } + fn execute_transport<'c>( self, client: &'c mut Self::Client, @@ -77,7 +82,7 @@ macro_rules! delegate_from_proof_variant { request: I, response: O, version: &dpp::version::PlatformVersion, - provider: &'a dyn drive_proof_verifier::QuorumInfoProvider, + provider: &'a dyn drive_proof_verifier::ContextProvider, ) -> Result, drive_proof_verifier::Error> where Self: Sized + 'a, @@ -129,7 +134,7 @@ macro_rules! delegate_from_proof_variant { macro_rules! delegate_enum { ($request:ident, $response:ident, $object:ty, $(($variant:ident, $req: ty, $resp: ty)),+) => { /// Wrapper around multiple requests for one object type. - #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, derive_more::From)] + #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, derive_more::From, dapi_grpc_macros::Mockable)] #[allow(missing_docs)] pub enum $request { $( @@ -138,7 +143,7 @@ macro_rules! delegate_enum { } /// Wrapper around multiple responses for one object type. - #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, Default, derive_more::From)] + #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, Default, derive_more::From, dapi_grpc_macros::Mockable)] #[allow(missing_docs)] pub enum $response { #[default] @@ -153,9 +158,6 @@ macro_rules! delegate_enum { )+ } - impl $crate::platform::dapi::transport::TransportResponse for $response {} - - $crate::delegate_transport_request_variant! { $request, $response, diff --git a/packages/rs-sdk/src/platform/document_query.rs b/packages/rs-sdk/src/platform/document_query.rs index b30e235e27..28b04a87c6 100644 --- a/packages/rs-sdk/src/platform/document_query.rs +++ b/packages/rs-sdk/src/platform/document_query.rs @@ -34,7 +34,7 @@ use super::fetch::Fetch; /// required to correctly verify proofs returned by the Dash Platform. /// /// Conversions are implemented between this type, [GetDocumentsRequest] and [DriveQuery] using [TryFrom] trait. -#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, dapi_grpc_macros::Mockable)] pub struct DocumentQuery { /// Data contract ID pub data_contract: Arc, @@ -79,7 +79,7 @@ impl DocumentQuery { /// /// Note that this method will fetch data contract first. pub async fn new_with_data_contract_id( - api: &mut Sdk, + api: &Sdk, data_contract_id: Identifier, document_type_name: &str, ) -> Result { @@ -130,6 +130,14 @@ impl TransportRequest for DocumentQuery { const SETTINGS_OVERRIDES: rs_dapi_client::RequestSettings = ::SETTINGS_OVERRIDES; + fn request_name(&self) -> &'static str { + "GetDocumentsRequest" + } + + fn method_name(&self) -> &'static str { + "get_documents" + } + fn execute_transport<'c>( self, client: &'c mut Self::Client, @@ -149,7 +157,7 @@ impl FromProof for Document { request: I, response: O, version: &dpp::version::PlatformVersion, - provider: &'a dyn drive_proof_verifier::QuorumInfoProvider, + provider: &'a dyn drive_proof_verifier::ContextProvider, ) -> Result, drive_proof_verifier::Error> where Self: Sized + 'a, @@ -180,7 +188,7 @@ impl FromProof for drive_proof_verifier::types::Documents { request: I, response: O, version: &dpp::version::PlatformVersion, - provider: &'a dyn drive_proof_verifier::QuorumInfoProvider, + provider: &'a dyn drive_proof_verifier::ContextProvider, ) -> Result, drive_proof_verifier::Error> where Self: Sized + 'a, @@ -255,6 +263,34 @@ impl<'a> From<&'a DriveQuery<'a>> for DocumentQuery { } } +impl<'a> From> for DocumentQuery { + fn from(value: DriveQuery<'a>) -> Self { + let data_contract = value.contract.clone(); + let document_type_name = value.document_type.name(); + let where_clauses = value.internal_clauses.clone().into(); + let order_by_clauses = value.order_by.iter().map(|(_, v)| v.clone()).collect(); + let limit = value.limit.unwrap_or(0) as u32; + + let start = if let Some(start_at) = value.start_at { + match value.start_at_included { + true => Some(Start::StartAt(start_at.to_vec())), + false => Some(Start::StartAfter(start_at.to_vec())), + } + } else { + None + }; + + Self { + data_contract: Arc::new(data_contract), + document_type_name: document_type_name.to_string(), + where_clauses, + order_by_clauses, + limit, + start, + } + } +} + impl<'a> TryFrom<&'a DocumentQuery> for DriveQuery<'a> { type Error = crate::error::Error; diff --git a/packages/rs-sdk/src/platform/fetch.rs b/packages/rs-sdk/src/platform/fetch.rs index 292adec9a7..2c855b66c7 100644 --- a/packages/rs-sdk/src/platform/fetch.rs +++ b/packages/rs-sdk/src/platform/fetch.rs @@ -8,7 +8,7 @@ //! It requires the implementing type to also implement [Debug] and [FromProof] //! traits. The associated [Fetch::Request]` type needs to implement [TransportRequest]. -use crate::mock::{MockRequest, MockResponse}; +use crate::mock::MockResponse; use crate::{error::Error, platform::query::Query, Sdk}; use dapi_grpc::platform::v0::{self as platform_proto}; use dpp::block::extended_epoch_info::ExtendedEpochInfo; @@ -37,10 +37,10 @@ use super::DocumentQuery; /// use rs_sdk::{Sdk, platform::{Query, Identifier, Fetch, Identity}}; /// /// # const SOME_IDENTIFIER : [u8; 32] = [0; 32]; -/// let mut sdk = Sdk::new_mock(); +/// let sdk = Sdk::new_mock(); /// let query = Identifier::new(SOME_IDENTIFIER); /// -/// let identity = Identity::fetch(&mut sdk, query); +/// let identity = Identity::fetch(&sdk, query); /// ``` #[async_trait::async_trait] pub trait Fetch @@ -59,9 +59,7 @@ where /// Most likely, one of the types defined in [`dapi_grpc::platform::v0`]. /// /// This type must implement [`TransportRequest`] and [`MockRequest`]. - type Request: TransportRequest - + MockRequest - + Into<::Request>>::Request>; + type Request: TransportRequest + Into<::Request>>::Request>; /// Fetch single object from the Platfom. /// @@ -84,7 +82,7 @@ where /// /// Any errors encountered during the execution are returned as [Error] instances. async fn fetch::Request>>( - sdk: &mut Sdk, + sdk: &Sdk, query: Q, ) -> Result, Error> { let request = query.query(sdk.prove())?; @@ -115,7 +113,7 @@ where /// /// - `sdk`: An instance of [Sdk]. /// - `id`: An [Identifier] of the object to be fetched. - async fn fetch_by_identifier(sdk: &mut Sdk, id: Identifier) -> Result, Error> + async fn fetch_by_identifier(sdk: &Sdk, id: Identifier) -> Result, Error> where Identifier: Query<::Request>, { diff --git a/packages/rs-sdk/src/platform/fetch_many.rs b/packages/rs-sdk/src/platform/fetch_many.rs index b6757c612d..81277d9f33 100644 --- a/packages/rs-sdk/src/platform/fetch_many.rs +++ b/packages/rs-sdk/src/platform/fetch_many.rs @@ -5,9 +5,9 @@ //! ## Traits //! - `[FetchMany]`: An async trait that fetches multiple items of a specific type from the platform. -use crate::mock::MockResponse; use crate::{ error::Error, + mock::MockResponse, platform::{document_query::DocumentQuery, query::Query}, Sdk, }; @@ -23,9 +23,8 @@ use dpp::document::Document; use dpp::identity::KeyID; use dpp::prelude::{Identifier, IdentityPublicKey}; use dpp::util::deserializer::ProtocolVersion; -use drive_proof_verifier::types::{ - MasternodeProtocolVote, ProtocolVersionVoteCount, RetrievedObjects, -}; +use dpp::version::ProtocolVersionVoteCount; +use drive_proof_verifier::types::{MasternodeProtocolVote, RetrievedObjects}; use drive_proof_verifier::{types::Documents, FromProof}; use rs_dapi_client::{transport::TransportRequest, DapiRequest, RequestSettings}; use std::collections::BTreeMap; @@ -59,14 +58,14 @@ use super::LimitQuery; /// /// # const SOME_IDENTIFIER_1 : [u8; 32] = [1; 32]; /// # const SOME_IDENTIFIER_2 : [u8; 32] = [2; 32]; -/// let mut sdk = Sdk::new_mock(); +/// let sdk = Sdk::new_mock(); /// /// let id1 = Identifier::new(SOME_IDENTIFIER_1); /// let id2 = Identifier::new(SOME_IDENTIFIER_2); /// /// let query = vec![id1, id2]; /// -/// let data_contract = DataContract::fetch_many(&mut sdk, query); +/// let data_contract = DataContract::fetch_many(&sdk, query); /// ``` #[async_trait::async_trait] pub trait FetchMany @@ -126,7 +125,7 @@ where /// /// Any errors encountered during the execution are returned as [`Error`](crate::error::Error) instances. async fn fetch_many>::Request>>( - sdk: &mut Sdk, + sdk: &Sdk, query: Q, ) -> Result, Error> { let request = query.query(sdk.prove())?; @@ -162,7 +161,7 @@ where /// /// `Vec` must implement [Query] for [Self::Request]. async fn fetch_by_identifiers + Send>( - sdk: &mut Sdk, + sdk: &Sdk, identifiers: I, ) -> Result, Error> where @@ -183,7 +182,7 @@ where /// - `query`: A query parameter implementing [`Query`](crate::platform::query::Query) to specify the data to be retrieved. /// - `limit`: Maximum number of objects to fetch. async fn fetch_many_with_limit>::Request>>( - sdk: &mut Sdk, + sdk: &Sdk, query: Q, limit: u32, ) -> Result, Error> @@ -214,7 +213,7 @@ impl FetchMany for Document { // TODO: Refactor to use ContextProvider type Request = DocumentQuery; async fn fetch_many>::Request>>( - sdk: &mut Sdk, + sdk: &Sdk, query: Q, ) -> Result>, Error> { let document_query: DocumentQuery = query.query(sdk.prove())?; @@ -277,8 +276,8 @@ impl FetchMany for ExtendedEpochInfo { /// use drive_proof_verifier::types::ProtocolVersionVoteCount; /// /// # tokio_test::block_on(async { -/// let mut sdk = Sdk::new_mock(); -/// let result = ProtocolVersionVoteCount::fetch_many(&mut sdk, ()).await; +/// let sdk = Sdk::new_mock(); +/// let result = ProtocolVersionVoteCount::fetch_many(&sdk, ()).await; /// # }); /// ``` impl FetchMany for ProtocolVersionVoteCount { diff --git a/packages/rs-sdk/src/platform/query.rs b/packages/rs-sdk/src/platform/query.rs index 4ce637af53..90e1821dfa 100644 --- a/packages/rs-sdk/src/platform/query.rs +++ b/packages/rs-sdk/src/platform/query.rs @@ -3,6 +3,7 @@ //! [Query] trait is used to specify individual objects as well as search criteria for fetching multiple objects from the platform. use std::fmt::Debug; +use dapi_grpc::mock::Mockable; use dapi_grpc::platform::v0::{ self as proto, get_identity_keys_request, get_identity_keys_request::GetIdentityKeysRequestV0, AllKeys, GetEpochsInfoRequest, GetIdentityKeysRequest, GetProtocolVersionUpgradeStateRequest, @@ -45,15 +46,15 @@ pub const DEFAULT_NODES_VOTING_LIMIT: u32 = 100; /// use rs_sdk::{Sdk, platform::{Query, Identifier, Fetch, Identity}}; /// /// # const SOME_IDENTIFIER : [u8; 32] = [0; 32]; -/// let mut sdk = Sdk::new_mock(); +/// let sdk = Sdk::new_mock(); /// let query = Identifier::new(SOME_IDENTIFIER); -/// let identity = Identity::fetch(&mut sdk, query); +/// let identity = Identity::fetch(&sdk, query); /// ``` /// /// As [Identifier](crate::platform::Identifier) implements [Query], the `query` variable in the code /// above can be used as a parameter for [Fetch::fetch()](crate::platform::Fetch::fetch()) /// and [FetchMany::fetch_many()](crate::platform::FetchMany::fetch_many()) methods. -pub trait Query: Send + Debug + Clone { +pub trait Query: Send + Debug + Clone { /// Converts the current instance into an instance of the `TransportRequest` type. /// /// This method takes ownership of the instance upon which it's called (hence `self`), and attempts to perform the conversion. @@ -159,12 +160,12 @@ impl<'a> Query for DriveQuery<'a> { /// use dpp::block::extended_epoch_info::ExtendedEpochInfo; /// /// # const SOME_IDENTIFIER : [u8; 32] = [0; 32]; -/// let mut sdk = Sdk::new_mock(); +/// let sdk = Sdk::new_mock(); /// let query = LimitQuery { /// query: 1, /// limit: Some(10), /// }; -/// let epoch = ExtendedEpochInfo::fetch_many(&mut sdk, query); +/// let epoch = ExtendedEpochInfo::fetch_many(&sdk, query); /// ``` #[derive(Debug, Clone)] pub struct LimitQuery { @@ -201,7 +202,11 @@ impl + Clone + Debug + Send> Query for impl Query for EpochIndex { fn query(self, prove: bool) -> Result { - LimitQuery::from(self).query(prove) + LimitQuery { + query: self, + limit: Some(1), + } + .query(prove) } } diff --git a/packages/rs-sdk/src/platform/transition.rs b/packages/rs-sdk/src/platform/transition.rs new file mode 100644 index 0000000000..95399fff3e --- /dev/null +++ b/packages/rs-sdk/src/platform/transition.rs @@ -0,0 +1,14 @@ +//! State transitions used to put changed objects to the Dash Platform. +pub mod broadcast; +pub(crate) mod broadcast_identity; +pub(crate) mod broadcast_request; +pub(crate) mod context; +pub mod put_document; +pub mod put_identity; +pub mod top_up_identity; +mod txid; +pub mod withdraw_from_identity; + +pub use context::*; + +pub use txid::TxId; diff --git a/packages/rs-sdk/src/platform/transition/broadcast.rs b/packages/rs-sdk/src/platform/transition/broadcast.rs new file mode 100644 index 0000000000..b3c04895c4 --- /dev/null +++ b/packages/rs-sdk/src/platform/transition/broadcast.rs @@ -0,0 +1,58 @@ +use super::broadcast_request::BroadcastRequestForStateTransition; +use crate::{Error, Sdk}; +use dapi_grpc::platform::VersionedGrpcResponse; +use dpp::state_transition::proof_result::StateTransitionProofResult; +use dpp::state_transition::StateTransition; +use drive::drive::Drive; +use rs_dapi_client::{DapiRequest, RequestSettings}; + +#[async_trait::async_trait] +pub trait BroadcastStateTransition { + async fn broadcast(&self, sdk: &Sdk) -> Result<(), Error>; + async fn broadcast_and_wait( + &self, + sdk: &Sdk, + time_out_ms: Option, + ) -> Result; +} + +#[async_trait::async_trait] +impl BroadcastStateTransition for StateTransition { + async fn broadcast(&self, sdk: &Sdk) -> Result<(), Error> { + let request = self.broadcast_request_for_state_transition()?; + + request.execute(sdk, RequestSettings::default()).await?; + + // response is empty for a broadcast, result comes from the stream wait for state transition result + + Ok(()) + } + + async fn broadcast_and_wait( + &self, + sdk: &Sdk, + _time_out_ms: Option, + ) -> Result { + let request = self.broadcast_request_for_state_transition()?; + + request + .clone() + .execute(sdk, RequestSettings::default()) + .await?; + + let request = self.wait_for_state_transition_result_request()?; + + let response = request.execute(sdk, RequestSettings::default()).await?; + + let proof = response.proof_owned()?; + + let (_, result) = Drive::verify_state_transition_was_executed_with_proof( + self, + proof.grovedb_proof.as_slice(), + &|_| Ok(None), + sdk.version(), + )?; + + Ok(result) + } +} diff --git a/packages/rs-sdk/src/platform/transition/broadcast_identity.rs b/packages/rs-sdk/src/platform/transition/broadcast_identity.rs new file mode 100644 index 0000000000..b44d3589e7 --- /dev/null +++ b/packages/rs-sdk/src/platform/transition/broadcast_identity.rs @@ -0,0 +1,118 @@ +//! Broadcast trait representing the action of broadcasting a new identity state transition to the platform. +//! +//! The [BroadcastRequestForNewIdentity] trait is designed for the creation and broadcasting of new identity state transitions. +//! This involves the generation of a state transition object, signing it, and then broadcasting it to the platform. +//! +//! This trait is expected to be implemented by objects that encapsulate the necessary data and logic to perform +//! these operations, including the handling of asset lock proof and signing operations. +use std::fmt::Debug; + +use dapi_grpc::platform::v0::{self as proto, BroadcastStateTransitionRequest}; +use dpp::dashcore::PrivateKey; +use dpp::identity::signer::Signer; +use dpp::prelude::{AssetLockProof, Identity}; +use dpp::state_transition::identity_create_transition::methods::IdentityCreateTransitionMethodsV0; +use dpp::state_transition::identity_create_transition::IdentityCreateTransition; +use dpp::state_transition::StateTransition; +use dpp::version::PlatformVersion; +use dpp::NativeBlsModule; +use rs_dapi_client::transport::TransportRequest; + +use super::broadcast_request::BroadcastRequestForStateTransition; +use crate::error::Error; + +/// Trait implemented by objects that can be used to broadcast new identity state transitions. +/// +/// [BroadcastRequestForNewIdentity] trait is used when a new identity needs to be created and broadcasted on the platform. +/// It encapsulates the data, the signing process, and the logic required to perform the broadcast operation. +/// +/// Implementors of this trait will typically be responsible for creating an identity state transition, +/// signing it with the provided private key and signer, and preparing it for transport to the platform. +/// +/// ## Example +/// +/// To broadcast a new [Identity](dpp::prelude::Identity) state transition, you would typically +/// create an [IdentityCreateTransition](dpp::state_transition::identity_create_transition::IdentityCreateTransition), +/// sign it, and use the `broadcast_new_identity` method provided by this trait: +/// +/// ```rust, ignore +/// +/// use rs_sdk::{Sdk, platform::{BroadcastNewIdentity, IdentityCreateTransition}}; +/// use dpp::identity::signer::Signer; +/// use dpp::prelude::{AssetLockProof, PrivateKey}; +/// use dpp::version::PlatformVersion; +/// +/// let mut sdk = Sdk::new_mock(); +/// let asset_lock_proof = AssetLockProof::new(/* parameters for the asset lock proof */); +/// let private_key = PrivateKey::from(/* private key data */); +/// let signer = /* implementation of Signer trait */; +/// let platform_version = PlatformVersion::latest(); +/// +/// let identity_transition = IdentityCreateTransition::new(/* parameters for the transition */); +/// let result = identity_transition.broadcast_new_identity(asset_lock_proof, private_key, &signer, &platform_version); +/// +/// match result { +/// Ok(transport_request) => { +/// // The transport_request can now be sent to the platform to broadcast the new identity. +/// } +/// Err(e) => { +/// // Handle the error +/// } +/// } +/// ``` +/// +/// As [BroadcastRequestForNewIdentity] is a trait, it can be implemented for any type that represents +/// a new identity creation operation, allowing for flexibility in how new identities are broadcasted. +pub(crate) trait BroadcastRequestForNewIdentity: + Send + Debug + Clone +{ + /// Converts the current instance into an instance of the `TransportRequest` type, ready for broadcasting. + /// + /// This method takes ownership of the instance upon which it's called (hence `self`), and attempts to perform the conversion, + /// including signing the state transition with the provided private key and signer. + /// + /// # Arguments + /// + /// * `asset_lock_proof` - The proof that locks the asset which is used to create the identity. + /// * `asset_lock_proof_private_key` - The private key associated with the asset lock proof. + /// * `signer` - The signer to be used for signing the state transition. + /// * `platform_version` - The version of the platform for which the state transition is intended. + /// + /// # Returns + /// On success, this method yields an instance of the `TransportRequest` type (`T`), which can be used to broadcast the new identity state transition to the platform. + /// On failure, it yields an [`Error`]. + /// + /// # Error Handling + /// This method propagates any errors encountered during the signing or conversion process. + /// These are returned as [`Error`] instances. + fn broadcast_request_for_new_identity( + &self, + asset_lock_proof: AssetLockProof, + asset_lock_proof_private_key: &PrivateKey, + signer: &S, + platform_version: &PlatformVersion, + ) -> Result<(StateTransition, BroadcastStateTransitionRequest), Error>; +} + +impl BroadcastRequestForNewIdentity + for Identity +{ + fn broadcast_request_for_new_identity( + &self, + asset_lock_proof: AssetLockProof, + asset_lock_proof_private_key: &PrivateKey, + signer: &S, + platform_version: &PlatformVersion, + ) -> Result<(StateTransition, BroadcastStateTransitionRequest), Error> { + let identity_create_transition = IdentityCreateTransition::try_from_identity_with_signer( + self, + asset_lock_proof, + asset_lock_proof_private_key.inner.as_ref(), + signer, + &NativeBlsModule, + platform_version, + )?; + let request = identity_create_transition.broadcast_request_for_state_transition()?; + Ok((identity_create_transition, request)) + } +} diff --git a/packages/rs-sdk/src/platform/transition/broadcast_request.rs b/packages/rs-sdk/src/platform/transition/broadcast_request.rs new file mode 100644 index 0000000000..f1658fc9f0 --- /dev/null +++ b/packages/rs-sdk/src/platform/transition/broadcast_request.rs @@ -0,0 +1,113 @@ +//! Broadcast trait representing the action of broadcasting a new identity state transition to the platform. +//! +//! The [BroadcastRequestForNewIdentity] trait is designed for the creation and broadcasting of new identity state transitions. +//! This involves the generation of a state transition object, signing it, and then broadcasting it to the platform. +//! +//! This trait is expected to be implemented by objects that encapsulate the necessary data and logic to perform +//! these operations, including the handling of asset lock proof and signing operations. +use std::fmt::Debug; + +use dapi_grpc::platform::v0::wait_for_state_transition_result_request::{ + Version, WaitForStateTransitionResultRequestV0, +}; +use dapi_grpc::platform::v0::{ + BroadcastStateTransitionRequest, WaitForStateTransitionResultRequest, +}; + +use dpp::serialization::PlatformSerializable; + +use dpp::state_transition::StateTransition; + +use crate::error::Error; + +/// Trait implemented by objects that can be used to broadcast new identity state transitions. +/// +/// [BroadcastRequestForNewIdentity] trait is used when a new identity needs to be created and broadcasted on the platform. +/// It encapsulates the data, the signing process, and the logic required to perform the broadcast operation. +/// +/// Implementors of this trait will typically be responsible for creating an identity state transition, +/// signing it with the provided private key and signer, and preparing it for transport to the platform. +/// +/// ## Example +/// +/// To broadcast a new [Identity](dpp::prelude::Identity) state transition, you would typically +/// create an [IdentityCreateTransition](dpp::state_transition::identity_create_transition::IdentityCreateTransition), +/// sign it, and use the `broadcast_new_identity` method provided by this trait: +/// +/// ```rust, ignore +/// +/// use rs_sdk::{Sdk, platform::{BroadcastNewIdentity, IdentityCreateTransition}}; +/// use dpp::identity::signer::Signer; +/// use dpp::prelude::{AssetLockProof, PrivateKey}; +/// use dpp::version::PlatformVersion; +/// +/// let mut sdk = Sdk::new_mock(); +/// let asset_lock_proof = AssetLockProof::new(/* parameters for the asset lock proof */); +/// let private_key = PrivateKey::from(/* private key data */); +/// let signer = /* implementation of Signer trait */; +/// let platform_version = PlatformVersion::latest(); +/// +/// let identity_transition = IdentityCreateTransition::new(/* parameters for the transition */); +/// let result = identity_transition.broadcast_new_identity(asset_lock_proof, private_key, &signer, &platform_version); +/// +/// match result { +/// Ok(transport_request) => { +/// // The transport_request can now be sent to the platform to broadcast the new identity. +/// } +/// Err(e) => { +/// // Handle the error +/// } +/// } +/// ``` +/// +/// As [BroadcastRequestForStateTransition] is a trait, it can be implemented for any type that represents +/// a new identity creation operation, allowing for flexibility in how new identities are broadcasted. +pub(crate) trait BroadcastRequestForStateTransition: Send + Debug + Clone { + /// Converts the current instance into an instance of the `TransportRequest` type, ready for broadcasting. + /// + /// This method takes ownership of the instance upon which it's called (hence `self`), and attempts to perform the conversion, + /// including signing the state transition with the provided private key and signer. + /// + /// # Arguments + /// + /// * `asset_lock_proof` - The proof that locks the asset which is used to create the identity. + /// * `asset_lock_proof_private_key` - The private key associated with the asset lock proof. + /// * `signer` - The signer to be used for signing the state transition. + /// * `platform_version` - The version of the platform for which the state transition is intended. + /// + /// # Returns + /// On success, this method yields an instance of the `TransportRequest` type (`T`), which can be used to broadcast the new identity state transition to the platform. + /// On failure, it yields an [`Error`]. + /// + /// # Error Handling + /// This method propagates any errors encountered during the signing or conversion process. + /// These are returned as [`Error`] instances. + fn broadcast_request_for_state_transition( + &self, + ) -> Result; + + fn wait_for_state_transition_result_request( + &self, + ) -> Result; +} + +impl BroadcastRequestForStateTransition for StateTransition { + fn broadcast_request_for_state_transition( + &self, + ) -> Result { + Ok(BroadcastStateTransitionRequest { + state_transition: self.serialize_to_bytes()?, + }) + } + + fn wait_for_state_transition_result_request( + &self, + ) -> Result { + Ok(WaitForStateTransitionResultRequest { + version: Some(Version::V0(WaitForStateTransitionResultRequestV0 { + state_transition_hash: self.transaction_id()?.to_vec(), + prove: true, + })), + }) + } +} diff --git a/packages/rs-sdk/src/platform/transition/context.rs b/packages/rs-sdk/src/platform/transition/context.rs new file mode 100644 index 0000000000..c2d3f27e82 --- /dev/null +++ b/packages/rs-sdk/src/platform/transition/context.rs @@ -0,0 +1,5 @@ +//! Not sure if we need it at all + +pub enum TransitionContext { + Todo, +} diff --git a/packages/rs-sdk/src/platform/transition/put_document.rs b/packages/rs-sdk/src/platform/transition/put_document.rs new file mode 100644 index 0000000000..4899356526 --- /dev/null +++ b/packages/rs-sdk/src/platform/transition/put_document.rs @@ -0,0 +1,176 @@ +use crate::platform::transition::broadcast_request::BroadcastRequestForStateTransition; +use std::sync::Arc; + +use crate::{Error, Sdk}; + +use dapi_grpc::platform::VersionedGrpcResponse; +use dpp::data_contract::document_type::DocumentType; +use dpp::data_contract::DataContract; +use dpp::document::{Document, DocumentV0Getters}; +use dpp::identity::signer::Signer; +use dpp::identity::IdentityPublicKey; +use dpp::state_transition::documents_batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; +use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; +use dpp::state_transition::proof_result::StateTransitionProofResult; +use dpp::state_transition::StateTransition; +use drive::drive::Drive; +use rs_dapi_client::{DapiRequest, RequestSettings}; + +#[async_trait::async_trait] +/// A trait for putting an identity to platform +pub trait PutDocument { + /// Puts an identity on platform + async fn put_to_platform( + &self, + sdk: &Sdk, + document_type: DocumentType, + document_state_transition_entropy: [u8; 32], + identity_public_key: IdentityPublicKey, + signer: &S, + ) -> Result; + + /// Waits for the response of a state transition after it has been broadcast + async fn wait_for_response( + &self, + sdk: &Sdk, + state_transition: StateTransition, + data_contract: Arc, + ) -> Result; + + /// Puts an identity on platform and waits for the confirmation proof + async fn put_to_platform_and_wait_for_response( + &self, + sdk: &Sdk, + document_type: DocumentType, + document_state_transition_entropy: [u8; 32], + identity_public_key: IdentityPublicKey, + data_contract: Arc, + signer: &S, + ) -> Result; + + async fn put_to_platform_with_settings( + &self, + sdk: &Sdk, + document_type: DocumentType, + document_state_transition_entropy: [u8; 32], + identity_public_key: IdentityPublicKey, + signer: &S, + settings: RequestSettings, + ) -> Result; +} + +#[async_trait::async_trait] +impl PutDocument for Document { + async fn put_to_platform( + &self, + sdk: &Sdk, + document_type: DocumentType, + document_state_transition_entropy: [u8; 32], + identity_public_key: IdentityPublicKey, + signer: &S, + ) -> Result { + self.put_to_platform_with_settings( + sdk, + document_type, + document_state_transition_entropy, + identity_public_key, + signer, + RequestSettings::default(), + ) + .await + } + + async fn put_to_platform_with_settings( + &self, + sdk: &Sdk, + document_type: DocumentType, + document_state_transition_entropy: [u8; 32], + identity_public_key: IdentityPublicKey, + signer: &S, + settings: RequestSettings, + ) -> Result { + let transition = DocumentsBatchTransition::new_document_creation_transition_from_document( + self.clone(), + document_type.as_ref(), + document_state_transition_entropy, + &identity_public_key, + signer, + sdk.version(), + None, + None, + None, + )?; + + let request = transition.broadcast_request_for_state_transition()?; + + request.clone().execute(sdk, settings).await?; + + // response is empty for a broadcast, result comes from the stream wait for state transition result + + Ok(transition) + } + + async fn wait_for_response( + &self, + sdk: &Sdk, + state_transition: StateTransition, + data_contract: Arc, + ) -> Result { + let request = state_transition.wait_for_state_transition_result_request()?; + + let response = request.execute(sdk, RequestSettings::default()).await?; + + let proof = response.proof_owned()?; + + let (_, result) = Drive::verify_state_transition_was_executed_with_proof( + &state_transition, + proof.grovedb_proof.as_slice(), + &|_| Ok(Some(data_contract.clone())), + sdk.version(), + )?; + + //todo verify + + match result { + StateTransitionProofResult::VerifiedDocuments(mut documents) => { + let document = documents + .remove(self.id_ref()) + .ok_or(Error::InvalidProvedResponse( + "did not prove the sent document".to_string(), + ))? + .ok_or(Error::InvalidProvedResponse( + "expected there to actually be a document".to_string(), + ))?; + Ok(document) + } + _ => Err(Error::DapiClientError("proved a non document".to_string())), + } + } + + async fn put_to_platform_and_wait_for_response( + &self, + sdk: &Sdk, + document_type: DocumentType, + document_state_transition_entropy: [u8; 32], + identity_public_key: IdentityPublicKey, + data_contract: Arc, + signer: &S, + ) -> Result { + let state_transition = self + .put_to_platform( + sdk, + document_type, + document_state_transition_entropy, + identity_public_key, + signer, + ) + .await?; + + // TODO: Why do we need full type annotation? + let document = + >::wait_for_response(self, sdk, state_transition, data_contract) + .await?; + + Ok(document) + } +} diff --git a/packages/rs-sdk/src/platform/transition/put_identity.rs b/packages/rs-sdk/src/platform/transition/put_identity.rs new file mode 100644 index 0000000000..fe7f9d8913 --- /dev/null +++ b/packages/rs-sdk/src/platform/transition/put_identity.rs @@ -0,0 +1,115 @@ +use crate::platform::transition::broadcast_identity::BroadcastRequestForNewIdentity; +use crate::platform::transition::broadcast_request::BroadcastRequestForStateTransition; +use crate::platform::Fetch; +use crate::{Error, Sdk}; + +use dapi_grpc::platform::VersionedGrpcResponse; +use dpp::dashcore::PrivateKey; +use dpp::identity::signer::Signer; +use dpp::prelude::{AssetLockProof, Identity}; + +use dpp::state_transition::proof_result::StateTransitionProofResult; +use drive::drive::Drive; +use rs_dapi_client::{DapiRequest, RequestSettings}; + +#[async_trait::async_trait] +/// A trait for putting an identity to platform +pub trait PutIdentity { + /// Puts an identity on platform + async fn put_to_platform( + &self, + sdk: &Sdk, + asset_lock_proof: AssetLockProof, + asset_lock_proof_private_key: &PrivateKey, + signer: &S, + ) -> Result<(), Error>; + /// Puts an identity on platform and waits for the confirmation proof + async fn put_to_platform_and_wait_for_response( + &self, + sdk: &Sdk, + asset_lock_proof: AssetLockProof, + asset_lock_proof_private_key: &PrivateKey, + signer: &S, + ) -> Result; +} + +#[async_trait::async_trait] +impl PutIdentity for Identity { + async fn put_to_platform( + &self, + sdk: &Sdk, + asset_lock_proof: AssetLockProof, + asset_lock_proof_private_key: &PrivateKey, + signer: &S, + ) -> Result<(), Error> { + let (_, request) = self.broadcast_request_for_new_identity( + asset_lock_proof, + asset_lock_proof_private_key, + signer, + sdk.version(), + )?; + + request + .clone() + .execute(sdk, RequestSettings::default()) + .await?; + + // response is empty for a broadcast, result comes from the stream wait for state transition result + + Ok(()) + } + + async fn put_to_platform_and_wait_for_response( + &self, + sdk: &Sdk, + asset_lock_proof: AssetLockProof, + asset_lock_proof_private_key: &PrivateKey, + signer: &S, + ) -> Result { + let identity_id = asset_lock_proof.create_identifier()?; + let (state_transition, request) = self.broadcast_request_for_new_identity( + asset_lock_proof, + asset_lock_proof_private_key, + signer, + sdk.version(), + )?; + + let response_result = request + .clone() + .execute(sdk, RequestSettings::default()) + .await; + + match response_result { + Ok(_) => {} + //todo make this more reliable + Err(e) => { + if e.to_string().contains("already exists") { + let identity = Identity::fetch(sdk, identity_id).await?; + return identity.ok_or(Error::DapiClientError( + "identity was proved to not exist but was said to exist".to_string(), + )); + } + } + } + + let request = state_transition.wait_for_state_transition_result_request()?; + + let response = request.execute(sdk, RequestSettings::default()).await?; + + let proof = response.proof_owned()?; + + let (_, result) = Drive::verify_state_transition_was_executed_with_proof( + &state_transition, + proof.grovedb_proof.as_slice(), + &|_| Ok(None), + sdk.version(), + )?; + + //todo verify + + match result { + StateTransitionProofResult::VerifiedIdentity(identity) => Ok(identity), + _ => Err(Error::DapiClientError("proved a non identity".to_string())), + } + } +} diff --git a/packages/rs-sdk/src/platform/transition/top_up_identity.rs b/packages/rs-sdk/src/platform/transition/top_up_identity.rs new file mode 100644 index 0000000000..eadf539639 --- /dev/null +++ b/packages/rs-sdk/src/platform/transition/top_up_identity.rs @@ -0,0 +1,68 @@ +use crate::platform::transition::broadcast_request::BroadcastRequestForStateTransition; +use crate::{Error, Sdk}; +use dapi_grpc::platform::VersionedGrpcResponse; +use dpp::dashcore::PrivateKey; +use dpp::identity::Identity; +use dpp::prelude::AssetLockProof; +use dpp::state_transition::identity_topup_transition::methods::IdentityTopUpTransitionMethodsV0; +use dpp::state_transition::identity_topup_transition::IdentityTopUpTransition; +use dpp::state_transition::proof_result::StateTransitionProofResult; +use drive::drive::Drive; +use rs_dapi_client::{DapiRequest, RequestSettings}; + +#[async_trait::async_trait] +pub trait TopUpIdentity { + async fn top_up_identity( + &self, + sdk: &Sdk, + asset_lock_proof: AssetLockProof, + asset_lock_proof_private_key: &PrivateKey, + ) -> Result; +} + +#[async_trait::async_trait] +impl TopUpIdentity for Identity { + async fn top_up_identity( + &self, + sdk: &Sdk, + asset_lock_proof: AssetLockProof, + asset_lock_proof_private_key: &PrivateKey, + ) -> Result { + let state_transition = IdentityTopUpTransition::try_from_identity( + self, + asset_lock_proof, + asset_lock_proof_private_key.inner.as_ref(), + sdk.version(), + None, + )?; + + let request = state_transition.broadcast_request_for_state_transition()?; + + request + .clone() + .execute(sdk, RequestSettings::default()) + .await?; + + let request = state_transition.wait_for_state_transition_result_request()?; + + let response = request.execute(sdk, RequestSettings::default()).await?; + + let proof = response.proof_owned()?; + + let (_, result) = Drive::verify_state_transition_was_executed_with_proof( + &state_transition, + proof.grovedb_proof.as_slice(), + &|_| Ok(None), + sdk.version(), + )?; + + match result { + StateTransitionProofResult::VerifiedPartialIdentity(identity) => { + identity.balance.ok_or(Error::DapiClientError( + "expected an identity balance".to_string(), + )) + } + _ => Err(Error::DapiClientError("proved a non identity".to_string())), + } + } +} diff --git a/packages/rs-sdk/src/platform/transition/txid.rs b/packages/rs-sdk/src/platform/transition/txid.rs new file mode 100644 index 0000000000..8bca9b7ba1 --- /dev/null +++ b/packages/rs-sdk/src/platform/transition/txid.rs @@ -0,0 +1,22 @@ +use crate::Sdk; + +/// State transition identifier +pub struct TxId([u8; 32]); +impl TxId { + /// Checks if the state transition is confirmed + pub fn is_confirmed(&self, _sdk: &Sdk) -> bool { + todo!("Not implemented") + } +} + +impl From for [u8; 32] { + fn from(tx_id: TxId) -> Self { + tx_id.0 + } +} + +impl From<[u8; 32]> for TxId { + fn from(value: [u8; 32]) -> Self { + TxId(value) + } +} diff --git a/packages/rs-sdk/src/platform/transition/withdraw_from_identity.rs b/packages/rs-sdk/src/platform/transition/withdraw_from_identity.rs new file mode 100644 index 0000000000..84cebe3edc --- /dev/null +++ b/packages/rs-sdk/src/platform/transition/withdraw_from_identity.rs @@ -0,0 +1,80 @@ +use dapi_grpc::platform::VersionedGrpcResponse; +use dpp::dashcore::Address; + +use dpp::identity::core_script::CoreScript; +use dpp::identity::signer::Signer; +use dpp::identity::Identity; + +use dpp::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition; + +use crate::platform::transition::broadcast_request::BroadcastRequestForStateTransition; +use crate::{Error, Sdk}; +use dpp::state_transition::identity_credit_withdrawal_transition::methods::IdentityCreditWithdrawalTransitionMethodsV0; +use dpp::state_transition::proof_result::StateTransitionProofResult; +use dpp::withdrawal::Pooling; +use drive::drive::Drive; +use rs_dapi_client::{DapiRequest, RequestSettings}; + +#[async_trait::async_trait] +pub trait WithdrawFromIdentity { + async fn withdraw( + &self, + sdk: &Sdk, + address: Address, + amount: u64, + core_fee_per_byte: Option, + signer: S, + ) -> Result; +} + +#[async_trait::async_trait] +impl WithdrawFromIdentity for Identity { + async fn withdraw( + &self, + sdk: &Sdk, + address: Address, + amount: u64, + core_fee_per_byte: Option, + signer: S, + ) -> Result { + let state_transition = IdentityCreditWithdrawalTransition::try_from_identity( + self, + CoreScript::new(address.script_pubkey()), + amount, + Pooling::Never, + core_fee_per_byte.unwrap_or(1), + signer, + sdk.version(), + None, + )?; + + let request = state_transition.broadcast_request_for_state_transition()?; + + request + .clone() + .execute(sdk, RequestSettings::default()) + .await?; + + let request = state_transition.wait_for_state_transition_result_request()?; + + let response = request.execute(sdk, RequestSettings::default()).await?; + + let proof = response.proof_owned()?; + + let (_, result) = Drive::verify_state_transition_was_executed_with_proof( + &state_transition, + proof.grovedb_proof.as_slice(), + &|_| Ok(None), + sdk.version(), + )?; + + match result { + StateTransitionProofResult::VerifiedPartialIdentity(identity) => { + identity.balance.ok_or(Error::DapiClientError( + "expected an identity balance".to_string(), + )) + } + _ => Err(Error::DapiClientError("proved a non identity".to_string())), + } + } +} diff --git a/packages/rs-sdk/src/platform/types/epoch.rs b/packages/rs-sdk/src/platform/types/epoch.rs index c503143fba..6ec158a2ad 100644 --- a/packages/rs-sdk/src/platform/types/epoch.rs +++ b/packages/rs-sdk/src/platform/types/epoch.rs @@ -13,12 +13,12 @@ use crate::{ /// Helper trait for managing Epoch information pub trait ExtendedEpochInfoEx: Sized { /// Fetch current (the latest) epoch from the platform. - async fn fetch_current(sdk: &mut Sdk) -> Result; + async fn fetch_current(sdk: &Sdk) -> Result; } #[async_trait] impl ExtendedEpochInfoEx for ExtendedEpochInfo { - async fn fetch_current(sdk: &mut Sdk) -> Result { + async fn fetch_current(sdk: &Sdk) -> Result { let query = LimitQuery { query: EpochQuery { start: None, diff --git a/packages/rs-sdk/src/platform/types/version_votes.rs b/packages/rs-sdk/src/platform/types/version_votes.rs index 92338ec98d..651472cb05 100644 --- a/packages/rs-sdk/src/platform/types/version_votes.rs +++ b/packages/rs-sdk/src/platform/types/version_votes.rs @@ -26,7 +26,7 @@ pub trait MasternodeProtocolVoteEx { /// - [MasternodeProtocolVote::fetch_many()] /// - [MasternodeProtocolVote::fetch_many_with_limit()] async fn fetch_votes( - sdk: &mut Sdk, + sdk: &Sdk, start_protxhash: Option, limit: Option, ) -> Result; @@ -35,7 +35,7 @@ pub trait MasternodeProtocolVoteEx { #[async_trait] impl MasternodeProtocolVoteEx for MasternodeProtocolVote { async fn fetch_votes( - sdk: &mut Sdk, + sdk: &Sdk, start_protxhash: Option, limit: Option, ) -> Result { @@ -53,7 +53,7 @@ impl MasternodeProtocolVoteEx for MasternodeProtocolVote { #[async_trait] impl MasternodeProtocolVoteEx for MasternodeProtocolVotes { async fn fetch_votes( - sdk: &mut Sdk, + sdk: &Sdk, start_protxhash: Option, limit: Option, ) -> Result { diff --git a/packages/rs-sdk/src/sdk.rs b/packages/rs-sdk/src/sdk.rs index 2408d2e69d..2a21a95a37 100644 --- a/packages/rs-sdk/src/sdk.rs +++ b/packages/rs-sdk/src/sdk.rs @@ -1,31 +1,36 @@ //! [Sdk] entrypoint to Dash Platform. -#[cfg(feature = "mocks")] -use std::{ - path::{Path, PathBuf}, - sync::Arc, -}; +use std::sync::Arc; +use std::{fmt::Debug, num::NonZeroUsize, ops::DerefMut}; +use crate::error::Error; +use crate::mock::MockResponse; #[cfg(feature = "mocks")] -use crate::mock::MockDashPlatformSdk; -use crate::mock::{MockRequest, MockResponse}; -use crate::{core::CoreClient, error::Error}; +use crate::mock::{provider::GrpcContextProvider, MockDashPlatformSdk}; +use dapi_grpc::mock::Mockable; use dpp::version::{PlatformVersion, PlatformVersionCurrentVersion}; #[cfg(feature = "mocks")] -use drive_proof_verifier::MockQuorumInfoProvider; -use drive_proof_verifier::{FromProof, QuorumInfoProvider}; -#[cfg(feature = "mocks")] -use hex::ToHex; +use drive_proof_verifier::MockContextProvider; +use drive_proof_verifier::{ContextProvider, FromProof}; pub use http::Uri; #[cfg(feature = "mocks")] use rs_dapi_client::mock::MockDapiClient; pub use rs_dapi_client::AddressList; +pub use rs_dapi_client::RequestSettings; use rs_dapi_client::{ transport::{TransportClient, TransportRequest}, - Dapi, DapiClient, DapiClientError, RequestSettings, + DapiClient, DapiClientError, DapiRequestExecutor, }; #[cfg(feature = "mocks")] +use std::path::{Path, PathBuf}; +#[cfg(feature = "mocks")] use tokio::sync::Mutex; +use tokio_util::sync::{CancellationToken, WaitForCancellationFuture}; + +/// How many data contracts fit in the cache. +pub const DEFAULT_CONTRACT_CACHE_SIZE: usize = 100; +/// How many quorum public keys fit in the cache. +pub const DEFAULT_QUORUM_PUBLIC_KEYS_CACHE_SIZE: usize = 100; /// Dash Platform SDK /// @@ -42,6 +47,11 @@ use tokio::sync::Mutex; /// * [`SdkBuilder::new_mock()`] Create a mock [SdkBuilder]. /// * [`Sdk::new_mock()`] Create a mock [Sdk]. /// +/// ## Thread safety +/// +/// Sdk is thread safe and can be shared between threads. +/// It uses internal locking when needed. +/// /// ## Examples /// /// See tests/ for examples of using the SDK. @@ -51,32 +61,62 @@ pub struct Sdk { /// /// This is set to `true` by default. `false` is not implemented yet. proofs: bool, + + /// Context provider used by the SDK. + /// + /// ## Panics + /// + /// Note that setting this to None can panic. + context_provider: std::sync::Mutex>>, + + /// Cancellation token; once cancelled, all pending requests should be aborted. + pub(crate) cancel_token: CancellationToken, + #[cfg(feature = "mocks")] dump_dir: Option, } +impl Debug for Sdk { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match &self.inner { + SdkInstance::Dapi { dapi, .. } => f + .debug_struct("Sdk") + .field("dapi", dapi) + .field("proofs", &self.proofs) + .finish(), + #[cfg(feature = "mocks")] + SdkInstance::Mock { mock, .. } => f + .debug_struct("Sdk") + .field("mock", mock) + .field("proofs", &self.proofs) + .finish(), + } + } +} + /// Internal Sdk instance. /// /// This is used to store the actual Sdk instance, which can be either a real Sdk or a mock Sdk. /// We use it to avoid exposing internals defined below to the public. +#[derive(Debug)] enum SdkInstance { /// Real Sdk, using DAPI with gRPC transport Dapi { /// DAPI client used to communicate with Dash Platform. dapi: DapiClient, - /// Core client used to retrieve quorum keys from core. - core: CoreClient, + /// Platform version configured for this Sdk version: &'static PlatformVersion, }, - #[cfg(feature = "mocks")] /// Mock SDK + #[cfg(feature = "mocks")] Mock { /// Mock DAPI client used to communicate with Dash Platform. + /// + /// Dapi client is wrapped in a tokio [Mutex](tokio::sync::Mutex) as it's used in async context. dapi: Arc>, /// Mock SDK implementation processing mock expectations and responses. - mock: MockDashPlatformSdk, - quorum_provider: MockQuorumInfoProvider, + mock: std::sync::Mutex, }, } @@ -86,7 +126,7 @@ impl Sdk { /// This is a helper method that uses [`SdkBuilder`] to initialize the SDK in mock mode. /// /// See also [`SdkBuilder`]. - pub fn new_mock() -> Self { + pub fn new_mock() -> Arc { SdkBuilder::default() .build() .expect("mock should be created") @@ -106,14 +146,22 @@ impl Sdk { response: O::Response, ) -> Result, drive_proof_verifier::Error> where - O::Request: MockRequest, + O::Request: Mockable, { + let guard = self + .context_provider + .lock() + .expect("context provider lock poisoned"); + let provider = guard + .as_ref() + .ok_or(drive_proof_verifier::Error::ContextProviderNotSet)?; + match self.inner { SdkInstance::Dapi { .. } => { - O::maybe_from_proof(request, response, self.version(), self) + O::maybe_from_proof(request, response, self.version(), &provider) } #[cfg(feature = "mocks")] - SdkInstance::Mock { ref mock, .. } => mock.parse_proof(request, response), + SdkInstance::Mock { .. } => self.mock().parse_proof(request, response), } } @@ -125,13 +173,13 @@ impl Sdk { /// /// Panics if the `self` instance is not a `Mock` variant. #[cfg(feature = "mocks")] - pub fn mock(&mut self) -> &mut MockDashPlatformSdk { + pub fn mock(&self) -> std::sync::MutexGuard { if let Sdk { - inner: SdkInstance::Mock { ref mut mock, .. }, + inner: SdkInstance::Mock { ref mock, .. }, .. } = self { - mock + mock.lock().expect("mock lock poisoned") } else { panic!("not a mock") } @@ -143,11 +191,11 @@ impl Sdk { /// /// This is the version configured in [`SdkBuilder`]. /// Useful whenever you need to provide [PlatformVersion] to other SDK and DPP methods. - pub fn version<'a>(&self) -> &'a PlatformVersion { + pub fn version<'v>(&self) -> &'v PlatformVersion { match &self.inner { SdkInstance::Dapi { version, .. } => version, #[cfg(feature = "mocks")] - SdkInstance::Mock { mock, .. } => mock.version(), + SdkInstance::Mock { .. } => self.mock().version(), } } @@ -156,84 +204,60 @@ impl Sdk { self.proofs } - /// Save quorum public key to disk. - /// - /// Files are named: `quorum_pubkey--.json` + /// Set the [ContextProvider] to use. /// - /// Note that this will overwrite files with the same quorum type and quorum hash. + /// [ContextProvider] is used to access state information, like data contracts and quorum public keys. /// - /// Any errors are logged on `warn` level and ignored. - #[cfg(feature = "mocks")] - fn dump_quorum_public_key( - &self, - quorum_type: u32, - quorum_hash: [u8; 32], - _core_chain_locked_height: u32, - public_key: &[u8], - ) { - let path = match &self.dump_dir { - Some(p) => p, - None => return, - }; - - let encoded = serde_json::to_vec(public_key).expect("encode quorum hash to json"); - - let file = path.join(format!( - "quorum_pubkey-{}-{}.json", - quorum_type, - quorum_hash.encode_hex::() - )); - - if let Err(e) = std::fs::write(file, encoded) { - tracing::warn!("Unable to write dump file {:?}: {}", path, e); - } + /// Note that this will overwrite any previous context provider. + pub fn set_context_provider(&self, context_provider: C) { + let mut guard = self + .context_provider + .lock() + .expect("context provider lock poisoned"); + + guard.deref_mut().replace(Box::new(context_provider)); } -} - -impl QuorumInfoProvider for Sdk { - fn get_quorum_public_key( - &self, - quorum_type: u32, - quorum_hash: [u8; 32], - core_chain_locked_height: u32, - ) -> Result<[u8; 48], drive_proof_verifier::Error> { - let provider: &dyn QuorumInfoProvider = match self.inner { - SdkInstance::Dapi { ref core, .. } => core, - #[cfg(feature = "mocks")] - SdkInstance::Mock { - ref quorum_provider, - .. - } => quorum_provider, - }; - - let key = - provider.get_quorum_public_key(quorum_type, quorum_hash, core_chain_locked_height)?; - #[cfg(feature = "mocks")] - self.dump_quorum_public_key(quorum_type, quorum_hash, core_chain_locked_height, &key); + /// Returns a future that resolves when the Sdk is cancelled (eg. shutdown was requested). + pub fn cancelled(&self) -> WaitForCancellationFuture { + self.cancel_token.cancelled() + } - Ok(key) + /// Request shutdown of the Sdk and all related operation. + pub fn shutdown(&self) { + self.cancel_token.cancel(); } } #[async_trait::async_trait] -impl Dapi for Sdk { +impl DapiRequestExecutor for Sdk { async fn execute( - &mut self, + &self, request: R, settings: RequestSettings, ) -> Result::Error>> { match self.inner { - SdkInstance::Dapi { ref mut dapi, .. } => dapi.execute(request, settings).await, + SdkInstance::Dapi { ref dapi, .. } => dapi.execute(request, settings).await, #[cfg(feature = "mocks")] - SdkInstance::Mock { ref mut dapi, .. } => { - let mut dapi_guard = dapi.lock().await; + SdkInstance::Mock { ref dapi, .. } => { + let dapi_guard = dapi.lock().await; dapi_guard.execute(request, settings).await } } } } +#[async_trait::async_trait] +impl DapiRequestExecutor for &Sdk { + async fn execute( + &self, + request: R, + settings: RequestSettings, + ) -> Result::Error>> { + DapiRequestExecutor::execute(self, request, settings).await + } +} + /// Dash Platform SDK Builder, used to configure and [`SdkBuilder::build()`] the [Sdk]. /// /// [SdkBuilder] implements a "builder" design pattern to allow configuration of the Sdk before it is instantiated. @@ -261,11 +285,22 @@ pub struct SdkBuilder { /// If true, request and verify proofs of the responses. proofs: bool, + /// Platform version to use in this Sdk version: &'static PlatformVersion, + /// Cache settings + data_contract_cache_size: NonZeroUsize, + quorum_public_keys_cache_size: NonZeroUsize, + + /// Context provider used by the SDK. + context_provider: Option>, + /// directory where dump files will be stored #[cfg(feature = "mocks")] dump_dir: Option, + + /// Cancellation token; once cancelled, all pending requests should be aborted. + pub(crate) cancel_token: CancellationToken, } impl Default for SdkBuilder { @@ -281,6 +316,15 @@ impl Default for SdkBuilder { proofs: true, + data_contract_cache_size: NonZeroUsize::new(DEFAULT_CONTRACT_CACHE_SIZE) + .expect("data conttact cache size must be positive"), + quorum_public_keys_cache_size: NonZeroUsize::new(DEFAULT_QUORUM_PUBLIC_KEYS_CACHE_SIZE) + .expect("quorum public keys cache size must be positive"), + + context_provider: None, + + cancel_token: CancellationToken::new(), + version: PlatformVersion::latest(), #[cfg(feature = "mocks")] dump_dir: None, @@ -345,9 +389,36 @@ impl SdkBuilder { self } - /// Configure connection to Dash Core + /// Configure context provider to use. /// - /// TODO: This is temporary implementation, effective until we integrate SPV into rs-sdk. + /// Context provider is used to retrieve data contracts and quorum public keys from application state. + /// It should be implemented by the user of this SDK to provide stateful information about the application. + /// + /// See [ContextProvider] for more information and [GrpcContextProvider] for an example implementation. + pub fn with_context_provider( + mut self, + context_provider: C, + ) -> Self { + self.context_provider = Some(Box::new(context_provider)); + + self + } + + /// Set cancellation token that will be used by the Sdk. + /// + /// Once that cancellation token is cancelled, all pending requests shall teriminate. + pub fn with_cancellation_token(mut self, cancel_token: CancellationToken) -> Self { + self.cancel_token = cancel_token; + self + } + + /// Use Dash Core as a wallet and context provider. + /// + /// This is a conveniance method that configures the SDK to use Dash Core as a wallet and context provider. + /// + /// For more control over the configuration, use [SdkBuilder::with_wallet()] and [SdkBuilder::with_context_provider()]. + /// + /// This is temporary implementation, intended for development purposes. pub fn with_core(mut self, ip: &str, port: u16, user: &str, password: &str) -> Self { self.core_ip = ip.to_string(); self.core_port = port; @@ -383,49 +454,78 @@ impl SdkBuilder { /// # Errors /// /// This method will return an error if the Sdk cannot be created. - pub fn build(self) -> Result { + pub fn build(self) -> Result, Error> { PlatformVersion::set_current(self.version); - match self.addresses { + let sdk= match self.addresses { + // non-mock mode Some(addresses) => { - if self.core_ip.is_empty() || self.core_port == 0 { - return Err(Error::Config( - "Core must be configured with SdkBuilder::with_core".to_string(), - )); - } let dapi = DapiClient::new(addresses, self.settings); #[cfg(feature = "mocks")] let dapi = dapi.dump_dir(self.dump_dir.clone()); - let core = CoreClient::new( - &self.core_ip, - self.core_port, - &self.core_user, - &self.core_password, - )?; - - Ok(Sdk{ - inner:SdkInstance::Dapi { dapi, core, version:self.version }, + let sdk= Sdk{ + inner:SdkInstance::Dapi { dapi, version:self.version }, proofs:self.proofs, + context_provider: std::sync:: Mutex::new(self.context_provider), + cancel_token: self.cancel_token, #[cfg(feature = "mocks")] dump_dir: self.dump_dir, - }) + }; + let sdk = Arc::new(sdk); + + // if context provider is not set correctly (is None), it means we need to fallback to core wallet + let mut ctx_guard = sdk.context_provider.lock().expect("lock poisoned"); + if ctx_guard.is_none() { + #[cfg(feature = "mocks")] + if !self.core_ip.is_empty() { + tracing::warn!("ContextProvider not set; mocking with Dash Core. \ + Please provide your own ContextProvider with SdkBuilder::with_context_provider()."); + + let mut context_provider = GrpcContextProvider::new(Some(Arc::clone(&sdk)), + &self.core_ip, self.core_port, &self.core_user, &self.core_password, + self.data_contract_cache_size, self.quorum_public_keys_cache_size)?; + #[cfg(feature = "mocks")] + if sdk.dump_dir.is_some() { + context_provider.set_dump_dir(sdk.dump_dir.clone()); + } + + ctx_guard.replace(Box::new(context_provider)); + } else{ + tracing::warn!( + "Configure ContextProvider with Sdk::with_context_provider(); otherwise Sdk will fail"); + } + #[cfg(not(feature = "mocks"))] + tracing::warn!( + "Configure ContextProvider with Sdk::with_context_provider(); otherwise Sdk will fail"); + }; + drop(ctx_guard); + + Ok(sdk) }, #[cfg(feature = "mocks")] - None =>{ let dapi =Arc::new(Mutex::new( MockDapiClient::new())); - Ok(Sdk{ + // mock mode + None => { + let dapi =Arc::new(tokio::sync::Mutex::new( MockDapiClient::new())); + // We create mock context provider that will use the mock DAPI client to retrieve data contracts. + let context_provider = self.context_provider.unwrap_or(Box::new(MockContextProvider::new())); + + let sdk = Sdk { inner:SdkInstance::Mock { - mock: MockDashPlatformSdk::new(self.version, Arc::clone(&dapi), self.proofs), + mock: std::sync::Mutex::new( MockDashPlatformSdk::new(self.version, Arc::clone(&dapi), self.proofs)), dapi, - quorum_provider: MockQuorumInfoProvider::new(), }, dump_dir: self.dump_dir, proofs:self.proofs, - })}, + context_provider: std::sync:: Mutex::new( Some(context_provider)), + cancel_token: self.cancel_token, + }; + Ok(Arc::new(sdk)) + }, #[cfg(not(feature = "mocks"))] - None => Err(Error::Config( - "Mock mode is not available. Please enable `mocks` feature or provide address list.".to_string(), - )), - } + None => Err(Error::Config("Mock mode is not available. Please enable `mocks` feature or provide address list.".to_string())), + }; + + sdk } } diff --git a/packages/rs-sdk/tests/.env.example b/packages/rs-sdk/tests/.env.example index f5348104f9..9915c8d1df 100644 --- a/packages/rs-sdk/tests/.env.example +++ b/packages/rs-sdk/tests/.env.example @@ -2,6 +2,7 @@ RS_SDK_PLATFORM_HOST="127.0.0.1" RS_SDK_PLATFORM_PORT=2443 +RS_SDK_PLATFORM_SSL=false RS_SDK_CORE_PORT=20002 RS_SDK_CORE_USER="someuser" diff --git a/packages/rs-sdk/tests/fetch/broadcast.rs b/packages/rs-sdk/tests/fetch/broadcast.rs new file mode 100644 index 0000000000..63a72529dd --- /dev/null +++ b/packages/rs-sdk/tests/fetch/broadcast.rs @@ -0,0 +1,48 @@ +#[cfg(all(feature = "network-testing", not(feature = "offline-testing")))] +/// Tests that require connectivity to the server +mod online { + use crate::{common::setup_logs, config::Config}; + use dapi_grpc::platform::v0::{ + wait_for_state_transition_result_request::WaitForStateTransitionResultRequestV0, + WaitForStateTransitionResultRequest, + }; + use rs_dapi_client::{DapiRequest, RequestSettings}; + use rs_sdk::Sdk; + use std::time::Duration; + + /// Send streaming request to the server and time out after 1 second (because we don't expect to receive anything) + #[tokio::test(flavor = "multi_thread", worker_threads = 1)] + #[cfg(all(feature = "network-testing", not(feature = "offline-testing")))] + async fn test_wait_timeout() { + setup_logs(); + + const TIMEOUT: std::time::Duration = std::time::Duration::from_millis(400); + + let cfg = Config::new(); + let sdk = cfg.setup_api().await; + let sdk_ref: &Sdk = sdk.as_ref(); + + let request: WaitForStateTransitionResultRequest = WaitForStateTransitionResultRequestV0 { + prove: false, + state_transition_hash: [0u8; 32].to_vec(), + } + .into(); + + let settings = RequestSettings { + timeout: Some(TIMEOUT), + ..Default::default() + }; + + // we add few millis to duration to give chance to the server to time out before we kill request + let response = tokio::time::timeout( + TIMEOUT + Duration::from_millis(100), + request.execute(sdk_ref, settings), + ) + .await + .expect("expected request timeout, got tokio timeout"); + + assert!(response.is_err(), "expected timeout, got {:?}", response); + tracing::info!(response = ?response, "received timeout"); + // assert!(response.version.is_some()); + } +} diff --git a/packages/rs-sdk/tests/fetch/config.rs b/packages/rs-sdk/tests/fetch/config.rs index 20d17bdaec..2c97bc33f2 100644 --- a/packages/rs-sdk/tests/fetch/config.rs +++ b/packages/rs-sdk/tests/fetch/config.rs @@ -1,12 +1,12 @@ -//! Configuration helpers for mocking of rs-sdk. +//! Configuration helpers for mocking of dash-platform-sdk. //! -//! This module contains [Config] struct that can be used to configure rs-sdk. +//! This module contains [Config] struct that can be used to configure dash-platform-sdk. //! It's mainly used for testing. use dpp::prelude::Identifier; use rs_dapi_client::AddressList; use serde::Deserialize; -use std::{path::PathBuf, str::FromStr}; +use std::{path::PathBuf, str::FromStr, sync::Arc}; /// Existing document ID /// @@ -18,7 +18,7 @@ const DPNS_DASH_TLD_DOCUMENT_ID: [u8; 32] = [ ]; #[derive(Debug, Deserialize)] -/// Configuration for rs-sdk. +/// Configuration for dash-platform-sdk. /// /// Content of this configuration is loaded from environment variables or `${CARGO_MANIFEST_DIR}/.env` file /// when the [Config::new()] is called. @@ -40,6 +40,9 @@ pub struct Config { /// Password for Dash Core RPC interface #[serde(default)] pub core_password: String, + /// When true, use SSL for the Dash Platform node grpc interface + #[serde(default)] + pub platform_ssl: bool, /// Directory where all generated test vectors will be saved. /// @@ -114,7 +117,12 @@ impl Config { #[allow(unused)] /// Create list of Platform addresses from the configuration pub fn address_list(&self) -> AddressList { - let address: String = format!("http://{}:{}", self.platform_host, self.platform_port); + let scheme = match self.platform_ssl { + true => "https", + false => "http", + }; + + let address: String = format!("{}://{}:{}", scheme, self.platform_host, self.platform_port); AddressList::from_iter(vec![http::Uri::from_str(&address).expect("valid uri")]) } @@ -129,7 +137,7 @@ impl Config { /// new test vectors during execution /// * `offline-testing` is set - use mock implementation and /// load existing test vectors from disk - pub async fn setup_api(&self) -> rs_sdk::Sdk { + pub async fn setup_api(&self) -> Arc { // offline testing takes precedence over network testing #[cfg(all(feature = "network-testing", not(feature = "offline-testing")))] let sdk = { @@ -150,7 +158,7 @@ impl Config { // offline testing takes precedence over network testing #[cfg(feature = "offline-testing")] let sdk = { - let mut mock_sdk = rs_sdk::SdkBuilder::new_mock() + let mock_sdk = rs_sdk::SdkBuilder::new_mock() .build() .expect("initialize api"); diff --git a/packages/rs-sdk/tests/fetch/data_contract.rs b/packages/rs-sdk/tests/fetch/data_contract.rs index 8d639b2d64..02d3743a7f 100644 --- a/packages/rs-sdk/tests/fetch/data_contract.rs +++ b/packages/rs-sdk/tests/fetch/data_contract.rs @@ -1,4 +1,4 @@ -use crate::config::Config; +use super::config::Config; use dpp::prelude::{DataContract, Identifier}; use rs_sdk::platform::{Fetch, FetchMany}; @@ -9,9 +9,9 @@ async fn test_data_contract_read_not_found() { let id = Identifier::from_bytes(&DATA_CONTRACT_ID_BYTES).expect("parse identity id"); let cfg = Config::new(); - let mut sdk = cfg.setup_api().await; + let sdk = cfg.setup_api().await; - let result = DataContract::fetch(&mut sdk, id).await; + let result = DataContract::fetch(&sdk, id).await; assert!(matches!(result, Ok(None)), "result: {:?}", result); } @@ -23,9 +23,9 @@ async fn test_data_contract_read() { let cfg = Config::new(); let id = cfg.existing_data_contract_id; - let mut sdk = cfg.setup_api().await; + let sdk = cfg.setup_api().await; - let result = DataContract::fetch_by_identifier(&mut sdk, id).await; + let result = DataContract::fetch_by_identifier(&sdk, id).await; assert!(matches!(result, Ok(Some(_))), "result: {:?}", result); assert_eq!(result.unwrap().unwrap().id(), id); @@ -40,9 +40,9 @@ async fn test_data_contracts_1_ok_1_nx() { let nx_id = Identifier::from_bytes(&[1; 32]).expect("parse identity id"); let ids = [id, nx_id]; - let mut sdk = cfg.setup_api().await; + let sdk = cfg.setup_api().await; - let result = DataContract::fetch_by_identifiers(&mut sdk, ids) + let result = DataContract::fetch_by_identifiers(&sdk, ids) .await .expect("fetch many data contracts"); @@ -73,9 +73,9 @@ async fn test_data_contracts_2_nx() { let nx_id_2 = Identifier::from_bytes(&[1; 32]).expect("parse identity id"); let ids = vec![nx_id_1, nx_id_2]; - let mut sdk = cfg.setup_api().await; + let sdk = cfg.setup_api().await; - let result = DataContract::fetch_many(&mut sdk, ids) + let result = DataContract::fetch_many(&sdk, ids) .await .expect("fetch many data contracts"); diff --git a/packages/rs-sdk/tests/fetch/document.rs b/packages/rs-sdk/tests/fetch/document.rs index 6443c415b7..6306ae2840 100644 --- a/packages/rs-sdk/tests/fetch/document.rs +++ b/packages/rs-sdk/tests/fetch/document.rs @@ -2,15 +2,13 @@ use std::sync::Arc; -use crate::common::setup_logs; -use crate::config::Config; +use super::{common::setup_logs, config::Config}; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::document::{Document, DocumentV0Getters}; use dpp::platform_value::string_encoding::Encoding; use dpp::prelude::{DataContract, Identifier}; use drive::query::DriveQuery; -use rs_sdk::platform::DocumentQuery; -use rs_sdk::platform::{Fetch, FetchMany}; +use rs_sdk::platform::{DocumentQuery, Fetch, FetchMany}; /// Given some data contract ID, document type and document ID, when I fetch it, then I get it. #[tokio::test(flavor = "multi_thread", worker_threads = 1)] @@ -18,12 +16,12 @@ async fn document_read() { setup_logs(); let cfg = Config::new(); - let mut sdk = cfg.setup_api().await; + let sdk = cfg.setup_api().await; let data_contract_id = cfg.existing_data_contract_id; let contract = Arc::new( - DataContract::fetch(&mut sdk, data_contract_id) + DataContract::fetch(&sdk, data_contract_id) .await .expect("fetch data contract") .expect("data contract not found"), @@ -33,7 +31,7 @@ async fn document_read() { let all_docs_query = DocumentQuery::new(Arc::clone(&contract), &cfg.existing_document_type_name) .expect("create SdkDocumentQuery"); - let first_doc = Document::fetch_many(&mut sdk, all_docs_query) + let first_doc = Document::fetch_many(&sdk, all_docs_query) .await .expect("fetch many documents") .pop_first() @@ -46,7 +44,7 @@ async fn document_read() { .expect("create SdkDocumentQuery") .with_document_id(&first_doc.id()); - let doc = Document::fetch(&mut sdk, query) + let doc = Document::fetch(&sdk, query) .await .expect("fetch document") .expect("document must be found"); @@ -60,12 +58,12 @@ async fn document_read_no_contract() { setup_logs(); let cfg = Config::new(); - let mut sdk = cfg.setup_api().await; + let sdk = cfg.setup_api().await; let data_contract_id = Identifier::from_bytes(&[0; 32]).expect("create Identifier"); let query = DocumentQuery::new_with_data_contract_id( - &mut sdk, + &sdk, data_contract_id, &cfg.existing_document_type_name, ) @@ -86,13 +84,13 @@ async fn document_read_no_document() { setup_logs(); let cfg = Config::new(); - let mut sdk = cfg.setup_api().await; + let sdk = cfg.setup_api().await; let data_contract_id = cfg.existing_data_contract_id; let document_id = [0; 32].into(); let query = DocumentQuery::new_with_data_contract_id( - &mut sdk, + &sdk, data_contract_id, &cfg.existing_document_type_name, ) @@ -100,9 +98,7 @@ async fn document_read_no_document() { .expect("create SdkDocumentQuery") .with_document_id(&document_id); - let doc = Document::fetch(&mut sdk, query) - .await - .expect("fetch document"); + let doc = Document::fetch(&sdk, query).await.expect("fetch document"); assert!(doc.is_none(), "document must not be found"); } @@ -116,11 +112,11 @@ async fn document_list_drive_query() { setup_logs(); let cfg = Config::new(); - let mut sdk = cfg.setup_api().await; + let sdk = cfg.setup_api().await; let data_contract_id = cfg.existing_data_contract_id; - let data_contract = DataContract::fetch(&mut sdk, data_contract_id) + let data_contract = DataContract::fetch(&sdk, data_contract_id) .await .expect("fetch data contract") .expect("data contract not found"); @@ -129,9 +125,19 @@ async fn document_list_drive_query() { .document_type_for_name(&cfg.existing_document_type_name) .expect("document type not found"); - let query = DriveQuery::any_item_query(&data_contract, doctype); - - let docs = ::fetch_many(&mut sdk, query) + let query = DriveQuery { + contract: &data_contract, + document_type: doctype, + internal_clauses: Default::default(), + offset: None, + limit: Some(1), + order_by: Default::default(), + start_at: None, + start_at_included: true, + block_time_ms: None, + }; + + let docs = ::fetch_many(&sdk, query) .await .expect("fetch many documents"); @@ -151,12 +157,12 @@ async fn document_list_document_query() { setup_logs(); let cfg = Config::new(); - let mut sdk = cfg.setup_api().await; + let sdk = cfg.setup_api().await; let data_contract_id = cfg.existing_data_contract_id; let data_contract = Arc::new( - DataContract::fetch(&mut sdk, data_contract_id) + DataContract::fetch(&sdk, data_contract_id) .await .expect("fetch data contract") .expect("data contra)ct not found"), @@ -165,7 +171,7 @@ async fn document_list_document_query() { let query = DocumentQuery::new(Arc::clone(&data_contract), &cfg.existing_document_type_name) .expect("document query created"); - let docs = ::fetch_many(&mut sdk, query) + let docs = ::fetch_many(&sdk, query) .await .expect("fetch many documents"); diff --git a/packages/rs-sdk/tests/fetch/epoch.rs b/packages/rs-sdk/tests/fetch/epoch.rs index 17a1f0f7d7..5a31840981 100644 --- a/packages/rs-sdk/tests/fetch/epoch.rs +++ b/packages/rs-sdk/tests/fetch/epoch.rs @@ -1,6 +1,6 @@ use std::collections::BTreeMap; -use crate::{common::setup_logs, config::Config}; +use super::{common::setup_logs, config::Config}; use dapi_grpc::platform::{ v0::{get_identity_request::GetIdentityRequestV0, GetIdentityRequest}, VersionedGrpcResponse, @@ -8,7 +8,7 @@ use dapi_grpc::platform::{ use dpp::block::epoch::EpochIndex; use dpp::block::extended_epoch_info::v0::ExtendedEpochInfoV0Getters; use dpp::block::extended_epoch_info::ExtendedEpochInfo; -use rs_dapi_client::{Dapi, RequestSettings}; +use rs_dapi_client::{DapiRequestExecutor, RequestSettings}; use rs_sdk::{ platform::{ types::epoch::ExtendedEpochInfoEx, Fetch, FetchMany, LimitQuery, DEFAULT_EPOCH_QUERY_LIMIT, @@ -17,7 +17,7 @@ use rs_sdk::{ }; /// Get current epoch index from DAPI response metadata -async fn get_current_epoch(sdk: &mut Sdk, cfg: &Config) -> EpochIndex { +async fn get_current_epoch(sdk: &Sdk, cfg: &Config) -> EpochIndex { // We need existing epoch from metadata, so we'll use low-level API here to get it let identity_request: GetIdentityRequest = GetIdentityRequestV0 { id: cfg.existing_identity_id.to_vec(), @@ -80,16 +80,16 @@ async fn test_epoch_list() { setup_logs(); let cfg = Config::new(); - let mut sdk = cfg.setup_api().await; + let sdk = cfg.setup_api().await; // Given some starting epoch and current epoch // Note the devnet does not necessarily start with epoch 0 - let starting_epoch: EpochIndex = 3; - let current_epoch = get_current_epoch(&mut sdk, &cfg).await; + let starting_epoch: EpochIndex = 185; + let current_epoch = get_current_epoch(&sdk, &cfg).await; // When we fetch epochs from the server, starting with `starting_epoch` let epochs: BTreeMap> = - ExtendedEpochInfo::fetch_many(&mut sdk, starting_epoch) + ExtendedEpochInfo::fetch_many(&sdk, starting_epoch) .await .expect("list epochs"); @@ -107,12 +107,12 @@ async fn test_epoch_list_limit() { setup_logs(); let cfg = Config::new(); - let mut sdk = cfg.setup_api().await; + let sdk = cfg.setup_api().await; // Given some starting epoch and current epoch // Note the devnet does not necessarily start with epoch 0 - let starting_epoch: EpochIndex = 3; - let current_epoch = get_current_epoch(&mut sdk, &cfg).await; + let starting_epoch: EpochIndex = 193; + let current_epoch = get_current_epoch(&sdk, &cfg).await; let limit = 2; let query: LimitQuery = LimitQuery { @@ -120,7 +120,7 @@ async fn test_epoch_list_limit() { limit: Some(limit), }; - let epochs = ExtendedEpochInfo::fetch_many(&mut sdk, query) + let epochs = ExtendedEpochInfo::fetch_many(&sdk, query) .await .expect("list epochs"); @@ -133,12 +133,12 @@ async fn test_epoch_fetch() { setup_logs(); let cfg = Config::new(); - let mut sdk = cfg.setup_api().await; + let sdk = cfg.setup_api().await; // Given some current epoch - let current_epoch = get_current_epoch(&mut sdk, &cfg).await; + let current_epoch = get_current_epoch(&sdk, &cfg).await; - let epoch = ExtendedEpochInfo::fetch(&mut sdk, current_epoch) + let epoch = ExtendedEpochInfo::fetch(&sdk, current_epoch) .await .expect("list epochs") .expect("epoch found"); @@ -152,12 +152,12 @@ async fn test_epoch_fetch_future() { setup_logs(); let cfg = Config::new(); - let mut sdk = cfg.setup_api().await; + let sdk = cfg.setup_api().await; // Given some current epoch - let current_epoch = get_current_epoch(&mut sdk, &cfg).await; + let current_epoch = get_current_epoch(&sdk, &cfg).await; - let epoch = ExtendedEpochInfo::fetch(&mut sdk, current_epoch + 10) + let epoch = ExtendedEpochInfo::fetch(&sdk, current_epoch + 10) .await .expect("list epochs"); @@ -170,12 +170,12 @@ async fn test_epoch_fetch_current() { setup_logs(); let cfg = Config::new(); - let mut sdk = cfg.setup_api().await; + let sdk = cfg.setup_api().await; // Given some current epoch - let expected_epoch = get_current_epoch(&mut sdk, &cfg).await; + let expected_epoch = get_current_epoch(&sdk, &cfg).await; - let epoch = ExtendedEpochInfo::fetch_current(&mut sdk) + let epoch = ExtendedEpochInfo::fetch_current(&sdk) .await .expect("fetch current epoch"); diff --git a/packages/rs-sdk/tests/fetch/identity.rs b/packages/rs-sdk/tests/fetch/identity.rs index 6fc6d5dbe9..b7711b55aa 100644 --- a/packages/rs-sdk/tests/fetch/identity.rs +++ b/packages/rs-sdk/tests/fetch/identity.rs @@ -2,13 +2,11 @@ use dpp::identity::accessors::IdentityGettersV0; use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; use dpp::prelude::IdentityPublicKey; use dpp::{identity::hash::IdentityPublicKeyHashMethodsV0, prelude::Identity}; - use drive_proof_verifier::types::{IdentityBalance, IdentityBalanceAndRevision}; use rs_sdk::platform::types::identity::PublicKeyHash; use rs_sdk::platform::{Fetch, FetchMany}; -use crate::common::setup_logs; -use crate::config::Config; +use super::{common::setup_logs, config::Config}; /// Given some existing identity ID, when I fetch the identity, and I get it. #[tokio::test(flavor = "multi_thread", worker_threads = 1)] @@ -19,9 +17,9 @@ async fn test_identity_read() { let cfg = Config::new(); let id: dpp::prelude::Identifier = cfg.existing_identity_id; - let mut sdk = cfg.setup_api().await; + let sdk = cfg.setup_api().await; - let identity = Identity::fetch(&mut sdk, id) + let identity = Identity::fetch(&sdk, id) .await .expect("fetch identity") .expect("found identity"); @@ -35,9 +33,9 @@ async fn test_identity_read_by_key() { let cfg = Config::new(); let id = cfg.existing_identity_id; - let mut sdk = cfg.setup_api().await; + let sdk = cfg.setup_api().await; - let identity = Identity::fetch(&mut sdk, id) + let identity = Identity::fetch(&sdk, id) .await .expect("fetch identity") .expect("found identity"); @@ -50,7 +48,7 @@ async fn test_identity_read_by_key() { .hash() .expect("public key hash"); - let identity2 = Identity::fetch(&mut sdk, PublicKeyHash(key_hash)) + let identity2 = Identity::fetch(&sdk, PublicKeyHash(key_hash)) .await .expect("fetch identity by key hash") .expect("found identity by key hash"); @@ -65,9 +63,9 @@ async fn test_identity_balance_read() { let cfg = Config::new(); let id: dpp::prelude::Identifier = cfg.existing_identity_id; - let mut sdk = cfg.setup_api().await; + let sdk = cfg.setup_api().await; - let balance = IdentityBalance::fetch(&mut sdk, id) + let balance = IdentityBalance::fetch(&sdk, id) .await .expect("fetch identity balance") .expect("found identity balance"); @@ -83,9 +81,9 @@ async fn test_identity_balance_revision_read() { let cfg = Config::new(); let id: dpp::prelude::Identifier = cfg.existing_identity_id; - let mut sdk = cfg.setup_api().await; + let sdk = cfg.setup_api().await; - let (balance, revision) = IdentityBalanceAndRevision::fetch(&mut sdk, id) + let (balance, revision) = IdentityBalanceAndRevision::fetch(&sdk, id) .await .expect("fetch identity balance") .expect("found identity balance"); @@ -101,9 +99,9 @@ async fn test_identity_public_keys_all_read() { let cfg = Config::new(); let id: dpp::prelude::Identifier = cfg.existing_identity_id; - let mut sdk = cfg.setup_api().await; + let sdk = cfg.setup_api().await; - let public_keys = IdentityPublicKey::fetch_many(&mut sdk, id) + let public_keys = IdentityPublicKey::fetch_many(&sdk, id) .await .expect("fetch identity public keys"); diff --git a/packages/rs-sdk/tests/fetch/mock_fetch.rs b/packages/rs-sdk/tests/fetch/mock_fetch.rs index 7872e1dc01..9f4b9ca68c 100644 --- a/packages/rs-sdk/tests/fetch/mock_fetch.rs +++ b/packages/rs-sdk/tests/fetch/mock_fetch.rs @@ -21,14 +21,14 @@ use rs_sdk::{ #[tokio::test] /// Given some identity, when I fetch it using mock API, then I get the same identity async fn test_mock_fetch_identity() { - let mut sdk = Sdk::new_mock(); + let sdk = Sdk::new_mock(); let expected: Identity = Identity::from(IdentityV0::default()); let query = expected.id(); sdk.mock().expect_fetch(query, Some(expected.clone())).await; - let retrieved = Identity::fetch(&mut sdk, query) + let retrieved = Identity::fetch(&sdk, query) .await .unwrap() .expect("object should exist"); @@ -39,13 +39,13 @@ async fn test_mock_fetch_identity() { #[tokio::test] /// Given some random identity ID, when I fetch it using mock API, then I get None async fn test_mock_fetch_identity_not_found() { - let mut sdk = Sdk::new_mock(); + let sdk = Sdk::new_mock(); let id = Identifier::random(); sdk.mock().expect_fetch(id, None as Option).await; - let retrieved = Identity::fetch(&mut sdk, id) + let retrieved = Identity::fetch(&sdk, id) .await .expect("fetch should succeed"); @@ -55,14 +55,14 @@ async fn test_mock_fetch_identity_not_found() { /// Given some data contract, when I fetch it by ID, I get it. #[tokio::test] async fn test_mock_fetch_data_contract() { - let mut sdk = Sdk::new_mock(); + let sdk = Sdk::new_mock(); let expected = mock_data_contract(None); let id = expected.id(); sdk.mock().expect_fetch(id, Some(expected.clone())).await; - let retrieved = DataContract::fetch(&mut sdk, id) + let retrieved = DataContract::fetch(&sdk, id) .await .unwrap() .expect("object should exist"); @@ -74,7 +74,7 @@ async fn test_mock_fetch_data_contract() { async fn test_mock_fetch_document() { use dpp::document::DocumentV0Getters; - let mut sdk = Sdk::new_mock(); + let sdk = Sdk::new_mock(); let document_type: DocumentType = mock_document_type(); let data_contract = mock_data_contract(Some(&document_type)); @@ -90,7 +90,7 @@ async fn test_mock_fetch_document() { .await; let query = - DocumentQuery::new_with_data_contract_id(&mut sdk, data_contract.id(), document_type_name) + DocumentQuery::new_with_data_contract_id(&sdk, data_contract.id(), document_type_name) .await .expect("create document query") .with_document_id(&document_id); @@ -99,7 +99,7 @@ async fn test_mock_fetch_document() { .expect_fetch(query.clone(), Some(expected.clone())) .await; - let retrieved = Document::fetch(&mut sdk, query) + let retrieved = Document::fetch(&sdk, query) .await .unwrap() .expect("identity should exist"); diff --git a/packages/rs-sdk/tests/fetch/mock_fetch_many.rs b/packages/rs-sdk/tests/fetch/mock_fetch_many.rs index 23964267fb..ad9d1b9584 100644 --- a/packages/rs-sdk/tests/fetch/mock_fetch_many.rs +++ b/packages/rs-sdk/tests/fetch/mock_fetch_many.rs @@ -1,5 +1,6 @@ use std::collections::BTreeMap; +use super::common::{mock_data_contract, mock_document_type}; use dpp::{ data_contract::{ accessors::v0::DataContractV0Getters, @@ -14,13 +15,11 @@ use rs_sdk::{ Sdk, }; -use crate::common::{mock_data_contract, mock_document_type}; - /// Given some data contract, document type and 1 document of this type, when I request multiple documents, I get that /// document. #[tokio::test] async fn test_mock_document_fetch_many() { - let mut sdk = Sdk::new_mock(); + let sdk = Sdk::new_mock(); let document_type: DocumentType = mock_document_type(); let data_contract = mock_data_contract(Some(&document_type)); @@ -42,7 +41,7 @@ async fn test_mock_document_fetch_many() { .expect_fetch_many(query.clone(), Some(expected.clone())) .await; - let retrieved = Document::fetch_many(&mut sdk, query).await.unwrap(); + let retrieved = Document::fetch_many(&sdk, query).await.unwrap(); assert!(!retrieved.is_empty()); assert_eq!(retrieved, expected); diff --git a/packages/rs-sdk/tests/fetch/main.rs b/packages/rs-sdk/tests/fetch/mod.rs similarity index 77% rename from packages/rs-sdk/tests/fetch/main.rs rename to packages/rs-sdk/tests/fetch/mod.rs index b5be6bfe82..b6e8ce893e 100644 --- a/packages/rs-sdk/tests/fetch/main.rs +++ b/packages/rs-sdk/tests/fetch/mod.rs @@ -1,9 +1,12 @@ +// TODO: Rename this test package from `fetch` to `sdk`, 'integration` or sth similar #[cfg(not(feature = "mocks"))] compile_error!("tests require `mocks` feature to be enabled"); #[cfg(not(any(feature = "network-testing", feature = "offline-testing")))] compile_error!("network-testing or offline-testing must be enabled for tests"); +#[cfg(feature = "mocks")] +mod broadcast; mod common; mod config; mod data_contract; diff --git a/packages/rs-sdk/tests/fetch/protocol_version_vote_count.rs b/packages/rs-sdk/tests/fetch/protocol_version_vote_count.rs index d8e0ece0c0..39510233a9 100644 --- a/packages/rs-sdk/tests/fetch/protocol_version_vote_count.rs +++ b/packages/rs-sdk/tests/fetch/protocol_version_vote_count.rs @@ -1,5 +1,5 @@ -use crate::{common::setup_logs, config::Config}; -use drive_proof_verifier::types::ProtocolVersionVoteCount; +use super::{common::setup_logs, config::Config}; +use dpp::version::ProtocolVersionVoteCount; use rs_sdk::platform::FetchMany; /// Given some existing identity ID, when I fetch the identity keys, I get some of them indexed by key ID. @@ -8,9 +8,9 @@ async fn test_protocol_version_vote_count() { setup_logs(); let cfg = Config::new(); - let mut sdk = cfg.setup_api().await; + let sdk = cfg.setup_api().await; - let votings = ProtocolVersionVoteCount::fetch_many(&mut sdk, ()) + let votings = ProtocolVersionVoteCount::fetch_many(&sdk, ()) .await .expect("fetch protocol version votes"); diff --git a/packages/rs-sdk/tests/fetch/protocol_version_votes.rs b/packages/rs-sdk/tests/fetch/protocol_version_votes.rs index 2bd4901993..c79ead12fb 100644 --- a/packages/rs-sdk/tests/fetch/protocol_version_votes.rs +++ b/packages/rs-sdk/tests/fetch/protocol_version_votes.rs @@ -1,4 +1,4 @@ -use crate::{common::setup_logs, config::Config}; +use super::{common::setup_logs, config::Config}; use dashcore_rpc::dashcore::{hashes::Hash, ProTxHash}; use drive_proof_verifier::types::MasternodeProtocolVote; use rs_sdk::platform::{types::version_votes::MasternodeProtocolVoteEx, FetchMany}; @@ -9,10 +9,10 @@ async fn test_protocol_version_votes_zeros() { setup_logs(); let cfg = Config::new(); - let mut sdk = cfg.setup_api().await; + let sdk = cfg.setup_api().await; let starting_protxhash = ProTxHash::from_slice(&[0u8; 32]).expect("zero protxhash"); - let votings = MasternodeProtocolVote::fetch_many(&mut sdk, starting_protxhash) + let votings = MasternodeProtocolVote::fetch_many(&sdk, starting_protxhash) .await .expect("fetch protocol version votes by node"); @@ -27,9 +27,9 @@ async fn test_protocol_version_votes_none() { setup_logs(); let cfg = Config::new(); - let mut sdk = cfg.setup_api().await; + let sdk = cfg.setup_api().await; - let votings = MasternodeProtocolVote::fetch_many(&mut sdk, None) + let votings = MasternodeProtocolVote::fetch_many(&sdk, None) .await .expect("fetch protocol version votes by node"); @@ -44,10 +44,10 @@ async fn test_protocol_version_votes_limit_2() { setup_logs(); let cfg = Config::new(); - let mut sdk = cfg.setup_api().await; + let sdk = cfg.setup_api().await; let starting_protxhash = ProTxHash::from_slice(&[0u8; 32]).expect("zero protxhash"); - let votings = MasternodeProtocolVote::fetch_many_with_limit(&mut sdk, starting_protxhash, 2) + let votings = MasternodeProtocolVote::fetch_many_with_limit(&sdk, starting_protxhash, 2) .await .expect("fetch protocol version votes by node"); @@ -62,10 +62,10 @@ async fn test_protocol_version_votes_nx() { setup_logs(); let cfg = Config::new(); - let mut sdk = cfg.setup_api().await; + let sdk = cfg.setup_api().await; let starting_protxhash = Some(ProTxHash::from_slice(&[0xffu8; 32]).expect("zero protxhash")); - let votings = MasternodeProtocolVote::fetch_votes(&mut sdk, starting_protxhash, Some(2)) + let votings = MasternodeProtocolVote::fetch_votes(&sdk, starting_protxhash, Some(2)) .await .expect("fetch protocol version votes by node"); @@ -80,9 +80,9 @@ async fn test_protocol_version_votes_limit_0() { setup_logs(); let cfg = Config::new(); - let mut sdk = cfg.setup_api().await; + let sdk = cfg.setup_api().await; - let result = MasternodeProtocolVote::fetch_votes(&mut sdk, None, Some(0)).await; + let result = MasternodeProtocolVote::fetch_votes(&sdk, None, Some(0)).await; assert!(result.is_err()); } diff --git a/packages/rs-sdk/tests/main.rs b/packages/rs-sdk/tests/main.rs new file mode 100644 index 0000000000..7f11b913fc --- /dev/null +++ b/packages/rs-sdk/tests/main.rs @@ -0,0 +1,9 @@ +//! # SDK tests +//! +//! This module contains tests for the SDK. +//! Tests require `mocks` feature to be enabled. +//! +//! See Cargo.toml for more details. + +#[cfg(feature = "mocks")] +mod fetch; diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.335955511Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json b/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.335955511Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json deleted file mode 100644 index 51b7e28a49..0000000000 --- a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.335955511Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json +++ /dev/null @@ -1 +0,0 @@ -{"request":{"version":{"v0":{"id":[48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172],"prove":true}}},"response":{"version":{"v0":{"metadata":{"height":"496","core_chain_locked_height":1626,"epoch":20,"time_ms":"1700762179839","protocol_version":1,"chain_id":"dashmate_local_36"},"result":{"proof":{"grovedb_proof":[1,1,198,2,1,191,111,198,73,20,169,78,87,218,51,25,198,58,172,28,1,183,8,209,14,63,217,17,124,131,92,143,52,144,15,78,211,4,1,32,0,36,2,1,32,65,63,57,243,204,9,106,71,187,2,94,221,190,127,141,114,137,209,243,50,60,215,90,101,229,15,115,5,44,117,182,217,0,13,64,223,85,121,82,184,247,105,138,111,225,252,17,37,52,199,109,212,114,11,182,154,158,138,46,128,38,94,56,44,75,16,1,152,212,6,9,60,7,90,253,67,26,190,161,178,33,173,49,219,116,125,214,117,45,147,115,13,155,156,78,63,108,225,152,17,2,204,254,253,193,45,87,201,63,108,140,98,61,225,223,229,34,208,158,221,141,103,228,168,52,16,123,83,68,64,77,155,5,16,1,195,54,53,19,110,80,46,154,197,36,75,21,162,10,117,126,7,89,206,10,144,130,60,211,127,137,63,106,73,85,109,38,4,1,96,0,45,4,1,32,65,63,57,243,204,9,106,71,187,2,94,221,190,127,141,114,137,209,243,50,60,215,90,101,229,15,115,5,44,117,182,217,253,0,252,58,4,253,198,0,0,0,215,47,92,117,235,141,133,44,48,214,12,62,47,215,91,223,175,142,93,105,201,4,90,48,197,143,175,65,178,238,25,177,16,1,3,102,208,132,81,115,249,124,23,227,212,165,35,129,203,40,98,153,173,147,241,172,234,117,80,118,110,48,147,229,217,204,17,17,1,213,1,1,9,167,197,156,150,76,38,98,18,45,25,134,65,26,81,2,72,149,153,251,218,203,242,173,241,123,237,134,82,6,190,146,4,32,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,0,9,2,1,1,2,1,3,0,0,0,171,118,116,140,89,137,208,170,37,136,27,102,222,157,117,207,45,148,61,93,130,167,132,211,240,170,230,21,29,108,130,62,16,1,241,250,101,61,30,82,179,252,126,130,148,173,29,96,30,67,18,189,43,72,252,116,9,131,224,85,218,95,15,54,16,29,17,2,146,193,239,158,94,16,174,90,0,59,138,176,91,102,207,210,103,170,233,107,147,127,32,96,164,144,172,13,95,207,189,178,16,1,40,2,136,3,190,247,219,224,31,248,84,34,220,218,23,168,225,228,134,141,144,132,203,66,28,176,28,148,183,88,245,1,17,1,127,3,1,0,0,11,0,8,0,0,0,0,0,0,0,0,0,4,1,1,0,5,2,1,1,1,0,187,26,123,178,92,236,140,47,217,118,80,42,43,3,193,68,145,37,2,103,11,198,208,127,224,171,198,45,214,95,25,26,16,2,215,214,150,50,43,118,190,187,1,88,134,141,135,77,213,209,41,110,212,148,5,246,114,94,88,218,204,50,211,88,61,48,16,1,70,25,123,162,209,216,154,230,95,14,56,180,32,113,102,210,182,213,32,20,204,112,76,86,112,130,191,29,189,101,249,223,17,2,101,3,1,0,0,45,0,42,0,0,0,0,0,0,0,33,2,96,85,184,126,82,70,165,44,218,228,249,30,215,58,128,247,39,29,20,204,189,174,59,90,252,220,150,204,253,32,73,64,0,0,3,1,1,0,45,0,42,0,1,0,2,0,0,0,33,3,7,21,241,88,44,241,135,226,119,224,56,235,17,233,143,14,28,189,253,211,35,40,147,25,128,209,34,253,208,94,150,219,0,0,16,2,207,1,1,64,73,194,113,147,86,152,163,39,150,106,40,80,207,123,140,201,1,246,45,227,178,215,197,145,40,24,178,120,212,204,100,4,32,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,0,3,3,0,0,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,16,1,3,207,237,208,175,160,108,250,127,37,214,46,113,97,201,53,9,166,164,192,39,188,142,215,119,204,230,134,77,40,94,174,17,2,137,55,32,169,123,196,47,111,55,237,142,237,212,151,35,145,129,149,32,86,123,54,68,188,209,146,213,120,53,25,205,45,16,1,180,58,29,170,183,13,81,20,135,106,232,131,28,200,44,132,42,156,91,80,30,203,234,113,102,241,237,57,22,156,161,36,17],"quorum_hash":[34,153,131,64,66,147,240,32,92,27,189,141,240,96,197,152,58,71,115,107,141,84,31,116,141,45,108,40,72,130,129,16],"signature":[174,87,124,110,58,18,45,93,176,103,34,219,129,77,125,251,0,53,179,205,179,163,119,132,75,182,206,115,169,66,222,75,198,129,190,101,113,107,51,62,162,87,240,206,131,7,138,231,23,70,191,154,140,213,120,181,9,103,29,43,59,23,216,243,250,247,119,189,35,250,91,188,166,212,93,12,141,145,56,165,17,132,55,145,100,16,15,244,67,185,168,147,200,242,10,127],"round":0,"block_id_hash":[243,30,197,193,10,25,24,84,159,94,166,75,60,223,157,239,84,145,165,182,253,74,253,86,248,192,23,123,178,91,13,143],"quorum_type":106}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.335957885Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json b/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.335957885Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json deleted file mode 100644 index 51b7e28a49..0000000000 --- a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.335957885Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json +++ /dev/null @@ -1 +0,0 @@ -{"request":{"version":{"v0":{"id":[48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172],"prove":true}}},"response":{"version":{"v0":{"metadata":{"height":"496","core_chain_locked_height":1626,"epoch":20,"time_ms":"1700762179839","protocol_version":1,"chain_id":"dashmate_local_36"},"result":{"proof":{"grovedb_proof":[1,1,198,2,1,191,111,198,73,20,169,78,87,218,51,25,198,58,172,28,1,183,8,209,14,63,217,17,124,131,92,143,52,144,15,78,211,4,1,32,0,36,2,1,32,65,63,57,243,204,9,106,71,187,2,94,221,190,127,141,114,137,209,243,50,60,215,90,101,229,15,115,5,44,117,182,217,0,13,64,223,85,121,82,184,247,105,138,111,225,252,17,37,52,199,109,212,114,11,182,154,158,138,46,128,38,94,56,44,75,16,1,152,212,6,9,60,7,90,253,67,26,190,161,178,33,173,49,219,116,125,214,117,45,147,115,13,155,156,78,63,108,225,152,17,2,204,254,253,193,45,87,201,63,108,140,98,61,225,223,229,34,208,158,221,141,103,228,168,52,16,123,83,68,64,77,155,5,16,1,195,54,53,19,110,80,46,154,197,36,75,21,162,10,117,126,7,89,206,10,144,130,60,211,127,137,63,106,73,85,109,38,4,1,96,0,45,4,1,32,65,63,57,243,204,9,106,71,187,2,94,221,190,127,141,114,137,209,243,50,60,215,90,101,229,15,115,5,44,117,182,217,253,0,252,58,4,253,198,0,0,0,215,47,92,117,235,141,133,44,48,214,12,62,47,215,91,223,175,142,93,105,201,4,90,48,197,143,175,65,178,238,25,177,16,1,3,102,208,132,81,115,249,124,23,227,212,165,35,129,203,40,98,153,173,147,241,172,234,117,80,118,110,48,147,229,217,204,17,17,1,213,1,1,9,167,197,156,150,76,38,98,18,45,25,134,65,26,81,2,72,149,153,251,218,203,242,173,241,123,237,134,82,6,190,146,4,32,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,0,9,2,1,1,2,1,3,0,0,0,171,118,116,140,89,137,208,170,37,136,27,102,222,157,117,207,45,148,61,93,130,167,132,211,240,170,230,21,29,108,130,62,16,1,241,250,101,61,30,82,179,252,126,130,148,173,29,96,30,67,18,189,43,72,252,116,9,131,224,85,218,95,15,54,16,29,17,2,146,193,239,158,94,16,174,90,0,59,138,176,91,102,207,210,103,170,233,107,147,127,32,96,164,144,172,13,95,207,189,178,16,1,40,2,136,3,190,247,219,224,31,248,84,34,220,218,23,168,225,228,134,141,144,132,203,66,28,176,28,148,183,88,245,1,17,1,127,3,1,0,0,11,0,8,0,0,0,0,0,0,0,0,0,4,1,1,0,5,2,1,1,1,0,187,26,123,178,92,236,140,47,217,118,80,42,43,3,193,68,145,37,2,103,11,198,208,127,224,171,198,45,214,95,25,26,16,2,215,214,150,50,43,118,190,187,1,88,134,141,135,77,213,209,41,110,212,148,5,246,114,94,88,218,204,50,211,88,61,48,16,1,70,25,123,162,209,216,154,230,95,14,56,180,32,113,102,210,182,213,32,20,204,112,76,86,112,130,191,29,189,101,249,223,17,2,101,3,1,0,0,45,0,42,0,0,0,0,0,0,0,33,2,96,85,184,126,82,70,165,44,218,228,249,30,215,58,128,247,39,29,20,204,189,174,59,90,252,220,150,204,253,32,73,64,0,0,3,1,1,0,45,0,42,0,1,0,2,0,0,0,33,3,7,21,241,88,44,241,135,226,119,224,56,235,17,233,143,14,28,189,253,211,35,40,147,25,128,209,34,253,208,94,150,219,0,0,16,2,207,1,1,64,73,194,113,147,86,152,163,39,150,106,40,80,207,123,140,201,1,246,45,227,178,215,197,145,40,24,178,120,212,204,100,4,32,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,0,3,3,0,0,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,16,1,3,207,237,208,175,160,108,250,127,37,214,46,113,97,201,53,9,166,164,192,39,188,142,215,119,204,230,134,77,40,94,174,17,2,137,55,32,169,123,196,47,111,55,237,142,237,212,151,35,145,129,149,32,86,123,54,68,188,209,146,213,120,53,25,205,45,16,1,180,58,29,170,183,13,81,20,135,106,232,131,28,200,44,132,42,156,91,80,30,203,234,113,102,241,237,57,22,156,161,36,17],"quorum_hash":[34,153,131,64,66,147,240,32,92,27,189,141,240,96,197,152,58,71,115,107,141,84,31,116,141,45,108,40,72,130,129,16],"signature":[174,87,124,110,58,18,45,93,176,103,34,219,129,77,125,251,0,53,179,205,179,163,119,132,75,182,206,115,169,66,222,75,198,129,190,101,113,107,51,62,162,87,240,206,131,7,138,231,23,70,191,154,140,213,120,181,9,103,29,43,59,23,216,243,250,247,119,189,35,250,91,188,166,212,93,12,141,145,56,165,17,132,55,145,100,16,15,244,67,185,168,147,200,242,10,127],"round":0,"block_id_hash":[243,30,197,193,10,25,24,84,159,94,166,75,60,223,157,239,84,145,165,182,253,74,253,86,248,192,23,123,178,91,13,143],"quorum_type":106}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.342863939Z_GetDataContractRequest_36b3cb705d54b996dccf0f8332c37850589acb5ba186d9aca3b1cf78af19ed50.json b/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.342863939Z_GetDataContractRequest_36b3cb705d54b996dccf0f8332c37850589acb5ba186d9aca3b1cf78af19ed50.json deleted file mode 100644 index ebc5511918..0000000000 --- a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.342863939Z_GetDataContractRequest_36b3cb705d54b996dccf0f8332c37850589acb5ba186d9aca3b1cf78af19ed50.json +++ /dev/null @@ -1 +0,0 @@ -{"request":{"version":{"v0":{"id":[230,104,198,89,175,102,174,225,231,44,24,109,222,123,91,126,10,29,113,42,9,196,13,87,33,246,34,191,83,197,49,85],"prove":true}}},"response":{"version":{"v0":{"metadata":{"height":"496","core_chain_locked_height":1626,"epoch":20,"time_ms":"1700762179839","protocol_version":1,"chain_id":"dashmate_local_36"},"result":{"proof":{"grovedb_proof":[1,2,255,30,3,1,0,15,88,0,251,83,15,0,230,104,198,89,175,102,174,225,231,44,24,109,222,123,91,126,10,29,113,42,9,196,13,87,33,246,34,191,83,197,49,85,0,0,0,0,0,1,0,0,1,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,0,2,6,100,111,109,97,105,110,22,6,18,4,116,121,112,101,18,6,111,98,106,101,99,116,18,7,105,110,100,105,99,101,115,21,3,22,3,18,4,110,97,109,101,18,18,112,97,114,101,110,116,78,97,109,101,65,110,100,76,97,98,101,108,18,10,112,114,111,112,101,114,116,105,101,115,21,2,22,1,18,26,110,111,114,109,97,108,105,122,101,100,80,97,114,101,110,116,68,111,109,97,105,110,78,97,109,101,18,3,97,115,99,22,1,18,15,110,111,114,109,97,108,105,122,101,100,76,97,98,101,108,18,3,97,115,99,18,6,117,110,105,113,117,101,19,1,22,3,18,4,110,97,109,101,18,14,100,97,115,104,73,100,101,110,116,105,116,121,73,100,18,10,112,114,111,112,101,114,116,105,101,115,21,1,22,1,18,28,114,101,99,111,114,100,115,46,100,97,115,104,85,110,105,113,117,101,73,100,101,110,116,105,116,121,73,100,18,3,97,115,99,18,6,117,110,105,113,117,101,19,1,22,2,18,4,110,97,109,101,18,9,100,97,115,104,65,108,105,97,115,18,10,112,114,111,112,101,114,116,105,101,115,21,1,22,1,18,27,114,101,99,111,114,100,115,46,100,97,115,104,65,108,105,97,115,73,100,101,110,116,105,116,121,73,100,18,3,97,115,99,18,10,112,114,111,112,101,114,116,105,101,115,22,7,18,5,108,97,98,101,108,22,6,18,4,116,121,112,101,18,6,115,116,114,105,110,103,18,7,112,97,116,116,101,114,110,18,42,94,91,97,45,122,65,45,90,48,45,57,93,91,97,45,122,65,45,90,48,45,57,45,93,123,48,44,54,49,125,91,97,45,122,65,45,90,48,45,57,93,36,18,9,109,105,110,76,101,110,103,116,104,2,3,18,9,109,97,120,76,101,110,103,116,104,2,63,18,8,112,111,115,105,116,105,111,110,2,0,18,11,100,101,115,99,114,105,112,116,105,111,110,18,25,68,111,109,97,105,110,32,108,97,98,101,108,46,32,101,46,103,46,32,39,66,111,98,39,46,18,15,110,111,114,109,97,108,105,122,101,100,76,97,98,101,108,22,6,18,4,116,121,112,101,18,6,115,116,114,105,110,103,18,7,112,97,116,116,101,114,110,18,60,94,91,97,45,104,106,45,107,109,45,110,112,45,122,48,45,57,93,91,97,45,104,106,45,107,109,45,110,112,45,122,48,45,57,45,93,123,48,44,54,49,125,91,97,45,104,106,45,107,109,45,110,112,45,122,48,45,57,93,36,18,9,109,97,120,76,101,110,103,116,104,2,63,18,8,112,111,115,105,116,105,111,110,2,1,18,11,100,101,115,99,114,105,112,116,105,111,110,18,163,68,111,109,97,105,110,32,108,97,98,101,108,32,99,111,110,118,101,114,116,101,100,32,116,111,32,108,111,119,101,114,99,97,115,101,32,102,111,114,32,99,97,115,101,45,105,110,115,101,110,115,105,116,105,118,101,32,117,110,105,113,117,101,110,101,115,115,32,118,97,108,105,100,97,116,105,111,110,46,32,34,111,34,44,32,34,105,34,32,97,110,100,32,34,108,34,32,114,101,112,108,97,99,101,100,32,119,105,116,104,32,34,48,34,32,97,110,100,32,34,49,34,32,116,111,32,109,105,116,105,103,97,116,101,32,104,111,109,111,103,114,97,112,104,32,97,116,116,97,99,107,46,32,101,46,103,46,32,39,98,48,98,39,18,8,36,99,111,109,109,101,110,116,18,92,77,117,115,116,32,98,101,32,101,113,117,97,108,32,116,111,32,116,104,101,32,108,97,98,101,108,32,105,110,32,108,111,119,101,114,99,97,115,101,46,32,34,111,34,44,32,34,105,34,32,97,110,100,32,34,108,34,32,109,117,115,116,32,98,101,32,114,101,112,108,97,99,101,100,32,119,105,116,104,32,34,48,34,32,97,110,100,32,34,49,34,46,18,16,112,97,114,101,110,116,68,111,109,97,105,110,78,97,109,101,22,6,18,4,116,121,112,101,18,6,115,116,114,105,110,103,18,7,112,97,116,116,101,114,110,18,45,94,36,124,94,91,97,45,122,65,45,90,48,45,57,93,91,97,45,122,65,45,90,48,45,57,45,93,123,48,44,54,49,125,91,97,45,122,65,45,90,48,45,57,93,36,18,9,109,105,110,76,101,110,103,116,104,2,0,18,9,109,97,120,76,101,110,103,116,104,2,63,18,8,112,111,115,105,116,105,111,110,2,2,18,11,100,101,115,99,114,105,112,116,105,111,110,18,39,65,32,102,117,108,108,32,112,97,114,101,110,116,32,100,111,109,97,105,110,32,110,97,109,101,46,32,101,46,103,46,32,39,100,97,115,104,39,46,18,26,110,111,114,109,97,108,105,122,101,100,80,97,114,101,110,116,68,111,109,97,105,110,78,97,109,101,22,7,18,4,116,121,112,101,18,6,115,116,114,105,110,103,18,7,112,97,116,116,101,114,110,18,65,94,36,124,94,91,97,45,104,106,45,107,109,45,110,112,45,122,48,45,57,93,91,97,45,104,106,45,107,109,45,110,112,45,122,48,45,57,45,92,46,93,123,48,44,54,49,125,91,97,45,104,106,45,107,109,45,110,112,45,122,48,45,57,93,36,18,9,109,105,110,76,101,110,103,116,104,2,0,18,9,109,97,120,76,101,110,103,116,104,2,63,18,8,112,111,115,105,116,105,111,110,2,3,18,11,100,101,115,99,114,105,112,116,105,111,110,18,162,65,32,112,97,114,101,110,116,32,100,111,109,97,105,110,32,110,97,109,101,32,105,110,32,108,111,119,101,114,99,97,115,101,32,102,111,114,32,99,97,115,101,45,105,110,115,101,110,115,105,116,105,118,101,32,117,110,105,113,117,101,110,101,115,115,32,118,97,108,105,100,97,116,105,111,110,46,32,34,111,34,44,32,34,105,34,32,97,110,100,32,34,108,34,32,114,101,112,108,97,99,101,100,32,119,105,116,104,32,34,48,34,32,97,110,100,32,34,49,34,32,116,111,32,109,105,116,105,103,97,116,101,32,104,111,109,111,103,114,97,112,104,32,97,116,116,97,99,107,46,32,101,46,103,46,32,39,100,97,115,104,39,18,8,36,99,111,109,109,101,110,116,18,192,77,117,115,116,32,101,105,116,104,101,114,32,98,101,32,101,113,117,97,108,32,116,111,32,97,110,32,101,120,105,115,116,105,110,103,32,100,111,109,97,105,110,32,111,114,32,101,109,112,116,121,32,116,111,32,99,114,101,97,116,101,32,97,32,116,111,112,32,108,101,118,101,108,32,100,111,109,97,105,110,46,32,34,111,34,44,32,34,105,34,32,97,110,100,32,34,108,34,32,109,117,115,116,32,98,101,32,114,101,112,108,97,99,101,100,32,119,105,116,104,32,34,48,34,32,97,110,100,32,34,49,34,46,32,79,110,108,121,32,116,104,101,32,100,97,116,97,32,99,111,110,116,114,97,99,116,32,111,119,110,101,114,32,99,97,110,32,99,114,101,97,116,101,32,116,111,112,32,108,101,118,101,108,32,100,111,109,97,105,110,115,46,18,12,112,114,101,111,114,100,101,114,83,97,108,116,22,6,18,4,116,121,112,101,18,5,97,114,114,97,121,18,9,98,121,116,101,65,114,114,97,121,19,1,18,8,109,105,110,73,116,101,109,115,2,32,18,8,109,97,120,73,116,101,109,115,2,32,18,8,112,111,115,105,116,105,111,110,2,4,18,11,100,101,115,99,114,105,112,116,105,111,110,18,34,83,97,108,116,32,117,115,101,100,32,105,110,32,116,104,101,32,112,114,101,111,114,100,101,114,32,100,111,99,117,109,101,110,116,18,7,114,101,99,111,114,100,115,22,7,18,4,116,121,112,101,18,6,111,98,106,101,99,116,18,10,112,114,111,112,101,114,116,105,101,115,22,2,18,20,100,97,115,104,85,110,105,113,117,101,73,100,101,110,116,105,116,121,73,100,22,8,18,4,116,121,112,101,18,5,97,114,114,97,121,18,9,98,121,116,101,65,114,114,97,121,19,1,18,8,109,105,110,73,116,101,109,115,2,32,18,8,109,97,120,73,116,101,109,115,2,32,18,8,112,111,115,105,116,105,111,110,2,0,18,16,99,111,110,116,101,110,116,77,101,100,105,97,84,121,112,101,18,33,97,112,112,108,105,99,97,116,105,111,110,47,120,46,100,97,115,104,46,100,112,112,46,105,100,101,110,116,105,102,105,101,114,18,11,100,101,115,99,114,105,112,116,105,111,110,18,62,73,100,101,110,116,105,116,121,32,73,68,32,116,111,32,98,101,32,117,115,101,100,32,116,111,32,99,114,101,97,116,101,32,116,104,101,32,112,114,105,109,97,114,121,32,110,97,109,101,32,116,104,101,32,73,100,101,110,116,105,116,121,18,8,36,99,111,109,109,101,110,116,18,35,77,117,115,116,32,98,101,32,101,113,117,97,108,32,116,111,32,116,104,101,32,100,111,99,117,109,101,110,116,32,111,119,110,101,114,18,19,100,97,115,104,65,108,105,97,115,73,100,101,110,116,105,116,121,73,100,22,8,18,4,116,121,112,101,18,5,97,114,114,97,121,18,9,98,121,116,101,65,114,114,97,121,19,1,18,8,109,105,110,73,116,101,109,115,2,32,18,8,109,97,120,73,116,101,109,115,2,32,18,8,112,111,115,105,116,105,111,110,2,1,18,16,99,111,110,116,101,110,116,77,101,100,105,97,84,121,112,101,18,33,97,112,112,108,105,99,97,116,105,111,110,47,120,46,100,97,115,104,46,100,112,112,46,105,100,101,110,116,105,102,105,101,114,18,11,100,101,115,99,114,105,112,116,105,111,110,18,61,73,100,101,110,116,105,116,121,32,73,68,32,116,111,32,98,101,32,117,115,101,100,32,116,111,32,99,114,101,97,116,101,32,97,108,105,97,115,32,110,97,109,101,115,32,102,111,114,32,116,104,101,32,73,100,101,110,116,105,116,121,18,8,36,99,111,109,109,101,110,116,18,35,77,117,115,116,32,98,101,32,101,113,117,97,108,32,116,111,32,116,104,101,32,100,111,99,117,109,101,110,116,32,111,119,110,101,114,18,13,109,105,110,80,114,111,112,101,114,116,105,101,115,2,1,18,13,109,97,120,80,114,111,112,101,114,116,105,101,115,2,1,18,8,112,111,115,105,116,105,111,110,2,5,18,20,97,100,100,105,116,105,111,110,97,108,80,114,111,112,101,114,116,105,101,115,19,0,18,8,36,99,111,109,109,101,110,116,18,144,67,111,110,115,116,114,97,105,110,116,32,119,105,116,104,32,109,97,120,32,97,110,100,32,109,105,110,32,112,114,111,112,101,114,116,105,101,115,32,101,110,115,117,114,101,32,116,104,97,116,32,111,110,108,121,32,111,110,101,32,105,100,101,110,116,105,116,121,32,114,101,99,111,114,100,32,105,115,32,117,115,101,100,32,45,32,101,105,116,104,101,114,32,97,32,96,100,97,115,104,85,110,105,113,117,101,73,100,101,110,116,105,116,121,73,100,96,32,111,114,32,97,32,96,100,97,115,104,65,108,105,97,115,73,100,101,110,116,105,116,121,73,100,96,18,14,115,117,98,100,111,109,97,105,110,82,117,108,101,115,22,6,18,4,116,121,112,101,18,6,111,98,106,101,99,116,18,10,112,114,111,112,101,114,116,105,101,115,22,1,18,15,97,108,108,111,119,83,117,98,100,111,109,97,105,110,115,22,4,18,4,116,121,112,101,18,7,98,111,111,108,101,97,110,18,11,100,101,115,99,114,105,112,116,105,111,110,18,91,84,104,105,115,32,111,112,116,105,111,110,32,100,101,102,105,110,101,115,32,119,104,111,32,99,97,110,32,99,114,101,97,116,101,32,115,117,98,100,111,109,97,105,110,115,58,32,116,114,117,101,32,45,32,97,110,121,111,110,101,59,32,102,97,108,115,101,32,45,32,111,110,108,121,32,116,104,101,32,100,111,109,97,105,110,32,111,119,110,101,114,18,8,36,99,111,109,109,101,110,116,18,79,79,110,108,121,32,116,104,101,32,100,111,109,97,105,110,32,111,119,110,101,114,32,105,115,32,97,108,108,111,119,101,100,32,116,111,32,99,114,101,97,116,101,32,115,117,98,100,111,109,97,105,110,115,32,102,111,114,32,110,111,110,32,116,111,112,45,108,101,118,101,108,32,100,111,109,97,105,110,115,18,8,112,111,115,105,116,105,111,110,2,0,18,8,112,111,115,105,116,105,111,110,2,6,18,11,100,101,115,99,114,105,112,116,105,111,110,18,66,83,117,98,100,111,109,97,105,110,32,114,117,108,101,115,32,97,108,108,111,119,32,100,111,109,97,105,110,32,111,119,110,101,114,115,32,116,111,32,100,101,102,105,110,101,32,114,117,108,101,115,32,102,111,114,32,115,117,98,100,111,109,97,105,110,115,18,20,97,100,100,105,116,105,111,110,97,108,80,114,111,112,101,114,116,105,101,115,19,0,18,8,114,101,113,117,105,114,101,100,21,1,18,15,97,108,108,111,119,83,117,98,100,111,109,97,105,110,115,18,8,114,101,113,117,105,114,101,100,21,6,18,5,108,97,98,101,108,18,15,110,111,114,109,97,108,105,122,101,100,76,97,98,101,108,18,26,110,111,114,109,97,108,105,122,101,100,80,97,114,101,110,116,68,111,109,97,105,110,78,97,109,101,18,12,112,114,101,111,114,100,101,114,83,97,108,116,18,7,114,101,99,111,114,100,115,18,14,115,117,98,100,111,109,97,105,110,82,117,108,101,115,18,20,97,100,100,105,116,105,111,110,97,108,80,114,111,112,101,114,116,105,101,115,19,0,18,8,36,99,111,109,109,101,110,116,18,251,1,55,73,110,32,111,114,100,101,114,32,116,111,32,114,101,103,105,115,116,101,114,32,97,32,100,111,109,97,105,110,32,121,111,117,32,110,101,101,100,32,116,111,32,99,114,101,97,116,101,32,97,32,112,114,101,111,114,100,101,114,46,32,84,104,101,32,112,114,101,111,114,100,101,114,32,115,116,101,112,32,105,115,32,110,101,101,100,101,100,32,116,111,32,112,114,101,118,101,110,116,32,109,97,110,45,105,110,45,116,104,101,45,109,105,100,100,108,101,32,97,116,116,97,99,107,115,46,32,110,111,114,109,97,108,105,122,101,100,76,97,98,101,108,32,43,32,39,46,39,32,43,32,110,111,114,109,97,108,105,122,101,100,80,97,114,101,110,116,68,111,109,97,105,110,32,109,117,115,116,32,110,111,116,32,98,101,32,108,111,110,103,101,114,32,116,104,97,110,32,50,53,51,32,99,104,97,114,115,32,108,101,110,103,116,104,32,97,115,32,100,101,102,105,110,101,100,32,98,121,32,82,70,67,32,49,48,51,53,46,32,68,111,109,97,105,110,32,100,111,99,117,109,101,110,116,115,32,97,114,101,32,105,109,109,117,116,97,98,108,101,58,32,109,111,100,105,102,105,99,97,116,105,111,110,32,97,110,100,32,100,101,108,101,116,105,111,110,32,97,114,101,32,114,101,115,116,114,105,99,116,101,100,8,112,114,101,111,114,100,101,114,22,6,18,4,116,121,112,101,18,6,111,98,106,101,99,116,18,7,105,110,100,105,99,101,115,21,1,22,3,18,4,110,97,109,101,18,10,115,97,108,116,101,100,72,97,115,104,18,10,112,114,111,112,101,114,116,105,101,115,21,1,22,1,18,16,115,97,108,116,101,100,68,111,109,97,105,110,72,97,115,104,18,3,97,115,99,18,6,117,110,105,113,117,101,19,1,18,10,112,114,111,112,101,114,116,105,101,115,22,1,18,16,115,97,108,116,101,100,68,111,109,97,105,110,72,97,115,104,22,6,18,4,116,121,112,101,18,5,97,114,114,97,121,18,9,98,121,116,101,65,114,114,97,121,19,1,18,8,109,105,110,73,116,101,109,115,2,32,18,8,109,97,120,73,116,101,109,115,2,32,18,8,112,111,115,105,116,105,111,110,2,0,18,11,100,101,115,99,114,105,112,116,105,111,110,18,89,68,111,117,98,108,101,32,115,104,97,45,50,53,54,32,111,102,32,116,104,101,32,99,111,110,99,97,116,101,110,97,116,105,111,110,32,111,102,32,97,32,51,50,32,98,121,116,101,32,114,97,110,100,111,109,32,115,97,108,116,32,97,110,100,32,97,32,110,111,114,109,97,108,105,122,101,100,32,100,111,109,97,105,110,32,110,97,109,101,18,8,114,101,113,117,105,114,101,100,21,1,18,16,115,97,108,116,101,100,68,111,109,97,105,110,72,97,115,104,18,20,97,100,100,105,116,105,111,110,97,108,80,114,111,112,101,114,116,105,101,115,19,0,18,8,36,99,111,109,109,101,110,116,18,74,80,114,101,111,114,100,101,114,32,100,111,99,117,109,101,110,116,115,32,97,114,101,32,105,109,109,117,116,97,98,108,101,58,32,109,111,100,105,102,105,99,97,116,105,111,110,32,97,110,100,32,100,101,108,101,116,105,111,110,32,97,114,101,32,114,101,115,116,114,105,99,116,101,100,0,2,213,134,128,207,201,13,236,20,124,137,134,23,200,118,113,53,4,74,177,5,88,90,191,64,210,150,118,119,120,208,33,226,16,1,141,1,1,53,27,87,37,221,226,28,175,201,185,193,171,161,189,79,11,174,89,129,179,222,243,245,228,182,62,69,51,4,147,15,248,2,1,217,109,238,206,206,168,243,192,236,215,159,163,75,111,52,173,240,242,45,193,69,99,247,92,124,165,253,229,130,228,6,16,4,32,230,104,198,89,175,102,174,225,231,44,24,109,222,123,91,126,10,29,113,42,9,196,13,87,33,246,34,191,83,197,49,85,0,5,2,1,1,1,0,33,138,150,165,224,17,145,179,7,120,169,2,43,51,49,142,79,255,67,7,18,161,70,134,2,167,190,106,29,104,149,81,17,1,141,1,1,62,210,128,237,157,173,255,118,46,120,226,35,148,9,65,38,159,144,75,61,235,31,132,201,170,187,200,81,86,89,44,191,4,1,64,0,36,2,1,32,162,161,180,172,111,239,34,234,42,26,104,232,18,54,68,179,87,135,95,107,65,44,24,16,146,129,193,70,231,178,113,188,0,168,99,211,63,81,56,245,72,156,254,93,201,14,131,171,16,91,237,241,30,32,62,67,128,249,8,196,116,111,157,82,212,16,1,151,170,133,85,12,8,231,83,83,8,28,221,26,134,85,126,234,104,22,231,103,54,180,118,34,209,31,166,11,144,174,155,17],"quorum_hash":[34,153,131,64,66,147,240,32,92,27,189,141,240,96,197,152,58,71,115,107,141,84,31,116,141,45,108,40,72,130,129,16],"signature":[174,87,124,110,58,18,45,93,176,103,34,219,129,77,125,251,0,53,179,205,179,163,119,132,75,182,206,115,169,66,222,75,198,129,190,101,113,107,51,62,162,87,240,206,131,7,138,231,23,70,191,154,140,213,120,181,9,103,29,43,59,23,216,243,250,247,119,189,35,250,91,188,166,212,93,12,141,145,56,165,17,132,55,145,100,16,15,244,67,185,168,147,200,242,10,127],"round":0,"block_id_hash":[243,30,197,193,10,25,24,84,159,94,166,75,60,223,157,239,84,145,165,182,253,74,253,86,248,192,23,123,178,91,13,143],"quorum_type":106}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.342864079Z_GetDataContractRequest_36b3cb705d54b996dccf0f8332c37850589acb5ba186d9aca3b1cf78af19ed50.json b/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.342864079Z_GetDataContractRequest_36b3cb705d54b996dccf0f8332c37850589acb5ba186d9aca3b1cf78af19ed50.json deleted file mode 100644 index ebc5511918..0000000000 --- a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.342864079Z_GetDataContractRequest_36b3cb705d54b996dccf0f8332c37850589acb5ba186d9aca3b1cf78af19ed50.json +++ /dev/null @@ -1 +0,0 @@ -{"request":{"version":{"v0":{"id":[230,104,198,89,175,102,174,225,231,44,24,109,222,123,91,126,10,29,113,42,9,196,13,87,33,246,34,191,83,197,49,85],"prove":true}}},"response":{"version":{"v0":{"metadata":{"height":"496","core_chain_locked_height":1626,"epoch":20,"time_ms":"1700762179839","protocol_version":1,"chain_id":"dashmate_local_36"},"result":{"proof":{"grovedb_proof":[1,2,255,30,3,1,0,15,88,0,251,83,15,0,230,104,198,89,175,102,174,225,231,44,24,109,222,123,91,126,10,29,113,42,9,196,13,87,33,246,34,191,83,197,49,85,0,0,0,0,0,1,0,0,1,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,0,2,6,100,111,109,97,105,110,22,6,18,4,116,121,112,101,18,6,111,98,106,101,99,116,18,7,105,110,100,105,99,101,115,21,3,22,3,18,4,110,97,109,101,18,18,112,97,114,101,110,116,78,97,109,101,65,110,100,76,97,98,101,108,18,10,112,114,111,112,101,114,116,105,101,115,21,2,22,1,18,26,110,111,114,109,97,108,105,122,101,100,80,97,114,101,110,116,68,111,109,97,105,110,78,97,109,101,18,3,97,115,99,22,1,18,15,110,111,114,109,97,108,105,122,101,100,76,97,98,101,108,18,3,97,115,99,18,6,117,110,105,113,117,101,19,1,22,3,18,4,110,97,109,101,18,14,100,97,115,104,73,100,101,110,116,105,116,121,73,100,18,10,112,114,111,112,101,114,116,105,101,115,21,1,22,1,18,28,114,101,99,111,114,100,115,46,100,97,115,104,85,110,105,113,117,101,73,100,101,110,116,105,116,121,73,100,18,3,97,115,99,18,6,117,110,105,113,117,101,19,1,22,2,18,4,110,97,109,101,18,9,100,97,115,104,65,108,105,97,115,18,10,112,114,111,112,101,114,116,105,101,115,21,1,22,1,18,27,114,101,99,111,114,100,115,46,100,97,115,104,65,108,105,97,115,73,100,101,110,116,105,116,121,73,100,18,3,97,115,99,18,10,112,114,111,112,101,114,116,105,101,115,22,7,18,5,108,97,98,101,108,22,6,18,4,116,121,112,101,18,6,115,116,114,105,110,103,18,7,112,97,116,116,101,114,110,18,42,94,91,97,45,122,65,45,90,48,45,57,93,91,97,45,122,65,45,90,48,45,57,45,93,123,48,44,54,49,125,91,97,45,122,65,45,90,48,45,57,93,36,18,9,109,105,110,76,101,110,103,116,104,2,3,18,9,109,97,120,76,101,110,103,116,104,2,63,18,8,112,111,115,105,116,105,111,110,2,0,18,11,100,101,115,99,114,105,112,116,105,111,110,18,25,68,111,109,97,105,110,32,108,97,98,101,108,46,32,101,46,103,46,32,39,66,111,98,39,46,18,15,110,111,114,109,97,108,105,122,101,100,76,97,98,101,108,22,6,18,4,116,121,112,101,18,6,115,116,114,105,110,103,18,7,112,97,116,116,101,114,110,18,60,94,91,97,45,104,106,45,107,109,45,110,112,45,122,48,45,57,93,91,97,45,104,106,45,107,109,45,110,112,45,122,48,45,57,45,93,123,48,44,54,49,125,91,97,45,104,106,45,107,109,45,110,112,45,122,48,45,57,93,36,18,9,109,97,120,76,101,110,103,116,104,2,63,18,8,112,111,115,105,116,105,111,110,2,1,18,11,100,101,115,99,114,105,112,116,105,111,110,18,163,68,111,109,97,105,110,32,108,97,98,101,108,32,99,111,110,118,101,114,116,101,100,32,116,111,32,108,111,119,101,114,99,97,115,101,32,102,111,114,32,99,97,115,101,45,105,110,115,101,110,115,105,116,105,118,101,32,117,110,105,113,117,101,110,101,115,115,32,118,97,108,105,100,97,116,105,111,110,46,32,34,111,34,44,32,34,105,34,32,97,110,100,32,34,108,34,32,114,101,112,108,97,99,101,100,32,119,105,116,104,32,34,48,34,32,97,110,100,32,34,49,34,32,116,111,32,109,105,116,105,103,97,116,101,32,104,111,109,111,103,114,97,112,104,32,97,116,116,97,99,107,46,32,101,46,103,46,32,39,98,48,98,39,18,8,36,99,111,109,109,101,110,116,18,92,77,117,115,116,32,98,101,32,101,113,117,97,108,32,116,111,32,116,104,101,32,108,97,98,101,108,32,105,110,32,108,111,119,101,114,99,97,115,101,46,32,34,111,34,44,32,34,105,34,32,97,110,100,32,34,108,34,32,109,117,115,116,32,98,101,32,114,101,112,108,97,99,101,100,32,119,105,116,104,32,34,48,34,32,97,110,100,32,34,49,34,46,18,16,112,97,114,101,110,116,68,111,109,97,105,110,78,97,109,101,22,6,18,4,116,121,112,101,18,6,115,116,114,105,110,103,18,7,112,97,116,116,101,114,110,18,45,94,36,124,94,91,97,45,122,65,45,90,48,45,57,93,91,97,45,122,65,45,90,48,45,57,45,93,123,48,44,54,49,125,91,97,45,122,65,45,90,48,45,57,93,36,18,9,109,105,110,76,101,110,103,116,104,2,0,18,9,109,97,120,76,101,110,103,116,104,2,63,18,8,112,111,115,105,116,105,111,110,2,2,18,11,100,101,115,99,114,105,112,116,105,111,110,18,39,65,32,102,117,108,108,32,112,97,114,101,110,116,32,100,111,109,97,105,110,32,110,97,109,101,46,32,101,46,103,46,32,39,100,97,115,104,39,46,18,26,110,111,114,109,97,108,105,122,101,100,80,97,114,101,110,116,68,111,109,97,105,110,78,97,109,101,22,7,18,4,116,121,112,101,18,6,115,116,114,105,110,103,18,7,112,97,116,116,101,114,110,18,65,94,36,124,94,91,97,45,104,106,45,107,109,45,110,112,45,122,48,45,57,93,91,97,45,104,106,45,107,109,45,110,112,45,122,48,45,57,45,92,46,93,123,48,44,54,49,125,91,97,45,104,106,45,107,109,45,110,112,45,122,48,45,57,93,36,18,9,109,105,110,76,101,110,103,116,104,2,0,18,9,109,97,120,76,101,110,103,116,104,2,63,18,8,112,111,115,105,116,105,111,110,2,3,18,11,100,101,115,99,114,105,112,116,105,111,110,18,162,65,32,112,97,114,101,110,116,32,100,111,109,97,105,110,32,110,97,109,101,32,105,110,32,108,111,119,101,114,99,97,115,101,32,102,111,114,32,99,97,115,101,45,105,110,115,101,110,115,105,116,105,118,101,32,117,110,105,113,117,101,110,101,115,115,32,118,97,108,105,100,97,116,105,111,110,46,32,34,111,34,44,32,34,105,34,32,97,110,100,32,34,108,34,32,114,101,112,108,97,99,101,100,32,119,105,116,104,32,34,48,34,32,97,110,100,32,34,49,34,32,116,111,32,109,105,116,105,103,97,116,101,32,104,111,109,111,103,114,97,112,104,32,97,116,116,97,99,107,46,32,101,46,103,46,32,39,100,97,115,104,39,18,8,36,99,111,109,109,101,110,116,18,192,77,117,115,116,32,101,105,116,104,101,114,32,98,101,32,101,113,117,97,108,32,116,111,32,97,110,32,101,120,105,115,116,105,110,103,32,100,111,109,97,105,110,32,111,114,32,101,109,112,116,121,32,116,111,32,99,114,101,97,116,101,32,97,32,116,111,112,32,108,101,118,101,108,32,100,111,109,97,105,110,46,32,34,111,34,44,32,34,105,34,32,97,110,100,32,34,108,34,32,109,117,115,116,32,98,101,32,114,101,112,108,97,99,101,100,32,119,105,116,104,32,34,48,34,32,97,110,100,32,34,49,34,46,32,79,110,108,121,32,116,104,101,32,100,97,116,97,32,99,111,110,116,114,97,99,116,32,111,119,110,101,114,32,99,97,110,32,99,114,101,97,116,101,32,116,111,112,32,108,101,118,101,108,32,100,111,109,97,105,110,115,46,18,12,112,114,101,111,114,100,101,114,83,97,108,116,22,6,18,4,116,121,112,101,18,5,97,114,114,97,121,18,9,98,121,116,101,65,114,114,97,121,19,1,18,8,109,105,110,73,116,101,109,115,2,32,18,8,109,97,120,73,116,101,109,115,2,32,18,8,112,111,115,105,116,105,111,110,2,4,18,11,100,101,115,99,114,105,112,116,105,111,110,18,34,83,97,108,116,32,117,115,101,100,32,105,110,32,116,104,101,32,112,114,101,111,114,100,101,114,32,100,111,99,117,109,101,110,116,18,7,114,101,99,111,114,100,115,22,7,18,4,116,121,112,101,18,6,111,98,106,101,99,116,18,10,112,114,111,112,101,114,116,105,101,115,22,2,18,20,100,97,115,104,85,110,105,113,117,101,73,100,101,110,116,105,116,121,73,100,22,8,18,4,116,121,112,101,18,5,97,114,114,97,121,18,9,98,121,116,101,65,114,114,97,121,19,1,18,8,109,105,110,73,116,101,109,115,2,32,18,8,109,97,120,73,116,101,109,115,2,32,18,8,112,111,115,105,116,105,111,110,2,0,18,16,99,111,110,116,101,110,116,77,101,100,105,97,84,121,112,101,18,33,97,112,112,108,105,99,97,116,105,111,110,47,120,46,100,97,115,104,46,100,112,112,46,105,100,101,110,116,105,102,105,101,114,18,11,100,101,115,99,114,105,112,116,105,111,110,18,62,73,100,101,110,116,105,116,121,32,73,68,32,116,111,32,98,101,32,117,115,101,100,32,116,111,32,99,114,101,97,116,101,32,116,104,101,32,112,114,105,109,97,114,121,32,110,97,109,101,32,116,104,101,32,73,100,101,110,116,105,116,121,18,8,36,99,111,109,109,101,110,116,18,35,77,117,115,116,32,98,101,32,101,113,117,97,108,32,116,111,32,116,104,101,32,100,111,99,117,109,101,110,116,32,111,119,110,101,114,18,19,100,97,115,104,65,108,105,97,115,73,100,101,110,116,105,116,121,73,100,22,8,18,4,116,121,112,101,18,5,97,114,114,97,121,18,9,98,121,116,101,65,114,114,97,121,19,1,18,8,109,105,110,73,116,101,109,115,2,32,18,8,109,97,120,73,116,101,109,115,2,32,18,8,112,111,115,105,116,105,111,110,2,1,18,16,99,111,110,116,101,110,116,77,101,100,105,97,84,121,112,101,18,33,97,112,112,108,105,99,97,116,105,111,110,47,120,46,100,97,115,104,46,100,112,112,46,105,100,101,110,116,105,102,105,101,114,18,11,100,101,115,99,114,105,112,116,105,111,110,18,61,73,100,101,110,116,105,116,121,32,73,68,32,116,111,32,98,101,32,117,115,101,100,32,116,111,32,99,114,101,97,116,101,32,97,108,105,97,115,32,110,97,109,101,115,32,102,111,114,32,116,104,101,32,73,100,101,110,116,105,116,121,18,8,36,99,111,109,109,101,110,116,18,35,77,117,115,116,32,98,101,32,101,113,117,97,108,32,116,111,32,116,104,101,32,100,111,99,117,109,101,110,116,32,111,119,110,101,114,18,13,109,105,110,80,114,111,112,101,114,116,105,101,115,2,1,18,13,109,97,120,80,114,111,112,101,114,116,105,101,115,2,1,18,8,112,111,115,105,116,105,111,110,2,5,18,20,97,100,100,105,116,105,111,110,97,108,80,114,111,112,101,114,116,105,101,115,19,0,18,8,36,99,111,109,109,101,110,116,18,144,67,111,110,115,116,114,97,105,110,116,32,119,105,116,104,32,109,97,120,32,97,110,100,32,109,105,110,32,112,114,111,112,101,114,116,105,101,115,32,101,110,115,117,114,101,32,116,104,97,116,32,111,110,108,121,32,111,110,101,32,105,100,101,110,116,105,116,121,32,114,101,99,111,114,100,32,105,115,32,117,115,101,100,32,45,32,101,105,116,104,101,114,32,97,32,96,100,97,115,104,85,110,105,113,117,101,73,100,101,110,116,105,116,121,73,100,96,32,111,114,32,97,32,96,100,97,115,104,65,108,105,97,115,73,100,101,110,116,105,116,121,73,100,96,18,14,115,117,98,100,111,109,97,105,110,82,117,108,101,115,22,6,18,4,116,121,112,101,18,6,111,98,106,101,99,116,18,10,112,114,111,112,101,114,116,105,101,115,22,1,18,15,97,108,108,111,119,83,117,98,100,111,109,97,105,110,115,22,4,18,4,116,121,112,101,18,7,98,111,111,108,101,97,110,18,11,100,101,115,99,114,105,112,116,105,111,110,18,91,84,104,105,115,32,111,112,116,105,111,110,32,100,101,102,105,110,101,115,32,119,104,111,32,99,97,110,32,99,114,101,97,116,101,32,115,117,98,100,111,109,97,105,110,115,58,32,116,114,117,101,32,45,32,97,110,121,111,110,101,59,32,102,97,108,115,101,32,45,32,111,110,108,121,32,116,104,101,32,100,111,109,97,105,110,32,111,119,110,101,114,18,8,36,99,111,109,109,101,110,116,18,79,79,110,108,121,32,116,104,101,32,100,111,109,97,105,110,32,111,119,110,101,114,32,105,115,32,97,108,108,111,119,101,100,32,116,111,32,99,114,101,97,116,101,32,115,117,98,100,111,109,97,105,110,115,32,102,111,114,32,110,111,110,32,116,111,112,45,108,101,118,101,108,32,100,111,109,97,105,110,115,18,8,112,111,115,105,116,105,111,110,2,0,18,8,112,111,115,105,116,105,111,110,2,6,18,11,100,101,115,99,114,105,112,116,105,111,110,18,66,83,117,98,100,111,109,97,105,110,32,114,117,108,101,115,32,97,108,108,111,119,32,100,111,109,97,105,110,32,111,119,110,101,114,115,32,116,111,32,100,101,102,105,110,101,32,114,117,108,101,115,32,102,111,114,32,115,117,98,100,111,109,97,105,110,115,18,20,97,100,100,105,116,105,111,110,97,108,80,114,111,112,101,114,116,105,101,115,19,0,18,8,114,101,113,117,105,114,101,100,21,1,18,15,97,108,108,111,119,83,117,98,100,111,109,97,105,110,115,18,8,114,101,113,117,105,114,101,100,21,6,18,5,108,97,98,101,108,18,15,110,111,114,109,97,108,105,122,101,100,76,97,98,101,108,18,26,110,111,114,109,97,108,105,122,101,100,80,97,114,101,110,116,68,111,109,97,105,110,78,97,109,101,18,12,112,114,101,111,114,100,101,114,83,97,108,116,18,7,114,101,99,111,114,100,115,18,14,115,117,98,100,111,109,97,105,110,82,117,108,101,115,18,20,97,100,100,105,116,105,111,110,97,108,80,114,111,112,101,114,116,105,101,115,19,0,18,8,36,99,111,109,109,101,110,116,18,251,1,55,73,110,32,111,114,100,101,114,32,116,111,32,114,101,103,105,115,116,101,114,32,97,32,100,111,109,97,105,110,32,121,111,117,32,110,101,101,100,32,116,111,32,99,114,101,97,116,101,32,97,32,112,114,101,111,114,100,101,114,46,32,84,104,101,32,112,114,101,111,114,100,101,114,32,115,116,101,112,32,105,115,32,110,101,101,100,101,100,32,116,111,32,112,114,101,118,101,110,116,32,109,97,110,45,105,110,45,116,104,101,45,109,105,100,100,108,101,32,97,116,116,97,99,107,115,46,32,110,111,114,109,97,108,105,122,101,100,76,97,98,101,108,32,43,32,39,46,39,32,43,32,110,111,114,109,97,108,105,122,101,100,80,97,114,101,110,116,68,111,109,97,105,110,32,109,117,115,116,32,110,111,116,32,98,101,32,108,111,110,103,101,114,32,116,104,97,110,32,50,53,51,32,99,104,97,114,115,32,108,101,110,103,116,104,32,97,115,32,100,101,102,105,110,101,100,32,98,121,32,82,70,67,32,49,48,51,53,46,32,68,111,109,97,105,110,32,100,111,99,117,109,101,110,116,115,32,97,114,101,32,105,109,109,117,116,97,98,108,101,58,32,109,111,100,105,102,105,99,97,116,105,111,110,32,97,110,100,32,100,101,108,101,116,105,111,110,32,97,114,101,32,114,101,115,116,114,105,99,116,101,100,8,112,114,101,111,114,100,101,114,22,6,18,4,116,121,112,101,18,6,111,98,106,101,99,116,18,7,105,110,100,105,99,101,115,21,1,22,3,18,4,110,97,109,101,18,10,115,97,108,116,101,100,72,97,115,104,18,10,112,114,111,112,101,114,116,105,101,115,21,1,22,1,18,16,115,97,108,116,101,100,68,111,109,97,105,110,72,97,115,104,18,3,97,115,99,18,6,117,110,105,113,117,101,19,1,18,10,112,114,111,112,101,114,116,105,101,115,22,1,18,16,115,97,108,116,101,100,68,111,109,97,105,110,72,97,115,104,22,6,18,4,116,121,112,101,18,5,97,114,114,97,121,18,9,98,121,116,101,65,114,114,97,121,19,1,18,8,109,105,110,73,116,101,109,115,2,32,18,8,109,97,120,73,116,101,109,115,2,32,18,8,112,111,115,105,116,105,111,110,2,0,18,11,100,101,115,99,114,105,112,116,105,111,110,18,89,68,111,117,98,108,101,32,115,104,97,45,50,53,54,32,111,102,32,116,104,101,32,99,111,110,99,97,116,101,110,97,116,105,111,110,32,111,102,32,97,32,51,50,32,98,121,116,101,32,114,97,110,100,111,109,32,115,97,108,116,32,97,110,100,32,97,32,110,111,114,109,97,108,105,122,101,100,32,100,111,109,97,105,110,32,110,97,109,101,18,8,114,101,113,117,105,114,101,100,21,1,18,16,115,97,108,116,101,100,68,111,109,97,105,110,72,97,115,104,18,20,97,100,100,105,116,105,111,110,97,108,80,114,111,112,101,114,116,105,101,115,19,0,18,8,36,99,111,109,109,101,110,116,18,74,80,114,101,111,114,100,101,114,32,100,111,99,117,109,101,110,116,115,32,97,114,101,32,105,109,109,117,116,97,98,108,101,58,32,109,111,100,105,102,105,99,97,116,105,111,110,32,97,110,100,32,100,101,108,101,116,105,111,110,32,97,114,101,32,114,101,115,116,114,105,99,116,101,100,0,2,213,134,128,207,201,13,236,20,124,137,134,23,200,118,113,53,4,74,177,5,88,90,191,64,210,150,118,119,120,208,33,226,16,1,141,1,1,53,27,87,37,221,226,28,175,201,185,193,171,161,189,79,11,174,89,129,179,222,243,245,228,182,62,69,51,4,147,15,248,2,1,217,109,238,206,206,168,243,192,236,215,159,163,75,111,52,173,240,242,45,193,69,99,247,92,124,165,253,229,130,228,6,16,4,32,230,104,198,89,175,102,174,225,231,44,24,109,222,123,91,126,10,29,113,42,9,196,13,87,33,246,34,191,83,197,49,85,0,5,2,1,1,1,0,33,138,150,165,224,17,145,179,7,120,169,2,43,51,49,142,79,255,67,7,18,161,70,134,2,167,190,106,29,104,149,81,17,1,141,1,1,62,210,128,237,157,173,255,118,46,120,226,35,148,9,65,38,159,144,75,61,235,31,132,201,170,187,200,81,86,89,44,191,4,1,64,0,36,2,1,32,162,161,180,172,111,239,34,234,42,26,104,232,18,54,68,179,87,135,95,107,65,44,24,16,146,129,193,70,231,178,113,188,0,168,99,211,63,81,56,245,72,156,254,93,201,14,131,171,16,91,237,241,30,32,62,67,128,249,8,196,116,111,157,82,212,16,1,151,170,133,85,12,8,231,83,83,8,28,221,26,134,85,126,234,104,22,231,103,54,180,118,34,209,31,166,11,144,174,155,17],"quorum_hash":[34,153,131,64,66,147,240,32,92,27,189,141,240,96,197,152,58,71,115,107,141,84,31,116,141,45,108,40,72,130,129,16],"signature":[174,87,124,110,58,18,45,93,176,103,34,219,129,77,125,251,0,53,179,205,179,163,119,132,75,182,206,115,169,66,222,75,198,129,190,101,113,107,51,62,162,87,240,206,131,7,138,231,23,70,191,154,140,213,120,181,9,103,29,43,59,23,216,243,250,247,119,189,35,250,91,188,166,212,93,12,141,145,56,165,17,132,55,145,100,16,15,244,67,185,168,147,200,242,10,127],"round":0,"block_id_hash":[243,30,197,193,10,25,24,84,159,94,166,75,60,223,157,239,84,145,165,182,253,74,253,86,248,192,23,123,178,91,13,143],"quorum_type":106}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.342864230Z_GetDataContractRequest_36b3cb705d54b996dccf0f8332c37850589acb5ba186d9aca3b1cf78af19ed50.json b/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.342864230Z_GetDataContractRequest_36b3cb705d54b996dccf0f8332c37850589acb5ba186d9aca3b1cf78af19ed50.json deleted file mode 100644 index ebc5511918..0000000000 --- a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.342864230Z_GetDataContractRequest_36b3cb705d54b996dccf0f8332c37850589acb5ba186d9aca3b1cf78af19ed50.json +++ /dev/null @@ -1 +0,0 @@ -{"request":{"version":{"v0":{"id":[230,104,198,89,175,102,174,225,231,44,24,109,222,123,91,126,10,29,113,42,9,196,13,87,33,246,34,191,83,197,49,85],"prove":true}}},"response":{"version":{"v0":{"metadata":{"height":"496","core_chain_locked_height":1626,"epoch":20,"time_ms":"1700762179839","protocol_version":1,"chain_id":"dashmate_local_36"},"result":{"proof":{"grovedb_proof":[1,2,255,30,3,1,0,15,88,0,251,83,15,0,230,104,198,89,175,102,174,225,231,44,24,109,222,123,91,126,10,29,113,42,9,196,13,87,33,246,34,191,83,197,49,85,0,0,0,0,0,1,0,0,1,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,0,2,6,100,111,109,97,105,110,22,6,18,4,116,121,112,101,18,6,111,98,106,101,99,116,18,7,105,110,100,105,99,101,115,21,3,22,3,18,4,110,97,109,101,18,18,112,97,114,101,110,116,78,97,109,101,65,110,100,76,97,98,101,108,18,10,112,114,111,112,101,114,116,105,101,115,21,2,22,1,18,26,110,111,114,109,97,108,105,122,101,100,80,97,114,101,110,116,68,111,109,97,105,110,78,97,109,101,18,3,97,115,99,22,1,18,15,110,111,114,109,97,108,105,122,101,100,76,97,98,101,108,18,3,97,115,99,18,6,117,110,105,113,117,101,19,1,22,3,18,4,110,97,109,101,18,14,100,97,115,104,73,100,101,110,116,105,116,121,73,100,18,10,112,114,111,112,101,114,116,105,101,115,21,1,22,1,18,28,114,101,99,111,114,100,115,46,100,97,115,104,85,110,105,113,117,101,73,100,101,110,116,105,116,121,73,100,18,3,97,115,99,18,6,117,110,105,113,117,101,19,1,22,2,18,4,110,97,109,101,18,9,100,97,115,104,65,108,105,97,115,18,10,112,114,111,112,101,114,116,105,101,115,21,1,22,1,18,27,114,101,99,111,114,100,115,46,100,97,115,104,65,108,105,97,115,73,100,101,110,116,105,116,121,73,100,18,3,97,115,99,18,10,112,114,111,112,101,114,116,105,101,115,22,7,18,5,108,97,98,101,108,22,6,18,4,116,121,112,101,18,6,115,116,114,105,110,103,18,7,112,97,116,116,101,114,110,18,42,94,91,97,45,122,65,45,90,48,45,57,93,91,97,45,122,65,45,90,48,45,57,45,93,123,48,44,54,49,125,91,97,45,122,65,45,90,48,45,57,93,36,18,9,109,105,110,76,101,110,103,116,104,2,3,18,9,109,97,120,76,101,110,103,116,104,2,63,18,8,112,111,115,105,116,105,111,110,2,0,18,11,100,101,115,99,114,105,112,116,105,111,110,18,25,68,111,109,97,105,110,32,108,97,98,101,108,46,32,101,46,103,46,32,39,66,111,98,39,46,18,15,110,111,114,109,97,108,105,122,101,100,76,97,98,101,108,22,6,18,4,116,121,112,101,18,6,115,116,114,105,110,103,18,7,112,97,116,116,101,114,110,18,60,94,91,97,45,104,106,45,107,109,45,110,112,45,122,48,45,57,93,91,97,45,104,106,45,107,109,45,110,112,45,122,48,45,57,45,93,123,48,44,54,49,125,91,97,45,104,106,45,107,109,45,110,112,45,122,48,45,57,93,36,18,9,109,97,120,76,101,110,103,116,104,2,63,18,8,112,111,115,105,116,105,111,110,2,1,18,11,100,101,115,99,114,105,112,116,105,111,110,18,163,68,111,109,97,105,110,32,108,97,98,101,108,32,99,111,110,118,101,114,116,101,100,32,116,111,32,108,111,119,101,114,99,97,115,101,32,102,111,114,32,99,97,115,101,45,105,110,115,101,110,115,105,116,105,118,101,32,117,110,105,113,117,101,110,101,115,115,32,118,97,108,105,100,97,116,105,111,110,46,32,34,111,34,44,32,34,105,34,32,97,110,100,32,34,108,34,32,114,101,112,108,97,99,101,100,32,119,105,116,104,32,34,48,34,32,97,110,100,32,34,49,34,32,116,111,32,109,105,116,105,103,97,116,101,32,104,111,109,111,103,114,97,112,104,32,97,116,116,97,99,107,46,32,101,46,103,46,32,39,98,48,98,39,18,8,36,99,111,109,109,101,110,116,18,92,77,117,115,116,32,98,101,32,101,113,117,97,108,32,116,111,32,116,104,101,32,108,97,98,101,108,32,105,110,32,108,111,119,101,114,99,97,115,101,46,32,34,111,34,44,32,34,105,34,32,97,110,100,32,34,108,34,32,109,117,115,116,32,98,101,32,114,101,112,108,97,99,101,100,32,119,105,116,104,32,34,48,34,32,97,110,100,32,34,49,34,46,18,16,112,97,114,101,110,116,68,111,109,97,105,110,78,97,109,101,22,6,18,4,116,121,112,101,18,6,115,116,114,105,110,103,18,7,112,97,116,116,101,114,110,18,45,94,36,124,94,91,97,45,122,65,45,90,48,45,57,93,91,97,45,122,65,45,90,48,45,57,45,93,123,48,44,54,49,125,91,97,45,122,65,45,90,48,45,57,93,36,18,9,109,105,110,76,101,110,103,116,104,2,0,18,9,109,97,120,76,101,110,103,116,104,2,63,18,8,112,111,115,105,116,105,111,110,2,2,18,11,100,101,115,99,114,105,112,116,105,111,110,18,39,65,32,102,117,108,108,32,112,97,114,101,110,116,32,100,111,109,97,105,110,32,110,97,109,101,46,32,101,46,103,46,32,39,100,97,115,104,39,46,18,26,110,111,114,109,97,108,105,122,101,100,80,97,114,101,110,116,68,111,109,97,105,110,78,97,109,101,22,7,18,4,116,121,112,101,18,6,115,116,114,105,110,103,18,7,112,97,116,116,101,114,110,18,65,94,36,124,94,91,97,45,104,106,45,107,109,45,110,112,45,122,48,45,57,93,91,97,45,104,106,45,107,109,45,110,112,45,122,48,45,57,45,92,46,93,123,48,44,54,49,125,91,97,45,104,106,45,107,109,45,110,112,45,122,48,45,57,93,36,18,9,109,105,110,76,101,110,103,116,104,2,0,18,9,109,97,120,76,101,110,103,116,104,2,63,18,8,112,111,115,105,116,105,111,110,2,3,18,11,100,101,115,99,114,105,112,116,105,111,110,18,162,65,32,112,97,114,101,110,116,32,100,111,109,97,105,110,32,110,97,109,101,32,105,110,32,108,111,119,101,114,99,97,115,101,32,102,111,114,32,99,97,115,101,45,105,110,115,101,110,115,105,116,105,118,101,32,117,110,105,113,117,101,110,101,115,115,32,118,97,108,105,100,97,116,105,111,110,46,32,34,111,34,44,32,34,105,34,32,97,110,100,32,34,108,34,32,114,101,112,108,97,99,101,100,32,119,105,116,104,32,34,48,34,32,97,110,100,32,34,49,34,32,116,111,32,109,105,116,105,103,97,116,101,32,104,111,109,111,103,114,97,112,104,32,97,116,116,97,99,107,46,32,101,46,103,46,32,39,100,97,115,104,39,18,8,36,99,111,109,109,101,110,116,18,192,77,117,115,116,32,101,105,116,104,101,114,32,98,101,32,101,113,117,97,108,32,116,111,32,97,110,32,101,120,105,115,116,105,110,103,32,100,111,109,97,105,110,32,111,114,32,101,109,112,116,121,32,116,111,32,99,114,101,97,116,101,32,97,32,116,111,112,32,108,101,118,101,108,32,100,111,109,97,105,110,46,32,34,111,34,44,32,34,105,34,32,97,110,100,32,34,108,34,32,109,117,115,116,32,98,101,32,114,101,112,108,97,99,101,100,32,119,105,116,104,32,34,48,34,32,97,110,100,32,34,49,34,46,32,79,110,108,121,32,116,104,101,32,100,97,116,97,32,99,111,110,116,114,97,99,116,32,111,119,110,101,114,32,99,97,110,32,99,114,101,97,116,101,32,116,111,112,32,108,101,118,101,108,32,100,111,109,97,105,110,115,46,18,12,112,114,101,111,114,100,101,114,83,97,108,116,22,6,18,4,116,121,112,101,18,5,97,114,114,97,121,18,9,98,121,116,101,65,114,114,97,121,19,1,18,8,109,105,110,73,116,101,109,115,2,32,18,8,109,97,120,73,116,101,109,115,2,32,18,8,112,111,115,105,116,105,111,110,2,4,18,11,100,101,115,99,114,105,112,116,105,111,110,18,34,83,97,108,116,32,117,115,101,100,32,105,110,32,116,104,101,32,112,114,101,111,114,100,101,114,32,100,111,99,117,109,101,110,116,18,7,114,101,99,111,114,100,115,22,7,18,4,116,121,112,101,18,6,111,98,106,101,99,116,18,10,112,114,111,112,101,114,116,105,101,115,22,2,18,20,100,97,115,104,85,110,105,113,117,101,73,100,101,110,116,105,116,121,73,100,22,8,18,4,116,121,112,101,18,5,97,114,114,97,121,18,9,98,121,116,101,65,114,114,97,121,19,1,18,8,109,105,110,73,116,101,109,115,2,32,18,8,109,97,120,73,116,101,109,115,2,32,18,8,112,111,115,105,116,105,111,110,2,0,18,16,99,111,110,116,101,110,116,77,101,100,105,97,84,121,112,101,18,33,97,112,112,108,105,99,97,116,105,111,110,47,120,46,100,97,115,104,46,100,112,112,46,105,100,101,110,116,105,102,105,101,114,18,11,100,101,115,99,114,105,112,116,105,111,110,18,62,73,100,101,110,116,105,116,121,32,73,68,32,116,111,32,98,101,32,117,115,101,100,32,116,111,32,99,114,101,97,116,101,32,116,104,101,32,112,114,105,109,97,114,121,32,110,97,109,101,32,116,104,101,32,73,100,101,110,116,105,116,121,18,8,36,99,111,109,109,101,110,116,18,35,77,117,115,116,32,98,101,32,101,113,117,97,108,32,116,111,32,116,104,101,32,100,111,99,117,109,101,110,116,32,111,119,110,101,114,18,19,100,97,115,104,65,108,105,97,115,73,100,101,110,116,105,116,121,73,100,22,8,18,4,116,121,112,101,18,5,97,114,114,97,121,18,9,98,121,116,101,65,114,114,97,121,19,1,18,8,109,105,110,73,116,101,109,115,2,32,18,8,109,97,120,73,116,101,109,115,2,32,18,8,112,111,115,105,116,105,111,110,2,1,18,16,99,111,110,116,101,110,116,77,101,100,105,97,84,121,112,101,18,33,97,112,112,108,105,99,97,116,105,111,110,47,120,46,100,97,115,104,46,100,112,112,46,105,100,101,110,116,105,102,105,101,114,18,11,100,101,115,99,114,105,112,116,105,111,110,18,61,73,100,101,110,116,105,116,121,32,73,68,32,116,111,32,98,101,32,117,115,101,100,32,116,111,32,99,114,101,97,116,101,32,97,108,105,97,115,32,110,97,109,101,115,32,102,111,114,32,116,104,101,32,73,100,101,110,116,105,116,121,18,8,36,99,111,109,109,101,110,116,18,35,77,117,115,116,32,98,101,32,101,113,117,97,108,32,116,111,32,116,104,101,32,100,111,99,117,109,101,110,116,32,111,119,110,101,114,18,13,109,105,110,80,114,111,112,101,114,116,105,101,115,2,1,18,13,109,97,120,80,114,111,112,101,114,116,105,101,115,2,1,18,8,112,111,115,105,116,105,111,110,2,5,18,20,97,100,100,105,116,105,111,110,97,108,80,114,111,112,101,114,116,105,101,115,19,0,18,8,36,99,111,109,109,101,110,116,18,144,67,111,110,115,116,114,97,105,110,116,32,119,105,116,104,32,109,97,120,32,97,110,100,32,109,105,110,32,112,114,111,112,101,114,116,105,101,115,32,101,110,115,117,114,101,32,116,104,97,116,32,111,110,108,121,32,111,110,101,32,105,100,101,110,116,105,116,121,32,114,101,99,111,114,100,32,105,115,32,117,115,101,100,32,45,32,101,105,116,104,101,114,32,97,32,96,100,97,115,104,85,110,105,113,117,101,73,100,101,110,116,105,116,121,73,100,96,32,111,114,32,97,32,96,100,97,115,104,65,108,105,97,115,73,100,101,110,116,105,116,121,73,100,96,18,14,115,117,98,100,111,109,97,105,110,82,117,108,101,115,22,6,18,4,116,121,112,101,18,6,111,98,106,101,99,116,18,10,112,114,111,112,101,114,116,105,101,115,22,1,18,15,97,108,108,111,119,83,117,98,100,111,109,97,105,110,115,22,4,18,4,116,121,112,101,18,7,98,111,111,108,101,97,110,18,11,100,101,115,99,114,105,112,116,105,111,110,18,91,84,104,105,115,32,111,112,116,105,111,110,32,100,101,102,105,110,101,115,32,119,104,111,32,99,97,110,32,99,114,101,97,116,101,32,115,117,98,100,111,109,97,105,110,115,58,32,116,114,117,101,32,45,32,97,110,121,111,110,101,59,32,102,97,108,115,101,32,45,32,111,110,108,121,32,116,104,101,32,100,111,109,97,105,110,32,111,119,110,101,114,18,8,36,99,111,109,109,101,110,116,18,79,79,110,108,121,32,116,104,101,32,100,111,109,97,105,110,32,111,119,110,101,114,32,105,115,32,97,108,108,111,119,101,100,32,116,111,32,99,114,101,97,116,101,32,115,117,98,100,111,109,97,105,110,115,32,102,111,114,32,110,111,110,32,116,111,112,45,108,101,118,101,108,32,100,111,109,97,105,110,115,18,8,112,111,115,105,116,105,111,110,2,0,18,8,112,111,115,105,116,105,111,110,2,6,18,11,100,101,115,99,114,105,112,116,105,111,110,18,66,83,117,98,100,111,109,97,105,110,32,114,117,108,101,115,32,97,108,108,111,119,32,100,111,109,97,105,110,32,111,119,110,101,114,115,32,116,111,32,100,101,102,105,110,101,32,114,117,108,101,115,32,102,111,114,32,115,117,98,100,111,109,97,105,110,115,18,20,97,100,100,105,116,105,111,110,97,108,80,114,111,112,101,114,116,105,101,115,19,0,18,8,114,101,113,117,105,114,101,100,21,1,18,15,97,108,108,111,119,83,117,98,100,111,109,97,105,110,115,18,8,114,101,113,117,105,114,101,100,21,6,18,5,108,97,98,101,108,18,15,110,111,114,109,97,108,105,122,101,100,76,97,98,101,108,18,26,110,111,114,109,97,108,105,122,101,100,80,97,114,101,110,116,68,111,109,97,105,110,78,97,109,101,18,12,112,114,101,111,114,100,101,114,83,97,108,116,18,7,114,101,99,111,114,100,115,18,14,115,117,98,100,111,109,97,105,110,82,117,108,101,115,18,20,97,100,100,105,116,105,111,110,97,108,80,114,111,112,101,114,116,105,101,115,19,0,18,8,36,99,111,109,109,101,110,116,18,251,1,55,73,110,32,111,114,100,101,114,32,116,111,32,114,101,103,105,115,116,101,114,32,97,32,100,111,109,97,105,110,32,121,111,117,32,110,101,101,100,32,116,111,32,99,114,101,97,116,101,32,97,32,112,114,101,111,114,100,101,114,46,32,84,104,101,32,112,114,101,111,114,100,101,114,32,115,116,101,112,32,105,115,32,110,101,101,100,101,100,32,116,111,32,112,114,101,118,101,110,116,32,109,97,110,45,105,110,45,116,104,101,45,109,105,100,100,108,101,32,97,116,116,97,99,107,115,46,32,110,111,114,109,97,108,105,122,101,100,76,97,98,101,108,32,43,32,39,46,39,32,43,32,110,111,114,109,97,108,105,122,101,100,80,97,114,101,110,116,68,111,109,97,105,110,32,109,117,115,116,32,110,111,116,32,98,101,32,108,111,110,103,101,114,32,116,104,97,110,32,50,53,51,32,99,104,97,114,115,32,108,101,110,103,116,104,32,97,115,32,100,101,102,105,110,101,100,32,98,121,32,82,70,67,32,49,48,51,53,46,32,68,111,109,97,105,110,32,100,111,99,117,109,101,110,116,115,32,97,114,101,32,105,109,109,117,116,97,98,108,101,58,32,109,111,100,105,102,105,99,97,116,105,111,110,32,97,110,100,32,100,101,108,101,116,105,111,110,32,97,114,101,32,114,101,115,116,114,105,99,116,101,100,8,112,114,101,111,114,100,101,114,22,6,18,4,116,121,112,101,18,6,111,98,106,101,99,116,18,7,105,110,100,105,99,101,115,21,1,22,3,18,4,110,97,109,101,18,10,115,97,108,116,101,100,72,97,115,104,18,10,112,114,111,112,101,114,116,105,101,115,21,1,22,1,18,16,115,97,108,116,101,100,68,111,109,97,105,110,72,97,115,104,18,3,97,115,99,18,6,117,110,105,113,117,101,19,1,18,10,112,114,111,112,101,114,116,105,101,115,22,1,18,16,115,97,108,116,101,100,68,111,109,97,105,110,72,97,115,104,22,6,18,4,116,121,112,101,18,5,97,114,114,97,121,18,9,98,121,116,101,65,114,114,97,121,19,1,18,8,109,105,110,73,116,101,109,115,2,32,18,8,109,97,120,73,116,101,109,115,2,32,18,8,112,111,115,105,116,105,111,110,2,0,18,11,100,101,115,99,114,105,112,116,105,111,110,18,89,68,111,117,98,108,101,32,115,104,97,45,50,53,54,32,111,102,32,116,104,101,32,99,111,110,99,97,116,101,110,97,116,105,111,110,32,111,102,32,97,32,51,50,32,98,121,116,101,32,114,97,110,100,111,109,32,115,97,108,116,32,97,110,100,32,97,32,110,111,114,109,97,108,105,122,101,100,32,100,111,109,97,105,110,32,110,97,109,101,18,8,114,101,113,117,105,114,101,100,21,1,18,16,115,97,108,116,101,100,68,111,109,97,105,110,72,97,115,104,18,20,97,100,100,105,116,105,111,110,97,108,80,114,111,112,101,114,116,105,101,115,19,0,18,8,36,99,111,109,109,101,110,116,18,74,80,114,101,111,114,100,101,114,32,100,111,99,117,109,101,110,116,115,32,97,114,101,32,105,109,109,117,116,97,98,108,101,58,32,109,111,100,105,102,105,99,97,116,105,111,110,32,97,110,100,32,100,101,108,101,116,105,111,110,32,97,114,101,32,114,101,115,116,114,105,99,116,101,100,0,2,213,134,128,207,201,13,236,20,124,137,134,23,200,118,113,53,4,74,177,5,88,90,191,64,210,150,118,119,120,208,33,226,16,1,141,1,1,53,27,87,37,221,226,28,175,201,185,193,171,161,189,79,11,174,89,129,179,222,243,245,228,182,62,69,51,4,147,15,248,2,1,217,109,238,206,206,168,243,192,236,215,159,163,75,111,52,173,240,242,45,193,69,99,247,92,124,165,253,229,130,228,6,16,4,32,230,104,198,89,175,102,174,225,231,44,24,109,222,123,91,126,10,29,113,42,9,196,13,87,33,246,34,191,83,197,49,85,0,5,2,1,1,1,0,33,138,150,165,224,17,145,179,7,120,169,2,43,51,49,142,79,255,67,7,18,161,70,134,2,167,190,106,29,104,149,81,17,1,141,1,1,62,210,128,237,157,173,255,118,46,120,226,35,148,9,65,38,159,144,75,61,235,31,132,201,170,187,200,81,86,89,44,191,4,1,64,0,36,2,1,32,162,161,180,172,111,239,34,234,42,26,104,232,18,54,68,179,87,135,95,107,65,44,24,16,146,129,193,70,231,178,113,188,0,168,99,211,63,81,56,245,72,156,254,93,201,14,131,171,16,91,237,241,30,32,62,67,128,249,8,196,116,111,157,82,212,16,1,151,170,133,85,12,8,231,83,83,8,28,221,26,134,85,126,234,104,22,231,103,54,180,118,34,209,31,166,11,144,174,155,17],"quorum_hash":[34,153,131,64,66,147,240,32,92,27,189,141,240,96,197,152,58,71,115,107,141,84,31,116,141,45,108,40,72,130,129,16],"signature":[174,87,124,110,58,18,45,93,176,103,34,219,129,77,125,251,0,53,179,205,179,163,119,132,75,182,206,115,169,66,222,75,198,129,190,101,113,107,51,62,162,87,240,206,131,7,138,231,23,70,191,154,140,213,120,181,9,103,29,43,59,23,216,243,250,247,119,189,35,250,91,188,166,212,93,12,141,145,56,165,17,132,55,145,100,16,15,244,67,185,168,147,200,242,10,127],"round":0,"block_id_hash":[243,30,197,193,10,25,24,84,159,94,166,75,60,223,157,239,84,145,165,182,253,74,253,86,248,192,23,123,178,91,13,143],"quorum_type":106}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.350064490Z_GetDataContractsRequest_be241f4243faa3a04a20a229a214fc6a27f8e61d6997cf0067a946a712a05e89.json b/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.350064490Z_GetDataContractsRequest_be241f4243faa3a04a20a229a214fc6a27f8e61d6997cf0067a946a712a05e89.json deleted file mode 100644 index ac27d8a01c..0000000000 --- a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.350064490Z_GetDataContractsRequest_be241f4243faa3a04a20a229a214fc6a27f8e61d6997cf0067a946a712a05e89.json +++ /dev/null @@ -1 +0,0 @@ -{"request":{"version":{"v0":{"ids":["AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=","AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE="],"prove":true}}},"response":{"version":{"v0":{"metadata":{"height":"496","core_chain_locked_height":1626,"epoch":20,"time_ms":"1700762179839","protocol_version":1,"chain_id":"dashmate_local_36"},"result":{"proof":{"grovedb_proof":[1,6,1,1,64,2,1,64,168,1,5,32,12,172,226,5,36,102,147,167,200,21,101,35,98,13,170,147,125,47,34,71,147,68,99,238,176,31,247,33,149,144,149,140,75,34,153,206,135,122,242,216,192,153,213,145,252,19,92,243,151,66,21,82,155,134,59,37,64,187,226,193,3,142,106,137,2,55,87,32,239,83,222,50,100,135,105,253,22,175,40,144,194,215,36,1,135,76,125,3,161,55,118,11,1,246,1,1,185,16,2,1,217,109,238,206,206,168,243,192,236,215,159,163,75,111,52,173,240,242,45,193,69,99,247,92,124,165,253,229,130,228,6,16,1,159,126,94,199,175,65,241,198,165,109,36,136,66,35,181,18,41,141,231,216,15,39,242,103,13,216,198,219,227,247,109,250,17,1,0,141,1,1,62,210,128,237,157,173,255,118,46,120,226,35,148,9,65,38,159,144,75,61,235,31,132,201,170,187,200,81,86,89,44,191,4,1,64,0,36,2,1,32,162,161,180,172,111,239,34,234,42,26,104,232,18,54,68,179,87,135,95,107,65,44,24,16,146,129,193,70,231,178,113,188,0,168,99,211,63,81,56,245,72,156,254,93,201,14,131,171,16,91,237,241,30,32,62,67,128,249,8,196,116,111,157,82,212,16,1,151,170,133,85,12,8,231,83,83,8,28,221,26,134,85,126,234,104,22,231,103,54,180,118,34,209,31,166,11,144,174,155,17],"quorum_hash":[34,153,131,64,66,147,240,32,92,27,189,141,240,96,197,152,58,71,115,107,141,84,31,116,141,45,108,40,72,130,129,16],"signature":[174,87,124,110,58,18,45,93,176,103,34,219,129,77,125,251,0,53,179,205,179,163,119,132,75,182,206,115,169,66,222,75,198,129,190,101,113,107,51,62,162,87,240,206,131,7,138,231,23,70,191,154,140,213,120,181,9,103,29,43,59,23,216,243,250,247,119,189,35,250,91,188,166,212,93,12,141,145,56,165,17,132,55,145,100,16,15,244,67,185,168,147,200,242,10,127],"round":0,"block_id_hash":[243,30,197,193,10,25,24,84,159,94,166,75,60,223,157,239,84,145,165,182,253,74,253,86,248,192,23,123,178,91,13,143],"quorum_type":106}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.354440227Z_GetDataContractRequest_ce01e85155ee6482c89778e5214884fc36686387fa18831256ae2ada60474de4.json b/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.354440227Z_GetDataContractRequest_ce01e85155ee6482c89778e5214884fc36686387fa18831256ae2ada60474de4.json deleted file mode 100644 index 4addf06544..0000000000 --- a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.354440227Z_GetDataContractRequest_ce01e85155ee6482c89778e5214884fc36686387fa18831256ae2ada60474de4.json +++ /dev/null @@ -1 +0,0 @@ -{"request":{"version":{"v0":{"id":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],"prove":true}}},"response":{"version":{"v0":{"metadata":{"height":"496","core_chain_locked_height":1626,"epoch":20,"time_ms":"1700762179839","protocol_version":1,"chain_id":"dashmate_local_36"},"result":{"proof":{"grovedb_proof":[1,5,1,141,1,1,62,210,128,237,157,173,255,118,46,120,226,35,148,9,65,38,159,144,75,61,235,31,132,201,170,187,200,81,86,89,44,191,4,1,64,0,36,2,1,32,162,161,180,172,111,239,34,234,42,26,104,232,18,54,68,179,87,135,95,107,65,44,24,16,146,129,193,70,231,178,113,188,0,168,99,211,63,81,56,245,72,156,254,93,201,14,131,171,16,91,237,241,30,32,62,67,128,249,8,196,116,111,157,82,212,16,1,151,170,133,85,12,8,231,83,83,8,28,221,26,134,85,126,234,104,22,231,103,54,180,118,34,209,31,166,11,144,174,155,17,1,168,1,5,32,12,172,226,5,36,102,147,167,200,21,101,35,98,13,170,147,125,47,34,71,147,68,99,238,176,31,247,33,149,144,149,140,75,34,153,206,135,122,242,216,192,153,213,145,252,19,92,243,151,66,21,82,155,134,59,37,64,187,226,193,3,142,106,137,2,55,87,32,239,83,222,50,100,135,105,253,22,175,40,144,194,215,36,1,135,76,125,3,161,55,118,11,1,246,1,1,185,16,2,1,217,109,238,206,206,168,243,192,236,215,159,163,75,111,52,173,240,242,45,193,69,99,247,92,124,165,253,229,130,228,6,16,1,159,126,94,199,175,65,241,198,165,109,36,136,66,35,181,18,41,141,231,216,15,39,242,103,13,216,198,219,227,247,109,250,17],"quorum_hash":[34,153,131,64,66,147,240,32,92,27,189,141,240,96,197,152,58,71,115,107,141,84,31,116,141,45,108,40,72,130,129,16],"signature":[174,87,124,110,58,18,45,93,176,103,34,219,129,77,125,251,0,53,179,205,179,163,119,132,75,182,206,115,169,66,222,75,198,129,190,101,113,107,51,62,162,87,240,206,131,7,138,231,23,70,191,154,140,213,120,181,9,103,29,43,59,23,216,243,250,247,119,189,35,250,91,188,166,212,93,12,141,145,56,165,17,132,55,145,100,16,15,244,67,185,168,147,200,242,10,127],"round":0,"block_id_hash":[243,30,197,193,10,25,24,84,159,94,166,75,60,223,157,239,84,145,165,182,253,74,253,86,248,192,23,123,178,91,13,143],"quorum_type":106}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.354440387Z_GetDataContractRequest_36b3cb705d54b996dccf0f8332c37850589acb5ba186d9aca3b1cf78af19ed50.json b/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.354440387Z_GetDataContractRequest_36b3cb705d54b996dccf0f8332c37850589acb5ba186d9aca3b1cf78af19ed50.json deleted file mode 100644 index ebc5511918..0000000000 --- a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.354440387Z_GetDataContractRequest_36b3cb705d54b996dccf0f8332c37850589acb5ba186d9aca3b1cf78af19ed50.json +++ /dev/null @@ -1 +0,0 @@ -{"request":{"version":{"v0":{"id":[230,104,198,89,175,102,174,225,231,44,24,109,222,123,91,126,10,29,113,42,9,196,13,87,33,246,34,191,83,197,49,85],"prove":true}}},"response":{"version":{"v0":{"metadata":{"height":"496","core_chain_locked_height":1626,"epoch":20,"time_ms":"1700762179839","protocol_version":1,"chain_id":"dashmate_local_36"},"result":{"proof":{"grovedb_proof":[1,2,255,30,3,1,0,15,88,0,251,83,15,0,230,104,198,89,175,102,174,225,231,44,24,109,222,123,91,126,10,29,113,42,9,196,13,87,33,246,34,191,83,197,49,85,0,0,0,0,0,1,0,0,1,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,0,2,6,100,111,109,97,105,110,22,6,18,4,116,121,112,101,18,6,111,98,106,101,99,116,18,7,105,110,100,105,99,101,115,21,3,22,3,18,4,110,97,109,101,18,18,112,97,114,101,110,116,78,97,109,101,65,110,100,76,97,98,101,108,18,10,112,114,111,112,101,114,116,105,101,115,21,2,22,1,18,26,110,111,114,109,97,108,105,122,101,100,80,97,114,101,110,116,68,111,109,97,105,110,78,97,109,101,18,3,97,115,99,22,1,18,15,110,111,114,109,97,108,105,122,101,100,76,97,98,101,108,18,3,97,115,99,18,6,117,110,105,113,117,101,19,1,22,3,18,4,110,97,109,101,18,14,100,97,115,104,73,100,101,110,116,105,116,121,73,100,18,10,112,114,111,112,101,114,116,105,101,115,21,1,22,1,18,28,114,101,99,111,114,100,115,46,100,97,115,104,85,110,105,113,117,101,73,100,101,110,116,105,116,121,73,100,18,3,97,115,99,18,6,117,110,105,113,117,101,19,1,22,2,18,4,110,97,109,101,18,9,100,97,115,104,65,108,105,97,115,18,10,112,114,111,112,101,114,116,105,101,115,21,1,22,1,18,27,114,101,99,111,114,100,115,46,100,97,115,104,65,108,105,97,115,73,100,101,110,116,105,116,121,73,100,18,3,97,115,99,18,10,112,114,111,112,101,114,116,105,101,115,22,7,18,5,108,97,98,101,108,22,6,18,4,116,121,112,101,18,6,115,116,114,105,110,103,18,7,112,97,116,116,101,114,110,18,42,94,91,97,45,122,65,45,90,48,45,57,93,91,97,45,122,65,45,90,48,45,57,45,93,123,48,44,54,49,125,91,97,45,122,65,45,90,48,45,57,93,36,18,9,109,105,110,76,101,110,103,116,104,2,3,18,9,109,97,120,76,101,110,103,116,104,2,63,18,8,112,111,115,105,116,105,111,110,2,0,18,11,100,101,115,99,114,105,112,116,105,111,110,18,25,68,111,109,97,105,110,32,108,97,98,101,108,46,32,101,46,103,46,32,39,66,111,98,39,46,18,15,110,111,114,109,97,108,105,122,101,100,76,97,98,101,108,22,6,18,4,116,121,112,101,18,6,115,116,114,105,110,103,18,7,112,97,116,116,101,114,110,18,60,94,91,97,45,104,106,45,107,109,45,110,112,45,122,48,45,57,93,91,97,45,104,106,45,107,109,45,110,112,45,122,48,45,57,45,93,123,48,44,54,49,125,91,97,45,104,106,45,107,109,45,110,112,45,122,48,45,57,93,36,18,9,109,97,120,76,101,110,103,116,104,2,63,18,8,112,111,115,105,116,105,111,110,2,1,18,11,100,101,115,99,114,105,112,116,105,111,110,18,163,68,111,109,97,105,110,32,108,97,98,101,108,32,99,111,110,118,101,114,116,101,100,32,116,111,32,108,111,119,101,114,99,97,115,101,32,102,111,114,32,99,97,115,101,45,105,110,115,101,110,115,105,116,105,118,101,32,117,110,105,113,117,101,110,101,115,115,32,118,97,108,105,100,97,116,105,111,110,46,32,34,111,34,44,32,34,105,34,32,97,110,100,32,34,108,34,32,114,101,112,108,97,99,101,100,32,119,105,116,104,32,34,48,34,32,97,110,100,32,34,49,34,32,116,111,32,109,105,116,105,103,97,116,101,32,104,111,109,111,103,114,97,112,104,32,97,116,116,97,99,107,46,32,101,46,103,46,32,39,98,48,98,39,18,8,36,99,111,109,109,101,110,116,18,92,77,117,115,116,32,98,101,32,101,113,117,97,108,32,116,111,32,116,104,101,32,108,97,98,101,108,32,105,110,32,108,111,119,101,114,99,97,115,101,46,32,34,111,34,44,32,34,105,34,32,97,110,100,32,34,108,34,32,109,117,115,116,32,98,101,32,114,101,112,108,97,99,101,100,32,119,105,116,104,32,34,48,34,32,97,110,100,32,34,49,34,46,18,16,112,97,114,101,110,116,68,111,109,97,105,110,78,97,109,101,22,6,18,4,116,121,112,101,18,6,115,116,114,105,110,103,18,7,112,97,116,116,101,114,110,18,45,94,36,124,94,91,97,45,122,65,45,90,48,45,57,93,91,97,45,122,65,45,90,48,45,57,45,93,123,48,44,54,49,125,91,97,45,122,65,45,90,48,45,57,93,36,18,9,109,105,110,76,101,110,103,116,104,2,0,18,9,109,97,120,76,101,110,103,116,104,2,63,18,8,112,111,115,105,116,105,111,110,2,2,18,11,100,101,115,99,114,105,112,116,105,111,110,18,39,65,32,102,117,108,108,32,112,97,114,101,110,116,32,100,111,109,97,105,110,32,110,97,109,101,46,32,101,46,103,46,32,39,100,97,115,104,39,46,18,26,110,111,114,109,97,108,105,122,101,100,80,97,114,101,110,116,68,111,109,97,105,110,78,97,109,101,22,7,18,4,116,121,112,101,18,6,115,116,114,105,110,103,18,7,112,97,116,116,101,114,110,18,65,94,36,124,94,91,97,45,104,106,45,107,109,45,110,112,45,122,48,45,57,93,91,97,45,104,106,45,107,109,45,110,112,45,122,48,45,57,45,92,46,93,123,48,44,54,49,125,91,97,45,104,106,45,107,109,45,110,112,45,122,48,45,57,93,36,18,9,109,105,110,76,101,110,103,116,104,2,0,18,9,109,97,120,76,101,110,103,116,104,2,63,18,8,112,111,115,105,116,105,111,110,2,3,18,11,100,101,115,99,114,105,112,116,105,111,110,18,162,65,32,112,97,114,101,110,116,32,100,111,109,97,105,110,32,110,97,109,101,32,105,110,32,108,111,119,101,114,99,97,115,101,32,102,111,114,32,99,97,115,101,45,105,110,115,101,110,115,105,116,105,118,101,32,117,110,105,113,117,101,110,101,115,115,32,118,97,108,105,100,97,116,105,111,110,46,32,34,111,34,44,32,34,105,34,32,97,110,100,32,34,108,34,32,114,101,112,108,97,99,101,100,32,119,105,116,104,32,34,48,34,32,97,110,100,32,34,49,34,32,116,111,32,109,105,116,105,103,97,116,101,32,104,111,109,111,103,114,97,112,104,32,97,116,116,97,99,107,46,32,101,46,103,46,32,39,100,97,115,104,39,18,8,36,99,111,109,109,101,110,116,18,192,77,117,115,116,32,101,105,116,104,101,114,32,98,101,32,101,113,117,97,108,32,116,111,32,97,110,32,101,120,105,115,116,105,110,103,32,100,111,109,97,105,110,32,111,114,32,101,109,112,116,121,32,116,111,32,99,114,101,97,116,101,32,97,32,116,111,112,32,108,101,118,101,108,32,100,111,109,97,105,110,46,32,34,111,34,44,32,34,105,34,32,97,110,100,32,34,108,34,32,109,117,115,116,32,98,101,32,114,101,112,108,97,99,101,100,32,119,105,116,104,32,34,48,34,32,97,110,100,32,34,49,34,46,32,79,110,108,121,32,116,104,101,32,100,97,116,97,32,99,111,110,116,114,97,99,116,32,111,119,110,101,114,32,99,97,110,32,99,114,101,97,116,101,32,116,111,112,32,108,101,118,101,108,32,100,111,109,97,105,110,115,46,18,12,112,114,101,111,114,100,101,114,83,97,108,116,22,6,18,4,116,121,112,101,18,5,97,114,114,97,121,18,9,98,121,116,101,65,114,114,97,121,19,1,18,8,109,105,110,73,116,101,109,115,2,32,18,8,109,97,120,73,116,101,109,115,2,32,18,8,112,111,115,105,116,105,111,110,2,4,18,11,100,101,115,99,114,105,112,116,105,111,110,18,34,83,97,108,116,32,117,115,101,100,32,105,110,32,116,104,101,32,112,114,101,111,114,100,101,114,32,100,111,99,117,109,101,110,116,18,7,114,101,99,111,114,100,115,22,7,18,4,116,121,112,101,18,6,111,98,106,101,99,116,18,10,112,114,111,112,101,114,116,105,101,115,22,2,18,20,100,97,115,104,85,110,105,113,117,101,73,100,101,110,116,105,116,121,73,100,22,8,18,4,116,121,112,101,18,5,97,114,114,97,121,18,9,98,121,116,101,65,114,114,97,121,19,1,18,8,109,105,110,73,116,101,109,115,2,32,18,8,109,97,120,73,116,101,109,115,2,32,18,8,112,111,115,105,116,105,111,110,2,0,18,16,99,111,110,116,101,110,116,77,101,100,105,97,84,121,112,101,18,33,97,112,112,108,105,99,97,116,105,111,110,47,120,46,100,97,115,104,46,100,112,112,46,105,100,101,110,116,105,102,105,101,114,18,11,100,101,115,99,114,105,112,116,105,111,110,18,62,73,100,101,110,116,105,116,121,32,73,68,32,116,111,32,98,101,32,117,115,101,100,32,116,111,32,99,114,101,97,116,101,32,116,104,101,32,112,114,105,109,97,114,121,32,110,97,109,101,32,116,104,101,32,73,100,101,110,116,105,116,121,18,8,36,99,111,109,109,101,110,116,18,35,77,117,115,116,32,98,101,32,101,113,117,97,108,32,116,111,32,116,104,101,32,100,111,99,117,109,101,110,116,32,111,119,110,101,114,18,19,100,97,115,104,65,108,105,97,115,73,100,101,110,116,105,116,121,73,100,22,8,18,4,116,121,112,101,18,5,97,114,114,97,121,18,9,98,121,116,101,65,114,114,97,121,19,1,18,8,109,105,110,73,116,101,109,115,2,32,18,8,109,97,120,73,116,101,109,115,2,32,18,8,112,111,115,105,116,105,111,110,2,1,18,16,99,111,110,116,101,110,116,77,101,100,105,97,84,121,112,101,18,33,97,112,112,108,105,99,97,116,105,111,110,47,120,46,100,97,115,104,46,100,112,112,46,105,100,101,110,116,105,102,105,101,114,18,11,100,101,115,99,114,105,112,116,105,111,110,18,61,73,100,101,110,116,105,116,121,32,73,68,32,116,111,32,98,101,32,117,115,101,100,32,116,111,32,99,114,101,97,116,101,32,97,108,105,97,115,32,110,97,109,101,115,32,102,111,114,32,116,104,101,32,73,100,101,110,116,105,116,121,18,8,36,99,111,109,109,101,110,116,18,35,77,117,115,116,32,98,101,32,101,113,117,97,108,32,116,111,32,116,104,101,32,100,111,99,117,109,101,110,116,32,111,119,110,101,114,18,13,109,105,110,80,114,111,112,101,114,116,105,101,115,2,1,18,13,109,97,120,80,114,111,112,101,114,116,105,101,115,2,1,18,8,112,111,115,105,116,105,111,110,2,5,18,20,97,100,100,105,116,105,111,110,97,108,80,114,111,112,101,114,116,105,101,115,19,0,18,8,36,99,111,109,109,101,110,116,18,144,67,111,110,115,116,114,97,105,110,116,32,119,105,116,104,32,109,97,120,32,97,110,100,32,109,105,110,32,112,114,111,112,101,114,116,105,101,115,32,101,110,115,117,114,101,32,116,104,97,116,32,111,110,108,121,32,111,110,101,32,105,100,101,110,116,105,116,121,32,114,101,99,111,114,100,32,105,115,32,117,115,101,100,32,45,32,101,105,116,104,101,114,32,97,32,96,100,97,115,104,85,110,105,113,117,101,73,100,101,110,116,105,116,121,73,100,96,32,111,114,32,97,32,96,100,97,115,104,65,108,105,97,115,73,100,101,110,116,105,116,121,73,100,96,18,14,115,117,98,100,111,109,97,105,110,82,117,108,101,115,22,6,18,4,116,121,112,101,18,6,111,98,106,101,99,116,18,10,112,114,111,112,101,114,116,105,101,115,22,1,18,15,97,108,108,111,119,83,117,98,100,111,109,97,105,110,115,22,4,18,4,116,121,112,101,18,7,98,111,111,108,101,97,110,18,11,100,101,115,99,114,105,112,116,105,111,110,18,91,84,104,105,115,32,111,112,116,105,111,110,32,100,101,102,105,110,101,115,32,119,104,111,32,99,97,110,32,99,114,101,97,116,101,32,115,117,98,100,111,109,97,105,110,115,58,32,116,114,117,101,32,45,32,97,110,121,111,110,101,59,32,102,97,108,115,101,32,45,32,111,110,108,121,32,116,104,101,32,100,111,109,97,105,110,32,111,119,110,101,114,18,8,36,99,111,109,109,101,110,116,18,79,79,110,108,121,32,116,104,101,32,100,111,109,97,105,110,32,111,119,110,101,114,32,105,115,32,97,108,108,111,119,101,100,32,116,111,32,99,114,101,97,116,101,32,115,117,98,100,111,109,97,105,110,115,32,102,111,114,32,110,111,110,32,116,111,112,45,108,101,118,101,108,32,100,111,109,97,105,110,115,18,8,112,111,115,105,116,105,111,110,2,0,18,8,112,111,115,105,116,105,111,110,2,6,18,11,100,101,115,99,114,105,112,116,105,111,110,18,66,83,117,98,100,111,109,97,105,110,32,114,117,108,101,115,32,97,108,108,111,119,32,100,111,109,97,105,110,32,111,119,110,101,114,115,32,116,111,32,100,101,102,105,110,101,32,114,117,108,101,115,32,102,111,114,32,115,117,98,100,111,109,97,105,110,115,18,20,97,100,100,105,116,105,111,110,97,108,80,114,111,112,101,114,116,105,101,115,19,0,18,8,114,101,113,117,105,114,101,100,21,1,18,15,97,108,108,111,119,83,117,98,100,111,109,97,105,110,115,18,8,114,101,113,117,105,114,101,100,21,6,18,5,108,97,98,101,108,18,15,110,111,114,109,97,108,105,122,101,100,76,97,98,101,108,18,26,110,111,114,109,97,108,105,122,101,100,80,97,114,101,110,116,68,111,109,97,105,110,78,97,109,101,18,12,112,114,101,111,114,100,101,114,83,97,108,116,18,7,114,101,99,111,114,100,115,18,14,115,117,98,100,111,109,97,105,110,82,117,108,101,115,18,20,97,100,100,105,116,105,111,110,97,108,80,114,111,112,101,114,116,105,101,115,19,0,18,8,36,99,111,109,109,101,110,116,18,251,1,55,73,110,32,111,114,100,101,114,32,116,111,32,114,101,103,105,115,116,101,114,32,97,32,100,111,109,97,105,110,32,121,111,117,32,110,101,101,100,32,116,111,32,99,114,101,97,116,101,32,97,32,112,114,101,111,114,100,101,114,46,32,84,104,101,32,112,114,101,111,114,100,101,114,32,115,116,101,112,32,105,115,32,110,101,101,100,101,100,32,116,111,32,112,114,101,118,101,110,116,32,109,97,110,45,105,110,45,116,104,101,45,109,105,100,100,108,101,32,97,116,116,97,99,107,115,46,32,110,111,114,109,97,108,105,122,101,100,76,97,98,101,108,32,43,32,39,46,39,32,43,32,110,111,114,109,97,108,105,122,101,100,80,97,114,101,110,116,68,111,109,97,105,110,32,109,117,115,116,32,110,111,116,32,98,101,32,108,111,110,103,101,114,32,116,104,97,110,32,50,53,51,32,99,104,97,114,115,32,108,101,110,103,116,104,32,97,115,32,100,101,102,105,110,101,100,32,98,121,32,82,70,67,32,49,48,51,53,46,32,68,111,109,97,105,110,32,100,111,99,117,109,101,110,116,115,32,97,114,101,32,105,109,109,117,116,97,98,108,101,58,32,109,111,100,105,102,105,99,97,116,105,111,110,32,97,110,100,32,100,101,108,101,116,105,111,110,32,97,114,101,32,114,101,115,116,114,105,99,116,101,100,8,112,114,101,111,114,100,101,114,22,6,18,4,116,121,112,101,18,6,111,98,106,101,99,116,18,7,105,110,100,105,99,101,115,21,1,22,3,18,4,110,97,109,101,18,10,115,97,108,116,101,100,72,97,115,104,18,10,112,114,111,112,101,114,116,105,101,115,21,1,22,1,18,16,115,97,108,116,101,100,68,111,109,97,105,110,72,97,115,104,18,3,97,115,99,18,6,117,110,105,113,117,101,19,1,18,10,112,114,111,112,101,114,116,105,101,115,22,1,18,16,115,97,108,116,101,100,68,111,109,97,105,110,72,97,115,104,22,6,18,4,116,121,112,101,18,5,97,114,114,97,121,18,9,98,121,116,101,65,114,114,97,121,19,1,18,8,109,105,110,73,116,101,109,115,2,32,18,8,109,97,120,73,116,101,109,115,2,32,18,8,112,111,115,105,116,105,111,110,2,0,18,11,100,101,115,99,114,105,112,116,105,111,110,18,89,68,111,117,98,108,101,32,115,104,97,45,50,53,54,32,111,102,32,116,104,101,32,99,111,110,99,97,116,101,110,97,116,105,111,110,32,111,102,32,97,32,51,50,32,98,121,116,101,32,114,97,110,100,111,109,32,115,97,108,116,32,97,110,100,32,97,32,110,111,114,109,97,108,105,122,101,100,32,100,111,109,97,105,110,32,110,97,109,101,18,8,114,101,113,117,105,114,101,100,21,1,18,16,115,97,108,116,101,100,68,111,109,97,105,110,72,97,115,104,18,20,97,100,100,105,116,105,111,110,97,108,80,114,111,112,101,114,116,105,101,115,19,0,18,8,36,99,111,109,109,101,110,116,18,74,80,114,101,111,114,100,101,114,32,100,111,99,117,109,101,110,116,115,32,97,114,101,32,105,109,109,117,116,97,98,108,101,58,32,109,111,100,105,102,105,99,97,116,105,111,110,32,97,110,100,32,100,101,108,101,116,105,111,110,32,97,114,101,32,114,101,115,116,114,105,99,116,101,100,0,2,213,134,128,207,201,13,236,20,124,137,134,23,200,118,113,53,4,74,177,5,88,90,191,64,210,150,118,119,120,208,33,226,16,1,141,1,1,53,27,87,37,221,226,28,175,201,185,193,171,161,189,79,11,174,89,129,179,222,243,245,228,182,62,69,51,4,147,15,248,2,1,217,109,238,206,206,168,243,192,236,215,159,163,75,111,52,173,240,242,45,193,69,99,247,92,124,165,253,229,130,228,6,16,4,32,230,104,198,89,175,102,174,225,231,44,24,109,222,123,91,126,10,29,113,42,9,196,13,87,33,246,34,191,83,197,49,85,0,5,2,1,1,1,0,33,138,150,165,224,17,145,179,7,120,169,2,43,51,49,142,79,255,67,7,18,161,70,134,2,167,190,106,29,104,149,81,17,1,141,1,1,62,210,128,237,157,173,255,118,46,120,226,35,148,9,65,38,159,144,75,61,235,31,132,201,170,187,200,81,86,89,44,191,4,1,64,0,36,2,1,32,162,161,180,172,111,239,34,234,42,26,104,232,18,54,68,179,87,135,95,107,65,44,24,16,146,129,193,70,231,178,113,188,0,168,99,211,63,81,56,245,72,156,254,93,201,14,131,171,16,91,237,241,30,32,62,67,128,249,8,196,116,111,157,82,212,16,1,151,170,133,85,12,8,231,83,83,8,28,221,26,134,85,126,234,104,22,231,103,54,180,118,34,209,31,166,11,144,174,155,17],"quorum_hash":[34,153,131,64,66,147,240,32,92,27,189,141,240,96,197,152,58,71,115,107,141,84,31,116,141,45,108,40,72,130,129,16],"signature":[174,87,124,110,58,18,45,93,176,103,34,219,129,77,125,251,0,53,179,205,179,163,119,132,75,182,206,115,169,66,222,75,198,129,190,101,113,107,51,62,162,87,240,206,131,7,138,231,23,70,191,154,140,213,120,181,9,103,29,43,59,23,216,243,250,247,119,189,35,250,91,188,166,212,93,12,141,145,56,165,17,132,55,145,100,16,15,244,67,185,168,147,200,242,10,127],"round":0,"block_id_hash":[243,30,197,193,10,25,24,84,159,94,166,75,60,223,157,239,84,145,165,182,253,74,253,86,248,192,23,123,178,91,13,143],"quorum_type":106}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.356639993Z_GetDataContractRequest_36b3cb705d54b996dccf0f8332c37850589acb5ba186d9aca3b1cf78af19ed50.json b/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.356639993Z_GetDataContractRequest_36b3cb705d54b996dccf0f8332c37850589acb5ba186d9aca3b1cf78af19ed50.json deleted file mode 100644 index ebc5511918..0000000000 --- a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.356639993Z_GetDataContractRequest_36b3cb705d54b996dccf0f8332c37850589acb5ba186d9aca3b1cf78af19ed50.json +++ /dev/null @@ -1 +0,0 @@ -{"request":{"version":{"v0":{"id":[230,104,198,89,175,102,174,225,231,44,24,109,222,123,91,126,10,29,113,42,9,196,13,87,33,246,34,191,83,197,49,85],"prove":true}}},"response":{"version":{"v0":{"metadata":{"height":"496","core_chain_locked_height":1626,"epoch":20,"time_ms":"1700762179839","protocol_version":1,"chain_id":"dashmate_local_36"},"result":{"proof":{"grovedb_proof":[1,2,255,30,3,1,0,15,88,0,251,83,15,0,230,104,198,89,175,102,174,225,231,44,24,109,222,123,91,126,10,29,113,42,9,196,13,87,33,246,34,191,83,197,49,85,0,0,0,0,0,1,0,0,1,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,0,2,6,100,111,109,97,105,110,22,6,18,4,116,121,112,101,18,6,111,98,106,101,99,116,18,7,105,110,100,105,99,101,115,21,3,22,3,18,4,110,97,109,101,18,18,112,97,114,101,110,116,78,97,109,101,65,110,100,76,97,98,101,108,18,10,112,114,111,112,101,114,116,105,101,115,21,2,22,1,18,26,110,111,114,109,97,108,105,122,101,100,80,97,114,101,110,116,68,111,109,97,105,110,78,97,109,101,18,3,97,115,99,22,1,18,15,110,111,114,109,97,108,105,122,101,100,76,97,98,101,108,18,3,97,115,99,18,6,117,110,105,113,117,101,19,1,22,3,18,4,110,97,109,101,18,14,100,97,115,104,73,100,101,110,116,105,116,121,73,100,18,10,112,114,111,112,101,114,116,105,101,115,21,1,22,1,18,28,114,101,99,111,114,100,115,46,100,97,115,104,85,110,105,113,117,101,73,100,101,110,116,105,116,121,73,100,18,3,97,115,99,18,6,117,110,105,113,117,101,19,1,22,2,18,4,110,97,109,101,18,9,100,97,115,104,65,108,105,97,115,18,10,112,114,111,112,101,114,116,105,101,115,21,1,22,1,18,27,114,101,99,111,114,100,115,46,100,97,115,104,65,108,105,97,115,73,100,101,110,116,105,116,121,73,100,18,3,97,115,99,18,10,112,114,111,112,101,114,116,105,101,115,22,7,18,5,108,97,98,101,108,22,6,18,4,116,121,112,101,18,6,115,116,114,105,110,103,18,7,112,97,116,116,101,114,110,18,42,94,91,97,45,122,65,45,90,48,45,57,93,91,97,45,122,65,45,90,48,45,57,45,93,123,48,44,54,49,125,91,97,45,122,65,45,90,48,45,57,93,36,18,9,109,105,110,76,101,110,103,116,104,2,3,18,9,109,97,120,76,101,110,103,116,104,2,63,18,8,112,111,115,105,116,105,111,110,2,0,18,11,100,101,115,99,114,105,112,116,105,111,110,18,25,68,111,109,97,105,110,32,108,97,98,101,108,46,32,101,46,103,46,32,39,66,111,98,39,46,18,15,110,111,114,109,97,108,105,122,101,100,76,97,98,101,108,22,6,18,4,116,121,112,101,18,6,115,116,114,105,110,103,18,7,112,97,116,116,101,114,110,18,60,94,91,97,45,104,106,45,107,109,45,110,112,45,122,48,45,57,93,91,97,45,104,106,45,107,109,45,110,112,45,122,48,45,57,45,93,123,48,44,54,49,125,91,97,45,104,106,45,107,109,45,110,112,45,122,48,45,57,93,36,18,9,109,97,120,76,101,110,103,116,104,2,63,18,8,112,111,115,105,116,105,111,110,2,1,18,11,100,101,115,99,114,105,112,116,105,111,110,18,163,68,111,109,97,105,110,32,108,97,98,101,108,32,99,111,110,118,101,114,116,101,100,32,116,111,32,108,111,119,101,114,99,97,115,101,32,102,111,114,32,99,97,115,101,45,105,110,115,101,110,115,105,116,105,118,101,32,117,110,105,113,117,101,110,101,115,115,32,118,97,108,105,100,97,116,105,111,110,46,32,34,111,34,44,32,34,105,34,32,97,110,100,32,34,108,34,32,114,101,112,108,97,99,101,100,32,119,105,116,104,32,34,48,34,32,97,110,100,32,34,49,34,32,116,111,32,109,105,116,105,103,97,116,101,32,104,111,109,111,103,114,97,112,104,32,97,116,116,97,99,107,46,32,101,46,103,46,32,39,98,48,98,39,18,8,36,99,111,109,109,101,110,116,18,92,77,117,115,116,32,98,101,32,101,113,117,97,108,32,116,111,32,116,104,101,32,108,97,98,101,108,32,105,110,32,108,111,119,101,114,99,97,115,101,46,32,34,111,34,44,32,34,105,34,32,97,110,100,32,34,108,34,32,109,117,115,116,32,98,101,32,114,101,112,108,97,99,101,100,32,119,105,116,104,32,34,48,34,32,97,110,100,32,34,49,34,46,18,16,112,97,114,101,110,116,68,111,109,97,105,110,78,97,109,101,22,6,18,4,116,121,112,101,18,6,115,116,114,105,110,103,18,7,112,97,116,116,101,114,110,18,45,94,36,124,94,91,97,45,122,65,45,90,48,45,57,93,91,97,45,122,65,45,90,48,45,57,45,93,123,48,44,54,49,125,91,97,45,122,65,45,90,48,45,57,93,36,18,9,109,105,110,76,101,110,103,116,104,2,0,18,9,109,97,120,76,101,110,103,116,104,2,63,18,8,112,111,115,105,116,105,111,110,2,2,18,11,100,101,115,99,114,105,112,116,105,111,110,18,39,65,32,102,117,108,108,32,112,97,114,101,110,116,32,100,111,109,97,105,110,32,110,97,109,101,46,32,101,46,103,46,32,39,100,97,115,104,39,46,18,26,110,111,114,109,97,108,105,122,101,100,80,97,114,101,110,116,68,111,109,97,105,110,78,97,109,101,22,7,18,4,116,121,112,101,18,6,115,116,114,105,110,103,18,7,112,97,116,116,101,114,110,18,65,94,36,124,94,91,97,45,104,106,45,107,109,45,110,112,45,122,48,45,57,93,91,97,45,104,106,45,107,109,45,110,112,45,122,48,45,57,45,92,46,93,123,48,44,54,49,125,91,97,45,104,106,45,107,109,45,110,112,45,122,48,45,57,93,36,18,9,109,105,110,76,101,110,103,116,104,2,0,18,9,109,97,120,76,101,110,103,116,104,2,63,18,8,112,111,115,105,116,105,111,110,2,3,18,11,100,101,115,99,114,105,112,116,105,111,110,18,162,65,32,112,97,114,101,110,116,32,100,111,109,97,105,110,32,110,97,109,101,32,105,110,32,108,111,119,101,114,99,97,115,101,32,102,111,114,32,99,97,115,101,45,105,110,115,101,110,115,105,116,105,118,101,32,117,110,105,113,117,101,110,101,115,115,32,118,97,108,105,100,97,116,105,111,110,46,32,34,111,34,44,32,34,105,34,32,97,110,100,32,34,108,34,32,114,101,112,108,97,99,101,100,32,119,105,116,104,32,34,48,34,32,97,110,100,32,34,49,34,32,116,111,32,109,105,116,105,103,97,116,101,32,104,111,109,111,103,114,97,112,104,32,97,116,116,97,99,107,46,32,101,46,103,46,32,39,100,97,115,104,39,18,8,36,99,111,109,109,101,110,116,18,192,77,117,115,116,32,101,105,116,104,101,114,32,98,101,32,101,113,117,97,108,32,116,111,32,97,110,32,101,120,105,115,116,105,110,103,32,100,111,109,97,105,110,32,111,114,32,101,109,112,116,121,32,116,111,32,99,114,101,97,116,101,32,97,32,116,111,112,32,108,101,118,101,108,32,100,111,109,97,105,110,46,32,34,111,34,44,32,34,105,34,32,97,110,100,32,34,108,34,32,109,117,115,116,32,98,101,32,114,101,112,108,97,99,101,100,32,119,105,116,104,32,34,48,34,32,97,110,100,32,34,49,34,46,32,79,110,108,121,32,116,104,101,32,100,97,116,97,32,99,111,110,116,114,97,99,116,32,111,119,110,101,114,32,99,97,110,32,99,114,101,97,116,101,32,116,111,112,32,108,101,118,101,108,32,100,111,109,97,105,110,115,46,18,12,112,114,101,111,114,100,101,114,83,97,108,116,22,6,18,4,116,121,112,101,18,5,97,114,114,97,121,18,9,98,121,116,101,65,114,114,97,121,19,1,18,8,109,105,110,73,116,101,109,115,2,32,18,8,109,97,120,73,116,101,109,115,2,32,18,8,112,111,115,105,116,105,111,110,2,4,18,11,100,101,115,99,114,105,112,116,105,111,110,18,34,83,97,108,116,32,117,115,101,100,32,105,110,32,116,104,101,32,112,114,101,111,114,100,101,114,32,100,111,99,117,109,101,110,116,18,7,114,101,99,111,114,100,115,22,7,18,4,116,121,112,101,18,6,111,98,106,101,99,116,18,10,112,114,111,112,101,114,116,105,101,115,22,2,18,20,100,97,115,104,85,110,105,113,117,101,73,100,101,110,116,105,116,121,73,100,22,8,18,4,116,121,112,101,18,5,97,114,114,97,121,18,9,98,121,116,101,65,114,114,97,121,19,1,18,8,109,105,110,73,116,101,109,115,2,32,18,8,109,97,120,73,116,101,109,115,2,32,18,8,112,111,115,105,116,105,111,110,2,0,18,16,99,111,110,116,101,110,116,77,101,100,105,97,84,121,112,101,18,33,97,112,112,108,105,99,97,116,105,111,110,47,120,46,100,97,115,104,46,100,112,112,46,105,100,101,110,116,105,102,105,101,114,18,11,100,101,115,99,114,105,112,116,105,111,110,18,62,73,100,101,110,116,105,116,121,32,73,68,32,116,111,32,98,101,32,117,115,101,100,32,116,111,32,99,114,101,97,116,101,32,116,104,101,32,112,114,105,109,97,114,121,32,110,97,109,101,32,116,104,101,32,73,100,101,110,116,105,116,121,18,8,36,99,111,109,109,101,110,116,18,35,77,117,115,116,32,98,101,32,101,113,117,97,108,32,116,111,32,116,104,101,32,100,111,99,117,109,101,110,116,32,111,119,110,101,114,18,19,100,97,115,104,65,108,105,97,115,73,100,101,110,116,105,116,121,73,100,22,8,18,4,116,121,112,101,18,5,97,114,114,97,121,18,9,98,121,116,101,65,114,114,97,121,19,1,18,8,109,105,110,73,116,101,109,115,2,32,18,8,109,97,120,73,116,101,109,115,2,32,18,8,112,111,115,105,116,105,111,110,2,1,18,16,99,111,110,116,101,110,116,77,101,100,105,97,84,121,112,101,18,33,97,112,112,108,105,99,97,116,105,111,110,47,120,46,100,97,115,104,46,100,112,112,46,105,100,101,110,116,105,102,105,101,114,18,11,100,101,115,99,114,105,112,116,105,111,110,18,61,73,100,101,110,116,105,116,121,32,73,68,32,116,111,32,98,101,32,117,115,101,100,32,116,111,32,99,114,101,97,116,101,32,97,108,105,97,115,32,110,97,109,101,115,32,102,111,114,32,116,104,101,32,73,100,101,110,116,105,116,121,18,8,36,99,111,109,109,101,110,116,18,35,77,117,115,116,32,98,101,32,101,113,117,97,108,32,116,111,32,116,104,101,32,100,111,99,117,109,101,110,116,32,111,119,110,101,114,18,13,109,105,110,80,114,111,112,101,114,116,105,101,115,2,1,18,13,109,97,120,80,114,111,112,101,114,116,105,101,115,2,1,18,8,112,111,115,105,116,105,111,110,2,5,18,20,97,100,100,105,116,105,111,110,97,108,80,114,111,112,101,114,116,105,101,115,19,0,18,8,36,99,111,109,109,101,110,116,18,144,67,111,110,115,116,114,97,105,110,116,32,119,105,116,104,32,109,97,120,32,97,110,100,32,109,105,110,32,112,114,111,112,101,114,116,105,101,115,32,101,110,115,117,114,101,32,116,104,97,116,32,111,110,108,121,32,111,110,101,32,105,100,101,110,116,105,116,121,32,114,101,99,111,114,100,32,105,115,32,117,115,101,100,32,45,32,101,105,116,104,101,114,32,97,32,96,100,97,115,104,85,110,105,113,117,101,73,100,101,110,116,105,116,121,73,100,96,32,111,114,32,97,32,96,100,97,115,104,65,108,105,97,115,73,100,101,110,116,105,116,121,73,100,96,18,14,115,117,98,100,111,109,97,105,110,82,117,108,101,115,22,6,18,4,116,121,112,101,18,6,111,98,106,101,99,116,18,10,112,114,111,112,101,114,116,105,101,115,22,1,18,15,97,108,108,111,119,83,117,98,100,111,109,97,105,110,115,22,4,18,4,116,121,112,101,18,7,98,111,111,108,101,97,110,18,11,100,101,115,99,114,105,112,116,105,111,110,18,91,84,104,105,115,32,111,112,116,105,111,110,32,100,101,102,105,110,101,115,32,119,104,111,32,99,97,110,32,99,114,101,97,116,101,32,115,117,98,100,111,109,97,105,110,115,58,32,116,114,117,101,32,45,32,97,110,121,111,110,101,59,32,102,97,108,115,101,32,45,32,111,110,108,121,32,116,104,101,32,100,111,109,97,105,110,32,111,119,110,101,114,18,8,36,99,111,109,109,101,110,116,18,79,79,110,108,121,32,116,104,101,32,100,111,109,97,105,110,32,111,119,110,101,114,32,105,115,32,97,108,108,111,119,101,100,32,116,111,32,99,114,101,97,116,101,32,115,117,98,100,111,109,97,105,110,115,32,102,111,114,32,110,111,110,32,116,111,112,45,108,101,118,101,108,32,100,111,109,97,105,110,115,18,8,112,111,115,105,116,105,111,110,2,0,18,8,112,111,115,105,116,105,111,110,2,6,18,11,100,101,115,99,114,105,112,116,105,111,110,18,66,83,117,98,100,111,109,97,105,110,32,114,117,108,101,115,32,97,108,108,111,119,32,100,111,109,97,105,110,32,111,119,110,101,114,115,32,116,111,32,100,101,102,105,110,101,32,114,117,108,101,115,32,102,111,114,32,115,117,98,100,111,109,97,105,110,115,18,20,97,100,100,105,116,105,111,110,97,108,80,114,111,112,101,114,116,105,101,115,19,0,18,8,114,101,113,117,105,114,101,100,21,1,18,15,97,108,108,111,119,83,117,98,100,111,109,97,105,110,115,18,8,114,101,113,117,105,114,101,100,21,6,18,5,108,97,98,101,108,18,15,110,111,114,109,97,108,105,122,101,100,76,97,98,101,108,18,26,110,111,114,109,97,108,105,122,101,100,80,97,114,101,110,116,68,111,109,97,105,110,78,97,109,101,18,12,112,114,101,111,114,100,101,114,83,97,108,116,18,7,114,101,99,111,114,100,115,18,14,115,117,98,100,111,109,97,105,110,82,117,108,101,115,18,20,97,100,100,105,116,105,111,110,97,108,80,114,111,112,101,114,116,105,101,115,19,0,18,8,36,99,111,109,109,101,110,116,18,251,1,55,73,110,32,111,114,100,101,114,32,116,111,32,114,101,103,105,115,116,101,114,32,97,32,100,111,109,97,105,110,32,121,111,117,32,110,101,101,100,32,116,111,32,99,114,101,97,116,101,32,97,32,112,114,101,111,114,100,101,114,46,32,84,104,101,32,112,114,101,111,114,100,101,114,32,115,116,101,112,32,105,115,32,110,101,101,100,101,100,32,116,111,32,112,114,101,118,101,110,116,32,109,97,110,45,105,110,45,116,104,101,45,109,105,100,100,108,101,32,97,116,116,97,99,107,115,46,32,110,111,114,109,97,108,105,122,101,100,76,97,98,101,108,32,43,32,39,46,39,32,43,32,110,111,114,109,97,108,105,122,101,100,80,97,114,101,110,116,68,111,109,97,105,110,32,109,117,115,116,32,110,111,116,32,98,101,32,108,111,110,103,101,114,32,116,104,97,110,32,50,53,51,32,99,104,97,114,115,32,108,101,110,103,116,104,32,97,115,32,100,101,102,105,110,101,100,32,98,121,32,82,70,67,32,49,48,51,53,46,32,68,111,109,97,105,110,32,100,111,99,117,109,101,110,116,115,32,97,114,101,32,105,109,109,117,116,97,98,108,101,58,32,109,111,100,105,102,105,99,97,116,105,111,110,32,97,110,100,32,100,101,108,101,116,105,111,110,32,97,114,101,32,114,101,115,116,114,105,99,116,101,100,8,112,114,101,111,114,100,101,114,22,6,18,4,116,121,112,101,18,6,111,98,106,101,99,116,18,7,105,110,100,105,99,101,115,21,1,22,3,18,4,110,97,109,101,18,10,115,97,108,116,101,100,72,97,115,104,18,10,112,114,111,112,101,114,116,105,101,115,21,1,22,1,18,16,115,97,108,116,101,100,68,111,109,97,105,110,72,97,115,104,18,3,97,115,99,18,6,117,110,105,113,117,101,19,1,18,10,112,114,111,112,101,114,116,105,101,115,22,1,18,16,115,97,108,116,101,100,68,111,109,97,105,110,72,97,115,104,22,6,18,4,116,121,112,101,18,5,97,114,114,97,121,18,9,98,121,116,101,65,114,114,97,121,19,1,18,8,109,105,110,73,116,101,109,115,2,32,18,8,109,97,120,73,116,101,109,115,2,32,18,8,112,111,115,105,116,105,111,110,2,0,18,11,100,101,115,99,114,105,112,116,105,111,110,18,89,68,111,117,98,108,101,32,115,104,97,45,50,53,54,32,111,102,32,116,104,101,32,99,111,110,99,97,116,101,110,97,116,105,111,110,32,111,102,32,97,32,51,50,32,98,121,116,101,32,114,97,110,100,111,109,32,115,97,108,116,32,97,110,100,32,97,32,110,111,114,109,97,108,105,122,101,100,32,100,111,109,97,105,110,32,110,97,109,101,18,8,114,101,113,117,105,114,101,100,21,1,18,16,115,97,108,116,101,100,68,111,109,97,105,110,72,97,115,104,18,20,97,100,100,105,116,105,111,110,97,108,80,114,111,112,101,114,116,105,101,115,19,0,18,8,36,99,111,109,109,101,110,116,18,74,80,114,101,111,114,100,101,114,32,100,111,99,117,109,101,110,116,115,32,97,114,101,32,105,109,109,117,116,97,98,108,101,58,32,109,111,100,105,102,105,99,97,116,105,111,110,32,97,110,100,32,100,101,108,101,116,105,111,110,32,97,114,101,32,114,101,115,116,114,105,99,116,101,100,0,2,213,134,128,207,201,13,236,20,124,137,134,23,200,118,113,53,4,74,177,5,88,90,191,64,210,150,118,119,120,208,33,226,16,1,141,1,1,53,27,87,37,221,226,28,175,201,185,193,171,161,189,79,11,174,89,129,179,222,243,245,228,182,62,69,51,4,147,15,248,2,1,217,109,238,206,206,168,243,192,236,215,159,163,75,111,52,173,240,242,45,193,69,99,247,92,124,165,253,229,130,228,6,16,4,32,230,104,198,89,175,102,174,225,231,44,24,109,222,123,91,126,10,29,113,42,9,196,13,87,33,246,34,191,83,197,49,85,0,5,2,1,1,1,0,33,138,150,165,224,17,145,179,7,120,169,2,43,51,49,142,79,255,67,7,18,161,70,134,2,167,190,106,29,104,149,81,17,1,141,1,1,62,210,128,237,157,173,255,118,46,120,226,35,148,9,65,38,159,144,75,61,235,31,132,201,170,187,200,81,86,89,44,191,4,1,64,0,36,2,1,32,162,161,180,172,111,239,34,234,42,26,104,232,18,54,68,179,87,135,95,107,65,44,24,16,146,129,193,70,231,178,113,188,0,168,99,211,63,81,56,245,72,156,254,93,201,14,131,171,16,91,237,241,30,32,62,67,128,249,8,196,116,111,157,82,212,16,1,151,170,133,85,12,8,231,83,83,8,28,221,26,134,85,126,234,104,22,231,103,54,180,118,34,209,31,166,11,144,174,155,17],"quorum_hash":[34,153,131,64,66,147,240,32,92,27,189,141,240,96,197,152,58,71,115,107,141,84,31,116,141,45,108,40,72,130,129,16],"signature":[174,87,124,110,58,18,45,93,176,103,34,219,129,77,125,251,0,53,179,205,179,163,119,132,75,182,206,115,169,66,222,75,198,129,190,101,113,107,51,62,162,87,240,206,131,7,138,231,23,70,191,154,140,213,120,181,9,103,29,43,59,23,216,243,250,247,119,189,35,250,91,188,166,212,93,12,141,145,56,165,17,132,55,145,100,16,15,244,67,185,168,147,200,242,10,127],"round":0,"block_id_hash":[243,30,197,193,10,25,24,84,159,94,166,75,60,223,157,239,84,145,165,182,253,74,253,86,248,192,23,123,178,91,13,143],"quorum_type":106}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.356676471Z_GetDataContractRequest_7536c32e37cebf6071e74b591067a351b90718e7a553fd96ad24988f7942a351.json b/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.356676471Z_GetDataContractRequest_7536c32e37cebf6071e74b591067a351b90718e7a553fd96ad24988f7942a351.json deleted file mode 100644 index 0098c28c25..0000000000 --- a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.356676471Z_GetDataContractRequest_7536c32e37cebf6071e74b591067a351b90718e7a553fd96ad24988f7942a351.json +++ /dev/null @@ -1 +0,0 @@ -{"request":{"version":{"v0":{"id":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"prove":true}}},"response":{"version":{"v0":{"metadata":{"height":"496","core_chain_locked_height":1626,"epoch":20,"time_ms":"1700762179839","protocol_version":1,"chain_id":"dashmate_local_36"},"result":{"proof":{"grovedb_proof":[1,5,1,141,1,1,62,210,128,237,157,173,255,118,46,120,226,35,148,9,65,38,159,144,75,61,235,31,132,201,170,187,200,81,86,89,44,191,4,1,64,0,36,2,1,32,162,161,180,172,111,239,34,234,42,26,104,232,18,54,68,179,87,135,95,107,65,44,24,16,146,129,193,70,231,178,113,188,0,168,99,211,63,81,56,245,72,156,254,93,201,14,131,171,16,91,237,241,30,32,62,67,128,249,8,196,116,111,157,82,212,16,1,151,170,133,85,12,8,231,83,83,8,28,221,26,134,85,126,234,104,22,231,103,54,180,118,34,209,31,166,11,144,174,155,17,1,168,1,5,32,12,172,226,5,36,102,147,167,200,21,101,35,98,13,170,147,125,47,34,71,147,68,99,238,176,31,247,33,149,144,149,140,75,34,153,206,135,122,242,216,192,153,213,145,252,19,92,243,151,66,21,82,155,134,59,37,64,187,226,193,3,142,106,137,2,55,87,32,239,83,222,50,100,135,105,253,22,175,40,144,194,215,36,1,135,76,125,3,161,55,118,11,1,246,1,1,185,16,2,1,217,109,238,206,206,168,243,192,236,215,159,163,75,111,52,173,240,242,45,193,69,99,247,92,124,165,253,229,130,228,6,16,1,159,126,94,199,175,65,241,198,165,109,36,136,66,35,181,18,41,141,231,216,15,39,242,103,13,216,198,219,227,247,109,250,17],"quorum_hash":[34,153,131,64,66,147,240,32,92,27,189,141,240,96,197,152,58,71,115,107,141,84,31,116,141,45,108,40,72,130,129,16],"signature":[174,87,124,110,58,18,45,93,176,103,34,219,129,77,125,251,0,53,179,205,179,163,119,132,75,182,206,115,169,66,222,75,198,129,190,101,113,107,51,62,162,87,240,206,131,7,138,231,23,70,191,154,140,213,120,181,9,103,29,43,59,23,216,243,250,247,119,189,35,250,91,188,166,212,93,12,141,145,56,165,17,132,55,145,100,16,15,244,67,185,168,147,200,242,10,127],"round":0,"block_id_hash":[243,30,197,193,10,25,24,84,159,94,166,75,60,223,157,239,84,145,165,182,253,74,253,86,248,192,23,123,178,91,13,143],"quorum_type":106}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.357095280Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json b/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.357095280Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json deleted file mode 100644 index 51b7e28a49..0000000000 --- a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.357095280Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json +++ /dev/null @@ -1 +0,0 @@ -{"request":{"version":{"v0":{"id":[48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172],"prove":true}}},"response":{"version":{"v0":{"metadata":{"height":"496","core_chain_locked_height":1626,"epoch":20,"time_ms":"1700762179839","protocol_version":1,"chain_id":"dashmate_local_36"},"result":{"proof":{"grovedb_proof":[1,1,198,2,1,191,111,198,73,20,169,78,87,218,51,25,198,58,172,28,1,183,8,209,14,63,217,17,124,131,92,143,52,144,15,78,211,4,1,32,0,36,2,1,32,65,63,57,243,204,9,106,71,187,2,94,221,190,127,141,114,137,209,243,50,60,215,90,101,229,15,115,5,44,117,182,217,0,13,64,223,85,121,82,184,247,105,138,111,225,252,17,37,52,199,109,212,114,11,182,154,158,138,46,128,38,94,56,44,75,16,1,152,212,6,9,60,7,90,253,67,26,190,161,178,33,173,49,219,116,125,214,117,45,147,115,13,155,156,78,63,108,225,152,17,2,204,254,253,193,45,87,201,63,108,140,98,61,225,223,229,34,208,158,221,141,103,228,168,52,16,123,83,68,64,77,155,5,16,1,195,54,53,19,110,80,46,154,197,36,75,21,162,10,117,126,7,89,206,10,144,130,60,211,127,137,63,106,73,85,109,38,4,1,96,0,45,4,1,32,65,63,57,243,204,9,106,71,187,2,94,221,190,127,141,114,137,209,243,50,60,215,90,101,229,15,115,5,44,117,182,217,253,0,252,58,4,253,198,0,0,0,215,47,92,117,235,141,133,44,48,214,12,62,47,215,91,223,175,142,93,105,201,4,90,48,197,143,175,65,178,238,25,177,16,1,3,102,208,132,81,115,249,124,23,227,212,165,35,129,203,40,98,153,173,147,241,172,234,117,80,118,110,48,147,229,217,204,17,17,1,213,1,1,9,167,197,156,150,76,38,98,18,45,25,134,65,26,81,2,72,149,153,251,218,203,242,173,241,123,237,134,82,6,190,146,4,32,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,0,9,2,1,1,2,1,3,0,0,0,171,118,116,140,89,137,208,170,37,136,27,102,222,157,117,207,45,148,61,93,130,167,132,211,240,170,230,21,29,108,130,62,16,1,241,250,101,61,30,82,179,252,126,130,148,173,29,96,30,67,18,189,43,72,252,116,9,131,224,85,218,95,15,54,16,29,17,2,146,193,239,158,94,16,174,90,0,59,138,176,91,102,207,210,103,170,233,107,147,127,32,96,164,144,172,13,95,207,189,178,16,1,40,2,136,3,190,247,219,224,31,248,84,34,220,218,23,168,225,228,134,141,144,132,203,66,28,176,28,148,183,88,245,1,17,1,127,3,1,0,0,11,0,8,0,0,0,0,0,0,0,0,0,4,1,1,0,5,2,1,1,1,0,187,26,123,178,92,236,140,47,217,118,80,42,43,3,193,68,145,37,2,103,11,198,208,127,224,171,198,45,214,95,25,26,16,2,215,214,150,50,43,118,190,187,1,88,134,141,135,77,213,209,41,110,212,148,5,246,114,94,88,218,204,50,211,88,61,48,16,1,70,25,123,162,209,216,154,230,95,14,56,180,32,113,102,210,182,213,32,20,204,112,76,86,112,130,191,29,189,101,249,223,17,2,101,3,1,0,0,45,0,42,0,0,0,0,0,0,0,33,2,96,85,184,126,82,70,165,44,218,228,249,30,215,58,128,247,39,29,20,204,189,174,59,90,252,220,150,204,253,32,73,64,0,0,3,1,1,0,45,0,42,0,1,0,2,0,0,0,33,3,7,21,241,88,44,241,135,226,119,224,56,235,17,233,143,14,28,189,253,211,35,40,147,25,128,209,34,253,208,94,150,219,0,0,16,2,207,1,1,64,73,194,113,147,86,152,163,39,150,106,40,80,207,123,140,201,1,246,45,227,178,215,197,145,40,24,178,120,212,204,100,4,32,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,0,3,3,0,0,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,16,1,3,207,237,208,175,160,108,250,127,37,214,46,113,97,201,53,9,166,164,192,39,188,142,215,119,204,230,134,77,40,94,174,17,2,137,55,32,169,123,196,47,111,55,237,142,237,212,151,35,145,129,149,32,86,123,54,68,188,209,146,213,120,53,25,205,45,16,1,180,58,29,170,183,13,81,20,135,106,232,131,28,200,44,132,42,156,91,80,30,203,234,113,102,241,237,57,22,156,161,36,17],"quorum_hash":[34,153,131,64,66,147,240,32,92,27,189,141,240,96,197,152,58,71,115,107,141,84,31,116,141,45,108,40,72,130,129,16],"signature":[174,87,124,110,58,18,45,93,176,103,34,219,129,77,125,251,0,53,179,205,179,163,119,132,75,182,206,115,169,66,222,75,198,129,190,101,113,107,51,62,162,87,240,206,131,7,138,231,23,70,191,154,140,213,120,181,9,103,29,43,59,23,216,243,250,247,119,189,35,250,91,188,166,212,93,12,141,145,56,165,17,132,55,145,100,16,15,244,67,185,168,147,200,242,10,127],"round":0,"block_id_hash":[243,30,197,193,10,25,24,84,159,94,166,75,60,223,157,239,84,145,165,182,253,74,253,86,248,192,23,123,178,91,13,143],"quorum_type":106}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.357095531Z_GetDataContractsRequest_bd87a638d172101113991a534d56150693595e65a199f53e401cb7cd3ac82256.json b/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.357095531Z_GetDataContractsRequest_bd87a638d172101113991a534d56150693595e65a199f53e401cb7cd3ac82256.json deleted file mode 100644 index 1d042bed47..0000000000 --- a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.357095531Z_GetDataContractsRequest_bd87a638d172101113991a534d56150693595e65a199f53e401cb7cd3ac82256.json +++ /dev/null @@ -1 +0,0 @@ -{"request":{"version":{"v0":{"ids":["5mjGWa9mruHnLBht3ntbfgodcSoJxA1XIfYiv1PFMVU=","AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE="],"prove":true}}},"response":{"version":{"v0":{"metadata":{"height":"496","core_chain_locked_height":1626,"epoch":20,"time_ms":"1700762179839","protocol_version":1,"chain_id":"dashmate_local_36"},"result":{"proof":{"grovedb_proof":[1,6,1,1,64,1,1,64,208,1,5,32,12,172,226,5,36,102,147,167,200,21,101,35,98,13,170,147,125,47,34,71,147,68,99,238,176,31,247,33,149,144,149,140,75,34,153,206,135,122,242,216,192,153,213,145,252,19,92,243,151,66,21,82,155,134,59,37,64,187,226,193,3,142,106,137,2,55,87,32,239,83,222,50,100,135,105,253,22,175,40,144,194,215,36,1,135,76,125,3,161,55,118,11,1,246,1,1,185,16,2,1,217,109,238,206,206,168,243,192,236,215,159,163,75,111,52,173,240,242,45,193,69,99,247,92,124,165,253,229,130,228,6,16,4,32,230,104,198,89,175,102,174,225,231,44,24,109,222,123,91,126,10,29,113,42,9,196,13,87,33,246,34,191,83,197,49,85,0,5,2,1,1,1,0,33,138,150,165,224,17,145,179,7,120,169,2,43,51,49,142,79,255,67,7,18,161,70,134,2,167,190,106,29,104,149,81,17,2,32,230,104,198,89,175,102,174,225,231,44,24,109,222,123,91,126,10,29,113,42,9,196,13,87,33,246,34,191,83,197,49,85,255,30,3,1,0,15,88,0,251,83,15,0,230,104,198,89,175,102,174,225,231,44,24,109,222,123,91,126,10,29,113,42,9,196,13,87,33,246,34,191,83,197,49,85,0,0,0,0,0,1,0,0,1,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,0,2,6,100,111,109,97,105,110,22,6,18,4,116,121,112,101,18,6,111,98,106,101,99,116,18,7,105,110,100,105,99,101,115,21,3,22,3,18,4,110,97,109,101,18,18,112,97,114,101,110,116,78,97,109,101,65,110,100,76,97,98,101,108,18,10,112,114,111,112,101,114,116,105,101,115,21,2,22,1,18,26,110,111,114,109,97,108,105,122,101,100,80,97,114,101,110,116,68,111,109,97,105,110,78,97,109,101,18,3,97,115,99,22,1,18,15,110,111,114,109,97,108,105,122,101,100,76,97,98,101,108,18,3,97,115,99,18,6,117,110,105,113,117,101,19,1,22,3,18,4,110,97,109,101,18,14,100,97,115,104,73,100,101,110,116,105,116,121,73,100,18,10,112,114,111,112,101,114,116,105,101,115,21,1,22,1,18,28,114,101,99,111,114,100,115,46,100,97,115,104,85,110,105,113,117,101,73,100,101,110,116,105,116,121,73,100,18,3,97,115,99,18,6,117,110,105,113,117,101,19,1,22,2,18,4,110,97,109,101,18,9,100,97,115,104,65,108,105,97,115,18,10,112,114,111,112,101,114,116,105,101,115,21,1,22,1,18,27,114,101,99,111,114,100,115,46,100,97,115,104,65,108,105,97,115,73,100,101,110,116,105,116,121,73,100,18,3,97,115,99,18,10,112,114,111,112,101,114,116,105,101,115,22,7,18,5,108,97,98,101,108,22,6,18,4,116,121,112,101,18,6,115,116,114,105,110,103,18,7,112,97,116,116,101,114,110,18,42,94,91,97,45,122,65,45,90,48,45,57,93,91,97,45,122,65,45,90,48,45,57,45,93,123,48,44,54,49,125,91,97,45,122,65,45,90,48,45,57,93,36,18,9,109,105,110,76,101,110,103,116,104,2,3,18,9,109,97,120,76,101,110,103,116,104,2,63,18,8,112,111,115,105,116,105,111,110,2,0,18,11,100,101,115,99,114,105,112,116,105,111,110,18,25,68,111,109,97,105,110,32,108,97,98,101,108,46,32,101,46,103,46,32,39,66,111,98,39,46,18,15,110,111,114,109,97,108,105,122,101,100,76,97,98,101,108,22,6,18,4,116,121,112,101,18,6,115,116,114,105,110,103,18,7,112,97,116,116,101,114,110,18,60,94,91,97,45,104,106,45,107,109,45,110,112,45,122,48,45,57,93,91,97,45,104,106,45,107,109,45,110,112,45,122,48,45,57,45,93,123,48,44,54,49,125,91,97,45,104,106,45,107,109,45,110,112,45,122,48,45,57,93,36,18,9,109,97,120,76,101,110,103,116,104,2,63,18,8,112,111,115,105,116,105,111,110,2,1,18,11,100,101,115,99,114,105,112,116,105,111,110,18,163,68,111,109,97,105,110,32,108,97,98,101,108,32,99,111,110,118,101,114,116,101,100,32,116,111,32,108,111,119,101,114,99,97,115,101,32,102,111,114,32,99,97,115,101,45,105,110,115,101,110,115,105,116,105,118,101,32,117,110,105,113,117,101,110,101,115,115,32,118,97,108,105,100,97,116,105,111,110,46,32,34,111,34,44,32,34,105,34,32,97,110,100,32,34,108,34,32,114,101,112,108,97,99,101,100,32,119,105,116,104,32,34,48,34,32,97,110,100,32,34,49,34,32,116,111,32,109,105,116,105,103,97,116,101,32,104,111,109,111,103,114,97,112,104,32,97,116,116,97,99,107,46,32,101,46,103,46,32,39,98,48,98,39,18,8,36,99,111,109,109,101,110,116,18,92,77,117,115,116,32,98,101,32,101,113,117,97,108,32,116,111,32,116,104,101,32,108,97,98,101,108,32,105,110,32,108,111,119,101,114,99,97,115,101,46,32,34,111,34,44,32,34,105,34,32,97,110,100,32,34,108,34,32,109,117,115,116,32,98,101,32,114,101,112,108,97,99,101,100,32,119,105,116,104,32,34,48,34,32,97,110,100,32,34,49,34,46,18,16,112,97,114,101,110,116,68,111,109,97,105,110,78,97,109,101,22,6,18,4,116,121,112,101,18,6,115,116,114,105,110,103,18,7,112,97,116,116,101,114,110,18,45,94,36,124,94,91,97,45,122,65,45,90,48,45,57,93,91,97,45,122,65,45,90,48,45,57,45,93,123,48,44,54,49,125,91,97,45,122,65,45,90,48,45,57,93,36,18,9,109,105,110,76,101,110,103,116,104,2,0,18,9,109,97,120,76,101,110,103,116,104,2,63,18,8,112,111,115,105,116,105,111,110,2,2,18,11,100,101,115,99,114,105,112,116,105,111,110,18,39,65,32,102,117,108,108,32,112,97,114,101,110,116,32,100,111,109,97,105,110,32,110,97,109,101,46,32,101,46,103,46,32,39,100,97,115,104,39,46,18,26,110,111,114,109,97,108,105,122,101,100,80,97,114,101,110,116,68,111,109,97,105,110,78,97,109,101,22,7,18,4,116,121,112,101,18,6,115,116,114,105,110,103,18,7,112,97,116,116,101,114,110,18,65,94,36,124,94,91,97,45,104,106,45,107,109,45,110,112,45,122,48,45,57,93,91,97,45,104,106,45,107,109,45,110,112,45,122,48,45,57,45,92,46,93,123,48,44,54,49,125,91,97,45,104,106,45,107,109,45,110,112,45,122,48,45,57,93,36,18,9,109,105,110,76,101,110,103,116,104,2,0,18,9,109,97,120,76,101,110,103,116,104,2,63,18,8,112,111,115,105,116,105,111,110,2,3,18,11,100,101,115,99,114,105,112,116,105,111,110,18,162,65,32,112,97,114,101,110,116,32,100,111,109,97,105,110,32,110,97,109,101,32,105,110,32,108,111,119,101,114,99,97,115,101,32,102,111,114,32,99,97,115,101,45,105,110,115,101,110,115,105,116,105,118,101,32,117,110,105,113,117,101,110,101,115,115,32,118,97,108,105,100,97,116,105,111,110,46,32,34,111,34,44,32,34,105,34,32,97,110,100,32,34,108,34,32,114,101,112,108,97,99,101,100,32,119,105,116,104,32,34,48,34,32,97,110,100,32,34,49,34,32,116,111,32,109,105,116,105,103,97,116,101,32,104,111,109,111,103,114,97,112,104,32,97,116,116,97,99,107,46,32,101,46,103,46,32,39,100,97,115,104,39,18,8,36,99,111,109,109,101,110,116,18,192,77,117,115,116,32,101,105,116,104,101,114,32,98,101,32,101,113,117,97,108,32,116,111,32,97,110,32,101,120,105,115,116,105,110,103,32,100,111,109,97,105,110,32,111,114,32,101,109,112,116,121,32,116,111,32,99,114,101,97,116,101,32,97,32,116,111,112,32,108,101,118,101,108,32,100,111,109,97,105,110,46,32,34,111,34,44,32,34,105,34,32,97,110,100,32,34,108,34,32,109,117,115,116,32,98,101,32,114,101,112,108,97,99,101,100,32,119,105,116,104,32,34,48,34,32,97,110,100,32,34,49,34,46,32,79,110,108,121,32,116,104,101,32,100,97,116,97,32,99,111,110,116,114,97,99,116,32,111,119,110,101,114,32,99,97,110,32,99,114,101,97,116,101,32,116,111,112,32,108,101,118,101,108,32,100,111,109,97,105,110,115,46,18,12,112,114,101,111,114,100,101,114,83,97,108,116,22,6,18,4,116,121,112,101,18,5,97,114,114,97,121,18,9,98,121,116,101,65,114,114,97,121,19,1,18,8,109,105,110,73,116,101,109,115,2,32,18,8,109,97,120,73,116,101,109,115,2,32,18,8,112,111,115,105,116,105,111,110,2,4,18,11,100,101,115,99,114,105,112,116,105,111,110,18,34,83,97,108,116,32,117,115,101,100,32,105,110,32,116,104,101,32,112,114,101,111,114,100,101,114,32,100,111,99,117,109,101,110,116,18,7,114,101,99,111,114,100,115,22,7,18,4,116,121,112,101,18,6,111,98,106,101,99,116,18,10,112,114,111,112,101,114,116,105,101,115,22,2,18,20,100,97,115,104,85,110,105,113,117,101,73,100,101,110,116,105,116,121,73,100,22,8,18,4,116,121,112,101,18,5,97,114,114,97,121,18,9,98,121,116,101,65,114,114,97,121,19,1,18,8,109,105,110,73,116,101,109,115,2,32,18,8,109,97,120,73,116,101,109,115,2,32,18,8,112,111,115,105,116,105,111,110,2,0,18,16,99,111,110,116,101,110,116,77,101,100,105,97,84,121,112,101,18,33,97,112,112,108,105,99,97,116,105,111,110,47,120,46,100,97,115,104,46,100,112,112,46,105,100,101,110,116,105,102,105,101,114,18,11,100,101,115,99,114,105,112,116,105,111,110,18,62,73,100,101,110,116,105,116,121,32,73,68,32,116,111,32,98,101,32,117,115,101,100,32,116,111,32,99,114,101,97,116,101,32,116,104,101,32,112,114,105,109,97,114,121,32,110,97,109,101,32,116,104,101,32,73,100,101,110,116,105,116,121,18,8,36,99,111,109,109,101,110,116,18,35,77,117,115,116,32,98,101,32,101,113,117,97,108,32,116,111,32,116,104,101,32,100,111,99,117,109,101,110,116,32,111,119,110,101,114,18,19,100,97,115,104,65,108,105,97,115,73,100,101,110,116,105,116,121,73,100,22,8,18,4,116,121,112,101,18,5,97,114,114,97,121,18,9,98,121,116,101,65,114,114,97,121,19,1,18,8,109,105,110,73,116,101,109,115,2,32,18,8,109,97,120,73,116,101,109,115,2,32,18,8,112,111,115,105,116,105,111,110,2,1,18,16,99,111,110,116,101,110,116,77,101,100,105,97,84,121,112,101,18,33,97,112,112,108,105,99,97,116,105,111,110,47,120,46,100,97,115,104,46,100,112,112,46,105,100,101,110,116,105,102,105,101,114,18,11,100,101,115,99,114,105,112,116,105,111,110,18,61,73,100,101,110,116,105,116,121,32,73,68,32,116,111,32,98,101,32,117,115,101,100,32,116,111,32,99,114,101,97,116,101,32,97,108,105,97,115,32,110,97,109,101,115,32,102,111,114,32,116,104,101,32,73,100,101,110,116,105,116,121,18,8,36,99,111,109,109,101,110,116,18,35,77,117,115,116,32,98,101,32,101,113,117,97,108,32,116,111,32,116,104,101,32,100,111,99,117,109,101,110,116,32,111,119,110,101,114,18,13,109,105,110,80,114,111,112,101,114,116,105,101,115,2,1,18,13,109,97,120,80,114,111,112,101,114,116,105,101,115,2,1,18,8,112,111,115,105,116,105,111,110,2,5,18,20,97,100,100,105,116,105,111,110,97,108,80,114,111,112,101,114,116,105,101,115,19,0,18,8,36,99,111,109,109,101,110,116,18,144,67,111,110,115,116,114,97,105,110,116,32,119,105,116,104,32,109,97,120,32,97,110,100,32,109,105,110,32,112,114,111,112,101,114,116,105,101,115,32,101,110,115,117,114,101,32,116,104,97,116,32,111,110,108,121,32,111,110,101,32,105,100,101,110,116,105,116,121,32,114,101,99,111,114,100,32,105,115,32,117,115,101,100,32,45,32,101,105,116,104,101,114,32,97,32,96,100,97,115,104,85,110,105,113,117,101,73,100,101,110,116,105,116,121,73,100,96,32,111,114,32,97,32,96,100,97,115,104,65,108,105,97,115,73,100,101,110,116,105,116,121,73,100,96,18,14,115,117,98,100,111,109,97,105,110,82,117,108,101,115,22,6,18,4,116,121,112,101,18,6,111,98,106,101,99,116,18,10,112,114,111,112,101,114,116,105,101,115,22,1,18,15,97,108,108,111,119,83,117,98,100,111,109,97,105,110,115,22,4,18,4,116,121,112,101,18,7,98,111,111,108,101,97,110,18,11,100,101,115,99,114,105,112,116,105,111,110,18,91,84,104,105,115,32,111,112,116,105,111,110,32,100,101,102,105,110,101,115,32,119,104,111,32,99,97,110,32,99,114,101,97,116,101,32,115,117,98,100,111,109,97,105,110,115,58,32,116,114,117,101,32,45,32,97,110,121,111,110,101,59,32,102,97,108,115,101,32,45,32,111,110,108,121,32,116,104,101,32,100,111,109,97,105,110,32,111,119,110,101,114,18,8,36,99,111,109,109,101,110,116,18,79,79,110,108,121,32,116,104,101,32,100,111,109,97,105,110,32,111,119,110,101,114,32,105,115,32,97,108,108,111,119,101,100,32,116,111,32,99,114,101,97,116,101,32,115,117,98,100,111,109,97,105,110,115,32,102,111,114,32,110,111,110,32,116,111,112,45,108,101,118,101,108,32,100,111,109,97,105,110,115,18,8,112,111,115,105,116,105,111,110,2,0,18,8,112,111,115,105,116,105,111,110,2,6,18,11,100,101,115,99,114,105,112,116,105,111,110,18,66,83,117,98,100,111,109,97,105,110,32,114,117,108,101,115,32,97,108,108,111,119,32,100,111,109,97,105,110,32,111,119,110,101,114,115,32,116,111,32,100,101,102,105,110,101,32,114,117,108,101,115,32,102,111,114,32,115,117,98,100,111,109,97,105,110,115,18,20,97,100,100,105,116,105,111,110,97,108,80,114,111,112,101,114,116,105,101,115,19,0,18,8,114,101,113,117,105,114,101,100,21,1,18,15,97,108,108,111,119,83,117,98,100,111,109,97,105,110,115,18,8,114,101,113,117,105,114,101,100,21,6,18,5,108,97,98,101,108,18,15,110,111,114,109,97,108,105,122,101,100,76,97,98,101,108,18,26,110,111,114,109,97,108,105,122,101,100,80,97,114,101,110,116,68,111,109,97,105,110,78,97,109,101,18,12,112,114,101,111,114,100,101,114,83,97,108,116,18,7,114,101,99,111,114,100,115,18,14,115,117,98,100,111,109,97,105,110,82,117,108,101,115,18,20,97,100,100,105,116,105,111,110,97,108,80,114,111,112,101,114,116,105,101,115,19,0,18,8,36,99,111,109,109,101,110,116,18,251,1,55,73,110,32,111,114,100,101,114,32,116,111,32,114,101,103,105,115,116,101,114,32,97,32,100,111,109,97,105,110,32,121,111,117,32,110,101,101,100,32,116,111,32,99,114,101,97,116,101,32,97,32,112,114,101,111,114,100,101,114,46,32,84,104,101,32,112,114,101,111,114,100,101,114,32,115,116,101,112,32,105,115,32,110,101,101,100,101,100,32,116,111,32,112,114,101,118,101,110,116,32,109,97,110,45,105,110,45,116,104,101,45,109,105,100,100,108,101,32,97,116,116,97,99,107,115,46,32,110,111,114,109,97,108,105,122,101,100,76,97,98,101,108,32,43,32,39,46,39,32,43,32,110,111,114,109,97,108,105,122,101,100,80,97,114,101,110,116,68,111,109,97,105,110,32,109,117,115,116,32,110,111,116,32,98,101,32,108,111,110,103,101,114,32,116,104,97,110,32,50,53,51,32,99,104,97,114,115,32,108,101,110,103,116,104,32,97,115,32,100,101,102,105,110,101,100,32,98,121,32,82,70,67,32,49,48,51,53,46,32,68,111,109,97,105,110,32,100,111,99,117,109,101,110,116,115,32,97,114,101,32,105,109,109,117,116,97,98,108,101,58,32,109,111,100,105,102,105,99,97,116,105,111,110,32,97,110,100,32,100,101,108,101,116,105,111,110,32,97,114,101,32,114,101,115,116,114,105,99,116,101,100,8,112,114,101,111,114,100,101,114,22,6,18,4,116,121,112,101,18,6,111,98,106,101,99,116,18,7,105,110,100,105,99,101,115,21,1,22,3,18,4,110,97,109,101,18,10,115,97,108,116,101,100,72,97,115,104,18,10,112,114,111,112,101,114,116,105,101,115,21,1,22,1,18,16,115,97,108,116,101,100,68,111,109,97,105,110,72,97,115,104,18,3,97,115,99,18,6,117,110,105,113,117,101,19,1,18,10,112,114,111,112,101,114,116,105,101,115,22,1,18,16,115,97,108,116,101,100,68,111,109,97,105,110,72,97,115,104,22,6,18,4,116,121,112,101,18,5,97,114,114,97,121,18,9,98,121,116,101,65,114,114,97,121,19,1,18,8,109,105,110,73,116,101,109,115,2,32,18,8,109,97,120,73,116,101,109,115,2,32,18,8,112,111,115,105,116,105,111,110,2,0,18,11,100,101,115,99,114,105,112,116,105,111,110,18,89,68,111,117,98,108,101,32,115,104,97,45,50,53,54,32,111,102,32,116,104,101,32,99,111,110,99,97,116,101,110,97,116,105,111,110,32,111,102,32,97,32,51,50,32,98,121,116,101,32,114,97,110,100,111,109,32,115,97,108,116,32,97,110,100,32,97,32,110,111,114,109,97,108,105,122,101,100,32,100,111,109,97,105,110,32,110,97,109,101,18,8,114,101,113,117,105,114,101,100,21,1,18,16,115,97,108,116,101,100,68,111,109,97,105,110,72,97,115,104,18,20,97,100,100,105,116,105,111,110,97,108,80,114,111,112,101,114,116,105,101,115,19,0,18,8,36,99,111,109,109,101,110,116,18,74,80,114,101,111,114,100,101,114,32,100,111,99,117,109,101,110,116,115,32,97,114,101,32,105,109,109,117,116,97,98,108,101,58,32,109,111,100,105,102,105,99,97,116,105,111,110,32,97,110,100,32,100,101,108,101,116,105,111,110,32,97,114,101,32,114,101,115,116,114,105,99,116,101,100,0,2,213,134,128,207,201,13,236,20,124,137,134,23,200,118,113,53,4,74,177,5,88,90,191,64,210,150,118,119,120,208,33,226,16,1,0,141,1,1,62,210,128,237,157,173,255,118,46,120,226,35,148,9,65,38,159,144,75,61,235,31,132,201,170,187,200,81,86,89,44,191,4,1,64,0,36,2,1,32,162,161,180,172,111,239,34,234,42,26,104,232,18,54,68,179,87,135,95,107,65,44,24,16,146,129,193,70,231,178,113,188,0,168,99,211,63,81,56,245,72,156,254,93,201,14,131,171,16,91,237,241,30,32,62,67,128,249,8,196,116,111,157,82,212,16,1,151,170,133,85,12,8,231,83,83,8,28,221,26,134,85,126,234,104,22,231,103,54,180,118,34,209,31,166,11,144,174,155,17],"quorum_hash":[34,153,131,64,66,147,240,32,92,27,189,141,240,96,197,152,58,71,115,107,141,84,31,116,141,45,108,40,72,130,129,16],"signature":[174,87,124,110,58,18,45,93,176,103,34,219,129,77,125,251,0,53,179,205,179,163,119,132,75,182,206,115,169,66,222,75,198,129,190,101,113,107,51,62,162,87,240,206,131,7,138,231,23,70,191,154,140,213,120,181,9,103,29,43,59,23,216,243,250,247,119,189,35,250,91,188,166,212,93,12,141,145,56,165,17,132,55,145,100,16,15,244,67,185,168,147,200,242,10,127],"round":0,"block_id_hash":[243,30,197,193,10,25,24,84,159,94,166,75,60,223,157,239,84,145,165,182,253,74,253,86,248,192,23,123,178,91,13,143],"quorum_type":106}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.751819754Z_GetEpochsInfoRequest_ef9bdb4da13c406de86be6d66c61454c0d455b5b1be6365d7e3c2bca36dbc42c.json b/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.751819754Z_GetEpochsInfoRequest_ef9bdb4da13c406de86be6d66c61454c0d455b5b1be6365d7e3c2bca36dbc42c.json deleted file mode 100644 index f3f0a4d583..0000000000 --- a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:29.751819754Z_GetEpochsInfoRequest_ef9bdb4da13c406de86be6d66c61454c0d455b5b1be6365d7e3c2bca36dbc42c.json +++ /dev/null @@ -1 +0,0 @@ -{"request":{"version":{"v0":{"start_epoch":20,"count":100,"ascending":true,"prove":true}}},"response":{"version":{"v0":{"metadata":{"height":"496","core_chain_locked_height":1626,"epoch":20,"time_ms":"1700762179839","protocol_version":1,"chain_id":"dashmate_local_36"},"result":{"proof":{"grovedb_proof":[1,1,248,192,5,1,83,130,202,92,2,193,2,25,2,95,255,51,170,79,44,231,110,158,154,75,226,88,157,4,91,99,78,173,130,128,127,142,2,100,123,12,124,246,245,215,211,9,20,208,5,145,179,6,159,212,55,244,219,114,242,103,240,89,252,195,139,154,208,238,240,16,1,184,99,127,70,228,172,164,251,193,148,25,170,66,21,245,118,251,35,61,92,137,237,163,55,22,211,186,37,201,2,68,150,2,132,161,36,229,153,63,245,118,100,187,61,173,192,187,115,80,140,111,141,89,82,195,141,33,8,211,221,231,235,163,211,33,16,4,2,1,20,0,6,4,1,1,115,0,0,161,19,100,111,42,217,230,29,186,16,48,187,133,94,222,139,100,139,238,137,67,92,70,49,194,217,20,30,8,219,158,237,4,2,1,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,1,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,1,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,1,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,1,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,1,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,1,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,1,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,4,2,1,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,2,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,2,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,2,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,2,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,2,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,2,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,2,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,17,4,2,2,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,3,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,3,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,3,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,3,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,3,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,3,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,3,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,4,2,3,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,4,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,4,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,4,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,4,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,4,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,4,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,4,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,17,17,4,2,4,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,5,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,5,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,5,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,5,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,5,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,5,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,5,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,4,2,5,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,6,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,6,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,6,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,6,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,6,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,6,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,6,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,17,4,2,6,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,6,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,7,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,7,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,7,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,7,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,7,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,7,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,4,2,7,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,7,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,8,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,8,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,8,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,8,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,8,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,8,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,208,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,209,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,17,17,4,2,8,210,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,211,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,4,2,8,212,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,213,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,4,2,8,214,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,215,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,4,2,8,216,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,217,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,4,2,8,218,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,219,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,4,2,8,220,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,221,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,17,4,2,8,222,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,223,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,4,2,8,224,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,225,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,4,2,8,226,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,227,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,4,2,8,228,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,17,4,1,112,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,1,115,0,3,3,0,0,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,3,1,117,0,5,0,2,0,20,0,16,17,17,17,17,17,17,17,17,17,2,165,1,3,1,99,0,7,0,4,0,0,6,86,0,3,1,104,0,11,0,8,0,0,0,0,0,0,1,231,0,16,2,60,28,249,153,255,149,174,37,198,91,202,41,29,108,29,92,197,223,42,215,186,204,179,105,137,130,121,168,169,225,217,84,16,1,124,5,5,84,197,79,223,134,77,199,210,177,213,29,127,3,207,81,232,32,223,29,3,226,129,220,208,51,8,53,216,176,17,2,121,45,177,85,164,24,14,126,131,127,68,24,21,95,97,146,155,109,41,179,16,161,60,228,68,62,168,147,142,105,25,73,16,3,1,116,0,11,0,8,0,0,1,139,253,81,193,138,0,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,16,17,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,1,180,1,1,191,111,198,73,20,169,78,87,218,51,25,198,58,172,28,1,183,8,209,14,63,217,17,124,131,92,143,52,144,15,78,211,2,238,81,197,66,193,59,172,79,56,196,200,19,94,104,228,220,46,42,34,208,26,22,228,148,175,206,141,51,231,174,100,25,16,4,1,48,0,7,4,1,2,4,233,0,0,126,140,194,235,75,151,172,234,136,23,1,100,14,152,204,209,139,193,3,130,181,93,47,77,35,56,97,121,251,151,185,114,17,2,204,254,253,193,45,87,201,63,108,140,98,61,225,223,229,34,208,158,221,141,103,228,168,52,16,123,83,68,64,77,155,5,16,1,151,170,133,85,12,8,231,83,83,8,28,221,26,134,85,126,234,104,22,231,103,54,180,118,34,209,31,166,11,144,174,155,17],"quorum_hash":[34,153,131,64,66,147,240,32,92,27,189,141,240,96,197,152,58,71,115,107,141,84,31,116,141,45,108,40,72,130,129,16],"signature":[174,87,124,110,58,18,45,93,176,103,34,219,129,77,125,251,0,53,179,205,179,163,119,132,75,182,206,115,169,66,222,75,198,129,190,101,113,107,51,62,162,87,240,206,131,7,138,231,23,70,191,154,140,213,120,181,9,103,29,43,59,23,216,243,250,247,119,189,35,250,91,188,166,212,93,12,141,145,56,165,17,132,55,145,100,16,15,244,67,185,168,147,200,242,10,127],"round":0,"block_id_hash":[243,30,197,193,10,25,24,84,159,94,166,75,60,223,157,239,84,145,165,182,253,74,253,86,248,192,23,123,178,91,13,143],"quorum_type":106}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.080124542Z_GetEpochsInfoRequest_9cce33953db8841b6123b9ed1855b44ad2d78827e5cff18e4aee445ae1517d4d.json b/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.080124542Z_GetEpochsInfoRequest_9cce33953db8841b6123b9ed1855b44ad2d78827e5cff18e4aee445ae1517d4d.json deleted file mode 100644 index 8000a4238b..0000000000 --- a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.080124542Z_GetEpochsInfoRequest_9cce33953db8841b6123b9ed1855b44ad2d78827e5cff18e4aee445ae1517d4d.json +++ /dev/null @@ -1 +0,0 @@ -{"request":{"version":{"v0":{"start_epoch":0,"count":100,"ascending":true,"prove":true}}},"response":{"version":{"v0":{"metadata":{"height":"496","core_chain_locked_height":1626,"epoch":20,"time_ms":"1700762179839","protocol_version":1,"chain_id":"dashmate_local_36"},"result":{"proof":{"grovedb_proof":[1,1,244,198,5,4,2,1,0,0,6,4,1,1,116,0,0,170,205,100,128,108,115,222,4,225,69,209,249,69,110,17,221,46,200,2,168,60,40,242,144,39,126,207,239,91,109,255,238,4,2,1,1,0,6,4,1,1,116,0,0,169,113,228,29,18,1,255,204,230,209,36,107,177,68,50,65,233,185,100,174,37,144,228,40,53,244,81,156,178,106,185,82,16,4,2,1,2,0,6,4,1,1,116,0,0,199,142,226,92,252,7,100,2,104,134,94,46,85,127,154,201,151,64,111,73,138,209,245,228,32,67,54,161,2,133,160,44,17,4,2,1,3,0,6,4,1,1,116,0,0,233,149,90,145,122,102,109,109,212,177,248,226,66,10,43,198,195,198,218,70,78,152,64,44,22,143,136,87,108,0,239,116,16,4,2,1,4,0,6,4,1,1,116,0,0,142,119,219,26,179,91,114,92,217,60,65,202,231,73,157,214,252,107,231,128,246,76,26,247,77,232,157,232,44,88,219,80,4,2,1,5,0,6,4,1,1,116,0,0,80,185,96,184,80,75,103,105,217,123,2,91,240,181,161,251,42,174,74,98,141,193,54,86,140,86,60,137,93,96,210,51,16,4,2,1,6,0,6,4,1,1,116,0,0,13,33,52,18,188,23,46,29,49,9,242,239,65,13,67,230,166,63,104,100,75,68,144,78,228,82,147,232,191,30,82,24,17,17,4,2,1,7,0,6,4,1,1,116,0,0,97,98,93,169,82,174,59,82,50,103,42,55,195,75,1,82,134,178,31,236,167,213,99,32,57,3,90,252,147,255,217,119,16,4,2,1,8,0,6,4,1,1,116,0,0,106,179,145,38,165,196,22,31,141,47,184,193,102,229,149,178,46,198,138,153,63,37,236,189,20,130,177,86,251,1,188,35,4,2,1,9,0,6,4,1,1,116,0,0,2,154,206,1,126,26,115,40,105,81,11,182,201,110,78,247,16,163,62,28,247,160,150,90,144,197,191,193,194,5,48,184,16,4,2,1,10,0,6,4,1,1,116,0,0,94,170,4,154,97,124,43,67,244,246,100,66,141,136,251,246,102,32,132,179,15,9,223,251,216,98,133,14,206,13,117,170,17,4,2,1,11,0,6,4,1,1,116,0,0,208,187,152,36,63,131,206,162,124,148,106,188,57,25,206,210,133,0,211,188,29,89,199,135,247,23,233,201,89,18,122,53,16,4,2,1,12,0,6,4,1,1,116,0,0,245,86,78,65,213,129,6,194,220,174,234,174,48,30,200,146,221,226,194,67,110,18,156,108,36,233,162,141,10,174,180,201,4,2,1,13,0,6,4,1,1,116,0,0,132,80,178,190,61,183,88,13,69,35,54,194,246,201,93,114,242,248,156,157,138,188,116,99,109,219,34,56,254,123,200,171,16,4,2,1,14,0,6,4,1,1,116,0,0,15,229,12,189,80,235,210,182,202,253,31,17,183,77,153,3,20,137,164,131,157,81,109,140,5,181,65,204,46,112,163,156,17,17,17,4,2,1,15,0,6,4,1,1,116,0,0,231,30,228,93,45,17,46,167,166,147,24,0,95,175,80,206,79,33,240,28,148,189,240,116,92,179,146,62,58,116,239,189,16,4,2,1,16,0,6,4,1,1,116,0,0,46,99,19,149,183,250,167,108,175,86,207,143,251,233,188,80,166,205,31,52,185,9,181,234,66,128,156,9,223,174,146,198,4,2,1,17,0,6,4,1,1,116,0,0,153,187,138,90,65,20,198,64,150,96,167,187,197,180,133,33,30,96,163,144,51,166,3,94,207,214,49,230,144,39,228,149,16,4,2,1,18,0,6,4,1,1,116,0,0,102,84,141,100,138,102,251,89,31,114,253,128,44,240,98,17,94,177,52,109,220,227,120,227,254,70,241,134,25,0,215,127,17,4,2,1,19,0,6,4,1,1,116,0,0,198,71,208,163,201,190,193,12,90,113,149,114,4,108,252,129,193,37,131,85,162,219,39,156,251,25,95,67,99,67,93,162,16,4,2,1,20,0,6,4,1,1,115,0,0,161,19,100,111,42,217,230,29,186,16,48,187,133,94,222,139,100,139,238,137,67,92,70,49,194,217,20,30,8,219,158,237,4,2,1,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,1,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,1,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,1,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,1,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,1,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,1,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,1,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,4,2,1,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,2,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,2,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,2,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,2,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,2,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,2,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,2,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,17,4,2,2,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,3,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,3,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,3,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,3,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,3,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,3,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,3,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,4,2,3,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,4,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,4,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,4,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,4,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,4,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,4,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,4,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,17,17,4,2,4,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,5,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,5,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,5,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,5,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,5,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,5,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,5,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,4,2,5,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,6,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,6,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,6,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,6,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,6,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,6,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,6,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,17,4,2,6,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,6,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,7,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,7,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,7,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,7,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,7,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,7,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,4,2,7,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,7,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,8,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,8,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,8,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,8,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,8,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,8,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,208,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,209,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,17,17,4,2,8,210,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,211,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,4,2,8,212,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,213,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,4,2,8,214,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,215,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,4,2,8,216,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,217,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,4,2,8,218,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,219,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,4,2,8,220,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,221,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,17,4,2,8,222,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,223,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,4,2,8,224,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,225,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,4,2,8,226,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,227,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,4,2,8,228,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,17,4,1,112,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,1,115,0,3,3,0,0,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,3,1,117,0,5,0,2,0,20,0,16,17,17,17,17,17,17,17,17,17,2,63,3,1,99,0,7,0,4,0,0,5,155,0,3,1,104,0,11,0,8,0,0,0,0,0,0,0,1,0,16,3,1,116,0,11,0,8,0,0,1,139,252,246,6,216,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,2,63,3,1,99,0,7,0,4,0,0,5,155,0,3,1,104,0,11,0,8,0,0,0,0,0,0,0,2,0,16,3,1,116,0,11,0,8,0,0,1,139,252,251,241,24,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,2,63,3,1,99,0,7,0,4,0,0,5,162,0,3,1,104,0,11,0,8,0,0,0,0,0,0,0,21,0,16,3,1,116,0,11,0,8,0,0,1,139,252,255,77,231,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,2,63,3,1,99,0,7,0,4,0,0,5,172,0,3,1,104,0,11,0,8,0,0,0,0,0,0,0,47,0,16,3,1,116,0,11,0,8,0,0,1,139,253,3,229,143,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,2,63,3,1,99,0,7,0,4,0,0,5,183,0,3,1,104,0,11,0,8,0,0,0,0,0,0,0,73,0,16,3,1,116,0,11,0,8,0,0,1,139,253,8,129,167,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,2,63,3,1,99,0,7,0,4,0,0,5,192,0,3,1,104,0,11,0,8,0,0,0,0,0,0,0,98,0,16,3,1,116,0,11,0,8,0,0,1,139,253,12,238,205,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,2,63,3,1,99,0,7,0,4,0,0,5,202,0,3,1,104,0,11,0,8,0,0,0,0,0,0,0,124,0,16,3,1,116,0,11,0,8,0,0,1,139,253,17,136,34,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,2,63,3,1,99,0,7,0,4,0,0,5,212,0,3,1,104,0,11,0,8,0,0,0,0,0,0,0,150,0,16,3,1,116,0,11,0,8,0,0,1,139,253,22,34,177,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,2,63,3,1,99,0,7,0,4,0,0,5,222,0,3,1,104,0,11,0,8,0,0,0,0,0,0,0,176,0,16,3,1,116,0,11,0,8,0,0,1,139,253,26,187,233,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,2,63,3,1,99,0,7,0,4,0,0,5,232,0,3,1,104,0,11,0,8,0,0,0,0,0,0,0,202,0,16,3,1,116,0,11,0,8,0,0,1,139,253,31,86,208,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,2,63,3,1,99,0,7,0,4,0,0,5,242,0,3,1,104,0,11,0,8,0,0,0,0,0,0,0,228,0,16,3,1,116,0,11,0,8,0,0,1,139,253,35,239,76,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,2,63,3,1,99,0,7,0,4,0,0,5,252,0,3,1,104,0,11,0,8,0,0,0,0,0,0,0,254,0,16,3,1,116,0,11,0,8,0,0,1,139,253,40,136,203,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,2,63,3,1,99,0,7,0,4,0,0,6,6,0,3,1,104,0,11,0,8,0,0,0,0,0,0,1,23,0,16,3,1,116,0,11,0,8,0,0,1,139,253,44,246,89,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,2,63,3,1,99,0,7,0,4,0,0,6,16,0,3,1,104,0,11,0,8,0,0,0,0,0,0,1,49,0,16,3,1,116,0,11,0,8,0,0,1,139,253,49,142,130,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,2,63,3,1,99,0,7,0,4,0,0,6,26,0,3,1,104,0,11,0,8,0,0,0,0,0,0,1,75,0,16,3,1,116,0,11,0,8,0,0,1,139,253,54,39,60,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,2,63,3,1,99,0,7,0,4,0,0,6,36,0,3,1,104,0,11,0,8,0,0,0,0,0,0,1,101,0,16,3,1,116,0,11,0,8,0,0,1,139,253,58,195,6,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,2,63,3,1,99,0,7,0,4,0,0,6,46,0,3,1,104,0,11,0,8,0,0,0,0,0,0,1,127,0,16,3,1,116,0,11,0,8,0,0,1,139,253,63,94,120,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,2,63,3,1,99,0,7,0,4,0,0,6,56,0,3,1,104,0,11,0,8,0,0,0,0,0,0,1,153,0,16,3,1,116,0,11,0,8,0,0,1,139,253,67,247,22,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,2,63,3,1,99,0,7,0,4,0,0,6,66,0,3,1,104,0,11,0,8,0,0,0,0,0,0,1,179,0,16,3,1,116,0,11,0,8,0,0,1,139,253,72,143,190,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,2,63,3,1,99,0,7,0,4,0,0,6,76,0,3,1,104,0,11,0,8,0,0,0,0,0,0,1,205,0,16,3,1,116,0,11,0,8,0,0,1,139,253,77,39,243,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,2,165,1,3,1,99,0,7,0,4,0,0,6,86,0,3,1,104,0,11,0,8,0,0,0,0,0,0,1,231,0,16,2,60,28,249,153,255,149,174,37,198,91,202,41,29,108,29,92,197,223,42,215,186,204,179,105,137,130,121,168,169,225,217,84,16,1,124,5,5,84,197,79,223,134,77,199,210,177,213,29,127,3,207,81,232,32,223,29,3,226,129,220,208,51,8,53,216,176,17,2,121,45,177,85,164,24,14,126,131,127,68,24,21,95,97,146,155,109,41,179,16,161,60,228,68,62,168,147,142,105,25,73,16,3,1,116,0,11,0,8,0,0,1,139,253,81,193,138,0,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,16,17,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,1,180,1,1,191,111,198,73,20,169,78,87,218,51,25,198,58,172,28,1,183,8,209,14,63,217,17,124,131,92,143,52,144,15,78,211,2,238,81,197,66,193,59,172,79,56,196,200,19,94,104,228,220,46,42,34,208,26,22,228,148,175,206,141,51,231,174,100,25,16,4,1,48,0,7,4,1,2,4,233,0,0,126,140,194,235,75,151,172,234,136,23,1,100,14,152,204,209,139,193,3,130,181,93,47,77,35,56,97,121,251,151,185,114,17,2,204,254,253,193,45,87,201,63,108,140,98,61,225,223,229,34,208,158,221,141,103,228,168,52,16,123,83,68,64,77,155,5,16,1,151,170,133,85,12,8,231,83,83,8,28,221,26,134,85,126,234,104,22,231,103,54,180,118,34,209,31,166,11,144,174,155,17],"quorum_hash":[34,153,131,64,66,147,240,32,92,27,189,141,240,96,197,152,58,71,115,107,141,84,31,116,141,45,108,40,72,130,129,16],"signature":[174,87,124,110,58,18,45,93,176,103,34,219,129,77,125,251,0,53,179,205,179,163,119,132,75,182,206,115,169,66,222,75,198,129,190,101,113,107,51,62,162,87,240,206,131,7,138,231,23,70,191,154,140,213,120,181,9,103,29,43,59,23,216,243,250,247,119,189,35,250,91,188,166,212,93,12,141,145,56,165,17,132,55,145,100,16,15,244,67,185,168,147,200,242,10,127],"round":0,"block_id_hash":[243,30,197,193,10,25,24,84,159,94,166,75,60,223,157,239,84,145,165,182,253,74,253,86,248,192,23,123,178,91,13,143],"quorum_type":106}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.426422030Z_DocumentQuery_93ef8e9afdc1e6a8453c1751ff30274e274af4fcc3a2671cb2d48ad78f095d15.json b/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.426422030Z_DocumentQuery_93ef8e9afdc1e6a8453c1751ff30274e274af4fcc3a2671cb2d48ad78f095d15.json deleted file mode 100644 index 8ed28d0127..0000000000 --- a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.426422030Z_DocumentQuery_93ef8e9afdc1e6a8453c1751ff30274e274af4fcc3a2671cb2d48ad78f095d15.json +++ /dev/null @@ -1 +0,0 @@ -{"request":{"data_contract":{"$format_version":"0","id":"GWRSAVFMjXx8HpQFaNJMqBV7MBgMK4br5UESsB4S31Ec","config":{"$format_version":"0","canBeDeleted":false,"readonly":false,"keepsHistory":false,"documentsKeepHistoryContractDefault":false,"documentsMutableContractDefault":true,"requiresIdentityEncryptionBoundedKey":null,"requiresIdentityDecryptionBoundedKey":null},"version":1,"ownerId":"4EfA9Jrvv3nnCFdSf7fad59851iiTRZ6Wcu6YVJ4iSeF","schemaDefs":null,"documentSchemas":{"domain":{"type":"object","indices":[{"name":"parentNameAndLabel","properties":[{"normalizedParentDomainName":"asc"},{"normalizedLabel":"asc"}],"unique":true},{"name":"dashIdentityId","properties":[{"records.dashUniqueIdentityId":"asc"}],"unique":true},{"name":"dashAlias","properties":[{"records.dashAliasIdentityId":"asc"}]}],"properties":{"label":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9]$","minLength":3,"maxLength":63,"position":0,"description":"Domain label. e.g. 'Bob'."},"normalizedLabel":{"type":"string","pattern":"^[a-hj-km-np-z0-9][a-hj-km-np-z0-9-]{0,61}[a-hj-km-np-z0-9]$","maxLength":63,"position":1,"description":"Domain label converted to lowercase for case-insensitive uniqueness validation. \"o\", \"i\" and \"l\" replaced with \"0\" and \"1\" to mitigate homograph attack. e.g. 'b0b'","$comment":"Must be equal to the label in lowercase. \"o\", \"i\" and \"l\" must be replaced with \"0\" and \"1\"."},"parentDomainName":{"type":"string","pattern":"^$|^[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9]$","minLength":0,"maxLength":63,"position":2,"description":"A full parent domain name. e.g. 'dash'."},"normalizedParentDomainName":{"type":"string","pattern":"^$|^[a-hj-km-np-z0-9][a-hj-km-np-z0-9-\\.]{0,61}[a-hj-km-np-z0-9]$","minLength":0,"maxLength":63,"position":3,"description":"A parent domain name in lowercase for case-insensitive uniqueness validation. \"o\", \"i\" and \"l\" replaced with \"0\" and \"1\" to mitigate homograph attack. e.g. 'dash'","$comment":"Must either be equal to an existing domain or empty to create a top level domain. \"o\", \"i\" and \"l\" must be replaced with \"0\" and \"1\". Only the data contract owner can create top level domains."},"preorderSalt":{"type":"array","byteArray":true,"minItems":32,"maxItems":32,"position":4,"description":"Salt used in the preorder document"},"records":{"type":"object","properties":{"dashUniqueIdentityId":{"type":"array","byteArray":true,"minItems":32,"maxItems":32,"position":0,"contentMediaType":"application/x.dash.dpp.identifier","description":"Identity ID to be used to create the primary name the Identity","$comment":"Must be equal to the document owner"},"dashAliasIdentityId":{"type":"array","byteArray":true,"minItems":32,"maxItems":32,"position":1,"contentMediaType":"application/x.dash.dpp.identifier","description":"Identity ID to be used to create alias names for the Identity","$comment":"Must be equal to the document owner"}},"minProperties":1,"maxProperties":1,"position":5,"additionalProperties":false,"$comment":"Constraint with max and min properties ensure that only one identity record is used - either a `dashUniqueIdentityId` or a `dashAliasIdentityId`"},"subdomainRules":{"type":"object","properties":{"allowSubdomains":{"type":"boolean","description":"This option defines who can create subdomains: true - anyone; false - only the domain owner","$comment":"Only the domain owner is allowed to create subdomains for non top-level domains","position":0}},"position":6,"description":"Subdomain rules allow domain owners to define rules for subdomains","additionalProperties":false,"required":["allowSubdomains"]}},"required":["label","normalizedLabel","normalizedParentDomainName","preorderSalt","records","subdomainRules"],"additionalProperties":false,"$comment":"In order to register a domain you need to create a preorder. The preorder step is needed to prevent man-in-the-middle attacks. normalizedLabel + '.' + normalizedParentDomain must not be longer than 253 chars length as defined by RFC 1035. Domain documents are immutable: modification and deletion are restricted"},"preorder":{"type":"object","indices":[{"name":"saltedHash","properties":[{"saltedDomainHash":"asc"}],"unique":true}],"properties":{"saltedDomainHash":{"type":"array","byteArray":true,"minItems":32,"maxItems":32,"position":0,"description":"Double sha-256 of the concatenation of a 32 byte random salt and a normalized domain name"}},"required":["saltedDomainHash"],"additionalProperties":false,"$comment":"Preorder documents are immutable: modification and deletion are restricted"}}},"document_type_name":"domain","where_clauses":[{"field":"$id","operator":"Equal","value":"11111111111111111111111111111111"}],"order_by_clauses":[],"limit":0,"start":null},"response":{"version":{"v0":{"metadata":{"height":"496","core_chain_locked_height":1626,"epoch":20,"time_ms":"1700762179839","protocol_version":1,"chain_id":"dashmate_local_36"},"result":{"proof":{"grovedb_proof":[1,2,66,5,32,215,242,197,63,70,169,23,171,110,91,57,162,215,188,38,11,100,146,137,69,55,68,209,224,212,242,106,141,142,255,55,207,147,75,114,199,152,241,64,189,233,69,209,216,208,173,226,107,85,229,226,252,149,3,98,55,80,101,79,94,183,218,227,108,1,175,1,4,1,0,0,36,2,1,32,215,242,197,63,70,169,23,171,110,91,57,162,215,188,38,11,100,146,137,69,55,68,209,224,212,242,106,141,142,255,55,207,0,65,245,205,250,165,144,58,205,151,231,250,118,68,196,222,33,122,115,202,113,191,174,43,185,18,208,221,98,69,63,190,117,2,243,227,109,203,174,138,132,44,53,44,18,233,29,115,61,1,50,236,193,96,113,27,57,167,78,14,8,132,33,178,91,59,16,2,115,95,123,161,244,153,57,55,29,209,118,68,122,250,87,10,220,178,23,42,98,149,170,101,107,2,4,123,132,80,134,114,16,1,237,176,56,18,90,131,64,146,62,73,218,37,7,80,230,25,195,214,84,107,116,42,161,213,231,99,49,70,109,122,46,221,17,1,107,4,6,100,111,109,97,105,110,0,31,2,1,27,114,101,99,111,114,100,115,46,100,97,115,104,65,108,105,97,115,73,100,101,110,116,105,116,121,73,100,0,204,190,158,105,75,9,25,208,194,91,83,149,12,201,75,109,144,75,99,66,32,51,85,191,175,76,98,75,52,53,85,240,2,38,158,217,247,245,108,64,252,150,230,243,204,75,109,160,249,36,126,63,182,190,232,139,251,233,178,192,48,6,248,191,249,16,1,83,1,54,223,240,31,55,201,49,39,140,69,210,242,185,108,80,68,28,64,36,152,167,122,5,41,10,68,183,75,86,144,179,204,4,1,1,0,12,2,1,8,112,114,101,111,114,100,101,114,0,84,156,7,216,23,176,127,111,115,1,136,38,75,129,30,33,220,29,7,163,198,67,108,238,35,254,220,182,27,62,14,229,16,1,141,1,1,53,27,87,37,221,226,28,175,201,185,193,171,161,189,79,11,174,89,129,179,222,243,245,228,182,62,69,51,4,147,15,248,2,1,217,109,238,206,206,168,243,192,236,215,159,163,75,111,52,173,240,242,45,193,69,99,247,92,124,165,253,229,130,228,6,16,4,32,230,104,198,89,175,102,174,225,231,44,24,109,222,123,91,126,10,29,113,42,9,196,13,87,33,246,34,191,83,197,49,85,0,5,2,1,1,1,0,33,138,150,165,224,17,145,179,7,120,169,2,43,51,49,142,79,255,67,7,18,161,70,134,2,167,190,106,29,104,149,81,17,1,141,1,1,62,210,128,237,157,173,255,118,46,120,226,35,148,9,65,38,159,144,75,61,235,31,132,201,170,187,200,81,86,89,44,191,4,1,64,0,36,2,1,32,162,161,180,172,111,239,34,234,42,26,104,232,18,54,68,179,87,135,95,107,65,44,24,16,146,129,193,70,231,178,113,188,0,168,99,211,63,81,56,245,72,156,254,93,201,14,131,171,16,91,237,241,30,32,62,67,128,249,8,196,116,111,157,82,212,16,1,151,170,133,85,12,8,231,83,83,8,28,221,26,134,85,126,234,104,22,231,103,54,180,118,34,209,31,166,11,144,174,155,17],"quorum_hash":[34,153,131,64,66,147,240,32,92,27,189,141,240,96,197,152,58,71,115,107,141,84,31,116,141,45,108,40,72,130,129,16],"signature":[174,87,124,110,58,18,45,93,176,103,34,219,129,77,125,251,0,53,179,205,179,163,119,132,75,182,206,115,169,66,222,75,198,129,190,101,113,107,51,62,162,87,240,206,131,7,138,231,23,70,191,154,140,213,120,181,9,103,29,43,59,23,216,243,250,247,119,189,35,250,91,188,166,212,93,12,141,145,56,165,17,132,55,145,100,16,15,244,67,185,168,147,200,242,10,127],"round":0,"block_id_hash":[243,30,197,193,10,25,24,84,159,94,166,75,60,223,157,239,84,145,165,182,253,74,253,86,248,192,23,123,178,91,13,143],"quorum_type":106}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.433229690Z_DocumentQuery_a818ac2a04eea1a026dc55c30ab94f09befdbcd37bf82f70051c8cd3e4eddeba.json b/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.433229690Z_DocumentQuery_a818ac2a04eea1a026dc55c30ab94f09befdbcd37bf82f70051c8cd3e4eddeba.json deleted file mode 100644 index 871ef34ca3..0000000000 --- a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.433229690Z_DocumentQuery_a818ac2a04eea1a026dc55c30ab94f09befdbcd37bf82f70051c8cd3e4eddeba.json +++ /dev/null @@ -1 +0,0 @@ -{"request":{"data_contract":{"$format_version":"0","id":"GWRSAVFMjXx8HpQFaNJMqBV7MBgMK4br5UESsB4S31Ec","config":{"$format_version":"0","canBeDeleted":false,"readonly":false,"keepsHistory":false,"documentsKeepHistoryContractDefault":false,"documentsMutableContractDefault":true,"requiresIdentityEncryptionBoundedKey":null,"requiresIdentityDecryptionBoundedKey":null},"version":1,"ownerId":"4EfA9Jrvv3nnCFdSf7fad59851iiTRZ6Wcu6YVJ4iSeF","schemaDefs":null,"documentSchemas":{"domain":{"type":"object","indices":[{"name":"parentNameAndLabel","properties":[{"normalizedParentDomainName":"asc"},{"normalizedLabel":"asc"}],"unique":true},{"name":"dashIdentityId","properties":[{"records.dashUniqueIdentityId":"asc"}],"unique":true},{"name":"dashAlias","properties":[{"records.dashAliasIdentityId":"asc"}]}],"properties":{"label":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9]$","minLength":3,"maxLength":63,"position":0,"description":"Domain label. e.g. 'Bob'."},"normalizedLabel":{"type":"string","pattern":"^[a-hj-km-np-z0-9][a-hj-km-np-z0-9-]{0,61}[a-hj-km-np-z0-9]$","maxLength":63,"position":1,"description":"Domain label converted to lowercase for case-insensitive uniqueness validation. \"o\", \"i\" and \"l\" replaced with \"0\" and \"1\" to mitigate homograph attack. e.g. 'b0b'","$comment":"Must be equal to the label in lowercase. \"o\", \"i\" and \"l\" must be replaced with \"0\" and \"1\"."},"parentDomainName":{"type":"string","pattern":"^$|^[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9]$","minLength":0,"maxLength":63,"position":2,"description":"A full parent domain name. e.g. 'dash'."},"normalizedParentDomainName":{"type":"string","pattern":"^$|^[a-hj-km-np-z0-9][a-hj-km-np-z0-9-\\.]{0,61}[a-hj-km-np-z0-9]$","minLength":0,"maxLength":63,"position":3,"description":"A parent domain name in lowercase for case-insensitive uniqueness validation. \"o\", \"i\" and \"l\" replaced with \"0\" and \"1\" to mitigate homograph attack. e.g. 'dash'","$comment":"Must either be equal to an existing domain or empty to create a top level domain. \"o\", \"i\" and \"l\" must be replaced with \"0\" and \"1\". Only the data contract owner can create top level domains."},"preorderSalt":{"type":"array","byteArray":true,"minItems":32,"maxItems":32,"position":4,"description":"Salt used in the preorder document"},"records":{"type":"object","properties":{"dashUniqueIdentityId":{"type":"array","byteArray":true,"minItems":32,"maxItems":32,"position":0,"contentMediaType":"application/x.dash.dpp.identifier","description":"Identity ID to be used to create the primary name the Identity","$comment":"Must be equal to the document owner"},"dashAliasIdentityId":{"type":"array","byteArray":true,"minItems":32,"maxItems":32,"position":1,"contentMediaType":"application/x.dash.dpp.identifier","description":"Identity ID to be used to create alias names for the Identity","$comment":"Must be equal to the document owner"}},"minProperties":1,"maxProperties":1,"position":5,"additionalProperties":false,"$comment":"Constraint with max and min properties ensure that only one identity record is used - either a `dashUniqueIdentityId` or a `dashAliasIdentityId`"},"subdomainRules":{"type":"object","properties":{"allowSubdomains":{"type":"boolean","description":"This option defines who can create subdomains: true - anyone; false - only the domain owner","$comment":"Only the domain owner is allowed to create subdomains for non top-level domains","position":0}},"position":6,"description":"Subdomain rules allow domain owners to define rules for subdomains","additionalProperties":false,"required":["allowSubdomains"]}},"required":["label","normalizedLabel","normalizedParentDomainName","preorderSalt","records","subdomainRules"],"additionalProperties":false,"$comment":"In order to register a domain you need to create a preorder. The preorder step is needed to prevent man-in-the-middle attacks. normalizedLabel + '.' + normalizedParentDomain must not be longer than 253 chars length as defined by RFC 1035. Domain documents are immutable: modification and deletion are restricted"},"preorder":{"type":"object","indices":[{"name":"saltedHash","properties":[{"saltedDomainHash":"asc"}],"unique":true}],"properties":{"saltedDomainHash":{"type":"array","byteArray":true,"minItems":32,"maxItems":32,"position":0,"description":"Double sha-256 of the concatenation of a 32 byte random salt and a normalized domain name"}},"required":["saltedDomainHash"],"additionalProperties":false,"$comment":"Preorder documents are immutable: modification and deletion are restricted"}}},"document_type_name":"domain","where_clauses":[],"order_by_clauses":[],"limit":1,"start":null},"response":{"version":{"v0":{"metadata":{"height":"496","core_chain_locked_height":1626,"epoch":20,"time_ms":"1700762179839","protocol_version":1,"chain_id":"dashmate_local_36"},"result":{"proof":{"grovedb_proof":[1,2,189,1,3,32,215,242,197,63,70,169,23,171,110,91,57,162,215,188,38,11,100,146,137,69,55,68,209,224,212,242,106,141,142,255,55,207,0,153,0,150,0,215,242,197,63,70,169,23,171,110,91,57,162,215,188,38,11,100,146,137,69,55,68,209,224,212,242,106,141,142,255,55,207,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,1,0,0,4,100,97,115,104,4,100,97,115,104,1,0,0,224,181,8,197,163,104,37,162,6,105,58,31,65,74,161,62,219,236,244,60,65,227,199,153,234,158,115,123,79,154,162,38,34,0,1,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,1,1,0,1,175,1,4,1,0,0,36,2,1,32,215,242,197,63,70,169,23,171,110,91,57,162,215,188,38,11,100,146,137,69,55,68,209,224,212,242,106,141,142,255,55,207,0,65,245,205,250,165,144,58,205,151,231,250,118,68,196,222,33,122,115,202,113,191,174,43,185,18,208,221,98,69,63,190,117,2,243,227,109,203,174,138,132,44,53,44,18,233,29,115,61,1,50,236,193,96,113,27,57,167,78,14,8,132,33,178,91,59,16,2,115,95,123,161,244,153,57,55,29,209,118,68,122,250,87,10,220,178,23,42,98,149,170,101,107,2,4,123,132,80,134,114,16,1,237,176,56,18,90,131,64,146,62,73,218,37,7,80,230,25,195,214,84,107,116,42,161,213,231,99,49,70,109,122,46,221,17,1,107,4,6,100,111,109,97,105,110,0,31,2,1,27,114,101,99,111,114,100,115,46,100,97,115,104,65,108,105,97,115,73,100,101,110,116,105,116,121,73,100,0,204,190,158,105,75,9,25,208,194,91,83,149,12,201,75,109,144,75,99,66,32,51,85,191,175,76,98,75,52,53,85,240,2,38,158,217,247,245,108,64,252,150,230,243,204,75,109,160,249,36,126,63,182,190,232,139,251,233,178,192,48,6,248,191,249,16,1,83,1,54,223,240,31,55,201,49,39,140,69,210,242,185,108,80,68,28,64,36,152,167,122,5,41,10,68,183,75,86,144,179,204,4,1,1,0,12,2,1,8,112,114,101,111,114,100,101,114,0,84,156,7,216,23,176,127,111,115,1,136,38,75,129,30,33,220,29,7,163,198,67,108,238,35,254,220,182,27,62,14,229,16,1,141,1,1,53,27,87,37,221,226,28,175,201,185,193,171,161,189,79,11,174,89,129,179,222,243,245,228,182,62,69,51,4,147,15,248,2,1,217,109,238,206,206,168,243,192,236,215,159,163,75,111,52,173,240,242,45,193,69,99,247,92,124,165,253,229,130,228,6,16,4,32,230,104,198,89,175,102,174,225,231,44,24,109,222,123,91,126,10,29,113,42,9,196,13,87,33,246,34,191,83,197,49,85,0,5,2,1,1,1,0,33,138,150,165,224,17,145,179,7,120,169,2,43,51,49,142,79,255,67,7,18,161,70,134,2,167,190,106,29,104,149,81,17,1,141,1,1,62,210,128,237,157,173,255,118,46,120,226,35,148,9,65,38,159,144,75,61,235,31,132,201,170,187,200,81,86,89,44,191,4,1,64,0,36,2,1,32,162,161,180,172,111,239,34,234,42,26,104,232,18,54,68,179,87,135,95,107,65,44,24,16,146,129,193,70,231,178,113,188,0,168,99,211,63,81,56,245,72,156,254,93,201,14,131,171,16,91,237,241,30,32,62,67,128,249,8,196,116,111,157,82,212,16,1,151,170,133,85,12,8,231,83,83,8,28,221,26,134,85,126,234,104,22,231,103,54,180,118,34,209,31,166,11,144,174,155,17],"quorum_hash":[34,153,131,64,66,147,240,32,92,27,189,141,240,96,197,152,58,71,115,107,141,84,31,116,141,45,108,40,72,130,129,16],"signature":[174,87,124,110,58,18,45,93,176,103,34,219,129,77,125,251,0,53,179,205,179,163,119,132,75,182,206,115,169,66,222,75,198,129,190,101,113,107,51,62,162,87,240,206,131,7,138,231,23,70,191,154,140,213,120,181,9,103,29,43,59,23,216,243,250,247,119,189,35,250,91,188,166,212,93,12,141,145,56,165,17,132,55,145,100,16,15,244,67,185,168,147,200,242,10,127],"round":0,"block_id_hash":[243,30,197,193,10,25,24,84,159,94,166,75,60,223,157,239,84,145,165,182,253,74,253,86,248,192,23,123,178,91,13,143],"quorum_type":106}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.433230211Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json b/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.433230211Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json deleted file mode 100644 index 51b7e28a49..0000000000 --- a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.433230211Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json +++ /dev/null @@ -1 +0,0 @@ -{"request":{"version":{"v0":{"id":[48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172],"prove":true}}},"response":{"version":{"v0":{"metadata":{"height":"496","core_chain_locked_height":1626,"epoch":20,"time_ms":"1700762179839","protocol_version":1,"chain_id":"dashmate_local_36"},"result":{"proof":{"grovedb_proof":[1,1,198,2,1,191,111,198,73,20,169,78,87,218,51,25,198,58,172,28,1,183,8,209,14,63,217,17,124,131,92,143,52,144,15,78,211,4,1,32,0,36,2,1,32,65,63,57,243,204,9,106,71,187,2,94,221,190,127,141,114,137,209,243,50,60,215,90,101,229,15,115,5,44,117,182,217,0,13,64,223,85,121,82,184,247,105,138,111,225,252,17,37,52,199,109,212,114,11,182,154,158,138,46,128,38,94,56,44,75,16,1,152,212,6,9,60,7,90,253,67,26,190,161,178,33,173,49,219,116,125,214,117,45,147,115,13,155,156,78,63,108,225,152,17,2,204,254,253,193,45,87,201,63,108,140,98,61,225,223,229,34,208,158,221,141,103,228,168,52,16,123,83,68,64,77,155,5,16,1,195,54,53,19,110,80,46,154,197,36,75,21,162,10,117,126,7,89,206,10,144,130,60,211,127,137,63,106,73,85,109,38,4,1,96,0,45,4,1,32,65,63,57,243,204,9,106,71,187,2,94,221,190,127,141,114,137,209,243,50,60,215,90,101,229,15,115,5,44,117,182,217,253,0,252,58,4,253,198,0,0,0,215,47,92,117,235,141,133,44,48,214,12,62,47,215,91,223,175,142,93,105,201,4,90,48,197,143,175,65,178,238,25,177,16,1,3,102,208,132,81,115,249,124,23,227,212,165,35,129,203,40,98,153,173,147,241,172,234,117,80,118,110,48,147,229,217,204,17,17,1,213,1,1,9,167,197,156,150,76,38,98,18,45,25,134,65,26,81,2,72,149,153,251,218,203,242,173,241,123,237,134,82,6,190,146,4,32,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,0,9,2,1,1,2,1,3,0,0,0,171,118,116,140,89,137,208,170,37,136,27,102,222,157,117,207,45,148,61,93,130,167,132,211,240,170,230,21,29,108,130,62,16,1,241,250,101,61,30,82,179,252,126,130,148,173,29,96,30,67,18,189,43,72,252,116,9,131,224,85,218,95,15,54,16,29,17,2,146,193,239,158,94,16,174,90,0,59,138,176,91,102,207,210,103,170,233,107,147,127,32,96,164,144,172,13,95,207,189,178,16,1,40,2,136,3,190,247,219,224,31,248,84,34,220,218,23,168,225,228,134,141,144,132,203,66,28,176,28,148,183,88,245,1,17,1,127,3,1,0,0,11,0,8,0,0,0,0,0,0,0,0,0,4,1,1,0,5,2,1,1,1,0,187,26,123,178,92,236,140,47,217,118,80,42,43,3,193,68,145,37,2,103,11,198,208,127,224,171,198,45,214,95,25,26,16,2,215,214,150,50,43,118,190,187,1,88,134,141,135,77,213,209,41,110,212,148,5,246,114,94,88,218,204,50,211,88,61,48,16,1,70,25,123,162,209,216,154,230,95,14,56,180,32,113,102,210,182,213,32,20,204,112,76,86,112,130,191,29,189,101,249,223,17,2,101,3,1,0,0,45,0,42,0,0,0,0,0,0,0,33,2,96,85,184,126,82,70,165,44,218,228,249,30,215,58,128,247,39,29,20,204,189,174,59,90,252,220,150,204,253,32,73,64,0,0,3,1,1,0,45,0,42,0,1,0,2,0,0,0,33,3,7,21,241,88,44,241,135,226,119,224,56,235,17,233,143,14,28,189,253,211,35,40,147,25,128,209,34,253,208,94,150,219,0,0,16,2,207,1,1,64,73,194,113,147,86,152,163,39,150,106,40,80,207,123,140,201,1,246,45,227,178,215,197,145,40,24,178,120,212,204,100,4,32,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,0,3,3,0,0,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,16,1,3,207,237,208,175,160,108,250,127,37,214,46,113,97,201,53,9,166,164,192,39,188,142,215,119,204,230,134,77,40,94,174,17,2,137,55,32,169,123,196,47,111,55,237,142,237,212,151,35,145,129,149,32,86,123,54,68,188,209,146,213,120,53,25,205,45,16,1,180,58,29,170,183,13,81,20,135,106,232,131,28,200,44,132,42,156,91,80,30,203,234,113,102,241,237,57,22,156,161,36,17],"quorum_hash":[34,153,131,64,66,147,240,32,92,27,189,141,240,96,197,152,58,71,115,107,141,84,31,116,141,45,108,40,72,130,129,16],"signature":[174,87,124,110,58,18,45,93,176,103,34,219,129,77,125,251,0,53,179,205,179,163,119,132,75,182,206,115,169,66,222,75,198,129,190,101,113,107,51,62,162,87,240,206,131,7,138,231,23,70,191,154,140,213,120,181,9,103,29,43,59,23,216,243,250,247,119,189,35,250,91,188,166,212,93,12,141,145,56,165,17,132,55,145,100,16,15,244,67,185,168,147,200,242,10,127],"round":0,"block_id_hash":[243,30,197,193,10,25,24,84,159,94,166,75,60,223,157,239,84,145,165,182,253,74,253,86,248,192,23,123,178,91,13,143],"quorum_type":106}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.444691450Z_DocumentQuery_100720a9c5d8a4f4c5af90b57a848f1e24eeeeb3be5c0022cb5152ede68630e7.json b/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.444691450Z_DocumentQuery_100720a9c5d8a4f4c5af90b57a848f1e24eeeeb3be5c0022cb5152ede68630e7.json deleted file mode 100644 index e4aa49f9bb..0000000000 --- a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.444691450Z_DocumentQuery_100720a9c5d8a4f4c5af90b57a848f1e24eeeeb3be5c0022cb5152ede68630e7.json +++ /dev/null @@ -1 +0,0 @@ -{"request":{"data_contract":{"$format_version":"0","id":"GWRSAVFMjXx8HpQFaNJMqBV7MBgMK4br5UESsB4S31Ec","config":{"$format_version":"0","canBeDeleted":false,"readonly":false,"keepsHistory":false,"documentsKeepHistoryContractDefault":false,"documentsMutableContractDefault":true,"requiresIdentityEncryptionBoundedKey":null,"requiresIdentityDecryptionBoundedKey":null},"version":1,"ownerId":"4EfA9Jrvv3nnCFdSf7fad59851iiTRZ6Wcu6YVJ4iSeF","schemaDefs":null,"documentSchemas":{"domain":{"type":"object","indices":[{"name":"parentNameAndLabel","properties":[{"normalizedParentDomainName":"asc"},{"normalizedLabel":"asc"}],"unique":true},{"name":"dashIdentityId","properties":[{"records.dashUniqueIdentityId":"asc"}],"unique":true},{"name":"dashAlias","properties":[{"records.dashAliasIdentityId":"asc"}]}],"properties":{"label":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9]$","minLength":3,"maxLength":63,"position":0,"description":"Domain label. e.g. 'Bob'."},"normalizedLabel":{"type":"string","pattern":"^[a-hj-km-np-z0-9][a-hj-km-np-z0-9-]{0,61}[a-hj-km-np-z0-9]$","maxLength":63,"position":1,"description":"Domain label converted to lowercase for case-insensitive uniqueness validation. \"o\", \"i\" and \"l\" replaced with \"0\" and \"1\" to mitigate homograph attack. e.g. 'b0b'","$comment":"Must be equal to the label in lowercase. \"o\", \"i\" and \"l\" must be replaced with \"0\" and \"1\"."},"parentDomainName":{"type":"string","pattern":"^$|^[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9]$","minLength":0,"maxLength":63,"position":2,"description":"A full parent domain name. e.g. 'dash'."},"normalizedParentDomainName":{"type":"string","pattern":"^$|^[a-hj-km-np-z0-9][a-hj-km-np-z0-9-\\.]{0,61}[a-hj-km-np-z0-9]$","minLength":0,"maxLength":63,"position":3,"description":"A parent domain name in lowercase for case-insensitive uniqueness validation. \"o\", \"i\" and \"l\" replaced with \"0\" and \"1\" to mitigate homograph attack. e.g. 'dash'","$comment":"Must either be equal to an existing domain or empty to create a top level domain. \"o\", \"i\" and \"l\" must be replaced with \"0\" and \"1\". Only the data contract owner can create top level domains."},"preorderSalt":{"type":"array","byteArray":true,"minItems":32,"maxItems":32,"position":4,"description":"Salt used in the preorder document"},"records":{"type":"object","properties":{"dashUniqueIdentityId":{"type":"array","byteArray":true,"minItems":32,"maxItems":32,"position":0,"contentMediaType":"application/x.dash.dpp.identifier","description":"Identity ID to be used to create the primary name the Identity","$comment":"Must be equal to the document owner"},"dashAliasIdentityId":{"type":"array","byteArray":true,"minItems":32,"maxItems":32,"position":1,"contentMediaType":"application/x.dash.dpp.identifier","description":"Identity ID to be used to create alias names for the Identity","$comment":"Must be equal to the document owner"}},"minProperties":1,"maxProperties":1,"position":5,"additionalProperties":false,"$comment":"Constraint with max and min properties ensure that only one identity record is used - either a `dashUniqueIdentityId` or a `dashAliasIdentityId`"},"subdomainRules":{"type":"object","properties":{"allowSubdomains":{"type":"boolean","description":"This option defines who can create subdomains: true - anyone; false - only the domain owner","$comment":"Only the domain owner is allowed to create subdomains for non top-level domains","position":0}},"position":6,"description":"Subdomain rules allow domain owners to define rules for subdomains","additionalProperties":false,"required":["allowSubdomains"]}},"required":["label","normalizedLabel","normalizedParentDomainName","preorderSalt","records","subdomainRules"],"additionalProperties":false,"$comment":"In order to register a domain you need to create a preorder. The preorder step is needed to prevent man-in-the-middle attacks. normalizedLabel + '.' + normalizedParentDomain must not be longer than 253 chars length as defined by RFC 1035. Domain documents are immutable: modification and deletion are restricted"},"preorder":{"type":"object","indices":[{"name":"saltedHash","properties":[{"saltedDomainHash":"asc"}],"unique":true}],"properties":{"saltedDomainHash":{"type":"array","byteArray":true,"minItems":32,"maxItems":32,"position":0,"description":"Double sha-256 of the concatenation of a 32 byte random salt and a normalized domain name"}},"required":["saltedDomainHash"],"additionalProperties":false,"$comment":"Preorder documents are immutable: modification and deletion are restricted"}}},"document_type_name":"domain","where_clauses":[],"order_by_clauses":[],"limit":0,"start":null},"response":{"version":{"v0":{"metadata":{"height":"496","core_chain_locked_height":1626,"epoch":20,"time_ms":"1700762179839","protocol_version":1,"chain_id":"dashmate_local_36"},"result":{"proof":{"grovedb_proof":[1,2,189,1,3,32,215,242,197,63,70,169,23,171,110,91,57,162,215,188,38,11,100,146,137,69,55,68,209,224,212,242,106,141,142,255,55,207,0,153,0,150,0,215,242,197,63,70,169,23,171,110,91,57,162,215,188,38,11,100,146,137,69,55,68,209,224,212,242,106,141,142,255,55,207,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,1,0,0,4,100,97,115,104,4,100,97,115,104,1,0,0,224,181,8,197,163,104,37,162,6,105,58,31,65,74,161,62,219,236,244,60,65,227,199,153,234,158,115,123,79,154,162,38,34,0,1,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,1,1,0,1,175,1,4,1,0,0,36,2,1,32,215,242,197,63,70,169,23,171,110,91,57,162,215,188,38,11,100,146,137,69,55,68,209,224,212,242,106,141,142,255,55,207,0,65,245,205,250,165,144,58,205,151,231,250,118,68,196,222,33,122,115,202,113,191,174,43,185,18,208,221,98,69,63,190,117,2,243,227,109,203,174,138,132,44,53,44,18,233,29,115,61,1,50,236,193,96,113,27,57,167,78,14,8,132,33,178,91,59,16,2,115,95,123,161,244,153,57,55,29,209,118,68,122,250,87,10,220,178,23,42,98,149,170,101,107,2,4,123,132,80,134,114,16,1,237,176,56,18,90,131,64,146,62,73,218,37,7,80,230,25,195,214,84,107,116,42,161,213,231,99,49,70,109,122,46,221,17,1,107,4,6,100,111,109,97,105,110,0,31,2,1,27,114,101,99,111,114,100,115,46,100,97,115,104,65,108,105,97,115,73,100,101,110,116,105,116,121,73,100,0,204,190,158,105,75,9,25,208,194,91,83,149,12,201,75,109,144,75,99,66,32,51,85,191,175,76,98,75,52,53,85,240,2,38,158,217,247,245,108,64,252,150,230,243,204,75,109,160,249,36,126,63,182,190,232,139,251,233,178,192,48,6,248,191,249,16,1,83,1,54,223,240,31,55,201,49,39,140,69,210,242,185,108,80,68,28,64,36,152,167,122,5,41,10,68,183,75,86,144,179,204,4,1,1,0,12,2,1,8,112,114,101,111,114,100,101,114,0,84,156,7,216,23,176,127,111,115,1,136,38,75,129,30,33,220,29,7,163,198,67,108,238,35,254,220,182,27,62,14,229,16,1,141,1,1,53,27,87,37,221,226,28,175,201,185,193,171,161,189,79,11,174,89,129,179,222,243,245,228,182,62,69,51,4,147,15,248,2,1,217,109,238,206,206,168,243,192,236,215,159,163,75,111,52,173,240,242,45,193,69,99,247,92,124,165,253,229,130,228,6,16,4,32,230,104,198,89,175,102,174,225,231,44,24,109,222,123,91,126,10,29,113,42,9,196,13,87,33,246,34,191,83,197,49,85,0,5,2,1,1,1,0,33,138,150,165,224,17,145,179,7,120,169,2,43,51,49,142,79,255,67,7,18,161,70,134,2,167,190,106,29,104,149,81,17,1,141,1,1,62,210,128,237,157,173,255,118,46,120,226,35,148,9,65,38,159,144,75,61,235,31,132,201,170,187,200,81,86,89,44,191,4,1,64,0,36,2,1,32,162,161,180,172,111,239,34,234,42,26,104,232,18,54,68,179,87,135,95,107,65,44,24,16,146,129,193,70,231,178,113,188,0,168,99,211,63,81,56,245,72,156,254,93,201,14,131,171,16,91,237,241,30,32,62,67,128,249,8,196,116,111,157,82,212,16,1,151,170,133,85,12,8,231,83,83,8,28,221,26,134,85,126,234,104,22,231,103,54,180,118,34,209,31,166,11,144,174,155,17],"quorum_hash":[34,153,131,64,66,147,240,32,92,27,189,141,240,96,197,152,58,71,115,107,141,84,31,116,141,45,108,40,72,130,129,16],"signature":[174,87,124,110,58,18,45,93,176,103,34,219,129,77,125,251,0,53,179,205,179,163,119,132,75,182,206,115,169,66,222,75,198,129,190,101,113,107,51,62,162,87,240,206,131,7,138,231,23,70,191,154,140,213,120,181,9,103,29,43,59,23,216,243,250,247,119,189,35,250,91,188,166,212,93,12,141,145,56,165,17,132,55,145,100,16,15,244,67,185,168,147,200,242,10,127],"round":0,"block_id_hash":[243,30,197,193,10,25,24,84,159,94,166,75,60,223,157,239,84,145,165,182,253,74,253,86,248,192,23,123,178,91,13,143],"quorum_type":106}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.447019688Z_GetIdentityBalanceRequest_e91c9897a9689e1986cf1b9579535bcc0c8b470f5df2c4ba8144fde70867ab69.json b/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.447019688Z_GetIdentityBalanceRequest_e91c9897a9689e1986cf1b9579535bcc0c8b470f5df2c4ba8144fde70867ab69.json deleted file mode 100644 index 649ea19245..0000000000 --- a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.447019688Z_GetIdentityBalanceRequest_e91c9897a9689e1986cf1b9579535bcc0c8b470f5df2c4ba8144fde70867ab69.json +++ /dev/null @@ -1 +0,0 @@ -{"request":{"version":{"v0":{"id":[48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172],"prove":true}}},"response":{"version":{"v0":{"metadata":{"height":"496","core_chain_locked_height":1626,"epoch":20,"time_ms":"1700762179839","protocol_version":1,"chain_id":"dashmate_local_36"},"result":{"proof":{"grovedb_proof":[1,2,207,1,1,64,73,194,113,147,86,152,163,39,150,106,40,80,207,123,140,201,1,246,45,227,178,215,197,145,40,24,178,120,212,204,100,4,32,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,0,3,3,0,0,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,16,1,3,207,237,208,175,160,108,250,127,37,214,46,113,97,201,53,9,166,164,192,39,188,142,215,119,204,230,134,77,40,94,174,17,2,137,55,32,169,123,196,47,111,55,237,142,237,212,151,35,145,129,149,32,86,123,54,68,188,209,146,213,120,53,25,205,45,16,1,180,58,29,170,183,13,81,20,135,106,232,131,28,200,44,132,42,156,91,80,30,203,234,113,102,241,237,57,22,156,161,36,17,1,218,1,1,62,210,128,237,157,173,255,118,46,120,226,35,148,9,65,38,159,144,75,61,235,31,132,201,170,187,200,81,86,89,44,191,2,204,254,253,193,45,87,201,63,108,140,98,61,225,223,229,34,208,158,221,141,103,228,168,52,16,123,83,68,64,77,155,5,16,1,195,54,53,19,110,80,46,154,197,36,75,21,162,10,117,126,7,89,206,10,144,130,60,211,127,137,63,106,73,85,109,38,4,1,96,0,45,4,1,32,65,63,57,243,204,9,106,71,187,2,94,221,190,127,141,114,137,209,243,50,60,215,90,101,229,15,115,5,44,117,182,217,253,0,252,58,4,253,198,0,0,0,215,47,92,117,235,141,133,44,48,214,12,62,47,215,91,223,175,142,93,105,201,4,90,48,197,143,175,65,178,238,25,177,16,1,3,102,208,132,81,115,249,124,23,227,212,165,35,129,203,40,98,153,173,147,241,172,234,117,80,118,110,48,147,229,217,204,17,17],"quorum_hash":[34,153,131,64,66,147,240,32,92,27,189,141,240,96,197,152,58,71,115,107,141,84,31,116,141,45,108,40,72,130,129,16],"signature":[174,87,124,110,58,18,45,93,176,103,34,219,129,77,125,251,0,53,179,205,179,163,119,132,75,182,206,115,169,66,222,75,198,129,190,101,113,107,51,62,162,87,240,206,131,7,138,231,23,70,191,154,140,213,120,181,9,103,29,43,59,23,216,243,250,247,119,189,35,250,91,188,166,212,93,12,141,145,56,165,17,132,55,145,100,16,15,244,67,185,168,147,200,242,10,127],"round":0,"block_id_hash":[243,30,197,193,10,25,24,84,159,94,166,75,60,223,157,239,84,145,165,182,253,74,253,86,248,192,23,123,178,91,13,143],"quorum_type":106}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.453685360Z_GetIdentityBalanceAndRevisionRequest_4809aada385f6c04f595ff8b7ecbe02efc1cc57010e9fc2e46ed6bf8a34d2e1c.json b/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.453685360Z_GetIdentityBalanceAndRevisionRequest_4809aada385f6c04f595ff8b7ecbe02efc1cc57010e9fc2e46ed6bf8a34d2e1c.json deleted file mode 100644 index c5659f6e8f..0000000000 --- a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.453685360Z_GetIdentityBalanceAndRevisionRequest_4809aada385f6c04f595ff8b7ecbe02efc1cc57010e9fc2e46ed6bf8a34d2e1c.json +++ /dev/null @@ -1 +0,0 @@ -{"request":{"version":{"v0":{"id":[48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172],"prove":true}}},"response":{"version":{"v0":{"metadata":{"height":"496","core_chain_locked_height":1626,"epoch":20,"time_ms":"1700762179839","protocol_version":1,"chain_id":"dashmate_local_36"},"result":{"proof":{"grovedb_proof":[1,6,0,1,0,198,2,1,191,111,198,73,20,169,78,87,218,51,25,198,58,172,28,1,183,8,209,14,63,217,17,124,131,92,143,52,144,15,78,211,4,1,32,0,36,2,1,32,65,63,57,243,204,9,106,71,187,2,94,221,190,127,141,114,137,209,243,50,60,215,90,101,229,15,115,5,44,117,182,217,0,13,64,223,85,121,82,184,247,105,138,111,225,252,17,37,52,199,109,212,114,11,182,154,158,138,46,128,38,94,56,44,75,16,1,152,212,6,9,60,7,90,253,67,26,190,161,178,33,173,49,219,116,125,214,117,45,147,115,13,155,156,78,63,108,225,152,17,2,204,254,253,193,45,87,201,63,108,140,98,61,225,223,229,34,208,158,221,141,103,228,168,52,16,123,83,68,64,77,155,5,16,1,195,54,53,19,110,80,46,154,197,36,75,21,162,10,117,126,7,89,206,10,144,130,60,211,127,137,63,106,73,85,109,38,4,1,96,0,45,4,1,32,65,63,57,243,204,9,106,71,187,2,94,221,190,127,141,114,137,209,243,50,60,215,90,101,229,15,115,5,44,117,182,217,253,0,252,58,4,253,198,0,0,0,215,47,92,117,235,141,133,44,48,214,12,62,47,215,91,223,175,142,93,105,201,4,90,48,197,143,175,65,178,238,25,177,16,1,3,102,208,132,81,115,249,124,23,227,212,165,35,129,203,40,98,153,173,147,241,172,234,117,80,118,110,48,147,229,217,204,17,17,1,1,32,213,1,1,9,167,197,156,150,76,38,98,18,45,25,134,65,26,81,2,72,149,153,251,218,203,242,173,241,123,237,134,82,6,190,146,4,32,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,0,9,2,1,1,2,1,3,0,0,0,171,118,116,140,89,137,208,170,37,136,27,102,222,157,117,207,45,148,61,93,130,167,132,211,240,170,230,21,29,108,130,62,16,1,241,250,101,61,30,82,179,252,126,130,148,173,29,96,30,67,18,189,43,72,252,116,9,131,224,85,218,95,15,54,16,29,17,2,146,193,239,158,94,16,174,90,0,59,138,176,91,102,207,210,103,170,233,107,147,127,32,96,164,144,172,13,95,207,189,178,16,1,40,2,136,3,190,247,219,224,31,248,84,34,220,218,23,168,225,228,134,141,144,132,203,66,28,176,28,148,183,88,245,1,17,2,32,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,118,3,1,0,0,11,0,8,0,0,0,0,0,0,0,0,0,2,254,68,167,129,67,249,107,15,40,221,224,9,139,28,106,17,132,200,185,66,56,75,108,204,214,114,83,149,194,184,60,145,16,2,215,214,150,50,43,118,190,187,1,88,134,141,135,77,213,209,41,110,212,148,5,246,114,94,88,218,204,50,211,88,61,48,16,1,70,25,123,162,209,216,154,230,95,14,56,180,32,113,102,210,182,213,32,20,204,112,76,86,112,130,191,29,189,101,249,223,17,2,1,96,207,1,1,64,73,194,113,147,86,152,163,39,150,106,40,80,207,123,140,201,1,246,45,227,178,215,197,145,40,24,178,120,212,204,100,4,32,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,0,3,3,0,0,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,16,1,3,207,237,208,175,160,108,250,127,37,214,46,113,97,201,53,9,166,164,192,39,188,142,215,119,204,230,134,77,40,94,174,17,2,137,55,32,169,123,196,47,111,55,237,142,237,212,151,35,145,129,149,32,86,123,54,68,188,209,146,213,120,53,25,205,45,16,1,180,58,29,170,183,13,81,20,135,106,232,131,28,200,44,132,42,156,91,80,30,203,234,113,102,241,237,57,22,156,161,36,17],"quorum_hash":[34,153,131,64,66,147,240,32,92,27,189,141,240,96,197,152,58,71,115,107,141,84,31,116,141,45,108,40,72,130,129,16],"signature":[174,87,124,110,58,18,45,93,176,103,34,219,129,77,125,251,0,53,179,205,179,163,119,132,75,182,206,115,169,66,222,75,198,129,190,101,113,107,51,62,162,87,240,206,131,7,138,231,23,70,191,154,140,213,120,181,9,103,29,43,59,23,216,243,250,247,119,189,35,250,91,188,166,212,93,12,141,145,56,165,17,132,55,145,100,16,15,244,67,185,168,147,200,242,10,127],"round":0,"block_id_hash":[243,30,197,193,10,25,24,84,159,94,166,75,60,223,157,239,84,145,165,182,253,74,253,86,248,192,23,123,178,91,13,143],"quorum_type":106}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.453726197Z_GetIdentityKeysRequest_105e9b32f84ce4eadea49154f2f433e48d1ccf07e8797bcf89ff8d3941ba3919.json b/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.453726197Z_GetIdentityKeysRequest_105e9b32f84ce4eadea49154f2f433e48d1ccf07e8797bcf89ff8d3941ba3919.json deleted file mode 100644 index 0e7e474ed2..0000000000 --- a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.453726197Z_GetIdentityKeysRequest_105e9b32f84ce4eadea49154f2f433e48d1ccf07e8797bcf89ff8d3941ba3919.json +++ /dev/null @@ -1 +0,0 @@ -{"request":{"version":{"v0":{"identity_id":[48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172],"request_type":{"request":{"all_keys":{}}},"limit":null,"offset":null,"prove":true}}},"response":{"version":{"v0":{"metadata":{"height":"496","core_chain_locked_height":1626,"epoch":20,"time_ms":"1700762179839","protocol_version":1,"chain_id":"dashmate_local_36"},"result":{"proof":{"grovedb_proof":[1,2,101,3,1,0,0,45,0,42,0,0,0,0,0,0,0,33,2,96,85,184,126,82,70,165,44,218,228,249,30,215,58,128,247,39,29,20,204,189,174,59,90,252,220,150,204,253,32,73,64,0,0,3,1,1,0,45,0,42,0,1,0,2,0,0,0,33,3,7,21,241,88,44,241,135,226,119,224,56,235,17,233,143,14,28,189,253,211,35,40,147,25,128,209,34,253,208,94,150,219,0,0,16,1,144,1,1,200,20,167,68,4,93,76,240,184,143,173,215,241,79,248,164,80,174,61,145,241,155,104,236,61,45,248,44,128,202,230,8,4,1,1,0,5,2,1,1,1,0,187,26,123,178,92,236,140,47,217,118,80,42,43,3,193,68,145,37,2,103,11,198,208,127,224,171,198,45,214,95,25,26,16,2,215,214,150,50,43,118,190,187,1,88,134,141,135,77,213,209,41,110,212,148,5,246,114,94,88,218,204,50,211,88,61,48,16,1,70,25,123,162,209,216,154,230,95,14,56,180,32,113,102,210,182,213,32,20,204,112,76,86,112,130,191,29,189,101,249,223,17,1,213,1,1,9,167,197,156,150,76,38,98,18,45,25,134,65,26,81,2,72,149,153,251,218,203,242,173,241,123,237,134,82,6,190,146,4,32,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,0,9,2,1,1,2,1,3,0,0,0,171,118,116,140,89,137,208,170,37,136,27,102,222,157,117,207,45,148,61,93,130,167,132,211,240,170,230,21,29,108,130,62,16,1,241,250,101,61,30,82,179,252,126,130,148,173,29,96,30,67,18,189,43,72,252,116,9,131,224,85,218,95,15,54,16,29,17,2,146,193,239,158,94,16,174,90,0,59,138,176,91,102,207,210,103,170,233,107,147,127,32,96,164,144,172,13,95,207,189,178,16,1,40,2,136,3,190,247,219,224,31,248,84,34,220,218,23,168,225,228,134,141,144,132,203,66,28,176,28,148,183,88,245,1,17,1,209,1,1,191,111,198,73,20,169,78,87,218,51,25,198,58,172,28,1,183,8,209,14,63,217,17,124,131,92,143,52,144,15,78,211,4,1,32,0,36,2,1,32,65,63,57,243,204,9,106,71,187,2,94,221,190,127,141,114,137,209,243,50,60,215,90,101,229,15,115,5,44,117,182,217,0,13,64,223,85,121,82,184,247,105,138,111,225,252,17,37,52,199,109,212,114,11,182,154,158,138,46,128,38,94,56,44,75,16,1,152,212,6,9,60,7,90,253,67,26,190,161,178,33,173,49,219,116,125,214,117,45,147,115,13,155,156,78,63,108,225,152,17,2,204,254,253,193,45,87,201,63,108,140,98,61,225,223,229,34,208,158,221,141,103,228,168,52,16,123,83,68,64,77,155,5,16,1,151,170,133,85,12,8,231,83,83,8,28,221,26,134,85,126,234,104,22,231,103,54,180,118,34,209,31,166,11,144,174,155,17],"quorum_hash":[34,153,131,64,66,147,240,32,92,27,189,141,240,96,197,152,58,71,115,107,141,84,31,116,141,45,108,40,72,130,129,16],"signature":[174,87,124,110,58,18,45,93,176,103,34,219,129,77,125,251,0,53,179,205,179,163,119,132,75,182,206,115,169,66,222,75,198,129,190,101,113,107,51,62,162,87,240,206,131,7,138,231,23,70,191,154,140,213,120,181,9,103,29,43,59,23,216,243,250,247,119,189,35,250,91,188,166,212,93,12,141,145,56,165,17,132,55,145,100,16,15,244,67,185,168,147,200,242,10,127],"round":0,"block_id_hash":[243,30,197,193,10,25,24,84,159,94,166,75,60,223,157,239,84,145,165,182,253,74,253,86,248,192,23,123,178,91,13,143],"quorum_type":106}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.453938207Z_DocumentQuery_100720a9c5d8a4f4c5af90b57a848f1e24eeeeb3be5c0022cb5152ede68630e7.json b/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.453938207Z_DocumentQuery_100720a9c5d8a4f4c5af90b57a848f1e24eeeeb3be5c0022cb5152ede68630e7.json deleted file mode 100644 index e4aa49f9bb..0000000000 --- a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.453938207Z_DocumentQuery_100720a9c5d8a4f4c5af90b57a848f1e24eeeeb3be5c0022cb5152ede68630e7.json +++ /dev/null @@ -1 +0,0 @@ -{"request":{"data_contract":{"$format_version":"0","id":"GWRSAVFMjXx8HpQFaNJMqBV7MBgMK4br5UESsB4S31Ec","config":{"$format_version":"0","canBeDeleted":false,"readonly":false,"keepsHistory":false,"documentsKeepHistoryContractDefault":false,"documentsMutableContractDefault":true,"requiresIdentityEncryptionBoundedKey":null,"requiresIdentityDecryptionBoundedKey":null},"version":1,"ownerId":"4EfA9Jrvv3nnCFdSf7fad59851iiTRZ6Wcu6YVJ4iSeF","schemaDefs":null,"documentSchemas":{"domain":{"type":"object","indices":[{"name":"parentNameAndLabel","properties":[{"normalizedParentDomainName":"asc"},{"normalizedLabel":"asc"}],"unique":true},{"name":"dashIdentityId","properties":[{"records.dashUniqueIdentityId":"asc"}],"unique":true},{"name":"dashAlias","properties":[{"records.dashAliasIdentityId":"asc"}]}],"properties":{"label":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9]$","minLength":3,"maxLength":63,"position":0,"description":"Domain label. e.g. 'Bob'."},"normalizedLabel":{"type":"string","pattern":"^[a-hj-km-np-z0-9][a-hj-km-np-z0-9-]{0,61}[a-hj-km-np-z0-9]$","maxLength":63,"position":1,"description":"Domain label converted to lowercase for case-insensitive uniqueness validation. \"o\", \"i\" and \"l\" replaced with \"0\" and \"1\" to mitigate homograph attack. e.g. 'b0b'","$comment":"Must be equal to the label in lowercase. \"o\", \"i\" and \"l\" must be replaced with \"0\" and \"1\"."},"parentDomainName":{"type":"string","pattern":"^$|^[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9]$","minLength":0,"maxLength":63,"position":2,"description":"A full parent domain name. e.g. 'dash'."},"normalizedParentDomainName":{"type":"string","pattern":"^$|^[a-hj-km-np-z0-9][a-hj-km-np-z0-9-\\.]{0,61}[a-hj-km-np-z0-9]$","minLength":0,"maxLength":63,"position":3,"description":"A parent domain name in lowercase for case-insensitive uniqueness validation. \"o\", \"i\" and \"l\" replaced with \"0\" and \"1\" to mitigate homograph attack. e.g. 'dash'","$comment":"Must either be equal to an existing domain or empty to create a top level domain. \"o\", \"i\" and \"l\" must be replaced with \"0\" and \"1\". Only the data contract owner can create top level domains."},"preorderSalt":{"type":"array","byteArray":true,"minItems":32,"maxItems":32,"position":4,"description":"Salt used in the preorder document"},"records":{"type":"object","properties":{"dashUniqueIdentityId":{"type":"array","byteArray":true,"minItems":32,"maxItems":32,"position":0,"contentMediaType":"application/x.dash.dpp.identifier","description":"Identity ID to be used to create the primary name the Identity","$comment":"Must be equal to the document owner"},"dashAliasIdentityId":{"type":"array","byteArray":true,"minItems":32,"maxItems":32,"position":1,"contentMediaType":"application/x.dash.dpp.identifier","description":"Identity ID to be used to create alias names for the Identity","$comment":"Must be equal to the document owner"}},"minProperties":1,"maxProperties":1,"position":5,"additionalProperties":false,"$comment":"Constraint with max and min properties ensure that only one identity record is used - either a `dashUniqueIdentityId` or a `dashAliasIdentityId`"},"subdomainRules":{"type":"object","properties":{"allowSubdomains":{"type":"boolean","description":"This option defines who can create subdomains: true - anyone; false - only the domain owner","$comment":"Only the domain owner is allowed to create subdomains for non top-level domains","position":0}},"position":6,"description":"Subdomain rules allow domain owners to define rules for subdomains","additionalProperties":false,"required":["allowSubdomains"]}},"required":["label","normalizedLabel","normalizedParentDomainName","preorderSalt","records","subdomainRules"],"additionalProperties":false,"$comment":"In order to register a domain you need to create a preorder. The preorder step is needed to prevent man-in-the-middle attacks. normalizedLabel + '.' + normalizedParentDomain must not be longer than 253 chars length as defined by RFC 1035. Domain documents are immutable: modification and deletion are restricted"},"preorder":{"type":"object","indices":[{"name":"saltedHash","properties":[{"saltedDomainHash":"asc"}],"unique":true}],"properties":{"saltedDomainHash":{"type":"array","byteArray":true,"minItems":32,"maxItems":32,"position":0,"description":"Double sha-256 of the concatenation of a 32 byte random salt and a normalized domain name"}},"required":["saltedDomainHash"],"additionalProperties":false,"$comment":"Preorder documents are immutable: modification and deletion are restricted"}}},"document_type_name":"domain","where_clauses":[],"order_by_clauses":[],"limit":0,"start":null},"response":{"version":{"v0":{"metadata":{"height":"496","core_chain_locked_height":1626,"epoch":20,"time_ms":"1700762179839","protocol_version":1,"chain_id":"dashmate_local_36"},"result":{"proof":{"grovedb_proof":[1,2,189,1,3,32,215,242,197,63,70,169,23,171,110,91,57,162,215,188,38,11,100,146,137,69,55,68,209,224,212,242,106,141,142,255,55,207,0,153,0,150,0,215,242,197,63,70,169,23,171,110,91,57,162,215,188,38,11,100,146,137,69,55,68,209,224,212,242,106,141,142,255,55,207,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,1,0,0,4,100,97,115,104,4,100,97,115,104,1,0,0,224,181,8,197,163,104,37,162,6,105,58,31,65,74,161,62,219,236,244,60,65,227,199,153,234,158,115,123,79,154,162,38,34,0,1,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,1,1,0,1,175,1,4,1,0,0,36,2,1,32,215,242,197,63,70,169,23,171,110,91,57,162,215,188,38,11,100,146,137,69,55,68,209,224,212,242,106,141,142,255,55,207,0,65,245,205,250,165,144,58,205,151,231,250,118,68,196,222,33,122,115,202,113,191,174,43,185,18,208,221,98,69,63,190,117,2,243,227,109,203,174,138,132,44,53,44,18,233,29,115,61,1,50,236,193,96,113,27,57,167,78,14,8,132,33,178,91,59,16,2,115,95,123,161,244,153,57,55,29,209,118,68,122,250,87,10,220,178,23,42,98,149,170,101,107,2,4,123,132,80,134,114,16,1,237,176,56,18,90,131,64,146,62,73,218,37,7,80,230,25,195,214,84,107,116,42,161,213,231,99,49,70,109,122,46,221,17,1,107,4,6,100,111,109,97,105,110,0,31,2,1,27,114,101,99,111,114,100,115,46,100,97,115,104,65,108,105,97,115,73,100,101,110,116,105,116,121,73,100,0,204,190,158,105,75,9,25,208,194,91,83,149,12,201,75,109,144,75,99,66,32,51,85,191,175,76,98,75,52,53,85,240,2,38,158,217,247,245,108,64,252,150,230,243,204,75,109,160,249,36,126,63,182,190,232,139,251,233,178,192,48,6,248,191,249,16,1,83,1,54,223,240,31,55,201,49,39,140,69,210,242,185,108,80,68,28,64,36,152,167,122,5,41,10,68,183,75,86,144,179,204,4,1,1,0,12,2,1,8,112,114,101,111,114,100,101,114,0,84,156,7,216,23,176,127,111,115,1,136,38,75,129,30,33,220,29,7,163,198,67,108,238,35,254,220,182,27,62,14,229,16,1,141,1,1,53,27,87,37,221,226,28,175,201,185,193,171,161,189,79,11,174,89,129,179,222,243,245,228,182,62,69,51,4,147,15,248,2,1,217,109,238,206,206,168,243,192,236,215,159,163,75,111,52,173,240,242,45,193,69,99,247,92,124,165,253,229,130,228,6,16,4,32,230,104,198,89,175,102,174,225,231,44,24,109,222,123,91,126,10,29,113,42,9,196,13,87,33,246,34,191,83,197,49,85,0,5,2,1,1,1,0,33,138,150,165,224,17,145,179,7,120,169,2,43,51,49,142,79,255,67,7,18,161,70,134,2,167,190,106,29,104,149,81,17,1,141,1,1,62,210,128,237,157,173,255,118,46,120,226,35,148,9,65,38,159,144,75,61,235,31,132,201,170,187,200,81,86,89,44,191,4,1,64,0,36,2,1,32,162,161,180,172,111,239,34,234,42,26,104,232,18,54,68,179,87,135,95,107,65,44,24,16,146,129,193,70,231,178,113,188,0,168,99,211,63,81,56,245,72,156,254,93,201,14,131,171,16,91,237,241,30,32,62,67,128,249,8,196,116,111,157,82,212,16,1,151,170,133,85,12,8,231,83,83,8,28,221,26,134,85,126,234,104,22,231,103,54,180,118,34,209,31,166,11,144,174,155,17],"quorum_hash":[34,153,131,64,66,147,240,32,92,27,189,141,240,96,197,152,58,71,115,107,141,84,31,116,141,45,108,40,72,130,129,16],"signature":[174,87,124,110,58,18,45,93,176,103,34,219,129,77,125,251,0,53,179,205,179,163,119,132,75,182,206,115,169,66,222,75,198,129,190,101,113,107,51,62,162,87,240,206,131,7,138,231,23,70,191,154,140,213,120,181,9,103,29,43,59,23,216,243,250,247,119,189,35,250,91,188,166,212,93,12,141,145,56,165,17,132,55,145,100,16,15,244,67,185,168,147,200,242,10,127],"round":0,"block_id_hash":[243,30,197,193,10,25,24,84,159,94,166,75,60,223,157,239,84,145,165,182,253,74,253,86,248,192,23,123,178,91,13,143],"quorum_type":106}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.454423973Z_IdentityRequest_fa68a24d7c0ef611bc762c3703122903565f51d88dd92e4c366ab2d2a5f49b5a.json b/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.454423973Z_IdentityRequest_fa68a24d7c0ef611bc762c3703122903565f51d88dd92e4c366ab2d2a5f49b5a.json deleted file mode 100644 index d334bff94b..0000000000 --- a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.454423973Z_IdentityRequest_fa68a24d7c0ef611bc762c3703122903565f51d88dd92e4c366ab2d2a5f49b5a.json +++ /dev/null @@ -1 +0,0 @@ -{"request":{"GetIdentity":{"version":{"v0":{"id":[48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172],"prove":true}}}},"response":{"GetIdentity":{"version":{"v0":{"metadata":{"height":"496","core_chain_locked_height":1626,"epoch":20,"time_ms":"1700762179839","protocol_version":1,"chain_id":"dashmate_local_36"},"result":{"proof":{"grovedb_proof":[1,1,198,2,1,191,111,198,73,20,169,78,87,218,51,25,198,58,172,28,1,183,8,209,14,63,217,17,124,131,92,143,52,144,15,78,211,4,1,32,0,36,2,1,32,65,63,57,243,204,9,106,71,187,2,94,221,190,127,141,114,137,209,243,50,60,215,90,101,229,15,115,5,44,117,182,217,0,13,64,223,85,121,82,184,247,105,138,111,225,252,17,37,52,199,109,212,114,11,182,154,158,138,46,128,38,94,56,44,75,16,1,152,212,6,9,60,7,90,253,67,26,190,161,178,33,173,49,219,116,125,214,117,45,147,115,13,155,156,78,63,108,225,152,17,2,204,254,253,193,45,87,201,63,108,140,98,61,225,223,229,34,208,158,221,141,103,228,168,52,16,123,83,68,64,77,155,5,16,1,195,54,53,19,110,80,46,154,197,36,75,21,162,10,117,126,7,89,206,10,144,130,60,211,127,137,63,106,73,85,109,38,4,1,96,0,45,4,1,32,65,63,57,243,204,9,106,71,187,2,94,221,190,127,141,114,137,209,243,50,60,215,90,101,229,15,115,5,44,117,182,217,253,0,252,58,4,253,198,0,0,0,215,47,92,117,235,141,133,44,48,214,12,62,47,215,91,223,175,142,93,105,201,4,90,48,197,143,175,65,178,238,25,177,16,1,3,102,208,132,81,115,249,124,23,227,212,165,35,129,203,40,98,153,173,147,241,172,234,117,80,118,110,48,147,229,217,204,17,17,1,213,1,1,9,167,197,156,150,76,38,98,18,45,25,134,65,26,81,2,72,149,153,251,218,203,242,173,241,123,237,134,82,6,190,146,4,32,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,0,9,2,1,1,2,1,3,0,0,0,171,118,116,140,89,137,208,170,37,136,27,102,222,157,117,207,45,148,61,93,130,167,132,211,240,170,230,21,29,108,130,62,16,1,241,250,101,61,30,82,179,252,126,130,148,173,29,96,30,67,18,189,43,72,252,116,9,131,224,85,218,95,15,54,16,29,17,2,146,193,239,158,94,16,174,90,0,59,138,176,91,102,207,210,103,170,233,107,147,127,32,96,164,144,172,13,95,207,189,178,16,1,40,2,136,3,190,247,219,224,31,248,84,34,220,218,23,168,225,228,134,141,144,132,203,66,28,176,28,148,183,88,245,1,17,1,127,3,1,0,0,11,0,8,0,0,0,0,0,0,0,0,0,4,1,1,0,5,2,1,1,1,0,187,26,123,178,92,236,140,47,217,118,80,42,43,3,193,68,145,37,2,103,11,198,208,127,224,171,198,45,214,95,25,26,16,2,215,214,150,50,43,118,190,187,1,88,134,141,135,77,213,209,41,110,212,148,5,246,114,94,88,218,204,50,211,88,61,48,16,1,70,25,123,162,209,216,154,230,95,14,56,180,32,113,102,210,182,213,32,20,204,112,76,86,112,130,191,29,189,101,249,223,17,2,101,3,1,0,0,45,0,42,0,0,0,0,0,0,0,33,2,96,85,184,126,82,70,165,44,218,228,249,30,215,58,128,247,39,29,20,204,189,174,59,90,252,220,150,204,253,32,73,64,0,0,3,1,1,0,45,0,42,0,1,0,2,0,0,0,33,3,7,21,241,88,44,241,135,226,119,224,56,235,17,233,143,14,28,189,253,211,35,40,147,25,128,209,34,253,208,94,150,219,0,0,16,2,207,1,1,64,73,194,113,147,86,152,163,39,150,106,40,80,207,123,140,201,1,246,45,227,178,215,197,145,40,24,178,120,212,204,100,4,32,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,0,3,3,0,0,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,16,1,3,207,237,208,175,160,108,250,127,37,214,46,113,97,201,53,9,166,164,192,39,188,142,215,119,204,230,134,77,40,94,174,17,2,137,55,32,169,123,196,47,111,55,237,142,237,212,151,35,145,129,149,32,86,123,54,68,188,209,146,213,120,53,25,205,45,16,1,180,58,29,170,183,13,81,20,135,106,232,131,28,200,44,132,42,156,91,80,30,203,234,113,102,241,237,57,22,156,161,36,17],"quorum_hash":[34,153,131,64,66,147,240,32,92,27,189,141,240,96,197,152,58,71,115,107,141,84,31,116,141,45,108,40,72,130,129,16],"signature":[174,87,124,110,58,18,45,93,176,103,34,219,129,77,125,251,0,53,179,205,179,163,119,132,75,182,206,115,169,66,222,75,198,129,190,101,113,107,51,62,162,87,240,206,131,7,138,231,23,70,191,154,140,213,120,181,9,103,29,43,59,23,216,243,250,247,119,189,35,250,91,188,166,212,93,12,141,145,56,165,17,132,55,145,100,16,15,244,67,185,168,147,200,242,10,127],"round":0,"block_id_hash":[243,30,197,193,10,25,24,84,159,94,166,75,60,223,157,239,84,145,165,182,253,74,253,86,248,192,23,123,178,91,13,143],"quorum_type":106}}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.467303996Z_IdentityRequest_fa68a24d7c0ef611bc762c3703122903565f51d88dd92e4c366ab2d2a5f49b5a.json b/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.467303996Z_IdentityRequest_fa68a24d7c0ef611bc762c3703122903565f51d88dd92e4c366ab2d2a5f49b5a.json deleted file mode 100644 index d334bff94b..0000000000 --- a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.467303996Z_IdentityRequest_fa68a24d7c0ef611bc762c3703122903565f51d88dd92e4c366ab2d2a5f49b5a.json +++ /dev/null @@ -1 +0,0 @@ -{"request":{"GetIdentity":{"version":{"v0":{"id":[48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172],"prove":true}}}},"response":{"GetIdentity":{"version":{"v0":{"metadata":{"height":"496","core_chain_locked_height":1626,"epoch":20,"time_ms":"1700762179839","protocol_version":1,"chain_id":"dashmate_local_36"},"result":{"proof":{"grovedb_proof":[1,1,198,2,1,191,111,198,73,20,169,78,87,218,51,25,198,58,172,28,1,183,8,209,14,63,217,17,124,131,92,143,52,144,15,78,211,4,1,32,0,36,2,1,32,65,63,57,243,204,9,106,71,187,2,94,221,190,127,141,114,137,209,243,50,60,215,90,101,229,15,115,5,44,117,182,217,0,13,64,223,85,121,82,184,247,105,138,111,225,252,17,37,52,199,109,212,114,11,182,154,158,138,46,128,38,94,56,44,75,16,1,152,212,6,9,60,7,90,253,67,26,190,161,178,33,173,49,219,116,125,214,117,45,147,115,13,155,156,78,63,108,225,152,17,2,204,254,253,193,45,87,201,63,108,140,98,61,225,223,229,34,208,158,221,141,103,228,168,52,16,123,83,68,64,77,155,5,16,1,195,54,53,19,110,80,46,154,197,36,75,21,162,10,117,126,7,89,206,10,144,130,60,211,127,137,63,106,73,85,109,38,4,1,96,0,45,4,1,32,65,63,57,243,204,9,106,71,187,2,94,221,190,127,141,114,137,209,243,50,60,215,90,101,229,15,115,5,44,117,182,217,253,0,252,58,4,253,198,0,0,0,215,47,92,117,235,141,133,44,48,214,12,62,47,215,91,223,175,142,93,105,201,4,90,48,197,143,175,65,178,238,25,177,16,1,3,102,208,132,81,115,249,124,23,227,212,165,35,129,203,40,98,153,173,147,241,172,234,117,80,118,110,48,147,229,217,204,17,17,1,213,1,1,9,167,197,156,150,76,38,98,18,45,25,134,65,26,81,2,72,149,153,251,218,203,242,173,241,123,237,134,82,6,190,146,4,32,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,0,9,2,1,1,2,1,3,0,0,0,171,118,116,140,89,137,208,170,37,136,27,102,222,157,117,207,45,148,61,93,130,167,132,211,240,170,230,21,29,108,130,62,16,1,241,250,101,61,30,82,179,252,126,130,148,173,29,96,30,67,18,189,43,72,252,116,9,131,224,85,218,95,15,54,16,29,17,2,146,193,239,158,94,16,174,90,0,59,138,176,91,102,207,210,103,170,233,107,147,127,32,96,164,144,172,13,95,207,189,178,16,1,40,2,136,3,190,247,219,224,31,248,84,34,220,218,23,168,225,228,134,141,144,132,203,66,28,176,28,148,183,88,245,1,17,1,127,3,1,0,0,11,0,8,0,0,0,0,0,0,0,0,0,4,1,1,0,5,2,1,1,1,0,187,26,123,178,92,236,140,47,217,118,80,42,43,3,193,68,145,37,2,103,11,198,208,127,224,171,198,45,214,95,25,26,16,2,215,214,150,50,43,118,190,187,1,88,134,141,135,77,213,209,41,110,212,148,5,246,114,94,88,218,204,50,211,88,61,48,16,1,70,25,123,162,209,216,154,230,95,14,56,180,32,113,102,210,182,213,32,20,204,112,76,86,112,130,191,29,189,101,249,223,17,2,101,3,1,0,0,45,0,42,0,0,0,0,0,0,0,33,2,96,85,184,126,82,70,165,44,218,228,249,30,215,58,128,247,39,29,20,204,189,174,59,90,252,220,150,204,253,32,73,64,0,0,3,1,1,0,45,0,42,0,1,0,2,0,0,0,33,3,7,21,241,88,44,241,135,226,119,224,56,235,17,233,143,14,28,189,253,211,35,40,147,25,128,209,34,253,208,94,150,219,0,0,16,2,207,1,1,64,73,194,113,147,86,152,163,39,150,106,40,80,207,123,140,201,1,246,45,227,178,215,197,145,40,24,178,120,212,204,100,4,32,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,0,3,3,0,0,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,16,1,3,207,237,208,175,160,108,250,127,37,214,46,113,97,201,53,9,166,164,192,39,188,142,215,119,204,230,134,77,40,94,174,17,2,137,55,32,169,123,196,47,111,55,237,142,237,212,151,35,145,129,149,32,86,123,54,68,188,209,146,213,120,53,25,205,45,16,1,180,58,29,170,183,13,81,20,135,106,232,131,28,200,44,132,42,156,91,80,30,203,234,113,102,241,237,57,22,156,161,36,17],"quorum_hash":[34,153,131,64,66,147,240,32,92,27,189,141,240,96,197,152,58,71,115,107,141,84,31,116,141,45,108,40,72,130,129,16],"signature":[174,87,124,110,58,18,45,93,176,103,34,219,129,77,125,251,0,53,179,205,179,163,119,132,75,182,206,115,169,66,222,75,198,129,190,101,113,107,51,62,162,87,240,206,131,7,138,231,23,70,191,154,140,213,120,181,9,103,29,43,59,23,216,243,250,247,119,189,35,250,91,188,166,212,93,12,141,145,56,165,17,132,55,145,100,16,15,244,67,185,168,147,200,242,10,127],"round":0,"block_id_hash":[243,30,197,193,10,25,24,84,159,94,166,75,60,223,157,239,84,145,165,182,253,74,253,86,248,192,23,123,178,91,13,143],"quorum_type":106}}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.467325937Z_GetEpochsInfoRequest_9bbde71623deeaa5c2fc1650705cce3ad227e8411eab4d6f28d6250f4996dc21.json b/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.467325937Z_GetEpochsInfoRequest_9bbde71623deeaa5c2fc1650705cce3ad227e8411eab4d6f28d6250f4996dc21.json deleted file mode 100644 index 48db134dcd..0000000000 --- a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.467325937Z_GetEpochsInfoRequest_9bbde71623deeaa5c2fc1650705cce3ad227e8411eab4d6f28d6250f4996dc21.json +++ /dev/null @@ -1 +0,0 @@ -{"request":{"version":{"v0":{"start_epoch":30,"count":100,"ascending":true,"prove":true}}},"response":{"version":{"v0":{"metadata":{"height":"496","core_chain_locked_height":1626,"epoch":20,"time_ms":"1700762179839","protocol_version":1,"chain_id":"dashmate_local_36"},"result":{"proof":{"grovedb_proof":[1,1,190,190,5,1,83,130,202,92,2,193,2,25,2,95,255,51,170,79,44,231,110,158,154,75,226,88,157,4,91,99,78,173,130,128,127,142,2,100,123,12,124,246,245,215,211,9,20,208,5,145,179,6,159,212,55,244,219,114,242,103,240,89,252,195,139,154,208,238,240,16,1,146,166,244,171,136,19,40,6,25,70,65,25,22,225,3,159,45,138,229,81,71,190,221,24,144,108,225,220,151,223,3,229,2,214,133,214,97,203,126,194,30,3,243,48,119,63,4,90,202,246,179,75,59,177,118,242,68,119,141,22,175,221,127,238,223,16,1,113,7,212,117,2,228,217,183,56,43,184,204,159,148,171,28,213,227,252,69,93,204,164,2,164,53,166,77,19,203,49,4,2,165,73,179,61,173,25,180,248,234,23,228,174,104,21,43,218,187,221,182,197,66,172,201,71,113,88,1,82,252,188,168,195,16,1,218,168,38,111,174,52,234,213,16,164,230,91,90,145,130,148,61,111,125,32,229,13,140,108,49,198,198,91,207,160,217,173,2,125,82,1,81,76,177,32,247,193,156,11,109,54,224,205,110,148,108,249,200,155,70,92,47,22,252,62,177,193,139,70,232,16,4,2,1,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,1,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,1,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,1,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,1,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,1,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,1,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,1,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,4,2,1,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,2,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,2,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,2,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,2,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,2,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,2,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,2,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,17,4,2,2,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,3,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,3,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,3,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,3,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,3,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,3,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,3,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,4,2,3,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,4,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,4,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,4,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,4,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,4,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,4,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,4,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,17,17,4,2,4,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,5,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,5,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,5,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,5,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,5,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,5,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,5,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,4,2,5,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,6,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,6,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,6,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,6,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,6,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,6,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,6,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,17,4,2,6,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,6,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,7,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,7,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,7,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,7,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,7,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,7,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,4,2,7,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,7,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,8,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,8,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,8,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,8,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,8,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,8,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,208,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,209,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,17,17,4,2,8,210,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,211,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,4,2,8,212,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,213,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,4,2,8,214,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,215,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,4,2,8,216,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,217,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,4,2,8,218,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,219,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,4,2,8,220,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,221,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,17,4,2,8,222,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,223,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,4,2,8,224,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,225,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,4,2,8,226,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,227,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,4,2,8,228,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,17,4,1,112,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,1,115,0,3,3,0,0,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,3,1,117,0,5,0,2,0,20,0,16,17,17,17,17,17,17,17,17,17,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,1,180,1,1,191,111,198,73,20,169,78,87,218,51,25,198,58,172,28,1,183,8,209,14,63,217,17,124,131,92,143,52,144,15,78,211,2,238,81,197,66,193,59,172,79,56,196,200,19,94,104,228,220,46,42,34,208,26,22,228,148,175,206,141,51,231,174,100,25,16,4,1,48,0,7,4,1,2,4,233,0,0,126,140,194,235,75,151,172,234,136,23,1,100,14,152,204,209,139,193,3,130,181,93,47,77,35,56,97,121,251,151,185,114,17,2,204,254,253,193,45,87,201,63,108,140,98,61,225,223,229,34,208,158,221,141,103,228,168,52,16,123,83,68,64,77,155,5,16,1,151,170,133,85,12,8,231,83,83,8,28,221,26,134,85,126,234,104,22,231,103,54,180,118,34,209,31,166,11,144,174,155,17],"quorum_hash":[34,153,131,64,66,147,240,32,92,27,189,141,240,96,197,152,58,71,115,107,141,84,31,116,141,45,108,40,72,130,129,16],"signature":[174,87,124,110,58,18,45,93,176,103,34,219,129,77,125,251,0,53,179,205,179,163,119,132,75,182,206,115,169,66,222,75,198,129,190,101,113,107,51,62,162,87,240,206,131,7,138,231,23,70,191,154,140,213,120,181,9,103,29,43,59,23,216,243,250,247,119,189,35,250,91,188,166,212,93,12,141,145,56,165,17,132,55,145,100,16,15,244,67,185,168,147,200,242,10,127],"round":0,"block_id_hash":[243,30,197,193,10,25,24,84,159,94,166,75,60,223,157,239,84,145,165,182,253,74,253,86,248,192,23,123,178,91,13,143],"quorum_type":106}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.527888214Z_GetProtocolVersionUpgradeStateRequest_4ed3fce5a29b6727723dc6a61de43efa7bd8ad573b26b5a9c2258707b6130b1a.json b/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.527888214Z_GetProtocolVersionUpgradeStateRequest_4ed3fce5a29b6727723dc6a61de43efa7bd8ad573b26b5a9c2258707b6130b1a.json deleted file mode 100644 index 849f8223b3..0000000000 --- a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.527888214Z_GetProtocolVersionUpgradeStateRequest_4ed3fce5a29b6727723dc6a61de43efa7bd8ad573b26b5a9c2258707b6130b1a.json +++ /dev/null @@ -1 +0,0 @@ -{"request":{"version":{"v0":{"prove":true}}},"response":{"version":{"v0":{"metadata":{"height":"496","core_chain_locked_height":1626,"epoch":20,"time_ms":"1700762179839","protocol_version":1,"chain_id":"dashmate_local_36"},"result":{"proof":{"grovedb_proof":[1,2,9,3,1,1,0,4,0,1,3,0,1,76,4,1,0,0,5,2,1,1,1,0,172,118,147,226,99,11,13,181,90,39,101,222,175,254,30,207,198,99,206,96,212,107,42,5,87,62,124,47,142,71,215,124,2,48,255,112,3,100,106,137,48,184,76,179,165,210,182,251,115,152,140,183,121,113,209,160,27,162,213,231,149,213,204,162,103,16,1,212,1,1,62,210,128,237,157,173,255,118,46,120,226,35,148,9,65,38,159,144,75,61,235,31,132,201,170,187,200,81,86,89,44,191,2,204,254,253,193,45,87,201,63,108,140,98,61,225,223,229,34,208,158,221,141,103,228,168,52,16,123,83,68,64,77,155,5,16,1,195,54,53,19,110,80,46,154,197,36,75,21,162,10,117,126,7,89,206,10,144,130,60,211,127,137,63,106,73,85,109,38,2,175,176,44,68,76,56,6,20,24,225,142,11,24,240,97,207,172,108,43,27,213,168,19,76,75,136,52,164,207,181,28,182,16,2,47,142,242,39,38,151,132,161,102,144,3,59,141,22,75,155,233,170,192,212,68,76,152,175,85,13,163,2,172,135,30,206,4,1,120,0,5,2,1,1,1,0,150,65,61,70,201,175,111,254,234,207,149,180,10,78,122,36,240,226,133,34,18,35,237,29,21,18,206,162,50,132,239,75,17,17,17],"quorum_hash":[34,153,131,64,66,147,240,32,92,27,189,141,240,96,197,152,58,71,115,107,141,84,31,116,141,45,108,40,72,130,129,16],"signature":[174,87,124,110,58,18,45,93,176,103,34,219,129,77,125,251,0,53,179,205,179,163,119,132,75,182,206,115,169,66,222,75,198,129,190,101,113,107,51,62,162,87,240,206,131,7,138,231,23,70,191,154,140,213,120,181,9,103,29,43,59,23,216,243,250,247,119,189,35,250,91,188,166,212,93,12,141,145,56,165,17,132,55,145,100,16,15,244,67,185,168,147,200,242,10,127],"round":0,"block_id_hash":[243,30,197,193,10,25,24,84,159,94,166,75,60,223,157,239,84,145,165,182,253,74,253,86,248,192,23,123,178,91,13,143],"quorum_type":106}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.532752692Z_DocumentQuery_66b0ef1d6b1f37230412b8f86821352f30f654f6503d1d6914867355a203caba.json b/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.532752692Z_DocumentQuery_66b0ef1d6b1f37230412b8f86821352f30f654f6503d1d6914867355a203caba.json deleted file mode 100644 index 688c642b07..0000000000 --- a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.532752692Z_DocumentQuery_66b0ef1d6b1f37230412b8f86821352f30f654f6503d1d6914867355a203caba.json +++ /dev/null @@ -1 +0,0 @@ -{"request":{"data_contract":{"$format_version":"0","id":"GWRSAVFMjXx8HpQFaNJMqBV7MBgMK4br5UESsB4S31Ec","config":{"$format_version":"0","canBeDeleted":false,"readonly":false,"keepsHistory":false,"documentsKeepHistoryContractDefault":false,"documentsMutableContractDefault":true,"requiresIdentityEncryptionBoundedKey":null,"requiresIdentityDecryptionBoundedKey":null},"version":1,"ownerId":"4EfA9Jrvv3nnCFdSf7fad59851iiTRZ6Wcu6YVJ4iSeF","schemaDefs":null,"documentSchemas":{"domain":{"type":"object","indices":[{"name":"parentNameAndLabel","properties":[{"normalizedParentDomainName":"asc"},{"normalizedLabel":"asc"}],"unique":true},{"name":"dashIdentityId","properties":[{"records.dashUniqueIdentityId":"asc"}],"unique":true},{"name":"dashAlias","properties":[{"records.dashAliasIdentityId":"asc"}]}],"properties":{"label":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9]$","minLength":3,"maxLength":63,"position":0,"description":"Domain label. e.g. 'Bob'."},"normalizedLabel":{"type":"string","pattern":"^[a-hj-km-np-z0-9][a-hj-km-np-z0-9-]{0,61}[a-hj-km-np-z0-9]$","maxLength":63,"position":1,"description":"Domain label converted to lowercase for case-insensitive uniqueness validation. \"o\", \"i\" and \"l\" replaced with \"0\" and \"1\" to mitigate homograph attack. e.g. 'b0b'","$comment":"Must be equal to the label in lowercase. \"o\", \"i\" and \"l\" must be replaced with \"0\" and \"1\"."},"parentDomainName":{"type":"string","pattern":"^$|^[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9]$","minLength":0,"maxLength":63,"position":2,"description":"A full parent domain name. e.g. 'dash'."},"normalizedParentDomainName":{"type":"string","pattern":"^$|^[a-hj-km-np-z0-9][a-hj-km-np-z0-9-\\.]{0,61}[a-hj-km-np-z0-9]$","minLength":0,"maxLength":63,"position":3,"description":"A parent domain name in lowercase for case-insensitive uniqueness validation. \"o\", \"i\" and \"l\" replaced with \"0\" and \"1\" to mitigate homograph attack. e.g. 'dash'","$comment":"Must either be equal to an existing domain or empty to create a top level domain. \"o\", \"i\" and \"l\" must be replaced with \"0\" and \"1\". Only the data contract owner can create top level domains."},"preorderSalt":{"type":"array","byteArray":true,"minItems":32,"maxItems":32,"position":4,"description":"Salt used in the preorder document"},"records":{"type":"object","properties":{"dashUniqueIdentityId":{"type":"array","byteArray":true,"minItems":32,"maxItems":32,"position":0,"contentMediaType":"application/x.dash.dpp.identifier","description":"Identity ID to be used to create the primary name the Identity","$comment":"Must be equal to the document owner"},"dashAliasIdentityId":{"type":"array","byteArray":true,"minItems":32,"maxItems":32,"position":1,"contentMediaType":"application/x.dash.dpp.identifier","description":"Identity ID to be used to create alias names for the Identity","$comment":"Must be equal to the document owner"}},"minProperties":1,"maxProperties":1,"position":5,"additionalProperties":false,"$comment":"Constraint with max and min properties ensure that only one identity record is used - either a `dashUniqueIdentityId` or a `dashAliasIdentityId`"},"subdomainRules":{"type":"object","properties":{"allowSubdomains":{"type":"boolean","description":"This option defines who can create subdomains: true - anyone; false - only the domain owner","$comment":"Only the domain owner is allowed to create subdomains for non top-level domains","position":0}},"position":6,"description":"Subdomain rules allow domain owners to define rules for subdomains","additionalProperties":false,"required":["allowSubdomains"]}},"required":["label","normalizedLabel","normalizedParentDomainName","preorderSalt","records","subdomainRules"],"additionalProperties":false,"$comment":"In order to register a domain you need to create a preorder. The preorder step is needed to prevent man-in-the-middle attacks. normalizedLabel + '.' + normalizedParentDomain must not be longer than 253 chars length as defined by RFC 1035. Domain documents are immutable: modification and deletion are restricted"},"preorder":{"type":"object","indices":[{"name":"saltedHash","properties":[{"saltedDomainHash":"asc"}],"unique":true}],"properties":{"saltedDomainHash":{"type":"array","byteArray":true,"minItems":32,"maxItems":32,"position":0,"description":"Double sha-256 of the concatenation of a 32 byte random salt and a normalized domain name"}},"required":["saltedDomainHash"],"additionalProperties":false,"$comment":"Preorder documents are immutable: modification and deletion are restricted"}}},"document_type_name":"domain","where_clauses":[{"field":"$id","operator":"Equal","value":"FXyN2NZAdRFADgBQfb1XM1Qq7pWoEcgSWj1GaiQJqcrS"}],"order_by_clauses":[],"limit":0,"start":null},"response":{"version":{"v0":{"metadata":{"height":"496","core_chain_locked_height":1626,"epoch":20,"time_ms":"1700762179839","protocol_version":1,"chain_id":"dashmate_local_36"},"result":{"proof":{"grovedb_proof":[1,2,189,1,3,32,215,242,197,63,70,169,23,171,110,91,57,162,215,188,38,11,100,146,137,69,55,68,209,224,212,242,106,141,142,255,55,207,0,153,0,150,0,215,242,197,63,70,169,23,171,110,91,57,162,215,188,38,11,100,146,137,69,55,68,209,224,212,242,106,141,142,255,55,207,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,1,0,0,4,100,97,115,104,4,100,97,115,104,1,0,0,224,181,8,197,163,104,37,162,6,105,58,31,65,74,161,62,219,236,244,60,65,227,199,153,234,158,115,123,79,154,162,38,34,0,1,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,1,1,0,1,175,1,4,1,0,0,36,2,1,32,215,242,197,63,70,169,23,171,110,91,57,162,215,188,38,11,100,146,137,69,55,68,209,224,212,242,106,141,142,255,55,207,0,65,245,205,250,165,144,58,205,151,231,250,118,68,196,222,33,122,115,202,113,191,174,43,185,18,208,221,98,69,63,190,117,2,243,227,109,203,174,138,132,44,53,44,18,233,29,115,61,1,50,236,193,96,113,27,57,167,78,14,8,132,33,178,91,59,16,2,115,95,123,161,244,153,57,55,29,209,118,68,122,250,87,10,220,178,23,42,98,149,170,101,107,2,4,123,132,80,134,114,16,1,237,176,56,18,90,131,64,146,62,73,218,37,7,80,230,25,195,214,84,107,116,42,161,213,231,99,49,70,109,122,46,221,17,1,107,4,6,100,111,109,97,105,110,0,31,2,1,27,114,101,99,111,114,100,115,46,100,97,115,104,65,108,105,97,115,73,100,101,110,116,105,116,121,73,100,0,204,190,158,105,75,9,25,208,194,91,83,149,12,201,75,109,144,75,99,66,32,51,85,191,175,76,98,75,52,53,85,240,2,38,158,217,247,245,108,64,252,150,230,243,204,75,109,160,249,36,126,63,182,190,232,139,251,233,178,192,48,6,248,191,249,16,1,83,1,54,223,240,31,55,201,49,39,140,69,210,242,185,108,80,68,28,64,36,152,167,122,5,41,10,68,183,75,86,144,179,204,4,1,1,0,12,2,1,8,112,114,101,111,114,100,101,114,0,84,156,7,216,23,176,127,111,115,1,136,38,75,129,30,33,220,29,7,163,198,67,108,238,35,254,220,182,27,62,14,229,16,1,141,1,1,53,27,87,37,221,226,28,175,201,185,193,171,161,189,79,11,174,89,129,179,222,243,245,228,182,62,69,51,4,147,15,248,2,1,217,109,238,206,206,168,243,192,236,215,159,163,75,111,52,173,240,242,45,193,69,99,247,92,124,165,253,229,130,228,6,16,4,32,230,104,198,89,175,102,174,225,231,44,24,109,222,123,91,126,10,29,113,42,9,196,13,87,33,246,34,191,83,197,49,85,0,5,2,1,1,1,0,33,138,150,165,224,17,145,179,7,120,169,2,43,51,49,142,79,255,67,7,18,161,70,134,2,167,190,106,29,104,149,81,17,1,141,1,1,62,210,128,237,157,173,255,118,46,120,226,35,148,9,65,38,159,144,75,61,235,31,132,201,170,187,200,81,86,89,44,191,4,1,64,0,36,2,1,32,162,161,180,172,111,239,34,234,42,26,104,232,18,54,68,179,87,135,95,107,65,44,24,16,146,129,193,70,231,178,113,188,0,168,99,211,63,81,56,245,72,156,254,93,201,14,131,171,16,91,237,241,30,32,62,67,128,249,8,196,116,111,157,82,212,16,1,151,170,133,85,12,8,231,83,83,8,28,221,26,134,85,126,234,104,22,231,103,54,180,118,34,209,31,166,11,144,174,155,17],"quorum_hash":[34,153,131,64,66,147,240,32,92,27,189,141,240,96,197,152,58,71,115,107,141,84,31,116,141,45,108,40,72,130,129,16],"signature":[174,87,124,110,58,18,45,93,176,103,34,219,129,77,125,251,0,53,179,205,179,163,119,132,75,182,206,115,169,66,222,75,198,129,190,101,113,107,51,62,162,87,240,206,131,7,138,231,23,70,191,154,140,213,120,181,9,103,29,43,59,23,216,243,250,247,119,189,35,250,91,188,166,212,93,12,141,145,56,165,17,132,55,145,100,16,15,244,67,185,168,147,200,242,10,127],"round":0,"block_id_hash":[243,30,197,193,10,25,24,84,159,94,166,75,60,223,157,239,84,145,165,182,253,74,253,86,248,192,23,123,178,91,13,143],"quorum_type":106}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.532753684Z_GetProtocolVersionUpgradeVoteStatusRequest_23ba016b971c6bf8861d9be485c6366cd76d51c080ede13275caaa4e495dc40d.json b/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.532753684Z_GetProtocolVersionUpgradeVoteStatusRequest_23ba016b971c6bf8861d9be485c6366cd76d51c080ede13275caaa4e495dc40d.json deleted file mode 100644 index b9489daa7e..0000000000 --- a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.532753684Z_GetProtocolVersionUpgradeVoteStatusRequest_23ba016b971c6bf8861d9be485c6366cd76d51c080ede13275caaa4e495dc40d.json +++ /dev/null @@ -1 +0,0 @@ -{"request":{"version":{"v0":{"start_pro_tx_hash":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"count":2,"prove":true}}},"response":{"version":{"v0":{"metadata":{"height":"496","core_chain_locked_height":1626,"epoch":20,"time_ms":"1700762179839","protocol_version":1,"chain_id":"dashmate_local_36"},"result":{"proof":{"grovedb_proof":[1,2,115,3,32,32,61,206,159,132,120,24,255,130,88,128,169,159,65,68,200,248,97,166,108,115,34,32,101,252,57,131,15,0,136,128,136,0,4,0,1,1,0,3,32,116,92,159,20,113,73,103,94,47,194,55,81,85,32,107,47,22,240,65,26,188,84,112,171,23,101,1,233,32,217,211,247,0,4,0,1,1,0,16,1,128,104,3,237,23,39,57,239,32,149,104,103,142,51,205,15,169,60,243,88,78,16,0,13,124,253,95,174,156,178,85,87,17,1,107,1,87,179,244,56,7,185,118,146,239,15,211,218,0,164,145,194,126,141,143,128,151,182,242,30,26,24,123,92,97,194,72,70,4,1,1,0,36,2,1,32,116,92,159,20,113,73,103,94,47,194,55,81,85,32,107,47,22,240,65,26,188,84,112,171,23,101,1,233,32,217,211,247,0,229,149,70,100,255,25,235,252,87,188,224,163,221,159,166,171,225,167,241,8,232,224,215,203,245,176,82,242,42,230,98,252,16,1,212,1,1,62,210,128,237,157,173,255,118,46,120,226,35,148,9,65,38,159,144,75,61,235,31,132,201,170,187,200,81,86,89,44,191,2,204,254,253,193,45,87,201,63,108,140,98,61,225,223,229,34,208,158,221,141,103,228,168,52,16,123,83,68,64,77,155,5,16,1,195,54,53,19,110,80,46,154,197,36,75,21,162,10,117,126,7,89,206,10,144,130,60,211,127,137,63,106,73,85,109,38,2,175,176,44,68,76,56,6,20,24,225,142,11,24,240,97,207,172,108,43,27,213,168,19,76,75,136,52,164,207,181,28,182,16,2,47,142,242,39,38,151,132,161,102,144,3,59,141,22,75,155,233,170,192,212,68,76,152,175,85,13,163,2,172,135,30,206,4,1,120,0,5,2,1,1,1,0,150,65,61,70,201,175,111,254,234,207,149,180,10,78,122,36,240,226,133,34,18,35,237,29,21,18,206,162,50,132,239,75,17,17,17],"quorum_hash":[34,153,131,64,66,147,240,32,92,27,189,141,240,96,197,152,58,71,115,107,141,84,31,116,141,45,108,40,72,130,129,16],"signature":[174,87,124,110,58,18,45,93,176,103,34,219,129,77,125,251,0,53,179,205,179,163,119,132,75,182,206,115,169,66,222,75,198,129,190,101,113,107,51,62,162,87,240,206,131,7,138,231,23,70,191,154,140,213,120,181,9,103,29,43,59,23,216,243,250,247,119,189,35,250,91,188,166,212,93,12,141,145,56,165,17,132,55,145,100,16,15,244,67,185,168,147,200,242,10,127],"round":0,"block_id_hash":[243,30,197,193,10,25,24,84,159,94,166,75,60,223,157,239,84,145,165,182,253,74,253,86,248,192,23,123,178,91,13,143],"quorum_type":106}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.532766888Z_GetEpochsInfoRequest_1a593ca7a1115a6cb2f60ad11269f61ad490a07e7dd3beb74eece388772bcfbd.json b/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.532766888Z_GetEpochsInfoRequest_1a593ca7a1115a6cb2f60ad11269f61ad490a07e7dd3beb74eece388772bcfbd.json deleted file mode 100644 index ccef5337a9..0000000000 --- a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.532766888Z_GetEpochsInfoRequest_1a593ca7a1115a6cb2f60ad11269f61ad490a07e7dd3beb74eece388772bcfbd.json +++ /dev/null @@ -1 +0,0 @@ -{"request":{"version":{"v0":{"start_epoch":1,"count":2,"ascending":true,"prove":true}}},"response":{"version":{"v0":{"metadata":{"height":"496","core_chain_locked_height":1626,"epoch":20,"time_ms":"1700762179839","protocol_version":1,"chain_id":"dashmate_local_36"},"result":{"proof":{"grovedb_proof":[1,1,233,198,5,1,131,186,49,101,222,156,65,35,121,138,179,160,147,122,144,51,97,129,30,125,91,82,81,222,86,188,189,15,179,211,32,226,4,2,1,1,0,6,4,1,1,116,0,0,169,113,228,29,18,1,255,204,230,209,36,107,177,68,50,65,233,185,100,174,37,144,228,40,53,244,81,156,178,106,185,82,16,4,2,1,2,0,6,4,1,1,116,0,0,199,142,226,92,252,7,100,2,104,134,94,46,85,127,154,201,151,64,111,73,138,209,245,228,32,67,54,161,2,133,160,44,17,4,2,1,3,0,6,4,1,1,116,0,0,233,149,90,145,122,102,109,109,212,177,248,226,66,10,43,198,195,198,218,70,78,152,64,44,22,143,136,87,108,0,239,116,16,4,2,1,4,0,6,4,1,1,116,0,0,142,119,219,26,179,91,114,92,217,60,65,202,231,73,157,214,252,107,231,128,246,76,26,247,77,232,157,232,44,88,219,80,4,2,1,5,0,6,4,1,1,116,0,0,80,185,96,184,80,75,103,105,217,123,2,91,240,181,161,251,42,174,74,98,141,193,54,86,140,86,60,137,93,96,210,51,16,4,2,1,6,0,6,4,1,1,116,0,0,13,33,52,18,188,23,46,29,49,9,242,239,65,13,67,230,166,63,104,100,75,68,144,78,228,82,147,232,191,30,82,24,17,17,4,2,1,7,0,6,4,1,1,116,0,0,97,98,93,169,82,174,59,82,50,103,42,55,195,75,1,82,134,178,31,236,167,213,99,32,57,3,90,252,147,255,217,119,16,4,2,1,8,0,6,4,1,1,116,0,0,106,179,145,38,165,196,22,31,141,47,184,193,102,229,149,178,46,198,138,153,63,37,236,189,20,130,177,86,251,1,188,35,4,2,1,9,0,6,4,1,1,116,0,0,2,154,206,1,126,26,115,40,105,81,11,182,201,110,78,247,16,163,62,28,247,160,150,90,144,197,191,193,194,5,48,184,16,4,2,1,10,0,6,4,1,1,116,0,0,94,170,4,154,97,124,43,67,244,246,100,66,141,136,251,246,102,32,132,179,15,9,223,251,216,98,133,14,206,13,117,170,17,4,2,1,11,0,6,4,1,1,116,0,0,208,187,152,36,63,131,206,162,124,148,106,188,57,25,206,210,133,0,211,188,29,89,199,135,247,23,233,201,89,18,122,53,16,4,2,1,12,0,6,4,1,1,116,0,0,245,86,78,65,213,129,6,194,220,174,234,174,48,30,200,146,221,226,194,67,110,18,156,108,36,233,162,141,10,174,180,201,4,2,1,13,0,6,4,1,1,116,0,0,132,80,178,190,61,183,88,13,69,35,54,194,246,201,93,114,242,248,156,157,138,188,116,99,109,219,34,56,254,123,200,171,16,4,2,1,14,0,6,4,1,1,116,0,0,15,229,12,189,80,235,210,182,202,253,31,17,183,77,153,3,20,137,164,131,157,81,109,140,5,181,65,204,46,112,163,156,17,17,17,4,2,1,15,0,6,4,1,1,116,0,0,231,30,228,93,45,17,46,167,166,147,24,0,95,175,80,206,79,33,240,28,148,189,240,116,92,179,146,62,58,116,239,189,16,4,2,1,16,0,6,4,1,1,116,0,0,46,99,19,149,183,250,167,108,175,86,207,143,251,233,188,80,166,205,31,52,185,9,181,234,66,128,156,9,223,174,146,198,4,2,1,17,0,6,4,1,1,116,0,0,153,187,138,90,65,20,198,64,150,96,167,187,197,180,133,33,30,96,163,144,51,166,3,94,207,214,49,230,144,39,228,149,16,4,2,1,18,0,6,4,1,1,116,0,0,102,84,141,100,138,102,251,89,31,114,253,128,44,240,98,17,94,177,52,109,220,227,120,227,254,70,241,134,25,0,215,127,17,4,2,1,19,0,6,4,1,1,116,0,0,198,71,208,163,201,190,193,12,90,113,149,114,4,108,252,129,193,37,131,85,162,219,39,156,251,25,95,67,99,67,93,162,16,4,2,1,20,0,6,4,1,1,115,0,0,161,19,100,111,42,217,230,29,186,16,48,187,133,94,222,139,100,139,238,137,67,92,70,49,194,217,20,30,8,219,158,237,4,2,1,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,1,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,1,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,1,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,1,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,1,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,1,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,1,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,4,2,1,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,2,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,2,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,2,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,2,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,2,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,2,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,2,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,17,4,2,2,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,3,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,3,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,3,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,3,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,3,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,3,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,3,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,4,2,3,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,4,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,4,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,4,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,4,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,4,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,4,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,4,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,17,17,4,2,4,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,5,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,5,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,5,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,5,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,5,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,5,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,5,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,4,2,5,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,6,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,6,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,6,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,6,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,6,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,6,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,6,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,17,4,2,6,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,6,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,7,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,7,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,7,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,7,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,7,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,7,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,4,2,7,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,7,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,8,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,8,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,8,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,8,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,8,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,8,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,208,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,209,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,17,17,4,2,8,210,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,211,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,4,2,8,212,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,213,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,4,2,8,214,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,215,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,4,2,8,216,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,217,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,4,2,8,218,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,219,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,4,2,8,220,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,221,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,17,4,2,8,222,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,223,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,4,2,8,224,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,225,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,4,2,8,226,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,227,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,4,2,8,228,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,17,4,1,112,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,1,115,0,3,3,0,0,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,3,1,117,0,5,0,2,0,20,0,16,17,17,17,17,17,17,17,17,17,2,63,3,1,99,0,7,0,4,0,0,5,155,0,3,1,104,0,11,0,8,0,0,0,0,0,0,0,2,0,16,3,1,116,0,11,0,8,0,0,1,139,252,251,241,24,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,2,63,3,1,99,0,7,0,4,0,0,5,162,0,3,1,104,0,11,0,8,0,0,0,0,0,0,0,21,0,16,3,1,116,0,11,0,8,0,0,1,139,252,255,77,231,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,1,180,1,1,191,111,198,73,20,169,78,87,218,51,25,198,58,172,28,1,183,8,209,14,63,217,17,124,131,92,143,52,144,15,78,211,2,238,81,197,66,193,59,172,79,56,196,200,19,94,104,228,220,46,42,34,208,26,22,228,148,175,206,141,51,231,174,100,25,16,4,1,48,0,7,4,1,2,4,233,0,0,126,140,194,235,75,151,172,234,136,23,1,100,14,152,204,209,139,193,3,130,181,93,47,77,35,56,97,121,251,151,185,114,17,2,204,254,253,193,45,87,201,63,108,140,98,61,225,223,229,34,208,158,221,141,103,228,168,52,16,123,83,68,64,77,155,5,16,1,151,170,133,85,12,8,231,83,83,8,28,221,26,134,85,126,234,104,22,231,103,54,180,118,34,209,31,166,11,144,174,155,17],"quorum_hash":[34,153,131,64,66,147,240,32,92,27,189,141,240,96,197,152,58,71,115,107,141,84,31,116,141,45,108,40,72,130,129,16],"signature":[174,87,124,110,58,18,45,93,176,103,34,219,129,77,125,251,0,53,179,205,179,163,119,132,75,182,206,115,169,66,222,75,198,129,190,101,113,107,51,62,162,87,240,206,131,7,138,231,23,70,191,154,140,213,120,181,9,103,29,43,59,23,216,243,250,247,119,189,35,250,91,188,166,212,93,12,141,145,56,165,17,132,55,145,100,16,15,244,67,185,168,147,200,242,10,127],"round":0,"block_id_hash":[243,30,197,193,10,25,24,84,159,94,166,75,60,223,157,239,84,145,165,182,253,74,253,86,248,192,23,123,178,91,13,143],"quorum_type":106}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.535104374Z_GetProtocolVersionUpgradeVoteStatusRequest_b48106c894c1a70687d01655ff8f38dd6669a50d8640eebb79d1c86be24e176a.json b/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.535104374Z_GetProtocolVersionUpgradeVoteStatusRequest_b48106c894c1a70687d01655ff8f38dd6669a50d8640eebb79d1c86be24e176a.json deleted file mode 100644 index 65265450a0..0000000000 --- a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.535104374Z_GetProtocolVersionUpgradeVoteStatusRequest_b48106c894c1a70687d01655ff8f38dd6669a50d8640eebb79d1c86be24e176a.json +++ /dev/null @@ -1 +0,0 @@ -{"request":{"version":{"v0":{"start_pro_tx_hash":[],"count":100,"prove":true}}},"response":{"version":{"v0":{"metadata":{"height":"496","core_chain_locked_height":1626,"epoch":20,"time_ms":"1700762179839","protocol_version":1,"chain_id":"dashmate_local_36"},"result":{"proof":{"grovedb_proof":[1,2,122,3,32,32,61,206,159,132,120,24,255,130,88,128,169,159,65,68,200,248,97,166,108,115,34,32,101,252,57,131,15,0,136,128,136,0,4,0,1,1,0,3,32,116,92,159,20,113,73,103,94,47,194,55,81,85,32,107,47,22,240,65,26,188,84,112,171,23,101,1,233,32,217,211,247,0,4,0,1,1,0,16,3,32,249,3,128,182,199,88,47,32,155,199,150,145,142,156,213,89,1,46,71,34,22,95,107,145,132,103,162,32,104,134,47,187,0,4,0,1,1,0,17,1,107,1,87,179,244,56,7,185,118,146,239,15,211,218,0,164,145,194,126,141,143,128,151,182,242,30,26,24,123,92,97,194,72,70,4,1,1,0,36,2,1,32,116,92,159,20,113,73,103,94,47,194,55,81,85,32,107,47,22,240,65,26,188,84,112,171,23,101,1,233,32,217,211,247,0,229,149,70,100,255,25,235,252,87,188,224,163,221,159,166,171,225,167,241,8,232,224,215,203,245,176,82,242,42,230,98,252,16,1,212,1,1,62,210,128,237,157,173,255,118,46,120,226,35,148,9,65,38,159,144,75,61,235,31,132,201,170,187,200,81,86,89,44,191,2,204,254,253,193,45,87,201,63,108,140,98,61,225,223,229,34,208,158,221,141,103,228,168,52,16,123,83,68,64,77,155,5,16,1,195,54,53,19,110,80,46,154,197,36,75,21,162,10,117,126,7,89,206,10,144,130,60,211,127,137,63,106,73,85,109,38,2,175,176,44,68,76,56,6,20,24,225,142,11,24,240,97,207,172,108,43,27,213,168,19,76,75,136,52,164,207,181,28,182,16,2,47,142,242,39,38,151,132,161,102,144,3,59,141,22,75,155,233,170,192,212,68,76,152,175,85,13,163,2,172,135,30,206,4,1,120,0,5,2,1,1,1,0,150,65,61,70,201,175,111,254,234,207,149,180,10,78,122,36,240,226,133,34,18,35,237,29,21,18,206,162,50,132,239,75,17,17,17],"quorum_hash":[34,153,131,64,66,147,240,32,92,27,189,141,240,96,197,152,58,71,115,107,141,84,31,116,141,45,108,40,72,130,129,16],"signature":[174,87,124,110,58,18,45,93,176,103,34,219,129,77,125,251,0,53,179,205,179,163,119,132,75,182,206,115,169,66,222,75,198,129,190,101,113,107,51,62,162,87,240,206,131,7,138,231,23,70,191,154,140,213,120,181,9,103,29,43,59,23,216,243,250,247,119,189,35,250,91,188,166,212,93,12,141,145,56,165,17,132,55,145,100,16,15,244,67,185,168,147,200,242,10,127],"round":0,"block_id_hash":[243,30,197,193,10,25,24,84,159,94,166,75,60,223,157,239,84,145,165,182,253,74,253,86,248,192,23,123,178,91,13,143],"quorum_type":106}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.541183290Z_IdentityRequest_4c846d4b578d59c6520ad92e6c58ad4aecd97420126c4ae060b535732724e5ad.json b/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.541183290Z_IdentityRequest_4c846d4b578d59c6520ad92e6c58ad4aecd97420126c4ae060b535732724e5ad.json deleted file mode 100644 index 61ba228f31..0000000000 --- a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.541183290Z_IdentityRequest_4c846d4b578d59c6520ad92e6c58ad4aecd97420126c4ae060b535732724e5ad.json +++ /dev/null @@ -1 +0,0 @@ -{"request":{"GetIdentityByPublicKeyHash":{"version":{"v0":{"public_key_hash":[53,219,206,109,80,5,25,167,122,103,225,59,203,129,65,83,198,16,97,168],"prove":true}}}},"response":{"GetIdentityByPublicKeyHash":{"version":{"v0":{"metadata":{"height":"496","core_chain_locked_height":1626,"epoch":20,"time_ms":"1700762179839","protocol_version":1,"chain_id":"dashmate_local_36"},"result":{"proof":{"grovedb_proof":[1,6,0,1,0,166,3,1,74,117,207,63,83,94,129,196,104,15,129,55,162,32,141,188,178,101,47,253,126,113,91,212,41,12,197,197,96,178,204,97,2,207,190,5,53,189,45,239,229,134,184,99,185,204,185,45,13,102,251,43,129,13,115,14,123,162,203,126,47,179,2,97,59,16,4,1,24,0,24,2,1,20,217,72,55,80,12,1,42,21,85,50,101,124,102,223,74,4,10,18,60,227,0,213,95,68,55,191,178,14,185,176,36,109,169,177,120,209,225,36,39,216,56,9,52,243,253,122,172,171,127,103,0,211,115,17,4,1,32,0,36,2,1,32,65,63,57,243,204,9,106,71,187,2,94,221,190,127,141,114,137,209,243,50,60,215,90,101,229,15,115,5,44,117,182,217,0,13,64,223,85,121,82,184,247,105,138,111,225,252,17,37,52,199,109,212,114,11,182,154,158,138,46,128,38,94,56,44,75,16,1,152,212,6,9,60,7,90,253,67,26,190,161,178,33,173,49,219,116,125,214,117,45,147,115,13,155,156,78,63,108,225,152,17,2,204,254,253,193,45,87,201,63,108,140,98,61,225,223,229,34,208,158,221,141,103,228,168,52,16,123,83,68,64,77,155,5,16,1,195,54,53,19,110,80,46,154,197,36,75,21,162,10,117,126,7,89,206,10,144,130,60,211,127,137,63,106,73,85,109,38,4,1,96,0,45,4,1,32,65,63,57,243,204,9,106,71,187,2,94,221,190,127,141,114,137,209,243,50,60,215,90,101,229,15,115,5,44,117,182,217,253,0,252,58,4,253,198,0,0,0,215,47,92,117,235,141,133,44,48,214,12,62,47,215,91,223,175,142,93,105,201,4,90,48,197,143,175,65,178,238,25,177,16,1,3,102,208,132,81,115,249,124,23,227,212,165,35,129,203,40,98,153,173,147,241,172,234,117,80,118,110,48,147,229,217,204,17,17,2,1,24,195,1,1,213,139,207,177,56,73,43,216,231,168,151,75,13,113,88,132,134,16,208,201,103,21,195,181,249,17,73,236,130,153,124,156,3,20,53,219,206,109,80,5,25,167,122,103,225,59,203,129,65,83,198,16,97,168,0,35,0,32,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,0,16,1,166,252,57,172,29,29,151,5,155,43,21,72,236,229,137,83,168,59,178,52,83,124,130,87,7,151,20,103,49,52,133,225,17,2,160,101,118,230,251,158,7,50,90,160,208,69,158,85,232,130,209,238,188,106,22,230,134,149,114,94,72,55,20,11,61,19,16,1,200,223,119,2,251,29,190,138,186,198,182,120,164,162,195,42,35,137,150,55,241,180,128,201,211,251,54,4,7,150,249,78,17,1,1,32,213,1,1,9,167,197,156,150,76,38,98,18,45,25,134,65,26,81,2,72,149,153,251,218,203,242,173,241,123,237,134,82,6,190,146,4,32,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,0,9,2,1,1,2,1,3,0,0,0,171,118,116,140,89,137,208,170,37,136,27,102,222,157,117,207,45,148,61,93,130,167,132,211,240,170,230,21,29,108,130,62,16,1,241,250,101,61,30,82,179,252,126,130,148,173,29,96,30,67,18,189,43,72,252,116,9,131,224,85,218,95,15,54,16,29,17,2,146,193,239,158,94,16,174,90,0,59,138,176,91,102,207,210,103,170,233,107,147,127,32,96,164,144,172,13,95,207,189,178,16,1,40,2,136,3,190,247,219,224,31,248,84,34,220,218,23,168,225,228,134,141,144,132,203,66,28,176,28,148,183,88,245,1,17,1,32,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,127,3,1,0,0,11,0,8,0,0,0,0,0,0,0,0,0,4,1,1,0,5,2,1,1,1,0,187,26,123,178,92,236,140,47,217,118,80,42,43,3,193,68,145,37,2,103,11,198,208,127,224,171,198,45,214,95,25,26,16,2,215,214,150,50,43,118,190,187,1,88,134,141,135,77,213,209,41,110,212,148,5,246,114,94,88,218,204,50,211,88,61,48,16,1,70,25,123,162,209,216,154,230,95,14,56,180,32,113,102,210,182,213,32,20,204,112,76,86,112,130,191,29,189,101,249,223,17,2,1,1,101,3,1,0,0,45,0,42,0,0,0,0,0,0,0,33,2,96,85,184,126,82,70,165,44,218,228,249,30,215,58,128,247,39,29,20,204,189,174,59,90,252,220,150,204,253,32,73,64,0,0,3,1,1,0,45,0,42,0,1,0,2,0,0,0,33,3,7,21,241,88,44,241,135,226,119,224,56,235,17,233,143,14,28,189,253,211,35,40,147,25,128,209,34,253,208,94,150,219,0,0,16,2,1,96,207,1,1,64,73,194,113,147,86,152,163,39,150,106,40,80,207,123,140,201,1,246,45,227,178,215,197,145,40,24,178,120,212,204,100,4,32,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,0,3,3,0,0,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,16,1,3,207,237,208,175,160,108,250,127,37,214,46,113,97,201,53,9,166,164,192,39,188,142,215,119,204,230,134,77,40,94,174,17,2,137,55,32,169,123,196,47,111,55,237,142,237,212,151,35,145,129,149,32,86,123,54,68,188,209,146,213,120,53,25,205,45,16,1,180,58,29,170,183,13,81,20,135,106,232,131,28,200,44,132,42,156,91,80,30,203,234,113,102,241,237,57,22,156,161,36,17],"quorum_hash":[34,153,131,64,66,147,240,32,92,27,189,141,240,96,197,152,58,71,115,107,141,84,31,116,141,45,108,40,72,130,129,16],"signature":[174,87,124,110,58,18,45,93,176,103,34,219,129,77,125,251,0,53,179,205,179,163,119,132,75,182,206,115,169,66,222,75,198,129,190,101,113,107,51,62,162,87,240,206,131,7,138,231,23,70,191,154,140,213,120,181,9,103,29,43,59,23,216,243,250,247,119,189,35,250,91,188,166,212,93,12,141,145,56,165,17,132,55,145,100,16,15,244,67,185,168,147,200,242,10,127],"round":0,"block_id_hash":[243,30,197,193,10,25,24,84,159,94,166,75,60,223,157,239,84,145,165,182,253,74,253,86,248,192,23,123,178,91,13,143],"quorum_type":106}}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.856697924Z_GetProtocolVersionUpgradeVoteStatusRequest_44e38c7d942ddc931c62af824bd8b82332900ef1b64ea14bca39c294407dfce1.json b/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.856697924Z_GetProtocolVersionUpgradeVoteStatusRequest_44e38c7d942ddc931c62af824bd8b82332900ef1b64ea14bca39c294407dfce1.json deleted file mode 100644 index 1240e0353b..0000000000 --- a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.856697924Z_GetProtocolVersionUpgradeVoteStatusRequest_44e38c7d942ddc931c62af824bd8b82332900ef1b64ea14bca39c294407dfce1.json +++ /dev/null @@ -1 +0,0 @@ -{"request":{"version":{"v0":{"start_pro_tx_hash":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"count":100,"prove":true}}},"response":{"version":{"v0":{"metadata":{"height":"496","core_chain_locked_height":1626,"epoch":20,"time_ms":"1700762179839","protocol_version":1,"chain_id":"dashmate_local_36"},"result":{"proof":{"grovedb_proof":[1,2,122,3,32,32,61,206,159,132,120,24,255,130,88,128,169,159,65,68,200,248,97,166,108,115,34,32,101,252,57,131,15,0,136,128,136,0,4,0,1,1,0,3,32,116,92,159,20,113,73,103,94,47,194,55,81,85,32,107,47,22,240,65,26,188,84,112,171,23,101,1,233,32,217,211,247,0,4,0,1,1,0,16,3,32,249,3,128,182,199,88,47,32,155,199,150,145,142,156,213,89,1,46,71,34,22,95,107,145,132,103,162,32,104,134,47,187,0,4,0,1,1,0,17,1,107,1,87,179,244,56,7,185,118,146,239,15,211,218,0,164,145,194,126,141,143,128,151,182,242,30,26,24,123,92,97,194,72,70,4,1,1,0,36,2,1,32,116,92,159,20,113,73,103,94,47,194,55,81,85,32,107,47,22,240,65,26,188,84,112,171,23,101,1,233,32,217,211,247,0,229,149,70,100,255,25,235,252,87,188,224,163,221,159,166,171,225,167,241,8,232,224,215,203,245,176,82,242,42,230,98,252,16,1,212,1,1,62,210,128,237,157,173,255,118,46,120,226,35,148,9,65,38,159,144,75,61,235,31,132,201,170,187,200,81,86,89,44,191,2,204,254,253,193,45,87,201,63,108,140,98,61,225,223,229,34,208,158,221,141,103,228,168,52,16,123,83,68,64,77,155,5,16,1,195,54,53,19,110,80,46,154,197,36,75,21,162,10,117,126,7,89,206,10,144,130,60,211,127,137,63,106,73,85,109,38,2,175,176,44,68,76,56,6,20,24,225,142,11,24,240,97,207,172,108,43,27,213,168,19,76,75,136,52,164,207,181,28,182,16,2,47,142,242,39,38,151,132,161,102,144,3,59,141,22,75,155,233,170,192,212,68,76,152,175,85,13,163,2,172,135,30,206,4,1,120,0,5,2,1,1,1,0,150,65,61,70,201,175,111,254,234,207,149,180,10,78,122,36,240,226,133,34,18,35,237,29,21,18,206,162,50,132,239,75,17,17,17],"quorum_hash":[34,153,131,64,66,147,240,32,92,27,189,141,240,96,197,152,58,71,115,107,141,84,31,116,141,45,108,40,72,130,129,16],"signature":[174,87,124,110,58,18,45,93,176,103,34,219,129,77,125,251,0,53,179,205,179,163,119,132,75,182,206,115,169,66,222,75,198,129,190,101,113,107,51,62,162,87,240,206,131,7,138,231,23,70,191,154,140,213,120,181,9,103,29,43,59,23,216,243,250,247,119,189,35,250,91,188,166,212,93,12,141,145,56,165,17,132,55,145,100,16,15,244,67,185,168,147,200,242,10,127],"round":0,"block_id_hash":[243,30,197,193,10,25,24,84,159,94,166,75,60,223,157,239,84,145,165,182,253,74,253,86,248,192,23,123,178,91,13,143],"quorum_type":106}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.857223575Z_GetProtocolVersionUpgradeVoteStatusRequest_cba09aff3f31ba1e6ec0092c331cd7c8b0ccf4a3b7755f5e0c013bfcc6fdd875.json b/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.857223575Z_GetProtocolVersionUpgradeVoteStatusRequest_cba09aff3f31ba1e6ec0092c331cd7c8b0ccf4a3b7755f5e0c013bfcc6fdd875.json deleted file mode 100644 index a3ca4d421c..0000000000 --- a/packages/rs-sdk/tests/vectors/msg_2023-11-23T17:56:30.857223575Z_GetProtocolVersionUpgradeVoteStatusRequest_cba09aff3f31ba1e6ec0092c331cd7c8b0ccf4a3b7755f5e0c013bfcc6fdd875.json +++ /dev/null @@ -1 +0,0 @@ -{"request":{"version":{"v0":{"start_pro_tx_hash":[255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255],"count":2,"prove":true}}},"response":{"version":{"v0":{"metadata":{"height":"496","core_chain_locked_height":1626,"epoch":20,"time_ms":"1700762179839","protocol_version":1,"chain_id":"dashmate_local_36"},"result":{"proof":{"grovedb_proof":[1,2,134,1,1,161,219,22,0,66,99,196,6,243,54,207,249,53,252,200,187,124,207,150,6,22,152,19,251,93,137,154,53,69,178,98,29,2,56,191,208,4,142,126,182,39,196,192,118,7,244,184,110,57,78,171,160,9,112,207,130,95,189,244,144,144,80,35,71,138,16,5,32,249,3,128,182,199,88,47,32,155,199,150,145,142,156,213,89,1,46,71,34,22,95,107,145,132,103,162,32,104,134,47,187,134,208,129,143,44,58,251,182,33,149,93,185,128,19,188,203,221,6,231,146,203,222,239,97,167,187,155,105,222,240,200,215,17,1,107,1,87,179,244,56,7,185,118,146,239,15,211,218,0,164,145,194,126,141,143,128,151,182,242,30,26,24,123,92,97,194,72,70,4,1,1,0,36,2,1,32,116,92,159,20,113,73,103,94,47,194,55,81,85,32,107,47,22,240,65,26,188,84,112,171,23,101,1,233,32,217,211,247,0,229,149,70,100,255,25,235,252,87,188,224,163,221,159,166,171,225,167,241,8,232,224,215,203,245,176,82,242,42,230,98,252,16,1,212,1,1,62,210,128,237,157,173,255,118,46,120,226,35,148,9,65,38,159,144,75,61,235,31,132,201,170,187,200,81,86,89,44,191,2,204,254,253,193,45,87,201,63,108,140,98,61,225,223,229,34,208,158,221,141,103,228,168,52,16,123,83,68,64,77,155,5,16,1,195,54,53,19,110,80,46,154,197,36,75,21,162,10,117,126,7,89,206,10,144,130,60,211,127,137,63,106,73,85,109,38,2,175,176,44,68,76,56,6,20,24,225,142,11,24,240,97,207,172,108,43,27,213,168,19,76,75,136,52,164,207,181,28,182,16,2,47,142,242,39,38,151,132,161,102,144,3,59,141,22,75,155,233,170,192,212,68,76,152,175,85,13,163,2,172,135,30,206,4,1,120,0,5,2,1,1,1,0,150,65,61,70,201,175,111,254,234,207,149,180,10,78,122,36,240,226,133,34,18,35,237,29,21,18,206,162,50,132,239,75,17,17,17],"quorum_hash":[34,153,131,64,66,147,240,32,92,27,189,141,240,96,197,152,58,71,115,107,141,84,31,116,141,45,108,40,72,130,129,16],"signature":[174,87,124,110,58,18,45,93,176,103,34,219,129,77,125,251,0,53,179,205,179,163,119,132,75,182,206,115,169,66,222,75,198,129,190,101,113,107,51,62,162,87,240,206,131,7,138,231,23,70,191,154,140,213,120,181,9,103,29,43,59,23,216,243,250,247,119,189,35,250,91,188,166,212,93,12,141,145,56,165,17,132,55,145,100,16,15,244,67,185,168,147,200,242,10,127],"round":0,"block_id_hash":[243,30,197,193,10,25,24,84,159,94,166,75,60,223,157,239,84,145,165,182,253,74,253,86,248,192,23,123,178,91,13,143],"quorum_type":106}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:15.778699353Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json b/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:15.778699353Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json deleted file mode 100644 index 6da7db8093..0000000000 --- a/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:15.778699353Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json +++ /dev/null @@ -1 +0,0 @@ -{"request":{"version":{"v0":{"id":[48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172],"prove":true}}},"response":{"version":{"v0":{"metadata":{"height":"399","core_chain_locked_height":1588,"epoch":17,"time_ms":"1701186367912","protocol_version":1,"chain_id":"dashmate_local_35"},"result":{"proof":{"grovedb_proof":[1,1,198,2,1,98,47,81,170,142,110,105,167,245,70,76,165,89,129,240,133,176,58,44,104,42,111,4,126,71,140,147,66,193,24,255,114,4,1,32,0,36,2,1,32,159,101,165,10,103,89,107,118,134,35,62,205,14,245,130,168,86,190,41,247,139,113,170,202,91,69,135,242,242,219,97,152,0,170,248,227,132,247,178,161,4,232,51,133,61,28,97,218,226,181,20,216,124,38,73,160,174,147,91,5,84,177,199,9,213,16,1,180,197,101,53,206,21,50,38,152,10,25,240,13,129,131,128,210,135,203,6,130,149,228,81,190,116,110,230,129,134,53,155,17,2,204,254,253,193,45,87,201,63,108,140,98,61,225,223,229,34,208,158,221,141,103,228,168,52,16,123,83,68,64,77,155,5,16,1,195,54,53,19,110,80,46,154,197,36,75,21,162,10,117,126,7,89,206,10,144,130,60,211,127,137,63,106,73,85,109,38,4,1,96,0,45,4,1,32,159,101,165,10,103,89,107,118,134,35,62,205,14,245,130,168,86,190,41,247,139,113,170,202,91,69,135,242,242,219,97,152,253,0,116,252,183,75,154,0,0,0,113,74,127,73,101,189,31,217,214,4,57,100,210,215,114,108,162,3,2,148,223,117,106,188,172,177,141,123,227,81,211,177,16,1,128,96,231,162,226,108,2,94,140,120,176,49,177,10,7,157,195,202,27,37,131,207,174,36,82,148,129,116,70,158,156,2,17,17,1,247,1,4,32,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,0,9,2,1,1,2,1,3,0,0,0,147,44,169,41,89,138,187,109,179,223,164,173,251,188,30,5,193,17,125,230,165,79,95,129,192,255,247,183,248,130,11,127,1,207,145,33,155,181,151,153,234,247,10,107,147,191,8,250,89,1,87,208,72,46,99,152,219,69,191,153,38,116,87,240,26,17,2,188,56,238,209,103,207,163,74,91,179,80,187,245,244,119,112,46,53,5,55,185,116,123,148,188,110,10,156,255,184,161,230,16,1,165,11,155,131,238,228,237,231,206,198,117,129,22,130,89,177,203,28,178,48,127,9,232,55,224,144,114,109,195,236,102,196,17,2,71,134,252,43,28,34,125,43,96,20,45,216,7,117,56,163,2,54,249,33,30,8,97,181,133,247,198,4,14,168,222,180,16,1,253,149,23,63,99,83,217,70,73,145,56,150,148,41,134,194,159,29,139,8,25,21,70,157,96,71,231,72,225,115,151,178,17,1,127,3,1,0,0,11,0,8,0,0,0,0,0,0,0,0,0,4,1,1,0,5,2,1,1,1,0,16,225,21,118,101,134,70,47,103,158,127,6,179,151,197,124,233,214,249,18,65,72,139,138,50,18,118,221,182,13,131,146,16,2,194,9,205,84,213,124,81,201,239,161,86,228,38,75,126,158,141,25,64,89,251,71,61,126,130,248,159,225,40,157,158,188,16,1,70,25,123,162,209,216,154,230,95,14,56,180,32,113,102,210,182,213,32,20,204,112,76,86,112,130,191,29,189,101,249,223,17,2,101,3,1,0,0,45,0,42,0,0,0,0,0,0,0,33,2,67,47,12,14,41,81,212,255,222,72,159,230,209,27,71,17,62,219,159,235,141,240,77,10,88,255,146,191,158,42,3,116,0,0,3,1,1,0,45,0,42,0,1,0,2,0,0,0,33,2,239,132,159,154,2,108,129,219,17,98,41,180,68,164,141,141,196,24,179,198,239,112,12,170,24,76,39,60,130,6,64,245,0,0,16,2,241,1,4,32,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,0,3,3,0,0,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,1,37,155,21,15,26,155,182,157,94,11,89,145,155,140,155,110,36,232,229,5,196,191,250,6,77,83,25,51,98,20,105,73,17,2,137,55,32,169,123,196,47,111,55,237,142,237,212,151,35,145,129,149,32,86,123,54,68,188,209,146,213,120,53,25,205,45,16,1,130,30,123,13,165,76,200,110,180,125,15,29,148,215,119,226,252,19,105,124,251,151,73,162,22,119,179,249,171,70,68,38,17,2,200,105,64,185,61,22,4,50,132,43,124,194,103,27,115,224,42,137,43,3,126,236,116,160,160,163,177,241,106,191,211,113,16,1,142,88,58,139,31,171,189,155,188,152,82,29,125,16,59,205,139,30,155,166,123,174,220,72,92,252,205,34,221,235,160,96,17],"quorum_hash":[123,144,176,163,196,242,87,123,128,135,83,39,239,120,32,29,65,52,87,220,144,181,236,210,79,66,137,151,63,54,118,157],"signature":[135,79,175,135,193,164,119,151,151,131,174,141,163,69,181,24,215,204,61,237,255,196,70,134,97,121,7,76,147,43,53,250,205,78,147,152,89,222,11,4,154,93,54,197,21,5,99,252,25,79,86,31,22,214,27,140,137,211,133,232,3,222,209,123,214,14,13,3,183,33,37,173,168,248,45,164,69,68,20,188,229,210,130,6,194,49,120,112,19,187,20,221,0,37,34,56],"round":0,"block_id_hash":[0,12,135,39,153,35,126,250,186,177,14,99,228,202,68,226,184,146,126,77,169,28,238,236,54,202,65,171,20,63,25,2],"quorum_type":106}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:15.796630936Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json b/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:15.796630936Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json deleted file mode 100644 index 6da7db8093..0000000000 --- a/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:15.796630936Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json +++ /dev/null @@ -1 +0,0 @@ -{"request":{"version":{"v0":{"id":[48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172],"prove":true}}},"response":{"version":{"v0":{"metadata":{"height":"399","core_chain_locked_height":1588,"epoch":17,"time_ms":"1701186367912","protocol_version":1,"chain_id":"dashmate_local_35"},"result":{"proof":{"grovedb_proof":[1,1,198,2,1,98,47,81,170,142,110,105,167,245,70,76,165,89,129,240,133,176,58,44,104,42,111,4,126,71,140,147,66,193,24,255,114,4,1,32,0,36,2,1,32,159,101,165,10,103,89,107,118,134,35,62,205,14,245,130,168,86,190,41,247,139,113,170,202,91,69,135,242,242,219,97,152,0,170,248,227,132,247,178,161,4,232,51,133,61,28,97,218,226,181,20,216,124,38,73,160,174,147,91,5,84,177,199,9,213,16,1,180,197,101,53,206,21,50,38,152,10,25,240,13,129,131,128,210,135,203,6,130,149,228,81,190,116,110,230,129,134,53,155,17,2,204,254,253,193,45,87,201,63,108,140,98,61,225,223,229,34,208,158,221,141,103,228,168,52,16,123,83,68,64,77,155,5,16,1,195,54,53,19,110,80,46,154,197,36,75,21,162,10,117,126,7,89,206,10,144,130,60,211,127,137,63,106,73,85,109,38,4,1,96,0,45,4,1,32,159,101,165,10,103,89,107,118,134,35,62,205,14,245,130,168,86,190,41,247,139,113,170,202,91,69,135,242,242,219,97,152,253,0,116,252,183,75,154,0,0,0,113,74,127,73,101,189,31,217,214,4,57,100,210,215,114,108,162,3,2,148,223,117,106,188,172,177,141,123,227,81,211,177,16,1,128,96,231,162,226,108,2,94,140,120,176,49,177,10,7,157,195,202,27,37,131,207,174,36,82,148,129,116,70,158,156,2,17,17,1,247,1,4,32,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,0,9,2,1,1,2,1,3,0,0,0,147,44,169,41,89,138,187,109,179,223,164,173,251,188,30,5,193,17,125,230,165,79,95,129,192,255,247,183,248,130,11,127,1,207,145,33,155,181,151,153,234,247,10,107,147,191,8,250,89,1,87,208,72,46,99,152,219,69,191,153,38,116,87,240,26,17,2,188,56,238,209,103,207,163,74,91,179,80,187,245,244,119,112,46,53,5,55,185,116,123,148,188,110,10,156,255,184,161,230,16,1,165,11,155,131,238,228,237,231,206,198,117,129,22,130,89,177,203,28,178,48,127,9,232,55,224,144,114,109,195,236,102,196,17,2,71,134,252,43,28,34,125,43,96,20,45,216,7,117,56,163,2,54,249,33,30,8,97,181,133,247,198,4,14,168,222,180,16,1,253,149,23,63,99,83,217,70,73,145,56,150,148,41,134,194,159,29,139,8,25,21,70,157,96,71,231,72,225,115,151,178,17,1,127,3,1,0,0,11,0,8,0,0,0,0,0,0,0,0,0,4,1,1,0,5,2,1,1,1,0,16,225,21,118,101,134,70,47,103,158,127,6,179,151,197,124,233,214,249,18,65,72,139,138,50,18,118,221,182,13,131,146,16,2,194,9,205,84,213,124,81,201,239,161,86,228,38,75,126,158,141,25,64,89,251,71,61,126,130,248,159,225,40,157,158,188,16,1,70,25,123,162,209,216,154,230,95,14,56,180,32,113,102,210,182,213,32,20,204,112,76,86,112,130,191,29,189,101,249,223,17,2,101,3,1,0,0,45,0,42,0,0,0,0,0,0,0,33,2,67,47,12,14,41,81,212,255,222,72,159,230,209,27,71,17,62,219,159,235,141,240,77,10,88,255,146,191,158,42,3,116,0,0,3,1,1,0,45,0,42,0,1,0,2,0,0,0,33,2,239,132,159,154,2,108,129,219,17,98,41,180,68,164,141,141,196,24,179,198,239,112,12,170,24,76,39,60,130,6,64,245,0,0,16,2,241,1,4,32,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,0,3,3,0,0,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,1,37,155,21,15,26,155,182,157,94,11,89,145,155,140,155,110,36,232,229,5,196,191,250,6,77,83,25,51,98,20,105,73,17,2,137,55,32,169,123,196,47,111,55,237,142,237,212,151,35,145,129,149,32,86,123,54,68,188,209,146,213,120,53,25,205,45,16,1,130,30,123,13,165,76,200,110,180,125,15,29,148,215,119,226,252,19,105,124,251,151,73,162,22,119,179,249,171,70,68,38,17,2,200,105,64,185,61,22,4,50,132,43,124,194,103,27,115,224,42,137,43,3,126,236,116,160,160,163,177,241,106,191,211,113,16,1,142,88,58,139,31,171,189,155,188,152,82,29,125,16,59,205,139,30,155,166,123,174,220,72,92,252,205,34,221,235,160,96,17],"quorum_hash":[123,144,176,163,196,242,87,123,128,135,83,39,239,120,32,29,65,52,87,220,144,181,236,210,79,66,137,151,63,54,118,157],"signature":[135,79,175,135,193,164,119,151,151,131,174,141,163,69,181,24,215,204,61,237,255,196,70,134,97,121,7,76,147,43,53,250,205,78,147,152,89,222,11,4,154,93,54,197,21,5,99,252,25,79,86,31,22,214,27,140,137,211,133,232,3,222,209,123,214,14,13,3,183,33,37,173,168,248,45,164,69,68,20,188,229,210,130,6,194,49,120,112,19,187,20,221,0,37,34,56],"round":0,"block_id_hash":[0,12,135,39,153,35,126,250,186,177,14,99,228,202,68,226,184,146,126,77,169,28,238,236,54,202,65,171,20,63,25,2],"quorum_type":106}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:15.800193897Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json b/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:15.800193897Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json deleted file mode 100644 index 6da7db8093..0000000000 --- a/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:15.800193897Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json +++ /dev/null @@ -1 +0,0 @@ -{"request":{"version":{"v0":{"id":[48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172],"prove":true}}},"response":{"version":{"v0":{"metadata":{"height":"399","core_chain_locked_height":1588,"epoch":17,"time_ms":"1701186367912","protocol_version":1,"chain_id":"dashmate_local_35"},"result":{"proof":{"grovedb_proof":[1,1,198,2,1,98,47,81,170,142,110,105,167,245,70,76,165,89,129,240,133,176,58,44,104,42,111,4,126,71,140,147,66,193,24,255,114,4,1,32,0,36,2,1,32,159,101,165,10,103,89,107,118,134,35,62,205,14,245,130,168,86,190,41,247,139,113,170,202,91,69,135,242,242,219,97,152,0,170,248,227,132,247,178,161,4,232,51,133,61,28,97,218,226,181,20,216,124,38,73,160,174,147,91,5,84,177,199,9,213,16,1,180,197,101,53,206,21,50,38,152,10,25,240,13,129,131,128,210,135,203,6,130,149,228,81,190,116,110,230,129,134,53,155,17,2,204,254,253,193,45,87,201,63,108,140,98,61,225,223,229,34,208,158,221,141,103,228,168,52,16,123,83,68,64,77,155,5,16,1,195,54,53,19,110,80,46,154,197,36,75,21,162,10,117,126,7,89,206,10,144,130,60,211,127,137,63,106,73,85,109,38,4,1,96,0,45,4,1,32,159,101,165,10,103,89,107,118,134,35,62,205,14,245,130,168,86,190,41,247,139,113,170,202,91,69,135,242,242,219,97,152,253,0,116,252,183,75,154,0,0,0,113,74,127,73,101,189,31,217,214,4,57,100,210,215,114,108,162,3,2,148,223,117,106,188,172,177,141,123,227,81,211,177,16,1,128,96,231,162,226,108,2,94,140,120,176,49,177,10,7,157,195,202,27,37,131,207,174,36,82,148,129,116,70,158,156,2,17,17,1,247,1,4,32,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,0,9,2,1,1,2,1,3,0,0,0,147,44,169,41,89,138,187,109,179,223,164,173,251,188,30,5,193,17,125,230,165,79,95,129,192,255,247,183,248,130,11,127,1,207,145,33,155,181,151,153,234,247,10,107,147,191,8,250,89,1,87,208,72,46,99,152,219,69,191,153,38,116,87,240,26,17,2,188,56,238,209,103,207,163,74,91,179,80,187,245,244,119,112,46,53,5,55,185,116,123,148,188,110,10,156,255,184,161,230,16,1,165,11,155,131,238,228,237,231,206,198,117,129,22,130,89,177,203,28,178,48,127,9,232,55,224,144,114,109,195,236,102,196,17,2,71,134,252,43,28,34,125,43,96,20,45,216,7,117,56,163,2,54,249,33,30,8,97,181,133,247,198,4,14,168,222,180,16,1,253,149,23,63,99,83,217,70,73,145,56,150,148,41,134,194,159,29,139,8,25,21,70,157,96,71,231,72,225,115,151,178,17,1,127,3,1,0,0,11,0,8,0,0,0,0,0,0,0,0,0,4,1,1,0,5,2,1,1,1,0,16,225,21,118,101,134,70,47,103,158,127,6,179,151,197,124,233,214,249,18,65,72,139,138,50,18,118,221,182,13,131,146,16,2,194,9,205,84,213,124,81,201,239,161,86,228,38,75,126,158,141,25,64,89,251,71,61,126,130,248,159,225,40,157,158,188,16,1,70,25,123,162,209,216,154,230,95,14,56,180,32,113,102,210,182,213,32,20,204,112,76,86,112,130,191,29,189,101,249,223,17,2,101,3,1,0,0,45,0,42,0,0,0,0,0,0,0,33,2,67,47,12,14,41,81,212,255,222,72,159,230,209,27,71,17,62,219,159,235,141,240,77,10,88,255,146,191,158,42,3,116,0,0,3,1,1,0,45,0,42,0,1,0,2,0,0,0,33,2,239,132,159,154,2,108,129,219,17,98,41,180,68,164,141,141,196,24,179,198,239,112,12,170,24,76,39,60,130,6,64,245,0,0,16,2,241,1,4,32,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,0,3,3,0,0,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,1,37,155,21,15,26,155,182,157,94,11,89,145,155,140,155,110,36,232,229,5,196,191,250,6,77,83,25,51,98,20,105,73,17,2,137,55,32,169,123,196,47,111,55,237,142,237,212,151,35,145,129,149,32,86,123,54,68,188,209,146,213,120,53,25,205,45,16,1,130,30,123,13,165,76,200,110,180,125,15,29,148,215,119,226,252,19,105,124,251,151,73,162,22,119,179,249,171,70,68,38,17,2,200,105,64,185,61,22,4,50,132,43,124,194,103,27,115,224,42,137,43,3,126,236,116,160,160,163,177,241,106,191,211,113,16,1,142,88,58,139,31,171,189,155,188,152,82,29,125,16,59,205,139,30,155,166,123,174,220,72,92,252,205,34,221,235,160,96,17],"quorum_hash":[123,144,176,163,196,242,87,123,128,135,83,39,239,120,32,29,65,52,87,220,144,181,236,210,79,66,137,151,63,54,118,157],"signature":[135,79,175,135,193,164,119,151,151,131,174,141,163,69,181,24,215,204,61,237,255,196,70,134,97,121,7,76,147,43,53,250,205,78,147,152,89,222,11,4,154,93,54,197,21,5,99,252,25,79,86,31,22,214,27,140,137,211,133,232,3,222,209,123,214,14,13,3,183,33,37,173,168,248,45,164,69,68,20,188,229,210,130,6,194,49,120,112,19,187,20,221,0,37,34,56],"round":0,"block_id_hash":[0,12,135,39,153,35,126,250,186,177,14,99,228,202,68,226,184,146,126,77,169,28,238,236,54,202,65,171,20,63,25,2],"quorum_type":106}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:15.800233442Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json b/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:15.800233442Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json deleted file mode 100644 index 6da7db8093..0000000000 --- a/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:15.800233442Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json +++ /dev/null @@ -1 +0,0 @@ -{"request":{"version":{"v0":{"id":[48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172],"prove":true}}},"response":{"version":{"v0":{"metadata":{"height":"399","core_chain_locked_height":1588,"epoch":17,"time_ms":"1701186367912","protocol_version":1,"chain_id":"dashmate_local_35"},"result":{"proof":{"grovedb_proof":[1,1,198,2,1,98,47,81,170,142,110,105,167,245,70,76,165,89,129,240,133,176,58,44,104,42,111,4,126,71,140,147,66,193,24,255,114,4,1,32,0,36,2,1,32,159,101,165,10,103,89,107,118,134,35,62,205,14,245,130,168,86,190,41,247,139,113,170,202,91,69,135,242,242,219,97,152,0,170,248,227,132,247,178,161,4,232,51,133,61,28,97,218,226,181,20,216,124,38,73,160,174,147,91,5,84,177,199,9,213,16,1,180,197,101,53,206,21,50,38,152,10,25,240,13,129,131,128,210,135,203,6,130,149,228,81,190,116,110,230,129,134,53,155,17,2,204,254,253,193,45,87,201,63,108,140,98,61,225,223,229,34,208,158,221,141,103,228,168,52,16,123,83,68,64,77,155,5,16,1,195,54,53,19,110,80,46,154,197,36,75,21,162,10,117,126,7,89,206,10,144,130,60,211,127,137,63,106,73,85,109,38,4,1,96,0,45,4,1,32,159,101,165,10,103,89,107,118,134,35,62,205,14,245,130,168,86,190,41,247,139,113,170,202,91,69,135,242,242,219,97,152,253,0,116,252,183,75,154,0,0,0,113,74,127,73,101,189,31,217,214,4,57,100,210,215,114,108,162,3,2,148,223,117,106,188,172,177,141,123,227,81,211,177,16,1,128,96,231,162,226,108,2,94,140,120,176,49,177,10,7,157,195,202,27,37,131,207,174,36,82,148,129,116,70,158,156,2,17,17,1,247,1,4,32,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,0,9,2,1,1,2,1,3,0,0,0,147,44,169,41,89,138,187,109,179,223,164,173,251,188,30,5,193,17,125,230,165,79,95,129,192,255,247,183,248,130,11,127,1,207,145,33,155,181,151,153,234,247,10,107,147,191,8,250,89,1,87,208,72,46,99,152,219,69,191,153,38,116,87,240,26,17,2,188,56,238,209,103,207,163,74,91,179,80,187,245,244,119,112,46,53,5,55,185,116,123,148,188,110,10,156,255,184,161,230,16,1,165,11,155,131,238,228,237,231,206,198,117,129,22,130,89,177,203,28,178,48,127,9,232,55,224,144,114,109,195,236,102,196,17,2,71,134,252,43,28,34,125,43,96,20,45,216,7,117,56,163,2,54,249,33,30,8,97,181,133,247,198,4,14,168,222,180,16,1,253,149,23,63,99,83,217,70,73,145,56,150,148,41,134,194,159,29,139,8,25,21,70,157,96,71,231,72,225,115,151,178,17,1,127,3,1,0,0,11,0,8,0,0,0,0,0,0,0,0,0,4,1,1,0,5,2,1,1,1,0,16,225,21,118,101,134,70,47,103,158,127,6,179,151,197,124,233,214,249,18,65,72,139,138,50,18,118,221,182,13,131,146,16,2,194,9,205,84,213,124,81,201,239,161,86,228,38,75,126,158,141,25,64,89,251,71,61,126,130,248,159,225,40,157,158,188,16,1,70,25,123,162,209,216,154,230,95,14,56,180,32,113,102,210,182,213,32,20,204,112,76,86,112,130,191,29,189,101,249,223,17,2,101,3,1,0,0,45,0,42,0,0,0,0,0,0,0,33,2,67,47,12,14,41,81,212,255,222,72,159,230,209,27,71,17,62,219,159,235,141,240,77,10,88,255,146,191,158,42,3,116,0,0,3,1,1,0,45,0,42,0,1,0,2,0,0,0,33,2,239,132,159,154,2,108,129,219,17,98,41,180,68,164,141,141,196,24,179,198,239,112,12,170,24,76,39,60,130,6,64,245,0,0,16,2,241,1,4,32,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,0,3,3,0,0,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,1,37,155,21,15,26,155,182,157,94,11,89,145,155,140,155,110,36,232,229,5,196,191,250,6,77,83,25,51,98,20,105,73,17,2,137,55,32,169,123,196,47,111,55,237,142,237,212,151,35,145,129,149,32,86,123,54,68,188,209,146,213,120,53,25,205,45,16,1,130,30,123,13,165,76,200,110,180,125,15,29,148,215,119,226,252,19,105,124,251,151,73,162,22,119,179,249,171,70,68,38,17,2,200,105,64,185,61,22,4,50,132,43,124,194,103,27,115,224,42,137,43,3,126,236,116,160,160,163,177,241,106,191,211,113,16,1,142,88,58,139,31,171,189,155,188,152,82,29,125,16,59,205,139,30,155,166,123,174,220,72,92,252,205,34,221,235,160,96,17],"quorum_hash":[123,144,176,163,196,242,87,123,128,135,83,39,239,120,32,29,65,52,87,220,144,181,236,210,79,66,137,151,63,54,118,157],"signature":[135,79,175,135,193,164,119,151,151,131,174,141,163,69,181,24,215,204,61,237,255,196,70,134,97,121,7,76,147,43,53,250,205,78,147,152,89,222,11,4,154,93,54,197,21,5,99,252,25,79,86,31,22,214,27,140,137,211,133,232,3,222,209,123,214,14,13,3,183,33,37,173,168,248,45,164,69,68,20,188,229,210,130,6,194,49,120,112,19,187,20,221,0,37,34,56],"round":0,"block_id_hash":[0,12,135,39,153,35,126,250,186,177,14,99,228,202,68,226,184,146,126,77,169,28,238,236,54,202,65,171,20,63,25,2],"quorum_type":106}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:15.800635171Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json b/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:15.800635171Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json deleted file mode 100644 index 6da7db8093..0000000000 --- a/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:15.800635171Z_GetIdentityRequest_286cb4d90a7df242060f38522bb1f53264482cc34d82cf95e06bfa0b608c1dbd.json +++ /dev/null @@ -1 +0,0 @@ -{"request":{"version":{"v0":{"id":[48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172],"prove":true}}},"response":{"version":{"v0":{"metadata":{"height":"399","core_chain_locked_height":1588,"epoch":17,"time_ms":"1701186367912","protocol_version":1,"chain_id":"dashmate_local_35"},"result":{"proof":{"grovedb_proof":[1,1,198,2,1,98,47,81,170,142,110,105,167,245,70,76,165,89,129,240,133,176,58,44,104,42,111,4,126,71,140,147,66,193,24,255,114,4,1,32,0,36,2,1,32,159,101,165,10,103,89,107,118,134,35,62,205,14,245,130,168,86,190,41,247,139,113,170,202,91,69,135,242,242,219,97,152,0,170,248,227,132,247,178,161,4,232,51,133,61,28,97,218,226,181,20,216,124,38,73,160,174,147,91,5,84,177,199,9,213,16,1,180,197,101,53,206,21,50,38,152,10,25,240,13,129,131,128,210,135,203,6,130,149,228,81,190,116,110,230,129,134,53,155,17,2,204,254,253,193,45,87,201,63,108,140,98,61,225,223,229,34,208,158,221,141,103,228,168,52,16,123,83,68,64,77,155,5,16,1,195,54,53,19,110,80,46,154,197,36,75,21,162,10,117,126,7,89,206,10,144,130,60,211,127,137,63,106,73,85,109,38,4,1,96,0,45,4,1,32,159,101,165,10,103,89,107,118,134,35,62,205,14,245,130,168,86,190,41,247,139,113,170,202,91,69,135,242,242,219,97,152,253,0,116,252,183,75,154,0,0,0,113,74,127,73,101,189,31,217,214,4,57,100,210,215,114,108,162,3,2,148,223,117,106,188,172,177,141,123,227,81,211,177,16,1,128,96,231,162,226,108,2,94,140,120,176,49,177,10,7,157,195,202,27,37,131,207,174,36,82,148,129,116,70,158,156,2,17,17,1,247,1,4,32,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,0,9,2,1,1,2,1,3,0,0,0,147,44,169,41,89,138,187,109,179,223,164,173,251,188,30,5,193,17,125,230,165,79,95,129,192,255,247,183,248,130,11,127,1,207,145,33,155,181,151,153,234,247,10,107,147,191,8,250,89,1,87,208,72,46,99,152,219,69,191,153,38,116,87,240,26,17,2,188,56,238,209,103,207,163,74,91,179,80,187,245,244,119,112,46,53,5,55,185,116,123,148,188,110,10,156,255,184,161,230,16,1,165,11,155,131,238,228,237,231,206,198,117,129,22,130,89,177,203,28,178,48,127,9,232,55,224,144,114,109,195,236,102,196,17,2,71,134,252,43,28,34,125,43,96,20,45,216,7,117,56,163,2,54,249,33,30,8,97,181,133,247,198,4,14,168,222,180,16,1,253,149,23,63,99,83,217,70,73,145,56,150,148,41,134,194,159,29,139,8,25,21,70,157,96,71,231,72,225,115,151,178,17,1,127,3,1,0,0,11,0,8,0,0,0,0,0,0,0,0,0,4,1,1,0,5,2,1,1,1,0,16,225,21,118,101,134,70,47,103,158,127,6,179,151,197,124,233,214,249,18,65,72,139,138,50,18,118,221,182,13,131,146,16,2,194,9,205,84,213,124,81,201,239,161,86,228,38,75,126,158,141,25,64,89,251,71,61,126,130,248,159,225,40,157,158,188,16,1,70,25,123,162,209,216,154,230,95,14,56,180,32,113,102,210,182,213,32,20,204,112,76,86,112,130,191,29,189,101,249,223,17,2,101,3,1,0,0,45,0,42,0,0,0,0,0,0,0,33,2,67,47,12,14,41,81,212,255,222,72,159,230,209,27,71,17,62,219,159,235,141,240,77,10,88,255,146,191,158,42,3,116,0,0,3,1,1,0,45,0,42,0,1,0,2,0,0,0,33,2,239,132,159,154,2,108,129,219,17,98,41,180,68,164,141,141,196,24,179,198,239,112,12,170,24,76,39,60,130,6,64,245,0,0,16,2,241,1,4,32,48,18,193,155,152,236,0,51,173,219,54,205,100,183,245,16,103,15,42,53,26,67,4,181,246,153,65,68,40,110,253,172,0,3,3,0,0,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,1,37,155,21,15,26,155,182,157,94,11,89,145,155,140,155,110,36,232,229,5,196,191,250,6,77,83,25,51,98,20,105,73,17,2,137,55,32,169,123,196,47,111,55,237,142,237,212,151,35,145,129,149,32,86,123,54,68,188,209,146,213,120,53,25,205,45,16,1,130,30,123,13,165,76,200,110,180,125,15,29,148,215,119,226,252,19,105,124,251,151,73,162,22,119,179,249,171,70,68,38,17,2,200,105,64,185,61,22,4,50,132,43,124,194,103,27,115,224,42,137,43,3,126,236,116,160,160,163,177,241,106,191,211,113,16,1,142,88,58,139,31,171,189,155,188,152,82,29,125,16,59,205,139,30,155,166,123,174,220,72,92,252,205,34,221,235,160,96,17],"quorum_hash":[123,144,176,163,196,242,87,123,128,135,83,39,239,120,32,29,65,52,87,220,144,181,236,210,79,66,137,151,63,54,118,157],"signature":[135,79,175,135,193,164,119,151,151,131,174,141,163,69,181,24,215,204,61,237,255,196,70,134,97,121,7,76,147,43,53,250,205,78,147,152,89,222,11,4,154,93,54,197,21,5,99,252,25,79,86,31,22,214,27,140,137,211,133,232,3,222,209,123,214,14,13,3,183,33,37,173,168,248,45,164,69,68,20,188,229,210,130,6,194,49,120,112,19,187,20,221,0,37,34,56],"round":0,"block_id_hash":[0,12,135,39,153,35,126,250,186,177,14,99,228,202,68,226,184,146,126,77,169,28,238,236,54,202,65,171,20,63,25,2],"quorum_type":106}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:16.134231820Z_GetEpochsInfoRequest_73b10756ba7ed485a1871d443f8d0c59d00e38c1dddc2b0830c07efc7fdcf609.json b/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:16.134231820Z_GetEpochsInfoRequest_73b10756ba7ed485a1871d443f8d0c59d00e38c1dddc2b0830c07efc7fdcf609.json deleted file mode 100644 index 794d584722..0000000000 --- a/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:16.134231820Z_GetEpochsInfoRequest_73b10756ba7ed485a1871d443f8d0c59d00e38c1dddc2b0830c07efc7fdcf609.json +++ /dev/null @@ -1 +0,0 @@ -{"request":{"version":{"v0":{"start_epoch":null,"count":1,"ascending":false,"prove":true}}},"response":{"version":{"v0":{"metadata":{"height":"399","core_chain_locked_height":1588,"epoch":17,"time_ms":"1701186367912","protocol_version":1,"chain_id":"dashmate_local_35"},"result":{"proof":{"grovedb_proof":[1,1,235,10,8,93,11,115,64,99,183,98,191,128,222,174,23,51,243,40,235,130,83,182,229,49,246,195,142,100,106,12,230,161,172,231,94,9,158,157,119,17,95,11,196,154,163,54,224,247,166,32,166,92,79,15,118,149,141,210,174,154,218,148,6,35,17,101,86,3,18,8,179,123,188,33,159,23,169,11,16,15,59,46,248,160,3,37,184,146,32,253,15,197,90,225,158,210,111,153,249,23,2,0,9,154,5,62,225,30,128,178,64,33,202,63,233,137,158,86,237,243,245,65,26,248,20,186,8,206,93,221,184,137,162,96,150,18,8,180,170,47,137,51,49,170,136,202,126,234,174,152,9,115,248,192,66,103,39,133,142,179,26,4,248,143,191,126,200,242,172,9,172,177,41,228,39,111,209,8,184,123,95,144,213,119,90,128,203,226,131,61,75,159,120,96,87,56,128,93,159,212,217,208,18,8,164,128,8,125,216,154,45,212,158,117,13,4,169,178,223,159,7,196,14,55,218,64,77,145,158,211,169,174,142,217,68,233,9,202,186,194,241,214,185,85,123,169,229,5,25,6,251,1,203,81,97,123,96,230,211,8,29,104,253,238,108,216,128,137,101,18,8,118,107,97,59,85,96,165,128,104,23,54,130,168,102,167,80,212,176,103,42,228,56,64,40,104,43,30,194,157,65,111,107,9,70,51,197,1,30,9,104,84,148,110,7,43,251,46,4,157,152,174,10,96,98,134,248,12,172,209,97,41,248,15,250,73,18,8,141,200,188,139,218,6,116,70,168,179,98,249,233,72,39,246,87,76,204,114,158,217,61,70,21,183,105,34,147,81,226,91,9,204,86,123,246,60,112,184,151,67,217,250,234,123,0,159,16,163,16,135,141,18,76,225,179,55,69,199,223,161,95,84,163,18,8,143,163,130,5,10,51,73,231,144,7,223,119,86,10,105,102,92,200,113,88,99,119,100,114,151,91,238,75,123,201,130,232,9,214,133,214,97,203,126,194,30,3,243,48,119,63,4,90,202,246,179,75,59,177,118,242,68,119,141,22,175,221,127,238,223,18,8,81,131,126,28,217,23,155,231,159,63,57,7,215,33,47,59,46,213,59,145,238,173,208,203,230,172,8,80,14,66,64,98,9,195,224,5,63,134,39,212,34,218,230,179,120,70,183,157,141,63,81,155,55,70,204,193,209,195,113,191,185,108,124,179,85,18,8,153,26,62,65,217,53,14,54,236,253,57,173,126,242,47,21,23,201,233,112,199,54,179,165,138,42,80,58,35,95,35,205,11,2,1,17,0,6,4,1,1,115,0,0,178,191,172,84,197,162,6,66,11,37,59,122,225,28,172,33,154,33,132,164,161,116,13,236,71,182,73,127,230,251,111,70,18,11,2,1,16,0,6,4,1,1,116,0,0,99,255,217,43,21,202,175,140,246,213,248,108,95,181,119,229,61,192,196,3,81,16,237,94,74,147,5,219,186,19,35,35,19,19,19,11,2,1,15,0,6,4,1,1,116,0,0,122,126,37,142,132,53,184,92,55,162,80,77,237,212,36,244,239,150,193,73,20,160,219,161,192,177,138,126,80,88,139,252,18,11,2,1,14,0,6,4,1,1,116,0,0,240,76,193,105,203,112,134,166,120,185,48,177,150,236,85,49,108,247,4,212,60,44,208,111,7,80,149,78,60,212,255,170,11,2,1,13,0,6,4,1,1,116,0,0,69,219,223,197,166,31,255,162,154,167,174,49,30,24,186,203,52,137,150,253,48,195,13,159,98,48,95,41,229,163,32,142,18,11,2,1,12,0,6,4,1,1,116,0,0,249,27,73,152,102,222,33,233,1,206,109,58,71,177,10,212,205,175,190,91,42,47,213,112,254,236,2,113,155,119,80,164,19,11,2,1,11,0,6,4,1,1,116,0,0,138,110,209,29,91,253,146,71,60,250,119,107,48,79,144,164,149,67,25,25,208,47,93,133,79,58,182,76,241,36,239,93,18,11,2,1,10,0,6,4,1,1,116,0,0,222,94,29,221,66,53,137,5,8,116,164,234,116,20,124,67,48,199,52,242,54,108,202,38,237,216,133,88,93,244,97,11,11,2,1,9,0,6,4,1,1,116,0,0,253,174,88,134,134,115,128,138,240,16,240,220,41,146,199,37,48,4,255,109,128,74,67,31,90,184,143,18,48,110,119,67,18,11,2,1,8,0,6,4,1,1,116,0,0,43,238,69,251,66,159,162,132,163,64,191,26,28,143,1,124,145,95,189,72,243,130,38,250,42,242,71,36,211,175,163,202,19,19,11,2,1,7,0,6,4,1,1,116,0,0,3,86,129,66,125,104,85,190,87,185,132,254,145,212,92,227,167,12,48,201,138,79,224,73,223,5,209,163,51,36,218,116,18,11,2,1,6,0,6,4,1,1,116,0,0,155,157,149,240,21,76,232,116,198,136,115,163,46,67,85,78,147,158,211,201,226,162,43,188,212,243,233,82,97,222,217,82,11,2,1,5,0,6,4,1,1,116,0,0,2,107,155,191,91,103,133,144,180,68,79,10,83,148,152,83,95,76,232,215,183,81,64,37,221,92,19,241,80,71,109,92,18,11,2,1,4,0,6,4,1,1,116,0,0,243,126,213,142,138,144,185,221,47,95,47,171,118,172,73,20,14,203,130,3,73,42,141,101,144,246,87,204,44,227,199,157,19,11,2,1,3,0,6,4,1,1,116,0,0,219,88,183,194,71,182,36,49,109,161,78,73,88,195,176,115,60,142,74,82,5,86,246,40,238,222,92,41,146,71,173,119,18,11,2,1,2,0,6,4,1,1,116,0,0,172,18,30,20,94,147,151,23,36,50,196,182,23,211,208,0,84,132,197,251,24,237,24,233,183,87,123,4,29,37,32,248,11,2,1,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,18,11,2,1,0,0,6,4,1,1,116,0,0,191,126,129,178,112,248,119,101,108,198,233,6,159,191,229,7,220,156,221,144,181,149,172,25,38,19,55,13,16,72,187,62,19,19,19,19,19,19,19,19,19,19,2,165,1,3,1,99,0,7,0,4,0,0,6,44,0,3,1,104,0,11,0,8,0,0,0,0,0,0,1,122,0,16,2,107,151,47,243,47,18,227,31,229,125,74,187,225,218,116,193,148,151,158,194,183,145,114,163,62,188,236,47,151,7,125,247,16,1,124,5,5,84,197,79,223,134,77,199,210,177,213,29,127,3,207,81,232,32,223,29,3,226,129,220,208,51,8,53,216,176,17,2,121,45,177,85,164,24,14,126,131,127,68,24,21,95,97,146,155,109,41,179,16,161,60,228,68,62,168,147,142,105,25,73,16,3,1,116,0,11,0,8,0,0,1,140,22,152,62,32,0,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,16,17,1,180,1,1,98,47,81,170,142,110,105,167,245,70,76,165,89,129,240,133,176,58,44,104,42,111,4,126,71,140,147,66,193,24,255,114,2,151,226,162,5,91,69,34,111,91,125,233,176,249,69,4,50,172,213,204,20,250,154,228,97,254,54,113,240,241,116,185,99,16,4,1,48,0,7,4,1,2,4,233,0,0,195,102,158,185,181,91,9,31,26,10,18,86,127,166,251,61,118,179,38,70,60,59,179,209,245,114,26,231,70,196,43,238,17,2,204,254,253,193,45,87,201,63,108,140,98,61,225,223,229,34,208,158,221,141,103,228,168,52,16,123,83,68,64,77,155,5,16,1,166,197,16,3,135,60,161,26,106,1,44,144,109,198,163,250,94,136,228,109,81,210,107,191,196,146,227,89,138,6,29,154,17],"quorum_hash":[123,144,176,163,196,242,87,123,128,135,83,39,239,120,32,29,65,52,87,220,144,181,236,210,79,66,137,151,63,54,118,157],"signature":[135,79,175,135,193,164,119,151,151,131,174,141,163,69,181,24,215,204,61,237,255,196,70,134,97,121,7,76,147,43,53,250,205,78,147,152,89,222,11,4,154,93,54,197,21,5,99,252,25,79,86,31,22,214,27,140,137,211,133,232,3,222,209,123,214,14,13,3,183,33,37,173,168,248,45,164,69,68,20,188,229,210,130,6,194,49,120,112,19,187,20,221,0,37,34,56],"round":0,"block_id_hash":[0,12,135,39,153,35,126,250,186,177,14,99,228,202,68,226,184,146,126,77,169,28,238,236,54,202,65,171,20,63,25,2],"quorum_type":106}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:16.142398899Z_GetEpochsInfoRequest_d4fe9a388a1862a7db319738fb63f083c2ceb802bbe764135021b32a1c684183.json b/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:16.142398899Z_GetEpochsInfoRequest_d4fe9a388a1862a7db319738fb63f083c2ceb802bbe764135021b32a1c684183.json deleted file mode 100644 index d8ab01a796..0000000000 --- a/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:16.142398899Z_GetEpochsInfoRequest_d4fe9a388a1862a7db319738fb63f083c2ceb802bbe764135021b32a1c684183.json +++ /dev/null @@ -1 +0,0 @@ -{"request":{"version":{"v0":{"start_epoch":3,"count":100,"ascending":true,"prove":true}}},"response":{"version":{"v0":{"metadata":{"height":"399","core_chain_locked_height":1588,"epoch":17,"time_ms":"1701186367912","protocol_version":1,"chain_id":"dashmate_local_35"},"result":{"proof":{"grovedb_proof":[1,1,142,197,5,1,17,180,135,232,242,135,240,249,237,108,66,166,152,167,194,231,203,243,134,214,120,45,182,78,150,235,233,151,144,137,19,246,4,2,1,3,0,6,4,1,1,116,0,0,219,88,183,194,71,182,36,49,109,161,78,73,88,195,176,115,60,142,74,82,5,86,246,40,238,222,92,41,146,71,173,119,16,4,2,1,4,0,6,4,1,1,116,0,0,243,126,213,142,138,144,185,221,47,95,47,171,118,172,73,20,14,203,130,3,73,42,141,101,144,246,87,204,44,227,199,157,4,2,1,5,0,6,4,1,1,116,0,0,2,107,155,191,91,103,133,144,180,68,79,10,83,148,152,83,95,76,232,215,183,81,64,37,221,92,19,241,80,71,109,92,16,4,2,1,6,0,6,4,1,1,116,0,0,155,157,149,240,21,76,232,116,198,136,115,163,46,67,85,78,147,158,211,201,226,162,43,188,212,243,233,82,97,222,217,82,17,17,4,2,1,7,0,6,4,1,1,116,0,0,3,86,129,66,125,104,85,190,87,185,132,254,145,212,92,227,167,12,48,201,138,79,224,73,223,5,209,163,51,36,218,116,16,4,2,1,8,0,6,4,1,1,116,0,0,43,238,69,251,66,159,162,132,163,64,191,26,28,143,1,124,145,95,189,72,243,130,38,250,42,242,71,36,211,175,163,202,4,2,1,9,0,6,4,1,1,116,0,0,253,174,88,134,134,115,128,138,240,16,240,220,41,146,199,37,48,4,255,109,128,74,67,31,90,184,143,18,48,110,119,67,16,4,2,1,10,0,6,4,1,1,116,0,0,222,94,29,221,66,53,137,5,8,116,164,234,116,20,124,67,48,199,52,242,54,108,202,38,237,216,133,88,93,244,97,11,17,4,2,1,11,0,6,4,1,1,116,0,0,138,110,209,29,91,253,146,71,60,250,119,107,48,79,144,164,149,67,25,25,208,47,93,133,79,58,182,76,241,36,239,93,16,4,2,1,12,0,6,4,1,1,116,0,0,249,27,73,152,102,222,33,233,1,206,109,58,71,177,10,212,205,175,190,91,42,47,213,112,254,236,2,113,155,119,80,164,4,2,1,13,0,6,4,1,1,116,0,0,69,219,223,197,166,31,255,162,154,167,174,49,30,24,186,203,52,137,150,253,48,195,13,159,98,48,95,41,229,163,32,142,16,4,2,1,14,0,6,4,1,1,116,0,0,240,76,193,105,203,112,134,166,120,185,48,177,150,236,85,49,108,247,4,212,60,44,208,111,7,80,149,78,60,212,255,170,17,17,17,4,2,1,15,0,6,4,1,1,116,0,0,122,126,37,142,132,53,184,92,55,162,80,77,237,212,36,244,239,150,193,73,20,160,219,161,192,177,138,126,80,88,139,252,16,4,2,1,16,0,6,4,1,1,116,0,0,99,255,217,43,21,202,175,140,246,213,248,108,95,181,119,229,61,192,196,3,81,16,237,94,74,147,5,219,186,19,35,35,4,2,1,17,0,6,4,1,1,115,0,0,178,191,172,84,197,162,6,66,11,37,59,122,225,28,172,33,154,33,132,164,161,116,13,236,71,182,73,127,230,251,111,70,16,4,2,1,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,1,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,1,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,1,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,1,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,1,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,1,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,1,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,4,2,1,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,2,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,2,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,2,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,2,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,2,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,2,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,2,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,17,4,2,2,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,3,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,3,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,3,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,3,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,3,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,3,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,3,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,4,2,3,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,4,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,4,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,4,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,4,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,4,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,4,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,4,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,17,17,4,2,4,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,5,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,5,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,5,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,5,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,5,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,5,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,5,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,4,2,5,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,6,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,6,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,6,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,6,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,6,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,6,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,6,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,17,4,2,6,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,6,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,7,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,7,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,7,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,7,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,7,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,7,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,4,2,7,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,7,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,8,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,8,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,8,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,8,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,8,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,8,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,208,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,17,17,4,2,8,209,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,210,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,4,2,8,211,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,212,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,4,2,8,213,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,214,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,4,2,8,215,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,216,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,4,2,8,217,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,218,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,4,2,8,219,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,220,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,17,4,2,8,221,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,222,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,4,2,8,223,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,224,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,4,2,8,225,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,17,4,1,112,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,1,115,0,3,3,0,0,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,3,1,117,0,5,0,2,0,17,0,16,17,17,17,17,17,17,17,17,17,2,63,3,1,99,0,7,0,4,0,0,5,160,0,3,1,104,0,11,0,8,0,0,0,0,0,0,0,14,0,16,3,1,116,0,11,0,8,0,0,1,140,22,88,32,199,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,2,63,3,1,99,0,7,0,4,0,0,5,170,0,3,1,104,0,11,0,8,0,0,0,0,0,0,0,40,0,16,3,1,116,0,11,0,8,0,0,1,140,22,92,177,213,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,2,63,3,1,99,0,7,0,4,0,0,5,180,0,3,1,104,0,11,0,8,0,0,0,0,0,0,0,66,0,16,3,1,116,0,11,0,8,0,0,1,140,22,97,72,211,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,2,63,3,1,99,0,7,0,4,0,0,5,190,0,3,1,104,0,11,0,8,0,0,0,0,0,0,0,92,0,16,3,1,116,0,11,0,8,0,0,1,140,22,101,218,87,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,2,63,3,1,99,0,7,0,4,0,0,5,200,0,3,1,104,0,11,0,8,0,0,0,0,0,0,0,118,0,16,3,1,116,0,11,0,8,0,0,1,140,22,106,108,158,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,2,63,3,1,99,0,7,0,4,0,0,5,210,0,3,1,104,0,11,0,8,0,0,0,0,0,0,0,144,0,16,3,1,116,0,11,0,8,0,0,1,140,22,110,255,154,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,2,63,3,1,99,0,7,0,4,0,0,5,220,0,3,1,104,0,11,0,8,0,0,0,0,0,0,0,170,0,16,3,1,116,0,11,0,8,0,0,1,140,22,115,147,41,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,2,63,3,1,99,0,7,0,4,0,0,5,230,0,3,1,104,0,11,0,8,0,0,0,0,0,0,0,196,0,16,3,1,116,0,11,0,8,0,0,1,140,22,120,38,112,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,2,63,3,1,99,0,7,0,4,0,0,5,240,0,3,1,104,0,11,0,8,0,0,0,0,0,0,0,222,0,16,3,1,116,0,11,0,8,0,0,1,140,22,124,186,190,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,2,63,3,1,99,0,7,0,4,0,0,5,250,0,3,1,104,0,11,0,8,0,0,0,0,0,0,0,248,0,16,3,1,116,0,11,0,8,0,0,1,140,22,129,76,143,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,2,63,3,1,99,0,7,0,4,0,0,6,4,0,3,1,104,0,11,0,8,0,0,0,0,0,0,1,18,0,16,3,1,116,0,11,0,8,0,0,1,140,22,133,224,163,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,2,63,3,1,99,0,7,0,4,0,0,6,14,0,3,1,104,0,11,0,8,0,0,0,0,0,0,1,44,0,16,3,1,116,0,11,0,8,0,0,1,140,22,138,117,230,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,2,63,3,1,99,0,7,0,4,0,0,6,24,0,3,1,104,0,11,0,8,0,0,0,0,0,0,1,70,0,16,3,1,116,0,11,0,8,0,0,1,140,22,143,10,107,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,2,63,3,1,99,0,7,0,4,0,0,6,34,0,3,1,104,0,11,0,8,0,0,0,0,0,0,1,96,0,16,3,1,116,0,11,0,8,0,0,1,140,22,147,160,108,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,2,165,1,3,1,99,0,7,0,4,0,0,6,44,0,3,1,104,0,11,0,8,0,0,0,0,0,0,1,122,0,16,2,107,151,47,243,47,18,227,31,229,125,74,187,225,218,116,193,148,151,158,194,183,145,114,163,62,188,236,47,151,7,125,247,16,1,124,5,5,84,197,79,223,134,77,199,210,177,213,29,127,3,207,81,232,32,223,29,3,226,129,220,208,51,8,53,216,176,17,2,121,45,177,85,164,24,14,126,131,127,68,24,21,95,97,146,155,109,41,179,16,161,60,228,68,62,168,147,142,105,25,73,16,3,1,116,0,11,0,8,0,0,1,140,22,152,62,32,0,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,16,17,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,1,180,1,1,98,47,81,170,142,110,105,167,245,70,76,165,89,129,240,133,176,58,44,104,42,111,4,126,71,140,147,66,193,24,255,114,2,151,226,162,5,91,69,34,111,91,125,233,176,249,69,4,50,172,213,204,20,250,154,228,97,254,54,113,240,241,116,185,99,16,4,1,48,0,7,4,1,2,4,233,0,0,195,102,158,185,181,91,9,31,26,10,18,86,127,166,251,61,118,179,38,70,60,59,179,209,245,114,26,231,70,196,43,238,17,2,204,254,253,193,45,87,201,63,108,140,98,61,225,223,229,34,208,158,221,141,103,228,168,52,16,123,83,68,64,77,155,5,16,1,166,197,16,3,135,60,161,26,106,1,44,144,109,198,163,250,94,136,228,109,81,210,107,191,196,146,227,89,138,6,29,154,17],"quorum_hash":[123,144,176,163,196,242,87,123,128,135,83,39,239,120,32,29,65,52,87,220,144,181,236,210,79,66,137,151,63,54,118,157],"signature":[135,79,175,135,193,164,119,151,151,131,174,141,163,69,181,24,215,204,61,237,255,196,70,134,97,121,7,76,147,43,53,250,205,78,147,152,89,222,11,4,154,93,54,197,21,5,99,252,25,79,86,31,22,214,27,140,137,211,133,232,3,222,209,123,214,14,13,3,183,33,37,173,168,248,45,164,69,68,20,188,229,210,130,6,194,49,120,112,19,187,20,221,0,37,34,56],"round":0,"block_id_hash":[0,12,135,39,153,35,126,250,186,177,14,99,228,202,68,226,184,146,126,77,169,28,238,236,54,202,65,171,20,63,25,2],"quorum_type":106}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:16.536016360Z_GetEpochsInfoRequest_0df25d4dcb12ff24d9128fdcc91d7dd78bd88ffe63099d2128e0fb388aae50ab.json b/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:16.536016360Z_GetEpochsInfoRequest_0df25d4dcb12ff24d9128fdcc91d7dd78bd88ffe63099d2128e0fb388aae50ab.json deleted file mode 100644 index 32ce90c08e..0000000000 --- a/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:16.536016360Z_GetEpochsInfoRequest_0df25d4dcb12ff24d9128fdcc91d7dd78bd88ffe63099d2128e0fb388aae50ab.json +++ /dev/null @@ -1 +0,0 @@ -{"request":{"version":{"v0":{"start_epoch":17,"count":100,"ascending":true,"prove":true}}},"response":{"version":{"v0":{"metadata":{"height":"399","core_chain_locked_height":1588,"epoch":17,"time_ms":"1701186367912","protocol_version":1,"chain_id":"dashmate_local_35"},"result":{"proof":{"grovedb_proof":[1,1,220,192,5,1,183,28,0,151,87,210,146,60,167,141,145,248,251,9,238,187,113,239,11,142,92,87,234,112,97,94,129,42,103,28,132,165,2,5,215,162,19,76,229,232,94,231,193,91,84,81,247,223,8,252,180,113,58,224,14,13,193,66,9,182,189,108,86,177,197,16,1,4,179,144,33,22,63,241,24,32,177,67,192,118,1,34,167,142,47,175,116,60,234,47,113,160,70,202,185,82,172,149,8,4,2,1,17,0,6,4,1,1,115,0,0,178,191,172,84,197,162,6,66,11,37,59,122,225,28,172,33,154,33,132,164,161,116,13,236,71,182,73,127,230,251,111,70,16,4,2,1,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,1,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,1,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,1,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,1,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,1,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,1,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,1,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,4,2,1,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,2,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,2,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,2,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,2,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,2,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,2,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,2,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,17,4,2,2,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,3,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,3,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,3,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,3,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,3,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,3,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,3,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,4,2,3,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,4,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,4,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,4,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,4,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,4,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,4,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,4,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,17,17,4,2,4,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,5,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,5,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,5,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,5,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,5,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,5,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,5,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,4,2,5,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,6,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,6,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,6,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,6,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,6,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,6,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,6,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,17,4,2,6,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,6,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,7,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,7,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,7,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,7,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,7,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,7,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,4,2,7,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,7,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,8,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,8,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,8,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,8,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,8,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,8,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,208,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,17,17,4,2,8,209,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,210,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,4,2,8,211,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,212,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,4,2,8,213,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,214,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,4,2,8,215,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,216,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,4,2,8,217,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,218,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,4,2,8,219,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,220,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,17,4,2,8,221,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,222,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,4,2,8,223,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,224,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,4,2,8,225,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,17,4,1,112,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,1,115,0,3,3,0,0,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,3,1,117,0,5,0,2,0,17,0,16,17,17,17,17,17,17,17,17,17,2,165,1,3,1,99,0,7,0,4,0,0,6,44,0,3,1,104,0,11,0,8,0,0,0,0,0,0,1,122,0,16,2,107,151,47,243,47,18,227,31,229,125,74,187,225,218,116,193,148,151,158,194,183,145,114,163,62,188,236,47,151,7,125,247,16,1,124,5,5,84,197,79,223,134,77,199,210,177,213,29,127,3,207,81,232,32,223,29,3,226,129,220,208,51,8,53,216,176,17,2,121,45,177,85,164,24,14,126,131,127,68,24,21,95,97,146,155,109,41,179,16,161,60,228,68,62,168,147,142,105,25,73,16,3,1,116,0,11,0,8,0,0,1,140,22,152,62,32,0,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,16,17,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,1,180,1,1,98,47,81,170,142,110,105,167,245,70,76,165,89,129,240,133,176,58,44,104,42,111,4,126,71,140,147,66,193,24,255,114,2,151,226,162,5,91,69,34,111,91,125,233,176,249,69,4,50,172,213,204,20,250,154,228,97,254,54,113,240,241,116,185,99,16,4,1,48,0,7,4,1,2,4,233,0,0,195,102,158,185,181,91,9,31,26,10,18,86,127,166,251,61,118,179,38,70,60,59,179,209,245,114,26,231,70,196,43,238,17,2,204,254,253,193,45,87,201,63,108,140,98,61,225,223,229,34,208,158,221,141,103,228,168,52,16,123,83,68,64,77,155,5,16,1,166,197,16,3,135,60,161,26,106,1,44,144,109,198,163,250,94,136,228,109,81,210,107,191,196,146,227,89,138,6,29,154,17],"quorum_hash":[123,144,176,163,196,242,87,123,128,135,83,39,239,120,32,29,65,52,87,220,144,181,236,210,79,66,137,151,63,54,118,157],"signature":[135,79,175,135,193,164,119,151,151,131,174,141,163,69,181,24,215,204,61,237,255,196,70,134,97,121,7,76,147,43,53,250,205,78,147,152,89,222,11,4,154,93,54,197,21,5,99,252,25,79,86,31,22,214,27,140,137,211,133,232,3,222,209,123,214,14,13,3,183,33,37,173,168,248,45,164,69,68,20,188,229,210,130,6,194,49,120,112,19,187,20,221,0,37,34,56],"round":0,"block_id_hash":[0,12,135,39,153,35,126,250,186,177,14,99,228,202,68,226,184,146,126,77,169,28,238,236,54,202,65,171,20,63,25,2],"quorum_type":106}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:16.879310928Z_GetEpochsInfoRequest_61b3e0349172ec26465ec79f45b2da649dce3dcbd207484424288382ece054f2.json b/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:16.879310928Z_GetEpochsInfoRequest_61b3e0349172ec26465ec79f45b2da649dce3dcbd207484424288382ece054f2.json deleted file mode 100644 index 93a1f9dd48..0000000000 --- a/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:16.879310928Z_GetEpochsInfoRequest_61b3e0349172ec26465ec79f45b2da649dce3dcbd207484424288382ece054f2.json +++ /dev/null @@ -1 +0,0 @@ -{"request":{"version":{"v0":{"start_epoch":27,"count":100,"ascending":true,"prove":true}}},"response":{"version":{"v0":{"metadata":{"height":"399","core_chain_locked_height":1588,"epoch":17,"time_ms":"1701186367912","protocol_version":1,"chain_id":"dashmate_local_35"},"result":{"proof":{"grovedb_proof":[1,1,222,189,5,1,183,28,0,151,87,210,146,60,167,141,145,248,251,9,238,187,113,239,11,142,92,87,234,112,97,94,129,42,103,28,132,165,2,5,215,162,19,76,229,232,94,231,193,91,84,81,247,223,8,252,180,113,58,224,14,13,193,66,9,182,189,108,86,177,197,16,1,235,164,122,9,165,118,133,245,116,170,88,198,216,16,177,72,95,213,104,188,45,201,64,1,231,214,243,211,46,176,18,176,2,214,133,214,97,203,126,194,30,3,243,48,119,63,4,90,202,246,179,75,59,177,118,242,68,119,141,22,175,221,127,238,223,16,1,113,7,212,117,2,228,217,183,56,43,184,204,159,148,171,28,213,227,252,69,93,204,164,2,164,53,166,77,19,203,49,4,4,2,1,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,1,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,1,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,1,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,1,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,1,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,1,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,1,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,4,2,1,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,2,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,2,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,2,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,2,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,2,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,2,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,2,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,17,4,2,2,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,3,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,3,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,3,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,3,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,3,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,3,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,3,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,4,2,3,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,4,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,4,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,4,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,4,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,4,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,4,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,4,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,17,17,4,2,4,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,5,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,5,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,5,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,5,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,5,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,5,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,5,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,4,2,5,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,6,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,6,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,6,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,6,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,6,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,6,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,6,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,17,4,2,6,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,6,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,7,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,7,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,7,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,7,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,7,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,7,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,4,2,7,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,7,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,8,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,8,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,8,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,8,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,8,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,8,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,208,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,17,17,4,2,8,209,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,210,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,4,2,8,211,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,212,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,4,2,8,213,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,214,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,4,2,8,215,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,216,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,4,2,8,217,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,218,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,4,2,8,219,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,220,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,17,4,2,8,221,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,222,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,4,2,8,223,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,224,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,4,2,8,225,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,17,4,1,112,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,1,115,0,3,3,0,0,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,3,1,117,0,5,0,2,0,17,0,16,17,17,17,17,17,17,17,17,17,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,2,35,5,1,115,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,1,180,1,1,98,47,81,170,142,110,105,167,245,70,76,165,89,129,240,133,176,58,44,104,42,111,4,126,71,140,147,66,193,24,255,114,2,151,226,162,5,91,69,34,111,91,125,233,176,249,69,4,50,172,213,204,20,250,154,228,97,254,54,113,240,241,116,185,99,16,4,1,48,0,7,4,1,2,4,233,0,0,195,102,158,185,181,91,9,31,26,10,18,86,127,166,251,61,118,179,38,70,60,59,179,209,245,114,26,231,70,196,43,238,17,2,204,254,253,193,45,87,201,63,108,140,98,61,225,223,229,34,208,158,221,141,103,228,168,52,16,123,83,68,64,77,155,5,16,1,166,197,16,3,135,60,161,26,106,1,44,144,109,198,163,250,94,136,228,109,81,210,107,191,196,146,227,89,138,6,29,154,17],"quorum_hash":[123,144,176,163,196,242,87,123,128,135,83,39,239,120,32,29,65,52,87,220,144,181,236,210,79,66,137,151,63,54,118,157],"signature":[135,79,175,135,193,164,119,151,151,131,174,141,163,69,181,24,215,204,61,237,255,196,70,134,97,121,7,76,147,43,53,250,205,78,147,152,89,222,11,4,154,93,54,197,21,5,99,252,25,79,86,31,22,214,27,140,137,211,133,232,3,222,209,123,214,14,13,3,183,33,37,173,168,248,45,164,69,68,20,188,229,210,130,6,194,49,120,112,19,187,20,221,0,37,34,56],"round":0,"block_id_hash":[0,12,135,39,153,35,126,250,186,177,14,99,228,202,68,226,184,146,126,77,169,28,238,236,54,202,65,171,20,63,25,2],"quorum_type":106}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:16.921837334Z_GetEpochsInfoRequest_93f0d7a77c909a6170f653a4b4b19e7631c1fc51bcbda1a4b854be8c566acb17.json b/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:16.921837334Z_GetEpochsInfoRequest_93f0d7a77c909a6170f653a4b4b19e7631c1fc51bcbda1a4b854be8c566acb17.json deleted file mode 100644 index 21f6d43112..0000000000 --- a/packages/rs-sdk/tests/vectors/msg_2023-11-28T15:46:16.921837334Z_GetEpochsInfoRequest_93f0d7a77c909a6170f653a4b4b19e7631c1fc51bcbda1a4b854be8c566acb17.json +++ /dev/null @@ -1 +0,0 @@ -{"request":{"version":{"v0":{"start_epoch":3,"count":2,"ascending":true,"prove":true}}},"response":{"version":{"v0":{"metadata":{"height":"399","core_chain_locked_height":1588,"epoch":17,"time_ms":"1701186367912","protocol_version":1,"chain_id":"dashmate_local_35"},"result":{"proof":{"grovedb_proof":[1,1,142,197,5,1,17,180,135,232,242,135,240,249,237,108,66,166,152,167,194,231,203,243,134,214,120,45,182,78,150,235,233,151,144,137,19,246,4,2,1,3,0,6,4,1,1,116,0,0,219,88,183,194,71,182,36,49,109,161,78,73,88,195,176,115,60,142,74,82,5,86,246,40,238,222,92,41,146,71,173,119,16,4,2,1,4,0,6,4,1,1,116,0,0,243,126,213,142,138,144,185,221,47,95,47,171,118,172,73,20,14,203,130,3,73,42,141,101,144,246,87,204,44,227,199,157,4,2,1,5,0,6,4,1,1,116,0,0,2,107,155,191,91,103,133,144,180,68,79,10,83,148,152,83,95,76,232,215,183,81,64,37,221,92,19,241,80,71,109,92,16,4,2,1,6,0,6,4,1,1,116,0,0,155,157,149,240,21,76,232,116,198,136,115,163,46,67,85,78,147,158,211,201,226,162,43,188,212,243,233,82,97,222,217,82,17,17,4,2,1,7,0,6,4,1,1,116,0,0,3,86,129,66,125,104,85,190,87,185,132,254,145,212,92,227,167,12,48,201,138,79,224,73,223,5,209,163,51,36,218,116,16,4,2,1,8,0,6,4,1,1,116,0,0,43,238,69,251,66,159,162,132,163,64,191,26,28,143,1,124,145,95,189,72,243,130,38,250,42,242,71,36,211,175,163,202,4,2,1,9,0,6,4,1,1,116,0,0,253,174,88,134,134,115,128,138,240,16,240,220,41,146,199,37,48,4,255,109,128,74,67,31,90,184,143,18,48,110,119,67,16,4,2,1,10,0,6,4,1,1,116,0,0,222,94,29,221,66,53,137,5,8,116,164,234,116,20,124,67,48,199,52,242,54,108,202,38,237,216,133,88,93,244,97,11,17,4,2,1,11,0,6,4,1,1,116,0,0,138,110,209,29,91,253,146,71,60,250,119,107,48,79,144,164,149,67,25,25,208,47,93,133,79,58,182,76,241,36,239,93,16,4,2,1,12,0,6,4,1,1,116,0,0,249,27,73,152,102,222,33,233,1,206,109,58,71,177,10,212,205,175,190,91,42,47,213,112,254,236,2,113,155,119,80,164,4,2,1,13,0,6,4,1,1,116,0,0,69,219,223,197,166,31,255,162,154,167,174,49,30,24,186,203,52,137,150,253,48,195,13,159,98,48,95,41,229,163,32,142,16,4,2,1,14,0,6,4,1,1,116,0,0,240,76,193,105,203,112,134,166,120,185,48,177,150,236,85,49,108,247,4,212,60,44,208,111,7,80,149,78,60,212,255,170,17,17,17,4,2,1,15,0,6,4,1,1,116,0,0,122,126,37,142,132,53,184,92,55,162,80,77,237,212,36,244,239,150,193,73,20,160,219,161,192,177,138,126,80,88,139,252,16,4,2,1,16,0,6,4,1,1,116,0,0,99,255,217,43,21,202,175,140,246,213,248,108,95,181,119,229,61,192,196,3,81,16,237,94,74,147,5,219,186,19,35,35,4,2,1,17,0,6,4,1,1,115,0,0,178,191,172,84,197,162,6,66,11,37,59,122,225,28,172,33,154,33,132,164,161,116,13,236,71,182,73,127,230,251,111,70,16,4,2,1,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,1,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,1,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,1,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,1,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,1,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,1,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,1,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,1,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,1,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,4,2,1,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,1,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,1,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,1,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,2,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,2,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,2,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,2,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,2,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,2,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,2,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,2,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,17,4,2,2,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,2,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,2,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,2,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,2,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,3,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,3,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,3,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,3,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,3,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,3,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,3,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,4,2,3,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,3,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,3,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,3,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,3,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,3,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,4,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,4,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,4,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,4,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,4,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,4,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,4,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,17,17,4,2,4,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,4,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,4,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,4,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,4,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,4,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,5,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,5,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,5,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,5,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,5,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,5,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,5,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,4,2,5,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,5,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,5,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,5,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,5,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,5,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,6,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,6,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,6,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,6,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,6,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,6,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,6,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,17,4,2,6,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,6,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,6,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,6,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,6,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,6,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,6,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,7,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,7,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,7,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,7,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,7,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,7,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,208,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,209,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,210,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,211,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,212,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,213,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,214,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,215,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,216,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,17,4,2,7,217,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,218,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,219,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,220,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,221,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,222,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,223,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,224,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,225,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,226,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,227,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,228,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,229,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,230,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,231,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,232,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,7,233,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,234,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,235,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,236,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,237,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,238,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,239,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,240,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,7,241,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,242,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,243,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,244,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,245,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,246,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,247,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,248,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,7,249,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,250,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,251,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,252,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,7,253,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,7,254,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,7,255,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,0,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,1,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,2,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,3,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,4,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,5,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,6,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,7,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,8,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,9,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,10,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,11,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,12,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,13,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,14,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,15,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,16,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,17,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,18,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,19,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,20,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,21,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,22,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,23,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,8,24,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,25,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,26,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,27,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,28,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,29,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,30,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,31,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,32,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,33,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,34,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,35,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,36,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,37,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,38,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,39,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,40,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,41,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,42,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,43,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,44,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,45,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,46,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,47,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,48,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,49,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,50,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,51,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,52,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,53,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,54,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,8,55,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,56,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,57,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,58,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,59,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,60,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,61,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,62,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,63,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,64,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,65,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,66,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,67,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,68,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,69,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,70,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,71,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,72,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,73,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,74,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,75,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,76,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,77,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,78,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,79,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,80,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,81,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,82,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,83,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,84,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,85,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,17,4,2,8,86,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,87,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,88,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,89,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,90,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,91,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,92,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,93,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,94,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,95,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,96,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,97,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,98,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,99,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,100,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,101,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,102,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,103,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,104,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,105,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,106,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,107,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,108,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,109,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,110,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,111,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,112,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,113,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,114,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,115,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,116,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,117,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,17,4,2,8,118,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,119,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,120,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,121,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,122,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,123,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,124,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,125,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,126,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,127,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,128,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,129,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,130,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,131,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,132,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,133,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,134,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,135,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,136,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,137,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,138,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,139,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,140,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,141,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,142,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,143,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,144,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,145,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,146,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,147,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,148,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,17,4,2,8,149,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,150,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,151,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,152,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,153,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,154,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,155,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,156,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,157,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,158,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,159,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,160,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,161,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,162,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,163,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,164,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,165,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,166,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,167,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,168,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,169,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,170,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,171,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,172,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,173,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,174,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,175,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,176,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,177,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,178,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,179,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,17,17,17,4,2,8,180,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,181,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,182,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,183,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,184,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,185,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,186,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,187,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,188,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,189,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,190,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,191,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,192,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,193,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,194,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,195,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,17,4,2,8,196,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,197,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,198,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,199,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,4,2,8,200,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,201,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,202,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,203,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,17,17,4,2,8,204,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,205,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,4,2,8,206,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,207,0,6,4,1,1,115,0,0,182,80,10,127,238,212,239,8,162,112,103,32,122,185,170,113,53,160,165,3,150,47,26,33,60,74,139,64,54,229,57,209,16,4,2,8,208,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,17,17,4,2,8,209,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,210,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,4,2,8,211,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,212,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,4,2,8,213,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,214,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,4,2,8,215,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,216,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,4,2,8,217,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,218,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,4,2,8,219,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,220,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,17,4,2,8,221,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,222,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,4,2,8,223,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,2,8,224,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,4,2,8,225,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,17,17,4,1,112,0,4,4,0,0,0,128,36,254,85,240,173,208,27,171,58,171,128,38,98,102,100,20,24,4,69,10,165,239,206,227,95,233,100,181,217,58,193,16,4,1,115,0,3,3,0,0,40,216,51,144,146,203,150,14,133,148,245,43,195,81,47,10,14,155,208,214,193,1,83,251,228,85,71,23,134,145,122,217,3,1,117,0,5,0,2,0,17,0,16,17,17,17,17,17,17,17,17,17,2,63,3,1,99,0,7,0,4,0,0,5,160,0,3,1,104,0,11,0,8,0,0,0,0,0,0,0,14,0,16,3,1,116,0,11,0,8,0,0,1,140,22,88,32,199,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,2,63,3,1,99,0,7,0,4,0,0,5,170,0,3,1,104,0,11,0,8,0,0,0,0,0,0,0,40,0,16,3,1,116,0,11,0,8,0,0,1,140,22,92,177,213,0,16,3,1,120,0,11,0,8,64,0,0,0,0,0,0,0,0,17,1,180,1,1,98,47,81,170,142,110,105,167,245,70,76,165,89,129,240,133,176,58,44,104,42,111,4,126,71,140,147,66,193,24,255,114,2,151,226,162,5,91,69,34,111,91,125,233,176,249,69,4,50,172,213,204,20,250,154,228,97,254,54,113,240,241,116,185,99,16,4,1,48,0,7,4,1,2,4,233,0,0,195,102,158,185,181,91,9,31,26,10,18,86,127,166,251,61,118,179,38,70,60,59,179,209,245,114,26,231,70,196,43,238,17,2,204,254,253,193,45,87,201,63,108,140,98,61,225,223,229,34,208,158,221,141,103,228,168,52,16,123,83,68,64,77,155,5,16,1,166,197,16,3,135,60,161,26,106,1,44,144,109,198,163,250,94,136,228,109,81,210,107,191,196,146,227,89,138,6,29,154,17],"quorum_hash":[123,144,176,163,196,242,87,123,128,135,83,39,239,120,32,29,65,52,87,220,144,181,236,210,79,66,137,151,63,54,118,157],"signature":[135,79,175,135,193,164,119,151,151,131,174,141,163,69,181,24,215,204,61,237,255,196,70,134,97,121,7,76,147,43,53,250,205,78,147,152,89,222,11,4,154,93,54,197,21,5,99,252,25,79,86,31,22,214,27,140,137,211,133,232,3,222,209,123,214,14,13,3,183,33,37,173,168,248,45,164,69,68,20,188,229,210,130,6,194,49,120,112,19,187,20,221,0,37,34,56],"round":0,"block_id_hash":[0,12,135,39,153,35,126,250,186,177,14,99,228,202,68,226,184,146,126,77,169,28,238,236,54,202,65,171,20,63,25,2],"quorum_type":106}}}}}} \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:12.910262643Z_GetDataContractsRequest_93bdf343bce1bafb96fd873236cabbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json b/packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:12.910262643Z_GetDataContractsRequest_93bdf343bce1bafb96fd873236cabbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json new file mode 100644 index 0000000000000000000000000000000000000000..c2bbc824bfbd84dd1f4c834f75dde0bf36114382 GIT binary patch literal 8694 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 QdH-MU{{QUXZ|=PLGuSBDa{vGU literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:12.918456374Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:12.918456374Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json new file mode 100644 index 0000000000000000000000000000000000000000..e229a4f723306898fae742ee8c11b3fcc48faf23 GIT binary patch literal 74126 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 z¬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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:13.372463774Z_DocumentQuery_c104c67292061fe0b8e2f959cd2625892e0011f1264c65e1474532f59456ff51.json b/packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:13.372463774Z_DocumentQuery_c104c67292061fe0b8e2f959cd2625892e0011f1264c65e1474532f59456ff51.json new file mode 100644 index 0000000000000000000000000000000000000000..4f579a90c209caf0d7a9516da3e5cad15f398ce7 GIT binary patch literal 24202 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:13.376226003Z_GetIdentityBalanceRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:13.376226003Z_GetIdentityBalanceRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json new file mode 100644 index 0000000000000000000000000000000000000000..1db95eeb4557c9035db48fac294b3f53faab1d41 GIT binary patch literal 11759 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 Di?@OP literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:13.694486416Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json b/packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:13.694486416Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json new file mode 100644 index 0000000000000000000000000000000000000000..ef2015b59ce284a595b99e70090ea4b19c20945f GIT binary patch literal 24202 zcmeI4U3c3?l7{!%zXFFR=lEhH4I2_kDRX7V@x)0ylZ`XU?!+DiB3mL75}*N6j*`uP z-|7ZGfafJ8JIS7za}r(H#8-E9)mv3>RfGKLL6Y<)*)qErm&LNm#>?IZ$xn9DPQQ0m zR`YCmapS8xFAKZS>-XMouH}<(_?NH0c=70~r_aCp?;p-SUi{b7?603ZfBpEY(euaG z&p$oAtOkGo=tceb^u>w$XuNsS=DEtRx3kW}k!Syp;+QjS-1Uo7iS?XLArAFh}G#9w8rS(e zxb>OxP2sC&(L|>oT|GMgq`J8|DT)uDPF`G%uCmGC{A}Rz{L3%?G5mVG8vf5$pPc3| z{L_tz>haXiGt)%f5wW+?!Hal3Tx^hHhM1J|EDsRboUwDu+l99?z4G!qZ@Aj5)2`&j zBp>@Qz&CLv0d7g_(Qwo&vUz-bkyWO{zuM8GV)9vb>1VB>;+>1CT=;64%ZTCXPM~lU z{(42g^(_CXHcMjUfcwnT?$gg%f3FG!wMgDpf zga}w_-PxJHJNH&ildPU@&}OE`$nUD6%8$!xQXhv={~o1kjs34!+M`*X)xYJc;(+hE zsJ2bEpIcV!b@be}RBslM+jfv>@{N8lue|M^XJ^y8zWfAo*eU+q2~ zz51#D{?PrrJM-#24l>V+&wO#coEorBfQxzd!}i*c7Z+unhmd8@_3_-q*W)UW0WJ7U z<3UMW<8k7TuaA?5kIT!4$8AsQpt$9P8-Ho5%bekzG&B9~===Fmu{ip1t)I?`mX^^|6k$O*AlJ@6bnL8P7trrLSaJCbRO5uf|#J6U(ki_;8dLwJ(CEZ+y~3fWp^x za$_ONGPCLbIC?(hJC)Om&v71{OeUV3nMP4zA7rVtA zlyJU&{!U5nKuHt)I|2F^!{ojH{cU`RzVNm_l-}(_kCH2614*;uq)DhrNP-(%g;@M{ z9IPNcl}B?P5x$7J4S#|F@(4l zD~2S}O^ap4W@gS?-{s+zH>TmM7g=Q82XLBIRd!2NUEVJJqj;fVOz3BWSTDx(-IN%I^WU0bnQ#Y|EVMcDg@XhmUOhn9 zx-)cm$3Dfz8}3$ayyXrBH`fmpglpMHq! z^mwvZ9Otpjy2^b8jKqOpwGHV@o;?ZPV%aU4aOXIUCG&Y!-NpbMO}lw&-vsw&%nckG zS80PH2-qP;jl>q}m7xCnn-R1quH|25M&nOe9SvB=cpuFA|7pc-L9oZBJ@b{%+hr;= z)w6(f=k=Da3=ovE$t2SBY}Of})4vEJ8BJ{i^~18TqQk28WkVlLf=De*Qj24oiaIfB zx~janK(S$UlK91nKAMgn+e)IjYefrZJSc$vMgslEB1u|#F#Iqrjjz&N6Exr z<;LifH&aW^yCk_?Ro!H-cM!A&YFcdUCC8ff2i)?-T`U^>@dwT^b0XlcPZmV1X@w+Grf zkqY_1MIrm0`!=#L`Oxz)5m> zn|$%~!^HJZ2FFQLuWm`8q1Pg4KA$(O;}4Q~ImxfqG$zK}N$77|r5|s!wy`yX#-ZQ6 z*8dhj)?aGaa)&k^4uJ30X|0XU`pL(}J?J~Te6YtQy3sfWh-Rcl4RO5Rv}L##l^qe= zBK7tN)4py#y@~Jp$Z+p&A{-L?!AjySs|=7|Z6>X3!y&1s*-<(eCgoM+qeiQY2m2y& z;czmuD#u`Gg;ubw_k%Eue3FE_T2TUfco{m z6GaQbI4*3viE$B(ei7AR;A|3XgnjRgmD~PeJj<*shj|b zW3OIjRX7TJI}d(-@E;EX*m}E7ng)Bln|{lOdvm|cLQ&m1XAez%em#wSIM*MYx16$P z-FXvnYV7S|R*t{-lZ)-W?)-Griq?Knjzj0S1+v~UpZkkg828+$KT1yq>Cg?%hV2>5 zpO)pgoVB+9TAa1l%-w7Q2Bv2lg+7Rq%`RMD;we>S`vgqRQ2xce7EpDx1(#sraZ%i@Z5Z;V6xHG6Bl|aWChFAgv z+bI++@!X0CtZ@X}K_(1{L#~LSn;FYdrLK=5a42Sd_YvP|K`9e~7)iVXMt01~vP5Pt z$)SLeBi09y;RH)0N=8)bkPiR@;(jR|Iz7dhLm-1Pq$%}u4i|TXW_p4-j3ffQ0w*$@ zkxardNnl7%CS7&HA* zs%$_F#YlGg9n(l4OyWP;SIVrG4lsn{7>-GY`9Q{WWSS{+rOrzJOOEBvk)P8P>GOo4 zk2eSnO8XeXIgY_f+%c=4@`*FX4`k1@&l4%|eU2MgXA9LirwJXhK9-qMXr&2Ks!L*_ zA{hJU>Nq~(v)6CO;Zu% zTJ&poN>fNHu@A&rOSo$ucs9V}D3bW(85c$3?FdK*ygZ}nS7~q(ulW4}|G2|*) zz_Yl}J_o#tGDFE!QhEZdrSu6pNlGoAaSb%Aqn?Q-bu%U}$-1olh(CoN0ZK2T=2PY} zW+I?P@C>yOD(rMPZDT`Z>0FQiNwWsFCHmlTSPQfhUk8fIKd$PPMtVU!?crx!{T z3QQoRjE8A^-!{~{DJwQdM`QX+xeBMemJpT#fS9JH)cR~arpzYnb~tI&ga5lTs8bv( zC1l)*cn$;dy#(2vV_J3-0o#<<9dRkDU@nJ@;;dcYmR%UKI)No~mhfphyVwqDbp$?Z z(p2cO@D)0f0Gl+696kkWqaz65#4)%vz1C}I)I=0Rw+aT}* zN;rhPvc28~8Xkta9iP6R+x!wPLukq@Sd%bm))yf2DV>qthn%<4D>>PTXxog~G#V{jJt z6Kl!V20b{HB9p9<{diF&D?)K`=|7SwOHCj&l0=kEF49ciFCBZpTtYam%iBTHAmy6K z0UaA5B-;$=NRrH|cV;XEBphO7k_g?xVI?V>gZkzUiH7(%69XTRK0AW|VlZo2iTQ*C zAwz-Wg;7!=N=%~6bSr&TVhAg8oKOm3Cs~7wWI-2f8#JU(_mTu~A$?azDhJjx;-n-hvga+^^73^E;7h`l5KWq& zFJaK@>0i><6@bYTv@Z3cr6GMx6$Q6rxlAr2ySXXTfVe$eQz|qjPmN_rWx%|=2&6ka zw3Xxg1uP@wdneQj)OK%zXTWB7W4NL11+VhT1TCe_ITBf_6)qrsG4ToM=FtZ<&I-tx zU!@+FmaOb%$QL1~Tq;vIDpOa=ZDp;&>E6>bPw6C|lUX|5qelZQ-vE`S` z2?Qk|@TZjYmi{C!YO%*Hc9rixVM^)1N&`Z+prk@}q?edugk_LD=*}+&;9DegaaIZ3 z&`=7+V2VVRaz;iSrguh4+blQ;nL59=FZtSUa0p<;9i;MS#Vf{<*E4k&f;@qZO<`E< zy9ns`eME*(@j=!=+B#(&eLt&{Nu*&XhM%EISqw zBqYqjdsuvFVZ?%yO$#R!o%okVo7hW`%IGNlcv5Vp7xr_d7b6?UWE-r5xcMs^FVevm z#w&ZJNf*`u#OO{fxI8LE=(1CA@URg&(Ev{z!n4mCNwc0vEacw!l8R zA_XSmh{hR$%5e*vUxpX%#oR-ri<)?X!A-y6#wTQ3LG~R%R~-3^jL4RbdYhy(5(?=L v2$Pd0ALW)dkmK8MO0?**Mi&oaYE5<5zpY|j%I%$-Uq)*Fk3Y@v;OGAXX5yTB literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:13.696798309Z_GetIdentityBalanceAndRevisionRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:13.696798309Z_GetIdentityBalanceAndRevisionRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json new file mode 100644 index 0000000000000000000000000000000000000000..bb42841eb5cdf8e446969a79231e229788029595 GIT binary patch literal 20800 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 GU;Y7;Yo`JL literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:13.709021613Z_GetIdentityKeysRequest_b4ecff7acf52818aef9ed37a98d4a459dc7a67570ea6df3f8858d3fae7820ffe.json b/packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:13.709021613Z_GetIdentityKeysRequest_b4ecff7acf52818aef9ed37a98d4a459dc7a67570ea6df3f8858d3fae7820ffe.json new file mode 100644 index 0000000000000000000000000000000000000000..0e45e826c619c97bf5d9c9969372b042066eea33 GIT binary patch literal 16029 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:13.709234435Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json b/packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:13.709234435Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json new file mode 100644 index 0000000000000000000000000000000000000000..2add6dbb4880c202faf26f6afe82a93b4842d717 GIT binary patch literal 24658 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:13.711953786Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json b/packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:13.711953786Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json new file mode 100644 index 0000000000000000000000000000000000000000..2add6dbb4880c202faf26f6afe82a93b4842d717 GIT binary patch literal 24658 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:13.754344045Z_GetEpochsInfoRequest_6a828350e795a088dbc835260a1add01a7428085ffdcf1e11cccf19c48c5f7a1.json b/packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:13.754344045Z_GetEpochsInfoRequest_6a828350e795a088dbc835260a1add01a7428085ffdcf1e11cccf19c48c5f7a1.json new file mode 100644 index 0000000000000000000000000000000000000000..8e6ffd9d7551b26e2a9729cc8659bd704e3a33e2 GIT binary patch literal 2668624 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

r$9^@(N$zpD+{=9t?zh)^@F9@zW%2!v@iMNP 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:14.019269155Z_GetProtocolVersionUpgradeStateRequest_bb149e1933b9dc561bbfacfb6d09550f0ea4a6af6f68037e7d50ff4e4de74509.json b/packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:14.019269155Z_GetProtocolVersionUpgradeStateRequest_bb149e1933b9dc561bbfacfb6d09550f0ea4a6af6f68037e7d50ff4e4de74509.json new file mode 100644 index 0000000000000000000000000000000000000000..3a5f04fc75559cd08b4a05b9b9f3e2ee6d1d11c0 GIT binary patch literal 8224 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 Cv6<@t literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:14.034739998Z_GetProtocolVersionUpgradeVoteStatusRequest_8534be7e0b4dd648520dc3a67209b1a05862cb8d40c088b193b59ca3564210bc.json b/packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:14.034739998Z_GetProtocolVersionUpgradeVoteStatusRequest_8534be7e0b4dd648520dc3a67209b1a05862cb8d40c088b193b59ca3564210bc.json new file mode 100644 index 0000000000000000000000000000000000000000..6d4c8434ecdce1229277a70fbcd8bf8f0d817e1b GIT binary patch literal 11321 zcmeI&%WfNI3^Av&BU5M1ZuTm6(Vym&y*h*zNXc6SyJL5R6^qr>OcF`=7%;=y0 zLLMF-a^~}!w{It(_Q!|Y!~Nu^x1Wd0@y7J!|HIY8X?HwrKOPU;(;wTL-NViBA#@1%O zIvctFc(@udHa)v{y1m*e_h!+}nRtHX!w-*~RGDZZ|Kdp*u^ zJ)rn*ciN9z*?rj7bnjftnY7*;s^dU0zw*!$6r*YCyvdHV71 z&={XN+rfDGV*c@B_;oh_w&3%Pf4y8g+tm41j94>&&zGz)l_s zOnDX!Pb1c|%QCX`?+O6DyyipB(1>r_flwwTA3+3EG zgheZ)wQ9Xq@D~6Gmac^(UWL9)V)|;+mt{*u5{-0bK_E~S=cPwm!Zes_yD^hp4rnPk`Cb7!dVzu8OmAx+8O zB}f$l;>ii|cTjIfph=~rCUy&Iut;-DGE9Z^7h_WK5}bF#CxM{017(ve>yIcW)afay zQil@@5s+dk;@?oP?PX1>RE#3laK&=50m8=eQoJNwn7{%y5Dl{j^_QAZf(fz!Ewv;H z+*0-iOwDAxH3FxjXGiKUYu7Sxqj_o35V<~@s2OLNc10kX`6FGu#wL*uS+Lc}A!w}E zY(*H9GvI3~ktrgnhnCa`S*__y>>4eB@$6HLt^TtV=ep2$P70OW3{OVU>U$S=8Kng)w(a1AYBO8TU-4I$ZP&(Hw z#FDQ>Qk=210y~P=Leb_ZqZ>@i+d7g!pH$;Vjz; zwR(Q}J2rk^-k6UUliwc?$H%+;=wbX(F%$%A{nsWR_oXDw1gL_H?Bvn)S4S|&3~i|t zK4lG6YcQ~(pk3^Y*!g$MRvgjU^w5!*T+t+BxC`1^&%O(phuin}yVK)w{Ir5k0em~F z_$?zmXuE_^ic?EEUm+^%%I1r$l!!=mT4Zs1pRGMZN|bX(@f?e^VVpS(pjvol-@$#_ zn23s7_EHink>dSP^xuLcq8-Yqr096-90iW5x#Z~dmx3hx6-bpGogwt9#dGwHEhS5- zZnm=_WBWWBQ_P2veqx{UfTk&Bk)1#LHp$91!72`>x=S!F`nx&iIDE`Ee#dqp zeJAh6@9MU%Y%miT(wdrZhbO literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:14.035375207Z_DocumentQuery_90af5a08200f1b0e42dbd3ad7a6af38ff6415d9cabab87315b9d9d736194597f.json b/packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:14.035375207Z_DocumentQuery_90af5a08200f1b0e42dbd3ad7a6af38ff6415d9cabab87315b9d9d736194597f.json new file mode 100644 index 0000000000000000000000000000000000000000..be23c77cb6dc6b4007d8108dfa3b284a0224b70b GIT binary patch literal 24328 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:14.035494051Z_GetProtocolVersionUpgradeVoteStatusRequest_92a45a0fe4f69d355022d2f2f7622dfc69cc7b123be24b7ad993281979b2a3a2.json b/packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:14.035494051Z_GetProtocolVersionUpgradeVoteStatusRequest_92a45a0fe4f69d355022d2f2f7622dfc69cc7b123be24b7ad993281979b2a3a2.json new file mode 100644 index 0000000000000000000000000000000000000000..640ef6f9c4b02dab8584d9d609a8dfb641184894 GIT binary patch literal 11010 zcmeI&$!;505Czbz^%Vx!S#&)PP3BjEfS@JD5@LxCMHvYU{d>AKnSE{yZ?cQMu-)u8 z)T`mvt$O|C;@!L1=l${i=5ROr<=vOzar~is`~UECf7%^S+fT>C_Vm~GdUt<4y!`cP z;5fMZ`Nx0%dp*49^tV^#&MprRcc($|)x9ZvHkjn|e)#QleAqutcpUzIym-9$>0&hG z_w0JRKkcq|r`?&Yhe_A_n-ACHPP6Lz&Focx;mzgYxZhr0?{4n49}ky*?60l{m?A4=@MwK0YpZqlZ_+ixJ)%(%KpI&}- z?s3kU1mk0SU4MKS-Zp-iPv6gZUA3AHXiGPkpQ&x!VtuCCr)MT?7Sk1Lfeh6#Vu1{U zrKd}**rMM|-_LnovSX{|bi!&qeJ(a+zgi;k+WBjautB2MAwg>_Su12{bADLzT=B!4 zbLWU2`-fZ@8zFhCnx;x+FtUXwo`>w{R}CGvj_n#Nx_}BzS4SDO=D5u*YJpHy2+=sT zp4CDMBer$;4v)?7F=DlG>HX!oBVOilOnk2`Tw}wOrZe^oC}U*BLD3|(;Vr(wql1Z7 zY#6S&V((JaA#+T9U+v7tq*j&RQf>M32T$`L(QD{(Izyt#|$ud5UXkDyC$#28Jq z-vE_o9Am_VA<17I);)!CGzVT9F-D&HP+u%eFvR zUC;g3Xty+anZcVGSqN%{)XgvxN&}^%2nk&+-9jW;0-3@7*Bmp-$+lob6H^7F z4G>XUvFt`2(7Y z=#$k)9@oVJ&t0Ly{$?-PheXSwtaMU|fd1ry*gK%NS?#wVy&LGGBFMoa&B;Hj!(&Px zv%az?(wf07uV{_>U@qi@5K-1Nea!F=Zr*f}2uOV@;@^X;(Y{rUR58jR!xhbi0ECSN zivE)B!U6?|hDU=?0sSQ>6ktp)VYd}gph#I=nr_H=Yn-cf9)d%cWk?yg=IJOJBG;Ea zvy3yO>hUErf26DLp@{(@5omJcAT-u%7PAKB9QQSqh!m03qd}w+Lh+`aD3gM{SP(|l zAGs*%Btf@T;1@2Yrpm}Iy|&!736jAcM5kz>2q#2djJKGM`Nl~z{UqfLgIRy8e%)5L zFHt)hn-W1$(a1AYo7pJX>V{Ybfzr5&5L<}EA7{X{fRLOandZx%u36mK-5E!WIb(PobL^yVe-RyRt@DyGZTgcbctQrx1% z5X#6(nT<{OVuG41udJGNa)~0*PS%@X0MU=`U+zH1vit4oczl@s`EWQs+~)25_);>I zl@M~om8Eh;yVxt2prnzV*s`=&^O7@=A$hR+Vh>qsAh4kjbun&g=TecaIHI%Zp(8Ox zF9t|4+;!So&%fz1_ctHzcBhBq_=N#C;@0Pq-!j6(IKf|%oLbV!G^KTA^Cg_lh?J*A z7WZzYsn4Ji<(g4E$0jY@GIAJ>YT;SYcTi3TM8z$7Nr_V=JT3Zf0TRu4;#5L(Nvos4 zku{eXo%WKDguTL3MMqZ%zA8QSCMHVBlBxqEaZB!P>b(Qx;V%Z8NmiML3h&E14 zF$?F(BU&W?*?Uy~^5`TJb_)y!d2>*nxJb7E%yvPHFo4RING)O0hD(K<;()3tX_1{j z`!k3Z!ih6FRr&Ey z510kgn0rjbp(cM2+yXVq89`Yk13@R{FR`LHQz|CYnN@3iN)}A6{GdU(hi?TbgQ8a^ k)I@?C=;Akh>V@i_{{A#Fm+Dq;BgfAp$3M^izI-hC4@9p6LI3~& literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:14.065452692Z_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json b/packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:14.065452692Z_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json new file mode 100644 index 0000000000000000000000000000000000000000..7756cc12fa8bcc918031d45f55261466d6fde7df GIT binary patch literal 2425349 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 w^*VPSz}EwAu8aSwQ|GGt&;RRx<{9 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/quorum_pubkey-106-229983404293f0205c1bbd8df060c5983a47736b8d541f748d2d6c2848828110.json b/packages/rs-sdk/tests/vectors/quorum_pubkey-106-229983404293f0205c1bbd8df060c5983a47736b8d541f748d2d6c2848828110.json deleted file mode 100644 index 8b5e6bc01a..0000000000 --- a/packages/rs-sdk/tests/vectors/quorum_pubkey-106-229983404293f0205c1bbd8df060c5983a47736b8d541f748d2d6c2848828110.json +++ /dev/null @@ -1 +0,0 @@ -[171,13,238,72,178,194,244,145,244,25,53,212,14,213,36,140,137,45,55,192,173,115,171,41,56,246,189,13,12,154,233,99,73,223,71,159,152,175,221,219,229,246,228,207,100,188,7,189] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/quorum_pubkey-106-50df0cfb07677aa8cf0272f3fce475024d266e0c12522b28f20e10da0b1a1eb7.json b/packages/rs-sdk/tests/vectors/quorum_pubkey-106-50df0cfb07677aa8cf0272f3fce475024d266e0c12522b28f20e10da0b1a1eb7.json new file mode 100644 index 0000000000..19bfc16207 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/quorum_pubkey-106-50df0cfb07677aa8cf0272f3fce475024d266e0c12522b28f20e10da0b1a1eb7.json @@ -0,0 +1 @@ +[184,46,156,117,198,105,212,32,192,111,94,147,0,246,182,205,26,177,155,109,154,21,236,240,179,138,2,98,3,137,9,194,37,96,165,141,87,19,160,95,66,255,203,125,9,111,206,162] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/quorum_pubkey-106-7b90b0a3c4f2577b80875327ef78201d413457dc90b5ecd24f4289973f36769d.json b/packages/rs-sdk/tests/vectors/quorum_pubkey-106-7b90b0a3c4f2577b80875327ef78201d413457dc90b5ecd24f4289973f36769d.json deleted file mode 100644 index 7af2166ac0..0000000000 --- a/packages/rs-sdk/tests/vectors/quorum_pubkey-106-7b90b0a3c4f2577b80875327ef78201d413457dc90b5ecd24f4289973f36769d.json +++ /dev/null @@ -1 +0,0 @@ -[139,82,100,243,110,219,128,14,41,255,188,173,115,96,249,222,245,107,234,228,126,150,240,64,51,240,79,241,173,179,241,175,144,57,168,4,206,144,166,44,255,180,178,46,237,36,29,138] \ No newline at end of file diff --git a/packages/simple-signer/Cargo.toml b/packages/simple-signer/Cargo.toml index 5087631736..209473d420 100644 --- a/packages/simple-signer/Cargo.toml +++ b/packages/simple-signer/Cargo.toml @@ -7,7 +7,7 @@ rust-version = "1.73" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -anyhow = { version = "1.0.70" } +anyhow = { version = "1.0.75" } bincode = { version = "2.0.0-rc.3", features = ["serde"] } dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.2" } dpp = { path = "../rs-dpp", features = ["abci"] } diff --git a/packages/strategy-tests/Cargo.toml b/packages/strategy-tests/Cargo.toml index 1deb64aa55..afb0038bdb 100644 --- a/packages/strategy-tests/Cargo.toml +++ b/packages/strategy-tests/Cargo.toml @@ -10,8 +10,6 @@ edition = "2021" rust-version = "1.73" license = "MIT" -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - [dependencies] bincode = { version = "2.0.0-rc.3", features = ["serde"] } drive = { path = "../rs-drive" } @@ -31,14 +29,11 @@ dpp = { path = "../rs-dpp", features = [ ] } simple-signer = { path = "../simple-signer" } platform-version = { path = "../rs-platform-version" } -platform-serialization-derive = { path = "../rs-platform-serialization-derive" } [dev-dependencies] platform-version = { path = "../rs-platform-version", features = [ "mock-versions", ] } -drive = { path = "../rs-drive" } - # For tests of grovedb verify rocksdb = { version = "0.21.0" } diff --git a/packages/strategy-tests/src/transitions.rs b/packages/strategy-tests/src/transitions.rs index db7821ff0b..53a2657707 100644 --- a/packages/strategy-tests/src/transitions.rs +++ b/packages/strategy-tests/src/transitions.rs @@ -234,10 +234,9 @@ pub fn create_identity_top_up_transition( instant_asset_lock_proof_fixture(PrivateKey::new(secret_key, Network::Dash)); IdentityTopUpTransition::try_from_identity( - identity.clone(), + identity, asset_lock_proof, secret_key.as_ref(), - &NativeBlsModule, platform_version, None, ) @@ -665,7 +664,7 @@ pub fn create_state_transitions_for_identities( instant_asset_lock_proof_fixture(PrivateKey::new(secret_key, Network::Dash)); let identity_create_transition = IdentityCreateTransition::try_from_identity_with_signer( - identity.clone(), + &identity, asset_lock_proof, pk.as_slice(), signer, diff --git a/packages/wasm-dpp/Cargo.toml b/packages/wasm-dpp/Cargo.toml index 708ef2f09a..050aafcdcd 100644 --- a/packages/wasm-dpp/Cargo.toml +++ b/packages/wasm-dpp/Cargo.toml @@ -47,10 +47,10 @@ wasm-logger = { version = "0.2.0" } num_enum = "0.5.7" hex = { version = "0.4" } +anyhow = { version = "1.0.75" } +# required, cargo-machete false positive wasm-bindgen-futures = "0.4.33" async-trait = "0.1.59" -anyhow = "1.0.70" - [profile.release] lto = true opt-level = 's' diff --git a/packages/wasm-dpp/src/identity/identity_facade.rs b/packages/wasm-dpp/src/identity/identity_facade.rs index 752d0640de..cbfbc660ec 100644 --- a/packages/wasm-dpp/src/identity/identity_facade.rs +++ b/packages/wasm-dpp/src/identity/identity_facade.rs @@ -178,7 +178,7 @@ impl IdentityFacadeWasm { self.0 .create_identity_create_transition( - Identity::from(identity.to_owned()), + &Identity::from(identity.to_owned()), asset_lock_proof, ) .map(Into::into) diff --git a/packages/wasm-dpp/src/identity/identity_factory.rs b/packages/wasm-dpp/src/identity/identity_factory.rs index 384cd38226..150c473c6a 100644 --- a/packages/wasm-dpp/src/identity/identity_factory.rs +++ b/packages/wasm-dpp/src/identity/identity_factory.rs @@ -163,7 +163,7 @@ impl IdentityFactoryWasm { self.0 .create_identity_create_transition( - Identity::from(identity.to_owned()), + &Identity::from(identity.to_owned()), asset_lock_proof, ) .map(Into::into) diff --git a/packages/withdrawals-contract/Cargo.toml b/packages/withdrawals-contract/Cargo.toml index 886bb5c8e3..2d7d680b2d 100644 --- a/packages/withdrawals-contract/Cargo.toml +++ b/packages/withdrawals-contract/Cargo.toml @@ -11,6 +11,7 @@ thiserror = "1.0.56" platform-version = { path = "../rs-platform-version" } platform-value = { path = "../rs-platform-value" } num_enum = "0.5.7" +# serde is required, `cargo machete` false positive serde = { version = "1.0.152", features = ["derive"] } serde_json = "1.0" serde_repr = "0.1.7" diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 0b9461857b..efbf84649c 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,5 +1,5 @@ [toolchain] # Rust version the same as in /README.md -channel = "stable" +channel = "1.73" targets = ["wasm32-unknown-unknown"] From 2feb87e7dfe0b66835b7c333a599ada8a35e864e Mon Sep 17 00:00:00 2001 From: Igor Markin Date: Tue, 13 Feb 2024 01:52:36 +0000 Subject: [PATCH 032/191] refactor(drive): remove min core fee per byte check (#1690) --- .../Platform/methods/identities/creditWithdrawal.ts | 5 ++--- .../identity_credit_withdrawal_transition/v0/mod.rs | 2 +- .../identity_credit_withdrawal/structure/v0/mod.rs | 10 ---------- 3 files changed, 3 insertions(+), 14 deletions(-) diff --git a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/creditWithdrawal.ts b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/creditWithdrawal.ts index 3d1ad5e990..5193d0c240 100644 --- a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/creditWithdrawal.ts +++ b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/creditWithdrawal.ts @@ -21,7 +21,7 @@ const DEFAULT_POOLING = 0; const ASSET_UNLOCK_TX_SIZE = 190; // Minimal accepted core fee per byte to avoid low fee error from core -const MIN_ASSET_UNLOCK_CORE_FEE_PER_BYTE = 5; +const MIN_ASSET_UNLOCK_CORE_FEE_PER_BYTE = 1; // Minimal withdrawal amount in credits to avoid dust error from core const MINIMAL_WITHDRAWAL_AMOUNT = ASSET_UNLOCK_TX_SIZE * MIN_ASSET_UNLOCK_CORE_FEE_PER_BYTE * 1000; @@ -77,8 +77,7 @@ export async function creditWithdrawal( const minRelayFeePerByte = Math.ceil(this.client.wallet.storage .getDefaultChainStore().state.fees.minRelay / 1000); - const coreFeePerByte = minRelayFeePerByte > MIN_ASSET_UNLOCK_CORE_FEE_PER_BYTE - ? nearestGreaterFibonacci(minRelayFeePerByte) : MIN_ASSET_UNLOCK_CORE_FEE_PER_BYTE; + const coreFeePerByte = nearestGreaterFibonacci(minRelayFeePerByte); const revision = identity.getRevision(); diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/mod.rs index 65d05fe107..d34c60f4d6 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/mod.rs @@ -24,7 +24,7 @@ use crate::{ // TODO: unsafe - we must use actual relay fee from core /// Minimal core per byte. Must be a fibonacci number -pub const MIN_CORE_FEE_PER_BYTE: u32 = 5; +pub const MIN_CORE_FEE_PER_BYTE: u32 = 1; /// Minimal amount in credits (x1000) to avoid "dust" error in Core pub const MIN_WITHDRAWAL_AMOUNT: u64 = diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/structure/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/structure/v0/mod.rs index f1680dbcd0..f5b98f59a0 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/structure/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/structure/v0/mod.rs @@ -57,16 +57,6 @@ impl IdentityCreditWithdrawalStateTransitionStructureValidationV0 return Ok(result); } - // validate core_fee is in not less than minimal relay fee - if self.core_fee_per_byte() < MIN_CORE_FEE_PER_BYTE { - result.add_error(InvalidIdentityCreditWithdrawalTransitionCoreFeeError::new( - self.core_fee_per_byte(), - MIN_CORE_FEE_PER_BYTE, - )); - - return Ok(result); - } - // validate output_script types if !self.output_script().is_p2pkh() && !self.output_script().is_p2sh() { result.add_error( From 2848340e6341d8bdae332096de4eb9436215ad27 Mon Sep 17 00:00:00 2001 From: fominok Date: Tue, 13 Feb 2024 22:51:54 +0100 Subject: [PATCH 033/191] fix: proof balance and revision for IdentityTopUp (#1678) --- .yarn/cache/fsevents-patch-19706e7e35-10.zip | Bin 23750 -> 0 bytes .../clients/core/v0/nodejs/core_protoc.js | 66 ++--- .../dapi-grpc/clients/core/v0/web/core_pb.js | 66 ++--- .../platform/v0/nodejs/platform_pbjs.js | 7 + .../platform/v0/nodejs/platform_protoc.js | 3 +- .../platform/v0/objective-c/Platform.pbobjc.h | 1 + .../platform/v0/objective-c/Platform.pbobjc.m | 4 +- .../platform/v0/python/platform_pb2.py | 267 +++++++++--------- .../clients/platform/v0/web/platform_pb.d.ts | 1 + .../clients/platform/v0/web/platform_pb.js | 3 +- .../protos/platform/v0/platform.proto | 1 + .../proto/org.dash.platform.dapi.v0.rs | 3 + .../fetchProofForStateTransitionFactory.js | 33 ++- .../src/drive/identity/fetch/queries/mod.rs | 3 + .../src/drive/prove/prove_multiple/v0/mod.rs | 4 + .../v0/mod.rs | 22 +- 16 files changed, 267 insertions(+), 217 deletions(-) delete mode 100644 .yarn/cache/fsevents-patch-19706e7e35-10.zip diff --git a/.yarn/cache/fsevents-patch-19706e7e35-10.zip b/.yarn/cache/fsevents-patch-19706e7e35-10.zip deleted file mode 100644 index aff1ab12ce57f312cc3bc58c78597020f7980e62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23750 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 diff --git a/packages/dapi-grpc/clients/core/v0/nodejs/core_protoc.js b/packages/dapi-grpc/clients/core/v0/nodejs/core_protoc.js index e286a31c46..ae974b2f81 100644 --- a/packages/dapi-grpc/clients/core/v0/nodejs/core_protoc.js +++ b/packages/dapi-grpc/clients/core/v0/nodejs/core_protoc.js @@ -13,39 +13,39 @@ var jspb = require('google-protobuf'); var goog = jspb; -var global = Function('return this')(); - -goog.exportSymbol('proto.org.dash.platform.dapi.v0.BlockHeaders', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.BlockHeadersWithChainLocksRequest', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.BlockHeadersWithChainLocksRequest.FromBlockCase', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.BlockHeadersWithChainLocksResponse', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.BlockHeadersWithChainLocksResponse.ResponsesCase', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.BloomFilter', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.BroadcastTransactionRequest', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.BroadcastTransactionResponse', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetBlockRequest', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetBlockRequest.BlockCase', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetBlockResponse', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetEstimatedTransactionFeeRequest', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetEstimatedTransactionFeeResponse', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusRequest', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.Status', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Network', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Status', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Time', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Version', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTransactionRequest', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTransactionResponse', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.InstantSendLockMessages', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.RawTransactions', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.TransactionsWithProofsRequest', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.TransactionsWithProofsRequest.FromBlockCase', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.TransactionsWithProofsResponse', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.TransactionsWithProofsResponse.ResponsesCase', null, global); +const proto = {}; + +goog.exportSymbol('proto.org.dash.platform.dapi.v0.BlockHeaders', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.BlockHeadersWithChainLocksRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.BlockHeadersWithChainLocksRequest.FromBlockCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.BlockHeadersWithChainLocksResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.BlockHeadersWithChainLocksResponse.ResponsesCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.BloomFilter', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.BroadcastTransactionRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.BroadcastTransactionResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetBlockRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetBlockRequest.BlockCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetBlockResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetEstimatedTransactionFeeRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetEstimatedTransactionFeeResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.Status', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Network', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Status', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Time', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Version', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTransactionRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTransactionResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.InstantSendLockMessages', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.RawTransactions', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.TransactionsWithProofsRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.TransactionsWithProofsRequest.FromBlockCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.TransactionsWithProofsResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.TransactionsWithProofsResponse.ResponsesCase', null, { proto }); /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a diff --git a/packages/dapi-grpc/clients/core/v0/web/core_pb.js b/packages/dapi-grpc/clients/core/v0/web/core_pb.js index e286a31c46..ae974b2f81 100644 --- a/packages/dapi-grpc/clients/core/v0/web/core_pb.js +++ b/packages/dapi-grpc/clients/core/v0/web/core_pb.js @@ -13,39 +13,39 @@ var jspb = require('google-protobuf'); var goog = jspb; -var global = Function('return this')(); - -goog.exportSymbol('proto.org.dash.platform.dapi.v0.BlockHeaders', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.BlockHeadersWithChainLocksRequest', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.BlockHeadersWithChainLocksRequest.FromBlockCase', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.BlockHeadersWithChainLocksResponse', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.BlockHeadersWithChainLocksResponse.ResponsesCase', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.BloomFilter', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.BroadcastTransactionRequest', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.BroadcastTransactionResponse', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetBlockRequest', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetBlockRequest.BlockCase', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetBlockResponse', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetEstimatedTransactionFeeRequest', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetEstimatedTransactionFeeResponse', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusRequest', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.Status', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Network', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Status', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Time', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Version', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTransactionRequest', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTransactionResponse', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.InstantSendLockMessages', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.RawTransactions', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.TransactionsWithProofsRequest', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.TransactionsWithProofsRequest.FromBlockCase', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.TransactionsWithProofsResponse', null, global); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.TransactionsWithProofsResponse.ResponsesCase', null, global); +const proto = {}; + +goog.exportSymbol('proto.org.dash.platform.dapi.v0.BlockHeaders', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.BlockHeadersWithChainLocksRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.BlockHeadersWithChainLocksRequest.FromBlockCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.BlockHeadersWithChainLocksResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.BlockHeadersWithChainLocksResponse.ResponsesCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.BloomFilter', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.BroadcastTransactionRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.BroadcastTransactionResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetBlockRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetBlockRequest.BlockCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetBlockResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetEstimatedTransactionFeeRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetEstimatedTransactionFeeResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.Status', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Network', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Status', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Time', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Version', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTransactionRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTransactionResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.InstantSendLockMessages', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.RawTransactions', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.TransactionsWithProofsRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.TransactionsWithProofsRequest.FromBlockCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.TransactionsWithProofsResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.TransactionsWithProofsResponse.ResponsesCase', null, { proto }); /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a diff --git a/packages/dapi-grpc/clients/platform/v0/nodejs/platform_pbjs.js b/packages/dapi-grpc/clients/platform/v0/nodejs/platform_pbjs.js index f1dafcc929..5eb556fef9 100644 --- a/packages/dapi-grpc/clients/platform/v0/nodejs/platform_pbjs.js +++ b/packages/dapi-grpc/clients/platform/v0/nodejs/platform_pbjs.js @@ -9736,6 +9736,7 @@ $root.org = (function() { case 0: case 1: case 2: + case 3: break; } return null; @@ -9771,6 +9772,10 @@ $root.org = (function() { case 2: message.requestType = 2; break; + case "REVISION": + case 3: + message.requestType = 3; + break; } return message; }; @@ -9823,12 +9828,14 @@ $root.org = (function() { * @property {number} FULL_IDENTITY=0 FULL_IDENTITY value * @property {number} BALANCE=1 BALANCE value * @property {number} KEYS=2 KEYS value + * @property {number} REVISION=3 REVISION value */ IdentityRequest.Type = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "FULL_IDENTITY"] = 0; values[valuesById[1] = "BALANCE"] = 1; values[valuesById[2] = "KEYS"] = 2; + values[valuesById[3] = "REVISION"] = 3; return values; })(); diff --git a/packages/dapi-grpc/clients/platform/v0/nodejs/platform_protoc.js b/packages/dapi-grpc/clients/platform/v0/nodejs/platform_protoc.js index 9d6d3e76cf..b22490b4b7 100644 --- a/packages/dapi-grpc/clients/platform/v0/nodejs/platform_protoc.js +++ b/packages/dapi-grpc/clients/platform/v0/nodejs/platform_protoc.js @@ -10055,7 +10055,8 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type = { FULL_IDENTITY: 0, BALANCE: 1, - KEYS: 2 + KEYS: 2, + REVISION: 3 }; /** diff --git a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.h b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.h index 6939dd72dc..d5817bc9d7 100644 --- a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.h +++ b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.h @@ -130,6 +130,7 @@ typedef GPB_ENUM(GetProofsRequest_GetProofsRequestV0_IdentityRequest_Type) { GetProofsRequest_GetProofsRequestV0_IdentityRequest_Type_FullIdentity = 0, GetProofsRequest_GetProofsRequestV0_IdentityRequest_Type_Balance = 1, GetProofsRequest_GetProofsRequestV0_IdentityRequest_Type_Keys = 2, + GetProofsRequest_GetProofsRequestV0_IdentityRequest_Type_Revision = 3, }; GPBEnumDescriptor *GetProofsRequest_GetProofsRequestV0_IdentityRequest_Type_EnumDescriptor(void); diff --git a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.m b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.m index e5ece015ec..ab9e7ecf4a 100644 --- a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.m +++ b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.m @@ -2591,11 +2591,12 @@ void SetGetProofsRequest_GetProofsRequestV0_IdentityRequest_RequestType_RawValue static _Atomic(GPBEnumDescriptor*) descriptor = nil; if (!descriptor) { static const char *valueNames = - "FullIdentity\000Balance\000Keys\000"; + "FullIdentity\000Balance\000Keys\000Revision\000"; static const int32_t values[] = { GetProofsRequest_GetProofsRequestV0_IdentityRequest_Type_FullIdentity, GetProofsRequest_GetProofsRequestV0_IdentityRequest_Type_Balance, GetProofsRequest_GetProofsRequestV0_IdentityRequest_Type_Keys, + GetProofsRequest_GetProofsRequestV0_IdentityRequest_Type_Revision, }; GPBEnumDescriptor *worker = [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol(GetProofsRequest_GetProofsRequestV0_IdentityRequest_Type) @@ -2616,6 +2617,7 @@ BOOL GetProofsRequest_GetProofsRequestV0_IdentityRequest_Type_IsValidValue(int32 case GetProofsRequest_GetProofsRequestV0_IdentityRequest_Type_FullIdentity: case GetProofsRequest_GetProofsRequestV0_IdentityRequest_Type_Balance: case GetProofsRequest_GetProofsRequestV0_IdentityRequest_Type_Keys: + case GetProofsRequest_GetProofsRequestV0_IdentityRequest_Type_Revision: return YES; default: return NO; diff --git a/packages/dapi-grpc/clients/platform/v0/python/platform_pb2.py b/packages/dapi-grpc/clients/platform/v0/python/platform_pb2.py index 36cc42d123..fe85c6298a 100644 --- a/packages/dapi-grpc/clients/platform/v0/python/platform_pb2.py +++ b/packages/dapi-grpc/clients/platform/v0/python/platform_pb2.py @@ -22,7 +22,7 @@ syntax='proto3', serialized_options=None, create_key=_descriptor._internal_create_key, - serialized_pb=b'\n\x0eplatform.proto\x12\x19org.dash.platform.dapi.v0\x1a\x1egoogle/protobuf/wrappers.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"\x81\x01\n\x05Proof\x12\x15\n\rgrovedb_proof\x18\x01 \x01(\x0c\x12\x13\n\x0bquorum_hash\x18\x02 \x01(\x0c\x12\x11\n\tsignature\x18\x03 \x01(\x0c\x12\r\n\x05round\x18\x04 \x01(\r\x12\x15\n\rblock_id_hash\x18\x05 \x01(\x0c\x12\x13\n\x0bquorum_type\x18\x06 \x01(\r\"\x90\x01\n\x10ResponseMetadata\x12\x0e\n\x06height\x18\x01 \x01(\x04\x12 \n\x18\x63ore_chain_locked_height\x18\x02 \x01(\r\x12\r\n\x05\x65poch\x18\x03 \x01(\r\x12\x0f\n\x07time_ms\x18\x04 \x01(\x04\x12\x18\n\x10protocol_version\x18\x05 \x01(\r\x12\x10\n\x08\x63hain_id\x18\x06 \x01(\t\"L\n\x1dStateTransitionBroadcastError\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\x0f\n\x07message\x18\x02 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x03 \x01(\x0c\";\n\x1f\x42roadcastStateTransitionRequest\x12\x18\n\x10state_transition\x18\x01 \x01(\x0c\"\"\n BroadcastStateTransitionResponse\"\xa4\x01\n\x12GetIdentityRequest\x12P\n\x02v0\x18\x01 \x01(\x0b\x32\x42.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0H\x00\x1a\x31\n\x14GetIdentityRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xc0\x01\n\x19GetIdentityBalanceRequest\x12^\n\x02v0\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0H\x00\x1a\x38\n\x1bGetIdentityBalanceRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xec\x01\n$GetIdentityBalanceAndRevisionRequest\x12t\n\x02v0\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0H\x00\x1a\x43\n&GetIdentityBalanceAndRevisionRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x9e\x02\n\x13GetIdentityResponse\x12R\n\x02v0\x18\x01 \x01(\x0b\x32\x44.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0H\x00\x1a\xa7\x01\n\x15GetIdentityResponseV0\x12\x12\n\x08identity\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xad\x01\n\x14GetIdentitiesRequest\x12T\n\x02v0\x18\x01 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0H\x00\x1a\x34\n\x16GetIdentitiesRequestV0\x12\x0b\n\x03ids\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xda\x04\n\x15GetIdentitiesResponse\x12V\n\x02v0\x18\x01 \x01(\x0b\x32H.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0H\x00\x1a\x1e\n\rIdentityValue\x12\r\n\x05value\x18\x01 \x01(\x0c\x1ak\n\rIdentityEntry\x12\x0b\n\x03key\x18\x01 \x01(\x0c\x12M\n\x05value\x18\x02 \x01(\x0b\x32>.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue\x1a\x66\n\nIdentities\x12X\n\x10identity_entries\x18\x01 \x03(\x0b\x32>.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry\x1a\xe8\x01\n\x17GetIdentitiesResponseV0\x12Q\n\nidentities\x18\x01 \x01(\x0b\x32;.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentitiesH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb9\x02\n\x1aGetIdentityBalanceResponse\x12`\n\x02v0\x18\x01 \x01(\x0b\x32R.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0H\x00\x1a\xad\x01\n\x1cGetIdentityBalanceResponseV0\x12\x11\n\x07\x62\x61lance\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xa9\x04\n%GetIdentityBalanceAndRevisionResponse\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0H\x00\x1a\xfc\x02\n\'GetIdentityBalanceAndRevisionResponseV0\x12\x9b\x01\n\x14\x62\x61lance_and_revision\x18\x01 \x01(\x0b\x32{.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevisionH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x37\n\x12\x42\x61lanceAndRevision\x12\x0f\n\x07\x62\x61lance\x18\x01 \x01(\x04\x12\x10\n\x08revision\x18\x02 \x01(\x04\x42\x08\n\x06resultB\t\n\x07version\"\xd1\x01\n\x0eKeyRequestType\x12\x36\n\x08\x61ll_keys\x18\x01 \x01(\x0b\x32\".org.dash.platform.dapi.v0.AllKeysH\x00\x12@\n\rspecific_keys\x18\x02 \x01(\x0b\x32\'.org.dash.platform.dapi.v0.SpecificKeysH\x00\x12:\n\nsearch_key\x18\x03 \x01(\x0b\x32$.org.dash.platform.dapi.v0.SearchKeyH\x00\x42\t\n\x07request\"\t\n\x07\x41llKeys\"\x1f\n\x0cSpecificKeys\x12\x0f\n\x07key_ids\x18\x01 \x03(\r\"\xb6\x01\n\tSearchKey\x12I\n\x0bpurpose_map\x18\x01 \x03(\x0b\x32\x34.org.dash.platform.dapi.v0.SearchKey.PurposeMapEntry\x1a^\n\x0fPurposeMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12:\n\x05value\x18\x02 \x01(\x0b\x32+.org.dash.platform.dapi.v0.SecurityLevelMap:\x02\x38\x01\"\xbf\x02\n\x10SecurityLevelMap\x12]\n\x12security_level_map\x18\x01 \x03(\x0b\x32\x41.org.dash.platform.dapi.v0.SecurityLevelMap.SecurityLevelMapEntry\x1aw\n\x15SecurityLevelMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12M\n\x05value\x18\x02 \x01(\x0e\x32>.org.dash.platform.dapi.v0.SecurityLevelMap.KeyKindRequestType:\x02\x38\x01\"S\n\x12KeyKindRequestType\x12\x1f\n\x1b\x43URRENT_KEY_OF_KIND_REQUEST\x10\x00\x12\x1c\n\x18\x41LL_KEYS_OF_KIND_REQUEST\x10\x01\"\xda\x02\n\x16GetIdentityKeysRequest\x12X\n\x02v0\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0H\x00\x1a\xda\x01\n\x18GetIdentityKeysRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12?\n\x0crequest_type\x18\x02 \x01(\x0b\x32).org.dash.platform.dapi.v0.KeyRequestType\x12+\n\x05limit\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12,\n\x06offset\x18\x04 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\t\n\x07version\"\x99\x03\n\x17GetIdentityKeysResponse\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0H\x00\x1a\x96\x02\n\x19GetIdentityKeysResponseV0\x12\x61\n\x04keys\x18\x01 \x01(\x0b\x32Q.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.KeysH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x1a\n\x04Keys\x12\x12\n\nkeys_bytes\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version\"\x93\x06\n\x10GetProofsRequest\x12L\n\x02v0\x18\x01 \x01(\x0b\x32>.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0H\x00\x1a\xa5\x05\n\x12GetProofsRequestV0\x12\x62\n\nidentities\x18\x01 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest\x12\x61\n\tcontracts\x18\x02 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest\x12\x61\n\tdocuments\x18\x03 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest\x1aw\n\x0f\x44ocumentRequest\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x15\n\rdocument_type\x18\x02 \x01(\t\x12#\n\x1b\x64ocument_type_keeps_history\x18\x03 \x01(\x08\x12\x13\n\x0b\x64ocument_id\x18\x04 \x01(\x0c\x1a\xc3\x01\n\x0fIdentityRequest\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12i\n\x0crequest_type\x18\x02 \x01(\x0e\x32S.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type\"0\n\x04Type\x12\x11\n\rFULL_IDENTITY\x10\x00\x12\x0b\n\x07\x42\x41LANCE\x10\x01\x12\x08\n\x04KEYS\x10\x02\x1a&\n\x0f\x43ontractRequest\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x42\t\n\x07version\"\x82\x02\n\x11GetProofsResponse\x12N\n\x02v0\x18\x01 \x01(\x0b\x32@.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0H\x00\x1a\x91\x01\n\x13GetProofsResponseV0\x12\x31\n\x05proof\x18\x01 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x02 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb4\x01\n\x16GetDataContractRequest\x12X\n\x02v0\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0H\x00\x1a\x35\n\x18GetDataContractRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xb3\x02\n\x17GetDataContractResponse\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0H\x00\x1a\xb0\x01\n\x19GetDataContractResponseV0\x12\x17\n\rdata_contract\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb9\x01\n\x17GetDataContractsRequest\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0H\x00\x1a\x37\n\x19GetDataContractsRequestV0\x12\x0b\n\x03ids\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xcf\x04\n\x18GetDataContractsResponse\x12\\\n\x02v0\x18\x01 \x01(\x0b\x32N.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0H\x00\x1a[\n\x11\x44\x61taContractEntry\x12\x12\n\nidentifier\x18\x01 \x01(\x0c\x12\x32\n\rdata_contract\x18\x02 \x01(\x0b\x32\x1b.google.protobuf.BytesValue\x1au\n\rDataContracts\x12\x64\n\x15\x64\x61ta_contract_entries\x18\x01 \x03(\x0b\x32\x45.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry\x1a\xf5\x01\n\x1aGetDataContractsResponseV0\x12[\n\x0e\x64\x61ta_contracts\x18\x01 \x01(\x0b\x32\x41.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xc1\x02\n\x1dGetDataContractHistoryRequest\x12\x66\n\x02v0\x18\x01 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0H\x00\x1a\xac\x01\n\x1fGetDataContractHistoryRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12+\n\x05limit\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12,\n\x06offset\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\x13\n\x0bstart_at_ms\x18\x04 \x01(\x04\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\t\n\x07version\"\xae\x05\n\x1eGetDataContractHistoryResponse\x12h\n\x02v0\x18\x01 \x01(\x0b\x32Z.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0H\x00\x1a\x96\x04\n GetDataContractHistoryResponseV0\x12\x8f\x01\n\x15\x64\x61ta_contract_history\x18\x01 \x01(\x0b\x32n.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x37\n\x18\x44\x61taContractHistoryEntry\x12\x0c\n\x04\x64\x61te\x18\x01 \x01(\x04\x12\r\n\x05value\x18\x02 \x01(\x0c\x1a\xaa\x01\n\x13\x44\x61taContractHistory\x12\x92\x01\n\x15\x64\x61ta_contract_entries\x18\x01 \x03(\x0b\x32s.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntryB\x08\n\x06resultB\t\n\x07version\"\xb2\x02\n\x13GetDocumentsRequest\x12R\n\x02v0\x18\x01 \x01(\x0b\x32\x44.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0H\x00\x1a\xbb\x01\n\x15GetDocumentsRequestV0\x12\x18\n\x10\x64\x61ta_contract_id\x18\x01 \x01(\x0c\x12\x15\n\rdocument_type\x18\x02 \x01(\t\x12\r\n\x05where\x18\x03 \x01(\x0c\x12\x10\n\x08order_by\x18\x04 \x01(\x0c\x12\r\n\x05limit\x18\x05 \x01(\r\x12\x15\n\x0bstart_after\x18\x06 \x01(\x0cH\x00\x12\x12\n\x08start_at\x18\x07 \x01(\x0cH\x00\x12\r\n\x05prove\x18\x08 \x01(\x08\x42\x07\n\x05startB\t\n\x07version\"\x95\x03\n\x14GetDocumentsResponse\x12T\n\x02v0\x18\x01 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0H\x00\x1a\x9b\x02\n\x16GetDocumentsResponseV0\x12\x65\n\tdocuments\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.DocumentsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x1e\n\tDocuments\x12\x11\n\tdocuments\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version\"\xff\x01\n%GetIdentitiesByPublicKeyHashesRequest\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0H\x00\x1aS\n\'GetIdentitiesByPublicKeyHashesRequestV0\x12\x19\n\x11public_key_hashes\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xc6\x05\n&GetIdentitiesByPublicKeyHashesResponse\x12x\n\x02v0\x18\x01 \x01(\x0b\x32j.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0H\x00\x1a\x61\n\x1aPublicKeyHashIdentityEntry\x12\x17\n\x0fpublic_key_hash\x18\x01 \x01(\x0c\x12*\n\x05value\x18\x02 \x01(\x0b\x32\x1b.google.protobuf.BytesValue\x1a\x95\x01\n\x1bIdentitiesByPublicKeyHashes\x12v\n\x10identity_entries\x18\x01 \x03(\x0b\x32\\.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry\x1a\x9b\x02\n(GetIdentitiesByPublicKeyHashesResponseV0\x12s\n\nidentities\x18\x01 \x01(\x0b\x32].org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashesH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xed\x01\n!GetIdentityByPublicKeyHashRequest\x12n\n\x02v0\x18\x01 \x01(\x0b\x32`.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0H\x00\x1aM\n#GetIdentityByPublicKeyHashRequestV0\x12\x17\n\x0fpublic_key_hash\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xda\x02\n\"GetIdentityByPublicKeyHashResponse\x12p\n\x02v0\x18\x01 \x01(\x0b\x32\x62.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0H\x00\x1a\xb6\x01\n$GetIdentityByPublicKeyHashResponseV0\x12\x12\n\x08identity\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xfb\x01\n#WaitForStateTransitionResultRequest\x12r\n\x02v0\x18\x01 \x01(\x0b\x32\x64.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0H\x00\x1aU\n%WaitForStateTransitionResultRequestV0\x12\x1d\n\x15state_transition_hash\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x99\x03\n$WaitForStateTransitionResultResponse\x12t\n\x02v0\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0H\x00\x1a\xef\x01\n&WaitForStateTransitionResultResponseV0\x12I\n\x05\x65rror\x18\x01 \x01(\x0b\x32\x38.org.dash.platform.dapi.v0.StateTransitionBroadcastErrorH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xc4\x01\n\x19GetConsensusParamsRequest\x12^\n\x02v0\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0H\x00\x1a<\n\x1bGetConsensusParamsRequestV0\x12\x0e\n\x06height\x18\x01 \x01(\x05\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x9c\x04\n\x1aGetConsensusParamsResponse\x12`\n\x02v0\x18\x01 \x01(\x0b\x32R.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0H\x00\x1aP\n\x14\x43onsensusParamsBlock\x12\x11\n\tmax_bytes\x18\x01 \x01(\t\x12\x0f\n\x07max_gas\x18\x02 \x01(\t\x12\x14\n\x0ctime_iota_ms\x18\x03 \x01(\t\x1a\x62\n\x17\x43onsensusParamsEvidence\x12\x1a\n\x12max_age_num_blocks\x18\x01 \x01(\t\x12\x18\n\x10max_age_duration\x18\x02 \x01(\t\x12\x11\n\tmax_bytes\x18\x03 \x01(\t\x1a\xda\x01\n\x1cGetConsensusParamsResponseV0\x12Y\n\x05\x62lock\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock\x12_\n\x08\x65vidence\x18\x02 \x01(\x0b\x32M.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidenceB\t\n\x07version\"\xe4\x01\n%GetProtocolVersionUpgradeStateRequest\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0H\x00\x1a\x38\n\'GetProtocolVersionUpgradeStateRequestV0\x12\r\n\x05prove\x18\x01 \x01(\x08\x42\t\n\x07version\"\xb5\x05\n&GetProtocolVersionUpgradeStateResponse\x12x\n\x02v0\x18\x01 \x01(\x0b\x32j.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0H\x00\x1a\x85\x04\n(GetProtocolVersionUpgradeStateResponseV0\x12\x87\x01\n\x08versions\x18\x01 \x01(\x0b\x32s.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x96\x01\n\x08Versions\x12\x89\x01\n\x08versions\x18\x01 \x03(\x0b\x32w.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry\x1a:\n\x0cVersionEntry\x12\x16\n\x0eversion_number\x18\x01 \x01(\r\x12\x12\n\nvote_count\x18\x02 \x01(\rB\x08\n\x06resultB\t\n\x07version\"\xa3\x02\n*GetProtocolVersionUpgradeVoteStatusRequest\x12\x80\x01\n\x02v0\x18\x01 \x01(\x0b\x32r.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0H\x00\x1ag\n,GetProtocolVersionUpgradeVoteStatusRequestV0\x12\x19\n\x11start_pro_tx_hash\x18\x01 \x01(\x0c\x12\r\n\x05\x63ount\x18\x02 \x01(\r\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\xef\x05\n+GetProtocolVersionUpgradeVoteStatusResponse\x12\x82\x01\n\x02v0\x18\x01 \x01(\x0b\x32t.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0H\x00\x1a\xaf\x04\n-GetProtocolVersionUpgradeVoteStatusResponseV0\x12\x98\x01\n\x08versions\x18\x01 \x01(\x0b\x32\x83\x01.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignalsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\xaf\x01\n\x0eVersionSignals\x12\x9c\x01\n\x0fversion_signals\x18\x01 \x03(\x0b\x32\x82\x01.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal\x1a\x35\n\rVersionSignal\x12\x13\n\x0bpro_tx_hash\x18\x01 \x01(\x0c\x12\x0f\n\x07version\x18\x02 \x01(\rB\x08\n\x06resultB\t\n\x07version\"\xf5\x01\n\x14GetEpochsInfoRequest\x12T\n\x02v0\x18\x01 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0H\x00\x1a|\n\x16GetEpochsInfoRequestV0\x12\x31\n\x0bstart_epoch\x18\x01 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\r\n\x05\x63ount\x18\x02 \x01(\r\x12\x11\n\tascending\x18\x03 \x01(\x08\x12\r\n\x05prove\x18\x04 \x01(\x08\x42\t\n\x07version\"\xf7\x04\n\x15GetEpochsInfoResponse\x12V\n\x02v0\x18\x01 \x01(\x0b\x32H.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0H\x00\x1a\xfa\x03\n\x17GetEpochsInfoResponseV0\x12\x65\n\x06\x65pochs\x18\x01 \x01(\x0b\x32S.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfosH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1au\n\nEpochInfos\x12g\n\x0b\x65poch_infos\x18\x01 \x03(\x0b\x32R.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo\x1a\x84\x01\n\tEpochInfo\x12\x0e\n\x06number\x18\x01 \x01(\r\x12\x1a\n\x12\x66irst_block_height\x18\x02 \x01(\x04\x12\x1f\n\x17\x66irst_core_block_height\x18\x03 \x01(\r\x12\x12\n\nstart_time\x18\x04 \x01(\x04\x12\x16\n\x0e\x66\x65\x65_multiplier\x18\x05 \x01(\x01\x42\x08\n\x06resultB\t\n\x07version2\xc2\x13\n\x08Platform\x12\x93\x01\n\x18\x62roadcastStateTransition\x12:.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest\x1a;.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse\x12l\n\x0bgetIdentity\x12-.org.dash.platform.dapi.v0.GetIdentityRequest\x1a..org.dash.platform.dapi.v0.GetIdentityResponse\x12r\n\rgetIdentities\x12/.org.dash.platform.dapi.v0.GetIdentitiesRequest\x1a\x30.org.dash.platform.dapi.v0.GetIdentitiesResponse\x12x\n\x0fgetIdentityKeys\x12\x31.org.dash.platform.dapi.v0.GetIdentityKeysRequest\x1a\x32.org.dash.platform.dapi.v0.GetIdentityKeysResponse\x12\x81\x01\n\x12getIdentityBalance\x12\x34.org.dash.platform.dapi.v0.GetIdentityBalanceRequest\x1a\x35.org.dash.platform.dapi.v0.GetIdentityBalanceResponse\x12\xa2\x01\n\x1dgetIdentityBalanceAndRevision\x12?.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest\x1a@.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse\x12\x66\n\tgetProofs\x12+.org.dash.platform.dapi.v0.GetProofsRequest\x1a,.org.dash.platform.dapi.v0.GetProofsResponse\x12x\n\x0fgetDataContract\x12\x31.org.dash.platform.dapi.v0.GetDataContractRequest\x1a\x32.org.dash.platform.dapi.v0.GetDataContractResponse\x12\x8d\x01\n\x16getDataContractHistory\x12\x38.org.dash.platform.dapi.v0.GetDataContractHistoryRequest\x1a\x39.org.dash.platform.dapi.v0.GetDataContractHistoryResponse\x12{\n\x10getDataContracts\x12\x32.org.dash.platform.dapi.v0.GetDataContractsRequest\x1a\x33.org.dash.platform.dapi.v0.GetDataContractsResponse\x12o\n\x0cgetDocuments\x12..org.dash.platform.dapi.v0.GetDocumentsRequest\x1a/.org.dash.platform.dapi.v0.GetDocumentsResponse\x12\xa5\x01\n\x1egetIdentitiesByPublicKeyHashes\x12@.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest\x1a\x41.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse\x12\x99\x01\n\x1agetIdentityByPublicKeyHash\x12<.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest\x1a=.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse\x12\x9f\x01\n\x1cwaitForStateTransitionResult\x12>.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest\x1a?.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse\x12\x81\x01\n\x12getConsensusParams\x12\x34.org.dash.platform.dapi.v0.GetConsensusParamsRequest\x1a\x35.org.dash.platform.dapi.v0.GetConsensusParamsResponse\x12\xa5\x01\n\x1egetProtocolVersionUpgradeState\x12@.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest\x1a\x41.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse\x12\xb4\x01\n#getProtocolVersionUpgradeVoteStatus\x12\x45.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest\x1a\x46.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse\x12r\n\rgetEpochsInfo\x12/.org.dash.platform.dapi.v0.GetEpochsInfoRequest\x1a\x30.org.dash.platform.dapi.v0.GetEpochsInfoResponseb\x06proto3' + serialized_pb=b'\n\x0eplatform.proto\x12\x19org.dash.platform.dapi.v0\x1a\x1egoogle/protobuf/wrappers.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"\x81\x01\n\x05Proof\x12\x15\n\rgrovedb_proof\x18\x01 \x01(\x0c\x12\x13\n\x0bquorum_hash\x18\x02 \x01(\x0c\x12\x11\n\tsignature\x18\x03 \x01(\x0c\x12\r\n\x05round\x18\x04 \x01(\r\x12\x15\n\rblock_id_hash\x18\x05 \x01(\x0c\x12\x13\n\x0bquorum_type\x18\x06 \x01(\r\"\x90\x01\n\x10ResponseMetadata\x12\x0e\n\x06height\x18\x01 \x01(\x04\x12 \n\x18\x63ore_chain_locked_height\x18\x02 \x01(\r\x12\r\n\x05\x65poch\x18\x03 \x01(\r\x12\x0f\n\x07time_ms\x18\x04 \x01(\x04\x12\x18\n\x10protocol_version\x18\x05 \x01(\r\x12\x10\n\x08\x63hain_id\x18\x06 \x01(\t\"L\n\x1dStateTransitionBroadcastError\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\x0f\n\x07message\x18\x02 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x03 \x01(\x0c\";\n\x1f\x42roadcastStateTransitionRequest\x12\x18\n\x10state_transition\x18\x01 \x01(\x0c\"\"\n BroadcastStateTransitionResponse\"\xa4\x01\n\x12GetIdentityRequest\x12P\n\x02v0\x18\x01 \x01(\x0b\x32\x42.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0H\x00\x1a\x31\n\x14GetIdentityRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xc0\x01\n\x19GetIdentityBalanceRequest\x12^\n\x02v0\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0H\x00\x1a\x38\n\x1bGetIdentityBalanceRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xec\x01\n$GetIdentityBalanceAndRevisionRequest\x12t\n\x02v0\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0H\x00\x1a\x43\n&GetIdentityBalanceAndRevisionRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x9e\x02\n\x13GetIdentityResponse\x12R\n\x02v0\x18\x01 \x01(\x0b\x32\x44.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0H\x00\x1a\xa7\x01\n\x15GetIdentityResponseV0\x12\x12\n\x08identity\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xad\x01\n\x14GetIdentitiesRequest\x12T\n\x02v0\x18\x01 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0H\x00\x1a\x34\n\x16GetIdentitiesRequestV0\x12\x0b\n\x03ids\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xda\x04\n\x15GetIdentitiesResponse\x12V\n\x02v0\x18\x01 \x01(\x0b\x32H.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0H\x00\x1a\x1e\n\rIdentityValue\x12\r\n\x05value\x18\x01 \x01(\x0c\x1ak\n\rIdentityEntry\x12\x0b\n\x03key\x18\x01 \x01(\x0c\x12M\n\x05value\x18\x02 \x01(\x0b\x32>.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue\x1a\x66\n\nIdentities\x12X\n\x10identity_entries\x18\x01 \x03(\x0b\x32>.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry\x1a\xe8\x01\n\x17GetIdentitiesResponseV0\x12Q\n\nidentities\x18\x01 \x01(\x0b\x32;.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentitiesH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb9\x02\n\x1aGetIdentityBalanceResponse\x12`\n\x02v0\x18\x01 \x01(\x0b\x32R.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0H\x00\x1a\xad\x01\n\x1cGetIdentityBalanceResponseV0\x12\x11\n\x07\x62\x61lance\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xa9\x04\n%GetIdentityBalanceAndRevisionResponse\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0H\x00\x1a\xfc\x02\n\'GetIdentityBalanceAndRevisionResponseV0\x12\x9b\x01\n\x14\x62\x61lance_and_revision\x18\x01 \x01(\x0b\x32{.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevisionH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x37\n\x12\x42\x61lanceAndRevision\x12\x0f\n\x07\x62\x61lance\x18\x01 \x01(\x04\x12\x10\n\x08revision\x18\x02 \x01(\x04\x42\x08\n\x06resultB\t\n\x07version\"\xd1\x01\n\x0eKeyRequestType\x12\x36\n\x08\x61ll_keys\x18\x01 \x01(\x0b\x32\".org.dash.platform.dapi.v0.AllKeysH\x00\x12@\n\rspecific_keys\x18\x02 \x01(\x0b\x32\'.org.dash.platform.dapi.v0.SpecificKeysH\x00\x12:\n\nsearch_key\x18\x03 \x01(\x0b\x32$.org.dash.platform.dapi.v0.SearchKeyH\x00\x42\t\n\x07request\"\t\n\x07\x41llKeys\"\x1f\n\x0cSpecificKeys\x12\x0f\n\x07key_ids\x18\x01 \x03(\r\"\xb6\x01\n\tSearchKey\x12I\n\x0bpurpose_map\x18\x01 \x03(\x0b\x32\x34.org.dash.platform.dapi.v0.SearchKey.PurposeMapEntry\x1a^\n\x0fPurposeMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12:\n\x05value\x18\x02 \x01(\x0b\x32+.org.dash.platform.dapi.v0.SecurityLevelMap:\x02\x38\x01\"\xbf\x02\n\x10SecurityLevelMap\x12]\n\x12security_level_map\x18\x01 \x03(\x0b\x32\x41.org.dash.platform.dapi.v0.SecurityLevelMap.SecurityLevelMapEntry\x1aw\n\x15SecurityLevelMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12M\n\x05value\x18\x02 \x01(\x0e\x32>.org.dash.platform.dapi.v0.SecurityLevelMap.KeyKindRequestType:\x02\x38\x01\"S\n\x12KeyKindRequestType\x12\x1f\n\x1b\x43URRENT_KEY_OF_KIND_REQUEST\x10\x00\x12\x1c\n\x18\x41LL_KEYS_OF_KIND_REQUEST\x10\x01\"\xda\x02\n\x16GetIdentityKeysRequest\x12X\n\x02v0\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0H\x00\x1a\xda\x01\n\x18GetIdentityKeysRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12?\n\x0crequest_type\x18\x02 \x01(\x0b\x32).org.dash.platform.dapi.v0.KeyRequestType\x12+\n\x05limit\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12,\n\x06offset\x18\x04 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\t\n\x07version\"\x99\x03\n\x17GetIdentityKeysResponse\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0H\x00\x1a\x96\x02\n\x19GetIdentityKeysResponseV0\x12\x61\n\x04keys\x18\x01 \x01(\x0b\x32Q.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.KeysH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x1a\n\x04Keys\x12\x12\n\nkeys_bytes\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version\"\xa1\x06\n\x10GetProofsRequest\x12L\n\x02v0\x18\x01 \x01(\x0b\x32>.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0H\x00\x1a\xb3\x05\n\x12GetProofsRequestV0\x12\x62\n\nidentities\x18\x01 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest\x12\x61\n\tcontracts\x18\x02 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest\x12\x61\n\tdocuments\x18\x03 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest\x1aw\n\x0f\x44ocumentRequest\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x15\n\rdocument_type\x18\x02 \x01(\t\x12#\n\x1b\x64ocument_type_keeps_history\x18\x03 \x01(\x08\x12\x13\n\x0b\x64ocument_id\x18\x04 \x01(\x0c\x1a\xd1\x01\n\x0fIdentityRequest\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12i\n\x0crequest_type\x18\x02 \x01(\x0e\x32S.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type\">\n\x04Type\x12\x11\n\rFULL_IDENTITY\x10\x00\x12\x0b\n\x07\x42\x41LANCE\x10\x01\x12\x08\n\x04KEYS\x10\x02\x12\x0c\n\x08REVISION\x10\x03\x1a&\n\x0f\x43ontractRequest\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x42\t\n\x07version\"\x82\x02\n\x11GetProofsResponse\x12N\n\x02v0\x18\x01 \x01(\x0b\x32@.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0H\x00\x1a\x91\x01\n\x13GetProofsResponseV0\x12\x31\n\x05proof\x18\x01 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x02 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb4\x01\n\x16GetDataContractRequest\x12X\n\x02v0\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0H\x00\x1a\x35\n\x18GetDataContractRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xb3\x02\n\x17GetDataContractResponse\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0H\x00\x1a\xb0\x01\n\x19GetDataContractResponseV0\x12\x17\n\rdata_contract\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb9\x01\n\x17GetDataContractsRequest\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0H\x00\x1a\x37\n\x19GetDataContractsRequestV0\x12\x0b\n\x03ids\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xcf\x04\n\x18GetDataContractsResponse\x12\\\n\x02v0\x18\x01 \x01(\x0b\x32N.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0H\x00\x1a[\n\x11\x44\x61taContractEntry\x12\x12\n\nidentifier\x18\x01 \x01(\x0c\x12\x32\n\rdata_contract\x18\x02 \x01(\x0b\x32\x1b.google.protobuf.BytesValue\x1au\n\rDataContracts\x12\x64\n\x15\x64\x61ta_contract_entries\x18\x01 \x03(\x0b\x32\x45.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry\x1a\xf5\x01\n\x1aGetDataContractsResponseV0\x12[\n\x0e\x64\x61ta_contracts\x18\x01 \x01(\x0b\x32\x41.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xc1\x02\n\x1dGetDataContractHistoryRequest\x12\x66\n\x02v0\x18\x01 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0H\x00\x1a\xac\x01\n\x1fGetDataContractHistoryRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12+\n\x05limit\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12,\n\x06offset\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\x13\n\x0bstart_at_ms\x18\x04 \x01(\x04\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\t\n\x07version\"\xae\x05\n\x1eGetDataContractHistoryResponse\x12h\n\x02v0\x18\x01 \x01(\x0b\x32Z.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0H\x00\x1a\x96\x04\n GetDataContractHistoryResponseV0\x12\x8f\x01\n\x15\x64\x61ta_contract_history\x18\x01 \x01(\x0b\x32n.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x37\n\x18\x44\x61taContractHistoryEntry\x12\x0c\n\x04\x64\x61te\x18\x01 \x01(\x04\x12\r\n\x05value\x18\x02 \x01(\x0c\x1a\xaa\x01\n\x13\x44\x61taContractHistory\x12\x92\x01\n\x15\x64\x61ta_contract_entries\x18\x01 \x03(\x0b\x32s.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntryB\x08\n\x06resultB\t\n\x07version\"\xb2\x02\n\x13GetDocumentsRequest\x12R\n\x02v0\x18\x01 \x01(\x0b\x32\x44.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0H\x00\x1a\xbb\x01\n\x15GetDocumentsRequestV0\x12\x18\n\x10\x64\x61ta_contract_id\x18\x01 \x01(\x0c\x12\x15\n\rdocument_type\x18\x02 \x01(\t\x12\r\n\x05where\x18\x03 \x01(\x0c\x12\x10\n\x08order_by\x18\x04 \x01(\x0c\x12\r\n\x05limit\x18\x05 \x01(\r\x12\x15\n\x0bstart_after\x18\x06 \x01(\x0cH\x00\x12\x12\n\x08start_at\x18\x07 \x01(\x0cH\x00\x12\r\n\x05prove\x18\x08 \x01(\x08\x42\x07\n\x05startB\t\n\x07version\"\x95\x03\n\x14GetDocumentsResponse\x12T\n\x02v0\x18\x01 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0H\x00\x1a\x9b\x02\n\x16GetDocumentsResponseV0\x12\x65\n\tdocuments\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.DocumentsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x1e\n\tDocuments\x12\x11\n\tdocuments\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version\"\xff\x01\n%GetIdentitiesByPublicKeyHashesRequest\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0H\x00\x1aS\n\'GetIdentitiesByPublicKeyHashesRequestV0\x12\x19\n\x11public_key_hashes\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xc6\x05\n&GetIdentitiesByPublicKeyHashesResponse\x12x\n\x02v0\x18\x01 \x01(\x0b\x32j.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0H\x00\x1a\x61\n\x1aPublicKeyHashIdentityEntry\x12\x17\n\x0fpublic_key_hash\x18\x01 \x01(\x0c\x12*\n\x05value\x18\x02 \x01(\x0b\x32\x1b.google.protobuf.BytesValue\x1a\x95\x01\n\x1bIdentitiesByPublicKeyHashes\x12v\n\x10identity_entries\x18\x01 \x03(\x0b\x32\\.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry\x1a\x9b\x02\n(GetIdentitiesByPublicKeyHashesResponseV0\x12s\n\nidentities\x18\x01 \x01(\x0b\x32].org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashesH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xed\x01\n!GetIdentityByPublicKeyHashRequest\x12n\n\x02v0\x18\x01 \x01(\x0b\x32`.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0H\x00\x1aM\n#GetIdentityByPublicKeyHashRequestV0\x12\x17\n\x0fpublic_key_hash\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xda\x02\n\"GetIdentityByPublicKeyHashResponse\x12p\n\x02v0\x18\x01 \x01(\x0b\x32\x62.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0H\x00\x1a\xb6\x01\n$GetIdentityByPublicKeyHashResponseV0\x12\x12\n\x08identity\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xfb\x01\n#WaitForStateTransitionResultRequest\x12r\n\x02v0\x18\x01 \x01(\x0b\x32\x64.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0H\x00\x1aU\n%WaitForStateTransitionResultRequestV0\x12\x1d\n\x15state_transition_hash\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x99\x03\n$WaitForStateTransitionResultResponse\x12t\n\x02v0\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0H\x00\x1a\xef\x01\n&WaitForStateTransitionResultResponseV0\x12I\n\x05\x65rror\x18\x01 \x01(\x0b\x32\x38.org.dash.platform.dapi.v0.StateTransitionBroadcastErrorH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xc4\x01\n\x19GetConsensusParamsRequest\x12^\n\x02v0\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0H\x00\x1a<\n\x1bGetConsensusParamsRequestV0\x12\x0e\n\x06height\x18\x01 \x01(\x05\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x9c\x04\n\x1aGetConsensusParamsResponse\x12`\n\x02v0\x18\x01 \x01(\x0b\x32R.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0H\x00\x1aP\n\x14\x43onsensusParamsBlock\x12\x11\n\tmax_bytes\x18\x01 \x01(\t\x12\x0f\n\x07max_gas\x18\x02 \x01(\t\x12\x14\n\x0ctime_iota_ms\x18\x03 \x01(\t\x1a\x62\n\x17\x43onsensusParamsEvidence\x12\x1a\n\x12max_age_num_blocks\x18\x01 \x01(\t\x12\x18\n\x10max_age_duration\x18\x02 \x01(\t\x12\x11\n\tmax_bytes\x18\x03 \x01(\t\x1a\xda\x01\n\x1cGetConsensusParamsResponseV0\x12Y\n\x05\x62lock\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock\x12_\n\x08\x65vidence\x18\x02 \x01(\x0b\x32M.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidenceB\t\n\x07version\"\xe4\x01\n%GetProtocolVersionUpgradeStateRequest\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0H\x00\x1a\x38\n\'GetProtocolVersionUpgradeStateRequestV0\x12\r\n\x05prove\x18\x01 \x01(\x08\x42\t\n\x07version\"\xb5\x05\n&GetProtocolVersionUpgradeStateResponse\x12x\n\x02v0\x18\x01 \x01(\x0b\x32j.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0H\x00\x1a\x85\x04\n(GetProtocolVersionUpgradeStateResponseV0\x12\x87\x01\n\x08versions\x18\x01 \x01(\x0b\x32s.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x96\x01\n\x08Versions\x12\x89\x01\n\x08versions\x18\x01 \x03(\x0b\x32w.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry\x1a:\n\x0cVersionEntry\x12\x16\n\x0eversion_number\x18\x01 \x01(\r\x12\x12\n\nvote_count\x18\x02 \x01(\rB\x08\n\x06resultB\t\n\x07version\"\xa3\x02\n*GetProtocolVersionUpgradeVoteStatusRequest\x12\x80\x01\n\x02v0\x18\x01 \x01(\x0b\x32r.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0H\x00\x1ag\n,GetProtocolVersionUpgradeVoteStatusRequestV0\x12\x19\n\x11start_pro_tx_hash\x18\x01 \x01(\x0c\x12\r\n\x05\x63ount\x18\x02 \x01(\r\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\xef\x05\n+GetProtocolVersionUpgradeVoteStatusResponse\x12\x82\x01\n\x02v0\x18\x01 \x01(\x0b\x32t.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0H\x00\x1a\xaf\x04\n-GetProtocolVersionUpgradeVoteStatusResponseV0\x12\x98\x01\n\x08versions\x18\x01 \x01(\x0b\x32\x83\x01.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignalsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\xaf\x01\n\x0eVersionSignals\x12\x9c\x01\n\x0fversion_signals\x18\x01 \x03(\x0b\x32\x82\x01.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal\x1a\x35\n\rVersionSignal\x12\x13\n\x0bpro_tx_hash\x18\x01 \x01(\x0c\x12\x0f\n\x07version\x18\x02 \x01(\rB\x08\n\x06resultB\t\n\x07version\"\xf5\x01\n\x14GetEpochsInfoRequest\x12T\n\x02v0\x18\x01 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0H\x00\x1a|\n\x16GetEpochsInfoRequestV0\x12\x31\n\x0bstart_epoch\x18\x01 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\r\n\x05\x63ount\x18\x02 \x01(\r\x12\x11\n\tascending\x18\x03 \x01(\x08\x12\r\n\x05prove\x18\x04 \x01(\x08\x42\t\n\x07version\"\xf7\x04\n\x15GetEpochsInfoResponse\x12V\n\x02v0\x18\x01 \x01(\x0b\x32H.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0H\x00\x1a\xfa\x03\n\x17GetEpochsInfoResponseV0\x12\x65\n\x06\x65pochs\x18\x01 \x01(\x0b\x32S.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfosH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1au\n\nEpochInfos\x12g\n\x0b\x65poch_infos\x18\x01 \x03(\x0b\x32R.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo\x1a\x84\x01\n\tEpochInfo\x12\x0e\n\x06number\x18\x01 \x01(\r\x12\x1a\n\x12\x66irst_block_height\x18\x02 \x01(\x04\x12\x1f\n\x17\x66irst_core_block_height\x18\x03 \x01(\r\x12\x12\n\nstart_time\x18\x04 \x01(\x04\x12\x16\n\x0e\x66\x65\x65_multiplier\x18\x05 \x01(\x01\x42\x08\n\x06resultB\t\n\x07version2\xc2\x13\n\x08Platform\x12\x93\x01\n\x18\x62roadcastStateTransition\x12:.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest\x1a;.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse\x12l\n\x0bgetIdentity\x12-.org.dash.platform.dapi.v0.GetIdentityRequest\x1a..org.dash.platform.dapi.v0.GetIdentityResponse\x12r\n\rgetIdentities\x12/.org.dash.platform.dapi.v0.GetIdentitiesRequest\x1a\x30.org.dash.platform.dapi.v0.GetIdentitiesResponse\x12x\n\x0fgetIdentityKeys\x12\x31.org.dash.platform.dapi.v0.GetIdentityKeysRequest\x1a\x32.org.dash.platform.dapi.v0.GetIdentityKeysResponse\x12\x81\x01\n\x12getIdentityBalance\x12\x34.org.dash.platform.dapi.v0.GetIdentityBalanceRequest\x1a\x35.org.dash.platform.dapi.v0.GetIdentityBalanceResponse\x12\xa2\x01\n\x1dgetIdentityBalanceAndRevision\x12?.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest\x1a@.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse\x12\x66\n\tgetProofs\x12+.org.dash.platform.dapi.v0.GetProofsRequest\x1a,.org.dash.platform.dapi.v0.GetProofsResponse\x12x\n\x0fgetDataContract\x12\x31.org.dash.platform.dapi.v0.GetDataContractRequest\x1a\x32.org.dash.platform.dapi.v0.GetDataContractResponse\x12\x8d\x01\n\x16getDataContractHistory\x12\x38.org.dash.platform.dapi.v0.GetDataContractHistoryRequest\x1a\x39.org.dash.platform.dapi.v0.GetDataContractHistoryResponse\x12{\n\x10getDataContracts\x12\x32.org.dash.platform.dapi.v0.GetDataContractsRequest\x1a\x33.org.dash.platform.dapi.v0.GetDataContractsResponse\x12o\n\x0cgetDocuments\x12..org.dash.platform.dapi.v0.GetDocumentsRequest\x1a/.org.dash.platform.dapi.v0.GetDocumentsResponse\x12\xa5\x01\n\x1egetIdentitiesByPublicKeyHashes\x12@.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest\x1a\x41.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse\x12\x99\x01\n\x1agetIdentityByPublicKeyHash\x12<.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest\x1a=.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse\x12\x9f\x01\n\x1cwaitForStateTransitionResult\x12>.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest\x1a?.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse\x12\x81\x01\n\x12getConsensusParams\x12\x34.org.dash.platform.dapi.v0.GetConsensusParamsRequest\x1a\x35.org.dash.platform.dapi.v0.GetConsensusParamsResponse\x12\xa5\x01\n\x1egetProtocolVersionUpgradeState\x12@.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest\x1a\x41.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse\x12\xb4\x01\n#getProtocolVersionUpgradeVoteStatus\x12\x45.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest\x1a\x46.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse\x12r\n\rgetEpochsInfo\x12/.org.dash.platform.dapi.v0.GetEpochsInfoRequest\x1a\x30.org.dash.platform.dapi.v0.GetEpochsInfoResponseb\x06proto3' , dependencies=[google_dot_protobuf_dot_wrappers__pb2.DESCRIPTOR,google_dot_protobuf_dot_struct__pb2.DESCRIPTOR,google_dot_protobuf_dot_timestamp__pb2.DESCRIPTOR,]) @@ -75,11 +75,16 @@ serialized_options=None, type=None, create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='REVISION', index=3, number=3, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), ], containing_type=None, serialized_options=None, serialized_start=5350, - serialized_end=5398, + serialized_end=5412, ) _sym_db.RegisterEnumDescriptor(_GETPROOFSREQUEST_GETPROOFSREQUESTV0_IDENTITYREQUEST_TYPE) @@ -1658,7 +1663,7 @@ oneofs=[ ], serialized_start=5203, - serialized_end=5398, + serialized_end=5412, ) _GETPROOFSREQUEST_GETPROOFSREQUESTV0_CONTRACTREQUEST = _descriptor.Descriptor( @@ -1688,8 +1693,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=5400, - serialized_end=5438, + serialized_start=5414, + serialized_end=5452, ) _GETPROOFSREQUEST_GETPROOFSREQUESTV0 = _descriptor.Descriptor( @@ -1734,7 +1739,7 @@ oneofs=[ ], serialized_start=4761, - serialized_end=5438, + serialized_end=5452, ) _GETPROOFSREQUEST = _descriptor.Descriptor( @@ -1770,7 +1775,7 @@ fields=[]), ], serialized_start=4662, - serialized_end=5449, + serialized_end=5463, ) @@ -1813,8 +1818,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=5554, - serialized_end=5699, + serialized_start=5568, + serialized_end=5713, ) _GETPROOFSRESPONSE = _descriptor.Descriptor( @@ -1849,8 +1854,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=5452, - serialized_end=5710, + serialized_start=5466, + serialized_end=5724, ) @@ -1888,8 +1893,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=5829, - serialized_end=5882, + serialized_start=5843, + serialized_end=5896, ) _GETDATACONTRACTREQUEST = _descriptor.Descriptor( @@ -1924,8 +1929,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=5713, - serialized_end=5893, + serialized_start=5727, + serialized_end=5907, ) @@ -1975,8 +1980,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=6016, - serialized_end=6192, + serialized_start=6030, + serialized_end=6206, ) _GETDATACONTRACTRESPONSE = _descriptor.Descriptor( @@ -2011,8 +2016,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=5896, - serialized_end=6203, + serialized_start=5910, + serialized_end=6217, ) @@ -2050,8 +2055,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=6325, - serialized_end=6380, + serialized_start=6339, + serialized_end=6394, ) _GETDATACONTRACTSREQUEST = _descriptor.Descriptor( @@ -2086,8 +2091,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=6206, - serialized_end=6391, + serialized_start=6220, + serialized_end=6405, ) @@ -2125,8 +2130,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=6516, - serialized_end=6607, + serialized_start=6530, + serialized_end=6621, ) _GETDATACONTRACTSRESPONSE_DATACONTRACTS = _descriptor.Descriptor( @@ -2156,8 +2161,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=6609, - serialized_end=6726, + serialized_start=6623, + serialized_end=6740, ) _GETDATACONTRACTSRESPONSE_GETDATACONTRACTSRESPONSEV0 = _descriptor.Descriptor( @@ -2206,8 +2211,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=6729, - serialized_end=6974, + serialized_start=6743, + serialized_end=6988, ) _GETDATACONTRACTSRESPONSE = _descriptor.Descriptor( @@ -2242,8 +2247,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=6394, - serialized_end=6985, + serialized_start=6408, + serialized_end=6999, ) @@ -2302,8 +2307,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=7126, - serialized_end=7298, + serialized_start=7140, + serialized_end=7312, ) _GETDATACONTRACTHISTORYREQUEST = _descriptor.Descriptor( @@ -2338,8 +2343,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=6988, - serialized_end=7309, + serialized_start=7002, + serialized_end=7323, ) @@ -2377,8 +2382,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=7749, - serialized_end=7804, + serialized_start=7763, + serialized_end=7818, ) _GETDATACONTRACTHISTORYRESPONSE_GETDATACONTRACTHISTORYRESPONSEV0_DATACONTRACTHISTORY = _descriptor.Descriptor( @@ -2408,8 +2413,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=7807, - serialized_end=7977, + serialized_start=7821, + serialized_end=7991, ) _GETDATACONTRACTHISTORYRESPONSE_GETDATACONTRACTHISTORYRESPONSEV0 = _descriptor.Descriptor( @@ -2458,8 +2463,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=7453, - serialized_end=7987, + serialized_start=7467, + serialized_end=8001, ) _GETDATACONTRACTHISTORYRESPONSE = _descriptor.Descriptor( @@ -2494,8 +2499,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=7312, - serialized_end=7998, + serialized_start=7326, + serialized_end=8012, ) @@ -2580,8 +2585,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=8109, - serialized_end=8296, + serialized_start=8123, + serialized_end=8310, ) _GETDOCUMENTSREQUEST = _descriptor.Descriptor( @@ -2616,8 +2621,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=8001, - serialized_end=8307, + serialized_start=8015, + serialized_end=8321, ) @@ -2648,8 +2653,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=8664, - serialized_end=8694, + serialized_start=8678, + serialized_end=8708, ) _GETDOCUMENTSRESPONSE_GETDOCUMENTSRESPONSEV0 = _descriptor.Descriptor( @@ -2698,8 +2703,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=8421, - serialized_end=8704, + serialized_start=8435, + serialized_end=8718, ) _GETDOCUMENTSRESPONSE = _descriptor.Descriptor( @@ -2734,8 +2739,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=8310, - serialized_end=8715, + serialized_start=8324, + serialized_end=8729, ) @@ -2773,8 +2778,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=8879, - serialized_end=8962, + serialized_start=8893, + serialized_end=8976, ) _GETIDENTITIESBYPUBLICKEYHASHESREQUEST = _descriptor.Descriptor( @@ -2809,8 +2814,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=8718, - serialized_end=8973, + serialized_start=8732, + serialized_end=8987, ) @@ -2848,8 +2853,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=9140, - serialized_end=9237, + serialized_start=9154, + serialized_end=9251, ) _GETIDENTITIESBYPUBLICKEYHASHESRESPONSE_IDENTITIESBYPUBLICKEYHASHES = _descriptor.Descriptor( @@ -2879,8 +2884,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=9240, - serialized_end=9389, + serialized_start=9254, + serialized_end=9403, ) _GETIDENTITIESBYPUBLICKEYHASHESRESPONSE_GETIDENTITIESBYPUBLICKEYHASHESRESPONSEV0 = _descriptor.Descriptor( @@ -2929,8 +2934,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=9392, - serialized_end=9675, + serialized_start=9406, + serialized_end=9689, ) _GETIDENTITIESBYPUBLICKEYHASHESRESPONSE = _descriptor.Descriptor( @@ -2965,8 +2970,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=8976, - serialized_end=9686, + serialized_start=8990, + serialized_end=9700, ) @@ -3004,8 +3009,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=9838, - serialized_end=9915, + serialized_start=9852, + serialized_end=9929, ) _GETIDENTITYBYPUBLICKEYHASHREQUEST = _descriptor.Descriptor( @@ -3040,8 +3045,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=9689, - serialized_end=9926, + serialized_start=9703, + serialized_end=9940, ) @@ -3091,8 +3096,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=10082, - serialized_end=10264, + serialized_start=10096, + serialized_end=10278, ) _GETIDENTITYBYPUBLICKEYHASHRESPONSE = _descriptor.Descriptor( @@ -3127,8 +3132,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=9929, - serialized_end=10275, + serialized_start=9943, + serialized_end=10289, ) @@ -3166,8 +3171,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=10433, - serialized_end=10518, + serialized_start=10447, + serialized_end=10532, ) _WAITFORSTATETRANSITIONRESULTREQUEST = _descriptor.Descriptor( @@ -3202,8 +3207,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=10278, - serialized_end=10529, + serialized_start=10292, + serialized_end=10543, ) @@ -3253,8 +3258,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=10691, - serialized_end=10930, + serialized_start=10705, + serialized_end=10944, ) _WAITFORSTATETRANSITIONRESULTRESPONSE = _descriptor.Descriptor( @@ -3289,8 +3294,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=10532, - serialized_end=10941, + serialized_start=10546, + serialized_end=10955, ) @@ -3328,8 +3333,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=11069, - serialized_end=11129, + serialized_start=11083, + serialized_end=11143, ) _GETCONSENSUSPARAMSREQUEST = _descriptor.Descriptor( @@ -3364,8 +3369,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=10944, - serialized_end=11140, + serialized_start=10958, + serialized_end=11154, ) @@ -3410,8 +3415,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=11271, - serialized_end=11351, + serialized_start=11285, + serialized_end=11365, ) _GETCONSENSUSPARAMSRESPONSE_CONSENSUSPARAMSEVIDENCE = _descriptor.Descriptor( @@ -3455,8 +3460,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=11353, - serialized_end=11451, + serialized_start=11367, + serialized_end=11465, ) _GETCONSENSUSPARAMSRESPONSE_GETCONSENSUSPARAMSRESPONSEV0 = _descriptor.Descriptor( @@ -3493,8 +3498,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=11454, - serialized_end=11672, + serialized_start=11468, + serialized_end=11686, ) _GETCONSENSUSPARAMSRESPONSE = _descriptor.Descriptor( @@ -3529,8 +3534,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=11143, - serialized_end=11683, + serialized_start=11157, + serialized_end=11697, ) @@ -3561,8 +3566,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=11847, - serialized_end=11903, + serialized_start=11861, + serialized_end=11917, ) _GETPROTOCOLVERSIONUPGRADESTATEREQUEST = _descriptor.Descriptor( @@ -3597,8 +3602,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=11686, - serialized_end=11914, + serialized_start=11700, + serialized_end=11928, ) @@ -3629,8 +3634,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=12379, - serialized_end=12529, + serialized_start=12393, + serialized_end=12543, ) _GETPROTOCOLVERSIONUPGRADESTATERESPONSE_GETPROTOCOLVERSIONUPGRADESTATERESPONSEV0_VERSIONENTRY = _descriptor.Descriptor( @@ -3667,8 +3672,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=12531, - serialized_end=12589, + serialized_start=12545, + serialized_end=12603, ) _GETPROTOCOLVERSIONUPGRADESTATERESPONSE_GETPROTOCOLVERSIONUPGRADESTATERESPONSEV0 = _descriptor.Descriptor( @@ -3717,8 +3722,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=12082, - serialized_end=12599, + serialized_start=12096, + serialized_end=12613, ) _GETPROTOCOLVERSIONUPGRADESTATERESPONSE = _descriptor.Descriptor( @@ -3753,8 +3758,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=11917, - serialized_end=12610, + serialized_start=11931, + serialized_end=12624, ) @@ -3799,8 +3804,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=12790, - serialized_end=12893, + serialized_start=12804, + serialized_end=12907, ) _GETPROTOCOLVERSIONUPGRADEVOTESTATUSREQUEST = _descriptor.Descriptor( @@ -3835,8 +3840,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=12613, - serialized_end=12904, + serialized_start=12627, + serialized_end=12918, ) @@ -3867,8 +3872,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=13407, - serialized_end=13582, + serialized_start=13421, + serialized_end=13596, ) _GETPROTOCOLVERSIONUPGRADEVOTESTATUSRESPONSE_GETPROTOCOLVERSIONUPGRADEVOTESTATUSRESPONSEV0_VERSIONSIGNAL = _descriptor.Descriptor( @@ -3905,8 +3910,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=13584, - serialized_end=13637, + serialized_start=13598, + serialized_end=13651, ) _GETPROTOCOLVERSIONUPGRADEVOTESTATUSRESPONSE_GETPROTOCOLVERSIONUPGRADEVOTESTATUSRESPONSEV0 = _descriptor.Descriptor( @@ -3955,8 +3960,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=13088, - serialized_end=13647, + serialized_start=13102, + serialized_end=13661, ) _GETPROTOCOLVERSIONUPGRADEVOTESTATUSRESPONSE = _descriptor.Descriptor( @@ -3991,8 +3996,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=12907, - serialized_end=13658, + serialized_start=12921, + serialized_end=13672, ) @@ -4044,8 +4049,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=13771, - serialized_end=13895, + serialized_start=13785, + serialized_end=13909, ) _GETEPOCHSINFOREQUEST = _descriptor.Descriptor( @@ -4080,8 +4085,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=13661, - serialized_end=13906, + serialized_start=13675, + serialized_end=13920, ) @@ -4112,8 +4117,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=14267, - serialized_end=14384, + serialized_start=14281, + serialized_end=14398, ) _GETEPOCHSINFORESPONSE_GETEPOCHSINFORESPONSEV0_EPOCHINFO = _descriptor.Descriptor( @@ -4171,8 +4176,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=14387, - serialized_end=14519, + serialized_start=14401, + serialized_end=14533, ) _GETEPOCHSINFORESPONSE_GETEPOCHSINFORESPONSEV0 = _descriptor.Descriptor( @@ -4221,8 +4226,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=14023, - serialized_end=14529, + serialized_start=14037, + serialized_end=14543, ) _GETEPOCHSINFORESPONSE = _descriptor.Descriptor( @@ -4257,8 +4262,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=13909, - serialized_end=14540, + serialized_start=13923, + serialized_end=14554, ) _GETIDENTITYREQUEST_GETIDENTITYREQUESTV0.containing_type = _GETIDENTITYREQUEST @@ -5475,8 +5480,8 @@ index=0, serialized_options=None, create_key=_descriptor._internal_create_key, - serialized_start=14543, - serialized_end=17041, + serialized_start=14557, + serialized_end=17055, methods=[ _descriptor.MethodDescriptor( name='broadcastStateTransition', diff --git a/packages/dapi-grpc/clients/platform/v0/web/platform_pb.d.ts b/packages/dapi-grpc/clients/platform/v0/web/platform_pb.d.ts index 9ff5ae3c99..21a1cc42b2 100644 --- a/packages/dapi-grpc/clients/platform/v0/web/platform_pb.d.ts +++ b/packages/dapi-grpc/clients/platform/v0/web/platform_pb.d.ts @@ -1164,6 +1164,7 @@ export namespace GetProofsRequest { FULL_IDENTITY: 0; BALANCE: 1; KEYS: 2; + REVISION: 3; } export const Type: TypeMap; diff --git a/packages/dapi-grpc/clients/platform/v0/web/platform_pb.js b/packages/dapi-grpc/clients/platform/v0/web/platform_pb.js index 9d6d3e76cf..b22490b4b7 100644 --- a/packages/dapi-grpc/clients/platform/v0/web/platform_pb.js +++ b/packages/dapi-grpc/clients/platform/v0/web/platform_pb.js @@ -10055,7 +10055,8 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type = { FULL_IDENTITY: 0, BALANCE: 1, - KEYS: 2 + KEYS: 2, + REVISION: 3 }; /** diff --git a/packages/dapi-grpc/protos/platform/v0/platform.proto b/packages/dapi-grpc/protos/platform/v0/platform.proto index 5407772dc0..a8b6f566a6 100644 --- a/packages/dapi-grpc/protos/platform/v0/platform.proto +++ b/packages/dapi-grpc/protos/platform/v0/platform.proto @@ -234,6 +234,7 @@ message GetProofsRequest { FULL_IDENTITY = 0; BALANCE = 1; KEYS = 2; + REVISION = 3; } bytes identity_id = 1; Type request_type = 2; diff --git a/packages/dapi-grpc/src/platform/proto/org.dash.platform.dapi.v0.rs b/packages/dapi-grpc/src/platform/proto/org.dash.platform.dapi.v0.rs index d074b92f12..7cc0f6880d 100644 --- a/packages/dapi-grpc/src/platform/proto/org.dash.platform.dapi.v0.rs +++ b/packages/dapi-grpc/src/platform/proto/org.dash.platform.dapi.v0.rs @@ -727,6 +727,7 @@ pub mod get_proofs_request { FullIdentity = 0, Balance = 1, Keys = 2, + Revision = 3, } impl Type { /// String value of the enum field names used in the ProtoBuf definition. @@ -738,6 +739,7 @@ pub mod get_proofs_request { Type::FullIdentity => "FULL_IDENTITY", Type::Balance => "BALANCE", Type::Keys => "KEYS", + Type::Revision => "REVISION", } } /// Creates an enum from field names used in the ProtoBuf definition. @@ -746,6 +748,7 @@ pub mod get_proofs_request { "FULL_IDENTITY" => Some(Self::FullIdentity), "BALANCE" => Some(Self::Balance), "KEYS" => Some(Self::Keys), + "REVISION" => Some(Self::Revision), _ => None, } } diff --git a/packages/dapi/lib/externalApis/drive/fetchProofForStateTransitionFactory.js b/packages/dapi/lib/externalApis/drive/fetchProofForStateTransitionFactory.js index 2153807a4e..7014b1fef1 100644 --- a/packages/dapi/lib/externalApis/drive/fetchProofForStateTransitionFactory.js +++ b/packages/dapi/lib/externalApis/drive/fetchProofForStateTransitionFactory.js @@ -38,14 +38,31 @@ function fetchProofForStateTransitionFactory(driveClient) { } if (stateTransition.isIdentityStateTransition()) { const { IdentityRequest } = GetProofsRequestV0; - const identitiesList = modifiedIds.map((id) => { - const identityRequest = new IdentityRequest(); - identityRequest.setIdentityId(id.toBuffer()); - identityRequest.setRequestType( - stateTransition.getType() === StateTransitionTypes.IdentityCreditTransfer - ? IdentityRequest.Type.BALANCE : IdentityRequest.Type.FULL_IDENTITY, - ); - return identityRequest; + const identitiesList = modifiedIds.flatMap((id) => { + const stType = stateTransition.getType(); + let proofRequests; + + if (stType === StateTransitionTypes.IdentityCreditTransfer) { + proofRequests = new IdentityRequest(); + proofRequests.setIdentityId(id.toBuffer()); + proofRequests.setRequestType(IdentityRequest.Type.BALANCE); + } else if (stType === StateTransitionTypes.IdentityTopUp) { + const proofRequestsBalance = new IdentityRequest(); + proofRequestsBalance.setIdentityId(id.toBuffer()); + proofRequestsBalance.setRequestType(IdentityRequest.Type.BALANCE); + + const proofRequestsRevision = new IdentityRequest(); + proofRequestsRevision.setIdentityId(id.toBuffer()); + proofRequestsRevision.setRequestType(IdentityRequest.Type.REVISION); + + proofRequests = [proofRequestsBalance, proofRequestsRevision]; + } else { + proofRequests = new IdentityRequest(); + proofRequests.setIdentityId(id.toBuffer()); + proofRequests.setRequestType(IdentityRequest.Type.FULL_IDENTITY); + } + + return proofRequests; }); getProofsRequest.setV0(new GetProofsRequestV0().setIdentitiesList(identitiesList)); diff --git a/packages/rs-drive/src/drive/identity/fetch/queries/mod.rs b/packages/rs-drive/src/drive/identity/fetch/queries/mod.rs index 45582997c3..626939f00c 100644 --- a/packages/rs-drive/src/drive/identity/fetch/queries/mod.rs +++ b/packages/rs-drive/src/drive/identity/fetch/queries/mod.rs @@ -24,6 +24,8 @@ pub enum IdentityProveRequestType { Balance = 1, /// Keys: A variant representing keys access only, assigned the value 2. Keys = 2, + /// Revision: A variant representing revision field + Revision = 3, } impl TryFrom for IdentityProveRequestType { @@ -34,6 +36,7 @@ impl TryFrom for IdentityProveRequestType { 0 => Ok(IdentityProveRequestType::FullIdentity), 1 => Ok(IdentityProveRequestType::Balance), 2 => Ok(IdentityProveRequestType::Keys), + 3 => Ok(IdentityProveRequestType::Revision), _ => Err(Error::Query(QuerySyntaxError::InvalidIdentityProveRequest( "unknown prove request type", ))), diff --git a/packages/rs-drive/src/drive/prove/prove_multiple/v0/mod.rs b/packages/rs-drive/src/drive/prove/prove_multiple/v0/mod.rs index ed4013cf18..4fd6009ff1 100644 --- a/packages/rs-drive/src/drive/prove/prove_multiple/v0/mod.rs +++ b/packages/rs-drive/src/drive/prove/prove_multiple/v0/mod.rs @@ -49,6 +49,10 @@ impl Drive { path_queries .push(Self::identity_all_keys_query(&identity_query.identity_id)?); } + IdentityProveRequestType::Revision => { + path_queries + .push(Self::identity_revision_query(&identity_query.identity_id)); + } } } count += identity_queries.len(); diff --git a/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs b/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs index 5ed18ed043..4fdd19e21c 100644 --- a/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs +++ b/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs @@ -179,21 +179,25 @@ impl Drive { Ok((root_hash, VerifiedIdentity(identity))) } StateTransition::IdentityTopUp(identity_top_up_transition) => { - // we expect to get an identity that matches the state transition - let (root_hash, balance) = Drive::verify_identity_balance_for_identity_id( - proof, - identity_top_up_transition.identity_id().into_buffer(), - false, - platform_version, - )?; - let balance = balance.ok_or(Error::Proof(ProofError::IncorrectProof(format!("proof did not contain balance for identity {} expected to exist because of state transition (top up)", identity_top_up_transition.identity_id()))))?; + // we expect to get a new balance and revision + let identity_id = identity_top_up_transition.identity_id(); + let (root_hash, Some((balance, revision))) = + Drive::verify_identity_balance_and_revision_for_identity_id( + proof, + identity_id.into_buffer(), + false, + )? + else { + return Err(Error::Proof(ProofError::IncorrectProof( + format!("proof did not contain balance for identity {} expected to exist because of state transition (top up)", identity_id)))); + }; Ok(( root_hash, VerifiedPartialIdentity(PartialIdentity { id: *identity_top_up_transition.identity_id(), loaded_public_keys: Default::default(), balance: Some(balance), - revision: None, + revision: Some(revision), not_found_public_keys: Default::default(), }), )) From c3d4e7f202f423446435d0f30d9b294a0ee8109c Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Fri, 16 Feb 2024 08:58:20 +0700 Subject: [PATCH 034/191] fix(platform): remove ability to verify proofs from drive-abci (#1699) --- packages/rs-drive-abci/Cargo.toml | 2 +- packages/rs-drive/Cargo.toml | 5 +- .../v0/mod.rs | 6 +- .../v0/mod.rs | 4 +- .../get_fetch/fetch_contract/v0/mod.rs | 4 +- .../insert/add_contract_to_storage/v0/mod.rs | 2 +- packages/rs-drive/src/drive/contract/paths.rs | 4 +- .../contract/prove/prove_contract/v0/mod.rs | 64 ++++++------------- .../rs-drive/src/drive/contract/queries.rs | 6 +- .../mod.rs | 58 +++++++++++++++++ .../v0/mod.rs | 34 ++++++++++ .../src/drive/grove_operations/mod.rs | 3 + packages/rs-drive/src/drive/mod.rs | 2 +- .../verify/contract/verify_contract/v0/mod.rs | 4 +- packages/rs-drive/src/query/mod.rs | 4 +- .../src/version/drive_versions.rs | 1 + .../src/version/mocks/v2_test.rs | 1 + .../src/version/mocks/v3_test.rs | 1 + .../rs-platform-version/src/version/v1.rs | 1 + packages/strategy-tests/Cargo.toml | 4 +- 20 files changed, 141 insertions(+), 69 deletions(-) create mode 100644 packages/rs-drive/src/drive/grove_operations/grove_get_proved_path_query_with_conditional/mod.rs create mode 100644 packages/rs-drive/src/drive/grove_operations/grove_get_proved_path_query_with_conditional/v0/mod.rs diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index 0bd3c046a2..086ce85f8f 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -22,7 +22,7 @@ serde_with = { version = "3.1.0", features = [ "hex", "macros", ], default-features = false } -drive = { path = "../rs-drive", features = [ +drive = { path = "../rs-drive", default-features = false, features = [ "full", "grovedb_operations_logging", ] } diff --git a/packages/rs-drive/Cargo.toml b/packages/rs-drive/Cargo.toml index f0b9f06248..4c49425842 100644 --- a/packages/rs-drive/Cargo.toml +++ b/packages/rs-drive/Cargo.toml @@ -67,10 +67,9 @@ name = "benchmarks" harness = false [features] -default = ["full"] -fixtures-and-mocks = ["dpp/fixtures-and-mocks"] +default = ["full", "verify"] +fixtures-and-mocks = ["full", "dpp/fixtures-and-mocks", "verify"] full = [ - "fixtures-and-mocks", "grovedb/estimated_costs", "grovedb-storage", "grovedb-costs", diff --git a/packages/rs-drive/src/drive/contract/apply/apply_contract_with_serialization/v0/mod.rs b/packages/rs-drive/src/drive/contract/apply/apply_contract_with_serialization/v0/mod.rs index b38bdbbfac..e40133b589 100644 --- a/packages/rs-drive/src/drive/contract/apply/apply_contract_with_serialization/v0/mod.rs +++ b/packages/rs-drive/src/drive/contract/apply/apply_contract_with_serialization/v0/mod.rs @@ -1,4 +1,4 @@ -use crate::drive::contract::paths::{contract_keeping_history_storage_path, contract_root_path}; +use crate::drive::contract::paths::{contract_keeping_history_root_path, contract_root_path}; use crate::drive::defaults::CONTRACT_MAX_SERIALIZED_SIZE; use crate::drive::flags::StorageFlags; @@ -126,9 +126,7 @@ impl Drive { // we need to get the latest of a contract that keeps history, can't be raw since there is a reference let stored_element = self .grove_get( - (&contract_keeping_history_storage_path( - contract.id_ref().as_bytes(), - )) + (&contract_keeping_history_root_path(contract.id_ref().as_bytes())) .into(), &[0], QueryType::StatefulQuery, diff --git a/packages/rs-drive/src/drive/contract/estimation_costs/add_estimation_costs_for_contract_insertion/v0/mod.rs b/packages/rs-drive/src/drive/contract/estimation_costs/add_estimation_costs_for_contract_insertion/v0/mod.rs index 6921c6bda5..8a3f5c24a0 100644 --- a/packages/rs-drive/src/drive/contract/estimation_costs/add_estimation_costs_for_contract_insertion/v0/mod.rs +++ b/packages/rs-drive/src/drive/contract/estimation_costs/add_estimation_costs_for_contract_insertion/v0/mod.rs @@ -1,4 +1,4 @@ -use crate::drive::contract::paths::contract_keeping_history_storage_path; +use crate::drive::contract::paths::contract_keeping_history_root_path; use crate::drive::defaults::{ AVERAGE_NUMBER_OF_UPDATES, DEFAULT_FLOAT_SIZE, DEFAULT_FLOAT_SIZE_U8, ESTIMATED_AVERAGE_INDEX_NAME_SIZE, @@ -68,7 +68,7 @@ impl Drive { let reference_size = DEFAULT_FLOAT_SIZE + 2; estimated_costs_only_with_layer_info.insert( - KeyInfoPath::from_known_path(contract_keeping_history_storage_path( + KeyInfoPath::from_known_path(contract_keeping_history_root_path( contract.id_ref().as_bytes(), )), EstimatedLayerInformation { diff --git a/packages/rs-drive/src/drive/contract/get_fetch/fetch_contract/v0/mod.rs b/packages/rs-drive/src/drive/contract/get_fetch/fetch_contract/v0/mod.rs index 429b4ede57..1bde21c713 100644 --- a/packages/rs-drive/src/drive/contract/get_fetch/fetch_contract/v0/mod.rs +++ b/packages/rs-drive/src/drive/contract/get_fetch/fetch_contract/v0/mod.rs @@ -55,7 +55,7 @@ impl Drive { // We need to pass allow cache to false let (value, mut cost) = if known_keeps_history.unwrap_or_default() { let CostContext { value, cost } = self.grove.get_caching_optional( - (&paths::contract_keeping_history_storage_path(&contract_id)).into(), + (&paths::contract_keeping_history_root_path(&contract_id)).into(), &[0], false, transaction, @@ -117,7 +117,7 @@ impl Drive { value, cost: secondary_cost, } = self.grove.get_caching_optional( - (&paths::contract_keeping_history_storage_path(&contract_id)).into(), + (&paths::contract_keeping_history_root_path(&contract_id)).into(), &[0], false, transaction, diff --git a/packages/rs-drive/src/drive/contract/insert/add_contract_to_storage/v0/mod.rs b/packages/rs-drive/src/drive/contract/insert/add_contract_to_storage/v0/mod.rs index b52aadd665..32bf666d80 100644 --- a/packages/rs-drive/src/drive/contract/insert/add_contract_to_storage/v0/mod.rs +++ b/packages/rs-drive/src/drive/contract/insert/add_contract_to_storage/v0/mod.rs @@ -89,7 +89,7 @@ impl Drive { let encoded_time = encode_u64(block_info.time_ms); let contract_keeping_history_storage_path = - paths::contract_keeping_history_storage_path(contract.id_ref().as_bytes()); + paths::contract_keeping_history_root_path(contract.id_ref().as_bytes()); if !is_first_insert { // we can use a DirectQueryType::StatefulDirectQuery because if we were stateless we would always think diff --git a/packages/rs-drive/src/drive/contract/paths.rs b/packages/rs-drive/src/drive/contract/paths.rs index 4af51dac78..2221e398eb 100644 --- a/packages/rs-drive/src/drive/contract/paths.rs +++ b/packages/rs-drive/src/drive/contract/paths.rs @@ -103,7 +103,7 @@ pub fn contract_storage_path_vec(contract_id: &[u8]) -> Vec> { } /// Takes a contract ID and returns the contract's storage history path. -pub fn contract_keeping_history_storage_path_vec(contract_id: &[u8]) -> Vec> { +pub fn contract_keeping_history_root_path_vec(contract_id: &[u8]) -> Vec> { vec![ Into::<&[u8; 1]>::into(RootTree::DataContractDocuments).to_vec(), contract_id.to_vec(), @@ -112,7 +112,7 @@ pub fn contract_keeping_history_storage_path_vec(contract_id: &[u8]) -> Vec [&[u8]; 3] { +pub fn contract_keeping_history_root_path(contract_id: &[u8]) -> [&[u8]; 3] { [ Into::<&[u8; 1]>::into(RootTree::DataContractDocuments), contract_id, diff --git a/packages/rs-drive/src/drive/contract/prove/prove_contract/v0/mod.rs b/packages/rs-drive/src/drive/contract/prove/prove_contract/v0/mod.rs index cf0af39734..61fa964310 100644 --- a/packages/rs-drive/src/drive/contract/prove/prove_contract/v0/mod.rs +++ b/packages/rs-drive/src/drive/contract/prove/prove_contract/v0/mod.rs @@ -1,6 +1,7 @@ use crate::drive::Drive; use crate::error::Error; +use crate::drive::contract::paths::{contract_root_path, contract_root_path_vec}; use dpp::version::PlatformVersion; use grovedb::TransactionArg; @@ -31,54 +32,27 @@ impl Drive { transaction: TransactionArg, platform_version: &PlatformVersion, ) -> Result, Error> { - let contract_query = Self::fetch_contract_query(contract_id, true); - tracing::trace!(?contract_query, "proving contract"); - let contract_proof = self.grove_get_proved_path_query( - &contract_query, + self.grove_get_proved_path_query_with_conditional( + (&contract_root_path(&contract_id)).into(), + &[0], + &|element| { + if let Some(element) = element { + if element.is_tree() { + // this is a contract that keeps history + Self::fetch_contract_with_history_latest_query(contract_id, true) + } else { + // this is a normal contract + Self::fetch_contract_query(contract_id, true) + } + } else { + // we will just get the proof that the contract doesn't exist, either way + Self::fetch_contract_query(contract_id, true) + } + }, false, transaction, &mut vec![], &platform_version.drive, - )?; - let result = Drive::verify_contract( - contract_proof.as_slice(), - Some(false), - false, - false, - contract_id, - platform_version, - ); - match result { - Ok(_) => Ok(contract_proof), - Err(Error::GroveDB(grovedb::Error::WrongElementType("expected an item"))) => { - // In this case we are trying to prove a historical type contract - let contract_query = - Self::fetch_contract_with_history_latest_query(contract_id, true); - tracing::trace!(?contract_query, "proving historical contract"); - let historical_contract_proof = self.grove_get_proved_path_query( - &contract_query, - false, - transaction, - &mut vec![], - &platform_version.drive, - )?; - if let Ok(Some(_)) = Drive::verify_contract( - historical_contract_proof.as_slice(), - Some(true), - false, - false, - contract_id, - platform_version, - ) - .map(|(_, proof_returned_historical_contract)| proof_returned_historical_contract) - { - // Only return the historical proof if an element was found - Ok(historical_contract_proof) - } else { - Ok(contract_proof) - } - } - Err(e) => Err(e), - } + ) } } diff --git a/packages/rs-drive/src/drive/contract/queries.rs b/packages/rs-drive/src/drive/contract/queries.rs index 85ab326fa8..1e4f040b6d 100644 --- a/packages/rs-drive/src/drive/contract/queries.rs +++ b/packages/rs-drive/src/drive/contract/queries.rs @@ -1,6 +1,6 @@ use crate::common::encode::encode_u64; use crate::drive::contract::paths::{ - contract_keeping_history_storage_path_vec, contract_root_path_vec, + contract_keeping_history_root_path_vec, contract_root_path_vec, }; use crate::drive::contract::{paths, MAX_CONTRACT_HISTORY_FETCH_LIMIT}; use crate::drive::{Drive, RootTree}; @@ -56,7 +56,7 @@ impl Drive { contract_id: [u8; 32], with_limit: bool, ) -> PathQuery { - let contract_path = contract_keeping_history_storage_path_vec(contract_id.as_slice()); + let contract_path = contract_keeping_history_root_path_vec(contract_id.as_slice()); let mut query = PathQuery::new_single_key(contract_path, vec![0]); if with_limit { @@ -214,7 +214,7 @@ impl Drive { ); Ok(PathQuery::new( - paths::contract_keeping_history_storage_path_vec(&contract_id), + paths::contract_keeping_history_root_path_vec(&contract_id), SizedQuery::new(query, Some(limit), offset), )) } diff --git a/packages/rs-drive/src/drive/grove_operations/grove_get_proved_path_query_with_conditional/mod.rs b/packages/rs-drive/src/drive/grove_operations/grove_get_proved_path_query_with_conditional/mod.rs new file mode 100644 index 0000000000..0f934c248a --- /dev/null +++ b/packages/rs-drive/src/drive/grove_operations/grove_get_proved_path_query_with_conditional/mod.rs @@ -0,0 +1,58 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fee::op::LowLevelDriveOperation; + +use dpp::version::drive_versions::DriveVersion; + +use grovedb::{Element, PathQuery, TransactionArg}; +use grovedb_path::SubtreePath; + +impl Drive { + /// Retrieves a proof of the specified path query in groveDB. + /// The operation's cost is then added to `drive_operations` for later processing. + /// + /// # Parameters + /// * `path_query`: The groveDB path query to retrieve a proof for. + /// * `verbose`: Specifies whether to include all paths in the proof (when set to `true`) or only those that were + /// affected by changes (when set to `false`). + /// * `transaction`: The groveDB transaction associated with this operation. + /// * `drive_operations`: A vector to collect the costs of operations for later computation. + /// * `platform_version`: The platform version to select the correct function version to run. + /// + /// # Returns + /// * `Ok(Vec)` if the operation was successful, returning the proof data. + /// * `Err(DriveError::UnknownVersionMismatch)` if the platform version does not match known versions. + pub fn grove_get_proved_path_query_with_conditional>( + &self, + root_path: SubtreePath<'_, B>, + key: &[u8], + path_query_resolver: &impl Fn(Option) -> PathQuery, + verbose: bool, + transaction: TransactionArg, + drive_operations: &mut Vec, + drive_version: &DriveVersion, + ) -> Result, Error> { + match drive_version + .grove_methods + .basic + .grove_get_proved_path_query_with_conditional + { + 0 => self.grove_get_proved_path_query_with_conditional_v0( + root_path, + key, + path_query_resolver, + verbose, + transaction, + drive_operations, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "grove_get_proved_path_query_with_conditional".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/grove_operations/grove_get_proved_path_query_with_conditional/v0/mod.rs b/packages/rs-drive/src/drive/grove_operations/grove_get_proved_path_query_with_conditional/v0/mod.rs new file mode 100644 index 0000000000..5f4e0461d1 --- /dev/null +++ b/packages/rs-drive/src/drive/grove_operations/grove_get_proved_path_query_with_conditional/v0/mod.rs @@ -0,0 +1,34 @@ +use crate::drive::Drive; +use crate::error::Error; +use crate::fee::op::LowLevelDriveOperation; +use crate::fee::op::LowLevelDriveOperation::CalculatedCostOperation; +use grovedb::{Element, PathQuery, TransactionArg}; +use grovedb_costs::CostContext; +use grovedb_path::SubtreePath; + +impl Drive { + /// Gets the return value and the cost of a groveDB proved path query. + /// Pushes the cost to `drive_operations` and returns the return value. + /// Verbose should be generally set to false unless one needs to prove + /// subsets of a proof. + pub(super) fn grove_get_proved_path_query_with_conditional_v0>( + &self, + root_path: SubtreePath, + key: &[u8], + path_query_resolver: &impl Fn(Option) -> PathQuery, + verbose: bool, + transaction: TransactionArg, + drive_operations: &mut Vec, + ) -> Result, Error> { + let CostContext { value, cost } = self.grove.get_raw_optional(root_path, key, transaction); + drive_operations.push(CalculatedCostOperation(cost)); + let maybe_element = value.map_err(Error::GroveDB)?; + let path_query = path_query_resolver(maybe_element); + + let CostContext { value, cost } = + self.grove + .get_proved_path_query(&path_query, verbose, transaction); + drive_operations.push(CalculatedCostOperation(cost)); + value.map_err(Error::GroveDB) + } +} diff --git a/packages/rs-drive/src/drive/grove_operations/mod.rs b/packages/rs-drive/src/drive/grove_operations/mod.rs index 1ca6e9bda1..8542905532 100644 --- a/packages/rs-drive/src/drive/grove_operations/mod.rs +++ b/packages/rs-drive/src/drive/grove_operations/mod.rs @@ -134,6 +134,9 @@ pub mod grove_batch_operations_costs; /// Clear a subtree in grovedb pub mod grove_clear; +/// Proved path query in grovedb with a conditional query +pub mod grove_get_proved_path_query_with_conditional; + use grovedb_costs::CostContext; use grovedb::EstimatedLayerInformation; diff --git a/packages/rs-drive/src/drive/mod.rs b/packages/rs-drive/src/drive/mod.rs index 8a5b04cd01..4ee34d9eb8 100644 --- a/packages/rs-drive/src/drive/mod.rs +++ b/packages/rs-drive/src/drive/mod.rs @@ -97,7 +97,7 @@ mod platform_state; #[cfg(feature = "full")] mod prove; /// Contains a set of useful grovedb proof verification functions -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(feature = "verify")] pub mod verify; #[cfg(feature = "full")] diff --git a/packages/rs-drive/src/drive/verify/contract/verify_contract/v0/mod.rs b/packages/rs-drive/src/drive/verify/contract/verify_contract/v0/mod.rs index 44b310e38b..a39cd8070a 100644 --- a/packages/rs-drive/src/drive/verify/contract/verify_contract/v0/mod.rs +++ b/packages/rs-drive/src/drive/verify/contract/verify_contract/v0/mod.rs @@ -1,6 +1,6 @@ use std::collections::BTreeMap; -use crate::drive::contract::paths::{contract_keeping_history_storage_path, contract_root_path}; +use crate::drive::contract::paths::{contract_keeping_history_root_path, contract_root_path}; use crate::drive::verify::RootHash; use crate::drive::Drive; use crate::error::proof::ProofError; @@ -87,7 +87,7 @@ impl Drive { if proved_key_values.len() == 1 { let (path, key, maybe_element) = proved_key_values.remove(0); if contract_known_keeps_history.unwrap_or_default() { - if path != contract_keeping_history_storage_path(&contract_id) { + if path != contract_keeping_history_root_path(&contract_id) { return Err(Error::Proof(ProofError::CorruptedProof( "we did not get back an element for the correct path for the historical contract".to_string(), ))); diff --git a/packages/rs-drive/src/query/mod.rs b/packages/rs-drive/src/query/mod.rs index 6d1afdcf24..6c5cf265ba 100644 --- a/packages/rs-drive/src/query/mod.rs +++ b/packages/rs-drive/src/query/mod.rs @@ -1707,7 +1707,7 @@ impl<'a> DriveQuery<'a> { ) } - #[cfg(feature = "full")] + #[cfg(all(feature = "full", feature = "verify"))] /// Executes a query with proof and returns the root hash, items, and fee. pub fn execute_with_proof_only_get_elements( self, @@ -1738,7 +1738,7 @@ impl<'a> DriveQuery<'a> { Ok((root_hash, items, cost)) } - #[cfg(feature = "full")] + #[cfg(all(feature = "full", feature = "verify"))] /// Executes an internal query with proof and returns the root hash and values. pub(crate) fn execute_with_proof_only_get_elements_internal( self, diff --git a/packages/rs-platform-version/src/version/drive_versions.rs b/packages/rs-platform-version/src/version/drive_versions.rs index 364b8dd922..21092af845 100644 --- a/packages/rs-platform-version/src/version/drive_versions.rs +++ b/packages/rs-platform-version/src/version/drive_versions.rs @@ -318,6 +318,7 @@ pub struct DriveGroveBasicMethodVersions { pub grove_get_raw_path_query_with_optional: FeatureVersion, pub grove_get_raw_path_query: FeatureVersion, pub grove_get_proved_path_query: FeatureVersion, + pub grove_get_proved_path_query_with_conditional: FeatureVersion, pub grove_get_sum_tree_total_value: FeatureVersion, pub grove_has_raw: FeatureVersion, } diff --git a/packages/rs-platform-version/src/version/mocks/v2_test.rs b/packages/rs-platform-version/src/version/mocks/v2_test.rs index 4ce52484ce..f4e805f964 100644 --- a/packages/rs-platform-version/src/version/mocks/v2_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v2_test.rs @@ -438,6 +438,7 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { grove_get_raw_path_query_with_optional: 0, grove_get_raw_path_query: 0, grove_get_proved_path_query: 0, + grove_get_proved_path_query_with_conditional: 0, grove_get_sum_tree_total_value: 0, grove_has_raw: 0, }, diff --git a/packages/rs-platform-version/src/version/mocks/v3_test.rs b/packages/rs-platform-version/src/version/mocks/v3_test.rs index abb9b8769a..94c42d0a92 100644 --- a/packages/rs-platform-version/src/version/mocks/v3_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v3_test.rs @@ -438,6 +438,7 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { grove_get_raw_path_query_with_optional: 0, grove_get_raw_path_query: 0, grove_get_proved_path_query: 0, + grove_get_proved_path_query_with_conditional: 0, grove_get_sum_tree_total_value: 0, grove_has_raw: 0, }, diff --git a/packages/rs-platform-version/src/version/v1.rs b/packages/rs-platform-version/src/version/v1.rs index 9cc56fa894..1df56b5614 100644 --- a/packages/rs-platform-version/src/version/v1.rs +++ b/packages/rs-platform-version/src/version/v1.rs @@ -435,6 +435,7 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { grove_get_raw_path_query_with_optional: 0, grove_get_raw_path_query: 0, grove_get_proved_path_query: 0, + grove_get_proved_path_query_with_conditional: 0, grove_get_sum_tree_total_value: 0, grove_has_raw: 0, }, diff --git a/packages/strategy-tests/Cargo.toml b/packages/strategy-tests/Cargo.toml index afb0038bdb..8da86808a3 100644 --- a/packages/strategy-tests/Cargo.toml +++ b/packages/strategy-tests/Cargo.toml @@ -12,7 +12,9 @@ license = "MIT" [dependencies] bincode = { version = "2.0.0-rc.3", features = ["serde"] } -drive = { path = "../rs-drive" } +drive = { path = "../rs-drive", default-features = false, features = [ + "verify", +] } rand = "0.8.5" hex = "0.4.3" dpp = { path = "../rs-dpp", features = [ From 71acab7286a7fc46530112f0a376cbae289592a4 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Fri, 16 Feb 2024 06:14:12 +0300 Subject: [PATCH 035/191] fix: npm IP package vulnerable to SSRF attacks (#1703) --- .pnp.cjs | 1169 ++++------------- ...frame-npm-7.16.7-093eb9e124-db2f7faa31.zip | Bin 3934 -> 0 bytes ...rator-npm-7.17.3-b206625c17-9a102a87b4.zip | Bin 31862 -> 0 bytes ...sitor-npm-7.16.7-3ee2ba2019-c03a10105d.zip | Bin 2953 -> 0 bytes ...-name-npm-7.16.7-aa24c7b296-12e2678236.zip | Bin 3885 -> 0 bytes ...arity-npm-7.16.7-987b1b1bed-25d969fb20.zip | Bin 2723 -> 0 bytes ...ables-npm-7.16.7-25cc3abba4-6ae1641f4a.zip | Bin 3049 -> 0 bytes ...utils-npm-7.14.5-e35eef11cb-fe20e90a24.zip | Bin 3395 -> 0 bytes ...ation-npm-7.16.7-5b9ae90171-e10aaf1354.zip | Bin 3230 -> 0 bytes ...ifier-npm-7.16.7-8599fb00fc-42b9b56c35.zip | Bin 9288 -> 0 bytes ...ight-npm-7.16.10-626c03326c-1f1bdd752a.zip | Bin 3415 -> 0 bytes ...arser-npm-7.17.3-1c3b6747e0-2d45750cdf.zip | Bin 396461 -> 0 bytes ...plate-npm-7.16.7-a18e444be8-f35836a8cd.zip | Bin 9699 -> 0 bytes ...verse-npm-7.17.3-c2bff3e671-03aed531e0.zip | Bin 50022 -> 0 bytes ...types-npm-7.17.0-3c936b54e4-535ccef360.zip | Bin 165822 -> 0 bytes ...nsumer-npm-0.8.0-1f37e9e72b-dfe1399712.zip | Bin 45552 -> 0 bytes ...upport-npm-0.7.0-456c3ea2ce-d58b31640c.zip | Bin 16441 -> 0 bytes ...-utils-npm-4.2.0-434cf92d50-ef8b20b0c7.zip | Bin 61736 -> 0 bytes ...egexpp-npm-4.4.0-6bee7b2314-3d9b740479.zip | Bin 53695 -> 0 bytes ...apping-npm-0.3.2-c64eeb4a4e-7ba0070be1.zip | Bin 27227 -> 0 bytes ...ve-uri-npm-3.0.8-94779c6a1d-ba6bb26bae.zip | Bin 19479 -> 0 bytes ...pping-npm-0.3.15-7357dbf648-c889039e05.zip | Bin 42781 -> 0 bytes ...chema-npm-7.0.11-79462ae5ca-e50864a93f.zip | Bin 7176 -> 0 bytes ...node-npm-17.0.21-7d68eb6a13-2beae12b02.zip | Bin 332833 -> 0 bytes ...emver-npm-7.3.13-56212b60da-0064efd7a0.zip | Bin 19755 -> 0 bytes .../acorn-npm-8.8.2-9d518fd7d3-b4e77d56d2.zip | Bin 120332 -> 0 bytes ...palive-npm-4.2.0-e5e72b8ce4-cc6e1b4f1c.zip | Bin 14811 -> 0 bytes .../ajv-npm-8.8.1-3d331224e3-fc52cd18c9.zip | Bin 398672 -> 0 bytes ...slist-npm-4.18.1-38eb8a64b9-83bb8dd04c.zip | Bin 20034 -> 0 bytes ...l-bind-npm-1.0.2-c957124861-ca787179c1.zip | Bin 7776 -> 0 bytes ...npm-1.0.30001282-49173a42dd-7802b8e099.zip | Bin 687977 -> 0 bytes ...-error-npm-1.0.2-00c540c6e9-011e74b2ea.zip | Bin 7470 -> 0 bytes ...rette-npm-2.0.19-f73dfe6a4e-6e2606435c.zip | Bin 7171 -> 0 bytes ...erties-npm-1.2.0-3547cd0fd2-e60aee6a19.zip | Bin 7204 -> 0 bytes ...mium-npm-1.3.903-3e6dfabc20-12a0c5ba72.zip | Bin 14164 -> 0 bytes ...solve-npm-5.12.0-c291ce4ee3-ea5b49a064.zip | Bin 58210 -> 0 bytes ...tract-npm-1.21.2-f4ebace1ab-2e1d6922c9.zip | Bin 848829 -> 0 bytes ...r-node-npm-0.3.6-d9426786c6-c35c6edb7e.zip | Bin 3427 -> 0 bytes ...r-keys-npm-3.3.0-d329af7c8c-37a1a5912a.zip | Bin 12067 -> 0 bytes ...espree-npm-9.1.0-fd22538590-8ade225f24.zip | Bin 25599 -> 0 bytes ...-glob-npm-3.2.11-bc01135fef-6b736d92a4.zip | Bin 41041 -> 0 bytes .yarn/cache/fsevents-patch-19706e7e35-10.zip | Bin 0 -> 23750 bytes ...n-bind-npm-1.1.1-b56b322ae9-d83f296803.zip | Bin 8530 -> 0 bytes ...e.name-npm-1.1.5-e776a642bb-5d426e5a38.zip | Bin 11408 -> 0 bytes ...rinsic-npm-1.2.0-eb08ea9b1d-f57c5fe67a.zip | Bin 13703 -> 0 bytes .../glob-npm-10.3.4-f58cd31f55-6375721bcd.zip | Bin 131698 -> 0 bytes ...ddress-npm-9.0.5-9fa024d42a-1ed81e0672.zip | Bin 0 -> 55735 bytes .../ip-npm-1.1.5-af36318aa6-40a00572cf.zip | Bin 10697 -> 0 bytes .../ip-npm-2.0.0-204facb3cc-1270b11e53.zip | Bin 5271 -> 0 bytes ...module-npm-2.8.1-ce21740d1b-80b33fbd45.zip | Bin 9931 -> 0 bytes ...array-npm-1.1.10-fe4ef83cdc-2392b2473b.zip | Bin 8924 -> 0 bytes ...verage-npm-3.2.0-93f84b2c8c-31621b84ad.zip | Bin 11535 -> 0 bytes ...kspeak-npm-2.3.3-755684cc60-a4c7c1a3ff.zip | Bin 63545 -> 0 bytes .../jsbn-npm-1.1.0-1da0181838-bebe7ae829.zip | Bin 0 -> 15409 bytes .../json5-npm-2.2.0-da49dc7cb5-d72ea87423.zip | Bin 63125 -> 0 bytes ...cache-npm-10.0.1-0e1abf4c13-5bb91a97a3.zip | Bin 163843 -> 0 bytes ...-cache-npm-7.3.1-b157dca680-83adf549d8.zip | Bin 12498 -> 0 bytes ...editor-npm-9.4.0-97c608fb01-b196c50010.zip | Bin 15928 -> 0 bytes ...imatch-npm-5.0.0-969101c1d1-ee05bf8c18.zip | Bin 13202 -> 0 bytes ...nipass-npm-7.0.3-3b57909ee9-04d72c8a43.zip | Bin 73513 -> 0 bytes ...leases-npm-2.0.1-77b8e327f7-b20dd8d4bc.zip | Bin 4920 -> 0 bytes ...spect-npm-1.12.3-1e7d20f5ff-532b0036f0.zip | Bin 34817 -> 0 bytes ...stream-npm-3.6.0-23a4a5eb56-b80b3e6a7f.zip | Bin 45941 -> 0 bytes ....flags-npm-1.4.3-df1c08b65d-3cde7cd22f.zip | Bin 15856 -> 0 bytes ...solve-npm-1.22.0-f641ddcc95-b2f7405d30.zip | Bin 60268 -> 0 bytes .../resolve-patch-2781af2c06-cb53ccafb0.zip | Bin 61519 -> 0 bytes .../rxjs-npm-7.8.0-722f1c7172-ff9359cc78.zip | Bin 1795465 -> 0 bytes .../socks-npm-2.6.1-09133d0d22-6ae166bd1a.zip | Bin 43975 -> 0 bytes .../socks-npm-2.7.1-17f2b53052-5074f7d6a1.zip | Bin 43974 -> 0 bytes .../socks-npm-2.8.0-9be534eccc-ed0224ce2c.zip | Bin 0 -> 44607 bytes ...ce-map-npm-0.5.7-7c3f035429-9b4ac749ec.zip | Bin 197868 -> 0 bytes ...ntf-js-npm-1.1.3-b99efd75b2-e7587128c4.zip | Bin 0 -> 15275 bytes ...e.trim-npm-1.2.7-3fbaf3b9d2-a1b795bdb4.zip | Bin 14291 -> 0 bytes ...rimend-npm-1.0.6-304246ecc1-3893db9267.zip | Bin 11581 -> 0 bytes ...mstart-npm-1.0.6-0926caea6c-05e2cd06fa.zip | Bin 11677 -> 0 bytes ...rlinks-npm-2.2.0-9b22a6271b-a63f2acba5.zip | Bin 4112 -> 0 bytes .../tar-npm-6.1.11-e6ac3cba9c-0e6789e664.zip | Bin 51230 -> 0 bytes ...-node-npm-10.4.0-04cb6e2279-5874ac27f6.zip | Bin 169410 -> 0 bytes .../tslib-npm-2.4.1-36f0ed04db-e14311d539.zip | Bin 17643 -> 0 bytes .../tslib-npm-2.5.0-bb364efebd-ea556fbdf3.zip | Bin 19473 -> 0 bytes ...-array-npm-1.1.9-9559c95dfc-90ef760a09.zip | Bin 12415 -> 0 bytes package.json | 3 +- yarn.lock | 957 ++------------ 83 files changed, 354 insertions(+), 1775 deletions(-) delete mode 100644 .yarn/cache/@babel-code-frame-npm-7.16.7-093eb9e124-db2f7faa31.zip delete mode 100644 .yarn/cache/@babel-generator-npm-7.17.3-b206625c17-9a102a87b4.zip delete mode 100644 .yarn/cache/@babel-helper-environment-visitor-npm-7.16.7-3ee2ba2019-c03a10105d.zip delete mode 100644 .yarn/cache/@babel-helper-function-name-npm-7.16.7-aa24c7b296-12e2678236.zip delete mode 100644 .yarn/cache/@babel-helper-get-function-arity-npm-7.16.7-987b1b1bed-25d969fb20.zip delete mode 100644 .yarn/cache/@babel-helper-hoist-variables-npm-7.16.7-25cc3abba4-6ae1641f4a.zip delete mode 100644 .yarn/cache/@babel-helper-plugin-utils-npm-7.14.5-e35eef11cb-fe20e90a24.zip delete mode 100644 .yarn/cache/@babel-helper-split-export-declaration-npm-7.16.7-5b9ae90171-e10aaf1354.zip delete mode 100644 .yarn/cache/@babel-helper-validator-identifier-npm-7.16.7-8599fb00fc-42b9b56c35.zip delete mode 100644 .yarn/cache/@babel-highlight-npm-7.16.10-626c03326c-1f1bdd752a.zip delete mode 100644 .yarn/cache/@babel-parser-npm-7.17.3-1c3b6747e0-2d45750cdf.zip delete mode 100644 .yarn/cache/@babel-template-npm-7.16.7-a18e444be8-f35836a8cd.zip delete mode 100644 .yarn/cache/@babel-traverse-npm-7.17.3-c2bff3e671-03aed531e0.zip delete mode 100644 .yarn/cache/@babel-types-npm-7.17.0-3c936b54e4-535ccef360.zip delete mode 100644 .yarn/cache/@cspotcode-source-map-consumer-npm-0.8.0-1f37e9e72b-dfe1399712.zip delete mode 100644 .yarn/cache/@cspotcode-source-map-support-npm-0.7.0-456c3ea2ce-d58b31640c.zip delete mode 100644 .yarn/cache/@eslint-community-eslint-utils-npm-4.2.0-434cf92d50-ef8b20b0c7.zip delete mode 100644 .yarn/cache/@eslint-community-regexpp-npm-4.4.0-6bee7b2314-3d9b740479.zip delete mode 100644 .yarn/cache/@jridgewell-gen-mapping-npm-0.3.2-c64eeb4a4e-7ba0070be1.zip delete mode 100644 .yarn/cache/@jridgewell-resolve-uri-npm-3.0.8-94779c6a1d-ba6bb26bae.zip delete mode 100644 .yarn/cache/@jridgewell-trace-mapping-npm-0.3.15-7357dbf648-c889039e05.zip delete mode 100644 .yarn/cache/@types-json-schema-npm-7.0.11-79462ae5ca-e50864a93f.zip delete mode 100644 .yarn/cache/@types-node-npm-17.0.21-7d68eb6a13-2beae12b02.zip delete mode 100644 .yarn/cache/@types-semver-npm-7.3.13-56212b60da-0064efd7a0.zip delete mode 100644 .yarn/cache/acorn-npm-8.8.2-9d518fd7d3-b4e77d56d2.zip delete mode 100644 .yarn/cache/agentkeepalive-npm-4.2.0-e5e72b8ce4-cc6e1b4f1c.zip delete mode 100644 .yarn/cache/ajv-npm-8.8.1-3d331224e3-fc52cd18c9.zip delete mode 100644 .yarn/cache/browserslist-npm-4.18.1-38eb8a64b9-83bb8dd04c.zip delete mode 100644 .yarn/cache/call-bind-npm-1.0.2-c957124861-ca787179c1.zip delete mode 100644 .yarn/cache/caniuse-lite-npm-1.0.30001282-49173a42dd-7802b8e099.zip delete mode 100644 .yarn/cache/check-error-npm-1.0.2-00c540c6e9-011e74b2ea.zip delete mode 100644 .yarn/cache/colorette-npm-2.0.19-f73dfe6a4e-6e2606435c.zip delete mode 100644 .yarn/cache/define-properties-npm-1.2.0-3547cd0fd2-e60aee6a19.zip delete mode 100644 .yarn/cache/electron-to-chromium-npm-1.3.903-3e6dfabc20-12a0c5ba72.zip delete mode 100644 .yarn/cache/enhanced-resolve-npm-5.12.0-c291ce4ee3-ea5b49a064.zip delete mode 100644 .yarn/cache/es-abstract-npm-1.21.2-f4ebace1ab-2e1d6922c9.zip delete mode 100644 .yarn/cache/eslint-import-resolver-node-npm-0.3.6-d9426786c6-c35c6edb7e.zip delete mode 100644 .yarn/cache/eslint-visitor-keys-npm-3.3.0-d329af7c8c-37a1a5912a.zip delete mode 100644 .yarn/cache/espree-npm-9.1.0-fd22538590-8ade225f24.zip delete mode 100644 .yarn/cache/fast-glob-npm-3.2.11-bc01135fef-6b736d92a4.zip create mode 100644 .yarn/cache/fsevents-patch-19706e7e35-10.zip delete mode 100644 .yarn/cache/function-bind-npm-1.1.1-b56b322ae9-d83f296803.zip delete mode 100644 .yarn/cache/function.prototype.name-npm-1.1.5-e776a642bb-5d426e5a38.zip delete mode 100644 .yarn/cache/get-intrinsic-npm-1.2.0-eb08ea9b1d-f57c5fe67a.zip delete mode 100644 .yarn/cache/glob-npm-10.3.4-f58cd31f55-6375721bcd.zip create mode 100644 .yarn/cache/ip-address-npm-9.0.5-9fa024d42a-1ed81e0672.zip delete mode 100644 .yarn/cache/ip-npm-1.1.5-af36318aa6-40a00572cf.zip delete mode 100644 .yarn/cache/ip-npm-2.0.0-204facb3cc-1270b11e53.zip delete mode 100644 .yarn/cache/is-core-module-npm-2.8.1-ce21740d1b-80b33fbd45.zip delete mode 100644 .yarn/cache/is-typed-array-npm-1.1.10-fe4ef83cdc-2392b2473b.zip delete mode 100644 .yarn/cache/istanbul-lib-coverage-npm-3.2.0-93f84b2c8c-31621b84ad.zip delete mode 100644 .yarn/cache/jackspeak-npm-2.3.3-755684cc60-a4c7c1a3ff.zip create mode 100644 .yarn/cache/jsbn-npm-1.1.0-1da0181838-bebe7ae829.zip delete mode 100644 .yarn/cache/json5-npm-2.2.0-da49dc7cb5-d72ea87423.zip delete mode 100644 .yarn/cache/lru-cache-npm-10.0.1-0e1abf4c13-5bb91a97a3.zip delete mode 100644 .yarn/cache/lru-cache-npm-7.3.1-b157dca680-83adf549d8.zip delete mode 100644 .yarn/cache/mem-fs-editor-npm-9.4.0-97c608fb01-b196c50010.zip delete mode 100644 .yarn/cache/minimatch-npm-5.0.0-969101c1d1-ee05bf8c18.zip delete mode 100644 .yarn/cache/minipass-npm-7.0.3-3b57909ee9-04d72c8a43.zip delete mode 100644 .yarn/cache/node-releases-npm-2.0.1-77b8e327f7-b20dd8d4bc.zip delete mode 100644 .yarn/cache/object-inspect-npm-1.12.3-1e7d20f5ff-532b0036f0.zip delete mode 100644 .yarn/cache/readable-stream-npm-3.6.0-23a4a5eb56-b80b3e6a7f.zip delete mode 100644 .yarn/cache/regexp.prototype.flags-npm-1.4.3-df1c08b65d-3cde7cd22f.zip delete mode 100644 .yarn/cache/resolve-npm-1.22.0-f641ddcc95-b2f7405d30.zip delete mode 100644 .yarn/cache/resolve-patch-2781af2c06-cb53ccafb0.zip delete mode 100644 .yarn/cache/rxjs-npm-7.8.0-722f1c7172-ff9359cc78.zip delete mode 100644 .yarn/cache/socks-npm-2.6.1-09133d0d22-6ae166bd1a.zip delete mode 100644 .yarn/cache/socks-npm-2.7.1-17f2b53052-5074f7d6a1.zip create mode 100644 .yarn/cache/socks-npm-2.8.0-9be534eccc-ed0224ce2c.zip delete mode 100644 .yarn/cache/source-map-npm-0.5.7-7c3f035429-9b4ac749ec.zip create mode 100644 .yarn/cache/sprintf-js-npm-1.1.3-b99efd75b2-e7587128c4.zip delete mode 100644 .yarn/cache/string.prototype.trim-npm-1.2.7-3fbaf3b9d2-a1b795bdb4.zip delete mode 100644 .yarn/cache/string.prototype.trimend-npm-1.0.6-304246ecc1-3893db9267.zip delete mode 100644 .yarn/cache/string.prototype.trimstart-npm-1.0.6-0926caea6c-05e2cd06fa.zip delete mode 100644 .yarn/cache/supports-hyperlinks-npm-2.2.0-9b22a6271b-a63f2acba5.zip delete mode 100644 .yarn/cache/tar-npm-6.1.11-e6ac3cba9c-0e6789e664.zip delete mode 100644 .yarn/cache/ts-node-npm-10.4.0-04cb6e2279-5874ac27f6.zip delete mode 100644 .yarn/cache/tslib-npm-2.4.1-36f0ed04db-e14311d539.zip delete mode 100644 .yarn/cache/tslib-npm-2.5.0-bb364efebd-ea556fbdf3.zip delete mode 100644 .yarn/cache/which-typed-array-npm-1.1.9-9559c95dfc-90ef760a09.zip diff --git a/.pnp.cjs b/.pnp.cjs index fb560b39ab..096caa9ee2 100755 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -141,8 +141,8 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/@ampproject-remapping-npm-2.2.1-3da3d624be-e15fecbf3b.zip/node_modules/@ampproject/remapping/",\ "packageDependencies": [\ ["@ampproject/remapping", "npm:2.2.1"],\ - ["@jridgewell/gen-mapping", "npm:0.3.2"],\ - ["@jridgewell/trace-mapping", "npm:0.3.15"]\ + ["@jridgewell/gen-mapping", "npm:0.3.3"],\ + ["@jridgewell/trace-mapping", "npm:0.3.18"]\ ],\ "linkType": "HARD"\ }]\ @@ -201,14 +201,6 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["@babel/code-frame", [\ - ["npm:7.16.7", {\ - "packageLocation": "./.yarn/cache/@babel-code-frame-npm-7.16.7-093eb9e124-db2f7faa31.zip/node_modules/@babel/code-frame/",\ - "packageDependencies": [\ - ["@babel/code-frame", "npm:7.16.7"],\ - ["@babel/highlight", "npm:7.16.10"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:7.22.13", {\ "packageLocation": "./.yarn/cache/@babel-code-frame-npm-7.22.13-2782581d20-bf6ae6ba3a.zip/node_modules/@babel/code-frame/",\ "packageDependencies": [\ @@ -282,16 +274,6 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["@babel/generator", [\ - ["npm:7.17.3", {\ - "packageLocation": "./.yarn/cache/@babel-generator-npm-7.17.3-b206625c17-9a102a87b4.zip/node_modules/@babel/generator/",\ - "packageDependencies": [\ - ["@babel/generator", "npm:7.17.3"],\ - ["@babel/types", "npm:7.17.0"],\ - ["jsesc", "npm:2.5.2"],\ - ["source-map", "npm:0.5.7"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:7.23.3", {\ "packageLocation": "./.yarn/cache/@babel-generator-npm-7.23.3-a2ca9dda65-0f815d275c.zip/node_modules/@babel/generator/",\ "packageDependencies": [\ @@ -412,7 +394,7 @@ const RAW_RUNTIME_STATE = ["@types/babel__core", null],\ ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ ["lodash.debounce", "npm:4.0.8"],\ - ["resolve", "patch:resolve@npm%3A1.22.0#optional!builtin::version=1.22.0&hash=c3c19d"]\ + ["resolve", "patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d"]\ ],\ "packagePeers": [\ "@babel/core",\ @@ -422,14 +404,6 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["@babel/helper-environment-visitor", [\ - ["npm:7.16.7", {\ - "packageLocation": "./.yarn/cache/@babel-helper-environment-visitor-npm-7.16.7-3ee2ba2019-c03a10105d.zip/node_modules/@babel/helper-environment-visitor/",\ - "packageDependencies": [\ - ["@babel/helper-environment-visitor", "npm:7.16.7"],\ - ["@babel/types", "npm:7.17.0"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:7.22.20", {\ "packageLocation": "./.yarn/cache/@babel-helper-environment-visitor-npm-7.22.20-260909e014-d80ee98ff6.zip/node_modules/@babel/helper-environment-visitor/",\ "packageDependencies": [\ @@ -439,16 +413,6 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["@babel/helper-function-name", [\ - ["npm:7.16.7", {\ - "packageLocation": "./.yarn/cache/@babel-helper-function-name-npm-7.16.7-aa24c7b296-12e2678236.zip/node_modules/@babel/helper-function-name/",\ - "packageDependencies": [\ - ["@babel/helper-function-name", "npm:7.16.7"],\ - ["@babel/helper-get-function-arity", "npm:7.16.7"],\ - ["@babel/template", "npm:7.16.7"],\ - ["@babel/types", "npm:7.17.0"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:7.23.0", {\ "packageLocation": "./.yarn/cache/@babel-helper-function-name-npm-7.23.0-ce38271242-7b2ae024cd.zip/node_modules/@babel/helper-function-name/",\ "packageDependencies": [\ @@ -459,25 +423,7 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ - ["@babel/helper-get-function-arity", [\ - ["npm:7.16.7", {\ - "packageLocation": "./.yarn/cache/@babel-helper-get-function-arity-npm-7.16.7-987b1b1bed-25d969fb20.zip/node_modules/@babel/helper-get-function-arity/",\ - "packageDependencies": [\ - ["@babel/helper-get-function-arity", "npm:7.16.7"],\ - ["@babel/types", "npm:7.17.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["@babel/helper-hoist-variables", [\ - ["npm:7.16.7", {\ - "packageLocation": "./.yarn/cache/@babel-helper-hoist-variables-npm-7.16.7-25cc3abba4-6ae1641f4a.zip/node_modules/@babel/helper-hoist-variables/",\ - "packageDependencies": [\ - ["@babel/helper-hoist-variables", "npm:7.16.7"],\ - ["@babel/types", "npm:7.17.0"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:7.22.5", {\ "packageLocation": "./.yarn/cache/@babel-helper-hoist-variables-npm-7.22.5-6db3192347-394ca191b4.zip/node_modules/@babel/helper-hoist-variables/",\ "packageDependencies": [\ @@ -545,13 +491,6 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["@babel/helper-plugin-utils", [\ - ["npm:7.14.5", {\ - "packageLocation": "./.yarn/cache/@babel-helper-plugin-utils-npm-7.14.5-e35eef11cb-fe20e90a24.zip/node_modules/@babel/helper-plugin-utils/",\ - "packageDependencies": [\ - ["@babel/helper-plugin-utils", "npm:7.14.5"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:7.22.5", {\ "packageLocation": "./.yarn/cache/@babel-helper-plugin-utils-npm-7.22.5-192e38e1de-ab220db218.zip/node_modules/@babel/helper-plugin-utils/",\ "packageDependencies": [\ @@ -631,14 +570,6 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["@babel/helper-split-export-declaration", [\ - ["npm:7.16.7", {\ - "packageLocation": "./.yarn/cache/@babel-helper-split-export-declaration-npm-7.16.7-5b9ae90171-e10aaf1354.zip/node_modules/@babel/helper-split-export-declaration/",\ - "packageDependencies": [\ - ["@babel/helper-split-export-declaration", "npm:7.16.7"],\ - ["@babel/types", "npm:7.17.0"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:7.22.6", {\ "packageLocation": "./.yarn/cache/@babel-helper-split-export-declaration-npm-7.22.6-e723505aef-e141cace58.zip/node_modules/@babel/helper-split-export-declaration/",\ "packageDependencies": [\ @@ -658,13 +589,6 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["@babel/helper-validator-identifier", [\ - ["npm:7.16.7", {\ - "packageLocation": "./.yarn/cache/@babel-helper-validator-identifier-npm-7.16.7-8599fb00fc-42b9b56c35.zip/node_modules/@babel/helper-validator-identifier/",\ - "packageDependencies": [\ - ["@babel/helper-validator-identifier", "npm:7.16.7"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:7.22.20", {\ "packageLocation": "./.yarn/cache/@babel-helper-validator-identifier-npm-7.22.20-18305bb306-df882d2675.zip/node_modules/@babel/helper-validator-identifier/",\ "packageDependencies": [\ @@ -707,16 +631,6 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["@babel/highlight", [\ - ["npm:7.16.10", {\ - "packageLocation": "./.yarn/cache/@babel-highlight-npm-7.16.10-626c03326c-1f1bdd752a.zip/node_modules/@babel/highlight/",\ - "packageDependencies": [\ - ["@babel/highlight", "npm:7.16.10"],\ - ["@babel/helper-validator-identifier", "npm:7.16.7"],\ - ["chalk", "npm:2.4.2"],\ - ["js-tokens", "npm:4.0.0"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:7.22.20", {\ "packageLocation": "./.yarn/cache/@babel-highlight-npm-7.22.20-5de7aba88d-1aabc95b2c.zip/node_modules/@babel/highlight/",\ "packageDependencies": [\ @@ -729,19 +643,11 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["@babel/parser", [\ - ["npm:7.17.3", {\ - "packageLocation": "./.yarn/cache/@babel-parser-npm-7.17.3-1c3b6747e0-2d45750cdf.zip/node_modules/@babel/parser/",\ - "packageDependencies": [\ - ["@babel/parser", "npm:7.17.3"],\ - ["@babel/types", "npm:7.17.0"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:7.23.3", {\ "packageLocation": "./.yarn/cache/@babel-parser-npm-7.23.3-8d3a021e39-284c22ec1d.zip/node_modules/@babel/parser/",\ "packageDependencies": [\ ["@babel/parser", "npm:7.23.3"],\ - ["@babel/types", "npm:7.17.0"]\ + ["@babel/types", "npm:7.23.3"]\ ],\ "linkType": "HARD"\ }]\ @@ -853,7 +759,7 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["@babel/plugin-syntax-async-generators", "virtual:06ad3cc0f492132e824d7a51e866fc99416784543ebe8e22dd21ed1a109e82519f799617af68c863bbb60d4e132d3b2572fd956418eb89500f47ecbe5029e03e#npm:7.8.4"],\ ["@babel/core", "npm:7.23.3"],\ - ["@babel/helper-plugin-utils", "npm:7.14.5"],\ + ["@babel/helper-plugin-utils", "npm:7.22.5"],\ ["@types/babel__core", null]\ ],\ "packagePeers": [\ @@ -876,7 +782,7 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["@babel/plugin-syntax-class-properties", "virtual:06ad3cc0f492132e824d7a51e866fc99416784543ebe8e22dd21ed1a109e82519f799617af68c863bbb60d4e132d3b2572fd956418eb89500f47ecbe5029e03e#npm:7.12.13"],\ ["@babel/core", "npm:7.23.3"],\ - ["@babel/helper-plugin-utils", "npm:7.14.5"],\ + ["@babel/helper-plugin-utils", "npm:7.22.5"],\ ["@types/babel__core", null]\ ],\ "packagePeers": [\ @@ -899,7 +805,7 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["@babel/plugin-syntax-class-static-block", "virtual:06ad3cc0f492132e824d7a51e866fc99416784543ebe8e22dd21ed1a109e82519f799617af68c863bbb60d4e132d3b2572fd956418eb89500f47ecbe5029e03e#npm:7.14.5"],\ ["@babel/core", "npm:7.23.3"],\ - ["@babel/helper-plugin-utils", "npm:7.14.5"],\ + ["@babel/helper-plugin-utils", "npm:7.22.5"],\ ["@types/babel__core", null]\ ],\ "packagePeers": [\ @@ -922,7 +828,7 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["@babel/plugin-syntax-dynamic-import", "virtual:06ad3cc0f492132e824d7a51e866fc99416784543ebe8e22dd21ed1a109e82519f799617af68c863bbb60d4e132d3b2572fd956418eb89500f47ecbe5029e03e#npm:7.8.3"],\ ["@babel/core", "npm:7.23.3"],\ - ["@babel/helper-plugin-utils", "npm:7.14.5"],\ + ["@babel/helper-plugin-utils", "npm:7.22.5"],\ ["@types/babel__core", null]\ ],\ "packagePeers": [\ @@ -945,7 +851,7 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["@babel/plugin-syntax-export-namespace-from", "virtual:06ad3cc0f492132e824d7a51e866fc99416784543ebe8e22dd21ed1a109e82519f799617af68c863bbb60d4e132d3b2572fd956418eb89500f47ecbe5029e03e#npm:7.8.3"],\ ["@babel/core", "npm:7.23.3"],\ - ["@babel/helper-plugin-utils", "npm:7.14.5"],\ + ["@babel/helper-plugin-utils", "npm:7.22.5"],\ ["@types/babel__core", null]\ ],\ "packagePeers": [\ @@ -1014,7 +920,7 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["@babel/plugin-syntax-import-meta", "virtual:06ad3cc0f492132e824d7a51e866fc99416784543ebe8e22dd21ed1a109e82519f799617af68c863bbb60d4e132d3b2572fd956418eb89500f47ecbe5029e03e#npm:7.10.4"],\ ["@babel/core", "npm:7.23.3"],\ - ["@babel/helper-plugin-utils", "npm:7.14.5"],\ + ["@babel/helper-plugin-utils", "npm:7.22.5"],\ ["@types/babel__core", null]\ ],\ "packagePeers": [\ @@ -1037,7 +943,7 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["@babel/plugin-syntax-json-strings", "virtual:06ad3cc0f492132e824d7a51e866fc99416784543ebe8e22dd21ed1a109e82519f799617af68c863bbb60d4e132d3b2572fd956418eb89500f47ecbe5029e03e#npm:7.8.3"],\ ["@babel/core", "npm:7.23.3"],\ - ["@babel/helper-plugin-utils", "npm:7.14.5"],\ + ["@babel/helper-plugin-utils", "npm:7.22.5"],\ ["@types/babel__core", null]\ ],\ "packagePeers": [\ @@ -1060,7 +966,7 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["@babel/plugin-syntax-logical-assignment-operators", "virtual:06ad3cc0f492132e824d7a51e866fc99416784543ebe8e22dd21ed1a109e82519f799617af68c863bbb60d4e132d3b2572fd956418eb89500f47ecbe5029e03e#npm:7.10.4"],\ ["@babel/core", "npm:7.23.3"],\ - ["@babel/helper-plugin-utils", "npm:7.14.5"],\ + ["@babel/helper-plugin-utils", "npm:7.22.5"],\ ["@types/babel__core", null]\ ],\ "packagePeers": [\ @@ -1083,7 +989,7 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["@babel/plugin-syntax-nullish-coalescing-operator", "virtual:06ad3cc0f492132e824d7a51e866fc99416784543ebe8e22dd21ed1a109e82519f799617af68c863bbb60d4e132d3b2572fd956418eb89500f47ecbe5029e03e#npm:7.8.3"],\ ["@babel/core", "npm:7.23.3"],\ - ["@babel/helper-plugin-utils", "npm:7.14.5"],\ + ["@babel/helper-plugin-utils", "npm:7.22.5"],\ ["@types/babel__core", null]\ ],\ "packagePeers": [\ @@ -1106,7 +1012,7 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["@babel/plugin-syntax-numeric-separator", "virtual:06ad3cc0f492132e824d7a51e866fc99416784543ebe8e22dd21ed1a109e82519f799617af68c863bbb60d4e132d3b2572fd956418eb89500f47ecbe5029e03e#npm:7.10.4"],\ ["@babel/core", "npm:7.23.3"],\ - ["@babel/helper-plugin-utils", "npm:7.14.5"],\ + ["@babel/helper-plugin-utils", "npm:7.22.5"],\ ["@types/babel__core", null]\ ],\ "packagePeers": [\ @@ -1129,7 +1035,7 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["@babel/plugin-syntax-object-rest-spread", "virtual:06ad3cc0f492132e824d7a51e866fc99416784543ebe8e22dd21ed1a109e82519f799617af68c863bbb60d4e132d3b2572fd956418eb89500f47ecbe5029e03e#npm:7.8.3"],\ ["@babel/core", "npm:7.23.3"],\ - ["@babel/helper-plugin-utils", "npm:7.14.5"],\ + ["@babel/helper-plugin-utils", "npm:7.22.5"],\ ["@types/babel__core", null]\ ],\ "packagePeers": [\ @@ -1152,7 +1058,7 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["@babel/plugin-syntax-optional-catch-binding", "virtual:06ad3cc0f492132e824d7a51e866fc99416784543ebe8e22dd21ed1a109e82519f799617af68c863bbb60d4e132d3b2572fd956418eb89500f47ecbe5029e03e#npm:7.8.3"],\ ["@babel/core", "npm:7.23.3"],\ - ["@babel/helper-plugin-utils", "npm:7.14.5"],\ + ["@babel/helper-plugin-utils", "npm:7.22.5"],\ ["@types/babel__core", null]\ ],\ "packagePeers": [\ @@ -1175,7 +1081,7 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["@babel/plugin-syntax-optional-chaining", "virtual:06ad3cc0f492132e824d7a51e866fc99416784543ebe8e22dd21ed1a109e82519f799617af68c863bbb60d4e132d3b2572fd956418eb89500f47ecbe5029e03e#npm:7.8.3"],\ ["@babel/core", "npm:7.23.3"],\ - ["@babel/helper-plugin-utils", "npm:7.14.5"],\ + ["@babel/helper-plugin-utils", "npm:7.22.5"],\ ["@types/babel__core", null]\ ],\ "packagePeers": [\ @@ -1198,7 +1104,7 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["@babel/plugin-syntax-private-property-in-object", "virtual:06ad3cc0f492132e824d7a51e866fc99416784543ebe8e22dd21ed1a109e82519f799617af68c863bbb60d4e132d3b2572fd956418eb89500f47ecbe5029e03e#npm:7.14.5"],\ ["@babel/core", "npm:7.23.3"],\ - ["@babel/helper-plugin-utils", "npm:7.14.5"],\ + ["@babel/helper-plugin-utils", "npm:7.22.5"],\ ["@types/babel__core", null]\ ],\ "packagePeers": [\ @@ -1221,7 +1127,7 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["@babel/plugin-syntax-top-level-await", "virtual:06ad3cc0f492132e824d7a51e866fc99416784543ebe8e22dd21ed1a109e82519f799617af68c863bbb60d4e132d3b2572fd956418eb89500f47ecbe5029e03e#npm:7.14.5"],\ ["@babel/core", "npm:7.23.3"],\ - ["@babel/helper-plugin-utils", "npm:7.14.5"],\ + ["@babel/helper-plugin-utils", "npm:7.22.5"],\ ["@types/babel__core", null]\ ],\ "packagePeers": [\ @@ -2526,8 +2432,8 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["@babel/preset-modules", "virtual:06ad3cc0f492132e824d7a51e866fc99416784543ebe8e22dd21ed1a109e82519f799617af68c863bbb60d4e132d3b2572fd956418eb89500f47ecbe5029e03e#npm:0.1.6-no-external-plugins"],\ ["@babel/core", "npm:7.23.3"],\ - ["@babel/helper-plugin-utils", "npm:7.14.5"],\ - ["@babel/types", "npm:7.17.0"],\ + ["@babel/helper-plugin-utils", "npm:7.22.5"],\ + ["@babel/types", "npm:7.23.3"],\ ["@types/babel__core", null],\ ["esutils", "npm:2.0.3"]\ ],\ @@ -2558,16 +2464,6 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["@babel/template", [\ - ["npm:7.16.7", {\ - "packageLocation": "./.yarn/cache/@babel-template-npm-7.16.7-a18e444be8-f35836a8cd.zip/node_modules/@babel/template/",\ - "packageDependencies": [\ - ["@babel/template", "npm:7.16.7"],\ - ["@babel/code-frame", "npm:7.16.7"],\ - ["@babel/parser", "npm:7.17.3"],\ - ["@babel/types", "npm:7.17.0"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:7.22.15", {\ "packageLocation": "./.yarn/cache/@babel-template-npm-7.22.15-0b464facb4-21e768e4ee.zip/node_modules/@babel/template/",\ "packageDependencies": [\ @@ -2580,23 +2476,6 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["@babel/traverse", [\ - ["npm:7.17.3", {\ - "packageLocation": "./.yarn/cache/@babel-traverse-npm-7.17.3-c2bff3e671-03aed531e0.zip/node_modules/@babel/traverse/",\ - "packageDependencies": [\ - ["@babel/traverse", "npm:7.17.3"],\ - ["@babel/code-frame", "npm:7.16.7"],\ - ["@babel/generator", "npm:7.17.3"],\ - ["@babel/helper-environment-visitor", "npm:7.16.7"],\ - ["@babel/helper-function-name", "npm:7.16.7"],\ - ["@babel/helper-hoist-variables", "npm:7.16.7"],\ - ["@babel/helper-split-export-declaration", "npm:7.16.7"],\ - ["@babel/parser", "npm:7.17.3"],\ - ["@babel/types", "npm:7.17.0"],\ - ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ - ["globals", "npm:11.12.0"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:7.23.3", {\ "packageLocation": "./.yarn/cache/@babel-traverse-npm-7.23.3-a268f4c943-522ef8eefe.zip/node_modules/@babel/traverse/",\ "packageDependencies": [\ @@ -2616,15 +2495,6 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["@babel/types", [\ - ["npm:7.17.0", {\ - "packageLocation": "./.yarn/cache/@babel-types-npm-7.17.0-3c936b54e4-535ccef360.zip/node_modules/@babel/types/",\ - "packageDependencies": [\ - ["@babel/types", "npm:7.17.0"],\ - ["@babel/helper-validator-identifier", "npm:7.16.7"],\ - ["to-fast-properties", "npm:2.0.0"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:7.23.3", {\ "packageLocation": "./.yarn/cache/@babel-types-npm-7.23.3-77a779c6d4-05ec1527d0.zip/node_modules/@babel/types/",\ "packageDependencies": [\ @@ -2654,24 +2524,7 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ - ["@cspotcode/source-map-consumer", [\ - ["npm:0.8.0", {\ - "packageLocation": "./.yarn/cache/@cspotcode-source-map-consumer-npm-0.8.0-1f37e9e72b-dfe1399712.zip/node_modules/@cspotcode/source-map-consumer/",\ - "packageDependencies": [\ - ["@cspotcode/source-map-consumer", "npm:0.8.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["@cspotcode/source-map-support", [\ - ["npm:0.7.0", {\ - "packageLocation": "./.yarn/cache/@cspotcode-source-map-support-npm-0.7.0-456c3ea2ce-d58b31640c.zip/node_modules/@cspotcode/source-map-support/",\ - "packageDependencies": [\ - ["@cspotcode/source-map-support", "npm:0.7.0"],\ - ["@cspotcode/source-map-consumer", "npm:0.8.0"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:0.8.1", {\ "packageLocation": "./.yarn/cache/@cspotcode-source-map-support-npm-0.8.1-964f2de99d-b6e38a1712.zip/node_modules/@cspotcode/source-map-support/",\ "packageDependencies": [\ @@ -2741,7 +2594,7 @@ const RAW_RUNTIME_STATE = ["@dashevo/wasm-dpp", "workspace:packages/wasm-dpp"],\ ["@grpc/grpc-js", "npm:1.4.4"],\ ["@pshenmic/zeromq", "npm:6.0.0-beta.22"],\ - ["ajv", "npm:8.8.1"],\ + ["ajv", "npm:8.12.0"],\ ["bs58", "npm:4.0.1"],\ ["cbor", "npm:8.1.0"],\ ["chai", "npm:4.3.10"],\ @@ -3107,7 +2960,7 @@ const RAW_RUNTIME_STATE = ["eslint-config-airbnb-base", "virtual:e2d057e7cc143d3cb9bec864f4a2d862441b5a09f81f8e6c46e7a098cbc89e4d07017cc6e2e2142d5704bb55da853cbec2d025ebc0b30e8696c31380c00f2c7d#npm:15.0.0"],\ ["eslint-plugin-import", "virtual:e2d057e7cc143d3cb9bec864f4a2d862441b5a09f81f8e6c46e7a098cbc89e4d07017cc6e2e2142d5704bb55da853cbec2d025ebc0b30e8696c31380c00f2c7d#npm:2.29.0"],\ ["events", "npm:3.3.0"],\ - ["glob", "npm:10.3.4"],\ + ["glob", "npm:10.3.10"],\ ["https-browserify", "npm:1.0.0"],\ ["js-merkle", "npm:0.1.5"],\ ["karma", "npm:6.4.1"],\ @@ -3160,7 +3013,7 @@ const RAW_RUNTIME_STATE = ["@types/node", "npm:13.13.52"],\ ["chalk", "npm:3.0.0"],\ ["escodegen", "npm:2.0.0"],\ - ["espree", "npm:9.1.0"],\ + ["espree", "npm:9.6.1"],\ ["estraverse", "npm:5.3.0"],\ ["glob", "npm:7.2.0"],\ ["long", "npm:4.0.0"],\ @@ -3245,7 +3098,7 @@ const RAW_RUNTIME_STATE = ["@types/bs58", "npm:4.0.1"],\ ["@types/node", "npm:14.17.34"],\ ["@yarnpkg/pnpify", "npm:4.0.0-rc.42"],\ - ["ajv", "npm:8.8.1"],\ + ["ajv", "npm:8.12.0"],\ ["assert", "npm:2.0.0"],\ ["bs58", "npm:4.0.1"],\ ["buffer", "npm:6.0.3"],\ @@ -3340,13 +3193,6 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["@eslint-community/eslint-utils", [\ - ["npm:4.2.0", {\ - "packageLocation": "./.yarn/cache/@eslint-community-eslint-utils-npm-4.2.0-434cf92d50-ef8b20b0c7.zip/node_modules/@eslint-community/eslint-utils/",\ - "packageDependencies": [\ - ["@eslint-community/eslint-utils", "npm:4.2.0"]\ - ],\ - "linkType": "SOFT"\ - }],\ ["npm:4.4.0", {\ "packageLocation": "./.yarn/cache/@eslint-community-eslint-utils-npm-4.4.0-d1791bd5a3-8d70bcdcd8.zip/node_modules/@eslint-community/eslint-utils/",\ "packageDependencies": [\ @@ -3354,13 +3200,13 @@ const RAW_RUNTIME_STATE = ],\ "linkType": "SOFT"\ }],\ - ["virtual:2fc5c501d26c4c2fbc6a1d931e87d32adb7d9118fbcd7303a7b7faae809112bde136383859a265761a47c2852a001b7b803bf80e734ffa8ddc2ca30c129d1d76#npm:4.2.0", {\ - "packageLocation": "./.yarn/__virtual__/@eslint-community-eslint-utils-virtual-1e8778691e/0/cache/@eslint-community-eslint-utils-npm-4.2.0-434cf92d50-ef8b20b0c7.zip/node_modules/@eslint-community/eslint-utils/",\ + ["virtual:2fc5c501d26c4c2fbc6a1d931e87d32adb7d9118fbcd7303a7b7faae809112bde136383859a265761a47c2852a001b7b803bf80e734ffa8ddc2ca30c129d1d76#npm:4.4.0", {\ + "packageLocation": "./.yarn/__virtual__/@eslint-community-eslint-utils-virtual-4b69618f4d/0/cache/@eslint-community-eslint-utils-npm-4.4.0-d1791bd5a3-8d70bcdcd8.zip/node_modules/@eslint-community/eslint-utils/",\ "packageDependencies": [\ - ["@eslint-community/eslint-utils", "virtual:2fc5c501d26c4c2fbc6a1d931e87d32adb7d9118fbcd7303a7b7faae809112bde136383859a265761a47c2852a001b7b803bf80e734ffa8ddc2ca30c129d1d76#npm:4.2.0"],\ + ["@eslint-community/eslint-utils", "virtual:2fc5c501d26c4c2fbc6a1d931e87d32adb7d9118fbcd7303a7b7faae809112bde136383859a265761a47c2852a001b7b803bf80e734ffa8ddc2ca30c129d1d76#npm:4.4.0"],\ ["@types/eslint", null],\ ["eslint", "npm:8.53.0"],\ - ["eslint-visitor-keys", "npm:3.3.0"]\ + ["eslint-visitor-keys", "npm:3.4.3"]\ ],\ "packagePeers": [\ "@types/eslint",\ @@ -3374,7 +3220,7 @@ const RAW_RUNTIME_STATE = ["@eslint-community/eslint-utils", "virtual:b13453c6e327a35c05e8ce1283d4970e5e4619ba21a2fa8909367ea67136c23860ec34186acaf505374401498c777e7891702b73bbd3697c54d0993c3fd435cd#npm:4.4.0"],\ ["@types/eslint", null],\ ["eslint", null],\ - ["eslint-visitor-keys", "npm:3.3.0"]\ + ["eslint-visitor-keys", "npm:3.4.3"]\ ],\ "packagePeers": [\ "@types/eslint",\ @@ -3390,13 +3236,6 @@ const RAW_RUNTIME_STATE = ["@eslint-community/regexpp", "npm:4.10.0"]\ ],\ "linkType": "HARD"\ - }],\ - ["npm:4.4.0", {\ - "packageLocation": "./.yarn/cache/@eslint-community-regexpp-npm-4.4.0-6bee7b2314-3d9b740479.zip/node_modules/@eslint-community/regexpp/",\ - "packageDependencies": [\ - ["@eslint-community/regexpp", "npm:4.4.0"]\ - ],\ - "linkType": "HARD"\ }]\ ]],\ ["@eslint/eslintrc", [\ @@ -3432,7 +3271,7 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["@grpc/grpc-js", "npm:1.4.4"],\ ["@grpc/proto-loader", "npm:0.6.13"],\ - ["@types/node", "npm:17.0.21"]\ + ["@types/node", "npm:18.16.1"]\ ],\ "linkType": "HARD"\ }]\ @@ -3598,35 +3437,18 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["@jridgewell/gen-mapping", [\ - ["npm:0.3.2", {\ - "packageLocation": "./.yarn/cache/@jridgewell-gen-mapping-npm-0.3.2-c64eeb4a4e-7ba0070be1.zip/node_modules/@jridgewell/gen-mapping/",\ - "packageDependencies": [\ - ["@jridgewell/gen-mapping", "npm:0.3.2"],\ - ["@jridgewell/set-array", "npm:1.1.2"],\ - ["@jridgewell/sourcemap-codec", "npm:1.4.14"],\ - ["@jridgewell/trace-mapping", "npm:0.3.15"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:0.3.3", {\ "packageLocation": "./.yarn/cache/@jridgewell-gen-mapping-npm-0.3.3-1815eba94c-072ace159c.zip/node_modules/@jridgewell/gen-mapping/",\ "packageDependencies": [\ ["@jridgewell/gen-mapping", "npm:0.3.3"],\ ["@jridgewell/set-array", "npm:1.1.2"],\ ["@jridgewell/sourcemap-codec", "npm:1.4.14"],\ - ["@jridgewell/trace-mapping", "npm:0.3.15"]\ + ["@jridgewell/trace-mapping", "npm:0.3.18"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@jridgewell/resolve-uri", [\ - ["npm:3.0.8", {\ - "packageLocation": "./.yarn/cache/@jridgewell-resolve-uri-npm-3.0.8-94779c6a1d-ba6bb26bae.zip/node_modules/@jridgewell/resolve-uri/",\ - "packageDependencies": [\ - ["@jridgewell/resolve-uri", "npm:3.0.8"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:3.1.0", {\ "packageLocation": "./.yarn/cache/@jridgewell-resolve-uri-npm-3.1.0-6ff2351e61-320ceb37af.zip/node_modules/@jridgewell/resolve-uri/",\ "packageDependencies": [\ @@ -3649,8 +3471,8 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/@jridgewell-source-map-npm-0.3.2-6fd1f37b22-1aaa42075b.zip/node_modules/@jridgewell/source-map/",\ "packageDependencies": [\ ["@jridgewell/source-map", "npm:0.3.2"],\ - ["@jridgewell/gen-mapping", "npm:0.3.2"],\ - ["@jridgewell/trace-mapping", "npm:0.3.15"]\ + ["@jridgewell/gen-mapping", "npm:0.3.3"],\ + ["@jridgewell/trace-mapping", "npm:0.3.18"]\ ],\ "linkType": "HARD"\ }]\ @@ -3665,15 +3487,6 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["@jridgewell/trace-mapping", [\ - ["npm:0.3.15", {\ - "packageLocation": "./.yarn/cache/@jridgewell-trace-mapping-npm-0.3.15-7357dbf648-c889039e05.zip/node_modules/@jridgewell/trace-mapping/",\ - "packageDependencies": [\ - ["@jridgewell/trace-mapping", "npm:0.3.15"],\ - ["@jridgewell/resolve-uri", "npm:3.0.8"],\ - ["@jridgewell/sourcemap-codec", "npm:1.4.14"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:0.3.18", {\ "packageLocation": "./.yarn/cache/@jridgewell-trace-mapping-npm-0.3.18-cd96571385-f4fabdddf8.zip/node_modules/@jridgewell/trace-mapping/",\ "packageDependencies": [\ @@ -3687,7 +3500,7 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/@jridgewell-trace-mapping-npm-0.3.9-91625cd7fb-83deafb8e7.zip/node_modules/@jridgewell/trace-mapping/",\ "packageDependencies": [\ ["@jridgewell/trace-mapping", "npm:0.3.9"],\ - ["@jridgewell/resolve-uri", "npm:3.0.8"],\ + ["@jridgewell/resolve-uri", "npm:3.1.0"],\ ["@jridgewell/sourcemap-codec", "npm:1.4.14"]\ ],\ "linkType": "HARD"\ @@ -3885,7 +3698,7 @@ const RAW_RUNTIME_STATE = ["@npmcli/map-workspaces", "npm:2.0.1"],\ ["@npmcli/name-from-folder", "npm:1.0.1"],\ ["glob", "npm:7.2.0"],\ - ["minimatch", "npm:5.0.0"],\ + ["minimatch", "npm:5.1.6"],\ ["read-package-json-fast", "npm:2.0.3"]\ ],\ "linkType": "HARD"\ @@ -4020,7 +3833,7 @@ const RAW_RUNTIME_STATE = ["string-width", "npm:4.2.3"],\ ["strip-ansi", "npm:6.0.1"],\ ["supports-color", "npm:8.1.1"],\ - ["supports-hyperlinks", "npm:2.2.0"],\ + ["supports-hyperlinks", "npm:2.3.0"],\ ["ts-node", "virtual:ea55642553292d92df3b95679ce7d915309f63e183de810f329a0681dbf96348ae483bd374f89b77a6617494a51dc04338bed5fc7e9ba4255333eb598d1d96a6#npm:10.9.1"],\ ["tslib", "npm:2.6.2"],\ ["widest-line", "npm:3.1.0"],\ @@ -4054,7 +3867,7 @@ const RAW_RUNTIME_STATE = ["string-width", "npm:4.2.3"],\ ["strip-ansi", "npm:6.0.1"],\ ["supports-color", "npm:8.1.1"],\ - ["supports-hyperlinks", "npm:2.2.0"],\ + ["supports-hyperlinks", "npm:2.3.0"],\ ["tsconfck", "virtual:8f21c98bfcc042ba60b788a91928a322c2913836408eca0abbbf7e052098181701b9cf262c158a547725d8391dd3ff1a933d413944d0ea9e7f920b175a28a2e9#npm:3.0.0"],\ ["widest-line", "npm:3.1.0"],\ ["wordwrap", "npm:1.0.0"],\ @@ -4669,7 +4482,7 @@ const RAW_RUNTIME_STATE = ["@types/cacheable-request", "npm:6.0.3"],\ ["@types/http-cache-semantics", "npm:4.0.4"],\ ["@types/keyv", "npm:3.1.4"],\ - ["@types/node", "npm:17.0.21"],\ + ["@types/node", "npm:18.16.1"],\ ["@types/responselike", "npm:1.0.3"]\ ],\ "linkType": "HARD"\ @@ -4699,7 +4512,7 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/@types-cli-progress-npm-3.11.5-180614d1b0-cb19187637.zip/node_modules/@types/cli-progress/",\ "packageDependencies": [\ ["@types/cli-progress", "npm:3.11.5"],\ - ["@types/node", "npm:17.0.21"]\ + ["@types/node", "npm:18.16.1"]\ ],\ "linkType": "HARD"\ }]\ @@ -4709,7 +4522,7 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/@types-connect-npm-3.4.35-7337eee0a3-fe81351470.zip/node_modules/@types/connect/",\ "packageDependencies": [\ ["@types/connect", "npm:3.4.35"],\ - ["@types/node", "npm:17.0.21"]\ + ["@types/node", "npm:18.16.1"]\ ],\ "linkType": "HARD"\ }]\ @@ -4758,7 +4571,7 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["@types/eslint", "npm:7.29.0"],\ ["@types/estree", "npm:0.0.51"],\ - ["@types/json-schema", "npm:7.0.11"]\ + ["@types/json-schema", "npm:7.0.15"]\ ],\ "linkType": "HARD"\ }],\ @@ -4767,7 +4580,7 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["@types/eslint", "npm:8.2.0"],\ ["@types/estree", "npm:0.0.51"],\ - ["@types/json-schema", "npm:7.0.11"]\ + ["@types/json-schema", "npm:7.0.15"]\ ],\ "linkType": "HARD"\ }]\ @@ -4811,13 +4624,6 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["@types/json-schema", [\ - ["npm:7.0.11", {\ - "packageLocation": "./.yarn/cache/@types-json-schema-npm-7.0.11-79462ae5ca-e50864a93f.zip/node_modules/@types/json-schema/",\ - "packageDependencies": [\ - ["@types/json-schema", "npm:7.0.11"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:7.0.15", {\ "packageLocation": "./.yarn/cache/@types-json-schema-npm-7.0.15-fd16381786-1a3c3e0623.zip/node_modules/@types/json-schema/",\ "packageDependencies": [\ @@ -4831,7 +4637,7 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/@types-keyv-npm-3.1.4-a8082ea56b-e009a2bfb5.zip/node_modules/@types/keyv/",\ "packageDependencies": [\ ["@types/keyv", "npm:3.1.4"],\ - ["@types/node", "npm:17.0.21"]\ + ["@types/node", "npm:18.16.1"]\ ],\ "linkType": "HARD"\ }]\ @@ -4908,13 +4714,6 @@ const RAW_RUNTIME_STATE = ],\ "linkType": "HARD"\ }],\ - ["npm:17.0.21", {\ - "packageLocation": "./.yarn/cache/@types-node-npm-17.0.21-7d68eb6a13-2beae12b02.zip/node_modules/@types/node/",\ - "packageDependencies": [\ - ["@types/node", "npm:17.0.21"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:18.16.1", {\ "packageLocation": "./.yarn/cache/@types-node-npm-18.16.1-b36b37400b-d77a82fa40.zip/node_modules/@types/node/",\ "packageDependencies": [\ @@ -4937,19 +4736,12 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/@types-responselike-npm-1.0.3-de0150f03d-6ac4b35723.zip/node_modules/@types/responselike/",\ "packageDependencies": [\ ["@types/responselike", "npm:1.0.3"],\ - ["@types/node", "npm:17.0.21"]\ + ["@types/node", "npm:18.16.1"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@types/semver", [\ - ["npm:7.3.13", {\ - "packageLocation": "./.yarn/cache/@types-semver-npm-7.3.13-56212b60da-0064efd7a0.zip/node_modules/@types/semver/",\ - "packageDependencies": [\ - ["@types/semver", "npm:7.3.13"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:7.5.5", {\ "packageLocation": "./.yarn/cache/@types-semver-npm-7.5.5-a3c0668cf4-1b0be2c4d8.zip/node_modules/@types/semver/",\ "packageDependencies": [\ @@ -5011,7 +4803,7 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["@types/vinyl", "npm:2.0.6"],\ ["@types/expect", "npm:1.20.4"],\ - ["@types/node", "npm:17.0.21"]\ + ["@types/node", "npm:18.16.1"]\ ],\ "linkType": "HARD"\ }]\ @@ -5021,7 +4813,7 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/@types-ws-npm-7.4.7-d0c95c0958-5236b6c548.zip/node_modules/@types/ws/",\ "packageDependencies": [\ ["@types/ws", "npm:7.4.7"],\ - ["@types/node", "npm:17.0.21"]\ + ["@types/node", "npm:18.16.1"]\ ],\ "linkType": "HARD"\ }]\ @@ -5038,7 +4830,7 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/__virtual__/@typescript-eslint-eslint-plugin-virtual-0e22d802b6/0/cache/@typescript-eslint-eslint-plugin-npm-5.55.0-16386bf9af-05f921647a.zip/node_modules/@typescript-eslint/eslint-plugin/",\ "packageDependencies": [\ ["@typescript-eslint/eslint-plugin", "virtual:ad53cff31b1dbd4927a99e71702e3b8b10338636eaff010987c27c9ccea2d52af36900a9e36a4231cbb6e5464248ccc9c1da5d1d24d9b0f4f95660296b1060a6#npm:5.55.0"],\ - ["@eslint-community/regexpp", "npm:4.4.0"],\ + ["@eslint-community/regexpp", "npm:4.10.0"],\ ["@types/eslint", null],\ ["@types/typescript", null],\ ["@types/typescript-eslint__parser", null],\ @@ -5277,10 +5069,10 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/__virtual__/@typescript-eslint-utils-virtual-67e332304c/0/cache/@typescript-eslint-utils-npm-5.55.0-6a927fceb5-121c5fc48c.zip/node_modules/@typescript-eslint/utils/",\ "packageDependencies": [\ ["@typescript-eslint/utils", "virtual:0e22d802b65219681b64a9f99af596d56d444fb6f03cdf776b56a06fb9ddeefe4b0a611780f0b0eea0b47a1f1fba5a366d19cd6561bbc1e55271f08c190cd76f#npm:5.55.0"],\ - ["@eslint-community/eslint-utils", "virtual:2fc5c501d26c4c2fbc6a1d931e87d32adb7d9118fbcd7303a7b7faae809112bde136383859a265761a47c2852a001b7b803bf80e734ffa8ddc2ca30c129d1d76#npm:4.2.0"],\ + ["@eslint-community/eslint-utils", "virtual:2fc5c501d26c4c2fbc6a1d931e87d32adb7d9118fbcd7303a7b7faae809112bde136383859a265761a47c2852a001b7b803bf80e734ffa8ddc2ca30c129d1d76#npm:4.4.0"],\ ["@types/eslint", null],\ - ["@types/json-schema", "npm:7.0.11"],\ - ["@types/semver", "npm:7.3.13"],\ + ["@types/json-schema", "npm:7.0.15"],\ + ["@types/semver", "npm:7.5.5"],\ ["@typescript-eslint/scope-manager", "npm:5.55.0"],\ ["@typescript-eslint/types", "npm:5.55.0"],\ ["@typescript-eslint/typescript-estree", "virtual:67e332304c8830574d5d9be2a388885a47a9962cf1d2441a6ada47207b10c98d9a1a1914d73816338b986563032864745d812b3a7df145ee8f3bb51baa4027e5#npm:5.55.0"],\ @@ -5301,7 +5093,7 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["@typescript-eslint/visitor-keys", "npm:5.55.0"],\ ["@typescript-eslint/types", "npm:5.55.0"],\ - ["eslint-visitor-keys", "npm:3.3.0"]\ + ["eslint-visitor-keys", "npm:3.4.3"]\ ],\ "linkType": "HARD"\ }],\ @@ -5747,7 +5539,7 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["@yarnpkg/core", "npm:4.0.0-rc.42"],\ ["@arcanis/slice-ansi", "npm:1.1.1"],\ - ["@types/semver", "npm:7.3.13"],\ + ["@types/semver", "npm:7.5.5"],\ ["@types/treeify", "npm:1.0.0"],\ ["@yarnpkg/fslib", "npm:3.0.0-rc.42"],\ ["@yarnpkg/libzip", "virtual:029d9f8b24f020bba83fc356b24f5023723ab955d802aced5e68f959eb98132b3549d03ae8c2d3187401d54ad86e275e1bf34740160f82184df9a09fcbeda7b4#npm:3.0.0-rc.42"],\ @@ -5769,7 +5561,7 @@ const RAW_RUNTIME_STATE = ["tar", "npm:6.1.13"],\ ["tinylogic", "npm:2.0.0"],\ ["treeify", "npm:1.1.0"],\ - ["tslib", "npm:2.5.0"],\ + ["tslib", "npm:2.6.2"],\ ["tunnel", "npm:0.0.6"]\ ],\ "linkType": "HARD"\ @@ -5780,7 +5572,7 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/@yarnpkg-fslib-npm-3.0.0-rc.42-de16b926e6-a4e4b8453c.zip/node_modules/@yarnpkg/fslib/",\ "packageDependencies": [\ ["@yarnpkg/fslib", "npm:3.0.0-rc.42"],\ - ["tslib", "npm:2.5.0"]\ + ["tslib", "npm:2.6.2"]\ ],\ "linkType": "HARD"\ }]\ @@ -5800,7 +5592,7 @@ const RAW_RUNTIME_STATE = ["@types/emscripten", "npm:1.39.6"],\ ["@types/yarnpkg__fslib", null],\ ["@yarnpkg/fslib", "npm:3.0.0-rc.42"],\ - ["tslib", "npm:2.5.0"]\ + ["tslib", "npm:2.6.2"]\ ],\ "packagePeers": [\ "@types/yarnpkg__fslib",\ @@ -5827,7 +5619,7 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["@yarnpkg/parsers", "npm:3.0.0-rc.42"],\ ["js-yaml", "npm:3.14.1"],\ - ["tslib", "npm:2.5.0"]\ + ["tslib", "npm:2.6.2"]\ ],\ "linkType": "HARD"\ }]\ @@ -5852,7 +5644,7 @@ const RAW_RUNTIME_STATE = ["@yarnpkg/fslib", "npm:3.0.0-rc.42"],\ ["@yarnpkg/nm", "npm:4.0.0-rc.42"],\ ["clipanion", "virtual:ba24742e5bfaec41d1d0434e6865c2744ffb69a716f18fa84bd7d44084043647838926c96a391f66b9946857565b9825479e97ad07079ef40683084ce389d203#npm:3.2.0"],\ - ["tslib", "npm:2.5.0"]\ + ["tslib", "npm:2.6.2"]\ ],\ "linkType": "HARD"\ }]\ @@ -5869,7 +5661,7 @@ const RAW_RUNTIME_STATE = ["cross-spawn", "npm:7.0.3"],\ ["fast-glob", "npm:3.2.12"],\ ["micromatch", "npm:4.0.4"],\ - ["tslib", "npm:2.5.0"]\ + ["tslib", "npm:2.6.2"]\ ],\ "linkType": "HARD"\ }]\ @@ -5943,13 +5735,6 @@ const RAW_RUNTIME_STATE = ["acorn", "npm:8.11.2"]\ ],\ "linkType": "HARD"\ - }],\ - ["npm:8.8.2", {\ - "packageLocation": "./.yarn/cache/acorn-npm-8.8.2-9d518fd7d3-b4e77d56d2.zip/node_modules/acorn/",\ - "packageDependencies": [\ - ["acorn", "npm:8.8.2"]\ - ],\ - "linkType": "HARD"\ }]\ ]],\ ["acorn-import-assertions", [\ @@ -5965,7 +5750,7 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["acorn-import-assertions", "virtual:a1758743d243877493a02719691b2bf5513261873450aca581311be1ead841af63c0be982c400355949a0dcad332960c6e3ed3885051f0427d191c70a7fc9856#npm:1.8.0"],\ ["@types/acorn", null],\ - ["acorn", "npm:8.8.2"]\ + ["acorn", "npm:8.11.2"]\ ],\ "packagePeers": [\ "@types/acorn",\ @@ -5994,19 +5779,6 @@ const RAW_RUNTIME_STATE = "acorn"\ ],\ "linkType": "HARD"\ - }],\ - ["virtual:fd2253859039a15030fecf2d1545fcad47d7bd43468b9166c71fdd4e35b538414e653775f5401c948ed8db3eb1925f84c66c161d39a27b19ee73fef5e721329e#npm:5.3.2", {\ - "packageLocation": "./.yarn/__virtual__/acorn-jsx-virtual-0c3ff7dbc9/0/cache/acorn-jsx-npm-5.3.2-d7594599ea-d4371eaef7.zip/node_modules/acorn-jsx/",\ - "packageDependencies": [\ - ["acorn-jsx", "virtual:fd2253859039a15030fecf2d1545fcad47d7bd43468b9166c71fdd4e35b538414e653775f5401c948ed8db3eb1925f84c66c161d39a27b19ee73fef5e721329e#npm:5.3.2"],\ - ["@types/acorn", null],\ - ["acorn", "npm:8.8.2"]\ - ],\ - "packagePeers": [\ - "@types/acorn",\ - "acorn"\ - ],\ - "linkType": "HARD"\ }]\ ]],\ ["acorn-walk", [\ @@ -6046,16 +5818,6 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["agentkeepalive", [\ - ["npm:4.2.0", {\ - "packageLocation": "./.yarn/cache/agentkeepalive-npm-4.2.0-e5e72b8ce4-cc6e1b4f1c.zip/node_modules/agentkeepalive/",\ - "packageDependencies": [\ - ["agentkeepalive", "npm:4.2.0"],\ - ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ - ["depd", "npm:1.1.2"],\ - ["humanize-ms", "npm:1.2.1"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:4.3.0", {\ "packageLocation": "./.yarn/cache/agentkeepalive-npm-4.3.0-ac3d8e6807-f791317eb4.zip/node_modules/agentkeepalive/",\ "packageDependencies": [\ @@ -6109,17 +5871,6 @@ const RAW_RUNTIME_STATE = ["uri-js", "npm:4.4.1"]\ ],\ "linkType": "HARD"\ - }],\ - ["npm:8.8.1", {\ - "packageLocation": "./.yarn/cache/ajv-npm-8.8.1-3d331224e3-fc52cd18c9.zip/node_modules/ajv/",\ - "packageDependencies": [\ - ["ajv", "npm:8.8.1"],\ - ["fast-deep-equal", "npm:3.1.3"],\ - ["json-schema-traverse", "npm:1.0.0"],\ - ["require-from-string", "npm:2.0.2"],\ - ["uri-js", "npm:4.4.1"]\ - ],\ - "linkType": "HARD"\ }]\ ]],\ ["ajv-formats", [\ @@ -6130,19 +5881,6 @@ const RAW_RUNTIME_STATE = ],\ "linkType": "SOFT"\ }],\ - ["virtual:880cda903c2a2be387819a3f857d21494004437a03c92969b9853f7bdeebdfed08d417e68364ee9e158338603a6d78d690c457a55ab11e56398bc10f0ad232fc#npm:2.1.1", {\ - "packageLocation": "./.yarn/__virtual__/ajv-formats-virtual-26e397430a/0/cache/ajv-formats-npm-2.1.1-3cec02eae9-70c263ded2.zip/node_modules/ajv-formats/",\ - "packageDependencies": [\ - ["ajv-formats", "virtual:880cda903c2a2be387819a3f857d21494004437a03c92969b9853f7bdeebdfed08d417e68364ee9e158338603a6d78d690c457a55ab11e56398bc10f0ad232fc#npm:2.1.1"],\ - ["@types/ajv", null],\ - ["ajv", "npm:8.8.1"]\ - ],\ - "packagePeers": [\ - "@types/ajv",\ - "ajv"\ - ],\ - "linkType": "HARD"\ - }],\ ["virtual:e822c5b02ef2b3c5fb9c8d88d5e0ca208365bff76f80510f4ccf9b1de44e2078264bcb00d3cdd5e193c256e9ab81e27c34fcfb1ad3a0e8c1dc8fa0066c78c468#npm:2.1.1", {\ "packageLocation": "./.yarn/__virtual__/ajv-formats-virtual-39fabfe016/0/cache/ajv-formats-npm-2.1.1-3cec02eae9-70c263ded2.zip/node_modules/ajv-formats/",\ "packageDependencies": [\ @@ -6340,7 +6078,7 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["are-we-there-yet", "npm:2.0.0"],\ ["delegates", "npm:1.0.0"],\ - ["readable-stream", "npm:3.6.0"]\ + ["readable-stream", "npm:3.6.2"]\ ],\ "linkType": "HARD"\ }]\ @@ -6376,7 +6114,7 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/array-buffer-byte-length-npm-1.0.0-331671f28a-044e101ce1.zip/node_modules/array-buffer-byte-length/",\ "packageDependencies": [\ ["array-buffer-byte-length", "npm:1.0.0"],\ - ["call-bind", "npm:1.0.2"],\ + ["call-bind", "npm:1.0.5"],\ ["is-array-buffer", "npm:3.0.2"]\ ],\ "linkType": "HARD"\ @@ -6405,7 +6143,7 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/array-includes-npm-3.1.7-d32a5ee179-856a8be5d1.zip/node_modules/array-includes/",\ "packageDependencies": [\ ["array-includes", "npm:3.1.7"],\ - ["call-bind", "npm:1.0.2"],\ + ["call-bind", "npm:1.0.5"],\ ["define-properties", "npm:1.2.1"],\ ["es-abstract", "npm:1.22.3"],\ ["get-intrinsic", "npm:1.2.2"],\ @@ -6428,7 +6166,7 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/array.prototype.findlastindex-npm-1.2.3-2a36f4417b-063cbab8ee.zip/node_modules/array.prototype.findlastindex/",\ "packageDependencies": [\ ["array.prototype.findlastindex", "npm:1.2.3"],\ - ["call-bind", "npm:1.0.2"],\ + ["call-bind", "npm:1.0.5"],\ ["define-properties", "npm:1.2.1"],\ ["es-abstract", "npm:1.22.3"],\ ["es-shim-unscopables", "npm:1.0.2"],\ @@ -6442,7 +6180,7 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/array.prototype.flat-npm-1.3.2-350729f7f4-d9d2f6f275.zip/node_modules/array.prototype.flat/",\ "packageDependencies": [\ ["array.prototype.flat", "npm:1.3.2"],\ - ["call-bind", "npm:1.0.2"],\ + ["call-bind", "npm:1.0.5"],\ ["define-properties", "npm:1.2.1"],\ ["es-abstract", "npm:1.22.3"],\ ["es-shim-unscopables", "npm:1.0.2"]\ @@ -6455,7 +6193,7 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/array.prototype.flatmap-npm-1.3.2-5c6a4af226-33f2000668.zip/node_modules/array.prototype.flatmap/",\ "packageDependencies": [\ ["array.prototype.flatmap", "npm:1.3.2"],\ - ["call-bind", "npm:1.0.2"],\ + ["call-bind", "npm:1.0.5"],\ ["define-properties", "npm:1.2.1"],\ ["es-abstract", "npm:1.22.3"],\ ["es-shim-unscopables", "npm:1.0.2"]\ @@ -6469,7 +6207,7 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["arraybuffer.prototype.slice", "npm:1.0.2"],\ ["array-buffer-byte-length", "npm:1.0.0"],\ - ["call-bind", "npm:1.0.2"],\ + ["call-bind", "npm:1.0.5"],\ ["define-properties", "npm:1.2.1"],\ ["es-abstract", "npm:1.22.3"],\ ["get-intrinsic", "npm:1.2.2"],\ @@ -6657,14 +6395,14 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/__virtual__/babel-eslint-virtual-ff1372ed3f/0/cache/babel-eslint-npm-10.1.0-6a6d2b1533-dc5dd948f8.zip/node_modules/babel-eslint/",\ "packageDependencies": [\ ["babel-eslint", "virtual:27dae49067a60fa65fec6e1c3adad1497d0dda3f71eda711624109131ff3b7d1061a20f55e89b5a0a219da1f7a0a1a0a76bc414d36870315bd60acf5bdcb7f55#npm:10.1.0"],\ - ["@babel/code-frame", "npm:7.16.7"],\ - ["@babel/parser", "npm:7.17.3"],\ - ["@babel/traverse", "npm:7.17.3"],\ - ["@babel/types", "npm:7.17.0"],\ + ["@babel/code-frame", "npm:7.22.13"],\ + ["@babel/parser", "npm:7.23.3"],\ + ["@babel/traverse", "npm:7.23.3"],\ + ["@babel/types", "npm:7.23.3"],\ ["@types/eslint", null],\ ["eslint", "npm:8.53.0"],\ ["eslint-visitor-keys", "npm:1.3.0"],\ - ["resolve", "patch:resolve@npm%3A1.22.0#optional!builtin::version=1.22.0&hash=c3c19d"]\ + ["resolve", "patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d"]\ ],\ "packagePeers": [\ "@types/eslint",\ @@ -6907,7 +6645,7 @@ const RAW_RUNTIME_STATE = ["bl", "npm:4.1.0"],\ ["buffer", "npm:5.7.1"],\ ["inherits", "npm:2.0.4"],\ - ["readable-stream", "npm:3.6.0"]\ + ["readable-stream", "npm:3.6.2"]\ ],\ "linkType": "HARD"\ }]\ @@ -7094,18 +6832,6 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["browserslist", [\ - ["npm:4.18.1", {\ - "packageLocation": "./.yarn/cache/browserslist-npm-4.18.1-38eb8a64b9-83bb8dd04c.zip/node_modules/browserslist/",\ - "packageDependencies": [\ - ["browserslist", "npm:4.18.1"],\ - ["caniuse-lite", "npm:1.0.30001282"],\ - ["electron-to-chromium", "npm:1.3.903"],\ - ["escalade", "npm:3.1.1"],\ - ["node-releases", "npm:2.0.1"],\ - ["picocolors", "npm:1.0.0"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:4.22.1", {\ "packageLocation": "./.yarn/cache/browserslist-npm-4.22.1-cccae6d74e-4a515168e0.zip/node_modules/browserslist/",\ "packageDependencies": [\ @@ -7330,15 +7056,6 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["call-bind", [\ - ["npm:1.0.2", {\ - "packageLocation": "./.yarn/cache/call-bind-npm-1.0.2-c957124861-ca787179c1.zip/node_modules/call-bind/",\ - "packageDependencies": [\ - ["call-bind", "npm:1.0.2"],\ - ["function-bind", "npm:1.1.1"],\ - ["get-intrinsic", "npm:1.2.0"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:1.0.5", {\ "packageLocation": "./.yarn/cache/call-bind-npm-1.0.5-65600fae47-246d44db6e.zip/node_modules/call-bind/",\ "packageDependencies": [\ @@ -7374,7 +7091,7 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["camel-case", "npm:4.1.2"],\ ["pascal-case", "npm:3.1.2"],\ - ["tslib", "npm:2.4.1"]\ + ["tslib", "npm:2.6.2"]\ ],\ "linkType": "HARD"\ }]\ @@ -7408,13 +7125,6 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["caniuse-lite", [\ - ["npm:1.0.30001282", {\ - "packageLocation": "./.yarn/cache/caniuse-lite-npm-1.0.30001282-49173a42dd-7802b8e099.zip/node_modules/caniuse-lite/",\ - "packageDependencies": [\ - ["caniuse-lite", "npm:1.0.30001282"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:1.0.30001561", {\ "packageLocation": "./.yarn/cache/caniuse-lite-npm-1.0.30001561-b213ca8bce-94cfc8454c.zip/node_modules/caniuse-lite/",\ "packageDependencies": [\ @@ -7429,7 +7139,7 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["capital-case", "npm:1.0.4"],\ ["no-case", "npm:3.0.4"],\ - ["tslib", "npm:2.4.1"],\ + ["tslib", "npm:2.6.2"],\ ["upper-case-first", "npm:2.0.2"]\ ],\ "linkType": "HARD"\ @@ -7486,7 +7196,7 @@ const RAW_RUNTIME_STATE = ["chai-as-promised", "virtual:ad53cff31b1dbd4927a99e71702e3b8b10338636eaff010987c27c9ccea2d52af36900a9e36a4231cbb6e5464248ccc9c1da5d1d24d9b0f4f95660296b1060a6#npm:7.1.1"],\ ["@types/chai", "npm:4.2.22"],\ ["chai", "npm:4.3.10"],\ - ["check-error", "npm:1.0.2"]\ + ["check-error", "npm:1.0.3"]\ ],\ "packagePeers": [\ "@types/chai",\ @@ -7500,7 +7210,7 @@ const RAW_RUNTIME_STATE = ["chai-as-promised", "virtual:e2d057e7cc143d3cb9bec864f4a2d862441b5a09f81f8e6c46e7a098cbc89e4d07017cc6e2e2142d5704bb55da853cbec2d025ebc0b30e8696c31380c00f2c7d#npm:7.1.1"],\ ["@types/chai", null],\ ["chai", "npm:4.3.10"],\ - ["check-error", "npm:1.0.2"]\ + ["check-error", "npm:1.0.3"]\ ],\ "packagePeers": [\ "@types/chai",\ @@ -7616,7 +7326,7 @@ const RAW_RUNTIME_STATE = ["path-case", "npm:3.0.4"],\ ["sentence-case", "npm:3.0.4"],\ ["snake-case", "npm:3.0.4"],\ - ["tslib", "npm:2.4.1"]\ + ["tslib", "npm:2.6.2"]\ ],\ "linkType": "HARD"\ }]\ @@ -7631,13 +7341,6 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["check-error", [\ - ["npm:1.0.2", {\ - "packageLocation": "./.yarn/cache/check-error-npm-1.0.2-00c540c6e9-011e74b2ea.zip/node_modules/check-error/",\ - "packageDependencies": [\ - ["check-error", "npm:1.0.2"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:1.0.3", {\ "packageLocation": "./.yarn/cache/check-error-npm-1.0.3-137994eabc-e2131025cf.zip/node_modules/check-error/",\ "packageDependencies": [\ @@ -7989,13 +7692,6 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["colorette", [\ - ["npm:2.0.19", {\ - "packageLocation": "./.yarn/cache/colorette-npm-2.0.19-f73dfe6a4e-6e2606435c.zip/node_modules/colorette/",\ - "packageDependencies": [\ - ["colorette", "npm:2.0.19"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:2.0.20", {\ "packageLocation": "./.yarn/cache/colorette-npm-2.0.20-692d428726-0b8de48bfa.zip/node_modules/colorette/",\ "packageDependencies": [\ @@ -8187,7 +7883,7 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["constant-case", "npm:3.0.4"],\ ["no-case", "npm:3.0.4"],\ - ["tslib", "npm:2.4.1"],\ + ["tslib", "npm:2.6.2"],\ ["upper-case", "npm:2.0.2"]\ ],\ "linkType": "HARD"\ @@ -8684,7 +8380,7 @@ const RAW_RUNTIME_STATE = ["ts-loader", "virtual:ad53cff31b1dbd4927a99e71702e3b8b10338636eaff010987c27c9ccea2d52af36900a9e36a4231cbb6e5464248ccc9c1da5d1d24d9b0f4f95660296b1060a6#npm:9.5.0"],\ ["ts-mocha", "virtual:ad53cff31b1dbd4927a99e71702e3b8b10338636eaff010987c27c9ccea2d52af36900a9e36a4231cbb6e5464248ccc9c1da5d1d24d9b0f4f95660296b1060a6#npm:10.0.0"],\ ["ts-mock-imports", "virtual:ad53cff31b1dbd4927a99e71702e3b8b10338636eaff010987c27c9ccea2d52af36900a9e36a4231cbb6e5464248ccc9c1da5d1d24d9b0f4f95660296b1060a6#npm:1.3.8"],\ - ["ts-node", "virtual:ad53cff31b1dbd4927a99e71702e3b8b10338636eaff010987c27c9ccea2d52af36900a9e36a4231cbb6e5464248ccc9c1da5d1d24d9b0f4f95660296b1060a6#npm:10.4.0"],\ + ["ts-node", "virtual:ad53cff31b1dbd4927a99e71702e3b8b10338636eaff010987c27c9ccea2d52af36900a9e36a4231cbb6e5464248ccc9c1da5d1d24d9b0f4f95660296b1060a6#npm:10.9.1"],\ ["tsd", "npm:0.28.1"],\ ["typescript", "patch:typescript@npm%3A3.9.10#optional!builtin::version=3.9.10&hash=3bd3d3"],\ ["url", "npm:0.11.3"],\ @@ -8716,8 +8412,8 @@ const RAW_RUNTIME_STATE = ["@dashevo/withdrawals-contract", "workspace:packages/withdrawals-contract"],\ ["@oclif/core", "npm:3.10.8"],\ ["@oclif/plugin-help", "npm:6.0.5"],\ - ["ajv", "npm:8.8.1"],\ - ["ajv-formats", "virtual:880cda903c2a2be387819a3f857d21494004437a03c92969b9853f7bdeebdfed08d417e68364ee9e158338603a6d78d690c457a55ab11e56398bc10f0ad232fc#npm:2.1.1"],\ + ["ajv", "npm:8.12.0"],\ + ["ajv-formats", "virtual:e822c5b02ef2b3c5fb9c8d88d5e0ca208365bff76f80510f4ccf9b1de44e2078264bcb00d3cdd5e193c256e9ab81e27c34fcfb1ad3a0e8c1dc8fa0066c78c468#npm:2.1.1"],\ ["awilix", "npm:4.3.4"],\ ["begoo", "npm:2.0.2"],\ ["chai", "npm:4.3.10"],\ @@ -8732,7 +8428,7 @@ const RAW_RUNTIME_STATE = ["eslint", "npm:8.53.0"],\ ["eslint-config-airbnb-base", "virtual:e2d057e7cc143d3cb9bec864f4a2d862441b5a09f81f8e6c46e7a098cbc89e4d07017cc6e2e2142d5704bb55da853cbec2d025ebc0b30e8696c31380c00f2c7d#npm:15.0.0"],\ ["eslint-plugin-import", "virtual:e2d057e7cc143d3cb9bec864f4a2d862441b5a09f81f8e6c46e7a098cbc89e4d07017cc6e2e2142d5704bb55da853cbec2d025ebc0b30e8696c31380c00f2c7d#npm:2.29.0"],\ - ["glob", "npm:10.3.4"],\ + ["glob", "npm:10.3.10"],\ ["globby", "npm:11.1.0"],\ ["hasbin", "npm:1.2.3"],\ ["is-wsl", "npm:2.2.0"],\ @@ -9035,15 +8731,6 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["define-properties", [\ - ["npm:1.2.0", {\ - "packageLocation": "./.yarn/cache/define-properties-npm-1.2.0-3547cd0fd2-e60aee6a19.zip/node_modules/define-properties/",\ - "packageDependencies": [\ - ["define-properties", "npm:1.2.0"],\ - ["has-property-descriptors", "npm:1.0.0"],\ - ["object-keys", "npm:1.1.1"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:1.2.1", {\ "packageLocation": "./.yarn/cache/define-properties-npm-1.2.1-8a4d42413b-b4ccd00597.zip/node_modules/define-properties/",\ "packageDependencies": [\ @@ -9260,7 +8947,7 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["docker-modem", "npm:3.0.8"],\ ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ - ["readable-stream", "npm:3.6.0"],\ + ["readable-stream", "npm:3.6.2"],\ ["split-ca", "npm:1.0.1"],\ ["ssh2", "npm:1.11.0"]\ ],\ @@ -9325,7 +9012,7 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["dot-case", "npm:3.0.4"],\ ["no-case", "npm:3.0.4"],\ - ["tslib", "npm:2.4.1"]\ + ["tslib", "npm:2.6.2"]\ ],\ "linkType": "HARD"\ }]\ @@ -9397,15 +9084,8 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["electron-to-chromium", [\ - ["npm:1.3.903", {\ - "packageLocation": "./.yarn/cache/electron-to-chromium-npm-1.3.903-3e6dfabc20-12a0c5ba72.zip/node_modules/electron-to-chromium/",\ - "packageDependencies": [\ - ["electron-to-chromium", "npm:1.3.903"]\ - ],\ - "linkType": "HARD"\ - }],\ - ["npm:1.4.581", {\ - "packageLocation": "./.yarn/cache/electron-to-chromium-npm-1.4.581-a32b5f3c64-a40ea2863c.zip/node_modules/electron-to-chromium/",\ + ["npm:1.4.581", {\ + "packageLocation": "./.yarn/cache/electron-to-chromium-npm-1.4.581-a32b5f3c64-a40ea2863c.zip/node_modules/electron-to-chromium/",\ "packageDependencies": [\ ["electron-to-chromium", "npm:1.4.581"]\ ],\ @@ -9489,7 +9169,7 @@ const RAW_RUNTIME_STATE = ["engine.io", "npm:6.4.2"],\ ["@types/cookie", "npm:0.4.1"],\ ["@types/cors", "npm:2.8.12"],\ - ["@types/node", "npm:17.0.21"],\ + ["@types/node", "npm:18.16.1"],\ ["accepts", "npm:1.3.7"],\ ["base64id", "npm:2.0.0"],\ ["cookie", "npm:0.4.1"],\ @@ -9511,15 +9191,6 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["enhanced-resolve", [\ - ["npm:5.12.0", {\ - "packageLocation": "./.yarn/cache/enhanced-resolve-npm-5.12.0-c291ce4ee3-ea5b49a064.zip/node_modules/enhanced-resolve/",\ - "packageDependencies": [\ - ["enhanced-resolve", "npm:5.12.0"],\ - ["graceful-fs", "npm:4.2.10"],\ - ["tapable", "npm:2.2.1"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:5.15.0", {\ "packageLocation": "./.yarn/cache/enhanced-resolve-npm-5.15.0-16eb7ddef9-180c3f2706.zip/node_modules/enhanced-resolve/",\ "packageDependencies": [\ @@ -9606,47 +9277,6 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["es-abstract", [\ - ["npm:1.21.2", {\ - "packageLocation": "./.yarn/cache/es-abstract-npm-1.21.2-f4ebace1ab-2e1d6922c9.zip/node_modules/es-abstract/",\ - "packageDependencies": [\ - ["es-abstract", "npm:1.21.2"],\ - ["array-buffer-byte-length", "npm:1.0.0"],\ - ["available-typed-arrays", "npm:1.0.5"],\ - ["call-bind", "npm:1.0.2"],\ - ["es-set-tostringtag", "npm:2.0.1"],\ - ["es-to-primitive", "npm:1.2.1"],\ - ["function.prototype.name", "npm:1.1.5"],\ - ["get-intrinsic", "npm:1.2.0"],\ - ["get-symbol-description", "npm:1.0.0"],\ - ["globalthis", "npm:1.0.3"],\ - ["gopd", "npm:1.0.1"],\ - ["has", "npm:1.0.3"],\ - ["has-property-descriptors", "npm:1.0.0"],\ - ["has-proto", "npm:1.0.1"],\ - ["has-symbols", "npm:1.0.3"],\ - ["internal-slot", "npm:1.0.5"],\ - ["is-array-buffer", "npm:3.0.2"],\ - ["is-callable", "npm:1.2.7"],\ - ["is-negative-zero", "npm:2.0.2"],\ - ["is-regex", "npm:1.1.4"],\ - ["is-shared-array-buffer", "npm:1.0.2"],\ - ["is-string", "npm:1.0.7"],\ - ["is-typed-array", "npm:1.1.10"],\ - ["is-weakref", "npm:1.0.2"],\ - ["object-inspect", "npm:1.12.3"],\ - ["object-keys", "npm:1.1.1"],\ - ["object.assign", "npm:4.1.4"],\ - ["regexp.prototype.flags", "npm:1.4.3"],\ - ["safe-regex-test", "npm:1.0.0"],\ - ["string.prototype.trim", "npm:1.2.7"],\ - ["string.prototype.trimend", "npm:1.0.6"],\ - ["string.prototype.trimstart", "npm:1.0.6"],\ - ["typed-array-length", "npm:1.0.4"],\ - ["unbox-primitive", "npm:1.0.2"],\ - ["which-typed-array", "npm:1.1.9"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:1.22.3", {\ "packageLocation": "./.yarn/cache/es-abstract-npm-1.22.3-15a58832e5-e1ea9738ec.zip/node_modules/es-abstract/",\ "packageDependencies": [\ @@ -9708,7 +9338,7 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/es-set-tostringtag-npm-2.0.1-c87b5de872-ec416a1294.zip/node_modules/es-set-tostringtag/",\ "packageDependencies": [\ ["es-set-tostringtag", "npm:2.0.1"],\ - ["get-intrinsic", "npm:1.2.0"],\ + ["get-intrinsic", "npm:1.2.2"],\ ["has", "npm:1.0.3"],\ ["has-tostringtag", "npm:1.0.0"]\ ],\ @@ -9843,7 +9473,7 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/eslint-npm-8.53.0-2fc5c501d2-e305a71ce2.zip/node_modules/eslint/",\ "packageDependencies": [\ ["eslint", "npm:8.53.0"],\ - ["@eslint-community/eslint-utils", "virtual:2fc5c501d26c4c2fbc6a1d931e87d32adb7d9118fbcd7303a7b7faae809112bde136383859a265761a47c2852a001b7b803bf80e734ffa8ddc2ca30c129d1d76#npm:4.2.0"],\ + ["@eslint-community/eslint-utils", "virtual:2fc5c501d26c4c2fbc6a1d931e87d32adb7d9118fbcd7303a7b7faae809112bde136383859a265761a47c2852a001b7b803bf80e734ffa8ddc2ca30c129d1d76#npm:4.4.0"],\ ["@eslint-community/regexpp", "npm:4.10.0"],\ ["@eslint/eslintrc", "npm:2.1.3"],\ ["@eslint/js", "npm:8.53.0"],\ @@ -10262,13 +9892,6 @@ const RAW_RUNTIME_STATE = ],\ "linkType": "HARD"\ }],\ - ["npm:3.3.0", {\ - "packageLocation": "./.yarn/cache/eslint-visitor-keys-npm-3.3.0-d329af7c8c-37a1a5912a.zip/node_modules/eslint-visitor-keys/",\ - "packageDependencies": [\ - ["eslint-visitor-keys", "npm:3.3.0"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:3.4.3", {\ "packageLocation": "./.yarn/cache/eslint-visitor-keys-npm-3.4.3-a356ac7e46-3f357c554a.zip/node_modules/eslint-visitor-keys/",\ "packageDependencies": [\ @@ -10278,16 +9901,6 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["espree", [\ - ["npm:9.1.0", {\ - "packageLocation": "./.yarn/cache/espree-npm-9.1.0-fd22538590-8ade225f24.zip/node_modules/espree/",\ - "packageDependencies": [\ - ["espree", "npm:9.1.0"],\ - ["acorn", "npm:8.8.2"],\ - ["acorn-jsx", "virtual:fd2253859039a15030fecf2d1545fcad47d7bd43468b9166c71fdd4e35b538414e653775f5401c948ed8db3eb1925f84c66c161d39a27b19ee73fef5e721329e#npm:5.3.2"],\ - ["eslint-visitor-keys", "npm:3.3.0"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:9.6.1", {\ "packageLocation": "./.yarn/cache/espree-npm-9.6.1-a50722a5a9-255ab260f0.zip/node_modules/espree/",\ "packageDependencies": [\ @@ -10475,18 +10088,6 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["fast-glob", [\ - ["npm:3.2.11", {\ - "packageLocation": "./.yarn/cache/fast-glob-npm-3.2.11-bc01135fef-6b736d92a4.zip/node_modules/fast-glob/",\ - "packageDependencies": [\ - ["fast-glob", "npm:3.2.11"],\ - ["@nodelib/fs.stat", "npm:2.0.5"],\ - ["@nodelib/fs.walk", "npm:1.2.8"],\ - ["glob-parent", "npm:5.1.2"],\ - ["merge2", "npm:1.4.1"],\ - ["micromatch", "npm:4.0.4"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:3.2.12", {\ "packageLocation": "./.yarn/cache/fast-glob-npm-3.2.12-162763bbae-641e748664.zip/node_modules/fast-glob/",\ "packageDependencies": [\ @@ -10929,13 +10530,6 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["function-bind", [\ - ["npm:1.1.1", {\ - "packageLocation": "./.yarn/cache/function-bind-npm-1.1.1-b56b322ae9-d83f296803.zip/node_modules/function-bind/",\ - "packageDependencies": [\ - ["function-bind", "npm:1.1.1"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:1.1.2", {\ "packageLocation": "./.yarn/cache/function-bind-npm-1.1.2-7a55be9b03-185e20d20f.zip/node_modules/function-bind/",\ "packageDependencies": [\ @@ -10945,22 +10539,11 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["function.prototype.name", [\ - ["npm:1.1.5", {\ - "packageLocation": "./.yarn/cache/function.prototype.name-npm-1.1.5-e776a642bb-5d426e5a38.zip/node_modules/function.prototype.name/",\ - "packageDependencies": [\ - ["function.prototype.name", "npm:1.1.5"],\ - ["call-bind", "npm:1.0.2"],\ - ["define-properties", "npm:1.2.0"],\ - ["es-abstract", "npm:1.21.2"],\ - ["functions-have-names", "npm:1.2.3"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:1.1.6", {\ "packageLocation": "./.yarn/cache/function.prototype.name-npm-1.1.6-fd3a6a5cdd-4d40be44d4.zip/node_modules/function.prototype.name/",\ "packageDependencies": [\ ["function.prototype.name", "npm:1.1.6"],\ - ["call-bind", "npm:1.0.2"],\ + ["call-bind", "npm:1.0.5"],\ ["define-properties", "npm:1.2.1"],\ ["es-abstract", "npm:1.22.3"],\ ["functions-have-names", "npm:1.2.3"]\ @@ -11032,16 +10615,6 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["get-intrinsic", [\ - ["npm:1.2.0", {\ - "packageLocation": "./.yarn/cache/get-intrinsic-npm-1.2.0-eb08ea9b1d-f57c5fe67a.zip/node_modules/get-intrinsic/",\ - "packageDependencies": [\ - ["get-intrinsic", "npm:1.2.0"],\ - ["function-bind", "npm:1.1.1"],\ - ["has", "npm:1.0.3"],\ - ["has-symbols", "npm:1.0.3"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:1.2.2", {\ "packageLocation": "./.yarn/cache/get-intrinsic-npm-1.2.2-3f446d8847-aa96db4f80.zip/node_modules/get-intrinsic/",\ "packageDependencies": [\ @@ -11107,8 +10680,8 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/get-symbol-description-npm-1.0.0-9c95a4bc1f-7e5f298afe.zip/node_modules/get-symbol-description/",\ "packageDependencies": [\ ["get-symbol-description", "npm:1.0.0"],\ - ["call-bind", "npm:1.0.2"],\ - ["get-intrinsic", "npm:1.2.0"]\ + ["call-bind", "npm:1.0.5"],\ + ["get-intrinsic", "npm:1.2.2"]\ ],\ "linkType": "HARD"\ }]\ @@ -11186,19 +10759,7 @@ const RAW_RUNTIME_STATE = ["foreground-child", "npm:3.1.1"],\ ["jackspeak", "npm:2.3.6"],\ ["minimatch", "npm:9.0.3"],\ - ["minipass", "npm:7.0.3"],\ - ["path-scurry", "npm:1.10.1"]\ - ],\ - "linkType": "HARD"\ - }],\ - ["npm:10.3.4", {\ - "packageLocation": "./.yarn/cache/glob-npm-10.3.4-f58cd31f55-6375721bcd.zip/node_modules/glob/",\ - "packageDependencies": [\ - ["glob", "npm:10.3.4"],\ - ["foreground-child", "npm:3.1.1"],\ - ["jackspeak", "npm:2.3.3"],\ - ["minimatch", "npm:9.0.3"],\ - ["minipass", "npm:7.0.3"],\ + ["minipass", "npm:7.0.4"],\ ["path-scurry", "npm:1.10.1"]\ ],\ "linkType": "HARD"\ @@ -11291,7 +10852,7 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/globalthis-npm-1.0.3-96cd56020d-45ae2f3b40.zip/node_modules/globalthis/",\ "packageDependencies": [\ ["globalthis", "npm:1.0.3"],\ - ["define-properties", "npm:1.2.0"]\ + ["define-properties", "npm:1.2.1"]\ ],\ "linkType": "HARD"\ }]\ @@ -11303,7 +10864,7 @@ const RAW_RUNTIME_STATE = ["globby", "npm:11.1.0"],\ ["array-union", "npm:2.1.0"],\ ["dir-glob", "npm:3.0.1"],\ - ["fast-glob", "npm:3.2.11"],\ + ["fast-glob", "npm:3.2.12"],\ ["ignore", "npm:5.2.0"],\ ["merge2", "npm:1.4.1"],\ ["slash", "npm:3.0.0"]\ @@ -11334,7 +10895,7 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/gopd-npm-1.0.1-10c1d0b534-5fbc7ad57b.zip/node_modules/gopd/",\ "packageDependencies": [\ ["gopd", "npm:1.0.1"],\ - ["get-intrinsic", "npm:1.2.0"]\ + ["get-intrinsic", "npm:1.2.2"]\ ],\ "linkType": "HARD"\ }]\ @@ -11450,7 +11011,7 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/has-npm-1.0.3-b7f00631c1-a449f3185b.zip/node_modules/has/",\ "packageDependencies": [\ ["has", "npm:1.0.3"],\ - ["function-bind", "npm:1.1.1"]\ + ["function-bind", "npm:1.1.2"]\ ],\ "linkType": "HARD"\ }]\ @@ -11485,7 +11046,7 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/has-property-descriptors-npm-1.0.0-56289b918d-a6d3f0a266.zip/node_modules/has-property-descriptors/",\ "packageDependencies": [\ ["has-property-descriptors", "npm:1.0.0"],\ - ["get-intrinsic", "npm:1.2.0"]\ + ["get-intrinsic", "npm:1.2.2"]\ ],\ "linkType": "HARD"\ }]\ @@ -11543,7 +11104,7 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["hash-base", "npm:3.1.0"],\ ["inherits", "npm:2.0.4"],\ - ["readable-stream", "npm:3.6.0"],\ + ["readable-stream", "npm:3.6.2"],\ ["safe-buffer", "npm:5.2.1"]\ ],\ "linkType": "HARD"\ @@ -11596,7 +11157,7 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["header-case", "npm:2.0.4"],\ ["capital-case", "npm:1.0.4"],\ - ["tslib", "npm:2.4.1"]\ + ["tslib", "npm:2.6.2"]\ ],\ "linkType": "HARD"\ }]\ @@ -11607,7 +11168,7 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["help-me", "npm:4.2.0"],\ ["glob", "npm:8.1.0"],\ - ["readable-stream", "npm:3.6.0"]\ + ["readable-stream", "npm:3.6.2"]\ ],\ "linkType": "HARD"\ }]\ @@ -12013,7 +11574,7 @@ const RAW_RUNTIME_STATE = ["mute-stream", "npm:0.0.8"],\ ["ora", "npm:5.4.1"],\ ["run-async", "npm:2.4.1"],\ - ["rxjs", "npm:7.8.0"],\ + ["rxjs", "npm:7.8.1"],\ ["string-width", "npm:4.2.3"],\ ["strip-ansi", "npm:6.0.1"],\ ["through", "npm:2.3.8"]\ @@ -12026,7 +11587,7 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/internal-slot-npm-1.0.5-a2241f3e66-e2eb5b348e.zip/node_modules/internal-slot/",\ "packageDependencies": [\ ["internal-slot", "npm:1.0.5"],\ - ["get-intrinsic", "npm:1.2.0"],\ + ["get-intrinsic", "npm:1.2.2"],\ ["has", "npm:1.0.3"],\ ["side-channel", "npm:1.0.4"]\ ],\ @@ -12049,18 +11610,13 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ - ["ip", [\ - ["npm:1.1.5", {\ - "packageLocation": "./.yarn/cache/ip-npm-1.1.5-af36318aa6-40a00572cf.zip/node_modules/ip/",\ - "packageDependencies": [\ - ["ip", "npm:1.1.5"]\ - ],\ - "linkType": "HARD"\ - }],\ - ["npm:2.0.0", {\ - "packageLocation": "./.yarn/cache/ip-npm-2.0.0-204facb3cc-1270b11e53.zip/node_modules/ip/",\ + ["ip-address", [\ + ["npm:9.0.5", {\ + "packageLocation": "./.yarn/cache/ip-address-npm-9.0.5-9fa024d42a-1ed81e0672.zip/node_modules/ip-address/",\ "packageDependencies": [\ - ["ip", "npm:2.0.0"]\ + ["ip-address", "npm:9.0.5"],\ + ["jsbn", "npm:1.1.0"],\ + ["sprintf-js", "npm:1.1.3"]\ ],\ "linkType": "HARD"\ }]\ @@ -12088,7 +11644,7 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/is-arguments-npm-1.1.1-eff4f6d4d7-a170c7e260.zip/node_modules/is-arguments/",\ "packageDependencies": [\ ["is-arguments", "npm:1.1.1"],\ - ["call-bind", "npm:1.0.2"],\ + ["call-bind", "npm:1.0.5"],\ ["has-tostringtag", "npm:1.0.0"]\ ],\ "linkType": "HARD"\ @@ -12099,9 +11655,9 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/is-array-buffer-npm-3.0.2-0dec897785-dcac9dda66.zip/node_modules/is-array-buffer/",\ "packageDependencies": [\ ["is-array-buffer", "npm:3.0.2"],\ - ["call-bind", "npm:1.0.2"],\ - ["get-intrinsic", "npm:1.2.0"],\ - ["is-typed-array", "npm:1.1.10"]\ + ["call-bind", "npm:1.0.5"],\ + ["get-intrinsic", "npm:1.2.2"],\ + ["is-typed-array", "npm:1.1.12"]\ ],\ "linkType": "HARD"\ }]\ @@ -12147,7 +11703,7 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/is-boolean-object-npm-1.1.2-ecbd575e6a-ba794223b5.zip/node_modules/is-boolean-object/",\ "packageDependencies": [\ ["is-boolean-object", "npm:1.1.2"],\ - ["call-bind", "npm:1.0.2"],\ + ["call-bind", "npm:1.0.5"],\ ["has-tostringtag", "npm:1.0.0"]\ ],\ "linkType": "HARD"\ @@ -12180,14 +11736,6 @@ const RAW_RUNTIME_STATE = ["hasown", "npm:2.0.0"]\ ],\ "linkType": "HARD"\ - }],\ - ["npm:2.8.1", {\ - "packageLocation": "./.yarn/cache/is-core-module-npm-2.8.1-ce21740d1b-80b33fbd45.zip/node_modules/is-core-module/",\ - "packageDependencies": [\ - ["is-core-module", "npm:2.8.1"],\ - ["has", "npm:1.0.3"]\ - ],\ - "linkType": "HARD"\ }]\ ]],\ ["is-date-object", [\ @@ -12280,8 +11828,8 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/is-nan-npm-1.3.2-a087d31a28-1f784d3472.zip/node_modules/is-nan/",\ "packageDependencies": [\ ["is-nan", "npm:1.3.2"],\ - ["call-bind", "npm:1.0.2"],\ - ["define-properties", "npm:1.2.0"]\ + ["call-bind", "npm:1.0.5"],\ + ["define-properties", "npm:1.2.1"]\ ],\ "linkType": "HARD"\ }]\ @@ -12370,7 +11918,7 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/is-regex-npm-1.1.4-cca193ef11-36d9174d16.zip/node_modules/is-regex/",\ "packageDependencies": [\ ["is-regex", "npm:1.1.4"],\ - ["call-bind", "npm:1.0.2"],\ + ["call-bind", "npm:1.0.5"],\ ["has-tostringtag", "npm:1.0.0"]\ ],\ "linkType": "HARD"\ @@ -12400,7 +11948,7 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/is-shared-array-buffer-npm-1.0.2-32e4181fcd-23d82259d6.zip/node_modules/is-shared-array-buffer/",\ "packageDependencies": [\ ["is-shared-array-buffer", "npm:1.0.2"],\ - ["call-bind", "npm:1.0.2"]\ + ["call-bind", "npm:1.0.5"]\ ],\ "linkType": "HARD"\ }]\ @@ -12445,18 +11993,6 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["is-typed-array", [\ - ["npm:1.1.10", {\ - "packageLocation": "./.yarn/cache/is-typed-array-npm-1.1.10-fe4ef83cdc-2392b2473b.zip/node_modules/is-typed-array/",\ - "packageDependencies": [\ - ["is-typed-array", "npm:1.1.10"],\ - ["available-typed-arrays", "npm:1.0.5"],\ - ["call-bind", "npm:1.0.2"],\ - ["for-each", "npm:0.3.3"],\ - ["gopd", "npm:1.0.1"],\ - ["has-tostringtag", "npm:1.0.0"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:1.1.12", {\ "packageLocation": "./.yarn/cache/is-typed-array-npm-1.1.12-6135c91b1a-d953adfd3c.zip/node_modules/is-typed-array/",\ "packageDependencies": [\ @@ -12498,7 +12034,7 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/is-weakref-npm-1.0.2-ff80e8c314-0023fd0e4b.zip/node_modules/is-weakref/",\ "packageDependencies": [\ ["is-weakref", "npm:1.0.2"],\ - ["call-bind", "npm:1.0.2"]\ + ["call-bind", "npm:1.0.5"]\ ],\ "linkType": "HARD"\ }]\ @@ -12609,13 +12145,6 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["istanbul-lib-coverage", [\ - ["npm:3.2.0", {\ - "packageLocation": "./.yarn/cache/istanbul-lib-coverage-npm-3.2.0-93f84b2c8c-31621b84ad.zip/node_modules/istanbul-lib-coverage/",\ - "packageDependencies": [\ - ["istanbul-lib-coverage", "npm:3.2.0"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:3.2.2", {\ "packageLocation": "./.yarn/cache/istanbul-lib-coverage-npm-3.2.2-5c0526e059-40bbdd1e93.zip/node_modules/istanbul-lib-coverage/",\ "packageDependencies": [\ @@ -12641,7 +12170,7 @@ const RAW_RUNTIME_STATE = ["istanbul-lib-instrument", "npm:4.0.3"],\ ["@babel/core", "npm:7.23.3"],\ ["@istanbuljs/schema", "npm:0.1.3"],\ - ["istanbul-lib-coverage", "npm:3.2.0"],\ + ["istanbul-lib-coverage", "npm:3.2.2"],\ ["semver", "npm:7.5.3"]\ ],\ "linkType": "HARD"\ @@ -12667,7 +12196,7 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/istanbul-lib-report-npm-3.0.0-660f97340a-06b37952e9.zip/node_modules/istanbul-lib-report/",\ "packageDependencies": [\ ["istanbul-lib-report", "npm:3.0.0"],\ - ["istanbul-lib-coverage", "npm:3.2.0"],\ + ["istanbul-lib-coverage", "npm:3.2.2"],\ ["make-dir", "npm:3.1.0"],\ ["supports-color", "npm:7.2.0"]\ ],\ @@ -12680,7 +12209,7 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["istanbul-lib-source-maps", "npm:4.0.1"],\ ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ - ["istanbul-lib-coverage", "npm:3.2.0"],\ + ["istanbul-lib-coverage", "npm:3.2.2"],\ ["source-map", "npm:0.6.1"]\ ],\ "linkType": "HARD"\ @@ -12698,15 +12227,6 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["jackspeak", [\ - ["npm:2.3.3", {\ - "packageLocation": "./.yarn/cache/jackspeak-npm-2.3.3-755684cc60-a4c7c1a3ff.zip/node_modules/jackspeak/",\ - "packageDependencies": [\ - ["jackspeak", "npm:2.3.3"],\ - ["@isaacs/cliui", "npm:8.0.2"],\ - ["@pkgjs/parseargs", "npm:0.11.0"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:2.3.6", {\ "packageLocation": "./.yarn/cache/jackspeak-npm-2.3.6-42e1233172-6e6490d676.zip/node_modules/jackspeak/",\ "packageDependencies": [\ @@ -12802,7 +12322,7 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/jest-worker-npm-27.5.1-1c110b5894-06c6e2a845.zip/node_modules/jest-worker/",\ "packageDependencies": [\ ["jest-worker", "npm:27.5.1"],\ - ["@types/node", "npm:17.0.21"],\ + ["@types/node", "npm:18.16.1"],\ ["merge-stream", "npm:2.0.0"],\ ["supports-color", "npm:8.1.1"]\ ],\ @@ -12873,6 +12393,15 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["jsbn", [\ + ["npm:1.1.0", {\ + "packageLocation": "./.yarn/cache/jsbn-npm-1.1.0-1da0181838-bebe7ae829.zip/node_modules/jsbn/",\ + "packageDependencies": [\ + ["jsbn", "npm:1.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["jsdoc-type-pratt-parser", [\ ["npm:4.0.0", {\ "packageLocation": "./.yarn/cache/jsdoc-type-pratt-parser-npm-4.0.0-7b035921c4-a225ab874e.zip/node_modules/jsdoc-type-pratt-parser/",\ @@ -13009,14 +12538,6 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["json5", [\ - ["npm:2.2.0", {\ - "packageLocation": "./.yarn/cache/json5-npm-2.2.0-da49dc7cb5-d72ea87423.zip/node_modules/json5/",\ - "packageDependencies": [\ - ["json5", "npm:2.2.0"],\ - ["minimist", "npm:1.2.6"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:2.2.3", {\ "packageLocation": "./.yarn/cache/json5-npm-2.2.3-9962c55073-1db67b853f.zip/node_modules/json5/",\ "packageDependencies": [\ @@ -13356,7 +12877,7 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["level-iterator-stream", "npm:4.0.2"],\ ["inherits", "npm:2.0.4"],\ - ["readable-stream", "npm:3.6.0"],\ + ["readable-stream", "npm:3.6.2"],\ ["xtend", "npm:4.0.2"]\ ],\ "linkType": "HARD"\ @@ -13439,7 +12960,7 @@ const RAW_RUNTIME_STATE = ["listr2", "virtual:880cda903c2a2be387819a3f857d21494004437a03c92969b9853f7bdeebdfed08d417e68364ee9e158338603a6d78d690c457a55ab11e56398bc10f0ad232fc#npm:5.0.7"],\ ["@types/enquirer", null],\ ["cli-truncate", "npm:2.1.0"],\ - ["colorette", "npm:2.0.19"],\ + ["colorette", "npm:2.0.20"],\ ["enquirer", "https://github.com/dashpay/enquirer.git#commit=86aaef0b1c82dfaa3436775e6b37de310eeb94f5"],\ ["log-update", "npm:4.0.0"],\ ["p-map", "npm:4.0.0"],\ @@ -13746,7 +13267,7 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/lower-case-npm-2.0.2-151055f1c2-83a0a5f159.zip/node_modules/lower-case/",\ "packageDependencies": [\ ["lower-case", "npm:2.0.2"],\ - ["tslib", "npm:2.4.1"]\ + ["tslib", "npm:2.6.2"]\ ],\ "linkType": "HARD"\ }]\ @@ -13768,13 +13289,6 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["lru-cache", [\ - ["npm:10.0.1", {\ - "packageLocation": "./.yarn/cache/lru-cache-npm-10.0.1-0e1abf4c13-5bb91a97a3.zip/node_modules/lru-cache/",\ - "packageDependencies": [\ - ["lru-cache", "npm:10.0.1"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:10.0.2", {\ "packageLocation": "./.yarn/cache/lru-cache-npm-10.0.2-fcff47e16f-a675b71a19.zip/node_modules/lru-cache/",\ "packageDependencies": [\ @@ -13805,13 +13319,6 @@ const RAW_RUNTIME_STATE = ["lru-cache", "npm:7.18.3"]\ ],\ "linkType": "HARD"\ - }],\ - ["npm:7.3.1", {\ - "packageLocation": "./.yarn/cache/lru-cache-npm-7.3.1-b157dca680-83adf549d8.zip/node_modules/lru-cache/",\ - "packageDependencies": [\ - ["lru-cache", "npm:7.3.1"]\ - ],\ - "linkType": "HARD"\ }]\ ]],\ ["ltgt", [\ @@ -13865,13 +13372,13 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/make-fetch-happen-npm-10.0.3-e552879254-a9afbe3902.zip/node_modules/make-fetch-happen/",\ "packageDependencies": [\ ["make-fetch-happen", "npm:10.0.3"],\ - ["agentkeepalive", "npm:4.2.0"],\ + ["agentkeepalive", "npm:4.3.0"],\ ["cacache", "npm:18.0.0"],\ ["http-cache-semantics", "npm:4.1.1"],\ ["http-proxy-agent", "npm:5.0.0"],\ ["https-proxy-agent", "npm:5.0.0"],\ ["is-lambda", "npm:1.0.1"],\ - ["lru-cache", "npm:7.3.1"],\ + ["lru-cache", "npm:7.18.3"],\ ["minipass", "npm:3.1.6"],\ ["minipass-collect", "npm:1.0.2"],\ ["minipass-fetch", "npm:1.4.1"],\ @@ -13994,13 +13501,6 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["mem-fs-editor", [\ - ["npm:9.4.0", {\ - "packageLocation": "./.yarn/cache/mem-fs-editor-npm-9.4.0-97c608fb01-b196c50010.zip/node_modules/mem-fs-editor/",\ - "packageDependencies": [\ - ["mem-fs-editor", "npm:9.4.0"]\ - ],\ - "linkType": "SOFT"\ - }],\ ["npm:9.7.0", {\ "packageLocation": "./.yarn/cache/mem-fs-editor-npm-9.7.0-d55ddaa593-656275560f.zip/node_modules/mem-fs-editor/",\ "packageDependencies": [\ @@ -14008,19 +13508,19 @@ const RAW_RUNTIME_STATE = ],\ "linkType": "SOFT"\ }],\ - ["virtual:2acb7f847f03bc2bd90f7df00604776d7c66477738a3b8df4954a29601a0fdca4ccd942111de77aa272590d0b875d8add6606fc244946461a413979c573cc813#npm:9.4.0", {\ - "packageLocation": "./.yarn/__virtual__/mem-fs-editor-virtual-b8ccd1d842/0/cache/mem-fs-editor-npm-9.4.0-97c608fb01-b196c50010.zip/node_modules/mem-fs-editor/",\ + ["virtual:2acb7f847f03bc2bd90f7df00604776d7c66477738a3b8df4954a29601a0fdca4ccd942111de77aa272590d0b875d8add6606fc244946461a413979c573cc813#npm:9.7.0", {\ + "packageLocation": "./.yarn/__virtual__/mem-fs-editor-virtual-c18f617f6d/0/cache/mem-fs-editor-npm-9.7.0-d55ddaa593-656275560f.zip/node_modules/mem-fs-editor/",\ "packageDependencies": [\ - ["mem-fs-editor", "virtual:2acb7f847f03bc2bd90f7df00604776d7c66477738a3b8df4954a29601a0fdca4ccd942111de77aa272590d0b875d8add6606fc244946461a413979c573cc813#npm:9.4.0"],\ + ["mem-fs-editor", "virtual:2acb7f847f03bc2bd90f7df00604776d7c66477738a3b8df4954a29601a0fdca4ccd942111de77aa272590d0b875d8add6606fc244946461a413979c573cc813#npm:9.7.0"],\ ["@types/mem-fs", null],\ ["binaryextensions", "npm:4.18.0"],\ ["commondir", "npm:1.0.1"],\ ["deep-extend", "npm:0.6.0"],\ ["ejs", "npm:3.1.8"],\ ["globby", "npm:11.1.0"],\ - ["isbinaryfile", "npm:4.0.10"],\ + ["isbinaryfile", "npm:5.0.0"],\ ["mem-fs", "npm:2.2.1"],\ - ["minimatch", "npm:3.1.2"],\ + ["minimatch", "npm:7.4.6"],\ ["multimatch", "npm:5.0.0"],\ ["normalize-path", "npm:3.0.0"],\ ["textextensions", "npm:5.14.0"]\ @@ -14281,14 +13781,6 @@ const RAW_RUNTIME_STATE = ],\ "linkType": "HARD"\ }],\ - ["npm:5.0.0", {\ - "packageLocation": "./.yarn/cache/minimatch-npm-5.0.0-969101c1d1-ee05bf8c18.zip/node_modules/minimatch/",\ - "packageDependencies": [\ - ["minimatch", "npm:5.0.0"],\ - ["brace-expansion", "npm:2.0.1"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:5.0.1", {\ "packageLocation": "./.yarn/cache/minimatch-npm-5.0.1-612724f6f0-2656580f18.zip/node_modules/minimatch/",\ "packageDependencies": [\ @@ -14366,13 +13858,6 @@ const RAW_RUNTIME_STATE = ],\ "linkType": "HARD"\ }],\ - ["npm:7.0.3", {\ - "packageLocation": "./.yarn/cache/minipass-npm-7.0.3-3b57909ee9-04d72c8a43.zip/node_modules/minipass/",\ - "packageDependencies": [\ - ["minipass", "npm:7.0.3"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:7.0.4", {\ "packageLocation": "./.yarn/cache/minipass-npm-7.0.4-eacb4e042e-e864bd02ce.zip/node_modules/minipass/",\ "packageDependencies": [\ @@ -14811,7 +14296,7 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["no-case", "npm:3.0.4"],\ ["lower-case", "npm:2.0.2"],\ - ["tslib", "npm:2.4.1"]\ + ["tslib", "npm:2.6.2"]\ ],\ "linkType": "HARD"\ }]\ @@ -14880,7 +14365,7 @@ const RAW_RUNTIME_STATE = ["nopt", "npm:7.2.0"],\ ["proc-log", "npm:3.0.0"],\ ["semver", "npm:7.5.3"],\ - ["tar", "npm:6.1.11"],\ + ["tar", "npm:6.1.13"],\ ["which", "npm:4.0.0"]\ ],\ "linkType": "HARD"\ @@ -14915,13 +14400,6 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["node-releases", [\ - ["npm:2.0.1", {\ - "packageLocation": "./.yarn/cache/node-releases-npm-2.0.1-77b8e327f7-b20dd8d4bc.zip/node_modules/node-releases/",\ - "packageDependencies": [\ - ["node-releases", "npm:2.0.1"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:2.0.13", {\ "packageLocation": "./.yarn/cache/node-releases-npm-2.0.13-1f2e177887-c9bb813aab.zip/node_modules/node-releases/",\ "packageDependencies": [\ @@ -14996,7 +14474,7 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["normalize-package-data", "npm:2.5.0"],\ ["hosted-git-info", "npm:2.8.9"],\ - ["resolve", "patch:resolve@npm%3A1.22.0#optional!builtin::version=1.22.0&hash=c3c19d"],\ + ["resolve", "patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d"],\ ["semver", "npm:7.5.3"],\ ["validate-npm-package-license", "npm:3.0.4"]\ ],\ @@ -15007,7 +14485,7 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["normalize-package-data", "npm:3.0.3"],\ ["hosted-git-info", "npm:4.0.2"],\ - ["is-core-module", "npm:2.8.1"],\ + ["is-core-module", "npm:2.13.1"],\ ["semver", "npm:7.5.3"],\ ["validate-npm-package-license", "npm:3.0.4"]\ ],\ @@ -15018,7 +14496,7 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["normalize-package-data", "npm:5.0.0"],\ ["hosted-git-info", "npm:6.1.1"],\ - ["is-core-module", "npm:2.8.1"],\ + ["is-core-module", "npm:2.13.1"],\ ["semver", "npm:7.5.3"],\ ["validate-npm-package-license", "npm:3.0.4"]\ ],\ @@ -15237,7 +14715,7 @@ const RAW_RUNTIME_STATE = ["foreground-child", "npm:2.0.0"],\ ["get-package-type", "npm:0.1.0"],\ ["glob", "npm:7.2.0"],\ - ["istanbul-lib-coverage", "npm:3.2.0"],\ + ["istanbul-lib-coverage", "npm:3.2.2"],\ ["istanbul-lib-hook", "npm:3.0.0"],\ ["istanbul-lib-instrument", "npm:4.0.3"],\ ["istanbul-lib-processinfo", "npm:2.0.3"],\ @@ -15268,13 +14746,6 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["object-inspect", [\ - ["npm:1.12.3", {\ - "packageLocation": "./.yarn/cache/object-inspect-npm-1.12.3-1e7d20f5ff-532b0036f0.zip/node_modules/object-inspect/",\ - "packageDependencies": [\ - ["object-inspect", "npm:1.12.3"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:1.13.1", {\ "packageLocation": "./.yarn/cache/object-inspect-npm-1.13.1-fd038a2f0a-92f4989ed8.zip/node_modules/object-inspect/",\ "packageDependencies": [\ @@ -15288,8 +14759,8 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/object-is-npm-1.1.5-48a862602b-75365aff5d.zip/node_modules/object-is/",\ "packageDependencies": [\ ["object-is", "npm:1.1.5"],\ - ["call-bind", "npm:1.0.2"],\ - ["define-properties", "npm:1.2.0"]\ + ["call-bind", "npm:1.0.5"],\ + ["define-properties", "npm:1.2.1"]\ ],\ "linkType": "HARD"\ }]\ @@ -15317,8 +14788,8 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/object.assign-npm-4.1.4-fb3deb1c3a-fd82d45289.zip/node_modules/object.assign/",\ "packageDependencies": [\ ["object.assign", "npm:4.1.4"],\ - ["call-bind", "npm:1.0.2"],\ - ["define-properties", "npm:1.2.0"],\ + ["call-bind", "npm:1.0.5"],\ + ["define-properties", "npm:1.2.1"],\ ["has-symbols", "npm:1.0.3"],\ ["object-keys", "npm:1.1.1"]\ ],\ @@ -15330,9 +14801,9 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/object.entries-npm-1.1.6-5f9ba14b46-08a09ff839.zip/node_modules/object.entries/",\ "packageDependencies": [\ ["object.entries", "npm:1.1.6"],\ - ["call-bind", "npm:1.0.2"],\ - ["define-properties", "npm:1.2.0"],\ - ["es-abstract", "npm:1.21.2"]\ + ["call-bind", "npm:1.0.5"],\ + ["define-properties", "npm:1.2.1"],\ + ["es-abstract", "npm:1.22.3"]\ ],\ "linkType": "HARD"\ }]\ @@ -15342,7 +14813,7 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/object.fromentries-npm-2.0.7-2e38392540-1bfbe42a51.zip/node_modules/object.fromentries/",\ "packageDependencies": [\ ["object.fromentries", "npm:2.0.7"],\ - ["call-bind", "npm:1.0.2"],\ + ["call-bind", "npm:1.0.5"],\ ["define-properties", "npm:1.2.1"],\ ["es-abstract", "npm:1.22.3"]\ ],\ @@ -15354,7 +14825,7 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/object.groupby-npm-1.0.1-fc268391fe-b7123d9140.zip/node_modules/object.groupby/",\ "packageDependencies": [\ ["object.groupby", "npm:1.0.1"],\ - ["call-bind", "npm:1.0.2"],\ + ["call-bind", "npm:1.0.5"],\ ["define-properties", "npm:1.2.1"],\ ["es-abstract", "npm:1.22.3"],\ ["get-intrinsic", "npm:1.2.2"]\ @@ -15367,7 +14838,7 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/object.values-npm-1.1.7-deae619f88-20ab42c0bb.zip/node_modules/object.values/",\ "packageDependencies": [\ ["object.values", "npm:1.1.7"],\ - ["call-bind", "npm:1.0.2"],\ + ["call-bind", "npm:1.0.5"],\ ["define-properties", "npm:1.2.1"],\ ["es-abstract", "npm:1.22.3"]\ ],\ @@ -15746,7 +15217,7 @@ const RAW_RUNTIME_STATE = ["read-package-json-fast", "npm:2.0.3"],\ ["rimraf", "npm:3.0.2"],\ ["ssri", "npm:8.0.1"],\ - ["tar", "npm:6.1.11"]\ + ["tar", "npm:6.1.13"]\ ],\ "linkType": "HARD"\ }],\ @@ -15800,7 +15271,7 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["param-case", "npm:3.0.4"],\ ["dot-case", "npm:3.0.4"],\ - ["tslib", "npm:2.4.1"]\ + ["tslib", "npm:2.6.2"]\ ],\ "linkType": "HARD"\ }]\ @@ -15855,7 +15326,7 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/parse-json-npm-5.2.0-00a63b1199-62085b17d6.zip/node_modules/parse-json/",\ "packageDependencies": [\ ["parse-json", "npm:5.2.0"],\ - ["@babel/code-frame", "npm:7.16.7"],\ + ["@babel/code-frame", "npm:7.22.13"],\ ["error-ex", "npm:1.3.2"],\ ["json-parse-even-better-errors", "npm:2.3.1"],\ ["lines-and-columns", "npm:1.1.6"]\ @@ -15887,7 +15358,7 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["pascal-case", "npm:3.1.2"],\ ["no-case", "npm:3.0.4"],\ - ["tslib", "npm:2.4.1"]\ + ["tslib", "npm:2.6.2"]\ ],\ "linkType": "HARD"\ }]\ @@ -15918,7 +15389,7 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["path-case", "npm:3.0.4"],\ ["dot-case", "npm:3.0.4"],\ - ["tslib", "npm:2.4.1"]\ + ["tslib", "npm:2.6.2"]\ ],\ "linkType": "HARD"\ }]\ @@ -15985,8 +15456,8 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/path-scurry-npm-1.10.1-52bd946f2e-eebfb8304f.zip/node_modules/path-scurry/",\ "packageDependencies": [\ ["path-scurry", "npm:1.10.1"],\ - ["lru-cache", "npm:10.0.1"],\ - ["minipass", "npm:7.0.3"]\ + ["lru-cache", "npm:10.0.2"],\ + ["minipass", "npm:7.0.4"]\ ],\ "linkType": "HARD"\ }]\ @@ -16374,7 +15845,7 @@ const RAW_RUNTIME_STATE = ["@protobufjs/pool", "npm:1.1.0"],\ ["@protobufjs/utf8", "npm:1.1.0"],\ ["@types/long", "npm:4.0.1"],\ - ["@types/node", "npm:17.0.21"],\ + ["@types/node", "npm:18.16.1"],\ ["long", "npm:4.0.0"]\ ],\ "linkType": "HARD"\ @@ -16704,16 +16175,6 @@ const RAW_RUNTIME_STATE = ],\ "linkType": "HARD"\ }],\ - ["npm:3.6.0", {\ - "packageLocation": "./.yarn/cache/readable-stream-npm-3.6.0-23a4a5eb56-b80b3e6a7f.zip/node_modules/readable-stream/",\ - "packageDependencies": [\ - ["readable-stream", "npm:3.6.0"],\ - ["inherits", "npm:2.0.4"],\ - ["string_decoder", "npm:1.3.0"],\ - ["util-deprecate", "npm:1.0.2"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:3.6.2", {\ "packageLocation": "./.yarn/cache/readable-stream-npm-3.6.2-d2a6069158-d9e3e53193.zip/node_modules/readable-stream/",\ "packageDependencies": [\ @@ -16774,7 +16235,7 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/rechoir-npm-0.6.2-0df5f171ec-fe76bf9c21.zip/node_modules/rechoir/",\ "packageDependencies": [\ ["rechoir", "npm:0.6.2"],\ - ["resolve", "patch:resolve@npm%3A1.22.0#optional!builtin::version=1.22.0&hash=c3c19d"]\ + ["resolve", "patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d"]\ ],\ "linkType": "HARD"\ }],\ @@ -16782,7 +16243,7 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/rechoir-npm-0.7.1-0c7e5c1201-2a04aab4e2.zip/node_modules/rechoir/",\ "packageDependencies": [\ ["rechoir", "npm:0.7.1"],\ - ["resolve", "patch:resolve@npm%3A1.22.0#optional!builtin::version=1.22.0&hash=c3c19d"]\ + ["resolve", "patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d"]\ ],\ "linkType": "HARD"\ }]\ @@ -16847,21 +16308,11 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["regexp.prototype.flags", [\ - ["npm:1.4.3", {\ - "packageLocation": "./.yarn/cache/regexp.prototype.flags-npm-1.4.3-df1c08b65d-3cde7cd22f.zip/node_modules/regexp.prototype.flags/",\ - "packageDependencies": [\ - ["regexp.prototype.flags", "npm:1.4.3"],\ - ["call-bind", "npm:1.0.2"],\ - ["define-properties", "npm:1.2.0"],\ - ["functions-have-names", "npm:1.2.3"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:1.5.1", {\ "packageLocation": "./.yarn/cache/regexp.prototype.flags-npm-1.5.1-b8faeee306-3fa5610b8e.zip/node_modules/regexp.prototype.flags/",\ "packageDependencies": [\ ["regexp.prototype.flags", "npm:1.5.1"],\ - ["call-bind", "npm:1.0.2"],\ + ["call-bind", "npm:1.0.5"],\ ["define-properties", "npm:1.2.1"],\ ["set-function-name", "npm:2.0.1"]\ ],\ @@ -16976,16 +16427,6 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["resolve", [\ - ["patch:resolve@npm%3A1.22.0#optional!builtin::version=1.22.0&hash=c3c19d", {\ - "packageLocation": "./.yarn/cache/resolve-patch-2781af2c06-cb53ccafb0.zip/node_modules/resolve/",\ - "packageDependencies": [\ - ["resolve", "patch:resolve@npm%3A1.22.0#optional!builtin::version=1.22.0&hash=c3c19d"],\ - ["is-core-module", "npm:2.8.1"],\ - ["path-parse", "npm:1.0.7"],\ - ["supports-preserve-symlinks-flag", "npm:1.0.0"]\ - ],\ - "linkType": "HARD"\ - }],\ ["patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d", {\ "packageLocation": "./.yarn/cache/resolve-patch-4254c24959-f345cd37f5.zip/node_modules/resolve/",\ "packageDependencies": [\ @@ -17152,19 +16593,11 @@ const RAW_RUNTIME_STATE = ],\ "linkType": "HARD"\ }],\ - ["npm:7.8.0", {\ - "packageLocation": "./.yarn/cache/rxjs-npm-7.8.0-722f1c7172-ff9359cc78.zip/node_modules/rxjs/",\ - "packageDependencies": [\ - ["rxjs", "npm:7.8.0"],\ - ["tslib", "npm:2.4.1"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:7.8.1", {\ "packageLocation": "./.yarn/cache/rxjs-npm-7.8.1-41c443a75b-b10cac1a52.zip/node_modules/rxjs/",\ "packageDependencies": [\ ["rxjs", "npm:7.8.1"],\ - ["tslib", "npm:2.4.1"]\ + ["tslib", "npm:2.6.2"]\ ],\ "linkType": "HARD"\ }]\ @@ -17174,7 +16607,7 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/safe-array-concat-npm-1.0.1-8a42907bbf-44f073d85c.zip/node_modules/safe-array-concat/",\ "packageDependencies": [\ ["safe-array-concat", "npm:1.0.1"],\ - ["call-bind", "npm:1.0.2"],\ + ["call-bind", "npm:1.0.5"],\ ["get-intrinsic", "npm:1.2.2"],\ ["has-symbols", "npm:1.0.3"],\ ["isarray", "npm:2.0.5"]\ @@ -17203,8 +16636,8 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/safe-regex-test-npm-1.0.0-e94a09b84e-c7248dfa07.zip/node_modules/safe-regex-test/",\ "packageDependencies": [\ ["safe-regex-test", "npm:1.0.0"],\ - ["call-bind", "npm:1.0.2"],\ - ["get-intrinsic", "npm:1.2.0"],\ + ["call-bind", "npm:1.0.5"],\ + ["get-intrinsic", "npm:1.2.2"],\ ["is-regex", "npm:1.1.4"]\ ],\ "linkType": "HARD"\ @@ -17266,7 +16699,7 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/schema-utils-npm-3.1.1-8704647575-cfcf991f10.zip/node_modules/schema-utils/",\ "packageDependencies": [\ ["schema-utils", "npm:3.1.1"],\ - ["@types/json-schema", "npm:7.0.11"],\ + ["@types/json-schema", "npm:7.0.15"],\ ["ajv", "npm:6.12.6"],\ ["ajv-keywords", "virtual:8704647575acf2f5b19fccfcb0acebacd9c94259ebe9afcfaf4c053812fd896f10775930ee5a5949e20833a61503d2cd22aa259cbe69729f6a192de4bf43dc00#npm:3.5.2"]\ ],\ @@ -17276,7 +16709,7 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/schema-utils-npm-4.2.0-e822c5b02e-808784735e.zip/node_modules/schema-utils/",\ "packageDependencies": [\ ["schema-utils", "npm:4.2.0"],\ - ["@types/json-schema", "npm:7.0.11"],\ + ["@types/json-schema", "npm:7.0.15"],\ ["ajv", "npm:8.12.0"],\ ["ajv-formats", "virtual:e822c5b02ef2b3c5fb9c8d88d5e0ca208365bff76f80510f4ccf9b1de44e2078264bcb00d3cdd5e193c256e9ab81e27c34fcfb1ad3a0e8c1dc8fa0066c78c468#npm:2.1.1"],\ ["ajv-keywords", "virtual:e822c5b02ef2b3c5fb9c8d88d5e0ca208365bff76f80510f4ccf9b1de44e2078264bcb00d3cdd5e193c256e9ab81e27c34fcfb1ad3a0e8c1dc8fa0066c78c468#npm:5.1.0"]\ @@ -17327,7 +16760,7 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["sentence-case", "npm:3.0.4"],\ ["no-case", "npm:3.0.4"],\ - ["tslib", "npm:2.4.1"],\ + ["tslib", "npm:2.6.2"],\ ["upper-case-first", "npm:2.0.2"]\ ],\ "linkType": "HARD"\ @@ -17551,9 +16984,9 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/side-channel-npm-1.0.4-e1f38b9e06-c4998d9fc5.zip/node_modules/side-channel/",\ "packageDependencies": [\ ["side-channel", "npm:1.0.4"],\ - ["call-bind", "npm:1.0.2"],\ - ["get-intrinsic", "npm:1.2.0"],\ - ["object-inspect", "npm:1.12.3"]\ + ["call-bind", "npm:1.0.5"],\ + ["get-intrinsic", "npm:1.2.2"],\ + ["object-inspect", "npm:1.13.1"]\ ],\ "linkType": "HARD"\ }]\ @@ -17740,7 +17173,7 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["snake-case", "npm:3.0.4"],\ ["dot-case", "npm:3.0.4"],\ - ["tslib", "npm:2.4.1"]\ + ["tslib", "npm:2.6.2"]\ ],\ "linkType": "HARD"\ }]\ @@ -17781,20 +17214,11 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["socks", [\ - ["npm:2.6.1", {\ - "packageLocation": "./.yarn/cache/socks-npm-2.6.1-09133d0d22-6ae166bd1a.zip/node_modules/socks/",\ - "packageDependencies": [\ - ["socks", "npm:2.6.1"],\ - ["ip", "npm:1.1.5"],\ - ["smart-buffer", "npm:4.2.0"]\ - ],\ - "linkType": "HARD"\ - }],\ - ["npm:2.7.1", {\ - "packageLocation": "./.yarn/cache/socks-npm-2.7.1-17f2b53052-5074f7d6a1.zip/node_modules/socks/",\ + ["npm:2.8.0", {\ + "packageLocation": "./.yarn/cache/socks-npm-2.8.0-9be534eccc-ed0224ce2c.zip/node_modules/socks/",\ "packageDependencies": [\ - ["socks", "npm:2.7.1"],\ - ["ip", "npm:2.0.0"],\ + ["socks", "npm:2.8.0"],\ + ["ip-address", "npm:9.0.5"],\ ["smart-buffer", "npm:4.2.0"]\ ],\ "linkType": "HARD"\ @@ -17807,7 +17231,7 @@ const RAW_RUNTIME_STATE = ["socks-proxy-agent", "npm:6.1.1"],\ ["agent-base", "npm:6.0.2"],\ ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ - ["socks", "npm:2.6.1"]\ + ["socks", "npm:2.8.0"]\ ],\ "linkType": "HARD"\ }],\ @@ -17817,7 +17241,7 @@ const RAW_RUNTIME_STATE = ["socks-proxy-agent", "npm:7.0.0"],\ ["agent-base", "npm:6.0.2"],\ ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ - ["socks", "npm:2.7.1"]\ + ["socks", "npm:2.8.0"]\ ],\ "linkType": "HARD"\ }],\ @@ -17827,7 +17251,7 @@ const RAW_RUNTIME_STATE = ["socks-proxy-agent", "npm:8.0.2"],\ ["agent-base", "npm:7.1.0"],\ ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ - ["socks", "npm:2.7.1"]\ + ["socks", "npm:2.8.0"]\ ],\ "linkType": "HARD"\ }]\ @@ -17853,13 +17277,6 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["source-map", [\ - ["npm:0.5.7", {\ - "packageLocation": "./.yarn/cache/source-map-npm-0.5.7-7c3f035429-9b4ac749ec.zip/node_modules/source-map/",\ - "packageDependencies": [\ - ["source-map", "npm:0.5.7"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:0.6.1", {\ "packageLocation": "./.yarn/cache/source-map-npm-0.6.1-1a3621db16-59ef7462f1.zip/node_modules/source-map/",\ "packageDependencies": [\ @@ -17975,7 +17392,7 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/split2-npm-3.2.2-4ccd21b4f7-a426e1e671.zip/node_modules/split2/",\ "packageDependencies": [\ ["split2", "npm:3.2.2"],\ - ["readable-stream", "npm:3.6.0"]\ + ["readable-stream", "npm:3.6.2"]\ ],\ "linkType": "HARD"\ }],\ @@ -17994,6 +17411,13 @@ const RAW_RUNTIME_STATE = ["sprintf-js", "npm:1.0.3"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:1.1.3", {\ + "packageLocation": "./.yarn/cache/sprintf-js-npm-1.1.3-b99efd75b2-e7587128c4.zip/node_modules/sprintf-js/",\ + "packageDependencies": [\ + ["sprintf-js", "npm:1.1.3"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["ssh2", [\ @@ -18051,7 +17475,7 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["stream-browserify", "npm:3.0.0"],\ ["inherits", "npm:2.0.4"],\ - ["readable-stream", "npm:3.6.0"]\ + ["readable-stream", "npm:3.6.2"]\ ],\ "linkType": "HARD"\ }]\ @@ -18063,7 +17487,7 @@ const RAW_RUNTIME_STATE = ["stream-http", "npm:3.2.0"],\ ["builtin-status-codes", "npm:3.0.0"],\ ["inherits", "npm:2.0.4"],\ - ["readable-stream", "npm:3.6.0"],\ + ["readable-stream", "npm:3.6.2"],\ ["xtend", "npm:4.0.2"]\ ],\ "linkType": "HARD"\ @@ -18104,21 +17528,11 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["string.prototype.trim", [\ - ["npm:1.2.7", {\ - "packageLocation": "./.yarn/cache/string.prototype.trim-npm-1.2.7-3fbaf3b9d2-a1b795bdb4.zip/node_modules/string.prototype.trim/",\ - "packageDependencies": [\ - ["string.prototype.trim", "npm:1.2.7"],\ - ["call-bind", "npm:1.0.2"],\ - ["define-properties", "npm:1.2.0"],\ - ["es-abstract", "npm:1.21.2"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:1.2.8", {\ "packageLocation": "./.yarn/cache/string.prototype.trim-npm-1.2.8-7ed4517ce8-9301f6cb2b.zip/node_modules/string.prototype.trim/",\ "packageDependencies": [\ ["string.prototype.trim", "npm:1.2.8"],\ - ["call-bind", "npm:1.0.2"],\ + ["call-bind", "npm:1.0.5"],\ ["define-properties", "npm:1.2.1"],\ ["es-abstract", "npm:1.22.3"]\ ],\ @@ -18126,21 +17540,11 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["string.prototype.trimend", [\ - ["npm:1.0.6", {\ - "packageLocation": "./.yarn/cache/string.prototype.trimend-npm-1.0.6-304246ecc1-3893db9267.zip/node_modules/string.prototype.trimend/",\ - "packageDependencies": [\ - ["string.prototype.trimend", "npm:1.0.6"],\ - ["call-bind", "npm:1.0.2"],\ - ["define-properties", "npm:1.2.0"],\ - ["es-abstract", "npm:1.21.2"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:1.0.7", {\ "packageLocation": "./.yarn/cache/string.prototype.trimend-npm-1.0.7-159b9dcfbc-3f0d3397ab.zip/node_modules/string.prototype.trimend/",\ "packageDependencies": [\ ["string.prototype.trimend", "npm:1.0.7"],\ - ["call-bind", "npm:1.0.2"],\ + ["call-bind", "npm:1.0.5"],\ ["define-properties", "npm:1.2.1"],\ ["es-abstract", "npm:1.22.3"]\ ],\ @@ -18148,21 +17552,11 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["string.prototype.trimstart", [\ - ["npm:1.0.6", {\ - "packageLocation": "./.yarn/cache/string.prototype.trimstart-npm-1.0.6-0926caea6c-05e2cd06fa.zip/node_modules/string.prototype.trimstart/",\ - "packageDependencies": [\ - ["string.prototype.trimstart", "npm:1.0.6"],\ - ["call-bind", "npm:1.0.2"],\ - ["define-properties", "npm:1.2.0"],\ - ["es-abstract", "npm:1.21.2"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:1.0.7", {\ "packageLocation": "./.yarn/cache/string.prototype.trimstart-npm-1.0.7-ae2f803b78-6e594d3a61.zip/node_modules/string.prototype.trimstart/",\ "packageDependencies": [\ ["string.prototype.trimstart", "npm:1.0.7"],\ - ["call-bind", "npm:1.0.2"],\ + ["call-bind", "npm:1.0.5"],\ ["define-properties", "npm:1.2.1"],\ ["es-abstract", "npm:1.22.3"]\ ],\ @@ -18320,15 +17714,6 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["supports-hyperlinks", [\ - ["npm:2.2.0", {\ - "packageLocation": "./.yarn/cache/supports-hyperlinks-npm-2.2.0-9b22a6271b-a63f2acba5.zip/node_modules/supports-hyperlinks/",\ - "packageDependencies": [\ - ["supports-hyperlinks", "npm:2.2.0"],\ - ["has-flag", "npm:4.0.0"],\ - ["supports-color", "npm:7.2.0"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:2.3.0", {\ "packageLocation": "./.yarn/cache/supports-hyperlinks-npm-2.3.0-d19176eba2-3e7df6e9ea.zip/node_modules/supports-hyperlinks/",\ "packageDependencies": [\ @@ -18392,7 +17777,7 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/table-npm-6.8.1-83abb79e20-512c4f2bfb.zip/node_modules/table/",\ "packageDependencies": [\ ["table", "npm:6.8.1"],\ - ["ajv", "npm:8.8.1"],\ + ["ajv", "npm:8.12.0"],\ ["lodash.truncate", "npm:4.4.2"],\ ["slice-ansi", "npm:4.0.0"],\ ["string-width", "npm:4.2.3"],\ @@ -18422,19 +17807,6 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["tar", [\ - ["npm:6.1.11", {\ - "packageLocation": "./.yarn/cache/tar-npm-6.1.11-e6ac3cba9c-0e6789e664.zip/node_modules/tar/",\ - "packageDependencies": [\ - ["tar", "npm:6.1.11"],\ - ["chownr", "npm:2.0.0"],\ - ["fs-minipass", "npm:2.1.0"],\ - ["minipass", "npm:3.1.6"],\ - ["minizlib", "npm:2.1.2"],\ - ["mkdirp", "npm:1.0.4"],\ - ["yallist", "npm:4.0.0"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:6.1.13", {\ "packageLocation": "./.yarn/cache/tar-npm-6.1.13-3234e72781-add2c3c6d0.zip/node_modules/tar/",\ "packageDependencies": [\ @@ -18471,7 +17843,7 @@ const RAW_RUNTIME_STATE = ["end-of-stream", "npm:1.4.4"],\ ["fs-constants", "npm:1.0.0"],\ ["inherits", "npm:2.0.4"],\ - ["readable-stream", "npm:3.6.0"]\ + ["readable-stream", "npm:3.6.2"]\ ],\ "linkType": "HARD"\ }]\ @@ -18502,7 +17874,7 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["terser", "npm:5.14.2"],\ ["@jridgewell/source-map", "npm:0.3.2"],\ - ["acorn", "npm:8.8.2"],\ + ["acorn", "npm:8.11.2"],\ ["commander", "npm:2.20.3"],\ ["source-map-support", "npm:0.5.21"]\ ],\ @@ -18521,7 +17893,7 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/__virtual__/terser-webpack-plugin-virtual-7b10d7bddb/0/cache/terser-webpack-plugin-npm-5.3.3-659a8e4514-db2bc0e570.zip/node_modules/terser-webpack-plugin/",\ "packageDependencies": [\ ["terser-webpack-plugin", "virtual:2a3d558ccb76dd3ab11b6ed4ba45a56a4c8ede48a0f5bce78e9f369869629c0ab3fdd420246c54134f91e3f10302373527dda29ebc24d5a11b3ceb41128ccfad#npm:5.3.3"],\ - ["@jridgewell/trace-mapping", "npm:0.3.15"],\ + ["@jridgewell/trace-mapping", "npm:0.3.18"],\ ["@swc/core", null],\ ["@types/esbuild", null],\ ["@types/swc__core", null],\ @@ -18551,7 +17923,7 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/__virtual__/terser-webpack-plugin-virtual-520d9753e1/0/cache/terser-webpack-plugin-npm-5.3.3-659a8e4514-db2bc0e570.zip/node_modules/terser-webpack-plugin/",\ "packageDependencies": [\ ["terser-webpack-plugin", "virtual:42f4a899ff66a92a935fae1e8403ae89d87f8a151c8c0f294f5e2ee8bca90964f194c289f6f47a8333ea1d64884bb4ea4c5aea65e0aa5a8603494f665e284ad3#npm:5.3.3"],\ - ["@jridgewell/trace-mapping", "npm:0.3.15"],\ + ["@jridgewell/trace-mapping", "npm:0.3.18"],\ ["@swc/core", null],\ ["@types/esbuild", null],\ ["@types/swc__core", null],\ @@ -18581,7 +17953,7 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/__virtual__/terser-webpack-plugin-virtual-00677cea6c/0/cache/terser-webpack-plugin-npm-5.3.3-659a8e4514-db2bc0e570.zip/node_modules/terser-webpack-plugin/",\ "packageDependencies": [\ ["terser-webpack-plugin", "virtual:a1758743d243877493a02719691b2bf5513261873450aca581311be1ead841af63c0be982c400355949a0dcad332960c6e3ed3885051f0427d191c70a7fc9856#npm:5.3.3"],\ - ["@jridgewell/trace-mapping", "npm:0.3.15"],\ + ["@jridgewell/trace-mapping", "npm:0.3.18"],\ ["@swc/core", null],\ ["@types/esbuild", null],\ ["@types/swc__core", null],\ @@ -18611,7 +17983,7 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/__virtual__/terser-webpack-plugin-virtual-65e4fce360/0/cache/terser-webpack-plugin-npm-5.3.3-659a8e4514-db2bc0e570.zip/node_modules/terser-webpack-plugin/",\ "packageDependencies": [\ ["terser-webpack-plugin", "virtual:ad53cff31b1dbd4927a99e71702e3b8b10338636eaff010987c27c9ccea2d52af36900a9e36a4231cbb6e5464248ccc9c1da5d1d24d9b0f4f95660296b1060a6#npm:5.3.3"],\ - ["@jridgewell/trace-mapping", "npm:0.3.15"],\ + ["@jridgewell/trace-mapping", "npm:0.3.18"],\ ["@swc/core", null],\ ["@types/esbuild", null],\ ["@types/swc__core", null],\ @@ -18641,7 +18013,7 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/__virtual__/terser-webpack-plugin-virtual-9f9f9cad8b/0/cache/terser-webpack-plugin-npm-5.3.3-659a8e4514-db2bc0e570.zip/node_modules/terser-webpack-plugin/",\ "packageDependencies": [\ ["terser-webpack-plugin", "virtual:d33ae3339557a5a7f9578102570f67e936a4c1af78c1322b63541bc89dc24f419318f0ddd4e3241021a7e0be1ce717f7ffe8cc168317f38d8d886f6915b6482d#npm:5.3.3"],\ - ["@jridgewell/trace-mapping", "npm:0.3.15"],\ + ["@jridgewell/trace-mapping", "npm:0.3.18"],\ ["@swc/core", null],\ ["@types/esbuild", null],\ ["@types/swc__core", null],\ @@ -18749,7 +18121,7 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/through2-npm-4.0.2-da7b2da443-72c246233d.zip/node_modules/through2/",\ "packageDependencies": [\ ["through2", "npm:4.0.2"],\ - ["readable-stream", "npm:3.6.0"]\ + ["readable-stream", "npm:3.6.2"]\ ],\ "linkType": "HARD"\ }]\ @@ -19008,13 +18380,6 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["ts-node", [\ - ["npm:10.4.0", {\ - "packageLocation": "./.yarn/cache/ts-node-npm-10.4.0-04cb6e2279-5874ac27f6.zip/node_modules/ts-node/",\ - "packageDependencies": [\ - ["ts-node", "npm:10.4.0"]\ - ],\ - "linkType": "SOFT"\ - }],\ ["npm:10.9.1", {\ "packageLocation": "./.yarn/cache/ts-node-npm-10.9.1-6c268be7f4-bee56d4dc9.zip/node_modules/ts-node/",\ "packageDependencies": [\ @@ -19038,11 +18403,11 @@ const RAW_RUNTIME_STATE = ],\ "linkType": "HARD"\ }],\ - ["virtual:ad53cff31b1dbd4927a99e71702e3b8b10338636eaff010987c27c9ccea2d52af36900a9e36a4231cbb6e5464248ccc9c1da5d1d24d9b0f4f95660296b1060a6#npm:10.4.0", {\ - "packageLocation": "./.yarn/__virtual__/ts-node-virtual-065e96423f/0/cache/ts-node-npm-10.4.0-04cb6e2279-5874ac27f6.zip/node_modules/ts-node/",\ + ["virtual:ad53cff31b1dbd4927a99e71702e3b8b10338636eaff010987c27c9ccea2d52af36900a9e36a4231cbb6e5464248ccc9c1da5d1d24d9b0f4f95660296b1060a6#npm:10.9.1", {\ + "packageLocation": "./.yarn/__virtual__/ts-node-virtual-b591c0cf5f/0/cache/ts-node-npm-10.9.1-6c268be7f4-bee56d4dc9.zip/node_modules/ts-node/",\ "packageDependencies": [\ - ["ts-node", "virtual:ad53cff31b1dbd4927a99e71702e3b8b10338636eaff010987c27c9ccea2d52af36900a9e36a4231cbb6e5464248ccc9c1da5d1d24d9b0f4f95660296b1060a6#npm:10.4.0"],\ - ["@cspotcode/source-map-support", "npm:0.7.0"],\ + ["ts-node", "virtual:ad53cff31b1dbd4927a99e71702e3b8b10338636eaff010987c27c9ccea2d52af36900a9e36a4231cbb6e5464248ccc9c1da5d1d24d9b0f4f95660296b1060a6#npm:10.9.1"],\ + ["@cspotcode/source-map-support", "npm:0.8.1"],\ ["@swc/core", null],\ ["@swc/wasm", null],\ ["@tsconfig/node10", "npm:1.0.8"],\ @@ -19053,13 +18418,14 @@ const RAW_RUNTIME_STATE = ["@types/swc__core", null],\ ["@types/swc__wasm", null],\ ["@types/typescript", null],\ - ["acorn", "npm:8.8.2"],\ + ["acorn", "npm:8.11.2"],\ ["acorn-walk", "npm:8.2.0"],\ ["arg", "npm:4.1.3"],\ ["create-require", "npm:1.1.1"],\ ["diff", "npm:4.0.2"],\ ["make-error", "npm:1.3.6"],\ ["typescript", "patch:typescript@npm%3A3.9.10#optional!builtin::version=3.9.10&hash=3bd3d3"],\ + ["v8-compile-cache-lib", "npm:3.0.1"],\ ["yn", "npm:3.1.1"]\ ],\ "packagePeers": [\ @@ -19088,7 +18454,7 @@ const RAW_RUNTIME_STATE = ["@types/swc__core", null],\ ["@types/swc__wasm", null],\ ["@types/typescript", null],\ - ["acorn", "npm:8.8.2"],\ + ["acorn", "npm:8.11.2"],\ ["acorn-walk", "npm:8.2.0"],\ ["arg", "npm:4.1.3"],\ ["create-require", "npm:1.1.1"],\ @@ -19174,20 +18540,6 @@ const RAW_RUNTIME_STATE = ],\ "linkType": "HARD"\ }],\ - ["npm:2.4.1", {\ - "packageLocation": "./.yarn/cache/tslib-npm-2.4.1-36f0ed04db-e14311d539.zip/node_modules/tslib/",\ - "packageDependencies": [\ - ["tslib", "npm:2.4.1"]\ - ],\ - "linkType": "HARD"\ - }],\ - ["npm:2.5.0", {\ - "packageLocation": "./.yarn/cache/tslib-npm-2.5.0-bb364efebd-ea556fbdf3.zip/node_modules/tslib/",\ - "packageDependencies": [\ - ["tslib", "npm:2.5.0"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:2.6.2", {\ "packageLocation": "./.yarn/cache/tslib-npm-2.6.2-4fc8c068d9-bd26c22d36.zip/node_modules/tslib/",\ "packageDependencies": [\ @@ -19362,9 +18714,9 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/typed-array-buffer-npm-1.0.0-95cb610310-3e0281c79b.zip/node_modules/typed-array-buffer/",\ "packageDependencies": [\ ["typed-array-buffer", "npm:1.0.0"],\ - ["call-bind", "npm:1.0.2"],\ + ["call-bind", "npm:1.0.5"],\ ["get-intrinsic", "npm:1.2.2"],\ - ["is-typed-array", "npm:1.1.10"]\ + ["is-typed-array", "npm:1.1.12"]\ ],\ "linkType": "HARD"\ }]\ @@ -19374,10 +18726,10 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/typed-array-byte-length-npm-1.0.0-94d79975ca-6f376bf5d9.zip/node_modules/typed-array-byte-length/",\ "packageDependencies": [\ ["typed-array-byte-length", "npm:1.0.0"],\ - ["call-bind", "npm:1.0.2"],\ + ["call-bind", "npm:1.0.5"],\ ["for-each", "npm:0.3.3"],\ ["has-proto", "npm:1.0.1"],\ - ["is-typed-array", "npm:1.1.10"]\ + ["is-typed-array", "npm:1.1.12"]\ ],\ "linkType": "HARD"\ }]\ @@ -19388,10 +18740,10 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["typed-array-byte-offset", "npm:1.0.0"],\ ["available-typed-arrays", "npm:1.0.5"],\ - ["call-bind", "npm:1.0.2"],\ + ["call-bind", "npm:1.0.5"],\ ["for-each", "npm:0.3.3"],\ ["has-proto", "npm:1.0.1"],\ - ["is-typed-array", "npm:1.1.10"]\ + ["is-typed-array", "npm:1.1.12"]\ ],\ "linkType": "HARD"\ }]\ @@ -19401,9 +18753,9 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/typed-array-length-npm-1.0.4-92771b81fc-0444658acc.zip/node_modules/typed-array-length/",\ "packageDependencies": [\ ["typed-array-length", "npm:1.0.4"],\ - ["call-bind", "npm:1.0.2"],\ + ["call-bind", "npm:1.0.5"],\ ["for-each", "npm:0.3.3"],\ - ["is-typed-array", "npm:1.1.10"]\ + ["is-typed-array", "npm:1.1.12"]\ ],\ "linkType": "HARD"\ }]\ @@ -19462,10 +18814,10 @@ const RAW_RUNTIME_STATE = ["ansi-split", "npm:1.0.1"],\ ["chalk", "npm:4.1.2"],\ ["cross-spawn", "npm:7.0.3"],\ - ["fast-glob", "npm:3.2.11"],\ + ["fast-glob", "npm:3.2.12"],\ ["globrex", "npm:0.1.2"],\ ["ignore", "npm:5.2.0"],\ - ["json5", "npm:2.2.0"],\ + ["json5", "npm:2.2.3"],\ ["micro-memoize", "npm:4.0.9"],\ ["npm-run-path", "npm:4.0.1"],\ ["pid-cwd", "npm:1.2.0"],\ @@ -19486,7 +18838,7 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/unbox-primitive-npm-1.0.2-cb56a05066-06e1ee41c1.zip/node_modules/unbox-primitive/",\ "packageDependencies": [\ ["unbox-primitive", "npm:1.0.2"],\ - ["call-bind", "npm:1.0.2"],\ + ["call-bind", "npm:1.0.5"],\ ["has-bigints", "npm:1.0.2"],\ ["has-symbols", "npm:1.0.3"],\ ["which-boxed-primitive", "npm:1.0.2"]\ @@ -19635,7 +18987,7 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/upper-case-npm-2.0.2-6cf3bda96c-508723a2b0.zip/node_modules/upper-case/",\ "packageDependencies": [\ ["upper-case", "npm:2.0.2"],\ - ["tslib", "npm:2.4.1"]\ + ["tslib", "npm:2.6.2"]\ ],\ "linkType": "HARD"\ }]\ @@ -19645,7 +18997,7 @@ const RAW_RUNTIME_STATE = "packageLocation": "./.yarn/cache/upper-case-first-npm-2.0.2-8e0c5a851a-4487db4701.zip/node_modules/upper-case-first/",\ "packageDependencies": [\ ["upper-case-first", "npm:2.0.2"],\ - ["tslib", "npm:2.4.1"]\ + ["tslib", "npm:2.6.2"]\ ],\ "linkType": "HARD"\ }]\ @@ -19699,9 +19051,9 @@ const RAW_RUNTIME_STATE = ["inherits", "npm:2.0.4"],\ ["is-arguments", "npm:1.1.1"],\ ["is-generator-function", "npm:1.0.10"],\ - ["is-typed-array", "npm:1.1.10"],\ + ["is-typed-array", "npm:1.1.12"],\ ["safe-buffer", "npm:5.2.1"],\ - ["which-typed-array", "npm:1.1.9"]\ + ["which-typed-array", "npm:1.1.13"]\ ],\ "linkType": "HARD"\ }]\ @@ -19916,11 +19268,11 @@ const RAW_RUNTIME_STATE = ["@webassemblyjs/ast", "npm:1.11.1"],\ ["@webassemblyjs/wasm-edit", "npm:1.11.1"],\ ["@webassemblyjs/wasm-parser", "npm:1.11.1"],\ - ["acorn", "npm:8.8.2"],\ + ["acorn", "npm:8.11.2"],\ ["acorn-import-assertions", "virtual:a1758743d243877493a02719691b2bf5513261873450aca581311be1ead841af63c0be982c400355949a0dcad332960c6e3ed3885051f0427d191c70a7fc9856#npm:1.8.0"],\ - ["browserslist", "npm:4.18.1"],\ + ["browserslist", "npm:4.22.1"],\ ["chrome-trace-event", "npm:1.0.3"],\ - ["enhanced-resolve", "npm:5.12.0"],\ + ["enhanced-resolve", "npm:5.15.0"],\ ["es-module-lexer", "npm:0.9.3"],\ ["eslint-scope", "npm:5.1.1"],\ ["events", "npm:3.3.0"],\ @@ -19953,11 +19305,11 @@ const RAW_RUNTIME_STATE = ["@webassemblyjs/ast", "npm:1.11.1"],\ ["@webassemblyjs/wasm-edit", "npm:1.11.1"],\ ["@webassemblyjs/wasm-parser", "npm:1.11.1"],\ - ["acorn", "npm:8.8.2"],\ + ["acorn", "npm:8.11.2"],\ ["acorn-import-assertions", "virtual:a1758743d243877493a02719691b2bf5513261873450aca581311be1ead841af63c0be982c400355949a0dcad332960c6e3ed3885051f0427d191c70a7fc9856#npm:1.8.0"],\ - ["browserslist", "npm:4.18.1"],\ + ["browserslist", "npm:4.22.1"],\ ["chrome-trace-event", "npm:1.0.3"],\ - ["enhanced-resolve", "npm:5.12.0"],\ + ["enhanced-resolve", "npm:5.15.0"],\ ["es-module-lexer", "npm:0.9.3"],\ ["eslint-scope", "npm:5.1.1"],\ ["events", "npm:3.3.0"],\ @@ -19990,11 +19342,11 @@ const RAW_RUNTIME_STATE = ["@webassemblyjs/ast", "npm:1.11.1"],\ ["@webassemblyjs/wasm-edit", "npm:1.11.1"],\ ["@webassemblyjs/wasm-parser", "npm:1.11.1"],\ - ["acorn", "npm:8.8.2"],\ + ["acorn", "npm:8.11.2"],\ ["acorn-import-assertions", "virtual:a1758743d243877493a02719691b2bf5513261873450aca581311be1ead841af63c0be982c400355949a0dcad332960c6e3ed3885051f0427d191c70a7fc9856#npm:1.8.0"],\ - ["browserslist", "npm:4.18.1"],\ + ["browserslist", "npm:4.22.1"],\ ["chrome-trace-event", "npm:1.0.3"],\ - ["enhanced-resolve", "npm:5.12.0"],\ + ["enhanced-resolve", "npm:5.15.0"],\ ["es-module-lexer", "npm:0.9.3"],\ ["eslint-scope", "npm:5.1.1"],\ ["events", "npm:3.3.0"],\ @@ -20027,11 +19379,11 @@ const RAW_RUNTIME_STATE = ["@webassemblyjs/ast", "npm:1.11.1"],\ ["@webassemblyjs/wasm-edit", "npm:1.11.1"],\ ["@webassemblyjs/wasm-parser", "npm:1.11.1"],\ - ["acorn", "npm:8.8.2"],\ + ["acorn", "npm:8.11.2"],\ ["acorn-import-assertions", "virtual:a1758743d243877493a02719691b2bf5513261873450aca581311be1ead841af63c0be982c400355949a0dcad332960c6e3ed3885051f0427d191c70a7fc9856#npm:1.8.0"],\ - ["browserslist", "npm:4.18.1"],\ + ["browserslist", "npm:4.22.1"],\ ["chrome-trace-event", "npm:1.0.3"],\ - ["enhanced-resolve", "npm:5.12.0"],\ + ["enhanced-resolve", "npm:5.15.0"],\ ["es-module-lexer", "npm:0.9.3"],\ ["eslint-scope", "npm:5.1.1"],\ ["events", "npm:3.3.0"],\ @@ -20064,11 +19416,11 @@ const RAW_RUNTIME_STATE = ["@webassemblyjs/ast", "npm:1.11.1"],\ ["@webassemblyjs/wasm-edit", "npm:1.11.1"],\ ["@webassemblyjs/wasm-parser", "npm:1.11.1"],\ - ["acorn", "npm:8.8.2"],\ + ["acorn", "npm:8.11.2"],\ ["acorn-import-assertions", "virtual:a1758743d243877493a02719691b2bf5513261873450aca581311be1ead841af63c0be982c400355949a0dcad332960c6e3ed3885051f0427d191c70a7fc9856#npm:1.8.0"],\ - ["browserslist", "npm:4.18.1"],\ + ["browserslist", "npm:4.22.1"],\ ["chrome-trace-event", "npm:1.0.3"],\ - ["enhanced-resolve", "npm:5.12.0"],\ + ["enhanced-resolve", "npm:5.15.0"],\ ["es-module-lexer", "npm:0.9.3"],\ ["eslint-scope", "npm:5.1.1"],\ ["events", "npm:3.3.0"],\ @@ -20115,7 +19467,7 @@ const RAW_RUNTIME_STATE = ["@webpack-cli/info", "virtual:0249f7ceb5542d6b732af2b44f9fcd16c60be8b8440f0f3abc6a5de67aabcff731bc3bc83f3067ab2f9037661176f001f89208fcea9e8962835fd43d0aabe88a#npm:1.4.0"],\ ["@webpack-cli/migrate", null],\ ["@webpack-cli/serve", "virtual:0249f7ceb5542d6b732af2b44f9fcd16c60be8b8440f0f3abc6a5de67aabcff731bc3bc83f3067ab2f9037661176f001f89208fcea9e8962835fd43d0aabe88a#npm:1.6.0"],\ - ["colorette", "npm:2.0.19"],\ + ["colorette", "npm:2.0.20"],\ ["commander", "npm:7.2.0"],\ ["execa", "npm:5.1.1"],\ ["fastest-levenshtein", "npm:1.0.12"],\ @@ -20156,7 +19508,7 @@ const RAW_RUNTIME_STATE = ["@webpack-cli/info", "virtual:b37ef7cf98ceabe8c7b789a7db3f0a5f3444d083afa5f0e3ab570292e74eff241f890fadbf245a134b2ebfcba326b1782124a4dd4f16ca7cdb6091dd9a987c04#npm:1.4.0"],\ ["@webpack-cli/migrate", null],\ ["@webpack-cli/serve", "virtual:b37ef7cf98ceabe8c7b789a7db3f0a5f3444d083afa5f0e3ab570292e74eff241f890fadbf245a134b2ebfcba326b1782124a4dd4f16ca7cdb6091dd9a987c04#npm:1.6.0"],\ - ["colorette", "npm:2.0.19"],\ + ["colorette", "npm:2.0.20"],\ ["commander", "npm:7.2.0"],\ ["execa", "npm:5.1.1"],\ ["fastest-levenshtein", "npm:1.0.12"],\ @@ -20197,7 +19549,7 @@ const RAW_RUNTIME_STATE = ["@webpack-cli/info", "virtual:7fc88da9d00679384dc013444a3b1ed8ef8395fcad9d046790a1851d5db985e5ee052061731f87c5475e4bf20a92d69ea1a1a287c0d76d7b1a6bf97010c63532#npm:1.4.0"],\ ["@webpack-cli/migrate", null],\ ["@webpack-cli/serve", "virtual:7fc88da9d00679384dc013444a3b1ed8ef8395fcad9d046790a1851d5db985e5ee052061731f87c5475e4bf20a92d69ea1a1a287c0d76d7b1a6bf97010c63532#npm:1.6.0"],\ - ["colorette", "npm:2.0.19"],\ + ["colorette", "npm:2.0.20"],\ ["commander", "npm:7.2.0"],\ ["execa", "npm:5.1.1"],\ ["fastest-levenshtein", "npm:1.0.12"],\ @@ -20238,7 +19590,7 @@ const RAW_RUNTIME_STATE = ["@webpack-cli/info", "virtual:16885aa8448c33477ea2cd730ac3a5bbbcb89a3f570f5364364e7dc5830b16f19367cec64b723cc62ddb3078b4ee0f0ce5d244584279bc98369c8ee9e5959a27#npm:1.4.0"],\ ["@webpack-cli/migrate", null],\ ["@webpack-cli/serve", "virtual:16885aa8448c33477ea2cd730ac3a5bbbcb89a3f570f5364364e7dc5830b16f19367cec64b723cc62ddb3078b4ee0f0ce5d244584279bc98369c8ee9e5959a27#npm:1.6.0"],\ - ["colorette", "npm:2.0.19"],\ + ["colorette", "npm:2.0.20"],\ ["commander", "npm:7.2.0"],\ ["execa", "npm:5.1.1"],\ ["fastest-levenshtein", "npm:1.0.12"],\ @@ -20384,19 +19736,6 @@ const RAW_RUNTIME_STATE = ["has-tostringtag", "npm:1.0.0"]\ ],\ "linkType": "HARD"\ - }],\ - ["npm:1.1.9", {\ - "packageLocation": "./.yarn/cache/which-typed-array-npm-1.1.9-9559c95dfc-90ef760a09.zip/node_modules/which-typed-array/",\ - "packageDependencies": [\ - ["which-typed-array", "npm:1.1.9"],\ - ["available-typed-arrays", "npm:1.0.5"],\ - ["call-bind", "npm:1.0.2"],\ - ["for-each", "npm:0.3.3"],\ - ["gopd", "npm:1.0.1"],\ - ["has-tostringtag", "npm:1.0.0"],\ - ["is-typed-array", "npm:1.1.10"]\ - ],\ - "linkType": "HARD"\ }]\ ]],\ ["wide-align", [\ @@ -20438,7 +19777,7 @@ const RAW_RUNTIME_STATE = ["is-stream", "npm:2.0.1"],\ ["logform", "npm:2.3.0"],\ ["one-time", "npm:1.0.0"],\ - ["readable-stream", "npm:3.6.0"],\ + ["readable-stream", "npm:3.6.2"],\ ["stack-trace", "npm:0.0.10"],\ ["triple-beam", "npm:1.3.0"],\ ["winston-transport", "npm:4.4.0"]\ @@ -20789,7 +20128,7 @@ const RAW_RUNTIME_STATE = ["commander", "npm:7.1.0"],\ ["dateformat", "npm:4.6.3"],\ ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ - ["diff", "npm:5.0.0"],\ + ["diff", "npm:5.1.0"],\ ["error", "npm:10.4.0"],\ ["escape-string-regexp", "npm:4.0.0"],\ ["execa", "npm:5.1.1"],\ @@ -20802,7 +20141,7 @@ const RAW_RUNTIME_STATE = ["lodash", "npm:4.17.21"],\ ["log-symbols", "npm:4.1.0"],\ ["mem-fs", "npm:2.2.1"],\ - ["mem-fs-editor", "virtual:2acb7f847f03bc2bd90f7df00604776d7c66477738a3b8df4954a29601a0fdca4ccd942111de77aa272590d0b875d8add6606fc244946461a413979c573cc813#npm:9.4.0"],\ + ["mem-fs-editor", "virtual:2acb7f847f03bc2bd90f7df00604776d7c66477738a3b8df4954a29601a0fdca4ccd942111de77aa272590d0b875d8add6606fc244946461a413979c573cc813#npm:9.7.0"],\ ["minimatch", "npm:3.1.2"],\ ["npmlog", "npm:5.0.1"],\ ["p-queue", "npm:6.6.2"],\ diff --git a/.yarn/cache/@babel-code-frame-npm-7.16.7-093eb9e124-db2f7faa31.zip b/.yarn/cache/@babel-code-frame-npm-7.16.7-093eb9e124-db2f7faa31.zip deleted file mode 100644 index 1c98cc9480c568a4ecce53934e24d3c3f80f62c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3934 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

%Asr7S5>dgGqojGAiQ2qrB;AK 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 diff --git a/.yarn/cache/@babel-helper-environment-visitor-npm-7.16.7-3ee2ba2019-c03a10105d.zip b/.yarn/cache/@babel-helper-environment-visitor-npm-7.16.7-3ee2ba2019-c03a10105d.zip deleted file mode 100644 index 525f2b2fcf8d8325fc1ef493a90d83c6cf9c58c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2953 zcmbVOc{tQt7#_0-Aw)t-*6br>>B=@^8-_+v*^M!n8Dm!sH6k*Xiz%{POEQIvbS=f8 zAz3P+Z9+&RTeh3TP34Yi?!9@QdLDg${LcB~eDC`^-#O>~UIzpSEDBf)lZvN2pC?~G z0_-u6=!5Yf5Pib&m{3iJ?=D>f_-3hzx0g2t|AP$8?_~I4@IjambxdG{e+V&H@W5h790>zajNPoKth0QjlAz{gZoh%;!d$ zqRB*$rc7EN*c>q~rJenki6ksn!|UM^4{LfTKj-he z{rXs!M>0FZYK^21da^*nL;U^CMikk|MFMMfH#MwYf{}FY%18|a%Oa89kQIAPq@W@@ z0umg>bsB0nh3e?VSMHPx;d(pTW7?C&=#B8*^(nksH#Z_SINHpRRnhn2^5zt+*YeBD zcx=$g?Z7jpgT1eF>h)vQeE4GCyTH-@8R$%}44sR}3Wa)6S&`jc&~B7Sve zvF^USUdF1OQ<8CD_d^EQqre8+h48j}N=II}E6;0>L!5a^!Qd7tQS8kd@{seBe2DrN z2F?TE4A*q7(8K~!6%{dira`(xIYuEM{;h;Eyz?Fnw#}&$WhASL;vzKzr^LDztl-RI zcZ=wf;##V4xo8u&esP`=q7_N~t30s!MTWW2qm1C_=HfRm=2sL z+uPmA=PfM=YH~IB)Ao>-R)G8tChC6D{^XL`AWp7F{Kyn2LIQ&aW>LDAlLmGJ)F>&o5=#aYI& zOFqLEmi<2m=pX2VIj#{98cikOTA)Jh!%L3O-<0kRCY9gpA_&4@S!gKC27fIxOTjHf z81s&jY4MfPOC8pGp8CM5^U- z4HCFTA%S#aOVg>J7(fOr%%Tq49|oaox~!q1TiRG!&wDGj?hX;5Z;ASb$%)tq!Ar=sN(g$oxO-uRW z-Ep6)(!KND`*&+GxnH99O*E(&c7Q1_nx-ORPQ>aW@5V6clBBLTP>SIwhE>JOFshuK ztV8#3kI~&gBZ$<+o6yJCUaPnyL>U@R$&18Dv0N_ z)*p#uGZg9i$ni(G_}!Jl4^ddUB&M73pq6WO=8v5xPfP;0sO5TmX;_?&5#$*Xgk>MD z2W(^TJ}-M@tMmOEtE?4Hdexbc#USxN8(1=LXE61^&VMFI`!6r|{?&e|L`QG|-WC>VGDip*kdvJI;-7`NMuHi@VRQ+kv3@S;6X?3jaGEff{qA?aGH zj{My?Zi|0~MWm;hZ@;cyiKkGy6B5A7H@>_po2;%PbMd%lcTQPW6TVk>OZHIZfjkct z$OBsQWmD;^Q}S2nkG4*77SS;hxuxtOtqK)tDH2kg z2u^!xPBZXmH_B>_Z$EFX%F1ZI=2al+FG(2?&Ap+AIMt<@g6vySbPd`=XvrJ2)EOX8 zKkMt(TQD`&^i8mLKyU$#LEm>L>=*huW=z+HZw$zfQojIlQdQTd{_9=7Prl|}I5A`D z#-4sd{uSYeUgirp=WecdGaT@un9_}dfAuz;5^y-y_muxQ&aq#_1~>3;hvBfSp{;k2 zYnsf78Pf{3Q`;cR7lr<|RO>aGLr@g6`f~&v#pdjUQ?K=U@gLE1?hWtc|LWm@fUp4o QY$MA9V6r>S@1Je=KO2Q`KmY&$ diff --git a/.yarn/cache/@babel-helper-function-name-npm-7.16.7-aa24c7b296-12e2678236.zip b/.yarn/cache/@babel-helper-function-name-npm-7.16.7-aa24c7b296-12e2678236.zip deleted file mode 100644 index bd14dd9b60b2dcb20c147e582e6189d861f12d33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3885 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 diff --git a/.yarn/cache/@babel-helper-get-function-arity-npm-7.16.7-987b1b1bed-25d969fb20.zip b/.yarn/cache/@babel-helper-get-function-arity-npm-7.16.7-987b1b1bed-25d969fb20.zip deleted file mode 100644 index cf5b13d58cf6a9132f135f17119daae71813be2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2723 zcmWIWW@Zs#00D<}*EqloD8UP)^YT+t<8$*rt#y3nFgxr>Q`A&7;6!IWgPd_0|9 z{eoR%gS_)^8}RIV9WG$Iwc)z$hRb#A}W&h@sspqG=dn|pvxbWN!!5-!}ukW(*6&qLGRoyUuE8Fh&ZTZid{SHL4 z>^iU{y`8)4xwP@Dj}B5UbM+E0edl=m=HC3-KTqAVNRPg(AXl=@RyHucALrh?Ig@$s=ZcEvoBm~eHUDqd zxcn1sj?%f>=Eb(B&8tg%-bS8x8NFX)nWWc+C9P#pSJAyHc0?#+XKQ*~8fT)t_Q_XL zEi7>%mg$j9dwf2Z9y_fb@gPp~gYk3LaE?_hEQh2;(syiEVV(Sv%X`-Y%kbMQ(_*GF z7I!WX(b5w2ziv4-U~Q^uR@)azP1lpBm%50BZ3wbe(hg#*KFIV+^z3I3*Xt|d+-g^@ z*fz<2t;iaed4@GH29t_+owzxb%Xg{eQ&%QQ-50{$(M*9VEgNU=I@@(r{mJ4V-lF2F z2YrG9wK`Lq^p^hGzU!f>cY{}4yTh~~g_;gwa~GC_dnd&PI$injP{~5*Rq5G#TT*(S zb%eG*{eHOr30mUj@7lL-BPdZbGBB8voVbHr9bJ4~^>R~sC+y`rWWdu>Zr{38&!FXv ztbp>F4o*eW+`DEPzN?O~etqkC_e4iTW6MV@ZR>vPy7Tk65@!V4jW`5XnWZxRAXNpgPmOU`d*)nL!)nF`e`8 znwp(Ues8mITj86lZ*mzn@$j2%Fk*WkvL*K-UoBsNi0cc5bB6PCM3h!Y>((onF+SR8 zcv0=?TXu8qkkY^MPZ)6*Fh(SYLQZB9TBw#M)xBW^hUi`(wj#^C%)FG;3cal2+zF1} zM+^j7-~SYK_Sf7Uaz4zFU+(D9)gGR=U*@UIzH&09u<-YN-%Gm!J_t;z{QPXTd)EU& zo5}BXtZ1#swcq%7)p5t@I}@cR{?PeYU2>$3+x7B-`oda+h@6M+40EP%Rah!Q-ya*F5*R_U~l%-tF#N_5`2t zD4YG%{L7ylgO^EO+(K0x+mheDDV@7z-EpJIY0p-8$ku*Y?q(WZD3DOVa!H}N@9b@> zxbNLNjWWL1bX-a^UL3X|V}9-XU&@n{b}>G&KbZP$YQfGmpY?yqOFueZpuoNB+*g%L zg5i~Oy?pjVA_`U(?_l$Oqz??#L|}PLdcYPWCTAz6rvigDKd*HnG+=*gJNa{&T|BL) zr?E)fw&M2Y3ClL0&6wSivMVR@+y2>0Vxt8<3Z0l;86TJCr+th|*;-@Unu=8^tZOe^ zu=cW%PwWNZQyR0m?~&-U)+KJ z9GlAP_6!?W)hv@8GAkWV`3AnKoh{<~OWzlhKmBIlIX7^vyXIAQJ87Mx!cfV}$vtO%@E{I=q zGuilmoEEF%lN&1?&n~p;tlSf`C4$q$ROV;;j+_IIB0WwV#@SI>QWKHk3_n=&ux z$R4|9`SkJOS@%ER-WmLD$y)!VbJ@Pl*^$G(DLH)qbLYVQdSTD=1H2iT?3r=b-oQi- z25%if6iNk+Pb1lE#%J zn+>h|VF3WM0=>*dSkcBzs`KF`Fw7E=Vd%{(P>}`$ZykGp?HJO+2vWeIh7)=b2Qz<3 u;~lchhZT4*f4~9@J;x*LF=ZpwAISMXz?&7Qp8?p$<6yW5EKT;XgLnY?`vNln diff --git a/.yarn/cache/@babel-helper-hoist-variables-npm-7.16.7-25cc3abba4-6ae1641f4a.zip b/.yarn/cache/@babel-helper-hoist-variables-npm-7.16.7-25cc3abba4-6ae1641f4a.zip deleted file mode 100644 index 81cfcbbfad0b0cbda6a224726f3a8507e47e4f93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3049 zcmb7G2{e@J8y{m|vy62p*DhhigqX{OOO0L4SSQ1bnS>EWYK&~z_fVItA+nda%}A(Q zDA#tgmZh;IiHg$39o78%=Nz5m`Of*?_dDl%e$V?p=Xrk5&lbVT1_ErFam^st*Uk4A zKV$VHVsXcPiCB^kE>P2U+g~>Ue)`qe1LJ}7`GtqtHXa0=k3TLzoj^Ph7^EJI2{?iA z_z@Zi;QD&XBE1Ot1Rwxl&jtYO-x-kQVG}cJ2QxQ&1aS<)*Rp^Tgxw4ug4GT9B~bg_2lbE<9xy z2-H6NRI#q$CI>CHkvJP=-Ris(^)6R`9|Ad338`bed(`$%Lt-MwkE}uP2FV2)5+vF;YxkRV2H4^cdUcB zPIDt?ppI@#-ER2+mX+yVc<-OBeZgLP)=3S}yx^!)ltTyUH6xQ(cvH0&6xP;!@cw5d zfRXU0eG9o%y{LUyo`{bwrs?mWjM2@NCHmHNQY|WIgdq=X`s<5+6k~2W*?{j|(qMb% zK@sU&d!ki*pa!2@%r%EJ-5Yk7q7|cAEs3bxH(e(R-{mO{wWf*FeaA=sWWD`1BqVCY zCO9Q@V=UBkT{Oyh-{Y7g9L+ID62$ZC`Cbu{SKWZ%8l*=xKv_ZkvDiIf!maaov==wV zNUigQR5Tmqc5=cv@>UGNFevO{D^>_^fhT$&pB3s-vy;E zcEQ!fvjAoh zcnDy7V$s}L4t!2{Y)L4&3w!Ds*=acES&f3(@cnOg@T89D@k9d_q~09I=pj zib-K+FlHBmm3Ofyvv8Phnk+}_*YiLMvu zVU%OmmDTVbY2_Jr5krA<{G&ynJ&oRpv#>n!N+djidLv)1Z5I@LM4gKDgHk=PG5qSn6h{j-FLORch;c!X>>I!HH7X6(AydxCPeuo6hk4&su1XHrTe2RTK%+%_(Ue@q z>uV6kop~i~BREUz)fmT~$6*^?m*wF@ zXpA*`Yi5T+XTiM%Zq>&jGuLx8=F@l_SE42!f^TFuy*rd3N}PdCL4y9 z%K7+#qD$=6cf0Z~h*Y*^ztU98$iQDKet;n!O`gzM#O=181+(yPaDP_&7~kXgo&$He zBh$f@BAAJFZ6Lb`Sr?ksH>lS~2) zcwGfn__YoFE|~LAjuYF*V<$O#^OoovijvZYf)moG>gvjCN*cf zjtus<4MAX~-d+8mnBw8g(B}008^aYMqsajRuE$T=yQ>tU>yl9)?N%l5W3xsBGwpLZ zom3&pyMo}$V2LM(=|Pzt8K(-+oXBBgDShPN#h%5g4;5gQ(bSZtfA`EGojsGF{#wsH zi|y>5UQ1&oWeiWEKPN0agLy?jF^1Q(O|p+6pY_ZjH9Ou-trvwhh+&|d$5IlPBMkv& z{)W=wLi|$0RDdcfl*DnT0$cP&pfomo50|qR;X%4(i{Y!=yzzf=9;xH^bEOf)ZL9iD zzppJj4*U`bn9g5ohzl%x)=W94I3AyP#lfnRS|{+SsIbTk+Mau-Hurki_+{7zhb@8y zXvDg`Dq`@+S6hT{EBF=|xEo{pQ}FMqYg-NV?N-cs-KwIP zz$Fo7I|Kf%sh9_6;%}X0Kk&mD9kPRi|8KG}BWxmVRjZqmf@zEJXa?QyAi}q~@pF2% xP7Wq`Nkrey!I^V}c>`vSwsOXgAcmYfy21Z5h%JJhV-tvr@!Vm|J`nfj*M9<2oEHE9 diff --git a/.yarn/cache/@babel-helper-plugin-utils-npm-7.14.5-e35eef11cb-fe20e90a24.zip b/.yarn/cache/@babel-helper-plugin-utils-npm-7.14.5-e35eef11cb-fe20e90a24.zip deleted file mode 100644 index 47da224221a416341a9ed9b96b4faff9463d9365..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3395 zcmb7H2T)U47Y?C?CJF(B5DUGR1(YJaN)w`jRDmTXU_$692m}osq)0?cDAG$PBCsG` z5fxa9ERj$ILzSkWfUXM*tJ(c!es`AhX5PJT=AG}Hcjnyhe9yv!mJSTqGp&kY&|jNx zH@4l?1LF$6jK;Y7q2NBU7C(G-58%63wOpKC;HZD`5c`1#5{~kOdrNzw{19#)(tf^f zC~90F0Q6UixyoUJF+czSMh5`M9stGktggQKd3^_%31(D|wPn%zuzD?)q+a#XBZjD` zgYHhmUr|x5_Vdb0(7)e#+2YooWfjVlKCY z>?rn<7Y1~R0rBgFyt&Bik6T?xXo@h7;mN9IT|vfwbO1sstXzlyQ6cHyxSwz!8^RHeSD2hN zC7-|L!_hfjP(j!Ln@rdJo_32~nsgL@r!Yrv4JxIh>wtg}ztjuS-&tTbX`EEC9;Lf$ zkEij8&H+nEaGfKm;4O%7VfTm+yyE)Ly9@NVt*T(^0+KMApmyL}uHJPceNwTbL2yZN zU9u(-T&|ZTf5Tob*{AW@2%g!jKxIZB$SXb18EXf$6v9>X2jA3kVG_kdebJu|~1U z3yR=|Quy3cR4-;?w}NyM?_rlwubb~c>;ozUF^p@R`U;2xRZuW=Zi8y?5(+7BZ-6gCRfX5N?8uov5VFUt>Ql=r<2I?dOCLn z3{#b#0dw3uCDSuE0YUJF98(HM4%!ZyGykR%p=dB3Z+fmiR5q1gtK3?3DF0&L7i?)B);%a&y^N(U%e@3G1`~KnN26pm;zeHxF0%H5qpwg4HT!^wi-$ zR$AW(fQh&g<16K$#GX+;spCN3>ZENz1iBjj300G;kI#R@SFyc0o|Gaj$_rbHJ(*Or zIWgWW2>p$r{gN~@gs>U-cmW}WI`z0g%q#z5IN8JHi>)}?jCtT%+$_6NnXrL4DhROI zQ2w5^yrP;UG}nCC7!=;4)B)(=4C`BbP^E)khMggXXXcvoCmYx;a=dBc5HF6QjrJ1p zO{etbx z$!ByvKEw@kE%Q*+!*TKr>QYLfPtx5evMPRhVpo0x+Y^LqbT@kFLW>4jUC&Y_IojO_=|6 z);0l(;Etyq6CO-2?_~4H&opT2c=q_ZoK~e0fn8*13z-JlF}`zDE)QqtQ}uHRE~2S5 z(4E~H-y^M2tG^^-ta``uUQ4}Im94RVHnN+B*8EB+sK~#jOQ2V+om@M5t2UEd}zE ziAQ@e7g^X&H$_7`K;c~*H!_Yz)P~4E=cHnBp8GC$$+3bcx>;k#ySPf9;ls)qU zDBe=SZ_eX#WXF_G?sM-;w$SMwaQYfPoQvqiZ7CWVH4bUmByEpV#N?u?X8WS!`{=C} zUyS+B+Kg%-E-Z{6&-ro>n&q7W=hI?V%G=Qx=p2ph4xpS%J-u2PL82s(RyA)MJkDTG zZ8a>}>3YL*Z-pK3bS`h{@>e>d(sGGk+AZiVCG+emj)Rbhr}NKOoe}U|3c+{;C-oZB z%7eoL>wBHnHJj}E58JO0yJnb&R)Ns~KJUC!o;nmIgjWHkd7Tpa*oS&6> zzqHNfSog8Gey20I@Y8O3kBpA6`K5N&hiT2DswdVLAt9sFG)D9vyfm7_!cVYCYR7?| z49ipv8%U|%1=(5@7CVTg;Tbky#}JZ*nm6=$NYW3Cb%{RQNrZ{XYbIaeEfPA$#;v-?kk eBfFB|zvlkGC)vV;o?#CKw0jYE83D_@_w*-sN>K#> diff --git a/.yarn/cache/@babel-helper-split-export-declaration-npm-7.16.7-5b9ae90171-e10aaf1354.zip b/.yarn/cache/@babel-helper-split-export-declaration-npm-7.16.7-5b9ae90171-e10aaf1354.zip deleted file mode 100644 index 5249cf09fe325a6cb95991b0c87f5fe71ba8602b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3230 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 diff --git a/.yarn/cache/@babel-helper-validator-identifier-npm-7.16.7-8599fb00fc-42b9b56c35.zip b/.yarn/cache/@babel-helper-validator-identifier-npm-7.16.7-8599fb00fc-42b9b56c35.zip deleted file mode 100644 index e3f61150a1772e2aee6ee86f07ec1de4a6516ca4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9288 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 diff --git a/.yarn/cache/@babel-highlight-npm-7.16.10-626c03326c-1f1bdd752a.zip b/.yarn/cache/@babel-highlight-npm-7.16.10-626c03326c-1f1bdd752a.zip deleted file mode 100644 index 18595b7127d1197a6233e8426fb4f204389143ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3415 zcma)9by$?y7ak^%mJX>Q24s+-Q;-fRi4~NR8i(#u5MfD2Qc_t296*p7ksOeg5*84V zrDG5rLL?>p;SW~XU3ngtJ>TLURG7tH&(Ya(s3UXp=ek#rB6}_7!sg9q68!RHR>p4ks0_+{5X#|GrNC}zjR#FlQj9h$ zpt=3GT=5^d9{Au`nqs2!XDT5md|=>u2;YDbs|YQdQe$ zY+b>TX9Wuf>AIV~thAWQ-p=G3Zc1RnyH1Wg1ijn{2nZXw;ujb6bu38jfFaE6!ce3( zaebsVn(6U#ijNMlTb4l9QWM(}06(wL5MvvyLu~}g>L#g;qF~qJxp1)6FS4lXzca(A8g~i{svano&=;#c77elxdEkxf z97!S5%aeVt4rCGfKzH99XviD>JOkH@e#JkB+0kKOf;HQLZRj#3?ULGOgr=$__&&4j18K6dfMUk-PDfKyZhzv z=^Pf4gnGO}VRKq2vAzv@Sl|{*lenM1C~l^qReH3bF1d#JS;~3SSA7;DWmUzIhW#}? zhUW=1*>-+;)6!?p#jbtfT=PutVN{4Ph!9q2XKN1{Xj-p!@?SNE^wwhS>NC4+8J|i} zHlWYtfj^ZV@FpWK5pCWnqYGF)fZL71UB~0<6@uSQ0I04xw`8K1X&OOqWG=DY%0>+h za{j!8aG!b(E{?V*&T$K3br*VA5HiRB0Qi5xJG$8;0}xK$5hmBY$E2u(7s^6LbR%^I zM%Ro5OD7;z4y{c#JZl8r|g2V0> z{T8}Vx}#K}K3t83(bwE>oaMe^r#!MxubqgJ#a2yb+>(!)wXi#5PR=nWi4#pv?{`L4 zX3vod)k1$ORi1O6=A6c2E~L<;VtJ~e_4io4bE&eT#1e&BFwVR2YMqLYy7)WdA4;TO zMRI$YX+I7QjS1{dD=R=j;U>>aRX$c0aT$h)$hIM~!I$g1ARiaV-?o70Arp>k=v7vY zJpe0=Ot`ghupQQ-diiXGt=+(uc|{Aq@^Q!J5wl zTXtuO-+1WXrx)$$lr=k0w7h$;b1*1b9()Noxb7(?wAP5Lulb^{(3q8}NxZkwJ63dd z*pBpnsM*~l!t#tvVCXCmY?u<>rXDwUP4J7~{^yCEm5U|RXB&F>1}Chy7hm0q8!3nC zrowyIY(UY)Ngo966XjfwWTA=np2^{Gn=}0&Vsz3dX+mMKeu)K-EZzO zg$J8mc%I!Gz2=e-w-C^n%HHl&SbIzBG=!Pr z5a(Lv8en`x;wubCv9lwQxSf8`tHH9iY2y2bm_0jsE2u5hIB61jS&*+H zTbEyLFH?)|ML{8lpnHvL)cT56AlYtyX9Oz0EMDGS-bGt%@3|ke@s6U!K>g;pqd=eT zt23d%GOj)rcbWwW)D7~Hyp6f;>48{_`OL75WnIqqGV)T3i=Hq{a*BIDmsduJ*@{_p zTB_BHD=A%97I&m4>E9P?W9{T$+MUPW;)+MfT7w1w=I0~lD#y#NL~48%goW*1_LOJs zNNKcw3Qi+jRih}C-pk4)$@k}4+*JG2(DhY+i{pyDu~ ztr{efZ21k8IwA)AI`Pw%Q2|=(hzKOx z^m<<~F~hZPeAen9(S{{5VYBFkxC`wIed{a(0qA1N^=vfQeO(E#N`fIT3X>}h@^keF z5Ky)h=@6yE)S(53sRpWQ{>ATfBc@+{HF;kytI9H}Q;h2o4b~hKLjQ1T1 zW2!eu_bw*xbiDZL8zdk!BWsMM9JLc)S`6BF+Ckbl1s9fTG|(XeDuRBlXb;=OpSGfW zH2ff1{|)+$@E9t168e|k{rTociuc%7lr0aZKWzS;;h*~V8`p6Xo>aicT)CkSPv!cq zhmQk1raY-b{-(SMI?cVmRLL>v5%}aU#8Fc}wiRW!!&d$8F@J0EKgNBs$shCOhL-*( rzT=jE?B{XtColEiyo{u$`T5T)ZlD7pKEje5KAwjKqW@5g00937uN-hl diff --git a/.yarn/cache/@babel-parser-npm-7.17.3-1c3b6747e0-2d45750cdf.zip b/.yarn/cache/@babel-parser-npm-7.17.3-1c3b6747e0-2d45750cdf.zip deleted file mode 100644 index 3ea658b71a86d0b1fe95cbef3f8bc7e80b762217..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 396461 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 z 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

Iz(_L3^$(2vr#rM{Vj2NLoN`aLB1^Lz38- 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


J_ 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%0DIM}*O{RO}-%@}dR_JJuM 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

CfIkb8fv|h6QrU{cS|K-!a2?(eB#!;6xrWUc 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

U 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%0A3>Z1+if`((bEtLw4?@_O_W%Ff2#jO1gBv& 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̲#A?Ws)qXiaK(H!7L)KwUmH)lKDWO@3hC@jZd>_wM4F&AcL zo>EW@YUM)Y496V5+=2~fej&KjgvOU-O8yxaPX4YOX-KZ*^So|DExI(@Sz6YcR1)pM02*3Y^=w^O&>eR_e9itf|%qwn%bQN9xirHI!T2&L|U z*Y^(Mkbi+R5WqDS49B-#u<#)a=@n^r$o?Mq25%)f1&pgN|0R{>V5%|>%7TG5Dy0Zj zc#)+Da#*onX21v&ZL zdCzEw4!iQHPmaVU{C2%5NP5vAl3K)Z?VcjAlr+K48oJ8&NTi1etMFZ|!kLR-IkODGJ=sK% z|1e!kJ3ixKrEz3l>eG#Qt9m)}{{52YX2C`n_I|>sT?U4Y7Qt!|+05;Z)nj8}dnp|^ zP=dGem9YNB*J#3kW!WVC&smjW%2!8$0I%%)hTy;t+fmcHtV(b6btI}GQvo&N^KTxP*z({>bX{`KSC+)u0ieZ|eHk=V4IbA&Ei&4Z>~4OtQW z0-Z>Yh`k!b08VVV0JsfCe$0u;!ljoi;#rJmp|6yUl3o`gg7XvhBIpkiW(4{6gi{~m%u=HFpCoK)(dJoF93}`x9V&W@5ghCu49XAX1^**ENNV7@TSyTDXa?yX zZXpM8-bMwMPK^~U_@{OoYYzcv;pD7;_N8`)Pjjl0s$-Mw8$wgxawPuPzqbaB*%^Wbh{@kSqhT-+oM5nQ?;tRXgSy{0jCMJomvY`eBe zOC{0PE7e}wuzeKMC5XrhmjZ&aI7lBI@v@JZ21B71aC*T_nFR5;JPGu{UIk_0O%Ku2 zZ)9%tr)q8()c6DJ8G_A#=f6Dz!YYokZ%20@mJX{ z;}{(LzbOO-XQzX3A6xeMrjMKeyy-V2`D5Zg@;-%<@33vHPS#j%=E6wa6udf#$s13! zR8{~Ay(J-#3==QmjN5uFzNvY;wyOjfH+muxGya%R=h~LqbY>n`mN;rIz_Lo$= zO_)s`I_$ox{1@1Cz#AhfxsDP8Z3v#;f#=u&=&Mk}NY(y`7=jrC{!PJ`-}(yZeP<)M zRuxt{gXPl@G@n*{l;jl#=x_%*9VEVhg)}-5Aw9f~OyjgEXp5O~4F1SUIL+I;!~?@U zK(CHN+8`DE+m4oL7qD1@Uilp~fFtV3U0=1P2}lUNhQPTZVlI~v?^Sb_RD852GEy&) z@}w#Aez}TI7y`3UixpZT5E81uo6o%1a&6c1Y(obxDn2XoUE>`lo|`#uo+>`hQ`y7@ zG8hZ$*sZs$_yz*8!dt@kSz%EGq95OmTRQJi4?n!icSqU$z6S%>fjQiePs1tPGgDaB zN)lFa4)ce=irNk9=xK$B7(Mv?s&58=qkhD=|K#9TD2q#TvP*05PkK#cnZh*|?=V}U zC17Cg{;()aEI%T(0(bbPt(OqKfMNqgI=~JjiFC6sY3rvePm|Er@IQ}B?31UsxVSxR z0k$Hr%7@^N4~m)-z;uRMbfd%*x+*U)(50B*9CTHFol|I;nuaN0wU^U)X(L?paVc2=1r;;AfytXbj3PqRnT-w zxIk_e<_dP=RwE097U4vbRWJV<22}H6$vaBNcw6?kO)Q!f8p35@(G&oXTa@>%!`}^* zmAERv=vTqcw9zkJRxO)m*grMHgl^ytE4!(I`#`>4&X?!;hKvD>19`r0gej|kErVJs zP>t_IN|)s7RBr+1b_{c9!%WJ?k9}^~jU_?dcoU(Pl%q8miumqVle~vE_lHq+G>so) z1}Ua37c}D!Z^l|AG~=CqHA7_{XhuG<8EgO7%@|vg5$IwSHTO8-MEsyi?m_ZAERyFn!t=E*B-0A=DyIA=b{-C| z!i%q@n9l=th`+mv9TGV$wBINn3I?mVg|VKs%nj zV-v7T-t69+(vymeXlcRBx$~r}=#&1Y0c+0$`dE+2n{a~NOPHCd=*$%OCQ`hCN?`yk zRyCXO!H3BSG~K}g%wHWoG!CFJyhs1pr?m{ln9@q(-Jmlc)dsXxh!)+zqSbq01H;$b zn@xBfmQLuMx9!B!p-)AS*r$DuZBE34Jgxf5tpdx7iw4ZS5R+rV?$B4e0~RQQh4&#m zR=;A=|HlO1r!M6^!WU%^&f-eLeP%4qnfx;O5oGd5@Jpy|?)!C1~? zx+P(Hec>4lb}VnU z*h0wV#>%0*qFBXp3p2JPbbVxAmnw#|8WG#e7fvGxYt+lexn! z`=0!G`hMrhy6$86{VAo|59eaSFq}NVG3LS_^fz9l`7c&nNa>dn?Fx{)U#Y4Ho;FIGFNn3ujU3XobH`YTcCd+rbZ zlB;{ITu-^kaftR?*aUkRNfSnC3HQAT#11=$9US@S2pXt>Jql1^5T)8>F%%IyOLJ9N znQx>{#kmEys_sUIBk+Dmm@WVMTBqVOXPcA>wLm8IooEJRfX&laxj#jMsJ$p*qy8Xt zwQ7FA6xRiw@he@BlU4s5ZeO?>k2{~8r<;S6uaiuuewoGVlinF?V zwP@eLP?mYP5MQf>taah+?Lll$y#r9`-}3zHt3vH)Nh-;fVm&q@3OZu@#3q0sMn<7h#8oS;n1x$yv_xkR)J(7#$xkoG~Y|hTks6w5v6kJUB-FkvorcNS__{zPxv~Q{_Iu;LzM|(7Uld zFPBAvm4v@TBZ%(%Ha~U%?S*b8(KM;5B6>u%#oTBoKg}ZoiHo5T(muUUd8v zBP##NCFRl3YE5}Gv{&%4$tC7r63pu#y=z0hN73V48(x58!(4jHu56Rk{FWFH;(kD! zQ)}iCZGh#)m*|6_x$c-RR-k2Y^<%#3kfxr6T zfF_!LDeFZG!ht&)>%l*Fxc=pb#wV?R`Jwqt%NK&;J;uMXj1ouBxC{S|_Fkq3|AH|F z?$iqNVX6m4w{==CdSeTbz&OyI?8*}rEU1hycZP2&A=4YI? zKCI4!hVKZzQ>V**lp#*kbZeu(kxTOfif7LJ=#OMxY=)7_f-1U@Iq?B}SBWwWf;o4-Ot6TK&QJj;_)uqPC6a;c)CqhiJmk-5-o2wt+=mWP$l%1! zns@)q>C)D=bI+M3(FiVRq0G$Ygu9?I=S7aDS3I)-AWAxB&XHUk4|W*u6T6(L_3!R_ z2D(KAZBqR^P^ZQ?|3HQuggAMT!yx!@f2xT`x38KHNf@fcv(yCdb>#;-r*hzLG}NhU zdDHzEdAqv=WkO`E+_B1|x;?mD-msn|Z-}RXn7a(^rmSX;i%uB+;ZmS~B=K3LK7s5o zbg3%O+Xx_SY8Y}c$34+PP9P~Dh5S@Yn)O(9!o$ix=fNW}LvThfFm3t4v0{%RVT!92 zk#TMdg>PUp@9{GGk#e9Xkxk8y5%BNrfSJe+!qAT!vV#HQSQU2TK?T3dsQiruGC2j@;0JK+^W;UcOG0(= zO>#v+eiX#uZZm!BFP zRcsrE|5N^tAnFH)GN?L^pyO##DZ*qZ9PuGl1Lus-VirK|G|~rY(8-Birl4V0e=ul; z>0pfzJ}r~$B?;;-Y$l0gDvCu1J$AXv0jv9e?2VUKG`j*r60F}OU-B-X>){0;nQfG3 zMJBs~?4{as;aUfenzpBn`0>TRVqV;d!92RJ-QTEHb%!xhdn`35ww*7EDq0!?VTUf;yq6x4U(FC0y<(SY6g?fBAWPJ|yvY{>c zp*>W@1VAr>d=I25DDOV=%^9nj^X$yGiai@LVj$&tH)(^ymj-LzM-WY?z{+!oUX9KY z<{@oqm+ixoiS!R{HRTr9#41gMqtTGwo05%*se}ll>-|F{z`m>cCe)+L;AI22m=tc# zYcKXynKoP2)6K_IwYfU~6;~WO`MFI{(zO;`=K@XD!80ot2}GWF&4eDIL4y~1j2p5y zPX;Z80fr)`k%|+66+<#VdhE&T-&jDA@-R2@++4V5?VA$D8((K z)I$+(p>Vt!J|kO|>Bjr`VNGpG`}hjbp7Gq1RYJjkA0kVZ3ZGfE(>Fa_x14lEYArt6 z)hmk(Rj&wbUG|v7Wk!{ztpD>^Pcvo@3TH`q3TCEEN$|=Pdb&*G9VhBGZMo8RflHGU zx&TX4ojO#S+(4*urwnOO%ig&g$nfO3mULI=RJM92%H=%gfPx*H9rMkx{qv4e(0qgB zIW?3DGU;Lzm+szp@9q$~>~_OQaUi#GxAVB-iJUH(o{Er!%Y~Kc;;SPWeR~CKW8|Mv zakIIjpk}|Klvsp3anl%7BRUy6YE-?~&e=UT8sOb-H TCaqRn0-Lqk1(!qCpOh0 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 L^Z$ta$EW`Rm?fOA diff --git a/.yarn/cache/@babel-traverse-npm-7.17.3-c2bff3e671-03aed531e0.zip b/.yarn/cache/@babel-traverse-npm-7.17.3-c2bff3e671-03aed531e0.zip deleted file mode 100644 index f435a79f83722c865a3d108257e019a31be95068..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50022 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 diff --git a/.yarn/cache/@babel-types-npm-7.17.0-3c936b54e4-535ccef360.zip b/.yarn/cache/@babel-types-npm-7.17.0-3c936b54e4-535ccef360.zip deleted file mode 100644 index d6067f111a62f1672bc4b3470f14d7d9c94988f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165822 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�Dx^C&m+^ZAGWC`W!l_1_%H zzb52=!Ohgz=F3Vs85{jm97&6?Zg-6f0LYvI0l5Dq!~aKtU)i&<+ZWR>w6z@9*=oI? zs#5ntDw?SdHiqUU4tiA26WJS$J&nlU5`P89_Opg$#^Ok=*1cRopzBOWfs2cPh+mXY zq08)9dhd%Nqzqo%bfT6uT87I!J->;?M9Y2BvTe-$$V5$YTbk#daa!66Ez{m`x@amJ z>Ut+zWq0nRAK0^1`+PEMc#Ti;yy+^dT!|3#;d%K`fcMg@pJKzFX>_i8)n|PN_@2J* zdyr?VsB9Q(E2x2oRdg3}ZrO?~bWqntHJ6P2xKDAtn64P9)ctXR&uT|)uTEiA?e<)<1j*fo$(M6-ST7_GyuHy5t5HbuqXTz9|8@viyfdKu?gPj_U z@8nCn?2x|3+JS~qNxxuUhHNfp7Iq|~cEtXU1qCrjQ8P2R8;pca+2&+F}1R}&4 zJ_9Kq7Jc+cz_qMQz#&*(S&cxzJ}nfI_c8|g7uN=DXO)CF={O7u*hnthsuxX$S&V<| zfLcXGnr9CEx)9gqI^R##YoI@FV<&=gjNfXJId}P8&V#2}jxTgHdg^4!up%ohv1|G? zT|`P9?H)#i17;Si^Y`pJcq_gf)eLC2n#fv%vI`+nZhmol7PZ+45}SHGT-a;YE06uJ zC*ZTJ@{GxF0STrNXYUMa5n0DQlGT=t5#X#{7vv3Sd2haEZO|F8X(N%KaLeKiZ}Zv> zn^sJ-25lWQFQ}>y0F<$pInq8p$Bz5r?)hrBvl5kc#q;;1t?0Rb%-oV9sN*tZAD&ydRgWFW zu!^-$)$^pb%3T9Vki>`3)v`)%(YPK&XZ?nYvss3;z0+^Is`I2tIif4Bz2ZKM-iSVb ze3s7Keh$Ojm09z5=hxa8uN{kUdWlCTxwx+w9R*J5iOPohcGlXsmvw=Yn~Bg3aVxY`!D*VK|Ct|-%v`)p zu3H~b7?$S39f{V2!>xz%lj~n_qd&Ffet9VF6#D%I|H^L)5jbifD^NJqtHk5P&dMoc z&cHpNs zwCtA=9kQ*sQqxMO4sGOws}~h$#rCJ7Sr{Dx4S>73q;=o9c`1dEQ0MKb7wEL9{1a;7 zM%%LaHR~h)CWKb58EmN2~BUvNhk4M>*2(P_rMaa zAyhJd=JKA?Eh_XPq^lv2oP zE$kh1e9+jxyg}4!kPEH8^A6d2Qu#R~=8I`@Dtjtkg-<{bW_&(lWw2i~=DK zgCK;;O69@%FKO>IS+U-nNIIsdLoN8g^5}@nxyCIg!drwv$Cg$u1*A$Z)fGXvIUYY^acg$ny`D*!Q*A#)5Y%2w!iu!p;+)sd}` z?i40#Ei_24 z{NNi0XiiK7d7p~s2|{Xz8BV9tBEKO2)>802CUQ$&EYI4MyUOm6sENu1IEmT(IYK~d z>@yM8vyK%q@KVyZ7>=YYLopjBSOsY`7?r8;o@CfwnNO5nKiD2uS!?4A0(JPp-*F(* z93<9g?znt{s{bh2_<%q| zrxHUfYB8GL_aADv$`jK9$Vy3)LeSkxHqJ7wu-xi^145zw;-rlncdnj(wKV3wHbM8v zpy~x&$0TV)$MucJOf3I@l)Yngrp>lB+_7yt=@=c`wrzB5+qTsm+qP}nW+&;`-`)G{ zGv4#;bH?7^^CKf;1U2q!u2og5R?RstDAnwJTi93a#ZO> zazRfQ?SI}`}EJ+T_$EE z=wAK26~6=PvsE1-6l61hk0`MI!mskQTO7m+A%%TnxCX&MaqC`TlV;U&q`c6}nVRPAoW zV8U0{JNu{~U}1WqGMo3heL9`*9`}9FQE2jQW{f@b=od2+3L4aydz4W*-dk7cJYS>m zs5G>1dO7k7oW*ZLZznORC6##2jB-Q7oWf0d8s(Z-h} zK0w^tB8e2_bMIAlLg%0DPh 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 diff --git a/.yarn/cache/@cspotcode-source-map-consumer-npm-0.8.0-1f37e9e72b-dfe1399712.zip b/.yarn/cache/@cspotcode-source-map-consumer-npm-0.8.0-1f37e9e72b-dfe1399712.zip deleted file mode 100644 index b80c61c493f0a63eb903d71dd304bae19b65528e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45552 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 z%0D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 Xs|wQa2!Dh_e|@#R9{VI^f3*G&5q)@_ diff --git a/.yarn/cache/@cspotcode-source-map-support-npm-0.7.0-456c3ea2ce-d58b31640c.zip b/.yarn/cache/@cspotcode-source-map-support-npm-0.7.0-456c3ea2ce-d58b31640c.zip deleted file mode 100644 index ae1e68e422fb6e8d69838f1a35f172ef6858301b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16441 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 KJPDkC{Q7@^vtC&M diff --git a/.yarn/cache/@eslint-community-eslint-utils-npm-4.2.0-434cf92d50-ef8b20b0c7.zip b/.yarn/cache/@eslint-community-eslint-utils-npm-4.2.0-434cf92d50-ef8b20b0c7.zip deleted file mode 100644 index cd12dbed6235d647c668d25f725f95de4762f1fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61736 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 diff --git a/.yarn/cache/@eslint-community-regexpp-npm-4.4.0-6bee7b2314-3d9b740479.zip b/.yarn/cache/@eslint-community-regexpp-npm-4.4.0-6bee7b2314-3d9b740479.zip deleted file mode 100644 index c8e3d8abb9bc9df5d8698ebb0487e470c8a877dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53695 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�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 diff --git a/.yarn/cache/@jridgewell-resolve-uri-npm-3.0.8-94779c6a1d-ba6bb26bae.zip b/.yarn/cache/@jridgewell-resolve-uri-npm-3.0.8-94779c6a1d-ba6bb26bae.zip deleted file mode 100644 index 02ccaf6eac42cea7a4051db61ad70c8dac0bbb59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19479 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 RKnC#xVF@b(L$4c%2LS8sJkS6D diff --git a/.yarn/cache/@jridgewell-trace-mapping-npm-0.3.15-7357dbf648-c889039e05.zip b/.yarn/cache/@jridgewell-trace-mapping-npm-0.3.15-7357dbf648-c889039e05.zip deleted file mode 100644 index 6cf18d7286f5e41485d847eb9fdfdccdc19b6c19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42781 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 diff --git a/.yarn/cache/@types-json-schema-npm-7.0.11-79462ae5ca-e50864a93f.zip b/.yarn/cache/@types-json-schema-npm-7.0.11-79462ae5ca-e50864a93f.zip deleted file mode 100644 index f28a98d38cc32c8a2a14de2464b47fbe1c27bd6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7176 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 hEXAMNPvjQ~eC?LynaP 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

D6hf#)KNj(=<6mi@*gmpo!d< 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 diff --git a/.yarn/cache/@types-semver-npm-7.3.13-56212b60da-0064efd7a0.zip b/.yarn/cache/@types-semver-npm-7.3.13-56212b60da-0064efd7a0.zip deleted file mode 100644 index 6d63bba22be12e5e3622cc3806b860bc73fdcb52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19755 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 diff --git a/.yarn/cache/acorn-npm-8.8.2-9d518fd7d3-b4e77d56d2.zip b/.yarn/cache/acorn-npm-8.8.2-9d518fd7d3-b4e77d56d2.zip deleted file mode 100644 index c79441c782eea9636c5436e4fdd6575c9d77abbb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 120332 zcmaI6b95%rvo0LlHYU!*w)Muw#CG1;#>CFVHYa>zCllMo#I|+kcfNc6`PMnN*Xr(C z-Su?!UiDN}ckQh#2ML7*_Mc7U_Y&NH3IF$i{O{}lG&47}2b#IrnY%D6|F5c;|9@3u zQ=qfM{{w*gKLbpx{~H7W2KQetWcnED%l}VV;NMR4zk~kE9`;xVdY}j#bZ<7jqC7`X z?!7@Ec${zbw$q+I?gf(I1okIN4^0F=YeWB(Nn!6i&Wg4~nfZs-@BJL1|8HpjZL|)> zttSkiJcx;cHdN0LIrPxUdMC0y$8Cf2q53P&0awwX*z{Wl`b0Ys0wOl_b9-avu@n8v& z5-eD*E5E{w9?mG9pA?yZtA8{Ij)w2bf#A8ARU~A^U@_&F*I&3cAek85!2kQ)NvMS8 zdV5TED!*gK?-BtNT<24I>w6XontEO@WjQf*HgLx9^KC)tB!LNrgK?WS5MG=VRC(oP z;@HsIH$9wNpVy)pN*>skDqgsgw{$XR-y_}pnI3ro%a8PkQL_uqk4gNJ7fQ>(>GP&F zZQxKwYA;g34Sxf6G+nhN*A4s${`lI>vd>8oS>eIYH1`%5&OHfcd1lf5WiLejl_|=o zX(LAkX&_GZhj3aO2Jwe!r;O3~&Dk1lFA6{o1X&O9<8lX=xe;pRO17aLh8&)`GMjzk zhHa7?pV@F1`baito13{+Oqq%dW2=CtibA{3tbHh<`#QTyUrbZ)7rF}-rE+<>y1?eX zx)><&S2_NiC7kZ9GgV?3cD1_FNEELT5KpA5)QhBI;H|<|7Lx3%~(|GI2c&F8YCFm{{!`3vBqTMa`Exvj|pg|jrp8bE7kzDP}PM| zO}m3HNJbDv+GCpH})(@YcCGbNyC*3Z_2@ zweVgICwMOT^w-d+e-*t)vsL?0Bsune`M8iYkl>@lKwXf#eY*lABEyy%Xqd8J#L`fd zKbCXmj)bEugCSabGS*uy>Y4WF)P7ADBTGhVWBM!mSks82Y~ zxRYu2%s6uYHXVeV?XwY2&h1`%L(BTf(f|+^iwBbZxiSw!1hR6rU)R@u4&!uQ4L~OS$l~|8milU0O3DG5Vb1B^cTZBeyVF|xctm47oqSDhBEPl| z>v-%cA$A*GB$O>~?Gxn7AV!0Dy^_b8er$}P1Z)&pTqB=umN;j1tgyefDdhxX=vMN- zd)ej%T&ii<|8@l?f88o`F9tq67gdmU16_XE3+|*=n1>*O?pug68Ht934%ZJD-n^Y3 z>tZfs31P=I{#IY!U>Wxjf40;{H9ZJiR^YE4-s)z(%O-bE-?i7^TBs&Hh?7X&k?%Q{{5(bPaIE-X7`phiVmNS4!Got$q&?R z{F-dV`O$?P9FPi{7cJf&p{y|vEZ|`v`r|MqLZj;=k3sch6@?fC;?4*P&Qzv&k?`@?(Kv_==<`!_aGhEU!$1S6-CmM4x= zRZgJs#mW`qB{ist9F6PuQEIMmuuoXof}Vrbd(eP=#f^j08IQg$1S1I9V0$inl!TNs z%OdOh#x_FlfV;`|BXmc@w7BiXcv2Q4Cp=@&-yc5f8yh%JW-iMXYeo#sCEhK4(Ls3j zF7Yi-TXC6&LRgC3|`0Rpj>wN4>%WK$x3qO}J`^z)PR{L41zeA5d z@%f*kZ)|iY`O{W4e}R6GXbuFO{#iqpPS2zbqveLreKZ@^McT}AJuGL(ffb)`udhfT z`PB#B>`_&UoXYDM_1Ppf(D8u^ocJ(zB{iRvIcuYm|BPdc|k15csxFO zf&WPNNFzr|_GlYumDF{1_V{tS5bWZThKs(wwat;Gt*Ge}Fd*Mo8nlKC`QUoKYsAfc zTxXiHZGv{dN-lGG)smj89MR0^zEvtG()7b5+)>ND*>wP>&Ygj27P@6(*M1~Q0fgLq zuE;T<{fbQE3Y04d)rTPx_;NpXTrs~dDCdQq%erXR7T+jpJ*ivn@Dw_iVIXr7MJ%w8 zuKAlA{1Iy(Vt#;N4~NymOwYj|)zQHCl}?!!3Nxx7|JQ*s63K53g| z?zrDL!liGVWM0?zy}X(o7n=HG5dYei208{{w)6ynE`X|IpBC}C_+56!86WnUb07A0 zuo33os)@v>YeF@DK1q(&ic**s=MH{YO+8sRKl%9FpF2aiyZ0!;<1c2ZoWz_>mT!r| zOuL5IC{R8`%&HT&6?D`K>LU-wG*s-uoa#gei^H?Ii zdFJ%wz0kF_gwk_9%YJ}cUER{9Fiq^M`k$*L9<~1zZq6UA+sMC zHkL^qK+9#PZ|Z`RuJIP_!(CTSSJol-UPykKe?KkKas|Cr)%*wmdD3%biT7TV{}D@D zl}wN4@m>Xf3dI&o|CiX6lH2t4=2w~ix^i`OLqp%6bFN1723eWjo@xJYXduOay5Dxu zU<~VG&r{9Tw5wcVx=SS!`cv}BX%FSUs--jDvfJV_U~2@u=dQS@kk;-S+7zbsy>HWE za#z~=n2;UnS|q25y;YaGgs9Hv$A!p~z#oifLiB24x%%mq_3(vSxQ@+jN%PkE?;9qW z@w?9LX8zGZ_kQCbO-QJM@H$-ek!PKxm*cQ0Y*lq_=Ni_MWwXHU#34R+;YWM;Me$p9 zgA%j8f1fFGZZ>jI!D5L5Sb*b%K13akak{2QmYS7dJ3mJylY*#6yc$|~Q#&1_DEFVr zjt#{YIdiy7UH#A<%~}PGC$!ujf(B0{H9qm{Co24cB<{7_r8H@M6d1WHBEULHrObGe z+=LpToWL5P!pX-WYQYw+>$a{irAqWqH1a@LT!EI8c`z4nsou0LFtyhX?M|h$)lvd( z?zPr~UDU1}yM9a@s?CD1P~o@dLB_nxbBEcoO(CHtc5hV(E@&kyip_Pad6)29ec$FA zGKCY$pO&b3K7{wh5KvAhB)Q*DNRVMajjDX`dmOtUiQpLcOV3+8j-jXTT=SGA+vDr9 zFX#W3xXzTm>Dzeqgx9c+^pRGQ4JP6T11l*kYyd6D{)}|m%i5}&H4aGuwv|jOJy`mo@c(TTj6Mi zYqvD^LQufC`DJEx=vN3$PRP1z|BVpDz9QDWqSQ1v`V1p=&cF1g0L3QkaSYHosopT2 zv$hmb=R#NRVEh&j-vc~XCH1hb3G&~fzRiHMEhToZ(CvuO+X0M1zBde0_LGpHUKcA} zFna&Ze{AOQ$};e5_2Ey6UN(-O8tf7*EqkgP@S!V1Gj8pv|D(>{Wrrcy(Iq-9SQ=ZO z{MHf0RhrUe?@x~56>qiSC%aoUD&PE{Ujh z{P6t0yPg7qKk7+pwQI*+h0+QP9^2(7@7O8ka-!yc%vvKW6()G0K3G%wkpS|f=8h8Y zBMmOqj@~4go?6=A$g6~E0eRlrmK*?Au!PHnf=?my^&>1XLO(w4T~vL7@+$eCy`&S_ zHy4Z)&m(X`$1~v0Io4N+r|j~X|&Iq_SBPf%Ota(bjyoH-#k0QX*B*&?hFO45gR?} z+IRZ({i{I}ONZS}PRP4}lZ_&-hw{l3C!hF#i8$;xjD2a$I#1-a-G3bL^bF0va;f4S zKVOk`K~nZqq0rt2;zD28Sv^d%_jX3OL__0HwaxNzecBP7H%3sJ`stgwgd>U+Vd-;E ziQorYPzP!prfWUX<=5*|lw!tLxS0YAZyg_(eE;T&@=PtxEN}m>q#`PfGl3e%ZJXq5 zo5qPZFK++*D{kqw@jwQjj+Kdj9{_SE(Dib*@sXc`1PekQrlbIto#H#h&BaHLm#|A4 z`LO0kwf1L6=r_UkN=ImG#3P=AQnliJT@i&jg)ouG8O9CuXXsJo)_A*H1+$P`*A4)z zD{;Z%)wi1&lPTy8>0?bXEbw>y8RXE02ltc0KH_uq=X*R8@6D84y;3>z2EXpY`{Rro zP-tc8$uapVf)c~X`%le01U9!d0<>NvJR=xJyA0rNO&?B)ofAUPdtjMMpf9ZF<$R-@ zl47YOsqz=>#uvEi`t`9U{Rg&pNdpSN=v;mO(c`7%QX2Q*w6aYgaNZ>?cjeb7 zHO=`<8F4%L1p{oDt9&UB__CX3$i7Ri39G#%ziHdBzns-Y7lg3{ZPzFC# z09&U!#{NK_etUfL^AB0vIR$^wTZCMn_ql;1oH8Tn-PHr!_Oa6J;QY2xE1XXw+30oa z+1Qpp8ZBs+z-FuBtQw{gr01|PyV-qvbUPrc9V9pQm8Gt4)rJ@Ytd>MK`<_k?+Zoa4 z4079~hfOEym7P;Rihh1%1^AOyyINVc818`n->6o)UuZ)(qv0>o z;zRI4a$B(LoO=t(W?IhjZIk*zwz<8FYqsBeknQj;(K2x0EAr%|D2=C>F_421PRMkm zN5k2>!cN6Ubb0U|%;4bZaD(_5xhfT?d_v!oHOF40M7P=2;fj1UH`yVV(eC?lH5Zoq z3~e2MdU2=Ur3Ak*o^p9aH!T^3_s!g&>%GACeMqRsD6NB0(OLz8U8CLpKVBFcYFykb zt@`4sk-~*$?3LZY+J7wVTn>s^AGAy}bWH1Olw)qCg%m1?YP!vjUzp7o{`aJSA^j=$$nbhOka>h3IAcphc#s4$nWg_~DehlIRJbox zysv*O@GgB9lTQ#TyQeFeru)d<2{X$#NLSo3WXp(M3ST|;^-e4<@@FGKin7ZzD>>yNvETV^UB0$&KcAz z%+lkgEKhi`rI*Geetls_Q7}VeOC+1!kyVuFt23P{Bwu<8Ow6gwb>&(BP(7Idz;qnt z2hSyFMMbVmeR^}%XZA@cKeL+{5qK9CqO$pYUjbs8mxD!?j!<%}XUxV!iq|v+5pm3R zPLdoN3cT$yhBjFr(t_~OManOz4f1FH+ipi5z_e8jEr~ERruUu->*C&ScclrxG7@6B zmL^gd(Amyiq|W~iwqLw;s?m76;=xJi)YLZ52xoruCB~*!^d}**pmdQ?&C&2VfmZj- zS;hm?yuFNXF7_X0dSo55O+c!@yf0~{ zSEz4O#DFaXO%Z7pDwtU*yK*6;(2+K(0@uU?C+F8oaJmmK*sT>8QNM?kae|2(?}RPi zX#rpD-026$)Y}ZbyhdtF!*l|LsGHsvxpo%GMm!^AMxA>-`R)EW&UDI#oQ?T+ z-ORjQ(V*yHtTL3JgdIGEd%y;A`&HNHQv}`|mPFK~w}44$H$m)JY2mG9xz_C(Pg~6oBcp!TrdujE;R%#1-QSz_cQdp`!RN12zc=mZWyi#o?^|=#n1yu$HU#KEIlXO{zibKwBf zvSf79XEe1xgABp#`Ix4abXfZ<3=)vY-tHt}T#ze^M|sJ%6LUB#u~o1L;K5#7*w;Jv z6bcZrZ3w(X?Oz4h!3GOYP~?aY^XcJ zJ!9eN38hve$_<#AYU$&zbYxevUM?*7hJRs1B=suWX3-SrME*F;1*cSZzG6YnIM-|s z{jEaOJw}*?JqJPK;)Zho?OPsk^w%%C+HB9jqO!BT)gx?lha(mem~8P?h~+bY9`cy68lF*Owm9v zAccBlvfX1I+MU*k6B?!Kh_lHZaeCu|V1reX|p6a=U7H zvhJO=oBcr3qKZ+vVvPy7NN>fURz|!pR#C`xsEasi=oPfSVo|EJ6Y0}kDy^iFKb-!# zW?eVDaYb|%m5>O+$|zF{09ZOvGPs@l5QpGI6;io}yKi0Rhax$UybF`1dF;oNl>B+f z^O2Qbh+B{d=|6*i!+*T1DFP?=L#1NUVA6{g@MHMseNG~5Pas6OhIqp*I+l6pb%79% z%ItOFvdIu|BzU)AD$sFgm$;3_q=;1jEkVpMLIqiL@xy^4-;p|=u6VddiyO?sT6Ij~ zZ~vGRDG8H#5PCD=`Nms4jCHJSAPejqc&9Mv{S+dsT36V!bv1c4<&*b!Q2i4i`C4#R%q!71v*3%6m z!$Qli7k;=d)Dc|tR*&lLKJ!=M-vW1H1fQ|AF7Abm(TbSIc=bs7&?hDTE_KN9uZZXD=4Fd+?LbwOaTx6pz_9E07_ z+3kgy@ptZaY?0elTDy{Nz3=LBE3)D(5Kq_R95MzWQg(y{HVxwfBVKsptAvo;%p=}t z<7=c!Au$S@Z9UV0Hd7QDf>9bJF2a%OFCz=^X2;Ji37;|&>2JKti+u{CZ;Kp3>Q2MQ}t?G2~Q5t zXGVD_NC<+#pshKYgGQu3kqyFIM761{YZi&i=|K9BJf3KOQ{3w8l|R z99@fu7XRgI5tXWA_C+>^S_u(lQ~kDLRoU4t6OPh6m04JjUVsAGJ?8Csq%ug6+fs@_ zIjAatHa`mbEmc;74*kgsi+~m9SK8%ll(N&7@!$j}3Y#u;tlSs(4LY5Hl76m9mWWMK zFDCLUl-G@u{XBM*h@`hAUd=dXaFjzcb0%`->e+^4`iB$=F( zuC=QkaX&`xm*WG>z&WBkT=w0)ZfE#1=<|C8)hFTp962gf~{X@jTdW&ip;lt3l_n8sJj7!OFrJI z;f;SKNg%)&^lPHJHw|6;0fj7Fe$U+5=g8uK63k@hWkBCqBcS~X_iwO4+SOLU3=l&`6?=-I6YD#6jTWGVC(WC+D`bM+ zSl}j$Gxm5rY^-9-MEXWYXh;5~m!ppx=5wN_Xw!_2&~k6P6eg+D3E?9q6}B&XjIDm) zEv0g|54A1#&jN!5DpH?ECUa!_kqQ1 z))GEzDE55`(h>TM8cS+C{mt%WEMtCHa(lkNVI4&3Wo7sL6_EFO>RR@9KDNJ~ng)aI z5)W*^_HRDAh=3p&R`H~ZJLqFTf&ja*wGXk3f{`(4kJl#>0I;D!hM5j_g~=13Q$1 zgd|OVs`Rc|Wk4kMbU94YL$RbPS>>-IXoHY7mDKf_yJtAbApqff+U!&MwR;!Ui{y_X zC^&pGIjwRh2(p{ph3rv__+KpC%16HyxIB!8q)(&D+fnEhLr|Y$o5gNedtR}>^DSa8 zk`ljbzJIQNY+rI;{mtvR`g+~HEZV;ObnkI``g|$SAQ9ub`kr*iq0(U<^QJFOHezky zN7A+A`vsfcb>hFEQ)Y@2S0Vqp$T3)Ar+Z2qDCg+_SusbTk822FD?2iI$`R`@pg@)s zZU8^B#3S!OP^!_&AWu#AnElE1;4@=4lTH$7{Zp&`F_+3vZ#z75zOW*ZCjuDZr&YF% zF7iK&$7QK~nH#Kb(vN818Q}WwUU2Q-ur!sWWjcE?Mu;kgVX{AIW?DJUgX$9Rwbcc&K5kie*!~xbc<_C1HWNpbz5p$UZhBbo4>DM%D0AwnvE%2N zlc=2oUGnTUTt<<^P{d!IIWZx;6DTxQs1eQ%BJ@JcIY|9qo81Z}eza?9hNnevl$qV> zrOVlmBK+mM$5J_S^>=y-33fvY6^0c>%e=7F`LMEchO81oC}`t^j$Nw58;yFrjS|6# z1*zW)IcO;wi7|S&h-7y!yriTT;AIN=Z?i+sjDs2^!GikiMnsIXbVT}AXqo!VAYMg= zP|6Vs^$1t>9q+Lz(?lFwNv2zar^&!1et`X^slEuG_c2sB{{@3o{e9+Y2f=eUvloXz zf3lQ#vh>74sz(+8$?^1k-c~`Lk*WZefz^FcY|wR~;*?WEkvW++5St-*I&;fTY)v(M z_oT|2APqwqTbx&|Lm<(D4ZzY%v0U;$8bA=RO9KEV23!yqM+JI0dEipWf0ww zFDUekFl=Jq8HRw1B~9Q#qA?bRtXInhF=`&3unIP&wser-M|2nuy@F-ht0aaHTx`!HO$i&N7z#gRHnYhdEGw zW_UEWCkX}n!N8>FJ&tQd{^OnLIsb0(x1NdcYG%S5yVm$=xS2`ya(d7AFo%tbRomwq zkQ9sURx??sqzt`yPPKv5JdFtH!%j2uOz=;gIdVoU`_dV5Vr)~@-qY@D_#I@dzb*o@ zI!|%?EEMdKO=gq(T0({ZDe>=t?M9kFJRbSH2*~}%wWYb1AJA|qy&T3pnEH}~C1Hzd z-wvQiqS&E;4drq$>Z*PS74xnL2*l#Y3uwzIx=He2?43wfi;?qKOE)%Lf2yaEvJ%q; zsF3e2yJ|V+XX`{VD0iYxewI~d!gjH#IlDoxEf*`8@mF&pO+X#r>fbVn606u0dSxi6 z6~I!33f9@axQ<58R&p;G#n7m)tDRn{VKJaL4w4o_{keCE;-9smyIoN&8T;ud8G=rs zb5sEv*7Y5_nY`&Q`2vH^1kh$C2ArF+*ig+nK?SnEAA0s-pB9aSa_sI&IBDY~Ne()N47 zrV+{VNElfrv;o20f{H4p)D7VLy9%hnqg8qkzI{T-fr|!!Oq)o^&Vd!%d^NOEG9LZw zF|ce&73fA(cDn-5mI5Lt`DtcdUmn3>v3%J)7Eh|5xpRT7ikJ@0w@UIC3L%VlNTKSuFL2O1bz0OoAk{sC_>MtTOaQ{lsrH{vU3mXjker=~N1R?|EMj zJ&eeZdl?gG7uJX@9R3toc8a>^5iQ_{@`tSAS03q8id~4`U(w6;TQ`pRK~&DKu_$pk z78&y9j+Q%gW14)f)1nQK+M!x9&Ti#Q!4C^$JZ_oa*Koj9)`@3yCT*~^nJPRkw-qk8 zt~gu|QrG&n+*TTBDEu@^)PGxZt1jo;W7y$q%dpc7^#)lBlq`d{qLBse0{%5mBX!TX zc1WPom7T-GAJY9{pdHm!aFc2H`lCm+V!$)|q4`%As`-t*sd0wSjQa9B(U5!yxCv5# zhyw^@g0%jCsYB*DC62b2!7KygkdkG{tBzzLVqZk^zIK%z&8Kd3{mmWKelUws+Af1k zsAV6R8{qD>qDUTBSjSvCok(3QaSQ zR7@?s5F8m4O6J9>OpE11(Rx23%ZZP|SPR%tGFZ6dYv&H_DAr&IXc)hrFWBq`Hg*OG zQzUlIBWB{Y!`6^z$Sp5&_HSCr%zIQB%;T+1bZ`5aG3?|-yTMx{=B9F9%sCgkMveIl z&O66wMr@Y2UcoUS#lr%Ox=sj2ZFRzGc}qc6$9z(}oGfz97x3R$NB*?R%=>vJs>`#x zDQFRarsG&MIHbLaD(l$rx8du5+3am=MI4j(XYt;Jl9+~1RC4^fHj8UhXMJ+1P;n|HUZo=xqP6~)CD%F~iX?r6qJN+r*lZL?8m@1Pe zhH&$T$D-W&sVc>CoMxJyi|cDwVWAjr*yZp2__%1B)Wl1g*X85&{ z_0*bWrVSreRtmEVyJ`1|^d&6>jh1@%HY3RD3_uL;C8sG(8FYKUV3pL``dVi3c_}dE zj^miWy6}MqpA*C#$_yPTeK|Y(-e(6QunSL@o|&;nzyG;4fxzRg$hNSQy*_(Hl#0%xnUJGLasQFuf6j6c{z> zK#|qLIZssK7bqgfD80qH{OeE@VWm*95nG^I;*qWoQMZ4yY+|+IpaEWWI2$vv0}E7K zm5mz(kX5`Np9kSw3%TE&`1v_4K55=(CB=?k$xuV!T0v2UwAuy#OwwJ={I^Dzv7{B) z$Wf?|CIzu*SLY;{w0VhS^VV=GL6(Q1*S^Tu(}rW8%7)HU{Z2#eA6z2*VCWp*GiGh~ zW>y%i?6sOk0pXcGf6l+{#F)`(Y@NdWG?CJ0e-{!Wh&)189W6{VD3JNOV)$ITbxi0o z$G^?)T^3|j@bZvhYBx*)@uxVlET;i1rceDAQr0vU;{RIDx-i8`p&&3tt+0fo+jyMU z2#PNz!`Jf&M1tJH3z%>@d=wf>e49)rr$7!^lq6%6`$5*VD(+sr96jl|fws}iwJ;BB zz@boZ*&?p*!A9d1FnsUX58e_~&~T28uS1#3szo}1RvtDFafDJDT6(_UAmR8rRp!D| zUG_x9jmHHRHqV?0t+kxSrchHj-7%TU!};zS>)SNyLK0PgJZF{@5UC`x z2^1Bc1=`b@zm(S9we>zk@LsDfpC_!%GJbjk#a0!R(kl+&tUUrz#`Txzqc$+p5HIMy zli}hmL=L<9vh~>MS>@FApN+VDt8p_NB%Ekg>BaEbv|<}uWy{r}UZru?mT_U|lER`L z@;c?n7s_2T@Fc-BgQ=ZS1FmJqmg_O}Ue7Q`x~Yp{EQ-cqLE6yf$MV>M_tkGFm&3_X zoMCChMbOo}mCWcPL`qg8t+3?lOiS!Rp#G_=Y+rLrASb48L34|Atxu%T03F8Q@mN4} zy5>PDCn;&&^cMvCB`38HZZbc=g?QZu?uCjIi#TBS5~7VNHKnxt#x2~J@3kV+`Qi5XV*mrs zRoNx)0qS)xMnfRNhk?gWOoWm;EvmaYJ&yindz1<@V1tGKotICUe3wO^AS*W-8{y+^ zcc%ZLTALJXKO_Bw@3w>1YA*LQ|N6tLvpOfQxXEsu3Gk64y=r9#kit+w)g!wtZ ze3maWh%A743QDZoXkWtm`@;*VrcG*A{|;2_9&5fAiTyZTpGz9kVv~NoON8w!yE=zh zm*d4A0R8;|0t!ccFrld{`{@#w=X-5c8<*n zul3i|wFxg533E->FHSZpn$Y9>f1UHw$ILl#6!SsdD*g~n!j1AA(g$TZcX@EXZU{$R zg|u3!TAZ{qkr#8_acSW*TQ|vEiq6!u(h%35?*7&=RpY8TVdy{Hq~?@o2O#+Gh09#% zp`$6TEpBk`VH&Ofpv60tD31POsNWcCu!#+5FGBDOz;TY$We6yjYa5ENYt4?fRf8XZ zvVkRvy)`;w5R0`b3ExfkWeGHr0}g9Vt2k;6OI6p1z~L((VwZ33ve=iv$5D$V?1umj z8P}{Zwvia5^|llsi5wl&Ij!^0*Vj4pNFA{1He~_4pvvj%1fC#d?L|?D8{idDeRa3# z@cmZQ0|Uq0onuWq#m)ny!V^hD*5ZR(8vLaEe16@L*{?+J87DAZMW-@yGtAU>3(&8$ zpj7=}Z6Ve@^pKu*Igyj1dU@G~RTjcoUR~3*5DlLRlg_!Y#?k-`nd{P;{C(wWbkvNC z*W(s>B%H9jmptM@6%U%km0^L%<4v}PvEA&@u}Bw739{#~mdtc?-~rW{4+=z7Hh~85 zj;)>cq1m8d;)j}_?F4?iz|YS`#rc`>Z-$(f0(|c zc{5><`6An$T6drX^A~5FgOmJ~0U%KxAl;%X_Jt7-#5f<8U<)abTfY?DjeDQJ=%9HK za?P1hYFiibtg4FisUXCkZWqlkQrjY*Gfydu-Pe<%%=B21^xR$R%&PuV_wMN_K>y>S z1vR!Ko}j8{`FuF@RogZp0LpIpNFpNAWT^69K-v2?_?ra0mx!(?0sr4F2WR^U-d~#~ z1Tt#o&I&h-rc0de8gtIKh*vlx-DX|wU1Ho@K;P?T{;4f0z$i)jP?zfI-^s?E6}{ie zqq4!}iaJ{@LS!}v+ZU*(pK;k9xsRC(CmGyUJHjrKeMVUL5r5)FG;TKFb<~6??C@oJ zn=d1k%#mY>9to$gPFsSx!zbVbv+auoL;|xUZclBtfY+O5N*KE-Ap&9ig4SRsG`G~> zAKtFcat_~odTO?N-hje_zIBhswO^mRLTQvoSPrJ&Ipb?g-t7F81Lrx5%ANNHv{_zo z3Y8LHOzj>bZjhYQ14uZsCIR@`@O%Fj1Xa|E(mh=Qz;jiweHAv=)T=c1Byi$-tq1M& zZ`mBo5C+RME;Ha4=}i02s>x_Z(W)UH%**T&#l*}UJ4C&+382A$QO}}iVjAUC9D>Hw zom!exemUxrV%B(yl6CTWo+16Pp3EdK%WM-AmyT!nXc!oYHqD|RVmA>c>Z{qt#~9OL zDFRoeBJ}FLbo-;fAiH8V9RDC6E;tBSK$x5=p1xut=RZJLJ3M5dI%d{J_Ykz(&xNq( z`h^uKSl?JDISFFhuT2N;5JKQFvcp+UxMM{d_$CkU;uYwJp1eLQa%p2*=3O;73q}#BzddgzL+Ky;P?K_T@SY(Vz*{gI9@u;qJAYM=mpFDMeKbE=Ep8HF;z!#?X=^*4qi%0_|&g?+1l+MBpiAsX3AdUy25e{C-|0~Ts!3Id6r<~g@~ zZvweG*zrdV3%>;2GITS=0S+|Lq&jf@;rK|Blxz%B*$7I^< z>P?=r{y{M6a>X=;0CgAE4B?y^6->0c_CsQD1NNASc`bh=Z&uzgm%y=+H^jKk5$zGx zcvqE7q&z_-< zaiDpPY941npKB-LA-&;)ODR3z+SXW^a@H%N0ZM-9LaA$_na)@J&_4e2`K+JQk|*JR zJeM^gn|uSu%TEzEy_#`if{*q=(_jHea4MX1HYie*Q~~_NM@Gy?#@aMWVYn|azJ1@f zG3F?oKgS9}SLrF1MOF5fHD%#kBkgp`_Hxalw+9>rrfLhDXQWbI{HPn_fP`hgJ(w^C zIX_-+s&arZOa%&}$WI=%P4$W*unro$x*qL_*i5oKE121u@~}4@7vX>VZ&dBmekNqw zY}2k$YPf($Bxc(XDv{Y}_sI_9DtBtRG9@Pk#MqjTBi8v!duh!XXsNpf0=!GaFcUnm z%spiL@2MSCYFFU-Y*IwYSP37;@cIejMd4MosV#z3Bj!j9VoYJ{W?(O6w?kvZbRD7; z!kByu=37r>^1|&?6DQ^LRRSB1qV{rhORkY$B0(#a3!zXq@QbFnXsDUEnvg0i`Gcsb zQ3g&|zPW=Q-qt*h3%ZS&3y+!3t5vU-+7zYM&42oS5OhPQQ8<9=E}}S=Xa^gJxi==G zz171i`{qz5E{CA);Z^mnA0m1p{{7yo|1?|q#v5l;#OQKOt`MjT8Y@+LYReN6ShOHqL)AozfQlr zFjdi(OUY`n=7OzpekP5Q5wmTB7aQeU@>Vex(%u*AgZDZv`7`RKf$S*&mQ_7eMIG{J z4#cLY0^Rd*R1ls1NSARD~ovt4G&J!D}J8-Hcq(K_&i$LFJxd7bGNP6J> z^$E@U!um=C_otgi_$!u0mH)ND?@06tOZ9Q@7bv6tZzAN^WUA*xECaS6d+2PZZwvg@ zh?aanUWW>;8B3qVKt!Hz^IG47H7vEPk$@J|s&297g-o{JLLb7lR*kMdtg`bV&UDw5 z%_t&#{)ULkROwmi>9K@+UW0(-alH#of zw}cM+zDpwaYo?JXS#58Sa<9|*?i#nzBfAbJlRz`h0I7{mJgX3g=cYA1m%}UKnYa$Q z6rRc!(z1R?${J6H;ulx5E}kS(r356jKmZ0(XJtrL67zu*McX!UDeebYFul#r2C^fWEi9iMD3w8|#vntu|>K4nifor?O z@g$PBgV`83#QbjGP4EZWt&koQW1s&uP$r8E^1ZoXC&Cbej_6fADJ~mM!r*J*NxrH{ zb%?R?iD35>;G%<#zSO3qd^y}ae;Qbla9qb9uOJ^G?F6ENy3!)DE~+Uku{=1KCgi2Acuxa5Y*pvt z9l@2dDnD3FHr+5N$^&~1b>|5>%9OIY?t0(bUj>_B{3AlNNzYC$fWtB|-6?#x@Y{}x z6ofQFFKC~w2%`elOxw76kKR>F`A_Y$-)AdtzLqwD&@^N9!2Zu?JdnlNL>V33c)dkP zlG2STPtP*FfELm-v;7#+8qPr6j%s9x=5>j>0wR5V+u*r9+?w!TXVNwcdwb926-JQ| zPnYW2zoK<(de}r2wTaLO%yR_9lD7$mZL_?|TD8ii!k3Icri5|T@3jX`%BHoJzpZH) zNSc!k8#T(Jc%&cg_;^?-ZE@Cf6HAiEyLqlRYcwuEI}^9j>t8nZT~wZjhSSoMD#>RwKGuWdK#p7prG8P_M zm5zKCF4d+v!NC|U?|H!&oIUt|06Rd$zbS1%qC%8wMHL7$P-t{7=Td`c86qL7DYyjr z!g$)HUc`1~ZQ|=LdnS4yjy?jMiNmXxTi-FzibAZ`{;QAv> z1u9LqMD?eLnLkv_bh1@eV=`U~wp5Y zdd7)z%u1aIRsudS{F552$@~)iuaP>{NcB>y{9B7a;Ar0Z42~b=hq=$!I2Jwg4Ii#Qx?5A2Ivh{+i zdzrv9*hO&&td?K}t;PE^zGZLJw3Bqxh{dENPRU(kf>R8w9IFe0OnXj6VDr}9yM=6m z0yN1cNO2%U`qgwdUcFt7hyYhf$715Q@t~t(yTW3yP;0cV7-Y@laawRJBcc`9dAjzu&3>MMQ0M^q z=y-|+*n*^N`p`k6K#s1hsTYdVN-iz#7|-Y`3XyR}LLr2_5j%Uk~`W9{S{kh&`-bk&Chn3Daik#RG_KLmRJY@n=)iSKQ?-MAcOx4W z`;unvxxdu{>WUA2sidq&?2~&wN zLpHovoqO^k=>6C#<+PIyCU)o%bIJ7u$l=>WXlI8HQ|CrBnfx&qc3?in(OGMMR*q+c zyu9Yn!)0@kbHv+9+-YsS9C;kX;BGL}le^J$0=p?u6N#98@}hDlG#nL{ie=14Zr0m^ zoV07=QzuoPn`B)w|4qf6XAEZXnxdd-@lD{q`@WFP+_;jW0@-TL4hi&0knn-JUJb0L zDq(vc*C2#!a*uopIc`5Ioj$ZzJ z^73a}reT&@buczOAt_pzv|8$Nprg83OBi`lp&l)84MzYAO6aK7*ExQOiEe5eMiN1V zkSV$TfS6GBG#yg(qp4wM$@|9{!eztZqIxwY2f`U;_2olMX7o1bN!H3HT(Y2zc-Pp& zd4888fhEfo&<(Si$FYj;;WTzJsw`%=I16t)1&+{-FP4UII~3oESP5`N(wr8&a|k^H z*DLQ>=}22ABy?rUQn*UP!lQDBihpfy7ADX--#f?v7~Mx)GdmX9TL3m$^Uk-k#7rpY z2v;o3Qo;$n<<-@Ljwl3qqSfWLEL<)joF{6fjTYLvyxmAc$M=-zUQt*ySjN5(n!6R( zpFpj&AP1Kd8V|J+I2%$$DXi5M7*Y`RuK`$6oc5ZXU{_9NfkTDEm`x&AGa;dX3@+|||KYG&rosBG z*tAQ*VNJpD6O%;*bcdnI%zBku&_&F1YcF){G;N^+CmFz3QS)vz4m`MljGXSi4$x>HR!aRz6B4YTQj-c zIdXZaZ!*HHtk}Ec@a$I+ln7i&kSPl1RI=-xX z$|NkuhTO7nT+-@cUU3$yN*={R0bytxuVipLlx?pirnWHp%YhSl#;-TV1btJD{VLSj zTO0GyqC4R(W-jB`TAZzl2T~b^J0b~Oun6#H0G0t3r6$l^9YOJ!-fGU3m@0r0WaBuA zUUw*Uc+tZOUr}Xi@DIm8WU0zAEC1)>?5KY3lGESAArz$sjN(hI6&1IVz0B zn4!?dXC{|kB`pe~>M+PG^s{}Ez|m~EiQ~Sn2p0zuY}uR`pKFQR6X^x$X2ET*HNzk2 zjleD`F&L9FSD+as5sc1zPn$BpitBF&#=M~t>pE&y2+50Ve1BKRQBFjIGuZvo+XQt* zC|Jt=+~x?4bf6YDYt!|vL$EKnM54J9T>>17s5Q1bLyDw>&P%m626-^;xSVOSeCe=z zamqm4Br*!E)6Itsj_+HWOtf_Ym$nU0ec`dXj96~!v zxsO=NUxYLBUhE^q)4M6>3CtO-p!OG{cnN6cz;?}tbt2+1l&neopaj&parzzuCsquL6S`657r>>YEqO4X z3o@sv86Rk6jqzRd_RTqW*|`)XtZmJ$%)2+wqBuD6bV)>}({2mXlF6yf8ysXDpTQAC}0gaARuf2IcFP7ZSUh zSsQN3EKdWp$RV(`I=R~1+Yl!!x}(As^c+)rH=nV3v}_IRhihCGBnRE>Thu98KB^QG zz@Fb>CW761y};e|x*i@7r>KXJk4QI{RT3zyX^j;VOdKxJGo!6Q7zS-YjW4E&@jDgr zGEfJ?!4&j$lAmADXVanh7IgOJ3ncbf58_{ZbBcMUAFeJm>5k0VyL7t(!Y8&8MKj=> z#55Y7p<%z|o3I2?5=fRDptOJ{4;-Mo>!eRQ51txcl!Kc6-Qk{Mv1XtL zB|(5j=<^e?YO7gKx`}hMEA!<7RbT!bFUX(1ULydX3ak z0QmMA;Xs}^Ze|7Osu8Nio5#+N^VL;ht?O!zgGV;fyUS5mTujePt*2H*!QtcTLmUg9 z(q6uM{`}}MaPCi@V9<6S-NZC|kk_kYdO+XNksZPau>iEM4@+47yVtJ{-=Rp#bO{n! zbq}-1{V^cr4q=$x=0Y?*4t7>Y5nWYi!3sC1q{Jj5*ez<#IHF0fUyakbnI72hp2OZUedW-fav&wD zGBlz!zS4CB^vd(R@b64!=BshOPvexjg7%#LYhpu(FZ%30L;SILIz^wxb{tGmDi-H%3S)Meufok4~LP?3^_ksNKeg z_k0P#jVc_|VJs&F#*`b8V>_Gh&o9y|Lj)k!p+dAZMgE@tSbF2bTo-8{!<3N9Kl2Z* zC5)+IX%6(#tYjT~`++|dPlwh4K(oMk;k8{+_T3Iuplb0{dBhm_#-g*i%8u%*;~X1< znOZ2KJD$$wT~&GhYN54@JHei~Tvw)rpHECYbx|qOA!Krjn4QMsYdi*v=xRNRE3D~# zcI^x%yOu7>8PdGVZC<>#5D3i;pr=Tux^TIs>uk7F5m)n+?Hdov!UM?a4=4wAva!)V z34}3FyJntu(UjPVg&Uz_XCRa`Th{FED(B0R6Xog!F?`{jT>lQ(Qo#nD!-KK{zelQC z|3Ko+QGFW84dgjo)Ua}dhdAS#K*1wW;TP^%iAEO$n>=aC4bTpw5zwP}36@$pL8;Y* zbzSkZxCMDed+Op6CTRDKm$aXq>NxbQEfUOtWYH9qxz=!^Q1a2pNi4D<(Wk^per)Ne zrxk@i0|t;d6>OMXc{YUH5#I<-bDIP>;M}r@;zqfWJ6$TJo}ZmAiC_Xol2|)6Widr& ztbiygo2~}<*vnuse$xz08H8^>=$=2ZqFO9cEaIy>Cm!xBFrasuixwuR+N z!~lwVFJ{8oI<|-L_H@!4zhak$@&O z-iK_&!l4NOiZKMyHZ?7zgRRju^94Zd0^P@cB8NB?(zb zFdj`8kC*1vrL@5GOqZGS>+EX|Pu*yDh4!n#0f)6qv{<%Y1fq9hxcMhU&85hIFKC!< zMS|);VV4O%OD0LcFI2`s4wbedQ6Rcj#Vgq_JW*O!>=2hS>M&iu3l1eg=Qkly*#J9h zjhys{7M_mBvtfU`)yXt&ItaR_#nPJq&*J=r1vVyJ_zu`hg?=!!Qmu z4V3<6gFXe*7xQZ*2*R2y4>)*L$uVI!-G{A&*EJ0-F2mILrH~aoa;G#oaP-(b(Bc6b zs?4mg;6(?^un^2X!+UoGT1%xICCINL>}S0)wkPe%Iq^TQ^fh2!MhM(9FN=!Ly+Fj# zkJ=f#$Rn!>of_J#OOL?6?OY!AUTDw9X~O6F4R@tmzkTx%g;yDkt7SWze&vK~J_Iz1&(+sX0S z!)vSD>nFE8t8Gm#43eCW*a|O^Rb9kyj_R##d4LHN+n?B1gz`Q z){_;NDO1Q67FHC9YCE~~%hz}t++h<@V=?U)8il)i;^3~X!sUQ2gh)}BL|>+;dC>?I zTTf?Q^x$$eEmUw!9<#6!6CHBJa^|H#p|q;P?Yr*T!R@n3L3V`wOY*-Tj4Ozrcs-LEO{BpC%Z@ES}xo3J9WJeIC{IKw;1Jc_;de zOzyMGu;gzv5xjzVzuJdNoFL2lR)VJPeCq61LNwhcmYr$GK4z^jrY-;q*>922I13sp z1!)XJMt5pi388>4#U=CweTUNR4{mF>Dvr%64lEVXqlVa}W-o{figxRvY?m$+7&bXb z@fg*rWhv1`>I-d2NnV$elD@3QzfN^nGvO;Twvr#xdgJTOp(f%A{&WW4k{gc4IfRg! zJvGNo-`;{}i=sB^D-m~)J{3HuFmDm&Juk^yg!L9>^%h~hRNOO$h^?)+m_Zmwhq^`& zJd?TgVJGI*_SJK+I8m2Q0(uALBRpGq1{3I7j*Y{9KlE4|n(^rdQ8c9yK<^l_MR^Pd z%XCK-35U<;mV3^6JEo9ja2c6KLyuQq_X`y=Ma40ZszA-adUZUB8?4IEegWmh7H(Md zF55D#Hk-}W3dyu5=9;7T+KRj64djS5PpqVEYoTMAOHgr~8Xhh|LF3Rz*4o)7hJjJz zUvq1WNK>j00lz|e|fIuq=w&vn447ULc~w1uk9UpL5-Nzl=*zZ^Z|=}5`_D1` zdffRM?ir+=PM%a)#Z=Z8vyImG<;jH zEyO{5Z85aHF*m%6W7(if?$|~xU!DooHlOj^rp_5fn6h$dizHxJ1hQ}|o?9W_Ya<_( z;|(9xVLWp@bqmLxqKgK_ja9qIuq*d9`LdQ=qxH-`Ao;yL?LL$*gT(V;H~gSurzTO4 zx-m~XgU^I=_ufmN3(K4g!R~V}X~uPpH*&tbxz20Yb&YdonrPuzt8tJ^mr+;);LM=M zKRCe)QHHoo(2((UV?Eutr^dSxFuJqJCm1~DZ&Gy*DPWq<2O0u$rHP#Nqjf&VIuz78 zmHHkvOPcS;GLjt9qthc-V%V=weN(?Rg*G;7Yl zW%z&+porNUmW8HT6oVo$)~|5?C2)cxEH>zYoYP<=d+8e5(yzJ`g8G2T2VEQ@x=F)< z=TZn$)IFC}a^e*HBTl4@2mG70szf`A-{ADLF;8Mcf!2kFu>wKzv^3IAmaGg(Rc@|L zntkq1pfZuHm`BhHk=G#=XB)oK3>-SM7tDt@swf_Zs_5b2X-i<3ikY{jx-9B0K{HsV zHNPsyGWN9bFb5W%i#ePb6r+N&&K;n1R7dFlvuaS%@fZEZfhk^uCZgQkj7DJRJdyOiXyTu~j4E)VCcgV_^ zJFeGKP9In3S_N84!bH4WmC12*FgF{qW9McwaRj`aDnL~5)w^m2HeVdT70mM2iwtG> zc;;&d7Y-+=h_Zi9C2{Hljl=&%zwtyz!;LYY6t2K_VUl@K!=#nC`u!V^k+ecx2{gO{ z-{9!B;4q|@$!qjmIEc~b*)isdH0K9{)Yk+(3Cfc#PQC78Xp5IMUTqbkbWim=2S znOImI(krIv!!o{#nJ2v=??ic8C7*e`uFsl8g&l~xqi{$<1CK_q5qOsyNLvhExAte0L69E_orOVT8#9lOhxoj zw8L7a7kX&9xwU&k9#i~+umt|&l`NtV5yyXvBfdoi{T84UuM!B|H4j;O%=B-;B(WI6 zQAGhNx)%2}K7Y^Z1)>p!TX()28M&ha7)J6^^pUnUBX?Qep}wt>i{j%kZ?{RxlZ+`00>P1iq7)j`Y}XcO|tz|1naM(Ud| z9&pwlj;ZVv4iBp#1qBFc! z>2htYi{a4cxz+8lxwIa(^$lmLKL)#l937B~O5t+Z@U(%P#HQ{2120ARYMrE?Re&16 zybv(axqTWdpRgm*fmYf2lmPa&^_pp_5iH1jVjnX@DxnFQqX<7esF4 z%S_%(U}f3oJ(FuVMw>(t&?GPRAYzm|GG@Y5gHb%u(Ygh1usl%7v9%UhrE;s}QqKB; zfS7?8DA5?qgy9nLKRV#=IK6inz6Va4!#4Gj0>+@5F8O)~^V=7!xdZoFtC-5Iu0_JQiW#dCuPws(UYy|_#=^y{0=9io+0zt5QfAom12-i}?DF73X!h{?|77)e z@@MoR2}&hN2W~$dH-59N>Md|wv#DE&Q-xpOiSi-G))0v?hxom+f#2C^JNcc!PhrmA z(HtBtg$nkLgN{n|bK2_+F@@kH9vqW-$__8cxTyWy*?*&APTbbVM@5~jR zjo8a&g%$hChy)I#>pQV+HFbeLVj_|RXM+Lh%E8ttc`NUQ9| zU`^R>%SBV+R-oGHSd4Fo$OO>J&BrUw0{_#{N-#q5SjK$3p$-PI;6P8W(7{iLY@K0B z;6I!<(HbJ-T`&L<+b*T@qWJk1z&`d8;)XwkuH}Frz?tC#M7i z+7F^|jZ!SISU}67SLncX^#Q~t*5#m+M);4%1v3b*k?L`J+>AshHBcDL+oA9}3~EbR z;&gWI5@L@RhM+Pj*}=S4ELFD%4OZEQ;|stGTfyS!pSb~T`AECiP??0 z#a)FE2PX8;A}s%cjvQmGVHTgYA30I1d-a`cE|)#-ZY~;ER;rsSz1m7-G{+**IawX$ zC^c4G8@+-R@{7fWcE{ZB&4TND9c)42$lSOHHAYJ4%ib*ioyFm=+|9J7A>nH-&RGY~ zZ~Q{xLJQb2bIz`2fX zRm*P}rEA3QySyuzZ%-wvY-E`jSHRo^62C6ZRBz^ULSvgqjLmVvh;h=i7iE;+s^5+n z!!;J2mJ134aSK)NNm;azB@}sB#c3NeD<*nzyq?&um$S@!aunRgRLKAw<#9m@gtK6( zkH~raacY8RK`Vo7ILxn#Jg_sE_>o-&Dh%M(`e_gB*r~Y;bGMT`YM3gWq2+rIjz%0`&;^ktC}{fJ34Jn zLhL+;oYlJz>z6x_&KZxBPTyi$0Okf`uKej_JOire9GLZr>lvrI35IDq9f=!NX*@FrsYkEh zW~tCO;$V!}gKixclPohcjRv#B1c-jPx1r{t_Jd| zJ8%~loIE!&I1mS`nVg^(^geF6anc_{SqklNjXM&9vT}_n#e>SG-iPnj4{*PQ`klHt*~9)}aYY2^ACpPRn-_GG}P&`tUY6VaG3SXiak4$KYf9w7^9Y zIAfsX2{&EdtSJanuZiC}z;8aX9SslpFW&rb_GK@rnJp-LF(Hj5~430F( z6o7o<4N{n8L7Dblps3`Ou!wRn$dHl1_4M*dZ*~dbKk8-PO8TPl2DoiP=+j)3oL9C$ zws8-wyN%Nzkj-9^GSMByVg|%cP&me@AqX5Jcllw0F6lBauCPTjaX22jE|Eh;4kQcm z2?`vC*BqM_<|;u)JUEf;?F_@kdsCq+G~H&H;+TXqGPIW|z@xsHmLz#t$}sm?Zr377Bs<4ry11<4$fafS{R&8Xw#WVECCn*{5#-`iYAnC4jqD@ z5pqyO@-d4j1Qv)EG`6|V#&=?=+&(`2l48dx%{=YRcw z5A7$_eyWtZAaT{Ca-BpM;QSGmLw-gU+YSO+b*!sz09Wuu%kUc60xBy7i~5{l*wdn9 zpC|54H=)fI08I}j?UdXWG@~Gx<+L3EgdA}VO!dUp2&q!SLxcRTfW90M)zgH4s3D+; zCM!`1;`?-R4I}}41M&}$K3)@v4y7;O3T7t|BWd!7z?!Hu25g#JZAm#@l?JdihhWCi zux5;U1zgb)jlL5V_Z3aw$a#vcPC+%22?zjjXm;1~2w{&n>tu09A#?(Eh{9?pB`=xH zH8VK{lOR+;&4!);J~n8ic2wRGSxCwWIP`fJ8S{9g>dLw>FOn+8I`!dht5qH1?tuEy zIXa|6`U6Yj+5e@NWmpDl&M$MorcERm3`8mDn$mWGt)l81iKbOtF4Z_~Ddi>+pb8zQ z092Ab+RIljpE?1!ave9<&+d~%RQxWFE5#P+5HRtr^tP8;Zyp7NH3~mDPK-RHL`UnU zi*h79HZ|yeKW8}r;yst@QXq#=+07EI!`&x66eNi4(Pyw?8A;a+=sB3@@x*RUn3hj) zvi0pUE5(+=T^DdR(9D3ClM4fR%s3nNj^rH|K2v?oof6qUCrrC+$%(P2`v=VbBKC0x|lBS-Cn;*>JEB z8A(G>b%bMOfDCs_3iA#df$m2Hxh{jl`2F+%MF!>}BU+hhEs4$h!ks;m8;KlfUHFlD zWNYtDV;{nhJ*6{kfb!M5x2Gpho*D*`^5n&?n|00J*0J4{mX~(|Nny3na)GJ%29agZ zjZ$%?1DcEUN^gna&Lo#9Xn&sk_}1NURUG5JksJ}9s-{Y%kh&aA-nkPI-pW8!l{h3o zAu8gyE7rYn*>65w_D{y@a}af0F|b4*j_O!aAFe_h&RtB0gkz<+@`*W|w`ZeDjTM&Q z3`4gy1t*4T%obdG-D?DXM4jPcmdfE)A*mQN$F|7)`7DE6+1Gz9@D23eZlnEHwJ_MM z(ny;RjUg14>d(gGYg2Qq)N_m0V%oSB?O6SF|6!fxEyZUxSg6 zj5oeZU_RkRo7oK*tQhJiZnQc^k&mr)*1;v2vLzCrD!$f9+YC{T6ajjQreDBw zg`;YcBcJ`;5B8)KNO#z>T*?#ovyDDk79^{L+ zTX)<2dr7;UniPu*ZbAJ@h;u+ccyj#)lsw*oh42vWdT(*@NX0?bKPc(0QLuM=Jt*n5 z$Syk1xzAv|=9Vyi;@GvaQ^~yYI_7Xtfp5~WQ)beEX-(y;KHNjTw}Y+1|?+ZJ30bR&KqdtZ-5UZrou%eR?ZS2gfn8cCW7|O$Z8g9xZNe@>-D! zc$kC(wHh?J-*kE!-o=byTdHSLa@}6u2Ev_h6$qMCI*SUy7t!J;!bjsIG zbq77-n`4J?Dsu2NM*U2JAYBQI&C{eqfvP*mzw3+#9n0ouf?ZoiERfFZ3Qe=rymk~* zg}wNy#yidGnK@HqBAxq4x*mWQ)ay|MlLD#`*<(DVm~mhYo|LtjbXoay)R!`Oko?YB zzcZ5lm-P|t?MoBU{HrXDV^)_Y1KV```Bw0zOpyJeWxzLY^thYKI(f$2^Q!d=`avkl zRa;o`7uenR`N+h{slY4FwWS21;2j0+TjB5ex~uHjGc`My$yF}ZH7Yv5aW*4)RBBv0 zyFI!iIvd*WvKX+lv*uws&b+2wiWxN;*Qc2AkOSK(x>o)1)YAtP>*1?O8HFNlJmG5G ze%spka}#-0v=i4%4;;TvRjpI?-3->4{9zor)Z;rvFS7VH$<8r$d0MboXr#hK>ILo* zpIf=}%SRy3o)8~b%YgeVqM$-`8nmKMoX#l^(LuGF16tInFZ?H$7|zn(F^C8&9)kPK@{f`NCf|K0?dO z3`teD{E%>EZwKyiPxoFVolzf@0n2GsUvz3nQY`l&xVDCV#J&7ZZe%FT@fKcIT$H?7 z4tbFy-=*+;8ZOa-9v-3?28rCtptj>d&BnTyLoz-i&45KIx-8eME0y5BQgQ z$!k*G7@`T)HR@()g(syGrc?mg5}Z|T3jJFLdso8*>YXaJ>c>jKjGD+&5CgCh(pY^$ z-9?N*XgUT3sfApriU?8unv*rpgzl%;hc2oTUt!R(zShjxR)&{Qm>AeD$fBeQpMQds zZ}m*F&v5H_Gzjg}oEzrN;v0fJ5tv9i+RuTCW3FF84QPTYw*5v)TQ*b=vbO5VE zM{=Ws?UXBsXm8*q+LbW9;N04=j>&pTesJn0Tu(!m(GrUIg+hfx=dPRhQ%jhPkxjW# z=Qul~9dmY8GeO-SNbd=5+%p9xyvssejB4PSpA)d#48-iOv38JOZuljWWPx(L5Jb`( zI;EuoMng7x5?vOWScS!{}wI8*gcMG$ORUVj% zbvQM1!Nhd;;GT$a$Wyvv{bdnrOrlkxs14%1<38j!RP{42fHh0q+<8?;>UxhI``}L! z1ClK}U&pFyEyW7P<6p+-*@&vBM^N2?5@DE+Fb~1E!hF+XlGk)G=717`bK!>{en_kW z3!R#<74As2&rya3?4(wXobJmp@HmyawKS6_EDbk0QqBY=hv}FrSw%yrytj&RR6qv$ zDJN?vzht3{f*vRuxh5~hh1Kqqx{`R#g8DA$KVK)P4JK3TfFd9OE9f`E*Gr}Xw8|;o zQSRo0yQK=nq#&!^oTKj!YMfMnd8NtT zN!pK*b@Nb8V3TAPW344+0w~kztYpAk0T3-+&=?@GLq6(Q#~gKN5hO1MI0Dpf1e>32ayi~M-PETr>CmyZcNm9W&?@>;gZy( zm5mrzp|?rFir}4l4>}&aiSaH0aBD1td=82*)XRW+&I{=-mhWD%;D_QGCe#7!a*&fV z-J6D)ZY4@p{C~QEknKbP$Vr9$(YuIjtdvGB_Sx2;_mzASEn!|2u9!MpfWVd1Hp`%A9E87-365|C(v<~#6z3o zT*tXcti*xTy#jszowm@0cD)t9`b3KwVo!DDA=~gPCch)%U#L7a510VX1f;D|=-f-u zdd*}sHhG^@Ww>Z$(MzspTpQB~&r}f@QYZ|2MdA((qW*0b@N%FJTnVin0)L3Uq08sk zU0%2BqGVIlbzmcgwyA$*(CtQcQS~h2oXw&N?--pk2k~v=)^X_8?w+u7>i2h=U*2;r zhhPz*FB62o6f9|b7Aq(9&ZC1)!_bd0qER66|Msg2uIsC-V%clTGB6>%k7TUXR~pM1 zsQrR2ci-nAnP$eg!}*RZ0=ijD=g0bu`$`&OBsE!OIwWYAW(%W+>MbmQWVy=^1+7+Q zoLLVTS;z%oUPk1`3~T?dab13gJE;__xC+4TOny(G6koXKbRe0bYLiFDz4G|8j;N#L}ndr zb?sW{X^%7(dGU1*j1*o&%^l5NDva(G``N+UT;Uo(!{JpR*U&JQ`pA)j^a=6L6mJc3 zDMvW@R9Q?_SPk>`B&>N{UTbvhmfSl%MxNVoM6_B(z%57Xjx6;%JTJBk%T4l|0n_ z@C~-e0N;iw31}*n{_0KnrAK8sdimtg4a`1HhbW9Kty^bsJ)h~XL7?V8F=N)lQ~(R8 zV697a&>9#}H4I5v?N3m_2eav+N}iP40=jKtF)JEiuO%Hzz;%>M0O`{^QX%p_jpwJH z^4|nJ^ZW~%b0Q{@P3rXzCQ<@|EAb&-$5r&AQ{rOr*0|RQcme`eA*LusW@C#u{*7a? zD`$HgmU@-!&hlaZF(I{j)sEvmNxcSM4oIZ+IspV5;BsNEuCr8lE!0p6wHO$sP5B)* zPNU&MdtBn=c=~%D0Y1dbrfV|6M(id?Y$m^gL__NofM$fDpR+;=9dF7#VJZ+{;$tcN zSMIORA)5*7iX~sfM_z2zCBu|bo6`C*{{$46^ds#0R^$SD%2jshB?=Ai#^@lu%V(oG z7S-V!v*7;TZuA8AL*oqR;z@rOaHgmCz#{`(l0G>g({C7)M_qbE$IPWU)>!ldB?kEy zmN+E~D;>^fTo}O%_xDjUKK`;=DCM^_MW$Rs0&OkeH5$L1*`FK&n!D zK*{U=yIjkNW6~y1+ya*y@br^d^Mfe5;kjCzai&7P(8{@*1!b&`au3z=Y+&O)ZK&bT z&8=Aog5=@48)Xa~r>`C}DCV2Rn<~T{9HJnIs^U*Xvoe5vxo&~uHvb8>MSkZg7~dxq zdAq_viy25|&wDbYxCERR3=;ha7GuU*onF3^` zU>$JPJNo6Js&_u73ijBFX}9#uztYEp=QG)(!BsZ&vI56m@1wN%*l3jb6E8s+@<_6~ z3vV)b%Jj5Xsw;P*0TfpA5vW)cvmW~3N`Cl4lxX*FQKqSXVW{e($N!5mgidGOqBqH} zrsaDy#^?NAmvC1a&3Kbf8LPbtpm+j290(+7BLe$(p^~t!)qEopwzU$Mnp_5-3JqS7 zEHJ2KLRGl3nCD@=Vi!@s*I@eu9+mIdC?Ir#SQ}Kqh{JiIK)LQ-(VMI)K7+I)IQ1M6 zdHi`vzsT!Aj38vT$t~_EwYztXjeC3(xSTX;btW9TmEhKrIE^AW4r1xR!I3$Kw8Bj# z8EX}^y?TBBP1VPMrCvouM2Fl%7R(yBIG(a+#LoKet;np+BJ1Hz z{+izrxsN?>TX+f4xe?UDA-F`hC}*YtDP3LHe2nKS`g<*g0Yb?i;LGJDcI-S+l@(_d z(oWo4nbTVYK?<2V*243#iW#PAG}Myz4}~-4b>XIJcP_a(7Y7EheRZBw_SI{{(wD_N zZ-r1#{3XAd7%ixUvQNhHU{M1g4SxZUek2q3SX{(wBr@1Z6hw?SR38&`N6iLrVwr?8 z_<0a^TgNpLeU|n?29V3cNGbKO(sW}K+Ax<#*#Wf2`%Vf`tWV9`*LB&!1CqPYAu9v2 zi03f~aN`NMb!4Vk^qx7FYxk%ivIoG6d9e%hF@9kV>_W;bPyy@ZW*`CO8y!T0x-`l@ zQP5UTcS>mo7@%5N(JzidkH2k#p+)vs;MbAyN{RSCq{TvxhuDDu>@nyzeAAxgbTmnI zmK2EvRer7BDUtZ0A~99(Hj$RY&!Im$Ou}p1(1w$c+D0M?q5+etF9j+hm%9U;5M=Bn zWUZR|nX4@*V8bV@kg}1OrkczN){z}0N%&eeS|(q7W1I(CSze@(id^&>J<%8SSnw)$ zvL6B~tSm5YnEm?&fcGIq0H`-a0W|_pW0?d5`A~aUE-|C!6&Q69q`sEe2%^d-UQCMi z?OgMUX);IEwKs1Svu4Vq-ZU;WiEe3sYH!V{Q!F+`D!6B($9^kBpwp!gIq?C%1(g#| z4$*WaDvuwjg1q<|=`>kDmJ{P;A>|gNz^3UrsRO0w=V+>?yi0ndm^Tk*DciSM%61dm zjI3iDDA2UX9Yn6(UDm(m#ars*0quYr>({knQQ9yMTuRpySsr;O$I9XsMq~^r&1TS2 zUx$xLQ0Zu>%xzd_DYwc@(yzB`dP5Tg)854}5ZbpH8zO16*fB9FI&gY-IA)ns30gT` zQKXpU3JcBHaFDC1H=qcz_mnXuxOb?3MYkcU!c`}6$%{e9@1$sTO7Z)h; zhRWC7iw2Wruu~pq4#OnMYw!(1N+Yp4(Mrz>B$K7fd8QSJdLTN_bS!0YM=&O zc=5TKurGv~r}|zI<253Gm}^R7C>-kblN?q3tNQMU8>#C+2q8*09XIB@06G*!82HiT zc|(pwnYDGOhK?D$>qnXFh=n(8>X-JIExyx|VOsKD+ERar<$zc=hJ-uVpCq}G_aiq>m(HH&bb~mmE3!$H-1K7{)Mc*>)*(|s4tTyDJx5yQ zwC*$G0dgTCcf(wmDv4ZTU|5X0uxvMKIiM~|&Yk2t(d_T@{)a%q;>B;7yVfOZTW)t4 z0T4$wMV$_%R)(7BW=~El+W(XOENb?Y6&HYRSK=Q7%xEOqaE<2RqVIU|;zf+YV-kd* zP;KV@2%cf`LSh=_E2~81%9%{%?Waz;w0|GRx(sVazah$Z!U5ObRIkwYVR~NZuk>=` zq0o_XgzDqR+2w)zr65m32X{*5S@+crD~k3}_r^{z!6gOs{OKW?XeXd8RUUPj)OB&us zv`r2ie6S!L+G@F0>=Cno6RNP@D0k6i3&~^L6{N;u>o|vgsbJOiA?9thLWBCyM2`TN zB?l)Ro*XhNa>GMYR0&Q+r-7*o?tmdbl}URi5HTUc6+%voGje{y)4oIE0|(+u5>Yx=BIS=YJwKXsc%{))Z_^T1q_1sr8eaK>!pCHNNZ zF&BW)lWU-6^PYktQke_ufD5kN>rK@;{8PH4xyBceMbvtGFmw7TAx&!eNlZg-I6vlB zz)b5HNMptzb2Y{@;7v8H0SAAmvN+bYzy{3+U~NJ%rYvBr#KnAXJTV{HrTI7C;9?qj zc`6qqzG=ic%TD}5)hgcBm7-HZ^{PhXY^^t zTgrGsu7TymY?ukIiK7Bw-~gY{w`=ldw^Zk)7}FVt;InccEdRI~I1%DZ*uEHG>hSUc zD)~0H$O#zSro{c!zYql~t%cBK1zhAP|8UVJuF^4IyUjQ2<(u7}w^|#wDZ`?sZO=bNoy9df%$F79mVmJrgSz~PNyDh8aaxLv`*jZD@bv!t>JB|0+rd8NE zd+HzWk$aaA!7iCUTsJnwF zrpv>07uXHFod|#03(4WL;V{1{a?e?{Shy&mrHyqE2z_6fw6#w_s4l)?h*K4e8Q9%% zR%@wu&{A>Wv82GRFy82NsvSDAI|X!+lW7m^F6%WqPhS@ppX2tX>h`~uL?)#X(bB!~ z@dK!ki~S_Smgr=GAZ)V05|!Bb79xs&P5rI!r!W;ZRVEs z2}-#33!kjcSP9(1j*($f$5rNvkaCL{%UUZU_$ z7%vVKJi8d5vbM0ARKV1cuAP^@kmrTrN|(sFnH442Iz}rx0D3@$ziLMuv6L=x<|QJx zi+yD}q^;PwIcXgluw311KVMaBi;}U1ph&(AeKv80<4|kw;(BZ;zMuJr6P7R54&hSI zb!-WI02EjIU5Y4Nd%C$sbJ-X|N)=tn0MZ)L>{7a^Uk@$c8t;Fl=(ha!nU4sY=$^Q0 z>MOdP`Jw~on0O3IyjgfufFnpx6@93Ae7+hwj>hmig`6_|d?0jmY`~q~7<7z5e;idw zypTJdvy^!i&*h+62Ip^+-$sv!$@v=qK-d}E(O49qfE`L*18iFE`O(OgEBU8b4;~jT za7Fp3I!_7YAq*hAQ71l);n3Mg8vG&odUH4zI=KRyDr*sCq{a4J$|0DxSX`73wr>!G z@TupG!J8Rrf1rQe$jZrdf$HVTRPBnvw!$B2|M3s$AWWRAA&*2^=)Ro-@@8M(~oI$+dYg2_?tGNE3f8(JQ*Vs=@c$O?bu=|+=W=Flo~WHUWCz++j% z&0cD%K9nVG7iPqH60wa3-I2nmUMd&HoWZ*GmI_IR#QrjSm4m|{@7=- zb$_c2z?p1bU`Y;LazkZz{REoGri+F%^&&&q#bQiF`#)kK7DqCsQ|Q@_!^Wx)FS~ zIZ<*No#vf|W|>_{l{=YQz!j1g&UHceNukJ1%<3~*hC7R_Pb>)W&9bs=8Ex2;D7%q| z{ZwZ&;2Aq#fji1SICPUMq~kYntSNXY0x!fItI%ogx~^K3Ar_)}G@6r0)$LWxN@~7Y zmF&Oq*JjB%ZcgAMPVxlBkx5tz@$oD<0l})q?Z@RYeG<@eQ!y?jQ&rz_6+7oAQ%F`h% zo4>sAO||e^J40F=WzJiCmt0h$-1PDogUXmzO;mH5-$%e+I!IcFcih1CO>KmS+7(*h zj&ouw^qmiDQ!i26JEu+MZXe3r>PUvErd=UFQmGuu1j6BbLa8Bls&JKg9LKx!D=xx{ zvo9$|?W2G_)PigvklsfIhfr#EgPc&1?TeieBbTeX9IZ}|fc0DRJ4q@xt7hdw_Z;DQbl4XLbau3Qh%FXwg`aS!bG^j0k3 zM=@vFE>XFZA4SQMMV%b*M*u2JO1s23Q749)Ww1j&ZIxMOaziD^Apr{K7S}N6g6HA_ zHwv7}I-$qs`f#w4W#?WdVBGL>6e}8KJ*{%w$WZh z-SYc;Ff%IX!;$`svx}yVp-4nwZjl7fTGglXE;ddGqx6t;%=+2TnuIe3g9)v#yEC zaWI-vFpug$XqPROvn)owm=1Dif&F;gzgFyV*Gr5d*Y7N(wmes5c?tiH)pEj^Pwa>Y ziWI~Rs*`@$P?hC82mL%@XW?N3Pb1Pthii&r6?h@$6#AdH>*qtginpPG{pih`SHDV- zxGmlY5%C|j#mhF5WRufI(rY7h`6{7afP3KS{a*;~OC7?8z;D353!`M^IWlxFg?BkC zA+W=G%C_+XAD2bApz?HY!=>lTYG$ko+Id5V@ z`J@AUSoaJ|t=mXUAWxYxBAS5`uux?Cc#b}-g=BcuEo4P-u8~j=bgnYgiD9RapdyVf z8z^N8;le(ftJ<_UR|@xNVPlUYKXAlDJfSLh`6~L@Hdr$ZU;=lFa`gJ ztoe#l(aA@83w3NQ=x_?J$Pn9kLZN#vRaoAf_K$LfMY7Y+P;b#_3V4JJ&$$s}mW6K) zkPmf+_aB@HfO?V*homr&rQ%)KP9F7n2nuaO2cdNcbOriNSs(A6^bPDhW;6zbp%FVx z;IP<$Jw~>+9DPngu)F)@h!Px3U_I2 zKfSU@3iuTeNOh(N9JUBAp2DiAs9&cu4@s0Y z+V6?tLIZ0q2d>o6nuOtpdtiQVu0}p59AnR-ZB_oku`HuB5x&8Tr>m$2nmBdzxSBAN znd2+@7+1WofTp%3js;_1j%S6@O#rTf($*?W=))QMP)=$HW;NrhxMr|%jWAY!b_IH4 zsO}geImBiQi4DGe>GH0g7u2K_xL8xC*_+@=LILL#1e7d^*m>V&UEIBMf(CSo!OF{} z_RpV>-UK7EPV)440xvk4ki!#~q(kdPhSefRiUtITOsIkKLCVWr@F|dLJEalcgihy-=0^+ylY|W%xU?Wfw%7tT}6NY5c1r;i9*3|o_$T;edkp|djU^~zgfE{DYj^

#06MRtKl0lhi@e4nPexfWS{vruu>FN+Z!K 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�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 LPq~J(1c3hl{5!W^ diff --git a/.yarn/cache/agentkeepalive-npm-4.2.0-e5e72b8ce4-cc6e1b4f1c.zip b/.yarn/cache/agentkeepalive-npm-4.2.0-e5e72b8ce4-cc6e1b4f1c.zip deleted file mode 100644 index 90ae9925e30fb1666fdf133b2a85a16d821bfaa3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14811 zcma*O1CS+4x5wMIZQC}cZQIkfIc?jXwmEHgPusR_Tf3+A=DYWvciuNI?ssnOsGYSV zDt~)b*2>7p|5{5?1{4ep=wHW|>LsZEy7-?j_}{Iay@{!Tt-Xn>jj1!E;{SRp-k-M` znw#3WSeu$U7}{96nf^~t5Fn`k`jg;I+=)C8ARrGgARy9z=qW2DA||gQrl%qkm&t_G z^{O#J-+>~xp5j?vQGvjPTL~8L$T6AV4{Zl5v0|C*w_TUyqZTR3m-C_zTCY-jgrclh zIZGpK^}M2?GS5C1Jm9C7I|&|QdgH<*e?anUx$L-# z`)i#o398k)@?Cn_c7(I7>7x!7JPy{zjJyIYC~7ON`2)o_d(SJ|XM*SsPC#8-!a=Uv zSo^&wv6Q?r#EVqrYOR^-djL9%Q-y%1rH4-LLiX+xaW9D{T4I!%iq4nHz_hQ321sGb zH7IW&u{AoKdaKpKmtJDk0mO_$I-PZ_-#pJ9ZgCm}GpKLg?VV%aXdz6yl67dXZctzn z1aE`MnF`5s%#m%{bPsW%SBNbr+~XMo%yKn+6_`Q>S(v=Ngc>O7-!ho!7_evxqmuQ? z>+vI0#+H%ET;vF~(#Md+f}1njFC#-x?v&mJ6OX@7lTEQw-(VqshkapbKO~RxhtdD_ zC6z?NgOF1G02u6;#ZBy1$!qbzlyqfJ&qn&Gg4~cz?8h8px88Qv8|eQ&HHiMf!EG#! z{+J%z92X#`h(JKzyg)!y|A*fHHP;xdoI7zXRd6MqI()@C@M_2;aP(FnkP}I;C{=An z0)MX3MD`VaPh~S>BUPBjYT)?vG1wl)3#^K{CtrFvU*5d#vcLo*O*B`EZ+X_KB9fDg zovOFMCinGj9gvDePz)7BR|@65RLikn(~I-j#_X{+5<;^UjQ9w8wVu0@jz^k~Dux~u zXza*tR$$)z`tx@Ggq6eHh6NA6-Ry4LS0ZPi1C^bXGf~Yr75l-J^SE<7`+9%BKfn4o zYW;Nn25@kr^L5Cx{`Ss2BZTfi_6UgW3!$tk}9X`wJmNyR>==rF# z6SyNc_aK_0s<$WKA-M7KYL;1a{?d8u!Uw+uu*>eNhv5BPP38hxB8nXu3RzeER2`+@B^;iRV8gE zY;5XpH-aUr-45afYysD}f}{YlQQk~CcqZa4^R9ygIlRL!S#F3i?P>kAacIso;iL7e zXCU7Tz|S;WeM3dWPY6G274n{O-LbDT8M(F~t9P&lI#KQqh`A{IL6gazpoOwr0kA;9 z1BO(C17!*5LOEvHE=m2|!Gru{an2F}ef1nYWjdgFlAA&ro|1 zyNJxfa3Yu`^Ra+8GErWzVA!CH(q8x*=41P$SEwJ7mRkEvG)uDDP`%K-?|6`vLZSU6 zJ?~)0EtYPecxU@`GOTlPi2`XAA08~*z4x7iTpQU;6UifYYYz{wZmoH=JpSjH(7N2x z4pgHB+xm6DmvCVsA1hwp9$P$4A>B`Irjw|ZixPN8Xz2HlCYh;>_JRTrsedU7zva7V zVJ38Cvq)#V;WHI?fxvoMpc)gB#p0~~Y7rx%T0tzgU6BuMPkLS?7t*-JsFj8}oBsg# z&DIl`lB(g_-EE%e_=Vv}+phzKiXgp%9D^OwR>hYuNF6XbWtAJ8Q^k@7_9ps=NMYU} z362y_EBS`?SXsj547{CZTSD|TrVqDDKX;;(-kA-8ZCHOo%%FYmE0&*YN!0AgyFv+D zIRkr`n%3A_`<(kqm{aJ8co{h4uD6$9)F9P>H~IyXe$M9dxazEMX~4&Dxw&4AFqQ@0#Ml8lfUJDk=cw@- z+twK;YZj&!NpO)}(qp3cdegnc7PB8<@-Fg~%dF)?zxvkqXnVkJ2Am0`r%N(*xIxy5KXj`(;ZD@skv_@T?JV z=H~e`yVZOFlf@Xzyb)C5Jo~!n4Zmr7ApKtW7#ruUI&+ctNT)nBt;b45XNZ_(8)i8O zJZh4x$iXUp)6|cf0dR$Im6y~gD$;KX!`^u^@%0AHu7T@aYiHkoowLyy$wG)>%u7R7 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

D%S7_I#Vzcc3&iXu`)>8ql&OoynC3QR@7b z87JSJs8#A|wsdOLeI+@1J7I6Bx9=vvZqz>l0omh3a3d74KP7VERv4ha#d7MSg?32< zQrTo`mc}&w+>YNFCG_tf+<6@P?0Pc3#IF*$gZ{|7k4nqvGG4(AKbO}lDfpfgmkL|R zJ=XV7wQrUYcD;DQ(P``2$?x!6UcdC_}-zC)ypV)+tIWjaxg=`<28s=D!5fx>CK?Fhn_xh~gJHr1uE`|Qp z{86p-zjystz1CmHr4a4!%YW7$Ni}t&{ z6cPvh&!+u%^~}GU_hE=)7pNTMk zGfjWL^8fTo{!EMcll*6%$lv5V^nWJ*d)COG>_3wQ{$@X8{%7`IsRMr!|BUhfO-#i4 z&&2<4#Q#s~p8?vxskFHNnfiCQ_D|-Ya?Ib%1j_%+{C~xnKaqbfC4VESSpPHf?}bHC X2K@Iz1Ox>C`$PFVH7JMuU%&nz4og4g diff --git a/.yarn/cache/ajv-npm-8.8.1-3d331224e3-fc52cd18c9.zip b/.yarn/cache/ajv-npm-8.8.1-3d331224e3-fc52cd18c9.zip deleted file mode 100644 index 9fb342a58b27823196afa7ad7b8f550f95061922..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 398672 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 z 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

  • l9 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⩔ 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%0D@(6EzBiyb5)yOa& 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

    8dZu>PLbflj=&P3FJfQL3U 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 tdsTO~2f0tQ~IvHNaZ=@oKM6Fu)` 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 z zwErGAFOP)un~q=sAz5(M7FSkxx!M_h3qpZPeVis7-jWhhIdCzOUGA8Xn~8j`53bjF z?w43S3*6C#U!({q*_iKk*id2us1r5oNGF>-oopYwQlC_H&l{e>%e-?X5S4WJsWNAm zVc>aS(x99ONu4_VgTmiiV2-{mUJ6Jc8A5a{g{7nh6D;!cWgQHEg^u(Gz3qQ#hOR|GZe_MLx$gS`iUm7 z*tH;S|Jkl2L!r-84vnC!6pV0=oYb?hZ7)TC%&UU2dXNS>v3p5>pvWZBF0)*XRV5!< z)_V-h_KoTH8RHn|h;{oBjP@&B)_%*+HLll%bFS>2WIPvFret1G4%VM_Cla;-dZUer zJ{yGDmo--;o%rlrZ;euGG*3?NPd7?r-!#+tCcG8xc^#y2o_T!A$V^C zZJ_UXb{@Fe@+z!zm9G=*=(u#rl(S};N2QPu_9-)HZh#X>B3AwU7PF%x>&N2zb32qi zdAWBonGP=u)q4UxIPi-Oh#n0?Nsg~jH)J(EiWArolBZa_UpxN_2162iQwWXUsm-LB zkb}9PjJVjNHDW!`xaEGfF{XrQnRt+AS7KrcLktmN04A9g%W8a-fvhA!Le7Vsqjf_! z&t=o%YMke?UL=~sYJ-XA8xby;VAjnLXx>_8W`9=Ye3mV8TL{bRZWba_?_$aZF)kBd zKKhV&aquGwgHlVGr%IV{Kgis$NzyO}YQ9 z{&UVxfriCgFY2uLg3=e*8eiW(sS5ugPAc&p?RKBYO{qUwB$$ymc^6CS=RxGI@JbK z2Y@uj`>;A?$S*e0_-VCM)*l>!b1Q{}Jj1?;(EvCS0L&h}5pd=`p1RG@5Yox^ixJ#& zkgF8--}^e`u)G%Z|Jv7$|K8Wxfp~}RGWB7XIoafTEdtEw;LW7X74Iu+YKxdr9VSnR z5IR2Hh}LeeIqN;z@OujyIDr!YOqKh&LynuOKFLcO?Y?rX@Xi)wn=P%A@IJ^YD2&k9 z=FvXqbwkWLkPlkb*oEkj)<=N$5mB}L=N%lPXM!aj>9#*W3<41{C5;OrBVt+YMb;@e zi~&dnE_%NCoTZ=#iA-O|-I$v!pDMfRZZkU_u)l+#&F?sMU~dADERytemKw7Kn(C|G z-;*sqm$Uk~Q`gDJhoL_Q&<$=E;i|HUJn#NoEgz6v^p0P?C3K1a5E~Bzk@wq#Sh;o< zaFMZ?iDgaz=I*${F?)Qiw)+&8LV8)lfT*@3i@@Tabp|JoxlOvbP9E2gG)UcLr z=r83!#h*s!op#Ak-o$<4WH!+GMAoN`>S~qHm3X<4S2a4EnGzm|nDK<c^^J*HN;d43Y*%8E2 z9qnvE0q~p!v@kIa+0?xee-#kcpvbh7F@Wy*O*+gleILTc!-1fC6VDo%WT)RSo=Qpp z0noH3=^&kx8Uzb{*PHe$*AdsUI3&Kw`-cc7zG=iOBO8L@(1f+eKUb2S5WeHJoIKzr zHqiBc3>LABh^V#u9*m=Bx+TEuD~YHPx|kU7>@LwtO;*;|E1tdD&X)zE(_KHDj{faR zuvQ-fHxCp|8BjF;1eWmoKtSsNT%F7SGOwPk8R&WSf0x1E!WhEU|5^t7+GuA*)_#Rd zXT9>792=zw7vc~Sat|&|Jv*v8a&xH1JA)}`+Al*D_f(}0^Pgnora5hqN8 zW~FEkW#$4xKQX&!ID94bf`r4KHjy$z8OV(Aq?3LArG#G z)KV~izsvJsVAu`AUIZNtXn(^D)8PLUOnV%bR}sE4BXYgg^q7LzJ@fU^V>-(WIl6RZ%fYQ)tly>mroy@GeSeMr-_vecYGMsM zu=jlg%0=*>?0rFhDg!-RM<;tDT4Q_QvTbPu>NY^tfG~!i7}0*idh0~c#Z$`Z?5+3Q zbk_rSAi!W?u;0mDZdmY1y)DzAQaZFctDoe&b+L*jf7+#Zz^N>X|EB-^B)Zq_6RNcJ zPM%CO3kcWliO4gP@K-zP%DPNg&qoSb?~X_u_yNQBdB z55iHv*C9I;?S|0>t6KH?Qa%B9MFU`YD|zOo3vlM7`jkGnn9Pz|){Y~zoz%*T47G;+ zMMM}yH$n~#!vb9s1b-6|NSE`rpF@d(6>=ZYaQ5?#_xg~mZ%hz0-A%u}I<1HCso$3w z>(hLFPrcmy>KSnpD_>H)xXIIkulukm6L!s;unS2QAZ+vpsD{`N1uJukbSQxTTCBBBM_ko{#?QxK!2*@>}3E^P16Rp*j{Xk0JiHa=+82x-E^Dn95xWv(xygNNNQn&&W=H_Bk(zzG6cQ22 z$Z9-Emw;D@PT??V6KuFo;Mg-92>z@m(YjBn5r1=upAa_3m#$CUIwI z25*4Ibp@0X+dpkw4mM8q2B7i!_sQyC$$EegCjj`v{Tjht$7D!JuZ3a=hu7{#0!>EE zsQi9nu>iCeNTVrpuQq;g=1JM;)7kD{b7e~R2FWU96C!T&Q9zLZ0K~N%g#F~&9GKir0D0zQJ<~d?4+Av z`)n-)oVSvV;;|^7^gT*%B?>x>$qSL58{3mxh^zXmmQb+;gRs^Ax?&+j#NBTlN{f#E zKg!;+EvzkRyA4i)2X}XO3GNcy-QC^Y9fG^Nh2TztLvVM3JHZ{!BD=ev-u+(Z!~PF* z%~iANt}ztY{vErhHe*Dw_OL_zN#$UrU%HdB#=L%L!#Q|CrQ&??&32HDzfp8knUm}A9 zcqp7HpvESS!JIG<|NQ-=?yD_Ph(Qjr*M3^FQvJuOqNgP)%gO|UKsfS58q^sQq|47Awir?E43ThP)ve0H4A@TTz2;&Z$TazVRa?p4B+niW7KK!%_oNM z&D)R2-j5`P*eK(!tMD~+oSl7Db&>I2z5(qN^YVYiSt1|yah0i7sqSrPK39||(eAT_ zy6{itTC>{lj%7tMHK4QU%Tf!A=RgCqr^o9pSG)9gAdHjE(uKS;D|pd1J9u4gqEj#s zvZ9mXMK{;Ilj>Q^-eh1H_<}&gIk2(c)Em5j_UVmrC}wIDof*&mp}$k!iRV9XAUZWd za7(vZ{N4)-R5L8v0&AzAB>-cpLzU6Zc!)#!!=XFPi67H%Y5Gu7Uwi5?AKo?ElJYKg zPGy+#qk?%|u{Geq7H@9_`%~7%tQR2DTV%TLiQ4_qIj#UYM|7FHJ(Ce0-1yOAiFWbS z-f7MPlI-8J8B)}E17k9sBC>p)Pyh3$I|??#*anVKA8?HR34Rqw2

    1nE|yFt)Z>e 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𝔖g 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 diff --git a/.yarn/cache/check-error-npm-1.0.2-00c540c6e9-011e74b2ea.zip b/.yarn/cache/check-error-npm-1.0.2-00c540c6e9-011e74b2ea.zip deleted file mode 100644 index 358cbb7a5fc1f9493db618f289304d76446cbf50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7470 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 I-p^0}2RC9s)Bpeg diff --git a/.yarn/cache/electron-to-chromium-npm-1.3.903-3e6dfabc20-12a0c5ba72.zip b/.yarn/cache/electron-to-chromium-npm-1.3.903-3e6dfabc20-12a0c5ba72.zip deleted file mode 100644 index 215be7ad47c6badd68c85b7637f7d764f554cdb6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14164 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 I*U>-y59wEGV*mgE diff --git a/.yarn/cache/es-abstract-npm-1.21.2-f4ebace1ab-2e1d6922c9.zip b/.yarn/cache/es-abstract-npm-1.21.2-f4ebace1ab-2e1d6922c9.zip deleted file mode 100644 index 1735b16d38cacddd03274776bbfbc1dd05ecd8e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 848829 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

    TnzjjVkr_VNGY*erFs8Z1JjgJo3VmQ5$il8 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⋘ys|&{AH5zcED+d6ly=(LxH8 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

    4^)YH@0rCDkpSZNKPE6GkzXL$D)C;5-S& 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

    *?Z7A4eY*s;_2s0wR%jk8Q@dSnhN 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
    b=c?%RLSxfK6+2FqEY-DZIaflpJn-N5nyqk!#0 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 #eVMT?Us}V$M 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
    JI>AJ!SU_|Qqe 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 K=6pu_|Nal2*v-rU diff --git a/.yarn/cache/eslint-import-resolver-node-npm-0.3.6-d9426786c6-c35c6edb7e.zip b/.yarn/cache/eslint-import-resolver-node-npm-0.3.6-d9426786c6-c35c6edb7e.zip deleted file mode 100644 index 90681030d348085541c68dd1203ec4915b185600..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3427 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 diff --git a/.yarn/cache/espree-npm-9.1.0-fd22538590-8ade225f24.zip b/.yarn/cache/espree-npm-9.1.0-fd22538590-8ade225f24.zip deleted file mode 100644 index cd75e37be8508b08448e0e104b108255a8417e5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25599 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 YzEqNhg!<#}NG~7v7iE@%!5_c=A1h^={{R30 diff --git a/.yarn/cache/fast-glob-npm-3.2.11-bc01135fef-6b736d92a4.zip b/.yarn/cache/fast-glob-npm-3.2.11-bc01135fef-6b736d92a4.zip deleted file mode 100644 index 105b1dfab139e6ba3b2195ec3126d46fdc8097f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41041 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%0DSt;q#!7fYi|h9XLD-If-Wmy0RQTOC`C41~ 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 literal 0 HcmV?d00001 diff --git a/.yarn/cache/function-bind-npm-1.1.1-b56b322ae9-d83f296803.zip b/.yarn/cache/function-bind-npm-1.1.1-b56b322ae9-d83f296803.zip deleted file mode 100644 index b10b9658cff4662f9ec32836418f53c55b6d0ebc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8530 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 diff --git a/.yarn/cache/get-intrinsic-npm-1.2.0-eb08ea9b1d-f57c5fe67a.zip b/.yarn/cache/get-intrinsic-npm-1.2.0-eb08ea9b1d-f57c5fe67a.zip deleted file mode 100644 index f716bea61828fe0b1616b793703fca8a281fe816..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13703 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 G*Z%`kwyG-t diff --git a/.yarn/cache/glob-npm-10.3.4-f58cd31f55-6375721bcd.zip b/.yarn/cache/glob-npm-10.3.4-f58cd31f55-6375721bcd.zip deleted file mode 100644 index 26849fc8f32033658b55d125cdde18b0dae6eee1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 131698 zcmaf)bC9dyn(f=RZQHipz1y~J+qP}nwr!ic?cMIa`<$6Gb!Y0Hxv5l=Ki)4%RaVw- zt>=3`1!-Uq6o7x+1Zr0y{`ulRA7KAJ+u9kM=-JpAyI7kz(JTDhrAYsCshPE%;eW0N z0)Y7ETeCqJ?wi^?g9s>ILPWigDjo(#f1L< z6o;{elk@+gK*KU~OETw)DM^=XLk=HF9w;F`IGsot zsJVFNz3n4E8?!dYqFuk{Qk-1rrII}vi>AK9DQ#SbgR9rXH3v2VWNU9QQ%UQR;IJv! z4XYuB3V)1qHXFiemtk;A)qnQSfw^;Mtkd)&PxX3RL*D!^VWyj{0H&o)+kjmL#QIN4 zUhg{TG93NnuBe^LoKoflK_I{#n!QG4z^OltY?DzJ|8$q)V|Bmu#CwtLgEZ1JxVZK?w`az@4Lu;#2?MHcV{x0-yD5oH|t*W_u#bc_cJ05i+h$0gEdi+Jy$K9em z=ha~vax*;VoHCkFe~xX6MA~3BYg1wbXA&XJVJQ-xm$|Qrs_`^xPYMev}Bf+W->X537bE#ZE_{CJkpht^9yV5O{GJoBNt=N z5C+S7Fzm7kd0G3z9>p2PnIYhhl;@Uln|4J__Yzp+jPcBUgnDFGgW#d^UF=z%Zp+Q| z!TB@4)L`>7zv1`&(XyWi(EykgKZ50kWPY9=ydE1153;z?eML#5keJ7C7> z$6Pci1pc}pTLl4q;05u!#PpD4qB?rYdvLsCS#cbiOjdEI_LZ>rzlZUO7=MyCKG-rC-E-NLJQ-q~) zPi5l0N8DtKE}^uxd>-YG0G_U?Y@&>rL_#r;qQGXfp*K&IGuA=^^F|A=9NJ7YSaD(` zVkoHJx8!=06A7JQXO!kCaIXCU#7U%}Q7IS73&y#p;j!YlO-r#&IBIa6(-)CUU9?Z8 zQ5SkD5(MEmm^3IAW%gy92;zh$U}~tKe32)WC*r5Ze7z{M{pRXojnmoDsxf~anP`67 zk_#LnXBJ%*`*&D+#brM*kT9pJI)cJ)6a*Co=j#Z47O5=tGH?>JAB=!Lc=1Hnj1H+2 z%LtTBC6A$((s&>3C;iIWQ0N>08w(eEIWD#pN}(-Z9B&N=mKZ`!17iS#j{b# zg!R9%Pu^XuCeUP+a(WmHmV8HkpZ|yrI)*{< zc;tBL37PKz6)K~u0Jc=hc~RVRj(0yS!IH&Tr*&oec#a`x>`cV0NV4zeG54T_c3g2U znfVpLGZCxI--khkmKa(StnE(|6Vo|?8#3EWO(EYwmT$?97H%u;MDYO?jyfv{{5?)9 zO$~ib!C$vVK%E;+)nt`?tzmN#65nYm#q~CvbE*BL4aU~IUP^Cp2d=R#)K4CasisD( z!&1tQ;?o~xL(F}z{^xomd}d&I?0Q&B`v@yQX&QT@=?YH;^V3pH+>8;Ukv6Oy#-Ydr z0+$K656eglcgHN_{wAnMyS^2U<(8}R_!jwXZ-s>uTyAV4=7$Pw@>s~01eMGXJmz;# zT_4EIb$N(H(dT#Y@oFgC&P}15%bzl4ZP=CvbB+&(w8KbGNm4`BE^dMs>6jn<+kMd zPN}zs2^H7y*u7eD?%YeTM`4=nD_oV(LeKN2cl+TJabp{Fu<4}p`f?UBO&FCU8_>8S zLC`HJwcs`|xkM>{^7E`e<--aMC%tFpi9|sx>8q^7!TBwZ6_^QJyJKLKsH;pGE3rHD z@b8Gyf(h>+wqAV9rx|=mlbgW-)f`2|x@5LwQlg6~DPlAna%Cx-#Q74N&hei|-fyJA^vM%4grxS1j%cKZosu1BRDZ^&UL zdd(uOw6S*L<;?rjI}iEERnQM=I7j0 zf^&+&rMr6okWk?FTWZ7zDPy;rMZBmH7N5yVDKmWvE>k?7$SduR9xs=OqFwu zhOdu((E?oOo@FmpEAIH9*Vd%`6K^yqfQ_J)A>Q~9jrO*fZXEP<8vXsxyF}PT=92At zyLz*KZM^@_TO6Yk*(IkEqMEZTF!b}JV^JsJNfLZddpm!!veZsQl^ucuT(I}UA43kN zm9Zv9aiF4_=-Ih6Ck8f1S@fnQ zG9k5!ZG?*%mK`bXj;zteD{7fKpUM^NWSNDxLOfY}{@@dW3_0NAg|ckznhRN&nH`Eu zJ*zfxk`zNN;WNjuGp^i@G_fruUp0?Nrk2myyc)>Wko9eDz9bNA<2zuaNRG{U+Fz>by zRNFi``vI%~f+unVCy_m|%G7)llU@GIR7{s9eL4F#=Iq4kdwV^iBg7m?x;gIUnfp@4 z`-(U``a?e`1*0QI3j}(;b(m#dHtaR*+`~-|Bm26WDwGWJ1 z{RqwDxpRB_wx7edIT^v1zg@L$`Jc39&G~kDSlwkkA=(Nu?%lVSl@O-m>;{9!(U(s_ z&b7!Y*;iu=dsu&S^TdO$FP<`QpC$;kMb+6SX+7B@>m8Wx8M={gmVB${{d^U;7Vs~| zO@Af05^@*jrE`(6v1Q5-=TtW z+&VF&UX)C?CgFBSU_84Tv|D)-kJKr|pWyB;48MPVdUAyaMw&Y2@qy=;1O_d7f)o|v zM}){*6)HS&KHE8<=s4aC)F3+WF96a6D>FFGt zX{Ku`{eH*)k6QGv&YT(lK=uB&lzaYdDP;fuuJMod@waSTYwZ0k8%Vw{dI9Y@5|fO| zo4wA*_s@x?YZEd{?uX6~`<^u6!6alP1Hb}PT;e|;*N5nUk$~lHTexuIOF( zs%16CB2>SOFP^TBXD)!Jlrx)Lel4?s zA&_c{!8J7@L(BNlzC~syY3UvxZ)`}8T2)A>EQ^Y&wD!Egje>m0YeBH_KIh4s!EGqC z^dx9d5A%&4_A4>Z7ij$&rFcb{P?T9_$2W$NI&&rYBH(_CO~uc^0LTK2%9)dFAY&zu z*~d&uwASxymKhI2Gd6Cfkt~qVSiaVY)SsA$MP#6|krqV(4>y)4tuiTy)JjG0uMdT) zY>!t(j_ReT&~*A0z-GC}(EGhVPVXhX+D7^EDw5CCiF*7VHS|}kC4K8#0Lpq zCwX{1y1wg+=Sw21rPZ!w@1W!j>0^E7S%`hym0XATc9rrn+=lEHx|Ki|zL+$O=A$Xm z8XvXgh~zp5?aX6sxl?ZvI)mupmPP64loFl(3AaGH3^h;#yXa|Pkx+t5 zHg!@nCgc#0bLh7mYSY5>!S}1y{hH{sm4hC`dP2&W-29BJUKmx~!U~HS19c8WP>h__ z%KY$thk@J+<*DRAC-NK|&9i#B){vT_D8Y=(>ulH$u0E$Rs8$U#(>PVhX|8-@P|hOr zewE5{0g~D+tSCdU$0%F#Ut_w^g~pa@^3K82R}rkUBpY#m<_$ogPf9O`+R2v0JtKdL zo90#Ta&}QiZ|H^kp^$TEv$L#oXULnH8cN)eYl~Y$WQvdh-|iE1xp6rtd?Pt6{a42C z_C3NU=yKW_w%iepi{TEKRXDB`RY9U2)59)lmH>l_j|kJpxkS=diJHpd#f0tNHtulA z`3q2hBHt@}}RVJq6E<-)R_6 zI7L|`yv7(?W=~OVJHVB z98U|CW6yf!R@R2%nMW0BOK4{RlkUt!uEky}&_8Qk59x}%&;wu%iO(K0FiH=~xge0h zzG&5CWCWZ$hau%fBqYC~n*Ec+f^gFx%*2-S^LFN)6c0%j z`Ab?%a7%BLyo_%5BYuIYX;3(yG)PN3htV7NBzQJv<$e0QR916YV*_X){cts2a0pSo zRKV?YZfE8Cr`^LGT_Fdw^_($dlZ zlwqj%0gU^Ve_A~M*x7=PL~J1w0C?i{Sy+!XuQe$KRR9fGEgq+~DKMUO3VXam+KZ)O zcWXzoj+klqt&+W=@2jt4@typ=4ciE^$#C}=r1Yk_F{f_- z3`e5pkOkcQ_Hkig@`bN?X!FB5RI?Zve_#c9RaRsQz zG3vlo*EjFyM@2tFx8}eq5lNPU# zHT)1DPKfq%-}W*f5x{D5b;@L^+mymzZ0}vzZpI-BkL!X~)MFvNHQIX&pI zix*TV-Tc<&BK5|G6dr1cMB0K`$yuazW+wOuDP)=z3H8BL6(nlLrTJyuDzMsypg~Dk zmoKX&kR(1=O1fS3&|~8loVe`+oeXMQ=p6*(O2B##eh@!E>PF>L9iX8vY)&LAP9`tx zQMxmrRT7Y{?cxM0jiPNYC04?9-f>Wwms#p8UcelE1Iabhsbg!+5%ZZV5@KGA6{zl4 z8#|TXl}GEj#%rv7Gsq@HeF*vU`x3~kUGOsY4x0Q^y@XzhLofLkeA9C9QT2x}ZYWKx zuF$d=Aopo@U(Z9D=g7LxFr$DqMos88({YG&(DzR_!%aY48hx|GmuIUdwN#2URV+3*xtw6`7yuGUym&{nPz8 z{P`Vr)VcVlc2PS6qu7?6R=J(3DW8@@6U$Qv2i#kIeRmP_<~y@!0e-uXOdj!hJ%gyZ z^@64V)ytKk(BDRQtzzUy^FKS-KSO#EeSoG5Ksg?=Szr*rPknO;>?IdlrBKr090p+^V+5dPPH{j zbO(f-ZPpeaw{;u-c)lEYMPL)RtEk9>4JC(9jdVLOkBH|S`j#KRZ&HX|X5jkeuaK7} z+JJK(xXzpf+eO3||7tYWOv1g&Uy1g%ZXqPCp&Ep(Xg9xw2CYP?K5HqLReK0jZuCtOa>}(C3_QNma30Px+#P$7WYh#A4qh337u82KMQQsHvv% zus7;OR(yNQyx~aSFDbOoXDHzdL45r!J@5P4?Kgte!9>XK`b*4t7b5MBa3mE z&{E(#k+TdL?z=C}eEz`ltRN8wn$mN;D4SD~t-( z*7?;Fnco^rb;$qh0m>G=YK0CtTSLJ}1i)&H6;STkWD3&t!{!XQMqpst!H zNPr)q)AScg@Yj|3U`k4)^;Ymy=((c9%L4gB63a9vGwAnK?3C)6bxm3wCXR#^Ik^N{ zYaP-owK6LzQmP8UfZ(|@h8$wRWhAd1D^4aR@R~e0m$J3Ld`DPOQG_7I0Gwc$PsU!@ z7U&pC33m}XQV=|ZhVbuw*!0OeED55$RST3Ob>q$=?PFExZsUuNx#}?OckIh($;rNV z=`cJP_AR@%GzaNY`Kwe8lb{9Ni6CCo_nQ|fz_18dtO1$GuT4k$kcpEO4C;;I?CIP~ zqAo-PvOM+Ok$%w#t!)+HYSB`3dLeD+^YM}evOoedmvD@V#S?@^CUv|qqHVDZxO9*l zhyj6B!p{2CiXMN4Oik*WP>*$<3}-JnhhZvvDH22q_c>a|0D)A}JpQD5W%Z;>`22%& zkfyu8p-TIYhM3S4kCHfCny@2Dpcqg;7wV=EgD{9p8ZDA2sU*S5x`wU9vR#p%r9TNS z34;UxCBMw=&)jF@tfReLN2~8I5qEO>dW>oz-e^yuh;F%MY;~x zpl=C|$Zkmov)io3YnfS(dzJyQS0^(1_ny5rnTHL-H%DE^&yL?objW!jE*EfzpC&fg zyiqzN;??3fAT!4bN(s~Ez^u<@+9Y@lT){Ri;ny#`?^%2Yy5(t<8X}uBnp94*yLS_d ztP5&j3ibQPT7&*{I%)MF_$-GGYyl+C6OjV@^yt@43^wXE;5K(|qRB_w)_XZx2yWGi zNZfC)5>P^FQR#a{i{8ORz9w$M0XCAhLKutcrBXWrys!%FH6!p6#0nD3Q=*c@J@=%z zJ{x|;rQ{gCG>7u#w~yy+U3sT}gzl&Kc%G8P@gnfM75FR3&Gh)p4DF|rmzM`?`tkki0mz@< za_W2p)n@*d_jOco*r1&U{TEppwtFm4?+sC*%J`xdT3;5cZF3P`Yr$b@7XooycQNw3 ze<)Y@&!#`SN_>{LhoXQ%I+B$sGpO#bgI5r4KdF-ryLgvZz3lS?pXfBa;=);{?Ung~W6M&_v%+k`PI9aLPWSt%U9MBERMM|p zKW+#c2miw%0%=Js+&qaWw4vKej|w#A7p+ z`B`6y@N)90UTdV<=Bu!MM24Y>Lzuzv6NG%4(nL504gALMd=13o!c}k3<*yCrJ9V&e zW|6ylyui<=FfTyz5Y7T~yTt(0^FhsVi@<%ieZ5Hl-1-;@iyMj?NmOb>rg|!oOHl?J z`1wIG;=1J0?<`?_f6sgWE82@p-%RD?Q1q!~``5`sCY#g}yA@aCP5Qi&S@jXj;d7?D z$whAoM-Vbj{q;Fo_BG_}IT4n>M^N`*O{G30c#)-hUpQ6K#(=Ixi?|x=B|K8oQa;qQ6Q#>|4I(|pTHL3Laz*z&k~_{go*WCd391|%A@ zT+1rBV&I_jY$i33j$q!yrhdrd_i_z@e2iv?++0voQA)Tc#-~owQvuarVryY0bl{G% zBxkZTK&E6r##_&Z0ku*6rxA}H(2|@4B7m9^;`AB&*>B%F9U-IZ`AWS)9xpBf)!euy zAUxTWWa1$y8}paXDF%o2PgqF6~rEo6E6g6INxK*EVu-|F^SUc z_^t3!2s~kXF%9wB!`ypQ35Ssb&=#KExnbU{H%Ydg`dl%JiKR-ddVf54YFomN?qJXs z-tve!ZB3SKcY(5YRhtKEkw1L5eKe$AcSc5V&%Ca_0sgzlx*zwL*8Xk;O8L7Hi2UD+ z>>ug+zYA>YufPzxKd4L32T}_*U%=?*b1$VM3&RM)RheuUQzQbUIT>Moyxc4%TsMV1 z=7X|x4yF@Zuf4-L3~h33C{Qc zXolX(pJ?g{q}(FD;d-oKoQS9wQCKU|qXM+gi?d~?1*0G6Pt$UVmobO9fnx_cajTz=QDZu8JEe5UtO>091=E;Wz73*p3yf%TeoLZqgFmRzyqOg0O{Bx7x28>*>* zqz@+yHMR_C@(9NI^Hb%Zh&RLEO z9hD-d)o-d)F&c+5wmaNuTbnL;t1umG@u%9xnSUN(*KxAe{h5e?A)}(ARzYnHGX2AG zx3C+R!I;gGD7|c4LKMnj$ouN@7+NGlvFYx0tB_iD#$IcbH#0e9@bMS6E2@z=a)zLJ zn13CxzJAp;oseLVxrnF_G#z4U(~?&tjtUKs(x=Nlj=?vV-seSHMVDPaIj^dR%HZWq z&$DO*ryNf>uY#nh4DLdkvP+>i58OyAV^g$9EnukEs3K72X@T7C%KG!oXkx&*k(gXg z*|?OXZjEDqyBZ&r)e$0TtL_n9fEVJ@?Taxu>T%{)Jjk{yY>^2Ir$$L$$O2o@@8*d; z$jvn1MB56DTxztkNhza+6&1voNvKt*aKSa`oD^$Xr5Uq!thGjGTe~q%Hn>K;|oI57i4rgDnv^Q2CXQ14!jCMT1w{Ba*1 z#fY%2iIj!wD4U|IwtAkJgt->goC{@)1f!Yn3LnmR`C&On{Q6UVetg?b>OmxKUZX_J zg4N>?ghNb+3`|KQ!7iw0_zi(0YT47X?A}P!_oLg<*bU;Z?=f7bPDCdyT zN{Dck{(AAA0uw?cvQ6gmp@r>1o044!>eCJXu8!YU7MV$AhG`&0gM~epFEH6?T60TH z9zSTZlgz8obBYH`$=p^gH*z|y$loawB9?kxfhXd#hmE+%IDMQ8;^F^Ed?He;6zH|y zqBa;B*-)0&R4$|`Xu;9o%+4lN(vwSkrU z8Davatnk<>^r*{)dR6x=t24s&`nY5c3A>cpNPL51SbnnNZV!AMf71x~AoC_<**jBn z>Cth0$ZhUG3rgZV>oMQ85kSP^D5yy2u-2E7h*q~W=@Fm2;aI;jhL}uA4z4Ec`6(3& zd7lT7td+I2d~#wiPiNomrDm{X_Fa$DU_GUQ-8RImH5sq`10*ZNd&Kq7{m30wC3k9O z#5aem;;HTTjx^eYILl>bL4Kgacdez5usakM_I}aR9zLr5Y@5P#aB74xN^ZDxAA$Y2 zv2d}#o0Oa~aikQT&%n{!*D*Ev!c71RTBdnC)*q`IeH1Vkh~E=E_SGXN7kAP2?#JQh zurb$MyHkoZ=$GfxVg>d!2|Ke5`TFoE&Frn?&DnhA^F^`6BC*)#7e)~=S{<}!%5k@~ zlvLR3>Q`O$;?exA*RLIQS#x#$yxeD65lE~3t;gZ3&4WXhdaK$ z+hAFIN;fAfwAaU}=K!ft)VVbEKEe?1noFx9D`CmC(eTI4#+SrdtLSLnj&kVo-mdO_ z-WlFndB2zuhfGjDAEoV*4sUezbK(y1r5IW4jfu(KS zPpz3uZmVlKQK^oYe<@38y^Gr6`Nqvm&k>^QdGf` z#@uVv+!UXR@cvt)o=TGRxfz-|fyo9a*A~hN1e~WU7%TdNQ%80EfJ52ta z9vkJqq?8Vw)Qn*8b#B3`YgM45$-T45`U9C&iWw=SV!rbXkp9umMzR)mZ{A6|Z@ie~ zz;qVQnQVu>V`M*bGA9$jE+VWD6p+rhRK1h z5@K6RO^)dQyHJoa(jY%TbKgJ&EQLUx`=KnhL~a_!a2&Y$)sQ)J8(Y zi>$BRH>5yWfW(@q*{?o9ty_^mOQAtkDf8%$c9Df+Dxi{KN5dm1Do&TRI`-%!pkk*^ zn+d$KU9dRt7fLFtRs-jdgQ{(rqEjla0=xo$G?d!SgrsUn|riK$1%>x)wfePruCQUZkyX_Cc0amc4EbL+{fClkVXR`hWG^JgW4o~-;F zxVVSwrM|080Hvp7FE?}Q`IIaZinX1gQY8JwfTJ%So7`wOlYUlpt~S27QkJi87$_}N z{-bSexw#K`QPI8v*%$8WIEOvwmFjiE%av=_!PR5AoAqaCAyaKAhplC6Rq>rZxz_bs zU%jIt!|G|S&(|t!?Bq;oYJfeeatmzv{lm?hHoCN0c-xgDk~==KutOdUBfUm1#*I8nY zsZ(+CDa1I}U8{QGd)TZ~z5b(>l_$Bg@|)+`YSMm~zD94nT(j(xxQZ(Lp5M<$ot+$^ zFEqa9{eL(ab&%|S=HHG<1O30o|Nn}3w#Fvz|44YMvT<1q2tAL~G@g>GEEZ0c0$#c* zmdlkYbK`_f8fE(BHjQ184|`VFFyH<$sF{H;;KQKAA>mEGKW-pG)UOW` z6kZ1|z|!4y`lXea2ar+DIPYwF?4-kyoyEwtTjPlaGzHR3(4L1^3aZ_H<7FHnpK5s% zgn;t4N2dbO+XJJa0DPuw;)Mf*f(DP%r;+c$+M@#CNmG7fxi`;4exn?NV-Mu|R8HXe zOcoZFYUf8PC>s3YIms)D8Q4o@P#*@yp@&uCoQ&H(sab{6#eEx3>X@ZYxq@tL_E~QI zju=Zt3tUF&phAa5dnmC8yb#OicyjEeS>P0U7!zoYCW4wPBKzVD8cS8JL}%J2&76sZ zmZ9ouspJ%m#nPLQZF-EJ;%Dw?Xe@jTaJlE!eAt3I7vVsxp6t`1sgfLearK%JZj^Lk zS7WQ1R7n=SWE~_Oz;UmH^%Q^|SrL9OrUhR90{!0?rbgnrZHD~Ts{9qH8n5l7ik4J zL-$!1KNRC;f1d3q73{6eCRR- zwSHJi_;mMi*5)Pjaz|ukuX1quKep`fu(*np|82LT`6oRUlIfmQ;k6+IunRAfG2wL%5h8v$Htnceghh1a zokdK8Eac9g7G{EqVQWNLj3~Bqcclvw35;R|cq_y`3C-DZi2z)RBoWzKG3)K?*}5u? z89EkHbYxI#IfgSe`91ob6_;II7($lIV}AtdBNLKYOqN{bi~G=tnQ!j|FkQ=e9;sAr zjYAuPI#+7T9UDiO@_35Rj{2(*4vCJmC{~uL# zKn4af02}}y5a(|y`}aTezkJNzz}eZv@gLWM>}c5hqpN=3=s8G+Ny+I@%k^$JMbTYG z0$yuAfl?zF*U&65VQVZ(P|0l`_ua-O8(+*wYU*Q{HV25{#kq~0?UsLOGsR2Y30%*C z<$_y|knZ=!8&E!!XIF7zdOp76^zIpn6YQ0fEcs$ zE=iZrheM}?Kd@(mSOfvpdJL}fL9OPKwU?{!bD~S{(u2K)mzJV~#-r!#of()pB%IC@ zK#Ma<6`^=f;*@D!rayH4l_(ak%gmyuA8Q18BS$~Gr9 zZpahm(;_p{={^!;4R(7soK$X1=!g0lsA7lz%~6q?M{A6AR++6`>X2wQ5DUL4#e)V z&ZVTLKqEXabpm6y(wKFsdm`CY;{UQCns<3aE7eNs{^!)G-kB=&w)rem8rBMJb$Kbi zl7wC+HG`o2H@V;zi0CY3%U7j#l_ke<6RWe$nkSb9-A zzA!<0oqJ}qRciG_5Cn&{CLB9VDT=9Fj{XIw*~~;zg_)_mrzw5g60tqq7E5lMRLR5f zB>MFHCh_hK=mA>y!WW%NZKUsESF^A4hcIim1();lzOZa+jru_@W><9A58MX6j|V% z#ztzfY}3{AC)$R>5ewrSVR#=@A}#DzAd@W)no-M1pwii@oA^L;M#a-5+wN3|Y;X1p zvLCf#6J&P~h!~ypNKcFJ$KQjP zV@fcce>|W{9TS>ExLX>P3pAxsbh3_2y)7EpU>aIictwy_NcI<#GjfRZQ~al0r411* zIJozSSEJJE{5)R1H?~66O};$+w#*}{PmQ#1>ZLpJq9D->vX&68X`^!WO!o*e#L4fH z{G%=1r{57zcuNJM01AC;c8kkX;&xK}W(nqG=+&>(lbp7MoFy-8b;b||yyveqMxLHs zrm{9&l*|M?He;)DoY8Df7EvDXSVu>hP63_Bhis@WPS|Z~cY2IBds0fuTF&j=q4OD_ z^clrLceqehcr{%!rM(%;(#Wb^9jWoRYzI66RoOaQxZV+6dV0(Y-61y9+8ou9;w6YB zKuJ7suoq@vfftO#Dk8+Yw@vlTMHaRc;6u{j-&F~#w>nPAwp`mRU!O!ue9tt!$~scr z)~|3UIjx-|bysXSPs<$^i%J>AW5kM`(i&EL)F4YX;@i^nX{~>$)p%zqtdXHrxPaFW zWp@E+EAXN`LI;f#k{7^jM~~nTI+TV;jt^-LEmCfAH<@daal+SFQszo2{r$u`Qx}piIPDSu))V?BNym zqV7BLy5r`n8l#=-tnE(@q@_YrI7yy1ti7bN*1^@$%t=wg=l9JXB%3)xK!ZVwPRdt| z){(@}>S;TD<4ni%F4Yjtm85`SGnfFMBE71)pWoL9f$k1_#T{gEK*=U|*Aj%~wZ6-R zQ)_}w)h|Ik!H_v0G!*uTPc)c->QJ07oRZ6Y0Z#dF@CF^AIvy;b8AU!GT3J$!zPdxG zZd3SI3F2yS-Ya4cRu#l0Y|I2 zoD`cLmVP;OeWFAhxeLS!LaSp$7<6d4**T=iO3+$U=!;^aa@q+!FLlUQZL_4`C1(wy z@S%%OHdMRV7?`+|cU#D`Ce8a6SDjRs!Pe1BSFI*Q?2{eh&|ZnoEwO8IPA6QH*p!P$ zWfj=1gRB!Ut>TmFX|XU;b_p`d_Z+{KsVF|H*K{ zu*v_6;Xv1H|73VM%@Pu}2GYM6j$-m33@0NACHW7AQ|y7GIzhg^l*B^;wHqH|A>oZc zwGxdxkr5zhB-HL>*ooNF8ceCc2tsXm(q;hV)~>Jk+daroyn@y3e%?=gz|-#z&{m7K z0@@8J^+GCRcs&ZHm$XBr`GH9>CiEV>Hv1doM(f|hJQyd|vk2YHp)u_I>XT|LA&r5t zSSEOehX=QZpjX__k}U`{8O(LW93nN-8dpS8la3QQ+O~%DAV?lwqh!tAjt(%!mfT!;=wD1HxdLQGypWxjWGvjrP3$Ze(c{);1NGR=V?y})Jf^@IEsKF?u=wM3ky zbTBcK;;tfS6lqzU>gd9s)tb|ebL+AH`!9#ZqK;e2Wyv_E;uu6^?|(3U-jH-GyZazvFR^|PiAkPWE~1eG>)(SgTv7O z!Qq5y(7zZSLIhoSh?yzdac_ah_GP~){fprfC3hf*7@vP(*zHs;EyEdiFf4r_6WXG2 zo)r_HdZICwMFW2+aYpQfriu4ts-P<`utKQV=3q9PMx}BUDTInwGrA6UHIy*5oxnv@ zBgtP{$<#H{Uj>M1i#|fI_~6PXPQ6vuJly1REo@6n+PLE;seDW-P*nYzeb{5HFiq{v z4PprKRS+wY5H`+(Kk~B-MH`W2S$5?E85JCgZ2&Zgh&@NM!%%isXKSAH-2RL%6ap>C z){ZL7&Q=p|xi*C>X#CNY=DOI)oSMCq;idTAmIxWI@xZxRn!o4Mbf)8@Y`Qbe@yQtt zH|7Qa#gh-sUU}Gt>DNkr>xA}E&_)l9NlQ)?@EaQW6VUXZ_Lj{zNY?JZ=*588^mB9M z_={enagbusM2rR5ANi+rQOiTbI)f&3mcrjA<#vNbfURV&tJm62NjgzltR9~EihWMC zU5i3f+?Ic!U174a8u@Wsah$f-&mET1kHj7qIwptD+p9c3setN!%JmR}-< zEuVk9q&wjgRPCTgBT<@CLOJ#76&J(_H^}2IqSeIPm=Ir`SMF^5VOk^qfX>Z~7JJ4L z0MogtI|p-_!|9|!^Fb9}p;9Ch;+2c#b^mN%+R$34ier#>U0KD;JlA0{ffHRk@~phd zvbWbazdd$)0PrP0du~7B7Dq`}tfw6*oPe9)Ip|CsbX{3GS?<7ne>z`+Y1K%m)}J64 z;eezXT2HA(D%)G-;SXyXnq#RPXNC+pa5Z_;j|l!^vBkoPHHa{SuQNy~$qkG`k*6q+ z2&2VYIIwn|P^_*k1PY?WRkWsrS7d6gj;98t<%%r6Cr}oRCs{)nrKaPVG~^NG)8@4s z8Ha-}h!oxkl2x}*lfj5di2GbQCvFXR{kyB!*AJh6A=xKaF*MF^N$mpC(v#ge?gm`v z=eBA8eC=^Vo-Yp}GSu^;9DWkolA5BxBlz^;MryCE;QHJ&)%=M!pxd)wIG*b&M)sT_ z?r@$-nAale4a(`u(rte^ywFVmR!~}8Z9JbR#dWsk5Nz00WjU^}dQ$rZFq8CVXp;`M z^>SDYz$Naw#>1i`C(|u`S;h&SU6ZS1-*4tLZM#u=M{hc1}@(HeHrZ+qUgW+qP}nwr$(C zSy^ej(zb19PJZ1pz54IfYq~GuI^w;Fcb^?+KgSq#rC$(Y^11WZtR67V1L#8rz-}1R zBsuT|1oqJR6ypFRhLDHnuL?}^Vin&iAHx$WP58AKK_@nNNhfw|PD(6%<~P<48v;7% zEa$YnQ2dh6&{7r=wo$vd+??ZK=kSFJ)i^4hp)1Z_;7U`6mABIQ{KnC$KMxylw%~uh zA&gbSrWS^BU};Y#{fj3`d>Ag*gM)8nK(JwIsTN- zi<&>>Gdt2x`7ChkFAC>9?#hRYWgNAoW2=>KXYRNH8kw(e%&AH&#igU`%T%amFpMWsr8{Xk^PdbKgpIs-i> z-os-?7;-+u@V9n-G`fb?4cLf^SKIDTP^NeLJ5?i@PPmC~WL#rqh;?hkOHr+H(b2`h z1bV@iN>nQXxzke&&s`xZy*ja0pKDW8L`Hi5xHJW*mmVXR>*m&HsF%CYwR=(xZ$xz> zwA}-X8oL6`*HBZ6KX{zVAALR@>BdTBSgm7|Kf@tX)AP?+(Tv_!@ zPf&0XM3toL)pyoImRtU$l0&K=3iVuslB!lJLxIvmt3F>4Mfe^~K#<2t)jN_uPXpUz zFki|_5)K0R5=^V642iQ0=BkmfUL)tmtW5W}bsC3MElk{iT*ReYWM9sdnX0KIRLX=6 zf4KshGUzQ$%E)2Uo(nV9o5Tj)7!}hk(26HoDfFkH;BFW}9U>6px6l_iU4p)ngS`^N z2fEIzn)mwPf?(-Aoleo_L_9OsP`3iT$B=k@j)uh%VoJOlR@~q|kVBCA6z!A_Z8*!U zIzkg>enqt9*tjMsEW?3wkEC!?dC%y)+Dg^Jv5rX{H(~VIgBRu&LBQNjNitIt?t&Oj zR5q?K!o`NMPN56-Th<=tFPg*g9$5ndhSdI!fgC3kzfx9dh8;`+;XxGSr|y($sa!Jz z#KKwzitJL-gm z$*w|8y0bf5^)S8lkqfLomF+(vwUmm*h+eM)xt?;7;e!_pkq?9+9QQk?VM1@^xYzGgfq^lHtbAvt>Ey=A?uB)4kkHa=+k2xX63CmP zPSV)`ylW~F*uPER$36khV=RIYoD#sPnS%4z_$?x)+%8v=6uFp}B1j|xZ7G;9qpmL! z178}Uv0K`#$6)QTRQWq%Z1DQ-!XI}L{07 zxPrH?B7+&txxh`Eo#ibDa6r#uhv^yhC-~IuH1`B3JT~`LVC2V{b%6cV*%mzs$kS(( zMXhCFt4zrtLoMFqMbY=!QySNp?y0J^?e$=StE)T@x#qtb_=9M8ir&2P%Dj{BqVDM- zrVCPVqCL5;S(b)r%oN?ny#w`+FKM4AKu=(a32@Yr^4J-bQ5)(Md*jRTcu?u-HI4wj z%ww(lSx%C8(16?VxqUG!!u^jr6ezoYVc(>HiIRgLAdhc@{_Ll03#JKb{A$;vvGq~oN`H>6XTH#K)O9H-*>;%)BXGqPG zfK&8c93)R$WZc@b;Rg{@@-NS9j@e1Tf0GCuU~Q;l$)C`fgxu8BkW`H`$wulWod}Qo zfB-r?O~3$ca(T|RnOu^};_Xv$5(O!cCZzjK+2&S5t#ZIJV8M+vBFojNKu0}LB6#7f zJw1J~Duv}rdB?EA|9;`nMaX&zP(4i^tSXoHmfo;LNS7K1!yAn_s#*DmTf((V(Ig(P z6(c5yg5S)l!sK0n5vSLRv9hfxIaFr~^}7bWTlVtQZuzx)`T=_wJ7y=Id_3BlmjlF_ zQtNIh@t`{}P`E(>N?Kb10tWA1)ed}!d5Xpsh65M0!8A)3vSE@+m103;H^gorL{5Yb zgjH|iqT%is#$6VPb)VeM27O6@)^9PnYIg2G+_--R!nvBtInU#ZHtXOU`PVkY%s$qR z!kYN69D~lc*+N7dxd?L|`CwX29oo0<(w7(o-lC=uk~tU98CdK4

    `UG=W9}xp3J3 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 SkrePR3y{;U-U6(efc_7vvQ>!y diff --git a/.yarn/cache/ip-address-npm-9.0.5-9fa024d42a-1ed81e0672.zip b/.yarn/cache/ip-address-npm-9.0.5-9fa024d42a-1ed81e0672.zip new file mode 100644 index 0000000000000000000000000000000000000000..f29f3f6f189b42314760633cf23d21e05f06f1a7 GIT binary patch literal 55735 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 bFIdY-f&-q;|9DTp21JSi1mxcP$8Y}+Ph^YB literal 0 HcmV?d00001 diff --git a/.yarn/cache/ip-npm-1.1.5-af36318aa6-40a00572cf.zip b/.yarn/cache/ip-npm-1.1.5-af36318aa6-40a00572cf.zip deleted file mode 100644 index fa0bbc93c13a96cc4fc519e6f39aa9e0c57c7ad4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10697 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 D-#=Me diff --git a/.yarn/cache/is-core-module-npm-2.8.1-ce21740d1b-80b33fbd45.zip b/.yarn/cache/is-core-module-npm-2.8.1-ce21740d1b-80b33fbd45.zip deleted file mode 100644 index 77d6a99327665da058043db2c473515eb8b32c96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9931 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 diff --git a/.yarn/cache/istanbul-lib-coverage-npm-3.2.0-93f84b2c8c-31621b84ad.zip b/.yarn/cache/istanbul-lib-coverage-npm-3.2.0-93f84b2c8c-31621b84ad.zip deleted file mode 100644 index 1c849581e6a878185164f2bf1fe24bbbcaacb1ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11535 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 diff --git a/.yarn/cache/jackspeak-npm-2.3.3-755684cc60-a4c7c1a3ff.zip b/.yarn/cache/jackspeak-npm-2.3.3-755684cc60-a4c7c1a3ff.zip deleted file mode 100644 index eacd30ac5d4d810efbe90528ff84bff9927839ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63545 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 P{W18>w6*@W0|5AcEUm1( literal 0 HcmV?d00001 diff --git a/.yarn/cache/json5-npm-2.2.0-da49dc7cb5-d72ea87423.zip b/.yarn/cache/json5-npm-2.2.0-da49dc7cb5-d72ea87423.zip deleted file mode 100644 index 9642fe2201b7ac5c7096842ba0825fdf02089756..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63125 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

    wf?WshL@7It2=G8Y)?pIu!~@TAFDZ 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 diff --git a/.yarn/cache/lru-cache-npm-10.0.1-0e1abf4c13-5bb91a97a3.zip b/.yarn/cache/lru-cache-npm-10.0.1-0e1abf4c13-5bb91a97a3.zip deleted file mode 100644 index 5759347ee25624bcc607feaa9f8170fd06e05261..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 163843 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

    Jb$xP!h zhb-bDjq_(R;z<=))c7D{iNvMIA`6E+&H38Gh!R~*A&T&BX%k=S7;RiWdzkPeKL=hZ zE+KYvWthZUQ}d$QEcZ%bqe%=ok-?;jRf}l_L^!fK7GPBWrcuUpcjRm3OMeUAC-)L4 zIomq8%=zldM8A@0kY>0pLWbuCr4{$)T1N1Y~DE�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ೢ`2`4yQ?nGU& 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

    QQS~Wfsi{H4rdI|*CwDPSGIg#MszNCYDKd1 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 AHvj+t diff --git a/.yarn/cache/resolve-npm-1.22.0-f641ddcc95-b2f7405d30.zip b/.yarn/cache/resolve-npm-1.22.0-f641ddcc95-b2f7405d30.zip deleted file mode 100644 index 0e9cb9ba4b98d475d981aa0e9cf5576481c69b90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60268 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 NziMglqnpsT{{d-jT{!>% diff --git a/.yarn/cache/rxjs-npm-7.8.0-722f1c7172-ff9359cc78.zip b/.yarn/cache/rxjs-npm-7.8.0-722f1c7172-ff9359cc78.zip deleted file mode 100644 index e62f91d938a78dc977ad7accd72d2ef7ea82d9e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1795465 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

    NG4gdzB7gIB*e4vn^6g$o;wy33K^ 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%0AUWnQkH)l*NDAPQ45S|fU@DSWct)Mg=jE& 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 z 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�N~{@Y&oSD=j~B*uH`B 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⋘RpmVp6?&zyqrFpAAAk?kjH91c!e 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 z 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 z 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%0AQDLeBooC%f~~ zm(+f36ud8vJiHF=?$Y)ptn{wH85j43e>the6<+yRS30@Hq2=~4&@#ULjoE+Eu)h~H ztjI;~FU*RvNH?vESBUfniD5XO@r0za_=Kl#DsL^8kb@}UktrP^qI-WmR4K=-^6PvR z8m<^2ZfkkD`g?@Lq9u^c$}r{WLIPO-Hhr5;0`V-v`SQYnK#2YIGVX=NcNExL?2J_& zIN(OQ*^aHvqD!NAQqr*Q^`fRQV5(cC8$S{Lt6*y+ zGG8}kg&i~s^-|zfOqD|*l;ITe3KgZySSceyp+|A4C)Kb#@4jIB_g#HJ~=# zxDi9yuOHterBe|)ccM?27p~0%nyvOvqNr}fU>bZy&d~b>jq7?z{m2KMz(t@bdO{9UJqxc1f3DS|1u|uL+6yI9i|tNqstsx5EQ7|I(zhPGCO0-ZGPibjfMbFg42Li-4`P^ z{EF~w2Z4ne;}#?ukuiJCQ!W>gLx3D?oD~wDjKzdJ#1+X~am_KV0lg|e6;EESjY!(9zLj~OAxCU5U><|JQ zF<(mRROj_Xe!u?e_{7S<N$)T7ER156S- z#^}gvMDZz1P^Jl!g3uQrWW5?GxThakpyHvjvUorX`ilO}#e#%&$m3~8jXFE6vjI~? z8uSchr-P2ow;^Y8+Yg@)0UXU8oZcbthXE8vGvOrvDqSH!K(0qLH8M<8qk$sf4+dP`B6@`D5Y9~4 z*9OUAuruhTrmi{4iWH`0z4@ulvOn{9S)W&-s=r{edCRkuyQ7ySJ?m%T@iw7v$JhM` zL+N$Hta|lzp=?6$d9ue*aouZG5F^e@p9bO-sJtrECh(3O10wxrV`<(qw2%#voDi50 z){pGl;pJLyX7m|X9&&ru6ml&^ymi)&SdHc8XlYHE2;;+v3q!4bGNnFoNEhN7pNjk- zB%KHGb3vF-TEb6;Of@$?y&6?rb+hcKCD7)3D`z6_k8QXeC4pMD-BzGbTzTCx{H1`% zbSUAV`9iwI-PaTCkBZT8L&(P7$x-V_950qRz)_Z8;Zz=bMQJ^L;Xlq%StU=g+YDy= zLJp0gphT%i*PNs6cNV!_rcwRiJ-8uBhJbPyg-1hNqgM_6;m>%_SBhRQZ6lPdp%RXh zhG)9-CCOdA(h328%%Ep=Y))cr6_QkCkq+)=o-l%!_(B;h6*kqF@PjcQ6g+<^4|8;XsI*cVhZ5?=wkYA{s@lfYOz3pI1mEf0M+D3@7e=G8`3mq+ zwADtVJ>gP4G9Cd?Zp+Bm&3UdorA0dd$tRmQjVbJFv%VxCy=C;^q~8 z(sXZ}gEgE2=GLRTab6iEVA=}xJ{Aj!c9s`?9r1;q+rx<0t)M`G+B*Bl> zX1jL?bTp1pB0%@kE~w*~3_CJhvqUcUfygrfUTm|Zb4cYd0gD0T?4q?=rAA`N!#kwt zp}`IBXu17$7y?DbQT+Dix%b~`+$`7!M-&NQIyKYIKL=q-$oJq`;_pN9r|Y$jFY;9K z%0CKtiXh1kXBS*XRLl_#?i#WohizFz=58hD*C941v;nGC)o706f zMb=NnWH=yl8=ak+1zf^T=S}=#2My1yAOZaRa;yY(E*efdaD3v(?y+2>O58K%%hxC+}VArBb?a#O5L_6)!> z=r;)1rsqynWhDx+`GA2v3ZZ|<1`v?^eEhKxrH2UU&AJnHg@zyπ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%0AkfI}RLNk7*@Z7vU= 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

    9gR>X?(VIb?%NiRPLj6R( zPkem~S9o%b3!Sad_TXOkMw8Z9*?ZLyo$9YvfG{Ip?ZRkF1-W8C_r^-9TO81+Cj(vw zh1yU?J!N3){wjhc>T{_OJanAe;t)hVEd)W-(~=;F`jmq+hngc9p6=+dolN?BAWP_` zHe1H*dH;F53uN&?f5GfwU#PwpjmpzC(}svmVZw}MP(N-K@YgI5MaDxn4u_442N^EG z9aWzNT?j+bxy6qH?8uyi;plA46zn=1C-u7YBO|1v)F-)91E{qdSMye_@yW@RN_2I) zBAqfg$)u5+i2e^fUWtX-_TyLxSiNxihG>nntqh(p&lY~CJq7f|yy1C3ZAoRg!dP%X z?REd;9JP17b!}Hx!EOHRnzl~kt^Vp7wTk|wGI!`-`adS40oIAk0feGa+bX{7_rTj0 z`VUa$3Iqwtgr2O; zr*nNeu%?->_>)XQTVR*spPdN|kpYyIGXn7mPCy3p+Zn%VjZ_=v->%#!fO#YSnQ5-U zzG40q8Yx42W%|EQ6WEf*fux1Ez~Az|=)4I_3OcXEKcMC1-=<36q+J$|^wxd-^=3Zf zU>hDjJNG1xK~tT-sR?LG7!F-qKSmHnh8yr_MMUJC_H6;j#V+#4_A_hSa{ zFx{F=EUGzx$kpxAhvaM&{7i3H3_2JM z4yMogqYnzwN)j2-NoXVkg&plQ{Y!Qgo0VIE#$3w2utnQ~w2Df%HM1htO=+})Dc~xNz;^E09gpPtz8(iAR3!Gi?cat>pG63WQ%zx@(Om;Eu{9Y z#a-fO<%mouuQQX{nLHZ_388yPSqd?>!lXS+FsN+Ha@)1=Ruyj34U1aqVdjxVP0Wo{@Fv~X zE1s%U(B;&jR3y<$CDp*LsmCm&+7-d)@d^yopmG8(iY8ouDw)l>k}yP_3`(P^zT;vm zGr{i$aVv9l6y@tE1jtP`7~jmthzjd!6FmrA9fR)zN^FFUl5@2hs9>aLyj0S?a>uC> zf_}D@sR=TxzF{<3uRBs2B)FQKimG~ATy7OWM>uaDKIl>rIyS#SMnGV1Oh!sz+W{e( zeP6}*w(D}Z*=ybq(Q>Z25Gc0|3r&n}2Ob)4mIe+u%?Ogb{H@=rvS>g0P>6#w)#$(; z2>iV3>bsanu~7)3=<0rc7<`z;ckk3M2BiAJQ=GAxf{xuVj0lqV_1QH=t3kEt^@Qm% zsxWi>3`>MEDT8SBwreK_LjPvI-|+n@Z)!E~4Xc*B$wsOle19PKuBZ6U!oxu(wB6+A z!E@Rhrk7Q$cTkU@->L2Qm3sPGYa19MY1gFx?Uu?P1Uxnjm%s+97#%=c~7 zNM9&MtX^SUvwi3`0Ou+SoKuXdD!}aU&OpQ})DnG@fxEKoUY!h*d_4vdN(BdYq3vFo zZScDInXU!o54BAa`dd~V1ZTIXt2YN1Hk6z;DhVx*x~5ab@eSu6Qbm({u|)lk3K)Mu z=wrP&c?e#?X@UVkwTc>Qp>EB0BBJp4Qc?WDQ#GmC{Pz*j9|aV@b+$F$&g2tY2|&Ct zx}b*P%o^z%1P7kC{6M&7n8HF4(vTIk`WJiJ#Y$<^aZK{@ z)!CV0^#Y5DZm7E`!4USFz-o0u$n{G#i<5WNvEW#@XPmP5*9$RR{_)$f$zuiaUSyYvB*-j6+li58| z0|{G#eHa~DwW;?>^Sjpc&EJX;U6Er~@*?%=f=%EUjA_ZjkEN?&*E3x-PT*hAVg9zG z+eWyAn>zk`sIR&%vKFmGZbRZVD~(z9j0{da8|2PRwQ(n`2$Ho*9w6sR%n(U7Cki;~ zX!fwUXiaXcDjl=_pFC`R7Do8w*Ylye@7f8GWk_BY(wPEoy@x1x&Jnk zKLW844=cJi$!X`|b3-M3p=aj8M-*3jpAufCWxK?}g?So=UjuH2icwO(mJmW!?4OEf z2j_uaEGLbm>GK(MWTo~X=BR0s2bd157=bTZ`zms01eGF|l?v%Mat>$S0n*P9ctK)C zI5t(ND4rpFJ0%LgZcDc?jWnHXrwoVbzGIc=VD*f&0Mgk|T_fLVSVTt1==8J z)n?Z#eMa3La7V?xqImj@9-0!ZJ&T=N$`yIJNJufuPl0ZC7946?5;(TBwF-knJ>nJX zBXw`+6()Yae(CF3>y7`Oiyijwc&kBpO${E)&jM_R`mA;XufmS-Zi8gMsTHA94fTZ+ zBh^hAt@vv-y?D`tG`)*ea*6~n>AGDJu$3hmX1WZJ7|&?n6x|G#W-I_l^LxcP9PI4w zZT_6 zfwXGfCNUZqG`bWKrq;(+=Jbojb+ z8`fBFSfu%A1aqJRlHAuxpl5!Uxgt3Z611Sg+EACx|g8-KMh* zpMT9=7GgMQK7O>3O05>-kSZ!r_%N%pXjH?jZnfV=H@wEDk#fM^eXp)fb%N$f4!!~|D2v1(S9tQgBm+JN#%*n^5-?Rt(*mv_*rQn)= zfIX-ss&B?;XQmBT`^favo}00|b|TMJ0wblGHum}%RYc-4WgvmCZBA8(gkf;4U`mgP zzup4b+f2eCGoiDU=>Zx%#gjG^W zUt`0+vxB^f-@R^w)t&ny9e$bGri?Q5Q%}GcW(CnUT}xb(fZ}Fh^Rc>kF2^HRtK!Ar zjlxT%vq(0g!*s3c`OLomyGGj@^RaV6*uMBo>}<5x=e>^chA=Fs3NO$nK%Y7Ld;K+V zD!rqcF&+xBTAo{i6oSC$)YY|TaR=f?K<@CC#c!fV_k(96jguv0GrpTa9X>9p(ywJR zT``p3XKXX&iPr7dARf=md&38;NF0jRANbQ>So+$cX8bCtQXMnF6dw*L>)tI9E=RAD zsFEy^N>YS`i^w)u1s5;PHSb#BySS5#UqO~CXD}WK1FP#e9gVqEO4f)Nf$TzY%Zj>$ zrtv4MskaylCUP}D_Vs?L#4o3(p^%k@1^6lQHZ^#T%7L139-o4s4sL~-4wgnr2PhU$ zb61Lf>ZDf^4YfLv;6)v`Btuz|AslWSDqWaRUD9zkjO!{DCJb%SsdLE0%5QIIxp7{I zs}-2lBxR6j<|!z$&DC&)b)o5Tc5AjJAyuk}!?{*8Ob@(xqIBBU`$TyQ%uP#rtPiG# zOd3(9;EouwM2ctnS!|-PRdhI**i~EbMpy-WY;~XT30S3lnJ(IWMa!!DXHzQt^sR%XfBkw8O^&nC+a(LtpNl|c7(ax0NxYxH?T z>RT%OPZQ6~0Qvz!1}KEflLJyJ_fw^|%1)|%<{uY-| zP7QkwlhwP8(&yxBziCOrTXk;SJHkHb{{BkBxs8|n)qrGhC01FQpUX>0RTC8|a z70!UBGCfOqjPADn`fajBqIJ&H6$q0BM#Q9t#S0HLHO`?(l~YiXv?|x|bZG@WOmE;a zFu&Q$z=5r;j8nt$sYG?`TS7$q!{yN&Fcd{|Fc^0_EkX5*NEeg4cN_?c9BdOa9`$K0 zclI&meL<^%E^bBLfu0+$?(Xfl%9;iIellzzKkEP+=T+538(mD3(j( z6vteKV`A)$B?$2~c4JtMr(hNtntPp(N5&SX1%^u-;)TE8|FH)x+p#)_TuFbM)*x?7PU{!GcOBdVn_xEP4uvyeWBz<5CuaMu- z>syF=w8)dyB9wZ;O+%0@t^iu$=m(fneK735+>9bzfG;5#lI5Op6XThU*1vc}x5)S2 z@P-K<{8`2~Ir0o`EaYbUD|!{`>9#tCl;ojuTPRm zPf=R0#KMZ%Hno||9ZM1znveNA+`e1vMxLmeK28Je_N97HU&*`Qrkrrcl-e`R{ox^> zaNoSn9#J>rTaTGr0z0;h@C~|U)Befe3*eh(_4p-DuF|GDPI6N0Hes*ynoa6G-?>l( zCut|r=Ny{`ay=!UTIC7oP&YPVPP*FR?L`=%@kNd*dXzgqa)l;%=E0Y|BBlP!6sH^l zifKD|HG5rDaWL;gA9jNjE6aRcnO4a8+E+T;yCZ~WqVqH*+EOD%Y6#-^95w+OoBZsi zI^%@K@kME$sGLdy2OPP^6)T^6jBX@Y)>_{^1QCS=Bcbo?o%f( zAu~iSrgY<$_Q)j)a**cFcS$;)9PDoziesHDJs2&n{ab=wo05*JnVO(>bTJclSpZPCGRY z0sYI;`kyx?VvE_nr4;o0;<)l^)67!CuFJ!|=@I%koctaGrbW>JHe}@j7=zTbQkTv2 zHUm-8ICKdp0badk(id1;l%>R{CB4|F;6p)wNVx+cgw{VOEe-4L z9uQPpm0Z#%ZovgiK#)J2CGyki3EST?Svc5kb06;dPp=Gi{jV zeM=VVNn|$TL`5zUlqE&yF!Atb+GX~po&t*oM#J3Vl^MgyMxI;@`lG8!^UY+T+IUL0 zQxGGcSOxA2mkhEbg2vYSb7I1bLX() zig!*=r?6Q7WIg{y?&31fqQ-Y`vpYYjoM~8^w#HMn_UGgI@N76(&W-IH{kD@z6t`jI zMuQ<4tK#I-n+J82k#j4~Fs6wVyv^6m>j5Z$VRnB=xB zQp`EIjML1y>})w@-0k~{00o_L`!QKZQhk?uBOkt=Hsd(K^iXAE?^?aRh1{-||1rfR zFDc}mYfPGyXW4QRD(|w09zAY{Z~69ZnVsEld^^AWOVI^ ziw`yH$NDq!odZ{+`k^0k?1=*~C zlc_pjwxMqEoN#>X=lJxvF1z8SEj90c#G?~myOWb^Us!hsd{}XGtRci*MIQM6z}L~| zE{ePeWAAy4y@xUO9*eORSX;4)7zG0Il5MfLdkl9ZqVBPCpmc9)`VmkJz85k0o`AuX zF?m(#Vvg>2W18{0m&CpNC2rACzI8C4aw^Lh?Mus$ZDlXRGJ|-vU*fhC{v68X1b}wa0uMqNTG%BeC5j) zF&5MZ)r-ztLXC90YerQR|2$OX{_+Wb#`E*RbSvv3uwL#W5PDO70V;@ny=JVZJ(Vcp zGxVs=CgdPhOT;~@-y2lFMT>a$H0~%^?Yr<^Gorqt;U1emlkP40R zY$n!)IR7Q;c5Xp6gg3$B`k7_7PwZ1w(|){=>FMS8%^P*)D^Tc?GCDo0HB>Iub4#${ zfC7qc_yx?Ox{II18(d~Sk$Htb|JGT^f(7DO0gvp(mJ$xVwuZJ`(Z$R@A3s6O$ISPd z-%sq@!R04zN9{e0@bYHoDqHle8~rx_FtYt&k@|exQHUh}n_wg6DM8?CDj1q2`K7@N z<$sCS)IZKuM%>%GF?kPVOpHZGW=(-ht{tX3z{~P)Q${vvm%U%S%MvU4W$tP&L&&G3C{!%Vw`_NA(e=$kERjL7Qb!#hIoBNr{$_4+#qx*V6anGO z)6&G#$`Gc{#obpC#H1p&zEo{}r`a-TjnBQslM!v1_(>mSK`C#GX`H_Bbq;ApuMkvN z7u^AVu&BbNPD7JH3EMox^k-cblp!GxS6bSyM)rJHFDo;D$dG0iP#I2LClMOhM#j7S zM)Y9S{)YbB)TmIh^8Bjnt@x(ku*c114*Svqon|L}tM*nr;H=$0Ik~#Ly6Bsl9kYSP zR2438X#UXh%)v;fgLAUYKnV&1A8nAy+EWw~#UMLpFUF2@Tq|n0+x7X@R5>!&5 z4hVBA8M0oIjd*cpjuJw0<}{)A;0U4T3tf6DhuW30q9o@_y7?-PWm5P@nZ)k7auLpa zl}$im=EH!(z5p<=4{9ymW<5|EApIp~+xz<3qI{oz3b{DFI$u*TDbp~vA=L}B41Pz# zJiCff54UHQg6FfwkEL|N_3C3as!12!UsT<<thW8ONoCt(03A|w^>!q^*O8*-aS z*TCJt6H^Mc4u+ zwJ`(=EwMD&hZ#nvQ?0DP2{S9yzRFzQ42;EXGAr8$o*PZ`qy8reEX5>Z`DaohCzY7^ zkKz0rW212mJX~VxRoG!QcKQ&{Cb$Gg>U4^?L&HESqf&757uV8FH)5m&SbdGVJ4P&e z%N0Y#4Zn*#fzVl3*Sy?dnyu#n<>tuVY3?1uKKE?NAbL5rikX->Yaw7o(6b6jGL%u7 z(oQz&cTxoCm*b_7hjMRqGcaXI+_MGz#m{6ltCR`f4*UBk?bB4I3ZQMfqBsS2PzUAt zUqJA(gD>g&(Oo4tBX8@Md(#-0+`<*(SKTm)DOWt*tL1E>U+|+@wozKzTelUktGYxs zoEx)b_1Z|D*j-CMT7m;sF}0%;%}^-V%&Tm6cK5b^diwIHckp~~|8ewQSDQUD_reBm z;d0(XdbK92o^n^e;ZKV0CRi#=ap|++82e{c3o$gusuP z+u(2GKy5xlMzGLuC~bu83L?kFBQR-cZC8baQO~%ZvM=2|o!cSQf}lszY11N1=i|Bd zqYs*FpzXU8deIi%@S`2u>R@#BxylH>u2>QCw>9nF&99S>nEUtg*f<>=t970Xe$UD2 zk_f0jlFoh7q;t2QukADK-(qRv7D(o%5Sp(hRx6zxlcH|3)YHy{g)Gs3MFw5TAt`id z@x*LtY2ZG6SuMW=mn6=W55KJ(agB(&N|ir+KX}=nz2nJo1y$FtT`BWMv|O(|PJ#Cq z53ehoPjZX-!bod?iH4E(+S)(881M-$R8-)bfroMc_}5I)@lX~+Ip}^%%ak+Mly3J| z(0>K|HRY5FdV@)RqsK3Zqy_sfmRPCq1fq29=C<#ys%rwAhidTODaL%%T>w8sovufR zg#dr^<=rT`GhOp0Sv1$>67PkxzS61gpY7^O6>awubBwpdseg_Xyp?paB5my%$V^)l z8-M`%Ndg1#jxtC_YLpbqn`zQv++Fb>8wSX*dlfa`&PtDAiM#nN3 zjEE!O?P0S=y05=B!~WG3AuBExRhhOgfK>P2xy`y;iA!9m-B#nnXQ7p~3fPC89KIPT zC&b;0fzf#{?g7>eu~5`r7QA@AoDmk=U;FH;FO7ZhJ$G-2)om=-lAqnBV2z`;58?yk z?I6)NOd%0;3{yX`vI{{0R)|6`sJF|@F$T@caU;*Q1yyYq{SPKK%KWuM1o$qhF1e$d zU};Z$oAHzGq^U)KB`583)w<7V%D%2FY4nU}8%%eQ<-} z&pKow5bdiBG+|XsQzL{P0e*#Ni)WQLU1?>(Ehq}09#*qzE_3{VR8t2#8j*q}Ccd+h zP2g@51CN2t7=F^HeiHEcXV>Ihs*a|^{)I}t^0}^;*!>7V25bidPt+96XS1BQ1#AC; zd4eSo_Tg+kRDZYM4L(F_es-Z;(9`L zmm8T{DPa1mN-WcW;=}V%ORad&EtjE3Lsya88dIt{+$w&*7OFuIs2p5}F2^#pw(J`G zp6_B|*Z97L z-^k-&9Rklcyq=|Jo-HF&zcNU_AC9kP3KNK``)oL!G1=X2?;yL<6F<=N%%2{;A9jkm zvQGq38?2}c`s5F^U!-KV1f9iV9T--NpLu`Is5Z^*a$99lJ*ITJZxHaf;DACbXAUdZ z4Dx}@>&i2w0OXI=JF^RRA#@GwIgFTc-EDnEkU^}Y<0|>(4_?GjqJh+-4oW0N| zfk$|u9rn%}Ud#~++Xq;h1k-^^74VqIsZb@2gjM*WL}5dZ&cNyrw&rakpm$rW1;Zv4 zu;op0P9K{>NN~f+rz^#bK{*#rwHR12{et+K$gy#2THZ?$RzV;xZhiZCAxE z(hT-cotvZILkf57F(ndLg7WM_Y!rD;4SP#>B-dRe^pT?--WMS z?5l0DxoD1=XflmCIMRUwd8k$Qpo`-7lU5P7{MT1SG z>H`W@J4tl`wwqO@ectV#oa+{}hRCtRnX(zBEy4dbN%$Pjv6&S>4z<>qB5qTxhc=I* zz07(xeiAdoC;Ci4)<*)5FF*HGjA-$YzY-GoZpfu zuu6uitx=h>27Hace>;1p>(pV2D(Y|o~MPEb=`sB`OD+glvcMWQG~fUe-V1H z;mnFepWQjXTD!uTiwlCMzYN>3gLBgomcNHU*rzJ~yhbqWCy0NQ3r5{u2y9W2JO_}p z6tR2Y%Ck`#Rml#@l?f|K<&g@7T!F$+pAgj=Osf+n#R>WLl`OMQHv)Ri6(_76Qe4KP zH7r{qh39UFqz?X4(HXd?Pt4xt5=!n1S!DI#EA#;8}+2 zl8LVnll_a%MhhhWM=QYoqIxpU+C*!tXj{|h>QWQdBqMxS9sZ~^yF|t8@oYsj4LkUm zoZU=|Lsiv{E9SOboLMN(HD744+>xy^D@dl?p=n7rwctv0Q>Nn9O{j)fS)$i>5vuVP zT^N2xKW#~i1!_p?31cr(|A>~tcy5kz_x7t|mxM$HrMMB{m8a)XjcWPd{0j3^NVQ>fx#QJUBvva6e0?+WD)A6L(&BgpU%xkV5^HhkesLqmzrP zlXv(itDqzWzWH!Tr#W_4cA%a1{af&%?>t^HzL9pj5b{r0)#1v8%50-^6@XPK;Y~RT zwT=fZW0hWA;ja)JgnOMJs$;=_R2{3?UPD(K4=V>M4Ji*F3Lc1Ws7K)9MxUpiZJ@;~ z0Px}K*GyQ8Q|3%edaacpCa`CTNpqz43+WhO1XqMfuaMU5xRM;ws4!n zqvM}7=jtX`#|jb8+cTkR(=4X!%V(xQ3{$9EPnqcC%g9w?msQX~4yJbY3{4Wj~M+O zNHm!rPYb%tOgEAnsait7loai%2-p;cK!~qJg6()qku<0MlYy=nFPv}vx|w0Vk>iFQ z?n~A1-GN`ZzM+qxU)RF!fPPD=^tnWfC`Bga*d!0{-$6Z-1>+AJrD~rJCTh0UQS@Ni z!xd`{;`Nbz;0oL1Ku&g@AAJ)V_dt(|0k_5{hzNi~$Bm7(b!_jC1a+*B9r|F^{OX3; z9rdyB08(EZ^}BYaNgw8Er#v>$4~BYST+hD<*W1~6uRmpK&qRfm!o*EJ2EuimuYng; z6ef%Th;;aAD$s@Zl|cfaCn?L2i2^g*%OPA^Votl^m}}VKp+gN|?bo$>ZHWO};bMc9 zeP|olW<%oqIHlocg)aHDD)Hc^DKMRpk*OYueL{X6ka|JS1 zoiCE{^0sgIWIh6b?-1ykfL!J%wmUvZEElf>FEN8c*|egSyk>QV&>ZQkd1{1u)fHbC z+?PTTwoj=Vs8wmFNF}hGnp5grs{Gm~Mhw>C@Kx&U8{ee^Jov3gAi}sgZo2#9%>s4B(zJk8nhA!-;_3Q)`eAv(+rpH+BrX}`%fQMgjvrUBcm|!4QGnFQrc=yUHOg^OKb5t7DQPNLHO@``b&0fG zQ(~?d^=31#EGW~dEnl~$aIf3SE7(4;*i-eVttuj(os&!&Jso_qI<7#3jXbf(-%urd4>7~)TSzogl%O!T1l99%FS~({9_XIaSM@30E zog`2f9g&pqER){o!{=uzq@EPP%B6b>>tfnvwxDr^+&cBBE!HuIt8cs~xwzgC7rJKJ zpwnQx1GsM=5DnQ}pU?~O)Y{kb8PRTXZMD0@@u^e<1_bLOB^eCj#Ve$d@$NYK*)Zc( zgH=y-5l!bz#U5~(1kiI9PHYYViKL+JxYPq|vLk1?%0ht;eE(9Nz!E49{&_VRoeXyW zdDXx0QK>J-T~J$`XlG-&a-y0Ab<9zbw_}*}z}2P(xz`q<{ry9iu)spm{7UkjAD1+; z^;*EhRpv(xlFAf4zFpm9Jk$(p=LU0(14s-m&JJyg2bzch$6R(%?H%Spvl44?l!n2tkt@S*PVl-r>ys9O+cg^TM>8+20 zqTif(1N7ZAF5AOJDk`Fym@N<+D2DQ6aPdM579kJ3B?1y0&t1XS)yd1SrYLg(8^)rCQ4_^tCYTx{B?c(7sA{8?7Vb(b{Wry%3IGQ@Z zo>?`hPF0-@@Lug?fUR#@_bOsN4R>p=C8Gty`KsvF+H)!P-~{#G@*mi=KuM)FnPgBh zk>D`wt(v_d*_weUM(uJ2D-_36nB~sq8$=dEIJ2yRQHvhSiK{nVK^?39Es8rXHs1Rx zZc8!piE`S?IbA18fY8qv4GtaxZW^*^&~Y;k&3JEum!b=28+cK|FIHiE`Z4IJ%C{1D zQKJ4JVB+75v<3U~5*O2-2Tm7)iHcjnEAym_l>bbBY2kFej!6xjR`Wg><-YuMRovlB7(UH# z^|20zl0HG94UmBP>#y_0+ykU=b~nqCnp+#X=S%(xXo`nlqY@Ri1JYV-kPFQHt0&H|A@Htz0shUlRa*Okg7~oo#X_+8&3GrV@Yk8qcnkf2s$t?D)Qj!p*Z)NT2V5efySw6n>%(vqp4+`J6W;&9UilD3p}0QKsRM3g>F!M7GBsMSH6f0$$B>bI3F&Zf6t=sZSvqD zJ-?fQ!rpe6%pHlv?pP0!C2Xw$CbPA=GDcrYX=h*3q9-*foz%9Y&-+s*SGp^uyNrBx zwyOopo!Cwmtxf_wG{1BE;Cl9w71Ew<@NE{UOcKET={?JrM=5?CDtShi!cu9RwPuGF z>RM{Z3{X5{21KGCHqpv*lB~c~DtG9NFqr^yWr^?7f?Rb19dJi;@6t<}w94MnVL$d6 zcn5~}Y91RnYRaYFFju(498Y}Xx9D)SQzWPfJ=4L@s)^1Aqt20sD!l+bjbP|pcn1w1{@LPbT5VUl22~=N z2g2pQuU>-cXR#$T&4(Pit1j(G*D04})E*iE2o1|H8t2}+ofP2;TLQ5h)U{b3)5~G4 zsD)*eEaZT8JJb;bue*d$br_pE?}}2bHh^Ud8Skh9bU6HdMR7FK7U)9R zOV$=FJ4lVWGZCjl!oG}uK5Tn2o>?cXgb%98IR{vM5z?}r4Uv}hc{;hcnhoC%kUw&G zN<5OmbH}1CBLL^qS+#sdn2WhBL&S^Igt2fJl4Vl^v}A!Be|^V&Eppzq`INAaoIF;$ zir$x&O)SOQN!wB|bv;jYfv&Fg#*2YMNDH9aAGqeYfC28Lqqo!aV_j!$Pom}HH|He8 z&SZm5Xd_0z;EdYnYpfUm^M>iK8k<)_CUxw-0)~l)tAk`Q>a`NYucQ9zNni1(pbu8+ znq|@i-LAnVSv0@!kwJi_Yj*rhr*Q;ww#EbV;_2rLNVS z!$o#h@PaML%Tv0o-I(|;$vHO5=jcfn3^X9i-QODy+{a{e<$Tq@P`*)QXes&r(Q)O_ z*xq;30o0Q>MQ88H$?q?w+Qu@R^%cwTQq|m>&o2f&k_PfZ`GTq?BKNZSv_HHs54}&> z4R@Ei9^0o^YTi0WYbX(Wf@^U^$4NGMrkV^p$)&J^ZhbMsqzzzM=n(}NV==k1j8GD1NV2R-Sz9_hMx%M~Y)7!xfk}a+g5;37PHM}x2%Wkqz=#r+ z!S(8N=*!IF5>D49k5kLY;$kE#ve|I+s&l`5<`g~<5S;JK9e`BYkQ0x*RZkcJwCzdd zckZxiH75gx-t_=E*|zO>xLD93*SFlyb_l0$)xD6w^SPoW07kV^WIk)11trzkIHQWBrpovq{-}m{F zZYwWSGv2Fj!f3-NtE2I+?an9B%c+sFBS&qa%Zl}_`Q#fjXC^_KeZQGcyraEOU&7r8 zszCd@lc!I5KJarL=fY6e@F+VJuD3m$t-crT2lEnu!T-qy!N4K)q^;Yw!^q$8?DeI{ zpF7Y>I(MbVZK&^z;pq-{FeIgw!^~(4LonD!ko%uO5Lh^BDXTxbg zA;ZA;PtL*5Bi)Pp4bNZv8^xHTr!mSLlt(o{0U>GtBzoF7RKiS7)8~K#Fx(21H9Wl< zpoG_`7ri8|6a75~68g+6UGg=--)+*u1Jq49){uXxCLBWz;&rL3$?HO{r>*(enH<$$ zw2r)!tCV|c3Y=Vem$mpztjQ(Qh7S+6hq6Y0E}F53Be#!M|@bgOZ-irFdBOYSnYNJAU) zZ5)q7w*WOm?-$q`*MH|s*#|7=`j+x}-;hY|Is!@+DR?g+Ni zLsYJuOSVk!b@bh8e+FuncRF0g>L(_69%szsRMxm-Q5jsNFuu7(=V1afpjS%Yq`D=% zK$09ICpzK}MO9Fx5ZFZ)q5csf#}` zD$)>X;3jPPX+6_&@^Sgg_@jex5A0mQhdg^6K@U5LzLi;d7$vV(4)FSp#D#_M2bK4dxNU#;~);HH5MpXK|Qif!W*W2_ca;j zm<)5QGjzm*r8~duU;iUsDX=%SekCb{%BRa>3119O#?w=l*}2B2`WH)%^736)G7875jTYZ^V=}qnAOO6@+OD?RErEdw zYsp7*kxP?W=(sC7(6DyJ^{Z2#>Yts>?Crl^aQj=F(6hA6VU8W$2pxCj3=oJU-$eB18TK>dOwFZB(UcsLjoiQe#2Dr!y%qrf&F#!|PS2H27W&RHlZ4x>J zDUQ(OZyYge0scda215^e{(cyK9H$h7#jREdzj{@ULjI{A@Yv4hS6TB0InyZzBV% zWUXkQ)f@nbS8qJ|5EaaxCv0Xu(0#Ec1pOkK5o|N4-?vW^bAoS(O$rsC*EB7JG5&4M z3jtoh#DE~1m>C>AB~yca{YlIXMH=vi7v~Z+;NY;|;)Js|LPNc@<&%CFK0!lJyFa&vOxr z*@&I^Bz)JG!EVVMQk%hovgBbA3Gv@D?*#siAGABS?v_^Hqii8pveNtHbDqwH%%PeP zFQv5R7oVl5UY7MT&4@DSy}*g|B!g&r4bIP>DmcvMhSVTa=5RE*nlC32sqLyP5vj{h zXzi4ES#8@-XLA|R*&{<_b$@=|D~gS90J1Ccc`3~I7DXwAHO>lcw@f$!?gZ!qpfE!HK~Ua=o!E_2nQ1M`bTFaf1?{1&ns+?_a|^WHF6GkHpySldZ-{Tv`u4y?}jO(lVj%j*p1nA_k+V&E0+s&)9Nb2g3Y`vCd`y6rC zZ6~u!X;N}S3ig-B5P<%QcT7W}kf4C>t-z3htPq8!ayT-K7v>>rl=qn^6aCOw8$i}V z9RaKSn394&1SOeLk*!y*DiG6~|ElXN2dQau?Lx!XxDqD|s4)MfAfjeR53~yxYKpkk z_!@zH+CLfS9Roo3k2tXFckLR*L+{ou9$JRGevWl&WJU;tl9`ze(j&yZ(F=k`ji=)` zRYBdPd8ARNd(*xy76^nu`v|l6it9*Pkf;#meRSS~cf1J=Pur3wG?tv}K6%D&4_P}C zU`~N4#+Z|aye1WQ6)>5+(Fo0K%*lMLqqSEr z#!*WUKrZMf(($bMmYQQV?%B3DhXUu)!Sw0;$-fDK2cCPcUdm4l{=j_pHbFFTYQ(*2 z7^ah=lI6u|dNyfCY1JyB1!K|HAWR2YO-?imW&$?;gc#^m9}|nJrDw%%NjNZ+mK)Of zY&{L-x00P|sN3*L55Lp6L+xR2J zV%Ub8#LxJzWSsyZO(#zX&^+mDP>E6x{h=8N?4HYXzjvDv{@ zzt;*x{?DY1$SHs(TvD0z(mn!naI^#C9=Mh1>d}pyQSbU?Jhj|_yOjOYRN>31^>81& zh7XKI2fNX%g=xHJc^4V~69-3Ss9<4EnMu?pXG6~Uj)wPS5)Hsg%Z z7!47HYK#3biG=+e&Mdp}n}4w3|A5Mt4e&Qjpv$r(7-M>S4YgY6V*7$gC|V?-phw|UmD0{xNRmNT z3h!dqsOloFdkHUe0fRXe+`O2?Bm=vx=Ku*A9RNp0K4q?APsF7CnyD`*vJ_ppLCMYM zp(0;?=*-JO9iKulce{YS`X&Fc?ia_08y@|xmqS#(S-0gzt!;kLss&^H7| z;S=;cceCa-dEu*{htv60|H4E!#u!5PbStTP69f9W5AmuGp8fcA_vP-<^MjZBd;7hu zm-`3LU3#YH2+y^>w&Zf&>ubLYm6-}>8eV3GK1F5KIl1hQPD=aCeStX_^`~8iKDhZ# z`L@_~=kih+QPhI+JtfVE*N_bet>}Za;&O@RdmxQGm*vtUKkHw64d=rLcip>}3Y3R1 zTR;H^hQ1LwFx0BupQ+O{-x&-hyZ^i*8DsNm1$0QdbTKk_Mn*JAhtZSdi*tDB1!nC8 z(GsE2nX0sPuGcTTpI(igjZe8u0y3|MzzKK<>pr5-1iHsB`%^tXzF^tGnHOCBOulQm z4^&x-q4Eh^b?w?K|60)=8vZSOOv123&&vGs%{p8Cz$PNpyo^!Y}Dpz117|6kI&8&KdHd`s!r?c&tQBckrp2z}Jf zNY1@AW9f&C1fU<+LMCDYcV7A(JKb(k%RLQ!2w$lu*CB-NRS3dzgcl;!{2j; zo%jYU01JE@3D4BkvP z^>fnsgQ@3zwQ)x@6JCNwdSqMtiS5IdgPJLA8LGdB5z~lk3X_WB3I+W9{b?kINnUhS2|2_sxOdl)(eygBzbmT_!k;` z$BnyH3nr(l;>1TB|efDg`j=%N=D*godkHi3!O{s@= zfN}7&wf@>C>{L#aGkt5NwXz{+=(@w9eIorLIJDO#-spyZe5}yy-KI3XZ=~s!j+*bj zEp?9&SMvT@-aI-*^Y~`{Rwwa4IaH{rMaWroe);N5R~S@+?$I<5pK{;vq+00QCQ+ps#p6@MPl? z;KiNXmef}5)Y=qcUvt}X=TmPBPxu$u7zyCcc_RaFe|77W)ml-YQj)Lz&#SxNJbL~A zu644&Ha-Zp#E(gQ1ZcLanxU`x)=H5ohb)J{Yo2UBEUv6u%d7`vP?>E&=$Q6d5 zux2D4l_HgJttCgUWQv*T-PF22(tB>6+)J9-P#Nva?PmQ*X5g0l<*V#9w`Z_FVu|>g_rmOfGb~7{z0@UVpvT zZ7H@6`)4w~um7{s5tJcuEVC2Q3&TGBQ|p@wErikM4CX$8ol{h~NC~5-8r$eVyu;rS zTb)0m*GXROYO7uq#w*U;&gYfNLjeqZ*q>5ly4=h{7pqL@T;{r=pJy~U)w(fDh41~_ z=&DGt70WIEq0{<9r?uos{7aey!AI84`+2l&%jy3ADO|Wq0J>#F@>@5sHnwjhp2r^;v*3V$VO6)rfysiM1i| z-$T*NOHl*eD^Ua8BWj>~i>ZO`<Y^b$P zM|pXrJl(uj@Ja_$C^ew!r*)}1$|(~r`m^~HQxt=7J5bJ7W^*1bjP_$~fzM z-95`i@&KqhHhT5P0}p`9@l>nmjFSCikcS6Dt=C@t>;HMZwyH@;RKYc!m3JC$DU!lV zGh_w|1TJ(_r4?Zl`PGaf1!1H7pR^cvNl`;T2VBw6Kkalu1Jfk_jD-wg6IaEs>Z@$j zQp`Pvdd}4@tRFiNarhpC!>QuQl=3#Cj7TviuDvHjdT)(7cvWY!(8prcfw+_FLbp4) z81$#vfijg5lYI^oGW(%Q6y6JRPfS%4?ge#Dy6_Y85%?YV9yM~CU;SZ`>;$Kcd#OMM zOv&w6igo+7vvkH4RlL0CD_-8i6)*3x6)y{`U)J1jPx|l{=t?!|M#YMlaD$S1nBe6C z0OYD<-iuW-?+H~hON0lKlJR#?vlLNBy*UX5je7$~XR~v?Qe;v5g_GB>B3LB{u^c@$`lAikqI2O99VEydSuZ zc8n2?K24qQkNRTB%ITHMPIt=EQ@78$)nC8Wi`~qGl7c?>eZHs}GeI@&T65F@OhB{0 zxM3%$|B`2E+i87lNLRH|HD7%Y(0p_86(}7b`bw!lyHRXWGxZ{g{qGb$X8JQ48%0CD&MA45??~h;VSg3j>W1!a5qnZpa;a0qjil;anPvPtP*0vSwoBvTQ{r8*u0JgDvw zSS+=~4R|AWrDjv7X1&{$DmUtJHr#)+ji$cUv|Ak+u)!YKyV688&TqgwjcIqYu*yq| zo0*Nw*Ifh@!0pqUuumPKjHaBE$#$&^U}lm;2w<*x)NabPW5alnFh{_>WKIAe#gf7> zUOC7|4%|d{Hy72FE`E-{9aVXxDjI&;lNI1!alkw!yuI@!V#y!J%iZVf>2eqGABXGr zd$>Hic57!##F78qM=L05hVgC>e|E#Awh{j7`jfa3j%2C&hAK>0Go!69Hh8~>y$=#2 zNZyB7_ux|`hdczA{sCy5?NoiZPSYD)f?k=>aFXAcWDJN_G}F1wtcvW>iI(XUXuClB zpaer7@Cm(FfhpLJ9-e`(*}UcOV`>JcNxxy+Fz?mS41P*-eG6Z@RuH~8#W(+*YXm;a zrBBbS(9rn7#l$-B|3=eaUYu^gJs~x5j+Mi_O_9+}(r}>fa4`Y#Gm}PR1EkcDn`!`{ zA@ri<<}}r%`;HwvDq0|Ym?aA0M;US;eUqUC(kG=< zfcrihr^VbGcX7=U)ZWxA;VN6;0w%aNfml%#Pem*xs`!@weDdPOU^Y=_P-U7skGdD{ zx2m2gE0S&SQrGH)7;e2Q-_BI^stqn-&x-%jMDN4ynWF_q$}6k50K6b_57dfu!oBmU z%p!h&c<|i1Otek=xI$%X&Nyk@(50V_PfW#Y>R-w%=|7)6-K3w-)o}1r?*RIHf@KQ8 zO88|;q+*O@s_5VbpwtY0;p=>Cz3pFz#uc@qVcWK<_VPxP^j#el*wrBDdMCNA5m1tZ z^FhxX1xBZ$R%r6;NcpOt9_fEp(h}cjFzx0De^X9UO(oeAOZV;cbWorDi#Bl6A?k8t zB~;}TuV%K}Rr^CPHy(TU3O-6w82dilA38KoC#2SfY4FHGNBOe4XB)`c>K1|qMn7S% z$&1i8dZR?i70Pg5Ts%=>mX?Rp3scy$b#dW$-@R*hq?yH!V^1XfFg-A_>FR89F`Tzo ze)(mjVk@VLOrJmxq;uO!6+c!NPS)?qm!Z=QV=$&#up~0Nu3woCY#hnmuI;At+IQsQ zOHAKix9&-Od3oD*$tRiojV9?+wCzTMs!p(y-bmC?ua1yOKZp*=s(q}E=6G)Ot@y2Z zN{0{NSfe^vRNqe~LE+8!NbGuUgVZau>(~p%( z^=hhAi|%@%WJb4X>q^S=^RZI7tUTU*sgOc_vC)E`ZTLT|%J_zi^5b~shB+ReekdO7 z$Ad#Wn*MqN_fawOj#bvyS>n#FjudXP%Bx0;{AtlO{%C?s8;rd5viGF^*e>P;u=_au zFv$4QAJNsgSGFqe4I;XR0P=*^I6fP4gtX~u zsDo*5tW?r(5{3GSc^ngJfVL>nG|j5PaHD=%{`+oL;zUhTdaUV!rW0*DL7Gq3u2S>s zn)$YSgZ~W5QNZf0C2Fce~;o~dXu?wLNsGUqnBTbx^{)I0B+cJ`Vy$?VA z`1D|FM_*P~6DuCt=Q{`gc<$eL`O&}A&ktX2y?Ci#>K8K|66oLl_~PL4i`~OR{Zd^? zZxp7_;Fta*!1V=`3D6(Hcx8~?2oxrWcy_ApV8v`FHdX8RsG}n z$%ZRHaWWmxW;^4{{&3_HyLU}6PfrO;I!%vy5}uPgAlRbrVi9)3X{xkXVpd1yq&SJ` z2UW^PC;a)=&2SYw?7C-HY6{z9lP%pfvUDlFjnbiOkcvnq5PfPaQ*(Ck>qr>}6e~Ud zpm#`)Nb))s)krB3o{oPVOnXY*+cpZ8q-)*mb*%stnoul~%1BPYLrPX)dmTyAUb+6p z$x(yTZ#0oL8fMS-q!k0)ywlJ0`c{;l`^kK+cq8*_MUGu2+H@W&WebE+M+1q>z&(k5va~dQq`5ZZA#4M5yw$+)Sw@+u z#zYT;BGdh`5nijRtGY**z(t?U7lSv-Syv^PZ2!-{Hh)q7oBgTNHt8VAtaWb4&bRGX z|Fik}PaXBA+FCdPJvDY{NTJPOtmhUFz3b7` z<^a`wr|%SBcjDhVmSD#*sz18Mn$u!mXh@!5e6!_y6uOu zo1N~|Fc9AC0!ol5jByDxt@)NuYOeKbx)c5V)1e}SDlee>wjiF^a>twU%Yjp^!Fh*dRUkT+>xoNvo7_7zG~JkuTdUtOiIFcF4BaJWX;!Js#jTx1(EOi!Cy! zPYu;vSykmx&^D%Hk}>+nN~)?F!DkN8Z57w-Z7VA@un zIeGCExlD99g=q@MMu=w;!EuC&o!P4()pvsk-!%gJYetrECg`9-OJHm~H>^s*!`7-A zIK*O7VQ`1Gc-{pwj?*jHPW_!Dm;U=tMDH|yEQj1#xEH}*xHOjuejZ^wrg-I3!F6st+sNRs{W$Yx&pKpYPrk?}bmaLq0Fi z5;m!m;U0lSH=C`pB1Z`5Cb=d(neew{y==u98+Iitn9D1|#=BO`C1DBtvP&3LzoG3y z-J_&>vp9JCxv0dkgn-9cDv{fHNG;rDP@w9{B)n6}@l5Qrqvfmmx3>Vm=k`h08WrFR z^MKYWpD{tlnxrUg->B`oGR8pjdADVU4V_MuD&SWY!(O9cM5gAD+`elK}4yk&mRLd7eBd-L%dZNTV7gV=;V&^rLwdU3s%$;(?>Yl9f z9jI_$m-z$h@wNJf1;T8gq8rTHdI(~^>twTCX7mh3_olQ(T3cy0T@_AMxkKmHSMtxY zMnemv?cB1xO_mz{OVw_?HvrCm#{z}HH;_RfP|?M=O$Oqr3OgQYS~4v8BpIEfF8tuQWy#q1i%mIpL(B0Qk42p{ zQe6=0N}FY!7ZrP{4~y~^9F0dGF2`3h_XN5qs{eCOSID=HHBB447X|*0vI`^(TI5GC zuh2IybUmdH{2I`^;Q6z=xAoK0mq-8D-99|%{jmG;sCV#uZ~t)&H#Ih<74KQ5L=k_x zPB*C5ERA?lPEZPgwPweC&wuSB)&)u&+!ItMH*Vr#!iPU?f4|#%d9?rh=dGvvJ4d@O zUL3qQIxr8l#^)b{yjLc$t4m|3^3U!3TQ?rmbRyWjjySjn^lj766l&Y1o5b&#Hq`Dj*75CN zdT7p1x0Q9CatRA<_t70%a~Cu)*=AZenwjxh_9mu+4jmny^Gu;C+clV|39SylHo4Z8 zJXkjnJZL!&j9kUqZh?&Nn6ki1hbGbXxn7iDWL^DS$v(3?Tq3aO9!Wq4`A@zmRPgMo zfI4HmDh-5^ zIjkrwW^1jcrgs3HV;nV`?_2?eDp=*EiXcw=M z2N!1|*hPonv3ba7)dXd;9>wZi?X1#Vwn74CL3ixOmlej06^mrZG;@kcc!WZQ)x{$V zbnGC*v)u;ORb|5Suto#7>zqdX<~H>5)iBOcekQ4tOP&oFSTh5UY}|NkKVBWb!Mk6C zet_CO>E}ks|54%AliBBp;{NFI3H@)l%6gR>QnneKA9QKbDQG3VsX>PHH89foUOXjj zmY>^bp76awZ+B%VLyx*GGYgfI$G-Hxy3RjYJ+i??ibPL8ybS4N<8Lwt59BZtOQJW^ zi;=rB7~BX=!$iNs7ph){jY9G*yklR|gw16W@2?rh_ZX#hSgpX=#BNp*q*yTJ5@uK= zPDY`q%bz^iBt*zIEy10u>`@^y1>>=Ouk#pKH~>|;mI8Rc7}xgXVmupUwds@}QXh>+ z+BSp^%i#T-^)imLN2_6$amT%?KU)B+$T}^Q3R*AkARZ?q+O5Ku%sSv}{`LnAEXmct ztDclH1KHH}lzH2%X3L|3$;Snk6qT-nPX&C0W!StnCxL5xmEjfKl#J;qexMnWX4d^I z50OApA_6sp$ZoZ6*g9L_=KvBn;LRjIJ{I}(L zJK2*MHZY2#B^tQONyMjy6joG!D(BacrDE0ZdniX@3e1a~>je3>ccPg(gyhkiCJ9Jsyq}S+c1#{-I3shbo!M z2{aVhKoo|Xp{m%U0-_XXZ{+*qJF$in$CxdoduYUQ;H&$*}Bs-UA#K>HI z+VgEXzOaRyOu&iune2t9Ny>JOAAOhZ!?jtp&uC^!-I3W&HdDO13}0>{olXeE(BKG>66 zA2)E0UkFADFyeG@IetH=HE1?!i|9`keTlSX-=8Ed%H3qm(J}6JD>ghMyEH%9?rg(v-4_xQe06#1 z_waT1EA99_`)cFWSCQ9JTYLE7@_2l4gr1!b-<%Jo2UF!{|6-t0pj?gSvE^`XcS*CL z@z3Yu`S8rS*8iYptlwIPYxS228w&LR)B|;jl=*J(RF_7Xo8Ke#srtja(OKs?^+4CK zQvbOesK9&m-|_B?=RHHl^pBA_Oe!EyrKWkV4zYUnaX7L6YGGw~qW;!ds)l-6>TeYt zqCeC-s{RwULH%vusG)Re!KVQA)u#F1{?^u(`lq+0|J+UgEcnN??y8RVyZx=Le)sX# z*5mHs*4AOSx3$&l?rv@E#=rC@qaJPjY-{V8ZF91+Qgw|+gn?+ZHgoW9$%|QUvJ~3Ts#IiR=M!&Z7{HDV>*tTX7Mh|Bq>B1-?9{$ei!l zLr?%c5k}(HjnzEI+a;TqLU?_z`$m2KX1ih<1s7r3`9%+$EOJBnHplia_5VBFt*yb9 z{%ec90nN8&LFQs3kPf8TQK(2c$vvSY zlCZ<#f+HEqH!+x!ZxXvQ5Q}02LD2}$h?s%11-)<_X}a`>-ve^Z-C(gpA|Y}k72JL) zgEik}r-13gHa%<+w}=QeRR0diZ8+bh+-2Ac*E?YmI2MIa6K;j^Gjd;(t;&B(&IH+i zv1gH#iMv9&;yBlW#-i?lyp1O*Wko*zP_hH$)QgBFzD+6U#0gaKfHG3bwrAA1YcD<{ z>?!F@yj$xJ9+T$kUl9 zGvrYdvF=J;SiWSknQ_4SQ!JJB80rz`uGA)Q?w?_boO~>jV>I{o%-lgTs>4Aw(%-&Kq&4ok7Wg55GB~S#D$?; z{e?p{$TB_4a7^gCx4lnrZ{%riN>JbT*!v()#5h4Ix{es~XkKvsEaEK5<-uKIU-$(T z<*euRh*7B)w$=s3I6+h>nZ;wm9e+;!#AyJkeLe6gnf$=g4{>0QrsN4Z=Q<#EP+(*i z*ToSfpu@ME=zeeg*)uzdxV>RO=NuIGH;TRStbw!a``mk$GPZ%8b#ASZd_*IMX%jS2 zPG=C0HUV9#^mynjzr@ZN zswQHck1UWkd#ZgjevSlarp-O|`(DD>M1m6OfBtL|jd*kpiZ6&xSLCn5G|bWZ!Ok7Y zJ#Ujm$MJysqO($vrg80PpoiNOUx9!6e(&cWsHYj@r$W_ov5mEL#F@l{6yXzrnQrqO zo=@WN8hhYazVt%7-=lhcg~&U*7LlW7#4FRhuf17$bQv5dw?(LXBTzQ4&CJYSKs7CH z2Lk_tWQ!vvhG#C2fHaKf88tjl^k;D~95L|gpF+hw=kmlTX(9E*BA?NJ^61MLN)yXK zgcb!tY{&o#Uo8)Nv^6l;IONLlW_kzU$k^N#_W+vIkikh;wtXbjy)+2P94{ z9*IVoT3o5`?7ZCmI%s?Nt0!=oW^r+{1blG_0zSgLa|VIfI2`dO7y@t9i#L!Vi>oA# z8>wIm!|?7`(0i)?Ai9z(WX_+SnzcERS~NLmS6QdEP0ZFs_rx z9|k_N=er}kQ3PDP#E3yLHcr*k*L#SzM4I8S4Y0)S?8lDc!Z?$a7}Cb+>!i>(1KY>l zzo^OlW!s^fHAOoG51bUID!~?>9o&;l+{N>{Af^B4@x zvBu0%dISN76^$spT4g24K}^(j0CLpEIRumh&mGWf-pPSuA>+O=0{9N+7i8nu;tTRu zJch*9&8i?%;u$w2mGQ5kFBXTHaT;dCph9zif(~Vb@gdLRy_cF~m6JH2PL8AHuI+qx zKy>GpLRym;Th0f~G>MBLzP+4Rx~ShwL9arh7D2Pfm#0dGb%_Ka0^q9MslaK9KTk&8*8@~}Bn$j*Zl3PcDM zB*GDldo**bAsIe!qmaF4w60F8Q~$u^6rio#tNwokT||fsAFiPuy>-L>z(gVOJ|>VOq=E~26q^tq0j^1uRHzx* zLu-fHERnCv1yoJO0kF*k>eR5;vlFVK5{={!;LZT6eDgZThx<-@9&iXozf)g1C&Zd} zPRWbjt!-0}C_lfs|4I$~PhbTy6LW?E$9|x9qp1FU`V4T*ex}~lG*T*Js|$ZQ3K!9Z zaJ_-^+~znw%A~|+Ts8~*k7Ls~hc_U+Oj4Mq-6s&W6TZ zDRIK-wXcGO$@1ccdicNJ#)g~oZD+ZG!751ovEBn`o1l&-{m8%pHGXlDK*%uj*h#+# zcf3>AL%D>BTA=(C5OcAZ>_`X02_)g_`@R2u23#3}tg7E^jWBs7I>LyS?z$zS4@sgW z#U<*?_~B!48Cy|}xsE?V3vAVx>5`{Az_o{W4@JXWR}UA}BCNWN8xD5F#fG9Oyx)ma z(7*qa^Kdq}0WS)4X-#r(7z?LC2{0_><+hByDy}E8SLlv;o46p@WHRx}bvF^Qi81C+ zcS1h`wHAQ3LaA&Lx{%G=k25)T0dzqs$uj#0t2`6QTiWI5P_rUG43%E-Rk6b_~zSnl;t>F?VrQ7^yyFy99tvenK z?1Gd?6gAcjISnrE1gEDcT6a8k=y+cASkDcC(|gziK#^e&o;nS|LZxYq&3%BZB=*cUZTmY}zw-J(Uhm$R;|WkTS6$ zm~l2z%%x+=Y4D`W8p3sluxhOdRz*bcSXE;o*uU|%r;im3P6CWF7k0M^?Alw+%J;S? z_rbZva`?%*%p>Lvh5w0h$3oons0TEeP;f>LiHIkIR~d3iT&v-dNH_!7XW2!Jg#9>< z;0`oOT4UCM5>AIRZd&96;T%6ma%^B114js5pHMea(N`WTdC=wV^7%4Ahn6)e09}sg z+`oO$k^U3a6!raW0`!zWSPG~SCp<3zbxIcRe;(X4gAgsv$`2sgc8E%{Dsb2H8X&VaJgutPvG)d`6C9^v(@n zH4@Wfl(39AVZ?spGfwp!`gK|s*JVV}TH5S*!hDxX{~i?jHXlQtbw*1>d}*9R+-P8< zaw;r0|9o6b+(@AOf?qNWHBA-Fa4AVG19=I(x+Hr? zx@7dX&QTHi7m+SGnTotkyL|f?N}En)oAS}7? z?QRib-UEgYSU03MfBJWz#T6}9(ZZ0=I~G~{c*28%-`L15o)o1#6H~scK6a=D&e<)A zXF%#6@OGPC4$E*4@T!7>ni(l_oby?UNZ>V92XfW}@(Hcr!-cw~-ofk8?FgB#uM^7F zpvPP+#GEIcQZjyLG~@av=*XqsCdse!X@OI!cYl{R1uBbUVifVx!=r81xPi2bBY0b) zH}AJ)FG745_vB_+KNNfX+!>$SwBHn>qPQ}u&6|uHL zZtdrfOV??>Mn>0=_cl2P#LKvzdE9sVpvT^82#ODG)z6koDObrz-{*;&Kj2(JQfIzUli8HGNAds0SzIBS6leCHZKRl7F*MLH^2*%wOy4LR?EQ|M*MP9x zkqWVnC}P+-V%i>Tr!^vSocDyukU@DWa<6eo5r0+x{+d>f68x3Vw;eJ$&XF*U@s5r% z8o?B|b<@iLSjI02$jip0fGNnJI#J_qd+9F-lB= z;qm?swN((#m*%*N4c*jikpOH>nIyg9xjI}nBr27C*0$wSB^4-iivPODsLavnzL;o+ zWNu?pN%M*QB9q`Ho<|TIXtocxD~ODg^Wsy1L&|F*iHq;+gA*xr<{9s5UtxFRG+&^M zhX}+}*ZA)QI&7%#mD?5};mWyo-Y?3UL8y}>7{qW3s2vPAh;l|$HVPRD-!IK8l*G@8 z;(WX=77^zw6a7ygmpIUXJp;xZSxu>~>+78tz-HzRUWjETsR5X~EAe+1vJm*lA+kN# z0f|?ALvDg87r_1%Q1mhD@Xb}P<~D*Pz+wEhgR_dT?u#CzAjCx^TMo$RYQjc##=V=D9b4mr#)G1&YkL%y_@pcL|CzgK#9wOoKI_! zmK;`AaA&529sns?)^0L@Wl?h1H!}}Zr6Z98hh{{iQy2C6WwRU*=zD^m$K;Y z0L^cydXCf93AFjaUJZ~%%%C=f28M3|TI)Qir$LlrKe=o=Ydh2zl;ix+Cy#ovF`ElE z11c84-Q+l#2anVHI%T0EyFon8=}jApVWe{BqwS_cRsQZ+7>_!5^7y)Hj5LT^k@gEGtxzmz0(M!ko7XM zLBNSMAxd#4-K^4!=zWrcC)g~LbPCb3K&Cd`p}9w5Q!>BN4x1_n>!biS;51dqI7q?Z zbDeWBYrrcp?-)aJqY)~x9IHdN%$FeqPXtyCq5AtTEpJqrJ$qV}Evgb(Zza)?gRprI zpcDyN=`I;S(usEq`m?m?B)){z-gEE~QOCI+u#dqXJ%;c&|ifBZCdEl+g z`5QAuc6un&U;=B%J*9Wm`#pqatY`+6?s1~I^*`*TWeR9Gw%hW^#zJI?|AZWfD8n*M zFzylg0bXx7vSAVFT-Ub|I)d%NoNIXVGw081<3S=_2s~+$X$d%px_yJY1%rKYaMNq*FmTsOzL0)IHVyUSusV8Wn+x$OZzCk}yyrMAImv zUZx_F0*YHJp&Mv*ZxaP1S5*^mcBCFA2#&dJMI%nYm1z6eDj!v*Lbe`IamFT2d5IdX z)zwKB$NSZYv3Q$N)g^h?1@DxUB@m)1CU7ChQ|tYY=It5lfV{-5#MINbp=VF4?Y+ALN!FLJr}c*UTP0}Ut%#5LKg^t zNHG$z+C8VNN|^wq_W1%YNZIF6{36&$VT#5#n|>D)mx2&zS2fD>y#r zm3%C7p}f77O9H}JM2Sgjhh96O074>-0dX&?k-5yzWL*n;GsOzoL9!?Nrv}fVlw_Q zdok+ettT)~aDmjko|O9`#E3Gji;!xljY-jCzPr%Y=Tm)GZvFgmm1VBF5=`Pc7K<;j zxnD`GE^2JAFTlovyKh>@USLDqWJN}a?VC7YF(Hq9$@PflyyIc2y!x0SR!CDZ zDo>x3q`+jVpd}hMsLf8Nc`YT+6aX^1Ef+r_*Z6f^U%(Qb)`AH=iT#XPAh?P;3l|g2 zyKyhk89bLJ=E44LB>DWJz!~e^EgPJSEogsv={vtDAd;}Y=*E*ofv9=ex?~~ z5-u1{&W_87tSw5F{issT=6s8(=H`~fT{8R1bM+RUtH=-L!zs#y+DE&zP#8HDVuwO~ z=Z8DQ(oFM6(v!jgBc;!2ZRaHl5|vr5&MO58(;P8ds4z!EZ3ReuR|2*i(>33bV{pX7 zEvnbBUeKBUMLLKwBHx#(p!VW<+xtFA)(KM;mbj}zHw$8W6x>xG?bP)*+Uo5&8+{ZA zQ%e0lq14fPnkm5tTSxU&MAY~fh+t3rfVfbBcoD~=fSDQRGr#n1+)TxeV0l@%aX|>% z``kiOaYMKiszpjd>Pd|?8g3FBx=gu@UagmF8n+LJ&FmETHL%%uQoYFZ7WyjT2uKOu zO4>K6x;*kKMrNmgs||#CeD9tn7#>@|92Da96tMRxYrzPPPKkveXQn=fH@%xEQRu|a z`C5%6)CiPF74N(>9O?dcgDXjprUi92hbcKuYps!TUS1mE*veG%5310$8s$Wk4Jy4o z)-#%)zb|sGu4`o}VQo3=OHG^es_o7* zuhrCL0s0ku!+uC_^tdmXEyEed!De~x$4)b?o}YzNd*_ee{x|=TrxLO)i~u&AMVPE6YR>++|e~2IMnc>hW~10 z8%hm;_jhm6_AAQmix>~f7_y6}w{KcZtIFPomR(UjlVbPVoh2A2xy{dU-MN~PIIZS3 zo8E=R>Ehy&_1BUroh}xW8ycb~>$s36{#@TKFMmmprar^Xlw;nNGc|GEvZ*`K+oF2` z@mbe--O+{5c}momY%)wPjxSv%D$Ky8JwmxGr#;r^s7yogu_tT3IV{B|4xhd2#Ih{v zUr6R&TyUjVGmCVpzPzX^oT>KhKYvcLCqdXpqD>MSBaQ#VFD=%Sz_c>z^J7)iCp5?* zozB}NZgAmPPef|wdqBNF+Hk3JN$@8TIEdx1EFkpbV>U$tHw7^Wbs6(m-(!_g5j$nG zT8)jomGE6NQS&yZgMR;{e&p@x9yq81*_|e2H|Ov(g015w3uJe_*C4Gb=}REWYdbQ( zjeN}}3BS!)P+-j?P7{nsY8@LX0a1;c;$czx$HlLZlJKwenz_yx(c-8GIQKK&rfF$K z6j<1pf3&RghwR|W)=!z&S7iy>C(k`WJXE$@ju1j;<8 z-ae_xm2jsc1}fsfb1n|cMK&#+qe@%^r7Xmp=pt3=SbQAOn+qAAV04b+T5z&Oa6*m9DPCbHNa8`v-?T@<^5^=3- z9&P+1K9U>_!q=*%DFQ%QGES~#qGGq%!+;3EMUp8Cr@2oO0TR7={3MP)R{xF(`~H?U zP$EHc$}3i|vLDVDf$GtAgFQ@*LX(X04Ev~WvjzV0q0#Y0WemkR%-nFHp82 z{Uem}sL{tue((4GlZK(tOf^x4jKzAR;GF7c-fyRcH)v8JVsgQ9coNGJZ)(=%D$h&O z>>U{Cw%O{<0heLzVWvPe)JbxQ{L)|^Z>-^#BuAk!UaqigY`j58IcF>>B|HtM<|WDg zl1(hg>JZktSK$%~wkCRMu!ca>4?h>6alp081CCF(_oyESXH$$UG-0bfhD`SWihzVt zFgs7|4&>VUw@hIN^I9S5aB-VDuxNdckiL!db>BBZ&@Tc)W}>l3yA+VOfR->8giS#) zNwkDaWnf4RvsJT6ZQb9amas(m#}y$I)f<99zkXW+JwZsOPNdr#u6P?mNh@|Kr#G4; z%s<1$X1OTDEf5?v<8fYw@Emh?=e(8&$7UDBye%CcZd)x(a3m5aPQW94GV1ku=d++u znQU~OQ67`agsGUxdbbh&e39TdQr0dA=1(j{AreO*ruV-0G~o^cqJ$5dtH|UEs*ICO za2h*Ta>w6souH5f2pak0%%MXqinvAg)(BSa4B%v;l0$1M?L(JJ;*0q{X-v|RlC*u` zreMm7QT-7?pOiAZ-MuB(f@Ja8)P{v>#5F!FiEKs^e1hQks7KR?g1eZQl(aX)_kiUS z_?+v6&&hFH$d!=4sUEyvb?B2Ou(_H99(*Fd)61VA`LoiW3GilyjQW&RL^TkBxN#d~R zZzaYh`0gI|8e1l)Ng;-#RF1mVgNw*iLnFGr=r_#TxW)SpmEc;3_Z`C_+H~lrKrwbp z@rhv%lJM1~xkg{_mV|%hj_rJ>iN%~d-)u=;@>&-98jub4D3h3auHHDNoxLyVWXF4( zJ81Erm^_5oxVidcIH9WJ(w9XQIL`YPW~{vIJ}E_!BQD~-h&br=?Ux|pIpT0Uk0fSl z%Vciaa%ruhuEQ)r=Q+2*+fY6wH#2dW-!k^t*k#0D{fVY~J8ye`c%$8lo@q%=X3JC> zq|EC3?Ftou=$y_8J(vyOUCbG+UcXjzLeGzZ{NO* z4#F5d9dBGAD+o9H^OwuMg}3}I3=8z6Fn*N47*_mAq5J^0hxKTLyLhzoZ+aIeYi~ry zCVPKaeQwF>BbB)#4iX$)BmzBCJ=IXeA6SZb3yATD`R9MV`KP=L*n>}H03uaU&wJJP z{#v;AUC_EzS!;*hO0XOeQ(Ft(N+2E{hKziY+aKmHDbtOe@BX11`$ISOhi;4z7jTdq z-j!>|U_y-KR6^qES!q@0GP2U~rnaByu3a!h?^7|;(D03G)Ie(CT8Z~RG+|>`x&#N! zAYw<6uTE19-fzO-!}WSUMqw#;P+o`(Ce* z2js}~mH~kJ_wgr6-O8vXGD&g@^a+NoMv$Yt;hq$kGT)lF+R+aTkI8;dLapxob@QVSn>pvL&LhdpNF?<+$cMG4|`2iD`o1u``dDBl60GmNG>)` ze1V%$tYTRbJtIdM2PnZ*o40MQ&95=W-$oCHwCrwLgOX$>AkRQBA|Whg-%Wdn?8>P+ zopUzVKfwo_B&=TlOdVq;KN8Q4Mni-u1)m?11nAtVf68&hf_L_y|FiUrU0C z%}_A%0w*Quap4ehDr_z-KNAz`v?|vk2`4C!yn{iJ z^(2}58};A~dqM9|ic2bfi3WF)=qBPgRLaJG;tfWK*4-ytTX&xjZujqD1$)mBjq(~J zl%atbzG9FOffq_muwIpFpSrv-5*R2pL=!Y5LDndM=X+QAiy|f9S#Rx38Fqibg_Q3l zP=BW$yz3FyB&XJ7i_ozu9;^MgxpIO#{~lE)NHR*2YM9H-NeYl5-GWb>Pwsxd$1w>D z7KFFG?l0b`TppGnA?_esNKXI$wpTGCmtvn&!ErgCm|MTM(9E{X%uGRB*9})Cp3^sD z*A9{dbf*LcT)_cO93=}Q1p^pxx@zmt+C@g-7MU*NVXq7*LR^Q!-CReh-aPd z%Js)2ULtc?b5&U$Z5Kl_QV5*RvJoVGi1`^+-7@Dy;a=+mU$gv}k$DTZNxuReoTn5*V!MdS9K=6)exYOJF?anRHKgh-4WS~1uDIoRx z!C(P1TMD&_a^2(NMML%n>44tDMMKaeS|cX3WRIGJL|^~|bL7%v?iVmHU^8a zw!;>G<$khGjEtE$ai07%>Z(%Z5oZOrfL2*nGnr?JjVwP&2IC+5;Uf@OsmSF+a*fOGo%@XAc6#rqR==uNzvi_PBOguX zWaeAhM3!m2Rdo%gEKHS5^8m=gTNOjUY_6lvrT8t}Z z5fAq&3}eEKIeFS~QRAe!iiXEcyH-AN+X z9~DK2A@(^!IiE&%&y)Pt#Hlh;hIq1K@GQ{b3+oiRS_N zB2IT$A(4zrh#jLDXEWkT2C%*4rW0m&@i}Jq{WDRaj%Rni(^$R8oFo{wm-YB`*w4k% z5p{e{UtFR8LWCuK)JFW5Byd*zZx}{eG-5 z^Y73^YhG2;Vo|vF>VHA62C-<|*{ekzrNE{f_^M1X<=7S3de4E;G z$O?;o}kCnL_`vY3$6q88LWliUna;Z3J@Xhb?V!HTnn&`jWv+%sNv&h+Y7{j7qB@yLHvf63c?_#^LZcr zV-ICNB|LH}9WKw)D8s~J;4ataNEl_bvzYgh$nxT_tewUDkTS%L+7K4a;xx9CCKP83yZ+p*Zh?0Q)@A;@P@zijI-`J>2DlegI64Py(_bkovaIsB~we1Y+(ZXu$#n4jl9y!tt(3rN6{co4!H!M50< z@`T;Of@sHxE^#cu?dD=nW;P>TIBZEhraWFV5dNgRmt zYmU}f(rJ8_?=-s31VVUNj0L1}a78q{d1 zJcLYdchTo*{}Vq=%j9}mJH?M_{1BnyxV{H0m`+5UuhlfZ-WG59UDm6Ut3NHHPBdes z?$T>X#fJDD@o1sS==`80i3w5^J}Md%bL)w0mmfZ6wgK9HCWx0Bc;8la42|#H)Uo$9 zR3@On;p=TF#fHAqdk1N>dc>t5$I7i?fPJBX4e>Ba6)oto|9;VsX<-5Ug`b7VIPqn`n)7V@jE__UF zm~B~+MM(dnOr2ViZ+MkTztcL5`ISCO{E?tN5Jiiw^%h%mu=OOx9mtAN0?)PW zKh_J9dj0rA&180wY;i6X8GF%I?}tO6+bw|Y!vwZ$f}tczoj5!aGY+HujUzVNq6m2q zB3Gq)M%TfphK^d=%^+hw0Wo`oCd=9Dh&m~v1Fw8b6C;kk7bc9nD;tDzXKU zo;gVeTB(Sf%@rEp$`Ekf*3$mQ0}?eI`MHSNK(2ei6ngz%vWo)u4>0b^@;rzc1u<=$ zmrp&{V)Gp^dBcgAcO)DXi4Fq)j!Mu(Ajzjcr+Zs>bPh%qmiY^f_GGs}Xyi}1yobS6 zh%uYHTLWrF1Hw2a&%MKl?by}achH%FD;A%!SdV(Q=XNOg@-hAc+gM8c*>0_au~<{K zB&5Pj{V~D-a-!hVys`x{6zQJ(vT3Pd#n<29@*ofa8|%=ae;m=QaL!>s#vmk7K=6l& z@Uu)1;mgG3!F2d_yIV1TLWL}u&2aN%G`*pp7$2JM1+vf`SxN#Rj>ducWStj0C9z4?hYDR zFXB-)glLE6j*hL7@bF-pN(Y3G23i1a6Sy?TqQqd{5|3L_0*8xz78TNgui0bMSwL9= zr(Ei>nYCj!S)%b3fs@O-aj~0ZFNU`$=T#AH&DgUP#!y zO)4RRbx}E&yGJ-Sd1+2}k9N|ym>O<(4>K%D)z%<3Lb;Q<_FR=sbP>#ZNJ(pxoB_NP zlBW1PQ87qX^yp*?k!=%Gsq<7Kf_=Jg>)TX{S;nrd@1%iGHFhmkY*uX;AfE8z&u!C1 zFU^zCJdkd(OW96N916*0w%NN%_FNNoZ@x|Q)-7ZA<~uaXuEyR?dllu4Bf~(I*|Bw0 z)KOau@j}Q2kW6-1^p6)=R$UA~M%kbuJ&d!YMV1o9dS$Dq9l)+Np%v#X7TE|cRZqcP z8}5odPi28)CKL{tij8i1uGNw;aJTzs)$gC7{hc;Er_TkQ|!1f{yBV zBp;;;6m|1Bza!4jld`5d7jtayZs@F&>;R{O#B`O8`<~|uifzEy6Tc+LDJphNJYMQLQOOg| zcZE2oh@xU2Y+$T-ww?LBw`ak_DF3wMh6wF(qyEkWHqZ`B9#OF#+j$8QsQ#3 zK$@xbU5am_xjxPuCy90yr%8bdtmbtXz}3iRZ4q&!8T)tQw#7w52%dTO`R`EQsM0WW zL`SVqS{o7uMw9SE*;82llu0f?SPfi_G8-8G78lYHgx*KJ)X%HFZvB3cIK=w^2eM!R zBu(A?AV?vSN+AeyG;O34%0xjD#uk87Ij%R(IzXHn8S#>61a~>%h}e}G2&6Z86vlFi zBrbN?@t8bZ+o}xmF`6t% zbe8Bn!SMs!Jshs7CoDKq0zFUMg37WneT3g(v2&Z%`yxb!kSSqEU=gSsf;`$jqI(rzB`rB8sB!pu_E#^)SDE_&4(^wbwBMUaO$p>kx8 zK$sxB0^@9@Th?W|fFA*}=G2nzzT~{SAPp2Vhm!KGOu4)#__js5-sHAUGw{#l+ZyMg zCh0fh(Iq4WFyK(TOvxGN+mG`=abYXB>I=pN2yk8#fb5oYsVQc^-2<6W({r)D4I~uo zjJYjkHhqyX61r=akRkXqPl#Z)7cP@3)=ba6=R%asA{s>fD#DmYJM{VxB|olE5X(PB zY)D-jP?^}+4_D`!h~q?|NSctwL~1TAsX=~nmzI1Fqk>YIDe9)DJ7dsy?T~}cm$s!HAu*87nMKK_y4VO72ci+ ziSaI~V?w&WyVyY_-!UQ2d~hb4F{nZrM2+8~$-T@5fuf^C`@%YGFS3mp=& znbfBu)=MO7&iB$)%7p@)^IOsYtj}#=CNDITq=YqIGIo1chAE%5y*leV(Vc+Gj$CM0 zq@2+d&6%eoy^N;Jz@O{__ZbFBfxe5Va_Mz^Tb5ZZn)e)Kg*ggHQBBx4NDiEw{G`wp zHTJkV)kLM1Eg)qar+R?9K+y~Gq11Y|uRz9(A+y;)bBf>hjd!kwc-+kW$?*@>r0x#r# zKuXvoE+zR;Fj^~zX4elaNq`U5jt^vxK&?NJI-af%l3##+YJkV*^dl7x<)6iq%+d2yB7 zNwsRO3BIjhwXisWgu1f6qhjg!`~*_t&;1?QJp-o)+pZWsNjk$df)UW*W=TvXNyeKP zlaul{4|a>#jZB{n*^Gc`T>JjcLWn(V>2^ zI2%DyFNEL~TN($Ohb%~_=N;wMh&Pv*Q;1V^kt>6|jTTpuHHgz_lhjPr6EdKCF8i3p zwG!`whlw)G?JMCv;r$SFlTHK7I03t3N#fQ?9=wZ8dE(e7`RM(Q%xA`tyyAA0#OJc5 zD#<0vSVo;Q2}!{ioE)4WT3Xv4A@;}KB9+dWQso3c!~#!s3&Vfh%@u}^mzCfeG5>t! z;H7=YrS81n%dM8Vl?$uT)0l?pB&+nI$K{x;eFDhjTZ zOY*=FA6=}bgH;Jhp#WkOA{pqT5euvQ5*gmlte4o5BY769CavwriF@)+C%4Jtdb&ijA*+CG9rZAj3B|{V5Cbay@$%6ftE1F!H_-4u!I)>;6q(a_! zL1+M{#a`Q~QyR9+$Ur?`QvjcDXZhdrUcvwiN`yv^6e*EdZ$Km%e+)z;$an!0wyEbi zb<-Db8OfuBxvL(ej#Q|&%k}pE^2p72hsE)7RliVXbSBI^2_q!b&u0!_hs=Rr%iC?B z=VAmYd#RvuK%)O6p&;lZ&Z$$(t0vX9k4cJ0KD#%`wIgOe+%o3yXvtzx663oAk4NUG z_Jr+JBsAFau7U?NN{3#-VkkDwbOh4`hu6f?cm6WSNVy)h>;rDBe^&je}7-Y`#W~Q`0qKu!26i<ePbN!Tt@1%Up zoR$56GO-};Kwx6HfD+C-84d%jHL+;jJ+kmr}PvQ+btEMrH)m{{){F7*Wy{*=@-le1HhTO8*+ z+m`(-af<66h`%I9tpFMg{VJzV(6x#pH%C3B3@r%d=c3kHTzn#!pI{18CQWAYn(DvAGLmT}m;5F;(X6p`nR_5Xrb; zbZ2apJjg@mRDE;C0T}zBIZBoB0hZG#C)q|)4)vM@33Dk_avbiXUOo?`(>?_*c=_NZ zFsoFWMv&J4W+n9zd4Jr`S+uL9XEfFWC$To`JB=mSXl72UjiWTaQF92lFjZN-+0ayc@ZAGUAe-ABzaxDF&?V``0ZKm6#{Od!Ix1A zONg(1uuYwTsLVxNQb?HUw3o6K&@+T_7z8?62sVB}5m%$x1`D#^7v)D2@>x9ECY7=& zPwi%yn5&}pGq<19$Ia@51#1t{AylYu7WXv~J@?29GMlX5(QZ=7AmVcnPM1N?D|ER_ zFvf6NUe2I`lkDxw#pqIg{(i4GVWnKgP%?y8t~|J+?XdwP=sLgX(bR(!?BcQ+o69z} z`!a60xdK`h2@uOf{By6IiEL4X4dFi485d6R>_NB5ROji_X~R}YrMApC@B?h8fQdt! z9xJJ?(DtXTtY2WL`-v)5ZZ@W}??*od8!jpmdva%CFt#c|FQ) z37ofCoB$X4Q2nhrRQp19a#F1xI7=j%#VeRI*neb>h(HOl_`;myQLrV)gY(%WYD(dWI)6>H9b(%9qxcgId{{=Mfow zjga-@PPL0V6+XDD3;2EgyWa_AX!@Y{2RXeZa#|uwRAdMjoYe1cHxqClddDh~LYS@E zRuE{+M9@M{t=qA@5d#~E2C1~ctyhH~kglVmf=rV@isOG`FDN8?1mn3~Vis;_PN!dg zXpA{~Y~=@Tqeu>Lz`2Bh~udacWs+y^NUW# zDYbprlcjSeUmO(mafw!_xDXYmvR=EY@&L_XlNKd@lubyQ8lp)YoFEyT<5nnT=o(WA z!P~JfdTG3Ns78j|WSmALsTGxDWMW~RsMm?(OL@t=OE8R+^r4j>G^ZFnVx|w3~d|OD^S*o)5xL1$w1Lq^+L0S(37R#1c z#kg$Z0u%Q;S}_RH5q^b3vFdNlwflp>D#k7mO?@vFLu2gQPU+oH-4F>FXS&Xjz|rm( z#-18j#u<~{BJ3%XlTc<)Q>FCvlUrg>Wtl1J+X-!n&+-;eA?wup$2mKqbo>~Ec$Bc& zi8=xjkb)UQCj{nxeNvvhIJRMIy)wfO!c__RluEkp%KBZn8gOuPQo$sxxE!>S~|f_Y&Nv-FiBj)5qEDoxAa>rQ*da;ChGNGaJ*IjPj;W2umW#%%jFcYjEgXuIIFBMIpG(Em zg@B<+Rn`XCyR@K4CE0Kg9vNLMg_VwaMQ)g7t32PSsB+=Y#cTM&0bPAuFqQ717kLeOr&l6?*CKav%nyQInO zut34ZJtk3moF7i`u*0UfAz7M9ezJVp|9p1;s4jxDBSB-Sxn{Z_Q;jjJLu*3l3R^`h zUYeR?64R$WaoN)%mf249;Ln`Z!zj`E0W;2f|C?i1LlLMX{8YExvY=WdB##qvlFXT@ z-R;q1n!Yc0RL^&iILMVXCkh6xcto~12y>L*K4vo-CvMcaEObH&;`LiaxG0gOL#dkE>heeZ( zYbG{r5)MR+*tNdJaQ}fOnl}8)zhSZG2FXqv@DO4(=~61i<><((`cry!@i@zR{5RAf z_XhO0j%gTiLX@lu; z{afh%_(!1pB7yR^6@C6`c4e^`_v&EuTs~r7F{x%4JPb0Y1g|2X1nZZ#m*(mp!6ah& z#ZE)F|Lw%Vhop!Hv}NgW?G31!oHn2yRVy(f$uuoa1*GIo4taVmK4Mb9?Bf?oaw3iZ zT@~lVBp4XZcc>$cSRjTa-0>43Pay+Own$2Bms&5bcXN*GDGPKTWeRiTfD4?Ygn>9b zFN2;}kkYs)n9b;R&>*oSKq?^nHC87YFp+KK&I=?RrDEmut@iMmmWkvxm3K z0)B!lHiagtUe(s7UIh2EnTN4#?7SvEfg{s@!}R1>ibyiw;(WVS`jtz|F@dkWCVFXd zvtg|PbRcSo7|H_y-e8eA!%lZj_RR#O=Bfl{b0hbfr^^MNi<|~{JF8?rgNNB)lW%)V zF!ojLf?)id?q+fIxtyCCs@q8Qy&BmzAH^zFj}whKtPV@E>`r!52Rd-?FlE`kXEIRu8`UD^5Dj96IU8_gMvPy!-N{MxG>! zt0?Cn1Nz#6+)GsP3q~F9n7dpL|L77gImdHJBa?XG$bk?|AwuF9i;-`iN`8w7cB~s+ zRIiIl+md8utc^g_zzR3l`hHOXbr{hkRKR_-L(7zj#3t@JKKCx(n{yr_EJ%Dta3y|* zqWvH2Ep|czZaVkwVjsSxofuLpSinNWdy+B}oVp~f>avFGS?6jI#BD@L*FN6L$q})1 zUl+z9vYn80`B5glHjrjROrBTSU8&_%Y8c)e-;T)@CA6zPTVhG`G5iaQl_ml7! zOyyPrfhS2Zu}EK#)O}tD?Son2DI3%&4VfpUn*}scl!F-ZL`dIQ%xQsK5tt)MtV&Si-} zEe(ozu)DN`{akEPy2!PL^yA}p&MlO)RuN-jj(UZ$p)V5Kp};(S%z#1qPAufR!xr+*_l4|jQ{LY--VVqS zWZG*Iw)!Q7n-Udio+ae$M?j~T;RZ?8Q6cK|{mw0Oh-4a^1Ox7_<*<%IfNA_tI2Vs@ z;asQ*>}G@-S$XgY1%1xRycT=Qwd3l$lWXUewE|e9BXPEG43ReXiBbpIvXj!N<|Am8iF`on2&wV|WSpPU_7Ac16XJ_6aD{OxLvCD( zzxm&WdY@c;6xcG?>Xs8~?z_68a#|g7PjLE5F7J|10yeRriLx?h0+Taq!mM3ol|H!b zC$={cvOwnJQtqK7MAz6%DtH;ZmHEY{1Q25tOZG^nX>l~snIK^G4=4nm&FF^fs4~!; z_gH5?QQm;K1fnvc_dIW|MGWMF9l1gl(OjbRc%xn9MM5uFHg7r`!HJ90VSjB@O^84C_;(j4qbhc0qcVa0{?4=8O7Buy7I1yH zrlGfLwJ#Bh;YI4UWJ1-b(s@Gt*%HZyd2-^vW%>wUg|Z&rCFC~tCQ+u z!W&TI5fT+4Gwy@mZHcf5E}=x&G+XkE<$C`p`E_e0ziQ++6AU@guTm~d*(@qxecLB3 zdB*5<(e?l6f2010B)9zJ`lG3+KY9TZ=lI+G(e|fu>t?mo`B*2;6N_p!>s{`#ZzdrT zEQD0dQlyDd*NeuN)Zc#nDoAh!YQKNVAt zJUx#bOU{e`{0Vggv-ue>fe{5Df#DP%^?)+g@9O>S#ke?}$Y`6*b%^+*2e;=1M)^n* zDvYM_5gHT<%IipB`YvzqZ4~+bZ|KRy@^r-80mPQx;wj`Vfyz_(oD<}MR>a(XCMJ}18YUu? zGu6mxlx;zkAHp(mT@i_dOAjt7WepPVCn+AH?ts-(SLmC`L5NyyAw$#k4oyVBGaZD* z%DI7E>`BVqr3USreTo5gnbLY_>pa8BNXBpz+q~AIY8v0v+ zcFsh>QEM)`IH@lRE2`q$$$KU2D>)W<2*KbR&ODJjK%=y{2+J7#TgbQc5bNQcyGif{ za@wE>`9bL3KQiL=e-7cJs}k#sKA~0dIuO_ z=V&1(ESEjFNwLdNnhtLnArOcxe8i5*IEpfO8K;}34vqB;c0}|q>c?MvojmuIl=Yc> ziZ%khX`D5ZtG~0I?gXIYurMJtP*-k0hc@TE?435>`2;0dX-(eZLagDkO3F;aeCO!< z_b{L#Drs^3@*XYr%4ulL$4T;g4hgt$Cyb>qUIS9DkUqS}W{Crc0o{1H7zBXTNkBL; z0gKj}JRN=bxFpVCrv5V{IH)k9@^A@<^do<+(8S`g5wqYw3bZ)-dI7C%?zD2A^9V1` zdvdgpg9h5`w~mRBk&`5FT7(2oLS$APj#k0oOBh02C60WUFzsgi-v}opWL8+b zXfBskY(l3}Gs^|OTySci(2cO#iyq5G7v~O#mrBkb@gb9DJfcvJpN%@fP(onGv!_h` zAq8ADy*Ir)dE7y*81fhzaEzf!rG%K}p?Wb4QlR}#5);X%E;bJ!U*a;KN|E<_DFBuz zMUr#NSkj)L@yq2&<*)9*lb0uT?3Hboa%pOZEd)vQM1XwOW8H&4iEMTYDiuYQr&p!$ zl+JzLTyBzroo_*cDvLg=OwQC)5^o@it);Fgh$>7zt0*QXEdah7@Df=96Pu&ODuA{$ z+?yC=QjC5Ow!40WZ=O~>2*iY#{a}#;sWerj^m}|60cU{cjGcI;?npy;h*{~tF)u8A z@x?It5UAj==9zr%qw_qI?<02rQd6(1&t0JL6QmH9sYX7Xyp(aS_)xvy`~4Sg%;mVh z$U7QbY$qzah*anVKI$#MG9N*CZuoRXYrVuC9oNnT5kMb6a)=@s;(`yvh`21g_Y!Z= zI10Ig*xY8Nfep2?E$0%$PZlf>5Ji24ZS6H_7+v3@Bnu3qVi;HI2RW@7BTiLr?qJ5b z2s?NV9s8i8ZiY-^M=e~>O7t&_-U3{<^l(IW)81kqY>h9Ohm{2+(U~9L{kzpRDzUJ) zn2!THaWXXSVwYh#gz$25i?F5l`1BSWVpTc^#_eJJQRUsjPz{wP)<1@%35;!tTZVW=vO$jzh#cLr5*;gjp3VZR@DOX>n3|E>3cBc|zEutUr?h-3)r z1J{M%V)ZuF`Qma%+tiy~yek-A_oU_{QI}e9%F-$udp@N#bgf^9>kN zW5rF9^bZR?nVCUE^K*ODV{2|AT=B_r(#$K9ZMJF>aUjcY1IK>{!oAC`rUth;h58>X z?{Bk}gayO*Bkc8!T`u^N%3R>k|KHxV?KpBA+4ud7eYF9Krl~fuPg56mx2&;jFN|I6 zqp{G^M4Q`cQ#94U{`+#OvnnD^oXE=JWi(^Y0BW?F#kyo=M#kmDIZ%fQ4KbSw1Z;aB zvpf$ms!eOy;U&adKz=nkFwX-?psW>v-4i=!`v=y!+>UY=nAC;GO>%YUh(aHm*tkx& zX>C8H6CIEUI@k%B-Ze*j)%ZsH!BSjx?>i8=QG!R2HnW+Wl| zWV+<@{N02bppHxT_J(zl!S7%j)w}v;Zt|x!`N@6JmtjU5dotIqkX;d#+VSI*b-Xd> z2?Ck4?8S;qQ6!J^-#6B5M4)NAevgwlp{cS07cIUn_Cu{!(%S4k339gvBA@O}##3YT zOip;;qFQfv>I}8CFeTh^%Ts^Air7mKQf;05aI^#k^C{-h^i~;Tb$kWyup3n1s3_ku9XDJn;Bf2Z!37%wqQ7 z%@PAykC#3e6Rb}j9h#s`YJ?8f-EK}^{#fVGj((3_O+$4UYVR50_C;g>V4@fN^fU+o$E+cG^Y|d+6y=c>mX{}0r7qg9 zk%>PfILXQ{$OL^TA}S%0PuFNyDw#7k@_P^jAeBU5JaA!^AV%&7TD$~I5K=czseLEhbk%$$-sGzM>1PgIgE zsb__qevoMI?kTHP>Z(>(i+FBbSz|h)D2>Gi)Kaf$Rylz2Kq8$bqoAr=qSlKq3oM#! zsP%>s^#FwNAsu?;5&V%GxA@pTKmbIs)lFG@zM3|zkCr^%)B?k?0=k`a||S$RlHAkk1J zRA%iVEEw|Wt;%`<-kV*X+=#0Pb(c3K!B@S}eYnpwPtMJ)Vd0DME{UO*N2w6>690;=SrKHO_T^w1#tKfM9g4#_zIv_wddV`s< zzn?6VA&?GTQ(GYw7|F_5#2SEf0(&U z;%?}^&|xh$SI{SiB$JE-Yw0zk+mn7?tCg|%nCUs7R6&ts#tlgKdTs2IT6R#$&6!lm zUFEFzb2HKf8`6O+>!RB)yNyi~UtHddcPj2QClaV~yZ#ZZC z4^y?W&#y;SkD|O#Ao8@3ow0fKv-TlN!~o@g1{UqU432R~kxH7K*5@bj#IDM85&M(B z?a?(iTb~!}-Su5f61m99&tP9Z^M6htY{*=V=8E|5+E;AQa2W_)07Zl zn-~1&k#B&*Q0n6a`^v1vgci}>(5O*)2WH+qBd;EnvayLP{eJx!cNHyTTP`(sQ;hZ0 z*QgH72n!&9FPRw1uBG?K8ra~6Vge4Yn8+H@Jz>+=v{&w2lS2O$(|BoOz$b@7?uTUQ zzN4bUB9Njy5ePAu{@?UjxHtTTi!*Ts36P_KnvxB4W3fr?IWr(T(aXAbz)0CiRGfSv z%mTuTfCOq@qvjA3NVIAm4nzf=C$yJL>b9eqCC`PCJNl`2;7Y&!r&L077~BA5vifuzquBdMuke89hIsQj7xlKZRaY?`;%O2%acoId0m zI{}hY!n3&iIZnuu>~&;Y|RjiW$#6&>gAF&JB^~kocS0Nk1RMoWrRhT?k;Ge4SO! zVjwTOd-Y|lQ~{S}67SP5ZD-CJ9nSDdp1XM4Tq_i`iSlZqatxrEOeWm)%gJ(QsD0VD zNK1dh4K z?ZUi(ND3C#drJWn_Hu4v!r%oFTR%8eiLm-=R9X&5bw zd3h@`C}vp-b|5&1vH+&{DPPs8n>pSG(RAboor&EQNv%lsiXWHA@fw* zbPzxuTbkH1bNN^q5|v;wZOt4`abY+u*^7-cpWP=;mOOkyK06tYy@kDkGy7O1A@I?& zvTE)|)&i+dqeL!~zLOz={!ws{A)Cnj+41jo)8w~7B3Djn`N=-_M6UEbvyp>Du8dqk zBG)@2$A=pwaz}E8*Vyu|nlqHuKS*|7dy6L2x%H)-N=vUBZ2X+%HHbJ6qM?xwl#;B( z^8v(Xq()X>lEK1w<~2&%bwhAJ zY$N-MT48h&Zn%xG8ph~0@?7Tu-6cChcbR`Lo**p7g;$lgqP}pkDI;GSUQ06fj7I~r zz&Cth#OEA;VMqGHnzzY#$r{aO$XcZQ>6}BySY!2qYb2vGarRw>)0Pl-<8%n84X`<~ z??#rWyP0*QMfT9I_V>NpqmeM5jP69)E@NagH!w~jgCB5XGMUHXpB zXsRB68LD(Zzc!xTEe80Yjhl_ytCV@HMGl5Qw51nem{CZ(!pXr0w3VM$nJ9K8$fPRl z2w0QM)2Y!TPNA6?8WT@$$C(E`aB)L_O0{=i<44H_Wh}MQg{+Xm5l*NTHb~uAtC30* zC77e%yM9Q?CRif)28}Tb4Oq9V7~`_QVa`P(7!pr8VXWCn?5nPb0nx4XQrnUM$dW6> zPibLQ_9=Iqtc|qH=*V8=1H<-vFpyDUY@85d$AEv0AVBod zvgeU5{tRy(OYeaQn{l$24JDC9tQ3Tfkh;*yLrSa5_D5%n>Q4>oH~~ITJ{St^jSnwf z-oU=mW{f{y&g8f?uu;|W?Q3HK-6obOxkCNGpp*Nl#shO#%Mh7FUcaN1CRJnsd8@H)@|<}z|AfsUd4wv%wD@iHx%E^)z|9QO zyAYhp0wJNJZCHE0XUGsZ0V|?V6?-Taz;7WRv-M9}rmBXUuoZaI-J67n`a_4q_iqgj z@;opV^x8MO_^j%;XMyN>TYYf0I)}D?(MPlPQDj%0WUB+?v8q1{;~~QVNtM8K%s5~U zTUXc!%IsxZ(3W?3#~^jl6D!+-_6=rn^Bd46!#5IMJ5K~0?(%e9T3n^3W@77<%x@#G;9LJ+D<@hS_zY{K@RI%o&jB^WdV{+QU59-Z6k)1~3x0;yz`3 zS~V(Rz>vw6TJ^|Xe`ZOeWcMvDX@pyY2{~W2Nhjz2ur>S_ZVi@ZKi(Qv)viHd3o~AQ z8u#Wq2cmJN`}T5CNJ-c|q(zG#q=GgL9w_S;Yx?0CDf^Th2yk=62+4r~5$&qF>aJw+ z%gYh7MhjRF(*h)nfy3A#LkP9TTL^TqmzoF~YT#ct@7{ggQ1UxfS(LI2RQ}AII5frk zgv&bt2HL_PyI1C(HXNW}7z|_#hT(_PF#OQCWHAiGZLa;}>DoWSwO{zP#i0WZ8-^nf zseK}Ph}1>OnwlW&6Gzt9(f19_CWnr!sx6Uxr{dNsnO7R1UpB9vZ#u93c6zsegLnJ< zNxWOISu98)@5sGdR(zoaY_KD0%P)PmNuQO32{vF@tjm>HVB{@@l;c$~zLBB&jp*}h z!ww7M6iT^35)Jyhc$%E_q~9ZA5k!>iI=IEHY8Y7VRu}G8Wft~6@Y5}BFp;T|N_UI| zdDFd=`D|kAWBGiJGiF+VI+0FKo6+g}VLj0GF~#-30F)T$OM``Cw#xUAyhdds8MR-X z{`#xR*!WR%x4I9=uwC^?xEa9_b4L!h{NP91eFF-jhZge<^xXv^V4r0NIy!HcgoK8L z{K_(M`CHj{2m!m-$Y!f8@KXIN21K7S} z;Ct#HFh|a~FGAkH(rSS~Ata9`xskH%$gO&7y1b{o6~QXn*H?OoKqH(Xe1~p?VU>uj zBx2|Zqmlr!Ia_%;;jd3e{rV%?%ELo{NtPD8vDMr?{PL&Mp+8k=Z%RXyvzn((=lb_s zYCoU({d)Vks&8Oy*bUYlJ)1>PsiM< zx04pUc8y;Uj2UD{W8kRex4o2pfgA@|B zRb5%;A-c(_n65m%m6@X!Q$^-W3dWJtjKjT&h4IeOllADMHb8(zXQ*02k#lTgr($_} zE%&hLqvek9eM?V6E19K$bC&6CFG-hD(W({83ND^Iw+()aP8UeXNeAK0u18_Ex4Ecm z05HbmI7B$K`gi*Ib??xS64>mKzE8bU*)zij*2K5B9EUL7Fwc&|FHS#ykr{{WH*_4F zTRmYMW^MR{3395R3z`7HS+HF400e5SFxW>nK=UBSxyhSYHDdao+~f zHKX?U%jxG|YF7t$C(wK+!|Yx6-|SC(GF@MvrsLODa%f2o!0(PZ z!~C1m@4s;v5g!)J9%;SLqcv9*lB3x5RK@f+K#F05ONZk5I9>37iZr)#tf)7v4Ywtq z%J|wWIWuo!YT3*=!kqPN3>*zf-8|4iGP^1MA$_v<69b-frZD8ukrvS_Sl=jix+Z8t zdjmS3qN>%OR)|H=sICwr7L*~=;5VZ1btziyiBB{@^0D(nCXV2WT+tdHRtU0sYVT8& z+*x`X`Gv`{l$|7BA+qmj%2?tvl-{v2e(QcO01hVjVfN@%O{<34Go-x^0?RXE_0KnU z&UsOuIr~eH{Uyk@l|;z<3r*;iuXwWu&~A+6gGs^n(m?%782crR{SwCh(}b~dA&oPL zdTKQ}-nnLm$)*i;`Q!kndyyD1tn!y8@Syx3FrCiszXaps!T3eJhT=939eq>l!VI{s zy!tRg{OR=br#eFjk#(tE%cJQj+t8>@53fd?SiOz3XF57YRI$rso_;+2{L#0DvQUHJ zgRNR>9q6kjs9LK(sc8tDM!w84u>&GdYTpFk^GQ{t`(V z(CrI&gOp2=&IW0~%#Ef=lss^GpCX6Lo&>BHbnk-*I1?e3n`hb; zdy;mtBg*`o|Ca{t8lo24{%#UIj*5ZOU-ZLCqcs~e5Vc@>TA`?gCqh|1*bzuh{#l|H zr>A6CP{y%>e($HHDgya2uu<>=7z8bR0iH%_d4Ee)5!iGYp^f||SYppwe=Ki%mezMg zQ#H+HE%7G-?ntzBYg%gFpG8+~m9tyHo^Y)7f&(z+oY>{rS?6x`?t#Fdky5Q;Qhf}jow z)jYy~kRa&kf-pM*FM1UyQrc{2tlj~+sM7a!yw>|Nfzo2^eF0aZe_yZmed!gLqeX;Z zQG5rN!-2P`KR563Zg`K5-5h?HRNcN|Ut_sKa9V-@a@Ag8dI-B(>GU{UYkHV1YCbkS zz|-;5;}|VxM!bEE<^1%Kmvd=s`P{}K_YijI_*wFMJ`M+A>9SOaj0Xv1Z2uZ~aXxeL zY_&5`AKWQh_sP?z+7z6JS8C4*gjV6|Ly8C|jQwGfC3Fn~(d?=z$sQq@@~NJceIepc zg@c~6hL#Jt@-cGMm}+C{vIX$eM4o;)Uukks?gU^#CP}y_c0WYo006`K3C+*A1Y{pc z`3bie`p=+q`i6_a>}oTz7(R?iI`!p?L0G+r#=$?;VleU=drjCox)@%*EQX(JG4vIa z-8B{iY}IBEm;Wq_A)nr6c?_2CP;PW-ZUZ2TxZQB@ZNMbA(O^EJ>29CA@BD(3`6P*N zoRmy6Wyoc8e#U=aa)>3QI?RyX)wI_dV2#$5OJ7M1*b%p{eTE)SsymkhOheCYtCt`X z4=|(7R2$fr%uOBAm!N|YzG5PYp5!$phI7xs`C#>iAeKkQTho7%s<3AA70V_E>d-Lw zdd~+h>Cq6*Z90&f05f{Mv;trF z=Fmf96jgJF_R_s0%U!EAWEZ*S1m;WI!epA_#)yDl_D~mb2nS@qy@1nxTRl~%!GSS3 z>;|Tay438o#zlFlP;0~2?sp_l?XB#yMi_+14e^02{)D8YLU}HmTTG_XIw%SdGbBEp zkh?sH$zvM;lkI;T1|9RHyE>o5^?>4e(jEY=Vf=8i^DSM!8|>*0aYPG z9eLEwt}zj9fwnnoM+(hg(1|c_%~cVWsrvxUK<_IOGHf|NWEj6H?~hG;DE@(DL4X=L zj7@vR;Q|K+lGlrh3Iv+Pb_@jqk5!8yloMq#+v~hh7Xf;GnR&!&I%Mg&Cdq7Vn~z`( zLraGOFU-~i=I_o)q^qtc=C+qjRnL!POH66chcgEEc&uaQ$3PQjTQdz-t0VF7;WXd* z0xPl)I&n%S@QmU=APWXqFR=+Zo#;gqPd-IVs}Ud}+j>qI6WR$FlNDiiYsWPfW#V_v z&$miBIX8wg-d+?^5JS#1n+4P9%l_A-)59{JfW%iI*n&Hh-`E{O0-)@!mo45kD46+s zeJZ+F$se9InosV&*jo-p^QFH0eV;X&3wPH{X*9U&L(yHct?0tLzSDONzy=@}%(p`4 znEnChX>7bSB&K)Q|gc+@^o`P0yvLfKXZ}Cl9t@mNzsV72i zTI`?96}dNo&%$hXTIz(eW z7x^AWGGke)>qQ;3XUUgL90%2FrmcphTb9KGjI`vnMw_5#wiYbk1T39wo|e`EJ7<7% z7Fy+4MuP0V4`%BKd$J+MG_T%dZYK?y@0}2mSBCryZeW{99YZ4%R&pGRsIq>LG?NFw zL+wP=Ym2>|q5MzsOOVb6(78S{&HrV}{d8F~OGe{$`B>~(3Jie-VnEb6*+#8!f@v4! z2;z-Oz7YD*Lz62pZ}{nudU&MiNqFXN4u~MTq2M`*y)mJ4S#Ioqp}9Il53%kE=A=QQ zR6dZbj0^=>8!?9RY71@yrl#zr1*ZaIHn^C7z@hX+(lVW3X&LY5Wy~PRg4SKSGI4y0 z#4z1wF%*=$3)-w~0OBg$eE_oL=mR3zHQE&pov@ITfxpR(+6j+I-M3IkZc)R{PK*u+`4}l1Ra~9R@ z6eR$qSkn@2whjZxPtsK-rj{==&k!fDQj$zEXMth!p8ab(WyW@zx|soJ6i*fQP3{%kKTrIzzhfXzVO!WKBu9<4QJ zNlFZ{OEDk9cNdFyF30;0%mt8luz_ zOGw&KE`eOn3}pbIYS4X{i8A~3U7gPZFjP)}3_KPkwMu57kIEKR@q9v;BVuOM zRERLBfF1CpJ8aZ^BgV2S&}l-#$j7|9N9~}+05De%@u%C;(^)TS!B0%aSi4km+UzPt zEduDRoRrR1T+5xUe5B9D5PPbL03MYUE13ewU5#KJ2DuB`>*h5gTS*Y-Fkb9IV8MdG zq(`YP96F8=+G&sm=#~QM9dd)fxk+7KLovd0lg8eUdTzId)barxNU2y!y^eWSL>@E) z`7;-tS9np`Kjos5Mzo!r?FA1f;<4;HW`BQK<8^2#s9R#>I-L;+uVYGxyS3@`>YBX{ z-=!s}=p;3y#?~&>egd873{@AlAh1RW)v{x&Y6vZ0=V$V==B!VUJz1yJ=IQ@`NS5HQ zr@#DFwusHQCNnMfWD)l+)uP)_X>cIN>$j}CB@B*b#o6=N>VV&9|Feuw(C&RlkOr1$ zB6+=nIgs)*0e{taphPliHKlDK^z2}NVNb!TnrTuKO_Md=77PcWXmT!fs7NWPFNXYs z$DWNf;}zgKb`6ut9Ci6;Rxy%cbMioryT(TRIU-NuF)6N7Q!9BU<0r*T?61Yqi?8IF zGD_L7Ut7v`4>Mn?u9k+kp`nN6Cw7jb%Xb4L)l*Q+8=6jVXCrLzS(aGet`~QhgzY)h z`wu;H1n=^}kddeK_{FRiQ3@h?5HNj5-**5{EHg7N^@ITszZr^Riske?bXc&-9^@2j89`=b4lM^0iXWu&JQn5`Q^*BJ0^_I&x z7NZnBp!TVPU^=UvrPYB_+Mey6V7O&n^mFytjJWj3GXpUNbn5$5?~Zt-KGi#;sa~}n zA+HIoL&k<2T*v{1EUP`liFTADQ+E5>)(4j7xt`2EO>P<(Lz?q6uKX%F@U5R|YT6F7 zI(F?D&%bvIW`rGaqu8I8$>%9zjNQN=H(syIgBD3Xo z0szjQ4T?#vJ-7aws>L=vq_lakl#&YLLarQEF*1p}7u(Vkx&yF_#$1h~Wp`$MAy<{s zUj!w%j@`f5B*-gNRkcs|#a+b==1I#Xb<_Q3`D}Z|N;GY(r;H^y39q^Gh-3Op);sD= z*`6Ci+Xhij+~_aAose(H?sfHq*N6Lrc&Tib8jpL~;P+HhR=NXH0OjhBVZO|I!q$n4 z0;D3Eud?^{R2NSu$VVVQe=bun!Bdcq1r|R?S`a+pdW&pBRNx;Cz`*-9e*059F%%N37m== zP}tpbXs8Vr=IU+{npT&(4yFg+aE`tH?!S@s1!_%qj^l;YG12cgb?3*revcQCp;QIb z^kvCb>siW3938g^MrY8(nnCUoIto+UjiRd5Ih5z4FqVDOP_{zr_d25NP}<$t_`?Vj zx2yO2;4(GwN4{Se$elu#FRNO*rZde4{Jr`wQAyP)L&m@9 zeX}P{y$yYtn)n0~Nti~ly#F=I^7@1ufwEE6csWi37X%4o+djKJ`JsRB!B7d6hzypG z6y^kgLUioMmSu1cPh`>OS`X&rcz@6PjLY4!w)*hU@nALCc+E~juu|MnUG``7>b zm;VP)O9KQH00ICA06?zR2+1fJt&;@-055C<05Sjo0B&z&WnXP?WOZz1b1!muYI84S zX>)WhVs&n0Y-MvVa(HTUE_H2WE^TRUE^2cwZDDZiz1e!=NV6_{FYA%Qf`3dhNCQpt?$E$T2d8H{SUF{%iNKS`X*5|N1}q zzy9lUIQjUm|MOq}_1Aw*hO-Yj-_ADw^?$PE;$QzYeOWAqv;JEB>iix3&v6|2SI2QW ze@XQ>NB`;SKRQzXd9VK%3-zbG{;TacGx1kdJ@Hr5aavMexc$p>oT2+y&v8bs{w*cU zk1fa9z&lc|um1*3);uYx@$esP+YpGk|xMqzjky-&^`` zxB71%(01JmX!@uAqabSfe?{GP=Sn{;v3KxC2X1tle>F@Ww?cn$r|+(9;hDS$?+$bW z>iUVGt^15aRkuUcRev1CK{Vh;N52Sfk@l7V{#wUotM{ygq?7J^dJeg)r zu@ft3*1H~~A&l1u#w#!*t)70=e=K33RuZQHUXX^V3v@T3uR&Fh613y(ueETTcj&xo zsU21L5r%aKjh?!Hsh2r3=*NwIUA>{d26w;d3;2?ufZIp`yTPPBe=a19^#)SuUSgs0*p+GdEW`t~p9 zLr(A|FqVP-L$^bQd!PZYfxoJEz18#$(8i^jAKd{Ln%Dm813J?%O|lZiL;&A%hO)#3P%X zx4)LUY1ejoayUJC7|b$GPyA&SX+(jVfZ!%J0r8t*)b*N@xQy9^B;NWS-XGLq^lwz7 z?|bUsPaDypwHucuU1__y#yyAQbHsm~a6&-hOTA z^(g3TE`80jLxG3Xj(0dNr%i{eW)9x8H9UeyU}9YEA~|I)09txcr4C!giD=v1CnzhTxV!ZGcTH z2{^XQ+b#I(o&G$^a4q!Kl7v>XLwDd#>e?3_#SLG&@ZE*9@=~o7QXv{}UBX9Dp1fc) zUhEmx7dQZe*uL=eQ3vNdTzT!{6CRFWeG83U=s*3OzN5Qwo3sym@Lk*)xcXqt;iUBS zU#kNt<73Fq9NKTBa3%iyXwO&Nv)!a~>)PsPu>DoT9^>DBvd`)FNKhamC!bXdvXbcq z!|(`()BYB861X1*#o=qxtXcU0f1}9`=p!CJqkeyx;jp8&&?gxR^G(9MZAHct6P~(r zunL~_9~n`*_&9&4WgfcI4M4?C&S=mZQ_o>&1%e2*}0YIUM7j~fS6kOaN z@B02-Rlj3e!?wT=@_i=f**=Y?-fvd}bYDlYm_T zq58%KzClWV>|3zDHtb4m$No8B?Zg&obykm2 zlixRme?NkXjJpHY_n1EGt?(F0Y{@Wnp6XaG&QzS1y<;dIIGE-tdN|ffh7=!mH}IY0bKF%pL_bFj3UtfK26pOMvi9 zoWU`XlgUpSyD0fd=y}OCQ{ve}sasEY)y`8>CPBYu-E$JV=h;&q-#RmD*&?YKsCF+U zZw8!E&Q0R|O&T@6CzW0vwl5fv>C)k^y~ll;_*!gZPW)Um#*%Fh5|F(+E5!0v36VkK zG(a=Ekr&y0CLb>BGqvD+eem7u54|uuwSjY|REV%G-IkTeQ-Km4`Z^GL!w0v`@chy}~WCSBRnBf3K6`t(}c>hRgLM`=v?3qU!;p}k?AgKci2tqeBhMS<(YBpp8#P)!Q-z^ji`1nSf=*$jefA>eqezp1-rQFN_J<9W6j zcrGbXHqqmjV33Xo@?wR_&?dSoF zJy;`h?db-%8!&E=}oo*7&z`4NvqGxQ{){DD8mwfMv|joJyb zcLla)zpn4~L8U1uF;b0NN--T-OC$L@06Dt`ci2WaH|g;TB=}sGsAVp=_oVj3 z==B7qnNuIai#n_?1J|19XufUTcDMp%5qxyPk*m?PNQz_}F>P6C-a#nVLG+Yhey#+X z_w@KqnsXVPa^X^!S@}lGyc3S5e88g@CGx@esb?qj(Yc60bGyZDbc6>)cKm{)&=yZ&W=HL2&0%-Y{zf7mtfJcVi-qe%}Z!;;Qc2iezZUMQ5BkSi&x~ z(WIZq(CT-y&>b{O=5+XhZsRRt_Mta-&Dsye`3?HHTiVgC9nIFh4A`NLEq09FiD&Wy zDt~C;t&G`!O0w-vFce#vFhSL@z3$HJ?v_(!&Y9bo<&1k4J8={Cp{{Re-r05W-UEGL zBRpEQFEO!(E)7^vJu=i_y=!B&8j&5SLX6<@6D&~eWNMjHd~URy07M!&Y~k#ky5s_O z(jXlc<`m9_Zw0NfDA92Z<0z-lNF2?AoRNX$IN|0&)Wdb8|@g^oA2O~t5#qe@}{-a*11G!4cerVvwB7fOxwYRFx8|_ zi?D%@>T&n=;59%Pv{KTQL~WBhF+Wp&CTywr z@ui|K(y(}bbTFD`Y6I)?y1|3Tn7eSStOUlBGpvp7w};pH@txQ|5a)Lr_*erYAn2e| zuHL`i%&j>=E^B3$uuwL4S-T)9y@_kiJ6wN19Ut&Ppm;u<54!c9%(!8ISmt4HT3O~J zwDPvS6|A34ZkeqGx4By8r;YK}@ZZ|zH#~)x?v6=K4D*r z?Oor&fzm)d=+`&#HSA%r$1Qhen$g<#wRPe35KlCM^Q(2F$u!>7WJ}Db)NE7k!A4v# zKoT_I7PTLSAfo9-O*F-RjGK=J(tx-J4?XudVkK~ZU%}spexlqM!5dP3lHf?gZ{=!| z;HZEIDA&Fg92Gc=_Vq6X#{vZM`WnXA+3AH;`%nU>ofSiNOmXxS}CS z9ursZEK`0^7k4}6P6S_&CQFAaV8(hP3WOIdsBT8^ufAO3V*0lZ+fxI+ms zl3U&Kwb;lnAY@I++>#IzcSDt0wmmeL)f=C1y%jwx8lF%+g{a-LT?z;ZG4fBl6@23= zZ$-xVkz^{2gAaeAD_|Z}1Uoyx$d@ZGI{SH;{kDUks-8Y>*RbZ{yp;`bg}S;4%E{H% zpcqfXeqeEA;g+e~)9&x#>Tr9_S15X>E@y&JTBhZxrel!3wq zHJkvHv!>O~ZcyIB>EgoQpJsg71lR!2=?pl=a2)SNYvPl823<7<(q`fYq4Tj;md4wm zKByb#)zqV*-^SM+sMhAvUa7${TpPB!$P z-Zf~2Z~C>~J9NHa=k>|)iUO~p9qkq69G;!Kc+X0=K>5Jnsta&Z)A*)#Xx}(iyw$WX zF91hFbK!;)|FD(@3>Y{c0W}<~I^|-z&Wh&Qs@=q7@s+@{kBxMt9^BBSa$U>0N`3C? zkto*}8XkC64?^fqD7e;kA4ybR@gw?-Gvc&Ve}OwkdJ_l1noi`U*pNbVUDAK{R?5jv ztv|+B>j&vo5YCn-mv+}4ZA7I>D(zYpg%b{qde20By-m$YHzcRZ8nH$jgGG|0>)hLo z=Yvz=<;wNGj#Wq#Dg$ZOjRJqGcCSipvxpe{iu>A_%7L+qY`**aE0sJ3QZ<^jYu z?`5t^o?qB69GOGz1axkhH^AS~#(RJT4tkVCHAsf%gKomLZj6GMotX`OR74__V=Bm1 zZB|jX8fx>hx7AH`weYP@!zgMMaLVyJGu3lo3qIHa`}!>b-l$M*#>Z-QEf z^nmIZ)l8+_f*}FxKnK5SQ%TO0Y8!8=;_(DGfwoX9yK^hRsxyJNl|>0KCvacIMFfbQ ze)=PC77E17JTvR9D}LOz;-{^FOkD#1>3>V`wA8By+N?P7kLq&ZL+9(B3G>((kc1x{ z{0+l~;cwvkHouKsIK}gj#ZW_Jw>54Ur1L3BoBjYbUfO7kW5D7T{Z!?6t-yE_-CK$U z?Pza-@_GkLV@GKRy{!#=0I0K$s3j1*okxlr&UgaDo*Rshpt-pEuYIu-xqxP4A3sjs zB#T@!2=y56nV7Z579wCn<-#YIgtYFSEh6D}=O;!1|A9e>Jt_h?y+eeMgZI$|1wG>) zd?r$D&^(L^Jlo-BNhqF`UY!})?Wn_@cpTtG>lhj$s$cSiHVh~|wkt0LEQEJS$e0aT+DzC!=`G7{)|bTA{z7z5Y#td|XJ zUK4G9t@++r&37ms5i%su>hoX>G+GF~@}O^ltzD=sxCXM0?+g%&GA;Q!5A_A+smn&K za}yp9P+az)TZq~0OSpvLIUMb_&p=tasd_%W!0I{vJ%z;MkcU@XYYJFS!_cwA(D96x zN=Ya(NuGfSntAnzGg?AsNB{z{S&KGNK2&gWc0NTsV5FWifu61&ZJs$Gz)WB@1OLDv zyZ4NZ!B8iWA7J7O zZlD`0k9@7J&>&16BwlLSuDq!XhG+C?{Np9f7SPSFwj8Nu{{L7tgA8v{jTJa3wG< zRSdw?o@Wi~K*tw>cwlbBqnKjQWf9n@B8vaD+*Yk%ck#6&S!Mx&r7EtH#G-$NL!XY%uS(Ca)que}sHjD|w z=Yp749_Bf-#t=Nq76w9X4(KCNouoCZzlFB;R^=#lLM?ABGXQNYNh>=5mN@c3G7KSF zd-4D;;DXOtIYv(aDFpPqtiWlk$D{?wqpH=v1B2ulGbF^Z9(9_{;P^8z+d&=SS7$jF zGDroX)O9<)ISfM8@1A*W@D+~roPS0#7i7@Kqw)&g&#Z-)D2Caw5bhg1DMHctO2WSo zeCvxA=F1!^M{?4%*EOC!V-j}JQ}7shm8W0jY7nbuMxtTxANe4B7!pC%N&&$l5o@p) zM;x(}Z}L)12Nkj(rVfk*_bB^#+dyjuTIW`;i#L2JneHAg-dF3yxFsKZECO0bC_*fc zBx!86wOF5UEIz;S=$s8JN&yxV3eB;w*8gi&pv!N&OXF}g&bD8}8ufLeVF9xCJ zo%F%*GhP@AKL5;4fI{a^3FYFKJ*&RELv4i3W$`@!bQTMUYy=1N^|TZm!unVVTKOY= z#e39?McX2n3{MdQXNoZ?^`?PWtysKU-&+b0qyrBW(&n7R;UoOcOn>t2t;LEkUij4j zgET0UHa37{;uY}x)+6U2B6Hru$FsaqOw6kz1)7)j5(T~b*)hK+2zvW#Sr$PJ2LYeq zU79yYkREKKO^>!NQ<8QJTEqHuq&|%WMrbE&P%`w2UY6ox>;)Nm!3&<8ui@i6!3Tvj zjIHRwpzP2(kLwufXUF`SpkvryQ=$);L{KWW!VXH=RVNMg={@W~#eD%Iz3jf)UZy>* z%FV?LBlJg?4nm`hjBF6{Ai#FaD51GzYATu&@-?b+4VdP#6F*^4&LM8voKe&+c(Q&M zw9L?lN`SB4(c)XX=ksI0o%kcJ-IZi(*E*V3T*2yl%+YkcCv+@kzjYRJ*^GO`8_{i_ zWj0IxCv55l^lwwO$sex_SQU~l1(PCa1PgF6W2mwZ-jFuZQ za0`@)-ppUya~;0w)z{USnN;Tk0}`rTA$))}jv5iNfXKiUzd0~#b2K+>7Fd^Ve~7!G zOa7V9zzj;Hx70VIs+i}fgAnX=0i@vqz_(eY&rYIthOs3L;_^haHA9n%F|y|5jRD_} zEKZ@-RkMDpJEGt?eJzP^jaCvLVFm47pLybgC=Q~?M)>MGBaFK2LPB1qi&PS60iJ)Q zHu97N@cGG33AX9Wfjlambv^7J+Ga9?X*VB6^`8zpu9t2siJ=x%biI*D zcCg(A?de{J&${s>2J4zpVzSaW?=C_ub4I1i8&7MAAu|RblII={g|njM$o9Aye%xJn zN$Cr&o%s$+U%>WT4Z)-@9NpN`S3oSb^gzn5Rj%#$+(Xf`O9?$>8z%c_?)Ub0*(a5h z2t>95v&syhDdpQeb!2Y7QSDdvA&SDt9!m*8Imv!4j@@@zH?diRFt>^}P`^qWXeMaa zdJ8Zavq=f-8EdleTBCafGK^`!FE=1IHbDF5^>d!2$ z{~??6o3>&Qg(@2yw~2bA(geHLnK!HrI~JRO+={q|-%Y3ywuAVFZJBID>>Hts_`--W z>G%6<=Ik}uNX+_KnE9CFD_8K!kP0o)fC*KUjdxG$zKma~fYiD}3H!x?rKNJ@psQc7 zqrJy5>Oj9TOh089UKquyZj|rj^y2mOGrr8n2N8&%+*>d$!D4gam0ljDZNW-gDHH8S z?<-$G9%aEF@Mbj8_Ps%4W`#4hyk_%W#B?(kMLJp?1$T~H6k`5GH_2s?AmES9h;5E; z1Dx_Cx520yTf2w&AR9F&7yR$GF=* z$<&|7&$t=Crx zBJ_rrD-!elycmb4w_f>4G;YHt^KdMxTq!|hS24^iPl$S%OqL5L3^p6}x2-=1QMB`k zf(qT}jieXXe!o%iP#m^n?W3~4p>|w>$l2b}NSzYZ!Sx?#)YrOX*hKV3uqJLg1n_0i zc^@Fv3Ro4KF^+w;URQj*f{)-IU9V24XN9}+BjtT9RLqzi62J|s_?V?bI*lqNNPNb} z2^8#)oy9y`hs%uN&xT|*m~oOn88Qw%P@Afyez=2S>o>j*BCD+4QG=3QQ+SY9sv&=$ z43^cHapl$lB5Sbeksa74)MGPEfylV8qG8-Op^pRfay>^&`;nVF3|`oQ_J_>SDP#Qf zB**S~Uhr1~d-&CXEyG~dAAV&cDuBwIbhNisH8B7P$JqP4@rz%8R#secAf7D2rw5=D zS+~9rW3uPWIvwMIxoTRYz<{?=q8i>n9$>DCaC@(BST5q4&M`+Lx_(4bDY#s{B;WL8U{S@7(04V2B6(bq;umNazQJM5G?8oHY2zygKcnqxZc%G^aKH3(GnS=by=j!i|&l7(Rja&u1?9 z#r>1TO|TPo6F32JBQsBfAH^1>1>+h0`K9U+%_#hQ9Z8s>HQCY4yw`2)*p+)9U%1>E zREIr$6eG9PjO&!Uua*UZ7+4%{g=#JN7Tc!J+pbZ1yy)fX{vh1@LJrD4PCrg7o_CXmBmf}Z|!71Sx-tbg5sYN(6 zD;rTe+*i|nLY#1ak8#4oePWzY{p^@u6XJyS*GQaje{V-@;=8GO*oU#d$03{ehp&cg z>~~IY=04^Tp@kMUMZVtH=e_ua=+NMMG?#Ycv{m*)x{0}fCG%r zjs&sON=8uHo!QK87nZ(aEZno0jivwh9w-Y4X(U_7?XRJ&2lr3p0Ws8J<6zluXelLS z0zJ-M@*+G@NbtqA&aeT(m=-K0U|u6mqk6bRZ*+q?@B1^Xm}I#wIE9RFMqBI@eg8O7 zl&QD3uQma0N!|~~d?u!EkQE8`s|-f4$6F2y<%uNpsB>=hl^S+{$&3ke(2-b~9p{V% zfu&h6nB3P;RU}iH3F5OknR9p&XO}Vk_i+`%TCIT%m2wyEl&!s~(Q3#@{y-$rCw&DX z30HWWyI_DSL$KgkyG+?uDQR;)y{wpk#_--nnXc)=e2jWLOnhX1EcoavE28Q8edcMBU$aI4mX^^0SNut%Q>0i^3p=jB_3_xQF)EKM{ zvy^Drhm)0jaksWCSj{nwnoa?cP2tDCRj);)cAt#1rvhiBonB2{7w{A?_>hI)wY;0AqD{{{mnv+sYro67Q&n^y~}gBjPpU1#$EGlwxb1c z9LqmZ!bc0Z;1R=d#~7AeOt=M3;f#lhdwYZp8-kM@z-qGKW7^9Ee;Nm1VuIRUsBZ9} zDWV=dh2J2isvxhJqGP8G_}v_quhtjngdZ5>I6`m_5XC7p5PQ?enT(4k>|uDbKyx_l z#W)wSUA)J}WQC;wP?XVA47PW}c|URQct{^13H4`1*z7i`L=Q6)*TK*G?ND*2@Ev8% zo5UO4W+X>2nKydT*B-&j!t^jF5$e)Lj~62dor{V5CDU}~QG#I(SKp~_VVgj!=`eR# zcOH$>$>)H03ZVAQa}`o^Ak{=SsrpPz1~m%oVd~DT8hR!JM1ftL!q1P@=+Lo4;Ki4bzvfU zYrp#E2H1sDw(8{SbcE>gW3ZF2DR$5+3Z^w7hp}Xv&{lk6M-TE0juOw70=BbA)q{*{ zd1XSGXvH|sHVp?|qeCAZm4FUQ8>)S<0k6SRzg3CD=L%;hnkz>ykE%uEwx}`}Fh5Hy-WrSrWf2E1$pu*uNzatN6`1+=rd1@zObVx z+tb#MdCN|uD$f6lz+imlB$2Uh;S#yRi_EzJbXmBaGsr&1DG{?I*8Nh~#Z zLAVGYRD~J5T|keycqC^nt*%$i1dJl7L91J@g=@W~dU^0c=phYZ3%$s3zy~n+pE!Qb zqV+Q)My^W-oxQN|V8Fbb=rdo|z%~cH#xS19H`!}N#;~f#(8n>%_$U?)c2Hre?WzP? z7Vp1xRP{-c3Xqh}vg%A&&ObS0**U8*7Y_o%!Jru@*aVAQWeo~J* z{b4;ifU6?$8dU$$vD&XF9%*Bee>`nAm3kE;+>Bj|UgJLP*TL!@j z#=wBmO(#$Wn|d03l5ky@mHv$2UcEGESk08rs-t+QZUzQThEWwmTcO_BgKCqHP%5CO ziv&JOC#OP>b7^6Ij|MFKec; zL);fL!r6347;QxoqUna-OgPbd8|pF4eRXR9!$EMXr}4!kW@9=-)!u=xcpFyjV1erN ze#BL^;0PSdJ0WLat7(PG2TK6MMy~3Xh>Q8b(<}_UzqPG@JGGfevHk5Z#_G>KYsKWS^7fc`~)#x`^sy=RLxB)_-ic9tgBk-2TFOK!D^1;*L72F|? z&J2H>>iiaMLI$iJot6Pu!l>AeA=XopmDaOR;Jzha^KR3Ood=AFAVpQJKFT%LKbOw7 zl)wWXk!BgWwEiTo;?i1d#tNSrA!su@ukE-_5%xm1qYvO$g&TsN*HPfFT=`&4{EFl5uHNeDfIUb0yk9}s~Hvex_}U4kb(2y zWp`tX9Cl}R2S5_57xY0j>I}5x@?XK3IfP4FG1Av+px*|;7%q01OLKM?C2rgaeAkbf z?->%mc`d3`y0;6E3=TqU8gtTXp03(nl>nHE_xcAM4C8j95X2?`(B?MR z#=TWF6tt)?G0oWEYb=E|BtQlYQ!-bp6U9aXW|6-9f!*HR*a`zw&fylr@8GNGyhmMk za8P)Kn~)`521dxRWK6vW?mfFLYD_&*z_fv|&@{~0ti#;zMTZcbiMg~4yIv5i)(r~K zDJyx5YexT(6(u@U3Ze>V%p!gq4iq17mt!?8nKRt#fP$}2%bHypJU)OFX$lF9fm+SD zq&5V1vlkdkeOcgb6|>3lr6);1d`rrB4bX+o$vvZ7s?;xd#!3M-t1KYqYrd30Yc+e$ zcGpL?yMd{Vhej=|sy$41zD7n`CnU#^!E?x>V7B+F8G7OXw^R+rH@2J-IQ3y6bWB8p z?e5K80$jemZ&M{5Dk-=Yw0wIzDml3^eVpS8$di-q=|mD5xPR|KUUq}+T|9EKyNgFo zhIe*}br;uPW+gv_4YtI6Sd1lN%BGo8JS07+oo!i_?t}RbKPdu|a;?lM$?wRV!gW;S z&wLi5yZ?5GjtV83>?pE{UOEx@dB z$4Fc+l;rw_cYu%XW@WZ+qYe+S0lVpV5)GcAnR?6-2=aAc$y>X62Jao~1F)wNdr!co z7~>^rD@c`WF5S?GjQoo+H_S&v&t)nxp@9zSUe&Jmdpk~MWEsVRz3T>IU>#)SYGE6T zcUZy(Kx6$o2Gm7>#mLI7&>B^@j^uMMMz=UM(ih)1Gpq*q!j()u6y~sb`@%%*(10di#|@{9gTR#G19qQwwm*Gc$D#_P*0>pTH~f|DDsr3Bdf+oW*F zqRkSC@1tdS@wqGd-p8P6jnT2ld%V!gSnxtG>kjRmd-}matjvP;V^q*nv7z3Hz@b=% z%(d?_-KcuFt;cxtpBMAh$RN!;8d4SU_SwIXB9X{T9cmzC4?z!l!pF+ zD#s^!f@Z8@+f<^`F*7W%OU9~uZ_W5Su)KOZ_k*+O>SlaK&#BvATUjkjmkb@kgT@rU zMjRBh8L@7vUP)hYl(-E_iqk){S@|QzHTd zl}WCN$545?)*G#@C`p+&v60A6TVaeQ+4}bqCJMAix_cr=MBPW3on4EzLy3KoaWV)n zBaYrALiTgUchjB^`g{l_Z-Ce^f zBv8BDFdmOlip!IV?fj(@QL#zX>D?qBXsZ!5c&8Zgm>H|3K}O3K-LI@#SCLMB*pk&d(vSAy zmSi$?qlrD7c(xk_9h;{I?s*O-%M>qKx^k~cc>audppy`FB-D#m^nvmBJ}?o4@zM-J z`o5MP%v-(f?#4P+_%V`27`0{qRzRu0QZ@HaaMgV*OcjmJIN=@x&TjCP39fRloy+UmUTti~qdVf-RHE-~ZAzjup=s~iFZ!V<#7NUaq35hRAy0`N3o_&4YT;+XmZ zxRj7!J^&~TaM1-@sK<2;-ut#gNF8Kb`sR)pw;*9A%Ty9%OdxQq5vnY)d@OM&80Hl{ zN^=+NJ&DEHU_t@{pMW`Oz*!+QtBS)lxQ~%Z?1LYWNnDA%`z`j$j@^rl79y~Iq)y7( znT8o+(;)61%q_ylO_U3`;?PTA{C}fX%+GYjDABEtp;Ddx>d!ir3=OhZqi-7m%x~E3N84Joa}zTLSIOfzgysa!TVT{Zk~*Kj5H?oiqq&q!^PJE78ex{dk%{YxKZMe6yrMQsxE^cr$xoAz_B4`Zwh>m;ouHNXpV!e6*}fcaLLnFgP3*gG>vn zxR2e;m+UjR#xCYJfT1!~(6m%He$YHbS*LgL**>%)Qs4yy-ZKiksj1mx**(<}?EM%) zazx+a?%sAqIf_~3%>u)^R=ReDJ%p@`;gs~{uOL8HkW3u(AI`W&EUWma_azcy*bA3- z%ht1!6xT(+c!(va0ue(*o63VuNOrDh7c(vHd1=-=nM8}E_-pntFj-o%N?TZ92 zxV|eLyCpM*`50^F1Y_iJ^9V0buOE0xa7r|tF|K`2dl{|9K9(5J^8F=)JMdJE&z637 zPF{XDfhCwf*n0(5>3xC;m1!|&j3IBJB#R|kBU$6t`BAQ#(>jS*a>W(PSeyEoon9q- z&Gfa(k_m{|oDJg@!MmSg3Q6gX0S4}{3U-dBvs-+yD+M{CCXy-!uH)2%b%0V9C>gi2 zi-Ts?G;G~xT7{fI1k|fEY6qF*rIiNB;G)0qj3LnnNpp|T;ViMVp~m;o$=q0F9hKIc zSR{yebWikMIuM#&t820|LuhP{}$ZQ zeMUDYA=ARuPcA^|+{#aRIRa{^=1_mhwti6wEPyDbc7CEirWSGmpdZEykSG<_zJEe` zfR&d3x(iIfptqQHR5M8yj5R^CArizS4{=G82!onnihjjP273cBQ5fDZ4gKH^@1k|& z3>7Lf#6WC5kVVy_G#W4mPaw0}kaa7cok+g5eBK3L@!{6>`e?o{3BC7bV!5n^W98Wb_UAA4v7p_=WTE^4pfFR_*a)o{g$dwk*NZy98jYM&7vZ1h2Yx*^o@B2r;@jh5#~_HQpE1bVxs zbuF*sj;>uCk@AJd3f)k9Dp%M{(qgVCQKmV!yl9$;t{G!@h7-yM$9v--OEnHdfwPw6 z%9slw<~IL1AvA4UyGkKf2e*IH7VTr$eAi{h7e32cvjHBZk{?4}){>I*GY^b&ch-)1 zC44MMc&akUU4iA;uE{0mT-}gk~&sV)Hgy|mkJBA8yiWG##%&-yKG5YrZG1{rVA zviD3IH9m5$o>&G7hT!SYr7}?Sdkb$vV{tE$KlII1aq3xiShVPmVI3&kD;4l1Aw62o z$BTIwnPc_r4Y>QDj)2@@NbWc;tz0Of}NQUsM+3SVrvTD|l>cXhgK+7eA zQqKaj<|d3CU4muC$}W-i#39kM#kIW)fx%u_>esxXNHXgwcWX2E>%e3IIVC`$)iwTJ z|CcIMJ!reU7q3v2YS@U;TvQ&;X95E;Vb#-4V<+fMB(Ztt>D&T|rKf`8Ev;qX-M5jH4dq9GpLf zPy{z*T#qh{)0eemBGtOrUwec}=^QHNLHg0!>Q>*b_LTAfLVx37alfJMBhh{zlJy>vGXL zMY!8L?@F>nz-8=Au74mAwm*^x$yMvH13#=<2Zs0#j_|GfKBOr3&V7SxwRq0W{D!uo zUI*HQ+W{%0$ueZ>ehr*RQ*Y)L#AQO;A#x9CO`+D;f2xQfoeQ=s_FA^f^+6y}a!W;wQX$AUyO_ZM5Z}fj3%xtTcX6eO%w2g_mL!H7GI-RU>CA zj(I;FbRbNs2-n3WFahm$Eyn0E7zL1uFIDEQ)aTNdE^kML-E0lLaG4v%NWFedwqUkHmzJ+7RVo25FS$(?zFnliK`3fTGtusD&jwTJRd#Gxf+^^h?o$#cE>2cCQUfQ z&}>iC7oM!XaFwVpY?|LLbNjp`vc$1C#E^H7R=gZxeHlt-78p3=w~l};v2yS#!fc&? zq>3~SuLTv6s;Is>m3te$a#G-yM4$W;q}S<;&@@BGYuY^{@0e2FCSsWjA*<=VJqL>3 zT*PZAnvl6Zn8LDsJ;;)M0`iW7KpJoOgDTJUJusq3bH* zDB0dxMd!e)fZao6X{qYy25}N1=4h4H&sqrU^MJqd?zjCs^8G}oeRs)tgcbbCdb_{n z=b3gQ`7UySj=o|wBtwv|Wm9mDIbzT+@JdMB65PK=QJB|lZ&pO^K725+=|V$Bp}f9f z2L^cwO;;+^mA-qSE7v=B*@>k#i%Iu8_N+NlFDn$-B~{2JTzNH^^+wLnNw!FU45+Bd zJu(LarF=IJJMsbJh7gJAY5Mnn*dceJNP1ff#s6mSm>h<%9^(r;ilpO(Ta%bU{nHMn zWNY%@?O=)=5BE88BYeDHIvhaa8H`D*jHg)k0T~d!l=1}wEV{E&9>sfoFJm&et|#o1 zVotA-kdp*%f|0wvi`$^}Sh!~No8oVK9lDT>*3z#T_`h1?2WFwXBn5#t@gVRoQf24w z85cQ-z6BEc0K%QeL_m1nr#n_pYM8v=OVJT|J#Vs*%}p#x_=@D=ULw5`=5-X@(cMJ> zvhPqJbLg(_NoWB-!!^h>6{TC=lQzA&`-7n{1jM6@dVcq9A2qj|$x^<=dvjvA%ykee z1y^UE?f$@nDId(az+!8dRyl#hH15Tzy=h+QT9UG{u3KeeD3CX9B&b>#m_9Xf>pb!; zl|dBgN_v;QIz7gbefrf6mFu9D8ie=@Q;H$9`Ul~jGT#3xhOc{vyPv5Nz|q?)JD2v- zzyKW?lGTk6Ov*_$b;E z3NqIr*M}EmyZ;0iK71V!y9Emimv<@3aB17vg~!0FPfb=0dGgGm_V?Bh^YzODFY_Et zD|gtVBmMt6jBMjB^+f2K$$i4P{luWiB=y?wx?6V|2iSRz%D;Qc*mzoe{YLq`x{pgg zJ!<#l@U0I~NI{uBl`(x2hiNQ3$;-zSS^!!XCb3G4=a6pC2?DB;DXV=Aa?xY%=22K_ zEgVt=7^mn$+G6F<#od_6+%qq(WMKx-v{mP_FxC2Vk}#!p(kgYVFJmf96?e+;TXYB^ z$QN#u^MmiwHbT-BtIy>`;ZBh<*HF_ksnI8*b#ILA@s10)FAk(fGx~!}Vh;I`0NAaO zAIWn!PCYc-GG5+~VGo_NQW}UxmRNcU*auxG+Y#htLO-t>(aZ_6gmMj5VRBNZ5_o-y zTYezzls9Lx%+ks}EcSiJvdXS*|1IG6DrN%%YcdcIA$jxL1r)plw1k@_v`=G;lYRAM z(Zg%fw(^FAh&j)l1dLz&TdIkowr{X*4qB{{F%Z~0 zo^ol%wmj@4a60Q=RQ)2_RNnAuBS6z;#5jQC-9y6o)k|HQJ{lE(A0 zySH&H6B@V>BHLlE;SwwO{qF1^ACqSP8YE2nic=RDeE4-Tw;HR`exN7@Cq^>~_c@Xm zSnDk2@%3eV*jQXOVjt4QT)xq6=88)Szj)Sd4aH;? z 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

    ux*6Pd@9IPdm@^Y#CFE2K@55ER3Rrg)BRM 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

    93%dDoH|yXh-U&W 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 diff --git a/.yarn/cache/socks-npm-2.7.1-17f2b53052-5074f7d6a1.zip b/.yarn/cache/socks-npm-2.7.1-17f2b53052-5074f7d6a1.zip deleted file mode 100644 index 51cba2db5b16bec25cb970c9d4893f0832134d5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43974 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

    Z_)7I=BR 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

    +R%Omz> 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 LzjjbE7?}S913Q@? diff --git a/.yarn/cache/socks-npm-2.8.0-9be534eccc-ed0224ce2c.zip b/.yarn/cache/socks-npm-2.8.0-9be534eccc-ed0224ce2c.zip new file mode 100644 index 0000000000000000000000000000000000000000..68bf01056804297b5a7c7db299214f87e5ca5349 GIT binary patch literal 44607 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%0AhvtpvASHDv` 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 z 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

  • Cwdp~QQ>Q8R+ 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 I%OC&#ACC=ymH+?% literal 0 HcmV?d00001 diff --git a/.yarn/cache/string.prototype.trim-npm-1.2.7-3fbaf3b9d2-a1b795bdb4.zip b/.yarn/cache/string.prototype.trim-npm-1.2.7-3fbaf3b9d2-a1b795bdb4.zip deleted file mode 100644 index 843c03ebe9d6bc076992df3a181e53ba75a578f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14291 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 F{tw;BtGfUI diff --git a/.yarn/cache/string.prototype.trimend-npm-1.0.6-304246ecc1-3893db9267.zip b/.yarn/cache/string.prototype.trimend-npm-1.0.6-304246ecc1-3893db9267.zip deleted file mode 100644 index c8b07fbc771d11e7e44d877b4c09c9ee54e166e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11581 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 diff --git a/.yarn/cache/string.prototype.trimstart-npm-1.0.6-0926caea6c-05e2cd06fa.zip b/.yarn/cache/string.prototype.trimstart-npm-1.0.6-0926caea6c-05e2cd06fa.zip deleted file mode 100644 index 0fb7c079b822fdeaf1341035a7071d8f63fe69c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11677 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 PkFSc4cYK|$zs~+Y-gDYB diff --git a/.yarn/cache/ts-node-npm-10.4.0-04cb6e2279-5874ac27f6.zip b/.yarn/cache/ts-node-npm-10.4.0-04cb6e2279-5874ac27f6.zip deleted file mode 100644 index 097601aaa45e24eb7e9b29392b0d8d13110c6462..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 169410 zcma&NW3VXAvMoAo+qP}nwr$(C?KN%NHrBLl+iUu*Z{Kr%?EBt6=T&reS9D}n#mE@d zm0gvkAPo$H0`N}}s9k~hSLMHMuz#O+_9mwKw)Q5jHm1(>3ja|R_5W6Nai;yp^uJ7i z03iO=x&iuQVKfi`fIJ8Q0M36hk&zS@l~WegRg#Y1U_j{oP>Z+;<2|0QE{hASZ17lMhw!~(32X>;t!-&@PXxltS*Wc|K zRF~K16Ktyg#YiCcY+=W6E3?~$&uVBEgci%aZ(ul@{Jhf%SRFnSQ`$S=SRH1t0RdOU zxCb}qvh2Zv2m-$B5Zr{x3)jx2;#NO|NM$hxFf=nq80#MHP$L#RO{=ogHL5laUSmy1 z&KyFOuru&7I>cj8sQH$W!7EEtQ{iO>p5L}g-o7!{AssOPhhZa(gQ#A3QD5uf?tN=B z*_UGOPc!Ol!qWjG;9Jbzk(PJ9Kl2Ee{>9EaUC;`Wt1l#k7f>0gc*b! zuc@y)`*XrGGc5~`+7V=j+szYWT(P|M*IO)+ef*3IxGZQA!bQLZH?)97$(N^~A49UBqyx zcL2eGs%wpIrchI~R*p*tK0q#*F=WjTGp(NUqN^4F?on%KWay<~?OWe~TyP;{e`s09TQ{bf?#V#ZPBA*C7o9xT6 z8}tSIpLvhFn}w94M13WL~VzET}Q6EXIcYnhL2A`(9BAh8L$ zn+Rz{m}R3<(4#NX+1hs28Vx?Q7m(TNte@weX?wDMGL=pcaFPdGUw77~?(4TnOsLp} zC6a!C{*ROXd!##)siVFB1!)5a0KoLWf^{}_vUG5vH8FK?GBq}IG5r_x_$j#|1_aU9 zuP8!YlGKL)TGgL`D5yx+qha(53e4<=UucBixZ$lq+vBUwC%MnM$UQ8-_Q80NwPRJ$ zc*nsReaBm?PVEHntzy}SI3ipV?lkwVszLOXR$A}8s}3Woi|MnLG43SST!UkAdVGJNsq&K6VVDn^selDlC1>Kc~mKGrlbeFl)~6WkD{yfd>$@3 z6=f~Cf6P}{tRL8<;(MHC?mjN37U>-Aetx1>gXJw=|BG(_?Mc3UkEH6q9^CmWnz1y%6?y|VgH0o11QKWBiZW&7%uy7# zus6@Ol>{$wuend`5w#U?=6%${ejZd9h`tprJqRiy1##=8X>rRT^zy;!BH$sNR*&SA zgTh&7HqD;8I?&lEb<<@cX0y>+JrTC1_t0zezv*F3R)_C^5s3_TiM-harZp%0qR*41@*q)$(U@V~ADcflqn z-8K=?b9&?8U7bY^aK$LQjoUSO%(%h371E%BZib9pc)`~>e|uw|Zh6bu=fY2WXbwkm z%h_Kzw$$Fl{WqE-geX7kxEOYkT%^}iXagHcooi}&v zIe;uD$65@&=Rq5xfWIAOaSq8O=1n$;(eK?dq+jPQ+(q%pY81^B6U`|xL_*&L2tLGp zj6%%h&3Qo6wt1jA5CVC^h#-k;f3-Se&P983OCGUwOrZxo;pKr_AA%d&wasX{oHJi# z{*1n}_aoR@n?c4UMvr<$y*qmO=h~8-Yd97! zVt(5PB=b^OOvJOBGB?W+n$1`^CP-%Betql}oi0SxjUDI<{k{%37U%$+-uuK zXBZOQ*L-pX8|HMIdiqS_He6FGF-SH8dS@?Gq$WIdie>7}0x$dzQ4|N#FP{ptmsm8< z3@9PXl#+?oQ<>%BTxHZvSQh({qHKBu(`KOBp2D%{LU>?DWP6&RC%Fo^&88tB4iux| z+i1RT(sifdN1iF~(KoJ}5rQCJe=C@)ivoizKyr*44_IIXGUCSMqC2{)9cU--l;MKC zxbB4&u`k=b1}}T+KHhG{A*sjfKpj|&mbP#;D~Zb1FTL{D)`N|qHmfy@8eW%zFsuWM z**~Jw4x$se4wbVNBK>%r?BXg9#_+gZ3cniI*#yLwuQbhJyJO6_KUHH^*-A_c<6=Xt zGOAladKew7Je897xUA>}`Kt7&qimd2a?FX;{NzW_z1AJdb5KMsU{K6~q#*W9A~Xh> zC_%JMI5S@o*X}6vh7q+%_LVYN#m`$c=09P5F!Gv+j2Cn0_meztV9RKrl-Uk#v`VQ! zvgF~{SSCF+9I$$$lS4wYWgA%mrh5aAx$v!wV}AD0eW&W?z&|gDWDNK=^@Mo|mlT83 z#s*d|T(8BS*afzpH}Q(i(r&#(9&YfLkkj<^-qMKU>Y?@2NbYRKsrhj~b;)gcIh$gj zlk)tA?lbEA;-?tvW|pvbpV{8CcQ4JBrr4jkckh`mqIb`AE73`8{HEOJh8TTcwe8CM z?z(uQJikHXdk^K7(EEm>=MFnuHCBV?7A<{K(jFD)>4qnK3m^=<;e7ZD>Uxiv&W75) zLOyLI!>%b~X4=Sj&*>MghOs^Z3W%}p*NOKMim6iL(SH+PV``-ZqrlCO0etVE*z-p@ zNTMS#7M^A4T48n?rP~a*I5qG;r30J*5w8^#*NiN~5m;bu?k0N22*{LRTqQjnM0NO+ zy8s6{CP)>j*;s@sCD-;jb0#?hRt+?Qez2(C@yjkhM=`;OID-$tR{O$ObVXk8k9aN1wCJGql zB-RDA#ucWxa-=zrwouILs1emHZ4{&BENvaLeW6_hZ&o@&3D*vH*`%7*;C&e1z9eRv z8(afZ2pK!^K%3t`6Yfm(;jc<`m+XQ$X@aERI80PvE1zd%mbNvRUG8a0cW+|I1ulLd zlzb5sca4=nHj2(bjvToP5Jy8&2J%+EQVxArMhV=zH%v8iN*uC3vckk>Ri|%3KXz14 z{>r4Bnd9Z+SJ|H<1(?Jp8bx#`No&ai?EZj3Lx4#nY3db6;7I6Q45;nHt-et}$7p-c zM^2%kV?5^fE2oE@O|KIk^lXifs7q$3r6>pa{JSk*S%oNHV-sPTYWg6{!r0YMQ$S=%}+NzUE?*B<}CO`}e3_d=b(P%2+9 z`pqT`)*nkMa^I}?KUigoN;8u6lBRsJZ#|xRM|(Id0u<9iScKA&-^v=4cLiH#xT&*O zn~B4^v-J>FFi;g4>QPKG`Efk3=8$rdI0}y2a~XhB$ZhNy3FX8RImnz^XBz~~OwR!X z`uS#i2}+G2dNRH3d8*_rS*atXDp*7mFjD|@b8!fJRCJgw#mu)K+2iw44gfL(%b!0i zthspJ^<0%;a6*_MT~Sfj!)yu)n(cD%6rJ$tuU+P${?9N^MgtQ%0;OMUm9f zk}8x<7<8^y@7S7mt=3dkmWaC*6rgi+Dt_xSjs;&EMXBa)&wnSF*RslA&*Q^ZEJ7m* z18m12d6;f-93h;^#bG`13Bm*<1mMh?3MjWn&%!DAwc*d@5@iK2w1qwFM>Mn7uho)yTD znz$-4;uF!R!LTwgY|gkG1n1^(DOT=qfxJ-9hCNqJ>Bp zp28EWKAn4Am`z_V9_27HoKYZEa-j~*g?jNota{Q*ta~$(dTCDH5ap<$P`cCyl-h2d zjT~!pn!utgnA60q3nK|fB8TG35Z8)%j!NEy%*XZF_490*z5EV-4>zV3mENyNDtPWz z($ws?8ET+b`t!1Z%3)~9u{me;R{;g{z5q{mV!oQ1~V)c_3pM8=6XG%&v72LH|V+3i)8%Ep8+T#LZ;xl6Y&8i#jJUHO01IC z2s+82s=JbjAQMT(-?WOUt%tjmRmsupWw+d+EowDC=__@qD_LegoQ^Fo9zuGk`h7I@ zXw5${!%~oc*r8}ZS$;ied4~TeAH35;Xu2wBk5&rY2hZ$Iv51VZ_91a_i_?4fMPqSB zqDvSRswhL%Qwmj=e_xMP2B$yVf9OZV;^qa(-c_< z?wH2KKtnM!)KT54h5ZytVS&zNsB&@pn)&2Aj+R8#&U=hi5w7LJ$K|)jj`54Zeo6jP;YV-qvAdnY6}B494@8E9$dv?=Q521teh=jM-W1u zk6nTGoyNe2>c1DZX{Njdk5G(EVnZckZ=?=HUHV^ac1Ctd6}+aObk6kEhu>k9gT9$po8AomY{p;5e04i%mgc zK|%@G-Y`k%2`uF-NcKINk9QUCNGoN62V=&6mAyKq!jnD zu`cH_dGY~(yWn+uj>7E=PQsaNCr@A+r}py(vsgYhIT=c&HLXqHZk%&6xH{MV4dl}Z zGG$%iOBLn4ePY9uhwPgaEH%x{r6q|l+9vlxh>i(nE4ap3opDB)r%};~$vt>5zS7@74X8tSu?|_jAp)YR6!!vV zJ&G92CD5rWMQPB(DMY!XOpry`><-NBvBH>(ieCv#{wn(kpa=nhny^>2^5`fd6X(&5 z6crG0KKocL_)wIUbW$q4lqJ7!g>ll=$O#!SJ9LZ4kIL(HxP8UB9TVit>Zdyfp?qw5kkK)j8iemKO_&)j zFkCTlNuSPTAJB+0(DO!NtNy9Zw0|&#+ESkusTXX#FJGkOajbC@qQccxP@MZf%2yMc zC{{EF7StI&5 zoH2d`2Ygaw?fCh%I*^-y&bcf?5Z$Y^ylwaD|F%(95#{_7M)%HnY*;F{yPXny9&1Ti zfnQc>FNzxEL?yM7Rgi{DvnbMKP*L>wBbK4#Sv?9*G%>Ep@$}*6-GR zcJ)#1J461`3P8OZF)eM#1{aH~k{bvHU7RnIw_)rM#b!) z>0o(ya_MR%jS(glUBum@bVPV-eubO&+DH+mqv->*lWO;>%^XRTKkldXiPyXj{C=LSc1%h37#|r(k790QPlC$Z<#{ zM8GT(6fccb0gZJntF`4?sFz8KC*rF=u{N9!m^(t^UhjyS9x+jt>Bvz2IgHeckol*0ZX>DQHitZLZ(X$9wAz3e;@ zr_OA*<@6YSsPJ_U+)DJUoOu?MJo%vEg_~z$ex(Us!-S+M_hq!STavw`({h=&ok8Tk z<5S}Cy&J>5%&!jxcgTiHG{q$9(sJM%JLlMzA&6A9hiT~;e&q_>rs2@nx8@QAt4Kxe zBmzvRDOEVNoI?(QLwd41uAZKcA?)v=$dNp()cP^-xI-3NhbP+(wGr@&wACN%7ir{- zunE8LPR;$*bBY2Hy2trDyPIl7%^0{#M+=2@6N$#^WFd@4O@{EycEcEc<3y#rby;Vl zQB`7k!)-`>`$B3UN`Z~8#zC38@JBWjj%4O6o@6go5D;!2_8EoNV6s^Et>;JxEB_we z|LcC1|MTuJZ!|@VvQZHfLiR{WPqyw>0^hM%@@SOLchJrw-;M~`*L9{QK^)J~UcED< zhxeg+0_N;y=-FX}Ss~bmpqD5W{@C8#mcdjF85N}HC&L;4DnAuM|KqTQid6}i zsDM@|5GS%wb_g)xX4gM!o)Vc8J?gI2e`n+;hcd%`te~B#HQ-ZsG6g67G)2?Q-%KD# zxBKdXfR4hIQ0ylFJ1iLf9|CjuWj8^)&t@Bk8B&Ej1NFMUQ#9ZXT-!s=r`zzADY2Ih zUj`7Zx8rPnyUAuoQSr8K^pS3qKkbwlJD2V9`NT5%elD<>V)T97I9{x}8!z47XfI96#&1*=8Bpx0Y9Sq9-Sxe7d3O1b&t^ty~n6qO;Rmq56J6 zp>hS~_6$MFZY*F8b>4CxzZ1ON9G$AC7h5)o(s zfRMkN5&!c#tFgVEnWed_lc9^Hz1`on$7QWc`>l4wpI(2^CQ!O0`7~#W4fvhM?UI+y zXVy5_+fscPl!< zAZr>(Y6yr(t%L*1@6fWQI%+yjZz>BO=@C`o2b~9`HAl)hWS(&* z?A6Q~hqw;F@v9J^L^%U%_>!2X&1;jmKE6Las4-u{Xg#>wjodAiCavUY3p5UdC!#%N zs*N)h$Z&G7+Rd>t`9l$)yJph~=+A13n(Cm5O_1f|G@0|T)aBdq0{GH;k{ZUHT8fSn zO$Xip>{k7AOOpgkebpr|3# zY#_&lqE{ru5GEqarJE7Rk$P^yxY@20H)R7(N>4YDon1s`EaXUCLEIxrz>UT(d4SW7 z0VkVfLI66ZbVn|)>DV?^9$9+UWa16Qn^wDK1)J(%1&^Hvj;exrFoOa597!zhS`ty3 zolnH{QQsDSLs@331c;mT{sF$It|r|e$T=&XA%(=yz{rsUqTtZ~KbMV`DL=$NiRj^P7#nav6Nz!`kZ*-yyorneCtJkbK+{<8 zxfkb4V^~BVZ6I#Az?qEY|6KJOpB(C+F6{YXQD7gDw>JLVKu%fzOV*ou6mcgASGjV7jfN zCxD~4(Hx29r7gw^#Dg9J&eS^bYp~b`13DE9dIHo8)>M7C>oqY`*WbVi zs-h}_=xdt;@OcK$EMN zn$vwdi0pb4h6vWd0YSb~?lOB|_QNMmFPI%{YAk#sMpimgCdd`J+8`<+-HNzup+!X0 z*YvE(46r*~Ic$1+`;f;^i(b2oyD|$OO?CS%?H(OlYmY!l6S)G(tmdCruQMVA%g}wF zc1s*khArHRs`kZG3(4G#8-`otATThRpXfEGDt|P=s6@EJ!fZ}CNvyO%^Qm-=HV^|K^ z<5c~^Ih=P28OHrVhV~Wh2tXxPJ9f09|0AdUd(0%>z#BSmE4;w5Q^^Me-e_iyQ{YvJ zMY@McR{1A+fQ6CoPYL}&I-+bT)wr5>W3IEuUZ>5F{%AkatHYTX3LYF%V+3A$%Npnq zR%4+=IJ-IH7luZZ9%24iOs28E05D8d5x(}RNj*2t3Dob8OPkMj0s&KJ(a5YrqrGYF zuZ-af#z9y|91&u&>yF^W#{`oA`vBK&FRqtukwq>(MbD%GJqm@KAUd?>fV=GNMQ3-k z-$+HoVUUwll7y+t6Z+M?U{5FoJJW$8#VltYRz!hKV1i;OmF8Jq{XaND-*tpT0C(lI zKj7ddTlR7EOQj2D%pPn+@j7>}3m%4|A1~XwYc>5Wne(K>Ybb}lzk?$qpEuX(hI3TF zw`wHttYndQ%i_BI576lHQB>9Vo&-#RDeCO#$?nnICxzHs+(X57AzxQ zB{3=baFUYqM$y^~oAB1S5p@dy6O$@QPCOH^H~EuDI6p2CakMa@Wj_H$z?s&A5%yt% znCCS+Nm+^EQ%rQu2@c!Koq%n;HiDDTH_pqllTB;6HBYpTg@}3Jlq9%O zl=A1M5SK;N@BNJ-o}swiklSp_2k6v_J%1_IH6bFRttQwV00XAU!KqBlqsiYvuF0t!y3)L zYj;cxMx`i6+_+dAUbNXjHqY~w=B*&z4enLxxo4mhOb)o&(l?a|-6isEljs6rzrJJl z4Rse6ZU7o#rSZ>%@;{Y{k-Mg`&pCeb2uZ#_rRwIx#AC zPBij}?Z!r-pg_?!t~7ont0_biQCr%UZMnrJ$W>R>XjWBM4Pb`=GBrqC8kkhLS(MlQ zu7Nr0o3YmWbg1H-R0J2Up1LlgwGy@rZ$sfQFx6$pY;}SJ_31 zJeXggFz!KkCtcl`RjVfAp;PGvp|WX9Q2VTf>Wi~GQY|Suxu#D@6f1ULxr38554i)B z7^k+%ql-s9TWfWe!Efl4WN+4j8jlKjPkNwiBv(=Qp@+eh$cGNREO?DUDa^aEcwfE* z45ETzhF1l7F2pyuLu?+pyCImcx5(`Cm*}rC+6e&l*JoHO_KQR?n6(WyaggMFF4^!L?~gjE_~Cr0;iO&X|6vr!37m8()uR4=sD6A=4z zBPrRyPf~WS3;r@^_p67?{w&Yen6n4XRIo?QT2eN=k>ZtgSZxVN-oBQxf2PeoLRQ^4 zK~{Q-;Y*E0;Woxn*cOW?_?L$(!K{O>vvL1dA|CNZ{$`%VnryWF9&+6aAm1(W=ZTo9 z=UnE2(p?dd#OKR|`X5?3T}5Bs@O@HMAyp5Mz7$4ItI*yMi19VTpx4CdRBhyTK2Su! zU6k63yHi{XfNc#W*e;U`v_5__gmSU!DrX7QEqvUsnJ>SB5K_Kv9}Y|XXg|aZk#FRG zkHxF#5s?ZY0RTMzZvFqyyZ@%nw*N%nnjiMq9f;rC{-B3wZC&S9sl}_}B<-9-uC;t5 z=)@2EP&jaCJ<^&n>e8u4Qfj{MyWB%#e9cuNj!G!32;wKk9P##Md`e>_Mk1CI%Dy~& zT8fgjb>~@5(|?2Tf?Q|O-nX#5A4yi^#9cq)rbY=?^iW+FDtlum*<;%dgHScbj+hBr z>WpHo{`YWVApT{vtjH2LbryQe--r_~l+Z@sWZeo`Xq3pzPLg^Z1BjGsSvq0Q1xb{N zbz5$a^Ap&~wBO9&Tm$Xw-6AFXuaF%nMgyqPg|+P%tv&`7FIa8Oxv6h4r<_w((=A*5 z_9g2~)zz|4Znv?*vJz6RT;v6ds3YNGvSlWhFx)>C#D1JB&Xg--eS9w%#Berr&euE; zc}X%TFgiD1=VHIeh|ybCEDBGnA*jcOQ@>Rq?#6P|tlRDws-&8+Rdy zR0CGAK8w%5Qe0uH@e8SdR*$Sl;EVPxrnV7L3wLZ2SQx+({;r zsr8ub*4GM#q&}0KnYkU{+!|&M-?j&t&gd4{jW#`t0rbxetQ!t$4u-b{D2$;ysFxHJ z9OsA=o+J3dG>JE30DlZY!z`%D=r?NVs@`{s2^BsS{g_K;a}!SgNC5e4U30Q9i{8+a+S|kIizTW?ke)D;(WBI;5#x>vW;lE)?f{#VxUR0^Bz8vbTAYGTnz3}8 zVwxMk5LMfwYCg;pfowFJi#1S!))-sh2I3%PXX(*ahWwTs0ZPi-z00|jRhsaBeRU^( zU{2AB0ARj`fe%`V;YO5KJGgj@#_;pSPIk%+9CK)?L}dUMvRF_Vk3nzi;2r=CsDVvU zaKgT``+3dknOAI2Au^SEQ%ucIWQ5H9A@xk-flk0y3H?D-`p)6;2Q=!)GTP~}4Av;Gljpmqn#-zPi2~ghxfzDxnHYNfn3M`kT!ON`FCC1>Q z?A1PhXg6hpT*D?w$TP4%7|Lk~f;Aa9v@Fq*DF>2~G{HvsQ{mUKH)e=dw8~LwxMu3; zGLgAn%gGT)kkSdKQp$>fK?)3xD(8lwTdR+1)Tl>$m=VT@+Y$3Ulfsbt1s_@VC)S!T5}luivJ4TB z%sHVlzfF{?Ll%i3OQCVnWamzmHOgOjWaTXQ#VU;6$X`rTyb$$)M(6!~iog_DbdpU) zc>CU%QV*nmULkhhZx~0gxJjAYi?ihNu*1x(s?Oi{K@JibQ>A*F(=BbQ=ZqxxW^C-P z&MwP!{S;&%Iu@28DGit%P7nj)`ivlfs_4ux6f9^J(rNF>oee%$Wc0C!iD-r#sSZwq z_MkymyMRD{Pq6A7LM})*Ndu@=o`4R4qc8+I5mBZ`x*-04UW4xL*= zRhW#kk|9V{+Bl@|u&R>$`3hEb#m>lvFTWkzKV*YQvW#EZb@rC5&y86(K@5>?( zIpi~vifx_*rnw}rTjfTTL+}O*!Uee5*j#R$9GjWIx0arP#Cvc&j`sakNOc9Cp729f zh2kKZd$4ti>Xk|2!vJ0F(#Jbs^YHD+w#+g% zAUbDX5^IlMGYpToGfldwHohn2f=o+(aWA z$+ZhFmj}>o1C|Gh1r~OOS@uTqgB3hC5@f3_``|-i58k4cykB^z1g**tIo`{UR8L!- z{h8dqenVtle1F)fd<)$Afiev`f{Cy`UaB;D+lHs8L1xUS(~uK9VxS9QIKr`5_2?=b zaul~7v&)={&ldZy0t45p3VF6!3kS5z>ozLX^9jE2 zYjp+OXjNyw3Wm%^yU*+4_xgy*fy~xg9g5BPbT)T4#K1b|4|{e$l83GJfE&EBWsZH# zhH$6X`(XKb@HJt|U_j-qibvc}jPfsie%}+f-Q|j3HQrh4cH%F?#%<~@7GtYdwr8}< zC(#k?%R_V@IPFt}!T6z@*f?{t8}O{&7`p{_=a&d>w-s6a>AeojT#WGX4vsb%=oHN8 z{iY+aaa-Xc&|UN}QoJA5^{1JjZ?~){9FG=$o|UzY-{#66V~}} zfaqlE=xXU?NVQIyoiXf45KJ4MjlkFFh^-7bjO!8Yo{%Zm55cN1*^fMky!& z0OWE30Eqrmr~k@vx3n`c_4wQ2wXd!BrdZOR`wx^xHZBkxh@>1-GUC`_s^x~FSZg!V zuit!8azPLZL7+f9083MppZp)TKZ{>URh54BEE1F1>%Tg<`5TA}x~l#umo;7NC$1OE zvZ=AzvENOb?GH1DbKHGb{M_B2IdRz(lH{6+c&f)VHCf>NJ$b3B%HcbsZ=PEI6v>{s zb|E`O?%1b~F00m+o)@%1-^_Z9Sn8Hr#Y0~2!kRlvJJho@b9^f2s%q?(CBB_f+55i9 zXs&8#UYqk1^_5aRC!70SJ@Vj1$k&VVLx;&`tB3`>)Ci%^N)yT#zL)(&ImG~w}WrfD9VU*^UbB8Srl zC+|MseCp>vIp(St_Iv5E0x9y5rDm`%vdfw5nziYNw_28|+0*;MR5eqctaALrP04RC ziObaAQ|-B_)9o?~v}(4_ShH-_YKp>)y^^!aIe^fze|jZ%WmTrN=F=kSKDj4qPgJ)6 z2(K%}45KBchiG{5PaSp5lWA(MMyprIRyI^xP*VQ3j$?M`!$d#2CTJ^+z{+L{YZE(F z9MoaEnmgaFMvFUw+w8Jn#3x(zhw1c^{3+npop-+E6kMS~D%(@_&W`o_!W&x4UYlNz z=TXnYeyaH;>$3WV!`$n5nA$+7=Yh#LAPEJ-!3SBtWd0OOiamh?8*h$OzTQ`dM4^J} zwtN5n{_XxwpZ^*kem0yOzq{+Q`R<@pvaE@Wy0*JCMHoImGu#zp;1Yts))A|01Qj9h zQOkGu9Z#_Awq81am!|f@rO)D1Q#Ec;i>`u8sJX~1%{+ED+H2taMf2?127D(^-;Jy)4 z?%ow5x~t-VIj|7`rg;@hh#X%-`!kX?JTDF*$jYkFNMQWpl>`+M_;xlI;Oy(2dU=qa zkJ{(?B9-cU`__c9D#-Wo<>|1lFDkwe_v@i+w_%@96|_*WUvW}dB!UE+iR>domS^rUV=?u0sG$UI0=4TfSSGJC@8HYXSGevKay>>H3-6_?shfs^WZH-TJI2* z5(OB_hyG!b2T(R}55iMW2%M9x)G&7r0NgRK{`F!Yz8IS(RZL`QRjK;9(1IE;)ubuv zwza-$`u@}_SxnRR08i~TsJyD_>zsz%ql==?5Ni3ieGkC!6lS4x6UFIihP430QgrFg zFdcn244R5gOyI>xadl}kA`@Vj3_qu5hF+Q{2<;~xI4NqiM8Fj&9HrHTfDpxyJ(8^E zc7I`s3}I+}73NLoq33prvW_+HcSYF?jmlK5gM4DqiaWxnfqlo#iG8?ESp;5G|7tyG z&E4nW{^tJM=6<&PZ91&%Ss<1P-?JZzsH5u$8m^oEiDgQ<`u7N>`1Hp`gT!rjTm9F& z;8My5c{q7KAG*3-k30ant;oI#g;G{VnL zrIe8!H_P)*z(5atPhH;(i)R&J77Bn=DvgUHxG-nBhAb4Pr|?BEO7wkqr9ez1s3lXy z!szpH$t6*JhKF=4Gub_lxM*xP*l|osJp$SgM;`e&vx&zN-UCXdd!&2zNd1g`QzeZ; zB@vFo8q-pp#E#2dotdD6>K@&I;8>|HL5I!V<7U4%9Jd(btn(H?KH2wVvu}p@AK%sW zhwE=g3EtvGn5S-54zE9k{wVcq&lpP+Em*%`;Nru)s@gP<#UiYzn#nK~tZL|XuJK{y zJWjTp zfX^aY?cYCR8=2NVd%#J=uVxPse@;`}^6#qx;A3k7Khtz~svO zz}wEOHvuEfn~UW{nRJ4@lQ~o#B`*jnQR%!#WR_h#jdw3|5$iQ1yG#^cRx#Tr(0q2g zoMwZWrs|_3FjZs_S5Rxg$`nBBnwEO9;J!5V&w>BXhrdT2RLXui=mX^ydpYVx2 z4Czfg1v;khWCh;h3=F)VW`2y^zChAvHLDoES}tu?Dfsf=7Xu3P{Zr!yIKHO>M*OB(W8$-4ho)yN+44Df;;zyD@x4)6G z!rX7rC6;H3cI_Mvx{%hRDyU&%2s(Zne*t^!J2{0o>vAgL_)FQC()>D3wx4al5E@>s zfTLthBgkMPGx(D~w30@_fIf^!W!fiI^-M)iKc5vJvJ-N0WLb9ZRZ6BSgl;1u7AC}a z03CqJ1xB%wQu`f(6`=5h(rSrs(ZgI8&cx83j;w=cplAFNUZRH@lk`;5g2Z>^P9o!#8r!RD?dQf+onXBz`7 zsL%LMcE5i9!W+o9-hjSCSgwCqANw8qDkg*tS#4uIgZMD+8DRA(V;Vzh*h=dKPmr1Q znvzy9N!5yioz3FR{Op<)TbSA4DPYT2zXpC#HU7HVZ65gwheyY*b9hvT8`N9$k! z9jTG;lC!n5AF(|?Z?lkGLNrbKvvuom&lIPKOk>rhSOAFm_8%^~+WdjzU`6&Ly|&9g zX)HB=r;MJCsfb9HR8b~mH;z4sw{pD;FLEMSy*)ZsF43woz8W6l}gt8K{GDqMilGv*I=gk!>3EDX6>Ej`7 z?N~CkB1o1&)S}2ij`=Z>c_Ij1-9T}4AEO|kbW7*-AgwSwk!nVcHFVR&23tmjTL7eN zzJVawFT^M7xT~(poH!D9CJqa217w7KXgd393ZoEb1_SOK_+Wwj0x=+C&2%L&t5LKt z=(_$rFP)H@kxmd%6J47Ji=qo!oG*MLaZV^t=^j&6h82({ z6Yu2+K2eyg1pra#GFzD}{1PmHT|WEgswr%=P=OZ`>haqe{*$iijvG7=`g)MT@*LZf zbK5NE0Cxlkz@pF;!url`d!k^CXZhdjmJ3r5x|Q{EXV3Yb%{80I@&yS+O}j}FSto>r zj66cZAizuBaG~iPy{suc$HGGAERl~~%fjArTo=b|&K3(c%66$)y&!}QSi(B>pesh{ zF)jtO7t2Ijq%Q<0pGN4U{%p1-PViv@3+*5WJOSxPfbad?*`Bnoml{tACddkE^RaY} zL|8^7Fd)u8kOBe(+d)2{WCB~3Ln0=YW-cMA%akV7eCOYlvE|LpS#wBhbi`mIbZOSf zl>C7(KykJBOXRu`hha?J;3KUo8&>$L*3XJFB`$zU0?6k&rU+GxI57n4mo7}RymK3t z@>xfWC5+=28!M%CD!370+0VM#_Kjh~7jM+OLA3)T33zvPuxdVGg4PYh%W9tf0Wq+^ z`EGE^no;I^S+bXk9qFgH8P<7?GBHvdW+ug6w@6D2bJhY~T+CG#wE`!xVRz$})WhE& z*SFsot-UuseLY_bUvJqj=37G`oLYLPD{A!-v);zA42ChR5L7agJa+Or)xI@kWA%ck-EXI;pT) z(jMt5Y`D!3w+W?xGQWFD{p(mpky2@DZYLMsYZWe;-LETYvfYNPtM*%L%46rP9@niN zGb=L0fM8@fDrId1Y#YxJwo4j=-5k66-a#Of*HV&XK$3&14vAyIg7U&#r%e3!pbx@w ztFZ%VYG1JYv*!VnGDsv4(OX4dP5ns7BWMgDrxjx)kZ@CW)}eNQM&nyMU-7o&gh%LAJR#unUE3BO+FbYX_c>lp$k*ONw}4B4nv@UJ5JSF6f6%eRwV4HudU`7PegsN z%{e*y1zFeEwoA{D%1-+Czxo(3bE)2t)U&`N*5AI(5o5e`U$k8^>ON-;6P)q zha?K5mz)he6U%l;a!*QcTWVY&qrJ5`er;wjTdk&q&NrQO>uzR!xq*%|UyX`(Osxom zD|qNAJPgN5yOztj&(I)x8b^*}J7K)Kjy<2Ubv@_Lghf981vl@1Nj` z+g%3o=J5t$wy&&z9LS$IvB&%lcNrU?T#hP1i@G#4j=a-Hrg(tz=`G$a>ex@M^3jYK z?AG;>r4-iP9SBx24O^<@m#l>&PbFN@O#t)x2@nAnn#8l@o<#db3FoB!&b?w(maeQ~bN zI(P3r@5bkOcA87e#gl{eRj6B*T573H@O|PuVzq)AfhJ9VT>ZJfgO!<$*2MFbwj|fo z^yR*4a`E-z9dP3r-LZesG&C+%paWZ2KNcegdx+aqyYzaNiBXw_rzhu?BRK7-GNXH2 zuB2f4_~;tkGhu`N0M&iKmw`$OI82n>8Aw~;hvTG^>;(@@;BRp*%N@Fo4vs%s5v7;< z5@-pP{$Xr~FAhjuIyyc5Vy0=q_j5`lC5aBO2bEFdMACxESdY2Wm^1aplT^=(hEnAT zgwz#+WJniIu83C*??4#_&HZExydMVV&_@osB28keM51oQ(JK}Z2%`yF#jT`GST;74 zz&Ly#e9g_FJ<=!(;Pc+FL2!t;cqZv;F;zyJ4s_9OJ;n%u%Jqw#LcTpkIX^YuKp%z` z!)<4@a&cOEtHYd5R19&ZA|`4QNiH8i@M%Ryf|cNMDqHgDc^#3w_J`FHVcul4k0W7c zv7z3g{-)$J&4#4>PBm~B2zrTDC2LVtnj!`^qL@ObOSIg49s+_jXAw<5lDJE`*tAp$ zYr@op{n#Xf>KxFwYAMSJ2o>kQYf|^|il)rBVQ;I7ou^@f)~#AaDj6vsnl@+{dFKoX zkRE7TtE?zes@FCoGJX#@+qQs}cjA9ql@hlaUR;R)7OW}-0QV_YW^>T6kZ(2kXC%fY zp&dLdGN-_F8eo6a0vxzBH$){p-IAm@%r|?D(xE7jvE848LVZu6RPEvIv-Q*GcrSQN)210-c+$&vFJ*uJl;yXTBgK@E@F{7Zv!CVK?X!?L zNA3qx_G3&kmuY#hIIXEu$*ePbYf`SdCf@o$kzS8vEw{a_mY9P%9l?aOk3!It*Q2NS z<+Gb{LwKqgm%dYIFR9oV+MGPuq_~AZEf$TZYfA{Myoih^#2I=PkJ@^eSbPxMPpvS_ zTRyzi^!`}USP4em6|E8gl7p53D2*=h<6LZ|H?@g(CNOwgrnOx9pv8xe5lkH2;`MAJc z2Cb2)6!ybM;n$*$;gc@Pm_SBaL^p{NY0*tt_6NH%X65?HTrwAZlaWM3Rd}nR3y4~r zzd>;Q>05A^&5PO=&CR4-82D+{BId(%I1Y?8X)c#zL9hT#OB zG3Q4!w&(Z03X!d|ASZCO{DYv^VnYfM#G9g>C$xEZsND(!x(%Xb=3~v74dQ`5O4E61 zQ`}L2TQ{KAD$d6Vk4I}y5oyPcs!4BYOW#%B=NFYNGLDsaM2eM^Mq++RPRZ$^b7|hS z($ZmVHBUx&Ea>M-kFS)a6~4>;tlccefQFyB3mRUc^agwJSZwtoTw4k2Kr-6S?@}F! z6Q;KJ7eO*>R`N-ObtacztgfZLxDN>^H0%|n12e%fV1lXKI*fQEU*2>BWKL@~a#$N# zzK7qo(PS>LD8i3!z0Z>N&w2)x(;kdUpmL;7HD0Rog^BbW6O@k8hO0k9`Z)^8L$Y^O zhT{Nb_*~q&c^++iZHuJ-Yg%d{vde1x%n+X5$I>#$XMQ;mqg-ZPGX&hdpT`Me`Y_ACnPzLXluW9mm;TGhdd zy%6N4%(#vZaf&&oPIzP(m6!d%JVG5~2HvA+s>>_tqVD>{r>bb42MKvtfR!W+qFzr5 z7*I=4bv0V9WNK$!q#RpSsS9=Pzd`u9XgJbD;f!Bgj{2sv$VEI5svP-s2hoXV_>>}D z*W;KevuP=@ArXw{khR75$4JID9;pkPr9^>VnsOTz?5%P^|JnX}dZkaax!#GbS9a>d zdpR2|@gtD!iv|#mPv%tsugp$~>|9vU*6_#C2e5ees6y@Kjyxa1B9l!`C#PX#k)6uf zh5YgtVELKNGYF#$`RzyHKCl(Q;*W@Xo%rbO!bw$ zP|t4oSi{m;uPHych=?tCZmXN20b;{!5B&Ku&G$!Dtn(dwo^?dOrDH{GDbVP*_%l|P zd=Sa?uX8k{iBYd%S%krDn9ji3;Z-Pyd!TjDLwd?;4-5OjncsC|!U*&M)(L0oI8*3> zhl><=x;_QXBJ$h_sO;Q+OK8CoOi#2Kp!EsJ57DJK!~=T=mZFXbmY5#&(Fdo2tFTw4 zf^fAECs@MXd>8QVG^edB)19PCmK0i>7ff0N^USrXe4VK-p%}49r1LDo8+n3WS2df) zN0TSr|GG7qB(m7HNdp*N1oQ}TWv=4tX%4s>!a>#G))KsCT3Y7D{~^ zK6$5Bi0s2PhyPk}WNuoQ^wm9X{pU7ZkSq=Zd5&wcRd;J!0@R06Y~nIanQARw;r2bH zaiIYlcM zN1ax6$UQQaJWGg3P5HHxC{jFONNzXjymG3w1uWiovAb0o8O1f&w8LdB;yXz%F|vC7 z_R-LLze}O}u0_H=31WzJ3B)up?@yU&)LqcIMNm?xVq<3K?PHMFHuUmUE~^Rcwypm35;ic6eOMJ?eN$2u;tN)Zw{EV zE2(8;SnZ(L5S195*(bSFYPHF2fnZlxiu3S+VR2D<@V|>VMs5DVPND3vSmZ4Y&1}Q+ zTfrER%0aNDWXaxMHMxaHjj9^#%WJ8B+PHb9N1VLaGbeh(1OQS8GnY(QYtZi4%mU4c z14Cgji%c5ngI{S()w^U7hE*t_ek$rbFoI=L?Rj-HXn5mI9RrKCp(9zuJWeQ)u##)J z1`CjK*gmWp=me!9B5H{bOW4~cEY$I}HtJWrdp{zL?FhdsP-AG!&ru!!$X=CTFAOr{ z_wtzcA<5|^13KF)`f>|cKR%T$|1cjtK2j#3<8WOCJ}qD5KKb+Ps?(wS2JEKQBk&Xq z5q{|k!SqgX;r?1+>0%8sIi+S;M}M~tb;@Y4l?W0QrCX{%``kqpOSq9KZ0{5khogP9 z+9Kwe8RVpXysoN|+T~?+FraOD19GyBJeC=d;(d(5bZ926&p_Sv-AR2E`0aIz{os2? zm6?lhS`7O5oF2eV&jyO(n!Rmtj+}WU^_P6unR|})OHSihyHgGFv?23LA_l3E6~_w% zs_v}6B}XQ6DW5hPYd)t)dfjtQ2sULXQJ#EY_YLW z3T2~ca>Oebyymgpa#7hY7)HY(t0q>2&$d-4$O?lD^Bg&0EKl_y{nK;q9WSVyX6leqIhP!aeA-qsDV1Lz~I!{yYvEp z@5pHfO%ovVn(dVTUgH9I2N-nkAr2Jd*43j*9lz-VTMaXzT~5v#Tx4R)rEhJkMByr& zu2c2b7yu;;bg}g?iUvDC$=ib;e{I*G$o=4WU{1mI@Lx}YH3m`=JX_pav#^XzaBJc~ z)aVKYtWCvppO?g*swgoA4MhdwNll< z@alBe+p>5$`L~EYPPF}H#@C}bTQ7Z086{V|iz*KJ40hf@R;XimijDX6ipG6uS?b-W zpzHx|&Puq(_Qbi1rm;R)&-OuJV8=hGmVvp6Q(qR_l%xDs;r_ZIF*C?i;MXk+jF(?l zkVz=3Gz;$~Ov{sIN2;>*dQ{&Wfx!q5#xxCihbm>E_gjVaMJIeC(t0dz%)~c{hO1an zq}zGeuvC|{FKpSM!=dl|Tg@5xF=@qo@D_R<(wt~^)6tmn%mSL@1`p#r(+@ks zr~18hvAgq`hPZ6eInz;#Ho`V1cTowdr}=FVK-J=flcWw7fc@^1=IL%Li33yUn3}i} z>Zd^f@t~_nAU0>FVc1}?J5|cVu>{}8WXkGsg?s$RGJq!eM{+Xh(`I{cbYJj2Cgk<= zkHy*>ZN@`m-!u45h*pmMOtzv~{ePc0y$XW_C`c$Y z7iqZ~a~Q_|+?1L3!Q`Qt>4q~R6*hG%N{a!s>|Ez6b!wcqscx$1Y_)zBG>Uu|cB1L) zQ(-=$%W<8v6B)vL@ds=d1VlfE5BXzWwd0;^d3y!oT|b7r{w3`q^Vv_Nu2gB4J{KqW zel9>0l{Gs@tQJ1V`pA?twIwT1Vm-g-#t*e9IE`fAiz~-EKhXD^pz^HIToW42Ch>Nu z<-qMbixroL{)&`z8Cp{i{T&ru?}i+aUV(G+(21eVkL^T57^%yvGS9#k)rK%FZA68Q z*bw!xCu`2oVa-OeCZ_APTY}iSo5wx`P?xaZ&9rp2%7mt33PAnu%pwhp-`lq)XzdYt=TR{avLI`q_8xgmiGf zp;q^=hnHPp@`CwnuHL(mrV1>dKg%CDj9e~~vRNFc9wKtvFssJ5USTJ6oA;{1XMcZN zU*s>j9#hk4)l?49L?>hns;V4#l)2R)~@ba}mU zdt|1P!Eyu7Vzr7y6TYr_on>f$szUAjlOESYN@EYDcuV;b*1t~)PAS$5{r1~5=)og% zu(}jmU!=OH^ToCW^-A#DX>rP`1L_-w*XBXyXok*%znJ>MX~Bl-bV6Ny)dBr^rG3-? z)9y5rsux7u-u>>vsYBRR$ zk`z#4Tr03Tr)jS5PQ&hyL7Zq58K}n}Q!#Vrgd=E}OiF=QIL5D?6x>AU8;v5__BqL%G_!8BGuc7-mC*0<4z9)r~ zZ;3TW4;WL_lc>j*w;W;zFp`5~7@M-glfYRuqxt{<+H#-H*)|J_LM0Qub^pehObRpF z8Hh&FsEU-RPZQ|}n@!&9>aF?ZrXX7C`Vw>v?Ey>)w9I~-pa%YmuPaaTt=zl{<9JG+ zB3k75_AGgz@tJTpcsnW76LgTnoHxf zVCtrD7&tIFAmaH1nO?frkiCsvcWM(8R6X_0!#xN++VohO7#aFT{qm#M4%B$QMxg7b zROKT-Q)377XsdFEX!CEiL>Ic9J-x4xw~u(9X-30R6-=4}N!(V~Bg9y*ofTqP5)sV+ z+P8<(D>5grn@KYrVa}&GKX#sNB+}LIXVlW<2IX3Uy93hh@G@%w*u7sy0ZaQx~={Qe9_-& z4xHn|?@w%nfbQy|{~YelCISO=W{o zVVNGv7O!uXzSGkMyU(~HvEU70q$G{z7i^GrTzXF)6%VV_i`mj&b`t};0Th{+TY0(h`~goVM{N+T2u zp_qV8DgR3WN5sV!rDk29-uN;DmaUvd(;Ghpvhk|P0C!)QW4w@IQgouW zLbbYv##jT20rXA2Ac&^ufX@j+EQLXs>J>Q6K#Vk~tZ^7b-ah$j84BOWTTd57Vw>^R z;Zwyz#^V=i+4N2-=LlO*1pEkF_m+q;GCpYwSO}f?7lERZ@vPZh_WGKRnWQQKYRdr{(Ykv&%g+u8}F z16G#}A&SbD!-v3sIK%%3ZUiNGpvL{j7yjq@|A!m@8*BJK!j1nU*!cg#7$a9gk&Hlr zfVlrjYgqob7~_9gT+_LDI+)TK+ZZ`JTbfy#I{o7sW7YJW7rBvqXY1D>!Zz^zQ#8zF zjWWE$A-&EOJ*Z_BujGmj#(R^tP@;Z#Xmrx9LR@Z>Yrf{zi<_%GYmrjYco!c=E{Cr0 z&A2BWN5J(bnuIIe3BD_&E7gD=j!~9PGgrZ9Ks`dd)t52?(%6I#8O&CgCdrs%a}Ue) zLhWJ8&?ZRs0xaCD@x&! zGL=-IPNK}Jw~oWna>`em2Y%dgg1&SACcwY$PfhM$P+LJVXLn$Naej6=@=hvKjF!jp zys+toy`2H|22K?5m+N4!@R<$$NF1&*#P+&NfAz%cKd-z=A`>}af{Wfp^BU<;1sj`0 z1wThmJ+&JNKxNaLh{j}Gzibg_+_nSZF!-_nP|tR0ZEORv;@>ZaKc*hv0Dc9sdcLqpS<$b`Q=cv%JQT)Q(CoGY__XTVkC<~7O}oI_cRG~L+9`EuH1+F!UN z^;bS|!RN@Z&^GftnJ}*Z;6+${m=LWaf@VAF)s)pqz5t?Ww`N%4_M@iSs5;aBj1+#| zC$HFABumAAX+*WtZW`JhHQgc7djMJ*Q6k(->&GGi6AVE1>(nOLTI4V z!cnP%`l%c%99GNjM0g^xse^?`HjXMWm0BFB){8wSFz8aiY8e5juX&##hZAqH;C5C%!fs4WctIJFL&hBwYiI z^NN$4ayc$wwosFMfLraI@SO=?stG|cV7B~Fmtx|2U=chkU^0sC+$N^H{K0Y1wDI0P zf=bG?b|LK%8X5QW{EyDFPPLe^O&fLsyllad$Hu0 z5?;(VI&neWrg{kYg!nJ;_+N1TpOe!60gvgNjNJbhgKd-m%S*g}(Jln}U$pf9Cn^2k zzx~f!I%6wmItx=92UDm2K+~zJa`u~?NIf4KaC50FBV(-G{vT!WeXJrdtfu!rdA<`Hc4=m)@~Q(|uU zgAM=esRAn1f+(egc%iIx?rM@v64Oc;nN0IttFH^20j-(FLv(p@k$NVo_Vy6l!ah@A zJ}Hpd7jhqR3BNrBn#)-L2PN6R1mV=vRGuA4DwgXa`Bh}x48_@V<+_y)^RKan59>LG zBX8v9SrkD2oroJEQ@Es|1e({IAOoV#A1OXLMgyXCQp>9hUWNJtrxe~|1Z@i(j@!eb*i7B*Y8o5m9;+BA;;tqvU_^X6{!v>*lX4V=ziXj*caJkvqB^=Jg?A~eP8V%{TPQD>)evF3N! zN>uB8dD@CzvFid^02ZPQ}xl25Fi~>t1`if^a+b%7GH{b(mFYOolD0;lG)P2vQknfG2O$v^eM(7h=}bxo zdXhP<6icC|c0*B&SV0Cg4K_5!KFuW@giY;}_%uXtwQ7B}8dmCC0A+pZ8;7Rpv6Tas z!oj%cH$&g{0ePllw`T-fCqB34!uh6B$!TQO}DXUDXY$d&HyLew6l^$TIqyLUR+IB#1@D9L?qjO*5pp`mWM(E_Nq>$@7 zu$Zd@Vm^>nwKgDpHQL>N*ST`|nMytLq%=k)k1D>D(sZWz(f@a%V=IPLIt$)#mG8(ysh~#(dLu@0wS8_`!FEy!V zp>g`eX69J2VksK#OYDXs9B9R>8o1g-fh~I+lvnO1fty5$x*QmGdz@;nPS zFRw`uFqX6Zsm>%Z-(LSEdRHhjD?N2BT`-);DQfTxVxd#mQ(1Hz-^&Lym{iEibOX)w z?ysx%qesS*tdBmC?F60Y0`tQq(I^?T_?I?>4x1)xGBb1Hny-7O@V-i9c_^)iN!2t( z7&Wu@AUHV7!dVarLgk)-F0-17rYV>u>&ONP!B`AuDu!CX3AH`Q!pqdvO*Q+#hFcqc zRe@jO&mj2c1xNT;axll?e#LZ!L?%+Ln2T}EbCY;lsXmmnlHR2Aq;p4eA)MSvpG@ay ztF+BjAWI>zTYk9u&B`s-1x~x$a(y&d|KnTl8o|dmvmRt?_=QZ??C zm(ZmzfqqwNuzm6#NAc33RF!FZKB9<%wKM0%L*W|2?)6_$f>;(e_9c7wx)kyt3`;&EoktYCdiAIUioO4%B1KvFy}cHuRLbv_k4g z>qfd=0Dlx=IvY^;tf)&HBazSxoY)-1k+U;X!v^}+L;Qt$Msnkxef>P&_MN`#{qqfG z1g0=Cr(hJ&qrp4ToW5~ZW+H;WBE`fLv`w?;hLSNYgvW{-Geu+g%8WpYNYI|Vn-Gj9 z!Q}9}AlTUq`9GLP;}GW=gDn(%XY9e)6i2-}&1Y`!LS?ygVh|M3<0nc8SKQ)URI+Wq zb;E-jd0Pp9RZZ1MWMi2TKIsauzeX@b=6%1}6`%C^dc+r^(0SZG}Zge7z<^dpCsL?DBUUORGh+N`t8yo`9@m_G=0m+{F&6hi7#Z2(4`p(3I7cVbD zikT}*eBQ+i?EzgtUVUPI-o(deIG$gvXSB>Kwg$bb1(-~9)2E7tORW)WZ@?vW*`9)4 z01tYk6!^=&KfWMJsO)E$SM;Kb1(N{v?+m1Xlq!!C4ztx?XR)v8`yhQUAT4*5q|znd z`Kf=hMC^}~!jm2Pp5FG>*pq>B=6QR_JU_^LOLbjnNF`&huk8&x?ey)Ql_&!5x)QwO+WnDmQM(HVY$E@=*O&hD> z6K1;&v`DaF*Q1yq;fuJtGey;0C4~wn8ByDFC^$JbI9@9pNp@oPmE?oBp88ANC3Y+C ztl4Ge^4-+3TlQxOiDWIamHchg(u&a|9JzdGF2y5xj&)8}H9&%v_ct|EQH%v;3!pV>$)h~0XUb>O%%pd-u$%IYqtK7>h4Yb|h z!vt8etUYNc*}##WwPwW!nuCYbVxV&!TiSZS%UF3Lts&|6;xc@j?_Z!Ri}Nccha3v6 zc^z2Ah>7EbJPm@a*IKHlsIFdczKrXO^P3RJ+oU5??$1)-nP++W#Bw$B2FiHLOflA% z8^sv@V1D)IS2uPYThH3npdrem8AzNrd5-Pr>eYV7*h)A*iw0BrION&!{jFa zg>*uHc|U1CNoRf;u0P{R$Ckt=u5r|2Y9%sDi=heNixbIzOQ^PL8^G@OU_mRvE3&M? zlw>H8PpO&Y^KC*-j!`;5>>B?RY`x)5Wx#uj*9g`lQ7(dHfT+#2X{icR@dKFH?ZCao z_iz%Z;uf?O>E{EMQWsFPfY+l^WmNkoxt5OcN*By5rJX{}rV3Ona|6bKU=A}8-tm8n zS$f<6#r)$SH8_+l3U{gTYM7!Yd}Q*Do0xX3C|bRU)DLGM=mif1*wV2eB2Alhr1YV< zPH8oSmP#OXFOtxqyou2ltJ_eKef2V#e@r}m_bwJ;yX;jy7nJxBe7~efk-N0@8vxPN64?uai3P!w6OzI>5;LSet5yvZt<)keh@;6^ zc?h)G7~fxKGH|eYq;%KA@U1R=VcI8GPLRd(kAAOXx9>)rUypA9L+;lLJI3xWA3k2a z&J^JdoO6L?t4@Zo?Is#^r5a>M#$0vrszuAW;HDX8(tV@Z2Wp=_qB3Ci$3qh(CMiKxr^xyf>I@&H-Qv#a zVHi?WE?wQZ`4d@|pnFMr0M>8H2wBE|KF#4G7qAKZVTWTb_xm?4pKI~I2#ao;IQ(LM z?HY(1`H!M~-!pZ_EUtCg-<`{6?O#kG`+P|Us2A7nGM=}?IGvXL9(2#YDCxfnI~RN( z*3XzEtA7mCu7$0x+UgUmTz&h~=zE@x2uXQ`rXJqYT>Q8|vs~VQ%|5?|#LE=UG5TG} z|8W9x@+h2VTaf7*4o?OXLHjcv`maZbKs!cPf9>xc-6CTJ$z(HOceYD-y*W%189hGY zSvH;74tO?nko*>vSXaNk;c zXSQLloOm<>7l9#RFYpvMdWl&uM}xDgpMq4w6|hV(YleGvF;W8A4emM2&lTlCiR%D; z*H1oJ)_-|W(6R_$*eSMv6j2!|6T6#lxC8epy{4E+JaqG3BxVPbYdLa2SfE0b`TiNUW%7S}B(Ga^{-&B}67UKmkkuq`flvd9%9xKmhmZkhD=@6A5;* zzIbzfe(thn#4d9{jC;JEvYmQdvv%cjf5wmZ>v;RqO@H`}NCv=3HzdS?iK&CI8_5lRvc0%u$~|M{KcUjzJCcCjzDz4FgEj z12ewM!0a{DU%3=nF(&xsTPC>=7#R@U(ZDmP0V0zQZJTjITNEcSdm$3j?aY)Uv0EdA}$BSWd>;pw0t3KpIP)^+L7@Dif1^ z;3C>foNgu^RH{b(;Ugq9nDPr5Na{FTfWI4Z#(*_ii&ro#x4i-`7y{s#7lj}keG<(m z1)2QD$X+c}DrRg%B*3^cK}&t(g?J7m1V`JRk`Mf9x*yZ}x{PS8XaeJ3?|TiGp0$bv*{8c$8s;u(<`*i?2_qE=l9$Lp-Hpho zJQfrOo(I#ckxlW8p4;rTP~4X3!vs>^jG2~x(3Esk7>oW+O^6oq>;_{Qv{5uXv#tpI z4)%B*=MUZsL0K}{m#T+3J*+Kyk*e>PN`mi2Yh&o|f1dCrUc8Z`JCjn}+37l(!vmEs zH#=?EGZp#xzmhY0<6gu4AcBtTAf`{=hD96Uvm32Jzuk9xy7;-eJa+r8f4t^<_<3#& z2)li~zhz!3YInXb_O2%8p9Z?}>-HBv>OKx0KhM54uU&77ygi(J7JN^8`#3p2PX`pX zFNPkP50mr%?mQQM*%|cm@p1BST|d9CN^D18uPeP=-mYFOChOlE$+8i3jvy1}_X(&R zro!jt=;!oZEPfPU-%V(>D<2#b{2+Sme%aGj!FCH=^z`k;*Tu{4M3(v3cl9h<13kIk z+!Ai91i;ZY_^%)E&L-#uDMM^o%>rh(nJGFQ{MrEs{?~NJbIRBR0h3dnE&BF)?glO9 z&rHz}`2pvjx+dpcSTyvu1}VMYP$TsZYu6T*D#{*r%sOlRX`4VBK;c^4vJqTf(AEX| z7gh~3kT<)}$cu6E@4pHv1l3doEcKJT&|0(-WD|)8${FFVuK8&#Z#q}6NC6;EIu!)d zR)uNGJ!VX-S#j~d_lR{HU!1Y@ZLBK*iGqaFi@<6)KmpPTDJ3-=LS|@`cuJQ10^E>u z2)|9zf-M}vWwC2A&TUXo`%ZznqaQR;e6?Kq0%ApQys~{;dWBw!Id2Y|LGEC^m6IdO zrL;zeV0#_G3T38_xAjuYgm33y<+xPbT*Ev zhh_(|x|W5ZVMYK?E8L%Z91vs!6rQsNW1wp1jQ0P*pt7b5(42Gg)}0F$3;r1^`?Mg~ z5etQ23?P5S>9-#|Qm;08QCt*d#am$yTrT;FSr#L=L)Zy0n`%N%{tRSgD50s~%`QAW zIB%A)GQUH65`Ki^^;Q)H&&m@VD`)b*XBCvWqdE<|wFNFg56&7zPEFJ>lxKzO`E3o- zOG{m7G@q3i^B!y&r*t^~lhVHO{deeU*Fj18Zv<@H)8H(4W!@ zCMaHZ4Esw;6#grw0{x4lm@IT6Nb08hK@vRhYq(O@d+Sm<+21og7$UZ2xjKXmR0OCk zc4w7*1t>NMxK1^t32Kb^&*ET9r|gbhjI#n#4COIq3Yd}n*#a1kD6(k;91`4g)CLd% zgg+PKeSWez45Qx#8|owY1-ta)z*3JVKIUd(P zxx?Hv%Ef&OhHUM<*+63#$eplYx9zMfQZP`%QjNUmAi!0t*XlSdw_m&hQ-I4ZC{J>cd&c?s)- zc$5WO?HTr3{cH@G2uD~(<-O?82Xvv&p}$1VqKhGqLgF|+0YfRX$O7~Ba|;TOUOcw@ zXC5MW%fK)yb{DJ5{h6F>XNfAHk2lFooEF9&pU_)GRC2vU^-!OE@%Kgpv?a-V* z1Tl6VAA=HMAff^x)QhxVP+{=?9Sjcs_4AtYA^IpOV45e+LjEnf@KO$+sBUC{2Q^!) z;ShreKlUO5fvZh9eLnChg?1CZv|ksu*$S zaAFzX6TMJ8V{Ntzb2u-Mm4(nQ*5^5D*;T#1Nf2%oRQv@9C4M<&MHE<75oZUnq4yvo zKn^>W2ae#{p7Cj{O(k^PX@LphDI=ud!N9NQCF++H$=7r;e6yF(N4+*-OkMgqB#o*; z(H{GAQv=q&OpfQ$H@1TyHp4bc5yth5&rt_eM0Kb`e#G4|p`4;Ez#Qki_6?_(w!Cru zxjvHJ52pm?cN+=oBg{O+j>#&+3krwU4q-vOHYhWSj?6*Yn)jyT?>Bz7d2Q=dhG0Lr zrLUNg*-_mnVuqwRaHjgwzGY1Z*;RLZ^~9a*|JG?Xw0+68-nA!C#hZh=>W|1E+jh2e z%2lkQ@DPHrsNl9W!pgJ_mI&@TE;2<@fGN2|%Zw$*M$eFBdeIAe@ z2o~O9)tpjX@_N_ASvxjku(*ydFm8cOEkBkDJ;e?IySzTcQp)_;7z=~ECC5r7KIFUV z`gf|aW^5C(F~hwEuHm;do*Z_~-G0zvGgxGzn5lu69ZsMlL#fLdF|(H`KPTX%gvuGrt*X ztD={I>LdTvIX~QMS8o-%WHILYA}ehiCqcfOx`j_rm$tI(!$d=YsVJgM=s#i!py_PC zL$&qg>z5IQb$Qw6;hXjD_rM}-L6$2qm<>RC9_FY-oO$n}ZV41}QIy?Tuwd+$Bz^_^ z%7khh0HaSEeEi%Ub)P>a1LP-UQALi3K&+620I}T81aCGC3--yxX@m$HoY`wd z2p9w*a(h8Wc_W)sZBse9udtQi2b!J2aQm)U{z(&H2;n8m)@iwBSDCBZaO=7cBBj{; z?c@#!AJ^A>bJz%9-kF3MxKPxMX`bq+FIrdbGErS%R9%OMF%%%PX-c50kwWxhn3h4m zeqW#{Zp~|jQ;bALF%2Zqh$b(?;%2%WVS&L9@pS9;_WXS6N)OL9nPp8SN+EvZ*j4;x zqcOGF^4noD4{5k;G5VRyQl_tUIQe1}z>3>uAl?e%!koL<#uoO7Tsn>&G;~0v$l>kf z`h*r7;G7VG75A%^qE8XsSsR(COm{#h3pao!=~*@MM+3U*pw+=gRuV^35O#@taO*I? zs55SW5((VkJV@bhkIPY3Fr9~-+j9gbHO_)?obmjh`H+@p3k+Ha#OUgHZC^`)Umk78 zm?~O&607$IvF2}^lj}9xuRg%GjIUgFSBmL-Kz`QP{MK7GB6g-;r0NXmYu(R~yoywC zS$hcft(M|?fjWm!BykXXxE>bV%0TQKV7oQ(FDTO=Qc{-*Ap3nN@B z^TT7-tL+4XF*}La4k3!~Z@0iJ0w_&M#O10LVVA5KKSABlOs#_m#6ER}0?7tp@%qh* z@wpF1{W$~nHb%0Pm8X;A{etP@?Stzb4ql4!UXGY-bP)WAARmevt*kS{_r4))(h~L$)`CWrUjZtx zc=d-&FodQ3Y(Fm-%gd|P^3|T``l0r{SzXq*a0b4|UipD*43{X;aJ2)Ud?(*TR{({eARWiaNs-0ngP4_0)KfPY*G5kR` zMyTpMkk3h5`GwiXLIE9GG$VhH7GGillT6H-Z z6$E%KRq|vb&jPi`&TaW7s#DBBZV?)>{nLKuCF4^cr$NogsvP@q5wC`%4uD@48DE_% z(H`Kr4dg2MBLo+km9pQYCXZEHPH8Rp0s4b5KkcCWHxUwpZqMQll z>KzMfhOPRlmP=QAt+93Kw1MzW#cT{|9l!gqvz2#1a5|f=g29>aM-M2~>REJt!83Xa zCC$W!g^>1RjCT9NQv>psDy(ai$6By`9`-qvSGNW)@^Cu6|Hv1sU-G2 zVu-eC&g;+)9qXm*4A&ubnh-~Vy~l(a1d?yCw~Xws;V=iQ%Pp8`!M~r_oh5i~5erMc zQ$md@XhLSo6=Ens>7v{s-h`xw+7X+5Y_5a1#IY!6!c3VESZQIs~ZQHhO+qP{x zCpocg^Tf83&i~%gqx-(yxBLB2Uusl6qjuHa&sw$Doby+DT4gc6$@e{4@lYgHg1?pH z6eP;0*>xD?;k$pXK1Vl&)uUqzJtB;8VuQX5CMcjla*-3-hHmvIxM@aG(Bw1gxu~c@PxKroB&A>rqX>9aTONp9)Z=pFhVX2#k?6p`S2THTvnzupBl3 z2;nb80nk2ZegU^1`4scTye)!!U!?$Js(xsIVQD%d-w^-6)clx`dF~5St2Ocrk_s(` z|8_s2XkLI(6KoR*{&{~a(Iaa>lmTzpZYusu*9vsd!n!L8+)QhMFkfJkxSC`U6|^Ob zFY{!JWhenARcY_0zo#di#)O@LGcEH4R#8s^g4<&SmI)61RI}1)F*&Seloo|rBZaR; zS}VqAW@Fp5BupR|Yo1u;1mBV41hE9GWWfhP(zg+2(2C*=H$ZW{;|hA!tjb zBmPB_=w?uNomZ!`n9*L4hDHbYr$;3fLOB}^JT;XV*G2&CpiM_v4<56|q1AeCN|~to z?O%0r)s@!@iqCJt))gA2 z^bwR@q1>^kA0a3!o|&its(y^FIoUFIy=ypXS^9S;6;NgbpH!dvVKY!= zGog~hR1KAKly&z_37G}=aMj9;Y)Jc3!W}J@R@AsweWMB-zQ>5{59H7j)Mw%@)PR~v z$%j;=rh9hEGLvMgloWxP=ZlGl<74bh8J<;TQmb^I(=a}wO&f^q+6@PJ(*VKh?)e3g2q1luE@8X=mmg1L8F9)=~e9<7S+Eo z4dM?4$EED8`O__B6qz#OC(Q{EItJ@IPpfzi=04{W#y%rhA_`7LigSF|usk2abH8d` zrDC|a>_hXK>%$~DC#pXPpL|OM`DO@W?D52gYoHNAnAwciZGqzls}ENdmiwasU&)_` z;WR*fcT*UK5n8tZZ{k5YB*+1JKkfTdAj+%_)yugE3=f0NNvVe3N!v*y* z<>yo{Rqk@npC2huf>i=u)Cch#a62EEk161E??n`75CtAqxlSwW8)|$(Tv8iieSi0q zDcL(@XsCQVBze+eWpAaYiA9}MRE)F;dURWZJFrac zcr$EmZZlC{I=obqVsrMMh<-3&weC&Bi|SovC}I_%Q_sOiHlGfLFBW%h8YowB#?oVV zi;Pa{Ku|~>nACLP&S>}ukL32)|4Y60l}eH!OC1{eUTN~?Xs`UWKqD0V zY{!C%X>qO^a3*u$n=`7(>bJ{XCYF{0HQHJ~Q}WW(UC1~p2`KFlT4>f^jmm24 z6yzlnnK!n~Ph|OvGnh)I(Bmw{{)<;2mb5M)5nT1L0i0U(wZM}pB;{;Mxp(0V0}8jG z$r}|R2{~m!vPWr&M2y(yQqqHpe0Nbyu5+X<({w4!Iyy#Z+lb<4ElQl&tw8ejsxDSJ zfr)_ov>QVgTM#LdTHfeH6uy2|TAm2st04%cynu>f;8u;DJPP)}V@})Mjn8gmi)X9% zhYeT*{mNursoqvZx|XmaB(FW!Mx|3@33mERTV1;I;k5^}&MHU*U$?$EhrC8Rcz6`= z>H8opt|Q@sRjGi#V2X7NecZ$4)AMHCYActqNC0l1DsgacBtQqs z)O6PVP<+@}=7nc~F0AdTgNe=*&=Y^Tu9=r$TATb_tJe9~@2BR6Yo63RVA0r2ilf;W z2z~vZ!R@ID36n7l);52a8^}4+rvU)$!avm%CPhsdlY<0ZZSnn4VLM-gOB@60csir1 zO|IgT7cx3y09PcorU}OHnSJjl8fc`;#AZ9{BEwd=EPlDFg}>1fGi5hEuci!g&*e(s z21&V)eRzq&4JRRP^9Ml+u@GA7l5?))2$XW4g{_399E}Y+czc4IQ<^cyo<~WHmZD~# zgeXE5CLuS5W;PI@K3L_b)Y`yeGOyEfPQk!r}bV!dDm=Gc7b2rmV}Hq_(G)H2KFQ_acML zzKHa&ls#^8pP}aH`PB>g+eKyq-uecrDCDe`CwDZc^XKX-R)Y-kGp)txU^zansF8UEYT^HI>chTri4-3ls~~Kjz=gNd!;A$+3WQ%D7A0K zm}_JZ8e07u9rMvq+|v8UA+?minj9dQQ@aA(?RHDdLZUE4@m(udy)O3LI+5fqlAA}G z+FK@!-G~!csu=1QowKw6+24g--&JdaTvCC%D{cE(38-KY1vTzcpVWeTQL1DQuxFC~ z2!Ty*=Ic%1KeB`yoiRqvb*SOG<~qgEJKgQz)GF&O3^Mp&qea6ZiXqB~YjDOBZ_#4j zH-`K;z@taH-zR^ib)^L_gD-^1RWf?9!bQb*l4unqIypJsvIE3NtVR)*i#SaJCK!we zbc-P91|aSje2zQ?q$}PAhqxOn5V!ftmnKY+h6_L`vt_mLiTT^;b(hkM{7aktJ86rs zF4oe5W=Fm0uDPt2a5`^vNLHH>#yS^jp2l%cEA#Ft*rz}}dP+3og4B-aJFI{mqO-qhpNCKpNNd$pD~L2-CjxB!f(U^Q>PaB6xn1jhPP;5TwU;Lq_W_p=km z6tc5>O&8u0Uay>iI+r*miH4~)=pPSHLmuFI<$5(kTNX3kCRCIVkBT2bTMp2_?J%*h{fYFqHL#{N{YUX` zlc->|!GJKb^GON!w2Q&rWr8xF${ho@>_S=XLv2EF$GL2n$Gugdf$@6vYwdJgUtcQK z`}@z8FZp={sAecC$OooQugJEeuC|$m&VU)v9qbXzGB}L@*GPP>!G!}ql65blw{%0! z=%|`Yx6AyHjLD}w`6YaAsprDG%%`KTf=~IhC7kQ}=XNI^wbjlRE&a^Sjt(7tBU>Ws zv4jsOaK=}aonhS0EK3{w^ZAf@G4-w+*lZDilzsD3Nbo>2WEpKu*&$W=SrXo@J;5(Z zsnMe5iQluc#OlPYL7-^l6;>_<8SD^MOHg-NkDpU-jPximgZwuS+#wR^A9xHJCsieN zW}Z3#~0})1B(-9$~jQT z&)@7^zjV#~0RF2sB(&+$h5kpmru3s+qy6`^A$Iovz;gfj&2vg3m zzDK11t{C{h?6qrA48dB0(t7jAu)h_0S7R`W7*102)|46^!V{yLpKP9ViZq@Sj%KD~ zsO3N~EpHdeBBjkS95lmGiMpF0Y1&fAmXn2yYrlmDEls?b0hbh39ON!LgAzSBV~eLT z+>T6OLun|~wt>HN-3WNqol*mwbCGhS@b5;XZdj@ij&F zsjYi?Zh89*X*}it*4xWOS>KG4n{qmhls2v~Q>vC#Zx0nCrQp%>$x0g^Axlc+(;T=w zS^4Q9cKCD3@JhVOO_k;mg`_ryZm81d7tW@1sM`)NyxsNQvE0pP5>XX4m#gXDxJ!_s zO`6@4H!RtSTLBnfY`9RhdVM0<`U|lMQo6rIY0&NQW^<_JRg4uqPy?LoQP%6Rf0>%!UZlF}>@!C#R=wCw(6{av+I~_V%Fwr7xUU{e z)3&axJu&xQ*F4JDd5qAzC*-R}Lu4W|R$>cxdYomu%xK?syt)ED0W6nRSw&Uo1}*y? zH)*k(ZOMO5Jvy@W(-0cl#s}yPVmTxxMiVk1d>aN2by{_BFASix0I+prOxgFLnVo{x znCvuO9Qvrc!qo-f9Iv?1HsU#GvOJlH@g=16_IU# zW7`TZ%Mgba!{TxT06864luW zL-q`tTD8jd?B?Xv3~B<@n7vS^-Mp&MDGeqqqAbm?w^rU5Z~%Twb7-2;naV?R8FBQ4 znlG5mRV{4jI)DEu#u6~4_m-kd@56{3EXh4XuANoj-RG^bGxZ>p0gsx?Fa|1xIFyR$ z+?^awM4pwx7JJ%Ga+05}Wms zFqX)jtY>aL6BtPw5LJ1tEy06s2eoLMV7q=UdY6ghTKn@ibS;}LP3{>zil1_#w!ETVBFl#t9rwdL6n`Yjwamm|#vSv5Fk)aj0Be;yJX(#4lqQ1V(?Od?R0^^2U<-rG5nCQw{@}6nH z+Q2gY^LX0z;;;3h*ZN}6%O?cXT&$v6@I8pOi<}asiPvBBVl?U`(kU2F`0t2qCN4cZ z$4d5=$xg?!Z&u?zMj?LFq9H@8?Q6~{ z!Z>FffZzX84kPRVM`3zdJ% zS*po(i|Ll+4{uTXh*ftcY;gUhj&MW>V?m3yra32&d@M`kN%SiAe$wACQ=T8HC`P+@&0yO*w;&pb>6Fk2UKvTF&TuaQHzeX36Sd|m-F<7=dVqz_2f>mge? z|Hf5D4ne~EhBnm)0IQw8_;BXgzH7e`G%q7_B3u}FSAn;kmyG4rULZa$q24~4d%)*i z^*+!9bMme9o2rLHzNjI;tv3-c7vV=}ToO_9XhN`v+q%RpkYqg)*u8si?Gm3LC{WK| zGd}AcIykL9%a?Kck6WW~=-!-zu((fO#jMP6@8e}yj;ja9Pybl2rGd}>9s*i#O1y50 ztEjqdly6i&gW=jNsOhZCzi1IPg-l4RX_5lNotgS(#j{tZW`0&*$Oa2lTJ#DfN$wzo%nKMX!{34ai?F zKPDpzDYGILHSHrBY>A$6QR@LkR3B>3zRq2Fii}|@j_XIm1av6h2LN5kvDUhTlmIUe z>JTK$uKl_Y@1cDWrvs+ACYS!GqiH{pOm?-MNR^5G&e?Lkx_k8!B6@c7+o=oexTS0F zDvRF-YIQwzlK#&dhtkH^H@-B>v)8w}uPPniRC19s6f>!`dH2Jr{eS*sv|SL8PAg9g zzpJFS)>4zH4E3|AUA$9MhTuH7+5;wjx5$#h2Z>XAv?rb_j*^&YAU;SPR;SanKlEwP z7~?$@wRs+I_S>ktZuw))QxP^riXsm0hf1+ca4fnLFwZF;tHQ^l;SZj{`wleixMwqt znX}TMDE+RJ5p`@yi-206;+ z?F5`h*aGR$ddv-7DLD<$F4NiE4W}|h9C`>j?#N41?@rr-n#FG+ntGMk2~MfYZmeMT zBup85O1-bB%T{j0b$uk*o0QwywCdc z`-&O$Vaq3kqAyR`N72SOi&N|v05#gG&k$rmnF3qXNTR|MYjUTqk6HN#pzTP#JAMN~ zg{dr<4UznsM4+Ta0uxv`%Oof5+{N;1gw5#oFlP3Pb+az^U-vUxiGB)rU=TnY_j-21 znIMCKrpy(xDS{+eBcl*G!2tdFdY}^T!bqPLQQoA@v5sXDo&bd1PkZ|vZti?Ih!E@I z7|COO%rPn8g5Sh`yr_46|Hm`7(qxNsDZugeH%`mTPIo1cy2EP&>Vt1_;SM|xe(l8 z#gmF!b(n~~(vGe^+wDP=Njpp;tlu>&<(SWsk*H}@hsNtqCL0WPZ(U_TII$<8ChClf z9y?ptbfG(8x*=w4MndNJ-(x&Dk>EP{dpO?|)tgC5$ij(<%=F65N!MF8zf(*?`F2lW zDAM3|Uts2;P#`ZS)X-N@gQJLN809Wb_iSf8#iy*Ln#K6SXK+(3rc@V?p^dOYSnH~7 zZ<}?5s&rbOc_LADRv%nV#Ev~N&vfiv=tzQVp(S6y|6&eqTKNnlX39K*ahPg^Uh=W} z=xoic5@yT8Dil_vMzFfA0{8ff_Nh>9EGc~-U~5^QRy$pE-yf-Mp(TT+CmJ&hQO?HaJq3=#utinA4bp5sBKKmgwPiw9#?5sqc4 zkmoCB#7Z$`pcGN~28{iXOr#t(>=0|_o)k^jGN7DC5?Gxnnn=yxD+6IAzGMX_UC4AE z8^tr;NWqJ@fYXzDv~I&p(wK?@6ZUwV$_d3GBPc!j*6ld<2{eBc8xJoWH0T(83W2d_h~xy$B-oJFwx0e-_*tZ+F3t`H zfMhG&o}T)18ep^0ooW;6g(%~4!Y<#D#Sd)^opFFeeb+s*NKf@?q1~7rn;hQcz-XG4 z*t}j+`~Cy1Qq%@B^-R+uBb?atmfa|!CT&q4i(;b=L%nOI(2NG&2O%gPXQNR<;804o zTVVrXUK0c8VI-4gNGq6CtTWgEEX#mDV=n&EtG923zN5f>i z-2!E~XPIF&%UEugToG`R4Ua*wg0RRe1m;}B6%~bS@H#N|F~t4gcE@HxT6KA(y^O5L zEwtu1gvu1?ViFl=P8zOW%#m&#dr%Ytk8F3(r%#ft!rJl~(*tXz`^{DnGfOrqd!fc* zc}}dL$Up^B{Hqgt=o&|36iFl*j$a<^f(Ld6g#Pe9GGB6(Xi`9opRH%noXoI!a!|bq zM@d(?rUHzswsrt3GfQY$rvF+b&t(0wI<8ua84B!K1C=MxjOl$+Ks6ib?0PrrpZ zdKn5_aht53vCR;yG@CGupv0Pp!N#*}>5806DJTsPDEgGi_b`l2rJ<9 zDU59&3?+9~j!Rk}u2$DMa3i{Y0=VE(_R5{mVgUcl5HfV` zFzA>sX69YdYmLtWr9XSzT7b3$u7LNBTpi4A2R07`P-6dF2>wH&Cjw3IVn z-%IaSkTBNwNwp+S&{~vq-t`CC_(Ma8XC8^s;!RtCoKBfDsBK#-1NmI9s>E;8b!9%W zg1Tk3Q{+~b*;`tP2I5OIpU<=9OMF`*zO3#`WR)Jj)%K^gG`jQh8~DH8jH}Jl5!*rs z01%V`03iH-wTSfpbcR1YVYjxI+J<=Jcb?pwfs?AE;UG06=I=?EBnG$i0T5Yz*BPA9 z7L$q?*3rZ|k^_5G~(I^_I$j83*n!Jd; zS-m#}LS_eoO+&21{W?F?hYe~k&wagbq$Cj}6ot%kfv`0fJ($l6PsSvPgy$g*J?#l$ zQ{M!`kI&3rInE*Y1&_V$w_CwNIpaokI{)Si(2{;PLZB;U^t(2)+Jw{eYZzeK)B7NUMoP?=W)sG-558fT$ztqNroV3%` zdGd(JS|{}FS+C&16al3ahDcR(^cCuhTTCY(%{RY;gE|65Yg=XqJqvFm&k47e8Lfx0 z&&(6iULDP6y}h0?0iI8qsBU@$;E#Z~Y!`);ppzDSIC44Me%cvUso8e7XX_c%;QU#% z1mQ-fhZAlLHxk8~?K}7Ev(iwX$ljS6w#beO3IcAhb#2lWpjU{iA4aS1s~Z96;G8A} z3U#7S9dltEYFnwZF=eOF{M8v<>#h`h0i|)|8F27H(br+}#gU5YU~X9lrnLZqn@RIv zArDs(Vbdp8lLm80B3Zl^NBw7VA^KtR&7R_3Z{8kp;*nQ9ZEiyFw8()lx zkH2lT=&J`DZ$nsls^ws`M=6|W%Ut@DjKlu-%$8{OTLDaWi#nPigekmnu3qsyvIlj9 z5z&o#g$aS987;9ku^x$94TE|QdW7NaESgvwU4~84^TzF&8k5Q8?CtL_${M9W( zuxQS!8&SAYx|y%St{@2#*Alo91H(+|rA0o~$c=dt7b=3*7cH5Qeu-rJBt zMHazfB6@)$b&b395s*f_31*zN2iZuR02m`d@>klL4a#VO#w-CB)vpf{lK2Oc169)w zyV)<+=Q=5vXBXm6lf^>%zZp9GqmWw+*{B9U_Z4A@H6Gpb0E;A~0Krr>T|@IdPm^85OP+4F?ez zeS_b19Jued;=Qtx^MPuHz7i9@`cNqebCtb-%6H^{)ov2&%g$~rkUd?pk~@0bwhHX*@_vSWMO43_ zJ|9$c0_zQLbv$4XFE2ZdiEfvUJ`+SGW|lgqpi>Jr&fE0XM5(Eqjk`)_ZA9CnE&mL1 zi<>z?Jn|J9uCx7C+xgXueC?yX@kJ9^17mToumh08902aj zpRoW?!}Nj!Zh*^}g`FS_cGLiuiEK4K>@AeMNTDch%|#lbx-b97J9fwQF|CeZ5@nb) zUwgw_E>|14zQSNdo}?m~s2p^7x?BI;;PVR7G(LQFm}k1Y?y_;N^6XpkQORbw13!yW zMLY6_R^=&PgzzJTl?lDv@S4fgQ!8L%U+zJQxxCJIdDO`p_ZD`wK0GRJv?{V-!F6JTw^R zblxmE0^c3Mm-M=aA*_Kgqr;TtG03D=h1_omKk~Z*fmu~_Zf5$5z3X#1*KMN&ml8=O+4KfOBRUvM$}C0j8OjAPG{{NMjY-nWV92_`{`I@e z8oP3a*e6I*6udJM#55D*$4iPGh-<{x-T*1qI)6H{;B#x_+&x;HKVgwcH^!UU?>NjV zY6?Jur)dO5JziCTs~HWya(f2=2w(Q|4?2@>i+p)cP1p_!bVP?Dag`*f)q)qBQGG8; zg|$WU8ZNVnLHZ9Uf6$xE5q*(7sp%!sY%z4#`RLMMt<`` z)jiDHK3$@Nd4gg@E+i|wW*>KT3-A%gm9`Aecq5hn_EQl?WZ2R%x7!prNI!Pac@PPU zG&B$_5KG%OWaFDL(Xx$Ja~mo4yGK3fB}q3L`Y|`c2uvJtJK=VKlhZN(!|qOL8x`Fe zI^(dc3Ab3UrZh1WlM)E4e<7&V8h;v7EW2%@Go(lbAuv8g_QnI4t$oMib~)v};FewND8l<3Crc<$d*6EyBp^Ajz-HO#AFY`Ay7_#8;&J2}WbAftY2-2jEqDMwJpop(u5D;;ee;8KKX!cNRJ?9K)n<>Bx!*l576GY^kgtBJ+8IGekF{jy#>e*ruPz==k5*8Y~ zy?V#>e&4J5&+bzJo%yu-_g2R_Rtey1q+O`)12_4hW@l{C4at!1&~D-OOYsdCKN(jg zv$k!zT+oK8)5#Ka*W0docyI-IA^Ym{e5ON&;|L?r-vod?<0%Ek)bMYs-Z*>dRfKfa ztuATID5m2GscL)Wi!-ag!y|aM6G0riA+*!efaoM?qsl2b@o*raw4OK2_3=_Qnz8gg zDLjI=8~VC1z)?d+-V{SBLniB@aBZ1AzNA2%a+6X>1@p#%R_HaRn|{G+$Y;zO7)uMD zSBN8l3t50~MJsINyT{~TUyognO}x9Jd0@ci0)bK;gfa?Xb~Om}IH11{D{ifP&;9u$MoTM4IU1?YQ9^&0{~1h^Cu|YoBxbV;4@aL|JxbA-HBuyqtTQT5KLY z_S>8Z5jtkqw*nvUwl_H-O3i!W*{at8SWg4J=wyB+&yaM|+3~PmpY>t4bd~Dg%Tab* z5H}VhO07`ZB^Jt0J23VwKw<~Lz$vrqtZGINsl;jyq`WRf@myl8Bd%#WPuNnw?yy`D zCvMZ{NUrJuW{2VzOYW^J*fUu_6f0#*p@ra-?>+QL<)od10Bh_#f+asvM=8YUlrjf` z5^)$NXK{mpHk&X4q)pl1L)Ck&y&8f*6RhpZREz~j!lrQxo#?2;4=PE2G=R`0q9Qvn zCow%=Xq<6iHMi;fDUENYo?@y6q!nn&Cl`&&yiIA@D$P-g2|$}tG^~r!9w&`1X&1N! zSMYbODN4RrdKz+9uvY;?4ii*zX$?x>5?HINHWJLagPt$jn7Jjn_=_YW+afUZ_d3H8 zE}MwRGamUa=}4Yqx~=~-iy;tIM49oP_w~|72M5&_Yx9qA6Gb~AQ~cJ+U#==KTVCwm zL7sO*O_Y0YKc{=F+wY~I#@d;8dHHQ(Kz?2F$!9BW&ZPVtkyg}%S*4r+9h^|U{h zEq!M`X~>UvSeKinZM)^l@Z&=BWW(~};P`TJ{J74dE^BffU!STt8YqxuO1}(6{B5wS za~t+a9=Y+VSpz{jx2j4)S;qXt7qT+)wkU?B#<}X&G#KPAB0tkXkiU#M z(M_VNbcP+jj<`>! zBKlSaW850KFpfcoh#2sH%q*I=EA%+z%rcN4F$|7>gFkzhU=dXppR;M+0RgFc= zMv1GH-`La(zIk1tU;%_!s(5HABtuayIldc&!EAS#Fo0n&b)8VJ)&b3gD^n6xc3L*g zs>i8fSBQj62gx`oNAaU+>TnW_2 zQN0}N!R%*C$icK2kV^{Z?IEYr5{bU`_d%3)mZIs13%E?I%}mQ*0=gY{A(TmyF~Tdm z2Wt)|zZjkH8WTohrNC)uRx}tofI?dUpTlrS1#J+C!*FLAT0V0(SAvAO43GX1*riBW zBz9?*ErWE<_x2?o>XRZY$kAs5p@XsS6d6Bu=zS4A(_SdKxDcnX-py|fO zqjqS;fX1YsqQ7SiCq(x+W=1%8e=85&beOg8hqJe@!`mx+?Y?d4a7DlwW;dmvltJ<% zg}_y>9yXGx5F6Md)U;%0aX_9`!Tib*6N^k3zrwSc#7NV{#mME3ZdW0d(%$f=m%0_L zYE4fvs)hAOxg<6P4TxlT9k)ZRq>pV;wYt8)%IFBBIbCMp+mMZ_%ILP53ep-81qCIb z;Ck4!%DR)w?8C(VZ&OYko5;>ReH)IMoPxols?zk)en8ZDUOT9j6%}Ob&W(_P!()M_ z*^7oo!YXa^LsZbUpS;|9L4$p1k=-C*sn5rCLHblt92V|5$3so+scJ9Y!tE0hKDxg+%dqLh+6#na+ZB?z-@P$Wa-!mNx< zY&RIPNmqMNfA`VB)dgJSik+m6p$QUW4yEtxIJRwqYNl#9ktCG6R`x+VLSOOnA2 zM#;FdW$6ku@auM~<~|o!SWM+tM|V<;7p~#&Mu!9<)z5@4dpF&?+PT@8{aS@4OS-IK z7hv%H!|Y2w@DoM-yyJuX8}s_2duw~&Tn4k)#(AG0UXVrp?KFIkY1*tC%(rJ%-lLBXedX7T5ySXAv0 zIEd5enQ$Q~AMu80!lj6GP$~pz7iH{T)cfDroQdK+CIIRoqBj%O*w}qKJo#dSqs<`(K`4Ye;>pZVW zzkQdyBq{{+pzQSh(eX=thf$y9!=3ozY3ZOHA~DA^FrmDvTe@hIJy?wJ!RW84d#6Au z6d)QQ1;YpE>%dwZzf&tk-*w4tezFZl;hzfBtdJXQ^J}gT)}T<()_r-^ zaLl(HBH7L2H6<0yD;DfvU$%;Ay+DMd3>H$ArttI%Yv@U}=(e6&sE) zON(~QBkYETUA1mR|NP7|beBI_YIsJ7(@3gB37nAa#x!0iJ;#`uCQkyVxEK_=4K&nO zLo=-GRDPqu?GNJ$Byw>i*<8@np6*t6_UYsmq>pFO-&Jhr6!F76nmZU}nX ze+!XT6f@R%UadO;Naa!XHwZ4UcngbDyo>0@Vx4M)ZJ|D@6l%&)9s>51R|ZV&Mw`w+ zLT~sz6=3ccLg)^W$E`BV@D(hNpuBasQ-Zo}n}`xb=U1?9=p>FR(o(*JV~q2a2myTGTxATfo#IG<*2GwC z9*!Vqh2tOscyFdegYDE;GNu)THW3H7T&k{`=P5EuHWuj#C@nM}JBl3F(CX-5+udhK z8efIpsGXu(rI;t7w_~y1@q<9*=qzxKBH4+gHWO6w6pqa^hN8&9myG?+*Gl7$E~$0v zqgn5{9l5dp7#RmVSA%rK7lpeUypULcVUWl!q{`M$lmazDJXFHML_H%w5#Yo3;rM)? zJKhP!kFVogp@OU+QR89R*j}HX8M!&F`D*TdjCpOopZ4}_Q}JC_&2x3#>A7@zIjA?> zCM7>`0pn0URr1`WF~|J6`fyXM!)C;JulP2ezD&-2I>Fg=(A6_p4-HSWr zL5#cPAIlysx;}?{0Pelq;&H<2^16O3WAEBHEW<7R5b1~((k|XaG>y)Fo|a{mZgbYS z!izRd{NUOzJHHe!`4x`p4~^TnlKlbaM{Isn9!@r+B$9l2FTc@otUi=urM9%A%5cs1 z5h*u%xB^60i=|q^#gH`n5kwQ=IAbAt) zQ2kVMzIjS2j3xFVjFo03-15f$;nQEM%r2|Y$!_B@(g45)+;(lk@EQSwQq z`z#kd1&jL{4XIl9bOp=5Z40=ldq~s&B63X51HVI8N8$+4QTt-t! z@emjQfF&9L0R8`GHt-+0ZH~02F1AMhQ>t5|zTvpRhT!w8R=t!F>5R$b(=r@GZn4Sr zNNUtI6?D0d04Whp=?}_3fhG364GJOon@X0CPFC7v<=?Y)5 z_FWpXQ$#K&(WB-~Ltj7Pd%$W2h>#}*k>}0O^|u6U`0WIDQHNu$!7?4}-*xM-BBtK)w%$IIdY-*W>o#D-W#lhDF4OLy$T~RAh6+3Hb}+q%)n= z+ae5O=JoqvI846i>@`I`6~4C|Ow9KpTH=akpp>GVy^{+rq7Ms;QeulmlRr>?REL&W znZIi}!~7X}DTr*~_X~$dRT)70inQ0o*cI8^mXWz5yW76N*ZuZF-uiMxezhC_E+o=B zj}&CdRZaFVX&u*GUll%*m{r_z7SA*PjfhoavI@dYyjQ0-DW;esWvim|r)TTJ^?bmf zp_!`4H?m&18X-mxgVktc9#ld}-a4De6(tZE!*CwdE$9?B{alPqo&JL_FZob8Rqgl{ z`vhJh(Y@Q@zDi7e!+2bsOE>K{)x1lcC1yJOjkm}T^Q|4pt}Sm)UY9ll`+l` zs0$!ub@{)b#fY^2(;1=gX|Yhz*7{#!yzQMVGq9!Vf~2Kz@i2OGWsQ02HY#@+^<~^n z*?B0(VmO|St@{IgcC@3sLLC((niIz^V_c?MK;You@%M$du7w`NasIG~;SkD+bfZYG zE`2O_J+Pyt2CA-ptz9b{3~-P+#J#_Cs5W6UJg*I1`iB!o4{tYF++JRfGo5tLDF_cE z-Uc5gu?w?={!kk5c5MVBQ6CMY(bIPDma{I|AljmeNiEj_wTkyf5jpt}NK{fq=q~Md zy)&`O9PpGFjusqxEId?RteV_r=je6s(EDYVl`s&aJ8mgpj#7bnyaAtO!lFH&UK=ju_oEhu1e1wt?4^ zCrgMuWXU@a1|$Q)MZMTp7<`_Tp||C4;0qdOus7}yRKy`dey$(51<3w&%&mjvotq(~ zUE#Nhh~>R|Qe()JoithXGK+9RggC-eWjJevTUl7`ll$h4zG${E?a+9?ib~?LAcS1f zO4tn9OsS&Qb!NHlQ{6#@-S3Gcy~Uu1hXfcpD#%?@(HQf)7o9Cocn}J8#4z?oB2qR^ zCU~kTS(BepCtz+-8b^g(dOHqcn4J@GpKwN2SlZe?cK)l=dJxUP zfsCamiAwT#ydF;091L;wss3}yUVrofXv6?tCwm(<2!WoZo<QncgnqbUR^s zQ+Fx}Y4Vfh`50v8`=f4#h-xz2V}*rB%tm2_oYuP+Bq31-yvv`o#zyK{U%3k?I3`7O z!PWC%t815C+nn+2mu^d7j8FrVP@!+v#fqJCxwWVLlZY31DqpvVuqKQw$GWd`kEKpv zCUlQ1jG7Ph`XRM~hBI7z-D$Lq;Rrn19R^)zs}o%IY-g8wtLeAQN=E0_;&-L9KJfo@TK-e~ z{tuwee>*LAb~LbcvbV7Q!QlKyLH%EVu8WLpXO^F({^#TW%GCMa-|pmQL~G*y1Jtqj zk1*7K=I{T>)}s4)*3Qw{iGYXTf9H4o!{ed`|Hn%IRW`uIHZ~{r z(;6Hj|9`^B|Mk=S96^qnjonXQ@O7ovXTnblUVA|@l?Btbl?gYoOd^t0h#yI)Z?bMm zm4GEN#HjfFyp@nhGp3ldhL4o++smDMo5yWaf|Yok0xvU1;rMI=7dnQ|K#6Wuj1;+a za^46&LRs{AZ2FRR0o^fC)VfR#Z;U5K5e=b8QS>JliX8a?R)yJ=&OFhck=Q74=6{g( zjX|1pTh?XUwr$&Xmu=g&ZQJOwZQDkdZFHf(dS~wF&fGzKKlT%m5t&b}IC1i9uN@Yt zIH-T1dk={j%eANy94ali6?yWdL&{O+byzRFhd$66u>DAMi9Ef;3vaL}o}G7(sqr)p zML=CiT*ZMA51%NffEfHMSX^d3BpfrF2V9#<=(zYT+1)gQfwLLv*Il~vJfq>tG;P10 zB)sd7%iUz^<9_Se{_0CTv;Zx{c|pVkF-1($#y#XkrVg_t#d`gv29i{p^r#y4$CRx5 z4m$%M1gYVUZq|v)SEvfelOdyStn*{O*=;L97ww&@j@{YkruUf?ZG?Wb!)_%dkL~-T zLvG7~wv53x4xEH_05@{6M7urRu22dfo_Zq*+>UIGLa65m9?d)+7 z=#;{DT*MFv%p3|$q2w^Y97)ja{l>*{1T!5H5ki81L@R;B0`LH4nI_UV3nwJMNJHdj zVl9gxi%68%H-_UB1WiC3!fg-J5-;PhtUBG+&e0JZ2nC4K61Xl&n5VEf){YC0eYLhN zB+XE=VfwvwyTWO_6Eq3JUf>g}tfpL>PIYvMlDLk&ysQ^jK(s`r*W=A*cLaHcEgBL^ zdvH+#(QVthOAyz~jcbVN&;ujY;#aeA3$Kz6>;EIh@b(2(==z=6qdq1n^3;mmtUG8j z<|dl-hN$w1GzRln98Gd>wx7;8*3TwlMDX>d_9e_q+}KS3?p%Pb+s;1|Ue2rw_jOjN=QEFQEOBq>X(HC6#=Z@Jm)j1pXhsS*=Ohvc;A4=p;VxZMzM>$vn z%@4?Wj~7>=fkSmT+By!9jR8Y=eJp}S)g2(shK+>qDTtYE`A4^&kfLXR98Nk!owQ{u z1g09@9zIGaE%`NjtQWMPF&^%=^7GEkD+O7~*dhxAiOR~GXXH-@*iB1^VprkQ=4~{= zo7QfM@WUO`k%jWyd75&P6l`0th>EPAxuQ&h`23X6cCow4c$lYqxyiD1odEpFnX%-? z_4tsPSV>~t%Z+rcQVq*biLaGg5T-TIJDe>-YfAPB#d8vA05u<9^&kvkXy5C zDlR!(UKfSSfcx5uVY%vl0lFI(zvJm|D_zexNq7-PRS+%des>_Y-CEq`qxQ-ZNG3s6v@PGPC}m>_x>k1alAiJ^ou5*{t7 z8!RaADU-Vfjj0R*=umnT_pV>W;Hc^St598@?sqHm<&r7;23Ygj-9eB)7<5*!gz0>m zBP<>YzPW6E^4r9xii@YrJD4~tVdkWY+Y=wn<3;Bqx;1plf}<-hOc`o45Ap@H)GPvbEGhD+uhzu)fpEp*@VUn=*1R;y05Ms_y;WFh?1 zjLg6KT0#2-p#~TbK<9kq8HZwovaV@&`U)X_O3U;nF0c(wiO?Ku`^=((R!Bx3cbwm+ zBTUD+m!hhT!_?cv!J9GGjKcyq%^GFwTmD|)o&ptTqRihdsM>H9&x{gz4B)J(eZTT% zvN6=fz?mpOIZC-eMzWX3>8#M}JI=FgptK%{Ljo zizK5Gw|;r60E3~+bd?I#F?p#TUlaw39{RH+DUO%x+r2%&0Gdx2Tr1}e8GG?X-bX_# zDb#VVgtvwQ% zTx*yhO7Lg#7XocJmSCEwVjvOjJ~P`dK5Tp3`yqSOpeo5F143r%7~a2?HepPAvr=c!bw}3fQ01rc7Ccze@OpbqIgwGgb))xhNQd#BxM@ell1mH)D_XQj2?TZYfG|y@wjqPY-D_ z4J7(~yL%j(N0NPf+>f`zhZ8hBer<)d!W-l;k|cuc4^DTHxuXI3iC|Lv22iFzHa)h6 z;W#uNdFuXbDx2hrh>dVB_+{Mu3*K(2wmn@x$~^DS=76v~FLTi_lnGOW#_zFl>b$QZ zCmQmVJIT-IF|B_$ zn&_I`O(FHYoXoJEb3kD*u@3u`Z_eM=Vs+9hiG_#_ulk5;)Wou3z= zJ3=G5*g4!V7nK80NIStidV)k@ItNRi@^799Ag>|Z5^$zaHr*SxJ)*F`;3RIAxA1t9 zZ+q+-m~kr8nz8#*E2Jn0hLANd1orREUYi`oyMYsbSZrv1#kYyn&zlw-jM_22#Ufs#ZtUIKZ$R)N*}&5Db0T*c!JWX2zmSSmdfGnjE@AIM>sw}OCBsv3Gnt2PB^ zCK=Q>OciJz1>c3Eoj$)INv&E@U^LcDc11^!R~b|E5`awf{~*Gkr&x-k%>bz2M>m$O zEno`$odqbb2n0sFLs~_By-O8~0OXpCj%SCPm%X#)`SsXuz`)JE5Y9=a00HH^C^cxdKbAqnaecOIMA4GuW;4gUcH1ZD;5W_3RLf)#qIO5O%|C9IA zOS?7El!f~<)U{M2#9JErU2+SYc_g4@sxD3=t5`rFD2vRWPSpm44i2|e#w?u-()(ZS zQ@?KWRJSm66`QJwQ8LjXzWD~GS?2Z>H3cJuV;UCNvr7vghi3TQU+m6zTfaWDBHaEs zoyyzJ&Qr4Ck-i5x36F8#x(joZlbgitMXLxkf!H)wnUQw)wQ&Rcs7CdVC!$iiYZyhZ zEHQI{tU?V1CaFcq1tpDl<)|xu^~mUxdBKWa68f|BnD;Jd~&k*oC#Lm{9O;awKEWKJ4iyQFC43-4aFN{XDG z?Eg_!Av!Py9<-LM2svL|(ea}}2v9YjFQ4Qzv1Yz*ZLj715a<3fjDaJ?@O^RcL8C^a z6<^?!q&=Z|A0ZwngVP$pdaj!vdz;Nil-ceRbkZi-;~=CzNZ7vNPeC==s9x%#j*Qls z2j2z7~Qo!&W&W|_ASq&E*xkPaIscKUd zghPSZ>hTH>ir&?kH!%TlBBF6Bw%z33z;Qi6C{Iaw7w}@L%)wFNhF=qkScml?^`fqF z`&-Al1&x6Nl=lPJ=Il=)ZPHnirMfxXxk1u>Uai)`e;Lr*?L;FsO?HY$BpHu|XhKr&2m0SCnU zHf}#IF4V+l|AbIpZcmQV8bpBd-A=#6OF@o4e7E%a8Ol^GD@~bsbOf^t~4pp#VP#FP7^e&5r$C zcK#lp>@GKQbRY`@h$s+8AwWUh>=<47eS9qST5ADrgEya&>6#PeMzey0?UC2UHgSFC z&5da^(lr;v-npML09qbz;wvyK<_6|vxLSFeuI@9pNRcf0$6dm`g-Zu`J!ldk@Nd+D z#y!iA__$RXp&;$LENrlv2Ot~t0!lN!qOQ&?Qr&H5p>N3T$NyQqv_RX0`;l^%kZtuT z%uV8=e!8W_?PIebRh^%Vv?|_k%sq$ZDe$`~hAkl|GN^xTzwfv*^$f<)r-%E=AFX~U zgt`O4wkqo;ChS@45Vuhl%#)5}nz*e#WzMJ=TGY{pDD{WO1cmCdIeXivm>yWIuHj~^ z(Jh>HVr@Z_^)(zlJ$+Dcgh_lFxLN`z{eukGTuk4CHZ!Z#k&oDw^ftO>9vfPa?7h;K5lvpX>=(z+bmK7OL2yE_ z-!qepq@DK>E1k<|{xA_~a5oc=dEI9nWX&sUPuuKnaQD};^_1OD5wEeg93u1WM+_LQ zUe(KOtaxI6n?=C>j;8kgT&7?9N&uQeI&0f-l|v?_LBPC%Uy^s=#q7boz2e{|_;#Ar z(=gkf^^u4jhQH{mYU!VKP~F0ySNVTqo9rm3pv5!NSQ5`bX&_!N)A~g62CAYiX#a|x zI$vyK-=90!o%6m-X`0LWjnsB6s)-0TfqCAty)mj5G|o+9p%ZvEJSOa71B@Q9{shp0 zNAA2ti}?(r8#=~*RLd#<+^0F0{ID@W4NjAx2+1uGQ3w<)xNlh+R$%k8m3V7 zi;yrRsTBN(<_z)husGywRR;pVmoMX@ujB&2_9nAobbIxyTB*Tx`wf3Dk8%l5~xJ7P(zHn)EUYRj}oiU3vP64 zgYhP(-bQpXQFoI2gd<|FRBV^Q@u!vlsmhEOjwN2!0F+7LZ2HG2B}$`@a2DX%0EX z4L$*)81Fjjn|+hDs(YP>K+zd&9Vvj-Oe5J!c7uDeTS>>;XY6z7F@h213U z0)k$wg$DR?Fsr;O=mDSN zWOmfYLpnzBB;re?FOGixf?GZ9)9UC!#{*v+Tx9T9BNzaz*~#?&!5{RMg7#Vo0yPTU z-8QIyITA0x~8JU~d82o47SoQ_Y zPQT(W-`LMeDl0f6g5odV7zHrG@z!#q(vRlWQe1}cV1hE}sd1E>T(x2x2Dn(-NW!}i=EU)u-=8;1I2a3z2R|)2AFVPIs{mSzx-2TS>?;^TbLS|9iNM!(SHurVvKP> zbMkO0514NyAsE&L=3KNx2fE`z$kUSZwE;ye8D)u7MkpOx4UP-IE@aJLAv}vIac^#4 z_0xeIVpvNn46H97fwn=t;u&DsXiV-fx@9(0kdc_9=XWpN_nV8Aiv$-}zZN!+%;Y1_ z#j_$EFZqv-Fo9KBX&84?Z3Jeeudd0bE4iNsc-Q!pF2>4yFvqCHR}idcPkxuTgsf&cetBpm90C>o#Vrtl1QwIjKCjfNvVo_B%$6 z1hJd*yv}01?B+ZC$+Nulw;2}qqsuiRz%{81VX3z5D0k}TlE4mZAzdHqufcFz+Q5Cg9a1H88WcJ;_sD-uEL329eBTmW?hN}nj=t2`E`i$rM@#g!^i z<QeM_p{e~V%1IDvHx7~J@2m%O?m;H`nf?k|l^uiad--CUs^| zE7q7>Jl_37LzJf4do_uqRLWtm&B+s|oH8p`OE)H(M;sZ0>}!o(1Jn$aLL6d~`3BK3 zhL8hL8!iKhxTUK~e5xjPUZaoGf=#BLAcQ~q9lzjrPGoKrUL;7BJ8Cu4IN7^d7c=cd z?TW7HkwT{SaKCgMOqwrA<@cAFB#P(2pu(&_Ga)7#gOPjLBQ$e0-9LPCHPwF`vIXU} zF_eQ$8ni&nV8X6Oe`y&J-$yM&iKLv|-XD>o-EegAjyk!7-c}_J(=vCO>xbiDQItIW z0Jl3w_1>*6!?Ofneig1yR05Y7mnufd9HB_ZWhSwsB4x1-KR&121}H-yk`^?rs~=&n zUw(LxwW{kaoT?XqGJt|_UT*bc4hx&;11y_JrLJmU3nUqU*C$~(x%-+{35us2xKOKE zRgGHQHX*5_9H&aakh^b&(76-4r3LWZ0M_sA{w15a;mv;ehtL*x%fucA?1y?3o%8Ak zqQN2#yIvzUd`eI8fWexSp9qI#)EN*>E#+Y#_RPKf$`R*~L$yf>(h}{43>AbAuUDk( zSh(5HOL()1B~NJzT(`gydR^R!+dk1$?wLH&s}-mIFU;5U4g^>IBETf0%K!(@%l77| zq#h&t-*yeFY3JmH7w}(2(qr8h#8b^8RE(u4PX0NhHk=qK9H^;V#QKU#z4z5vOkBz; z_Yx{PN2SQUDtf?ETNShKvSmW{`2v^Y z>f9W1`T7S;w9u(}izGuOw5wy>I{2@R@DRUw49GPyp>vY?UQRX_2 zNT}=)-!OX=#aSF~D&em?RNTaL4BOP}*;sFU{qU&2QrI!b*i>A;oA2kgZ){BQ)29kC zeL%XttMg<7;WL`Zf)=-(&g(~fs^@2hAJr-oGR1UB-8bLXw)Y#ulyd7kv6-w8=g54J zS0T316lcyR^U393o*%t8K80uJ!r|}a1~$f`3EEv)zygdhuZE7u05N`M@S&caNw$DMh} zG6p&ph+Sn*A^9saQryyu-W$ByUusj#;F8AeM^BQ+ZxS^*QS&euoIGvx?W_+y@6~8n zDRoIH{vDlKs=K5$Plz1A+OpQ!l;} zf3C>9MhunXGZj}7(N7JznOy3u4ssx;4T-3ZP4+`oV4`~o`>H*} ziq_=D4x;90g&c7`yB_aws1agP-Z#2jac(O11by03l1c^Sh!zWsG%?YT^3)tRY02Hg zGWI*Lw>$}u{Z|ap9W`{-pKW)7m)~ofiQ}9KCUy*miIK`h%DFo-Bz)G-hN$8 zmu+IZxkez*C8I*!^NB!>w?UnzOu&w!mo^?PJgB7Bwz8!H`L)g`WQS;T8lQtm5S zmx?7j3!#W=&y4~u$0|#DQfVUi=fs`fI-C znF$5>@c4I-uzTO#L`&P5Fe)iFqeQUrw3<>Myc`tZ9~(tUr{Zg&-lWgiJ8hA28h&c1 zmE4Jl`KzMqA+1@YD@sez%6cMgi~fIt_NdqVq6^M0itQb-5XIdBi4E znAIPhUvbNa=)~zV9NL(K_`lJtgbn1lWY59()k>gLYU>2Ev#(QsPSE08QqX9mS7CIh zk`IELx2%cCpc3sZWmQZL6lhr z)MNOe@6Yg=ZaPrr^Y(vrC}*Ie9Q3@jaNknluPo6vrKX|XQ_1e{%63XIR4ILWCf=%O zx*4%5YRi2D<=}k^U5P7@Z+5RGbK1}nQq#43a#!nJ`pm0((!WGOHaiwcPjD^pLhmM@ z28ggPM<#V6!^W{(EruqOc78Vk7g8o00r#>ivF)|VgCypp#bb@1RfaG;=VD>=Q2W+6 z$+^yB$KEfj?`s8$4w8hLYuBQVH4-<81asP3n`J(iL5oW=R)nm4-hJkDk2G7^Imkof zlCzZvH4Rbcz*gx4q>oyV3!14ll16i{T<>@Lh+_eDD;r7iQ2(Tk}u{3&r+~%*f!Xtv!}Zr7;C`44b+z4raj(U=O!!zvU%p#~^UhM1jkIjVGNPBT9=i!uZKnKQBk5`0jzX{) zS7lnq%G32MtB0&^o`j>c(XIFK3Qo9|YG4}9E<4@ar18zrmD7t;FPq-0xo#T9cOQFk zTcoBcBaSnnS}>JqcZ-1AiQZq?1C!)%Yq|s0Orpb`<05&Hb5Lilu_u1eUR&UKW|ZR3 zwV4S`7nA>!8rhznC@AeSTeVc@#YZRt-~7a%R{l;rPuI1gRW%JqPMa}tqImJuOz;@)+5H;v_;5j4;}vgW7=!EsZSP_bzEg?Py|h=3t@6z1_mhy3mn6d> zMd=F-&L}@i5r?Gsd$08b_NRdDyM&K|hCO6sUpJmY7maVOo^9=(++X#lxD-(@S1^83 zyI#-wuzK07w1Yj3-*m2q>dblSB=T#LN#@ZCcbSyvVcDwCC#CHqn>$<3O}npV=6-nJ z|E)&*+gATi6=^ts8S!?;CVKx|Bj)t&O4I&zP5;*qBg5ZScgIDusr^O2%=9h)Fys5T zC;!DK|0gwAb*!YIAXP&lIW0}8+MuN1NI@w#Gb=qQvpPE|FUiU>7k2m55c%+s+-BMS zH?GU?SNtE*GW{J|lJ+^qznl~1{}CL>%RNf zSdg9VvZjsGW*g#n`Cxz|SJF^X+J%qB=vDKtdKcwg60^7?IsWXQq#|^rLnQq``8GOq zf4XM_^F_u}Wkx5$OquFQ0p5FNuYumYNp8ztz8l?dL>_mdk)(bUWG{r^Zm%)x6kGB| zpeIl2@?SPTiCgP&sO3hBcK6z3KbUQQ7xszH@+n?=Rt?jCvVMvsOx`m- z5M;!}+*iq57@6dxC&Y&+gb*i9qz5k!sD3jjAtN%^$irw(h!5)eCD~dyOO8-_PA%4s za?$?~J04#iF>RQ@k#08a7&cAAN=h_Lp$kD_L|JHW0}P4SCB&K;)M>)%T#-BD-FPhN z)ynZRzvw7Wo|sZ%*ZH!jApO$nR1%=+lgZZA>HD#gAQLPXq7^@8%vg)SI*{0|Y)|ma zQ*|YC5p8_OA^yjV1$%MFwQLW_nWU*vx1m-W*>23Mne4H z9jy=PLK@@;=eRh(mDt!gd4J&O*|&qG^S2c#<21 ztm^Q}0W)&a`DCBzvY<;JLTUoOr6|QQw0k)VC-v5M3~qZEzd8RK3t7*NpqURzR0ma3 ziZ3G8a)Ws=9#Np!*1GH}DZA^3J#ITuz#EJrBu{5cc4WRE#?pvAcL@;)%#%vQ1tPRJ z2C@~$p!)4mv~FoZJDt6GAMY>oUUD&i4!J7wx65C!g1ZxK4TP1}Lw+`Zc${n&`d3Qk zuqUqiB=tp194C&9k$M4;g#qIuQ<-^P*N5KUJtWQkHQ~yz9hIo zoFnBWI*p6!sOw;&+%8C~U=1-LR}ZV3-4=ICV+FQJ+{%2aKF~M+fCs)v#cTyBVL?(i ze~*u}*m@f>Ia6a8Kj4Pw%jAvh&Bq5d!c1=N1eNMC_k!L&s@{*` zYGNKzXnNR=SgmloP@3sN)?Jy@GL^;66${LyezVi2SiH%J|6FDe9HH%9-S zRjOb6^`#@4GCS9Bv-Nn<+TvDv(u0PB<74ogN*(U;8s1FTA2tn!EgFFwglAZpRW)d6 zn1ezyoonvtY3dil$u z&T`CkZ=kpBcNkQP!u-o=<2hJqKS+THXaR4RevHios-j}*l71^0$O8M;%buMHWerm} z=A@;OKNPJY4fKe!uFlWGaD+{sZenyHt+5i3wVq;uX^P?Caq2<(tEV|WioL#>PB~HKB~EGpN(it z$yHcCJZaJX#UZW3bbh*iX4~~R(J5w4W{^OnHN!+@lfq`1OX3Y)Uejv#?vX%=K?lI@2;hY6zFxl~~wYwm0 zXJmI-;9`2`ok)IXz`6kED~b^i|Mzq*K+6Ofigtd>Yi1I8h|iAMT#IPH1fj_f2IH4T zqXF@-xW{~&4bub0d^lwg2OE_AM)1#;fanV31tz7~kq1xJ|| zf{aL5+^rvA=(Mc+uAen#q~hRsM1g|bFVOhHRfjRxanGWqwiOu=Mg0Wc_z^5gPWVvh z6?I=^GJxp;J6heEuvoIl$KrH-p0^hF<-A+hj~r6?jr~3YTVq@B`sRfB2aog6m|2Et(6xX6S;8IACdK8DAeV9S0Uc{>t?UkK z3JK$#buuX&47Cz&S#-IIo9NTy;`K0mWzpoG1H7zMU3%o6#`CeI=#aq+>soJat?WAG zDeW0bBG{4I{$|P zuFwdGTUxy)5wSI+$K)}PTpd*kHO^j*vhGZXKi zKG@et0y>hZW7*Wa-uAe?g1Fs8Z=`!$_fkDG!#3j?ll86#czCp2@uyzB*x0YXOY%hG z#FRdgen-H6|8o)Pe`!enoju~@Z0Bh5Z+R*^+il*@Z^G<`-j~|Fwj77V`XiF=7Reo- z_LfDiv>`n1_ATs9w?YXCLzx7wz=oQthp*?>P5=po18@i_M^9!qWpR?e;cLVCwb|Vs zhwK^_3E`HfiFHpW-}{~Yopf1kGYoP$F4LK?x8xizNd{S5`dpcyc+yRrujtTz^VBvA z1o0UJ-|db5iXP-5hX#jCIlZeZpJRt6YTv8jar0UEErX8tM|iJ;R=eT0J~iPsoJHhW z4=nO%uu^Sr6`0#~hH#({uCRpOe)-#9JKvLLKcco}h1tW^3*~*hyf&o`B(qadI_4z= zP`$kEF2%kGVrv`auaF3SIV1UE@75iX>9;<*WbzpZr`C-bfi0rz)5p4!(YW}qyF6Kl z33BDadivjXOYV^}#)X~f%0+C;TlWPeU%?Kz*SS4-+nsx^UWeb|+*^O~0!n?ITB9-T zNWY;4+=~h{g^(PEVJf-s$R)W?B(mshzyE-x{19#)Z$JaBVqTwgFeS0OeO>a|i`sH*kcVx-rQXR2M-LdTf_Gn2CxrRlL2y1oS#vlg)|9^85wV z%uLjeM>qGoS1>diGIqaLFE!zmJ7Q)#D>YgfW228xJb@b`!-*jDGVt0zsF+PiC6*uf zocb1|%{stzU<-X0v$OCFR9r90?ha7PT{<8R z|1T;@5Q(n??o4w8t*oI`?i?oe1SBiAVSWKOqwTc%NACl&RbOvx+@EL*lc!8vX8A6G znx7MlDq6j$?$x5Kx0e8Xw*J=b!$$z*(c;9$`!NM|AMdW=id8>FVduyVkU6rp<^Xs} zZUp$ta?nKvIrvEfF7If^g>0lg>xKqZ??mmKFmy1-Tt(*Yw4@=@9@c|#`*`86rO5NC zuahd>CCc6ivjV-tsFgE#w8$1~+e|UY;iwj{mY9aXvH|U$Sm%Bh^E}!q-kl9X`5Z&I z4_)N?Pqc?r;a4y?Yj1(oEwa|A5~-fz-&V;B{8|B*0XqY;_;UHV8yhh7R+!qoF!Z#B z`OASri$k|6{nUm>sM~!CQLE?IEE3@`pp!pATlq=j6Jj^sudJsGMx-hu;IdJ18+Qh=fu=IJl~xAQ&S$OSEI{+d zb-eQ4$oGka|I#MYRdk95}q`!x6Vj_fdf0`+JxwSY5lBIETswf8|I zi~#;}zZix>vXYKfE2kwdfyhm`(P_ZEab^WBMv!SS7LeQ-O;O?+cqdp zinM@+2|zWdF#d!;QH6TWK4XzniV0#qMm>c(VKcKuCF~7cUPJ843~eq>6RTS#-3er} z%&Uid)l8)sFb1N_E#1^U!>Mb-f}+Kqg@G|=6>AzXa)AV2-qP>XZMugRR6@Lg*Mb{ znoHm3%CJwxvcG!AkP)!IlTJPbvCDSC;ne2^2Bej(*Eh*(n}-2;+6u6MyhouKfZKvL z>hLRU$zxFa=!UUQYxJ{0*r+cSvZ(N9`tix^RijqJMVzN4@ zL4gHZzscC_{KeX?@^fhuSq-L#)P|{PRcX{r_Y|r%7|_Sp06`=mQ(|_ur7+%cV?n{i zjHr=n10bAsyIr zJ|WH*$tmG6WUkcvt9i&Oq%;7{UHN_~U<8iIK?ai9SH+r)ozW`063J%<`A>m)YbJm` zR&v1X5V}yvwnmnbVGrlSfX?oTh84)(9KrfwXILOBMf~A1CJMt{;qC|4u`Z)Jz1R8q(|}fQC^}gJAR9XiQ#9bcQwk>U*9QZRi~Z z8x#~kvT}2S`VvfZunJn(b&sinZAUbP0D4>djt*2^7idL{h~BptOgElI3BcP1&8$Ew zMD8I0;P-gS`(?FpD!+SP!XhO~e!o^Lu~U^1q#4D(()uW(++l`M1l)2^h>)m+;HzBi zXN$HxdZ^mYwT7)P%y;;2gMk4p@^Ob<#Ehqb>qT;@Rq!RK-YU! z>(m-6Y9hKSnm3Ys0^k&FK$b8oX0P^Z^@@&3h(f2_1;7seN9*sL8qQ zes5D`t4scRq8ZBc26bFofYTW*6+|ra=W(Pccp{m#61L05OR3OXWh>j%05A*N!7*wM z2mNtR6T6ri$Pmrz&<@n%ug;zaYg(j;rz#o;sQ)<-e*neUP3xpyF1dp6+6;zqRh~bm zB@eujV$*EVo+gWOPG;RP|6#0N=|C?YvUGOxh|(}m=J0sjC6ZNo@_qwXg_olYqr1Eq zw+tLN<5%tb_;J>Vf1bw_;|eUABy;pU;T3~}yK<7yG2SL^=O@~oAf z+f*b8vt$hHkGHeKo{moTkQ(|8*}3uyyRR-R5VHK((;GmWF5;dJMPZ$dKzhgX{?tIt zTdO`zA9cSxgt?0vrY+N_x%EVW(JDg7xkp=hU?!NS`Ynk(6dNTQid?Mq=+q`(l`MdH z)S}>0uw>upx%_9eXfOk{^wbZ&zU{P>)!#VVw4eN@ za@qVZCeHlXa<<7eH1O-F=Yg(qDQwECTSuQ+t0x>9H80dD?O z8d=ytW%KP+Wi+b+C-$h8(v(;k9|ZaM`hM#|mQi0!T`OhUdfLPNyP71F*yvkD}r2M(=JwIPIBcI@VT=SsPy%n#*)An;qk*?5cKkB2u9nf03F>|hp3ZM3u?MPXnU zx_po;1ZmsxTS0m`B(#Mdlv)m)Yql8%XGZXe2)s}#YFz>LKogMfJoD~0LZx_oj}4kT zaj0M-_%JG@EH1U=FCL8=ec3Ik1c8HxRF+$e9SPezBp!h!gChvPqV# z4k}LK1|2Qy=1u*~QGC(9W)#<4wI3Qen6r;j+qb1g1&}rtTz1OdghPwe-`?(+iL7X< z$p{Q%FshD~Xj4f{PJp|qib+eO;&|oZ0F-|V8N@*=p*Efy6d1gLLPZSsNRko$!hB-C zK6Z|-fDrEh!Ovu`#x{s!e&geMRQJ?Wz(#M*yG+r1dK=9p1xR;PVd-;9-GYqxX8raJ3C_?YXbt3=e0dn;XLpz1P{i{8mQW) z>H|9p>^q^~g0`Gg!MaH6&%^aa_@+JNK&hi4-Ra2fe}lq%>(yj^xT|Oc-7?Qn`6=_N zdlqL5uv;`~vz~5;s|f~r-UkR|;E7|Tm?d}i7B{0>lQcCkqFLYkVU16EKAMLAd1*HT zZ&aJ~)1p$^)qf%p43uXj4L9Gp7EQ5u!y^noR}i?R8c%4rJzNd-EH+;YQXlB9sH>67 zv*Sn!H^;B{_;sm)-Z;)zU0QXp@pnD{GM|s)`(ud>8z_&@O1xG5NOqWE&9&b;p*|QBI+*MS zh%ey!qJ~?W#|SwBObzdQa-&Re1x>4FoBK&YH2hJC z9>@o1Ba1mM?DerAwU=X8=z_ zjY=m2RKb-y0jvG}FcxB4QZ|feVz)3V+p}@tl(Nf-0qm3q{>MV&VxVI%h+>QG4ZuWC z)lY{WDMqvi>4FXFVjpsEZS~_c^wOF8nPxE&p6Pco8Dx6 z3r)$a-#(em9@y2Lq;sTTgGG-PUg`=05xAgIp)DFpLsUSZshch;Ms>`rG4sNo!TuNe zdP-ml_E}s@;~2}xY(H4SeOLRnm2_&+Oi3TnyX(%bxMsx!X+*~c>3-2l@Rp{4`RFM< z$46|B%v8V=+knuUpguGwP7=NL5>7S0?ss2hCrfRl-5F%y zIF0m|BivhYaGUxfSIiq;piq5>QXgI+Z$(KSQRidSad+VJe(A$|u4*HPJdIp}L$QcF z#Ya9zdUk>}ZG>^0_^L)W(i`Slut!A$XPQ+|-9o)>BLTc?hbf7$=D)CBW};-iPKo^j zK2?~CD{{I`#?)!I-(;s!OjFGya;%XqfvxPda^MlVMoSoCVUTFzK zcMHP=ayeVS3Rl7Z#39&?naXgDDY73Ku#jpg zK9Y&g-d%`R0vF4Em9Pfwh)UpDp9>iOVD1u)#;S9-%N|aSzi=~YN~vK;4NVCYjdt2W zXLoa;&yJ9P@u8IY?L>7_^RZ^XnOFi+%1V;Ke{jzTsilc;kD`VfO0-%L4XxaIo(^=S zutFkLCn6qs1-V2YIQ*N|q42y2ThYfR1u>Aeel7yP#MrmUC$ml`+Bktb359JJJ~$=j zd`ln&J1NqZly`Q>AYs~7bGu?H|0G9owR5A#ZCXYF>myo`(w`7~8cH4NMExBt z0_+o>TD_&GB3DV(z)g*ZdY@1eUNTrWC9kQ6(g+i{Cb(o{t}oGp#4H`88*AHvQpX+0 z%!C2<$0h(>tEm*BCtt?{18_85jz?i={8aC%Zx*$>dl|zP7}5a@hT^Ii7!7^s{SQi0 z7;4C;X9o6TJ*1ESN7y?C=NkN7y0LBBwrwX*Y-h)|ZR}V(wr$%xwr$&){hxWyRJ~K@ zocVNrzk2muUERO6R(CH-^4AXa7Z1bw{8uiZIKjgfN|FMkKwJ^B4Pfwu*B~dL5-Bs%L(mZYNCYyhjMA*(s%(c3)F7*&j;l3!RHM?``k( z5_*LNv!*q+yOB>UEh`^tixXpU3?581%qiq#l{0R_c8jSw%Ep5~4?U_c4p?GqWvenv zpXrUUqhm$uVNYKKpRVm*#|B4KYa-S z`Fgk@t~gE|@fXbqrfFI)!nnvyU^6}F!oZ#sR}Rd#N4AFQ9?voJ6qd|0xe5@5DmgqZ zGyuAYW%202BGWlKYtz`lr}e+@^6rJ-Ik9x5DwSJVT=1R03{Bk8LRCK-PJealCZzu& zLLwhXn={T9(M3q_u?r%Lo8^D&dkI6S1h`rSs+dt#$TODxB`Nz$YB51Jmh*x@1Q82x z2=1?hw)T;3$qE;#m$xS{QC=mo$w9dsL8a<6yx-pHx}!g(z)#irinOwjx-c}eok=rZcsBE+z@2v5BHp}yDLtj;kCGHeqeS>_Jb6m%i!$QwKZBX z5EVXNNc0@+WX#NYd4A)&mwQv}u^S6vltX$Oh*vQHLW~o7v+=kxTX62DiM7WDycA>i z>*F|jnpG%0cfB|V0C&XJViTinvjP(sSl5?Y^9-5J{Gle=W;tT>>cnP${5SeIFAMQn z_>y@?sc%j6P5ekw>uo{w5UT!QJ!Q>w8woEkj0By8)is~gJ!YY;&%3LRz(k}PyjwjL zwxBtunLaT2ci`lWb+G$>%BGetSbkrBP-|@rHTDKDS!CV~w4(Grt(H-1J*pc%-w3S6 zvWut%SxDH}>-TPF4R0{e_%nB8#(2~H$bt4Vih0X-U?veK{xCeB3(e#LvM3jHF&<(P?|KtF@-^Grm z5W15fd!gskfo@;n`hE3IbMX^0V-bs9NGSL{*->^&svKAsG^vaQg5?zg9fGtHhGYUu zXW=iNU9k)?qZmZH*qY#Sd*wX1_O^}@zb>?^ z>}BiIC=|!m|C>-$3ds>?0(W-H4PS!9BsSVty&m-nqkK8&am3X^#6{0qQ_i5)NT6~{ zeH?;TL<`)&1|y9MjC|Eana$8_DOVDYh#AcZDe2WS`4uWvY}-n(;x_tXpm*smur2js z+97aAIB$^`N*8_B!$EcT z29+7SG%IreVyKVdv_MMCtg;PcYcN)j`f{tSy_GwdG9VxZ6SFn_ON(6vt?Icff9JeOk%>9>wh+ z6g!QvU9+in4k&*hJB>C#*5*o9uSCT}`Gu~3k&5XlsG%Ny!M(LZ0u2j{c_zIxy2wP+ zheIMz8L-Nb7t^m0_SyKJ-hkonio7zGLwN)Vsfmfx&Cvw<%sGW%gQP@--zq=mW*-%)(LN0%u3u%@96CC4AOIEW#~Axj})SwXZu6 z!+@_{M*9iw3Z-hf!1d1fh*6E(MCbQXpKQ?Z4aFmkE3k?G$mC7;n}Y@hRJH7s+*n)d z$zlT3i(-JO)sA)!pyoI7z*ha`LNnu!U55Kjy(nj{CsIU>WPvcm^8<^8W{-&qtIMtw zSO%+RVsnKn13O@|X=e2eP$Q#p@zD38N=G7>J&y}0sN?0CAJiGYlMTG;%0=+Hxo4cR z#3u1EB0J)~I)t|T+)&4&>>*UO?FJ!NG#c$D-{oN!Ij9Jj@BE<;0&z1nTJk$<$_Rre ze_pR=vFFh4GdHp}T5~R1fu;1KWax-0Fq&6v2oOWPa|>NZfU0k1eIyTto-}2Akq^dP zaRXm1B{_78r>n9CgaaP78xk)5HZGpT0u1qIH;}ENpX8t15XTwbc@z+o+IkT*Pn}hm zJzZ|?48|h#sFqRR?DlVdS=I8>2Uut36aj>tRR@8G}`=7}{P z`n87?Q(GWGh1H7vDoMh~)RFNSwI<7?faaL58gR9x$FxNuhgP*ov4!tf2vfZg_u5u9 zLMo&LpK0p7umQADl8B$Xn|SP(P=Hzx3{RY#9URo861busT1H$42RI;vxTXry?CWFg zkGFuPoB|R^PADRf(wh5oxqp*CDDx;I+9obAWrz{t=X;c+=6v#R5W3pABW7oWk9y*c zd68BOLpe3DX*NdNEdN+M@^F1<3sv#fqarc-Z-jBOmzc<-sRxZNkvR?OM+|hFeL@&# zF`J#0S0Sd*l3JYEO%vS&Q4dY$guDrY8|6{TUL~V<3xibW5jHzuASR0h_A9F$TCIo! z8F|%NxLO!JzcdK0^L(^xM)j91r3+J6;Tm)V4e%^}dYr1J*e<79KHl5TIpdvyG>%Ar z4`euKX*AuLMSqZINkzr<{w_Gna>|8P2l;eeFT=JqA)xen)PaBUSWN-d@ojjrVaQ44 zEyx`GL|ZQ-kKPg4e$Qt@Xhlfhxfx8WU|@9zN6FkpjU^(0o`aPJqen=*&_<2_3-bH0s)vc>GtHl z6dN9%N>f2@I;ySgp-!5+rXo-|aP6JMZ1Q}0z_H##W=VssP&ueYtJdu4zKqQ{jKuYt z2%@gAFhU?`N9crnCd4bhmFKuW4<)ymFZ|W6Nq54{G4Q^63jBu411PvE_5m~KX!@qCi-b=h_8)>Xid+1#?cgp^Ioo0K<;?qC#s+~>se@9`` zW2cH5*gHES`f)z^slnep1J|x4lDjg-vHyg9wAKKY;P0&+j32QvC`f9;Ke&cDxEQ8` zD*h$pbol!W-5)~n+Tb%ahYsM08(+BL31PuWKor8K{~m`zx~&R&`+kG08yx&MVqoj~ z>o_km^cURpUr+T$$ww5GlSsI0iB`Btd<);0KR%WPHS>~-HjBJjyb2p%W{SUos)Ugta0-0d_Be_M5)Wm8}E2O$d z#b=n3YW`r7`P9nIqGI2JGOZ7mF)d`k_8K9=RAB1$Wy6}%x+jIbUGFDf+Xo_gBh@X& zSIO(K5%m4}B!;I+lYa5&#~8>7k__xdQmUVD!?}SyG&1Fq0h(1uqOt5K9GU%Bz_eOM zzx6g9IRjx6)-N%d=H}+M9_LJuBXfgzf|i6O83@c|%#q-g${aBi+EkIH{9&)$knI#B zfRJ`1gJo+|xTI1?*zj#frX8&pT`SK*`ZKs+w{L ztHPu%QilN3YPYs;FY{E2Vbo$k@U2ca`O>A9W&5|J~5UinnWaC2qET5Dhsi=qLr_dUj zucA->6h7)3*m>p(J8c_?`1}p|roD*MxBF@bFltou;~|1U*@(1PKSUiL`Uz?MbJ7*0 zI$)TAe6YG-TP47wnNSq-zc#pu&8P4PG9EP)x25gEFm96XAu3`z?L{Gd*^s1X?rZJ( z?>^v9ivTSY=2YWAhk_inBTvj_&>63RlI0gUc_qyZNT0`df)11Z;AN4HA7fV~ka9~H?dt{<$T-qytyrzTB(2#%VA?OD`40x{>#a6ZE;0*gPCu0)PwN?cAo zt^0{8+O~?nitH}dmu4t!sHxSO;s#?;7|A5fzkYo+*LOAQ+ieS8(ftPT*{;pT;j0 zRCcT_ebI4W7ql*#cCqoqPojH}*kfLaj%NgdV~R{SPFnn4gpyH+6?)e7K2w<)O2tzJ z3cV*FkY-mU3b~SUxu?NsVFek-3Fsq*$nzRB@&oV&c~=iH&ZI-6Md00Wzh`3Nuy=SnX6CI-C5lzBE+K1%62>nM0U;-uH*Mr;nGXhChRI zdr6dW+cUz4wA@-;-8X#3-2lZ6zvR#FQo+crP5(_VTtAiiA(>|p#wyQp)hM2w_}HjYVgx^_67nBw?J1*)Qm9tGC){$9ET*y-u} z^0PzPK_$|uBmy2uElo2dC+m1?`1wG$~qaWb^ZYtbCC0$3e;DPQ-0S*=StZF#eo^ zsynuK!I$`xpj3FZ1Iu@GQ(WOOm2XY$1iQzXij@GhTav(SV60x&@AIllLrq(&=jn!q7>75k_NgZB@z@vjOel#oyvi# zG*A5OH?Q>QXsBq_$t(W{_ZynGlfDkdQ860sRua{)_QO=G0;19K+-{j#V2961DB5;h zO);dk=;7C~eljD;4D8MNzQ5z`z8Z}BuYC!NMJ5Zs=!~)on0jH)dZ8|DGN0~v_Xzg} ziK-(MM{K|s-3k1DR|5PpXDnO2#knfhd1QJ>Yh>&_wR9$#pO}wa88?JT5vjJHO6Ea4 z+V^rfJ>-6T3lBfF#Lc`q_#MHjThl(eHLE7(E^5p?9ONpOHPIw0Vy3M0^?e^@k>qePT^qLkXEkCuQCq-%MiwcAZ zU%mJJGpk4=Vo`_9@JUj(>4VK-97kq((wqm!#~THzs}^*BELgZ0W^MTYVF+1A-og5h zih2L7)c&GX-nlrluipIP;`hWw>)L6%B@pU9)LBjIH^jO+7>pn{Vs zYQD4nvlW>y3(1s8P$>DACI&s>oUq=C82+A#=;J2Y*Sw*k*sIKMn#_Q6Qb8kj$iE2e_RiLk-3(2mZdL@W??^bANW!vc1;WXu5>qbPzF80 z7X&YBBFz+>G`m^TEU(w3E-gG;L@MSzdnXLq71iTh<{?kLZ1XUp7f>*-9WCFDeQ%>Zvn{Fg4TK~xDIdL7{%T}c_#^Qt zdduy;AhXEPu#UE2hF_VWj(K9Yj@Fkn-3wap)RLD-mSKqzPNF!*wvaEC{{gJKFDuQm zK;;peNx1qqNbjf}cUnU=cQvNat>ssv0RF_XY#5C10;*T=?!p3WxOLkTxjih+FCE{2 z?EKV!CSH#&(V4C08h=98>zA{mz)d8AA8N8Z#Q;6(Vh$bWTL`UhE#_z00!HjCk9jq^ z#q_oLiCBq*$G0jP;0*51A?H{0t=~K;ZPE;s^SEK=A^3~g=VJGME>V4Dsp2}9YM)lSTR zs>!a!4kv=^kyRY>bz(UHhuk_m#R8FTOLJx2e5c8KTwBsBbBeHhj69~6j9$ih9J^#7 z-ur5>l+v@_lk3(To9}l!4~EP9EImM$!}`SsyMFN=IWABcIYU{8*O7}@d^;XEFr!Hd z=!wQMMZ=3Dp>anm@!VS@#CE7G3${N-j8Fv6r$>O9-spUHE!)i`jQNO&{L(ij>)W;p zgq78bhqGyNSQ!a+-Y;mOUv)vxc_)UjPs3XhABwzYr=M1*zZ8OUr;u_01?1|V3>v1y zWdl9uYIf>(r{X*7i2hjS4MSk>iy3ZuKX{TJ(~=(b^uOxk?=`K_FF=(*=h3HxITm^1 z%6|+algE5ID2ekNjqs&jO4N6~?6e8T)yowE*Ero{uQPN-t=0FGZhK-0_K1t7AeQ3< zrNIqv(lKBr&1Dc&73pM2TLmDueh;jC{c94fzlTe;n96MG3`Gxw{arMw!II;s3vw=G zgCe@TpEKvLL(Ga&E0{+lZq#6#9Ash^BT|Lr_AJ@qguG0iC@Cvqa{LD&%(Q5+pa9gb z&>Wto{4@~@+g5Hmtr}!8@-9fUakoun*-OR|y(-rWq=aL5zVzL_eOE`a_WJU!%G@+^ z`kV0Qk8U5=vO|Ai?k)&xZz}B2b1L;?UM4Ku5Dr7zE22~XkCqw|%k59{SZ~oFhWZyV z4gpQ*#3R!;2dT`X2PG2v9g_VuKCzK89Qs!8yyG73B<%$Xp5O3jf(Ood>4|cyzk_dW zBKmqc3nktmbjIf~k4JI8T01tlp;f_Oe*AskMdD4tYWfTgbhjS&Ps4;EDqKU()YkPT z+Fu3Tt?H{b4$PI@X_Y& zb$JbNjki7eC|kCS=8BzVJH(x zYmnxLgeb01nGMG@!JE~VNu}95l5A}Ze^9LVSLskp#DotB$T!?lahMFuH#weX$`Xd}$DU z3U4VE*H}B*D7EwJiaaUNKX5BGgXY@ilqQ35H(HA}=PK8dM`8j|**{{~{j0I_ZHYgw zqNj2xh{Zjr9OgqGC+VMn(!=uljvKq+B%51bp%{-nb^Bcg ztL?f+A_rDmkC%bEaLi9Pt%@Tr%fYM634sCitpiol0u_sr+88`d0SNR2Pt^@RY*1vW zz@HG0NJ>4e!a&UIi9_k~9%Fq2E5Zh{28mJiHaEGcZA5jJj|G|NtsC!RmDfC0?sGH> zw?dvUF$aWTkAqxyYK?wIOuY-$WEzj!J0AeC31h@ci#TxNMv&oqy`)99Us0N0t!e=t z)=W~&pmT=t7vNPH_{UJUJ7JoK6_~7Lv^xa7l$v0@$@TO<;jT8opxAt znn8)%bA(ZPr#HHLbL*F+|Aye`URL8)hsX8F>3DnTEcKFmma;Dt5F&W!`!~5h!!YtA zy;J+J8l|xP1X4wH*3F&-K$k)&pS<*Dm4E-u6+}KuXSF1C>Caf~qn?Q|31nv&X()Vz z6rPN^TGWB1O#@gnTVigQf~kVz1H|NF%k5t-Q+5G8>TXNO--I+QZJ-L24q*WSUA1J1 zoAKKRVb2|QBKk(W39Ahdt8?U_Djt2kq)&@!|AssHue60b*Al6-;qXnS(ui8jV3soN z5KjfqE0jm9b=Fo*wIi&tcrVT9>ShZV!A&5Ja~vDE*W3(F6(pwaok_3(%k4Rh@7niS zc=i<&Do)Idytoo4X>f@SYj8q(d1?$ADUf;!OtZxN=berd4-K`J3dfCnzh#6v1o9?T zE5_PFJb#2+bs<&(37%B4md(>|JONd>C#{Y#F;VsrDN4qYV(}w|}J-Pi9-H7ubdiX<9UvnMjf1m{|dhcQKn}z}bDl z3ckRTj`-5fwZb*m^j$O`R^RYFoT$U6H}k^_AwU{bBZaa`iq@`;ouxxN)A;;=)G*8ncIa z_L-=CWQu5L^q}f^DASzEsKW&3gnRblwNC|xI5C3oG84yB_>psFPF-0Z9FqHb@A+94 zp0XhYML;MPeBMF)SH1YUy`7h9W+_3*8TUXkQT2CpoT{U)1U>Bm%J~I?SBPMgw|NA^ z(>i_nxJ@Oa*+Tc44l_<7Tbz%6|4_{*`KGv2lJegH(eDTviDB;{7XdF5-X-zYluHUPP%67= zvGsuG)iK%R%G44H@yZZWzQ0WAK*SRM1($SV8GDo{-=R3))E25Xj`oJ0De)uit!44} zV}qTnm+DrDREN%>G#lR+vYIw3k?u@10I+DBkUQcW&GcmQm~(-_O%a;hnrCCJ=$IL& zgKXK~0X#=nGinS~=x9PYT@#lo4KtK?w2z%E&SjgBV;6d2WXT==JJ=HMIAO9kBw!w4 z8m9iV&NX;J5c5lfnTtQ;6rkOI_9sFB!@HCe6Td}{_shJ%0J>?RmGWIi_Z;p`1T&8PpH8DF+UffMON z`@lv=f>F<_CLn2zse*$+KHF;rq0{ed&xmB+B269m>&hMIEd>cd5-KzZe5+-RyzLmd?O9H$?o`LyL;LAhyO=^XM zHdU1sX@E)^V&&Np%Fjdz;z;o{w+k!=HqvxGcdxvwrC{1#(tP?9JNO_Hbl~?4rezgnfY!v1!2}OW;N*wohGtMpdzc@y(jshGV-Uo9#=o^kCdtcAfbs# zp_GL^KG2wWFKEn=o%pUJ9k4pk&bjUjqAl9;j~mTi=k;YI^+k=+02Jq!}s%!JHiP{aR;Ymw8{`NmRnXHi_DG3~`Qxm9OPr@2ISqkh&3OgvV-D!&;9Ic5#TvA)6<$xC>y5Get2k z#Mp-;V~LqaocxlWE2`<1wa-NXaFhY_Qm5rDIRG3^Trh@*1(L#6lN|!A!febzNj%{0lCQ%RE5?!l>nMr> zZX=G8AQZT#gyG!W#MJL9n*=n5jFA#rLfmdmcQ4Kr8Y3a?!8Yu7#udW5zIfixaz055 z7xA{Y5f{ONPQ|NK6tW~_zQ)Ka`e7V*Bz zrhEyx_yyml(TKVWJ)1}g1mK2hiZkB_Axea`1+J-gac02p1Z)Tgbj8Ymd3n*C*;61Y z){ULN%S?9s@#0TtC7YsyM)Q`=U+co$)3Ru#*(D;fQnAl>-Cla(T%Hv>1ajDn5VTE~lL&QC{<-Q`R-WJ-qCQrv)z? z_;YRg@_W!+r){`#bc%S1m#Sl!SaaT%5v4J!mBd{XBn?0L~70fod3K+wb2)4;%N zhl_byB1Nz46;nQgl|yxZI&s7%spMwsmt9c5kvjdmFwn|6A$~Ni{loW`$s(u(;*fC+~po-Cw2nKw+4a2#HSSEDX zd``V-wCf8qYx(S~@y`_ODDj9t+N8aSYt3(JqnR_ag~h)`5evs0S3wyzm^D9*@>;;E z1vj1xWrlJP!~3ru&YtbPc*;?CO=Gn&<}yDMA!P*~ty)_1jinpR52?y2ElsOY4M=E1 zS!6t%rZ!5*>bFTMMK(0}6_#c&YWGYo+lpC%&*|%l=Xu@dIXLoc@a#6>9Cef0AhiI4A2H ziB4k>5->OD1SsJMv&@w0b{eC4AN{!<5*HB&}ASHs-vXSpB zEFfc+vv@2Kf^n4sYixpHwzd6(9FtgzY$5qy?qLdrP~ocV3j_!o+oX!Un%=0kEzVI* z%aB%lnA-L)z&2g+TCv<=vSsmxnMm{m{Rvl)_f;oJ*Eptg56JQ20=kEICW<46>PNFY zq|Dgbv4y`{&dGUyiJr!23WIpnBC_c_Dt)$+uJ2SDx^XB$83CD=ql&bmPJGxm4vgQHQ}jeobTZNwYk*GtsH6(Q{*f8@tBJYe7)B?y*x6FmRIUHttytuVqRuXkenv2u6_Mk6D>}gi%Ga+4v7JaEC+cYS+`VL@H`W z5_pYaiaVDgp>b;|2nRN}Q-LFramqVKV#V_djiabv}t0=OUK6XV=HHGycIw(^}FhrNCs2F4CS_R!fFEpmF?df zSc(gU4puHK-sIy@1%OM6+gq7bVcd80mK{H{-%z&dct<==+wBDQJEi-b>}Ifz)$?1f zb8$y`RZ{*zF!Hf~fZFz2$1w1Lg_6rv8J$upD`h2Q@MJRC)Fq9OYu*pJ=o3|Rkq^h^ zZ_WtyML{}1r54w0wt*m=6qG#nQ)EYR5&E9Xi`bOj(3uNN%~;J7P_%3B>@2ojA* zv;+jfsEp|a%Cp`txsM(Oq3OZ|WBAS=fbs_}l`krp8^FA(@iEnu` z)rRkTg_cR1s-i963=>IsxwWd3rOZDJb+{W_$<+;(u_@)lG7LKMWCvL_ zC@0_++o};rt(2->(4*6g&8HiOQ@67Ss~EwSrE*B}1H}yK|IrGVG)C=!Nj^MpNvLWq zPZk%ObCszUA5sr`A(tiSLN4Hl>hYl9r0PX#j!F6yF=eB}O-9V)d`!&9!6r;T>NyF;2tc}QdU2V^&?cZfI%A$K2 z7Tpw;6mncz3;WIB^yXUcRi~Cyj|m{=o7z7+LO3cfX}jC~jQC~nmw2WwpHdkRaja7k zhvh%~m7yjI;cELg_0UKc?Qe-mlGUxn4CY&r@L=oIu35x~2bo+mMEG21$2QHDQ;+(1 zne0Z_V5j0D;u>1R4Y)?Pbdp^JEM{RCatpex(_JS;2O4K{o*HVImC5wAB(hIPnVmt( zMtoej7~zDatTuoBy9YAKk-FF%l=m(PQM!adRvs+U9e62$xa0kW#+Pi5S_c@Ez_E1I z!MJ}r_BIel?p`&o;DPc7fF){|lF!(cvL;%X*tEWlXIMLnv2=4}y_NVww1-v1n7&2< zhW4sEa%>#hF=Un(4-qFnM^uf0j;F#E8cXjrp@SX6Txd6qS|R#YgtxuzHNCzhLrC;} zx){h=E731D6&60(;&Ldnjgj1j=Z@@piP?kxRmj9cMngU>-$wJhm%bpYd1yVD@;9M? z$L;GkPO)TEQ!()#1#4qb2jhBTr;RjAif;x_oH`{jNlYMIA}jgp2<_fqyQ;?R?Ny>e z&f@nwic3*41SA(?)XNimtd?M1`!Dw#y2ru{1NK zM2$2yk;K$jDE1tZM8gzJrdT6T@M>`Lc$psg7E>=zTnU!Q-@^JvflVE$8a>K18&XZ= znsg9|9Vr9{X6H9K1t)jRfEI-E6PS%_jBQ6VO1zN(l8rd$ew;G#U$0GW>? zTkYy>QfFm0^^HpTO_YaQL~<76Xd>^Y$(rwf<&q66lNm|5Gr zQ?xgg+U>xipxr+>mp;YzCnUnHwaMpu_8NkPbhZ9$a;JT~?lp*4k2-@Q@~ZpiNH)r< z5vCzozJ`g{3QUEJd7>E;xWuzo_XQD;(33R(-p3}V@MHcK8!$!hDr}7)0pMR}BK`NX zZiJJ14M(|YkVC}12Wo64fbjNm;|_|VkXzZM+-;RXyedC0EHi{|$wmCYU4}PP&C*`3 za@W0WP+{~g^M!E%?Py$15m2~U`OE4VgPuJHr84eyNB0_w&1bg2`=jILyg2*ZM@8Kf z)@J>}{b|si%_=he(S`NKhvp3%O*R!fJDg&OV4$<5ZG~-?rASB^V;{OJf0dzzBTzDB zo*bs5moX{H5^~Bz&_{N7+P?pf3YGQ19JFX;ARq_s|J%gD|0+;%bux0Xw72`O2lXu; zOXrP|M1QjZ#*!|k6uwa>ab0pmNNL)RszF8ood#TjC<+I(5K!5m{@2UZb$fVTj>@0v zb#34HfQ+28kB}ZWJ5M!p@$EHVY?qR?Aa^(31CrcdjcO?zb#ou8?m-HARTa#Fv{4Yx zPu^Q=zB^}6Ef-c@R|Hn))8TnZrLsYRqh{KvS^~kX3OjGmdz7!gso-vmJqR{O`&kfv zH$WK(hzqBN?6Cx?iq&Q+6NUf@xff*4p3o*?v?ct zj%)xN2*OVKf%1aCm^Md;E&B%Jqnm@7`1+bDVCI?R^!oT<{9p%nbjQTWn7E@?me)I( zd{%y+u_?(+!Q1jg61|6RcpNL^h0wZ@bX}>TEJ8C!CX@F|W92}BxdiE-L9d}n0o{gM zu;%%R^yTINExHiz@@>O$Aq>_-RDC1#k(b$FQ_uDzGOr0qh`c7pD{Ifp;m{0}b@=0q zwBG%)NW>k_T4n%%=LjJVyt2BwV48cJR68h{>1EVhe(XM}tPKT~o zWf4fpQr%*8G7Q#vOdLZrNk{Mxz|He*8!%S2#A~RJ6LYl0bm!K5V~9+WCxk8(xRt3k zGm5BZggk)3a4I>PRzQ!s?rKGJbM&W>*YV>au?5zF6hq}^DT~33AkUDj)QrgWrT*N$ z92tKqH&kQ@2N8o@^*ta!A2%mg`c~KR)gh4oMb=yGE#fN8*r5|bW!N37_8nrX{L&uR zfE1MND&5PIqx*|un}#N4>4=_C0o@3VmNt}X>o2pxx;jH5Tth65|1M0R{OirvbZys+ z>lFo3P{Q;U=u<{QxFGlxM4*o|3s<5VPPW2QwzHxS#2s!zSP4`Ne=b)3a1;&(C8Rz= zO1=nhO!tnMIDa%U1&|CN)LQgd!9Gg&G55=s!q>45IV>gf0FogjvHx;Cd~^DNP?yEF zWAX44&7#1-CZm6_0zrq_+g8Z5ou(B(hhp&~r`N`=taD0SUrd6e*Qe@LQ9alvoUk?m z7!pHFtS+qMPX3NToX1%Lbx2zTnS0iDdh``@liw+gAkrk#YEdEs#rvd3|N9 ze7A_EY?BRWkD!0_X({3RNnfShO^a;l6qWOUBnveuq5xnHiPEAV)Zrknj1|DNy(MB@ z!TEMB;}D1BemCg-kWa?`NT%XW=8-kG0wx8A6(SOMT{NPKu_aQ5oCF4A>cwW*wEdoD zgd37C!bz59c6V)r$kV%2Sa?YqolvYvv*TCo*8IsyL+b5*6QN#oLD?&$vy*B}F+~nL z;9iV8Hu9w>gPZ*wugu$2rV z+35UxRYBoLF6&$c`Kv;M8T}Q?8CWe)pIWN304W*j)2tF|Ark$@pS!NfkmZ$n#EucO z(-kzREN6}t1r(G{Ey2(dGRECps(8zRe^?2*U@)b;ruYS|PHD)kPUJBqJ9swG;m-XI zX3NEgEV?oTp%qO-BpOlyL#t9$qJ$V&A}$!x!-wd+XVs8Kp&1P}Jz2WqBVErfAPd(@ zqK^^G4}E^R0%j)0PUo_0EG zN?L!hDKwmMY=Ye&x!Jo)_Nn3)-|tIQ{Dc8#8D$ax!KyFaBL4l^B(dkqV7{HbM89eqc&KI4qT-g!fGPRI#XS6o0t7uIP1B~BC|`GQP!-8Mv62m$Yx#$j zR>+Xbk^xZGBOX%XvJDV=q=iMDzE$T~K*j!DwVkNz64V1_Az7m}Qsy831yLZXm;mB7 zw}4&fN6`>hywtgy{&Tcv1W=e-ZKR2fD!9nZmm5U5+riew-XBra+Sabpj+ zio-xf8G_f(@-KDJ3Y+WdBkYO&TG#Z>IyZO`XV$f2;O(k5JP1UjAVMlI{{#fO3(wtG zLRETjG_<&|w-;*Dn!0yQ zdz9n~E*C%=iTzAI?jDW`jK-ug*54R)Pyx{oZJG?xx?M!oOlTaOR1IDmS^|470%it# zp8^h$e01r7w&$1!###do9bUqV>md!y08c<=aI-gy%H(uDwmph~yhikK0Y=h=!37B+ z#*!oR-VX|?;|T%qp?>1BE5{_LbU${lmKpkKUimz8D?)9iP2fq*{ng2gFvH9mIFq9S ziFp*WdVKt}ji zMBr2hF!i^mPa@oRjAGpOH6gy}y&s^mB-DC^>%d5d%`^eo+;jfho5jC$CEU z+Pk_fe#Y$`2|B1hE*~SrWL3RJlva8w9cB3c#Q`LVbbdO%?qBRE_L zaR`IBN@I!PQw7K_S?0hZO2wCeoA0DfQKc_b zBnv$8Y<9(dO&K6;e_W!|7ib}bby>Ju=^hUvwFDoAc^IE?_-TWD^+~m03?Af~p$=?K zLPg4|bdaG*dK7sMGd)C6QiipS4HMc3P?gy}v5J6t_&T^p3LlC1Sx}USNXcA|{5yl0 zwTAR6j9ocgD&3Msn=A$l#Hyaj%saeT1UVar9?-ZE=UGN`6mRu|dkH_V0{a8WeiA{+ zM<1a2y3&XitqPCEie${bkwSb?1lZjHXtL)QPB#g2YvTekX9LJzhF>lknHvC!H9x(3 zM~=U{rW7H>ihCL&PP{z4ZQy`}F6EK|G9OkjMX-FMEN!5C9}pu)1lV%nm_D5q7R2V@_JN)DC5(!od>s2hHj>W8i&%RH20+ zVEhz;#ZW=&y-7eJCVYH2*TDB_^1?*YP{pLE&-65ZCAR5tO6ni!bh0GIr(*4nZbmGZ zn2PR;lF~R$UlXCizCoSZk_7HDvF&P!!+$WE==c(fcls4GGu2(cWoiNr9U_Wg75ZRi z9f}VpJBYN=%Hxlhaa?it%Oum;sBHm9R`p6;f;=Pl%!Z?sm{C+DSh4fO6{D*Ob*L@6 z!l{1-Db1L8p+sFd_F#%_&G@6QOGXwM+6h6xY3^>`U1693ZNq zUM%}+h?jhX!poWli(+;}$2kI}igHJkQ=665`4m~D3XRl?5r57?;`GqO4XSiyKPPD3 zId<1a4rY+dxBc_XBOaf9HDO*kfLlJs2-uqj!1H#|x5*VVC^sJD)NY~MzfcJ|Pxz`w zoX6CFC@z*6HVNBumUM!@k1)whWJ^dKi<4117Iy_I^Gk}`v;`OW8!@1WTwIFQ1Io~$ zmHekCT0v<0%9LBp>1F$z{^cD25hO7G!A#XvT=mtfAe>}j0!rWP*; znjNPdW-#e(3rgwKvGT?Q2U<^XM7%kB-$$U!r^(o8S0r9xgFfiS0{9%i}FH>_kDb^n350^LncX3 z&;{#2S|bk_FLh5QXx&z(UVWKV<-6rJQt^qwCy|}*p$~R-XlR*$p#9OIAyU7nZ~;m+ zMwoDn)(xKVxoN{9?0hs4+}FX$bMc$<^irsX$=D2V!OudM3P+vGST!nZ=y3rV0RE3{ z;Jey%RH2p(z?zrHKQa&Sqct{1v3UT(ZSzskq#PIk_~dG%9|>nIoeMS1L5Sp3^G+ z_V#oSPhKuiNB`)SSnijJj&x?2vZQlaT3msD79e^H+&0`E+(u)%^(ZWrPbVuGgx0e~ zni77zoC_->jzZQtj*gAc&h_3!9^MXO1k$4J3MixIA$EQRcof84L_kGxic`_hQmM?L z>ldHBucvrln*;F$T7cAA;-476%bCEW=>`9*#*rIUWuYCCJumcf;L>g4MTHlVgGG97 z4ghhB1u6@LE&tDm8lT{=vUZiucG#cUEfELh8cDj>B?kK^$)kA?+r9+yS81yxr_Ab( zuJyI)z7~GmyOMP{S&JghxqUFmS_GZRP|xB*(d*&7EkLO8cc^Mw@exd`wjoE zFH@7k>(d6ld2&z)A61Azp_2DyNYn(3+rTqU&1SX@C6RW~y##8}&W%{z>Xof0OF2t# zNJTZ$SQLymHT!~5{_+)eTN!#Qg*R&1GqU#lt<7J1K^I728s8oE`6_|nBu-W7^0g+P zZVlP?4W_UCCq#RhOqSmA4d<+|$^(R-P@+i#_TKT)%)M=eyRWjwaoZFx+rNQyaXF)7 zyD5XWxa;mDnHu-bi(ZSk|8DsL|3(~QE;U7k>hg%cdiB`9n*_v4&0SX3z)2A@5Sa>~ zA}ikVzVx^(bAt|1#o~o#2*t$1bMkeJ%GFZHYV6NP;wcnYm1+d(S-iZ1gi*rg+@rHs zVyHIQqcjg3&Vtl&696i&txgAZM2^P|Q#6(_`tD=mwMz4=W^c^6*}FEySRYt`TxOf7 zb*&;>J)cH-jxq6WqvOdq>-nDrkFw@cEbTsegS&15z^rgo`4mrj+r$9lF8KsrtYl)* z?6Eapi|Z{(IAQ$HRvqHjL-R@>zb!upw-zWez*Q{CTJt{y?QoSEq-t$81)U?_)(f?j z{L&8teN0Rp`prJ_zE5L6MOSKmSwOH&wz&MUx_y-6&!+A3en^y^#DdaLS@jrLTj!uc z;8dMf%nwhe)63=-F&J^r_O^RU&?JOsktFmBPYZC9@U<^oSJZ99!$c|wdQ5Yf-m=*R zDaYIJ!1GBK`uVu3eOM)jNWgiQ6cuN_Jm4txDg&kN z-QX6Jw-s{ToO>ta-I6R%iImoi72f4VRJS#{s8v3P{c|i zu>8~^cOEQ*bfgx6N5}yEHCs%4OnA_*>`?{~q{v_aT${pML!QaAUkE%E`Mr8UpPlB<&%Z-@N$zV3QTVZ@tk*~(qSh_SrB?~KLB^;PTK z%lx%$T-?1=6H}a4-=xuz$;umvY9m?HWZxgN%o?ip#Gtv>SI?SB8;79N$%;rN%h zna9PF8$4%~qTjbP9eY0-BD6<&3s;039XO3^+qg#*!OQcG=jr{;IMK#ufbkK4u}~C5 zls_}1yF>8(oxgk^pka9Wp1=GYK=S+QbwBcJ}T=qXfCoBl* z0-AS;-8b8A8Mj`&J&8&R_?|}Nnwi(kJm#NUJAbV4UOJ`dyZD!t$aO90vU)=HrUb3( zItGKlq1w-mE(AW5Y)Xir<+cWp&p?z8UlC@X&~QbwS{KgPEC@XaeSeEgOx85Cm$dge zZg9Btye_?a`+CETY_2@B@9HHH=U&O~5qp1u0sKiy#rPuwC7%d0xLA)U{w!^e2od0W z?YMB>Ni85<)&1<{H4W9C(o`VlWPFe!te*>re(dqRxtA6Fg@oBf{26GXUoa|3 z`HP*ZMM)!pJMEWbJxLUZbZ!#iZ0L|CG|}-$$&8B^Y51;Hk8l&GuSp?37xu1-bGGTd z1$WWu!fH~lXNH~bgj~R=L9A<;J2kkIj+ANtG4GY+2)kKpq@e5SPGDa?k^N=;&s3_} z=6ulNrg|X;giWT1-+m$3z~M-m`&(QA$R=LCJNHUN2`>tJmUG^4JOr=z1uG2uBySvX zK9I^!AW>Y)`kyuf!nq6sDl59#sb+YLR1$Nk$L_DWJPRaZfmgf}Bjx3M zF{`%`)4Y^olfcwfjrXBw(gs}*S>(_J4~^hanO%&FNtP>F5i-kUfORWF0Verba19!) z)qLrfu*OVS{{wl$#i&&6;=!+cU^$>kPFNFW0L#uT*Q*`@_n;I|fn4~-oNq!1`Ol=T zNY4e&6pdlp-7dl>f$SEJ7@ftv%wbB?-gEbzrRfgT>RPo$gZHGrq?e#@yJ=%`hG!Or;j-I^77Ni}dc0$vz=UTdbR&xQ20y@0dKON{aa6jWUb+y1l0I=6Z=c9Y+e*UK}SJJuw zqopY#4G37KQn^;=F*~j}xMyk4BoGxo{GKA&2GCstxw1R)(NHZ1;#c%gzn%)XWzr+r z*k`2$vusn2?|TYk+I_UdG4JEuLC|TBwMJ;VL6BM8%4LzI-HDus8#+8^>`JVrz$qk` z%yzwEnw&<>MpP1UU+uMzl#baFBWg~lFv6}m(*jn>2HCWuR@@Ws*C+Ah7==8n6k@43y}-zqCaqi)A1#cY2S&IK;N%aw%qh^>8 z^FaFRfDp4|g-?Lb%SXoU3>AjNKKf7#uD}BAU3GIwP?(I*1^rmcnmcZ9di=OJPf2_R zf(r4slNq&3jDbs=B|GQi{Sgr)6p8><%@|0HU-Wp3D7hd$coe4;UP|DT4L=w(c23}R zMiYC7<-uZ{T%y8(F#@0$1UIE&SHDEO_~5~h24r!9zztOjaqCvgi9|dT#|VK6x9o62 za7Hj&GGbU+lkdt~Oj)GOG0P>*6>rVnB;p1*)V)2eNYnL4vq|nbYxwCa_o7eQml<3Dl#i_=!Z6j1S?FJ09~y)f08=b zuGLyl@dT!DQ~5|m*6rB_>)uE(HzZ-qm8Tq2x96dwSIV}J!FXyg@+!lyGDRSs!z&=Z zrnT49SDM<R=p&7vynaZALax2oUCTh|7XBzqI+ zD|c!%K?kt;YbDhVs;G$-*wBuc=xdsXahXf%sb>N{O(-wiJ^(+}^WPYjC952WVD}$A zM0zjmCyN)UZ(p)!+I@(=n=H!w5n{-5b|Xmacu2Pj>oKBIr2?zm+<4T}7jLaFf?6Zt z#GeEXKA{)D&<`}(LJVwCDC5)Q1&DS{&vk4rBG+xE@W($q*tgq}?&<_u9U+vBe_N!w z+7D=|3}3>y)s*8Ej3_K0G|x^CKn#%KpN`BEvr3X(IHNoKvcip&l4GZf#IN*2{*lFO z6s0Aau}VXzV7ZiCQVa!bHs)p|*gU&rMPpt&)omr54Vjswl@a-}LK&AEDMMk-i%|w; z((>e)&u1%kxwOK7>$?4=n|X}M61v!P3M}0SH_QOKaF5j?3%i0t=)Dj)iXHtM}F`zU7{g{hOn6f4&wTh7D}AsAnb{ewIq;sbAu$UBgl>O~!wk&B4S{3z)O3 zBt@461tzu`&i+r8ekTk0C>mwx$kMK`)*a3h&QSh=R;0!uybFQ}mkUBHaoZQeY14Rc_(+>%Fx$Ui5<%+LmjqwD z&+9haaHiViwEl;Xt%PukHc)~1(h!q_KDEvfF)N4Ab^J3*oKjJxS!l8wF)ORN9C@sH z%Q#n;YxWy08#>zIwtMpXmd@VZxWA-0bG^}{UV)=w#fCjF14!b*lxxJ28}QS3dL;`9 zfZS!UxBqV3deFflu>HgWLW5McOO1`@#(WWiDr(=ZT9#sdhJ2H9tt&;q^LE;TiK%@D zg9~*8*@~MaHiQ|E-T zfj_Ha2|@*|X`XQx_5mezs>};~%-zl#1+@fGFO*U5%zL}gphD#BwmNKlj!n=u>tGPY z1gHSU_vDr^=9ZQQR>fAS%mVM~>Z+vor;}Ti=+3H+TqG*cAOmd!nYenwbfJsj;5?v2 zP z?QG>Y7(!WNjcMB7h4>Vk zRwyw7!MF2qEmh4i)&N$rTAKbC+k3Jjl!4Hs9!lRp9jypa9s?8}2c#^+4I2g}M$Anh zm@1KYmaEWfw55HULIml8MGHZ7L5lt8?NXZHIkbf4S!CSJFLHrlsynd;dBsOs{Xo9l>zxRf|n5 z0)VgbU(jmZkhYKq6SO#R8SA2t#w$ zJE$eRTqTP&446UZc{Li+60fv;)fZ|-h}6*a4iY&mhdNJlN}m>6F-$E^C&n~1^&lA~ zWf{jnl9{rq7=lAes(p@OQa#JY#{J1p$_+n|ty$%5QnA(TYM?gg;>;XbccEd$AtRx! zviIyKeE1unD?O@i9)w$dDlI*Bp;xHTM{^se0zsKrAG&)%Vte3mA@FY-T6x7LhP1)D z+XCjO}|z!H5tC4WcId~XZ}L3K6j9bDwt))yUcN06nkNzB+9C(s_C+p)x-WY+~;TV zre<4$-u?SwDlafYvs{}Gv`p*v*r9@?rNMH^S9!3mJ`}31opvWnZKjo|Rt375OC7Jz zHb^Ga9w6E@E+y?wZY-g6*E2JeXN|Ze^rnwddyO7NQDsd@|4(%oi#QcccQkJe1$7i@Fs6E_pLY?9cN+O$7$atm?fGX1|F>8^)@ zsipgtlXEr7yUzCv9R?plw}|?&B;z7Oq(Kk3^H=^wg!~j5K`Q3F?ydqW=id3A&?_zr zmpH=hS_5pq1?4=DV0DT!7NDduyWqmaCHKpGB~0tP4Nag6$cw5B_JXuGzo|f9+26wF zrJ5PLg1r7l?G9nxL3XsDsj(3T8Tx+tVKgn#%&RFus-dRRMQcY12Eex7&;CtiV@}fo z8iI3$d;^=7)S9jOKV0oKa*RsKL5k;3N@~=OCzuS!SuTs+|K!E48=pMAVyfn|4(a# zrJaeX$NwfH*S?opxROa{RVv=zkP{e#Yi=CPTUEGNxVXU%uO7C9q{Sd6u&LEaaLw7T zT)(qC017V0sp;`*T4FCVckj8j#~F{ms(K`(q(`}mdv?CE|3UD$ds_YqU9P-%C2gzr z@MFPGg+Ek%s$Hq(kCp;EbB)-%ZT_cit9v_@Yikdd{;{}o588xQZKFLbUXTKFUda;< zJ|O-(n*qP9`vNUIGh#=6kbZ3hE>`9>Vn@ZH{yD8y0{z*9S#M)Uf4&nBvS*7`KesJe zXUpf>mAepqPu|Qvt*h8=*xcmH=PaAtR>OeH=Z@5_rOO(gGs6f5=I>7Aa6hYCkb^Ln zPv7%jJYfyJmMpp}t_K-BJXXKlfn2K^T0(vER`l3$7_0?ASOwUvwOQBoiW<~GiL};D z)BQWlw-}*+y%sFG_w^YkFn(cv0$p9-2-ntrB4In$Y61P*ZjriQy53tB-JySKyk)_N zL+NXdwE7mtv)`OotDo;)N8O4*`z(PGh;VwJ(m~h0&($OqY&o=&TX9m;Bz~=>?PHc;wCHoqD2W9JZ-@v~m`|xsp1fbTNhiuOX zaW>VW@z;417CiIV2$v35e+hs5ox!!fbOWD|~l^vI&_Q**3*IE29GL$BW(1U~(- zhB#{k6iPTU1dTEkcLP1#?r&~wj~*x*m$HyEUssNNhmA$CE7gM_`oSVfGTL5EgN>1| z_w3iSWtP223?!!MW6rqIS+mV%yDV;w7wm8MB{<7VbB8y%$DR7&I!wv{iFeHlah7iSxZD1kEmn>Eo6A@U1+Cjx9r zTBrvoV8Lwxd%@uImwU8VL#5gfi?ixUKq6vC9mRjioizDl@b{Uv34C!DkNoS+`Im+bu;0<+VLV+V51Xf z!+tAJo{_isz9@V-$Wq_oiwlYJRFTn8<}m?y?oMwX%7MBBY^m+8wjMj{2G{bjk}e(X z(dY+GheihDn*SiEswmB-+tT)RybqcR{2JPmA;&4`>~(Q-w9`%y9M2b-Rk-o7`r0&D zbhgj`8+~TnKB&FB+Ld?7Y-fyim97rS_d>P&!yY|zT?xtv{OL*7&B7787iaWvY6II!^u#% zY(0Smrn3k4t7{aYwt#323Pp>45^H!Zwq^AT8zNGS+|#aTOl^>?8rZlTRtL{5n) zL{=+$P{d`NaXk!aZFr{pGCg7R)A?dUlyycc=FqdbIkoV&L^j%uPN%-uQhR;2+kEZ6 z8Zk`&UdySl$RAn=V+b&aa)@1T%#Ur;0Wt?p56yOdtE3a5=?!&X-LeGD;A z;1lwXdxCp&j_^K%Qku8Z2><8nI=Y$?Q`tQw&*f5)p zEbin+5idl^sK}V%$g83z&(@KQ0@sFtU4>uH!u(ZQ)k4HX@Ei182=iSHJkqJ@{wzcd zT}B4{sX?^Wby1h^kdI6HkMdSeA5>|_p?V2+;&ZDtK^2*QtjU4)O z6WH(bVb%1IHgiy36}6jstVPpcAdkC<_7kd2+tD2?rF(tv|I;-1+2* zgKl(by1MMDRsCBX;?Pu__r>!kZHeeE^r7Aa9h?g##?#M+9BYYT&>3Qw9dx^gONICd%?xs%m zwjotO&9{K!?3;k8t#EHHGw1F!?&n-V)d3ECyI356Z3|Wm%*t8%GGOAmU#ED&AH2aP91?a@NKbkUHD(|bW-9P zNCgG;NZsQ7_|gFaflnja{F=WFI)tWmDxtuTE&=-2fH&Dvv|$@WV>REXCT$G*!c{O9 z>@0`&KJW{YA71XCqSR`(SaC?GQFAbEBr|MWejkECw8zQt+l>& zYX$S5Cc{H;0jJ}#8Xrq0d1uDjjA1M$6iDsrG9lh_5Gf~7NRwyKj)~$P8QRtMPJi82 zM_GHdyl$Ad6p8P9U&AWm2 zM!HWy>_()xGX%&v5Iro={c6=^D`Iot)=NL!Um&h;(C+U*hwt_y!qj%fljf{)s*|`7 z^C(@`qSB0`GEbHq(!p~uKXKVKb;RrxxC7QXqQx5gw{enc9geL?v`-zp?8!88l%-yY z%WPtQfCXiqHdYB*m15gV3x+MF-XMWa>p!pvZ5CDfw#-q){9c}@<|CGW zCcH=$GDtR-wjY-8@J5Y%Y5uw5buIUy`(wzwmBogR<@%vQ%0rUQpwPz22DahJ)Bg#o zFw6#C1h}GX))ThuiAmk@7Y5cFDxf}=ds-IZ{99$WhnLvoWqo!{7bB{sG|z6-&!9vC zc=EFJ;Lyuo`5kbWIYuP4jP-^w@DWLptwhnle@nq%JNSmOd&%31$}@>jJ$wJ{yO*WM z#TErAT@xMt(%ObA`^RRi!9fBtIAK#WBn>8^{=5dwd#?9$LH`TjuDi59E?09}bX39z zc7tRa7ua;Z0b$Z4$Le!IkosHHD&lWTvnCpnN5fFDaj2<%?O3nD8|Wz=5;2?kfVV&$ zW(kaq{t)V^g1!xAQCcu%lRsP zf7zO7RjMHo-1@J-yZG2xvzKj4x`xajq*DGcN*QDpz^>RtKXP0Vcph~c)1T>5zPO5t z9S0*i{5AqsHiVejxB7~r9$ob1lSAw1a6gh6yXj*czIkzdGipC5HSpRPm<_ZmY_BvrLt|jseuNjHyToK zci%`H+*SVE!SCM)TIjUGg}+ynggI8Gt0vvDt-#4aLywN6C7(&)ma{R>4XFVftMFzu zW_P)&)}lZE=4XaQ(ii`Whe{5s4=y(_hyV*doXu%{rhngc^YZvF&y{7$6!C*5k%!M4 zQ}9jISaPrttidb{&k}-d>?`cv1iuTmz*{ipnf7bi=d-}*SuEMN6h)3R0d_W3glPTD zD)4{9DQIFeJCLhA6(=PTt&jT&$-51SFNqDOUsL7vB7@;x^MW4fM@zP3f^8Axdq`f8 z3S5+=M^;_Bv**M39UUJsrU>Uy9bRv=T~^Q#D1)-u+7>&X52~gBebuy?qLV6jl7jfa zI4N`mFmjLpp#6V$!2VkuWapRZ4n zJZEimQ;9y#{#Qx>husKg_>Z!_7c+Vpk7q3WK9zS$lUzg%Fy+=JV(IW#TR zm<6}p7yz%BNYiprm{=+!9}?k6{Y#`XBTr8hnZ)W7K35p<>SQCC_i@+YrbXlB23|V%>0a`GrL;VNAiz5v|O>(rRbbvYjQ-9Xo>ZLh5A(8hT z%1`HUACcdzWqQiY20e=3^vGp?{5zfQxLM?A?lz&T@aR#T6qj-2eTFmKBE$h1Q6glk`Lv`#;}^h0V^Q+10)G;!kz=+-vAP>$m<*;vvxJ?4 zy|2v14*O{|Y4dFcfR(^XUS!siUT-Nm@Egx$i5=oUTu5H^EHIjHx*vqArMQoA#JI1G z-`M$MWyYMFBXoAc%6k^=)+{LsrqsW=fI3H47*^J#LC5BoDwJ;}d|49d-%sTx5qsWr z1DDs-iGf$MenDDW9BqoHE%6fMk;Vp)A*s|d=pPGO^)DjG7_fr ztiBFbVJl-tf5#pDZ%x}yAt7!VIz=<%$9Hiklow%hVazao$1)lUxWe870v<`QT_cf7tT?qAc|jQ-FQoXqZ)rL;~u9GimA5|R1MY@A|-&Kl=qD|Go=AT*k8 z8}9>26<0l_HURF^VZK=cwW$uXR<_zxqd`Zgu8UMfviD7TR{_rpugh=f4Wrv(v=7Wa z)MDCK4}evK^+E|gZuI)bk51ABa!tf|{Ut5P)|5^MCW5|!P=oKQV{6I0vBV$0E@!I5 z=TiUlZSEEDjlN#)+;h%?y6r&sxJNe^Jyaj5v0MTSqPj$m;&kC-1^Ev2X{kNkw;71S*nI(TC(GF@8recOr$6iYfK?7>|;@u)NMd-*MXF5D!7d zgxng%0Veq)$PVX>lGD(0YUXTv4QB!9T}@Rz7PE6NqflahYiHE4?v`)qVx{RShUMwF z_pHZZT4PD?Jor0F)XoY)@(cO&lxNHCqAL1nmXnNF7sX4^b!5Fas-NGbOCFTAXg3 zoZi^(=SHcuzz8lOxhlL~nB=t|v)(}#1oBlb)!Dx8I#h<3rP^LA4f_60dly$o(v5wx z!S5rFfEEsi$MBRG%xx!_y*B+dtecm9>H^ch4GgDHIR$A6sEOBr5j$P$#PGFg8K`l#!Zp;NFqx&X9V$2iEm~JDbj_>{^XLHS1mORz;X7 z1T+Sq(&(}H!@?<`0=BX?7g`KZWc4j$!5AoX@S2rk*DpI*evtSV-uKyIR@?Yxh|yY} z&=;>KJ#&p3&U*XS8sDMm>2sQq=&T}PQ59#GV4_0TxO6@HXe!Gn}JWtc> zph>;HwnB$+jLqDx&0~!j?P&GzD8AE^2+Zmzf`h!QD-~DXQOgb?ay!z?(i&53Wu(*( z*20zSpzZE;jj#Z7+dumT3tNBiD(w#qYE@83wnj)O1;?D&p|U=} zZ_ag9i7~~i@OuE3m6%s(e7leBj>en4~N#E#Fb%A`YKWuv5vTOL4o~AqDE1~-K7PD+v)MF9%9xX7D9gu~CG)nj7n!MA2IWXT468p)mD55uh+qqpN)U*^%9r7~VA6sap zoG?|^Agd{7Wz>$!%P}c7DVcA7Tb`F%IVfyr= z`C%HP3BeO-o@?Y5QaFGn@9-J?Q<`bjp`XxyY}qUokfx%LE(Mw5t)1PrX7kLgk2@da z1$ZIV2c4bBC8++a-ceGBF>GndgA;azgLh&!S?n2)?Z4c~XVmf^t1Hs+aEW<3>vmful;*U8 z&auHsp|Upb`U8IMa8n!3k%+IO23MIP`v$%vL`PTTXN(e&=f+NKz+R4y#ySesddTW} zTJ$PNM7_5Qkt-i`42|YU$dzEkBjl00A7+Pz`Ak(0D;kj#XoUtsEQAHuaA0!1b{bNn z_ayk>I}GJqHo0s+Ot-uVT=SI9$Ie6Yi+iO{GDart0gtdbPLzc-$>fUK%?bbaE zXRhS|Q~s?ux|@BrdwrA7rKPq%V%a`*Gu8R1inj#pL;WHLj}qBOaUWu+3R0)iTfSv= zsj=qg9$|TxxVf^8=d|x>GE0i~>|a@{Nkw|OhZLVyl3q+lgiEY*VsCbgISAIdH5fTsr&e%!cX;GZXmetCr6jXkb$y`g!x zoc9#14Y%%`^d3of{sKsOphbqq1J;`AFKvN5lO{iQiM93(Y9DV0w$m^gRX$BrjO|Rh zrV7yZS1w)I`@|qCH!ex+hxjHPoWrJW0em?#0)yozZ70U-*hgquQ!V8_4)1SG_MYbC zl{K>$-Ci+LE1hma3Py8&UhK6y^S(6!Sx6qu7tjArKCR6*1|D>8iQ9qQxEh=-d)i5yU6$ zsrPBg11wCc6~SH(6*r|!`~$*i7HeNVA~t~2Pw#d>Wi(w_ukzg**2a);m_y^;$%+4L zPtg&gTISQ`V`qql{in$NzQNM(6ZdytU<0oTcuM1neYmBk)pKg-tAS77U(1N?u~>T8jIe^ z_|Ga?Fm_!GDDh z5D<123psC>1)uR_@9$fz9k_wb)9Q6izxPTyVwVPbb)dtRw2fUKzO6xHOU!j$#Yfj;c zBVVmpmF;u0)NjXB3%s;Wx|(*&;53dl9AbVUm5TkPgv~cUfvR)VG!i2d4Y&Ll@1<{| z`r0|ZykbGybNM~I0t^vgjamOd11EkZWe6n;{On_*`#l~{puXPN`yaW#VVtJ=Jw3(? zOp7dq{=9ANd6-7{gPOEV?#C#BnL&cD*>KCBZ`^TKc$}f;Y^=naHF~@aSQE|!m3)44 zwDZWD?4OQ&=Zsspt?YKrNVnN^-Q~?Z4Rp>ZcU|SddzdY#zs<1%X3C5=pe>^Nk!}CP zL3z?Gkwj|7j8j%dBK>T3z206{5w2FcCVZqy>B;7P9mdJXK@JK#mv9M_{>JYbZ z=R9d+kpS(SKj7BRf;4ClL3t4?mYxqz38T)bA) z;%1pzvx_ATX?^4A&R4*a*EFsv-+W~l)*?6k;@MU^40T~sj(4$ypz)gpA84vOv{e7A zT-H4xUJN#O6Htk28sk2y!XbBD5mo%PCqJLrEN^fbe3QiudnWzCVH6A(>RzWDCJe1Q`4LWQjYjd#M8*3@J-P4=UCMfudnjit9;LT4=j?FTY9iUipf57_Jz_6#)62iU>#NHA^RimC^DVcr-8IKk z)40;R?$`4-dgRER9hm>E>G3r<^bYs}=dQ@Reuvu9y?)PQW#rj!+qXqIs4lpz9=gUH zuo`X6_yT7Z#j&xm^8vMJ+y-_!w-0rDlP-a#VJ6zoW#+m!e5rIb}knu#8KB@e>njR|2B&0S8O?`;m$FQx&WZYEFI%0 zJ6hQ0^rP!2CwISrtHQl0ap5IUr{6xJp+i}P40g6%N6eM=W|&E!#{yx_h*aCEQ66zYwt^F_JFy=t0vW+`5t!GTM72Wd^gqDh<*Rr z&S7-ou`GO&RNM}<62SAH;RkgVAPidJGFy7&&Gr)m>hDNP`qqU^7Rb)a333X*1hFP$ z0!F#37m(-;H!EktH3GHbKF&1ZPaq!adABeNwf*%`sCbY@p}KPydXU%yJQc6?fi3V{ zF}WcWI2wA;6rPk<^|R&y-PmnrzsPS5of{s$7I6WeHFEKo6Q!~^ktHBxk{TJ-xK@R6 z4G&{_ZR7r{$f6BJHf$||i!-ywlUchq-#4iDhGn@gZX^xo>K!ws<-%@Z0L-{;;mHLW zH66Jg8(gW9!tjCR4YE#|F_N~U2M8y87GPQ{IA4l+kJcVlGjb+i zYU4d49lO29bqCsp^5xFZ1BdKRU~Nke`3+uBP}fZnhlx{;z{wpV;96LY@h!&~f{$_y zw~jP^8gyO9iT`Wb?cKQv$gpQa;I>7A&=r0$9Yh#jYW~G$f-sw2fEw>gT9v5-4a+oW0hsiuD=itu-jc56T)2fLgYi9F= zohICz3^>k0O`_qY7;=JOUtbP~q}3psek#mkhSWhpL&`dK(+7f(x&Ofc$aCVIS$g|h zbKbLNi&kv-Xt0zZ< zX5<4dU7K@4d8#0s((`w@FhYhpGvYfLZt7Dz(UyVdA(RUcopuc52R~Q4SO~@K6^_&1`vyAKUqUa&EOhTg*K1B~;&kWj#0A=P~ z1>P6DxHz$B-SmJ1208hXZKv)n-Td;L-ScmDDFVO&%BS=-b1ER+Z`XE3p^YqN%o5?@Vq6LJco zjy)pApku#dGjL}Up-opltTu5`Sxz24abFIpb$V{YKC!m8Iy*Oac@slKT4TPH+#<9( zwh=j-)%&28EF{ipV2zdt&E1!J)1Mywf2PYu2&AR>Fnt zkMqiQ3&`ApNdCu@SAYlP{60M4lwlx-A@r6r&vWLzM+ll*M>qAxpd%vu4?!I&4K&i*9MQ{HRfj6u@aS)gvC8 z&NAbGrGQjlX;HEJE^grtAir&Lk4T}=S%e#@lTeXWq8xFs&3;HP;2#!-a7L2}GME*(Dh>JSCR1Geo*h`Ktsg=_VJG9Qk~YN~e? zIRvpXvI3E2PM#xTfJr@U&I6hJ0RAQbK|rXnBsVVYAeyFLsMz)FxrZ1Qkyv_TIf}_F zOJABTm=7l41^)x2Bn4;9UF#zFFQjW8*%?^|c0&3Lrk^QXIvQ0rCDWX!t|NeY5tI4o zyE#u5QUJHf5?rAZ1kV+mMg8vA^dwaw%W99ODxbwf1#eP`O2>vsCNd8QUv6Pv*{h;_ zs{=Sig##O9PMVU_RsRk5$+eJxaoT#qwtvjlOb7b_>&n-F0jqEpAN7M5A}#a^Yh4wy z(80|tva_sylPY5;7i{Ga6&;NwCv;q&j;cW9Fumdz!)BS>tlB z?cko7kC9$K8Kzh3>yj#w+7r^-*X+d?%pbWj<67ANz|2{Fi!$Ls47f#+16|`zE|5V< zgm9uR`ipVxyZ)&>mNynr^wQBA?vn@+kq+nvTO=QP=6W%F_5KTr)a3CT4wSxC=QqZ4np?rU#o7$j_d<52I^I>$4aCDs4o>zo=hVS;u0#v6CIaFSAyjejAeGx9cewPJvOV|xJvi1vSU_+%mGPae@koGL{ ziWTr{WD;0GY4rW%=A1Wqc<_ggq&&*la`AFp(5(yZs#8=fQI+KQLZlL5TT}DRhIA0l zf`Z159MdBlY;d5QFv2R}j~~y9ORi>(_ok0bCG03Qz_8CCzOjooTX`rK4 zNHlIbj-!UxvL8UP(ED{JPJCrRg>u^78hDZ5xYtk-zFXTK5=2lMlZ8}SA zR0}RV>-iC(gV^F}v{zse$p9z5xU54W0}1TKS)$eeJ7i4qs~dC;au9JB(Tr+|2r#^x zbKGv9D=p!xf3z^C1%OH?#Dmed@2K1GDi+*GCJxfsoV5Sll<*p)6f=7^kWlC!Nivk&_O zCk$4P~)#-hqgq(8~{%Eh>i;G_O~nztK8?uWN`mod|Lt zrVoUCIVDC^^VfU{&Q@Ht=5n-YLGcRJw)HL;x??j@b_r4a-@{b}F7#5?F$Zo1O2Ekk zQd-TP3jSR-;oKHSaAI-}W4TDQAT?*}gffTm!^H%DbkS3KqM!GmX$8GWTrh{L8J3WZ zyHvQqy{H}VLee)Py*^RqSS>vBouO^R0m{v13BN>0I=!{@Y58=Xm{yu28~_dVk_I-a zgq9mcM)eAhUpFL@R`-5w~j(ufStiVB26x2D;_=7lfoDW(~c24+3ojm9{o z)3z@5R;`a&>pjob&Knxr8O*LB?|KxxH{DeF)R2{3!LfWfb z8nF}7-qy=s01A$g%y1`m`)xpCCBY_~>*)#y79nVmhjleT#&i~i0Qkx2g4CNd@0Qv` zwnF}rtRhr(0l*x_1t4S|5i|6mM4oksyE7S+}@2p5Aq z$ukMxC@W2=N{wu^f_SytADEH1;|B>KG+HU*PD9l7A3A_<|1Uf{(}{CnleSk(u=YN3 zybH|R%@l=1Tfd|Ub3bk-#fT)Ox!a+>7+pfQXMkk;-O!tvOr#KWO^Ik@oVqpY#r-sL zH_`FFn0c~d25xYF)#Kc8IN9dWD|%Mqr?>HDX5Bi{Q1xsGMd=@$Q1Df(q7nNhW%lZE zmp@V#BOH<=+BU9yS6(}goiH3)(s||P6qzS!^h6Q0Ul_I@@0iNkgI7p@SKNICbjEAj zvs@!kt0->2EG)-IW0e;60&$~h5*KZo;$4Jj&YImXcTF;I6l9!eJf>kFbB`0yeN7P1 ziGe{d?DZVo+4!9dQlhLw8B3Jd7YK3D0rz*70A55c5swyMbQ1qc`LxeXK-Em z2$sNEEP+yie@7I#xaF05B7*5Oxi@vkq|@3(>zJ1VIh&Y$rm23rnEqA1S!`g58I`_U=2x*_#BX80)r5{OP6? zpDy~yi-iV5C&%%015Mge7GLf~JySxx;=WQ-71iO%jZcMj{W$%8m;}VNoXe( zrt4-rqr50L&PeuwX{=W*wG;L!*NcCr+e=T33xHg@$6`D#U`cQcZpjKZ8VY(iIRHQ~ z_EX0ywF&TowDTn}^IOtKtYv^!X(R}i$Yk&mY*Bg+SHJ3F`zWSxiPnrvZ1;DyCzBuA zFB_>f$19&nbu?ZZ=m{MG*Q>KKc&5a}=Hzw{A>$Q5vsGN0JEbr_!l{F%nHFnDTD^1@%ljd0vA0@BJ#wH_ZD-CBu#$nVM0{`8v?ia6-Rn0^p zDm-v!elZH9X%l&_G}7krDi1nUq4o%=!aw|!;K8_ECGV}0Vu zgC9AhzDS*T1M5QFKcu9wG8-)htJ(5G{n_`k0eAV$yJmA6 zz<&U1_Xf`(VbYu$#9@?}P|*YoDRp6gg#e(JsK6U_YxUY=7(!-=GvW#c+6!qc+7wKi zRSq9M2c*}Ro|_vYq80dqO3WW0-f9f33y=IZ za~QSYZ+ZBc#VQkR|=g)YUm!@h=%E#Wox$>~mwj+A{Vb`lkS1Z&VXW9^1l>0Jsm z_(2v4@r?7xk`YdZfAQdoRHq$QulkjK%_CdIVQ9=_(bQnXL}uPg zFsmCzYcGS@L94~qZMKCq@g21*|Ez)LnK&}L4|9TKt3857`GCQ*tRrBDjsu%6hK(xS zXtU|1ey-yURG6`v7`V1i5AC~3kRmM8=TMyuZpkACoip%B6Yi;5;A~4ReIN+E=&rUw z4bZQmo*RY9zN2kzP-L@-f>0UzFeK;86H+!(7~TmUCjT2Ft!rwMw`lfCRvC#$WnR|i z@ZVgh%D)_vhB$jeUROHCK=1#s^Y=mhD(dvs7S`~jn}o=sCxQl?kg9aJ>m+c=;QmQ= zAz|;7YnD#4Dlg?Co8gbVP;odo6X;Z`w%))${h%V(8bwXERsIp}r(| zG-oSR4CAQ`mDOh?$OQ7u3TViARMHJv=nV(-V)3ZYj8oZ34-Hm)AD^ zI02BA_H6UsQLRrSNr#6QT{xR&Gz;y9h77Bp%HFLCv{0+eaT@eBirKNGEf=H;?s~N~ zH>*$?Q_t$FRMt+#0ec#yP{3e?LhoebbRrXd#A+wd*czgavzx)%z`mig^bUWHH(}cy z7qA18wSLj`r1CBoiB&xNujLcf%ppl%z3$CGUvw12eAV-an;~d!$TgVM<`L-dzz@Obkt|^80$os=NSws@j=4Rf%ab6SVGN6e=H57(Zi)o zNSSoSg=-J? z{*~7$++QOr0?EXd?r0~6mrvB;zg<@GD%G(#`_`TmCPYW@e}GM$#n3UEbi|m!%&Y~E zJ7y8Mi$hji>XKFfw;Pwj{rksz<@?iKBs|^Obhd5zb&PSUjIMWQ6?>{<^fXoMlqNMkTe5CJVu&&}q~r z?36K09OtQz-AlNQAeJwIaV0w+ZGSAkf5XmQdWOu2dU!_hIIhe~$XS4Aw^Y?ocLhL9 z>>BbJ7c753hMvLqQQ3~#_@Ki4gl5dGPq`X7==Z1%a3TGXJGC5FnC8RX5suwmnZkCx zFaMg!j_%Vz$|uikHYy8%)IFnOn@u*m{S&bQk_0BJ0xNzDxmL;--J&yI<)T+$aaQg8 z=vB2e1^eTKH>$MAdDEav%!Bq@UVfs=8&U0yjzvAhsypeAL?EaRkl+1MYcVi~^<-;$};;bUcr5!Rhd!F4Dc)-X8 z!rPcW&3vD>i^8seUz;_EU4?w*FxJWd=!9@Q!7Zyxx{6mkj$~IX!Q1Ak*7{`*@o0J% zNWN~Gja1L5nvtbp@jFQ=@q>y4>xK9g*RSmk!(0s4czS6Ku>x#s>uW3Pl|N9{xr^$j zQK*r|3I>($Ohu7K4O`T2bxuLC)(l%Wm$9pAabZgpP4hvZ41>LoEVVLpzQ@pm#@vXveT&Sx5EM64MK00~;aAj-d2{lDjGq zYf>;I5Gs2*rOy=u_Zn2_#M~@}=-l#89!)(yB1c+v461|R9m0-r@fe36o!4sg>7Cw3 z=MApD{3-J9dO~we#|Iq>x(nZQq^V*`MsPT9i z#}zM-%Y5`R*_;*Qs5aCI$>~SERE53yY9F^k>!6i{i8^ww5A@kN+APCnk>R5rfK-8F zrh%cAh{14BF=CAVBf5Dd5&X@6`L^ihRkGGZY3=f}CnYTn7T0xz{zycStxC5xLaGs1 zgKj_R4>B}c7@4q-%BhBE%ylGv*`98fY6u|q&D#REEj5=fwK;j39@+o&D8L|G8N!B! zhK$AxvqBcrW@xU7VK*U{gO z1eMku1HJ^>Y0S?_Zaxxk(hk6A`y*9zdcjG4CDTP=d73T?46_WzI;Z)P2WlzMwqvc>v*$r?iNojL1Mtmh<^6 z(^=)`cL?uFd$4}s@xSNMgwlXp3`M_=jH;!8$I9|diRJ2<*oX?kX8D=$U7CP~{syRy zVDB@{uXd?rI%M{o{(feMTtSwDLvVww6{J~>91o>Cy`cpt1f~(%@yaAIlkjuP?B2Eb zM~%>8h=q_znH}(4mzWF%kH-(ciW27gI=Qu&Tnf%X@Y+2~)TH0Z=;n&BSHsLsJ zja)@<&W9WN-cQ75{7U=P=Lbe5%#&O~qEMdJ14Az-dj=AT=yj`f1sbM@GEId!(qEqt zc&xIn<<6nnr-5SV`^b3_c?-V(w34Y*5rvXy9VQT{S`p{M7iom(N83Z;J7ff+l3Ipr6PXq(lx?f&qc1R1)8nIs z+n~j2x$kV#fHL~;?BhHVy$igriEy{?F*#iN({n0>U)~u&HVjh{83LodzCQq67z&qg zgyM}&^}rzs?YCrDZP@duegmEUoQ?5`jvtJojiaZra{G45d+Y17`_9D_WYu*5M&UlB z!#A1gGDw5)ai0618T`kodqscHIv^#s_;QS<-)&X(3G*AQTbu7M$Vbg%jsLV&?*us? ziL<|eubKUbMsZhnOd&Q6ufEOMe@SXxaxlT;_nK6QHdsTLCq$)w)W_Yfg~s~M3jfXN z8$T;u_d@~>c}#&7MTvB(~2un9%vcP<71}U0RMQMa8vId6p8oxGQ59Bxj zTO(jo`IS2$>(x7fX*H5dM@F)z%5NR|kH{4`h7-rqdp=Bysl;CHOvsgskInx*Qt7wC zNr&SoaciR*-(Y0t`$RFFJGEBmrmUVW)cPkXjlJd_uVh!jBA*^ndB28K>)sasjjvus zIFJOTy4^5fD#zOy&qJ`k!`jR z=@4Yy5Bw>C;`|t|riZnf3J7{H2(C%EdRI*wU%$ z)n7a74Gb!Yd`m)ckMofmrOpb57bnv~2W>vP05^fAjeBrek3(mV3H#3KIq{F7v>j-N zd8=ajvokrNLEjkSUf` z{1-b^WEecCWVFQ(2+55S^_QDhV=%FauN_7|5YrfMDx9r$k5WT}oO?~=O_s})a17Ma z)1}?gRmBnpGJ8?)(g>@;O`B~^pY7Z(b4^B}RG-(nmZlSdCX@h@aJzn@f*5`4k0kQF zZNzRL!(q^>zK9_~xsx1IqEpl|xFDpx&eGeNbM!^4TtXAOn*`A|d#v$N&+q;g9z~!b zj)D)B(Njrerzs0lfg2#P{tc?u9w$NS2P4pk>#RL**H2lqFs(pEKQtNNhjFiYuXk5z z<7sVG7YnwUI;+IZ@j{cc`r2I6^?zz;yz~;ZGlq^t`U450;W__|oY{79{lIVjUu>2b zD2$b_MujNWdY`nS0tgeuO!}&fBv(9z9_wj{*E;>3NcRl{Rr)D`nIqjAVVPpHJ|fGF zTUX8vTwrZhWz>o=4P?v&5x2A~^Ir{ez=v)aTFs<=>04XJS}6ik%5w)%oyyz?QrzHl z=XUQWMMrml&G#tMAzmAY{=5r1osU~K7GIQ5Zer{|f8e4|FbLu-@AmuD1?22ma~4;q zY6KP55TP#KCQ6aDw^yDV5ozkB;^pEx!9f3mp$=lw{a`)=n)fyz+EQ|gaSNCyUK-T< zGPDftU8S|4P(i4N7`_-yC)Rnsx@h9`jj6QAJ4%VXp!7JEI#cI3c`uMMt>n&H&s9uK zhH>tyISJ%R9BH&5eFi9>IGm?m4rPS{oBNM0-Bo%u;|=7!dA9+WJs^lSEaSO-&pejp z^)4^A0uz+!C>{gO_;q#kqKt-nn{}*QbeHEpQ9+_1#kZysXh!~b)Rc)uTQJ1@lr^I1 z0LgsjRt@m7MfBb(b0=f#$~@zgC}=8j*RR{2#F1hGst6zPYE4R08A3W}?Kr6EMKv8& z2%MS*ltGR=2C~zjFH!OPrPhcp`NDCsX55K~=?XPO_iO&-meg;TBx?JAW)%#dZiUX0 zN5FOJKkO1VtYdXItI>R2=7cn5qF-b!b`|CnvGrxnT&-moI}%vP{KpkzUplM_=E3Z{ z26cBJMK4<9^>%e(Je6oy9T_!THc!e#roA7|HvO-=_tSo0fHr-R%w@ zxb43EdHpJvFRO+W9JcFvs0?}*Mi^X7iinh8#hg^8zHl1f2_++Pqxos(^rABWc=prk ztQ8&MVQ&?VnJE_PxfN!VD1{|t$zRpC?q_;B6wfpCzvqHuP=Sh(q%1P5#n^hjTFhm9 z^yPoUV)N2^6T%y#Z#fJxr&ckoT>ZT(L)ntMyBGeP7LNR{)d-r~I=Gb(fx?ZrU=O!M zQ52Z0K1SU{;7Z?jelHNC&q)fV$<`Y%chQOYy1|crqqe z2NxLhkyE0}^YP?g?9UA=Yl9S$fEuTA_w|jxdjPVjHLwsc%|wjY4)FE1l2H>*?Q0>F zRRFIVyYCv?O?+#@<$_XGPk-tkb&a%*dbNZ6O2XGZADTxQ&aH@fYQb2nu9y`Su-jp5 z3fcNaRZ4NaTN zE6qTh+DW6)&z0J;>aXVhzIv01!Dw8NaN3)_&9&Z^lL%4L=s#fP*Ol`_LF?oi140jw zUOQmdb(A#Q=TSKP-j{Fo&X~$UxaWP&3frid+2;hwm_}H8MzBX9G-GJxRJO0xPdArE zBWg5h_R0IO?p~9T00xf7QJ=aRYv{o!v&uNB6u3CH7^SzdW5me9irHq~s@=-nK%TR8 z>jYuCdz3q-nb^Cls(uL6lD|24vnyGp<~C`k3fUgl``fwr+fHGkHT*$J<>OM$Kr}c8 zi+JrH)V>jcE`t>C4k*>zAtALy=VU7OJZX6j*jFuS5WEL>4bnuDmBxKj4xvutBiq} z6BcK@p$o95Ui*MTDGjb?O}^#we(T zb}*RnW{&e-j(nepZl z{MYoYqHm67wF9X<)0qF97`Ewszo*k0(w(-juqpprNk2(u99+-98^DeH6k{DlAoLT3 z;{>${jPYb{*3Qi6V*+#!#*eIG(#I4Mt=5FF&o1OUsKzB)gFEPVT2 z&B|CpOxk6jc9Ss~aI1Xi*=%PxHn|br%+pqR}?xVKCN&47+&KP|8 zX=h-DY_CpM5%vKY-hFI8wXUVip%*A{38j({miL;Jz-+>l2b5QOy1lI~z(`pBo$o&V zg4AA4nvXIHxAVXt70E=$lgMQq&UuXkoe2si3@r!+A;~&K=;hrd^hOkNKqOyV@T)@o zfpM{lV-wSxg~^q{csTSrZ_d%CRm^Ok!;MugcN|Ka9@5i2;Wqj_P>K;~g*b}DPXt=G z5V?Ig;kU!vT%6NesGL}}^WWq+Zoyly7%RAskN_9-dgjB{4!lA!?i7h|xwwi!!${Wa z$jK2yEfrpLLt*pb&t5460zN*!C(qmc{QMzAU_S!?6Zk8{>+SRHj=Zn;+u`@;D1xuI zyB%Hb%c@NCIcwP?KQKVaS@d^u=CCtX%?+Qw4I@F6^gFs@c#x04nG?Bi$+bsKrWpQf z>(bERnYvY&B+VkQH(d;jV!4vS(zrfyFRT#C=U;?ImAy%(9hkZxfiA+_UqU0L9ZbGJ zeko+T7K$}6+f?)KM%JZLF?rY$%;9ms!z*8E+0ehCg-Z~%u=54Ng zL1#E;O0T0i4_AD=BL#^E;x(;VP~?GLrJ_%Q$&wi}UwH<%C(kD*@3=w{R^~jXwpg|R z8cZW142qYBvwtL`S$=-d4%CTDP~wD8C~sJ#r|HyqWb&2@7M0Et7|@Q*W)aI=oLuI7 zyCey8_X0yI&%x!2U%dr)-)8sN2CzdIsX}GJjc?0*jQF_qP0QRtNO*TX?4N%D|1X@* zzY9k>9UK5qLasO#lsCl?e`qk| z&1lIQvSkLGEg{Y%T_K530}>HX|Kv%SX=$XWWaAQ+|9ZLIsx~xvP0{Pi>NYQLmp(3CAg40!7p5)^*(M-a}2|8h?rgnc=o` zq1W88jn7cH1AiUSTGOqDP9Mxjn`-bMsv34jGqB%pAea4-%4dI&>+D^Zxrl|}K$__( z!EeFKd;B|eAMhJ}C0OO{Zx)0jw3CB# zxe#JcgFir`k%?fnAch5!{)s#(qluwEJQ8By&sy{(R72bd9Bp(d!xw}$w)Wbgm6>Uz zg5(8G6)=U0y04P97NNDqNUnI^3`|A4zD!n}I&$6SYPpTi?q{U)kJUcVja=}Slv0dJ zSYaHo8=X}zP#QbSOONu~kcJ;~G4Daqk&(Kn5V#NTMZhF!TGmu-H?Pr^$x|C7#i`5GCLwowIPUT zC=iYA@?21HD{FOAyJHmFH*u3Alw-1i;w@%e5%W+1;+ z0gnvY+Dx67u0Kbr**)#N>90k6TB+E`$Y7YhN-x~Al6XNHIx1gApJBgt5Wah$Kp-zc zF>;ip^Qkmr3eGeV4R1MC5obp~dFLvopqJFT<{BEjRPP41MuA!8yydwfy2gr8)2U;y zHxIk*#kFB#b?8721DFl90kzDqLYzAK&HCh@vBn4!w4MC%hOxlf-BNoF1x<(;{R0rQ!ISdShJH2m=gN34=@ zH?|Nj&l&gWfeI<5r7Yua{P(okgfJD({YoLs33asgWQ=dKw$pdI@kr<%Vjf3+`2tR; zMV8)E($LsQ=J5R#2z4eaC*($pHYplr?A!!=D88s*pYL?UVDq3OWk(o2oL10YagKLv zM|6}mh5>V=8BE;%NxFafd63eFHGS`2obNi~vN^BhSYC+wig8)kb;h|(h1@&jzKLvy z()X3LMt$7VVciy(%Qj%Ld;H{BL~L~58KfGzzw(DwJSgMG3w$LY)cpKcD7wjUn?N_{ z2{5>>3>rzP_gWrj%dq%gphIE>RlXAIV3lenA)9vdco9PB1qs1uUQ#9rcw@!^&ePfM z+;9Yv%nxB#cod@4O|7QJy z@DcfCIhEej;;$78ddMcxYWw(3izxr%!L;D|hL~DMlvL6p7w_P;2fiyhJpEQ@B~B%y zMel)SDnp#7uYDek6dAy&Dwsm3P2%1j;+K!}Z|+i5!eY~pYtSMq4Faugi`C3*`KwWZN!w6=)=`Q&znz>(8?tk z*5on0u#;R<%TVJmmd@^LvxZn_)=sIBji{BgN)%52j5P{q^Gbxa=V;shQZ%Z7XosLt zgNW5DJ+o{vUp-XkR4H?`31|2#*g^GZ2Io`4nAa=T4SP`tW?T_V>uy!=X0&yviL&}y57#_=%FRY&;RFvE>_k_$r z37i0!&q}&V({mYmQYz@mmR5!OlOQOO9@nMB8RNS%17C7nXG{R;s%% zK1|PvCmuLtQ`lC%iWPanQ`k}(%(=>QPo#g8a%LI?pEzY<%++q+7e-!-J-g%00>Pi@ z9*PNml#p{4DcpGwN*6ge{acGo-+KW+@3C5fh^_nWJ{vFU`^O$IdMjE_$5h=sg{f{J z-uOzTO@XtEF}^$S0i#a~XLG5gEUS$zzZBk_g{hL8v73g;>~+vF?L(gpeNTwSsr5a3AYAw^Db?>h9k~9dc3~@B#XLItT%K0xmi<=O1K{J@)Dudal_m zzaVudT8S;9T6O_33CwYFgW7wA1zHs#^D7e4}xpd?6}nR(r@wf^DVSk*@5mIJ4x|#@$v75J$J1xxcbUSdG+@jj!od}de zX?Pb?njz9m@A0$5f?fQEC^Jg-b)ej*Yn;K=Pg4}II*9O`@k_C_?ak6N;qd*)NeqK~9AmX5OItt`LK5B%t3aO@d%zq5vc} z_srEgN${fY+u-oz=gRO_ z-_wq=fC4&t$s8h5Iwi@C!nb$i3vd$|nl}(piC$Z@DrDyL5si=bz~O%h_Chd*Pm5F| z%J5@o`8iws;T1A`2kQ?k;dy7d0M2d;_p@9F#c&L~WFnB%8H)FklO@qPKr=u! z6?;SJ+?MP@M&{fD0(|$QL8XPKt>`_fkMjP(b0Y(SbK9m0O@xR^LJEg-7Fyw5ywiTY zk6Wp9L9^>A=u@6*Cgk@6zQkIs4&>uG5K-o7_@|)SR355quGOM-HkBuR$C_*B5XL%) z@oP?{s1k6wgD6CXXtRbeGeQAnkZ|%Q=72NU9bu{&vp3WZeloAOzpK9RdbudofzYx0 z(lUB-oihJcyaUPSIp2Wi?2^^AQ6x-Aa9wV&vo9#r$J)E(ATixkTIFMChsJZ8VH?PT z#1k&fIlSe$kL(d;A*ICYzmf@ri-B0#P@A=zbeSwS7Ms5AQEZvG%1DsvvnYk=Y^qmUx*T8t2M_V%H0Or?V-D-E;+xf`>N|dtVV11l$JlA&%JBjlo+Epc(o$YtDkfBqx&)$JH|N?Za8%8pxDXlM@> zyjPR6V71tc2bdKmnF|ez59KPl!BL1ZJRFva4l77(%D4zH#rgr1@X76j*Le$0%cXhK z?Vsn*AwSR}9hUl5^&G2EMrCXuB_a*U)>0aI>!q zuEOsmCVMRZwp#_)Ec!zl z>P&olcHr>O){#5(Em4DRL)pzw7Sa{nwxjmDq)k9d8ey;@6c5dWDSrWE6J%))+T zVy1u;N7l9Wwp!nqJ!qyWTs?yn7O}6JuAvWWpyQed z=!6hSHpTYDKPhv^gjURo=dG~YbPzi$2~pL@|64_4%MQ5v@ab<2eyNKru<#;0K7agD z#kSdhv3F|2zxt4tg#?FalNe60MKZ*S4DOW5JpJJWgC!?byG>aX7L)}0oP#9g`1aXuW*7+#zGT9A4Nh_X``7<2oP^uJ zU1Gius#Yv59UQ4JGpxYzp`Sot{BK9_kju9u!rKtrzj^*c@LzEGh_g-~SUbafyyT=q zmSahGg9T2?<;VGxHX+er>Lh3KT44e^Um*wu5Jd2lue|d~j`>=O5?d(u?w8HjiE%KT zn8Iy`xxg#(jtUWka+;QIb0lAK&iAR2D{th!-Lsqz8h}4v$ls;^sC4RrgjY+qp|Rka zN7r?mRBT#$Q%nTHqR|0i)x_n1E|S4f1e8?MwS3N&(D8b;R5iY(rM(toG@GC-wOq4s z&RIev_}Kh`giOkJ2^=Ohb(gPTM?MS~4r(-MpGthVUeq*UD^AGxyJ;ZoFEc=svte;* zXa4GS_6RZxSc#`OaQqCKgT$#Q8f@{V<`Y&c#yiU891P$Lt{J218XXi42Ny;F6o5qV zgw?4FM1;RxRBM6`X8Q_Aj6w(gQyl3gbNH$A@=?YAPob2#eJNmJK-2eZGapf6veAiJ z6uLrj^U`+MYYs-l_wPCkHX`OjZyqT-F0=nGdmQj|AdrVb*zk@Y-BW{PWl!v2Z#p|< zfKm-~`_(TmQS3_@C?(?mY`n3cd8R$Eb!j>#nII-Wd@sNxQOk1G6KY^YqEsNO#;id3 zpM5tZMUN<(fKG=jM|X!nz6AQx^mPz^_;|9;Nbo@awCNK3s7ZbUWxP`!JcE{8+pfLz zf-<%N0lAU?wy%oUiYn%M%P)WKi8$*BHFj3B?^XxWWpA=GMuMbg(PD`Aj|j}-t(-X- z7}pTtaE89Yc~{y$WF#r9>bwf-hCXS^!Cmer3;lKvA+r0+G|JpKHWo(55PnSEZ^1$575Z39EUoMj3#_Ut$-OXT{3= zYNF#JImnABf0Op_D@?p&CIXsLQ|WwLt;FIf0*F*RBW8}d$eLrN4J`~yHgN4>6-Ik% z`{GAyt|3Z!#hW=Od@0Z<(IyQMryzE-Qh3g!1?tJfWagy99v7-gd!d|dZBG9^!_BDB zB1|(a&I6(_?bYxwC|vk@mPD(6v7KUlx?Xb=;hGkIIaZW)j{FOqLoDv~ zyJ0AsIyO-k6ZYKrWL37!b#91h$Slx~@WCca-b%`nDBo-WZT_)k3|S%PVhZQ*woqy+ z#Ivpq>4=quUgXW56ANFWe^$IZ`qv_QwN-CMNvD}`ApCWMc_1Qfh~Xf%4g|yLQ;>TC zd~`ec@N440fx+r(4w0Yf40k8vHt~{Y9!1`j!?i1~*?p^I5~3JX!ByP3~`~Xt8OfA{AbN0a03g&&H-2YhOe8|%~n;0pTEYSLr`<@?GjMZ za0kRfFExze=F?MS=N<<~6v+`%LO%UH(QEXBAf}2QnUbcJ78dw_-$awk-k|X&AG+y2 zO{7evja|78qjzfS1w;oc(_e2Xx`ki5tLMQ zn0$P>C4cv~-3Q%SHo_ArUv0Y;Q~qlhTbHvSpe&nY<%kb*DB~?`eRyY#gnzKXMb^JR zGv0U2&JzX~eBZevzkl&%U&+Cg?a#h#{kOyt3IpNK+|3~os;7zFve)&cR2v(^Rd z2Kc?WsJ`tGMh*}w)p`Ze=Ac8jL^@fa(qkbI?^-QVLdCcCu1+_wJa$vID;Qlyb6|<7 zuYfXIw}D|GzSJc8$LeFe6@^4OVvO-*i(EYV?MCy(+AkX9h~G{5ybYfzY0Hz`sH3hH zpztKWxaY!~)#1Bwm14l;9scE^Itc1KKV0QSNE92~g!0wpPcPbM#9l#2lvHsSU!(;y zoOoS4mvcsv4VYx4XX~QYu2}=n8rw$~oY?dr$L{FqGH1%@cg)jb5k_<;mc3~(i#CrO zA;)%Eo@4KvoRqK!8esx;!;9L@R!02t*5cMJw0q+_UD^yV{cuJ$mTCIK5D#)NMeeoBPGr2}&feXDHt7+ST{k;}yHUcJm~-Vtq8kqd&)oef2_aa0oITIxj-zOwaC&tV;2TuPZOTIdkIv=tM#&W$+l1)-24SF|b z1*GRS%rRrZR4dUvNAp18{sS0#M}6adbj)eL@#xnsbmIe&h$Xq@0NV%(Rm>38C5SEl z1;x_$Q!d7uWVNOoL82Q$WRW-#4fgAyF4>NIC~w)BhiCWC(eeNwaK+kzx36Am?`~*+o2Rjz4CmcjwP zHHnw<`FTqyGAhrT#@LIRm?$hAQ3{8VL2B9ka0NO-C6(bxvO%wfxa&E}ZSGEcdB}#^ z>>%Ilk2K<^3rcRl6lRFy3Qry20pX#$`bM=XrJJAfe9#o{TUXffESbUqG6(o)iIUFn zrlJx9cvNsX03!RX;j|=oQAYK<(KOgSP6B{bBL^85=>QT7 zhzOUkBXR_OuZgZ_df0oIg#}p=c~+#kGp1|-%2f>DPbl=h1UFioil;S)&*A=u!MrD=a?xhOp5hq zs+#heEG=XG0-U|eKuBpcWm9ue9|<>jpq@*9S4a{#?6Wgl$Bq#`5e1puM{vl8i_MM& zBp9=wOW@AqY2)!l(2{iO{q7yp)j=#Fj=T;tKtiUf(nDTNS31nY%8YIWsx z;4iEWw5IQ%u;#x`h$UQj#fNLOx&1HQ!o|P&A->ZG2X^qKhrgkN!QI_Na1Ivb)9J`p z@R$;Y_f$_0R>f(V!2Mt?>nC9Q=g&G}hT2^{R_tB7tG;f7lzxjmAJ7A>QGI&5qOS?_ zi{qqOC*})&pz`bJn1V*0k{R#J&ti#pq~b;S-9aDNM?U;B;Y&h{j|>HT8$5GCGbWeV zzb_Ul+b39HJ?^*Jq+>{f96_PDGRXEWBSiM9Ap<;;wMYSz4oP?6_nP)yNImG)7wOeT%x9`=eiuS}o^ znSJr@2L3nfmXZbyqE+SsumH>cjxG7n{bu=G0d=WaQgI|4orN674CI(24p9eH7+{14X>c23YW9wzP*!?A060mfgH4pK|ExoEy+`}u0gl3~n^N#g(F%4T!6*>l`QGv%LrLvkg+cr5-I-eZddyGk zzPa}HrTX>pkyI(f|Hx!mx0GmrV03oSRwZb0V$-w zQfaszy%K^#`^>k9Da345@t5<26Ol<4bdh3;==sl}A|Mq|Zy^n7f>}i(KiLF&5$lY-G%|s8^mACc2mg`YE$Jfwmi1%% zz`Y=w){F$y*Np1=@j>WD(n#`=$Oeu(5RL0s?|+^dn*F|!GK$>pG^sV#>jWXllWdaB z9)@{X9S@}GOg2S&nEr>bb85~sin4HQ+xTMJw(WFm+qUhbW81cE+v(U=XS$|lE@m!f zs@^|v-cz+}oxRuEPn_XVUP1`EMa9ank`)sGr+DtPTY5^0RYqmw>?F6h4rsR8+?<@- zd2hJO5BTeCQrs+Ai~zl559T~;M4MnH6dlbDy)j;vc-XPMkM7xOb1g+E z*@1HzRj?cFLjyh>&CkOWMPff5A{km-#rYuSqci#m_F*5Zo>4^kO`cV8%;6ESsLYVP zo|q}5_M_>vrnX1tQR&##te*BC$6U9SqU#_w+9=DO6^Ek#yvg|Z6C(3QERCE3zCa3> z$-`c0S5x2Dvi8x(GfEOND(Xs9h1v@leAZ=xUfh2$6Kb) zqt%AKr?a%argf@u!U<-L=N%Q8i@qYxRdfnMoR%R|uIDayNs!+V_Wh+c= ztH9{~0T$zNrZSONwU_X`VU42))Vqh6>G72WtXi0@B;7FE%moVU;F3M}a1@|0TGvmxq?cw}9 z5f*}`aRUTHj+9yS#FHnIo4^iR05kh49_;e;i!67ND=${QJU8Rg;>ZLYqX{CU{_K$C z#~ZoxwTvJRcx3z9g5}X=O4a;r*YJ13Pz0bH7C6OHCH-m)J>NM2?4+oG{cDqb#G-Sg zq9*uvVd=Et2lI=DW*~v?uzyIGyz0nHFT9f|baO z)6e^mR?S5zzcDxxMU#YJ;KXlcP#N|O?Agi2HaN`^MPW9?{*ca8$sxG$*Ih2O$0R;T z+!D{mLI^n_bXgoi{O&Do8(~R1rZ&e=z@B*?CwFN=9K3)DeK2NLl52!7t3tE|Ez1?D z5N+YMDf(*o^mf-4f9AxNHMM`c}5rW7@+YZ< zCJ)|^vzg3X(~Ene4;Ld$tLOM!?x+WqoA0a!A1R43`G8Dg zTCQ|sf{^NLP#;BdoZ=2Y9nY8e{aH#}IU^~fJximhfd>b!ne< z?#yC$THvp~DkAX+1$%q+=pp!S--K~UFhG9gm$l>{YYf%Pp`P2vsi(__kiNE7XkqHW z>&2wQPk<*7y4n4_U}5`yGS$*zK6FwRE9JAD;Mo%P=6L+GspWfbVlEdNwNI0Pu?&f| zn;h}#3L4Z5`-!kvw`(@%{iy()0!)+s^g7SHbt)?C=0+bXb5dhW${R zhS{@8regp0h#vb?V39+%QHvx>n07XIBM2rj}>8r+HQyUv8Q)9o^r;^BRH?RQEx%D;(5lBQcKlR z-KzL{`z?H50eun-J4x8xs`l+mi-p?P93n)J0<8kR3Y}NxtiqTci2(R}v6M5ax@H&^ zUaod^0;DEv5ZD@ujJL9LE!&ZN<1z5&$b%EkCOf#z;X83z?^$EE<(#GI7?gscN9GK> ziesmNgCG}jr8r40BD@4nr}+UGzsDp+d)P9eQ(#Zt$x7&zThvM+szFHhU*^_bx#c&K zzpR1JUGa$);wpm@MPY#`t0}JZ;%cGo4wvRrCa(YK#`bKLAX<2Sp_xjeS3Fa={|uF1 z`F*GXJcL1#;_|r8u+DFYRUmOYb@iCH2HLs|xi-(VEL?DmCV$Z>n*)($PPq2?yjcC^nQbf-V6QWhO&mAxLx%Ds8?R$b) zr^3e6X@^!GO7-C50NA6%SG|-6g$1&rT3@A7)gqY6z+Vq+?$`muVQ;I0V*j@DK%Av% zl=^_BA8?44`Eo)3qJG#_0xz^h-`2#OiSKsG=w@b+;AB&PtK4yvP1S1gLDbG7!Rv!f-{bZqaPS2Nve zW2O;jpq3_0=^BLBYSqNdE;?d>06a;3v#3UV{D5=LH>Dd5X!!sWxL~W#iXDdvhyG?i z*4xKGv9qRpP?NE@Zu@{uiIkeQhHSe5r|}({jjye*t7$zyR;+qj9s47;G4e(i?pXzrokZG;f)lz9a*tct>Qj)bwtSwm~FB1 z#OPYeQ7CX!d9;^?9ws}?bjT*D{gz*C@PbXiR^yfrqC_P|p*!$ewKjrU6=cKWD=x*= zl!&R5r$)WZ1vR{6%D67JiWn(T&ntyDiFe^yrRZ;9wLIh4>{a7b;yOkT8hi4?_J=`+ zy2&(q0O3sy_qCB)5A40B^dfHYV8Tgu6AG@GjfD5J0hdlM=+IA*ZVv1rTj<)evJ?aU zDNzSWDW8}VBJgooSUl&!Ip|6J;jUiGP|buj5Ci!L4Bh{-gc zuc~7|6;Zg(2nUpdJlLSC+(v{h?dd_h8D{HO<_ zTlVW{xJ1U#VzZ|o)MS%_hWSKR(X*&FWp;6MAgU$mVza6_`|ldhLnDc~7b(1mN=~Y- zA1rUu=Hr}(HIz}d@aLQyRjObXM7Y(K#v{1o2Gkq}gIjp^4rJZ8uDY}#QDC&UA?)n{ z|E&vPVfuz$mxfJe@~5F6HD1&hJWz54Sj>{5{%D+yD= z`zW!}vTg6QBrX;)%NU<}Rq<`?&KG7$rwDYKXsKS{3I}q?DGOcs=fW{XhP^tpi|lY> zQc%u_)_GGO1}8ZyZ3C~IXf-we5xv@lz=)S-YXvZAgu7VkaR&{}N{o4fmnW#qF zh>e5*`NHpe#35%Bkj=Rv??vSUz!E>Fpdk{n)2!pc^u^!MH^# z6I;_vt)a4A-r*9WjY3{xG(%`V;1Kv8_-IDo@nGZ%LKutN5xRN!$Q*u#kNYlzSuyyT z)(WekizPrn^z1cgmo$71^5Ze<&3t6lI%ZvfetI*5%NLjY(gm~WM2I}>>UB-Mw8vUA4*P=jjP1$Vkw;Jl?-SkYm&#gy_E zhHver^3rb;BCoMP`Gd^e{<*QoQY(@e!3cVx{{6xQCZ>50)fak^O>v*usU`Q!Awn-H zEI=L48yW$_L;M2fX{&*QcwlIZDyP8ppsY$t!;~#^Y}tEl>UB9K?OlDz+j$CgMOV z_m7B>@GBt%&3};)q={diLnGcWED^`Z%QlcJa}^tajc-_v{GbPs{%2-L-(-IeJDA+$ zHrDdM8}&SHW_W0zQjDA)_9?Z8OBj>YqTXe70`!b}ko}G(i^1XgU@aw_KrKP+kjNH` zckOhCm3otXKNl?Nk6#mKk{27HeTs1^>0Doc-CXD$oauQXXGf~QK}7CFdroM#0S5s3 zq0mD*20Qv-#;Ppw)>_iygRQooqm<%g68LqESIhI8kr@kt-hZOr%dD&D|M>Sb{aAPZ z)MNG0*+Yej|6!6XF1(i~dO`<&m8(5{vYdEMfIl^gLgGDXqh~C1(M4CQH89xXE4ro*32E5MYkixx_mDoSGi6859B;{ z{lDGw1xoWV>99aRv;WM5EdP(6(AnO`&D4p`%+=1=#nRr+`M=zSE!x)JOYJCsX#j-m z&>qQ7zw)_gIpr6_Fkn)2_vZ;5Y{?ui*9V-k!jgV^Sx7e0@F>u7`FzHUrlu|EZ)3#i z*IHz9BZ%Uxx?XEGDWN=V+tM76!|VTkS`c_r*+i{&lxwje&!NWm#U7zWJam*_`&G7R z+a`Kk!_2BK%hzZh%SR%GskpPl7BWp+<;ahP`LE{G+U}hXderTNw(xn|Ba+Ydy4q|V z)v|?Od#*VdOn6xm>T>54T<_2OSw7pIhCc7M?j4%l&VZu2uEBS1?~Nlzg7tn{;reqE zE)*T-2910PrP=FBC4UmCecIdE%xwndDZJxo4md{xax=5!3dY`#O!s* zKr@vccU&d6-H-Fe_rD*}o07!NWRRSQplge{8f-zDNF$qp2h{c7r)r`|ghst}_1`|R z5lImO^(9~QD?+B&ls-yguDg@}vQ(2c%M}jGG;Y^9D!R6hJ8;pZ{eD_tUS8H)((kNP zyv1t1EEwQ}f3cQ5{)s=XyRb-C6YNmH!`24{1EnlS`Ya&$gf-|TnxRMXoK+)~In$ul zg9a9w=e$1j5`4+w0m~Hd;`Cf@A|UazV4hq^qTW;Hqo@7#1+c1iNJmR|QD^)OoRo}zg%z6hd>xhCfsiLl zkd|`%Orn&d5Vixe8m#&8$TL%TAv*`jDM#;dwp54Y#^eNb$E?&rM`yOyuXW;mzHdAO zVnefDEUC|{cCp<`Ct)DGKF^8jERli_$alt6bAoUJj&YH+MtapF{w1Xka;v<_fs2M= z+8|CtP&pfoKncP#OunR|8&c$)dIM4cDs5FogMB^yC9~Pu^}C3G8(pc-;p%Uf(>kI> z-ZF3fCt)jb{@oO8H5aIs)A*Ouy2#kLREup|b*_3ND+smrtX!13TPk5C?I4r7bfpew zq*rDi<5A;F&gQ6{+X0~>FmVC9+ntrm570+PuJ3I>RW7DHUJ0-CeJZl7xnokJb?Gj) z&4{=ZujzB}aP#w!p}OA=xUr`< z8HA6=%y*oRMtMbkApedh`W59ettUAx)BgLR?c#)WoIpM{I`ntU2z?g>f7&1rU4(>% zGGuy4O8n`~q0y!3)tm^GMI68(oU$jhZ%Q<)zbg8VaW1zVnnd7f80h>rI`6ET7O1{I zGCY}WGT*m~`QxDlTFi-7-HxaOp-o=UM7Yo}8w}bz4&3Z<{jCkbyAPNue?m>xA}J9> z{K7orXcA3@A}AH>Z(1L=O6I}+@#XvxbnnSx5uTBarKBOewcidzV4o(6dg{ome%i_E zyhRCz+A2IhfGErb#R2>LZU(`?2!?egg&&gdS91|&V51GG8lG2r4{CXezXS&` zn|`rmI`Rg=X{A{xARAspUqR;IofF`Kuf=IcJ>m}2DHCa_U+~%q1h%bXDsJK-HfR(H z%*+~E5Cs^<$_TJvrHE9=5XglGGFA9O(mrXM(J$98>DwVCNdiCx&o8u*bA}tFgd+_d z4u8n689A*X0~%=F6qV*!gNyvd#lJCU{phz^uTJvNa-%`W7zyL{ z!nX3KQli~?Zt^Rw+SO~8y_11YD2mWPjs<24{aTc%QRTQ{vS8-Kev}{WtdkGaQ%y7M>CE{jAAZKkLs@b=319ny`;J4r75>L&Cut88s2X3J6Ofup zyCXZenpJVNwL-;#*oU-cF1F0w)DkuW1(JeFQpTfYLX&!URZaob7;y#U-8`edV5<9% zV1S8y^}n-q55Ll}T`kabX3Q_xpGqKsf?{PYeRcK3$Tn|B4|&>I_8yQGJdW=P)H3&z zRES5nW(2)=)!($x%dCfZRf0cpo|noLqJPuNfQ1fl)=Nx7>* zl#9-Q8Owe{{;{f7PTjakdQ0%aI$m$AY%;q>yvek)wms&s(X2x{g7-t;1bH0S`G(!) z2<)zw*iDKL^3T6L2J0cijoH+-Ez?@YR?=zzyyI^DDi)W*i6i!EoDZurU=|d1a6Cf=*)hS3_{Nrdp)s;LCt%(m84s|sG;q+>m+vzGmG zPSn!So4VxLt4S#MazP7~k&V$f+i^d%Klw#P?@fVc*+ay-lZswV3CMT)*Mgc@)maP@ zC}qVN3DR3$oytn;OQO5U+QSuN$3UquT5xIWC~)oA9QD%BhhlJD+4K_=ZJeRanFgVi zn@34e+X0w9=qy*3lOFF)2K6bo87zQ?!%SzUCa5OJC5RYOmj6!V0$7|)SOAnxnR^ll~T^byr?e^RT+ z2YTQS;VLW)^tb^B|8NMhXwZ*YfD3c%H=)>FU@+M^catiGuZrua6 z{2K_AZs%Ls87vz|M=I@ zHj8=r@9Mp&_LyjA%Z^)-w#b|6@rLtaYr5A+a#@S#*x%Fuy;9ZUe9( zyax}17FIl{g5S;2`~@Ak1G#lD*1Hhm)>Xy_$SYj!z}5LO?NfjL!h7BR+ghzVu-2>a z@IqRhmZ#0WcYzu57G<~|n*Qm2IPDF5PHaQxpP(06<{@vQxQjF?4_kTcqPm!_tK|3Z zXg+Uo!YUZ|oHVeSCrcF;D{w9_L?pMKL8MsJwWA_WsF?yAd5W_*aB<;yobF%sk#PCl z6JW*1QE3LPu<90ceZoqq=~<<&jhXS9*%I{B;q9z-@_z}@fP%sU<6AJK?WgP#-nKTI;jaX2 zwkqE%w>U?n z2JjyvW*5C zdSXG8^t(W*Xx^(Ner9yN)=ZEgj5)onqE1D*EPEPB1gIh!0cjJ z-vL{gBLK&*s6A3UU2Mo2ZG$y_IGmOy(CS5O=x5QQMSWjCQG&*lpmYR`^w9{MY^v~n z#=7_*1Iv&Lfg+i+CqTDo$Ih9+v2N~NY>emdYaEsnu{+_>ah`vFz*a-qo7dy$+Oaph z%J(+p5moa(_e-In-zpw5InD$OpV$(Vuc!FP6o0k}ff_sxbQZCjWp<4xiwp}qNxD;N zi1;*o*L!v^`R2u&z{W-KOqQQq+$p`a9*4#@oOc~z)AuP#bT;N?7rWbF8-NixfoOtk6A-hr^BU-pSV| zeeINPktreH_6UocHQ&5j4rQ8d6kxL3)x@Pcl46AC+O@}AcQ()Uo?Jt95o$K{xFyqc zn)t|d-vrZf$SPuEeQc#-x_}_JJm89oyFKjJC&KUB<_RA0p@yc9@plOw--p_OXBZZg zuaw>d{ObYHiDY6gIH3`3B6BstXE{6rZ7DzI`hJBr#RGlVW6M9y;Zre~E3I)LXLYBtb6k3`O@?C{Kk9N{;Rtw(C};xR!C#$LM&uS#UjPn*m8HhhC4`>F zh`>&k8vNv3-s03Ah1jJ1vU_kC%DTqVXHY0S2Ez3l3;m5y6srP_#wr3g3B;G=+FKM- zvd`|W&p~EhnxGhTonFYIiq{Eh#BphN0L&FSuwo!kJs?9J*%Fg^}|;L$|n(1;##oSdRXh}}VI zF_r+?6Vhw)e0I0-jq0Qw)#|PQlZ76@biS3-C^$q=*(u0Yfp(JGPUp;Ap=(vKlhye8 z(n+-~c6)U-E?2y(BoP=jE~(hjCq6p$T?#3qeYOYUrfLMxex4D#XI15l_TNp#Eu_9& zbnU`Lu(Zv~IdSJYWvl$F&;9z&L(w?Ytvz9(#Q;Syh+drHz$= zu4(tVtS%28x)|!y6|!}{7Q3DE8fx`$E$DS-6kPgSO?7spodr%J$McQJ3UUM_!RuqC zFCI)wC#HSKW67Iq;yE$7AzEKXORK3>ZQ=VgtUfNL`oMl@YA?|PRkwxO9t$HGnrhHKVQ7)n{h`B^9mL4lA( z2qgo~bM#G8Bt79W!kA57atkqRJj5uqKa-aezOa%lP1P3E7x1!aE|y7hsSu^dzU&SH z+~I7*oL!3CISJr)Rr#wd@nQ|ya@7S~RxTUmgM(m`Hs-$>c`c?@xO2X4^NZE17%QN>x?lVN_Z5vKQJzw_F3C#P5Yib#S z&PX{|q@Qt83gkve2hs?{m28nR%&Qp!Z*O_x=OF1R@#mn?>K4Z>X^eEUOGj4tuGb%< zURLc*@R(^dg=knf8$QUWnW`?&B4%AFa(7bJXihDhGOlre6&Vsrd_zcH_oc_Vkf!JFLLr zY2xDpa2!WM#R2vBi)`AN#ihelXy8GX}4j>Fo4w8GgLg8G8LgA9tN)tR} zdfv&HsBRT5qu4>E+=W6ba-tMEg9UF)Eo!%D0z@*1n=%LgQB0}yS5@!@T5+d|7DS0s zk10+zTuN|ZGlH~kJvG(8u3zyywD04CQtW)we&WJij{9t4wW1fo{5&X}Hbpk{Pbhf6 zC+t(5@m1*&5egGS9GxZRs=Y|G1J;%$*tVCnOv>~k8zz+;EaV)$y(Rb0HIP)#6$Z3@ zgdi&mRjujk>v{wGX4tAOk5>+XneuEZNfpVH5g#Dgm7tp(Ii~fVZygD#i;H%<94z%o zgh^y7tgT27V~k5eSqT(XO67Q9P{Nw-gWolfrbeDkbq;M0xQWhtSVzY zCED?^C*%D*^x2f4G`(dhvCo!J3^($;DbPJX6pErZ*Dm4j=z2 zWg*7%RjZaOWZqY>w>GW4_Nw4M-tbh~-)Z^xXh4G+@>u05q7PELnO-E7ht<$^Wu9kt z2RSLncvSx zq+B<1pg)p=niypcgL<3cwj21sbmCZ8+V^5aC+)yy_fMaI!@xu%A35Qk8?aAcQ{Wz% z<4UE`f6C_nTrl(B&G8ux zTl+2ce`{qzUWgeaX?a|;*M-tu<(o>J+lbif5v7n6mnY0<5<#R&m=?cY@u{f18g#%u zml;}zy>C3my1e7OUI>IN=|ed@-S@?KA?y#aeaB6b4x_nQFVS3XqhAns=~zbg#ifHY z*4(e zgj{h(%ib?vW$#4t9NgaSL4(PeCP@lmQ0DS59azYVq0uD+O>+PVMKQY0Rld1{Rn^)aKpI}UzI`3q{f$f*G#1ihx7KU5X)F_u5pp&mp z-KoOj!MF@oaVCfkj&^{H^xwR7mHO#5W{kM}+HJ2=d--{c!lolu>b_IkIInWI^-d8r zAd8`f_>@_MUq|2a0ba5+Faw<}gqjFiO`mwWEHj^}06;3dc|Uqc>yotTv%Nq%6O_SX z9TU=TR9U{G*;V65Gh;)Ts&OK2r}@FJg`Ip6dCQOp+?XHU1|)DGD@8|gq`~tkL<{OK zxd$IVI^_7n8sOlvNEkw!FEMn4TttzA4;q_K7^ZZ5gLV=MLWs8Sd-x9lzfFk0x#yUA zFVHVrkr2d!lTOxRJu*zNoMM$7kb%5KQi4Url)wyefzrWI5xR28?Ec~}Y#KZO&4Ux0 zFJM;Y%USZR^bG@BnMBvwtj>t3iKL^!I*Vj22u^Y+87e zCYtOAp!i2G8)Oxwb!}KJ{TEbO>O?Si_l4rM9cHM*NqM0gVCkha4G}NieuM zLr%B@8cF-pKIG@2`zPQJcCUSrRhLp8g~#i~_c^$bs}{pI=PmHaa+?Zt_J!s1=?n=L z1u8E4e6}o|8xoV~d+RGGuQwu{cHy0uO8cpxcBTXFTqDr5#WaZ@wlTrFqhLogC+oDb z()&HTf-gSaZ(hV5q?j@s{-BvBoyaCX;x_&g<8WR`JmhNtDdOUS%y*0YSTDiqdEj#%B zwi&XAEjulMJxMdM?3qHT-LI6ocWcki@sIo8taJw2eW%u46xK6lG;<$x)^dq;Iq%j@ z7Scp_oUwl%P1u9lTHLzu`~Ck0%Olx@-{IYa_@O`ym}2T7)OG%aG84zoe&6tq&4-2~ z#s49KLiiHF%NXqU?t?`7%f_qc{)Lox51H@GK_&m;K}kvoRJ zZHTt$9C3v&%X7UZWG^258PgypK@S3AIeGWY4Mm|F0OPGJXe2MvvWNQ8CUloJgQOAg zamSuvE_5dw1Du)%#f$_iFl3ik^3(z}E-v+jppIspUJr)R@I(Ts2R=a4gbS@q*B8pW*$s~aDT9fSaigL!e)A(%Qb)t;CCNKAma9rxkO26{ z)*Q>SaEHi0=Lfnvy7SRDa4CKwXc)ozSt}Mjs2F_s(6u8tZVh8Da ztP5TBXARVTt7fQLTo)y)SKVzm_{D~Ew+9`BVMrk5L zjkcl^+Em)GTxd8yvWXQ%0%*5*E)+Vv1B}C`qqu1JCZZhqAT3OrVaKcDll)0NiF`TJ zEabBb1|)SZd0bvuLQ-G15-lt-kECY&o~)WH@*EsxP-LR%8gNx~rmOtT-dGc=Cyo8g*K{KN1naPjVn@~NQw&nPd3 z_G&~Hh61`{wJ`aDtD5zi>jybJ9LOIm5)3y3LwsVhM`dj`7itePA+TgtvYwsVsEM@- zm4f1kgp7mS0L>3YNZAA+h2ebMRDAxM;6a_oHeCqqt*@Z|Xv)IsflKcLbfe6{%-W=j zvQBq6EaYKhOx{Pb@SEo4l>c6Mqm0%QAUY6IsRoh@;#5|bj^m~9%`lMxLH(8q=K&Al zNGLJ;;6Z$CPg2oLDxLdPo-fFT5h$6Fz>G?I1b26d?6mcbG~X!7k863Wsr8rh0X+N3zmqw5U$U;m;&GfE*VdLN;zqRA?y$I$)1FOpFsoM{K^)F>U0 zl={c5M5aWzY!|T+L$JPL^HboT6s5MMEKP%!{&n{FZ(s-29Er#2(-LjrlVQ>4f5-|j z0=Q_lkAT-smC00Ehm%axlDLzoT!C4+#Qg*+mI~$!;{_$rV7(1l06X4 zOf=gi7j2FW%2{`Z^va~NU3IOvF74ICU!K#bA!76|HePn}ggKISCJ+mYm~KYilqqCN znS!UJ6q}#-C$^K8h6|f!H*(*(R2aM0AZVl^$KV0txPROZ#BB0=v8@)uyzN~fGxiO5ko1Mb-C-OUKDU=}I zDpaX8|9s}+rbIq(>rI6pIgWqTl2DzNO%l<%_k2`S!qjc&PtS&lZFUbmwK2cfJBOr| zn<0-RbVOH_D^3HY5h3z?fK7YL_g8KYH~fJ)`PAQkg{|yfyXg3)4b~AmsWwhL-9Kas zyC!0u&UGt|u-L1ay4DF_u#Rw;6ikdFJ~6(juADw(`SK(8&T$cY6W5`9Oa~EgzknFP zC#3~1Sbk`E<){W)ZQ*XaB*333){ZO`63OXBSrLt&s87cke8s=gD~usXH#z3qO43z5 z(<5JuTVvg_6uDWa8Ux-6KVoe;w66R&$qu@(B~?RL*7Ti173Hjq@K%tzB2NMTt?RRK z@xdi~Jb3h~`h1sL8P1?6=T{K+i`<#g7&5Fi%2p@uW49T$3e1i%1EE@q4lN9SlGw0iB6JUKHns zg`$x9hY^PVf>xk+yY>w@EQS?K-wC?2d%LWy%J;R};UUNQt3;#({$`hM=`35ahxmA^ zQ6}7ezH|%W+z)imEiIdI6DA5b=Kj;JYE7|4mFlSpy6?BDxb9P0xX;+R-l4C|cn??> z48hA!yAV@96UFeugO)p?C;NwDNQZKf-l`RGG<0n=(d+E5;?fLQMj9tcM>mxBh_paz z>naqMEWx~PO-G`%+CKtkTxsl7?+B%tXv{Db;Dbfr@U&>g2eU9&Rjdu#(3l5wfg2Sz zY4`CTot??O(tbn7(7+?|APJsfOW^&o47A3Kz)bn9&8nN0k^Uzr9Buf%ljyO_#yLFy zZpvLF;6*MATY1f@BB|NGd9!A28Qf$|j=j=~xvaw5!U-(RroLMJGzPtaH|2ZR;Txq(|N|~Ygv-v~WkPU*OgI!kr zq$F9-G|5J9<{MxSrL9-9y+JPx++3No7+a$3SJoVGlgL)x9ujD`F7Xo{Ohw! z0$&5In>=mQMslQq<3`Px%V0X=VH=j%j|k;Jr>5ODm2#BcJH1Jc&9}h9N?EG|O`_;^n zJ(hf8?acz^^p}9onaOR5H0v4+T3U3e_47XJkXL{01TNHZDVG7nM&5YC_HA9 zAFw{(Nj)ib_f&?%%hHGm&>?L%>mx*@M|X@F_#uJmLPt76c=N;<;ODI5H1E)Fp}1s> z=ye@eBERJk3+l4$@iNvk1@m4o;_|IL&0F|Kj}_Nr#1zjrOlp3F7UK7K(N&fra%Xy7 zoOf3MD=?kdH(;igjHaV4cb0tZGA4M+agh)dMO2*(VIm7jYUxpLz+rS1QTfoB3#13@ z?6pvKT)G@B4K4|;n6U%H21Aq?2$dnLV3T-$wCM1(Wh+%hit^daTiQod#O0D#FLv=d(5C&!sN5&QOaw# z^R2gIX}k1x18we&5j>Pn!R)?HDJ>W(`b&SV&3}7$GhpwQFv?f^E&h)y8fFg-=OHNX z#gNGp4c7$1dAWx)Cv$ zDy*+kb=kwg1IP;CT){mC^k1MSW0{LnL3cAD%9S`uDD|fMp0D%VSstxk8d7@gK_Y1I zw_UgEAgui`e~}i$n^s71N8$y3_Z>StumXn}*JbU+zxJh$+3%|?xV$vjt^&T@3pO_u zGo76g(sWLbOkrz(xutWw8vaK7P1v8~i&YxE(eFNP@8A;4?w_0pf-xe(c>&7qSw!$0 z3`XAs(2(j^pW;Eg2O;6ixUW{vk0vu7#Y!GYE)NhCe*XOJ?C2$!?+6{fI@_oD=8_P zQnpN*rMOO-94u>(qCgBEOKBq198a%2?#bv3e2V~D!J#W?M!bZHF)8!cW7a4srMY;y zxCLw(2`#HQ0GDL!(0j%V6_TiWWhCLXEK%y{xVk{F=39C}Y$7E^8}k%SaY-f451LdN zv)Pao6*0jMYP%lZa;(I=Wr$FEsbSE?KT$|e&4o%gC`3MaZk;=a?Pf4Gda?`B(3L5Z zGI)FGt25!%M=tv%vQAen5 zy&jy^5y0LSSc8D)p>3Mm(!kUvjXs>l6Bxn0(dGsT=r_>+j=iBjT&Oayjk9iHUjcYHZ=wh7bCx{9162U*} zIk8RI5dsq$wQ&FPLUMq|FAD$cTs@G^r6mjlRdAves7|QjwjwNi#oU|2b5GQGjAY77 z-9Y@~jG(KsjV=@BGYRZB38lqjN8XtQCZSLixl$?&FeDl0dPUMqW<_<~hasx-Eyy)j zu#bw6mTMI|M(8YY=sWSx(qy(iK$JPDO5=D^Oc>m>F|KwYa z*v~zy=THAuoR;75rjRNP6o<{41A&u;g5q6xyA+N>Tx`%X4MspL&NrfAg6rF;4&6@T9b(fY)Qhg&6eV~&;V|3rIAQSIm4n)c3ZBA| zeuCDMF5&b#WljFCMb5xL{cm}&Vqc&qeg?9OQi_CAz&yi$5O$7Dq5w;i9^1BU+qP}n zwr$(C?U^&SZJTGTJsZ1k#NH1Z_djG+b$4awQ|3V?kQ9?s_G$;SGb9?POFck<6Ju3Z zqui7hZC9dq6ufSL;O#~Lv?X<@cLV~m%3QFqCErd?GW%oSqWjuAyb1C zXw=t5BMfKf})5DEt{oA<;>uk05T&=JXwXW z>#>)8MKfSxWGcjn8#?}-69uFQ)m5U#WH*GJrmz5j{ZwX$;-Ul%Q;+Y_w4iXDlhcSI zdL7uCi%gxBzk$dG7*Nah^@JS1*;Mq91P-sE(4Ito2PsdT#JtMVxyJ5@q=q_SgV>%9 zc5QYeryz^BDry~up|Y~BY(Et>33EIQxO3k&TQE**h-xksFuUZrV|T&HvRTWM$ac?5 zXz!H1U13b!KCnC2PI&~)qR-RbBk&*8s))lS$>x z0@Xt0Q$Q!3-Py)PAbD4t$sg~TA2}vfu`4^+u&@;XPL>e|Q*@%vy=#?Aw>S!$+IGhj za{y#{%o;Y;VO1VkTijk zak;368Mw~?`|wC5mck7sjP@=tCA_&qwebUG?aBvX)kPmS^YD=U+(*_Jd0gUH;Y`h< zL`dP=rO5s(hSOF(V~H&tBCw_<_hzN-s3pjKGl@P$)L&h?u)n&)+>A^Y>2PmVYNL&@ zz|qhc)S1NxKS9=!u+R5tJEs7r=$qws2COcZwrK)!#!?v3NWf^Ch~+t!Ry<~*2t$}p zRR>>@>@CFhae(^hgtieW3Tkq)?1o$0DO589$0?OV!71Z*NSBskfZcwRWy)A0NeST~ zkS>W`^3&lDy?`KM0G5)OW~Xu#+_#WSqoVFE=mx#UBf?e&XV){?pI7P*0oPz3PtOgR zL!)(>W<_f3mxte4ac+LL=xU&h@@}~4`#=Iqei2BxKL9OjL}3`*sE`R8@eELgte{)y zhu#58tR+rR?xYEu5ii{q5eEzn!5y>4#{slFy4G3Pc*ZJH_M9yMhaYA3(*wg&;#)6B z+Le8#C{uP+E2|g{iqNcAT1~TVLJ?San&vXnb!PgOX}ED$6g0}f>}wT$t0+9sH`d5# zZg2~T_BOj_$$L^utG*pfMZa_sjSKhRXVVDtESP~Bx5__@0E zf}-)g`doxPS=*&_!(#`3hgBu(||8{s-s4=xi_R+zS&cELQXOEhsMvM z97-o|MhT_&2{~G=x~^0*r-@<6=D})m>AOkv@gxLEuGP?;p~EHhbbuK6VLB)1)l-t1I_6*JGQf;?iqj~q z>veeI58BYQFsa@viUM+MR}SI1SIHfE>NJDS=uTu?idrD0d~Q>^kg>Jn{2FMVmmZe9 zQcM?EtqpPWb2Rs~1ZJWTGTfXp+(4bq!=&qqb~IQH zXsPSmTr;Ec$vXB-r&c-jWY@t+-98(F(S6jpxk;uX^ziH!rqsPWQ5K{H==Y*C_byJr z8IdP;Sz~R*`N}}94i~jXApm#EG4C^7?hm%3Vn={JQq*xJg#H4@{$h{y(;Vi=1f#)N z8pU&cV|}(^*lw)y>#umR)iz7ji=g+)djtfkVi-?%g{^GNP!C|*Fo#ob78O;n$-y~N z*akEAg`;=YH?>c0TIOL*0hnnOR?WqDFSyHd_@BN3g0CQ@1DqXa3Qm#?l6A1_w2je$qnn~ zc0ANYHg}!vcullUt=(L>x+tqE6A*0yl>hTg)kNDn1Ywq(Uv`61$WZ`?@$kutDibB@ zg9oG#+k@moL`Z&N$E|X`G~UB8>W<6X-#eFpZ5jjV3m3GlKM!I2rVyg;u^poG^4-My zUlrU@H}>L@GIzn3_D+KUNc*!XJbVYa!a7fxo4;z2&ph`wt0DK5QcYHyPByu@ zJ@xUv zijj5D-R)IGHa?j0H;D=*l#=ZY2}pYQo4@i>HMO*C{d|mttd%x}T{tdjZZM|!ncEB8 z11@jD`EcD3CNWT+cnFj2Leil+aU^~pNEZf}M#|PVdTgY8b4`!l8eV$+Z`uG9gzth^F6x|w!sB3eJEKFtwa2Lh+zum z2Zd^og}%xVH=Fb#0&)=9!vqE!2Xn=h1NvgEME+ z#*PybgkNpGaCD}*PKp$H1_UMd6-%rqj(fZHZDG4C{rspbZPK!d*CS*J!SqsY_fL-Q z{n|0$X*Hg9{^e}ajD1OTA=FI%?%BbxtNvE8WH%Kwwg4|Tgw0VFge1DH}V(RNGd zBA`(yA;@<^n;iP`X68){;9>tA&KW3_jL>GEtk7Uz`Wc>nemD3PIV#h^w3VMzEk~wu zwIwCz0gas5Vs~PiwPao-|?>Q+No>j<3+mjG zpO)y-VBf{PwRT`#?^QR>F3(&K%)gT7?l9fXLbI-!eJ|T>ut*>7P(qxaeh2KN!OBQY zZIW~RoKqi?%wMy42`dk;xWG)-XE9FtdD-APR_8bcZLlohGbK;?kRTYPchg>g)8FH9!Sb z$ua^nh7RtJF+5-{xkDXC%bZ(oQm-cQ#gn8M&<8|GJ*bi-6eAMB$}k3E7`F`+9Of;u zMq;OXy(J&ye4pwuzf;*sX4ge7&M{SSvBWoYa#2;`NzHlb;t-Fr16xvU)Oww>5E{8X z1b7&76`L+ip&8JKDur>r`){2KkdrX3yAr!;*Vo-(R3O!O+CqIl5=nzLW4my-K;ku=UkT`BDJmnpDsqxIi z45(s)gX-ExrkYoIMdg=Mq7ue+-=s(qTeND;8*CWKhytsrRaLF@c)p>%4?l^a#ynEg zg>!F>76aGrn8v{C4Us+BNSWd(IyguX?&q_5eZl@`@y?7#{cEoP0N(#BLjT1c^#7RZ z|2Kc?e~LI%xzX-l5r3xwqmzaa!|tSz;o-PYBy>sih~im9wrxn2IJigIcKp2Jk&d(_ zv;eXw9QV54?GVFXt`KP6seG8$sI{?BsrJ;vj`T~!qP~MUKOOT<{aoa$d=wpWB*rty zW3(1)HAqN?n<_;&I(1n|n`&Nkwb{u6r&YS!;D9q}ui#+~_a52CHXw%ii~Q!iXsL+rb2^l7*v=4+z6{ z5wtdZ-t;ueUIH=LB$(u-+}k6JoU|vUdEq6spSKs}W{4Q-upvo|J(VyUB&=lqlj`dF zhZ3RK1t-6lGxGM#%eQl-A%M@B8-j%A8lP#YT`oUp3k`R*{i<{00Tc^tN%ACZ6uvw* zT~vFa_fcFI{Muw)i#E<5@IMtcIjw)l`wwo0hWOubFRm_@|ATueRsVM0WW)GTSMdWZ z$E&gS)-9AY$DXvvDuwJc>n&qPLD(Oam_|a_Jn`TAlxm{oZaA{jk$!&gTXkVT>K)l_LGfL!Pj9$&Q6Y{u@uO%3m;Y+DGpg{PhfIiH9atuKz>(LZtXcU{rrAA<$V1j>XnA%uS2HX>&bFxr5V8AR4GBo2=QfT*F7yRWvw=a;U^8y`OV7})B2LOav zK!pVHdq)Wg&IeOp%0!>n0C=rbB08KAMd)=gYwJvFTm>rIy;O57Pv!(uHic~q?Vm@* z#I_cxXCO*CS<6bF(VgxLGCs!zLsVsZCxKTn!4|6R&R8OL4Sl-9ASnFk4%5jm=j!?) zgRj0Hs2>fKz|izJVlL`|NKfH}pSft>QdVxNB%Da~M$+k0inO4B-!Z+cI;l#5GS5Kv z+#937IS2jbfAPPnIHGIrh_v3R2#X zFj0Ri8x+dE7#z2cvU78@O^`zyLzERre|e#~yl!WGqd&mX1>J9&x=5)sRK6R@7US@8Qu^Uo8rTbXb|-nYM<}J5v7u-ua1L|7-cckZWI6d!xTg+NOWYh&hQ`N zM)yh$pAxG+Wu9)3R&b_J*h>0glhg*UvoP&Bt8SCy`X*~)t64v(nZjbHklD5`ne3(^ z?KmLz9#(a)3B~=PM;#~2HiLG|-Ip?a=zJI*BDgoY*@Rs2g zq3J1tpdZ9exq~rKX-L_TDER;c#z8_WIaJ9^tx}yN#O+4Q=?xPRqk@6+kbnb3ebR}F zN?6?)W6AqDqs#_Sk~G=z8#LHD{kLPc(($mBz;qQCXnwPZfao(3NTD^Nya0ur<2atr zObsN95sbOu$Zn#XB~*Osw@y$!EbFWq4eaT1i*NiS;ujfROe)XOm>zIL8WKVVcsm=u zVfUDrS^NIRMk^)CBTRfussM_$yD2S4%%;gODA={X~PNHi(FGHfp`B^!v2#(Xn zD9gtQgziPtJsURL&lbsqGMCTO%i}O_2U`s}Q7Npl$rzln39EI1l#ttXG*TMz^@*^= z7bi=jYBlf}9AxT%XVLf7Par9M?o10FQnIGwiHFAQ;IOH(5@@p4u-1owUmgxjXVhv; zEV^V3#4OWXBawu7Hi}k=(5f&cBx|vCqslflwX8H%XRvms)C!&7hN$H8_xYk`UkhT0 zz)I}cuEMX?ZI;*>G|tDtlWFTAe*ysE;>MTp2T0AUgw?A&MXS5|t$3Ey>BuOOyYMrA zoKfq@uHV6GTj^z9o*3%+WdQ@Uhz^na)uByl{|a*@n*v|;@}6gS1dBSo9iBaY&C6gAKHXSVxEwF zxzGf)AY^TtZ5udCB#mLv+3^%2EnL{4HfK`LG)7?wk!M-)Bd=QT9T78|56DN|! zlUpT%OPJGKJMigxruP2)8RTfsg=8FC3CvlU4D$N3bW3)@bQld!aN_I8wedEJW@9uU zOUiY3j|=81B+4Gw$*zvcD?!``kIKbt%vQU|v`-4L`>e#sfS?e{zO5|%8YDgG#Hm7> zu>>`zs3ujC;{jKdZ2>w}9)mtWi1~k@;o-T+jS#7A8*8BE*p{Ocq&`dp&Vy=5)S8Ca zb<=NkNRq!d7Td5EDapReegWWG>*0Ta{&W7odlW%e{B!^5#sC1|{r|2fN}_@yvZ8dh zCM&v@?ptbJKePId!tSGJ(g~5}Gc9u0F+|jnO4?4Oq_;RL;sBBgA+Sg^08(nnf7@R@ z)4KscOgAPjIB#4=i5y-(Z?XG+XrjFK@ci7Jye#1I@pJKU{q1M{Ik=e1!$0Tr@m}QE zN`E-DW@XeeO_b3WRJ)|6O61JVoUF@6oRVsrR#G*|)h$h%QadHdRn^LmG#N$XSEhL> zmQ31YimTRBmRc^K<4#Z8)-y_EWK-+RSR{;Avw7G}KlHO(s$_LDY&z+pua*s3W|(wW zBy&-#3oF@@P1Tft7iG{VpqyVB+Sgamao2Xr?SYXnKw+{W3(qW7kc&f+2eq)^^K;U}=F0-jLOh-d& zT51}O*yGV$d+YLI#x@?URA`%6@>Pp#FzQ#Q9-ceuicrIn124CDe7WY5z2;tpn%h?@ zDC$SAOg`Y$O}no*BF}3ci858)0lG_vB~ z|6Vp}=xz{>fsa(ps%0A~e_uSDiC1&=Qelb&J&zj@Z)>apOr&I~?*SZ6Zk4-@@_(ED z%E#k>4*oJ?V9|S!pMex91DHqheq5AcpvrqJ<9jZTqh$1)y!G3JppQ}fOD ze!>GIc$xt@NbQv`!P3SHe*e8+fo7(c`lJ5bh6Q!bwXNY?jrsz-&Bfyl8KPAm-2`@@ z54`PI*wP8M$S6kQshS}fRmgrGA083_^&vmK=Jvq4s`}uB3Fk5q1AI0?A}`Cx?$UvQ z9by0g)5S5!sb_vMlPwMp_3a$*7`^A04g@fXg79Qe=YK2NUyK?+Jm(qdkqye$bNBzWPe`2zf;{bkP7&GWfKK9V1nc}vwbnnivHyBL}{I{z}u*?(fVQ=s=zj=5$_3tR_kq}-g$pgn#o5KmuxhtM5R6I~#{Q8>b;a>%Qz`umm1Rbj-!0aXb8nDLavR zzZptNc6z^?uF_x8`_r%Mfmxe$%sx;MIrNLax})rx;QW8o1V*fKInOKq>fP{a%N{hRQAF=FcqO^H{H#8c|J@FQ9$cg6P-a)!%bXP$2eiwoBu&? zS5y;ShMBt@XNxB2=Gwh*&po}Go1W4(D^1-9XZT>Mrn)|0<^t)7O>6hb(a_2illH`1 zOb}I@Epk;_rGX3ff|#lQej4Z9TbNtSy~!KQUUl?=mKg_3baZ8oCG_Ba2O*X@)(uft zyf5=DFctHlR$_^qoDsA;b`_~7?%BnYB*?bUESyI;qie=oLhkhC>l){^uiYo;1YgzMapxVh!fcou`-}ldLS!yLFP-YV(jtY&Yf2^bm2f+d0Tm!ay- zkj3_J3-Ur^_~Jsp_Xd4~MOSs1HNF2uLZJo7u)bVl3d^E>JiD&0Np&;DCtmb1R0O)} zPxL$`p;~JR=MGO*ZQ*A%p)oTns5w( zjPXLtEhX5C(Vv_Js zU4VL6{8C-1I=U#G3ENzOZHlJU*!_NBqfyKF_NT&`ri*GXfEA$iy+FS zSOcc;6@4U5n^q->#zND-Y!@M;Hzd`<6THF%GrY+A^kX1Ym-sJm#mZ%dvGVUjc|LE= zjm9;D^ZUi5{2!G>yFE$0ozDv}h}ORXhI^W#b5x%t;HlZDG+-S`np_(?x)1p-T_m|r zn$GeFhz$)f%h$Xri8Ys^e zvMn$fh*dnjdN^Y=I7cJVMp0+&F5y1=88@^B?#sbab}GzF3(jRLPEp$SAS)QZQqHO9 z$ao2_N9tQx_f}^C>IVUHORZU+5}7cieS}AwOr5CTPN`)!u9b^7Cx8Vrdmdek@zFcL z8Q^Cd9}@-!@?ob6Krjsn%!9uu?5UzwGVm9yXWBJrCP75h@k3-27znoYXk=>8VFI7y zw_?*0l77kCY7DTdqJFf%8hrGpB_3YP(Shw99z9JCdS#sew3_V!#6uq6u}EcDtD2am znt)c@kA;hcB8-D1sfwsq_?Uu6iNu+UMj~2lVMJl;MTH>lb)NJXzEqz!JKebKQZvFi zgl>6p218!U;W(-24NNGee4jP_uM8Mc4yL+6i*Wob*ID9rv7^DgK^O*#`Ej#KN41Rt zic#=1vtL+4CkOtvO;;r0v_uIcvd5zJ6&fe)Zn3pvGswHFC;)*ZLCdf~;DYjCMxEA8 z?Dw|d6wmw34`ozi3@vd>E3Nt;y51>_`lK|qOodXD)NH3JU}S*BWw58RA()if&U$3Z z5i6|GYxD;1Ui?g_+zGXReSvO6vq=c@(U$|mOj$C>HRXIedpCu<)nkGUjA__0<6)V{ z3Y1k19@|3u8Bp`>BceCyP#OQi<~!HK(|@fsO&(*U6An*cL6;+1P-`z@{}l-E=^fGm2$}f@olhaD`7`cM(8B z1P?j_GUF{MGR{B~rnze7E@+`>Gdxq^>c-082uc=2S042ey8oG=1r@(r7bkO9JyS|cyL-tMv;>w!I zZL)f9a6_l(y{U~`d~MKR3Xce_5M=supZbQIRH`IfG-l^4GmCx7*AK~xJx^CBDHU81 zMBG5&)I3hWc|ixV$xIW`&;w#94@e)o#QXD6?oO zgaL+u0tHDE_-dQTWVb|=krxCUQlMxHpsZ#v@X$7{7m#wzSiE48DpejSm+%H7WBw;a zPhQ4D2tEf+n7z+eZaQJu%EwlIxk&8lhK?E8@*s3+-<~(#kg>uHY$1V=lU9Jt8p7U%0J8B6Z5TTBxePfgD=Qtl@20(uasR9I z95f(FC<6R6Qrb-qagf1d^q9O%IDP#^&47U~*<5qg@34l-($CT9@}E2zU;bm#{ChbW z)xRYhv~K*2{ThI05qB{*J;Qn^fBlFtA$PkZ)cp)hf+)DXA8~{E0sY2W zPB`$QKbOrpD_&-pxr;9C3VH%prry6a7n;;~vxNXW1N@of!$jo!v+TnBXp#xQNL*kd z?=}4yiT-^P-0YIWVCf}8Vfa>QGnxXGyy_&HK=WbF1l7hKjZSp^2mb!WE7#i$qtD~F zU}e5aYrFPCY!n}YHx;LcW6jCN`&1#B!^*KUR^PW#hK@=??Jj<|{gI!`!nrQTthbEr zriIyaIkOSW2bGe`c{?FlkKtjS3Aw z+maF^I8btP{>5wzM#PHPzv)r*BmYBQ1eP`kYd{Auk5mdsjsh}4x15ipJ6h+xeAZ_A zH75Z_g>v#(elq?!>(ctsneB za22ls2$2c=!2oxsf+M~=*jo_x#Qgas+U45*q;UY6LL|b`KujcG)N}wya7s#MI)R}> z@W!Sl!H%R8$ zDOxc_rXWI4Ij%s6jNyAl@xw3cu>yW)B4$(pV)1p>q&XkBZ{#(353Y7S_NkL@|7PXN z`E>xQSc!?7h}u~WDt^pSWpr?|m-NyYZM)ROz7`iukCR!ZJl42Ap(zIL1u{<`Tx6Y~zzL;RYYhO+KbOV89p)l_fc9WxcG*+9TYY}zUb(XrGEtJmYv!C>c(tn>m)STV`9 zgHV{r`_qHH8g!~>O8F9w^S|+j=RWKIVlQ658Jz(qTakzP$kV*BH?ybmP?nuEqBi(b z)MJa$IX}=p53Vg$IO{XSOnonsHm|!MA2pW^uMP`!Y%e`UZJG{uXj9JZ?(6XQxUvxa zM_IgP=OMg?A%Iu0tzAaZVCy{$es2j?H=tqsudf=k04P^1Xw}m}+6k{(d@guJxLjqF zt}>)>1pm$GocwG2oW*N8`567rt=nuPbdS(rf$Jb)Uy#F%sGY1#m%7hui@$%U^Y6j^ z{@!&8KMNhUk?c;Vw|nz)(Dq1vo2~l^e@>34i}6lknJ*y8kiZx6Up=~2DaL)aM`;~h z+V>8PNM3{HpO#eLa8phQpV?y=LU)G>utxXOpmXA*0mOb7$yr#V20%5N>{s7mKJT+> z@jZNEyr0MS1->5+ZhkHfWMm^^m3g77M14$U0VHq_L2^A+HRZIv+8kU07g+n;1rC@3 ztg%;3r(~VUBAnJ`Rwf$t{$MJ$axREMR36+mgx&8<*BK3Z@AOVzY<-~4H$8)^hvoNI zZgj*DAeg}uwb=6x0*(PVay>*Sv|tDY$j11nq+b5vo*ry~K;%O<2w6o7G|g(IFB{>nrO*|6XZJJsxwe-y#Pd z4v#;l{xQ^%{mIw8bh$VGC2+}*2$K{KljG04ca|={96bH8_y6Ey3#VR%<Akd1$8n{HVUNR{y zZ+^+~w?32oyxNht|LEktLg{3n;ZTx;2})Sa)>_iz=%U2q6!RI|e&u}rlP(^p!4@hH zx0JWgABbH$-zf=32${3RJ13>I`l{Z}3VvspnmR9@BSS!7se5+gwc+45xwu^r8Y=F(8zyjEpqO0yx?Z1%1WWlv zbGR+)iD8`rw16auvz1gZ@i6u+;M#6#>HN(=%v7PP?D1I{WVqz2zp=lbUs=o_e_6isq56@e+d#Np=g{J%sVzU&hC zKV#K@mWtEE$Id?K=`LXCUiI&S@do{Lxeo^bvwfU|uJv&x#gHe)sRj-ck~V0P4gT03 z3A^7S;UiTqJ3~d|Yr2swT45ibB+!+`wnU%ZkHYY@y(!*#jd z@hA$%=%YmD!&zYrCiT)~y^=JJfw9a}t;1@Sfyy{xQW7(esPDAlWwr@-Z6xZk&!2>8 zQ8LxXWiuSZ%dpaO+q+O?p9YWPZSx8oJ6EerrpQpWxR4fQm^6kNyc*;P-aN?{K;)mm z8{Qm59zo-gofyMYF+QJF3Ty13o8On}@6{Xs*Z_Vv-&mrEzv#Lor!C&lr^59MzuVzh z-D^WpwgCu5s(!3@?gz zZ^V4TSZ%$`UDSvFx7=<2Eq=@7&R9a+5+2_Vo& z-sXXIicvDQTE!{`YPx1q>*%1}mS>f`ZjsW07!d!OxJMkae?m(+^5|2jhc-_$&F9t# zZ8Qc<0e@a4ecV;D7ECm9j-#=B3^|(17{4z4I$(r3e^kIUt{nuPJMe`?TZCa(#P|Qp zG0F8cwV4esK`&j^9oF;ZMcpc~_YHk@biH*FaK{xs_gcN@?kjM&>|#3@#LdGM1|+Sl zP5=;>h>5^1-)TC}s3E}=NM1wCyX8f8fhIxFe2))%qgT9Qh$}>O@rWKQ_~yj0&S^kws}*L)(-mTA z69kg@@si}rbjTqn32go69|owH0E1~iVfrr>Q+=XGM88354bzKf1q6UL3lrZsn0O>f z)dfQ-5e9~X0Xj}Hu){2ir}(%C2=Ct!tAWvXBW2110y@->hU^I#Ea7t^2+kER3M^Hm z3_nc?iaN}{2-;kR87BgN!1aB8-u3UYo8xhKmcucW(|KW)jC2%?=dkpbjiq58Ln%ZC)UgV6c9>i@{iPRC`1?xJ zjyuZFrQmqa;b09&5+xw-4oJc;Rj~0Y_CgewF7aa(6jC{npmfKd6cM7OjCyXHlK|jl z%_5g$bKJy{AqW$WbH%J6J7phzhBkB$%bGCx{D$>74sp%T#zFfJoVO4^1qk4Ib9!ExG}*aLsE-9p&6RA+-=pj~wt3`t*BNLHWjh@r?8mo&i4XNM44yza z@$^iRftzaDyCP(9ESkU&NsUl94xskP+PY1$+M6Nx*W=+>*JXIA2 z49)EMj(mWIX?H;8vJ=%&tj;c3BHoRy{oy`I`Rhr#q5gH5I2k`%nWE^|vcKS%Q55JK zSvm1cZOY-G1PJ56-^wp#k_1RF2jqtwdRW7wwHAHS9MgF?eem^J=65H5hhhxr9l)i> zAk|`tO|b7@5)pNF6r+Pg3DFIP{Hzq|C|i?km8pc3AQsi`6f9xZXu_}UgGFlx;D!wk zn1D7^KXoLdXwp!!_tf16Nt-#&n9d%&aX?KJBRGoYEv69eXq9*q;vh!YbF}@E4`jYM zna~$YmHEP@Civu%52EV0dZbd#bvLu|j?m+MOJoArY_NXKOw!@XpaJ!4K2us#2JWvg zDK8EkgNbW3!j8{3RjCK*0B|@D$Zxj)VXr|NNKcT3Nw9tWPD&Tl%ugvtsroPvp4Eji zvBn0`DEs)}p|RTUsxr<&CSDZkZOb5s)HDpXYHTc7hyZW0#gIC5N|Ixz)zbG6Nfm1?eQ$bjK9 z?7OGZl{z1m$2T?BYW@VRwmPcN}TfV9kwn1rVhYK&xknXUg%mQ zNhL5}fHa@dh9)h4w@!f@vR4*4h=JjExm`XZ5X@jv9Z)tTz*gDAyqVc+UOyt*A^f_WMMa3%-E{e43}o zhPW9oXg~d}$d*Z}pp&YwCVpmxiq(D7(F^t%6Pp$ZaYij>z7 z7J1xZeb%ZHcPc1@mRp^sjU{a0D#;dIUdR@hxtTUwWdJ71jy5r?>~gnj5)G6O;w^RZ z0CB#Chy50&dDR`xf%q|gZuE4#Sr>UGZp*t3t#i@Rn3?L_o2(cVuY=NEo|w;g&BTP! zleWPirFbHGR>#A1KojP6cbiUA;Y z=JMA8ib1DDxo|@;YViQmwzrIXbTWO$4Ny1>Y)Dc9VrEom(XKwjyz?rh zCB}^BPD-jWZ7}lwqXKNGn2g_QMqhak$+RhoN*ZU;Jp zss)wV<(;wvItz&hP$kuUJ+>{nDQj`7^QRz0Lh65Lc(}nfGgR~vULEnEnhvU{1RarhrMuh z3l~L%ytxaR@A#5aES}?VM6#nJj-pyLEu$36Wl#1CfW71ClayqNpaO(S;{atW6KbJN z!6iIFKrq-L9Y`S(94rYK?WQWU6uHKx{gTl73-e;2XPzSt6u2$y=RCtsTr(maeX3*@ zwV{@Pr!Uf0ZQhG2f)=!Q)Q7D0%cZ)O87^YQxQ}r)(YFFtJDsm4k$;FPLmQ3=XxZR1gEAqIw}D&B3=1a-A%X8OJTV`rUZRFIi!g{gFw@4&kWA z+a4?_63|&L)7a*fW^->L9(c``Sl@jSp@X~v>t-v8Nc$!U9E|7AgARD2F1GRX$bT>! z>HB0=P?)wwB(9i{A-0~$Qw%0G!Ny6ZD0&F=g4k+30?`HMwgE75D|k7TCGJTrFU=ft ze1nfbi;AtppO8(qdH?akzeAGZdbP^$Kv-0kml~tm!_Y*_>YSpY6IV1&Dn-DS4spg! zdF5~W60CKKy&_;ltB}{Uug^8DqMcs!E@U3iO(U#z)lzhkR zP2s!$>T^o(d>?KM6kkD2dHPZD>sf-2KV(*9+CC@klWJtLf=2KjuexE7uU}Q}8DD zjH9FV^`<}4QZ62Br=f?H0jJZY?wg&d2_U<~eZ#ceMQF|qH~4I3p64fM?0Mi-)k0R} z=XH=J?b@t@A3~zl{9;fAjYOsX-mm?-sO%e_XF4J>vcUl;k_M4M`=*G49YBU-Q|wy@ zRG%sv!=zBkQKp&%VT#20{|2n-Ur}n^3%N)>LVp~xN`%LD1*OP^s(8^tgOu@jqv{Qg z8z&;k2Ek6a)?&)|R0!0)~Q|&9Ho^h~69jcG-|6-vu z2LF;>%J#2x=$0zUxd@Ej>ejfgANCpzLM%Rsh@4#Fx>DQ6@e>w}+;UYbzj~Rg5-jLTBr=o7a2lW`qL5{jC6$VC!E&#RrY#Uqchd=-Hv zosYMy%6vkM4F>Zq*$nfye7$j3wJ76CEmeVZne?My#@lo%u9GyC{X-WC`>tH7)qJZC zsjVy2smY2(|o{S zbNRo3ZKTvWw6MNM!0U)^5~O$^Q&T%HK-PI~P_%)EMn=9$agbQyNN}SAbg?8%~IkX6i zdR!$2kC9N@y7)D*N1)0AL^;bTFt@H7_Wy%)P)niOc#_W!Y4kk8UEdV$;Hp#*cxF>u z7LhrM0qslqZS0xCSW@LsJRVCQX6kM^)S4CdBXm3)S*N{vE)4H>pCaGlaZ91L=A#vlvC_puT-zf2|tMA87 z(bwIAe?E{$c;< zyXCUnVJ_<$SJ3#tTrjtzR~PnMxO9MR(jIj~esA*UY8OMG(_^9zmb!d5cVJ3Lc4Z#M zM%Papl8XXxVwC@%UjS9`a-7?`8pwzw6(uzf?ne5D8LtiPblB;NXFKZRZu+ORt(QSy z4@})q6hfQ;yKpKM(Mz!WIw0`-H_%+|R$wdMg{(>RrK(5~AA2j`%9*=sw6$@+!RcK? zN5Z{3j91luRdk#*!V+)9jE&7ZDE%MhuxQ5pko>BW8!kH4k{~~t7rO5EW7~OG0U0S%GwNPwX9IEVS(152wd9S(83K)>m zby#aHYtYAIw;?S__FC7A8i>Raq0LOrnj5PS!RC~(Gws^XC{hax@K(j|`=uJx+B=>auDtf`^6+ ztL7M2eFih@!%x6o?&0cq%_X-pUhN?Rvz>CbD4|eDwn3r4gv@A^6R3SzpvsPlmYBn+ z?~YG!)--#D?A5Mi=Td*mA4}R8MgNt}1)UIiOB?f`H2~*lf@89q&etY<=_* z7wn=EW)sUQ{d$A$Ii%d`N}d~1EY3IfqTN}TLz|~evG^U$RIi&VgQ#MEyEl5(9uE=l9JUQt;7;*4SZh8$C z?Kwu6Gwm@`?8B>65BKcvm3Vm;J{0?pGtW#tS#+Dp23QL|RPpMZE65{%x5Fby7?zoG zhpe~CkF(bQD(yVrss7?Ve#y#;63GtPGo{GNUfC-n>)I>V%$6-=kIY=k%oZUdGeoji zW=1kHisJd*`rmG3^gPe$_3O&3`#zuF8Q-(M=N!@sADNZZ_O-WV?VP&V+R!ai7rDNR zrx@v9RBo`mt2JqbT_ncDrA#nLq?wyT<=wRUkT~y$8tD@>$%jV!@;YHpUvAEF8>_PHAWsFyT!Zr2Inxw@q9u{5H4%blKM;p8)&wQ9a~8`%&e zKBg2)>-%KQ)lW_qk5)cIkw&PiBRCpj3H(H?byi4rPQMa!Ts8IF^UZzBS<7j1-#-;! zf^LKnIGTgPeS)1k09m(5S$>|I@$`p}z}RD)fmM1Vs$X6nx@v>iySog zb!L=4Jfcg`M4y1%(GA+B_kzIAwwHqhk(^?%_LEu9w~om8MN)+ zZ}@U9o!w;YIdI5?Sdq?3WW?Ioy{L-`B3-R}1J|F1X{>}2JmcjqIK$)Xv5whppsc|W zVlu*8ewLJ1(dNyQTUK8N9IagE#2q=a$NOEX_fYrycweF27H$Q6yLo}V%cMv7c!MF9 ztd?dFl`vVe20?7GEePh)cj3Y_y2v;gRKd(r38cCOGj=Txqs^uxbX~XT3rSX_w!5a> zuCQtaprV;1HBY%arm`^!u-|$^Ksi517kzI}zQY7{>+3LY6A{6)c|PFsSRzy>{^v1H zl_nB&#`y9UX)GG5#7eU_s@^Plv&($sVrXj;W#I6mA)#XXh}*G{@;F8ryt3{3Sp*j? zDtLNtMOIC&%(?wso8NVHXB55RM%5|q4J{__Y%MVAlw@_wV*WR$-I*(XEZsLUHNc;L zB?0iZAi?}T4A>_;5CcD0SsQ}yT3Q?0TYw>Kb`TcWzuAB!VB4Q^(-tHq1HgY*22zgc zxUc=bQ-=k(qtO|bklK$%rCtkS`!0WEud;+>`D)%3M>?wO>ITUh;)mf?zYR%E4R8=Cyxp#ct~^={vk$YCBTXXpEg~_1&F)1d^vBM~J=0j5+Mo8-gv<0Y4X5Gk`=Lg`5@X>**!ER?Yr;!tp zFAm$I@x0*Ck4unQxiiQ_>u|-CkE;YtK>Dn&r@Mpq9`e}I(2c+uPC-?w&@J&ZEsXY( zuX&`}L#*Z^eR`hH)!pM;MyC&~?{+;6_6!4VFc5AIkhBmbx*;9+5EWki?`_bI!)@xVro}?Qkyj&66wN zu5=na`Xc+Kc)Q?Pci7x3;+(j!DYoHpZQpVkULlHQnF3en+aGxEm1FZBVmo&-dmCYD z-&4O0CR{gZ;6zTYCQ|LknNynK8gRw!)XbuI>q$}sk#2LGA-;E(d3v|#i-Ei==9}{) z@06hp!G0R{fiE0owS}Qt8yKRlStb?SOe97tBsC~Prt?Z8<)0+gzY~R3H|xfds*cy_q+>c`fo z`)VFXP#S2CtsK8$-cjxOzV!o_wJK0? zY6Ds-f_%MvSxc{?Gn#e4c$1o2KfCnZCoD~qQln<`UHVQGJ|1^_n$b%A$5;++FZ5m! zHa$-_zTC&j#_3=s=ede%(v4(-S!UHmt;|~~gGs!P^;w*#GL3!|D~9=*l%`af zlhd_dL=P}#6O}Dk?XrADJj4=YO%XUw**?%9}cVsJ|!Z_ZzSvYot}T& zMv#ui7t(mOjxuvLzVMQpykz`j+;%H3Igyn0shMq2(O38FGzpzGxF|j`cgyMoEo8-` zsFV@ER0wo>?sTc7ccgK2!!bSCe|-6->(ljwaumm)4}HB7_VvP^k$RN*c`SoV;{09OnP#0zo8JN^=%&o|Y;heV*Y6tb za{Oq)e!?=>o5cHcHPoH|v(4JPKV+6_J^Rk~Ov{fwX(ha(4opV+QbLWoWZjnyX4_lq z?hbA)kWQzvJmpERI?8I{^7fdA#WEHHrju#I^%Sg5vdfCYli zdz_v2xAoGNTfjFOZ_%f{(sBuBnEr6DJC<{=V$ZUQ77+%C-m9;v z-Z=doDX`X6{#3a~@4?tz>@pk47os#9exoSKQB@&p4mfb^qZm1;~d>jZuc=c4E2mqXf3yTI0rQ#NO@IU7Pv zk@N}tybJ8lOX?x{^pyzHc?-1yRAJ7dZmAWNxS}-9nZcrIX(%d@u4xCBGGXUa5qHn$ zTV|#Sg*|K#cSEPrWRn<-s{TtXyoh- zg65ktHvorLN@F?JVQDM**t7>apigHodF>YK+lf9_w7yGp!Cw=>6271zN~ z>^hX@+8lg-a$Ty4$w)O@=A6h&?~WXkWV@Lp+dB&w1K)#R=UyF;@YPei5VuCm+#FB% z=BzJ@e2_Z$S-Y-WL~%ei3W3ctF+aNStIkx|OOw*K>5avrFS^HQ&f2m>cQAye%lDSX zC0yl}pN~)wl%1gnJs)Mg_N|>@I4be_#{}x_^z2^mP+?QAt28bBG-$K&-?ra(En}W7 zqM=<1$2FWe?-B zuhD-gxY^}z{;Z^g45b2D4_))FBEv-2ODR+r1CsE~)M8>M6z&HBRVF-y_1K`(TTjgl zlOmNO`YXvyo4*(Spx?enUpf#_5gs5sB||W=QAkxV>lind{IJ?l6Q5-eRQi#kun=`APAWy^$M^{mA_xZI4~e zp0;Pw@8okV7$enXlee@+Uuq73Yo7c9%1Kx5bzvWox#KT_DFq z3G;z;XP#r_$gLW@miF+X00rHubGTLfjAZ4?!MC}c(eqawB*gvX@70f0<$ZC8*N6+8 zR#7RJN#R&wuO7a`Z-|AoK-V>3a5d9#N?KF-CYO%qYn!;2<&L*SH=(<|biB`ANGO$Z z^wDIby^9M{j4oEb85p&S6Z?M5px$~9_+?LYgL36ud`-7cgDLZV{yheie46){ESq;cC#-rwu}(>kOmQ(e~C-)BqfT`6QA-}~{>Lq6&wMER+~ zG$x6S#lVv@fn0X#vA`a)5XRT@4A@@R9_ET^U$dv_*16-Wh_Ot94$*9gR4yZIuAQu2 z5e|J;=u}y`NsZSTdA-<>$lEgcsnzo{{#X<-RorT{bsiFAHEVJrvsyKZZ);f`GX$FS z!aO54tkmSwCmvmr)lyNTP$b(G1l0*dwFF0ai?_c~_5b)qwfzdC#XMO!Me{3s%&R2N zSLX7 z`NDgU@v~uaO}X;ka=$^^L|RfaE!=!L8ho)DZBbp!60C<^Sw4h?o_&*K7sR`Sl}o|9 z%6e7rvY%*jS&nnLHG+LsKkY%}XMt(huOj3G9X+U*kl)2vcjbM&b9bYYJW+pII4B`F zZyuHCMV4!B{2ep(YzL2}?{BJU9w|JmCMtZ_y4Yn-Cj7KHprDznFmpV4g+sA6wgxGC zv%x}5gCZei`?PK4=oJYZgH@Z#My|w(pvuy||WOQdG_WNA*Pu}JTkDv~O zG@FoHYUrOU3wgES6=EtWyCK?eRbo>&^R1}4uKeKgsUm1zWU=42sk+i^-(`i-{zUxL zPAy5|C618?6(t`QFMcL`(BDs%gRIv6iwfz(t$~j5dZq9p3mt4?AxM}hy2IzQHyQxCV!yWce*ivOw z1#(Tebv625HHCC;TXW%&a)2LKxHP3sZ_ln4Qxy0YlNUfcWPW@;d-dTB<9u)2JbQ{Q z!6&R)_eeJ>ZVq|ONeU0}(%6MwyQ!raXJas@KO**J1f1okYLXzC?Dt6x^+S{ShYh0L z*Q3Ck(pPEP=kdr@z9gMeH*5RUBD6@tyEMC8!;qU;R`J)XNRmc01yIPh$4iTo?Ap%v zzorqswIwUuF>0^VNmVLT8uaqzv*6a(OZr}GOa7@Vk!ADpwx~9{Gp1bnm$EL3`&Q$S zTlT%EtLL|z3AL!)6e^%|MXlrBn+iHn8lQxHhq+LAv~Vr;rlwu}vx3GSU{@z1 zEsLM8BY&quao4T5Lb&}0QmyULt6UQ?XK!WaA#u_EoGch}FUq{Z{nCInL5E(r350rK!>Wk^ebz;*I*JC2qKK zn6e2)zVWF6_FPWo4U+WjA54AaXlBrq!rU&77sc$kM8b-LKZ3IAzN?xb;y4Fym}ciL-FSz z_3E+1hhH;JKktuYF|g2sKunEH!M4YbRxe3$J%|U+pCSVWDAdQ&ZNWAcKUu!2ver}A z@TxzmVcQmx(XWk;$tK_^mIOPHZzCnBOc1_Pezp4n!E9$O_cFD{64eu2pzY*oem_+gH(|oxi98)PhD^9NV z=WFJJ_^Ft_WjL&FOst++^FwiV?3fAX0_S0YTN|etx<^|tMTdOhQsd&rQS9igR~L=1 z4;(DbPcB5tdN`w)`w{h(@ZRIT3!>=Q8!@GS{#XizyjQ5t-2T}pGT%{!?tS3!t@@i{Gnd5Arfh>G^DG;6f0 z&>KNX6@8s&H|K-!o(Wn;S==JZueIJj$?Ejc^gBp# zEm|$Hr*WvTE}S-h;I7z9AnL88t@L%cz)gh0y58|_o>trF9rcZtA)-d>rf+j%%{jcd z?;h?TlkYe?65@-lg_0y%NY~E;XErc}b!LA+rz)0qtZ!4XjGnF_y{}CFK|-J~u3Ski z^jc@bLhkoc`%3oA;iOlxFQ=10B~CmEdg1=17&fx)Zmox^smi zZhVKsnh2>ar)+_rY$xcH2-SjuXNB)QjCFFfy3MXT1woU@mA)ENO<#>{3uWu6<51|o zSf|&KBo@e<*SkhdJ-pB{vQn)`$7E0{rdW&zR1bwuGTMP{7h90Sy`RTe2I9b&Ce_puuZr!Pq+tVtmQF zLAOQ-W5JTro-a?m?!KQj6Y+w+?wqa>hb-%`1MAKYny5xK)bHNU!2;eRn|V!(OpiEf zZkCumd#p>Owr;!w97*%zLVTyt`ggBwXz{EfC5&&GJCP|V$_Z!D&Lm`aafqrlan zJXiBdq|*sUcjT1SqF#EER8^qee0c^`+WN&2vo8W^SZ!^!6r9zhgVjnQe$9gRJ_r$6#gbm_o@Dpn<&u860 zNigz*$qHgFx?y$3vNu-+UA#@EHT_njE>g_7jBm@R$a%eIV(4x=ZhcN7r8D6BZhDDJ z7uRaSWmXKsTyIav(3U8f?Uf*0|?y-sp`t)Wxquc6%HAd_w+kUZdEOI*; zaz&RS?|bzHD|g9L)9Ku7_LgcZZaG=@K#6Vrqdpi_S#6*dQ)3uhX?l_^kG>XOSec7~ zEYJIi!v7=N^Gib!y2WeSG4~9z#st|jpzaM!Q_BK3iwk70q;8QVmWO{2$K-lKFsc^& zuFdO({xzDEt6|}FJwLen!^4($b3c`7Zj7m=>|gNEmg9rsA_MdJ=qDd>d+3}f_;>FDt=0&z>rJQH3D{!PBa}ESci$Vg0-34UB z2@DeYsF?W6QwgOaw;Q2Sb|ICEmddH7->l;KmK(N-P1Yquu0X69?i+rE0tKMB#%d12-k@V6=jHiqVfF7MXAx=@A_lO zGB_k1{(_{m`I9*H1_n-+c3`qX1{22Qb2?gm3B;c|b}>aF#&B=zRg9f-qZhNxihi#% zT9eaIEa$58A>|dx%QFLyoktpy#BPW|AB=G%iit28ODk>AVtzTJMIP%1UFn)xRi&=G za>E7E5=lTS!xVxe$zx$xq;|#n)_Tv1-i(=l3fsp?jaU4X7vw$5~+^_(sx;mS92g^zDo*8|3U{U(*%$Dw`vPzuI^07S4s#A;=V~(u{v@pzqDgV`T|hNyH2j?2aaU^i489_YhcIo za};O{W4LgOX{l3@eiW0zzU-Y)v|M2j%jqPUcYakaEW@o`W0!nB^Siw=^#5RRYa7?+ z%I5d!q(Xmfi9X&Y)XUpQ(U1B{?Xt^!M=UTc9;v?#(H-qhwfU6$SvTo(bIb+sB>G29 z#tEW`7U8h$WkY|N= znMroB=w`J!fieyP;+@kyb0)&bNfKes$Ze%gF79q#tN0ZzL6ER?S+aq!ds6JrK;*)m zw5mmk{bn<28{^AEgt3!EN9P;;3HkPG73Ku%%)VS2qYGph!Ko9C%wMOf!m`a*q2qSF zAYRQD!)2`?l(uRNQg(6~`ExIb&n!B41}=Rza?Hk?9vv-{&Z082PWtBV_>6ssbES?F zTkyIrI!O*zKu&mM40dy508asRZkPKbk?W`?5f3H7FScq|b@80jHbO0~an`RP4Pee- z&zO*51b-;CWtQhKica(NWyQ=RSCya3ZO7*ibfjb?ro}u{?`Am`Nr-CjmaR!4E?ljU zWTH4%GZvg~`>@snhi)l%+1JqWOyry$?n^x9&z57Z%G`=P!n$Mu{7KAYI}x#jlH7uR zoX@3t*&twKr8)BkXtcDR0+SBAT*o9@W-%_rR(pv^-()Vq0J@7SqouF^I5A-Y&lExb$JB)a$zToj_?l#?7k59|z9Bo$y{~YXGwS29RUN zk3W8%Q2H~2wRAPJgU?mB(ezq$~>Myu~(DNTPoe`xW(_E zZ{9Uwm`mp`SsPf?U5mdw2t{_75#U-6zs^KDIA~a3BBm)>hRN3c_G(e$obISW4p%KL#dExF)P;6=g(g**4# zW=t+Qo!++ms>y(XpDdcuOl(xgNW~v?3FDnsK(g`HcbKr{doNl7!0N;ao zN5GcM;9<#2^H>ht4ZsX?kO;Y~Mz{@NEP!$bJ8Kypmb@f@w?0}KjQIDe|KEK638#o$ z06GRdbZ|KEx#Sgr`fq&T82^K!-xeEO$OjYJ)XNb_;iFZ;memn7*y|lEny{lN;bBQg6&M{HO0xwU1HL6-Tfl7xR$UQO zG84|3S7Ad6*aP!Rfd{Bp#EC2;Q@|x5r z@ra2jxah;};QmbV)Hy;lECLo=J;(nt2_g2Zr|BnBK&%i@q+uBa4^XeF6Irn2W-%~> zu$X`?Y{0gM<(H?3((*e1-3u7qYj8I33H74WKS}CuyoI%%Au#TQHEoB*G2~I$-Uu^T zfC+*5r@#Z$OV;e4;sD#)S|6%jxo2og1TcK8K)t;Q#{!>FFD;9IBSS0!Hz*@LdkZ@j zW3U~Ik+rR*p4}nkS{py^aTDOc_0a>Uhx=mMw)y9nY{5TA=q#p|HWpw@u$A2}KO95> zg4d$+1isE$K#C;+&Ds7;ClCLp*x(}r7Nf&5#IJbCo()JgB_P>=V{Ly2s25@6KjDGv zBY(~>{H;7xHHCm5P~8LIZ~O+sa^z9$KcQ{(49xY6!7OGFYbzF8Fsxu5k{y9ING;ev zG+}_#;{F7pP58HHY)vh#Z4FKJ4lS`4ha=DS0@gtv$Z__4Z{eBvPk7iYGmD<1p6Ov_ zDL+M9e3S?Tx+Mz&QSGCrXC6am`#E*}cap~!`$8LmhSZD@1Y+BVdsTBh?yvbG1RTaW z*xvl9bxEkZ@d)_uCL5S7I@siVichrT0?_aWE*I*B*YpoKVDgCt80Lb3%!Ab)*irxR z&c#}VoAyLtPq_?J5^9FC9;YRu@i1;F=#2R6Y64^XeAqu{@i0&;NH>TkAxpRWor zE(k;fsD}A}!UNPRr}GHma5mgF9cGziNzjC0lAVBOe^Y@qdOY@5HwlFD zYK?=qM=5Tien8#O2dvM2T=L8jxc^K%@ZQ!|a2)WWf7zQq2XRY62A__=!MY(F?0e;~SBwV;Ne;&CaK)e8$&;4VBa}+0051Vv2 zERG@k@e45Ju09XtF?>D6*R40Ldx3EXBpK8C2Mg_Wv zvBvx7cc5PA)F-fyAP#vY69nUfKsG?%dB57*w~iwooP;)zSi6 zca9#K|C)$6j7W|g+M#h91gc|4I?$%_fsZ4?2j+({y{br*;(_)=;VcNm{ks6e1`tEV z$1#r_oF5iR49;~U9H4?=`TV+23LX#CtEKX|NdD`AABId*=z16njHfz*8oqy0;lkAM z$U}PJheeRim8vrbwAonH2gf9!<>MmwU5Ni%ygj^{40$#w#lz4CZyZHPHvlZw(d8O$vk?aMF#5r(DG~Iz zi~mB0^&1c49=tUV!BrtYmiyOg&*A)occvlu<&?+q|Lf)*Ci&nsI0z&+-4V#&m*O03 zQx0yoM6gIyj$py;5U^(uPJ(^o;0P7AYY`rngveEoCjHfyIJk=uj)8iq9EbT`yMFI! z{G|^uNI1Cr4*_;iJ3`;j{x-Z#hOHGH$Ak@~;Q{J3cp~%f7Wt$Y_V&nF)A+dbyY!M?9hpJ}eOqI&31M z7(6zL-|m~oY2H60SZsNm=Ktno4|+`$Fg7ur8urw+0Y`V%48V%Ep9 z|7v>?DSdcB-ruu+a_qUA+^5#{)xTM0t;<_X~ab2SL|;iC5sWbQzY7yXO<%emrU zLLc<0Kq$^Rp88jti_nZnkApq{2)c&-ahiX71jtLH0v%rvNDKHQ2MjB;9e@EB=zjpm CC0z9Y diff --git a/.yarn/cache/tslib-npm-2.4.1-36f0ed04db-e14311d539.zip b/.yarn/cache/tslib-npm-2.4.1-36f0ed04db-e14311d539.zip deleted file mode 100644 index d6f40b2d786387b316c6ae64e919043a274aed61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17643 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 YKtUQ5?2r2Jzdx40-99z~fBgD?0GnkZng9R* diff --git a/.yarn/cache/tslib-npm-2.5.0-bb364efebd-ea556fbdf3.zip b/.yarn/cache/tslib-npm-2.5.0-bb364efebd-ea556fbdf3.zip deleted file mode 100644 index 11112dd8937160cd48167e3c2cfde9dc7cd5d58e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19473 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 E0GV99Gynhq diff --git a/.yarn/cache/which-typed-array-npm-1.1.9-9559c95dfc-90ef760a09.zip b/.yarn/cache/which-typed-array-npm-1.1.9-9559c95dfc-90ef760a09.zip deleted file mode 100644 index ef1370d498902986e8be5e3abda67d330c530e41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12415 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 D39!)D diff --git a/package.json b/package.json index cec8057632..5e84dd100a 100644 --- a/package.json +++ b/package.json @@ -88,7 +88,8 @@ "ansi-regex": "5.0.1", "cacache": "18.0.0", "node-gyp": "10.0.1", - "follow-redirects": "^1.15.4" + "follow-redirects": "^1.15.4", + "socks": "^2.7.3" }, "dependencies": { "node-gyp": "^10.0.1" diff --git a/yarn.lock b/yarn.lock index 2b6846d32b..276733748f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -80,16 +80,7 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.16.7": - version: 7.16.7 - resolution: "@babel/code-frame@npm:7.16.7" - dependencies: - "@babel/highlight": "npm:^7.16.7" - checksum: db2f7faa31bc2c9cf63197b481b30ea57147a5fc1a6fab60e5d6c02cdfbf6de8e17b5121f99917b3dabb5eeb572da078312e70697415940383efc140d4e0808b - languageName: node - linkType: hard - -"@babel/code-frame@npm:^7.22.13": +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.22.13": version: 7.22.13 resolution: "@babel/code-frame@npm:7.22.13" dependencies: @@ -143,17 +134,6 @@ __metadata: languageName: node linkType: hard -"@babel/generator@npm:^7.17.3": - version: 7.17.3 - resolution: "@babel/generator@npm:7.17.3" - dependencies: - "@babel/types": "npm:^7.17.0" - jsesc: "npm:^2.5.1" - source-map: "npm:^0.5.0" - checksum: 9a102a87b4e477aace1febc89a3692faf09c442015f24c3dffc1f54691498a73bd97a9eda9120be5626ede62728e15f7942ce841ff96c5b464703c701a7ab82a - languageName: node - linkType: hard - "@babel/generator@npm:^7.23.3": version: 7.23.3 resolution: "@babel/generator@npm:7.23.3" @@ -244,15 +224,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-environment-visitor@npm:^7.16.7": - version: 7.16.7 - resolution: "@babel/helper-environment-visitor@npm:7.16.7" - dependencies: - "@babel/types": "npm:^7.16.7" - checksum: c03a10105d9ebd1fe632a77356b2e6e2f3c44edba9a93b0dc3591b6a66bd7a2e323dd9502f9ce96fc6401234abff1907aa877b6674f7826b61c953f7c8204bbe - languageName: node - linkType: hard - "@babel/helper-environment-visitor@npm:^7.22.20, @babel/helper-environment-visitor@npm:^7.22.5": version: 7.22.20 resolution: "@babel/helper-environment-visitor@npm:7.22.20" @@ -260,17 +231,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-function-name@npm:^7.16.7": - version: 7.16.7 - resolution: "@babel/helper-function-name@npm:7.16.7" - dependencies: - "@babel/helper-get-function-arity": "npm:^7.16.7" - "@babel/template": "npm:^7.16.7" - "@babel/types": "npm:^7.16.7" - checksum: 12e2678236f4c708ab0a4235f0e3559906c1461b3644c6a0d1993652193c1c272c4bd4627a8d550b088f24d1df2f4683dee7ba15c1c643061cc5e768fafa78fa - languageName: node - linkType: hard - "@babel/helper-function-name@npm:^7.22.5, @babel/helper-function-name@npm:^7.23.0": version: 7.23.0 resolution: "@babel/helper-function-name@npm:7.23.0" @@ -281,24 +241,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-get-function-arity@npm:^7.16.7": - version: 7.16.7 - resolution: "@babel/helper-get-function-arity@npm:7.16.7" - dependencies: - "@babel/types": "npm:^7.16.7" - checksum: 25d969fb207ff2ad5f57a90d118f6c42d56a0171022e200aaa919ba7dc95ae7f92ec71cdea6c63ef3629a0dc962ab4c78e09ca2b437185ab44539193f796e0c3 - languageName: node - linkType: hard - -"@babel/helper-hoist-variables@npm:^7.16.7": - version: 7.16.7 - resolution: "@babel/helper-hoist-variables@npm:7.16.7" - dependencies: - "@babel/types": "npm:^7.16.7" - checksum: 6ae1641f4a751cd9045346e3f61c3d9ec1312fd779ab6d6fecfe2a96e59a481ad5d7e40d2a840894c13b3fd6114345b157f9e3062fc5f1580f284636e722de60 - languageName: node - linkType: hard - "@babel/helper-hoist-variables@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-hoist-variables@npm:7.22.5" @@ -350,14 +292,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": - version: 7.14.5 - resolution: "@babel/helper-plugin-utils@npm:7.14.5" - checksum: fe20e90a24d02770a60ebe80ab9f0dfd7258503cea8006c71709ac9af1aa3e47b0de569499673f11ea6c99597f8c0e4880ae1d505986e61101b69716820972fe - languageName: node - linkType: hard - -"@babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5": +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": version: 7.22.5 resolution: "@babel/helper-plugin-utils@npm:7.22.5" checksum: ab220db218089a2aadd0582f5833fd17fa300245999f5f8784b10f5a75267c4e808592284a29438a0da365e702f05acb369f99e1c915c02f9f9210ec60eab8ea @@ -408,15 +343,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-split-export-declaration@npm:^7.16.7": - version: 7.16.7 - resolution: "@babel/helper-split-export-declaration@npm:7.16.7" - dependencies: - "@babel/types": "npm:^7.16.7" - checksum: e10aaf135465c55114627951b79115f24bc7af72ecbb58d541d66daf1edaee5dde7cae3ec8c3639afaf74526c03ae3ce723444e3b5b3dc77140c456cd84bcaa1 - languageName: node - linkType: hard - "@babel/helper-split-export-declaration@npm:^7.22.6": version: 7.22.6 resolution: "@babel/helper-split-export-declaration@npm:7.22.6" @@ -433,13 +359,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.16.7": - version: 7.16.7 - resolution: "@babel/helper-validator-identifier@npm:7.16.7" - checksum: 42b9b56c3543ded08992e8c118cb017dbde258895bd6a2e69186cb98f4f5811cd94ceedf4b5ace4877e7be07a7280aa9b9de65d1cb416064a1e0e1fd5a89fcca - languageName: node - linkType: hard - "@babel/helper-validator-identifier@npm:^7.22.20": version: 7.22.20 resolution: "@babel/helper-validator-identifier@npm:7.22.20" @@ -476,17 +395,6 @@ __metadata: languageName: node linkType: hard -"@babel/highlight@npm:^7.16.7": - version: 7.16.10 - resolution: "@babel/highlight@npm:7.16.10" - dependencies: - "@babel/helper-validator-identifier": "npm:^7.16.7" - chalk: "npm:^2.0.0" - js-tokens: "npm:^4.0.0" - checksum: 1f1bdd752a90844f4efc22166a46303fb651ba0fd75a06daba3ebae2575ab3edc1da9827c279872a3aaf305f50a18473c5fa1966752726a2b253065fd4c0745e - languageName: node - linkType: hard - "@babel/highlight@npm:^7.22.13": version: 7.22.20 resolution: "@babel/highlight@npm:7.22.20" @@ -498,16 +406,7 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.16.7, @babel/parser@npm:^7.17.3, @babel/parser@npm:^7.7.0": - version: 7.17.3 - resolution: "@babel/parser@npm:7.17.3" - bin: - parser: ./bin/babel-parser.js - checksum: 2d45750cdf0565842a1210928534f73dacfbfd3c45be6e85961e34e8c7d74643721f802d331fad3bfdcc783fb5ab8703432e43c9e7b460588ec6ee26242793be - languageName: node - linkType: hard - -"@babel/parser@npm:^7.22.15, @babel/parser@npm:^7.23.3": +"@babel/parser@npm:^7.22.15, @babel/parser@npm:^7.23.3, @babel/parser@npm:^7.7.0": version: 7.23.3 resolution: "@babel/parser@npm:7.23.3" bin: @@ -1459,17 +1358,6 @@ __metadata: languageName: node linkType: hard -"@babel/template@npm:^7.16.7": - version: 7.16.7 - resolution: "@babel/template@npm:7.16.7" - dependencies: - "@babel/code-frame": "npm:^7.16.7" - "@babel/parser": "npm:^7.16.7" - "@babel/types": "npm:^7.16.7" - checksum: f35836a8cd53663508bc5e0b13e7fe3d646197fc1baa74c21d3a713c0c91d39fe6f6c5be8ec1ec139b3d0a00443ab1b8cc7ddf88c6ceb6f9fcf7ea0ae7594eca - languageName: node - linkType: hard - "@babel/template@npm:^7.22.15": version: 7.22.15 resolution: "@babel/template@npm:7.22.15" @@ -1481,7 +1369,7 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.23.2, @babel/traverse@npm:^7.23.3": +"@babel/traverse@npm:^7.23.2, @babel/traverse@npm:^7.23.3, @babel/traverse@npm:^7.7.0": version: 7.23.3 resolution: "@babel/traverse@npm:7.23.3" dependencies: @@ -1499,35 +1387,7 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.7.0": - version: 7.17.3 - resolution: "@babel/traverse@npm:7.17.3" - dependencies: - "@babel/code-frame": "npm:^7.16.7" - "@babel/generator": "npm:^7.17.3" - "@babel/helper-environment-visitor": "npm:^7.16.7" - "@babel/helper-function-name": "npm:^7.16.7" - "@babel/helper-hoist-variables": "npm:^7.16.7" - "@babel/helper-split-export-declaration": "npm:^7.16.7" - "@babel/parser": "npm:^7.17.3" - "@babel/types": "npm:^7.17.0" - debug: "npm:^4.1.0" - globals: "npm:^11.1.0" - checksum: 03aed531e0baf999ef96deda702f48479d638cb1b172844953221c2244b9c2112f40706b42205e1b12bca06d14afe107ce388a9b9042ebbacd6a64e0e20ab37d - languageName: node - linkType: hard - -"@babel/types@npm:^7.16.7, @babel/types@npm:^7.17.0, @babel/types@npm:^7.4.4, @babel/types@npm:^7.7.0, @babel/types@npm:^7.8.3": - version: 7.17.0 - resolution: "@babel/types@npm:7.17.0" - dependencies: - "@babel/helper-validator-identifier": "npm:^7.16.7" - to-fast-properties: "npm:^2.0.0" - checksum: 535ccef360d0c74e2bb685050f3a45e6ab30f66c740bbdd0858148ed502043f1ae2006a9d0269ac3b7356b690091ae313efd912e408bc0198d80a14b2a6f1537 - languageName: node - linkType: hard - -"@babel/types@npm:^7.22.15, @babel/types@npm:^7.22.19, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.23.3": +"@babel/types@npm:^7.22.15, @babel/types@npm:^7.22.19, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.23.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.7.0, @babel/types@npm:^7.8.3": version: 7.23.3 resolution: "@babel/types@npm:7.23.3" dependencies: @@ -1552,22 +1412,6 @@ __metadata: languageName: node linkType: hard -"@cspotcode/source-map-consumer@npm:0.8.0": - version: 0.8.0 - resolution: "@cspotcode/source-map-consumer@npm:0.8.0" - checksum: dfe1399712e4d54e1d53b0c7782f929647ff8675c37ae7637ce2ffdbcc8bad06fea969bcbec6147e7ea70a89257cfc86695a3702c1946a1c334454480937b966 - languageName: node - linkType: hard - -"@cspotcode/source-map-support@npm:0.7.0": - version: 0.7.0 - resolution: "@cspotcode/source-map-support@npm:0.7.0" - dependencies: - "@cspotcode/source-map-consumer": "npm:0.8.0" - checksum: d58b31640c4b1438c0caf8ed7eb46647674c042a625919660d9fb2d76f3621875520082934bae88ef54a75d53e8f9cafb506160bb02403a19e7155aa5f4ac59b - languageName: node - linkType: hard - "@cspotcode/source-map-support@npm:^0.8.0": version: 0.8.1 resolution: "@cspotcode/source-map-support@npm:0.8.1" @@ -2188,18 +2032,7 @@ __metadata: languageName: node linkType: hard -"@eslint-community/eslint-utils@npm:^4.2.0": - version: 4.2.0 - resolution: "@eslint-community/eslint-utils@npm:4.2.0" - dependencies: - eslint-visitor-keys: "npm:^3.3.0" - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - checksum: ef8b20b0c70b06c3396663d485a96b6c1f52c48d40dec07c6369f90d79a6feeb1bc8230cb7fd672dd03486c4f224c1f6d8ba35844cd1168f537c559d0a72903d - languageName: node - linkType: hard - -"@eslint-community/eslint-utils@npm:^4.4.0": +"@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": version: 4.4.0 resolution: "@eslint-community/eslint-utils@npm:4.4.0" dependencies: @@ -2210,14 +2043,7 @@ __metadata: languageName: node linkType: hard -"@eslint-community/regexpp@npm:^4.4.0": - version: 4.4.0 - resolution: "@eslint-community/regexpp@npm:4.4.0" - checksum: 3d9b740479088dc12e1d7f03f45dbb792dcbc7deb17432b0e1eae1a99eb0adbe4e60df8b0519a03bc35f56562b1ad0a09c004e14fbd1ee8bc2759702c9239643 - languageName: node - linkType: hard - -"@eslint-community/regexpp@npm:^4.6.1": +"@eslint-community/regexpp@npm:^4.4.0, @eslint-community/regexpp@npm:^4.6.1": version: 4.10.0 resolution: "@eslint-community/regexpp@npm:4.10.0" checksum: 8c36169c815fc5d726078e8c71a5b592957ee60d08c6470f9ce0187c8046af1a00afbda0a065cc40ff18d5d83f82aed9793c6818f7304a74a7488dc9f3ecbd42 @@ -2383,18 +2209,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/gen-mapping@npm:^0.3.0": - version: 0.3.2 - resolution: "@jridgewell/gen-mapping@npm:0.3.2" - dependencies: - "@jridgewell/set-array": "npm:^1.0.1" - "@jridgewell/sourcemap-codec": "npm:^1.4.10" - "@jridgewell/trace-mapping": "npm:^0.3.9" - checksum: 7ba0070be1aeda7d7694b09d847c3b95879409b26559b9d7e97a88ec94b838fb380df43ae328ee2d2df4d79e75d7afe6ba315199d18d79aa20839ebdfb739420 - languageName: node - linkType: hard - -"@jridgewell/gen-mapping@npm:^0.3.2": +"@jridgewell/gen-mapping@npm:^0.3.0, @jridgewell/gen-mapping@npm:^0.3.2": version: 0.3.3 resolution: "@jridgewell/gen-mapping@npm:0.3.3" dependencies: @@ -2405,20 +2220,13 @@ __metadata: languageName: node linkType: hard -"@jridgewell/resolve-uri@npm:3.1.0": +"@jridgewell/resolve-uri@npm:3.1.0, @jridgewell/resolve-uri@npm:^3.0.3": version: 3.1.0 resolution: "@jridgewell/resolve-uri@npm:3.1.0" checksum: 320ceb37af56953757b28e5b90c34556157676d41e3d0a3ff88769274d62373582bb0f0276a4f2d29c3f4fdd55b82b8be5731f52d391ad2ecae9b321ee1c742d languageName: node linkType: hard -"@jridgewell/resolve-uri@npm:^3.0.3": - version: 3.0.8 - resolution: "@jridgewell/resolve-uri@npm:3.0.8" - checksum: ba6bb26baed68bb3fdcbbcbb754587ad6256e424343b1959c58962354ee8513f9dd6fbf8243f7382b01e9e1cba4d713a0389ad2ac545fafe31dbbc2cf5b0181f - languageName: node - linkType: hard - "@jridgewell/set-array@npm:^1.0.1": version: 1.1.2 resolution: "@jridgewell/set-array@npm:1.1.2" @@ -2453,7 +2261,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.17": +"@jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.7, @jridgewell/trace-mapping@npm:^0.3.9": version: 0.3.18 resolution: "@jridgewell/trace-mapping@npm:0.3.18" dependencies: @@ -2463,16 +2271,6 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.7, @jridgewell/trace-mapping@npm:^0.3.9": - version: 0.3.15 - resolution: "@jridgewell/trace-mapping@npm:0.3.15" - dependencies: - "@jridgewell/resolve-uri": "npm:^3.0.3" - "@jridgewell/sourcemap-codec": "npm:^1.4.10" - checksum: c889039e050a1f3b679e5ecbb1719e2ecbef0d4b3385085af4a0402d51ecaba47b5d2afc6ecd8915c324423be0741b235fdbc5be7c6c28e6019e984d17258a18 - languageName: node - linkType: hard - "@jsdevtools/ono@npm:^7.1.0": version: 7.1.3 resolution: "@jsdevtools/ono@npm:7.1.3" @@ -3454,14 +3252,7 @@ __metadata: languageName: node linkType: hard -"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": - version: 7.0.11 - resolution: "@types/json-schema@npm:7.0.11" - checksum: e50864a93f4dcb9de64c0c605d836f5416341c824d7a8cde1aa15a5fc68bed44b33cdcb2e04e5098339e9121848378f2d0cc5b124dec41c89203c6f67d6f344a - languageName: node - linkType: hard - -"@types/json-schema@npm:^7.0.12": +"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.12, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": version: 7.0.15 resolution: "@types/json-schema@npm:7.0.15" checksum: 1a3c3e06236e4c4aab89499c428d585527ce50c24fe8259e8b3926d3df4cfbbbcf306cfc73ddfb66cbafc973116efd15967020b0f738f63e09e64c7d260519e7 @@ -3505,10 +3296,10 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:*, @types/node@npm:>=10.0.0, @types/node@npm:>=12.12.47, @types/node@npm:>=13.7.0": - version: 17.0.21 - resolution: "@types/node@npm:17.0.21" - checksum: 2beae12b0240834801d45d1f6afec1905325054ba0768ba8fa60144eea62ac3751cb2b787a32795c1611a870b2cb4bf4d58caf21f20b126b2bb2454fe6e2437c +"@types/node@npm:*, @types/node@npm:>=10.0.0, @types/node@npm:>=12.12.47, @types/node@npm:>=13.7.0, @types/node@npm:^18.11.11": + version: 18.16.1 + resolution: "@types/node@npm:18.16.1" + checksum: d77a82fa404153804b916b31ea652507428a8076b447d4cbfe5da057fc3dd9abe26c2ac4b41d758d7287adaacc2d16a877e474105024b880aaaa2e193bebb356 languageName: node linkType: hard @@ -3547,13 +3338,6 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^18.11.11": - version: 18.16.1 - resolution: "@types/node@npm:18.16.1" - checksum: d77a82fa404153804b916b31ea652507428a8076b447d4cbfe5da057fc3dd9abe26c2ac4b41d758d7287adaacc2d16a877e474105024b880aaaa2e193bebb356 - languageName: node - linkType: hard - "@types/normalize-package-data@npm:^2.4.0": version: 2.4.1 resolution: "@types/normalize-package-data@npm:2.4.1" @@ -3570,14 +3354,7 @@ __metadata: languageName: node linkType: hard -"@types/semver@npm:^7.1.0, @types/semver@npm:^7.3.12": - version: 7.3.13 - resolution: "@types/semver@npm:7.3.13" - checksum: 0064efd7a0515a539062b71630c72ca2b058501b957326c285cdff82f42c1716d9f9f831332ccf719d5ee8cc3ef24f9ff62122d7a7140c73959a240b49b0f62d - languageName: node - linkType: hard - -"@types/semver@npm:^7.5.0": +"@types/semver@npm:^7.1.0, @types/semver@npm:^7.3.12, @types/semver@npm:^7.5.0": version: 7.5.5 resolution: "@types/semver@npm:7.5.5" checksum: 1b0be2c4d830f5ef002a305308e06e3616fc38a41c9a2c5b4267df82a038d9bd0ba32ec1da82a52db84a720be7e4b69bac7593797d8dc1400a69069af8f19219 @@ -4226,7 +4003,7 @@ __metadata: languageName: node linkType: hard -"acorn-jsx@npm:^5.3.1, acorn-jsx@npm:^5.3.2": +"acorn-jsx@npm:^5.3.2": version: 5.3.2 resolution: "acorn-jsx@npm:5.3.2" peerDependencies: @@ -4242,16 +4019,7 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.4.1, acorn@npm:^8.5.0, acorn@npm:^8.6.0, acorn@npm:^8.7.1": - version: 8.8.2 - resolution: "acorn@npm:8.8.2" - bin: - acorn: bin/acorn - checksum: b4e77d56d24d3e11a45d9ac8ae661b4e14a4af04ae33edbf1e6bf910887e5bb352cc60e9ea06a0944880e6b658f58c095d3b54e88e1921cb9319608b51085dd7 - languageName: node - linkType: hard - -"acorn@npm:^8.9.0": +"acorn@npm:^8.4.1, acorn@npm:^8.5.0, acorn@npm:^8.7.1, acorn@npm:^8.9.0": version: 8.11.2 resolution: "acorn@npm:8.11.2" bin: @@ -4285,18 +4053,7 @@ __metadata: languageName: node linkType: hard -"agentkeepalive@npm:^4.2.0": - version: 4.2.0 - resolution: "agentkeepalive@npm:4.2.0" - dependencies: - debug: "npm:^4.1.0" - depd: "npm:^1.1.2" - humanize-ms: "npm:^1.2.1" - checksum: cc6e1b4f1cba6f93d30c02adae3b0e1b05c88dad0c39837467d8ee364aeb7bb85588252144bbd33649ac60322f955ec772a459ec165fcf7520a3fad1c8b77faf - languageName: node - linkType: hard - -"agentkeepalive@npm:^4.2.1": +"agentkeepalive@npm:^4.2.0, agentkeepalive@npm:^4.2.1": version: 4.3.0 resolution: "agentkeepalive@npm:4.3.0" dependencies: @@ -4373,19 +4130,7 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^8.0.0, ajv@npm:^8.0.1, ajv@npm:^8.6.0": - version: 8.8.1 - resolution: "ajv@npm:8.8.1" - dependencies: - fast-deep-equal: "npm:^3.1.1" - json-schema-traverse: "npm:^1.0.0" - require-from-string: "npm:^2.0.2" - uri-js: "npm:^4.2.2" - checksum: fc52cd18c97a8e9bee23e951a0b4c82d045cb7ad60904a0222cc5bcc2c6165ebab714d0ed9e4c80e08140184a2a078838dae4820d0fe9706133290ae4e871a7a - languageName: node - linkType: hard - -"ajv@npm:^8.9.0": +"ajv@npm:^8.0.0, ajv@npm:^8.0.1, ajv@npm:^8.6.0, ajv@npm:^8.9.0": version: 8.12.0 resolution: "ajv@npm:8.12.0" dependencies: @@ -5138,22 +4883,7 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.14.5": - version: 4.18.1 - resolution: "browserslist@npm:4.18.1" - dependencies: - caniuse-lite: "npm:^1.0.30001280" - electron-to-chromium: "npm:^1.3.896" - escalade: "npm:^3.1.1" - node-releases: "npm:^2.0.1" - picocolors: "npm:^1.0.0" - bin: - browserslist: cli.js - checksum: 83bb8dd04c23248a63a7b008dfb77472a1b19989efc1b0c9f3fab69b459d0c38bdf2bf3c0c4d47a714963ee266f75b2f3fa0aa4d703865ff7f90aca181a25f56 - languageName: node - linkType: hard - -"browserslist@npm:^4.21.9, browserslist@npm:^4.22.1": +"browserslist@npm:^4.14.5, browserslist@npm:^4.21.9, browserslist@npm:^4.22.1": version: 4.22.1 resolution: "browserslist@npm:4.22.1" dependencies: @@ -5358,17 +5088,7 @@ __metadata: languageName: node linkType: hard -"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2": - version: 1.0.2 - resolution: "call-bind@npm:1.0.2" - dependencies: - function-bind: "npm:^1.1.1" - get-intrinsic: "npm:^1.0.2" - checksum: ca787179c1cbe09e1697b56ad499fd05dc0ae6febe5081d728176ade699ea6b1589240cb1ff1fe11fcf9f61538c1af60ad37e8eb2ceb4ef21cd6085dfd3ccedd - languageName: node - linkType: hard - -"call-bind@npm:^1.0.4, call-bind@npm:^1.0.5": +"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2, call-bind@npm:^1.0.4, call-bind@npm:^1.0.5": version: 1.0.5 resolution: "call-bind@npm:1.0.5" dependencies: @@ -5428,13 +5148,6 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001280": - version: 1.0.30001282 - resolution: "caniuse-lite@npm:1.0.30001282" - checksum: 7802b8e0999b3bb01da5a291b6f33cba98f1819ff43f7318adb2df1d63f213a751ab32fa8c66a6d53c953be16e710cd82a110286c3bd7c0b5c7ea83a70211816 - languageName: node - linkType: hard - "caniuse-lite@npm:^1.0.30001541": version: 1.0.30001561 resolution: "caniuse-lite@npm:1.0.30001561" @@ -5520,7 +5233,7 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^2.0.0, chalk@npm:^2.0.1, chalk@npm:^2.1.0, chalk@npm:^2.4.2": +"chalk@npm:^2.0.1, chalk@npm:^2.1.0, chalk@npm:^2.4.2": version: 2.4.2 resolution: "chalk@npm:2.4.2" dependencies: @@ -5592,14 +5305,7 @@ __metadata: languageName: node linkType: hard -"check-error@npm:^1.0.2": - version: 1.0.2 - resolution: "check-error@npm:1.0.2" - checksum: 011e74b2eac49bd42c5610f15d6949d982e7ec946247da0276278a90e7476e6b88d25d3c605a4115d5e3575312e1f5a11e91c82290c8a47ca275c92f5d0981db - languageName: node - linkType: hard - -"check-error@npm:^1.0.3": +"check-error@npm:^1.0.2, check-error@npm:^1.0.3": version: 1.0.3 resolution: "check-error@npm:1.0.3" dependencies: @@ -5910,14 +5616,7 @@ __metadata: languageName: node linkType: hard -"colorette@npm:^2.0.14, colorette@npm:^2.0.19": - version: 2.0.19 - resolution: "colorette@npm:2.0.19" - checksum: 6e2606435cd30e1cae8fc6601b024fdd809e20515c57ce1e588d0518403cff0c98abf807912ba543645a9188af36763b69b67e353d47397f24a1c961aba300bd - languageName: node - linkType: hard - -"colorette@npm:^2.0.7": +"colorette@npm:^2.0.14, colorette@npm:^2.0.19, colorette@npm:^2.0.7": version: 2.0.20 resolution: "colorette@npm:2.0.20" checksum: 0b8de48bfa5d10afc160b8eaa2b9938f34a892530b2f7d7897e0458d9535a066e3998b49da9d21161c78225b272df19ae3a64d6df28b4c9734c0e55bbd02406f @@ -6795,17 +6494,7 @@ __metadata: languageName: node linkType: hard -"define-properties@npm:^1.1.3, define-properties@npm:^1.1.4": - version: 1.2.0 - resolution: "define-properties@npm:1.2.0" - dependencies: - has-property-descriptors: "npm:^1.0.0" - object-keys: "npm:^1.1.1" - checksum: e60aee6a19b102df4e2b1f301816804e81ab48bb91f00d0d935f269bf4b3f79c88b39e4f89eaa132890d23267335fd1140dfcd8d5ccd61031a0a2c41a54e33a6 - languageName: node - linkType: hard - -"define-properties@npm:^1.2.0": +"define-properties@npm:^1.1.3, define-properties@npm:^1.1.4, define-properties@npm:^1.2.0": version: 1.2.1 resolution: "define-properties@npm:1.2.1" dependencies: @@ -6837,13 +6526,6 @@ __metadata: languageName: node linkType: hard -"depd@npm:^1.1.2, depd@npm:~1.1.2": - version: 1.1.2 - resolution: "depd@npm:1.1.2" - checksum: 2ed6966fc14463a9e85451db330ab8ba041efed0b9a1a472dbfc6fbf2f82bab66491915f996b25d8517dddc36c8c74e24c30879b34877f3c4410733444a51d1d - languageName: node - linkType: hard - "depd@npm:^2.0.0": version: 2.0.0 resolution: "depd@npm:2.0.0" @@ -6851,6 +6533,13 @@ __metadata: languageName: node linkType: hard +"depd@npm:~1.1.2": + version: 1.1.2 + resolution: "depd@npm:1.1.2" + checksum: 2ed6966fc14463a9e85451db330ab8ba041efed0b9a1a472dbfc6fbf2f82bab66491915f996b25d8517dddc36c8c74e24c30879b34877f3c4410733444a51d1d + languageName: node + linkType: hard + "deprecation@npm:^2.0.0, deprecation@npm:^2.3.1": version: 2.3.1 resolution: "deprecation@npm:2.3.1" @@ -6892,7 +6581,7 @@ __metadata: languageName: node linkType: hard -"diff@npm:5.0.0, diff@npm:^5.0.0": +"diff@npm:5.0.0": version: 5.0.0 resolution: "diff@npm:5.0.0" checksum: 4a179a75b17cbb420eb9145be913f9ddb34b47cb2ba4301e80ae745122826a468f02ca8f5e56945958de26ace594899c8381acb6659c88e7803ef078b53d690c @@ -6913,7 +6602,7 @@ __metadata: languageName: node linkType: hard -"diff@npm:^5.1.0": +"diff@npm:^5.0.0, diff@npm:^5.1.0": version: 5.1.0 resolution: "diff@npm:5.1.0" checksum: f4557032a98b2967fe27b1a91dfcf8ebb6b9a24b1afe616b5c2312465100b861e9b8d4da374be535f2d6b967ce2f53826d7f6edc2a0d32b2ab55abc96acc2f9d @@ -7096,13 +6785,6 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.3.896": - version: 1.3.903 - resolution: "electron-to-chromium@npm:1.3.903" - checksum: 12a0c5ba72d3d5cbc6ae2a1fed33873c9e4b45f9c6e66b9f4ce1f4a6cddfcdc1e485701fffefb380c790b8f1414e67cfca3b24b67f0992c8caec8a9ad5612bcc - languageName: node - linkType: hard - "electron-to-chromium@npm:^1.4.535": version: 1.4.581 resolution: "electron-to-chromium@npm:1.4.581" @@ -7196,7 +6878,7 @@ __metadata: languageName: node linkType: hard -"enhanced-resolve@npm:^5.0.0": +"enhanced-resolve@npm:^5.0.0, enhanced-resolve@npm:^5.10.0": version: 5.15.0 resolution: "enhanced-resolve@npm:5.15.0" dependencies: @@ -7206,16 +6888,6 @@ __metadata: languageName: node linkType: hard -"enhanced-resolve@npm:^5.10.0": - version: 5.12.0 - resolution: "enhanced-resolve@npm:5.12.0" - dependencies: - graceful-fs: "npm:^4.2.4" - tapable: "npm:^2.2.0" - checksum: ea5b49a0641827c6a083eaa3a625f953f4bd4e8f015bf70b9fb8cf60a35aaeb44e567df2da91ed28efaea3882845016e1d22a3152c2fdf773ea14f39cbe3d8a9 - languageName: node - linkType: hard - "enquirer@github:dashpay/enquirer#patch-1": version: 2.3.6 resolution: "enquirer@https://github.com/dashpay/enquirer.git#commit=86aaef0b1c82dfaa3436775e6b37de310eeb94f5" @@ -7282,49 +6954,7 @@ __metadata: languageName: node linkType: hard -"es-abstract@npm:^1.19.0, es-abstract@npm:^1.20.4": - version: 1.21.2 - resolution: "es-abstract@npm:1.21.2" - dependencies: - array-buffer-byte-length: "npm:^1.0.0" - available-typed-arrays: "npm:^1.0.5" - call-bind: "npm:^1.0.2" - es-set-tostringtag: "npm:^2.0.1" - es-to-primitive: "npm:^1.2.1" - function.prototype.name: "npm:^1.1.5" - get-intrinsic: "npm:^1.2.0" - get-symbol-description: "npm:^1.0.0" - globalthis: "npm:^1.0.3" - gopd: "npm:^1.0.1" - has: "npm:^1.0.3" - has-property-descriptors: "npm:^1.0.0" - has-proto: "npm:^1.0.1" - has-symbols: "npm:^1.0.3" - internal-slot: "npm:^1.0.5" - is-array-buffer: "npm:^3.0.2" - is-callable: "npm:^1.2.7" - is-negative-zero: "npm:^2.0.2" - is-regex: "npm:^1.1.4" - is-shared-array-buffer: "npm:^1.0.2" - is-string: "npm:^1.0.7" - is-typed-array: "npm:^1.1.10" - is-weakref: "npm:^1.0.2" - object-inspect: "npm:^1.12.3" - object-keys: "npm:^1.1.1" - object.assign: "npm:^4.1.4" - regexp.prototype.flags: "npm:^1.4.3" - safe-regex-test: "npm:^1.0.0" - string.prototype.trim: "npm:^1.2.7" - string.prototype.trimend: "npm:^1.0.6" - string.prototype.trimstart: "npm:^1.0.6" - typed-array-length: "npm:^1.0.4" - unbox-primitive: "npm:^1.0.2" - which-typed-array: "npm:^1.1.9" - checksum: 2e1d6922c9a03d90f5a45fa56574a14f9436d9711ed424ace23ae87f79d0190dbffda1c0564980f6048dc2348f0390427a1fbae309fdb16a9ed42cd5c79dce6e - languageName: node - linkType: hard - -"es-abstract@npm:^1.22.1": +"es-abstract@npm:^1.20.4, es-abstract@npm:^1.22.1": version: 1.22.3 resolution: "es-abstract@npm:1.22.3" dependencies: @@ -7545,17 +7175,7 @@ __metadata: languageName: node linkType: hard -"eslint-import-resolver-node@npm:^0.3.6": - version: 0.3.6 - resolution: "eslint-import-resolver-node@npm:0.3.6" - dependencies: - debug: "npm:^3.2.7" - resolve: "npm:^1.20.0" - checksum: c35c6edb7e77980a90922be8aedfacde572839b817146ab9fbed01195cb173cc40aa02d44ba0950170cfd41add11bc652dda8efed7ca766d733dc1eefc174614 - languageName: node - linkType: hard - -"eslint-import-resolver-node@npm:^0.3.9": +"eslint-import-resolver-node@npm:^0.3.6, eslint-import-resolver-node@npm:^0.3.9": version: 0.3.9 resolution: "eslint-import-resolver-node@npm:0.3.9" dependencies: @@ -7691,14 +7311,7 @@ __metadata: languageName: node linkType: hard -"eslint-visitor-keys@npm:^3.1.0, eslint-visitor-keys@npm:^3.3.0": - version: 3.3.0 - resolution: "eslint-visitor-keys@npm:3.3.0" - checksum: 37a1a5912a0b1de0f6d26237d8903af8a3af402bbef6e4181aeda1ace12a67348a0356c677804cfc839f62e68c3845b3eb96bb8f334d30d5ce96348d482567ed - languageName: node - linkType: hard - -"eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": +"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": version: 3.4.3 resolution: "eslint-visitor-keys@npm:3.4.3" checksum: 3f357c554a9ea794b094a09bd4187e5eacd1bc0d0653c3adeb87962c548e6a1ab8f982b86963ae1337f5d976004146536dcee5d0e2806665b193fbfbf1a9231b @@ -7753,18 +7366,7 @@ __metadata: languageName: node linkType: hard -"espree@npm:^9.1.0": - version: 9.1.0 - resolution: "espree@npm:9.1.0" - dependencies: - acorn: "npm:^8.6.0" - acorn-jsx: "npm:^5.3.1" - eslint-visitor-keys: "npm:^3.1.0" - checksum: 8ade225f2423d94cac6a2ba65d966263a4b2f167eba8367954c96644453a4bf60d1f04c3ba92d9deb9f904fa56bf5e2fee600e45fe2af9dbb8f32a722a501490 - languageName: node - linkType: hard - -"espree@npm:^9.6.0, espree@npm:^9.6.1": +"espree@npm:^9.1.0, espree@npm:^9.6.0, espree@npm:^9.6.1": version: 9.6.1 resolution: "espree@npm:9.6.1" dependencies: @@ -7926,7 +7528,7 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:^3.2.2": +"fast-glob@npm:^3.2.2, fast-glob@npm:^3.2.5, fast-glob@npm:^3.2.9": version: 3.2.12 resolution: "fast-glob@npm:3.2.12" dependencies: @@ -7939,19 +7541,6 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:^3.2.5, fast-glob@npm:^3.2.9": - version: 3.2.11 - resolution: "fast-glob@npm:3.2.11" - dependencies: - "@nodelib/fs.stat": "npm:^2.0.2" - "@nodelib/fs.walk": "npm:^1.2.3" - glob-parent: "npm:^5.1.2" - merge2: "npm:^1.3.0" - micromatch: "npm:^4.0.4" - checksum: 6b736d92a47f27218a85bf184a4ccab9f707398f86711bf84d730243b10a999a85f79afc526133c044ebebfcb42a68d09f769fdbedcc00680ddd56e56a56483a - languageName: node - linkType: hard - "fast-json-patch@npm:^3.1.1": version: 3.1.1 resolution: "fast-json-patch@npm:3.1.1" @@ -8334,32 +7923,13 @@ __metadata: languageName: node linkType: hard -"function-bind@npm:^1.1.1": - version: 1.1.1 - resolution: "function-bind@npm:1.1.1" - checksum: d83f2968030678f0b8c3f2183d63dcd969344eb8b55b4eb826a94ccac6de8b87c95bebffda37a6386c74f152284eb02956ff2c496897f35d32bdc2628ac68ac5 - languageName: node - linkType: hard - -"function-bind@npm:^1.1.2": +"function-bind@npm:^1.1.1, function-bind@npm:^1.1.2": version: 1.1.2 resolution: "function-bind@npm:1.1.2" checksum: 185e20d20f10c8d661d59aac0f3b63b31132d492e1b11fcc2a93cb2c47257ebaee7407c38513efd2b35cafdf972d9beb2ea4593c1e0f3bf8f2744836928d7454 languageName: node linkType: hard -"function.prototype.name@npm:^1.1.5": - version: 1.1.5 - resolution: "function.prototype.name@npm:1.1.5" - dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.1.3" - es-abstract: "npm:^1.19.0" - functions-have-names: "npm:^1.2.2" - checksum: 5d426e5a38ac41747bcfce6191e0ec818ed18678c16cfc36b5d1ca87f56ff98c4ce958ee2c1ea2a18dc3da989844a37b1065311e2d2ae4cf12da8f82418b686b - languageName: node - linkType: hard - "function.prototype.name@npm:^1.1.6": version: 1.1.6 resolution: "function.prototype.name@npm:1.1.6" @@ -8379,7 +7949,7 @@ __metadata: languageName: node linkType: hard -"functions-have-names@npm:^1.2.2, functions-have-names@npm:^1.2.3": +"functions-have-names@npm:^1.2.3": version: 1.2.3 resolution: "functions-have-names@npm:1.2.3" checksum: 0ddfd3ed1066a55984aaecebf5419fbd9344a5c38dd120ffb0739fac4496758dcf371297440528b115e4367fc46e3abc86a2cc0ff44612181b175ae967a11a05 @@ -8424,18 +7994,7 @@ __metadata: languageName: node linkType: hard -"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.0": - version: 1.2.0 - resolution: "get-intrinsic@npm:1.2.0" - dependencies: - function-bind: "npm:^1.1.1" - has: "npm:^1.0.3" - has-symbols: "npm:^1.0.3" - checksum: f57c5fe67a96adace4f8e80c288728bcd0ccfdc82c9cc53e4a5ef1ec857b5f7ef4b1c289e39649b1df226bace81103630bf7e128c821f82cd603450036e54f97 - languageName: node - linkType: hard - -"get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.2": +"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.0, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.2": version: 1.2.2 resolution: "get-intrinsic@npm:1.2.2" dependencies: @@ -8616,7 +8175,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:^10.2.2, glob@npm:^10.3.10": +"glob@npm:^10.2.2, glob@npm:^10.3.10, glob@npm:^10.3.4": version: 10.3.10 resolution: "glob@npm:10.3.10" dependencies: @@ -8631,21 +8190,6 @@ __metadata: languageName: node linkType: hard -"glob@npm:^10.3.4": - version: 10.3.4 - resolution: "glob@npm:10.3.4" - dependencies: - foreground-child: "npm:^3.1.0" - jackspeak: "npm:^2.0.3" - minimatch: "npm:^9.0.1" - minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" - path-scurry: "npm:^1.10.1" - bin: - glob: dist/cjs/src/bin.js - checksum: 6375721bcd0c615fe4c1d61faaf9eb93e15d428f26bac6e85739221a84659b42601b2a085b20915142c0eb3d8a7155914884ff80f145d8c9f2397c8b771b8b60 - languageName: node - linkType: hard - "glob@npm:^8.0.0": version: 8.1.0 resolution: "glob@npm:8.1.0" @@ -8684,7 +8228,7 @@ __metadata: languageName: node linkType: hard -"globby@npm:^11, globby@npm:^11.0.1, globby@npm:^11.0.3, globby@npm:^11.1.0": +"globby@npm:^11, globby@npm:^11.0.1, globby@npm:^11.1.0": version: 11.1.0 resolution: "globby@npm:11.1.0" dependencies: @@ -9365,6 +8909,16 @@ __metadata: languageName: node linkType: hard +"ip-address@npm:^9.0.5": + version: 9.0.5 + resolution: "ip-address@npm:9.0.5" + dependencies: + jsbn: "npm:1.1.0" + sprintf-js: "npm:^1.1.3" + checksum: 1ed81e06721af012306329b31f532b5e24e00cb537be18ddc905a84f19fe8f83a09a1699862bf3a1ec4b9dea93c55a3fa5faf8b5ea380431469df540f38b092c + languageName: node + linkType: hard + "ip-regex@npm:^5.0.0": version: 5.0.0 resolution: "ip-regex@npm:5.0.0" @@ -9372,20 +8926,6 @@ __metadata: languageName: node linkType: hard -"ip@npm:^1.1.5": - version: 1.1.5 - resolution: "ip@npm:1.1.5" - checksum: 40a00572cf06b53f4c7b7fe6270a8427ef4c6c0820a380f9f1eb48a323eb09c7dbd16245b472cf5a2d083911d0deae4d712b6e6c88b346fa274e8ce07756a7d6 - languageName: node - linkType: hard - -"ip@npm:^2.0.0": - version: 2.0.0 - resolution: "ip@npm:2.0.0" - checksum: 1270b11e534a466fb4cf4426cbcc3a907c429389f7f4e4e3b288b42823562e88d6a509ceda8141a507de147ca506141f745005c0aa144569d94cf24a54eb52bc - languageName: node - linkType: hard - "irregular-plurals@npm:^3.2.0": version: 3.5.0 resolution: "irregular-plurals@npm:3.5.0" @@ -9472,7 +9012,7 @@ __metadata: languageName: node linkType: hard -"is-core-module@npm:^2.13.0, is-core-module@npm:^2.13.1": +"is-core-module@npm:^2.13.0, is-core-module@npm:^2.13.1, is-core-module@npm:^2.5.0, is-core-module@npm:^2.8.1": version: 2.13.1 resolution: "is-core-module@npm:2.13.1" dependencies: @@ -9481,15 +9021,6 @@ __metadata: languageName: node linkType: hard -"is-core-module@npm:^2.5.0, is-core-module@npm:^2.8.1": - version: 2.8.1 - resolution: "is-core-module@npm:2.8.1" - dependencies: - has: "npm:^1.0.3" - checksum: 80b33fbd450c3b7070a8ea101b730a8ae0aee326bb665cdb067220edbc98fb847d1294f8ded036d5b022827fb8d3e6fcf30313a601785c5d902db7660f6cd7b1 - languageName: node - linkType: hard - "is-date-object@npm:^1.0.1": version: 1.0.5 resolution: "is-date-object@npm:1.0.5" @@ -9709,20 +9240,7 @@ __metadata: languageName: node linkType: hard -"is-typed-array@npm:^1.1.10, is-typed-array@npm:^1.1.3, is-typed-array@npm:^1.1.9": - version: 1.1.10 - resolution: "is-typed-array@npm:1.1.10" - dependencies: - available-typed-arrays: "npm:^1.0.5" - call-bind: "npm:^1.0.2" - for-each: "npm:^0.3.3" - gopd: "npm:^1.0.1" - has-tostringtag: "npm:^1.0.0" - checksum: 2392b2473bbc994f5c30d6848e32bab3cab6c80b795aaec3020baf5419ff7df38fc11b3a043eb56d50f842394c578dbb204a7a29398099f895cf111c5b27f327 - languageName: node - linkType: hard - -"is-typed-array@npm:^1.1.12": +"is-typed-array@npm:^1.1.10, is-typed-array@npm:^1.1.12, is-typed-array@npm:^1.1.3, is-typed-array@npm:^1.1.9": version: 1.1.12 resolution: "is-typed-array@npm:1.1.12" dependencies: @@ -9842,14 +9360,7 @@ __metadata: languageName: node linkType: hard -"istanbul-lib-coverage@npm:^3.0.0": - version: 3.2.0 - resolution: "istanbul-lib-coverage@npm:3.2.0" - checksum: 31621b84ad29339242b63d454243f558a7958ee0b5177749bacf1f74be7d95d3fd93853738ef7eebcddfaf3eab014716e51392a8dbd5aa1bdc1b15c2ebc53c24 - languageName: node - linkType: hard - -"istanbul-lib-coverage@npm:^3.2.0": +"istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0": version: 3.2.2 resolution: "istanbul-lib-coverage@npm:3.2.2" checksum: 40bbdd1e937dfd8c830fa286d0f665e81b7a78bdabcd4565f6d5667c99828bda3db7fb7ac6b96a3e2e8a2461ddbc5452d9f8bc7d00cb00075fa6a3e99f5b6a81 @@ -9923,19 +9434,6 @@ __metadata: languageName: node linkType: hard -"jackspeak@npm:^2.0.3": - version: 2.3.3 - resolution: "jackspeak@npm:2.3.3" - dependencies: - "@isaacs/cliui": "npm:^8.0.2" - "@pkgjs/parseargs": "npm:^0.11.0" - dependenciesMeta: - "@pkgjs/parseargs": - optional: true - checksum: a4c7c1a3ffea90bbcaa2f7a0d2885861e94138982aef0ced8efd299b32ccb69645b49d27f5e3e81c57005002674dd7e2b5d08a4287e9110534e512ada53557b2 - languageName: node - linkType: hard - "jackspeak@npm:^2.3.5": version: 2.3.6 resolution: "jackspeak@npm:2.3.6" @@ -10103,6 +9601,13 @@ __metadata: languageName: node linkType: hard +"jsbn@npm:1.1.0": + version: 1.1.0 + resolution: "jsbn@npm:1.1.0" + checksum: bebe7ae829bbd586ce8cbe83501dd8cb8c282c8902a8aeeed0a073a89dc37e8103b1244f3c6acd60278bcbfe12d93a3f83c9ac396868a3b3bbc3c5e5e3b648ef + languageName: node + linkType: hard + "jsdoc-type-pratt-parser@npm:~4.0.0": version: 4.0.0 resolution: "jsdoc-type-pratt-parser@npm:4.0.0" @@ -10223,18 +9728,7 @@ __metadata: languageName: node linkType: hard -"json5@npm:^2.2.0": - version: 2.2.0 - resolution: "json5@npm:2.2.0" - dependencies: - minimist: "npm:^1.2.5" - bin: - json5: lib/cli.js - checksum: d72ea87423a250c7912e4f28fc489d210a7becbae38e6d1d82efd02b5fe1cd1b61a3a9eacd21771fb50c3fa975e262af3df975b43f20b64b0e77af793c1d44aa - languageName: node - linkType: hard - -"json5@npm:^2.2.2, json5@npm:^2.2.3": +"json5@npm:^2.2.0, json5@npm:^2.2.2, json5@npm:^2.2.3": version: 2.2.3 resolution: "json5@npm:2.2.3" bin: @@ -10795,7 +10289,7 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^10.0.1": +"lru-cache@npm:^10.0.1, lru-cache@npm:^9.1.1 || ^10.0.0": version: 10.0.2 resolution: "lru-cache@npm:10.0.2" dependencies: @@ -10822,27 +10316,13 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^7.3.1": - version: 7.3.1 - resolution: "lru-cache@npm:7.3.1" - checksum: 83adf549d8136bd7d39e04d7aaf1f4b7445e6a6675be19e27750c9014065fcfd49c155929e575c9e3dc1902fc0b381061494cd09980cbdd11fffcd5062203140 - languageName: node - linkType: hard - -"lru-cache@npm:^7.4.4, lru-cache@npm:^7.5.1, lru-cache@npm:^7.7.1": +"lru-cache@npm:^7.3.1, lru-cache@npm:^7.4.4, lru-cache@npm:^7.5.1, lru-cache@npm:^7.7.1": version: 7.18.3 resolution: "lru-cache@npm:7.18.3" checksum: 6029ca5aba3aacb554e919d7ef804fffd4adfc4c83db00fac8248c7c78811fb6d4b6f70f7fd9d55032b3823446546a007edaa66ad1f2377ae833bd983fac5d98 languageName: node linkType: hard -"lru-cache@npm:^9.1.1 || ^10.0.0": - version: 10.0.1 - resolution: "lru-cache@npm:10.0.1" - checksum: 5bb91a97a342a41fd049c3494b44d9e21a7d4843f9284d0a0b26f00bb0e436f1f627d0641c78f88be16b86b4231546c5ee4f284733fb530c7960f0bcd7579026 - languageName: node - linkType: hard - "ltgt@npm:~2.2.0": version: 2.2.1 resolution: "ltgt@npm:2.2.1" @@ -11000,30 +10480,7 @@ __metadata: languageName: node linkType: hard -"mem-fs-editor@npm:^8.1.2 || ^9.0.0": - version: 9.4.0 - resolution: "mem-fs-editor@npm:9.4.0" - dependencies: - binaryextensions: "npm:^4.16.0" - commondir: "npm:^1.0.1" - deep-extend: "npm:^0.6.0" - ejs: "npm:^3.1.6" - globby: "npm:^11.0.3" - isbinaryfile: "npm:^4.0.8" - minimatch: "npm:^3.0.4" - multimatch: "npm:^5.0.0" - normalize-path: "npm:^3.0.0" - textextensions: "npm:^5.13.0" - peerDependencies: - mem-fs: ^2.1.0 - peerDependenciesMeta: - mem-fs: - optional: true - checksum: b196c50010c4a2ccf26581b931953b090470a895bd2c5118e9c11e2dd6785e223b0a303d5286bc9779143f4b639264aed30dc980f7c137620181854ef63c6a0c - languageName: node - linkType: hard - -"mem-fs-editor@npm:^9.0.0": +"mem-fs-editor@npm:^8.1.2 || ^9.0.0, mem-fs-editor@npm:^9.0.0": version: 9.7.0 resolution: "mem-fs-editor@npm:9.7.0" dependencies: @@ -11271,16 +10728,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^5.0.0": - version: 5.0.0 - resolution: "minimatch@npm:5.0.0" - dependencies: - brace-expansion: "npm:^2.0.1" - checksum: ee05bf8c1830bd85100522f655ca0df35ff633cf76ceff7bdfa21597c2085a38e36a9c31cc069097d6c9a126f7486ccf97a187aca07b695d799ae20f54e2e9c3 - languageName: node - linkType: hard - -"minimatch@npm:^5.0.1": +"minimatch@npm:^5.0.0, minimatch@npm:^5.0.1": version: 5.1.6 resolution: "minimatch@npm:5.1.6" dependencies: @@ -11424,14 +10872,7 @@ __metadata: languageName: node linkType: hard -"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0": - version: 7.0.3 - resolution: "minipass@npm:7.0.3" - checksum: 04d72c8a437de54a024f3758ff17c0226efb532ef37dbdaca1ea6039c7b9b1704e612abbd2e3a0d2c825c64eb0a9ab266c843baa71d18ad1a279baecee28ed97 - languageName: node - linkType: hard - -"minipass@npm:^7.0.2, minipass@npm:^7.0.3": +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3": version: 7.0.4 resolution: "minipass@npm:7.0.4" checksum: e864bd02ceb5e0707696d58f7ce3a0b89233f0d686ef0d447a66db705c0846a8dc6f34865cd85256c1472ff623665f616b90b8ff58058b2ad996c5de747d2d18 @@ -11831,13 +11272,6 @@ __metadata: languageName: node linkType: hard -"node-releases@npm:^2.0.1": - version: 2.0.1 - resolution: "node-releases@npm:2.0.1" - checksum: b20dd8d4bced11f75060f0387e05e76b9dc4a0451f7bb3516eade6f50499ea7768ba95d8a60d520c193402df1e58cb3fe301510cc1c1ad68949c3d57b5149866 - languageName: node - linkType: hard - "node-releases@npm:^2.0.13": version: 2.0.13 resolution: "node-releases@npm:2.0.13" @@ -12178,14 +11612,7 @@ __metadata: languageName: node linkType: hard -"object-inspect@npm:^1.12.3, object-inspect@npm:^1.9.0": - version: 1.12.3 - resolution: "object-inspect@npm:1.12.3" - checksum: 532b0036f0472f561180fac0d04fe328ee01f57637624c83fb054f81b5bfe966cdf4200612a499ed391a7ca3c46b20a0bc3a55fc8241d944abe687c556a32b39 - languageName: node - linkType: hard - -"object-inspect@npm:^1.13.1": +"object-inspect@npm:^1.13.1, object-inspect@npm:^1.9.0": version: 1.13.1 resolution: "object-inspect@npm:1.13.1" checksum: 92f4989ed83422d56431bc39656d4c780348eb15d397ce352ade6b7fec08f973b53744bd41b94af021901e61acaf78fcc19e65bf464ecc0df958586a672700f0 @@ -13448,14 +12875,14 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:3, readable-stream@npm:^3.0.0, readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.5.0, readable-stream@npm:^3.6.0": - version: 3.6.0 - resolution: "readable-stream@npm:3.6.0" +"readable-stream@npm:3, readable-stream@npm:^3.0.0, readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.5.0, readable-stream@npm:^3.6.0, readable-stream@npm:^3.6.2": + version: 3.6.2 + resolution: "readable-stream@npm:3.6.2" dependencies: inherits: "npm:^2.0.3" string_decoder: "npm:^1.1.1" util-deprecate: "npm:^1.0.1" - checksum: b80b3e6a7fafb1c79de7db541de357f4a5ee73bd70c21672f5a7c840d27bb27bdb0151e7ba2fd82c4a888df22ce0c501b0d9f3e4dfe51688876701c437d59536 + checksum: d9e3e53193adcdb79d8f10f2a1f6989bd4389f5936c6f8b870e77570853561c362bee69feca2bbb7b32368ce96a85504aa4cedf7cf80f36e6a9de30d64244048 languageName: node linkType: hard @@ -13474,17 +12901,6 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^3.6.2": - version: 3.6.2 - resolution: "readable-stream@npm:3.6.2" - dependencies: - inherits: "npm:^2.0.3" - string_decoder: "npm:^1.1.1" - util-deprecate: "npm:^1.0.1" - checksum: d9e3e53193adcdb79d8f10f2a1f6989bd4389f5936c6f8b870e77570853561c362bee69feca2bbb7b32368ce96a85504aa4cedf7cf80f36e6a9de30d64244048 - languageName: node - linkType: hard - "readable-stream@npm:^4.0.0, readable-stream@npm:^4.3.0": version: 4.4.2 resolution: "readable-stream@npm:4.4.2" @@ -13607,17 +13023,6 @@ __metadata: languageName: node linkType: hard -"regexp.prototype.flags@npm:^1.4.3": - version: 1.4.3 - resolution: "regexp.prototype.flags@npm:1.4.3" - dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.1.3" - functions-have-names: "npm:^1.2.2" - checksum: 3cde7cd22f0cf9d04db0b77c825b14824c6e7d2ec77e17e8dba707ad1b3c70bb3f2ac5b4cad3c0932045ba61cb2fd1b8ef84a49140e952018bdae065cc001670 - languageName: node - linkType: hard - "regexp.prototype.flags@npm:^1.5.1": version: 1.5.1 resolution: "regexp.prototype.flags@npm:1.5.1" @@ -13749,20 +13154,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.1.6, resolve@npm:^1.10.0, resolve@npm:^1.12.0, resolve@npm:^1.14.2, resolve@npm:^1.20.0, resolve@npm:^1.9.0": - version: 1.22.0 - resolution: "resolve@npm:1.22.0" - dependencies: - is-core-module: "npm:^2.8.1" - path-parse: "npm:^1.0.7" - supports-preserve-symlinks-flag: "npm:^1.0.0" - bin: - resolve: bin/resolve - checksum: b2f7405d3092f8bb537105b364378698dd0e7428dd3e76a3f00424cdc0bf8a1d85c3f5dab036fd04154e29c8fc221a591697ec699eb1cbd37d9a628b8bb7ccf5 - languageName: node - linkType: hard - -"resolve@npm:^1.22.4": +"resolve@npm:^1.1.6, resolve@npm:^1.10.0, resolve@npm:^1.12.0, resolve@npm:^1.14.2, resolve@npm:^1.22.4, resolve@npm:^1.9.0": version: 1.22.8 resolution: "resolve@npm:1.22.8" dependencies: @@ -13775,20 +13167,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^1.1.6#optional!builtin, resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.12.0#optional!builtin, resolve@patch:resolve@npm%3A^1.14.2#optional!builtin, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin, resolve@patch:resolve@npm%3A^1.9.0#optional!builtin": - version: 1.22.0 - resolution: "resolve@patch:resolve@npm%3A1.22.0#optional!builtin::version=1.22.0&hash=c3c19d" - dependencies: - is-core-module: "npm:^2.8.1" - path-parse: "npm:^1.0.7" - supports-preserve-symlinks-flag: "npm:^1.0.0" - bin: - resolve: bin/resolve - checksum: cb53ccafb067fb04989dbff2ce7186d03f4a55b7283eab91b545d614b336dc509faa5c71210ce77ab1a4b0f7de4ffbccc170febcbeef40bf5a09b9ddb05bf447 - languageName: node - linkType: hard - -"resolve@patch:resolve@npm%3A^1.22.4#optional!builtin": +"resolve@patch:resolve@npm%3A^1.1.6#optional!builtin, resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.12.0#optional!builtin, resolve@patch:resolve@npm%3A^1.14.2#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin, resolve@patch:resolve@npm%3A^1.9.0#optional!builtin": version: 1.22.8 resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d" dependencies: @@ -13914,16 +13293,7 @@ __metadata: languageName: node linkType: hard -"rxjs@npm:^7.2.0": - version: 7.8.0 - resolution: "rxjs@npm:7.8.0" - dependencies: - tslib: "npm:^2.1.0" - checksum: ff9359cc7875edecc8fc487481366b876b488901178cca8f2bdad03e00d2b5a19b01d2b02d3b4ebd47e574264db8460c6c2386076c3189b359b5e8c70a6e51e3 - languageName: node - linkType: hard - -"rxjs@npm:^7.8.0": +"rxjs@npm:^7.2.0, rxjs@npm:^7.8.0": version: 7.8.1 resolution: "rxjs@npm:7.8.1" dependencies: @@ -14409,7 +13779,7 @@ __metadata: languageName: node linkType: hard -"smart-buffer@npm:^4.1.0, smart-buffer@npm:^4.2.0": +"smart-buffer@npm:^4.2.0": version: 4.2.0 resolution: "smart-buffer@npm:4.2.0" checksum: 927484aa0b1640fd9473cee3e0a0bcad6fce93fd7bbc18bac9ad0c33686f5d2e2c422fba24b5899c184524af01e11dd2bd051c2bf2b07e47aff8ca72cbfc60d2 @@ -14490,23 +13860,13 @@ __metadata: languageName: node linkType: hard -"socks@npm:^2.6.1": - version: 2.6.1 - resolution: "socks@npm:2.6.1" - dependencies: - ip: "npm:^1.1.5" - smart-buffer: "npm:^4.1.0" - checksum: 6ae166bd1ac4556618cd7d4034561174eda062cfbc1a8d1a214968c1cfb7861ab51f2e651175b5a168148505a3b7250bcec67eb0110878e2258a932aa0497204 - languageName: node - linkType: hard - -"socks@npm:^2.6.2, socks@npm:^2.7.1": - version: 2.7.1 - resolution: "socks@npm:2.7.1" +"socks@npm:^2.7.3": + version: 2.8.0 + resolution: "socks@npm:2.8.0" dependencies: - ip: "npm:^2.0.0" + ip-address: "npm:^9.0.5" smart-buffer: "npm:^4.2.0" - checksum: 5074f7d6a13b3155fa655191df1c7e7a48ce3234b8ccf99afa2ccb56591c195e75e8bb78486f8e9ea8168e95a29573cbaad55b2b5e195160ae4d2ea6811ba833 + checksum: ed0224ce2c7daaa7690cb87cf53d9703ffc4e983aca221f6f5b46767b232658df49494fd86acd0bf97ada6de05248ea8ea625c2343d48155d8463fc40d4a340f languageName: node linkType: hard @@ -14538,13 +13898,6 @@ __metadata: languageName: node linkType: hard -"source-map@npm:^0.5.0": - version: 0.5.7 - resolution: "source-map@npm:0.5.7" - checksum: 9b4ac749ec5b5831cad1f8cc4c19c4298ebc7474b24a0acf293e2f040f03f8eeccb3d01f12aa0f90cf46d555c887e03912b83a042c627f419bda5152d89c5269 - languageName: node - linkType: hard - "source-map@npm:^0.6.0, source-map@npm:^0.6.1, source-map@npm:~0.6.1": version: 0.6.1 resolution: "source-map@npm:0.6.1" @@ -14648,6 +14001,13 @@ __metadata: languageName: node linkType: hard +"sprintf-js@npm:^1.1.3": + version: 1.1.3 + resolution: "sprintf-js@npm:1.1.3" + checksum: e7587128c423f7e43cc625fe2f87e6affdf5ca51c1cc468e910d8aaca46bb44a7fbcfa552f787b1d3987f7043aeb4527d1b99559e6621e01b42b3f45e5a24cbb + languageName: node + linkType: hard + "sprintf-js@npm:~1.0.2": version: 1.0.3 resolution: "sprintf-js@npm:1.0.3" @@ -14759,17 +14119,6 @@ __metadata: languageName: node linkType: hard -"string.prototype.trim@npm:^1.2.7": - version: 1.2.7 - resolution: "string.prototype.trim@npm:1.2.7" - dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.1.4" - es-abstract: "npm:^1.20.4" - checksum: a1b795bdb4b4b7d9399e99771e8a36493a30cf18095b0e8b36bcb211aad42dc59186c9a833c774f7a70429dbd3862818133d7e0da1547a0e9f0e1ebddf995635 - languageName: node - linkType: hard - "string.prototype.trim@npm:^1.2.8": version: 1.2.8 resolution: "string.prototype.trim@npm:1.2.8" @@ -14781,17 +14130,6 @@ __metadata: languageName: node linkType: hard -"string.prototype.trimend@npm:^1.0.6": - version: 1.0.6 - resolution: "string.prototype.trimend@npm:1.0.6" - dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.1.4" - es-abstract: "npm:^1.20.4" - checksum: 3893db9267e0b8a16658c3947738536e90c400a9b7282de96925d4e210174cfe66c59d6b7eb5b4a9aaa78ef7f5e46afb117e842d93112fbd105c8d19206d8092 - languageName: node - linkType: hard - "string.prototype.trimend@npm:^1.0.7": version: 1.0.7 resolution: "string.prototype.trimend@npm:1.0.7" @@ -14803,17 +14141,6 @@ __metadata: languageName: node linkType: hard -"string.prototype.trimstart@npm:^1.0.6": - version: 1.0.6 - resolution: "string.prototype.trimstart@npm:1.0.6" - dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.1.4" - es-abstract: "npm:^1.20.4" - checksum: 05e2cd06fa5311b17f5b2c7af0a60239fa210f4bb07bbcfce4995215dce330e2b1dd2d8030d371f46252ab637522e14b6e9a78384e8515945b72654c14261d54 - languageName: node - linkType: hard - "string.prototype.trimstart@npm:^1.0.7": version: 1.0.7 resolution: "string.prototype.trimstart@npm:1.0.7" @@ -14969,7 +14296,7 @@ __metadata: languageName: node linkType: hard -"supports-hyperlinks@npm:^2.0.0": +"supports-hyperlinks@npm:^2.0.0, supports-hyperlinks@npm:^2.2.0": version: 2.3.0 resolution: "supports-hyperlinks@npm:2.3.0" dependencies: @@ -14979,16 +14306,6 @@ __metadata: languageName: node linkType: hard -"supports-hyperlinks@npm:^2.2.0": - version: 2.2.0 - resolution: "supports-hyperlinks@npm:2.2.0" - dependencies: - has-flag: "npm:^4.0.0" - supports-color: "npm:^7.0.0" - checksum: a63f2acba5ba8088b155fb28fb6fed7de10c7dfe0593fe49c94b1f720031271df9dd917ddecb0cc68f69be678488c0f40697f2f1ae9ee969250af887115b15d0 - languageName: node - linkType: hard - "supports-preserve-symlinks-flag@npm:^1.0.0": version: 1.0.0 resolution: "supports-preserve-symlinks-flag@npm:1.0.0" @@ -15088,7 +14405,7 @@ __metadata: languageName: node linkType: hard -"tar@npm:^6.0.5, tar@npm:^6.1.11": +"tar@npm:^6.0.5, tar@npm:^6.1.0, tar@npm:^6.1.11, tar@npm:^6.1.2": version: 6.1.13 resolution: "tar@npm:6.1.13" dependencies: @@ -15102,20 +14419,6 @@ __metadata: languageName: node linkType: hard -"tar@npm:^6.1.0, tar@npm:^6.1.2": - version: 6.1.11 - resolution: "tar@npm:6.1.11" - dependencies: - chownr: "npm:^2.0.0" - fs-minipass: "npm:^2.0.0" - minipass: "npm:^3.0.0" - minizlib: "npm:^2.1.1" - mkdirp: "npm:^1.0.3" - yallist: "npm:^4.0.0" - checksum: 0e6789e66475922b8e0d1ee648cb26e0ede9a0635284269ca71b2d8acd507bc59ad5557032f0192f8ff22680b50cb66792b56f0240f484fe0d7d8cef81c1b959 - languageName: node - linkType: hard - "temp-dir@npm:^2.0.0": version: 2.0.0 resolution: "temp-dir@npm:2.0.0" @@ -15421,43 +14724,7 @@ __metadata: languageName: node linkType: hard -"ts-node@npm:^10.4.0": - version: 10.4.0 - resolution: "ts-node@npm:10.4.0" - dependencies: - "@cspotcode/source-map-support": "npm:0.7.0" - "@tsconfig/node10": "npm:^1.0.7" - "@tsconfig/node12": "npm:^1.0.7" - "@tsconfig/node14": "npm:^1.0.0" - "@tsconfig/node16": "npm:^1.0.2" - acorn: "npm:^8.4.1" - acorn-walk: "npm:^8.1.1" - arg: "npm:^4.1.0" - create-require: "npm:^1.1.0" - diff: "npm:^4.0.1" - make-error: "npm:^1.1.1" - yn: "npm:3.1.1" - peerDependencies: - "@swc/core": ">=1.2.50" - "@swc/wasm": ">=1.2.50" - "@types/node": "*" - typescript: ">=2.7" - peerDependenciesMeta: - "@swc/core": - optional: true - "@swc/wasm": - optional: true - bin: - ts-node: dist/bin.js - ts-node-cwd: dist/bin-cwd.js - ts-node-script: dist/bin-script.js - ts-node-transpile-only: dist/bin-transpile.js - ts-script: dist/bin-script-deprecated.js - checksum: 5874ac27f66b684b24aa199105d347a8fa3e037b8737ff5918a2f94175ad0df5e426bb2f0f37727cdfdb4b15886d336c31fa1c28c71a4912fee0cddead02fc42 - languageName: node - linkType: hard - -"ts-node@npm:^10.9.1": +"ts-node@npm:^10.4.0, ts-node@npm:^10.9.1": version: 10.9.1 resolution: "ts-node@npm:10.9.1" dependencies: @@ -15551,21 +14818,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.0.3, tslib@npm:^2.1.0": - version: 2.4.1 - resolution: "tslib@npm:2.4.1" - checksum: e14311d5392ec0e3519feb9afdb54483d7f3aa2d3def6f1a1a30bd3deca5dfeadd106e80bee9ba880bce86a2e50854c9fe5958572cd188d7ac6f8625101a6a8f - languageName: node - linkType: hard - -"tslib@npm:^2.4.0": - version: 2.5.0 - resolution: "tslib@npm:2.5.0" - checksum: ea556fbdf396fe15dbd45e242754e86e7c36e0dce8644404a7c8a81ae1e940744dc639569aeca1ae370a7f804d82872f3fd8564eb23be9adb7618201d0314dac - languageName: node - linkType: hard - -"tslib@npm:^2.5.0": +"tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.4.0, tslib@npm:^2.5.0": version: 2.6.2 resolution: "tslib@npm:2.6.2" checksum: bd26c22d36736513980091a1e356378e8b662ded04204453d353a7f34a4c21ed0afc59b5f90719d4ba756e581a162ecbf93118dc9c6be5acf70aa309188166ca @@ -16316,7 +15569,7 @@ __metadata: languageName: node linkType: hard -"which-typed-array@npm:^1.1.11, which-typed-array@npm:^1.1.13": +"which-typed-array@npm:^1.1.11, which-typed-array@npm:^1.1.13, which-typed-array@npm:^1.1.2": version: 1.1.13 resolution: "which-typed-array@npm:1.1.13" dependencies: @@ -16329,20 +15582,6 @@ __metadata: languageName: node linkType: hard -"which-typed-array@npm:^1.1.2, which-typed-array@npm:^1.1.9": - version: 1.1.9 - resolution: "which-typed-array@npm:1.1.9" - dependencies: - available-typed-arrays: "npm:^1.0.5" - call-bind: "npm:^1.0.2" - for-each: "npm:^0.3.3" - gopd: "npm:^1.0.1" - has-tostringtag: "npm:^1.0.0" - is-typed-array: "npm:^1.1.10" - checksum: 90ef760a09dcffc479138a6bc77fd2933a81a41d531f4886ae212f6edb54a0645a43a6c24de2c096aea910430035ac56b3d22a06f3d64e5163fa178d0f24e08e - languageName: node - linkType: hard - "which@npm:2.0.2, which@npm:^2.0.1, which@npm:^2.0.2": version: 2.0.2 resolution: "which@npm:2.0.2" From b408de7e21dad8f3593394d3c0f43d6efdc2f045 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Fri, 16 Feb 2024 12:16:57 +0300 Subject: [PATCH 036/191] feat(dashmate): tenderdash mempool cache size config option (#1702) --- .../dashmate/configs/defaults/getBaseConfigFactory.js | 1 + .../dashmate/configs/getConfigFileMigrationsFactory.js | 8 ++++++++ packages/dashmate/src/config/configJsonSchema.js | 6 +++++- .../templates/platform/drive/tenderdash/config.toml.dot | 2 +- 4 files changed, 15 insertions(+), 2 deletions(-) diff --git a/packages/dashmate/configs/defaults/getBaseConfigFactory.js b/packages/dashmate/configs/defaults/getBaseConfigFactory.js index 62b20e446d..5334ca58c9 100644 --- a/packages/dashmate/configs/defaults/getBaseConfigFactory.js +++ b/packages/dashmate/configs/defaults/getBaseConfigFactory.js @@ -204,6 +204,7 @@ export default function getBaseConfigFactory(homeDir) { port: 26660, }, mempool: { + cacheSize: 15000, size: 5000, maxTxsBytes: 1073741824, }, diff --git a/packages/dashmate/configs/getConfigFileMigrationsFactory.js b/packages/dashmate/configs/getConfigFileMigrationsFactory.js index 0e28e6b9cb..937700acfe 100644 --- a/packages/dashmate/configs/getConfigFileMigrationsFactory.js +++ b/packages/dashmate/configs/getConfigFileMigrationsFactory.js @@ -453,6 +453,14 @@ export default function getConfigFileMigrationsFactory(homeDir, defaultConfigs) return configFile; }, + '1.0.0-dev.5': (configFile) => { + Object.entries(configFile.configs) + .forEach(([, options]) => { + options.platform.drive.tenderdash.mempool.cacheSize = base.get('platform.drive.tenderdash.mempool.cacheSize'); + }); + + return configFile; + }, }; } diff --git a/packages/dashmate/src/config/configJsonSchema.js b/packages/dashmate/src/config/configJsonSchema.js index 3892fc6fe0..ad738b51f2 100644 --- a/packages/dashmate/src/config/configJsonSchema.js +++ b/packages/dashmate/src/config/configJsonSchema.js @@ -608,6 +608,10 @@ export default { mempool: { type: 'object', properties: { + cacheSize: { + type: 'integer', + minimum: 0, + }, size: { type: 'integer', minimum: 0, @@ -618,7 +622,7 @@ export default { }, }, additionalProperties: false, - required: ['size', 'maxTxsBytes'], + required: ['size', 'maxTxsBytes', 'cacheSize'], }, consensus: { type: 'object', diff --git a/packages/dashmate/templates/platform/drive/tenderdash/config.toml.dot b/packages/dashmate/templates/platform/drive/tenderdash/config.toml.dot index 67ff3d5d76..6d77704583 100644 --- a/packages/dashmate/templates/platform/drive/tenderdash/config.toml.dot +++ b/packages/dashmate/templates/platform/drive/tenderdash/config.toml.dot @@ -315,7 +315,7 @@ size = {{= it.platform.drive.tenderdash.mempool.size }} max-txs-bytes = {{= it.platform.drive.tenderdash.mempool.maxTxsBytes }} # Size of the cache (used to filter transactions we saw earlier) in transactions -cache-size = 10000 +cache-size = {{= it.platform.drive.tenderdash.mempool.cacheSize }} # Do not remove invalid transactions from the cache (default: false) # Set to true if it's not possible for any invalid transaction to become valid From 86778beb23b758d1c1c86106be91c0e6602b0b66 Mon Sep 17 00:00:00 2001 From: Igor Markin Date: Fri, 16 Feb 2024 16:04:17 +0000 Subject: [PATCH 037/191] feat(dpp)!: do not allow creating data contracts without documents (#1675) --- .../mod.rs | 32 +++++++++++++++++ .../v0/mod.rs | 7 ++++ .../src/data_contract/v0/methods/schema.rs | 14 +++++++- .../src/errors/consensus/basic/basic_error.rs | 13 ++++--- .../data_contract_empty_schema_error.rs | 34 ++++++++++++++++++ .../consensus/basic/data_contract/mod.rs | 2 ++ packages/rs-dpp/src/errors/consensus/codes.rs | 1 + .../data_contract_create/structure/v0/mod.rs | 5 ++- packages/rs-sdk/tests/fetch/mock_fetch.rs | 3 +- .../data_contract_empty_schema_error.rs | 35 +++++++++++++++++++ .../consensus/basic/data_contract/mod.rs | 2 ++ .../src/errors/consensus/consensus_error.rs | 6 +++- 12 files changed, 145 insertions(+), 9 deletions(-) create mode 100644 packages/rs-dpp/src/errors/consensus/basic/data_contract/data_contract_empty_schema_error.rs create mode 100644 packages/wasm-dpp/src/errors/consensus/basic/data_contract/data_contract_empty_schema_error.rs diff --git a/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/mod.rs b/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/mod.rs index ed7c970e3b..c0fdd444b7 100644 --- a/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/mod.rs @@ -65,3 +65,35 @@ impl DocumentType { } } } + +#[cfg(test)] +mod test { + use crate::consensus::basic::BasicError; + use crate::consensus::ConsensusError; + use platform_value::Identifier; + use std::ops::Deref; + + #[test] + pub fn should_not_allow_creating_document_types_with_empty_schema() { + let result = crate::data_contract::document_type::DocumentType::create_document_types_from_document_schemas( + Identifier::random(), + Default::default(), + None, + false, + false, + false, + &crate::version::PlatformVersion::latest(), + ); + + match result { + Err(crate::ProtocolError::ConsensusError(e)) => match e.deref() { + ConsensusError::BasicError(err) => match err { + BasicError::DataContractEmptySchemaError(e) => {} + _ => panic!("Expected DataContractEmptySchemaError"), + }, + _ => panic!("Expected basic consensus error"), + }, + _ => panic!("Expected consensus error"), + } + } +} diff --git a/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/v0/mod.rs index 6ca8fefa14..34ac327d9d 100644 --- a/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/v0/mod.rs @@ -1,3 +1,4 @@ +use crate::consensus::basic::data_contract::DataContractEmptySchemaError; use crate::data_contract::document_type::v0::DocumentTypeV0; use crate::data_contract::document_type::DocumentType; use crate::data_contract::DocumentName; @@ -18,6 +19,12 @@ impl DocumentTypeV0 { ) -> Result, ProtocolError> { let mut contract_document_types: BTreeMap = BTreeMap::new(); + if document_schemas.is_empty() { + return Err(ProtocolError::ConsensusError(Box::new( + DataContractEmptySchemaError::new(data_contract_id.clone()).into(), + ))); + } + for (name, schema) in document_schemas.into_iter() { let document_type = match platform_version .dpp diff --git a/packages/rs-dpp/src/data_contract/v0/methods/schema.rs b/packages/rs-dpp/src/data_contract/v0/methods/schema.rs index 724300da73..a488dc3a28 100644 --- a/packages/rs-dpp/src/data_contract/v0/methods/schema.rs +++ b/packages/rs-dpp/src/data_contract/v0/methods/schema.rs @@ -100,13 +100,25 @@ mod test { let config = DataContractConfig::default_for_version(platform_version) .expect("should create a default config"); + let schema = platform_value!({ + "type": "object", + "properties": { + "a": { + "type": "string", + "maxLength": 10, + "position": 0 + } + }, + "additionalProperties": false, + }); + let serialization_format = DataContractInSerializationFormatV0 { id: Identifier::random(), config, version: 0, owner_id: Default::default(), schema_defs: None, - document_schemas: Default::default(), + document_schemas: BTreeMap::from([("document_type_name".to_string(), schema.clone())]), }; let mut data_contract = DataContractV0::try_from_platform_versioned( diff --git a/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs b/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs index f6c463b555..f5132a4f9e 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs @@ -5,11 +5,11 @@ use thiserror::Error; use crate::consensus::basic::data_contract::data_contract_max_depth_exceed_error::DataContractMaxDepthExceedError; use crate::consensus::basic::data_contract::{ - DataContractHaveNewUniqueIndexError, DataContractImmutablePropertiesUpdateError, - DataContractInvalidIndexDefinitionUpdateError, DataContractUniqueIndicesChangedError, - DuplicateIndexError, DuplicateIndexNameError, IncompatibleDataContractSchemaError, - IncompatibleRe2PatternError, InvalidCompoundIndexError, InvalidDataContractIdError, - InvalidDataContractVersionError, InvalidIndexPropertyTypeError, + DataContractEmptySchemaError, DataContractHaveNewUniqueIndexError, + DataContractImmutablePropertiesUpdateError, DataContractInvalidIndexDefinitionUpdateError, + DataContractUniqueIndicesChangedError, DuplicateIndexError, DuplicateIndexNameError, + IncompatibleDataContractSchemaError, IncompatibleRe2PatternError, InvalidCompoundIndexError, + InvalidDataContractIdError, InvalidDataContractVersionError, InvalidIndexPropertyTypeError, InvalidIndexedPropertyConstraintError, InvalidJsonSchemaRefError, SystemPropertyIndexAlreadyPresentError, UndefinedIndexPropertyError, UniqueIndicesLimitReachedError, @@ -139,6 +139,9 @@ pub enum BasicError { #[error(transparent)] IncompatibleDataContractSchemaError(IncompatibleDataContractSchemaError), + #[error(transparent)] + DataContractEmptySchemaError(DataContractEmptySchemaError), + #[error(transparent)] DataContractImmutablePropertiesUpdateError(DataContractImmutablePropertiesUpdateError), diff --git a/packages/rs-dpp/src/errors/consensus/basic/data_contract/data_contract_empty_schema_error.rs b/packages/rs-dpp/src/errors/consensus/basic/data_contract/data_contract_empty_schema_error.rs new file mode 100644 index 0000000000..7215f610d1 --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/basic/data_contract/data_contract_empty_schema_error.rs @@ -0,0 +1,34 @@ +use crate::consensus::basic::BasicError; +use crate::errors::ProtocolError; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use thiserror::Error; + +use crate::consensus::ConsensusError; +use crate::prelude::Identifier; + +use bincode::{Decode, Encode}; + +#[derive( + Error, Debug, Clone, PartialEq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error("Data Contract {data_contract_id} schema is empty.")] +#[platform_serialize(unversioned)] +pub struct DataContractEmptySchemaError { + data_contract_id: Identifier, +} + +impl DataContractEmptySchemaError { + pub fn new(data_contract_id: Identifier) -> Self { + Self { data_contract_id } + } + + pub fn data_contract_id(&self) -> Identifier { + self.data_contract_id + } +} + +impl From for ConsensusError { + fn from(err: DataContractEmptySchemaError) -> Self { + Self::BasicError(BasicError::DataContractEmptySchemaError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/basic/data_contract/mod.rs b/packages/rs-dpp/src/errors/consensus/basic/data_contract/mod.rs index 9d90ec16fb..2423bb0f86 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/data_contract/mod.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/data_contract/mod.rs @@ -1,3 +1,4 @@ +mod data_contract_empty_schema_error; mod data_contract_have_new_unique_index_error; mod data_contract_immutable_properties_update_error; mod data_contract_invalid_index_definition_update_error; @@ -17,6 +18,7 @@ mod system_property_index_already_present_error; mod undefined_index_property_error; mod unique_indices_limit_reached_error; +pub use data_contract_empty_schema_error::*; pub use data_contract_have_new_unique_index_error::*; pub use data_contract_immutable_properties_update_error::*; pub use data_contract_invalid_index_definition_update_error::*; diff --git a/packages/rs-dpp/src/errors/consensus/codes.rs b/packages/rs-dpp/src/errors/consensus/codes.rs index 808d04d9b3..e8e9a65c8c 100644 --- a/packages/rs-dpp/src/errors/consensus/codes.rs +++ b/packages/rs-dpp/src/errors/consensus/codes.rs @@ -59,6 +59,7 @@ impl ErrorWithCode for BasicError { Self::DuplicateIndexNameError { .. } => 1048, Self::InvalidDataContractVersionError { .. } => 1050, Self::IncompatibleDataContractSchemaError { .. } => 1051, + Self::DataContractEmptySchemaError { .. } => 1069, Self::DataContractImmutablePropertiesUpdateError { .. } => 1052, Self::DataContractUniqueIndicesChangedError { .. } => 1053, Self::DataContractInvalidIndexDefinitionUpdateError { .. } => 1054, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/structure/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/structure/v0/mod.rs index 6ef443a4ad..7975efbe6b 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/structure/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/structure/v0/mod.rs @@ -1,5 +1,8 @@ use crate::error::Error; -use dpp::consensus::basic::data_contract::InvalidDataContractIdError; +use dpp::consensus::basic::data_contract::{ + DataContractEmptySchemaError, InvalidDataContractIdError, +}; +use dpp::consensus::basic::document::DataContractNotPresentError; use dpp::consensus::basic::BasicError; use dpp::prelude::DataContract; use dpp::state_transition::data_contract_create_transition::accessors::DataContractCreateTransitionAccessorsV0; diff --git a/packages/rs-sdk/tests/fetch/mock_fetch.rs b/packages/rs-sdk/tests/fetch/mock_fetch.rs index 9f4b9ca68c..29e9bb75dc 100644 --- a/packages/rs-sdk/tests/fetch/mock_fetch.rs +++ b/packages/rs-sdk/tests/fetch/mock_fetch.rs @@ -57,7 +57,8 @@ async fn test_mock_fetch_identity_not_found() { async fn test_mock_fetch_data_contract() { let sdk = Sdk::new_mock(); - let expected = mock_data_contract(None); + let document_type: DocumentType = mock_document_type(); + let expected = mock_data_contract(Some(&document_type)); let id = expected.id(); sdk.mock().expect_fetch(id, Some(expected.clone())).await; diff --git a/packages/wasm-dpp/src/errors/consensus/basic/data_contract/data_contract_empty_schema_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/data_contract_empty_schema_error.rs new file mode 100644 index 0000000000..f5be257215 --- /dev/null +++ b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/data_contract_empty_schema_error.rs @@ -0,0 +1,35 @@ +use crate::buffer::Buffer; +use dpp::consensus::basic::data_contract::DataContractEmptySchemaError; +use dpp::consensus::codes::ErrorWithCode; +use dpp::consensus::ConsensusError; + +use wasm_bindgen::prelude::*; + +#[wasm_bindgen(js_name=DataContractEmptySchemaError)] +pub struct DataContractEmptySchemaErrorWasm { + inner: DataContractEmptySchemaError, +} + +impl From<&DataContractEmptySchemaError> for DataContractEmptySchemaErrorWasm { + fn from(e: &DataContractEmptySchemaError) -> Self { + Self { inner: e.clone() } + } +} + +#[wasm_bindgen(js_class=DataContractEmptySchemaError)] +impl DataContractEmptySchemaErrorWasm { + #[wasm_bindgen(js_name=getDataContractId)] + pub fn get_data_contract_id(&self) -> Buffer { + Buffer::from_bytes(self.inner.data_contract_id().as_bytes()) + } + + #[wasm_bindgen(js_name=getCode)] + pub fn get_code(&self) -> u32 { + ConsensusError::from(self.inner.clone()).code() + } + + #[wasm_bindgen(getter)] + pub fn message(&self) -> String { + self.inner.to_string() + } +} diff --git a/packages/wasm-dpp/src/errors/consensus/basic/data_contract/mod.rs b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/mod.rs index 6e462400e2..e60cd487f8 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/data_contract/mod.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/mod.rs @@ -1,3 +1,4 @@ +mod data_contract_empty_schema_error; mod data_contract_have_new_unique_index_error; mod data_contract_immutable_properties_update_error; mod data_contract_invalid_index_definition_update_error; @@ -11,6 +12,7 @@ mod invalid_data_contract_id_error; mod invalid_data_contract_version_error; mod invalid_json_schema_ref_error; +pub use data_contract_empty_schema_error::*; pub use data_contract_have_new_unique_index_error::*; pub use data_contract_immutable_properties_update_error::*; pub use data_contract_invalid_index_definition_update_error::*; diff --git a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs index 1d958e7b95..6f17e1ec88 100644 --- a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs @@ -59,7 +59,8 @@ use dpp::consensus::state::data_trigger::DataTriggerError::{ use wasm_bindgen::{JsError, JsValue}; use crate::errors::consensus::basic::data_contract::{ - DataContractHaveNewUniqueIndexErrorWasm, DataContractImmutablePropertiesUpdateErrorWasm, + DataContractEmptySchemaErrorWasm, DataContractHaveNewUniqueIndexErrorWasm, + DataContractImmutablePropertiesUpdateErrorWasm, DataContractInvalidIndexDefinitionUpdateErrorWasm, DataContractUniqueIndicesChangedErrorWasm, IncompatibleDataContractSchemaErrorWasm, InvalidDataContractIdErrorWasm, }; @@ -306,6 +307,9 @@ fn from_basic_error(basic_error: &BasicError) -> JsValue { BasicError::IncompatibleDataContractSchemaError(err) => { IncompatibleDataContractSchemaErrorWasm::from(err).into() } + BasicError::DataContractEmptySchemaError(err) => { + DataContractEmptySchemaErrorWasm::from(err).into() + } BasicError::InvalidIdentityKeySignatureError(err) => { InvalidIdentityKeySignatureErrorWasm::from(err).into() } From 724b272fe5d0ed950c80db094e6d1e9921e26197 Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Tue, 20 Feb 2024 21:38:33 +0700 Subject: [PATCH 038/191] feat(platform)!: identity nonce and contract nonces to prevent replay attacks (#1681) Co-authored-by: markin.io Co-authored-by: Lukasz Klimek <842586+lklimek@users.noreply.github.com> Co-authored-by: Ivan Shumkov --- packages/dapi-grpc/build.rs | 8 +- .../dash/platform/dapi/v0/PlatformGrpc.java | 176 +- .../v0/nodejs/PlatformPromiseClient.js | 78 + .../platform/v0/nodejs/platform_pbjs.js | 4057 ++++++++++++----- .../platform/v0/nodejs/platform_protoc.js | 3354 +++++++++++--- .../platform/v0/objective-c/Platform.pbobjc.h | 199 + .../platform/v0/objective-c/Platform.pbobjc.m | 519 +++ .../platform/v0/objective-c/Platform.pbrpc.h | 26 + .../platform/v0/objective-c/Platform.pbrpc.m | 40 + .../platform/v0/python/platform_pb2.py | 877 +++- .../platform/v0/python/platform_pb2_grpc.py | 66 + .../platform/v0/web/PlatformPromiseClient.js | 28 + .../clients/platform/v0/web/platform_pb.d.ts | 252 + .../clients/platform/v0/web/platform_pb.js | 3354 +++++++++++--- .../platform/v0/web/platform_pb_service.d.ts | 38 + .../platform/v0/web/platform_pb_service.js | 80 + .../protos/platform/v0/platform.proto | 50 + .../proto/org.dash.platform.dapi.v0.rs | 233 + .../v0/nodejs/PlatformPromiseClient.spec.js | 22 + .../lib/externalApis/drive/DriveClient.js | 26 + .../getIdentityContractNonceHandlerFactory.js | 33 + .../getIdentityNonceHandlerFactory.js | 33 + .../platform/platformHandlersFactory.js | 46 + .../externalApis/drive/DriveClient.spec.js | 78 + ...dentityContractNonceHandlerFactory.spec.js | 110 + .../getIdentityNonceHandlerFactory.spec.js | 110 + .../methods/platform/PlatformMethodsFacade.js | 4 + .../GetIdentityContractNonceResponse.js | 49 + .../getIdentityContractNonceFactory.js | 81 + .../GetIdentityNonceResponse.js | 49 + .../getIdentityNonceFactory.js | 74 + .../platform/PlatformMethodsFacade.spec.js | 40 + .../GetIdentityContractNonce.spec.js | 129 + .../getIdentityContractNonceFactory.spec.js | 158 + .../getIdentityNonce/GetIdentityNonce.spec.js | 129 + .../getIdentityNonceFactory.spec.js | 153 + .../Platform/NonceManager/NonceManager.ts | 78 + .../src/SDK/Client/Platform/Platform.ts | 4 + .../Platform/methods/contracts/update.ts | 10 +- .../Platform/methods/documents/broadcast.ts | 21 +- .../methods/identities/creditTransfer.ts | 5 + .../methods/identities/creditWithdrawal.ts | 7 +- .../Platform/methods/identities/update.ts | 5 + .../createAndAttachTransportMocksToClient.ts | 1 + .../src/test/mocks/createDapiClientMock.ts | 2 + .../test/e2e/withdrawals.spec.js | 10 + .../test/functional/platform/Document.spec.js | 210 +- .../test/functional/platform/Identity.spec.js | 2 +- packages/rs-dapi-client/src/transport/grpc.rs | 16 + packages/rs-dpp/src/balances/credits.rs | 4 + .../src/data_contract/data_contract_facade.rs | 5 +- .../rs-dpp/src/data_contract/factory/mod.rs | 9 +- .../src/data_contract/factory/v0/mod.rs | 4 +- .../src/document/document_factory/mod.rs | 4 +- .../src/document/document_factory/v0/mod.rs | 54 +- .../specialized_document_factory/mod.rs | 6 +- .../specialized_document_factory/v0/mod.rs | 53 +- .../src/errors/consensus/basic/basic_error.rs | 14 +- .../invalid_data_contract_version_error.rs | 2 +- ...tity_contract_nonce_out_of_bounds_error.rs | 42 + .../errors/consensus/basic/document/mod.rs | 2 + packages/rs-dpp/src/errors/consensus/codes.rs | 16 +- .../invalid_identity_contract_nonce_error.rs | 76 + .../errors/consensus/state/identity/mod.rs | 1 + .../src/errors/consensus/state/state_error.rs | 4 + packages/rs-dpp/src/errors/protocol_error.rs | 3 + packages/rs-dpp/src/identity/identity.rs | 3 +- .../rs-dpp/src/identity/identity_facade.rs | 17 +- .../rs-dpp/src/identity/identity_factory.rs | 11 +- .../rs-dpp/src/identity/identity_nonce.rs | 269 ++ packages/rs-dpp/src/identity/mod.rs | 1 + packages/rs-dpp/src/lib.rs | 1 + packages/rs-dpp/src/state_transition/mod.rs | 8 +- .../src/state_transition/serialization.rs | 13 +- .../state_transitions/common_fields.rs | 3 + .../contract/common_fields.rs | 2 + .../data_contract_create_transition/mod.rs | 2 +- .../state_transition_like.rs | 6 + .../v0/state_transition_like.rs | 8 + .../accessors/mod.rs | 7 + .../accessors/v0/mod.rs | 3 + .../data_contract_update_transition/fields.rs | 4 +- .../methods/mod.rs | 3 + .../methods/v0/mod.rs | 2 + .../data_contract_update_transition/mod.rs | 8 +- .../state_transition_like.rs | 6 + .../data_contract_update_transition/v0/mod.rs | 13 +- .../v0/state_transition_like.rs | 9 + .../v0/v0_methods.rs | 3 + .../v0/value_conversion.rs | 17 + .../document_transition/action_type.rs | 1 + .../document_base_transition/fields.rs | 1 + .../document_base_transition/from_document.rs | 9 +- .../v0/from_document.rs | 3 + .../document_base_transition/v0/mod.rs | 8 + .../document_base_transition/v0/v0_methods.rs | 11 + .../document_base_transition/v0_methods.rs | 13 + .../document_create_transition/convertible.rs | 2 +- .../from_document.rs | 3 + .../v0/from_document.rs | 3 + .../document_create_transition/v0/mod.rs | 12 +- .../from_document.rs | 3 + .../v0/from_document.rs | 3 + .../from_document.rs | 3 + .../v0/from_document.rs | 3 + .../document_replace_transition/v0/mod.rs | 2 +- .../v0/v0_methods.rs | 3 +- .../document_replace_transition/v0_methods.rs | 2 +- .../document_transition/mod.rs | 24 +- .../documents_batch_transition/methods/mod.rs | 13 + .../methods/v0/mod.rs | 5 + .../state_transition_like.rs | 6 + .../v0/state_transition_like.rs | 15 + .../v0/v0_methods.rs | 14 +- .../find_duplicates_by_id/v0/mod.rs | 3 + .../validate_base_structure/v0/mod.rs | 15 +- .../state_transition_like.rs | 6 + .../v0/state_transition_like.rs | 5 + .../accessors/mod.rs | 10 +- .../accessors/v0/mod.rs | 6 +- .../state_transition_like.rs | 6 + .../v0/mod.rs | 6 +- .../v0/state_transition_like.rs | 9 + .../accessors/mod.rs | 10 +- .../accessors/v0/mod.rs | 6 +- .../methods/mod.rs | 3 + .../methods/v0/mod.rs | 2 + .../state_transition_like.rs | 6 + .../v0/mod.rs | 3 +- .../v0/state_transition_like.rs | 9 + .../v0/v0_methods.rs | 4 +- .../state_transition_like.rs | 6 + .../v0/state_transition_like.rs | 17 + .../accessors/mod.rs | 14 +- .../accessors/v0/mod.rs | 3 + .../identity_update_transition/methods/mod.rs | 3 + .../methods/v0/mod.rs | 2 + .../state_transition_like.rs | 6 + .../v0/json_conversion.rs | 1 + .../identity_update_transition/v0/mod.rs | 6 +- .../v0/state_transition_like.rs | 9 + .../v0/v0_methods.rs | 11 + .../v0/value_conversion.rs | 5 + .../v0/mod.rs | 2 +- .../traits/state_transition_like.rs | 4 + .../get_document_transitions_fixture.rs | 6 +- .../src/abci/handler/execution_result.rs | 13 +- .../rs-drive-abci/src/abci/handler/mod.rs | 27 +- .../src/execution/check_tx/mod.rs | 26 +- .../src/execution/check_tx/v0/mod.rs | 33 +- .../create_genesis_state/v0/mod.rs | 4 +- .../execute_event/v0/mod.rs | 5 +- .../process_raw_state_transitions/v0/mod.rs | 64 +- .../validate_fees_of_event/v0/mod.rs | 11 +- .../execution/types/execution_event/mod.rs | 43 +- .../types/execution_operation/mod.rs | 12 +- .../state_transition_execution_context/mod.rs | 18 +- .../v0/mod.rs | 4 +- .../check_tx_verification/v0/mod.rs | 86 +- .../v0/mod.rs | 8 +- .../state_transition/processor/v0/mod.rs | 216 +- .../data_contract_create/mod.rs | 16 +- .../identity_contract_nonce/mod.rs | 50 + .../identity_contract_nonce/v0/mod.rs | 64 + .../data_contract_update/mod.rs | 60 +- .../data_contract_update/state/mod.rs | 41 + .../data_contract_update/state/v0/mod.rs | 94 +- .../data_contract_update/structure/mod.rs | 30 + .../data_contract_update/structure/v0/mod.rs | 1 + .../mod.rs | 0 .../v0/mod.rs | 19 +- .../documents_batch/data_triggers/executor.rs | 16 +- .../data_triggers/triggers/dashpay/v0/mod.rs | 63 +- .../data_triggers/triggers/dpns/v0/mod.rs | 98 +- .../triggers/feature_flags/v0/mod.rs | 28 +- .../data_triggers/triggers/reject/v0/mod.rs | 15 +- .../triggers/reward_share/v0/mod.rs | 57 +- .../triggers/withdrawals/v0/mod.rs | 16 +- .../identity_contract_nonce/mod.rs | 1 + .../identity_contract_nonce/v0/mod.rs | 67 + .../state_transitions/documents_batch/mod.rs | 77 +- .../documents_batch/state/v0/data_triggers.rs | 6 + .../documents_batch/state/v0/mod.rs | 103 +- .../identity_and_signatures/v0/mod.rs | 4 +- .../state_transitions/identity_create/mod.rs | 16 +- .../identity_create/state/v0/mod.rs | 6 +- .../identity_credit_transfer/balance/mod.rs | 47 + .../balance/v0/mod.rs | 83 + .../identity_credit_transfer/mod.rs | 16 +- .../identity_credit_transfer/nonce/mod.rs | 40 + .../identity_credit_transfer/nonce/v0/mod.rs | 50 + .../identity_credit_transfer/state/v0/mod.rs | 25 - .../identity_credit_withdrawal/balance/mod.rs | 47 + .../balance/v0/mod.rs | 83 + .../identity_credit_withdrawal/mod.rs | 19 +- .../identity_credit_withdrawal/nonce/mod.rs | 40 + .../nonce/v0/mod.rs | 52 + .../state/v0/mod.rs | 25 - .../state_transitions/identity_top_up/mod.rs | 16 +- .../identity_top_up/state/v0/mod.rs | 6 +- .../identity_and_signatures/v0/mod.rs | 4 +- .../state_transitions/identity_update/mod.rs | 17 +- .../identity_update/nonce/mod.rs | 40 + .../identity_update/nonce/v0/mod.rs | 50 + .../identity_update/state/v0/mod.rs | 46 +- packages/rs-drive-abci/src/mimic/mod.rs | 1 - .../mod.rs | 13 +- .../identity_contract_nonce/mod.rs | 66 + .../identity_contract_nonce/v0/mod.rs | 86 + .../identity_nonce/mod.rs | 61 + .../identity_nonce/v0/mod.rs | 68 + .../src/query/identity_based_queries/mod.rs | 2 + packages/rs-drive-abci/src/query/mod.rs | 747 +++ packages/rs-drive-abci/src/query/v0/mod.rs | 4 + .../tests/strategy_tests/chain_lock_update.rs | 1 + .../tests/strategy_tests/core_update_tests.rs | 3 + .../tests/strategy_tests/execution.rs | 8 + .../tests/strategy_tests/failures.rs | 3 + .../tests/strategy_tests/main.rs | 408 +- .../tests/strategy_tests/query.rs | 3 + .../tests/strategy_tests/strategy.rs | 508 +-- .../strategy_tests/upgrade_fork_tests.rs | 50 + .../verify_state_transitions.rs | 47 +- packages/rs-drive-proof-verifier/src/proof.rs | 107 +- packages/rs-drive-proof-verifier/src/types.rs | 9 + packages/rs-drive/Cargo.toml | 2 +- .../drive/batch/drive_op_batch/identity.rs | 51 +- .../data_contract_update_transition.rs | 12 +- .../document/document_create_transition.rs | 19 +- .../document/document_delete_transition.rs | 17 +- .../document/document_transition.rs | 5 + .../document/document_update_transition.rs | 12 +- .../identity/identity_credit_transfer.rs | 6 +- .../identity_credit_withdrawal_transition.rs | 6 +- .../src/drive/batch/transitions/mod.rs | 10 + .../bump_identity_data_contract_nonce.rs | 30 + .../transitions/system/bump_identity_nonce.rs | 28 + .../src/drive/batch/transitions/system/mod.rs | 2 + .../src/drive/identity/balance/update.rs | 4 +- .../fetch_identity_contract_nonce/mod.rs | 157 + .../fetch_identity_contract_nonce/v0/mod.rs | 118 + .../merge_identity_contract_nonce/mod.rs | 90 + .../merge_identity_contract_nonce/v0/mod.rs | 612 +++ .../identity_contract_nonce/mod.rs | 5 + .../prove_identity_contract_nonce/mod.rs | 44 + .../prove_identity_contract_nonce/v0/mod.rs | 24 + .../mod.rs | 0 .../v0/mod.rs | 64 +- .../contract_info/{insert => keys}/mod.rs | 13 +- .../src/drive/identity/contract_info/mod.rs | 15 +- .../for_identity_contract_info/v0/mod.rs | 50 +- .../v0/mod.rs | 8 +- .../mod.rs | 54 + .../v0/mod.rs | 31 + .../estimation_costs/for_update_nonce/mod.rs | 56 + .../for_update_nonce/v0/mod.rs | 81 + .../for_update_revision/mod.rs | 2 +- .../for_update_revision/v0/mod.rs | 10 +- .../drive/identity/estimation_costs/mod.rs | 2 + .../rs-drive/src/drive/identity/fetch/mod.rs | 2 + .../fetch/nonce/fetch_identity_nonce/mod.rs | 143 + .../nonce/fetch_identity_nonce/v0/mod.rs | 112 + .../src/drive/identity/fetch/nonce/mod.rs | 2 + .../fetch/nonce/prove_identity_nonce/mod.rs | 43 + .../nonce/prove_identity_nonce/v0/mod.rs | 25 + .../v0/mod.rs | 2 + .../v0/mod.rs | 1 + .../fetch_identity_with_balance/v0/mod.rs | 2 + .../src/drive/identity/fetch/queries/mod.rs | 23 +- .../insert/add_new_identity/v0/mod.rs | 5 +- packages/rs-drive/src/drive/identity/mod.rs | 58 +- .../methods/merge_identity_nonce/mod.rs | 128 + .../methods/merge_identity_nonce/v0/mod.rs | 74 + .../src/drive/identity/update/methods/mod.rs | 1 + .../rs-drive/src/drive/identity/update/mod.rs | 10 +- .../mod.rs | 1 + .../v0/mod.rs | 23 + .../merge_identity_nonce_operations/mod.rs | 1 + .../merge_identity_nonce_operations/v0/mod.rs | 462 ++ .../drive/identity/update/operations/mod.rs | 2 + .../rs-drive/src/drive/verify/identity/mod.rs | 2 + .../verify_identity_contract_nonce/mod.rs | 63 + .../verify_identity_contract_nonce/v0/mod.rs | 85 + .../v0/mod.rs | 1 + .../identity/verify_identity_nonce/mod.rs | 57 + .../identity/verify_identity_nonce/v0/mod.rs | 85 + .../v0/mod.rs | 4 + packages/rs-drive/src/error/identity.rs | 4 + .../contract/data_contract_update/mod.rs | 10 + .../contract/data_contract_update/v0/mod.rs | 3 + .../data_contract_update/v0/transformer.rs | 2 + .../document_transition/action_type.rs | 3 + .../document_base_transition_action/mod.rs | 7 + .../document_base_transition_action/v0/mod.rs | 5 + .../v0/transformer.rs | 6 +- .../document_transition/mod.rs | 23 +- .../document/documents_batch/mod.rs | 35 +- .../identity/identity_create/v0/mod.rs | 2 + .../identity/identity_credit_transfer/mod.rs | 8 +- .../identity_credit_transfer/v0/mod.rs | 6 +- .../v0/transformer.rs | 8 +- .../identity_credit_withdrawal/mod.rs | 8 +- .../identity_credit_withdrawal/v0/mod.rs | 6 +- .../v0/transformer.rs | 4 +- .../identity/identity_update/v0/mod.rs | 4 +- .../identity_update/v0/transformer.rs | 4 + .../src/state_transition_action/mod.rs | 13 + .../mod.rs | 38 + .../transformer.rs | 120 + .../v0/mod.rs | 27 + .../v0/transformer.rs | 143 + .../system/bump_identity_nonce_action/mod.rs | 31 + .../bump_identity_nonce_action/transformer.rs | 146 + .../bump_identity_nonce_action/v0/mod.rs | 24 + .../v0/transformer.rs | 166 + .../src/state_transition_action/system/mod.rs | 5 + .../rs-platform-value/src/types/identifier.rs | 11 + .../src/version/drive_abci_versions.rs | 11 +- .../src/version/drive_versions.rs | 9 + .../src/version/mocks/v2_test.rs | 58 +- .../src/version/mocks/v3_test.rs | 58 +- .../rs-platform-version/src/version/v1.rs | 58 +- .../rs-sdk/scripts/generate_test_vectors.sh | 2 +- packages/rs-sdk/src/internal_cache/mod.rs | 44 + packages/rs-sdk/src/lib.rs | 1 + packages/rs-sdk/src/mock/requests.rs | 36 +- packages/rs-sdk/src/mock/sdk.rs | 4 + packages/rs-sdk/src/platform/fetch.rs | 53 +- .../src/platform/transition/put_document.rs | 56 +- .../transition/withdraw_from_identity.rs | 9 +- .../rs-sdk/src/platform/types/identity.rs | 51 +- packages/rs-sdk/src/sdk.rs | 215 +- packages/rs-sdk/tests/fetch/broadcast.rs | 2 +- packages/rs-sdk/tests/fetch/document.rs | 2 - .../tests/fetch/identity_contract_nonce.rs | 52 + packages/rs-sdk/tests/fetch/mod.rs | 1 + ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 74126 -> 0 bytes ...7776113debe4287515ae60d0645da450a80a1.json | Bin 21930 -> 0 bytes ...1733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json} | Bin 74126 -> 74133 bytes ...776113debe4287515ae60d0645da450a80a1.json} | Bin 21930 -> 21973 bytes ...1733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json} | Bin 74126 -> 74133 bytes ...1733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json} | Bin 74126 -> 74133 bytes ...776113debe4287515ae60d0645da450a80a1.json} | Bin 21930 -> 21973 bytes ...1733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json} | Bin 74126 -> 74133 bytes ...8c03122daf7ab2e77108f4bf44af1ad15eae.json} | Bin 8841 -> 8856 bytes ...67bd9ccc29eca3092a5664a5a9ba3bb7e967.json} | Bin 75591 -> 75606 bytes ...bbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json} | Bin 8694 -> 8709 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 0 -> 74133 bytes ...01c1ba166a2dd8f6efb31b0289dc011da983.json} | Bin 8841 -> 8856 bytes ...7089535588985622579e77969e0ffd68afc7.json} | Bin 20999 -> 20999 bytes ...776113debe4287515ae60d0645da450a80a1.json} | Bin 21930 -> 21973 bytes ...93d92d2c84b425f8393ffa9599b06a3a77be.json} | Bin 24202 -> 24209 bytes ...93d92d2c84b425f8393ffa9599b06a3a77be.json} | Bin 24202 -> 24209 bytes ...25892e0011f1264c65e1474532f59456ff51.json} | Bin 24202 -> 24209 bytes ...776113debe4287515ae60d0645da450a80a1.json} | Bin 21930 -> 21973 bytes ...caf3663c40a12d3b03827006d66058e439ac.json} | Bin 1466413 -> 1466413 bytes ...dd01a7428085ffdcf1e11cccf19c48c5f7a1.json} | Bin 2668624 -> 2668625 bytes ...f38ff6415d9cabab87315b9d9d736194597f.json} | Bin 24328 -> 24335 bytes ...a459dc7a67570ea6df3f8858d3fae7820ffe.json} | Bin 16029 -> 15482 bytes ...776113debe4287515ae60d0645da450a80a1.json} | Bin 11759 -> 11764 bytes ...53464633a072722c5a04b15ee01f3a45de99.json} | Bin 24658 -> 24701 bytes ...776113debe4287515ae60d0645da450a80a1.json} | Bin 20800 -> 20823 bytes ...7776113debe4287515ae60d0645da450a80a1.json | Bin 0 -> 21973 bytes ...53464633a072722c5a04b15ee01f3a45de99.json} | Bin 24658 -> 24701 bytes ...8fa69b4749b19cc1f5ef0abf37fa0c04ab2ef.json | Bin 0 -> 14551 bytes ...cf0df7bf150009b1ced887a6f051ab86085b.json} | Bin 22292 -> 22299 bytes ...550f0ea4a6af6f68037e7d50ff4e4de74509.json} | Bin 8224 -> 8223 bytes ...06e5eda740be44679cc960ea35f2134af628.json} | Bin 10901 -> 10896 bytes ...592c8fe7361bed628d9a36747664c9789bf1.json} | Bin 2437723 -> 2437719 bytes ...f1acc3394d29ac72f662d38e81344496631e.json} | Bin 10652 -> 10648 bytes ...2dfc69cc7b123be24b7ad993281979b2a3a2.json} | Bin 11010 -> 11006 bytes ...b1a05862cb8d40c088b193b59ca3564210bc.json} | Bin 11321 -> 11315 bytes ...65555849abef7f60625ccd3623e6e829c227.json} | Bin 29472 -> 31425 bytes ...0b93d9d2e841a5e3d60755f8e7be3b93315b.json} | Bin 2425349 -> 2425345 bytes ...475024d266e0c12522b28f20e10da0b1a1eb7.json | 1 - ...b92786db9a793eeee5d9f52ac7c9b8bbda97c.json | 1 + packages/strategy-tests/src/lib.rs | 66 +- packages/strategy-tests/src/transitions.rs | 23 +- ...entityCreditWithdrawalTransitionFixture.js | 2 +- .../src/data_contract/data_contract_facade.rs | 7 +- .../wasm-dpp/src/document/document_facade.rs | 4 +- packages/wasm-dpp/src/document/factory.rs | 47 +- .../document_batch_transition/mod.rs | 9 +- ...tity_contract_nonce_out_of_bounds_error.rs | 34 + .../errors/consensus/basic/document/mod.rs | 2 + .../src/errors/consensus/consensus_error.rs | 11 +- .../invalid_identity_contract_nonce_error.rs | 70 + .../errors/consensus/state/identity/mod.rs | 2 + .../wasm-dpp/src/identity/identity_facade.rs | 11 +- .../wasm-dpp/src/identity/identity_factory.rs | 10 +- .../to_object.rs | 6 +- .../transition.rs | 20 +- .../dataContract/DataContractFacade.spec.js | 3 +- .../document/DocumentFacade.spec.js | 7 + .../identity/IdentityFacade.spec.js | 4 +- .../StateTransitionFacade.spec.js | 7 +- .../DataContractUpdateTransition.spec.js | 3 +- .../unit/document/DocumentFactory.spec.js | 10 +- .../unit/identity/IdentityFactory.spec.js | 4 +- ...IdentityCreditWithdrawalTransition.spec.js | 12 +- scripts/configure_dotenv.sh | 4 +- 401 files changed, 21609 insertions(+), 4055 deletions(-) create mode 100644 packages/dapi/lib/grpcServer/handlers/platform/getIdentityContractNonceHandlerFactory.js create mode 100644 packages/dapi/lib/grpcServer/handlers/platform/getIdentityNonceHandlerFactory.js create mode 100644 packages/dapi/test/unit/grpcServer/handlers/platform/getIdentityContractNonceHandlerFactory.spec.js create mode 100644 packages/dapi/test/unit/grpcServer/handlers/platform/getIdentityNonceHandlerFactory.spec.js create mode 100644 packages/js-dapi-client/lib/methods/platform/getIdentityContractNonce/GetIdentityContractNonceResponse.js create mode 100644 packages/js-dapi-client/lib/methods/platform/getIdentityContractNonce/getIdentityContractNonceFactory.js create mode 100644 packages/js-dapi-client/lib/methods/platform/getIdentityNonce/GetIdentityNonceResponse.js create mode 100644 packages/js-dapi-client/lib/methods/platform/getIdentityNonce/getIdentityNonceFactory.js create mode 100644 packages/js-dapi-client/test/unit/methods/platform/getIdentityContractNonce/GetIdentityContractNonce.spec.js create mode 100644 packages/js-dapi-client/test/unit/methods/platform/getIdentityContractNonce/getIdentityContractNonceFactory.spec.js create mode 100644 packages/js-dapi-client/test/unit/methods/platform/getIdentityNonce/GetIdentityNonce.spec.js create mode 100644 packages/js-dapi-client/test/unit/methods/platform/getIdentityNonce/getIdentityNonceFactory.spec.js create mode 100644 packages/js-dash-sdk/src/SDK/Client/Platform/NonceManager/NonceManager.ts create mode 100644 packages/rs-dpp/src/errors/consensus/basic/document/identity_contract_nonce_out_of_bounds_error.rs create mode 100644 packages/rs-dpp/src/errors/consensus/state/identity/invalid_identity_contract_nonce_error.rs create mode 100644 packages/rs-dpp/src/identity/identity_nonce.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/identity_contract_nonce/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/identity_contract_nonce/v0/mod.rs rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/{base_structure => advanced_structure}/mod.rs (100%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/{base_structure => advanced_structure}/v0/mod.rs (90%) create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/identity_contract_nonce/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/identity_contract_nonce/v0/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/balance/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/balance/v0/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/nonce/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/nonce/v0/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/balance/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/balance/v0/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/nonce/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/nonce/v0/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/nonce/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/nonce/v0/mod.rs create mode 100644 packages/rs-drive-abci/src/query/identity_based_queries/identity_contract_nonce/mod.rs create mode 100644 packages/rs-drive-abci/src/query/identity_based_queries/identity_contract_nonce/v0/mod.rs create mode 100644 packages/rs-drive-abci/src/query/identity_based_queries/identity_nonce/mod.rs create mode 100644 packages/rs-drive-abci/src/query/identity_based_queries/identity_nonce/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/batch/transitions/system/bump_identity_data_contract_nonce.rs create mode 100644 packages/rs-drive/src/drive/batch/transitions/system/bump_identity_nonce.rs create mode 100644 packages/rs-drive/src/drive/batch/transitions/system/mod.rs create mode 100644 packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/fetch_identity_contract_nonce/mod.rs create mode 100644 packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/fetch_identity_contract_nonce/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/merge_identity_contract_nonce/mod.rs create mode 100644 packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/merge_identity_contract_nonce/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/mod.rs create mode 100644 packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/prove_identity_contract_nonce/mod.rs create mode 100644 packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/prove_identity_contract_nonce/v0/mod.rs rename packages/rs-drive/src/drive/identity/contract_info/{insert => keys}/add_potential_contract_info_for_contract_bounded_key/mod.rs (100%) rename packages/rs-drive/src/drive/identity/contract_info/{insert => keys}/add_potential_contract_info_for_contract_bounded_key/v0/mod.rs (88%) rename packages/rs-drive/src/drive/identity/contract_info/{insert => keys}/mod.rs (94%) create mode 100644 packages/rs-drive/src/drive/identity/estimation_costs/for_identity_contract_info_group_keys/mod.rs create mode 100644 packages/rs-drive/src/drive/identity/estimation_costs/for_identity_contract_info_group_keys/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/identity/estimation_costs/for_update_nonce/mod.rs create mode 100644 packages/rs-drive/src/drive/identity/estimation_costs/for_update_nonce/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/identity/fetch/nonce/fetch_identity_nonce/mod.rs create mode 100644 packages/rs-drive/src/drive/identity/fetch/nonce/fetch_identity_nonce/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/identity/fetch/nonce/mod.rs create mode 100644 packages/rs-drive/src/drive/identity/fetch/nonce/prove_identity_nonce/mod.rs create mode 100644 packages/rs-drive/src/drive/identity/fetch/nonce/prove_identity_nonce/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/identity/update/methods/merge_identity_nonce/mod.rs create mode 100644 packages/rs-drive/src/drive/identity/update/methods/merge_identity_nonce/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/identity/update/operations/initialize_identity_nonce_operation/mod.rs create mode 100644 packages/rs-drive/src/drive/identity/update/operations/initialize_identity_nonce_operation/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/identity/update/operations/merge_identity_nonce_operations/mod.rs create mode 100644 packages/rs-drive/src/drive/identity/update/operations/merge_identity_nonce_operations/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/verify/identity/verify_identity_contract_nonce/mod.rs create mode 100644 packages/rs-drive/src/drive/verify/identity/verify_identity_contract_nonce/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/verify/identity/verify_identity_nonce/mod.rs create mode 100644 packages/rs-drive/src/drive/verify/identity/verify_identity_nonce/v0/mod.rs create mode 100644 packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/mod.rs create mode 100644 packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/transformer.rs create mode 100644 packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/v0/mod.rs create mode 100644 packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/v0/transformer.rs create mode 100644 packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/mod.rs create mode 100644 packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/transformer.rs create mode 100644 packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/v0/mod.rs create mode 100644 packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/v0/transformer.rs create mode 100644 packages/rs-drive/src/state_transition_action/system/mod.rs create mode 100644 packages/rs-sdk/src/internal_cache/mod.rs create mode 100644 packages/rs-sdk/tests/fetch/identity_contract_nonce.rs delete mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:12.944990422Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:13.368215618Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json rename packages/rs-sdk/tests/vectors/{msg_2024-02-06T16:01:12.941127753Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json => msg_2024-02-20T11:33:53.458555110Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json} (96%) rename packages/rs-sdk/tests/vectors/{msg_2024-02-06T16:01:12.951101193Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json => msg_2024-02-20T11:33:53.461986163Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json} (78%) rename packages/rs-sdk/tests/vectors/{msg_2024-02-06T16:01:12.918456374Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json => msg_2024-02-20T11:33:53.462631138Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json} (96%) rename packages/rs-sdk/tests/vectors/{msg_2024-02-06T16:01:12.922616653Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json => msg_2024-02-20T11:33:53.462652017Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json} (96%) rename packages/rs-sdk/tests/vectors/{msg_2024-02-06T16:01:13.046240415Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json => msg_2024-02-20T11:33:53.470444798Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json} (78%) rename packages/rs-sdk/tests/vectors/{msg_2024-02-06T16:01:12.933439115Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json => msg_2024-02-20T11:33:53.471485849Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json} (96%) rename packages/rs-sdk/tests/vectors/{msg_2024-02-06T16:01:12.914269172Z_GetDataContractRequest_1d1e53ab5e04d9ec5dce4ff9ac048c03122daf7ab2e77108f4bf44af1ad15eae.json => msg_2024-02-20T11:33:53.479909227Z_GetDataContractRequest_1d1e53ab5e04d9ec5dce4ff9ac048c03122daf7ab2e77108f4bf44af1ad15eae.json} (68%) rename packages/rs-sdk/tests/vectors/{msg_2024-02-06T16:01:12.915469587Z_GetDataContractsRequest_f229a0e58a5c4fb050f57c087bf067bd9ccc29eca3092a5664a5a9ba3bb7e967.json => msg_2024-02-20T11:33:53.480718000Z_GetDataContractsRequest_f229a0e58a5c4fb050f57c087bf067bd9ccc29eca3092a5664a5a9ba3bb7e967.json} (96%) rename packages/rs-sdk/tests/vectors/{msg_2024-02-06T16:01:12.910262643Z_GetDataContractsRequest_93bdf343bce1bafb96fd873236cabbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json => msg_2024-02-20T11:33:53.484884409Z_GetDataContractsRequest_93bdf343bce1bafb96fd873236cabbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json} (67%) create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:53.485931461Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json rename packages/rs-sdk/tests/vectors/{msg_2024-02-06T16:01:12.952713926Z_GetDataContractRequest_e4cf74168e03a40bd159451456b501c1ba166a2dd8f6efb31b0289dc011da983.json => msg_2024-02-20T11:33:53.488953093Z_GetDataContractRequest_e4cf74168e03a40bd159451456b501c1ba166a2dd8f6efb31b0289dc011da983.json} (68%) rename packages/rs-sdk/tests/vectors/{msg_2024-02-06T16:01:13.034346873Z_GetEpochsInfoRequest_1b87e649557ccb609adb9e2904c67089535588985622579e77969e0ffd68afc7.json => msg_2024-02-20T11:33:53.490170997Z_GetEpochsInfoRequest_1b87e649557ccb609adb9e2904c67089535588985622579e77969e0ffd68afc7.json} (85%) rename packages/rs-sdk/tests/vectors/{msg_2024-02-06T16:01:12.958970753Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json => msg_2024-02-20T11:33:53.562881817Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json} (78%) rename packages/rs-sdk/tests/vectors/{msg_2024-02-06T16:01:13.372271271Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json => msg_2024-02-20T11:33:53.573920842Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json} (88%) rename packages/rs-sdk/tests/vectors/{msg_2024-02-06T16:01:13.694486416Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json => msg_2024-02-20T11:33:53.577076107Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json} (88%) rename packages/rs-sdk/tests/vectors/{msg_2024-02-06T16:01:13.372463774Z_DocumentQuery_c104c67292061fe0b8e2f959cd2625892e0011f1264c65e1474532f59456ff51.json => msg_2024-02-20T11:33:53.577082679Z_DocumentQuery_c104c67292061fe0b8e2f959cd2625892e0011f1264c65e1474532f59456ff51.json} (88%) rename packages/rs-sdk/tests/vectors/{msg_2024-02-06T16:01:13.048252342Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json => msg_2024-02-20T11:33:53.585317181Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json} (78%) rename packages/rs-sdk/tests/vectors/{msg_2024-02-06T16:01:13.069937570Z_GetEpochsInfoRequest_b2b426ac4a52cb4cb08904c63386caf3663c40a12d3b03827006d66058e439ac.json => msg_2024-02-20T11:33:53.596516327Z_GetEpochsInfoRequest_b2b426ac4a52cb4cb08904c63386caf3663c40a12d3b03827006d66058e439ac.json} (99%) rename packages/rs-sdk/tests/vectors/{msg_2024-02-06T16:01:13.754344045Z_GetEpochsInfoRequest_6a828350e795a088dbc835260a1add01a7428085ffdcf1e11cccf19c48c5f7a1.json => msg_2024-02-20T11:33:53.948006184Z_GetEpochsInfoRequest_6a828350e795a088dbc835260a1add01a7428085ffdcf1e11cccf19c48c5f7a1.json} (99%) rename packages/rs-sdk/tests/vectors/{msg_2024-02-06T16:01:14.035375207Z_DocumentQuery_90af5a08200f1b0e42dbd3ad7a6af38ff6415d9cabab87315b9d9d736194597f.json => msg_2024-02-20T11:33:54.216923773Z_DocumentQuery_90af5a08200f1b0e42dbd3ad7a6af38ff6415d9cabab87315b9d9d736194597f.json} (88%) rename packages/rs-sdk/tests/vectors/{msg_2024-02-06T16:01:13.709021613Z_GetIdentityKeysRequest_b4ecff7acf52818aef9ed37a98d4a459dc7a67570ea6df3f8858d3fae7820ffe.json => msg_2024-02-20T11:33:54.222895153Z_GetIdentityKeysRequest_b4ecff7acf52818aef9ed37a98d4a459dc7a67570ea6df3f8858d3fae7820ffe.json} (71%) rename packages/rs-sdk/tests/vectors/{msg_2024-02-06T16:01:13.376226003Z_GetIdentityBalanceRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json => msg_2024-02-20T11:33:54.228228459Z_GetIdentityBalanceRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json} (71%) rename packages/rs-sdk/tests/vectors/{msg_2024-02-06T16:01:13.709234435Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json => msg_2024-02-20T11:33:54.235379280Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json} (79%) rename packages/rs-sdk/tests/vectors/{msg_2024-02-06T16:01:13.696798309Z_GetIdentityBalanceAndRevisionRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json => msg_2024-02-20T11:33:54.235614684Z_GetIdentityBalanceAndRevisionRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json} (78%) create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:54.251885544Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json rename packages/rs-sdk/tests/vectors/{msg_2024-02-06T16:01:13.711953786Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json => msg_2024-02-20T11:33:54.255202663Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json} (79%) create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:54.256001517Z_GetIdentityContractNonceRequest_b7c02dae0c3c762ece1f70a36f88fa69b4749b19cc1f5ef0abf37fa0c04ab2ef.json rename packages/rs-sdk/tests/vectors/{msg_2024-02-06T16:01:13.706232100Z_DocumentQuery_fb3b25c8fa37750a6c1b18d9085fcf0df7bf150009b1ced887a6f051ab86085b.json => msg_2024-02-20T11:33:54.258023385Z_DocumentQuery_fb3b25c8fa37750a6c1b18d9085fcf0df7bf150009b1ced887a6f051ab86085b.json} (87%) rename packages/rs-sdk/tests/vectors/{msg_2024-02-06T16:01:14.019269155Z_GetProtocolVersionUpgradeStateRequest_bb149e1933b9dc561bbfacfb6d09550f0ea4a6af6f68037e7d50ff4e4de74509.json => msg_2024-02-20T11:33:54.258421095Z_GetProtocolVersionUpgradeStateRequest_bb149e1933b9dc561bbfacfb6d09550f0ea4a6af6f68037e7d50ff4e4de74509.json} (62%) rename packages/rs-sdk/tests/vectors/{msg_2024-02-06T16:01:14.023193261Z_GetProtocolVersionUpgradeVoteStatusRequest_ec9dca65a964669b3bc8195d5ff106e5eda740be44679cc960ea35f2134af628.json => msg_2024-02-20T11:33:54.269797646Z_GetProtocolVersionUpgradeVoteStatusRequest_ec9dca65a964669b3bc8195d5ff106e5eda740be44679cc960ea35f2134af628.json} (67%) rename packages/rs-sdk/tests/vectors/{msg_2024-02-06T16:01:13.416839239Z_GetEpochsInfoRequest_734f6594c67fe6a9ab170191031d592c8fe7361bed628d9a36747664c9789bf1.json => msg_2024-02-20T11:33:54.305969656Z_GetEpochsInfoRequest_734f6594c67fe6a9ab170191031d592c8fe7361bed628d9a36747664c9789bf1.json} (99%) rename packages/rs-sdk/tests/vectors/{msg_2024-02-06T16:01:14.022689129Z_GetProtocolVersionUpgradeVoteStatusRequest_983670ac95678b1166deab32209bf1acc3394d29ac72f662d38e81344496631e.json => msg_2024-02-20T11:33:54.600823915Z_GetProtocolVersionUpgradeVoteStatusRequest_983670ac95678b1166deab32209bf1acc3394d29ac72f662d38e81344496631e.json} (66%) rename packages/rs-sdk/tests/vectors/{msg_2024-02-06T16:01:14.035494051Z_GetProtocolVersionUpgradeVoteStatusRequest_92a45a0fe4f69d355022d2f2f7622dfc69cc7b123be24b7ad993281979b2a3a2.json => msg_2024-02-20T11:33:54.612507684Z_GetProtocolVersionUpgradeVoteStatusRequest_92a45a0fe4f69d355022d2f2f7622dfc69cc7b123be24b7ad993281979b2a3a2.json} (67%) rename packages/rs-sdk/tests/vectors/{msg_2024-02-06T16:01:14.034739998Z_GetProtocolVersionUpgradeVoteStatusRequest_8534be7e0b4dd648520dc3a67209b1a05862cb8d40c088b193b59ca3564210bc.json => msg_2024-02-20T11:33:54.612509758Z_GetProtocolVersionUpgradeVoteStatusRequest_8534be7e0b4dd648520dc3a67209b1a05862cb8d40c088b193b59ca3564210bc.json} (70%) rename packages/rs-sdk/tests/vectors/{msg_2024-02-06T16:01:14.032126958Z_IdentityRequest_68658eccbc00d6ee8168459f8be3c7bc00df8bb9df6382f1d8cee10a503c01af.json => msg_2024-02-20T11:33:54.612885967Z_IdentityRequest_6f74498ccb101c39329fd63ff2af65555849abef7f60625ccd3623e6e829c227.json} (77%) rename packages/rs-sdk/tests/vectors/{msg_2024-02-06T16:01:14.065452692Z_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json => msg_2024-02-20T11:33:54.648522779Z_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json} (99%) delete mode 100644 packages/rs-sdk/tests/vectors/quorum_pubkey-106-50df0cfb07677aa8cf0272f3fce475024d266e0c12522b28f20e10da0b1a1eb7.json create mode 100644 packages/rs-sdk/tests/vectors/quorum_pubkey-106-701f88befd253a93e07bfd7efdab92786db9a793eeee5d9f52ac7c9b8bbda97c.json create mode 100644 packages/wasm-dpp/src/errors/consensus/basic/document/identity_contract_nonce_out_of_bounds_error.rs create mode 100644 packages/wasm-dpp/src/errors/consensus/state/identity/invalid_identity_contract_nonce_error.rs diff --git a/packages/dapi-grpc/build.rs b/packages/dapi-grpc/build.rs index fae5c12b0c..34800fd970 100644 --- a/packages/dapi-grpc/build.rs +++ b/packages/dapi-grpc/build.rs @@ -37,13 +37,15 @@ fn configure_platform(mut platform: MappingConfig) -> MappingConfig { // Derive features for versioned messages // // "GetConsensusParamsRequest" is excluded as this message does not support proofs - const VERSIONED_REQUESTS: [&str; 15] = [ + const VERSIONED_REQUESTS: [&str; 17] = [ "GetDataContractHistoryRequest", "GetDataContractRequest", "GetDataContractsRequest", "GetDocumentsRequest", "GetIdentitiesByPublicKeyHashesRequest", "GetIdentitiesRequest", + "GetIdentityNonceRequest", + "GetIdentityContractNonceRequest", "GetIdentityBalanceAndRevisionRequest", "GetIdentityBalanceRequest", "GetIdentityByPublicKeyHashRequest", @@ -56,7 +58,7 @@ fn configure_platform(mut platform: MappingConfig) -> MappingConfig { ]; // "GetConsensusParamsResponse" is excluded as this message does not support proofs - const VERSIONED_RESPONSES: [&str; 16] = [ + const VERSIONED_RESPONSES: [&str; 18] = [ "GetDataContractHistoryResponse", "GetDataContractResponse", "GetDataContractsResponse", @@ -65,6 +67,8 @@ fn configure_platform(mut platform: MappingConfig) -> MappingConfig { "GetIdentitiesResponse", "GetIdentityBalanceAndRevisionResponse", "GetIdentityBalanceResponse", + "GetIdentityNonceResponse", + "GetIdentityContractNonceResponse", "GetIdentityByPublicKeyHashResponse", "GetIdentityKeysResponse", "GetIdentityResponse", diff --git a/packages/dapi-grpc/clients/platform/v0/java/org/dash/platform/dapi/v0/PlatformGrpc.java b/packages/dapi-grpc/clients/platform/v0/java/org/dash/platform/dapi/v0/PlatformGrpc.java index a27ed63482..282c9fa0db 100644 --- a/packages/dapi-grpc/clients/platform/v0/java/org/dash/platform/dapi/v0/PlatformGrpc.java +++ b/packages/dapi-grpc/clients/platform/v0/java/org/dash/platform/dapi/v0/PlatformGrpc.java @@ -139,6 +139,68 @@ org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityKeysResponse> getGetIden return getGetIdentityKeysMethod; } + private static volatile io.grpc.MethodDescriptor getGetIdentityNonceMethod; + + @io.grpc.stub.annotations.RpcMethod( + fullMethodName = SERVICE_NAME + '/' + "getIdentityNonce", + requestType = org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityNonceRequest.class, + responseType = org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityNonceResponse.class, + methodType = io.grpc.MethodDescriptor.MethodType.UNARY) + public static io.grpc.MethodDescriptor getGetIdentityNonceMethod() { + io.grpc.MethodDescriptor getGetIdentityNonceMethod; + if ((getGetIdentityNonceMethod = PlatformGrpc.getGetIdentityNonceMethod) == null) { + synchronized (PlatformGrpc.class) { + if ((getGetIdentityNonceMethod = PlatformGrpc.getGetIdentityNonceMethod) == null) { + PlatformGrpc.getGetIdentityNonceMethod = getGetIdentityNonceMethod = + io.grpc.MethodDescriptor.newBuilder() + .setType(io.grpc.MethodDescriptor.MethodType.UNARY) + .setFullMethodName(generateFullMethodName(SERVICE_NAME, "getIdentityNonce")) + .setSampledToLocalTracing(true) + .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityNonceRequest.getDefaultInstance())) + .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityNonceResponse.getDefaultInstance())) + .setSchemaDescriptor(new PlatformMethodDescriptorSupplier("getIdentityNonce")) + .build(); + } + } + } + return getGetIdentityNonceMethod; + } + + private static volatile io.grpc.MethodDescriptor getGetIdentityContractNonceMethod; + + @io.grpc.stub.annotations.RpcMethod( + fullMethodName = SERVICE_NAME + '/' + "getIdentityContractNonce", + requestType = org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityContractNonceRequest.class, + responseType = org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityContractNonceResponse.class, + methodType = io.grpc.MethodDescriptor.MethodType.UNARY) + public static io.grpc.MethodDescriptor getGetIdentityContractNonceMethod() { + io.grpc.MethodDescriptor getGetIdentityContractNonceMethod; + if ((getGetIdentityContractNonceMethod = PlatformGrpc.getGetIdentityContractNonceMethod) == null) { + synchronized (PlatformGrpc.class) { + if ((getGetIdentityContractNonceMethod = PlatformGrpc.getGetIdentityContractNonceMethod) == null) { + PlatformGrpc.getGetIdentityContractNonceMethod = getGetIdentityContractNonceMethod = + io.grpc.MethodDescriptor.newBuilder() + .setType(io.grpc.MethodDescriptor.MethodType.UNARY) + .setFullMethodName(generateFullMethodName(SERVICE_NAME, "getIdentityContractNonce")) + .setSampledToLocalTracing(true) + .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityContractNonceRequest.getDefaultInstance())) + .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityContractNonceResponse.getDefaultInstance())) + .setSchemaDescriptor(new PlatformMethodDescriptorSupplier("getIdentityContractNonce")) + .build(); + } + } + } + return getGetIdentityContractNonceMethod; + } + private static volatile io.grpc.MethodDescriptor getGetIdentityBalanceMethod; @@ -649,6 +711,20 @@ public void getIdentityKeys(org.dash.platform.dapi.v0.PlatformOuterClass.GetIden io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetIdentityKeysMethod(), responseObserver); } + /** + */ + public void getIdentityNonce(org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityNonceRequest request, + io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetIdentityNonceMethod(), responseObserver); + } + + /** + */ + public void getIdentityContractNonce(org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityContractNonceRequest request, + io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetIdentityContractNonceMethod(), responseObserver); + } + /** */ public void getIdentityBalance(org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityBalanceRequest request, @@ -777,6 +853,20 @@ public void getEpochsInfo(org.dash.platform.dapi.v0.PlatformOuterClass.GetEpochs org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityKeysRequest, org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityKeysResponse>( this, METHODID_GET_IDENTITY_KEYS))) + .addMethod( + getGetIdentityNonceMethod(), + io.grpc.stub.ServerCalls.asyncUnaryCall( + new MethodHandlers< + org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityNonceRequest, + org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityNonceResponse>( + this, METHODID_GET_IDENTITY_NONCE))) + .addMethod( + getGetIdentityContractNonceMethod(), + io.grpc.stub.ServerCalls.asyncUnaryCall( + new MethodHandlers< + org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityContractNonceRequest, + org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityContractNonceResponse>( + this, METHODID_GET_IDENTITY_CONTRACT_NONCE))) .addMethod( getGetIdentityBalanceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall( @@ -925,6 +1015,22 @@ public void getIdentityKeys(org.dash.platform.dapi.v0.PlatformOuterClass.GetIden getChannel().newCall(getGetIdentityKeysMethod(), getCallOptions()), request, responseObserver); } + /** + */ + public void getIdentityNonce(org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityNonceRequest request, + io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ClientCalls.asyncUnaryCall( + getChannel().newCall(getGetIdentityNonceMethod(), getCallOptions()), request, responseObserver); + } + + /** + */ + public void getIdentityContractNonce(org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityContractNonceRequest request, + io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ClientCalls.asyncUnaryCall( + getChannel().newCall(getGetIdentityContractNonceMethod(), getCallOptions()), request, responseObserver); + } + /** */ public void getIdentityBalance(org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityBalanceRequest request, @@ -1080,6 +1186,20 @@ public org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityKeysResponse getI getChannel(), getGetIdentityKeysMethod(), getCallOptions(), request); } + /** + */ + public org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityNonceResponse getIdentityNonce(org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityNonceRequest request) { + return io.grpc.stub.ClientCalls.blockingUnaryCall( + getChannel(), getGetIdentityNonceMethod(), getCallOptions(), request); + } + + /** + */ + public org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityContractNonceResponse getIdentityContractNonce(org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityContractNonceRequest request) { + return io.grpc.stub.ClientCalls.blockingUnaryCall( + getChannel(), getGetIdentityContractNonceMethod(), getCallOptions(), request); + } + /** */ public org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityBalanceResponse getIdentityBalance(org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityBalanceRequest request) { @@ -1225,6 +1345,22 @@ public com.google.common.util.concurrent.ListenableFuture getIdentityNonce( + org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityNonceRequest request) { + return io.grpc.stub.ClientCalls.futureUnaryCall( + getChannel().newCall(getGetIdentityNonceMethod(), getCallOptions()), request); + } + + /** + */ + public com.google.common.util.concurrent.ListenableFuture getIdentityContractNonce( + org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityContractNonceRequest request) { + return io.grpc.stub.ClientCalls.futureUnaryCall( + getChannel().newCall(getGetIdentityContractNonceMethod(), getCallOptions()), request); + } + /** */ public com.google.common.util.concurrent.ListenableFuture getIdentityBalance( @@ -1342,20 +1478,22 @@ public com.google.common.util.concurrent.ListenableFuture implements io.grpc.stub.ServerCalls.UnaryMethod, @@ -1390,6 +1528,14 @@ public void invoke(Req request, io.grpc.stub.StreamObserver responseObserv serviceImpl.getIdentityKeys((org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityKeysRequest) request, (io.grpc.stub.StreamObserver) responseObserver); break; + case METHODID_GET_IDENTITY_NONCE: + serviceImpl.getIdentityNonce((org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityNonceRequest) request, + (io.grpc.stub.StreamObserver) responseObserver); + break; + case METHODID_GET_IDENTITY_CONTRACT_NONCE: + serviceImpl.getIdentityContractNonce((org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityContractNonceRequest) request, + (io.grpc.stub.StreamObserver) responseObserver); + break; case METHODID_GET_IDENTITY_BALANCE: serviceImpl.getIdentityBalance((org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityBalanceRequest) request, (io.grpc.stub.StreamObserver) responseObserver); @@ -1511,6 +1657,8 @@ public static io.grpc.ServiceDescriptor getServiceDescriptor() { .addMethod(getGetIdentityMethod()) .addMethod(getGetIdentitiesMethod()) .addMethod(getGetIdentityKeysMethod()) + .addMethod(getGetIdentityNonceMethod()) + .addMethod(getGetIdentityContractNonceMethod()) .addMethod(getGetIdentityBalanceMethod()) .addMethod(getGetIdentityBalanceAndRevisionMethod()) .addMethod(getGetProofsMethod()) diff --git a/packages/dapi-grpc/clients/platform/v0/nodejs/PlatformPromiseClient.js b/packages/dapi-grpc/clients/platform/v0/nodejs/PlatformPromiseClient.js index 6f38579c6c..dd34011d0e 100644 --- a/packages/dapi-grpc/clients/platform/v0/nodejs/PlatformPromiseClient.js +++ b/packages/dapi-grpc/clients/platform/v0/nodejs/PlatformPromiseClient.js @@ -48,6 +48,10 @@ const { PBJSGetProtocolVersionUpgradeVoteStatusResponse, GetProtocolVersionUpgradeStateRequest: PBJSGetProtocolVersionUpgradeStateRequest, GetProtocolVersionUpgradeStateResponse: PBJSGetProtocolVersionUpgradeStateResponse, + GetIdentityContractNonceRequest: PBJSGetIdentityContractNonceRequest, + GetIdentityContractNonceResponse: PBJSGetIdentityContractNonceResponse, + GetIdentityNonceRequest: PBJSGetIdentityNonceRequest, + GetIdentityNonceResponse: PBJSGetIdentityNonceResponse, }, }, }, @@ -67,6 +71,8 @@ const { GetEpochsInfoResponse: ProtocGetEpochsInfoResponse, GetProtocolVersionUpgradeVoteStatusResponse: ProtocGetProtocolVersionUpgradeVoteStatusResponse, GetProtocolVersionUpgradeStateResponse: ProtocGetProtocolVersionUpgradeStateResponse, + GetIdentityContractNonceResponse: ProtocGetIdentityContractNonceResponse, + GetIdentityNonceResponse: ProtocGetIdentityNonceResponse, } = require('./platform_protoc'); const getPlatformDefinition = require('../../../../lib/getPlatformDefinition'); @@ -137,6 +143,14 @@ class PlatformPromiseClient { this.client.getProtocolVersionUpgradeState.bind(this.client), ); + this.client.getIdentityContractNonce = promisify( + this.client.getIdentityContractNonce.bind(this.client), + ); + + this.client.getIdentityNonce = promisify( + this.client.getIdentityNonce.bind(this.client), + ); + this.protocolVersion = undefined; } @@ -496,6 +510,70 @@ class PlatformPromiseClient { ); } + /** + * @param {!PBJSGetIdentityContractNonceRequest} getIdentityContractNonceRequest + * @param {?Object} metadata + * @param {CallOptions} [options={}] + * @return {Promise} + */ + getIdentityContractNonce( + getIdentityContractNonceRequest, + metadata = {}, + options = {}, + ) { + if (!isObject(metadata)) { + throw new Error('metadata must be an object'); + } + + return this.client.getIdentityContractNonce( + getIdentityContractNonceRequest, + convertObjectToMetadata(metadata), + { + interceptors: [ + jsonToProtobufInterceptorFactory( + jsonToProtobufFactory( + ProtocGetIdentityContractNonceResponse, + PBJSGetIdentityContractNonceResponse, + ), + protobufToJsonFactory( + PBJSGetIdentityContractNonceRequest, + ), + ), + ], + ...options, + }, + ); + } + + getIdentityNonce( + getIdentityNonceRequest, + metadata = {}, + options = {}, + ) { + if (!isObject(metadata)) { + throw new Error('metadata must be an object'); + } + + return this.client.getIdentityNonce( + getIdentityNonceRequest, + convertObjectToMetadata(metadata), + { + interceptors: [ + jsonToProtobufInterceptorFactory( + jsonToProtobufFactory( + ProtocGetIdentityNonceResponse, + PBJSGetIdentityNonceResponse, + ), + protobufToJsonFactory( + PBJSGetIdentityNonceRequest, + ), + ), + ], + ...options, + }, + ); + } + /** * @param {string} protocolVersion */ diff --git a/packages/dapi-grpc/clients/platform/v0/nodejs/platform_pbjs.js b/packages/dapi-grpc/clients/platform/v0/nodejs/platform_pbjs.js index 5eb556fef9..ade9877c11 100644 --- a/packages/dapi-grpc/clients/platform/v0/nodejs/platform_pbjs.js +++ b/packages/dapi-grpc/clients/platform/v0/nodejs/platform_pbjs.js @@ -218,6 +218,72 @@ $root.org = (function() { * @variation 2 */ + /** + * Callback as used by {@link org.dash.platform.dapi.v0.Platform#getIdentityNonce}. + * @memberof org.dash.platform.dapi.v0.Platform + * @typedef getIdentityNonceCallback + * @type {function} + * @param {Error|null} error Error, if any + * @param {org.dash.platform.dapi.v0.GetIdentityNonceResponse} [response] GetIdentityNonceResponse + */ + + /** + * Calls getIdentityNonce. + * @function getIdentityNonce + * @memberof org.dash.platform.dapi.v0.Platform + * @instance + * @param {org.dash.platform.dapi.v0.IGetIdentityNonceRequest} request GetIdentityNonceRequest message or plain object + * @param {org.dash.platform.dapi.v0.Platform.getIdentityNonceCallback} callback Node-style callback called with the error, if any, and GetIdentityNonceResponse + * @returns {undefined} + * @variation 1 + */ + Object.defineProperty(Platform.prototype.getIdentityNonce = function getIdentityNonce(request, callback) { + return this.rpcCall(getIdentityNonce, $root.org.dash.platform.dapi.v0.GetIdentityNonceRequest, $root.org.dash.platform.dapi.v0.GetIdentityNonceResponse, request, callback); + }, "name", { value: "getIdentityNonce" }); + + /** + * Calls getIdentityNonce. + * @function getIdentityNonce + * @memberof org.dash.platform.dapi.v0.Platform + * @instance + * @param {org.dash.platform.dapi.v0.IGetIdentityNonceRequest} request GetIdentityNonceRequest message or plain object + * @returns {Promise} Promise + * @variation 2 + */ + + /** + * Callback as used by {@link org.dash.platform.dapi.v0.Platform#getIdentityContractNonce}. + * @memberof org.dash.platform.dapi.v0.Platform + * @typedef getIdentityContractNonceCallback + * @type {function} + * @param {Error|null} error Error, if any + * @param {org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} [response] GetIdentityContractNonceResponse + */ + + /** + * Calls getIdentityContractNonce. + * @function getIdentityContractNonce + * @memberof org.dash.platform.dapi.v0.Platform + * @instance + * @param {org.dash.platform.dapi.v0.IGetIdentityContractNonceRequest} request GetIdentityContractNonceRequest message or plain object + * @param {org.dash.platform.dapi.v0.Platform.getIdentityContractNonceCallback} callback Node-style callback called with the error, if any, and GetIdentityContractNonceResponse + * @returns {undefined} + * @variation 1 + */ + Object.defineProperty(Platform.prototype.getIdentityContractNonce = function getIdentityContractNonce(request, callback) { + return this.rpcCall(getIdentityContractNonce, $root.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest, $root.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse, request, callback); + }, "name", { value: "getIdentityContractNonce" }); + + /** + * Calls getIdentityContractNonce. + * @function getIdentityContractNonce + * @memberof org.dash.platform.dapi.v0.Platform + * @instance + * @param {org.dash.platform.dapi.v0.IGetIdentityContractNonceRequest} request GetIdentityContractNonceRequest message or plain object + * @returns {Promise} Promise + * @variation 2 + */ + /** * Callback as used by {@link org.dash.platform.dapi.v0.Platform#getIdentityBalance}. * @memberof org.dash.platform.dapi.v0.Platform @@ -2370,24 +2436,24 @@ $root.org = (function() { return GetIdentityRequest; })(); - v0.GetIdentityBalanceRequest = (function() { + v0.GetIdentityNonceRequest = (function() { /** - * Properties of a GetIdentityBalanceRequest. + * Properties of a GetIdentityNonceRequest. * @memberof org.dash.platform.dapi.v0 - * @interface IGetIdentityBalanceRequest - * @property {org.dash.platform.dapi.v0.GetIdentityBalanceRequest.IGetIdentityBalanceRequestV0|null} [v0] GetIdentityBalanceRequest v0 + * @interface IGetIdentityNonceRequest + * @property {org.dash.platform.dapi.v0.GetIdentityNonceRequest.IGetIdentityNonceRequestV0|null} [v0] GetIdentityNonceRequest v0 */ /** - * Constructs a new GetIdentityBalanceRequest. + * Constructs a new GetIdentityNonceRequest. * @memberof org.dash.platform.dapi.v0 - * @classdesc Represents a GetIdentityBalanceRequest. - * @implements IGetIdentityBalanceRequest + * @classdesc Represents a GetIdentityNonceRequest. + * @implements IGetIdentityNonceRequest * @constructor - * @param {org.dash.platform.dapi.v0.IGetIdentityBalanceRequest=} [properties] Properties to set + * @param {org.dash.platform.dapi.v0.IGetIdentityNonceRequest=} [properties] Properties to set */ - function GetIdentityBalanceRequest(properties) { + function GetIdentityNonceRequest(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -2395,89 +2461,89 @@ $root.org = (function() { } /** - * GetIdentityBalanceRequest v0. - * @member {org.dash.platform.dapi.v0.GetIdentityBalanceRequest.IGetIdentityBalanceRequestV0|null|undefined} v0 - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceRequest + * GetIdentityNonceRequest v0. + * @member {org.dash.platform.dapi.v0.GetIdentityNonceRequest.IGetIdentityNonceRequestV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceRequest * @instance */ - GetIdentityBalanceRequest.prototype.v0 = null; + GetIdentityNonceRequest.prototype.v0 = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** - * GetIdentityBalanceRequest version. + * GetIdentityNonceRequest version. * @member {"v0"|undefined} version - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceRequest + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceRequest * @instance */ - Object.defineProperty(GetIdentityBalanceRequest.prototype, "version", { + Object.defineProperty(GetIdentityNonceRequest.prototype, "version", { get: $util.oneOfGetter($oneOfFields = ["v0"]), set: $util.oneOfSetter($oneOfFields) }); /** - * Creates a new GetIdentityBalanceRequest instance using the specified properties. + * Creates a new GetIdentityNonceRequest instance using the specified properties. * @function create - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceRequest + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceRequest * @static - * @param {org.dash.platform.dapi.v0.IGetIdentityBalanceRequest=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceRequest} GetIdentityBalanceRequest instance + * @param {org.dash.platform.dapi.v0.IGetIdentityNonceRequest=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentityNonceRequest} GetIdentityNonceRequest instance */ - GetIdentityBalanceRequest.create = function create(properties) { - return new GetIdentityBalanceRequest(properties); + GetIdentityNonceRequest.create = function create(properties) { + return new GetIdentityNonceRequest(properties); }; /** - * Encodes the specified GetIdentityBalanceRequest message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityBalanceRequest.verify|verify} messages. + * Encodes the specified GetIdentityNonceRequest message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityNonceRequest.verify|verify} messages. * @function encode - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceRequest + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceRequest * @static - * @param {org.dash.platform.dapi.v0.IGetIdentityBalanceRequest} message GetIdentityBalanceRequest message or plain object to encode + * @param {org.dash.platform.dapi.v0.IGetIdentityNonceRequest} message GetIdentityNonceRequest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetIdentityBalanceRequest.encode = function encode(message, writer) { + GetIdentityNonceRequest.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) - $root.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + $root.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); return writer; }; /** - * Encodes the specified GetIdentityBalanceRequest message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityBalanceRequest.verify|verify} messages. + * Encodes the specified GetIdentityNonceRequest message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityNonceRequest.verify|verify} messages. * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceRequest + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceRequest * @static - * @param {org.dash.platform.dapi.v0.IGetIdentityBalanceRequest} message GetIdentityBalanceRequest message or plain object to encode + * @param {org.dash.platform.dapi.v0.IGetIdentityNonceRequest} message GetIdentityNonceRequest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetIdentityBalanceRequest.encodeDelimited = function encodeDelimited(message, writer) { + GetIdentityNonceRequest.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a GetIdentityBalanceRequest message from the specified reader or buffer. + * Decodes a GetIdentityNonceRequest message from the specified reader or buffer. * @function decode - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceRequest + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceRequest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceRequest} GetIdentityBalanceRequest + * @returns {org.dash.platform.dapi.v0.GetIdentityNonceRequest} GetIdentityNonceRequest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetIdentityBalanceRequest.decode = function decode(reader, length) { + GetIdentityNonceRequest.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityBalanceRequest(); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityNonceRequest(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { case 1: - message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.decode(reader, reader.uint32()); + message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.decode(reader, reader.uint32()); break; default: reader.skipType(tag & 7); @@ -2488,37 +2554,37 @@ $root.org = (function() { }; /** - * Decodes a GetIdentityBalanceRequest message from the specified reader or buffer, length delimited. + * Decodes a GetIdentityNonceRequest message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceRequest + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceRequest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceRequest} GetIdentityBalanceRequest + * @returns {org.dash.platform.dapi.v0.GetIdentityNonceRequest} GetIdentityNonceRequest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetIdentityBalanceRequest.decodeDelimited = function decodeDelimited(reader) { + GetIdentityNonceRequest.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a GetIdentityBalanceRequest message. + * Verifies a GetIdentityNonceRequest message. * @function verify - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceRequest + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceRequest * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - GetIdentityBalanceRequest.verify = function verify(message) { + GetIdentityNonceRequest.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; var properties = {}; if (message.v0 != null && message.hasOwnProperty("v0")) { properties.version = 1; { - var error = $root.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.verify(message.v0); + var error = $root.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.verify(message.v0); if (error) return "v0." + error; } @@ -2527,40 +2593,40 @@ $root.org = (function() { }; /** - * Creates a GetIdentityBalanceRequest message from a plain object. Also converts values to their respective internal types. + * Creates a GetIdentityNonceRequest message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceRequest + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceRequest * @static * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceRequest} GetIdentityBalanceRequest + * @returns {org.dash.platform.dapi.v0.GetIdentityNonceRequest} GetIdentityNonceRequest */ - GetIdentityBalanceRequest.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityBalanceRequest) + GetIdentityNonceRequest.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityNonceRequest) return object; - var message = new $root.org.dash.platform.dapi.v0.GetIdentityBalanceRequest(); + var message = new $root.org.dash.platform.dapi.v0.GetIdentityNonceRequest(); if (object.v0 != null) { if (typeof object.v0 !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetIdentityBalanceRequest.v0: object expected"); - message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.fromObject(object.v0); + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityNonceRequest.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.fromObject(object.v0); } return message; }; /** - * Creates a plain object from a GetIdentityBalanceRequest message. Also converts values to other types if specified. + * Creates a plain object from a GetIdentityNonceRequest message. Also converts values to other types if specified. * @function toObject - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceRequest + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceRequest * @static - * @param {org.dash.platform.dapi.v0.GetIdentityBalanceRequest} message GetIdentityBalanceRequest + * @param {org.dash.platform.dapi.v0.GetIdentityNonceRequest} message GetIdentityNonceRequest * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - GetIdentityBalanceRequest.toObject = function toObject(message, options) { + GetIdentityNonceRequest.toObject = function toObject(message, options) { if (!options) options = {}; var object = {}; if (message.v0 != null && message.hasOwnProperty("v0")) { - object.v0 = $root.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.toObject(message.v0, options); + object.v0 = $root.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.toObject(message.v0, options); if (options.oneofs) object.version = "v0"; } @@ -2568,35 +2634,35 @@ $root.org = (function() { }; /** - * Converts this GetIdentityBalanceRequest to JSON. + * Converts this GetIdentityNonceRequest to JSON. * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceRequest + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceRequest * @instance * @returns {Object.} JSON object */ - GetIdentityBalanceRequest.prototype.toJSON = function toJSON() { + GetIdentityNonceRequest.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - GetIdentityBalanceRequest.GetIdentityBalanceRequestV0 = (function() { + GetIdentityNonceRequest.GetIdentityNonceRequestV0 = (function() { /** - * Properties of a GetIdentityBalanceRequestV0. - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceRequest - * @interface IGetIdentityBalanceRequestV0 - * @property {Uint8Array|null} [id] GetIdentityBalanceRequestV0 id - * @property {boolean|null} [prove] GetIdentityBalanceRequestV0 prove + * Properties of a GetIdentityNonceRequestV0. + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceRequest + * @interface IGetIdentityNonceRequestV0 + * @property {Uint8Array|null} [identityId] GetIdentityNonceRequestV0 identityId + * @property {boolean|null} [prove] GetIdentityNonceRequestV0 prove */ /** - * Constructs a new GetIdentityBalanceRequestV0. - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceRequest - * @classdesc Represents a GetIdentityBalanceRequestV0. - * @implements IGetIdentityBalanceRequestV0 + * Constructs a new GetIdentityNonceRequestV0. + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceRequest + * @classdesc Represents a GetIdentityNonceRequestV0. + * @implements IGetIdentityNonceRequestV0 * @constructor - * @param {org.dash.platform.dapi.v0.GetIdentityBalanceRequest.IGetIdentityBalanceRequestV0=} [properties] Properties to set + * @param {org.dash.platform.dapi.v0.GetIdentityNonceRequest.IGetIdentityNonceRequestV0=} [properties] Properties to set */ - function GetIdentityBalanceRequestV0(properties) { + function GetIdentityNonceRequestV0(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -2604,85 +2670,85 @@ $root.org = (function() { } /** - * GetIdentityBalanceRequestV0 id. - * @member {Uint8Array} id - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0 + * GetIdentityNonceRequestV0 identityId. + * @member {Uint8Array} identityId + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0 * @instance */ - GetIdentityBalanceRequestV0.prototype.id = $util.newBuffer([]); + GetIdentityNonceRequestV0.prototype.identityId = $util.newBuffer([]); /** - * GetIdentityBalanceRequestV0 prove. + * GetIdentityNonceRequestV0 prove. * @member {boolean} prove - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0 * @instance */ - GetIdentityBalanceRequestV0.prototype.prove = false; + GetIdentityNonceRequestV0.prototype.prove = false; /** - * Creates a new GetIdentityBalanceRequestV0 instance using the specified properties. + * Creates a new GetIdentityNonceRequestV0 instance using the specified properties. * @function create - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentityBalanceRequest.IGetIdentityBalanceRequestV0=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} GetIdentityBalanceRequestV0 instance + * @param {org.dash.platform.dapi.v0.GetIdentityNonceRequest.IGetIdentityNonceRequestV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} GetIdentityNonceRequestV0 instance */ - GetIdentityBalanceRequestV0.create = function create(properties) { - return new GetIdentityBalanceRequestV0(properties); + GetIdentityNonceRequestV0.create = function create(properties) { + return new GetIdentityNonceRequestV0(properties); }; /** - * Encodes the specified GetIdentityBalanceRequestV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.verify|verify} messages. + * Encodes the specified GetIdentityNonceRequestV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.verify|verify} messages. * @function encode - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentityBalanceRequest.IGetIdentityBalanceRequestV0} message GetIdentityBalanceRequestV0 message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetIdentityNonceRequest.IGetIdentityNonceRequestV0} message GetIdentityNonceRequestV0 message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetIdentityBalanceRequestV0.encode = function encode(message, writer) { + GetIdentityNonceRequestV0.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.id != null && Object.hasOwnProperty.call(message, "id")) - writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.id); + if (message.identityId != null && Object.hasOwnProperty.call(message, "identityId")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.identityId); if (message.prove != null && Object.hasOwnProperty.call(message, "prove")) writer.uint32(/* id 2, wireType 0 =*/16).bool(message.prove); return writer; }; /** - * Encodes the specified GetIdentityBalanceRequestV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.verify|verify} messages. + * Encodes the specified GetIdentityNonceRequestV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.verify|verify} messages. * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentityBalanceRequest.IGetIdentityBalanceRequestV0} message GetIdentityBalanceRequestV0 message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetIdentityNonceRequest.IGetIdentityNonceRequestV0} message GetIdentityNonceRequestV0 message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetIdentityBalanceRequestV0.encodeDelimited = function encodeDelimited(message, writer) { + GetIdentityNonceRequestV0.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a GetIdentityBalanceRequestV0 message from the specified reader or buffer. + * Decodes a GetIdentityNonceRequestV0 message from the specified reader or buffer. * @function decode - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0 * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} GetIdentityBalanceRequestV0 + * @returns {org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} GetIdentityNonceRequestV0 * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetIdentityBalanceRequestV0.decode = function decode(reader, length) { + GetIdentityNonceRequestV0.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0(); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { case 1: - message.id = reader.bytes(); + message.identityId = reader.bytes(); break; case 2: message.prove = reader.bool(); @@ -2696,35 +2762,35 @@ $root.org = (function() { }; /** - * Decodes a GetIdentityBalanceRequestV0 message from the specified reader or buffer, length delimited. + * Decodes a GetIdentityNonceRequestV0 message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0 * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} GetIdentityBalanceRequestV0 + * @returns {org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} GetIdentityNonceRequestV0 * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetIdentityBalanceRequestV0.decodeDelimited = function decodeDelimited(reader) { + GetIdentityNonceRequestV0.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a GetIdentityBalanceRequestV0 message. + * Verifies a GetIdentityNonceRequestV0 message. * @function verify - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0 * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - GetIdentityBalanceRequestV0.verify = function verify(message) { + GetIdentityNonceRequestV0.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; - if (message.id != null && message.hasOwnProperty("id")) - if (!(message.id && typeof message.id.length === "number" || $util.isString(message.id))) - return "id: buffer expected"; + if (message.identityId != null && message.hasOwnProperty("identityId")) + if (!(message.identityId && typeof message.identityId.length === "number" || $util.isString(message.identityId))) + return "identityId: buffer expected"; if (message.prove != null && message.hasOwnProperty("prove")) if (typeof message.prove !== "boolean") return "prove: boolean expected"; @@ -2732,92 +2798,92 @@ $root.org = (function() { }; /** - * Creates a GetIdentityBalanceRequestV0 message from a plain object. Also converts values to their respective internal types. + * Creates a GetIdentityNonceRequestV0 message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0 * @static * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} GetIdentityBalanceRequestV0 + * @returns {org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} GetIdentityNonceRequestV0 */ - GetIdentityBalanceRequestV0.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0) + GetIdentityNonceRequestV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0) return object; - var message = new $root.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0(); - if (object.id != null) - if (typeof object.id === "string") - $util.base64.decode(object.id, message.id = $util.newBuffer($util.base64.length(object.id)), 0); - else if (object.id.length >= 0) - message.id = object.id; + var message = new $root.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0(); + if (object.identityId != null) + if (typeof object.identityId === "string") + $util.base64.decode(object.identityId, message.identityId = $util.newBuffer($util.base64.length(object.identityId)), 0); + else if (object.identityId.length >= 0) + message.identityId = object.identityId; if (object.prove != null) message.prove = Boolean(object.prove); return message; }; /** - * Creates a plain object from a GetIdentityBalanceRequestV0 message. Also converts values to other types if specified. + * Creates a plain object from a GetIdentityNonceRequestV0 message. Also converts values to other types if specified. * @function toObject - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} message GetIdentityBalanceRequestV0 + * @param {org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} message GetIdentityNonceRequestV0 * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - GetIdentityBalanceRequestV0.toObject = function toObject(message, options) { + GetIdentityNonceRequestV0.toObject = function toObject(message, options) { if (!options) options = {}; var object = {}; if (options.defaults) { if (options.bytes === String) - object.id = ""; + object.identityId = ""; else { - object.id = []; + object.identityId = []; if (options.bytes !== Array) - object.id = $util.newBuffer(object.id); + object.identityId = $util.newBuffer(object.identityId); } object.prove = false; } - if (message.id != null && message.hasOwnProperty("id")) - object.id = options.bytes === String ? $util.base64.encode(message.id, 0, message.id.length) : options.bytes === Array ? Array.prototype.slice.call(message.id) : message.id; + if (message.identityId != null && message.hasOwnProperty("identityId")) + object.identityId = options.bytes === String ? $util.base64.encode(message.identityId, 0, message.identityId.length) : options.bytes === Array ? Array.prototype.slice.call(message.identityId) : message.identityId; if (message.prove != null && message.hasOwnProperty("prove")) object.prove = message.prove; return object; }; /** - * Converts this GetIdentityBalanceRequestV0 to JSON. + * Converts this GetIdentityNonceRequestV0 to JSON. * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0 * @instance * @returns {Object.} JSON object */ - GetIdentityBalanceRequestV0.prototype.toJSON = function toJSON() { + GetIdentityNonceRequestV0.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - return GetIdentityBalanceRequestV0; + return GetIdentityNonceRequestV0; })(); - return GetIdentityBalanceRequest; + return GetIdentityNonceRequest; })(); - v0.GetIdentityBalanceAndRevisionRequest = (function() { + v0.GetIdentityContractNonceRequest = (function() { /** - * Properties of a GetIdentityBalanceAndRevisionRequest. + * Properties of a GetIdentityContractNonceRequest. * @memberof org.dash.platform.dapi.v0 - * @interface IGetIdentityBalanceAndRevisionRequest - * @property {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.IGetIdentityBalanceAndRevisionRequestV0|null} [v0] GetIdentityBalanceAndRevisionRequest v0 + * @interface IGetIdentityContractNonceRequest + * @property {org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.IGetIdentityContractNonceRequestV0|null} [v0] GetIdentityContractNonceRequest v0 */ /** - * Constructs a new GetIdentityBalanceAndRevisionRequest. + * Constructs a new GetIdentityContractNonceRequest. * @memberof org.dash.platform.dapi.v0 - * @classdesc Represents a GetIdentityBalanceAndRevisionRequest. - * @implements IGetIdentityBalanceAndRevisionRequest + * @classdesc Represents a GetIdentityContractNonceRequest. + * @implements IGetIdentityContractNonceRequest * @constructor - * @param {org.dash.platform.dapi.v0.IGetIdentityBalanceAndRevisionRequest=} [properties] Properties to set + * @param {org.dash.platform.dapi.v0.IGetIdentityContractNonceRequest=} [properties] Properties to set */ - function GetIdentityBalanceAndRevisionRequest(properties) { + function GetIdentityContractNonceRequest(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -2825,89 +2891,89 @@ $root.org = (function() { } /** - * GetIdentityBalanceAndRevisionRequest v0. - * @member {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.IGetIdentityBalanceAndRevisionRequestV0|null|undefined} v0 - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest + * GetIdentityContractNonceRequest v0. + * @member {org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.IGetIdentityContractNonceRequestV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceRequest * @instance */ - GetIdentityBalanceAndRevisionRequest.prototype.v0 = null; + GetIdentityContractNonceRequest.prototype.v0 = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** - * GetIdentityBalanceAndRevisionRequest version. + * GetIdentityContractNonceRequest version. * @member {"v0"|undefined} version - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceRequest * @instance */ - Object.defineProperty(GetIdentityBalanceAndRevisionRequest.prototype, "version", { + Object.defineProperty(GetIdentityContractNonceRequest.prototype, "version", { get: $util.oneOfGetter($oneOfFields = ["v0"]), set: $util.oneOfSetter($oneOfFields) }); /** - * Creates a new GetIdentityBalanceAndRevisionRequest instance using the specified properties. + * Creates a new GetIdentityContractNonceRequest instance using the specified properties. * @function create - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceRequest * @static - * @param {org.dash.platform.dapi.v0.IGetIdentityBalanceAndRevisionRequest=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} GetIdentityBalanceAndRevisionRequest instance + * @param {org.dash.platform.dapi.v0.IGetIdentityContractNonceRequest=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentityContractNonceRequest} GetIdentityContractNonceRequest instance */ - GetIdentityBalanceAndRevisionRequest.create = function create(properties) { - return new GetIdentityBalanceAndRevisionRequest(properties); + GetIdentityContractNonceRequest.create = function create(properties) { + return new GetIdentityContractNonceRequest(properties); }; /** - * Encodes the specified GetIdentityBalanceAndRevisionRequest message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.verify|verify} messages. + * Encodes the specified GetIdentityContractNonceRequest message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.verify|verify} messages. * @function encode - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceRequest * @static - * @param {org.dash.platform.dapi.v0.IGetIdentityBalanceAndRevisionRequest} message GetIdentityBalanceAndRevisionRequest message or plain object to encode + * @param {org.dash.platform.dapi.v0.IGetIdentityContractNonceRequest} message GetIdentityContractNonceRequest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetIdentityBalanceAndRevisionRequest.encode = function encode(message, writer) { + GetIdentityContractNonceRequest.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) - $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + $root.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); return writer; }; /** - * Encodes the specified GetIdentityBalanceAndRevisionRequest message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.verify|verify} messages. + * Encodes the specified GetIdentityContractNonceRequest message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.verify|verify} messages. * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceRequest * @static - * @param {org.dash.platform.dapi.v0.IGetIdentityBalanceAndRevisionRequest} message GetIdentityBalanceAndRevisionRequest message or plain object to encode + * @param {org.dash.platform.dapi.v0.IGetIdentityContractNonceRequest} message GetIdentityContractNonceRequest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetIdentityBalanceAndRevisionRequest.encodeDelimited = function encodeDelimited(message, writer) { + GetIdentityContractNonceRequest.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a GetIdentityBalanceAndRevisionRequest message from the specified reader or buffer. + * Decodes a GetIdentityContractNonceRequest message from the specified reader or buffer. * @function decode - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceRequest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} GetIdentityBalanceAndRevisionRequest + * @returns {org.dash.platform.dapi.v0.GetIdentityContractNonceRequest} GetIdentityContractNonceRequest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetIdentityBalanceAndRevisionRequest.decode = function decode(reader, length) { + GetIdentityContractNonceRequest.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest(); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { case 1: - message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.decode(reader, reader.uint32()); + message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.decode(reader, reader.uint32()); break; default: reader.skipType(tag & 7); @@ -2918,37 +2984,37 @@ $root.org = (function() { }; /** - * Decodes a GetIdentityBalanceAndRevisionRequest message from the specified reader or buffer, length delimited. + * Decodes a GetIdentityContractNonceRequest message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceRequest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} GetIdentityBalanceAndRevisionRequest + * @returns {org.dash.platform.dapi.v0.GetIdentityContractNonceRequest} GetIdentityContractNonceRequest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetIdentityBalanceAndRevisionRequest.decodeDelimited = function decodeDelimited(reader) { + GetIdentityContractNonceRequest.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a GetIdentityBalanceAndRevisionRequest message. + * Verifies a GetIdentityContractNonceRequest message. * @function verify - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceRequest * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - GetIdentityBalanceAndRevisionRequest.verify = function verify(message) { + GetIdentityContractNonceRequest.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; var properties = {}; if (message.v0 != null && message.hasOwnProperty("v0")) { properties.version = 1; { - var error = $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.verify(message.v0); + var error = $root.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.verify(message.v0); if (error) return "v0." + error; } @@ -2957,40 +3023,40 @@ $root.org = (function() { }; /** - * Creates a GetIdentityBalanceAndRevisionRequest message from a plain object. Also converts values to their respective internal types. + * Creates a GetIdentityContractNonceRequest message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceRequest * @static * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} GetIdentityBalanceAndRevisionRequest + * @returns {org.dash.platform.dapi.v0.GetIdentityContractNonceRequest} GetIdentityContractNonceRequest */ - GetIdentityBalanceAndRevisionRequest.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest) + GetIdentityContractNonceRequest.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest) return object; - var message = new $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest(); + var message = new $root.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest(); if (object.v0 != null) { if (typeof object.v0 !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.v0: object expected"); - message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.fromObject(object.v0); + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.fromObject(object.v0); } return message; }; /** - * Creates a plain object from a GetIdentityBalanceAndRevisionRequest message. Also converts values to other types if specified. + * Creates a plain object from a GetIdentityContractNonceRequest message. Also converts values to other types if specified. * @function toObject - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceRequest * @static - * @param {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} message GetIdentityBalanceAndRevisionRequest + * @param {org.dash.platform.dapi.v0.GetIdentityContractNonceRequest} message GetIdentityContractNonceRequest * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - GetIdentityBalanceAndRevisionRequest.toObject = function toObject(message, options) { + GetIdentityContractNonceRequest.toObject = function toObject(message, options) { if (!options) options = {}; var object = {}; if (message.v0 != null && message.hasOwnProperty("v0")) { - object.v0 = $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.toObject(message.v0, options); + object.v0 = $root.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.toObject(message.v0, options); if (options.oneofs) object.version = "v0"; } @@ -2998,35 +3064,36 @@ $root.org = (function() { }; /** - * Converts this GetIdentityBalanceAndRevisionRequest to JSON. + * Converts this GetIdentityContractNonceRequest to JSON. * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceRequest * @instance * @returns {Object.} JSON object */ - GetIdentityBalanceAndRevisionRequest.prototype.toJSON = function toJSON() { + GetIdentityContractNonceRequest.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0 = (function() { + GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0 = (function() { /** - * Properties of a GetIdentityBalanceAndRevisionRequestV0. - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest - * @interface IGetIdentityBalanceAndRevisionRequestV0 - * @property {Uint8Array|null} [id] GetIdentityBalanceAndRevisionRequestV0 id - * @property {boolean|null} [prove] GetIdentityBalanceAndRevisionRequestV0 prove + * Properties of a GetIdentityContractNonceRequestV0. + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceRequest + * @interface IGetIdentityContractNonceRequestV0 + * @property {Uint8Array|null} [identityId] GetIdentityContractNonceRequestV0 identityId + * @property {Uint8Array|null} [contractId] GetIdentityContractNonceRequestV0 contractId + * @property {boolean|null} [prove] GetIdentityContractNonceRequestV0 prove */ /** - * Constructs a new GetIdentityBalanceAndRevisionRequestV0. - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest - * @classdesc Represents a GetIdentityBalanceAndRevisionRequestV0. - * @implements IGetIdentityBalanceAndRevisionRequestV0 + * Constructs a new GetIdentityContractNonceRequestV0. + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceRequest + * @classdesc Represents a GetIdentityContractNonceRequestV0. + * @implements IGetIdentityContractNonceRequestV0 * @constructor - * @param {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.IGetIdentityBalanceAndRevisionRequestV0=} [properties] Properties to set + * @param {org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.IGetIdentityContractNonceRequestV0=} [properties] Properties to set */ - function GetIdentityBalanceAndRevisionRequestV0(properties) { + function GetIdentityContractNonceRequestV0(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -3034,87 +3101,100 @@ $root.org = (function() { } /** - * GetIdentityBalanceAndRevisionRequestV0 id. - * @member {Uint8Array} id - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0 + * GetIdentityContractNonceRequestV0 identityId. + * @member {Uint8Array} identityId + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0 * @instance */ - GetIdentityBalanceAndRevisionRequestV0.prototype.id = $util.newBuffer([]); + GetIdentityContractNonceRequestV0.prototype.identityId = $util.newBuffer([]); /** - * GetIdentityBalanceAndRevisionRequestV0 prove. + * GetIdentityContractNonceRequestV0 contractId. + * @member {Uint8Array} contractId + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0 + * @instance + */ + GetIdentityContractNonceRequestV0.prototype.contractId = $util.newBuffer([]); + + /** + * GetIdentityContractNonceRequestV0 prove. * @member {boolean} prove - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0 * @instance */ - GetIdentityBalanceAndRevisionRequestV0.prototype.prove = false; + GetIdentityContractNonceRequestV0.prototype.prove = false; /** - * Creates a new GetIdentityBalanceAndRevisionRequestV0 instance using the specified properties. + * Creates a new GetIdentityContractNonceRequestV0 instance using the specified properties. * @function create - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.IGetIdentityBalanceAndRevisionRequestV0=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} GetIdentityBalanceAndRevisionRequestV0 instance + * @param {org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.IGetIdentityContractNonceRequestV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} GetIdentityContractNonceRequestV0 instance */ - GetIdentityBalanceAndRevisionRequestV0.create = function create(properties) { - return new GetIdentityBalanceAndRevisionRequestV0(properties); + GetIdentityContractNonceRequestV0.create = function create(properties) { + return new GetIdentityContractNonceRequestV0(properties); }; /** - * Encodes the specified GetIdentityBalanceAndRevisionRequestV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.verify|verify} messages. + * Encodes the specified GetIdentityContractNonceRequestV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.verify|verify} messages. * @function encode - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.IGetIdentityBalanceAndRevisionRequestV0} message GetIdentityBalanceAndRevisionRequestV0 message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.IGetIdentityContractNonceRequestV0} message GetIdentityContractNonceRequestV0 message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetIdentityBalanceAndRevisionRequestV0.encode = function encode(message, writer) { + GetIdentityContractNonceRequestV0.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.id != null && Object.hasOwnProperty.call(message, "id")) - writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.id); + if (message.identityId != null && Object.hasOwnProperty.call(message, "identityId")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.identityId); + if (message.contractId != null && Object.hasOwnProperty.call(message, "contractId")) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.contractId); if (message.prove != null && Object.hasOwnProperty.call(message, "prove")) - writer.uint32(/* id 2, wireType 0 =*/16).bool(message.prove); + writer.uint32(/* id 3, wireType 0 =*/24).bool(message.prove); return writer; }; /** - * Encodes the specified GetIdentityBalanceAndRevisionRequestV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.verify|verify} messages. + * Encodes the specified GetIdentityContractNonceRequestV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.verify|verify} messages. * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.IGetIdentityBalanceAndRevisionRequestV0} message GetIdentityBalanceAndRevisionRequestV0 message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.IGetIdentityContractNonceRequestV0} message GetIdentityContractNonceRequestV0 message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetIdentityBalanceAndRevisionRequestV0.encodeDelimited = function encodeDelimited(message, writer) { + GetIdentityContractNonceRequestV0.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a GetIdentityBalanceAndRevisionRequestV0 message from the specified reader or buffer. + * Decodes a GetIdentityContractNonceRequestV0 message from the specified reader or buffer. * @function decode - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0 * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} GetIdentityBalanceAndRevisionRequestV0 + * @returns {org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} GetIdentityContractNonceRequestV0 * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetIdentityBalanceAndRevisionRequestV0.decode = function decode(reader, length) { + GetIdentityContractNonceRequestV0.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0(); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { case 1: - message.id = reader.bytes(); + message.identityId = reader.bytes(); break; case 2: + message.contractId = reader.bytes(); + break; + case 3: message.prove = reader.bool(); break; default: @@ -3126,35 +3206,38 @@ $root.org = (function() { }; /** - * Decodes a GetIdentityBalanceAndRevisionRequestV0 message from the specified reader or buffer, length delimited. + * Decodes a GetIdentityContractNonceRequestV0 message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0 * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} GetIdentityBalanceAndRevisionRequestV0 + * @returns {org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} GetIdentityContractNonceRequestV0 * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetIdentityBalanceAndRevisionRequestV0.decodeDelimited = function decodeDelimited(reader) { + GetIdentityContractNonceRequestV0.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a GetIdentityBalanceAndRevisionRequestV0 message. + * Verifies a GetIdentityContractNonceRequestV0 message. * @function verify - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0 * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - GetIdentityBalanceAndRevisionRequestV0.verify = function verify(message) { + GetIdentityContractNonceRequestV0.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; - if (message.id != null && message.hasOwnProperty("id")) - if (!(message.id && typeof message.id.length === "number" || $util.isString(message.id))) - return "id: buffer expected"; + if (message.identityId != null && message.hasOwnProperty("identityId")) + if (!(message.identityId && typeof message.identityId.length === "number" || $util.isString(message.identityId))) + return "identityId: buffer expected"; + if (message.contractId != null && message.hasOwnProperty("contractId")) + if (!(message.contractId && typeof message.contractId.length === "number" || $util.isString(message.contractId))) + return "contractId: buffer expected"; if (message.prove != null && message.hasOwnProperty("prove")) if (typeof message.prove !== "boolean") return "prove: boolean expected"; @@ -3162,92 +3245,106 @@ $root.org = (function() { }; /** - * Creates a GetIdentityBalanceAndRevisionRequestV0 message from a plain object. Also converts values to their respective internal types. + * Creates a GetIdentityContractNonceRequestV0 message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0 * @static * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} GetIdentityBalanceAndRevisionRequestV0 + * @returns {org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} GetIdentityContractNonceRequestV0 */ - GetIdentityBalanceAndRevisionRequestV0.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0) + GetIdentityContractNonceRequestV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0) return object; - var message = new $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0(); - if (object.id != null) - if (typeof object.id === "string") - $util.base64.decode(object.id, message.id = $util.newBuffer($util.base64.length(object.id)), 0); - else if (object.id.length >= 0) - message.id = object.id; + var message = new $root.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0(); + if (object.identityId != null) + if (typeof object.identityId === "string") + $util.base64.decode(object.identityId, message.identityId = $util.newBuffer($util.base64.length(object.identityId)), 0); + else if (object.identityId.length >= 0) + message.identityId = object.identityId; + if (object.contractId != null) + if (typeof object.contractId === "string") + $util.base64.decode(object.contractId, message.contractId = $util.newBuffer($util.base64.length(object.contractId)), 0); + else if (object.contractId.length >= 0) + message.contractId = object.contractId; if (object.prove != null) message.prove = Boolean(object.prove); return message; }; /** - * Creates a plain object from a GetIdentityBalanceAndRevisionRequestV0 message. Also converts values to other types if specified. + * Creates a plain object from a GetIdentityContractNonceRequestV0 message. Also converts values to other types if specified. * @function toObject - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} message GetIdentityBalanceAndRevisionRequestV0 + * @param {org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} message GetIdentityContractNonceRequestV0 * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - GetIdentityBalanceAndRevisionRequestV0.toObject = function toObject(message, options) { + GetIdentityContractNonceRequestV0.toObject = function toObject(message, options) { if (!options) options = {}; var object = {}; if (options.defaults) { if (options.bytes === String) - object.id = ""; + object.identityId = ""; else { - object.id = []; + object.identityId = []; if (options.bytes !== Array) - object.id = $util.newBuffer(object.id); + object.identityId = $util.newBuffer(object.identityId); + } + if (options.bytes === String) + object.contractId = ""; + else { + object.contractId = []; + if (options.bytes !== Array) + object.contractId = $util.newBuffer(object.contractId); } object.prove = false; } - if (message.id != null && message.hasOwnProperty("id")) - object.id = options.bytes === String ? $util.base64.encode(message.id, 0, message.id.length) : options.bytes === Array ? Array.prototype.slice.call(message.id) : message.id; + if (message.identityId != null && message.hasOwnProperty("identityId")) + object.identityId = options.bytes === String ? $util.base64.encode(message.identityId, 0, message.identityId.length) : options.bytes === Array ? Array.prototype.slice.call(message.identityId) : message.identityId; + if (message.contractId != null && message.hasOwnProperty("contractId")) + object.contractId = options.bytes === String ? $util.base64.encode(message.contractId, 0, message.contractId.length) : options.bytes === Array ? Array.prototype.slice.call(message.contractId) : message.contractId; if (message.prove != null && message.hasOwnProperty("prove")) object.prove = message.prove; return object; }; /** - * Converts this GetIdentityBalanceAndRevisionRequestV0 to JSON. + * Converts this GetIdentityContractNonceRequestV0 to JSON. * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0 * @instance * @returns {Object.} JSON object */ - GetIdentityBalanceAndRevisionRequestV0.prototype.toJSON = function toJSON() { + GetIdentityContractNonceRequestV0.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - return GetIdentityBalanceAndRevisionRequestV0; + return GetIdentityContractNonceRequestV0; })(); - return GetIdentityBalanceAndRevisionRequest; + return GetIdentityContractNonceRequest; })(); - v0.GetIdentityResponse = (function() { + v0.GetIdentityBalanceRequest = (function() { /** - * Properties of a GetIdentityResponse. + * Properties of a GetIdentityBalanceRequest. * @memberof org.dash.platform.dapi.v0 - * @interface IGetIdentityResponse - * @property {org.dash.platform.dapi.v0.GetIdentityResponse.IGetIdentityResponseV0|null} [v0] GetIdentityResponse v0 + * @interface IGetIdentityBalanceRequest + * @property {org.dash.platform.dapi.v0.GetIdentityBalanceRequest.IGetIdentityBalanceRequestV0|null} [v0] GetIdentityBalanceRequest v0 */ /** - * Constructs a new GetIdentityResponse. + * Constructs a new GetIdentityBalanceRequest. * @memberof org.dash.platform.dapi.v0 - * @classdesc Represents a GetIdentityResponse. - * @implements IGetIdentityResponse + * @classdesc Represents a GetIdentityBalanceRequest. + * @implements IGetIdentityBalanceRequest * @constructor - * @param {org.dash.platform.dapi.v0.IGetIdentityResponse=} [properties] Properties to set + * @param {org.dash.platform.dapi.v0.IGetIdentityBalanceRequest=} [properties] Properties to set */ - function GetIdentityResponse(properties) { + function GetIdentityBalanceRequest(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -3255,89 +3352,89 @@ $root.org = (function() { } /** - * GetIdentityResponse v0. - * @member {org.dash.platform.dapi.v0.GetIdentityResponse.IGetIdentityResponseV0|null|undefined} v0 - * @memberof org.dash.platform.dapi.v0.GetIdentityResponse + * GetIdentityBalanceRequest v0. + * @member {org.dash.platform.dapi.v0.GetIdentityBalanceRequest.IGetIdentityBalanceRequestV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceRequest * @instance */ - GetIdentityResponse.prototype.v0 = null; + GetIdentityBalanceRequest.prototype.v0 = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** - * GetIdentityResponse version. + * GetIdentityBalanceRequest version. * @member {"v0"|undefined} version - * @memberof org.dash.platform.dapi.v0.GetIdentityResponse + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceRequest * @instance */ - Object.defineProperty(GetIdentityResponse.prototype, "version", { + Object.defineProperty(GetIdentityBalanceRequest.prototype, "version", { get: $util.oneOfGetter($oneOfFields = ["v0"]), set: $util.oneOfSetter($oneOfFields) }); /** - * Creates a new GetIdentityResponse instance using the specified properties. + * Creates a new GetIdentityBalanceRequest instance using the specified properties. * @function create - * @memberof org.dash.platform.dapi.v0.GetIdentityResponse + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceRequest * @static - * @param {org.dash.platform.dapi.v0.IGetIdentityResponse=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetIdentityResponse} GetIdentityResponse instance + * @param {org.dash.platform.dapi.v0.IGetIdentityBalanceRequest=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceRequest} GetIdentityBalanceRequest instance */ - GetIdentityResponse.create = function create(properties) { - return new GetIdentityResponse(properties); + GetIdentityBalanceRequest.create = function create(properties) { + return new GetIdentityBalanceRequest(properties); }; /** - * Encodes the specified GetIdentityResponse message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityResponse.verify|verify} messages. + * Encodes the specified GetIdentityBalanceRequest message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityBalanceRequest.verify|verify} messages. * @function encode - * @memberof org.dash.platform.dapi.v0.GetIdentityResponse + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceRequest * @static - * @param {org.dash.platform.dapi.v0.IGetIdentityResponse} message GetIdentityResponse message or plain object to encode + * @param {org.dash.platform.dapi.v0.IGetIdentityBalanceRequest} message GetIdentityBalanceRequest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetIdentityResponse.encode = function encode(message, writer) { + GetIdentityBalanceRequest.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) - $root.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + $root.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); return writer; }; /** - * Encodes the specified GetIdentityResponse message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityResponse.verify|verify} messages. + * Encodes the specified GetIdentityBalanceRequest message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityBalanceRequest.verify|verify} messages. * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentityResponse + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceRequest * @static - * @param {org.dash.platform.dapi.v0.IGetIdentityResponse} message GetIdentityResponse message or plain object to encode + * @param {org.dash.platform.dapi.v0.IGetIdentityBalanceRequest} message GetIdentityBalanceRequest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetIdentityResponse.encodeDelimited = function encodeDelimited(message, writer) { + GetIdentityBalanceRequest.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a GetIdentityResponse message from the specified reader or buffer. + * Decodes a GetIdentityBalanceRequest message from the specified reader or buffer. * @function decode - * @memberof org.dash.platform.dapi.v0.GetIdentityResponse + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceRequest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetIdentityResponse} GetIdentityResponse + * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceRequest} GetIdentityBalanceRequest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetIdentityResponse.decode = function decode(reader, length) { + GetIdentityBalanceRequest.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityResponse(); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityBalanceRequest(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { case 1: - message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.decode(reader, reader.uint32()); + message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.decode(reader, reader.uint32()); break; default: reader.skipType(tag & 7); @@ -3348,37 +3445,37 @@ $root.org = (function() { }; /** - * Decodes a GetIdentityResponse message from the specified reader or buffer, length delimited. + * Decodes a GetIdentityBalanceRequest message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentityResponse + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceRequest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetIdentityResponse} GetIdentityResponse + * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceRequest} GetIdentityBalanceRequest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetIdentityResponse.decodeDelimited = function decodeDelimited(reader) { + GetIdentityBalanceRequest.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a GetIdentityResponse message. + * Verifies a GetIdentityBalanceRequest message. * @function verify - * @memberof org.dash.platform.dapi.v0.GetIdentityResponse + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceRequest * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - GetIdentityResponse.verify = function verify(message) { + GetIdentityBalanceRequest.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; var properties = {}; if (message.v0 != null && message.hasOwnProperty("v0")) { properties.version = 1; { - var error = $root.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.verify(message.v0); + var error = $root.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.verify(message.v0); if (error) return "v0." + error; } @@ -3387,40 +3484,40 @@ $root.org = (function() { }; /** - * Creates a GetIdentityResponse message from a plain object. Also converts values to their respective internal types. + * Creates a GetIdentityBalanceRequest message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetIdentityResponse + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceRequest * @static * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetIdentityResponse} GetIdentityResponse + * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceRequest} GetIdentityBalanceRequest */ - GetIdentityResponse.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityResponse) + GetIdentityBalanceRequest.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityBalanceRequest) return object; - var message = new $root.org.dash.platform.dapi.v0.GetIdentityResponse(); + var message = new $root.org.dash.platform.dapi.v0.GetIdentityBalanceRequest(); if (object.v0 != null) { if (typeof object.v0 !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetIdentityResponse.v0: object expected"); - message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.fromObject(object.v0); + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityBalanceRequest.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.fromObject(object.v0); } return message; }; /** - * Creates a plain object from a GetIdentityResponse message. Also converts values to other types if specified. + * Creates a plain object from a GetIdentityBalanceRequest message. Also converts values to other types if specified. * @function toObject - * @memberof org.dash.platform.dapi.v0.GetIdentityResponse + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceRequest * @static - * @param {org.dash.platform.dapi.v0.GetIdentityResponse} message GetIdentityResponse + * @param {org.dash.platform.dapi.v0.GetIdentityBalanceRequest} message GetIdentityBalanceRequest * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - GetIdentityResponse.toObject = function toObject(message, options) { + GetIdentityBalanceRequest.toObject = function toObject(message, options) { if (!options) options = {}; var object = {}; if (message.v0 != null && message.hasOwnProperty("v0")) { - object.v0 = $root.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.toObject(message.v0, options); + object.v0 = $root.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.toObject(message.v0, options); if (options.oneofs) object.version = "v0"; } @@ -3428,36 +3525,35 @@ $root.org = (function() { }; /** - * Converts this GetIdentityResponse to JSON. + * Converts this GetIdentityBalanceRequest to JSON. * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetIdentityResponse + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceRequest * @instance * @returns {Object.} JSON object */ - GetIdentityResponse.prototype.toJSON = function toJSON() { + GetIdentityBalanceRequest.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - GetIdentityResponse.GetIdentityResponseV0 = (function() { + GetIdentityBalanceRequest.GetIdentityBalanceRequestV0 = (function() { /** - * Properties of a GetIdentityResponseV0. - * @memberof org.dash.platform.dapi.v0.GetIdentityResponse - * @interface IGetIdentityResponseV0 - * @property {Uint8Array|null} [identity] GetIdentityResponseV0 identity - * @property {org.dash.platform.dapi.v0.IProof|null} [proof] GetIdentityResponseV0 proof - * @property {org.dash.platform.dapi.v0.IResponseMetadata|null} [metadata] GetIdentityResponseV0 metadata + * Properties of a GetIdentityBalanceRequestV0. + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceRequest + * @interface IGetIdentityBalanceRequestV0 + * @property {Uint8Array|null} [id] GetIdentityBalanceRequestV0 id + * @property {boolean|null} [prove] GetIdentityBalanceRequestV0 prove */ /** - * Constructs a new GetIdentityResponseV0. - * @memberof org.dash.platform.dapi.v0.GetIdentityResponse - * @classdesc Represents a GetIdentityResponseV0. - * @implements IGetIdentityResponseV0 + * Constructs a new GetIdentityBalanceRequestV0. + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceRequest + * @classdesc Represents a GetIdentityBalanceRequestV0. + * @implements IGetIdentityBalanceRequestV0 * @constructor - * @param {org.dash.platform.dapi.v0.GetIdentityResponse.IGetIdentityResponseV0=} [properties] Properties to set + * @param {org.dash.platform.dapi.v0.GetIdentityBalanceRequest.IGetIdentityBalanceRequestV0=} [properties] Properties to set */ - function GetIdentityResponseV0(properties) { + function GetIdentityBalanceRequestV0(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -3465,115 +3561,88 @@ $root.org = (function() { } /** - * GetIdentityResponseV0 identity. - * @member {Uint8Array} identity - * @memberof org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0 + * GetIdentityBalanceRequestV0 id. + * @member {Uint8Array} id + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0 * @instance */ - GetIdentityResponseV0.prototype.identity = $util.newBuffer([]); - - /** - * GetIdentityResponseV0 proof. - * @member {org.dash.platform.dapi.v0.IProof|null|undefined} proof - * @memberof org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0 - * @instance - */ - GetIdentityResponseV0.prototype.proof = null; - - /** - * GetIdentityResponseV0 metadata. - * @member {org.dash.platform.dapi.v0.IResponseMetadata|null|undefined} metadata - * @memberof org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0 - * @instance - */ - GetIdentityResponseV0.prototype.metadata = null; - - // OneOf field names bound to virtual getters and setters - var $oneOfFields; + GetIdentityBalanceRequestV0.prototype.id = $util.newBuffer([]); /** - * GetIdentityResponseV0 result. - * @member {"identity"|"proof"|undefined} result - * @memberof org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0 + * GetIdentityBalanceRequestV0 prove. + * @member {boolean} prove + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0 * @instance */ - Object.defineProperty(GetIdentityResponseV0.prototype, "result", { - get: $util.oneOfGetter($oneOfFields = ["identity", "proof"]), - set: $util.oneOfSetter($oneOfFields) - }); + GetIdentityBalanceRequestV0.prototype.prove = false; /** - * Creates a new GetIdentityResponseV0 instance using the specified properties. + * Creates a new GetIdentityBalanceRequestV0 instance using the specified properties. * @function create - * @memberof org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentityResponse.IGetIdentityResponseV0=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} GetIdentityResponseV0 instance + * @param {org.dash.platform.dapi.v0.GetIdentityBalanceRequest.IGetIdentityBalanceRequestV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} GetIdentityBalanceRequestV0 instance */ - GetIdentityResponseV0.create = function create(properties) { - return new GetIdentityResponseV0(properties); + GetIdentityBalanceRequestV0.create = function create(properties) { + return new GetIdentityBalanceRequestV0(properties); }; /** - * Encodes the specified GetIdentityResponseV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.verify|verify} messages. + * Encodes the specified GetIdentityBalanceRequestV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.verify|verify} messages. * @function encode - * @memberof org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentityResponse.IGetIdentityResponseV0} message GetIdentityResponseV0 message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetIdentityBalanceRequest.IGetIdentityBalanceRequestV0} message GetIdentityBalanceRequestV0 message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetIdentityResponseV0.encode = function encode(message, writer) { + GetIdentityBalanceRequestV0.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.identity != null && Object.hasOwnProperty.call(message, "identity")) - writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.identity); - if (message.proof != null && Object.hasOwnProperty.call(message, "proof")) - $root.org.dash.platform.dapi.v0.Proof.encode(message.proof, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); - if (message.metadata != null && Object.hasOwnProperty.call(message, "metadata")) - $root.org.dash.platform.dapi.v0.ResponseMetadata.encode(message.metadata, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + if (message.id != null && Object.hasOwnProperty.call(message, "id")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.id); + if (message.prove != null && Object.hasOwnProperty.call(message, "prove")) + writer.uint32(/* id 2, wireType 0 =*/16).bool(message.prove); return writer; }; /** - * Encodes the specified GetIdentityResponseV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.verify|verify} messages. + * Encodes the specified GetIdentityBalanceRequestV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.verify|verify} messages. * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentityResponse.IGetIdentityResponseV0} message GetIdentityResponseV0 message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetIdentityBalanceRequest.IGetIdentityBalanceRequestV0} message GetIdentityBalanceRequestV0 message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetIdentityResponseV0.encodeDelimited = function encodeDelimited(message, writer) { + GetIdentityBalanceRequestV0.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a GetIdentityResponseV0 message from the specified reader or buffer. + * Decodes a GetIdentityBalanceRequestV0 message from the specified reader or buffer. * @function decode - * @memberof org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0 * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} GetIdentityResponseV0 + * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} GetIdentityBalanceRequestV0 * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetIdentityResponseV0.decode = function decode(reader, length) { + GetIdentityBalanceRequestV0.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0(); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { case 1: - message.identity = reader.bytes(); + message.id = reader.bytes(); break; case 2: - message.proof = $root.org.dash.platform.dapi.v0.Proof.decode(reader, reader.uint32()); - break; - case 3: - message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.decode(reader, reader.uint32()); + message.prove = reader.bool(); break; default: reader.skipType(tag & 7); @@ -3584,151 +3653,128 @@ $root.org = (function() { }; /** - * Decodes a GetIdentityResponseV0 message from the specified reader or buffer, length delimited. + * Decodes a GetIdentityBalanceRequestV0 message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0 * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} GetIdentityResponseV0 + * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} GetIdentityBalanceRequestV0 * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetIdentityResponseV0.decodeDelimited = function decodeDelimited(reader) { + GetIdentityBalanceRequestV0.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a GetIdentityResponseV0 message. + * Verifies a GetIdentityBalanceRequestV0 message. * @function verify - * @memberof org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0 * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - GetIdentityResponseV0.verify = function verify(message) { + GetIdentityBalanceRequestV0.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; - var properties = {}; - if (message.identity != null && message.hasOwnProperty("identity")) { - properties.result = 1; - if (!(message.identity && typeof message.identity.length === "number" || $util.isString(message.identity))) - return "identity: buffer expected"; - } - if (message.proof != null && message.hasOwnProperty("proof")) { - if (properties.result === 1) - return "result: multiple values"; - properties.result = 1; - { - var error = $root.org.dash.platform.dapi.v0.Proof.verify(message.proof); - if (error) - return "proof." + error; - } - } - if (message.metadata != null && message.hasOwnProperty("metadata")) { - var error = $root.org.dash.platform.dapi.v0.ResponseMetadata.verify(message.metadata); - if (error) - return "metadata." + error; - } + if (message.id != null && message.hasOwnProperty("id")) + if (!(message.id && typeof message.id.length === "number" || $util.isString(message.id))) + return "id: buffer expected"; + if (message.prove != null && message.hasOwnProperty("prove")) + if (typeof message.prove !== "boolean") + return "prove: boolean expected"; return null; }; /** - * Creates a GetIdentityResponseV0 message from a plain object. Also converts values to their respective internal types. + * Creates a GetIdentityBalanceRequestV0 message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0 * @static * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} GetIdentityResponseV0 + * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} GetIdentityBalanceRequestV0 */ - GetIdentityResponseV0.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0) + GetIdentityBalanceRequestV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0) return object; - var message = new $root.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0(); - if (object.identity != null) - if (typeof object.identity === "string") - $util.base64.decode(object.identity, message.identity = $util.newBuffer($util.base64.length(object.identity)), 0); - else if (object.identity.length >= 0) - message.identity = object.identity; - if (object.proof != null) { - if (typeof object.proof !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.proof: object expected"); - message.proof = $root.org.dash.platform.dapi.v0.Proof.fromObject(object.proof); - } - if (object.metadata != null) { - if (typeof object.metadata !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.metadata: object expected"); - message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.fromObject(object.metadata); - } + var message = new $root.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0(); + if (object.id != null) + if (typeof object.id === "string") + $util.base64.decode(object.id, message.id = $util.newBuffer($util.base64.length(object.id)), 0); + else if (object.id.length >= 0) + message.id = object.id; + if (object.prove != null) + message.prove = Boolean(object.prove); return message; }; /** - * Creates a plain object from a GetIdentityResponseV0 message. Also converts values to other types if specified. + * Creates a plain object from a GetIdentityBalanceRequestV0 message. Also converts values to other types if specified. * @function toObject - * @memberof org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} message GetIdentityResponseV0 + * @param {org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} message GetIdentityBalanceRequestV0 * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - GetIdentityResponseV0.toObject = function toObject(message, options) { + GetIdentityBalanceRequestV0.toObject = function toObject(message, options) { if (!options) options = {}; var object = {}; - if (options.defaults) - object.metadata = null; - if (message.identity != null && message.hasOwnProperty("identity")) { - object.identity = options.bytes === String ? $util.base64.encode(message.identity, 0, message.identity.length) : options.bytes === Array ? Array.prototype.slice.call(message.identity) : message.identity; - if (options.oneofs) - object.result = "identity"; - } - if (message.proof != null && message.hasOwnProperty("proof")) { - object.proof = $root.org.dash.platform.dapi.v0.Proof.toObject(message.proof, options); - if (options.oneofs) - object.result = "proof"; + if (options.defaults) { + if (options.bytes === String) + object.id = ""; + else { + object.id = []; + if (options.bytes !== Array) + object.id = $util.newBuffer(object.id); + } + object.prove = false; } - if (message.metadata != null && message.hasOwnProperty("metadata")) - object.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.toObject(message.metadata, options); + if (message.id != null && message.hasOwnProperty("id")) + object.id = options.bytes === String ? $util.base64.encode(message.id, 0, message.id.length) : options.bytes === Array ? Array.prototype.slice.call(message.id) : message.id; + if (message.prove != null && message.hasOwnProperty("prove")) + object.prove = message.prove; return object; }; /** - * Converts this GetIdentityResponseV0 to JSON. + * Converts this GetIdentityBalanceRequestV0 to JSON. * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0 * @instance * @returns {Object.} JSON object */ - GetIdentityResponseV0.prototype.toJSON = function toJSON() { + GetIdentityBalanceRequestV0.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - return GetIdentityResponseV0; + return GetIdentityBalanceRequestV0; })(); - return GetIdentityResponse; + return GetIdentityBalanceRequest; })(); - v0.GetIdentitiesRequest = (function() { + v0.GetIdentityBalanceAndRevisionRequest = (function() { /** - * Properties of a GetIdentitiesRequest. + * Properties of a GetIdentityBalanceAndRevisionRequest. * @memberof org.dash.platform.dapi.v0 - * @interface IGetIdentitiesRequest - * @property {org.dash.platform.dapi.v0.GetIdentitiesRequest.IGetIdentitiesRequestV0|null} [v0] GetIdentitiesRequest v0 + * @interface IGetIdentityBalanceAndRevisionRequest + * @property {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.IGetIdentityBalanceAndRevisionRequestV0|null} [v0] GetIdentityBalanceAndRevisionRequest v0 */ /** - * Constructs a new GetIdentitiesRequest. + * Constructs a new GetIdentityBalanceAndRevisionRequest. * @memberof org.dash.platform.dapi.v0 - * @classdesc Represents a GetIdentitiesRequest. - * @implements IGetIdentitiesRequest + * @classdesc Represents a GetIdentityBalanceAndRevisionRequest. + * @implements IGetIdentityBalanceAndRevisionRequest * @constructor - * @param {org.dash.platform.dapi.v0.IGetIdentitiesRequest=} [properties] Properties to set + * @param {org.dash.platform.dapi.v0.IGetIdentityBalanceAndRevisionRequest=} [properties] Properties to set */ - function GetIdentitiesRequest(properties) { + function GetIdentityBalanceAndRevisionRequest(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -3736,89 +3782,89 @@ $root.org = (function() { } /** - * GetIdentitiesRequest v0. - * @member {org.dash.platform.dapi.v0.GetIdentitiesRequest.IGetIdentitiesRequestV0|null|undefined} v0 - * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest + * GetIdentityBalanceAndRevisionRequest v0. + * @member {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.IGetIdentityBalanceAndRevisionRequestV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest * @instance */ - GetIdentitiesRequest.prototype.v0 = null; + GetIdentityBalanceAndRevisionRequest.prototype.v0 = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** - * GetIdentitiesRequest version. + * GetIdentityBalanceAndRevisionRequest version. * @member {"v0"|undefined} version - * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest * @instance */ - Object.defineProperty(GetIdentitiesRequest.prototype, "version", { + Object.defineProperty(GetIdentityBalanceAndRevisionRequest.prototype, "version", { get: $util.oneOfGetter($oneOfFields = ["v0"]), set: $util.oneOfSetter($oneOfFields) }); /** - * Creates a new GetIdentitiesRequest instance using the specified properties. + * Creates a new GetIdentityBalanceAndRevisionRequest instance using the specified properties. * @function create - * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest * @static - * @param {org.dash.platform.dapi.v0.IGetIdentitiesRequest=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetIdentitiesRequest} GetIdentitiesRequest instance + * @param {org.dash.platform.dapi.v0.IGetIdentityBalanceAndRevisionRequest=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} GetIdentityBalanceAndRevisionRequest instance */ - GetIdentitiesRequest.create = function create(properties) { - return new GetIdentitiesRequest(properties); + GetIdentityBalanceAndRevisionRequest.create = function create(properties) { + return new GetIdentityBalanceAndRevisionRequest(properties); }; /** - * Encodes the specified GetIdentitiesRequest message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesRequest.verify|verify} messages. + * Encodes the specified GetIdentityBalanceAndRevisionRequest message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.verify|verify} messages. * @function encode - * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest * @static - * @param {org.dash.platform.dapi.v0.IGetIdentitiesRequest} message GetIdentitiesRequest message or plain object to encode + * @param {org.dash.platform.dapi.v0.IGetIdentityBalanceAndRevisionRequest} message GetIdentityBalanceAndRevisionRequest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetIdentitiesRequest.encode = function encode(message, writer) { + GetIdentityBalanceAndRevisionRequest.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) - $root.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); return writer; }; /** - * Encodes the specified GetIdentitiesRequest message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesRequest.verify|verify} messages. + * Encodes the specified GetIdentityBalanceAndRevisionRequest message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.verify|verify} messages. * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest * @static - * @param {org.dash.platform.dapi.v0.IGetIdentitiesRequest} message GetIdentitiesRequest message or plain object to encode + * @param {org.dash.platform.dapi.v0.IGetIdentityBalanceAndRevisionRequest} message GetIdentityBalanceAndRevisionRequest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetIdentitiesRequest.encodeDelimited = function encodeDelimited(message, writer) { + GetIdentityBalanceAndRevisionRequest.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a GetIdentitiesRequest message from the specified reader or buffer. + * Decodes a GetIdentityBalanceAndRevisionRequest message from the specified reader or buffer. * @function decode - * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetIdentitiesRequest} GetIdentitiesRequest + * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} GetIdentityBalanceAndRevisionRequest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetIdentitiesRequest.decode = function decode(reader, length) { + GetIdentityBalanceAndRevisionRequest.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentitiesRequest(); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { case 1: - message.v0 = $root.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.decode(reader, reader.uint32()); + message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.decode(reader, reader.uint32()); break; default: reader.skipType(tag & 7); @@ -3829,37 +3875,37 @@ $root.org = (function() { }; /** - * Decodes a GetIdentitiesRequest message from the specified reader or buffer, length delimited. + * Decodes a GetIdentityBalanceAndRevisionRequest message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetIdentitiesRequest} GetIdentitiesRequest + * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} GetIdentityBalanceAndRevisionRequest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetIdentitiesRequest.decodeDelimited = function decodeDelimited(reader) { + GetIdentityBalanceAndRevisionRequest.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a GetIdentitiesRequest message. + * Verifies a GetIdentityBalanceAndRevisionRequest message. * @function verify - * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - GetIdentitiesRequest.verify = function verify(message) { + GetIdentityBalanceAndRevisionRequest.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; var properties = {}; if (message.v0 != null && message.hasOwnProperty("v0")) { properties.version = 1; { - var error = $root.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.verify(message.v0); + var error = $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.verify(message.v0); if (error) return "v0." + error; } @@ -3868,40 +3914,40 @@ $root.org = (function() { }; /** - * Creates a GetIdentitiesRequest message from a plain object. Also converts values to their respective internal types. + * Creates a GetIdentityBalanceAndRevisionRequest message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest * @static * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetIdentitiesRequest} GetIdentitiesRequest + * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} GetIdentityBalanceAndRevisionRequest */ - GetIdentitiesRequest.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentitiesRequest) + GetIdentityBalanceAndRevisionRequest.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest) return object; - var message = new $root.org.dash.platform.dapi.v0.GetIdentitiesRequest(); + var message = new $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest(); if (object.v0 != null) { if (typeof object.v0 !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesRequest.v0: object expected"); - message.v0 = $root.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.fromObject(object.v0); + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.fromObject(object.v0); } return message; }; /** - * Creates a plain object from a GetIdentitiesRequest message. Also converts values to other types if specified. + * Creates a plain object from a GetIdentityBalanceAndRevisionRequest message. Also converts values to other types if specified. * @function toObject - * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesRequest} message GetIdentitiesRequest + * @param {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} message GetIdentityBalanceAndRevisionRequest * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - GetIdentitiesRequest.toObject = function toObject(message, options) { + GetIdentityBalanceAndRevisionRequest.toObject = function toObject(message, options) { if (!options) options = {}; var object = {}; if (message.v0 != null && message.hasOwnProperty("v0")) { - object.v0 = $root.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.toObject(message.v0, options); + object.v0 = $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.toObject(message.v0, options); if (options.oneofs) object.version = "v0"; } @@ -3909,36 +3955,35 @@ $root.org = (function() { }; /** - * Converts this GetIdentitiesRequest to JSON. + * Converts this GetIdentityBalanceAndRevisionRequest to JSON. * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest * @instance * @returns {Object.} JSON object */ - GetIdentitiesRequest.prototype.toJSON = function toJSON() { + GetIdentityBalanceAndRevisionRequest.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - GetIdentitiesRequest.GetIdentitiesRequestV0 = (function() { + GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0 = (function() { /** - * Properties of a GetIdentitiesRequestV0. - * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest - * @interface IGetIdentitiesRequestV0 - * @property {Array.|null} [ids] GetIdentitiesRequestV0 ids - * @property {boolean|null} [prove] GetIdentitiesRequestV0 prove + * Properties of a GetIdentityBalanceAndRevisionRequestV0. + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest + * @interface IGetIdentityBalanceAndRevisionRequestV0 + * @property {Uint8Array|null} [id] GetIdentityBalanceAndRevisionRequestV0 id + * @property {boolean|null} [prove] GetIdentityBalanceAndRevisionRequestV0 prove */ /** - * Constructs a new GetIdentitiesRequestV0. - * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest - * @classdesc Represents a GetIdentitiesRequestV0. - * @implements IGetIdentitiesRequestV0 + * Constructs a new GetIdentityBalanceAndRevisionRequestV0. + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest + * @classdesc Represents a GetIdentityBalanceAndRevisionRequestV0. + * @implements IGetIdentityBalanceAndRevisionRequestV0 * @constructor - * @param {org.dash.platform.dapi.v0.GetIdentitiesRequest.IGetIdentitiesRequestV0=} [properties] Properties to set + * @param {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.IGetIdentityBalanceAndRevisionRequestV0=} [properties] Properties to set */ - function GetIdentitiesRequestV0(properties) { - this.ids = []; + function GetIdentityBalanceAndRevisionRequestV0(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -3946,88 +3991,85 @@ $root.org = (function() { } /** - * GetIdentitiesRequestV0 ids. - * @member {Array.} ids - * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0 + * GetIdentityBalanceAndRevisionRequestV0 id. + * @member {Uint8Array} id + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0 * @instance */ - GetIdentitiesRequestV0.prototype.ids = $util.emptyArray; + GetIdentityBalanceAndRevisionRequestV0.prototype.id = $util.newBuffer([]); /** - * GetIdentitiesRequestV0 prove. + * GetIdentityBalanceAndRevisionRequestV0 prove. * @member {boolean} prove - * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0 * @instance */ - GetIdentitiesRequestV0.prototype.prove = false; + GetIdentityBalanceAndRevisionRequestV0.prototype.prove = false; /** - * Creates a new GetIdentitiesRequestV0 instance using the specified properties. + * Creates a new GetIdentityBalanceAndRevisionRequestV0 instance using the specified properties. * @function create - * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesRequest.IGetIdentitiesRequestV0=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} GetIdentitiesRequestV0 instance + * @param {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.IGetIdentityBalanceAndRevisionRequestV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} GetIdentityBalanceAndRevisionRequestV0 instance */ - GetIdentitiesRequestV0.create = function create(properties) { - return new GetIdentitiesRequestV0(properties); + GetIdentityBalanceAndRevisionRequestV0.create = function create(properties) { + return new GetIdentityBalanceAndRevisionRequestV0(properties); }; /** - * Encodes the specified GetIdentitiesRequestV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.verify|verify} messages. + * Encodes the specified GetIdentityBalanceAndRevisionRequestV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.verify|verify} messages. * @function encode - * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesRequest.IGetIdentitiesRequestV0} message GetIdentitiesRequestV0 message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.IGetIdentityBalanceAndRevisionRequestV0} message GetIdentityBalanceAndRevisionRequestV0 message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetIdentitiesRequestV0.encode = function encode(message, writer) { + GetIdentityBalanceAndRevisionRequestV0.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.ids != null && message.ids.length) - for (var i = 0; i < message.ids.length; ++i) - writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.ids[i]); + if (message.id != null && Object.hasOwnProperty.call(message, "id")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.id); if (message.prove != null && Object.hasOwnProperty.call(message, "prove")) writer.uint32(/* id 2, wireType 0 =*/16).bool(message.prove); return writer; }; /** - * Encodes the specified GetIdentitiesRequestV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.verify|verify} messages. + * Encodes the specified GetIdentityBalanceAndRevisionRequestV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.verify|verify} messages. * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesRequest.IGetIdentitiesRequestV0} message GetIdentitiesRequestV0 message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.IGetIdentityBalanceAndRevisionRequestV0} message GetIdentityBalanceAndRevisionRequestV0 message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetIdentitiesRequestV0.encodeDelimited = function encodeDelimited(message, writer) { + GetIdentityBalanceAndRevisionRequestV0.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a GetIdentitiesRequestV0 message from the specified reader or buffer. + * Decodes a GetIdentityBalanceAndRevisionRequestV0 message from the specified reader or buffer. * @function decode - * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0 * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} GetIdentitiesRequestV0 + * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} GetIdentityBalanceAndRevisionRequestV0 * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetIdentitiesRequestV0.decode = function decode(reader, length) { + GetIdentityBalanceAndRevisionRequestV0.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0(); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { case 1: - if (!(message.ids && message.ids.length)) - message.ids = []; - message.ids.push(reader.bytes()); + message.id = reader.bytes(); break; case 2: message.prove = reader.bool(); @@ -4041,39 +4083,35 @@ $root.org = (function() { }; /** - * Decodes a GetIdentitiesRequestV0 message from the specified reader or buffer, length delimited. + * Decodes a GetIdentityBalanceAndRevisionRequestV0 message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0 * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} GetIdentitiesRequestV0 + * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} GetIdentityBalanceAndRevisionRequestV0 * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetIdentitiesRequestV0.decodeDelimited = function decodeDelimited(reader) { + GetIdentityBalanceAndRevisionRequestV0.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a GetIdentitiesRequestV0 message. + * Verifies a GetIdentityBalanceAndRevisionRequestV0 message. * @function verify - * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0 * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - GetIdentitiesRequestV0.verify = function verify(message) { + GetIdentityBalanceAndRevisionRequestV0.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; - if (message.ids != null && message.hasOwnProperty("ids")) { - if (!Array.isArray(message.ids)) - return "ids: array expected"; - for (var i = 0; i < message.ids.length; ++i) - if (!(message.ids[i] && typeof message.ids[i].length === "number" || $util.isString(message.ids[i]))) - return "ids: buffer[] expected"; - } + if (message.id != null && message.hasOwnProperty("id")) + if (!(message.id && typeof message.id.length === "number" || $util.isString(message.id))) + return "id: buffer expected"; if (message.prove != null && message.hasOwnProperty("prove")) if (typeof message.prove !== "boolean") return "prove: boolean expected"; @@ -4081,94 +4119,92 @@ $root.org = (function() { }; /** - * Creates a GetIdentitiesRequestV0 message from a plain object. Also converts values to their respective internal types. + * Creates a GetIdentityBalanceAndRevisionRequestV0 message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0 * @static * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} GetIdentitiesRequestV0 + * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} GetIdentityBalanceAndRevisionRequestV0 */ - GetIdentitiesRequestV0.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0) + GetIdentityBalanceAndRevisionRequestV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0) return object; - var message = new $root.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0(); - if (object.ids) { - if (!Array.isArray(object.ids)) - throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.ids: array expected"); - message.ids = []; - for (var i = 0; i < object.ids.length; ++i) - if (typeof object.ids[i] === "string") - $util.base64.decode(object.ids[i], message.ids[i] = $util.newBuffer($util.base64.length(object.ids[i])), 0); - else if (object.ids[i].length >= 0) - message.ids[i] = object.ids[i]; - } + var message = new $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0(); + if (object.id != null) + if (typeof object.id === "string") + $util.base64.decode(object.id, message.id = $util.newBuffer($util.base64.length(object.id)), 0); + else if (object.id.length >= 0) + message.id = object.id; if (object.prove != null) message.prove = Boolean(object.prove); return message; }; /** - * Creates a plain object from a GetIdentitiesRequestV0 message. Also converts values to other types if specified. + * Creates a plain object from a GetIdentityBalanceAndRevisionRequestV0 message. Also converts values to other types if specified. * @function toObject - * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} message GetIdentitiesRequestV0 + * @param {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} message GetIdentityBalanceAndRevisionRequestV0 * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - GetIdentitiesRequestV0.toObject = function toObject(message, options) { + GetIdentityBalanceAndRevisionRequestV0.toObject = function toObject(message, options) { if (!options) options = {}; var object = {}; - if (options.arrays || options.defaults) - object.ids = []; - if (options.defaults) + if (options.defaults) { + if (options.bytes === String) + object.id = ""; + else { + object.id = []; + if (options.bytes !== Array) + object.id = $util.newBuffer(object.id); + } object.prove = false; - if (message.ids && message.ids.length) { - object.ids = []; - for (var j = 0; j < message.ids.length; ++j) - object.ids[j] = options.bytes === String ? $util.base64.encode(message.ids[j], 0, message.ids[j].length) : options.bytes === Array ? Array.prototype.slice.call(message.ids[j]) : message.ids[j]; } + if (message.id != null && message.hasOwnProperty("id")) + object.id = options.bytes === String ? $util.base64.encode(message.id, 0, message.id.length) : options.bytes === Array ? Array.prototype.slice.call(message.id) : message.id; if (message.prove != null && message.hasOwnProperty("prove")) object.prove = message.prove; return object; }; /** - * Converts this GetIdentitiesRequestV0 to JSON. + * Converts this GetIdentityBalanceAndRevisionRequestV0 to JSON. * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0 * @instance * @returns {Object.} JSON object */ - GetIdentitiesRequestV0.prototype.toJSON = function toJSON() { + GetIdentityBalanceAndRevisionRequestV0.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - return GetIdentitiesRequestV0; + return GetIdentityBalanceAndRevisionRequestV0; })(); - return GetIdentitiesRequest; + return GetIdentityBalanceAndRevisionRequest; })(); - v0.GetIdentitiesResponse = (function() { + v0.GetIdentityResponse = (function() { /** - * Properties of a GetIdentitiesResponse. + * Properties of a GetIdentityResponse. * @memberof org.dash.platform.dapi.v0 - * @interface IGetIdentitiesResponse - * @property {org.dash.platform.dapi.v0.GetIdentitiesResponse.IGetIdentitiesResponseV0|null} [v0] GetIdentitiesResponse v0 + * @interface IGetIdentityResponse + * @property {org.dash.platform.dapi.v0.GetIdentityResponse.IGetIdentityResponseV0|null} [v0] GetIdentityResponse v0 */ /** - * Constructs a new GetIdentitiesResponse. + * Constructs a new GetIdentityResponse. * @memberof org.dash.platform.dapi.v0 - * @classdesc Represents a GetIdentitiesResponse. - * @implements IGetIdentitiesResponse - * @constructor - * @param {org.dash.platform.dapi.v0.IGetIdentitiesResponse=} [properties] Properties to set + * @classdesc Represents a GetIdentityResponse. + * @implements IGetIdentityResponse + * @constructor + * @param {org.dash.platform.dapi.v0.IGetIdentityResponse=} [properties] Properties to set */ - function GetIdentitiesResponse(properties) { + function GetIdentityResponse(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -4176,89 +4212,89 @@ $root.org = (function() { } /** - * GetIdentitiesResponse v0. - * @member {org.dash.platform.dapi.v0.GetIdentitiesResponse.IGetIdentitiesResponseV0|null|undefined} v0 - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse + * GetIdentityResponse v0. + * @member {org.dash.platform.dapi.v0.GetIdentityResponse.IGetIdentityResponseV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetIdentityResponse * @instance */ - GetIdentitiesResponse.prototype.v0 = null; + GetIdentityResponse.prototype.v0 = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** - * GetIdentitiesResponse version. + * GetIdentityResponse version. * @member {"v0"|undefined} version - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse + * @memberof org.dash.platform.dapi.v0.GetIdentityResponse * @instance */ - Object.defineProperty(GetIdentitiesResponse.prototype, "version", { + Object.defineProperty(GetIdentityResponse.prototype, "version", { get: $util.oneOfGetter($oneOfFields = ["v0"]), set: $util.oneOfSetter($oneOfFields) }); /** - * Creates a new GetIdentitiesResponse instance using the specified properties. + * Creates a new GetIdentityResponse instance using the specified properties. * @function create - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse + * @memberof org.dash.platform.dapi.v0.GetIdentityResponse * @static - * @param {org.dash.platform.dapi.v0.IGetIdentitiesResponse=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse} GetIdentitiesResponse instance + * @param {org.dash.platform.dapi.v0.IGetIdentityResponse=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentityResponse} GetIdentityResponse instance */ - GetIdentitiesResponse.create = function create(properties) { - return new GetIdentitiesResponse(properties); + GetIdentityResponse.create = function create(properties) { + return new GetIdentityResponse(properties); }; /** - * Encodes the specified GetIdentitiesResponse message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesResponse.verify|verify} messages. + * Encodes the specified GetIdentityResponse message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityResponse.verify|verify} messages. * @function encode - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse + * @memberof org.dash.platform.dapi.v0.GetIdentityResponse * @static - * @param {org.dash.platform.dapi.v0.IGetIdentitiesResponse} message GetIdentitiesResponse message or plain object to encode + * @param {org.dash.platform.dapi.v0.IGetIdentityResponse} message GetIdentityResponse message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetIdentitiesResponse.encode = function encode(message, writer) { + GetIdentityResponse.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) - $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + $root.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); return writer; }; /** - * Encodes the specified GetIdentitiesResponse message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesResponse.verify|verify} messages. + * Encodes the specified GetIdentityResponse message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityResponse.verify|verify} messages. * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse + * @memberof org.dash.platform.dapi.v0.GetIdentityResponse * @static - * @param {org.dash.platform.dapi.v0.IGetIdentitiesResponse} message GetIdentitiesResponse message or plain object to encode + * @param {org.dash.platform.dapi.v0.IGetIdentityResponse} message GetIdentityResponse message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetIdentitiesResponse.encodeDelimited = function encodeDelimited(message, writer) { + GetIdentityResponse.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a GetIdentitiesResponse message from the specified reader or buffer. + * Decodes a GetIdentityResponse message from the specified reader or buffer. * @function decode - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse + * @memberof org.dash.platform.dapi.v0.GetIdentityResponse * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse} GetIdentitiesResponse + * @returns {org.dash.platform.dapi.v0.GetIdentityResponse} GetIdentityResponse * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetIdentitiesResponse.decode = function decode(reader, length) { + GetIdentityResponse.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentitiesResponse(); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityResponse(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { case 1: - message.v0 = $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.decode(reader, reader.uint32()); + message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.decode(reader, reader.uint32()); break; default: reader.skipType(tag & 7); @@ -4269,37 +4305,37 @@ $root.org = (function() { }; /** - * Decodes a GetIdentitiesResponse message from the specified reader or buffer, length delimited. + * Decodes a GetIdentityResponse message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse + * @memberof org.dash.platform.dapi.v0.GetIdentityResponse * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse} GetIdentitiesResponse + * @returns {org.dash.platform.dapi.v0.GetIdentityResponse} GetIdentityResponse * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetIdentitiesResponse.decodeDelimited = function decodeDelimited(reader) { + GetIdentityResponse.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a GetIdentitiesResponse message. + * Verifies a GetIdentityResponse message. * @function verify - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse + * @memberof org.dash.platform.dapi.v0.GetIdentityResponse * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - GetIdentitiesResponse.verify = function verify(message) { + GetIdentityResponse.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; var properties = {}; if (message.v0 != null && message.hasOwnProperty("v0")) { properties.version = 1; { - var error = $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.verify(message.v0); + var error = $root.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.verify(message.v0); if (error) return "v0." + error; } @@ -4308,40 +4344,40 @@ $root.org = (function() { }; /** - * Creates a GetIdentitiesResponse message from a plain object. Also converts values to their respective internal types. + * Creates a GetIdentityResponse message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse + * @memberof org.dash.platform.dapi.v0.GetIdentityResponse * @static * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse} GetIdentitiesResponse + * @returns {org.dash.platform.dapi.v0.GetIdentityResponse} GetIdentityResponse */ - GetIdentitiesResponse.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentitiesResponse) + GetIdentityResponse.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityResponse) return object; - var message = new $root.org.dash.platform.dapi.v0.GetIdentitiesResponse(); + var message = new $root.org.dash.platform.dapi.v0.GetIdentityResponse(); if (object.v0 != null) { if (typeof object.v0 !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesResponse.v0: object expected"); - message.v0 = $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.fromObject(object.v0); + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityResponse.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.fromObject(object.v0); } return message; }; /** - * Creates a plain object from a GetIdentitiesResponse message. Also converts values to other types if specified. + * Creates a plain object from a GetIdentityResponse message. Also converts values to other types if specified. * @function toObject - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse + * @memberof org.dash.platform.dapi.v0.GetIdentityResponse * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse} message GetIdentitiesResponse + * @param {org.dash.platform.dapi.v0.GetIdentityResponse} message GetIdentityResponse * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - GetIdentitiesResponse.toObject = function toObject(message, options) { + GetIdentityResponse.toObject = function toObject(message, options) { if (!options) options = {}; var object = {}; if (message.v0 != null && message.hasOwnProperty("v0")) { - object.v0 = $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.toObject(message.v0, options); + object.v0 = $root.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.toObject(message.v0, options); if (options.oneofs) object.version = "v0"; } @@ -4349,34 +4385,36 @@ $root.org = (function() { }; /** - * Converts this GetIdentitiesResponse to JSON. + * Converts this GetIdentityResponse to JSON. * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse + * @memberof org.dash.platform.dapi.v0.GetIdentityResponse * @instance * @returns {Object.} JSON object */ - GetIdentitiesResponse.prototype.toJSON = function toJSON() { + GetIdentityResponse.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - GetIdentitiesResponse.IdentityValue = (function() { + GetIdentityResponse.GetIdentityResponseV0 = (function() { /** - * Properties of an IdentityValue. - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse - * @interface IIdentityValue - * @property {Uint8Array|null} [value] IdentityValue value + * Properties of a GetIdentityResponseV0. + * @memberof org.dash.platform.dapi.v0.GetIdentityResponse + * @interface IGetIdentityResponseV0 + * @property {Uint8Array|null} [identity] GetIdentityResponseV0 identity + * @property {org.dash.platform.dapi.v0.IProof|null} [proof] GetIdentityResponseV0 proof + * @property {org.dash.platform.dapi.v0.IResponseMetadata|null} [metadata] GetIdentityResponseV0 metadata */ /** - * Constructs a new IdentityValue. - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse - * @classdesc Represents an IdentityValue. - * @implements IIdentityValue + * Constructs a new GetIdentityResponseV0. + * @memberof org.dash.platform.dapi.v0.GetIdentityResponse + * @classdesc Represents a GetIdentityResponseV0. + * @implements IGetIdentityResponseV0 * @constructor - * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IIdentityValue=} [properties] Properties to set + * @param {org.dash.platform.dapi.v0.GetIdentityResponse.IGetIdentityResponseV0=} [properties] Properties to set */ - function IdentityValue(properties) { + function GetIdentityResponseV0(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -4384,75 +4422,115 @@ $root.org = (function() { } /** - * IdentityValue value. - * @member {Uint8Array} value - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue + * GetIdentityResponseV0 identity. + * @member {Uint8Array} identity + * @memberof org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0 * @instance */ - IdentityValue.prototype.value = $util.newBuffer([]); + GetIdentityResponseV0.prototype.identity = $util.newBuffer([]); /** - * Creates a new IdentityValue instance using the specified properties. + * GetIdentityResponseV0 proof. + * @member {org.dash.platform.dapi.v0.IProof|null|undefined} proof + * @memberof org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0 + * @instance + */ + GetIdentityResponseV0.prototype.proof = null; + + /** + * GetIdentityResponseV0 metadata. + * @member {org.dash.platform.dapi.v0.IResponseMetadata|null|undefined} metadata + * @memberof org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0 + * @instance + */ + GetIdentityResponseV0.prototype.metadata = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetIdentityResponseV0 result. + * @member {"identity"|"proof"|undefined} result + * @memberof org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0 + * @instance + */ + Object.defineProperty(GetIdentityResponseV0.prototype, "result", { + get: $util.oneOfGetter($oneOfFields = ["identity", "proof"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetIdentityResponseV0 instance using the specified properties. * @function create - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue + * @memberof org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IIdentityValue=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} IdentityValue instance + * @param {org.dash.platform.dapi.v0.GetIdentityResponse.IGetIdentityResponseV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} GetIdentityResponseV0 instance */ - IdentityValue.create = function create(properties) { - return new IdentityValue(properties); + GetIdentityResponseV0.create = function create(properties) { + return new GetIdentityResponseV0(properties); }; /** - * Encodes the specified IdentityValue message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.verify|verify} messages. + * Encodes the specified GetIdentityResponseV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.verify|verify} messages. * @function encode - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue + * @memberof org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IIdentityValue} message IdentityValue message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetIdentityResponse.IGetIdentityResponseV0} message GetIdentityResponseV0 message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - IdentityValue.encode = function encode(message, writer) { + GetIdentityResponseV0.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.value != null && Object.hasOwnProperty.call(message, "value")) - writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.value); + if (message.identity != null && Object.hasOwnProperty.call(message, "identity")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.identity); + if (message.proof != null && Object.hasOwnProperty.call(message, "proof")) + $root.org.dash.platform.dapi.v0.Proof.encode(message.proof, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.metadata != null && Object.hasOwnProperty.call(message, "metadata")) + $root.org.dash.platform.dapi.v0.ResponseMetadata.encode(message.metadata, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); return writer; }; /** - * Encodes the specified IdentityValue message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.verify|verify} messages. + * Encodes the specified GetIdentityResponseV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.verify|verify} messages. * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue + * @memberof org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IIdentityValue} message IdentityValue message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetIdentityResponse.IGetIdentityResponseV0} message GetIdentityResponseV0 message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - IdentityValue.encodeDelimited = function encodeDelimited(message, writer) { + GetIdentityResponseV0.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes an IdentityValue message from the specified reader or buffer. + * Decodes a GetIdentityResponseV0 message from the specified reader or buffer. * @function decode - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue + * @memberof org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0 * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} IdentityValue + * @returns {org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} GetIdentityResponseV0 * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - IdentityValue.decode = function decode(reader, length) { + GetIdentityResponseV0.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue(); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { case 1: - message.value = reader.bytes(); + message.identity = reader.bytes(); + break; + case 2: + message.proof = $root.org.dash.platform.dapi.v0.Proof.decode(reader, reader.uint32()); + break; + case 3: + message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.decode(reader, reader.uint32()); break; default: reader.skipType(tag & 7); @@ -4463,117 +4541,1429 @@ $root.org = (function() { }; /** - * Decodes an IdentityValue message from the specified reader or buffer, length delimited. + * Decodes a GetIdentityResponseV0 message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue + * @memberof org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0 * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} IdentityValue + * @returns {org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} GetIdentityResponseV0 * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - IdentityValue.decodeDelimited = function decodeDelimited(reader) { + GetIdentityResponseV0.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies an IdentityValue message. + * Verifies a GetIdentityResponseV0 message. * @function verify - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue + * @memberof org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0 * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - IdentityValue.verify = function verify(message) { + GetIdentityResponseV0.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; - if (message.value != null && message.hasOwnProperty("value")) - if (!(message.value && typeof message.value.length === "number" || $util.isString(message.value))) - return "value: buffer expected"; - return null; - }; - - /** - * Creates an IdentityValue message from a plain object. Also converts values to their respective internal types. - * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue - * @static - * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} IdentityValue - */ - IdentityValue.fromObject = function fromObject(object) { + var properties = {}; + if (message.identity != null && message.hasOwnProperty("identity")) { + properties.result = 1; + if (!(message.identity && typeof message.identity.length === "number" || $util.isString(message.identity))) + return "identity: buffer expected"; + } + if (message.proof != null && message.hasOwnProperty("proof")) { + if (properties.result === 1) + return "result: multiple values"; + properties.result = 1; + { + var error = $root.org.dash.platform.dapi.v0.Proof.verify(message.proof); + if (error) + return "proof." + error; + } + } + if (message.metadata != null && message.hasOwnProperty("metadata")) { + var error = $root.org.dash.platform.dapi.v0.ResponseMetadata.verify(message.metadata); + if (error) + return "metadata." + error; + } + return null; + }; + + /** + * Creates a GetIdentityResponseV0 message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0 + * @static + * @param {Object.} object Plain object + * @returns {org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} GetIdentityResponseV0 + */ + GetIdentityResponseV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0(); + if (object.identity != null) + if (typeof object.identity === "string") + $util.base64.decode(object.identity, message.identity = $util.newBuffer($util.base64.length(object.identity)), 0); + else if (object.identity.length >= 0) + message.identity = object.identity; + if (object.proof != null) { + if (typeof object.proof !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.proof: object expected"); + message.proof = $root.org.dash.platform.dapi.v0.Proof.fromObject(object.proof); + } + if (object.metadata != null) { + if (typeof object.metadata !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.metadata: object expected"); + message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.fromObject(object.metadata); + } + return message; + }; + + /** + * Creates a plain object from a GetIdentityResponseV0 message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} message GetIdentityResponseV0 + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + GetIdentityResponseV0.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.metadata = null; + if (message.identity != null && message.hasOwnProperty("identity")) { + object.identity = options.bytes === String ? $util.base64.encode(message.identity, 0, message.identity.length) : options.bytes === Array ? Array.prototype.slice.call(message.identity) : message.identity; + if (options.oneofs) + object.result = "identity"; + } + if (message.proof != null && message.hasOwnProperty("proof")) { + object.proof = $root.org.dash.platform.dapi.v0.Proof.toObject(message.proof, options); + if (options.oneofs) + object.result = "proof"; + } + if (message.metadata != null && message.hasOwnProperty("metadata")) + object.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.toObject(message.metadata, options); + return object; + }; + + /** + * Converts this GetIdentityResponseV0 to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0 + * @instance + * @returns {Object.} JSON object + */ + GetIdentityResponseV0.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return GetIdentityResponseV0; + })(); + + return GetIdentityResponse; + })(); + + v0.GetIdentitiesRequest = (function() { + + /** + * Properties of a GetIdentitiesRequest. + * @memberof org.dash.platform.dapi.v0 + * @interface IGetIdentitiesRequest + * @property {org.dash.platform.dapi.v0.GetIdentitiesRequest.IGetIdentitiesRequestV0|null} [v0] GetIdentitiesRequest v0 + */ + + /** + * Constructs a new GetIdentitiesRequest. + * @memberof org.dash.platform.dapi.v0 + * @classdesc Represents a GetIdentitiesRequest. + * @implements IGetIdentitiesRequest + * @constructor + * @param {org.dash.platform.dapi.v0.IGetIdentitiesRequest=} [properties] Properties to set + */ + function GetIdentitiesRequest(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetIdentitiesRequest v0. + * @member {org.dash.platform.dapi.v0.GetIdentitiesRequest.IGetIdentitiesRequestV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest + * @instance + */ + GetIdentitiesRequest.prototype.v0 = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetIdentitiesRequest version. + * @member {"v0"|undefined} version + * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest + * @instance + */ + Object.defineProperty(GetIdentitiesRequest.prototype, "version", { + get: $util.oneOfGetter($oneOfFields = ["v0"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetIdentitiesRequest instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetIdentitiesRequest=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentitiesRequest} GetIdentitiesRequest instance + */ + GetIdentitiesRequest.create = function create(properties) { + return new GetIdentitiesRequest(properties); + }; + + /** + * Encodes the specified GetIdentitiesRequest message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesRequest.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetIdentitiesRequest} message GetIdentitiesRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentitiesRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) + $root.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetIdentitiesRequest message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetIdentitiesRequest} message GetIdentitiesRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentitiesRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetIdentitiesRequest message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetIdentitiesRequest} GetIdentitiesRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetIdentitiesRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentitiesRequest(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.v0 = $root.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetIdentitiesRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetIdentitiesRequest} GetIdentitiesRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetIdentitiesRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetIdentitiesRequest message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetIdentitiesRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + properties.version = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.verify(message.v0); + if (error) + return "v0." + error; + } + } + return null; + }; + + /** + * Creates a GetIdentitiesRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest + * @static + * @param {Object.} object Plain object + * @returns {org.dash.platform.dapi.v0.GetIdentitiesRequest} GetIdentitiesRequest + */ + GetIdentitiesRequest.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentitiesRequest) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetIdentitiesRequest(); + if (object.v0 != null) { + if (typeof object.v0 !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesRequest.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.fromObject(object.v0); + } + return message; + }; + + /** + * Creates a plain object from a GetIdentitiesRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesRequest} message GetIdentitiesRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + GetIdentitiesRequest.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + object.v0 = $root.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.toObject(message.v0, options); + if (options.oneofs) + object.version = "v0"; + } + return object; + }; + + /** + * Converts this GetIdentitiesRequest to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest + * @instance + * @returns {Object.} JSON object + */ + GetIdentitiesRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + GetIdentitiesRequest.GetIdentitiesRequestV0 = (function() { + + /** + * Properties of a GetIdentitiesRequestV0. + * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest + * @interface IGetIdentitiesRequestV0 + * @property {Array.|null} [ids] GetIdentitiesRequestV0 ids + * @property {boolean|null} [prove] GetIdentitiesRequestV0 prove + */ + + /** + * Constructs a new GetIdentitiesRequestV0. + * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest + * @classdesc Represents a GetIdentitiesRequestV0. + * @implements IGetIdentitiesRequestV0 + * @constructor + * @param {org.dash.platform.dapi.v0.GetIdentitiesRequest.IGetIdentitiesRequestV0=} [properties] Properties to set + */ + function GetIdentitiesRequestV0(properties) { + this.ids = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetIdentitiesRequestV0 ids. + * @member {Array.} ids + * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0 + * @instance + */ + GetIdentitiesRequestV0.prototype.ids = $util.emptyArray; + + /** + * GetIdentitiesRequestV0 prove. + * @member {boolean} prove + * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0 + * @instance + */ + GetIdentitiesRequestV0.prototype.prove = false; + + /** + * Creates a new GetIdentitiesRequestV0 instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesRequest.IGetIdentitiesRequestV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} GetIdentitiesRequestV0 instance + */ + GetIdentitiesRequestV0.create = function create(properties) { + return new GetIdentitiesRequestV0(properties); + }; + + /** + * Encodes the specified GetIdentitiesRequestV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesRequest.IGetIdentitiesRequestV0} message GetIdentitiesRequestV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentitiesRequestV0.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.ids != null && message.ids.length) + for (var i = 0; i < message.ids.length; ++i) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.ids[i]); + if (message.prove != null && Object.hasOwnProperty.call(message, "prove")) + writer.uint32(/* id 2, wireType 0 =*/16).bool(message.prove); + return writer; + }; + + /** + * Encodes the specified GetIdentitiesRequestV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesRequest.IGetIdentitiesRequestV0} message GetIdentitiesRequestV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentitiesRequestV0.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetIdentitiesRequestV0 message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} GetIdentitiesRequestV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetIdentitiesRequestV0.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (!(message.ids && message.ids.length)) + message.ids = []; + message.ids.push(reader.bytes()); + break; + case 2: + message.prove = reader.bool(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetIdentitiesRequestV0 message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} GetIdentitiesRequestV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetIdentitiesRequestV0.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetIdentitiesRequestV0 message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0 + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetIdentitiesRequestV0.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.ids != null && message.hasOwnProperty("ids")) { + if (!Array.isArray(message.ids)) + return "ids: array expected"; + for (var i = 0; i < message.ids.length; ++i) + if (!(message.ids[i] && typeof message.ids[i].length === "number" || $util.isString(message.ids[i]))) + return "ids: buffer[] expected"; + } + if (message.prove != null && message.hasOwnProperty("prove")) + if (typeof message.prove !== "boolean") + return "prove: boolean expected"; + return null; + }; + + /** + * Creates a GetIdentitiesRequestV0 message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0 + * @static + * @param {Object.} object Plain object + * @returns {org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} GetIdentitiesRequestV0 + */ + GetIdentitiesRequestV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0(); + if (object.ids) { + if (!Array.isArray(object.ids)) + throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.ids: array expected"); + message.ids = []; + for (var i = 0; i < object.ids.length; ++i) + if (typeof object.ids[i] === "string") + $util.base64.decode(object.ids[i], message.ids[i] = $util.newBuffer($util.base64.length(object.ids[i])), 0); + else if (object.ids[i].length >= 0) + message.ids[i] = object.ids[i]; + } + if (object.prove != null) + message.prove = Boolean(object.prove); + return message; + }; + + /** + * Creates a plain object from a GetIdentitiesRequestV0 message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} message GetIdentitiesRequestV0 + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + GetIdentitiesRequestV0.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.ids = []; + if (options.defaults) + object.prove = false; + if (message.ids && message.ids.length) { + object.ids = []; + for (var j = 0; j < message.ids.length; ++j) + object.ids[j] = options.bytes === String ? $util.base64.encode(message.ids[j], 0, message.ids[j].length) : options.bytes === Array ? Array.prototype.slice.call(message.ids[j]) : message.ids[j]; + } + if (message.prove != null && message.hasOwnProperty("prove")) + object.prove = message.prove; + return object; + }; + + /** + * Converts this GetIdentitiesRequestV0 to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0 + * @instance + * @returns {Object.} JSON object + */ + GetIdentitiesRequestV0.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return GetIdentitiesRequestV0; + })(); + + return GetIdentitiesRequest; + })(); + + v0.GetIdentitiesResponse = (function() { + + /** + * Properties of a GetIdentitiesResponse. + * @memberof org.dash.platform.dapi.v0 + * @interface IGetIdentitiesResponse + * @property {org.dash.platform.dapi.v0.GetIdentitiesResponse.IGetIdentitiesResponseV0|null} [v0] GetIdentitiesResponse v0 + */ + + /** + * Constructs a new GetIdentitiesResponse. + * @memberof org.dash.platform.dapi.v0 + * @classdesc Represents a GetIdentitiesResponse. + * @implements IGetIdentitiesResponse + * @constructor + * @param {org.dash.platform.dapi.v0.IGetIdentitiesResponse=} [properties] Properties to set + */ + function GetIdentitiesResponse(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetIdentitiesResponse v0. + * @member {org.dash.platform.dapi.v0.GetIdentitiesResponse.IGetIdentitiesResponseV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse + * @instance + */ + GetIdentitiesResponse.prototype.v0 = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetIdentitiesResponse version. + * @member {"v0"|undefined} version + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse + * @instance + */ + Object.defineProperty(GetIdentitiesResponse.prototype, "version", { + get: $util.oneOfGetter($oneOfFields = ["v0"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetIdentitiesResponse instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetIdentitiesResponse=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse} GetIdentitiesResponse instance + */ + GetIdentitiesResponse.create = function create(properties) { + return new GetIdentitiesResponse(properties); + }; + + /** + * Encodes the specified GetIdentitiesResponse message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesResponse.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetIdentitiesResponse} message GetIdentitiesResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentitiesResponse.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) + $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetIdentitiesResponse message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesResponse.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetIdentitiesResponse} message GetIdentitiesResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentitiesResponse.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetIdentitiesResponse message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse} GetIdentitiesResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetIdentitiesResponse.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentitiesResponse(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.v0 = $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetIdentitiesResponse message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse} GetIdentitiesResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetIdentitiesResponse.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetIdentitiesResponse message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetIdentitiesResponse.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + properties.version = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.verify(message.v0); + if (error) + return "v0." + error; + } + } + return null; + }; + + /** + * Creates a GetIdentitiesResponse message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse + * @static + * @param {Object.} object Plain object + * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse} GetIdentitiesResponse + */ + GetIdentitiesResponse.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentitiesResponse) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetIdentitiesResponse(); + if (object.v0 != null) { + if (typeof object.v0 !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesResponse.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.fromObject(object.v0); + } + return message; + }; + + /** + * Creates a plain object from a GetIdentitiesResponse message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse} message GetIdentitiesResponse + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + GetIdentitiesResponse.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + object.v0 = $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.toObject(message.v0, options); + if (options.oneofs) + object.version = "v0"; + } + return object; + }; + + /** + * Converts this GetIdentitiesResponse to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse + * @instance + * @returns {Object.} JSON object + */ + GetIdentitiesResponse.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + GetIdentitiesResponse.IdentityValue = (function() { + + /** + * Properties of an IdentityValue. + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse + * @interface IIdentityValue + * @property {Uint8Array|null} [value] IdentityValue value + */ + + /** + * Constructs a new IdentityValue. + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse + * @classdesc Represents an IdentityValue. + * @implements IIdentityValue + * @constructor + * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IIdentityValue=} [properties] Properties to set + */ + function IdentityValue(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * IdentityValue value. + * @member {Uint8Array} value + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue + * @instance + */ + IdentityValue.prototype.value = $util.newBuffer([]); + + /** + * Creates a new IdentityValue instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IIdentityValue=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} IdentityValue instance + */ + IdentityValue.create = function create(properties) { + return new IdentityValue(properties); + }; + + /** + * Encodes the specified IdentityValue message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IIdentityValue} message IdentityValue message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + IdentityValue.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.value != null && Object.hasOwnProperty.call(message, "value")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.value); + return writer; + }; + + /** + * Encodes the specified IdentityValue message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IIdentityValue} message IdentityValue message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + IdentityValue.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an IdentityValue message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} IdentityValue + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + IdentityValue.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.value = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an IdentityValue message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} IdentityValue + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + IdentityValue.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an IdentityValue message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + IdentityValue.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.value != null && message.hasOwnProperty("value")) + if (!(message.value && typeof message.value.length === "number" || $util.isString(message.value))) + return "value: buffer expected"; + return null; + }; + + /** + * Creates an IdentityValue message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue + * @static + * @param {Object.} object Plain object + * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} IdentityValue + */ + IdentityValue.fromObject = function fromObject(object) { if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue) return object; - var message = new $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue(); - if (object.value != null) - if (typeof object.value === "string") - $util.base64.decode(object.value, message.value = $util.newBuffer($util.base64.length(object.value)), 0); - else if (object.value.length >= 0) - message.value = object.value; + var message = new $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue(); + if (object.value != null) + if (typeof object.value === "string") + $util.base64.decode(object.value, message.value = $util.newBuffer($util.base64.length(object.value)), 0); + else if (object.value.length >= 0) + message.value = object.value; + return message; + }; + + /** + * Creates a plain object from an IdentityValue message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} message IdentityValue + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + IdentityValue.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + if (options.bytes === String) + object.value = ""; + else { + object.value = []; + if (options.bytes !== Array) + object.value = $util.newBuffer(object.value); + } + if (message.value != null && message.hasOwnProperty("value")) + object.value = options.bytes === String ? $util.base64.encode(message.value, 0, message.value.length) : options.bytes === Array ? Array.prototype.slice.call(message.value) : message.value; + return object; + }; + + /** + * Converts this IdentityValue to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue + * @instance + * @returns {Object.} JSON object + */ + IdentityValue.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return IdentityValue; + })(); + + GetIdentitiesResponse.IdentityEntry = (function() { + + /** + * Properties of an IdentityEntry. + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse + * @interface IIdentityEntry + * @property {Uint8Array|null} [key] IdentityEntry key + * @property {org.dash.platform.dapi.v0.GetIdentitiesResponse.IIdentityValue|null} [value] IdentityEntry value + */ + + /** + * Constructs a new IdentityEntry. + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse + * @classdesc Represents an IdentityEntry. + * @implements IIdentityEntry + * @constructor + * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IIdentityEntry=} [properties] Properties to set + */ + function IdentityEntry(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * IdentityEntry key. + * @member {Uint8Array} key + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry + * @instance + */ + IdentityEntry.prototype.key = $util.newBuffer([]); + + /** + * IdentityEntry value. + * @member {org.dash.platform.dapi.v0.GetIdentitiesResponse.IIdentityValue|null|undefined} value + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry + * @instance + */ + IdentityEntry.prototype.value = null; + + /** + * Creates a new IdentityEntry instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IIdentityEntry=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} IdentityEntry instance + */ + IdentityEntry.create = function create(properties) { + return new IdentityEntry(properties); + }; + + /** + * Encodes the specified IdentityEntry message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IIdentityEntry} message IdentityEntry message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + IdentityEntry.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.key != null && Object.hasOwnProperty.call(message, "key")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.key); + if (message.value != null && Object.hasOwnProperty.call(message, "value")) + $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.encode(message.value, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified IdentityEntry message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IIdentityEntry} message IdentityEntry message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + IdentityEntry.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an IdentityEntry message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} IdentityEntry + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + IdentityEntry.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.key = reader.bytes(); + break; + case 2: + message.value = $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an IdentityEntry message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} IdentityEntry + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + IdentityEntry.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an IdentityEntry message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + IdentityEntry.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.key != null && message.hasOwnProperty("key")) + if (!(message.key && typeof message.key.length === "number" || $util.isString(message.key))) + return "key: buffer expected"; + if (message.value != null && message.hasOwnProperty("value")) { + var error = $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.verify(message.value); + if (error) + return "value." + error; + } + return null; + }; + + /** + * Creates an IdentityEntry message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry + * @static + * @param {Object.} object Plain object + * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} IdentityEntry + */ + IdentityEntry.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry(); + if (object.key != null) + if (typeof object.key === "string") + $util.base64.decode(object.key, message.key = $util.newBuffer($util.base64.length(object.key)), 0); + else if (object.key.length >= 0) + message.key = object.key; + if (object.value != null) { + if (typeof object.value !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.value: object expected"); + message.value = $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.fromObject(object.value); + } + return message; + }; + + /** + * Creates a plain object from an IdentityEntry message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} message IdentityEntry + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + IdentityEntry.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if (options.bytes === String) + object.key = ""; + else { + object.key = []; + if (options.bytes !== Array) + object.key = $util.newBuffer(object.key); + } + object.value = null; + } + if (message.key != null && message.hasOwnProperty("key")) + object.key = options.bytes === String ? $util.base64.encode(message.key, 0, message.key.length) : options.bytes === Array ? Array.prototype.slice.call(message.key) : message.key; + if (message.value != null && message.hasOwnProperty("value")) + object.value = $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.toObject(message.value, options); + return object; + }; + + /** + * Converts this IdentityEntry to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry + * @instance + * @returns {Object.} JSON object + */ + IdentityEntry.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return IdentityEntry; + })(); + + GetIdentitiesResponse.Identities = (function() { + + /** + * Properties of an Identities. + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse + * @interface IIdentities + * @property {Array.|null} [identityEntries] Identities identityEntries + */ + + /** + * Constructs a new Identities. + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse + * @classdesc Represents an Identities. + * @implements IIdentities + * @constructor + * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IIdentities=} [properties] Properties to set + */ + function Identities(properties) { + this.identityEntries = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Identities identityEntries. + * @member {Array.} identityEntries + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities + * @instance + */ + Identities.prototype.identityEntries = $util.emptyArray; + + /** + * Creates a new Identities instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IIdentities=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} Identities instance + */ + Identities.create = function create(properties) { + return new Identities(properties); + }; + + /** + * Encodes the specified Identities message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IIdentities} message Identities message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Identities.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.identityEntries != null && message.identityEntries.length) + for (var i = 0; i < message.identityEntries.length; ++i) + $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.encode(message.identityEntries[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified Identities message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IIdentities} message Identities message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Identities.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an Identities message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} Identities + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Identities.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (!(message.identityEntries && message.identityEntries.length)) + message.identityEntries = []; + message.identityEntries.push($root.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.decode(reader, reader.uint32())); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an Identities message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} Identities + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Identities.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an Identities message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + Identities.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.identityEntries != null && message.hasOwnProperty("identityEntries")) { + if (!Array.isArray(message.identityEntries)) + return "identityEntries: array expected"; + for (var i = 0; i < message.identityEntries.length; ++i) { + var error = $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.verify(message.identityEntries[i]); + if (error) + return "identityEntries." + error; + } + } + return null; + }; + + /** + * Creates an Identities message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities + * @static + * @param {Object.} object Plain object + * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} Identities + */ + Identities.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities(); + if (object.identityEntries) { + if (!Array.isArray(object.identityEntries)) + throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.identityEntries: array expected"); + message.identityEntries = []; + for (var i = 0; i < object.identityEntries.length; ++i) { + if (typeof object.identityEntries[i] !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.identityEntries: object expected"); + message.identityEntries[i] = $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.fromObject(object.identityEntries[i]); + } + } return message; }; /** - * Creates a plain object from an IdentityValue message. Also converts values to other types if specified. + * Creates a plain object from an Identities message. Also converts values to other types if specified. * @function toObject - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} message IdentityValue + * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} message Identities * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - IdentityValue.toObject = function toObject(message, options) { + Identities.toObject = function toObject(message, options) { if (!options) options = {}; var object = {}; - if (options.defaults) - if (options.bytes === String) - object.value = ""; - else { - object.value = []; - if (options.bytes !== Array) - object.value = $util.newBuffer(object.value); - } - if (message.value != null && message.hasOwnProperty("value")) - object.value = options.bytes === String ? $util.base64.encode(message.value, 0, message.value.length) : options.bytes === Array ? Array.prototype.slice.call(message.value) : message.value; + if (options.arrays || options.defaults) + object.identityEntries = []; + if (message.identityEntries && message.identityEntries.length) { + object.identityEntries = []; + for (var j = 0; j < message.identityEntries.length; ++j) + object.identityEntries[j] = $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.toObject(message.identityEntries[j], options); + } return object; }; /** - * Converts this IdentityValue to JSON. + * Converts this Identities to JSON. * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities * @instance * @returns {Object.} JSON object */ - IdentityValue.prototype.toJSON = function toJSON() { + Identities.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - return IdentityValue; + return Identities; })(); - GetIdentitiesResponse.IdentityEntry = (function() { + GetIdentitiesResponse.GetIdentitiesResponseV0 = (function() { /** - * Properties of an IdentityEntry. + * Properties of a GetIdentitiesResponseV0. * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse - * @interface IIdentityEntry - * @property {Uint8Array|null} [key] IdentityEntry key - * @property {org.dash.platform.dapi.v0.GetIdentitiesResponse.IIdentityValue|null} [value] IdentityEntry value + * @interface IGetIdentitiesResponseV0 + * @property {org.dash.platform.dapi.v0.GetIdentitiesResponse.IIdentities|null} [identities] GetIdentitiesResponseV0 identities + * @property {org.dash.platform.dapi.v0.IProof|null} [proof] GetIdentitiesResponseV0 proof + * @property {org.dash.platform.dapi.v0.IResponseMetadata|null} [metadata] GetIdentitiesResponseV0 metadata */ /** - * Constructs a new IdentityEntry. + * Constructs a new GetIdentitiesResponseV0. * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse - * @classdesc Represents an IdentityEntry. - * @implements IIdentityEntry + * @classdesc Represents a GetIdentitiesResponseV0. + * @implements IGetIdentitiesResponseV0 * @constructor - * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IIdentityEntry=} [properties] Properties to set + * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IGetIdentitiesResponseV0=} [properties] Properties to set */ - function IdentityEntry(properties) { + function GetIdentitiesResponseV0(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -4581,88 +5971,115 @@ $root.org = (function() { } /** - * IdentityEntry key. - * @member {Uint8Array} key - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry + * GetIdentitiesResponseV0 identities. + * @member {org.dash.platform.dapi.v0.GetIdentitiesResponse.IIdentities|null|undefined} identities + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0 * @instance */ - IdentityEntry.prototype.key = $util.newBuffer([]); + GetIdentitiesResponseV0.prototype.identities = null; + + /** + * GetIdentitiesResponseV0 proof. + * @member {org.dash.platform.dapi.v0.IProof|null|undefined} proof + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0 + * @instance + */ + GetIdentitiesResponseV0.prototype.proof = null; + + /** + * GetIdentitiesResponseV0 metadata. + * @member {org.dash.platform.dapi.v0.IResponseMetadata|null|undefined} metadata + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0 + * @instance + */ + GetIdentitiesResponseV0.prototype.metadata = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; /** - * IdentityEntry value. - * @member {org.dash.platform.dapi.v0.GetIdentitiesResponse.IIdentityValue|null|undefined} value - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry + * GetIdentitiesResponseV0 result. + * @member {"identities"|"proof"|undefined} result + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0 * @instance */ - IdentityEntry.prototype.value = null; + Object.defineProperty(GetIdentitiesResponseV0.prototype, "result", { + get: $util.oneOfGetter($oneOfFields = ["identities", "proof"]), + set: $util.oneOfSetter($oneOfFields) + }); /** - * Creates a new IdentityEntry instance using the specified properties. + * Creates a new GetIdentitiesResponseV0 instance using the specified properties. * @function create - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IIdentityEntry=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} IdentityEntry instance + * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IGetIdentitiesResponseV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} GetIdentitiesResponseV0 instance */ - IdentityEntry.create = function create(properties) { - return new IdentityEntry(properties); + GetIdentitiesResponseV0.create = function create(properties) { + return new GetIdentitiesResponseV0(properties); }; /** - * Encodes the specified IdentityEntry message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.verify|verify} messages. + * Encodes the specified GetIdentitiesResponseV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.verify|verify} messages. * @function encode - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IIdentityEntry} message IdentityEntry message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IGetIdentitiesResponseV0} message GetIdentitiesResponseV0 message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - IdentityEntry.encode = function encode(message, writer) { + GetIdentitiesResponseV0.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.key != null && Object.hasOwnProperty.call(message, "key")) - writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.key); - if (message.value != null && Object.hasOwnProperty.call(message, "value")) - $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.encode(message.value, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.identities != null && Object.hasOwnProperty.call(message, "identities")) + $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.encode(message.identities, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.proof != null && Object.hasOwnProperty.call(message, "proof")) + $root.org.dash.platform.dapi.v0.Proof.encode(message.proof, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.metadata != null && Object.hasOwnProperty.call(message, "metadata")) + $root.org.dash.platform.dapi.v0.ResponseMetadata.encode(message.metadata, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); return writer; }; /** - * Encodes the specified IdentityEntry message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.verify|verify} messages. + * Encodes the specified GetIdentitiesResponseV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.verify|verify} messages. * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IIdentityEntry} message IdentityEntry message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IGetIdentitiesResponseV0} message GetIdentitiesResponseV0 message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - IdentityEntry.encodeDelimited = function encodeDelimited(message, writer) { + GetIdentitiesResponseV0.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes an IdentityEntry message from the specified reader or buffer. + * Decodes a GetIdentitiesResponseV0 message from the specified reader or buffer. * @function decode - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0 * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} IdentityEntry + * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} GetIdentitiesResponseV0 * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - IdentityEntry.decode = function decode(reader, length) { + GetIdentitiesResponseV0.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry(); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { case 1: - message.key = reader.bytes(); + message.identities = $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.decode(reader, reader.uint32()); break; case 2: - message.value = $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.decode(reader, reader.uint32()); + message.proof = $root.org.dash.platform.dapi.v0.Proof.decode(reader, reader.uint32()); + break; + case 3: + message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.decode(reader, reader.uint32()); break; default: reader.skipType(tag & 7); @@ -4673,131 +6090,364 @@ $root.org = (function() { }; /** - * Decodes an IdentityEntry message from the specified reader or buffer, length delimited. + * Decodes a GetIdentitiesResponseV0 message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0 * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} IdentityEntry + * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} GetIdentitiesResponseV0 * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - IdentityEntry.decodeDelimited = function decodeDelimited(reader) { + GetIdentitiesResponseV0.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies an IdentityEntry message. + * Verifies a GetIdentitiesResponseV0 message. * @function verify - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0 * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - IdentityEntry.verify = function verify(message) { + GetIdentitiesResponseV0.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; - if (message.key != null && message.hasOwnProperty("key")) - if (!(message.key && typeof message.key.length === "number" || $util.isString(message.key))) - return "key: buffer expected"; - if (message.value != null && message.hasOwnProperty("value")) { - var error = $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.verify(message.value); + var properties = {}; + if (message.identities != null && message.hasOwnProperty("identities")) { + properties.result = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.verify(message.identities); + if (error) + return "identities." + error; + } + } + if (message.proof != null && message.hasOwnProperty("proof")) { + if (properties.result === 1) + return "result: multiple values"; + properties.result = 1; + { + var error = $root.org.dash.platform.dapi.v0.Proof.verify(message.proof); + if (error) + return "proof." + error; + } + } + if (message.metadata != null && message.hasOwnProperty("metadata")) { + var error = $root.org.dash.platform.dapi.v0.ResponseMetadata.verify(message.metadata); if (error) - return "value." + error; + return "metadata." + error; } return null; }; /** - * Creates an IdentityEntry message from a plain object. Also converts values to their respective internal types. + * Creates a GetIdentitiesResponseV0 message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0 * @static * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} IdentityEntry + * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} GetIdentitiesResponseV0 */ - IdentityEntry.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry) + GetIdentitiesResponseV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0) return object; - var message = new $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry(); - if (object.key != null) - if (typeof object.key === "string") - $util.base64.decode(object.key, message.key = $util.newBuffer($util.base64.length(object.key)), 0); - else if (object.key.length >= 0) - message.key = object.key; - if (object.value != null) { - if (typeof object.value !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.value: object expected"); - message.value = $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.fromObject(object.value); + var message = new $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0(); + if (object.identities != null) { + if (typeof object.identities !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.identities: object expected"); + message.identities = $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.fromObject(object.identities); + } + if (object.proof != null) { + if (typeof object.proof !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.proof: object expected"); + message.proof = $root.org.dash.platform.dapi.v0.Proof.fromObject(object.proof); + } + if (object.metadata != null) { + if (typeof object.metadata !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.metadata: object expected"); + message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.fromObject(object.metadata); + } + return message; + }; + + /** + * Creates a plain object from a GetIdentitiesResponseV0 message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} message GetIdentitiesResponseV0 + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + GetIdentitiesResponseV0.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.metadata = null; + if (message.identities != null && message.hasOwnProperty("identities")) { + object.identities = $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.toObject(message.identities, options); + if (options.oneofs) + object.result = "identities"; + } + if (message.proof != null && message.hasOwnProperty("proof")) { + object.proof = $root.org.dash.platform.dapi.v0.Proof.toObject(message.proof, options); + if (options.oneofs) + object.result = "proof"; + } + if (message.metadata != null && message.hasOwnProperty("metadata")) + object.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.toObject(message.metadata, options); + return object; + }; + + /** + * Converts this GetIdentitiesResponseV0 to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0 + * @instance + * @returns {Object.} JSON object + */ + GetIdentitiesResponseV0.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return GetIdentitiesResponseV0; + })(); + + return GetIdentitiesResponse; + })(); + + v0.GetIdentityNonceResponse = (function() { + + /** + * Properties of a GetIdentityNonceResponse. + * @memberof org.dash.platform.dapi.v0 + * @interface IGetIdentityNonceResponse + * @property {org.dash.platform.dapi.v0.GetIdentityNonceResponse.IGetIdentityNonceResponseV0|null} [v0] GetIdentityNonceResponse v0 + */ + + /** + * Constructs a new GetIdentityNonceResponse. + * @memberof org.dash.platform.dapi.v0 + * @classdesc Represents a GetIdentityNonceResponse. + * @implements IGetIdentityNonceResponse + * @constructor + * @param {org.dash.platform.dapi.v0.IGetIdentityNonceResponse=} [properties] Properties to set + */ + function GetIdentityNonceResponse(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetIdentityNonceResponse v0. + * @member {org.dash.platform.dapi.v0.GetIdentityNonceResponse.IGetIdentityNonceResponseV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse + * @instance + */ + GetIdentityNonceResponse.prototype.v0 = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetIdentityNonceResponse version. + * @member {"v0"|undefined} version + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse + * @instance + */ + Object.defineProperty(GetIdentityNonceResponse.prototype, "version", { + get: $util.oneOfGetter($oneOfFields = ["v0"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetIdentityNonceResponse instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetIdentityNonceResponse=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentityNonceResponse} GetIdentityNonceResponse instance + */ + GetIdentityNonceResponse.create = function create(properties) { + return new GetIdentityNonceResponse(properties); + }; + + /** + * Encodes the specified GetIdentityNonceResponse message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityNonceResponse.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetIdentityNonceResponse} message GetIdentityNonceResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentityNonceResponse.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) + $root.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetIdentityNonceResponse message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityNonceResponse.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetIdentityNonceResponse} message GetIdentityNonceResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentityNonceResponse.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetIdentityNonceResponse message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetIdentityNonceResponse} GetIdentityNonceResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetIdentityNonceResponse.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityNonceResponse(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; } - return message; - }; + } + return message; + }; - /** - * Creates a plain object from an IdentityEntry message. Also converts values to other types if specified. - * @function toObject - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry - * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} message IdentityEntry - * @param {$protobuf.IConversionOptions} [options] Conversion options - * @returns {Object.} Plain object - */ - IdentityEntry.toObject = function toObject(message, options) { - if (!options) - options = {}; - var object = {}; - if (options.defaults) { - if (options.bytes === String) - object.key = ""; - else { - object.key = []; - if (options.bytes !== Array) - object.key = $util.newBuffer(object.key); - } - object.value = null; + /** + * Decodes a GetIdentityNonceResponse message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetIdentityNonceResponse} GetIdentityNonceResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetIdentityNonceResponse.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetIdentityNonceResponse message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetIdentityNonceResponse.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + properties.version = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.verify(message.v0); + if (error) + return "v0." + error; } - if (message.key != null && message.hasOwnProperty("key")) - object.key = options.bytes === String ? $util.base64.encode(message.key, 0, message.key.length) : options.bytes === Array ? Array.prototype.slice.call(message.key) : message.key; - if (message.value != null && message.hasOwnProperty("value")) - object.value = $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.toObject(message.value, options); + } + return null; + }; + + /** + * Creates a GetIdentityNonceResponse message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse + * @static + * @param {Object.} object Plain object + * @returns {org.dash.platform.dapi.v0.GetIdentityNonceResponse} GetIdentityNonceResponse + */ + GetIdentityNonceResponse.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityNonceResponse) return object; - }; + var message = new $root.org.dash.platform.dapi.v0.GetIdentityNonceResponse(); + if (object.v0 != null) { + if (typeof object.v0 !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityNonceResponse.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.fromObject(object.v0); + } + return message; + }; - /** - * Converts this IdentityEntry to JSON. - * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry - * @instance - * @returns {Object.} JSON object - */ - IdentityEntry.prototype.toJSON = function toJSON() { - return this.constructor.toObject(this, $protobuf.util.toJSONOptions); - }; + /** + * Creates a plain object from a GetIdentityNonceResponse message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityNonceResponse} message GetIdentityNonceResponse + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + GetIdentityNonceResponse.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + object.v0 = $root.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.toObject(message.v0, options); + if (options.oneofs) + object.version = "v0"; + } + return object; + }; - return IdentityEntry; - })(); + /** + * Converts this GetIdentityNonceResponse to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse + * @instance + * @returns {Object.} JSON object + */ + GetIdentityNonceResponse.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; - GetIdentitiesResponse.Identities = (function() { + GetIdentityNonceResponse.GetIdentityNonceResponseV0 = (function() { /** - * Properties of an Identities. - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse - * @interface IIdentities - * @property {Array.|null} [identityEntries] Identities identityEntries + * Properties of a GetIdentityNonceResponseV0. + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse + * @interface IGetIdentityNonceResponseV0 + * @property {number|Long|null} [identityNonce] GetIdentityNonceResponseV0 identityNonce + * @property {org.dash.platform.dapi.v0.IProof|null} [proof] GetIdentityNonceResponseV0 proof + * @property {org.dash.platform.dapi.v0.IResponseMetadata|null} [metadata] GetIdentityNonceResponseV0 metadata */ /** - * Constructs a new Identities. - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse - * @classdesc Represents an Identities. - * @implements IIdentities + * Constructs a new GetIdentityNonceResponseV0. + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse + * @classdesc Represents a GetIdentityNonceResponseV0. + * @implements IGetIdentityNonceResponseV0 * @constructor - * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IIdentities=} [properties] Properties to set + * @param {org.dash.platform.dapi.v0.GetIdentityNonceResponse.IGetIdentityNonceResponseV0=} [properties] Properties to set */ - function Identities(properties) { - this.identityEntries = []; + function GetIdentityNonceResponseV0(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -4805,78 +6455,115 @@ $root.org = (function() { } /** - * Identities identityEntries. - * @member {Array.} identityEntries - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities + * GetIdentityNonceResponseV0 identityNonce. + * @member {number|Long} identityNonce + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0 * @instance */ - Identities.prototype.identityEntries = $util.emptyArray; + GetIdentityNonceResponseV0.prototype.identityNonce = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** - * Creates a new Identities instance using the specified properties. + * GetIdentityNonceResponseV0 proof. + * @member {org.dash.platform.dapi.v0.IProof|null|undefined} proof + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0 + * @instance + */ + GetIdentityNonceResponseV0.prototype.proof = null; + + /** + * GetIdentityNonceResponseV0 metadata. + * @member {org.dash.platform.dapi.v0.IResponseMetadata|null|undefined} metadata + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0 + * @instance + */ + GetIdentityNonceResponseV0.prototype.metadata = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetIdentityNonceResponseV0 result. + * @member {"identityNonce"|"proof"|undefined} result + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0 + * @instance + */ + Object.defineProperty(GetIdentityNonceResponseV0.prototype, "result", { + get: $util.oneOfGetter($oneOfFields = ["identityNonce", "proof"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetIdentityNonceResponseV0 instance using the specified properties. * @function create - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IIdentities=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} Identities instance + * @param {org.dash.platform.dapi.v0.GetIdentityNonceResponse.IGetIdentityNonceResponseV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} GetIdentityNonceResponseV0 instance */ - Identities.create = function create(properties) { - return new Identities(properties); + GetIdentityNonceResponseV0.create = function create(properties) { + return new GetIdentityNonceResponseV0(properties); }; /** - * Encodes the specified Identities message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.verify|verify} messages. + * Encodes the specified GetIdentityNonceResponseV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.verify|verify} messages. * @function encode - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IIdentities} message Identities message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetIdentityNonceResponse.IGetIdentityNonceResponseV0} message GetIdentityNonceResponseV0 message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - Identities.encode = function encode(message, writer) { + GetIdentityNonceResponseV0.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.identityEntries != null && message.identityEntries.length) - for (var i = 0; i < message.identityEntries.length; ++i) - $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.encode(message.identityEntries[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.identityNonce != null && Object.hasOwnProperty.call(message, "identityNonce")) + writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.identityNonce); + if (message.proof != null && Object.hasOwnProperty.call(message, "proof")) + $root.org.dash.platform.dapi.v0.Proof.encode(message.proof, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.metadata != null && Object.hasOwnProperty.call(message, "metadata")) + $root.org.dash.platform.dapi.v0.ResponseMetadata.encode(message.metadata, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); return writer; }; /** - * Encodes the specified Identities message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.verify|verify} messages. + * Encodes the specified GetIdentityNonceResponseV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.verify|verify} messages. * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IIdentities} message Identities message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetIdentityNonceResponse.IGetIdentityNonceResponseV0} message GetIdentityNonceResponseV0 message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - Identities.encodeDelimited = function encodeDelimited(message, writer) { + GetIdentityNonceResponseV0.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes an Identities message from the specified reader or buffer. + * Decodes a GetIdentityNonceResponseV0 message from the specified reader or buffer. * @function decode - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0 * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} Identities + * @returns {org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} GetIdentityNonceResponseV0 * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - Identities.decode = function decode(reader, length) { + GetIdentityNonceResponseV0.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities(); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { case 1: - if (!(message.identityEntries && message.identityEntries.length)) - message.identityEntries = []; - message.identityEntries.push($root.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.decode(reader, reader.uint32())); + message.identityNonce = reader.uint64(); + break; + case 2: + message.proof = $root.org.dash.platform.dapi.v0.Proof.decode(reader, reader.uint32()); + break; + case 3: + message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.decode(reader, reader.uint32()); break; default: reader.skipType(tag & 7); @@ -4887,126 +6574,368 @@ $root.org = (function() { }; /** - * Decodes an Identities message from the specified reader or buffer, length delimited. + * Decodes a GetIdentityNonceResponseV0 message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0 * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} Identities + * @returns {org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} GetIdentityNonceResponseV0 * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - Identities.decodeDelimited = function decodeDelimited(reader) { + GetIdentityNonceResponseV0.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies an Identities message. + * Verifies a GetIdentityNonceResponseV0 message. * @function verify - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0 * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - Identities.verify = function verify(message) { + GetIdentityNonceResponseV0.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; - if (message.identityEntries != null && message.hasOwnProperty("identityEntries")) { - if (!Array.isArray(message.identityEntries)) - return "identityEntries: array expected"; - for (var i = 0; i < message.identityEntries.length; ++i) { - var error = $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.verify(message.identityEntries[i]); + var properties = {}; + if (message.identityNonce != null && message.hasOwnProperty("identityNonce")) { + properties.result = 1; + if (!$util.isInteger(message.identityNonce) && !(message.identityNonce && $util.isInteger(message.identityNonce.low) && $util.isInteger(message.identityNonce.high))) + return "identityNonce: integer|Long expected"; + } + if (message.proof != null && message.hasOwnProperty("proof")) { + if (properties.result === 1) + return "result: multiple values"; + properties.result = 1; + { + var error = $root.org.dash.platform.dapi.v0.Proof.verify(message.proof); if (error) - return "identityEntries." + error; + return "proof." + error; } } + if (message.metadata != null && message.hasOwnProperty("metadata")) { + var error = $root.org.dash.platform.dapi.v0.ResponseMetadata.verify(message.metadata); + if (error) + return "metadata." + error; + } return null; }; /** - * Creates an Identities message from a plain object. Also converts values to their respective internal types. + * Creates a GetIdentityNonceResponseV0 message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0 * @static * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} Identities + * @returns {org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} GetIdentityNonceResponseV0 */ - Identities.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities) + GetIdentityNonceResponseV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0) return object; - var message = new $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities(); - if (object.identityEntries) { - if (!Array.isArray(object.identityEntries)) - throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.identityEntries: array expected"); - message.identityEntries = []; - for (var i = 0; i < object.identityEntries.length; ++i) { - if (typeof object.identityEntries[i] !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.identityEntries: object expected"); - message.identityEntries[i] = $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.fromObject(object.identityEntries[i]); - } + var message = new $root.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0(); + if (object.identityNonce != null) + if ($util.Long) + (message.identityNonce = $util.Long.fromValue(object.identityNonce)).unsigned = true; + else if (typeof object.identityNonce === "string") + message.identityNonce = parseInt(object.identityNonce, 10); + else if (typeof object.identityNonce === "number") + message.identityNonce = object.identityNonce; + else if (typeof object.identityNonce === "object") + message.identityNonce = new $util.LongBits(object.identityNonce.low >>> 0, object.identityNonce.high >>> 0).toNumber(true); + if (object.proof != null) { + if (typeof object.proof !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.proof: object expected"); + message.proof = $root.org.dash.platform.dapi.v0.Proof.fromObject(object.proof); + } + if (object.metadata != null) { + if (typeof object.metadata !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.metadata: object expected"); + message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.fromObject(object.metadata); } return message; }; /** - * Creates a plain object from an Identities message. Also converts values to other types if specified. + * Creates a plain object from a GetIdentityNonceResponseV0 message. Also converts values to other types if specified. * @function toObject - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} message Identities + * @param {org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} message GetIdentityNonceResponseV0 * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - Identities.toObject = function toObject(message, options) { + GetIdentityNonceResponseV0.toObject = function toObject(message, options) { if (!options) - options = {}; - var object = {}; - if (options.arrays || options.defaults) - object.identityEntries = []; - if (message.identityEntries && message.identityEntries.length) { - object.identityEntries = []; - for (var j = 0; j < message.identityEntries.length; ++j) - object.identityEntries[j] = $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.toObject(message.identityEntries[j], options); + options = {}; + var object = {}; + if (options.defaults) + object.metadata = null; + if (message.identityNonce != null && message.hasOwnProperty("identityNonce")) { + if (typeof message.identityNonce === "number") + object.identityNonce = options.longs === String ? String(message.identityNonce) : message.identityNonce; + else + object.identityNonce = options.longs === String ? $util.Long.prototype.toString.call(message.identityNonce) : options.longs === Number ? new $util.LongBits(message.identityNonce.low >>> 0, message.identityNonce.high >>> 0).toNumber(true) : message.identityNonce; + if (options.oneofs) + object.result = "identityNonce"; + } + if (message.proof != null && message.hasOwnProperty("proof")) { + object.proof = $root.org.dash.platform.dapi.v0.Proof.toObject(message.proof, options); + if (options.oneofs) + object.result = "proof"; } + if (message.metadata != null && message.hasOwnProperty("metadata")) + object.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.toObject(message.metadata, options); return object; }; /** - * Converts this Identities to JSON. + * Converts this GetIdentityNonceResponseV0 to JSON. * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0 * @instance * @returns {Object.} JSON object */ - Identities.prototype.toJSON = function toJSON() { + GetIdentityNonceResponseV0.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - return Identities; + return GetIdentityNonceResponseV0; })(); - GetIdentitiesResponse.GetIdentitiesResponseV0 = (function() { + return GetIdentityNonceResponse; + })(); + + v0.GetIdentityContractNonceResponse = (function() { + + /** + * Properties of a GetIdentityContractNonceResponse. + * @memberof org.dash.platform.dapi.v0 + * @interface IGetIdentityContractNonceResponse + * @property {org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.IGetIdentityContractNonceResponseV0|null} [v0] GetIdentityContractNonceResponse v0 + */ + + /** + * Constructs a new GetIdentityContractNonceResponse. + * @memberof org.dash.platform.dapi.v0 + * @classdesc Represents a GetIdentityContractNonceResponse. + * @implements IGetIdentityContractNonceResponse + * @constructor + * @param {org.dash.platform.dapi.v0.IGetIdentityContractNonceResponse=} [properties] Properties to set + */ + function GetIdentityContractNonceResponse(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetIdentityContractNonceResponse v0. + * @member {org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.IGetIdentityContractNonceResponseV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse + * @instance + */ + GetIdentityContractNonceResponse.prototype.v0 = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetIdentityContractNonceResponse version. + * @member {"v0"|undefined} version + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse + * @instance + */ + Object.defineProperty(GetIdentityContractNonceResponse.prototype, "version", { + get: $util.oneOfGetter($oneOfFields = ["v0"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetIdentityContractNonceResponse instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetIdentityContractNonceResponse=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} GetIdentityContractNonceResponse instance + */ + GetIdentityContractNonceResponse.create = function create(properties) { + return new GetIdentityContractNonceResponse(properties); + }; + + /** + * Encodes the specified GetIdentityContractNonceResponse message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetIdentityContractNonceResponse} message GetIdentityContractNonceResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentityContractNonceResponse.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) + $root.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetIdentityContractNonceResponse message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetIdentityContractNonceResponse} message GetIdentityContractNonceResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentityContractNonceResponse.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetIdentityContractNonceResponse message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} GetIdentityContractNonceResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetIdentityContractNonceResponse.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetIdentityContractNonceResponse message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} GetIdentityContractNonceResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetIdentityContractNonceResponse.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetIdentityContractNonceResponse message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetIdentityContractNonceResponse.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + properties.version = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.verify(message.v0); + if (error) + return "v0." + error; + } + } + return null; + }; + + /** + * Creates a GetIdentityContractNonceResponse message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse + * @static + * @param {Object.} object Plain object + * @returns {org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} GetIdentityContractNonceResponse + */ + GetIdentityContractNonceResponse.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse(); + if (object.v0 != null) { + if (typeof object.v0 !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.fromObject(object.v0); + } + return message; + }; + + /** + * Creates a plain object from a GetIdentityContractNonceResponse message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} message GetIdentityContractNonceResponse + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + GetIdentityContractNonceResponse.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + object.v0 = $root.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.toObject(message.v0, options); + if (options.oneofs) + object.version = "v0"; + } + return object; + }; + + /** + * Converts this GetIdentityContractNonceResponse to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse + * @instance + * @returns {Object.} JSON object + */ + GetIdentityContractNonceResponse.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0 = (function() { /** - * Properties of a GetIdentitiesResponseV0. - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse - * @interface IGetIdentitiesResponseV0 - * @property {org.dash.platform.dapi.v0.GetIdentitiesResponse.IIdentities|null} [identities] GetIdentitiesResponseV0 identities - * @property {org.dash.platform.dapi.v0.IProof|null} [proof] GetIdentitiesResponseV0 proof - * @property {org.dash.platform.dapi.v0.IResponseMetadata|null} [metadata] GetIdentitiesResponseV0 metadata + * Properties of a GetIdentityContractNonceResponseV0. + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse + * @interface IGetIdentityContractNonceResponseV0 + * @property {number|Long|null} [identityContractNonce] GetIdentityContractNonceResponseV0 identityContractNonce + * @property {org.dash.platform.dapi.v0.IProof|null} [proof] GetIdentityContractNonceResponseV0 proof + * @property {org.dash.platform.dapi.v0.IResponseMetadata|null} [metadata] GetIdentityContractNonceResponseV0 metadata */ /** - * Constructs a new GetIdentitiesResponseV0. - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse - * @classdesc Represents a GetIdentitiesResponseV0. - * @implements IGetIdentitiesResponseV0 + * Constructs a new GetIdentityContractNonceResponseV0. + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse + * @classdesc Represents a GetIdentityContractNonceResponseV0. + * @implements IGetIdentityContractNonceResponseV0 * @constructor - * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IGetIdentitiesResponseV0=} [properties] Properties to set + * @param {org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.IGetIdentityContractNonceResponseV0=} [properties] Properties to set */ - function GetIdentitiesResponseV0(properties) { + function GetIdentityContractNonceResponseV0(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -5014,69 +6943,69 @@ $root.org = (function() { } /** - * GetIdentitiesResponseV0 identities. - * @member {org.dash.platform.dapi.v0.GetIdentitiesResponse.IIdentities|null|undefined} identities - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0 + * GetIdentityContractNonceResponseV0 identityContractNonce. + * @member {number|Long} identityContractNonce + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0 * @instance */ - GetIdentitiesResponseV0.prototype.identities = null; + GetIdentityContractNonceResponseV0.prototype.identityContractNonce = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** - * GetIdentitiesResponseV0 proof. + * GetIdentityContractNonceResponseV0 proof. * @member {org.dash.platform.dapi.v0.IProof|null|undefined} proof - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0 * @instance */ - GetIdentitiesResponseV0.prototype.proof = null; + GetIdentityContractNonceResponseV0.prototype.proof = null; /** - * GetIdentitiesResponseV0 metadata. + * GetIdentityContractNonceResponseV0 metadata. * @member {org.dash.platform.dapi.v0.IResponseMetadata|null|undefined} metadata - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0 * @instance */ - GetIdentitiesResponseV0.prototype.metadata = null; + GetIdentityContractNonceResponseV0.prototype.metadata = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** - * GetIdentitiesResponseV0 result. - * @member {"identities"|"proof"|undefined} result - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0 + * GetIdentityContractNonceResponseV0 result. + * @member {"identityContractNonce"|"proof"|undefined} result + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0 * @instance */ - Object.defineProperty(GetIdentitiesResponseV0.prototype, "result", { - get: $util.oneOfGetter($oneOfFields = ["identities", "proof"]), + Object.defineProperty(GetIdentityContractNonceResponseV0.prototype, "result", { + get: $util.oneOfGetter($oneOfFields = ["identityContractNonce", "proof"]), set: $util.oneOfSetter($oneOfFields) }); /** - * Creates a new GetIdentitiesResponseV0 instance using the specified properties. + * Creates a new GetIdentityContractNonceResponseV0 instance using the specified properties. * @function create - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IGetIdentitiesResponseV0=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} GetIdentitiesResponseV0 instance + * @param {org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.IGetIdentityContractNonceResponseV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} GetIdentityContractNonceResponseV0 instance */ - GetIdentitiesResponseV0.create = function create(properties) { - return new GetIdentitiesResponseV0(properties); + GetIdentityContractNonceResponseV0.create = function create(properties) { + return new GetIdentityContractNonceResponseV0(properties); }; /** - * Encodes the specified GetIdentitiesResponseV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.verify|verify} messages. + * Encodes the specified GetIdentityContractNonceResponseV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.verify|verify} messages. * @function encode - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IGetIdentitiesResponseV0} message GetIdentitiesResponseV0 message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.IGetIdentityContractNonceResponseV0} message GetIdentityContractNonceResponseV0 message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetIdentitiesResponseV0.encode = function encode(message, writer) { + GetIdentityContractNonceResponseV0.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.identities != null && Object.hasOwnProperty.call(message, "identities")) - $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.encode(message.identities, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.identityContractNonce != null && Object.hasOwnProperty.call(message, "identityContractNonce")) + writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.identityContractNonce); if (message.proof != null && Object.hasOwnProperty.call(message, "proof")) $root.org.dash.platform.dapi.v0.Proof.encode(message.proof, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); if (message.metadata != null && Object.hasOwnProperty.call(message, "metadata")) @@ -5085,38 +7014,38 @@ $root.org = (function() { }; /** - * Encodes the specified GetIdentitiesResponseV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.verify|verify} messages. + * Encodes the specified GetIdentityContractNonceResponseV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.verify|verify} messages. * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IGetIdentitiesResponseV0} message GetIdentitiesResponseV0 message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.IGetIdentityContractNonceResponseV0} message GetIdentityContractNonceResponseV0 message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetIdentitiesResponseV0.encodeDelimited = function encodeDelimited(message, writer) { + GetIdentityContractNonceResponseV0.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a GetIdentitiesResponseV0 message from the specified reader or buffer. + * Decodes a GetIdentityContractNonceResponseV0 message from the specified reader or buffer. * @function decode - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0 * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} GetIdentitiesResponseV0 + * @returns {org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} GetIdentityContractNonceResponseV0 * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetIdentitiesResponseV0.decode = function decode(reader, length) { + GetIdentityContractNonceResponseV0.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0(); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { case 1: - message.identities = $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.decode(reader, reader.uint32()); + message.identityContractNonce = reader.uint64(); break; case 2: message.proof = $root.org.dash.platform.dapi.v0.Proof.decode(reader, reader.uint32()); @@ -5133,40 +7062,37 @@ $root.org = (function() { }; /** - * Decodes a GetIdentitiesResponseV0 message from the specified reader or buffer, length delimited. + * Decodes a GetIdentityContractNonceResponseV0 message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0 * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} GetIdentitiesResponseV0 + * @returns {org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} GetIdentityContractNonceResponseV0 * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetIdentitiesResponseV0.decodeDelimited = function decodeDelimited(reader) { + GetIdentityContractNonceResponseV0.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a GetIdentitiesResponseV0 message. + * Verifies a GetIdentityContractNonceResponseV0 message. * @function verify - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0 * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - GetIdentitiesResponseV0.verify = function verify(message) { + GetIdentityContractNonceResponseV0.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; var properties = {}; - if (message.identities != null && message.hasOwnProperty("identities")) { + if (message.identityContractNonce != null && message.hasOwnProperty("identityContractNonce")) { properties.result = 1; - { - var error = $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.verify(message.identities); - if (error) - return "identities." + error; - } + if (!$util.isInteger(message.identityContractNonce) && !(message.identityContractNonce && $util.isInteger(message.identityContractNonce.low) && $util.isInteger(message.identityContractNonce.high))) + return "identityContractNonce: integer|Long expected"; } if (message.proof != null && message.hasOwnProperty("proof")) { if (properties.result === 1) @@ -5187,54 +7113,61 @@ $root.org = (function() { }; /** - * Creates a GetIdentitiesResponseV0 message from a plain object. Also converts values to their respective internal types. + * Creates a GetIdentityContractNonceResponseV0 message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0 * @static * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} GetIdentitiesResponseV0 + * @returns {org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} GetIdentityContractNonceResponseV0 */ - GetIdentitiesResponseV0.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0) + GetIdentityContractNonceResponseV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0) return object; - var message = new $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0(); - if (object.identities != null) { - if (typeof object.identities !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.identities: object expected"); - message.identities = $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.fromObject(object.identities); - } + var message = new $root.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0(); + if (object.identityContractNonce != null) + if ($util.Long) + (message.identityContractNonce = $util.Long.fromValue(object.identityContractNonce)).unsigned = true; + else if (typeof object.identityContractNonce === "string") + message.identityContractNonce = parseInt(object.identityContractNonce, 10); + else if (typeof object.identityContractNonce === "number") + message.identityContractNonce = object.identityContractNonce; + else if (typeof object.identityContractNonce === "object") + message.identityContractNonce = new $util.LongBits(object.identityContractNonce.low >>> 0, object.identityContractNonce.high >>> 0).toNumber(true); if (object.proof != null) { if (typeof object.proof !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.proof: object expected"); + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.proof: object expected"); message.proof = $root.org.dash.platform.dapi.v0.Proof.fromObject(object.proof); } if (object.metadata != null) { if (typeof object.metadata !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.metadata: object expected"); + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.metadata: object expected"); message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.fromObject(object.metadata); } return message; }; /** - * Creates a plain object from a GetIdentitiesResponseV0 message. Also converts values to other types if specified. + * Creates a plain object from a GetIdentityContractNonceResponseV0 message. Also converts values to other types if specified. * @function toObject - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} message GetIdentitiesResponseV0 + * @param {org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} message GetIdentityContractNonceResponseV0 * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - GetIdentitiesResponseV0.toObject = function toObject(message, options) { + GetIdentityContractNonceResponseV0.toObject = function toObject(message, options) { if (!options) options = {}; var object = {}; if (options.defaults) object.metadata = null; - if (message.identities != null && message.hasOwnProperty("identities")) { - object.identities = $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.toObject(message.identities, options); + if (message.identityContractNonce != null && message.hasOwnProperty("identityContractNonce")) { + if (typeof message.identityContractNonce === "number") + object.identityContractNonce = options.longs === String ? String(message.identityContractNonce) : message.identityContractNonce; + else + object.identityContractNonce = options.longs === String ? $util.Long.prototype.toString.call(message.identityContractNonce) : options.longs === Number ? new $util.LongBits(message.identityContractNonce.low >>> 0, message.identityContractNonce.high >>> 0).toNumber(true) : message.identityContractNonce; if (options.oneofs) - object.result = "identities"; + object.result = "identityContractNonce"; } if (message.proof != null && message.hasOwnProperty("proof")) { object.proof = $root.org.dash.platform.dapi.v0.Proof.toObject(message.proof, options); @@ -5247,20 +7180,20 @@ $root.org = (function() { }; /** - * Converts this GetIdentitiesResponseV0 to JSON. + * Converts this GetIdentityContractNonceResponseV0 to JSON. * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0 * @instance * @returns {Object.} JSON object */ - GetIdentitiesResponseV0.prototype.toJSON = function toJSON() { + GetIdentityContractNonceResponseV0.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - return GetIdentitiesResponseV0; + return GetIdentityContractNonceResponseV0; })(); - return GetIdentitiesResponse; + return GetIdentityContractNonceResponse; })(); v0.GetIdentityBalanceResponse = (function() { diff --git a/packages/dapi-grpc/clients/platform/v0/nodejs/platform_protoc.js b/packages/dapi-grpc/clients/platform/v0/nodejs/platform_protoc.js index b22490b4b7..13ebdab355 100644 --- a/packages/dapi-grpc/clients/platform/v0/nodejs/platform_protoc.js +++ b/packages/dapi-grpc/clients/platform/v0/nodejs/platform_protoc.js @@ -116,6 +116,13 @@ goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRes goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.ResultCase', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.ResultCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.VersionCase', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.VersionCase', null, { proto }); @@ -124,6 +131,13 @@ goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetId goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.ResultCase', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.ResultCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.VersionCase', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityRequest', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityRequest.VersionCase', null, { proto }); @@ -323,6 +337,90 @@ if (goog.DEBUG && !COMPILED) { */ proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0'; } +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0'; +} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -596,6 +694,90 @@ if (goog.DEBUG && !COMPILED) { */ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0'; } +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0'; +} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -3791,21 +3973,21 @@ proto.org.dash.platform.dapi.v0.GetIdentityRequest.prototype.hasV0 = function() * @private {!Array>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.VersionCase = { +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.oneofGroups_[0])); }; @@ -3823,8 +4005,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.toObject(opt_includeInstance, this); }; @@ -3833,13 +4015,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.toObject = f * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -3853,23 +4035,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.toObject = function(in /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest; - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest; + return proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -3877,8 +4059,8 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.deserializeBinaryFromR var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -3894,9 +4076,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.deserializeBinaryFromR * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -3904,18 +4086,18 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.serializeBin /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.serializeBinaryToWriter ); } }; @@ -3937,8 +4119,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.toObject(opt_includeInstance, this); }; @@ -3947,13 +4129,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequ * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - id: msg.getId_asB64(), + identityId: msg.getIdentityId_asB64(), prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) }; @@ -3968,23 +4150,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequ /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0; - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0; + return proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -3993,7 +4175,7 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequ switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setId(value); + msg.setIdentityId(value); break; case 2: var value = /** @type {boolean} */ (reader.readBool()); @@ -4012,9 +4194,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequ * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -4022,13 +4204,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequ /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getId_asU8(); + f = message.getIdentityId_asU8(); if (f.length > 0) { writer.writeBytes( 1, @@ -4046,43 +4228,43 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequ /** - * optional bytes id = 1; + * optional bytes identity_id = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.getId = function() { +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.prototype.getIdentityId = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional bytes id = 1; - * This is a type-conversion wrapper around `getId()` + * optional bytes identity_id = 1; + * This is a type-conversion wrapper around `getIdentityId()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.getId_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.prototype.getIdentityId_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getId())); + this.getIdentityId())); }; /** - * optional bytes id = 1; + * optional bytes identity_id = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getId()` + * This is a type-conversion wrapper around `getIdentityId()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.getId_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.prototype.getIdentityId_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getId())); + this.getIdentityId())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.setId = function(value) { +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.prototype.setIdentityId = function(value) { return jspb.Message.setProto3BytesField(this, 1, value); }; @@ -4091,44 +4273,44 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequ * optional bool prove = 2; * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.getProve = function() { +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.prototype.getProve = function() { return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); }; /** * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.setProve = function(value) { +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.prototype.setProve = function(value) { return jspb.Message.setProto3BooleanField(this, 2, value); }; /** - * optional GetIdentityBalanceRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} + * optional GetIdentityNonceRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -4137,7 +4319,7 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.clearV0 = fu * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -4151,21 +4333,21 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.hasV0 = func * @private {!Array>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.VersionCase = { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.oneofGroups_[0])); }; @@ -4183,8 +4365,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.toObject(opt_includeInstance, this); }; @@ -4193,13 +4375,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.t * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -4213,23 +4395,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.toObject = /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest; - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest; + return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -4237,8 +4419,8 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.deserialize var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -4254,9 +4436,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.deserialize * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -4264,18 +4446,18 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.s /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.serializeBinaryToWriter ); } }; @@ -4297,8 +4479,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.toObject(opt_includeInstance, this); }; @@ -4307,14 +4489,15 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentity * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - id: msg.getId_asB64(), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + identityId: msg.getIdentityId_asB64(), + contractId: msg.getContractId_asB64(), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) }; if (includeInstance) { @@ -4328,23 +4511,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentity /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0; - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0; + return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -4353,9 +4536,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentity switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setId(value); + msg.setIdentityId(value); break; case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setContractId(value); + break; + case 3: var value = /** @type {boolean} */ (reader.readBool()); msg.setProve(value); break; @@ -4372,9 +4559,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentity * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -4382,23 +4569,30 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentity /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getId_asU8(); + f = message.getIdentityId_asU8(); if (f.length > 0) { writer.writeBytes( 1, f ); } + f = message.getContractId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 2, + f + ); + } f = message.getProve(); if (f) { writer.writeBool( - 2, + 3, f ); } @@ -4406,89 +4600,131 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentity /** - * optional bytes id = 1; + * optional bytes identity_id = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.getId = function() { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.getIdentityId = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional bytes id = 1; - * This is a type-conversion wrapper around `getId()` + * optional bytes identity_id = 1; + * This is a type-conversion wrapper around `getIdentityId()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.getId_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.getIdentityId_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getId())); + this.getIdentityId())); }; /** - * optional bytes id = 1; + * optional bytes identity_id = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getId()` + * This is a type-conversion wrapper around `getIdentityId()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.getId_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.getIdentityId_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getId())); + this.getIdentityId())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.setId = function(value) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.setIdentityId = function(value) { return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * optional bool prove = 2; + * optional bytes contract_id = 2; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.getContractId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * optional bytes contract_id = 2; + * This is a type-conversion wrapper around `getContractId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.getContractId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getContractId())); +}; + + +/** + * optional bytes contract_id = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getContractId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.getContractId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getContractId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.setContractId = function(value) { + return jspb.Message.setProto3BytesField(this, 2, value); +}; + + +/** + * optional bool prove = 3; * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); }; /** * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 3, value); }; /** - * optional GetIdentityBalanceAndRevisionRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} + * optional GetIdentityContractNonceRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -4497,7 +4733,7 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.c * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -4511,21 +4747,21 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.h * @private {!Array>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.VersionCase = { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityResponse.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.oneofGroups_[0])); }; @@ -4543,8 +4779,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.toObject(opt_includeInstance, this); }; @@ -4553,13 +4789,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.toObject = functio * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -4573,23 +4809,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.toObject = function(includeI /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityResponse; - return proto.org.dash.platform.dapi.v0.GetIdentityResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest; + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -4597,8 +4833,8 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.deserializeBinaryFromReader var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -4614,9 +4850,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.deserializeBinaryFromReader * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -4624,50 +4860,24 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.serializeBinary = /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.serializeBinaryToWriter ); } }; -/** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.oneofGroups_ = [[1,2]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.ResultCase = { - RESULT_NOT_SET: 0, - IDENTITY: 1, - PROOF: 2 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.ResultCase} - */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.oneofGroups_[0])); -}; - if (jspb.Message.GENERATE_TO_OBJECT) { @@ -4683,8 +4893,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.toObject(opt_includeInstance, this); }; @@ -4693,15 +4903,14 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.protot * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - identity: msg.getIdentity_asB64(), - proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), - metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + id: msg.getId_asB64(), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) }; if (includeInstance) { @@ -4715,23 +4924,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.toObje /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0; - return proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0; + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -4740,17 +4949,11 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.deseri switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setIdentity(value); + msg.setId(value); break; case 2: - var value = new proto.org.dash.platform.dapi.v0.Proof; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); - msg.setProof(value); - break; - case 3: - var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); - msg.setMetadata(value); + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); break; default: reader.skipField(); @@ -4765,9 +4968,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.deseri * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -4775,196 +4978,113 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.protot /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 1)); - if (f != null) { + f = message.getId_asU8(); + if (f.length > 0) { writer.writeBytes( 1, f ); } - f = message.getProof(); - if (f != null) { - writer.writeMessage( + f = message.getProve(); + if (f) { + writer.writeBool( 2, - f, - proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter - ); - } - f = message.getMetadata(); - if (f != null) { - writer.writeMessage( - 3, - f, - proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + f ); } }; /** - * optional bytes identity = 1; + * optional bytes id = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.getIdentity = function() { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.getId = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional bytes identity = 1; - * This is a type-conversion wrapper around `getIdentity()` + * optional bytes id = 1; + * This is a type-conversion wrapper around `getId()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.getIdentity_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.getId_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getIdentity())); + this.getId())); }; /** - * optional bytes identity = 1; + * optional bytes id = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getIdentity()` + * This is a type-conversion wrapper around `getId()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.getIdentity_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.getId_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getIdentity())); + this.getId())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.setIdentity = function(value) { - return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.oneofGroups_[0], value); -}; - - -/** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.clearIdentity = function() { - return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.oneofGroups_[0], undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.hasIdentity = function() { - return jspb.Message.getField(this, 1) != null; -}; - - -/** - * optional Proof proof = 2; - * @return {?proto.org.dash.platform.dapi.v0.Proof} - */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.getProof = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.clearProof = function() { - return this.setProof(undefined); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.setId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * Returns whether this field is set. + * optional bool prove = 2; * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.hasProof = function() { - return jspb.Message.getField(this, 2) != null; -}; - - -/** - * optional ResponseMetadata metadata = 3; - * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} - */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.getMetadata = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 3, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.clearMetadata = function() { - return this.setMetadata(undefined); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); }; /** - * optional GetIdentityResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} + * optional GetIdentityBalanceRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -4973,7 +5093,7 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.clearV0 = function * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -4987,21 +5107,21 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.hasV0 = function() * @private {!Array>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.VersionCase = { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.oneofGroups_[0])); }; @@ -5019,8 +5139,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.toObject(opt_includeInstance, this); }; @@ -5029,13 +5149,13 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.toObject = functi * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -5049,23 +5169,23 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.toObject = function(include /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesRequest; - return proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest; + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -5073,8 +5193,8 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.deserializeBinaryFromReader var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -5090,9 +5210,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.deserializeBinaryFromReader * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -5100,31 +5220,24 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.serializeBinary = /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.serializeBinaryToWriter ); } }; -/** - * List of repeated fields within this message type. - * @private {!Array} - * @const - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.repeatedFields_ = [1]; - if (jspb.Message.GENERATE_TO_OBJECT) { @@ -5140,8 +5253,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.toObject(opt_includeInstance, this); }; @@ -5150,13 +5263,13 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prot * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - idsList: msg.getIdsList_asB64(), + id: msg.getId_asB64(), prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) }; @@ -5171,23 +5284,23 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.toOb /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0; - return proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0; + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -5196,7 +5309,7 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.dese switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.addIds(value); + msg.setId(value); break; case 2: var value = /** @type {boolean} */ (reader.readBool()); @@ -5215,9 +5328,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.dese * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -5225,15 +5338,15 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prot /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getIdsList_asU8(); + f = message.getId_asU8(); if (f.length > 0) { - writer.writeRepeatedBytes( + writer.writeBytes( 1, f ); @@ -5249,63 +5362,44 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.seri /** - * repeated bytes ids = 1; - * @return {!Array} + * optional bytes id = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.getIdsList = function() { - return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 1)); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.getId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * repeated bytes ids = 1; - * This is a type-conversion wrapper around `getIdsList()` - * @return {!Array} + * optional bytes id = 1; + * This is a type-conversion wrapper around `getId()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.getIdsList_asB64 = function() { - return /** @type {!Array} */ (jspb.Message.bytesListAsB64( - this.getIdsList())); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.getId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getId())); }; /** - * repeated bytes ids = 1; + * optional bytes id = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getIdsList()` - * @return {!Array} + * This is a type-conversion wrapper around `getId()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.getIdsList_asU8 = function() { - return /** @type {!Array} */ (jspb.Message.bytesListAsU8( - this.getIdsList())); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.getId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getId())); }; /** - * @param {!(Array|Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} returns this + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.setIdsList = function(value) { - return jspb.Message.setField(this, 1, value || []); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.addIds = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 1, value, opt_index); -}; - - -/** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.clearIdsList = function() { - return this.setIdsList([]); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.setId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); }; @@ -5313,44 +5407,44 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prot * optional bool prove = 2; * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.getProve = function() { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.getProve = function() { return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); }; /** * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.setProve = function(value) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.setProve = function(value) { return jspb.Message.setProto3BooleanField(this, 2, value); }; /** - * optional GetIdentitiesRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} + * optional GetIdentityBalanceAndRevisionRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -5359,7 +5453,7 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.clearV0 = functio * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -5373,21 +5467,21 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.hasV0 = function( * @private {!Array>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetIdentityResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.VersionCase = { +proto.org.dash.platform.dapi.v0.GetIdentityResponse.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetIdentityResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityResponse.oneofGroups_[0])); }; @@ -5405,8 +5499,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityResponse.toObject(opt_includeInstance, this); }; @@ -5415,13 +5509,13 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.toObject = funct * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityResponse.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -5435,23 +5529,23 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.toObject = function(includ /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse; - return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityResponse; + return proto.org.dash.platform.dapi.v0.GetIdentityResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -5459,8 +5553,8 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.deserializeBinaryFromReade var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -5476,9 +5570,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.deserializeBinaryFromReade * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -5486,24 +5580,50 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.serializeBinary /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.serializeBinaryToWriter ); } }; +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + IDENTITY: 1, + PROOF: 2 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.oneofGroups_[0])); +}; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -5519,8 +5639,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.toObject(opt_includeInstance, this); }; @@ -5529,13 +5649,15 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.prototype.to * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - value: msg.getValue_asB64() + identity: msg.getIdentity_asB64(), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; if (includeInstance) { @@ -5549,23 +5671,23 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.toObject = f /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue; - return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0; + return proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -5574,7 +5696,17 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.deserializeB switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setValue(value); + msg.setIdentity(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); break; default: reader.skipField(); @@ -5589,9 +5721,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.deserializeB * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -5599,128 +5731,1657 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.prototype.se /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getValue_asU8(); - if (f.length > 0) { + f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 1)); + if (f != null) { writer.writeBytes( 1, f ); } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); + } }; /** - * optional bytes value = 1; + * optional bytes identity = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.prototype.getValue = function() { +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.getIdentity = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional bytes value = 1; - * This is a type-conversion wrapper around `getValue()` + * optional bytes identity = 1; + * This is a type-conversion wrapper around `getIdentity()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.prototype.getValue_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.getIdentity_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getValue())); + this.getIdentity())); }; /** - * optional bytes value = 1; + * optional bytes identity = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getValue()` + * This is a type-conversion wrapper around `getIdentity()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.prototype.getValue_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.getIdentity_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getValue())); + this.getIdentity())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.prototype.setValue = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.setIdentity = function(value) { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.oneofGroups_[0], value); }; - - - -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.clearIdentity = function() { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.oneofGroups_[0], undefined); }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.toObject = function(includeInstance, msg) { - var f, obj = { - key: msg.getKey_asB64(), - value: (f = msg.getValue()) && proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.toObject(includeInstance, f) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.hasIdentity = function() { + return jspb.Message.getField(this, 1) != null; }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional GetIdentityResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesRequest; + return proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.serializeBinaryToWriter + ); + } +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.repeatedFields_ = [1]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.toObject = function(includeInstance, msg) { + var f, obj = { + idsList: msg.getIdsList_asB64(), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0; + return proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addIds(value); + break; + case 2: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getIdsList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 1, + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 2, + f + ); + } +}; + + +/** + * repeated bytes ids = 1; + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.getIdsList = function() { + return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 1)); +}; + + +/** + * repeated bytes ids = 1; + * This is a type-conversion wrapper around `getIdsList()` + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.getIdsList_asB64 = function() { + return /** @type {!Array} */ (jspb.Message.bytesListAsB64( + this.getIdsList())); +}; + + +/** + * repeated bytes ids = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIdsList()` + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.getIdsList_asU8 = function() { + return /** @type {!Array} */ (jspb.Message.bytesListAsU8( + this.getIdsList())); +}; + + +/** + * @param {!(Array|Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.setIdsList = function(value) { + return jspb.Message.setField(this, 1, value || []); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.addIds = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.clearIdsList = function() { + return this.setIdsList([]); +}; + + +/** + * optional bool prove = 2; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); +}; + + +/** + * optional GetIdentitiesRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse; + return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.serializeBinaryToWriter + ); + } +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.toObject = function(includeInstance, msg) { + var f, obj = { + value: msg.getValue_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue; + return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setValue(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getValue_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } +}; + + +/** + * optional bytes value = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.prototype.getValue = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes value = 1; + * This is a type-conversion wrapper around `getValue()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.prototype.getValue_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getValue())); +}; + + +/** + * optional bytes value = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getValue()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.prototype.getValue_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getValue())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.prototype.setValue = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.toObject = function(includeInstance, msg) { + var f, obj = { + key: msg.getKey_asB64(), + value: (f = msg.getValue()) && proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry; + return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setKey(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.deserializeBinaryFromReader); + msg.setValue(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getKey_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getValue(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.serializeBinaryToWriter + ); + } +}; + + +/** + * optional bytes key = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.getKey = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes key = 1; + * This is a type-conversion wrapper around `getKey()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.getKey_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getKey())); +}; + + +/** + * optional bytes key = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getKey()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.getKey_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getKey())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.setKey = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional IdentityValue value = 2; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.getValue = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue, 2)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.setValue = function(value) { + return jspb.Message.setWrapperField(this, 2, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.clearValue = function() { + return this.setValue(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.hasValue = function() { + return jspb.Message.getField(this, 2) != null; +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.repeatedFields_ = [1]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.toObject = function(includeInstance, msg) { + var f, obj = { + identityEntriesList: jspb.Message.toObjectList(msg.getIdentityEntriesList(), + proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.toObject, includeInstance) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities; + return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.deserializeBinaryFromReader); + msg.addIdentityEntries(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getIdentityEntriesList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.serializeBinaryToWriter + ); + } +}; + + +/** + * repeated IdentityEntry identity_entries = 1; + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.prototype.getIdentityEntriesList = function() { + return /** @type{!Array} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry, 1)); +}; + + +/** + * @param {!Array} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.prototype.setIdentityEntriesList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry=} opt_value + * @param {number=} opt_index * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.prototype.addIdentityEntries = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.prototype.clearIdentityEntriesList = function() { + return this.setIdentityEntriesList([]); +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + IDENTITIES: 1, + PROOF: 2 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.toObject = function(includeInstance, msg) { + var f, obj = { + identities: (f = msg.getIdentities()) && proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.toObject(includeInstance, f), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0; + return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.deserializeBinaryFromReader); + msg.setIdentities(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getIdentities(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.serializeBinaryToWriter + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); + } +}; + + +/** + * optional Identities identities = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.getIdentities = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.setIdentities = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.clearIdentities = function() { + return this.setIdentities(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.hasIdentities = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional GetIdentitiesResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry; - return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse; + return proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -5728,13 +7389,160 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.deserializeB var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setKey(value); + var value = new proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.serializeBinaryToWriter + ); + } +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + IDENTITY_NONCE: 1, + PROOF: 2 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.toObject = function(includeInstance, msg) { + var f, obj = { + identityNonce: jspb.Message.getFieldWithDefault(msg, 1, 0), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0; + return proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {number} */ (reader.readUint64()); + msg.setIdentityNonce(value); break; case 2: - var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.deserializeBinaryFromReader); - msg.setValue(value); + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); break; default: reader.skipField(); @@ -5746,110 +7554,186 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.deserializeB /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = /** @type {number} */ (jspb.Message.getField(message, 1)); + if (f != null) { + writer.writeUint64( + 1, + f + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); + } +}; + + +/** + * optional uint64 identity_nonce = 1; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.getIdentityNonce = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.setIdentityNonce = function(value) { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.clearIdentityNonce = function() { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_[0], undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.hasIdentityNonce = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_[0], value); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getKey_asU8(); - if (f.length > 0) { - writer.writeBytes( - 1, - f - ); - } - f = message.getValue(); - if (f != null) { - writer.writeMessage( - 2, - f, - proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.serializeBinaryToWriter - ); - } +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); }; /** - * optional bytes key = 1; - * @return {string} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.getKey = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * optional bytes key = 1; - * This is a type-conversion wrapper around `getKey()` - * @return {string} + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.getKey_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getKey())); +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); }; /** - * optional bytes key = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getKey()` - * @return {!Uint8Array} + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.getKey_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getKey())); +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.setKey = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; }; /** - * optional IdentityValue value = 2; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} + * optional GetIdentityNonceResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.getValue = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue, 2)); +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.setValue = function(value) { - return jspb.Message.setWrapperField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.clearValue = function() { - return this.setValue(undefined); +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.clearV0 = function() { + return this.setV0(undefined); }; @@ -5857,18 +7741,36 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.cl * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.hasValue = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * List of repeated fields within this message type. - * @private {!Array} + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.repeatedFields_ = [1]; +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.oneofGroups_[0])); +}; @@ -5885,8 +7787,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.toObject(opt_includeInstance, this); }; @@ -5895,14 +7797,13 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.prototype.toObj * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.toObject = function(includeInstance, msg) { var f, obj = { - identityEntriesList: jspb.Message.toObjectList(msg.getIdentityEntriesList(), - proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.toObject, includeInstance) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -5916,23 +7817,23 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.toObject = func /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities; - return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse; + return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -5940,9 +7841,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.deserializeBina var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.deserializeBinaryFromReader); - msg.addIdentityEntries(value); + var value = new proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.deserializeBinaryFromReader); + msg.setV0(value); break; default: reader.skipField(); @@ -5957,9 +7858,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.deserializeBina * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -5967,61 +7868,23 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.prototype.seria /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getIdentityEntriesList(); - if (f.length > 0) { - writer.writeRepeatedMessage( + f = message.getV0(); + if (f != null) { + writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.serializeBinaryToWriter ); } }; -/** - * repeated IdentityEntry identity_entries = 1; - * @return {!Array} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.prototype.getIdentityEntriesList = function() { - return /** @type{!Array} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry, 1)); -}; - - -/** - * @param {!Array} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.prototype.setIdentityEntriesList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 1, value); -}; - - -/** - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry=} opt_value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.prototype.addIdentityEntries = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry, opt_index); -}; - - -/** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.prototype.clearIdentityEntriesList = function() { - return this.setIdentityEntriesList([]); -}; - - /** * Oneof group definitions for this message. Each group defines the field @@ -6031,22 +7894,22 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.prototype.clear * @private {!Array>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.oneofGroups_ = [[1,2]]; +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_ = [[1,2]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.ResultCase = { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.ResultCase = { RESULT_NOT_SET: 0, - IDENTITIES: 1, + IDENTITY_CONTRACT_NONCE: 1, PROOF: 2 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.ResultCase} + * @return {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.ResultCase} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_[0])); }; @@ -6064,8 +7927,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.toObject(opt_includeInstance, this); }; @@ -6074,13 +7937,13 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.pr * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - identities: (f = msg.getIdentities()) && proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.toObject(includeInstance, f), + identityContractNonce: jspb.Message.getFieldWithDefault(msg, 1, 0), proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; @@ -6096,23 +7959,23 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.to /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0; - return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0; + return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -6120,9 +7983,8 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.de var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.deserializeBinaryFromReader); - msg.setIdentities(value); + var value = /** @type {number} */ (reader.readUint64()); + msg.setIdentityContractNonce(value); break; case 2: var value = new proto.org.dash.platform.dapi.v0.Proof; @@ -6147,9 +8009,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.de * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -6157,18 +8019,17 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.pr /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getIdentities(); + f = /** @type {number} */ (jspb.Message.getField(message, 1)); if (f != null) { - writer.writeMessage( + writer.writeUint64( 1, - f, - proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.serializeBinaryToWriter + f ); } f = message.getProof(); @@ -6191,30 +8052,29 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.se /** - * optional Identities identities = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} + * optional uint64 identity_contract_nonce = 1; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.getIdentities = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities, 1)); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.getIdentityContractNonce = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.setIdentities = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.oneofGroups_[0], value); + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.setIdentityContractNonce = function(value) { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_[0], value); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} returns this + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.clearIdentities = function() { - return this.setIdentities(undefined); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.clearIdentityContractNonce = function() { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_[0], undefined); }; @@ -6222,7 +8082,7 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.pr * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.hasIdentities = function() { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.hasIdentityContractNonce = function() { return jspb.Message.getField(this, 1) != null; }; @@ -6231,7 +8091,7 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.pr * optional Proof proof = 2; * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.getProof = function() { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.getProof = function() { return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; @@ -6239,18 +8099,18 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.pr /** * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.clearProof = function() { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.clearProof = function() { return this.setProof(undefined); }; @@ -6259,7 +8119,7 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.pr * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.hasProof = function() { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.hasProof = function() { return jspb.Message.getField(this, 2) != null; }; @@ -6268,7 +8128,7 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.pr * optional ResponseMetadata metadata = 3; * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.getMetadata = function() { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.getMetadata = function() { return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); }; @@ -6276,18 +8136,18 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.pr /** * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.setMetadata = function(value) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.setMetadata = function(value) { return jspb.Message.setWrapperField(this, 3, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.clearMetadata = function() { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.clearMetadata = function() { return this.setMetadata(undefined); }; @@ -6296,35 +8156,35 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.pr * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.hasMetadata = function() { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.hasMetadata = function() { return jspb.Message.getField(this, 3) != null; }; /** - * optional GetIdentitiesResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} + * optional GetIdentityContractNonceResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -6333,7 +8193,7 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.clearV0 = functi * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; diff --git a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.h b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.h index d5817bc9d7..ad06a695c5 100644 --- a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.h +++ b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.h @@ -67,9 +67,13 @@ CF_EXTERN_C_BEGIN @class GetIdentityBalanceResponse_GetIdentityBalanceResponseV0; @class GetIdentityByPublicKeyHashRequest_GetIdentityByPublicKeyHashRequestV0; @class GetIdentityByPublicKeyHashResponse_GetIdentityByPublicKeyHashResponseV0; +@class GetIdentityContractNonceRequest_GetIdentityContractNonceRequestV0; +@class GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0; @class GetIdentityKeysRequest_GetIdentityKeysRequestV0; @class GetIdentityKeysResponse_GetIdentityKeysResponseV0; @class GetIdentityKeysResponse_GetIdentityKeysResponseV0_Keys; +@class GetIdentityNonceRequest_GetIdentityNonceRequestV0; +@class GetIdentityNonceResponse_GetIdentityNonceResponseV0; @class GetIdentityRequest_GetIdentityRequestV0; @class GetIdentityResponse_GetIdentityResponseV0; @class GetProofsRequest_GetProofsRequestV0; @@ -285,6 +289,87 @@ GPB_FINAL @interface GetIdentityRequest_GetIdentityRequestV0 : GPBMessage @end +#pragma mark - GetIdentityNonceRequest + +typedef GPB_ENUM(GetIdentityNonceRequest_FieldNumber) { + GetIdentityNonceRequest_FieldNumber_V0 = 1, +}; + +typedef GPB_ENUM(GetIdentityNonceRequest_Version_OneOfCase) { + GetIdentityNonceRequest_Version_OneOfCase_GPBUnsetOneOfCase = 0, + GetIdentityNonceRequest_Version_OneOfCase_V0 = 1, +}; + +GPB_FINAL @interface GetIdentityNonceRequest : GPBMessage + +@property(nonatomic, readonly) GetIdentityNonceRequest_Version_OneOfCase versionOneOfCase; + +@property(nonatomic, readwrite, strong, null_resettable) GetIdentityNonceRequest_GetIdentityNonceRequestV0 *v0; + +@end + +/** + * Clears whatever value was set for the oneof 'version'. + **/ +void GetIdentityNonceRequest_ClearVersionOneOfCase(GetIdentityNonceRequest *message); + +#pragma mark - GetIdentityNonceRequest_GetIdentityNonceRequestV0 + +typedef GPB_ENUM(GetIdentityNonceRequest_GetIdentityNonceRequestV0_FieldNumber) { + GetIdentityNonceRequest_GetIdentityNonceRequestV0_FieldNumber_IdentityId = 1, + GetIdentityNonceRequest_GetIdentityNonceRequestV0_FieldNumber_Prove = 2, +}; + +GPB_FINAL @interface GetIdentityNonceRequest_GetIdentityNonceRequestV0 : GPBMessage + +@property(nonatomic, readwrite, copy, null_resettable) NSData *identityId; + +@property(nonatomic, readwrite) BOOL prove; + +@end + +#pragma mark - GetIdentityContractNonceRequest + +typedef GPB_ENUM(GetIdentityContractNonceRequest_FieldNumber) { + GetIdentityContractNonceRequest_FieldNumber_V0 = 1, +}; + +typedef GPB_ENUM(GetIdentityContractNonceRequest_Version_OneOfCase) { + GetIdentityContractNonceRequest_Version_OneOfCase_GPBUnsetOneOfCase = 0, + GetIdentityContractNonceRequest_Version_OneOfCase_V0 = 1, +}; + +GPB_FINAL @interface GetIdentityContractNonceRequest : GPBMessage + +@property(nonatomic, readonly) GetIdentityContractNonceRequest_Version_OneOfCase versionOneOfCase; + +@property(nonatomic, readwrite, strong, null_resettable) GetIdentityContractNonceRequest_GetIdentityContractNonceRequestV0 *v0; + +@end + +/** + * Clears whatever value was set for the oneof 'version'. + **/ +void GetIdentityContractNonceRequest_ClearVersionOneOfCase(GetIdentityContractNonceRequest *message); + +#pragma mark - GetIdentityContractNonceRequest_GetIdentityContractNonceRequestV0 + +typedef GPB_ENUM(GetIdentityContractNonceRequest_GetIdentityContractNonceRequestV0_FieldNumber) { + GetIdentityContractNonceRequest_GetIdentityContractNonceRequestV0_FieldNumber_IdentityId = 1, + GetIdentityContractNonceRequest_GetIdentityContractNonceRequestV0_FieldNumber_ContractId = 2, + GetIdentityContractNonceRequest_GetIdentityContractNonceRequestV0_FieldNumber_Prove = 3, +}; + +GPB_FINAL @interface GetIdentityContractNonceRequest_GetIdentityContractNonceRequestV0 : GPBMessage + +@property(nonatomic, readwrite, copy, null_resettable) NSData *identityId; + +@property(nonatomic, readwrite, copy, null_resettable) NSData *contractId; + +@property(nonatomic, readwrite) BOOL prove; + +@end + #pragma mark - GetIdentityBalanceRequest typedef GPB_ENUM(GetIdentityBalanceRequest_FieldNumber) { @@ -561,6 +646,120 @@ GPB_FINAL @interface GetIdentitiesResponse_GetIdentitiesResponseV0 : GPBMessage **/ void GetIdentitiesResponse_GetIdentitiesResponseV0_ClearResultOneOfCase(GetIdentitiesResponse_GetIdentitiesResponseV0 *message); +#pragma mark - GetIdentityNonceResponse + +typedef GPB_ENUM(GetIdentityNonceResponse_FieldNumber) { + GetIdentityNonceResponse_FieldNumber_V0 = 1, +}; + +typedef GPB_ENUM(GetIdentityNonceResponse_Version_OneOfCase) { + GetIdentityNonceResponse_Version_OneOfCase_GPBUnsetOneOfCase = 0, + GetIdentityNonceResponse_Version_OneOfCase_V0 = 1, +}; + +GPB_FINAL @interface GetIdentityNonceResponse : GPBMessage + +@property(nonatomic, readonly) GetIdentityNonceResponse_Version_OneOfCase versionOneOfCase; + +@property(nonatomic, readwrite, strong, null_resettable) GetIdentityNonceResponse_GetIdentityNonceResponseV0 *v0; + +@end + +/** + * Clears whatever value was set for the oneof 'version'. + **/ +void GetIdentityNonceResponse_ClearVersionOneOfCase(GetIdentityNonceResponse *message); + +#pragma mark - GetIdentityNonceResponse_GetIdentityNonceResponseV0 + +typedef GPB_ENUM(GetIdentityNonceResponse_GetIdentityNonceResponseV0_FieldNumber) { + GetIdentityNonceResponse_GetIdentityNonceResponseV0_FieldNumber_IdentityNonce = 1, + GetIdentityNonceResponse_GetIdentityNonceResponseV0_FieldNumber_Proof = 2, + GetIdentityNonceResponse_GetIdentityNonceResponseV0_FieldNumber_Metadata = 3, +}; + +typedef GPB_ENUM(GetIdentityNonceResponse_GetIdentityNonceResponseV0_Result_OneOfCase) { + GetIdentityNonceResponse_GetIdentityNonceResponseV0_Result_OneOfCase_GPBUnsetOneOfCase = 0, + GetIdentityNonceResponse_GetIdentityNonceResponseV0_Result_OneOfCase_IdentityNonce = 1, + GetIdentityNonceResponse_GetIdentityNonceResponseV0_Result_OneOfCase_Proof = 2, +}; + +GPB_FINAL @interface GetIdentityNonceResponse_GetIdentityNonceResponseV0 : GPBMessage + +@property(nonatomic, readonly) GetIdentityNonceResponse_GetIdentityNonceResponseV0_Result_OneOfCase resultOneOfCase; + +@property(nonatomic, readwrite) uint64_t identityNonce; + +@property(nonatomic, readwrite, strong, null_resettable) Proof *proof; + +@property(nonatomic, readwrite, strong, null_resettable) ResponseMetadata *metadata; +/** Test to see if @c metadata has been set. */ +@property(nonatomic, readwrite) BOOL hasMetadata; + +@end + +/** + * Clears whatever value was set for the oneof 'result'. + **/ +void GetIdentityNonceResponse_GetIdentityNonceResponseV0_ClearResultOneOfCase(GetIdentityNonceResponse_GetIdentityNonceResponseV0 *message); + +#pragma mark - GetIdentityContractNonceResponse + +typedef GPB_ENUM(GetIdentityContractNonceResponse_FieldNumber) { + GetIdentityContractNonceResponse_FieldNumber_V0 = 1, +}; + +typedef GPB_ENUM(GetIdentityContractNonceResponse_Version_OneOfCase) { + GetIdentityContractNonceResponse_Version_OneOfCase_GPBUnsetOneOfCase = 0, + GetIdentityContractNonceResponse_Version_OneOfCase_V0 = 1, +}; + +GPB_FINAL @interface GetIdentityContractNonceResponse : GPBMessage + +@property(nonatomic, readonly) GetIdentityContractNonceResponse_Version_OneOfCase versionOneOfCase; + +@property(nonatomic, readwrite, strong, null_resettable) GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0 *v0; + +@end + +/** + * Clears whatever value was set for the oneof 'version'. + **/ +void GetIdentityContractNonceResponse_ClearVersionOneOfCase(GetIdentityContractNonceResponse *message); + +#pragma mark - GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0 + +typedef GPB_ENUM(GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0_FieldNumber) { + GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0_FieldNumber_IdentityContractNonce = 1, + GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0_FieldNumber_Proof = 2, + GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0_FieldNumber_Metadata = 3, +}; + +typedef GPB_ENUM(GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0_Result_OneOfCase) { + GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0_Result_OneOfCase_GPBUnsetOneOfCase = 0, + GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0_Result_OneOfCase_IdentityContractNonce = 1, + GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0_Result_OneOfCase_Proof = 2, +}; + +GPB_FINAL @interface GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0 : GPBMessage + +@property(nonatomic, readonly) GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0_Result_OneOfCase resultOneOfCase; + +@property(nonatomic, readwrite) uint64_t identityContractNonce; + +@property(nonatomic, readwrite, strong, null_resettable) Proof *proof; + +@property(nonatomic, readwrite, strong, null_resettable) ResponseMetadata *metadata; +/** Test to see if @c metadata has been set. */ +@property(nonatomic, readwrite) BOOL hasMetadata; + +@end + +/** + * Clears whatever value was set for the oneof 'result'. + **/ +void GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0_ClearResultOneOfCase(GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0 *message); + #pragma mark - GetIdentityBalanceResponse typedef GPB_ENUM(GetIdentityBalanceResponse_FieldNumber) { diff --git a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.m b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.m index ab9e7ecf4a..efdb83c359 100644 --- a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.m +++ b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.m @@ -89,11 +89,19 @@ GPBObjCClassDeclaration(GetIdentityByPublicKeyHashRequest_GetIdentityByPublicKeyHashRequestV0); GPBObjCClassDeclaration(GetIdentityByPublicKeyHashResponse); GPBObjCClassDeclaration(GetIdentityByPublicKeyHashResponse_GetIdentityByPublicKeyHashResponseV0); +GPBObjCClassDeclaration(GetIdentityContractNonceRequest); +GPBObjCClassDeclaration(GetIdentityContractNonceRequest_GetIdentityContractNonceRequestV0); +GPBObjCClassDeclaration(GetIdentityContractNonceResponse); +GPBObjCClassDeclaration(GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0); GPBObjCClassDeclaration(GetIdentityKeysRequest); GPBObjCClassDeclaration(GetIdentityKeysRequest_GetIdentityKeysRequestV0); GPBObjCClassDeclaration(GetIdentityKeysResponse); GPBObjCClassDeclaration(GetIdentityKeysResponse_GetIdentityKeysResponseV0); GPBObjCClassDeclaration(GetIdentityKeysResponse_GetIdentityKeysResponseV0_Keys); +GPBObjCClassDeclaration(GetIdentityNonceRequest); +GPBObjCClassDeclaration(GetIdentityNonceRequest_GetIdentityNonceRequestV0); +GPBObjCClassDeclaration(GetIdentityNonceResponse); +GPBObjCClassDeclaration(GetIdentityNonceResponse_GetIdentityNonceResponseV0); GPBObjCClassDeclaration(GetIdentityRequest); GPBObjCClassDeclaration(GetIdentityRequest_GetIdentityRequestV0); GPBObjCClassDeclaration(GetIdentityResponse); @@ -609,6 +617,243 @@ + (GPBDescriptor *)descriptor { @end +#pragma mark - GetIdentityNonceRequest + +@implementation GetIdentityNonceRequest + +@dynamic versionOneOfCase; +@dynamic v0; + +typedef struct GetIdentityNonceRequest__storage_ { + uint32_t _has_storage_[2]; + GetIdentityNonceRequest_GetIdentityNonceRequestV0 *v0; +} GetIdentityNonceRequest__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "v0", + .dataTypeSpecific.clazz = GPBObjCClass(GetIdentityNonceRequest_GetIdentityNonceRequestV0), + .number = GetIdentityNonceRequest_FieldNumber_V0, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetIdentityNonceRequest__storage_, v0), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetIdentityNonceRequest class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetIdentityNonceRequest__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "version", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetIdentityNonceRequest_ClearVersionOneOfCase(GetIdentityNonceRequest *message) { + GPBDescriptor *descriptor = [GetIdentityNonceRequest descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetIdentityNonceRequest_GetIdentityNonceRequestV0 + +@implementation GetIdentityNonceRequest_GetIdentityNonceRequestV0 + +@dynamic identityId; +@dynamic prove; + +typedef struct GetIdentityNonceRequest_GetIdentityNonceRequestV0__storage_ { + uint32_t _has_storage_[1]; + NSData *identityId; +} GetIdentityNonceRequest_GetIdentityNonceRequestV0__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "identityId", + .dataTypeSpecific.clazz = Nil, + .number = GetIdentityNonceRequest_GetIdentityNonceRequestV0_FieldNumber_IdentityId, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetIdentityNonceRequest_GetIdentityNonceRequestV0__storage_, identityId), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, + }, + { + .name = "prove", + .dataTypeSpecific.clazz = Nil, + .number = GetIdentityNonceRequest_GetIdentityNonceRequestV0_FieldNumber_Prove, + .hasIndex = 1, + .offset = 2, // Stored in _has_storage_ to save space. + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBool, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetIdentityNonceRequest_GetIdentityNonceRequestV0 class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetIdentityNonceRequest_GetIdentityNonceRequestV0__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetIdentityNonceRequest)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetIdentityContractNonceRequest + +@implementation GetIdentityContractNonceRequest + +@dynamic versionOneOfCase; +@dynamic v0; + +typedef struct GetIdentityContractNonceRequest__storage_ { + uint32_t _has_storage_[2]; + GetIdentityContractNonceRequest_GetIdentityContractNonceRequestV0 *v0; +} GetIdentityContractNonceRequest__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "v0", + .dataTypeSpecific.clazz = GPBObjCClass(GetIdentityContractNonceRequest_GetIdentityContractNonceRequestV0), + .number = GetIdentityContractNonceRequest_FieldNumber_V0, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetIdentityContractNonceRequest__storage_, v0), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetIdentityContractNonceRequest class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetIdentityContractNonceRequest__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "version", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetIdentityContractNonceRequest_ClearVersionOneOfCase(GetIdentityContractNonceRequest *message) { + GPBDescriptor *descriptor = [GetIdentityContractNonceRequest descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetIdentityContractNonceRequest_GetIdentityContractNonceRequestV0 + +@implementation GetIdentityContractNonceRequest_GetIdentityContractNonceRequestV0 + +@dynamic identityId; +@dynamic contractId; +@dynamic prove; + +typedef struct GetIdentityContractNonceRequest_GetIdentityContractNonceRequestV0__storage_ { + uint32_t _has_storage_[1]; + NSData *identityId; + NSData *contractId; +} GetIdentityContractNonceRequest_GetIdentityContractNonceRequestV0__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "identityId", + .dataTypeSpecific.clazz = Nil, + .number = GetIdentityContractNonceRequest_GetIdentityContractNonceRequestV0_FieldNumber_IdentityId, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetIdentityContractNonceRequest_GetIdentityContractNonceRequestV0__storage_, identityId), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, + }, + { + .name = "contractId", + .dataTypeSpecific.clazz = Nil, + .number = GetIdentityContractNonceRequest_GetIdentityContractNonceRequestV0_FieldNumber_ContractId, + .hasIndex = 1, + .offset = (uint32_t)offsetof(GetIdentityContractNonceRequest_GetIdentityContractNonceRequestV0__storage_, contractId), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, + }, + { + .name = "prove", + .dataTypeSpecific.clazz = Nil, + .number = GetIdentityContractNonceRequest_GetIdentityContractNonceRequestV0_FieldNumber_Prove, + .hasIndex = 2, + .offset = 3, // Stored in _has_storage_ to save space. + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBool, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetIdentityContractNonceRequest_GetIdentityContractNonceRequestV0 class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetIdentityContractNonceRequest_GetIdentityContractNonceRequestV0__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetIdentityContractNonceRequest)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + #pragma mark - GetIdentityBalanceRequest @implementation GetIdentityBalanceRequest @@ -1371,6 +1616,280 @@ void GetIdentitiesResponse_GetIdentitiesResponseV0_ClearResultOneOfCase(GetIdent GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; GPBClearOneof(message, oneof); } +#pragma mark - GetIdentityNonceResponse + +@implementation GetIdentityNonceResponse + +@dynamic versionOneOfCase; +@dynamic v0; + +typedef struct GetIdentityNonceResponse__storage_ { + uint32_t _has_storage_[2]; + GetIdentityNonceResponse_GetIdentityNonceResponseV0 *v0; +} GetIdentityNonceResponse__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "v0", + .dataTypeSpecific.clazz = GPBObjCClass(GetIdentityNonceResponse_GetIdentityNonceResponseV0), + .number = GetIdentityNonceResponse_FieldNumber_V0, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetIdentityNonceResponse__storage_, v0), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetIdentityNonceResponse class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetIdentityNonceResponse__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "version", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetIdentityNonceResponse_ClearVersionOneOfCase(GetIdentityNonceResponse *message) { + GPBDescriptor *descriptor = [GetIdentityNonceResponse descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetIdentityNonceResponse_GetIdentityNonceResponseV0 + +@implementation GetIdentityNonceResponse_GetIdentityNonceResponseV0 + +@dynamic resultOneOfCase; +@dynamic identityNonce; +@dynamic proof; +@dynamic hasMetadata, metadata; + +typedef struct GetIdentityNonceResponse_GetIdentityNonceResponseV0__storage_ { + uint32_t _has_storage_[2]; + Proof *proof; + ResponseMetadata *metadata; + uint64_t identityNonce; +} GetIdentityNonceResponse_GetIdentityNonceResponseV0__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "identityNonce", + .dataTypeSpecific.clazz = Nil, + .number = GetIdentityNonceResponse_GetIdentityNonceResponseV0_FieldNumber_IdentityNonce, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetIdentityNonceResponse_GetIdentityNonceResponseV0__storage_, identityNonce), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeUInt64, + }, + { + .name = "proof", + .dataTypeSpecific.clazz = GPBObjCClass(Proof), + .number = GetIdentityNonceResponse_GetIdentityNonceResponseV0_FieldNumber_Proof, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetIdentityNonceResponse_GetIdentityNonceResponseV0__storage_, proof), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + { + .name = "metadata", + .dataTypeSpecific.clazz = GPBObjCClass(ResponseMetadata), + .number = GetIdentityNonceResponse_GetIdentityNonceResponseV0_FieldNumber_Metadata, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetIdentityNonceResponse_GetIdentityNonceResponseV0__storage_, metadata), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetIdentityNonceResponse_GetIdentityNonceResponseV0 class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetIdentityNonceResponse_GetIdentityNonceResponseV0__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "result", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetIdentityNonceResponse)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetIdentityNonceResponse_GetIdentityNonceResponseV0_ClearResultOneOfCase(GetIdentityNonceResponse_GetIdentityNonceResponseV0 *message) { + GPBDescriptor *descriptor = [GetIdentityNonceResponse_GetIdentityNonceResponseV0 descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetIdentityContractNonceResponse + +@implementation GetIdentityContractNonceResponse + +@dynamic versionOneOfCase; +@dynamic v0; + +typedef struct GetIdentityContractNonceResponse__storage_ { + uint32_t _has_storage_[2]; + GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0 *v0; +} GetIdentityContractNonceResponse__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "v0", + .dataTypeSpecific.clazz = GPBObjCClass(GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0), + .number = GetIdentityContractNonceResponse_FieldNumber_V0, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetIdentityContractNonceResponse__storage_, v0), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetIdentityContractNonceResponse class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetIdentityContractNonceResponse__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "version", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetIdentityContractNonceResponse_ClearVersionOneOfCase(GetIdentityContractNonceResponse *message) { + GPBDescriptor *descriptor = [GetIdentityContractNonceResponse descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0 + +@implementation GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0 + +@dynamic resultOneOfCase; +@dynamic identityContractNonce; +@dynamic proof; +@dynamic hasMetadata, metadata; + +typedef struct GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0__storage_ { + uint32_t _has_storage_[2]; + Proof *proof; + ResponseMetadata *metadata; + uint64_t identityContractNonce; +} GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "identityContractNonce", + .dataTypeSpecific.clazz = Nil, + .number = GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0_FieldNumber_IdentityContractNonce, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0__storage_, identityContractNonce), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeUInt64, + }, + { + .name = "proof", + .dataTypeSpecific.clazz = GPBObjCClass(Proof), + .number = GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0_FieldNumber_Proof, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0__storage_, proof), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + { + .name = "metadata", + .dataTypeSpecific.clazz = GPBObjCClass(ResponseMetadata), + .number = GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0_FieldNumber_Metadata, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0__storage_, metadata), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0 class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "result", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetIdentityContractNonceResponse)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0_ClearResultOneOfCase(GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0 *message) { + GPBDescriptor *descriptor = [GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0 descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} #pragma mark - GetIdentityBalanceResponse @implementation GetIdentityBalanceResponse diff --git a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbrpc.h b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbrpc.h index 062e8b4944..f3db6c60f3 100644 --- a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbrpc.h +++ b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbrpc.h @@ -38,8 +38,12 @@ @class GetIdentityBalanceResponse; @class GetIdentityByPublicKeyHashRequest; @class GetIdentityByPublicKeyHashResponse; +@class GetIdentityContractNonceRequest; +@class GetIdentityContractNonceResponse; @class GetIdentityKeysRequest; @class GetIdentityKeysResponse; +@class GetIdentityNonceRequest; +@class GetIdentityNonceResponse; @class GetIdentityRequest; @class GetIdentityResponse; @class GetProofsRequest; @@ -96,6 +100,14 @@ NS_ASSUME_NONNULL_BEGIN - (GRPCUnaryProtoCall *)getIdentityKeysWithMessage:(GetIdentityKeysRequest *)message responseHandler:(id)handler callOptions:(GRPCCallOptions *_Nullable)callOptions; +#pragma mark getIdentityNonce(GetIdentityNonceRequest) returns (GetIdentityNonceResponse) + +- (GRPCUnaryProtoCall *)getIdentityNonceWithMessage:(GetIdentityNonceRequest *)message responseHandler:(id)handler callOptions:(GRPCCallOptions *_Nullable)callOptions; + +#pragma mark getIdentityContractNonce(GetIdentityContractNonceRequest) returns (GetIdentityContractNonceResponse) + +- (GRPCUnaryProtoCall *)getIdentityContractNonceWithMessage:(GetIdentityContractNonceRequest *)message responseHandler:(id)handler callOptions:(GRPCCallOptions *_Nullable)callOptions; + #pragma mark getIdentityBalance(GetIdentityBalanceRequest) returns (GetIdentityBalanceResponse) - (GRPCUnaryProtoCall *)getIdentityBalanceWithMessage:(GetIdentityBalanceRequest *)message responseHandler:(id)handler callOptions:(GRPCCallOptions *_Nullable)callOptions; @@ -188,6 +200,20 @@ NS_ASSUME_NONNULL_BEGIN - (GRPCProtoCall *)RPCTogetIdentityKeysWithRequest:(GetIdentityKeysRequest *)request handler:(void(^)(GetIdentityKeysResponse *_Nullable response, NSError *_Nullable error))handler; +#pragma mark getIdentityNonce(GetIdentityNonceRequest) returns (GetIdentityNonceResponse) + +- (void)getIdentityNonceWithRequest:(GetIdentityNonceRequest *)request handler:(void(^)(GetIdentityNonceResponse *_Nullable response, NSError *_Nullable error))handler; + +- (GRPCProtoCall *)RPCTogetIdentityNonceWithRequest:(GetIdentityNonceRequest *)request handler:(void(^)(GetIdentityNonceResponse *_Nullable response, NSError *_Nullable error))handler; + + +#pragma mark getIdentityContractNonce(GetIdentityContractNonceRequest) returns (GetIdentityContractNonceResponse) + +- (void)getIdentityContractNonceWithRequest:(GetIdentityContractNonceRequest *)request handler:(void(^)(GetIdentityContractNonceResponse *_Nullable response, NSError *_Nullable error))handler; + +- (GRPCProtoCall *)RPCTogetIdentityContractNonceWithRequest:(GetIdentityContractNonceRequest *)request handler:(void(^)(GetIdentityContractNonceResponse *_Nullable response, NSError *_Nullable error))handler; + + #pragma mark getIdentityBalance(GetIdentityBalanceRequest) returns (GetIdentityBalanceResponse) - (void)getIdentityBalanceWithRequest:(GetIdentityBalanceRequest *)request handler:(void(^)(GetIdentityBalanceResponse *_Nullable response, NSError *_Nullable error))handler; diff --git a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbrpc.m b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbrpc.m index 4d4611e93d..e4fe44abba 100644 --- a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbrpc.m +++ b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbrpc.m @@ -150,6 +150,46 @@ - (GRPCUnaryProtoCall *)getIdentityKeysWithMessage:(GetIdentityKeysRequest *)mes responseClass:[GetIdentityKeysResponse class]]; } +#pragma mark getIdentityNonce(GetIdentityNonceRequest) returns (GetIdentityNonceResponse) + +- (void)getIdentityNonceWithRequest:(GetIdentityNonceRequest *)request handler:(void(^)(GetIdentityNonceResponse *_Nullable response, NSError *_Nullable error))handler{ + [[self RPCTogetIdentityNonceWithRequest:request handler:handler] start]; +} +// Returns a not-yet-started RPC object. +- (GRPCProtoCall *)RPCTogetIdentityNonceWithRequest:(GetIdentityNonceRequest *)request handler:(void(^)(GetIdentityNonceResponse *_Nullable response, NSError *_Nullable error))handler{ + return [self RPCToMethod:@"getIdentityNonce" + requestsWriter:[GRXWriter writerWithValue:request] + responseClass:[GetIdentityNonceResponse class] + responsesWriteable:[GRXWriteable writeableWithSingleHandler:handler]]; +} +- (GRPCUnaryProtoCall *)getIdentityNonceWithMessage:(GetIdentityNonceRequest *)message responseHandler:(id)handler callOptions:(GRPCCallOptions *_Nullable)callOptions { + return [self RPCToMethod:@"getIdentityNonce" + message:message + responseHandler:handler + callOptions:callOptions + responseClass:[GetIdentityNonceResponse class]]; +} + +#pragma mark getIdentityContractNonce(GetIdentityContractNonceRequest) returns (GetIdentityContractNonceResponse) + +- (void)getIdentityContractNonceWithRequest:(GetIdentityContractNonceRequest *)request handler:(void(^)(GetIdentityContractNonceResponse *_Nullable response, NSError *_Nullable error))handler{ + [[self RPCTogetIdentityContractNonceWithRequest:request handler:handler] start]; +} +// Returns a not-yet-started RPC object. +- (GRPCProtoCall *)RPCTogetIdentityContractNonceWithRequest:(GetIdentityContractNonceRequest *)request handler:(void(^)(GetIdentityContractNonceResponse *_Nullable response, NSError *_Nullable error))handler{ + return [self RPCToMethod:@"getIdentityContractNonce" + requestsWriter:[GRXWriter writerWithValue:request] + responseClass:[GetIdentityContractNonceResponse class] + responsesWriteable:[GRXWriteable writeableWithSingleHandler:handler]]; +} +- (GRPCUnaryProtoCall *)getIdentityContractNonceWithMessage:(GetIdentityContractNonceRequest *)message responseHandler:(id)handler callOptions:(GRPCCallOptions *_Nullable)callOptions { + return [self RPCToMethod:@"getIdentityContractNonce" + message:message + responseHandler:handler + callOptions:callOptions + responseClass:[GetIdentityContractNonceResponse class]]; +} + #pragma mark getIdentityBalance(GetIdentityBalanceRequest) returns (GetIdentityBalanceResponse) - (void)getIdentityBalanceWithRequest:(GetIdentityBalanceRequest *)request handler:(void(^)(GetIdentityBalanceResponse *_Nullable response, NSError *_Nullable error))handler{ diff --git a/packages/dapi-grpc/clients/platform/v0/python/platform_pb2.py b/packages/dapi-grpc/clients/platform/v0/python/platform_pb2.py index fe85c6298a..01c84f252e 100644 --- a/packages/dapi-grpc/clients/platform/v0/python/platform_pb2.py +++ b/packages/dapi-grpc/clients/platform/v0/python/platform_pb2.py @@ -22,7 +22,7 @@ syntax='proto3', serialized_options=None, create_key=_descriptor._internal_create_key, - serialized_pb=b'\n\x0eplatform.proto\x12\x19org.dash.platform.dapi.v0\x1a\x1egoogle/protobuf/wrappers.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"\x81\x01\n\x05Proof\x12\x15\n\rgrovedb_proof\x18\x01 \x01(\x0c\x12\x13\n\x0bquorum_hash\x18\x02 \x01(\x0c\x12\x11\n\tsignature\x18\x03 \x01(\x0c\x12\r\n\x05round\x18\x04 \x01(\r\x12\x15\n\rblock_id_hash\x18\x05 \x01(\x0c\x12\x13\n\x0bquorum_type\x18\x06 \x01(\r\"\x90\x01\n\x10ResponseMetadata\x12\x0e\n\x06height\x18\x01 \x01(\x04\x12 \n\x18\x63ore_chain_locked_height\x18\x02 \x01(\r\x12\r\n\x05\x65poch\x18\x03 \x01(\r\x12\x0f\n\x07time_ms\x18\x04 \x01(\x04\x12\x18\n\x10protocol_version\x18\x05 \x01(\r\x12\x10\n\x08\x63hain_id\x18\x06 \x01(\t\"L\n\x1dStateTransitionBroadcastError\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\x0f\n\x07message\x18\x02 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x03 \x01(\x0c\";\n\x1f\x42roadcastStateTransitionRequest\x12\x18\n\x10state_transition\x18\x01 \x01(\x0c\"\"\n BroadcastStateTransitionResponse\"\xa4\x01\n\x12GetIdentityRequest\x12P\n\x02v0\x18\x01 \x01(\x0b\x32\x42.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0H\x00\x1a\x31\n\x14GetIdentityRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xc0\x01\n\x19GetIdentityBalanceRequest\x12^\n\x02v0\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0H\x00\x1a\x38\n\x1bGetIdentityBalanceRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xec\x01\n$GetIdentityBalanceAndRevisionRequest\x12t\n\x02v0\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0H\x00\x1a\x43\n&GetIdentityBalanceAndRevisionRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x9e\x02\n\x13GetIdentityResponse\x12R\n\x02v0\x18\x01 \x01(\x0b\x32\x44.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0H\x00\x1a\xa7\x01\n\x15GetIdentityResponseV0\x12\x12\n\x08identity\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xad\x01\n\x14GetIdentitiesRequest\x12T\n\x02v0\x18\x01 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0H\x00\x1a\x34\n\x16GetIdentitiesRequestV0\x12\x0b\n\x03ids\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xda\x04\n\x15GetIdentitiesResponse\x12V\n\x02v0\x18\x01 \x01(\x0b\x32H.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0H\x00\x1a\x1e\n\rIdentityValue\x12\r\n\x05value\x18\x01 \x01(\x0c\x1ak\n\rIdentityEntry\x12\x0b\n\x03key\x18\x01 \x01(\x0c\x12M\n\x05value\x18\x02 \x01(\x0b\x32>.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue\x1a\x66\n\nIdentities\x12X\n\x10identity_entries\x18\x01 \x03(\x0b\x32>.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry\x1a\xe8\x01\n\x17GetIdentitiesResponseV0\x12Q\n\nidentities\x18\x01 \x01(\x0b\x32;.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentitiesH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb9\x02\n\x1aGetIdentityBalanceResponse\x12`\n\x02v0\x18\x01 \x01(\x0b\x32R.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0H\x00\x1a\xad\x01\n\x1cGetIdentityBalanceResponseV0\x12\x11\n\x07\x62\x61lance\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xa9\x04\n%GetIdentityBalanceAndRevisionResponse\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0H\x00\x1a\xfc\x02\n\'GetIdentityBalanceAndRevisionResponseV0\x12\x9b\x01\n\x14\x62\x61lance_and_revision\x18\x01 \x01(\x0b\x32{.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevisionH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x37\n\x12\x42\x61lanceAndRevision\x12\x0f\n\x07\x62\x61lance\x18\x01 \x01(\x04\x12\x10\n\x08revision\x18\x02 \x01(\x04\x42\x08\n\x06resultB\t\n\x07version\"\xd1\x01\n\x0eKeyRequestType\x12\x36\n\x08\x61ll_keys\x18\x01 \x01(\x0b\x32\".org.dash.platform.dapi.v0.AllKeysH\x00\x12@\n\rspecific_keys\x18\x02 \x01(\x0b\x32\'.org.dash.platform.dapi.v0.SpecificKeysH\x00\x12:\n\nsearch_key\x18\x03 \x01(\x0b\x32$.org.dash.platform.dapi.v0.SearchKeyH\x00\x42\t\n\x07request\"\t\n\x07\x41llKeys\"\x1f\n\x0cSpecificKeys\x12\x0f\n\x07key_ids\x18\x01 \x03(\r\"\xb6\x01\n\tSearchKey\x12I\n\x0bpurpose_map\x18\x01 \x03(\x0b\x32\x34.org.dash.platform.dapi.v0.SearchKey.PurposeMapEntry\x1a^\n\x0fPurposeMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12:\n\x05value\x18\x02 \x01(\x0b\x32+.org.dash.platform.dapi.v0.SecurityLevelMap:\x02\x38\x01\"\xbf\x02\n\x10SecurityLevelMap\x12]\n\x12security_level_map\x18\x01 \x03(\x0b\x32\x41.org.dash.platform.dapi.v0.SecurityLevelMap.SecurityLevelMapEntry\x1aw\n\x15SecurityLevelMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12M\n\x05value\x18\x02 \x01(\x0e\x32>.org.dash.platform.dapi.v0.SecurityLevelMap.KeyKindRequestType:\x02\x38\x01\"S\n\x12KeyKindRequestType\x12\x1f\n\x1b\x43URRENT_KEY_OF_KIND_REQUEST\x10\x00\x12\x1c\n\x18\x41LL_KEYS_OF_KIND_REQUEST\x10\x01\"\xda\x02\n\x16GetIdentityKeysRequest\x12X\n\x02v0\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0H\x00\x1a\xda\x01\n\x18GetIdentityKeysRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12?\n\x0crequest_type\x18\x02 \x01(\x0b\x32).org.dash.platform.dapi.v0.KeyRequestType\x12+\n\x05limit\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12,\n\x06offset\x18\x04 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\t\n\x07version\"\x99\x03\n\x17GetIdentityKeysResponse\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0H\x00\x1a\x96\x02\n\x19GetIdentityKeysResponseV0\x12\x61\n\x04keys\x18\x01 \x01(\x0b\x32Q.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.KeysH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x1a\n\x04Keys\x12\x12\n\nkeys_bytes\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version\"\xa1\x06\n\x10GetProofsRequest\x12L\n\x02v0\x18\x01 \x01(\x0b\x32>.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0H\x00\x1a\xb3\x05\n\x12GetProofsRequestV0\x12\x62\n\nidentities\x18\x01 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest\x12\x61\n\tcontracts\x18\x02 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest\x12\x61\n\tdocuments\x18\x03 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest\x1aw\n\x0f\x44ocumentRequest\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x15\n\rdocument_type\x18\x02 \x01(\t\x12#\n\x1b\x64ocument_type_keeps_history\x18\x03 \x01(\x08\x12\x13\n\x0b\x64ocument_id\x18\x04 \x01(\x0c\x1a\xd1\x01\n\x0fIdentityRequest\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12i\n\x0crequest_type\x18\x02 \x01(\x0e\x32S.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type\">\n\x04Type\x12\x11\n\rFULL_IDENTITY\x10\x00\x12\x0b\n\x07\x42\x41LANCE\x10\x01\x12\x08\n\x04KEYS\x10\x02\x12\x0c\n\x08REVISION\x10\x03\x1a&\n\x0f\x43ontractRequest\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x42\t\n\x07version\"\x82\x02\n\x11GetProofsResponse\x12N\n\x02v0\x18\x01 \x01(\x0b\x32@.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0H\x00\x1a\x91\x01\n\x13GetProofsResponseV0\x12\x31\n\x05proof\x18\x01 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x02 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb4\x01\n\x16GetDataContractRequest\x12X\n\x02v0\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0H\x00\x1a\x35\n\x18GetDataContractRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xb3\x02\n\x17GetDataContractResponse\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0H\x00\x1a\xb0\x01\n\x19GetDataContractResponseV0\x12\x17\n\rdata_contract\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb9\x01\n\x17GetDataContractsRequest\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0H\x00\x1a\x37\n\x19GetDataContractsRequestV0\x12\x0b\n\x03ids\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xcf\x04\n\x18GetDataContractsResponse\x12\\\n\x02v0\x18\x01 \x01(\x0b\x32N.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0H\x00\x1a[\n\x11\x44\x61taContractEntry\x12\x12\n\nidentifier\x18\x01 \x01(\x0c\x12\x32\n\rdata_contract\x18\x02 \x01(\x0b\x32\x1b.google.protobuf.BytesValue\x1au\n\rDataContracts\x12\x64\n\x15\x64\x61ta_contract_entries\x18\x01 \x03(\x0b\x32\x45.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry\x1a\xf5\x01\n\x1aGetDataContractsResponseV0\x12[\n\x0e\x64\x61ta_contracts\x18\x01 \x01(\x0b\x32\x41.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xc1\x02\n\x1dGetDataContractHistoryRequest\x12\x66\n\x02v0\x18\x01 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0H\x00\x1a\xac\x01\n\x1fGetDataContractHistoryRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12+\n\x05limit\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12,\n\x06offset\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\x13\n\x0bstart_at_ms\x18\x04 \x01(\x04\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\t\n\x07version\"\xae\x05\n\x1eGetDataContractHistoryResponse\x12h\n\x02v0\x18\x01 \x01(\x0b\x32Z.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0H\x00\x1a\x96\x04\n GetDataContractHistoryResponseV0\x12\x8f\x01\n\x15\x64\x61ta_contract_history\x18\x01 \x01(\x0b\x32n.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x37\n\x18\x44\x61taContractHistoryEntry\x12\x0c\n\x04\x64\x61te\x18\x01 \x01(\x04\x12\r\n\x05value\x18\x02 \x01(\x0c\x1a\xaa\x01\n\x13\x44\x61taContractHistory\x12\x92\x01\n\x15\x64\x61ta_contract_entries\x18\x01 \x03(\x0b\x32s.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntryB\x08\n\x06resultB\t\n\x07version\"\xb2\x02\n\x13GetDocumentsRequest\x12R\n\x02v0\x18\x01 \x01(\x0b\x32\x44.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0H\x00\x1a\xbb\x01\n\x15GetDocumentsRequestV0\x12\x18\n\x10\x64\x61ta_contract_id\x18\x01 \x01(\x0c\x12\x15\n\rdocument_type\x18\x02 \x01(\t\x12\r\n\x05where\x18\x03 \x01(\x0c\x12\x10\n\x08order_by\x18\x04 \x01(\x0c\x12\r\n\x05limit\x18\x05 \x01(\r\x12\x15\n\x0bstart_after\x18\x06 \x01(\x0cH\x00\x12\x12\n\x08start_at\x18\x07 \x01(\x0cH\x00\x12\r\n\x05prove\x18\x08 \x01(\x08\x42\x07\n\x05startB\t\n\x07version\"\x95\x03\n\x14GetDocumentsResponse\x12T\n\x02v0\x18\x01 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0H\x00\x1a\x9b\x02\n\x16GetDocumentsResponseV0\x12\x65\n\tdocuments\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.DocumentsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x1e\n\tDocuments\x12\x11\n\tdocuments\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version\"\xff\x01\n%GetIdentitiesByPublicKeyHashesRequest\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0H\x00\x1aS\n\'GetIdentitiesByPublicKeyHashesRequestV0\x12\x19\n\x11public_key_hashes\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xc6\x05\n&GetIdentitiesByPublicKeyHashesResponse\x12x\n\x02v0\x18\x01 \x01(\x0b\x32j.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0H\x00\x1a\x61\n\x1aPublicKeyHashIdentityEntry\x12\x17\n\x0fpublic_key_hash\x18\x01 \x01(\x0c\x12*\n\x05value\x18\x02 \x01(\x0b\x32\x1b.google.protobuf.BytesValue\x1a\x95\x01\n\x1bIdentitiesByPublicKeyHashes\x12v\n\x10identity_entries\x18\x01 \x03(\x0b\x32\\.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry\x1a\x9b\x02\n(GetIdentitiesByPublicKeyHashesResponseV0\x12s\n\nidentities\x18\x01 \x01(\x0b\x32].org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashesH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xed\x01\n!GetIdentityByPublicKeyHashRequest\x12n\n\x02v0\x18\x01 \x01(\x0b\x32`.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0H\x00\x1aM\n#GetIdentityByPublicKeyHashRequestV0\x12\x17\n\x0fpublic_key_hash\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xda\x02\n\"GetIdentityByPublicKeyHashResponse\x12p\n\x02v0\x18\x01 \x01(\x0b\x32\x62.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0H\x00\x1a\xb6\x01\n$GetIdentityByPublicKeyHashResponseV0\x12\x12\n\x08identity\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xfb\x01\n#WaitForStateTransitionResultRequest\x12r\n\x02v0\x18\x01 \x01(\x0b\x32\x64.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0H\x00\x1aU\n%WaitForStateTransitionResultRequestV0\x12\x1d\n\x15state_transition_hash\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x99\x03\n$WaitForStateTransitionResultResponse\x12t\n\x02v0\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0H\x00\x1a\xef\x01\n&WaitForStateTransitionResultResponseV0\x12I\n\x05\x65rror\x18\x01 \x01(\x0b\x32\x38.org.dash.platform.dapi.v0.StateTransitionBroadcastErrorH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xc4\x01\n\x19GetConsensusParamsRequest\x12^\n\x02v0\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0H\x00\x1a<\n\x1bGetConsensusParamsRequestV0\x12\x0e\n\x06height\x18\x01 \x01(\x05\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x9c\x04\n\x1aGetConsensusParamsResponse\x12`\n\x02v0\x18\x01 \x01(\x0b\x32R.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0H\x00\x1aP\n\x14\x43onsensusParamsBlock\x12\x11\n\tmax_bytes\x18\x01 \x01(\t\x12\x0f\n\x07max_gas\x18\x02 \x01(\t\x12\x14\n\x0ctime_iota_ms\x18\x03 \x01(\t\x1a\x62\n\x17\x43onsensusParamsEvidence\x12\x1a\n\x12max_age_num_blocks\x18\x01 \x01(\t\x12\x18\n\x10max_age_duration\x18\x02 \x01(\t\x12\x11\n\tmax_bytes\x18\x03 \x01(\t\x1a\xda\x01\n\x1cGetConsensusParamsResponseV0\x12Y\n\x05\x62lock\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock\x12_\n\x08\x65vidence\x18\x02 \x01(\x0b\x32M.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidenceB\t\n\x07version\"\xe4\x01\n%GetProtocolVersionUpgradeStateRequest\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0H\x00\x1a\x38\n\'GetProtocolVersionUpgradeStateRequestV0\x12\r\n\x05prove\x18\x01 \x01(\x08\x42\t\n\x07version\"\xb5\x05\n&GetProtocolVersionUpgradeStateResponse\x12x\n\x02v0\x18\x01 \x01(\x0b\x32j.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0H\x00\x1a\x85\x04\n(GetProtocolVersionUpgradeStateResponseV0\x12\x87\x01\n\x08versions\x18\x01 \x01(\x0b\x32s.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x96\x01\n\x08Versions\x12\x89\x01\n\x08versions\x18\x01 \x03(\x0b\x32w.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry\x1a:\n\x0cVersionEntry\x12\x16\n\x0eversion_number\x18\x01 \x01(\r\x12\x12\n\nvote_count\x18\x02 \x01(\rB\x08\n\x06resultB\t\n\x07version\"\xa3\x02\n*GetProtocolVersionUpgradeVoteStatusRequest\x12\x80\x01\n\x02v0\x18\x01 \x01(\x0b\x32r.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0H\x00\x1ag\n,GetProtocolVersionUpgradeVoteStatusRequestV0\x12\x19\n\x11start_pro_tx_hash\x18\x01 \x01(\x0c\x12\r\n\x05\x63ount\x18\x02 \x01(\r\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\xef\x05\n+GetProtocolVersionUpgradeVoteStatusResponse\x12\x82\x01\n\x02v0\x18\x01 \x01(\x0b\x32t.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0H\x00\x1a\xaf\x04\n-GetProtocolVersionUpgradeVoteStatusResponseV0\x12\x98\x01\n\x08versions\x18\x01 \x01(\x0b\x32\x83\x01.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignalsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\xaf\x01\n\x0eVersionSignals\x12\x9c\x01\n\x0fversion_signals\x18\x01 \x03(\x0b\x32\x82\x01.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal\x1a\x35\n\rVersionSignal\x12\x13\n\x0bpro_tx_hash\x18\x01 \x01(\x0c\x12\x0f\n\x07version\x18\x02 \x01(\rB\x08\n\x06resultB\t\n\x07version\"\xf5\x01\n\x14GetEpochsInfoRequest\x12T\n\x02v0\x18\x01 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0H\x00\x1a|\n\x16GetEpochsInfoRequestV0\x12\x31\n\x0bstart_epoch\x18\x01 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\r\n\x05\x63ount\x18\x02 \x01(\r\x12\x11\n\tascending\x18\x03 \x01(\x08\x12\r\n\x05prove\x18\x04 \x01(\x08\x42\t\n\x07version\"\xf7\x04\n\x15GetEpochsInfoResponse\x12V\n\x02v0\x18\x01 \x01(\x0b\x32H.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0H\x00\x1a\xfa\x03\n\x17GetEpochsInfoResponseV0\x12\x65\n\x06\x65pochs\x18\x01 \x01(\x0b\x32S.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfosH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1au\n\nEpochInfos\x12g\n\x0b\x65poch_infos\x18\x01 \x03(\x0b\x32R.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo\x1a\x84\x01\n\tEpochInfo\x12\x0e\n\x06number\x18\x01 \x01(\r\x12\x1a\n\x12\x66irst_block_height\x18\x02 \x01(\x04\x12\x1f\n\x17\x66irst_core_block_height\x18\x03 \x01(\r\x12\x12\n\nstart_time\x18\x04 \x01(\x04\x12\x16\n\x0e\x66\x65\x65_multiplier\x18\x05 \x01(\x01\x42\x08\n\x06resultB\t\n\x07version2\xc2\x13\n\x08Platform\x12\x93\x01\n\x18\x62roadcastStateTransition\x12:.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest\x1a;.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse\x12l\n\x0bgetIdentity\x12-.org.dash.platform.dapi.v0.GetIdentityRequest\x1a..org.dash.platform.dapi.v0.GetIdentityResponse\x12r\n\rgetIdentities\x12/.org.dash.platform.dapi.v0.GetIdentitiesRequest\x1a\x30.org.dash.platform.dapi.v0.GetIdentitiesResponse\x12x\n\x0fgetIdentityKeys\x12\x31.org.dash.platform.dapi.v0.GetIdentityKeysRequest\x1a\x32.org.dash.platform.dapi.v0.GetIdentityKeysResponse\x12\x81\x01\n\x12getIdentityBalance\x12\x34.org.dash.platform.dapi.v0.GetIdentityBalanceRequest\x1a\x35.org.dash.platform.dapi.v0.GetIdentityBalanceResponse\x12\xa2\x01\n\x1dgetIdentityBalanceAndRevision\x12?.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest\x1a@.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse\x12\x66\n\tgetProofs\x12+.org.dash.platform.dapi.v0.GetProofsRequest\x1a,.org.dash.platform.dapi.v0.GetProofsResponse\x12x\n\x0fgetDataContract\x12\x31.org.dash.platform.dapi.v0.GetDataContractRequest\x1a\x32.org.dash.platform.dapi.v0.GetDataContractResponse\x12\x8d\x01\n\x16getDataContractHistory\x12\x38.org.dash.platform.dapi.v0.GetDataContractHistoryRequest\x1a\x39.org.dash.platform.dapi.v0.GetDataContractHistoryResponse\x12{\n\x10getDataContracts\x12\x32.org.dash.platform.dapi.v0.GetDataContractsRequest\x1a\x33.org.dash.platform.dapi.v0.GetDataContractsResponse\x12o\n\x0cgetDocuments\x12..org.dash.platform.dapi.v0.GetDocumentsRequest\x1a/.org.dash.platform.dapi.v0.GetDocumentsResponse\x12\xa5\x01\n\x1egetIdentitiesByPublicKeyHashes\x12@.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest\x1a\x41.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse\x12\x99\x01\n\x1agetIdentityByPublicKeyHash\x12<.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest\x1a=.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse\x12\x9f\x01\n\x1cwaitForStateTransitionResult\x12>.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest\x1a?.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse\x12\x81\x01\n\x12getConsensusParams\x12\x34.org.dash.platform.dapi.v0.GetConsensusParamsRequest\x1a\x35.org.dash.platform.dapi.v0.GetConsensusParamsResponse\x12\xa5\x01\n\x1egetProtocolVersionUpgradeState\x12@.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest\x1a\x41.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse\x12\xb4\x01\n#getProtocolVersionUpgradeVoteStatus\x12\x45.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest\x1a\x46.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse\x12r\n\rgetEpochsInfo\x12/.org.dash.platform.dapi.v0.GetEpochsInfoRequest\x1a\x30.org.dash.platform.dapi.v0.GetEpochsInfoResponseb\x06proto3' + serialized_pb=b'\n\x0eplatform.proto\x12\x19org.dash.platform.dapi.v0\x1a\x1egoogle/protobuf/wrappers.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"\x81\x01\n\x05Proof\x12\x15\n\rgrovedb_proof\x18\x01 \x01(\x0c\x12\x13\n\x0bquorum_hash\x18\x02 \x01(\x0c\x12\x11\n\tsignature\x18\x03 \x01(\x0c\x12\r\n\x05round\x18\x04 \x01(\r\x12\x15\n\rblock_id_hash\x18\x05 \x01(\x0c\x12\x13\n\x0bquorum_type\x18\x06 \x01(\r\"\x90\x01\n\x10ResponseMetadata\x12\x0e\n\x06height\x18\x01 \x01(\x04\x12 \n\x18\x63ore_chain_locked_height\x18\x02 \x01(\r\x12\r\n\x05\x65poch\x18\x03 \x01(\r\x12\x0f\n\x07time_ms\x18\x04 \x01(\x04\x12\x18\n\x10protocol_version\x18\x05 \x01(\r\x12\x10\n\x08\x63hain_id\x18\x06 \x01(\t\"L\n\x1dStateTransitionBroadcastError\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\x0f\n\x07message\x18\x02 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x03 \x01(\x0c\";\n\x1f\x42roadcastStateTransitionRequest\x12\x18\n\x10state_transition\x18\x01 \x01(\x0c\"\"\n BroadcastStateTransitionResponse\"\xa4\x01\n\x12GetIdentityRequest\x12P\n\x02v0\x18\x01 \x01(\x0b\x32\x42.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0H\x00\x1a\x31\n\x14GetIdentityRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xc1\x01\n\x17GetIdentityNonceRequest\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0H\x00\x1a?\n\x19GetIdentityNonceRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xf6\x01\n\x1fGetIdentityContractNonceRequest\x12j\n\x02v0\x18\x01 \x01(\x0b\x32\\.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0H\x00\x1a\\\n!GetIdentityContractNonceRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12\x13\n\x0b\x63ontract_id\x18\x02 \x01(\x0c\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\xc0\x01\n\x19GetIdentityBalanceRequest\x12^\n\x02v0\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0H\x00\x1a\x38\n\x1bGetIdentityBalanceRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xec\x01\n$GetIdentityBalanceAndRevisionRequest\x12t\n\x02v0\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0H\x00\x1a\x43\n&GetIdentityBalanceAndRevisionRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x9e\x02\n\x13GetIdentityResponse\x12R\n\x02v0\x18\x01 \x01(\x0b\x32\x44.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0H\x00\x1a\xa7\x01\n\x15GetIdentityResponseV0\x12\x12\n\x08identity\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xad\x01\n\x14GetIdentitiesRequest\x12T\n\x02v0\x18\x01 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0H\x00\x1a\x34\n\x16GetIdentitiesRequestV0\x12\x0b\n\x03ids\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xda\x04\n\x15GetIdentitiesResponse\x12V\n\x02v0\x18\x01 \x01(\x0b\x32H.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0H\x00\x1a\x1e\n\rIdentityValue\x12\r\n\x05value\x18\x01 \x01(\x0c\x1ak\n\rIdentityEntry\x12\x0b\n\x03key\x18\x01 \x01(\x0c\x12M\n\x05value\x18\x02 \x01(\x0b\x32>.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue\x1a\x66\n\nIdentities\x12X\n\x10identity_entries\x18\x01 \x03(\x0b\x32>.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry\x1a\xe8\x01\n\x17GetIdentitiesResponseV0\x12Q\n\nidentities\x18\x01 \x01(\x0b\x32;.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentitiesH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb8\x02\n\x18GetIdentityNonceResponse\x12\\\n\x02v0\x18\x01 \x01(\x0b\x32N.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0H\x00\x1a\xb2\x01\n\x1aGetIdentityNonceResponseV0\x12\x18\n\x0eidentity_nonce\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xe1\x02\n GetIdentityContractNonceResponse\x12l\n\x02v0\x18\x01 \x01(\x0b\x32^.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0H\x00\x1a\xc3\x01\n\"GetIdentityContractNonceResponseV0\x12!\n\x17identity_contract_nonce\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb9\x02\n\x1aGetIdentityBalanceResponse\x12`\n\x02v0\x18\x01 \x01(\x0b\x32R.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0H\x00\x1a\xad\x01\n\x1cGetIdentityBalanceResponseV0\x12\x11\n\x07\x62\x61lance\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xa9\x04\n%GetIdentityBalanceAndRevisionResponse\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0H\x00\x1a\xfc\x02\n\'GetIdentityBalanceAndRevisionResponseV0\x12\x9b\x01\n\x14\x62\x61lance_and_revision\x18\x01 \x01(\x0b\x32{.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevisionH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x37\n\x12\x42\x61lanceAndRevision\x12\x0f\n\x07\x62\x61lance\x18\x01 \x01(\x04\x12\x10\n\x08revision\x18\x02 \x01(\x04\x42\x08\n\x06resultB\t\n\x07version\"\xd1\x01\n\x0eKeyRequestType\x12\x36\n\x08\x61ll_keys\x18\x01 \x01(\x0b\x32\".org.dash.platform.dapi.v0.AllKeysH\x00\x12@\n\rspecific_keys\x18\x02 \x01(\x0b\x32\'.org.dash.platform.dapi.v0.SpecificKeysH\x00\x12:\n\nsearch_key\x18\x03 \x01(\x0b\x32$.org.dash.platform.dapi.v0.SearchKeyH\x00\x42\t\n\x07request\"\t\n\x07\x41llKeys\"\x1f\n\x0cSpecificKeys\x12\x0f\n\x07key_ids\x18\x01 \x03(\r\"\xb6\x01\n\tSearchKey\x12I\n\x0bpurpose_map\x18\x01 \x03(\x0b\x32\x34.org.dash.platform.dapi.v0.SearchKey.PurposeMapEntry\x1a^\n\x0fPurposeMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12:\n\x05value\x18\x02 \x01(\x0b\x32+.org.dash.platform.dapi.v0.SecurityLevelMap:\x02\x38\x01\"\xbf\x02\n\x10SecurityLevelMap\x12]\n\x12security_level_map\x18\x01 \x03(\x0b\x32\x41.org.dash.platform.dapi.v0.SecurityLevelMap.SecurityLevelMapEntry\x1aw\n\x15SecurityLevelMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12M\n\x05value\x18\x02 \x01(\x0e\x32>.org.dash.platform.dapi.v0.SecurityLevelMap.KeyKindRequestType:\x02\x38\x01\"S\n\x12KeyKindRequestType\x12\x1f\n\x1b\x43URRENT_KEY_OF_KIND_REQUEST\x10\x00\x12\x1c\n\x18\x41LL_KEYS_OF_KIND_REQUEST\x10\x01\"\xda\x02\n\x16GetIdentityKeysRequest\x12X\n\x02v0\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0H\x00\x1a\xda\x01\n\x18GetIdentityKeysRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12?\n\x0crequest_type\x18\x02 \x01(\x0b\x32).org.dash.platform.dapi.v0.KeyRequestType\x12+\n\x05limit\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12,\n\x06offset\x18\x04 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\t\n\x07version\"\x99\x03\n\x17GetIdentityKeysResponse\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0H\x00\x1a\x96\x02\n\x19GetIdentityKeysResponseV0\x12\x61\n\x04keys\x18\x01 \x01(\x0b\x32Q.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.KeysH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x1a\n\x04Keys\x12\x12\n\nkeys_bytes\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version\"\xa1\x06\n\x10GetProofsRequest\x12L\n\x02v0\x18\x01 \x01(\x0b\x32>.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0H\x00\x1a\xb3\x05\n\x12GetProofsRequestV0\x12\x62\n\nidentities\x18\x01 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest\x12\x61\n\tcontracts\x18\x02 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest\x12\x61\n\tdocuments\x18\x03 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest\x1aw\n\x0f\x44ocumentRequest\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x15\n\rdocument_type\x18\x02 \x01(\t\x12#\n\x1b\x64ocument_type_keeps_history\x18\x03 \x01(\x08\x12\x13\n\x0b\x64ocument_id\x18\x04 \x01(\x0c\x1a\xd1\x01\n\x0fIdentityRequest\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12i\n\x0crequest_type\x18\x02 \x01(\x0e\x32S.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type\">\n\x04Type\x12\x11\n\rFULL_IDENTITY\x10\x00\x12\x0b\n\x07\x42\x41LANCE\x10\x01\x12\x08\n\x04KEYS\x10\x02\x12\x0c\n\x08REVISION\x10\x03\x1a&\n\x0f\x43ontractRequest\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x42\t\n\x07version\"\x82\x02\n\x11GetProofsResponse\x12N\n\x02v0\x18\x01 \x01(\x0b\x32@.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0H\x00\x1a\x91\x01\n\x13GetProofsResponseV0\x12\x31\n\x05proof\x18\x01 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x02 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb4\x01\n\x16GetDataContractRequest\x12X\n\x02v0\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0H\x00\x1a\x35\n\x18GetDataContractRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xb3\x02\n\x17GetDataContractResponse\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0H\x00\x1a\xb0\x01\n\x19GetDataContractResponseV0\x12\x17\n\rdata_contract\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb9\x01\n\x17GetDataContractsRequest\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0H\x00\x1a\x37\n\x19GetDataContractsRequestV0\x12\x0b\n\x03ids\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xcf\x04\n\x18GetDataContractsResponse\x12\\\n\x02v0\x18\x01 \x01(\x0b\x32N.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0H\x00\x1a[\n\x11\x44\x61taContractEntry\x12\x12\n\nidentifier\x18\x01 \x01(\x0c\x12\x32\n\rdata_contract\x18\x02 \x01(\x0b\x32\x1b.google.protobuf.BytesValue\x1au\n\rDataContracts\x12\x64\n\x15\x64\x61ta_contract_entries\x18\x01 \x03(\x0b\x32\x45.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry\x1a\xf5\x01\n\x1aGetDataContractsResponseV0\x12[\n\x0e\x64\x61ta_contracts\x18\x01 \x01(\x0b\x32\x41.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xc1\x02\n\x1dGetDataContractHistoryRequest\x12\x66\n\x02v0\x18\x01 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0H\x00\x1a\xac\x01\n\x1fGetDataContractHistoryRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12+\n\x05limit\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12,\n\x06offset\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\x13\n\x0bstart_at_ms\x18\x04 \x01(\x04\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\t\n\x07version\"\xae\x05\n\x1eGetDataContractHistoryResponse\x12h\n\x02v0\x18\x01 \x01(\x0b\x32Z.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0H\x00\x1a\x96\x04\n GetDataContractHistoryResponseV0\x12\x8f\x01\n\x15\x64\x61ta_contract_history\x18\x01 \x01(\x0b\x32n.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x37\n\x18\x44\x61taContractHistoryEntry\x12\x0c\n\x04\x64\x61te\x18\x01 \x01(\x04\x12\r\n\x05value\x18\x02 \x01(\x0c\x1a\xaa\x01\n\x13\x44\x61taContractHistory\x12\x92\x01\n\x15\x64\x61ta_contract_entries\x18\x01 \x03(\x0b\x32s.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntryB\x08\n\x06resultB\t\n\x07version\"\xb2\x02\n\x13GetDocumentsRequest\x12R\n\x02v0\x18\x01 \x01(\x0b\x32\x44.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0H\x00\x1a\xbb\x01\n\x15GetDocumentsRequestV0\x12\x18\n\x10\x64\x61ta_contract_id\x18\x01 \x01(\x0c\x12\x15\n\rdocument_type\x18\x02 \x01(\t\x12\r\n\x05where\x18\x03 \x01(\x0c\x12\x10\n\x08order_by\x18\x04 \x01(\x0c\x12\r\n\x05limit\x18\x05 \x01(\r\x12\x15\n\x0bstart_after\x18\x06 \x01(\x0cH\x00\x12\x12\n\x08start_at\x18\x07 \x01(\x0cH\x00\x12\r\n\x05prove\x18\x08 \x01(\x08\x42\x07\n\x05startB\t\n\x07version\"\x95\x03\n\x14GetDocumentsResponse\x12T\n\x02v0\x18\x01 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0H\x00\x1a\x9b\x02\n\x16GetDocumentsResponseV0\x12\x65\n\tdocuments\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.DocumentsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x1e\n\tDocuments\x12\x11\n\tdocuments\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version\"\xff\x01\n%GetIdentitiesByPublicKeyHashesRequest\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0H\x00\x1aS\n\'GetIdentitiesByPublicKeyHashesRequestV0\x12\x19\n\x11public_key_hashes\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xc6\x05\n&GetIdentitiesByPublicKeyHashesResponse\x12x\n\x02v0\x18\x01 \x01(\x0b\x32j.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0H\x00\x1a\x61\n\x1aPublicKeyHashIdentityEntry\x12\x17\n\x0fpublic_key_hash\x18\x01 \x01(\x0c\x12*\n\x05value\x18\x02 \x01(\x0b\x32\x1b.google.protobuf.BytesValue\x1a\x95\x01\n\x1bIdentitiesByPublicKeyHashes\x12v\n\x10identity_entries\x18\x01 \x03(\x0b\x32\\.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry\x1a\x9b\x02\n(GetIdentitiesByPublicKeyHashesResponseV0\x12s\n\nidentities\x18\x01 \x01(\x0b\x32].org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashesH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xed\x01\n!GetIdentityByPublicKeyHashRequest\x12n\n\x02v0\x18\x01 \x01(\x0b\x32`.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0H\x00\x1aM\n#GetIdentityByPublicKeyHashRequestV0\x12\x17\n\x0fpublic_key_hash\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xda\x02\n\"GetIdentityByPublicKeyHashResponse\x12p\n\x02v0\x18\x01 \x01(\x0b\x32\x62.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0H\x00\x1a\xb6\x01\n$GetIdentityByPublicKeyHashResponseV0\x12\x12\n\x08identity\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xfb\x01\n#WaitForStateTransitionResultRequest\x12r\n\x02v0\x18\x01 \x01(\x0b\x32\x64.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0H\x00\x1aU\n%WaitForStateTransitionResultRequestV0\x12\x1d\n\x15state_transition_hash\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x99\x03\n$WaitForStateTransitionResultResponse\x12t\n\x02v0\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0H\x00\x1a\xef\x01\n&WaitForStateTransitionResultResponseV0\x12I\n\x05\x65rror\x18\x01 \x01(\x0b\x32\x38.org.dash.platform.dapi.v0.StateTransitionBroadcastErrorH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xc4\x01\n\x19GetConsensusParamsRequest\x12^\n\x02v0\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0H\x00\x1a<\n\x1bGetConsensusParamsRequestV0\x12\x0e\n\x06height\x18\x01 \x01(\x05\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x9c\x04\n\x1aGetConsensusParamsResponse\x12`\n\x02v0\x18\x01 \x01(\x0b\x32R.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0H\x00\x1aP\n\x14\x43onsensusParamsBlock\x12\x11\n\tmax_bytes\x18\x01 \x01(\t\x12\x0f\n\x07max_gas\x18\x02 \x01(\t\x12\x14\n\x0ctime_iota_ms\x18\x03 \x01(\t\x1a\x62\n\x17\x43onsensusParamsEvidence\x12\x1a\n\x12max_age_num_blocks\x18\x01 \x01(\t\x12\x18\n\x10max_age_duration\x18\x02 \x01(\t\x12\x11\n\tmax_bytes\x18\x03 \x01(\t\x1a\xda\x01\n\x1cGetConsensusParamsResponseV0\x12Y\n\x05\x62lock\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock\x12_\n\x08\x65vidence\x18\x02 \x01(\x0b\x32M.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidenceB\t\n\x07version\"\xe4\x01\n%GetProtocolVersionUpgradeStateRequest\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0H\x00\x1a\x38\n\'GetProtocolVersionUpgradeStateRequestV0\x12\r\n\x05prove\x18\x01 \x01(\x08\x42\t\n\x07version\"\xb5\x05\n&GetProtocolVersionUpgradeStateResponse\x12x\n\x02v0\x18\x01 \x01(\x0b\x32j.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0H\x00\x1a\x85\x04\n(GetProtocolVersionUpgradeStateResponseV0\x12\x87\x01\n\x08versions\x18\x01 \x01(\x0b\x32s.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x96\x01\n\x08Versions\x12\x89\x01\n\x08versions\x18\x01 \x03(\x0b\x32w.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry\x1a:\n\x0cVersionEntry\x12\x16\n\x0eversion_number\x18\x01 \x01(\r\x12\x12\n\nvote_count\x18\x02 \x01(\rB\x08\n\x06resultB\t\n\x07version\"\xa3\x02\n*GetProtocolVersionUpgradeVoteStatusRequest\x12\x80\x01\n\x02v0\x18\x01 \x01(\x0b\x32r.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0H\x00\x1ag\n,GetProtocolVersionUpgradeVoteStatusRequestV0\x12\x19\n\x11start_pro_tx_hash\x18\x01 \x01(\x0c\x12\r\n\x05\x63ount\x18\x02 \x01(\r\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\xef\x05\n+GetProtocolVersionUpgradeVoteStatusResponse\x12\x82\x01\n\x02v0\x18\x01 \x01(\x0b\x32t.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0H\x00\x1a\xaf\x04\n-GetProtocolVersionUpgradeVoteStatusResponseV0\x12\x98\x01\n\x08versions\x18\x01 \x01(\x0b\x32\x83\x01.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignalsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\xaf\x01\n\x0eVersionSignals\x12\x9c\x01\n\x0fversion_signals\x18\x01 \x03(\x0b\x32\x82\x01.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal\x1a\x35\n\rVersionSignal\x12\x13\n\x0bpro_tx_hash\x18\x01 \x01(\x0c\x12\x0f\n\x07version\x18\x02 \x01(\rB\x08\n\x06resultB\t\n\x07version\"\xf5\x01\n\x14GetEpochsInfoRequest\x12T\n\x02v0\x18\x01 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0H\x00\x1a|\n\x16GetEpochsInfoRequestV0\x12\x31\n\x0bstart_epoch\x18\x01 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\r\n\x05\x63ount\x18\x02 \x01(\r\x12\x11\n\tascending\x18\x03 \x01(\x08\x12\r\n\x05prove\x18\x04 \x01(\x08\x42\t\n\x07version\"\xf7\x04\n\x15GetEpochsInfoResponse\x12V\n\x02v0\x18\x01 \x01(\x0b\x32H.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0H\x00\x1a\xfa\x03\n\x17GetEpochsInfoResponseV0\x12\x65\n\x06\x65pochs\x18\x01 \x01(\x0b\x32S.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfosH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1au\n\nEpochInfos\x12g\n\x0b\x65poch_infos\x18\x01 \x03(\x0b\x32R.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo\x1a\x84\x01\n\tEpochInfo\x12\x0e\n\x06number\x18\x01 \x01(\r\x12\x1a\n\x12\x66irst_block_height\x18\x02 \x01(\x04\x12\x1f\n\x17\x66irst_core_block_height\x18\x03 \x01(\r\x12\x12\n\nstart_time\x18\x04 \x01(\x04\x12\x16\n\x0e\x66\x65\x65_multiplier\x18\x05 \x01(\x01\x42\x08\n\x06resultB\t\n\x07version2\xd5\x15\n\x08Platform\x12\x93\x01\n\x18\x62roadcastStateTransition\x12:.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest\x1a;.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse\x12l\n\x0bgetIdentity\x12-.org.dash.platform.dapi.v0.GetIdentityRequest\x1a..org.dash.platform.dapi.v0.GetIdentityResponse\x12r\n\rgetIdentities\x12/.org.dash.platform.dapi.v0.GetIdentitiesRequest\x1a\x30.org.dash.platform.dapi.v0.GetIdentitiesResponse\x12x\n\x0fgetIdentityKeys\x12\x31.org.dash.platform.dapi.v0.GetIdentityKeysRequest\x1a\x32.org.dash.platform.dapi.v0.GetIdentityKeysResponse\x12{\n\x10getIdentityNonce\x12\x32.org.dash.platform.dapi.v0.GetIdentityNonceRequest\x1a\x33.org.dash.platform.dapi.v0.GetIdentityNonceResponse\x12\x93\x01\n\x18getIdentityContractNonce\x12:.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest\x1a;.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse\x12\x81\x01\n\x12getIdentityBalance\x12\x34.org.dash.platform.dapi.v0.GetIdentityBalanceRequest\x1a\x35.org.dash.platform.dapi.v0.GetIdentityBalanceResponse\x12\xa2\x01\n\x1dgetIdentityBalanceAndRevision\x12?.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest\x1a@.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse\x12\x66\n\tgetProofs\x12+.org.dash.platform.dapi.v0.GetProofsRequest\x1a,.org.dash.platform.dapi.v0.GetProofsResponse\x12x\n\x0fgetDataContract\x12\x31.org.dash.platform.dapi.v0.GetDataContractRequest\x1a\x32.org.dash.platform.dapi.v0.GetDataContractResponse\x12\x8d\x01\n\x16getDataContractHistory\x12\x38.org.dash.platform.dapi.v0.GetDataContractHistoryRequest\x1a\x39.org.dash.platform.dapi.v0.GetDataContractHistoryResponse\x12{\n\x10getDataContracts\x12\x32.org.dash.platform.dapi.v0.GetDataContractsRequest\x1a\x33.org.dash.platform.dapi.v0.GetDataContractsResponse\x12o\n\x0cgetDocuments\x12..org.dash.platform.dapi.v0.GetDocumentsRequest\x1a/.org.dash.platform.dapi.v0.GetDocumentsResponse\x12\xa5\x01\n\x1egetIdentitiesByPublicKeyHashes\x12@.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest\x1a\x41.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse\x12\x99\x01\n\x1agetIdentityByPublicKeyHash\x12<.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest\x1a=.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse\x12\x9f\x01\n\x1cwaitForStateTransitionResult\x12>.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest\x1a?.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse\x12\x81\x01\n\x12getConsensusParams\x12\x34.org.dash.platform.dapi.v0.GetConsensusParamsRequest\x1a\x35.org.dash.platform.dapi.v0.GetConsensusParamsResponse\x12\xa5\x01\n\x1egetProtocolVersionUpgradeState\x12@.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest\x1a\x41.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse\x12\xb4\x01\n#getProtocolVersionUpgradeVoteStatus\x12\x45.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest\x1a\x46.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse\x12r\n\rgetEpochsInfo\x12/.org.dash.platform.dapi.v0.GetEpochsInfoRequest\x1a\x30.org.dash.platform.dapi.v0.GetEpochsInfoResponseb\x06proto3' , dependencies=[google_dot_protobuf_dot_wrappers__pb2.DESCRIPTOR,google_dot_protobuf_dot_struct__pb2.DESCRIPTOR,google_dot_protobuf_dot_timestamp__pb2.DESCRIPTOR,]) @@ -48,8 +48,8 @@ ], containing_type=None, serialized_options=None, - serialized_start=3815, - serialized_end=3898, + serialized_start=4931, + serialized_end=5014, ) _sym_db.RegisterEnumDescriptor(_SECURITYLEVELMAP_KEYKINDREQUESTTYPE) @@ -83,8 +83,8 @@ ], containing_type=None, serialized_options=None, - serialized_start=5350, - serialized_end=5412, + serialized_start=6466, + serialized_end=6528, ) _sym_db.RegisterEnumDescriptor(_GETPROOFSREQUEST_GETPROOFSREQUESTV0_IDENTITYREQUEST_TYPE) @@ -401,6 +401,163 @@ ) +_GETIDENTITYNONCEREQUEST_GETIDENTITYNONCEREQUESTV0 = _descriptor.Descriptor( + name='GetIdentityNonceRequestV0', + full_name='org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='identity_id', full_name='org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.identity_id', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='prove', full_name='org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.prove', index=1, + number=2, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=881, + serialized_end=944, +) + +_GETIDENTITYNONCEREQUEST = _descriptor.Descriptor( + name='GetIdentityNonceRequest', + full_name='org.dash.platform.dapi.v0.GetIdentityNonceRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='v0', full_name='org.dash.platform.dapi.v0.GetIdentityNonceRequest.v0', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_GETIDENTITYNONCEREQUEST_GETIDENTITYNONCEREQUESTV0, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='version', full_name='org.dash.platform.dapi.v0.GetIdentityNonceRequest.version', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=762, + serialized_end=955, +) + + +_GETIDENTITYCONTRACTNONCEREQUEST_GETIDENTITYCONTRACTNONCEREQUESTV0 = _descriptor.Descriptor( + name='GetIdentityContractNonceRequestV0', + full_name='org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='identity_id', full_name='org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.identity_id', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='contract_id', full_name='org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.contract_id', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='prove', full_name='org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prove', index=2, + number=3, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1101, + serialized_end=1193, +) + +_GETIDENTITYCONTRACTNONCEREQUEST = _descriptor.Descriptor( + name='GetIdentityContractNonceRequest', + full_name='org.dash.platform.dapi.v0.GetIdentityContractNonceRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='v0', full_name='org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.v0', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_GETIDENTITYCONTRACTNONCEREQUEST_GETIDENTITYCONTRACTNONCEREQUESTV0, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='version', full_name='org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.version', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=958, + serialized_end=1204, +) + + _GETIDENTITYBALANCEREQUEST_GETIDENTITYBALANCEREQUESTV0 = _descriptor.Descriptor( name='GetIdentityBalanceRequestV0', full_name='org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0', @@ -435,8 +592,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=887, - serialized_end=943, + serialized_start=1332, + serialized_end=1388, ) _GETIDENTITYBALANCEREQUEST = _descriptor.Descriptor( @@ -471,8 +628,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=762, - serialized_end=954, + serialized_start=1207, + serialized_end=1399, ) @@ -510,8 +667,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=1115, - serialized_end=1182, + serialized_start=1560, + serialized_end=1627, ) _GETIDENTITYBALANCEANDREVISIONREQUEST = _descriptor.Descriptor( @@ -546,8 +703,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=957, - serialized_end=1193, + serialized_start=1402, + serialized_end=1638, ) @@ -597,8 +754,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=1304, - serialized_end=1471, + serialized_start=1749, + serialized_end=1916, ) _GETIDENTITYRESPONSE = _descriptor.Descriptor( @@ -633,8 +790,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=1196, - serialized_end=1482, + serialized_start=1641, + serialized_end=1927, ) @@ -672,8 +829,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=1595, - serialized_end=1647, + serialized_start=2040, + serialized_end=2092, ) _GETIDENTITIESREQUEST = _descriptor.Descriptor( @@ -708,8 +865,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=1485, - serialized_end=1658, + serialized_start=1930, + serialized_end=2103, ) @@ -740,8 +897,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=1774, - serialized_end=1804, + serialized_start=2219, + serialized_end=2249, ) _GETIDENTITIESRESPONSE_IDENTITYENTRY = _descriptor.Descriptor( @@ -778,8 +935,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=1806, - serialized_end=1913, + serialized_start=2251, + serialized_end=2358, ) _GETIDENTITIESRESPONSE_IDENTITIES = _descriptor.Descriptor( @@ -809,8 +966,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=1915, - serialized_end=2017, + serialized_start=2360, + serialized_end=2462, ) _GETIDENTITIESRESPONSE_GETIDENTITIESRESPONSEV0 = _descriptor.Descriptor( @@ -859,8 +1016,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=2020, - serialized_end=2252, + serialized_start=2465, + serialized_end=2697, ) _GETIDENTITIESRESPONSE = _descriptor.Descriptor( @@ -895,8 +1052,182 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=1661, - serialized_end=2263, + serialized_start=2106, + serialized_end=2708, +) + + +_GETIDENTITYNONCERESPONSE_GETIDENTITYNONCERESPONSEV0 = _descriptor.Descriptor( + name='GetIdentityNonceResponseV0', + full_name='org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='identity_nonce', full_name='org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.identity_nonce', index=0, + number=1, type=4, cpp_type=4, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='proof', full_name='org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.proof', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='metadata', full_name='org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.metadata', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='result', full_name='org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.result', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=2834, + serialized_end=3012, +) + +_GETIDENTITYNONCERESPONSE = _descriptor.Descriptor( + name='GetIdentityNonceResponse', + full_name='org.dash.platform.dapi.v0.GetIdentityNonceResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='v0', full_name='org.dash.platform.dapi.v0.GetIdentityNonceResponse.v0', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_GETIDENTITYNONCERESPONSE_GETIDENTITYNONCERESPONSEV0, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='version', full_name='org.dash.platform.dapi.v0.GetIdentityNonceResponse.version', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=2711, + serialized_end=3023, +) + + +_GETIDENTITYCONTRACTNONCERESPONSE_GETIDENTITYCONTRACTNONCERESPONSEV0 = _descriptor.Descriptor( + name='GetIdentityContractNonceResponseV0', + full_name='org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='identity_contract_nonce', full_name='org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.identity_contract_nonce', index=0, + number=1, type=4, cpp_type=4, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='proof', full_name='org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.proof', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='metadata', full_name='org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.metadata', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='result', full_name='org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.result', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=3173, + serialized_end=3368, +) + +_GETIDENTITYCONTRACTNONCERESPONSE = _descriptor.Descriptor( + name='GetIdentityContractNonceResponse', + full_name='org.dash.platform.dapi.v0.GetIdentityContractNonceResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='v0', full_name='org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.v0', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_GETIDENTITYCONTRACTNONCERESPONSE_GETIDENTITYCONTRACTNONCERESPONSEV0, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='version', full_name='org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.version', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=3026, + serialized_end=3379, ) @@ -946,8 +1277,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=2395, - serialized_end=2568, + serialized_start=3511, + serialized_end=3684, ) _GETIDENTITYBALANCERESPONSE = _descriptor.Descriptor( @@ -982,8 +1313,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=2266, - serialized_end=2579, + serialized_start=3382, + serialized_end=3695, ) @@ -1021,8 +1352,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3059, - serialized_end=3114, + serialized_start=4175, + serialized_end=4230, ) _GETIDENTITYBALANCEANDREVISIONRESPONSE_GETIDENTITYBALANCEANDREVISIONRESPONSEV0 = _descriptor.Descriptor( @@ -1071,8 +1402,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=2744, - serialized_end=3124, + serialized_start=3860, + serialized_end=4240, ) _GETIDENTITYBALANCEANDREVISIONRESPONSE = _descriptor.Descriptor( @@ -1107,8 +1438,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=2582, - serialized_end=3135, + serialized_start=3698, + serialized_end=4251, ) @@ -1158,8 +1489,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=3138, - serialized_end=3347, + serialized_start=4254, + serialized_end=4463, ) @@ -1183,8 +1514,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3349, - serialized_end=3358, + serialized_start=4465, + serialized_end=4474, ) @@ -1215,8 +1546,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3360, - serialized_end=3391, + serialized_start=4476, + serialized_end=4507, ) @@ -1254,8 +1585,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3482, - serialized_end=3576, + serialized_start=4598, + serialized_end=4692, ) _SEARCHKEY = _descriptor.Descriptor( @@ -1285,8 +1616,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3394, - serialized_end=3576, + serialized_start=4510, + serialized_end=4692, ) @@ -1324,8 +1655,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3694, - serialized_end=3813, + serialized_start=4810, + serialized_end=4929, ) _SECURITYLEVELMAP = _descriptor.Descriptor( @@ -1356,8 +1687,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3579, - serialized_end=3898, + serialized_start=4695, + serialized_end=5014, ) @@ -1416,8 +1747,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=4018, - serialized_end=4236, + serialized_start=5134, + serialized_end=5352, ) _GETIDENTITYKEYSREQUEST = _descriptor.Descriptor( @@ -1452,8 +1783,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=3901, - serialized_end=4247, + serialized_start=5017, + serialized_end=5363, ) @@ -1484,8 +1815,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=4612, - serialized_end=4638, + serialized_start=5728, + serialized_end=5754, ) _GETIDENTITYKEYSRESPONSE_GETIDENTITYKEYSRESPONSEV0 = _descriptor.Descriptor( @@ -1534,8 +1865,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=4370, - serialized_end=4648, + serialized_start=5486, + serialized_end=5764, ) _GETIDENTITYKEYSRESPONSE = _descriptor.Descriptor( @@ -1570,8 +1901,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=4250, - serialized_end=4659, + serialized_start=5366, + serialized_end=5775, ) @@ -1623,8 +1954,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=5081, - serialized_end=5200, + serialized_start=6197, + serialized_end=6316, ) _GETPROOFSREQUEST_GETPROOFSREQUESTV0_IDENTITYREQUEST = _descriptor.Descriptor( @@ -1662,8 +1993,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=5203, - serialized_end=5412, + serialized_start=6319, + serialized_end=6528, ) _GETPROOFSREQUEST_GETPROOFSREQUESTV0_CONTRACTREQUEST = _descriptor.Descriptor( @@ -1693,8 +2024,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=5414, - serialized_end=5452, + serialized_start=6530, + serialized_end=6568, ) _GETPROOFSREQUEST_GETPROOFSREQUESTV0 = _descriptor.Descriptor( @@ -1738,8 +2069,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=4761, - serialized_end=5452, + serialized_start=5877, + serialized_end=6568, ) _GETPROOFSREQUEST = _descriptor.Descriptor( @@ -1774,8 +2105,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=4662, - serialized_end=5463, + serialized_start=5778, + serialized_end=6579, ) @@ -1818,8 +2149,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=5568, - serialized_end=5713, + serialized_start=6684, + serialized_end=6829, ) _GETPROOFSRESPONSE = _descriptor.Descriptor( @@ -1854,8 +2185,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=5466, - serialized_end=5724, + serialized_start=6582, + serialized_end=6840, ) @@ -1893,8 +2224,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=5843, - serialized_end=5896, + serialized_start=6959, + serialized_end=7012, ) _GETDATACONTRACTREQUEST = _descriptor.Descriptor( @@ -1929,8 +2260,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=5727, - serialized_end=5907, + serialized_start=6843, + serialized_end=7023, ) @@ -1980,8 +2311,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=6030, - serialized_end=6206, + serialized_start=7146, + serialized_end=7322, ) _GETDATACONTRACTRESPONSE = _descriptor.Descriptor( @@ -2016,8 +2347,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=5910, - serialized_end=6217, + serialized_start=7026, + serialized_end=7333, ) @@ -2055,8 +2386,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=6339, - serialized_end=6394, + serialized_start=7455, + serialized_end=7510, ) _GETDATACONTRACTSREQUEST = _descriptor.Descriptor( @@ -2091,8 +2422,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=6220, - serialized_end=6405, + serialized_start=7336, + serialized_end=7521, ) @@ -2130,8 +2461,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=6530, - serialized_end=6621, + serialized_start=7646, + serialized_end=7737, ) _GETDATACONTRACTSRESPONSE_DATACONTRACTS = _descriptor.Descriptor( @@ -2161,8 +2492,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=6623, - serialized_end=6740, + serialized_start=7739, + serialized_end=7856, ) _GETDATACONTRACTSRESPONSE_GETDATACONTRACTSRESPONSEV0 = _descriptor.Descriptor( @@ -2211,8 +2542,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=6743, - serialized_end=6988, + serialized_start=7859, + serialized_end=8104, ) _GETDATACONTRACTSRESPONSE = _descriptor.Descriptor( @@ -2247,8 +2578,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=6408, - serialized_end=6999, + serialized_start=7524, + serialized_end=8115, ) @@ -2307,8 +2638,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=7140, - serialized_end=7312, + serialized_start=8256, + serialized_end=8428, ) _GETDATACONTRACTHISTORYREQUEST = _descriptor.Descriptor( @@ -2343,8 +2674,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=7002, - serialized_end=7323, + serialized_start=8118, + serialized_end=8439, ) @@ -2382,8 +2713,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=7763, - serialized_end=7818, + serialized_start=8879, + serialized_end=8934, ) _GETDATACONTRACTHISTORYRESPONSE_GETDATACONTRACTHISTORYRESPONSEV0_DATACONTRACTHISTORY = _descriptor.Descriptor( @@ -2413,8 +2744,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=7821, - serialized_end=7991, + serialized_start=8937, + serialized_end=9107, ) _GETDATACONTRACTHISTORYRESPONSE_GETDATACONTRACTHISTORYRESPONSEV0 = _descriptor.Descriptor( @@ -2463,8 +2794,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=7467, - serialized_end=8001, + serialized_start=8583, + serialized_end=9117, ) _GETDATACONTRACTHISTORYRESPONSE = _descriptor.Descriptor( @@ -2499,8 +2830,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=7326, - serialized_end=8012, + serialized_start=8442, + serialized_end=9128, ) @@ -2585,8 +2916,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=8123, - serialized_end=8310, + serialized_start=9239, + serialized_end=9426, ) _GETDOCUMENTSREQUEST = _descriptor.Descriptor( @@ -2621,8 +2952,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=8015, - serialized_end=8321, + serialized_start=9131, + serialized_end=9437, ) @@ -2653,8 +2984,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=8678, - serialized_end=8708, + serialized_start=9794, + serialized_end=9824, ) _GETDOCUMENTSRESPONSE_GETDOCUMENTSRESPONSEV0 = _descriptor.Descriptor( @@ -2703,8 +3034,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=8435, - serialized_end=8718, + serialized_start=9551, + serialized_end=9834, ) _GETDOCUMENTSRESPONSE = _descriptor.Descriptor( @@ -2739,8 +3070,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=8324, - serialized_end=8729, + serialized_start=9440, + serialized_end=9845, ) @@ -2778,8 +3109,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=8893, - serialized_end=8976, + serialized_start=10009, + serialized_end=10092, ) _GETIDENTITIESBYPUBLICKEYHASHESREQUEST = _descriptor.Descriptor( @@ -2814,8 +3145,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=8732, - serialized_end=8987, + serialized_start=9848, + serialized_end=10103, ) @@ -2853,8 +3184,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=9154, - serialized_end=9251, + serialized_start=10270, + serialized_end=10367, ) _GETIDENTITIESBYPUBLICKEYHASHESRESPONSE_IDENTITIESBYPUBLICKEYHASHES = _descriptor.Descriptor( @@ -2884,8 +3215,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=9254, - serialized_end=9403, + serialized_start=10370, + serialized_end=10519, ) _GETIDENTITIESBYPUBLICKEYHASHESRESPONSE_GETIDENTITIESBYPUBLICKEYHASHESRESPONSEV0 = _descriptor.Descriptor( @@ -2934,8 +3265,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=9406, - serialized_end=9689, + serialized_start=10522, + serialized_end=10805, ) _GETIDENTITIESBYPUBLICKEYHASHESRESPONSE = _descriptor.Descriptor( @@ -2970,8 +3301,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=8990, - serialized_end=9700, + serialized_start=10106, + serialized_end=10816, ) @@ -3009,8 +3340,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=9852, - serialized_end=9929, + serialized_start=10968, + serialized_end=11045, ) _GETIDENTITYBYPUBLICKEYHASHREQUEST = _descriptor.Descriptor( @@ -3045,8 +3376,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=9703, - serialized_end=9940, + serialized_start=10819, + serialized_end=11056, ) @@ -3096,8 +3427,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=10096, - serialized_end=10278, + serialized_start=11212, + serialized_end=11394, ) _GETIDENTITYBYPUBLICKEYHASHRESPONSE = _descriptor.Descriptor( @@ -3132,8 +3463,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=9943, - serialized_end=10289, + serialized_start=11059, + serialized_end=11405, ) @@ -3171,8 +3502,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=10447, - serialized_end=10532, + serialized_start=11563, + serialized_end=11648, ) _WAITFORSTATETRANSITIONRESULTREQUEST = _descriptor.Descriptor( @@ -3207,8 +3538,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=10292, - serialized_end=10543, + serialized_start=11408, + serialized_end=11659, ) @@ -3258,8 +3589,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=10705, - serialized_end=10944, + serialized_start=11821, + serialized_end=12060, ) _WAITFORSTATETRANSITIONRESULTRESPONSE = _descriptor.Descriptor( @@ -3294,8 +3625,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=10546, - serialized_end=10955, + serialized_start=11662, + serialized_end=12071, ) @@ -3333,8 +3664,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=11083, - serialized_end=11143, + serialized_start=12199, + serialized_end=12259, ) _GETCONSENSUSPARAMSREQUEST = _descriptor.Descriptor( @@ -3369,8 +3700,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=10958, - serialized_end=11154, + serialized_start=12074, + serialized_end=12270, ) @@ -3415,8 +3746,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=11285, - serialized_end=11365, + serialized_start=12401, + serialized_end=12481, ) _GETCONSENSUSPARAMSRESPONSE_CONSENSUSPARAMSEVIDENCE = _descriptor.Descriptor( @@ -3460,8 +3791,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=11367, - serialized_end=11465, + serialized_start=12483, + serialized_end=12581, ) _GETCONSENSUSPARAMSRESPONSE_GETCONSENSUSPARAMSRESPONSEV0 = _descriptor.Descriptor( @@ -3498,8 +3829,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=11468, - serialized_end=11686, + serialized_start=12584, + serialized_end=12802, ) _GETCONSENSUSPARAMSRESPONSE = _descriptor.Descriptor( @@ -3534,8 +3865,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=11157, - serialized_end=11697, + serialized_start=12273, + serialized_end=12813, ) @@ -3566,8 +3897,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=11861, - serialized_end=11917, + serialized_start=12977, + serialized_end=13033, ) _GETPROTOCOLVERSIONUPGRADESTATEREQUEST = _descriptor.Descriptor( @@ -3602,8 +3933,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=11700, - serialized_end=11928, + serialized_start=12816, + serialized_end=13044, ) @@ -3634,8 +3965,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=12393, - serialized_end=12543, + serialized_start=13509, + serialized_end=13659, ) _GETPROTOCOLVERSIONUPGRADESTATERESPONSE_GETPROTOCOLVERSIONUPGRADESTATERESPONSEV0_VERSIONENTRY = _descriptor.Descriptor( @@ -3672,8 +4003,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=12545, - serialized_end=12603, + serialized_start=13661, + serialized_end=13719, ) _GETPROTOCOLVERSIONUPGRADESTATERESPONSE_GETPROTOCOLVERSIONUPGRADESTATERESPONSEV0 = _descriptor.Descriptor( @@ -3722,8 +4053,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=12096, - serialized_end=12613, + serialized_start=13212, + serialized_end=13729, ) _GETPROTOCOLVERSIONUPGRADESTATERESPONSE = _descriptor.Descriptor( @@ -3758,8 +4089,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=11931, - serialized_end=12624, + serialized_start=13047, + serialized_end=13740, ) @@ -3804,8 +4135,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=12804, - serialized_end=12907, + serialized_start=13920, + serialized_end=14023, ) _GETPROTOCOLVERSIONUPGRADEVOTESTATUSREQUEST = _descriptor.Descriptor( @@ -3840,8 +4171,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=12627, - serialized_end=12918, + serialized_start=13743, + serialized_end=14034, ) @@ -3872,8 +4203,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=13421, - serialized_end=13596, + serialized_start=14537, + serialized_end=14712, ) _GETPROTOCOLVERSIONUPGRADEVOTESTATUSRESPONSE_GETPROTOCOLVERSIONUPGRADEVOTESTATUSRESPONSEV0_VERSIONSIGNAL = _descriptor.Descriptor( @@ -3910,8 +4241,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=13598, - serialized_end=13651, + serialized_start=14714, + serialized_end=14767, ) _GETPROTOCOLVERSIONUPGRADEVOTESTATUSRESPONSE_GETPROTOCOLVERSIONUPGRADEVOTESTATUSRESPONSEV0 = _descriptor.Descriptor( @@ -3960,8 +4291,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=13102, - serialized_end=13661, + serialized_start=14218, + serialized_end=14777, ) _GETPROTOCOLVERSIONUPGRADEVOTESTATUSRESPONSE = _descriptor.Descriptor( @@ -3996,8 +4327,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=12921, - serialized_end=13672, + serialized_start=14037, + serialized_end=14788, ) @@ -4049,8 +4380,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=13785, - serialized_end=13909, + serialized_start=14901, + serialized_end=15025, ) _GETEPOCHSINFOREQUEST = _descriptor.Descriptor( @@ -4085,8 +4416,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=13675, - serialized_end=13920, + serialized_start=14791, + serialized_end=15036, ) @@ -4117,8 +4448,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=14281, - serialized_end=14398, + serialized_start=15397, + serialized_end=15514, ) _GETEPOCHSINFORESPONSE_GETEPOCHSINFORESPONSEV0_EPOCHINFO = _descriptor.Descriptor( @@ -4176,8 +4507,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=14401, - serialized_end=14533, + serialized_start=15517, + serialized_end=15649, ) _GETEPOCHSINFORESPONSE_GETEPOCHSINFORESPONSEV0 = _descriptor.Descriptor( @@ -4226,8 +4557,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=14037, - serialized_end=14543, + serialized_start=15153, + serialized_end=15659, ) _GETEPOCHSINFORESPONSE = _descriptor.Descriptor( @@ -4262,8 +4593,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=13923, - serialized_end=14554, + serialized_start=15039, + serialized_end=15670, ) _GETIDENTITYREQUEST_GETIDENTITYREQUESTV0.containing_type = _GETIDENTITYREQUEST @@ -4271,6 +4602,16 @@ _GETIDENTITYREQUEST.oneofs_by_name['version'].fields.append( _GETIDENTITYREQUEST.fields_by_name['v0']) _GETIDENTITYREQUEST.fields_by_name['v0'].containing_oneof = _GETIDENTITYREQUEST.oneofs_by_name['version'] +_GETIDENTITYNONCEREQUEST_GETIDENTITYNONCEREQUESTV0.containing_type = _GETIDENTITYNONCEREQUEST +_GETIDENTITYNONCEREQUEST.fields_by_name['v0'].message_type = _GETIDENTITYNONCEREQUEST_GETIDENTITYNONCEREQUESTV0 +_GETIDENTITYNONCEREQUEST.oneofs_by_name['version'].fields.append( + _GETIDENTITYNONCEREQUEST.fields_by_name['v0']) +_GETIDENTITYNONCEREQUEST.fields_by_name['v0'].containing_oneof = _GETIDENTITYNONCEREQUEST.oneofs_by_name['version'] +_GETIDENTITYCONTRACTNONCEREQUEST_GETIDENTITYCONTRACTNONCEREQUESTV0.containing_type = _GETIDENTITYCONTRACTNONCEREQUEST +_GETIDENTITYCONTRACTNONCEREQUEST.fields_by_name['v0'].message_type = _GETIDENTITYCONTRACTNONCEREQUEST_GETIDENTITYCONTRACTNONCEREQUESTV0 +_GETIDENTITYCONTRACTNONCEREQUEST.oneofs_by_name['version'].fields.append( + _GETIDENTITYCONTRACTNONCEREQUEST.fields_by_name['v0']) +_GETIDENTITYCONTRACTNONCEREQUEST.fields_by_name['v0'].containing_oneof = _GETIDENTITYCONTRACTNONCEREQUEST.oneofs_by_name['version'] _GETIDENTITYBALANCEREQUEST_GETIDENTITYBALANCEREQUESTV0.containing_type = _GETIDENTITYBALANCEREQUEST _GETIDENTITYBALANCEREQUEST.fields_by_name['v0'].message_type = _GETIDENTITYBALANCEREQUEST_GETIDENTITYBALANCEREQUESTV0 _GETIDENTITYBALANCEREQUEST.oneofs_by_name['version'].fields.append( @@ -4318,6 +4659,32 @@ _GETIDENTITIESRESPONSE.oneofs_by_name['version'].fields.append( _GETIDENTITIESRESPONSE.fields_by_name['v0']) _GETIDENTITIESRESPONSE.fields_by_name['v0'].containing_oneof = _GETIDENTITIESRESPONSE.oneofs_by_name['version'] +_GETIDENTITYNONCERESPONSE_GETIDENTITYNONCERESPONSEV0.fields_by_name['proof'].message_type = _PROOF +_GETIDENTITYNONCERESPONSE_GETIDENTITYNONCERESPONSEV0.fields_by_name['metadata'].message_type = _RESPONSEMETADATA +_GETIDENTITYNONCERESPONSE_GETIDENTITYNONCERESPONSEV0.containing_type = _GETIDENTITYNONCERESPONSE +_GETIDENTITYNONCERESPONSE_GETIDENTITYNONCERESPONSEV0.oneofs_by_name['result'].fields.append( + _GETIDENTITYNONCERESPONSE_GETIDENTITYNONCERESPONSEV0.fields_by_name['identity_nonce']) +_GETIDENTITYNONCERESPONSE_GETIDENTITYNONCERESPONSEV0.fields_by_name['identity_nonce'].containing_oneof = _GETIDENTITYNONCERESPONSE_GETIDENTITYNONCERESPONSEV0.oneofs_by_name['result'] +_GETIDENTITYNONCERESPONSE_GETIDENTITYNONCERESPONSEV0.oneofs_by_name['result'].fields.append( + _GETIDENTITYNONCERESPONSE_GETIDENTITYNONCERESPONSEV0.fields_by_name['proof']) +_GETIDENTITYNONCERESPONSE_GETIDENTITYNONCERESPONSEV0.fields_by_name['proof'].containing_oneof = _GETIDENTITYNONCERESPONSE_GETIDENTITYNONCERESPONSEV0.oneofs_by_name['result'] +_GETIDENTITYNONCERESPONSE.fields_by_name['v0'].message_type = _GETIDENTITYNONCERESPONSE_GETIDENTITYNONCERESPONSEV0 +_GETIDENTITYNONCERESPONSE.oneofs_by_name['version'].fields.append( + _GETIDENTITYNONCERESPONSE.fields_by_name['v0']) +_GETIDENTITYNONCERESPONSE.fields_by_name['v0'].containing_oneof = _GETIDENTITYNONCERESPONSE.oneofs_by_name['version'] +_GETIDENTITYCONTRACTNONCERESPONSE_GETIDENTITYCONTRACTNONCERESPONSEV0.fields_by_name['proof'].message_type = _PROOF +_GETIDENTITYCONTRACTNONCERESPONSE_GETIDENTITYCONTRACTNONCERESPONSEV0.fields_by_name['metadata'].message_type = _RESPONSEMETADATA +_GETIDENTITYCONTRACTNONCERESPONSE_GETIDENTITYCONTRACTNONCERESPONSEV0.containing_type = _GETIDENTITYCONTRACTNONCERESPONSE +_GETIDENTITYCONTRACTNONCERESPONSE_GETIDENTITYCONTRACTNONCERESPONSEV0.oneofs_by_name['result'].fields.append( + _GETIDENTITYCONTRACTNONCERESPONSE_GETIDENTITYCONTRACTNONCERESPONSEV0.fields_by_name['identity_contract_nonce']) +_GETIDENTITYCONTRACTNONCERESPONSE_GETIDENTITYCONTRACTNONCERESPONSEV0.fields_by_name['identity_contract_nonce'].containing_oneof = _GETIDENTITYCONTRACTNONCERESPONSE_GETIDENTITYCONTRACTNONCERESPONSEV0.oneofs_by_name['result'] +_GETIDENTITYCONTRACTNONCERESPONSE_GETIDENTITYCONTRACTNONCERESPONSEV0.oneofs_by_name['result'].fields.append( + _GETIDENTITYCONTRACTNONCERESPONSE_GETIDENTITYCONTRACTNONCERESPONSEV0.fields_by_name['proof']) +_GETIDENTITYCONTRACTNONCERESPONSE_GETIDENTITYCONTRACTNONCERESPONSEV0.fields_by_name['proof'].containing_oneof = _GETIDENTITYCONTRACTNONCERESPONSE_GETIDENTITYCONTRACTNONCERESPONSEV0.oneofs_by_name['result'] +_GETIDENTITYCONTRACTNONCERESPONSE.fields_by_name['v0'].message_type = _GETIDENTITYCONTRACTNONCERESPONSE_GETIDENTITYCONTRACTNONCERESPONSEV0 +_GETIDENTITYCONTRACTNONCERESPONSE.oneofs_by_name['version'].fields.append( + _GETIDENTITYCONTRACTNONCERESPONSE.fields_by_name['v0']) +_GETIDENTITYCONTRACTNONCERESPONSE.fields_by_name['v0'].containing_oneof = _GETIDENTITYCONTRACTNONCERESPONSE.oneofs_by_name['version'] _GETIDENTITYBALANCERESPONSE_GETIDENTITYBALANCERESPONSEV0.fields_by_name['proof'].message_type = _PROOF _GETIDENTITYBALANCERESPONSE_GETIDENTITYBALANCERESPONSEV0.fields_by_name['metadata'].message_type = _RESPONSEMETADATA _GETIDENTITYBALANCERESPONSE_GETIDENTITYBALANCERESPONSEV0.containing_type = _GETIDENTITYBALANCERESPONSE @@ -4649,11 +5016,15 @@ DESCRIPTOR.message_types_by_name['BroadcastStateTransitionRequest'] = _BROADCASTSTATETRANSITIONREQUEST DESCRIPTOR.message_types_by_name['BroadcastStateTransitionResponse'] = _BROADCASTSTATETRANSITIONRESPONSE DESCRIPTOR.message_types_by_name['GetIdentityRequest'] = _GETIDENTITYREQUEST +DESCRIPTOR.message_types_by_name['GetIdentityNonceRequest'] = _GETIDENTITYNONCEREQUEST +DESCRIPTOR.message_types_by_name['GetIdentityContractNonceRequest'] = _GETIDENTITYCONTRACTNONCEREQUEST DESCRIPTOR.message_types_by_name['GetIdentityBalanceRequest'] = _GETIDENTITYBALANCEREQUEST DESCRIPTOR.message_types_by_name['GetIdentityBalanceAndRevisionRequest'] = _GETIDENTITYBALANCEANDREVISIONREQUEST DESCRIPTOR.message_types_by_name['GetIdentityResponse'] = _GETIDENTITYRESPONSE DESCRIPTOR.message_types_by_name['GetIdentitiesRequest'] = _GETIDENTITIESREQUEST DESCRIPTOR.message_types_by_name['GetIdentitiesResponse'] = _GETIDENTITIESRESPONSE +DESCRIPTOR.message_types_by_name['GetIdentityNonceResponse'] = _GETIDENTITYNONCERESPONSE +DESCRIPTOR.message_types_by_name['GetIdentityContractNonceResponse'] = _GETIDENTITYCONTRACTNONCERESPONSE DESCRIPTOR.message_types_by_name['GetIdentityBalanceResponse'] = _GETIDENTITYBALANCERESPONSE DESCRIPTOR.message_types_by_name['GetIdentityBalanceAndRevisionResponse'] = _GETIDENTITYBALANCEANDREVISIONRESPONSE DESCRIPTOR.message_types_by_name['KeyRequestType'] = _KEYREQUESTTYPE @@ -4739,6 +5110,36 @@ _sym_db.RegisterMessage(GetIdentityRequest) _sym_db.RegisterMessage(GetIdentityRequest.GetIdentityRequestV0) +GetIdentityNonceRequest = _reflection.GeneratedProtocolMessageType('GetIdentityNonceRequest', (_message.Message,), { + + 'GetIdentityNonceRequestV0' : _reflection.GeneratedProtocolMessageType('GetIdentityNonceRequestV0', (_message.Message,), { + 'DESCRIPTOR' : _GETIDENTITYNONCEREQUEST_GETIDENTITYNONCEREQUESTV0, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0) + }) + , + 'DESCRIPTOR' : _GETIDENTITYNONCEREQUEST, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityNonceRequest) + }) +_sym_db.RegisterMessage(GetIdentityNonceRequest) +_sym_db.RegisterMessage(GetIdentityNonceRequest.GetIdentityNonceRequestV0) + +GetIdentityContractNonceRequest = _reflection.GeneratedProtocolMessageType('GetIdentityContractNonceRequest', (_message.Message,), { + + 'GetIdentityContractNonceRequestV0' : _reflection.GeneratedProtocolMessageType('GetIdentityContractNonceRequestV0', (_message.Message,), { + 'DESCRIPTOR' : _GETIDENTITYCONTRACTNONCEREQUEST_GETIDENTITYCONTRACTNONCEREQUESTV0, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0) + }) + , + 'DESCRIPTOR' : _GETIDENTITYCONTRACTNONCEREQUEST, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityContractNonceRequest) + }) +_sym_db.RegisterMessage(GetIdentityContractNonceRequest) +_sym_db.RegisterMessage(GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0) + GetIdentityBalanceRequest = _reflection.GeneratedProtocolMessageType('GetIdentityBalanceRequest', (_message.Message,), { 'GetIdentityBalanceRequestV0' : _reflection.GeneratedProtocolMessageType('GetIdentityBalanceRequestV0', (_message.Message,), { @@ -4838,6 +5239,36 @@ _sym_db.RegisterMessage(GetIdentitiesResponse.Identities) _sym_db.RegisterMessage(GetIdentitiesResponse.GetIdentitiesResponseV0) +GetIdentityNonceResponse = _reflection.GeneratedProtocolMessageType('GetIdentityNonceResponse', (_message.Message,), { + + 'GetIdentityNonceResponseV0' : _reflection.GeneratedProtocolMessageType('GetIdentityNonceResponseV0', (_message.Message,), { + 'DESCRIPTOR' : _GETIDENTITYNONCERESPONSE_GETIDENTITYNONCERESPONSEV0, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0) + }) + , + 'DESCRIPTOR' : _GETIDENTITYNONCERESPONSE, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityNonceResponse) + }) +_sym_db.RegisterMessage(GetIdentityNonceResponse) +_sym_db.RegisterMessage(GetIdentityNonceResponse.GetIdentityNonceResponseV0) + +GetIdentityContractNonceResponse = _reflection.GeneratedProtocolMessageType('GetIdentityContractNonceResponse', (_message.Message,), { + + 'GetIdentityContractNonceResponseV0' : _reflection.GeneratedProtocolMessageType('GetIdentityContractNonceResponseV0', (_message.Message,), { + 'DESCRIPTOR' : _GETIDENTITYCONTRACTNONCERESPONSE_GETIDENTITYCONTRACTNONCERESPONSEV0, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0) + }) + , + 'DESCRIPTOR' : _GETIDENTITYCONTRACTNONCERESPONSE, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityContractNonceResponse) + }) +_sym_db.RegisterMessage(GetIdentityContractNonceResponse) +_sym_db.RegisterMessage(GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0) + GetIdentityBalanceResponse = _reflection.GeneratedProtocolMessageType('GetIdentityBalanceResponse', (_message.Message,), { 'GetIdentityBalanceResponseV0' : _reflection.GeneratedProtocolMessageType('GetIdentityBalanceResponseV0', (_message.Message,), { @@ -5480,8 +5911,8 @@ index=0, serialized_options=None, create_key=_descriptor._internal_create_key, - serialized_start=14557, - serialized_end=17055, + serialized_start=15673, + serialized_end=18446, methods=[ _descriptor.MethodDescriptor( name='broadcastStateTransition', @@ -5523,10 +5954,30 @@ serialized_options=None, create_key=_descriptor._internal_create_key, ), + _descriptor.MethodDescriptor( + name='getIdentityNonce', + full_name='org.dash.platform.dapi.v0.Platform.getIdentityNonce', + index=4, + containing_service=None, + input_type=_GETIDENTITYNONCEREQUEST, + output_type=_GETIDENTITYNONCERESPONSE, + serialized_options=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.MethodDescriptor( + name='getIdentityContractNonce', + full_name='org.dash.platform.dapi.v0.Platform.getIdentityContractNonce', + index=5, + containing_service=None, + input_type=_GETIDENTITYCONTRACTNONCEREQUEST, + output_type=_GETIDENTITYCONTRACTNONCERESPONSE, + serialized_options=None, + create_key=_descriptor._internal_create_key, + ), _descriptor.MethodDescriptor( name='getIdentityBalance', full_name='org.dash.platform.dapi.v0.Platform.getIdentityBalance', - index=4, + index=6, containing_service=None, input_type=_GETIDENTITYBALANCEREQUEST, output_type=_GETIDENTITYBALANCERESPONSE, @@ -5536,7 +5987,7 @@ _descriptor.MethodDescriptor( name='getIdentityBalanceAndRevision', full_name='org.dash.platform.dapi.v0.Platform.getIdentityBalanceAndRevision', - index=5, + index=7, containing_service=None, input_type=_GETIDENTITYBALANCEANDREVISIONREQUEST, output_type=_GETIDENTITYBALANCEANDREVISIONRESPONSE, @@ -5546,7 +5997,7 @@ _descriptor.MethodDescriptor( name='getProofs', full_name='org.dash.platform.dapi.v0.Platform.getProofs', - index=6, + index=8, containing_service=None, input_type=_GETPROOFSREQUEST, output_type=_GETPROOFSRESPONSE, @@ -5556,7 +6007,7 @@ _descriptor.MethodDescriptor( name='getDataContract', full_name='org.dash.platform.dapi.v0.Platform.getDataContract', - index=7, + index=9, containing_service=None, input_type=_GETDATACONTRACTREQUEST, output_type=_GETDATACONTRACTRESPONSE, @@ -5566,7 +6017,7 @@ _descriptor.MethodDescriptor( name='getDataContractHistory', full_name='org.dash.platform.dapi.v0.Platform.getDataContractHistory', - index=8, + index=10, containing_service=None, input_type=_GETDATACONTRACTHISTORYREQUEST, output_type=_GETDATACONTRACTHISTORYRESPONSE, @@ -5576,7 +6027,7 @@ _descriptor.MethodDescriptor( name='getDataContracts', full_name='org.dash.platform.dapi.v0.Platform.getDataContracts', - index=9, + index=11, containing_service=None, input_type=_GETDATACONTRACTSREQUEST, output_type=_GETDATACONTRACTSRESPONSE, @@ -5586,7 +6037,7 @@ _descriptor.MethodDescriptor( name='getDocuments', full_name='org.dash.platform.dapi.v0.Platform.getDocuments', - index=10, + index=12, containing_service=None, input_type=_GETDOCUMENTSREQUEST, output_type=_GETDOCUMENTSRESPONSE, @@ -5596,7 +6047,7 @@ _descriptor.MethodDescriptor( name='getIdentitiesByPublicKeyHashes', full_name='org.dash.platform.dapi.v0.Platform.getIdentitiesByPublicKeyHashes', - index=11, + index=13, containing_service=None, input_type=_GETIDENTITIESBYPUBLICKEYHASHESREQUEST, output_type=_GETIDENTITIESBYPUBLICKEYHASHESRESPONSE, @@ -5606,7 +6057,7 @@ _descriptor.MethodDescriptor( name='getIdentityByPublicKeyHash', full_name='org.dash.platform.dapi.v0.Platform.getIdentityByPublicKeyHash', - index=12, + index=14, containing_service=None, input_type=_GETIDENTITYBYPUBLICKEYHASHREQUEST, output_type=_GETIDENTITYBYPUBLICKEYHASHRESPONSE, @@ -5616,7 +6067,7 @@ _descriptor.MethodDescriptor( name='waitForStateTransitionResult', full_name='org.dash.platform.dapi.v0.Platform.waitForStateTransitionResult', - index=13, + index=15, containing_service=None, input_type=_WAITFORSTATETRANSITIONRESULTREQUEST, output_type=_WAITFORSTATETRANSITIONRESULTRESPONSE, @@ -5626,7 +6077,7 @@ _descriptor.MethodDescriptor( name='getConsensusParams', full_name='org.dash.platform.dapi.v0.Platform.getConsensusParams', - index=14, + index=16, containing_service=None, input_type=_GETCONSENSUSPARAMSREQUEST, output_type=_GETCONSENSUSPARAMSRESPONSE, @@ -5636,7 +6087,7 @@ _descriptor.MethodDescriptor( name='getProtocolVersionUpgradeState', full_name='org.dash.platform.dapi.v0.Platform.getProtocolVersionUpgradeState', - index=15, + index=17, containing_service=None, input_type=_GETPROTOCOLVERSIONUPGRADESTATEREQUEST, output_type=_GETPROTOCOLVERSIONUPGRADESTATERESPONSE, @@ -5646,7 +6097,7 @@ _descriptor.MethodDescriptor( name='getProtocolVersionUpgradeVoteStatus', full_name='org.dash.platform.dapi.v0.Platform.getProtocolVersionUpgradeVoteStatus', - index=16, + index=18, containing_service=None, input_type=_GETPROTOCOLVERSIONUPGRADEVOTESTATUSREQUEST, output_type=_GETPROTOCOLVERSIONUPGRADEVOTESTATUSRESPONSE, @@ -5656,7 +6107,7 @@ _descriptor.MethodDescriptor( name='getEpochsInfo', full_name='org.dash.platform.dapi.v0.Platform.getEpochsInfo', - index=17, + index=19, containing_service=None, input_type=_GETEPOCHSINFOREQUEST, output_type=_GETEPOCHSINFORESPONSE, diff --git a/packages/dapi-grpc/clients/platform/v0/python/platform_pb2_grpc.py b/packages/dapi-grpc/clients/platform/v0/python/platform_pb2_grpc.py index a28f5122e3..987135cb67 100644 --- a/packages/dapi-grpc/clients/platform/v0/python/platform_pb2_grpc.py +++ b/packages/dapi-grpc/clients/platform/v0/python/platform_pb2_grpc.py @@ -34,6 +34,16 @@ def __init__(self, channel): request_serializer=platform__pb2.GetIdentityKeysRequest.SerializeToString, response_deserializer=platform__pb2.GetIdentityKeysResponse.FromString, ) + self.getIdentityNonce = channel.unary_unary( + '/org.dash.platform.dapi.v0.Platform/getIdentityNonce', + request_serializer=platform__pb2.GetIdentityNonceRequest.SerializeToString, + response_deserializer=platform__pb2.GetIdentityNonceResponse.FromString, + ) + self.getIdentityContractNonce = channel.unary_unary( + '/org.dash.platform.dapi.v0.Platform/getIdentityContractNonce', + request_serializer=platform__pb2.GetIdentityContractNonceRequest.SerializeToString, + response_deserializer=platform__pb2.GetIdentityContractNonceResponse.FromString, + ) self.getIdentityBalance = channel.unary_unary( '/org.dash.platform.dapi.v0.Platform/getIdentityBalance', request_serializer=platform__pb2.GetIdentityBalanceRequest.SerializeToString, @@ -133,6 +143,18 @@ def getIdentityKeys(self, request, context): context.set_details('Method not implemented!') raise NotImplementedError('Method not implemented!') + def getIdentityNonce(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def getIdentityContractNonce(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + def getIdentityBalance(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) @@ -240,6 +262,16 @@ def add_PlatformServicer_to_server(servicer, server): request_deserializer=platform__pb2.GetIdentityKeysRequest.FromString, response_serializer=platform__pb2.GetIdentityKeysResponse.SerializeToString, ), + 'getIdentityNonce': grpc.unary_unary_rpc_method_handler( + servicer.getIdentityNonce, + request_deserializer=platform__pb2.GetIdentityNonceRequest.FromString, + response_serializer=platform__pb2.GetIdentityNonceResponse.SerializeToString, + ), + 'getIdentityContractNonce': grpc.unary_unary_rpc_method_handler( + servicer.getIdentityContractNonce, + request_deserializer=platform__pb2.GetIdentityContractNonceRequest.FromString, + response_serializer=platform__pb2.GetIdentityContractNonceResponse.SerializeToString, + ), 'getIdentityBalance': grpc.unary_unary_rpc_method_handler( servicer.getIdentityBalance, request_deserializer=platform__pb2.GetIdentityBalanceRequest.FromString, @@ -388,6 +420,40 @@ def getIdentityKeys(request, options, channel_credentials, insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + @staticmethod + def getIdentityNonce(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/org.dash.platform.dapi.v0.Platform/getIdentityNonce', + platform__pb2.GetIdentityNonceRequest.SerializeToString, + platform__pb2.GetIdentityNonceResponse.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def getIdentityContractNonce(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/org.dash.platform.dapi.v0.Platform/getIdentityContractNonce', + platform__pb2.GetIdentityContractNonceRequest.SerializeToString, + platform__pb2.GetIdentityContractNonceResponse.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + @staticmethod def getIdentityBalance(request, target, diff --git a/packages/dapi-grpc/clients/platform/v0/web/PlatformPromiseClient.js b/packages/dapi-grpc/clients/platform/v0/web/PlatformPromiseClient.js index fdb3f86fae..35f72fc812 100644 --- a/packages/dapi-grpc/clients/platform/v0/web/PlatformPromiseClient.js +++ b/packages/dapi-grpc/clients/platform/v0/web/PlatformPromiseClient.js @@ -176,6 +176,34 @@ class PlatformPromiseClient { ); } + /** + * @param {!GetIdentityContractNonceRequest} getIdentityContractNonceRequest + * @param {?Object} metadata + * @return {Promise} + */ + getIdentityContractNonce(getIdentityContractNonceRequest, metadata = {}) { + return promisify( + this.client.getIdentityContractNonce.bind(this.client), + )( + getIdentityContractNonceRequest, + metadata, + ); + } + + /** + * @param {!GetIdentityNonceRequest} getIdentityNonceRequest + * @param {?Object} metadata + * @return {Promise} + */ + getIdentityNonce(getIdentityNonceRequest, metadata = {}) { + return promisify( + this.client.getIdentityNonce.bind(this.client), + )( + getIdentityNonceRequest, + metadata, + ); + } + /** * @param {string} protocolVersion */ diff --git a/packages/dapi-grpc/clients/platform/v0/web/platform_pb.d.ts b/packages/dapi-grpc/clients/platform/v0/web/platform_pb.d.ts index 21a1cc42b2..18b2d9fb69 100644 --- a/packages/dapi-grpc/clients/platform/v0/web/platform_pb.d.ts +++ b/packages/dapi-grpc/clients/platform/v0/web/platform_pb.d.ts @@ -216,6 +216,120 @@ export namespace GetIdentityRequest { } } +export class GetIdentityNonceRequest extends jspb.Message { + hasV0(): boolean; + clearV0(): void; + getV0(): GetIdentityNonceRequest.GetIdentityNonceRequestV0 | undefined; + setV0(value?: GetIdentityNonceRequest.GetIdentityNonceRequestV0): void; + + getVersionCase(): GetIdentityNonceRequest.VersionCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetIdentityNonceRequest.AsObject; + static toObject(includeInstance: boolean, msg: GetIdentityNonceRequest): GetIdentityNonceRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: GetIdentityNonceRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetIdentityNonceRequest; + static deserializeBinaryFromReader(message: GetIdentityNonceRequest, reader: jspb.BinaryReader): GetIdentityNonceRequest; +} + +export namespace GetIdentityNonceRequest { + export type AsObject = { + v0?: GetIdentityNonceRequest.GetIdentityNonceRequestV0.AsObject, + } + + export class GetIdentityNonceRequestV0 extends jspb.Message { + getIdentityId(): Uint8Array | string; + getIdentityId_asU8(): Uint8Array; + getIdentityId_asB64(): string; + setIdentityId(value: Uint8Array | string): void; + + getProve(): boolean; + setProve(value: boolean): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetIdentityNonceRequestV0.AsObject; + static toObject(includeInstance: boolean, msg: GetIdentityNonceRequestV0): GetIdentityNonceRequestV0.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: GetIdentityNonceRequestV0, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetIdentityNonceRequestV0; + static deserializeBinaryFromReader(message: GetIdentityNonceRequestV0, reader: jspb.BinaryReader): GetIdentityNonceRequestV0; + } + + export namespace GetIdentityNonceRequestV0 { + export type AsObject = { + identityId: Uint8Array | string, + prove: boolean, + } + } + + export enum VersionCase { + VERSION_NOT_SET = 0, + V0 = 1, + } +} + +export class GetIdentityContractNonceRequest extends jspb.Message { + hasV0(): boolean; + clearV0(): void; + getV0(): GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0 | undefined; + setV0(value?: GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0): void; + + getVersionCase(): GetIdentityContractNonceRequest.VersionCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetIdentityContractNonceRequest.AsObject; + static toObject(includeInstance: boolean, msg: GetIdentityContractNonceRequest): GetIdentityContractNonceRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: GetIdentityContractNonceRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetIdentityContractNonceRequest; + static deserializeBinaryFromReader(message: GetIdentityContractNonceRequest, reader: jspb.BinaryReader): GetIdentityContractNonceRequest; +} + +export namespace GetIdentityContractNonceRequest { + export type AsObject = { + v0?: GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.AsObject, + } + + export class GetIdentityContractNonceRequestV0 extends jspb.Message { + getIdentityId(): Uint8Array | string; + getIdentityId_asU8(): Uint8Array; + getIdentityId_asB64(): string; + setIdentityId(value: Uint8Array | string): void; + + getContractId(): Uint8Array | string; + getContractId_asU8(): Uint8Array; + getContractId_asB64(): string; + setContractId(value: Uint8Array | string): void; + + getProve(): boolean; + setProve(value: boolean): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetIdentityContractNonceRequestV0.AsObject; + static toObject(includeInstance: boolean, msg: GetIdentityContractNonceRequestV0): GetIdentityContractNonceRequestV0.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: GetIdentityContractNonceRequestV0, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetIdentityContractNonceRequestV0; + static deserializeBinaryFromReader(message: GetIdentityContractNonceRequestV0, reader: jspb.BinaryReader): GetIdentityContractNonceRequestV0; + } + + export namespace GetIdentityContractNonceRequestV0 { + export type AsObject = { + identityId: Uint8Array | string, + contractId: Uint8Array | string, + prove: boolean, + } + } + + export enum VersionCase { + VERSION_NOT_SET = 0, + V0 = 1, + } +} + export class GetIdentityBalanceRequest extends jspb.Message { hasV0(): boolean; clearV0(): void; @@ -592,6 +706,144 @@ export namespace GetIdentitiesResponse { } } +export class GetIdentityNonceResponse extends jspb.Message { + hasV0(): boolean; + clearV0(): void; + getV0(): GetIdentityNonceResponse.GetIdentityNonceResponseV0 | undefined; + setV0(value?: GetIdentityNonceResponse.GetIdentityNonceResponseV0): void; + + getVersionCase(): GetIdentityNonceResponse.VersionCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetIdentityNonceResponse.AsObject; + static toObject(includeInstance: boolean, msg: GetIdentityNonceResponse): GetIdentityNonceResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: GetIdentityNonceResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetIdentityNonceResponse; + static deserializeBinaryFromReader(message: GetIdentityNonceResponse, reader: jspb.BinaryReader): GetIdentityNonceResponse; +} + +export namespace GetIdentityNonceResponse { + export type AsObject = { + v0?: GetIdentityNonceResponse.GetIdentityNonceResponseV0.AsObject, + } + + export class GetIdentityNonceResponseV0 extends jspb.Message { + hasIdentityNonce(): boolean; + clearIdentityNonce(): void; + getIdentityNonce(): number; + setIdentityNonce(value: number): void; + + hasProof(): boolean; + clearProof(): void; + getProof(): Proof | undefined; + setProof(value?: Proof): void; + + hasMetadata(): boolean; + clearMetadata(): void; + getMetadata(): ResponseMetadata | undefined; + setMetadata(value?: ResponseMetadata): void; + + getResultCase(): GetIdentityNonceResponseV0.ResultCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetIdentityNonceResponseV0.AsObject; + static toObject(includeInstance: boolean, msg: GetIdentityNonceResponseV0): GetIdentityNonceResponseV0.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: GetIdentityNonceResponseV0, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetIdentityNonceResponseV0; + static deserializeBinaryFromReader(message: GetIdentityNonceResponseV0, reader: jspb.BinaryReader): GetIdentityNonceResponseV0; + } + + export namespace GetIdentityNonceResponseV0 { + export type AsObject = { + identityNonce: number, + proof?: Proof.AsObject, + metadata?: ResponseMetadata.AsObject, + } + + export enum ResultCase { + RESULT_NOT_SET = 0, + IDENTITY_NONCE = 1, + PROOF = 2, + } + } + + export enum VersionCase { + VERSION_NOT_SET = 0, + V0 = 1, + } +} + +export class GetIdentityContractNonceResponse extends jspb.Message { + hasV0(): boolean; + clearV0(): void; + getV0(): GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0 | undefined; + setV0(value?: GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0): void; + + getVersionCase(): GetIdentityContractNonceResponse.VersionCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetIdentityContractNonceResponse.AsObject; + static toObject(includeInstance: boolean, msg: GetIdentityContractNonceResponse): GetIdentityContractNonceResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: GetIdentityContractNonceResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetIdentityContractNonceResponse; + static deserializeBinaryFromReader(message: GetIdentityContractNonceResponse, reader: jspb.BinaryReader): GetIdentityContractNonceResponse; +} + +export namespace GetIdentityContractNonceResponse { + export type AsObject = { + v0?: GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.AsObject, + } + + export class GetIdentityContractNonceResponseV0 extends jspb.Message { + hasIdentityContractNonce(): boolean; + clearIdentityContractNonce(): void; + getIdentityContractNonce(): number; + setIdentityContractNonce(value: number): void; + + hasProof(): boolean; + clearProof(): void; + getProof(): Proof | undefined; + setProof(value?: Proof): void; + + hasMetadata(): boolean; + clearMetadata(): void; + getMetadata(): ResponseMetadata | undefined; + setMetadata(value?: ResponseMetadata): void; + + getResultCase(): GetIdentityContractNonceResponseV0.ResultCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetIdentityContractNonceResponseV0.AsObject; + static toObject(includeInstance: boolean, msg: GetIdentityContractNonceResponseV0): GetIdentityContractNonceResponseV0.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: GetIdentityContractNonceResponseV0, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetIdentityContractNonceResponseV0; + static deserializeBinaryFromReader(message: GetIdentityContractNonceResponseV0, reader: jspb.BinaryReader): GetIdentityContractNonceResponseV0; + } + + export namespace GetIdentityContractNonceResponseV0 { + export type AsObject = { + identityContractNonce: number, + proof?: Proof.AsObject, + metadata?: ResponseMetadata.AsObject, + } + + export enum ResultCase { + RESULT_NOT_SET = 0, + IDENTITY_CONTRACT_NONCE = 1, + PROOF = 2, + } + } + + export enum VersionCase { + VERSION_NOT_SET = 0, + V0 = 1, + } +} + export class GetIdentityBalanceResponse extends jspb.Message { hasV0(): boolean; clearV0(): void; diff --git a/packages/dapi-grpc/clients/platform/v0/web/platform_pb.js b/packages/dapi-grpc/clients/platform/v0/web/platform_pb.js index b22490b4b7..13ebdab355 100644 --- a/packages/dapi-grpc/clients/platform/v0/web/platform_pb.js +++ b/packages/dapi-grpc/clients/platform/v0/web/platform_pb.js @@ -116,6 +116,13 @@ goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRes goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.ResultCase', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.ResultCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.VersionCase', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.VersionCase', null, { proto }); @@ -124,6 +131,13 @@ goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetId goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.ResultCase', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.ResultCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.VersionCase', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityRequest', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityRequest.VersionCase', null, { proto }); @@ -323,6 +337,90 @@ if (goog.DEBUG && !COMPILED) { */ proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0'; } +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0'; +} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -596,6 +694,90 @@ if (goog.DEBUG && !COMPILED) { */ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0'; } +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0'; +} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -3791,21 +3973,21 @@ proto.org.dash.platform.dapi.v0.GetIdentityRequest.prototype.hasV0 = function() * @private {!Array>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.VersionCase = { +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.oneofGroups_[0])); }; @@ -3823,8 +4005,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.toObject(opt_includeInstance, this); }; @@ -3833,13 +4015,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.toObject = f * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -3853,23 +4035,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.toObject = function(in /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest; - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest; + return proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -3877,8 +4059,8 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.deserializeBinaryFromR var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -3894,9 +4076,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.deserializeBinaryFromR * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -3904,18 +4086,18 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.serializeBin /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.serializeBinaryToWriter ); } }; @@ -3937,8 +4119,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.toObject(opt_includeInstance, this); }; @@ -3947,13 +4129,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequ * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - id: msg.getId_asB64(), + identityId: msg.getIdentityId_asB64(), prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) }; @@ -3968,23 +4150,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequ /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0; - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0; + return proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -3993,7 +4175,7 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequ switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setId(value); + msg.setIdentityId(value); break; case 2: var value = /** @type {boolean} */ (reader.readBool()); @@ -4012,9 +4194,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequ * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -4022,13 +4204,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequ /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getId_asU8(); + f = message.getIdentityId_asU8(); if (f.length > 0) { writer.writeBytes( 1, @@ -4046,43 +4228,43 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequ /** - * optional bytes id = 1; + * optional bytes identity_id = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.getId = function() { +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.prototype.getIdentityId = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional bytes id = 1; - * This is a type-conversion wrapper around `getId()` + * optional bytes identity_id = 1; + * This is a type-conversion wrapper around `getIdentityId()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.getId_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.prototype.getIdentityId_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getId())); + this.getIdentityId())); }; /** - * optional bytes id = 1; + * optional bytes identity_id = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getId()` + * This is a type-conversion wrapper around `getIdentityId()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.getId_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.prototype.getIdentityId_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getId())); + this.getIdentityId())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.setId = function(value) { +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.prototype.setIdentityId = function(value) { return jspb.Message.setProto3BytesField(this, 1, value); }; @@ -4091,44 +4273,44 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequ * optional bool prove = 2; * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.getProve = function() { +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.prototype.getProve = function() { return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); }; /** * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.setProve = function(value) { +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.prototype.setProve = function(value) { return jspb.Message.setProto3BooleanField(this, 2, value); }; /** - * optional GetIdentityBalanceRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} + * optional GetIdentityNonceRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -4137,7 +4319,7 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.clearV0 = fu * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -4151,21 +4333,21 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.hasV0 = func * @private {!Array>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.VersionCase = { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.oneofGroups_[0])); }; @@ -4183,8 +4365,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.toObject(opt_includeInstance, this); }; @@ -4193,13 +4375,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.t * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -4213,23 +4395,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.toObject = /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest; - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest; + return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -4237,8 +4419,8 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.deserialize var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -4254,9 +4436,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.deserialize * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -4264,18 +4446,18 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.s /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.serializeBinaryToWriter ); } }; @@ -4297,8 +4479,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.toObject(opt_includeInstance, this); }; @@ -4307,14 +4489,15 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentity * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - id: msg.getId_asB64(), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + identityId: msg.getIdentityId_asB64(), + contractId: msg.getContractId_asB64(), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) }; if (includeInstance) { @@ -4328,23 +4511,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentity /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0; - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0; + return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -4353,9 +4536,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentity switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setId(value); + msg.setIdentityId(value); break; case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setContractId(value); + break; + case 3: var value = /** @type {boolean} */ (reader.readBool()); msg.setProve(value); break; @@ -4372,9 +4559,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentity * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -4382,23 +4569,30 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentity /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getId_asU8(); + f = message.getIdentityId_asU8(); if (f.length > 0) { writer.writeBytes( 1, f ); } + f = message.getContractId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 2, + f + ); + } f = message.getProve(); if (f) { writer.writeBool( - 2, + 3, f ); } @@ -4406,89 +4600,131 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentity /** - * optional bytes id = 1; + * optional bytes identity_id = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.getId = function() { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.getIdentityId = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional bytes id = 1; - * This is a type-conversion wrapper around `getId()` + * optional bytes identity_id = 1; + * This is a type-conversion wrapper around `getIdentityId()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.getId_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.getIdentityId_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getId())); + this.getIdentityId())); }; /** - * optional bytes id = 1; + * optional bytes identity_id = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getId()` + * This is a type-conversion wrapper around `getIdentityId()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.getId_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.getIdentityId_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getId())); + this.getIdentityId())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.setId = function(value) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.setIdentityId = function(value) { return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * optional bool prove = 2; + * optional bytes contract_id = 2; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.getContractId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * optional bytes contract_id = 2; + * This is a type-conversion wrapper around `getContractId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.getContractId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getContractId())); +}; + + +/** + * optional bytes contract_id = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getContractId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.getContractId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getContractId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.setContractId = function(value) { + return jspb.Message.setProto3BytesField(this, 2, value); +}; + + +/** + * optional bool prove = 3; * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); }; /** * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 3, value); }; /** - * optional GetIdentityBalanceAndRevisionRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} + * optional GetIdentityContractNonceRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -4497,7 +4733,7 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.c * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -4511,21 +4747,21 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.h * @private {!Array>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.VersionCase = { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityResponse.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.oneofGroups_[0])); }; @@ -4543,8 +4779,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.toObject(opt_includeInstance, this); }; @@ -4553,13 +4789,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.toObject = functio * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -4573,23 +4809,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.toObject = function(includeI /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityResponse; - return proto.org.dash.platform.dapi.v0.GetIdentityResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest; + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -4597,8 +4833,8 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.deserializeBinaryFromReader var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -4614,9 +4850,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.deserializeBinaryFromReader * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -4624,50 +4860,24 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.serializeBinary = /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.serializeBinaryToWriter ); } }; -/** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.oneofGroups_ = [[1,2]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.ResultCase = { - RESULT_NOT_SET: 0, - IDENTITY: 1, - PROOF: 2 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.ResultCase} - */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.oneofGroups_[0])); -}; - if (jspb.Message.GENERATE_TO_OBJECT) { @@ -4683,8 +4893,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.toObject(opt_includeInstance, this); }; @@ -4693,15 +4903,14 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.protot * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - identity: msg.getIdentity_asB64(), - proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), - metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + id: msg.getId_asB64(), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) }; if (includeInstance) { @@ -4715,23 +4924,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.toObje /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0; - return proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0; + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -4740,17 +4949,11 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.deseri switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setIdentity(value); + msg.setId(value); break; case 2: - var value = new proto.org.dash.platform.dapi.v0.Proof; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); - msg.setProof(value); - break; - case 3: - var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); - msg.setMetadata(value); + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); break; default: reader.skipField(); @@ -4765,9 +4968,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.deseri * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -4775,196 +4978,113 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.protot /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 1)); - if (f != null) { + f = message.getId_asU8(); + if (f.length > 0) { writer.writeBytes( 1, f ); } - f = message.getProof(); - if (f != null) { - writer.writeMessage( + f = message.getProve(); + if (f) { + writer.writeBool( 2, - f, - proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter - ); - } - f = message.getMetadata(); - if (f != null) { - writer.writeMessage( - 3, - f, - proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + f ); } }; /** - * optional bytes identity = 1; + * optional bytes id = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.getIdentity = function() { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.getId = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional bytes identity = 1; - * This is a type-conversion wrapper around `getIdentity()` + * optional bytes id = 1; + * This is a type-conversion wrapper around `getId()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.getIdentity_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.getId_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getIdentity())); + this.getId())); }; /** - * optional bytes identity = 1; + * optional bytes id = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getIdentity()` + * This is a type-conversion wrapper around `getId()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.getIdentity_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.getId_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getIdentity())); + this.getId())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.setIdentity = function(value) { - return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.oneofGroups_[0], value); -}; - - -/** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.clearIdentity = function() { - return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.oneofGroups_[0], undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.hasIdentity = function() { - return jspb.Message.getField(this, 1) != null; -}; - - -/** - * optional Proof proof = 2; - * @return {?proto.org.dash.platform.dapi.v0.Proof} - */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.getProof = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.clearProof = function() { - return this.setProof(undefined); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.setId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * Returns whether this field is set. + * optional bool prove = 2; * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.hasProof = function() { - return jspb.Message.getField(this, 2) != null; -}; - - -/** - * optional ResponseMetadata metadata = 3; - * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} - */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.getMetadata = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 3, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.clearMetadata = function() { - return this.setMetadata(undefined); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); }; /** - * optional GetIdentityResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} + * optional GetIdentityBalanceRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -4973,7 +5093,7 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.clearV0 = function * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -4987,21 +5107,21 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.hasV0 = function() * @private {!Array>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.VersionCase = { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.oneofGroups_[0])); }; @@ -5019,8 +5139,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.toObject(opt_includeInstance, this); }; @@ -5029,13 +5149,13 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.toObject = functi * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -5049,23 +5169,23 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.toObject = function(include /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesRequest; - return proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest; + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -5073,8 +5193,8 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.deserializeBinaryFromReader var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -5090,9 +5210,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.deserializeBinaryFromReader * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -5100,31 +5220,24 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.serializeBinary = /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.serializeBinaryToWriter ); } }; -/** - * List of repeated fields within this message type. - * @private {!Array} - * @const - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.repeatedFields_ = [1]; - if (jspb.Message.GENERATE_TO_OBJECT) { @@ -5140,8 +5253,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.toObject(opt_includeInstance, this); }; @@ -5150,13 +5263,13 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prot * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - idsList: msg.getIdsList_asB64(), + id: msg.getId_asB64(), prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) }; @@ -5171,23 +5284,23 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.toOb /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0; - return proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0; + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -5196,7 +5309,7 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.dese switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.addIds(value); + msg.setId(value); break; case 2: var value = /** @type {boolean} */ (reader.readBool()); @@ -5215,9 +5328,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.dese * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -5225,15 +5338,15 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prot /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getIdsList_asU8(); + f = message.getId_asU8(); if (f.length > 0) { - writer.writeRepeatedBytes( + writer.writeBytes( 1, f ); @@ -5249,63 +5362,44 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.seri /** - * repeated bytes ids = 1; - * @return {!Array} + * optional bytes id = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.getIdsList = function() { - return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 1)); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.getId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * repeated bytes ids = 1; - * This is a type-conversion wrapper around `getIdsList()` - * @return {!Array} + * optional bytes id = 1; + * This is a type-conversion wrapper around `getId()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.getIdsList_asB64 = function() { - return /** @type {!Array} */ (jspb.Message.bytesListAsB64( - this.getIdsList())); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.getId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getId())); }; /** - * repeated bytes ids = 1; + * optional bytes id = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getIdsList()` - * @return {!Array} + * This is a type-conversion wrapper around `getId()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.getIdsList_asU8 = function() { - return /** @type {!Array} */ (jspb.Message.bytesListAsU8( - this.getIdsList())); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.getId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getId())); }; /** - * @param {!(Array|Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} returns this + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.setIdsList = function(value) { - return jspb.Message.setField(this, 1, value || []); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.addIds = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 1, value, opt_index); -}; - - -/** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.clearIdsList = function() { - return this.setIdsList([]); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.setId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); }; @@ -5313,44 +5407,44 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prot * optional bool prove = 2; * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.getProve = function() { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.getProve = function() { return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); }; /** * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.setProve = function(value) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.setProve = function(value) { return jspb.Message.setProto3BooleanField(this, 2, value); }; /** - * optional GetIdentitiesRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} + * optional GetIdentityBalanceAndRevisionRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -5359,7 +5453,7 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.clearV0 = functio * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -5373,21 +5467,21 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.hasV0 = function( * @private {!Array>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetIdentityResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.VersionCase = { +proto.org.dash.platform.dapi.v0.GetIdentityResponse.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetIdentityResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityResponse.oneofGroups_[0])); }; @@ -5405,8 +5499,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityResponse.toObject(opt_includeInstance, this); }; @@ -5415,13 +5509,13 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.toObject = funct * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityResponse.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -5435,23 +5529,23 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.toObject = function(includ /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse; - return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityResponse; + return proto.org.dash.platform.dapi.v0.GetIdentityResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -5459,8 +5553,8 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.deserializeBinaryFromReade var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -5476,9 +5570,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.deserializeBinaryFromReade * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -5486,24 +5580,50 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.serializeBinary /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.serializeBinaryToWriter ); } }; +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + IDENTITY: 1, + PROOF: 2 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.oneofGroups_[0])); +}; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -5519,8 +5639,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.toObject(opt_includeInstance, this); }; @@ -5529,13 +5649,15 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.prototype.to * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - value: msg.getValue_asB64() + identity: msg.getIdentity_asB64(), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; if (includeInstance) { @@ -5549,23 +5671,23 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.toObject = f /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue; - return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0; + return proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -5574,7 +5696,17 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.deserializeB switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setValue(value); + msg.setIdentity(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); break; default: reader.skipField(); @@ -5589,9 +5721,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.deserializeB * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -5599,128 +5731,1657 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.prototype.se /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getValue_asU8(); - if (f.length > 0) { + f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 1)); + if (f != null) { writer.writeBytes( 1, f ); } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); + } }; /** - * optional bytes value = 1; + * optional bytes identity = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.prototype.getValue = function() { +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.getIdentity = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional bytes value = 1; - * This is a type-conversion wrapper around `getValue()` + * optional bytes identity = 1; + * This is a type-conversion wrapper around `getIdentity()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.prototype.getValue_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.getIdentity_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getValue())); + this.getIdentity())); }; /** - * optional bytes value = 1; + * optional bytes identity = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getValue()` + * This is a type-conversion wrapper around `getIdentity()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.prototype.getValue_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.getIdentity_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getValue())); + this.getIdentity())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.prototype.setValue = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.setIdentity = function(value) { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.oneofGroups_[0], value); }; - - - -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.clearIdentity = function() { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.oneofGroups_[0], undefined); }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.toObject = function(includeInstance, msg) { - var f, obj = { - key: msg.getKey_asB64(), - value: (f = msg.getValue()) && proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.toObject(includeInstance, f) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.hasIdentity = function() { + return jspb.Message.getField(this, 1) != null; }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional GetIdentityResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesRequest; + return proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.serializeBinaryToWriter + ); + } +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.repeatedFields_ = [1]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.toObject = function(includeInstance, msg) { + var f, obj = { + idsList: msg.getIdsList_asB64(), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0; + return proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addIds(value); + break; + case 2: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getIdsList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 1, + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 2, + f + ); + } +}; + + +/** + * repeated bytes ids = 1; + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.getIdsList = function() { + return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 1)); +}; + + +/** + * repeated bytes ids = 1; + * This is a type-conversion wrapper around `getIdsList()` + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.getIdsList_asB64 = function() { + return /** @type {!Array} */ (jspb.Message.bytesListAsB64( + this.getIdsList())); +}; + + +/** + * repeated bytes ids = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIdsList()` + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.getIdsList_asU8 = function() { + return /** @type {!Array} */ (jspb.Message.bytesListAsU8( + this.getIdsList())); +}; + + +/** + * @param {!(Array|Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.setIdsList = function(value) { + return jspb.Message.setField(this, 1, value || []); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.addIds = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.clearIdsList = function() { + return this.setIdsList([]); +}; + + +/** + * optional bool prove = 2; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); +}; + + +/** + * optional GetIdentitiesRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse; + return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.serializeBinaryToWriter + ); + } +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.toObject = function(includeInstance, msg) { + var f, obj = { + value: msg.getValue_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue; + return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setValue(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getValue_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } +}; + + +/** + * optional bytes value = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.prototype.getValue = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes value = 1; + * This is a type-conversion wrapper around `getValue()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.prototype.getValue_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getValue())); +}; + + +/** + * optional bytes value = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getValue()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.prototype.getValue_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getValue())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.prototype.setValue = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.toObject = function(includeInstance, msg) { + var f, obj = { + key: msg.getKey_asB64(), + value: (f = msg.getValue()) && proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry; + return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setKey(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.deserializeBinaryFromReader); + msg.setValue(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getKey_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getValue(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.serializeBinaryToWriter + ); + } +}; + + +/** + * optional bytes key = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.getKey = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes key = 1; + * This is a type-conversion wrapper around `getKey()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.getKey_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getKey())); +}; + + +/** + * optional bytes key = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getKey()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.getKey_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getKey())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.setKey = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional IdentityValue value = 2; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.getValue = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue, 2)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.setValue = function(value) { + return jspb.Message.setWrapperField(this, 2, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.clearValue = function() { + return this.setValue(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.hasValue = function() { + return jspb.Message.getField(this, 2) != null; +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.repeatedFields_ = [1]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.toObject = function(includeInstance, msg) { + var f, obj = { + identityEntriesList: jspb.Message.toObjectList(msg.getIdentityEntriesList(), + proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.toObject, includeInstance) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities; + return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.deserializeBinaryFromReader); + msg.addIdentityEntries(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getIdentityEntriesList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.serializeBinaryToWriter + ); + } +}; + + +/** + * repeated IdentityEntry identity_entries = 1; + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.prototype.getIdentityEntriesList = function() { + return /** @type{!Array} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry, 1)); +}; + + +/** + * @param {!Array} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.prototype.setIdentityEntriesList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry=} opt_value + * @param {number=} opt_index * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.prototype.addIdentityEntries = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.prototype.clearIdentityEntriesList = function() { + return this.setIdentityEntriesList([]); +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + IDENTITIES: 1, + PROOF: 2 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.toObject = function(includeInstance, msg) { + var f, obj = { + identities: (f = msg.getIdentities()) && proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.toObject(includeInstance, f), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0; + return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.deserializeBinaryFromReader); + msg.setIdentities(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getIdentities(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.serializeBinaryToWriter + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); + } +}; + + +/** + * optional Identities identities = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.getIdentities = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.setIdentities = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.clearIdentities = function() { + return this.setIdentities(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.hasIdentities = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional GetIdentitiesResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry; - return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse; + return proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -5728,13 +7389,160 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.deserializeB var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setKey(value); + var value = new proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.serializeBinaryToWriter + ); + } +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + IDENTITY_NONCE: 1, + PROOF: 2 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.toObject = function(includeInstance, msg) { + var f, obj = { + identityNonce: jspb.Message.getFieldWithDefault(msg, 1, 0), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0; + return proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {number} */ (reader.readUint64()); + msg.setIdentityNonce(value); break; case 2: - var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.deserializeBinaryFromReader); - msg.setValue(value); + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); break; default: reader.skipField(); @@ -5746,110 +7554,186 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.deserializeB /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = /** @type {number} */ (jspb.Message.getField(message, 1)); + if (f != null) { + writer.writeUint64( + 1, + f + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); + } +}; + + +/** + * optional uint64 identity_nonce = 1; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.getIdentityNonce = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.setIdentityNonce = function(value) { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.clearIdentityNonce = function() { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_[0], undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.hasIdentityNonce = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_[0], value); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getKey_asU8(); - if (f.length > 0) { - writer.writeBytes( - 1, - f - ); - } - f = message.getValue(); - if (f != null) { - writer.writeMessage( - 2, - f, - proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.serializeBinaryToWriter - ); - } +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); }; /** - * optional bytes key = 1; - * @return {string} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.getKey = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * optional bytes key = 1; - * This is a type-conversion wrapper around `getKey()` - * @return {string} + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.getKey_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getKey())); +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); }; /** - * optional bytes key = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getKey()` - * @return {!Uint8Array} + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.getKey_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getKey())); +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.setKey = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; }; /** - * optional IdentityValue value = 2; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} + * optional GetIdentityNonceResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.getValue = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue, 2)); +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.setValue = function(value) { - return jspb.Message.setWrapperField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.clearValue = function() { - return this.setValue(undefined); +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.clearV0 = function() { + return this.setV0(undefined); }; @@ -5857,18 +7741,36 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.cl * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.hasValue = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * List of repeated fields within this message type. - * @private {!Array} + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.repeatedFields_ = [1]; +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.oneofGroups_[0])); +}; @@ -5885,8 +7787,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.toObject(opt_includeInstance, this); }; @@ -5895,14 +7797,13 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.prototype.toObj * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.toObject = function(includeInstance, msg) { var f, obj = { - identityEntriesList: jspb.Message.toObjectList(msg.getIdentityEntriesList(), - proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.toObject, includeInstance) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -5916,23 +7817,23 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.toObject = func /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities; - return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse; + return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -5940,9 +7841,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.deserializeBina var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.deserializeBinaryFromReader); - msg.addIdentityEntries(value); + var value = new proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.deserializeBinaryFromReader); + msg.setV0(value); break; default: reader.skipField(); @@ -5957,9 +7858,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.deserializeBina * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -5967,61 +7868,23 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.prototype.seria /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getIdentityEntriesList(); - if (f.length > 0) { - writer.writeRepeatedMessage( + f = message.getV0(); + if (f != null) { + writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.serializeBinaryToWriter ); } }; -/** - * repeated IdentityEntry identity_entries = 1; - * @return {!Array} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.prototype.getIdentityEntriesList = function() { - return /** @type{!Array} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry, 1)); -}; - - -/** - * @param {!Array} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.prototype.setIdentityEntriesList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 1, value); -}; - - -/** - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry=} opt_value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.prototype.addIdentityEntries = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry, opt_index); -}; - - -/** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.prototype.clearIdentityEntriesList = function() { - return this.setIdentityEntriesList([]); -}; - - /** * Oneof group definitions for this message. Each group defines the field @@ -6031,22 +7894,22 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.prototype.clear * @private {!Array>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.oneofGroups_ = [[1,2]]; +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_ = [[1,2]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.ResultCase = { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.ResultCase = { RESULT_NOT_SET: 0, - IDENTITIES: 1, + IDENTITY_CONTRACT_NONCE: 1, PROOF: 2 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.ResultCase} + * @return {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.ResultCase} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_[0])); }; @@ -6064,8 +7927,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.toObject(opt_includeInstance, this); }; @@ -6074,13 +7937,13 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.pr * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - identities: (f = msg.getIdentities()) && proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.toObject(includeInstance, f), + identityContractNonce: jspb.Message.getFieldWithDefault(msg, 1, 0), proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; @@ -6096,23 +7959,23 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.to /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0; - return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0; + return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -6120,9 +7983,8 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.de var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.deserializeBinaryFromReader); - msg.setIdentities(value); + var value = /** @type {number} */ (reader.readUint64()); + msg.setIdentityContractNonce(value); break; case 2: var value = new proto.org.dash.platform.dapi.v0.Proof; @@ -6147,9 +8009,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.de * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -6157,18 +8019,17 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.pr /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getIdentities(); + f = /** @type {number} */ (jspb.Message.getField(message, 1)); if (f != null) { - writer.writeMessage( + writer.writeUint64( 1, - f, - proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.serializeBinaryToWriter + f ); } f = message.getProof(); @@ -6191,30 +8052,29 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.se /** - * optional Identities identities = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} + * optional uint64 identity_contract_nonce = 1; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.getIdentities = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities, 1)); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.getIdentityContractNonce = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.setIdentities = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.oneofGroups_[0], value); + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.setIdentityContractNonce = function(value) { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_[0], value); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} returns this + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.clearIdentities = function() { - return this.setIdentities(undefined); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.clearIdentityContractNonce = function() { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_[0], undefined); }; @@ -6222,7 +8082,7 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.pr * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.hasIdentities = function() { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.hasIdentityContractNonce = function() { return jspb.Message.getField(this, 1) != null; }; @@ -6231,7 +8091,7 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.pr * optional Proof proof = 2; * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.getProof = function() { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.getProof = function() { return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; @@ -6239,18 +8099,18 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.pr /** * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.clearProof = function() { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.clearProof = function() { return this.setProof(undefined); }; @@ -6259,7 +8119,7 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.pr * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.hasProof = function() { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.hasProof = function() { return jspb.Message.getField(this, 2) != null; }; @@ -6268,7 +8128,7 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.pr * optional ResponseMetadata metadata = 3; * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.getMetadata = function() { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.getMetadata = function() { return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); }; @@ -6276,18 +8136,18 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.pr /** * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.setMetadata = function(value) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.setMetadata = function(value) { return jspb.Message.setWrapperField(this, 3, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.clearMetadata = function() { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.clearMetadata = function() { return this.setMetadata(undefined); }; @@ -6296,35 +8156,35 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.pr * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.hasMetadata = function() { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.hasMetadata = function() { return jspb.Message.getField(this, 3) != null; }; /** - * optional GetIdentitiesResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} + * optional GetIdentityContractNonceResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -6333,7 +8193,7 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.clearV0 = functi * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; diff --git a/packages/dapi-grpc/clients/platform/v0/web/platform_pb_service.d.ts b/packages/dapi-grpc/clients/platform/v0/web/platform_pb_service.d.ts index eb5810b925..5af3ea8e8f 100644 --- a/packages/dapi-grpc/clients/platform/v0/web/platform_pb_service.d.ts +++ b/packages/dapi-grpc/clients/platform/v0/web/platform_pb_service.d.ts @@ -40,6 +40,24 @@ type PlatformgetIdentityKeys = { readonly responseType: typeof platform_pb.GetIdentityKeysResponse; }; +type PlatformgetIdentityNonce = { + readonly methodName: string; + readonly service: typeof Platform; + readonly requestStream: false; + readonly responseStream: false; + readonly requestType: typeof platform_pb.GetIdentityNonceRequest; + readonly responseType: typeof platform_pb.GetIdentityNonceResponse; +}; + +type PlatformgetIdentityContractNonce = { + readonly methodName: string; + readonly service: typeof Platform; + readonly requestStream: false; + readonly responseStream: false; + readonly requestType: typeof platform_pb.GetIdentityContractNonceRequest; + readonly responseType: typeof platform_pb.GetIdentityContractNonceResponse; +}; + type PlatformgetIdentityBalance = { readonly methodName: string; readonly service: typeof Platform; @@ -172,6 +190,8 @@ export class Platform { static readonly getIdentity: PlatformgetIdentity; static readonly getIdentities: PlatformgetIdentities; static readonly getIdentityKeys: PlatformgetIdentityKeys; + static readonly getIdentityNonce: PlatformgetIdentityNonce; + static readonly getIdentityContractNonce: PlatformgetIdentityContractNonce; static readonly getIdentityBalance: PlatformgetIdentityBalance; static readonly getIdentityBalanceAndRevision: PlatformgetIdentityBalanceAndRevision; static readonly getProofs: PlatformgetProofs; @@ -256,6 +276,24 @@ export class PlatformClient { requestMessage: platform_pb.GetIdentityKeysRequest, callback: (error: ServiceError|null, responseMessage: platform_pb.GetIdentityKeysResponse|null) => void ): UnaryResponse; + getIdentityNonce( + requestMessage: platform_pb.GetIdentityNonceRequest, + metadata: grpc.Metadata, + callback: (error: ServiceError|null, responseMessage: platform_pb.GetIdentityNonceResponse|null) => void + ): UnaryResponse; + getIdentityNonce( + requestMessage: platform_pb.GetIdentityNonceRequest, + callback: (error: ServiceError|null, responseMessage: platform_pb.GetIdentityNonceResponse|null) => void + ): UnaryResponse; + getIdentityContractNonce( + requestMessage: platform_pb.GetIdentityContractNonceRequest, + metadata: grpc.Metadata, + callback: (error: ServiceError|null, responseMessage: platform_pb.GetIdentityContractNonceResponse|null) => void + ): UnaryResponse; + getIdentityContractNonce( + requestMessage: platform_pb.GetIdentityContractNonceRequest, + callback: (error: ServiceError|null, responseMessage: platform_pb.GetIdentityContractNonceResponse|null) => void + ): UnaryResponse; getIdentityBalance( requestMessage: platform_pb.GetIdentityBalanceRequest, metadata: grpc.Metadata, diff --git a/packages/dapi-grpc/clients/platform/v0/web/platform_pb_service.js b/packages/dapi-grpc/clients/platform/v0/web/platform_pb_service.js index f0857a73bc..1d5d8278dc 100644 --- a/packages/dapi-grpc/clients/platform/v0/web/platform_pb_service.js +++ b/packages/dapi-grpc/clients/platform/v0/web/platform_pb_service.js @@ -46,6 +46,24 @@ Platform.getIdentityKeys = { responseType: platform_pb.GetIdentityKeysResponse }; +Platform.getIdentityNonce = { + methodName: "getIdentityNonce", + service: Platform, + requestStream: false, + responseStream: false, + requestType: platform_pb.GetIdentityNonceRequest, + responseType: platform_pb.GetIdentityNonceResponse +}; + +Platform.getIdentityContractNonce = { + methodName: "getIdentityContractNonce", + service: Platform, + requestStream: false, + responseStream: false, + requestType: platform_pb.GetIdentityContractNonceRequest, + responseType: platform_pb.GetIdentityContractNonceResponse +}; + Platform.getIdentityBalance = { methodName: "getIdentityBalance", service: Platform, @@ -303,6 +321,68 @@ PlatformClient.prototype.getIdentityKeys = function getIdentityKeys(requestMessa }; }; +PlatformClient.prototype.getIdentityNonce = function getIdentityNonce(requestMessage, metadata, callback) { + if (arguments.length === 2) { + callback = arguments[1]; + } + var client = grpc.unary(Platform.getIdentityNonce, { + request: requestMessage, + host: this.serviceHost, + metadata: metadata, + transport: this.options.transport, + debug: this.options.debug, + onEnd: function (response) { + if (callback) { + if (response.status !== grpc.Code.OK) { + var err = new Error(response.statusMessage); + err.code = response.status; + err.metadata = response.trailers; + callback(err, null); + } else { + callback(null, response.message); + } + } + } + }); + return { + cancel: function () { + callback = null; + client.close(); + } + }; +}; + +PlatformClient.prototype.getIdentityContractNonce = function getIdentityContractNonce(requestMessage, metadata, callback) { + if (arguments.length === 2) { + callback = arguments[1]; + } + var client = grpc.unary(Platform.getIdentityContractNonce, { + request: requestMessage, + host: this.serviceHost, + metadata: metadata, + transport: this.options.transport, + debug: this.options.debug, + onEnd: function (response) { + if (callback) { + if (response.status !== grpc.Code.OK) { + var err = new Error(response.statusMessage); + err.code = response.status; + err.metadata = response.trailers; + callback(err, null); + } else { + callback(null, response.message); + } + } + } + }); + return { + cancel: function () { + callback = null; + client.close(); + } + }; +}; + PlatformClient.prototype.getIdentityBalance = function getIdentityBalance(requestMessage, metadata, callback) { if (arguments.length === 2) { callback = arguments[1]; diff --git a/packages/dapi-grpc/protos/platform/v0/platform.proto b/packages/dapi-grpc/protos/platform/v0/platform.proto index a8b6f566a6..f39ef8cc16 100644 --- a/packages/dapi-grpc/protos/platform/v0/platform.proto +++ b/packages/dapi-grpc/protos/platform/v0/platform.proto @@ -12,6 +12,8 @@ service Platform { rpc getIdentity(GetIdentityRequest) returns (GetIdentityResponse); rpc getIdentities(GetIdentitiesRequest) returns (GetIdentitiesResponse); rpc getIdentityKeys(GetIdentityKeysRequest) returns (GetIdentityKeysResponse); + rpc getIdentityNonce(GetIdentityNonceRequest) returns (GetIdentityNonceResponse); + rpc getIdentityContractNonce(GetIdentityContractNonceRequest) returns (GetIdentityContractNonceResponse); rpc getIdentityBalance(GetIdentityBalanceRequest) returns (GetIdentityBalanceResponse); rpc getIdentityBalanceAndRevision(GetIdentityBalanceAndRevisionRequest) @@ -74,6 +76,28 @@ message GetIdentityRequest { oneof version { GetIdentityRequestV0 v0 = 1; } } +message GetIdentityNonceRequest { + + message GetIdentityNonceRequestV0 { + bytes identity_id = 1; + bool prove = 2; + } + + oneof version { GetIdentityNonceRequestV0 v0 = 1; } +} + + +message GetIdentityContractNonceRequest { + + message GetIdentityContractNonceRequestV0 { + bytes identity_id = 1; + bytes contract_id = 2; + bool prove = 3; + } + + oneof version { GetIdentityContractNonceRequestV0 v0 = 1; } +} + message GetIdentityBalanceRequest { message GetIdentityBalanceRequestV0 { @@ -139,6 +163,32 @@ message GetIdentitiesResponse { oneof version { GetIdentitiesResponseV0 v0 = 1; } } +message GetIdentityNonceResponse { + + message GetIdentityNonceResponseV0 { + oneof result { + uint64 identity_nonce = 1; + Proof proof = 2; + } + ResponseMetadata metadata = 3; + } + + oneof version { GetIdentityNonceResponseV0 v0 = 1; } +} + +message GetIdentityContractNonceResponse { + + message GetIdentityContractNonceResponseV0 { + oneof result { + uint64 identity_contract_nonce = 1; + Proof proof = 2; + } + ResponseMetadata metadata = 3; + } + + oneof version { GetIdentityContractNonceResponseV0 v0 = 1; } +} + message GetIdentityBalanceResponse { message GetIdentityBalanceResponseV0 { diff --git a/packages/dapi-grpc/src/platform/proto/org.dash.platform.dapi.v0.rs b/packages/dapi-grpc/src/platform/proto/org.dash.platform.dapi.v0.rs index 7cc0f6880d..48bbf3a222 100644 --- a/packages/dapi-grpc/src/platform/proto/org.dash.platform.dapi.v0.rs +++ b/packages/dapi-grpc/src/platform/proto/org.dash.platform.dapi.v0.rs @@ -111,6 +111,76 @@ pub mod get_identity_request { #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] +pub struct GetIdentityNonceRequest { + #[prost(oneof = "get_identity_nonce_request::Version", tags = "1")] + pub version: ::core::option::Option, +} +/// Nested message and enum types in `GetIdentityNonceRequest`. +pub mod get_identity_nonce_request { + #[derive(::serde::Serialize, ::serde::Deserialize)] + #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct GetIdentityNonceRequestV0 { + #[prost(bytes = "vec", tag = "1")] + #[serde(with = "serde_bytes")] + pub identity_id: ::prost::alloc::vec::Vec, + #[prost(bool, tag = "2")] + pub prove: bool, + } + #[derive(::serde::Serialize, ::serde::Deserialize)] + #[serde(rename_all = "snake_case")] + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Version { + #[prost(message, tag = "1")] + V0(GetIdentityNonceRequestV0), + } +} +#[derive(::serde::Serialize, ::serde::Deserialize)] +#[serde(rename_all = "snake_case")] +#[derive(::dapi_grpc_macros::VersionedGrpcMessage)] +#[grpc_versions(0)] +#[derive(::dapi_grpc_macros::Mockable)] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct GetIdentityContractNonceRequest { + #[prost(oneof = "get_identity_contract_nonce_request::Version", tags = "1")] + pub version: ::core::option::Option, +} +/// Nested message and enum types in `GetIdentityContractNonceRequest`. +pub mod get_identity_contract_nonce_request { + #[derive(::serde::Serialize, ::serde::Deserialize)] + #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct GetIdentityContractNonceRequestV0 { + #[prost(bytes = "vec", tag = "1")] + #[serde(with = "serde_bytes")] + pub identity_id: ::prost::alloc::vec::Vec, + #[prost(bytes = "vec", tag = "2")] + pub contract_id: ::prost::alloc::vec::Vec, + #[prost(bool, tag = "3")] + pub prove: bool, + } + #[derive(::serde::Serialize, ::serde::Deserialize)] + #[serde(rename_all = "snake_case")] + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Version { + #[prost(message, tag = "1")] + V0(GetIdentityContractNonceRequestV0), + } +} +#[derive(::serde::Serialize, ::serde::Deserialize)] +#[serde(rename_all = "snake_case")] +#[derive(::dapi_grpc_macros::VersionedGrpcMessage)] +#[grpc_versions(0)] +#[derive(::dapi_grpc_macros::Mockable)] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] pub struct GetIdentityBalanceRequest { #[prost(oneof = "get_identity_balance_request::Version", tags = "1")] pub version: ::core::option::Option, @@ -345,6 +415,109 @@ pub mod get_identities_response { #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] +pub struct GetIdentityNonceResponse { + #[prost(oneof = "get_identity_nonce_response::Version", tags = "1")] + pub version: ::core::option::Option, +} +/// Nested message and enum types in `GetIdentityNonceResponse`. +pub mod get_identity_nonce_response { + #[derive(::serde::Serialize, ::serde::Deserialize)] + #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct GetIdentityNonceResponseV0 { + #[prost(message, optional, tag = "3")] + pub metadata: ::core::option::Option, + #[prost(oneof = "get_identity_nonce_response_v0::Result", tags = "1, 2")] + pub result: ::core::option::Option, + } + /// Nested message and enum types in `GetIdentityNonceResponseV0`. + pub mod get_identity_nonce_response_v0 { + #[derive(::serde::Serialize, ::serde::Deserialize)] + #[serde(rename_all = "snake_case")] + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Result { + #[prost(uint64, tag = "1")] + IdentityNonce(u64), + #[prost(message, tag = "2")] + Proof(super::super::Proof), + } + } + #[derive(::serde::Serialize, ::serde::Deserialize)] + #[serde(rename_all = "snake_case")] + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Version { + #[prost(message, tag = "1")] + V0(GetIdentityNonceResponseV0), + } +} +#[derive(::serde::Serialize, ::serde::Deserialize)] +#[serde(rename_all = "snake_case")] +#[derive( + ::dapi_grpc_macros::VersionedGrpcMessage, + ::dapi_grpc_macros::VersionedGrpcResponse +)] +#[grpc_versions(0)] +#[derive(::dapi_grpc_macros::Mockable)] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct GetIdentityContractNonceResponse { + #[prost(oneof = "get_identity_contract_nonce_response::Version", tags = "1")] + pub version: ::core::option::Option, +} +/// Nested message and enum types in `GetIdentityContractNonceResponse`. +pub mod get_identity_contract_nonce_response { + #[derive(::serde::Serialize, ::serde::Deserialize)] + #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct GetIdentityContractNonceResponseV0 { + #[prost(message, optional, tag = "3")] + pub metadata: ::core::option::Option, + #[prost( + oneof = "get_identity_contract_nonce_response_v0::Result", + tags = "1, 2" + )] + pub result: ::core::option::Option< + get_identity_contract_nonce_response_v0::Result, + >, + } + /// Nested message and enum types in `GetIdentityContractNonceResponseV0`. + pub mod get_identity_contract_nonce_response_v0 { + #[derive(::serde::Serialize, ::serde::Deserialize)] + #[serde(rename_all = "snake_case")] + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Result { + #[prost(uint64, tag = "1")] + IdentityContractNonce(u64), + #[prost(message, tag = "2")] + Proof(super::super::Proof), + } + } + #[derive(::serde::Serialize, ::serde::Deserialize)] + #[serde(rename_all = "snake_case")] + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Version { + #[prost(message, tag = "1")] + V0(GetIdentityContractNonceResponseV0), + } +} +#[derive(::serde::Serialize, ::serde::Deserialize)] +#[serde(rename_all = "snake_case")] +#[derive( + ::dapi_grpc_macros::VersionedGrpcMessage, + ::dapi_grpc_macros::VersionedGrpcResponse +)] +#[grpc_versions(0)] +#[derive(::dapi_grpc_macros::Mockable)] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] pub struct GetIdentityBalanceResponse { #[prost(oneof = "get_identity_balance_response::Version", tags = "1")] pub version: ::core::option::Option, @@ -2161,6 +2334,66 @@ pub mod platform_client { ); self.inner.unary(req, path, codec).await } + pub async fn get_identity_nonce( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/org.dash.platform.dapi.v0.Platform/getIdentityNonce", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "org.dash.platform.dapi.v0.Platform", + "getIdentityNonce", + ), + ); + self.inner.unary(req, path, codec).await + } + pub async fn get_identity_contract_nonce( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/org.dash.platform.dapi.v0.Platform/getIdentityContractNonce", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "org.dash.platform.dapi.v0.Platform", + "getIdentityContractNonce", + ), + ); + self.inner.unary(req, path, codec).await + } pub async fn get_identity_balance( &mut self, request: impl tonic::IntoRequest, diff --git a/packages/dapi-grpc/test/unit/clients/platform/v0/nodejs/PlatformPromiseClient.spec.js b/packages/dapi-grpc/test/unit/clients/platform/v0/nodejs/PlatformPromiseClient.spec.js index 084d444b51..78efcbe41d 100644 --- a/packages/dapi-grpc/test/unit/clients/platform/v0/nodejs/PlatformPromiseClient.spec.js +++ b/packages/dapi-grpc/test/unit/clients/platform/v0/nodejs/PlatformPromiseClient.spec.js @@ -18,6 +18,8 @@ describe('PlatformPromiseClient', () => { getEpochsInfo: this.sinon.stub().resolves(response), getProtocolVersionUpgradeVoteStatus: this.sinon.stub().resolves(response), getProtocolVersionUpgradeState: this.sinon.stub().resolves(response), + getIdentityContractNonce: this.sinon.stub().resolves(response), + getIdentityNonce: this.sinon.stub().resolves(response), }; }); @@ -116,4 +118,24 @@ describe('PlatformPromiseClient', () => { .to.be.calledOnceWith(request); }); }); + + describe('#getIdentityContractNonce', () => { + it('should get identity contract nonce', async () => { + const result = await platformPromiseClient.getIdentityContractNonce(request); + + expect(result).to.equal(response); + expect(platformPromiseClient.client.getIdentityContractNonce) + .to.be.calledOnceWith(request); + }); + }); + + describe('#getIdentityNonce', () => { + it('should get identity nonce', async () => { + const result = await platformPromiseClient.getIdentityNonce(request); + + expect(result).to.equal(response); + expect(platformPromiseClient.client.getIdentityNonce) + .to.be.calledOnceWith(request); + }); + }); }); diff --git a/packages/dapi/lib/externalApis/drive/DriveClient.js b/packages/dapi/lib/externalApis/drive/DriveClient.js index 3c1de0dfed..7614990771 100644 --- a/packages/dapi/lib/externalApis/drive/DriveClient.js +++ b/packages/dapi/lib/externalApis/drive/DriveClient.js @@ -254,6 +254,32 @@ class DriveClient { request.serializeBinary(), ); } + + /** + * Fetch identity contract nonce + * + * @param {GetIdentityContractNonceRequest} request + * @return {Promise} + */ + async fetchIdentityContractNonce(request) { + return this.request( + '/identity/contractNonce', + request.serializeBinary(), + ); + } + + /** + * Fetch identity nonce + * + * @param {GetIdentityNonceRequest} request + * @return {Promise} + */ + async fetchIdentityNonce(request) { + return this.request( + '/identity/nonce', + request.serializeBinary(), + ); + } } module.exports = DriveClient; diff --git a/packages/dapi/lib/grpcServer/handlers/platform/getIdentityContractNonceHandlerFactory.js b/packages/dapi/lib/grpcServer/handlers/platform/getIdentityContractNonceHandlerFactory.js new file mode 100644 index 0000000000..3109022c92 --- /dev/null +++ b/packages/dapi/lib/grpcServer/handlers/platform/getIdentityContractNonceHandlerFactory.js @@ -0,0 +1,33 @@ +const { + v0: { + GetIdentityContractNonceResponse, + }, +} = require('@dashevo/dapi-grpc'); + +/** + * @param {DriveClient} driveClient + * + * @returns {getIdentityContractNonceHandler} + */ +function getIdentityContractNonceHandlerFactory(driveClient) { + /** + * @typedef getIdentityContractNonceHandler + * + * @param {Object} call + * + * @return {Promise} + */ + async function getIdentityContractNonceHandler(call) { + const { request } = call; + + const identityContractNonceBuffer = await driveClient + .fetchIdentityContractNonce(request); + + return GetIdentityContractNonceResponse + .deserializeBinary(identityContractNonceBuffer); + } + + return getIdentityContractNonceHandler; +} + +module.exports = getIdentityContractNonceHandlerFactory; diff --git a/packages/dapi/lib/grpcServer/handlers/platform/getIdentityNonceHandlerFactory.js b/packages/dapi/lib/grpcServer/handlers/platform/getIdentityNonceHandlerFactory.js new file mode 100644 index 0000000000..5d38ca9306 --- /dev/null +++ b/packages/dapi/lib/grpcServer/handlers/platform/getIdentityNonceHandlerFactory.js @@ -0,0 +1,33 @@ +const { + v0: { + GetIdentityNonceResponse, + }, +} = require('@dashevo/dapi-grpc'); + +/** + * @param {DriveClient} driveClient + * + * @returns {getIdentityNonceHandler} + */ +function getIdentityNonceHandlerFactory(driveClient) { + /** + * @typedef getIdentityNonceHandler + * + * @param {Object} call + * + * @return {Promise} + */ + async function getIdentityNonceHandler(call) { + const { request } = call; + + const identityNonceBuffer = await driveClient + .fetchIdentityNonce(request); + + return GetIdentityNonceResponse + .deserializeBinary(identityNonceBuffer); + } + + return getIdentityNonceHandler; +} + +module.exports = getIdentityNonceHandlerFactory; diff --git a/packages/dapi/lib/grpcServer/handlers/platform/platformHandlersFactory.js b/packages/dapi/lib/grpcServer/handlers/platform/platformHandlersFactory.js index 32cbdff836..647f1e6b1e 100644 --- a/packages/dapi/lib/grpcServer/handlers/platform/platformHandlersFactory.js +++ b/packages/dapi/lib/grpcServer/handlers/platform/platformHandlersFactory.js @@ -31,6 +31,8 @@ const { GetEpochsInfoRequest, GetProtocolVersionUpgradeVoteStatusRequest, GetProtocolVersionUpgradeStateRequest, + GetIdentityContractNonceRequest, + GetIdentityNonceRequest, pbjs: { BroadcastStateTransitionRequest: PBJSBroadcastStateTransitionRequest, BroadcastStateTransitionResponse: PBJSBroadcastStateTransitionResponse, @@ -66,6 +68,10 @@ const { GetProtocolVersionUpgradeVoteStatusResponse: PBJSGetProtocolVersionUpgradeVoteStatusResponse, GetProtocolVersionUpgradeStateRequest: PBJSGetProtocolVersionUpgradeStateRequest, GetProtocolVersionUpgradeStateResponse: PBJSGetProtocolVersionUpgradeStateResponse, + GetIdentityContractNonceRequest: PBJSGetIdentityContractNonceRequest, + GetIdentityContractNonceResponse: PBJSGetIdentityContractNonceResponse, + GetIdentityNonceRequest: PBJSGetIdentityNonceRequest, + GetIdentityNonceResponse: PBJSGetIdentityNonceResponse, }, }, } = require('@dashevo/dapi-grpc'); @@ -131,6 +137,14 @@ const getProtocolVersionUpgradeStateHandlerFactory = require( './getProtocolVersionUpgradeStateHandlerFactory', ); +const getIdentityContractNonceHandlerFactory = require( + './getIdentityContractNonceHandlerFactory', +); + +const getIdentityNonceHandlerFactory = require( + './getIdentityNonceHandlerFactory', +); + const fetchProofForStateTransitionFactory = require('../../../externalApis/drive/fetchProofForStateTransitionFactory'); const waitForTransactionToBeProvableFactory = require('../../../externalApis/tenderdash/waitForTransactionToBeProvable/waitForTransactionToBeProvableFactory'); const waitForTransactionResult = require('../../../externalApis/tenderdash/waitForTransactionToBeProvable/waitForTransactionResult'); @@ -458,6 +472,36 @@ function platformHandlersFactory( wrapInErrorHandler(getProtocolVersionUpgradeStateHandler), ); + const getIdentityContractNonceHandler = getIdentityContractNonceHandlerFactory( + driveClient, + ); + + const wrappedGetIdentityContractNonceHandler = jsonToProtobufHandlerWrapper( + jsonToProtobufFactory( + GetIdentityContractNonceRequest, + PBJSGetIdentityContractNonceRequest, + ), + protobufToJsonFactory( + PBJSGetIdentityContractNonceResponse, + ), + wrapInErrorHandler(getIdentityContractNonceHandler), + ); + + const getIdentityNonceHandler = getIdentityNonceHandlerFactory( + driveClient, + ); + + const wrappedGetIdentityNonceHandler = jsonToProtobufHandlerWrapper( + jsonToProtobufFactory( + GetIdentityNonceRequest, + PBJSGetIdentityNonceRequest, + ), + protobufToJsonFactory( + PBJSGetIdentityNonceResponse, + ), + wrapInErrorHandler(getIdentityNonceHandler), + ); + return { broadcastStateTransition: wrappedBroadcastStateTransition, getIdentity: wrappedGetIdentity, @@ -477,6 +521,8 @@ function platformHandlersFactory( getEpochsInfo: wrappedGetEpochsInfo, getProtocolVersionUpgradeVoteStatus: wrappedGetProtocolVersionUpgradeVoteStatus, getProtocolVersionUpgradeState: wrappedGetProtocolVersionUpgradeState, + getIdentityContractNonce: wrappedGetIdentityContractNonceHandler, + getIdentityNonce: wrappedGetIdentityNonceHandler, }; } diff --git a/packages/dapi/test/unit/externalApis/drive/DriveClient.spec.js b/packages/dapi/test/unit/externalApis/drive/DriveClient.spec.js index 45f2ea3bcb..ad51a2034c 100644 --- a/packages/dapi/test/unit/externalApis/drive/DriveClient.spec.js +++ b/packages/dapi/test/unit/externalApis/drive/DriveClient.spec.js @@ -28,6 +28,10 @@ const { GetProtocolVersionUpgradeStateResponse, GetProtocolVersionUpgradeVoteStatusRequest, GetProtocolVersionUpgradeVoteStatusResponse, + GetIdentityContractNonceRequest, + GetIdentityContractNonceResponse, + GetIdentityNonceRequest, + GetIdentityNonceResponse, Proof, ResponseMetadata, }, @@ -472,4 +476,78 @@ describe('DriveClient', () => { ); }); }); + + describe('#getIdentityContractNonce', () => { + it('should call \'getIdentityContractNonce\' RPC with the given parameters', async () => { + const drive = new DriveClient({ host: '127.0.0.1', port: 3000 }); + + const { GetIdentityContractNonceRequestV0 } = GetIdentityContractNonceRequest; + const request = new GetIdentityContractNonceRequest(); + request.setV0(new GetIdentityContractNonceRequestV0()); + + const { GetIdentityContractNonceResponseV0 } = GetIdentityContractNonceResponse; + const response = new GetIdentityContractNonceResponse(); + response.setV0( + new GetIdentityContractNonceResponseV0() + .setIdentityContractNonce(10), + ); + + const responseBytes = response.serializeBinary(); + + sinon.stub(drive.client, 'request') + .resolves({ + result: { + response: { code: 0, value: responseBytes }, + }, + }); + + const result = await drive.fetchIdentityContractNonce(request); + + expect(drive.client.request).to.have.been.calledOnceWithExactly('abci_query', { + path: '/identity/contractNonce', + data: Buffer.from(request.serializeBinary()).toString('hex'), + }); + + expect(result).to.be.deep.equal( + responseBytes, + ); + }); + }); + + describe('#getIdentityNonce', () => { + it('should call \'getIdentityNonce\' RPC with the given parameters', async () => { + const drive = new DriveClient({ host: '127.0.0.1', port: 3000 }); + + const { GetIdentityNonceRequestV0 } = GetIdentityNonceRequest; + const request = new GetIdentityNonceRequest(); + request.setV0(new GetIdentityNonceRequestV0()); + + const { GetIdentityNonceResponseV0 } = GetIdentityNonceResponse; + const response = new GetIdentityNonceResponse(); + response.setV0( + new GetIdentityNonceResponseV0() + .setIdentityNonce(10), + ); + + const responseBytes = response.serializeBinary(); + + sinon.stub(drive.client, 'request') + .resolves({ + result: { + response: { code: 0, value: responseBytes }, + }, + }); + + const result = await drive.fetchIdentityNonce(request); + + expect(drive.client.request).to.have.been.calledOnceWithExactly('abci_query', { + path: '/identity/nonce', + data: Buffer.from(request.serializeBinary()).toString('hex'), + }); + + expect(result).to.be.deep.equal( + responseBytes, + ); + }); + }); }); diff --git a/packages/dapi/test/unit/grpcServer/handlers/platform/getIdentityContractNonceHandlerFactory.spec.js b/packages/dapi/test/unit/grpcServer/handlers/platform/getIdentityContractNonceHandlerFactory.spec.js new file mode 100644 index 0000000000..672776bac3 --- /dev/null +++ b/packages/dapi/test/unit/grpcServer/handlers/platform/getIdentityContractNonceHandlerFactory.spec.js @@ -0,0 +1,110 @@ +const { + v0: { + GetIdentityContractNonceResponse, + Proof, + }, +} = require('@dashevo/dapi-grpc'); + +const getIdentityContractNonceHandlerFactory = require('../../../../../lib/grpcServer/handlers/platform/getIdentityContractNonceHandlerFactory'); + +const GrpcCallMock = require('../../../../../lib/test/mock/GrpcCallMock'); + +describe('getIdentityContractNonceHandlerFactory', () => { + let call; + let driveStateRepositoryMock; + let getIdentityContractNonceHandler; + let nonce; + let proofFixture; + let proofMock; + let request; + let response; + let proofResponse; + + beforeEach(async function beforeEach() { + request = { + getProve: this.sinon.stub().returns(false), + }; + call = new GrpcCallMock(this.sinon, { + getV0: () => request, + }); + + proofFixture = { + merkleProof: Buffer.alloc(1, 1), + }; + + proofMock = new Proof(); + proofMock.setGrovedbProof(proofFixture.merkleProof); + + nonce = 1; + const { GetIdentityContractNonceResponseV0 } = GetIdentityContractNonceResponse; + response = new GetIdentityContractNonceResponse(); + response.setV0( + new GetIdentityContractNonceResponseV0() + .setIdentityContractNonce(1), + ); + + proofResponse = new GetIdentityContractNonceResponse(); + proofResponse.setV0( + new GetIdentityContractNonceResponseV0() + .setProof(proofMock), + ); + + driveStateRepositoryMock = { + fetchIdentityContractNonce: this.sinon.stub().resolves(response.serializeBinary()), + }; + + getIdentityContractNonceHandler = getIdentityContractNonceHandlerFactory( + driveStateRepositoryMock, + ); + }); + + it('should return valid result', async () => { + const result = await getIdentityContractNonceHandler(call); + + expect(result).to.be.an.instanceOf(GetIdentityContractNonceResponse); + expect(result.getV0() + .getIdentityContractNonce()).to.deep.equal(nonce); + expect(driveStateRepositoryMock.fetchIdentityContractNonce) + .to.be.calledOnceWith(call.request); + + const proof = result.getV0().getProof(); + expect(proof).to.be.undefined(); + }); + + it('should return proof', async () => { + request.getProve.returns(true); + + driveStateRepositoryMock.fetchIdentityContractNonce + .resolves(proofResponse.serializeBinary()); + + const result = await getIdentityContractNonceHandler(call); + + expect(result).to.be.an.instanceOf(GetIdentityContractNonceResponse); + + const proof = result.getV0().getProof(); + + expect(proof).to.be.an.instanceOf(Proof); + const merkleProof = proof.getGrovedbProof(); + + expect(merkleProof).to.deep.equal(proofFixture.merkleProof); + + expect(driveStateRepositoryMock.fetchIdentityContractNonce) + .to.be.calledOnceWith(call.request); + }); + + it('should throw an error when fetchIdentityContractNonce throws unknown error', async () => { + const error = new Error('Unknown error'); + + driveStateRepositoryMock.fetchIdentityContractNonce.throws(error); + + try { + await getIdentityContractNonceHandler(call); + + expect.fail('should throw an error'); + } catch (e) { + expect(e).to.equal(error); + expect(driveStateRepositoryMock.fetchIdentityContractNonce) + .to.be.calledOnceWith(call.request); + } + }); +}); diff --git a/packages/dapi/test/unit/grpcServer/handlers/platform/getIdentityNonceHandlerFactory.spec.js b/packages/dapi/test/unit/grpcServer/handlers/platform/getIdentityNonceHandlerFactory.spec.js new file mode 100644 index 0000000000..cf0029c533 --- /dev/null +++ b/packages/dapi/test/unit/grpcServer/handlers/platform/getIdentityNonceHandlerFactory.spec.js @@ -0,0 +1,110 @@ +const { + v0: { + GetIdentityNonceResponse, + Proof, + }, +} = require('@dashevo/dapi-grpc'); + +const getIdentityNonceHandlerFactory = require('../../../../../lib/grpcServer/handlers/platform/getIdentityNonceHandlerFactory'); + +const GrpcCallMock = require('../../../../../lib/test/mock/GrpcCallMock'); + +describe('getIdentityNonceHandlerFactory', () => { + let call; + let driveStateRepositoryMock; + let getIdentityNonceHandler; + let nonce; + let proofFixture; + let proofMock; + let request; + let response; + let proofResponse; + + beforeEach(async function beforeEach() { + request = { + getProve: this.sinon.stub().returns(false), + }; + call = new GrpcCallMock(this.sinon, { + getV0: () => request, + }); + + proofFixture = { + merkleProof: Buffer.alloc(1, 1), + }; + + proofMock = new Proof(); + proofMock.setGrovedbProof(proofFixture.merkleProof); + + nonce = 1; + const { GetIdentityNonceResponseV0 } = GetIdentityNonceResponse; + response = new GetIdentityNonceResponse(); + response.setV0( + new GetIdentityNonceResponseV0() + .setIdentityNonce(1), + ); + + proofResponse = new GetIdentityNonceResponse(); + proofResponse.setV0( + new GetIdentityNonceResponseV0() + .setProof(proofMock), + ); + + driveStateRepositoryMock = { + fetchIdentityNonce: this.sinon.stub().resolves(response.serializeBinary()), + }; + + getIdentityNonceHandler = getIdentityNonceHandlerFactory( + driveStateRepositoryMock, + ); + }); + + it('should return valid result', async () => { + const result = await getIdentityNonceHandler(call); + + expect(result).to.be.an.instanceOf(GetIdentityNonceResponse); + expect(result.getV0() + .getIdentityNonce()).to.deep.equal(nonce); + expect(driveStateRepositoryMock.fetchIdentityNonce) + .to.be.calledOnceWith(call.request); + + const proof = result.getV0().getProof(); + expect(proof).to.be.undefined(); + }); + + it('should return proof', async () => { + request.getProve.returns(true); + + driveStateRepositoryMock.fetchIdentityNonce + .resolves(proofResponse.serializeBinary()); + + const result = await getIdentityNonceHandler(call); + + expect(result).to.be.an.instanceOf(GetIdentityNonceResponse); + + const proof = result.getV0().getProof(); + + expect(proof).to.be.an.instanceOf(Proof); + const merkleProof = proof.getGrovedbProof(); + + expect(merkleProof).to.deep.equal(proofFixture.merkleProof); + + expect(driveStateRepositoryMock.fetchIdentityNonce) + .to.be.calledOnceWith(call.request); + }); + + it('should throw an error when fetchIdentityNonce throws unknown error', async () => { + const error = new Error('Unknown error'); + + driveStateRepositoryMock.fetchIdentityNonce.throws(error); + + try { + await getIdentityNonceHandler(call); + + expect.fail('should throw an error'); + } catch (e) { + expect(e).to.equal(error); + expect(driveStateRepositoryMock.fetchIdentityNonce) + .to.be.calledOnceWith(call.request); + } + }); +}); diff --git a/packages/js-dapi-client/lib/methods/platform/PlatformMethodsFacade.js b/packages/js-dapi-client/lib/methods/platform/PlatformMethodsFacade.js index ce90c4457b..9fecc4be33 100644 --- a/packages/js-dapi-client/lib/methods/platform/PlatformMethodsFacade.js +++ b/packages/js-dapi-client/lib/methods/platform/PlatformMethodsFacade.js @@ -9,6 +9,8 @@ const getConsensusParamsFactory = require('./getConsensusParams/getConsensusPara const getEpochsInfoFactory = require('./getEpochsInfo/getEpochsInfoFactory'); const getProtocolVersionUpgradeVoteStatusFactory = require('./getProtocolVersionUpgradeVoteStatus/getProtocolVersionUpgradeVoteStatusFactory'); const getProtocolVersionUpgradeStateFactory = require('./getProtocolVersionUpgradeState/getProtocolVersionUpgradeStateFactory'); +const getIdentityContractNonceFactory = require('./getIdentityContractNonce/getIdentityContractNonceFactory'); +const getIdentityNonceFactory = require('./getIdentityNonce/getIdentityNonceFactory'); class PlatformMethodsFacade { /** @@ -28,6 +30,8 @@ class PlatformMethodsFacade { grpcTransport, ); this.getProtocolVersionUpgradeState = getProtocolVersionUpgradeStateFactory(grpcTransport); + this.getIdentityContractNonce = getIdentityContractNonceFactory(grpcTransport); + this.getIdentityNonce = getIdentityNonceFactory(grpcTransport); } } diff --git a/packages/js-dapi-client/lib/methods/platform/getIdentityContractNonce/GetIdentityContractNonceResponse.js b/packages/js-dapi-client/lib/methods/platform/getIdentityContractNonce/GetIdentityContractNonceResponse.js new file mode 100644 index 0000000000..e04d6aaafa --- /dev/null +++ b/packages/js-dapi-client/lib/methods/platform/getIdentityContractNonce/GetIdentityContractNonceResponse.js @@ -0,0 +1,49 @@ +const AbstractResponse = require('../response/AbstractResponse'); +const InvalidResponseError = require('../response/errors/InvalidResponseError'); + +const IDENTITY_CONTRACT_NONCE_VALUE_FILTER = 0xFFFFFFFFFF; + +class GetIdentityContractNonceResponse extends AbstractResponse { + /** + * @param {number} identityContractNonce + * @param {Metadata} metadata + * @param {Proof} [proof] + */ + constructor(identityContractNonce, metadata, proof = undefined) { + super(metadata, proof); + + this.identityContractNonce = identityContractNonce; + } + + /** + * @returns {number} + */ + getIdentityContractNonce() { + return this.identityContractNonce; + } + + /** + * @param proto + * @returns {GetIdentityContractNonceResponse} + */ + static createFromProto(proto) { + // eslint-disable-next-line + const identityContractNonce = proto.getV0() + .getIdentityContractNonce() & IDENTITY_CONTRACT_NONCE_VALUE_FILTER; + const { metadata, proof } = AbstractResponse.createMetadataAndProofFromProto( + proto, + ); + + if ((typeof identityContractNonce === 'undefined' || identityContractNonce === null) && !proof) { + throw new InvalidResponseError('Contract nonce data is not defined'); + } + + return new GetIdentityContractNonceResponse( + identityContractNonce, + metadata, + proof, + ); + } +} + +module.exports = GetIdentityContractNonceResponse; diff --git a/packages/js-dapi-client/lib/methods/platform/getIdentityContractNonce/getIdentityContractNonceFactory.js b/packages/js-dapi-client/lib/methods/platform/getIdentityContractNonce/getIdentityContractNonceFactory.js new file mode 100644 index 0000000000..00ae1a93ef --- /dev/null +++ b/packages/js-dapi-client/lib/methods/platform/getIdentityContractNonce/getIdentityContractNonceFactory.js @@ -0,0 +1,81 @@ +const { + v0: { + PlatformPromiseClient, + GetIdentityContractNonceRequest, + }, +} = require('@dashevo/dapi-grpc'); + +const GetIdentityContractNonceResponse = require('./GetIdentityContractNonceResponse'); +const InvalidResponseError = require('../response/errors/InvalidResponseError'); + +/** + * @param {GrpcTransport} grpcTransport + * @returns {getIdentityContractNonce} + */ +function getIdentityContractNonceFactory(grpcTransport) { + /** + * Fetch the version upgrade vote status + * @typedef {getIdentityContractNonce} + * @param {Buffer} identityId + * @param {Buffer} contractId + * @param {DAPIClientOptions & {prove: boolean}} [options] + * @returns {Promise} + */ + async function getIdentityContractNonce(identityId, contractId, options = {}) { + const { + GetIdentityContractNonceRequestV0, + } = GetIdentityContractNonceRequest; + + // eslint-disable-next-line max-len + const getIdentityContractNonceRequest = new GetIdentityContractNonceRequest(); + + if (Buffer.isBuffer(identityId)) { + // eslint-disable-next-line no-param-reassign + identityId = Buffer.from(identityId); + } + + if (Buffer.isBuffer(contractId)) { + // eslint-disable-next-line no-param-reassign + contractId = Buffer.from(contractId); + } + + getIdentityContractNonceRequest.setV0( + new GetIdentityContractNonceRequestV0() + .setIdentityId(identityId) + .setContractId(contractId) + .setProve(!!options.prove), + ); + + let lastError; + + // TODO: simple retry before the dapi versioning is properly implemented + for (let i = 0; i < 3; i += 1) { + try { + // eslint-disable-next-line no-await-in-loop + const getIdentityContractNonceResponse = await grpcTransport.request( + PlatformPromiseClient, + 'getIdentityContractNonce', + getIdentityContractNonceRequest, + options, + ); + + return GetIdentityContractNonceResponse + .createFromProto(getIdentityContractNonceResponse); + } catch (e) { + if (e instanceof InvalidResponseError) { + lastError = e; + } else { + throw e; + } + } + } + + // If we made it past the cycle it means that the retry didn't work, + // and we're throwing the last error encountered + throw lastError; + } + + return getIdentityContractNonce; +} + +module.exports = getIdentityContractNonceFactory; diff --git a/packages/js-dapi-client/lib/methods/platform/getIdentityNonce/GetIdentityNonceResponse.js b/packages/js-dapi-client/lib/methods/platform/getIdentityNonce/GetIdentityNonceResponse.js new file mode 100644 index 0000000000..a490a1390b --- /dev/null +++ b/packages/js-dapi-client/lib/methods/platform/getIdentityNonce/GetIdentityNonceResponse.js @@ -0,0 +1,49 @@ +const AbstractResponse = require('../response/AbstractResponse'); +const InvalidResponseError = require('../response/errors/InvalidResponseError'); + +const IDENTITY_NONCE_VALUE_FILTER = 0xFFFFFFFFFF; + +class GetIdentityNonceResponse extends AbstractResponse { + /** + * @param {number} identityNonce + * @param {Metadata} metadata + * @param {Proof} [proof] + */ + constructor(identityNonce, metadata, proof = undefined) { + super(metadata, proof); + + this.identityNonce = identityNonce; + } + + /** + * @returns {number} + */ + getIdentityNonce() { + return this.identityNonce; + } + + /** + * @param proto + * @returns {GetIdentityNonceResponse} + */ + static createFromProto(proto) { + // eslint-disable-next-line + const identityNonce = proto.getV0() + .getIdentityNonce() & IDENTITY_NONCE_VALUE_FILTER; + const { metadata, proof } = AbstractResponse.createMetadataAndProofFromProto( + proto, + ); + + if ((typeof identityNonce === 'undefined' || identityNonce === null) && !proof) { + throw new InvalidResponseError('Nonce data is not defined'); + } + + return new GetIdentityNonceResponse( + identityNonce, + metadata, + proof, + ); + } +} + +module.exports = GetIdentityNonceResponse; diff --git a/packages/js-dapi-client/lib/methods/platform/getIdentityNonce/getIdentityNonceFactory.js b/packages/js-dapi-client/lib/methods/platform/getIdentityNonce/getIdentityNonceFactory.js new file mode 100644 index 0000000000..4c0193889f --- /dev/null +++ b/packages/js-dapi-client/lib/methods/platform/getIdentityNonce/getIdentityNonceFactory.js @@ -0,0 +1,74 @@ +const { + v0: { + PlatformPromiseClient, + GetIdentityNonceRequest, + }, +} = require('@dashevo/dapi-grpc'); + +const GetIdentityNonceResponse = require('./GetIdentityNonceResponse'); +const InvalidResponseError = require('../response/errors/InvalidResponseError'); + +/** + * @param {GrpcTransport} grpcTransport + * @returns {getIdentityNonce} + */ +function getIdentityNonceFactory(grpcTransport) { + /** + * Fetch the version upgrade vote status + * @typedef {getIdentityNonce} + * @param {Buffer} identityId + * @param {DAPIClientOptions & {prove: boolean}} [options] + * @returns {Promise} + */ + async function getIdentityNonce(identityId, options = {}) { + const { + GetIdentityNonceRequestV0, + } = GetIdentityNonceRequest; + + // eslint-disable-next-line max-len + const getIdentityNonceRequest = new GetIdentityNonceRequest(); + + if (Buffer.isBuffer(identityId)) { + // eslint-disable-next-line no-param-reassign + identityId = Buffer.from(identityId); + } + + getIdentityNonceRequest.setV0( + new GetIdentityNonceRequestV0() + .setIdentityId(identityId) + .setProve(!!options.prove), + ); + + let lastError; + + // TODO: simple retry before the dapi versioning is properly implemented + for (let i = 0; i < 3; i += 1) { + try { + // eslint-disable-next-line no-await-in-loop + const getIdentityNonceResponse = await grpcTransport.request( + PlatformPromiseClient, + 'getIdentityNonce', + getIdentityNonceRequest, + options, + ); + + return GetIdentityNonceResponse + .createFromProto(getIdentityNonceResponse); + } catch (e) { + if (e instanceof InvalidResponseError) { + lastError = e; + } else { + throw e; + } + } + } + + // If we made it past the cycle it means that the retry didn't work, + // and we're throwing the last error encountered + throw lastError; + } + + return getIdentityNonce; +} + +module.exports = getIdentityNonceFactory; diff --git a/packages/js-dapi-client/test/integration/methods/platform/PlatformMethodsFacade.spec.js b/packages/js-dapi-client/test/integration/methods/platform/PlatformMethodsFacade.spec.js index a75a030401..ca28a61c21 100644 --- a/packages/js-dapi-client/test/integration/methods/platform/PlatformMethodsFacade.spec.js +++ b/packages/js-dapi-client/test/integration/methods/platform/PlatformMethodsFacade.spec.js @@ -7,6 +7,8 @@ const { GetEpochsInfoResponse, GetProtocolVersionUpgradeVoteStatusResponse, GetProtocolVersionUpgradeStateResponse, + GetIdentityContractNonceResponse, + GetIdentityNonceResponse, BroadcastStateTransitionResponse, WaitForStateTransitionResultResponse, }, @@ -28,6 +30,8 @@ const { GetProtocolVersionUpgradeVoteStatusResponseV0, } = GetProtocolVersionUpgradeVoteStatusResponse; const { GetProtocolVersionUpgradeStateResponseV0 } = GetProtocolVersionUpgradeStateResponse; +const { GetIdentityContractNonceResponseV0 } = GetIdentityContractNonceResponse; +const { GetIdentityNonceResponseV0 } = GetIdentityNonceResponse; describe('PlatformMethodsFacade', () => { let grpcTransportMock; @@ -201,4 +205,40 @@ describe('PlatformMethodsFacade', () => { expect(grpcTransportMock.request).to.be.calledOnce(); }); }); + + describe('#getIdentityContractNonce', () => { + it('should get nonce', async () => { + const response = new GetIdentityContractNonceResponse(); + + response.setV0( + new GetIdentityContractNonceResponseV0() + .setIdentityContractNonce(1) + .setMetadata(new ResponseMetadata()), + ); + + grpcTransportMock.request.resolves(response); + + await platformMethods.getIdentityContractNonce(Buffer.alloc(32), Buffer.alloc(32)); + + expect(grpcTransportMock.request).to.be.calledOnce(); + }); + }); + + describe('#getIdentityNonce', () => { + it('should get nonce', async () => { + const response = new GetIdentityNonceResponse(); + + response.setV0( + new GetIdentityNonceResponseV0() + .setIdentityNonce(1) + .setMetadata(new ResponseMetadata()), + ); + + grpcTransportMock.request.resolves(response); + + await platformMethods.getIdentityNonce(Buffer.alloc(32), Buffer.alloc(32)); + + expect(grpcTransportMock.request).to.be.calledOnce(); + }); + }); }); diff --git a/packages/js-dapi-client/test/unit/methods/platform/getIdentityContractNonce/GetIdentityContractNonce.spec.js b/packages/js-dapi-client/test/unit/methods/platform/getIdentityContractNonce/GetIdentityContractNonce.spec.js new file mode 100644 index 0000000000..efb8e532f4 --- /dev/null +++ b/packages/js-dapi-client/test/unit/methods/platform/getIdentityContractNonce/GetIdentityContractNonce.spec.js @@ -0,0 +1,129 @@ +const { + v0: { + GetIdentityContractNonceResponse, + ResponseMetadata, + Proof: ProofResponse, + }, +} = require('@dashevo/dapi-grpc'); + +const GetIdentityContractNonceResponseClass = require('../../../../../lib/methods/platform/getIdentityContractNonce/GetIdentityContractNonceResponse'); +const getMetadataFixture = require('../../../../../lib/test/fixtures/getMetadataFixture'); +const InvalidResponseError = require('../../../../../lib/methods/platform/response/errors/InvalidResponseError'); +const getProofFixture = require('../../../../../lib/test/fixtures/getProofFixture'); +const Proof = require('../../../../../lib/methods/platform/response/Proof'); +const Metadata = require('../../../../../lib/methods/platform/response/Metadata'); + +describe('GetIdentityContractNonceResponse', () => { + let getIdentityContractNonceResponse; + let metadataFixture; + let nonce; + let proto; + let proofFixture; + + beforeEach(async () => { + metadataFixture = getMetadataFixture(); + nonce = 1; + proofFixture = getProofFixture(); + + const { GetIdentityContractNonceResponseV0 } = GetIdentityContractNonceResponse; + proto = new GetIdentityContractNonceResponse(); + + const metadata = new ResponseMetadata(); + metadata.setHeight(metadataFixture.height); + metadata.setCoreChainLockedHeight(metadataFixture.coreChainLockedHeight); + metadata.setTimeMs(metadataFixture.timeMs); + metadata.setProtocolVersion(metadataFixture.protocolVersion); + + proto.setV0( + new GetIdentityContractNonceResponseV0() + .setIdentityContractNonce(nonce) + .setMetadata(metadata), + + ); + + getIdentityContractNonceResponse = new GetIdentityContractNonceResponseClass( + nonce, + new Metadata(metadataFixture), + ); + }); + + it('should return Identity', () => { + const identityContractNonce = getIdentityContractNonceResponse.getIdentityContractNonce(); + const proof = getIdentityContractNonceResponse.getProof(); + + expect(identityContractNonce).to.deep.equal(nonce); + expect(proof).to.equal(undefined); + }); + + it('should return proof', () => { + getIdentityContractNonceResponse = new GetIdentityContractNonceResponseClass( + Buffer.alloc(0), + new Metadata(metadataFixture), + new Proof(proofFixture), + ); + + const identityContractNonce = getIdentityContractNonceResponse.getIdentityContractNonce(); + const proof = getIdentityContractNonceResponse.getProof(); + + expect(identityContractNonce).to.deep.equal(Buffer.alloc(0)); + expect(proof).to.be.an.instanceOf(Proof); + expect(proof.getGrovedbProof()).to.deep.equal(proofFixture.merkleProof); + expect(proof.getQuorumHash()).to.deep.equal(proofFixture.quorumHash); + expect(proof.getSignature()).to.deep.equal(proofFixture.signature); + expect(proof.getRound()).to.deep.equal(proofFixture.round); + }); + + it('should create an instance from proto', () => { + getIdentityContractNonceResponse = GetIdentityContractNonceResponseClass.createFromProto(proto); + expect(getIdentityContractNonceResponse).to.be + .an.instanceOf(GetIdentityContractNonceResponseClass); + expect(getIdentityContractNonceResponse.getIdentityContractNonce()).to.deep.equal(nonce); + + expect(getIdentityContractNonceResponse.getMetadata()) + .to.be.an.instanceOf(Metadata); + expect(getIdentityContractNonceResponse.getMetadata().getHeight()) + .to.equal(metadataFixture.height); + expect(getIdentityContractNonceResponse.getMetadata().getCoreChainLockedHeight()) + .to.equal(metadataFixture.coreChainLockedHeight); + + expect(getIdentityContractNonceResponse.getProof()).to.equal(undefined); + }); + + it('should create an instance with proof from proto', () => { + const proofProto = new ProofResponse(); + + proofProto.setQuorumHash(proofFixture.quorumHash); + proofProto.setSignature(proofFixture.signature); + proofProto.setGrovedbProof(proofFixture.merkleProof); + proofProto.setRound(proofFixture.round); + + proto.getV0().setIdentityContractNonce(undefined); + proto.getV0().setProof(proofProto); + + getIdentityContractNonceResponse = GetIdentityContractNonceResponseClass.createFromProto(proto); + + expect(getIdentityContractNonceResponse.getIdentityContractNonce()) + .to.deep.equal(0); + expect(getIdentityContractNonceResponse.getMetadata()).to.deep.equal(metadataFixture); + + const proof = getIdentityContractNonceResponse.getProof(); + expect(proof).to.be.an.instanceOf(Proof); + expect(proof.getGrovedbProof()).to.deep.equal(proofFixture.merkleProof); + expect(proof.getQuorumHash()).to.deep.equal(proofFixture.quorumHash); + expect(proof.getSignature()).to.deep.equal(proofFixture.signature); + expect(proof.getRound()).to.deep.equal(proofFixture.round); + }); + + it('should throw InvalidResponseError if Metadata is not defined', () => { + proto.getV0().setMetadata(undefined); + + try { + getIdentityContractNonceResponse = GetIdentityContractNonceResponseClass + .createFromProto(proto); + + expect.fail('should throw InvalidResponseError'); + } catch (e) { + expect(e).to.be.an.instanceOf(InvalidResponseError); + } + }); +}); diff --git a/packages/js-dapi-client/test/unit/methods/platform/getIdentityContractNonce/getIdentityContractNonceFactory.spec.js b/packages/js-dapi-client/test/unit/methods/platform/getIdentityContractNonce/getIdentityContractNonceFactory.spec.js new file mode 100644 index 0000000000..0f5e46045b --- /dev/null +++ b/packages/js-dapi-client/test/unit/methods/platform/getIdentityContractNonce/getIdentityContractNonceFactory.spec.js @@ -0,0 +1,158 @@ +const { + v0: { + PlatformPromiseClient, + GetIdentityContractNonceRequest, + GetIdentityContractNonceResponse, + ResponseMetadata, + Proof: ProofResponse, + }, +} = require('@dashevo/dapi-grpc'); + +const getIdentityContractNonceFactory = require('../../../../../lib/methods/platform/getIdentityContractNonce/getIdentityContractNonceFactory'); +const getMetadataFixture = require('../../../../../lib/test/fixtures/getMetadataFixture'); +const getProofFixture = require('../../../../../lib/test/fixtures/getProofFixture'); +const Proof = require('../../../../../lib/methods/platform/response/Proof'); + +describe('getIdentityContractNonceFactory', () => { + let grpcTransportMock; + let getIdentityContractNonce; + let options; + let response; + let nonce; + let identityId; + let contractId; + let metadataFixture; + let proofFixture; + let proofResponse; + + beforeEach(async function beforeEach() { + nonce = 1; + identityId = Buffer.alloc(32).fill(0); + contractId = Buffer.alloc(32).fill(1); + + metadataFixture = getMetadataFixture(); + proofFixture = getProofFixture(); + + const metadata = new ResponseMetadata(); + metadata.setHeight(metadataFixture.height); + metadata.setCoreChainLockedHeight(metadataFixture.coreChainLockedHeight); + metadata.setTimeMs(metadataFixture.timeMs); + metadata.setProtocolVersion(metadataFixture.protocolVersion); + + const { GetIdentityContractNonceResponseV0 } = GetIdentityContractNonceResponse; + response = new GetIdentityContractNonceResponse(); + response.setV0( + new GetIdentityContractNonceResponseV0() + .setIdentityContractNonce(nonce) + .setMetadata(metadata), + ); + + proofResponse = new ProofResponse(); + + proofResponse.setQuorumHash(proofFixture.quorumHash); + proofResponse.setSignature(proofFixture.signature); + proofResponse.setGrovedbProof(proofFixture.merkleProof); + proofResponse.setRound(proofFixture.round); + + grpcTransportMock = { + request: this.sinon.stub().resolves(response), + }; + + getIdentityContractNonce = getIdentityContractNonceFactory(grpcTransportMock); + + options = { + timeout: 1000, + }; + }); + + it('should return identity nonce', async () => { + const result = await getIdentityContractNonce(identityId, contractId, options); + + const { GetIdentityContractNonceRequestV0 } = GetIdentityContractNonceRequest; + const request = new GetIdentityContractNonceRequest(); + request.setV0( + new GetIdentityContractNonceRequestV0() + .setIdentityId(identityId) + .setContractId(contractId) + .setProve(false), + ); + + expect(grpcTransportMock.request).to.be.calledOnceWithExactly( + PlatformPromiseClient, + 'getIdentityContractNonce', + request, + options, + ); + expect(result.getIdentityContractNonce()).to.deep.equal(nonce); + expect(result.getMetadata()).to.deep.equal(metadataFixture); + expect(result.getProof()).to.equal(undefined); + }); + + it('should return proof', async () => { + options.prove = true; + response.getV0().setIdentityContractNonce(undefined); + response.getV0().setProof(proofResponse); + + const result = await getIdentityContractNonce(identityId, contractId, options); + + const { GetIdentityContractNonceRequestV0 } = GetIdentityContractNonceRequest; + const request = new GetIdentityContractNonceRequest(); + request.setV0( + new GetIdentityContractNonceRequestV0() + .setIdentityId(identityId) + .setContractId(contractId) + .setProve(true), + ); + + expect(grpcTransportMock.request).to.be.calledOnceWithExactly( + PlatformPromiseClient, + 'getIdentityContractNonce', + request, + options, + ); + + expect(result.getIdentityContractNonce()).to.deep.equal(0); + + expect(result.getMetadata()).to.deep.equal(metadataFixture); + + expect(result.getProof()).to.be.an.instanceOf(Proof); + expect(result.getProof().getGrovedbProof()).to.deep.equal(proofFixture.merkleProof); + expect(result.getProof().getQuorumHash()).to.deep.equal(proofFixture.quorumHash); + expect(result.getProof().getSignature()).to.deep.equal(proofFixture.signature); + expect(result.getProof().getRound()).to.deep.equal(proofFixture.round); + expect(result.getMetadata()).to.deep.equal(metadataFixture); + expect(result.getMetadata().getHeight()).to.equal(metadataFixture.height); + expect(result.getMetadata().getCoreChainLockedHeight()).to.equal( + metadataFixture.coreChainLockedHeight, + ); + }); + + it('should throw unknown error', async () => { + const error = new Error('Unknown found'); + + grpcTransportMock.request.throws(error); + + const { GetIdentityContractNonceRequestV0 } = GetIdentityContractNonceRequest; + const request = new GetIdentityContractNonceRequest(); + request.setV0( + new GetIdentityContractNonceRequestV0() + .setIdentityId(identityId) + .setContractId(contractId) + .setProve(false), + ); + + try { + await getIdentityContractNonce(identityId, contractId, options); + + expect.fail('should throw unknown error'); + } catch (e) { + expect(e).to.deep.equal(error); + expect(grpcTransportMock.request).to.be.calledOnceWithExactly( + PlatformPromiseClient, + 'getIdentityContractNonce', + request, + options, + ); + } + }); +}); diff --git a/packages/js-dapi-client/test/unit/methods/platform/getIdentityNonce/GetIdentityNonce.spec.js b/packages/js-dapi-client/test/unit/methods/platform/getIdentityNonce/GetIdentityNonce.spec.js new file mode 100644 index 0000000000..6a0d7ca6f6 --- /dev/null +++ b/packages/js-dapi-client/test/unit/methods/platform/getIdentityNonce/GetIdentityNonce.spec.js @@ -0,0 +1,129 @@ +const { + v0: { + GetIdentityNonceResponse, + ResponseMetadata, + Proof: ProofResponse, + }, +} = require('@dashevo/dapi-grpc'); + +const GetIdentityNonceResponseClass = require('../../../../../lib/methods/platform/getIdentityNonce/GetIdentityNonceResponse'); +const getMetadataFixture = require('../../../../../lib/test/fixtures/getMetadataFixture'); +const InvalidResponseError = require('../../../../../lib/methods/platform/response/errors/InvalidResponseError'); +const getProofFixture = require('../../../../../lib/test/fixtures/getProofFixture'); +const Proof = require('../../../../../lib/methods/platform/response/Proof'); +const Metadata = require('../../../../../lib/methods/platform/response/Metadata'); + +describe('GetIdentityNonceResponse', () => { + let getIdentityNonceResponse; + let metadataFixture; + let nonce; + let proto; + let proofFixture; + + beforeEach(async () => { + metadataFixture = getMetadataFixture(); + nonce = 1; + proofFixture = getProofFixture(); + + const { GetIdentityNonceResponseV0 } = GetIdentityNonceResponse; + proto = new GetIdentityNonceResponse(); + + const metadata = new ResponseMetadata(); + metadata.setHeight(metadataFixture.height); + metadata.setCoreChainLockedHeight(metadataFixture.coreChainLockedHeight); + metadata.setTimeMs(metadataFixture.timeMs); + metadata.setProtocolVersion(metadataFixture.protocolVersion); + + proto.setV0( + new GetIdentityNonceResponseV0() + .setIdentityNonce(nonce) + .setMetadata(metadata), + + ); + + getIdentityNonceResponse = new GetIdentityNonceResponseClass( + nonce, + new Metadata(metadataFixture), + ); + }); + + it('should return Identity', () => { + const IdentityNonce = getIdentityNonceResponse.getIdentityNonce(); + const proof = getIdentityNonceResponse.getProof(); + + expect(IdentityNonce).to.deep.equal(nonce); + expect(proof).to.equal(undefined); + }); + + it('should return proof', () => { + getIdentityNonceResponse = new GetIdentityNonceResponseClass( + Buffer.alloc(0), + new Metadata(metadataFixture), + new Proof(proofFixture), + ); + + const IdentityNonce = getIdentityNonceResponse.getIdentityNonce(); + const proof = getIdentityNonceResponse.getProof(); + + expect(IdentityNonce).to.deep.equal(Buffer.alloc(0)); + expect(proof).to.be.an.instanceOf(Proof); + expect(proof.getGrovedbProof()).to.deep.equal(proofFixture.merkleProof); + expect(proof.getQuorumHash()).to.deep.equal(proofFixture.quorumHash); + expect(proof.getSignature()).to.deep.equal(proofFixture.signature); + expect(proof.getRound()).to.deep.equal(proofFixture.round); + }); + + it('should create an instance from proto', () => { + getIdentityNonceResponse = GetIdentityNonceResponseClass.createFromProto(proto); + expect(getIdentityNonceResponse).to.be + .an.instanceOf(GetIdentityNonceResponseClass); + expect(getIdentityNonceResponse.getIdentityNonce()).to.deep.equal(nonce); + + expect(getIdentityNonceResponse.getMetadata()) + .to.be.an.instanceOf(Metadata); + expect(getIdentityNonceResponse.getMetadata().getHeight()) + .to.equal(metadataFixture.height); + expect(getIdentityNonceResponse.getMetadata().getCoreChainLockedHeight()) + .to.equal(metadataFixture.coreChainLockedHeight); + + expect(getIdentityNonceResponse.getProof()).to.equal(undefined); + }); + + it('should create an instance with proof from proto', () => { + const proofProto = new ProofResponse(); + + proofProto.setQuorumHash(proofFixture.quorumHash); + proofProto.setSignature(proofFixture.signature); + proofProto.setGrovedbProof(proofFixture.merkleProof); + proofProto.setRound(proofFixture.round); + + proto.getV0().setIdentityNonce(undefined); + proto.getV0().setProof(proofProto); + + getIdentityNonceResponse = GetIdentityNonceResponseClass.createFromProto(proto); + + expect(getIdentityNonceResponse.getIdentityNonce()) + .to.deep.equal(0); + expect(getIdentityNonceResponse.getMetadata()).to.deep.equal(metadataFixture); + + const proof = getIdentityNonceResponse.getProof(); + expect(proof).to.be.an.instanceOf(Proof); + expect(proof.getGrovedbProof()).to.deep.equal(proofFixture.merkleProof); + expect(proof.getQuorumHash()).to.deep.equal(proofFixture.quorumHash); + expect(proof.getSignature()).to.deep.equal(proofFixture.signature); + expect(proof.getRound()).to.deep.equal(proofFixture.round); + }); + + it('should throw InvalidResponseError if Metadata is not defined', () => { + proto.getV0().setMetadata(undefined); + + try { + getIdentityNonceResponse = GetIdentityNonceResponseClass + .createFromProto(proto); + + expect.fail('should throw InvalidResponseError'); + } catch (e) { + expect(e).to.be.an.instanceOf(InvalidResponseError); + } + }); +}); diff --git a/packages/js-dapi-client/test/unit/methods/platform/getIdentityNonce/getIdentityNonceFactory.spec.js b/packages/js-dapi-client/test/unit/methods/platform/getIdentityNonce/getIdentityNonceFactory.spec.js new file mode 100644 index 0000000000..b0f0b9fc22 --- /dev/null +++ b/packages/js-dapi-client/test/unit/methods/platform/getIdentityNonce/getIdentityNonceFactory.spec.js @@ -0,0 +1,153 @@ +const { + v0: { + PlatformPromiseClient, + GetIdentityNonceRequest, + GetIdentityNonceResponse, + ResponseMetadata, + Proof: ProofResponse, + }, +} = require('@dashevo/dapi-grpc'); + +const getIdentityNonceFactory = require('../../../../../lib/methods/platform/getIdentityNonce/getIdentityNonceFactory'); +const getMetadataFixture = require('../../../../../lib/test/fixtures/getMetadataFixture'); +const getProofFixture = require('../../../../../lib/test/fixtures/getProofFixture'); +const Proof = require('../../../../../lib/methods/platform/response/Proof'); + +describe('getIdentityNonceFactory', () => { + let grpcTransportMock; + let getIdentityNonce; + let options; + let response; + let nonce; + let identityId; + let metadataFixture; + let proofFixture; + let proofResponse; + + beforeEach(async function beforeEach() { + nonce = 1; + identityId = Buffer.alloc(32).fill(0); + + metadataFixture = getMetadataFixture(); + proofFixture = getProofFixture(); + + const metadata = new ResponseMetadata(); + metadata.setHeight(metadataFixture.height); + metadata.setCoreChainLockedHeight(metadataFixture.coreChainLockedHeight); + metadata.setTimeMs(metadataFixture.timeMs); + metadata.setProtocolVersion(metadataFixture.protocolVersion); + + const { GetIdentityNonceResponseV0 } = GetIdentityNonceResponse; + response = new GetIdentityNonceResponse(); + response.setV0( + new GetIdentityNonceResponseV0() + .setIdentityNonce(nonce) + .setMetadata(metadata), + ); + + proofResponse = new ProofResponse(); + + proofResponse.setQuorumHash(proofFixture.quorumHash); + proofResponse.setSignature(proofFixture.signature); + proofResponse.setGrovedbProof(proofFixture.merkleProof); + proofResponse.setRound(proofFixture.round); + + grpcTransportMock = { + request: this.sinon.stub().resolves(response), + }; + + getIdentityNonce = getIdentityNonceFactory(grpcTransportMock); + + options = { + timeout: 1000, + }; + }); + + it('should return identity nonce', async () => { + const result = await getIdentityNonce(identityId, options); + + const { GetIdentityNonceRequestV0 } = GetIdentityNonceRequest; + const request = new GetIdentityNonceRequest(); + request.setV0( + new GetIdentityNonceRequestV0() + .setIdentityId(identityId) + .setProve(false), + ); + + expect(grpcTransportMock.request).to.be.calledOnceWithExactly( + PlatformPromiseClient, + 'getIdentityNonce', + request, + options, + ); + expect(result.getIdentityNonce()).to.deep.equal(nonce); + expect(result.getMetadata()).to.deep.equal(metadataFixture); + expect(result.getProof()).to.equal(undefined); + }); + + it('should return proof', async () => { + options.prove = true; + response.getV0().setIdentityNonce(undefined); + response.getV0().setProof(proofResponse); + + const result = await getIdentityNonce(identityId, options); + + const { GetIdentityNonceRequestV0 } = GetIdentityNonceRequest; + const request = new GetIdentityNonceRequest(); + request.setV0( + new GetIdentityNonceRequestV0() + .setIdentityId(identityId) + .setProve(true), + ); + + expect(grpcTransportMock.request).to.be.calledOnceWithExactly( + PlatformPromiseClient, + 'getIdentityNonce', + request, + options, + ); + + expect(result.getIdentityNonce()).to.deep.equal(0); + + expect(result.getMetadata()).to.deep.equal(metadataFixture); + + expect(result.getProof()).to.be.an.instanceOf(Proof); + expect(result.getProof().getGrovedbProof()).to.deep.equal(proofFixture.merkleProof); + expect(result.getProof().getQuorumHash()).to.deep.equal(proofFixture.quorumHash); + expect(result.getProof().getSignature()).to.deep.equal(proofFixture.signature); + expect(result.getProof().getRound()).to.deep.equal(proofFixture.round); + expect(result.getMetadata()).to.deep.equal(metadataFixture); + expect(result.getMetadata().getHeight()).to.equal(metadataFixture.height); + expect(result.getMetadata().getCoreChainLockedHeight()).to.equal( + metadataFixture.coreChainLockedHeight, + ); + }); + + it('should throw unknown error', async () => { + const error = new Error('Unknown found'); + + grpcTransportMock.request.throws(error); + + const { GetIdentityNonceRequestV0 } = GetIdentityNonceRequest; + const request = new GetIdentityNonceRequest(); + request.setV0( + new GetIdentityNonceRequestV0() + .setIdentityId(identityId) + .setProve(false), + ); + + try { + await getIdentityNonce(identityId, options); + + expect.fail('should throw unknown error'); + } catch (e) { + expect(e).to.deep.equal(error); + expect(grpcTransportMock.request).to.be.calledOnceWithExactly( + PlatformPromiseClient, + 'getIdentityNonce', + request, + options, + ); + } + }); +}); diff --git a/packages/js-dash-sdk/src/SDK/Client/Platform/NonceManager/NonceManager.ts b/packages/js-dash-sdk/src/SDK/Client/Platform/NonceManager/NonceManager.ts new file mode 100644 index 0000000000..6b45f16bcf --- /dev/null +++ b/packages/js-dash-sdk/src/SDK/Client/Platform/NonceManager/NonceManager.ts @@ -0,0 +1,78 @@ +import DAPIClient from '@dashevo/dapi-client'; +import { Identifier } from '@dashevo/wasm-dpp'; + +// TODO: re-fetch nonces by timeout +class NonceManager { + public dapiClient: DAPIClient; + + private identityNonce: Map; + + private identityContractNonce: Map>; + + constructor(dapiClient: DAPIClient) { + this.dapiClient = dapiClient; + + this.identityNonce = new Map(); + this.identityContractNonce = new Map(); + } + + public setIdentityNonce(identityId: Identifier, nonce: number) { + this.identityNonce.set(identityId, nonce); + } + + public async getIdentityNonce(identityId: Identifier): Promise { + let nonce = this.identityNonce.get(identityId); + + if (typeof nonce === 'undefined') { + ({ identityNonce: nonce } = await this.dapiClient.platform.getIdentityNonce(identityId)); + + if (typeof nonce === 'undefined') { + throw new Error('Identity nonce is not found'); + } + + this.identityNonce.set(identityId, nonce); + } + + return nonce; + } + + public setIdentityContractNonce(identityId: Identifier, contractId: Identifier, nonce: number) { + let contractNonce = this.identityContractNonce.get(identityId); + + if (!contractNonce) { + contractNonce = new Map(); + this.identityContractNonce.set(identityId, contractNonce); + } + + contractNonce.set(contractId, nonce); + } + + public async getIdentityContractNonce( + identityId: Identifier, + contractId: Identifier, + ): Promise { + let contractNonce = this.identityContractNonce.get(identityId); + + if (!contractNonce) { + contractNonce = new Map(); + this.identityContractNonce.set(identityId, contractNonce); + } + + let nonce = contractNonce.get(contractId); + + if (typeof nonce === 'undefined') { + ({ identityContractNonce: nonce } = await this.dapiClient.platform + .getIdentityContractNonce(identityId, contractId)); + + if (typeof nonce === 'undefined') { + throw new Error('Identity contract nonce is not found'); + } + + contractNonce.set(identityId, nonce); + } + + return nonce; + } +} + +export default NonceManager; diff --git a/packages/js-dash-sdk/src/SDK/Client/Platform/Platform.ts b/packages/js-dash-sdk/src/SDK/Client/Platform/Platform.ts index b689488bfd..7231eb02f3 100644 --- a/packages/js-dash-sdk/src/SDK/Client/Platform/Platform.ts +++ b/packages/js-dash-sdk/src/SDK/Client/Platform/Platform.ts @@ -36,6 +36,7 @@ import broadcastStateTransition from './broadcastStateTransition'; import logger, { ConfigurableLogger } from '../../../logger'; import Fetcher from './Fetcher'; +import NonceManager from './NonceManager/NonceManager'; /** * Interface for PlatformOpts @@ -153,6 +154,8 @@ export class Platform { protected fetcher: Fetcher; + protected nonceManager: NonceManager; + /** * Construct some instance of Platform * @@ -203,6 +206,7 @@ export class Platform { } this.fetcher = new Fetcher(this.client.getDAPIClient()); + this.nonceManager = new NonceManager(this.client.getDAPIClient()); } async initialize() { diff --git a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/contracts/update.ts b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/contracts/update.ts index e684eab16a..04aef0445f 100644 --- a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/contracts/update.ts +++ b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/contracts/update.ts @@ -25,12 +25,20 @@ export default async function update( updatedDataContract.incrementVersion(); + const identityId = identity.getId(); + const dataContractId = dataContract.getId(); + + const identityContractNonce = await this.nonceManager + .getIdentityContractNonce(identityId, dataContractId) + 1; + const dataContractUpdateTransition = dpp.dataContract - .createDataContractUpdateTransition(updatedDataContract); + .createDataContractUpdateTransition(updatedDataContract, BigInt(identityContractNonce)); this.logger.silly(`[DataContract#update] Created data contract update transition ${dataContract.getId()}`); await signStateTransition(this, dataContractUpdateTransition, identity, 2); + this.nonceManager.setIdentityContractNonce(identityId, dataContractId, identityContractNonce); + // Broadcast state transition also wait for the result to be obtained await broadcastStateTransition(this, dataContractUpdateTransition); this.logger.silly(`[DataContract#update] Broadcasted data contract update transition ${dataContract.getId()}`); diff --git a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/documents/broadcast.ts b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/documents/broadcast.ts index 53308978d3..67f522dd12 100644 --- a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/documents/broadcast.ts +++ b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/documents/broadcast.ts @@ -31,12 +31,31 @@ export default async function broadcast( const { dpp } = this; - const documentsBatchTransition = dpp.document.createStateTransition(documents); + const identityId = identity.getId(); + const dataContractId = [ + ...(documents.create || []), + ...(documents.replace || []), + ...(documents.delete || []), + ][0]?.getDataContractId(); + + if (!dataContractId) { + throw new Error('Data contract ID is not found'); + } + + const identityContractNonce = await this.nonceManager + .getIdentityContractNonce(identityId, dataContractId) + 1; + + const documentsBatchTransition = dpp.document.createStateTransition(documents, { + [identityId.toString()]: { + [dataContractId.toString()]: identityContractNonce, + }, + }); this.logger.silly('[Document#broadcast] Created documents batch transition'); await signStateTransition(this, documentsBatchTransition, identity, 1); + this.nonceManager.setIdentityContractNonce(identityId, dataContractId, identityContractNonce); // Broadcast state transition also wait for the result to be obtained await broadcastStateTransition(this, documentsBatchTransition); diff --git a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/creditTransfer.ts b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/creditTransfer.ts index e04ddd2394..2e6ac84a5e 100644 --- a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/creditTransfer.ts +++ b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/creditTransfer.ts @@ -16,11 +16,14 @@ export async function creditTransfer( recipientId = Identifier.from(recipientId); + const identityNonce = await this.nonceManager.getIdentityNonce(identity.getId()) + 1; + const identityCreditTransferTransition = dpp.identity .createIdentityCreditTransferTransition( identity, recipientId, BigInt(amount), + BigInt(identityNonce), ); this.logger.silly('[Identity#creditTransfer] Created IdentityCreditTransferTransition'); @@ -29,6 +32,8 @@ export async function creditTransfer( await signStateTransition(this, identityCreditTransferTransition, identity, signerKeyIndex); + this.nonceManager.setIdentityNonce(identity.getId(), identityNonce); + // Skipping validation because it's already done above await broadcastStateTransition(this, identityCreditTransferTransition, { skipValidation: true, }); diff --git a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/creditWithdrawal.ts b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/creditWithdrawal.ts index 5193d0c240..a2f836cc75 100644 --- a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/creditWithdrawal.ts +++ b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/creditWithdrawal.ts @@ -79,7 +79,8 @@ export async function creditWithdrawal( const coreFeePerByte = nearestGreaterFibonacci(minRelayFeePerByte); - const revision = identity.getRevision(); + const identityNonce = await this.nonceManager + .getIdentityNonce(identity.getId()) + 1; const identityCreditWithdrawalTransition = dpp.identity .createIdentityCreditWithdrawalTransition( @@ -89,7 +90,7 @@ export async function creditWithdrawal( DEFAULT_POOLING, // @ts-ignore outputScript.toBuffer(), - BigInt(revision + 1), + BigInt(identityNonce), ); this.logger.silly('[Identity#creditWithdrawal] Created IdentityCreditWithdrawalTransition'); @@ -101,6 +102,8 @@ export async function creditWithdrawal( options.signingKeyIndex, ); + this.nonceManager.setIdentityNonce(identity.getId(), identityNonce); + // Skipping validation because it's already done above await broadcastStateTransition(this, identityCreditWithdrawalTransition, { skipValidation: true, }); diff --git a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/update.ts b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/update.ts index 0ba6e5dcd2..529fc68898 100644 --- a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/update.ts +++ b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/update.ts @@ -28,8 +28,12 @@ export async function update( const { dpp } = this; + const identityNonce = await this.nonceManager + .getIdentityNonce(identity.getId()) + 1; + const identityUpdateTransition = dpp.identity.createIdentityUpdateTransition( identity, + BigInt(identityNonce), publicKeys, ); @@ -90,6 +94,7 @@ export async function update( // } this.logger.silly('[Identity#update] Validated IdentityUpdateTransition'); + this.nonceManager.setIdentityNonce(identity.getId(), identityNonce); // Skipping validation because it's already done above await broadcastStateTransition(this, identityUpdateTransition, { skipValidation: true, diff --git a/packages/js-dash-sdk/src/test/mocks/createAndAttachTransportMocksToClient.ts b/packages/js-dash-sdk/src/test/mocks/createAndAttachTransportMocksToClient.ts index fe0655ea2e..4ac2e7b847 100644 --- a/packages/js-dash-sdk/src/test/mocks/createAndAttachTransportMocksToClient.ts +++ b/packages/js-dash-sdk/src/test/mocks/createAndAttachTransportMocksToClient.ts @@ -84,6 +84,7 @@ export async function createAndAttachTransportMocksToClient(client, sinon) { // Mock dapi client for platform endpoints client.dapiClient = dapiClientMock; client.platform.fetcher.dapiClient = dapiClientMock; + client.platform.nonceManager.dapiClient = dapiClientMock; // Starting account sync const accountPromise = client.wallet.getAccount(); diff --git a/packages/js-dash-sdk/src/test/mocks/createDapiClientMock.ts b/packages/js-dash-sdk/src/test/mocks/createDapiClientMock.ts index b5242efd84..b0f73ee401 100644 --- a/packages/js-dash-sdk/src/test/mocks/createDapiClientMock.ts +++ b/packages/js-dash-sdk/src/test/mocks/createDapiClientMock.ts @@ -7,6 +7,8 @@ export function createDapiClientMock(sinon: SinonSandbox) { getIdentity: sinon.stub(), waitForStateTransitionResult: sinon.stub().resolves({}), getDataContract: sinon.stub(), + getIdentityContractNonce: sinon.stub().resolves({ identityContractNonce: 1 }), + getIdentityNonce: sinon.stub().resolves({ identityNonce: 1 }), }, }; } diff --git a/packages/platform-test-suite/test/e2e/withdrawals.spec.js b/packages/platform-test-suite/test/e2e/withdrawals.spec.js index 50b3b43b82..d50b95fe3c 100644 --- a/packages/platform-test-suite/test/e2e/withdrawals.spec.js +++ b/packages/platform-test-suite/test/e2e/withdrawals.spec.js @@ -145,8 +145,18 @@ describe('Withdrawals', function withdrawalsTest() { status: 0, }, ); + + const identityId = identity.getId(); + const dataContractId = client.getApps().get('withdrawals').contractId; + const { identityContractNonce } = await client.getDAPIClient().platform + .getIdentityContractNonce(identityId, dataContractId); + const stateTransition = client.platform.dpp.document.createStateTransition({ create: [withdrawal], + }, { + [identityId.toString()]: { + [dataContractId.toString()]: identityContractNonce, + }, }); stateTransition.setSignaturePublicKeyId(1); diff --git a/packages/platform-test-suite/test/functional/platform/Document.spec.js b/packages/platform-test-suite/test/functional/platform/Document.spec.js index 9d96259d86..58ff551145 100644 --- a/packages/platform-test-suite/test/functional/platform/Document.spec.js +++ b/packages/platform-test-suite/test/functional/platform/Document.spec.js @@ -42,10 +42,11 @@ describe('Platform', () => { // Additional wait time to mitigate testnet latency await waitForSTPropagated(); - client.getApps().set('customContracts', { - contractId: dataContractFixture.getId(), - contract: dataContractFixture, - }); + client.getApps() + .set('customContracts', { + contractId: dataContractFixture.getId(), + contract: dataContractFixture, + }); }); beforeEach(async () => { @@ -60,16 +61,19 @@ describe('Platform', () => { it('should fail to create new document with an unknown type', async () => { // Add undefined document type for - client.getApps().get('customContracts').contract.setDocumentSchema('undefinedType', { - type: 'object', - properties: { - name: { - type: 'string', - position: 0, + client.getApps() + .get('customContracts') + .contract + .setDocumentSchema('undefinedType', { + type: 'object', + properties: { + name: { + type: 'string', + position: 0, + }, }, - }, - additionalProperties: false, - }); + additionalProperties: false, + }); const newDocument = await client.platform.documents.create( 'customContracts.undefinedType', @@ -89,8 +93,16 @@ describe('Platform', () => { broadcastError = e; } - expect(broadcastError).to.be.an.instanceOf(StateTransitionBroadcastError); - expect(broadcastError.getCause()).to.be.an.instanceOf(InvalidDocumentTypeError); + expect(broadcastError) + .to + .be + .an + .instanceOf(StateTransitionBroadcastError); + expect(broadcastError.getCause()) + .to + .be + .an + .instanceOf(InvalidDocumentTypeError); }); it('should fail to create a new document with an unknown owner', async () => { @@ -114,10 +126,14 @@ describe('Platform', () => { broadcastError = e; } - expect(broadcastError).to.exist(); - expect(broadcastError.message).to.equal( - `Identity with ID ${unknownIdentity.getId()} is not associated with wallet, or it's not synced`, - ); + expect(broadcastError) + .to + .exist(); + expect(broadcastError.message) + .to + .equal( + `Identity with ID ${unknownIdentity.getId()} is not associated with wallet, or it's not synced`, + ); }); it('should fail to create a document that violates unique index constraint', async () => { @@ -160,9 +176,16 @@ describe('Platform', () => { broadcastError = e; } - expect(broadcastError).to.exist(); - expect(broadcastError.code).to.be.equal(4009); - expect(broadcastError.message).to.match(/Document \w* has duplicate unique properties \["\$ownerId", "firstName"] with other documents/); + expect(broadcastError) + .to + .exist(); + expect(broadcastError.code) + .to + .be + .equal(4009); + expect(broadcastError.message) + .to + .match(/Document \w* has duplicate unique properties \["\$ownerId", "firstName"] with other documents/); }); it('should be able to create new document', async () => { @@ -189,20 +212,36 @@ describe('Platform', () => { { where: [['$id', '==', document.getId()]] }, ); - expect(fetchedDocument).to.exist(); - expect(document.toObject()).to.deep.equal(fetchedDocument.toObject()); + expect(fetchedDocument) + .to + .exist(); + expect(document.toObject()) + .to + .deep + .equal(fetchedDocument.toObject()); expect(fetchedDocument.getUpdatedAt()) - .to.be.deep.equal(fetchedDocument.getCreatedAt()); + .to + .be + .deep + .equal(fetchedDocument.getCreatedAt()); }); it('should be able to fetch created document by created timestamp', async () => { const [fetchedDocument] = await client.platform.documents.get( 'customContracts.indexedDocument', - { where: [['$createdAt', '==', document.getCreatedAt().getTime()]] }, + { + where: [['$createdAt', '==', document.getCreatedAt() + .getTime()]], + }, ); - expect(fetchedDocument).to.exist(); - expect(document.toObject()).to.deep.equal(fetchedDocument.toObject()); + expect(fetchedDocument) + .to + .exist(); + expect(document.toObject()) + .to + .deep + .equal(fetchedDocument.toObject()); }); it('should be able to update document', async () => { @@ -226,9 +265,13 @@ describe('Platform', () => { { where: [['$id', '==', document.getId()]] }, ); - expect(fetchedDocument.get('firstName')).to.equal('updatedName'); + expect(fetchedDocument.get('firstName')) + .to + .equal('updatedName'); expect(fetchedDocument.getUpdatedAt()) - .to.be.greaterThan(fetchedDocument.getCreatedAt()); + .to + .be + .greaterThan(fetchedDocument.getCreatedAt()); }); it.skip('should be able to prove that a document was updated', async () => { @@ -261,21 +304,57 @@ describe('Platform', () => { // Additional wait time to mitigate testnet latency await waitForSTPropagated(); - expect(proof.rootTreeProof).to.be.an.instanceof(Uint8Array); - expect(proof.rootTreeProof.length).to.be.greaterThan(0); - - expect(proof.storeTreeProofs).to.exist(); - expect(proof.storeTreeProofs.documentsProof).to.be.an.instanceof(Uint8Array); - expect(proof.storeTreeProofs.documentsProof.length).to.be.greaterThan(0); - - expect(proof.quorumHash).to.be.an.instanceof(Uint8Array); - expect(proof.quorumHash.length).to.be.equal(32); - - expect(proof.signature).to.be.an.instanceof(Uint8Array); - expect(proof.signature.length).to.be.equal(96); - - expect(proof.round).to.be.a('number'); - expect(proof.round).to.be.greaterThanOrEqual(0); + expect(proof.rootTreeProof) + .to + .be + .an + .instanceof(Uint8Array); + expect(proof.rootTreeProof.length) + .to + .be + .greaterThan(0); + + expect(proof.storeTreeProofs) + .to + .exist(); + expect(proof.storeTreeProofs.documentsProof) + .to + .be + .an + .instanceof(Uint8Array); + expect(proof.storeTreeProofs.documentsProof.length) + .to + .be + .greaterThan(0); + + expect(proof.quorumHash) + .to + .be + .an + .instanceof(Uint8Array); + expect(proof.quorumHash.length) + .to + .be + .equal(32); + + expect(proof.signature) + .to + .be + .an + .instanceof(Uint8Array); + expect(proof.signature.length) + .to + .be + .equal(96); + + expect(proof.round) + .to + .be + .a('number'); + expect(proof.round) + .to + .be + .greaterThanOrEqual(0); }); it('should fail to update document with timestamp in violated time frame', async () => { @@ -302,6 +381,11 @@ describe('Platform', () => { transitions[0].setUpdatedAt(updatedAt); documentsBatchTransition.setTransitions(transitions); + const identityContractNonce = await client.platform + .nonceManager + .getIdentityContractNonce(identity.getId(), storedDocument.getDataContractId()) + 1; + + documentsBatchTransition.setIdentityContractNonce(identityContractNonce); const signedTransition = await signStateTransition( client.platform, documentsBatchTransition, @@ -312,12 +396,24 @@ describe('Platform', () => { try { await client.platform.broadcastStateTransition(signedTransition); } catch (e) { + client.platform.nonceManager.setIdentityContractNonce( + identity.getId(), + dataContractFixture.getId(), + identityContractNonce, + ); broadcastError = e; } - expect(broadcastError).to.exist(); - expect(broadcastError.code).to.be.equal(4008); - expect(broadcastError.message).to.match(/Document \w* updatedAt timestamp .* are out of block time window from .* and .*/); + expect(broadcastError) + .to + .exist(); + expect(broadcastError.code) + .to + .be + .equal(4008); + expect(broadcastError.message) + .to + .match(/Document \w* updatedAt timestamp .* are out of block time window from .* and .*/); }); it('should be able to delete a document', async () => { @@ -332,7 +428,10 @@ describe('Platform', () => { { where: [['$id', '==', document.getId()]] }, ); - expect(storedDocument).to.not.exist(); + expect(storedDocument) + .to + .not + .exist(); }); it('should fail to create a new document with timestamp in violated time frame', async () => { @@ -362,9 +461,16 @@ describe('Platform', () => { broadcastError = e; } - expect(broadcastError).to.exist(); - expect(broadcastError.message).to.match(/Document \w* createdAt timestamp .* are out of block time window from .* and .*/); - expect(broadcastError.code).to.be.equal(4008); + expect(broadcastError) + .to + .exist(); + expect(broadcastError.message) + .to + .match(/Document \w* createdAt timestamp .* are out of block time window from .* and .*/); + expect(broadcastError.code) + .to + .be + .equal(4008); }); }); }); diff --git a/packages/platform-test-suite/test/functional/platform/Identity.spec.js b/packages/platform-test-suite/test/functional/platform/Identity.spec.js index d3c4c4378f..c7459a9ea2 100644 --- a/packages/platform-test-suite/test/functional/platform/Identity.spec.js +++ b/packages/platform-test-suite/test/functional/platform/Identity.spec.js @@ -66,7 +66,7 @@ describe('Platform', () => { } expect(broadcastError).to.be.an.instanceOf(StateTransitionBroadcastError); - expect(broadcastError.getCause().getCode()).to.equal(4028); + expect(broadcastError.getCause().getCode()).to.equal(4029); expect(broadcastError.getCause()).to.be.an.instanceOf( InvalidAssetLockProofValueError, ); diff --git a/packages/rs-dapi-client/src/transport/grpc.rs b/packages/rs-dapi-client/src/transport/grpc.rs index 0069e8efdb..ea0d894634 100644 --- a/packages/rs-dapi-client/src/transport/grpc.rs +++ b/packages/rs-dapi-client/src/transport/grpc.rs @@ -198,6 +198,22 @@ impl_transport_request_grpc!( get_identity_balance ); +impl_transport_request_grpc!( + platform_proto::GetIdentityNonceRequest, + platform_proto::GetIdentityNonceResponse, + PlatformGrpcClient, + RequestSettings::default(), + get_identity_nonce +); + +impl_transport_request_grpc!( + platform_proto::GetIdentityContractNonceRequest, + platform_proto::GetIdentityContractNonceResponse, + PlatformGrpcClient, + RequestSettings::default(), + get_identity_contract_nonce +); + impl_transport_request_grpc!( platform_proto::GetIdentityBalanceAndRevisionRequest, platform_proto::GetIdentityBalanceAndRevisionResponse, diff --git a/packages/rs-dpp/src/balances/credits.rs b/packages/rs-dpp/src/balances/credits.rs index e9568bec74..a7f98245ba 100644 --- a/packages/rs-dpp/src/balances/credits.rs +++ b/packages/rs-dpp/src/balances/credits.rs @@ -27,6 +27,10 @@ pub const MAX_CREDITS: Credits = 9223372036854775807 as Credits; //i64 Max pub const CREDITS_PER_DUFF: Credits = 1000; +/// This is the amount of credits we need to have left over in the identity to be able to do a +/// withdrawal or a credit transfer +pub const MIN_LEFTOVER_CREDITS_BEFORE_PROCESSING: Credits = 100000; + /// Trait for signed and unsigned credits pub trait Creditable { diff --git a/packages/rs-dpp/src/data_contract/data_contract_facade.rs b/packages/rs-dpp/src/data_contract/data_contract_facade.rs index 9b55740f0d..2f5ea3178e 100644 --- a/packages/rs-dpp/src/data_contract/data_contract_facade.rs +++ b/packages/rs-dpp/src/data_contract/data_contract_facade.rs @@ -1,7 +1,7 @@ use crate::data_contract::{DataContract, DataContractFactory}; use crate::data_contract::created_data_contract::CreatedDataContract; -use crate::prelude::Identifier; +use crate::prelude::{Identifier, IdentityNonce}; #[cfg(feature = "state-transitions")] use crate::state_transition::data_contract_create_transition::DataContractCreateTransition; #[cfg(feature = "state-transitions")] @@ -86,8 +86,9 @@ impl DataContractFacade { pub fn create_data_contract_update_transition( &self, data_contract: DataContract, + identity_contract_nonce: IdentityNonce, ) -> Result { self.factory - .create_data_contract_update_transition(data_contract) + .create_data_contract_update_transition(data_contract, identity_contract_nonce) } } diff --git a/packages/rs-dpp/src/data_contract/factory/mod.rs b/packages/rs-dpp/src/data_contract/factory/mod.rs index 833f2e6735..ccca7d879b 100644 --- a/packages/rs-dpp/src/data_contract/factory/mod.rs +++ b/packages/rs-dpp/src/data_contract/factory/mod.rs @@ -10,6 +10,7 @@ use derive_more::From; use platform_value::{Identifier, Value}; use crate::data_contract::config::DataContractConfig; +use crate::prelude::IdentityNonce; #[cfg(all(feature = "state-transitions", feature = "client"))] use crate::state_transition::data_contract_create_transition::DataContractCreateTransition; #[cfg(all(feature = "state-transitions", feature = "client"))] @@ -141,11 +142,13 @@ impl DataContractFactory { pub fn create_data_contract_update_transition( &self, data_contract: DataContract, + identity_contract_nonce: IdentityNonce, ) -> Result { match self { - DataContractFactory::V0(v0) => { - v0.create_unsigned_data_contract_update_transition(data_contract) - } + DataContractFactory::V0(v0) => v0.create_unsigned_data_contract_update_transition( + data_contract, + identity_contract_nonce, + ), } } } diff --git a/packages/rs-dpp/src/data_contract/factory/v0/mod.rs b/packages/rs-dpp/src/data_contract/factory/v0/mod.rs index 2c5196ab23..140404b2ea 100644 --- a/packages/rs-dpp/src/data_contract/factory/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/factory/v0/mod.rs @@ -19,6 +19,7 @@ use crate::state_transition::data_contract_create_transition::DataContractCreate #[cfg(feature = "state-transitions")] use crate::state_transition::data_contract_update_transition::DataContractUpdateTransition; +use crate::prelude::IdentityNonce; use crate::util::entropy_generator::{DefaultEntropyGenerator, EntropyGenerator}; use crate::version::PlatformVersion; use crate::{errors::ProtocolError, prelude::Identifier}; @@ -192,9 +193,10 @@ impl DataContractFactoryV0 { pub fn create_unsigned_data_contract_update_transition( &self, data_contract: DataContract, + identity_contract_nonce: IdentityNonce, ) -> Result { DataContractUpdateTransition::try_from_platform_versioned( - data_contract, + (data_contract, identity_contract_nonce), PlatformVersion::get(self.protocol_version)?, ) } diff --git a/packages/rs-dpp/src/document/document_factory/mod.rs b/packages/rs-dpp/src/document/document_factory/mod.rs index a2e806c6a1..eed1368273 100644 --- a/packages/rs-dpp/src/document/document_factory/mod.rs +++ b/packages/rs-dpp/src/document/document_factory/mod.rs @@ -1,6 +1,7 @@ mod v0; use crate::data_contract::DataContract; +use std::collections::BTreeMap; use crate::version::PlatformVersion; use crate::ProtocolError; @@ -113,9 +114,10 @@ impl DocumentFactory { Vec<(Document, DocumentTypeRef<'a>, Bytes32)>, ), >, + nonce_counter: &mut BTreeMap<(Identifier, Identifier), u64>, //IdentityID/ContractID -> nonce ) -> Result { match self { - DocumentFactory::V0(v0) => v0.create_state_transition(documents_iter), + DocumentFactory::V0(v0) => v0.create_state_transition(documents_iter, nonce_counter), } } diff --git a/packages/rs-dpp/src/document/document_factory/v0/mod.rs b/packages/rs-dpp/src/document/document_factory/v0/mod.rs index 3b7faf38ae..2fe4f9d922 100644 --- a/packages/rs-dpp/src/document/document_factory/v0/mod.rs +++ b/packages/rs-dpp/src/document/document_factory/v0/mod.rs @@ -7,6 +7,7 @@ use crate::data_contract::DataContract; use crate::document::errors::DocumentError; use crate::document::{Document, DocumentV0Getters, DocumentV0Setters, INITIAL_REVISION}; use chrono::Utc; +use std::collections::BTreeMap; use crate::util::entropy_generator::{DefaultEntropyGenerator, EntropyGenerator}; use crate::version::PlatformVersion; @@ -167,6 +168,7 @@ impl DocumentFactoryV0 { Vec<(Document, DocumentTypeRef<'a>, Bytes32)>, ), >, + nonce_counter: &mut BTreeMap<(Identifier, Identifier), u64>, //IdentityID/ContractID -> nonce ) -> Result { let platform_version = PlatformVersion::get(self.protocol_version)?; let documents: Vec<( @@ -201,13 +203,14 @@ impl DocumentFactoryV0 { .into_iter() .map(|(action, documents)| match action { DocumentTransitionActionType::Create => { - Self::document_create_transitions(documents, platform_version) + Self::document_create_transitions(documents, nonce_counter, platform_version) } DocumentTransitionActionType::Delete => Self::document_delete_transitions( documents .into_iter() .map(|(document, document_type, _)| (document, document_type)) .collect(), + nonce_counter, platform_version, ), DocumentTransitionActionType::Replace => Self::document_replace_transitions( @@ -215,8 +218,12 @@ impl DocumentFactoryV0 { .into_iter() .map(|(document, document_type, _)| (document, document_type)) .collect(), + nonce_counter, platform_version, ), + _ => Err(ProtocolError::InvalidStateTransitionType( + "action type not accounted for".to_string(), + )), }) .collect::, ProtocolError>>()? .into_iter() @@ -332,6 +339,7 @@ impl DocumentFactoryV0 { #[cfg(feature = "state-transitions")] fn document_create_transitions( documents: Vec<(Document, DocumentTypeRef, Bytes32)>, + nonce_counter: &mut BTreeMap<(Identifier, Identifier), u64>, //IdentityID/ContractID -> nonce platform_version: &PlatformVersion, ) -> Result, ProtocolError> { documents @@ -352,15 +360,23 @@ impl DocumentFactoryV0 { .into()); } } - Ok(DocumentCreateTransition::from_document( + let nonce = nonce_counter + .entry((document.owner_id(), document_type.data_contract_id())) + .or_default(); + + let transition = DocumentCreateTransition::from_document( document, document_type, entropy.to_buffer(), + *nonce, platform_version, None, None, - )? - .into()) + )?; + + *nonce += 1; + + Ok(transition.into()) }) .collect() } @@ -368,6 +384,7 @@ impl DocumentFactoryV0 { #[cfg(feature = "state-transitions")] fn document_replace_transitions( documents: Vec<(Document, DocumentTypeRef)>, + nonce_counter: &mut BTreeMap<(Identifier, Identifier), u64>, //IdentityID/ContractID -> nonce platform_version: &PlatformVersion, ) -> Result, ProtocolError> { documents @@ -389,14 +406,22 @@ impl DocumentFactoryV0 { document.increment_revision()?; document.set_updated_at(Some(Utc::now().timestamp_millis() as TimestampMillis)); - Ok(DocumentReplaceTransition::from_document( + let nonce = nonce_counter + .entry((document.owner_id(), document_type.data_contract_id())) + .or_default(); + + let transition = DocumentReplaceTransition::from_document( document, document_type, + *nonce, platform_version, None, None, - )? - .into()) + )?; + + *nonce += 1; + + Ok(transition.into()) }) .collect() // let mut raw_transitions = vec![]; @@ -443,6 +468,7 @@ impl DocumentFactoryV0 { #[cfg(feature = "state-transitions")] fn document_delete_transitions( documents: Vec<(Document, DocumentTypeRef)>, + nonce_counter: &mut BTreeMap<(Identifier, Identifier), u64>, //IdentityID/ContractID -> nonce platform_version: &PlatformVersion, ) -> Result, ProtocolError> { documents @@ -460,14 +486,22 @@ impl DocumentFactoryV0 { } .into()); }; - Ok(DocumentDeleteTransition::from_document( + + let nonce = nonce_counter + .entry((document.owner_id(), document_type.data_contract_id())) + .or_default(); + let transition = DocumentDeleteTransition::from_document( document, document_type, + *nonce, platform_version, None, None, - )? - .into()) + )?; + + *nonce += 1; + + Ok(transition.into()) }) .collect() } diff --git a/packages/rs-dpp/src/document/specialized_document_factory/mod.rs b/packages/rs-dpp/src/document/specialized_document_factory/mod.rs index 27e342a12d..1758e27ef1 100644 --- a/packages/rs-dpp/src/document/specialized_document_factory/mod.rs +++ b/packages/rs-dpp/src/document/specialized_document_factory/mod.rs @@ -1,6 +1,7 @@ mod v0; use crate::data_contract::DataContract; +use std::collections::BTreeMap; use crate::version::PlatformVersion; use crate::ProtocolError; @@ -119,9 +120,12 @@ impl SpecializedDocumentFactory { Vec<(Document, DocumentTypeRef<'a>, Bytes32)>, ), >, + nonce_counter: &mut BTreeMap<(Identifier, Identifier), u64>, //IdentityID/ContractID -> nonce ) -> Result { match self { - SpecializedDocumentFactory::V0(v0) => v0.create_state_transition(documents_iter), + SpecializedDocumentFactory::V0(v0) => { + v0.create_state_transition(documents_iter, nonce_counter) + } } } diff --git a/packages/rs-dpp/src/document/specialized_document_factory/v0/mod.rs b/packages/rs-dpp/src/document/specialized_document_factory/v0/mod.rs index 0c475109ac..c3fc31defb 100644 --- a/packages/rs-dpp/src/document/specialized_document_factory/v0/mod.rs +++ b/packages/rs-dpp/src/document/specialized_document_factory/v0/mod.rs @@ -7,6 +7,7 @@ use crate::data_contract::DataContract; use crate::document::errors::DocumentError; use crate::document::{Document, DocumentV0Getters, DocumentV0Setters, INITIAL_REVISION}; use chrono::Utc; +use std::collections::BTreeMap; use crate::util::entropy_generator::{DefaultEntropyGenerator, EntropyGenerator}; use crate::version::PlatformVersion; @@ -176,6 +177,7 @@ impl SpecializedDocumentFactoryV0 { Vec<(Document, DocumentTypeRef<'a>, Bytes32)>, ), >, + nonce_counter: &mut BTreeMap<(Identifier, Identifier), u64>, //IdentityID/ContractID -> nonce ) -> Result { let platform_version = PlatformVersion::get(self.protocol_version)?; let documents: Vec<( @@ -210,13 +212,14 @@ impl SpecializedDocumentFactoryV0 { .into_iter() .map(|(action, documents)| match action { DocumentTransitionActionType::Create => { - Self::document_create_transitions(documents, platform_version) + Self::document_create_transitions(documents, nonce_counter, platform_version) } DocumentTransitionActionType::Delete => Self::document_delete_transitions( documents .into_iter() .map(|(document, document_type, _)| (document, document_type)) .collect(), + nonce_counter, platform_version, ), DocumentTransitionActionType::Replace => Self::document_replace_transitions( @@ -224,8 +227,12 @@ impl SpecializedDocumentFactoryV0 { .into_iter() .map(|(document, document_type, _)| (document, document_type)) .collect(), + nonce_counter, platform_version, ), + _ => Err(ProtocolError::InvalidStateTransitionType( + "action type not accounted for".to_string(), + )), }) .collect::, ProtocolError>>()? .into_iter() @@ -342,6 +349,7 @@ impl SpecializedDocumentFactoryV0 { #[cfg(feature = "state-transitions")] fn document_create_transitions( documents: Vec<(Document, DocumentTypeRef, Bytes32)>, + nonce_counter: &mut BTreeMap<(Identifier, Identifier), u64>, //IdentityID/ContractID -> nonce platform_version: &PlatformVersion, ) -> Result, ProtocolError> { documents @@ -362,15 +370,23 @@ impl SpecializedDocumentFactoryV0 { .into()); } } - Ok(DocumentCreateTransition::from_document( + let nonce = nonce_counter + .entry((document.owner_id(), document_type.data_contract_id())) + .or_default(); + + let transition = DocumentCreateTransition::from_document( document, document_type, entropy.to_buffer(), + *nonce, platform_version, None, None, - )? - .into()) + )?; + + *nonce += 1; + + Ok(transition.into()) }) .collect() } @@ -378,6 +394,7 @@ impl SpecializedDocumentFactoryV0 { #[cfg(feature = "state-transitions")] fn document_replace_transitions( documents: Vec<(Document, DocumentTypeRef)>, + nonce_counter: &mut BTreeMap<(Identifier, Identifier), u64>, //IdentityID/ContractID -> nonce platform_version: &PlatformVersion, ) -> Result, ProtocolError> { documents @@ -399,14 +416,22 @@ impl SpecializedDocumentFactoryV0 { document.set_revision(document.revision().map(|revision| revision + 1)); document.set_updated_at(Some(Utc::now().timestamp_millis() as TimestampMillis)); - Ok(DocumentReplaceTransition::from_document( + let nonce = nonce_counter + .entry((document.owner_id(), document_type.data_contract_id())) + .or_default(); + + let transition = DocumentReplaceTransition::from_document( document, document_type, + *nonce, platform_version, None, None, - )? - .into()) + )?; + + *nonce += 1; + + Ok(transition.into()) }) .collect() // let mut raw_transitions = vec![]; @@ -453,6 +478,7 @@ impl SpecializedDocumentFactoryV0 { #[cfg(feature = "state-transitions")] fn document_delete_transitions( documents: Vec<(Document, DocumentTypeRef)>, + nonce_counter: &mut BTreeMap<(Identifier, Identifier), u64>, //IdentityID/ContractID -> nonce platform_version: &PlatformVersion, ) -> Result, ProtocolError> { documents @@ -470,14 +496,21 @@ impl SpecializedDocumentFactoryV0 { } .into()); }; - Ok(DocumentDeleteTransition::from_document( + let nonce = nonce_counter + .entry((document.owner_id(), document_type.data_contract_id())) + .or_default(); + let transition = DocumentDeleteTransition::from_document( document, document_type, + *nonce, platform_version, None, None, - )? - .into()) + )?; + + *nonce += 1; + + Ok(transition.into()) }) .collect() } diff --git a/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs b/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs index f5132a4f9e..0673649dfd 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs @@ -20,11 +20,12 @@ use crate::consensus::basic::decode::{ use crate::consensus::basic::document::{ DataContractNotPresentError, DocumentTransitionsAreAbsentError, DuplicateDocumentTransitionsWithIdsError, DuplicateDocumentTransitionsWithIndicesError, - InconsistentCompoundIndexDataError, InvalidDocumentTransitionActionError, - InvalidDocumentTransitionIdError, InvalidDocumentTypeError, - MaxDocumentsTransitionsExceededError, MissingDataContractIdBasicError, - MissingDocumentTransitionActionError, MissingDocumentTransitionTypeError, - MissingDocumentTypeError, MissingPositionsInDocumentTypePropertiesError, + IdentityContractNonceOutOfBoundsError, InconsistentCompoundIndexDataError, + InvalidDocumentTransitionActionError, InvalidDocumentTransitionIdError, + InvalidDocumentTypeError, MaxDocumentsTransitionsExceededError, + MissingDataContractIdBasicError, MissingDocumentTransitionActionError, + MissingDocumentTransitionTypeError, MissingDocumentTypeError, + MissingPositionsInDocumentTypePropertiesError, }; use crate::consensus::basic::identity::{ DataContractBoundsNotPresentError, DuplicatedIdentityPublicKeyBasicError, @@ -167,6 +168,9 @@ pub enum BasicError { #[error(transparent)] DuplicateDocumentTransitionsWithIndicesError(DuplicateDocumentTransitionsWithIndicesError), + #[error(transparent)] + IdentityContractNonceOutOfBoundsError(IdentityContractNonceOutOfBoundsError), + #[error(transparent)] InconsistentCompoundIndexDataError(InconsistentCompoundIndexDataError), diff --git a/packages/rs-dpp/src/errors/consensus/basic/data_contract/invalid_data_contract_version_error.rs b/packages/rs-dpp/src/errors/consensus/basic/data_contract/invalid_data_contract_version_error.rs index f978d38d20..02fde1a679 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/data_contract/invalid_data_contract_version_error.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/data_contract/invalid_data_contract_version_error.rs @@ -8,7 +8,7 @@ use thiserror::Error; #[derive( Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, )] -#[error("Data Contract version must be {expected_version}, go {version}")] +#[error("Data Contract version must be {expected_version}, got {version}")] #[platform_serialize(unversioned)] pub struct InvalidDataContractVersionError { /* diff --git a/packages/rs-dpp/src/errors/consensus/basic/document/identity_contract_nonce_out_of_bounds_error.rs b/packages/rs-dpp/src/errors/consensus/basic/document/identity_contract_nonce_out_of_bounds_error.rs new file mode 100644 index 0000000000..cfa38282ac --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/basic/document/identity_contract_nonce_out_of_bounds_error.rs @@ -0,0 +1,42 @@ +use crate::consensus::basic::BasicError; +use crate::consensus::ConsensusError; +use crate::errors::ProtocolError; +use crate::prelude::IdentityNonce; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error( + "Identity contract nonce is out of bounds: {}", + identity_contract_nonce +)] +#[platform_serialize(unversioned)] +pub struct IdentityContractNonceOutOfBoundsError { + /* + + DO NOT CHANGE ORDER OF FIELDS WITHOUT INTRODUCING OF NEW VERSION + + */ + identity_contract_nonce: IdentityNonce, +} + +impl IdentityContractNonceOutOfBoundsError { + pub fn new(identity_contract_nonce: IdentityNonce) -> Self { + Self { + identity_contract_nonce, + } + } + + pub fn identity_contract_nonce(&self) -> IdentityNonce { + self.identity_contract_nonce + } +} + +impl From for ConsensusError { + fn from(err: IdentityContractNonceOutOfBoundsError) -> Self { + Self::BasicError(BasicError::IdentityContractNonceOutOfBoundsError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/basic/document/mod.rs b/packages/rs-dpp/src/errors/consensus/basic/document/mod.rs index 97346e5b0a..7cc323f4fa 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/document/mod.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/document/mod.rs @@ -2,6 +2,7 @@ mod data_contract_not_present_error; mod document_transitions_are_absent_error; mod duplicate_document_transitions_with_ids_error; mod duplicate_document_transitions_with_indices_error; +mod identity_contract_nonce_out_of_bounds_error; mod inconsistent_compound_index_data_error; mod invalid_document_transition_action_error; mod invalid_document_transition_id_error; @@ -17,6 +18,7 @@ pub use data_contract_not_present_error::*; pub use document_transitions_are_absent_error::*; pub use duplicate_document_transitions_with_ids_error::*; pub use duplicate_document_transitions_with_indices_error::*; +pub use identity_contract_nonce_out_of_bounds_error::*; pub use inconsistent_compound_index_data_error::*; pub use invalid_document_transition_action_error::*; pub use invalid_document_transition_id_error::*; diff --git a/packages/rs-dpp/src/errors/consensus/codes.rs b/packages/rs-dpp/src/errors/consensus/codes.rs index e8e9a65c8c..151744c457 100644 --- a/packages/rs-dpp/src/errors/consensus/codes.rs +++ b/packages/rs-dpp/src/errors/consensus/codes.rs @@ -80,6 +80,7 @@ impl ErrorWithCode for BasicError { Self::MissingPositionsInDocumentTypePropertiesError { .. } => 1067, Self::MaxDocumentsTransitionsExceededError { .. } => 1065, Self::DocumentTransitionsAreAbsentError { .. } => 1068, + Self::IdentityContractNonceOutOfBoundsError(_) => 1069, // Identity Self::DuplicatedIdentityPublicKeyBasicError(_) => 1029, @@ -171,14 +172,15 @@ impl ErrorWithCode for StateError { Self::IdentityPublicKeyIsReadOnlyError { .. } => 4017, Self::InvalidIdentityPublicKeyIdError { .. } => 4018, Self::InvalidIdentityRevisionError { .. } => 4019, - Self::MaxIdentityPublicKeyLimitReachedError { .. } => 4020, - Self::DuplicatedIdentityPublicKeyStateError { .. } => 4021, - Self::DuplicatedIdentityPublicKeyIdStateError { .. } => 4022, - Self::IdentityPublicKeyIsDisabledError { .. } => 4023, - Self::MissingIdentityPublicKeyIdsError { .. } => 4024, + Self::InvalidIdentityNonceError(_) => 4020, + Self::MaxIdentityPublicKeyLimitReachedError { .. } => 4021, + Self::DuplicatedIdentityPublicKeyStateError { .. } => 4022, + Self::DuplicatedIdentityPublicKeyIdStateError { .. } => 4023, + Self::IdentityPublicKeyIsDisabledError { .. } => 4024, + Self::MissingIdentityPublicKeyIdsError { .. } => 4025, Self::IdentityInsufficientBalanceError(_) => 4026, - Self::IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError(_) => 4027, - Self::InvalidAssetLockProofValueError(_) => 4028, + Self::IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError(_) => 4028, + Self::InvalidAssetLockProofValueError(_) => 4029, } } } diff --git a/packages/rs-dpp/src/errors/consensus/state/identity/invalid_identity_contract_nonce_error.rs b/packages/rs-dpp/src/errors/consensus/state/identity/invalid_identity_contract_nonce_error.rs new file mode 100644 index 0000000000..893a98f553 --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/state/identity/invalid_identity_contract_nonce_error.rs @@ -0,0 +1,76 @@ +use crate::consensus::state::state_error::StateError; +use crate::consensus::ConsensusError; +use crate::errors::ProtocolError; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use std::fmt::{Display, Formatter}; +use thiserror::Error; + +use crate::prelude::{Identifier, IdentityNonce, Revision}; + +use crate::identity::identity_nonce::MergeIdentityNonceResult; +use bincode::{Decode, Encode}; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[platform_serialize(unversioned)] +pub struct InvalidIdentityNonceError { + /* + + DO NOT CHANGE ORDER OF FIELDS WITHOUT INTRODUCING OF NEW VERSION + + */ + pub identity_id: Identifier, + pub current_identity_nonce: Option, + pub setting_identity_nonce: IdentityNonce, + pub error: MergeIdentityNonceResult, +} +impl Display for InvalidIdentityNonceError { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + // Pre-calculate the `current_identity_contract_nonce` value + let current_nonce = self + .current_identity_nonce + .as_ref() + .unwrap_or(&Default::default()) // Assuming `IdentityContractNonce` implements `Default` + .to_string(); // Assuming `IdentityContractNonce` implements `ToString` or has a similar method for representation + + // Format the error message with pre-calculated `current_nonce` + write!(f, "Identity {} is trying to set an invalid identity nonce. The current identity nonce is {}, we are setting {}, error is {}", self.identity_id, current_nonce, self.setting_identity_nonce, self.error) + } +} + +impl InvalidIdentityNonceError { + pub fn new( + identity_id: Identifier, + current_identity_contract_nonce: Option, + setting_identity_contract_nonce: IdentityNonce, + error: MergeIdentityNonceResult, + ) -> Self { + Self { + identity_id, + current_identity_nonce: current_identity_contract_nonce, + setting_identity_nonce: setting_identity_contract_nonce, + error, + } + } + + pub fn identity_id(&self) -> &Identifier { + &self.identity_id + } + pub fn current_identity_contract_nonce(&self) -> Option<&IdentityNonce> { + self.current_identity_nonce.as_ref() + } + + pub fn setting_identity_contract_nonce(&self) -> &IdentityNonce { + &self.setting_identity_nonce + } + + pub fn error(&self) -> &MergeIdentityNonceResult { + &self.error + } +} +impl From for ConsensusError { + fn from(err: InvalidIdentityNonceError) -> Self { + Self::StateError(StateError::InvalidIdentityNonceError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/state/identity/mod.rs b/packages/rs-dpp/src/errors/consensus/state/identity/mod.rs index 0aaa101f6c..6b8fbc0e27 100644 --- a/packages/rs-dpp/src/errors/consensus/state/identity/mod.rs +++ b/packages/rs-dpp/src/errors/consensus/state/identity/mod.rs @@ -10,6 +10,7 @@ pub mod identity_public_key_disabled_at_window_violation_error; pub mod identity_public_key_is_disabled_error; pub mod identity_public_key_is_read_only_error; pub mod invalid_asset_lock_proof_value; +pub mod invalid_identity_contract_nonce_error; pub mod invalid_identity_public_key_id_error; pub mod invalid_identity_revision_error; pub mod max_identity_public_key_limit_reached_error; diff --git a/packages/rs-dpp/src/errors/consensus/state/state_error.rs b/packages/rs-dpp/src/errors/consensus/state/state_error.rs index d79f5656e8..7c2b957563 100644 --- a/packages/rs-dpp/src/errors/consensus/state/state_error.rs +++ b/packages/rs-dpp/src/errors/consensus/state/state_error.rs @@ -30,6 +30,7 @@ use crate::consensus::state::identity::{ use crate::consensus::ConsensusError; use crate::consensus::state::identity::identity_public_key_already_exists_for_unique_contract_bounds_error::IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError; use crate::consensus::state::identity::invalid_asset_lock_proof_value::InvalidAssetLockProofValueError; +use crate::consensus::state::identity::invalid_identity_contract_nonce_error::InvalidIdentityNonceError; use super::document::document_timestamps_are_equal_error::DocumentTimestampsAreEqualError; @@ -98,6 +99,9 @@ pub enum StateError { #[error(transparent)] InvalidIdentityRevisionError(InvalidIdentityRevisionError), + #[error(transparent)] + InvalidIdentityNonceError(InvalidIdentityNonceError), + #[error(transparent)] MaxIdentityPublicKeyLimitReachedError(MaxIdentityPublicKeyLimitReachedError), diff --git a/packages/rs-dpp/src/errors/protocol_error.rs b/packages/rs-dpp/src/errors/protocol_error.rs index 45952aa3ed..579f0faea5 100644 --- a/packages/rs-dpp/src/errors/protocol_error.rs +++ b/packages/rs-dpp/src/errors/protocol_error.rs @@ -99,6 +99,9 @@ pub enum ProtocolError { #[error(transparent)] StateTransitionError(#[from] StateTransitionError), + #[error("Invalid State Transition Type: {0}")] + InvalidStateTransitionType(String), + #[error(transparent)] StructureError(#[from] StructureError), diff --git a/packages/rs-dpp/src/identity/identity.rs b/packages/rs-dpp/src/identity/identity.rs index 3431f4071c..179712f0a8 100644 --- a/packages/rs-dpp/src/identity/identity.rs +++ b/packages/rs-dpp/src/identity/identity.rs @@ -12,6 +12,7 @@ use derive_more::From; use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; use platform_value::Identifier; +use crate::fee::Credits; use serde::{Deserialize, Serialize}; use std::collections::{BTreeMap, BTreeSet}; @@ -40,7 +41,7 @@ pub enum Identity { pub struct PartialIdentity { pub id: Identifier, pub loaded_public_keys: BTreeMap, - pub balance: Option, + pub balance: Option, pub revision: Option, /// These are keys that were requested but didn't exist pub not_found_public_keys: BTreeSet, diff --git a/packages/rs-dpp/src/identity/identity_facade.rs b/packages/rs-dpp/src/identity/identity_facade.rs index 0b55beff3d..5f8f5c8015 100644 --- a/packages/rs-dpp/src/identity/identity_facade.rs +++ b/packages/rs-dpp/src/identity/identity_facade.rs @@ -5,7 +5,7 @@ use std::collections::BTreeMap; use crate::identity::state_transition::asset_lock_proof::chain::ChainAssetLockProof; use crate::identity::state_transition::asset_lock_proof::{AssetLockProof, InstantAssetLockProof}; use crate::identity::{Identity, IdentityPublicKey, KeyID, TimestampMillis}; -use crate::prelude::{Identifier, Revision}; +use crate::prelude::{Identifier, IdentityNonce, Revision}; use crate::identity::identity_factory::IdentityFactory; #[cfg(feature = "state-transitions")] @@ -106,9 +106,14 @@ impl IdentityFacade { identity: &Identity, recipient_id: Identifier, amount: u64, + identity_nonce: IdentityNonce, ) -> Result { - self.factory - .create_identity_credit_transfer_transition(identity, recipient_id, amount) + self.factory.create_identity_credit_transfer_transition( + identity, + recipient_id, + amount, + identity_nonce, + ) } #[cfg(feature = "state-transitions")] @@ -119,7 +124,7 @@ impl IdentityFacade { core_fee_per_byte: u32, pooling: Pooling, output_script: CoreScript, - revision: Revision, + identity_nonce: u64, ) -> Result { self.factory.create_identity_credit_withdrawal_transition( identity_id, @@ -127,7 +132,7 @@ impl IdentityFacade { core_fee_per_byte, pooling, output_script, - revision, + identity_nonce, ) } @@ -135,6 +140,7 @@ impl IdentityFacade { pub fn create_identity_update_transition( &self, identity: Identity, + identity_nonce: u64, add_public_keys: Option>, public_key_ids_to_disable: Option>, // Pass disable time as argument because SystemTime::now() does not work for wasm target @@ -143,6 +149,7 @@ impl IdentityFacade { ) -> Result { self.factory.create_identity_update_transition( identity, + identity_nonce, add_public_keys, public_key_ids_to_disable, disable_time, diff --git a/packages/rs-dpp/src/identity/identity_factory.rs b/packages/rs-dpp/src/identity/identity_factory.rs index 2255e41671..d0d64ac2bc 100644 --- a/packages/rs-dpp/src/identity/identity_factory.rs +++ b/packages/rs-dpp/src/identity/identity_factory.rs @@ -24,7 +24,7 @@ use crate::identity::accessors::IdentityGettersV0; #[cfg(all(feature = "validation", feature = "identity-value-conversion"))] use crate::identity::conversion::platform_value::IdentityPlatformValueConversionMethodsV0; use crate::identity::core_script::CoreScript; -use crate::prelude::Revision; +use crate::prelude::{IdentityNonce, Revision}; #[cfg(all(feature = "identity-serialization", feature = "client"))] use crate::serialization::PlatformDeserializable; #[cfg(all(feature = "state-transitions", feature = "client"))] @@ -205,12 +205,13 @@ impl IdentityFactory { identity: &Identity, recipient_id: Identifier, amount: u64, + identity_nonce: IdentityNonce, ) -> Result { let identity_credit_transfer_transition = IdentityCreditTransferTransitionV0 { identity_id: identity.id(), recipient_id, amount, - revision: identity.revision() + 1, + nonce: identity_nonce, ..Default::default() }; @@ -227,7 +228,7 @@ impl IdentityFactory { core_fee_per_byte: u32, pooling: Pooling, output_script: CoreScript, - revision: Revision, + identity_nonce: IdentityNonce, ) -> Result { let mut identity_credit_withdrawal_transition = IdentityCreditWithdrawalTransitionV0::default(); @@ -236,7 +237,7 @@ impl IdentityFactory { identity_credit_withdrawal_transition.core_fee_per_byte = core_fee_per_byte; identity_credit_withdrawal_transition.pooling = pooling; identity_credit_withdrawal_transition.output_script = output_script; - identity_credit_withdrawal_transition.revision = revision; + identity_credit_withdrawal_transition.nonce = identity_nonce; Ok(IdentityCreditWithdrawalTransition::from( identity_credit_withdrawal_transition, @@ -247,6 +248,7 @@ impl IdentityFactory { pub fn create_identity_update_transition( &self, identity: Identity, + identity_nonce: u64, add_public_keys: Option>, public_key_ids_to_disable: Option>, // Pass disable time as argument because SystemTime::now() does not work for wasm target @@ -256,6 +258,7 @@ impl IdentityFactory { let mut identity_update_transition = IdentityUpdateTransitionV0::default(); identity_update_transition.set_identity_id(identity.id().to_owned()); identity_update_transition.set_revision(identity.revision() + 1); + identity_update_transition.set_nonce(identity_nonce); if let Some(add_public_keys) = add_public_keys { identity_update_transition.set_public_keys_to_add(add_public_keys); diff --git a/packages/rs-dpp/src/identity/identity_nonce.rs b/packages/rs-dpp/src/identity/identity_nonce.rs new file mode 100644 index 0000000000..85c41f6fa5 --- /dev/null +++ b/packages/rs-dpp/src/identity/identity_nonce.rs @@ -0,0 +1,269 @@ +use crate::ProtocolError; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use std::fmt::{Debug, Display, Formatter}; + +use crate::consensus::state::identity::invalid_identity_contract_nonce_error::InvalidIdentityNonceError; +use crate::consensus::state::state_error::StateError; +use crate::consensus::ConsensusError; +use crate::prelude::IdentityNonce; +use crate::validation::SimpleConsensusValidationResult; +use bincode::{Decode, Encode}; +use platform_value::Identifier; + +pub const IDENTITY_NONCE_VALUE_FILTER: u64 = 0xFFFFFFFFFF; +pub const MISSING_IDENTITY_REVISIONS_FILTER: u64 = 0xFFFFFF0000000000; +pub const MAX_MISSING_IDENTITY_REVISIONS: u64 = 24; +pub const MISSING_IDENTITY_REVISIONS_MAX_BYTES: u64 = MAX_MISSING_IDENTITY_REVISIONS; +pub const IDENTITY_NONCE_VALUE_FILTER_MAX_BYTES: u64 = 40; + +#[derive( + Debug, Clone, Copy, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +/// The result of the merge of the identity contract nonce +pub enum MergeIdentityNonceResult { + /// The nonce is an invalid value + /// This could be 0 + InvalidNonce, + /// The nonce is too far in the future + NonceTooFarInFuture, + /// The nonce is too far in the past + NonceTooFarInPast, + /// The nonce is already present at the tip + NonceAlreadyPresentAtTip, + /// The nonce is already present in the past + NonceAlreadyPresentInPast(u64), + /// The merge is a success + MergeIdentityNonceSuccess(IdentityNonce), +} + +impl Display for MergeIdentityNonceResult { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + f.write_str(self.error_message().unwrap_or_else(|| "no error")) + } +} + +impl MergeIdentityNonceResult { + /// Gives a result from the enum + pub fn error_message(&self) -> Option<&'static str> { + match self { + MergeIdentityNonceResult::NonceTooFarInFuture => Some("nonce too far in future"), + MergeIdentityNonceResult::NonceTooFarInPast => Some("nonce too far in past"), + MergeIdentityNonceResult::NonceAlreadyPresentAtTip => { + Some("nonce already present at tip") + } + MergeIdentityNonceResult::NonceAlreadyPresentInPast(_) => { + Some("nonce already present in past") + } + MergeIdentityNonceResult::MergeIdentityNonceSuccess(_) => None, + MergeIdentityNonceResult::InvalidNonce => Some("nonce is an invalid value"), + } + } + + /// Is this result an error? + pub fn is_error(&self) -> bool { + match self { + MergeIdentityNonceResult::MergeIdentityNonceSuccess(_) => false, + _ => true, + } + } +} + +pub fn validate_new_identity_nonce( + new_revision_nonce: IdentityNonce, + identity_id: Identifier, +) -> SimpleConsensusValidationResult { + if new_revision_nonce >= MISSING_IDENTITY_REVISIONS_MAX_BYTES { + // we are too far away from the actual revision + SimpleConsensusValidationResult::new_with_error(ConsensusError::StateError( + StateError::InvalidIdentityNonceError(InvalidIdentityNonceError { + identity_id, + current_identity_nonce: None, + setting_identity_nonce: new_revision_nonce, + error: MergeIdentityNonceResult::NonceTooFarInPast, + }), + )) + } else { + SimpleConsensusValidationResult::new() + } +} + +pub fn validate_identity_nonce_update( + existing_nonce: IdentityNonce, + new_revision_nonce: IdentityNonce, + identity_id: Identifier, +) -> SimpleConsensusValidationResult { + let actual_existing_revision = existing_nonce & IDENTITY_NONCE_VALUE_FILTER; + if actual_existing_revision == new_revision_nonce { + // we were not able to update the revision as it is the same as we already had + return SimpleConsensusValidationResult::new_with_error(ConsensusError::StateError( + StateError::InvalidIdentityNonceError(InvalidIdentityNonceError { + identity_id, + current_identity_nonce: Some(existing_nonce), + setting_identity_nonce: new_revision_nonce, + error: MergeIdentityNonceResult::NonceAlreadyPresentAtTip, + }), + )); + } else if actual_existing_revision < new_revision_nonce { + if new_revision_nonce - actual_existing_revision > MISSING_IDENTITY_REVISIONS_MAX_BYTES { + // we are too far away from the actual revision + return SimpleConsensusValidationResult::new_with_error(ConsensusError::StateError( + StateError::InvalidIdentityNonceError(InvalidIdentityNonceError { + identity_id, + current_identity_nonce: Some(existing_nonce), + setting_identity_nonce: new_revision_nonce, + error: MergeIdentityNonceResult::NonceTooFarInFuture, + }), + )); + } + } else { + let previous_revision_position_from_top = actual_existing_revision - new_revision_nonce; + if previous_revision_position_from_top > MISSING_IDENTITY_REVISIONS_MAX_BYTES { + // we are too far away from the actual revision + return SimpleConsensusValidationResult::new_with_error(ConsensusError::StateError( + StateError::InvalidIdentityNonceError(InvalidIdentityNonceError { + identity_id, + current_identity_nonce: Some(existing_nonce), + setting_identity_nonce: new_revision_nonce, + error: MergeIdentityNonceResult::NonceTooFarInPast, + }), + )); + } else { + let old_missing_revisions = existing_nonce & MISSING_IDENTITY_REVISIONS_FILTER; + let old_revision_already_set = if old_missing_revisions == 0 { + true + } else { + let byte_to_unset = 1 + << (previous_revision_position_from_top - 1 + + IDENTITY_NONCE_VALUE_FILTER_MAX_BYTES); + old_missing_revisions | byte_to_unset != old_missing_revisions + }; + + if old_revision_already_set { + return SimpleConsensusValidationResult::new_with_error( + ConsensusError::StateError(StateError::InvalidIdentityNonceError( + InvalidIdentityNonceError { + identity_id, + current_identity_nonce: Some(existing_nonce), + setting_identity_nonce: new_revision_nonce, + error: MergeIdentityNonceResult::NonceAlreadyPresentInPast( + previous_revision_position_from_top, + ), + }, + )), + ); + } + } + } + SimpleConsensusValidationResult::new() +} + +#[cfg(test)] +mod tests { + use crate::consensus::state::state_error::StateError; + use crate::consensus::ConsensusError; + use crate::identity::identity_nonce::{ + validate_identity_nonce_update, MergeIdentityNonceResult, + }; + use platform_value::Identifier; + + #[test] + fn validate_identity_nonce_not_changed() { + let tip = 50; + let new_nonce = tip; + let identity_id = Identifier::default(); + let result = validate_identity_nonce_update(tip, new_nonce, identity_id); + + let Some(ConsensusError::StateError(StateError::InvalidIdentityNonceError(e))) = + result.errors.first() + else { + panic!("expected state error"); + }; + assert_eq!(e.error, MergeIdentityNonceResult::NonceAlreadyPresentAtTip); + } + + #[test] + fn validate_identity_nonce_update_too_far_in_past() { + let tip = 50; + let new_nonce = tip - 25; + let identity_id = Identifier::default(); + let result = validate_identity_nonce_update(tip, new_nonce, identity_id); + + let Some(ConsensusError::StateError(StateError::InvalidIdentityNonceError(e))) = + result.errors.first() + else { + panic!("expected state error"); + }; + assert_eq!(e.error, MergeIdentityNonceResult::NonceTooFarInPast); + } + + #[test] + fn validate_identity_nonce_update_too_far_in_future() { + let tip = 50; + let new_nonce = tip + 25; + let identity_id = Identifier::default(); + let result = validate_identity_nonce_update(tip, new_nonce, identity_id); + + let Some(ConsensusError::StateError(StateError::InvalidIdentityNonceError(e))) = + result.errors.first() + else { + panic!("expected state error"); + }; + assert_eq!(e.error, MergeIdentityNonceResult::NonceTooFarInFuture); + } + + #[test] + fn validate_identity_nonce_update_already_in_past_no_missing_in_nonce() { + let tip = 50; + let new_nonce = tip - 24; + let identity_id = Identifier::default(); + let result = validate_identity_nonce_update(tip, new_nonce, identity_id); + + let Some(ConsensusError::StateError(StateError::InvalidIdentityNonceError(e))) = + result.errors.first() + else { + panic!("expected state error"); + }; + assert_eq!( + e.error, + MergeIdentityNonceResult::NonceAlreadyPresentInPast(24) + ); + } + + #[test] + fn validate_identity_nonce_update_already_in_past_some_missing_in_nonce() { + let tip = 50 | 0x0FFF000000000000; + let new_nonce = 50 - 24; + let identity_id = Identifier::default(); + let result = validate_identity_nonce_update(tip, new_nonce, identity_id); + + let Some(ConsensusError::StateError(StateError::InvalidIdentityNonceError(e))) = + result.errors.first() + else { + panic!("expected state error"); + }; + assert_eq!( + e.error, + MergeIdentityNonceResult::NonceAlreadyPresentInPast(24) + ); + } + + #[test] + fn validate_identity_nonce_update_not_in_past_some_missing_in_nonce() { + let tip = 50 | 0x0FFF000000000000; + let new_nonce = 50 - 20; + let identity_id = Identifier::default(); + let result = validate_identity_nonce_update(tip, new_nonce, identity_id); + + assert!(result.errors.is_empty()) + } + + #[test] + fn validate_identity_nonce_in_close_future() { + let tip = 50 | 0x0FFF000000000000; + let new_nonce = 50 + 24; + let identity_id = Identifier::default(); + let result = validate_identity_nonce_update(tip, new_nonce, identity_id); + + assert!(result.errors.is_empty()) + } +} diff --git a/packages/rs-dpp/src/identity/mod.rs b/packages/rs-dpp/src/identity/mod.rs index 902dc9aef4..2a5c7ddfb5 100644 --- a/packages/rs-dpp/src/identity/mod.rs +++ b/packages/rs-dpp/src/identity/mod.rs @@ -23,6 +23,7 @@ mod fields; mod identity_facade; #[cfg(feature = "factories")] pub mod identity_factory; +pub mod identity_nonce; mod methods; #[cfg(feature = "random-identities")] pub mod random; diff --git a/packages/rs-dpp/src/lib.rs b/packages/rs-dpp/src/lib.rs index 3de29aab5c..e06eb659e9 100644 --- a/packages/rs-dpp/src/lib.rs +++ b/packages/rs-dpp/src/lib.rs @@ -64,6 +64,7 @@ pub mod prelude { pub use crate::validation::ConsensusValidationResult; pub type TimestampMillis = u64; pub type Revision = u64; + pub type IdentityNonce = u64; } pub use bincode; diff --git a/packages/rs-dpp/src/state_transition/mod.rs b/packages/rs-dpp/src/state_transition/mod.rs index 57c3e697a2..5a288e211d 100644 --- a/packages/rs-dpp/src/state_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/mod.rs @@ -271,7 +271,7 @@ impl StateTransition { } /// Returns state transition name - pub fn name(&self) -> String { + pub fn name(&self) -> &'static str { match self { Self::DataContractCreate(_) => "DataContractCreate", Self::DataContractUpdate(_) => "DataContractUpdate", @@ -282,7 +282,6 @@ impl StateTransition { Self::IdentityUpdate(_) => "IdentityUpdate", Self::IdentityCreditTransfer(_) => "IdentityCreditTransfer", } - .to_string() } /// returns the signature as a byte-array @@ -312,6 +311,11 @@ impl StateTransition { call_method!(self, owner_id) } + /// returns the unique identifiers for the state transition + pub fn unique_identifiers(&self) -> Vec { + call_method!(self, unique_identifiers) + } + /// set a new signature pub fn set_signature(&mut self, signature: BinaryData) { call_method!(self, set_signature, signature) diff --git a/packages/rs-dpp/src/state_transition/serialization.rs b/packages/rs-dpp/src/state_transition/serialization.rs index e7ed589e5a..777c8402d9 100644 --- a/packages/rs-dpp/src/state_transition/serialization.rs +++ b/packages/rs-dpp/src/state_transition/serialization.rs @@ -121,6 +121,7 @@ mod tests { signature_public_key_id: 0, identity_id: identity.id(), revision: 1, + nonce: 1, add_public_keys: add_public_keys_in_creation, disable_public_keys: vec![], public_keys_disabled_at: None, @@ -187,6 +188,7 @@ mod tests { signature_public_key_id: 0, identity_id: identity.id(), revision: 1, + nonce: 1, add_public_keys: add_public_keys_in_creation, disable_public_keys: vec![3, 4, 5], public_keys_disabled_at: Some(15), @@ -243,7 +245,7 @@ mod tests { core_fee_per_byte: 34, pooling: Pooling::Standard, output_script: CoreScript::from_bytes((0..23).collect::>()), - revision: 1, + nonce: 1, signature_public_key_id: 0, signature: [1u8; 65].to_vec().into(), }; @@ -289,6 +291,7 @@ mod tests { created_data_contract.set_entropy_used(Default::default()); let data_contract_update_transition = DataContractUpdateTransition::V0(DataContractUpdateTransitionV0 { + identity_contract_nonce: 1, data_contract: created_data_contract .data_contract_owned() .try_into_platform_versioned(platform_version) @@ -308,6 +311,8 @@ mod tests { #[test] fn document_batch_transition_10_created_documents_ser_de() { let platform_version = PlatformVersion::latest(); + + let mut nonces = BTreeMap::new(); let data_contract = get_data_contract_fixture(None, platform_version.protocol_version) .data_contract_owned(); let documents = get_extended_documents_fixture_with_owner_id_from_contract( @@ -329,8 +334,10 @@ mod tests { ) }) .collect::>(); - let transitions = - get_document_transitions_fixture([(DocumentTransitionActionType::Create, documents)]); + let transitions = get_document_transitions_fixture( + [(DocumentTransitionActionType::Create, documents)], + &mut nonces, + ); let documents_batch_transition: DocumentsBatchTransition = DocumentsBatchTransitionV0 { owner_id: data_contract.owner_id(), transitions, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/common_fields.rs b/packages/rs-dpp/src/state_transition/state_transitions/common_fields.rs index fa6c117a5a..1ea713ff4e 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/common_fields.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/common_fields.rs @@ -1,8 +1,11 @@ pub mod property_names { pub const STATE_TRANSITION_PROTOCOL_VERSION: &str = "$version"; + pub const IDENTITY_CONTRACT_NONCE: &str = "identityContractNonce"; pub const ENTROPY: &str = "entropy"; pub const SIGNATURE_PUBLIC_KEY_ID: &str = "signaturePublicKeyId"; pub const SIGNATURE: &str = "signature"; pub const TRANSITION_TYPE: &str = "type"; pub const REVISION: &str = "revision"; + + pub const NONCE: &str = "nonce"; } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/common_fields.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/common_fields.rs index 2464b26f4d..d123c8b28c 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/common_fields.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/common_fields.rs @@ -4,4 +4,6 @@ pub mod property_names { pub const DATA_CONTRACT_OWNER_ID: &str = "dataContract.ownerId"; pub const DATA_CONTRACT_ENTROPY: &str = "dataContract.entropy"; pub const DATA_CONTRACT_PROTOCOL_VERSION: &str = "dataContract.protocolVersion"; + + pub const IDENTITY_CONTRACT_NONCE: &str = "identityContractNonce"; } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/mod.rs index 929946cda5..79afdd41f2 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/mod.rs @@ -183,7 +183,7 @@ mod test { .validation_and_processing .state_transitions .contract_create_state_transition - .structure, + .base_structure, ), ), ( diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/state_transition_like.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/state_transition_like.rs index cbacd9d9ab..4c629619ab 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/state_transition_like.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/state_transition_like.rs @@ -48,4 +48,10 @@ impl StateTransitionLike for DataContractCreateTransition { DataContractCreateTransition::V0(transition) => transition.owner_id(), } } + + fn unique_identifiers(&self) -> Vec { + match self { + DataContractCreateTransition::V0(transition) => transition.unique_identifiers(), + } + } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/state_transition_like.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/state_transition_like.rs index 5110c92e42..d92fb6ec4e 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/state_transition_like.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/state_transition_like.rs @@ -40,4 +40,12 @@ impl StateTransitionLike for DataContractCreateTransitionV0 { fn owner_id(&self) -> Identifier { self.data_contract.owner_id() } + + fn unique_identifiers(&self) -> Vec { + vec![format!( + "dcc-{}-{}", + self.data_contract.owner_id(), + self.data_contract.id() + )] + } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/accessors/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/accessors/mod.rs index c1d823b6b1..a928d77b22 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/accessors/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/accessors/mod.rs @@ -2,6 +2,7 @@ mod v0; use crate::data_contract::serialized_version::DataContractInSerializationFormat; +use crate::prelude::IdentityNonce; use crate::state_transition::data_contract_update_transition::DataContractUpdateTransition; pub use v0::*; @@ -19,4 +20,10 @@ impl DataContractUpdateTransitionAccessorsV0 for DataContractUpdateTransition { } } } + + fn identity_contract_nonce(&self) -> IdentityNonce { + match self { + DataContractUpdateTransition::V0(transition) => transition.identity_contract_nonce, + } + } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/accessors/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/accessors/v0/mod.rs index 66cbeab4b4..49907ccd40 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/accessors/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/accessors/v0/mod.rs @@ -1,6 +1,9 @@ use crate::data_contract::serialized_version::DataContractInSerializationFormat; +use crate::prelude::IdentityNonce; pub trait DataContractUpdateTransitionAccessorsV0 { fn data_contract(&self) -> &DataContractInSerializationFormat; fn set_data_contract(&mut self, data_contract: DataContractInSerializationFormat); + + fn identity_contract_nonce(&self) -> IdentityNonce; } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/fields.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/fields.rs index c0e7dfab8b..da8815abc1 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/fields.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/fields.rs @@ -1,5 +1,6 @@ use crate::state_transition::state_transitions; +use crate::state_transition::state_transitions::contract::common_fields::property_names::IDENTITY_CONTRACT_NONCE; pub use state_transitions::common_fields::property_names::{ ENTROPY, SIGNATURE, SIGNATURE_PUBLIC_KEY_ID, STATE_TRANSITION_PROTOCOL_VERSION, TRANSITION_TYPE, }; @@ -10,7 +11,8 @@ pub use state_transitions::contract::common_fields::property_names::{ pub const IDENTIFIER_FIELDS: [&str; 2] = [DATA_CONTRACT_ID, DATA_CONTRACT_OWNER_ID]; pub const BINARY_FIELDS: [&str; 2] = [DATA_CONTRACT_ENTROPY, SIGNATURE]; -pub const U32_FIELDS: [&str; 2] = [ +pub const U32_FIELDS: [&str; 3] = [ STATE_TRANSITION_PROTOCOL_VERSION, DATA_CONTRACT_PROTOCOL_VERSION, + IDENTITY_CONTRACT_NONCE, ]; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/methods/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/methods/mod.rs index b31ecf4a93..6f7196258e 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/methods/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/methods/mod.rs @@ -12,6 +12,7 @@ use crate::state_transition::StateTransition; use crate::version::FeatureVersion; use crate::ProtocolError; +use crate::prelude::IdentityNonce; use platform_version::version::PlatformVersion; impl DataContractUpdateTransitionMethodsV0 for DataContractUpdateTransition { @@ -19,6 +20,7 @@ impl DataContractUpdateTransitionMethodsV0 for DataContractUpdateTransition { data_contract: DataContract, identity: &PartialIdentity, key_id: KeyID, + identity_contract_nonce: IdentityNonce, signer: &S, platform_version: &PlatformVersion, feature_version: Option, @@ -34,6 +36,7 @@ impl DataContractUpdateTransitionMethodsV0 for DataContractUpdateTransition { data_contract, identity, key_id, + identity_contract_nonce, signer, platform_version, feature_version, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/methods/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/methods/v0/mod.rs index f114ca9bb3..eacbc8925d 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/methods/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/methods/v0/mod.rs @@ -2,6 +2,7 @@ use crate::data_contract::DataContract; use crate::identity::signer::Signer; use crate::identity::{KeyID, PartialIdentity}; +use crate::prelude::IdentityNonce; use crate::state_transition::StateTransition; use crate::version::FeatureVersion; use crate::ProtocolError; @@ -25,6 +26,7 @@ pub trait DataContractUpdateTransitionMethodsV0 { data_contract: DataContract, identity: &PartialIdentity, key_id: KeyID, + identity_contract_nonce: IdentityNonce, signer: &S, platform_version: &PlatformVersion, feature_version: Option, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/mod.rs index 7d95c8f68e..dee347eedc 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/mod.rs @@ -28,6 +28,7 @@ use platform_version::{TryFromPlatformVersioned, TryIntoPlatformVersioned}; use crate::data_contract::DataContract; use crate::identity::state_transition::OptionallyAssetLockProved; +use crate::prelude::IdentityNonce; pub use v0::*; pub type DataContractUpdateTransitionLatest = DataContractUpdateTransitionV0; @@ -58,11 +59,11 @@ pub enum DataContractUpdateTransition { V0(DataContractUpdateTransitionV0), } -impl TryFromPlatformVersioned for DataContractUpdateTransition { +impl TryFromPlatformVersioned<(DataContract, IdentityNonce)> for DataContractUpdateTransition { type Error = ProtocolError; fn try_from_platform_versioned( - value: DataContract, + value: (DataContract, IdentityNonce), platform_version: &PlatformVersion, ) -> Result { match platform_version @@ -126,8 +127,7 @@ mod test { let data_contract = get_data_contract_fixture(None, platform_version.protocol_version) .data_contract_owned(); - let state_transition: DataContractUpdateTransition = data_contract - .clone() + let state_transition: DataContractUpdateTransition = (data_contract.clone(), 1) .try_into_platform_versioned(platform_version) .expect("expected to get transition"); diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/state_transition_like.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/state_transition_like.rs index 1b6be85e7f..64cd37651d 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/state_transition_like.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/state_transition_like.rs @@ -48,4 +48,10 @@ impl StateTransitionLike for DataContractUpdateTransition { DataContractUpdateTransition::V0(transition) => transition.owner_id(), } } + + fn unique_identifiers(&self) -> Vec { + match self { + DataContractUpdateTransition::V0(transition) => transition.unique_identifiers(), + } + } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/v0/mod.rs index 698560017b..70e13309b9 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/v0/mod.rs @@ -17,6 +17,7 @@ use platform_version::version::PlatformVersion; use platform_version::{TryFromPlatformVersioned, TryIntoPlatformVersioned}; use crate::data_contract::serialized_version::DataContractInSerializationFormat; +use crate::prelude::IdentityNonce; use crate::state_transition::data_contract_update_transition::DataContractUpdateTransition; use crate::state_transition::StateTransition; use crate::{data_contract::DataContract, identity::KeyID, ProtocolError}; @@ -29,6 +30,11 @@ use crate::{data_contract::DataContract, identity::KeyID, ProtocolError}; )] pub struct DataContractUpdateTransitionV0 { + #[cfg_attr( + feature = "state-transition-serde-conversion", + serde(rename = "$identity-contract-nonce") + )] + pub identity_contract_nonce: IdentityNonce, pub data_contract: DataContractInSerializationFormat, #[platform_signable(exclude_from_sig_hash)] pub signature_public_key_id: KeyID, @@ -36,15 +42,16 @@ pub struct DataContractUpdateTransitionV0 { pub signature: BinaryData, } -impl TryFromPlatformVersioned for DataContractUpdateTransitionV0 { +impl TryFromPlatformVersioned<(DataContract, IdentityNonce)> for DataContractUpdateTransitionV0 { type Error = ProtocolError; fn try_from_platform_versioned( - value: DataContract, + value: (DataContract, IdentityNonce), platform_version: &PlatformVersion, ) -> Result { Ok(DataContractUpdateTransitionV0 { - data_contract: value.try_into_platform_versioned(platform_version)?, + identity_contract_nonce: value.1, + data_contract: value.0.try_into_platform_versioned(platform_version)?, signature_public_key_id: 0, signature: Default::default(), }) diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/v0/state_transition_like.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/v0/state_transition_like.rs index 858883b8b2..54e7e1e452 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/v0/state_transition_like.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/v0/state_transition_like.rs @@ -40,4 +40,13 @@ impl StateTransitionLike for DataContractUpdateTransitionV0 { fn owner_id(&self) -> Identifier { self.data_contract.owner_id() } + + fn unique_identifiers(&self) -> Vec { + vec![format!( + "{}-{}-{:x}", + base64::encode(self.data_contract.owner_id()), + base64::encode(self.data_contract.id()), + self.identity_contract_nonce + )] + } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/v0/v0_methods.rs index 425a5f00a5..0079341985 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/v0/v0_methods.rs @@ -3,6 +3,7 @@ use crate::identity::signer::Signer; use crate::identity::{KeyID, PartialIdentity}; use crate::serialization::Signable; +use crate::prelude::IdentityNonce; use crate::state_transition::data_contract_update_transition::methods::DataContractUpdateTransitionMethodsV0; use crate::state_transition::data_contract_update_transition::{ DataContractUpdateTransition, DataContractUpdateTransitionV0, @@ -18,11 +19,13 @@ impl DataContractUpdateTransitionMethodsV0 for DataContractUpdateTransitionV0 { data_contract: DataContract, identity: &PartialIdentity, key_id: KeyID, + identity_contract_nonce: IdentityNonce, signer: &S, platform_version: &PlatformVersion, _feature_version: Option, ) -> Result { let transition = DataContractUpdateTransition::V0(DataContractUpdateTransitionV0 { + identity_contract_nonce, data_contract: data_contract.try_into_platform_versioned(platform_version)?, signature_public_key_id: key_id, signature: Default::default(), diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/v0/value_conversion.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/v0/value_conversion.rs index 30d02d9337..25d7cf9098 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/v0/value_conversion.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/v0/value_conversion.rs @@ -4,6 +4,7 @@ use crate::state_transition::data_contract_update_transition::fields::*; use crate::state_transition::data_contract_update_transition::{ DataContractUpdateTransitionV0, BINARY_FIELDS, IDENTIFIER_FIELDS, U32_FIELDS, }; +use crate::state_transition::state_transitions::common_fields::property_names::IDENTITY_CONTRACT_NONCE; use crate::state_transition::StateTransitionFieldTypes; use crate::state_transition::StateTransitionValueConvert; use crate::ProtocolError; @@ -49,6 +50,14 @@ impl<'a> StateTransitionValueConvert<'a> for DataContractUpdateTransitionV0 { platform_version: &PlatformVersion, ) -> Result { Ok(DataContractUpdateTransitionV0 { + identity_contract_nonce: raw_object.remove_integer(IDENTITY_CONTRACT_NONCE).map_err( + |_| { + ProtocolError::DecodingError( + "identity contract nonce missing on data contract update state transition" + .to_string(), + ) + }, + )?, signature: raw_object .remove_optional_binary_data(SIGNATURE) .map_err(ProtocolError::ValueError)? @@ -75,6 +84,14 @@ impl<'a> StateTransitionValueConvert<'a> for DataContractUpdateTransitionV0 { platform_version: &PlatformVersion, ) -> Result { Ok(DataContractUpdateTransitionV0 { + identity_contract_nonce: raw_value_map + .remove_integer(IDENTITY_CONTRACT_NONCE) + .map_err(|_| { + ProtocolError::DecodingError( + "identity contract nonce missing on data contract update state transition" + .to_string(), + ) + })?, signature: raw_value_map .remove_optional_binary_data(SIGNATURE) .map_err(ProtocolError::ValueError)? diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/action_type.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/action_type.rs index f8e4b467d3..c07846f37b 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/action_type.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/action_type.rs @@ -7,6 +7,7 @@ pub enum DocumentTransitionActionType { Create, //the entropy used Replace, Delete, + IgnoreWhileBumpingRevision, } pub trait TransitionActionTypeGetter { diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/fields.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/fields.rs index cbbd27c0ea..b7e0135ed0 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/fields.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/fields.rs @@ -3,6 +3,7 @@ pub(in crate::state_transition::state_transitions::document::documents_batch_tra pub const DATA_CONTRACT_ID: &str = "$dataContractId"; pub const DOCUMENT_TYPE: &str = "$type"; pub const ACTION: &str = "$action"; + pub const IDENTITY_CONTRACT_NONCE: &str = "$identityContractNonce"; } pub const IDENTIFIER_FIELDS: [&str; 2] = [property_names::ID, property_names::DATA_CONTRACT_ID]; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/from_document.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/from_document.rs index 37044e028f..e500bbd5bd 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/from_document.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/from_document.rs @@ -1,5 +1,6 @@ use crate::data_contract::document_type::DocumentTypeRef; use crate::document::Document; +use crate::prelude::IdentityNonce; use crate::state_transition::documents_batch_transition::document_base_transition::v0::DocumentBaseTransitionV0; use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; use crate::ProtocolError; @@ -9,6 +10,7 @@ impl DocumentBaseTransition { pub fn from_document( document: &Document, document_type: DocumentTypeRef, + identity_contract_nonce: IdentityNonce, platform_version: &PlatformVersion, feature_version: Option, ) -> Result { @@ -19,7 +21,12 @@ impl DocumentBaseTransition { .document_base_state_transition .default_current_version, ) { - 0 => Ok(DocumentBaseTransitionV0::from_document(document, document_type).into()), + 0 => Ok(DocumentBaseTransitionV0::from_document( + document, + document_type, + identity_contract_nonce, + ) + .into()), version => Err(ProtocolError::UnknownVersionMismatch { method: "DocumentBaseTransition::from_document".to_string(), known_versions: vec![0], diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/v0/from_document.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/v0/from_document.rs index 236927bc07..7d3e6ef348 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/v0/from_document.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/v0/from_document.rs @@ -1,15 +1,18 @@ use crate::data_contract::document_type::accessors::DocumentTypeV0Getters; use crate::data_contract::document_type::DocumentTypeRef; use crate::document::{Document, DocumentV0Getters}; +use crate::prelude::IdentityNonce; use crate::state_transition::documents_batch_transition::document_base_transition::v0::DocumentBaseTransitionV0; impl DocumentBaseTransitionV0 { pub(in crate::state_transition::state_transitions::document::documents_batch_transition::document_transition::document_base_transition) fn from_document( document: &Document, document_type: DocumentTypeRef, + identity_contract_nonce: IdentityNonce, ) -> Self { DocumentBaseTransitionV0 { id: document.id(), + identity_contract_nonce, document_type_name: document_type.name().to_string(), data_contract_id: document_type.data_contract_id(), } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/v0/mod.rs index 44ad4a334f..0ed9ca83d1 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/v0/mod.rs @@ -12,6 +12,7 @@ use serde::{Deserialize, Serialize}; use serde_json::Value as JsonValue; use crate::data_contract::accessors::v0::DataContractV0Getters; +use crate::prelude::IdentityNonce; use crate::state_transition::documents_batch_transition::document_base_transition::property_names; use crate::{data_contract::DataContract, errors::ProtocolError, identifier::Identifier}; @@ -31,6 +32,11 @@ pub struct DocumentBaseTransitionV0 { /// The document ID #[cfg_attr(feature = "state-transition-serde-conversion", serde(rename = "$id"))] pub id: Identifier, + #[cfg_attr( + feature = "state-transition-serde-conversion", + serde(rename = "$identity-contract-nonce") + )] + pub identity_contract_nonce: IdentityNonce, /// Name of document type found int the data contract associated with the `data_contract_id` #[cfg_attr(feature = "state-transition-serde-conversion", serde(rename = "$type"))] pub document_type_name: String, @@ -47,12 +53,14 @@ impl DocumentBaseTransitionV0 { pub fn from_value_map_consume( map: &mut BTreeMap, data_contract: DataContract, + identity_contract_nonce: IdentityNonce, ) -> Result { Ok(DocumentBaseTransitionV0 { id: Identifier::from( map.remove_hash256_bytes(property_names::ID) .map_err(ProtocolError::ValueError)?, ), + identity_contract_nonce, document_type_name: map .remove_string(property_names::DOCUMENT_TYPE) .map_err(ProtocolError::ValueError)?, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/v0/v0_methods.rs index f14e445d82..c332648a54 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/v0/v0_methods.rs @@ -1,5 +1,6 @@ use crate::state_transition::documents_batch_transition::document_base_transition::v0::DocumentBaseTransitionV0; +use crate::prelude::IdentityNonce; use platform_value::Identifier; /// A trait that contains getter and setter methods for `DocumentBaseTransitionV0` @@ -22,6 +23,8 @@ pub trait DocumentBaseTransitionV0Methods { /// Sets the data contract ID. fn set_data_contract_id(&mut self, data_contract_id: Identifier); + fn identity_contract_nonce(&self) -> IdentityNonce; + fn set_identity_contract_nonce(&mut self, identity_contract_nonce: IdentityNonce); } impl DocumentBaseTransitionV0Methods for DocumentBaseTransitionV0 { @@ -52,4 +55,12 @@ impl DocumentBaseTransitionV0Methods for DocumentBaseTransitionV0 { fn set_data_contract_id(&mut self, data_contract_id: Identifier) { self.data_contract_id = data_contract_id; } + + fn identity_contract_nonce(&self) -> IdentityNonce { + self.identity_contract_nonce + } + + fn set_identity_contract_nonce(&mut self, identity_contract_nonce: IdentityNonce) { + self.identity_contract_nonce = identity_contract_nonce; + } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/v0_methods.rs index 803e6c5835..c7a543b555 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/v0_methods.rs @@ -2,6 +2,7 @@ use crate::state_transition::documents_batch_transition::document_base_transitio use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; +use crate::prelude::IdentityNonce; use platform_value::Identifier; impl DocumentBaseTransitionV0Methods for DocumentBaseTransition { @@ -46,4 +47,16 @@ impl DocumentBaseTransitionV0Methods for DocumentBaseTransition { DocumentBaseTransition::V0(v0) => v0.set_data_contract_id(data_contract_id), } } + + fn identity_contract_nonce(&self) -> IdentityNonce { + match self { + DocumentBaseTransition::V0(v0) => v0.identity_contract_nonce, + } + } + + fn set_identity_contract_nonce(&mut self, identity_contract_nonce: IdentityNonce) { + match self { + DocumentBaseTransition::V0(v0) => v0.identity_contract_nonce = identity_contract_nonce, + } + } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/convertible.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/convertible.rs index 9c52c268a6..4a677bd9fe 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/convertible.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/convertible.rs @@ -1,6 +1,6 @@ use crate::data_contract::accessors::v0::DataContractV0Getters; use crate::data_contract::document_type::accessors::DocumentTypeV0Getters; -use crate::prelude::DataContract; +use crate::prelude::{DataContract, IdentityNonce}; use crate::state_transition::data_contract_update_transition::IDENTIFIER_FIELDS; use crate::state_transition::documents_batch_transition::document_base_transition::v0::DocumentTransitionObjectLike; use crate::state_transition::documents_batch_transition::document_create_transition::v0::BINARY_FIELDS; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/from_document.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/from_document.rs index 82ad07502b..e275f72647 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/from_document.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/from_document.rs @@ -1,5 +1,6 @@ use crate::data_contract::document_type::DocumentTypeRef; use crate::document::Document; +use crate::prelude::IdentityNonce; use crate::state_transition::documents_batch_transition::document_create_transition::DocumentCreateTransitionV0; use crate::state_transition::documents_batch_transition::document_transition::DocumentCreateTransition; use crate::ProtocolError; @@ -10,6 +11,7 @@ impl DocumentCreateTransition { document: Document, document_type: DocumentTypeRef, entropy: [u8; 32], + identity_contract_nonce: IdentityNonce, platform_version: &PlatformVersion, feature_version: Option, base_feature_version: Option, @@ -26,6 +28,7 @@ impl DocumentCreateTransition { document, document_type, entropy, + identity_contract_nonce, platform_version, base_feature_version, )? diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/from_document.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/from_document.rs index 3ef8cfd5b4..3ff9c2709c 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/from_document.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/from_document.rs @@ -1,5 +1,6 @@ use crate::data_contract::document_type::DocumentTypeRef; use crate::document::{Document, DocumentV0Getters}; +use crate::prelude::IdentityNonce; use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; use crate::state_transition::documents_batch_transition::document_create_transition::DocumentCreateTransitionV0; use crate::ProtocolError; @@ -10,6 +11,7 @@ impl DocumentCreateTransitionV0 { document: Document, document_type: DocumentTypeRef, entropy: [u8; 32], + identity_contract_nonce: IdentityNonce, platform_version: &PlatformVersion, base_feature_version: Option, ) -> Result { @@ -17,6 +19,7 @@ impl DocumentCreateTransitionV0 { base: DocumentBaseTransition::from_document( &document, document_type, + identity_contract_nonce, platform_version, base_feature_version, )?, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/mod.rs index 26127c8fc8..a0d6c3ac04 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/mod.rs @@ -25,6 +25,9 @@ use crate::state_transition::documents_batch_transition::document_base_transitio use derive_more::Display; use platform_version::version::PlatformVersion; +#[cfg(feature = "state-transition-value-conversion")] +use crate::state_transition::documents_batch_transition; + mod property_names { pub const ENTROPY: &str = "$entropy"; pub const CREATED_AT: &str = "$createdAt"; @@ -136,10 +139,14 @@ impl DocumentCreateTransitionV0 { mut map: BTreeMap, data_contract: DataContract, ) -> Result { + let identity_contract_nonce = map + .remove_integer(documents_batch_transition::document_base_transition::property_names::IDENTITY_CONTRACT_NONCE) + .map_err(ProtocolError::ValueError)?; Ok(Self { base: DocumentBaseTransition::V0(DocumentBaseTransitionV0::from_value_map_consume( &mut map, data_contract, + identity_contract_nonce, )?), entropy: map .remove_hash256_bytes(property_names::ENTROPY) @@ -430,6 +437,7 @@ mod test { "id" : id, "$type" : "test", "$dataContractId" : data_contract_id, + "$identityContractNonce": 0u64, "revision" : 1u32, "alphaBinary" : alpha_binary, "alphaIdentifier" : alpha_identifier, @@ -461,7 +469,7 @@ mod test { } #[test] - fn covert_to_object_from_json_value_with_dynamic_binary_paths() { + fn convert_to_object_from_json_value_with_dynamic_binary_paths() { let data_contract = data_contract_with_dynamic_properties(); let alpha_value = vec![10_u8; 32]; let id = vec![11_u8; 32]; @@ -474,6 +482,7 @@ mod test { "$id" : id, "$type" : "test", "$dataContractId" : data_contract_id, + "$identityContractNonce": 0u64, "revision" : 1, "alphaBinary" : alpha_value, "alphaIdentifier" : alpha_value, @@ -490,7 +499,6 @@ mod test { .into_btree_string_map() .unwrap(); - println!("{:?}", object_transition); let v0 = object_transition.get("V0").expect("to get V0"); let right_id = Identifier::from_bytes(&id).unwrap(); let right_data_contract_id = Identifier::from_bytes(&data_contract_id).unwrap(); diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/from_document.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/from_document.rs index c177c2e369..3c6dfa6b80 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/from_document.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/from_document.rs @@ -1,5 +1,6 @@ use crate::data_contract::document_type::DocumentTypeRef; use crate::document::Document; +use crate::prelude::IdentityNonce; use crate::ProtocolError; use platform_version::version::{FeatureVersion, PlatformVersion}; @@ -10,6 +11,7 @@ impl DocumentDeleteTransition { pub fn from_document( document: Document, document_type: DocumentTypeRef, + identity_contract_nonce: IdentityNonce, platform_version: &PlatformVersion, feature_version: Option, base_feature_version: Option, @@ -25,6 +27,7 @@ impl DocumentDeleteTransition { 0 => Ok(DocumentDeleteTransitionV0::from_document( document, document_type, + identity_contract_nonce, platform_version, base_feature_version, )? diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/v0/from_document.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/v0/from_document.rs index 59a1f3a245..4fac1aff9f 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/v0/from_document.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/v0/from_document.rs @@ -1,6 +1,7 @@ use platform_version::version::{FeatureVersion, PlatformVersion}; use crate::data_contract::document_type::{DocumentTypeRef}; use crate::document::{Document}; +use crate::prelude::IdentityNonce; use crate::ProtocolError; use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; use crate::state_transition::documents_batch_transition::document_transition::document_delete_transition::DocumentDeleteTransitionV0; @@ -9,6 +10,7 @@ impl DocumentDeleteTransitionV0 { pub(crate) fn from_document( document: Document, document_type: DocumentTypeRef, + identity_contract_nonce: IdentityNonce, platform_version: &PlatformVersion, base_feature_version: Option, ) -> Result { @@ -16,6 +18,7 @@ impl DocumentDeleteTransitionV0 { base: DocumentBaseTransition::from_document( &document, document_type, + identity_contract_nonce, platform_version, base_feature_version, )?, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/from_document.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/from_document.rs index 33fe7617b7..059da81c22 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/from_document.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/from_document.rs @@ -1,6 +1,7 @@ use platform_version::version::{FeatureVersion, PlatformVersion}; use crate::data_contract::document_type::{DocumentTypeRef}; use crate::document::{Document}; +use crate::prelude::IdentityNonce; use crate::ProtocolError; use crate::state_transition::documents_batch_transition::document_transition::{DocumentReplaceTransition}; use crate::state_transition::documents_batch_transition::document_transition::document_replace_transition::DocumentReplaceTransitionV0; @@ -9,6 +10,7 @@ impl DocumentReplaceTransition { pub fn from_document( document: Document, document_type: DocumentTypeRef, + identity_contract_nonce: IdentityNonce, platform_version: &PlatformVersion, feature_version: Option, base_feature_version: Option, @@ -24,6 +26,7 @@ impl DocumentReplaceTransition { 0 => Ok(DocumentReplaceTransitionV0::from_document( document, document_type, + identity_contract_nonce, platform_version, base_feature_version, )? diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/from_document.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/from_document.rs index e0df4cef72..1e2db4383b 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/from_document.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/from_document.rs @@ -2,6 +2,7 @@ use platform_version::version::{FeatureVersion, PlatformVersion}; use crate::data_contract::document_type::{DocumentTypeRef}; use crate::document::{Document, DocumentV0Getters}; use crate::document::errors::DocumentError; +use crate::prelude::IdentityNonce; use crate::ProtocolError; use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; use crate::state_transition::documents_batch_transition::document_transition::document_replace_transition::DocumentReplaceTransitionV0; @@ -10,6 +11,7 @@ impl DocumentReplaceTransitionV0 { pub(crate) fn from_document( document: Document, document_type: DocumentTypeRef, + identity_contract_nonce: IdentityNonce, platform_version: &PlatformVersion, base_feature_version: Option, ) -> Result { @@ -17,6 +19,7 @@ impl DocumentReplaceTransitionV0 { base: DocumentBaseTransition::from_document( &document, document_type, + identity_contract_nonce, platform_version, base_feature_version, )?, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/mod.rs index ad303c02ad..c02a2e6531 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/mod.rs @@ -2,7 +2,7 @@ mod from_document; pub mod v0_methods; use crate::identity::TimestampMillis; -use crate::prelude::Revision; +use crate::prelude::{IdentityNonce, Revision}; use bincode::{Decode, Encode}; use derive_more::Display; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/v0_methods.rs index bc27aeb63c..a7fbc8f896 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/v0_methods.rs @@ -3,11 +3,12 @@ use platform_value::Value; use std::collections::BTreeMap; use crate::identity::TimestampMillis; -use crate::prelude::Revision; +use crate::prelude::{IdentityNonce, Revision}; use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; use crate::state_transition::documents_batch_transition::document_transition::document_replace_transition::DocumentReplaceTransitionV0; +use crate::state_transition::documents_batch_transition::DocumentReplaceTransition; pub trait DocumentReplaceTransitionV0Methods { /// Returns a reference to the `base` field of the `DocumentReplaceTransitionV0`. diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0_methods.rs index 41c6f54104..e1566587aa 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0_methods.rs @@ -1,7 +1,7 @@ use std::collections::BTreeMap; use platform_value::Value; use crate::identity::TimestampMillis; -use crate::prelude::Revision; +use crate::prelude::{IdentityNonce, Revision}; use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; use crate::state_transition::documents_batch_transition::document_transition::document_replace_transition::v0::v0_methods::DocumentReplaceTransitionV0Methods; use crate::state_transition::documents_batch_transition::document_transition::DocumentReplaceTransition; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/mod.rs index 10bd184e2d..d0ccd53b8f 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/mod.rs @@ -4,7 +4,7 @@ use bincode::{Decode, Encode}; use derive_more::From; use serde::{Deserialize, Serialize}; -use crate::prelude::Identifier; +use crate::prelude::{Identifier, IdentityNonce}; use document_base_transition::DocumentBaseTransition; pub mod action_type; @@ -51,6 +51,9 @@ pub trait DocumentTransitionV0Methods { fn data(&self) -> Option<&BTreeMap>; /// get the revision of transition if exits fn revision(&self) -> Option; + + /// get the identity contract nonce + fn identity_contract_nonce(&self) -> IdentityNonce; #[cfg(test)] /// Inserts the dynamic property into the document fn insert_dynamic_property(&mut self, property_name: String, value: Value); @@ -61,6 +64,9 @@ pub trait DocumentTransitionV0Methods { // sets revision of the transition fn set_revision(&mut self, revision: Revision); + + // sets identity contract nonce + fn set_identity_contract_nonce(&mut self, nonce: IdentityNonce); } #[derive(Debug, Clone, Encode, Decode, From, PartialEq, Display)] @@ -334,4 +340,20 @@ impl DocumentTransitionV0Methods for DocumentTransition { DocumentTransition::Delete(_) => None, } } + + fn identity_contract_nonce(&self) -> IdentityNonce { + match self { + DocumentTransition::Create(t) => t.base().identity_contract_nonce(), + DocumentTransition::Replace(t) => t.base().identity_contract_nonce(), + DocumentTransition::Delete(t) => t.base().identity_contract_nonce(), + } + } + + fn set_identity_contract_nonce(&mut self, nonce: IdentityNonce) { + match self { + DocumentTransition::Create(t) => t.base_mut().set_identity_contract_nonce(nonce), + DocumentTransition::Replace(t) => t.base_mut().set_identity_contract_nonce(nonce), + DocumentTransition::Delete(t) => t.base_mut().set_identity_contract_nonce(nonce), + } + } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs index 544d5d776d..bacbc32cd3 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs @@ -2,6 +2,7 @@ use crate::data_contract::document_type::DocumentTypeRef; use crate::document::Document; use crate::identity::signer::Signer; use crate::identity::IdentityPublicKey; +use crate::prelude::IdentityNonce; use crate::state_transition::documents_batch_transition::document_transition::DocumentTransition; use crate::state_transition::documents_batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; use crate::state_transition::documents_batch_transition::{ @@ -20,12 +21,21 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransition { } } + fn set_identity_contract_nonce(&mut self, identity_contract_nonce: IdentityNonce) { + match self { + DocumentsBatchTransition::V0(v0) => { + v0.set_identity_contract_nonce(identity_contract_nonce) + } + } + } + #[cfg(feature = "state-transition-signing")] fn new_document_creation_transition_from_document( document: Document, document_type: DocumentTypeRef, entropy: [u8; 32], identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, signer: &S, platform_version: &PlatformVersion, batch_feature_version: Option, @@ -45,6 +55,7 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransition { document_type, entropy, identity_public_key, + identity_contract_nonce, signer, platform_version, batch_feature_version, @@ -65,6 +76,7 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransition { document: Document, document_type: DocumentTypeRef, identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, signer: &S, platform_version: &PlatformVersion, batch_feature_version: Option, @@ -83,6 +95,7 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransition { document, document_type, identity_public_key, + identity_contract_nonce, signer, platform_version, batch_feature_version, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/v0/mod.rs index dbe2d89242..8670f2f5d3 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/v0/mod.rs @@ -2,6 +2,7 @@ use crate::data_contract::document_type::DocumentTypeRef; use crate::document::Document; use crate::identity::signer::Signer; use crate::identity::{IdentityPublicKey, SecurityLevel}; +use crate::prelude::IdentityNonce; use crate::state_transition::documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; use crate::state_transition::documents_batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; use crate::state_transition::documents_batch_transition::document_transition::{ @@ -20,6 +21,7 @@ pub trait DocumentsBatchTransitionMethodsV0: DocumentsBatchTransitionAccessorsV0 document_type: DocumentTypeRef, entropy: [u8; 32], identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, signer: &S, platform_version: &PlatformVersion, batch_feature_version: Option, @@ -32,6 +34,7 @@ pub trait DocumentsBatchTransitionMethodsV0: DocumentsBatchTransitionAccessorsV0 document: Document, document_type: DocumentTypeRef, identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, signer: &S, platform_version: &PlatformVersion, _batch_feature_version: Option, @@ -78,4 +81,6 @@ pub trait DocumentsBatchTransitionMethodsV0: DocumentsBatchTransitionAccessorsV0 } fn set_transitions(&mut self, transitions: Vec); + + fn set_identity_contract_nonce(&mut self, identity_contract_nonce: IdentityNonce); } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/state_transition_like.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/state_transition_like.rs index 4bd3c12a50..463df4ab97 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/state_transition_like.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/state_transition_like.rs @@ -46,4 +46,10 @@ impl StateTransitionLike for DocumentsBatchTransition { DocumentsBatchTransition::V0(transition) => transition.owner_id(), } } + + fn unique_identifiers(&self) -> Vec { + match self { + DocumentsBatchTransition::V0(transition) => transition.unique_identifiers(), + } + } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/state_transition_like.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/state_transition_like.rs index 2a3943b4c5..a3b2141274 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/state_transition_like.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/state_transition_like.rs @@ -45,4 +45,19 @@ impl StateTransitionLike for DocumentsBatchTransitionV0 { fn owner_id(&self) -> Identifier { self.owner_id } + + /// We create a list of unique identifiers for the batch + fn unique_identifiers(&self) -> Vec { + self.transitions + .iter() + .map(|transition| { + format!( + "{}-{}-{:x}", + base64::encode(self.owner_id), + base64::encode(transition.data_contract_id()), + transition.identity_contract_nonce() + ) + }) + .collect() + } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs index 60b61615b9..5f23df7eee 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs @@ -2,11 +2,11 @@ use crate::data_contract::document_type::DocumentTypeRef; use crate::document::{Document, DocumentV0Getters}; use crate::identity::signer::Signer; use crate::identity::SecurityLevel; -use crate::prelude::IdentityPublicKey; +use crate::prelude::{IdentityNonce, IdentityPublicKey}; use crate::state_transition::documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; use crate::state_transition::documents_batch_transition::document_create_transition::DocumentCreateTransition; use crate::state_transition::documents_batch_transition::document_transition::{ - DocumentReplaceTransition, DocumentTransition, + DocumentReplaceTransition, DocumentTransition, DocumentTransitionV0Methods, }; use crate::state_transition::documents_batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; use crate::state_transition::documents_batch_transition::{ @@ -33,6 +33,7 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransitionV0 { document_type: DocumentTypeRef, entropy: [u8; 32], identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, signer: &S, platform_version: &PlatformVersion, _batch_feature_version: Option, @@ -44,6 +45,7 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransitionV0 { document, document_type, entropy, + identity_contract_nonce, platform_version, create_feature_version, base_feature_version, @@ -69,6 +71,7 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransitionV0 { document: Document, document_type: DocumentTypeRef, identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, signer: &S, platform_version: &PlatformVersion, _batch_feature_version: Option, @@ -79,6 +82,7 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransitionV0 { let replace_transition = DocumentReplaceTransition::from_document( document, document_type, + identity_contract_nonce, platform_version, update_feature_version, base_feature_version, @@ -102,4 +106,10 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransitionV0 { fn set_transitions(&mut self, transitions: Vec) { self.transitions = transitions; } + + fn set_identity_contract_nonce(&mut self, identity_contract_nonce: IdentityNonce) { + self.transitions + .iter_mut() + .for_each(|transition| transition.set_identity_contract_nonce(identity_contract_nonce)); + } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/find_duplicates_by_id/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/find_duplicates_by_id/v0/mod.rs index 0d03d71035..e9d67fcafa 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/find_duplicates_by_id/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/find_duplicates_by_id/v0/mod.rs @@ -66,6 +66,7 @@ mod test { DocumentTransition::Create(DocumentCreateTransition::V0(DocumentCreateTransitionV0 { base: DocumentBaseTransition::V0(DocumentBaseTransitionV0 { id: Identifier::random(), + identity_contract_nonce: 0, document_type_name: "a".to_string(), data_contract_id: Identifier::random(), }), @@ -81,6 +82,7 @@ mod test { DocumentReplaceTransitionV0 { base: DocumentBaseTransition::V0(DocumentBaseTransitionV0 { id: Identifier::random(), + identity_contract_nonce: 1, document_type_name: "a".to_string(), data_contract_id: Identifier::random(), }), @@ -94,6 +96,7 @@ mod test { DocumentTransition::Delete(DocumentDeleteTransition::V0(DocumentDeleteTransitionV0 { base: DocumentBaseTransition::V0(DocumentBaseTransitionV0 { id: Identifier::random(), + identity_contract_nonce: 2, document_type_name: "c".to_string(), data_contract_id: Identifier::random(), }), diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/validate_base_structure/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/validate_base_structure/v0/mod.rs index 7907d36993..9018e8d8be 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/validate_base_structure/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/validate_base_structure/v0/mod.rs @@ -1,9 +1,10 @@ use crate::consensus::basic::document::{ DocumentTransitionsAreAbsentError, DuplicateDocumentTransitionsWithIdsError, - MaxDocumentsTransitionsExceededError, + IdentityContractNonceOutOfBoundsError, MaxDocumentsTransitionsExceededError, }; use crate::consensus::basic::BasicError; +use crate::identity::identity_nonce::MISSING_IDENTITY_REVISIONS_FILTER; use crate::state_transition::documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; use crate::state_transition::documents_batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; use crate::state_transition::documents_batch_transition::document_transition::{ @@ -57,6 +58,18 @@ impl DocumentsBatchTransition { let mut result = SimpleConsensusValidationResult::default(); for transitions in document_transitions_by_contracts.values() { + for transition in transitions { + // We need to make sure that the identity contract nonce is within the allowed bounds + // This means that it is stored on 40 bits + if transition.identity_contract_nonce() & MISSING_IDENTITY_REVISIONS_FILTER > 0 { + result.add_error(BasicError::IdentityContractNonceOutOfBoundsError( + IdentityContractNonceOutOfBoundsError::new( + transition.identity_contract_nonce(), + ), + )); + } + } + // Make sure we don't have duplicate transitions let duplicate_transitions = find_duplicates_by_id(transitions, platform_version)?; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/state_transition_like.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/state_transition_like.rs index 06d6a06d54..6ef7dc800b 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/state_transition_like.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/state_transition_like.rs @@ -46,4 +46,10 @@ impl StateTransitionLike for IdentityCreateTransition { IdentityCreateTransition::V0(transition) => transition.owner_id(), } } + + fn unique_identifiers(&self) -> Vec { + match self { + IdentityCreateTransition::V0(transition) => transition.unique_identifiers(), + } + } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/state_transition_like.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/state_transition_like.rs index 54a321e988..9856412851 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/state_transition_like.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/state_transition_like.rs @@ -49,4 +49,9 @@ impl StateTransitionLike for IdentityCreateTransitionV0 { fn owner_id(&self) -> Identifier { self.identity_id } + + /// this is based on the asset lock + fn unique_identifiers(&self) -> Vec { + vec![base64::encode(self.identity_id)] + } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/accessors/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/accessors/mod.rs index 253c488dd7..6cd7ea9928 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/accessors/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/accessors/mod.rs @@ -1,6 +1,6 @@ mod v0; -use crate::prelude::Revision; +use crate::prelude::{IdentityNonce, Revision}; use crate::state_transition::identity_credit_transfer_transition::IdentityCreditTransferTransition; use platform_value::Identifier; pub use v0::*; @@ -48,15 +48,15 @@ impl IdentityCreditTransferTransitionAccessorsV0 for IdentityCreditTransferTrans } } - fn set_revision(&mut self, revision: Revision) { + fn set_nonce(&mut self, nonce: IdentityNonce) { match self { - IdentityCreditTransferTransition::V0(transition) => transition.revision = revision, + IdentityCreditTransferTransition::V0(transition) => transition.nonce = nonce, } } - fn revision(&self) -> Revision { + fn nonce(&self) -> IdentityNonce { match self { - IdentityCreditTransferTransition::V0(transition) => transition.revision, + IdentityCreditTransferTransition::V0(transition) => transition.nonce, } } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/accessors/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/accessors/v0/mod.rs index 46f3e15144..63e2229d27 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/accessors/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/accessors/v0/mod.rs @@ -1,4 +1,4 @@ -use crate::prelude::Revision; +use crate::prelude::IdentityNonce; use platform_value::Identifier; @@ -9,6 +9,6 @@ pub trait IdentityCreditTransferTransitionAccessorsV0 { fn set_identity_id(&mut self, identity_id: Identifier); fn recipient_id(&self) -> Identifier; fn set_recipient_id(&mut self, recipient_id: Identifier); - fn set_revision(&mut self, revision: Revision); - fn revision(&self) -> Revision; + fn set_nonce(&mut self, nonce: IdentityNonce); + fn nonce(&self) -> IdentityNonce; } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/state_transition_like.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/state_transition_like.rs index 04a99304b6..4ed8e142ad 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/state_transition_like.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/state_transition_like.rs @@ -48,4 +48,10 @@ impl StateTransitionLike for IdentityCreditTransferTransition { IdentityCreditTransferTransition::V0(transition) => transition.owner_id(), } } + + fn unique_identifiers(&self) -> Vec { + match self { + IdentityCreditTransferTransition::V0(transition) => transition.unique_identifiers(), + } + } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/v0/mod.rs index 8912c25462..18bfa5dbbd 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/v0/mod.rs @@ -10,7 +10,7 @@ mod version; use crate::identity::KeyID; -use crate::prelude::{Identifier, Revision}; +use crate::prelude::{Identifier, IdentityNonce, Revision}; use crate::ProtocolError; use bincode::{Decode, Encode}; @@ -40,7 +40,7 @@ pub struct IdentityCreditTransferTransitionV0 { pub identity_id: Identifier, pub recipient_id: Identifier, pub amount: u64, - pub revision: Revision, + pub nonce: IdentityNonce, #[platform_signable(exclude_from_sig_hash)] pub signature_public_key_id: KeyID, #[platform_signable(exclude_from_sig_hash)] @@ -77,7 +77,7 @@ mod test { identity_id: Identifier::random(), recipient_id: Identifier::random(), amount: rng.gen(), - revision: 1, + nonce: 1, signature_public_key_id: rng.gen(), signature: [0; 65].to_vec().into(), }; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/v0/state_transition_like.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/v0/state_transition_like.rs index fb741a89f8..dcff464586 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/v0/state_transition_like.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/v0/state_transition_like.rs @@ -49,4 +49,13 @@ impl StateTransitionLike for IdentityCreditTransferTransitionV0 { fn owner_id(&self) -> Identifier { self.identity_id } + + /// We want things to be unique based on the nonce, so we don't add the transition type + fn unique_identifiers(&self) -> Vec { + vec![format!( + "{}-{:x}", + base64::encode(self.identity_id), + self.nonce + )] + } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/accessors/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/accessors/mod.rs index 60b8d22f97..721171e9c4 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/accessors/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/accessors/mod.rs @@ -4,7 +4,7 @@ use crate::identity::core_script::CoreScript; use platform_value::Identifier; pub use v0::*; -use crate::prelude::Revision; +use crate::prelude::{IdentityNonce, Revision}; use crate::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition; use crate::withdrawal::Pooling; @@ -38,15 +38,15 @@ impl IdentityCreditWithdrawalTransitionAccessorsV0 for IdentityCreditWithdrawalT } } - fn set_revision(&mut self, revision: Revision) { + fn set_nonce(&mut self, nonce: IdentityNonce) { match self { - IdentityCreditWithdrawalTransition::V0(transition) => transition.revision = revision, + IdentityCreditWithdrawalTransition::V0(transition) => transition.nonce = nonce, } } - fn revision(&self) -> Revision { + fn nonce(&self) -> IdentityNonce { match self { - IdentityCreditWithdrawalTransition::V0(transition) => transition.revision, + IdentityCreditWithdrawalTransition::V0(transition) => transition.nonce, } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/accessors/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/accessors/v0/mod.rs index 540c1e8bb8..0f1dc16ea9 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/accessors/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/accessors/v0/mod.rs @@ -1,5 +1,5 @@ use crate::identity::core_script::CoreScript; -use crate::prelude::Revision; +use crate::prelude::{IdentityNonce, Revision}; use crate::withdrawal::Pooling; use platform_value::Identifier; @@ -8,8 +8,8 @@ pub trait IdentityCreditWithdrawalTransitionAccessorsV0 { fn set_identity_id(&mut self, identity_id: Identifier); fn amount(&self) -> u64; fn set_amount(&mut self, amount: u64); - fn revision(&self) -> Revision; - fn set_revision(&mut self, revision: Revision); + fn nonce(&self) -> IdentityNonce; + fn set_nonce(&mut self, nonce: IdentityNonce); fn pooling(&self) -> Pooling; fn set_pooling(&mut self, pooling: Pooling); fn core_fee_per_byte(&self) -> u32; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/methods/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/methods/mod.rs index 8fab5abff3..e2ce78a39f 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/methods/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/methods/mod.rs @@ -8,6 +8,7 @@ use crate::identity::signer::Signer; use crate::identity::Identity; use crate::identity::core_script::CoreScript; +use crate::prelude::IdentityNonce; use crate::state_transition::identity_credit_withdrawal_transition::v0::IdentityCreditWithdrawalTransitionV0; use crate::state_transition::StateTransition; use crate::version::PlatformVersion; @@ -23,6 +24,7 @@ impl IdentityCreditWithdrawalTransitionMethodsV0 for IdentityCreditWithdrawalTra pooling: Pooling, core_fee_per_byte: u32, signer: S, + nonce: IdentityNonce, platform_version: &PlatformVersion, version: Option, ) -> Result { @@ -39,6 +41,7 @@ impl IdentityCreditWithdrawalTransitionMethodsV0 for IdentityCreditWithdrawalTra pooling, core_fee_per_byte, signer, + nonce, platform_version, version, )?), diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/methods/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/methods/v0/mod.rs index 48ffd9a916..af1205f67f 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/methods/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/methods/v0/mod.rs @@ -1,6 +1,7 @@ use crate::identity::core_script::CoreScript; use crate::identity::signer::Signer; use crate::identity::Identity; +use crate::prelude::IdentityNonce; use crate::state_transition::{StateTransition, StateTransitionType}; use crate::withdrawal::Pooling; use crate::ProtocolError; @@ -15,6 +16,7 @@ pub trait IdentityCreditWithdrawalTransitionMethodsV0 { pooling: Pooling, core_fee_per_byte: u32, signer: S, + nonce: IdentityNonce, _platform_version: &PlatformVersion, _version: Option, ) -> Result; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/state_transition_like.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/state_transition_like.rs index 2addd0674c..2710ba1ab1 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/state_transition_like.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/state_transition_like.rs @@ -52,4 +52,10 @@ impl StateTransitionLike for IdentityCreditWithdrawalTransition { IdentityCreditWithdrawalTransition::V0(transition) => transition.owner_id(), } } + + fn unique_identifiers(&self) -> Vec { + match self { + IdentityCreditWithdrawalTransition::V0(transition) => transition.unique_identifiers(), + } + } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/mod.rs index d34c60f4d6..245651fcd4 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/mod.rs @@ -15,6 +15,7 @@ use platform_value::BinaryData; use serde::{Deserialize, Serialize}; use crate::balances::credits::CREDITS_PER_DUFF; +use crate::prelude::IdentityNonce; use crate::{ identity::{core_script::CoreScript, KeyID}, prelude::{Identifier, Revision}, @@ -43,7 +44,7 @@ pub struct IdentityCreditWithdrawalTransitionV0 { pub core_fee_per_byte: u32, pub pooling: Pooling, pub output_script: CoreScript, - pub revision: Revision, + pub nonce: IdentityNonce, #[platform_signable(exclude_from_sig_hash)] pub signature_public_key_id: KeyID, #[platform_signable(exclude_from_sig_hash)] diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/state_transition_like.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/state_transition_like.rs index 54f2ac1b7a..d9fce1286e 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/state_transition_like.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/state_transition_like.rs @@ -50,4 +50,13 @@ impl StateTransitionLike for IdentityCreditWithdrawalTransitionV0 { fn owner_id(&self) -> Identifier { self.identity_id } + + /// We want things to be unique based on the nonce, so we don't add the transition type + fn unique_identifiers(&self) -> Vec { + vec![format!( + "{}-{:x}", + base64::encode(self.identity_id), + self.nonce + )] + } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/v0_methods.rs index 52e77c3db6..c898036baf 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/v0_methods.rs @@ -2,6 +2,7 @@ use crate::identity::accessors::IdentityGettersV0; use crate::identity::core_script::CoreScript; use crate::identity::signer::Signer; use crate::identity::{Identity, KeyType, Purpose, SecurityLevel}; +use crate::prelude::IdentityNonce; use crate::ProtocolError; use platform_version::version::{FeatureVersion, PlatformVersion}; @@ -19,6 +20,7 @@ impl IdentityCreditWithdrawalTransitionMethodsV0 for IdentityCreditWithdrawalTra pooling: Pooling, core_fee_per_byte: u32, signer: S, + nonce: IdentityNonce, _platform_version: &PlatformVersion, _version: Option, ) -> Result { @@ -28,7 +30,7 @@ impl IdentityCreditWithdrawalTransitionMethodsV0 for IdentityCreditWithdrawalTra core_fee_per_byte, pooling, output_script, - revision: identity.revision() + 1, + nonce, signature_public_key_id: 0, signature: Default::default(), } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/state_transition_like.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/state_transition_like.rs index 63bec1d429..6f8ef71baa 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/state_transition_like.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/state_transition_like.rs @@ -46,4 +46,10 @@ impl StateTransitionLike for IdentityTopUpTransition { IdentityTopUpTransition::V0(transition) => transition.owner_id(), } } + + fn unique_identifiers(&self) -> Vec { + match self { + IdentityTopUpTransition::V0(transition) => transition.unique_identifiers(), + } + } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/v0/state_transition_like.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/v0/state_transition_like.rs index c1fee0d3a7..ad8a66aa85 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/v0/state_transition_like.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/v0/state_transition_like.rs @@ -4,6 +4,7 @@ use crate::state_transition::identity_topup_transition::IdentityTopUpTransition; use crate::{ prelude::Identifier, state_transition::{StateTransitionLike, StateTransitionType}, + ProtocolError, }; use crate::state_transition::identity_topup_transition::v0::IdentityTopUpTransitionV0; @@ -49,4 +50,20 @@ impl StateTransitionLike for IdentityTopUpTransitionV0 { fn owner_id(&self) -> Identifier { self.identity_id } + + /// We want transactions to be unique based on the asset lock proof, here there is a + /// conflict on purpose with identity create transitions + fn unique_identifiers(&self) -> Vec { + let identifier = self.asset_lock_proof.create_identifier(); + match identifier { + Ok(identifier) => { + vec![base64::encode(identifier)] + } + Err(_) => { + // no unique identifier, this won't actually occur on Platform + // as we ask for the unique identifier after validation + vec![String::default()] + } + } + } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/accessors/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/accessors/mod.rs index 9225779e54..fe814f4f48 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/accessors/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/accessors/mod.rs @@ -1,7 +1,7 @@ mod v0; use crate::identity::{KeyID, TimestampMillis}; -use crate::prelude::Revision; +use crate::prelude::{IdentityNonce, Revision}; use crate::state_transition::identity_update_transition::IdentityUpdateTransition; use crate::state_transition::public_key_in_creation::IdentityPublicKeyInCreation; use platform_value::Identifier; @@ -32,6 +32,18 @@ impl IdentityUpdateTransitionAccessorsV0 for IdentityUpdateTransition { } } + fn set_nonce(&mut self, nonce: IdentityNonce) { + match self { + IdentityUpdateTransition::V0(transition) => transition.set_nonce(nonce), + } + } + + fn nonce(&self) -> IdentityNonce { + match self { + IdentityUpdateTransition::V0(transition) => transition.nonce(), + } + } + fn set_public_keys_to_add(&mut self, add_public_keys: Vec) { match self { IdentityUpdateTransition::V0(transition) => { diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/accessors/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/accessors/v0/mod.rs index 8fece6aceb..a3510e6fda 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/accessors/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/accessors/v0/mod.rs @@ -1,3 +1,4 @@ +use crate::prelude::IdentityNonce; use crate::state_transition::public_key_in_creation::IdentityPublicKeyInCreation; use crate::{ identity::KeyID, @@ -9,6 +10,8 @@ pub trait IdentityUpdateTransitionAccessorsV0 { fn identity_id(&self) -> Identifier; fn set_revision(&mut self, revision: Revision); fn revision(&self) -> Revision; + fn set_nonce(&mut self, nonce: IdentityNonce); + fn nonce(&self) -> IdentityNonce; fn set_public_keys_to_add(&mut self, add_public_keys: Vec); fn public_keys_to_add(&self) -> &[IdentityPublicKeyInCreation]; fn public_keys_to_add_mut(&mut self) -> &mut [IdentityPublicKeyInCreation]; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/methods/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/methods/mod.rs index 7ec7c165a6..b6c0e802dc 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/methods/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/methods/mod.rs @@ -11,6 +11,7 @@ use crate::state_transition::StateTransition; use crate::version::FeatureVersion; use crate::ProtocolError; +use crate::prelude::IdentityNonce; use platform_version::version::PlatformVersion; impl IdentityUpdateTransitionMethodsV0 for IdentityUpdateTransition { @@ -21,6 +22,7 @@ impl IdentityUpdateTransitionMethodsV0 for IdentityUpdateTransition { add_public_keys: Vec, disable_public_keys: Vec, public_keys_disabled_at: Option, + nonce: IdentityNonce, signer: &S, platform_version: &PlatformVersion, version: Option, @@ -38,6 +40,7 @@ impl IdentityUpdateTransitionMethodsV0 for IdentityUpdateTransition { add_public_keys, disable_public_keys, public_keys_disabled_at, + nonce, signer, platform_version, version, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/methods/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/methods/v0/mod.rs index b692416b59..ea675e04e6 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/methods/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/methods/v0/mod.rs @@ -2,6 +2,7 @@ use platform_version::version::PlatformVersion; use crate::identity::signer::Signer; use crate::identity::{Identity, IdentityPublicKey}; +use crate::prelude::IdentityNonce; use crate::state_transition::StateTransition; use crate::version::FeatureVersion; use crate::{identity::KeyID, state_transition::StateTransitionType, ProtocolError}; @@ -14,6 +15,7 @@ pub trait IdentityUpdateTransitionMethodsV0 { add_public_keys: Vec, disable_public_keys: Vec, public_keys_disabled_at: Option, + nonce: IdentityNonce, signer: &S, platform_version: &PlatformVersion, version: Option, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/state_transition_like.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/state_transition_like.rs index 09084cf474..7b8aaef35b 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/state_transition_like.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/state_transition_like.rs @@ -46,4 +46,10 @@ impl StateTransitionLike for IdentityUpdateTransition { IdentityUpdateTransition::V0(transition) => transition.owner_id(), } } + + fn unique_identifiers(&self) -> Vec { + match self { + IdentityUpdateTransition::V0(transition) => transition.unique_identifiers(), + } + } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/json_conversion.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/json_conversion.rs index 57959d7983..2cdaa09100 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/json_conversion.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/json_conversion.rs @@ -25,6 +25,7 @@ mod test { let transition: IdentityUpdateTransition = IdentityUpdateTransitionV0 { identity_id: generate_random_identifier_struct(), revision: 0, + nonce: 1, add_public_keys: vec![public_key.into()], disable_public_keys: vec![], public_keys_disabled_at: None, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/mod.rs index 6cd7af74de..df59c947b0 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/mod.rs @@ -18,6 +18,7 @@ use std::convert::{TryFrom, TryInto}; use crate::state_transition::public_key_in_creation::IdentityPublicKeyInCreation; use crate::state_transition::public_key_in_creation::IdentityPublicKeyInCreationSignable; +use crate::prelude::IdentityNonce; use crate::{ identity::KeyID, prelude::{Identifier, Revision, TimestampMillis}, @@ -39,9 +40,12 @@ pub struct IdentityUpdateTransitionV0 { /// Unique identifier of the identity to be updated pub identity_id: Identifier, - /// Identity Update revision number + /// The revision of the identity after update pub revision: Revision, + /// Identity nonce for this transition to prevent replay attacks + pub nonce: IdentityNonce, + /// Public Keys to add to the Identity /// we want to skip serialization of transitions, as we does it manually in `to_object()` and `to_json()` #[cfg_attr(feature = "state-transition-serde-conversion", serde(default))] diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/state_transition_like.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/state_transition_like.rs index e44568fff4..12e38921b1 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/state_transition_like.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/state_transition_like.rs @@ -49,4 +49,13 @@ impl StateTransitionLike for IdentityUpdateTransitionV0 { fn owner_id(&self) -> Identifier { self.identity_id } + + /// We want things to be unique based on the nonce, so we don't add the transition type + fn unique_identifiers(&self) -> Vec { + vec![format!( + "{}-{:x}", + base64::encode(self.identity_id), + self.nonce + )] + } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/v0_methods.rs index 8f46eb0b5f..7a32bde43f 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/v0_methods.rs @@ -11,6 +11,7 @@ use crate::identity::{Identity, IdentityPublicKey}; use crate::identity::accessors::IdentityGettersV0; use crate::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; +use crate::prelude::IdentityNonce; use crate::state_transition::identity_update_transition::accessors::IdentityUpdateTransitionAccessorsV0; use crate::state_transition::identity_update_transition::methods::IdentityUpdateTransitionMethodsV0; use crate::state_transition::identity_update_transition::v0::IdentityUpdateTransitionV0; @@ -32,6 +33,7 @@ impl IdentityUpdateTransitionMethodsV0 for IdentityUpdateTransitionV0 { add_public_keys: Vec, disable_public_keys: Vec, public_keys_disabled_at: Option, + nonce: IdentityNonce, signer: &S, _platform_version: &PlatformVersion, _version: Option, @@ -46,6 +48,7 @@ impl IdentityUpdateTransitionMethodsV0 for IdentityUpdateTransitionV0 { signature_public_key_id: 0, identity_id: identity.id(), revision: identity.revision(), + nonce, add_public_keys: add_public_keys_in_creation, disable_public_keys, public_keys_disabled_at, @@ -114,6 +117,14 @@ impl IdentityUpdateTransitionAccessorsV0 for IdentityUpdateTransitionV0 { self.revision } + fn set_nonce(&mut self, nonce: IdentityNonce) { + self.nonce = nonce; + } + + fn nonce(&self) -> IdentityNonce { + self.nonce + } + fn set_public_keys_to_add(&mut self, add_public_keys: Vec) { self.add_public_keys = add_public_keys; } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/value_conversion.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/value_conversion.rs index de82f22067..abe58de381 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/value_conversion.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/value_conversion.rs @@ -9,6 +9,7 @@ use crate::state_transition::identity_update_transition::v0::{ use crate::state_transition::public_key_in_creation::IdentityPublicKeyInCreation; use crate::state_transition::StateTransitionValueConvert; +use crate::state_transition::state_transitions::common_fields::property_names::NONCE; use platform_version::version::PlatformVersion; impl<'a> StateTransitionValueConvert<'a> for IdentityUpdateTransitionV0 { @@ -29,6 +30,9 @@ impl<'a> StateTransitionValueConvert<'a> for IdentityUpdateTransitionV0 { let revision = raw_object .get_integer(REVISION) .map_err(ProtocolError::ValueError)?; + let nonce = raw_object + .get_integer(NONCE) + .map_err(ProtocolError::ValueError)?; let add_public_keys = raw_object .remove_optional_array(property_names::ADD_PUBLIC_KEYS) .map_err(ProtocolError::ValueError)? @@ -47,6 +51,7 @@ impl<'a> StateTransitionValueConvert<'a> for IdentityUpdateTransitionV0 { signature_public_key_id, identity_id, revision, + nonce, add_public_keys, disable_public_keys, public_keys_disabled_at, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/validate_identity_public_keys_structure/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/validate_identity_public_keys_structure/v0/mod.rs index 5c54f71e17..6751461f62 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/validate_identity_public_keys_structure/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/validate_identity_public_keys_structure/v0/mod.rs @@ -17,7 +17,7 @@ use crate::validation::SimpleConsensusValidationResult; use crate::ProtocolError; use platform_version::version::PlatformVersion; -const MAX_PUBLIC_KEYS: usize = 10; +const MAX_PUBLIC_KEYS: usize = 6; lazy_static! { static ref ALLOWED_SECURITY_LEVELS: HashMap> = { diff --git a/packages/rs-dpp/src/state_transition/traits/state_transition_like.rs b/packages/rs-dpp/src/state_transition/traits/state_transition_like.rs index d9282eeb2f..efed047cd4 100644 --- a/packages/rs-dpp/src/state_transition/traits/state_transition_like.rs +++ b/packages/rs-dpp/src/state_transition/traits/state_transition_like.rs @@ -57,4 +57,8 @@ pub trait StateTransitionLike: /// Get owner ID fn owner_id(&self) -> Identifier; + + /// unique identifiers for the state transition + /// This is often only one String except in the case of a documents batch state transition + fn unique_identifiers(&self) -> Vec; } diff --git a/packages/rs-dpp/src/tests/fixtures/get_document_transitions_fixture.rs b/packages/rs-dpp/src/tests/fixtures/get_document_transitions_fixture.rs index 8595c57433..dfb531b554 100644 --- a/packages/rs-dpp/src/tests/fixtures/get_document_transitions_fixture.rs +++ b/packages/rs-dpp/src/tests/fixtures/get_document_transitions_fixture.rs @@ -1,7 +1,8 @@ use crate::data_contract::document_type::DocumentTypeRef; use crate::document::document_factory::DocumentFactory; -use platform_value::Bytes32; +use platform_value::{Bytes32, Identifier}; use platform_version::version::PlatformVersion; +use std::collections::BTreeMap; use crate::document::Document; use crate::state_transition::documents_batch_transition::document_transition::action_type::DocumentTransitionActionType; @@ -16,13 +17,14 @@ pub fn get_document_transitions_fixture<'a>( Vec<(Document, DocumentTypeRef<'a>, Bytes32)>, ), >, + nonce_counter: &mut BTreeMap<(Identifier, Identifier), u64>, //IdentityID/ContractID -> nonce ) -> Vec { let protocol_version = PlatformVersion::latest().protocol_version; let document_factory = DocumentFactory::new(protocol_version).expect("expected to get document factory"); document_factory - .create_state_transition(documents) + .create_state_transition(documents, nonce_counter) .expect("the transitions should be created") .transitions() .to_owned() diff --git a/packages/rs-drive-abci/src/abci/handler/execution_result.rs b/packages/rs-drive-abci/src/abci/handler/execution_result.rs index 4f7b123017..94e12f05f3 100644 --- a/packages/rs-drive-abci/src/abci/handler/execution_result.rs +++ b/packages/rs-drive-abci/src/abci/handler/execution_result.rs @@ -23,8 +23,7 @@ impl TryIntoPlatformVersioned for StateTransitionExecutionResult { ..Default::default() } } - StateTransitionExecutionResult::UnpaidConsensusError(error) - | StateTransitionExecutionResult::PaidConsensusError(error) => ExecTxResult { + StateTransitionExecutionResult::UnpaidConsensusError(error) => ExecTxResult { code: HandlerError::from(&error).code(), info: error.response_info_for_version(platform_version)?, // TODO: We need to pass processing fees as well @@ -32,6 +31,16 @@ impl TryIntoPlatformVersioned for StateTransitionExecutionResult { gas_used: 0, ..Default::default() }, + StateTransitionExecutionResult::PaidConsensusError(error, actual_fees) => { + ExecTxResult { + code: HandlerError::from(&error).code(), + info: error.response_info_for_version(platform_version)?, + // TODO: Improve gas wanted + gas_wanted: actual_fees.total_base_fee() as SignedCredits, + gas_used: actual_fees.total_base_fee() as SignedCredits, + ..Default::default() + } + } StateTransitionExecutionResult::DriveAbciError(message) => ExecTxResult { code: HandlerError::Internal(message).code(), // TODO: That would be nice to provide more information about the error for debugging diff --git a/packages/rs-drive-abci/src/abci/handler/mod.rs b/packages/rs-drive-abci/src/abci/handler/mod.rs index 25fbf1a7a6..8bc4c6ae50 100644 --- a/packages/rs-drive-abci/src/abci/handler/mod.rs +++ b/packages/rs-drive-abci/src/abci/handler/mod.rs @@ -87,7 +87,7 @@ where if !tenderdash_abci::check_version(&request.abci_version) { return Err(proto::ResponseException::from(format!( - "tenderdash requires ABCI version {}, our version is {}", + "tenderdash requires protobuf definitions version {}, our version is {}", request.abci_version, tenderdash_abci::proto::ABCI_VERSION ))); @@ -289,7 +289,7 @@ where let tx_action = match &state_transition_execution_result { StateTransitionExecutionResult::SuccessfulExecution(_, _) => TxAction::Unmodified, // We have identity to pay for the state transition, so we keep it in the block - StateTransitionExecutionResult::PaidConsensusError(_) => TxAction::Unmodified, + StateTransitionExecutionResult::PaidConsensusError(..) => TxAction::Unmodified, // We don't have any associated identity to pay for the state transition, // so we remove it from the block to prevent spam attacks. // Such state transitions must be invalidated by check tx, but they might @@ -557,7 +557,7 @@ where matches!( execution_result, StateTransitionExecutionResult::SuccessfulExecution(_, _) - | StateTransitionExecutionResult::PaidConsensusError(_) + | StateTransitionExecutionResult::PaidConsensusError(..) ) }) .map(|execution_result| { @@ -786,13 +786,18 @@ where (0, "".to_string()) }; - let gas_wanted = validation_result - .data - .map(|fee_result| { - fee_result - .map(|fee_result| fee_result.total_base_fee()) - .unwrap_or_default() - }) + let check_tx_result = validation_result.data.unwrap_or_default(); + + let gas_wanted = check_tx_result + .fee_result + .map(|fee_result| fee_result.total_base_fee()) + .unwrap_or_default(); + + // Todo: IMPORTANT We need tenderdash to support multiple senders + let first_unique_identifier = check_tx_result + .unique_identifiers + .first() + .cloned() .unwrap_or_default(); Ok(ResponseCheckTx { @@ -801,7 +806,7 @@ where info, gas_wanted: gas_wanted as SignedCredits, codespace: "".to_string(), - sender: "".to_string(), + sender: first_unique_identifier, priority: 0, }) } diff --git a/packages/rs-drive-abci/src/execution/check_tx/mod.rs b/packages/rs-drive-abci/src/execution/check_tx/mod.rs index 64434b669a..0dcc4d18e9 100644 --- a/packages/rs-drive-abci/src/execution/check_tx/mod.rs +++ b/packages/rs-drive-abci/src/execution/check_tx/mod.rs @@ -6,14 +6,18 @@ use crate::abci::AbciError; use crate::rpc::core::CoreRPCLike; use dpp::consensus::ConsensusError; use dpp::fee::fee_result::FeeResult; +use dpp::identifier::Identifier; +use dpp::prelude::IdentityNonce; use dpp::validation::ValidationResult; mod v0; // @append_only #[repr(u8)] -#[derive(Copy, Clone, Debug)] +#[derive(Copy, Clone, Debug, Default)] pub enum CheckTxLevel { + #[default] + Unknown, FirstTimeCheck, Recheck, } @@ -48,6 +52,20 @@ impl TryFrom for CheckTxLevel { } } +/// The result of a check tx +#[derive(Default, Clone)] +pub struct CheckTxResult { + /// The level used when checking the transaction + pub level: CheckTxLevel, + /// The fee_result if there was one + /// There might not be one in the case of a very cheep recheck + pub fee_result: Option, + /// A set of unique identifiers, if any are found already in the mempool then tenderdash should + /// reject the transition. All transitions return only 1 unique identifier except the documents + /// batch transition that returns 1 for each document transition + pub unique_identifiers: Vec, +} + impl Platform where C: CoreRPCLike, @@ -64,17 +82,17 @@ where /// /// # Returns /// - /// * `Result, Error>` - If the state transition passes all + /// * `Result, Error>` - If the state transition passes all /// checks, it returns a `ValidationResult` with fee information. If any check fails, it returns an `Error`. pub fn check_tx( &self, raw_tx: &[u8], check_tx_level: CheckTxLevel, - ) -> Result, ConsensusError>, Error> { + ) -> Result, Error> { let state = self.state.read().expect("expected to get state"); let platform_version = state.current_platform_version()?; match platform_version.drive_abci.methods.engine.check_tx { - 0 => self.check_tx_v0(raw_tx, check_tx_level), + 0 => self.check_tx_v0(raw_tx, check_tx_level, platform_version), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "check_tx".to_string(), known_versions: vec![0], diff --git a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs index b60ed5ca2e..4fefd56cbf 100644 --- a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs @@ -1,5 +1,5 @@ use crate::error::Error; -use crate::execution::check_tx::CheckTxLevel; +use crate::execution::check_tx::{CheckTxLevel, CheckTxResult}; use crate::execution::validation::state_transition::check_tx_verification::state_transition_to_execution_event_for_check_tx; #[cfg(test)] @@ -22,6 +22,7 @@ use dpp::state_transition::StateTransition; #[cfg(test)] use dpp::validation::SimpleConsensusValidationResult; use dpp::validation::ValidationResult; +use dpp::version::PlatformVersion; #[cfg(test)] use drive::grovedb::Transaction; @@ -75,13 +76,14 @@ where /// /// # Returns /// - /// * `Result, Error>` - If the state transition passes all + /// * `Result, Error>` - If the state transition passes all /// checks, it returns a `ValidationResult` with fee information. If any check fails, it returns an `Error`. pub(super) fn check_tx_v0( &self, raw_tx: &[u8], check_tx_level: CheckTxLevel, - ) -> Result, ConsensusError>, Error> { + platform_version: &PlatformVersion, + ) -> Result, Error> { let state_transition = match StateTransition::deserialize_from_bytes(raw_tx) { Ok(state_transition) => state_transition, Err(err) => { @@ -106,21 +108,31 @@ where block_info, }; - let platform_version = platform_ref.state.current_platform_version()?; + let unique_identifiers = state_transition.unique_identifiers(); - let execution_event = state_transition_to_execution_event_for_check_tx( + let validation_result = state_transition_to_execution_event_for_check_tx( &platform_ref, state_transition, check_tx_level, )?; // We should run the execution event in dry run to see if we would have enough fees for the transition - execution_event.and_then_borrowed_validation(|execution_event| { + validation_result.and_then_borrowed_validation(|execution_event| { if let Some(execution_event) = execution_event { self.validate_fees_of_event(execution_event, block_info, None, platform_version) - .map(|validation_result| validation_result.map(Some)) + .map(|validation_result| { + validation_result.map(|fee_result| CheckTxResult { + level: check_tx_level, + fee_result: Some(fee_result), + unique_identifiers, + }) + }) } else { - Ok(ValidationResult::new_with_data(None)) + Ok(ValidationResult::new_with_data(CheckTxResult { + level: check_tx_level, + fee_result: None, + unique_identifiers, + })) } }) } @@ -591,6 +603,7 @@ mod tests { profile, entropy.0, &key, + 1, &signer, platform_version, None, @@ -608,6 +621,7 @@ mod tests { altered_document, profile, &key, + 2, &signer, platform_version, None, @@ -1334,6 +1348,7 @@ mod tests { let update_transition: IdentityUpdateTransition = IdentityUpdateTransitionV0 { identity_id: dpns_contract::OWNER_ID_BYTES.into(), revision: 0, + nonce: 1, add_public_keys: vec![IdentityPublicKeyInCreation::V0(new_key)], disable_public_keys: vec![], public_keys_disabled_at: None, @@ -1440,6 +1455,7 @@ mod tests { let update_transition: IdentityUpdateTransition = IdentityUpdateTransitionV0 { identity_id: dashpay_contract::OWNER_ID_BYTES.into(), revision: 1, + nonce: 1, add_public_keys: vec![IdentityPublicKeyInCreation::V0(new_key.clone())], disable_public_keys: vec![], public_keys_disabled_at: None, @@ -1463,6 +1479,7 @@ mod tests { let update_transition: IdentityUpdateTransition = IdentityUpdateTransitionV0 { identity_id: dashpay_contract::OWNER_ID_BYTES.into(), revision: 1, + nonce: 1, add_public_keys: vec![IdentityPublicKeyInCreation::V0(new_key)], disable_public_keys: vec![], public_keys_disabled_at: None, diff --git a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs index 62e472e41d..e9eb70c81c 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs @@ -311,8 +311,8 @@ mod tests { assert_eq!( root_hash, [ - 27, 145, 206, 187, 152, 191, 68, 167, 189, 194, 115, 111, 104, 166, 61, 254, - 94, 149, 9, 131, 231, 106, 224, 64, 180, 247, 129, 223, 128, 12, 42, 39 + 48, 165, 165, 234, 103, 120, 205, 238, 156, 93, 195, 194, 17, 242, 245, 101, + 176, 129, 137, 59, 185, 249, 76, 104, 217, 226, 66, 115, 67, 226, 235, 180 ] ) } diff --git a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/execute_event/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/execute_event/v0/mod.rs index 5b5954fcb2..c5cc4e1a01 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/execute_event/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/execute_event/v0/mod.rs @@ -1,6 +1,6 @@ use crate::error::Error; use crate::execution::types::execution_event::ExecutionEvent; -use crate::execution::types::execution_operation::ExecutionOperation; +use crate::execution::types::execution_operation::ValidationOperation; use crate::platform_types::event_execution_result::EventExecutionResult; use crate::platform_types::event_execution_result::EventExecutionResult::{ ConsensusExecutionError, SuccessfulFreeExecution, SuccessfulPaidExecution, @@ -62,6 +62,7 @@ where identity, operations, execution_operations, + .. } => { if fee_validation_result.is_valid_with_data() { //todo: make this into an atomic event with partial batches @@ -76,7 +77,7 @@ where ) .map_err(Error::Drive)?; - ExecutionOperation::add_many_to_fee_result( + ValidationOperation::add_many_to_fee_result( &execution_operations, &mut individual_fee_result, &block_info.epoch, diff --git a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_raw_state_transitions/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_raw_state_transitions/v0/mod.rs index 8e93c85bf0..204cbe2662 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_raw_state_transitions/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_raw_state_transitions/v0/mod.rs @@ -148,7 +148,7 @@ where tracing::debug!( ?errors, - "Invalid unknown state transition ({}): {}", + "State transition beyond max encoded bytes limit ({}): {}", st_hash, message ); @@ -198,14 +198,66 @@ where // There are two cases when the user can't pay fees: // 1. The state transition is funded by an asset lock transactions. This transactions are // placed on the payment blockchain and they can't be partially spent. - // 2. We can't prove that the state transition is assosiated with identity or identity balance is not - // enough to cover processing fees - // TODO: process_state_transition should return fees for invalid state transitions as well so we can - // deduct the fees from balance if identity is valid + // 2. We can't prove that the state transition is associated with the identity + // 3. The revision given by the state transition isn't allowed based on the state let state_transition_execution_result = if is_st_asset_lock_funded { StateTransitionExecutionResult::UnpaidConsensusError(first_consensus_error) + } else if let Ok(execution_event) = st_validation_result.into_data() { + // In this case the execution event will be to pay for the state transition processing + // This ONLY pays for what is needed to prevent attacks on the system + + let event_execution_result = self + .execute_event(execution_event, block_info, transaction, platform_version) + .map_err(|error| StateTransitionAwareError { + error, + raw_state_transition: raw_state_transition.into(), + })?; + + match event_execution_result { + EventExecutionResult::SuccessfulPaidExecution(_, actual_fees) => { + tracing::debug!( + "{} state transition ({}) not processed, but paid for processing", + state_transition_name, + st_hash, + ); + + StateTransitionExecutionResult::PaidConsensusError( + first_consensus_error, + actual_fees, + ) + } + EventExecutionResult::SuccessfulFreeExecution => { + tracing::debug!( + "Free {} state transition ({}) successfully processed", + state_transition_name, + st_hash, + ); + + StateTransitionExecutionResult::UnpaidConsensusError(first_consensus_error) + } + EventExecutionResult::ConsensusExecutionError(mut validation_result) => { + let payment_consensus_error = validation_result + .errors + // the first error must be present for an invalid result + .remove(0); + + tracing::debug!( + main_error = ?first_consensus_error, + payment_error = ?payment_consensus_error, + "Not able to reduce balance for identity {} state transition ({})", + state_transition_name, + st_hash, + ); + + StateTransitionExecutionResult::DriveAbciError(format!( + "{} {}", + first_consensus_error.to_string(), + payment_consensus_error.to_string() + )) + } + } } else { - StateTransitionExecutionResult::PaidConsensusError(first_consensus_error) + StateTransitionExecutionResult::UnpaidConsensusError(first_consensus_error) }; return Ok(state_transition_execution_result); diff --git a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/validate_fees_of_event/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/validate_fees_of_event/v0/mod.rs index b273d7d29f..be0d150f59 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/validate_fees_of_event/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/validate_fees_of_event/v0/mod.rs @@ -1,7 +1,7 @@ use crate::error::execution::ExecutionError; use crate::error::Error; use crate::execution::types::execution_event::ExecutionEvent; -use crate::execution::types::execution_operation::ExecutionOperation; +use crate::execution::types::execution_operation::ValidationOperation; use crate::platform_types::platform::Platform; use crate::rpc::core::CoreRPCLike; use dpp::block::block_info::BlockInfo; @@ -64,7 +64,7 @@ where ) .map_err(Error::Drive)?; - ExecutionOperation::add_many_to_fee_result( + ValidationOperation::add_many_to_fee_result( execution_operations, &mut estimated_fee_result, &block_info.epoch, @@ -93,12 +93,15 @@ where } ExecutionEvent::PaidDriveEvent { identity, + removed_balance, operations, execution_operations, } => { let balance = identity.balance.ok_or(Error::Execution( ExecutionError::CorruptedCodeExecution("partial identity info with no balance"), ))?; + let balance_after_principal_operation = + balance.saturating_sub(removed_balance.unwrap_or_default()); let mut estimated_fee_result = self .drive .apply_drive_operations( @@ -110,7 +113,7 @@ where ) .map_err(Error::Drive)?; - ExecutionOperation::add_many_to_fee_result( + ValidationOperation::add_many_to_fee_result( execution_operations, &mut estimated_fee_result, &block_info.epoch, @@ -119,7 +122,7 @@ where // TODO: Should take into account refunds as well let required_balance = estimated_fee_result.total_base_fee(); - if balance >= required_balance { + if balance_after_principal_operation >= required_balance { Ok(ConsensusValidationResult::new_with_data( estimated_fee_result, )) diff --git a/packages/rs-drive-abci/src/execution/types/execution_event/mod.rs b/packages/rs-drive-abci/src/execution/types/execution_event/mod.rs index 43602f7fe1..6ff45363d5 100644 --- a/packages/rs-drive-abci/src/execution/types/execution_event/mod.rs +++ b/packages/rs-drive-abci/src/execution/types/execution_event/mod.rs @@ -13,7 +13,7 @@ use dpp::identity::PartialIdentity; use dpp::version::PlatformVersion; use drive::state_transition_action::StateTransitionAction; -use crate::execution::types::execution_operation::ExecutionOperation; +use crate::execution::types::execution_operation::ValidationOperation; use crate::execution::types::state_transition_execution_context::{ StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0, }; @@ -27,10 +27,12 @@ pub(in crate::execution) enum ExecutionEvent<'a> { PaidDriveEvent { /// The identity requesting the event identity: PartialIdentity, + /// The removed balance in the case of a transfer or withdrawal + removed_balance: Option, /// the operations that the identity is requesting to perform operations: Vec>, /// the execution operations that we must also pay for - execution_operations: Vec, + execution_operations: Vec, }, /// A drive event that is paid from an asset lock PaidFromAssetLockDriveEvent { @@ -41,7 +43,7 @@ pub(in crate::execution) enum ExecutionEvent<'a> { /// the operations that should be performed operations: Vec>, /// the execution operations that we must also pay for - execution_operations: Vec, + execution_operations: Vec, }, /// A drive event that is free FreeDriveEvent { @@ -87,12 +89,47 @@ impl<'a> ExecutionEvent<'a> { ))) } } + StateTransitionAction::IdentityCreditWithdrawalAction(identity_credit_withdrawal) => { + let removed_balance = identity_credit_withdrawal.amount(); + let operations = + action.into_high_level_drive_operations(epoch, platform_version)?; + if let Some(identity) = identity { + Ok(PaidDriveEvent { + identity, + removed_balance: Some(removed_balance), + operations, + execution_operations: execution_context.operations_consume(), + }) + } else { + Err(Error::Execution(ExecutionError::CorruptedCodeExecution( + "partial identity should be present", + ))) + } + } + StateTransitionAction::IdentityCreditTransferAction(identity_credit_transfer) => { + let removed_balance = identity_credit_transfer.transfer_amount(); + let operations = + action.into_high_level_drive_operations(epoch, platform_version)?; + if let Some(identity) = identity { + Ok(PaidDriveEvent { + identity, + removed_balance: Some(removed_balance), + operations, + execution_operations: execution_context.operations_consume(), + }) + } else { + Err(Error::Execution(ExecutionError::CorruptedCodeExecution( + "partial identity should be present", + ))) + } + } _ => { let operations = action.into_high_level_drive_operations(epoch, platform_version)?; if let Some(identity) = identity { Ok(PaidDriveEvent { identity, + removed_balance: None, operations, execution_operations: execution_context.operations_consume(), }) diff --git a/packages/rs-drive-abci/src/execution/types/execution_operation/mod.rs b/packages/rs-drive-abci/src/execution/types/execution_operation/mod.rs index eef958f13a..19467c5aa8 100644 --- a/packages/rs-drive-abci/src/execution/types/execution_operation/mod.rs +++ b/packages/rs-drive-abci/src/execution/types/execution_operation/mod.rs @@ -11,7 +11,7 @@ use dpp::version::PlatformVersion; pub mod signature_verification_operation; #[derive(Debug, Clone, PartialEq, Eq)] -pub enum ExecutionOperation { +pub enum ValidationOperation { DoubleSha256, SignatureVerification(SignatureVerificationOperation), PrecalculatedOperation(FeeResult), @@ -27,16 +27,16 @@ pub trait OperationLike { fn storage_cost(&self, platform_version: &PlatformVersion) -> Result; } -impl ExecutionOperation { +impl ValidationOperation { pub fn add_many_to_fee_result( - execution_operations: &[ExecutionOperation], + execution_operations: &[ValidationOperation], fee_result: &mut FeeResult, epoch: &Epoch, platform_version: &PlatformVersion, ) -> Result<(), Error> { for execution_operation in execution_operations { match execution_operation { - ExecutionOperation::SignatureVerification(signature_verification_operation) => { + ValidationOperation::SignatureVerification(signature_verification_operation) => { fee_result.processing_fee = fee_result .processing_fee .checked_add( @@ -47,10 +47,10 @@ impl ExecutionOperation { "execution processing fee overflow error", ))?; } - ExecutionOperation::PrecalculatedOperation(precalculated_operation) => { + ValidationOperation::PrecalculatedOperation(precalculated_operation) => { fee_result.checked_add_assign(precalculated_operation.clone())?; } - ExecutionOperation::DoubleSha256 => { + ValidationOperation::DoubleSha256 => { fee_result.processing_fee = fee_result .processing_fee .checked_add(epoch.cost_for_known_cost_item(DoubleSHA256)) diff --git a/packages/rs-drive-abci/src/execution/types/state_transition_execution_context/mod.rs b/packages/rs-drive-abci/src/execution/types/state_transition_execution_context/mod.rs index 60b33ac4f8..4c01207555 100644 --- a/packages/rs-drive-abci/src/execution/types/state_transition_execution_context/mod.rs +++ b/packages/rs-drive-abci/src/execution/types/state_transition_execution_context/mod.rs @@ -1,6 +1,6 @@ use crate::error::execution::ExecutionError; -use crate::execution::types::execution_operation::ExecutionOperation; +use crate::execution::types::execution_operation::ValidationOperation; use crate::execution::types::state_transition_execution_context::v0::StateTransitionExecutionContextV0; use derive_more::From; use dpp::version::{DefaultForPlatformVersion, PlatformVersion}; @@ -18,13 +18,13 @@ pub enum StateTransitionExecutionContext { /// The trait defining state transition execution context methods for v0 pub trait StateTransitionExecutionContextMethodsV0 { /// Add an operation to the state transition execution context - fn add_operation(&mut self, operation: ExecutionOperation); + fn add_operation(&mut self, operation: ValidationOperation); /// Add a operations to the state transition execution context - fn add_operations(&mut self, operations: Vec); + fn add_operations(&mut self, operations: Vec); /// Consume the operations of the context - fn operations_consume(self) -> Vec; + fn operations_consume(self) -> Vec; /// Returns a slice of operations, does not consume the context - fn operations_slice(&self) -> &[ExecutionOperation]; + fn operations_slice(&self) -> &[ValidationOperation]; /// Are we in a dry run? fn in_dry_run(&self) -> bool; @@ -35,25 +35,25 @@ pub trait StateTransitionExecutionContextMethodsV0 { } impl StateTransitionExecutionContextMethodsV0 for StateTransitionExecutionContext { - fn add_operation(&mut self, operation: ExecutionOperation) { + fn add_operation(&mut self, operation: ValidationOperation) { match self { StateTransitionExecutionContext::V0(v0) => v0.operations.push(operation), } } - fn add_operations(&mut self, operations: Vec) { + fn add_operations(&mut self, operations: Vec) { match self { StateTransitionExecutionContext::V0(v0) => v0.operations.extend(operations), } } - fn operations_consume(self) -> Vec { + fn operations_consume(self) -> Vec { match self { StateTransitionExecutionContext::V0(v0) => v0.operations, } } - fn operations_slice(&self) -> &[ExecutionOperation] { + fn operations_slice(&self) -> &[ValidationOperation] { match self { StateTransitionExecutionContext::V0(v0) => v0.operations.as_slice(), } diff --git a/packages/rs-drive-abci/src/execution/types/state_transition_execution_context/v0/mod.rs b/packages/rs-drive-abci/src/execution/types/state_transition_execution_context/v0/mod.rs index 2431337fb1..d3c6330e5b 100644 --- a/packages/rs-drive-abci/src/execution/types/state_transition_execution_context/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/types/state_transition_execution_context/v0/mod.rs @@ -1,4 +1,4 @@ -use crate::execution::types::execution_operation::ExecutionOperation; +use crate::execution::types::execution_operation::ValidationOperation; /// The V0 struct of the state transition execution context #[derive(Debug, Clone, Default)] @@ -8,5 +8,5 @@ pub struct StateTransitionExecutionContextV0 { /// Are we in a dry run? pub dry_run: bool, /// The execution operations - pub operations: Vec, + pub operations: Vec, } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs index e3864c27c4..a2e83aaf42 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs @@ -9,11 +9,12 @@ use dpp::prelude::ConsensusValidationResult; use dpp::state_transition::{StateTransition}; use dpp::version::{DefaultForPlatformVersion, PlatformVersion}; +use crate::error::execution::ExecutionError; use crate::execution::check_tx::CheckTxLevel; use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; use crate::execution::validation::state_transition::common::asset_lock::proof::verify_is_not_spent::AssetLockProofVerifyIsNotSpent; use crate::execution::validation::state_transition::processor::process_state_transition; -use crate::execution::validation::state_transition::processor::v0::{StateTransitionSignatureValidationV0, StateTransitionStructureValidationV0}; +use crate::execution::validation::state_transition::processor::v0::{StateTransitionBalanceValidationV0, StateTransitionBasicStructureValidationV0, StateTransitionNonceValidationV0, StateTransitionSignatureValidationV0, StateTransitionStructureKnownInStateValidationV0}; /// A trait for validating state transitions within a blockchain. pub(crate) trait StateTransitionCheckTxValidationV0 { @@ -47,7 +48,33 @@ pub(super) fn state_transition_to_execution_event_for_check_tx_v0<'a, C: CoreRPC platform_version, )?; - let action = if state_transition.requires_state_to_validate_structure() { + // First we validate the basic structure + let result = state_transition.validate_basic_structure(platform_version)?; + + if !result.is_valid() { + return Ok( + ConsensusValidationResult::>::new_with_errors( + result.errors, + ), + ); + } + + let result = state_transition.validate_nonces( + &platform.into(), + platform.block_info, + None, + platform_version, + )?; + + if !result.is_valid() { + return Ok( + ConsensusValidationResult::>::new_with_errors( + result.errors, + ), + ); + } + + let action = if state_transition.requires_advance_structure_validation() { let state_transition_action_result = state_transition.transform_into_action( platform, true, @@ -61,24 +88,28 @@ pub(super) fn state_transition_to_execution_event_for_check_tx_v0<'a, C: CoreRPC ), ); } - Some(state_transition_action_result.into_data()?) + let action = Some(state_transition_action_result.into_data()?); + + // Validating structure + let result = state_transition.validate_advanced_structure_from_state( + &platform.into(), + action.as_ref(), + platform_version, + )?; + + if !result.is_valid() { + return Ok( + ConsensusValidationResult::>::new_with_errors( + result.errors, + ), + ); + } + action } else { None }; - // Validating structure - let result = state_transition.validate_structure( - &platform.into(), - action.as_ref(), - platform.state.current_protocol_version_in_consensus(), - )?; - if !result.is_valid() { - return Ok( - ConsensusValidationResult::>::new_with_errors( - result.errors, - ), - ); - } + // We want to validate the signature before we check that the signature security level is good. let action = if state_transition .requires_state_to_validate_identity_and_signatures() @@ -122,7 +153,23 @@ pub(super) fn state_transition_to_execution_event_for_check_tx_v0<'a, C: CoreRPC ), ); } - let maybe_identity = result.into_data()?; + let mut maybe_identity = result.into_data()?; + + let result = state_transition.validate_balance( + maybe_identity.as_mut(), + &platform.into(), + platform.block_info, + None, + platform_version, + )?; + + if !result.is_valid() { + return Ok( + ConsensusValidationResult::>::new_with_errors( + result.errors, + ), + ); + } let action = if let Some(action) = action { action @@ -218,5 +265,10 @@ pub(super) fn state_transition_to_execution_event_for_check_tx_v0<'a, C: CoreRPC ) } } + _ => { + return Err(Error::Execution(ExecutionError::CorruptedCodeExecution( + "CheckTxLevel must be first time check or recheck", + ))) + } } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_state_transition_identity_signed/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_state_transition_identity_signed/v0/mod.rs index 57fc44ec35..f89bd8e747 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_state_transition_identity_signed/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_state_transition_identity_signed/v0/mod.rs @@ -8,7 +8,7 @@ use dpp::consensus::signature::{ use dpp::identity::PartialIdentity; use crate::execution::types::execution_operation::signature_verification_operation::SignatureVerificationOperation; -use crate::execution::types::execution_operation::ExecutionOperation; +use crate::execution::types::execution_operation::ValidationOperation; use crate::execution::types::state_transition_execution_context::{ StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0, }; @@ -65,7 +65,7 @@ impl<'a> ValidateStateTransitionIdentitySignatureV0<'a> for StateTransition { &self, drive: &Drive, action: Option<&StateTransitionAction>, - request_revision: bool, + request_identity_revision: bool, transaction: TransactionArg, execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion, @@ -102,7 +102,7 @@ impl<'a> ValidateStateTransitionIdentitySignatureV0<'a> for StateTransition { let key_request = IdentityKeysRequest::new_specific_key_query(owner_id.as_bytes(), key_id); - let maybe_partial_identity = if request_revision { + let maybe_partial_identity = if request_identity_revision { drive.fetch_identity_balance_with_keys_and_revision( key_request, transaction, @@ -164,7 +164,7 @@ impl<'a> ValidateStateTransitionIdentitySignatureV0<'a> for StateTransition { } let operation = SignatureVerificationOperation::new(public_key.key_type()); - execution_context.add_operation(ExecutionOperation::SignatureVerification(operation)); + execution_context.add_operation(ValidationOperation::SignatureVerification(operation)); let signature_is_valid = self.verify_signature(public_key, &NativeBlsModule); diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs index 83da291026..d69426a0b2 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs @@ -4,6 +4,7 @@ use crate::execution::validation::state_transition::transformer::StateTransition use crate::platform_types::platform::{PlatformRef, PlatformStateRef}; use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::rpc::core::CoreRPCLike; +use dpp::block::block_info::BlockInfo; use dpp::identity::PartialIdentity; use dpp::prelude::ConsensusValidationResult; @@ -31,7 +32,17 @@ pub(in crate::execution) fn process_state_transition_v0<'a, C: CoreRPCLike>( let mut state_transition_execution_context = StateTransitionExecutionContext::default_for_platform_version(platform_version)?; - let action = if state_transition.requires_state_to_validate_structure() { + // We start with basic structure validation, this is structure validation that does not require + // state. + let consensus_result = state_transition.validate_basic_structure(platform_version)?; + + if !consensus_result.is_valid() { + return Ok( + ConsensusValidationResult::::new_with_errors(consensus_result.errors), + ); + } + + let action = if state_transition.requires_advance_structure_validation() { let state_transition_action_result = state_transition.transform_into_action( platform, true, @@ -51,10 +62,10 @@ pub(in crate::execution) fn process_state_transition_v0<'a, C: CoreRPCLike>( }; // Validating structure - let result = state_transition.validate_structure( + let result = state_transition.validate_advanced_structure_from_state( &platform.into(), action.as_ref(), - platform.state.current_protocol_version_in_consensus(), + platform_version, )?; if !result.is_valid() { return Ok(ConsensusValidationResult::::new_with_errors(result.errors)); @@ -96,7 +107,32 @@ pub(in crate::execution) fn process_state_transition_v0<'a, C: CoreRPCLike>( return Ok(ConsensusValidationResult::::new_with_errors(result.errors)); } - let maybe_identity = result.into_data()?; + let mut maybe_identity = result.into_data()?; + + // Validating identity contract nonce, this must happen after validating the signature + let result = state_transition.validate_balance( + maybe_identity.as_mut(), + &platform.into(), + platform.block_info, + transaction, + platform_version, + )?; + + if !result.is_valid() { + return Ok(ConsensusValidationResult::::new_with_errors(result.errors)); + } + + // Validating identity contract nonce, this must happen after validating the signature + let result = state_transition.validate_nonces( + &platform.into(), + platform.block_info, + transaction, + platform_version, + )?; + + if !result.is_valid() { + return Ok(ConsensusValidationResult::::new_with_errors(result.errors)); + } // Validating state let result = state_transition.validate_state( @@ -150,30 +186,95 @@ pub(crate) trait StateTransitionSignatureValidationV0 { } /// A trait for validating state transitions within a blockchain. -pub(crate) trait StateTransitionStructureValidationV0 { +pub(crate) trait StateTransitionBasicStructureValidationV0 { /// Validates the structure of a transaction by checking its basic elements. /// /// # Arguments /// - /// * `drive` - A reference to the drive containing the transaction data. - /// * `tx` - The transaction argument to be checked. + /// * `platform` - A reference to the platform state ref. + /// * `platform_version` - The platform version. /// /// # Returns /// /// * `Result` - A result with either a SimpleConsensusValidationResult or an Error. - fn validate_structure( + fn validate_basic_structure( + &self, + platform_version: &PlatformVersion, + ) -> Result; +} + +/// A trait for validating state transitions within a blockchain. +pub(crate) trait StateTransitionNonceValidationV0 { + /// Validates the structure of a transaction by checking its basic elements. + /// + /// # Arguments + /// + /// * `platform_version` - The platform version. + /// + /// # Returns + /// + /// * `Result` - A result with either a SimpleConsensusValidationResult or an Error. + fn validate_nonces( + &self, + platform: &PlatformStateRef, + block_info: &BlockInfo, + tx: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result; +} + +/// A trait for validating state transitions within a blockchain. +pub(crate) trait StateTransitionStructureKnownInStateValidationV0 { + /// Validates the structure of a transaction by checking its basic elements. + /// + /// # Arguments + /// + /// * `platform` - A reference to the platform state ref. + /// * `action` - An optional reference to the state transition action. + /// * `platform_version` - The platform version. + /// + /// # Returns + /// + /// * `Result` - A result with either a SimpleConsensusValidationResult or an Error. + fn validate_advanced_structure_from_state( &self, platform: &PlatformStateRef, action: Option<&StateTransitionAction>, - protocol_version: u32, + platform_version: &PlatformVersion, ) -> Result; /// This means we should transform into the action before validation of the structure - fn requires_state_to_validate_structure(&self) -> bool { + fn requires_advance_structure_validation(&self) -> bool { false } } +/// A trait for validating state transitions within a blockchain. +pub(crate) trait StateTransitionBalanceValidationV0 { + /// Validates the state transition by analyzing the changes in the platform state after applying the transaction. + /// + /// # Arguments + /// + /// * `platform` - A reference to the platform containing the state data. + /// * `tx` - The transaction argument to be applied. + /// + /// # Type Parameters + /// + /// * `C: CoreRPCLike` - A type constraint indicating that C should implement `CoreRPCLike`. + /// + /// # Returns + /// + /// * `Result, Error>` - A result with either a ConsensusValidationResult containing a StateTransitionAction or an Error. + fn validate_balance( + &self, + identity: Option<&mut PartialIdentity>, + platform: &PlatformStateRef, + block_info: &BlockInfo, + tx: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result; +} + /// A trait for validating state transitions within a blockchain. pub(crate) trait StateTransitionStateValidationV0: StateTransitionActionTransformerV0 @@ -201,43 +302,99 @@ pub(crate) trait StateTransitionStateValidationV0: ) -> Result, Error>; } -impl StateTransitionStructureValidationV0 for StateTransition { - fn validate_structure( +impl StateTransitionBasicStructureValidationV0 for StateTransition { + fn validate_basic_structure( &self, - platform: &PlatformStateRef, - action: Option<&StateTransitionAction>, - protocol_version: u32, + platform_version: &PlatformVersion, ) -> Result { match self { StateTransition::DataContractCreate(st) => { - st.validate_structure(platform, action, protocol_version) + st.validate_basic_structure(platform_version) } StateTransition::DataContractUpdate(st) => { - st.validate_structure(platform, action, protocol_version) + st.validate_basic_structure(platform_version) } - StateTransition::IdentityCreate(st) => { - st.validate_structure(platform, action, protocol_version) + StateTransition::IdentityCreate(st) => st.validate_basic_structure(platform_version), + StateTransition::IdentityUpdate(st) => st.validate_basic_structure(platform_version), + StateTransition::IdentityTopUp(st) => st.validate_basic_structure(platform_version), + StateTransition::IdentityCreditWithdrawal(st) => { + st.validate_basic_structure(platform_version) + } + StateTransition::DocumentsBatch(st) => st.validate_basic_structure(platform_version), + StateTransition::IdentityCreditTransfer(st) => { + st.validate_basic_structure(platform_version) + } + } + } +} + +impl StateTransitionNonceValidationV0 for StateTransition { + fn validate_nonces( + &self, + platform: &PlatformStateRef, + block_info: &BlockInfo, + tx: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result { + match self { + StateTransition::DocumentsBatch(st) => { + st.validate_nonces(platform, block_info, tx, platform_version) + } + StateTransition::DataContractUpdate(st) => { + st.validate_nonces(platform, block_info, tx, platform_version) } StateTransition::IdentityUpdate(st) => { - st.validate_structure(platform, action, protocol_version) + st.validate_nonces(platform, block_info, tx, platform_version) } - StateTransition::IdentityTopUp(st) => { - st.validate_structure(platform, action, protocol_version) + StateTransition::IdentityCreditTransfer(st) => { + st.validate_nonces(platform, block_info, tx, platform_version) } StateTransition::IdentityCreditWithdrawal(st) => { - st.validate_structure(platform, action, protocol_version) - } - StateTransition::DocumentsBatch(st) => { - st.validate_structure(platform, action, protocol_version) + st.validate_nonces(platform, block_info, tx, platform_version) } + _ => Ok(SimpleConsensusValidationResult::new()), + } + } +} + +impl StateTransitionBalanceValidationV0 for StateTransition { + fn validate_balance( + &self, + identity: Option<&mut PartialIdentity>, + platform: &PlatformStateRef, + block_info: &BlockInfo, + tx: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result { + match self { StateTransition::IdentityCreditTransfer(st) => { - st.validate_structure(platform, action, protocol_version) + st.validate_balance(identity, platform, block_info, tx, platform_version) + } + StateTransition::IdentityCreditWithdrawal(st) => { + st.validate_balance(identity, platform, block_info, tx, platform_version) + } + _ => Ok(SimpleConsensusValidationResult::new()), + } + } +} + +impl StateTransitionStructureKnownInStateValidationV0 for StateTransition { + fn validate_advanced_structure_from_state( + &self, + platform: &PlatformStateRef, + action: Option<&StateTransitionAction>, + platform_version: &PlatformVersion, + ) -> Result { + match self { + StateTransition::DocumentsBatch(st) => { + st.validate_advanced_structure_from_state(platform, action, platform_version) } + _ => Ok(SimpleConsensusValidationResult::new()), } } /// This means we should transform into the action before validation of the structure - fn requires_state_to_validate_structure(&self) -> bool { + fn requires_advance_structure_validation(&self) -> bool { matches!(self, StateTransition::DocumentsBatch(_)) } } @@ -401,9 +558,11 @@ impl StateTransitionStateValidationV0 for StateTransition { tx: TransactionArg, ) -> Result, Error> { match self { + // The replay attack is prevented by checking if a data contract exists with this id first StateTransition::DataContractCreate(st) => { st.validate_state(action, platform, execution_context, tx) } + // The replay attack is prevented by identity data contract nonce StateTransition::DataContractUpdate(st) => { st.validate_state(action, platform, execution_context, tx) } @@ -419,6 +578,7 @@ impl StateTransitionStateValidationV0 for StateTransition { StateTransition::IdentityCreditWithdrawal(st) => { st.validate_state(action, platform, execution_context, tx) } + // The replay attack is prevented by identity data contract nonce StateTransition::DocumentsBatch(st) => { st.validate_state(action, platform, execution_context, tx) } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs index 1e048a17f2..2d0e113f94 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs @@ -19,7 +19,8 @@ use crate::platform_types::platform::{PlatformRef, PlatformStateRef}; use crate::rpc::core::CoreRPCLike; use crate::execution::validation::state_transition::processor::v0::{ - StateTransitionStateValidationV0, StateTransitionStructureValidationV0, + StateTransitionBasicStructureValidationV0, StateTransitionStateValidationV0, + StateTransitionStructureKnownInStateValidationV0, }; use crate::execution::validation::state_transition::transformer::StateTransitionActionTransformerV0; use crate::platform_types::platform_state::v0::PlatformStateV0Methods; @@ -51,24 +52,21 @@ impl StateTransitionActionTransformerV0 for DataContractCreateTransition { } } -impl StateTransitionStructureValidationV0 for DataContractCreateTransition { - fn validate_structure( +impl StateTransitionBasicStructureValidationV0 for DataContractCreateTransition { + fn validate_basic_structure( &self, - _platform: &PlatformStateRef, - _action: Option<&StateTransitionAction>, - protocol_version: u32, + platform_version: &PlatformVersion, ) -> Result { - let platform_version = PlatformVersion::get(protocol_version)?; match platform_version .drive_abci .validation_and_processing .state_transitions .contract_create_state_transition - .structure + .base_structure { 0 => self.validate_base_structure_v0(platform_version), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { - method: "data contract create transition: validate_structure".to_string(), + method: "data contract create transition: validate_basic_structure".to_string(), known_versions: vec![0], received: version, })), diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/identity_contract_nonce/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/identity_contract_nonce/mod.rs new file mode 100644 index 0000000000..a9c080fa8c --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/identity_contract_nonce/mod.rs @@ -0,0 +1,50 @@ +use dpp::block::block_info::BlockInfo; +use dpp::state_transition::data_contract_update_transition::DataContractUpdateTransition; +use dpp::validation::{ConsensusValidationResult, SimpleConsensusValidationResult}; +use drive::grovedb::TransactionArg; +use drive::state_transition_action::StateTransitionAction; +use dpp::version::PlatformVersion; +use crate::error::Error; +use crate::error::execution::ExecutionError; +use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; +use crate::execution::validation::state_transition::data_contract_update::identity_contract_nonce::v0::DataContractUpdateStateTransitionIdentityContractNonceV0; +use crate::execution::validation::state_transition::data_contract_update::state::v0::DataContractUpdateStateTransitionStateValidationV0; +use crate::execution::validation::state_transition::processor::v0::{StateTransitionNonceValidationV0, StateTransitionStateValidationV0}; +use crate::platform_types::platform::{PlatformRef, PlatformStateRef}; +use crate::platform_types::platform_state::v0::PlatformStateV0Methods; +use crate::rpc::core::CoreRPCLike; + +pub(crate) mod v0; + +impl StateTransitionNonceValidationV0 for DataContractUpdateTransition { + fn validate_nonces( + &self, + platform: &PlatformStateRef, + block_info: &BlockInfo, + tx: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result { + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .contract_update_state_transition + .nonce + { + Some(0) => { + self.validate_identity_contract_nonce_v0(platform, block_info, tx, platform_version) + } + Some(version) => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "data contract update transition: validate_identity_contract_nonce" + .to_string(), + known_versions: vec![0], + received: version, + })), + None => Err(Error::Execution(ExecutionError::VersionNotActive { + method: "data contract update transition: validate_identity_contract_nonce" + .to_string(), + known_versions: vec![0], + })), + } + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/identity_contract_nonce/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/identity_contract_nonce/v0/mod.rs new file mode 100644 index 0000000000..97f180c1a9 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/identity_contract_nonce/v0/mod.rs @@ -0,0 +1,64 @@ +use crate::error::Error; +use dpp::block::block_info::BlockInfo; +use dpp::consensus::state::identity::invalid_identity_contract_nonce_error::InvalidIdentityNonceError; +use dpp::consensus::state::state_error::StateError; +use dpp::consensus::ConsensusError; +use dpp::identity::identity_nonce::{ + validate_identity_nonce_update, validate_new_identity_nonce, MergeIdentityNonceResult, + IDENTITY_NONCE_VALUE_FILTER, IDENTITY_NONCE_VALUE_FILTER_MAX_BYTES, + MISSING_IDENTITY_REVISIONS_FILTER, MISSING_IDENTITY_REVISIONS_MAX_BYTES, +}; +use dpp::state_transition::data_contract_update_transition::accessors::DataContractUpdateTransitionAccessorsV0; +use dpp::state_transition::data_contract_update_transition::DataContractUpdateTransition; +use dpp::state_transition::documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; +use dpp::state_transition::documents_batch_transition::document_transition::DocumentTransitionV0Methods; + +use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; +use dpp::state_transition::StateTransitionLike; + +use dpp::validation::SimpleConsensusValidationResult; + +use crate::platform_types::platform::PlatformStateRef; +use dpp::version::PlatformVersion; +use drive::grovedb::TransactionArg; + +pub(in crate::execution::validation::state_transition::state_transitions) trait DataContractUpdateStateTransitionIdentityContractNonceV0 +{ + fn validate_identity_contract_nonce_v0( + &self, + platform: &PlatformStateRef, + block_info: &BlockInfo, + tx: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result; +} + +impl DataContractUpdateStateTransitionIdentityContractNonceV0 for DataContractUpdateTransition { + fn validate_identity_contract_nonce_v0( + &self, + platform: &PlatformStateRef, + block_info: &BlockInfo, + tx: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result { + let revision_nonce = self.identity_contract_nonce(); + let identity_id = self.data_contract().owner_id(); + let contract_id = self.data_contract().id(); + let (existing_nonce, fees) = platform.drive.fetch_identity_contract_nonce_with_fees( + identity_id.to_buffer(), + contract_id.to_buffer(), + block_info, + true, + tx, + platform_version, + )?; + + let result = if let Some(existing_nonce) = existing_nonce { + validate_identity_nonce_update(existing_nonce, revision_nonce, identity_id) + } else { + validate_new_identity_nonce(revision_nonce, identity_id) + }; + + Ok(result) + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs index e555f1436a..0e5422a85d 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs @@ -1,3 +1,4 @@ +mod identity_contract_nonce; mod state; mod structure; @@ -16,7 +17,8 @@ use drive::state_transition_action::StateTransitionAction; use crate::execution::validation::state_transition::data_contract_update::state::v0::DataContractUpdateStateTransitionStateValidationV0; use crate::execution::validation::state_transition::data_contract_update::structure::v0::DataContractUpdateStateTransitionStructureValidationV0; use crate::execution::validation::state_transition::processor::v0::{ - StateTransitionStateValidationV0, StateTransitionStructureValidationV0, + StateTransitionBasicStructureValidationV0, StateTransitionStateValidationV0, + StateTransitionStructureKnownInStateValidationV0, }; use crate::execution::validation::state_transition::transformer::StateTransitionActionTransformerV0; use crate::platform_types::platform::{PlatformRef, PlatformStateRef}; @@ -50,58 +52,6 @@ impl StateTransitionActionTransformerV0 for DataContractUpdateTransition { } } -impl StateTransitionStructureValidationV0 for DataContractUpdateTransition { - fn validate_structure( - &self, - _platform: &PlatformStateRef, - _action: Option<&StateTransitionAction>, - protocol_version: u32, - ) -> Result { - let platform_version = PlatformVersion::get(protocol_version)?; - match platform_version - .drive_abci - .validation_and_processing - .state_transitions - .contract_update_state_transition - .structure - { - 0 => self.validate_base_structure_v0(platform_version), - version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { - method: "data contract update transition: validate_structure".to_string(), - known_versions: vec![0], - received: version, - })), - } - } -} - -impl StateTransitionStateValidationV0 for DataContractUpdateTransition { - fn validate_state( - &self, - _action: Option, - platform: &PlatformRef, - _execution_context: &mut StateTransitionExecutionContext, - tx: TransactionArg, - ) -> Result, Error> { - let platform_version = - PlatformVersion::get(platform.state.current_protocol_version_in_consensus())?; - match platform_version - .drive_abci - .validation_and_processing - .state_transitions - .contract_update_state_transition - .state - { - 0 => self.validate_state_v0(platform, tx, platform_version), - version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { - method: "data contract update transition: validate_state".to_string(), - known_versions: vec![0], - received: version, - })), - } - } -} - #[cfg(test)] mod tests { use crate::config::{ExecutionConfig, PlatformConfig, PlatformTestConfig}; @@ -228,6 +178,7 @@ mod tests { .expect("to be able to set document schema"); let state_transition = DataContractUpdateTransitionV0 { + identity_contract_nonce: 1, data_contract: DataContractInSerializationFormat::try_from_platform_versioned( data_contract, platform_version, @@ -306,6 +257,7 @@ mod tests { // TODO: add a data contract stop transition let state_transition = DataContractUpdateTransitionV0 { + identity_contract_nonce: 1, data_contract: DataContractInSerializationFormat::try_from_platform_versioned( data_contract.clone(), platform_version, @@ -458,7 +410,7 @@ mod tests { // It should be not possible to modify this data_contract.config_mut().set_keeps_history(false); - let state_transition: DataContractUpdateTransitionV0 = data_contract + let state_transition: DataContractUpdateTransitionV0 = (data_contract, 1) .try_into_platform_versioned(LATEST_PLATFORM_VERSION) .expect("expected an update transition"); diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/mod.rs index 9a1925de7f..c028265335 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/mod.rs @@ -1 +1,42 @@ +use crate::error::execution::ExecutionError; +use crate::error::Error; +use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; +use crate::execution::validation::state_transition::data_contract_update::state::v0::DataContractUpdateStateTransitionStateValidationV0; +use crate::execution::validation::state_transition::processor::v0::StateTransitionStateValidationV0; +use crate::platform_types::platform::PlatformRef; +use crate::platform_types::platform_state::v0::PlatformStateV0Methods; +use crate::rpc::core::CoreRPCLike; +use dpp::state_transition::data_contract_update_transition::DataContractUpdateTransition; +use dpp::validation::ConsensusValidationResult; +use dpp::version::PlatformVersion; +use drive::grovedb::TransactionArg; +use drive::state_transition_action::StateTransitionAction; + pub(crate) mod v0; + +impl StateTransitionStateValidationV0 for DataContractUpdateTransition { + fn validate_state( + &self, + _action: Option, + platform: &PlatformRef, + _execution_context: &mut StateTransitionExecutionContext, + tx: TransactionArg, + ) -> Result, Error> { + let platform_version = + PlatformVersion::get(platform.state.current_protocol_version_in_consensus())?; + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .contract_update_state_transition + .state + { + 0 => self.validate_state_v0(platform, tx, platform_version), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "data contract update transition: validate_state".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/v0/mod.rs index f65d526fe0..0b7897e053 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/v0/mod.rs @@ -27,10 +27,12 @@ use dpp::state_transition::data_contract_update_transition::accessors::DataContr use dpp::ProtocolError; use dpp::state_transition::data_contract_update_transition::DataContractUpdateTransition; +use dpp::state_transition::StateTransitionLike; use dpp::version::{PlatformVersion, TryIntoPlatformVersioned}; use drive::grovedb::TransactionArg; use drive::state_transition_action::contract::data_contract_update::DataContractUpdateTransitionAction; +use drive::state_transition_action::system::bump_identity_data_contract_nonce_action::BumpIdentityDataContractNonceAction; use drive::state_transition_action::StateTransitionAction; pub(in crate::execution::validation::state_transition::state_transitions::data_contract_update) trait DataContractUpdateStateTransitionStateValidationV0 { @@ -56,8 +58,17 @@ impl DataContractUpdateStateTransitionStateValidationV0 for DataContractUpdateTr ) -> Result, Error> { let action = self.transform_into_action_v0(platform_version)?; - if !action.is_valid_with_data() { - return Ok(action); + if !action.is_valid() { + let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( + BumpIdentityDataContractNonceAction::from_borrowed_data_contract_update_transition( + self, + )?, + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + action.errors, + )); } let state_transition_action = action.data.as_ref().unwrap(); @@ -88,7 +99,17 @@ impl DataContractUpdateStateTransitionStateValidationV0 for DataContractUpdateTr validation_result.add_error(BasicError::DataContractNotPresentError( DataContractNotPresentError::new(new_data_contract.id()), )); - return Ok(validation_result); + + let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( + BumpIdentityDataContractNonceAction::from_borrowed_data_contract_update_transition( + self, + )?, + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + validation_result.errors, + )); }; let old_data_contract = &contract_fetch_info.contract; @@ -98,12 +119,31 @@ impl DataContractUpdateStateTransitionStateValidationV0 for DataContractUpdateTr if new_version < old_version || new_version - old_version != 1 { validation_result.add_error(BasicError::InvalidDataContractVersionError( InvalidDataContractVersionError::new(old_version + 1, new_version), - )) + )); + let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( + BumpIdentityDataContractNonceAction::from_borrowed_data_contract_update_transition( + self, + )?, + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + validation_result.errors, + )); } if old_data_contract.config().readonly() { validation_result.add_error(DataContractIsReadonlyError::new(new_data_contract.id())); - return Ok(validation_result); + let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( + BumpIdentityDataContractNonceAction::from_borrowed_data_contract_update_transition( + self, + )?, + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + validation_result.errors, + )); } // We should now validate that new indexes contains all old indexes @@ -137,7 +177,16 @@ impl DataContractUpdateStateTransitionStateValidationV0 for DataContractUpdateTr } if !validation_result.is_valid() { - return Ok(validation_result); + let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( + BumpIdentityDataContractNonceAction::from_borrowed_data_contract_update_transition( + self, + )?, + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + validation_result.errors, + )); } let config_validation_result = old_data_contract.config().validate_config_update( @@ -148,7 +197,16 @@ impl DataContractUpdateStateTransitionStateValidationV0 for DataContractUpdateTr if !config_validation_result.is_valid() { validation_result.merge(config_validation_result); - return Ok(validation_result); + let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( + BumpIdentityDataContractNonceAction::from_borrowed_data_contract_update_transition( + self, + )?, + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + validation_result.errors, + )); } // Schema defs should be compatible @@ -197,7 +255,16 @@ impl DataContractUpdateStateTransitionStateValidationV0 for DataContractUpdateTr ), )); - return Ok(validation_result); + let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( + BumpIdentityDataContractNonceAction::from_borrowed_data_contract_update_transition( + self, + )?, + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + validation_result.errors, + )); } } @@ -237,7 +304,16 @@ impl DataContractUpdateStateTransitionStateValidationV0 for DataContractUpdateTr ), )); - return Ok(validation_result); + let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( + BumpIdentityDataContractNonceAction::from_borrowed_data_contract_update_transition( + self, + )?, + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + validation_result.errors, + )); } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/structure/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/structure/mod.rs index 9a1925de7f..b4f95f7e29 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/structure/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/structure/mod.rs @@ -1 +1,31 @@ +use crate::error::execution::ExecutionError; +use crate::error::Error; +use crate::execution::validation::state_transition::data_contract_update::structure::v0::DataContractUpdateStateTransitionStructureValidationV0; +use crate::execution::validation::state_transition::processor::v0::StateTransitionBasicStructureValidationV0; +use dpp::state_transition::data_contract_update_transition::DataContractUpdateTransition; +use dpp::validation::SimpleConsensusValidationResult; +use dpp::version::PlatformVersion; + pub(crate) mod v0; + +impl StateTransitionBasicStructureValidationV0 for DataContractUpdateTransition { + fn validate_basic_structure( + &self, + platform_version: &PlatformVersion, + ) -> Result { + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .contract_update_state_transition + .base_structure + { + 0 => self.validate_base_structure_v0(platform_version), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "data contract update transition: validate_basic_structure".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/structure/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/structure/v0/mod.rs index 20853351ae..69600bb335 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/structure/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/structure/v0/mod.rs @@ -4,6 +4,7 @@ use dpp::state_transition::data_contract_update_transition::accessors::DataContr use dpp::ProtocolError; use dpp::state_transition::data_contract_update_transition::DataContractUpdateTransition; +use dpp::state_transition::StateTransitionLike; use dpp::validation::SimpleConsensusValidationResult; use dpp::version::PlatformVersion; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/base_structure/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/mod.rs similarity index 100% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/base_structure/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/mod.rs diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/base_structure/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/v0/mod.rs similarity index 90% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/base_structure/v0/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/v0/mod.rs index cf7b9490eb..ba72d4989e 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/base_structure/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/v0/mod.rs @@ -18,11 +18,12 @@ use crate::execution::validation::state_transition::state_transitions::documents use crate::execution::validation::state_transition::state_transitions::documents_batch::action_validation::document_delete_transition_action::DocumentDeleteTransitionActionValidation; use crate::execution::validation::state_transition::state_transitions::documents_batch::action_validation::document_create_transition_action::DocumentCreateTransitionActionValidation; use dpp::state_transition::documents_batch_transition::document_create_transition::v0::v0_methods::DocumentCreateTransitionV0Methods; +use crate::error::execution::ExecutionError; use crate::platform_types::platform::PlatformStateRef; pub(in crate::execution::validation::state_transition::state_transitions::documents_batch) trait DocumentsBatchStateTransitionStructureValidationV0 { - fn validate_structure_v0( + fn validate_advanced_structure_from_state_v0( &self, platform: &PlatformStateRef, action: &DocumentsBatchTransitionAction, @@ -31,21 +32,12 @@ pub(in crate::execution::validation::state_transition::state_transitions::docume } impl DocumentsBatchStateTransitionStructureValidationV0 for DocumentsBatchTransition { - fn validate_structure_v0( + fn validate_advanced_structure_from_state_v0( &self, platform: &PlatformStateRef, action: &DocumentsBatchTransitionAction, platform_version: &PlatformVersion, ) -> Result { - // First we should validate the base structure - let result = self - .validate_base_structure(platform_version) - .map_err(Error::Protocol)?; - - if !result.is_valid() { - return Ok(result); - } - // We should validate that all newly created documents have valid ids for transition in self.transitions() { if let DocumentTransition::Create(create_transition) = transition { @@ -87,6 +79,11 @@ impl DocumentsBatchStateTransitionStructureValidationV0 for DocumentsBatchTransi return Ok(result); } } + DocumentTransitionAction::BumpIdentityDataContractNonce(_) => { + return Err(Error::Execution(ExecutionError::CorruptedCodeExecution( + "we should not have a bump identity contract nonce at this stage", + ))); + } } } Ok(SimpleConsensusValidationResult::new()) diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/executor.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/executor.rs index 70643e9171..a44a47846d 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/executor.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/executor.rs @@ -6,9 +6,11 @@ use drive::state_transition_action::document::documents_batch::document_transiti use dpp::state_transition::documents_batch_transition::document_transition::action_type::TransitionActionTypeGetter; use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; use dpp::version::PlatformVersion; +use drive::error::drive::DriveError; use crate::execution::validation::state_transition::documents_batch::data_triggers::bindings::data_trigger_binding::DataTriggerBinding; use crate::execution::validation::state_transition::documents_batch::data_triggers::bindings::data_trigger_binding::DataTriggerBindingV0Getters; use crate::error::Error; +use crate::error::execution::ExecutionError; pub trait DataTriggerExecutor { fn validate_with_data_triggers( @@ -26,8 +28,18 @@ impl DataTriggerExecutor for DocumentTransitionAction { context: &DataTriggerExecutionContext, platform_version: &PlatformVersion, ) -> Result { - let data_contract_id = self.base().data_contract_id(); - let document_type_name = self.base().document_type_name(); + let data_contract_id = self + .base() + .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( + "expecting action to have a base", + )))? + .data_contract_id(); + let document_type_name = self + .base() + .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( + "expecting action to have a base", + )))? + .document_type_name(); let transition_action = self.action_type(); // Match data triggers by action type, contract ID and document type name diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/v0/mod.rs index a4afc463f1..6d3b949629 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/v0/mod.rs @@ -38,7 +38,12 @@ pub fn create_contact_request_data_trigger_v0( context: &DataTriggerExecutionContext<'_>, platform_version: &PlatformVersion, ) -> Result { - let data_contract_fetch_info = document_transition.base().data_contract_fetch_info(); + let data_contract_fetch_info = document_transition + .base() + .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( + "expecting action to have a base", + )))? + .data_contract_fetch_info(); let data_contract = &data_contract_fetch_info.contract; let mut result = DataTriggerExecutionResult::default(); let is_dry_run = context.state_transition_execution_context.in_dry_run(); @@ -50,7 +55,12 @@ pub fn create_contact_request_data_trigger_v0( return Err(Error::Execution(ExecutionError::DataTriggerExecutionError( format!( "the Document Transition {} isn't 'CREATE", - document_transition.base().id() + document_transition + .base() + .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( + "expecting action to have a base" + )))? + .id() ), ))) } @@ -68,7 +78,12 @@ pub fn create_contact_request_data_trigger_v0( if owner_id == &to_user_id { let err = DataTriggerConditionError::new( data_contract.id(), - document_transition.base().id(), + document_transition + .base() + .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( + "expecting action to have a base", + )))? + .id(), format!("Identity {to_user_id} must not be equal to owner id"), ); @@ -128,6 +143,7 @@ pub fn create_contact_request_data_trigger_v0( mod test { use dpp::block::block_info::BlockInfo; use dpp::block::extended_block_info::v0::ExtendedBlockInfoV0; + use std::collections::BTreeMap; use std::sync::Arc; use dpp::document::{DocumentV0Getters, DocumentV0Setters}; @@ -150,6 +166,8 @@ mod test { let platform = TestPlatformBuilder::new() .build_with_mock_rpc() .set_initial_state_structure(); + + let mut nonce_counter = BTreeMap::new(); let state_read_guard = platform.state.read().unwrap(); let platform_ref = PlatformStateRef { drive: &platform.drive, @@ -175,10 +193,13 @@ mod test { .document_type_for_name("contactRequest") .expect("expected a contact request"); - let document_transitions = get_document_transitions_fixture([( - DocumentTransitionActionType::Create, - vec![(contact_request_document, document_type, Bytes32::default())], - )]); + let document_transitions = get_document_transitions_fixture( + [( + DocumentTransitionActionType::Create, + vec![(contact_request_document, document_type, Bytes32::default())], + )], + &mut nonce_counter, + ); let document_transition = document_transitions .first() .expect("document transition should be present"); @@ -217,6 +238,9 @@ mod test { let platform = TestPlatformBuilder::new() .build_with_mock_rpc() .set_initial_state_structure(); + + let mut nonce_counter = BTreeMap::new(); + let mut state_write_guard = platform.state.write().unwrap(); state_write_guard.set_last_committed_block_info(Some( @@ -262,10 +286,13 @@ mod test { .document_type_for_name("contactRequest") .expect("expected a contact request"); - let document_transitions = get_document_transitions_fixture([( - DocumentTransitionActionType::Create, - vec![(contact_request_document, document_type, Bytes32::default())], - )]); + let document_transitions = get_document_transitions_fixture( + [( + DocumentTransitionActionType::Create, + vec![(contact_request_document, document_type, Bytes32::default())], + )], + &mut nonce_counter, + ); let document_transition = document_transitions .first() .expect("document transition should be present"); @@ -326,6 +353,9 @@ mod test { let platform = TestPlatformBuilder::new() .build_with_mock_rpc() .set_initial_state_structure(); + + let mut nonce_counter = BTreeMap::new(); + let mut state_write_guard = platform.state.write().unwrap(); state_write_guard.set_last_committed_block_info(Some( @@ -374,10 +404,13 @@ mod test { .get_identifier("toUserId") .expect("expected to get toUserId"); - let document_transitions = get_document_transitions_fixture([( - DocumentTransitionActionType::Create, - vec![(contact_request_document, document_type, Bytes32::default())], - )]); + let document_transitions = get_document_transitions_fixture( + [( + DocumentTransitionActionType::Create, + vec![(contact_request_document, document_type, Bytes32::default())], + )], + &mut nonce_counter, + ); let document_transition = document_transitions .first() .expect("document transition should be present"); diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs index 57051bd299..d423daac40 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs @@ -49,7 +49,12 @@ pub fn create_domain_data_trigger_v0( context: &DataTriggerExecutionContext<'_>, platform_version: &PlatformVersion, ) -> Result { - let data_contract_fetch_info = document_transition.base().data_contract_fetch_info(); + let data_contract_fetch_info = document_transition + .base() + .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( + "expecting action to have a base", + )))? + .data_contract_fetch_info(); let data_contract = &data_contract_fetch_info.contract; let is_dry_run = context.state_transition_execution_context.in_dry_run(); let document_create_transition = match document_transition { @@ -58,7 +63,12 @@ pub fn create_domain_data_trigger_v0( return Err(Error::Execution(ExecutionError::DataTriggerExecutionError( format!( "the Document Transition {} isn't 'CREATE", - document_transition.base().id() + document_transition + .base() + .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( + "expecting action to have a base" + )))? + .id() ), ))) } @@ -107,7 +117,12 @@ pub fn create_domain_data_trigger_v0( if full_domain_name.len() > MAX_PRINTABLE_DOMAIN_NAME_LENGTH { let err = DataTriggerConditionError::new( data_contract.id(), - document_transition.base().id(), + document_transition + .base() + .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( + "expecting action to have a base", + )))? + .id(), format!( "Full domain name length can not be more than {} characters long but got {}", MAX_PRINTABLE_DOMAIN_NAME_LENGTH, @@ -121,7 +136,12 @@ pub fn create_domain_data_trigger_v0( if normalized_label != convert_to_homograph_safe_chars(label.as_str()) { let err = DataTriggerConditionError::new( data_contract.id(), - document_transition.base().id(), + document_transition + .base() + .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( + "expecting action to have a base", + )))? + .id(), format!( "Normalized label doesn't match label: {} != {}", normalized_label, label @@ -136,7 +156,12 @@ pub fn create_domain_data_trigger_v0( { let err = DataTriggerConditionError::new( data_contract.id(), - document_transition.base().id(), + document_transition + .base() + .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( + "expecting action to have a base", + )))? + .id(), format!( "Normalized parent domain name doesn't match parent domain name: {} != {}", normalized_parent_domain_name, parent_domain_name @@ -153,7 +178,12 @@ pub fn create_domain_data_trigger_v0( if id != owner_id { let err = DataTriggerConditionError::new( data_contract.id(), - document_transition.base().id(), + document_transition + .base() + .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( + "expecting action to have a base", + )))? + .id(), format!( "ownerId {} doesn't match {} {}", owner_id, DASH_UNIQUE_IDENTITY_ID, id @@ -171,7 +201,12 @@ pub fn create_domain_data_trigger_v0( if id != owner_id { let err = DataTriggerConditionError::new( data_contract.id(), - document_transition.base().id(), + document_transition + .base() + .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( + "expecting action to have a base", + )))? + .id(), format!( "ownerId {} doesn't match {} {}", owner_id, DASH_ALIAS_IDENTITY_ID, id @@ -186,7 +221,12 @@ pub fn create_domain_data_trigger_v0( { let err = DataTriggerConditionError::new( data_contract.id(), - document_transition.base().id(), + document_transition + .base() + .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( + "expecting action to have a base", + )))? + .id(), "Can't create top level domain for this identity".to_string(), ); @@ -258,7 +298,12 @@ pub fn create_domain_data_trigger_v0( if documents.is_empty() { let err = DataTriggerConditionError::new( data_contract.id(), - document_transition.base().id(), + document_transition + .base() + .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( + "expecting action to have a base", + )))? + .id(), "Parent domain is not present".to_string(), ); @@ -271,7 +316,12 @@ pub fn create_domain_data_trigger_v0( if rule_allow_subdomains { let err = DataTriggerConditionError::new( data_contract.id(), - document_transition.base().id(), + document_transition + .base() + .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( + "expecting action to have a base", + )))? + .id(), "Allowing subdomains registration is forbidden for this domain".to_string(), ); @@ -288,7 +338,12 @@ pub fn create_domain_data_trigger_v0( { let err = DataTriggerConditionError::new( data_contract.id(), - document_transition.base().id(), + document_transition + .base() + .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( + "expecting action to have a base", + )))? + .id(), "The subdomain can be created only by the parent domain owner".to_string(), ); @@ -351,7 +406,12 @@ pub fn create_domain_data_trigger_v0( if preorder_documents.is_empty() { let err = DataTriggerConditionError::new( data_contract.id(), - document_transition.base().id(), + document_transition + .base() + .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( + "expecting action to have a base", + )))? + .id(), "preorderDocument was not found".to_string(), ); result.add_error(err) @@ -381,6 +441,9 @@ mod test { let platform = TestPlatformBuilder::new() .build_with_mock_rpc() .set_initial_state_structure(); + + let mut nonce_counter = BTreeMap::new(); + let state_read_guard = platform.state.read().unwrap(); let platform_ref = PlatformStateRef { @@ -412,10 +475,13 @@ mod test { let document_type = data_contract .document_type_for_name("domain") .expect("expected to get domain document type"); - let transitions = get_document_transitions_fixture([( - DocumentTransitionActionType::Create, - vec![(document, document_type, Bytes32::default())], - )]); + let transitions = get_document_transitions_fixture( + [( + DocumentTransitionActionType::Create, + vec![(document, document_type, Bytes32::default())], + )], + &mut nonce_counter, + ); let first_transition = transitions.first().expect("transition should be present"); let document_create_transition = first_transition diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/feature_flags/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/feature_flags/v0/mod.rs index 5d559cab7d..ca09ece118 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/feature_flags/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/feature_flags/v0/mod.rs @@ -37,7 +37,12 @@ pub fn create_feature_flag_data_trigger_v0( _platform_version: &PlatformVersion, ) -> Result { let mut result = DataTriggerExecutionResult::default(); - let data_contract_fetch_info = document_transition.base().data_contract_fetch_info(); + let data_contract_fetch_info = document_transition + .base() + .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( + "expecting action to have a base", + )))? + .data_contract_fetch_info(); let data_contract = &data_contract_fetch_info.contract; let document_create_transition = match document_transition { @@ -46,7 +51,12 @@ pub fn create_feature_flag_data_trigger_v0( return Err(Error::Execution(ExecutionError::DataTriggerExecutionError( format!( "the Document Transition {} isn't 'CREATE", - document_transition.base().id() + document_transition + .base() + .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( + "expecting action to have a base" + )))? + .id() ), ))) } @@ -66,7 +76,12 @@ pub fn create_feature_flag_data_trigger_v0( if enable_at_height < latest_block_height { let err = DataTriggerConditionError::new( data_contract.id(), - document_transition.base().id(), + document_transition + .base() + .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( + "expecting action to have a base", + )))? + .id(), "This identity can't activate selected feature flag".to_string(), ); @@ -78,7 +93,12 @@ pub fn create_feature_flag_data_trigger_v0( if context.owner_id != &feature_flags_contract::OWNER_ID { let err = DataTriggerConditionError::new( data_contract.id(), - document_transition.base().id(), + document_transition + .base() + .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( + "expecting action to have a base", + )))? + .id(), "This identity can't activate selected feature flag".to_string(), ); diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/reject/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/reject/v0/mod.rs index 48d087672a..08a4cc093a 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/reject/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/reject/v0/mod.rs @@ -4,6 +4,7 @@ use drive::state_transition_action::document::documents_batch::document_transiti use crate::error::Error; use crate::execution::validation::state_transition::documents_batch::data_triggers::DataTriggerExecutionResult; use drive::state_transition_action::document::documents_batch::document_transition::DocumentTransitionAction; +use crate::error::execution::ExecutionError; /// Creates a data trigger for handling document rejections. /// @@ -24,13 +25,23 @@ use drive::state_transition_action::document::documents_batch::document_transiti pub fn reject_data_trigger_v0( document_transition: &DocumentTransitionAction, ) -> Result { - let data_contract_fetch_info = document_transition.base().data_contract_fetch_info(); + let data_contract_fetch_info = document_transition + .base() + .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( + "expecting action to have a base", + )))? + .data_contract_fetch_info(); let data_contract = &data_contract_fetch_info.contract; let mut result = DataTriggerExecutionResult::default(); let err = DataTriggerConditionError::new( data_contract.id(), - document_transition.base().id(), + document_transition + .base() + .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( + "expecting action to have a base", + )))? + .id(), "Action is not allowed".to_string(), ); diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/reward_share/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/reward_share/v0/mod.rs index 5fd7a63aa7..7feef4e94e 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/reward_share/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/reward_share/v0/mod.rs @@ -48,7 +48,12 @@ pub fn create_masternode_reward_shares_data_trigger_v0( let mut result = DataTriggerExecutionResult::default(); let is_dry_run = context.state_transition_execution_context.in_dry_run(); - let data_contract_fetch_info = document_transition.base().data_contract_fetch_info(); + let data_contract_fetch_info = document_transition + .base() + .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( + "expecting action to have a base", + )))? + .data_contract_fetch_info(); let data_contract = &data_contract_fetch_info.contract; let document_create_transition = match document_transition { @@ -57,7 +62,12 @@ pub fn create_masternode_reward_shares_data_trigger_v0( return Err(Error::Execution(ExecutionError::DataTriggerExecutionError( format!( "the Document Transition {} isn't 'CREATE", - document_transition.base().id() + document_transition + .base() + .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( + "expecting action to have a base" + )))? + .id() ), ))) } @@ -82,7 +92,12 @@ pub fn create_masternode_reward_shares_data_trigger_v0( if !owner_id_in_sml { let err = DataTriggerConditionError::new( data_contract.id(), - document_transition.base().id(), + document_transition + .base() + .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( + "expecting action to have a base", + )))? + .id(), "Only masternode identities can share rewards".to_string(), ); @@ -99,7 +114,12 @@ pub fn create_masternode_reward_shares_data_trigger_v0( if !is_dry_run && maybe_identity.is_none() { let err = DataTriggerConditionError::new( data_contract.id(), - document_transition.base().id(), + document_transition + .base() + .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( + "expecting action to have a base", + )))? + .id(), format!( "Identity '{}' doesn't exist", bs58::encode(pay_to_id).into_string() @@ -158,7 +178,12 @@ pub fn create_masternode_reward_shares_data_trigger_v0( if documents.len() >= MAX_DOCUMENTS { let err = DataTriggerConditionError::new( data_contract.id(), - document_transition.base().id(), + document_transition + .base() + .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( + "expecting action to have a base", + )))? + .id(), format!( "Reward shares cannot contain more than {} identities", MAX_DOCUMENTS @@ -181,7 +206,12 @@ pub fn create_masternode_reward_shares_data_trigger_v0( if total_percent > MAX_PERCENTAGE { let err = DataTriggerConditionError::new( data_contract.id(), - document_transition.base().id(), + document_transition + .base() + .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( + "expecting action to have a base", + )))? + .id(), format!("Percentage can not be more than {}", MAX_PERCENTAGE), ); @@ -233,6 +263,7 @@ mod test { document_type_name: String, documents: Vec, document_create_transition: DocumentCreateTransitionAction, + nonce_counter: BTreeMap<(Identifier, Identifier), u64>, } fn setup_test(platform_state: &mut PlatformStateV0) -> TestData { @@ -295,14 +326,19 @@ mod test { }, }); + let mut nonce_counter = BTreeMap::new(); + let (documents, data_contract) = get_masternode_reward_shares_documents_fixture(1); let document_type = data_contract .document_type_for_name("rewardShare") .expect("expected the rewards document type"); - let document_transitions = get_document_transitions_fixture([( - DocumentTransitionActionType::Create, - vec![(documents[0].clone(), document_type, Bytes32::default())], - )]); + let document_transitions = get_document_transitions_fixture( + [( + DocumentTransitionActionType::Create, + vec![(documents[0].clone(), document_type, Bytes32::default())], + )], + &mut nonce_counter, + ); let document_create_transition = document_transitions[0] .as_transition_create() @@ -316,6 +352,7 @@ mod test { document_create_transition: DocumentCreateTransitionAction::from_document_create_transition_with_contract_lookup(document_create_transition, |_identifier| { Ok(Arc::new(DataContractFetchInfo::masternode_rewards_contract_fixture(platform_state.current_protocol_version_in_consensus))) }).expect("expected to create action"), + nonce_counter, } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs index add9218716..3e025af278 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs @@ -38,7 +38,12 @@ pub fn delete_withdrawal_data_trigger_v0( context: &DataTriggerExecutionContext<'_>, platform_version: &PlatformVersion, ) -> Result { - let data_contract_fetch_info = document_transition.base().data_contract_fetch_info(); + let data_contract_fetch_info = document_transition + .base() + .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( + "expecting action to have a base", + )))? + .data_contract_fetch_info(); let data_contract = &data_contract_fetch_info.contract; let mut result = DataTriggerExecutionResult::default(); @@ -46,7 +51,12 @@ pub fn delete_withdrawal_data_trigger_v0( return Err(Error::Execution(ExecutionError::DataTriggerExecutionError( format!( "the Document Transition {} isn't 'DELETE", - document_transition.base().id() + document_transition + .base() + .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( + "expecting action to have a base" + )))? + .id() ), ))); }; @@ -163,6 +173,7 @@ mod tests { let base_transition: DocumentBaseTransitionAction = DocumentBaseTransitionActionV0 { id: Default::default(), + identity_contract_nonce: 1, document_type_name: "".to_string(), data_contract: Arc::new(DataContractFetchInfo::dpns_contract_fixture(1)), } @@ -301,6 +312,7 @@ mod tests { DocumentDeleteTransitionAction::V0(DocumentDeleteTransitionActionV0 { base: DocumentBaseTransitionAction::V0(DocumentBaseTransitionActionV0 { id: document.id(), + identity_contract_nonce: 1, document_type_name: "withdrawal".to_string(), data_contract: Arc::new(DataContractFetchInfo::withdrawals_contract_fixture( platform_version.protocol_version, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/identity_contract_nonce/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/identity_contract_nonce/mod.rs new file mode 100644 index 0000000000..9a1925de7f --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/identity_contract_nonce/mod.rs @@ -0,0 +1 @@ +pub(crate) mod v0; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/identity_contract_nonce/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/identity_contract_nonce/v0/mod.rs new file mode 100644 index 0000000000..8b764a5d9f --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/identity_contract_nonce/v0/mod.rs @@ -0,0 +1,67 @@ +use crate::error::Error; +use dpp::block::block_info::BlockInfo; +use dpp::consensus::state::identity::invalid_identity_contract_nonce_error::InvalidIdentityNonceError; +use dpp::consensus::state::state_error::StateError; +use dpp::consensus::ConsensusError; +use dpp::identity::identity_nonce::{ + validate_identity_nonce_update, validate_new_identity_nonce, MergeIdentityNonceResult, + IDENTITY_NONCE_VALUE_FILTER, IDENTITY_NONCE_VALUE_FILTER_MAX_BYTES, + MISSING_IDENTITY_REVISIONS_FILTER, MISSING_IDENTITY_REVISIONS_MAX_BYTES, +}; +use dpp::state_transition::documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; +use dpp::state_transition::documents_batch_transition::document_transition::DocumentTransitionV0Methods; + +use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; +use dpp::state_transition::StateTransitionLike; + +use dpp::validation::SimpleConsensusValidationResult; + +use crate::platform_types::platform::PlatformStateRef; +use dpp::version::PlatformVersion; +use drive::grovedb::TransactionArg; + +pub(in crate::execution::validation::state_transition::state_transitions::documents_batch) trait DocumentsBatchStateTransitionIdentityContractNonceV0 +{ + fn validate_identity_contract_nonces_v0( + &self, + platform: &PlatformStateRef, + block_info: &BlockInfo, + tx: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result; +} + +impl DocumentsBatchStateTransitionIdentityContractNonceV0 for DocumentsBatchTransition { + fn validate_identity_contract_nonces_v0( + &self, + platform: &PlatformStateRef, + block_info: &BlockInfo, + tx: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result { + // We should validate that all newly created documents have valid ids + for transition in self.transitions() { + let revision_nonce = transition.identity_contract_nonce(); + let identity_id = self.owner_id(); + let (existing_nonce, fees) = platform.drive.fetch_identity_contract_nonce_with_fees( + identity_id.to_buffer(), + transition.data_contract_id().to_buffer(), + block_info, + true, + tx, + platform_version, + )?; + + let result = if let Some(existing_nonce) = existing_nonce { + validate_identity_nonce_update(existing_nonce, revision_nonce, identity_id) + } else { + validate_new_identity_nonce(revision_nonce, identity_id) + }; + if !result.is_valid() { + return Ok(result); + } + } + + Ok(SimpleConsensusValidationResult::new()) + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs index 379d2a995e..2866ef1adf 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs @@ -1,9 +1,11 @@ mod action_validation; -mod base_structure; +mod advanced_structure; mod data_triggers; +mod identity_contract_nonce; mod state; mod transformer; +use dpp::block::block_info::BlockInfo; use dpp::prelude::*; use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; use dpp::validation::SimpleConsensusValidationResult; @@ -19,11 +21,13 @@ use crate::execution::types::state_transition_execution_context::StateTransition use crate::platform_types::platform::{PlatformRef, PlatformStateRef}; use crate::rpc::core::CoreRPCLike; -use crate::execution::validation::state_transition::documents_batch::base_structure::v0::DocumentsBatchStateTransitionStructureValidationV0; +use crate::execution::validation::state_transition::documents_batch::advanced_structure::v0::DocumentsBatchStateTransitionStructureValidationV0; +use crate::execution::validation::state_transition::documents_batch::identity_contract_nonce::v0::DocumentsBatchStateTransitionIdentityContractNonceV0; use crate::execution::validation::state_transition::documents_batch::state::v0::DocumentsBatchStateTransitionStateValidationV0; use crate::execution::validation::state_transition::processor::v0::{ - StateTransitionStateValidationV0, StateTransitionStructureValidationV0, + StateTransitionBasicStructureValidationV0, StateTransitionNonceValidationV0, + StateTransitionStateValidationV0, StateTransitionStructureKnownInStateValidationV0, }; use crate::execution::validation::state_transition::transformer::StateTransitionActionTransformerV0; use crate::platform_types::platform_state::v0::PlatformStateV0Methods; @@ -55,20 +59,73 @@ impl StateTransitionActionTransformerV0 for DocumentsBatchTransition { } } -impl StateTransitionStructureValidationV0 for DocumentsBatchTransition { - fn validate_structure( +impl StateTransitionBasicStructureValidationV0 for DocumentsBatchTransition { + fn validate_basic_structure( + &self, + platform_version: &PlatformVersion, + ) -> Result { + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .documents_batch_state_transition + .basic_structure + { + 0 => self + .validate_base_structure(platform_version) + .map_err(Error::Protocol), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "documents batch transition: base structure".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} + +impl StateTransitionNonceValidationV0 for DocumentsBatchTransition { + fn validate_nonces( + &self, + platform: &PlatformStateRef, + block_info: &BlockInfo, + tx: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result { + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .documents_batch_state_transition + .revision + { + 0 => self.validate_identity_contract_nonces_v0( + platform, + block_info, + tx, + platform_version, + ), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "documents batch transition: revision".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} + +impl StateTransitionStructureKnownInStateValidationV0 for DocumentsBatchTransition { + fn validate_advanced_structure_from_state( &self, platform: &PlatformStateRef, action: Option<&StateTransitionAction>, - protocol_version: u32, + platform_version: &PlatformVersion, ) -> Result { - let platform_version = PlatformVersion::get(protocol_version)?; match platform_version .drive_abci .validation_and_processing .state_transitions .documents_batch_state_transition - .structure + .advanced_structure { 0 => { let action = @@ -82,7 +139,7 @@ impl StateTransitionStructureValidationV0 for DocumentsBatchTransition { "action must be a documents batch transition action", ))); }; - self.validate_structure_v0( + self.validate_advanced_structure_from_state_v0( platform, documents_batch_transition_action, platform_version, @@ -96,7 +153,7 @@ impl StateTransitionStructureValidationV0 for DocumentsBatchTransition { } } - fn requires_state_to_validate_structure(&self) -> bool { + fn requires_advance_structure_validation(&self) -> bool { true } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/data_triggers.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/data_triggers.rs index 32f99e179e..a49f3b754a 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/data_triggers.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/data_triggers.rs @@ -15,6 +15,12 @@ pub(super) fn execute_data_triggers( let data_trigger_bindings = data_trigger_bindings_list(platform_version)?; for document_transition_action in document_transition_actions { + if matches!( + document_transition_action, + DocumentTransitionAction::BumpIdentityDataContractNonce(_) + ) { + continue; + } let data_trigger_execution_result = document_transition_action .validate_with_data_triggers(&data_trigger_bindings, context, platform_version)?; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs index 066402e2c0..fba7c1cb58 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs @@ -1,5 +1,8 @@ +use dpp::consensus::ConsensusError; +use dpp::consensus::state::state_error::StateError; use dpp::prelude::ConsensusValidationResult; use dpp::state_transition::documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; +use dpp::state_transition::documents_batch_transition::document_transition::action_type::TransitionActionTypeGetter; use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; use dpp::state_transition::StateTransitionLike; use drive::state_transition_action::StateTransitionAction; @@ -7,12 +10,14 @@ use dpp::version::{DefaultForPlatformVersion, PlatformVersion}; use drive::grovedb::TransactionArg; use drive::state_transition_action::document::documents_batch::document_transition::DocumentTransitionAction; use drive::state_transition_action::document::documents_batch::DocumentsBatchTransitionAction; +use drive::state_transition_action::system::bump_identity_data_contract_nonce_action::BumpIdentityDataContractNonceAction; use crate::error::Error; +use crate::error::execution::ExecutionError; use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; use crate::execution::validation::state_transition::documents_batch::action_validation::document_create_transition_action::DocumentCreateTransitionActionValidation; use crate::execution::validation::state_transition::documents_batch::action_validation::document_delete_transition_action::DocumentDeleteTransitionActionValidation; use crate::execution::validation::state_transition::documents_batch::action_validation::document_replace_transition_action::DocumentReplaceTransitionActionValidation; -use crate::execution::validation::state_transition::documents_batch::data_triggers::DataTriggerExecutionContext; +use crate::execution::validation::state_transition::documents_batch::data_triggers::{data_trigger_bindings_list, DataTriggerExecutionContext, DataTriggerExecutor}; use crate::execution::validation::state_transition::documents_batch::state::v0::data_triggers::execute_data_triggers; use crate::platform_types::platform::{PlatformStateRef}; use crate::execution::validation::state_transition::state_transitions::documents_batch::transformer::v0::DocumentsBatchTransitionTransformerV0; @@ -41,7 +46,7 @@ pub(in crate::execution::validation::state_transition::state_transitions::docume impl DocumentsBatchStateTransitionStateValidationV0 for DocumentsBatchTransition { fn validate_state_v0( &self, - state_transition_action: DocumentsBatchTransitionAction, + mut state_transition_action: DocumentsBatchTransitionAction, platform: &PlatformStateRef, transaction: TransactionArg, platform_version: &PlatformVersion, @@ -53,40 +58,96 @@ impl DocumentsBatchStateTransitionStateValidationV0 for DocumentsBatchTransition let owner_id = state_transition_action.owner_id(); + let mut validated_transitions = vec![]; + + let data_trigger_bindings = if platform.config.execution.use_document_triggers { + data_trigger_bindings_list(platform_version)? + } else { + vec![] + }; + // Next we need to validate the structure of all actions (this means with the data contract) - for transition in state_transition_action.transitions() { - let transition_validation_result = match transition { + for transition in state_transition_action.transitions_take() { + let transition_validation_result = match &transition { DocumentTransitionAction::CreateAction(create_action) => create_action .validate_state(platform, owner_id, transaction, platform_version)?, DocumentTransitionAction::ReplaceAction(replace_action) => replace_action .validate_state(platform, owner_id, transaction, platform_version)?, DocumentTransitionAction::DeleteAction(delete_action) => delete_action .validate_state(platform, owner_id, transaction, platform_version)?, + DocumentTransitionAction::BumpIdentityDataContractNonce(..) => { + return Err(Error::Execution(ExecutionError::CorruptedCodeExecution( + "we should never start with a bump identity data contract nonce", + ))); + } }; if !transition_validation_result.is_valid() { + // If a state transition isn't valid we still need to bump the identity data contract nonce validation_result.add_errors(transition_validation_result.errors); + validated_transitions.push( + DocumentTransitionAction::BumpIdentityDataContractNonce( + BumpIdentityDataContractNonceAction::from_document_base_transition_action( + transition.base_owned().ok_or(Error::Execution( + ExecutionError::CorruptedCodeExecution( + "base should always exist on transition", + ), + ))?, + owner_id, + )?, + ), + ); + } else { + if platform.config.execution.use_document_triggers { + // we should also validate document triggers + let data_trigger_execution_context = DataTriggerExecutionContext { + platform, + transaction, + owner_id: &self.owner_id(), + state_transition_execution_context: &state_transition_execution_context, + }; + let data_trigger_execution_result = transition.validate_with_data_triggers( + &data_trigger_bindings, + &data_trigger_execution_context, + platform_version, + )?; - return Ok(validation_result); + if !data_trigger_execution_result.is_valid() { + tracing::debug!( + "{:?} state transition data trigger was not valid, errors are {:?}", + transition, + data_trigger_execution_result.errors, + ); + // If a state transition isn't valid because of data triggers we still need + // to bump the identity data contract nonce + let consensus_errors: Vec = data_trigger_execution_result + .errors + .into_iter() + .map(|e| ConsensusError::StateError(StateError::DataTriggerError(e))) + .collect(); + validation_result.add_errors(consensus_errors); + validated_transitions.push( + DocumentTransitionAction::BumpIdentityDataContractNonce( + BumpIdentityDataContractNonceAction::from_document_base_transition_action( + transition.base_owned().ok_or(Error::Execution( + ExecutionError::CorruptedCodeExecution( + "base should always exist on transition", + ), + ))?, + owner_id, + )?, + ), + ); + } else { + validated_transitions.push(transition); + } + } else { + validated_transitions.push(transition); + } } } - let data_trigger_execution_context = DataTriggerExecutionContext { - platform, - transaction, - owner_id: &self.owner_id(), - state_transition_execution_context: &state_transition_execution_context, - }; - - if platform.config.execution.use_document_triggers { - let data_triggers_validation_result = execute_data_triggers( - state_transition_action.transitions(), - &data_trigger_execution_context, - platform.state.current_platform_version()?, - )?; - - validation_result.add_errors_into(data_triggers_validation_result.errors); - } + state_transition_action.set_transitions(validated_transitions); validation_result.set_data(state_transition_action.into()); diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/identity_and_signatures/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/identity_and_signatures/v0/mod.rs index 3a524ce440..be5acc7827 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/identity_and_signatures/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/identity_and_signatures/v0/mod.rs @@ -6,7 +6,7 @@ use dpp::consensus::ConsensusError; use dpp::identity::state_transition::AssetLockProved; use crate::execution::types::execution_operation::signature_verification_operation::SignatureVerificationOperation; -use crate::execution::types::execution_operation::ExecutionOperation; +use crate::execution::types::execution_operation::ValidationOperation; use crate::execution::types::state_transition_execution_context::{ StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0, }; @@ -38,7 +38,7 @@ impl IdentityCreateStateTransitionIdentityAndSignaturesValidationV0 for Identity key.data().as_slice(), key.signature().as_slice(), )?; - execution_context.add_operation(ExecutionOperation::SignatureVerification( + execution_context.add_operation(ValidationOperation::SignatureVerification( SignatureVerificationOperation::new(key.key_type()), )); if !result.is_valid() { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/mod.rs index 3cc78530b0..d77902f007 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/mod.rs @@ -9,7 +9,8 @@ use crate::error::execution::ExecutionError; use crate::execution::validation::state_transition::identity_create::state::v0::IdentityCreateStateTransitionStateValidationV0; use crate::execution::validation::state_transition::identity_create::structure::v0::IdentityCreateStateTransitionStructureValidationV0; use crate::execution::validation::state_transition::processor::v0::{ - StateTransitionStateValidationV0, StateTransitionStructureValidationV0, + StateTransitionBasicStructureValidationV0, StateTransitionStateValidationV0, + StateTransitionStructureKnownInStateValidationV0, }; use crate::execution::validation::state_transition::transformer::StateTransitionActionTransformerV0; use crate::platform_types::platform::{PlatformRef, PlatformStateRef}; @@ -52,24 +53,21 @@ impl StateTransitionActionTransformerV0 for IdentityCreateTransition { } } -impl StateTransitionStructureValidationV0 for IdentityCreateTransition { - fn validate_structure( +impl StateTransitionBasicStructureValidationV0 for IdentityCreateTransition { + fn validate_basic_structure( &self, - _platform: &PlatformStateRef, - _action: Option<&StateTransitionAction>, - protocol_version: u32, + platform_version: &PlatformVersion, ) -> Result { - let platform_version = PlatformVersion::get(protocol_version)?; match platform_version .drive_abci .validation_and_processing .state_transitions .identity_create_state_transition - .structure + .base_structure { 0 => self.validate_base_structure_v0(platform_version), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { - method: "identity create transition: validate_structure".to_string(), + method: "identity create transition: validate_basic_structure".to_string(), known_versions: vec![0], received: version, })), diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/state/v0/mod.rs index b7e249c1f2..c8da55d588 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/state/v0/mod.rs @@ -24,7 +24,7 @@ use drive::state_transition_action::StateTransitionAction; use crate::error::execution::ExecutionError; use crate::execution::types::execution_operation::signature_verification_operation::SignatureVerificationOperation; -use crate::execution::types::execution_operation::ExecutionOperation; +use crate::execution::types::execution_operation::ValidationOperation; use crate::execution::types::state_transition_execution_context::{ StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0, }; @@ -148,8 +148,8 @@ impl IdentityCreateStateTransitionStateValidationV0 for IdentityCreateTransition )) })?; - execution_context.add_operation(ExecutionOperation::DoubleSha256); - execution_context.add_operation(ExecutionOperation::SignatureVerification( + execution_context.add_operation(ValidationOperation::DoubleSha256); + execution_context.add_operation(ValidationOperation::SignatureVerification( SignatureVerificationOperation::new(KeyType::ECDSA_HASH160), )); diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/balance/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/balance/mod.rs new file mode 100644 index 0000000000..6d4b28e950 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/balance/mod.rs @@ -0,0 +1,47 @@ +use crate::error::execution::ExecutionError; +use crate::error::Error; +use crate::execution::validation::state_transition::identity_credit_transfer::balance::v0::IdentityCreditTransferTransitionBalanceValidationV0; +use crate::execution::validation::state_transition::identity_credit_transfer::nonce::v0::IdentityCreditTransferTransitionIdentityNonceV0; +use crate::execution::validation::state_transition::processor::v0::{ + StateTransitionBalanceValidationV0, StateTransitionNonceValidationV0, +}; +use crate::platform_types::platform::PlatformStateRef; +use dpp::block::block_info::BlockInfo; +use dpp::identity::PartialIdentity; +use dpp::state_transition::identity_credit_transfer_transition::IdentityCreditTransferTransition; +use dpp::validation::SimpleConsensusValidationResult; +use dpp::version::PlatformVersion; +use drive::grovedb::TransactionArg; + +pub(crate) mod v0; +impl StateTransitionBalanceValidationV0 for IdentityCreditTransferTransition { + fn validate_balance( + &self, + identity: Option<&mut PartialIdentity>, + platform: &PlatformStateRef, + block_info: &BlockInfo, + tx: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result { + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .identity_credit_transfer_state_transition + .balance + { + Some(0) => { + self.validate_balance_v0(identity, platform, block_info, tx, platform_version) + } + Some(version) => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "identity credit transfer transition: validate_balance".to_string(), + known_versions: vec![0], + received: version, + })), + None => Err(Error::Execution(ExecutionError::VersionNotActive { + method: "identity credit transfer transition: validate_balance".to_string(), + known_versions: vec![0], + })), + } + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/balance/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/balance/v0/mod.rs new file mode 100644 index 0000000000..cc2490e61c --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/balance/v0/mod.rs @@ -0,0 +1,83 @@ +use crate::error::Error; +use dpp::balances::credits::MIN_LEFTOVER_CREDITS_BEFORE_PROCESSING; +use dpp::block::block_info::BlockInfo; +use dpp::consensus::signature::IdentityNotFoundError; +use dpp::consensus::state::identity::IdentityInsufficientBalanceError; +use dpp::identity::PartialIdentity; +use dpp::state_transition::identity_credit_transfer_transition::accessors::IdentityCreditTransferTransitionAccessorsV0; +use dpp::state_transition::identity_credit_transfer_transition::IdentityCreditTransferTransition; + +use dpp::validation::SimpleConsensusValidationResult; + +use crate::platform_types::platform::PlatformStateRef; +use dpp::version::PlatformVersion; +use drive::grovedb::TransactionArg; + +pub(in crate::execution::validation::state_transition::state_transitions) trait IdentityCreditTransferTransitionBalanceValidationV0 +{ + fn validate_balance_v0( + &self, + identity: Option<&mut PartialIdentity>, + platform: &PlatformStateRef, + block_info: &BlockInfo, + tx: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result; +} + +impl IdentityCreditTransferTransitionBalanceValidationV0 for IdentityCreditTransferTransition { + fn validate_balance_v0( + &self, + identity: Option<&mut PartialIdentity>, + platform: &PlatformStateRef, + block_info: &BlockInfo, + tx: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result { + let balance = if let Some(identity) = identity { + let balance = if let Some(balance) = identity.balance { + balance + } else { + let maybe_existing_identity_balance = platform.drive.fetch_identity_balance( + self.identity_id().to_buffer(), + tx, + platform_version, + )?; + + let Some(existing_identity_balance) = maybe_existing_identity_balance else { + return Ok(SimpleConsensusValidationResult::new_with_error( + IdentityNotFoundError::new(self.identity_id()).into(), + )); + }; + + identity.balance = Some(existing_identity_balance); + + existing_identity_balance + }; + balance + } else { + let maybe_existing_identity_balance = platform.drive.fetch_identity_balance( + self.identity_id().to_buffer(), + tx, + platform_version, + )?; + + let Some(existing_identity_balance) = maybe_existing_identity_balance else { + return Ok(SimpleConsensusValidationResult::new_with_error( + IdentityNotFoundError::new(self.identity_id()).into(), + )); + }; + + existing_identity_balance + }; + + if balance < self.amount() + MIN_LEFTOVER_CREDITS_BEFORE_PROCESSING { + return Ok(SimpleConsensusValidationResult::new_with_error( + IdentityInsufficientBalanceError::new(self.identity_id(), balance, self.amount()) + .into(), + )); + } + + Ok(SimpleConsensusValidationResult::new()) + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/mod.rs index 643c3ff738..23661be98c 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/mod.rs @@ -1,3 +1,5 @@ +mod balance; +mod nonce; mod state; mod structure; @@ -17,7 +19,8 @@ use crate::rpc::core::CoreRPCLike; use crate::execution::validation::state_transition::identity_credit_transfer::state::v0::IdentityCreditTransferStateTransitionStateValidationV0; use crate::execution::validation::state_transition::identity_credit_transfer::structure::v0::IdentityCreditTransferStateTransitionStructureValidationV0; use crate::execution::validation::state_transition::processor::v0::{ - StateTransitionStateValidationV0, StateTransitionStructureValidationV0, + StateTransitionBasicStructureValidationV0, StateTransitionStateValidationV0, + StateTransitionStructureKnownInStateValidationV0, }; use crate::execution::validation::state_transition::transformer::StateTransitionActionTransformerV0; use crate::platform_types::platform_state::v0::PlatformStateV0Methods; @@ -49,20 +52,17 @@ impl StateTransitionActionTransformerV0 for IdentityCreditTransferTransition { } } -impl StateTransitionStructureValidationV0 for IdentityCreditTransferTransition { - fn validate_structure( +impl StateTransitionBasicStructureValidationV0 for IdentityCreditTransferTransition { + fn validate_basic_structure( &self, - _platform: &PlatformStateRef, - _action: Option<&StateTransitionAction>, - protocol_version: u32, + platform_version: &PlatformVersion, ) -> Result { - let platform_version = PlatformVersion::get(protocol_version)?; match platform_version .drive_abci .validation_and_processing .state_transitions .identity_credit_transfer_state_transition - .structure + .base_structure { 0 => self.validate_base_structure_v0(), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/nonce/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/nonce/mod.rs new file mode 100644 index 0000000000..eecbddc5d4 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/nonce/mod.rs @@ -0,0 +1,40 @@ +use crate::error::execution::ExecutionError; +use crate::error::Error; +use crate::execution::validation::state_transition::identity_credit_transfer::nonce::v0::IdentityCreditTransferTransitionIdentityNonceV0; +use crate::execution::validation::state_transition::processor::v0::StateTransitionNonceValidationV0; +use crate::platform_types::platform::PlatformStateRef; +use dpp::block::block_info::BlockInfo; +use dpp::state_transition::identity_credit_transfer_transition::IdentityCreditTransferTransition; +use dpp::validation::SimpleConsensusValidationResult; +use dpp::version::PlatformVersion; +use drive::grovedb::TransactionArg; + +pub(crate) mod v0; +impl StateTransitionNonceValidationV0 for IdentityCreditTransferTransition { + fn validate_nonces( + &self, + platform: &PlatformStateRef, + block_info: &BlockInfo, + tx: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result { + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .identity_credit_transfer_state_transition + .nonce + { + Some(0) => self.validate_nonce_v0(platform, block_info, tx, platform_version), + Some(version) => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "identity credit transfer transition: validate_nonces".to_string(), + known_versions: vec![0], + received: version, + })), + None => Err(Error::Execution(ExecutionError::VersionNotActive { + method: "identity credit transfer transition: validate_nonces".to_string(), + known_versions: vec![0], + })), + } + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/nonce/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/nonce/v0/mod.rs new file mode 100644 index 0000000000..04fef9aa47 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/nonce/v0/mod.rs @@ -0,0 +1,50 @@ +use crate::error::Error; +use dpp::block::block_info::BlockInfo; +use dpp::identity::identity_nonce::{validate_identity_nonce_update, validate_new_identity_nonce}; +use dpp::state_transition::identity_credit_transfer_transition::accessors::IdentityCreditTransferTransitionAccessorsV0; +use dpp::state_transition::identity_credit_transfer_transition::IdentityCreditTransferTransition; + +use dpp::validation::SimpleConsensusValidationResult; + +use crate::platform_types::platform::PlatformStateRef; +use dpp::version::PlatformVersion; +use drive::grovedb::TransactionArg; + +pub(in crate::execution::validation::state_transition::state_transitions) trait IdentityCreditTransferTransitionIdentityNonceV0 +{ + fn validate_nonce_v0( + &self, + platform: &PlatformStateRef, + block_info: &BlockInfo, + tx: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result; +} + +impl IdentityCreditTransferTransitionIdentityNonceV0 for IdentityCreditTransferTransition { + fn validate_nonce_v0( + &self, + platform: &PlatformStateRef, + block_info: &BlockInfo, + tx: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result { + let revision_nonce = self.nonce(); + let identity_id = self.identity_id(); + let (existing_nonce, fees) = platform.drive.fetch_identity_nonce_with_fees( + identity_id.to_buffer(), + block_info, + true, + tx, + platform_version, + )?; + + let result = if let Some(existing_nonce) = existing_nonce { + validate_identity_nonce_update(existing_nonce, revision_nonce, identity_id) + } else { + validate_new_identity_nonce(revision_nonce, identity_id) + }; + + Ok(result) + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/state/v0/mod.rs index d2d0ae725c..60cc63c19c 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/state/v0/mod.rs @@ -4,9 +4,7 @@ use crate::rpc::core::CoreRPCLike; use dpp::consensus::signature::IdentityNotFoundError; -use dpp::consensus::state::identity::invalid_identity_revision_error::InvalidIdentityRevisionError; use dpp::consensus::state::identity::IdentityInsufficientBalanceError; -use dpp::consensus::state::state_error::StateError; use dpp::prelude::ConsensusValidationResult; use dpp::state_transition::identity_credit_transfer_transition::accessors::IdentityCreditTransferTransitionAccessorsV0; @@ -72,29 +70,6 @@ impl IdentityCreditTransferStateTransitionStateValidationV0 for IdentityCreditTr )); } - let Some(revision) = platform.drive.fetch_identity_revision( - self.identity_id().to_buffer(), - true, - tx, - platform_version, - )? - else { - return Ok(ConsensusValidationResult::new_with_error( - IdentityNotFoundError::new(self.identity_id()).into(), - )); - }; - - // Check revision - if revision + 1 != self.revision() { - return Ok(ConsensusValidationResult::new_with_error( - StateError::InvalidIdentityRevisionError(InvalidIdentityRevisionError::new( - self.identity_id(), - revision, - )) - .into(), - )); - } - self.transform_into_action_v0() } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/balance/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/balance/mod.rs new file mode 100644 index 0000000000..fc451fc666 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/balance/mod.rs @@ -0,0 +1,47 @@ +use crate::error::execution::ExecutionError; +use crate::error::Error; +use crate::execution::validation::state_transition::identity_credit_withdrawal::balance::v0::IdentityCreditTransferTransitionBalanceValidationV0; +use crate::execution::validation::state_transition::identity_credit_withdrawal::nonce::v0::IdentityCreditWithdrawalTransitionIdentityContractNonceV0; +use crate::execution::validation::state_transition::processor::v0::{ + StateTransitionBalanceValidationV0, StateTransitionNonceValidationV0, +}; +use crate::platform_types::platform::PlatformStateRef; +use dpp::block::block_info::BlockInfo; +use dpp::identity::PartialIdentity; +use dpp::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition; +use dpp::validation::SimpleConsensusValidationResult; +use dpp::version::PlatformVersion; +use drive::grovedb::TransactionArg; + +pub(crate) mod v0; +impl StateTransitionBalanceValidationV0 for IdentityCreditWithdrawalTransition { + fn validate_balance( + &self, + identity: Option<&mut PartialIdentity>, + platform: &PlatformStateRef, + block_info: &BlockInfo, + tx: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result { + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .identity_credit_withdrawal_state_transition + .balance + { + Some(0) => { + self.validate_balance_v0(identity, platform, block_info, tx, platform_version) + } + Some(version) => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "identity credit withdrawal transition: validate_balance".to_string(), + known_versions: vec![0], + received: version, + })), + None => Err(Error::Execution(ExecutionError::VersionNotActive { + method: "identity credit withdrawal transition: validate_balance".to_string(), + known_versions: vec![0], + })), + } + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/balance/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/balance/v0/mod.rs new file mode 100644 index 0000000000..6e97691e67 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/balance/v0/mod.rs @@ -0,0 +1,83 @@ +use crate::error::Error; +use dpp::balances::credits::MIN_LEFTOVER_CREDITS_BEFORE_PROCESSING; +use dpp::block::block_info::BlockInfo; +use dpp::consensus::signature::IdentityNotFoundError; +use dpp::consensus::state::identity::IdentityInsufficientBalanceError; +use dpp::identity::PartialIdentity; +use dpp::state_transition::identity_credit_withdrawal_transition::accessors::IdentityCreditWithdrawalTransitionAccessorsV0; +use dpp::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition; + +use dpp::validation::SimpleConsensusValidationResult; + +use crate::platform_types::platform::PlatformStateRef; +use dpp::version::PlatformVersion; +use drive::grovedb::TransactionArg; + +pub(in crate::execution::validation::state_transition::state_transitions) trait IdentityCreditTransferTransitionBalanceValidationV0 +{ + fn validate_balance_v0( + &self, + identity: Option<&mut PartialIdentity>, + platform: &PlatformStateRef, + block_info: &BlockInfo, + tx: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result; +} + +impl IdentityCreditTransferTransitionBalanceValidationV0 for IdentityCreditWithdrawalTransition { + fn validate_balance_v0( + &self, + identity: Option<&mut PartialIdentity>, + platform: &PlatformStateRef, + block_info: &BlockInfo, + tx: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result { + let balance = if let Some(identity) = identity { + let balance = if let Some(balance) = identity.balance { + balance + } else { + let maybe_existing_identity_balance = platform.drive.fetch_identity_balance( + self.identity_id().to_buffer(), + tx, + platform_version, + )?; + + let Some(existing_identity_balance) = maybe_existing_identity_balance else { + return Ok(SimpleConsensusValidationResult::new_with_error( + IdentityNotFoundError::new(self.identity_id()).into(), + )); + }; + + identity.balance = Some(existing_identity_balance); + + existing_identity_balance + }; + balance + } else { + let maybe_existing_identity_balance = platform.drive.fetch_identity_balance( + self.identity_id().to_buffer(), + tx, + platform_version, + )?; + + let Some(existing_identity_balance) = maybe_existing_identity_balance else { + return Ok(SimpleConsensusValidationResult::new_with_error( + IdentityNotFoundError::new(self.identity_id()).into(), + )); + }; + + existing_identity_balance + }; + + if balance < self.amount() + MIN_LEFTOVER_CREDITS_BEFORE_PROCESSING { + return Ok(SimpleConsensusValidationResult::new_with_error( + IdentityInsufficientBalanceError::new(self.identity_id(), balance, self.amount()) + .into(), + )); + } + + Ok(SimpleConsensusValidationResult::new()) + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs index 25f5b0a84d..08ab182ca9 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs @@ -1,3 +1,5 @@ +mod balance; +mod nonce; mod state; mod structure; @@ -18,7 +20,8 @@ use crate::execution::validation::state_transition::identity_credit_withdrawal:: use crate::execution::validation::state_transition::identity_credit_withdrawal::structure::v0::IdentityCreditWithdrawalStateTransitionStructureValidationV0; use crate::execution::validation::state_transition::processor::v0::{ - StateTransitionStateValidationV0, StateTransitionStructureValidationV0, + StateTransitionBasicStructureValidationV0, StateTransitionStateValidationV0, + StateTransitionStructureKnownInStateValidationV0, }; use crate::execution::validation::state_transition::transformer::StateTransitionActionTransformerV0; use crate::platform_types::platform_state::v0::PlatformStateV0Methods; @@ -50,24 +53,22 @@ impl StateTransitionActionTransformerV0 for IdentityCreditWithdrawalTransition { } } -impl StateTransitionStructureValidationV0 for IdentityCreditWithdrawalTransition { - fn validate_structure( +impl StateTransitionBasicStructureValidationV0 for IdentityCreditWithdrawalTransition { + fn validate_basic_structure( &self, - _platform: &PlatformStateRef, - _action: Option<&StateTransitionAction>, - protocol_version: u32, + platform_version: &PlatformVersion, ) -> Result { - let platform_version = PlatformVersion::get(protocol_version)?; match platform_version .drive_abci .validation_and_processing .state_transitions .identity_credit_withdrawal_state_transition - .structure + .base_structure { 0 => self.validate_base_structure_v0(), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { - method: "identity credit withdrawal transition: validate_structure".to_string(), + method: "identity credit withdrawal transition: validate_basic_structure" + .to_string(), known_versions: vec![0], received: version, })), diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/nonce/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/nonce/mod.rs new file mode 100644 index 0000000000..f8304182e2 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/nonce/mod.rs @@ -0,0 +1,40 @@ +use crate::error::execution::ExecutionError; +use crate::error::Error; +use crate::execution::validation::state_transition::identity_credit_withdrawal::nonce::v0::IdentityCreditWithdrawalTransitionIdentityContractNonceV0; +use crate::execution::validation::state_transition::processor::v0::StateTransitionNonceValidationV0; +use crate::platform_types::platform::PlatformStateRef; +use dpp::block::block_info::BlockInfo; +use dpp::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition; +use dpp::validation::SimpleConsensusValidationResult; +use dpp::version::PlatformVersion; +use drive::grovedb::TransactionArg; + +pub(crate) mod v0; +impl StateTransitionNonceValidationV0 for IdentityCreditWithdrawalTransition { + fn validate_nonces( + &self, + platform: &PlatformStateRef, + block_info: &BlockInfo, + tx: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result { + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .identity_credit_withdrawal_state_transition + .nonce + { + Some(0) => self.validate_nonce_v0(platform, block_info, tx, platform_version), + Some(version) => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "identity credit withdrawal transition: validate_nonces".to_string(), + known_versions: vec![0], + received: version, + })), + None => Err(Error::Execution(ExecutionError::VersionNotActive { + method: "identity credit withdrawal transition: validate_nonces".to_string(), + known_versions: vec![0], + })), + } + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/nonce/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/nonce/v0/mod.rs new file mode 100644 index 0000000000..e4ab5cbd40 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/nonce/v0/mod.rs @@ -0,0 +1,52 @@ +use crate::error::Error; +use dpp::block::block_info::BlockInfo; +use dpp::identity::identity_nonce::{validate_identity_nonce_update, validate_new_identity_nonce}; +use dpp::state_transition::identity_credit_withdrawal_transition::accessors::IdentityCreditWithdrawalTransitionAccessorsV0; +use dpp::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition; + +use dpp::validation::SimpleConsensusValidationResult; + +use crate::platform_types::platform::PlatformStateRef; +use dpp::version::PlatformVersion; +use drive::grovedb::TransactionArg; + +pub(in crate::execution::validation::state_transition::state_transitions) trait IdentityCreditWithdrawalTransitionIdentityContractNonceV0 +{ + fn validate_nonce_v0( + &self, + platform: &PlatformStateRef, + block_info: &BlockInfo, + tx: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result; +} + +impl IdentityCreditWithdrawalTransitionIdentityContractNonceV0 + for IdentityCreditWithdrawalTransition +{ + fn validate_nonce_v0( + &self, + platform: &PlatformStateRef, + block_info: &BlockInfo, + tx: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result { + let revision_nonce = self.nonce(); + let identity_id = self.identity_id(); + let (existing_nonce, fees) = platform.drive.fetch_identity_nonce_with_fees( + identity_id.to_buffer(), + block_info, + true, + tx, + platform_version, + )?; + + let result = if let Some(existing_nonce) = existing_nonce { + validate_identity_nonce_update(existing_nonce, revision_nonce, identity_id) + } else { + validate_new_identity_nonce(revision_nonce, identity_id) + }; + + Ok(result) + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/state/v0/mod.rs index aef587218e..cecf5edb3d 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/state/v0/mod.rs @@ -5,9 +5,7 @@ use crate::rpc::core::CoreRPCLike; use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use dpp::consensus::signature::IdentityNotFoundError; -use dpp::consensus::state::identity::invalid_identity_revision_error::InvalidIdentityRevisionError; use dpp::consensus::state::identity::IdentityInsufficientBalanceError; -use dpp::consensus::state::state_error::StateError; use dpp::prelude::ConsensusValidationResult; use dpp::state_transition::identity_credit_withdrawal_transition::accessors::IdentityCreditWithdrawalTransitionAccessorsV0; use dpp::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition; @@ -61,29 +59,6 @@ impl IdentityCreditWithdrawalStateTransitionStateValidationV0 )); } - let Some(revision) = platform.drive.fetch_identity_revision( - self.identity_id().to_buffer(), - true, - tx, - platform_version, - )? - else { - return Ok(ConsensusValidationResult::new_with_error( - IdentityNotFoundError::new(self.identity_id()).into(), - )); - }; - - // Check revision - if revision + 1 != self.revision() { - return Ok(ConsensusValidationResult::new_with_error( - StateError::InvalidIdentityRevisionError(InvalidIdentityRevisionError::new( - self.identity_id(), - revision, - )) - .into(), - )); - } - self.transform_into_action_v0(platform) } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/mod.rs index ad1ab33979..e4ea255968 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/mod.rs @@ -19,7 +19,8 @@ use crate::rpc::core::CoreRPCLike; use crate::execution::validation::state_transition::identity_top_up::state::v0::IdentityTopUpStateTransitionStateValidationV0; use crate::execution::validation::state_transition::identity_top_up::structure::v0::IdentityTopUpStateTransitionStructureValidationV0; use crate::execution::validation::state_transition::processor::v0::{ - StateTransitionStateValidationV0, StateTransitionStructureValidationV0, + StateTransitionBasicStructureValidationV0, StateTransitionStateValidationV0, + StateTransitionStructureKnownInStateValidationV0, }; use crate::execution::validation::state_transition::transformer::StateTransitionActionTransformerV0; @@ -52,24 +53,21 @@ impl StateTransitionActionTransformerV0 for IdentityTopUpTransition { } } -impl StateTransitionStructureValidationV0 for IdentityTopUpTransition { - fn validate_structure( +impl StateTransitionBasicStructureValidationV0 for IdentityTopUpTransition { + fn validate_basic_structure( &self, - _platform: &PlatformStateRef, - _action: Option<&StateTransitionAction>, - protocol_version: u32, + platform_version: &PlatformVersion, ) -> Result { - let platform_version = PlatformVersion::get(protocol_version)?; match platform_version .drive_abci .validation_and_processing .state_transitions .identity_top_up_state_transition - .structure + .base_structure { 0 => self.validate_base_structure_v0(platform_version), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { - method: "identity top up transition: validate_structure".to_string(), + method: "identity top up transition: validate_basic_structure".to_string(), known_versions: vec![0], received: version, })), diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/state/v0/mod.rs index 564ca18b08..b1fd68de7b 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/state/v0/mod.rs @@ -23,7 +23,7 @@ use drive::state_transition_action::StateTransitionAction; use crate::error::execution::ExecutionError; use drive::grovedb::TransactionArg; -use crate::execution::types::execution_operation::ExecutionOperation; +use crate::execution::types::execution_operation::ValidationOperation; use crate::execution::types::execution_operation::signature_verification_operation::SignatureVerificationOperation; use crate::execution::types::state_transition_execution_context::{StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0}; use crate::execution::validation::state_transition::common::asset_lock::proof::validate::AssetLockProofValidation; @@ -111,8 +111,8 @@ impl IdentityTopUpStateTransitionStateValidationV0 for IdentityTopUpTransition { )) })?; - execution_context.add_operation(ExecutionOperation::DoubleSha256); - execution_context.add_operation(ExecutionOperation::SignatureVerification( + execution_context.add_operation(ValidationOperation::DoubleSha256); + execution_context.add_operation(ValidationOperation::SignatureVerification( SignatureVerificationOperation::new(KeyType::ECDSA_HASH160), )); diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/identity_and_signatures/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/identity_and_signatures/v0/mod.rs index 60bbc50f08..f91ad92ab0 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/identity_and_signatures/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/identity_and_signatures/v0/mod.rs @@ -7,7 +7,7 @@ use dpp::consensus::state::state_error::StateError; use dpp::identity::PartialIdentity; use crate::execution::types::execution_operation::signature_verification_operation::SignatureVerificationOperation; -use crate::execution::types::execution_operation::ExecutionOperation; +use crate::execution::types::execution_operation::ValidationOperation; use crate::execution::types::state_transition_execution_context::{ StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0, }; @@ -42,7 +42,7 @@ impl IdentityUpdateStateTransitionIdentityAndSignaturesValidationV0 for Identity key.data().as_slice(), key.signature().as_slice(), )?; - execution_context.add_operation(ExecutionOperation::SignatureVerification( + execution_context.add_operation(ValidationOperation::SignatureVerification( SignatureVerificationOperation::new(key.key_type()), )); if !validation_result.is_valid() { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/mod.rs index bed0a1f2fd..2f1d062a37 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/mod.rs @@ -1,4 +1,5 @@ pub(crate) mod identity_and_signatures; +mod nonce; mod state; mod structure; @@ -19,7 +20,8 @@ use crate::rpc::core::CoreRPCLike; use crate::execution::validation::state_transition::identity_update::state::v0::IdentityUpdateStateTransitionStateValidationV0; use crate::execution::validation::state_transition::identity_update::structure::v0::IdentityUpdateStateTransitionStructureValidationV0; use crate::execution::validation::state_transition::processor::v0::{ - StateTransitionStateValidationV0, StateTransitionStructureValidationV0, + StateTransitionBasicStructureValidationV0, StateTransitionStateValidationV0, + StateTransitionStructureKnownInStateValidationV0, }; use crate::execution::validation::state_transition::transformer::StateTransitionActionTransformerV0; @@ -52,24 +54,21 @@ impl StateTransitionActionTransformerV0 for IdentityUpdateTransition { } } -impl StateTransitionStructureValidationV0 for IdentityUpdateTransition { - fn validate_structure( +impl StateTransitionBasicStructureValidationV0 for IdentityUpdateTransition { + fn validate_basic_structure( &self, - _platform: &PlatformStateRef, - _action: Option<&StateTransitionAction>, - protocol_version: u32, + platform_version: &PlatformVersion, ) -> Result { - let platform_version = PlatformVersion::get(protocol_version)?; match platform_version .drive_abci .validation_and_processing .state_transitions .identity_update_state_transition - .structure + .base_structure { 0 => self.validate_base_structure_v0(platform_version), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { - method: "identity update transition: validate_structure".to_string(), + method: "identity update transition: validate_basic_structure".to_string(), known_versions: vec![0], received: version, })), diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/nonce/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/nonce/mod.rs new file mode 100644 index 0000000000..e6898f1cfa --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/nonce/mod.rs @@ -0,0 +1,40 @@ +use crate::error::execution::ExecutionError; +use crate::error::Error; +use crate::execution::validation::state_transition::identity_update::nonce::v0::IdentityUpdateTransitionIdentityContractNonceV0; +use crate::execution::validation::state_transition::processor::v0::StateTransitionNonceValidationV0; +use crate::platform_types::platform::PlatformStateRef; +use dpp::block::block_info::BlockInfo; +use dpp::state_transition::identity_update_transition::IdentityUpdateTransition; +use dpp::validation::SimpleConsensusValidationResult; +use dpp::version::PlatformVersion; +use drive::grovedb::TransactionArg; + +pub(crate) mod v0; +impl StateTransitionNonceValidationV0 for IdentityUpdateTransition { + fn validate_nonces( + &self, + platform: &PlatformStateRef, + block_info: &BlockInfo, + tx: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result { + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .identity_update_state_transition + .nonce + { + Some(0) => self.validate_nonce_v0(platform, block_info, tx, platform_version), + Some(version) => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "identity update transition: validate_nonces".to_string(), + known_versions: vec![0], + received: version, + })), + None => Err(Error::Execution(ExecutionError::VersionNotActive { + method: "identity update transition: validate_nonces".to_string(), + known_versions: vec![0], + })), + } + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/nonce/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/nonce/v0/mod.rs new file mode 100644 index 0000000000..b01e7f8217 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/nonce/v0/mod.rs @@ -0,0 +1,50 @@ +use crate::error::Error; +use dpp::block::block_info::BlockInfo; +use dpp::identity::identity_nonce::{validate_identity_nonce_update, validate_new_identity_nonce}; +use dpp::state_transition::identity_update_transition::accessors::IdentityUpdateTransitionAccessorsV0; +use dpp::state_transition::identity_update_transition::IdentityUpdateTransition; + +use dpp::validation::SimpleConsensusValidationResult; + +use crate::platform_types::platform::PlatformStateRef; +use dpp::version::PlatformVersion; +use drive::grovedb::TransactionArg; + +pub(in crate::execution::validation::state_transition::state_transitions) trait IdentityUpdateTransitionIdentityContractNonceV0 +{ + fn validate_nonce_v0( + &self, + platform: &PlatformStateRef, + block_info: &BlockInfo, + tx: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result; +} + +impl IdentityUpdateTransitionIdentityContractNonceV0 for IdentityUpdateTransition { + fn validate_nonce_v0( + &self, + platform: &PlatformStateRef, + block_info: &BlockInfo, + tx: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result { + let revision_nonce = self.nonce(); + let identity_id = self.identity_id(); + let (existing_nonce, fees) = platform.drive.fetch_identity_nonce_with_fees( + identity_id.to_buffer(), + block_info, + true, + tx, + platform_version, + )?; + + let result = if let Some(existing_nonce) = existing_nonce { + validate_identity_nonce_update(existing_nonce, revision_nonce, identity_id) + } else { + validate_new_identity_nonce(revision_nonce, identity_id) + }; + + Ok(result) + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/state/v0/mod.rs index 828635abb0..41b6a6c94a 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/state/v0/mod.rs @@ -19,6 +19,7 @@ use drive::state_transition_action::StateTransitionAction; use drive::grovedb::TransactionArg; use dpp::version::DefaultForPlatformVersion; +use drive::state_transition_action::system::bump_identity_nonce_action::BumpIdentityNonceAction; use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; use crate::execution::validation::state_transition::common::validate_identity_public_key_contract_bounds::validate_identity_public_keys_contract_bounds; use crate::execution::validation::state_transition::common::validate_identity_public_key_ids_dont_exist_in_state::validate_identity_public_key_ids_dont_exist_in_state; @@ -65,7 +66,14 @@ impl IdentityUpdateStateTransitionStateValidationV0 for IdentityUpdateTransition ); if !validation_result.is_valid() { - return Ok(validation_result); + let bump_action = StateTransitionAction::BumpIdentityNonceAction( + BumpIdentityNonceAction::from_borrowed_identity_update_transition(self)?, + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + validation_result.errors, + )); } validation_result.add_errors( @@ -81,7 +89,14 @@ impl IdentityUpdateStateTransitionStateValidationV0 for IdentityUpdateTransition ); if !validation_result.is_valid() { - return Ok(validation_result); + let bump_action = StateTransitionAction::BumpIdentityNonceAction( + BumpIdentityNonceAction::from_borrowed_identity_update_transition(self)?, + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + validation_result.errors, + )); } // Now we should check to make sure any keys that are added are valid for the contract @@ -99,7 +114,14 @@ impl IdentityUpdateStateTransitionStateValidationV0 for IdentityUpdateTransition ); if !validation_result.is_valid() { - return Ok(validation_result); + let bump_action = StateTransitionAction::BumpIdentityNonceAction( + BumpIdentityNonceAction::from_borrowed_identity_update_transition(self)?, + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + validation_result.errors, + )); } if !self.public_key_ids_to_disable().is_empty() { @@ -117,7 +139,14 @@ impl IdentityUpdateStateTransitionStateValidationV0 for IdentityUpdateTransition ); if !validation_result.is_valid() { - return Ok(validation_result); + let bump_action = StateTransitionAction::BumpIdentityNonceAction( + BumpIdentityNonceAction::from_borrowed_identity_update_transition(self)?, + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + validation_result.errors, + )); } if let Some(disabled_at_ms) = self.public_keys_disabled_at() { @@ -149,7 +178,14 @@ impl IdentityUpdateStateTransitionStateValidationV0 for IdentityUpdateTransition ), ), ); - return Ok(validation_result); + let bump_action = StateTransitionAction::BumpIdentityNonceAction( + BumpIdentityNonceAction::from_borrowed_identity_update_transition(self)?, + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + validation_result.errors, + )); } } } diff --git a/packages/rs-drive-abci/src/mimic/mod.rs b/packages/rs-drive-abci/src/mimic/mod.rs index 05780e1dbf..2636b5bc8b 100644 --- a/packages/rs-drive-abci/src/mimic/mod.rs +++ b/packages/rs-drive-abci/src/mimic/mod.rs @@ -2,7 +2,6 @@ use crate::abci::server::AbciApplication; use crate::abci::AbciError; use crate::error::execution::ExecutionError; use crate::error::Error; - use crate::execution::types::block_execution_context::v0::BlockExecutionContextV0Getters; use crate::execution::types::block_state_info::v0::BlockStateInfoV0Getters; use crate::mimic::test_quorum::TestQuorumInfo; diff --git a/packages/rs-drive-abci/src/platform_types/state_transitions_processing_result/mod.rs b/packages/rs-drive-abci/src/platform_types/state_transitions_processing_result/mod.rs index 0e07ae1d8b..da46dff56c 100644 --- a/packages/rs-drive-abci/src/platform_types/state_transitions_processing_result/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/state_transitions_processing_result/mod.rs @@ -8,12 +8,14 @@ use dpp::fee::fee_result::FeeResult; /// There are four possible outcomes of the state transition execution described by this enum #[derive(Debug, Clone)] pub enum StateTransitionExecutionResult { - // TODO: Error should also have fees /// State Transition is invalid, but we have a proved identity associated with it, /// and we can deduct processing fees calculated until this validation error happened - PaidConsensusError(ConsensusError), - /// State Transition is invalid, but we don't have a proved identity associated with it - /// so we can't deduct balance. + PaidConsensusError(ConsensusError, FeeResult), + /// State Transition is invalid, and is not paid for because we either : + /// * don't have a proved identity associated with it so we can't deduct balance. + /// * the state transition revision causes this transaction to not be valid + /// These state transitions can appear in prepare proposal but must never appear in process + /// proposal. UnpaidConsensusError(ConsensusError), /// State Transition execution failed due to the internal drive-abci error DriveAbciError(String), @@ -41,8 +43,9 @@ impl StateTransitionsProcessingResult { StateTransitionExecutionResult::DriveAbciError(_) => { self.failed_count += 1; } - StateTransitionExecutionResult::PaidConsensusError(_) => { + StateTransitionExecutionResult::PaidConsensusError(_, actual_fees) => { self.invalid_paid_count += 1; + self.fees.checked_add_assign(actual_fees.clone())?; } StateTransitionExecutionResult::UnpaidConsensusError(_) => { self.invalid_unpaid_count += 1; diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identity_contract_nonce/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identity_contract_nonce/mod.rs new file mode 100644 index 0000000000..329f2e8410 --- /dev/null +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identity_contract_nonce/mod.rs @@ -0,0 +1,66 @@ +use crate::error::query::QueryError; +use crate::error::Error; +use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; +use crate::query::QueryValidationResult; +use dapi_grpc::platform::v0::get_identity_contract_nonce_request::Version; +use dapi_grpc::platform::v0::GetIdentityContractNonceRequest; +use dapi_grpc::Message; +use dpp::check_validation_result_with_data; +use dpp::validation::ValidationResult; +use dpp::version::PlatformVersion; + +mod v0; + +impl Platform { + /// Querying of an identity by a public key hash + pub(in crate::query) fn query_identity_contract_nonce( + &self, + state: &PlatformState, + query_data: &[u8], + platform_version: &PlatformVersion, + ) -> Result>, Error> { + let GetIdentityContractNonceRequest { version } = + check_validation_result_with_data!(GetIdentityContractNonceRequest::decode(query_data) + .map_err(|e| { + QueryError::InvalidArgument(format!("invalid query proto message: {}", e)) + })); + + let Some(version) = version else { + return Ok(QueryValidationResult::new_with_error( + QueryError::DecodingError( + "could not decode identity contract nonce query".to_string(), + ), + )); + }; + + let feature_version_bounds = &platform_version + .drive_abci + .query + .identity_based_queries + .identity_contract_nonce; + + let feature_version = match &version { + Version::V0(_) => 0, + }; + if !feature_version_bounds.check_version(feature_version) { + return Ok(QueryValidationResult::new_with_error( + QueryError::UnsupportedQueryVersion( + "identity_contract_nonce".to_string(), + feature_version_bounds.min_version, + feature_version_bounds.max_version, + platform_version.protocol_version, + feature_version, + ), + )); + } + match version { + Version::V0(get_identity_contract_nonce_request) => self + .query_identity_contract_nonce_v0( + state, + get_identity_contract_nonce_request, + platform_version, + ), + } + } +} diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identity_contract_nonce/v0/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identity_contract_nonce/v0/mod.rs new file mode 100644 index 0000000000..a2276d52e5 --- /dev/null +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identity_contract_nonce/v0/mod.rs @@ -0,0 +1,86 @@ +use crate::error::query::QueryError; +use crate::error::Error; +use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::v0::PlatformStateV0Methods; +use crate::platform_types::platform_state::PlatformState; +use crate::query::QueryValidationResult; +use dapi_grpc::platform::v0::get_identity_contract_nonce_request::GetIdentityContractNonceRequestV0; +use dapi_grpc::platform::v0::get_identity_contract_nonce_response::GetIdentityContractNonceResponseV0; +use dapi_grpc::platform::v0::{ + get_identity_contract_nonce_response, GetIdentityContractNonceResponse, Proof, +}; +use dapi_grpc::Message; +use dpp::check_validation_result_with_data; +use dpp::platform_value::Identifier; +use dpp::serialization::PlatformSerializable; +use dpp::validation::ValidationResult; +use dpp::version::PlatformVersion; + +impl Platform { + pub(super) fn query_identity_contract_nonce_v0( + &self, + state: &PlatformState, + request: GetIdentityContractNonceRequestV0, + platform_version: &PlatformVersion, + ) -> Result>, Error> { + let metadata = self.response_metadata_v0(state); + let quorum_type = self.config.validator_set_quorum_type() as u32; + let GetIdentityContractNonceRequestV0 { + identity_id, + contract_id, + prove, + } = request; + let identity_id = check_validation_result_with_data!(Identifier::from_vec(identity_id) + .map(|bytes| bytes.0) + .map_err(|_| QueryError::InvalidArgument( + "identity id must be 32 bytes long".to_string() + ))); + let contract_id = check_validation_result_with_data!(Identifier::from_vec(contract_id) + .map(|bytes| bytes.0) + .map_err(|_| QueryError::InvalidArgument( + "contract id must be 32 bytes long".to_string() + ))); + let response_data = if prove { + let proof = self.drive.prove_identity_contract_nonce( + identity_id.0, + contract_id.0, + None, + &platform_version.drive, + )?; + + GetIdentityContractNonceResponse { + version: Some(get_identity_contract_nonce_response::Version::V0(GetIdentityContractNonceResponseV0 { + result: Some(get_identity_contract_nonce_response::get_identity_contract_nonce_response_v0::Result::Proof(Proof { + grovedb_proof: proof, + quorum_hash: state.last_committed_quorum_hash().to_vec(), + quorum_type, + block_id_hash: state.last_committed_block_id_hash().to_vec(), + signature: state.last_committed_block_signature().to_vec(), + round: state.last_committed_block_round(), + })), + metadata: Some(metadata), + })), + }.encode_to_vec() + } else { + let maybe_identity = self.drive.fetch_identity_contract_nonce( + identity_id.0, + contract_id.0, + true, + None, + platform_version, + )?; + + // default here is 0; + let identity_contract_nonce = maybe_identity.unwrap_or_default(); + + GetIdentityContractNonceResponse { + version: Some(get_identity_contract_nonce_response::Version::V0(GetIdentityContractNonceResponseV0 { + metadata: Some(metadata), + result: Some(get_identity_contract_nonce_response::get_identity_contract_nonce_response_v0::Result::IdentityContractNonce(identity_contract_nonce)), + })), + } + .encode_to_vec() + }; + Ok(QueryValidationResult::new_with_data(response_data)) + } +} diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identity_nonce/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identity_nonce/mod.rs new file mode 100644 index 0000000000..97a85e20f7 --- /dev/null +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identity_nonce/mod.rs @@ -0,0 +1,61 @@ +use crate::error::query::QueryError; +use crate::error::Error; +use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; +use crate::query::QueryValidationResult; +use dapi_grpc::platform::v0::get_identity_nonce_request::Version; +use dapi_grpc::platform::v0::GetIdentityNonceRequest; +use dapi_grpc::Message; +use dpp::check_validation_result_with_data; +use dpp::validation::ValidationResult; +use dpp::version::PlatformVersion; + +mod v0; + +impl Platform { + /// Querying of an identity by the nonce + pub(in crate::query) fn query_identity_nonce( + &self, + state: &PlatformState, + query_data: &[u8], + platform_version: &PlatformVersion, + ) -> Result>, Error> { + let GetIdentityNonceRequest { version } = + check_validation_result_with_data!(GetIdentityNonceRequest::decode(query_data) + .map_err(|e| { + QueryError::InvalidArgument(format!("invalid query proto message: {}", e)) + })); + + let Some(version) = version else { + return Ok(QueryValidationResult::new_with_error( + QueryError::DecodingError("could not decode identity nonce query".to_string()), + )); + }; + + let feature_version_bounds = &platform_version + .drive_abci + .query + .identity_based_queries + .identity_nonce; + + let feature_version = match &version { + Version::V0(_) => 0, + }; + if !feature_version_bounds.check_version(feature_version) { + return Ok(QueryValidationResult::new_with_error( + QueryError::UnsupportedQueryVersion( + "identity_nonce".to_string(), + feature_version_bounds.min_version, + feature_version_bounds.max_version, + platform_version.protocol_version, + feature_version, + ), + )); + } + match version { + Version::V0(get_identity_nonce_request) => { + self.query_identity_nonce_v0(state, get_identity_nonce_request, platform_version) + } + } + } +} diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identity_nonce/v0/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identity_nonce/v0/mod.rs new file mode 100644 index 0000000000..32faedea69 --- /dev/null +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identity_nonce/v0/mod.rs @@ -0,0 +1,68 @@ +use crate::error::query::QueryError; +use crate::error::Error; +use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::v0::PlatformStateV0Methods; +use crate::platform_types::platform_state::PlatformState; +use crate::query::QueryValidationResult; +use dapi_grpc::platform::v0::get_identity_nonce_request::GetIdentityNonceRequestV0; +use dapi_grpc::platform::v0::get_identity_nonce_response::GetIdentityNonceResponseV0; +use dapi_grpc::platform::v0::{get_identity_nonce_response, GetIdentityNonceResponse, Proof}; +use dapi_grpc::Message; +use dpp::check_validation_result_with_data; +use dpp::platform_value::Identifier; +use dpp::serialization::PlatformSerializable; +use dpp::validation::ValidationResult; +use dpp::version::PlatformVersion; + +impl Platform { + pub(super) fn query_identity_nonce_v0( + &self, + state: &PlatformState, + request: GetIdentityNonceRequestV0, + platform_version: &PlatformVersion, + ) -> Result>, Error> { + let metadata = self.response_metadata_v0(state); + let quorum_type = self.config.validator_set_quorum_type() as u32; + let GetIdentityNonceRequestV0 { identity_id, prove } = request; + let identity_id = check_validation_result_with_data!(Identifier::from_vec(identity_id) + .map(|bytes| bytes.0) + .map_err(|_| QueryError::InvalidArgument( + "identity id must be 32 bytes long".to_string() + ))); + let response_data = if prove { + let proof = self + .drive + .prove_identity_nonce(identity_id.0, None, platform_version)?; + + GetIdentityNonceResponse { + version: Some(get_identity_nonce_response::Version::V0(GetIdentityNonceResponseV0 { + result: Some(get_identity_nonce_response::get_identity_nonce_response_v0::Result::Proof(Proof { + grovedb_proof: proof, + quorum_hash: state.last_committed_quorum_hash().to_vec(), + quorum_type, + block_id_hash: state.last_committed_block_id_hash().to_vec(), + signature: state.last_committed_block_signature().to_vec(), + round: state.last_committed_block_round(), + })), + metadata: Some(metadata), + })), + }.encode_to_vec() + } else { + let maybe_identity = + self.drive + .fetch_identity_nonce(identity_id.0, true, None, platform_version)?; + + // default here is 0; + let identity_nonce = maybe_identity.unwrap_or_default(); + + GetIdentityNonceResponse { + version: Some(get_identity_nonce_response::Version::V0(GetIdentityNonceResponseV0 { + metadata: Some(metadata), + result: Some(get_identity_nonce_response::get_identity_nonce_response_v0::Result::IdentityNonce(identity_nonce)), + })), + } + .encode_to_vec() + }; + Ok(QueryValidationResult::new_with_data(response_data)) + } +} diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/mod.rs index e636cc4e59..dda33e20e5 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/mod.rs @@ -4,4 +4,6 @@ mod identities; mod identities_by_public_key_hashes; mod identity; mod identity_by_public_key_hash; +mod identity_contract_nonce; +mod identity_nonce; mod keys; diff --git a/packages/rs-drive-abci/src/query/mod.rs b/packages/rs-drive-abci/src/query/mod.rs index 60ad703ed6..ff6eed94d7 100644 --- a/packages/rs-drive-abci/src/query/mod.rs +++ b/packages/rs-drive-abci/src/query/mod.rs @@ -456,6 +456,753 @@ mod tests { } } + mod identity_nonce { + use crate::error::query::QueryError; + + use dapi_grpc::platform::v0::get_identity_nonce_request::{ + GetIdentityNonceRequestV0, Version, + }; + use dapi_grpc::platform::v0::get_identity_nonce_response::get_identity_nonce_response_v0; + use dapi_grpc::platform::v0::{ + get_identity_nonce_response, GetIdentityNonceRequest, GetIdentityNonceResponse, + }; + use dapi_grpc::Message; + use dpp::block::block_info::BlockInfo; + use dpp::data_contract::document_type::random_document::CreateRandomDocument; + use dpp::identity::accessors::IdentityGettersV0; + use dpp::identity::identity_nonce::{ + IDENTITY_NONCE_VALUE_FILTER, IDENTITY_NONCE_VALUE_FILTER_MAX_BYTES, + }; + use drive::common::identities::create_test_identity_with_rng; + use rand::prelude::StdRng; + use rand::{Rng, SeedableRng}; + + const QUERY_PATH: &str = "/identity/nonce"; + + #[test] + fn test_invalid_identity_id() { + let (platform, version) = super::setup_platform(); + + let request = GetIdentityNonceRequest { + version: Some(Version::V0(GetIdentityNonceRequestV0 { + identity_id: vec![0; 8], + prove: false, + })), + } + .encode_to_vec(); + + let result = platform.query(QUERY_PATH, &request, version); + assert!(result.is_ok()); + let validation_error = result.as_ref().unwrap().first_error().unwrap(); + + assert!(matches!( + validation_error, + QueryError::InvalidArgument(msg) if msg.contains("identity id must be 32 bytes long"))); + } + + #[test] + fn test_identity_not_found_when_querying_identity_nonce() { + let (platform, version) = super::setup_platform(); + + let request = GetIdentityNonceRequest { + version: Some(Version::V0(GetIdentityNonceRequestV0 { + identity_id: vec![0; 32], + prove: false, + })), + } + .encode_to_vec(); + + let validation_result = platform + .query(QUERY_PATH, &request, version) + .expect("expected query to succeed"); + + assert!(validation_result.first_error().is_none()); + + let response_data = validation_result.into_data().expect("expected data"); + + let GetIdentityNonceResponse { version } = + GetIdentityNonceResponse::decode(response_data.as_slice()) + .expect("expected to decode the response"); + + let v0 = match version.unwrap() { + get_identity_nonce_response::Version::V0(v0) => v0, + }; + + let nonce = match v0.result.unwrap() { + get_identity_nonce_response_v0::Result::IdentityNonce(nonce) => nonce, + get_identity_nonce_response_v0::Result::Proof(_) => { + panic!("expected non proved") + } + }; + + assert_eq!(nonce, 0); + } + + #[test] + fn test_identity_is_found_when_querying_identity_nonce() { + let (platform, version) = super::setup_platform(); + let mut rng = StdRng::seed_from_u64(10); + let id = rng.gen::<[u8; 32]>(); + let identity = + create_test_identity_with_rng(&platform.drive, id, &mut rng, None, version) + .expect("expected to create a test identity"); + + let request = GetIdentityNonceRequest { + version: Some(Version::V0(GetIdentityNonceRequestV0 { + identity_id: id.to_vec(), + prove: false, + })), + } + .encode_to_vec(); + + let validation_result = platform + .query(QUERY_PATH, &request, version) + .expect("expected query to succeed"); + + assert!(validation_result.first_error().is_none()); + + let response_data = validation_result.into_data().expect("expected data"); + + let GetIdentityNonceResponse { version } = + GetIdentityNonceResponse::decode(response_data.as_slice()) + .expect("expected to decode the response"); + + let v0 = match version.unwrap() { + get_identity_nonce_response::Version::V0(v0) => v0, + }; + + let nonce = match v0.result.unwrap() { + get_identity_nonce_response_v0::Result::IdentityNonce(nonce) => nonce, + get_identity_nonce_response_v0::Result::Proof(_) => { + panic!("expected non proved") + } + }; + + assert_eq!(nonce, 0); + } + + #[test] + fn test_identity_is_found_when_querying_identity_nonce_after_update() { + let (platform, version) = super::setup_platform(); + let mut rng = StdRng::seed_from_u64(10); + let id = rng.gen::<[u8; 32]>(); + let identity = + create_test_identity_with_rng(&platform.drive, id, &mut rng, None, version) + .expect("expected to create a test identity"); + + let cache = platform.drive.cache.read().unwrap(); + + let dashpay = &cache.system_data_contracts.dashpay; + + platform + .drive + .merge_identity_nonce( + identity.id().to_buffer(), + 1, + &BlockInfo::default(), + true, + None, + version, + ) + .expect("expected to set nonce"); + + platform + .drive + .merge_identity_nonce( + identity.id().to_buffer(), + 3, + &BlockInfo::default(), + true, + None, + version, + ) + .expect("expected to set nonce"); + + let request = GetIdentityNonceRequest { + version: Some(Version::V0(GetIdentityNonceRequestV0 { + identity_id: id.to_vec(), + prove: false, + })), + } + .encode_to_vec(); + + let validation_result = platform + .query(QUERY_PATH, &request, version) + .expect("expected query to succeed"); + + assert!(validation_result.first_error().is_none()); + + let response_data = validation_result.into_data().expect("expected data"); + + let GetIdentityNonceResponse { version } = + GetIdentityNonceResponse::decode(response_data.as_slice()) + .expect("expected to decode the response"); + + let v0 = match version.unwrap() { + get_identity_nonce_response::Version::V0(v0) => v0, + }; + + let nonce = match v0.result.unwrap() { + get_identity_nonce_response_v0::Result::IdentityNonce(nonce) => nonce, + get_identity_nonce_response_v0::Result::Proof(_) => { + panic!("expected non proved") + } + }; + + assert_eq!(nonce & IDENTITY_NONCE_VALUE_FILTER, 3); + assert_eq!(nonce >> IDENTITY_NONCE_VALUE_FILTER_MAX_BYTES, 1); + // the previous last one was not there + } + + #[test] + fn test_identity_is_found_when_querying_identity_nonce_after_update_for_past() { + let (platform, version) = super::setup_platform(); + let mut rng = StdRng::seed_from_u64(10); + let id = rng.gen::<[u8; 32]>(); + let identity = + create_test_identity_with_rng(&platform.drive, id, &mut rng, None, version) + .expect("expected to create a test identity"); + + platform + .drive + .merge_identity_nonce( + identity.id().to_buffer(), + 1, + &BlockInfo::default(), + true, + None, + version, + ) + .expect("expected to set nonce"); + + platform + .drive + .merge_identity_nonce( + identity.id().to_buffer(), + 3, + &BlockInfo::default(), + true, + None, + version, + ) + .expect("expected to set nonce"); + + // we already added 3, and now are adding 2 + platform + .drive + .merge_identity_nonce( + identity.id().to_buffer(), + 2, + &BlockInfo::default(), + true, + None, + version, + ) + .expect("expected to set nonce"); + + let request = GetIdentityNonceRequest { + version: Some(Version::V0(GetIdentityNonceRequestV0 { + identity_id: id.to_vec(), + prove: false, + })), + } + .encode_to_vec(); + + let validation_result = platform + .query(QUERY_PATH, &request, version) + .expect("expected query to succeed"); + + assert!(validation_result.first_error().is_none()); + + let response_data = validation_result.into_data().expect("expected data"); + + let GetIdentityNonceResponse { version } = + GetIdentityNonceResponse::decode(response_data.as_slice()) + .expect("expected to decode the response"); + + let v0 = match version.unwrap() { + get_identity_nonce_response::Version::V0(v0) => v0, + }; + + let nonce = match v0.result.unwrap() { + get_identity_nonce_response_v0::Result::IdentityNonce(nonce) => nonce, + get_identity_nonce_response_v0::Result::Proof(_) => { + panic!("expected non proved") + } + }; + + assert_eq!(nonce, 3); + } + + #[test] + fn test_identity_contract_nonce_absence_proof() { + let (platform, version) = super::setup_platform(); + + let id = vec![0; 32]; + + let request = GetIdentityNonceRequest { + version: Some(Version::V0(GetIdentityNonceRequestV0 { + identity_id: vec![0; 32], + prove: true, + })), + } + .encode_to_vec(); + + let result = platform.query(QUERY_PATH, &request, version); + let validation_result = result.unwrap(); + let response = + GetIdentityNonceResponse::decode(validation_result.data.unwrap().as_slice()) + .unwrap(); + + assert!(matches!( + extract_single_variant_or_panic!( + response.version.expect("expected a versioned response"), + get_identity_nonce_response::Version::V0(inner), + inner + ) + .result + .unwrap(), + get_identity_nonce_response::get_identity_nonce_response_v0::Result::Proof(_) + )); + } + } + + mod identity_contract_nonce { + use crate::error::query::QueryError; + use std::collections::BTreeMap; + + use dapi_grpc::platform::v0::get_identity_contract_nonce_request::{ + GetIdentityContractNonceRequestV0, Version, + }; + use dapi_grpc::platform::v0::get_identity_contract_nonce_response::get_identity_contract_nonce_response_v0; + use dapi_grpc::platform::v0::{ + get_identity_contract_nonce_response, GetIdentityContractNonceRequest, + GetIdentityContractNonceResponse, + }; + use dapi_grpc::Message; + use dpp::block::block_info::BlockInfo; + use dpp::data_contract::accessors::v0::DataContractV0Getters; + use dpp::data_contract::document_type::random_document::CreateRandomDocument; + use dpp::identifier::Identifier; + use dpp::identity::accessors::IdentityGettersV0; + use dpp::identity::identity_nonce::{ + IDENTITY_NONCE_VALUE_FILTER, IDENTITY_NONCE_VALUE_FILTER_MAX_BYTES, + }; + use dpp::identity::{Identity, IdentityV0}; + use dpp::prelude::IdentityNonce; + use drive::common::identities::{ + create_test_identities_with_rng, create_test_identity_with_rng, + }; + use drive::drive::object_size_info::DocumentInfo::DocumentRefInfo; + use drive::drive::object_size_info::{DocumentAndContractInfo, OwnedDocumentInfo}; + use rand::prelude::StdRng; + use rand::{Rng, SeedableRng}; + + const QUERY_PATH: &str = "/identity/contractNonce"; + + #[test] + fn test_invalid_identity_id() { + let (platform, version) = super::setup_platform(); + + let request = GetIdentityContractNonceRequest { + version: Some(Version::V0(GetIdentityContractNonceRequestV0 { + identity_id: vec![0; 8], + prove: false, + contract_id: vec![1; 32], + })), + } + .encode_to_vec(); + + let result = platform.query(QUERY_PATH, &request, version); + assert!(result.is_ok()); + let validation_error = result.as_ref().unwrap().first_error().unwrap(); + + assert!(matches!( + validation_error, + QueryError::InvalidArgument(msg) if msg.contains("identity id must be 32 bytes long"))); + } + + #[test] + fn test_invalid_contract_id() { + let (platform, version) = super::setup_platform(); + + let request = GetIdentityContractNonceRequest { + version: Some(Version::V0(GetIdentityContractNonceRequestV0 { + identity_id: vec![0; 32], + prove: false, + contract_id: vec![1; 8], + })), + } + .encode_to_vec(); + + let result = platform.query(QUERY_PATH, &request, version); + assert!(result.is_ok()); + let validation_error = result.as_ref().unwrap().first_error().unwrap(); + + assert!(matches!( + validation_error, + QueryError::InvalidArgument(msg) if msg.contains("contract id must be 32 bytes long"))); + } + + #[test] + fn test_identity_not_found_when_querying_identity_nonce() { + let (platform, version) = super::setup_platform(); + + let request = GetIdentityContractNonceRequest { + version: Some(Version::V0(GetIdentityContractNonceRequestV0 { + identity_id: vec![0; 32], + prove: false, + contract_id: vec![0; 32], + })), + } + .encode_to_vec(); + + let validation_result = platform + .query(QUERY_PATH, &request, version) + .expect("expected query to succeed"); + + assert!(validation_result.first_error().is_none()); + + let response_data = validation_result.into_data().expect("expected data"); + + let GetIdentityContractNonceResponse { version } = + GetIdentityContractNonceResponse::decode(response_data.as_slice()) + .expect("expected to decode the response"); + + let v0 = match version.unwrap() { + get_identity_contract_nonce_response::Version::V0(v0) => v0, + }; + + let nonce = match v0.result.unwrap() { + get_identity_contract_nonce_response_v0::Result::IdentityContractNonce(nonce) => { + nonce + } + get_identity_contract_nonce_response_v0::Result::Proof(_) => { + panic!("expected non proved") + } + }; + + assert_eq!(nonce, 0); + } + + #[test] + fn test_contract_info_not_found_when_querying_identity_nonce_with_known_identity() { + let (platform, version) = super::setup_platform(); + let mut rng = StdRng::seed_from_u64(45); + let id = rng.gen::<[u8; 32]>(); + let identity = + create_test_identity_with_rng(&platform.drive, id, &mut rng, None, version) + .expect("expected to create a test identity"); + + let request = GetIdentityContractNonceRequest { + version: Some(Version::V0(GetIdentityContractNonceRequestV0 { + identity_id: id.to_vec(), + prove: false, + contract_id: vec![0; 32], + })), + } + .encode_to_vec(); + + let validation_result = platform + .query(QUERY_PATH, &request, version) + .expect("expected query to succeed"); + + assert!(validation_result.first_error().is_none()); + + let response_data = validation_result.into_data().expect("expected data"); + + let GetIdentityContractNonceResponse { version } = + GetIdentityContractNonceResponse::decode(response_data.as_slice()) + .expect("expected to decode the response"); + + let v0 = match version.unwrap() { + get_identity_contract_nonce_response::Version::V0(v0) => v0, + }; + + let nonce = match v0.result.unwrap() { + get_identity_contract_nonce_response_v0::Result::IdentityContractNonce(nonce) => { + nonce + } + get_identity_contract_nonce_response_v0::Result::Proof(_) => { + panic!("expected non proved") + } + }; + + assert_eq!(nonce, 0); + } + + #[test] + fn test_identity_is_found_when_querying_identity_nonce() { + let (platform, version) = super::setup_platform(); + let mut rng = StdRng::seed_from_u64(10); + let id = rng.gen::<[u8; 32]>(); + let identity = + create_test_identity_with_rng(&platform.drive, id, &mut rng, None, version) + .expect("expected to create a test identity"); + + let cache = platform.drive.cache.read().unwrap(); + + let dashpay = &cache.system_data_contracts.dashpay; + + platform + .drive + .merge_identity_contract_nonce( + identity.id().to_buffer(), + dashpay.id().to_buffer(), + 1, + &BlockInfo::default(), + true, + None, + &mut vec![], + version, + ) + .expect("expected to set nonce"); + + let request = GetIdentityContractNonceRequest { + version: Some(Version::V0(GetIdentityContractNonceRequestV0 { + identity_id: id.to_vec(), + prove: false, + contract_id: dashpay.id().to_vec(), + })), + } + .encode_to_vec(); + + let validation_result = platform + .query(QUERY_PATH, &request, version) + .expect("expected query to succeed"); + + assert!(validation_result.first_error().is_none()); + + let response_data = validation_result.into_data().expect("expected data"); + + let GetIdentityContractNonceResponse { version } = + GetIdentityContractNonceResponse::decode(response_data.as_slice()) + .expect("expected to decode the response"); + + let v0 = match version.unwrap() { + get_identity_contract_nonce_response::Version::V0(v0) => v0, + }; + + let nonce = match v0.result.unwrap() { + get_identity_contract_nonce_response_v0::Result::IdentityContractNonce(nonce) => { + nonce + } + get_identity_contract_nonce_response_v0::Result::Proof(_) => { + panic!("expected non proved") + } + }; + + assert_eq!(nonce, 1); + } + + #[test] + fn test_identity_is_found_when_querying_identity_nonce_after_update() { + let (platform, version) = super::setup_platform(); + let mut rng = StdRng::seed_from_u64(10); + let id = rng.gen::<[u8; 32]>(); + let identity = + create_test_identity_with_rng(&platform.drive, id, &mut rng, None, version) + .expect("expected to create a test identity"); + + let cache = platform.drive.cache.read().unwrap(); + + let dashpay = &cache.system_data_contracts.dashpay; + + platform + .drive + .merge_identity_contract_nonce( + identity.id().to_buffer(), + dashpay.id().to_buffer(), + 1, + &BlockInfo::default(), + true, + None, + &mut vec![], + version, + ) + .expect("expected to set nonce"); + + platform + .drive + .merge_identity_contract_nonce( + identity.id().to_buffer(), + dashpay.id().to_buffer(), + 3, + &BlockInfo::default(), + true, + None, + &mut vec![], + version, + ) + .expect("expected to set nonce"); + + let request = GetIdentityContractNonceRequest { + version: Some(Version::V0(GetIdentityContractNonceRequestV0 { + identity_id: id.to_vec(), + prove: false, + contract_id: dashpay.id().to_vec(), + })), + } + .encode_to_vec(); + + let validation_result = platform + .query(QUERY_PATH, &request, version) + .expect("expected query to succeed"); + + assert!(validation_result.first_error().is_none()); + + let response_data = validation_result.into_data().expect("expected data"); + + let GetIdentityContractNonceResponse { version } = + GetIdentityContractNonceResponse::decode(response_data.as_slice()) + .expect("expected to decode the response"); + + let v0 = match version.unwrap() { + get_identity_contract_nonce_response::Version::V0(v0) => v0, + }; + + let nonce = match v0.result.unwrap() { + get_identity_contract_nonce_response_v0::Result::IdentityContractNonce(nonce) => { + nonce + } + get_identity_contract_nonce_response_v0::Result::Proof(_) => { + panic!("expected non proved") + } + }; + + assert_eq!(nonce & IDENTITY_NONCE_VALUE_FILTER, 3); + assert_eq!(nonce >> IDENTITY_NONCE_VALUE_FILTER_MAX_BYTES, 1); + // the previous last one was not there + } + + #[test] + fn test_identity_is_found_when_querying_identity_nonce_after_update_for_past() { + let (platform, version) = super::setup_platform(); + let mut rng = StdRng::seed_from_u64(10); + let id = rng.gen::<[u8; 32]>(); + let identity = + create_test_identity_with_rng(&platform.drive, id, &mut rng, None, version) + .expect("expected to create a test identity"); + + let cache = platform.drive.cache.read().unwrap(); + + let dashpay = &cache.system_data_contracts.dashpay; + + platform + .drive + .merge_identity_contract_nonce( + identity.id().to_buffer(), + dashpay.id().to_buffer(), + 1, + &BlockInfo::default(), + true, + None, + &mut vec![], + version, + ) + .expect("expected to set nonce"); + + platform + .drive + .merge_identity_contract_nonce( + identity.id().to_buffer(), + dashpay.id().to_buffer(), + 3, + &BlockInfo::default(), + true, + None, + &mut vec![], + version, + ) + .expect("expected to set nonce"); + + // we already added 3, and now are adding 2 + platform + .drive + .merge_identity_contract_nonce( + identity.id().to_buffer(), + dashpay.id().to_buffer(), + 2, + &BlockInfo::default(), + true, + None, + &mut vec![], + version, + ) + .expect("expected to set nonce"); + + let request = GetIdentityContractNonceRequest { + version: Some(Version::V0(GetIdentityContractNonceRequestV0 { + identity_id: id.to_vec(), + prove: false, + contract_id: dashpay.id().to_vec(), + })), + } + .encode_to_vec(); + + let validation_result = platform + .query(QUERY_PATH, &request, version) + .expect("expected query to succeed"); + + assert!(validation_result.first_error().is_none()); + + let response_data = validation_result.into_data().expect("expected data"); + + let GetIdentityContractNonceResponse { version } = + GetIdentityContractNonceResponse::decode(response_data.as_slice()) + .expect("expected to decode the response"); + + let v0 = match version.unwrap() { + get_identity_contract_nonce_response::Version::V0(v0) => v0, + }; + + let nonce = match v0.result.unwrap() { + get_identity_contract_nonce_response_v0::Result::IdentityContractNonce(nonce) => { + nonce + } + get_identity_contract_nonce_response_v0::Result::Proof(_) => { + panic!("expected non proved") + } + }; + + assert_eq!(nonce, 3); + } + + #[test] + fn test_identity_contract_nonce_absence_proof() { + let (platform, version) = super::setup_platform(); + + let id = vec![0; 32]; + + let request = GetIdentityContractNonceRequest { + version: Some(Version::V0(GetIdentityContractNonceRequestV0 { + identity_id: vec![0; 32], + prove: true, + contract_id: vec![0; 32], + })), + } + .encode_to_vec(); + + let result = platform.query(QUERY_PATH, &request, version); + let validation_result = result.unwrap(); + let response = GetIdentityContractNonceResponse::decode( + validation_result.data.unwrap().as_slice(), + ) + .unwrap(); + + assert!(matches!( + extract_single_variant_or_panic!( + response.version.expect("expected a versioned response"), + get_identity_contract_nonce_response::Version::V0(inner), + inner + ) + .result + .unwrap(), + get_identity_contract_nonce_response::get_identity_contract_nonce_response_v0::Result::Proof(_) + )); + } + } + mod identity_balance_and_revision { use crate::error::query::QueryError; use dapi_grpc::platform::v0::get_identity_balance_and_revision_request::{ diff --git a/packages/rs-drive-abci/src/query/v0/mod.rs b/packages/rs-drive-abci/src/query/v0/mod.rs index 28ca0fea26..f888ea37f4 100644 --- a/packages/rs-drive-abci/src/query/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/v0/mod.rs @@ -18,6 +18,10 @@ impl Platform { match query_path { "/identity" => self.query_identity(&state, query_data, platform_version), "/identities" => self.query_identities(&state, query_data, platform_version), + "/identity/contractNonce" => { + self.query_identity_contract_nonce(&state, query_data, platform_version) + } + "/identity/nonce" => self.query_identity_nonce(&state, query_data, platform_version), "/identity/balance" => self.query_balance(&state, query_data, platform_version), "/identity/balanceAndRevision" => { self.query_balance_and_revision(&state, query_data, platform_version) diff --git a/packages/rs-drive-abci/tests/strategy_tests/chain_lock_update.rs b/packages/rs-drive-abci/tests/strategy_tests/chain_lock_update.rs index 38e902fdb0..5842362770 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/chain_lock_update.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/chain_lock_update.rs @@ -23,6 +23,7 @@ mod tests { times_per_block_range: Default::default(), chance_per_block: None, }, + identity_contract_nonce_gaps: None, signer: None, }, total_hpmns: 100, diff --git a/packages/rs-drive-abci/tests/strategy_tests/core_update_tests.rs b/packages/rs-drive-abci/tests/strategy_tests/core_update_tests.rs index 4f4e4b8bba..90bc0b003f 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/core_update_tests.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/core_update_tests.rs @@ -22,6 +22,7 @@ mod tests { times_per_block_range: Default::default(), chance_per_block: None, }, + identity_contract_nonce_gaps: None, signer: None, }, total_hpmns: 100, @@ -121,6 +122,7 @@ mod tests { times_per_block_range: Default::default(), chance_per_block: None, }, + identity_contract_nonce_gaps: None, signer: None, }, total_hpmns: 100, @@ -206,6 +208,7 @@ mod tests { times_per_block_range: Default::default(), chance_per_block: None, }, + identity_contract_nonce_gaps: None, signer: None, }, total_hpmns: 100, diff --git a/packages/rs-drive-abci/tests/strategy_tests/execution.rs b/packages/rs-drive-abci/tests/strategy_tests/execution.rs index bc0573098b..c4c678ea6b 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/execution.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/execution.rs @@ -770,6 +770,8 @@ pub(crate) fn start_chain_for_strategy( quorums, current_quorum_hash, current_proposer_versions: None, + current_identity_nonce_counter: Default::default(), + current_identity_contract_nonce_counter: Default::default(), start_time_ms: GENESIS_TIME_MS, current_time_ms: GENESIS_TIME_MS, }, @@ -795,6 +797,8 @@ pub(crate) fn continue_chain_for_strategy( quorums, mut current_quorum_hash, current_proposer_versions, + mut current_identity_nonce_counter, + mut current_identity_contract_nonce_counter, start_time_ms, mut current_time_ms, } = chain_execution_parameters; @@ -872,6 +876,8 @@ pub(crate) fn continue_chain_for_strategy( platform, &block_info, &mut current_identities, + &mut current_identity_nonce_counter, + &mut current_identity_contract_nonce_counter, &mut signer, &mut rng, ); @@ -1078,6 +1084,8 @@ pub(crate) fn continue_chain_for_strategy( quorums, current_quorum_hash, current_proposer_versions: proposer_versions, + identity_nonce_counter: current_identity_nonce_counter, + identity_contract_nonce_counter: current_identity_contract_nonce_counter, end_epoch_index, end_time_ms: current_time_ms, strategy, diff --git a/packages/rs-drive-abci/tests/strategy_tests/failures.rs b/packages/rs-drive-abci/tests/strategy_tests/failures.rs index 82199d963e..0aa9d010a7 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/failures.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/failures.rs @@ -60,6 +60,7 @@ mod tests { times_per_block_range: 1..2, chance_per_block: None, }, + identity_contract_nonce_gaps: None, signer: None, }, total_hpmns: 100, @@ -136,6 +137,7 @@ mod tests { times_per_block_range: Default::default(), chance_per_block: None, }, + identity_contract_nonce_gaps: None, signer: None, }, total_hpmns: 100, @@ -342,6 +344,7 @@ mod tests { times_per_block_range: Default::default(), chance_per_block: None, }, + identity_contract_nonce_gaps: None, signer: Some(simple_signer), }, total_hpmns: 100, diff --git a/packages/rs-drive-abci/tests/strategy_tests/main.rs b/packages/rs-drive-abci/tests/strategy_tests/main.rs index e1eb94857a..8fd51b80f4 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/main.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/main.rs @@ -110,6 +110,7 @@ mod tests { use itertools::Itertools; use tenderdash_abci::proto::abci::{RequestInfo, ResponseInfo}; + use dpp::state_transition::StateTransition; use tenderdash_abci::Application; pub fn generate_quorums_extended_info(n: u32) -> QuorumListExtendedInfo { @@ -146,6 +147,7 @@ mod tests { times_per_block_range: Default::default(), chance_per_block: None, }, + identity_contract_nonce_gaps: None, signer: None, }, total_hpmns: 100, @@ -191,6 +193,7 @@ mod tests { times_per_block_range: Default::default(), chance_per_block: None, }, + identity_contract_nonce_gaps: None, signer: None, }, total_hpmns: 100, @@ -237,6 +240,7 @@ mod tests { times_per_block_range: Default::default(), chance_per_block: None, }, + identity_contract_nonce_gaps: None, signer: None, }, total_hpmns: 100, @@ -279,6 +283,8 @@ mod tests { current_quorum_hash, current_proposer_versions, end_time_ms, + identity_nonce_counter, + identity_contract_nonce_counter, .. } = run_chain_for_strategy(&mut platform, 15, strategy.clone(), config.clone(), 40); @@ -342,6 +348,8 @@ mod tests { quorums, current_quorum_hash, current_proposer_versions: Some(current_proposer_versions), + current_identity_nonce_counter: identity_nonce_counter, + current_identity_contract_nonce_counter: identity_contract_nonce_counter, start_time_ms: 1681094380000, current_time_ms: end_time_ms, }, @@ -362,6 +370,7 @@ mod tests { times_per_block_range: Default::default(), chance_per_block: None, }, + identity_contract_nonce_gaps: None, signer: None, }, total_hpmns: 100, @@ -410,6 +419,8 @@ mod tests { current_quorum_hash, current_proposer_versions, end_time_ms, + identity_nonce_counter, + identity_contract_nonce_counter, .. } = run_chain_for_strategy(&mut platform, 15, strategy.clone(), config.clone(), 40); @@ -473,6 +484,8 @@ mod tests { quorums, current_quorum_hash, current_proposer_versions: Some(current_proposer_versions), + current_identity_nonce_counter: identity_nonce_counter, + current_identity_contract_nonce_counter: identity_contract_nonce_counter, start_time_ms: 1681094380000, current_time_ms: end_time_ms, }, @@ -494,6 +507,7 @@ mod tests { times_per_block_range: 1..2, chance_per_block: None, }, + identity_contract_nonce_gaps: None, signer: None, }, total_hpmns: 100, @@ -540,7 +554,7 @@ mod tests { .expect("expected to fetch balances") .expect("expected to have an identity to get balance from"); - assert_eq!(balance, 99868861500) + assert_eq!(balance, 99864802180) } #[test] @@ -554,6 +568,7 @@ mod tests { times_per_block_range: Default::default(), chance_per_block: None, }, + identity_contract_nonce_gaps: None, signer: None, }, total_hpmns: 100, @@ -603,6 +618,7 @@ mod tests { times_per_block_range: Default::default(), chance_per_block: None, }, + identity_contract_nonce_gaps: None, signer: None, }, total_hpmns: 100, @@ -660,6 +676,7 @@ mod tests { times_per_block_range: Default::default(), chance_per_block: None, }, + identity_contract_nonce_gaps: None, signer: None, }, total_hpmns: 100, @@ -722,6 +739,7 @@ mod tests { times_per_block_range: Default::default(), chance_per_block: None, }, + identity_contract_nonce_gaps: None, signer: None, }, total_hpmns: 500, @@ -799,6 +817,7 @@ mod tests { times_per_block_range: Default::default(), chance_per_block: None, }, + identity_contract_nonce_gaps: None, signer: None, }, total_hpmns: 100, @@ -863,6 +882,7 @@ mod tests { times_per_block_range: Default::default(), chance_per_block: None, }, + identity_contract_nonce_gaps: None, signer: None, }, total_hpmns: 100, @@ -930,6 +950,7 @@ mod tests { times_per_block_range: Default::default(), chance_per_block: None, }, + identity_contract_nonce_gaps: None, signer: None, }, total_hpmns: 100, @@ -1024,6 +1045,7 @@ mod tests { times_per_block_range: 1..2, chance_per_block: None, }, + identity_contract_nonce_gaps: None, signer: None, }, total_hpmns: 100, @@ -1077,6 +1099,7 @@ mod tests { times_per_block_range: 1..2, chance_per_block: None, }, + identity_contract_nonce_gaps: None, signer: None, }, total_hpmns: 100, @@ -1130,7 +1153,7 @@ mod tests { .unwrap() .unwrap() ), - "fa6e1d4977b35a5b9d9be63afb65d9cd3cf607e79a733bf743b96bfd6de48eed".to_string() + "b91e7b8759189050aa92a00dc5fb240689bb0a58e3a2388c80f8d18156d4eb0b".to_string() ) } @@ -1153,6 +1176,7 @@ mod tests { times_per_block_range: 1..2, chance_per_block: None, }, + identity_contract_nonce_gaps: None, signer: None, }, total_hpmns: 100, @@ -1256,6 +1280,7 @@ mod tests { times_per_block_range: 1..2, chance_per_block: None, }, + identity_contract_nonce_gaps: None, signer: None, }, total_hpmns: 100, @@ -1354,6 +1379,7 @@ mod tests { times_per_block_range: 1..2, chance_per_block: None, }, + identity_contract_nonce_gaps: None, signer: None, }, total_hpmns: 100, @@ -1428,6 +1454,7 @@ mod tests { times_per_block_range: 1..2, chance_per_block: None, }, + identity_contract_nonce_gaps: None, signer: None, }, total_hpmns: 100, @@ -1530,6 +1557,7 @@ mod tests { times_per_block_range: 1..2, chance_per_block: None, }, + identity_contract_nonce_gaps: None, signer: None, }, total_hpmns: 100, @@ -1615,14 +1643,14 @@ mod tests { Operation { op_type: OperationType::Document(document_insertion_op), frequency: Frequency { - times_per_block_range: 1..10, + times_per_block_range: 1..7, chance_per_block: None, }, }, Operation { op_type: OperationType::Document(document_deletion_op), frequency: Frequency { - times_per_block_range: 1..10, + times_per_block_range: 1..7, chance_per_block: None, }, }, @@ -1632,6 +1660,7 @@ mod tests { times_per_block_range: 1..2, chance_per_block: None, }, + identity_contract_nonce_gaps: None, signer: None, }, total_hpmns: 100, @@ -1686,10 +1715,348 @@ mod tests { .unwrap() .unwrap() ), - "301a9e2630e5017a1d45a492a1e23837ab7369049c617d8202db22f924a911f3".to_string() + "edf712041923f8707e2b9b21a876cdc70a26dca939a0a28bfdd1802bfba9ca6a".to_string() ) } + #[test] + fn run_chain_insert_one_new_identity_per_block_many_document_insertions_and_deletions_with_nonce_gaps_with_epoch_change( + ) { + let platform_version = PlatformVersion::latest(); + let created_contract = json_document_to_created_contract( + "tests/supporting_files/contract/dashpay/dashpay-contract-all-mutable.json", + true, + platform_version, + ) + .expect("expected to get contract from a json document"); + + let contract = created_contract.data_contract(); + + let document_insertion_op = DocumentOp { + contract: contract.clone(), + action: DocumentAction::DocumentActionInsertRandom( + DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + ), + document_type: contract + .document_type_for_name("contactRequest") + .expect("expected a profile document type") + .to_owned_document_type(), + }; + + let document_deletion_op = DocumentOp { + contract: contract.clone(), + action: DocumentAction::DocumentActionDelete, + document_type: contract + .document_type_for_name("contactRequest") + .expect("expected a profile document type") + .to_owned_document_type(), + }; + + let strategy = NetworkStrategy { + strategy: Strategy { + contracts_with_updates: vec![(created_contract, None)], + operations: vec![ + Operation { + op_type: OperationType::Document(document_insertion_op), + frequency: Frequency { + times_per_block_range: 1..7, + chance_per_block: None, + }, + }, + Operation { + op_type: OperationType::Document(document_deletion_op), + frequency: Frequency { + times_per_block_range: 1..7, + chance_per_block: None, + }, + }, + ], + start_identities: vec![], + identities_inserts: Frequency { + times_per_block_range: 1..2, + chance_per_block: None, + }, + identity_contract_nonce_gaps: Some(Frequency { + times_per_block_range: 1..3, + chance_per_block: Some(0.5), + }), + signer: None, + }, + total_hpmns: 100, + extra_normal_mns: 0, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, + upgrading_info: None, + + proposer_strategy: Default::default(), + rotate_quorums: false, + failure_testing: None, + query_testing: None, + verify_state_transition_results: true, + ..Default::default() + }; + let day_in_ms = 1000 * 60 * 60 * 24; + let config = PlatformConfig { + validator_set_quorum_size: 100, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), + execution: ExecutionConfig { + verify_sum_trees: true, + validator_set_rotation_block_count: 100, + ..Default::default() + }, + block_spacing_ms: day_in_ms, + testing_configs: PlatformTestConfig::default_with_no_block_signing(), + ..Default::default() + }; + + let block_count = 120; + let mut platform = TestPlatformBuilder::new() + .with_config(config.clone()) + .build_with_mock_rpc(); + + let outcome = run_chain_for_strategy(&mut platform, block_count, strategy, config, 15); + assert_eq!(outcome.identities.len() as u64, block_count); + assert_eq!(outcome.masternode_identity_balances.len(), 100); + let all_have_balances = outcome + .masternode_identity_balances + .iter() + .all(|(_, balance)| *balance != 0); + assert!(all_have_balances, "all masternodes should have a balance"); + assert_eq!( + hex::encode( + outcome + .abci_app + .platform + .drive + .grove + .root_hash(None) + .unwrap() + .unwrap() + ), + "7e870501f9fa6d0d7794407c787c1017dfc97afc59dffa166a561335ff5043cc".to_string() + ) + } + + #[test] + fn run_chain_insert_one_new_identity_per_block_many_document_insertions_and_deletions_with_max_nonce_gaps_with_epoch_change( + ) { + let platform_version = PlatformVersion::latest(); + let created_contract = json_document_to_created_contract( + "tests/supporting_files/contract/dashpay/dashpay-contract-all-mutable.json", + true, + platform_version, + ) + .expect("expected to get contract from a json document"); + + let contract = created_contract.data_contract(); + + let document_insertion_op = DocumentOp { + contract: contract.clone(), + action: DocumentAction::DocumentActionInsertRandom( + DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + ), + document_type: contract + .document_type_for_name("contactRequest") + .expect("expected a profile document type") + .to_owned_document_type(), + }; + + let document_deletion_op = DocumentOp { + contract: contract.clone(), + action: DocumentAction::DocumentActionDelete, + document_type: contract + .document_type_for_name("contactRequest") + .expect("expected a profile document type") + .to_owned_document_type(), + }; + + let strategy = NetworkStrategy { + strategy: Strategy { + contracts_with_updates: vec![(created_contract, None)], + operations: vec![ + Operation { + op_type: OperationType::Document(document_insertion_op), + frequency: Frequency { + times_per_block_range: 1..7, + chance_per_block: None, + }, + }, + Operation { + op_type: OperationType::Document(document_deletion_op), + frequency: Frequency { + times_per_block_range: 1..7, + chance_per_block: None, + }, + }, + ], + start_identities: vec![], + identities_inserts: Frequency { + times_per_block_range: 1..2, + chance_per_block: None, + }, + identity_contract_nonce_gaps: Some(Frequency { + times_per_block_range: 24..25, + chance_per_block: Some(1.0), + }), + signer: None, + }, + total_hpmns: 100, + extra_normal_mns: 0, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, + upgrading_info: None, + + proposer_strategy: Default::default(), + rotate_quorums: false, + failure_testing: None, + query_testing: None, + verify_state_transition_results: true, + ..Default::default() + }; + let day_in_ms = 1000 * 60 * 60 * 24; + let config = PlatformConfig { + validator_set_quorum_size: 100, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), + execution: ExecutionConfig { + verify_sum_trees: true, + validator_set_rotation_block_count: 100, + ..Default::default() + }, + block_spacing_ms: day_in_ms, + testing_configs: PlatformTestConfig::default_with_no_block_signing(), + ..Default::default() + }; + + let block_count = 10; + let mut platform = TestPlatformBuilder::new() + .with_config(config.clone()) + .build_with_mock_rpc(); + + let outcome = run_chain_for_strategy(&mut platform, block_count, strategy, config, 15); + for tx_results_per_block in outcome.state_transition_results_per_block.values() { + for (state_transition, result) in tx_results_per_block { + assert_eq!( + result.code, 0, + "state transition got code {} : {:?}", + result.code, state_transition + ); + } + } + } + + #[test] + fn run_chain_insert_one_new_identity_per_block_many_document_insertions_and_deletions_with_higher_than_max_nonce_gaps_with_epoch_change( + ) { + let platform_version = PlatformVersion::latest(); + let created_contract = json_document_to_created_contract( + "tests/supporting_files/contract/dashpay/dashpay-contract-all-mutable.json", + true, + platform_version, + ) + .expect("expected to get contract from a json document"); + + let contract = created_contract.data_contract(); + + let document_insertion_op = DocumentOp { + contract: contract.clone(), + action: DocumentAction::DocumentActionInsertRandom( + DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + ), + document_type: contract + .document_type_for_name("contactRequest") + .expect("expected a profile document type") + .to_owned_document_type(), + }; + + let document_deletion_op = DocumentOp { + contract: contract.clone(), + action: DocumentAction::DocumentActionDelete, + document_type: contract + .document_type_for_name("contactRequest") + .expect("expected a profile document type") + .to_owned_document_type(), + }; + + let strategy = NetworkStrategy { + strategy: Strategy { + contracts_with_updates: vec![(created_contract, None)], + operations: vec![ + Operation { + op_type: OperationType::Document(document_insertion_op), + frequency: Frequency { + times_per_block_range: 1..7, + chance_per_block: None, + }, + }, + Operation { + op_type: OperationType::Document(document_deletion_op), + frequency: Frequency { + times_per_block_range: 1..7, + chance_per_block: None, + }, + }, + ], + start_identities: vec![], + identities_inserts: Frequency { + times_per_block_range: 1..2, + chance_per_block: None, + }, + identity_contract_nonce_gaps: Some(Frequency { + times_per_block_range: 25..26, + chance_per_block: Some(1.0), + }), + signer: None, + }, + total_hpmns: 100, + extra_normal_mns: 0, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, + upgrading_info: None, + + proposer_strategy: Default::default(), + rotate_quorums: false, + failure_testing: None, + query_testing: None, + verify_state_transition_results: true, + ..Default::default() + }; + let day_in_ms = 1000 * 60 * 60 * 24; + let config = PlatformConfig { + validator_set_quorum_size: 100, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), + execution: ExecutionConfig { + verify_sum_trees: true, + validator_set_rotation_block_count: 100, + ..Default::default() + }, + block_spacing_ms: day_in_ms, + testing_configs: PlatformTestConfig::default_with_no_block_signing(), + ..Default::default() + }; + + let block_count = 10; + let mut platform = TestPlatformBuilder::new() + .with_config(config.clone()) + .build_with_mock_rpc(); + + let outcome = run_chain_for_strategy(&mut platform, block_count, strategy, config, 15); + for tx_results_per_block in outcome.state_transition_results_per_block.values() { + for (state_transition, result) in tx_results_per_block { + // We can't ever get a documents batch transition, because the proposer will remove it from a block + assert!(!matches!( + state_transition, + StateTransition::DocumentsBatch(_) + )); + } + } + } + #[test] fn run_chain_insert_many_new_identity_per_block_many_document_insertions_and_deletions_with_epoch_change( ) { @@ -1748,6 +2115,7 @@ mod tests { times_per_block_range: 1..30, chance_per_block: None, }, + identity_contract_nonce_gaps: None, signer: None, }, total_hpmns: 100, @@ -1870,6 +2238,7 @@ mod tests { times_per_block_range: 1..6, chance_per_block: None, }, + identity_contract_nonce_gaps: None, signer: None, }, total_hpmns: 100, @@ -1937,6 +2306,7 @@ mod tests { times_per_block_range: 1..2, chance_per_block: None, }, + identity_contract_nonce_gaps: None, signer: None, }, total_hpmns: 100, @@ -2010,6 +2380,7 @@ mod tests { times_per_block_range: 1..2, chance_per_block: None, }, + identity_contract_nonce_gaps: None, signer: None, }, total_hpmns: 100, @@ -2090,6 +2461,7 @@ mod tests { times_per_block_range: 1..2, chance_per_block: None, }, + identity_contract_nonce_gaps: None, signer: None, }, total_hpmns: 100, @@ -2178,6 +2550,7 @@ mod tests { times_per_block_range: 1..2, chance_per_block: None, }, + identity_contract_nonce_gaps: None, signer: None, }, total_hpmns: 100, @@ -2277,6 +2650,8 @@ mod tests { current_quorum_hash, current_proposer_versions, end_time_ms, + identity_nonce_counter, + identity_contract_nonce_counter, .. }, last_block_pooled_withdrawals_amount, @@ -2315,6 +2690,8 @@ mod tests { current_proposer_versions, end_time_ms, withdrawals: last_block_withdrawals, + identity_nonce_counter, + identity_contract_nonce_counter, .. } = { let outcome = continue_chain_for_strategy( @@ -2327,6 +2704,8 @@ mod tests { quorums, current_quorum_hash, current_proposer_versions: Some(current_proposer_versions), + current_identity_nonce_counter: identity_nonce_counter, + current_identity_contract_nonce_counter: identity_contract_nonce_counter, start_time_ms: GENESIS_TIME_MS, current_time_ms: end_time_ms, }, @@ -2390,6 +2769,8 @@ mod tests { current_proposer_versions, end_time_ms, withdrawals: last_block_withdrawals, + identity_nonce_counter, + identity_contract_nonce_counter, .. }, last_block_broadcased_withdrawals_amount, @@ -2404,6 +2785,8 @@ mod tests { quorums, current_quorum_hash, current_proposer_versions: Some(current_proposer_versions), + current_identity_nonce_counter: identity_nonce_counter, + current_identity_contract_nonce_counter: identity_contract_nonce_counter, start_time_ms: GENESIS_TIME_MS, current_time_ms: end_time_ms + 1000, }, @@ -2498,6 +2881,8 @@ mod tests { current_proposer_versions, end_time_ms, withdrawals: last_block_withdrawals, + identity_nonce_counter, + identity_contract_nonce_counter, .. }, last_block_withdrawals_completed_amount, @@ -2512,6 +2897,8 @@ mod tests { quorums, current_quorum_hash, current_proposer_versions: Some(current_proposer_versions), + current_identity_nonce_counter: identity_nonce_counter, + current_identity_contract_nonce_counter: identity_contract_nonce_counter, start_time_ms: GENESIS_TIME_MS, current_time_ms: end_time_ms + 1000, }, @@ -2617,6 +3004,8 @@ mod tests { quorums, current_quorum_hash, current_proposer_versions: Some(current_proposer_versions), + current_identity_nonce_counter: identity_nonce_counter, + current_identity_contract_nonce_counter: identity_contract_nonce_counter, start_time_ms: GENESIS_TIME_MS, current_time_ms: end_time_ms + 1000, }, @@ -2718,6 +3107,7 @@ mod tests { times_per_block_range: 1..2, chance_per_block: None, }, + identity_contract_nonce_gaps: None, signer: None, }, total_hpmns: 50, @@ -2877,6 +3267,7 @@ mod tests { times_per_block_range: 1..2, chance_per_block: None, }, + identity_contract_nonce_gaps: None, signer: None, }, total_hpmns: 500, @@ -3007,6 +3398,7 @@ mod tests { times_per_block_range: 1..2, chance_per_block: None, }, + identity_contract_nonce_gaps: None, signer: None, }, total_hpmns: 500, @@ -3137,6 +3529,7 @@ mod tests { times_per_block_range: Default::default(), chance_per_block: None, }, + identity_contract_nonce_gaps: None, signer: None, }, total_hpmns: 500, @@ -3180,6 +3573,8 @@ mod tests { current_quorum_hash, current_proposer_versions, end_time_ms, + identity_nonce_counter, + identity_contract_nonce_counter, .. } = run_chain_for_strategy(&mut platform, 100, strategy.clone(), config.clone(), 89); @@ -3241,6 +3636,8 @@ mod tests { quorums, current_quorum_hash, current_proposer_versions: Some(current_proposer_versions), + current_identity_nonce_counter: identity_nonce_counter, + current_identity_contract_nonce_counter: identity_contract_nonce_counter, start_time_ms: 1681094380000, current_time_ms: end_time_ms, }, @@ -3267,6 +3664,7 @@ mod tests { times_per_block_range: 6..10, chance_per_block: None, }, + identity_contract_nonce_gaps: None, signer: None, }, total_hpmns: 100, diff --git a/packages/rs-drive-abci/tests/strategy_tests/query.rs b/packages/rs-drive-abci/tests/strategy_tests/query.rs index cc4bc029c3..d958bdcb66 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/query.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/query.rs @@ -389,6 +389,7 @@ mod tests { times_per_block_range: Default::default(), chance_per_block: None, }, + identity_contract_nonce_gaps: None, signer: None, }, total_hpmns: 100, @@ -494,6 +495,7 @@ mod tests { times_per_block_range: Default::default(), chance_per_block: None, }, + identity_contract_nonce_gaps: None, signer: None, }, total_hpmns: 100, @@ -600,6 +602,7 @@ mod tests { times_per_block_range: Default::default(), chance_per_block: None, }, + identity_contract_nonce_gaps: None, signer: None, }, total_hpmns: 100, diff --git a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs index a2b09b9763..7f1572c24d 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs @@ -38,10 +38,12 @@ use rand::Rng; use strategy_tests::Strategy; use std::borrow::Cow; use std::collections::{BTreeMap, HashMap, HashSet}; +use std::ops::AddAssign; use tenderdash_abci::proto::abci::{ExecTxResult, ValidatorSetUpdate}; use dpp::data_contract::document_type::accessors::{DocumentTypeV0Getters}; use dpp::identity::accessors::IdentityGettersV0; use dpp::platform_value::BinaryData; +use dpp::prelude::{Identifier, IdentityNonce}; use dpp::state_transition::documents_batch_transition::document_base_transition::v0::DocumentBaseTransitionV0; use dpp::state_transition::documents_batch_transition::document_create_transition::{DocumentCreateTransition, DocumentCreateTransitionV0}; use dpp::state_transition::documents_batch_transition::document_transition::document_delete_transition::DocumentDeleteTransitionV0; @@ -427,6 +429,7 @@ impl NetworkStrategy { current_identities: &Vec, block_height: u64, signer: &SimpleSigner, + contract_nonce_counter: &mut BTreeMap<(Identifier, Identifier), u64>, platform_version: &PlatformVersion, ) -> Vec { self.strategy @@ -446,10 +449,16 @@ impl NetworkStrategy { .clone() .into_partial_identity_info(); + let identity_contract_nonce = contract_nonce_counter + .entry((identity.id, contract_update.data_contract().id())) + .or_default(); + *identity_contract_nonce += 1; + let state_transition = DataContractUpdateTransition::new_from_data_contract( contract_update.data_contract().clone(), &identity, 1, //key id 1 should always be a high or critical auth key in these tests + *identity_contract_nonce, signer, platform_version, None, @@ -460,493 +469,13 @@ impl NetworkStrategy { .collect() } - // TODO: this belongs to `DocumentOp`, also randomization details are common for all operations - // and could be moved out of here - pub fn state_transitions_for_block( - &self, - platform: &Platform, - block_info: &BlockInfo, - current_identities: &mut Vec, - signer: &mut SimpleSigner, - rng: &mut StdRng, - platform_version: &PlatformVersion, - ) -> (Vec, Vec) { - let mut operations = vec![]; - let mut finalize_block_operations = vec![]; - let mut replaced = vec![]; - let mut deleted = vec![]; - for op in &self.strategy.operations { - if op.frequency.check_hit(rng) { - let count = rng.gen_range(op.frequency.times_per_block_range.clone()); - match &op.op_type { - OperationType::Document(DocumentOp { - action: DocumentAction::DocumentActionInsertRandom(fill_type, fill_size), - document_type, - contract, - }) => { - let documents = document_type - .random_documents_with_params( - count as u32, - current_identities, - block_info.time_ms, - *fill_type, - *fill_size, - rng, - platform_version, - ) - .expect("expected random_documents_with_params"); - documents - .into_iter() - .for_each(|(document, identity, entropy)| { - let updated_at = - if document_type.required_fields().contains("$updatedAt") { - document.created_at() - } else { - None - }; - let document_create_transition: DocumentCreateTransition = - DocumentCreateTransitionV0 { - base: DocumentBaseTransitionV0 { - id: document.id(), - document_type_name: document_type.name().clone(), - data_contract_id: contract.id(), - } - .into(), - entropy: entropy.to_buffer(), - created_at: document.created_at(), - updated_at, - data: document.properties_consumed(), - } - .into(); - - let document_batch_transition: DocumentsBatchTransition = - DocumentsBatchTransitionV0 { - owner_id: identity.id(), - transitions: vec![document_create_transition.into()], - signature_public_key_id: 0, - signature: BinaryData::default(), - } - .into(); - let mut document_batch_transition: StateTransition = - document_batch_transition.into(); - - let identity_public_key = identity - .get_first_public_key_matching( - Purpose::AUTHENTICATION, - HashSet::from([ - SecurityLevel::HIGH, - SecurityLevel::CRITICAL, - ]), - HashSet::from([ - KeyType::ECDSA_SECP256K1, - KeyType::BLS12_381, - ]), - ) - .expect("expected to get a signing key"); - - document_batch_transition - .sign_external( - identity_public_key, - signer, - Some(|_data_contract_id, _document_type_name| { - Ok(SecurityLevel::HIGH) - }), - ) - .expect("expected to sign"); - - operations.push(document_batch_transition); - }); - } - OperationType::Document(DocumentOp { - action: - DocumentAction::DocumentActionInsertSpecific( - specific_document_key_value_pairs, - identifier, - fill_type, - fill_size, - ), - document_type, - contract, - }) => { - let documents = if let Some(identifier) = identifier { - let held_identity = vec![current_identities - .iter() - .find(|identity| identity.id() == identifier) - .expect("expected to find identifier, review strategy params") - .clone()]; - document_type - .random_documents_with_params( - count as u32, - &held_identity, - block_info.time_ms, - *fill_type, - *fill_size, - rng, - platform_version, - ) - .expect("expected random_documents_with_params") - } else { - document_type - .random_documents_with_params( - count as u32, - current_identities, - block_info.time_ms, - *fill_type, - *fill_size, - rng, - platform_version, - ) - .expect("expected random_documents_with_params") - }; - - documents - .into_iter() - .for_each(|(mut document, identity, entropy)| { - document - .properties_mut() - .append(&mut specific_document_key_value_pairs.clone()); - let updated_at = - if document_type.required_fields().contains("$updatedAt") { - document.created_at() - } else { - None - }; - let document_create_transition: DocumentCreateTransition = - DocumentCreateTransitionV0 { - base: DocumentBaseTransitionV0 { - id: document.id(), - document_type_name: document_type.name().clone(), - data_contract_id: contract.id(), - } - .into(), - entropy: entropy.to_buffer(), - created_at: document.created_at(), - updated_at, - data: document.properties_consumed(), - } - .into(); - - let document_batch_transition: DocumentsBatchTransition = - DocumentsBatchTransitionV0 { - owner_id: identity.id(), - transitions: vec![document_create_transition.into()], - signature_public_key_id: 0, - signature: BinaryData::default(), - } - .into(); - let mut document_batch_transition: StateTransition = - document_batch_transition.into(); - - let identity_public_key = identity - .get_first_public_key_matching( - Purpose::AUTHENTICATION, - HashSet::from([ - SecurityLevel::HIGH, - SecurityLevel::CRITICAL, - ]), - HashSet::from([ - KeyType::ECDSA_SECP256K1, - KeyType::BLS12_381, - ]), - ) - .expect("expected to get a signing key"); - - document_batch_transition - .sign_external( - identity_public_key, - signer, - Some(|_data_contract_id, _document_type_name| { - Ok(SecurityLevel::HIGH) - }), - ) - .expect("expected to sign"); - - operations.push(document_batch_transition); - }); - } - OperationType::Document(DocumentOp { - action: DocumentAction::DocumentActionDelete, - document_type, - contract, - }) => { - let any_item_query = - DriveQuery::any_item_query(contract, document_type.as_ref()); - let mut items = platform - .drive - .query_documents( - any_item_query, - Some(&block_info.epoch), - false, - None, - Some(platform_version.protocol_version), - ) - .expect("expect to execute query") - .documents_owned(); - - items.retain(|item| !deleted.contains(&item.id())); - - items.retain(|item| !replaced.contains(&item.id())); - - if !items.is_empty() { - let document = items.remove(0); - - deleted.push(document.id()); - - //todo: fix this into a search key request for the following - //let search_key_request = BTreeMap::from([(Purpose::AUTHENTICATION as u8, BTreeMap::from([(SecurityLevel::HIGH as u8, AllKeysOfKindRequest)]))]); - - let request = IdentityKeysRequest { - identity_id: document.owner_id().to_buffer(), - request_type: KeyRequestType::SpecificKeys(vec![1]), - limit: Some(1), - offset: None, - }; - let identity = platform - .drive - .fetch_identity_balance_with_keys(request, None, platform_version) - .expect("expected to be able to get identity") - .expect("expected to get an identity"); - let document_delete_transition: DocumentDeleteTransition = - DocumentDeleteTransitionV0 { - base: DocumentBaseTransitionV0 { - id: document.id(), - document_type_name: document_type.name().clone(), - data_contract_id: contract.id(), - } - .into(), - } - .into(); - - let document_batch_transition: DocumentsBatchTransition = - DocumentsBatchTransitionV0 { - owner_id: identity.id, - transitions: vec![document_delete_transition.into()], - signature_public_key_id: 0, - signature: BinaryData::default(), - } - .into(); - - let mut document_batch_transition: StateTransition = - document_batch_transition.into(); - - let identity_public_key = identity - .loaded_public_keys - .values() - .next() - .expect("expected a key"); - - document_batch_transition - .sign_external( - identity_public_key, - signer, - Some(|_data_contract_id, _document_type_name| { - Ok(SecurityLevel::HIGH) - }), - ) - .expect("expected to sign"); - - operations.push(document_batch_transition); - } - } - OperationType::Document(DocumentOp { - action: DocumentAction::DocumentActionReplace, - document_type, - contract, - }) => { - let any_item_query = - DriveQuery::any_item_query(contract, document_type.as_ref()); - let mut items = platform - .drive - .query_documents( - any_item_query, - Some(&block_info.epoch), - false, - None, - Some(platform_version.protocol_version), - ) - .expect("expect to execute query") - .documents_owned(); - - items.retain(|item| !deleted.contains(&item.id())); - - items.retain(|item| !replaced.contains(&item.id())); - - if !items.is_empty() { - let document = items.remove(0); - - replaced.push(document.id()); - - //todo: fix this into a search key request for the following - //let search_key_request = BTreeMap::from([(Purpose::AUTHENTICATION as u8, BTreeMap::from([(SecurityLevel::HIGH as u8, AllKeysOfKindRequest)]))]); - - let random_new_document = document_type - .random_document_with_rng(rng, platform_version) - .unwrap(); - let request = IdentityKeysRequest { - identity_id: document.owner_id().to_buffer(), - request_type: KeyRequestType::SpecificKeys(vec![1]), - limit: Some(1), - offset: None, - }; - let identity = platform - .drive - .fetch_identity_balance_with_keys(request, None, platform_version) - .expect("expected to be able to get identity") - .expect("expected to get an identity"); - let document_replace_transition: DocumentReplaceTransition = - DocumentReplaceTransitionV0 { - base: DocumentBaseTransitionV0 { - id: document.id(), - document_type_name: document_type.name().clone(), - data_contract_id: contract.id(), - } - .into(), - revision: document - .revision() - .expect("expected to unwrap revision") - + 1, - updated_at: Some(block_info.time_ms), - data: random_new_document.properties_consumed(), - } - .into(); - - let document_batch_transition: DocumentsBatchTransition = - DocumentsBatchTransitionV0 { - owner_id: identity.id, - transitions: vec![document_replace_transition.into()], - signature_public_key_id: 0, - signature: BinaryData::default(), - } - .into(); - - let mut document_batch_transition: StateTransition = - document_batch_transition.into(); - - let identity_public_key = identity - .loaded_public_keys - .values() - .next() - .expect("expected a key"); - - document_batch_transition - .sign_external( - identity_public_key, - signer, - Some(|_data_contract_id, _document_type_name| { - Ok(SecurityLevel::HIGH) - }), - ) - .expect("expected to sign"); - - operations.push(document_batch_transition); - } - } - OperationType::IdentityTopUp if !current_identities.is_empty() => { - let indices: Vec = - (0..current_identities.len()).choose_multiple(rng, count as usize); - let random_identities: Vec<&Identity> = indices - .into_iter() - .map(|index| ¤t_identities[index]) - .collect(); - - for random_identity in random_identities { - operations.push( - strategy_tests::transitions::create_identity_top_up_transition( - rng, - random_identity, - platform_version, - ), - ); - } - } - OperationType::IdentityUpdate(update_op) if !current_identities.is_empty() => { - let indices: Vec = - (0..current_identities.len()).choose_multiple(rng, count as usize); - for index in indices { - let random_identity = current_identities.get_mut(index).unwrap(); - match update_op { - IdentityUpdateOp::IdentityUpdateAddKeys(count) => { - let (state_transition, keys_to_add_at_end_block) = - strategy_tests::transitions::create_identity_update_transition_add_keys( - random_identity, - *count, - signer, - rng, - platform_version, - ); - operations.push(state_transition); - finalize_block_operations.push(IdentityAddKeys( - keys_to_add_at_end_block.0, - keys_to_add_at_end_block.1, - )) - } - IdentityUpdateOp::IdentityUpdateDisableKey(count) => { - let state_transition = - strategy_tests::transitions::create_identity_update_transition_disable_keys( - random_identity, - *count, - block_info.time_ms, - signer, - rng, - platform_version, - ); - if let Some(state_transition) = state_transition { - operations.push(state_transition); - } - } - } - } - } - OperationType::IdentityWithdrawal if !current_identities.is_empty() => { - let indices: Vec = - (0..current_identities.len()).choose_multiple(rng, count as usize); - for index in indices { - let random_identity = current_identities.get_mut(index).unwrap(); - let state_transition = - strategy_tests::transitions::create_identity_withdrawal_transition( - random_identity, - signer, - rng, - ); - operations.push(state_transition); - } - } - OperationType::IdentityTransfer if current_identities.len() > 1 => { - // chose 2 last identities - let indices: Vec = - vec![current_identities.len() - 2, current_identities.len() - 1]; - - let owner = current_identities.get(indices[0]).unwrap(); - let recipient = current_identities.get(indices[1]).unwrap(); - - let state_transition = - strategy_tests::transitions::create_identity_credit_transfer_transition( - owner, recipient, signer, 1000, - ); - operations.push(state_transition); - } - // OperationType::ContractCreate(new_fields_optional_count_range, new_fields_required_count_range, new_index_count_range, document_type_count) - // if !current_identities.is_empty() => { - // DataContract::; - // - // DocumentType::random_document() - // } - // OperationType::ContractUpdate(DataContractNewDocumentTypes(count)) - // if !current_identities.is_empty() => { - // - // } - _ => {} - } - } - } - (operations, finalize_block_operations) - } - pub fn state_transitions_for_block_with_new_identities( &mut self, platform: &Platform, block_info: &BlockInfo, current_identities: &mut Vec, + identity_nonce_counter: &mut BTreeMap, + contract_nonce_counter: &mut BTreeMap<(Identifier, Identifier), u64>, signer: &mut SimpleSigner, rng: &mut StdRng, ) -> (Vec, Vec) { @@ -968,12 +497,14 @@ impl NetworkStrategy { state_transitions.append(&mut contract_state_transitions); } else { // Don't do any state transitions on block 1 - let (mut document_state_transitions, mut add_to_finalize_block_operations) = self - .state_transitions_for_block( - platform, + let (mut document_state_transitions, mut add_to_finalize_block_operations) = + self.strategy.state_transitions_for_block( + &platform.drive, block_info, current_identities, signer, + identity_nonce_counter, + contract_nonce_counter, rng, platform_version, ); @@ -986,6 +517,7 @@ impl NetworkStrategy { current_identities, block_info.height, signer, + contract_nonce_counter, platform_version, ); state_transitions.append(&mut contract_update_state_transitions); @@ -1016,6 +548,10 @@ pub struct ChainExecutionOutcome<'a> { pub quorums: BTreeMap, pub current_quorum_hash: QuorumHash, pub current_proposer_versions: Option>, + /// Identity nonce counters + pub identity_nonce_counter: BTreeMap, + /// Identity Contract nonce counters + pub identity_contract_nonce_counter: BTreeMap<(Identifier, Identifier), IdentityNonce>, pub end_epoch_index: u16, pub end_time_ms: u64, pub strategy: NetworkStrategy, @@ -1043,6 +579,8 @@ pub struct ChainExecutionParameters { // the first option is if it is set // the second option is if we are even upgrading pub current_proposer_versions: Option>>, + pub current_identity_nonce_counter: BTreeMap, + pub current_identity_contract_nonce_counter: BTreeMap<(Identifier, Identifier), IdentityNonce>, pub start_time_ms: u64, pub current_time_ms: u64, } diff --git a/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs b/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs index 79796d00af..7eaaf64b0a 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs @@ -40,6 +40,7 @@ mod tests { times_per_block_range: Default::default(), chance_per_block: None, }, + identity_contract_nonce_gaps: None, signer: None, }, total_hpmns: 460, @@ -99,6 +100,8 @@ mod tests { current_quorum_hash, current_proposer_versions, end_time_ms, + identity_nonce_counter, + identity_contract_nonce_counter, .. } = run_chain_for_strategy( &mut platform, @@ -170,6 +173,8 @@ mod tests { quorums, current_quorum_hash, end_time_ms, + identity_nonce_counter, + identity_contract_nonce_counter, .. } = continue_chain_for_strategy( abci_app, @@ -181,6 +186,8 @@ mod tests { quorums, current_quorum_hash, current_proposer_versions: Some(current_proposer_versions.clone()), + current_identity_nonce_counter: identity_nonce_counter, + current_identity_contract_nonce_counter: identity_contract_nonce_counter, start_time_ms: 1681094380000, current_time_ms: end_time_ms, }, @@ -243,6 +250,8 @@ mod tests { quorums, current_quorum_hash, current_proposer_versions: Some(current_proposer_versions), + current_identity_nonce_counter: identity_nonce_counter, + current_identity_contract_nonce_counter: identity_contract_nonce_counter, start_time_ms: 1681094380000, current_time_ms: end_time_ms, }, @@ -309,6 +318,7 @@ mod tests { times_per_block_range: Default::default(), chance_per_block: None, }, + identity_contract_nonce_gaps: None, signer: None, }, total_hpmns: 50, @@ -365,6 +375,8 @@ mod tests { current_quorum_hash, current_proposer_versions, end_time_ms, + identity_nonce_counter, + identity_contract_nonce_counter, .. } = run_chain_for_strategy( &mut platform, @@ -433,6 +445,8 @@ mod tests { quorums, current_quorum_hash, end_time_ms, + identity_nonce_counter, + identity_contract_nonce_counter, .. } = continue_chain_for_strategy( abci_app, @@ -444,6 +458,8 @@ mod tests { quorums, current_quorum_hash, current_proposer_versions: Some(current_proposer_versions.clone()), + current_identity_nonce_counter: identity_nonce_counter, + current_identity_contract_nonce_counter: identity_contract_nonce_counter, start_time_ms: 1681094380000, current_time_ms: end_time_ms, }, @@ -506,6 +522,8 @@ mod tests { quorums, current_quorum_hash, current_proposer_versions: Some(current_proposer_versions), + current_identity_nonce_counter: identity_nonce_counter, + current_identity_contract_nonce_counter: identity_contract_nonce_counter, start_time_ms: 1681094380000, current_time_ms: end_time_ms, }, @@ -571,6 +589,7 @@ mod tests { times_per_block_range: Default::default(), chance_per_block: None, }, + identity_contract_nonce_gaps: None, signer: None, }, total_hpmns: 120, @@ -630,6 +649,8 @@ mod tests { current_quorum_hash, current_proposer_versions, end_time_ms, + identity_nonce_counter, + identity_contract_nonce_counter, .. } = run_chain_for_strategy( &mut platform, @@ -693,7 +714,10 @@ mod tests { proposers, quorums, current_quorum_hash, + end_time_ms, + identity_nonce_counter, + identity_contract_nonce_counter, .. } = continue_chain_for_strategy( abci_app, @@ -705,6 +729,8 @@ mod tests { quorums, current_quorum_hash, current_proposer_versions: Some(current_proposer_versions.clone()), + current_identity_nonce_counter: identity_nonce_counter, + current_identity_contract_nonce_counter: identity_contract_nonce_counter, start_time_ms: 1681094380000, current_time_ms: end_time_ms, }, @@ -769,6 +795,8 @@ mod tests { quorums, current_quorum_hash, current_proposer_versions: Some(current_proposer_versions), + current_identity_nonce_counter: identity_nonce_counter, + current_identity_contract_nonce_counter: identity_contract_nonce_counter, start_time_ms: 1681094380000, current_time_ms: end_time_ms, }, @@ -831,6 +859,7 @@ mod tests { times_per_block_range: Default::default(), chance_per_block: None, }, + identity_contract_nonce_gaps: None, signer: None, }, total_hpmns: 200, @@ -889,6 +918,8 @@ mod tests { current_quorum_hash, current_proposer_versions, end_time_ms, + identity_nonce_counter, + identity_contract_nonce_counter, .. } = run_chain_for_strategy( &mut platform, @@ -942,7 +973,10 @@ mod tests { proposers, quorums, current_quorum_hash, + end_time_ms, + identity_nonce_counter, + identity_contract_nonce_counter, .. } = continue_chain_for_strategy( abci_app, @@ -954,6 +988,8 @@ mod tests { quorums, current_quorum_hash, current_proposer_versions: Some(current_proposer_versions), + current_identity_nonce_counter: identity_nonce_counter, + current_identity_contract_nonce_counter: identity_contract_nonce_counter, start_time_ms: 1681094380000, current_time_ms: end_time_ms, }, @@ -1008,6 +1044,7 @@ mod tests { times_per_block_range: Default::default(), chance_per_block: None, }, + identity_contract_nonce_gaps: None, signer: None, }, total_hpmns: 200, @@ -1047,7 +1084,10 @@ mod tests { quorums, current_quorum_hash, current_proposer_versions, + end_time_ms, + identity_nonce_counter, + identity_contract_nonce_counter, .. } = continue_chain_for_strategy( abci_app, @@ -1059,6 +1099,8 @@ mod tests { quorums, current_quorum_hash, current_proposer_versions: None, //restart the proposer versions + current_identity_nonce_counter: identity_nonce_counter, + current_identity_contract_nonce_counter: identity_contract_nonce_counter, start_time_ms: 1681094380000, current_time_ms: end_time_ms, }, @@ -1122,6 +1164,8 @@ mod tests { quorums, current_quorum_hash, current_proposer_versions: Some(current_proposer_versions), + current_identity_nonce_counter: identity_nonce_counter, + current_identity_contract_nonce_counter: identity_contract_nonce_counter, start_time_ms: 1681094380000, current_time_ms: end_time_ms, }, @@ -1189,6 +1233,7 @@ mod tests { times_per_block_range: Default::default(), chance_per_block: None, }, + identity_contract_nonce_gaps: None, signer: None, }, total_hpmns: 200, @@ -1250,6 +1295,8 @@ mod tests { quorums, current_quorum_hash, end_time_ms, + identity_nonce_counter, + identity_contract_nonce_counter, .. } = run_chain_for_strategy(&mut platform, 1400, strategy, config.clone(), 15); { @@ -1301,6 +1348,7 @@ mod tests { times_per_block_range: Default::default(), chance_per_block: None, }, + identity_contract_nonce_gaps: None, signer: None, }, total_hpmns: 200, @@ -1347,6 +1395,8 @@ mod tests { quorums, current_quorum_hash, current_proposer_versions: None, + current_identity_nonce_counter: identity_nonce_counter, + current_identity_contract_nonce_counter: identity_contract_nonce_counter, start_time_ms: 1681094380000, current_time_ms: end_time_ms, }, diff --git a/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs b/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs index bc4efa64c7..d3bcbcbbcd 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs @@ -222,18 +222,37 @@ pub(crate) fn verify_state_transitions_were_or_were_not_executed( proofs_request .documents .push(get_proofs_request_v0::DocumentRequest { - contract_id: transition.base().data_contract_id().to_vec(), - document_type: transition.base().document_type_name().clone(), + contract_id: transition + .base() + .expect("expected a base for the document transition") + .data_contract_id() + .to_vec(), + document_type: transition + .base() + .expect("expected a base for the document transition") + .document_type_name() + .clone(), document_type_keeps_history: transition .base() + .expect("expected a base for the document transition") .data_contract_fetch_info() .contract .document_type_for_name( - transition.base().document_type_name().as_str(), + transition + .base() + .expect( + "expected a base for the document transition", + ) + .document_type_name() + .as_str(), ) .expect("get document type") .documents_keep_history(), - document_id: transition.base().id().to_vec(), + document_id: transition + .base() + .expect("expected a base for the document transition") + .id() + .to_vec(), }); }); let versioned_request = GetProofsRequest { @@ -259,14 +278,17 @@ pub(crate) fn verify_state_transitions_were_or_were_not_executed( for document_transition_action in documents_batch_transition.transitions().iter() { - let contract_fetch_info = - document_transition_action.base().data_contract_fetch_info(); + let contract_fetch_info = document_transition_action + .base() + .expect("expected a base for the document transition") + .data_contract_fetch_info(); let document_type = contract_fetch_info .contract .document_type_for_name( document_transition_action .base() + .expect("expected a base for the document transition") .document_type_name() .as_str(), ) @@ -274,14 +296,20 @@ pub(crate) fn verify_state_transitions_were_or_were_not_executed( let query = SingleDocumentDriveQuery { contract_id: document_transition_action .base() + .expect("expected a base for the document transition") .data_contract_id() .into_buffer(), document_type_name: document_transition_action .base() + .expect("expected a base for the document transition") .document_type_name() .clone(), document_type_keeps_history: document_type.documents_keep_history(), - document_id: document_transition_action.base().id().into_buffer(), + document_id: document_transition_action + .base() + .expect("expected a base for the document transition") + .id() + .into_buffer(), block_time_ms: None, //None because we want latest }; @@ -372,6 +400,9 @@ pub(crate) fn verify_state_transitions_were_or_were_not_executed( // we expect no document assert!(document.is_none()); } + DocumentTransitionAction::BumpIdentityDataContractNonce(_) => { + panic!("we should not have a bump identity data contract nonce"); + } } } } @@ -683,6 +714,8 @@ pub(crate) fn verify_state_transitions_were_or_were_not_executed( ); } } + StateTransitionAction::BumpIdentityNonceAction(_) => {} + StateTransitionAction::BumpIdentityDataContractNonceAction(_) => {} } } else { // if we don't have an action this means there was a problem in the validation of the state transition diff --git a/packages/rs-drive-proof-verifier/src/proof.rs b/packages/rs-drive-proof-verifier/src/proof.rs index 8cc2ab028d..82251a7442 100644 --- a/packages/rs-drive-proof-verifier/src/proof.rs +++ b/packages/rs-drive-proof-verifier/src/proof.rs @@ -1,4 +1,4 @@ -use crate::{types::*, ContextProvider, Error}; +use crate::{types, types::*, ContextProvider, Error}; use dapi_grpc::platform::v0::get_protocol_version_upgrade_vote_status_request::{ self, GetProtocolVersionUpgradeVoteStatusRequestV0, }; @@ -7,7 +7,8 @@ use dapi_grpc::platform::v0::{ get_data_contract_history_request, get_data_contract_request, get_data_contracts_request, get_epochs_info_request, get_identity_balance_and_revision_request, get_identity_balance_request, get_identity_by_public_key_hash_request, - get_identity_keys_request, get_identity_request, GetProtocolVersionUpgradeStateRequest, + get_identity_contract_nonce_request, get_identity_keys_request, get_identity_nonce_request, + get_identity_request, GetProtocolVersionUpgradeStateRequest, GetProtocolVersionUpgradeStateResponse, GetProtocolVersionUpgradeVoteStatusRequest, GetProtocolVersionUpgradeVoteStatusResponse, }; @@ -375,6 +376,108 @@ fn parse_key_request_type(request: &Option) -> Result for IdentityNonceFetcher { + type Request = platform::GetIdentityNonceRequest; + type Response = platform::GetIdentityNonceResponse; + + fn maybe_from_proof<'a, I: Into, O: Into>( + request: I, + response: O, + platform_version: &PlatformVersion, + + provider: &'a dyn ContextProvider, + ) -> Result, Error> + where + IdentityNonceFetcher: 'a, + { + let request: Self::Request = request.into(); + let response: Self::Response = response.into(); + + // Parse response to read proof and metadata + let proof = response.proof().or(Err(Error::NoProofInResult))?; + + let mtd = response.metadata().or(Err(Error::EmptyResponseMetadata))?; + + let identity_id = match request.version.ok_or(Error::EmptyVersion)? { + get_identity_nonce_request::Version::V0(v0) => { + Ok::( + Identifier::from_bytes(&v0.identity_id).map_err(|e| Error::ProtocolError { + error: e.to_string(), + })?, + ) + } + }?; + + // Extract content from proof and verify Drive/GroveDB proofs + let (root_hash, maybe_nonce) = Drive::verify_identity_nonce( + &proof.grovedb_proof, + identity_id.into_buffer(), + false, + platform_version, + ) + .map_err(|e| Error::DriveError { + error: e.to_string(), + })?; + + verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + + Ok(maybe_nonce.map(types::IdentityNonceFetcher)) + } +} + +impl FromProof for IdentityContractNonceFetcher { + type Request = platform::GetIdentityContractNonceRequest; + type Response = platform::GetIdentityContractNonceResponse; + + fn maybe_from_proof<'a, I: Into, O: Into>( + request: I, + response: O, + platform_version: &PlatformVersion, + + provider: &'a dyn ContextProvider, + ) -> Result, Error> + where + IdentityContractNonceFetcher: 'a, + { + let request: Self::Request = request.into(); + let response: Self::Response = response.into(); + + // Parse response to read proof and metadata + let proof = response.proof().or(Err(Error::NoProofInResult))?; + + let mtd = response.metadata().or(Err(Error::EmptyResponseMetadata))?; + + let (identity_id, contract_id) = match request.version.ok_or(Error::EmptyVersion)? { + get_identity_contract_nonce_request::Version::V0(v0) => { + Ok::<(dpp::identifier::Identifier, dpp::identifier::Identifier), Error>(( + Identifier::from_bytes(&v0.identity_id).map_err(|e| Error::ProtocolError { + error: e.to_string(), + })?, + Identifier::from_bytes(&v0.contract_id).map_err(|e| Error::ProtocolError { + error: e.to_string(), + })?, + )) + } + }?; + + // Extract content from proof and verify Drive/GroveDB proofs + let (root_hash, maybe_identity) = Drive::verify_identity_contract_nonce( + &proof.grovedb_proof, + identity_id.into_buffer(), + contract_id.into_buffer(), + false, + platform_version, + ) + .map_err(|e| Error::DriveError { + error: e.to_string(), + })?; + + verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + + Ok(maybe_identity.map(types::IdentityContractNonceFetcher)) + } +} + impl FromProof for IdentityBalance { type Request = platform::GetIdentityBalanceRequest; type Response = platform::GetIdentityBalanceResponse; diff --git a/packages/rs-drive-proof-verifier/src/types.rs b/packages/rs-drive-proof-verifier/src/types.rs index 6b4f99adc3..f59e487eb9 100644 --- a/packages/rs-drive-proof-verifier/src/types.rs +++ b/packages/rs-drive-proof-verifier/src/types.rs @@ -7,6 +7,7 @@ use std::collections::BTreeMap; +use dpp::prelude::IdentityNonce; pub use dpp::version::ProtocolVersionVoteCount; use dpp::{ block::{epoch::EpochIndex, extended_epoch_info::ExtendedEpochInfo}, @@ -48,6 +49,14 @@ pub type IdentityBalance = u64; /// Identity balance and revision of the identity. pub type IdentityBalanceAndRevision = (u64, Revision); +/// An identity nonce +#[derive(Debug)] +pub struct IdentityNonceFetcher(pub IdentityNonce); + +/// An identity contract nonce +#[derive(Debug)] +pub struct IdentityContractNonceFetcher(pub IdentityNonce); + /// Public keys belonging to some identity. /// /// Map of [key IDs](KeyID) to the [public key](IdentityPublicKey). diff --git a/packages/rs-drive/Cargo.toml b/packages/rs-drive/Cargo.toml index 4c49425842..4ef1ca8c89 100644 --- a/packages/rs-drive/Cargo.toml +++ b/packages/rs-drive/Cargo.toml @@ -67,7 +67,7 @@ name = "benchmarks" harness = false [features] -default = ["full", "verify"] +default = ["full", "verify", "fixtures-and-mocks"] fixtures-and-mocks = ["full", "dpp/fixtures-and-mocks", "verify"] full = [ "grovedb/estimated_costs", diff --git a/packages/rs-drive/src/drive/batch/drive_op_batch/identity.rs b/packages/rs-drive/src/drive/batch/drive_op_batch/identity.rs index a05cf0940f..491a78faf3 100644 --- a/packages/rs-drive/src/drive/batch/drive_op_batch/identity.rs +++ b/packages/rs-drive/src/drive/batch/drive_op_batch/identity.rs @@ -4,8 +4,9 @@ use crate::error::Error; use crate::fee::op::LowLevelDriveOperation; use dpp::block::block_info::BlockInfo; use dpp::identity::{Identity, IdentityPublicKey, KeyID, TimestampMillis}; -use dpp::prelude::Revision; +use dpp::prelude::{IdentityNonce, Revision}; +use crate::drive::identity::update::methods::merge_identity_nonce::MergeIdentityContractNonceResultToResult; use dpp::version::PlatformVersion; use grovedb::batch::KeyInfoPath; use grovedb::{EstimatedLayerInformation, TransactionArg}; @@ -75,6 +76,24 @@ pub enum IdentityOperationType { /// The revision we are updating to revision: Revision, }, + + /// Updates an identities nonce for a specific contract. + UpdateIdentityNonce { + /// The revision id + identity_id: [u8; 32], + /// The nonce we are updating to + nonce: IdentityNonce, + }, + + /// Updates an identities nonce for a specific contract. + UpdateIdentityContractNonce { + /// The revision id + identity_id: [u8; 32], + /// The contract id + contract_id: [u8; 32], + /// The nonce we are updating to + nonce: IdentityNonce, + }, } impl DriveLowLevelOperationConverter for IdentityOperationType { @@ -88,7 +107,6 @@ impl DriveLowLevelOperationConverter for IdentityOperationType { transaction: TransactionArg, platform_version: &PlatformVersion, ) -> Result, Error> { - let _drive_version = &platform_version.drive; match self { IdentityOperationType::AddNewIdentity { identity, @@ -167,6 +185,35 @@ impl DriveLowLevelOperationConverter for IdentityOperationType { estimated_costs_only_with_layer_info, platform_version, )?]), + IdentityOperationType::UpdateIdentityContractNonce { + identity_id, + contract_id, + nonce, + } => { + let (result, operations) = drive.merge_identity_contract_nonce_operations( + identity_id, + contract_id, + nonce, + block_info, + estimated_costs_only_with_layer_info, + transaction, + platform_version, + )?; + result.to_result()?; + Ok(operations) + } + IdentityOperationType::UpdateIdentityNonce { identity_id, nonce } => { + let (result, operations) = drive.merge_identity_nonce_operations( + identity_id, + nonce, + block_info, + estimated_costs_only_with_layer_info, + transaction, + platform_version, + )?; + result.to_result()?; + Ok(operations) + } } } } diff --git a/packages/rs-drive/src/drive/batch/transitions/contract/data_contract_update_transition.rs b/packages/rs-drive/src/drive/batch/transitions/contract/data_contract_update_transition.rs index b031dcb564..bdb9194db3 100644 --- a/packages/rs-drive/src/drive/batch/transitions/contract/data_contract_update_transition.rs +++ b/packages/rs-drive/src/drive/batch/transitions/contract/data_contract_update_transition.rs @@ -1,9 +1,10 @@ use crate::drive::batch::transitions::DriveHighLevelOperationConverter; -use crate::drive::batch::DriveOperation::DataContractOperation; -use crate::drive::batch::{DataContractOperationType, DriveOperation}; +use crate::drive::batch::DriveOperation::{DataContractOperation, IdentityOperation}; +use crate::drive::batch::{DataContractOperationType, DriveOperation, IdentityOperationType}; use crate::error::Error; use crate::state_transition_action::contract::data_contract_update::DataContractUpdateTransitionAction; use dpp::block::epoch::Epoch; +use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::version::PlatformVersion; use std::borrow::Cow; @@ -15,6 +16,13 @@ impl DriveHighLevelOperationConverter for DataContractUpdateTransitionAction { ) -> Result>, Error> { let mut drive_operations = vec![]; // We must create the contract + drive_operations.push(IdentityOperation( + IdentityOperationType::UpdateIdentityContractNonce { + identity_id: self.data_contract_ref().owner_id().into_buffer(), + contract_id: self.data_contract_ref().id().into_buffer(), + nonce: self.identity_contract_nonce(), + }, + )); drive_operations.push(DataContractOperation( DataContractOperationType::ApplyContract { contract: Cow::Owned(self.data_contract()), diff --git a/packages/rs-drive/src/drive/batch/transitions/document/document_create_transition.rs b/packages/rs-drive/src/drive/batch/transitions/document/document_create_transition.rs index faf83b3b90..cca4a7dee6 100644 --- a/packages/rs-drive/src/drive/batch/transitions/document/document_create_transition.rs +++ b/packages/rs-drive/src/drive/batch/transitions/document/document_create_transition.rs @@ -1,6 +1,6 @@ use crate::drive::batch::transitions::document::DriveHighLevelDocumentOperationConverter; -use crate::drive::batch::DriveOperation::DocumentOperation; -use crate::drive::batch::{DocumentOperationType, DriveOperation}; +use crate::drive::batch::DriveOperation::{DocumentOperation, IdentityOperation}; +use crate::drive::batch::{DocumentOperationType, DriveOperation, IdentityOperationType}; use crate::drive::flags::StorageFlags; use crate::drive::object_size_info::DocumentInfo::DocumentOwnedInfo; use crate::drive::object_size_info::OwnedDocumentInfo; @@ -25,13 +25,20 @@ impl DriveHighLevelDocumentOperationConverter for DocumentCreateTransitionAction let document_type_name = self.base().document_type_name().clone(); + let identity_contract_nonce = self.base().identity_contract_nonce(); + let document = Document::try_from_owned_create_transition_action(self, owner_id, platform_version)?; let storage_flags = StorageFlags::new_single_epoch(epoch.index, Some(owner_id.to_buffer())); - Ok(vec![DocumentOperation( - DocumentOperationType::AddDocument { + Ok(vec![ + IdentityOperation(IdentityOperationType::UpdateIdentityContractNonce { + identity_id: owner_id.into_buffer(), + contract_id: data_contract_id.into_buffer(), + nonce: identity_contract_nonce, + }), + DocumentOperation(DocumentOperationType::AddDocument { owned_document_info: OwnedDocumentInfo { document_info: DocumentOwnedInfo((document, Some(Cow::Owned(storage_flags)))), owner_id: Some(owner_id.into_buffer()), @@ -39,7 +46,7 @@ impl DriveHighLevelDocumentOperationConverter for DocumentCreateTransitionAction contract_id: data_contract_id, document_type_name: Cow::Owned(document_type_name), override_document: false, - }, - )]) + }), + ]) } } diff --git a/packages/rs-drive/src/drive/batch/transitions/document/document_delete_transition.rs b/packages/rs-drive/src/drive/batch/transitions/document/document_delete_transition.rs index b65b0d6b4a..4cca6387ab 100644 --- a/packages/rs-drive/src/drive/batch/transitions/document/document_delete_transition.rs +++ b/packages/rs-drive/src/drive/batch/transitions/document/document_delete_transition.rs @@ -1,7 +1,7 @@ use crate::drive::batch::transitions::document::DriveHighLevelDocumentOperationConverter; -use crate::drive::batch::DriveOperation::DocumentOperation; -use crate::drive::batch::{DocumentOperationType, DriveOperation}; +use crate::drive::batch::DriveOperation::{DocumentOperation, IdentityOperation}; +use crate::drive::batch::{DocumentOperationType, DriveOperation, IdentityOperationType}; use crate::error::Error; use dpp::block::epoch::Epoch; @@ -17,12 +17,23 @@ impl DriveHighLevelDocumentOperationConverter for DocumentDeleteTransitionAction fn into_high_level_document_drive_operations<'b>( self, _epoch: &Epoch, - _owner_id: Identifier, + owner_id: Identifier, _platform_version: &PlatformVersion, ) -> Result>, Error> { let base = self.base_owned(); + let data_contract_id = base.data_contract_id(); + + let identity_contract_nonce = base.identity_contract_nonce(); + let mut drive_operations = vec![]; + drive_operations.push(IdentityOperation( + IdentityOperationType::UpdateIdentityContractNonce { + identity_id: owner_id.into_buffer(), + contract_id: data_contract_id.into_buffer(), + nonce: identity_contract_nonce, + }, + )); drive_operations.push(DocumentOperation( DocumentOperationType::DeleteDocumentOfNamedTypeForContractId { document_id: base.id().to_buffer(), diff --git a/packages/rs-drive/src/drive/batch/transitions/document/document_transition.rs b/packages/rs-drive/src/drive/batch/transitions/document/document_transition.rs index 550659ebea..bb37226d10 100644 --- a/packages/rs-drive/src/drive/batch/transitions/document/document_transition.rs +++ b/packages/rs-drive/src/drive/batch/transitions/document/document_transition.rs @@ -1,4 +1,5 @@ use crate::drive::batch::transitions::document::DriveHighLevelDocumentOperationConverter; +use crate::drive::batch::transitions::DriveHighLevelOperationConverter; use crate::drive::batch::DriveOperation; use crate::error::Error; use crate::state_transition_action::document::documents_batch::document_transition::DocumentTransitionAction; @@ -35,6 +36,10 @@ impl DriveHighLevelDocumentOperationConverter for DocumentTransitionAction { platform_version, ) } + DocumentTransitionAction::BumpIdentityDataContractNonce( + bump_identity_contract_nonce_action, + ) => bump_identity_contract_nonce_action + .into_high_level_drive_operations(epoch, platform_version), } } } diff --git a/packages/rs-drive/src/drive/batch/transitions/document/document_update_transition.rs b/packages/rs-drive/src/drive/batch/transitions/document/document_update_transition.rs index 4f8269e453..d7c2067063 100644 --- a/packages/rs-drive/src/drive/batch/transitions/document/document_update_transition.rs +++ b/packages/rs-drive/src/drive/batch/transitions/document/document_update_transition.rs @@ -1,6 +1,6 @@ use crate::drive::batch::transitions::document::DriveHighLevelDocumentOperationConverter; -use crate::drive::batch::DriveOperation::DocumentOperation; -use crate::drive::batch::{DocumentOperationType, DriveOperation}; +use crate::drive::batch::DriveOperation::{DocumentOperation, IdentityOperation}; +use crate::drive::batch::{DocumentOperationType, DriveOperation, IdentityOperationType}; use crate::drive::flags::StorageFlags; use crate::drive::object_size_info::DocumentInfo::DocumentOwnedInfo; use crate::drive::object_size_info::OwnedDocumentInfo; @@ -23,12 +23,20 @@ impl DriveHighLevelDocumentOperationConverter for DocumentReplaceTransitionActio ) -> Result>, Error> { let data_contract_id = self.base().data_contract_id(); let document_type_name = self.base().document_type_name().clone(); + let identity_contract_nonce = self.base().identity_contract_nonce(); let document = Document::try_from_owned_replace_transition_action(self, owner_id, platform_version)?; let storage_flags = StorageFlags::new_single_epoch(epoch.index, Some(owner_id.to_buffer())); let mut drive_operations = vec![]; + drive_operations.push(IdentityOperation( + IdentityOperationType::UpdateIdentityContractNonce { + identity_id: owner_id.into_buffer(), + contract_id: data_contract_id.into_buffer(), + nonce: identity_contract_nonce, + }, + )); drive_operations.push(DocumentOperation(DocumentOperationType::UpdateDocument { owned_document_info: OwnedDocumentInfo { document_info: DocumentOwnedInfo((document, Some(Cow::Owned(storage_flags)))), diff --git a/packages/rs-drive/src/drive/batch/transitions/identity/identity_credit_transfer.rs b/packages/rs-drive/src/drive/batch/transitions/identity/identity_credit_transfer.rs index e0b38de445..0c9d7a2fd1 100644 --- a/packages/rs-drive/src/drive/batch/transitions/identity/identity_credit_transfer.rs +++ b/packages/rs-drive/src/drive/batch/transitions/identity/identity_credit_transfer.rs @@ -16,12 +16,12 @@ impl DriveHighLevelOperationConverter for IdentityCreditTransferTransitionAction let recipient_id = self.recipient_id(); let identity_id = self.identity_id(); let transfer_amount = self.transfer_amount(); - let revision = self.revision(); + let nonce = self.nonce(); let drive_operations = vec![ - IdentityOperation(IdentityOperationType::UpdateIdentityRevision { + IdentityOperation(IdentityOperationType::UpdateIdentityNonce { identity_id: identity_id.into_buffer(), - revision, + nonce, }), IdentityOperation(IdentityOperationType::RemoveFromIdentityBalance { identity_id: identity_id.to_buffer(), diff --git a/packages/rs-drive/src/drive/batch/transitions/identity/identity_credit_withdrawal_transition.rs b/packages/rs-drive/src/drive/batch/transitions/identity/identity_credit_withdrawal_transition.rs index b9034fcc18..0d2d27fdd8 100644 --- a/packages/rs-drive/src/drive/batch/transitions/identity/identity_credit_withdrawal_transition.rs +++ b/packages/rs-drive/src/drive/batch/transitions/identity/identity_credit_withdrawal_transition.rs @@ -17,7 +17,7 @@ impl DriveHighLevelOperationConverter for IdentityCreditWithdrawalTransitionActi _platform_version: &PlatformVersion, ) -> Result>, Error> { let identity_id = self.identity_id(); - let revision = self.revision(); + let nonce = self.nonce(); let balance_to_remove = self.amount(); let prepared_withdrawal_document = self.prepared_withdrawal_document_owned(); @@ -26,9 +26,9 @@ impl DriveHighLevelOperationConverter for IdentityCreditWithdrawalTransitionActi identity_id: identity_id.to_buffer(), balance_to_remove, }), - IdentityOperation(IdentityOperationType::UpdateIdentityRevision { + IdentityOperation(IdentityOperationType::UpdateIdentityNonce { identity_id: identity_id.into_buffer(), - revision, + nonce, }), DocumentOperation(DocumentOperationType::AddWithdrawalDocument { owned_document_info: OwnedDocumentInfo { diff --git a/packages/rs-drive/src/drive/batch/transitions/mod.rs b/packages/rs-drive/src/drive/batch/transitions/mod.rs index 0244e016e1..b9165a98f6 100644 --- a/packages/rs-drive/src/drive/batch/transitions/mod.rs +++ b/packages/rs-drive/src/drive/batch/transitions/mod.rs @@ -6,7 +6,9 @@ mod contract; mod document; mod identity; +mod system; +use crate::drive::batch::transitions::document::DriveHighLevelDocumentOperationConverter; use crate::drive::batch::DriveOperation; use crate::error::Error; use crate::state_transition_action::StateTransitionAction; @@ -58,6 +60,14 @@ impl<'s> DriveHighLevelOperationConverter for StateTransitionAction { identity_credit_transfer_transition, ) => identity_credit_transfer_transition .into_high_level_drive_operations(epoch, platform_version), + StateTransitionAction::BumpIdentityNonceAction(bump_identity_nonce_transition) => { + bump_identity_nonce_transition + .into_high_level_drive_operations(epoch, platform_version) + } + StateTransitionAction::BumpIdentityDataContractNonceAction( + bump_identity_data_contract_nonce_transition, + ) => bump_identity_data_contract_nonce_transition + .into_high_level_drive_operations(epoch, platform_version), } } } diff --git a/packages/rs-drive/src/drive/batch/transitions/system/bump_identity_data_contract_nonce.rs b/packages/rs-drive/src/drive/batch/transitions/system/bump_identity_data_contract_nonce.rs new file mode 100644 index 0000000000..297105fdb3 --- /dev/null +++ b/packages/rs-drive/src/drive/batch/transitions/system/bump_identity_data_contract_nonce.rs @@ -0,0 +1,30 @@ +use crate::drive::batch::transitions::DriveHighLevelOperationConverter; +use crate::drive::batch::DriveOperation::IdentityOperation; +use crate::drive::batch::{DriveOperation, IdentityOperationType}; +use crate::error::Error; +use crate::state_transition_action::system::bump_identity_data_contract_nonce_action::{ + BumpIdentityDataContractNonceAction, BumpIdentityDataContractNonceActionAccessorsV0, +}; +use dpp::block::epoch::Epoch; +use dpp::version::PlatformVersion; + +impl DriveHighLevelOperationConverter for BumpIdentityDataContractNonceAction { + fn into_high_level_drive_operations<'b>( + self, + _epoch: &Epoch, + _platform_version: &PlatformVersion, + ) -> Result>, Error> { + let identity_id = self.identity_id(); + let data_contract_id = self.data_contract_id(); + + let identity_contract_nonce = self.identity_contract_nonce(); + + Ok(vec![IdentityOperation( + IdentityOperationType::UpdateIdentityContractNonce { + identity_id: identity_id.into_buffer(), + contract_id: data_contract_id.into_buffer(), + nonce: identity_contract_nonce, + }, + )]) + } +} diff --git a/packages/rs-drive/src/drive/batch/transitions/system/bump_identity_nonce.rs b/packages/rs-drive/src/drive/batch/transitions/system/bump_identity_nonce.rs new file mode 100644 index 0000000000..6545149b06 --- /dev/null +++ b/packages/rs-drive/src/drive/batch/transitions/system/bump_identity_nonce.rs @@ -0,0 +1,28 @@ +use crate::drive::batch::transitions::DriveHighLevelOperationConverter; +use crate::drive::batch::DriveOperation::IdentityOperation; +use crate::drive::batch::{DriveOperation, IdentityOperationType}; +use crate::error::Error; +use crate::state_transition_action::system::bump_identity_nonce_action::{ + BumpIdentityNonceAction, BumpIdentityNonceActionAccessorsV0, +}; +use dpp::block::epoch::Epoch; +use dpp::version::PlatformVersion; + +impl DriveHighLevelOperationConverter for BumpIdentityNonceAction { + fn into_high_level_drive_operations<'b>( + self, + _epoch: &Epoch, + _platform_version: &PlatformVersion, + ) -> Result>, Error> { + let identity_id = self.identity_id(); + + let identity_nonce = self.identity_nonce(); + + Ok(vec![IdentityOperation( + IdentityOperationType::UpdateIdentityNonce { + identity_id: identity_id.into_buffer(), + nonce: identity_nonce, + }, + )]) + } +} diff --git a/packages/rs-drive/src/drive/batch/transitions/system/mod.rs b/packages/rs-drive/src/drive/batch/transitions/system/mod.rs new file mode 100644 index 0000000000..3c4bca029a --- /dev/null +++ b/packages/rs-drive/src/drive/batch/transitions/system/mod.rs @@ -0,0 +1,2 @@ +mod bump_identity_data_contract_nonce; +mod bump_identity_nonce; diff --git a/packages/rs-drive/src/drive/identity/balance/update.rs b/packages/rs-drive/src/drive/identity/balance/update.rs index 6500ad8050..0edf686f52 100644 --- a/packages/rs-drive/src/drive/identity/balance/update.rs +++ b/packages/rs-drive/src/drive/identity/balance/update.rs @@ -157,7 +157,7 @@ mod tests { fee_result, FeeResult { storage_fee: 0, - processing_fee: 1176280, + processing_fee: 1205880, removed_bytes_from_system: 0, ..Default::default() } @@ -239,7 +239,7 @@ mod tests { fee_result, FeeResult { storage_fee: 0, - processing_fee: 849550, + processing_fee: 879150, removed_bytes_from_system: 0, ..Default::default() } diff --git a/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/fetch_identity_contract_nonce/mod.rs b/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/fetch_identity_contract_nonce/mod.rs new file mode 100644 index 0000000000..1b04e5100c --- /dev/null +++ b/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/fetch_identity_contract_nonce/mod.rs @@ -0,0 +1,157 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::{drive::DriveError, Error}; +use crate::fee::op::LowLevelDriveOperation; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::prelude::{IdentityNonce, Revision}; + +use dpp::version::PlatformVersion; +use grovedb::TransactionArg; + +impl Drive { + /// Fetches the Identity's contract document nonce from the backing store + /// + /// This function uses the versioning system to call the appropriate handler based on the provided `DriveVersion`. + /// + /// # Arguments + /// + /// * `identity_id` - Identity Id to fetch. + /// * `contract_id` - For Contract Id to fetch. + /// * `apply` - If `true`, the changes are applied, otherwise only the cost is estimated. + /// * `transaction` - Transaction arguments. + /// * `platform_version` - A reference to the platform version. + /// + /// # Returns + /// + /// Returns a `Result` containing an `Option` for the Identity's revision, otherwise an `Error` if the operation fails or the version is not supported. + pub fn fetch_identity_contract_nonce( + &self, + identity_id: [u8; 32], + contract_id: [u8; 32], + apply: bool, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result, Error> { + match platform_version + .drive + .methods + .identity + .fetch + .attributes + .identity_contract_nonce + { + 0 => self.fetch_identity_contract_nonce_v0( + identity_id, + contract_id, + apply, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "fetch_identity_contract_nonce".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// Creates the operations to get Identity's contract nonce from the backing store. + /// + /// This function uses the versioning system to call the appropriate handler based on the provided `DriveVersion`. + /// + /// # Arguments + /// + /// * `identity_id` - Identity Id to fetch. + /// * `contract_id` - For Contract Id to fetch. + /// * `apply` - If `true`, the changes are applied, otherwise only the cost is estimated. + /// * `transaction` - Transaction arguments. + /// * `drive_operations` - A mutable reference to a vector of low-level drive operations. + /// * `platform_version` - A reference to the platform version. + /// + /// # Returns + /// + /// Returns a `Result` containing an `Option` for the Identity's revision, otherwise an `Error` if the operation fails or the version is not supported. + pub(crate) fn fetch_identity_contract_nonce_operations( + &self, + identity_id: [u8; 32], + contract_id: [u8; 32], + apply: bool, + transaction: TransactionArg, + drive_operations: &mut Vec, + platform_version: &PlatformVersion, + ) -> Result, Error> { + match platform_version + .drive + .methods + .identity + .fetch + .attributes + .identity_contract_nonce + { + 0 => self.fetch_identity_contract_nonce_operations_v0( + identity_id, + contract_id, + apply, + transaction, + drive_operations, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "fetch_identity_contract_nonce_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// Fetches the Identity's contract nonce from the backing store with its associated fees. + /// + /// This function uses the versioning system to call the appropriate handler based on the provided `DriveVersion`. + /// + /// # Arguments + /// + /// * `identity_id` - Identity Id to fetch. + /// * `contract_id` - For Contract Id to fetch. + /// * `block_info` - Information about the block. + /// * `apply` - If `true`, the changes are applied, otherwise only the cost is estimated. + /// * `transaction` - Transaction arguments. + /// * `platform_version` - A reference to the platform version. + /// + /// # Returns + /// + /// Returns a `Result` containing an `Option` for the Identity's revision and the `FeeResult`, otherwise an `Error` if the operation fails or the version is not supported. + pub fn fetch_identity_contract_nonce_with_fees( + &self, + identity_id: [u8; 32], + contract_id: [u8; 32], + block_info: &BlockInfo, + apply: bool, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<(Option, FeeResult), Error> { + match platform_version + .drive + .methods + .identity + .fetch + .attributes + .identity_contract_nonce + { + 0 => self.fetch_identity_contract_nonce_with_fees_v0( + identity_id, + contract_id, + block_info, + apply, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "fetch_identity_contract_nonce_with_fees".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/fetch_identity_contract_nonce/v0/mod.rs b/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/fetch_identity_contract_nonce/v0/mod.rs new file mode 100644 index 0000000000..bb4ec6af34 --- /dev/null +++ b/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/fetch_identity_contract_nonce/v0/mod.rs @@ -0,0 +1,118 @@ +use crate::drive::grove_operations::DirectQueryType; +use crate::drive::grove_operations::QueryTarget::QueryTargetValue; +use crate::drive::identity::identity_contract_info_group_path; +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fee::op::LowLevelDriveOperation; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::prelude::{IdentityNonce, Revision}; + +use crate::drive::identity::contract_info::ContractInfoStructure::IdentityContractNonceKey; +use dpp::version::PlatformVersion; +use grovedb::Element::Item; +use grovedb::TransactionArg; + +impl Drive { + /// Fetches the Identity's contract revision from the backing store + /// Passing apply as false get the estimated cost instead + pub(super) fn fetch_identity_contract_nonce_v0( + &self, + identity_id: [u8; 32], + contract_id: [u8; 32], + apply: bool, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result, Error> { + let mut drive_operations: Vec = vec![]; + self.fetch_identity_contract_nonce_operations_v0( + identity_id, + contract_id, + apply, + transaction, + &mut drive_operations, + platform_version, + ) + } + + /// Creates the operations to get Identity's contract revision from the backing store + /// This gets operations based on apply flag (stateful vs stateless) + pub(super) fn fetch_identity_contract_nonce_operations_v0( + &self, + identity_id: [u8; 32], + contract_id: [u8; 32], + apply: bool, + transaction: TransactionArg, + drive_operations: &mut Vec, + platform_version: &PlatformVersion, + ) -> Result, Error> { + let direct_query_type = if apply { + DirectQueryType::StatefulDirectQuery + } else { + DirectQueryType::StatelessDirectQuery { + in_tree_using_sums: false, + query_target: QueryTargetValue(1), + } + }; + let identity_contract_path = + identity_contract_info_group_path(&identity_id, contract_id.as_slice()); + match self.grove_get_raw_optional( + (&identity_contract_path).into(), + &[IdentityContractNonceKey as u8], + direct_query_type, + transaction, + drive_operations, + &platform_version.drive, + ) { + Ok(Some(Item(encoded_nonce, _))) => { + let nonce = + IdentityNonce::from_be_bytes(encoded_nonce.try_into().map_err(|_| { + Error::Drive(DriveError::CorruptedElementType( + "identity contract nonce was not 8 bytes as expected", + )) + })?); + + Ok(Some(nonce)) + } + + Ok(None) => Ok(None), + + Ok(Some(..)) => Err(Error::Drive(DriveError::CorruptedElementType( + "identity contract nonce was present but was not identified as an item", + ))), + + Err(e) => Err(e), + } + } + + /// Fetches the Identity's contract revision from the backing store + /// Passing apply as false get the estimated cost instead + pub(super) fn fetch_identity_contract_nonce_with_fees_v0( + &self, + identity_id: [u8; 32], + contract_id: [u8; 32], + block_info: &BlockInfo, + apply: bool, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<(Option, FeeResult), Error> { + let mut drive_operations: Vec = vec![]; + let value = self.fetch_identity_contract_nonce_operations_v0( + identity_id, + contract_id, + apply, + transaction, + &mut drive_operations, + platform_version, + )?; + let fees = Drive::calculate_fee( + None, + Some(drive_operations), + &block_info.epoch, + self.config.epochs_per_era, + platform_version, + )?; + Ok((value, fees)) + } +} diff --git a/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/merge_identity_contract_nonce/mod.rs b/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/merge_identity_contract_nonce/mod.rs new file mode 100644 index 0000000000..15adca893e --- /dev/null +++ b/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/merge_identity_contract_nonce/mod.rs @@ -0,0 +1,90 @@ +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::identity::IdentityError; +use crate::error::Error; +use crate::fee::op::LowLevelDriveOperation; +use dpp::block::block_info::BlockInfo; +use dpp::identity::identity_nonce::MergeIdentityNonceResult; +use dpp::prelude::IdentityNonce; +use grovedb::batch::KeyInfoPath; +use grovedb::{EstimatedLayerInformation, TransactionArg}; +use platform_version::version::PlatformVersion; +use std::collections::HashMap; + +mod v0; + +impl Drive { + /// Merges the given revision into the identity contract pair nonce + pub fn merge_identity_contract_nonce( + &self, + identity_id: [u8; 32], + contract_id: [u8; 32], + revision_nonce: IdentityNonce, + block_info: &BlockInfo, + apply: bool, + transaction: TransactionArg, + drive_operations: &mut Vec, + platform_version: &PlatformVersion, + ) -> Result { + match platform_version + .drive + .methods + .identity + .contract_info + .merge_identity_contract_nonce + { + 0 => self.merge_identity_contract_nonce_v0( + identity_id, + contract_id, + revision_nonce, + block_info, + apply, + transaction, + drive_operations, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "merge_revision_nonce_for_identity_contract_pair".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// Gives the operations of merging the given revision into the identity contract pair nonce + pub fn merge_identity_contract_nonce_operations( + &self, + identity_id: [u8; 32], + contract_id: [u8; 32], + revision_nonce: IdentityNonce, + block_info: &BlockInfo, + estimated_costs_only_with_layer_info: &mut Option< + HashMap, + >, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<(MergeIdentityNonceResult, Vec), Error> { + match platform_version + .drive + .methods + .identity + .contract_info + .merge_identity_contract_nonce + { + 0 => self.merge_identity_contract_nonce_operations_v0( + identity_id, + contract_id, + revision_nonce, + block_info, + estimated_costs_only_with_layer_info, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "merge_revision_nonce_for_identity_contract_pair_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/merge_identity_contract_nonce/v0/mod.rs b/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/merge_identity_contract_nonce/v0/mod.rs new file mode 100644 index 0000000000..392e92c788 --- /dev/null +++ b/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/merge_identity_contract_nonce/v0/mod.rs @@ -0,0 +1,612 @@ +use crate::drive::grove_operations::BatchInsertTreeApplyType; +use crate::drive::identity::contract_info::ContractInfoStructure::IdentityContractNonceKey; +use crate::drive::identity::IdentityRootStructure::IdentityContractInfo; +use crate::drive::identity::{identity_contract_info_group_path, identity_contract_info_root_path_vec, identity_path_vec}; +use crate::drive::object_size_info::{PathKeyElementInfo, PathKeyInfo}; +use crate::drive::Drive; +use crate::error::Error; +use crate::fee::op::LowLevelDriveOperation; +use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::version::PlatformVersion; +use grovedb::batch::KeyInfoPath; +use grovedb::{Element, EstimatedLayerInformation, TransactionArg}; +use std::collections::HashMap; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::identity::identity_nonce::{IDENTITY_NONCE_VALUE_FILTER, IDENTITY_NONCE_VALUE_FILTER_MAX_BYTES, MAX_MISSING_IDENTITY_REVISIONS, MISSING_IDENTITY_REVISIONS_FILTER, MISSING_IDENTITY_REVISIONS_MAX_BYTES}; +use dpp::prelude::IdentityNonce; +use crate::drive::identity::contract_info::identity_contract_nonce::merge_identity_contract_nonce::MergeIdentityNonceResult; +use crate::drive::identity::contract_info::identity_contract_nonce::merge_identity_contract_nonce::MergeIdentityNonceResult::{MergeIdentityNonceSuccess, NonceAlreadyPresentAtTip, NonceAlreadyPresentInPast, NonceTooFarInFuture, NonceTooFarInPast}; +use crate::error::identity::IdentityError; + +impl Drive { + pub(in crate::drive::identity::contract_info) fn merge_identity_contract_nonce_v0( + &self, + identity_id: [u8; 32], + contract_id: [u8; 32], + identity_contract_nonce: IdentityNonce, + block_info: &BlockInfo, + apply: bool, + transaction: TransactionArg, + drive_operations: &mut Vec, + platform_version: &PlatformVersion, + ) -> Result { + let mut estimated_costs_only_with_layer_info = if apply { + None::> + } else { + Some(HashMap::new()) + }; + + let (result, batch_operations) = self.merge_identity_contract_nonce_operations_v0( + identity_id, + contract_id, + identity_contract_nonce, + block_info, + &mut estimated_costs_only_with_layer_info, + transaction, + platform_version, + )?; + + if !result.is_error() { + self.apply_batch_low_level_drive_operations( + estimated_costs_only_with_layer_info, + transaction, + batch_operations, + drive_operations, + &platform_version.drive, + )?; + } + + Ok(result) + } + + /// Sets the revision nonce for the identity contract pair + pub(super) fn merge_identity_contract_nonce_operations_v0( + &self, + identity_id: [u8; 32], + contract_id: [u8; 32], + revision_nonce: IdentityNonce, + block_info: &BlockInfo, + estimated_costs_only_with_layer_info: &mut Option< + HashMap, + >, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<(MergeIdentityNonceResult, Vec), Error> { + let mut drive_operations = vec![]; + + if revision_nonce & MISSING_IDENTITY_REVISIONS_FILTER > 0 { + return Ok((MergeIdentityNonceResult::InvalidNonce, drive_operations)); + } + + if revision_nonce == 0 { + return Ok((MergeIdentityNonceResult::InvalidNonce, drive_operations)); + } + + let identity_path = identity_path_vec(identity_id.as_slice()); + + if let Some(estimated_costs_only_with_layer_info) = estimated_costs_only_with_layer_info { + Self::add_estimation_costs_for_contract_info( + &identity_id, + estimated_costs_only_with_layer_info, + &platform_version.drive, + )?; + } + + let apply_type = if estimated_costs_only_with_layer_info.is_none() { + BatchInsertTreeApplyType::StatefulBatchInsertTree + } else { + BatchInsertTreeApplyType::StatelessBatchInsertTree { + in_tree_using_sums: false, + is_sum_tree: false, + flags_len: 0, + } + }; + + let previous_nonce_is_sure_to_not_exist = if revision_nonce + <= MAX_MISSING_IDENTITY_REVISIONS + { + if let Some(estimated_costs_only_with_layer_info) = estimated_costs_only_with_layer_info + { + Self::add_estimation_costs_for_contract_info( + &identity_id, + estimated_costs_only_with_layer_info, + &platform_version.drive, + )?; + } + + // we insert the contract root tree if it doesn't exist already + self.batch_insert_empty_tree_if_not_exists( + PathKeyInfo::<0>::PathKey((identity_path, vec![IdentityContractInfo as u8])), + None, + apply_type, + transaction, + &mut None, + &mut drive_operations, + &platform_version.drive, + )?; + + // we insert the contract root tree if it doesn't exist already + let inserted = self.batch_insert_empty_tree_if_not_exists( + PathKeyInfo::<0>::PathKey(( + identity_contract_info_root_path_vec(&identity_id), + contract_id.to_vec(), + )), + None, + apply_type, + transaction, + &mut None, + &mut drive_operations, + &platform_version.drive, + )?; + if estimated_costs_only_with_layer_info.is_none() { + inserted + } else { + false //in the case of fee estimation it might exist + } + } else { + false + }; + + if let Some(estimated_costs_only_with_layer_info) = estimated_costs_only_with_layer_info { + Self::add_estimation_costs_for_contract_info_group( + &identity_id, + &contract_id, + estimated_costs_only_with_layer_info, + &platform_version.drive, + )?; + } + + let (existing_nonce, fees) = if previous_nonce_is_sure_to_not_exist { + (None, FeeResult::default()) + } else { + self.fetch_identity_contract_nonce_with_fees( + identity_id, + contract_id, + block_info, + estimated_costs_only_with_layer_info.is_none(), + transaction, + platform_version, + )? + }; + + let nonce_to_set = if estimated_costs_only_with_layer_info.is_some() { + // we are just getting estimated costs + revision_nonce + } else if let Some(existing_nonce) = existing_nonce { + let actual_existing_revision = existing_nonce & IDENTITY_NONCE_VALUE_FILTER; + if actual_existing_revision == revision_nonce { + // we were not able to update the revision as it is the same as we already had + return Ok((NonceAlreadyPresentAtTip, drive_operations)); + } else if actual_existing_revision < revision_nonce { + if revision_nonce - actual_existing_revision > MISSING_IDENTITY_REVISIONS_MAX_BYTES + { + // we are too far away from the actual revision + return Ok((NonceTooFarInFuture, drive_operations)); + } else { + let missing_amount_of_revisions = revision_nonce - actual_existing_revision - 1; + let new_previous_missing_revisions = (existing_nonce + & MISSING_IDENTITY_REVISIONS_FILTER) + << (missing_amount_of_revisions + 1); + // the missing_revisions_bytes are the amount of bytes to put in the missing area + let missing_revisions_bytes = if missing_amount_of_revisions > 0 { + ((1 << missing_amount_of_revisions) - 1) + << IDENTITY_NONCE_VALUE_FILTER_MAX_BYTES + } else { + 0 + }; + new_previous_missing_revisions | revision_nonce | missing_revisions_bytes + } + } else { + let previous_revision_position_from_top = actual_existing_revision - revision_nonce; + if previous_revision_position_from_top >= MISSING_IDENTITY_REVISIONS_MAX_BYTES { + // we are too far away from the actual revision + return Ok((NonceTooFarInPast, drive_operations)); + } else { + let old_missing_revisions = existing_nonce & MISSING_IDENTITY_REVISIONS_FILTER; + if old_missing_revisions == 0 { + return Ok(( + NonceAlreadyPresentInPast(previous_revision_position_from_top), + drive_operations, + )); + } else { + let byte_to_unset = 1 + << (previous_revision_position_from_top - 1 + + IDENTITY_NONCE_VALUE_FILTER_MAX_BYTES); + let old_revision_already_set = + old_missing_revisions | byte_to_unset != old_missing_revisions; + if old_revision_already_set { + return Ok(( + NonceAlreadyPresentInPast(previous_revision_position_from_top), + drive_operations, + )); + } else { + existing_nonce & !byte_to_unset + } + } + } + } + } else if revision_nonce >= MISSING_IDENTITY_REVISIONS_MAX_BYTES { + // we are too far away from the actual revision + return Ok((NonceTooFarInFuture, drive_operations)); + } else { + // there was no previous revision nonce, just set + // todo: this will only work if we have at most one document per state transition + // when we change batch state transitions back to multiple we need to check existing + // operations. + + let missing_amount_of_revisions = revision_nonce - 1; + // the missing_revisions_bytes are the amount of bytes to put in the missing area + let missing_revisions_bytes = if missing_amount_of_revisions > 0 { + ((1 << missing_amount_of_revisions) - 1) << IDENTITY_NONCE_VALUE_FILTER_MAX_BYTES + } else { + 0 + }; + + missing_revisions_bytes | revision_nonce + }; + + let identity_contract_nonce_bytes = nonce_to_set.to_be_bytes().to_vec(); + let identity_contract_nonce_element = Element::new_item(identity_contract_nonce_bytes); + + //println!("{} is {:b}, existing was {:?}", nonce_to_set, nonce_to_set, existing_nonce); + + self.batch_insert( + PathKeyElementInfo::PathFixedSizeKeyRefElement(( + identity_contract_info_group_path(&identity_id, &contract_id), + &[IdentityContractNonceKey as u8], + identity_contract_nonce_element, + )), + &mut drive_operations, + &platform_version.drive, + )?; + + Ok((MergeIdentityNonceSuccess(nonce_to_set), drive_operations)) + } +} + +#[cfg(feature = "full")] +#[cfg(test)] +mod tests { + use crate::drive::Drive; + use crate::tests::helpers::setup::setup_drive; + use dpp::block::block_info::BlockInfo; + use dpp::identity::accessors::IdentityGettersV0; + use dpp::identity::Identity; + use dpp::prelude::IdentityNonce; + use platform_version::version::PlatformVersion; + + fn setup_base_test(contract_id: [u8; 32]) -> (Drive, Identity) { + let drive = setup_drive(None); + let transaction = drive.grove.start_transaction(); + + let platform_version = PlatformVersion::first(); + + drive + .create_initial_state_structure(Some(&transaction), platform_version) + .expect("expected to create root tree successfully"); + + let identity = Identity::random_identity(5, Some(12345), platform_version) + .expect("expected a random identity"); + + drive + .add_new_identity( + identity.clone(), + false, + &BlockInfo::default(), + true, + Some(&transaction), + platform_version, + ) + .expect("expected to insert identity"); + + let result = drive + .merge_identity_contract_nonce_v0( + identity.id().to_buffer(), + contract_id, + 1, + &BlockInfo::default(), + true, + Some(&transaction), + &mut vec![], + platform_version, + ) + .expect("expected to merge identity contract nonce"); + + assert!(result.error_message().is_none()); + + drive + .commit_transaction(transaction, &platform_version.drive) + .expect("expected to commit transaction"); + + (drive, identity) + } + + #[test] + fn merge_identity_contract_nonce_with_bump() { + let contract_id = [0; 32]; + let (drive, identity) = setup_base_test(contract_id); + + let platform_version = PlatformVersion::first(); + + let transaction = drive.grove.start_transaction(); + + let result = drive + .merge_identity_contract_nonce_v0( + identity.id().to_buffer(), + contract_id, + 2, + &BlockInfo::default(), + true, + Some(&transaction), + &mut vec![], + platform_version, + ) + .expect("expected to merge identity contract nonce"); + + assert!(result.error_message().is_none()); + } + + #[test] + fn merge_identity_contract_nonce_0_is_invalid() { + let contract_id = [0; 32]; + let (drive, identity) = setup_base_test(contract_id); + + let platform_version = PlatformVersion::first(); + + let transaction = drive.grove.start_transaction(); + + let result = drive + .merge_identity_contract_nonce_v0( + identity.id().to_buffer(), + contract_id, + 0, + &BlockInfo::default(), + true, + Some(&transaction), + &mut vec![], + platform_version, + ) + .expect("expected to merge identity contract nonce"); + + assert_eq!(result.error_message(), Some("nonce is an invalid value")); + } + + #[test] + fn merge_identity_contract_nonce_many_updates() { + let contract_id = [0; 32]; + let (drive, identity) = setup_base_test(contract_id); + + let platform_version = PlatformVersion::first(); + + let transaction = drive.grove.start_transaction(); + + let result = drive + .merge_identity_contract_nonce_v0( + identity.id().to_buffer(), + contract_id, + 10, + &BlockInfo::default(), + true, + Some(&transaction), + &mut vec![], + platform_version, + ) + .expect("expected to merge identity contract nonce"); + + assert!(result.error_message().is_none()); + + let result = drive + .merge_identity_contract_nonce_v0( + identity.id().to_buffer(), + contract_id, + 9, + &BlockInfo::default(), + true, + Some(&transaction), + &mut vec![], + platform_version, + ) + .expect("expected to merge identity contract nonce"); + + assert!(result.error_message().is_none()); + + let result = drive + .merge_identity_contract_nonce_v0( + identity.id().to_buffer(), + contract_id, + 8, + &BlockInfo::default(), + true, + Some(&transaction), + &mut vec![], + platform_version, + ) + .expect("expected to merge identity contract nonce"); + + assert!(result.error_message().is_none()); + + let result = drive + .merge_identity_contract_nonce_v0( + identity.id().to_buffer(), + contract_id, + 3, + &BlockInfo::default(), + true, + Some(&transaction), + &mut vec![], + platform_version, + ) + .expect("expected to merge identity contract nonce"); + + assert!(result.error_message().is_none()); + + let result = drive + .merge_identity_contract_nonce_v0( + identity.id().to_buffer(), + contract_id, + 12, + &BlockInfo::default(), + true, + Some(&transaction), + &mut vec![], + platform_version, + ) + .expect("expected to merge identity contract nonce"); + + assert!(result.error_message().is_none()); + + let result = drive + .merge_identity_contract_nonce_v0( + identity.id().to_buffer(), + contract_id, + 11, + &BlockInfo::default(), + true, + Some(&transaction), + &mut vec![], + platform_version, + ) + .expect("expected to merge identity contract nonce"); + + assert!(result.error_message().is_none()); + + let result = drive + .merge_identity_contract_nonce_v0( + identity.id().to_buffer(), + contract_id, + 11, + &BlockInfo::default(), + true, + Some(&transaction), + &mut vec![], + platform_version, + ) + .expect("expected to merge identity contract nonce"); + + assert_eq!( + result.error_message(), + Some("nonce already present in past") + ); + + let result = drive + .merge_identity_contract_nonce_v0( + identity.id().to_buffer(), + contract_id, + 12, + &BlockInfo::default(), + true, + Some(&transaction), + &mut vec![], + platform_version, + ) + .expect("expected to merge identity contract nonce"); + + assert_eq!(result.error_message(), Some("nonce already present at tip")); + + let result = drive + .merge_identity_contract_nonce_v0( + identity.id().to_buffer(), + contract_id, + 0, + &BlockInfo::default(), + true, + Some(&transaction), + &mut vec![], + platform_version, + ) + .expect("expected to merge identity contract nonce"); + + assert_eq!(result.error_message(), Some("nonce is an invalid value")); + + let result = drive + .merge_identity_contract_nonce_v0( + identity.id().to_buffer(), + contract_id, + 12 + 25, + &BlockInfo::default(), + true, + Some(&transaction), + &mut vec![], + platform_version, + ) + .expect("expected to merge identity contract nonce"); + + assert_eq!(result.error_message(), Some("nonce too far in future")); + + let result = drive + .merge_identity_contract_nonce_v0( + identity.id().to_buffer(), + contract_id, + 12 + 24, // 36 + &BlockInfo::default(), + true, + Some(&transaction), + &mut vec![], + platform_version, + ) + .expect("expected to merge identity contract nonce"); + + assert!(result.error_message().is_none()); + + let result = drive + .merge_identity_contract_nonce_v0( + identity.id().to_buffer(), + contract_id, + 13, + &BlockInfo::default(), + true, + Some(&transaction), + &mut vec![], + platform_version, + ) + .expect("expected to merge identity contract nonce"); + + assert!(result.error_message().is_none()); + + let result = drive + .merge_identity_contract_nonce_v0( + identity.id().to_buffer(), + contract_id, + 12, + &BlockInfo::default(), + true, + Some(&transaction), + &mut vec![], + platform_version, + ) + .expect("expected to merge identity contract nonce"); + + assert_eq!(result.error_message(), Some("nonce too far in past")); + + let result = drive + .merge_identity_contract_nonce_v0( + identity.id().to_buffer(), + contract_id, + 8, + &BlockInfo::default(), + true, + Some(&transaction), + &mut vec![], + platform_version, + ) + .expect("expected to merge identity contract nonce"); + + assert_eq!(result.error_message(), Some("nonce too far in past")); + + let result = drive + .merge_identity_contract_nonce_v0( + identity.id().to_buffer(), + contract_id, + IdentityNonce::MAX, + &BlockInfo::default(), + true, + Some(&transaction), + &mut vec![], + platform_version, + ) + .expect("expected to merge identity contract nonce"); + + assert_eq!(result.error_message(), Some("nonce is an invalid value")); + } +} diff --git a/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/mod.rs b/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/mod.rs new file mode 100644 index 0000000000..21a5dca54f --- /dev/null +++ b/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/mod.rs @@ -0,0 +1,5 @@ +#[cfg(feature = "full")] +mod fetch_identity_contract_nonce; +pub(crate) mod merge_identity_contract_nonce; +#[cfg(feature = "full")] +mod prove_identity_contract_nonce; diff --git a/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/prove_identity_contract_nonce/mod.rs b/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/prove_identity_contract_nonce/mod.rs new file mode 100644 index 0000000000..538f38e2c0 --- /dev/null +++ b/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/prove_identity_contract_nonce/mod.rs @@ -0,0 +1,44 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::{drive::DriveError, Error}; +use grovedb::TransactionArg; +use platform_version::version::drive_versions::DriveVersion; + +impl Drive { + /// Fetches the Identity's contract document nonce from the backing store + /// + /// This function uses the versioning system to call the appropriate handler based on the provided `DriveVersion`. + /// + /// # Arguments + /// + /// * `identity_id` - Identity Id to prove. + /// * `contract_id` - For Contract Id to prove. + /// * `transaction` - Transaction arguments. + /// * `platform_version` - A reference to the platform version. + /// + /// # Returns + /// + /// Returns a `Result` containing an `Option` for the Identity's revision, otherwise an `Error` if the operation fails or the version is not supported. + pub fn prove_identity_contract_nonce( + &self, + identity_id: [u8; 32], + contract_id: [u8; 32], + transaction: TransactionArg, + drive_version: &DriveVersion, + ) -> Result, Error> { + match drive_version.methods.identity.prove.identity_contract_nonce { + 0 => self.prove_identity_contract_nonce_v0( + identity_id, + contract_id, + transaction, + drive_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "prove_identity_contract_nonce".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/prove_identity_contract_nonce/v0/mod.rs b/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/prove_identity_contract_nonce/v0/mod.rs new file mode 100644 index 0000000000..dfd7c56677 --- /dev/null +++ b/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/prove_identity_contract_nonce/v0/mod.rs @@ -0,0 +1,24 @@ +use crate::drive::Drive; +use crate::error::Error; +use grovedb::TransactionArg; +use platform_version::version::drive_versions::DriveVersion; + +impl Drive { + /// Proves the Identity's contract nonce from the backing store + pub(super) fn prove_identity_contract_nonce_v0( + &self, + identity_id: [u8; 32], + contract_id: [u8; 32], + transaction: TransactionArg, + drive_version: &DriveVersion, + ) -> Result, Error> { + let identity_contract_path = Self::identity_contract_nonce_query(identity_id, contract_id); + self.grove_get_proved_path_query( + &identity_contract_path, + false, + transaction, + &mut vec![], + drive_version, + ) + } +} diff --git a/packages/rs-drive/src/drive/identity/contract_info/insert/add_potential_contract_info_for_contract_bounded_key/mod.rs b/packages/rs-drive/src/drive/identity/contract_info/keys/add_potential_contract_info_for_contract_bounded_key/mod.rs similarity index 100% rename from packages/rs-drive/src/drive/identity/contract_info/insert/add_potential_contract_info_for_contract_bounded_key/mod.rs rename to packages/rs-drive/src/drive/identity/contract_info/keys/add_potential_contract_info_for_contract_bounded_key/mod.rs diff --git a/packages/rs-drive/src/drive/identity/contract_info/insert/add_potential_contract_info_for_contract_bounded_key/v0/mod.rs b/packages/rs-drive/src/drive/identity/contract_info/keys/add_potential_contract_info_for_contract_bounded_key/v0/mod.rs similarity index 88% rename from packages/rs-drive/src/drive/identity/contract_info/insert/add_potential_contract_info_for_contract_bounded_key/v0/mod.rs rename to packages/rs-drive/src/drive/identity/contract_info/keys/add_potential_contract_info_for_contract_bounded_key/v0/mod.rs index be1d31b5a5..3fe34a2f10 100644 --- a/packages/rs-drive/src/drive/identity/contract_info/insert/add_potential_contract_info_for_contract_bounded_key/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/contract_info/keys/add_potential_contract_info_for_contract_bounded_key/v0/mod.rs @@ -1,11 +1,12 @@ use crate::drive::grove_operations::QueryTarget::QueryTargetValue; use crate::drive::grove_operations::{BatchInsertApplyType, BatchInsertTreeApplyType}; -use crate::drive::identity::contract_info::insert::DataContractApplyInfo; +use crate::drive::identity::contract_info::keys::IdentityDataContractKeyApplyInfo; +use crate::drive::identity::contract_info::ContractInfoStructure::ContractInfoKeysKey; use crate::drive::identity::IdentityRootStructure::IdentityContractInfo; use crate::drive::identity::{ - identity_contract_info_group_path_key_purpose_vec, identity_contract_info_group_path_vec, - identity_contract_info_root_path_vec, identity_key_location_within_identity_vec, - identity_path_vec, + identity_contract_info_group_keys_path_vec, identity_contract_info_group_path_key_purpose_vec, + identity_contract_info_group_path_vec, identity_contract_info_root_path_vec, + identity_key_location_within_identity_vec, identity_path_vec, }; use crate::drive::object_size_info::{PathKeyElementInfo, PathKeyInfo}; use crate::drive::Drive; @@ -29,7 +30,7 @@ use integer_encoding::VarInt; use std::collections::HashMap; impl Drive { - pub(super) fn add_potential_contract_info_for_contract_bounded_key_v0( + pub(in crate::drive::identity::contract_info) fn add_potential_contract_info_for_contract_bounded_key_v0( &self, identity_id: [u8; 32], identity_key: &IdentityPublicKey, @@ -43,7 +44,7 @@ impl Drive { ) -> Result<(), Error> { if let Some(contract_bounds) = &identity_key.contract_bounds() { // We need to get the contract - let contract_apply_info = DataContractApplyInfo::new_from_single_key( + let contract_apply_info = IdentityDataContractKeyApplyInfo::new_from_single_key( identity_key.id(), identity_key.purpose(), contract_bounds, @@ -71,7 +72,7 @@ impl Drive { &self, identity_id: [u8; 32], epoch: &Epoch, - contract_infos: Vec, + contract_infos: Vec, estimated_costs_only_with_layer_info: &mut Option< HashMap, >, @@ -155,6 +156,13 @@ impl Drive { estimated_costs_only_with_layer_info, &platform_version.drive, )?; + + Self::add_estimation_costs_for_contract_info_group_keys( + &identity_id, + &root_id, + estimated_costs_only_with_layer_info, + &platform_version.drive, + )?; } self.batch_insert_empty_tree_if_not_exists_check_existing_operations( @@ -168,6 +176,19 @@ impl Drive { drive_operations, &platform_version.drive, )?; + + // We need to insert the keys parent tree + self.batch_insert_empty_tree_if_not_exists_check_existing_operations( + PathKeyInfo::<0>::PathKey(( + identity_contract_info_group_path_vec(&identity_id, &root_id), + vec![ContractInfoKeysKey as u8], + )), + None, + apply_type, + transaction, + drive_operations, + &platform_version.drive, + )?; } for (key_id, purpose) in contract_or_family_keys { @@ -186,7 +207,7 @@ impl Drive { // We need to insert the key type self.batch_insert_empty_tree_if_not_exists_check_existing_operations( PathKeyInfo::<0>::PathKey(( - identity_contract_info_group_path_vec(&identity_id, &root_id), + identity_contract_info_group_keys_path_vec(&identity_id, &root_id), vec![purpose as u8], )), None, @@ -290,7 +311,7 @@ impl Drive { self.batch_insert( PathKeyElementInfo::<0>::PathKeyElement(( - identity_contract_info_group_path_vec(&identity_id, &root_id), + identity_contract_info_group_keys_path_vec(&identity_id, &root_id), vec![], Element::Reference(sibling_ref_type_path, Some(2), None), )), @@ -314,6 +335,13 @@ impl Drive { estimated_costs_only_with_layer_info, &platform_version.drive, )?; + + Self::add_estimation_costs_for_contract_info_group_keys( + &identity_id, + &contract_id_bytes_with_document_type_name, + estimated_costs_only_with_layer_info, + &platform_version.drive, + )?; } self.batch_insert_empty_tree_if_not_exists_check_existing_operations( @@ -327,6 +355,22 @@ impl Drive { drive_operations, &platform_version.drive, )?; + + self.batch_insert_empty_tree_if_not_exists_check_existing_operations( + PathKeyInfo::<0>::PathKey(( + identity_contract_info_group_path_vec( + &identity_id, + &contract_id_bytes_with_document_type_name, + ), + vec![ContractInfoKeysKey as u8], + )), + None, + apply_type, + transaction, + drive_operations, + &platform_version.drive, + )?; + for (key_id, purpose) in document_key_ids { if let Some(estimated_costs_only_with_layer_info) = estimated_costs_only_with_layer_info @@ -343,7 +387,7 @@ impl Drive { // We need to insert the key type self.batch_insert_empty_tree_if_not_exists_check_existing_operations( PathKeyInfo::<0>::PathKey(( - identity_contract_info_group_path_vec( + identity_contract_info_group_keys_path_vec( &identity_id, &contract_id_bytes_with_document_type_name, ), diff --git a/packages/rs-drive/src/drive/identity/contract_info/insert/mod.rs b/packages/rs-drive/src/drive/identity/contract_info/keys/mod.rs similarity index 94% rename from packages/rs-drive/src/drive/identity/contract_info/insert/mod.rs rename to packages/rs-drive/src/drive/identity/contract_info/keys/mod.rs index f28aa81c83..dc34b6c8d0 100644 --- a/packages/rs-drive/src/drive/identity/contract_info/insert/mod.rs +++ b/packages/rs-drive/src/drive/identity/contract_info/keys/mod.rs @@ -1,6 +1,4 @@ -mod add_potential_contract_info_for_contract_bounded_key; - -use crate::drive::identity::contract_info::insert::DataContractApplyInfo::ContractBased; +use crate::drive::identity::contract_info::keys::IdentityDataContractKeyApplyInfo::ContractBased; use crate::drive::Drive; use crate::error::identity::IdentityError; use crate::error::Error; @@ -11,15 +9,16 @@ use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::identifier::Identifier; use dpp::identity::contract_bounds::ContractBounds; use dpp::identity::{KeyID, Purpose}; -use dpp::version::PlatformVersion; use grovedb::TransactionArg; +use platform_version::version::PlatformVersion; use std::collections::BTreeMap; -pub enum DataContractApplyInfo { +mod add_potential_contract_info_for_contract_bounded_key; + +pub enum IdentityDataContractKeyApplyInfo { /// The root_id is either a contract id or an owner id /// It is a contract id for in the case of contract bound keys or contract /// document bound keys - /// In the case ContractBased { contract_id: Identifier, document_type_keys: BTreeMap>, @@ -31,7 +30,7 @@ pub enum DataContractApplyInfo { // }, } -impl DataContractApplyInfo { +impl IdentityDataContractKeyApplyInfo { fn root_id(&self) -> [u8; 32] { match self { ContractBased { contract_id, .. } => contract_id.to_buffer(), diff --git a/packages/rs-drive/src/drive/identity/contract_info/mod.rs b/packages/rs-drive/src/drive/identity/contract_info/mod.rs index b8e5d32bb8..b6e4758f5b 100644 --- a/packages/rs-drive/src/drive/identity/contract_info/mod.rs +++ b/packages/rs-drive/src/drive/identity/contract_info/mod.rs @@ -1 +1,14 @@ -mod insert; +#[cfg(feature = "full")] +pub(crate) mod identity_contract_nonce; +#[cfg(feature = "full")] +pub mod keys; + +/// The sub elements in the contract space for each identity. +#[repr(u8)] +#[derive(Copy, Clone)] +pub enum ContractInfoStructure { + /// The identity contract nonce to stop replay attacks + IdentityContractNonceKey = 0, + /// The contract bound keys + ContractInfoKeysKey = 1, +} diff --git a/packages/rs-drive/src/drive/identity/estimation_costs/for_identity_contract_info/v0/mod.rs b/packages/rs-drive/src/drive/identity/estimation_costs/for_identity_contract_info/v0/mod.rs index f5da420585..42896acbdf 100644 --- a/packages/rs-drive/src/drive/identity/estimation_costs/for_identity_contract_info/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/estimation_costs/for_identity_contract_info/v0/mod.rs @@ -1,10 +1,10 @@ use crate::drive::defaults::DEFAULT_HASH_SIZE_U8; -use crate::drive::identity::identity_contract_info_root_path_vec; -use crate::drive::Drive; +use crate::drive::identity::{identity_contract_info_root_path_vec, identity_path_vec}; +use crate::drive::{identity_tree_path, Drive}; use grovedb::batch::KeyInfoPath; -use grovedb::EstimatedLayerCount::PotentiallyAtMaxElements; +use grovedb::EstimatedLayerCount::{EstimatedLevel, PotentiallyAtMaxElements}; use grovedb::EstimatedLayerInformation; -use grovedb::EstimatedLayerSizes::AllSubtrees; +use grovedb::EstimatedLayerSizes::{AllSubtrees, Mix}; use grovedb::EstimatedSumTrees::NoSumTrees; use std::collections::HashMap; @@ -13,6 +13,48 @@ impl Drive { identity_id: &[u8; 32], estimated_costs_only_with_layer_info: &mut HashMap, ) { + // we have constructed the top layer so contract/documents tree are at the top + // since balance will be on layer 2, updating will mean we will update 1 sum tree + // and 1 normal tree, hence we should give an equal weight to both + estimated_costs_only_with_layer_info.insert( + KeyInfoPath::from_known_path([]), + EstimatedLayerInformation { + is_sum_tree: false, + estimated_layer_count: EstimatedLevel(1, false), + estimated_layer_sizes: AllSubtrees(1, NoSumTrees, None), + }, + ); + + // we then need to insert the root identity layer + estimated_costs_only_with_layer_info.insert( + KeyInfoPath::from_known_path(identity_tree_path()), + EstimatedLayerInformation { + is_sum_tree: false, + estimated_layer_count: PotentiallyAtMaxElements, + estimated_layer_sizes: AllSubtrees(DEFAULT_HASH_SIZE_U8, NoSumTrees, None), + }, + ); + + // In this layer we have + // Keys + // / \ + // Nonce Revision + // / \ / + // DataContract Info Negative Credit Query Keys + + // we then need to insert the identity layer + estimated_costs_only_with_layer_info.insert( + KeyInfoPath::from_known_owned_path(identity_path_vec(identity_id.as_slice())), + EstimatedLayerInformation { + is_sum_tree: false, + estimated_layer_count: EstimatedLevel(2, false), + estimated_layer_sizes: Mix { + subtrees_size: Some((1, NoSumTrees, None, 2)), // weight of 2 because 1 for keys and 1 for data contract info + items_size: Some((1, 8, None, 1)), + references_size: None, + }, + }, + ); // we then need to insert for the identity contract info estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_owned_path(identity_contract_info_root_path_vec(identity_id)), diff --git a/packages/rs-drive/src/drive/identity/estimation_costs/for_identity_contract_info_group/v0/mod.rs b/packages/rs-drive/src/drive/identity/estimation_costs/for_identity_contract_info_group/v0/mod.rs index c01737d438..da5ee687a7 100644 --- a/packages/rs-drive/src/drive/identity/estimation_costs/for_identity_contract_info_group/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/estimation_costs/for_identity_contract_info_group/v0/mod.rs @@ -3,7 +3,7 @@ use crate::drive::Drive; use grovedb::batch::KeyInfoPath; use grovedb::EstimatedLayerCount::ApproximateElements; use grovedb::EstimatedLayerInformation; -use grovedb::EstimatedLayerSizes::AllSubtrees; +use grovedb::EstimatedLayerSizes::{AllSubtrees, Mix}; use grovedb::EstimatedSumTrees::NoSumTrees; use std::collections::HashMap; @@ -22,7 +22,11 @@ impl Drive { EstimatedLayerInformation { is_sum_tree: false, estimated_layer_count: ApproximateElements(2), - estimated_layer_sizes: AllSubtrees(1, NoSumTrees, None), + estimated_layer_sizes: Mix { + subtrees_size: Some((1, NoSumTrees, None, 1)), + items_size: Some((1, 1, None, 1)), + references_size: None, + }, }, ); } diff --git a/packages/rs-drive/src/drive/identity/estimation_costs/for_identity_contract_info_group_keys/mod.rs b/packages/rs-drive/src/drive/identity/estimation_costs/for_identity_contract_info_group_keys/mod.rs new file mode 100644 index 0000000000..5a097e92d4 --- /dev/null +++ b/packages/rs-drive/src/drive/identity/estimation_costs/for_identity_contract_info_group_keys/mod.rs @@ -0,0 +1,54 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use dpp::version::drive_versions::DriveVersion; +use grovedb::batch::KeyInfoPath; +use grovedb::EstimatedLayerInformation; +use std::collections::HashMap; + +impl Drive { + /// Adds estimation costs for balances. + /// + /// It operates on the provided HashMap, `estimated_costs_only_with_layer_info`, and adds + /// new entries to it, representing the estimated costs for different layers of the balance tree. + /// + /// # Parameters + /// - `estimated_costs_only_with_layer_info`: A mutable reference to a HashMap storing + /// the `KeyInfoPath` and `EstimatedLayerInformation`. + /// + /// # Returns + /// - `Ok(())` if successful. + /// - `Err(DriveError::UnknownVersionMismatch)` if the method version doesn't match any known versions. + /// + /// # Errors + /// This function will return an error if the method version doesn't match any known versions. + pub(crate) fn add_estimation_costs_for_contract_info_group_keys( + identity_id: &[u8; 32], + group_id: &[u8], + estimated_costs_only_with_layer_info: &mut HashMap, + drive_version: &DriveVersion, + ) -> Result<(), Error> { + match drive_version + .methods + .identity + .cost_estimation + .for_contract_info_group_keys + { + 0 => { + Self::add_estimation_costs_for_contract_info_group_keys_v0( + identity_id, + group_id, + estimated_costs_only_with_layer_info, + ); + Ok(()) + } + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "add_estimation_costs_for_contract_info_group_keys".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/identity/estimation_costs/for_identity_contract_info_group_keys/v0/mod.rs b/packages/rs-drive/src/drive/identity/estimation_costs/for_identity_contract_info_group_keys/v0/mod.rs new file mode 100644 index 0000000000..3a9b4003c2 --- /dev/null +++ b/packages/rs-drive/src/drive/identity/estimation_costs/for_identity_contract_info_group_keys/v0/mod.rs @@ -0,0 +1,31 @@ +use crate::drive::identity::{ + identity_contract_info_group_keys_path_vec, identity_contract_info_group_path_vec, +}; +use crate::drive::Drive; +use grovedb::batch::KeyInfoPath; +use grovedb::EstimatedLayerCount::ApproximateElements; +use grovedb::EstimatedLayerInformation; +use grovedb::EstimatedLayerSizes::AllSubtrees; +use grovedb::EstimatedSumTrees::NoSumTrees; +use std::collections::HashMap; + +impl Drive { + pub(super) fn add_estimation_costs_for_contract_info_group_keys_v0( + identity_id: &[u8; 32], + group_id: &[u8], + estimated_costs_only_with_layer_info: &mut HashMap, + ) { + // we then need to insert for the identity contract info for the contract in question + estimated_costs_only_with_layer_info.insert( + KeyInfoPath::from_known_owned_path(identity_contract_info_group_keys_path_vec( + identity_id, + group_id, + )), + EstimatedLayerInformation { + is_sum_tree: false, + estimated_layer_count: ApproximateElements(2), + estimated_layer_sizes: AllSubtrees(1, NoSumTrees, None), + }, + ); + } +} diff --git a/packages/rs-drive/src/drive/identity/estimation_costs/for_update_nonce/mod.rs b/packages/rs-drive/src/drive/identity/estimation_costs/for_update_nonce/mod.rs new file mode 100644 index 0000000000..91df3ac0f6 --- /dev/null +++ b/packages/rs-drive/src/drive/identity/estimation_costs/for_update_nonce/mod.rs @@ -0,0 +1,56 @@ +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use dpp::version::drive_versions::DriveVersion; +use grovedb::batch::KeyInfoPath; +use grovedb::EstimatedLayerInformation; +use std::collections::HashMap; + +mod v0; + +impl Drive { + /// This function adds estimation costs for an updated revision. + /// + /// It expects an identity in the form of an array of bytes, and a mutable reference to a HashMap containing + /// the estimated costs with layer info. Additionally, it takes a reference to the drive version. + /// + /// Based on the version of the drive, it calls the appropriate function to handle cost estimation. + /// + /// # Parameters + /// - `identity_id`: A 32-byte array representing the identity id. + /// - `estimated_costs_only_with_layer_info`: A mutable reference to a HashMap storing + /// the `KeyInfoPath` and `EstimatedLayerInformation`. + /// - `drive_version`: A reference to the `DriveVersion`. + /// + /// # Returns + /// - `Ok(())` if successful. + /// - `Err(DriveError::UnknownVersionMismatch)` if the method version doesn't match any known versions. + /// + /// # Errors + /// This function will return an error if the method version doesn't match any known versions. + pub(crate) fn add_estimation_costs_for_update_nonce( + identity_id: [u8; 32], + estimated_costs_only_with_layer_info: &mut HashMap, + drive_version: &DriveVersion, + ) -> Result<(), Error> { + match drive_version + .methods + .identity + .cost_estimation + .for_update_revision + { + 0 => { + Self::add_estimation_costs_for_update_nonce_v0( + identity_id, + estimated_costs_only_with_layer_info, + ); + Ok(()) + } + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "add_estimation_costs_for_update_nonce".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/identity/estimation_costs/for_update_nonce/v0/mod.rs b/packages/rs-drive/src/drive/identity/estimation_costs/for_update_nonce/v0/mod.rs new file mode 100644 index 0000000000..9b5e78c774 --- /dev/null +++ b/packages/rs-drive/src/drive/identity/estimation_costs/for_update_nonce/v0/mod.rs @@ -0,0 +1,81 @@ +use crate::drive::defaults::DEFAULT_HASH_SIZE_U8; + +use crate::drive::{identity_tree_path, Drive}; + +use grovedb::batch::KeyInfoPath; +use grovedb::EstimatedLayerCount::{EstimatedLevel, PotentiallyAtMaxElements}; +use grovedb::EstimatedLayerInformation; +use grovedb::EstimatedLayerSizes::{AllSubtrees, Mix}; + +use crate::drive::identity::identity_path_vec; + +use grovedb::EstimatedSumTrees::NoSumTrees; +use std::collections::HashMap; + +impl Drive { + /// This function adds estimation costs for an updated revision. + /// + /// It expects an identity in the form of an array of bytes, and a mutable reference to a HashMap containing + /// the estimated costs with layer info. Additionally, it takes a reference to the drive version. + /// + /// Based on the version of the drive, it calls the appropriate function to handle cost estimation. + /// + /// # Parameters + /// - `identity_id`: A 32-byte array representing the identity id. + /// - `estimated_costs_only_with_layer_info`: A mutable reference to a HashMap storing + /// the `KeyInfoPath` and `EstimatedLayerInformation`. + /// - `drive_version`: A reference to the `DriveVersion`. + /// + /// # Returns + /// - `Ok(())` if successful. + /// - `Err(DriveError::UnknownVersionMismatch)` if the method version doesn't match any known versions. + /// + /// # Errors + /// This function will return an error if the method version doesn't match any known versions. + pub(super) fn add_estimation_costs_for_update_nonce_v0( + identity_id: [u8; 32], + estimated_costs_only_with_layer_info: &mut HashMap, + ) { + // we need to add the root + estimated_costs_only_with_layer_info.insert( + KeyInfoPath::from_known_path([]), + EstimatedLayerInformation { + is_sum_tree: false, + estimated_layer_count: EstimatedLevel(0, false), + estimated_layer_sizes: AllSubtrees(1, NoSumTrees, None), + }, + ); + + // we then need to insert the root identity layer + estimated_costs_only_with_layer_info.insert( + KeyInfoPath::from_known_path(identity_tree_path()), + EstimatedLayerInformation { + is_sum_tree: false, + estimated_layer_count: PotentiallyAtMaxElements, + estimated_layer_sizes: AllSubtrees(DEFAULT_HASH_SIZE_U8, NoSumTrees, None), + }, + ); + + // In this layer we have + // Keys + // / \ + // Nonce Revision + // / \ / + // DataContract Info Negative Credit Query Keys + + // we then need to insert the identity layer for fee refunds + estimated_costs_only_with_layer_info.insert( + KeyInfoPath::from_known_owned_path(identity_path_vec(identity_id.as_slice())), + EstimatedLayerInformation { + is_sum_tree: false, + estimated_layer_count: EstimatedLevel(1, false), + //We can mark these as all subtrees, because the revision will be under + estimated_layer_sizes: Mix { + subtrees_size: Some((1, NoSumTrees, None, 1)), + items_size: Some((1, 8, None, 1)), + references_size: None, + }, + }, + ); + } +} diff --git a/packages/rs-drive/src/drive/identity/estimation_costs/for_update_revision/mod.rs b/packages/rs-drive/src/drive/identity/estimation_costs/for_update_revision/mod.rs index 2495574fd2..718583e8d5 100644 --- a/packages/rs-drive/src/drive/identity/estimation_costs/for_update_revision/mod.rs +++ b/packages/rs-drive/src/drive/identity/estimation_costs/for_update_revision/mod.rs @@ -47,7 +47,7 @@ impl Drive { Ok(()) } version => Err(Error::Drive(DriveError::UnknownVersionMismatch { - method: "get_cached_contract_with_fetch_info".to_string(), + method: "add_estimation_costs_for_update_revision".to_string(), known_versions: vec![0], received: version, })), diff --git a/packages/rs-drive/src/drive/identity/estimation_costs/for_update_revision/v0/mod.rs b/packages/rs-drive/src/drive/identity/estimation_costs/for_update_revision/v0/mod.rs index fbd0bea2f2..9294de5f8a 100644 --- a/packages/rs-drive/src/drive/identity/estimation_costs/for_update_revision/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/estimation_costs/for_update_revision/v0/mod.rs @@ -57,11 +57,11 @@ impl Drive { ); // In this layer we have - // Keys - // / \ - //DataContract Info Revision - // / / - // Negative Credit Query Keys + // Keys + // / \ + // Nonce Revision + // / \ / + // DataContract Info Negative Credit Query Keys // we then need to insert the identity layer for fee refunds estimated_costs_only_with_layer_info.insert( diff --git a/packages/rs-drive/src/drive/identity/estimation_costs/mod.rs b/packages/rs-drive/src/drive/identity/estimation_costs/mod.rs index db3ead6f99..bb20c35363 100644 --- a/packages/rs-drive/src/drive/identity/estimation_costs/mod.rs +++ b/packages/rs-drive/src/drive/identity/estimation_costs/mod.rs @@ -3,10 +3,12 @@ mod for_balances; mod for_identity_contract_info; mod for_identity_contract_info_group; mod for_identity_contract_info_group_key_purpose; +mod for_identity_contract_info_group_keys; mod for_keys_for_identity_id; mod for_negative_credit; mod for_purpose_in_key_reference_tree; mod for_root_key_reference_tree; +mod for_update_nonce; mod for_update_revision; /// size of a key reference. diff --git a/packages/rs-drive/src/drive/identity/fetch/mod.rs b/packages/rs-drive/src/drive/identity/fetch/mod.rs index 1e40ba1e02..66d4e232f1 100644 --- a/packages/rs-drive/src/drive/identity/fetch/mod.rs +++ b/packages/rs-drive/src/drive/identity/fetch/mod.rs @@ -39,6 +39,8 @@ mod fetch_by_public_key_hashes; #[cfg(feature = "full")] mod full_identity; #[cfg(feature = "full")] +mod nonce; +#[cfg(feature = "full")] mod partial_identity; #[cfg(feature = "full")] mod prove; diff --git a/packages/rs-drive/src/drive/identity/fetch/nonce/fetch_identity_nonce/mod.rs b/packages/rs-drive/src/drive/identity/fetch/nonce/fetch_identity_nonce/mod.rs new file mode 100644 index 0000000000..57d88f4641 --- /dev/null +++ b/packages/rs-drive/src/drive/identity/fetch/nonce/fetch_identity_nonce/mod.rs @@ -0,0 +1,143 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::{drive::DriveError, Error}; +use crate::fee::op::LowLevelDriveOperation; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::prelude::IdentityNonce; + +use dpp::version::PlatformVersion; +use grovedb::TransactionArg; + +impl Drive { + /// Fetches the Identity's nonce from the backing store + /// + /// This function uses the versioning system to call the appropriate handler based on the provided `DriveVersion`. + /// + /// # Arguments + /// + /// * `identity_id` - Identity Id to fetch. + /// * `apply` - If `true`, the changes are applied, otherwise only the cost is estimated. + /// * `transaction` - Transaction arguments. + /// * `platform_version` - A reference to the platform version. + /// + /// # Returns + /// + /// Returns a `Result` containing an `Option` for the Identity's nonce, otherwise an `Error` if the operation fails or the version is not supported. + pub fn fetch_identity_nonce( + &self, + identity_id: [u8; 32], + apply: bool, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result, Error> { + match platform_version + .drive + .methods + .identity + .fetch + .attributes + .nonce + { + 0 => self.fetch_identity_nonce_v0(identity_id, apply, transaction, platform_version), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "fetch_identity_nonce".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// Creates the operations to get Identity's nonce from the backing store. + /// + /// This function uses the versioning system to call the appropriate handler based on the provided `DriveVersion`. + /// + /// # Arguments + /// + /// * `identity_id` - Identity Id to fetch. + /// * `apply` - If `true`, the changes are applied, otherwise only the cost is estimated. + /// * `transaction` - Transaction arguments. + /// * `drive_operations` - A mutable reference to a vector of low-level drive operations. + /// * `platform_version` - A reference to the platform version. + /// + /// # Returns + /// + /// Returns a `Result` containing an `Option` for the Identity's nonce, otherwise an `Error` if the operation fails or the version is not supported. + pub(crate) fn fetch_identity_nonce_operations( + &self, + identity_id: [u8; 32], + apply: bool, + transaction: TransactionArg, + drive_operations: &mut Vec, + platform_version: &PlatformVersion, + ) -> Result, Error> { + match platform_version + .drive + .methods + .identity + .fetch + .attributes + .nonce + { + 0 => self.fetch_identity_nonce_operations_v0( + identity_id, + apply, + transaction, + drive_operations, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "fetch_identity_nonce_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// Fetches the Identity's nonce from the backing store with its associated fees. + /// + /// This function uses the versioning system to call the appropriate handler based on the provided `DriveVersion`. + /// + /// # Arguments + /// + /// * `identity_id` - Identity Id to fetch. + /// * `block_info` - Information about the block. + /// * `apply` - If `true`, the changes are applied, otherwise only the cost is estimated. + /// * `transaction` - Transaction arguments. + /// * `platform_version` - A reference to the platform version. + /// + /// # Returns + /// + /// Returns a `Result` containing an `Option` for the Identity's nonce and the `FeeResult`, otherwise an `Error` if the operation fails or the version is not supported. + pub fn fetch_identity_nonce_with_fees( + &self, + identity_id: [u8; 32], + block_info: &BlockInfo, + apply: bool, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<(Option, FeeResult), Error> { + match platform_version + .drive + .methods + .identity + .fetch + .attributes + .nonce + { + 0 => self.fetch_identity_nonce_with_fees_v0( + identity_id, + block_info, + apply, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "fetch_identity_nonce_with_fees".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/identity/fetch/nonce/fetch_identity_nonce/v0/mod.rs b/packages/rs-drive/src/drive/identity/fetch/nonce/fetch_identity_nonce/v0/mod.rs new file mode 100644 index 0000000000..79f32b45ea --- /dev/null +++ b/packages/rs-drive/src/drive/identity/fetch/nonce/fetch_identity_nonce/v0/mod.rs @@ -0,0 +1,112 @@ +use crate::drive::grove_operations::DirectQueryType; +use crate::drive::grove_operations::QueryTarget::QueryTargetValue; +use crate::drive::identity::identity_path; +use crate::drive::identity::IdentityRootStructure::IdentityTreeNonce; +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fee::op::LowLevelDriveOperation; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::prelude::IdentityNonce; + +use dpp::version::PlatformVersion; +use grovedb::Element::Item; +use grovedb::TransactionArg; + +impl Drive { + /// Fetches the Identity's nonce from the backing store + /// Passing apply as false get the estimated cost instead + pub(super) fn fetch_identity_nonce_v0( + &self, + identity_id: [u8; 32], + apply: bool, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result, Error> { + let mut drive_operations: Vec = vec![]; + self.fetch_identity_nonce_operations_v0( + identity_id, + apply, + transaction, + &mut drive_operations, + platform_version, + ) + } + + /// Creates the operations to get Identity's nonce from the backing store + /// This gets operations based on apply flag (stateful vs stateless) + pub(super) fn fetch_identity_nonce_operations_v0( + &self, + identity_id: [u8; 32], + apply: bool, + transaction: TransactionArg, + drive_operations: &mut Vec, + platform_version: &PlatformVersion, + ) -> Result, Error> { + let direct_query_type = if apply { + DirectQueryType::StatefulDirectQuery + } else { + DirectQueryType::StatelessDirectQuery { + in_tree_using_sums: false, + query_target: QueryTargetValue(1), + } + }; + let identity_path = identity_path(identity_id.as_slice()); + match self.grove_get_raw_optional( + (&identity_path).into(), + &[IdentityTreeNonce as u8], + direct_query_type, + transaction, + drive_operations, + &platform_version.drive, + ) { + Ok(Some(Item(encoded_nonce, _))) => { + let nonce = + IdentityNonce::from_be_bytes(encoded_nonce.try_into().map_err(|_| { + Error::Drive(DriveError::CorruptedElementType( + "identity nonce was not 8 bytes as expected", + )) + })?); + + Ok(Some(nonce)) + } + + Ok(None) => Ok(None), + + Ok(Some(..)) => Err(Error::Drive(DriveError::CorruptedElementType( + "identity nonce was present but was not identified as an item", + ))), + + Err(e) => Err(e), + } + } + + /// Fetches the Identity's nonce from the backing store + /// Passing apply as false get the estimated cost instead + pub(super) fn fetch_identity_nonce_with_fees_v0( + &self, + identity_id: [u8; 32], + block_info: &BlockInfo, + apply: bool, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<(Option, FeeResult), Error> { + let mut drive_operations: Vec = vec![]; + let value = self.fetch_identity_nonce_operations_v0( + identity_id, + apply, + transaction, + &mut drive_operations, + platform_version, + )?; + let fees = Drive::calculate_fee( + None, + Some(drive_operations), + &block_info.epoch, + self.config.epochs_per_era, + platform_version, + )?; + Ok((value, fees)) + } +} diff --git a/packages/rs-drive/src/drive/identity/fetch/nonce/mod.rs b/packages/rs-drive/src/drive/identity/fetch/nonce/mod.rs new file mode 100644 index 0000000000..6eea4fe165 --- /dev/null +++ b/packages/rs-drive/src/drive/identity/fetch/nonce/mod.rs @@ -0,0 +1,2 @@ +mod fetch_identity_nonce; +mod prove_identity_nonce; diff --git a/packages/rs-drive/src/drive/identity/fetch/nonce/prove_identity_nonce/mod.rs b/packages/rs-drive/src/drive/identity/fetch/nonce/prove_identity_nonce/mod.rs new file mode 100644 index 0000000000..a4f18d1af1 --- /dev/null +++ b/packages/rs-drive/src/drive/identity/fetch/nonce/prove_identity_nonce/mod.rs @@ -0,0 +1,43 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::{drive::DriveError, Error}; +use crate::fee::op::LowLevelDriveOperation; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::prelude::IdentityNonce; + +use dpp::version::PlatformVersion; +use grovedb::TransactionArg; + +impl Drive { + /// Fetches the Identity's nonce from the backing store + /// + /// This function uses the versioning system to call the appropriate handler based on the provided `DriveVersion`. + /// + /// # Arguments + /// + /// * `identity_id` - Identity Id to prove. + /// * `apply` - If `true`, the changes are applied, otherwise only the cost is estimated. + /// * `transaction` - Transaction arguments. + /// * `platform_version` - A reference to the platform version. + /// + /// # Returns + /// + /// Returns a `Result` containing a Proof for the Identity's nonce, otherwise an `Error` if the operation fails or the version is not supported. + pub fn prove_identity_nonce( + &self, + identity_id: [u8; 32], + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result, Error> { + match platform_version.drive.methods.identity.prove.identity_nonce { + 0 => self.prove_identity_nonce_v0(identity_id, transaction, platform_version), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "prove_identity_nonce".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/identity/fetch/nonce/prove_identity_nonce/v0/mod.rs b/packages/rs-drive/src/drive/identity/fetch/nonce/prove_identity_nonce/v0/mod.rs new file mode 100644 index 0000000000..e3c48511f9 --- /dev/null +++ b/packages/rs-drive/src/drive/identity/fetch/nonce/prove_identity_nonce/v0/mod.rs @@ -0,0 +1,25 @@ +use crate::drive::Drive; +use crate::error::Error; + +use dpp::version::PlatformVersion; +use grovedb::TransactionArg; + +impl Drive { + /// Proves the Identity's nonce from the backing store + /// Passing apply as false get the estimated cost instead + pub(super) fn prove_identity_nonce_v0( + &self, + identity_id: [u8; 32], + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result, Error> { + let nonce_query = Self::identity_nonce_query(identity_id); + self.grove_get_proved_path_query( + &nonce_query, + false, + transaction, + &mut vec![], + &platform_version.drive, + ) + } +} diff --git a/packages/rs-drive/src/drive/identity/fetch/partial_identity/fetch_identity_balance_with_keys/v0/mod.rs b/packages/rs-drive/src/drive/identity/fetch/partial_identity/fetch_identity_balance_with_keys/v0/mod.rs index c4bf3aeaf1..5524071534 100644 --- a/packages/rs-drive/src/drive/identity/fetch/partial_identity/fetch_identity_balance_with_keys/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/fetch/partial_identity/fetch_identity_balance_with_keys/v0/mod.rs @@ -63,6 +63,7 @@ impl Drive { loaded_public_keys, balance: Some(balance), revision: None, + not_found_public_keys, })) } @@ -109,6 +110,7 @@ impl Drive { loaded_public_keys, balance: Some(balance), revision: None, + not_found_public_keys: Default::default(), }), FeeResult::new_from_processing_fee(balance_cost + keys_cost), diff --git a/packages/rs-drive/src/drive/identity/fetch/partial_identity/fetch_identity_balance_with_keys_and_revision/v0/mod.rs b/packages/rs-drive/src/drive/identity/fetch/partial_identity/fetch_identity_balance_with_keys_and_revision/v0/mod.rs index f5b8346d9d..dafe030a9c 100644 --- a/packages/rs-drive/src/drive/identity/fetch/partial_identity/fetch_identity_balance_with_keys_and_revision/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/fetch/partial_identity/fetch_identity_balance_with_keys_and_revision/v0/mod.rs @@ -68,6 +68,7 @@ impl Drive { loaded_public_keys, balance: Some(balance), revision: Some(revision), + not_found_public_keys, })) } diff --git a/packages/rs-drive/src/drive/identity/fetch/partial_identity/fetch_identity_with_balance/v0/mod.rs b/packages/rs-drive/src/drive/identity/fetch/partial_identity/fetch_identity_with_balance/v0/mod.rs index 6a870ed158..f7d87d2ba1 100644 --- a/packages/rs-drive/src/drive/identity/fetch/partial_identity/fetch_identity_with_balance/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/fetch/partial_identity/fetch_identity_with_balance/v0/mod.rs @@ -35,6 +35,7 @@ impl Drive { loaded_public_keys: Default::default(), balance: Some(balance), revision: None, + not_found_public_keys: Default::default(), })) } @@ -67,6 +68,7 @@ impl Drive { loaded_public_keys: Default::default(), balance: Some(balance), revision: None, + not_found_public_keys: Default::default(), }), FeeResult::new_from_processing_fee(balance_cost), diff --git a/packages/rs-drive/src/drive/identity/fetch/queries/mod.rs b/packages/rs-drive/src/drive/identity/fetch/queries/mod.rs index 626939f00c..7d964588ad 100644 --- a/packages/rs-drive/src/drive/identity/fetch/queries/mod.rs +++ b/packages/rs-drive/src/drive/identity/fetch/queries/mod.rs @@ -4,8 +4,11 @@ use crate::drive::{unique_key_hashes_tree_path_vec, Drive}; use crate::error::Error; -use crate::drive::identity::identity_path_vec; -use crate::drive::identity::IdentityRootStructure::IdentityTreeRevision; +use crate::drive::identity::contract_info::ContractInfoStructure::IdentityContractNonceKey; +use crate::drive::identity::IdentityRootStructure::{IdentityTreeNonce, IdentityTreeRevision}; +use crate::drive::identity::{ + identity_contract_info_group_path, identity_contract_info_group_path_vec, identity_path_vec, +}; use crate::error::query::QuerySyntaxError; use grovedb::{PathQuery, Query, SizedQuery}; @@ -182,6 +185,22 @@ impl Drive { PathQuery::new_single_key(balance_path, identity_id.to_vec()) } + /// The query for proving an identity's nonce. + pub fn identity_nonce_query(identity_id: [u8; 32]) -> PathQuery { + let identity_path = identity_path_vec(identity_id.as_slice()); + PathQuery::new_single_key(identity_path, vec![IdentityTreeNonce as u8]) + } + + /// The query for proving the identities nonce for a specific contract. + pub fn identity_contract_nonce_query( + identity_id: [u8; 32], + contract_id: [u8; 32], + ) -> PathQuery { + let identity_contract_path = + identity_contract_info_group_path_vec(&identity_id, contract_id.as_slice()); + PathQuery::new_single_key(identity_contract_path, vec![IdentityContractNonceKey as u8]) + } + /// The query for proving the identities balance and revision from an identity id. pub fn balance_and_revision_for_identity_id_query(identity_id: [u8; 32]) -> PathQuery { let balance_path_query = Self::balance_for_identity_id_query(identity_id); diff --git a/packages/rs-drive/src/drive/identity/insert/add_new_identity/v0/mod.rs b/packages/rs-drive/src/drive/identity/insert/add_new_identity/v0/mod.rs index e2455dae82..217039ad48 100644 --- a/packages/rs-drive/src/drive/identity/insert/add_new_identity/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/insert/add_new_identity/v0/mod.rs @@ -244,10 +244,13 @@ impl Drive { .push(self.initialize_negative_identity_balance_operation_v0(id.to_buffer())); // We insert the revision - // todo: we might not need the revision batch_operations .push(self.initialize_identity_revision_operation_v0(id.to_buffer(), revision)); + // We insert a nonce of 0, nonces are used to prevent replay attacks, and should not be confused + // revisions + batch_operations.push(self.initialize_identity_nonce_operation_v0(id.to_buffer(), 0)); + let mut create_tree_keys_operations = self.create_key_tree_with_keys_operations( id.to_buffer(), public_keys.into_values().collect(), diff --git a/packages/rs-drive/src/drive/identity/mod.rs b/packages/rs-drive/src/drive/identity/mod.rs index eb67fc6494..4266517050 100644 --- a/packages/rs-drive/src/drive/identity/mod.rs +++ b/packages/rs-drive/src/drive/identity/mod.rs @@ -51,8 +51,8 @@ use integer_encoding::VarInt; #[cfg(any(feature = "full", feature = "verify"))] mod balance; -#[cfg(feature = "full")] -mod contract_info; +#[cfg(any(feature = "full", feature = "verify"))] +pub(crate) mod contract_info; #[cfg(feature = "full")] mod estimation_costs; #[cfg(any(feature = "full", feature = "verify"))] @@ -69,6 +69,7 @@ pub mod update; #[cfg(feature = "full")] pub use withdrawals::paths::add_initial_withdrawal_state_structure_operations; +use crate::drive::identity::contract_info::ContractInfoStructure; #[cfg(any(feature = "full", feature = "verify"))] pub use fetch::queries::*; @@ -107,6 +108,19 @@ pub fn identity_contract_info_root_path_vec(identity_id: &[u8; 32]) -> Vec( + identity_id: &'a [u8; 32], + group_id: &'a [u8], +) -> [&'a [u8]; 4] { + [ + Into::<&[u8; 1]>::into(RootTree::Identities), + identity_id, + Into::<&[u8; 1]>::into(IdentityRootStructure::IdentityContractInfo), + group_id, + ] +} + /// The group is either a contract id or on a family of contracts owned by the same identity pub fn identity_contract_info_group_path_vec( identity_id: &[u8; 32], @@ -120,6 +134,20 @@ pub fn identity_contract_info_group_path_vec( ] } +/// The group is either a contract id or on a family of contracts owned by the same identity +pub fn identity_contract_info_group_keys_path_vec( + identity_id: &[u8; 32], + group_id: &[u8], +) -> Vec> { + vec![ + vec![RootTree::Identities as u8], + identity_id.to_vec(), + vec![IdentityRootStructure::IdentityContractInfo as u8], + group_id.to_vec(), + vec![ContractInfoStructure::ContractInfoKeysKey as u8], + ] +} + /// The group is either a contract id or on a family of contracts owned by the same identity #[cfg(any(feature = "full", feature = "verify"))] pub fn identity_contract_info_group_path_key_purpose_vec( @@ -132,6 +160,7 @@ pub fn identity_contract_info_group_path_key_purpose_vec( identity_id.to_vec(), vec![IdentityRootStructure::IdentityContractInfo as u8], group_id.to_vec(), + vec![ContractInfoStructure::ContractInfoKeysKey as u8], vec![key_purpose as u8], ] } @@ -293,16 +322,18 @@ pub(crate) fn identity_query_keys_full_tree_path<'a>( #[repr(u8)] #[derive(Copy, Clone)] pub enum IdentityRootStructure { - /// The revision of identity data - IdentityTreeRevision = 0, + /// The revision of the identity + IdentityTreeRevision = 192, + /// The nonce of the identity, it is used to prevent replay attacks + IdentityTreeNonce = 64, /// The keys that an identity has - IdentityTreeKeys = 1, + IdentityTreeKeys = 128, /// A Way to search for specific keys - IdentityTreeKeyReferences = 2, + IdentityTreeKeyReferences = 160, /// Owed processing fees - IdentityTreeNegativeCredit = 3, + IdentityTreeNegativeCredit = 96, /// Identity contract information - IdentityContractInfo = 4, + IdentityContractInfo = 32, } #[cfg(feature = "full")] @@ -330,11 +361,12 @@ impl From for [u8; 1] { impl From for &'static [u8; 1] { fn from(identity_tree: IdentityRootStructure) -> Self { match identity_tree { - IdentityRootStructure::IdentityTreeRevision => &[0], - IdentityRootStructure::IdentityTreeKeys => &[1], - IdentityRootStructure::IdentityTreeKeyReferences => &[2], - IdentityRootStructure::IdentityTreeNegativeCredit => &[3], - IdentityRootStructure::IdentityContractInfo => &[4], + IdentityRootStructure::IdentityTreeRevision => &[192], + IdentityRootStructure::IdentityTreeNonce => &[64], + IdentityRootStructure::IdentityTreeKeys => &[128], + IdentityRootStructure::IdentityTreeKeyReferences => &[160], + IdentityRootStructure::IdentityTreeNegativeCredit => &[96], + IdentityRootStructure::IdentityContractInfo => &[32], } } } diff --git a/packages/rs-drive/src/drive/identity/update/methods/merge_identity_nonce/mod.rs b/packages/rs-drive/src/drive/identity/update/methods/merge_identity_nonce/mod.rs new file mode 100644 index 0000000000..ef70853307 --- /dev/null +++ b/packages/rs-drive/src/drive/identity/update/methods/merge_identity_nonce/mod.rs @@ -0,0 +1,128 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fee::op::LowLevelDriveOperation; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; + +use dpp::prelude::IdentityNonce; + +use dpp::version::PlatformVersion; +use grovedb::batch::KeyInfoPath; +use grovedb::{EstimatedLayerInformation, TransactionArg}; + +use crate::error::identity::IdentityError; +use dpp::identity::identity_nonce::MergeIdentityNonceResult; +use std::collections::HashMap; + +pub(crate) trait MergeIdentityContractNonceResultToResult { + fn to_result(self) -> Result<(), Error>; +} + +impl MergeIdentityContractNonceResultToResult for MergeIdentityNonceResult { + /// Gives a result from the enum + fn to_result(self) -> Result<(), Error> { + if let Some(error_message) = self.error_message() { + Err(Error::Identity(IdentityError::IdentityNonceError( + error_message, + ))) + } else { + Ok(()) + } + } +} + +impl Drive { + /// Updates the nonce for a specific identity. This function is version controlled. + /// + /// # Arguments + /// + /// * `identity_id` - The ID of the Identity whose nonce is to be updated. + /// * `nonce` - The nonce to update to. + /// * `block_info` - The current block information. + /// * `apply` - Whether to apply the change. + /// * `transaction` - The current transaction. + /// * `drive_version` - The drive version. + /// + /// # Returns + /// + /// * `Result` - The resulting fee if successful, or an error. + pub fn merge_identity_nonce( + &self, + identity_id: [u8; 32], + nonce: IdentityNonce, + block_info: &BlockInfo, + apply: bool, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<(MergeIdentityNonceResult, Option), Error> { + match platform_version + .drive + .methods + .identity + .update + .merge_identity_nonce + { + 0 => self.merge_identity_nonce_v0( + identity_id, + nonce, + block_info, + apply, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "merge_identity_nonce".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// Updates the nonce operation of the identity. This function is version controlled. + /// + /// # Arguments + /// + /// * `identity_id` - The ID of the Identity whose nonce operation is to be updated. + /// * `nonce` - The nonce to update to. + /// * `estimated_costs_only_with_layer_info` - The estimated costs with layer information. + /// + /// # Returns + /// + /// * `LowLevelDriveOperation` - The resulting low level drive operation. + pub fn merge_identity_nonce_operations( + &self, + identity_id: [u8; 32], + nonce: IdentityNonce, + block_info: &BlockInfo, + estimated_costs_only_with_layer_info: &mut Option< + HashMap, + >, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<(MergeIdentityNonceResult, Vec), Error> { + match platform_version + .drive + .methods + .identity + .update + .merge_identity_nonce + { + 0 => self.merge_identity_nonce_operations_v0( + identity_id, + nonce, + block_info, + estimated_costs_only_with_layer_info, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "merge_identity_nonce_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/identity/update/methods/merge_identity_nonce/v0/mod.rs b/packages/rs-drive/src/drive/identity/update/methods/merge_identity_nonce/v0/mod.rs new file mode 100644 index 0000000000..fd549dfe59 --- /dev/null +++ b/packages/rs-drive/src/drive/identity/update/methods/merge_identity_nonce/v0/mod.rs @@ -0,0 +1,74 @@ +use dpp::block::block_info::BlockInfo; + +use crate::drive::Drive; + +use crate::error::Error; +use crate::fee::op::LowLevelDriveOperation; +use grovedb::batch::KeyInfoPath; + +use dpp::fee::fee_result::FeeResult; + +use dpp::prelude::IdentityNonce; + +use dpp::version::PlatformVersion; +use grovedb::{EstimatedLayerInformation, TransactionArg}; + +use crate::drive::identity::update::methods::merge_identity_nonce::MergeIdentityContractNonceResultToResult; +use dpp::identity::identity_nonce::MergeIdentityNonceResult; +use std::collections::HashMap; + +impl Drive { + /// Update nonce for specific identity + pub fn merge_identity_nonce_v0( + &self, + identity_id: [u8; 32], + nonce: IdentityNonce, + block_info: &BlockInfo, + apply: bool, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<(MergeIdentityNonceResult, Option), Error> { + // TODO: In case of dry run we will get less because we replace the same bytes + + let mut estimated_costs_only_with_layer_info = if apply { + None::> + } else { + Some(HashMap::new()) + }; + + let (result, batch_operations) = self.merge_identity_nonce_operations_v0( + identity_id, + nonce, + block_info, + &mut estimated_costs_only_with_layer_info, + transaction, + platform_version, + )?; + + let mut drive_operations: Vec = vec![]; + + let fees = if result.is_error() { + None + } else { + self.apply_batch_low_level_drive_operations( + estimated_costs_only_with_layer_info, + transaction, + batch_operations, + &mut drive_operations, + &platform_version.drive, + )?; + + let fees = Drive::calculate_fee( + None, + Some(drive_operations), + &block_info.epoch, + self.config.epochs_per_era, + platform_version, + )?; + + Some(fees) + }; + + Ok((result, fees)) + } +} diff --git a/packages/rs-drive/src/drive/identity/update/methods/mod.rs b/packages/rs-drive/src/drive/identity/update/methods/mod.rs index 0bb1e1e30a..4de31c83ff 100644 --- a/packages/rs-drive/src/drive/identity/update/methods/mod.rs +++ b/packages/rs-drive/src/drive/identity/update/methods/mod.rs @@ -5,6 +5,7 @@ mod add_to_identity_balance; mod add_to_previous_balance; mod apply_balance_change_from_fee_to_identity; mod disable_identity_keys; +pub(crate) mod merge_identity_nonce; mod re_enable_identity_keys; mod remove_from_identity_balance; mod update_identity_revision; diff --git a/packages/rs-drive/src/drive/identity/update/mod.rs b/packages/rs-drive/src/drive/identity/update/mod.rs index fcdee4602d..23f4331791 100644 --- a/packages/rs-drive/src/drive/identity/update/mod.rs +++ b/packages/rs-drive/src/drive/identity/update/mod.rs @@ -1,4 +1,4 @@ -mod methods; +pub(crate) mod methods; mod operations; mod structs; @@ -61,7 +61,7 @@ mod tests { fee_result, FeeResult { storage_fee: 14202000, - processing_fee: 2364090, + processing_fee: 2434150, ..Default::default() } ); @@ -121,7 +121,7 @@ mod tests { fee_result, FeeResult { storage_fee: 347382000, - processing_fee: 9274850, + processing_fee: 9344910, ..Default::default() } ); @@ -255,7 +255,7 @@ mod tests { fee_result, FeeResult { storage_fee: 513000, - processing_fee: 1582060, + processing_fee: 1452800, ..Default::default() } ); @@ -425,7 +425,7 @@ mod tests { fee_result, FeeResult { storage_fee: 0, - processing_fee: 715520, + processing_fee: 648660, removed_bytes_from_system: 0, ..Default::default() } diff --git a/packages/rs-drive/src/drive/identity/update/operations/initialize_identity_nonce_operation/mod.rs b/packages/rs-drive/src/drive/identity/update/operations/initialize_identity_nonce_operation/mod.rs new file mode 100644 index 0000000000..e084dffc38 --- /dev/null +++ b/packages/rs-drive/src/drive/identity/update/operations/initialize_identity_nonce_operation/mod.rs @@ -0,0 +1 @@ +mod v0; diff --git a/packages/rs-drive/src/drive/identity/update/operations/initialize_identity_nonce_operation/v0/mod.rs b/packages/rs-drive/src/drive/identity/update/operations/initialize_identity_nonce_operation/v0/mod.rs new file mode 100644 index 0000000000..4d209c4f40 --- /dev/null +++ b/packages/rs-drive/src/drive/identity/update/operations/initialize_identity_nonce_operation/v0/mod.rs @@ -0,0 +1,23 @@ +use crate::drive::identity::{identity_path_vec, IdentityRootStructure}; +use crate::drive::Drive; +use crate::fee::op::LowLevelDriveOperation; +use dpp::prelude::{IdentityNonce, Revision}; +use grovedb::Element; + +impl Drive { + /// Initialize the nonce of the identity, should only be called on create identity + /// Nonces get bumped on all identity state transitions except those that use an asset lock + pub(in crate::drive::identity) fn initialize_identity_nonce_operation_v0( + &self, + identity_id: [u8; 32], + nonce: IdentityNonce, + ) -> LowLevelDriveOperation { + let identity_path = identity_path_vec(identity_id.as_slice()); + let revision_bytes = nonce.to_be_bytes().to_vec(); + LowLevelDriveOperation::insert_for_known_path_key_element( + identity_path, + Into::<&[u8; 1]>::into(IdentityRootStructure::IdentityTreeNonce).to_vec(), + Element::new_item(revision_bytes), + ) + } +} diff --git a/packages/rs-drive/src/drive/identity/update/operations/merge_identity_nonce_operations/mod.rs b/packages/rs-drive/src/drive/identity/update/operations/merge_identity_nonce_operations/mod.rs new file mode 100644 index 0000000000..e084dffc38 --- /dev/null +++ b/packages/rs-drive/src/drive/identity/update/operations/merge_identity_nonce_operations/mod.rs @@ -0,0 +1 @@ +mod v0; diff --git a/packages/rs-drive/src/drive/identity/update/operations/merge_identity_nonce_operations/v0/mod.rs b/packages/rs-drive/src/drive/identity/update/operations/merge_identity_nonce_operations/v0/mod.rs new file mode 100644 index 0000000000..4276f47e32 --- /dev/null +++ b/packages/rs-drive/src/drive/identity/update/operations/merge_identity_nonce_operations/v0/mod.rs @@ -0,0 +1,462 @@ +use crate::drive::identity::{identity_path, identity_path_vec, IdentityRootStructure}; +use crate::drive::Drive; + +use crate::error::Error; + +use crate::fee::op::LowLevelDriveOperation; +use grovedb::batch::KeyInfoPath; + +use dpp::prelude::IdentityNonce; + +use dpp::version::PlatformVersion; +use grovedb::{Element, EstimatedLayerInformation, TransactionArg}; + +use crate::drive::identity::IdentityRootStructure::IdentityTreeNonce; +use crate::drive::object_size_info::PathKeyElementInfo; +use crate::error::identity::IdentityError; +use dpp::block::block_info::BlockInfo; +use dpp::identity::identity_nonce::MergeIdentityNonceResult::{ + MergeIdentityNonceSuccess, NonceAlreadyPresentAtTip, NonceAlreadyPresentInPast, + NonceTooFarInFuture, NonceTooFarInPast, +}; +use dpp::identity::identity_nonce::{ + MergeIdentityNonceResult, IDENTITY_NONCE_VALUE_FILTER, IDENTITY_NONCE_VALUE_FILTER_MAX_BYTES, + MAX_MISSING_IDENTITY_REVISIONS, MISSING_IDENTITY_REVISIONS_FILTER, + MISSING_IDENTITY_REVISIONS_MAX_BYTES, +}; +use std::collections::HashMap; + +impl Drive { + /// Update the nonce of the identity + /// Nonces get bumped on all identity state transitions except those that use an asset lock + pub(in crate::drive::identity::update) fn merge_identity_nonce_operations_v0( + &self, + identity_id: [u8; 32], + revision_nonce: IdentityNonce, + block_info: &BlockInfo, + estimated_costs_only_with_layer_info: &mut Option< + HashMap, + >, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<(MergeIdentityNonceResult, Vec), Error> { + let mut drive_operations = vec![]; + + if revision_nonce & MISSING_IDENTITY_REVISIONS_FILTER > 0 { + return Ok((MergeIdentityNonceResult::InvalidNonce, drive_operations)); + } + + if revision_nonce == 0 { + return Ok((MergeIdentityNonceResult::InvalidNonce, drive_operations)); + } + + if let Some(estimated_costs_only_with_layer_info) = estimated_costs_only_with_layer_info { + Self::add_estimation_costs_for_update_nonce( + identity_id, + estimated_costs_only_with_layer_info, + &platform_version.drive, + )?; + } + + let (existing_nonce, fees) = self.fetch_identity_nonce_with_fees( + identity_id, + block_info, + estimated_costs_only_with_layer_info.is_none(), + transaction, + platform_version, + )?; + + let nonce_to_set = if estimated_costs_only_with_layer_info.is_some() { + // we are just getting estimated costs + revision_nonce + } else if let Some(existing_nonce) = existing_nonce { + let actual_existing_revision = existing_nonce & IDENTITY_NONCE_VALUE_FILTER; + if actual_existing_revision == revision_nonce { + // we were not able to update the revision as it is the same as we already had + return Ok((NonceAlreadyPresentAtTip, drive_operations)); + } else if actual_existing_revision < revision_nonce { + if revision_nonce - actual_existing_revision > MISSING_IDENTITY_REVISIONS_MAX_BYTES + { + // we are too far away from the actual revision + return Ok((NonceTooFarInFuture, drive_operations)); + } else { + let missing_amount_of_revisions = revision_nonce - actual_existing_revision - 1; + let new_previous_missing_revisions = (existing_nonce + & MISSING_IDENTITY_REVISIONS_FILTER) + << (missing_amount_of_revisions + 1); + // the missing_revisions_bytes are the amount of bytes to put in the missing area + let missing_revisions_bytes = if missing_amount_of_revisions > 0 { + ((1 << missing_amount_of_revisions) - 1) + << IDENTITY_NONCE_VALUE_FILTER_MAX_BYTES + } else { + 0 + }; + new_previous_missing_revisions | revision_nonce | missing_revisions_bytes + } + } else { + let previous_revision_position_from_top = actual_existing_revision - revision_nonce; + if previous_revision_position_from_top >= MISSING_IDENTITY_REVISIONS_MAX_BYTES { + // we are too far away from the actual revision + return Ok((NonceTooFarInPast, drive_operations)); + } else { + let old_missing_revisions = existing_nonce & MISSING_IDENTITY_REVISIONS_FILTER; + if old_missing_revisions == 0 { + return Ok(( + NonceAlreadyPresentInPast(previous_revision_position_from_top), + drive_operations, + )); + } else { + let byte_to_unset = 1 + << (previous_revision_position_from_top - 1 + + IDENTITY_NONCE_VALUE_FILTER_MAX_BYTES); + let old_revision_already_set = + old_missing_revisions | byte_to_unset != old_missing_revisions; + if old_revision_already_set { + return Ok(( + NonceAlreadyPresentInPast(previous_revision_position_from_top), + drive_operations, + )); + } else { + existing_nonce & !byte_to_unset + } + } + } + } + } else if revision_nonce >= MISSING_IDENTITY_REVISIONS_MAX_BYTES { + // we are too far away from the actual revision + return Ok((NonceTooFarInFuture, drive_operations)); + } else { + // there was no previous revision nonce, just set it + + let missing_amount_of_revisions = revision_nonce - 1; + // the missing_revisions_bytes are the amount of bytes to put in the missing area + let missing_revisions_bytes = if missing_amount_of_revisions > 0 { + ((1 << missing_amount_of_revisions) - 1) << IDENTITY_NONCE_VALUE_FILTER_MAX_BYTES + } else { + 0 + }; + + missing_revisions_bytes | revision_nonce + }; + + let identity_nonce_bytes = nonce_to_set.to_be_bytes().to_vec(); + let identity_nonce_element = Element::new_item(identity_nonce_bytes); + + //println!("{} is {:b}, existing was {:?}", nonce_to_set, nonce_to_set, existing_nonce); + + self.batch_insert( + PathKeyElementInfo::PathFixedSizeKeyRefElement(( + identity_path(&identity_id), + &[IdentityTreeNonce as u8], + identity_nonce_element, + )), + &mut drive_operations, + &platform_version.drive, + )?; + + Ok((MergeIdentityNonceSuccess(nonce_to_set), drive_operations)) + } +} + +#[cfg(feature = "full")] +#[cfg(test)] +mod tests { + use crate::drive::Drive; + use crate::tests::helpers::setup::setup_drive; + use dpp::block::block_info::BlockInfo; + use dpp::identity::accessors::IdentityGettersV0; + use dpp::identity::Identity; + use dpp::prelude::IdentityNonce; + use platform_version::version::PlatformVersion; + + fn setup_base_test() -> (Drive, Identity) { + let drive = setup_drive(None); + let transaction = drive.grove.start_transaction(); + + let platform_version = PlatformVersion::first(); + + drive + .create_initial_state_structure(Some(&transaction), platform_version) + .expect("expected to create root tree successfully"); + + let identity = Identity::random_identity(5, Some(12345), platform_version) + .expect("expected a random identity"); + + drive + .add_new_identity( + identity.clone(), + false, + &BlockInfo::default(), + true, + Some(&transaction), + platform_version, + ) + .expect("expected to insert identity"); + + drive + .merge_identity_nonce_v0( + identity.id().to_buffer(), + 1, + &BlockInfo::default(), + true, + Some(&transaction), + platform_version, + ) + .expect("expected to merge identity nonce"); + + drive + .commit_transaction(transaction, &platform_version.drive) + .expect("expected to commit transaction"); + + (drive, identity) + } + + #[test] + fn merge_identity_nonce_with_bump() { + let (drive, identity) = setup_base_test(); + + let platform_version = PlatformVersion::first(); + + let transaction = drive.grove.start_transaction(); + + drive + .merge_identity_nonce_v0( + identity.id().to_buffer(), + 2, + &BlockInfo::default(), + true, + Some(&transaction), + platform_version, + ) + .expect("expected to merge identity nonce"); + } + + #[test] + fn merge_identity_nonce_0_is_invalid() { + let (drive, identity) = setup_base_test(); + + let platform_version = PlatformVersion::first(); + + let transaction = drive.grove.start_transaction(); + + let (result, _) = drive + .merge_identity_nonce_v0( + identity.id().to_buffer(), + 0, + &BlockInfo::default(), + true, + Some(&transaction), + platform_version, + ) + .expect("expected to merge identity nonce"); + + assert_eq!(result.error_message(), Some("nonce is an invalid value")); + } + + #[test] + fn merge_identity_nonce_many_updates() { + let (drive, identity) = setup_base_test(); + + let platform_version = PlatformVersion::first(); + + let transaction = drive.grove.start_transaction(); + + let (result, _) = drive + .merge_identity_nonce_v0( + identity.id().to_buffer(), + 10, + &BlockInfo::default(), + true, + Some(&transaction), + platform_version, + ) + .expect("expected to merge identity nonce"); + + assert!(result.error_message().is_none()); + + let (result, _) = drive + .merge_identity_nonce_v0( + identity.id().to_buffer(), + 9, + &BlockInfo::default(), + true, + Some(&transaction), + platform_version, + ) + .expect("expected to merge identity nonce"); + + assert!(result.error_message().is_none()); + + let (result, _) = drive + .merge_identity_nonce_v0( + identity.id().to_buffer(), + 8, + &BlockInfo::default(), + true, + Some(&transaction), + platform_version, + ) + .expect("expected to merge identity nonce"); + + assert!(result.error_message().is_none()); + + let (result, _) = drive + .merge_identity_nonce_v0( + identity.id().to_buffer(), + 3, + &BlockInfo::default(), + true, + Some(&transaction), + platform_version, + ) + .expect("expected to merge identity nonce"); + + assert!(result.error_message().is_none()); + + let (result, _) = drive + .merge_identity_nonce_v0( + identity.id().to_buffer(), + 12, + &BlockInfo::default(), + true, + Some(&transaction), + platform_version, + ) + .expect("expected to merge identity nonce"); + + assert!(result.error_message().is_none()); + + let (result, _) = drive + .merge_identity_nonce_v0( + identity.id().to_buffer(), + 11, + &BlockInfo::default(), + true, + Some(&transaction), + platform_version, + ) + .expect("expected to merge identity nonce"); + + assert!(result.error_message().is_none()); + + let (result, _) = drive + .merge_identity_nonce_v0( + identity.id().to_buffer(), + 11, + &BlockInfo::default(), + true, + Some(&transaction), + platform_version, + ) + .expect("expected to merge identity nonce"); + + assert_eq!( + result.error_message(), + Some("nonce already present in past") + ); + + let (result, _) = drive + .merge_identity_nonce_v0( + identity.id().to_buffer(), + 12, + &BlockInfo::default(), + true, + Some(&transaction), + platform_version, + ) + .expect("expected to merge identity nonce"); + + assert_eq!(result.error_message(), Some("nonce already present at tip")); + + let (result, _) = drive + .merge_identity_nonce_v0( + identity.id().to_buffer(), + 0, + &BlockInfo::default(), + true, + Some(&transaction), + platform_version, + ) + .expect("expected to merge identity nonce"); + + assert_eq!(result.error_message(), Some("nonce is an invalid value")); + + let (result, _) = drive + .merge_identity_nonce_v0( + identity.id().to_buffer(), + 12 + 25, + &BlockInfo::default(), + true, + Some(&transaction), + platform_version, + ) + .expect("expected to merge identity nonce"); + + assert_eq!(result.error_message(), Some("nonce too far in future")); + + let (result, _) = drive + .merge_identity_nonce_v0( + identity.id().to_buffer(), + 12 + 24, // 36 + &BlockInfo::default(), + true, + Some(&transaction), + platform_version, + ) + .expect("expected to merge identity nonce"); + + assert!(result.error_message().is_none()); + + let (result, _) = drive + .merge_identity_nonce_v0( + identity.id().to_buffer(), + 13, + &BlockInfo::default(), + true, + Some(&transaction), + platform_version, + ) + .expect("expected to merge identity nonce"); + + assert!(result.error_message().is_none()); + + let (result, _) = drive + .merge_identity_nonce_v0( + identity.id().to_buffer(), + 12, + &BlockInfo::default(), + true, + Some(&transaction), + platform_version, + ) + .expect("expected to merge identity nonce"); + + assert_eq!(result.error_message(), Some("nonce too far in past")); + + let (result, _) = drive + .merge_identity_nonce_v0( + identity.id().to_buffer(), + 8, + &BlockInfo::default(), + true, + Some(&transaction), + platform_version, + ) + .expect("expected to merge identity nonce"); + + assert_eq!(result.error_message(), Some("nonce too far in past")); + + let (result, _) = drive + .merge_identity_nonce_v0( + identity.id().to_buffer(), + IdentityNonce::MAX, + &BlockInfo::default(), + true, + Some(&transaction), + platform_version, + ) + .expect("expected to merge identity nonce"); + + assert_eq!(result.error_message(), Some("nonce is an invalid value")); + } +} diff --git a/packages/rs-drive/src/drive/identity/update/operations/mod.rs b/packages/rs-drive/src/drive/identity/update/operations/mod.rs index 6f4ec0475f..8440044fb7 100644 --- a/packages/rs-drive/src/drive/identity/update/operations/mod.rs +++ b/packages/rs-drive/src/drive/identity/update/operations/mod.rs @@ -1,6 +1,8 @@ +mod initialize_identity_nonce_operation; mod initialize_identity_revision_operation; mod initialize_negative_identity_balance_operation; mod insert_identity_balance_operation; +mod merge_identity_nonce_operations; mod update_identity_balance_operation; mod update_identity_negative_credit_operation; mod update_identity_revision_operation; diff --git a/packages/rs-drive/src/drive/verify/identity/mod.rs b/packages/rs-drive/src/drive/verify/identity/mod.rs index e9dd259cfe..05d2d9d2b3 100644 --- a/packages/rs-drive/src/drive/verify/identity/mod.rs +++ b/packages/rs-drive/src/drive/verify/identity/mod.rs @@ -4,7 +4,9 @@ mod verify_full_identity_by_public_key_hash; mod verify_identity_balance_and_revision_for_identity_id; mod verify_identity_balance_for_identity_id; mod verify_identity_balances_for_identity_ids; +mod verify_identity_contract_nonce; mod verify_identity_id_by_public_key_hash; mod verify_identity_ids_by_public_key_hashes; mod verify_identity_keys_by_identity_id; +mod verify_identity_nonce; mod verify_identity_revision_for_identity_id; diff --git a/packages/rs-drive/src/drive/verify/identity/verify_identity_contract_nonce/mod.rs b/packages/rs-drive/src/drive/verify/identity/verify_identity_contract_nonce/mod.rs new file mode 100644 index 0000000000..b3d4a07bf4 --- /dev/null +++ b/packages/rs-drive/src/drive/verify/identity/verify_identity_contract_nonce/mod.rs @@ -0,0 +1,63 @@ +mod v0; + +use crate::drive::Drive; + +use crate::error::drive::DriveError; + +use crate::error::Error; + +use crate::drive::verify::RootHash; + +use dpp::version::PlatformVersion; + +impl Drive { + /// Verifies the balance of an identity by their identity ID. + /// + /// # Parameters + /// + /// - `proof`: A byte slice representing the proof of authentication from the user. + /// - `identity_id`: A 32-byte array representing the identity ID of the user. + /// - `contract_id`: A 32-byte array representing the contract ID that the nonce is for. + /// - `verify_subset_of_proof`: A boolean indicating whether we are verifying a subset of a larger proof. + /// - `platform_version`: The platform version against which to verify the identity balance. + /// + /// # Returns + /// + /// If the verification is successful, it returns a `Result` with a tuple of `RootHash` and + /// an `Option`. The `RootHash` represents the root hash of GroveDB, and the + /// `Option` represents the balance of the user's identity if it exists. + /// + /// # Errors + /// + /// Returns an `Error` if: + /// + /// - The proof of authentication is not valid. + /// + pub fn verify_identity_contract_nonce( + proof: &[u8], + identity_id: [u8; 32], + contract_id: [u8; 32], + verify_subset_of_proof: bool, + platform_version: &PlatformVersion, + ) -> Result<(RootHash, Option), Error> { + match platform_version + .drive + .methods + .verify + .identity + .verify_identity_contract_nonce + { + 0 => Self::verify_identity_contract_nonce_v0( + proof, + identity_id, + contract_id, + verify_subset_of_proof, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "verify_identity_contract_nonce".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/verify/identity/verify_identity_contract_nonce/v0/mod.rs b/packages/rs-drive/src/drive/verify/identity/verify_identity_contract_nonce/v0/mod.rs new file mode 100644 index 0000000000..96dfa4a10f --- /dev/null +++ b/packages/rs-drive/src/drive/verify/identity/verify_identity_contract_nonce/v0/mod.rs @@ -0,0 +1,85 @@ +use crate::drive::Drive; + +use crate::error::proof::ProofError; +use crate::error::Error; + +use crate::drive::verify::RootHash; + +use crate::drive::identity::contract_info::ContractInfoStructure::IdentityContractNonceKey; +use crate::drive::identity::identity_contract_info_group_path_vec; +use grovedb::GroveDb; + +impl Drive { + /// Verifies the balance of an identity by their identity ID. + /// + /// `verify_subset_of_proof` is used to indicate if we want to verify a subset of a bigger proof. + /// For example, if the proof can prove the balance and the revision, but here we are only interested + /// in verifying the balance. + /// + /// # Parameters + /// + /// - `proof`: A byte slice representing the proof of authentication from the user. + /// - `identity_id`: A 32-byte array representing the identity ID of the user. + /// - `contract_id`: A 32-byte array representing the contract ID that the nonce is for. + /// - `verify_subset_of_proof`: A boolean indicating whether we are verifying a subset of a larger proof. + /// + /// # Returns + /// + /// If the verification is successful, it returns a `Result` with a tuple of `RootHash` and + /// an `Option`. The `RootHash` represents the root hash of GroveDB, and the + /// `Option` represents the balance of the user's identity if it exists. + /// + /// # Errors + /// + /// Returns an `Error` if: + /// + /// - The proof of authentication is not valid. + /// - The identity ID does not correspond to a valid identity. + /// + pub(crate) fn verify_identity_contract_nonce_v0( + proof: &[u8], + identity_id: [u8; 32], + contract_id: [u8; 32], + verify_subset_of_proof: bool, + ) -> Result<(RootHash, Option), Error> { + let mut path_query = Self::identity_contract_nonce_query(identity_id, contract_id); + path_query.query.limit = Some(1); + let (root_hash, mut proved_key_values) = if verify_subset_of_proof { + GroveDb::verify_subset_query_with_absence_proof(proof, &path_query)? + } else { + GroveDb::verify_query_with_absence_proof(proof, &path_query)? + }; + if proved_key_values.len() == 1 { + let (path, key, maybe_element) = proved_key_values.remove(0); + if path != identity_contract_info_group_path_vec(&identity_id, contract_id.as_slice()) { + return Err(Error::Proof(ProofError::CorruptedProof( + "we did not get back an element for the correct path for the identity contract nonce".to_string(), + ))); + } + if key != vec![IdentityContractNonceKey as u8] { + return Err(Error::Proof(ProofError::CorruptedProof( + "we did not get back an element for the correct key for the identity contract nonce".to_string(), + ))); + } + + let identity_contract_nonce = maybe_element + .map(|element| { + let bytes: [u8; 8] = element + .into_item_bytes() + .map_err(Error::GroveDB)? + .try_into() + .map_err(|_| { + Error::Proof(ProofError::IncorrectValueSize("value size is incorrect")) + })?; + + Ok::(u64::from_be_bytes(bytes)) + }) + .transpose()?; + Ok((root_hash, identity_contract_nonce)) + } else { + Err(Error::Proof(ProofError::TooManyElements( + "expected one identity contract nonce", + ))) + } + } +} diff --git a/packages/rs-drive/src/drive/verify/identity/verify_identity_keys_by_identity_id/v0/mod.rs b/packages/rs-drive/src/drive/verify/identity/verify_identity_keys_by_identity_id/v0/mod.rs index 4c674300a4..9a8de2f313 100644 --- a/packages/rs-drive/src/drive/verify/identity/verify_identity_keys_by_identity_id/v0/mod.rs +++ b/packages/rs-drive/src/drive/verify/identity/verify_identity_keys_by_identity_id/v0/mod.rs @@ -121,6 +121,7 @@ impl Drive { ))); } } + let maybe_identity = Some(PartialIdentity { id: Identifier::from(identity_id), balance, diff --git a/packages/rs-drive/src/drive/verify/identity/verify_identity_nonce/mod.rs b/packages/rs-drive/src/drive/verify/identity/verify_identity_nonce/mod.rs new file mode 100644 index 0000000000..811f76fa96 --- /dev/null +++ b/packages/rs-drive/src/drive/verify/identity/verify_identity_nonce/mod.rs @@ -0,0 +1,57 @@ +mod v0; + +use crate::drive::Drive; + +use crate::error::drive::DriveError; + +use crate::error::Error; + +use crate::drive::verify::RootHash; + +use dpp::version::PlatformVersion; + +impl Drive { + /// Verifies the balance of an identity by their identity ID. + /// + /// # Parameters + /// + /// - `proof`: A byte slice representing the proof of authentication from the user. + /// - `identity_id`: A 32-byte array representing the identity ID of the user. + /// - `id`: A 32-byte array representing the contract ID that the nonce is for. + /// - `verify_subset_of_proof`: A boolean indicating whether we are verifying a subset of a larger proof. + /// - `platform_version`: The platform version against which to verify the identity balance. + /// + /// # Returns + /// + /// If the verification is successful, it returns a `Result` with a tuple of `RootHash` and + /// an `Option`. The `RootHash` represents the root hash of GroveDB, and the + /// `Option` represents the balance of the user's identity if it exists. + /// + /// # Errors + /// + /// Returns an `Error` if: + /// + /// - The proof of authentication is not valid. + /// + pub fn verify_identity_nonce( + proof: &[u8], + identity_id: [u8; 32], + verify_subset_of_proof: bool, + platform_version: &PlatformVersion, + ) -> Result<(RootHash, Option), Error> { + match platform_version + .drive + .methods + .verify + .identity + .verify_identity_nonce + { + 0 => Self::verify_identity_nonce_v0(proof, identity_id, verify_subset_of_proof), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "verify_identity_nonce".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/verify/identity/verify_identity_nonce/v0/mod.rs b/packages/rs-drive/src/drive/verify/identity/verify_identity_nonce/v0/mod.rs new file mode 100644 index 0000000000..a02f4a8be0 --- /dev/null +++ b/packages/rs-drive/src/drive/verify/identity/verify_identity_nonce/v0/mod.rs @@ -0,0 +1,85 @@ +use crate::drive::Drive; + +use crate::error::proof::ProofError; +use crate::error::Error; + +use crate::drive::verify::RootHash; + +use crate::drive::identity::identity_path_vec; +use crate::drive::identity::IdentityRootStructure::IdentityTreeNonce; +use grovedb::GroveDb; + +impl Drive { + /// Verifies the balance of an identity by their identity ID. + /// + /// `verify_subset_of_proof` is used to indicate if we want to verify a subset of a bigger proof. + /// For example, if the proof can prove the balance and the revision, but here we are only interested + /// in verifying the balance. + /// + /// # Parameters + /// + /// - `proof`: A byte slice representing the proof of authentication from the user. + /// - `identity_id`: A 32-byte array representing the identity ID of the user. + /// - `id`: A 32-byte array representing the contract ID that the nonce is for. + /// - `verify_subset_of_proof`: A boolean indicating whether we are verifying a subset of a larger proof. + /// + /// # Returns + /// + /// If the verification is successful, it returns a `Result` with a tuple of `RootHash` and + /// an `Option`. The `RootHash` represents the root hash of GroveDB, and the + /// `Option` represents the balance of the user's identity if it exists. + /// + /// # Errors + /// + /// Returns an `Error` if: + /// + /// - The proof of authentication is not valid. + /// - The identity ID does not correspond to a valid identity. + /// + pub(crate) fn verify_identity_nonce_v0( + proof: &[u8], + identity_id: [u8; 32], + verify_subset_of_proof: bool, + ) -> Result<(RootHash, Option), Error> { + let mut path_query = Self::identity_nonce_query(identity_id); + path_query.query.limit = Some(1); + let (root_hash, mut proved_key_values) = if verify_subset_of_proof { + GroveDb::verify_subset_query_with_absence_proof(proof, &path_query)? + } else { + GroveDb::verify_query_with_absence_proof(proof, &path_query)? + }; + if proved_key_values.len() == 1 { + let (path, key, maybe_element) = proved_key_values.remove(0); + if path != identity_path_vec(&identity_id) { + return Err(Error::Proof(ProofError::CorruptedProof( + "we did not get back an element for the correct path for the identity contract nonce".to_string(), + ))); + } + if key != vec![IdentityTreeNonce as u8] { + return Err(Error::Proof(ProofError::CorruptedProof( + "we did not get back an element for the correct key for the identity nonce" + .to_string(), + ))); + } + + let identity_nonce = maybe_element + .map(|element| { + let bytes: [u8; 8] = element + .into_item_bytes() + .map_err(Error::GroveDB)? + .try_into() + .map_err(|_| { + Error::Proof(ProofError::IncorrectValueSize("value size is incorrect")) + })?; + + Ok::(u64::from_be_bytes(bytes)) + }) + .transpose()?; + Ok((root_hash, identity_nonce)) + } else { + Err(Error::Proof(ProofError::TooManyElements( + "expected one identity contract nonce", + ))) + } + } +} diff --git a/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs b/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs index 4fdd19e21c..547aea015d 100644 --- a/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs +++ b/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs @@ -198,6 +198,7 @@ impl Drive { loaded_public_keys: Default::default(), balance: Some(balance), revision: Some(revision), + not_found_public_keys: Default::default(), }), )) @@ -220,6 +221,7 @@ impl Drive { loaded_public_keys: Default::default(), balance: Some(balance), revision: None, + not_found_public_keys: Default::default(), }), )) @@ -273,6 +275,7 @@ impl Drive { loaded_public_keys: Default::default(), balance: Some(balance_identity), revision: None, + not_found_public_keys: Default::default(), }, PartialIdentity { @@ -280,6 +283,7 @@ impl Drive { loaded_public_keys: Default::default(), balance: Some(balance_recipient), revision: None, + not_found_public_keys: Default::default(), }, ), diff --git a/packages/rs-drive/src/error/identity.rs b/packages/rs-drive/src/error/identity.rs index e2d3823919..342c829165 100644 --- a/packages/rs-drive/src/error/identity.rs +++ b/packages/rs-drive/src/error/identity.rs @@ -45,6 +45,10 @@ pub enum IdentityError { #[error("critical balance overflow error: {0}")] CriticalBalanceOverflow(&'static str), + /// Identity Contract revision nonce error + #[error("identity contract revision nonce error: {0}")] + IdentityNonceError(&'static str), + /// Identity key incorrect query missing information error #[error("identity key incorrect query missing information error: {0}")] IdentityKeyIncorrectQueryMissingInformation(&'static str), diff --git a/packages/rs-drive/src/state_transition_action/contract/data_contract_update/mod.rs b/packages/rs-drive/src/state_transition_action/contract/data_contract_update/mod.rs index f75db0aa90..525bb12833 100644 --- a/packages/rs-drive/src/state_transition_action/contract/data_contract_update/mod.rs +++ b/packages/rs-drive/src/state_transition_action/contract/data_contract_update/mod.rs @@ -6,6 +6,7 @@ pub mod v0; use crate::state_transition_action::contract::data_contract_update::v0::DataContractUpdateTransitionActionV0; use derive_more::From; use dpp::data_contract::DataContract; +use dpp::prelude::IdentityNonce; /// data contract update transition action #[derive(Debug, Clone, From)] @@ -27,4 +28,13 @@ impl DataContractUpdateTransitionAction { DataContractUpdateTransitionAction::V0(transition) => &transition.data_contract, } } + + /// identity contract nonce + pub fn identity_contract_nonce(&self) -> IdentityNonce { + match self { + DataContractUpdateTransitionAction::V0(transition) => { + transition.identity_contract_nonce + } + } + } } diff --git a/packages/rs-drive/src/state_transition_action/contract/data_contract_update/v0/mod.rs b/packages/rs-drive/src/state_transition_action/contract/data_contract_update/v0/mod.rs index 8d62f0e765..84e8bce987 100644 --- a/packages/rs-drive/src/state_transition_action/contract/data_contract_update/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/contract/data_contract_update/v0/mod.rs @@ -2,10 +2,13 @@ pub mod transformer; use dpp::data_contract::DataContract; +use dpp::prelude::IdentityNonce; /// data contract update transition action v0 #[derive(Debug, Clone)] pub struct DataContractUpdateTransitionActionV0 { /// data contract pub data_contract: DataContract, + /// identity contract nonce + pub identity_contract_nonce: IdentityNonce, } diff --git a/packages/rs-drive/src/state_transition_action/contract/data_contract_update/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/contract/data_contract_update/v0/transformer.rs index 4b9996f869..ecbad8494f 100644 --- a/packages/rs-drive/src/state_transition_action/contract/data_contract_update/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/contract/data_contract_update/v0/transformer.rs @@ -20,6 +20,7 @@ impl TryFromPlatformVersioned true, platform_version, )?, + identity_contract_nonce: value.identity_contract_nonce, }) } } @@ -39,6 +40,7 @@ impl TryFromPlatformVersioned<&DataContractUpdateTransitionV0> true, platform_version, )?, + identity_contract_nonce: value.identity_contract_nonce, }) } } diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/action_type.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/action_type.rs index a46fdae907..e213385cb9 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/action_type.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/action_type.rs @@ -9,6 +9,9 @@ impl TransitionActionTypeGetter for DocumentTransitionAction { DocumentTransitionAction::CreateAction(_) => DocumentTransitionActionType::Create, DocumentTransitionAction::DeleteAction(_) => DocumentTransitionActionType::Delete, DocumentTransitionAction::ReplaceAction(_) => DocumentTransitionActionType::Replace, + DocumentTransitionAction::BumpIdentityDataContractNonce(_) => { + DocumentTransitionActionType::IgnoreWhileBumpingRevision + } } } } diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_base_transition_action/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_base_transition_action/mod.rs index bac11c66b3..0dff481b01 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_base_transition_action/mod.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_base_transition_action/mod.rs @@ -2,6 +2,7 @@ use derive_more::From; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::platform_value::Identifier; +use dpp::prelude::IdentityNonce; use std::sync::Arc; /// transformer module @@ -49,4 +50,10 @@ impl DocumentBaseTransitionActionAccessorsV0 for DocumentBaseTransitionAction { DocumentBaseTransitionAction::V0(v0) => v0.data_contract.clone(), } } + + fn identity_contract_nonce(&self) -> IdentityNonce { + match self { + DocumentBaseTransitionAction::V0(v0) => v0.identity_contract_nonce, + } + } } diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_base_transition_action/v0/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_base_transition_action/v0/mod.rs index e713abb483..c3064f2425 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_base_transition_action/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_base_transition_action/v0/mod.rs @@ -4,6 +4,7 @@ pub mod transformer; use std::sync::Arc; use dpp::identifier::Identifier; +use dpp::prelude::IdentityNonce; use crate::drive::contract::DataContractFetchInfo; @@ -12,6 +13,8 @@ use crate::drive::contract::DataContractFetchInfo; pub struct DocumentBaseTransitionActionV0 { /// The document Id pub id: Identifier, + /// The identity contract nonce, this is used to stop replay attacks + pub identity_contract_nonce: IdentityNonce, /// Name of document type found int the data contract associated with the `data_contract_id` pub document_type_name: String, /// A potential data contract @@ -30,4 +33,6 @@ pub trait DocumentBaseTransitionActionAccessorsV0 { fn data_contract_id(&self) -> Identifier; /// Data contract fn data_contract_fetch_info(&self) -> Arc; + /// Identity contract nonce + fn identity_contract_nonce(&self) -> IdentityNonce; } diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_base_transition_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_base_transition_action/v0/transformer.rs index 8ac5a091d2..b639eb421e 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_base_transition_action/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_base_transition_action/v0/transformer.rs @@ -17,10 +17,11 @@ impl DocumentBaseTransitionActionV0 { id, document_type_name, data_contract_id, - .. + identity_contract_nonce, } = value; Ok(DocumentBaseTransitionActionV0 { id, + identity_contract_nonce, document_type_name, data_contract: get_data_contract(data_contract_id)?, }) @@ -35,10 +36,11 @@ impl DocumentBaseTransitionActionV0 { id, document_type_name, data_contract_id, - .. + identity_contract_nonce, } = value; Ok(DocumentBaseTransitionActionV0 { id: *id, + identity_contract_nonce: *identity_contract_nonce, document_type_name: document_type_name.clone(), data_contract: get_data_contract(*data_contract_id)?, }) diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/mod.rs index 4888dbc9b7..765a0df3b9 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/mod.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/mod.rs @@ -17,6 +17,8 @@ use crate::state_transition_action::document::documents_batch::document_transiti use crate::state_transition_action::document::documents_batch::document_transition::document_delete_transition_action::DocumentDeleteTransitionAction; use crate::state_transition_action::document::documents_batch::document_transition::document_replace_transition_action::{DocumentReplaceTransitionAction, DocumentReplaceTransitionActionAccessorsV0}; use crate::state_transition_action::document::documents_batch::document_transition::document_delete_transition_action::v0::DocumentDeleteTransitionActionAccessorsV0; +use crate::state_transition_action::system::bump_identity_data_contract_nonce_action::BumpIdentityDataContractNonceAction; + /// version pub const DOCUMENT_TRANSITION_ACTION_VERSION: u32 = 0; @@ -29,15 +31,28 @@ pub enum DocumentTransitionAction { ReplaceAction(DocumentReplaceTransitionAction), /// delete DeleteAction(DocumentDeleteTransitionAction), + /// bump identity data contract nonce + BumpIdentityDataContractNonce(BumpIdentityDataContractNonceAction), } impl DocumentTransitionAction { /// base - pub fn base(&self) -> &DocumentBaseTransitionAction { + pub fn base(&self) -> Option<&DocumentBaseTransitionAction> { + match self { + DocumentTransitionAction::CreateAction(d) => Some(d.base()), + DocumentTransitionAction::DeleteAction(d) => Some(d.base()), + DocumentTransitionAction::ReplaceAction(d) => Some(d.base()), + DocumentTransitionAction::BumpIdentityDataContractNonce(d) => None, + } + } + + /// base owned + pub fn base_owned(self) -> Option { match self { - DocumentTransitionAction::CreateAction(d) => d.base(), - DocumentTransitionAction::DeleteAction(d) => d.base(), - DocumentTransitionAction::ReplaceAction(d) => d.base(), + DocumentTransitionAction::CreateAction(d) => Some(d.base_owned()), + DocumentTransitionAction::DeleteAction(d) => Some(d.base_owned()), + DocumentTransitionAction::ReplaceAction(d) => Some(d.base_owned()), + DocumentTransitionAction::BumpIdentityDataContractNonce(d) => None, } } } diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/mod.rs index 005fb71077..db1ff2017b 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/mod.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/mod.rs @@ -35,12 +35,33 @@ impl DocumentsBatchTransitionAction { } } + /// transitions + pub fn transitions_mut(&mut self) -> &mut Vec { + match self { + DocumentsBatchTransitionAction::V0(v0) => &mut v0.transitions, + } + } + + /// transitions + pub fn transitions_take(&mut self) -> Vec { + match self { + DocumentsBatchTransitionAction::V0(v0) => std::mem::take(&mut v0.transitions), + } + } + /// transitions owned pub fn transitions_owned(self) -> Vec { match self { DocumentsBatchTransitionAction::V0(v0) => v0.transitions, } } + + /// set transitions + pub fn set_transitions(&mut self, transitions: Vec) { + match self { + DocumentsBatchTransitionAction::V0(v0) => v0.transitions = transitions, + } + } } impl DocumentsBatchTransitionAction { @@ -81,8 +102,18 @@ impl DocumentsBatchTransitionAction { let mut highest_security_level = SecurityLevel::lowest_level(); for transition in self.transitions().iter() { - let document_type_name = transition.base().document_type_name(); - let data_contract_info = transition.base().data_contract_fetch_info(); + let document_type_name = transition + .base() + .ok_or(ProtocolError::CorruptedCodeExecution( + "expecting action to have a base".to_string(), + ))? + .document_type_name(); + let data_contract_info = transition + .base() + .ok_or(ProtocolError::CorruptedCodeExecution( + "expecting action to have a base".to_string(), + ))? + .data_contract_fetch_info(); let document_type = data_contract_info .contract diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_create/v0/mod.rs b/packages/rs-drive/src/state_transition_action/identity/identity_create/v0/mod.rs index ad11547937..e3b7115293 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_create/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_create/v0/mod.rs @@ -37,6 +37,7 @@ impl From for PartialIdentity { loaded_public_keys: Default::default(), //no need to load public keys balance: Some(initial_balance_amount), revision: None, + not_found_public_keys: Default::default(), } } @@ -54,6 +55,7 @@ impl From<&IdentityCreateTransitionActionV0> for PartialIdentity { loaded_public_keys: Default::default(), //no need to load public keys balance: Some(*initial_balance_amount), revision: None, + not_found_public_keys: Default::default(), } } diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_credit_transfer/mod.rs b/packages/rs-drive/src/state_transition_action/identity/identity_credit_transfer/mod.rs index 31b47b5699..bbea82a346 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_credit_transfer/mod.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_credit_transfer/mod.rs @@ -7,7 +7,7 @@ use crate::state_transition_action::identity::identity_credit_transfer::v0::Iden use derive_more::From; use dpp::fee::Credits; use dpp::platform_value::Identifier; -use dpp::prelude::Revision; +use dpp::prelude::{IdentityNonce, Revision}; /// action #[derive(Debug, Clone, From)] @@ -17,10 +17,10 @@ pub enum IdentityCreditTransferTransitionAction { } impl IdentityCreditTransferTransitionAction { - /// Revision - pub fn revision(&self) -> Revision { + /// Nonce + pub fn nonce(&self) -> IdentityNonce { match self { - IdentityCreditTransferTransitionAction::V0(transition) => transition.revision, + IdentityCreditTransferTransitionAction::V0(transition) => transition.nonce, } } diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_credit_transfer/v0/mod.rs b/packages/rs-drive/src/state_transition_action/identity/identity_credit_transfer/v0/mod.rs index ebf32ca065..baf368b7e7 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_credit_transfer/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_credit_transfer/v0/mod.rs @@ -2,7 +2,7 @@ mod transformer; use dpp::fee::Credits; use dpp::platform_value::Identifier; -use dpp::prelude::Revision; +use dpp::prelude::{IdentityNonce, Revision}; use serde::{Deserialize, Serialize}; /// action v0 @@ -15,6 +15,6 @@ pub struct IdentityCreditTransferTransitionActionV0 { pub recipient_id: Identifier, /// identity id pub identity_id: Identifier, - /// revision - pub revision: Revision, + /// nonce + pub nonce: IdentityNonce, } diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_credit_transfer/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/identity/identity_credit_transfer/v0/transformer.rs index d7b0ee8115..356147f1f5 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_credit_transfer/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_credit_transfer/v0/transformer.rs @@ -7,14 +7,14 @@ impl From for IdentityCreditTransferTransiti identity_id, recipient_id, amount, - revision, + nonce, .. } = value; IdentityCreditTransferTransitionActionV0 { identity_id, recipient_id, transfer_amount: amount, - revision, + nonce, } } } @@ -25,14 +25,14 @@ impl From<&IdentityCreditTransferTransitionV0> for IdentityCreditTransferTransit identity_id, recipient_id, amount, - revision, + nonce, .. } = value; IdentityCreditTransferTransitionActionV0 { identity_id: *identity_id, recipient_id: *recipient_id, transfer_amount: *amount, - revision: *revision, + nonce: *nonce, } } } diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/mod.rs b/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/mod.rs index a3ebd13913..58149d6b2e 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/mod.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/mod.rs @@ -8,7 +8,7 @@ use derive_more::From; use dpp::document::Document; use dpp::platform_value::Identifier; -use dpp::prelude::Revision; +use dpp::prelude::{IdentityNonce, Revision}; /// action #[derive(Debug, Clone, From)] @@ -18,10 +18,10 @@ pub enum IdentityCreditWithdrawalTransitionAction { } impl IdentityCreditWithdrawalTransitionAction { - /// Revision - pub fn revision(&self) -> Revision { + /// Nonce + pub fn nonce(&self) -> IdentityNonce { match self { - IdentityCreditWithdrawalTransitionAction::V0(transition) => transition.revision, + IdentityCreditWithdrawalTransitionAction::V0(transition) => transition.nonce, } } diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/mod.rs b/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/mod.rs index 5f76a38e21..d2b7d2de27 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/mod.rs @@ -2,7 +2,7 @@ mod transformer; use dpp::document::Document; use dpp::identifier::Identifier; -use dpp::prelude::Revision; +use dpp::prelude::{IdentityNonce, Revision}; use serde::{Deserialize, Serialize}; @@ -12,8 +12,8 @@ use serde::{Deserialize, Serialize}; pub struct IdentityCreditWithdrawalTransitionActionV0 { /// identity id pub identity_id: Identifier, - /// revision - pub revision: Revision, + /// nonce + pub nonce: IdentityNonce, /// prepared withdrawal document pub prepared_withdrawal_document: Document, /// amount diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs index 9a6e8f92af..90ec624839 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs @@ -13,7 +13,7 @@ impl IdentityCreditWithdrawalTransitionActionV0 { creation_time_ms: u64, ) -> Self { let mut entropy = Vec::new(); - entropy.extend_from_slice(&identity_credit_withdrawal.revision.to_be_bytes()); + entropy.extend_from_slice(&identity_credit_withdrawal.nonce.to_be_bytes()); entropy.extend_from_slice(identity_credit_withdrawal.output_script.as_bytes()); let document_id = Document::generate_document_id_v0( @@ -44,7 +44,7 @@ impl IdentityCreditWithdrawalTransitionActionV0 { IdentityCreditWithdrawalTransitionActionV0 { identity_id: identity_credit_withdrawal.identity_id, - revision: identity_credit_withdrawal.revision, + nonce: identity_credit_withdrawal.nonce, prepared_withdrawal_document: withdrawal_document, amount: identity_credit_withdrawal.amount, } diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_update/v0/mod.rs b/packages/rs-drive/src/state_transition_action/identity/identity_update/v0/mod.rs index 082ead9868..c85f4d09f3 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_update/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_update/v0/mod.rs @@ -2,7 +2,7 @@ mod transformer; use dpp::identifier::Identifier; use dpp::identity::{IdentityPublicKey, KeyID, TimestampMillis}; -use dpp::prelude::Revision; +use dpp::prelude::{IdentityNonce, Revision}; use serde::{Deserialize, Serialize}; /// action v0 @@ -19,4 +19,6 @@ pub struct IdentityUpdateTransitionActionV0 { pub identity_id: Identifier, /// revision pub revision: Revision, + /// nonce used to prevent replay attacks + pub nonce: IdentityNonce, } diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_update/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/identity/identity_update/v0/transformer.rs index 1b35ba5400..4400b10ed6 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_update/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_update/v0/transformer.rs @@ -9,6 +9,7 @@ impl From for IdentityUpdateTransitionActionV0 { disable_public_keys, public_keys_disabled_at, revision, + nonce, .. } = value; IdentityUpdateTransitionActionV0 { @@ -17,6 +18,7 @@ impl From for IdentityUpdateTransitionActionV0 { public_keys_disabled_at, identity_id, revision, + nonce, } } } @@ -29,6 +31,7 @@ impl From<&IdentityUpdateTransitionV0> for IdentityUpdateTransitionActionV0 { disable_public_keys, public_keys_disabled_at, revision, + nonce, .. } = value; IdentityUpdateTransitionActionV0 { @@ -40,6 +43,7 @@ impl From<&IdentityUpdateTransitionV0> for IdentityUpdateTransitionActionV0 { public_keys_disabled_at: *public_keys_disabled_at, identity_id: *identity_id, revision: *revision, + nonce: *nonce, } } } diff --git a/packages/rs-drive/src/state_transition_action/mod.rs b/packages/rs-drive/src/state_transition_action/mod.rs index a53952f776..c0385bbef1 100644 --- a/packages/rs-drive/src/state_transition_action/mod.rs +++ b/packages/rs-drive/src/state_transition_action/mod.rs @@ -5,6 +5,9 @@ pub mod document; /// identity pub mod identity; +/// system +pub mod system; + use crate::state_transition_action::contract::data_contract_create::DataContractCreateTransitionAction; use crate::state_transition_action::contract::data_contract_update::DataContractUpdateTransitionAction; use crate::state_transition_action::document::documents_batch::DocumentsBatchTransitionAction; @@ -13,6 +16,8 @@ use crate::state_transition_action::identity::identity_credit_transfer::Identity use crate::state_transition_action::identity::identity_credit_withdrawal::IdentityCreditWithdrawalTransitionAction; use crate::state_transition_action::identity::identity_topup::IdentityTopUpTransitionAction; use crate::state_transition_action::identity::identity_update::IdentityUpdateTransitionAction; +use crate::state_transition_action::system::bump_identity_data_contract_nonce_action::BumpIdentityDataContractNonceAction; +use crate::state_transition_action::system::bump_identity_nonce_action::BumpIdentityNonceAction; use derive_more::From; /// ST action @@ -34,4 +39,12 @@ pub enum StateTransitionAction { IdentityUpdateAction(IdentityUpdateTransitionAction), /// identity credit transfer IdentityCreditTransferAction(IdentityCreditTransferTransitionAction), + /// bump identity nonce action + /// this can only come in this form from identity state transitions that do not use asset locks + /// it will also only happen if the state validation fails + BumpIdentityNonceAction(BumpIdentityNonceAction), + /// bump identity contract nonce action + /// this can only come in this form from the document contract update state transition + /// it will also only happen if the state validation fails + BumpIdentityDataContractNonceAction(BumpIdentityDataContractNonceAction), } diff --git a/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/mod.rs b/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/mod.rs new file mode 100644 index 0000000000..7e69fea371 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/mod.rs @@ -0,0 +1,38 @@ +use derive_more::From; +use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::platform_value::Identifier; + +use dpp::prelude::IdentityNonce; + +/// transformer module +pub mod transformer; +mod v0; + +pub use v0::*; + +/// bump identity data contract nonce action +#[derive(Debug, Clone, From)] +pub enum BumpIdentityDataContractNonceAction { + /// v0 + V0(BumpIdentityDataContractNonceActionV0), +} + +impl BumpIdentityDataContractNonceActionAccessorsV0 for BumpIdentityDataContractNonceAction { + fn identity_id(&self) -> Identifier { + match self { + BumpIdentityDataContractNonceAction::V0(v0) => v0.identity_id, + } + } + + fn data_contract_id(&self) -> Identifier { + match self { + BumpIdentityDataContractNonceAction::V0(v0) => v0.data_contract_id, + } + } + + fn identity_contract_nonce(&self) -> IdentityNonce { + match self { + BumpIdentityDataContractNonceAction::V0(v0) => v0.identity_contract_nonce, + } + } +} diff --git a/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/transformer.rs b/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/transformer.rs new file mode 100644 index 0000000000..a47799761d --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/transformer.rs @@ -0,0 +1,120 @@ +use dpp::platform_value::Identifier; + +use dpp::ProtocolError; +use dpp::state_transition::data_contract_update_transition::DataContractUpdateTransition; +use dpp::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; +use crate::state_transition_action::contract::data_contract_update::DataContractUpdateTransitionAction; +use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::{DocumentBaseTransitionAction, DocumentBaseTransitionActionV0}; +use crate::state_transition_action::system::bump_identity_data_contract_nonce_action::{BumpIdentityDataContractNonceAction, BumpIdentityDataContractNonceActionV0}; + +impl BumpIdentityDataContractNonceAction { + /// from base transition + pub fn from_document_base_transition( + value: DocumentBaseTransition, + identity_id: Identifier, + ) -> Result { + match value { + DocumentBaseTransition::V0(v0) => Ok( + BumpIdentityDataContractNonceActionV0::try_from_base_transition(v0, identity_id)? + .into(), + ), + } + } + + /// from borrowed base transition + pub fn from_borrowed_document_base_transition( + value: &DocumentBaseTransition, + identity_id: Identifier, + ) -> Result { + match value { + DocumentBaseTransition::V0(v0) => Ok( + BumpIdentityDataContractNonceActionV0::try_from_borrowed_base_transition( + v0, + identity_id, + )? + .into(), + ), + } + } + + /// from base transition + pub fn from_document_base_transition_action( + value: DocumentBaseTransitionAction, + identity_id: Identifier, + ) -> Result { + match value { + DocumentBaseTransitionAction::V0(v0) => Ok( + BumpIdentityDataContractNonceActionV0::try_from_base_transition_action( + v0, + identity_id, + )? + .into(), + ), + } + } + + /// from borrowed base transition + pub fn from_document_borrowed_base_transition_action( + value: &DocumentBaseTransitionAction, + identity_id: Identifier, + ) -> Result { + match value { + DocumentBaseTransitionAction::V0(v0) => Ok( + BumpIdentityDataContractNonceActionV0::try_from_borrowed_base_transition_action( + v0, + identity_id, + )? + .into(), + ), + } + } + + /// from data contract update + pub fn from_data_contract_update_transition( + value: DataContractUpdateTransition, + ) -> Result { + match value { + DataContractUpdateTransition::V0(v0) => Ok( + BumpIdentityDataContractNonceActionV0::try_from_data_contract_update(v0)?.into(), + ), + } + } + + /// from borrowed data contract update + pub fn from_borrowed_data_contract_update_transition( + value: &DataContractUpdateTransition, + ) -> Result { + match value { + DataContractUpdateTransition::V0(v0) => Ok( + BumpIdentityDataContractNonceActionV0::try_from_borrowed_data_contract_update(v0)? + .into(), + ), + } + } + + /// from data contract update action + pub fn from_data_contract_update_transition_action( + value: DataContractUpdateTransitionAction, + ) -> Result { + match value { + DataContractUpdateTransitionAction::V0(v0) => Ok( + BumpIdentityDataContractNonceActionV0::try_from_data_contract_update_action(v0)? + .into(), + ), + } + } + + /// from borrowed data contract update action + pub fn from_borrowed_data_contract_update_transition_action( + value: &DataContractUpdateTransitionAction, + ) -> Result { + match value { + DataContractUpdateTransitionAction::V0(v0) => Ok( + BumpIdentityDataContractNonceActionV0::try_from_borrowed_data_contract_update_action( + v0, + )? + .into(), + ), + } + } +} diff --git a/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/v0/mod.rs b/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/v0/mod.rs new file mode 100644 index 0000000000..4d812bb703 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/v0/mod.rs @@ -0,0 +1,27 @@ +/// transformer +pub mod transformer; + +use dpp::identifier::Identifier; +use dpp::prelude::IdentityNonce; + +#[derive(Debug, Clone)] +/// Version 0 of the bump identity data contract nonce action +/// This action is performed when we want to pay for the state transition +pub struct BumpIdentityDataContractNonceActionV0 { + /// The identity id + pub identity_id: Identifier, + /// The contract id + pub data_contract_id: Identifier, + /// The identity contract nonce, this is used to stop replay attacks + pub identity_contract_nonce: IdentityNonce, +} + +/// document base transition action accessors v0 +pub trait BumpIdentityDataContractNonceActionAccessorsV0 { + /// The identity id + fn identity_id(&self) -> Identifier; + /// The contract id + fn data_contract_id(&self) -> Identifier; + /// Identity contract nonce + fn identity_contract_nonce(&self) -> IdentityNonce; +} diff --git a/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/v0/transformer.rs new file mode 100644 index 0000000000..f7219d1f59 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/v0/transformer.rs @@ -0,0 +1,143 @@ +use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::platform_value::Identifier; + +use dpp::ProtocolError; +use dpp::state_transition::data_contract_update_transition::DataContractUpdateTransitionV0; +use dpp::state_transition::documents_batch_transition::document_base_transition::v0::DocumentBaseTransitionV0; +use crate::state_transition_action::contract::data_contract_update::v0::DataContractUpdateTransitionActionV0; +use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionV0; +use crate::state_transition_action::system::bump_identity_data_contract_nonce_action::BumpIdentityDataContractNonceActionV0; + +impl BumpIdentityDataContractNonceActionV0 { + /// try from base transition + pub fn try_from_base_transition( + value: DocumentBaseTransitionV0, + identity_id: Identifier, + ) -> Result { + let DocumentBaseTransitionV0 { + data_contract_id, + identity_contract_nonce, + .. + } = value; + Ok(BumpIdentityDataContractNonceActionV0 { + identity_id, + data_contract_id, + identity_contract_nonce, + }) + } + + /// try from borrowed base transition + pub fn try_from_borrowed_base_transition( + value: &DocumentBaseTransitionV0, + identity_id: Identifier, + ) -> Result { + let DocumentBaseTransitionV0 { + data_contract_id, + identity_contract_nonce, + .. + } = value; + Ok(BumpIdentityDataContractNonceActionV0 { + identity_id, + data_contract_id: *data_contract_id, + identity_contract_nonce: *identity_contract_nonce, + }) + } + + /// try from base transition + pub fn try_from_base_transition_action( + value: DocumentBaseTransitionActionV0, + identity_id: Identifier, + ) -> Result { + let DocumentBaseTransitionActionV0 { + data_contract, + identity_contract_nonce, + .. + } = value; + Ok(BumpIdentityDataContractNonceActionV0 { + identity_id, + data_contract_id: data_contract.contract.id(), + identity_contract_nonce, + }) + } + + /// try from borrowed base transition + pub fn try_from_borrowed_base_transition_action( + value: &DocumentBaseTransitionActionV0, + identity_id: Identifier, + ) -> Result { + let DocumentBaseTransitionActionV0 { + data_contract, + identity_contract_nonce, + .. + } = value; + Ok(BumpIdentityDataContractNonceActionV0 { + identity_id, + data_contract_id: data_contract.contract.id(), + identity_contract_nonce: *identity_contract_nonce, + }) + } + + /// try from data contract update + pub fn try_from_data_contract_update( + value: DataContractUpdateTransitionV0, + ) -> Result { + let DataContractUpdateTransitionV0 { + data_contract, + identity_contract_nonce, + .. + } = value; + Ok(BumpIdentityDataContractNonceActionV0 { + identity_id: data_contract.owner_id(), + data_contract_id: data_contract.id(), + identity_contract_nonce, + }) + } + + /// try from borrowed data contract update + pub fn try_from_borrowed_data_contract_update( + value: &DataContractUpdateTransitionV0, + ) -> Result { + let DataContractUpdateTransitionV0 { + data_contract, + identity_contract_nonce, + .. + } = value; + Ok(BumpIdentityDataContractNonceActionV0 { + identity_id: data_contract.owner_id(), + data_contract_id: data_contract.id(), + identity_contract_nonce: *identity_contract_nonce, + }) + } + + /// try from data contract update action + pub fn try_from_data_contract_update_action( + value: DataContractUpdateTransitionActionV0, + ) -> Result { + let DataContractUpdateTransitionActionV0 { + data_contract, + identity_contract_nonce, + .. + } = value; + Ok(BumpIdentityDataContractNonceActionV0 { + identity_id: data_contract.owner_id(), + data_contract_id: data_contract.id(), + identity_contract_nonce, + }) + } + + /// try from borrowed data contract update action + pub fn try_from_borrowed_data_contract_update_action( + value: &DataContractUpdateTransitionActionV0, + ) -> Result { + let DataContractUpdateTransitionActionV0 { + data_contract, + identity_contract_nonce, + .. + } = value; + Ok(BumpIdentityDataContractNonceActionV0 { + identity_id: data_contract.owner_id(), + data_contract_id: data_contract.id(), + identity_contract_nonce: *identity_contract_nonce, + }) + } +} diff --git a/packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/mod.rs b/packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/mod.rs new file mode 100644 index 0000000000..c586a02020 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/mod.rs @@ -0,0 +1,31 @@ +use derive_more::From; +use dpp::platform_value::Identifier; + +use dpp::prelude::IdentityNonce; + +/// transformer module +pub mod transformer; +mod v0; + +pub use v0::*; + +/// bump identity nonce action +#[derive(Debug, Clone, From)] +pub enum BumpIdentityNonceAction { + /// v0 + V0(BumpIdentityNonceActionV0), +} + +impl BumpIdentityNonceActionAccessorsV0 for BumpIdentityNonceAction { + fn identity_id(&self) -> Identifier { + match self { + BumpIdentityNonceAction::V0(v0) => v0.identity_id, + } + } + + fn identity_nonce(&self) -> IdentityNonce { + match self { + BumpIdentityNonceAction::V0(v0) => v0.identity_nonce, + } + } +} diff --git a/packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/transformer.rs b/packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/transformer.rs new file mode 100644 index 0000000000..14fbe1091e --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/transformer.rs @@ -0,0 +1,146 @@ +use crate::state_transition_action::identity::identity_credit_transfer::IdentityCreditTransferTransitionAction; +use crate::state_transition_action::identity::identity_credit_withdrawal::IdentityCreditWithdrawalTransitionAction; +use crate::state_transition_action::identity::identity_update::IdentityUpdateTransitionAction; +use crate::state_transition_action::system::bump_identity_nonce_action::{ + BumpIdentityNonceAction, BumpIdentityNonceActionV0, +}; +use dpp::state_transition::identity_credit_transfer_transition::IdentityCreditTransferTransition; +use dpp::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition; +use dpp::state_transition::identity_update_transition::IdentityUpdateTransition; +use dpp::ProtocolError; + +impl BumpIdentityNonceAction { + /// from identity update + pub fn from_identity_update_transition( + value: IdentityUpdateTransition, + ) -> Result { + match value { + IdentityUpdateTransition::V0(v0) => { + Ok(BumpIdentityNonceActionV0::try_from_identity_update(v0)?.into()) + } + } + } + + /// from borrowed identity update + pub fn from_borrowed_identity_update_transition( + value: &IdentityUpdateTransition, + ) -> Result { + match value { + IdentityUpdateTransition::V0(v0) => { + Ok(BumpIdentityNonceActionV0::try_from_borrowed_identity_update(v0)?.into()) + } + } + } + + /// from identity update action + pub fn from_identity_update_transition_action( + value: IdentityUpdateTransitionAction, + ) -> Result { + match value { + IdentityUpdateTransitionAction::V0(v0) => { + Ok(BumpIdentityNonceActionV0::try_from_identity_update_action(v0)?.into()) + } + } + } + + /// from borrowed identity update action + pub fn from_borrowed_identity_update_transition_action( + value: &IdentityUpdateTransitionAction, + ) -> Result { + match value { + IdentityUpdateTransitionAction::V0(v0) => { + Ok(BumpIdentityNonceActionV0::try_from_borrowed_identity_update_action(v0)?.into()) + } + } + } + + /// from identity transfer + pub fn from_identity_credit_transfer_transition( + value: IdentityCreditTransferTransition, + ) -> Result { + match value { + IdentityCreditTransferTransition::V0(v0) => { + Ok(BumpIdentityNonceActionV0::try_from_identity_credit_transfer(v0)?.into()) + } + } + } + + /// from borrowed identity transfer + pub fn from_borrowed_identity_credit_transfer_transition( + value: &IdentityCreditTransferTransition, + ) -> Result { + match value { + IdentityCreditTransferTransition::V0(v0) => Ok( + BumpIdentityNonceActionV0::try_from_borrowed_identity_credit_transfer(v0)?.into(), + ), + } + } + + /// from identity transfer action + pub fn from_identity_credit_transfer_transition_action( + value: IdentityCreditTransferTransitionAction, + ) -> Result { + match value { + IdentityCreditTransferTransitionAction::V0(v0) => { + Ok(BumpIdentityNonceActionV0::try_from_identity_credit_transfer_action(v0)?.into()) + } + } + } + + /// from borrowed identity transfer action + pub fn from_borrowed_identity_credit_transfer_transition_action( + value: &IdentityCreditTransferTransitionAction, + ) -> Result { + match value { + IdentityCreditTransferTransitionAction::V0(v0) => Ok( + BumpIdentityNonceActionV0::try_from_borrowed_identity_credit_transfer_action(v0)? + .into(), + ), + } + } + + /// from identity withdrawal + pub fn from_identity_credit_withdrawal_transition( + value: IdentityCreditWithdrawalTransition, + ) -> Result { + match value { + IdentityCreditWithdrawalTransition::V0(v0) => { + Ok(BumpIdentityNonceActionV0::try_from_identity_credit_withdrawal(v0)?.into()) + } + } + } + + /// from borrowed identity withdrawal + pub fn from_borrowed_identity_credit_withdrawal_transition( + value: &IdentityCreditWithdrawalTransition, + ) -> Result { + match value { + IdentityCreditWithdrawalTransition::V0(v0) => Ok( + BumpIdentityNonceActionV0::try_from_borrowed_identity_credit_withdrawal(v0)?.into(), + ), + } + } + + /// from identity withdrawal action + pub fn from_identity_credit_withdrawal_transition_action( + value: IdentityCreditWithdrawalTransitionAction, + ) -> Result { + match value { + IdentityCreditWithdrawalTransitionAction::V0(v0) => Ok( + BumpIdentityNonceActionV0::try_from_identity_credit_withdrawal_action(v0)?.into(), + ), + } + } + + /// from borrowed identity withdrawal action + pub fn from_borrowed_identity_credit_withdrawal_transition_action( + value: &IdentityCreditWithdrawalTransitionAction, + ) -> Result { + match value { + IdentityCreditWithdrawalTransitionAction::V0(v0) => Ok( + BumpIdentityNonceActionV0::try_from_borrowed_identity_credit_withdrawal_action(v0)? + .into(), + ), + } + } +} diff --git a/packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/v0/mod.rs b/packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/v0/mod.rs new file mode 100644 index 0000000000..17e3637571 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/v0/mod.rs @@ -0,0 +1,24 @@ +/// transformer +pub mod transformer; + +use dpp::identifier::Identifier; +use dpp::prelude::IdentityNonce; + +#[derive(Debug, Clone)] +/// Version 0 of the bump identity nonce action +/// This action is performed when we want to pay for validation of the state transition +/// but not execute it +pub struct BumpIdentityNonceActionV0 { + /// The identity id + pub identity_id: Identifier, + /// The identity contract nonce, this is used to stop replay attacks + pub identity_nonce: IdentityNonce, +} + +/// document base transition action accessors v0 +pub trait BumpIdentityNonceActionAccessorsV0 { + /// The identity id + fn identity_id(&self) -> Identifier; + /// Identity contract nonce + fn identity_nonce(&self) -> IdentityNonce; +} diff --git a/packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/v0/transformer.rs new file mode 100644 index 0000000000..ee46bc5865 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/v0/transformer.rs @@ -0,0 +1,166 @@ +use crate::state_transition_action::identity::identity_credit_transfer::v0::IdentityCreditTransferTransitionActionV0; +use crate::state_transition_action::identity::identity_credit_withdrawal::v0::IdentityCreditWithdrawalTransitionActionV0; +use crate::state_transition_action::identity::identity_update::v0::IdentityUpdateTransitionActionV0; +use crate::state_transition_action::system::bump_identity_nonce_action::BumpIdentityNonceActionV0; +use dpp::state_transition::identity_credit_transfer_transition::v0::IdentityCreditTransferTransitionV0; +use dpp::state_transition::identity_credit_withdrawal_transition::v0::IdentityCreditWithdrawalTransitionV0; +use dpp::state_transition::identity_update_transition::v0::IdentityUpdateTransitionV0; +use dpp::ProtocolError; + +impl BumpIdentityNonceActionV0 { + /// try from identity update + pub fn try_from_identity_update( + value: IdentityUpdateTransitionV0, + ) -> Result { + let IdentityUpdateTransitionV0 { + identity_id, nonce, .. + } = value; + Ok(BumpIdentityNonceActionV0 { + identity_id, + identity_nonce: nonce, + }) + } + + /// try from borrowed identity update + pub fn try_from_borrowed_identity_update( + value: &IdentityUpdateTransitionV0, + ) -> Result { + let IdentityUpdateTransitionV0 { + identity_id, nonce, .. + } = value; + Ok(BumpIdentityNonceActionV0 { + identity_id: *identity_id, + identity_nonce: *nonce, + }) + } + + /// try from identity update action + pub fn try_from_identity_update_action( + value: IdentityUpdateTransitionActionV0, + ) -> Result { + let IdentityUpdateTransitionActionV0 { + identity_id, nonce, .. + } = value; + Ok(BumpIdentityNonceActionV0 { + identity_id, + identity_nonce: nonce, + }) + } + + /// try from borrowed identity update action + pub fn try_from_borrowed_identity_update_action( + value: &IdentityUpdateTransitionActionV0, + ) -> Result { + let IdentityUpdateTransitionActionV0 { + identity_id, nonce, .. + } = value; + Ok(BumpIdentityNonceActionV0 { + identity_id: *identity_id, + identity_nonce: *nonce, + }) + } + + /// try from identity credit transfer + pub fn try_from_identity_credit_transfer( + value: IdentityCreditTransferTransitionV0, + ) -> Result { + let IdentityCreditTransferTransitionV0 { + identity_id, nonce, .. + } = value; + Ok(BumpIdentityNonceActionV0 { + identity_id, + identity_nonce: nonce, + }) + } + + /// try from borrowed identity credit transfer + pub fn try_from_borrowed_identity_credit_transfer( + value: &IdentityCreditTransferTransitionV0, + ) -> Result { + let IdentityCreditTransferTransitionV0 { + identity_id, nonce, .. + } = value; + Ok(BumpIdentityNonceActionV0 { + identity_id: *identity_id, + identity_nonce: *nonce, + }) + } + + /// try from identity credit transfer action + pub fn try_from_identity_credit_transfer_action( + value: IdentityCreditTransferTransitionActionV0, + ) -> Result { + let IdentityCreditTransferTransitionActionV0 { + identity_id, nonce, .. + } = value; + Ok(BumpIdentityNonceActionV0 { + identity_id, + identity_nonce: nonce, + }) + } + + /// try from borrowed identity credit transfer action + pub fn try_from_borrowed_identity_credit_transfer_action( + value: &IdentityCreditTransferTransitionActionV0, + ) -> Result { + let IdentityCreditTransferTransitionActionV0 { + identity_id, nonce, .. + } = value; + Ok(BumpIdentityNonceActionV0 { + identity_id: *identity_id, + identity_nonce: *nonce, + }) + } + + /// try from identity credit withdrawal + pub fn try_from_identity_credit_withdrawal( + value: IdentityCreditWithdrawalTransitionV0, + ) -> Result { + let IdentityCreditWithdrawalTransitionV0 { + identity_id, nonce, .. + } = value; + Ok(BumpIdentityNonceActionV0 { + identity_id, + identity_nonce: nonce, + }) + } + + /// try from borrowed identity credit withdrawal + pub fn try_from_borrowed_identity_credit_withdrawal( + value: &IdentityCreditWithdrawalTransitionV0, + ) -> Result { + let IdentityCreditWithdrawalTransitionV0 { + identity_id, nonce, .. + } = value; + Ok(BumpIdentityNonceActionV0 { + identity_id: *identity_id, + identity_nonce: *nonce, + }) + } + + /// try from identity credit withdrawal action + pub fn try_from_identity_credit_withdrawal_action( + value: IdentityCreditWithdrawalTransitionActionV0, + ) -> Result { + let IdentityCreditWithdrawalTransitionActionV0 { + identity_id, nonce, .. + } = value; + Ok(BumpIdentityNonceActionV0 { + identity_id, + identity_nonce: nonce, + }) + } + + /// try from borrowed identity credit withdrawal action + pub fn try_from_borrowed_identity_credit_withdrawal_action( + value: &IdentityCreditWithdrawalTransitionActionV0, + ) -> Result { + let IdentityCreditWithdrawalTransitionActionV0 { + identity_id, nonce, .. + } = value; + Ok(BumpIdentityNonceActionV0 { + identity_id: *identity_id, + identity_nonce: *nonce, + }) + } +} diff --git a/packages/rs-drive/src/state_transition_action/system/mod.rs b/packages/rs-drive/src/state_transition_action/system/mod.rs new file mode 100644 index 0000000000..dfd99aff2e --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/system/mod.rs @@ -0,0 +1,5 @@ +/// bump identity data contract nonce action +pub mod bump_identity_data_contract_nonce_action; + +/// bump identity nonce action +pub mod bump_identity_nonce_action; diff --git a/packages/rs-platform-value/src/types/identifier.rs b/packages/rs-platform-value/src/types/identifier.rs index 012a472dae..da1ad105ec 100644 --- a/packages/rs-platform-value/src/types/identifier.rs +++ b/packages/rs-platform-value/src/types/identifier.rs @@ -180,6 +180,17 @@ impl Identifier { Ok(Identifier::new(bytes.try_into().unwrap())) } + pub fn from_vec(vec: Vec) -> Result { + if vec.len() != 32 { + return Err(Error::ByteLengthNot32BytesError(String::from( + "Identifier must be 32 bytes long", + ))); + } + + // Since we checked that vector size is 32, we can use unwrap + Ok(Identifier::new(vec.try_into().unwrap())) + } + pub fn to_json_value_vec(&self) -> Vec { self.to_buffer() .iter() diff --git a/packages/rs-platform-version/src/version/drive_abci_versions.rs b/packages/rs-platform-version/src/version/drive_abci_versions.rs index cede88f48c..9c05683083 100644 --- a/packages/rs-platform-version/src/version/drive_abci_versions.rs +++ b/packages/rs-platform-version/src/version/drive_abci_versions.rs @@ -24,6 +24,8 @@ pub struct DriveAbciQueryIdentityVersions { pub identity: FeatureVersionBounds, pub identities: FeatureVersionBounds, pub keys: FeatureVersionBounds, + pub identity_nonce: FeatureVersionBounds, + pub identity_contract_nonce: FeatureVersionBounds, pub balance: FeatureVersionBounds, pub balance_and_revision: FeatureVersionBounds, pub identity_by_public_key_hash: FeatureVersionBounds, @@ -87,7 +89,9 @@ pub struct DriveAbciPlatformStateStorageMethodVersions { #[derive(Clone, Debug, Default)] pub struct DriveAbciDocumentsStateTransitionValidationVersions { - pub structure: FeatureVersion, + pub basic_structure: FeatureVersion, + pub advanced_structure: FeatureVersion, + pub revision: FeatureVersion, pub state: FeatureVersion, pub transform_into_action: FeatureVersion, pub data_triggers: DriveAbciValidationDataTriggerAndBindingVersions, @@ -118,8 +122,11 @@ pub struct DriveAbciValidationDataTriggerVersions { #[derive(Clone, Debug, Default)] pub struct DriveAbciStateTransitionValidationVersion { - pub structure: FeatureVersion, + pub base_structure: FeatureVersion, + pub advanced_structure: OptionalFeatureVersion, pub identity_signatures: OptionalFeatureVersion, + pub balance: OptionalFeatureVersion, + pub nonce: OptionalFeatureVersion, pub state: FeatureVersion, pub transform_into_action: FeatureVersion, } diff --git a/packages/rs-platform-version/src/version/drive_versions.rs b/packages/rs-platform-version/src/version/drive_versions.rs index 21092af845..48a133cbc0 100644 --- a/packages/rs-platform-version/src/version/drive_versions.rs +++ b/packages/rs-platform-version/src/version/drive_versions.rs @@ -94,6 +94,8 @@ pub struct DriveVerifyIdentityMethodVersions { pub verify_identity_id_by_public_key_hash: FeatureVersion, pub verify_identity_ids_by_public_key_hashes: FeatureVersion, pub verify_identity_keys_by_identity_id: FeatureVersion, + pub verify_identity_nonce: FeatureVersion, + pub verify_identity_contract_nonce: FeatureVersion, } #[derive(Clone, Debug, Default)] @@ -459,6 +461,7 @@ pub struct DriveIdentityWithdrawalTransactionQueueMethodVersions { #[derive(Clone, Debug, Default)] pub struct DriveIdentityContractInfoMethodVersions { pub add_potential_contract_info_for_contract_bounded_key: FeatureVersion, + pub merge_identity_contract_nonce: FeatureVersion, } #[derive(Clone, Debug, Default)] @@ -467,6 +470,7 @@ pub struct DriveIdentityCostEstimationMethodVersions { pub for_balances: FeatureVersion, pub for_contract_info: FeatureVersion, pub for_contract_info_group: FeatureVersion, + pub for_contract_info_group_keys: FeatureVersion, pub for_contract_info_group_key_purpose: FeatureVersion, pub for_keys_for_identity_id: FeatureVersion, pub for_negative_credit: FeatureVersion, @@ -500,6 +504,8 @@ pub struct DriveIdentityFetchPublicKeyHashesMethodVersions { #[derive(Clone, Debug, Default)] pub struct DriveIdentityFetchAttributesMethodVersions { pub revision: FeatureVersion, + pub nonce: FeatureVersion, + pub identity_contract_nonce: FeatureVersion, pub balance: FeatureVersion, pub balance_include_debt: FeatureVersion, pub negative_balance: FeatureVersion, @@ -522,6 +528,8 @@ pub struct DriveIdentityFetchPartialIdentityMethodVersions { pub struct DriveIdentityProveMethodVersions { pub full_identity: FeatureVersion, pub full_identities: FeatureVersion, + pub identity_nonce: FeatureVersion, + pub identity_contract_nonce: FeatureVersion, pub prove_full_identities_by_unique_public_key_hashes: FeatureVersion, pub prove_full_identity_by_unique_public_key_hash: FeatureVersion, pub prove_identity_id_by_unique_public_key_hash: FeatureVersion, @@ -579,6 +587,7 @@ pub struct DriveIdentityInsertMethodVersions { #[derive(Clone, Debug, Default)] pub struct DriveIdentityUpdateMethodVersions { pub update_identity_revision: FeatureVersion, + pub merge_identity_nonce: FeatureVersion, pub update_identity_negative_credit_operation: FeatureVersion, pub initialize_identity_revision: FeatureVersion, pub disable_identity_keys: FeatureVersion, diff --git a/packages/rs-platform-version/src/version/mocks/v2_test.rs b/packages/rs-platform-version/src/version/mocks/v2_test.rs index f4e805f964..6bd9dda39e 100644 --- a/packages/rs-platform-version/src/version/mocks/v2_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v2_test.rs @@ -252,6 +252,8 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { verify_identity_id_by_public_key_hash: 0, verify_identity_ids_by_public_key_hashes: 0, verify_identity_keys_by_identity_id: 0, + verify_identity_nonce: 0, + verify_identity_contract_nonce: 0, }, single_document: DriveVerifySingleDocumentMethodVersions { verify_proof: 0, @@ -282,6 +284,8 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { }, attributes: DriveIdentityFetchAttributesMethodVersions { revision: 0, + nonce: 0, + identity_contract_nonce: 0, balance: 0, balance_include_debt: 0, negative_balance: 0, @@ -299,6 +303,8 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { prove: DriveIdentityProveMethodVersions { full_identity: 0, full_identities: 0, + identity_nonce: 0, + identity_contract_nonce: 0, prove_full_identities_by_unique_public_key_hashes: 0, prove_full_identity_by_unique_public_key_hash: 0, prove_identity_id_by_unique_public_key_hash: 0, @@ -336,6 +342,7 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { }, update: DriveIdentityUpdateMethodVersions { update_identity_revision: 0, + merge_identity_nonce: 0, update_identity_negative_credit_operation: 0, initialize_identity_revision: 0, disable_identity_keys: 0, @@ -355,12 +362,14 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { }, contract_info: DriveIdentityContractInfoMethodVersions { add_potential_contract_info_for_contract_bounded_key: 0, + merge_identity_contract_nonce: 0, }, cost_estimation: DriveIdentityCostEstimationMethodVersions { for_authentication_keys_security_level_in_key_reference_tree: 0, for_balances: 0, for_contract_info: 0, for_contract_info_group: 0, + for_contract_info_group_keys: 0, for_contract_info_group_key_purpose: 0, for_keys_for_identity_id: 0, for_negative_credit: 0, @@ -588,53 +597,76 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { validate_unique_identity_public_key_hashes_in_state: 0, }, identity_create_state_transition: DriveAbciStateTransitionValidationVersion { - structure: 0, + base_structure: 0, + advanced_structure: None, identity_signatures: Some(0), + balance: None, + nonce: None, state: 0, transform_into_action: 0, }, identity_update_state_transition: DriveAbciStateTransitionValidationVersion { - structure: 0, + base_structure: 0, + advanced_structure: None, identity_signatures: Some(0), + balance: None, + nonce: None, state: 0, transform_into_action: 0, }, identity_top_up_state_transition: DriveAbciStateTransitionValidationVersion { - structure: 0, + base_structure: 0, + advanced_structure: None, identity_signatures: Some(0), + balance: None, + nonce: None, state: 0, transform_into_action: 0, }, identity_credit_withdrawal_state_transition: DriveAbciStateTransitionValidationVersion { - structure: 0, + base_structure: 0, + advanced_structure: None, identity_signatures: None, + balance: Some(0), + nonce: None, state: 0, transform_into_action: 0, }, identity_credit_transfer_state_transition: DriveAbciStateTransitionValidationVersion { - structure: 0, + base_structure: 0, + advanced_structure: None, identity_signatures: None, + balance: Some(0), + nonce: None, state: 0, transform_into_action: 0, }, contract_create_state_transition: DriveAbciStateTransitionValidationVersion { - structure: 0, + base_structure: 0, + advanced_structure: None, identity_signatures: None, + balance: None, + nonce: None, state: 0, transform_into_action: 0, }, contract_update_state_transition: DriveAbciStateTransitionValidationVersion { - structure: 0, + base_structure: 0, + advanced_structure: None, identity_signatures: None, + balance: None, + nonce: Some(0), state: 0, transform_into_action: 0, }, documents_batch_state_transition: DriveAbciDocumentsStateTransitionValidationVersions { - structure: 0, + basic_structure: 0, + advanced_structure: 0, state: 0, + revision: 0, transform_into_action: 0, data_triggers: DriveAbciValidationDataTriggerAndBindingVersions { bindings: 0, @@ -688,6 +720,16 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { max_version: 0, default_current_version: 0, }, + identity_nonce: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + identity_contract_nonce: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, balance: FeatureVersionBounds { min_version: 0, max_version: 0, diff --git a/packages/rs-platform-version/src/version/mocks/v3_test.rs b/packages/rs-platform-version/src/version/mocks/v3_test.rs index 94c42d0a92..cc1ae0aff4 100644 --- a/packages/rs-platform-version/src/version/mocks/v3_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v3_test.rs @@ -260,6 +260,8 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { verify_identity_id_by_public_key_hash: 0, verify_identity_ids_by_public_key_hashes: 0, verify_identity_keys_by_identity_id: 0, + verify_identity_nonce: 0, + verify_identity_contract_nonce: 0, }, single_document: DriveVerifySingleDocumentMethodVersions { verify_proof: 0, @@ -290,6 +292,8 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { }, attributes: DriveIdentityFetchAttributesMethodVersions { revision: 0, + nonce: 0, + identity_contract_nonce: 0, balance: 0, balance_include_debt: 0, negative_balance: 0, @@ -307,6 +311,8 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { prove: DriveIdentityProveMethodVersions { full_identity: 0, full_identities: 0, + identity_nonce: 0, + identity_contract_nonce: 0, prove_full_identities_by_unique_public_key_hashes: 0, prove_full_identity_by_unique_public_key_hash: 0, prove_identity_id_by_unique_public_key_hash: 0, @@ -344,6 +350,7 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { }, update: DriveIdentityUpdateMethodVersions { update_identity_revision: 0, + merge_identity_nonce: 0, update_identity_negative_credit_operation: 0, initialize_identity_revision: 0, disable_identity_keys: 0, @@ -363,12 +370,14 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { }, contract_info: DriveIdentityContractInfoMethodVersions { add_potential_contract_info_for_contract_bounded_key: 0, + merge_identity_contract_nonce: 0, }, cost_estimation: DriveIdentityCostEstimationMethodVersions { for_authentication_keys_security_level_in_key_reference_tree: 0, for_balances: 0, for_contract_info: 0, for_contract_info_group: 0, + for_contract_info_group_keys: 0, for_contract_info_group_key_purpose: 0, for_keys_for_identity_id: 0, for_negative_credit: 0, @@ -588,53 +597,76 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { validate_unique_identity_public_key_hashes_in_state: 0, }, identity_create_state_transition: DriveAbciStateTransitionValidationVersion { - structure: 0, + base_structure: 0, + advanced_structure: None, identity_signatures: Some(0), + balance: None, + nonce: None, state: 0, transform_into_action: 0, }, identity_update_state_transition: DriveAbciStateTransitionValidationVersion { - structure: 0, + base_structure: 0, + advanced_structure: None, identity_signatures: Some(0), + balance: None, + nonce: None, state: 0, transform_into_action: 0, }, identity_top_up_state_transition: DriveAbciStateTransitionValidationVersion { - structure: 0, + base_structure: 0, + advanced_structure: None, identity_signatures: Some(0), + balance: None, + nonce: None, state: 0, transform_into_action: 0, }, identity_credit_withdrawal_state_transition: DriveAbciStateTransitionValidationVersion { - structure: 0, + base_structure: 0, + advanced_structure: None, identity_signatures: None, + balance: Some(0), + nonce: None, state: 0, transform_into_action: 0, }, identity_credit_transfer_state_transition: DriveAbciStateTransitionValidationVersion { - structure: 0, + base_structure: 0, + advanced_structure: None, identity_signatures: None, + balance: Some(0), + nonce: None, state: 0, transform_into_action: 0, }, contract_create_state_transition: DriveAbciStateTransitionValidationVersion { - structure: 0, + base_structure: 0, + advanced_structure: None, identity_signatures: None, + balance: None, + nonce: None, state: 0, transform_into_action: 0, }, contract_update_state_transition: DriveAbciStateTransitionValidationVersion { - structure: 0, + base_structure: 0, + advanced_structure: None, identity_signatures: None, + balance: None, + nonce: Some(0), state: 0, transform_into_action: 0, }, documents_batch_state_transition: DriveAbciDocumentsStateTransitionValidationVersions { - structure: 0, + basic_structure: 0, + advanced_structure: 0, state: 0, + revision: 0, transform_into_action: 0, data_triggers: DriveAbciValidationDataTriggerAndBindingVersions { bindings: 0, @@ -688,6 +720,16 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { max_version: 0, default_current_version: 0, }, + identity_nonce: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + identity_contract_nonce: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, balance: FeatureVersionBounds { min_version: 0, max_version: 0, diff --git a/packages/rs-platform-version/src/version/v1.rs b/packages/rs-platform-version/src/version/v1.rs index 1df56b5614..260717cce4 100644 --- a/packages/rs-platform-version/src/version/v1.rs +++ b/packages/rs-platform-version/src/version/v1.rs @@ -249,6 +249,8 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { verify_identity_id_by_public_key_hash: 0, verify_identity_ids_by_public_key_hashes: 0, verify_identity_keys_by_identity_id: 0, + verify_identity_nonce: 0, + verify_identity_contract_nonce: 0, }, single_document: DriveVerifySingleDocumentMethodVersions { verify_proof: 0, @@ -279,6 +281,8 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { }, attributes: DriveIdentityFetchAttributesMethodVersions { revision: 0, + nonce: 0, + identity_contract_nonce: 0, balance: 0, balance_include_debt: 0, negative_balance: 0, @@ -296,6 +300,8 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { prove: DriveIdentityProveMethodVersions { full_identity: 0, full_identities: 0, + identity_nonce: 0, + identity_contract_nonce: 0, prove_full_identities_by_unique_public_key_hashes: 0, prove_full_identity_by_unique_public_key_hash: 0, prove_identity_id_by_unique_public_key_hash: 0, @@ -333,6 +339,7 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { }, update: DriveIdentityUpdateMethodVersions { update_identity_revision: 0, + merge_identity_nonce: 0, update_identity_negative_credit_operation: 0, initialize_identity_revision: 0, disable_identity_keys: 0, @@ -352,12 +359,14 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { }, contract_info: DriveIdentityContractInfoMethodVersions { add_potential_contract_info_for_contract_bounded_key: 0, + merge_identity_contract_nonce: 0, }, cost_estimation: DriveIdentityCostEstimationMethodVersions { for_authentication_keys_security_level_in_key_reference_tree: 0, for_balances: 0, for_contract_info: 0, for_contract_info_group: 0, + for_contract_info_group_keys: 0, for_contract_info_group_key_purpose: 0, for_keys_for_identity_id: 0, for_negative_credit: 0, @@ -585,53 +594,76 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { validate_unique_identity_public_key_hashes_in_state: 0, }, identity_create_state_transition: DriveAbciStateTransitionValidationVersion { - structure: 0, + base_structure: 0, + advanced_structure: None, identity_signatures: Some(0), + balance: None, + nonce: None, state: 0, transform_into_action: 0, }, identity_update_state_transition: DriveAbciStateTransitionValidationVersion { - structure: 0, + base_structure: 0, + advanced_structure: None, identity_signatures: Some(0), + balance: None, + nonce: Some(0), state: 0, transform_into_action: 0, }, identity_top_up_state_transition: DriveAbciStateTransitionValidationVersion { - structure: 0, + base_structure: 0, + advanced_structure: None, identity_signatures: Some(0), + balance: None, + nonce: None, state: 0, transform_into_action: 0, }, identity_credit_withdrawal_state_transition: DriveAbciStateTransitionValidationVersion { - structure: 0, + base_structure: 0, + advanced_structure: None, identity_signatures: None, + balance: Some(0), + nonce: Some(0), state: 0, transform_into_action: 0, }, identity_credit_transfer_state_transition: DriveAbciStateTransitionValidationVersion { - structure: 0, + base_structure: 0, + advanced_structure: None, identity_signatures: None, + balance: Some(0), + nonce: Some(0), state: 0, transform_into_action: 0, }, contract_create_state_transition: DriveAbciStateTransitionValidationVersion { - structure: 0, + base_structure: 0, + advanced_structure: None, identity_signatures: None, + balance: None, + nonce: None, state: 0, transform_into_action: 0, }, contract_update_state_transition: DriveAbciStateTransitionValidationVersion { - structure: 0, + base_structure: 0, + advanced_structure: None, identity_signatures: None, + balance: None, + nonce: Some(0), state: 0, transform_into_action: 0, }, documents_batch_state_transition: DriveAbciDocumentsStateTransitionValidationVersions { - structure: 0, + basic_structure: 0, + advanced_structure: 0, state: 0, + revision: 0, transform_into_action: 0, data_triggers: DriveAbciValidationDataTriggerAndBindingVersions { bindings: 0, @@ -685,6 +717,16 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { max_version: 0, default_current_version: 0, }, + identity_nonce: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + identity_contract_nonce: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, balance: FeatureVersionBounds { min_version: 0, max_version: 0, diff --git a/packages/rs-sdk/scripts/generate_test_vectors.sh b/packages/rs-sdk/scripts/generate_test_vectors.sh index 209052a735..240b1a8e4a 100755 --- a/packages/rs-sdk/scripts/generate_test_vectors.sh +++ b/packages/rs-sdk/scripts/generate_test_vectors.sh @@ -24,7 +24,7 @@ if [ -z "$1" ]; then rm -f "${CARGO_DIR}"/tests/vectors/* fi -cargo test -p dash-platform-sdk \ +cargo test -p rs-sdk \ --no-default-features \ --features generate-test-vectors \ "$1" diff --git a/packages/rs-sdk/src/internal_cache/mod.rs b/packages/rs-sdk/src/internal_cache/mod.rs new file mode 100644 index 0000000000..9a07ce72d9 --- /dev/null +++ b/packages/rs-sdk/src/internal_cache/mod.rs @@ -0,0 +1,44 @@ +use crate::platform::Identifier; +use crate::sdk::LastQueryTimestamp; +use dpp::prelude; +use dpp::prelude::IdentityNonce; +use std::collections::BTreeMap; +use tokio::sync::Mutex; + +/// This is a cache that is internal to the SDK that the user does not have to worry about +pub struct InternalSdkCache { + /// This is the identity nonce counter for the sdk + /// The sdk will automatically manage this counter for the user. + /// When the sdk user requests to update identities, withdraw or transfer + /// this will be automatically updated + /// This update can involve querying Platform for the current identity nonce + /// If the sdk user requests to put a state transition the counter is checked and either + /// returns an error or is updated. + pub(crate) identity_nonce_counter: + tokio::sync::Mutex>, + + /// This is the identity contract nonce counter for the sdk + /// The sdk will automatically manage this counter for the user. + /// When the sdk user requests to put documents this will be automatically updated + /// This update can involve querying Platform for the current identity contract nonce + /// If the sdk user requests to put a state transition the counter is checked and either + /// returns an error or is updated. + pub(crate) identity_contract_nonce_counter: tokio::sync::Mutex< + BTreeMap<(Identifier, Identifier), (prelude::IdentityNonce, LastQueryTimestamp)>, + >, +} + +impl Default for InternalSdkCache { + fn default() -> Self { + InternalSdkCache { + identity_nonce_counter: Mutex::new(BTreeMap::< + Identifier, + (IdentityNonce, LastQueryTimestamp), + >::new()), + identity_contract_nonce_counter: Mutex::new(BTreeMap::< + (Identifier, Identifier), + (IdentityNonce, LastQueryTimestamp), + >::new()), + } + } +} diff --git a/packages/rs-sdk/src/lib.rs b/packages/rs-sdk/src/lib.rs index d1e5918caf..3af1cb7199 100644 --- a/packages/rs-sdk/src/lib.rs +++ b/packages/rs-sdk/src/lib.rs @@ -63,6 +63,7 @@ pub mod core; mod core_client; pub mod error; +mod internal_cache; pub mod mock; pub mod platform; pub mod sdk; diff --git a/packages/rs-sdk/src/mock/requests.rs b/packages/rs-sdk/src/mock/requests.rs index fb2e3918fc..0c997f3e59 100644 --- a/packages/rs-sdk/src/mock/requests.rs +++ b/packages/rs-sdk/src/mock/requests.rs @@ -151,14 +151,46 @@ impl MockResponse for Document { impl MockResponse for drive_proof_verifier::types::IdentityBalance { fn mock_serialize(&self, _sdk: &MockDashPlatformSdk) -> Vec { - (*self).to_le_bytes().to_vec() + (*self).to_be_bytes().to_vec() } fn mock_deserialize(_sdk: &MockDashPlatformSdk, buf: &[u8]) -> Self where Self: Sized, { - Self::from_le_bytes(buf.try_into().expect("balance should be 8 bytes")) + Self::from_be_bytes(buf.try_into().expect("balance should be 8 bytes")) + } +} + +impl MockResponse for drive_proof_verifier::types::IdentityNonceFetcher { + fn mock_serialize(&self, _sdk: &MockDashPlatformSdk) -> Vec { + (self.0).to_be_bytes().to_vec() + } + + fn mock_deserialize(_sdk: &MockDashPlatformSdk, buf: &[u8]) -> Self + where + Self: Sized, + { + drive_proof_verifier::types::IdentityNonceFetcher(u64::from_be_bytes( + buf.try_into() + .expect("identity contract nonce should be should be 8 bytes"), + )) + } +} + +impl MockResponse for drive_proof_verifier::types::IdentityContractNonceFetcher { + fn mock_serialize(&self, _sdk: &MockDashPlatformSdk) -> Vec { + (self.0).to_be_bytes().to_vec() + } + + fn mock_deserialize(_sdk: &MockDashPlatformSdk, buf: &[u8]) -> Self + where + Self: Sized, + { + drive_proof_verifier::types::IdentityContractNonceFetcher(u64::from_be_bytes( + buf.try_into() + .expect("identity contract nonce should be should be 8 bytes"), + )) } } diff --git a/packages/rs-sdk/src/mock/sdk.rs b/packages/rs-sdk/src/mock/sdk.rs index 381283ab53..bf94687e8a 100644 --- a/packages/rs-sdk/src/mock/sdk.rs +++ b/packages/rs-sdk/src/mock/sdk.rs @@ -128,6 +128,10 @@ impl MockDashPlatformSdk { self.load_expectation::(filename) .await? } + "GetIdentityContractNonceRequest" => { + self.load_expectation::(filename) + .await? + } "GetIdentityBalanceAndRevisionRequest" => { self.load_expectation::(filename) .await? diff --git a/packages/rs-sdk/src/platform/fetch.rs b/packages/rs-sdk/src/platform/fetch.rs index 2c855b66c7..9cfab2067a 100644 --- a/packages/rs-sdk/src/platform/fetch.rs +++ b/packages/rs-sdk/src/platform/fetch.rs @@ -103,9 +103,50 @@ where } } - /// Fetch single object from the Platfom by identifier. + /// Fetch single object from the Platfom. + /// + /// Fetch object from the platform that satisfies provided [Query]. + /// Most often, the Query is an [Identifier] of the object to be fetched. /// - /// Conveniance method that allows fetching objects by identifier for types that implement [Query] for [Identifier]. + /// ## Parameters + /// + /// - `sdk`: An instance of [Sdk]. + /// - `query`: A query parameter implementing [`crate::platform::query::Query`] to specify the data to be fetched. + /// - `settings`: Request settings for the connection to Platform. + /// + /// ## Returns + /// + /// Returns: + /// * `Ok(Some(Self))` when object is found + /// * `Ok(None)` when object is not found + /// * [`Err(Error)`](Error) when an error occurs + /// + /// ## Error Handling + /// + /// Any errors encountered during the execution are returned as [Error] instances. + async fn fetch_with_settings::Request>>( + sdk: &Sdk, + query: Q, + settings: RequestSettings, + ) -> Result, Error> { + let request = query.query(sdk.prove())?; + + let response = request.clone().execute(sdk, settings).await?; + + let object_type = std::any::type_name::().to_string(); + tracing::trace!(request = ?request, response = ?response, object_type, "fetched object from platform"); + + let object: Option = sdk.parse_proof(request, response)?; + + match object { + Some(item) => Ok(item.into()), + None => Ok(None), + } + } + + /// Fetch single object from the Platform by identifier. + /// + /// Convenience method that allows fetching objects by identifier for types that implement [Query] for [Identifier]. /// /// See [`Fetch::fetch()`] for more details. /// @@ -137,6 +178,14 @@ impl Fetch for drive_proof_verifier::types::IdentityBalance { type Request = platform_proto::GetIdentityBalanceRequest; } +impl Fetch for drive_proof_verifier::types::IdentityNonceFetcher { + type Request = platform_proto::GetIdentityNonceRequest; +} + +impl Fetch for drive_proof_verifier::types::IdentityContractNonceFetcher { + type Request = platform_proto::GetIdentityContractNonceRequest; +} + impl Fetch for drive_proof_verifier::types::IdentityBalanceAndRevision { type Request = platform_proto::GetIdentityBalanceAndRevisionRequest; } diff --git a/packages/rs-sdk/src/platform/transition/put_document.rs b/packages/rs-sdk/src/platform/transition/put_document.rs index 4899356526..0604dce9eb 100644 --- a/packages/rs-sdk/src/platform/transition/put_document.rs +++ b/packages/rs-sdk/src/platform/transition/put_document.rs @@ -4,6 +4,7 @@ use std::sync::Arc; use crate::{Error, Sdk}; use dapi_grpc::platform::VersionedGrpcResponse; +use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::data_contract::document_type::DocumentType; use dpp::data_contract::DataContract; use dpp::document::{Document, DocumentV0Getters}; @@ -16,10 +17,18 @@ use dpp::state_transition::StateTransition; use drive::drive::Drive; use rs_dapi_client::{DapiRequest, RequestSettings}; +/// The options when putting something to platform +#[derive(Debug, Clone, Copy, Default)] +pub struct PutSettings { + pub request_settings: RequestSettings, + pub identity_nonce_stale_time_s: Option, +} + #[async_trait::async_trait] /// A trait for putting an identity to platform pub trait PutDocument { /// Puts an identity on platform + /// setting settings to `None` sets default connection behavior async fn put_to_platform( &self, sdk: &Sdk, @@ -27,6 +36,7 @@ pub trait PutDocument { document_state_transition_entropy: [u8; 32], identity_public_key: IdentityPublicKey, signer: &S, + settings: Option, ) -> Result; /// Waits for the response of a state transition after it has been broadcast @@ -47,16 +57,6 @@ pub trait PutDocument { data_contract: Arc, signer: &S, ) -> Result; - - async fn put_to_platform_with_settings( - &self, - sdk: &Sdk, - document_type: DocumentType, - document_state_transition_entropy: [u8; 32], - identity_public_key: IdentityPublicKey, - signer: &S, - settings: RequestSettings, - ) -> Result; } #[async_trait::async_trait] @@ -68,32 +68,22 @@ impl PutDocument for Document { document_state_transition_entropy: [u8; 32], identity_public_key: IdentityPublicKey, signer: &S, + settings: Option, ) -> Result { - self.put_to_platform_with_settings( - sdk, - document_type, - document_state_transition_entropy, - identity_public_key, - signer, - RequestSettings::default(), - ) - .await - } - - async fn put_to_platform_with_settings( - &self, - sdk: &Sdk, - document_type: DocumentType, - document_state_transition_entropy: [u8; 32], - identity_public_key: IdentityPublicKey, - signer: &S, - settings: RequestSettings, - ) -> Result { + let new_identity_contract_nonce = sdk + .get_identity_contract_nonce( + self.owner_id(), + document_type.data_contract_id(), + true, + settings, + ) + .await?; let transition = DocumentsBatchTransition::new_document_creation_transition_from_document( self.clone(), document_type.as_ref(), document_state_transition_entropy, &identity_public_key, + new_identity_contract_nonce, signer, sdk.version(), None, @@ -103,7 +93,10 @@ impl PutDocument for Document { let request = transition.broadcast_request_for_state_transition()?; - request.clone().execute(sdk, settings).await?; + request + .clone() + .execute(sdk, settings.unwrap_or_default().request_settings) + .await?; // response is empty for a broadcast, result comes from the stream wait for state transition result @@ -163,6 +156,7 @@ impl PutDocument for Document { document_state_transition_entropy, identity_public_key, signer, + None, ) .await?; diff --git a/packages/rs-sdk/src/platform/transition/withdraw_from_identity.rs b/packages/rs-sdk/src/platform/transition/withdraw_from_identity.rs index 84cebe3edc..b667e5e63f 100644 --- a/packages/rs-sdk/src/platform/transition/withdraw_from_identity.rs +++ b/packages/rs-sdk/src/platform/transition/withdraw_from_identity.rs @@ -1,13 +1,16 @@ use dapi_grpc::platform::VersionedGrpcResponse; use dpp::dashcore::Address; +use dpp::identity::accessors::IdentityGettersV0; use dpp::identity::core_script::CoreScript; use dpp::identity::signer::Signer; use dpp::identity::Identity; +use dpp::prelude::IdentityNonce; use dpp::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition; use crate::platform::transition::broadcast_request::BroadcastRequestForStateTransition; +use crate::platform::transition::put_document::PutSettings; use crate::{Error, Sdk}; use dpp::state_transition::identity_credit_withdrawal_transition::methods::IdentityCreditWithdrawalTransitionMethodsV0; use dpp::state_transition::proof_result::StateTransitionProofResult; @@ -24,6 +27,7 @@ pub trait WithdrawFromIdentity { amount: u64, core_fee_per_byte: Option, signer: S, + settings: Option, ) -> Result; } @@ -36,7 +40,9 @@ impl WithdrawFromIdentity for Identity { amount: u64, core_fee_per_byte: Option, signer: S, + settings: Option, ) -> Result { + let new_identity_contract_nonce = sdk.get_identity_nonce(self.id(), true, settings).await?; let state_transition = IdentityCreditWithdrawalTransition::try_from_identity( self, CoreScript::new(address.script_pubkey()), @@ -44,6 +50,7 @@ impl WithdrawFromIdentity for Identity { Pooling::Never, core_fee_per_byte.unwrap_or(1), signer, + new_identity_contract_nonce, sdk.version(), None, )?; @@ -52,7 +59,7 @@ impl WithdrawFromIdentity for Identity { request .clone() - .execute(sdk, RequestSettings::default()) + .execute(sdk, settings.unwrap_or_default().request_settings) .await?; let request = state_transition.wait_for_state_transition_result_request()?; diff --git a/packages/rs-sdk/src/platform/types/identity.rs b/packages/rs-sdk/src/platform/types/identity.rs index d64e8e6c25..ae8c24d2fc 100644 --- a/packages/rs-sdk/src/platform/types/identity.rs +++ b/packages/rs-sdk/src/platform/types/identity.rs @@ -3,12 +3,15 @@ use dapi_grpc::platform::v0::get_identity_balance_and_revision_request::GetIdentityBalanceAndRevisionRequestV0; use dapi_grpc::platform::v0::get_identity_balance_request::GetIdentityBalanceRequestV0; use dapi_grpc::platform::v0::get_identity_by_public_key_hash_request::GetIdentityByPublicKeyHashRequestV0; +use dapi_grpc::platform::v0::get_identity_contract_nonce_request::GetIdentityContractNonceRequestV0; +use dapi_grpc::platform::v0::get_identity_nonce_request::GetIdentityNonceRequestV0; use dapi_grpc::platform::v0::get_identity_request::GetIdentityRequestV0; use dapi_grpc::platform::v0::{ get_identity_balance_and_revision_request, get_identity_balance_request, - get_identity_by_public_key_hash_request, get_identity_request, - GetIdentityBalanceAndRevisionRequest, GetIdentityBalanceRequest, - GetIdentityByPublicKeyHashRequest, GetIdentityRequest, + get_identity_by_public_key_hash_request, get_identity_contract_nonce_request, + get_identity_nonce_request, get_identity_request, GetIdentityBalanceAndRevisionRequest, + GetIdentityBalanceRequest, GetIdentityByPublicKeyHashRequest, GetIdentityContractNonceRequest, + GetIdentityNonceRequest, GetIdentityRequest, }; use dpp::prelude::Identity; @@ -85,6 +88,48 @@ impl Query for dpp::prelude::Identifier { } } +impl Query for dpp::prelude::Identifier { + fn query(self, prove: bool) -> Result { + if !prove { + unimplemented!("queries without proofs are not supported yet"); + } + + let request: GetIdentityNonceRequest = GetIdentityNonceRequest { + version: Some(get_identity_nonce_request::Version::V0( + GetIdentityNonceRequestV0 { + identity_id: self.to_vec(), + prove, + }, + )), + }; + + Ok(request) + } +} + +impl Query + for (dpp::prelude::Identifier, dpp::prelude::Identifier) +{ + fn query(self, prove: bool) -> Result { + if !prove { + unimplemented!("queries without proofs are not supported yet"); + } + let (identity_id, contract_id) = self; + + let request: GetIdentityContractNonceRequest = GetIdentityContractNonceRequest { + version: Some(get_identity_contract_nonce_request::Version::V0( + GetIdentityContractNonceRequestV0 { + identity_id: identity_id.to_vec(), + contract_id: contract_id.to_vec(), + prove, + }, + )), + }; + + Ok(request) + } +} + impl Query for dpp::prelude::Identifier { fn query(self, prove: bool) -> Result { if !prove { diff --git a/packages/rs-sdk/src/sdk.rs b/packages/rs-sdk/src/sdk.rs index 2a21a95a37..eb7b255f9e 100644 --- a/packages/rs-sdk/src/sdk.rs +++ b/packages/rs-sdk/src/sdk.rs @@ -1,17 +1,31 @@ //! [Sdk] entrypoint to Dash Platform. -use std::sync::Arc; +use std::collections::btree_map::Entry; +use std::collections::BTreeMap; +use std::sync::{Arc, RwLock}; use std::{fmt::Debug, num::NonZeroUsize, ops::DerefMut}; use crate::error::Error; +use crate::internal_cache::InternalSdkCache; use crate::mock::MockResponse; #[cfg(feature = "mocks")] use crate::mock::{provider::GrpcContextProvider, MockDashPlatformSdk}; +use crate::platform::transition::put_document::PutSettings; +use crate::platform::{Fetch, Identifier}; use dapi_grpc::mock::Mockable; +use dapi_grpc::platform::v0::get_identity_contract_nonce_request::GetIdentityContractNonceRequestV0; +use dapi_grpc::platform::v0::get_identity_contract_nonce_response::Version; +use dapi_grpc::platform::v0::{ + GetIdentityContractNonceRequest, GetIdentityContractNonceResponse, Proof, +}; +use dpp::identity::identity_nonce::IDENTITY_NONCE_VALUE_FILTER; +use dpp::prelude; +use dpp::prelude::IdentityNonce; use dpp::version::{PlatformVersion, PlatformVersionCurrentVersion}; +use drive_proof_verifier::types::{IdentityContractNonceFetcher, IdentityNonceFetcher}; #[cfg(feature = "mocks")] use drive_proof_verifier::MockContextProvider; -use drive_proof_verifier::{ContextProvider, FromProof}; +use drive_proof_verifier::{types, ContextProvider, FromProof}; pub use http::Uri; #[cfg(feature = "mocks")] use rs_dapi_client::mock::MockDapiClient; @@ -23,6 +37,7 @@ use rs_dapi_client::{ }; #[cfg(feature = "mocks")] use std::path::{Path, PathBuf}; +use std::time::{SystemTime, UNIX_EPOCH}; #[cfg(feature = "mocks")] use tokio::sync::Mutex; use tokio_util::sync::{CancellationToken, WaitForCancellationFuture}; @@ -31,6 +46,14 @@ use tokio_util::sync::{CancellationToken, WaitForCancellationFuture}; pub const DEFAULT_CONTRACT_CACHE_SIZE: usize = 100; /// How many quorum public keys fit in the cache. pub const DEFAULT_QUORUM_PUBLIC_KEYS_CACHE_SIZE: usize = 100; +/// The default identity nonce stale time in seconds +pub const DEFAULT_IDENTITY_NONCE_STALE_TIME_S: u64 = 1200; //20 mins + +/// a type to represent staleness in seconds +pub type StalenessInSeconds = u64; + +/// The last query timestamp +pub type LastQueryTimestamp = u64; /// Dash Platform SDK /// @@ -62,6 +85,9 @@ pub struct Sdk { /// This is set to `true` by default. `false` is not implemented yet. proofs: bool, + /// An internal SDK cache managed exclusively by the SDK + internal_cache: InternalSdkCache, + /// Context provider used by the SDK. /// /// ## Panics @@ -185,6 +211,189 @@ impl Sdk { } } + /// Updates or fetches the nonce for a given identity from the cache, + /// querying Platform if the cached value is stale or absent. Optionally + /// increments the nonce before storing it, based on the provided settings. + pub async fn get_identity_nonce( + &self, + identity_id: Identifier, + bump_first: bool, + settings: Option, + ) -> Result { + let settings = settings.unwrap_or_default(); + let current_time_s = match SystemTime::now().duration_since(UNIX_EPOCH) { + Ok(n) => n.as_secs(), + Err(_) => panic!("SystemTime before UNIX EPOCH!"), + }; + + // we start by only using a read lock, as this speeds up the system + let mut identity_nonce_counter = self.internal_cache.identity_nonce_counter.lock().await; + let entry = identity_nonce_counter.entry(identity_id); + + let should_query_platform = match &entry { + Entry::Vacant(e) => true, + Entry::Occupied(e) => { + let (_, last_query_time) = e.get(); + *last_query_time + < current_time_s.saturating_sub( + settings + .identity_nonce_stale_time_s + .unwrap_or(DEFAULT_IDENTITY_NONCE_STALE_TIME_S), + ) + } + }; + + if should_query_platform { + let platform_nonce = IdentityNonceFetcher::fetch_with_settings( + &self, + identity_id, + settings.request_settings, + ) + .await? + .unwrap_or(IdentityNonceFetcher(0)) + .0; + match entry { + Entry::Vacant(e) => { + let insert_nonce = if bump_first { + platform_nonce + 1 + } else { + platform_nonce + }; + e.insert((insert_nonce, current_time_s)); + Ok(insert_nonce & IDENTITY_NONCE_VALUE_FILTER) + } + Entry::Occupied(mut e) => { + let (current_nonce, _) = e.get(); + let insert_nonce = if platform_nonce > *current_nonce { + if bump_first { + platform_nonce + 1 + } else { + platform_nonce + } + } else { + if bump_first { + *current_nonce + 1 + } else { + *current_nonce + } + }; + e.insert((insert_nonce, current_time_s)); + Ok(insert_nonce & IDENTITY_NONCE_VALUE_FILTER) + } + } + } else { + match entry { + Entry::Vacant(_) => { + panic!("this can not happen, vacant entry not possible"); + } + Entry::Occupied(mut e) => { + let (current_nonce, _) = e.get(); + if bump_first { + let insert_nonce = current_nonce + 1; + e.insert((insert_nonce, current_time_s)); + Ok(insert_nonce & IDENTITY_NONCE_VALUE_FILTER) + } else { + Ok(*current_nonce & IDENTITY_NONCE_VALUE_FILTER) + } + } + } + } + } + + /// Updates or fetches the nonce for a given identity and contract pair from a cache, + /// querying Platform if the cached value is stale or absent. Optionally + /// increments the nonce before storing it, based on the provided settings. + pub async fn get_identity_contract_nonce( + &self, + identity_id: Identifier, + contract_id: Identifier, + bump_first: bool, + settings: Option, + ) -> Result { + let settings = settings.unwrap_or_default(); + let current_time_s = match SystemTime::now().duration_since(UNIX_EPOCH) { + Ok(n) => n.as_secs(), + Err(_) => panic!("SystemTime before UNIX EPOCH!"), + }; + + // we start by only using a read lock, as this speeds up the system + let mut identity_contract_nonce_counter = self + .internal_cache + .identity_contract_nonce_counter + .lock() + .await; + let entry = identity_contract_nonce_counter.entry((identity_id, contract_id)); + + let should_query_platform = match &entry { + Entry::Vacant(e) => true, + Entry::Occupied(e) => { + let (_, last_query_time) = e.get(); + *last_query_time + < current_time_s.saturating_sub( + settings + .identity_nonce_stale_time_s + .unwrap_or(DEFAULT_IDENTITY_NONCE_STALE_TIME_S), + ) + } + }; + + if should_query_platform { + let platform_nonce = IdentityContractNonceFetcher::fetch_with_settings( + &self, + (identity_id, contract_id), + settings.request_settings, + ) + .await? + .unwrap_or(IdentityContractNonceFetcher(0)) + .0; + match entry { + Entry::Vacant(e) => { + let insert_nonce = if bump_first { + platform_nonce + 1 + } else { + platform_nonce + }; + e.insert((insert_nonce, current_time_s)); + Ok(insert_nonce & IDENTITY_NONCE_VALUE_FILTER) + } + Entry::Occupied(mut e) => { + let (current_nonce, _) = e.get(); + let insert_nonce = if platform_nonce > *current_nonce { + if bump_first { + platform_nonce + 1 + } else { + platform_nonce + } + } else { + if bump_first { + *current_nonce + 1 + } else { + *current_nonce + } + }; + e.insert((insert_nonce, current_time_s)); + Ok(insert_nonce & IDENTITY_NONCE_VALUE_FILTER) + } + } + } else { + match entry { + Entry::Vacant(_) => { + panic!("this can not happen, vacant entry not possible"); + } + Entry::Occupied(mut e) => { + let (current_nonce, _) = e.get(); + if bump_first { + let insert_nonce = current_nonce + 1; + e.insert((insert_nonce, current_time_s)); + Ok(insert_nonce & IDENTITY_NONCE_VALUE_FILTER) + } else { + Ok(*current_nonce & IDENTITY_NONCE_VALUE_FILTER) + } + } + } + } + } + /// Return [Dash Platform version](PlatformVersion) information used by this SDK. /// /// @@ -471,6 +680,7 @@ impl SdkBuilder { cancel_token: self.cancel_token, #[cfg(feature = "mocks")] dump_dir: self.dump_dir, + internal_cache: Default::default(), }; let sdk = Arc::new(sdk); @@ -517,6 +727,7 @@ impl SdkBuilder { }, dump_dir: self.dump_dir, proofs:self.proofs, + internal_cache: Default::default(), context_provider: std::sync:: Mutex::new( Some(context_provider)), cancel_token: self.cancel_token, }; diff --git a/packages/rs-sdk/tests/fetch/broadcast.rs b/packages/rs-sdk/tests/fetch/broadcast.rs index 63a72529dd..27d33987ab 100644 --- a/packages/rs-sdk/tests/fetch/broadcast.rs +++ b/packages/rs-sdk/tests/fetch/broadcast.rs @@ -1,7 +1,7 @@ #[cfg(all(feature = "network-testing", not(feature = "offline-testing")))] /// Tests that require connectivity to the server mod online { - use crate::{common::setup_logs, config::Config}; + use crate::fetch::{common::setup_logs, config::Config}; use dapi_grpc::platform::v0::{ wait_for_state_transition_result_request::WaitForStateTransitionResultRequestV0, WaitForStateTransitionResultRequest, diff --git a/packages/rs-sdk/tests/fetch/document.rs b/packages/rs-sdk/tests/fetch/document.rs index 6306ae2840..fbe1f5ee8a 100644 --- a/packages/rs-sdk/tests/fetch/document.rs +++ b/packages/rs-sdk/tests/fetch/document.rs @@ -69,8 +69,6 @@ async fn document_read_no_contract() { ) .await; - dbg!(&query); - assert!(matches!( query, Err(rs_sdk::error::Error::MissingDependency(_, _)) diff --git a/packages/rs-sdk/tests/fetch/identity_contract_nonce.rs b/packages/rs-sdk/tests/fetch/identity_contract_nonce.rs new file mode 100644 index 0000000000..becf74119e --- /dev/null +++ b/packages/rs-sdk/tests/fetch/identity_contract_nonce.rs @@ -0,0 +1,52 @@ +use dpp::identity::accessors::IdentityGettersV0; +use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; +use dpp::prelude::{Identifier, IdentityPublicKey}; +use dpp::{identity::hash::IdentityPublicKeyHashMethodsV0, prelude::Identity}; +use drive_proof_verifier::types::{ + IdentityBalance, IdentityBalanceAndRevision, IdentityContractNonceFetcher, +}; +use rs_sdk::platform::types::identity::PublicKeyHash; +use rs_sdk::platform::{Fetch, FetchMany}; + +use super::{common::setup_logs, config::Config}; + +/// Given some existing identity ID, when I fetch the identity, and I get it. +#[tokio::test(flavor = "multi_thread", worker_threads = 1)] +async fn test_identity_contract_no_nonce_read() { + setup_logs(); + + let cfg = Config::new(); + let identity_id: dpp::prelude::Identifier = cfg.existing_identity_id; + // We are putting a contract id that does not exist, hence we will never get a nonce + let contract_id: dpp::prelude::Identifier = Identifier::from_bytes(&[5u8; 32]).unwrap(); + + let sdk = cfg.setup_api().await; + + let identity_contract_nonce = + IdentityContractNonceFetcher::fetch(&sdk, (identity_id, contract_id)) + .await + .expect("fetch identity contract nonce"); + + assert!(identity_contract_nonce.is_none()); +} + +// Todo: add this test when we have a mock wallet +// #[tokio::test(flavor = "multi_thread", worker_threads = 1)] +// async fn test_identity_contract_nonce_read() { +// setup_logs(); +// +// let cfg = Config::new(); +// let identity_id: dpp::prelude::Identifier = cfg.existing_identity_id; +// let contract_id: dpp::prelude::Identifier = cfg.existing_data_contract_id; +// +// let sdk = cfg.setup_api().await; +// +// let identity_contract_nonce = +// IdentityContractNonceFetcher::fetch(&sdk, (identity_id, contract_id)) +// .await +// .expect("fetch identity contract nonce") +// .expect("found identity contract nonce") +// .0; +// +// assert_eq!(identity_contract_nonce, 1); +// } diff --git a/packages/rs-sdk/tests/fetch/mod.rs b/packages/rs-sdk/tests/fetch/mod.rs index b6e8ce893e..261cfa7364 100644 --- a/packages/rs-sdk/tests/fetch/mod.rs +++ b/packages/rs-sdk/tests/fetch/mod.rs @@ -13,6 +13,7 @@ mod data_contract; mod document; mod epoch; mod identity; +mod identity_contract_nonce; mod mock_fetch; mod mock_fetch_many; mod protocol_version_vote_count; diff --git a/packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:12.944990422Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:12.944990422Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json deleted file mode 100644 index e229a4f723306898fae742ee8c11b3fcc48faf23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74126 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 delta 1415 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 delta 1415 zcmY*ZPfQ$D7|)xT-I>Df&U>@`Td+F|sYz`y>@K^ryA`ZWXiFjpC(%QNUZ@%@9BR@u zrf4P6gHXw5`(0|Ki6$m!>_rI|A>mM>DR3c1OlZBeX@%BH4^711o9#jO@G@`T_r5>B zKkv$lHM3&fe8I4C*;0iL8wbrwp+v76FV>XuoyB~RE0zPAHclA1?8lqN!logH1Z~-h z9;RG=Duv`DtynHwLh)@A%a^|J=rzk_*ASj4^Q1Gzv-UtCANzlv{EV zv=nz2MxvtD=AWWMnz9?`f*TetlRzz_oA(U4P+G{fZ`E{1*@vP5vn26SU zB%Lx9o!;luay-E&P5k+T<8pTkK7Mvw-8oIXsTTfrMVk?JPkSxW%;$3SRd1SOaUqRj zKo@MEj^4v$#elc#(4>D{h9J}6yyRa~=RA~6P;*Mre^OlAD8WW7j zHI1kW!1xOTfnP^K7?|K0g}_q{BB1SSl5hLCzcViBgAJ%~K+@fVibgOmN_xB}aH{q2 z%5zmAnfYR#D-IIhsaGN1-_1$`3>`~nXcuXgTU>sUL>HU2SoSnNnsFMKuVTpqN%XM` zxo*cbm0+OU$#YGj!0(`MZr8!15fFw#K?;RdZz#Uij0v9(E6wZA!?Myp#-o0TNYVHsG{(ir=5Ck-3J!_SU@7}bQZdz)$qJviq z{d`LESXyar$SFhmg668L9Ii!`rmm=AH;I3@#Nqc=Wq5ZQUI#lg)gqd_ip|#)?1Kr| zZ3EM`xZ#&#_*g$+=uq5Py#cL9Jl=09NBKM#Q7-)*GgOOfuC*#1@q0?glFFmSHhXDj zqe{nU1X(}cgn;)Ol(zgnHn2+oO_NV(-f)ydvokg&qQ(k}{F?{sjSOn@lF~t-In#=o z?#YAIxJ@H@O%r*|6HV~B>)>`SYiRL`=Eu+$ot~__-5s&1I_}V5-sa9Na7B7MtbrEO zNq#SfiWZbYyo#oUHZ8YQ=r_DiZ~;OcdR1Y~{y^t6xZgR_u6a2MU+BrO-3SxZo#J~L@OTzt ziUX56I^ZtFyPz3v#2{Eb1N>(cxz}5iWBCD3wyS_&%p&Z>bxmu&rmMineHcQ53@{M< z5uWkhCU7aT;!j%eR}@S?ltUm*NC4k~e0fd5cs&B+NabHLzb_kpG69&ugd%DW6-OyVXF!ela2yjL`pK<^?G!{-naAQtH9ipw#{-iu*#E1I*Y3{);Q zpsD{Rm3}%EDz`3dDb3J#eVSLYsN+%+7_CB|GBW(80ObO98d|X>n4x*#w_O;ijzcwh zjbRiG$XG++8jreD_$nuGq~-Zm8^`Dt7@iWcWQ$ZQkR&$KY$V6uWRP_pDyWa{rxDGg zLe_cAAswIAn|;6U0Tp4@eR0wyd)VO(XozYUjj(IkTw|b)w+S={AYJqh4%3`)RS>4e zO27z)WvG6BCyM#~D~?Rn%eFvk_^QY^TyN(D$oUTeuY8;x!&WNLS6Rq?#;&W}#{LO~ oFH1&t-W|`Sg*4g)K&n8ur@aub&op9+jIE;2AGE6sS36YqKaL-b(*OVf delta 1415 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 delta 1415 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 literal 8694 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 literal 8841 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 ImMEV48+C3k;Q#;t delta 1701 zcmXX`OH7^3mPh&Tz0^{~;UA!ZneZBB1_qGF0A;YynSn%&w!C&)Qf=L|8dIpN z*3^LXTj)mG1&NzdNJxw^Ep(xa3Id5M7ZukPOBb3hu;6$8zl+JtoO|y%=X;!UeIe`m zLe^Km_!`6U*13(Kw>1`@dtR3pk3^dy&5cbh&8W{xdK$wkm$N>p#WSO@UuCddVqwN- z5DZ#4-mh>kp|MnFVLpfFH43{u3hO-@7yC4-f*RAg2G?>mwn`L6ixm#Cc-N;fT5GV) zHSf9b$%?hPW%6XUS)fms$SU76%fOQWOYQ-1++Jk?3-2|N(jnz8sjl`NT=P$zt zL4}!ijV@c^Y+R#*_vCj$wf2OYG0_mfBzv7qxkv9DS4j6MJUyv#KcZokE1XU-MaZCb zK;yqEh3tOKel#Ak$H#9P{FtX!7Gtkw<612PaTn;-V+2O<9lW&6?=yu8;fN5VocN`- ze-U_H~iCYwqjq~$Y&@- z7!OM|rj98`%Pn60JD?FBBBXYMOVr~HWkLAb=AF@6YE2z)h`yxzy!%b} ziw%}?G@b?&uKKAf+rN=#;P+XmZ?tfS6jh&esZspT*sa7UekCJ28HE(D?^bAR&_Wk& z4b`O`rrP|p)G7XNQ8+{E9TI7Jfb38nN&6x~D=A0m!W{dh0SxX8TG(US^PNSQrfcVk zPKX-wXxLFhN4T+uZl-Ft91+Io+Rc9BX^lF*xR8R)bj*Hrrs3rlvNvTZ}0@<2@OYZ%MrP(_-lZqLHDv8?zn#Yb003 zAYohR;`tui-XgIZ^ofwaLBkd&HEt)|^Y5FbhQ?W%R{DHDPvdccVJ(dv_AI9Vg0aJw zH6@>je4DJU(myjH?TGbOGodHr7@?;VLsCZ}m+xPrhXl*{l!L_^3CHnqdl^2X_;-`^ zTT=v|bHHTgghs(62Kg(ksjR{TaU9SPVy-%Jv`FutV=rQg^=$IQ?-qLc(Gl%wiDElh zf|}E%Y*}H7Pq-_b5)XQ8{GK*w8)R9QPH_zF@*;fdEhIgZh2;f~C_GQ-2X%BnslpG0 zF7d5GgYQl#T;V8YJj_k_)AaKU@5-p%WKP*Xfmd8#%V-PyKlriO$8^YY_Jzd-Ax$LX=LyA0td<>T&J;~b0?TNp_g?hkjYCp#7WuMyy#-$=zr4gAo=8JgW$2c%3^ zLAsLikaBq|7+yq(p^!6HQO-5T9nAGILo2MYFL~cdJcqRAlF!`gVu)!ExM`NSl|+eE zvMX-wXeUKNRJwvy%884msrO8X{- diff --git a/packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:12.958970753Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:53.562881817Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json similarity index 78% rename from packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:12.958970753Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json rename to packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:53.562881817Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json index 80f42f259036f23858514235ccec4a5811ac5812..78feda0e9b1b911165130edff0a180d867fbc408 100644 GIT binary patch literal 21973 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 GjQ#`6Gq@!H delta 1253 zcmY*ZOKcle6qUynR3T*Eom4_1j-TTo*JBZlthbkrWBBfRZ>15E7_rSRl%$Eh|(Y5u6!ss5dkAd-vY+yMA{g zaB(BB_F>Nf$Ij;QQBN$GAI#$0oJmrH65R!@f^I60LM80iE$D7c z7EFX#GtWD#afPo-0yUlJM{4%QN3PEda3xhOfi z*e+?DpOru!HyaULNs{f1_`=LbP0W*h-IZ>4&>856{O`j#t!mg;;uhh4H*MieLE&T8 z-yaeDo)HWWiIL9Yr%8?dh{91<zSopixg-y0- za&$69HA*Vzkb*O$u}LfMRRyh>VDf4DR~DQY{c4|v6UC! zC2y%zUEwvlx5{7)@cHEt@eDU|gHVMq<7+X-f}J>pcWm_ahw)p6x#$;^vR)==3{73q zg4@j4ldfPdBEIq7HjQ&V&enX;-C6fx(Y${1NsZ==g>yC9!{<(1P&=mZNQIF2-ij$4 zB+^=5Hz95-7 zb|KkSqGJb7t3W-16*k-EzlXOhHRj}gjk!p)_q3BKKV7iA@Z;wbUZU{J3GH7EF?9RX S;4-D#i&{ZD+s5$9oc$lvxtbRM diff --git a/packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:13.694486416Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json b/packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:53.577076107Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json similarity index 88% rename from packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:13.694486416Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json rename to packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:53.577076107Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json index ef2015b59ce284a595b99e70090ea4b19c20945f..3da06da09a6fef3ba60546282c55a29bde30565a 100644 GIT binary patch delta 1319 zcmZ9M&re)c9L2+6tPsQd-itA57-pWtAyZ(=%$xU^nbH}clqsQs5{4i0V@l&r8kJ2G zW2tp%5DLvPaUlg0H#XHy8#bmXg{=!n7bZ*0sGXr<@5cv2UuPP-q8R)ysz z!RC-caZoVVt+5;v>`p1H6f`cy70R~2YFAiu1p7e?OME^_Duh}zo=qs!Gz#8mQ244v zVKu61+uW9F`(HmN8ONd>#zWTnET*u_y=zgyn9B&Bx@vu{d+&8j zk1Jebg9i-~a8kHYu(85Evg3m0CXK_q#c$&XX2W<WUI8f;N^*b{tuB8v~3 z6sC!0Z&YDsNMp^D^?d(M1ztwP=Vvjn!5w;3RMq3FGHUjm~z#5>c3K zfAnZP?xM6YBBw-y>1AG!AJK>nyh8sluhE?KNn98VRVJwXZxU^08-ET97BU*uJZ@{s zLd^;B9jT(?C9WIA%Z_E7L6K7WdE|Cb;RYT4d`$5Cw8CLd!|qYoU|Hkz1f8ggX&e+N z&n61CWY(^aDZh3(VpA#IB#t|jaCA!WG28#*j8rDtT%0TPAeB=%$@P)<6iH}o(ecuh zAVose-3t4}J3xe+QH^Q#u^FvJj7glO!>hd-zwz8hUD^+U*>940ty}QZ1@WmG-7`bA zD4!K<4GG?4V77xyY(0B$T$Cq|p(h% zqvo*hbcxapo`sC^1G6}&F-Ldy`V@q&-R1kcble1=^8FBY#%=!BSj-YRODuFLbEL^^ z6|;VfGt>Q#uhkOIRrU9Sk$NKtr3W3TjS zT;z#+rzOyqApibACXShO$OQkU6T(&ES)il282djbxJ6ff>{9++GT+JjgN~Z#N?yS` z$-Bm7GV_*69j+4lA=Pn?-(tf4H@uFAP8Kj1*HeNnd5k8D|~a18HX GjQ#`6Gq@!H delta 1253 zcmY*ZOKcle6qUynR3T*Eom4_1j-TTo*JBZlthbkrWBBfRZ>15E7_rSRl%$Eh|(Y5u6!ss5dkAd-vY+yMA{g zaB(BB_F>Nf$Ij;QQBN$GAI#$0oJmrH65R!@f^I60LM80iE$D7c z7EFX#GtWD#afPo-0yUlJM{4%QN3PEda3xhOfi z*e+?DpOru!HyaULNs{f1_`=LbP0W*h-IZ>4&>856{O`j#t!mg;;uhh4H*MieLE&T8 z-yaeDo)HWWiIL9Yr%8?dh{91<zSopixg-y0- za&$69HA*Vzkb*O$u}LfMRRyh>VDf4DR~DQY{c4|v6UC! zC2y%zUEwvlx5{7)@cHEt@eDU|gHVMq<7+X-f}J>pcWm_ahw)p6x#$;^vR)==3{73q zg4@j4ldfPdBEIq7HjQ&V&enX;-C6fx(Y${1NsZ==g>yC9!{<(1P&=mZNQIF2-ij$4 zB+^=5Hz95-7 zb|KkSqGJb7t3W-16*k-EzlXOhHRj}gjk!p)_q3BKKV7iA@Z;wbUZU{J3GH7EF?9RX S;4-D#i&{ZD+s5$9oc$lvxtbRM diff --git a/packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:13.372463774Z_DocumentQuery_c104c67292061fe0b8e2f959cd2625892e0011f1264c65e1474532f59456ff51.json b/packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:53.577082679Z_DocumentQuery_c104c67292061fe0b8e2f959cd2625892e0011f1264c65e1474532f59456ff51.json similarity index 88% rename from packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:13.372463774Z_DocumentQuery_c104c67292061fe0b8e2f959cd2625892e0011f1264c65e1474532f59456ff51.json rename to packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:53.577082679Z_DocumentQuery_c104c67292061fe0b8e2f959cd2625892e0011f1264c65e1474532f59456ff51.json index 4f579a90c209caf0d7a9516da3e5cad15f398ce7..262275677a53b877b2ba219d045cac6a5e91f445 100644 GIT binary patch delta 1319 zcmZ9M&re)c9L2+6tPsQd-itA57-pWtAyZ(=%$xU^nbH}clqsQs5{4i0V@l&r8kJ2G zW2tp%5DLvPaUlg0H#XHy8#bmXg{=!n7bZ*0sGXr<@5cv2UuPP-q8R)ysz z!RC-caZoVVt+5;v>`p1H6f`cy70R~2YFAiu1p7e?OME^_Duh}zo=qs!Gz#8mQ244v zVKu61+uW9F`(HmN8ONd>#zWTnET*u_y=zgyn9B&Bx@vu{d+&8j zk1Jebg9i-~a8kHYu(85Evg3m0CXK_q#c$&XX2W<WUI8f;N^*b{tuB8v~3 z6sC!0Z&YDsNMp^D^?d(M1ztwP=Vvjn!5w;3RMq3FGHUjm~z#5>c3K zfAnZP?xM6YBBw-y>1AG!AJK>nyh8sluhE?KNn98VRVJwXZxU^08-ET97BU*uJZ@{s zLd^;B9jT(?C9WIA%Z_E7L6K7WdE|Cb;RYT4d`$5Cw8CLd!|qYoU|Hkz1f8ggX&e+N z&n61CWY(^aDZh3(VpA#IB#t|jaCA!WG28#*j8rDtT%0TPAeB=%$@P)<6iH}o(ecuh zAVose-3t4}J3xe+QH^Q#u^FvJj7glO!>hd-zwz8hUD^+U*>940ty}QZ1@WmG-7`bA zD4!K<4GG?4V77xyY(0B$T$Cq|p(h% zqvo*hbcxapo`sC^1G6}&F-Ldy`V@q&-R1kcble1=^8FBY#%=!BSj-YRODuFLbEL^^ z6|;VfGt>Q#uhkOIRrU9Sk$NKtr3W3TjS zT;z#+rzOyqApibACXShO$OQkU6T(&ES)il282djbxJ6ff>{9++GT+JjgN~Z#N?yS` z$-Bm7GV_*69j+4lA=Pn?-(tf4H@uFAP8Kj1*HeNnd5k8D|~a18HX GjQ#`6Gq@!H delta 1253 zcmY*ZOKcle6qUynR3T*Eom4_1j-TTo*JBZlthbkrWBBfRZ>15E7_rSRl%$Eh|(Y5u6!ss5dkAd-vY+yMA{g zaB(BB_F>Nf$Ij;QQBN$GAI#$0oJmrH65R!@f^I60LM80iE$D7c z7EFX#GtWD#afPo-0yUlJM{4%QN3PEda3xhOfi z*e+?DpOru!HyaULNs{f1_`=LbP0W*h-IZ>4&>856{O`j#t!mg;;uhh4H*MieLE&T8 z-yaeDo)HWWiIL9Yr%8?dh{91<zSopixg-y0- za&$69HA*Vzkb*O$u}LfMRRyh>VDf4DR~DQY{c4|v6UC! zC2y%zUEwvlx5{7)@cHEt@eDU|gHVMq<7+X-f}J>pcWm_ahw)p6x#$;^vR)==3{73q zg4@j4ldfPdBEIq7HjQ&V&enX;-C6fx(Y${1NsZ==g>yC9!{<(1P&=mZNQIF2-ij$4 zB+^=5Hz95-7 zb|KkSqGJb7t3W-16*k-EzlXOhHRj}gjk!p)_q3BKKV7iA@Z;wbUZU{J3GH7EF?9RX S;4-D#i&{ZD+s5$9oc$lvxtbRM diff --git a/packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:13.048252342Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:53.585317181Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json similarity index 78% rename from packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:13.048252342Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json rename to packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:53.585317181Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json index 80f42f259036f23858514235ccec4a5811ac5812..78feda0e9b1b911165130edff0a180d867fbc408 100644 GIT binary patch literal 21973 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 WMjkf>JKWjXMaem92eo}|MgIrU|F6sd delta 1980 zcmXw4ZERCj7|z!5{k}(1kxj3~XlVG%>jt z1tQ`)ILaF*+a1iPAhWQ{RHEB3AyJ~C)8HR4ZW?Ez0lFBCA!E+xysbZ;roH!^_v3k< z_w9GHXNo3)-mi)q>YFwlziN9ot#3O1*P61Xwd)$!ZfI!SxIwQjdd$;Mue*ve6wj0h z?Rq3t9+8S%zeiDO#8x!j6_S)qMio8XA5nT@rJ{*upG9}B1|4ExeA8#C7DGJTIwZzhCLrn|R_u8B>0I^u8FD^yE_!Tpz~G++igO zaSw!)z8ph{3=&L^*iv7cLiWw&lGf}iQ}oa)xarzaNOKiQ+~kLFei$MZ?o*!iZa_bp&rYV6ql&azd!WsZlzYiRt!sLD@QA zjHV95DAmDbln4i_DN!30y7`9Cool2XltNdnl9cZHpT~~(@Xgp&Cs)I5TPvjAjO3j1 z*#=bLp2vZS5AeaYBxk_Z!2vr~6y?5$6`eM8pZWx% z2sbF`=r8E;n|U8Xju`>Eal|-Y%ezv;WYiZZDTp{Y24Cka6w~u94jh}2v@49Jb3=Av zUOH|-$ksPOj`09x_v5S)oCnPP0fL3DKnlZBp3<0uHh9Xi*YRxI4!liHBX}-T7`LCs zQP4!FoRy*7De&o5jEQ`J{FGjq7M< z+Fq|+QCMuw%P5=^visySa8l22a9&TFWE<8WK*;nS5X^M4x;(3FpX@br{UQ<#pTg+0 zmsuwd;ryjz*ttBld~@Je7>U`LzkwMV{~0u-s?g+Y6y?hw@zYFT-WWWxgK68)Z_(s% zsn8dMpkx>e+0e|xz3U&u;pFaEAvt%UdofvN_fE{9uogdpUTZ<^$#b@KLc%r>>|mQA zsSb;aeLr{0QabI4(8o(k1nnM0F=oGkXO-V%fSl zM93K4gQVPD{A+~a{o)LvhOL8p^24A zIyk^_cm5EV8ZS?tWAEpHTF=eBeaOY4NO!_{?lQ}bLn!(};HKBAG6-|!f z->cmL9j)h460bu3zcQPJ&+4h5GR@NLMQi|`lbcsS43ACr9h~AzQ(Y)-eia-5cTzj{ Qp{KsdIIWVFe`d%313s3gy8r+H diff --git a/packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:14.035375207Z_DocumentQuery_90af5a08200f1b0e42dbd3ad7a6af38ff6415d9cabab87315b9d9d736194597f.json b/packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:54.216923773Z_DocumentQuery_90af5a08200f1b0e42dbd3ad7a6af38ff6415d9cabab87315b9d9d736194597f.json similarity index 88% rename from packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:14.035375207Z_DocumentQuery_90af5a08200f1b0e42dbd3ad7a6af38ff6415d9cabab87315b9d9d736194597f.json rename to packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:54.216923773Z_DocumentQuery_90af5a08200f1b0e42dbd3ad7a6af38ff6415d9cabab87315b9d9d736194597f.json index be23c77cb6dc6b4007d8108dfa3b284a0224b70b..2a854d17b94f963c850282331ad80640d6e81c71 100644 GIT binary patch delta 1303 zcmZ8hOH5o<7!H@j=(KXrIk;(^%N-a(9GS7dDYjiNZ@Vnh>?tL?09#2amW$)A|lbzFYsDj zVtztke^{Y3D{-|UQOXM}4oSQ+Em1ozVZ{X&EEC&f0;duZ9|RTV>T)$I@OqClqET%5 zea1inpT%t)>6XYk68A$A>pXDV&n5xU9*ZZjH15NV857S1I&d!|aV{x0_J@Cd40~rK zd?y4-y#nhcfnr{|jjrVc4lIRc#l)?+#76~*r8$X7BGoA8!wSnK(H>2ua3g0SJS*^L zTHqy47-Ib*k#CPll}-gczW;pDj9Y$d%ydf*6JwLOOTDHGLE|g(=ylt~UxDJr;)LJ8 zr9R$Art}@#sm`_x)^k319n*+K@w;QAa$aGRfQtmDi=H1*s16Byc}C)Bw{TgxR3YUA z_DQuxZMLHDaiKNz`~(>*ODwbYz>-EfhWi;GR!HQXvbmZ!@z7CNiI{k@|KHJC{O1h9&NjyHG=5Gbpe!+%nB=_9z4t_K2ep z=v?g*m?UItOrp-C`5{HMCEgrv`R;H22PQ>lG?{r+CNgj=;KKr;U8YapI;%%i_{k!i zSOQyfN6>xxY3z{j{0xbmrs{ry*^JO^S>*XnP~!U$a+$(%(5ASQCTqGxd9nn~l0#Dp z`-1`(#_6l$0zs~C+Y*hsa*5Es(*rf?omdZ=&}Q)rxh*c184<2s$I0i{*;cEQ zmcV;GY{d)|$)mRJ6TF6Pb#Qe4F47#=Z90lpJD?1&QaTUUzALxZ9@+|BezPrxNX-X_ zEdCH-GULLCXYhW(c6F=;Bp!?k?8X#6gS=! n6f?iA{t9#Dqy)uJICCv(a#-BTso({D2-U0fJXlT5b>VP delta 1303 zcmY+EO>7%g6onN#LMRoTcPB`Q;>?&jze;1zjN^-ZV;MtZ}UK_63*fi~Yuro16Hl^(*i$XLjA?mUb<>O?jsc$_eB zeO$1TG;k;`ICoaCUQ_s@PjLCTpnuxLLXY4@hoHgp34TB67Tm5I_-;TjIwpwb750jP ztr^w~oA~pnLcMNct*$VaR9NU2yf>k++G*hQw89%Pg}Yh7NYTRHoM0_(Vv*-oLGD}e*Dg2!mES=&kT?!4(o9FZ2 zYAWm{Gx)w>1v@>hnb;a@Gs z)e5-O$zl4ei6>cwKGt8L4j=erTT$(9%0F0__VCtZly_S=mrzJ>zxQVaM#aD_GT!y5 zQ`Nu=N7!3%X~cjvWg_9~=Ypr?q_M771a_3WQ^Wn3i3i=>eOj>S3VyN$SIF)#d1yX| zyF_yddyWHDhz4wJa{hVB5AM|LFO4Y7&nOtwcau9mJ7cns;JU4-ufnk*6?mdN-1I~v zZsW7LCi_<`!9~_LdQ?jq`3W2MNkpr3#4)fzheC*!vK*(GH;Gh+B#oU_KiAb<;B!w(k7U-N8gWa?nxawiQ= ggMGxX2cct_KPCokCc8^oJ;!g(u`~5DesA>t2h5e9n*aa+ diff --git a/packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:13.709021613Z_GetIdentityKeysRequest_b4ecff7acf52818aef9ed37a98d4a459dc7a67570ea6df3f8858d3fae7820ffe.json b/packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:54.222895153Z_GetIdentityKeysRequest_b4ecff7acf52818aef9ed37a98d4a459dc7a67570ea6df3f8858d3fae7820ffe.json similarity index 71% rename from packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:13.709021613Z_GetIdentityKeysRequest_b4ecff7acf52818aef9ed37a98d4a459dc7a67570ea6df3f8858d3fae7820ffe.json rename to packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:54.222895153Z_GetIdentityKeysRequest_b4ecff7acf52818aef9ed37a98d4a459dc7a67570ea6df3f8858d3fae7820ffe.json index 0e45e826c619c97bf5d9c9969372b042066eea33..f7a57bba0e35f2c87647bf21f220a6ac20108c32 100644 GIT binary patch literal 15482 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 e=+fG6o#~bCzW(pD`-c7ees}Es`C39@X9T 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 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:13.376226003Z_GetIdentityBalanceRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:54.228228459Z_GetIdentityBalanceRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json similarity index 71% rename from packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:13.376226003Z_GetIdentityBalanceRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json rename to packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:54.228228459Z_GetIdentityBalanceRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json index 1db95eeb4557c9035db48fac294b3f53faab1d41..909151cfd5d7cad821ba2576dfebbc04b7e9caf3 100644 GIT binary patch literal 11764 zcmai)$!;S@5JY{}R|tLfp(EKF{VRq+a3p#}SQ5t+HGnbDzq_lnF#81s%|XNJt~E0< za;g4xb$#9Z+#R3xhsWlR>tA!TJZL|D&#nFK-1@V=DQ~;!_mAJozt^kuqVIDf&W%_N z=SF+}+3WmUW11?oKELU^^Y3W$8f}_OQy$;tZfS9~sh3ixE^W6@eIgAW#`8wfo;0On zM3)9Aªh9tu-A3~`Sd9=oO)4*Tvn`nL<4?lOao=(T-U48j7|9!c7x%%y@DD^8H zKkQE1+wEza^ga)|+wH&Ko#tmv*EjD=&ChQR$KB@UZo7Zn+#hcK+1+kFdaBPVYIZ*k zH+S;{=_t)<|FGLUJe6rRwo@0=6hqr}d4>5nr^C(ResjiV5^VFjb_Hg0yM4NQ*q(M} zE8F``ujWlSFYh~Uj=QJl`*My~d{>OmD;)k_Jem*oy-4x)+vfe{8TDmM+Cgb1l+?Ff zg2biw@7pQw=Fv&*rLFd>2SY+r9g!`uJcwi{wL_o8ULPnywT{TPReRW>Fa?%~NJy?T zt}q~0=%F45jcix1+r$u?BHKwBG2mRv#8jtTLwVV_N{0n4)dx7~!hTDKHPtavc9{d~ zlmbH3Vh$W*g&C=EKV@R8vf^xwOVp{yly+{YFVk|JF;nyFp&+Pi|FuJ=={iNG>iQtl zbsdr^yY_&b7Svrk;GCJl%lk~9rA^3XIxp{`hy|_J@tNAo1A|AV_|hTMd}$NHGDLFE zGwm;x2~|P&XreQk+)W4)Hym^n5hW7Yy_OTp=!jFSuxAnQL11(ou?7&bKdxdo6I{xa z3~3e=>IS{G`UoK&2r)-11VZxzCkXcX)D@vAfQvge0+ynq%Nlh?&1tc4RA%++N zoc?PBNCWKw3&_yWu?OKnD-E7PEze0<$Cv68*@lsV(Tlim*Ek?S4@iXvjc)=(Myiiq z+Gu=bn_S`?2-6BH&^OWBX`tv0=k&oQSPGJB1~(;o4(k!(!3Y2kSD-8r>FRJ)%3`85 zQWW&MbT^tzpIA~x;3BQi0L_4L&P9e+*%uw?Wq>G}Fa3krJ3ZvU6VM8J2*GHPQe()) zxRSazN6Pq^JD}#p&?GESXkp3}lgJ(#F@o-2J#00&?KK3qhM=?tSqGNH0y+OKNMW2x z_XHaZiz!K0BuLSz(wh(p*gugZD$c-3322QeEvhwVL@5R5Bzqa@a#u7Ex+=>LWHviM z)A9#g#heW--7+K5(1O%1qbqXe(mkz!;9xRl5TtjB7JNmzu_bJaj2#(|Sjw5DcK{x@iH}WPN&JQ?7_>3!y~bqyu!)Bd3`%c&?=&jd!7ZHb;3|5#P`I#|;(YV>2ancAY3Pv6>YBq+TxnoKO9xQax^u@@NH3>RtO;jyx z9~(k%o8D3YhJ;Wp>}N$^NmnEb_tw~w7<1BtQ;*~>dOM&uY>(8kEW$JwJVMH1kU%{$ z?-ipdo-&x7(P^9e3a%*=tsTr)T`~hbku${_2ne$~AQ0-Hwpi7`^kjGf*iv(ifFvfg ztcY%i2ec@Gk-2$WtM#}i<0dWSVoXLe#HoTt5v-fAR3j#wUels#ph+vdT*w8f3kCr= z7FOUE5f7LT0hX6d2DRpP#Tdw<2|~r9T&pCtBs=4C>WMr-1F%GtahDYq#e~QB&N&*A zri~li#Q4xdSVnWv0>ku;Rx_b!f+>PO;H8i;BqL)S98Irod0xX)0foyZeVfc#S&f!{ z!VMc%~6rgp7OE9DlfZfJ(#Ni7-hLJ~yVaphrSmaS2E7Hd%4Us{(Jiy=%3pYc>M zW3VNyW^O!0#~)-B$R)^q!Sa`RO&JIn0bva>;-S5JW<<8M+f#)6CI|Ptq`Jj-3-tnn zjy33#f;A|y08N;YLoDNG0m%Z;@$H_!?C|45h|*~OeLftYA2xUMmjUw)KQ8f!E#gA? z1C=tJm$F#*q)+7yw=B@`{1$3keDG0sVU-!~!m~dnRx$*Wl&mUdv)S$%>LkVszccoBiSfNc>^u~_~g zNwCOfWm5vpyy)V~xXKaOwb0GcEvwQ?x{=NSH_DS&nhnr_; literal 11759 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 literal 24658 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 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:13.696798309Z_GetIdentityBalanceAndRevisionRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:54.235614684Z_GetIdentityBalanceAndRevisionRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json similarity index 78% rename from packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:13.696798309Z_GetIdentityBalanceAndRevisionRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json rename to packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:54.235614684Z_GetIdentityBalanceAndRevisionRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json index bb42841eb5cdf8e446969a79231e229788029595..ebc626b707c24cbb40bbb8139d273036ef58f27c 100644 GIT binary patch literal 20823 zcmeI4$!;505Jj`rR|s5Z!79%Al^`H!iLr!8qC-&z0z?0veyxGk=g{INKoG=PIO=Bi z8)~?9tLl;8E-o)eU$^_m+ug(Hm&x0f)8pScu5*mbSh1|{PwQi4@)(z=qC7M$%bk^H zvb;QB92Zj76w9)WoR$}&jx;Z`&5I1DbrVr8vc4UQeAU2jZ;Kdx+3&t?J3SrtPuu>( z=kDLG*zo*j#T8o1*vbrJL>T=bJ-!Z#12a-lppAU+wnW_0`Sh_F;Xu zyZU2$y?%c(W>rO_?U&uvO*cT<%II)=zg^!ywqav2UQTnl%=vgatuu7nIqa@>ck82V z7Qv2Q=I#x1biH}Jx!)YNZ7G|(^(;oO!g+pM@o2w&e7bAQVp_Tka$+dE|i?XoDhU6w7jOFYa^SGZA3?!?=joZdFmKE1qLV)B?2i)s(VqjaWelF~yB))%_5GMJ;h1)tUP@hH~+gOUPl4 z>lJ61apN<*5mSgND`2!m&5BF+iyUhbsEhiX;RSA+k{(Kds)g}X1U@Chj|U6MV+^fE zg|{|AMY5M`NRUbj8f(-@(+@F$2`VlZdQpPcX+@eBt8-iL3dNu7m&wEus zG;;lVTVirZW%S8 zw-KVouKvaxb7ti=?THnD7*ohXJS8QUG=MptNJ9Gpvd+qd+9I(=>`4|z&2YXTfEW=g zwQ4JfGfTjdlK2-ZfN;(zl`)>6TV$np{hC&^FyD}5aU|X}P?Nz$1kp)?5YA#-us$vk(T4QqThqEjB*M|Ip)q-lc1R?Pa@G*+D*{l zH3IGMlFA$uwR>k9J`al&!>120CrHs53Si0gt2(8$fWFL>o~97wGr>%fLQXnGFuT&C zh&T)QHU(kaV_KlZf%{w_Us8g+gr_PESU|t3&aN;;kXFIoXK$J>9RsIpk5Ip&8cmR?g(~Y9ki~l_LTqEu%X&dGKqQO4EJ`r{ z3uZrq9#=mF(;cV^VF9@jZ4=1En1RQ!In4a=WymjB%VZ2pwG@csv};9br{r|sP@=}9 ziO9%h#sp$f&4sv@#5KBO*n=?#5kCa^>^sr&L@<;+Y7wkol7esq0i7ra{14`)qA%sf z2{;_v1}xDoLF`mNC19xBuCPe|4GPJ$%N9sE&=G<_#dyyujf&GQG*Y>&vQT!eBoi%( zzOqqqK}Ry+6ZT1PBR^2IH}Pf}KWW4w!E?Bxc0rV)q=3-Y4Pz;QRV$)-$c%{=Vi2U* ztmKI8!PAn7UDE6swS<~bZBWc=q?41d)=mSaQwg^50M+Ks86lRbOb~yVxG>a&5Dz}3 zWHqEI?1Hf;sA@&oU{ivER;VG9Gy1?~n1d@5PKk#53rkekC*|RR#|zB*7yE4qz|pq^LbC>PmI<4W^!^4TNbef(F6_JG>}p zk5f3yN9Yg3c+4ME_iTIFvsjCv<$$UDsoEU z8Cb>S6b`tEWEYz;DtO+Ek~q;Vfqyc2RY8@}Tnt#`kCGbNh%k&)P-pwdH?#sBkWt1Z zK?O;R2BiTgR+5mCR=a6OZ&3Y`Awv%k@9A&k{;V^x#;e|m_$+ApM>P$%nP7-cV(FX&{bjz6m2qH`Gz)ueL4X=#A8x1er={Z;ikRKnLzbWTR{XFO*V zIZ>Ga?@@Lrz}B%Tl1v?FXYZM-972q?4I^Yv86N|`@aeyGDNRxAkiqa$j;~lVd>%lf ziaaYV>Z#Mbedvb;C}Ni!VDN3Dz6k-g8YB~#LJ;nwmW+0x?+dur3W(AWTorQ>vno*q z7@asY6G@Rn>0gyF5_h!+f)zzjR%U683_o&*p7?kFupmMr$a+6b?mwA3z=VO|xWvP_ zq(ddKk<=_ite8!u8V`aan7c~HMmRD;R>*_on@Jx*+HD=6ww#zaonjU0uMLMJA#?`E z*g(d}q(ucJr5u!-j+7dkP}oBF^6@N@LZ(`>7&#?^3(Gq!C@D3QHIU@UJec7pcVUW1 zvp%mree*^}NGm0sQja|u5*Y!haJ7zD_f!@D&ZZKxzIJh@5T>M-p2cXV%Bj03jKLBt z1<5&6Z5BojJ&~$=6C0@;9TYloejBDwS?J&}U7p8sm}G=n;>vvl;L0KBfO25)HrWiV zl2HaAL-%Fs$dfuOk7;kfn2!6qC?Hr8tIv zRrf^e*-&5+LnQ$ARFP|uz_G@C23*uv3?54(KccR4Fggw{(Js5Ki3SEDARCbY(_5U320XJ7@Wr!RUYplQEefql=29 zgd0sEL?w459}#Dw^V1^y9R$)a9d}U0QVnbr1!$FaE&9rk0K20_6b<=J2#{zgh$PVGlzI1z8h8p6xuaC|aAoo1+4>4)iH|fP<@6DPf)XA{&;e z@3rVS90jGKw3p#14T`GsK4LoZBz?o!wGahz&`1lId|rJjRazC=Mf(_-B|m<}%H?3J zTgR>yx8->x#OLd%Bw{F4DevToMD?m!P9ZNKVCx4$7-X3TNh}OCtSYc+M4}+El8hSA z*a1@BsxYsUm@EnC2SNy%LKZ%t?|d-}^-%;WOYKPxA$9AVBZ~ko@(^L|(c)bMe+@zB z(k~gfVNO&f1D(frS&xwrDPvsvm(gsTq6|fl!|_{LY+Jz4%1Om$}X&Z f*O*@E?%}U5jjnXL*!z?1clO$UFaLl2)xEy~7mFj= literal 20800 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 literal 24658 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 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:54.256001517Z_GetIdentityContractNonceRequest_b7c02dae0c3c762ece1f70a36f88fa69b4749b19cc1f5ef0abf37fa0c04ab2ef.json b/packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:54.256001517Z_GetIdentityContractNonceRequest_b7c02dae0c3c762ece1f70a36f88fa69b4749b19cc1f5ef0abf37fa0c04ab2ef.json new file mode 100644 index 0000000000000000000000000000000000000000..952cd3cad8e27bc0e647df3d65bff98e74ecadb0 GIT binary patch literal 14551 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 P`}?Z)-^>4B|Jv#ww=m(& literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:13.706232100Z_DocumentQuery_fb3b25c8fa37750a6c1b18d9085fcf0df7bf150009b1ced887a6f051ab86085b.json b/packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:54.258023385Z_DocumentQuery_fb3b25c8fa37750a6c1b18d9085fcf0df7bf150009b1ced887a6f051ab86085b.json similarity index 87% rename from packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:13.706232100Z_DocumentQuery_fb3b25c8fa37750a6c1b18d9085fcf0df7bf150009b1ced887a6f051ab86085b.json rename to packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:54.258023385Z_DocumentQuery_fb3b25c8fa37750a6c1b18d9085fcf0df7bf150009b1ced887a6f051ab86085b.json index e6db15192cc0ac9be3f92157ff46aacef1ac477b..bc56856842108d4659c02a8fc857e5913456ec6b 100644 GIT binary patch delta 1283 zcmYjRU1*zC7$ylD+6(iZGiA)>=aY3^YPyo|%a<zEE-Ds}_#~KG!FDmP<6rE_dD|gXa1i@a^vP<#*IbT2w9Kv_bdEfVWpXYhc zyB*($9p8;dLw+}fNGKLarCgLk$9vMQlTJHB3D?EN(6~QkuYMic4dGx+@Z~Xuf9iru zO@*nj!i9!Hg=;x2D7y*^MTPYv3R`uB{2x6bZ3S6%@G;TEn>#V+4U}f%Y z)%EJR>>K+rHKH(35d4t~V(oKl7i`Bjrn{K-^LX_O)0d;1kW*9#TEQr)yP_c zt(L+jV`l~h`LJN3tS}rGyvp@FfnBdFzn#JNxiH%4ptt>ERbhiAOi8ZQU~$op&!a+` zgn1Nl1i6?Me3R5zZ;8)Fq8vqYQsXvJmD$G3pvK&Y;MrlpCefWcA|54g=1Dle+oZ-2 zJ4-YM`4=a;+1GL!cX)Stm}dqZ(c`E_rxd|RS@}~5+^7m=bg6Ju#Na**N*X-|1bpMS=XUJy%sKPBOTViVi zjI~a6J$IoY{!9`Vvr(_(PEq4L!xw0<_fDI(6f&cP;JEmyatO!khw&HLnjwTs6~XLN zf){K;rJ?%C>~62Z&-Ba+VI^3?h`2#DF0l0JIH^WRzP0PZyDDYjLo!8h2J$wjOjkc=4={7D=}*+(+nym?an z)iJ?k-g}$08V_EjPv4@#Cbyy7?6t!hADt9m0(-qtgecZ`6xFzOg||JIbI-7JpUmt$ zuJAD{Ez^ykj43?R6#POn7$(j$s7ugBpTa~qNRl*` z6XLxV`!i8Q=+lQY3VnHcppPUBDsONfq=@DfnCE-M!8|bJ4)j?6``JzkcMD-}q*h4w V8hbF5j3qta(G*ESvatJf>|c(%u8#l! delta 1327 zcmZ8hPfS~N91joT49>mZ_g9SxwtW=@p|rH`(emDGDT7h4DNt56ob%7Tl1+E?u(){9 z#6(NX$7FGHpeLgTAmOkOvbl?z7{+$-qDH2PCpE?_9#lsB{9Zjcnlvx%d%y4Z^Y>j| zX?cI8WvwIH=4SoFh(>!`59fSLM$_%SH<H!ps3iabUe5f%cXb|LcIWBYr!vy#{m)wXcTrFsvp4Ir|2^-h@Boer(_Qd}_Zs1~j zG=X7)-svKkvRHW!nb|mg=+gLZM4`&v2Z-|_@;I0hTq-M^pHV0h&%waPp_(!{*E`B@ zSRt;-VX<5n@5SO4r~j3V8_JgN;iT`NP!+s0-Bj=1B&UxH&Q=7g6@?eF3O^?W-;jiv zp6#?lg;oNwya2a72l-xw5`|0?$Yxnu-Mo);6$jhIzFKjtAr~LV9DLy@bP(qTaUbZ{ zI6rA)n_J9=clk|LHC`q5jefx|N4br1avYW^*=uEu#kydPvfd`=bKM#X9_5*qaHi2> ziT9{MtC!6pT1*(8vB1GkRX-egdX|oG%^Aw{I!B~un`4T!fBZ>>_?W`td@~Nu{uhUZ zo&+wQXv(}dr+MDSkqMrsFwfJSHw!AXWRFygSZ@>hCL?4|*c3~(xxrvNYHg39G!qT+ zuF$tqx8S6wu{C4k7Jp9@n8|XcQ{ly;Zt?JA#fc2<3x#3zQ4q&!LSu)_XDIdu6x;m2 zd&0rS2>tM|)$bVMe|X^~U3IWbPA2}3kDIy(t{&B)1}3@#G23F_J}o5BPqiBfg};6J zo`~S3DVsYqk%o?$;_Z|jT;%P0$5@J(U~W*1_g0X@rNKC(9ATstPSN)78T)GkT)_VA zQIN|NG@a_iBE2-oA0E?TJdFRQYu}Ct?$$-`uL1+QopbPLFYEcV#-DW?TfCm?65OHn zR~TATfks^-o|nJBMnrsp{+no+*nK@i=~;bqKEo=1-Y2bjuW8TH@jTMB#pJ`p>$kE* z++gVbdA`e7IiXd?>)sxwz9dFJBa9h6Qq$ODe@cY;4-;%2VR=Kg#xs-V_=KRq$f=}x d)()HeR)%k_IsM3f_FmR+;@ho0h`aN>{{lXwpL75K diff --git a/packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:14.019269155Z_GetProtocolVersionUpgradeStateRequest_bb149e1933b9dc561bbfacfb6d09550f0ea4a6af6f68037e7d50ff4e4de74509.json b/packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:54.258421095Z_GetProtocolVersionUpgradeStateRequest_bb149e1933b9dc561bbfacfb6d09550f0ea4a6af6f68037e7d50ff4e4de74509.json similarity index 62% rename from packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:14.019269155Z_GetProtocolVersionUpgradeStateRequest_bb149e1933b9dc561bbfacfb6d09550f0ea4a6af6f68037e7d50ff4e4de74509.json rename to packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:54.258421095Z_GetProtocolVersionUpgradeStateRequest_bb149e1933b9dc561bbfacfb6d09550f0ea4a6af6f68037e7d50ff4e4de74509.json index 3a5f04fc75559cd08b4a05b9b9f3e2ee6d1d11c0..de8652c425ccfd1378a9f19ef8ec2dde1cac5dc9 100644 GIT binary patch literal 8223 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 Q=aK1i#q{&~_w@1Nzt$=9i~s-t literal 10901 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 delta 1981 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 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:14.034739998Z_GetProtocolVersionUpgradeVoteStatusRequest_8534be7e0b4dd648520dc3a67209b1a05862cb8d40c088b193b59ca3564210bc.json b/packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:54.612509758Z_GetProtocolVersionUpgradeVoteStatusRequest_8534be7e0b4dd648520dc3a67209b1a05862cb8d40c088b193b59ca3564210bc.json similarity index 70% rename from packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:14.034739998Z_GetProtocolVersionUpgradeVoteStatusRequest_8534be7e0b4dd648520dc3a67209b1a05862cb8d40c088b193b59ca3564210bc.json rename to packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:54.612509758Z_GetProtocolVersionUpgradeVoteStatusRequest_8534be7e0b4dd648520dc3a67209b1a05862cb8d40c088b193b59ca3564210bc.json index 6d4c8434ecdce1229277a70fbcd8bf8f0d817e1b..d1b8b6223c3c2930af2160c178f7827854d9f493 100644 GIT binary patch literal 11315 zcmeI2%W~UB5Jj`rSE#to0^NAhzmiI^Xo-=Eb-zB`Pe1;0dayj4 zZTs{87ymUIym{o;ch@X#cE_i2a$KJ8Ob-3FneL4H)zYjvc~O%;m7s3DWa?& zR&6Za%=PmA!eYNU93P4vuMu&IifM=4Z?jvIVt2)gw_i(moPPWf80DP{3CiW!_~l~y zwZ2gNbmM*h)6aZ6mRzo?=P&gA{5slhexqK_ua~&a_QLE%h~@&=<$8%7qsNUJI%Z;p z4kBgJ2mu+SHp~z`_8cG+&C=ob=&(Rm6cS2gElWd-213$sG($+J9xDdbqR_R}g47+Z zqsEPXn8PD@9oTc=14|e#h%h=ch>r;AjT;#-KBdS8V%CsK{*8dUlBQ88#ZqF;jhBQ# z64((4KY>EVY2ag<6RHNT;cQmrSmi5R(|J@q09U!b?KYRDwo0M#mciZ(P>nr|7AG zyG-s%6l4WhWMBe^=&6Dx z>}pgW$b7+!;`)w0q*OEx$(^mj%&>=q z3>JNwa{|=RN-09c6o+%6Nf@^bx(1$79Te`gkvr8jQ4NO80Qw1y2q|^TFk)P(W@Khz zAr&kDsU~G)J`Xjx6<$fTqZ%LqL7G9Scvh;BWf=UdTr`2wAdIGC@=&1=Bu+9w83^LI-raY(d3l2)D{dbuqf*e`burNhR|U zu`lIRGFiSVy3)9V#p#gXsD^om`8q5Wf{mSOkWQ7kl27p5g6Wq`r{G~cDjAAxHEKh2 zkr|_ZJM=B{m-9J!xmf&h-0hE#{?wuT80278iJ~5oSGFJqHftp9U`g&XQ#OFwLxV;? z!GVz`rW$JnlfUQgnpaB~_Bd)N2-u+S#ab*O6(r)d5a>C-QBIl`{SZNi?cLLQJnqZ) z75E~6@X+Z8fy^-v+idV8(H89gH2zo5>#qRj+#5OrqOnvjhr)!VXmSQkLunFZF_b~s z6$VF%8gm3ANr&X2>93l6l;t+CHgVsDT&al;j~|2cLfKDF;slbzkfhTz15)J4;N&`{ zC!KjBu?sjn(Nrf!V4()mf;t@02pb~FEG<$E$8&TpxkhH?Y{Fx9otH6(xRYbwrQVNK zxGD?SL9D9wQ^(QduB5YcCe9_~ZjJUi$k%a>PvsQR8q2UDAxQ^=D>%Ul&MIl%VC~n% zhxuhcea%-sWt(|q@wI$fx7tqM*6}0FQn@fONS;p;iCSi|96wkBgJ~R`B4hQt|imAm6#&!t?6 Ssyjbfz6dRUUjKdjKJ;&fQ8Nkv literal 11321 zcmeI&%WfNI3^Av&BU5M1ZuTm6(Vym&y*h*zNXc6SyJL5R6^qr>OcF`=7%;=y0 zLLMF-a^~}!w{It(_Q!|Y!~Nu^x1Wd0@y7J!|HIY8X?HwrKOPU;(;wTL-NViBA#@1%O zIvctFc(@udHa)v{y1m*e_h!+}nRtHX!w-*~RGDZZ|Kdp*u^ zJ)rn*ciN9z*?rj7bnjftnY7*;s^dU0zw*!$6r*YCyvdHV71 z&={XN+rfDGV*c@B_;oh_w&3%Pf4y8g+tm41j94>&&zGz)l_s zOnDX!Pb1c|%QCX`?+O6DyyipB(1>r_flwwTA3+3EG zgheZ)wQ9Xq@D~6Gmac^(UWL9)V)|;+mt{*u5{-0bK_E~S=cPwm!Zes_yD^hp4rnPk`Cb7!dVzu8OmAx+8O zB}f$l;>ii|cTjIfph=~rCUy&Iut;-DGE9Z^7h_WK5}bF#CxM{017(ve>yIcW)afay zQil@@5s+dk;@?oP?PX1>RE#3laK&=50m8=eQoJNwn7{%y5Dl{j^_QAZf(fz!Ewv;H z+*0-iOwDAxH3FxjXGiKUYu7Sxqj_o35V<~@s2OLNc10kX`6FGu#wL*uS+Lc}A!w}E zY(*H9GvI3~ktrgnhnCa`S*__y>>4eB@$6HLt^TtV=ep2$P70OW3{OVU>U$S=8Kng)w(a1AYBO8TU-4I$ZP&(Hw z#FDQ>Qk=210y~P=Leb_ZqZ>@i+d7g!pH$;Vjz; zwR(Q}J2rk^-k6UUliwc?$H%+;=wbX(F%$%A{nsWR_oXDw1gL_H?Bvn)S4S|&3~i|t zK4lG6YcQ~(pk3^Y*!g$MRvgjU^w5!*T+t+BxC`1^&%O(phuin}yVK)w{Ir5k0em~F z_$?zmXuE_^ic?EEUm+^%%I1r$l!!=mT4Zs1pRGMZN|bX(@f?e^VVpS(pjvol-@$#_ zn23s7_EHink>dSP^xuLcq8-Yqr096-90iW5x#Z~dmx3hx6-bpGogwt9#dGwHEhS5- zZnm=_WBWWBQ_P2veqx{UfTk&Bk)1#LHp$91!72`>x=S!F`nx&iIDE`Ee#dqp zeJAh6@9MU%Y%miT(wdrZhbO diff --git a/packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:14.032126958Z_IdentityRequest_68658eccbc00d6ee8168459f8be3c7bc00df8bb9df6382f1d8cee10a503c01af.json b/packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:54.612885967Z_IdentityRequest_6f74498ccb101c39329fd63ff2af65555849abef7f60625ccd3623e6e829c227.json similarity index 77% rename from packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:14.032126958Z_IdentityRequest_68658eccbc00d6ee8168459f8be3c7bc00df8bb9df6382f1d8cee10a503c01af.json rename to packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:54.612885967Z_IdentityRequest_6f74498ccb101c39329fd63ff2af65555849abef7f60625ccd3623e6e829c227.json index 6771c4478cd5101ea475defff80ac6146a9178c0..ce48bc6b35973ffa0114c0fc200768c82ebf4a64 100644 GIT binary patch literal 31425 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 N4Dgr#xB4mMe*s?ypfvyh literal 29472 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 Cv6<@t diff --git a/packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:14.065452692Z_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json b/packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:54.648522779Z_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json similarity index 99% rename from packages/rs-sdk/tests/vectors/msg_2024-02-06T16:01:14.065452692Z_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json rename to packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:54.648522779Z_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json index 7756cc12fa8bcc918031d45f55261466d6fde7df..97c579be795b0659cb1a0563c58d860d8eee6f6e 100644 GIT binary patch delta 1937 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, pub start_identities: Vec<(Identity, StateTransition)>, pub identities_inserts: Frequency, + pub identity_contract_nonce_gaps: Option, pub signer: Option, } @@ -100,6 +102,7 @@ struct StrategyInSerializationFormat { pub operations: Vec>, pub start_identities: Vec<(Identity, StateTransition)>, pub identities_inserts: Frequency, + pub identity_contract_nonce_gaps: Option, pub signer: Option, } @@ -123,6 +126,7 @@ impl PlatformSerializableWithPlatformVersion for Strategy { operations, start_identities, identities_inserts, + identity_contract_nonce_gaps, signer, } = self; @@ -161,6 +165,7 @@ impl PlatformSerializableWithPlatformVersion for Strategy { operations: operations_in_serialization_format, start_identities, identities_inserts, + identity_contract_nonce_gaps, signer, }; @@ -196,6 +201,7 @@ impl PlatformDeserializableWithPotentialValidationFromVersionedStructure for Str operations, start_identities, identities_inserts, + identity_contract_nonce_gaps, signer, } = strategy; @@ -244,6 +250,7 @@ impl PlatformDeserializableWithPotentialValidationFromVersionedStructure for Str operations, start_identities, identities_inserts, + identity_contract_nonce_gaps, signer, }) } @@ -470,6 +477,7 @@ impl Strategy { current_identities: &Vec, block_height: u64, signer: &SimpleSigner, + contract_nonce_counter: &mut BTreeMap<(Identifier, Identifier), u64>, platform_version: &PlatformVersion, ) -> Vec { self.contracts_with_updates @@ -488,10 +496,16 @@ impl Strategy { .clone() .into_partial_identity_info(); + let identity_contract_nonce = contract_nonce_counter + .entry((identity.id, contract_update.data_contract().id())) + .or_default(); + *identity_contract_nonce += 1; + let state_transition = DataContractUpdateTransition::new_from_data_contract( contract_update.data_contract().clone(), &identity, 1, //key id 1 should always be a high or critical auth key in these tests + *identity_contract_nonce, signer, platform_version, None, @@ -550,6 +564,8 @@ impl Strategy { block_info: &BlockInfo, current_identities: &mut Vec, signer: &mut SimpleSigner, + identity_nonce_counter: &mut BTreeMap, + contract_nonce_counter: &mut BTreeMap<(Identifier, Identifier), u64>, rng: &mut StdRng, platform_version: &PlatformVersion, ) -> (Vec, Vec) { @@ -592,10 +608,22 @@ impl Strategy { } else { None }; + + let identity_contract_nonce = contract_nonce_counter + .entry((identity.id(), contract.id())) + .or_default(); + let gap = self + .identity_contract_nonce_gaps + .as_ref() + .map_or(0, |gap_amount| gap_amount.events_if_hit(rng)) + as u64; + *identity_contract_nonce += 1 + gap; + let document_create_transition: DocumentCreateTransition = DocumentCreateTransitionV0 { base: DocumentBaseTransitionV0 { id: document.id(), + identity_contract_nonce: *identity_contract_nonce, document_type_name: document_type.name().clone(), data_contract_id: contract.id(), } @@ -701,10 +729,17 @@ impl Strategy { } else { None }; + + let identity_contract_nonce = contract_nonce_counter + .entry((identity.id(), contract.id())) + .or_default(); + *identity_contract_nonce += 1; + let document_create_transition: DocumentCreateTransition = DocumentCreateTransitionV0 { base: DocumentBaseTransitionV0 { id: document.id(), + identity_contract_nonce: *identity_contract_nonce, document_type_name: document_type.name().clone(), data_contract_id: contract.id(), } @@ -796,10 +831,18 @@ impl Strategy { .fetch_identity_balance_with_keys(request, None, platform_version) .expect("expected to be able to get identity") .expect("expected to get an identity"); + let identity_contract_nonce = contract_nonce_counter + .get_mut(&(identity.id, contract.id())) + .expect( + "the identity should already have a nonce for that contract", + ); + *identity_contract_nonce += 1; + let document_delete_transition: DocumentDeleteTransition = DocumentDeleteTransitionV0 { base: DocumentBaseTransitionV0 { id: document.id(), + identity_contract_nonce: *identity_contract_nonce, document_type_name: document_type.name().clone(), data_contract_id: contract.id(), } @@ -883,10 +926,18 @@ impl Strategy { .fetch_identity_balance_with_keys(request, None, platform_version) .expect("expected to be able to get identity") .expect("expected to get an identity"); + let identity_contract_nonce = contract_nonce_counter + .get_mut(&(identity.id, contract.id())) + .expect( + "the identity should already have a nonce for that contract", + ); + *identity_contract_nonce += 1; + let document_replace_transition: DocumentReplaceTransition = DocumentReplaceTransitionV0 { base: DocumentBaseTransitionV0 { id: document.id(), + identity_contract_nonce: *identity_contract_nonce, document_type_name: document_type.name().clone(), data_contract_id: contract.id(), } @@ -962,6 +1013,7 @@ impl Strategy { crate::transitions::create_identity_update_transition_add_keys( random_identity, *count, + identity_nonce_counter, signer, rng, platform_version, @@ -978,6 +1030,7 @@ impl Strategy { random_identity, *count, block_info.time_ms, + identity_nonce_counter, signer, rng, platform_version, @@ -999,6 +1052,7 @@ impl Strategy { let state_transition = crate::transitions::create_identity_withdrawal_transition( random_identity, + identity_nonce_counter, signer, rng, ); @@ -1017,7 +1071,11 @@ impl Strategy { let state_transition = crate::transitions::create_identity_credit_transfer_transition( - owner, recipient, signer, 1000, + owner, + recipient, + identity_nonce_counter, + signer, + 1000, ); operations.push(state_transition); } @@ -1074,6 +1132,8 @@ impl Strategy { block_info: &BlockInfo, current_identities: &mut Vec, signer: &mut SimpleSigner, + identity_nonce_counter: &mut BTreeMap, + contract_nonce_counter: &mut BTreeMap<(Identifier, Identifier), u64>, rng: &mut StdRng, platform_version: &PlatformVersion, ) -> (Vec, Vec) { @@ -1096,6 +1156,8 @@ impl Strategy { block_info, current_identities, signer, + identity_nonce_counter, + contract_nonce_counter, rng, platform_version, ); @@ -1108,6 +1170,7 @@ impl Strategy { current_identities, block_info.height, signer, + contract_nonce_counter, platform_version, ); state_transitions.append(&mut contract_update_state_transitions); @@ -1255,6 +1318,7 @@ mod tests { times_per_block_range: Default::default(), chance_per_block: None, }, + identity_contract_nonce_gaps: None, signer: Some(simple_signer), }; diff --git a/packages/strategy-tests/src/transitions.rs b/packages/strategy-tests/src/transitions.rs index 53a2657707..b9cfb3bddb 100644 --- a/packages/strategy-tests/src/transitions.rs +++ b/packages/strategy-tests/src/transitions.rs @@ -38,7 +38,7 @@ use simple_signer::signer::SimpleSigner; use dpp::dashcore::transaction::special_transaction::asset_lock::AssetLockPayload; use dpp::dashcore::transaction::special_transaction::TransactionPayload; -use std::collections::HashSet; +use std::collections::{BTreeMap, HashSet}; use std::str::FromStr; /// Constructs an `AssetLockProof` representing an instant asset lock proof. @@ -283,6 +283,7 @@ pub fn create_identity_top_up_transition( pub fn create_identity_update_transition_add_keys( identity: &mut Identity, count: u16, + identity_nonce_counter: &mut BTreeMap, signer: &mut SimpleSigner, rng: &mut StdRng, platform_version: &PlatformVersion, @@ -304,12 +305,16 @@ pub fn create_identity_update_transition_add_keys( .find(|(_, key)| key.security_level() == MASTER) .expect("expected to have a master key"); + let identity_nonce = identity_nonce_counter.entry(identity.id()).or_default(); + *identity_nonce += 1; + let state_transition = IdentityUpdateTransition::try_from_identity_with_signer( identity, key_id, add_public_keys.clone(), vec![], None, + *identity_nonce, signer, platform_version, None, @@ -362,6 +367,7 @@ pub fn create_identity_update_transition_disable_keys( identity: &mut Identity, count: u16, block_time: u64, + identity_nonce_counter: &mut BTreeMap, signer: &mut SimpleSigner, rng: &mut StdRng, platform_version: &PlatformVersion, @@ -407,12 +413,16 @@ pub fn create_identity_update_transition_disable_keys( .find(|(_, key)| key.security_level() == MASTER) .expect("expected to have a master key"); + let identity_nonce = identity_nonce_counter.entry(identity.id()).or_default(); + *identity_nonce += 1; + let state_transition = IdentityUpdateTransition::try_from_identity_with_signer( identity, key_id, vec![], key_ids_to_disable, Some(block_time), + *identity_nonce, signer, platform_version, None, @@ -453,17 +463,19 @@ pub fn create_identity_update_transition_disable_keys( /// - If there's an error during the signing process. pub fn create_identity_withdrawal_transition( identity: &mut Identity, + identity_nonce_counter: &mut BTreeMap, signer: &mut SimpleSigner, rng: &mut StdRng, ) -> StateTransition { - identity.bump_revision(); + let nonce = identity_nonce_counter.entry(identity.id()).or_default(); + *nonce += 1; let mut withdrawal: StateTransition = IdentityCreditWithdrawalTransitionV0 { identity_id: identity.id(), amount: 100000000, // 0.001 Dash core_fee_per_byte: MIN_CORE_FEE_PER_BYTE, pooling: Pooling::Never, output_script: CoreScript::random_p2sh(rng), - revision: identity.revision(), + nonce: *nonce, signature_public_key_id: 0, signature: Default::default(), } @@ -523,14 +535,17 @@ pub fn create_identity_withdrawal_transition( pub fn create_identity_credit_transfer_transition( identity: &Identity, recipient: &Identity, + identity_nonce_counter: &mut BTreeMap, signer: &mut SimpleSigner, amount: u64, ) -> StateTransition { + let nonce = identity_nonce_counter.entry(identity.id()).or_default(); + *nonce += 1; let mut transition: StateTransition = IdentityCreditTransferTransitionV0 { identity_id: identity.id(), recipient_id: recipient.id(), amount, - revision: identity.revision() + 1, + nonce: *nonce, signature_public_key_id: 0, signature: Default::default(), } diff --git a/packages/wasm-dpp/lib/test/fixtures/getIdentityCreditWithdrawalTransitionFixture.js b/packages/wasm-dpp/lib/test/fixtures/getIdentityCreditWithdrawalTransitionFixture.js index 97c73146bb..892acc55c1 100644 --- a/packages/wasm-dpp/lib/test/fixtures/getIdentityCreditWithdrawalTransitionFixture.js +++ b/packages/wasm-dpp/lib/test/fixtures/getIdentityCreditWithdrawalTransitionFixture.js @@ -14,7 +14,7 @@ module.exports = function getIdentityCreditWithdrawalTransitionFixture() { stateTransition.setPooling(0); stateTransition.setOutputScript(Script.buildPublicKeyHashOut(address).toBuffer()); // eslint-disable-next-line - stateTransition.setRevision(BigInt(1)); + stateTransition.setNonce(BigInt(1)); return stateTransition; }; diff --git a/packages/wasm-dpp/src/data_contract/data_contract_facade.rs b/packages/wasm-dpp/src/data_contract/data_contract_facade.rs index 1b99d0a567..a22bc6ab75 100644 --- a/packages/wasm-dpp/src/data_contract/data_contract_facade.rs +++ b/packages/wasm-dpp/src/data_contract/data_contract_facade.rs @@ -17,6 +17,7 @@ use crate::utils::{ use dpp::ProtocolError; use std::sync::Arc; +use dpp::prelude::IdentityNonce; use wasm_bindgen::prelude::*; impl From for DataContractFacadeWasm { @@ -125,9 +126,13 @@ impl DataContractFacadeWasm { pub fn create_data_contract_update_transition( &self, data_contract: &DataContractWasm, + identity_contract_nonce: IdentityNonce, ) -> Result { self.0 - .create_data_contract_update_transition(data_contract.to_owned().into()) + .create_data_contract_update_transition( + data_contract.to_owned().into(), + identity_contract_nonce, + ) .map(Into::into) .map_err(from_protocol_error) } diff --git a/packages/wasm-dpp/src/document/document_facade.rs b/packages/wasm-dpp/src/document/document_facade.rs index fe1cfa493a..bbb4d40524 100644 --- a/packages/wasm-dpp/src/document/document_facade.rs +++ b/packages/wasm-dpp/src/document/document_facade.rs @@ -96,8 +96,10 @@ impl DocumentFacadeWasm { pub fn create_state_transition( &self, documents: &JsValue, + nonce_counter_value: &js_sys::Object, //IdentityID/ContractID -> nonce ) -> Result { - self.factory.create_state_transition(documents) + self.factory + .create_state_transition(documents, nonce_counter_value) } // /// Creates Documents State Transition diff --git a/packages/wasm-dpp/src/document/factory.rs b/packages/wasm-dpp/src/document/factory.rs index d0002bca61..88934bacc5 100644 --- a/packages/wasm-dpp/src/document/factory.rs +++ b/packages/wasm-dpp/src/document/factory.rs @@ -1,7 +1,7 @@ use anyhow::anyhow; use dpp::document::document_factory::DocumentFactory; -use std::collections::HashMap; +use std::collections::{BTreeMap, HashMap, HashSet}; use wasm_bindgen::prelude::*; @@ -13,6 +13,7 @@ use dpp::document::Document; use dpp::prelude::ExtendedDocument; +use dpp::identifier::Identifier; use dpp::state_transition::documents_batch_transition::document_transition::action_type::DocumentTransitionActionType; use dpp::version::PlatformVersion; use std::convert::TryFrom; @@ -107,9 +108,48 @@ impl DocumentFactoryWASM { pub fn create_state_transition( &self, documents: &JsValue, + nonce_counter_value: &js_sys::Object, //IdentityID/ContractID -> nonce ) -> Result { + let mut nonce_counter = BTreeMap::new(); + let mut contract_ids_to_check = HashSet::<&Identifier>::new(); + + // TODO: move to a function and handle errors instead of doing unwraps + { + js_sys::Object::entries(nonce_counter_value) + .iter() + .for_each(|entry| { + let key_value = js_sys::Array::try_from(entry.clone()).unwrap(); + let identity_id = identifier_from_js_value(&key_value.get(0)).unwrap(); + let contract_ids = key_value.get(1); + let contract_ids = js_sys::Object::try_from(&contract_ids).unwrap(); + + js_sys::Object::entries(&contract_ids) + .iter() + .for_each(|entry| { + let key_value = js_sys::Array::try_from(entry.clone()).unwrap(); + let contract_id = identifier_from_js_value(&key_value.get(0)).unwrap(); + let nonce = key_value.get(1).as_f64().unwrap() as u64; + nonce_counter.insert((identity_id, contract_id), nonce); + }); + }); + } + + nonce_counter.iter().for_each(|((_, contract_id), _)| { + contract_ids_to_check.insert(contract_id); + }); + let documents_by_action = extract_documents_by_action(documents)?; + for (_, documents) in documents_by_action.iter() { + for document in documents.iter() { + if !contract_ids_to_check.contains(&document.data_contract().id()) { + return Err(JsValue::from_str( + "Document's data contract is not in the nonce counter", + )); + } + } + } + let documents: Vec<( DocumentTransitionActionType, Vec<(Document, DocumentTypeRef, Bytes32)>, @@ -134,7 +174,10 @@ impl DocumentFactoryWASM { }) .collect(); - let batch_transition = self.0.create_state_transition(documents).with_js_error()?; + let batch_transition = self + .0 + .create_state_transition(documents, &mut nonce_counter) + .with_js_error()?; Ok(batch_transition.into()) } diff --git a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/mod.rs b/packages/wasm-dpp/src/document/state_transition/document_batch_transition/mod.rs index dea07a934a..ec3b92a7f2 100644 --- a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/mod.rs +++ b/packages/wasm-dpp/src/document/state_transition/document_batch_transition/mod.rs @@ -14,7 +14,9 @@ use dpp::consensus::ConsensusError; use dpp::platform_value::BinaryData; use dpp::serialization::PlatformSerializable; use dpp::state_transition::documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; -use dpp::state_transition::documents_batch_transition::document_transition::DocumentTransition; +use dpp::state_transition::documents_batch_transition::document_transition::{ + DocumentTransition, DocumentTransitionV0Methods, +}; use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; use dpp::state_transition::StateTransition; use wasm_bindgen::prelude::*; @@ -128,6 +130,11 @@ impl DocumentsBatchTransitionWasm { Ok(()) } + #[wasm_bindgen(js_name=setIdentityContractNonce)] + pub fn set_identity_contract_nonce(&mut self, nonce: u32) { + self.0.set_identity_contract_nonce(nonce as u64); + } + // #[wasm_bindgen(js_name=toJSON)] // pub fn to_json(&self) -> Result { // let value = self.0.to_json(false).with_js_error()?; diff --git a/packages/wasm-dpp/src/errors/consensus/basic/document/identity_contract_nonce_out_of_bounds_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/document/identity_contract_nonce_out_of_bounds_error.rs new file mode 100644 index 0000000000..dff1ed3953 --- /dev/null +++ b/packages/wasm-dpp/src/errors/consensus/basic/document/identity_contract_nonce_out_of_bounds_error.rs @@ -0,0 +1,34 @@ +use dpp::consensus::basic::document::IdentityContractNonceOutOfBoundsError; +use dpp::consensus::codes::ErrorWithCode; +use dpp::consensus::ConsensusError; + +use wasm_bindgen::prelude::*; + +#[wasm_bindgen(js_name=IdentityContractNonceOutOfBoundsError)] +pub struct IdentityContractNonceOutOfBoundsErrorWasm { + inner: IdentityContractNonceOutOfBoundsError, +} + +impl From<&IdentityContractNonceOutOfBoundsError> for IdentityContractNonceOutOfBoundsErrorWasm { + fn from(e: &IdentityContractNonceOutOfBoundsError) -> Self { + Self { inner: e.clone() } + } +} + +#[wasm_bindgen(js_class=IdentityContractNonceOutOfBoundsError)] +impl IdentityContractNonceOutOfBoundsErrorWasm { + #[wasm_bindgen(js_name=getIdentityContractNonce)] + pub fn get_identity_contract_nonce(&self) -> u64 { + self.inner.identity_contract_nonce() + } + + #[wasm_bindgen(js_name=getCode)] + pub fn get_code(&self) -> u32 { + ConsensusError::from(self.inner.clone()).code() + } + + #[wasm_bindgen(getter)] + pub fn message(&self) -> String { + self.inner.to_string() + } +} diff --git a/packages/wasm-dpp/src/errors/consensus/basic/document/mod.rs b/packages/wasm-dpp/src/errors/consensus/basic/document/mod.rs index 9015719ebc..fedc3b69b7 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/document/mod.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/document/mod.rs @@ -2,6 +2,7 @@ mod data_contract_not_present_error; mod document_transitions_are_absent_error; mod duplicate_document_transitions_with_ids_error; mod duplicate_document_transitions_with_indices_error; +mod identity_contract_nonce_out_of_bounds_error; mod inconsistent_compound_index_data_error; mod invalid_document_transition_action_error; mod invalid_document_transition_id_error; @@ -15,6 +16,7 @@ pub use data_contract_not_present_error::*; pub use document_transitions_are_absent_error::*; pub use duplicate_document_transitions_with_ids_error::*; pub use duplicate_document_transitions_with_indices_error::*; +pub use identity_contract_nonce_out_of_bounds_error::*; pub use inconsistent_compound_index_data_error::*; pub use invalid_document_transition_action_error::*; pub use invalid_document_transition_id_error::*; diff --git a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs index 6f17e1ec88..c61a9813b3 100644 --- a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs @@ -26,7 +26,7 @@ use crate::errors::consensus::basic::identity::{ use crate::errors::consensus::state::identity::{ DuplicatedIdentityPublicKeyIdStateErrorWasm, DuplicatedIdentityPublicKeyStateErrorWasm, - MissingIdentityPublicKeyIdsErrorWasm, + InvalidIdentityNonceErrorWasm, MissingIdentityPublicKeyIdsErrorWasm, }; use dpp::consensus::basic::BasicError; use dpp::consensus::basic::BasicError::{ @@ -66,8 +66,9 @@ use crate::errors::consensus::basic::data_contract::{ }; use crate::errors::consensus::basic::document::{ DuplicateDocumentTransitionsWithIdsErrorWasm, DuplicateDocumentTransitionsWithIndicesErrorWasm, - InvalidDocumentTransitionActionErrorWasm, InvalidDocumentTransitionIdErrorWasm, - MissingDataContractIdErrorWasm, MissingDocumentTypeErrorWasm, + IdentityContractNonceOutOfBoundsErrorWasm, InvalidDocumentTransitionActionErrorWasm, + InvalidDocumentTransitionIdErrorWasm, MissingDataContractIdErrorWasm, + MissingDocumentTypeErrorWasm, }; use crate::errors::consensus::basic::state_transition::{ InvalidStateTransitionTypeErrorWasm, MissingStateTransitionTypeErrorWasm, @@ -212,6 +213,7 @@ pub fn from_state_error(state_error: &StateError) -> JsValue { StateError::InvalidAssetLockProofValueError(e) => { InvalidAssetLockProofValueErrorWasm::from(e).into() } + StateError::InvalidIdentityNonceError(e) => InvalidIdentityNonceErrorWasm::from(e).into(), // TODO(versioning): restore _ => todo!(), } @@ -319,6 +321,9 @@ fn from_basic_error(basic_error: &BasicError) -> JsValue { BasicError::IdentityCreditTransferToSelfError(err) => { IdentityCreditTransferToSelfErrorWasm::from(err).into() } + BasicError::IdentityContractNonceOutOfBoundsError(err) => { + IdentityContractNonceOutOfBoundsErrorWasm::from(err).into() + } ProtocolVersionParsingError(e) => ProtocolVersionParsingErrorWasm::from(e).into(), SerializedObjectParsingError(e) => SerializedObjectParsingErrorWasm::from(e).into(), JsonSchemaError(e) => JsonSchemaErrorWasm::from(e).into(), diff --git a/packages/wasm-dpp/src/errors/consensus/state/identity/invalid_identity_contract_nonce_error.rs b/packages/wasm-dpp/src/errors/consensus/state/identity/invalid_identity_contract_nonce_error.rs new file mode 100644 index 0000000000..41f4bf76ca --- /dev/null +++ b/packages/wasm-dpp/src/errors/consensus/state/identity/invalid_identity_contract_nonce_error.rs @@ -0,0 +1,70 @@ +use crate::buffer::Buffer; + +use dpp::consensus::codes::ErrorWithCode; +use dpp::consensus::state::identity::invalid_identity_contract_nonce_error::InvalidIdentityNonceError; +use dpp::consensus::ConsensusError; +use dpp::identity::identity_nonce::MergeIdentityNonceResult; +use wasm_bindgen::prelude::*; + +#[wasm_bindgen(js_name=InvalidIdentityNonceError)] +pub struct InvalidIdentityNonceErrorWasm { + inner: InvalidIdentityNonceError, +} + +impl From<&InvalidIdentityNonceError> for InvalidIdentityNonceErrorWasm { + fn from(e: &InvalidIdentityNonceError) -> Self { + Self { inner: e.clone() } + } +} + +#[wasm_bindgen(js_class=InvalidIdentityNonceError)] +impl InvalidIdentityNonceErrorWasm { + #[wasm_bindgen(js_name=getIdentityId)] + pub fn identity_id(&self) -> Buffer { + Buffer::from_bytes(self.inner.identity_id().as_bytes()) + } + + #[wasm_bindgen(js_name=getCurrentIdentityContractNonce)] + pub fn current_identity_contract_nonce(&self) -> Option { + self.inner + .current_identity_contract_nonce() + .map(|nonce| *nonce as u64) + } + + #[wasm_bindgen(js_name=getSettingIdentityContractNonce)] + pub fn setting_identity_contract_nonce(&self) -> u64 { + *self.inner.setting_identity_contract_nonce() as u64 + } + + #[wasm_bindgen(js_name=getError)] + pub fn error(&self) -> js_sys::Error { + match self.inner.error() { + MergeIdentityNonceResult::NonceTooFarInFuture => { + js_sys::Error::new("nonce too far in future") + } + MergeIdentityNonceResult::NonceTooFarInPast => { + js_sys::Error::new("nonce too far in past") + } + MergeIdentityNonceResult::NonceAlreadyPresentAtTip => { + js_sys::Error::new("nonce already present at tip") + } + MergeIdentityNonceResult::NonceAlreadyPresentInPast(nonce) => { + js_sys::Error::new(&format!("nonce already present in past: {}", nonce)) + } + MergeIdentityNonceResult::MergeIdentityNonceSuccess(_) => { + js_sys::Error::new("no error") + } + MergeIdentityNonceResult::InvalidNonce => js_sys::Error::new("invalid nonce"), + } + } + + #[wasm_bindgen(js_name=getCode)] + pub fn get_code(&self) -> u32 { + ConsensusError::from(self.inner.clone()).code() + } + + #[wasm_bindgen(getter)] + pub fn message(&self) -> String { + self.inner.to_string() + } +} diff --git a/packages/wasm-dpp/src/errors/consensus/state/identity/mod.rs b/packages/wasm-dpp/src/errors/consensus/state/identity/mod.rs index 73172810de..4fe5e33f35 100644 --- a/packages/wasm-dpp/src/errors/consensus/state/identity/mod.rs +++ b/packages/wasm-dpp/src/errors/consensus/state/identity/mod.rs @@ -4,6 +4,7 @@ mod identity_already_exists_error; mod identity_public_key_disabled_at_window_violation_error; mod identity_public_key_is_disabled_error; mod identity_public_key_is_read_only_error; +mod invalid_identity_contract_nonce_error; mod invalid_identity_public_key_id_error; mod invalid_identity_revision_error; mod max_identity_public_key_limit_reached_error; @@ -15,6 +16,7 @@ pub use identity_already_exists_error::*; pub use identity_public_key_disabled_at_window_violation_error::*; pub use identity_public_key_is_disabled_error::*; pub use identity_public_key_is_read_only_error::*; +pub use invalid_identity_contract_nonce_error::*; pub use invalid_identity_public_key_id_error::*; pub use invalid_identity_revision_error::*; pub use max_identity_public_key_limit_reached_error::*; diff --git a/packages/wasm-dpp/src/identity/identity_facade.rs b/packages/wasm-dpp/src/identity/identity_facade.rs index cbfbc660ec..941c61d19b 100644 --- a/packages/wasm-dpp/src/identity/identity_facade.rs +++ b/packages/wasm-dpp/src/identity/identity_facade.rs @@ -23,8 +23,9 @@ use crate::with_js_error; use dpp::dashcore::{consensus, InstantLock, Transaction}; use crate::identity::IdentityWasm; +use dpp::fee::Credits; use dpp::identity::core_script::CoreScript; -use dpp::prelude::Revision; +use dpp::prelude::{IdentityNonce, Revision}; use dpp::withdrawal::Pooling; use dpp::NonConsensusError; use serde::Deserialize; @@ -207,7 +208,7 @@ impl IdentityFacadeWasm { core_fee_per_byte: u32, pooling: u8, output_script: Vec, - revision: u64, + identity_nonce: u64, ) -> Result { let pooling = match pooling { 0 => Pooling::Never, @@ -223,7 +224,7 @@ impl IdentityFacadeWasm { core_fee_per_byte, pooling, CoreScript::from_bytes(output_script), - revision as Revision, + identity_nonce as IdentityNonce, ) .map(Into::into) .with_js_error() @@ -235,12 +236,14 @@ impl IdentityFacadeWasm { identity: &IdentityWasm, recipient_id: &IdentifierWrapper, amount: u64, + identity_nonce: u64, ) -> Result { self.0 .create_identity_credit_transfer_transition( identity.inner(), recipient_id.to_owned().into(), amount, + identity_nonce, ) .map(Into::into) .with_js_error() @@ -250,6 +253,7 @@ impl IdentityFacadeWasm { pub fn create_identity_update_transition( &self, identity: &IdentityWasm, + identity_nonce: u64, public_keys: &JsValue, ) -> Result { let (add_public_keys, disable_public_keys) = @@ -259,6 +263,7 @@ impl IdentityFacadeWasm { self.0 .create_identity_update_transition( identity.to_owned().into(), + identity_nonce, add_public_keys, disable_public_keys, Some(now), diff --git a/packages/wasm-dpp/src/identity/identity_factory.rs b/packages/wasm-dpp/src/identity/identity_factory.rs index 150c473c6a..4a0aea0683 100644 --- a/packages/wasm-dpp/src/identity/identity_factory.rs +++ b/packages/wasm-dpp/src/identity/identity_factory.rs @@ -18,7 +18,7 @@ use crate::{ }; use dpp::dashcore::{consensus, InstantLock, Transaction}; -use dpp::prelude::{Identity, Revision}; +use dpp::prelude::{Identity, IdentityNonce, Revision}; use serde::Deserialize; use std::convert::TryInto; @@ -190,12 +190,14 @@ impl IdentityFactoryWasm { identity: &IdentityWasm, recipient_id: &IdentifierWrapper, amount: u64, + identity_nonce: u64, ) -> Result { self.0 .create_identity_credit_transfer_transition( identity.inner(), recipient_id.to_owned().into(), amount, + identity_nonce, ) .map(Into::into) .with_js_error() @@ -209,7 +211,7 @@ impl IdentityFactoryWasm { core_fee_per_byte: u32, pooling: u8, output_script: Vec, - revision: u64, + identity_nonce: u64, ) -> Result { let pooling = match pooling { 0 => Pooling::Never, @@ -225,7 +227,7 @@ impl IdentityFactoryWasm { core_fee_per_byte, pooling, CoreScript::from_bytes(output_script), - revision as Revision, + identity_nonce as IdentityNonce, ) .map(Into::into) .with_js_error() @@ -235,6 +237,7 @@ impl IdentityFactoryWasm { pub fn create_identity_update_transition( &self, identity: &IdentityWasm, + identity_nonce: u64, public_keys: &JsValue, ) -> Result { let (add_public_keys, disable_public_keys) = @@ -245,6 +248,7 @@ impl IdentityFactoryWasm { self.0 .create_identity_update_transition( identity.to_owned().into(), + identity_nonce, add_public_keys, disable_public_keys, Some(now), diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/to_object.rs b/packages/wasm-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/to_object.rs index b94fd8a8d2..0135bcbb91 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/to_object.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/to_object.rs @@ -1,7 +1,7 @@ use dpp::identity::KeyID; use dpp::identity::core_script::CoreScript; -use dpp::prelude::Revision; +use dpp::prelude::{IdentityNonce, Revision}; use dpp::state_transition::identity_credit_withdrawal_transition::accessors::IdentityCreditWithdrawalTransitionAccessorsV0; use dpp::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition; use dpp::state_transition::StateTransitionIdentitySigned; @@ -24,7 +24,7 @@ pub struct ToObject { pub core_fee_per_byte: u32, pub pooling: Pooling, pub output_script: CoreScript, - pub revision: Revision, + pub nonce: IdentityNonce, pub signature: Option>, pub signature_public_key_id: Option, } @@ -40,7 +40,7 @@ pub fn to_object_struct( core_fee_per_byte: transition.core_fee_per_byte(), pooling: transition.pooling(), output_script: transition.output_script(), - revision: transition.revision(), + nonce: transition.nonce(), ..ToObject::default() }; diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/transition.rs b/packages/wasm-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/transition.rs index b823f39cda..915de97d49 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/transition.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/transition.rs @@ -124,14 +124,14 @@ impl IdentityCreditWithdrawalTransitionWasm { .set_output_script(CoreScript::from_bytes(output_script)); } - #[wasm_bindgen(js_name=getRevision)] - pub fn get_revision(&self) -> u64 { - self.0.revision() as u64 + #[wasm_bindgen(js_name=getNonce)] + pub fn get_nonce(&self) -> u64 { + self.0.nonce() as u64 } - #[wasm_bindgen(js_name=setRevision)] - pub fn set_revision(&mut self, revision: u64) { - self.0.set_revision(revision); + #[wasm_bindgen(js_name=setNonce)] + pub fn set_nonce(&mut self, revision: u64) { + self.0.set_nonce(revision); } #[wasm_bindgen(js_name=toObject)] @@ -214,8 +214,8 @@ impl IdentityCreditWithdrawalTransitionWasm { js_sys::Reflect::set( &js_object, - &"revision".to_owned().into(), - &JsValue::from(object.revision), + &"nonce".to_owned().into(), + &JsValue::from(object.nonce), )?; Ok(js_object.into()) @@ -310,8 +310,8 @@ impl IdentityCreditWithdrawalTransitionWasm { js_sys::Reflect::set( &js_object, - &"revision".to_owned().into(), - &JsValue::from(&format!("{}", object.revision)), + &"nonce".to_owned().into(), + &JsValue::from(&format!("{}", object.nonce)), )?; Ok(js_object.into()) diff --git a/packages/wasm-dpp/test/integration/dataContract/DataContractFacade.spec.js b/packages/wasm-dpp/test/integration/dataContract/DataContractFacade.spec.js index 961ade24b2..5c469b4463 100644 --- a/packages/wasm-dpp/test/integration/dataContract/DataContractFacade.spec.js +++ b/packages/wasm-dpp/test/integration/dataContract/DataContractFacade.spec.js @@ -101,7 +101,8 @@ describe('DataContractFacade', () => { updatedDataContract.incrementVersion(); const dataContractUpdateTransition = dpp.dataContract - .createDataContractUpdateTransition(updatedDataContract); + // eslint-disable-next-line + .createDataContractUpdateTransition(updatedDataContract, BigInt(1)); const { identityPublicKey, privateKey } = await getPrivateAndPublicKeyForSigningFixture(); diff --git a/packages/wasm-dpp/test/integration/document/DocumentFacade.spec.js b/packages/wasm-dpp/test/integration/document/DocumentFacade.spec.js index bef3cd71e9..1fccf76acd 100644 --- a/packages/wasm-dpp/test/integration/document/DocumentFacade.spec.js +++ b/packages/wasm-dpp/test/integration/document/DocumentFacade.spec.js @@ -96,8 +96,15 @@ describe('DocumentFacade', () => { describe('createStateTransition', () => { it('should create DocumentsBatchTransition with passed documents - Rust', () => { + const identityId = documents[0].getOwnerId(); + const contractId = documents[0].getDataContractId(); + const result = dpp.document.createStateTransition({ create: documents, + }, { + [identityId.toString()]: { + [contractId.toString()]: 1, + }, }); expect(result).to.be.instanceOf(DocumentsBatchTransition); diff --git a/packages/wasm-dpp/test/integration/identity/IdentityFacade.spec.js b/packages/wasm-dpp/test/integration/identity/IdentityFacade.spec.js index fb1db63134..5d935cac68 100644 --- a/packages/wasm-dpp/test/integration/identity/IdentityFacade.spec.js +++ b/packages/wasm-dpp/test/integration/identity/IdentityFacade.spec.js @@ -177,6 +177,8 @@ describe('IdentityFacade', () => { const stateTransition = dpp.identity .createIdentityUpdateTransition( identity, + // eslint-disable-next-line + BigInt(1), publicKeys, ); @@ -204,7 +206,7 @@ describe('IdentityFacade', () => { stateTransitionFixture.getCoreFeePerByte(), stateTransitionFixture.getPooling(), stateTransitionFixture.getOutputScript(), - stateTransitionFixture.getRevision(), + stateTransitionFixture.getNonce(), ); expect(stateTransition.toObject()) diff --git a/packages/wasm-dpp/test/integration/stateTransition/StateTransitionFacade.spec.js b/packages/wasm-dpp/test/integration/stateTransition/StateTransitionFacade.spec.js index 9873a5633a..d155a4b742 100644 --- a/packages/wasm-dpp/test/integration/stateTransition/StateTransitionFacade.spec.js +++ b/packages/wasm-dpp/test/integration/stateTransition/StateTransitionFacade.spec.js @@ -97,8 +97,13 @@ describe('StateTransitionFacade', () => { identityPublicKey.setPurpose(IdentityPublicKey.PURPOSES.AUTHENTICATION); identityPublicKey.setReadOnly(false); + const documents = await getDocumentsFixture(dataContract); documentsBatchTransition = documentFactory.createStateTransition({ - create: await getDocumentsFixture(dataContract), + create: documents, + }, { + [documents[0].getOwnerId().toString()]: { + [documents[0].getDataContractId().toString()]: 0, + }, }); await documentsBatchTransition.sign(identityPublicKey, privateKey); diff --git a/packages/wasm-dpp/test/unit/dataContract/stateTransition/DataContractUpdateTransition/DataContractUpdateTransition.spec.js b/packages/wasm-dpp/test/unit/dataContract/stateTransition/DataContractUpdateTransition/DataContractUpdateTransition.spec.js index 7c455ec404..074e375d90 100644 --- a/packages/wasm-dpp/test/unit/dataContract/stateTransition/DataContractUpdateTransition/DataContractUpdateTransition.spec.js +++ b/packages/wasm-dpp/test/unit/dataContract/stateTransition/DataContractUpdateTransition/DataContractUpdateTransition.spec.js @@ -20,6 +20,7 @@ describe('DataContractUpdateTransition', () => { stateTransition = new DataContractUpdateTransition({ protocolVersion: 1, dataContract: dataContract.toObject(), + identityContractNonce: 1, }); }); @@ -64,7 +65,7 @@ describe('DataContractUpdateTransition', () => { it('should return serialized State Transition', () => { const result = stateTransition.toBuffer(); expect(result).to.be.instanceOf(Buffer); - expect(result).to.have.lengthOf(2356); + expect(result).to.have.lengthOf(2357); }); it('should be able to restore contract config from bytes', () => { diff --git a/packages/wasm-dpp/test/unit/document/DocumentFactory.spec.js b/packages/wasm-dpp/test/unit/document/DocumentFactory.spec.js index ce348958b0..fa74dfd88f 100644 --- a/packages/wasm-dpp/test/unit/document/DocumentFactory.spec.js +++ b/packages/wasm-dpp/test/unit/document/DocumentFactory.spec.js @@ -233,7 +233,7 @@ describe('DocumentFactory', () => { try { factory.createStateTransition({ unknown: documents, - }); + }, {}); expect.fail('Error was not thrown'); } catch (e) { @@ -245,7 +245,7 @@ describe('DocumentFactory', () => { it('should throw and error if no documents were supplied', async () => { try { - factory.createStateTransition({}); + factory.createStateTransition({}, {}); expect.fail('Error was not thrown'); } catch (e) { expect(e).to.be.an.instanceOf(NoDocumentsSuppliedError); @@ -287,9 +287,15 @@ describe('DocumentFactory', () => { const [newDocument] = await getDocumentsFixture(dataContract); newDocument.setData({ lastName: 'Keck' }); + const identityId = newDocument.getOwnerId(); + const stateTransition = factory.createStateTransition({ create: documents, replace: [newDocument], + }, { + [identityId.toString()]: { + [dataContract.getId().toString()]: 1, + }, }); const replaceDocuments = stateTransition.getTransitions() diff --git a/packages/wasm-dpp/test/unit/identity/IdentityFactory.spec.js b/packages/wasm-dpp/test/unit/identity/IdentityFactory.spec.js index cc431e205a..be6722652a 100644 --- a/packages/wasm-dpp/test/unit/identity/IdentityFactory.spec.js +++ b/packages/wasm-dpp/test/unit/identity/IdentityFactory.spec.js @@ -236,6 +236,8 @@ describe('IdentityFactory', () => { const stateTransition = factory .createIdentityUpdateTransition( identity, + // eslint-disable-next-line + BigInt(1), { add: addPublicKeys, disable: disablePublicKeys, @@ -262,7 +264,7 @@ describe('IdentityFactory', () => { stateTransitionFixture.getCoreFeePerByte(), stateTransitionFixture.getPooling(), stateTransitionFixture.getOutputScript(), - stateTransitionFixture.getRevision(), + stateTransitionFixture.getNonce(), ); expect(stateTransition.toObject()) diff --git a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreditWithdrawalTransition/IdentityCreditWithdrawalTransition.spec.js b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreditWithdrawalTransition/IdentityCreditWithdrawalTransition.spec.js index 76e6a8d32f..b80c611116 100644 --- a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreditWithdrawalTransition/IdentityCreditWithdrawalTransition.spec.js +++ b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreditWithdrawalTransition/IdentityCreditWithdrawalTransition.spec.js @@ -62,10 +62,10 @@ describe('IdentityCreditWithdrawalTransition', () => { }); }); - describe('#getRevision', () => { + describe('#getNonce', () => { it('should return revision', () => { - expect(stateTransition.getRevision()).to.be.equal( - rawStateTransition.revision, + expect(stateTransition.getNonce()).to.be.equal( + rawStateTransition.nonce, ); }); }); @@ -82,7 +82,7 @@ describe('IdentityCreditWithdrawalTransition', () => { coreFeePerByte: stateTransition.getCoreFeePerByte(), pooling: stateTransition.getPooling(), outputScript: stateTransition.getOutputScript(), - revision: stateTransition.getRevision(), + nonce: stateTransition.getNonce(), signature: undefined, signaturePublicKeyId: undefined, }); @@ -99,7 +99,7 @@ describe('IdentityCreditWithdrawalTransition', () => { coreFeePerByte: stateTransition.getCoreFeePerByte(), pooling: stateTransition.getPooling(), outputScript: stateTransition.getOutputScript(), - revision: stateTransition.getRevision(), + nonce: stateTransition.getNonce(), }); }); }); @@ -116,7 +116,7 @@ describe('IdentityCreditWithdrawalTransition', () => { coreFeePerByte: stateTransition.getCoreFeePerByte(), pooling: stateTransition.getPooling(), outputScript: stateTransition.getOutputScript().toString('base64'), - revision: stateTransition.getRevision().toString(), + nonce: stateTransition.getNonce().toString(), signature: undefined, signaturePublicKeyId: undefined, }); diff --git a/scripts/configure_dotenv.sh b/scripts/configure_dotenv.sh index f5f6fa4636..b79578c6bd 100755 --- a/scripts/configure_dotenv.sh +++ b/scripts/configure_dotenv.sh @@ -8,7 +8,7 @@ PROJECT_ROOT_PATH=$(dirname "$SCRIPT_DIRECTORY_PATH") PACKAGES_PATH="$PROJECT_ROOT_PATH/packages" LOGS_PATH="$PROJECT_ROOT_PATH/logs" -CONFIG=local +CONFIG=local_seed DAPI_PATH="${PACKAGES_PATH}"/dapi DRIVE_PATH="${PACKAGES_PATH}"/rs-drive-abci SDK_PATH="${PACKAGES_PATH}"/js-dash-sdk @@ -23,7 +23,7 @@ WALLET_LIB_PATH="${PACKAGES_PATH}"/wallet-lib # get_config core.rpc.port function get_config() { # We use `jq` because it's much faster than `yarn dashmate config get` - jq ".configs.${CONFIG}_1.$1" <"${HOME}"/.dashmate/config.json + jq ".configs.${CONFIG}.$1" <"${HOME}"/.dashmate/config.json } touch "${LOGS_PATH}"/mint.log From acce68d6ec37a3f476ed227832af03e8d88f398f Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Tue, 20 Feb 2024 22:35:58 +0700 Subject: [PATCH 039/191] chore: bump to version 1.0.0 dev 5 (#1704) --- CHANGELOG.md | 26 +++++++++++ Cargo.lock | 46 +++++++++---------- package.json | 2 +- packages/bench-suite/package.json | 2 +- packages/dapi-grpc/Cargo.toml | 2 +- packages/dapi-grpc/package.json | 2 +- packages/dapi/package.json | 2 +- packages/dash-spv/package.json | 2 +- packages/dashmate/package.json | 2 +- packages/dashpay-contract/Cargo.toml | 2 +- packages/dashpay-contract/package.json | 2 +- packages/data-contracts/Cargo.toml | 2 +- packages/dpns-contract/Cargo.toml | 2 +- packages/dpns-contract/package.json | 2 +- packages/feature-flags-contract/Cargo.toml | 2 +- packages/feature-flags-contract/package.json | 2 +- packages/js-dapi-client/package.json | 2 +- packages/js-dash-sdk/package.json | 2 +- packages/js-grpc-common/package.json | 2 +- .../Cargo.toml | 2 +- .../package.json | 2 +- packages/platform-test-suite/package.json | 2 +- packages/rs-dapi-client/Cargo.toml | 2 +- packages/rs-dapi-grpc-macros/Cargo.toml | 2 +- packages/rs-dpp/Cargo.toml | 2 +- packages/rs-drive-abci/Cargo.toml | 2 +- packages/rs-drive-proof-verifier/Cargo.toml | 2 +- packages/rs-drive/Cargo.toml | 2 +- .../Cargo.toml | 2 +- packages/rs-platform-serialization/Cargo.toml | 2 +- .../rs-platform-value-convertible/Cargo.toml | 2 +- packages/rs-platform-value/Cargo.toml | 2 +- packages/rs-platform-version/Cargo.toml | 2 +- packages/rs-platform-versioning/Cargo.toml | 2 +- packages/rs-sdk/Cargo.toml | 2 +- packages/simple-signer/Cargo.toml | 2 +- packages/strategy-tests/Cargo.toml | 2 +- packages/wallet-lib/package.json | 2 +- packages/wasm-dpp/Cargo.toml | 2 +- packages/wasm-dpp/package.json | 2 +- packages/withdrawals-contract/Cargo.toml | 2 +- packages/withdrawals-contract/package.json | 2 +- 42 files changed, 89 insertions(+), 63 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e478496b54..c0f6799a1c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,29 @@ +## [1.0.0-dev.5](https://github.com/dashpay/platform/compare/v1.0.0-dev.4...v1.0.0-dev.5) (2024-02-20) + +### ⚠ BREAKING CHANGES + +* Identity nonce and identity contract nonces to prevent replay attacks (#1681) +* Improved check tx verification (#1681) +* Do not allow creating data contracts without documents (#1675) + +### Features + +* State transitions support in rust sdk (#1596) +* Mempool uniqueness by state transition identifiers (#1681) +* Remove ability to verify proofs from drive-abci in order to have a smaller package size and to reduce potential issues (#1699) +* Tenderdash mempool cache size config option (#1702) + +### Bug Fixes + +* Remove min core fee per byte check (#1690) +* Fix proof balance and revision proofs for IdentityTopUp (#1678) +* NPM IP package vulnerable to SSRF attacks (#1703) +* Fix for contract proofs (#1699) + +### Miscellaneous Chores +* Autogenerated clippy refactoring and fixes for rust version 1.76 (#1691) +* Bump protoc to 25.2 (#1692) + ## [1.0.0-dev.4](https://github.com/dashpay/platform/compare/v1.0.0-dev.3...v1.0.0-dev.4) (2024-02-07) diff --git a/Cargo.lock b/Cargo.lock index d04bdd0f5e..89e4c3f3f1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -953,7 +953,7 @@ dependencies = [ [[package]] name = "dapi-grpc" -version = "1.0.0-dev.4" +version = "1.0.0-dev.5" dependencies = [ "dapi-grpc-macros", "platform-version", @@ -968,7 +968,7 @@ dependencies = [ [[package]] name = "dapi-grpc-macros" -version = "1.0.0-dev.4" +version = "1.0.0-dev.5" dependencies = [ "dapi-grpc", "heck", @@ -1074,7 +1074,7 @@ dependencies = [ [[package]] name = "dashpay-contract" -version = "1.0.0-dev.4" +version = "1.0.0-dev.5" dependencies = [ "platform-value", "platform-version", @@ -1084,7 +1084,7 @@ dependencies = [ [[package]] name = "data-contracts" -version = "1.0.0-dev.4" +version = "1.0.0-dev.5" dependencies = [ "dashpay-contract", "dpns-contract", @@ -1177,7 +1177,7 @@ checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" [[package]] name = "dpns-contract" -version = "1.0.0-dev.4" +version = "1.0.0-dev.5" dependencies = [ "platform-value", "platform-version", @@ -1187,7 +1187,7 @@ dependencies = [ [[package]] name = "dpp" -version = "1.0.0-dev.4" +version = "1.0.0-dev.5" dependencies = [ "anyhow", "async-trait", @@ -1238,7 +1238,7 @@ dependencies = [ [[package]] name = "drive" -version = "1.0.0-dev.4" +version = "1.0.0-dev.5" dependencies = [ "anyhow", "base64 0.21.7", @@ -1273,7 +1273,7 @@ dependencies = [ [[package]] name = "drive-abci" -version = "1.0.0-dev.4" +version = "1.0.0-dev.5" dependencies = [ "atty", "base64 0.20.0", @@ -1326,7 +1326,7 @@ dependencies = [ [[package]] name = "drive-proof-verifier" -version = "1.0.0-dev.4" +version = "1.0.0-dev.5" dependencies = [ "dapi-grpc", "dpp", @@ -1526,7 +1526,7 @@ checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" [[package]] name = "feature-flags-contract" -version = "1.0.0-dev.4" +version = "1.0.0-dev.5" dependencies = [ "platform-value", "platform-version", @@ -2398,7 +2398,7 @@ dependencies = [ [[package]] name = "masternode-reward-shares-contract" -version = "1.0.0-dev.4" +version = "1.0.0-dev.5" dependencies = [ "platform-value", "platform-version", @@ -2875,7 +2875,7 @@ checksum = "2900ede94e305130c13ddd391e0ab7cbaeb783945ae07a279c268cb05109c6cb" [[package]] name = "platform-serialization" -version = "1.0.0-dev.4" +version = "1.0.0-dev.5" dependencies = [ "bincode 2.0.0-rc.3", "platform-version", @@ -2883,7 +2883,7 @@ dependencies = [ [[package]] name = "platform-serialization-derive" -version = "1.0.0-dev.4" +version = "1.0.0-dev.5" dependencies = [ "proc-macro2", "quote", @@ -2893,7 +2893,7 @@ dependencies = [ [[package]] name = "platform-value" -version = "1.0.0-dev.4" +version = "1.0.0-dev.5" dependencies = [ "base64 0.13.1", "bincode 2.0.0-rc.3", @@ -2914,7 +2914,7 @@ dependencies = [ [[package]] name = "platform-value-convertible" -version = "1.0.0-dev.4" +version = "1.0.0-dev.5" dependencies = [ "quote", "syn 2.0.48", @@ -2922,14 +2922,14 @@ dependencies = [ [[package]] name = "platform-version" -version = "1.0.0-dev.4" +version = "1.0.0-dev.5" dependencies = [ "thiserror", ] [[package]] name = "platform-versioning" -version = "1.0.0-dev.4" +version = "1.0.0-dev.5" dependencies = [ "proc-macro2", "quote", @@ -3471,7 +3471,7 @@ dependencies = [ [[package]] name = "rs-dapi-client" -version = "1.0.0-dev.4" +version = "1.0.0-dev.5" dependencies = [ "backon", "chrono", @@ -3488,7 +3488,7 @@ dependencies = [ [[package]] name = "rs-sdk" -version = "1.0.0-dev.4" +version = "1.0.0-dev.5" dependencies = [ "async-trait", "base64 0.21.7", @@ -3942,7 +3942,7 @@ checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" [[package]] name = "simple-signer" -version = "1.0.0-dev.4" +version = "1.0.0-dev.5" dependencies = [ "anyhow", "bincode 2.0.0-rc.3", @@ -4033,7 +4033,7 @@ dependencies = [ [[package]] name = "strategy-tests" -version = "1.0.0-dev.4" +version = "1.0.0-dev.5" dependencies = [ "bincode 2.0.0-rc.3", "dpp", @@ -4940,7 +4940,7 @@ checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93" [[package]] name = "wasm-dpp" -version = "1.0.0-dev.4" +version = "1.0.0-dev.5" dependencies = [ "anyhow", "async-trait", @@ -5182,7 +5182,7 @@ dependencies = [ [[package]] name = "withdrawals-contract" -version = "1.0.0-dev.4" +version = "1.0.0-dev.5" dependencies = [ "num_enum", "platform-value", diff --git a/package.json b/package.json index 5e84dd100a..bafd12840e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/platform", - "version": "1.0.0-dev.4", + "version": "1.0.0-dev.5", "private": true, "scripts": { "setup": "yarn install && yarn run build && yarn run configure", diff --git a/packages/bench-suite/package.json b/packages/bench-suite/package.json index 16994bc682..5aef8856e4 100644 --- a/packages/bench-suite/package.json +++ b/packages/bench-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/bench-suite", "private": true, - "version": "1.0.0-dev.4", + "version": "1.0.0-dev.5", "description": "Dash Platform benchmark tool", "scripts": { "bench": "node ./bin/bench.js", diff --git a/packages/dapi-grpc/Cargo.toml b/packages/dapi-grpc/Cargo.toml index fd9c07d0eb..69c11c653f 100644 --- a/packages/dapi-grpc/Cargo.toml +++ b/packages/dapi-grpc/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc" description = "GRPC client for Dash Platform" -version = "1.0.0-dev.4" +version = "1.0.0-dev.5" authors = [ "Samuel Westrich ", "Igor Markin ", diff --git a/packages/dapi-grpc/package.json b/packages/dapi-grpc/package.json index a91238d420..c9fbaa230d 100644 --- a/packages/dapi-grpc/package.json +++ b/packages/dapi-grpc/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-grpc", - "version": "1.0.0-dev.4", + "version": "1.0.0-dev.5", "description": "DAPI GRPC definition file and generated clients", "browser": "browser.js", "main": "node.js", diff --git a/packages/dapi/package.json b/packages/dapi/package.json index 19a13b5bb7..d96c85b2fa 100644 --- a/packages/dapi/package.json +++ b/packages/dapi/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/dapi", "private": true, - "version": "1.0.0-dev.4", + "version": "1.0.0-dev.5", "description": "A decentralized API for the Dash network", "scripts": { "api": "node scripts/api.js", diff --git a/packages/dash-spv/package.json b/packages/dash-spv/package.json index aa7fcf9079..609134df08 100644 --- a/packages/dash-spv/package.json +++ b/packages/dash-spv/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dash-spv", - "version": "1.0.0-dev.4", + "version": "1.0.0-dev.5", "description": "Repository containing SPV functions used by @dashevo", "main": "index.js", "scripts": { diff --git a/packages/dashmate/package.json b/packages/dashmate/package.json index a9f8dc2949..edc881890c 100644 --- a/packages/dashmate/package.json +++ b/packages/dashmate/package.json @@ -1,6 +1,6 @@ { "name": "dashmate", - "version": "1.0.0-dev.4", + "version": "1.0.0-dev.5", "description": "Distribution package for Dash node installation", "scripts": { "lint": "eslint .", diff --git a/packages/dashpay-contract/Cargo.toml b/packages/dashpay-contract/Cargo.toml index 2403a1eb23..7a26323326 100644 --- a/packages/dashpay-contract/Cargo.toml +++ b/packages/dashpay-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dashpay-contract" description = "DashPay data contract schema and tools" -version = "1.0.0-dev.4" +version = "1.0.0-dev.5" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/dashpay-contract/package.json b/packages/dashpay-contract/package.json index ba77b6aa86..930967226b 100644 --- a/packages/dashpay-contract/package.json +++ b/packages/dashpay-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dashpay-contract", - "version": "1.0.0-dev.4", + "version": "1.0.0-dev.5", "description": "Reference contract of the DashPay DPA on Dash Evolution", "scripts": { "lint": "eslint .", diff --git a/packages/data-contracts/Cargo.toml b/packages/data-contracts/Cargo.toml index eece64000c..c8ce7c4f14 100644 --- a/packages/data-contracts/Cargo.toml +++ b/packages/data-contracts/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "data-contracts" description = "Dash Platform system data contracts" -version = "1.0.0-dev.4" +version = "1.0.0-dev.5" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/dpns-contract/Cargo.toml b/packages/dpns-contract/Cargo.toml index 2c961e05c2..6345a8f79d 100644 --- a/packages/dpns-contract/Cargo.toml +++ b/packages/dpns-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dpns-contract" description = "DPNS data contract schema and tools" -version = "1.0.0-dev.4" +version = "1.0.0-dev.5" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/dpns-contract/package.json b/packages/dpns-contract/package.json index 94fb795b02..a757fceaf9 100644 --- a/packages/dpns-contract/package.json +++ b/packages/dpns-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dpns-contract", - "version": "1.0.0-dev.4", + "version": "1.0.0-dev.5", "description": "A contract and helper scripts for DPNS DApp", "scripts": { "lint": "eslint .", diff --git a/packages/feature-flags-contract/Cargo.toml b/packages/feature-flags-contract/Cargo.toml index e4f30d4225..ba24b017d3 100644 --- a/packages/feature-flags-contract/Cargo.toml +++ b/packages/feature-flags-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "feature-flags-contract" description = "Feature flags data contract schema and tools" -version = "1.0.0-dev.4" +version = "1.0.0-dev.5" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/feature-flags-contract/package.json b/packages/feature-flags-contract/package.json index 4bf437752c..a968ed3381 100644 --- a/packages/feature-flags-contract/package.json +++ b/packages/feature-flags-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/feature-flags-contract", - "version": "1.0.0-dev.4", + "version": "1.0.0-dev.5", "description": "Data Contract to store Dash Platform feature flags", "scripts": { "build": "", diff --git a/packages/js-dapi-client/package.json b/packages/js-dapi-client/package.json index cc68c54f08..9a9e0374a3 100644 --- a/packages/js-dapi-client/package.json +++ b/packages/js-dapi-client/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-client", - "version": "1.0.0-dev.4", + "version": "1.0.0-dev.5", "description": "Client library used to access Dash DAPI endpoints", "main": "lib/index.js", "contributors": [ diff --git a/packages/js-dash-sdk/package.json b/packages/js-dash-sdk/package.json index 684b53dd26..95a6be5ea9 100644 --- a/packages/js-dash-sdk/package.json +++ b/packages/js-dash-sdk/package.json @@ -1,6 +1,6 @@ { "name": "dash", - "version": "4.0.0-dev.4", + "version": "4.0.0-dev.5", "description": "Dash library for JavaScript/TypeScript ecosystem (Wallet, DAPI, Primitives, BLS, ...)", "main": "build/index.js", "unpkg": "dist/dash.min.js", diff --git a/packages/js-grpc-common/package.json b/packages/js-grpc-common/package.json index b8e0b2f166..bf584c8106 100644 --- a/packages/js-grpc-common/package.json +++ b/packages/js-grpc-common/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/grpc-common", - "version": "1.0.0-dev.4", + "version": "1.0.0-dev.5", "description": "Common GRPC library", "main": "index.js", "scripts": { diff --git a/packages/masternode-reward-shares-contract/Cargo.toml b/packages/masternode-reward-shares-contract/Cargo.toml index 35dbf45f57..f323e75ea3 100644 --- a/packages/masternode-reward-shares-contract/Cargo.toml +++ b/packages/masternode-reward-shares-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "masternode-reward-shares-contract" description = "Masternode reward shares data contract schema and tools" -version = "1.0.0-dev.4" +version = "1.0.0-dev.5" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/masternode-reward-shares-contract/package.json b/packages/masternode-reward-shares-contract/package.json index 0cf2f4f2bb..6af8c4797d 100644 --- a/packages/masternode-reward-shares-contract/package.json +++ b/packages/masternode-reward-shares-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/masternode-reward-shares-contract", - "version": "1.0.0-dev.4", + "version": "1.0.0-dev.5", "description": "A contract and helper scripts for reward sharing", "scripts": { "lint": "eslint .", diff --git a/packages/platform-test-suite/package.json b/packages/platform-test-suite/package.json index 85c0994a22..580770785d 100644 --- a/packages/platform-test-suite/package.json +++ b/packages/platform-test-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/platform-test-suite", "private": true, - "version": "1.0.0-dev.4", + "version": "1.0.0-dev.5", "description": "Dash Network end-to-end tests", "scripts": { "test": "yarn exec bin/test.sh", diff --git a/packages/rs-dapi-client/Cargo.toml b/packages/rs-dapi-client/Cargo.toml index f479f4cd95..a2ee079345 100644 --- a/packages/rs-dapi-client/Cargo.toml +++ b/packages/rs-dapi-client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rs-dapi-client" -version = "1.0.0-dev.4" +version = "1.0.0-dev.5" edition = "2021" [features] diff --git a/packages/rs-dapi-grpc-macros/Cargo.toml b/packages/rs-dapi-grpc-macros/Cargo.toml index f6f00d3ed9..29a16aa050 100644 --- a/packages/rs-dapi-grpc-macros/Cargo.toml +++ b/packages/rs-dapi-grpc-macros/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc-macros" -version = "1.0.0-dev.4" +version = "1.0.0-dev.5" edition = "2021" description = "Macros used by dapi-grpc. Internal use only." diff --git a/packages/rs-dpp/Cargo.toml b/packages/rs-dpp/Cargo.toml index 1af846d2bc..ffb0690fef 100644 --- a/packages/rs-dpp/Cargo.toml +++ b/packages/rs-dpp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dpp" -version = "1.0.0-dev.4" +version = "1.0.0-dev.5" edition = "2021" rust-version = "1.73" authors = [ diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index 086ce85f8f..0520a7d4f8 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drive-abci" -version = "1.0.0-dev.4" +version = "1.0.0-dev.5" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/rs-drive-proof-verifier/Cargo.toml b/packages/rs-drive-proof-verifier/Cargo.toml index 43034e9a01..a5d07175d8 100644 --- a/packages/rs-drive-proof-verifier/Cargo.toml +++ b/packages/rs-drive-proof-verifier/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drive-proof-verifier" -version = "1.0.0-dev.4" +version = "1.0.0-dev.5" edition = "2021" rust-version = "1.73" diff --git a/packages/rs-drive/Cargo.toml b/packages/rs-drive/Cargo.toml index 4ef1ca8c89..61f5d56ea9 100644 --- a/packages/rs-drive/Cargo.toml +++ b/packages/rs-drive/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "drive" description = "Dash drive built on top of GroveDB" -version = "1.0.0-dev.4" +version = "1.0.0-dev.5" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/rs-platform-serialization-derive/Cargo.toml b/packages/rs-platform-serialization-derive/Cargo.toml index 34d654c532..f2c5256f7f 100644 --- a/packages/rs-platform-serialization-derive/Cargo.toml +++ b/packages/rs-platform-serialization-derive/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization-derive" authors = ["Samuel Westrich "] description = "Bincode serialization and deserialization derivations" -version = "1.0.0-dev.4" +version = "1.0.0-dev.5" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/rs-platform-serialization/Cargo.toml b/packages/rs-platform-serialization/Cargo.toml index 84b789941a..000e14a411 100644 --- a/packages/rs-platform-serialization/Cargo.toml +++ b/packages/rs-platform-serialization/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization" authors = ["Samuel Westrich "] description = "Bincode based serialization and deserialization" -version = "1.0.0-dev.4" +version = "1.0.0-dev.5" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/rs-platform-value-convertible/Cargo.toml b/packages/rs-platform-value-convertible/Cargo.toml index bb21c68874..6e9bc485db 100644 --- a/packages/rs-platform-value-convertible/Cargo.toml +++ b/packages/rs-platform-value-convertible/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-value-convertible" authors = ["Samuel Westrich "] description = "Convertion to and from platform values" -version = "1.0.0-dev.4" +version = "1.0.0-dev.5" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/rs-platform-value/Cargo.toml b/packages/rs-platform-value/Cargo.toml index d4cb4e1cc3..ce92f4b6e2 100644 --- a/packages/rs-platform-value/Cargo.toml +++ b/packages/rs-platform-value/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-value" authors = ["Samuel Westrich "] description = "A simple value module" -version = "1.0.0-dev.4" +version = "1.0.0-dev.5" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/rs-platform-version/Cargo.toml b/packages/rs-platform-version/Cargo.toml index 44635c8ba4..42666be4eb 100644 --- a/packages/rs-platform-version/Cargo.toml +++ b/packages/rs-platform-version/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-version" authors = ["Samuel Westrich "] description = "Bincode based serialization and deserialization" -version = "1.0.0-dev.4" +version = "1.0.0-dev.5" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/rs-platform-versioning/Cargo.toml b/packages/rs-platform-versioning/Cargo.toml index 0734256f3d..54bc14175e 100644 --- a/packages/rs-platform-versioning/Cargo.toml +++ b/packages/rs-platform-versioning/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-versioning" authors = ["Samuel Westrich "] description = "Version derivation" -version = "1.0.0-dev.4" +version = "1.0.0-dev.5" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/rs-sdk/Cargo.toml b/packages/rs-sdk/Cargo.toml index df526a355e..0a6339aae5 100644 --- a/packages/rs-sdk/Cargo.toml +++ b/packages/rs-sdk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rs-sdk" -version = "1.0.0-dev.4" +version = "1.0.0-dev.5" edition = "2021" [dependencies] diff --git a/packages/simple-signer/Cargo.toml b/packages/simple-signer/Cargo.toml index 209473d420..2dd6ed50f7 100644 --- a/packages/simple-signer/Cargo.toml +++ b/packages/simple-signer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "simple-signer" -version = "1.0.0-dev.4" +version = "1.0.0-dev.5" edition = "2021" rust-version = "1.73" diff --git a/packages/strategy-tests/Cargo.toml b/packages/strategy-tests/Cargo.toml index 8da86808a3..92be5c0c21 100644 --- a/packages/strategy-tests/Cargo.toml +++ b/packages/strategy-tests/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "strategy-tests" -version = "1.0.0-dev.4" +version = "1.0.0-dev.5" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/wallet-lib/package.json b/packages/wallet-lib/package.json index fcf337e6cb..99783b3452 100644 --- a/packages/wallet-lib/package.json +++ b/packages/wallet-lib/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wallet-lib", - "version": "8.0.0-dev.4", + "version": "8.0.0-dev.5", "description": "Light wallet library for Dash", "main": "src/index.js", "unpkg": "dist/wallet-lib.min.js", diff --git a/packages/wasm-dpp/Cargo.toml b/packages/wasm-dpp/Cargo.toml index 050aafcdcd..7d44d1c5d6 100644 --- a/packages/wasm-dpp/Cargo.toml +++ b/packages/wasm-dpp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasm-dpp" -version = "1.0.0-dev.4" +version = "1.0.0-dev.5" edition = "2021" rust-version = "1.73" authors = ["Anton Suprunchuk "] diff --git a/packages/wasm-dpp/package.json b/packages/wasm-dpp/package.json index b6af1827cc..28b1e149d8 100644 --- a/packages/wasm-dpp/package.json +++ b/packages/wasm-dpp/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wasm-dpp", - "version": "1.0.0-dev.4", + "version": "1.0.0-dev.5", "description": "The JavaScript implementation of the Dash Platform Protocol", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/withdrawals-contract/Cargo.toml b/packages/withdrawals-contract/Cargo.toml index 2d7d680b2d..8a35c84d32 100644 --- a/packages/withdrawals-contract/Cargo.toml +++ b/packages/withdrawals-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "withdrawals-contract" description = "Witdrawals data contract schema and tools" -version = "1.0.0-dev.4" +version = "1.0.0-dev.5" edition = "2021" rust-version = "1.73" license = "MIT" diff --git a/packages/withdrawals-contract/package.json b/packages/withdrawals-contract/package.json index 05604a7a3a..b513df1d0c 100644 --- a/packages/withdrawals-contract/package.json +++ b/packages/withdrawals-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/withdrawals-contract", - "version": "1.0.0-dev.4", + "version": "1.0.0-dev.5", "description": "Data Contract to manipulate and track withdrawals", "scripts": { "build": "", From 5b6fc20bfe3aaa6195a0d95ac09669c6743972b8 Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Thu, 22 Feb 2024 11:56:44 +0700 Subject: [PATCH 040/191] feat(sdk): fetch with metadata (#1707) --- packages/rs-drive-proof-verifier/src/proof.rs | 152 +++++++++++------- packages/rs-sdk/src/mock/sdk.rs | 32 ++++ packages/rs-sdk/src/platform/delegate.rs | 7 +- .../rs-sdk/src/platform/document_query.rs | 20 +-- packages/rs-sdk/src/platform/fetch.rs | 40 ++++- .../rs-sdk/src/platform/types/identity.rs | 2 +- packages/rs-sdk/src/sdk.rs | 26 ++- 7 files changed, 199 insertions(+), 80 deletions(-) diff --git a/packages/rs-drive-proof-verifier/src/proof.rs b/packages/rs-drive-proof-verifier/src/proof.rs index 82251a7442..e67cb8d893 100644 --- a/packages/rs-drive-proof-verifier/src/proof.rs +++ b/packages/rs-drive-proof-verifier/src/proof.rs @@ -10,7 +10,7 @@ use dapi_grpc::platform::v0::{ get_identity_contract_nonce_request, get_identity_keys_request, get_identity_nonce_request, get_identity_request, GetProtocolVersionUpgradeStateRequest, GetProtocolVersionUpgradeStateResponse, GetProtocolVersionUpgradeVoteStatusRequest, - GetProtocolVersionUpgradeVoteStatusResponse, + GetProtocolVersionUpgradeVoteStatusResponse, ResponseMetadata, }; use dapi_grpc::platform::{ v0::{self as platform, key_request_type, KeyRequestType as GrpcKeyType}, @@ -58,6 +58,7 @@ pub trait FromProof { type Request; /// Response type for which this trait is implemented. type Response; + /// Parse and verify the received proof and retrieve the requested object, if any. /// /// # Arguments @@ -68,7 +69,7 @@ pub trait FromProof { /// /// # Returns /// - /// * `Ok(Some(object))` when the requested object was found in the proof. + /// * `Ok(Some(object, metadata))` when the requested object was found in the proof. /// * `Ok(None)` when the requested object was not found in the proof; this can be interpreted as proof of non-existence. /// For collections, returns Ok(None) if none of the requested objects were found. /// * `Err(Error)` when either the provided data is invalid or proof validation failed. @@ -78,6 +79,33 @@ pub trait FromProof { platform_version: &PlatformVersion, provider: &'a dyn ContextProvider, ) -> Result, Error> + where + Self: Sized + 'a, + { + Self::maybe_from_proof_with_metadata(request, response, platform_version, provider) + .map(|maybe_result| maybe_result.0) + } + + /// Parse and verify the received proof and retrieve the requested object, if any. + /// + /// # Arguments + /// + /// * `request`: The request sent to the server. + /// * `response`: The response received from the server. + /// * `provider`: A callback implementing [ContextProvider] that provides quorum details required to verify the proof. + /// + /// # Returns + /// + /// * `Ok(Some((object, metadata)))` when the requested object was found in the proof. + /// * `Ok(None)` when the requested object was not found in the proof; this can be interpreted as proof of non-existence. + /// For collections, returns Ok(None) if none of the requested objects were found. + /// * `Err(Error)` when either the provided data is invalid or proof validation failed. + fn maybe_from_proof_with_metadata<'a, I: Into, O: Into>( + request: I, + response: O, + platform_version: &PlatformVersion, + provider: &'a dyn ContextProvider, + ) -> Result<(Option, ResponseMetadata), Error> where Self: Sized + 'a; @@ -117,12 +145,12 @@ impl FromProof for Identity { type Request = platform::GetIdentityRequest; type Response = platform::GetIdentityResponse; - fn maybe_from_proof<'a, I: Into, O: Into>( + fn maybe_from_proof_with_metadata<'a, I: Into, O: Into>( request: I, response: O, platform_version: &PlatformVersion, provider: &'a dyn ContextProvider, - ) -> Result, Error> + ) -> Result<(Option, ResponseMetadata), Error> where Identity: Sized + 'a, { @@ -155,7 +183,7 @@ impl FromProof for Identity { verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; - Ok(maybe_identity) + Ok((maybe_identity, mtd.clone())) } } @@ -164,13 +192,13 @@ impl FromProof for Identity { type Request = platform::GetIdentityByPublicKeyHashRequest; type Response = platform::GetIdentityByPublicKeyHashResponse; - fn maybe_from_proof<'a, I: Into, O: Into>( + fn maybe_from_proof_with_metadata<'a, I: Into, O: Into>( request: I, response: O, platform_version: &PlatformVersion, provider: &'a dyn ContextProvider, - ) -> Result, Error> + ) -> Result<(Option, ResponseMetadata), Error> where Identity: 'a, { @@ -205,7 +233,7 @@ impl FromProof for Identity { verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; - Ok(maybe_identity) + Ok((maybe_identity, mtd.clone())) } } @@ -213,13 +241,13 @@ impl FromProof for IdentityPublicKeys { type Request = platform::GetIdentityKeysRequest; type Response = platform::GetIdentityKeysResponse; - fn maybe_from_proof<'a, I: Into, O: Into>( + fn maybe_from_proof_with_metadata<'a, I: Into, O: Into>( request: I, response: O, platform_version: &PlatformVersion, provider: &'a dyn ContextProvider, - ) -> Result, Error> + ) -> Result<(Option, ResponseMetadata), Error> where IdentityPublicKeys: 'a, { @@ -316,7 +344,7 @@ impl FromProof for IdentityPublicKeys { verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; - Ok(maybe_keys) + Ok((maybe_keys, mtd.clone())) } } @@ -380,13 +408,13 @@ impl FromProof for IdentityNonceFetcher { type Request = platform::GetIdentityNonceRequest; type Response = platform::GetIdentityNonceResponse; - fn maybe_from_proof<'a, I: Into, O: Into>( + fn maybe_from_proof_with_metadata<'a, I: Into, O: Into>( request: I, response: O, platform_version: &PlatformVersion, provider: &'a dyn ContextProvider, - ) -> Result, Error> + ) -> Result<(Option, ResponseMetadata), Error> where IdentityNonceFetcher: 'a, { @@ -421,7 +449,7 @@ impl FromProof for IdentityNonceFetcher { verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; - Ok(maybe_nonce.map(types::IdentityNonceFetcher)) + Ok((maybe_nonce.map(types::IdentityNonceFetcher), mtd.clone())) } } @@ -429,13 +457,13 @@ impl FromProof for IdentityContractNo type Request = platform::GetIdentityContractNonceRequest; type Response = platform::GetIdentityContractNonceResponse; - fn maybe_from_proof<'a, I: Into, O: Into>( + fn maybe_from_proof_with_metadata<'a, I: Into, O: Into>( request: I, response: O, platform_version: &PlatformVersion, provider: &'a dyn ContextProvider, - ) -> Result, Error> + ) -> Result<(Option, ResponseMetadata), Error> where IdentityContractNonceFetcher: 'a, { @@ -474,7 +502,10 @@ impl FromProof for IdentityContractNo verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; - Ok(maybe_identity.map(types::IdentityContractNonceFetcher)) + Ok(( + maybe_identity.map(types::IdentityContractNonceFetcher), + mtd.clone(), + )) } } @@ -482,13 +513,13 @@ impl FromProof for IdentityBalance { type Request = platform::GetIdentityBalanceRequest; type Response = platform::GetIdentityBalanceResponse; - fn maybe_from_proof<'a, I: Into, O: Into>( + fn maybe_from_proof_with_metadata<'a, I: Into, O: Into>( request: I, response: O, platform_version: &PlatformVersion, provider: &'a dyn ContextProvider, - ) -> Result, Error> + ) -> Result<(Option, ResponseMetadata), Error> where IdentityBalance: 'a, { @@ -520,7 +551,7 @@ impl FromProof for IdentityBalance { verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; - Ok(maybe_identity) + Ok((maybe_identity, mtd.clone())) } } @@ -528,13 +559,13 @@ impl FromProof for IdentityBalan type Request = platform::GetIdentityBalanceAndRevisionRequest; type Response = platform::GetIdentityBalanceAndRevisionResponse; - fn maybe_from_proof<'a, I: Into, O: Into>( + fn maybe_from_proof_with_metadata<'a, I: Into, O: Into>( request: I, response: O, _platform_version: &PlatformVersion, provider: &'a dyn ContextProvider, - ) -> Result, Error> + ) -> Result<(Option, ResponseMetadata), Error> where IdentityBalanceAndRevision: 'a, { @@ -567,7 +598,7 @@ impl FromProof for IdentityBalan verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; - Ok(maybe_identity) + Ok((maybe_identity, mtd.clone())) } } @@ -575,13 +606,13 @@ impl FromProof for DataContract { type Request = platform::GetDataContractRequest; type Response = platform::GetDataContractResponse; - fn maybe_from_proof<'a, I: Into, O: Into>( + fn maybe_from_proof_with_metadata<'a, I: Into, O: Into>( request: I, response: O, platform_version: &PlatformVersion, provider: &'a dyn ContextProvider, - ) -> Result, Error> + ) -> Result<(Option, ResponseMetadata), Error> where DataContract: 'a, { @@ -616,7 +647,7 @@ impl FromProof for DataContract { verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; - Ok(maybe_contract) + Ok((maybe_contract, mtd.clone())) } } @@ -624,13 +655,13 @@ impl FromProof for DataContracts { type Request = platform::GetDataContractsRequest; type Response = platform::GetDataContractsResponse; - fn maybe_from_proof<'a, I: Into, O: Into>( + fn maybe_from_proof_with_metadata<'a, I: Into, O: Into>( request: I, response: O, platform_version: &PlatformVersion, provider: &'a dyn ContextProvider, - ) -> Result, Error> + ) -> Result<(Option, ResponseMetadata), Error> where DataContracts: 'a, { @@ -689,7 +720,7 @@ impl FromProof for DataContracts { None }; - Ok(maybe_contracts) + Ok((maybe_contracts, mtd.clone())) } } @@ -697,13 +728,13 @@ impl FromProof for DataContractHistory type Request = platform::GetDataContractHistoryRequest; type Response = platform::GetDataContractHistoryResponse; - fn maybe_from_proof<'a, I: Into, O: Into>( + fn maybe_from_proof_with_metadata<'a, I: Into, O: Into>( request: I, response: O, platform_version: &PlatformVersion, provider: &'a dyn ContextProvider, - ) -> Result, Error> + ) -> Result<(Option, ResponseMetadata), Error> where Self: Sized + 'a, { @@ -742,7 +773,7 @@ impl FromProof for DataContractHistory verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; - Ok(maybe_history) + Ok((maybe_history, mtd.clone())) } } @@ -750,12 +781,12 @@ impl FromProof for StateTransitionPro type Request = platform::BroadcastStateTransitionRequest; type Response = platform::WaitForStateTransitionResultResponse; - fn maybe_from_proof<'a, I: Into, O: Into>( + fn maybe_from_proof_with_metadata<'a, I: Into, O: Into>( request: I, response: O, platform_version: &PlatformVersion, provider: &'a dyn ContextProvider, - ) -> Result, Error> + ) -> Result<(Option, ResponseMetadata), Error> where Self: Sized + 'a, { @@ -791,7 +822,7 @@ impl FromProof for StateTransitionPro verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; - Ok(Some(result)) + Ok((Some(result), mtd.clone())) } } @@ -799,28 +830,32 @@ impl FromProof for ExtendedEpochInfo { type Request = platform::GetEpochsInfoRequest; type Response = platform::GetEpochsInfoResponse; - fn maybe_from_proof<'a, I: Into, O: Into>( + fn maybe_from_proof_with_metadata<'a, I: Into, O: Into>( request: I, response: O, platform_version: &PlatformVersion, provider: &'a dyn ContextProvider, - ) -> Result, Error> + ) -> Result<(Option, ResponseMetadata), Error> where Self: Sized + 'a, { - let epochs = - ExtendedEpochInfos::maybe_from_proof(request, response, platform_version, provider)?; + let epochs = ExtendedEpochInfos::maybe_from_proof_with_metadata( + request, + response, + platform_version, + provider, + )?; - if let Some(mut e) = epochs { + if let Some(mut e) = epochs.0 { if e.len() != 1 { return Err(Error::RequestDecodeError { error: format!("expected 1 epoch, got {}", e.len()), }); } let epoch = e.pop_first().and_then(|v| v.1); - Ok(epoch) + Ok((epoch, epochs.1)) } else { - Ok(None) + Ok((None, epochs.1)) } } } @@ -829,12 +864,12 @@ impl FromProof for ExtendedEpochInfos { type Request = platform::GetEpochsInfoRequest; type Response = platform::GetEpochsInfoResponse; - fn maybe_from_proof<'a, I: Into, O: Into>( + fn maybe_from_proof_with_metadata<'a, I: Into, O: Into>( request: I, response: O, platform_version: &PlatformVersion, provider: &'a dyn ContextProvider, - ) -> Result, Error> + ) -> Result<(Option, ResponseMetadata), Error> where Self: Sized + 'a, { @@ -889,7 +924,7 @@ impl FromProof for ExtendedEpochInfos { None }; - Ok(maybe_epoch_info) + Ok((maybe_epoch_info, mtd.clone())) } } @@ -904,12 +939,12 @@ impl FromProof for ProtocolVersionUpgrade type Request = GetProtocolVersionUpgradeStateRequest; type Response = GetProtocolVersionUpgradeStateResponse; - fn maybe_from_proof<'a, I: Into, O: Into>( + fn maybe_from_proof_with_metadata<'a, I: Into, O: Into>( _request: I, response: O, platform_version: &PlatformVersion, provider: &'a dyn ContextProvider, - ) -> Result, Error> + ) -> Result<(Option, ResponseMetadata), Error> where Self: Sized + 'a, { @@ -924,11 +959,12 @@ impl FromProof for ProtocolVersionUpgrade verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; if object.is_empty() { - return Ok(None); + return Ok((None, mtd.clone())); } - Ok(Some( - object.into_iter().map(|(k, v)| (k, Some(v))).collect(), + Ok(( + Some(object.into_iter().map(|(k, v)| (k, Some(v))).collect()), + mtd.clone(), )) } } @@ -937,12 +973,12 @@ impl FromProof for MasternodeProtoco type Request = GetProtocolVersionUpgradeVoteStatusRequest; type Response = GetProtocolVersionUpgradeVoteStatusResponse; - fn maybe_from_proof<'a, I: Into, O: Into>( + fn maybe_from_proof_with_metadata<'a, I: Into, O: Into>( request: I, response: O, platform_version: &PlatformVersion, provider: &'a dyn ContextProvider, - ) -> Result, Error> + ) -> Result<(Option, ResponseMetadata), Error> where Self: Sized + 'a, { @@ -978,7 +1014,7 @@ impl FromProof for MasternodeProtoco verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; if objects.is_empty() { - return Ok(None); + return Ok((None, mtd.clone())); } let votes: MasternodeProtocolVotes = objects .into_iter() @@ -999,7 +1035,7 @@ impl FromProof for MasternodeProtoco }) .collect::>()?; - Ok(Some(votes)) + Ok((Some(votes), mtd.clone())) } } // #[cfg_attr(feature = "mocks", mockall::automock)] @@ -1011,13 +1047,13 @@ where type Request = Q; type Response = platform::GetDocumentsResponse; - fn maybe_from_proof<'a, I: Into, O: Into>( + fn maybe_from_proof_with_metadata<'a, I: Into, O: Into>( request: I, response: O, platform_version: &PlatformVersion, provider: &'a dyn ContextProvider, - ) -> Result, Error> + ) -> Result<(Option, ResponseMetadata), Error> where Self: 'a, { @@ -1050,9 +1086,9 @@ where verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; if documents.is_empty() { - Ok(None) + Ok((None, mtd.clone())) } else { - Ok(Some(documents)) + Ok((Some(documents), mtd.clone())) } } } diff --git a/packages/rs-sdk/src/mock/sdk.rs b/packages/rs-sdk/src/mock/sdk.rs index bf94687e8a..b1d864e72e 100644 --- a/packages/rs-sdk/src/mock/sdk.rs +++ b/packages/rs-sdk/src/mock/sdk.rs @@ -1,6 +1,7 @@ //! Mocking mechanisms for Dash Platform SDK. //! //! See [MockDashPlatformSdk] for more details. +use dapi_grpc::platform::v0::ResponseMetadata; use dapi_grpc::{ mock::Mockable, platform::v0::{self as proto}, @@ -342,4 +343,35 @@ impl MockDashPlatformSdk { Ok(data) } + + /// Wrapper around [FromProof] that uses mock expectations instead of executing [FromProof] trait. + pub(crate) fn parse_proof_with_metadata>( + &self, + request: O::Request, + response: O::Response, + ) -> Result<(Option, ResponseMetadata), drive_proof_verifier::Error> + where + O::Request: Mockable, + Option: MockResponse, + // O: FromProof<>::Request>, + { + let key = Key::new(&request); + + let data = match self.from_proof_expectations.get(&key) { + Some(d) => ( + Option::::mock_deserialize(self, d), + ResponseMetadata::default(), + ), + None => { + let version = self.version(); + let provider = self.quorum_provider.as_ref() + .ok_or(ContextProviderError::InvalidQuorum( + "expectation not found and quorum info provider not initialized with sdk.mock().quorum_info_dir()".to_string() + ))?; + O::maybe_from_proof_with_metadata(request, response, version, provider)? + } + }; + + Ok(data) + } } diff --git a/packages/rs-sdk/src/platform/delegate.rs b/packages/rs-sdk/src/platform/delegate.rs index d684db448c..5e0f46e1e3 100644 --- a/packages/rs-sdk/src/platform/delegate.rs +++ b/packages/rs-sdk/src/platform/delegate.rs @@ -78,12 +78,12 @@ macro_rules! delegate_from_proof_variant { type Request = $request; type Response = $response; - fn maybe_from_proof<'a, I: Into, O: Into>( + fn maybe_from_proof_with_metadata<'a, I: Into, O: Into>( request: I, response: O, version: &dpp::version::PlatformVersion, provider: &'a dyn drive_proof_verifier::ContextProvider, - ) -> Result, drive_proof_verifier::Error> + ) -> Result<(Option, ResponseMetadata), drive_proof_verifier::Error> where Self: Sized + 'a, { @@ -96,7 +96,7 @@ macro_rules! delegate_from_proof_variant { match request {$( req::$variant(request) => { if let resp::$variant(response) = response { - >::maybe_from_proof( + >::maybe_from_proof_with_metadata( request, response, version, provider, ) } else { @@ -115,6 +115,7 @@ macro_rules! delegate_from_proof_variant { } }; } + #[macro_export] /// Define enums that will wrap multiple requests/responses for one object. /// diff --git a/packages/rs-sdk/src/platform/document_query.rs b/packages/rs-sdk/src/platform/document_query.rs index 28b04a87c6..6834b82425 100644 --- a/packages/rs-sdk/src/platform/document_query.rs +++ b/packages/rs-sdk/src/platform/document_query.rs @@ -8,7 +8,7 @@ use dapi_grpc::platform::v0::get_documents_request::Version::V0; use dapi_grpc::platform::v0::{ self as platform_proto, get_documents_request::{get_documents_request_v0::Start, GetDocumentsRequestV0}, - GetDocumentsRequest, + GetDocumentsRequest, ResponseMetadata, }; use dpp::{ data_contract::{ @@ -153,26 +153,26 @@ impl TransportRequest for DocumentQuery { impl FromProof for Document { type Request = DocumentQuery; type Response = platform_proto::GetDocumentsResponse; - fn maybe_from_proof<'a, I: Into, O: Into>( + fn maybe_from_proof_with_metadata<'a, I: Into, O: Into>( request: I, response: O, version: &dpp::version::PlatformVersion, provider: &'a dyn drive_proof_verifier::ContextProvider, - ) -> Result, drive_proof_verifier::Error> + ) -> Result<(Option, ResponseMetadata), drive_proof_verifier::Error> where Self: Sized + 'a, { let request: Self::Request = request.into(); - let documents: Option = - >::maybe_from_proof( + let (documents, metadata): (Option, ResponseMetadata) = + >::maybe_from_proof_with_metadata( request, response, version, provider, )?; match documents { - None => Ok(None), + None => Ok((None, metadata)), Some(docs) => match docs.len() { - 0 | 1 => Ok(docs.into_iter().next().and_then(|(_, v)| v)), + 0 | 1 => Ok((docs.into_iter().next().and_then(|(_, v)| v), metadata)), n => Err(drive_proof_verifier::Error::ResponseDecodeError { error: format!("expected 1 element, got {}", n), }), @@ -184,12 +184,12 @@ impl FromProof for Document { impl FromProof for drive_proof_verifier::types::Documents { type Request = DocumentQuery; type Response = platform_proto::GetDocumentsResponse; - fn maybe_from_proof<'a, I: Into, O: Into>( + fn maybe_from_proof_with_metadata<'a, I: Into, O: Into>( request: I, response: O, version: &dpp::version::PlatformVersion, provider: &'a dyn drive_proof_verifier::ContextProvider, - ) -> Result, drive_proof_verifier::Error> + ) -> Result<(Option, ResponseMetadata), drive_proof_verifier::Error> where Self: Sized + 'a, { @@ -201,7 +201,7 @@ impl FromProof for drive_proof_verifier::types::Documents { error: format!("Failed to convert DocumentQuery to DriveQuery: {}", e), })?; - >::maybe_from_proof( + >::maybe_from_proof_with_metadata( drive_query, response, version, diff --git a/packages/rs-sdk/src/platform/fetch.rs b/packages/rs-sdk/src/platform/fetch.rs index 9cfab2067a..23a4d13a65 100644 --- a/packages/rs-sdk/src/platform/fetch.rs +++ b/packages/rs-sdk/src/platform/fetch.rs @@ -9,8 +9,9 @@ //! traits. The associated [Fetch::Request]` type needs to implement [TransportRequest]. use crate::mock::MockResponse; +use crate::platform::query; use crate::{error::Error, platform::query::Query, Sdk}; -use dapi_grpc::platform::v0::{self as platform_proto}; +use dapi_grpc::platform::v0::{self as platform_proto, ResponseMetadata}; use dpp::block::extended_epoch_info::ExtendedEpochInfo; use dpp::platform_value::Identifier; use dpp::{document::Document, prelude::Identity}; @@ -85,21 +86,50 @@ where sdk: &Sdk, query: Q, ) -> Result, Error> { + Self::fetch_with_settings(sdk, query, RequestSettings::default()).await + } + + /// Fetch single object from the Platfom. + /// + /// Fetch object from the platform that satisfies provided [Query]. + /// Most often, the Query is an [Identifier] of the object to be fetched. + /// + /// ## Parameters + /// + /// - `sdk`: An instance of [Sdk]. + /// - `query`: A query parameter implementing [`crate::platform::query::Query`] to specify the data to be fetched. + /// + /// ## Returns + /// + /// Returns: + /// * `Ok(Some(Self))` when object is found + /// * `Ok(None)` when object is not found + /// * [`Err(Error)`](Error) when an error occurs + /// + /// ## Error Handling + /// + /// Any errors encountered during the execution are returned as [Error] instances. + async fn fetch_with_metadata::Request>>( + sdk: &Sdk, + query: Q, + settings: Option, + ) -> Result<(Option, ResponseMetadata), Error> { let request = query.query(sdk.prove())?; let response = request .clone() - .execute(sdk, RequestSettings::default()) + .execute(sdk, settings.unwrap_or_default()) .await?; let object_type = std::any::type_name::().to_string(); tracing::trace!(request = ?request, response = ?response, object_type, "fetched object from platform"); - let object: Option = sdk.parse_proof(request, response)?; + let (object, response_metadata): (Option, ResponseMetadata) = + sdk.parse_proof_with_metadata(request, response)?; match object { - Some(item) => Ok(item.into()), - None => Ok(None), + Some(item) => Ok((item.into(), response_metadata)), + None => Ok((None, response_metadata)), } } diff --git a/packages/rs-sdk/src/platform/types/identity.rs b/packages/rs-sdk/src/platform/types/identity.rs index ae8c24d2fc..1ae9f6e2cf 100644 --- a/packages/rs-sdk/src/platform/types/identity.rs +++ b/packages/rs-sdk/src/platform/types/identity.rs @@ -11,7 +11,7 @@ use dapi_grpc::platform::v0::{ get_identity_by_public_key_hash_request, get_identity_contract_nonce_request, get_identity_nonce_request, get_identity_request, GetIdentityBalanceAndRevisionRequest, GetIdentityBalanceRequest, GetIdentityByPublicKeyHashRequest, GetIdentityContractNonceRequest, - GetIdentityNonceRequest, GetIdentityRequest, + GetIdentityNonceRequest, GetIdentityRequest, ResponseMetadata, }; use dpp::prelude::Identity; diff --git a/packages/rs-sdk/src/sdk.rs b/packages/rs-sdk/src/sdk.rs index eb7b255f9e..1678252c62 100644 --- a/packages/rs-sdk/src/sdk.rs +++ b/packages/rs-sdk/src/sdk.rs @@ -16,7 +16,7 @@ use dapi_grpc::mock::Mockable; use dapi_grpc::platform::v0::get_identity_contract_nonce_request::GetIdentityContractNonceRequestV0; use dapi_grpc::platform::v0::get_identity_contract_nonce_response::Version; use dapi_grpc::platform::v0::{ - GetIdentityContractNonceRequest, GetIdentityContractNonceResponse, Proof, + GetIdentityContractNonceRequest, GetIdentityContractNonceResponse, Proof, ResponseMetadata, }; use dpp::identity::identity_nonce::IDENTITY_NONCE_VALUE_FILTER; use dpp::prelude; @@ -171,6 +171,26 @@ impl Sdk { request: O::Request, response: O::Response, ) -> Result, drive_proof_verifier::Error> + where + O::Request: Mockable, + { + self.parse_proof_with_metadata(request, response) + .map(|result| result.0) + } + + /// Retrieve object `O` from proof contained in `request` (of type `R`) and `response`. + /// + /// This method is used to retrieve objects from proofs returned by Dash Platform. + /// + /// ## Generic Parameters + /// + /// - `R`: Type of the request that was used to fetch the proof. + /// - `O`: Type of the object to be retrieved from the proof. + pub(crate) fn parse_proof_with_metadata + MockResponse>( + &self, + request: O::Request, + response: O::Response, + ) -> Result<(Option, ResponseMetadata), drive_proof_verifier::Error> where O::Request: Mockable, { @@ -184,10 +204,10 @@ impl Sdk { match self.inner { SdkInstance::Dapi { .. } => { - O::maybe_from_proof(request, response, self.version(), &provider) + O::maybe_from_proof_with_metadata(request, response, self.version(), &provider) } #[cfg(feature = "mocks")] - SdkInstance::Mock { .. } => self.mock().parse_proof(request, response), + SdkInstance::Mock { .. } => self.mock().parse_proof_with_metadata(request, response), } } From c481783ca68cf32aebc85a7384de28271463c626 Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Thu, 22 Feb 2024 12:31:27 +0700 Subject: [PATCH 041/191] feat(sdk): add fetch_current_with_metadata to ExtendedEpochInfo (#1708) --- packages/rs-sdk/src/platform/types/epoch.rs | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/packages/rs-sdk/src/platform/types/epoch.rs b/packages/rs-sdk/src/platform/types/epoch.rs index 6ec158a2ad..88def823bf 100644 --- a/packages/rs-sdk/src/platform/types/epoch.rs +++ b/packages/rs-sdk/src/platform/types/epoch.rs @@ -1,6 +1,6 @@ //! Epoch-related types and helpers use async_trait::async_trait; -use dapi_grpc::platform::v0::GetEpochsInfoRequest; +use dapi_grpc::platform::v0::{GetEpochsInfoRequest, ResponseMetadata}; use dpp::block::{epoch::EpochIndex, extended_epoch_info::ExtendedEpochInfo}; use crate::{ @@ -14,6 +14,8 @@ use crate::{ pub trait ExtendedEpochInfoEx: Sized { /// Fetch current (the latest) epoch from the platform. async fn fetch_current(sdk: &Sdk) -> Result; + /// Fetch current (the latest) epoch from the platform with metadata. + async fn fetch_current_with_metadata(sdk: &Sdk) -> Result<(Self, ResponseMetadata), Error>; } #[async_trait] @@ -31,6 +33,20 @@ impl ExtendedEpochInfoEx for ExtendedEpochInfo { epoch.ok_or(Error::EpochNotFound) } + + async fn fetch_current_with_metadata(sdk: &Sdk) -> Result<(Self, ResponseMetadata), Error> { + let query = LimitQuery { + query: EpochQuery { + start: None, + ascending: false, + }, + limit: Some(1), + }; + + let (epoch, metadata) = Self::fetch_with_metadata(sdk, query, None).await?; + + Ok((epoch.ok_or(Error::EpochNotFound)?, metadata)) + } } /// Query used to fetch multiple epochs from the platform. #[derive(Clone, Debug)] From 541b27e13e726eaff58a6529830fa637171a993b Mon Sep 17 00:00:00 2001 From: Igor Markin Date: Thu, 22 Feb 2024 11:23:41 +0000 Subject: [PATCH 042/191] feat(sdk): re-fetch nonce on interval (#1706) --- .../NonceManager/NonceManager.spec.ts | 77 +++++++++++++++ .../Platform/NonceManager/NonceManager.ts | 96 +++++++++++++++---- .../test/e2e/withdrawals.spec.js | 27 ------ 3 files changed, 155 insertions(+), 45 deletions(-) create mode 100644 packages/js-dash-sdk/src/SDK/Client/Platform/NonceManager/NonceManager.spec.ts diff --git a/packages/js-dash-sdk/src/SDK/Client/Platform/NonceManager/NonceManager.spec.ts b/packages/js-dash-sdk/src/SDK/Client/Platform/NonceManager/NonceManager.spec.ts new file mode 100644 index 0000000000..2531d9fc93 --- /dev/null +++ b/packages/js-dash-sdk/src/SDK/Client/Platform/NonceManager/NonceManager.spec.ts @@ -0,0 +1,77 @@ +import { Identifier } from '@dashevo/wasm-dpp'; +import { expect } from 'chai'; +import NonceManager, { NONCE_FETCH_INTERVAL } from './NonceManager'; + +describe('Dash - NonceManager', () => { + let nonceManager: NonceManager; + let dapiClientMock; + const identityId = new Identifier(Buffer.alloc(32).fill(1)); + const contractId = new Identifier(Buffer.alloc(32).fill(2)); + + beforeEach(function beforeEach() { + dapiClientMock = { + platform: { + getIdentityContractNonce: this.sinon.stub(), + getIdentityNonce: this.sinon.stub(), + }, + }; + + nonceManager = new NonceManager(dapiClientMock); + }); + + describe('Identity nonce', () => { + it('should set and get identity nonce', async () => { + nonceManager.setIdentityNonce(identityId, 1); + expect(await nonceManager.getIdentityNonce(identityId)).to.be.equal(1); + expect(dapiClientMock.platform.getIdentityNonce).to.not.be.called(); + }); + + it('should fetch identity nonce if it is not present', async () => { + dapiClientMock.platform.getIdentityNonce.resolves({ identityNonce: 1 }); + expect(await nonceManager.getIdentityNonce(identityId)).to.be.equal(1); + expect(dapiClientMock.platform.getIdentityNonce).to.be.calledOnce(); + }); + + it('should invalidate and re-fetch nonce after interval passed', async function it() { + const clock = this.sinon.useFakeTimers(); + dapiClientMock.platform.getIdentityNonce.resolves({ identityNonce: 1 }); + expect(await nonceManager.getIdentityNonce(identityId)).to.be.equal(1); + + clock.tick(NONCE_FETCH_INTERVAL + 1); + dapiClientMock.platform.getIdentityNonce.resolves({ identityNonce: 2 }); + await nonceManager.getIdentityNonce(identityId); + expect(await nonceManager.getIdentityNonce(identityId)).to.be.equal(2); + clock.restore(); + }); + }); + + describe('Identity contract nonce', () => { + it('should set and get identity contract nonce', async () => { + nonceManager.setIdentityContractNonce(identityId, contractId, 1); + expect(await nonceManager.getIdentityContractNonce(identityId, contractId)) + .to.be.equal(1); + expect(dapiClientMock.platform.getIdentityContractNonce).to.not.be.called(); + }); + + it('should fetch identity contract nonce if it is not present', async () => { + dapiClientMock.platform.getIdentityContractNonce.resolves({ identityContractNonce: 1 }); + expect(await nonceManager.getIdentityContractNonce(identityId, contractId)) + .to.be.equal(1); + expect(dapiClientMock.platform.getIdentityContractNonce).to.be.calledOnce(); + }); + + it('should invalidate and re-fetch nonce after interval passed', async function it() { + const clock = this.sinon.useFakeTimers(); + dapiClientMock.platform.getIdentityContractNonce.resolves({ identityContractNonce: 1 }); + expect(await nonceManager.getIdentityContractNonce(identityId, contractId)) + .to.be.equal(1); + + clock.tick(NONCE_FETCH_INTERVAL + 1); + dapiClientMock.platform.getIdentityContractNonce.resolves({ identityContractNonce: 2 }); + await nonceManager.getIdentityContractNonce(identityId, contractId); + expect(await nonceManager.getIdentityContractNonce(identityId, contractId)) + .to.be.equal(2); + clock.restore(); + }); + }); +}); diff --git a/packages/js-dash-sdk/src/SDK/Client/Platform/NonceManager/NonceManager.ts b/packages/js-dash-sdk/src/SDK/Client/Platform/NonceManager/NonceManager.ts index 6b45f16bcf..4bf80ef465 100644 --- a/packages/js-dash-sdk/src/SDK/Client/Platform/NonceManager/NonceManager.ts +++ b/packages/js-dash-sdk/src/SDK/Client/Platform/NonceManager/NonceManager.ts @@ -1,13 +1,20 @@ import DAPIClient from '@dashevo/dapi-client'; import { Identifier } from '@dashevo/wasm-dpp'; -// TODO: re-fetch nonces by timeout +type NonceState = { + value: number, + lastFetchedAt: number, +}; + +// 20 min +export const NONCE_FETCH_INTERVAL = 1200 * 1000; + class NonceManager { public dapiClient: DAPIClient; - private identityNonce: Map; + private identityNonce: Map; - private identityContractNonce: Map>; + private identityContractNonce: Map>; constructor(dapiClient: DAPIClient) { this.dapiClient = dapiClient; @@ -17,23 +24,49 @@ class NonceManager { } public setIdentityNonce(identityId: Identifier, nonce: number) { - this.identityNonce.set(identityId, nonce); + const nonceState = this.identityNonce.get(identityId); + + if (!nonceState) { + this.identityNonce.set(identityId, { + value: nonce, + lastFetchedAt: Date.now(), + }); + } else { + nonceState.value = nonce; + } } public async getIdentityNonce(identityId: Identifier): Promise { - let nonce = this.identityNonce.get(identityId); + let nonceState = this.identityNonce.get(identityId); - if (typeof nonce === 'undefined') { - ({ identityNonce: nonce } = await this.dapiClient.platform.getIdentityNonce(identityId)); + if (typeof nonceState === 'undefined') { + const { identityNonce } = await this.dapiClient.platform.getIdentityNonce(identityId); - if (typeof nonce === 'undefined') { + if (typeof identityNonce === 'undefined') { throw new Error('Identity nonce is not found'); } - this.identityNonce.set(identityId, nonce); + nonceState = { + value: identityNonce, + lastFetchedAt: Date.now(), + }; + + this.identityNonce.set(identityId, nonceState); + } else { + const now = Date.now(); + if (now - nonceState.lastFetchedAt > NONCE_FETCH_INTERVAL) { + const { identityNonce } = await this.dapiClient.platform.getIdentityNonce(identityId); + + if (typeof identityNonce === 'undefined') { + throw new Error('Identity nonce is not found'); + } + + nonceState.value = identityNonce; + nonceState.lastFetchedAt = now; + } } - return nonce; + return nonceState.value; } public setIdentityContractNonce(identityId: Identifier, contractId: Identifier, nonce: number) { @@ -44,7 +77,16 @@ class NonceManager { this.identityContractNonce.set(identityId, contractNonce); } - contractNonce.set(contractId, nonce); + const nonceState = contractNonce.get(contractId); + + if (!nonceState) { + contractNonce.set(contractId, { + value: nonce, + lastFetchedAt: Date.now(), + }); + } else { + nonceState.value = nonce; + } } public async getIdentityContractNonce( @@ -58,20 +100,38 @@ class NonceManager { this.identityContractNonce.set(identityId, contractNonce); } - let nonce = contractNonce.get(contractId); + let nonceState = contractNonce.get(contractId); - if (typeof nonce === 'undefined') { - ({ identityContractNonce: nonce } = await this.dapiClient.platform - .getIdentityContractNonce(identityId, contractId)); + if (typeof nonceState === 'undefined') { + const { identityContractNonce } = await this.dapiClient.platform + .getIdentityContractNonce(identityId, contractId); - if (typeof nonce === 'undefined') { + if (typeof identityContractNonce === 'undefined') { throw new Error('Identity contract nonce is not found'); } - contractNonce.set(identityId, nonce); + nonceState = { + value: identityContractNonce, + lastFetchedAt: Date.now(), + }; + + contractNonce.set(identityId, nonceState); + } else { + const now = Date.now(); + if (now - nonceState.lastFetchedAt > NONCE_FETCH_INTERVAL) { + const { identityNonceContract } = await this.dapiClient.platform + .getIdentityContractNonce(identityId, contractId); + + if (typeof identityNonceContract === 'undefined') { + throw new Error('Identity nonce is not found'); + } + + nonceState.value = identityNonceContract; + nonceState.lastFetchedAt = now; + } } - return nonce; + return nonceState.value; } } diff --git a/packages/platform-test-suite/test/e2e/withdrawals.spec.js b/packages/platform-test-suite/test/e2e/withdrawals.spec.js index d50b95fe3c..92f4d6a23b 100644 --- a/packages/platform-test-suite/test/e2e/withdrawals.spec.js +++ b/packages/platform-test-suite/test/e2e/withdrawals.spec.js @@ -146,33 +146,6 @@ describe('Withdrawals', function withdrawalsTest() { }, ); - const identityId = identity.getId(); - const dataContractId = client.getApps().get('withdrawals').contractId; - const { identityContractNonce } = await client.getDAPIClient().platform - .getIdentityContractNonce(identityId, dataContractId); - - const stateTransition = client.platform.dpp.document.createStateTransition({ - create: [withdrawal], - }, { - [identityId.toString()]: { - [dataContractId.toString()]: identityContractNonce, - }, - }); - - stateTransition.setSignaturePublicKeyId(1); - - const account = await client.getWalletAccount(); - - const { privateKey } = account.identities.getIdentityHDKeyById( - identity.getId().toString(), - 1, - ); - - await stateTransition.sign( - identity.getPublicKeyById(1), - privateKey.toBuffer(), - ); - try { await client.platform.documents.broadcast({ create: [withdrawal], From a988e6968d009fd020979f2b419b26b81a4cc35c Mon Sep 17 00:00:00 2001 From: Paul DeLucia <69597248+pauldelucia@users.noreply.github.com> Date: Thu, 22 Feb 2024 20:20:28 +0700 Subject: [PATCH 043/191] fix: make strategy tests compatible with all networks and platform tui (#1705) Co-authored-by: Quantum Explorer --- Cargo.lock | 521 ++++++++------- packages/rs-dpp/Cargo.toml | 1 + .../src/data_contract/document_type/v0/mod.rs | 7 + .../document_type/v0/random_document_type.rs | 190 +++++- .../src/data_contract/v0/data_contract.rs | 2 +- packages/rs-dpp/src/identity/v0/random.rs | 3 +- packages/rs-dpp/src/state_transition/mod.rs | 2 +- .../v0/v0_methods.rs | 19 +- .../v0/v0_methods.rs | 2 + .../tests/strategy_tests/strategy.rs | 629 +++++++++++++++++- packages/rs-drive/Cargo.toml | 12 +- .../rustc-ice-2024-02-20T10_33_46-3251.txt | 58 ++ .../rustc-ice-2024-02-20T10_35_00-10108.txt | 58 ++ .../rustc-ice-2024-02-20T10_35_04-10384.txt | 58 ++ .../rustc-ice-2024-02-20T10_35_08-10643.txt | 58 ++ .../rustc-ice-2024-02-20T10_35_12-10937.txt | 58 ++ .../rustc-ice-2024-02-20T10_35_20-11458.txt | 58 ++ .../rustc-ice-2024-02-20T10_35_23-11733.txt | 106 +++ .../rustc-ice-2024-02-20T10_35_25-11999.txt | 138 ++++ .../rustc-ice-2024-02-20T10_35_26-12247.txt | 170 +++++ .../rustc-ice-2024-02-20T10_35_28-12710.txt | 170 +++++ .../rustc-ice-2024-02-20T10_35_29-12958.txt | 170 +++++ .../rustc-ice-2024-02-20T10_35_30-13195.txt | 170 +++++ packages/rs-sdk/Cargo.toml | 1 - packages/rs-sdk/src/core/transaction.rs | 1 + packages/rs-sdk/src/platform/transition.rs | 2 +- .../platform/transition/broadcast_request.rs | 2 +- .../src/platform/transition/put_document.rs | 4 +- .../transition/withdraw_from_identity.rs | 6 +- packages/rs-sdk/src/sdk.rs | 10 +- packages/strategy-tests/Cargo.toml | 3 + packages/strategy-tests/src/lib.rs | 629 +++++++++++------- packages/strategy-tests/src/operations.rs | 137 +++- packages/strategy-tests/src/transitions.rs | 105 ++- rust-toolchain.toml | 2 +- 35 files changed, 2975 insertions(+), 587 deletions(-) create mode 100644 packages/rs-platform-serialization-derive/rustc-ice-2024-02-20T10_33_46-3251.txt create mode 100644 packages/rs-platform-serialization-derive/rustc-ice-2024-02-20T10_35_00-10108.txt create mode 100644 packages/rs-platform-serialization-derive/rustc-ice-2024-02-20T10_35_04-10384.txt create mode 100644 packages/rs-platform-serialization-derive/rustc-ice-2024-02-20T10_35_08-10643.txt create mode 100644 packages/rs-platform-serialization-derive/rustc-ice-2024-02-20T10_35_12-10937.txt create mode 100644 packages/rs-platform-serialization-derive/rustc-ice-2024-02-20T10_35_20-11458.txt create mode 100644 packages/rs-platform-serialization-derive/rustc-ice-2024-02-20T10_35_23-11733.txt create mode 100644 packages/rs-platform-serialization-derive/rustc-ice-2024-02-20T10_35_25-11999.txt create mode 100644 packages/rs-platform-serialization-derive/rustc-ice-2024-02-20T10_35_26-12247.txt create mode 100644 packages/rs-platform-serialization-derive/rustc-ice-2024-02-20T10_35_28-12710.txt create mode 100644 packages/rs-platform-serialization-derive/rustc-ice-2024-02-20T10_35_29-12958.txt create mode 100644 packages/rs-platform-serialization-derive/rustc-ice-2024-02-20T10_35_30-13195.txt diff --git a/Cargo.lock b/Cargo.lock index 89e4c3f3f1..4b45915f59 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -19,9 +19,9 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "ahash" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a824f2aa7e75a0c98c5a504fceb80649e9c35265d44525b5f94de4771a395cd" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" dependencies = [ "getrandom", "once_cell", @@ -31,9 +31,9 @@ dependencies = [ [[package]] name = "ahash" -version = "0.8.7" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77c3a9648d43b9cd48db467b3f87fdd6e146bcc88ab0180006cef2179fe11d01" +checksum = "d713b3834d76b85304d4d525563c1276e2e30dc97cc67bfb4585a4a29fc2c89f" dependencies = [ "cfg-if", "once_cell", @@ -73,9 +73,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.11" +version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e2e1ebcb11de5c03c67de28a7df593d32191b44939c482e97702baaaa6ab6a5" +checksum = "96b09b5178381e0874812a9b157f7fe84982617e48f71f4e3235482775e5b540" dependencies = [ "anstyle", "anstyle-parse", @@ -87,9 +87,9 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.4" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" +checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" [[package]] name = "anstyle-parse" @@ -121,9 +121,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.79" +version = "1.0.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" +checksum = "5ad32ce52e4161730f7098c077cd2ed6229b5804ccf99e5366be1ab72a98b4e1" [[package]] name = "arrayref" @@ -185,7 +185,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] @@ -196,7 +196,7 @@ checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] @@ -365,7 +365,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.48", + "syn 2.0.50", "which", ] @@ -458,7 +458,7 @@ dependencies = [ [[package]] name = "bls-dash-sys" version = "1.2.5" -source = "git+https://github.com/dashpay/bls-signatures?branch=develop#3540b8bbed47e04ed6f02eea2141bd62dae0c411" +source = "git+https://github.com/dashpay/bls-signatures?branch=develop#1c2fc79c19dc8041610c005e68d58bfb4bc32721" dependencies = [ "bindgen", "cc", @@ -468,7 +468,7 @@ dependencies = [ [[package]] name = "bls-signatures" version = "1.2.5" -source = "git+https://github.com/dashpay/bls-signatures?branch=develop#3540b8bbed47e04ed6f02eea2141bd62dae0c411" +source = "git+https://github.com/dashpay/bls-signatures?branch=develop#1c2fc79c19dc8041610c005e68d58bfb4bc32721" dependencies = [ "bls-dash-sys", "hex", @@ -496,7 +496,7 @@ dependencies = [ "proc-macro-crate 3.1.0", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", "syn_derive", ] @@ -517,15 +517,15 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.14.0" +version = "3.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" +checksum = "c764d619ca78fccbf3069b37bd7af92577f044bb15236036662d79b6559f25b7" [[package]] name = "bytecheck" -version = "0.6.11" +version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6372023ac861f6e6dc89c8344a8f398fb42aaba2b5dbc649ca0c0e9dbcb627" +checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" dependencies = [ "bytecheck_derive", "ptr_meta", @@ -534,9 +534,9 @@ dependencies = [ [[package]] name = "bytecheck_derive" -version = "0.6.11" +version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7ec4c6f261935ad534c0c22dbef2201b45918860eb1c574b972bd213a76af61" +checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" dependencies = [ "proc-macro2", "quote", @@ -586,9 +586,9 @@ dependencies = [ [[package]] name = "cargo-platform" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ceed8ef69d8518a5dda55c07425450b58a4e1946f4951eab6d7191ee86c2443d" +checksum = "694c8807f2ae16faecc43dc17d74b3eb042482789fd0eb64b39a2e04e087053f" dependencies = [ "serde", ] @@ -614,11 +614,10 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.0.83" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +checksum = "7f9fa1897e4325be0d68d48df6aa1a71ac2ed4d27723887e7754192705350730" dependencies = [ - "jobserver", "libc", ] @@ -645,9 +644,9 @@ checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" [[package]] name = "chrono" -version = "0.4.32" +version = "0.4.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41daef31d7a747c5c847246f36de49ced6f7403b4cdabc807a97b5cc184cda7a" +checksum = "5bc015644b92d5890fab7489e49d21f879d5c990186827d42ec511919404f38b" dependencies = [ "android-tzdata", "iana-time-zone", @@ -706,9 +705,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.4.18" +version = "4.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e578d6ec4194633722ccf9544794b71b1385c3c027efe0c55db226fc880865c" +checksum = "c918d541ef2913577a0f9566e9ce27cb35b6df072075769e0b26cb5a554520da" dependencies = [ "clap_builder", "clap_derive", @@ -716,33 +715,33 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.18" +version = "4.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4df4df40ec50c46000231c914968278b1eb05098cf8f1b3a518a95030e71d1c7" +checksum = "9f3e7391dad68afb0c2ede1bf619f579a3dc9c2ec67f089baa397123a2f3d1eb" dependencies = [ "anstream", "anstyle", "clap_lex", - "strsim", + "strsim 0.11.0", ] [[package]] name = "clap_derive" -version = "4.4.7" +version = "4.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" +checksum = "307bc0538d5f0f83b8248db3087aa92fe504e4691294d0c96c0eabc33f47ba47" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] name = "clap_lex" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" +checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" [[package]] name = "colorchoice" @@ -752,13 +751,12 @@ checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" [[package]] name = "colored" -version = "1.9.4" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f741c91823341bebf717d4c71bda820630ce065443b58bd1b7451af008355" +checksum = "cbf2150cce219b664a8a70df7a1f933836724b503f8a413af9365b4dcc4d90b8" dependencies = [ - "is-terminal", "lazy_static", - "winapi", + "windows-sys 0.48.0", ] [[package]] @@ -815,9 +813,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.3.2" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" dependencies = [ "cfg-if", ] @@ -925,9 +923,9 @@ dependencies = [ [[package]] name = "curve25519-dalek" -version = "4.1.1" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89b8c6a2e4b1f45971ad09761aafb85514a84744b67a95e32c3cc1352d1f65c" +checksum = "0a677b8922c94e01bdbb12126b0bc852f00447528dee1782229af9c720c3f348" dependencies = [ "cfg-if", "cpufeatures", @@ -948,7 +946,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] @@ -973,14 +971,14 @@ dependencies = [ "dapi-grpc", "heck", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] name = "darling" -version = "0.20.3" +version = "0.20.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" +checksum = "c376d08ea6aa96aafe61237c7200d1241cb177b7d3a542d791f2d118e9cbb955" dependencies = [ "darling_core", "darling_macro", @@ -988,27 +986,27 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.3" +version = "0.20.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" +checksum = "33043dcd19068b8192064c704b3f83eb464f91f1ff527b44a4e2b08d9cdb8855" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", - "strsim", - "syn 2.0.48", + "strsim 0.10.0", + "syn 2.0.50", ] [[package]] name = "darling_macro" -version = "0.20.3" +version = "0.20.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" +checksum = "c5a91391accf613803c2a9bf9abccdbaa07c54b4244a5b64883f9c3c137c86be" dependencies = [ "darling_core", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] @@ -1206,7 +1204,7 @@ dependencies = [ "env_logger 0.9.3", "getrandom", "hex", - "indexmap 2.1.0", + "indexmap 2.2.3", "integer-encoding 4.0.0", "itertools 0.10.5", "json-patch", @@ -1234,6 +1232,7 @@ dependencies = [ "test-case", "thiserror", "tokio", + "tracing", ] [[package]] @@ -1255,10 +1254,10 @@ dependencies = [ "grovedb-path", "grovedb-storage", "hex", - "indexmap 1.9.3", + "indexmap 2.2.3", "integer-encoding 4.0.0", "intmap", - "itertools 0.10.5", + "itertools 0.11.0", "moka", "nohash-hasher", "platform-version", @@ -1281,7 +1280,7 @@ dependencies = [ "bs58 0.4.0", "chrono", "ciborium", - "clap 4.4.18", + "clap 4.5.1", "dapi-grpc", "dashcore-rpc", "delegate", @@ -1309,7 +1308,7 @@ dependencies = [ "rust_decimal_macros", "serde", "serde_json", - "serde_with 3.5.0", + "serde_with 3.6.1", "sha2", "simple-signer", "strategy-tests", @@ -1372,9 +1371,9 @@ dependencies = [ [[package]] name = "ed25519-dalek" -version = "2.1.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f628eaec48bfd21b865dc2950cfa014450c01d2fa2b69a86c2fd5844ec523c0" +checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" dependencies = [ "curve25519-dalek", "ed25519", @@ -1387,9 +1386,9 @@ dependencies = [ [[package]] name = "either" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" [[package]] name = "enum-map" @@ -1408,7 +1407,7 @@ checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] @@ -1536,9 +1535,9 @@ dependencies = [ [[package]] name = "fiat-crypto" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27573eac26f4dd11e2b1916c3fe1baa56407c83c71a773a8ba17ec0bca03b6b7" +checksum = "1676f435fc1dadde4d03e43f5d62b259e1ce5f40bd4ffb21db2b42ebe59c1382" [[package]] name = "file-rotate" @@ -1698,7 +1697,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] @@ -1769,7 +1768,7 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "grovedb" version = "1.0.0-rc.2" -source = "git+https://github.com/dashpay/grovedb?rev=b40dd1a35f852c81caeda2d3c2910c40fae3a67f#b40dd1a35f852c81caeda2d3c2910c40fae3a67f" +source = "git+https://github.com/dashpay/grovedb?rev=d007bed7544bf837bdf155e696a530b90d5f82e5#d007bed7544bf837bdf155e696a530b90d5f82e5" dependencies = [ "bincode 1.3.3", "grovedb-costs", @@ -1791,7 +1790,7 @@ dependencies = [ [[package]] name = "grovedb-costs" version = "1.0.0-rc.2" -source = "git+https://github.com/dashpay/grovedb?rev=b40dd1a35f852c81caeda2d3c2910c40fae3a67f#b40dd1a35f852c81caeda2d3c2910c40fae3a67f" +source = "git+https://github.com/dashpay/grovedb?rev=d007bed7544bf837bdf155e696a530b90d5f82e5#d007bed7544bf837bdf155e696a530b90d5f82e5" dependencies = [ "integer-encoding 3.0.4", "intmap", @@ -1801,7 +1800,7 @@ dependencies = [ [[package]] name = "grovedb-merk" version = "1.0.0-rc.2" -source = "git+https://github.com/dashpay/grovedb?rev=b40dd1a35f852c81caeda2d3c2910c40fae3a67f#b40dd1a35f852c81caeda2d3c2910c40fae3a67f" +source = "git+https://github.com/dashpay/grovedb?rev=d007bed7544bf837bdf155e696a530b90d5f82e5#d007bed7544bf837bdf155e696a530b90d5f82e5" dependencies = [ "blake3", "byteorder", @@ -1815,7 +1814,6 @@ dependencies = [ "hex", "indexmap 1.9.3", "integer-encoding 3.0.4", - "jemallocator", "num_cpus", "rand", "thiserror", @@ -1825,12 +1823,12 @@ dependencies = [ [[package]] name = "grovedb-path" version = "1.0.0-rc.2" -source = "git+https://github.com/dashpay/grovedb?rev=b40dd1a35f852c81caeda2d3c2910c40fae3a67f#b40dd1a35f852c81caeda2d3c2910c40fae3a67f" +source = "git+https://github.com/dashpay/grovedb?rev=d007bed7544bf837bdf155e696a530b90d5f82e5#d007bed7544bf837bdf155e696a530b90d5f82e5" [[package]] name = "grovedb-storage" version = "1.0.0-rc.2" -source = "git+https://github.com/dashpay/grovedb?rev=b40dd1a35f852c81caeda2d3c2910c40fae3a67f#b40dd1a35f852c81caeda2d3c2910c40fae3a67f" +source = "git+https://github.com/dashpay/grovedb?rev=d007bed7544bf837bdf155e696a530b90d5f82e5#d007bed7544bf837bdf155e696a530b90d5f82e5" dependencies = [ "blake3", "grovedb-costs", @@ -1849,7 +1847,7 @@ dependencies = [ [[package]] name = "grovedb-visualize" version = "1.0.0-rc.2" -source = "git+https://github.com/dashpay/grovedb?rev=b40dd1a35f852c81caeda2d3c2910c40fae3a67f#b40dd1a35f852c81caeda2d3c2910c40fae3a67f" +source = "git+https://github.com/dashpay/grovedb?rev=d007bed7544bf837bdf155e696a530b90d5f82e5#d007bed7544bf837bdf155e696a530b90d5f82e5" dependencies = [ "hex", "itertools 0.10.5", @@ -1867,7 +1865,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap 2.1.0", + "indexmap 2.2.3", "slab", "tokio", "tokio-util", @@ -1886,7 +1884,7 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ - "ahash 0.7.7", + "ahash 0.7.8", ] [[package]] @@ -1895,7 +1893,7 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ff8ae62cd3a9102e5637afc8452c55acf3844001bd5374e0b0bd7b6616c038" dependencies = [ - "ahash 0.8.7", + "ahash 0.8.9", ] [[package]] @@ -1904,7 +1902,7 @@ version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" dependencies = [ - "ahash 0.8.7", + "ahash 0.8.9", "allocator-api2", ] @@ -1925,9 +1923,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.3.4" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d3d0e0f38255e7fa3cf31335b3a56f05febd18025f4db5ef7a0cfb4f8da651f" +checksum = "bd5256b483761cd23699d0da46cc6fd2ee3be420bbe6d020ae4a091e70b7e9fd" [[package]] name = "hex" @@ -2031,9 +2029,9 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.59" +version = "0.1.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6a67363e2aa4443928ce15e57ebae94fd8949958fd1223c4cfc0cd473ad7539" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -2081,9 +2079,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.1.0" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177" dependencies = [ "equivalent", "hashbrown 0.14.3", @@ -2126,7 +2124,7 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" dependencies = [ - "hermit-abi 0.3.4", + "hermit-abi 0.3.6", "libc", "windows-sys 0.48.0", ] @@ -2139,12 +2137,12 @@ checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" [[package]] name = "is-terminal" -version = "0.4.10" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bad00257d07be169d870ab665980b06cdb366d792ad690bf2e76876dc503455" +checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" dependencies = [ - "hermit-abi 0.3.4", - "rustix 0.38.30", + "hermit-abi 0.3.6", + "libc", "windows-sys 0.52.0", ] @@ -2181,35 +2179,6 @@ version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" -[[package]] -name = "jemalloc-sys" -version = "0.5.4+5.3.0-patched" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac6c1946e1cea1788cbfde01c993b52a10e2da07f4bac608228d1bed20bfebf2" -dependencies = [ - "cc", - "libc", -] - -[[package]] -name = "jemallocator" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0de374a9f8e63150e6f5e8a60cc14c668226d7a347d8aee1a45766e3c4dd3bc" -dependencies = [ - "jemalloc-sys", - "libc", -] - -[[package]] -name = "jobserver" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" -dependencies = [ - "libc", -] - [[package]] name = "js-sys" version = "0.3.63" @@ -2258,7 +2227,7 @@ name = "jsonschema" version = "0.15.0" source = "git+https://github.com/fominok/jsonschema-rs?branch=feat-unevaluated-properties#18f61ab46b4a06fb313fadadffd669058bddeafd" dependencies = [ - "ahash 0.7.7", + "ahash 0.7.8", "anyhow", "base64 0.21.7", "bytecount", @@ -2299,9 +2268,9 @@ checksum = "744a4c881f502e98c2241d2e5f50040ac73b30194d64452bb6260393b53f0dc9" [[package]] name = "libc" -version = "0.2.152" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "libloading" @@ -2331,9 +2300,9 @@ dependencies = [ [[package]] name = "libz-sys" -version = "1.1.14" +version = "1.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "295c17e837573c8c821dbaeb3cceb3d745ad082f7572191409e69cbc1b3fd050" +checksum = "037731f5d3aaa87a5675e895b63ddff1a87624bc29f77004ea829809654e48f6" dependencies = [ "cc", "pkg-config", @@ -2433,7 +2402,7 @@ version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fde3af1a009ed76a778cb84fdef9e7dbbdf5775ae3e4cc1f434a6a307f6f76c5" dependencies = [ - "ahash 0.8.7", + "ahash 0.8.9", "metrics-macros", "portable-atomic", ] @@ -2464,7 +2433,7 @@ checksum = "38b4faf00617defe497754acde3024865bc143d44a86799b24e191ecff91354f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] @@ -2496,9 +2465,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" dependencies = [ "adler", ] @@ -2651,32 +2620,37 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + [[package]] name = "num-derive" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfb77679af88f8b125209d354a202862602672222e7f2313fdd6dc349bad4712" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] name = "num-integer" -version = "0.1.45" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ - "autocfg", "num-traits", ] [[package]] name = "num-iter" -version = "0.1.43" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" +checksum = "d869c01cc0c455284163fd0092f1f93835385ccab5a98a0dcc497b2f8bf055a9" dependencies = [ "autocfg", "num-integer", @@ -2697,9 +2671,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.17" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" dependencies = [ "autocfg", ] @@ -2710,7 +2684,7 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.3.4", + "hermit-abi 0.3.6", "libc", ] @@ -2822,27 +2796,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" dependencies = [ "fixedbitset", - "indexmap 2.1.0", + "indexmap 2.2.3", ] [[package]] name = "pin-project" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" +checksum = "0302c4a0442c456bd56f841aee5c3bfd17967563f6fadc9ceb9f9c23cf3807e0" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" +checksum = "266c042b60c9c76b8d53061e52b2e0d1116abc57cefc8c5cd671619a56ac3690" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] @@ -2869,9 +2843,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2900ede94e305130c13ddd391e0ab7cbaeb783945ae07a279c268cb05109c6cb" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "platform-serialization" @@ -2887,7 +2861,7 @@ version = "1.0.0-dev.5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", "virtue 0.0.14", ] @@ -2900,7 +2874,7 @@ dependencies = [ "bs58 0.4.0", "ciborium", "hex", - "indexmap 2.1.0", + "indexmap 2.2.3", "lazy_static", "platform-serialization", "platform-version", @@ -2909,7 +2883,7 @@ dependencies = [ "serde", "serde_json", "thiserror", - "treediff 4.0.2", + "treediff 4.0.3", ] [[package]] @@ -2917,7 +2891,7 @@ name = "platform-value-convertible" version = "1.0.0-dev.5" dependencies = [ "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] @@ -2933,7 +2907,7 @@ version = "1.0.0-dev.5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] @@ -3061,7 +3035,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a41cf62165e97c7f814d2221421dbb9afcbcdb0a88068e5ea206e19951c2cbb5" dependencies = [ "proc-macro2", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] @@ -3080,7 +3054,7 @@ version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" dependencies = [ - "toml_edit 0.21.0", + "toml_edit 0.21.1", ] [[package]] @@ -3175,7 +3149,7 @@ dependencies = [ "prost 0.12.3", "prost-types 0.12.3", "regex", - "syn 2.0.48", + "syn 2.0.50", "tempfile", "which", ] @@ -3203,7 +3177,7 @@ dependencies = [ "itertools 0.11.0", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] @@ -3246,11 +3220,11 @@ dependencies = [ [[package]] name = "pulldown-cmark" -version = "0.9.3" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a1a2f1f0a7ecff9c31abbe177637be0e97a0aef46cf8738ece09327985d998" +checksum = "57206b407293d2bcd3af849ce869d52068623f19e1b5ff8e8778e3309439682b" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.4.2", "memchr", "unicase", ] @@ -3362,7 +3336,7 @@ checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.4", + "regex-automata 0.4.5", "regex-syntax 0.8.2", ] @@ -3377,9 +3351,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b7fa1134405e2ec9353fd416b17f8dacd46c473d7d3fd1cf202706a14eb792a" +checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd" dependencies = [ "aho-corasick", "memchr", @@ -3400,9 +3374,9 @@ checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "rend" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2571463863a6bd50c32f94402933f03457a3fbaf697a707c5be741e459f08fd" +checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" dependencies = [ "bytecheck", ] @@ -3418,23 +3392,24 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.7" +version = "0.17.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", + "cfg-if", "getrandom", "libc", "spin", "untrusted", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "rkyv" -version = "0.7.43" +version = "0.7.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "527a97cdfef66f65998b5f3b637c26f5a5ec09cc52a3f9932313ac645f4190f5" +checksum = "5cba464629b3394fc4dbc6f940ff8f5b4ff5c7aef40f29166fd4ad12acbc99c0" dependencies = [ "bitvec", "bytecheck", @@ -3450,9 +3425,9 @@ dependencies = [ [[package]] name = "rkyv_derive" -version = "0.7.43" +version = "0.7.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5c462a1328c8e67e4d6dbad1eb0355dd43e8ab432c6e227a43657f16ade5033" +checksum = "a7dddfff8de25e6f62b9d64e6e432bf1c6736c57d20323e15ee10435fbda7c65" dependencies = [ "proc-macro2", "quote", @@ -3495,7 +3470,7 @@ dependencies = [ "bincode 2.0.0-rc.3", "bip37-bloom-filter", "ciborium", - "clap 4.4.18", + "clap 4.5.1", "dapi-grpc", "dapi-grpc-macros", "dashcore-rpc", @@ -3534,9 +3509,9 @@ dependencies = [ [[package]] name = "rust_decimal" -version = "1.33.1" +version = "1.34.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06676aec5ccb8fc1da723cc8c0f9a46549f21ebb8753d3915c6c41db1e7f1dc4" +checksum = "b39449a79f45e8da28c57c341891b69a183044b29518bb8f86dbac9df60bb7df" dependencies = [ "arrayvec", "borsh", @@ -3550,9 +3525,9 @@ dependencies = [ [[package]] name = "rust_decimal_macros" -version = "1.33.1" +version = "1.34.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e43721f4ef7060ebc2c3ede757733209564ca8207f47674181bcd425dd76945" +checksum = "e418701588729bef95e7a655f2b483ad64bb97c46e8e79fde83efd92aaab6d82" dependencies = [ "quote", "rust_decimal", @@ -3595,9 +3570,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.30" +version = "0.38.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "322394588aaf33c24007e8bb3238ee3e4c5c09c084ab32bc73890b99ff326bca" +checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" dependencies = [ "bitflags 2.4.2", "errno", @@ -3614,10 +3589,24 @@ checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" dependencies = [ "log", "ring", - "rustls-webpki", + "rustls-webpki 0.101.7", "sct", ] +[[package]] +name = "rustls" +version = "0.22.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e87c9956bd9807afa1f77e0f7594af32566e830e088a5576d27c5b6f30f49d41" +dependencies = [ + "log", + "ring", + "rustls-pki-types", + "rustls-webpki 0.102.2", + "subtle", + "zeroize", +] + [[package]] name = "rustls-native-certs" version = "0.6.3" @@ -3639,6 +3628,12 @@ dependencies = [ "base64 0.21.7", ] +[[package]] +name = "rustls-pki-types" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "048a63e5b3ac996d78d402940b5fa47973d2d080c6c6fffa1d0f19c4445310b7" + [[package]] name = "rustls-webpki" version = "0.101.7" @@ -3649,6 +3644,17 @@ dependencies = [ "untrusted", ] +[[package]] +name = "rustls-webpki" +version = "0.102.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faaa0a62740bedb9b2ef5afa303da42764c012f743917351dc9a237ea1663610" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + [[package]] name = "rustversion" version = "1.0.14" @@ -3657,9 +3663,9 @@ checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" [[package]] name = "ryu" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" [[package]] name = "same-file" @@ -3756,18 +3762,18 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.21" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" +checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" dependencies = [ "serde", ] [[package]] name = "serde" -version = "1.0.195" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63261df402c67811e9ac6def069e4786148c4563f4b50fd4bf30aa370d626b02" +checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" dependencies = [ "serde_derive", ] @@ -3803,22 +3809,22 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.195" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46fe8f8603d81ba86327b23a2e9cdf49e1255fb94a4c5f297f6ee0547178ea2c" +checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] name = "serde_json" -version = "1.0.111" +version = "1.0.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "176e46fa42316f18edd598015a5166857fc835ec732f5215eac6b7bdbf0a84f4" +checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" dependencies = [ - "indexmap 2.1.0", + "indexmap 2.2.3", "itoa", "ryu", "serde", @@ -3832,7 +3838,7 @@ checksum = "0b2e6b945e9d3df726b65d6ee24060aff8e3533d431f677a9695db04eff9dfdb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] @@ -3853,16 +3859,17 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.5.0" +version = "3.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f58c3a1b3e418f61c25b2aeb43fc6c95eaa252b8cecdda67f401943e9e08d33f" +checksum = "15d167997bd841ec232f5b2b8e0e26606df2e7caa4c31b95ea9ca52b200bd270" dependencies = [ "base64 0.21.7", "chrono", "hex", "serde", + "serde_derive", "serde_json", - "serde_with_macros 3.5.0", + "serde_with_macros 3.6.1", "time", ] @@ -3875,19 +3882,19 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] name = "serde_with_macros" -version = "3.5.0" +version = "3.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2068b437a31fc68f25dd7edc296b078f04b45145c199d8eed9866e45f1ff274" +checksum = "865f9743393e638991566a8b7a479043c2c8da94a33e0a31f18214c9cae0a64d" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] @@ -3967,9 +3974,9 @@ dependencies = [ [[package]] name = "sketches-ddsketch" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68a406c1882ed7f29cd5e248c9848a80e7cb6ae0fea82346d2746f2f941c07e1" +checksum = "85636c14b73d81f541e525f585c0a2109e6744e1565b5c1668e31c70c10ed65c" [[package]] name = "slab" @@ -4038,11 +4045,14 @@ dependencies = [ "bincode 2.0.0-rc.3", "dpp", "drive", + "futures", "hex", "platform-version", "rand", "rocksdb", + "serde_json", "simple-signer", + "tracing", ] [[package]] @@ -4051,6 +4061,12 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +[[package]] +name = "strsim" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01" + [[package]] name = "strum" version = "0.24.1" @@ -4092,7 +4108,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] @@ -4123,9 +4139,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.48" +version = "2.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" +checksum = "74f1bdc9872430ce9b75da68329d1c1746faf50ffac5f19e02b71e37ff881ffb" dependencies = [ "proc-macro2", "quote", @@ -4141,7 +4157,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] @@ -4176,14 +4192,13 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tempfile" -version = "3.9.0" +version = "3.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01ce4141aa927a6d1bd34a041795abd0db1cccba5d5f24b009f694bdf3a1f3fa" +checksum = "a365e8cd18e44762ef95d87f284f4b5cd04107fec2ff3052bd6a3e6069669e67" dependencies = [ "cfg-if", "fastrand 2.0.1", - "redox_syscall", - "rustix 0.38.30", + "rustix 0.38.31", "windows-sys 0.52.0", ] @@ -4229,7 +4244,7 @@ dependencies = [ [[package]] name = "tenderdash-proto" version = "0.14.0-dev.6" -source = "git+https://github.com/dashpay/rs-tenderdash-abci#a2151d40e80d4ce7076160017a6fcbe21d6e252e" +source = "git+https://github.com/dashpay/rs-tenderdash-abci#8b5afe6b653a430941d803f3c729c7c6d073734d" dependencies = [ "bytes", "chrono", @@ -4261,7 +4276,7 @@ dependencies = [ [[package]] name = "tenderdash-proto-compiler" version = "0.14.0-dev.6" -source = "git+https://github.com/dashpay/rs-tenderdash-abci#a2151d40e80d4ce7076160017a6fcbe21d6e252e" +source = "git+https://github.com/dashpay/rs-tenderdash-abci#8b5afe6b653a430941d803f3c729c7c6d073734d" dependencies = [ "fs_extra", "prost-build 0.12.3", @@ -4320,29 +4335,29 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.56" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad" +checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.56" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471" +checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] name = "thread_local" -version = "1.1.7" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" dependencies = [ "cfg-if", "once_cell", @@ -4350,12 +4365,13 @@ dependencies = [ [[package]] name = "time" -version = "0.3.31" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f657ba42c3f86e7680e53c8cd3af8abbe56b5491790b46e22e19c0d57463583e" +checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749" dependencies = [ "deranged", "itoa", + "num-conv", "powerfmt", "serde", "time-core", @@ -4370,10 +4386,11 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26197e33420244aeb70c3e8c78376ca46571bc4e701e4791c2cd9f57dcb3a43f" +checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774" dependencies = [ + "num-conv", "time-core", ] @@ -4404,9 +4421,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.35.1" +version = "1.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104" +checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" dependencies = [ "backtrace", "bytes", @@ -4439,7 +4456,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] @@ -4448,7 +4465,7 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "rustls", + "rustls 0.21.10", "tokio", ] @@ -4502,18 +4519,18 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.1.0", + "indexmap 2.2.3", "toml_datetime", "winnow", ] [[package]] name = "toml_edit" -version = "0.21.0" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03" +checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" dependencies = [ - "indexmap 2.1.0", + "indexmap 2.2.3", "toml_datetime", "winnow", ] @@ -4614,7 +4631,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] @@ -4680,9 +4697,9 @@ dependencies = [ [[package]] name = "treediff" -version = "4.0.2" +version = "4.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52984d277bdf2a751072b5df30ec0377febdb02f7696d64c2d7d54630bac4303" +checksum = "4d127780145176e2b5d16611cc25a900150e86e9fd79d3bde6ff3a37359c9cb5" [[package]] name = "triomphe" @@ -4725,9 +4742,9 @@ checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-normalization" -version = "0.1.22" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" dependencies = [ "tinyvec", ] @@ -4764,16 +4781,17 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "ureq" -version = "2.9.1" +version = "2.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8cdd25c339e200129fe4de81451814e5228c9b771d57378817d6117cc2b3f97" +checksum = "11f214ce18d8b2cbe84ed3aa6486ed3f5b285cf8d8fbdbce9f3f767a724adc35" dependencies = [ "base64 0.21.7", "flate2", "log", "once_cell", - "rustls", - "rustls-webpki", + "rustls 0.22.2", + "rustls-pki-types", + "rustls-webpki 0.102.2", "url", "webpki-roots", ] @@ -4893,7 +4911,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", "wasm-bindgen-shared", ] @@ -4927,7 +4945,7 @@ checksum = "e128beba882dd1eb6200e1dc92ae6c5dbaa4311aa7bb211ca035779e5efc39f8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -4983,9 +5001,12 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.25.3" +version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1778a42e8b3b90bff8d0f5032bf22250792889a5cdc752aa0020c84abe3aaf10" +checksum = "b3de34ae270483955a94f4b21bdaaeb83d508bb84a01435f393818edb0012009" +dependencies = [ + "rustls-pki-types", +] [[package]] name = "which" @@ -4996,7 +5017,7 @@ dependencies = [ "either", "home", "once_cell", - "rustix 0.38.30", + "rustix 0.38.31", ] [[package]] @@ -5173,9 +5194,9 @@ checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" [[package]] name = "winnow" -version = "0.5.34" +version = "0.5.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7cf47b659b318dccbd69cc4797a39ae128f533dce7902a1096044d1967b9c16" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" dependencies = [ "memchr", ] @@ -5225,7 +5246,7 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] diff --git a/packages/rs-dpp/Cargo.toml b/packages/rs-dpp/Cargo.toml index ffb0690fef..d261852b3a 100644 --- a/packages/rs-dpp/Cargo.toml +++ b/packages/rs-dpp/Cargo.toml @@ -12,6 +12,7 @@ authors = [ ] [dependencies] +tracing = "0.1.4" anyhow = { version = "1.0.75" } async-trait = { version = "0.1.68" } base64 = "0.20.0" diff --git a/packages/rs-dpp/src/data_contract/document_type/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/v0/mod.rs index 61b843e1ce..af892015cc 100644 --- a/packages/rs-dpp/src/data_contract/document_type/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/v0/mod.rs @@ -64,3 +64,10 @@ pub struct DocumentTypeV0 { #[cfg(feature = "validation")] pub(in crate::data_contract) json_schema_validator: StatelessJsonSchemaLazyValidator, } + +impl DocumentTypeV0 { + // Public method to set the data_contract_id + pub fn set_data_contract_id(&mut self, new_id: Identifier) { + self.data_contract_id = new_id; + } +} diff --git a/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs b/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs index fc9de48c81..a4362c4bec 100644 --- a/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs +++ b/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs @@ -97,6 +97,7 @@ impl RandomDocumentTypeParameters { } } +use crate::data_contract::document_type::array::ArrayItemType; use crate::data_contract::document_type::index_level::IndexLevel; #[cfg(feature = "validation")] use crate::data_contract::document_type::v0::StatelessJsonSchemaLazyValidator; @@ -108,9 +109,12 @@ use crate::version::PlatformVersion; use crate::ProtocolError; use bincode::{Decode, Encode}; use indexmap::IndexMap; -use platform_value::{Identifier, Value}; +use itertools::Itertools; +use platform_value::Identifier; use rand::rngs::StdRng; +use rand::seq::SliceRandom; use rand::Rng; +use serde_json::json; use std::collections::BTreeSet; use std::ops::Range; @@ -137,17 +141,13 @@ impl DocumentTypeV0 { let random_weight = rng.gen_range(0..total_weight); let document_type = if random_weight < field_weights.string_weight { let has_min_len = rng.gen_bool(parameters.field_bounds.string_has_min_len_chance); - let has_max_len = rng.gen_bool(parameters.field_bounds.string_has_max_len_chance); let min_len = if has_min_len { Some(rng.gen_range(parameters.field_bounds.string_min_len.clone())) } else { None }; - let max_len = if has_max_len { - Some(rng.gen_range(parameters.field_bounds.string_max_len.clone())) - } else { - None - }; + // If a string property is used in an index it must have maxLength 63 or less (v1.0-dev) + let max_len = Some(63); DocumentPropertyType::String(min_len, max_len) } else if random_weight < field_weights.string_weight + field_weights.integer_weight { DocumentPropertyType::Integer @@ -175,19 +175,13 @@ impl DocumentTypeV0 { } else { let has_min_len = rng.gen_bool(parameters.field_bounds.byte_array_has_min_len_chance); - let has_max_len = - rng.gen_bool(parameters.field_bounds.byte_array_has_max_len_chance); let min_len = if has_min_len { Some(rng.gen_range(parameters.field_bounds.byte_array_min_len.clone())) } else { None }; - let max_len = if has_max_len { - Some(rng.gen_range(parameters.field_bounds.byte_array_max_len.clone())) - } else { - None - }; - + // Indexed arrays must have maxItems 255 or less (v1.0-dev) + let max_len = Some(255); DocumentPropertyType::ByteArray(min_len, max_len) }; @@ -218,10 +212,16 @@ impl DocumentTypeV0 { let index_count = rng.gen_range(parameters.new_indexes_count_range.clone()); let field_names: Vec = properties.keys().cloned().collect(); + // DPP only allows 10 properties per index (v1.0-dev) + let ten_field_names = field_names + .choose_multiple(&mut rand::thread_rng(), 10) + .cloned() + .collect_vec(); + let mut indices = Vec::with_capacity(index_count as usize); for _ in 0..index_count { - match Index::random(&field_names, &indices, rng) { + match Index::random(&ten_field_names, &indices, rng) { Ok(index) => indices.push(index), Err(_) => break, } @@ -242,10 +242,166 @@ impl DocumentTypeV0 { .document_type_versions, )?; + // Generate properties JSON schema + let mut position_counter = 0; + let properties_json_schema = properties.iter().map(|(key, prop)| { + let mut schema_part = match &prop.property_type { + DocumentPropertyType::String(min, max) => { + let mut schema = serde_json::Map::new(); + schema.insert("type".to_string(), serde_json::Value::String("string".to_owned())); + if let Some(min_len) = min { + schema.insert("minLength".to_string(), serde_json::Value::Number(serde_json::Number::from(*min_len))); + } + if let Some(max_len) = max { + schema.insert("maxLength".to_string(), serde_json::Value::Number(serde_json::Number::from(*max_len))); + } + serde_json::Value::Object(schema) + }, + DocumentPropertyType::Integer => { + let mut schema = serde_json::Map::new(); + schema.insert("type".to_string(), serde_json::Value::String("integer".to_owned())); + // Add min and max if specified in parameters + let integer_min = parameters.field_bounds.integer_min.start; + let integer_max = parameters.field_bounds.integer_max.end; + schema.insert("minimum".to_string(), serde_json::Value::Number(serde_json::Number::from(integer_min))); + schema.insert("maximum".to_string(), serde_json::Value::Number(serde_json::Number::from(integer_max))); + serde_json::Value::Object(schema) + }, + DocumentPropertyType::Number => { + let mut schema = serde_json::Map::new(); + schema.insert("type".to_string(), serde_json::Value::String("number".to_owned())); + // Add min and max if specified in parameters + let float_min = parameters.field_bounds.float_min.start; + let float_max = parameters.field_bounds.float_max.end; + schema.insert("minimum".to_string(), serde_json::Value::Number(serde_json::Number::from_f64(float_min).unwrap())); + schema.insert("maximum".to_string(), serde_json::Value::Number(serde_json::Number::from_f64(float_max).unwrap())); + serde_json::Value::Object(schema) + }, + DocumentPropertyType::Date => { + let mut schema = serde_json::Map::new(); + schema.insert("type".to_string(), serde_json::Value::String("string".to_owned())); + schema.insert("format".to_string(), serde_json::Value::String("date-time".to_owned())); + // There's a maxLength constraint in DPP, not sure what it is. Just putting 10 for now. + schema.insert("maxLength".to_string(), serde_json::Value::Number(serde_json::Number::from(10))); + serde_json::Value::Object(schema) + }, + DocumentPropertyType::Boolean => { + serde_json::json!({"type": "boolean"}) + }, + DocumentPropertyType::ByteArray(min, max) => { + let mut schema = serde_json::Map::new(); + schema.insert("type".to_string(), serde_json::Value::String("array".to_owned())); + if let Some(min_len) = min { + schema.insert("minItems".to_string(), serde_json::Value::Number(serde_json::Number::from(*min_len))); + } + if let Some(max_len) = max { + schema.insert("maxItems".to_string(), serde_json::Value::Number(serde_json::Number::from(*max_len))); + } + schema.insert("byteArray".to_string(), serde_json::Value::Bool(true)); + serde_json::Value::Object(schema) + }, + DocumentPropertyType::Identifier => { + json!({ + "type": "array", + "items": { + "type": "string", + "pattern": "^[0-9a-fA-F]{64}$" + }, + "minItems": 1, + "maxItems": 1, + "byteArray": true, + }) + }, + DocumentPropertyType::Object(sub_properties) => { + let sub_props_schema = sub_properties.iter().map(|(sub_key, _sub_prop)| { + (sub_key.clone(), serde_json::json!({"type": "string"})) + }).collect::>(); + + json!({ + "type": "object", + "properties": sub_props_schema, + "additionalProperties": false + }) + }, + DocumentPropertyType::Array(item_type) => { + let items_schema = match *item_type { + ArrayItemType::String(min, max) => json!({"type": "string", "minLength": min, "maxLength": max}), + ArrayItemType::Integer => json!({"type": "integer"}), + ArrayItemType::Number => json!({"type": "number"}), + ArrayItemType::ByteArray(min, max) => { + json!({"type": "array", "items": {"type": "byte"}, "minItems": min, "maxItems": max}) + }, + ArrayItemType::Identifier => json!({"type": "array"}), + ArrayItemType::Boolean => json!({"type": "bool"}), + ArrayItemType::Date => json!({"type": "date"}), + }; + + json!({ + "type": "array", + "items": items_schema, + "byteArray": true, + }) + }, + DocumentPropertyType::VariableTypeArray(types) => { + let types_schema = types.iter().map(|t| { + match t { + ArrayItemType::String(_, _) => json!({"type": "string"}), + _ => json!({}) + } + }).collect::>(); + + json!({ + "type": "array", + "items": { + "oneOf": types_schema + } + }) + }, + }; + + if let serde_json::Value::Object(ref mut schema) = schema_part { + schema.insert("position".to_string(), serde_json::Value::Number(serde_json::Number::from(position_counter))); + } + position_counter += 1; + + (key.clone(), schema_part) + }).collect::>(); + + // Generate indices + let indices_json_schema = indices + .iter() + .map(|index| { + let properties_schema = index + .properties + .iter() + .map(|prop| { + // Only "asc" is allowed for now (v1.0-dev) + json!({ ::clone(&prop.name): "asc" }) + }) + .collect::>(); + + json!({ + "name": index.name, + "properties": properties_schema, + "unique": index.unique, + }) + }) + .collect::>(); + + // Combine everything into the final schema + let schema = json!({ + "title": name, + "type": "object", + "properties": properties_json_schema, + "required": required_fields.iter().cloned().collect::>(), + "indices": indices_json_schema, + "additionalProperties": false, + }); + // TODO: It might not work properly Ok(DocumentTypeV0 { name, - schema: Value::Null, + schema: schema.into(), indices, index_structure, flattened_properties: properties.clone(), diff --git a/packages/rs-dpp/src/data_contract/v0/data_contract.rs b/packages/rs-dpp/src/data_contract/v0/data_contract.rs index fbded8629e..6116b2839b 100644 --- a/packages/rs-dpp/src/data_contract/v0/data_contract.rs +++ b/packages/rs-dpp/src/data_contract/v0/data_contract.rs @@ -31,7 +31,7 @@ pub struct DataContractV0 { pub(crate) owner_id: Identifier, /// A mapping of document names to their corresponding document types. - pub(crate) document_types: BTreeMap, + pub document_types: BTreeMap, // TODO: Move metadata from here /// Optional metadata associated with the contract. diff --git a/packages/rs-dpp/src/identity/v0/random.rs b/packages/rs-dpp/src/identity/v0/random.rs index 9e78a878da..2be4a34cfe 100644 --- a/packages/rs-dpp/src/identity/v0/random.rs +++ b/packages/rs-dpp/src/identity/v0/random.rs @@ -57,7 +57,8 @@ impl IdentityV0 { let balance = rng.gen::() >> 20; //around 175 Dash as max let (public_keys, private_keys): (BTreeMap, I) = IdentityPublicKey::main_keys_with_random_authentication_keys_with_private_keys_with_rng( - key_count, rng, + key_count, + rng, platform_version, )? .into_iter() diff --git a/packages/rs-dpp/src/state_transition/mod.rs b/packages/rs-dpp/src/state_transition/mod.rs index 5a288e211d..a94ba43e3a 100644 --- a/packages/rs-dpp/src/state_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/mod.rs @@ -301,7 +301,7 @@ impl StateTransition { call_getter_method_identity_signed!(self, signature_public_key_id) } - /// returns the signature as a byte-array + /// returns the security level requirement for the state transition pub fn security_level_requirement(&self) -> Option> { call_getter_method_identity_signed!(self, security_level_requirement) } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/v0_methods.rs index 35da1d2aec..e6dca9e356 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/v0_methods.rs @@ -1,6 +1,7 @@ use crate::state_transition::data_contract_create_transition::DataContractCreateTransitionV0; use platform_value::Bytes32; +use tracing::info; use crate::{data_contract::DataContract, identity::KeyID, NonConsensusError, ProtocolError}; @@ -33,15 +34,19 @@ impl DataContractCreateTransitionMethodsV0 for DataContractCreateTransitionV0 { identity.id, entropy, )); + data_contract.set_owner_id(identity.id); + let transition = DataContractCreateTransition::V0(DataContractCreateTransitionV0 { data_contract: data_contract.try_into_platform_versioned(platform_version)?, - entropy: Default::default(), + entropy: entropy, // Why was this default before? It would produce a mismatched contract ID error signature_public_key_id: key_id, signature: Default::default(), }); + let mut state_transition: StateTransition = transition.into(); let value = state_transition.signable_bytes()?; + let public_key = identity .loaded_public_keys @@ -57,6 +62,7 @@ impl DataContractCreateTransitionMethodsV0 for DataContractCreateTransitionV0 { "expected security level requirements".to_string(), ), )?; + if !security_level_requirements.contains(&public_key.security_level()) { return Err(ProtocolError::ConsensusError(Box::new( SignatureError::InvalidSignaturePublicKeySecurityLevelError( @@ -69,7 +75,16 @@ impl DataContractCreateTransitionMethodsV0 for DataContractCreateTransitionV0 { ))); } - state_transition.set_signature(signer.sign(public_key, &value)?); + // There was an error here where the public key supplied was not one belonging to the signer. + match signer.sign(public_key, &value) { + Ok(signature) => { + state_transition.set_signature(signature); + } + Err(e) => { + return Err(e); + } + } + Ok(state_transition) } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/v0_methods.rs index 2615ddfc2d..eb55b95f6e 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/v0_methods.rs @@ -17,6 +17,8 @@ use crate::state_transition::public_key_in_creation::IdentityPublicKeyInCreation use crate::state_transition::StateTransition; use crate::version::PlatformVersion; +use tracing::info; + impl IdentityCreateTransitionMethodsV0 for IdentityCreateTransitionV0 { #[cfg(feature = "state-transition-signing")] fn try_from_identity_with_signer( diff --git a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs index 7f1572c24d..760f456852 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs @@ -1,12 +1,16 @@ use crate::masternodes::MasternodeListItemWithUpdates; use crate::query::QueryStrategy; use crate::BlockHeight; - +use dashcore_rpc::dashcore::{self, Network, PrivateKey}; use dashcore_rpc::dashcore::{ProTxHash, QuorumHash}; use dpp::block::block_info::BlockInfo; +use dpp::state_transition::identity_topup_transition::methods::IdentityTopUpTransitionMethodsV0; +use dpp::{NativeBlsModule, ProtocolError}; +use dpp::dashcore::secp256k1::SecretKey; use dpp::data_contract::document_type::random_document::CreateRandomDocument; use dpp::data_contract::DataContract; +use dpp::state_transition::identity_topup_transition::IdentityTopUpTransition; use strategy_tests::frequency::Frequency; use strategy_tests::operations::FinalizeBlockOperation::IdentityAddKeys; use strategy_tests::operations::{ @@ -15,7 +19,7 @@ use strategy_tests::operations::{ use dpp::document::DocumentV0Getters; use dpp::fee::Credits; -use dpp::identity::{Identity, KeyType, Purpose, SecurityLevel}; +use dpp::identity::{Identity, KeyID, KeyType, Purpose, SecurityLevel}; use dpp::serialization::PlatformSerializableWithPlatformVersion; use dpp::state_transition::data_contract_create_transition::DataContractCreateTransition; use dpp::state_transition::data_contract_update_transition::DataContractUpdateTransition; @@ -26,6 +30,7 @@ use drive::drive::flags::StorageFlags::SingleEpoch; use drive::drive::identity::key::fetch::{IdentityKeysRequest, KeyRequestType}; use drive::drive::Drive; +use dpp::identity::KeyType::ECDSA_SECP256K1; use dpp::data_contract::accessors::v0::{DataContractV0Getters, DataContractV0Setters}; use dpp::state_transition::data_contract_update_transition::methods::DataContractUpdateTransitionMethodsV0; use drive::query::DriveQuery; @@ -36,11 +41,13 @@ use drive_abci::rpc::core::MockCoreRPCLike; use rand::prelude::{IteratorRandom, SliceRandom, StdRng}; use rand::Rng; use strategy_tests::Strategy; +use strategy_tests::transitions::{create_state_transitions_for_identities, instant_asset_lock_proof_fixture}; use std::borrow::Cow; use std::collections::{BTreeMap, HashMap, HashSet}; use std::ops::AddAssign; +use std::str::FromStr; use tenderdash_abci::proto::abci::{ExecTxResult, ValidatorSetUpdate}; -use dpp::data_contract::document_type::accessors::{DocumentTypeV0Getters}; +use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::identity::accessors::IdentityGettersV0; use dpp::platform_value::BinaryData; use dpp::prelude::{Identifier, IdentityNonce}; @@ -338,7 +345,7 @@ impl NetworkStrategy { signer: &mut SimpleSigner, rng: &mut StdRng, platform_version: &PlatformVersion, - ) -> Vec<(Identity, StateTransition)> { + ) -> Result, ProtocolError> { let mut state_transitions = vec![]; if block_info.height == 1 && !self.strategy.start_identities.is_empty() { state_transitions.append(&mut self.strategy.start_identities.clone()); @@ -346,17 +353,16 @@ impl NetworkStrategy { let frequency = &self.strategy.identities_inserts; if frequency.check_hit(rng) { let count = frequency.events(rng); - state_transitions.append( - &mut strategy_tests::transitions::create_identities_state_transitions( - count, - 5, - signer, - rng, - platform_version, - ), - ) + let mut new_transitions = NetworkStrategy::create_identities_state_transitions( + count, + 5, + signer, + rng, + platform_version, + ); + state_transitions.append(&mut new_transitions); } - state_transitions + Ok(state_transitions) } pub fn contract_state_transitions( @@ -469,6 +475,535 @@ impl NetworkStrategy { .collect() } + // TODO: this belongs to `DocumentOp`, also randomization details are common for all operations + // and could be moved out of here + pub fn state_transitions_for_block( + &self, + platform: &Platform, + block_info: &BlockInfo, + current_identities: &mut Vec, + signer: &mut SimpleSigner, + identity_nonce_counter: &mut BTreeMap, + contract_nonce_counter: &mut BTreeMap<(Identifier, Identifier), u64>, + rng: &mut StdRng, + platform_version: &PlatformVersion, + ) -> (Vec, Vec) { + let mut operations = vec![]; + let mut finalize_block_operations = vec![]; + let mut replaced = vec![]; + let mut deleted = vec![]; + for op in &self.strategy.operations { + if op.frequency.check_hit(rng) { + let count = rng.gen_range(op.frequency.times_per_block_range.clone()); + match &op.op_type { + OperationType::Document(DocumentOp { + action: DocumentAction::DocumentActionInsertRandom(fill_type, fill_size), + document_type, + contract, + }) => { + let documents = document_type + .random_documents_with_params( + count as u32, + current_identities, + block_info.time_ms, + *fill_type, + *fill_size, + rng, + platform_version, + ) + .expect("expected random_documents_with_params"); + documents + .into_iter() + .for_each(|(document, identity, entropy)| { + let updated_at = + if document_type.required_fields().contains("$updatedAt") { + document.created_at() + } else { + None + }; + + let identity_contract_nonce = contract_nonce_counter + .entry((identity.id(), contract.id())) + .or_default(); + let gap = self + .strategy + .identity_contract_nonce_gaps + .as_ref() + .map_or(0, |gap_amount| gap_amount.events_if_hit(rng)) + as u64; + *identity_contract_nonce += 1 + gap; + + let document_create_transition: DocumentCreateTransition = + DocumentCreateTransitionV0 { + base: DocumentBaseTransitionV0 { + id: document.id(), + identity_contract_nonce: *identity_contract_nonce, + document_type_name: document_type.name().clone(), + data_contract_id: contract.id(), + } + .into(), + entropy: entropy.to_buffer(), + created_at: document.created_at(), + updated_at, + data: document.properties_consumed(), + } + .into(); + + let document_batch_transition: DocumentsBatchTransition = + DocumentsBatchTransitionV0 { + owner_id: identity.id(), + transitions: vec![document_create_transition.into()], + signature_public_key_id: 0, + signature: BinaryData::default(), + } + .into(); + let mut document_batch_transition: StateTransition = + document_batch_transition.into(); + + let identity_public_key = identity + .get_first_public_key_matching( + Purpose::AUTHENTICATION, + HashSet::from([ + SecurityLevel::HIGH, + SecurityLevel::CRITICAL, + ]), + HashSet::from([ + KeyType::ECDSA_SECP256K1, + KeyType::BLS12_381, + ]), + ) + .expect("expected to get a signing key"); + + document_batch_transition + .sign_external( + identity_public_key, + signer, + Some(|_data_contract_id, _document_type_name| { + Ok(SecurityLevel::HIGH) + }), + ) + .expect("expected to sign"); + + operations.push(document_batch_transition); + }); + } + OperationType::Document(DocumentOp { + action: + DocumentAction::DocumentActionInsertSpecific( + specific_document_key_value_pairs, + identifier, + fill_type, + fill_size, + ), + document_type, + contract, + }) => { + let documents = if let Some(identifier) = identifier { + let held_identity = vec![current_identities + .iter() + .find(|identity| identity.id() == identifier) + .expect("expected to find identifier, review strategy params") + .clone()]; + document_type + .random_documents_with_params( + count as u32, + &held_identity, + block_info.time_ms, + *fill_type, + *fill_size, + rng, + platform_version, + ) + .expect("expected random_documents_with_params") + } else { + document_type + .random_documents_with_params( + count as u32, + current_identities, + block_info.time_ms, + *fill_type, + *fill_size, + rng, + platform_version, + ) + .expect("expected random_documents_with_params") + }; + + documents + .into_iter() + .for_each(|(mut document, identity, entropy)| { + document + .properties_mut() + .append(&mut specific_document_key_value_pairs.clone()); + let updated_at = + if document_type.required_fields().contains("$updatedAt") { + document.created_at() + } else { + None + }; + + let identity_contract_nonce = contract_nonce_counter + .entry((identity.id(), contract.id())) + .or_default(); + *identity_contract_nonce += 1; + + let document_create_transition: DocumentCreateTransition = + DocumentCreateTransitionV0 { + base: DocumentBaseTransitionV0 { + id: document.id(), + identity_contract_nonce: *identity_contract_nonce, + document_type_name: document_type.name().clone(), + data_contract_id: contract.id(), + } + .into(), + entropy: entropy.to_buffer(), + created_at: document.created_at(), + updated_at, + data: document.properties_consumed(), + } + .into(); + + let document_batch_transition: DocumentsBatchTransition = + DocumentsBatchTransitionV0 { + owner_id: identity.id(), + transitions: vec![document_create_transition.into()], + signature_public_key_id: 0, + signature: BinaryData::default(), + } + .into(); + let mut document_batch_transition: StateTransition = + document_batch_transition.into(); + + let identity_public_key = identity + .get_first_public_key_matching( + Purpose::AUTHENTICATION, + HashSet::from([ + SecurityLevel::HIGH, + SecurityLevel::CRITICAL, + ]), + HashSet::from([ + KeyType::ECDSA_SECP256K1, + KeyType::BLS12_381, + ]), + ) + .expect("expected to get a signing key"); + + document_batch_transition + .sign_external( + identity_public_key, + signer, + Some(|_data_contract_id, _document_type_name| { + Ok(SecurityLevel::HIGH) + }), + ) + .expect("expected to sign"); + + operations.push(document_batch_transition); + }); + } + OperationType::Document(DocumentOp { + action: DocumentAction::DocumentActionDelete, + document_type, + contract, + }) => { + let any_item_query = + DriveQuery::any_item_query(contract, document_type.as_ref()); + let mut items = platform + .drive + .query_documents( + any_item_query, + Some(&block_info.epoch), + false, + None, + Some(platform_version.protocol_version), + ) + .expect("expect to execute query") + .documents_owned(); + + items.retain(|item| !deleted.contains(&item.id())); + + items.retain(|item| !replaced.contains(&item.id())); + + if !items.is_empty() { + let document = items.remove(0); + + deleted.push(document.id()); + + //todo: fix this into a search key request for the following + //let search_key_request = BTreeMap::from([(Purpose::AUTHENTICATION as u8, BTreeMap::from([(SecurityLevel::HIGH as u8, AllKeysOfKindRequest)]))]); + + let request = IdentityKeysRequest { + identity_id: document.owner_id().to_buffer(), + request_type: KeyRequestType::SpecificKeys(vec![1]), + limit: Some(1), + offset: None, + }; + let identity = platform + .drive + .fetch_identity_balance_with_keys(request, None, platform_version) + .expect("expected to be able to get identity") + .expect("expected to get an identity"); + let identity_contract_nonce = contract_nonce_counter + .get_mut(&(identity.id, contract.id())) + .expect( + "the identity should already have a nonce for that contract", + ); + *identity_contract_nonce += 1; + let document_delete_transition: DocumentDeleteTransition = + DocumentDeleteTransitionV0 { + base: DocumentBaseTransitionV0 { + id: document.id(), + identity_contract_nonce: *identity_contract_nonce, + document_type_name: document_type.name().clone(), + data_contract_id: contract.id(), + } + .into(), + } + .into(); + + let document_batch_transition: DocumentsBatchTransition = + DocumentsBatchTransitionV0 { + owner_id: identity.id, + transitions: vec![document_delete_transition.into()], + signature_public_key_id: 0, + signature: BinaryData::default(), + } + .into(); + + let mut document_batch_transition: StateTransition = + document_batch_transition.into(); + + let identity_public_key = identity + .loaded_public_keys + .values() + .next() + .expect("expected a key"); + + document_batch_transition + .sign_external( + identity_public_key, + signer, + Some(|_data_contract_id, _document_type_name| { + Ok(SecurityLevel::HIGH) + }), + ) + .expect("expected to sign"); + + operations.push(document_batch_transition); + } + } + OperationType::Document(DocumentOp { + action: DocumentAction::DocumentActionReplace, + document_type, + contract, + }) => { + let any_item_query = + DriveQuery::any_item_query(contract, document_type.as_ref()); + let mut items = platform + .drive + .query_documents( + any_item_query, + Some(&block_info.epoch), + false, + None, + Some(platform_version.protocol_version), + ) + .expect("expect to execute query") + .documents_owned(); + + items.retain(|item| !deleted.contains(&item.id())); + + items.retain(|item| !replaced.contains(&item.id())); + + if !items.is_empty() { + let document = items.remove(0); + + replaced.push(document.id()); + + //todo: fix this into a search key request for the following + //let search_key_request = BTreeMap::from([(Purpose::AUTHENTICATION as u8, BTreeMap::from([(SecurityLevel::HIGH as u8, AllKeysOfKindRequest)]))]); + + let random_new_document = document_type + .random_document_with_rng(rng, platform_version) + .unwrap(); + let request = IdentityKeysRequest { + identity_id: document.owner_id().to_buffer(), + request_type: KeyRequestType::SpecificKeys(vec![1]), + limit: Some(1), + offset: None, + }; + let identity = platform + .drive + .fetch_identity_balance_with_keys(request, None, platform_version) + .expect("expected to be able to get identity") + .expect("expected to get an identity"); + let identity_contract_nonce = contract_nonce_counter + .get_mut(&(identity.id, contract.id())) + .expect( + "the identity should already have a nonce for that contract", + ); + *identity_contract_nonce += 1; + let document_replace_transition: DocumentReplaceTransition = + DocumentReplaceTransitionV0 { + base: DocumentBaseTransitionV0 { + id: document.id(), + identity_contract_nonce: *identity_contract_nonce, + document_type_name: document_type.name().clone(), + data_contract_id: contract.id(), + } + .into(), + revision: document + .revision() + .expect("expected to unwrap revision") + + 1, + updated_at: Some(block_info.time_ms), + data: random_new_document.properties_consumed(), + } + .into(); + + let document_batch_transition: DocumentsBatchTransition = + DocumentsBatchTransitionV0 { + owner_id: identity.id, + transitions: vec![document_replace_transition.into()], + signature_public_key_id: 0, + signature: BinaryData::default(), + } + .into(); + + let mut document_batch_transition: StateTransition = + document_batch_transition.into(); + + let identity_public_key = identity + .loaded_public_keys + .values() + .next() + .expect("expected a key"); + + document_batch_transition + .sign_external( + identity_public_key, + signer, + Some(|_data_contract_id, _document_type_name| { + Ok(SecurityLevel::HIGH) + }), + ) + .expect("expected to sign"); + + operations.push(document_batch_transition); + } + } + OperationType::IdentityTopUp if !current_identities.is_empty() => { + let indices: Vec = + (0..current_identities.len()).choose_multiple(rng, count as usize); + let random_identities: Vec<&Identity> = indices + .into_iter() + .map(|index| ¤t_identities[index]) + .collect(); + + for random_identity in random_identities { + operations.push(NetworkStrategy::create_identity_top_up_transition( + rng, + random_identity, + platform_version, + )); + } + } + OperationType::IdentityUpdate(update_op) if !current_identities.is_empty() => { + let indices: Vec = + (0..current_identities.len()).choose_multiple(rng, count as usize); + for index in indices { + let random_identity = current_identities.get_mut(index).unwrap(); + match update_op { + IdentityUpdateOp::IdentityUpdateAddKeys(count) => { + let (state_transition, keys_to_add_at_end_block) = + strategy_tests::transitions::create_identity_update_transition_add_keys( + random_identity, + *count, + identity_nonce_counter, + signer, + rng, + platform_version, + ); + operations.push(state_transition); + finalize_block_operations.push(IdentityAddKeys( + keys_to_add_at_end_block.0, + keys_to_add_at_end_block.1, + )) + } + IdentityUpdateOp::IdentityUpdateDisableKey(count) => { + let state_transition = + strategy_tests::transitions::create_identity_update_transition_disable_keys( + random_identity, + *count, + identity_nonce_counter, + block_info.time_ms, + signer, + rng, + platform_version, + ); + if let Some(state_transition) = state_transition { + operations.push(state_transition); + } + } + } + } + } + OperationType::IdentityWithdrawal if !current_identities.is_empty() => { + let indices: Vec = + (0..current_identities.len()).choose_multiple(rng, count as usize); + for index in indices { + let random_identity = current_identities.get_mut(index).unwrap(); + let state_transition = + strategy_tests::transitions::create_identity_withdrawal_transition( + random_identity, + identity_nonce_counter, + signer, + rng, + ); + operations.push(state_transition); + } + } + OperationType::IdentityTransfer if current_identities.len() > 1 => { + let identities_clone = current_identities.clone(); + + // Sender is the first in the list, which should be loaded_identity + let owner = &mut current_identities[0]; + // Recipient is the second in the list + let recipient = &identities_clone[1]; + + let fetched_owner_balance = platform + .drive + .fetch_identity_balance(owner.id().to_buffer(), None, platform_version) + .expect("expected to be able to get identity") + .expect("expected to get an identity"); + + let state_transition = + strategy_tests::transitions::create_identity_credit_transfer_transition( + owner, + recipient, + identity_nonce_counter, + signer, + fetched_owner_balance - 100, + ); + operations.push(state_transition); + } + // OperationType::ContractCreate(new_fields_optional_count_range, new_fields_required_count_range, new_index_count_range, document_type_count) + // if !current_identities.is_empty() => { + // DataContract::; + // + // DocumentType::random_document() + // } + // OperationType::ContractUpdate(DataContractNewDocumentTypes(count)) + // if !current_identities.is_empty() => { + // + // } + _ => {} + } + } + } + (operations, finalize_block_operations) + } + pub fn state_transitions_for_block_with_new_identities( &mut self, platform: &Platform, @@ -484,11 +1019,20 @@ impl NetworkStrategy { let platform_version = platform_state .current_platform_version() .expect("expected platform version"); - let identity_state_transitions = + + let identity_state_transitions_result = self.identity_state_transitions_for_block(block_info, signer, rng, platform_version); - let (mut new_identities, mut state_transitions): (Vec, Vec) = - identity_state_transitions.into_iter().unzip(); - current_identities.append(&mut new_identities); + + // Handle the Result returned by identity_state_transitions_for_block + let (mut identities, mut state_transitions) = match identity_state_transitions_result { + Ok(transitions) => transitions.into_iter().unzip(), + Err(error) => { + eprintln!("Error creating identity state transitions: {:?}", error); + (vec![], vec![]) + } + }; + + current_identities.append(&mut identities); if block_info.height == 1 { // add contracts on block 1 @@ -497,9 +1041,9 @@ impl NetworkStrategy { state_transitions.append(&mut contract_state_transitions); } else { // Don't do any state transitions on block 1 - let (mut document_state_transitions, mut add_to_finalize_block_operations) = - self.strategy.state_transitions_for_block( - &platform.drive, + let (mut document_state_transitions, mut add_to_finalize_block_operations) = self + .state_transitions_for_block( + &platform, block_info, current_identities, signer, @@ -525,6 +1069,49 @@ impl NetworkStrategy { (state_transitions, finalize_block_operations) } + + // add this because strategy tests library now requires a callback and uses the actual chain. + fn create_identities_state_transitions( + count: u16, + key_count: KeyID, + signer: &mut SimpleSigner, + rng: &mut StdRng, + platform_version: &PlatformVersion, + ) -> Vec<(Identity, StateTransition)> { + let (identities, keys) = Identity::random_identities_with_private_keys_with_rng::>( + count, + key_count, + rng, + platform_version, + ) + .expect("expected to create identities"); + signer.add_keys(keys); + create_state_transitions_for_identities(identities, signer, rng, platform_version) + } + + // add this because strategy tests library now requires a callback and uses the actual chain. + fn create_identity_top_up_transition( + rng: &mut StdRng, + identity: &Identity, + platform_version: &PlatformVersion, + ) -> StateTransition { + let (_, pk) = ECDSA_SECP256K1 + .random_public_and_private_key_data(rng, platform_version) + .unwrap(); + let sk: [u8; 32] = pk.try_into().unwrap(); + let secret_key = SecretKey::from_str(hex::encode(sk).as_str()).unwrap(); + let asset_lock_proof = + instant_asset_lock_proof_fixture(PrivateKey::new(secret_key, Network::Dash)); + + IdentityTopUpTransition::try_from_identity( + identity, + asset_lock_proof, + secret_key.as_ref(), + platform_version, + None, + ) + .expect("expected to create top up transition") + } } pub enum StrategyRandomness { diff --git a/packages/rs-drive/Cargo.toml b/packages/rs-drive/Cargo.toml index 61f5d56ea9..3a232fcf6d 100644 --- a/packages/rs-drive/Cargo.toml +++ b/packages/rs-drive/Cargo.toml @@ -20,7 +20,7 @@ ciborium = { git = "https://github.com/qrayven/ciborium", branch = "feat-ser-nul integer-encoding = { version = "4.0.0" } rand = { version = "0.8.4", features = ["small_rng"] } byteorder = { version = "1.4.3" } -indexmap = { version = "1.8.0" } +indexmap = { version = "2.0.2" } sqlparser = { version = "0.38.0" } thiserror = { version = "1.0.30" } moka = { version = "0.11.1", features = ["future", "futures-util"] } @@ -38,11 +38,11 @@ serde_json = { version = "1.0", features = ["preserve_order"], optional = true } enum-map = { version = "2.0.3", optional = true } intmap = { version = "2.0.0", features = ["serde"], optional = true } chrono = { version = "0.4.20", optional = true } -itertools = { version = "0.10.5", optional = true } -grovedb = { git = "https://github.com/dashpay/grovedb", rev = "b40dd1a35f852c81caeda2d3c2910c40fae3a67f", optional = true } -grovedb-costs = { git = "https://github.com/dashpay/grovedb", rev = "b40dd1a35f852c81caeda2d3c2910c40fae3a67f", optional = true } -grovedb-path = { git = "https://github.com/dashpay/grovedb", rev = "b40dd1a35f852c81caeda2d3c2910c40fae3a67f" } -grovedb-storage = { git = "https://github.com/dashpay/grovedb", rev = "b40dd1a35f852c81caeda2d3c2910c40fae3a67f", optional = true } +itertools = { version = "0.11.0", optional = true } +grovedb = { git = "https://github.com/dashpay/grovedb", rev = "d007bed7544bf837bdf155e696a530b90d5f82e5", optional = true } +grovedb-costs = { git = "https://github.com/dashpay/grovedb", rev = "d007bed7544bf837bdf155e696a530b90d5f82e5", optional = true } +grovedb-path = { git = "https://github.com/dashpay/grovedb", rev = "d007bed7544bf837bdf155e696a530b90d5f82e5" } +grovedb-storage = { git = "https://github.com/dashpay/grovedb", rev = "d007bed7544bf837bdf155e696a530b90d5f82e5", optional = true } [dev-dependencies] anyhow = { version = "1.0.75" } diff --git a/packages/rs-platform-serialization-derive/rustc-ice-2024-02-20T10_33_46-3251.txt b/packages/rs-platform-serialization-derive/rustc-ice-2024-02-20T10_33_46-3251.txt new file mode 100644 index 0000000000..2bf8ae6a83 --- /dev/null +++ b/packages/rs-platform-serialization-derive/rustc-ice-2024-02-20T10_33_46-3251.txt @@ -0,0 +1,58 @@ +thread 'cpy ebti8ycrnjshmsw' panicked at /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs:913:44: +no saved object file in work product +stack backtrace: + 0: 0x105792da8 - std::backtrace::Backtrace::create::h8af6f7a25d8a3749 + 1: 0x10dec6208 - as core[18650a1770591c75]::ops::function::Fn<(&dyn for<'a, 'b> core[18650a1770591c75]::ops::function::Fn<(&'a core[18650a1770591c75]::panic::panic_info::PanicInfo<'b>,), Output = ()> + core[18650a1770591c75]::marker::Sync + core[18650a1770591c75]::marker::Send, &core[18650a1770591c75]::panic::panic_info::PanicInfo)>>::call + 2: 0x1057ab528 - std::panicking::rust_panic_with_hook::h1e70c5d905e30e9d + 3: 0x1057ab2e4 - std::panicking::begin_panic_handler::{{closure}}::h399e32952efd26a4 + 4: 0x1057a8a18 - std::sys_common::backtrace::__rust_end_short_backtrace::h2ab87f841a2323e7 + 5: 0x1057ab06c - _rust_begin_unwind + 6: 0x105804bd0 - core::panicking::panic_fmt::h33e40d2a93cab78f + 7: 0x105804b9c - core::option::expect_failed::h8c59d9d921ed2136 + 8: 0x10e1603ec - rustc_codegen_ssa[b392610c019ec31b]::back::write::execute_copy_from_cache_work_item:: + 9: 0x10e142508 - std[fcd23fca98dce159]::sys_common::backtrace::__rust_begin_short_backtrace::<::spawn_named_thread::{closure#0}, ()>::{closure#0}, ()> + 10: 0x10e161244 - <::spawn_unchecked_<::spawn_named_thread::{closure#0}, ()>::{closure#0}, ()>::{closure#1} as core[18650a1770591c75]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0} + 11: 0x1057b37d0 - std::sys::unix::thread::Thread::new::thread_start::h8dda2af345bab446 + 12: 0x1813c506c - __pthread_deallocate + + +rustc version: 1.76.0 (07dca489a 2024-02-04) +platform: aarch64-apple-darwinthread 'coordinator' panicked at compiler/rustc_middle/src/util/bug.rs:36:26: +/rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs:1586:29: worker thread panicked +stack backtrace: + 0: 0x105792da8 - std::backtrace::Backtrace::create::h8af6f7a25d8a3749 + 1: 0x10dec6208 - as core[18650a1770591c75]::ops::function::Fn<(&dyn for<'a, 'b> core[18650a1770591c75]::ops::function::Fn<(&'a core[18650a1770591c75]::panic::panic_info::PanicInfo<'b>,), Output = ()> + core[18650a1770591c75]::marker::Sync + core[18650a1770591c75]::marker::Send, &core[18650a1770591c75]::panic::panic_info::PanicInfo)>>::call + 2: 0x1057ab528 - std::panicking::rust_panic_with_hook::h1e70c5d905e30e9d + 3: 0x112041168 - std[fcd23fca98dce159]::panicking::begin_panic::::{closure#0} + 4: 0x1120410ec - std[fcd23fca98dce159]::sys_common::backtrace::__rust_end_short_backtrace::::{closure#0}, !> + 5: 0x1125da040 - std[fcd23fca98dce159]::panicking::begin_panic:: + 6: 0x111fba9f4 - rustc_middle[35a781f9bda42497]::util::bug::opt_span_bug_fmt::::{closure#0} + 7: 0x111fb1c14 - rustc_middle[35a781f9bda42497]::ty::context::tls::with_opt::::{closure#0}, !>::{closure#0} + 8: 0x111fb1be0 - rustc_middle[35a781f9bda42497]::ty::context::tls::with_context_opt::::{closure#0}, !>::{closure#0}, !> + 9: 0x1125d53c4 - rustc_middle[35a781f9bda42497]::util::bug::bug_fmt + 10: 0x10e144270 - std[fcd23fca98dce159]::sys_common::backtrace::__rust_begin_short_backtrace::<::spawn_named_thread::{closure#5}, core[18650a1770591c75]::result::Result>::{closure#0}, core[18650a1770591c75]::result::Result> + 11: 0x10e16151c - <::spawn_unchecked_<::spawn_named_thread::{closure#5}, core[18650a1770591c75]::result::Result>::{closure#0}, core[18650a1770591c75]::result::Result>::{closure#1} as core[18650a1770591c75]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0} + 12: 0x1057b37d0 - std::sys::unix::thread::Thread::new::thread_start::h8dda2af345bab446 + 13: 0x1813c506c - __pthread_deallocate +thread 'rustc' panicked at compiler/rustc_middle/src/util/bug.rs:36:26: +/rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs:1959:17: panic during codegen/LLVM phase +stack backtrace: + 0: 0x105792da8 - std::backtrace::Backtrace::create::h8af6f7a25d8a3749 + 1: 0x10dec6208 - as core[18650a1770591c75]::ops::function::Fn<(&dyn for<'a, 'b> core[18650a1770591c75]::ops::function::Fn<(&'a core[18650a1770591c75]::panic::panic_info::PanicInfo<'b>,), Output = ()> + core[18650a1770591c75]::marker::Sync + core[18650a1770591c75]::marker::Send, &core[18650a1770591c75]::panic::panic_info::PanicInfo)>>::call + 2: 0x1057ab528 - std::panicking::rust_panic_with_hook::h1e70c5d905e30e9d + 3: 0x112041168 - std[fcd23fca98dce159]::panicking::begin_panic::::{closure#0} + 4: 0x1120410ec - std[fcd23fca98dce159]::sys_common::backtrace::__rust_end_short_backtrace::::{closure#0}, !> + 5: 0x1125da040 - std[fcd23fca98dce159]::panicking::begin_panic:: + 6: 0x111fba9f4 - rustc_middle[35a781f9bda42497]::util::bug::opt_span_bug_fmt::::{closure#0} + 7: 0x111fb1c14 - rustc_middle[35a781f9bda42497]::ty::context::tls::with_opt::::{closure#0}, !>::{closure#0} + 8: 0x111fb1be0 - rustc_middle[35a781f9bda42497]::ty::context::tls::with_context_opt::::{closure#0}, !>::{closure#0}, !> + 9: 0x1125d53c4 - rustc_middle[35a781f9bda42497]::util::bug::bug_fmt + 10: 0x10e13df48 - ::time::>::join::{closure#0}> + 11: 0x10e163284 - >::join + 12: 0x10e152d48 - ::join_codegen + 13: 0x10e06e64c - ::link + 14: 0x10deb311c - rustc_span[d844dabcc0d15e78]::create_session_globals_then::, rustc_interface[9ecbacebda51131]::interface::run_compiler, rustc_driver_impl[d723ad74a265baf3]::run_compiler::{closure#0}>::{closure#0}> + 15: 0x10dee9628 - std[fcd23fca98dce159]::sys_common::backtrace::__rust_begin_short_backtrace::, rustc_driver_impl[d723ad74a265baf3]::run_compiler::{closure#0}>::{closure#0}, core[18650a1770591c75]::result::Result<(), rustc_span[d844dabcc0d15e78]::ErrorGuaranteed>>::{closure#0}::{closure#0}, core[18650a1770591c75]::result::Result<(), rustc_span[d844dabcc0d15e78]::ErrorGuaranteed>> + 16: 0x10debbd7c - <::spawn_unchecked_, rustc_driver_impl[d723ad74a265baf3]::run_compiler::{closure#0}>::{closure#0}, core[18650a1770591c75]::result::Result<(), rustc_span[d844dabcc0d15e78]::ErrorGuaranteed>>::{closure#0}::{closure#0}, core[18650a1770591c75]::result::Result<(), rustc_span[d844dabcc0d15e78]::ErrorGuaranteed>>::{closure#1} as core[18650a1770591c75]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0} + 17: 0x1057b37d0 - std::sys::unix::thread::Thread::new::thread_start::h8dda2af345bab446 + 18: 0x1813c506c - __pthread_deallocate diff --git a/packages/rs-platform-serialization-derive/rustc-ice-2024-02-20T10_35_00-10108.txt b/packages/rs-platform-serialization-derive/rustc-ice-2024-02-20T10_35_00-10108.txt new file mode 100644 index 0000000000..d5294ffb6b --- /dev/null +++ b/packages/rs-platform-serialization-derive/rustc-ice-2024-02-20T10_35_00-10108.txt @@ -0,0 +1,58 @@ +thread 'cpy ebti8ycrnjshmsw' panicked at /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs:913:44: +no saved object file in work product +stack backtrace: + 0: 0x103aeeda8 - std::backtrace::Backtrace::create::h8af6f7a25d8a3749 + 1: 0x10c222208 - as core[18650a1770591c75]::ops::function::Fn<(&dyn for<'a, 'b> core[18650a1770591c75]::ops::function::Fn<(&'a core[18650a1770591c75]::panic::panic_info::PanicInfo<'b>,), Output = ()> + core[18650a1770591c75]::marker::Sync + core[18650a1770591c75]::marker::Send, &core[18650a1770591c75]::panic::panic_info::PanicInfo)>>::call + 2: 0x103b07528 - std::panicking::rust_panic_with_hook::h1e70c5d905e30e9d + 3: 0x103b072e4 - std::panicking::begin_panic_handler::{{closure}}::h399e32952efd26a4 + 4: 0x103b04a18 - std::sys_common::backtrace::__rust_end_short_backtrace::h2ab87f841a2323e7 + 5: 0x103b0706c - _rust_begin_unwind + 6: 0x103b60bd0 - core::panicking::panic_fmt::h33e40d2a93cab78f + 7: 0x103b60b9c - core::option::expect_failed::h8c59d9d921ed2136 + 8: 0x10c4bc3ec - rustc_codegen_ssa[b392610c019ec31b]::back::write::execute_copy_from_cache_work_item:: + 9: 0x10c49e508 - std[fcd23fca98dce159]::sys_common::backtrace::__rust_begin_short_backtrace::<::spawn_named_thread::{closure#0}, ()>::{closure#0}, ()> + 10: 0x10c4bd244 - <::spawn_unchecked_<::spawn_named_thread::{closure#0}, ()>::{closure#0}, ()>::{closure#1} as core[18650a1770591c75]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0} + 11: 0x103b0f7d0 - std::sys::unix::thread::Thread::new::thread_start::h8dda2af345bab446 + 12: 0x1813c506c - __pthread_deallocate + + +rustc version: 1.76.0 (07dca489a 2024-02-04) +platform: aarch64-apple-darwinthread 'coordinator' panicked at compiler/rustc_middle/src/util/bug.rs:36:26: +/rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs:1586:29: worker thread panicked +stack backtrace: + 0: 0x103aeeda8 - std::backtrace::Backtrace::create::h8af6f7a25d8a3749 + 1: 0x10c222208 - as core[18650a1770591c75]::ops::function::Fn<(&dyn for<'a, 'b> core[18650a1770591c75]::ops::function::Fn<(&'a core[18650a1770591c75]::panic::panic_info::PanicInfo<'b>,), Output = ()> + core[18650a1770591c75]::marker::Sync + core[18650a1770591c75]::marker::Send, &core[18650a1770591c75]::panic::panic_info::PanicInfo)>>::call + 2: 0x103b07528 - std::panicking::rust_panic_with_hook::h1e70c5d905e30e9d + 3: 0x11039d168 - std[fcd23fca98dce159]::panicking::begin_panic::::{closure#0} + 4: 0x11039d0ec - std[fcd23fca98dce159]::sys_common::backtrace::__rust_end_short_backtrace::::{closure#0}, !> + 5: 0x110936040 - std[fcd23fca98dce159]::panicking::begin_panic:: + 6: 0x1103169f4 - rustc_middle[35a781f9bda42497]::util::bug::opt_span_bug_fmt::::{closure#0} + 7: 0x11030dc14 - rustc_middle[35a781f9bda42497]::ty::context::tls::with_opt::::{closure#0}, !>::{closure#0} + 8: 0x11030dbe0 - rustc_middle[35a781f9bda42497]::ty::context::tls::with_context_opt::::{closure#0}, !>::{closure#0}, !> + 9: 0x1109313c4 - rustc_middle[35a781f9bda42497]::util::bug::bug_fmt + 10: 0x10c4a0270 - std[fcd23fca98dce159]::sys_common::backtrace::__rust_begin_short_backtrace::<::spawn_named_thread::{closure#5}, core[18650a1770591c75]::result::Result>::{closure#0}, core[18650a1770591c75]::result::Result> + 11: 0x10c4bd51c - <::spawn_unchecked_<::spawn_named_thread::{closure#5}, core[18650a1770591c75]::result::Result>::{closure#0}, core[18650a1770591c75]::result::Result>::{closure#1} as core[18650a1770591c75]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0} + 12: 0x103b0f7d0 - std::sys::unix::thread::Thread::new::thread_start::h8dda2af345bab446 + 13: 0x1813c506c - __pthread_deallocate +thread 'rustc' panicked at compiler/rustc_middle/src/util/bug.rs:36:26: +/rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs:1959:17: panic during codegen/LLVM phase +stack backtrace: + 0: 0x103aeeda8 - std::backtrace::Backtrace::create::h8af6f7a25d8a3749 + 1: 0x10c222208 - as core[18650a1770591c75]::ops::function::Fn<(&dyn for<'a, 'b> core[18650a1770591c75]::ops::function::Fn<(&'a core[18650a1770591c75]::panic::panic_info::PanicInfo<'b>,), Output = ()> + core[18650a1770591c75]::marker::Sync + core[18650a1770591c75]::marker::Send, &core[18650a1770591c75]::panic::panic_info::PanicInfo)>>::call + 2: 0x103b07528 - std::panicking::rust_panic_with_hook::h1e70c5d905e30e9d + 3: 0x11039d168 - std[fcd23fca98dce159]::panicking::begin_panic::::{closure#0} + 4: 0x11039d0ec - std[fcd23fca98dce159]::sys_common::backtrace::__rust_end_short_backtrace::::{closure#0}, !> + 5: 0x110936040 - std[fcd23fca98dce159]::panicking::begin_panic:: + 6: 0x1103169f4 - rustc_middle[35a781f9bda42497]::util::bug::opt_span_bug_fmt::::{closure#0} + 7: 0x11030dc14 - rustc_middle[35a781f9bda42497]::ty::context::tls::with_opt::::{closure#0}, !>::{closure#0} + 8: 0x11030dbe0 - rustc_middle[35a781f9bda42497]::ty::context::tls::with_context_opt::::{closure#0}, !>::{closure#0}, !> + 9: 0x1109313c4 - rustc_middle[35a781f9bda42497]::util::bug::bug_fmt + 10: 0x10c499f48 - ::time::>::join::{closure#0}> + 11: 0x10c4bf284 - >::join + 12: 0x10c4aed48 - ::join_codegen + 13: 0x10c3ca64c - ::link + 14: 0x10c20f11c - rustc_span[d844dabcc0d15e78]::create_session_globals_then::, rustc_interface[9ecbacebda51131]::interface::run_compiler, rustc_driver_impl[d723ad74a265baf3]::run_compiler::{closure#0}>::{closure#0}> + 15: 0x10c245628 - std[fcd23fca98dce159]::sys_common::backtrace::__rust_begin_short_backtrace::, rustc_driver_impl[d723ad74a265baf3]::run_compiler::{closure#0}>::{closure#0}, core[18650a1770591c75]::result::Result<(), rustc_span[d844dabcc0d15e78]::ErrorGuaranteed>>::{closure#0}::{closure#0}, core[18650a1770591c75]::result::Result<(), rustc_span[d844dabcc0d15e78]::ErrorGuaranteed>> + 16: 0x10c217d7c - <::spawn_unchecked_, rustc_driver_impl[d723ad74a265baf3]::run_compiler::{closure#0}>::{closure#0}, core[18650a1770591c75]::result::Result<(), rustc_span[d844dabcc0d15e78]::ErrorGuaranteed>>::{closure#0}::{closure#0}, core[18650a1770591c75]::result::Result<(), rustc_span[d844dabcc0d15e78]::ErrorGuaranteed>>::{closure#1} as core[18650a1770591c75]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0} + 17: 0x103b0f7d0 - std::sys::unix::thread::Thread::new::thread_start::h8dda2af345bab446 + 18: 0x1813c506c - __pthread_deallocate diff --git a/packages/rs-platform-serialization-derive/rustc-ice-2024-02-20T10_35_04-10384.txt b/packages/rs-platform-serialization-derive/rustc-ice-2024-02-20T10_35_04-10384.txt new file mode 100644 index 0000000000..e63382aedb --- /dev/null +++ b/packages/rs-platform-serialization-derive/rustc-ice-2024-02-20T10_35_04-10384.txt @@ -0,0 +1,58 @@ +thread 'cpy ebti8ycrnjshmsw' panicked at /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs:913:44: +no saved object file in work product +stack backtrace: + 0: 0x100dfeda8 - std::backtrace::Backtrace::create::h8af6f7a25d8a3749 + 1: 0x109532208 - as core[18650a1770591c75]::ops::function::Fn<(&dyn for<'a, 'b> core[18650a1770591c75]::ops::function::Fn<(&'a core[18650a1770591c75]::panic::panic_info::PanicInfo<'b>,), Output = ()> + core[18650a1770591c75]::marker::Sync + core[18650a1770591c75]::marker::Send, &core[18650a1770591c75]::panic::panic_info::PanicInfo)>>::call + 2: 0x100e17528 - std::panicking::rust_panic_with_hook::h1e70c5d905e30e9d + 3: 0x100e172e4 - std::panicking::begin_panic_handler::{{closure}}::h399e32952efd26a4 + 4: 0x100e14a18 - std::sys_common::backtrace::__rust_end_short_backtrace::h2ab87f841a2323e7 + 5: 0x100e1706c - _rust_begin_unwind + 6: 0x100e70bd0 - core::panicking::panic_fmt::h33e40d2a93cab78f + 7: 0x100e70b9c - core::option::expect_failed::h8c59d9d921ed2136 + 8: 0x1097cc3ec - rustc_codegen_ssa[b392610c019ec31b]::back::write::execute_copy_from_cache_work_item:: + 9: 0x1097ae508 - std[fcd23fca98dce159]::sys_common::backtrace::__rust_begin_short_backtrace::<::spawn_named_thread::{closure#0}, ()>::{closure#0}, ()> + 10: 0x1097cd244 - <::spawn_unchecked_<::spawn_named_thread::{closure#0}, ()>::{closure#0}, ()>::{closure#1} as core[18650a1770591c75]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0} + 11: 0x100e1f7d0 - std::sys::unix::thread::Thread::new::thread_start::h8dda2af345bab446 + 12: 0x1813c506c - __pthread_deallocate + + +rustc version: 1.76.0 (07dca489a 2024-02-04) +platform: aarch64-apple-darwinthread 'coordinator' panicked at compiler/rustc_middle/src/util/bug.rs:36:26: +/rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs:1586:29: worker thread panicked +stack backtrace: + 0: 0x100dfeda8 - std::backtrace::Backtrace::create::h8af6f7a25d8a3749 + 1: 0x109532208 - as core[18650a1770591c75]::ops::function::Fn<(&dyn for<'a, 'b> core[18650a1770591c75]::ops::function::Fn<(&'a core[18650a1770591c75]::panic::panic_info::PanicInfo<'b>,), Output = ()> + core[18650a1770591c75]::marker::Sync + core[18650a1770591c75]::marker::Send, &core[18650a1770591c75]::panic::panic_info::PanicInfo)>>::call + 2: 0x100e17528 - std::panicking::rust_panic_with_hook::h1e70c5d905e30e9d + 3: 0x10d6ad168 - std[fcd23fca98dce159]::panicking::begin_panic::::{closure#0} + 4: 0x10d6ad0ec - std[fcd23fca98dce159]::sys_common::backtrace::__rust_end_short_backtrace::::{closure#0}, !> + 5: 0x10dc46040 - std[fcd23fca98dce159]::panicking::begin_panic:: + 6: 0x10d6269f4 - rustc_middle[35a781f9bda42497]::util::bug::opt_span_bug_fmt::::{closure#0} + 7: 0x10d61dc14 - rustc_middle[35a781f9bda42497]::ty::context::tls::with_opt::::{closure#0}, !>::{closure#0} + 8: 0x10d61dbe0 - rustc_middle[35a781f9bda42497]::ty::context::tls::with_context_opt::::{closure#0}, !>::{closure#0}, !> + 9: 0x10dc413c4 - rustc_middle[35a781f9bda42497]::util::bug::bug_fmt + 10: 0x1097b0270 - std[fcd23fca98dce159]::sys_common::backtrace::__rust_begin_short_backtrace::<::spawn_named_thread::{closure#5}, core[18650a1770591c75]::result::Result>::{closure#0}, core[18650a1770591c75]::result::Result> + 11: 0x1097cd51c - <::spawn_unchecked_<::spawn_named_thread::{closure#5}, core[18650a1770591c75]::result::Result>::{closure#0}, core[18650a1770591c75]::result::Result>::{closure#1} as core[18650a1770591c75]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0} + 12: 0x100e1f7d0 - std::sys::unix::thread::Thread::new::thread_start::h8dda2af345bab446 + 13: 0x1813c506c - __pthread_deallocate +thread 'rustc' panicked at compiler/rustc_middle/src/util/bug.rs:36:26: +/rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs:1959:17: panic during codegen/LLVM phase +stack backtrace: + 0: 0x100dfeda8 - std::backtrace::Backtrace::create::h8af6f7a25d8a3749 + 1: 0x109532208 - as core[18650a1770591c75]::ops::function::Fn<(&dyn for<'a, 'b> core[18650a1770591c75]::ops::function::Fn<(&'a core[18650a1770591c75]::panic::panic_info::PanicInfo<'b>,), Output = ()> + core[18650a1770591c75]::marker::Sync + core[18650a1770591c75]::marker::Send, &core[18650a1770591c75]::panic::panic_info::PanicInfo)>>::call + 2: 0x100e17528 - std::panicking::rust_panic_with_hook::h1e70c5d905e30e9d + 3: 0x10d6ad168 - std[fcd23fca98dce159]::panicking::begin_panic::::{closure#0} + 4: 0x10d6ad0ec - std[fcd23fca98dce159]::sys_common::backtrace::__rust_end_short_backtrace::::{closure#0}, !> + 5: 0x10dc46040 - std[fcd23fca98dce159]::panicking::begin_panic:: + 6: 0x10d6269f4 - rustc_middle[35a781f9bda42497]::util::bug::opt_span_bug_fmt::::{closure#0} + 7: 0x10d61dc14 - rustc_middle[35a781f9bda42497]::ty::context::tls::with_opt::::{closure#0}, !>::{closure#0} + 8: 0x10d61dbe0 - rustc_middle[35a781f9bda42497]::ty::context::tls::with_context_opt::::{closure#0}, !>::{closure#0}, !> + 9: 0x10dc413c4 - rustc_middle[35a781f9bda42497]::util::bug::bug_fmt + 10: 0x1097a9f48 - ::time::>::join::{closure#0}> + 11: 0x1097cf284 - >::join + 12: 0x1097bed48 - ::join_codegen + 13: 0x1096da64c - ::link + 14: 0x10951f11c - rustc_span[d844dabcc0d15e78]::create_session_globals_then::, rustc_interface[9ecbacebda51131]::interface::run_compiler, rustc_driver_impl[d723ad74a265baf3]::run_compiler::{closure#0}>::{closure#0}> + 15: 0x109555628 - std[fcd23fca98dce159]::sys_common::backtrace::__rust_begin_short_backtrace::, rustc_driver_impl[d723ad74a265baf3]::run_compiler::{closure#0}>::{closure#0}, core[18650a1770591c75]::result::Result<(), rustc_span[d844dabcc0d15e78]::ErrorGuaranteed>>::{closure#0}::{closure#0}, core[18650a1770591c75]::result::Result<(), rustc_span[d844dabcc0d15e78]::ErrorGuaranteed>> + 16: 0x109527d7c - <::spawn_unchecked_, rustc_driver_impl[d723ad74a265baf3]::run_compiler::{closure#0}>::{closure#0}, core[18650a1770591c75]::result::Result<(), rustc_span[d844dabcc0d15e78]::ErrorGuaranteed>>::{closure#0}::{closure#0}, core[18650a1770591c75]::result::Result<(), rustc_span[d844dabcc0d15e78]::ErrorGuaranteed>>::{closure#1} as core[18650a1770591c75]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0} + 17: 0x100e1f7d0 - std::sys::unix::thread::Thread::new::thread_start::h8dda2af345bab446 + 18: 0x1813c506c - __pthread_deallocate diff --git a/packages/rs-platform-serialization-derive/rustc-ice-2024-02-20T10_35_08-10643.txt b/packages/rs-platform-serialization-derive/rustc-ice-2024-02-20T10_35_08-10643.txt new file mode 100644 index 0000000000..c9bc88270b --- /dev/null +++ b/packages/rs-platform-serialization-derive/rustc-ice-2024-02-20T10_35_08-10643.txt @@ -0,0 +1,58 @@ +thread 'cpy ebti8ycrnjshmsw' panicked at /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs:913:44: +no saved object file in work product +stack backtrace: + 0: 0x1036e6da8 - std::backtrace::Backtrace::create::h8af6f7a25d8a3749 + 1: 0x10be1a208 - as core[18650a1770591c75]::ops::function::Fn<(&dyn for<'a, 'b> core[18650a1770591c75]::ops::function::Fn<(&'a core[18650a1770591c75]::panic::panic_info::PanicInfo<'b>,), Output = ()> + core[18650a1770591c75]::marker::Sync + core[18650a1770591c75]::marker::Send, &core[18650a1770591c75]::panic::panic_info::PanicInfo)>>::call + 2: 0x1036ff528 - std::panicking::rust_panic_with_hook::h1e70c5d905e30e9d + 3: 0x1036ff2e4 - std::panicking::begin_panic_handler::{{closure}}::h399e32952efd26a4 + 4: 0x1036fca18 - std::sys_common::backtrace::__rust_end_short_backtrace::h2ab87f841a2323e7 + 5: 0x1036ff06c - _rust_begin_unwind + 6: 0x103758bd0 - core::panicking::panic_fmt::h33e40d2a93cab78f + 7: 0x103758b9c - core::option::expect_failed::h8c59d9d921ed2136 + 8: 0x10c0b43ec - rustc_codegen_ssa[b392610c019ec31b]::back::write::execute_copy_from_cache_work_item:: + 9: 0x10c096508 - std[fcd23fca98dce159]::sys_common::backtrace::__rust_begin_short_backtrace::<::spawn_named_thread::{closure#0}, ()>::{closure#0}, ()> + 10: 0x10c0b5244 - <::spawn_unchecked_<::spawn_named_thread::{closure#0}, ()>::{closure#0}, ()>::{closure#1} as core[18650a1770591c75]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0} + 11: 0x1037077d0 - std::sys::unix::thread::Thread::new::thread_start::h8dda2af345bab446 + 12: 0x1813c506c - __pthread_deallocate + + +rustc version: 1.76.0 (07dca489a 2024-02-04) +platform: aarch64-apple-darwinthread 'coordinator' panicked at compiler/rustc_middle/src/util/bug.rs:36:26: +/rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs:1586:29: worker thread panicked +stack backtrace: + 0: 0x1036e6da8 - std::backtrace::Backtrace::create::h8af6f7a25d8a3749 + 1: 0x10be1a208 - as core[18650a1770591c75]::ops::function::Fn<(&dyn for<'a, 'b> core[18650a1770591c75]::ops::function::Fn<(&'a core[18650a1770591c75]::panic::panic_info::PanicInfo<'b>,), Output = ()> + core[18650a1770591c75]::marker::Sync + core[18650a1770591c75]::marker::Send, &core[18650a1770591c75]::panic::panic_info::PanicInfo)>>::call + 2: 0x1036ff528 - std::panicking::rust_panic_with_hook::h1e70c5d905e30e9d + 3: 0x10ff95168 - std[fcd23fca98dce159]::panicking::begin_panic::::{closure#0} + 4: 0x10ff950ec - std[fcd23fca98dce159]::sys_common::backtrace::__rust_end_short_backtrace::::{closure#0}, !> + 5: 0x11052e040 - std[fcd23fca98dce159]::panicking::begin_panic:: + 6: 0x10ff0e9f4 - rustc_middle[35a781f9bda42497]::util::bug::opt_span_bug_fmt::::{closure#0} + 7: 0x10ff05c14 - rustc_middle[35a781f9bda42497]::ty::context::tls::with_opt::::{closure#0}, !>::{closure#0} + 8: 0x10ff05be0 - rustc_middle[35a781f9bda42497]::ty::context::tls::with_context_opt::::{closure#0}, !>::{closure#0}, !> + 9: 0x1105293c4 - rustc_middle[35a781f9bda42497]::util::bug::bug_fmt + 10: 0x10c098270 - std[fcd23fca98dce159]::sys_common::backtrace::__rust_begin_short_backtrace::<::spawn_named_thread::{closure#5}, core[18650a1770591c75]::result::Result>::{closure#0}, core[18650a1770591c75]::result::Result> + 11: 0x10c0b551c - <::spawn_unchecked_<::spawn_named_thread::{closure#5}, core[18650a1770591c75]::result::Result>::{closure#0}, core[18650a1770591c75]::result::Result>::{closure#1} as core[18650a1770591c75]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0} + 12: 0x1037077d0 - std::sys::unix::thread::Thread::new::thread_start::h8dda2af345bab446 + 13: 0x1813c506c - __pthread_deallocate +thread 'rustc' panicked at compiler/rustc_middle/src/util/bug.rs:36:26: +/rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs:1959:17: panic during codegen/LLVM phase +stack backtrace: + 0: 0x1036e6da8 - std::backtrace::Backtrace::create::h8af6f7a25d8a3749 + 1: 0x10be1a208 - as core[18650a1770591c75]::ops::function::Fn<(&dyn for<'a, 'b> core[18650a1770591c75]::ops::function::Fn<(&'a core[18650a1770591c75]::panic::panic_info::PanicInfo<'b>,), Output = ()> + core[18650a1770591c75]::marker::Sync + core[18650a1770591c75]::marker::Send, &core[18650a1770591c75]::panic::panic_info::PanicInfo)>>::call + 2: 0x1036ff528 - std::panicking::rust_panic_with_hook::h1e70c5d905e30e9d + 3: 0x10ff95168 - std[fcd23fca98dce159]::panicking::begin_panic::::{closure#0} + 4: 0x10ff950ec - std[fcd23fca98dce159]::sys_common::backtrace::__rust_end_short_backtrace::::{closure#0}, !> + 5: 0x11052e040 - std[fcd23fca98dce159]::panicking::begin_panic:: + 6: 0x10ff0e9f4 - rustc_middle[35a781f9bda42497]::util::bug::opt_span_bug_fmt::::{closure#0} + 7: 0x10ff05c14 - rustc_middle[35a781f9bda42497]::ty::context::tls::with_opt::::{closure#0}, !>::{closure#0} + 8: 0x10ff05be0 - rustc_middle[35a781f9bda42497]::ty::context::tls::with_context_opt::::{closure#0}, !>::{closure#0}, !> + 9: 0x1105293c4 - rustc_middle[35a781f9bda42497]::util::bug::bug_fmt + 10: 0x10c091f48 - ::time::>::join::{closure#0}> + 11: 0x10c0b7284 - >::join + 12: 0x10c0a6d48 - ::join_codegen + 13: 0x10bfc264c - ::link + 14: 0x10be0711c - rustc_span[d844dabcc0d15e78]::create_session_globals_then::, rustc_interface[9ecbacebda51131]::interface::run_compiler, rustc_driver_impl[d723ad74a265baf3]::run_compiler::{closure#0}>::{closure#0}> + 15: 0x10be3d628 - std[fcd23fca98dce159]::sys_common::backtrace::__rust_begin_short_backtrace::, rustc_driver_impl[d723ad74a265baf3]::run_compiler::{closure#0}>::{closure#0}, core[18650a1770591c75]::result::Result<(), rustc_span[d844dabcc0d15e78]::ErrorGuaranteed>>::{closure#0}::{closure#0}, core[18650a1770591c75]::result::Result<(), rustc_span[d844dabcc0d15e78]::ErrorGuaranteed>> + 16: 0x10be0fd7c - <::spawn_unchecked_, rustc_driver_impl[d723ad74a265baf3]::run_compiler::{closure#0}>::{closure#0}, core[18650a1770591c75]::result::Result<(), rustc_span[d844dabcc0d15e78]::ErrorGuaranteed>>::{closure#0}::{closure#0}, core[18650a1770591c75]::result::Result<(), rustc_span[d844dabcc0d15e78]::ErrorGuaranteed>>::{closure#1} as core[18650a1770591c75]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0} + 17: 0x1037077d0 - std::sys::unix::thread::Thread::new::thread_start::h8dda2af345bab446 + 18: 0x1813c506c - __pthread_deallocate diff --git a/packages/rs-platform-serialization-derive/rustc-ice-2024-02-20T10_35_12-10937.txt b/packages/rs-platform-serialization-derive/rustc-ice-2024-02-20T10_35_12-10937.txt new file mode 100644 index 0000000000..4b01eb2868 --- /dev/null +++ b/packages/rs-platform-serialization-derive/rustc-ice-2024-02-20T10_35_12-10937.txt @@ -0,0 +1,58 @@ +thread 'cpy ebti8ycrnjshmsw' panicked at /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs:913:44: +no saved object file in work product +stack backtrace: + 0: 0x1031cada8 - std::backtrace::Backtrace::create::h8af6f7a25d8a3749 + 1: 0x10b8fe208 - as core[18650a1770591c75]::ops::function::Fn<(&dyn for<'a, 'b> core[18650a1770591c75]::ops::function::Fn<(&'a core[18650a1770591c75]::panic::panic_info::PanicInfo<'b>,), Output = ()> + core[18650a1770591c75]::marker::Sync + core[18650a1770591c75]::marker::Send, &core[18650a1770591c75]::panic::panic_info::PanicInfo)>>::call + 2: 0x1031e3528 - std::panicking::rust_panic_with_hook::h1e70c5d905e30e9d + 3: 0x1031e32e4 - std::panicking::begin_panic_handler::{{closure}}::h399e32952efd26a4 + 4: 0x1031e0a18 - std::sys_common::backtrace::__rust_end_short_backtrace::h2ab87f841a2323e7 + 5: 0x1031e306c - _rust_begin_unwind + 6: 0x10323cbd0 - core::panicking::panic_fmt::h33e40d2a93cab78f + 7: 0x10323cb9c - core::option::expect_failed::h8c59d9d921ed2136 + 8: 0x10bb983ec - rustc_codegen_ssa[b392610c019ec31b]::back::write::execute_copy_from_cache_work_item:: + 9: 0x10bb7a508 - std[fcd23fca98dce159]::sys_common::backtrace::__rust_begin_short_backtrace::<::spawn_named_thread::{closure#0}, ()>::{closure#0}, ()> + 10: 0x10bb99244 - <::spawn_unchecked_<::spawn_named_thread::{closure#0}, ()>::{closure#0}, ()>::{closure#1} as core[18650a1770591c75]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0} + 11: 0x1031eb7d0 - std::sys::unix::thread::Thread::new::thread_start::h8dda2af345bab446 + 12: 0x1813c506c - __pthread_deallocate + + +rustc version: 1.76.0 (07dca489a 2024-02-04) +platform: aarch64-apple-darwinthread 'coordinator' panicked at compiler/rustc_middle/src/util/bug.rs:36:26: +/rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs:1586:29: worker thread panicked +stack backtrace: + 0: 0x1031cada8 - std::backtrace::Backtrace::create::h8af6f7a25d8a3749 + 1: 0x10b8fe208 - as core[18650a1770591c75]::ops::function::Fn<(&dyn for<'a, 'b> core[18650a1770591c75]::ops::function::Fn<(&'a core[18650a1770591c75]::panic::panic_info::PanicInfo<'b>,), Output = ()> + core[18650a1770591c75]::marker::Sync + core[18650a1770591c75]::marker::Send, &core[18650a1770591c75]::panic::panic_info::PanicInfo)>>::call + 2: 0x1031e3528 - std::panicking::rust_panic_with_hook::h1e70c5d905e30e9d + 3: 0x10fa79168 - std[fcd23fca98dce159]::panicking::begin_panic::::{closure#0} + 4: 0x10fa790ec - std[fcd23fca98dce159]::sys_common::backtrace::__rust_end_short_backtrace::::{closure#0}, !> + 5: 0x110012040 - std[fcd23fca98dce159]::panicking::begin_panic:: + 6: 0x10f9f29f4 - rustc_middle[35a781f9bda42497]::util::bug::opt_span_bug_fmt::::{closure#0} + 7: 0x10f9e9c14 - rustc_middle[35a781f9bda42497]::ty::context::tls::with_opt::::{closure#0}, !>::{closure#0} + 8: 0x10f9e9be0 - rustc_middle[35a781f9bda42497]::ty::context::tls::with_context_opt::::{closure#0}, !>::{closure#0}, !> + 9: 0x11000d3c4 - rustc_middle[35a781f9bda42497]::util::bug::bug_fmt + 10: 0x10bb7c270 - std[fcd23fca98dce159]::sys_common::backtrace::__rust_begin_short_backtrace::<::spawn_named_thread::{closure#5}, core[18650a1770591c75]::result::Result>::{closure#0}, core[18650a1770591c75]::result::Result> + 11: 0x10bb9951c - <::spawn_unchecked_<::spawn_named_thread::{closure#5}, core[18650a1770591c75]::result::Result>::{closure#0}, core[18650a1770591c75]::result::Result>::{closure#1} as core[18650a1770591c75]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0} + 12: 0x1031eb7d0 - std::sys::unix::thread::Thread::new::thread_start::h8dda2af345bab446 + 13: 0x1813c506c - __pthread_deallocate +thread 'rustc' panicked at compiler/rustc_middle/src/util/bug.rs:36:26: +/rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs:1959:17: panic during codegen/LLVM phase +stack backtrace: + 0: 0x1031cada8 - std::backtrace::Backtrace::create::h8af6f7a25d8a3749 + 1: 0x10b8fe208 - as core[18650a1770591c75]::ops::function::Fn<(&dyn for<'a, 'b> core[18650a1770591c75]::ops::function::Fn<(&'a core[18650a1770591c75]::panic::panic_info::PanicInfo<'b>,), Output = ()> + core[18650a1770591c75]::marker::Sync + core[18650a1770591c75]::marker::Send, &core[18650a1770591c75]::panic::panic_info::PanicInfo)>>::call + 2: 0x1031e3528 - std::panicking::rust_panic_with_hook::h1e70c5d905e30e9d + 3: 0x10fa79168 - std[fcd23fca98dce159]::panicking::begin_panic::::{closure#0} + 4: 0x10fa790ec - std[fcd23fca98dce159]::sys_common::backtrace::__rust_end_short_backtrace::::{closure#0}, !> + 5: 0x110012040 - std[fcd23fca98dce159]::panicking::begin_panic:: + 6: 0x10f9f29f4 - rustc_middle[35a781f9bda42497]::util::bug::opt_span_bug_fmt::::{closure#0} + 7: 0x10f9e9c14 - rustc_middle[35a781f9bda42497]::ty::context::tls::with_opt::::{closure#0}, !>::{closure#0} + 8: 0x10f9e9be0 - rustc_middle[35a781f9bda42497]::ty::context::tls::with_context_opt::::{closure#0}, !>::{closure#0}, !> + 9: 0x11000d3c4 - rustc_middle[35a781f9bda42497]::util::bug::bug_fmt + 10: 0x10bb75f48 - ::time::>::join::{closure#0}> + 11: 0x10bb9b284 - >::join + 12: 0x10bb8ad48 - ::join_codegen + 13: 0x10baa664c - ::link + 14: 0x10b8eb11c - rustc_span[d844dabcc0d15e78]::create_session_globals_then::, rustc_interface[9ecbacebda51131]::interface::run_compiler, rustc_driver_impl[d723ad74a265baf3]::run_compiler::{closure#0}>::{closure#0}> + 15: 0x10b921628 - std[fcd23fca98dce159]::sys_common::backtrace::__rust_begin_short_backtrace::, rustc_driver_impl[d723ad74a265baf3]::run_compiler::{closure#0}>::{closure#0}, core[18650a1770591c75]::result::Result<(), rustc_span[d844dabcc0d15e78]::ErrorGuaranteed>>::{closure#0}::{closure#0}, core[18650a1770591c75]::result::Result<(), rustc_span[d844dabcc0d15e78]::ErrorGuaranteed>> + 16: 0x10b8f3d7c - <::spawn_unchecked_, rustc_driver_impl[d723ad74a265baf3]::run_compiler::{closure#0}>::{closure#0}, core[18650a1770591c75]::result::Result<(), rustc_span[d844dabcc0d15e78]::ErrorGuaranteed>>::{closure#0}::{closure#0}, core[18650a1770591c75]::result::Result<(), rustc_span[d844dabcc0d15e78]::ErrorGuaranteed>>::{closure#1} as core[18650a1770591c75]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0} + 17: 0x1031eb7d0 - std::sys::unix::thread::Thread::new::thread_start::h8dda2af345bab446 + 18: 0x1813c506c - __pthread_deallocate diff --git a/packages/rs-platform-serialization-derive/rustc-ice-2024-02-20T10_35_20-11458.txt b/packages/rs-platform-serialization-derive/rustc-ice-2024-02-20T10_35_20-11458.txt new file mode 100644 index 0000000000..dae6da51bf --- /dev/null +++ b/packages/rs-platform-serialization-derive/rustc-ice-2024-02-20T10_35_20-11458.txt @@ -0,0 +1,58 @@ +thread 'cpy ebti8ycrnjshmsw' panicked at /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs:913:44: +no saved object file in work product +stack backtrace: + 0: 0x1039e6da8 - std::backtrace::Backtrace::create::h8af6f7a25d8a3749 + 1: 0x10c11a208 - as core[18650a1770591c75]::ops::function::Fn<(&dyn for<'a, 'b> core[18650a1770591c75]::ops::function::Fn<(&'a core[18650a1770591c75]::panic::panic_info::PanicInfo<'b>,), Output = ()> + core[18650a1770591c75]::marker::Sync + core[18650a1770591c75]::marker::Send, &core[18650a1770591c75]::panic::panic_info::PanicInfo)>>::call + 2: 0x1039ff528 - std::panicking::rust_panic_with_hook::h1e70c5d905e30e9d + 3: 0x1039ff2e4 - std::panicking::begin_panic_handler::{{closure}}::h399e32952efd26a4 + 4: 0x1039fca18 - std::sys_common::backtrace::__rust_end_short_backtrace::h2ab87f841a2323e7 + 5: 0x1039ff06c - _rust_begin_unwind + 6: 0x103a58bd0 - core::panicking::panic_fmt::h33e40d2a93cab78f + 7: 0x103a58b9c - core::option::expect_failed::h8c59d9d921ed2136 + 8: 0x10c3b43ec - rustc_codegen_ssa[b392610c019ec31b]::back::write::execute_copy_from_cache_work_item:: + 9: 0x10c396508 - std[fcd23fca98dce159]::sys_common::backtrace::__rust_begin_short_backtrace::<::spawn_named_thread::{closure#0}, ()>::{closure#0}, ()> + 10: 0x10c3b5244 - <::spawn_unchecked_<::spawn_named_thread::{closure#0}, ()>::{closure#0}, ()>::{closure#1} as core[18650a1770591c75]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0} + 11: 0x103a077d0 - std::sys::unix::thread::Thread::new::thread_start::h8dda2af345bab446 + 12: 0x1813c506c - __pthread_deallocate + + +rustc version: 1.76.0 (07dca489a 2024-02-04) +platform: aarch64-apple-darwinthread 'coordinator' panicked at compiler/rustc_middle/src/util/bug.rs:36:26: +/rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs:1586:29: worker thread panicked +stack backtrace: + 0: 0x1039e6da8 - std::backtrace::Backtrace::create::h8af6f7a25d8a3749 + 1: 0x10c11a208 - as core[18650a1770591c75]::ops::function::Fn<(&dyn for<'a, 'b> core[18650a1770591c75]::ops::function::Fn<(&'a core[18650a1770591c75]::panic::panic_info::PanicInfo<'b>,), Output = ()> + core[18650a1770591c75]::marker::Sync + core[18650a1770591c75]::marker::Send, &core[18650a1770591c75]::panic::panic_info::PanicInfo)>>::call + 2: 0x1039ff528 - std::panicking::rust_panic_with_hook::h1e70c5d905e30e9d + 3: 0x110295168 - std[fcd23fca98dce159]::panicking::begin_panic::::{closure#0} + 4: 0x1102950ec - std[fcd23fca98dce159]::sys_common::backtrace::__rust_end_short_backtrace::::{closure#0}, !> + 5: 0x11082e040 - std[fcd23fca98dce159]::panicking::begin_panic:: + 6: 0x11020e9f4 - rustc_middle[35a781f9bda42497]::util::bug::opt_span_bug_fmt::::{closure#0} + 7: 0x110205c14 - rustc_middle[35a781f9bda42497]::ty::context::tls::with_opt::::{closure#0}, !>::{closure#0} + 8: 0x110205be0 - rustc_middle[35a781f9bda42497]::ty::context::tls::with_context_opt::::{closure#0}, !>::{closure#0}, !> + 9: 0x1108293c4 - rustc_middle[35a781f9bda42497]::util::bug::bug_fmt + 10: 0x10c398270 - std[fcd23fca98dce159]::sys_common::backtrace::__rust_begin_short_backtrace::<::spawn_named_thread::{closure#5}, core[18650a1770591c75]::result::Result>::{closure#0}, core[18650a1770591c75]::result::Result> + 11: 0x10c3b551c - <::spawn_unchecked_<::spawn_named_thread::{closure#5}, core[18650a1770591c75]::result::Result>::{closure#0}, core[18650a1770591c75]::result::Result>::{closure#1} as core[18650a1770591c75]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0} + 12: 0x103a077d0 - std::sys::unix::thread::Thread::new::thread_start::h8dda2af345bab446 + 13: 0x1813c506c - __pthread_deallocate +thread 'rustc' panicked at compiler/rustc_middle/src/util/bug.rs:36:26: +/rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs:1959:17: panic during codegen/LLVM phase +stack backtrace: + 0: 0x1039e6da8 - std::backtrace::Backtrace::create::h8af6f7a25d8a3749 + 1: 0x10c11a208 - as core[18650a1770591c75]::ops::function::Fn<(&dyn for<'a, 'b> core[18650a1770591c75]::ops::function::Fn<(&'a core[18650a1770591c75]::panic::panic_info::PanicInfo<'b>,), Output = ()> + core[18650a1770591c75]::marker::Sync + core[18650a1770591c75]::marker::Send, &core[18650a1770591c75]::panic::panic_info::PanicInfo)>>::call + 2: 0x1039ff528 - std::panicking::rust_panic_with_hook::h1e70c5d905e30e9d + 3: 0x110295168 - std[fcd23fca98dce159]::panicking::begin_panic::::{closure#0} + 4: 0x1102950ec - std[fcd23fca98dce159]::sys_common::backtrace::__rust_end_short_backtrace::::{closure#0}, !> + 5: 0x11082e040 - std[fcd23fca98dce159]::panicking::begin_panic:: + 6: 0x11020e9f4 - rustc_middle[35a781f9bda42497]::util::bug::opt_span_bug_fmt::::{closure#0} + 7: 0x110205c14 - rustc_middle[35a781f9bda42497]::ty::context::tls::with_opt::::{closure#0}, !>::{closure#0} + 8: 0x110205be0 - rustc_middle[35a781f9bda42497]::ty::context::tls::with_context_opt::::{closure#0}, !>::{closure#0}, !> + 9: 0x1108293c4 - rustc_middle[35a781f9bda42497]::util::bug::bug_fmt + 10: 0x10c391f48 - ::time::>::join::{closure#0}> + 11: 0x10c3b7284 - >::join + 12: 0x10c3a6d48 - ::join_codegen + 13: 0x10c2c264c - ::link + 14: 0x10c10711c - rustc_span[d844dabcc0d15e78]::create_session_globals_then::, rustc_interface[9ecbacebda51131]::interface::run_compiler, rustc_driver_impl[d723ad74a265baf3]::run_compiler::{closure#0}>::{closure#0}> + 15: 0x10c13d628 - std[fcd23fca98dce159]::sys_common::backtrace::__rust_begin_short_backtrace::, rustc_driver_impl[d723ad74a265baf3]::run_compiler::{closure#0}>::{closure#0}, core[18650a1770591c75]::result::Result<(), rustc_span[d844dabcc0d15e78]::ErrorGuaranteed>>::{closure#0}::{closure#0}, core[18650a1770591c75]::result::Result<(), rustc_span[d844dabcc0d15e78]::ErrorGuaranteed>> + 16: 0x10c10fd7c - <::spawn_unchecked_, rustc_driver_impl[d723ad74a265baf3]::run_compiler::{closure#0}>::{closure#0}, core[18650a1770591c75]::result::Result<(), rustc_span[d844dabcc0d15e78]::ErrorGuaranteed>>::{closure#0}::{closure#0}, core[18650a1770591c75]::result::Result<(), rustc_span[d844dabcc0d15e78]::ErrorGuaranteed>>::{closure#1} as core[18650a1770591c75]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0} + 17: 0x103a077d0 - std::sys::unix::thread::Thread::new::thread_start::h8dda2af345bab446 + 18: 0x1813c506c - __pthread_deallocate diff --git a/packages/rs-platform-serialization-derive/rustc-ice-2024-02-20T10_35_23-11733.txt b/packages/rs-platform-serialization-derive/rustc-ice-2024-02-20T10_35_23-11733.txt new file mode 100644 index 0000000000..87aede658a --- /dev/null +++ b/packages/rs-platform-serialization-derive/rustc-ice-2024-02-20T10_35_23-11733.txt @@ -0,0 +1,106 @@ +thread 'cpy oxxcwsebgx1733i' panicked at thread 'cpy 5fuhladjlcxb67o9' panicked at /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs:913:/rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs:44913: +:no saved object file in work product44 +stack backtrace: +: +no saved object file in work product +stack backtrace: +thread 'cpy vhs4c6sj2h4xpaq' panicked at /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs:913:44: +no saved object file in work product +stack backtrace: + 0: 0x103926da8 - std::backtrace::Backtrace::create::h8af6f7a25d8a3749 + 1: 0x10c05a208thread ' - cpy ebti8ycrnjshmsw as core [018650a1770591c75: ] :: ops :: function :: Fn <0x(103926da8& - dyn stdfor<:: 0: 0x103926da8 - stdbacktrace::::backtraceBacktrace::::Backtracecreate::::create :: h8af6f7a25d8a3749 +0 : h8af6f7a25d8a3749 +1 : 0x 103926da8 0x 10c05a2081' - astd, ::'backtraceb::> Backtracecore::[create - ::18650a1770591c75h8af6f7a25d8a3749< +: alloc [ 37ddc2533ea56b7b1]: :: boxed :: ] :: ops Box < ::rustc_driver_impl [ function ::0x d723ad74a265baf3 ]0x::10c05a208install_ice_hookFn::{ as corecore[[18650a1770591c7518650a1770591c75]]::::panicops::::panic_infofunction::::Fn10c05a208PanicInfo - << - alloc<[alloc37ddc2533ea56b7b']b::>boxed,::)Box, ] + ::coreinstall_ice_hook[::{18650a1770591c75closure]#::0marker}::>Sync as + corecore[18650a1770591c75]::marker::Send, &core[18650a1770591c75<](::&panicdyn ::for]'::bops> ::corefunction[::18650a1770591c7537ddc2533ea56b7b]::boxed::Box::{::closurecall# +0 } > as 2core: [ 18650a1770591c75 ] :: ops :: function ::0xFn<(&dyn for<'a, 'b> core[10393f52818650a1770591c75 - ]std::::opspanicking::function::Fn<(&'a core[18650a1770591c75]::panic::::rust_panic_with_hookpanic_info::::h1e70c5d905e30e9dPanicInfo<'b>,), Output = ()> + core[ +18650a1770591c75 ] :: marker3::Sync + core[18650a1770591c75]::marker::Send, &: core [ 18650a1770591c75 ] :: panic :: panic_info::Fn0xPanicInfo])::10393f2e4ops>::>< - functionstd::::Fnpanicking<::(begin_panic_handler&::'({&{dyn closurea} }core::[h399e32952efd26a4:: +call + 418650a1770591c75: 2 : ]for< ' a , 0x 10393ca18 - std ::'::sys_commonpanic::::backtracepanic_info::::b__rust_end_short_backtrace :: h2ab87f841a2323e7PanicInfo +< ' b 0x> 10393f528core - [std18650a1770591c75::]panicking::::opsrust_panic_with_hook::::functionh1e70c5d905e30e9d:: +Fn < ( &3': a core [ 18650a1770591c75 ] :: panic0x::10393f2e4panic_info - ::stdPanicInfo::::,{){, closureOutput} = }()::>h399e32952efd26a4 + +core [ 18650a1770591c75 ]4::: marker :: Sync >5 : , + )core, [Output 0x 10393ca18 - std :: sys_common0x10393f06c:: = backtrace()::>__rust_end_short_backtrace + - core_rust_begin_unwind[ +18650a1770591c75 ::18650a1770591c75]]::::markermarker::Send h2ab87f841a2323e7 +6 : 5 : 0x 103998bd0 - , 0x&10393f06c:: - core_rust_begin_unwindSync +:: + panicking ::6core: core [ panic_fmt 18650a1770591c75 ::]h33e40d2a93cab78f:: + [ 18650a1770591c75 ]7::: marker :: Send , 0x&103998bd0core - [core18650a1770591c75::]panicking::::panicpanic_fmt::::panich33e40d2a93cab78f panic_info :: PanicInfo ::)>panic_info>::::PanicInfocall) +> 2: + > 0x 103998b9c :: call + 0x 10393f528 - 2 : std :: panicking :: rust_panic_with_hook7 : :: h1e70c5d905e30e9d + 0x3103998b9c: - core :: option ::expect_failed - 0x 10393f528 - 0xstd10393f2e4:: - panickingstd::::rust_panic_with_hookpanicking::::h1e70c5d905e30e9dbegin_panic_handler +:: { { closure3core: } }:: h8c59d9d921ed2136 + ::8h399e32952efd26a4 : :: option :: expect_failed :: h8c59d9d921ed2136 + 0x 10c2f43ec +80x: 10393f2e4 - std :: panicking :: begin_panic_handler - 0x:: {4{: closure 10c2f43ec - }rustc_codegen_ssarustc_codegen_ssa}[[::b392610c019ec31bh399e32952efd26a4]b392610c019ec31b +:: back :: write]4::::: execute_copy_from_cache_work_item back::::< writerustc_codegen_llvm::[execute_copy_from_cache_work_itemb70b0e52460f9a66::]<::rustc_codegen_llvmLlvmCodegenBackend[>b70b0e52460f9a66 +]:: LlvmCodegenBackend > +9 : 9 : 0x 10393ca180x - 10c2d6508std - ::stdsys_common[::fcd23fca98dce159backtrace]::::__rust_end_short_backtracesys_common::::h2ab87f841a2323e7backtrace +:: __rust_begin_short_backtrace :: <5: 0x10393f06c - _rust_begin_unwind + < rustc_codegen_llvm [6b70b0e52460f9a66: ] :: LlvmCodegenBackend as rustc_codegen_ssa 0x0x10393ca18103998bd0[ - - stdcore::::sys_commonpanicking::panic_fmt::h33e40d2a93cab78fb392610c019ec31b +] :: traits ::7backend: :: ExtraBackendMethods > :: spawn_named_thread < rustc_codegen_ssa [0xb392610c019ec31b103998b9c] - ::coreback::::optionwrite::::expect_failedspawn_work::h8c59d9d921ed2136 <::rustc_codegen_llvmbacktrace:: + __rust_end_short_backtrace :: h2ab87f841a2323e70x +10c2d6508 - std[fcd23fca98dce159 ] :: sys_common8::: backtrace :: __rust_begin_short_backtrace ::5<: < rustc_codegen_llvm [ b70b0e52460f9a66 ] :: LlvmCodegenBackend as 0xrustc_codegen_ssa10393f06c[ - b392610c019ec31b_rust_begin_unwind] + [ :: traits :: backend ::b70b0e52460f9a66ExtraBackendMethods0x>10c2f43ec:: - spawn_named_threadrustc_codegen_ssa<]rustc_codegen_ssa::[LlvmCodegenBackendb392610c019ec31b>]::{::closureback#::0write}::, spawn_work()<>rustc_codegen_llvm::{[closureb70b0e52460f9a66#]0::}LlvmCodegenBackend, >()::{>closure +# 10: 0x10c2f5244 - <}::, spawn_unchecked_()<><::{rustc_codegen_llvmclosure[#[0b392610c019ec31bb70b0e52460f9a66 ]]:: LlvmCodegenBackend6 as : rustc_codegen_ssa[b392610c019ec31b]::::traitsback::::backendwrite::::} execute_copy_from_cache_work_item :: < rustc_codegen_llvm ExtraBackendMethods , >()0x>103998bd0 + - core ::::panicking10::: panic_fmtspawn_named_thread:: h33e40d2a93cab78f + < rustc_codegen_ssa [7b392610c019ec31b: ] :: back :: write :: spawn_work <0xrustc_codegen_llvm103998b9c[ - b70b0e52460f9a66core]:: ::[ b70b0e52460f9a66 ]0x::10c2f5244optionLlvmCodegenBackend:: - >< + :: spawn_unchecked_ < <8rustc_codegen_llvm: [ b70b0e52460f9a66 ] :: LlvmCodegenBackend as rustc_codegen_ssa [ b392610c019ec31b ]0x::10c2d6508traits - ::stdbackend[::ExtraBackendMethods>0xfcd23fca98dce159LlvmCodegenBackend10c2f43ec]> - ::{rustc_codegen_ssaclosure[#b392610c019ec31b]::::0sys_common}::, backtrace()>::::{closure::#spawn_named_thread0<}rustc_codegen_ssa, [()b392610c019ec31b>]::{::closureback#::1write}:: as spawn_workcore<[rustc_codegen_llvm18650a1770591c75[]back::::opsb70b0e52460f9a66]::::function__rust_begin_short_backtracewrite::::FnOnce<<<()rustc_codegen_llvm>[>b70b0e52460f9a66::]execute_copy_from_cache_work_item::::LlvmCodegenBackend< as rustc_codegen_llvmrustc_codegen_ssa[[b70b0e52460f9a66b392610c019ec31b]]::::LlvmCodegenBackendtraits>:: +backend :: ExtraBackendMethods >9::: spawn_named_thread < rustc_codegen_ssa [ b392610c019ec31b ] :: back0x::10c2d6508write - ::stdspawn_work[__rust_begin_short_backtrace::{::<0::{}closure, #()0>}::{, closure()#>0::{}closure, #()0>}::{, closure()#>1 +} as core10[: 18650a1770591c75 ]:: + 11 as : rustc_codegen_ssa 0x 10c2f5244 - < <0xstd1039477d0[ - fcd23fca98dce159std]::::systhread::::unixBuilder::>thread::::spawn_unchecked_Thread<::]::::spawn_named_threadtraits<::rustc_codegen_ssabackend[::b392610c019ec31bExtraBackendMethods]>::::backspawn_named_thread::<::{rustc_codegen_llvmclosureops[::b70b0e52460f9a66#]0::}, LlvmCodegenBackend()>>::{::{closureclosure##0function}::, FnOnce()<>()::{>closure>#::0call_once}::{, shim():>vtable::{#closure0#}1 +} as core11[: 18650a1770591c75 ] :: ops :: function :: FnOnce0x<1039477d0() - >std>::::syscall_once::::{unixshim:::threadvtable::#Thread0::}new +:: thread_start ::11h8dda2af345bab446: + 12 : 0x 1039477d0 - std ::0xsys1813c506c:: - unix__pthread_deallocate:: +thread::Thread::new::thread_start::h8dda2af345bab446 + 12: new :: thread_start ::0xh8dda2af345bab4461813c506c + - __pthread_deallocate +12: 0x1813c506c - __pthread_deallocate +0}, ()> + 10: 0x10c2f5244 - <::spawn_unchecked_<::spawn_named_thread::{closure#0}, ()>::{closure#0}, ()>::{closure#1} as core[18650a1770591c75]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0} + 11: 0x1039477d0 - std::sys::unix::thread::Thread::new::thread_start::h8dda2af345bab446 + 12: 0x1813c506c - __pthread_deallocate + + +rustc version: 1.76.0 (07dca489a 2024-02-04) +platform: aarch64-apple-darwinthread 'coordinator' panicked at compiler/rustc_middle/src/util/bug.rs:36:26: +/rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs:1586:29: worker thread panicked +stack backtrace: + 0: 0x103926da8 - std::backtrace::Backtrace::create::h8af6f7a25d8a3749 + 1: 0x10c05a208 - as core[18650a1770591c75]::ops::function::Fn<(&dyn for<'a, 'b> core[18650a1770591c75]::ops::function::Fn<(&'a core[18650a1770591c75]::panic::panic_info::PanicInfo<'b>,), Output = ()> + core[18650a1770591c75]::marker::Sync + core[18650a1770591c75]::marker::Send, &core[18650a1770591c75]::panic::panic_info::PanicInfo)>>::call + 2: 0x10393f528 - std::panicking::rust_panic_with_hook::h1e70c5d905e30e9d + 3: 0x1101d5168 - std[fcd23fca98dce159]::panicking::begin_panic::::{closure#0} + 4: 0x1101d50ec - std[fcd23fca98dce159]::sys_common::backtrace::__rust_end_short_backtrace::::{closure#0}, !> + 5: 0x11076e040 - std[fcd23fca98dce159]::panicking::begin_panic:: + 6: 0x11014e9f4 - rustc_middle[35a781f9bda42497]::util::bug::opt_span_bug_fmt::::{closure#0} + 7: 0x110145c14 - rustc_middle[35a781f9bda42497]::ty::context::tls::with_opt::::{closure#0}, !>::{closure#0} + 8: 0x110145be0 - rustc_middle[35a781f9bda42497]::ty::context::tls::with_context_opt::::{closure#0}, !>::{closure#0}, !> + 9: 0x1107693c4 - rustc_middle[35a781f9bda42497]::util::bug::bug_fmt + 10: 0x10c2d8270 - std[fcd23fca98dce159]::sys_common::backtrace::__rust_begin_short_backtrace::<::spawn_named_thread::{closure#5}, core[18650a1770591c75]::result::Result>::{closure#0}, core[18650a1770591c75]::result::Result> + 11: 0x10c2f551c - <::spawn_unchecked_<::spawn_named_thread::{closure#5}, core[18650a1770591c75]::result::Result>::{closure#0}, core[18650a1770591c75]::result::Result>::{closure#1} as core[18650a1770591c75]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0} + 12: 0x1039477d0 - std::sys::unix::thread::Thread::new::thread_start::h8dda2af345bab446 + 13: 0x1813c506c - __pthread_deallocate +thread 'rustc' panicked at compiler/rustc_middle/src/util/bug.rs:36:26: +/rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs:1959:17: panic during codegen/LLVM phase +stack backtrace: + 0: 0x103926da8 - std::backtrace::Backtrace::create::h8af6f7a25d8a3749 + 1: 0x10c05a208 - as core[18650a1770591c75]::ops::function::Fn<(&dyn for<'a, 'b> core[18650a1770591c75]::ops::function::Fn<(&'a core[18650a1770591c75]::panic::panic_info::PanicInfo<'b>,), Output = ()> + core[18650a1770591c75]::marker::Sync + core[18650a1770591c75]::marker::Send, &core[18650a1770591c75]::panic::panic_info::PanicInfo)>>::call + 2: 0x10393f528 - std::panicking::rust_panic_with_hook::h1e70c5d905e30e9d + 3: 0x1101d5168 - std[fcd23fca98dce159]::panicking::begin_panic::::{closure#0} + 4: 0x1101d50ec - std[fcd23fca98dce159]::sys_common::backtrace::__rust_end_short_backtrace::::{closure#0}, !> + 5: 0x11076e040 - std[fcd23fca98dce159]::panicking::begin_panic:: + 6: 0x11014e9f4 - rustc_middle[35a781f9bda42497]::util::bug::opt_span_bug_fmt::::{closure#0} + 7: 0x110145c14 - rustc_middle[35a781f9bda42497]::ty::context::tls::with_opt::::{closure#0}, !>::{closure#0} + 8: 0x110145be0 - rustc_middle[35a781f9bda42497]::ty::context::tls::with_context_opt::::{closure#0}, !>::{closure#0}, !> + 9: 0x1107693c4 - rustc_middle[35a781f9bda42497]::util::bug::bug_fmt + 10: 0x10c2d1f48 - ::time::>::join::{closure#0}> + 11: 0x10c2f7284 - >::join + 12: 0x10c2e6d48 - ::join_codegen + 13: 0x10c20264c - ::link + 14: 0x10c04711c - rustc_span[d844dabcc0d15e78]::create_session_globals_then::, rustc_interface[9ecbacebda51131]::interface::run_compiler, rustc_driver_impl[d723ad74a265baf3]::run_compiler::{closure#0}>::{closure#0}> + 15: 0x10c07d628 - std[fcd23fca98dce159]::sys_common::backtrace::__rust_begin_short_backtrace::, rustc_driver_impl[d723ad74a265baf3]::run_compiler::{closure#0}>::{closure#0}, core[18650a1770591c75]::result::Result<(), rustc_span[d844dabcc0d15e78]::ErrorGuaranteed>>::{closure#0}::{closure#0}, core[18650a1770591c75]::result::Result<(), rustc_span[d844dabcc0d15e78]::ErrorGuaranteed>> + 16: 0x10c04fd7c - <::spawn_unchecked_, rustc_driver_impl[d723ad74a265baf3]::run_compiler::{closure#0}>::{closure#0}, core[18650a1770591c75]::result::Result<(), rustc_span[d844dabcc0d15e78]::ErrorGuaranteed>>::{closure#0}::{closure#0}, core[18650a1770591c75]::result::Result<(), rustc_span[d844dabcc0d15e78]::ErrorGuaranteed>>::{closure#1} as core[18650a1770591c75]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0} + 17: 0x1039477d0 - std::sys::unix::thread::Thread::new::thread_start::h8dda2af345bab446 + 18: 0x1813c506c - __pthread_deallocate diff --git a/packages/rs-platform-serialization-derive/rustc-ice-2024-02-20T10_35_25-11999.txt b/packages/rs-platform-serialization-derive/rustc-ice-2024-02-20T10_35_25-11999.txt new file mode 100644 index 0000000000..8adce894dc --- /dev/null +++ b/packages/rs-platform-serialization-derive/rustc-ice-2024-02-20T10_35_25-11999.txt @@ -0,0 +1,138 @@ +thread 'cpy k5jtp3uu1e1wr25' panicked at /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs:913:44: +no saved object file in work product +stack backtrace: +thread 'cpy oxxcwsebgx1733i' panicked at /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs : 913thread ':044: cpy 5fuhladjlcxb67o9 : +' panicked at no saved object file in work product/rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs +stack backtrace: +:thread '913cpy 4orp8g2x23rgnt3a: 44 : + ' panicked at /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs :0x913:no saved object file in work product44 +stack backtrace: +: + 1055ceda8no saved object file in work product - thread ' +stack backtrace: +cpy vhs4c6sj2h4xpaqstdthread ' cpy ebti8ycrnjshmsw0' panicked at : ' panicked at /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs:::backtrace913:::Backtrace44: +no saved object file in work product:: /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rscreate:::h8af6f7a25d8a3749 913 :044: : + + +stack backtrace: + no saved object file in work product +stack backtrace: + 10: : 0 : 0x 1055ceda8 - std 0x 1055ceda8 - std0x:: backtrace::0xbacktrace::::BacktraceBacktrace10dd02208:: - create<::alloch8af6f7a25d8a3749[ 37ddc2533ea56b7b01055ceda8: ] - :: create0xstd::1055ceda8:: - backtraceh8af6f7a25d8a3749 + + :: :: Backtrace1::: std :: 1boxed: :: Box < rustc_driver_impl [create ::backtraceh8af6f7a25d8a3749:: +Backtrace :: 0x 1055ceda8 - std :: d723ad74a265baf30x]10dd02208:: - install_ice_hook<::{allocclosure[#37ddc2533ea56b7b0]}::>boxed as createcorebacktrace[ 18650a1770591c75::]1 :: ops ::: function :: Fn:: + - core [ 00x<10dd02208alloc - [<1alloc18650a1770591c751]: ::[ops}::>function :: Fn < ( 37ddc2533ea56b7b as &core]: 37ddc2533ea56b7b:: ]'0xboxed::::boxedBox[10dd0220818650a1770591c75 - ] <:: allocopsa::< ::core[Box[<37ddc2533ea56b7brustc_driver_impl][::rustc_driver_implboxedfunction[ ::18650a1770591c75Box]d723ad74a265baf3:: panic<::0xpanic_inforustc_driver_impl::10dd02208Fn - <](<&::dyn allocfor ::[core::0]boxed::::install_ice_hookBox::{<[rustc_driver_implPanicInfod723ad74a265baf3<18650a1770591c75closure}'>b as >],])::, coreinstall_ice_hook[#d723ad74a265baf3]::{0::[ops18650a1770591c75::function}]Output> = as closure::()ops>::core + ::core[[Fn#::<018650a1770591c75(]function::::markerinstall_ice_hook18650a1770591c75::{]::}opsclosure>::&::'a as # coreSync0 + functioncore::[[Fn18650a1770591c75}core18650a1770591c75[<18650a1770591c75Fn]](::>&markerdyn :: as , &'coreb> > [corepanic[18650a1770591c7518650a1770591c75]]dyn ::::::opspanic_info::::corePanicInfo'for<[bops>::,18650a1770591c75)], ::functionops::::Fn'<)(Outputa = , &'function()>>function> + ::coreb::::'Fn> <[acall +core18650a1770591c75[(&]core ::[markerFn::<(18650a1770591c75Sync18650a1770591c75 + ]& 'core'[a18650a1770591c75 ::acore]panic::::markerpanic_info ]::::[2 : core [ 18650a1770591c75 ]18650a1770591c75::opspanic]::::::::panicfunctionSend::, Fn&PanicInfocore::[ panic_info <::'18650a1770591c75b ,(::&PanicInfo'panic_infob::>,0x)1055e7528PanicInfo - )std>, >a<::'callOutputb) = , +> , coreOutput [218650a1770591c75: ])() = , ::::Output ()>> + paniccorepanicking + core = [()::>panic_info + ::::[rust_panic_with_hookPanicInfocore 18650a1770591c75< 18650a1770591c750x]1055e7528[::18650a1770591c75 - ::']markerstd]h1e70c5d905e30e9d::::Syncpanicking + bcore:::: +:: rust_panic_with_hook marker[>::markerh1e70c5d905e30e9d::,Sync + 18650a1770591c75::)Sync, + Outputcore = [()18650a1770591c75]3 ::]marker::: ::marker Send> + 3core, [&18650a1770591c75: ]core:: + marker core::[Sync::[ 18650a1770591c75 + Sendcore [ 18650a1770591c75 , &0x]1055e72e4:: - markerstd::core::Send[18650a1770591c75 ] 18650a1770591c75 ], ::] :: markerpanic0x::::panic_infopanicking::::PanicInfoSend1055e72e4) - &stdcore::[panicking::18650a1770591c75, ]::begin_panic_handler::::panic>::{&{panicclosure::}corepanic_info[}::18650a1770591c75PanicInfo>)::]::call> +begin_panic_handler :: panic_info {h399e32952efd26a42>{:: +PanicInfo:: ) >::: closurepanic}::}panic_info::::h399e32952efd26a4PanicInfo + 4 ): >call> +:: call > + 4 :: 0x 1055e4a18call - 2 +: : 20x : 0x 1055e4a18 1055e7528 - - stdstd::sys_common2::panicking std:: :: sys_common ::0x1055e7528 - rust_panic_with_hookbacktrace :: __rust_end_short_backtrace:::::: h2ab87f841a2323e7backtrace +:: __rust_end_short_backtrace :: std5: : h2ab87f841a2323e7:: panicking +0x::1055e7528rust_panic_with_hook - ::stdh1e70c5d905e30e9d:: + 53: : 0xh1e70c5d905e30e9d + 1055e7528 - 30x: 1055e706c - _rust_begin_unwind std :: panicking :: rust_panic_with_hook0x::1055e72e4h1e70c5d905e30e9d - + panickingstd::::rust_panic_with_hookpanicking:::: 0xh1e70c5d905e30e9d1055e706c + - _rust_begin_unwind + 3 : + begin_panic_handler0x:: { {6closure: } 1055e72e4 - std :: panicking ::3begin_panic_handler: :: { 6 }{::closureh399e32952efd26a4} +}: :: h399e32952efd26a4 +4 : 0x 0x 105640bd01055e72e4 0x 1055e4a18 - 0xstd105640bd0 - - stdcore::::panickingpanicking - core :::: panicking0x::1055e72e4panic_fmt - begin_panic_handler::stdh33e40d2a93cab78f:: +panicking:: :: begin_panic_handler ::7{ {{4{closureclosure}: }}}::::h399e32952efd26a4h399e32952efd26a4 + +: 4 : 0x 1055e4a18 - std:: :: sys_common :: backtrace::__rust_end_short_backtrace0x::105640b9ch2ab87f841a2323e7 - +core ::panic_fmtoption::::h33e40d2a93cab78fexpect_failed + 5 : 7 : 0x 1055e4a18 - std :: sys_common :: backtrace :::: ::4h8c59d9d921ed2136: + 8 sys_common 0x0x1055e4a18105640b9c - - : ::corebacktrace::::option__rust_end_short_backtrace::0x __rust_end_short_backtrace :: h2ab87f841a2323e7 + :: h2ab87f841a2323e7 +0x 10df9c3ec - 1055e706crustc_codegen_ssa5[: b392610c019ec31b ] - _rust_begin_unwind + std expect_failed5 ::: h8c59d9d921ed2136 6 + : 0x81055e706c - _rust_begin_unwind + :: : sys_common :: backtrace0x::105640bd0__rust_end_short_backtrace - ::coreh2ab87f841a2323e7:: +panicking :: back 5 : ::0xwrite10df9c3ec:: - execute_copy_from_cache_work_item :::: 0x 1055e706c0x 1055e706c6 - : _rust_begin_unwind +panic_fmt - rustc_codegen_ssa_rust_begin_unwind[ +b392610c019ec31b ] :: 6< rustc_codegen_llvm: [ b70b0e52460f9a66 ] :: LlvmCodegenBackend ::backh33e40d2a93cab78f::> +write :: execute_copy_from_cache_work_item 7 : ::< +0xrustc_codegen_llvm 105640bd0 - 0x [ 6core9: : :: panicking :: 0x 105640bd0 - core 0x:: panickingb70b0e52460f9a66::]panic_fmt::0xLlvmCodegenBackend::>h33e40d2a93cab78f + +105640b9c panic_fmt 97: : 105640bd0 - 10df7e508 - core :: - corestd::[::optionfcd23fca98dce159::]expect_failed::::sys_common ::panickingh33e40d2a93cab78fh8c59d9d921ed2136:: + + backtrace panic_fmt 80x::: 10df7e508h33e40d2a93cab78f - 0xstd +105640b9c[ - fcd23fca98dce159core]::::::sys_common __rust_begin_short_backtraceoption :: expect_failed7: :: ::h8c59d9d921ed2136 +:: < < rustc_codegen_llvm[ b70b0e52460f9a66 backtrace 8 : 0x 10df9c3ec ] - ::rustc_codegen_ssa7::: [ b392610c019ec31b LlvmCodegenBackend__rust_begin_short_backtrace ] :: 0x 10df9c3ec back0x as 105640b9c:: - - corerustc_codegen_ssa::[optionb392610c019ec31b::writeexpect_failedrustc_codegen_ssa ::::h8c59d9d921ed2136:: +<: :: spawn_named_thread execute_copy_from_cache_work_itemb392610c019ec31bb70b0e52460f9a66<] :: LlvmCodegenBackend > +:: - core ::option9::]LlvmCodegenBackend ::rustc_codegen_ssa spawn_named_thread > + <:: write ::0xspawn_work10df7e508rustc_codegen_ssa - 9 : 0x[ 10df9c3ec [ - b392610c019ec31brustc_codegen_ssa ][<::rustc_codegen_llvmback[b392610c019ec31bb70b0e52460f9a66::]]::std::write[b392610c019ec31bfcd23fca98dce159]LlvmCodegenBackend::]backback::>write ::::{::execute_copy_from_cache_work_itemclosure::# write0xspawn_work10df7e508:: - __rust_begin_short_backtrace, ::]LlvmCodegenBackend<><::{ +#closurerustc_codegen_llvmLlvmCodegenBackend[#b70b0e52460f9a66>0 +]} [, b392610c019ec31b ]():: traits ::9backend> +0::: LlvmCodegenBackend as 9rustc_codegen_ssa: }[ b392610c019ec31b ] , :: () 0x>10df7e50810 - : std [ fcd23fca98dce159 traits :::: ExtraBackendMethodsbackend>:::: spawn_named_thread ::{ExtraBackendMethodsclosure>#0x::0spawn_named_thread10df9d244]<::rustc_codegen_ssasys_common - ::[b392610c019ec31b - b392610c019ec31b]]::::backstdback::::writewrite::::spawn_workstd[LlvmCodegenBackend::< as spawn_unchecked_<ExtraBackendMethods::{>closure::#spawn_named_thread::fcd23fca98dce159]]::::LlvmCodegenBackendrustc_codegen_ssa::::{[[0b392610c019ec31b}]b392610c019ec31bclosure, rustc_codegen_ssa()[>#::]0b392610c019ec31bBuilder]>::::backtraits::{}::::::traitsspawn_unchecked_::b70b0e52460f9a66backend]::::spawn_named_threadLlvmCodegenBackend< as rustc_codegen_ssarustc_codegen_ssa::ExtraBackendMethods[>closurespawn_work[>::]backend::::[ +ExtraBackendMethodsback::{, ::closure()#>0 +write>}::::spawn_named_threadb70b0e52460f9a66>::{::{closureclosure#rustc_codegen_llvm[0b70b0e52460f9a66 # 0x 10df9d244] - b70b0e52460f9a66<]<::stdLlvmCodegenBackend>[::{}closure::#LlvmCodegenBackend0>, ()::{}0x, 10df9d244() - fcd23fca98dce159<0closure>#::{0closure}>}<# +, ]std, ::()thread>::::{[Builder()>>::closure0spawn_unchecked_}<, <()fcd23fca98dce159rustc_codegen_llvm>[ #b70b0e52460f9a660]}] :: +::LlvmCodegenBackend as ::{closure10, : thread()#rustc_codegen_ssa::0 Builder}>, >()::>::{::{spawn_unchecked_closureclosure#<1#}< as 1corerustc_codegen_llvm[} as [ b392610c019ec31b 10[18650a1770591c75: b70b0e52460f9a66 ] :: ] ] ::core [traitsops ::::function 0x 18650a1770591c7510df9d244:: - LlvmCodegenBackend< as FnOnce::<::0x::10df9d244traits - ::]::::spawn_named_threadthreadbackend<>rustc_codegen_ssa::[b70b0e52460f9a66b392610c019ec31b]]::::LlvmCodegenBackendback as ::rustc_codegen_ssawrite[::b392610c019ec31bspawn_work]<::rustc_codegen_llvmtraits[::b70b0e52460f9a66backend]::::ExtraBackendMethodsLlvmCodegenBackend>>::::{spawn_named_threadclosure<#rustc_codegen_ssa0[}b392610c019ec31b, ]()::>back::{::closurewrite#::0spawn_work}<, rustc_codegen_llvm()[>b70b0e52460f9a66::{]closure::#LlvmCodegenBackend1>}::{ as closurecore#[018650a1770591c75}], ::()ops>::::{closure#0}functionExtraBackendMethods, >()::>()>spawn_named_thread::b392610c019ec31bclosure]>::#::backcall_once1::{::}::::{writeshim::Builder>>spawn_work as < function::{::closureFnOnce#<0()>11>: :: call_once ::{ shim : vtable # 00x}1055ef7d0 + - std ::11sys: 11 : <}rustc_codegen_llvm, [ :: ()b70b0e52460f9a66>] unix ::{ closure # 0:: thread0x11}::, LlvmCodegenBackend:: ()1055ef7d0 as - : stdrustc_codegen_ssa [::b392610c019ec31b ]Thread ::::newtraits::0xthread_start::::>h8dda2af345bab446backend +:: ::{ ExtraBackendMethods12closure>: # ::1spawn_named_thread}< as syscore::rustc_codegen_ssa[unix18650a1770591c75:: thread]:: Thread:::: newops:: thread_start::::functionh8dda2af345bab446:: +FnOnce < 1055ef7d0()0x>1055ef7d0 - > - stdstd::::::call_oncesyssys::{::::shimunix:::unixthread::::vtableThreadthread::#new::::0thread_startThread::::h8dda2af345bab446new + ::}thread_start :: +h8dda2af345bab44612 + 11: 12: : 0x 1813c506c - __pthread_deallocate + 0x 1055ef7d00x - 1813c506cstd - ::__pthread_deallocatesys +::unix::thread::Thread::new::thread_start::h8dda2af345bab446 + 12: 0x1813c506c - __pthread_deallocate + [ b392610c019ec31b ] :: back ::0xwrite1813c506c:: - spawn_work__pthread_deallocate< +rustc_codegen_llvm[b70b0e52460f9a66]::LlvmCodegenBackend>::{closure#0}, ()>::{closure#0}, ()>::{closure#1} as core[18650a1770591c75]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0} + 11: 0x1055ef7d0 - std::sys::unix::thread::Thread::new::thread_start::h8dda2af345bab446 + 12: 12 : 0x 1813c506c - __pthread_deallocate + 0x1813c506c - __pthread_deallocate + + +rustc version: 1.76.0 (07dca489a 2024-02-04) +platform: aarch64-apple-darwinthread 'coordinator' panicked at compiler/rustc_middle/src/util/bug.rs:36:26: +/rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs:1586:29: worker thread panicked +stack backtrace: + 0: 0x1055ceda8 - std::backtrace::Backtrace::create::h8af6f7a25d8a3749 + 1: 0x10dd02208 - as core[18650a1770591c75]::ops::function::Fn<(&dyn for<'a, 'b> core[18650a1770591c75]::ops::function::Fn<(&'a core[18650a1770591c75]::panic::panic_info::PanicInfo<'b>,), Output = ()> + core[18650a1770591c75]::marker::Sync + core[18650a1770591c75]::marker::Send, &core[18650a1770591c75]::panic::panic_info::PanicInfo)>>::call + 2: 0x1055e7528 - std::panicking::rust_panic_with_hook::h1e70c5d905e30e9d + 3: 0x111e7d168 - std[fcd23fca98dce159]::panicking::begin_panic::::{closure#0} + 4: 0x111e7d0ec - std[fcd23fca98dce159]::sys_common::backtrace::__rust_end_short_backtrace::::{closure#0}, !> + 5: 0x112416040 - std[fcd23fca98dce159]::panicking::begin_panic:: + 6: 0x111df69f4 - rustc_middle[35a781f9bda42497]::util::bug::opt_span_bug_fmt::::{closure#0} + 7: 0x111dedc14 - rustc_middle[35a781f9bda42497]::ty::context::tls::with_opt::::{closure#0}, !>::{closure#0} + 8: 0x111dedbe0 - rustc_middle[35a781f9bda42497]::ty::context::tls::with_context_opt::::{closure#0}, !>::{closure#0}, !> + 9: 0x1124113c4 - rustc_middle[35a781f9bda42497]::util::bug::bug_fmt + 10: 0x10df80270 - std[fcd23fca98dce159]::sys_common::backtrace::__rust_begin_short_backtrace::<::spawn_named_thread::{closure#5}, core[18650a1770591c75]::result::Result>::{closure#0}, core[18650a1770591c75]::result::Result> + 11: 0x10df9d51c - <::spawn_unchecked_<::spawn_named_thread::{closure#5}, core[18650a1770591c75]::result::Result>::{closure#0}, core[18650a1770591c75]::result::Result>::{closure#1} as core[18650a1770591c75]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0} + 12: 0x1055ef7d0 - std::sys::unix::thread::Thread::new::thread_start::h8dda2af345bab446 + 13: 0x1813c506c - __pthread_deallocate +thread 'rustc' panicked at compiler/rustc_middle/src/util/bug.rs:36:26: +/rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs:1959:17: panic during codegen/LLVM phase +stack backtrace: + 0: 0x1055ceda8 - std::backtrace::Backtrace::create::h8af6f7a25d8a3749 + 1: 0x10dd02208 - as core[18650a1770591c75]::ops::function::Fn<(&dyn for<'a, 'b> core[18650a1770591c75]::ops::function::Fn<(&'a core[18650a1770591c75]::panic::panic_info::PanicInfo<'b>,), Output = ()> + core[18650a1770591c75]::marker::Sync + core[18650a1770591c75]::marker::Send, &core[18650a1770591c75]::panic::panic_info::PanicInfo)>>::call + 2: 0x1055e7528 - std::panicking::rust_panic_with_hook::h1e70c5d905e30e9d + 3: 0x111e7d168 - std[fcd23fca98dce159]::panicking::begin_panic::::{closure#0} + 4: 0x111e7d0ec - std[fcd23fca98dce159]::sys_common::backtrace::__rust_end_short_backtrace::::{closure#0}, !> + 5: 0x112416040 - std[fcd23fca98dce159]::panicking::begin_panic:: + 6: 0x111df69f4 - rustc_middle[35a781f9bda42497]::util::bug::opt_span_bug_fmt::::{closure#0} + 7: 0x111dedc14 - rustc_middle[35a781f9bda42497]::ty::context::tls::with_opt::::{closure#0}, !>::{closure#0} + 8: 0x111dedbe0 - rustc_middle[35a781f9bda42497]::ty::context::tls::with_context_opt::::{closure#0}, !>::{closure#0}, !> + 9: 0x1124113c4 - rustc_middle[35a781f9bda42497]::util::bug::bug_fmt + 10: 0x10df79f48 - ::time::>::join::{closure#0}> + 11: 0x10df9f284 - >::join + 12: 0x10df8ed48 - ::join_codegen + 13: 0x10deaa64c - ::link + 14: 0x10dcef11c - rustc_span[d844dabcc0d15e78]::create_session_globals_then::, rustc_interface[9ecbacebda51131]::interface::run_compiler, rustc_driver_impl[d723ad74a265baf3]::run_compiler::{closure#0}>::{closure#0}> + 15: 0x10dd25628 - std[fcd23fca98dce159]::sys_common::backtrace::__rust_begin_short_backtrace::, rustc_driver_impl[d723ad74a265baf3]::run_compiler::{closure#0}>::{closure#0}, core[18650a1770591c75]::result::Result<(), rustc_span[d844dabcc0d15e78]::ErrorGuaranteed>>::{closure#0}::{closure#0}, core[18650a1770591c75]::result::Result<(), rustc_span[d844dabcc0d15e78]::ErrorGuaranteed>> + 16: 0x10dcf7d7c - <::spawn_unchecked_, rustc_driver_impl[d723ad74a265baf3]::run_compiler::{closure#0}>::{closure#0}, core[18650a1770591c75]::result::Result<(), rustc_span[d844dabcc0d15e78]::ErrorGuaranteed>>::{closure#0}::{closure#0}, core[18650a1770591c75]::result::Result<(), rustc_span[d844dabcc0d15e78]::ErrorGuaranteed>>::{closure#1} as core[18650a1770591c75]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0} + 17: 0x1055ef7d0 - std::sys::unix::thread::Thread::new::thread_start::h8dda2af345bab446 + 18: 0x1813c506c - __pthread_deallocate diff --git a/packages/rs-platform-serialization-derive/rustc-ice-2024-02-20T10_35_26-12247.txt b/packages/rs-platform-serialization-derive/rustc-ice-2024-02-20T10_35_26-12247.txt new file mode 100644 index 0000000000..605d873bdf --- /dev/null +++ b/packages/rs-platform-serialization-derive/rustc-ice-2024-02-20T10_35_26-12247.txt @@ -0,0 +1,170 @@ +thread 'cpy vhs4c6sj2h4xpaq' panicked at /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs:913:44: +no saved object file in work product +stack backtrace: +thread 'cpy ebti8ycrnjshmsw' panicked at /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs:913:thread '44cpy oxxcwsebgx1733i: +' panicked at no saved object file in work product/rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs +stack backtrace: +:913:44: +no saved object file in work product +stack backtrace: +thread ' cpy 4orp8g2x23rgnt3a ' panicked at /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs0:: 913 : thread '44 cpy k5jtp3uu1e1wr25 ' panicked at /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs: +: no saved object file in work product +stack backtrace: +0x913100ca6da8: - 44std: +::no saved object file in work productbacktracethread '::cpy 4uzg6vrmxwsbl425Backtrace' panicked at :: +stack backtrace: +/rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rscreate:::913h8af6f7a25d8a3749: +44 : + no saved object file in work product thread '1cpy sz32l9e0944h5s3: ' panicked at +stack backtrace: + /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs : 913 : 44 : +0x 1093da208no saved object file in work product - +stack backtrace: +0 : as 0:: 00x: Backtrace 100ca6da8: - ::std0 :: core : 0x 100ca6da8create - [ backtrace:: ::h8af6f7a25d8a3749 Backtrace + std 18650a1770591c75:: create]:: h8af6f7a25d8a3749 + 0x ::0x 100ca6da8100ca6da8 :: backtrace0x:: Backtrace1::100ca6da8 ops :: : - 0x - function - :: stdcreate Fn core::::::createh8af6f7a25d8a3749:: +h8af6f7a25d8a3749h8af6f7a25d8a3749 - +[< ::alloch8af6f7a25d8a3749[ +18650a1770591c75 + 37ddc2533ea56b7b 1]: 1]::0x 1093da208::1ops :: function: : 1 : - < 0x 1093da208alloc - boxed[::37ddc2533ea56b7b < alloc[ Fn 0x ::< Box0x]37ddc2533ea56b7b::( 0x 1093da2081093da208 ]0x1093da208< - rustc_driver_impl<& - 'boxedalloc[a - d723ad74a265baf3:: as [boxedinstall_ice_hook,::)<, ::Output::install_ice_hookinstall_ice_hookrustc_driver_impl::{[::install_ice_hookFn< = d723ad74a265baf3closure]#::0<::{install_ice_hook::{rustc_driver_impl::{(}()closure>closure&closure::{> + as dyn #closure#corecore0[#}18650a1770591c75#[for::0']>install_ice_hook as ::{aclosure0} as >core as core[#}::coreops[::18650a1770591c75function]::0, [}::>18650a1770591c75[']18650a1770591c75Fn>18650a1770591c75::]b]> ops:: as opsmarkercore[ as for > &18650a1770591c75]Fn]corecore[::]for opscoreops[Fn18650a1770591c75::panic]::::panic_info::::functionPanicInfoops)'PanicInfo>aa<>', , ::function'::bFnFn> > &function,::'Fn::core<[(callcore +[&18650a1770591c75) 18650a1770591c75 ]:::: (opsops::&::function'::, Fnafunction]2::: apanic:: :: panic_infoFn ::< (&'< 'aOutputPanicInfocorecore( a< [core18650a1770591c75[ '18650a1770591c75& = []() >0x + 100cbf528core[18650a1770591c75]coreb:: - >std,::)panic, panicking::Output::marker]'::apanic:: ::18650a1770591c75[Syncrust_panic_with_hook = :: + ]core()h1e70c5d905e30e9dpanic_info::core18650a1770591c75[panic]::::::[ +::>18650a1770591c7518650a1770591c75panic]:: + core]panic_info::panic_infomarker :::: Send:: , [&core::PanicInfoPanicInfo>18650a1770591c75[panic]::::panic_info18650a1770591c75: , 'marker::,PanicInfoPanicInfo<<]'')b::)b>panic , , :: panic_info::, ) >::OutputSyncPanicInfo, 0x)OutputOutputb = = >100cbf2e4> - = + ,,())(), >Output + )core, = >()>stdOutput::() + [core = panicking()18650a1770591c75[>> + :: + corecall>] + corecore +18650a1770591c75[ :: begin_panic_handler ::218650a1770591c75]]::{: core{markerclosure ::::}Sync}[[ 18650a1770591c75[::marker18650a1770591c75 + ] 18650a1770591c75::]] ::h399e32952efd26a4::marker +:: Sync marker marker core:::: + ::::core0xSend[100cbf528Sync18650a1770591c75, ] + &[ - Synccore18650a1770591c75 + ]core::[:: marker18650a1770591c75markercore4[]::::markerpanicSend, ::&[::stdSend: , :: &:: coreSyncpanicking + 18650a1770591c75[core 18650a1770591c75core][[::18650a1770591c75panic_infomarker]:::::: panicSend::rust_panic_with_hook]PanicInfo, ::&18650a1770591c75coremarker18650a1770591c75]][ ::)18650a1770591c75 panic_info ::0x]PanicInfo)::>>::100cbca18::panic - std::Sendmarker, ::>Send&, ::&core::[call::h1e70c5d905e30e9dpanic:: +>:: panic_info :: ::18650a1770591c75panic_info3sys_common]:: +callcorePanicInfo ) > [218650a1770591c75backtrace +::: >:: __rust_end_short_backtracePanicInfo ):: :: paniccall>]> +::: :: ::h2ab87f841a2323e7 2 +panic panic_info :: panic_info:::: PanicInfo ) call 2 : : > >:: PanicInfo ) > > 5 ::: 0xcall + + :: 100cbf2e4call 2 - std +2:: panicking0x ::: begin_panic_handler ::0x 0x : { { 100cbf528100cbf528100cbf528 0x 100cbf06c - closure - } _rust_begin_unwind 0x0x +100cbf528 - - stdstd::2panicking::::panickingrust_panic_with_hook::::rust_panic_with_hookstd - }std: h1e70c5d905e30e9d::::100cbf528 :: panicking - ::h1e70c5d905e30e9dstd +:: panicking :: 6 : 3 : :: panickingrust_panic_with_hook :: h1e70c5d905e30e9d:: + + rust_panic_with_hook :: 33h399e32952efd26a4rust_panic_with_hook: h1e70c5d905e30e9d: + 3 : + 0x 100cbf2e4 - 4:: std : 0x:: 100cbf2e4panicking - ::stdbegin_panic_handler:: panicking0x:: 0x 100d18bd0{ - h1e70c5d905e30e9d0x +100cbca18 {100cbf2e4 core 0xclosure - } - ::::}std ::0xh399e32952efd26a4100cbf2e4 +:: - 100cbf528panicking begin_panic_handler - :: {4stdpanicking: :: 3 ::std :: panickingbegin_panic_handler ::sys_commonstd{::{::panickingclosure{::backtracebegin_panic_handler::::__rust_end_short_backtrace:: ::{closurepanic_fmt ::::}0xh2ab87f841a2323e7h33e40d2a93cab78f100cbca18 + - : }std}::::} { ::sys_common ::7backtrace: h399e32952efd26a4 rust_panic_with_hookclosure +:::: h1e70c5d905e30e9d} __rust_end_short_backtrace h399e32952efd26a4 +5 :: } ::4h399e32952efd26a4: + + +h2ab87f841a2323e7: + 0x 4 0x 5 : 3 : 0x 4 : 100d18b9c 100cbca18100cbf2e4 - : 0x 100cbf06c - std - :: std - ::0xcore100cbca18sys_common::::optionbacktrace::::expect_failed__rust_end_short_backtracepanicking:: - std :: sys_commonh8c59d9d921ed21360x:: +100cbf06cbacktrace - ::::0xh2ab87f841a2323e7__rust_end_short_backtrace100cbf2e4:: - h2ab87f841a2323e7std +::0x panicking + :: begin_panic_handler:: ::_rust_begin_unwind begin_panic_handler _rust_begin_unwind8{: { + closure } } 5::100cbca18: :: 6 + : 5{: { - std :: sys_common :: closure 0xh399e32952efd26a4}100cbf06c} - ::_rust_begin_unwindh399e32952efd26a4 + + 6 backtrace : :: __rust_end_short_backtrace 40x: 100d18bd0 +0x::100cbf06ch2ab87f841a2323e7 - +_rust_begin_unwind +0x 1096743ec - rustc_codegen_ssa6[: b392610c019ec31b ] :: back :: 0xwrite100d18bd0:: - execute_copy_from_cache_work_itemcore :: panicking :: panic_fmt :: h33e40d2a93cab78f0x +100d18bd05 - core :: panicking :: panic_fmt :: h33e40d2a93cab78f - ::core +<:: 4panicking6::: panic_fmt :: h33e40d2a93cab78f + : rustc_codegen_llvm0x [100d18bd0 b70b0e52460f9a66 - : core]::::panickingLlvmCodegenBackend:: > +panic_fmt 7 9 0x: 100cbca18 - 7std : : :: sys_common 7:: h33e40d2a93cab78f:: backtrace :: 0x: 100cbca18 0x - 100d18b9cstd - ::coresys_common:: +option :: expect_failed0x::100d18b9ch8c59d9d921ed2136 - +core :: option :: expect_failed :: h8c59d9d921ed2136 __rust_end_short_backtrace:: + 0x 100cbf06c8 - : _rust_begin_unwind + backtrace ::6__rust_end_short_backtrace: :: 7:: h2ab87f841a2323e7: + 0x5100d18bd0 - core8 0x: :: 0x 100d18b9c - panicking109656508core:: :: - optionstd::[expect_failedfcd23fca98dce159]panic_fmt ::::sys_commonh8c59d9d921ed2136:: +backtrace ::h2ab87f841a2323e7__rust_begin_short_backtrace :: +< < rustc_codegen_llvm [ 0xb70b0e52460f9a665]: :: 100d18b9c LlvmCodegenBackend8 as : rustc_codegen_ssa - [ b392610c019ec31b ]0x 1096743ec:: - traits rustc_codegen_ssa::[backendb392610c019ec31b::]ExtraBackendMethods::>core :: ::spawn_named_threadoption< ::rustc_codegen_ssa0xexpect_failed[::b392610c019ec31b100cbf06ch8c59d9d921ed2136] +:: - back _rust_begin_unwind:: +write8 : :: spawn_work < rustc_codegen_llvm: 6 : 0x 0x0x100cbf06c100d18bd0 - - _rust_begin_unwindcore0x +::1096743ecpanicking - ::1096743ecrustc_codegen_ssapanic_fmt[::b392610c019ec31bh33e40d2a93cab78f] +:: - back :: write7::: rustc_codegen_ssa execute_copy_from_cache_work_item[ b392610c019ec31b :: < ] :: back0x::100d18b9cwrite6 - ::coreexecute_copy_from_cache_work_item::::option<::rustc_codegen_llvm: rustc_codegen_llvm[expect_failed[:: b70b0e52460f9a66h8c59d9d921ed2136] + :: b70b0e52460f9a66 ]8 ::: LlvmCodegenBackend > + 9 : 0x 1096743ec - rustc_codegen_ssa [::0xb392610c019ec31b100d18bd0h33e40d2a93cab78f] - ::coreback:::: +panickingwrite :::: panic_fmtexecute_copy_from_cache_work_item ::::<7h33e40d2a93cab78frustc_codegen_llvm: +[ b70b0e52460f9a66 ] 7::: LlvmCodegenBackend > + 9 : 0x 100d18b9c0x - core :: option 100d18b9c:: - expect_failedcore ::::h8c59d9d921ed21360xoption +::109656508 expect_failed :: h8c59d9d921ed21368 +: [ - std [8fcd23fca98dce159: ] :: LlvmCodegenBackend sys_commonb70b0e52460f9a66 :: ]backtrace :: __rust_begin_short_backtraceback::::LlvmCodegenBackend::>< < 0x rustc_codegen_llvm [ 1096743ecwrite - 0xb70b0e52460f9a66 ]> :: + execute_copy_from_cache_work_item :: ::{ +rustc_codegen_ssa [:: traits b392610c019ec31b - :: ] b70b0e52460f9a660x]::backend109656508:: rustc_codegen_ssa, ExtraBackendMethods ()>[>::::{spawn_named_threadb392610c019ec31b<::9rustc_codegen_ssaLlvmCodegenBackend: backclosure[::b392610c019ec31bwrite]::::execute_copy_from_cache_work_itemback>]::std:: - backstd::#backtrace +b70b0e52460f9a66 :: 90x]109656508write - ::: LlvmCodegenBackendstd>[ +fcd23fca98dce1590 +]:: :: }sys_common ::9backtrace: :: , () > +spawn_worksys_common :: backtrace ::9 :: __rust_begin_short_backtrace 0x:: < 109656508<__rust_begin_short_backtracerustc_codegen_llvm - __rust_begin_short_backtrace[::b70b0e52460f9a66<]<::::LlvmCodegenBackend< as rustc_codegen_llvmrustc_codegen_ssa[[rustc_codegen_llvmb70b0e52460f9a66<] :: LlvmCodegenBackend10b392610c019ec31b>: std< rustc_codegen_llvm[::{[ b70b0e52460f9a66fcd23fca98dce159: ]closure :: LlvmCodegenBackend as # 0 } ][:: sys_commonb70b0e52460f9a66, 0x()109656508> - ::]std::{::[closurefcd23fca98dce159# backtrace0::}__rust_begin_short_backtrace, ::()LlvmCodegenBackend]>0x:: +109656508traits - std as [ rustc_codegen_ssafcd23fca98dce159[10]: b392610c019ec31b:: ] backend :: ExtraBackendMethods > ::rustc_codegen_ssa :: [spawn_named_thread <0xb392610c019ec31b109675244]traits - ::[::fcd23fca98dce159std::[fcd23fca98dce159[]]::::backspawn_named_threadthread::::writeBuilder::>traits::{::closurebackend::::#ExtraBackendMethods0>}::, <()rustc_codegen_llvm>]::{::[back::closurerustc_codegen_llvm#[0b70b0e52460f9a66}]b70b0e52460f9a66, traits()::>backend +::spawn_named_thread ExtraBackendMethods >10::]rustc_codegen_ssaBuilder: [ b392610c019ec31b ] :: < rustc_codegen_ssa [ b392610c019ec31b0xwrite]109675244:: - back<::>::writeLlvmCodegenBackend:: as spawn_work::]<::{]rustc_codegen_llvmclosure[#b70b0e52460f9a660LlvmCodegenBackend]::::>::LlvmCodegenBackendLlvmCodegenBackend>::{rustc_codegen_ssa:: as LlvmCodegenBackendclosurerustc_codegen_ssa>[#::{b392610c019ec31b[[]b392610c019ec31b::]traitsfcd23fca98dce1590::::]}traitsbackend::::backendExtraBackendMethods::>ExtraBackendMethods::>, ::()spawn_named_thread>, #()::0spawn_named_thread>}::{::, closure()#>0<::::{writeclosure::}spawn_work::{#<0rustc_codegen_llvm}[, closureb70b0e52460f9a66()spawn_named_thread, >() +>< + # 100rustc_codegen_ssa , 10[(): > : } , ()>>b392610c019ec31b + ] :: spawn_unchecked_10::: < < rustc_codegen_llvm [ b70b0e52460f9a66 ] :: LlvmCodegenBackend0x109675244] - back< < std [ as ::{::::closurewrite#::0spawn_work}rustc_codegen_ssafcd23fca98dce159, ]()LlvmCodegenBackend>:: +>thread :: Builder10>: ::[ spawn_unchecked_b392610c019ec31b::{ < < rustc_codegen_llvm [ closure #0x0109675244} - , <]()<::std [ >fcd23fca98dce159 ]0x::{back::::closurethreadwrite#::::spawn_workBuilder<>rustc_codegen_llvm::[spawn_unchecked_rustc_codegen_ssab70b0e52460f9a660x0]109675244[:: - LlvmCodegenBackend<><}::{stdclosure[b392610c019ec31bfcd23fca98dce159, ]]::::()traitsthread::::backendBuilder<::><::ExtraBackendMethodsrustc_codegen_llvmspawn_unchecked_>[::[::fcd23fca98dce159LlvmCodegenBackend]>::::{#closurethread#::0Builder}>]::<::{rustc_codegen_llvmclosure[#, 1b70b0e52460f9a66::}] as ::coreLlvmCodegenBackend[ as 18650a1770591c75writerustc_codegen_ssa]LlvmCodegenBackend[::b392610c019ec31bops]:: as ::::traitsspawn_work::backend::]::::spawn_named_thread}traits<::rustc_codegen_ssabackend[spawn_unchecked_>b392610c019ec31b::{]closure::#, 0back}<::, write()::><::{spawn_workclosure<#rustc_codegen_llvm[[rustc_codegen_llvmfunction[::b70b0e52460f9a66FnOnceb70b0e52460f9a66]b70b0e52460f9a66::ExtraBackendMethods>>::::call_oncespawn_named_thread::{()>0::}:: +backspawn_named_thread:: write ::{1::11spawn_work: LlvmCodegenBackend::[LlvmCodegenBackend>>18650a1770591c75 ::{]::{ closure # 0 closureLlvmCodegenBackend< ::rustc_codegen_ssa0x[100cc77d0ops - #b392610c019ec31b0 as }], rustc_codegen_ssa()}, >, ::{()closure>#::{0::}closure, ()()#>std0::}sys, ::()>unix[::{b392610c019ec31bclosure]#::0traits::::>function::{::}closureFnOnce#<1()}>threadback, as ()core>[::{::closure18650a1770591c75#]0::}backendops::::writefunction::::spawn_workFnOnce< +::rustc_codegen_llvmThread[::b70b0e52460f9a66new]::::ExtraBackendMethods::{LlvmCodegenBackend>>::::{closure closure #100#, <>()::>call_once>::{::shim1: : vtable # call_once0()::{} > as core [::{ 18650a1770591c75::shim]thread_start:::opsspawn_named_thread::::vtablefunctionclosure::##FnOnce1<}0rustc_codegen_ssa as [}core +h8dda2af345bab446 + [110x: 109675244} - < +<}(), >()>>::b392610c019ec31b ]call_once<11std: [ ::{18650a1770591c75 fcd23fca98dce159 shim:: back :: write ] :0x::100cc77d0vtable - #stdspawn_work0::<12sys: rustc_codegen_llvm ::{::closure unix :: thread ::] Thread ::0xnew100cc77d0::::#::0opsthread}::::, functionBuilder}[ +> :: b70b0e52460f9a66spawn_unchecked_::<11<: rustc_codegen_llvmFnOnce[ b70b0e52460f9a66<]]::::()LlvmCodegenBackendthread_start as ::rustc_codegen_ssah8dda2af345bab446[LlvmCodegenBackend + 0x121813c506c> - - std__pthread_deallocate:: +sys ::::{ unixclosure:: thread#:: Thread0 ::}0xnew, ::100cc77d0thread_start()::> - h8dda2af345bab446::{std +closure # ::120sys}: , ::() unix >:: thread ::{ :: closureThread0x#::1813c506c1new - }::__pthread_deallocate as +thread_startcore::[h8dda2af345bab44618650a1770591c75 +] :: ops12::: function :: FnOnce < () > > ::0xcall_once1813c506c::{ - shim__pthread_deallocate: +vtable#0} + 11: 0x100cc77d0 - std::sys::unix::thread::Thread::new::thread_start::h8dda2af345bab446 + 12: 0x1813c506c - __pthread_deallocate +()>>>::{::closurecall_once#::{1shim}:vtable#0} + 11: 0x100cc77d0 - std::sys::unix::thread::Thread::new::thread_start::h8dda2af345bab446 + 12: 0x1813c506c - __pthread_deallocate + as core[18650a1770591c75]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0} + 11: 0x100cc77d0 - std::sys::unix::thread::Thread::new::thread_start::h8dda2af345bab446 + 12: 0x1813c506c - __pthread_deallocate +b392610c019ec31b]::traits::backend::ExtraBackendMethods>::: spawn_named_thread < rustc_codegen_ssa [ b392610c019ec31b ] :: back0x::1813c506cwrite - ::__pthread_deallocatespawn_work +::{closure#0}, ()>::{closure#0}, ()>::{closure#1} as core[18650a1770591c75]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0} + 11: 0x100cc77d0 - std::sys::unix::thread::Thread::new::thread_start::h8dda2af345bab446 + 12: 0x1813c506c - __pthread_deallocate + + +rustc version: 1.76.0 (07dca489a 2024-02-04) +platform: aarch64-apple-darwinthread 'coordinator' panicked at compiler/rustc_middle/src/util/bug.rs:36:26: +/rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs:1586:29: worker thread panicked +stack backtrace: + 0: 0x100ca6da8 - std::backtrace::Backtrace::create::h8af6f7a25d8a3749 + 1: 0x1093da208 - as core[18650a1770591c75]::ops::function::Fn<(&dyn for<'a, 'b> core[18650a1770591c75]::ops::function::Fn<(&'a core[18650a1770591c75]::panic::panic_info::PanicInfo<'b>,), Output = ()> + core[18650a1770591c75]::marker::Sync + core[18650a1770591c75]::marker::Send, &core[18650a1770591c75]::panic::panic_info::PanicInfo)>>::call + 2: 0x100cbf528 - std::panicking::rust_panic_with_hook::h1e70c5d905e30e9d + 3: 0x10d555168 - std[fcd23fca98dce159]::panicking::begin_panic::::{closure#0} + 4: 0x10d5550ec - std[fcd23fca98dce159]::sys_common::backtrace::__rust_end_short_backtrace::::{closure#0}, !> + 5: 0x10daee040 - std[fcd23fca98dce159]::panicking::begin_panic:: + 6: 0x10d4ce9f4 - rustc_middle[35a781f9bda42497]::util::bug::opt_span_bug_fmt::::{closure#0} + 7: 0x10d4c5c14 - rustc_middle[35a781f9bda42497]::ty::context::tls::with_opt::::{closure#0}, !>::{closure#0} + 8: 0x10d4c5be0 - rustc_middle[35a781f9bda42497]::ty::context::tls::with_context_opt::::{closure#0}, !>::{closure#0}, !> + 9: 0x10dae93c4 - rustc_middle[35a781f9bda42497]::util::bug::bug_fmt + 10: 0x109658270 - std[fcd23fca98dce159]::sys_common::backtrace::__rust_begin_short_backtrace::<::spawn_named_thread::{closure#5}, core[18650a1770591c75]::result::Result>::{closure#0}, core[18650a1770591c75]::result::Result> + 11: 0x10967551c - <::spawn_unchecked_<::spawn_named_thread::{closure#5}, core[18650a1770591c75]::result::Result>::{closure#0}, core[18650a1770591c75]::result::Result>::{closure#1} as core[18650a1770591c75]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0} + 12: 0x100cc77d0 - std::sys::unix::thread::Thread::new::thread_start::h8dda2af345bab446 + 13: 0x1813c506c - __pthread_deallocate +thread 'rustc' panicked at compiler/rustc_middle/src/util/bug.rs:36:26: +/rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs:1959:17: panic during codegen/LLVM phase +stack backtrace: + 0: 0x100ca6da8 - std::backtrace::Backtrace::create::h8af6f7a25d8a3749 + 1: 0x1093da208 - as core[18650a1770591c75]::ops::function::Fn<(&dyn for<'a, 'b> core[18650a1770591c75]::ops::function::Fn<(&'a core[18650a1770591c75]::panic::panic_info::PanicInfo<'b>,), Output = ()> + core[18650a1770591c75]::marker::Sync + core[18650a1770591c75]::marker::Send, &core[18650a1770591c75]::panic::panic_info::PanicInfo)>>::call + 2: 0x100cbf528 - std::panicking::rust_panic_with_hook::h1e70c5d905e30e9d + 3: 0x10d555168 - std[fcd23fca98dce159]::panicking::begin_panic::::{closure#0} + 4: 0x10d5550ec - std[fcd23fca98dce159]::sys_common::backtrace::__rust_end_short_backtrace::::{closure#0}, !> + 5: 0x10daee040 - std[fcd23fca98dce159]::panicking::begin_panic:: + 6: 0x10d4ce9f4 - rustc_middle[35a781f9bda42497]::util::bug::opt_span_bug_fmt::::{closure#0} + 7: 0x10d4c5c14 - rustc_middle[35a781f9bda42497]::ty::context::tls::with_opt::::{closure#0}, !>::{closure#0} + 8: 0x10d4c5be0 - rustc_middle[35a781f9bda42497]::ty::context::tls::with_context_opt::::{closure#0}, !>::{closure#0}, !> + 9: 0x10dae93c4 - rustc_middle[35a781f9bda42497]::util::bug::bug_fmt + 10: 0x109651f48 - ::time::>::join::{closure#0}> + 11: 0x109677284 - >::join + 12: 0x109666d48 - ::join_codegen + 13: 0x10958264c - ::link + 14: 0x1093c711c - rustc_span[d844dabcc0d15e78]::create_session_globals_then::, rustc_interface[9ecbacebda51131]::interface::run_compiler, rustc_driver_impl[d723ad74a265baf3]::run_compiler::{closure#0}>::{closure#0}> + 15: 0x1093fd628 - std[fcd23fca98dce159]::sys_common::backtrace::__rust_begin_short_backtrace::, rustc_driver_impl[d723ad74a265baf3]::run_compiler::{closure#0}>::{closure#0}, core[18650a1770591c75]::result::Result<(), rustc_span[d844dabcc0d15e78]::ErrorGuaranteed>>::{closure#0}::{closure#0}, core[18650a1770591c75]::result::Result<(), rustc_span[d844dabcc0d15e78]::ErrorGuaranteed>> + 16: 0x1093cfd7c - <::spawn_unchecked_, rustc_driver_impl[d723ad74a265baf3]::run_compiler::{closure#0}>::{closure#0}, core[18650a1770591c75]::result::Result<(), rustc_span[d844dabcc0d15e78]::ErrorGuaranteed>>::{closure#0}::{closure#0}, core[18650a1770591c75]::result::Result<(), rustc_span[d844dabcc0d15e78]::ErrorGuaranteed>>::{closure#1} as core[18650a1770591c75]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0} + 17: 0x100cc77d0 - std::sys::unix::thread::Thread::new::thread_start::h8dda2af345bab446 + 18: 0x1813c506c - __pthread_deallocate diff --git a/packages/rs-platform-serialization-derive/rustc-ice-2024-02-20T10_35_28-12710.txt b/packages/rs-platform-serialization-derive/rustc-ice-2024-02-20T10_35_28-12710.txt new file mode 100644 index 0000000000..943139e3f9 --- /dev/null +++ b/packages/rs-platform-serialization-derive/rustc-ice-2024-02-20T10_35_28-12710.txt @@ -0,0 +1,170 @@ +thread 'cpy oxxcwsebgx1733i' panicked at /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs:913:44: +no saved object file in work product +stack backtrace: +thread 'cpy ebti8ycrnjshmsw' panicked at /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs:913:44: +no saved object file in work product +stack backtrace: + thread '0cpy 5fuhladjlcxb67o9: ' panicked at /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs : 913 : 44 : + no saved object file in work product0x +stack backtrace: +thread 'cpy 4orp8g2x23rgnt3a' panicked at /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs:913:44thread ': +cpy k5jtp3uu1e1wr25no saved object file in work product' panicked at +stack backtrace: +/rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs1036aeda8: - 913std:::44backtrace: +::Backtraceno saved object file in work productthread '::cpy 4uzg6vrmxwsbl425thread '' panicked at cpy sz32l9e0944h5s3 +stack backtrace: +' panicked at /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs/rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs::913create:91344: : +44no saved object file in work product: + +stack backtrace: + ::no saved object file in work producth8af6f7a25d8a3749 +0 +stack backtrace: + : thread ' cpy vhs4c6sj2h4xpaq1' panicked at : /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs : 913 :44 : + no saved object file in work product 0 +stack backtrace: + 0 : : 0x 10bde2208 - <0x alloc 0 : [ 37ddc2533ea56b7b1036aeda8 ] - std 0::0x0x :: boxed1036aeda80 - : backtrace 1036aeda8 : 0x::1036aeda8Backtrace 0:: - : std std:: :::: Boxcreatebacktracebacktrace - std :: backtrace<::rustc_driver_impl [0xd723ad74a265baf3::1036aeda8::Backtrace - Backtrace ::Backtrace:: :: ] create ::::h8af6f7a25d8a3749create:: +stdcreate0xh8af6f7a25d8a3749h8af6f7a25d8a37490x 1036aeda8:: +1036aeda8 +:: backtrace - ::Backtrace - install_ice_hook ::{ closure #10:: }h8af6f7a25d8a3749 1>: :: +std std : as core 1create: :: h8af6f7a25d8a3749 + [ :: 18650a1770591c75backtrace:::: ]backtrace1Backtrace: :: ::0x 1opsBacktrace:::::: 10bde2208 : functioncreate::::Fnh8af6f7a25d8a3749< +( & dyn for< ' 1 create a0x, - :: : <' h8af6f7a25d8a3749 b0x > 0x +10bde2208 alloc 1 - 10bde2208< - alloc[10bde2208core[ - : <[alloc18650a1770591c75[ 37ddc2533ea56b7b37ddc2533ea56b7b< ]alloc][ 37ddc2533ea56b7b37ddc2533ea56b7b:::: ops:: ]]0x::]boxed::0xboxed10bde2208::function::::Box::boxedBox10bde2208boxed - - Fn<::Box >[::closure::{#closured723ad74a265baf3b[::0[ as install_ice_hook as >}core::{d723ad74a265baf3core0[>,18650a1770591c75[18650a1770591c75) as closurecore]18650a1770591c75], ::[Output]ops::#}::>ops18650a1770591c750::ops} as >] as core::[ = install_ice_hookcore::::{function[closurefunction#()18650a1770591c75::]18650a1770591c75]::0::::>function:::: + FnopsopsFn<]::<(::}(Fn>&< as corecore[ops18650a1770591c75function]dyn [(18650a1770591c75&::&for<::dyn ::::functionFn]dyn ::'::amarkerfor< > dyn bbfor core''> &coredyn core[corea18650a1770591c75, ][::[b'18650a1770591c75core[for 'ba[> 18650a1770591c75, ]::core18650a1770591c75[]'function18650a1770591c75b::> corecore::::18650a1770591c75ops]::]function::[ops[marker18650a1770591c75]Fn::]ops::::::functionFn::function::18650a1770591c75ops::::panic>::PanicInfo'::::PanicInfoPanicInfo<<''panic,::)panic_info, ::OutputPanicInfo = <()b'ab >core,[)18650a1770591c75, 'Output]b = ::()>>panic, + ::)::::call> +PanicInfo < + core2': [ b 18650a1770591c75 > ] :: , marker)0x::1036c7528, - SyncstdOutput:: = + panicking()::core>rust_panic_with_hook[:: + h1e70c5d905e30e9d18650a1770591c75 +core ] [ ::3marker: :: Send 18650a1770591c75 , ] & core ::[0xmarker1036c72e418650a1770591c75 - ::std]Sync:::: + panickingpanic::corebegin_panic_handler::::[{panic_info{18650a1770591c75closure]}::}PanicInfo::::h399e32952efd26a4) +marker> :: >Send ::4, : call & + core [ 18650a1770591c75 0x]1036c4a18 - ::stdpanic2::::sys_common: >::,backtrace) corepanic_info[::18650a1770591c75PanicInfo::, panic_info]Output:: = marker()::__rust_end_short_backtraceSync::>PanicInfo + h2ab87f841a2323e7, +panic_info, + Outputcore = [):: 18650a1770591c75PanicInfo() )]18650a1770591c75 ::::OutputSync> + core [ 18650a1770591c75]]>:::: callmarker +::5 ': 0xSend , 1036c7528& core - [ 18650a1770591c75std] ::::panicpanicking::::panic_inforust_panic_with_hook:::: h1e70c5d905e30e9d + 0x 1036c706c - 3_rust_begin_unwind: + 6 : 0x 1036c72e4 - std :: panicking0x::103720bd0begin_panic_handler - ::core{::{panickingclosure::}panic_fmt}::::h33e40d2a93cab78fh399e32952efd26a4 + + 74: : 0x0x103720b9c1036c4a18 - - corestd::::optionsys_common::::expect_failedbacktrace::::h8c59d9d921ed2136__rust_end_short_backtrace +:: h2ab87f841a2323e7 + 8 : 5 : 0x 10c07c3ec - 0xrustc_codegen_ssa1036c706c[ - b392610c019ec31b_rust_begin_unwind] +:: back :: write6::: execute_copy_from_cache_work_item :: < rustc_codegen_llvm [ b70b0e52460f9a66 ] ::0xLlvmCodegenBackend103720bd0> - +core :: panicking ::9panic_fmt: :: h33e40d2a93cab78f + 7 : 0x 10c05e508 - std [ fcd23fca98dce159 ] ::0xsys_common103720b9c:: - backtracecore::::__rust_begin_short_backtraceoption::::rustc_codegen_ssa::[spawn_named_threadb392610c019ec31b<]rustc_codegen_ssa::[backb392610c019ec31b::]write::::backexecute_copy_from_cache_work_item::::write<::rustc_codegen_llvmspawn_work[:: +LlvmCodegenBackend > ::{ closure9#: 0 } , () > ::{ closure #0x010c05e508} - , std()[>fcd23fca98dce159 +] :: sys_common10::: backtrace :: __rust_begin_short_backtrace :: < < rustc_codegen_llvm [0xb70b0e52460f9a6610c07d244] - ::::::ExtraBackendMethodsspawn_unchecked_><::rustc_codegen_ssa>[::b392610c019ec31bcall] + :: +traits :: = backend ]core2()[::: 18650a1770591c75 ] :: marker>::backSync:: + writecore::[spawn_work::b + > core18650a1770591c75: [0x::{::[]closureOutput18650a1770591c75# ExtraBackendMethods1036c7528::> - 0std}::18650a1770591c75 panicking]:::: = spawn_named_thread()<>rustc_codegen_ssa + , marker::rust_panic_with_hook][:: core::panic::h1e70c5d905e30e9dmarker [:: ()Sendpanic_info +:::: b392610c019ec31b, ]&18650a1770591c75 core>[0x18650a1770591c751036c7528] - ::stdSyncPanicInfo:: + ) >] >::3::: callcore + [ 18650a1770591c75 marker ::{ backpanic]closure::::::#marker2::0Send}panicking: 0x :: Sync1036c72e4, :: () panic_info, :: + &rust_panic_with_hookcore - >::[write +std::corePanicInfo 18650a1770591c75[ )h1e70c5d905e30e9d::]>spawn_work><0xrustc_codegen_llvm::call10 +[:: panicking b70b0e52460f9a66] ::18650a1770591c75::]marker3: ::1036c7528:: begin_panic_handler : panic :::: + ::LlvmCodegenBackend panic_info{ - std :: panicking{::closurerust_panic_with_hook>::Sendh1e70c5d905e30e9d::, + } PanicInfo &::{ )closure 0xcore> } [ 0x18650a1770591c7510c07d244]2 - ::1036c72e4< - <::stdstd[h399e32952efd26a4fcd23fca98dce159::] +:: threadpanicking::::Builder #panic0begin_panic_handler >::}: panic_info3::>, ::spawn_unchecked_():: PanicInfo<4<::rustc_codegen_llvm {>)::{: : > 0x {1036c7528 - closure std>call[ +:: #call + :: panickingclosure20}: 0x::} ::}b70b0e52460f9a66 1036c4a18h399e32952efd26a4rust_panic_with_hook - +:: h1e70c5d905e30e9d, std :: sys_common +2]4() ::: 0x1036c72e4 - >::: backtrace::{LlvmCodegenBackend::closure# 1std __rust_end_short_backtrace :: as h2ab87f841a2323e7} +3 :: panicking as rustc_codegen_ssa: core:: begin_panic_handler[5 :: : 0x [ 0x18650a1770591c75 b392610c019ec31b {1036c75281036c4a18{]] ::::ops ::traits - function:: std ::::backendclosure - panicking } ::0x::rust_panic_with_hook1036c706cExtraBackendMethods - ::FnOnceh1e70c5d905e30e9d< +() > >0x >std ::::1036c7528spawn_named_threadsys_common<::::_rust_begin_unwind +0x}1036c72e4backtrace3:: - ::rustc_codegen_ssa__rust_end_short_backtrace[ ::b392610c019ec31bh2ab87f841a2323e7 - call_oncestd::{ +shim::: vtablepanicking# 0::} +begin_panic_handler 5 ::11: : h399e32952efd26a4] : std::::back +{panicking { ::::writerust_panic_with_hook :: :: closure 6h1e70c5d905e30e9d: +4 : spawn_work } <0x 1036c706c0x - 1036cf7d0_rust_begin_unwind - + rustc_codegen_llvm [ b70b0e52460f9a66 ]6:: LlvmCodegenBackend: > ::{ closure# std 3} : 0 } , ()0x>1036c72e4 0x - 1036c72e4std - ::stdpanicking::::panickingbegin_panic_handler::::begin_panic_handler{::::{ { {0xclosure103720bd0} - }core::closure::h399e32952efd26a4panicking +:: panic_fmt :: ::#40: }sys , () > ::{ closure ::#unix1 }:: as threadcore::[Thread18650a1770591c75::]new::::opsthread_start::::::h8dda2af345bab446h399e32952efd26a4 + + { closure4}: } :: h399e32952efd26a4 + 40x120x1036c4a181036c4a18: - - h33e40d2a93cab78fstd +:: sys_common :: backtracefunction :: __rust_end_short_backtrace :: 0xh2ab87f841a2323e7:: + FnOnce < std()1036c4a18 > - >std::: call_once::{shim0x:: 57 ::: sys_common :: backtrace :: __rust_end_short_backtrace: :: h2ab87f841a2323e7 + 5 : 0x 1036c706c - _rust_begin_unwind + 0x61036c706c: - _rust_begin_unwind + 6 : 0x 103720bd0 - core :: panicking :: panic_fmt0x::103720bd0h33e40d2a93cab78f - +core :: panicking ::7panic_fmt: :: h33e40d2a93cab78f + 7 : 0x 103720b9c - core :: option :: expect_failed0x::103720b9ch8c59d9d921ed2136 - +core :: option ::8expect_failed: :: h8c59d9d921ed2136 + :8 : vtable0x 10c07c3ec - rustc_codegen_ssa#[0 } + 103720bd0 b392610c019ec31b - 11coresys_common]::::::panicking backtraceback::: panic_fmt ::::::write :: 0x __rust_end_short_backtraceh33e40d2a93cab78f +::1813c506c - h2ab87f841a2323e7execute_copy_from_cache_work_item0x:: 10c07c3ec< - rustc_codegen_ssa [rustc_codegen_llvmb392610c019ec31b[]::__pthread_deallocateb70b0e52460f9a66back]::::write :: +execute_copy_from_cache_work_item 0x +103720b9c LlvmCodegenBackend >:: <75 + - : : core rustc_codegen_llvm [ b70b0e52460f9a66 ] 0x 0x1036c4a18 1036cf7d0 - - stdstd::::sys_common::backtrace:: __rust_end_short_backtrace9::sys: h2ab87f841a2323e7 + :: :: option::5 unix: 0x LlvmCodegenBackend > 0x +103720b9c - :: expect_failedcore:: h8c59d9d921ed213690x +: ::1036c706c option :: - expect_failed :: h8c59d9d921ed21368::: _rust_begin_unwind + + thread::Thread80x: 10c05e5081036c706c - :: - new std::[thread_startfcd23fca98dce159::]::sys_commonh8dda2af345bab446 + 0x1210c05e508 - std [ fcd23fca98dce159 ] :: sys_common ::0xbacktrace10c07c3ec:: - __rust_begin_short_backtracerustc_codegen_ssa::[option +:: expect_failed 9 : 0x 103720bd0 - core ::0xpanicking10c05e508:: - panic_fmtstd[fcd23fca98dce159]::sys_common::backtrace::__rust_begin_short_backtrace::<::spawn_named_thread::{::closureh33e40d2a93cab78f#0::b70b0e52460f9a66:: +}]h8c59d9d921ed2136, :: +backend :: ExtraBackendMethods>:: ()8>: ::{ closure # 0 0x10c07c3ec - rustc_codegen_ssa[b392610c019ec31b]::back::write::execute_copy_from_cache_work_item::::[ +b70b0e52460f9a66] :: LlvmCodegenBackend >9 +: 9 : backend :: ExtraBackendMethods >0x 0x10c05e508 10c05e508 - - stdstd[[fcd23fca98dce159spawn_named_thread]fcd23fca98dce159::::]sys_common< }rustc_codegen_ssaspawn_named_thread, [b392610c019ec31b7()]: ::] +::LlvmCodegenBackend > ::{10closure: # 0 } , () > ::{ closure0x#10c07d2440 - }<, <()std>[ +fcd23fca98dce159 ] ::10thread: :: Builder > :: spawn_unchecked_ < < rustc_codegen_llvm0x[10c07d244b70b0e52460f9a66 - ]<::sys_common::::spawn_unchecked_backtrace<::<__rust_begin_short_backtracebacktrace:: ExtraBackendMethods]>::::::spawn_named_threadspawn_named_threadLlvmCodegenBackend<rustc_codegen_ssa[::{b392610c019ec31bclosure][::#backb392610c019ec31b::0write]::}spawn_work::<, rustc_codegen_llvmback[::b70b0e52460f9a66()]write::>LlvmCodegenBackend::>::{::{spawn_workclosureclosure#<0#}rustc_codegen_llvm, 0()[>}::{b70b0e52460f9a66closure, #()0]}::, >()LlvmCodegenBackend +>> + ::{ closure 10#: 0 10} : , () 0x>10c07d244 - ::{< closure< std [#0xfcd23fca98dce1590]10c07d244::}thread - ::, Builder<>()::<::{traits18650a1770591c75::::backend]::spawn_unchecked_ExtraBackendMethods::><::opsspawn_named_thread<<::rustc_codegen_ssarustc_codegen_llvm[functionb392610c019ec31b[]::::b70b0e52460f9a66backFnOnce::]write<::()spawn_work::<>rustc_codegen_llvmLlvmCodegenBackend[>b70b0e52460f9a66 as ::]rustc_codegen_ssa::call_onceLlvmCodegenBackend[>b392610c019ec31b::{::{closure]#shim0::}:, traits()vtable>::::{#closurebackend#0::0ExtraBackendMethods}}, >() +> ::{::closure #spawn_named_thread1<}rustc_codegen_ssa as corerustc_codegen_llvm[11b392610c019ec31b[]: ::b70b0e52460f9a66back ::]write:::: spawn_workLlvmCodegenBackend< rustc_codegen_llvm as [rustc_codegen_ssab70b0e52460f9a66[]b392610c019ec31b::]LlvmCodegenBackend >::::{ closuretraits# 0::} , backend()0x>::::{1036cf7d0closureExtraBackendMethods# - 0std}::, sys()>>::::{spawn_named_threadclosure__rust_begin_short_backtrace#<1::}rustc_codegen_ssa as LlvmCodegenBackend>write:: as call_once::::{rustc_codegen_ssashimspawn_work:[vtable<#b392610c019ec31b0rustc_codegen_llvm}] +[ :: b70b0e52460f9a6611traits: ] :: :: LlvmCodegenBackend backend :: > ExtraBackendMethods0x>1036cf7d0:: - spawn_named_threadstd<::::{sysrustc_codegen_ssa::closureunix[::#threadb392610c019ec31b::0Thread]::}new::::backthread_start::::h8dda2af345bab446, +write :: ()12spawn_work: > < ::{ rustc_codegen_llvm closure [ # b70b0e52460f9a660x01813c506c] - }__pthread_deallocate:: +, LlvmCodegenBackend()>>::{::{closureclosure##01}}, as ()core>[::{18650a1770591c75closure]#::0ops}::, function()::>FnOnce +< () >10>: :: call_once ::{ shim : vtable # 00x}10c07d244 + - < <11std: [ fcd23fca98dce159 ] :: thread :: Builder >0x::1036cf7d0spawn_unchecked_ - :: spawn_named_thread <0xrustc_codegen_ssa10c07c3ec[ - b392610c019ec31brustc_codegen_ssa][::b392610c019ec31bback]::::writeback::::spawn_workwrite<::rustc_codegen_llvmexecute_copy_from_cache_work_item[::b70b0e52460f9a66<]rustc_codegen_llvm::[LlvmCodegenBackendb70b0e52460f9a66>]::{::closureLlvmCodegenBackend#>0 +} , () >9::{: closure # 0 } , () > ::{0x[10c05e508closure - #std1[} as fcd23fca98dce159::]18650a1770591c75::unix]sys_common:::: + +rustc version: backtrace1.76.0 (07dca489a 2024-02-04):: +platform: __rust_begin_short_backtrace::aarch64-apple-darwin<<::rustc_codegen_llvmthread[::b70b0e52460f9a66Thread]::::unixnew::::threadthread_start::::Threadh8dda2af345bab446:: +new :: thread_start12::: h8dda2af345bab446 + 12 : 0x 1813c506c - __pthread_deallocate + 0x1813c506c - __pthread_deallocate +core[18650a1770591c75]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0} + 11: 0x1036cf7d0 - std::sys::unix::thread::::Threadops::::newfunction::::thread_startFnOnce:: > ::12call_once: ::{ shim : vtable # 0 } +0x 1813c506c - 11__pthread_deallocate: +LlvmCodegenBackend as 0x1036cf7d0 - std::sys::unix::thread::Thread::new::thread_start::h8dda2af345bab446 + 12: 0x1813c506c - __pthread_deallocate +thread 'coordinator' panicked at compiler/rustc_middle/src/util/bug.rs:36:rustc_codegen_ssa26[: +b392610c019ec31b/rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs:1586:29: worker thread panicked] +stack backtrace: +::traits::backend::ExtraBackendMethods>::spawn_named_thread::{closure#0}, ()>::{closure#0}, ()> + 10: 0x10c07d244 - < :: spawn_unchecked_ < < rustc_codegen_llvm0x[1036aeda8b70b0e52460f9a66 - ]std::::LlvmCodegenBackendbacktrace as ::rustc_codegen_ssaBacktrace[::b392610c019ec31bcreate]::::h8af6f7a25d8a3749traits +:: backend :: ExtraBackendMethods1>: :: spawn_named_thread < rustc_codegen_ssa [ b392610c019ec31b ] ::0xback10bde2208:: - write<::allocspawn_work[<37ddc2533ea56b7brustc_codegen_llvm]::[b70b0e52460f9a66]::LlvmCodegenBackend>::{closure#0}, ()>::{closure#0}, ()>::{closure#1} as core[18650a1770591c75]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0} + 11: 0x1036cf7d0 - std::sys::unix::thread::Thread::new::thread_start::h8dda2af345bab446 + 12: 0x1813c506c - __pthread_deallocate +boxed::Box as core[18650a1770591c75]::ops::function::Fn<(&dyn for<'a, 'b> core[18650a1770591c75]::ops::function::Fn<(&'a core[18650a1770591c75]::panic::panic_info::PanicInfo<'b>,), Output = ()> + core[18650a1770591c75]::marker::Sync + core[18650a1770591c75]::marker::Send, &core[18650a1770591c75]::panic::panic_info::PanicInfo)>>::call + 2: 0x1036c7528 - std::panicking::rust_panic_with_hook::h1e70c5d905e30e9d + 3: 0x10ff5d168 - std[fcd23fca98dce159]::panicking::begin_panic::::{closure#0} + 4: 0x10ff5d0ec - std[fcd23fca98dce159]::sys_common::backtrace::__rust_end_short_backtrace::::{closure#0}, !> + 5: 0x1104f6040 - std[fcd23fca98dce159]::panicking::begin_panic:: + 6: 0x10fed69f4 - rustc_middle[35a781f9bda42497]::util::bug::opt_span_bug_fmt::::{closure#0} + 7: 0x10fecdc14 - rustc_middle[35a781f9bda42497]::ty::context::tls::with_opt::::{closure#0}, !>::{closure#0} + 8: 0x10fecdbe0 - rustc_middle[35a781f9bda42497]::ty::context::tls::with_context_opt::::{closure#0}, !>::{closure#0}, !> + 9: 0x1104f13c4 - rustc_middle[35a781f9bda42497]::util::bug::bug_fmt + 10: 0x10c060270 - std[fcd23fca98dce159]::sys_common::backtrace::__rust_begin_short_backtrace::<::spawn_named_thread::{closure#5}, core[18650a1770591c75]::result::Result>::{closure#0}, core[18650a1770591c75]::result::Result> + 11: 0x10c07d51c - <::spawn_unchecked_<::spawn_named_thread::{closure#5}, core[18650a1770591c75]::result::Result>::{closure#0}, core[18650a1770591c75]::result::Result>::{closure#1} as core[18650a1770591c75]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0} + 12: 0x1036cf7d0 - std::sys::unix::thread::Thread::new::thread_start::h8dda2af345bab446 + 13: 0x1813c506c - __pthread_deallocate +thread 'rustc' panicked at compiler/rustc_middle/src/util/bug.rs:36:26: +/rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs:1959:17: panic during codegen/LLVM phase +stack backtrace: + 0: 0x1036aeda8 - std::backtrace::Backtrace::create::h8af6f7a25d8a3749 + 1: 0x10bde2208 - as core[18650a1770591c75]::ops::function::Fn<(&dyn for<'a, 'b> core[18650a1770591c75]::ops::function::Fn<(&'a core[18650a1770591c75]::panic::panic_info::PanicInfo<'b>,), Output = ()> + core[18650a1770591c75]::marker::Sync + core[18650a1770591c75]::marker::Send, &core[18650a1770591c75]::panic::panic_info::PanicInfo)>>::call + 2: 0x1036c7528 - std::panicking::rust_panic_with_hook::h1e70c5d905e30e9d + 3: 0x10ff5d168 - std[fcd23fca98dce159]::panicking::begin_panic::::{closure#0} + 4: 0x10ff5d0ec - std[fcd23fca98dce159]::sys_common::backtrace::__rust_end_short_backtrace::::{closure#0}, !> + 5: 0x1104f6040 - std[fcd23fca98dce159]::panicking::begin_panic:: + 6: 0x10fed69f4 - rustc_middle[35a781f9bda42497]::util::bug::opt_span_bug_fmt::::{closure#0} + 7: 0x10fecdc14 - rustc_middle[35a781f9bda42497]::ty::context::tls::with_opt::::{closure#0}, !>::{closure#0} + 8: 0x10fecdbe0 - rustc_middle[35a781f9bda42497]::ty::context::tls::with_context_opt::::{closure#0}, !>::{closure#0}, !> + 9: 0x1104f13c4 - rustc_middle[35a781f9bda42497]::util::bug::bug_fmt + 10: 0x10c059f48 - ::time::>::join::{closure#0}> + 11: 0x10c07f284 - >::join + 12: 0x10c06ed48 - ::join_codegen + 13: 0x10bf8a64c - ::link + 14: 0x10bdcf11c - rustc_span[d844dabcc0d15e78]::create_session_globals_then::, rustc_interface[9ecbacebda51131]::interface::run_compiler, rustc_driver_impl[d723ad74a265baf3]::run_compiler::{closure#0}>::{closure#0}> + 15: 0x10be05628 - std[fcd23fca98dce159]::sys_common::backtrace::__rust_begin_short_backtrace::, rustc_driver_impl[d723ad74a265baf3]::run_compiler::{closure#0}>::{closure#0}, core[18650a1770591c75]::result::Result<(), rustc_span[d844dabcc0d15e78]::ErrorGuaranteed>>::{closure#0}::{closure#0}, core[18650a1770591c75]::result::Result<(), rustc_span[d844dabcc0d15e78]::ErrorGuaranteed>> + 16: 0x10bdd7d7c - <::spawn_unchecked_, rustc_driver_impl[d723ad74a265baf3]::run_compiler::{closure#0}>::{closure#0}, core[18650a1770591c75]::result::Result<(), rustc_span[d844dabcc0d15e78]::ErrorGuaranteed>>::{closure#0}::{closure#0}, core[18650a1770591c75]::result::Result<(), rustc_span[d844dabcc0d15e78]::ErrorGuaranteed>>::{closure#1} as core[18650a1770591c75]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0} + 17: 0x1036cf7d0 - std::sys::unix::thread::Thread::new::thread_start::h8dda2af345bab446 + 18: 0x1813c506c - __pthread_deallocate diff --git a/packages/rs-platform-serialization-derive/rustc-ice-2024-02-20T10_35_29-12958.txt b/packages/rs-platform-serialization-derive/rustc-ice-2024-02-20T10_35_29-12958.txt new file mode 100644 index 0000000000..e7cfeca567 --- /dev/null +++ b/packages/rs-platform-serialization-derive/rustc-ice-2024-02-20T10_35_29-12958.txt @@ -0,0 +1,170 @@ +thread 'cpy sz32l9e0944h5s3' panicked at /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs:thread '913cpy oxxcwsebgx1733i:' panicked at 44/rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs: +:no saved object file in work product913 +stack backtrace: +:44: +no saved object file in work product +stack backtrace: +thread 'cpy vhs4c6sj2h4xpaq' panicked at /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs:913:44: +thread 'no saved object file in work productcpy 5fuhladjlcxb67o9 +stack backtrace: +' panicked at /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs:913:44: +no saved object file in work product +stack backtrace: +thread 'cpy 4orp8g2x23rgnt3a' panicked at /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs:913:44thread ': +cpy k5jtp3uu1e1wr25no saved object file in work product' panicked at +stack backtrace: +/rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs:913:44: +no saved object file in work product +stack backtrace: +thread 'cpy 4uzg6vrmxwsbl425' panicked at /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs:913:thread '44cpy ebti8ycrnjshmsw: +' panicked at no saved object file in work product/rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs +stack backtrace: +:913:44: +no saved object file in work product +stack backtrace: + 0: 00x: 103992da8 - std :: backtrace :: Backtrace ::0xcreate103992da8 :: - h8af6f7a25d8a3749 std0 +:: backtrace : 0::: 1 : Backtrace :: create :: h8af6f7a25d8a3749 + 0x 103992da8 - 0xstd0 : 0x 10c0c62080 10 : - <:: backtrace0::: : : 103992da8 - alloc [ 37ddc2533ea56b7bstd ] :: Backtrace boxed ::0xbacktrace103992da80x 103992da8 - :: - :: stdBox 0x<::103992da8 :: backtrace Backtrace createrustc_driver_impl - std::::createbacktrace::std:: ::h8af6f7a25d8a3749Backtrace::0xBacktrace +::[::d723ad74a265baf3backtrace]:: 103992da8h8af6f7a25d8a3749 create +0x :: - std ::Backtrace110c0c6208:: h8af6f7a25d8a3749::1install_ice_hook +: - : backtracecreate :: h8af6f7a25d8a3749::{ as +alloccore0x < [1 [ : 18650a1770591c75 ]10c0c6208:: 10c0c6208 - <1alloc: - 37ddc2533ea56b7b < alloc[[rustc_driver_impl37ddc2533ea56b7b[opsd723ad74a265baf3 37ddc2533ea56b7b]]:: boxed::::]0x :::: boxed]functionBox::< as rustc_driver_impl<[ d723ad74a265baf3]install_ice_hook[37ddc2533ea56b7b alloc]0x(10c0c6208&core[dyn ::{forBox as , ::coreops[::<18650a1770591c75][::::'rustc_driver_impl#functioninstall_ice_hook37ddc2533ea56b7b::::{0[Fnbd723ad74a265baf3> ]install_ice_hook'::{aclosure::, 0'>b18650a1770591c75Box#<} as ]Fn::coreops[::18650a1770591c75function as ::0rustc_driver_impl> >]core::[ as <18650a1770591c75(]core::[}d723ad74a265baf3Fn]core::[install_ice_hook18650a1770591c75::{]>:: as closure#&ops<[::18650a1770591c75functionops::::(function&core'dyn a0[}>] as opscore::18650a1770591c75function::::FnFn::Fn<<((& [<18650a1770591c75(]&coredyn []18650a1770591c75ops&::dyn functionfor<::'']for<::::a::for adyn , core::'panic_infob::for [corefor [a<, 18650a1770591c75'']core::[]18650a1770591c75a], ::'opsb::> Fnb(,&)]ops::[dyn bfor<> ::core::[Fn, <18650a1770591c75(]&::'opspanic::::panic_infofunction18650a1770591c75afunction::::FnPanicInfo'::afunction ]corea[,18650a1770591c75, ']::b) = > '()Fn::>a + corecore[18650a1770591c75core, <[Output18650a1770591c75 = ]()::([&18650a1770591c75::]panic::::markeropspanic_info18650a1770591c75::>]] + ::::panic'::::panica:: functioncorecoreSync:::: + panic_infoFncore::[PanicInfo18650a1770591c75[<](::&marker'panic_infoa:: opsPanicInfo18650a1770591c75<]'::::[coremarker18650a1770591c75::::PanicInfo]::panicSync&:: + Fnpanic_infocore<::bpanicPanicInfo,<,')b(::)panic_info>, ::,PanicInfo)Output, = )core, ()>,>) + &core'[a18650a1770591c75Output, = [, 18650a1770591c75Output] = :: = ()Output> ()18650a1770591c75core][> = ()>:: + 18650a1770591c75core][::18650a1770591c75panic + paniccoremarker]::::Send + marker][, ::18650a1770591c75marker]::&Sync:: + ()::corepanic_info[>18650a1770591c75 + ]::::PanicInfomarker<::'core::[panic_info18650a1770591c75::]PanicInfo::panic)::>panic_info>::::PanicInfo)markerSendcall, +& ::core>>core::coreb > ,2[: ) , Output Sync[ + 18650a1770591c75 = core18650a1770591c75()::>call + +]core [ 18650a1770591c75 ]2[][::Sync18650a1770591c75marker:: + marker::::SyncSync + + ::core: corecore [ 18650a1770591c75 ] ::[18650a1770591c75marker :: Send , ] & core [ ::0x18650a1770591c751039ab528] - ::stdpanic0x[1039ab528]::::panickingmarker:::: - rust_panic_with_hookSync:: + h1e70c5d905e30e9dcore +[ 18650a1770591c75marker]panic::::marker::18650a1770591c75::]Send::stdmarker, ::::panickingSend::, rust_panic_with_hook&panic_infocore::18650a1770591c75::PanicInfo]h1e70c5d905e30e9d:: +marker ::Send, [&)core18650a1770591c75:: panic_info >3 &3coreSend: [ 18650a1770591c75 , :: PanicInfo ) > ][18650a1770591c75&]]core::[panic::::>panic::18650a1770591c75panic_info>::]PanicInfo::::)call> +> ::::call + : 2 : 2 : 0x 0x 1039ab5280x - 1039ab528std - ::stdpanickingpanicpanic::::1039ab2e4panicking::::callrust_panic_with_hook +:::: h1e70c5d905e30e9d panic_info - rust_panic_with_hookstd::::h1e70c5d905e30e9d:: +panicking :: begin_panic_handler +:: :: panic_infoPanicInfo )3::: { panic_info{>closure } }> :: ::h399e32952efd26a4 + call +4 20x: 1039ab2e4 - std :: : PanicInfo 3 ) >0x>: :: call +2 : 1039ab528 panicking :: PanicInfo ) > - std 0x:: 1039ab2e4begin_panic_handler - :::: >0x{1039a8a18 panicking{ std 2::closure - }callstd +::}sys_common :: h399e32952efd26a40x 1039ab2e4 +::2 - : ::std panicking :: ::: ::begin_panic_handler backtrace0x::1039ab528__rust_end_short_backtrace - ::panickingh2ab87f841a2323e7:: +{ { stdrust_panic_with_hook :: h1e70c5d905e30e9d + 0x41039ab528: - std ::closure 5 : 3:::: panicking :: rust_panic_with_hook0x::1039ab528 - std :: : begin_panic_handler h1e70c5d905e30e9d 0x 1039ab06c0x - 1039ab2e4panicking - panicking +std :: panicking ::::{::}rust_panic_with_hook}::::h1e70c5d905e30e9dh399e32952efd26a4 +_rust_begin_unwind3 : + begin_panic_handler{ closure } ::} :: h399e32952efd26a40x + 1039ab2e4 - std :: +6 { {0xclosure1039a8a18::} 4 - : std rust_panic_with_hook: 4 : :: 3 : panicking :: h1e70c5d905e30e9d + } 0x::103a04bd03h399e32952efd26a4: + 4 : ::sys_common :: backtrace :: __rust_end_short_backtracebegin_panic_handler ::0xh2ab87f841a2323e71039a8a18 + - std0x:: sys_common::::{backtrace {:: closure - }core5}::::panickingh399e32952efd26a4:: +panic_fmt ::1039ab2e4h33e40d2a93cab78f: - 0x 40x: 1039ab2e4__rust_end_short_backtrace - 1039a8a18::stdh2ab87f841a2323e7:: - +panicking std ::0x +5sys_common: ::std 0x 1039ab06c - 1039a8a18 backtrace - 0x::::1039ab06c panicking_rust_begin_unwind - ::std:: begin_panic_handler__rust_end_short_backtrace_rust_begin_unwind:: +begin_panic_handler7::h2ab87f841a2323e7:: +sys_common {:: {{ +: :: {backtrace closure closure ::}__rust_end_short_backtrace} 5 :: h2ab87f841a2323e70x +: 6 : 6} 1039a8a18} - std:::: :: sys_common :: 0x: backtrace ::5 __rust_end_short_backtrace h399e32952efd26a4: 0x:: + h2ab87f841a2323e7 + 1039ab06c h399e32952efd26a4 103a04b9c + - 4 - _rust_begin_unwind4core +: 0x 1039ab06c 5 - 0x_rust_begin_unwind: : + 0x6:: 0x option :: expect_failed ::103a04bd0 - h8c59d9d921ed2136core 103a04bd0 6 : 0x 1039a8a18 + - - :: 1039ab06c panicking :: 0x: - std _rust_begin_unwind + core8 : :: panic_fmt::panicking sys_common::1039a8a18:: - backtracestdpanic_fmt:: :: __rust_end_short_backtrace :: 0x 103a04bd0 - ::h2ab87f841a2323e7 +:: h33e40d2a93cab78fh33e40d2a93cab78f +6 coresys_common ::0xbacktrace:: ::panicking__rust_end_short_backtrace +::::h2ab87f841a2323e7: panic_fmt 10c3603ec ::0x + - 103a04bd0 - core rustc_codegen_ssa:: panicking[ ::panic_fmt h33e40d2a93cab78f b392610c019ec31b 7]: ::5 back:: +::h33e40d2a93cab78fwrite +:: : execute_copy_from_cache_work_item 5 7 : 0x 103a04b9c 70x 0x103a04b9c103a04bd0 - - 7core: :: panicking :: panic_fmt :: ::core<::rustc_codegen_llvmoption::: expect_failed - ::[h8c59d9d921ed2136b70b0e52460f9a66 ] +:: LlvmCodegenBackend >0x + 1039ab06c - 9 _rust_begin_unwind : 0x +1039ab06c 0x 103a04b9c - - 6core: :: optionh33e40d2a93cab78f::coreexpect_failed:::: h8c59d9d921ed2136option + :: 8 : 0x 103a04b9c - expect_failed core ::8 : h8c59d9d921ed2136 _rust_begin_unwind + : 0x + 6 : 7 : 0x + :: option :: expect_failed :: 10c3603ec0x - 10c3603ecrustc_codegen_ssa - [rustc_codegen_ssab392610c019ec31b[]b392610c019ec31b:: back 103a04bd0 0x 103a04bd0 - - ] ::coreback :: panicking8::: panic_fmtcore::::writewrite::::execute_copy_from_cache_work_item ::execute_copy_from_cache_work_item<::rustc_codegen_llvm<[rustc_codegen_llvm :: panicking0x::103a04b9cpanic_fmth8c59d9d921ed2136:: - h33e40d2a93cab78fcore +:: option ::b70b0e52460f9a66h33e40d2a93cab78f ] :: LlvmCodegenBackend > + ::0x expect_failed 10c3603ec - 9rustc_codegen_ssa: [ +[::b392610c019ec31bh8c59d9d921ed2136] + :: b70b0e52460f9a66 ] ::8LlvmCodegenBackend: 0x > +10c342508 - 79: std + [ 7 0x 103a04b9c 8: 0xback10c3603ec - core ::0xoptionfcd23fca98dce159: :: expect_failed :: h8c59d9d921ed213610c342508 + - rustc_codegen_ssa [ b392610c019ec31b ] :: back : 0x::103a04b9cwrite - core - ]std::[execute_copy_from_cache_work_itemfcd23fca98dce159::::]__rust_begin_short_backtrace10c342508option :: sys_common expect_failed0x::10c3603ec:: - backtracerustc_codegen_ssah8c59d9d921ed2136[ - b392610c019ec31b:: + < rustc_codegen_llvm [ b70b0e52460f9a660x::]10c3603ec:: - LlvmCodegenBackendrustc_codegen_ssa>__rust_begin_short_backtrace[ b392610c019ec31b :::: ]8< +: < < 9 : ]0xrustc_codegen_llvm10c3603ec[ - b70b0e52460f9a66rustc_codegen_ssa] :: LlvmCodegenBackend as ::rustc_codegen_ssa [ b392610c019ec31b ]0x +std10c342508[ - fcd23fca98dce159std]<::[sys_common[b392610c019ec31b::]backtracefcd23fca98dce159 back::::backwrite::::::writeexecute_copy_from_cache_work_item::::execute_copy_from_cache_work_item<::back::]rustc_codegen_llvmtraits:: [ b70b0e52460f9a669]write::::execute_copy_from_cache_work_item::LlvmCodegenBackend::>__rust_begin_short_backtrace +:: : :: :: <9<: rustc_codegen_llvm<<[rustc_codegen_llvmrustc_codegen_llvm backend :: ExtraBackendMethodssys_common>[rustc_codegen_llvm[ b70b0e52460f9a66 ] :: b70b0e52460f9a66LlvmCodegenBackend 0x ::10c342508 b70b0e52460f9a660x[backtrace - b70b0e52460f9a66]]::::spawn_named_thread::LlvmCodegenBackend<>__rust_begin_short_backtrace +]rustc_codegen_ssa::::LlvmCodegenBackendLlvmCodegenBackend>[ +::b392610c019ec31b < < rustc_codegen_llvm9[: b70b0e52460f9a66 as ]]::::backrustc_codegen_ssaLlvmCodegenBackend::[write as ::rustc_codegen_ssaspawn_work[stdb392610c019ec31b[<]rustc_codegen_llvm::[traitsb70b0e52460f9a66::b392610c019ec31b]backend::::LlvmCodegenBackendExtraBackendMethods>>::{::closure10c342508# - 0std}[, fcd23fca98dce159()]>::::{sys_commonclosure::#backtrace0::}__rust_begin_short_backtrace, ::()<>< +rustc_codegen_llvm [ b70b0e52460f9a6610]: :: LlvmCodegenBackend as rustc_codegen_ssa [ b392610c019ec31b ] ::0xtraits10c361244:: - backend<::[::fcd23fca98dce159spawn_named_thread]<::rustc_codegen_ssathread[::Builder>]fcd23fca98dce159 as b392610c019ec31b :: traitsrustc_codegen_ssa:: [backendb392610c019ec31b spawn_named_thread]<:: rustc_codegen_ssa] ] ::9::[: ::b392610c019ec31bsys_commonExtraBackendMethods back> ::::spawn_named_thread ::::{spawn_workclosure::]sys_common[::b70b0e52460f9a66b70b0e52460f9a66::{ExtraBackendMethods]]:: - ::stdLlvmCodegenBackend[[fcd23fca98dce159::backtrace>>closure::::{spawn_named_threadclosure<#rustc_codegen_ssa]#::LlvmCodegenBackendsys_common as ::rustc_codegen_ssa0b70b0e52460f9a66[}b392610c019ec31b::, ]()::>traits]LlvmCodegenBackend::[backendb392610c019ec31b::]ExtraBackendMethods::0}back, +::writebacktrace::>::spawn_work__rust_begin_short_backtrace<::::()>::{::::{spawn_named_thread__rust_begin_short_backtraceclosure<::b392610c019ec31bclosure]# +0][b392610c019ec31b::rustc_codegen_llvm::LlvmCodegenBackendtraits as ::rustc_codegen_ssabackend]} [ b70b0e52460f9a6610[]: b392610c019ec31b ] ::] traits ::, LlvmCodegenBackend::()::back ::::writeExtraBackendMethods> as > :: spawn_named_thread rustc_codegen_ssa[ <0xrustc_codegen_ssa10c361244[::b392610c019ec31b::{ - backend]< < std::traitsb392610c019ec31b[0x::LlvmCodegenBackendExtraBackendMethods>10c361244::{closure>#::fcd23fca98dce1590backend}::, ExtraBackendMethods]()>>::::]:: +spawn_work - << rustc_codegen_llvmclosure[::spawn_named_threadthread<::rustc_codegen_ssaBuilderspawn_named_thread>#<< b70b0e52460f9a66::][0b392610c019ec31b::}LlvmCodegenBackend, ]10()back::rustc_codegen_ssaspawn_unchecked_[::::{thread::closure::::#: ]::::>LlvmCodegenBackend::{ as closurerustc_codegen_ssa#[0back Builder > ::::write spawn_work}<, rustc_codegen_llvm::b392610c019ec31b[0 () >0x::{backspawn_unchecked_]10c361244::b70b0e52460f9a66 - ]b70b0e52460f9a66 +] 0 spawn_work10[::: traits} fcd23fca98dce159:: backend :: ExtraBackendMethods, b70b0e52460f9a66 LlvmCodegenBackend>::::LlvmCodegenBackendspawn_named_thread>> ]<()]rustc_codegen_ssa::[ >::b392610c019ec31b::{thread]::::Builderback<>::::write::{closure::#spawn_unchecked_::{0closure<}<#LlvmCodegenBackendrustc_codegen_llvm as 1rustc_codegen_ssaspawn_work[closureb392610c019ec31b0x][::b70b0e52460f9a66traits]::10c361244::backendLlvmCodegenBackend - rustc_codegen_llvm as [[#b70b0e52460f9a660::}()traits] as std::{}coreclosure[spawn_named_thread18650a1770591c75<]rustc_codegen_ssa, ::[ops::::::()>functionLlvmCodegenBackend#::0::{backendFnOnce::]>>>::{::closurecall_once#closure#0::>::{::{b392610c019ec31bclosure}], ::()back#::>shim::thread:::vtableBuilder#>write0::}spawn_unchecked_ +0<} < rustc_codegen_llvm11[, b70b0e52460f9a66: ]()::>LlvmCodegenBackend:: as spawn_workrustc_codegen_ssa<[rustc_codegen_llvmb392610c019ec31b][ ::b70b0e52460f9a66traits]::::backend +LlvmCodegenBackend0>:: ::{spawn_named_threadclosure<#rustc_codegen_ssa0}, ()ExtraBackendMethods[> b392610c019ec31b ] ::::>spawn_named_thread ::{ closure0x#1039b37d00}}::{back}::, write()closure::>spawn_work - < std10rustc_codegen_llvm: <, rustc_codegen_ssa #[::0, +} , ()b392610c019ec31b>10 : ::{ [()sys > :: +]() 10 b70b0e52460f9a66 >]unix :: threadclosure::{:: closureLlvmCodegenBackend::#back0::}>#, 0x1write: }:: as spawn_work core :: Thread 0x0x10c36124410c361244 - - <<<[std18650a1770591c75[]fcd23fca98dce159::]::::newthread::::thread_startBuilderops>::::h8dda2af345bab446spawn_unchecked_ +< 10c361244<::rustc_codegen_llvmfunction[12::b70b0e52460f9a66FnOnce]<::()LlvmCodegenBackend as ::{rustc_codegen_ssaclosure: # - 0 []<::thread>[:: ExtraBackendMethods > ::::LlvmCodegenBackendfcd23fca98dce159>spawn_named_thread::{spawn_work:: as , >1813c506c::{call_once - ::{__pthread_deallocateclosure +()::>LlvmCodegenBackend::{>shimclosure:#::{0closure}#, 0()spawn_unchecked_>vtable::{#closure0#}1 +}< as : 0::{ rustc_codegen_ssa18650a1770591c75 ] :: closure opsb70b0e52460f9a66[#b392610c019ec31b0]}::, ::{()traits>::::{]}::, ::function()::>closure::{#closure1FnOnce#}1 as }< as core0x[1039b37d018650a1770591c75 - ]std::::opssys::()function::::unixFnOnce::core>[::18650a1770591c75call_once] as closure::{#::1Thread}shim as ::core:[newvtablebackend#::0ExtraBackendMethods::>thread_start::}spawn_named_thread::< +rustc_codegen_ssah8dda2af345bab446[ b392610c019ec31b +] :: back ::11write12::: spawn_work: < rustc_codegen_llvm [ b70b0e52460f9a66 ] :: LlvmCodegenBackend > ::{ closure # 0 }0x, 1813c506c() - >0x::{1039b37d0closure - #>rustc_codegen_ssa__pthread_deallocate[ +b392610c019ec31bstd]::::systraits::::unixbackend::::threadExtraBackendMethods::>Thread::::spawn_named_threadnew<::rustc_codegen_ssathread_start[::b392610c019ec31bh8dda2af345bab446] +:: back ::12write: :: spawn_work < rustc_codegen_llvm [ b70b0e52460f9a66 ] ::0xLlvmCodegenBackend1813c506c> - ::{__pthread_deallocateclosure +#0}, ()>::{closure#0}, ()>::{closure#1} as core[18650a1770591c75]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0} + 11: 0x1039b37d0 - std::sys::unix::thread::Thread::new::thread_start::h8dda2af345bab446 + 12: 0x1813c506c - __pthread_deallocate +18650a1770591c75]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0} + 11: 0x1039b37d0 - std::sys::unix::thread::Thread::new::thread_start::h8dda2af345bab446 + 12: 0x1813c506c - __pthread_deallocate + + +rustc version: 1.76.0 (07dca489a 2024-02-04) +platform: aarch64-apple-darwin>::call_once::{shim:vtable#0} + 11: 0x1039b37d0 - std::sys::unix::thread::Thread::new::thread_start::h8dda2af345bab446 + 12: 0x1813c506c - __pthread_deallocate +::ops::function::FnOnce<()>>::call_once::{shim:vtable#0} + 11: 0x1039b37d0 - std::sys::unix::thread::Thread::new::thread_start::h8dda2af345bab446 + 12: 0x1813c506c - __pthread_deallocate +0}, ()>::{closure#1} as core[18650a1770591c75]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0} + 11: 0x1039b37d0 - std::sys::unix::thread::Thread::new::thread_start::h8dda2af345bab446 + 12: 0x1813c506c - __pthread_deallocate +thread 'coordinator' panicked at compiler/rustc_middle/src/util/bug.rs:36:26: +/rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs:1586:29: worker thread panicked +stack backtrace: + 0: 0x103992da8 - std::backtrace::Backtrace::create::h8af6f7a25d8a3749 + 1: 0x10c0c6208 - as core[18650a1770591c75]::ops::function::Fn<(&dyn for<'a, 'b> core[18650a1770591c75]::ops::function::Fn<(&'a core[18650a1770591c75]::panic::panic_info::PanicInfo<'b>,), Output = ()> + core[18650a1770591c75]::marker::Sync + core[18650a1770591c75]::marker::Send, &core[18650a1770591c75]::panic::panic_info::PanicInfo)>>::call + 2: 0x1039ab528 - std::panicking::rust_panic_with_hook::h1e70c5d905e30e9d + 3: 0x110241168 - std[fcd23fca98dce159]::panicking::begin_panic::::{closure#0} + 4: 0x1102410ec - std[fcd23fca98dce159]::sys_common::backtrace::__rust_end_short_backtrace::::{closure#0}, !> + 5: 0x1107da040 - std[fcd23fca98dce159]::panicking::begin_panic:: + 6: 0x1101ba9f4 - rustc_middle[35a781f9bda42497]::util::bug::opt_span_bug_fmt::::{closure#0} + 7: 0x1101b1c14 - rustc_middle[35a781f9bda42497]::ty::context::tls::with_opt::::{closure#0}, !>::{closure#0} + 8: 0x1101b1be0 - rustc_middle[35a781f9bda42497]::ty::context::tls::with_context_opt::::{closure#0}, !>::{closure#0}, !> + 9: 0x1107d53c4 - rustc_middle[35a781f9bda42497]::util::bug::bug_fmt + 10: 0x10c344270 - std[fcd23fca98dce159]::sys_common::backtrace::__rust_begin_short_backtrace::<::spawn_named_thread::{closure#5}, core[18650a1770591c75]::result::Result>::{closure#0}, core[18650a1770591c75]::result::Result> + 11: 0x10c36151c - <::spawn_unchecked_<::spawn_named_thread::{closure#5}, core[18650a1770591c75]::result::Result>::{closure#0}, core[18650a1770591c75]::result::Result>::{closure#1} as core[18650a1770591c75]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0} + 12: 0x1039b37d0 - std::sys::unix::thread::Thread::new::thread_start::h8dda2af345bab446 + 13: 0x1813c506c - __pthread_deallocate +thread 'rustc' panicked at compiler/rustc_middle/src/util/bug.rs:36:26: +/rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs:1959:17: panic during codegen/LLVM phase +stack backtrace: + 0: 0x103992da8 - std::backtrace::Backtrace::create::h8af6f7a25d8a3749 + 1: 0x10c0c6208 - as core[18650a1770591c75]::ops::function::Fn<(&dyn for<'a, 'b> core[18650a1770591c75]::ops::function::Fn<(&'a core[18650a1770591c75]::panic::panic_info::PanicInfo<'b>,), Output = ()> + core[18650a1770591c75]::marker::Sync + core[18650a1770591c75]::marker::Send, &core[18650a1770591c75]::panic::panic_info::PanicInfo)>>::call + 2: 0x1039ab528 - std::panicking::rust_panic_with_hook::h1e70c5d905e30e9d + 3: 0x110241168 - std[fcd23fca98dce159]::panicking::begin_panic::::{closure#0} + 4: 0x1102410ec - std[fcd23fca98dce159]::sys_common::backtrace::__rust_end_short_backtrace::::{closure#0}, !> + 5: 0x1107da040 - std[fcd23fca98dce159]::panicking::begin_panic:: + 6: 0x1101ba9f4 - rustc_middle[35a781f9bda42497]::util::bug::opt_span_bug_fmt::::{closure#0} + 7: 0x1101b1c14 - rustc_middle[35a781f9bda42497]::ty::context::tls::with_opt::::{closure#0}, !>::{closure#0} + 8: 0x1101b1be0 - rustc_middle[35a781f9bda42497]::ty::context::tls::with_context_opt::::{closure#0}, !>::{closure#0}, !> + 9: 0x1107d53c4 - rustc_middle[35a781f9bda42497]::util::bug::bug_fmt + 10: 0x10c33df48 - ::time::>::join::{closure#0}> + 11: 0x10c363284 - >::join + 12: 0x10c352d48 - ::join_codegen + 13: 0x10c26e64c - ::link + 14: 0x10c0b311c - rustc_span[d844dabcc0d15e78]::create_session_globals_then::, rustc_interface[9ecbacebda51131]::interface::run_compiler, rustc_driver_impl[d723ad74a265baf3]::run_compiler::{closure#0}>::{closure#0}> + 15: 0x10c0e9628 - std[fcd23fca98dce159]::sys_common::backtrace::__rust_begin_short_backtrace::, rustc_driver_impl[d723ad74a265baf3]::run_compiler::{closure#0}>::{closure#0}, core[18650a1770591c75]::result::Result<(), rustc_span[d844dabcc0d15e78]::ErrorGuaranteed>>::{closure#0}::{closure#0}, core[18650a1770591c75]::result::Result<(), rustc_span[d844dabcc0d15e78]::ErrorGuaranteed>> + 16: 0x10c0bbd7c - <::spawn_unchecked_, rustc_driver_impl[d723ad74a265baf3]::run_compiler::{closure#0}>::{closure#0}, core[18650a1770591c75]::result::Result<(), rustc_span[d844dabcc0d15e78]::ErrorGuaranteed>>::{closure#0}::{closure#0}, core[18650a1770591c75]::result::Result<(), rustc_span[d844dabcc0d15e78]::ErrorGuaranteed>>::{closure#1} as core[18650a1770591c75]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0} + 17: 0x1039b37d0 - std::sys::unix::thread::Thread::new::thread_start::h8dda2af345bab446 + 18: 0x1813c506c - __pthread_deallocate diff --git a/packages/rs-platform-serialization-derive/rustc-ice-2024-02-20T10_35_30-13195.txt b/packages/rs-platform-serialization-derive/rustc-ice-2024-02-20T10_35_30-13195.txt new file mode 100644 index 0000000000..45d240d02e --- /dev/null +++ b/packages/rs-platform-serialization-derive/rustc-ice-2024-02-20T10_35_30-13195.txt @@ -0,0 +1,170 @@ +thread 'cpy 4orp8g2x23rgnt3a' panicked at /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs:913:44: +no saved object file in work product +stack backtrace: +thread 'cpy 4uzg6vrmxwsbl425' panicked at /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rsthread ':cpy ebti8ycrnjshmsw913' panicked at :/rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rsthread ':cpy oxxcwsebgx1733i913' panicked at :/rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs44: +44:no saved object file in work product913 +stack backtrace: +:: +44no saved object file in work product: + +stack backtrace: +no saved object file in work product +stack backtrace: +thread 'cpy vhs4c6sj2h4xpaq' panicked at /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs:913:thread '44cpy 5fuhladjlcxb67o9: +' panicked at no saved object file in work product/rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs +stack backtrace: +:913:44: +no saved object file in work product +stack backtrace: + 0: 0x100bb2da8 - std::backtrace::Backtrace::create::h8af6f7a25d8a3749 + 1: 0 : 0x01092e6208: - < alloc [0x 37ddc2533ea56b7b100bb2da8 - ]0xstd100bb2da8:: - backtracestd:: :: boxedBacktrace:: Box thread ' :: backtrace0<:: Backtrace0cpy k5jtp3uu1e1wr25rustc_driver_impl:::: createcreate::0::: h8af6f7a25d8a3749' panicked at : [ d723ad74a265baf3thread '] /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rsh8af6f7a25d8a3749 +cpy sz32l9e0944h5s3 ' panicked at /rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs :: +1 : :install_ice_hook1::{913closure: : 913 : # : :0 44 : + no saved object file in work product 44 0x : +0xno saved object file in work product1092e6208} +stack backtrace: + - 100bb2da8 +stack backtrace: + > - std as :: backtrace <::coreBacktrace 0x0x 1092e6208 100bb2da8 - alloc<0x - 100bb2da8 [ std::::create backtrace37ddc2533ea56b7b::[ - std0alloc ]::::Backtraceh8af6f7a25d8a3749:: +create::::018650a1770591c75 [: h8af6f7a25d8a3749: ] +:: boxedops37ddc2533ea56b7b:::: Box ]backtrace :: boxed1 function::<::Backtracerustc_driver_impl::[ Box created723ad74a265baf3::< rustc_driver_impl1Fn: <[::] h8af6f7a25d8a3749 (d723ad74a265baf3 &: dyn for< ':: a +, '] b 1install_ice_hook> ::{core[closure: #18650a1770591c75 ] :::: 0x00x 100bb2da8install_ice_hook - ::{}ops std :: >1092e6208 - as closurebacktrace<#::0x0}0x::allocfunction[ 37ddc2533ea56b7b1092e6208core]::Backtrace0x100bb2da8::[ - 18650a1770591c75std::Fn]< - ::>1092e6208boxed as ::core:: - createbacktraceBox<::::alloc core::[ install_ice_hook( ::{ }closure #<>' as b0xcore>18650a1770591c75[& as 0core18650a1770591c751092e6208}] dyn - >> as ::]for<<::opscore::[function18650a1770591c75[ 18650a1770591c75']::,Fn)<, (Output&:: alloc = 0xa[]ops::::ops'ops1092e6208a::, functionfunction37ddc2533ea56b7b ::corefunction::'::][()Fn - <><(b + ::::boxed18650a1770591c75corealloc[&::]> FnFncore18650a1770591c75Box]<[dyn ::for, + b',Box'])#core0[> <::}ops>b::rustc_driver_impl18650a1770591c75 as , ]core::[bmarkercore::[[18650a1770591c75> ]> functionSend::cored723ad74a265baf318650a1770591c75]][::OutputcoreFn = [::<()ops, 18650a1770591c75install_ice_hook18650a1770591c75::{::closure>#::]0]}(function>::ops as ops::&& + core'[corea[::18650a1770591c75ops]::18650a1770591c75 Fncore::corefunction<::(function[::[::18650a1770591c7518650a1770591c75]]::Fnmarker<::functionpanic::::Fn::panic_info<&::::PanicInfoSync]< + ::Fndyn core'([18650a1770591c75]panic(b<&('::&a'for&::'::amarker::a', function, ::::coreFn)<, SendPanicInfoOutputa core'[18650a1770591c75[ = core()()&>dyn + >>core18650a1770591c75for [::core, call::[ +18650a1770591c75:: ] panic::&'::bpaniccore> ::18650a1770591c75[panic]panic_info::18650a1770591c75::panic_infoops::::]panic_infoPanicInfomarker:::: function::Fn2PanicInfo<::core<[::18650a1770591c75panic_info]( ::,::b18650a1770591c75 ) >, marker&Output PanicInfo::)Send> ]>, >& = :: ',::core,()call + a0x 100bcb528 ) - , stdOutput:: = panicking2()core[>[ops + 18650a1770591c75core][)::18650a1770591c75panic]::::panic_info::18650a1770591c75::, ::marker>:: + Outputrust_panic_with_hookSynccore = + []corefunction: PanicInfo::::h1e70c5d905e30e9dFn +< :: (3&: <'panica:: [() 18650a1770591c75panic_info']:: ::PanicInfo marker b 18650a1770591c75> )>]> + >core::::[core18650a1770591c75 call, ) , + ::Syncmarker Output:: Send = , 0x() + 100bcb528core - [][>& + core18650a1770591c75::std marker[ ::core18650a1770591c75]::::panickingpanic::Syncrust_panic_with_hook18650a1770591c75::20x: h1e70c5d905e30e9d][ +] 100bcb2e4 :: - marker:: :: std:: + ::Send318650a1770591c75panic_info]:: PanicInfo, core: marker :: ::[&,core) + , ::core]PanicInfo::)begin_panic_handlerOutput[ = [18650a1770591c75 18650a1770591c75]]():: :: > > >0x::markercall::100bcb2e40xmarker100bcb528:: - - Sendstd, {&stdcore +::::panic + Send::core, [::&18650a1770591c75{[panic_infopanicking::::PanicInfobegin_panic_handlerpanickingclosure):::: { { >closure]2::18650a1770591c75corerust_panic_with_hook}}::marker[::}18650a1770591c75h1e70c5d905e30e9d>] +:: call}::]Sync::: + core [ +::panich399e32952efd26a418650a1770591c75 ::]panic_info:::: markerPanicInfo::)Send>3, >:::: call + h399e32952efd26a4 + panic& :: 0xpanic_info: +:: PanicInfo 100bcb528core - [std :: 4 : 18650a1770591c75 2 : )]>2 :: panic :: panicking4 : panic_info 0x : 100bc8a18:::: > ::0xcall +100bcb528 - - std std :: sys_common::PanicInfo 0x 2::) >rust_panic_with_hookbacktracepanicking::::::rust_panic_with_hook__rust_end_short_backtrace0x100bcb528:: : h2ab87f841a2323e7100bcb2e4 +:: >h1e70c5d905e30e9d - - std :: std::panicking + h1e70c5d905e30e9d :: ::call begin_panic_handler +:: { panicking :: 0x{100bc8a18 - std 2 5 +closure } }::: :: sys_common ::: backtrace30x : :: 3 rust_panic_with_hook h399e32952efd26a4__rust_end_short_backtrace ::0x: 100bcb2e4h2ab87f841a2323e70x +100bcb528 - :: 5 - : std :: panicking :: rust_panic_with_hook0x 100bcb06c:: - 0x_rust_begin_unwindh1e70c5d905e30e9d +100bcb06c - + _rust_begin_unwind6 + +h1e70c5d905e30e9d 100bcb528 - : + stdstd :: panicking :::: 4 : 3 : rust_panic_with_hook 0x 0x6100bcb2e4panicking:: - :: : 3 : 100c24bd0 begin_panic_handler :: { std - core:: ::panickingpanicking0x0x::{panic_fmt100bcb2e4:: :: h33e40d2a93cab78f - h1e70c5d905e30e9d + +stdclosure begin_panic_handler ::::panicking{::{begin_panic_handler 100bc8a18:: { closure0x} }} - ::3h399e32952efd26a4} + 100c24bd0 : std :: sys_common :: - ::core7 backtrace40x: 100bcb2e4:: - : {h399e32952efd26a4 :: closure } __rust_end_short_backtracepanicking std :: } + ::panic_fmt:::: h33e40d2a93cab78f0x +100bcb2e4panicking :: :: h399e32952efd26a4 - 4h2ab87f841a2323e7begin_panic_handler0xstd +::{: {:: closure100c24b9c} panicking} ::7h399e32952efd26a4: - + +core :: :: begin_panic_handler4:: : { option ::5expect_failed: :: { closureh8c59d9d921ed2136} }4 ::: + h399e32952efd26a4 +0x 100bc8a18 - 0x0x100c24b9c100bcb06c - 8std: ::core sys_common :: backtrace - ::::__rust_end_short_backtraceoption:::: h2ab87f841a2323e7 + _rust_begin_unwind expect_failed 4 +50x: 1095803ec - 0x 100bc8a18 - 6: 0x : :: rustc_codegen_ssa0xh8c59d9d921ed2136100bc8a18 + 8100bc8a18 std - [std ::: 0x 100bcb06c b392610c019ec31b - 0x ::_rust_begin_unwind sys_common]100bc8a18:: +back sys_common0x - 1095803ec0x - - 100c24bd0::::backtrace::rustc_codegen_ssa [ b392610c019ec31bstd write6::]: :: back sys_common:: :::: backtrace execute_copy_from_cache_work_item ::::__rust_end_short_backtrace< rustc_codegen_llvm:: - 0x::100c24bd0h2ab87f841a2323e7core - backtracecore:::: +panicking[ std__rust_end_short_backtrace ::::h2ab87f841a2323e7::write__rust_end_short_backtraceb70b0e52460f9a66::]panicking +:: panic_fmt sys_common5::: h2ab87f841a2323e7:: LlvmCodegenBackend::>5 +h33e40d2a93cab78fpanic_fmt +:: h33e40d2a93cab78f +: :: execute_copy_from_cache_work_item7::: 9 < rustc_codegen_llvm:: [ : 5 + : backtrace b70b0e52460f9a66 ] :: LlvmCodegenBackend > + 7 : 0x 9 : ::0x__rust_end_short_backtrace100c24b9c :: - h2ab87f841a2323e7 0x 109562508 - 100bcb06c + 0x0x100c24b9c100bcb06c - - core:: - _rust_begin_unwind + std option core_rust_begin_unwind0x:: +option :: expect_failed ::109562508 h8c59d9d921ed2136 - +std6 [ fcd23fca98dce1598] : 6 ::: [ expect_failed :: h8c59d9d921ed2136 + 0x 1095803ecfcd23fca98dce159: 8] : ::5sys_common : :: sys_common 0x :: backtrace - :: ::0x rustc_codegen_ssa100c24bd0backtrace[ 100bcb06c 0x - 100bcb06c0x - 1095803ec_rust_begin_unwind - + - rustc_codegen_ssa__rust_begin_short_backtrace[:::: <__rust_begin_short_backtrace <:: 0x b392610c019ec31b100c24bd06 - : core ]:: panicking :::: backpanic_fmt ::::h33e40d2a93cab78fwrite + :: 0xexecute_copy_from_cache_work_item 100c24bd07 - : :: core :: panicking rustc_codegen_llvm::[_rust_begin_unwindpanic_fmtb70b0e52460f9a66::] +h33e40d2a93cab78f< +rustc_codegen_llvm [ b70b0e52460f9a66 ]b392610c019ec31b7::: LlvmCodegenBackend]> +core :: 9 : 6 : < <:: back :: rustc_codegen_llvmpanicking [::b70b0e52460f9a66 ]panic_fmt ::::h33e40d2a93cab78f0x +109562508 - std 7LlvmCodegenBackend: [ fcd23fca98dce159 as ]0x ::rustc_codegen_ssasys_common[ :: b392610c019ec31b::backtrace100c24b9cLlvmCodegenBackend:: - __rust_begin_short_backtrace as ::core<:: - - LlvmCodegenBackendcore>:: +b392610c019ec31b ] option ::9expect_failed: ::8 h8c59d9d921ed2136 +:: : traits 0xtraits109562508 - std [ fcd23fca98dce159 ::] ::8sys_common: backend:: backtrace::::ExtraBackendMethods __rust_begin_short_backtrace> :: < ::< spawn_named_threadrustc_codegen_llvm<[rustc_codegen_ssab70b0e52460f9a66[ ::b392610c019ec31bpanicking]] :::: panic_fmtback::::0xspawn_named_thread1095803eccore:: - spawn_work::write:::: ::{execute_copy_from_cache_work_itemclosure #::80<: rustc_codegen_llvm [ b70b0e52460f9a66} ], :: LlvmCodegenBackend > +backend() 0x> 1095803ec::{ closure9# - : 0rustc_codegen_ssa} , ()[ b392610c019ec31b ] > +:: 0x back10956250810 - : std ::[ writefcd23fca98dce159 ] :: ::sys_common execute_copy_from_cache_work_item ::0xbacktrace109581244:: - __rust_begin_short_backtrace<::<<::std::[rustc_codegen_llvm::::threadspawn_named_thread::::LlvmCodegenBackendb392610c019ec31bBuilder<>]::::::spawn_unchecked_back<::h33e40d2a93cab78f< as +writeLlvmCodegenBackend :: spawn_work <9 +rustc_codegen_llvm: [ b70b0e52460f9a66 ] rustc_codegen_ssa:: LlvmCodegenBackend > [::{b392610c019ec31b closure 0x#1095625080 - }std][::fcd23fca98dce159::, ]traits::::sys_commonbackend::()rustc_codegen_llvmbacktrace::::ExtraBackendMethods__rust_begin_short_backtracetraits>::::<::][>::{:: +]back :: ::writeLlvmCodegenBackend::closureclosurespawn_work#<0rustc_codegen_llvm}[#, 0()b70b0e52460f9a66>] +::9 : LlvmCodegenBackend >}10::{: closure7, () : as rustc_codegen_ssa [ ># b392610c019ec31b ::]b70b0e52460f9a66::]ExtraBackendMethodstraits::::>LlvmCodegenBackendbackend as :: rustc_codegen_ssa0[::{}b392610c019ec31b, ]ExtraBackendMethods:: ()traits>::::{>backendclosure:: #ExtraBackendMethods::0>}::, spawn_named_threadspawn_named_thread<() rustc_codegen_ssa><[ +b392610c019ec31brustc_codegen_ssa] [:: back 10b392610c019ec31b: ::] write :::: spawn_work <0xrustc_codegen_llvm109562508back[ - b70b0e52460f9a66std][::::fcd23fca98dce159LlvmCodegenBackendwrite]>::::{sys_commonclosure::::#backtrace0::}spawn_work__rust_begin_short_backtrace, <::rustc_codegen_llvm<[()[::{b70b0e52460f9a66closure]]#::0::}LlvmCodegenBackend, as LlvmCodegenBackend()rustc_codegen_ssa>>[ +b392610c019ec31b::{ closure] #10::: traits :: backend :: ExtraBackendMethods0>}::, spawn_named_thread()<>rustc_codegen_ssa::{[closureb392610c019ec31b#]0::back:: write :: spawn_work < } , 0x()109581244>0x - ::{109581244closure - #<<1<}< as stdcore[[fcd23fca98dce15918650a1770591c75]closurestd#::[threadfcd23fca98dce159::]Builder::thread::::0Builder}>>spawn_named_thread, ::()::<>spawn_unchecked_ spawn_unchecked_rustc_codegen_ssa<[<[::]spawn_named_threadb70b0e52460f9a66::spawn_workstd<::rustc_codegen_llvmrustc_codegen_llvmspawn_named_thread[[b70b0e52460f9a66b70b0e52460f9a66<]]rustc_codegen_ssa::[LlvmCodegenBackend]> +b392610c019ec31b [ fcd23fca98dce159] ]10 ] ::: back:: write::::::spawn_workops[::b70b0e52460f9a66::{]::{closure::LlvmCodegenBackendclosureLlvmCodegenBackend#>>0::{#closure::#}00}}, , , ()()thread>::>::{Builderclosure>::{ closure# #0 }0 , ::{ () >closure ::{0xclosure1095812440xfunction - #<}1<}std as [corefcd23fca98dce159, ]()::()thread::>:: +Builder > ::::>spawn_unchecked_10<: < spawn_unchecked_ FnOnce #< () ::{ closure 100c24b9c#0x0<}<, rustc_codegen_llvm()[> - ::{18650a1770591c75closure]#::10>core>::::ops[rustc_codegen_llvmb70b0e52460f9a66109581244[]b70b0e52460f9a66 - }optioncall_once::::::{expect_failedshimLlvmCodegenBackend: as vtable > ::, : () >>LlvmCodegenBackend::{ as thread rustc_codegen_ssa [ b392610c019ec31b ] 0::::BuilderExtraBackendMethods }> :::: spawn_unchecked_ < call_once< ::{0xrustc_codegen_llvm100bd37d0shim> - :::stdspawn_named_threadvtable< +rustc_codegen_ssa::[sys b392610c019ec31b:: ::11traits: :: backendclosure[unixb70b0e52460f9a66::]thread:: ::LlvmCodegenBackendThread as 0x::1095803ecrustc_codegen_ssanew[:: - thread_start#::b392610c019ec31bh8dda2af345bab446rustc_codegen_ssa] +:: [traits b392610c019ec31b120: ] ] } :: + :: back0x::1813c506cback:: - ::write__pthread_deallocate:: +backendExtraBackendMethodsspawn_work::::<>writeExtraBackendMethods::rustc_codegen_llvmexecute_copy_from_cache_work_item>::[::#:: spawn_named_thread < 11<0rustc_codegen_llvmrustc_codegen_ssa}[, [()b70b0e52460f9a66>] +b392610c019ec31b:: ] LlvmCodegenBackend10>: :: +back ::: write :: spawn_work < rustc_codegen_llvm [ b70b0e52460f9a66 0x 109581244 - < <]std ::0x[LlvmCodegenBackendfcd23fca98dce159>]100bd37d0::{:: - closurestdthread::#::sys0Builder::>}::, spawn_unchecked_unix()<::><::{rustc_codegen_llvmclosure[#threadb70b0e52460f9a660]}::, LlvmCodegenBackend::() as >rustc_codegen_ssa::{[closureb392610c019ec31b#]1Thread::}traits as ::::corenewbackend[::18650a1770591c75ExtraBackendMethods::]thread_start::>ops::::::spawn_named_threadfunctionh8dda2af345bab446::back>::::writecall_once 120x::{: 100bd37d0shim - : vtable # 0 } +std ::0x 1813c506c11 - sys: __pthread_deallocate:: + unix :: thread :: Thread ::0xnew100bd37d0:: - thread_startstd::::h8dda2af345bab446sys +:: unix ::12thread: :: Thread ::new::thread_start::h8dda2af345bab446 + 12: 0x1813c506c - __pthread_deallocate + + +rustc version: 1.76.0 (07dca489a 2024-02-04) +platform: aarch64-apple-darwinb70b0e52460f9a66]::LlvmCodegenBackend>::{closure#0}, ()>::{spawn_named_thread closure #90: ::<}spawn_workrustc_codegen_ssa, [()b392610c019ec31b>::{ ]closure # 1 } as 0xcore1813c506c[ - 18650a1770591c75__pthread_deallocate] +::ops :: function :: FnOnce <0x()109562508> - backtrace::{::closure__rust_begin_short_backtrace#::0<}<, rustc_codegen_llvm()[>b70b0e52460f9a66::{]closure::#LlvmCodegenBackend0 as }rustc_codegen_ssa, [()b392610c019ec31b>]::{::closuretraits#::1backend}:: as ExtraBackendMethodscore>[::18650a1770591c75spawn_named_thread]<::rustc_codegen_ssaops[::b392610c019ec31bfunction]::::FnOnceback<::()write>::>spawn_work::}::{ +closure # 011}: , () > ::{ closure # 0 }0x, 100bd37d0() - >std +:: sys ::10unix: :: thread 0x109581244 - <::spawn_unchecked_<::spawn_named_thread::::{backclosure::#write0::}spawn_work, <()rustc_codegen_llvm>[::{b70b0e52460f9a66closure]#::0LlvmCodegenBackend}>, ::{()closure>#::{0closure}#, 1()}> as ::{coreclosure[#18650a1770591c750]}::, ops()::>function::{::closureFnOnce#<1()}> as >core::[call_once18650a1770591c75::{]shim:::opsvtable::#function0::}FnOnce +< () >11>: :: call_once ::{ shim : vtable # 0>0x}::call_once::{shim:vtable#0} + 11: 100bd37d0 - 0xstd100bd37d0:: - sysstd::::Threadsys::::newunix::thread_start::::unixh8dda2af345bab446:: +thread :: Thread::::new12:: +thread_startthread:: h8dda2af345bab446:: + Thread :: : 12new 11: : 0x 100bd37d0 - 0x 1813c506c - 0x__pthread_deallocate1813c506c + - __pthread_deallocate +::thread_start::h8dda2af345bab446 + 12: 0x1813c506c - __pthread_deallocate +thread 'coordinator' panicked at compiler/rustc_middle/src/util/bug.rs:36:26: +/rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs:1586:29: worker thread panicked +stack backtrace: + 0: 0x100bb2da8 - std::backtrace::Backtrace::create::h8af6f7a25d8a3749 + 1: 0x1092e6208 - as core[18650a1770591c75]::ops::function::Fn<(&dyn for<'a, 'b> core[18650a1770591c75]::ops::function::Fn<(&'a core[18650a1770591c75]::panicstd::::panic_infosys::::PanicInfounix<::'threadb::>Thread,::)new, ::Outputthread_start = ::()h8dda2af345bab446> + + core [1218650a1770591c75: ] :: marker :: Sync + core [0x18650a1770591c751813c506c] - ::__pthread_deallocatemarker +::Send, &core[18650a1770591c75]::panic::panic_info::PanicInfo)>>::call + 2: 0x100bcb528 - std::panicking::rust_panic_with_hook::h1e70c5d905e30e9d + 3: 0x10d461168 - std[fcd23fca98dce159]::panicking::begin_panic::::{closure#0} + 4: 0x10d4610ec - std[fcd23fca98dce159]::sys_common::backtrace::__rust_end_short_backtrace::::{closure#0}, !> + 5: 0x10d9fa040 - std[fcd23fca98dce159]::panicking::begin_panic:: + 6: 0x10d3da9f4 - rustc_middle[35a781f9bda42497]::util::bug::opt_span_bug_fmt::::{closure#0} + 7: 0x10d3d1c14 - rustc_middle[35a781f9bda42497]::ty::context::tls::with_opt::::{closure#0}, !>::{closure#0} + 8: 0x10d3d1be0 - rustc_middle[35a781f9bda42497]::ty::context::tls::with_context_opt::::{closure#0}, !>::{closure#0}, !> + 9: 0x10d9f53c4 - rustc_middle[35a781f9bda42497]::util::bug::bug_fmt + 10: 0x109564270 - std[fcd23fca98dce159]::sys_common::backtrace::__rust_begin_short_backtrace::<::spawn_named_thread::{closure#5}, core[18650a1770591c75]::result::Result>::{closure#0}, core[18650a1770591c75]::result::Result> + 11: 0x10958151c - <::spawn_unchecked_<::spawn_named_thread::{closure#5}, core[18650a1770591c75]::result::Result>::{closure#0}, core[18650a1770591c75]::result::Result>::{closure#1} as core[18650a1770591c75]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0} + 12: 0x100bd37d0 - std::sys::unix::thread::Thread::new::thread_start::h8dda2af345bab446 + 13: 0x1813c506c - __pthread_deallocate +thread 'rustc' panicked at compiler/rustc_middle/src/util/bug.rs:36:26: +/rustc/07dca489ac2d933c78d3c5158e3f43beefeb02ce/compiler/rustc_codegen_ssa/src/back/write.rs:1959:17: panic during codegen/LLVM phase +stack backtrace: + 0: 0x100bb2da8 - std::backtrace::Backtrace::create::h8af6f7a25d8a3749 + 1: 0x1092e6208 - as core[18650a1770591c75]::ops::function::Fn<(&dyn for<'a, 'b> core[18650a1770591c75]::ops::function::Fn<(&'a core[18650a1770591c75]::panic::panic_info::PanicInfo<'b>,), Output = ()> + core[18650a1770591c75]::marker::Sync + core[18650a1770591c75]::marker::Send, &core[18650a1770591c75]::panic::panic_info::PanicInfo)>>::call + 2: 0x100bcb528 - std::panicking::rust_panic_with_hook::h1e70c5d905e30e9d + 3: 0x10d461168 - std[fcd23fca98dce159]::panicking::begin_panic::::{closure#0} + 4: 0x10d4610ec - std[fcd23fca98dce159]::sys_common::backtrace::__rust_end_short_backtrace::::{closure#0}, !> + 5: 0x10d9fa040 - std[fcd23fca98dce159]::panicking::begin_panic:: + 6: 0x10d3da9f4 - rustc_middle[35a781f9bda42497]::util::bug::opt_span_bug_fmt::::{closure#0} + 7: 0x10d3d1c14 - rustc_middle[35a781f9bda42497]::ty::context::tls::with_opt::::{closure#0}, !>::{closure#0} + 8: 0x10d3d1be0 - rustc_middle[35a781f9bda42497]::ty::context::tls::with_context_opt::::{closure#0}, !>::{closure#0}, !> + 9: 0x10d9f53c4 - rustc_middle[35a781f9bda42497]::util::bug::bug_fmt + 10: 0x10955df48 - ::time::>::join::{closure#0}> + 11: 0x109583284 - >::join + 12: 0x109572d48 - ::join_codegen + 13: 0x10948e64c - ::link + 14: 0x1092d311c - rustc_span[d844dabcc0d15e78]::create_session_globals_then::, rustc_interface[9ecbacebda51131]::interface::run_compiler, rustc_driver_impl[d723ad74a265baf3]::run_compiler::{closure#0}>::{closure#0}> + 15: 0x109309628 - std[fcd23fca98dce159]::sys_common::backtrace::__rust_begin_short_backtrace::, rustc_driver_impl[d723ad74a265baf3]::run_compiler::{closure#0}>::{closure#0}, core[18650a1770591c75]::result::Result<(), rustc_span[d844dabcc0d15e78]::ErrorGuaranteed>>::{closure#0}::{closure#0}, core[18650a1770591c75]::result::Result<(), rustc_span[d844dabcc0d15e78]::ErrorGuaranteed>> + 16: 0x1092dbd7c - <::spawn_unchecked_, rustc_driver_impl[d723ad74a265baf3]::run_compiler::{closure#0}>::{closure#0}, core[18650a1770591c75]::result::Result<(), rustc_span[d844dabcc0d15e78]::ErrorGuaranteed>>::{closure#0}::{closure#0}, core[18650a1770591c75]::result::Result<(), rustc_span[d844dabcc0d15e78]::ErrorGuaranteed>>::{closure#1} as core[18650a1770591c75]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0} + 17: 0x100bd37d0 - std::sys::unix::thread::Thread::new::thread_start::h8dda2af345bab446 + 18: 0x1813c506c - __pthread_deallocate diff --git a/packages/rs-sdk/Cargo.toml b/packages/rs-sdk/Cargo.toml index 0a6339aae5..2ca7eb515f 100644 --- a/packages/rs-sdk/Cargo.toml +++ b/packages/rs-sdk/Cargo.toml @@ -12,7 +12,6 @@ drive = { path = "../rs-drive", default-features = false, features = [ ] } drive-proof-verifier = { path = "../rs-drive-proof-verifier" } dapi-grpc-macros = { path = "../rs-dapi-grpc-macros" } - bincode = { version = "2.0.0-rc.3", features = ["serde"], optional = true } thiserror = "1.0.47" tokio = { version = "1.32.0", features = ["macros"] } diff --git a/packages/rs-sdk/src/core/transaction.rs b/packages/rs-sdk/src/core/transaction.rs index a7046a2fdb..ffdc6b373b 100644 --- a/packages/rs-sdk/src/core/transaction.rs +++ b/packages/rs-sdk/src/core/transaction.rs @@ -16,6 +16,7 @@ use dpp::prelude::AssetLockProof; use rs_dapi_client::{DapiRequestExecutor, RequestSettings}; use std::time::Duration; use tokio::time::{sleep, timeout}; +use tracing::info; impl Sdk { /// Starts the stream to listen for instant send lock messages diff --git a/packages/rs-sdk/src/platform/transition.rs b/packages/rs-sdk/src/platform/transition.rs index 95399fff3e..347a01b6a8 100644 --- a/packages/rs-sdk/src/platform/transition.rs +++ b/packages/rs-sdk/src/platform/transition.rs @@ -1,7 +1,7 @@ //! State transitions used to put changed objects to the Dash Platform. pub mod broadcast; pub(crate) mod broadcast_identity; -pub(crate) mod broadcast_request; +pub mod broadcast_request; pub(crate) mod context; pub mod put_document; pub mod put_identity; diff --git a/packages/rs-sdk/src/platform/transition/broadcast_request.rs b/packages/rs-sdk/src/platform/transition/broadcast_request.rs index f1658fc9f0..9d8ab69861 100644 --- a/packages/rs-sdk/src/platform/transition/broadcast_request.rs +++ b/packages/rs-sdk/src/platform/transition/broadcast_request.rs @@ -62,7 +62,7 @@ use crate::error::Error; /// /// As [BroadcastRequestForStateTransition] is a trait, it can be implemented for any type that represents /// a new identity creation operation, allowing for flexibility in how new identities are broadcasted. -pub(crate) trait BroadcastRequestForStateTransition: Send + Debug + Clone { +pub trait BroadcastRequestForStateTransition: Send + Debug + Clone { /// Converts the current instance into an instance of the `TransportRequest` type, ready for broadcasting. /// /// This method takes ownership of the instance upon which it's called (hence `self`), and attempts to perform the conversion, diff --git a/packages/rs-sdk/src/platform/transition/put_document.rs b/packages/rs-sdk/src/platform/transition/put_document.rs index 0604dce9eb..2ae25ac7da 100644 --- a/packages/rs-sdk/src/platform/transition/put_document.rs +++ b/packages/rs-sdk/src/platform/transition/put_document.rs @@ -25,9 +25,9 @@ pub struct PutSettings { } #[async_trait::async_trait] -/// A trait for putting an identity to platform +/// A trait for putting a document to platform pub trait PutDocument { - /// Puts an identity on platform + /// Puts a document on platform /// setting settings to `None` sets default connection behavior async fn put_to_platform( &self, diff --git a/packages/rs-sdk/src/platform/transition/withdraw_from_identity.rs b/packages/rs-sdk/src/platform/transition/withdraw_from_identity.rs index b667e5e63f..d298b08329 100644 --- a/packages/rs-sdk/src/platform/transition/withdraw_from_identity.rs +++ b/packages/rs-sdk/src/platform/transition/withdraw_from_identity.rs @@ -5,7 +5,6 @@ use dpp::identity::accessors::IdentityGettersV0; use dpp::identity::core_script::CoreScript; use dpp::identity::signer::Signer; use dpp::identity::Identity; -use dpp::prelude::IdentityNonce; use dpp::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition; @@ -20,6 +19,7 @@ use rs_dapi_client::{DapiRequest, RequestSettings}; #[async_trait::async_trait] pub trait WithdrawFromIdentity { + /// Function to withdraw credits from an identity. Returns the final identity balance. async fn withdraw( &self, sdk: &Sdk, @@ -42,7 +42,7 @@ impl WithdrawFromIdentity for Identity { signer: S, settings: Option, ) -> Result { - let new_identity_contract_nonce = sdk.get_identity_nonce(self.id(), true, settings).await?; + let new_identity_nonce = sdk.get_identity_nonce(self.id(), true, settings).await?; let state_transition = IdentityCreditWithdrawalTransition::try_from_identity( self, CoreScript::new(address.script_pubkey()), @@ -50,7 +50,7 @@ impl WithdrawFromIdentity for Identity { Pooling::Never, core_fee_per_byte.unwrap_or(1), signer, - new_identity_contract_nonce, + new_identity_nonce, sdk.version(), None, )?; diff --git a/packages/rs-sdk/src/sdk.rs b/packages/rs-sdk/src/sdk.rs index 1678252c62..9a51868478 100644 --- a/packages/rs-sdk/src/sdk.rs +++ b/packages/rs-sdk/src/sdk.rs @@ -1,8 +1,7 @@ //! [Sdk] entrypoint to Dash Platform. use std::collections::btree_map::Entry; -use std::collections::BTreeMap; -use std::sync::{Arc, RwLock}; +use std::sync::Arc; use std::{fmt::Debug, num::NonZeroUsize, ops::DerefMut}; use crate::error::Error; @@ -19,13 +18,12 @@ use dapi_grpc::platform::v0::{ GetIdentityContractNonceRequest, GetIdentityContractNonceResponse, Proof, ResponseMetadata, }; use dpp::identity::identity_nonce::IDENTITY_NONCE_VALUE_FILTER; -use dpp::prelude; use dpp::prelude::IdentityNonce; use dpp::version::{PlatformVersion, PlatformVersionCurrentVersion}; use drive_proof_verifier::types::{IdentityContractNonceFetcher, IdentityNonceFetcher}; #[cfg(feature = "mocks")] use drive_proof_verifier::MockContextProvider; -use drive_proof_verifier::{types, ContextProvider, FromProof}; +use drive_proof_verifier::{ContextProvider, FromProof}; pub use http::Uri; #[cfg(feature = "mocks")] use rs_dapi_client::mock::MockDapiClient; @@ -251,7 +249,7 @@ impl Sdk { let entry = identity_nonce_counter.entry(identity_id); let should_query_platform = match &entry { - Entry::Vacant(e) => true, + Entry::Vacant(_) => true, Entry::Occupied(e) => { let (_, last_query_time) = e.get(); *last_query_time @@ -345,7 +343,7 @@ impl Sdk { let entry = identity_contract_nonce_counter.entry((identity_id, contract_id)); let should_query_platform = match &entry { - Entry::Vacant(e) => true, + Entry::Vacant(_) => true, Entry::Occupied(e) => { let (_, last_query_time) = e.get(); *last_query_time diff --git a/packages/strategy-tests/Cargo.toml b/packages/strategy-tests/Cargo.toml index 92be5c0c21..9e8b0a1e8c 100644 --- a/packages/strategy-tests/Cargo.toml +++ b/packages/strategy-tests/Cargo.toml @@ -11,12 +11,15 @@ rust-version = "1.73" license = "MIT" [dependencies] +tracing = "0.1.4" +futures = "0.3" bincode = { version = "2.0.0-rc.3", features = ["serde"] } drive = { path = "../rs-drive", default-features = false, features = [ "verify", ] } rand = "0.8.5" hex = "0.4.3" +serde_json = "1.0" dpp = { path = "../rs-dpp", features = [ "abci", "random-documents", diff --git a/packages/strategy-tests/src/lib.rs b/packages/strategy-tests/src/lib.rs index 305ec11d11..9f32d67b58 100644 --- a/packages/strategy-tests/src/lib.rs +++ b/packages/strategy-tests/src/lib.rs @@ -4,12 +4,16 @@ use crate::operations::{ DocumentAction, DocumentOp, FinalizeBlockOperation, IdentityUpdateOp, Operation, OperationType, }; use dpp::block::block_info::BlockInfo; +use dpp::dashcore::PrivateKey; use dpp::data_contract::created_data_contract::CreatedDataContract; use dpp::data_contract::document_type::random_document::CreateRandomDocument; +use dpp::data_contract::document_type::v0::DocumentTypeV0; use dpp::data_contract::DataContract; -use dpp::document::DocumentV0Getters; -use dpp::identity::{Identity, KeyType, Purpose, SecurityLevel}; +use dpp::document::{Document, DocumentV0Getters}; +use dpp::identity::state_transition::asset_lock_proof::AssetLockProof; +use dpp::identity::{Identity, KeyType, PartialIdentity, Purpose, SecurityLevel}; +use dpp::platform_value::string_encoding::Encoding; use dpp::serialization::{ PlatformDeserializableWithPotentialValidationFromVersionedStructure, PlatformSerializableWithPlatformVersion, @@ -18,22 +22,22 @@ use dpp::state_transition::data_contract_create_transition::DataContractCreateTr use dpp::state_transition::data_contract_update_transition::DataContractUpdateTransition; use dpp::state_transition::StateTransition; use dpp::version::PlatformVersion; -use drive::drive::flags::StorageFlags::SingleEpoch; use drive::drive::identity::key::fetch::{IdentityKeysRequest, KeyRequestType}; -use drive::drive::Drive; use dpp::data_contract::accessors::v0::{DataContractV0Getters, DataContractV0Setters}; use dpp::state_transition::data_contract_update_transition::methods::DataContractUpdateTransitionMethodsV0; -use drive::query::DriveQuery; -use rand::prelude::{IteratorRandom, StdRng}; +use operations::{DataContractUpdateAction, DataContractUpdateOp}; +use platform_version::TryFromPlatformVersioned; +use rand::prelude::StdRng; use rand::Rng; -use std::borrow::Cow; -use std::collections::{BTreeMap, HashSet}; +use tracing::{error, info}; +use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet}; use bincode::{Decode, Encode}; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::identifier::Identifier; +use dpp::data_contract::document_type::DocumentType; use dpp::identity::accessors::IdentityGettersV0; -use dpp::platform_value::BinaryData; +use dpp::platform_value::{BinaryData, Bytes32}; use dpp::ProtocolError; use dpp::ProtocolError::{PlatformDeserializationError, PlatformSerializationError}; use dpp::state_transition::documents_batch_transition::document_base_transition::v0::DocumentBaseTransitionV0; @@ -42,9 +46,7 @@ use dpp::state_transition::documents_batch_transition::document_transition::docu use dpp::state_transition::documents_batch_transition::document_transition::document_replace_transition::DocumentReplaceTransitionV0; use dpp::state_transition::documents_batch_transition::{DocumentsBatchTransition, DocumentsBatchTransitionV0}; use dpp::state_transition::documents_batch_transition::document_transition::{DocumentDeleteTransition, DocumentReplaceTransition}; -use drive::drive::document::query::QueryDocumentsOutcomeV0Methods; use dpp::state_transition::data_contract_create_transition::methods::v0::DataContractCreateTransitionMethodsV0; - use simple_signer::signer::SimpleSigner; pub mod frequency; @@ -96,6 +98,24 @@ pub struct Strategy { pub signer: Option, } +/// Config stuff for a Strategy +#[derive(Clone, Debug, PartialEq)] +pub struct StrategyConfig { + pub start_block_height: u64, + pub number_of_blocks: u64, +} + +#[derive(Clone, Debug, PartialEq)] +pub struct RandomDocumentQuery<'a> { + pub data_contract: &'a DataContract, + pub document_type: &'a DocumentType, +} + +#[derive(Clone, Debug, PartialEq)] +pub enum LocalDocumentQuery<'a> { + RandomDocumentQuery(RandomDocumentQuery<'a>), +} + #[derive(Clone, Debug, Encode, Decode)] struct StrategyInSerializationFormat { pub contracts_with_updates: Vec<(Vec, Option>>)>, @@ -257,54 +277,21 @@ impl PlatformDeserializableWithPotentialValidationFromVersionedStructure for Str } impl Strategy { - /// Adds strategy contracts from the current operations into a specified Drive. - /// - /// This method iterates over the operations present in the current strategy. For each operation - /// of type `Document`, it serializes the associated contract and applies it to the provided drive. - /// - /// # Parameters - /// - `drive`: The Drive where contracts should be added. - /// - `platform_version`: The current Platform version used for serializing the contract. - /// - /// # Panics - /// This method may panic in the following situations: - /// - If serialization of a contract fails. - /// - If applying a contract with serialization to the drive fails. - /// - /// # Examples - /// ```ignore - /// // Assuming `strategy` is an instance of `Strategy` - /// // and `drive` and `platform_version` are appropriately initialized. - /// strategy.add_strategy_contracts_into_drive(&drive, &platform_version); - /// ``` - // TODO: This belongs to `DocumentOp` - pub fn add_strategy_contracts_into_drive( - &mut self, - drive: &Drive, - platform_version: &PlatformVersion, - ) { - for op in &self.operations { - if let OperationType::Document(doc_op) = &op.op_type { - let serialize = doc_op - .contract - .serialize_to_bytes_with_platform_version(platform_version) - .expect("expected to serialize"); - drive - .apply_contract_with_serialization( - &doc_op.contract, - serialize, - BlockInfo::default(), - true, - Some(Cow::Owned(SingleEpoch(0))), - None, - platform_version, - ) - .expect("expected to be able to add contract"); - } - } + /// Convenience method to get all contract ids that are in operations + pub fn used_contract_ids(&self) -> BTreeSet { + self.operations + .iter() + .filter_map(|operation| { + match &operation.op_type { + OperationType::Document(document) => Some(document.contract.id()), + //todo add data contract updates + _ => None, + } + }) + .collect() } - /// Generates state transitions for identities based on the block information provided. + /// Creates state transitions based on the `identities_inserts` and `start_identities` fields. /// /// This method creates a list of state transitions associated with identities. If the block height /// is `1` and there are starting identities present in the strategy, these identities are directly @@ -333,29 +320,39 @@ impl Strategy { block_info: &BlockInfo, signer: &mut SimpleSigner, rng: &mut StdRng, + create_asset_lock: &mut impl FnMut(u64) -> Option<(AssetLockProof, PrivateKey)>, + config: &StrategyConfig, platform_version: &PlatformVersion, - ) -> Vec<(Identity, StateTransition)> { + ) -> Result, ProtocolError> { let mut state_transitions = vec![]; - if block_info.height == 1 && !self.start_identities.is_empty() { + + // Add start_identities + if block_info.height == config.start_block_height && !self.start_identities.is_empty() { state_transitions.append(&mut self.start_identities.clone()); } - let frequency = &self.identities_inserts; - if frequency.check_hit(rng) { - let count = frequency.events(rng); - state_transitions.append( - &mut crate::transitions::create_identities_state_transitions( - count, - 5, + + // Add identities_inserts + // Don't do this on first block because we need to skip utxo refresh + if block_info.height > config.start_block_height { + let frequency = &self.identities_inserts; + if frequency.check_hit(rng) { + let count = frequency.events(rng); + let mut new_transitions = crate::transitions::create_identities_state_transitions( + count, // number of identities + 3, // number of keys per identity signer, rng, + create_asset_lock, platform_version, - ), - ) + )?; + state_transitions.append(&mut new_transitions); + } } - state_transitions + + Ok(state_transitions) } - /// Generates state transitions for data contracts based on the current set of identities. + /// Generates state transitions for the inital contracts of the contracts_with_updates field. /// /// This method creates state transitions for data contracts by iterating over the contracts with updates /// present in the strategy. For each contract: @@ -389,6 +386,8 @@ impl Strategy { rng: &mut StdRng, platform_version: &PlatformVersion, ) -> Vec { + let mut id_mapping = HashMap::new(); // Maps old IDs to new IDs + self.contracts_with_updates .iter_mut() .map(|(created_contract, contract_updates)| { @@ -399,43 +398,33 @@ impl Strategy { .clone() .into_partial_identity_info(); - let entropy_used = *created_contract.entropy_used(); - let contract = created_contract.data_contract_mut(); + let bytes32 = Bytes32::random_with_rng(rng); + contract.set_owner_id(identity.id); let old_id = contract.id(); - let new_id = DataContract::generate_data_contract_id_v0(identity.id, entropy_used); + let new_id = DataContract::generate_data_contract_id_v0(identity.id, bytes32); contract.set_id(new_id); + id_mapping.insert(old_id, new_id); // Store the mapping + if let Some(contract_updates) = contract_updates { for (_, updated_contract) in contract_updates.iter_mut() { - updated_contract.data_contract_mut().set_id(contract.id()); - updated_contract - .data_contract_mut() - .set_owner_id(contract.owner_id()); - } - } - - // since we are changing the id, we need to update all the strategy - self.operations.iter_mut().for_each(|operation| { - if let OperationType::Document(document_op) = &mut operation.op_type { - if document_op.contract.id() == old_id { - document_op.contract.set_id(contract.id()); - document_op.document_type = document_op - .contract - .document_type_for_name(document_op.document_type.name()) - .expect("document type must exist") - .to_owned_document_type(); + let updated_contract_data = updated_contract.data_contract_mut(); + // Use the new ID from the mapping + if let Some(new_updated_id) = id_mapping.get(&updated_contract_data.id()) { + updated_contract_data.set_id(*new_updated_id); } + updated_contract_data.set_owner_id(contract.owner_id()); } - }); + } let state_transition = DataContractCreateTransition::new_from_data_contract( contract.clone(), - *created_contract.entropy_used(), + bytes32, &identity, - 1, //key id 1 should always be a high or critical auth key in these tests + 2, // key id 1 should always be a high or critical auth key in these tests signer, platform_version, None, @@ -446,7 +435,7 @@ impl Strategy { .collect() } - /// Generates state transitions for updating data contracts based on the current set of identities and block height. + /// Generates state transitions for contract updates in contracts_with_updates based on the current set of identities and block height. /// /// This method creates update state transitions for data contracts by iterating over the contracts with updates /// present in the strategy. For each contract: @@ -476,51 +465,79 @@ impl Strategy { &mut self, current_identities: &Vec, block_height: u64, + initial_block_height: u64, signer: &SimpleSigner, contract_nonce_counter: &mut BTreeMap<(Identifier, Identifier), u64>, platform_version: &PlatformVersion, ) -> Vec { - self.contracts_with_updates - .iter_mut() - .filter_map(|(_, contract_updates)| { - let Some(contract_updates) = contract_updates else { - return None; - }; - let Some(contract_update) = contract_updates.get(&block_height) else { - return None; - }; - let identity = current_identities - .iter() - .find(|identity| identity.id() == contract_update.data_contract().owner_id()) - .expect("expected to find an identity") - .clone() - .into_partial_identity_info(); - - let identity_contract_nonce = contract_nonce_counter - .entry((identity.id, contract_update.data_contract().id())) - .or_default(); - *identity_contract_nonce += 1; + // Collect updates + let updates: Vec<_> = self + .contracts_with_updates + .iter() + .flat_map(|(_, contract_updates_option)| { + contract_updates_option + .as_ref() + .map_or_else(Vec::new, |contract_updates| { + contract_updates + .iter() + .filter_map(move |(update_height, contract_update)| { + let adjusted_update_height = + initial_block_height + update_height * 3; + if adjusted_update_height != block_height { + return None; + } + current_identities + .iter() + .find(|identity| { + identity.id() == contract_update.data_contract().owner_id() + }) + .map(|identity| { + (identity.clone(), *update_height, contract_update) + }) + }) + .collect::>() + }) + .into_iter() + }) + .collect(); - let state_transition = DataContractUpdateTransition::new_from_data_contract( - contract_update.data_contract().clone(), - &identity, - 1, //key id 1 should always be a high or critical auth key in these tests - *identity_contract_nonce, + // Increment nonce counter, update data contract version, and create state transitions + updates + .into_iter() + .map(|(identity, update_height, contract_update)| { + let identity_info = identity.into_partial_identity_info(); + let contract_id = contract_update.data_contract().id(); + let nonce = contract_nonce_counter + .entry((identity_info.id, contract_id)) + .and_modify(|e| *e += 1) + .or_insert(1); + + // Set the version number on the data contract + let mut contract_update_clone = contract_update.clone(); + let data_contract = contract_update_clone.data_contract_mut(); + data_contract.set_version(update_height as u32); + + // Create the state transition + DataContractUpdateTransition::new_from_data_contract( + data_contract.clone(), + &identity_info, + 2, // Assuming key id 2 is a high or critical auth key + *nonce, signer, platform_version, None, ) - .expect("expected to create a create state transition from a data contract"); - Some(state_transition) + .expect("expected to create a state transition from a data contract") }) .collect() } - /// Generates state transitions for a given block. + /// Generates state transitions for a given block based on Strategy operations. /// /// The `state_transitions_for_block` function processes state transitions based on the provided /// block information, platform, identities, and other input parameters. It facilitates /// the creation of state transitions for both new documents and updated documents in the system. + /// Only deals with the operations field of Strategy. Not contracts_with_updates or identities fields. /// /// # Parameters /// - `platform`: A reference to the platform, which provides access to various blockchain @@ -560,9 +577,15 @@ impl Strategy { /// transitions for the given block. pub fn state_transitions_for_block( &self, - drive: &Drive, + document_query_callback: &mut impl FnMut(LocalDocumentQuery) -> Vec, + identity_fetch_callback: &mut impl FnMut( + Identifier, + Option, + ) -> PartialIdentity, + create_asset_lock: &mut impl FnMut(u64) -> Option<(AssetLockProof, PrivateKey)>, block_info: &BlockInfo, current_identities: &mut Vec, + known_contracts: &mut BTreeMap, signer: &mut SimpleSigner, identity_nonce_counter: &mut BTreeMap, contract_nonce_counter: &mut BTreeMap<(Identifier, Identifier), u64>, @@ -579,7 +602,9 @@ impl Strategy { // Loop through the operations and generate state transitions based on frequency and type for op in &self.operations { + // Check if the op frequency hits for this block if op.frequency.check_hit(rng) { + // Get times_per_block let count = rng.gen_range(op.frequency.times_per_block_range.clone()); match &op.op_type { // Generate state transition for document insert operation with random data @@ -588,6 +613,7 @@ impl Strategy { document_type, contract, }) => { + // TO-DO: these documents should be created according to the data contract's validation rules let documents = document_type .random_documents_with_params( count as u32, @@ -599,6 +625,7 @@ impl Strategy { platform_version, ) .expect("expected random_documents_with_params"); + documents .into_iter() .for_each(|(document, identity, entropy)| { @@ -639,7 +666,7 @@ impl Strategy { DocumentsBatchTransitionV0 { owner_id: identity.id(), transitions: vec![document_create_transition.into()], - signature_public_key_id: 0, + signature_public_key_id: 2, signature: BinaryData::default(), } .into(); @@ -649,10 +676,7 @@ impl Strategy { let identity_public_key = identity .get_first_public_key_matching( Purpose::AUTHENTICATION, - HashSet::from([ - SecurityLevel::HIGH, - SecurityLevel::CRITICAL, - ]), + HashSet::from([SecurityLevel::CRITICAL]), HashSet::from([ KeyType::ECDSA_SECP256K1, KeyType::BLS12_381, @@ -665,7 +689,7 @@ impl Strategy { identity_public_key, signer, Some(|_data_contract_id, _document_type_name| { - Ok(SecurityLevel::HIGH) + Ok(SecurityLevel::CRITICAL) }), ) .expect("expected to sign"); @@ -755,7 +779,7 @@ impl Strategy { DocumentsBatchTransitionV0 { owner_id: identity.id(), transitions: vec![document_create_transition.into()], - signature_public_key_id: 0, + signature_public_key_id: 1, signature: BinaryData::default(), } .into(); @@ -796,18 +820,23 @@ impl Strategy { document_type, contract, }) => { - let any_item_query = - DriveQuery::any_item_query(contract, document_type.as_ref()); - let mut items = drive - .query_documents( - any_item_query, - Some(&block_info.epoch), - false, - None, - Some(platform_version.protocol_version), - ) - .expect("expect to execute query") - .documents_owned(); + let mut items = document_query_callback( + LocalDocumentQuery::RandomDocumentQuery(RandomDocumentQuery { + data_contract: contract, + document_type, + }), + ); + //// the following is removed in favor of the local document query callback above + // let mut items = drive + // .query_documents( + // any_item_query, + // Some(&block_info.epoch), + // false, + // None, + // Some(platform_version.protocol_version), + // ) + // .expect("expect to execute query") + // .documents_owned(); items.retain(|item| !deleted.contains(&item.id())); @@ -827,10 +856,8 @@ impl Strategy { limit: Some(1), offset: None, }; - let identity = drive - .fetch_identity_balance_with_keys(request, None, platform_version) - .expect("expected to be able to get identity") - .expect("expected to get an identity"); + let identity = + identity_fetch_callback(request.identity_id.into(), Some(request)); let identity_contract_nonce = contract_nonce_counter .get_mut(&(identity.id, contract.id())) .expect( @@ -854,7 +881,7 @@ impl Strategy { DocumentsBatchTransitionV0 { owner_id: identity.id, transitions: vec![document_delete_transition.into()], - signature_public_key_id: 0, + signature_public_key_id: 1, signature: BinaryData::default(), } .into(); @@ -888,18 +915,24 @@ impl Strategy { document_type, contract, }) => { - let any_item_query = - DriveQuery::any_item_query(contract, document_type.as_ref()); - let mut items = drive - .query_documents( - any_item_query, - Some(&block_info.epoch), - false, - None, - Some(platform_version.protocol_version), - ) - .expect("expect to execute query") - .documents_owned(); + let mut items = document_query_callback( + LocalDocumentQuery::RandomDocumentQuery(RandomDocumentQuery { + data_contract: contract, + document_type, + }), + ); + // let any_item_query = + // DriveQuery::any_item_query(contract, document_type.as_ref()); + // let mut items = drive + // .query_documents( + // any_item_query, + // Some(&block_info.epoch), + // false, + // None, + // Some(platform_version.protocol_version), + // ) + // .expect("expect to execute query") + // .documents_owned(); items.retain(|item| !deleted.contains(&item.id())); @@ -922,10 +955,8 @@ impl Strategy { limit: Some(1), offset: None, }; - let identity = drive - .fetch_identity_balance_with_keys(request, None, platform_version) - .expect("expected to be able to get identity") - .expect("expected to get an identity"); + let identity = + identity_fetch_callback(request.identity_id.into(), Some(request)); let identity_contract_nonce = contract_nonce_counter .get_mut(&(identity.id, contract.id())) .expect( @@ -955,7 +986,7 @@ impl Strategy { DocumentsBatchTransitionV0 { owner_id: identity.id, transitions: vec![document_replace_transition.into()], - signature_public_key_id: 0, + signature_public_key_id: 1, signature: BinaryData::default(), } .into(); @@ -985,70 +1016,77 @@ impl Strategy { // Generate state transition for identity top-up operation OperationType::IdentityTopUp if !current_identities.is_empty() => { - let indices: Vec = - (0..current_identities.len()).choose_multiple(rng, count as usize); - let random_identities: Vec<&Identity> = indices - .into_iter() - .map(|index| ¤t_identities[index]) - .collect(); + // Use a cyclic iterator over the identities to ensure we can create 'count' transitions + let cyclic_identities = current_identities.iter().cycle(); - for random_identity in random_identities { - operations.push(crate::transitions::create_identity_top_up_transition( - rng, + // Iterate 'count' times to create the required number of state transitions. + for random_identity in cyclic_identities.take(count.into()) { + match crate::transitions::create_identity_top_up_transition( random_identity, + create_asset_lock, platform_version, - )); + ) { + Ok(transition) => operations.push(transition), + Err(_) => { + tracing::error!("Error creating asset lock proof for identity top up transition"); + continue; + } + } } } - // Generate state transition for identity update operation OperationType::IdentityUpdate(update_op) if !current_identities.is_empty() => { - let indices: Vec = - (0..current_identities.len()).choose_multiple(rng, count as usize); - for index in indices { - let random_identity = current_identities.get_mut(index).unwrap(); - match update_op { - IdentityUpdateOp::IdentityUpdateAddKeys(count) => { - let (state_transition, keys_to_add_at_end_block) = - crate::transitions::create_identity_update_transition_add_keys( - random_identity, - *count, - identity_nonce_counter, - signer, - rng, - platform_version, - ); - operations.push(state_transition); - finalize_block_operations.push(IdentityAddKeys( - keys_to_add_at_end_block.0, - keys_to_add_at_end_block.1, - )) - } - IdentityUpdateOp::IdentityUpdateDisableKey(count) => { - let state_transition = - crate::transitions::create_identity_update_transition_disable_keys( - random_identity, - *count, - block_info.time_ms, - identity_nonce_counter, - signer, - rng, - platform_version, - ); - if let Some(state_transition) = state_transition { + match update_op { + IdentityUpdateOp::IdentityUpdateAddKeys(keys_count) => { + (0..count).for_each(|_| { + current_identities.iter_mut().enumerate().for_each(|(i, random_identity)| { + if i >= count.into() { return; } + + let (state_transition, keys_to_add_at_end_block) = + crate::transitions::create_identity_update_transition_add_keys( + random_identity, + *keys_count, + identity_nonce_counter, + signer, + rng, + platform_version, + ); operations.push(state_transition); - } - } + finalize_block_operations.push(IdentityAddKeys( + keys_to_add_at_end_block.0, + keys_to_add_at_end_block.1, + )); + }); + }); + } + IdentityUpdateOp::IdentityUpdateDisableKey(keys_count) => { + (0..count).for_each(|_| { + current_identities.iter_mut().enumerate().for_each(|(i, random_identity)| { + if i >= count.into() { return; } + + if let Some(state_transition) = + crate::transitions::create_identity_update_transition_disable_keys( + random_identity, + *keys_count, + identity_nonce_counter, + block_info.time_ms, + signer, + rng, + platform_version, + ) { + operations.push(state_transition); + } + }); + }); } } } // Generate state transition for identity withdrawal operation OperationType::IdentityWithdrawal if !current_identities.is_empty() => { - let indices: Vec = - (0..current_identities.len()).choose_multiple(rng, count as usize); - for index in indices { - let random_identity = current_identities.get_mut(index).unwrap(); + for i in 0..count { + let index = (i as usize) % current_identities.len(); + let random_identity = &mut current_identities[index]; let state_transition = crate::transitions::create_identity_withdrawal_transition( random_identity, @@ -1062,22 +1100,22 @@ impl Strategy { // Generate state transition for identity transfer operation OperationType::IdentityTransfer if current_identities.len() > 1 => { - // chose 2 last identities - let indices: Vec = - vec![current_identities.len() - 2, current_identities.len() - 1]; - - let owner = current_identities.get(indices[0]).unwrap(); - let recipient = current_identities.get(indices[1]).unwrap(); - - let state_transition = - crate::transitions::create_identity_credit_transfer_transition( - owner, - recipient, - identity_nonce_counter, - signer, - 1000, - ); - operations.push(state_transition); + let identities_clone = current_identities.clone(); + // Sender is the first in the list, which should be loaded_identity + let owner = &mut current_identities[0]; + // Recipient is the second in the list + let recipient = &identities_clone[1]; + for _ in 0..count { + let state_transition = + crate::transitions::create_identity_credit_transfer_transition( + owner, + &recipient, + identity_nonce_counter, + signer, + 1000, + ); + operations.push(state_transition); + } } // OperationType::ContractCreate(new_fields_optional_count_range, new_fields_required_count_range, new_index_count_range, document_type_count) // if !current_identities.is_empty() => { @@ -1085,10 +1123,75 @@ impl Strategy { // // DocumentType::random_document() // } - // OperationType::ContractUpdate(DataContractNewDocumentTypes(count)) - // if !current_identities.is_empty() => { - // - // } + OperationType::ContractUpdate(DataContractUpdateOp { + action: DataContractUpdateAction::DataContractNewDocumentTypes(params), + contract, + document_type: None, + }) => { + let contract_key = contract.id().to_string(Encoding::Base58); + + for _ in 0..count { + if let Some(DataContract::V0(contract_ref)) = + known_contracts.get_mut(&contract_key) + { + match DocumentTypeV0::random_document_type( + params.clone(), + contract_ref.id(), + rng, + platform_version, + ) { + Ok(new_document_type) => { + let document_type_name = + format!("doc_type_{}", rng.gen::()); + + // Update the document types and increment the version + contract_ref.document_types.insert( + document_type_name, + DocumentType::V0(new_document_type), + ); + contract_ref.increment_version(); + + let identity = ¤t_identities[0]; + let identity_contract_nonce = contract_nonce_counter + .entry((identity.id(), contract_ref.id())) + .or_default(); + *identity_contract_nonce += 1; + + // Prepare the DataContractUpdateTransition with the updated contract_ref + match DataContractUpdateTransition::try_from_platform_versioned((DataContract::V0(contract_ref.clone()), *identity_contract_nonce), platform_version) { + Ok(data_contract_update_transition) => { + let identity_public_key = current_identities[0] + .get_first_public_key_matching( + Purpose::AUTHENTICATION, + HashSet::from([SecurityLevel::CRITICAL]), + HashSet::from([KeyType::ECDSA_SECP256K1, KeyType::BLS12_381]), + ) + .expect("expected to get a signing key with CRITICAL security level"); + + let mut state_transition = StateTransition::DataContractUpdate(data_contract_update_transition); + state_transition.sign_external( + identity_public_key, + signer, + Some(|_data_contract_id, _document_type_name| { + Ok(SecurityLevel::CRITICAL) + }), + ) + .expect("expected to sign the contract update transition with a CRITICAL level key"); + + operations.push(state_transition); + }, + Err(e) => error!("Error converting data contract to update transition: {:?}", e), + } + } + Err(e) => { + error!("Error generating random document type: {:?}", e) + } + } + } else { + // Handle the case where the contract is not found in known_contracts + } + } + } _ => {} } } @@ -1100,7 +1203,7 @@ impl Strategy { /// /// This function processes state transitions with respect to identities, contracts, /// and document operations. The state transitions are generated based on the - /// given block's height and other parameters, with special handling for block height `1`. + /// given block's height and other parameters, with special handling for the initial block height. /// /// # Parameters /// - `platform`: A reference to the platform, which is parameterized with a mock core RPC type. @@ -1126,35 +1229,67 @@ impl Strategy { /// platform_version /// ); /// ``` - pub fn state_transitions_for_block_with_new_identities( + pub async fn state_transitions_for_block_with_new_identities( &mut self, - drive: &Drive, + document_query_callback: &mut impl FnMut(LocalDocumentQuery) -> Vec, + identity_fetch_callback: &mut impl FnMut( + Identifier, + Option, + ) -> PartialIdentity, + create_asset_lock: &mut impl FnMut(u64) -> Option<(AssetLockProof, PrivateKey)>, block_info: &BlockInfo, current_identities: &mut Vec, + known_contracts: &mut BTreeMap, signer: &mut SimpleSigner, identity_nonce_counter: &mut BTreeMap, contract_nonce_counter: &mut BTreeMap<(Identifier, Identifier), u64>, rng: &mut StdRng, + config: &StrategyConfig, platform_version: &PlatformVersion, ) -> (Vec, Vec) { let mut finalize_block_operations = vec![]; - let identity_state_transitions = - self.identity_state_transitions_for_block(block_info, signer, rng, platform_version); - let (mut new_identities, mut state_transitions): (Vec, Vec) = + + // Get identity state transitions + let identity_state_transitions = match self.identity_state_transitions_for_block( + block_info, + signer, + rng, + create_asset_lock, + config, + platform_version, + ) { + Ok(transitions) => transitions, + Err(e) => { + error!("identity_state_transitions_for_block error: {}", e); + return (vec![], finalize_block_operations); + } + }; + + // Create state_transitions vec and identities vec based on identity_state_transitions outcome + let (mut identities, mut state_transitions): (Vec, Vec) = identity_state_transitions.into_iter().unzip(); - if block_info.height == 1 { - // add contracts on block 1 + // Append the new identities to current_identities + current_identities.append(&mut identities); + + // Do we also need to add identities to the identity_nonce_counter? + + // Do certain things on the first block + if block_info.height == config.start_block_height { + // Add initial contracts for contracts_with_updates on first block of strategy let mut contract_state_transitions = self.contract_state_transitions(current_identities, signer, rng, platform_version); state_transitions.append(&mut contract_state_transitions); } else { - // Don't do any state transitions on block 1 + // Do operations let (mut document_state_transitions, mut add_to_finalize_block_operations) = self .state_transitions_for_block( - drive, + document_query_callback, + identity_fetch_callback, + create_asset_lock, block_info, current_identities, + known_contracts, signer, identity_nonce_counter, contract_nonce_counter, @@ -1164,11 +1299,11 @@ impl Strategy { finalize_block_operations.append(&mut add_to_finalize_block_operations); state_transitions.append(&mut document_state_transitions); - // There can also be contract updates - + // Do contract updates for contracts_with_updates let mut contract_update_state_transitions = self.contract_update_state_transitions( current_identities, block_info.height, + config.start_block_height, signer, contract_nonce_counter, platform_version, @@ -1176,8 +1311,6 @@ impl Strategy { state_transitions.append(&mut contract_update_state_transitions); } - current_identities.append(&mut new_identities); - (state_transitions, finalize_block_operations) } } diff --git a/packages/strategy-tests/src/operations.rs b/packages/strategy-tests/src/operations.rs index c11341fad6..40cb9a8ae9 100644 --- a/packages/strategy-tests/src/operations.rs +++ b/packages/strategy-tests/src/operations.rs @@ -204,12 +204,138 @@ pub enum IdentityUpdateOp { pub type DocumentTypeNewFieldsOptionalCountRange = Range; pub type DocumentTypeCount = Range; +#[derive(Clone, Debug, PartialEq)] +pub struct DataContractUpdateOp { + pub action: DataContractUpdateAction, + pub contract: DataContract, + pub document_type: Option, +} + #[derive(Clone, Debug, PartialEq, Encode, Decode)] -pub enum DataContractUpdateOp { +pub struct DataContractUpdateOpInSerializationFormat { + action: DataContractUpdateAction, + contract: DataContractInSerializationFormat, + document_type: Option, +} + +#[derive(Clone, Debug, PartialEq, Encode, Decode)] +pub enum DataContractUpdateAction { DataContractNewDocumentTypes(RandomDocumentTypeParameters), // How many fields should it have DataContractNewOptionalFields(DocumentTypeNewFieldsOptionalCountRange, DocumentTypeCount), // How many new fields on how many document types } +impl PlatformSerializableWithPlatformVersion for DataContractUpdateOp { + type Error = ProtocolError; + + fn serialize_to_bytes_with_platform_version( + &self, + platform_version: &PlatformVersion, + ) -> Result, ProtocolError> { + self.clone() + .serialize_consume_to_bytes_with_platform_version(platform_version) + } + + fn serialize_consume_to_bytes_with_platform_version( + self, + platform_version: &PlatformVersion, + ) -> Result, ProtocolError> { + let DataContractUpdateOp { + action, + contract, + document_type, + } = self; + + // Serialize contract and optionally document type + let contract_in_serialization_format: DataContractInSerializationFormat = + contract.try_into_platform_versioned(platform_version)?; + + // Convert DocumentType to its serializable schema representation + let document_type_in_serialization_format = document_type.map(|dt| { + // Assuming `schema_owned` or a similar method returns a serializable representation + dt.schema_owned() + }); + + let update_op_in_serialization_format = DataContractUpdateOpInSerializationFormat { + action, + contract: contract_in_serialization_format, + document_type: document_type_in_serialization_format, + }; + + let config = bincode::config::standard() + .with_big_endian() + .with_no_limit(); + bincode::encode_to_vec(update_op_in_serialization_format, config).map_err(|e| { + PlatformSerializationError(format!("Unable to serialize DataContractUpdateOp: {}", e)) + }) + } +} + +impl PlatformDeserializableWithPotentialValidationFromVersionedStructure for DataContractUpdateOp { + fn versioned_deserialize( + data: &[u8], + validate: bool, + platform_version: &PlatformVersion, + ) -> Result + where + Self: Sized, + { + let config = bincode::config::standard() + .with_big_endian() + .with_no_limit(); + let deserialized: DataContractUpdateOpInSerializationFormat = + bincode::borrow_decode_from_slice(data, config) + .map_err(|e| { + PlatformDeserializationError(format!( + "Unable to deserialize DataContractUpdateOp: {}", + e + )) + })? + .0; + + let contract = DataContract::try_from_platform_versioned( + deserialized.contract, + validate, + platform_version, + )?; + + let action = deserialized.action; + + let document_type = deserialized.document_type.and_then(|value| { + match value { + Value::Map(map) => { + map.into_iter() + .map(|(name, schema_json)| { + let name_str = name.to_str().expect( + "Couldn't convert document type name to str in deserialization", + ); + let schema = Value::try_from(schema_json).unwrap(); + let owner_id = contract.owner_id(); // Assuming you have a method to get the owner_id from the contract + DocumentType::try_from_schema( + owner_id, + name_str, + schema, + None, + true, + true, + validate, + platform_version, + ) + .expect("Failed to reconstruct DocumentType from schema") + }) + .next() // Assumes only one document type is being deserialized + } + _ => None, + } + }); + + Ok(DataContractUpdateOp { + action, + contract, + document_type, + }) + } +} + #[derive(Clone, Debug, PartialEq)] pub enum OperationType { Document(DocumentOp), @@ -231,7 +357,7 @@ enum OperationTypeInSerializationFormat { RandomDocumentTypeParameters, DocumentTypeCount, ), - OperationTypeInSerializationFormatContractUpdate(DataContractUpdateOp), + OperationTypeInSerializationFormatContractUpdate(Vec), OperationTypeInSerializationFormatIdentityTransfer, } @@ -269,7 +395,9 @@ impl PlatformSerializableWithPlatformVersion for OperationType { OperationTypeInSerializationFormat::OperationTypeInSerializationFormatContractCreate(p,c) } OperationType::ContractUpdate(update_op) => { - OperationTypeInSerializationFormat::OperationTypeInSerializationFormatContractUpdate(update_op) + // let's just serialize it to make things easier + let contract_op_in_serialization_format = update_op.serialize_consume_to_bytes_with_platform_version(platform_version)?; + OperationTypeInSerializationFormat::OperationTypeInSerializationFormatContractUpdate(contract_op_in_serialization_format) } OperationType::IdentityTransfer => { OperationTypeInSerializationFormat::OperationTypeInSerializationFormatIdentityTransfer @@ -319,7 +447,8 @@ impl PlatformDeserializableWithPotentialValidationFromVersionedStructure for Ope OperationTypeInSerializationFormat::OperationTypeInSerializationFormatContractCreate(p, c) => { OperationType::ContractCreate(p, c) } - OperationTypeInSerializationFormat::OperationTypeInSerializationFormatContractUpdate(update_op) => { + OperationTypeInSerializationFormat::OperationTypeInSerializationFormatContractUpdate(serialized_op) => { + let update_op = DataContractUpdateOp::versioned_deserialize(serialized_op.as_slice(), validate, platform_version)?; OperationType::ContractUpdate(update_op) } OperationTypeInSerializationFormat::OperationTypeInSerializationFormatIdentityTransfer => { diff --git a/packages/strategy-tests/src/transitions.rs b/packages/strategy-tests/src/transitions.rs index b9cfb3bddb..9f9b62aeb4 100644 --- a/packages/strategy-tests/src/transitions.rs +++ b/packages/strategy-tests/src/transitions.rs @@ -20,6 +20,7 @@ use dpp::prelude::AssetLockProof; use dpp::state_transition::identity_create_transition::methods::IdentityCreateTransitionMethodsV0; use dpp::state_transition::identity_create_transition::IdentityCreateTransition; use dpp::state_transition::identity_credit_transfer_transition::v0::IdentityCreditTransferTransitionV0; +use dpp::ProtocolError; use dpp::state_transition::identity_credit_withdrawal_transition::v0::{ IdentityCreditWithdrawalTransitionV0, MIN_CORE_FEE_PER_BYTE, @@ -40,6 +41,8 @@ use dpp::dashcore::transaction::special_transaction::asset_lock::AssetLockPayloa use dpp::dashcore::transaction::special_transaction::TransactionPayload; use std::collections::{BTreeMap, HashSet}; use std::str::FromStr; +use tracing::error; +use tracing::info; /// Constructs an `AssetLockProof` representing an instant asset lock proof. /// @@ -221,26 +224,24 @@ pub fn instant_asset_lock_is_lock_fixture(tx_id: Txid) -> InstantLock { /// - If there's an error in converting the generated public key to its private counterpart. /// - If there's an error during the creation of the identity top-up transition. pub fn create_identity_top_up_transition( - rng: &mut StdRng, identity: &Identity, + create_asset_lock: &mut impl FnMut(u64) -> Option<(AssetLockProof, PrivateKey)>, platform_version: &PlatformVersion, -) -> StateTransition { - let (_, pk) = ECDSA_SECP256K1 - .random_public_and_private_key_data(rng, platform_version) - .unwrap(); - let sk: [u8; 32] = pk.try_into().unwrap(); - let secret_key = SecretKey::from_str(hex::encode(sk).as_str()).unwrap(); - let asset_lock_proof = - instant_asset_lock_proof_fixture(PrivateKey::new(secret_key, Network::Dash)); +) -> Result { + let (asset_lock_proof, private_key) = create_asset_lock(200000).ok_or( + ProtocolError::Generic("Failed to create asset lock proof".to_string()), + )?; + + let pk_bytes = private_key.to_bytes(); IdentityTopUpTransition::try_from_identity( identity, asset_lock_proof, - secret_key.as_ref(), + pk_bytes.as_ref(), platform_version, None, ) - .expect("expected to create top up transition") + .map_err(|e| ProtocolError::Generic(format!("Error creating top up transition: {:?}", e))) } /// Creates a state transition for updating an identity by adding a specified number of new public authentication keys. @@ -289,6 +290,7 @@ pub fn create_identity_update_transition_add_keys( platform_version: &PlatformVersion, ) -> (StateTransition, (Identifier, Vec)) { identity.bump_revision(); + let keys = IdentityPublicKey::random_authentication_keys_with_private_keys_with_rng( identity.public_keys().len() as KeyID, count as u32, @@ -319,7 +321,7 @@ pub fn create_identity_update_transition_add_keys( platform_version, None, ) - .expect("expected to create top up transition"); + .expect("expected to create an AddKeys transition"); (state_transition, (identity.id(), add_public_keys)) } @@ -366,8 +368,8 @@ pub fn create_identity_update_transition_add_keys( pub fn create_identity_update_transition_disable_keys( identity: &mut Identity, count: u16, - block_time: u64, identity_nonce_counter: &mut BTreeMap, + block_time: u64, signer: &mut SimpleSigner, rng: &mut StdRng, platform_version: &PlatformVersion, @@ -427,7 +429,7 @@ pub fn create_identity_update_transition_disable_keys( platform_version, None, ) - .expect("expected to create top up transition"); + .expect("expected to create a DisableKeys transition"); Some(state_transition) } @@ -471,7 +473,7 @@ pub fn create_identity_withdrawal_transition( *nonce += 1; let mut withdrawal: StateTransition = IdentityCreditWithdrawalTransitionV0 { identity_id: identity.id(), - amount: 100000000, // 0.001 Dash + amount: 1000000, // 1 duff core_fee_per_byte: MIN_CORE_FEE_PER_BYTE, pooling: Pooling::Never, output_script: CoreScript::random_p2sh(rng), @@ -533,7 +535,7 @@ pub fn create_identity_withdrawal_transition( /// - If the sender's identity does not have a suitable authentication key available for signing. /// - If there's an error during the signing process. pub fn create_identity_credit_transfer_transition( - identity: &Identity, + identity: &mut Identity, recipient: &Identity, identity_nonce_counter: &mut BTreeMap, signer: &mut SimpleSigner, @@ -612,17 +614,78 @@ pub fn create_identities_state_transitions( key_count: KeyID, signer: &mut SimpleSigner, rng: &mut StdRng, + create_asset_lock: &mut impl FnMut(u64) -> Option<(AssetLockProof, PrivateKey)>, platform_version: &PlatformVersion, -) -> Vec<(Identity, StateTransition)> { - let (identities, keys) = Identity::random_identities_with_private_keys_with_rng::>( +) -> Result, ProtocolError> { + let (identities, mut keys) = Identity::random_identities_with_private_keys_with_rng::>( count, key_count, rng, platform_version, ) - .expect("expected to create identities"); + .expect("Expected to create identities and keys"); + + let starting_id_num = signer + .private_keys + .keys() + .max() + .map_or(0, |max_key| max_key.id() + 1); + + // Update keys with new KeyIDs and add them to signer + let mut current_id_num = starting_id_num; + for (key, _) in &mut keys { + if let IdentityPublicKey::V0(ref mut id_pub_key_v0) = key { + id_pub_key_v0.set_id(current_id_num); + current_id_num += 1; // Increment for each key + } + } signer.add_keys(keys); - create_state_transitions_for_identities(identities, signer, rng, platform_version) + + // Generate state transitions for each identity + identities + .into_iter() + .enumerate() + .map(|(index, mut identity)| { + // Calculate the starting KeyID for this identity + let identity_starting_id = starting_id_num + (index as u32) * key_count; + + // Update the identity with the new KeyIDs + let public_keys_map = identity.public_keys_mut(); + public_keys_map + .values_mut() + .enumerate() + .for_each(|(key_index, public_key)| { + if let IdentityPublicKey::V0(ref mut id_pub_key_v0) = public_key { + let new_id = identity_starting_id + key_index as u32; + id_pub_key_v0.set_id(new_id); + } + }); + + // Attempt to create an asset lock + match create_asset_lock(200000) { + Some((proof, private_key)) => { + let pk = private_key.to_bytes(); + match IdentityCreateTransition::try_from_identity_with_signer( + &identity, + proof, + &pk, + signer, + &NativeBlsModule, + platform_version, + ) { + Ok(identity_create_transition) => { + identity.set_id(identity_create_transition.owner_id()); + Ok((identity, identity_create_transition)) + } + Err(e) => Err(e), + } + } + None => Err(ProtocolError::Generic( + "Failed to create asset lock proof".to_string(), + )), + } + }) + .collect::, ProtocolError>>() } /// Generates state transitions for the creation of new identities. @@ -679,7 +742,7 @@ pub fn create_state_transitions_for_identities( instant_asset_lock_proof_fixture(PrivateKey::new(secret_key, Network::Dash)); let identity_create_transition = IdentityCreateTransition::try_from_identity_with_signer( - &identity, + &identity.clone(), asset_lock_proof, pk.as_slice(), signer, diff --git a/rust-toolchain.toml b/rust-toolchain.toml index efbf84649c..0b9461857b 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,5 +1,5 @@ [toolchain] # Rust version the same as in /README.md -channel = "1.73" +channel = "stable" targets = ["wasm32-unknown-unknown"] From 73f20dca8d169e089b46f8baa7b1fb836555f94a Mon Sep 17 00:00:00 2001 From: Igor Markin Date: Thu, 22 Feb 2024 19:56:55 +0000 Subject: [PATCH 044/191] fix(test-suite): masternode identities (#1709) --- .../test/functional/platform/Identity.spec.js | 8 +++----- packages/wasm-dpp/lib/utils/hash.js | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/packages/platform-test-suite/test/functional/platform/Identity.spec.js b/packages/platform-test-suite/test/functional/platform/Identity.spec.js index c7459a9ea2..e2c484b0e1 100644 --- a/packages/platform-test-suite/test/functional/platform/Identity.spec.js +++ b/packages/platform-test-suite/test/functional/platform/Identity.spec.js @@ -2,7 +2,7 @@ const Dash = require('dash'); const { createFakeInstantLock } = require('dash/build/utils/createFakeIntantLock'); -const { hash } = require('@dashevo/wasm-dpp/lib/utils/hash'); +const { hash, sha256 } = require('@dashevo/wasm-dpp/lib/utils/hash'); const getDataContractFixture = require('../../../lib/test/fixtures/getDataContractFixture'); const createClientWithFundedWallet = require('../../../lib/test/createClientWithFundedWallet'); const getDAPISeeds = require('../../../lib/test/getDAPISeeds'); @@ -658,9 +658,7 @@ describe('Platform', () => { }); }); - // TODO(rs-drive-abci): fix - // fetching by opreatorIdentityId returns empty bytes and serialization fails - describe.skip('Masternodes', () => { + describe('Masternodes', () => { let dapiClient; const network = process.env.NETWORK; @@ -707,7 +705,7 @@ describe('Platform', () => { if (transaction.extraPayload.operatorReward > 0) { const operatorPubKey = Buffer.from(masternodeEntry.pubKeyOperator, 'hex'); - const operatorIdentityHash = hash( + const operatorIdentityHash = sha256( Buffer.concat([ Buffer.from(masternodeEntry.proRegTxHash, 'hex'), operatorPubKey, diff --git a/packages/wasm-dpp/lib/utils/hash.js b/packages/wasm-dpp/lib/utils/hash.js index fb58965876..718dfa77a1 100644 --- a/packages/wasm-dpp/lib/utils/hash.js +++ b/packages/wasm-dpp/lib/utils/hash.js @@ -15,4 +15,4 @@ function hash(buffer) { return sha256(sha256(buffer)); } -module.exports = { hash }; +module.exports = { hash, sha256 }; From dc03275a397e8037636c0b574550afc8091e63a2 Mon Sep 17 00:00:00 2001 From: Igor Markin Date: Fri, 23 Feb 2024 15:05:00 +0000 Subject: [PATCH 045/191] fix(sdk): nonce manager caching bug (#1711) Co-authored-by: QuantumExplorer --- .../Platform/NonceManager/NonceManager.ts | 42 +++++++++++-------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/packages/js-dash-sdk/src/SDK/Client/Platform/NonceManager/NonceManager.ts b/packages/js-dash-sdk/src/SDK/Client/Platform/NonceManager/NonceManager.ts index 4bf80ef465..e4065c4ceb 100644 --- a/packages/js-dash-sdk/src/SDK/Client/Platform/NonceManager/NonceManager.ts +++ b/packages/js-dash-sdk/src/SDK/Client/Platform/NonceManager/NonceManager.ts @@ -12,9 +12,9 @@ export const NONCE_FETCH_INTERVAL = 1200 * 1000; class NonceManager { public dapiClient: DAPIClient; - private identityNonce: Map; + private identityNonce: Map; - private identityContractNonce: Map>; + private identityContractNonce: Map>; constructor(dapiClient: DAPIClient) { this.dapiClient = dapiClient; @@ -24,10 +24,11 @@ class NonceManager { } public setIdentityNonce(identityId: Identifier, nonce: number) { - const nonceState = this.identityNonce.get(identityId); + const identityIdStr = identityId.toString(); + const nonceState = this.identityNonce.get(identityIdStr); if (!nonceState) { - this.identityNonce.set(identityId, { + this.identityNonce.set(identityIdStr, { value: nonce, lastFetchedAt: Date.now(), }); @@ -37,7 +38,8 @@ class NonceManager { } public async getIdentityNonce(identityId: Identifier): Promise { - let nonceState = this.identityNonce.get(identityId); + const identityIdStr = identityId.toString(); + let nonceState = this.identityNonce.get(identityIdStr); if (typeof nonceState === 'undefined') { const { identityNonce } = await this.dapiClient.platform.getIdentityNonce(identityId); @@ -51,7 +53,7 @@ class NonceManager { lastFetchedAt: Date.now(), }; - this.identityNonce.set(identityId, nonceState); + this.identityNonce.set(identityIdStr, nonceState); } else { const now = Date.now(); if (now - nonceState.lastFetchedAt > NONCE_FETCH_INTERVAL) { @@ -70,17 +72,20 @@ class NonceManager { } public setIdentityContractNonce(identityId: Identifier, contractId: Identifier, nonce: number) { - let contractNonce = this.identityContractNonce.get(identityId); + const identityIdStr = identityId.toString(); + const contractIdStr = contractId.toString(); + + let contractNonce = this.identityContractNonce.get(identityIdStr); if (!contractNonce) { contractNonce = new Map(); - this.identityContractNonce.set(identityId, contractNonce); + this.identityContractNonce.set(identityIdStr, contractNonce); } - const nonceState = contractNonce.get(contractId); + const nonceState = contractNonce.get(contractIdStr); if (!nonceState) { - contractNonce.set(contractId, { + contractNonce.set(contractIdStr, { value: nonce, lastFetchedAt: Date.now(), }); @@ -93,14 +98,17 @@ class NonceManager { identityId: Identifier, contractId: Identifier, ): Promise { - let contractNonce = this.identityContractNonce.get(identityId); + const identityIdStr = identityId.toString(); + const contractIdStr = contractId.toString(); + + let contractNonce = this.identityContractNonce.get(identityIdStr); if (!contractNonce) { contractNonce = new Map(); - this.identityContractNonce.set(identityId, contractNonce); + this.identityContractNonce.set(identityIdStr, contractNonce); } - let nonceState = contractNonce.get(contractId); + let nonceState = contractNonce.get(contractIdStr); if (typeof nonceState === 'undefined') { const { identityContractNonce } = await this.dapiClient.platform @@ -115,18 +123,18 @@ class NonceManager { lastFetchedAt: Date.now(), }; - contractNonce.set(identityId, nonceState); + contractNonce.set(contractIdStr, nonceState); } else { const now = Date.now(); if (now - nonceState.lastFetchedAt > NONCE_FETCH_INTERVAL) { - const { identityNonceContract } = await this.dapiClient.platform + const { identityContractNonce } = await this.dapiClient.platform .getIdentityContractNonce(identityId, contractId); - if (typeof identityNonceContract === 'undefined') { + if (typeof identityContractNonce === 'undefined') { throw new Error('Identity nonce is not found'); } - nonceState.value = identityNonceContract; + nonceState.value = identityContractNonce; nonceState.lastFetchedAt = now; } } From fe3b525b7e49f5ec230f58c37d3c1e20e9ce65a5 Mon Sep 17 00:00:00 2001 From: Igor Markin Date: Tue, 27 Feb 2024 13:22:39 +0000 Subject: [PATCH 046/191] chore: fix npm audit warning (#1723) --- .pnp.cjs | 12 ++++++------ ...socks-npm-2.8.1-3b253d7256-a3cc38e071.zip} | Bin 44607 -> 44617 bytes package.json | 2 +- yarn.lock | 8 ++++---- 4 files changed, 11 insertions(+), 11 deletions(-) rename .yarn/cache/{socks-npm-2.8.0-9be534eccc-ed0224ce2c.zip => socks-npm-2.8.1-3b253d7256-a3cc38e071.zip} (93%) diff --git a/.pnp.cjs b/.pnp.cjs index 096caa9ee2..707b2acdeb 100755 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -17214,10 +17214,10 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["socks", [\ - ["npm:2.8.0", {\ - "packageLocation": "./.yarn/cache/socks-npm-2.8.0-9be534eccc-ed0224ce2c.zip/node_modules/socks/",\ + ["npm:2.8.1", {\ + "packageLocation": "./.yarn/cache/socks-npm-2.8.1-3b253d7256-a3cc38e071.zip/node_modules/socks/",\ "packageDependencies": [\ - ["socks", "npm:2.8.0"],\ + ["socks", "npm:2.8.1"],\ ["ip-address", "npm:9.0.5"],\ ["smart-buffer", "npm:4.2.0"]\ ],\ @@ -17231,7 +17231,7 @@ const RAW_RUNTIME_STATE = ["socks-proxy-agent", "npm:6.1.1"],\ ["agent-base", "npm:6.0.2"],\ ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ - ["socks", "npm:2.8.0"]\ + ["socks", "npm:2.8.1"]\ ],\ "linkType": "HARD"\ }],\ @@ -17241,7 +17241,7 @@ const RAW_RUNTIME_STATE = ["socks-proxy-agent", "npm:7.0.0"],\ ["agent-base", "npm:6.0.2"],\ ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ - ["socks", "npm:2.8.0"]\ + ["socks", "npm:2.8.1"]\ ],\ "linkType": "HARD"\ }],\ @@ -17251,7 +17251,7 @@ const RAW_RUNTIME_STATE = ["socks-proxy-agent", "npm:8.0.2"],\ ["agent-base", "npm:7.1.0"],\ ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ - ["socks", "npm:2.8.0"]\ + ["socks", "npm:2.8.1"]\ ],\ "linkType": "HARD"\ }]\ diff --git a/.yarn/cache/socks-npm-2.8.0-9be534eccc-ed0224ce2c.zip b/.yarn/cache/socks-npm-2.8.1-3b253d7256-a3cc38e071.zip similarity index 93% rename from .yarn/cache/socks-npm-2.8.0-9be534eccc-ed0224ce2c.zip rename to .yarn/cache/socks-npm-2.8.1-3b253d7256-a3cc38e071.zip index 68bf01056804297b5a7c7db299214f87e5ca5349..51db3dcc4989261c6ec9e1a213cf11aafc935dbd 100644 GIT binary patch delta 1151 zcmdmghw0=UrVYjhyxGrtwj5$&V8~-*V3402C?qyH%s{-}rlBQ5-;;w?Wz{7ittiHz zmA`^ar#>z<(~GT4`P;rX zduEy)H;Y(4Ls}}gcopwtC6{j(4PPxi(IvHL=BBmJFBR@<(L8!BGwR^ox9#W47i_7C zV0zfY#eGaub!+M(zxsPWAJ*ADs6DWV^=v!GI+lm$#2db!nce*QPQ|1%#?32*RYZ=? zxvA*mTjBeg7~#cyF>OZ;e7Y)23yF9ZHmS>16p6-=$^Ut)SPLlXWyLh z6`1Jz({t8M_rCuZI;VZw*K=1(I4D?^cXN=w?YE23K?i4?Oz&{K_r&CXfBhW|1=|mr z(`M}O`1jFtrdL|e;$_}t{?oZvuAcCr+Uv$yJHPwqwd*TFe@ZkzDEM5w)(-!sPjoU}TPtu@``V40Gu0p0I;xatT^8sN3ESNHx#fC` zV9uVzi-He(0uqy6zFxh)vTjG#3)ROa_4ix#7k}=4Ets`x&(qJ`t5(EIINsRRRi1ce zS&qughYiy1y6%zQug^st|I2*k^}>6zee3r)u$s={j9#|isW5zbuAKbBy7k%TxdmFc zF8tMc<4J#C@|F14AC331-+i)j>zcEs4z*imtusC9)p~r+mhbyxzZ_AwYR_n3yL(}k z`0ZmM^^L2&f`#>;{5Vql;@gUYx5R|a=Wes%v+dt%>aq3Oq{>UDd@YPO3%t9|KEpt) zn9r40*80ZH#s^pY9BLH9m{xRN$)M%!Rf-Cy_Ug+;Z_YQ_bBPwyDeK7x#iS=sSYpPMZv&JuoBR(b zT51OrHJBW=RFA3H7p#809{c3YK<)#-$s7HpCjVWk#V9uU;xd)VKFhQiLxC*)$;*JO z`9M|gN|Yy`UuneTUIccO>?$M1pOXVt zg)?cE1Klq=IiQ?#^6^z#Oa^^m?u0&$$pWjjm@;8p!O71S@J%jQEyc7FB6OiocJe-; z3Y#fV4g8b&)|fHvm&6?;0B>iRoajz*lE1B=YzZf005H=JOBUy delta 1225 zcmYk62{7DO0LFKpYgd-6ySq~7&Nfz9$!3ZeXBwe9j#V^4q_v{L3f7XCrH+s^?&P_W z6cxwD8CMa6AX!J9D_s@hm_?cpYDu()O#fA-@6EjVe)E0boA+kkyuK;WF$HR9Msm)K z&cJ4XLYYdVP@0gTs0veya4~tVlaA`g@zJmKZ6i_G+G#J06scTr$Grg*ySy(6p!6)U zyxP3SbF7m7+)R72#EQSB=d_eZ%L()2e?Nu(UC(1}T5p3jxWZc1%56}fzl{%fELj+B zoaZNbNDXV7l6Uy^v)P2g3&~L%F4f-*m95`U3*oNM{bJz%m1SkDeN1PT#L~~zsY>On zk%c+yQzH^TmCJdgVZA71bJf^QFo-_YWapwq%jG_|VNeo1Z{MJwIYTNf9Aq`yQp^#}{Ks>9E}P#JGXd2-H#_wI6jPM5)UN=-|@<#@!Jy`Uq?@9mah`m6r? zcHQAYi4}vgOwCb&a!kryqthH4Xe_p5L;S5cr`l%&XT|A{`Z5m%nm1jjGiz^o6E>9;Ui}8rWbA^TmU?c3mAQQ9oZ0^L5UQVB4RumTn{FsI@x| zQLD+t6hStX+Pv6olyu8MWwk3e$op58_30^2Y-S%rAn3AR;{5j6bu^)Ef-jQlZ_cuL z-1e8R$5!3M;u{5me9MP6{DZREskYh4Sp^evcdCY^XmXW2oTn62tw6Z*o|88yq!=wG z;Do*RoFrp3}PqkcD5FM#DVOconxP9HDc-pLKfHNJjK^O ziW28WKG!vFQx=9wXzR?(3~!Dx#g#d4QcPD;pIX08o)^|A$GLk=KRy~qI@{fw$?c Date: Tue, 27 Feb 2024 13:24:15 +0000 Subject: [PATCH 047/191] fix(drive-abci): reject reward shares operations (#1722) --- .../test/e2e/masternodeRewardShares.spec.js | 412 --------- .../data_triggers/bindings/list/v0/mod.rs | 13 +- .../data_triggers/triggers/mod.rs | 1 - .../triggers/reward_share/mod.rs | 35 - .../triggers/reward_share/v0/mod.rs | 844 ------------------ 5 files changed, 9 insertions(+), 1296 deletions(-) delete mode 100644 packages/platform-test-suite/test/e2e/masternodeRewardShares.spec.js delete mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/reward_share/mod.rs delete mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/reward_share/v0/mod.rs diff --git a/packages/platform-test-suite/test/e2e/masternodeRewardShares.spec.js b/packages/platform-test-suite/test/e2e/masternodeRewardShares.spec.js deleted file mode 100644 index 24cb356d49..0000000000 --- a/packages/platform-test-suite/test/e2e/masternodeRewardShares.spec.js +++ /dev/null @@ -1,412 +0,0 @@ -const Dash = require('dash'); - -const { - contractId: masternodeRewardSharesContractId, -} = require('@dashevo/masternode-reward-shares-contract/lib/systemIds'); - -const generateRandomIdentifier = require('../../lib/test/utils/generateRandomIdentifier'); - -const createClientWithFundedWallet = require('../../lib/test/createClientWithFundedWallet'); -const waitForSTPropagated = require('../../lib/waitForSTPropagated'); - -const { - Core: { PrivateKey }, - PlatformProtocol: { IdentityPublicKeyWithWitness, IdentityPublicKey }, -} = Dash; - -describe('Masternode Reward Shares', () => { - let failed = false; - let client; - - before(async () => { - client = await createClientWithFundedWallet( - 10000000, - ); - - await client.platform.initialize(); - - const masternodeRewardSharesContract = await client.platform.contracts.get( - masternodeRewardSharesContractId, - ); - - client.getApps().set('masternodeRewardShares', { - contractId: masternodeRewardSharesContractId, - contract: masternodeRewardSharesContract, - }); - }); - - // Skip test if any prior test in this describe failed - beforeEach(function beforeEach() { - if (failed) { - this.skip(); - } - }); - - afterEach(function afterEach() { - failed = this.currentTest.state === 'failed'; - }); - - after(async () => { - if (client) { - await client.disconnect(); - } - }); - - describe('Data Contract', () => { - it('should exists', async () => { - const createdDataContract = await client.platform.contracts.get( - masternodeRewardSharesContractId, - ); - - expect(createdDataContract).to.exist(); - - expect(createdDataContract.getId().toString()).to.equal( - masternodeRewardSharesContractId, - ); - }); - }); - - // TODO(rs-drive-abci): test should be revisited and refined - // because rs-drive-abci does not allow updating masternode shares owner keys anymore - describe.skip('Masternode owner', () => { - let anotherIdentity; - let rewardShare; - let anotherRewardShare; - let masternodeOwnerMasterPrivateKey; - let masternodeOwnerIdentity; - let derivedPrivateKey; - let signaturePublicKeyId; - - before(async function before() { - if (!process.env.MASTERNODE_OWNER_PRO_REG_TX_HASH - || !process.env.MASTERNODE_OWNER_MASTER_PRIVATE_KEY) { - this.skip('masternode owner credentials are not set'); - } - - const masternodeOwnerIdentifier = Buffer.from(process.env.MASTERNODE_OWNER_PRO_REG_TX_HASH, 'hex'); - - masternodeOwnerIdentity = await client.platform.identities.get(masternodeOwnerIdentifier); - - masternodeOwnerMasterPrivateKey = process.env.MASTERNODE_OWNER_MASTER_PRIVATE_KEY; - - // Masternode identity should exist - expect(masternodeOwnerIdentity).to.exist(); - - await client.platform.identities.topUp(masternodeOwnerIdentity.getId(), 2500000); - - // Additional wait time to mitigate testnet latency - await waitForSTPropagated(); - - // Since we cannot create "High" level key for masternode Identities automatically, - // (this key is used to sign state transitions, other than "update") - // we add this key here - - signaturePublicKeyId = masternodeOwnerIdentity.getPublicKeyMaxId() + 1; - - // Get Masternode Rewards Share Contract owner account - const account = await client.platform.client.getWalletAccount(); - - ({ privateKey: derivedPrivateKey } = account - .identities - .getIdentityHDKeyByIndex( - 1000, - signaturePublicKeyId, - )); - - const identityPublicKey = derivedPrivateKey.toPublicKey().toBuffer(); - - const newPublicKey = new IdentityPublicKeyWithWitness( - { - id: signaturePublicKeyId, - type: IdentityPublicKey.TYPES.ECDSA_SECP256K1, - purpose: IdentityPublicKey.PURPOSES.AUTHENTICATION, - securityLevel: IdentityPublicKey.SECURITY_LEVELS.HIGH, - data: identityPublicKey, - readOnly: false, - signature: Buffer.alloc(0), - }, - ); - - const update = { - add: [newPublicKey], - }; - - const stateTransition = client.platform.dpp.identity.createIdentityUpdateTransition( - masternodeOwnerIdentity, - update, - ); - - const signerKey = masternodeOwnerIdentity.getPublicKeys()[0]; - - const updatedKeys = []; - const promises = stateTransition.getPublicKeysToAdd().map(async (publicKey) => { - stateTransition.setSignaturePublicKeyId(signerKey.getId()); - - await stateTransition.signByPrivateKey(derivedPrivateKey.toBuffer(), publicKey.getType()); - - publicKey.setSignature(stateTransition.getSignature()); - updatedKeys.push(publicKey); - - stateTransition.setSignature(undefined); - stateTransition.setSignaturePublicKeyId(undefined); - }); - - await Promise.all(promises); - stateTransition.setPublicKeysToAdd(updatedKeys); - - stateTransition.setSignaturePublicKeyId(0); - await stateTransition.signByPrivateKey( - new PrivateKey(masternodeOwnerMasterPrivateKey).toBuffer(), - IdentityPublicKey.TYPES.ECDSA_SECP256K1, - ); - - await client.platform.broadcastStateTransition( - stateTransition, - ); - - // Additional wait time to mitigate testnet latency - await waitForSTPropagated(); - - // Re-fetch identity after it got updated - masternodeOwnerIdentity = await client.platform.identities.get(masternodeOwnerIdentifier); - }); - - it('should be able to create reward shares with existing identity', async () => { - anotherIdentity = await client.platform.identities.register(100000); - - // Additional wait time to mitigate testnet latency - await waitForSTPropagated(); - - rewardShare = await client.platform.documents.create( - 'masternodeRewardShares.rewardShare', - masternodeOwnerIdentity, - { - payToId: anotherIdentity.getId(), - percentage: 1, - }, - ); - - const stateTransition = client.platform.dpp.document.createStateTransition({ - create: [rewardShare], - }); - - await stateTransition.sign( - masternodeOwnerIdentity.getPublicKeyById(signaturePublicKeyId), - derivedPrivateKey.toBuffer(), - ); - - await client.platform.broadcastStateTransition( - stateTransition, - ); - }); - - it('should not be able to create reward shares with non-existing identity', async () => { - const payToId = await generateRandomIdentifier(); - - const invalidRewardShare = await client.platform.documents.create( - 'masternodeRewardShares.rewardShare', - masternodeOwnerIdentity, - { - payToId, - percentage: 1, - }, - ); - - const stateTransition = client.platform.dpp.document.createStateTransition({ - create: [invalidRewardShare], - }); - - await stateTransition.sign( - masternodeOwnerIdentity.getPublicKeyById(signaturePublicKeyId), - derivedPrivateKey.toBuffer(), - ); - - try { - await client.platform.broadcastStateTransition( - stateTransition, - ); - - expect.fail('should throw broadcast error'); - } catch (e) { - expect(e.message).to.be.equal(`Identity '${payToId}' doesn't exist`); - expect(e.code).to.equal(4001); - } - }); - - it('should be able to update reward shares with existing identity', async () => { - const percentage = 2; - rewardShare.set('percentage', percentage); - - const stateTransition = client.platform.dpp.document.createStateTransition({ - replace: [rewardShare], - }); - - await stateTransition.sign( - masternodeOwnerIdentity.getPublicKeyById(signaturePublicKeyId), - derivedPrivateKey.toBuffer(), - ); - - await client.platform.broadcastStateTransition( - stateTransition, - ); - - // Additional wait time to mitigate testnet latency - await waitForSTPropagated(); - - const [updatedRewardShare] = await client.platform.documents.get('masternodeRewardShares.rewardShare', { - where: [['$id', '==', rewardShare.getId()]], - }); - - expect(updatedRewardShare).to.exists(); - - // TODO: check this case. - // rewardShare.set() can not accept bigint, however rewardShare.get() - // returns bigint. - expect(updatedRewardShare.get('percentage')).equals(BigInt(percentage)); - }); - - it('should not be able to update reward shares with non-existing identity', async () => { - const payToId = await generateRandomIdentifier(); - - [rewardShare] = await client.platform.documents.get( - 'masternodeRewardShares.rewardShare', - { where: [['$id', '==', rewardShare.getId()]] }, - ); - - rewardShare.set('payToId', payToId); - - const stateTransition = client.platform.dpp.document.createStateTransition({ - replace: [rewardShare], - }); - - await stateTransition.sign( - masternodeOwnerIdentity.getPublicKeyById(signaturePublicKeyId), - derivedPrivateKey.toBuffer(), - ); - - try { - await client.platform.broadcastStateTransition( - stateTransition, - ); - - expect.fail('should throw broadcast error'); - } catch (e) { - expect(e.message).to.be.equal(`Identity '${payToId}' doesn't exist`); - expect(e.code).to.equal(4001); - } - }); - - it('should not be able to share more than 100% of rewards', async () => { - anotherIdentity = await client.platform.identities.register(100000); - - // Additional wait time to mitigate testnet latency - await waitForSTPropagated(); - - anotherRewardShare = await client.platform.documents.create( - 'masternodeRewardShares.rewardShare', - masternodeOwnerIdentity, - { - payToId: anotherIdentity.getId(), - percentage: 9999, // it will be 10001 in summary - }, - ); - - const stateTransition = client.platform.dpp.document.createStateTransition({ - create: [anotherRewardShare], - }); - - await stateTransition.sign( - masternodeOwnerIdentity.getPublicKeyById(signaturePublicKeyId), - derivedPrivateKey.toBuffer(), - ); - - try { - await client.platform.broadcastStateTransition( - stateTransition, - ); - - expect.fail('should throw broadcast error'); - } catch (e) { - expect(e.message).to.be.equal('Percentage can not be more than 10000'); - expect(e.code).to.equal(4001); - } - }); - - it('should be able to remove reward shares', async () => { - const stateTransition = client.platform.dpp.document.createStateTransition({ - delete: [rewardShare], - }); - - await stateTransition.sign( - masternodeOwnerIdentity.getPublicKeyById(signaturePublicKeyId), - derivedPrivateKey.toBuffer(), - ); - - await client.platform.broadcastStateTransition( - stateTransition, - ); - - // Additional wait time to mitigate testnet latency - await waitForSTPropagated(); - - const [storedDocument] = await client.platform.documents.get( - 'masternodeRewardShares.rewardShare', - { where: [['$id', '==', rewardShare.getId()]] }, - ); - - expect(storedDocument).to.not.exist(); - }); - }); - - // TODO(rs-drive-abci): restore. Apparently there's a bug that allows - // regular Identities to assign reward shares. - describe.skip('Any Identity', () => { - let identity; - - before(async () => { - identity = await client.platform.identities.register(200000); - - // Additional wait time to mitigate testnet latency - await waitForSTPropagated(); - }); - - it('should not be able to share rewards', async () => { - const rewardShare = await client.platform.documents.create( - 'masternodeRewardShares.rewardShare', - identity, - { - payToId: await generateRandomIdentifier(), - percentage: 1, - }, - ); - const stateTransition = client.platform.dpp.document.createStateTransition({ - create: [rewardShare], - }); - - stateTransition.setSignaturePublicKeyId(1); - - const account = await client.getWalletAccount(); - - const { privateKey } = account.identities.getIdentityHDKeyById( - identity.getId().toString(), - 1, - ); - - await stateTransition.sign( - identity.getPublicKeyById(1), - privateKey.toBuffer(), - ); - - try { - await client.platform.documents.broadcast({ - create: [rewardShare], - }, identity); - - expect.fail('should throw broadcast error'); - } catch (e) { - expect(e.message).to.be.equal('Only masternode identities can share rewards'); - expect(e.code).to.equal(4001); - } - }); - }); -}); diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/bindings/list/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/bindings/list/v0/mod.rs index 954ce1f2ff..4420c8766f 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/bindings/list/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/bindings/list/v0/mod.rs @@ -2,7 +2,6 @@ use crate::execution::validation::state_transition::documents_batch::data_trigge use crate::execution::validation::state_transition::documents_batch::data_triggers::triggers::dpns::create_domain_data_trigger; use crate::execution::validation::state_transition::documents_batch::data_triggers::triggers::feature_flags::create_feature_flag_data_trigger; use crate::execution::validation::state_transition::documents_batch::data_triggers::triggers::reject::reject_data_trigger; -use crate::execution::validation::state_transition::documents_batch::data_triggers::triggers::reward_share::create_masternode_reward_shares_data_trigger; use crate::execution::validation::state_transition::documents_batch::data_triggers::triggers::withdrawals::delete_withdrawal_data_trigger; use crate::execution::validation::state_transition::documents_batch::data_triggers::bindings::data_trigger_binding::DataTriggerBindingV0; @@ -94,15 +93,21 @@ pub fn data_trigger_bindings_list_v0() -> Result, Prot }, DataTriggerBindingV0 { data_contract_id: SystemDataContract::MasternodeRewards.id(), - document_type: update_consensus_params::NAME.to_string(), + document_type: "rewardShare".to_string(), transition_action_type: DocumentTransitionActionType::Create, - data_trigger: create_masternode_reward_shares_data_trigger, + data_trigger: reject_data_trigger, }, DataTriggerBindingV0 { data_contract_id: SystemDataContract::MasternodeRewards.id(), document_type: "rewardShare".to_string(), transition_action_type: DocumentTransitionActionType::Replace, - data_trigger: create_masternode_reward_shares_data_trigger, + data_trigger: reject_data_trigger, + }, + DataTriggerBindingV0 { + data_contract_id: SystemDataContract::MasternodeRewards.id(), + document_type: "rewardShare".to_string(), + transition_action_type: DocumentTransitionActionType::Delete, + data_trigger: reject_data_trigger, }, DataTriggerBindingV0 { data_contract_id: SystemDataContract::Withdrawals.id(), diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/mod.rs index 1b4a016736..0b320c5929 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/mod.rs @@ -2,5 +2,4 @@ pub mod dashpay; pub mod dpns; pub mod feature_flags; pub mod reject; -pub mod reward_share; pub mod withdrawals; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/reward_share/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/reward_share/mod.rs deleted file mode 100644 index e546b4f8ba..0000000000 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/reward_share/mod.rs +++ /dev/null @@ -1,35 +0,0 @@ -use drive::state_transition_action::document::documents_batch::document_transition::DocumentTransitionAction; -use dpp::version::PlatformVersion; -use crate::error::Error; -use crate::error::execution::ExecutionError; -use crate::execution::validation::state_transition::documents_batch::data_triggers::{DataTriggerExecutionContext, DataTriggerExecutionResult}; -use crate::execution::validation::state_transition::documents_batch::data_triggers::triggers::reward_share::v0::create_masternode_reward_shares_data_trigger_v0; - -mod v0; - -pub fn create_masternode_reward_shares_data_trigger( - document_transition: &DocumentTransitionAction, - context: &DataTriggerExecutionContext<'_>, - platform_version: &PlatformVersion, -) -> Result { - match platform_version - .drive_abci - .validation_and_processing - .state_transitions - .documents_batch_state_transition - .data_triggers - .triggers - .create_masternode_reward_shares_data_trigger - { - 0 => create_masternode_reward_shares_data_trigger_v0( - document_transition, - context, - platform_version, - ), - version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { - method: "create_masternode_reward_shares_data_trigger".to_string(), - known_versions: vec![0], - received: version, - })), - } -} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/reward_share/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/reward_share/v0/mod.rs deleted file mode 100644 index 7feef4e94e..0000000000 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/reward_share/v0/mod.rs +++ /dev/null @@ -1,844 +0,0 @@ -///! The `reward_share_data_triggers` module contains data triggers related to reward sharing. -use dpp::platform_value::btreemap_extensions::BTreeValueMapHelper; -use dpp::platform_value::Value; - -use drive::state_transition_action::document::documents_batch::document_transition::DocumentTransitionAction; -use dpp::version::PlatformVersion; -use drive::query::{DriveQuery, InternalClauses, WhereClause, WhereOperator}; -use std::collections::BTreeMap; -use dpp::consensus::state::data_trigger::data_trigger_condition_error::DataTriggerConditionError; -use dpp::data_contract::accessors::v0::DataContractV0Getters; -use dpp::document::DocumentV0Getters; -use dpp::ProtocolError; -use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; -use drive::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::DocumentCreateTransitionActionAccessorsV0; -use dpp::system_data_contracts::masternode_reward_shares_contract::v1::document_types::reward_share::properties -::{PAY_TO_ID, PERCENTAGE}; -use drive::drive::document::query::QueryDocumentsOutcomeV0Methods; - -use crate::error::execution::ExecutionError; -use crate::error::Error; -use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContextMethodsV0; -use crate::platform_types::platform_state::v0::PlatformStateV0Methods; - -use super::{DataTriggerExecutionContext, DataTriggerExecutionResult}; - -const MAX_PERCENTAGE: u64 = 10000; -const MAX_DOCUMENTS: usize = 16; - -/// Creates a data trigger for handling masternode reward share documents. -/// -/// The trigger is executed whenever a new masternode reward share document is created on the blockchain. -/// It performs various actions depending on the state of the document and the context in which it was created. -/// -/// # Arguments -/// -/// * `document_transition` - A reference to the document transition that triggered the data trigger. -/// * `context` - A reference to the data trigger execution context. -/// * `platform_version` - A reference to the platform version. -/// -/// # Returns -/// -/// A `DataTriggerExecutionResult` indicating the success or failure of the trigger execution. -pub fn create_masternode_reward_shares_data_trigger_v0( - document_transition: &DocumentTransitionAction, - context: &DataTriggerExecutionContext<'_>, - platform_version: &PlatformVersion, -) -> Result { - let mut result = DataTriggerExecutionResult::default(); - - let is_dry_run = context.state_transition_execution_context.in_dry_run(); - let data_contract_fetch_info = document_transition - .base() - .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( - "expecting action to have a base", - )))? - .data_contract_fetch_info(); - let data_contract = &data_contract_fetch_info.contract; - - let document_create_transition = match document_transition { - DocumentTransitionAction::CreateAction(d) => d, - _ => { - return Err(Error::Execution(ExecutionError::DataTriggerExecutionError( - format!( - "the Document Transition {} isn't 'CREATE", - document_transition - .base() - .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( - "expecting action to have a base" - )))? - .id() - ), - ))) - } - }; - - let properties = &document_create_transition.data(); - - let pay_to_id = properties - .get_hash256_bytes(PAY_TO_ID) - .map_err(ProtocolError::ValueError)?; - let percentage = properties - .get_integer(PERCENTAGE) - .map_err(ProtocolError::ValueError)?; - - if !is_dry_run { - let valid_masternodes_list = &context.platform.state.hpmn_masternode_list(); - - let owner_id_in_sml = valid_masternodes_list - .get(context.owner_id.as_slice()) - .is_some(); - - if !owner_id_in_sml { - let err = DataTriggerConditionError::new( - data_contract.id(), - document_transition - .base() - .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( - "expecting action to have a base", - )))? - .id(), - "Only masternode identities can share rewards".to_string(), - ); - - result.add_error(err); - } - } - - let maybe_identity = context.platform.drive.fetch_identity_balance( - pay_to_id, - context.transaction, - platform_version, - )?; - - if !is_dry_run && maybe_identity.is_none() { - let err = DataTriggerConditionError::new( - data_contract.id(), - document_transition - .base() - .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( - "expecting action to have a base", - )))? - .id(), - format!( - "Identity '{}' doesn't exist", - bs58::encode(pay_to_id).into_string() - ), - ); - - result.add_error(err); - - return Ok(result); - } - - let document_type = data_contract - .document_type_for_name(document_create_transition.base().document_type_name())?; - - let drive_query = DriveQuery { - contract: data_contract, - document_type, - internal_clauses: InternalClauses { - primary_key_in_clause: None, - primary_key_equal_clause: None, - in_clause: None, - range_clause: None, - equal_clauses: BTreeMap::from([( - "$ownerId".to_string(), - WhereClause { - field: "$ownerId".to_string(), - operator: WhereOperator::Equal, - value: Value::Identifier(context.owner_id.to_buffer()), - }, - )]), - }, - offset: None, - limit: Some((MAX_DOCUMENTS + 1) as u16), - order_by: Default::default(), - start_at: None, - start_at_included: false, - block_time_ms: None, - }; - - let documents = context - .platform - .drive - .query_documents( - drive_query, - None, - false, - context.transaction, - Some(platform_version.protocol_version), - )? - .documents_owned(); - - if is_dry_run { - return Ok(result); - } - - if documents.len() >= MAX_DOCUMENTS { - let err = DataTriggerConditionError::new( - data_contract.id(), - document_transition - .base() - .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( - "expecting action to have a base", - )))? - .id(), - format!( - "Reward shares cannot contain more than {} identities", - MAX_DOCUMENTS - ), - ); - - result.add_error(err); - - return Ok(result); - } - - let mut total_percent: u64 = percentage; - for d in documents.iter() { - total_percent += d - .properties() - .get_integer::(PERCENTAGE) - .map_err(ProtocolError::ValueError)?; - } - - if total_percent > MAX_PERCENTAGE { - let err = DataTriggerConditionError::new( - data_contract.id(), - document_transition - .base() - .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( - "expecting action to have a base", - )))? - .id(), - format!("Percentage can not be more than {}", MAX_PERCENTAGE), - ); - - result.add_error(err); - } - - Ok(result) -} - -#[cfg(test)] -mod test { - use super::*; - - use crate::platform_types::platform::PlatformStateRef; - use crate::test::helpers::setup::TestPlatformBuilder; - use dashcore_rpc::dashcore::hashes::Hash; - use dashcore_rpc::dashcore::{ProTxHash, Txid}; - use dashcore_rpc::dashcore_rpc_json::{DMNState, MasternodeListItem, MasternodeType}; - use dpp::block::block_info::BlockInfo; - use dpp::data_contract::document_type::random_document::CreateRandomDocument; - use dpp::data_contract::DataContract; - use dpp::document::{Document, DocumentV0Setters}; - use dpp::identity::Identity; - - use dpp::platform_value::{Bytes32, Identifier, Value}; - use dpp::tests::fixtures::{ - get_document_transitions_fixture, get_masternode_reward_shares_documents_fixture, - }; - use dpp::tests::utils::generate_random_identifier_struct; - - use crate::platform_types::platform_state::v0::PlatformStateV0; - use dpp::consensus::state::data_trigger::DataTriggerError; - use drive::drive::object_size_info::DocumentInfo::{DocumentOwnedInfo, DocumentRefInfo}; - use drive::drive::object_size_info::{DocumentAndContractInfo, OwnedDocumentInfo}; - use std::net::SocketAddr; - use std::str::FromStr; - use std::sync::Arc; - - use dpp::identity::accessors::IdentitySettersV0; - use drive::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::DocumentCreateTransitionAction; - use drive::state_transition_action::document::documents_batch::document_transition::DocumentTransitionActionType; - use dpp::version::DefaultForPlatformVersion; - use drive::drive::contract::DataContractFetchInfo; - use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; - - struct TestData { - top_level_identifier: Identifier, - data_contract: DataContract, - document_type_name: String, - documents: Vec, - document_create_transition: DocumentCreateTransitionAction, - nonce_counter: BTreeMap<(Identifier, Identifier), u64>, - } - - fn setup_test(platform_state: &mut PlatformStateV0) -> TestData { - let top_level_identifier_hex = - "c286807d463b06c7aba3b9a60acf64c1fc03da8c1422005cd9b4293f08cf0562"; - let top_level_identifier = - Identifier::from_bytes(&hex::decode(top_level_identifier_hex).unwrap()).unwrap(); - - let pro_tx_hash = ProTxHash::from_byte_array(top_level_identifier.to_buffer()); - - platform_state.hpmn_masternode_list.insert(pro_tx_hash, MasternodeListItem { - node_type: MasternodeType::Evo, - pro_tx_hash, - collateral_hash: Txid::from_str("4eb56228c535db3b234907113fd41d57bcc7cdcb8e0e00e57590af27ee88c119").expect("expected to decode collateral hash"), - collateral_index: 0, - collateral_address: [0;20], - operator_reward: 0.0, - state: DMNState { - service: SocketAddr::from_str("1.2.3.4:1234").unwrap(), - registered_height: 0, - pose_revived_height: None, - pose_ban_height: None, - revocation_reason: 0, - owner_address: [1;20], - voting_address: [2;20], - payout_address: [3;20], - pub_key_operator: hex::decode("987a4873caba62cd45a2f7d4aa6d94519ee6753e9bef777c927cb94ade768a542b0ff34a93231d3a92b4e75ffdaa366e").expect("expected to decode collateral hash"), - operator_payout_address: None, - platform_node_id: None, - platform_p2p_port: None, - platform_http_port: None, - }, - }); - - let pro_tx_hash = - ProTxHash::from_str("a3e1edc6bd352eeaf0ae58e30781ef4b127854241a3fe7fddf36d5b7e1dc2b3f") - .expect("expected to create pro-tx-hash from slice"); - - platform_state.hpmn_masternode_list.insert(pro_tx_hash, MasternodeListItem { - node_type: MasternodeType::Evo, - pro_tx_hash, - collateral_hash: Txid::from_str("4eb56228c535db3b234907113fd41d57bcc7cdcb8e0e00e57590af27ee88c119").expect("expected to decode collateral hash"), - collateral_index: 0, - collateral_address: [0;20], - operator_reward: 0.0, - state: DMNState { - service: SocketAddr::from_str("1.2.3.5:1234").unwrap(), - registered_height: 0, - pose_revived_height: None, - pose_ban_height: None, - revocation_reason: 0, - owner_address: [1;20], - voting_address: [2;20], - payout_address: [3;20], - pub_key_operator: hex::decode("a87a4873caba62cd45a2f7d4aa6d94519ee6753e9bef777c927cb94ade768a542b0ff34a93231d3a92b4e75ffdaa366e").expect("expected to decode collateral hash"), - operator_payout_address: None, - platform_node_id: None, - platform_p2p_port: None, - platform_http_port: None, - }, - }); - - let mut nonce_counter = BTreeMap::new(); - - let (documents, data_contract) = get_masternode_reward_shares_documents_fixture(1); - let document_type = data_contract - .document_type_for_name("rewardShare") - .expect("expected the rewards document type"); - let document_transitions = get_document_transitions_fixture( - [( - DocumentTransitionActionType::Create, - vec![(documents[0].clone(), document_type, Bytes32::default())], - )], - &mut nonce_counter, - ); - - let document_create_transition = document_transitions[0] - .as_transition_create() - .unwrap() - .clone(); - TestData { - documents, - data_contract, - document_type_name: "rewardShare".to_string(), - top_level_identifier, - document_create_transition: DocumentCreateTransitionAction::from_document_create_transition_with_contract_lookup(document_create_transition, |_identifier| { - Ok(Arc::new(DataContractFetchInfo::masternode_rewards_contract_fixture(platform_state.current_protocol_version_in_consensus))) - }).expect("expected to create action"), - nonce_counter, - } - } - - fn get_data_trigger_error( - result: &Result, - error_number: usize, - ) -> &DataTriggerError { - let execution_result = result.as_ref().expect("it should return execution result"); - execution_result - .get_error(error_number) - .expect("errors should exist") - } - - #[test] - fn should_return_an_error_if_percentage_greater_than_10000() { - let platform = TestPlatformBuilder::new() - .build_with_mock_rpc() - .set_initial_state_structure(); - let mut state_write_guard = platform.state.write().unwrap(); - - let platform_version = state_write_guard - .current_platform_version() - .expect("should return a platform version"); - - let TestData { - mut document_create_transition, - documents, - data_contract, - document_type_name, - top_level_identifier, - .. - } = setup_test(state_write_guard.v0_mut().expect("expected v0")); - - let document_type = data_contract - .document_type_for_name(document_type_name.as_str()) - .expect("expected the rewards document type"); - - let platform_ref = PlatformStateRef { - drive: &platform.drive, - state: &state_write_guard, - config: &platform.config, - }; - - for (i, document) in documents.iter().enumerate() { - platform_ref - .drive - .apply_contract( - &data_contract, - BlockInfo::default(), - true, - None, - None, - platform_version, - ) - .expect("expected to apply contract"); - let mut identity = - Identity::random_identity(2, Some(i as u64), platform_version).unwrap(); - - identity.set_id(document.owner_id()); - - platform_ref - .drive - .add_new_identity( - identity, - false, - &BlockInfo::default(), - true, - None, - state_write_guard.current_platform_version().unwrap(), - ) - .expect("expected to add an identity"); - - let mut identity = Identity::random_identity(2, Some(100 - i as u64), platform_version) - .expect("expected a platform identity"); - identity.set_id( - document - .properties() - .get_identifier("payToId") - .expect("expected pay to id"), - ); - - platform_ref - .drive - .add_new_identity( - identity, - false, - &BlockInfo::default(), - true, - None, - state_write_guard - .current_platform_version() - .expect("expected a platform version"), - ) - .expect("expected to add an identity"); - - platform_ref - .drive - .add_document_for_contract( - DocumentAndContractInfo { - owned_document_info: OwnedDocumentInfo { - document_info: DocumentRefInfo((document, None)), - owner_id: None, - }, - contract: &data_contract, - document_type, - }, - false, - BlockInfo::default(), - true, - None, - platform_version, - ) - .expect("expected to add document"); - } - - // documentsFixture contains percentage = 500 - document_create_transition - .data_mut() - .insert("percentage".to_string(), Value::U64(90501)); - - let execution_context = - StateTransitionExecutionContext::default_for_platform_version(platform_version) - .expect("expected to get an execution context"); - let context = DataTriggerExecutionContext { - platform: &platform_ref, - owner_id: &top_level_identifier, - state_transition_execution_context: &execution_context, - transaction: None, - }; - - let result = create_masternode_reward_shares_data_trigger_v0( - &document_create_transition.into(), - &context, - platform_version, - ); - - let percentage_error = get_data_trigger_error(&result, 0); - assert_eq!( - "Percentage can not be more than 10000", - percentage_error.to_string() - ); - } - - #[test] - fn should_return_an_error_if_pay_to_id_does_not_exists() { - let platform = TestPlatformBuilder::new() - .build_with_mock_rpc() - .set_initial_state_structure(); - - let mut state_write_guard = platform.state.write().unwrap(); - - let platform_version = state_write_guard - .current_platform_version() - .expect("should return a platform version"); - - let TestData { - document_create_transition, - - top_level_identifier, - .. - } = setup_test(state_write_guard.v0_mut().expect("expected v0")); - - let platform_ref = PlatformStateRef { - drive: &platform.drive, - state: &state_write_guard, - config: &platform.config, - }; - - let execution_context = - StateTransitionExecutionContext::default_for_platform_version(platform_version) - .unwrap(); - let context = DataTriggerExecutionContext { - platform: &platform_ref, - owner_id: &top_level_identifier, - state_transition_execution_context: &execution_context, - transaction: None, - }; - let pay_to_id_bytes = document_create_transition - .data() - .get_hash256_bytes(PAY_TO_ID) - .expect("expected to be able to get a hash"); - let result = create_masternode_reward_shares_data_trigger_v0( - &document_create_transition.into(), - &context, - platform_version, - ); - - let error = get_data_trigger_error(&result, 0); - - let pay_to_id = Identifier::from(pay_to_id_bytes); - - assert_eq!( - format!("Identity '{}' doesn't exist", pay_to_id), - error.to_string() - ); - } - - #[test] - fn should_return_an_error_if_owner_id_is_not_a_masternode_identity() { - let platform = TestPlatformBuilder::new() - .build_with_mock_rpc() - .set_initial_state_structure(); - - let mut state_write_guard = platform.state.write().unwrap(); - - let platform_version = state_write_guard - .current_platform_version() - .expect("should return a platform version"); - - let TestData { - document_create_transition, - .. - } = setup_test(state_write_guard.v0_mut().expect("expected v0")); - - let platform_ref = PlatformStateRef { - drive: &platform.drive, - state: &state_write_guard, - config: &platform.config, - }; - - let execution_context = - StateTransitionExecutionContext::default_for_platform_version(platform_version) - .unwrap(); - let context = DataTriggerExecutionContext { - platform: &platform_ref, - owner_id: &generate_random_identifier_struct(), - state_transition_execution_context: &execution_context, - transaction: None, - }; - let result = create_masternode_reward_shares_data_trigger_v0( - &document_create_transition.into(), - &context, - platform_version, - ); - let error = get_data_trigger_error(&result, 0); - - assert_eq!( - "Only masternode identities can share rewards", - error.to_string() - ); - } - - #[test] - fn should_pass() { - let platform = TestPlatformBuilder::new() - .build_with_mock_rpc() - .set_initial_state_structure(); - - let mut state_write_guard = platform.state.write().unwrap(); - - let platform_version = state_write_guard - .current_platform_version() - .expect("should return a platform version"); - - let TestData { - document_create_transition, - - top_level_identifier, - .. - } = setup_test(state_write_guard.v0_mut().expect("expected v0")); - - let platform_ref = PlatformStateRef { - drive: &platform.drive, - state: &state_write_guard, - config: &platform.config, - }; - - let mut identity = Identity::random_identity( - 2, - Some(9), - state_write_guard.current_platform_version().unwrap(), - ) - .expect("expected a platform identity"); - identity.set_id( - document_create_transition - .data() - .get_identifier("payToId") - .expect("expected pay to id"), - ); - - platform_ref - .drive - .add_new_identity( - identity, - false, - &BlockInfo::default(), - true, - None, - state_write_guard.current_platform_version().unwrap(), - ) - .expect("expected to add an identity"); - - let execution_context = - StateTransitionExecutionContext::default_for_platform_version(platform_version) - .unwrap(); - let context = DataTriggerExecutionContext { - platform: &platform_ref, - owner_id: &top_level_identifier, - state_transition_execution_context: &execution_context, - transaction: None, - }; - let result = create_masternode_reward_shares_data_trigger_v0( - &document_create_transition.into(), - &context, - platform_version, - ) - .expect("the execution result should be returned"); - assert!(result.is_valid(), "{}", result.errors.first().unwrap()) - } - - #[test] - fn should_return_error_if_there_are_16_stored_shares() { - let platform = TestPlatformBuilder::new() - .build_with_mock_rpc() - .set_initial_state_structure(); - - let mut state_write_guard = platform.state.write().unwrap(); - - let TestData { - document_create_transition, - data_contract, - top_level_identifier, - .. - } = setup_test(state_write_guard.v0_mut().expect("expected v0")); - - let platform_version = state_write_guard - .current_platform_version() - .expect("should return platform version"); - - let platform_ref = PlatformStateRef { - drive: &platform.drive, - state: &state_write_guard, - config: &platform.config, - }; - - platform_ref - .drive - .apply_contract( - &data_contract, - BlockInfo::default(), - true, - None, - None, - platform_version, - ) - .expect("expected to apply contract"); - - let document_type = data_contract - .document_type_for_name(document_create_transition.base().document_type_name()) - .expect("expected to get document type"); - - let mut main_identity = Identity::random_identity(2, Some(1000_u64), platform_version) - .expect("expected a platform identity"); - - main_identity.set_id( - document_create_transition - .data() - .get_identifier("payToId") - .expect("expected pay to id"), - ); - - platform_ref - .drive - .add_new_identity( - main_identity, - false, - &BlockInfo::default(), - true, - None, - platform_version, - ) - .expect("expected to add an identity"); - - for i in 0..16 { - let mut document = document_type - .random_document(Some(i), platform_version) - .expect("should generate a document"); - - document.set_owner_id(top_level_identifier); - - let mut identity = Identity::random_identity(2, Some(100 - i), platform_version) - .expect("expected a platform identity"); - identity.set_id( - document - .properties() - .get_identifier("payToId") - .expect("expected pay to id"), - ); - - platform_ref - .drive - .add_new_identity( - identity, - false, - &BlockInfo::default(), - true, - None, - platform_version, - ) - .expect("expected to add an identity"); - - platform - .drive - .add_document_for_contract( - DocumentAndContractInfo { - owned_document_info: OwnedDocumentInfo { - document_info: DocumentOwnedInfo((document, None)), - owner_id: Some(top_level_identifier.to_buffer()), - }, - contract: &data_contract, - document_type, - }, - false, - BlockInfo::genesis(), - true, - None, - platform_version, - ) - .expect("expected to insert a document successfully"); - } - - let execution_context = - StateTransitionExecutionContext::default_for_platform_version(platform_version) - .unwrap(); - let context = DataTriggerExecutionContext { - platform: &platform_ref, - owner_id: &top_level_identifier, - state_transition_execution_context: &execution_context, - transaction: None, - }; - - let result = create_masternode_reward_shares_data_trigger_v0( - &document_create_transition.into(), - &context, - platform_version, - ); - let error = get_data_trigger_error(&result, 0); - - assert_eq!( - "Reward shares cannot contain more than 16 identities", - error.to_string() - ); - } - - #[test] - fn should_pass_on_dry_run() { - let platform = TestPlatformBuilder::new() - .build_with_mock_rpc() - .set_initial_state_structure(); - - let mut state_write_guard = platform.state.write().unwrap(); - - let platform_version = state_write_guard - .current_platform_version() - .expect("should return a platform version"); - - let TestData { - document_create_transition, - - top_level_identifier, - .. - } = setup_test(state_write_guard.v0_mut().expect("expected v0")); - - let platform_ref = PlatformStateRef { - drive: &platform.drive, - state: &state_write_guard, - config: &platform.config, - }; - - let mut execution_context = - StateTransitionExecutionContext::default_for_platform_version(platform_version) - .unwrap(); - execution_context.enable_dry_run(); - - let context = DataTriggerExecutionContext { - platform: &platform_ref, - owner_id: &top_level_identifier, - state_transition_execution_context: &execution_context, - transaction: None, - }; - let result = create_masternode_reward_shares_data_trigger_v0( - &document_create_transition.into(), - &context, - platform_version, - ) - .expect("the execution result should be returned"); - assert!(result.is_valid()); - } -} From 6c45476020e709dbfb3325b8486b79fdc2d350f8 Mon Sep 17 00:00:00 2001 From: Igor Markin Date: Thu, 29 Feb 2024 08:15:41 +0000 Subject: [PATCH 048/191] test(test-suite): withdrawals identityRecent index (#1716) --- .../Client/Platform/IStateTransitionResult.ts | 2 + .../Platform/broadcastStateTransition.ts | 4 +- .../methods/identities/creditWithdrawal.ts | 15 ++++-- .../test/e2e/withdrawals.spec.js | 48 +++++++++++++++++++ .../v0/mod.rs | 9 +--- .../v0/mod.rs | 27 +++++++---- .../v0/mod.rs | 2 +- 7 files changed, 82 insertions(+), 25 deletions(-) diff --git a/packages/js-dash-sdk/src/SDK/Client/Platform/IStateTransitionResult.ts b/packages/js-dash-sdk/src/SDK/Client/Platform/IStateTransitionResult.ts index ce464f641f..2b67981445 100644 --- a/packages/js-dash-sdk/src/SDK/Client/Platform/IStateTransitionResult.ts +++ b/packages/js-dash-sdk/src/SDK/Client/Platform/IStateTransitionResult.ts @@ -1,6 +1,8 @@ +import { Metadata } from '@dashevo/dapi-client/lib/methods/platform/response/Metadata'; import { IPlatformStateProof } from './IPlatformStateProof'; export interface IStateTransitionResult { + metadata: Metadata, proof?: IPlatformStateProof, error?: { code: number, diff --git a/packages/js-dash-sdk/src/SDK/Client/Platform/broadcastStateTransition.ts b/packages/js-dash-sdk/src/SDK/Client/Platform/broadcastStateTransition.ts index 912cd4fd34..a12b67872f 100644 --- a/packages/js-dash-sdk/src/SDK/Client/Platform/broadcastStateTransition.ts +++ b/packages/js-dash-sdk/src/SDK/Client/Platform/broadcastStateTransition.ts @@ -22,8 +22,8 @@ export default async function broadcastStateTransition( stateTransition: any, // TODO: restore once validation is done? // eslint-disable-next-line - options: { skipValidation?: boolean; } = {}, -): Promise { + options: { skipValidation?: boolean; } = {}, +): Promise { const { client } = platform; // TODO(versioning): restore diff --git a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/creditWithdrawal.ts b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/creditWithdrawal.ts index a2f836cc75..f4b3a963c7 100644 --- a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/creditWithdrawal.ts +++ b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/creditWithdrawal.ts @@ -1,5 +1,6 @@ import { Identity } from '@dashevo/wasm-dpp'; import { Address, Script } from '@dashevo/dashcore-lib'; +import { Metadata } from '@dashevo/dapi-client/lib/methods/platform/response/Metadata'; import broadcastStateTransition from '../../broadcastStateTransition'; import { Platform } from '../../Platform'; import { signStateTransition } from '../../signStateTransition'; @@ -44,7 +45,7 @@ export async function creditWithdrawal( options: WithdrawalOptions = { signingKeyIndex: 2, }, -): Promise { +): Promise { await this.initialize(); const { dpp } = this; @@ -104,13 +105,17 @@ export async function creditWithdrawal( this.nonceManager.setIdentityNonce(identity.getId(), identityNonce); // Skipping validation because it's already done above - await broadcastStateTransition(this, identityCreditWithdrawalTransition, { - skipValidation: true, - }); + const stateTransitionResult = await broadcastStateTransition( + this, + identityCreditWithdrawalTransition, + { + skipValidation: true, + }, + ); this.logger.silly('[Identity#creditWithdrawal] Broadcasted IdentityCreditWithdrawalTransition'); - return true; + return stateTransitionResult.metadata; } export default creditWithdrawal; diff --git a/packages/platform-test-suite/test/e2e/withdrawals.spec.js b/packages/platform-test-suite/test/e2e/withdrawals.spec.js index 92f4d6a23b..1b146edaea 100644 --- a/packages/platform-test-suite/test/e2e/withdrawals.spec.js +++ b/packages/platform-test-suite/test/e2e/withdrawals.spec.js @@ -104,6 +104,54 @@ describe('Withdrawals', function withdrawalsTest() { }, identity); }); + it('should be able to query recent withdrawal updates', async () => { + const account = await client.getWalletAccount(); + const withdrawTo = await account.getUnusedAddress(); + const amountToWithdraw = 1000000; + + const firstWithdrawalTime = Date.now(); + const { height: withdrawalHeight } = await client.platform.identities.withdrawCredits( + identity, + BigInt(amountToWithdraw), + withdrawTo.address, + ); + + let withdrawalBroadcasted = false; + let blocksPassed = 0; + + // Wait for first withdrawal to broadcast + while (!withdrawalBroadcasted && blocksPassed === 0) { + await waitForSTPropagated(); + + const withdrawals = await client.platform + .documents.get( + 'withdrawals.withdrawal', + { + where: [ + ['$ownerId', '==', identity.getId()], + ['$updatedAt', '>', firstWithdrawalTime], + ], + orderBy: [ + ['$updatedAt', 'desc'], + ], + }, + ); + + // We want to ensure that our index works properly with updatedAt + // condition, and we are not receiving the document from previous test + expect(withdrawals.length).to.equal(1); + + const withdrawal = withdrawals[0]; + + withdrawalBroadcasted = withdrawal.get('status') === WITHDRAWAL_STATUSES.BROADCASTED; + + blocksPassed = withdrawal.getMetadata() + .getBlockHeight() - withdrawalHeight; + } + + expect(withdrawalBroadcasted).to.be.true(); + }); + it('should not be able to withdraw more than balance available', async () => { const account = await client.getWalletAccount(); const identityBalanceBefore = identity.getBalance(); diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/dequeue_and_build_unsigned_withdrawal_transactions/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/dequeue_and_build_unsigned_withdrawal_transactions/v0/mod.rs index b654a1e56b..d805a4db0a 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/dequeue_and_build_unsigned_withdrawal_transactions/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/dequeue_and_build_unsigned_withdrawal_transactions/v0/mod.rs @@ -147,14 +147,7 @@ where block_info.core_height as u64, ); - document.set_i64( - withdrawal::properties::UPDATED_AT, - block_info.time_ms.try_into().map_err(|_| { - Error::Execution(ExecutionError::CorruptedCodeExecution( - "Can't convert u64 block time to i64 updated_at", - )) - })?, - ); + document.set_updated_at(Some(block_info.time_ms)); document.increment_revision().map_err(|_| { Error::Execution(ExecutionError::CorruptedCodeExecution( diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v0/mod.rs index 1c01f85ff2..a4ece9021e 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v0/mod.rs @@ -69,14 +69,7 @@ where withdrawals_contract::WithdrawalStatus::POOLED as u8, ); - document.set_i64( - withdrawal::properties::UPDATED_AT, - block_info.time_ms.try_into().map_err(|_| { - Error::Execution(ExecutionError::CorruptedCodeExecution( - "Can't convert u64 block time to i64 updated_at", - )) - })?, - ); + document.set_updated_at(Some(block_info.time_ms)); document.increment_revision().map_err(|_| { Error::Execution(ExecutionError::CorruptedCodeExecution( @@ -150,6 +143,7 @@ where mod tests { use super::*; use dpp::block::epoch::Epoch; + use itertools::Itertools; use dpp::data_contracts::SystemDataContract; use dpp::identifier::Identifier; @@ -258,7 +252,22 @@ mod tests { ) .expect("to fetch withdrawal documents"); - for (i, document) in updated_documents.into_iter().enumerate() { + for (i, document) in updated_documents + .into_iter() + // Sort by index because updated_at is the same for all documents within batch + .sorted_by(|a, b| { + let a_index = a + .properties() + .get_u64(withdrawal::properties::TRANSACTION_INDEX) + .expect("to get transactionIndex"); + let b_index = b + .properties() + .get_u64(withdrawal::properties::TRANSACTION_INDEX) + .expect("to get transactionIndex"); + a_index.cmp(&b_index) + }) + .enumerate() + { assert_eq!(document.revision(), Some(2)); let tx_index = document diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/update_broadcasted_withdrawal_statuses/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/update_broadcasted_withdrawal_statuses/v0/mod.rs index d092769021..68ef67c202 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/update_broadcasted_withdrawal_statuses/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/update_broadcasted_withdrawal_statuses/v0/mod.rs @@ -122,7 +122,7 @@ where document.set_u8(withdrawal::properties::STATUS, status.into()); - document.set_u64(withdrawal::properties::UPDATED_AT, block_info.time_ms); + document.set_updated_at(Some(block_info.time_ms)); document.increment_revision().map_err(Error::Protocol)?; From d197907d4f436af03aab79b729c7682c55f918da Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Thu, 29 Feb 2024 18:26:03 +0700 Subject: [PATCH 049/191] feat(platform)!: identity nonce for Data Contract Create (#1724) Co-authored-by: markin.io --- .../js-dash-sdk/src/SDK/Client/Client.spec.ts | 3 +- .../NonceManager/NonceManager.spec.ts | 20 + .../Platform/NonceManager/NonceManager.ts | 16 + .../src/SDK/Client/Platform/Platform.ts | 2 +- .../Platform/methods/contracts/create.ts | 7 +- .../Platform/methods/contracts/update.ts | 3 +- .../Platform/methods/documents/broadcast.ts | 3 +- .../methods/identities/creditTransfer.ts | 3 +- .../methods/identities/creditWithdrawal.ts | 4 +- .../Platform/methods/identities/update.ts | 4 +- .../test/fixtures/getDataContractFixture.js | 5 +- .../functional/platform/DataContract.spec.js | 10 +- .../test/functional/platform/Document.spec.js | 8 +- .../test/functional/platform/Identity.spec.js | 4 +- .../created_data_contract/fields.rs | 2 +- .../created_data_contract/mod.rs | 44 +- .../created_data_contract/v0/mod.rs | 17 +- .../src/data_contract/data_contract_facade.rs | 17 +- .../rs-dpp/src/data_contract/factory/mod.rs | 23 +- .../src/data_contract/factory/v0/mod.rs | 37 +- .../data_contract/generate_data_contract.rs | 5 +- packages/rs-dpp/src/data_contract/mod.rs | 7 +- .../data_contract_create_transition/mod.rs | 447 ------------------ .../data_contract/v0/serialization/bincode.rs | 2 +- .../src/document/extended_document/mod.rs | 2 +- .../src/state_transition/serialization.rs | 6 +- .../state_transitions/common_fields.rs | 2 +- .../accessors/mod.rs | 5 +- .../accessors/v0/mod.rs | 4 +- .../data_contract_create_transition/fields.rs | 9 +- .../json_conversion.rs | 7 +- .../methods/mod.rs | 6 +- .../methods/v0/mod.rs | 6 +- .../data_contract_create_transition/mod.rs | 9 +- .../serialize.rs | 118 ----- .../data_contract_create_transition/v0/mod.rs | 9 +- .../v0/types.rs | 4 +- .../v0/v0_methods.rs | 7 +- .../v0/value_conversion.rs | 8 +- .../data_contract_update_transition/fields.rs | 3 +- .../data_contract_update_transition/mod.rs | 2 +- .../documents_batch_transition/fields.rs | 3 +- .../fields.rs | 3 +- .../identity_topup_transition/fields.rs | 3 +- .../identity_update_transition/fields.rs | 4 +- packages/rs-dpp/src/system_data_contracts.rs | 5 +- .../fixtures/get_dashpay_contract_fixture.rs | 7 +- ...with_generalized_encryption_key_fixture.rs | 6 +- .../fixtures/get_dashpay_document_fixture.rs | 9 +- .../src/tests/fixtures/get_data_contract.rs | 6 +- .../tests/fixtures/get_dpns_data_contract.rs | 11 +- .../fixtures/get_dpns_document_fixture.rs | 15 +- packages/rs-dpp/src/tests/json_document.rs | 5 +- .../src/execution/check_tx/v0/mod.rs | 6 +- .../state_transition/processor/v0/mod.rs | 3 + .../identity_nonce/mod.rs | 40 ++ .../identity_nonce/v0/mod.rs | 50 ++ .../data_contract_create/mod.rs | 1 + .../data_contract_create/structure/v0/mod.rs | 2 +- .../data_contract_update/mod.rs | 2 +- .../data_triggers/triggers/dashpay/v0/mod.rs | 7 +- .../data_triggers/triggers/dpns/v0/mod.rs | 1 + .../triggers/withdrawals/v0/mod.rs | 2 +- packages/rs-drive-abci/src/query/mod.rs | 24 +- packages/rs-drive-abci/src/query/v0/mod.rs | 2 +- .../tests/strategy_tests/failures.rs | 2 + .../tests/strategy_tests/main.rs | 17 +- .../tests/strategy_tests/strategy.rs | 7 +- .../data_contract_create_transition.rs | 13 +- .../src/drive/contract/contract_fetch_info.rs | 5 +- .../fetch_contract_with_history/mod.rs | 2 +- packages/rs-drive/src/drive/contract/mod.rs | 4 +- .../rs-drive/src/drive/document/insert/mod.rs | 2 +- .../rs-drive/src/drive/document/update/mod.rs | 5 +- packages/rs-drive/src/query/mod.rs | 20 +- packages/rs-drive/src/query/test_index.rs | 4 +- .../contract/data_contract_create/mod.rs | 8 + .../contract/data_contract_create/v0/mod.rs | 3 + .../data_contract_create/v0/transformer.rs | 2 + packages/rs-drive/tests/query_tests.rs | 6 +- .../src/version/mocks/v2_test.rs | 8 +- .../src/version/mocks/v3_test.rs | 8 +- .../rs-platform-version/src/version/v1.rs | 2 +- packages/rs-sdk/src/platform/transition.rs | 2 + .../src/platform/transition/put_contract.rs | 134 ++++++ .../src/platform/transition/put_document.rs | 8 +- .../src/platform/transition/put_settings.rs | 8 + .../transition/withdraw_from_identity.rs | 2 +- packages/rs-sdk/src/sdk.rs | 8 +- packages/rs-sdk/tests/fetch/common.rs | 4 +- packages/strategy-tests/src/lib.rs | 20 +- .../test/fixtures/getDataContractFixture.js | 3 +- .../wasm-dpp/src/dash_platform_protocol.rs | 5 +- .../src/data_contract/data_contract.rs | 32 +- .../src/data_contract/data_contract_facade.rs | 5 +- .../data_contract_create_transition/mod.rs | 6 +- .../data_contract_factory.rs | 13 +- .../dataContract/DataContractFacade.spec.js | 4 + .../unit/dataContract/DataContract.spec.js | 11 +- .../DataContractCreateTransition.spec.js | 4 +- .../test/unit/document/Document.spec.js | 3 +- 101 files changed, 664 insertions(+), 843 deletions(-) delete mode 100644 packages/rs-dpp/src/data_contract/state_transition/data_contract_create_transition/mod.rs delete mode 100644 packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/serialize.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/identity_nonce/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/identity_nonce/v0/mod.rs create mode 100644 packages/rs-sdk/src/platform/transition/put_contract.rs create mode 100644 packages/rs-sdk/src/platform/transition/put_settings.rs diff --git a/packages/js-dash-sdk/src/SDK/Client/Client.spec.ts b/packages/js-dash-sdk/src/SDK/Client/Client.spec.ts index d677d7d632..a752c1df44 100644 --- a/packages/js-dash-sdk/src/SDK/Client/Client.spec.ts +++ b/packages/js-dash-sdk/src/SDK/Client/Client.spec.ts @@ -389,7 +389,8 @@ describe('Dash - Client', function suite() { expect(await interceptedSt.verifySignature( identityFixture.getPublicKeyById(2), )).to.be.equal(true); - expect(interceptedSt.getEntropy()).to.be.deep.equal(dataContractFixture.getEntropy()); + expect(interceptedSt.getIdentityNonce()).to.be + .deep.equal(dataContractFixture.getIdentityNonce()); expect(interceptedSt.getDataContract().toObject()) .to.be.deep.equal(dataContractFixture.toObject()); }); diff --git a/packages/js-dash-sdk/src/SDK/Client/Platform/NonceManager/NonceManager.spec.ts b/packages/js-dash-sdk/src/SDK/Client/Platform/NonceManager/NonceManager.spec.ts index 2531d9fc93..018150fd93 100644 --- a/packages/js-dash-sdk/src/SDK/Client/Platform/NonceManager/NonceManager.spec.ts +++ b/packages/js-dash-sdk/src/SDK/Client/Platform/NonceManager/NonceManager.spec.ts @@ -43,6 +43,16 @@ describe('Dash - NonceManager', () => { expect(await nonceManager.getIdentityNonce(identityId)).to.be.equal(2); clock.restore(); }); + + it('should bump identity nonce', async () => { + dapiClientMock.platform.getIdentityNonce.resolves({ identityNonce: 1 }); + const prevNonce = await nonceManager.getIdentityNonce(identityId); + const nextNonce = await nonceManager.bumpIdentityNonce(identityId); + const currentNonce = await nonceManager.getIdentityNonce(identityId); + expect(nextNonce) + .to.equal(currentNonce) + .to.equal(prevNonce + 1); + }); }); describe('Identity contract nonce', () => { @@ -73,5 +83,15 @@ describe('Dash - NonceManager', () => { .to.be.equal(2); clock.restore(); }); + + it('should bump identity contract nonce', async () => { + dapiClientMock.platform.getIdentityContractNonce.resolves({ identityContractNonce: 1 }); + const prevNonce = await nonceManager.getIdentityContractNonce(identityId, contractId); + const nextNonce = await nonceManager.bumpIdentityContractNonce(identityId, contractId); + const currentNonce = await nonceManager.getIdentityContractNonce(identityId, contractId); + expect(nextNonce) + .to.equal(currentNonce) + .to.equal(prevNonce + 1); + }); }); }); diff --git a/packages/js-dash-sdk/src/SDK/Client/Platform/NonceManager/NonceManager.ts b/packages/js-dash-sdk/src/SDK/Client/Platform/NonceManager/NonceManager.ts index e4065c4ceb..8c4cc38268 100644 --- a/packages/js-dash-sdk/src/SDK/Client/Platform/NonceManager/NonceManager.ts +++ b/packages/js-dash-sdk/src/SDK/Client/Platform/NonceManager/NonceManager.ts @@ -71,6 +71,12 @@ class NonceManager { return nonceState.value; } + public async bumpIdentityNonce(identityId: Identifier): Promise { + const nextIdentityNonce = await this.getIdentityNonce(identityId) + 1; + this.setIdentityNonce(identityId, nextIdentityNonce); + return nextIdentityNonce; + } + public setIdentityContractNonce(identityId: Identifier, contractId: Identifier, nonce: number) { const identityIdStr = identityId.toString(); const contractIdStr = contractId.toString(); @@ -141,6 +147,16 @@ class NonceManager { return nonceState.value; } + + public async bumpIdentityContractNonce( + identityId: Identifier, + contractId: Identifier, + ): Promise { + const nextIdentityContractNonce = await this + .getIdentityContractNonce(identityId, contractId) + 1; + this.setIdentityContractNonce(identityId, contractId, nextIdentityContractNonce); + return nextIdentityContractNonce; + } } export default NonceManager; diff --git a/packages/js-dash-sdk/src/SDK/Client/Platform/Platform.ts b/packages/js-dash-sdk/src/SDK/Client/Platform/Platform.ts index 7231eb02f3..873fe62c53 100644 --- a/packages/js-dash-sdk/src/SDK/Client/Platform/Platform.ts +++ b/packages/js-dash-sdk/src/SDK/Client/Platform/Platform.ts @@ -154,7 +154,7 @@ export class Platform { protected fetcher: Fetcher; - protected nonceManager: NonceManager; + public nonceManager: NonceManager; /** * Construct some instance of Platform diff --git a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/contracts/create.ts b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/contracts/create.ts index 6b5db8e745..b6ca74c9bc 100644 --- a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/contracts/create.ts +++ b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/contracts/create.ts @@ -17,7 +17,12 @@ export async function create( await this.initialize(); - const dataContract = this.dpp.dataContract.create(identity.getId(), contractDefinitions); + const identityNonce = await this.nonceManager.getIdentityNonce(identity.getId()) + 1; + const dataContract = this.dpp.dataContract.create( + identity.getId(), + BigInt(identityNonce), + contractDefinitions, + ); this.logger.debug(`[Contracts#create] created data contract "${dataContract.getId()}"`); diff --git a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/contracts/update.ts b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/contracts/update.ts index 04aef0445f..7347d158b3 100644 --- a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/contracts/update.ts +++ b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/contracts/update.ts @@ -29,7 +29,7 @@ export default async function update( const dataContractId = dataContract.getId(); const identityContractNonce = await this.nonceManager - .getIdentityContractNonce(identityId, dataContractId) + 1; + .bumpIdentityContractNonce(identityId, dataContractId); const dataContractUpdateTransition = dpp.dataContract .createDataContractUpdateTransition(updatedDataContract, BigInt(identityContractNonce)); @@ -37,7 +37,6 @@ export default async function update( this.logger.silly(`[DataContract#update] Created data contract update transition ${dataContract.getId()}`); await signStateTransition(this, dataContractUpdateTransition, identity, 2); - this.nonceManager.setIdentityContractNonce(identityId, dataContractId, identityContractNonce); // Broadcast state transition also wait for the result to be obtained await broadcastStateTransition(this, dataContractUpdateTransition); diff --git a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/documents/broadcast.ts b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/documents/broadcast.ts index 67f522dd12..4bbe6b6479 100644 --- a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/documents/broadcast.ts +++ b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/documents/broadcast.ts @@ -43,7 +43,7 @@ export default async function broadcast( } const identityContractNonce = await this.nonceManager - .getIdentityContractNonce(identityId, dataContractId) + 1; + .bumpIdentityContractNonce(identityId, dataContractId); const documentsBatchTransition = dpp.document.createStateTransition(documents, { [identityId.toString()]: { @@ -55,7 +55,6 @@ export default async function broadcast( await signStateTransition(this, documentsBatchTransition, identity, 1); - this.nonceManager.setIdentityContractNonce(identityId, dataContractId, identityContractNonce); // Broadcast state transition also wait for the result to be obtained await broadcastStateTransition(this, documentsBatchTransition); diff --git a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/creditTransfer.ts b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/creditTransfer.ts index 2e6ac84a5e..f6d05bc556 100644 --- a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/creditTransfer.ts +++ b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/creditTransfer.ts @@ -16,7 +16,7 @@ export async function creditTransfer( recipientId = Identifier.from(recipientId); - const identityNonce = await this.nonceManager.getIdentityNonce(identity.getId()) + 1; + const identityNonce = await this.nonceManager.bumpIdentityNonce(identity.getId()); const identityCreditTransferTransition = dpp.identity .createIdentityCreditTransferTransition( @@ -32,7 +32,6 @@ export async function creditTransfer( await signStateTransition(this, identityCreditTransferTransition, identity, signerKeyIndex); - this.nonceManager.setIdentityNonce(identity.getId(), identityNonce); // Skipping validation because it's already done above await broadcastStateTransition(this, identityCreditTransferTransition, { skipValidation: true, diff --git a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/creditWithdrawal.ts b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/creditWithdrawal.ts index f4b3a963c7..a8ebae7640 100644 --- a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/creditWithdrawal.ts +++ b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/creditWithdrawal.ts @@ -80,8 +80,7 @@ export async function creditWithdrawal( const coreFeePerByte = nearestGreaterFibonacci(minRelayFeePerByte); - const identityNonce = await this.nonceManager - .getIdentityNonce(identity.getId()) + 1; + const identityNonce = await this.nonceManager.bumpIdentityNonce(identity.getId()); const identityCreditWithdrawalTransition = dpp.identity .createIdentityCreditWithdrawalTransition( @@ -103,7 +102,6 @@ export async function creditWithdrawal( options.signingKeyIndex, ); - this.nonceManager.setIdentityNonce(identity.getId(), identityNonce); // Skipping validation because it's already done above const stateTransitionResult = await broadcastStateTransition( this, diff --git a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/update.ts b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/update.ts index 529fc68898..941e75d303 100644 --- a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/update.ts +++ b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/update.ts @@ -28,8 +28,7 @@ export async function update( const { dpp } = this; - const identityNonce = await this.nonceManager - .getIdentityNonce(identity.getId()) + 1; + const identityNonce = await this.nonceManager.bumpIdentityNonce(identity.getId()); const identityUpdateTransition = dpp.identity.createIdentityUpdateTransition( identity, @@ -94,7 +93,6 @@ export async function update( // } this.logger.silly('[Identity#update] Validated IdentityUpdateTransition'); - this.nonceManager.setIdentityNonce(identity.getId(), identityNonce); // Skipping validation because it's already done above await broadcastStateTransition(this, identityUpdateTransition, { skipValidation: true, diff --git a/packages/platform-test-suite/lib/test/fixtures/getDataContractFixture.js b/packages/platform-test-suite/lib/test/fixtures/getDataContractFixture.js index 7c62e08ac2..5acec950e5 100644 --- a/packages/platform-test-suite/lib/test/fixtures/getDataContractFixture.js +++ b/packages/platform-test-suite/lib/test/fixtures/getDataContractFixture.js @@ -10,11 +10,12 @@ const { let randomOwnerId = null; /** - * + * @param {number} identityNonce * @param {Identifier} [ownerId] * @return {Promise} */ module.exports = async function getDataContractFixture( + identityNonce, ownerId = randomOwnerId, ) { const { DataContractFactory, Identifier, getLatestProtocolVersion } = await Platform @@ -150,5 +151,5 @@ module.exports = async function getDataContractFixture( documentsMutableContractDefault: true, }; - return factory.create(ownerId, documents, config); + return factory.create(ownerId, BigInt(identityNonce), documents, config); }; diff --git a/packages/platform-test-suite/test/functional/platform/DataContract.spec.js b/packages/platform-test-suite/test/functional/platform/DataContract.spec.js index 8623aa0cf1..6f75e906ba 100644 --- a/packages/platform-test-suite/test/functional/platform/DataContract.spec.js +++ b/packages/platform-test-suite/test/functional/platform/DataContract.spec.js @@ -25,12 +25,14 @@ describe('Platform', () => { let identity; before(async () => { - dataContractFixture = await getDataContractFixture(); client = await createClientWithFundedWallet(35000000); // Looks like updating the contact and keeping history requires about // 7 million credits in fees. Investigate this further. identity = await client.platform.identities.register(30000000); + const nextNonce = await client.platform + .nonceManager.bumpIdentityNonce(identity.getId()); + dataContractFixture = await getDataContractFixture(nextNonce); }); after(async () => { @@ -42,7 +44,7 @@ describe('Platform', () => { it('should fail to create new data contract with unknown owner', async () => { // if no identity is specified // random is generated within the function - dataContractFixture = await getDataContractFixture(); + dataContractFixture = await getDataContractFixture(1); let broadcastError; @@ -61,7 +63,9 @@ describe('Platform', () => { // Additional wait time to mitigate testnet latency await waitForSTPropagated(); - dataContractFixture = await getDataContractFixture(identity.getId()); + const identityNonce = await client.platform.nonceManager + .bumpIdentityNonce(identity.getId()); + dataContractFixture = await getDataContractFixture(identityNonce, identity.getId()); await client.platform.contracts.publish(dataContractFixture, identity); }); diff --git a/packages/platform-test-suite/test/functional/platform/Document.spec.js b/packages/platform-test-suite/test/functional/platform/Document.spec.js index 58ff551145..28c51dc7c8 100644 --- a/packages/platform-test-suite/test/functional/platform/Document.spec.js +++ b/packages/platform-test-suite/test/functional/platform/Document.spec.js @@ -35,7 +35,9 @@ describe('Platform', () => { // Additional wait time to mitigate testnet latency await waitForSTPropagated(); - dataContractFixture = await getDataContractFixture(identity.getId()); + const identityNonce = await client.platform + .nonceManager.bumpIdentityNonce(identity.getId()); + dataContractFixture = await getDataContractFixture(identityNonce, identity.getId()); await client.platform.contracts.publish(dataContractFixture, identity); @@ -50,7 +52,9 @@ describe('Platform', () => { }); beforeEach(async () => { - dataContractFixture = await getDataContractFixture(identity.getId()); + const identityNonce = await client.platform + .nonceManager.bumpIdentityNonce(identity.getId()); + dataContractFixture = await getDataContractFixture(identityNonce, identity.getId()); }); after(async () => { diff --git a/packages/platform-test-suite/test/functional/platform/Identity.spec.js b/packages/platform-test-suite/test/functional/platform/Identity.spec.js index e2c484b0e1..7016119ec5 100644 --- a/packages/platform-test-suite/test/functional/platform/Identity.spec.js +++ b/packages/platform-test-suite/test/functional/platform/Identity.spec.js @@ -326,7 +326,9 @@ describe('Platform', () => { let dataContractFixture; before(async () => { - dataContractFixture = await getDataContractFixture(identity.getId()); + const nextNonce = await client.platform.nonceManager + .bumpIdentityNonce(identity.getId()); + dataContractFixture = await getDataContractFixture(nextNonce, identity.getId()); await client.platform.contracts.publish(dataContractFixture, identity); diff --git a/packages/rs-dpp/src/data_contract/created_data_contract/fields.rs b/packages/rs-dpp/src/data_contract/created_data_contract/fields.rs index bf38cb789e..9437360931 100644 --- a/packages/rs-dpp/src/data_contract/created_data_contract/fields.rs +++ b/packages/rs-dpp/src/data_contract/created_data_contract/fields.rs @@ -1,4 +1,4 @@ pub mod property_names { pub const DATA_CONTRACT: &str = "dataContract"; - pub const ENTROPY: &str = "entropy"; + pub const IDENTITY_NONCE: &str = "identityNonce"; } diff --git a/packages/rs-dpp/src/data_contract/created_data_contract/mod.rs b/packages/rs-dpp/src/data_contract/created_data_contract/mod.rs index 4d3447ef55..4f41654c69 100644 --- a/packages/rs-dpp/src/data_contract/created_data_contract/mod.rs +++ b/packages/rs-dpp/src/data_contract/created_data_contract/mod.rs @@ -4,7 +4,7 @@ pub mod v0; use crate::data_contract::created_data_contract::v0::{ CreatedDataContractInSerializationFormatV0, CreatedDataContractV0, }; -use crate::prelude::DataContract; +use crate::prelude::{DataContract, IdentityNonce}; use crate::version::PlatformVersion; use crate::ProtocolError; use bincode::{Decode, Encode}; @@ -49,7 +49,7 @@ impl PlatformSerializableWithPlatformVersion for CreatedDataContract { self, platform_version: &PlatformVersion, ) -> Result, ProtocolError> { - let (data_contract, entropy) = self.data_contract_and_entropy_owned(); + let (data_contract, identity_nonce) = self.data_contract_and_identity_nonce(); let data_contract_serialization_format: DataContractInSerializationFormat = data_contract.try_into_platform_versioned(platform_version)?; let created_data_contract_in_serialization_format = match platform_version @@ -60,7 +60,7 @@ impl PlatformSerializableWithPlatformVersion for CreatedDataContract { 0 => Ok(CreatedDataContractInSerializationFormat::V0( CreatedDataContractInSerializationFormatV0 { data_contract: data_contract_serialization_format, - entropy_used: entropy, + identity_nonce, }, )), version => Err(ProtocolError::UnknownVersionMismatch { @@ -99,8 +99,8 @@ impl PlatformDeserializableWithPotentialValidationFromVersionedStructure for Cre )) })? .0; - let (data_contract_in_serialization_format, entropy) = - created_data_contract_in_serialization_format.data_contract_and_entropy_owned(); + let (data_contract_in_serialization_format, identity_nonce) = + created_data_contract_in_serialization_format.data_contract_and_identity_nonce_owned(); let data_contract = DataContract::try_from_platform_versioned( data_contract_in_serialization_format, validate, @@ -113,7 +113,7 @@ impl PlatformDeserializableWithPotentialValidationFromVersionedStructure for Cre { 0 => Ok(CreatedDataContract::V0(CreatedDataContractV0 { data_contract, - entropy_used: entropy, + identity_nonce, })), version => Err(ProtocolError::UnknownVersionMismatch { method: "CreatedDataContract::versioned_deserialize".to_string(), @@ -139,9 +139,9 @@ impl CreatedDataContract { } } - pub fn data_contract_and_entropy_owned(self) -> (DataContract, Bytes32) { + pub fn data_contract_and_identity_nonce(self) -> (DataContract, IdentityNonce) { match self { - CreatedDataContract::V0(v0) => (v0.data_contract, v0.entropy_used), + CreatedDataContract::V0(v0) => (v0.data_contract, v0.identity_nonce), } } @@ -157,28 +157,22 @@ impl CreatedDataContract { } } - pub fn entropy_used_owned(self) -> Bytes32 { + pub fn identity_nonce(&self) -> IdentityNonce { match self { - CreatedDataContract::V0(v0) => v0.entropy_used, - } - } - - pub fn entropy_used(&self) -> &Bytes32 { - match self { - CreatedDataContract::V0(v0) => &v0.entropy_used, + CreatedDataContract::V0(v0) => v0.identity_nonce, } } #[cfg(test)] - pub fn set_entropy_used(&mut self, entropy_used: Bytes32) { + pub fn set_identity_nonce(&mut self, identity_nonce: IdentityNonce) { match self { - CreatedDataContract::V0(v0) => v0.entropy_used = entropy_used, + CreatedDataContract::V0(v0) => v0.identity_nonce = identity_nonce, } } - pub fn from_contract_and_entropy( + pub fn from_contract_and_identity_nonce( data_contract: DataContract, - entropy: Bytes32, + identity_nonce: IdentityNonce, platform_version: &PlatformVersion, ) -> Result { match platform_version @@ -188,7 +182,7 @@ impl CreatedDataContract { { 0 => Ok(CreatedDataContractV0 { data_contract, - entropy_used: entropy, + identity_nonce, } .into()), version => Err(ProtocolError::UnknownVersionMismatch { @@ -223,9 +217,13 @@ impl CreatedDataContract { } impl CreatedDataContractInSerializationFormat { - pub fn data_contract_and_entropy_owned(self) -> (DataContractInSerializationFormat, Bytes32) { + pub fn data_contract_and_identity_nonce_owned( + self, + ) -> (DataContractInSerializationFormat, IdentityNonce) { match self { - CreatedDataContractInSerializationFormat::V0(v0) => (v0.data_contract, v0.entropy_used), + CreatedDataContractInSerializationFormat::V0(v0) => { + (v0.data_contract, v0.identity_nonce) + } } } } diff --git a/packages/rs-dpp/src/data_contract/created_data_contract/v0/mod.rs b/packages/rs-dpp/src/data_contract/created_data_contract/v0/mod.rs index 5b27c4b65b..dd99aecddf 100644 --- a/packages/rs-dpp/src/data_contract/created_data_contract/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/created_data_contract/v0/mod.rs @@ -3,24 +3,27 @@ use bincode::{Decode, Encode}; #[cfg(feature = "data-contract-value-conversion")] use crate::data_contract::conversion::value::v0::DataContractValueConversionMethodsV0; -use crate::data_contract::created_data_contract::fields::property_names::{DATA_CONTRACT, ENTROPY}; +use crate::data_contract::created_data_contract::fields::property_names::{ + DATA_CONTRACT, IDENTITY_NONCE, +}; use crate::data_contract::serialized_version::DataContractInSerializationFormat; +use crate::prelude::IdentityNonce; use crate::version::PlatformVersion; use crate::ProtocolError; use platform_value::btreemap_extensions::BTreeValueRemoveFromMapHelper; -use platform_value::{Bytes32, Error, Value}; +use platform_value::{Error, Value}; // TODO: Decide on what we need ExtendedDataContract with metadata or CreatedDataContract or both. #[derive(Clone, Debug, PartialEq)] pub struct CreatedDataContractV0 { pub data_contract: DataContract, - pub entropy_used: Bytes32, + pub identity_nonce: IdentityNonce, } #[derive(Clone, Debug, Encode, Decode)] pub struct CreatedDataContractInSerializationFormatV0 { pub data_contract: DataContractInSerializationFormat, - pub entropy_used: Bytes32, + pub identity_nonce: IdentityNonce, } impl CreatedDataContractV0 { @@ -38,8 +41,8 @@ impl CreatedDataContractV0 { Error::StructureError("unable to remove property dataContract".to_string()) })?; - let entropy_used = raw_map - .remove_bytes_32(ENTROPY) + let identity_nonce = raw_map + .remove_integer(IDENTITY_NONCE) .map_err(ProtocolError::ValueError)?; let data_contract = @@ -47,7 +50,7 @@ impl CreatedDataContractV0 { Ok(Self { data_contract, - entropy_used, + identity_nonce, }) } } diff --git a/packages/rs-dpp/src/data_contract/data_contract_facade.rs b/packages/rs-dpp/src/data_contract/data_contract_facade.rs index 2f5ea3178e..7a086a4d13 100644 --- a/packages/rs-dpp/src/data_contract/data_contract_facade.rs +++ b/packages/rs-dpp/src/data_contract/data_contract_facade.rs @@ -29,12 +29,9 @@ pub struct DataContractFacade { } impl DataContractFacade { - pub fn new( - protocol_version: u32, - entropy_generator: Option>, - ) -> Result { + pub fn new(protocol_version: u32) -> Result { Ok(Self { - factory: DataContractFactory::new(protocol_version, entropy_generator)?, + factory: DataContractFactory::new(protocol_version)?, }) } @@ -42,12 +39,18 @@ impl DataContractFacade { pub fn create( &self, owner_id: Identifier, + identity_nonce: IdentityNonce, documents: Value, config: Option, definitions: Option, ) -> Result { - self.factory - .create_with_value_config(owner_id, documents, config, definitions) + self.factory.create_with_value_config( + owner_id, + identity_nonce, + documents, + config, + definitions, + ) } /// Create Data Contract from plain object diff --git a/packages/rs-dpp/src/data_contract/factory/mod.rs b/packages/rs-dpp/src/data_contract/factory/mod.rs index ccca7d879b..10eff21751 100644 --- a/packages/rs-dpp/src/data_contract/factory/mod.rs +++ b/packages/rs-dpp/src/data_contract/factory/mod.rs @@ -37,16 +37,13 @@ pub enum DataContractFactory { impl DataContractFactory { /// Create a new data contract factory knowing versions - pub fn new( - protocol_version: u32, - entropy_generator: Option>, - ) -> Result { + pub fn new(protocol_version: u32) -> Result { let platform_version = PlatformVersion::get(protocol_version)?; match platform_version .platform_architecture .data_contract_factory_structure_version { - 0 => Ok(DataContractFactoryV0::new(protocol_version, entropy_generator).into()), + 0 => Ok(DataContractFactoryV0::new(protocol_version).into()), version => Err(ProtocolError::UnknownVersionMismatch { method: "DataContractFactory::new".to_string(), known_versions: vec![0], @@ -59,14 +56,19 @@ impl DataContractFactory { pub fn create_with_value_config( &self, owner_id: Identifier, + identity_nonce: IdentityNonce, documents: Value, config: Option, definitions: Option, ) -> Result { match self { - DataContractFactory::V0(v0) => { - v0.create_with_value_config(owner_id, documents, config, definitions) - } + DataContractFactory::V0(v0) => v0.create_with_value_config( + owner_id, + identity_nonce, + documents, + config, + definitions, + ), } } @@ -74,12 +76,15 @@ impl DataContractFactory { pub fn create( &self, owner_id: Identifier, + identity_nonce: IdentityNonce, documents: Value, config: Option, definitions: Option, ) -> Result { match self { - DataContractFactory::V0(v0) => v0.create(owner_id, documents, config, definitions), + DataContractFactory::V0(v0) => { + v0.create(owner_id, identity_nonce, documents, config, definitions) + } } } diff --git a/packages/rs-dpp/src/data_contract/factory/v0/mod.rs b/packages/rs-dpp/src/data_contract/factory/v0/mod.rs index 140404b2ea..51db4fd3dc 100644 --- a/packages/rs-dpp/src/data_contract/factory/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/factory/v0/mod.rs @@ -31,26 +31,18 @@ use crate::{errors::ProtocolError, prelude::Identifier}; pub struct DataContractFactoryV0 { /// The feature version used by this factory. protocol_version: u32, - - /// An EntropyGenerator for generating entropy during data contract creation. - entropy_generator: Box, } impl DataContractFactoryV0 { - pub fn new( - protocol_version: u32, - entropy_generator: Option>, - ) -> Self { - Self { - protocol_version, - entropy_generator: entropy_generator.unwrap_or(Box::new(DefaultEntropyGenerator)), - } + pub fn new(protocol_version: u32) -> Self { + Self { protocol_version } } /// Create Data Contract pub fn create_with_value_config( &self, owner_id: Identifier, + identity_nonce: IdentityNonce, documents: Value, config: Option, definitions: Option, @@ -61,23 +53,22 @@ impl DataContractFactoryV0 { let config = config .map(|config_value| DataContractConfig::from_value(config_value, platform_version)) .transpose()?; - self.create(owner_id, documents, config, definitions) + self.create(owner_id, identity_nonce, documents, config, definitions) } /// Create Data Contract pub fn create( &self, owner_id: Identifier, + identity_nonce: IdentityNonce, documents: Value, config: Option, definitions: Option, ) -> Result { - let entropy = Bytes32::new(self.entropy_generator.generate()?); - let platform_version = PlatformVersion::get(self.protocol_version)?; let data_contract_id = - DataContract::generate_data_contract_id_v0(owner_id.to_buffer(), entropy.to_buffer()); + DataContract::generate_data_contract_id_v0(owner_id.to_buffer(), identity_nonce); let defs = definitions .map(|defs| defs.into_btree_string_map()) @@ -100,7 +91,11 @@ impl DataContractFactoryV0 { let data_contract = DataContract::try_from_platform_versioned(format, true, platform_version)?; - CreatedDataContract::from_contract_and_entropy(data_contract, entropy, platform_version) + CreatedDataContract::from_contract_and_identity_nonce( + data_contract, + identity_nonce, + platform_version, + ) } #[cfg(feature = "data-contract-value-conversion")] @@ -222,14 +217,14 @@ mod tests { fn get_test_data() -> TestData { let platform_version = PlatformVersion::latest(); let created_data_contract = - get_data_contract_fixture(None, platform_version.protocol_version); + get_data_contract_fixture(None, 0, platform_version.protocol_version); let raw_data_contract = created_data_contract .data_contract() .to_value(platform_version) .unwrap(); - let factory = DataContractFactoryV0::new(platform_version.protocol_version, None); + let factory = DataContractFactoryV0::new(platform_version.protocol_version); TestData { created_data_contract, raw_data_contract, @@ -260,6 +255,7 @@ mod tests { let result = factory .create_with_value_config( data_contract.owner_id(), + 1, raw_documents, None, Some(raw_defs), @@ -341,7 +337,10 @@ mod tests { .expect("Data Contract Transition should be created"); assert_eq!(0, result.state_transition_protocol_version()); - assert_eq!(&created_data_contract.entropy_used(), &result.entropy()); + assert_eq!( + created_data_contract.identity_nonce(), + result.identity_nonce() + ); let contract_value = DataContract::try_from_platform_versioned( result.data_contract().to_owned(), diff --git a/packages/rs-dpp/src/data_contract/generate_data_contract.rs b/packages/rs-dpp/src/data_contract/generate_data_contract.rs index 3fe34a4ec2..9656708b33 100644 --- a/packages/rs-dpp/src/data_contract/generate_data_contract.rs +++ b/packages/rs-dpp/src/data_contract/generate_data_contract.rs @@ -1,4 +1,5 @@ use crate::data_contract::DataContract; +use crate::prelude::IdentityNonce; use platform_value::Identifier; use std::io::Write; @@ -8,11 +9,11 @@ impl DataContract { /// Generate data contract id based on owner id and entropy pub fn generate_data_contract_id_v0( owner_id: impl AsRef<[u8]>, - entropy: impl AsRef<[u8]>, + identity_nonce: IdentityNonce, ) -> Identifier { let mut b: Vec = vec![]; let _ = b.write(owner_id.as_ref()); - let _ = b.write(entropy.as_ref()); + let _ = b.write(identity_nonce.to_be_bytes().as_slice()); Identifier::from(hash_double(b)) } } diff --git a/packages/rs-dpp/src/data_contract/mod.rs b/packages/rs-dpp/src/data_contract/mod.rs index 312a3c6c38..3cc7cccbe2 100644 --- a/packages/rs-dpp/src/data_contract/mod.rs +++ b/packages/rs-dpp/src/data_contract/mod.rs @@ -285,8 +285,9 @@ mod tests { #[test] fn test_contract_can_have_specialized_contract_encryption_decryption_keys() { - let data_contract = get_dashpay_contract_with_generalized_encryption_key_fixture(None, 1) - .data_contract_owned(); + let data_contract = + get_dashpay_contract_with_generalized_encryption_key_fixture(None, 0, 1) + .data_contract_owned(); assert_eq!( data_contract .config() @@ -303,7 +304,7 @@ mod tests { #[test] fn test_contract_document_type_can_have_specialized_contract_encryption_decryption_keys() { - let data_contract = get_dashpay_contract_fixture(None, 1).data_contract_owned(); + let data_contract = get_dashpay_contract_fixture(None, 0, 1).data_contract_owned(); assert_eq!( data_contract .document_type_for_name("contactRequest") diff --git a/packages/rs-dpp/src/data_contract/state_transition/data_contract_create_transition/mod.rs b/packages/rs-dpp/src/data_contract/state_transition/data_contract_create_transition/mod.rs deleted file mode 100644 index 0869dd85e0..0000000000 --- a/packages/rs-dpp/src/data_contract/state_transition/data_contract_create_transition/mod.rs +++ /dev/null @@ -1,447 +0,0 @@ -use std::collections::BTreeMap; -use std::convert::TryInto; - -use crate::serialization_traits::PlatformSerializable; -use platform_serialization::PlatformSignable; -use platform_serialization::{PlatformDeserialize, PlatformSerialize}; - -use platform_value::btreemap_extensions::BTreeValueMapHelper; -use platform_value::btreemap_extensions::BTreeValueRemoveFromMapHelper; -use platform_value::{BinaryData, Bytes32, IntegerReplacementType, ReplacementType, Value}; -use serde::{Deserialize, Serialize}; -use serde_json::Value as JsonValue; - -use crate::{ - data_contract::DataContract, - identity::KeyID, - prelude::Identifier, - state_transition::{ - StateTransitionConvert, StateTransitionIdentitySigned, StateTransitionLike, - StateTransitionType, - }, - Convertible, ProtocolError, -}; - -use super::property_names::*; - -use crate::serialization_traits::{PlatformDeserializable, Signable}; - -use bincode::{config, Decode, Encode}; - -mod action; -pub mod apply_data_contract_create_transition_factory; -pub mod builder; -mod serialize_for_signing; -pub mod validation; - -pub use action::{ - DataContractCreateTransitionAction, DATA_CONTRACT_CREATE_TRANSITION_ACTION_VERSION, -}; - -pub mod property_names { - pub const PROTOCOL_VERSION: &str = "protocolVersion"; - pub const DATA_CONTRACT: &str = "dataContract"; - pub const DATA_CONTRACT_ID: &str = "dataContract.$id"; - pub const DATA_CONTRACT_OWNER_ID: &str = "dataContract.ownerId"; - pub const DATA_CONTRACT_ENTROPY: &str = "dataContract.entropy"; - pub const ENTROPY: &str = "entropy"; - pub const DATA_CONTRACT_PROTOCOL_VERSION: &str = "dataContract.protocolVersion"; - pub const SIGNATURE_PUBLIC_KEY_ID: &str = "signaturePublicKeyId"; - pub const SIGNATURE: &str = "signature"; -} - -pub const IDENTIFIER_FIELDS: [&str; 2] = [ - property_names::DATA_CONTRACT_ID, - property_names::DATA_CONTRACT_OWNER_ID, -]; -pub const BINARY_FIELDS: [&str; 3] = [ - property_names::ENTROPY, - property_names::DATA_CONTRACT_ENTROPY, - property_names::SIGNATURE, -]; -pub const U32_FIELDS: [&str; 2] = [ - property_names::PROTOCOL_VERSION, - property_names::DATA_CONTRACT_PROTOCOL_VERSION, -]; - -#[derive( - Debug, - Clone, - Serialize, - Deserialize, - Encode, - Decode, - PlatformDeserialize, - PlatformSerialize, - PartialEq, - PlatformSignable, -)] -#[serde(rename_all = "camelCase")] -#[platform_error_type(ProtocolError)] -pub struct DataContractCreateTransition { - pub protocol_version: u32, - #[serde(rename = "type")] - pub transition_type: StateTransitionType, - pub data_contract: DataContract, - pub entropy: Bytes32, - #[platform_signable(exclude_from_sig_hash)] - pub signature_public_key_id: KeyID, - #[platform_signable(exclude_from_sig_hash)] - pub signature: BinaryData, -} - -impl std::default::Default for DataContractCreateTransition { - fn default() -> Self { - DataContractCreateTransition { - protocol_version: Default::default(), - transition_type: StateTransitionType::DataContractCreate, - entropy: Bytes32::default(), - signature_public_key_id: 0, - signature: BinaryData::default(), - data_contract: Default::default(), - } - } -} - -impl DataContractCreateTransition { - pub fn from_raw_object( - mut raw_object: Value, - ) -> Result { - Ok(DataContractCreateTransition { - protocol_version: raw_object.get_integer(PROTOCOL_VERSION)?, - signature: raw_object - .remove_optional_binary_data(SIGNATURE) - .map_err(ProtocolError::ValueError)? - .unwrap_or_default(), - signature_public_key_id: raw_object - .get_optional_integer(SIGNATURE_PUBLIC_KEY_ID) - .map_err(ProtocolError::ValueError)? - .unwrap_or_default(), - entropy: raw_object - .remove_optional_bytes_32(ENTROPY) - .map_err(ProtocolError::ValueError)? - .unwrap_or_default(), - data_contract: DataContract::from_raw_object( - raw_object.remove(DATA_CONTRACT).map_err(|_| { - ProtocolError::DecodingError( - "data contract missing on state transition".to_string(), - ) - })?, - )?, - ..Default::default() - }) - } - - pub fn from_value_map( - mut raw_data_contract_create_transition: BTreeMap, - ) -> Result { - Ok(DataContractCreateTransition { - protocol_version: raw_data_contract_create_transition - .get_integer(PROTOCOL_VERSION) - .map_err(ProtocolError::ValueError)?, - signature: raw_data_contract_create_transition - .remove_optional_binary_data(SIGNATURE) - .map_err(ProtocolError::ValueError)? - .unwrap_or_default(), - signature_public_key_id: raw_data_contract_create_transition - .remove_optional_integer(SIGNATURE_PUBLIC_KEY_ID) - .map_err(ProtocolError::ValueError)? - .unwrap_or_default(), - entropy: raw_data_contract_create_transition - .remove_optional_bytes_32(ENTROPY) - .map_err(ProtocolError::ValueError)? - .unwrap_or_default(), - data_contract: DataContract::from_raw_object( - raw_data_contract_create_transition - .remove(DATA_CONTRACT) - .ok_or(ProtocolError::DecodingError( - "data contract missing on state transition".to_string(), - ))?, - )?, - ..Default::default() - }) - } - - pub fn get_data_contract(&self) -> &DataContract { - &self.data_contract - } - - pub fn get_protocol_version(&self) -> u32 { - self.protocol_version - } - - pub fn set_data_contract(&mut self, data_contract: DataContract) { - self.data_contract = data_contract; - } - - /// Returns ID of the created contract - pub fn get_modified_data_ids(&self) -> Vec { - vec![self.data_contract.id] - } - - pub fn clean_value(value: &mut Value) -> Result<(), platform_value::Error> { - value.replace_at_paths(IDENTIFIER_FIELDS, ReplacementType::Identifier)?; - value.replace_at_paths(BINARY_FIELDS, ReplacementType::BinaryBytes)?; - value.replace_integer_type_at_paths(U32_FIELDS, IntegerReplacementType::U32)?; - Ok(()) - } -} - -impl StateTransitionIdentitySigned for DataContractCreateTransition { - /// Get owner ID - fn get_owner_id(&self) -> &Identifier { - &self.data_contract.owner_id - } - - fn get_signature_public_key_id(&self) -> Option { - Some(self.signature_public_key_id) - } - - fn set_signature_public_key_id(&mut self, key_id: crate::identity::KeyID) { - self.signature_public_key_id = key_id - } -} - -impl StateTransitionLike for DataContractCreateTransition { - /// Returns ID of the created contract - fn get_modified_data_ids(&self) -> Vec { - vec![self.data_contract.id] - } - - fn get_protocol_version(&self) -> u32 { - self.protocol_version - } - /// returns the type of State Transition - fn get_type(&self) -> StateTransitionType { - self.transition_type - } - /// returns the signature as a byte-array - fn get_signature(&self) -> &BinaryData { - &self.signature - } - /// set a new signature - fn set_signature(&mut self, signature: BinaryData) { - self.signature = signature - } - - fn set_signature_bytes(&mut self, signature: Vec) { - self.signature = BinaryData::new(signature) - } -} - -impl StateTransitionConvert for DataContractCreateTransition { - fn signature_property_paths() -> Vec<&'static str> { - vec![SIGNATURE, SIGNATURE_PUBLIC_KEY_ID] - } - - fn identifiers_property_paths() -> Vec<&'static str> { - vec![] - } - - fn binary_property_paths() -> Vec<&'static str> { - vec![SIGNATURE, ENTROPY] - } - - fn to_json(&self, skip_signature: bool) -> Result { - self.to_cleaned_object(skip_signature) - .and_then(|value| value.try_into().map_err(ProtocolError::ValueError)) - } - - fn to_object(&self, skip_signature: bool) -> Result { - let mut object: Value = platform_value::to_value(self)?; - if skip_signature { - Self::signature_property_paths() - .into_iter() - .try_for_each(|path| { - object - .remove_values_matching_path(path) - .map_err(ProtocolError::ValueError) - .map(|_| ()) - })?; - } - object.insert(String::from(DATA_CONTRACT), self.data_contract.to_object()?)?; - Ok(object) - } - - fn to_cleaned_object(&self, skip_signature: bool) -> Result { - let mut object: Value = platform_value::to_value(self)?; - if skip_signature { - Self::signature_property_paths() - .into_iter() - .try_for_each(|path| { - object - .remove_values_matching_path(path) - .map_err(ProtocolError::ValueError) - .map(|_| ()) - })?; - } - object.insert( - String::from(DATA_CONTRACT), - self.data_contract.to_cleaned_object()?, - )?; - Ok(object) - } -} - -#[cfg(test)] -mod test { - use crate::data_contract::CreatedDataContract; - use integer_encoding::VarInt; - - use crate::tests::fixtures::get_data_contract_fixture; - use crate::util::json_value::JsonValueExt; - use crate::version; - - use super::*; - - struct TestData { - state_transition: DataContractCreateTransition, - created_data_contract: CreatedDataContract, - } - - fn get_test_data() -> TestData { - let created_data_contract = get_data_contract_fixture(None); - - let state_transition = DataContractCreateTransition::from_raw_object(Value::from([ - (PROTOCOL_VERSION, version::LATEST_VERSION.into()), - (ENTROPY, created_data_contract.entropy_used.into()), - ( - DATA_CONTRACT, - created_data_contract.data_contract.to_object().unwrap(), - ), - ])) - .expect("state transition should be created without errors"); - - TestData { - created_data_contract, - state_transition, - } - } - - #[test] - fn should_return_protocol_version() { - let data = get_test_data(); - assert_eq!( - version::LATEST_VERSION, - data.state_transition.get_protocol_version() - ) - } - - #[test] - fn should_return_transition_type() { - let data = get_test_data(); - assert_eq!( - StateTransitionType::DataContractCreate, - data.state_transition.get_type() - ); - } - - #[test] - fn should_return_data_contract() { - let data = get_test_data(); - - assert_eq!( - data.state_transition - .get_data_contract() - .to_json_object() - .expect("conversion to object shouldn't fail"), - data.created_data_contract - .data_contract - .to_json_object() - .expect("conversion to object shouldn't fail") - ); - } - - #[test] - fn should_return_state_transition_in_json_format() { - let data = get_test_data(); - let mut json_object = data - .state_transition - .to_json(false) - .expect("conversion to JSON shouldn't fail"); - - assert_eq!( - version::LATEST_VERSION, - json_object - .get_u64(PROTOCOL_VERSION) - .expect("the protocol version should be present") as u32 - ); - - assert_eq!( - 0, - json_object - .get_u64(TRANSITION_TYPE) - .expect("the transition type should be present") as u8 - ); - assert_eq!( - 0, - json_object - .get_u64(SIGNATURE_PUBLIC_KEY_ID) - .expect("default public key id should be defined"), - ); - assert_eq!( - "", - json_object - .remove_into::(SIGNATURE) - .expect("default string value for signature should be present") - ); - - assert_eq!( - >::into(data.created_data_contract.entropy_used), - json_object - .remove_into::(ENTROPY) - .expect("the entropy should be present") - ) - } - - #[test] - fn should_return_serialized_state_transition_to_buffer() { - let data = get_test_data(); - let state_transition_bytes = data - .state_transition - .to_cbor_buffer(false) - .expect("state transition should be converted to buffer"); - let (protocol_version, _) = - u32::decode_var(state_transition_bytes.as_ref()).expect("expected to decode"); - assert_eq!(version::LATEST_VERSION, protocol_version) - } - - #[test] - fn should_return_owner_id() { - let data = get_test_data(); - assert_eq!( - &data.created_data_contract.data_contract.owner_id, - data.state_transition.get_owner_id() - ); - } - - #[test] - fn is_data_contract_state_transition() { - let data = get_test_data(); - assert!(data.state_transition.is_data_contract_state_transition()); - assert!(!data.state_transition.is_document_state_transition()); - assert!(!data.state_transition.is_identity_state_transition()); - } - - mod platform_serializable { - use crate::data_contract::state_transition::data_contract_create_transition::DataContractCreateTransition; - use crate::serialization_traits::{PlatformDeserializable, PlatformSerializable}; - - #[test] - fn should_serialize_config() { - let mut data = super::get_test_data(); - data.state_transition.data_contract.config.keeps_history = true; - let state_transition_bytes = data - .state_transition - .serialize() - .expect("state transition should be serialized"); - - assert!(data.state_transition.data_contract.config.keeps_history); - - let restored = DataContractCreateTransition::deserialize(&state_transition_bytes) - .expect("state transition should be deserialized"); - - assert!(restored.data_contract.config.keeps_history); - } - } -} diff --git a/packages/rs-dpp/src/data_contract/v0/serialization/bincode.rs b/packages/rs-dpp/src/data_contract/v0/serialization/bincode.rs index da82005c7a..65d78beaa1 100644 --- a/packages/rs-dpp/src/data_contract/v0/serialization/bincode.rs +++ b/packages/rs-dpp/src/data_contract/v0/serialization/bincode.rs @@ -18,7 +18,7 @@ mod tests { let identity = Identity::random_identity(5, Some(5), platform_version) .expect("expected a random identity"); let contract = - get_data_contract_fixture(Some(identity.id()), platform_version.protocol_version) + get_data_contract_fixture(Some(identity.id()), 0, platform_version.protocol_version) .data_contract_owned(); let bytes = contract .serialize_to_bytes_with_platform_version(LATEST_PLATFORM_VERSION) diff --git a/packages/rs-dpp/src/document/extended_document/mod.rs b/packages/rs-dpp/src/document/extended_document/mod.rs index 393430ac62..41ed3b1d43 100644 --- a/packages/rs-dpp/src/document/extended_document/mod.rs +++ b/packages/rs-dpp/src/document/extended_document/mod.rs @@ -604,7 +604,7 @@ mod test { fn new_example_document() -> ExtendedDocument { let data_contract = - get_dashpay_contract_fixture(None, LATEST_PLATFORM_VERSION.protocol_version) + get_dashpay_contract_fixture(None, 0, LATEST_PLATFORM_VERSION.protocol_version) .data_contract_owned(); let document_type = data_contract .document_type_for_name("profile") diff --git a/packages/rs-dpp/src/state_transition/serialization.rs b/packages/rs-dpp/src/state_transition/serialization.rs index 777c8402d9..f966b90ebb 100644 --- a/packages/rs-dpp/src/state_transition/serialization.rs +++ b/packages/rs-dpp/src/state_transition/serialization.rs @@ -266,6 +266,7 @@ mod tests { .expect("expected a random identity"); let created_data_contract = get_data_contract_fixture( Some(identity.id()), + 0, LATEST_PLATFORM_VERSION.protocol_version, ); let data_contract_create_transition: DataContractCreateTransition = created_data_contract @@ -287,8 +288,7 @@ mod tests { let identity = Identity::random_identity(5, Some(5), platform_version) .expect("expected a random identity"); let mut created_data_contract = - get_data_contract_fixture(Some(identity.id()), platform_version.protocol_version); - created_data_contract.set_entropy_used(Default::default()); + get_data_contract_fixture(Some(identity.id()), 0, platform_version.protocol_version); let data_contract_update_transition = DataContractUpdateTransition::V0(DataContractUpdateTransitionV0 { identity_contract_nonce: 1, @@ -313,7 +313,7 @@ mod tests { let platform_version = PlatformVersion::latest(); let mut nonces = BTreeMap::new(); - let data_contract = get_data_contract_fixture(None, platform_version.protocol_version) + let data_contract = get_data_contract_fixture(None, 0, platform_version.protocol_version) .data_contract_owned(); let documents = get_extended_documents_fixture_with_owner_id_from_contract( &data_contract, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/common_fields.rs b/packages/rs-dpp/src/state_transition/state_transitions/common_fields.rs index 1ea713ff4e..9080f26523 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/common_fields.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/common_fields.rs @@ -1,7 +1,7 @@ pub mod property_names { pub const STATE_TRANSITION_PROTOCOL_VERSION: &str = "$version"; pub const IDENTITY_CONTRACT_NONCE: &str = "identityContractNonce"; - pub const ENTROPY: &str = "entropy"; + pub const IDENTITY_NONCE: &str = "identityNonce"; pub const SIGNATURE_PUBLIC_KEY_ID: &str = "signaturePublicKeyId"; pub const SIGNATURE: &str = "signature"; pub const TRANSITION_TYPE: &str = "type"; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/accessors/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/accessors/mod.rs index 9c94a83354..f25a78cd94 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/accessors/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/accessors/mod.rs @@ -2,6 +2,7 @@ mod v0; use crate::data_contract::serialized_version::DataContractInSerializationFormat; +use crate::prelude::IdentityNonce; use crate::state_transition::data_contract_create_transition::DataContractCreateTransition; use platform_value::Bytes32; pub use v0::*; @@ -13,9 +14,9 @@ impl DataContractCreateTransitionAccessorsV0 for DataContractCreateTransition { } } - fn entropy(&self) -> &Bytes32 { + fn identity_nonce(&self) -> IdentityNonce { match self { - DataContractCreateTransition::V0(transition) => &transition.entropy, + DataContractCreateTransition::V0(transition) => transition.identity_nonce, } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/accessors/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/accessors/v0/mod.rs index 81acd4abb1..ff7d28fb77 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/accessors/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/accessors/v0/mod.rs @@ -1,10 +1,10 @@ use crate::data_contract::serialized_version::DataContractInSerializationFormat; -use platform_value::Bytes32; +use crate::prelude::IdentityNonce; pub trait DataContractCreateTransitionAccessorsV0 { fn data_contract(&self) -> &DataContractInSerializationFormat; - fn entropy(&self) -> &Bytes32; + fn identity_nonce(&self) -> IdentityNonce; fn set_data_contract(&mut self, data_contract: DataContractInSerializationFormat); } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/fields.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/fields.rs index c49c87db81..6243063733 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/fields.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/fields.rs @@ -1,17 +1,18 @@ use crate::state_transition::state_transitions; pub use state_transitions::common_fields::property_names::{ - ENTROPY, SIGNATURE, SIGNATURE_PUBLIC_KEY_ID, STATE_TRANSITION_PROTOCOL_VERSION, + IDENTITY_NONCE, SIGNATURE, SIGNATURE_PUBLIC_KEY_ID, STATE_TRANSITION_PROTOCOL_VERSION, }; pub use state_transitions::contract::common_fields::property_names::{ - DATA_CONTRACT, DATA_CONTRACT_ENTROPY, DATA_CONTRACT_ID, DATA_CONTRACT_OWNER_ID, - DATA_CONTRACT_PROTOCOL_VERSION, + DATA_CONTRACT, DATA_CONTRACT_ID, DATA_CONTRACT_OWNER_ID, DATA_CONTRACT_PROTOCOL_VERSION, }; pub const IDENTIFIER_FIELDS: [&str; 2] = [DATA_CONTRACT_ID, DATA_CONTRACT_OWNER_ID]; -pub const BINARY_FIELDS: [&str; 3] = [ENTROPY, DATA_CONTRACT_ENTROPY, SIGNATURE]; +pub const BINARY_FIELDS: [&str; 1] = [SIGNATURE]; pub const U32_FIELDS: [&str; 2] = [ STATE_TRANSITION_PROTOCOL_VERSION, DATA_CONTRACT_PROTOCOL_VERSION, ]; + +pub const U64_FIELDS: [&str; 1] = [IDENTITY_NONCE]; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/json_conversion.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/json_conversion.rs index b843fef9cd..ccc91ff4ac 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/json_conversion.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/json_conversion.rs @@ -33,6 +33,7 @@ mod test { JsonStateTransitionSerializationOptions, StateTransitionJsonConvert, }; + use crate::prelude::IdentityNonce; use dpp::util::json_value::JsonValueExt; use platform_value::Bytes32; @@ -68,10 +69,10 @@ mod test { ); assert_eq!( - >::into(data.created_data_contract.entropy_used_owned()), + data.created_data_contract.identity_nonce(), json_object - .remove_into::(ENTROPY) - .expect("the entropy should be present") + .remove_into::(IDENTITY_NONCE) + .expect("the identity_nonce should be present") ) } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/methods/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/methods/mod.rs index 8dd8f194cd..b192abf21e 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/methods/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/methods/mod.rs @@ -5,19 +5,19 @@ pub use v0::*; use crate::data_contract::DataContract; use crate::identity::signer::Signer; use crate::identity::{KeyID, PartialIdentity}; +use crate::prelude::IdentityNonce; use crate::state_transition::data_contract_create_transition::{ DataContractCreateTransition, DataContractCreateTransitionV0, }; use crate::state_transition::StateTransition; use crate::version::FeatureVersion; use crate::ProtocolError; -use platform_value::Bytes32; use platform_version::version::PlatformVersion; impl DataContractCreateTransitionMethodsV0 for DataContractCreateTransition { fn new_from_data_contract( data_contract: DataContract, - entropy: Bytes32, + identity_nonce: IdentityNonce, identity: &PartialIdentity, key_id: KeyID, signer: &S, @@ -33,7 +33,7 @@ impl DataContractCreateTransitionMethodsV0 for DataContractCreateTransition { ) { 0 => DataContractCreateTransitionV0::new_from_data_contract( data_contract, - entropy, + identity_nonce, identity, key_id, signer, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/methods/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/methods/v0/mod.rs index 145a30ebc3..638a0d0295 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/methods/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/methods/v0/mod.rs @@ -2,10 +2,10 @@ use crate::data_contract::DataContract; use crate::identity::signer::Signer; use crate::identity::{KeyID, PartialIdentity}; +use crate::prelude::IdentityNonce; use crate::state_transition::StateTransition; use crate::version::FeatureVersion; use crate::ProtocolError; -use platform_value::Bytes32; use platform_version::version::PlatformVersion; pub trait DataContractCreateTransitionMethodsV0 { @@ -14,7 +14,7 @@ pub trait DataContractCreateTransitionMethodsV0 { /// # Arguments /// /// * `data_contract` - A mutable `DataContract` instance, to be used in the transition. - /// * `entropy` - A `Bytes32` value providing additional randomness. + /// * `identity_nonce` - A `IdentityNonce` value providing additional randomness. /// * `identity` - A reference to a `PartialIdentity` object. /// * `key_id` - A `KeyID` identifier for the public key used for signing the transition. /// * `signer` - A reference to an object implementing the `Signer` trait. @@ -28,7 +28,7 @@ pub trait DataContractCreateTransitionMethodsV0 { /// object. Otherwise, returns `ProtocolError`. fn new_from_data_contract( data_contract: DataContract, - entropy: Bytes32, + identity_nonce: IdentityNonce, identity: &PartialIdentity, key_id: KeyID, signer: &S, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/mod.rs index 79afdd41f2..bb2fb267bf 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/mod.rs @@ -4,7 +4,6 @@ mod identity_signed; #[cfg(feature = "state-transition-json-conversion")] mod json_conversion; pub mod methods; -mod serialize; mod state_transition_like; mod v0; #[cfg(feature = "state-transition-value-conversion")] @@ -135,7 +134,7 @@ impl StateTransitionFieldTypes for DataContractCreateTransition { } fn binary_property_paths() -> Vec<&'static str> { - vec![SIGNATURE, ENTROPY] + vec![SIGNATURE, IDENTITY_NONCE] } } @@ -171,7 +170,7 @@ mod test { } pub(crate) fn get_test_data() -> TestData { - let created_data_contract = get_data_contract_fixture(None, 1); + let created_data_contract = get_data_contract_fixture(None, 0, 1); let state_transition = DataContractCreateTransition::from_object( Value::from([ @@ -187,8 +186,8 @@ mod test { ), ), ( - ENTROPY, - Value::Bytes32(created_data_contract.entropy_used().to_buffer()), + IDENTITY_NONCE, + Value::U64(created_data_contract.identity_nonce()), ), ( DATA_CONTRACT, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/serialize.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/serialize.rs deleted file mode 100644 index bb8226a25a..0000000000 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/serialize.rs +++ /dev/null @@ -1,118 +0,0 @@ -// use crate::data_contract::property_names::ENTROPY; -// -// use crate::data_contract::DataContract; -// use crate::document::document_transition::document_base_transition::JsonValue; -// use crate::identity::KeyID; -// use crate::serialization::PlatformDeserializable; -// use crate::serialization::{PlatformSerializable, Signable}; -// use crate::state_transition::{StateTransitionFieldTypes, StateTransitionLike, StateTransitionType}; -// use crate::version::{PlatformVersion}; -// use crate::{ProtocolError}; -// use bincode::{config, Decode, Encode}; -// use derive_more::From; -// use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; -// use platform_versioning::PlatformVersioned; -// use platform_value::{BinaryData, Bytes32, Identifier, Value}; -// use serde::de::{MapAccess, Visitor}; -// use serde::ser::SerializeMap; -// use serde::{Deserialize, Deserializer, Serialize, Serializer}; -// -// use std::fmt; -// use crate::data_contract::state_transition::property_names::{SIGNATURE, SIGNATURE_PUBLIC_KEY_ID}; -// use crate::state_transition::data_contract_create_transition::{DataContractCreateTransition, DataContractCreateTransitionV0}; -// -// impl Serialize for DataContractCreateTransition { -// fn serialize(&self, serializer: S) -> Result -// where -// S: Serializer, -// { -// let mut state = serializer.serialize_map(None)?; -// -// match *self { -// DataContractCreateTransition::V0(ref v0) => { -// state.serialize_entry("type", &StateTransitionType::DataContractCreate)?; -// state.serialize_entry("version", &0u16)?; -// state.serialize_entry("dataContract", &v0.data_contract)?; -// state.serialize_entry("entropy", &v0.entropy)?; -// state.serialize_entry("signaturePublicKeyId", &v0.signature_public_key_id)?; -// state.serialize_entry("signature", &v0.signature)?; -// } -// } -// -// state.end() -// } -// } -// -// struct DataContractCreateTransitionVisitor; -// -// impl<'de> Visitor<'de> for DataContractCreateTransitionVisitor { -// type Value = DataContractCreateTransition; -// -// fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { -// formatter.write_str("a map representing a DataContractCreateTransition") -// } -// -// fn visit_map(self, mut map: A) -> Result -// where -// A: MapAccess<'de>, -// { -// let mut version: Option = None; -// let mut data_contract: Option = None; -// let mut entropy: Option = None; -// let mut signature_public_key_id: Option = None; -// let mut signature: Option = None; -// -// while let Some(key) = map.next_key()? { -// match key { -// "version" => { -// version = Some(map.next_value()?); -// } -// "dataContract" => { -// data_contract = Some(map.next_value()?); -// } -// "entropy" => { -// entropy = Some(map.next_value()?); -// } -// "signaturePublicKeyId" => { -// signature_public_key_id = Some(map.next_value()?); -// } -// "signature" => { -// signature = Some(map.next_value()?); -// } -// _ => {} -// } -// } -// -// let version = version.ok_or_else(|| serde::de::Error::missing_field("version"))?; -// let data_contract = -// data_contract.ok_or_else(|| serde::de::Error::missing_field("dataContract"))?; -// let entropy = entropy.ok_or_else(|| serde::de::Error::missing_field("entropy"))?; -// let signature_public_key_id = signature_public_key_id -// .ok_or_else(|| serde::de::Error::missing_field("signaturePublicKeyId"))?; -// let signature = signature.ok_or_else(|| serde::de::Error::missing_field("signature"))?; -// -// match version { -// 0 => Ok(DataContractCreateTransition::V0( -// DataContractCreateTransitionV0 { -// data_contract, -// entropy, -// signature_public_key_id, -// signature, -// }, -// )), -// _ => Err(serde::de::Error::unknown_variant( -// &format!("{}", version), -// &[], -// )), -// } -// } -// } -// -// impl<'de> Deserialize<'de> for DataContractCreateTransition { -// fn deserialize(deserializer: D) -> Result -// where -// D: Deserializer<'de>, -// { -// deserializer.deserialize_map(DataContractCreateTransitionVisitor) -// } -// } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/mod.rs index 67e6986e82..72bd31f8b7 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/mod.rs @@ -17,6 +17,7 @@ use crate::{data_contract::DataContract, identity::KeyID, ProtocolError}; use crate::data_contract::created_data_contract::CreatedDataContract; use crate::data_contract::serialized_version::DataContractInSerializationFormat; +use crate::prelude::IdentityNonce; use crate::state_transition::data_contract_create_transition::DataContractCreateTransition; use bincode::{Decode, Encode}; use platform_version::{TryFromPlatformVersioned, TryIntoPlatformVersioned}; @@ -34,7 +35,7 @@ use crate::version::PlatformVersion; )] pub struct DataContractCreateTransitionV0 { pub data_contract: DataContractInSerializationFormat, - pub entropy: Bytes32, + pub identity_nonce: IdentityNonce, #[platform_signable(exclude_from_sig_hash)] pub signature_public_key_id: KeyID, #[platform_signable(exclude_from_sig_hash)] @@ -64,7 +65,7 @@ impl TryFromPlatformVersioned for DataContractCreateTransitionV0 { ) -> Result { Ok(DataContractCreateTransitionV0 { data_contract: value.try_into_platform_versioned(platform_version)?, - entropy: Default::default(), + identity_nonce: Default::default(), signature_public_key_id: 0, signature: Default::default(), }) @@ -78,10 +79,10 @@ impl TryFromPlatformVersioned for DataContractCreateTransit value: CreatedDataContract, platform_version: &PlatformVersion, ) -> Result { - let (data_contract, entropy) = value.data_contract_and_entropy_owned(); + let (data_contract, identity_nonce) = value.data_contract_and_identity_nonce(); Ok(DataContractCreateTransitionV0 { data_contract: data_contract.try_into_platform_versioned(platform_version)?, - entropy, + identity_nonce, signature_public_key_id: 0, signature: Default::default(), }) diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/types.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/types.rs index 7e07594821..7f3304ab27 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/types.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/types.rs @@ -1,6 +1,6 @@ use crate::state_transition::data_contract_create_transition::DataContractCreateTransitionV0; use crate::state_transition::state_transitions::common_fields::property_names::{ - ENTROPY, SIGNATURE, SIGNATURE_PUBLIC_KEY_ID, + SIGNATURE, SIGNATURE_PUBLIC_KEY_ID, }; use crate::state_transition::StateTransitionFieldTypes; @@ -14,6 +14,6 @@ impl StateTransitionFieldTypes for DataContractCreateTransitionV0 { } fn binary_property_paths() -> Vec<&'static str> { - vec![SIGNATURE, ENTROPY] + vec![SIGNATURE] } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/v0_methods.rs index e6dca9e356..7284f655fc 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/v0_methods.rs @@ -12,6 +12,7 @@ use crate::data_contract::accessors::v0::DataContractV0Setters; use crate::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; use crate::identity::signer::Signer; use crate::identity::PartialIdentity; +use crate::prelude::IdentityNonce; use crate::state_transition::data_contract_create_transition::methods::DataContractCreateTransitionMethodsV0; use crate::state_transition::data_contract_create_transition::DataContractCreateTransition; use platform_version::version::PlatformVersion; @@ -23,7 +24,7 @@ use crate::version::FeatureVersion; impl DataContractCreateTransitionMethodsV0 for DataContractCreateTransitionV0 { fn new_from_data_contract( mut data_contract: DataContract, - entropy: Bytes32, + identity_nonce: IdentityNonce, identity: &PartialIdentity, key_id: KeyID, signer: &S, @@ -32,14 +33,14 @@ impl DataContractCreateTransitionMethodsV0 for DataContractCreateTransitionV0 { ) -> Result { data_contract.set_id(DataContract::generate_data_contract_id_v0( identity.id, - entropy, + identity_nonce, )); data_contract.set_owner_id(identity.id); let transition = DataContractCreateTransition::V0(DataContractCreateTransitionV0 { data_contract: data_contract.try_into_platform_versioned(platform_version)?, - entropy: entropy, // Why was this default before? It would produce a mismatched contract ID error + identity_nonce, signature_public_key_id: key_id, signature: Default::default(), }); diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/value_conversion.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/value_conversion.rs index be5c2ec193..64af95bf2c 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/value_conversion.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/value_conversion.rs @@ -27,8 +27,8 @@ impl<'a> StateTransitionValueConvert<'a> for DataContractCreateTransitionV0 { .get_optional_integer(SIGNATURE_PUBLIC_KEY_ID) .map_err(ProtocolError::ValueError)? .unwrap_or_default(), - entropy: raw_object - .remove_optional_bytes_32(ENTROPY) + identity_nonce: raw_object + .get_optional_integer(IDENTITY_NONCE) .map_err(ProtocolError::ValueError)? .unwrap_or_default(), data_contract: DataContract::from_value( @@ -57,8 +57,8 @@ impl<'a> StateTransitionValueConvert<'a> for DataContractCreateTransitionV0 { .remove_optional_integer(SIGNATURE_PUBLIC_KEY_ID) .map_err(ProtocolError::ValueError)? .unwrap_or_default(), - entropy: raw_value_map - .remove_optional_bytes_32(ENTROPY) + identity_nonce: raw_value_map + .remove_optional_integer(IDENTITY_NONCE) .map_err(ProtocolError::ValueError)? .unwrap_or_default(), data_contract: DataContract::from_value( diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/fields.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/fields.rs index da8815abc1..90fc0adf6a 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/fields.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/fields.rs @@ -2,7 +2,8 @@ use crate::state_transition::state_transitions; use crate::state_transition::state_transitions::contract::common_fields::property_names::IDENTITY_CONTRACT_NONCE; pub use state_transitions::common_fields::property_names::{ - ENTROPY, SIGNATURE, SIGNATURE_PUBLIC_KEY_ID, STATE_TRANSITION_PROTOCOL_VERSION, TRANSITION_TYPE, + IDENTITY_NONCE, SIGNATURE, SIGNATURE_PUBLIC_KEY_ID, STATE_TRANSITION_PROTOCOL_VERSION, + TRANSITION_TYPE, }; pub use state_transitions::contract::common_fields::property_names::{ DATA_CONTRACT, DATA_CONTRACT_ENTROPY, DATA_CONTRACT_ID, DATA_CONTRACT_OWNER_ID, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/mod.rs index dee347eedc..a1b6314940 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/mod.rs @@ -124,7 +124,7 @@ mod test { fn get_test_data() -> TestData { let platform_version = PlatformVersion::first(); - let data_contract = get_data_contract_fixture(None, platform_version.protocol_version) + let data_contract = get_data_contract_fixture(None, 0, platform_version.protocol_version) .data_contract_owned(); let state_transition: DataContractUpdateTransition = (data_contract.clone(), 1) diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/fields.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/fields.rs index 8bcc2affc8..06f39e42fc 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/fields.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/fields.rs @@ -5,7 +5,8 @@ use crate::state_transition::documents_batch_transition::fields::property_names: OWNER_ID, TRANSITIONS_DATA_CONTRACT_ID, TRANSITIONS_ID, }; pub use state_transitions::common_fields::property_names::{ - ENTROPY, SIGNATURE, SIGNATURE_PUBLIC_KEY_ID, STATE_TRANSITION_PROTOCOL_VERSION, TRANSITION_TYPE, + IDENTITY_NONCE, SIGNATURE, SIGNATURE_PUBLIC_KEY_ID, STATE_TRANSITION_PROTOCOL_VERSION, + TRANSITION_TYPE, }; pub mod property_names { diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/fields.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/fields.rs index 5107fcbe3c..6b5813e902 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/fields.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/fields.rs @@ -2,7 +2,8 @@ use crate::state_transition::state_transitions; use crate::state_transition::identity_credit_transfer_transition::fields::property_names::RECIPIENT_ID; pub use state_transitions::common_fields::property_names::{ - ENTROPY, SIGNATURE, SIGNATURE_PUBLIC_KEY_ID, STATE_TRANSITION_PROTOCOL_VERSION, TRANSITION_TYPE, + IDENTITY_NONCE, SIGNATURE, SIGNATURE_PUBLIC_KEY_ID, STATE_TRANSITION_PROTOCOL_VERSION, + TRANSITION_TYPE, }; pub use state_transitions::identity::common_fields::property_names::IDENTITY_ID; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/fields.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/fields.rs index 2b2b09ca23..2d7db38ece 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/fields.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/fields.rs @@ -1,7 +1,8 @@ use crate::state_transition::state_transitions; pub use state_transitions::common_fields::property_names::{ - ENTROPY, SIGNATURE, SIGNATURE_PUBLIC_KEY_ID, STATE_TRANSITION_PROTOCOL_VERSION, TRANSITION_TYPE, + IDENTITY_NONCE, SIGNATURE, SIGNATURE_PUBLIC_KEY_ID, STATE_TRANSITION_PROTOCOL_VERSION, + TRANSITION_TYPE, }; pub use state_transitions::identity::common_fields::property_names::{ ASSET_LOCK_PROOF, IDENTITY_ID, PUBLIC_KEYS, PUBLIC_KEYS_DATA, PUBLIC_KEYS_SIGNATURE, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/fields.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/fields.rs index 673ff93b7d..338100d928 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/fields.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/fields.rs @@ -4,8 +4,8 @@ use crate::state_transition::identity_update_transition::fields::property_names: ADD_PUBLIC_KEYS_DATA, ADD_PUBLIC_KEYS_SIGNATURE, }; pub use state_transitions::common_fields::property_names::{ - ENTROPY, REVISION, SIGNATURE, SIGNATURE_PUBLIC_KEY_ID, STATE_TRANSITION_PROTOCOL_VERSION, - TRANSITION_TYPE, + IDENTITY_NONCE, REVISION, SIGNATURE, SIGNATURE_PUBLIC_KEY_ID, + STATE_TRANSITION_PROTOCOL_VERSION, TRANSITION_TYPE, }; pub use state_transitions::identity::common_fields::property_names::IDENTITY_ID; diff --git a/packages/rs-dpp/src/system_data_contracts.rs b/packages/rs-dpp/src/system_data_contracts.rs index 3007df8bc4..dab3df0c55 100644 --- a/packages/rs-dpp/src/system_data_contracts.rs +++ b/packages/rs-dpp/src/system_data_contracts.rs @@ -27,6 +27,7 @@ fn create_data_contract( let mut data_contract = factory.create_with_value_config( owner_id, + 0, document_schemas.into(), None, definitions.map(|def| def.into()), @@ -42,7 +43,7 @@ pub fn load_system_data_contract( system_contract: SystemDataContract, platform_version: &PlatformVersion, ) -> Result { - let factory = DataContractFactory::new(platform_version.protocol_version, None)?; + let factory = DataContractFactory::new(platform_version.protocol_version)?; create_data_contract(&factory, system_contract, platform_version) } @@ -51,7 +52,7 @@ pub fn load_system_data_contracts( system_contracts: BTreeSet, platform_version: &PlatformVersion, ) -> Result, ProtocolError> { - let factory = DataContractFactory::new(platform_version.protocol_version, None)?; + let factory = DataContractFactory::new(platform_version.protocol_version)?; system_contracts .into_iter() diff --git a/packages/rs-dpp/src/tests/fixtures/get_dashpay_contract_fixture.rs b/packages/rs-dpp/src/tests/fixtures/get_dashpay_contract_fixture.rs index 8f0866fe09..b4aed770c2 100644 --- a/packages/rs-dpp/src/tests/fixtures/get_dashpay_contract_fixture.rs +++ b/packages/rs-dpp/src/tests/fixtures/get_dashpay_contract_fixture.rs @@ -4,15 +4,16 @@ use crate::{ }; use crate::data_contract::created_data_contract::CreatedDataContract; +use crate::prelude::IdentityNonce; use data_contracts::SystemDataContract; use platform_version::version::PlatformVersion; pub fn get_dashpay_contract_fixture( owner_id: Option, + identity_nonce: IdentityNonce, protocol_version: u32, ) -> CreatedDataContract { - let factory = - DataContractFactory::new(protocol_version, None).expect("expected to create factory"); + let factory = DataContractFactory::new(protocol_version).expect("expected to create factory"); let platform_version = PlatformVersion::get(protocol_version).expect("expected to get version"); @@ -23,6 +24,6 @@ pub fn get_dashpay_contract_fixture( let owner_id = owner_id.unwrap_or_else(generate_random_identifier_struct); factory - .create_with_value_config(owner_id, dpns_schema.into(), None, None) + .create_with_value_config(owner_id, identity_nonce, dpns_schema.into(), None, None) .expect("data in fixture should be correct") } diff --git a/packages/rs-dpp/src/tests/fixtures/get_dashpay_contract_with_generalized_encryption_key_fixture.rs b/packages/rs-dpp/src/tests/fixtures/get_dashpay_contract_with_generalized_encryption_key_fixture.rs index 9d58df2e70..f018d69a58 100644 --- a/packages/rs-dpp/src/tests/fixtures/get_dashpay_contract_with_generalized_encryption_key_fixture.rs +++ b/packages/rs-dpp/src/tests/fixtures/get_dashpay_contract_with_generalized_encryption_key_fixture.rs @@ -6,15 +6,16 @@ use crate::{ use crate::data_contract::config::v0::DataContractConfigV0; use crate::data_contract::created_data_contract::CreatedDataContract; use crate::data_contract::storage_requirements::keys_for_document_type::StorageKeyRequirements; +use crate::prelude::IdentityNonce; use data_contracts::SystemDataContract; use platform_version::version::PlatformVersion; pub fn get_dashpay_contract_with_generalized_encryption_key_fixture( owner_id: Option, + identity_nonce: IdentityNonce, protocol_version: u32, ) -> CreatedDataContract { - let factory = - DataContractFactory::new(protocol_version, None).expect("expected to create factory"); + let factory = DataContractFactory::new(protocol_version).expect("expected to create factory"); let platform_version = PlatformVersion::get(protocol_version).expect("expected to get version"); @@ -27,6 +28,7 @@ pub fn get_dashpay_contract_with_generalized_encryption_key_fixture( factory .create( owner_id, + identity_nonce, dpns_schema.into(), Some( DataContractConfigV0 { diff --git a/packages/rs-dpp/src/tests/fixtures/get_dashpay_document_fixture.rs b/packages/rs-dpp/src/tests/fixtures/get_dashpay_document_fixture.rs index 78d33da4ae..7c8fe9a581 100644 --- a/packages/rs-dpp/src/tests/fixtures/get_dashpay_document_fixture.rs +++ b/packages/rs-dpp/src/tests/fixtures/get_dashpay_document_fixture.rs @@ -9,14 +9,17 @@ use super::get_dashpay_contract_fixture; #[cfg(feature = "extended-document")] use crate::document::ExtendedDocument; +use crate::prelude::IdentityNonce; pub fn get_contact_request_document_fixture( owner_id: Option, + identity_nonce: IdentityNonce, additional_data: Option, protocol_version: u32, ) -> Document { let owner_id = owner_id.unwrap_or_else(generate_random_identifier_struct); - let data_contract = get_dashpay_contract_fixture(None, protocol_version).data_contract_owned(); + let data_contract = + get_dashpay_contract_fixture(None, identity_nonce, protocol_version).data_contract_owned(); let factory = DocumentFactory::new(protocol_version) .expect("expected to create factory for get_contact_request_document_fixture"); @@ -41,11 +44,13 @@ pub fn get_contact_request_document_fixture( #[cfg(feature = "extended-document")] pub fn get_contact_request_extended_document_fixture( owner_id: Option, + identity_nonce: IdentityNonce, additional_data: Option, protocol_version: u32, ) -> ExtendedDocument { let owner_id = owner_id.unwrap_or_else(generate_random_identifier_struct); - let data_contract = get_dashpay_contract_fixture(None, protocol_version).data_contract_owned(); + let data_contract = + get_dashpay_contract_fixture(None, identity_nonce, protocol_version).data_contract_owned(); let factory = DocumentFactory::new(protocol_version).expect("expected document factory"); diff --git a/packages/rs-dpp/src/tests/fixtures/get_data_contract.rs b/packages/rs-dpp/src/tests/fixtures/get_data_contract.rs index 4770ebede1..b53a078675 100644 --- a/packages/rs-dpp/src/tests/fixtures/get_data_contract.rs +++ b/packages/rs-dpp/src/tests/fixtures/get_data_contract.rs @@ -8,6 +8,7 @@ use crate::{ pub fn get_data_contract_fixture( owner_id: Option, + identity_nonce: IdentityNonce, protocol_version: u32, ) -> CreatedDataContract { let defs = platform_value!( @@ -284,12 +285,11 @@ pub fn get_data_contract_fixture( } }); - let factory = - DataContractFactory::new(protocol_version, None).expect("expected to create a factory"); + let factory = DataContractFactory::new(protocol_version).expect("expected to create a factory"); let owner_id = owner_id.unwrap_or_else(generate_random_identifier_struct); factory - .create_with_value_config(owner_id, documents, None, Some(defs)) + .create_with_value_config(owner_id, identity_nonce, documents, None, Some(defs)) .expect("data in fixture should be correct") } diff --git a/packages/rs-dpp/src/tests/fixtures/get_dpns_data_contract.rs b/packages/rs-dpp/src/tests/fixtures/get_dpns_data_contract.rs index 77e1467973..56a36dd445 100644 --- a/packages/rs-dpp/src/tests/fixtures/get_dpns_data_contract.rs +++ b/packages/rs-dpp/src/tests/fixtures/get_dpns_data_contract.rs @@ -8,9 +8,10 @@ use crate::tests::utils::generate_random_identifier_struct; pub fn get_dpns_data_contract_fixture( owner_id: Option, + identity_nonce: IdentityNonce, protocol_version: u32, ) -> CreatedDataContract { - let factory = DataContractFactory::new(protocol_version, None) + let factory = DataContractFactory::new(protocol_version) .expect("expected to create a factory for get_dpns_data_contract_fixture"); let owner_id = owner_id.unwrap_or_else(generate_random_identifier_struct); @@ -26,6 +27,12 @@ pub fn get_dpns_data_contract_fixture( //Todo create config factory - .create_with_value_config(owner_id, document_schemas.into(), None, None) + .create_with_value_config( + owner_id, + identity_nonce, + document_schemas.into(), + None, + None, + ) .expect("data in fixture should be correct") } diff --git a/packages/rs-dpp/src/tests/fixtures/get_dpns_document_fixture.rs b/packages/rs-dpp/src/tests/fixtures/get_dpns_document_fixture.rs index ab9b000eb7..d68f1d0842 100644 --- a/packages/rs-dpp/src/tests/fixtures/get_dpns_document_fixture.rs +++ b/packages/rs-dpp/src/tests/fixtures/get_dpns_document_fixture.rs @@ -11,11 +11,13 @@ use super::get_dpns_data_contract_fixture; #[cfg(feature = "extended-document")] use crate::document::ExtendedDocument; +use crate::prelude::IdentityNonce; use crate::util::strings::convert_to_homograph_safe_chars; pub struct ParentDocumentOptions { pub label: String, pub owner_id: Identifier, + pub identity_nonce: IdentityNonce, } impl Default for ParentDocumentOptions { @@ -23,6 +25,7 @@ impl Default for ParentDocumentOptions { Self { label: String::from("Parent"), owner_id: generate_random_identifier_struct(), + identity_nonce: 0, } } } @@ -31,7 +34,11 @@ pub fn get_dpns_parent_document_fixture( options: ParentDocumentOptions, protocol_version: u32, ) -> Document { - let data_contract = get_dpns_data_contract_fixture(Some(options.owner_id), protocol_version); + let data_contract = get_dpns_data_contract_fixture( + Some(options.owner_id), + options.identity_nonce, + protocol_version, + ); let document_factory = DocumentFactory::new(protocol_version).expect("expected to get document factory"); let mut pre_order_salt = [0u8; 32]; @@ -79,7 +86,11 @@ pub fn get_dpns_parent_extended_document_fixture( options: ParentDocumentOptions, protocol_version: u32, ) -> ExtendedDocument { - let data_contract = get_dpns_data_contract_fixture(Some(options.owner_id), protocol_version); + let data_contract = get_dpns_data_contract_fixture( + Some(options.owner_id), + options.identity_nonce, + protocol_version, + ); let document_factory = DocumentFactory::new(protocol_version).expect("expected to get document factory"); let mut pre_order_salt = [0u8; 32]; diff --git a/packages/rs-dpp/src/tests/json_document.rs b/packages/rs-dpp/src/tests/json_document.rs index 9fb9de83bc..d3f021f450 100644 --- a/packages/rs-dpp/src/tests/json_document.rs +++ b/packages/rs-dpp/src/tests/json_document.rs @@ -8,7 +8,7 @@ use crate::data_contract::created_data_contract::CreatedDataContract; use crate::data_contract::document_type::accessors::DocumentTypeV0Getters; use crate::data_contract::document_type::DocumentTypeRef; use crate::document::{Document, DocumentV0}; -use crate::prelude::DataContract; +use crate::prelude::{DataContract, IdentityNonce}; #[cfg(feature = "data-contract-cbor-conversion")] use crate::util::cbor_serializer::serializable_value_to_cbor; use crate::version::PlatformVersion; @@ -80,6 +80,7 @@ pub fn json_document_to_contract( /// Reads a JSON file and converts it a contract. pub fn json_document_to_created_contract( path: impl AsRef, + identity_nonce: IdentityNonce, validate: bool, platform_version: &PlatformVersion, ) -> Result { @@ -87,7 +88,7 @@ pub fn json_document_to_created_contract( Ok(CreatedDataContractV0 { data_contract, - entropy_used: Default::default(), + identity_nonce, } .into()) } diff --git a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs index 4fefd56cbf..0f6146e3b2 100644 --- a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs @@ -326,7 +326,7 @@ mod tests { } .into(); - let dashpay = get_dashpay_contract_fixture(Some(identity.id()), protocol_version); + let dashpay = get_dashpay_contract_fixture(Some(identity.id()), 1, protocol_version); let mut create_contract_state_transition: StateTransition = dashpay .try_into_platform_versioned(platform_version) .expect("expected a state transition"); @@ -430,7 +430,7 @@ mod tests { } .into(); - let dashpay = get_dashpay_contract_fixture(Some(identity.id()), protocol_version); + let dashpay = get_dashpay_contract_fixture(Some(identity.id()), 1, protocol_version); let mut create_contract_state_transition: StateTransition = dashpay .try_into_platform_versioned(platform_version) .expect("expected a state transition"); @@ -560,7 +560,7 @@ mod tests { .expect("serialized state transition"); let dashpay = - get_dashpay_contract_fixture(Some(identity.id()), platform_version.protocol_version); + get_dashpay_contract_fixture(Some(identity.id()), 1, platform_version.protocol_version); let dashpay_contract = dashpay.data_contract().clone(); let mut create_contract_state_transition: StateTransition = dashpay .try_into_platform_versioned(platform_version) diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs index d69426a0b2..c25b7382ed 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs @@ -340,6 +340,9 @@ impl StateTransitionNonceValidationV0 for StateTransition { StateTransition::DocumentsBatch(st) => { st.validate_nonces(platform, block_info, tx, platform_version) } + StateTransition::DataContractCreate(st) => { + st.validate_nonces(platform, block_info, tx, platform_version) + } StateTransition::DataContractUpdate(st) => { st.validate_nonces(platform, block_info, tx, platform_version) } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/identity_nonce/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/identity_nonce/mod.rs new file mode 100644 index 0000000000..28a7bbe9a4 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/identity_nonce/mod.rs @@ -0,0 +1,40 @@ +use crate::error::execution::ExecutionError; +use crate::error::Error; +use crate::execution::validation::state_transition::data_contract_create::identity_nonce::v0::DataContractCreateTransitionIdentityNonceV0; +use crate::execution::validation::state_transition::processor::v0::StateTransitionNonceValidationV0; +use crate::platform_types::platform::PlatformStateRef; +use dpp::block::block_info::BlockInfo; +use dpp::state_transition::data_contract_create_transition::DataContractCreateTransition; +use dpp::validation::SimpleConsensusValidationResult; +use dpp::version::PlatformVersion; +use drive::grovedb::TransactionArg; + +pub(crate) mod v0; +impl StateTransitionNonceValidationV0 for DataContractCreateTransition { + fn validate_nonces( + &self, + platform: &PlatformStateRef, + block_info: &BlockInfo, + tx: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result { + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .contract_create_state_transition + .nonce + { + Some(0) => self.validate_nonce_v0(platform, block_info, tx, platform_version), + Some(version) => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "data contract create transition: validate_nonces".to_string(), + known_versions: vec![0], + received: version, + })), + None => Err(Error::Execution(ExecutionError::VersionNotActive { + method: "data contract create transition: validate_nonces".to_string(), + known_versions: vec![0], + })), + } + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/identity_nonce/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/identity_nonce/v0/mod.rs new file mode 100644 index 0000000000..07ceddc454 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/identity_nonce/v0/mod.rs @@ -0,0 +1,50 @@ +use crate::error::Error; +use dpp::block::block_info::BlockInfo; +use dpp::identity::identity_nonce::{validate_identity_nonce_update, validate_new_identity_nonce}; +use dpp::state_transition::data_contract_create_transition::accessors::DataContractCreateTransitionAccessorsV0; +use dpp::state_transition::data_contract_create_transition::DataContractCreateTransition; + +use dpp::validation::SimpleConsensusValidationResult; + +use crate::platform_types::platform::PlatformStateRef; +use dpp::version::PlatformVersion; +use drive::grovedb::TransactionArg; + +pub(in crate::execution::validation::state_transition::state_transitions) trait DataContractCreateTransitionIdentityNonceV0 +{ + fn validate_nonce_v0( + &self, + platform: &PlatformStateRef, + block_info: &BlockInfo, + tx: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result; +} + +impl DataContractCreateTransitionIdentityNonceV0 for DataContractCreateTransition { + fn validate_nonce_v0( + &self, + platform: &PlatformStateRef, + block_info: &BlockInfo, + tx: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result { + let revision_nonce = self.identity_nonce(); + let identity_id = self.data_contract().owner_id(); + let (existing_nonce, fees) = platform.drive.fetch_identity_nonce_with_fees( + identity_id.to_buffer(), + block_info, + true, + tx, + platform_version, + )?; + + let result = if let Some(existing_nonce) = existing_nonce { + validate_identity_nonce_update(existing_nonce, revision_nonce, identity_id) + } else { + validate_new_identity_nonce(revision_nonce, identity_id) + }; + + Ok(result) + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs index 2d0e113f94..9ad789d320 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs @@ -1,3 +1,4 @@ +mod identity_nonce; mod state; mod structure; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/structure/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/structure/v0/mod.rs index 7975efbe6b..4f7a248d35 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/structure/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/structure/v0/mod.rs @@ -42,7 +42,7 @@ impl DataContractCreatedStateTransitionStructureValidationV0 for DataContractCre // Validate data contract id let generated_id = DataContract::generate_data_contract_id_v0( self.data_contract().owner_id(), - self.entropy(), + self.identity_nonce(), ); if generated_id != self.data_contract().id() { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs index 0e5422a85d..1017a908ce 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs @@ -93,7 +93,7 @@ mod tests { fn setup_test() -> TestData { let platform_version = PlatformVersion::latest(); - let data_contract = get_data_contract_fixture(None, platform_version.protocol_version) + let data_contract = get_data_contract_fixture(None, 0, platform_version.protocol_version) .data_contract_owned(); let config = PlatformConfig { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/v0/mod.rs index 6d3b949629..766537be43 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/v0/mod.rs @@ -181,6 +181,7 @@ mod test { let mut contact_request_document = get_contact_request_document_fixture( None, + 0, None, state_read_guard.current_protocol_version_in_consensus(), ); @@ -188,7 +189,7 @@ mod test { let owner_id = &contact_request_document.owner_id(); let data_contract = - get_dashpay_contract_fixture(None, protocol_version).data_contract_owned(); + get_dashpay_contract_fixture(None, 0, protocol_version).data_contract_owned(); let document_type = data_contract .document_type_for_name("contactRequest") .expect("expected a contact request"); @@ -271,6 +272,7 @@ mod test { let mut contact_request_document = get_contact_request_document_fixture( None, + 0, None, state_write_guard.current_protocol_version_in_consensus(), ); @@ -279,6 +281,7 @@ mod test { let data_contract = get_dashpay_contract_fixture( None, + 0, state_write_guard.current_protocol_version_in_consensus(), ) .data_contract_owned(); @@ -387,11 +390,13 @@ mod test { let contact_request_document = get_contact_request_document_fixture( None, + 0, None, state_write_guard.current_protocol_version_in_consensus(), ); let data_contract = get_dashpay_contract_fixture( None, + 0, state_write_guard.current_protocol_version_in_consensus(), ) .data_contract_owned(); diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs index d423daac40..c1d1904bd1 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs @@ -469,6 +469,7 @@ mod test { ); let data_contract = get_dpns_data_contract_fixture( Some(owner_id), + 0, state_read_guard.current_protocol_version_in_consensus(), ) .data_contract_owned(); diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs index 3e025af278..4c4a93467f 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs @@ -167,7 +167,7 @@ mod tests { let platform_version = state_read_guard.current_platform_version().unwrap(); let transition_execution_context = StateTransitionExecutionContextV0::default(); - let data_contract = get_data_contract_fixture(None, platform_version.protocol_version) + let data_contract = get_data_contract_fixture(None, 0, platform_version.protocol_version) .data_contract_owned(); let owner_id = data_contract.owner_id(); diff --git a/packages/rs-drive-abci/src/query/mod.rs b/packages/rs-drive-abci/src/query/mod.rs index ff6eed94d7..8e8c1dcced 100644 --- a/packages/rs-drive-abci/src/query/mod.rs +++ b/packages/rs-drive-abci/src/query/mod.rs @@ -1980,7 +1980,8 @@ mod tests { fn test_absent_document_type() { let (platform, version) = super::setup_platform(); - let created_data_contract = get_data_contract_fixture(None, version.protocol_version); + let created_data_contract = + get_data_contract_fixture(None, 0, version.protocol_version); store_data_contract(&platform, created_data_contract.data_contract(), version); let data_contract_id = created_data_contract.data_contract().id(); @@ -2017,7 +2018,8 @@ mod tests { fn test_invalid_where_clause() { let (platform, version) = super::setup_platform(); - let created_data_contract = get_data_contract_fixture(None, version.protocol_version); + let created_data_contract = + get_data_contract_fixture(None, 0, version.protocol_version); store_data_contract(&platform, created_data_contract.data_contract(), version); let data_contract_id = created_data_contract.data_contract().id(); @@ -2049,7 +2051,8 @@ mod tests { fn test_invalid_order_by_clause() { let (platform, version) = super::setup_platform(); - let created_data_contract = get_data_contract_fixture(None, version.protocol_version); + let created_data_contract = + get_data_contract_fixture(None, 0, version.protocol_version); store_data_contract(&platform, created_data_contract.data_contract(), version); let data_contract_id = created_data_contract.data_contract().id(); @@ -2081,7 +2084,8 @@ mod tests { fn test_invalid_start_at_clause() { let (platform, version) = super::setup_platform(); - let created_data_contract = get_data_contract_fixture(None, version.protocol_version); + let created_data_contract = + get_data_contract_fixture(None, 0, version.protocol_version); store_data_contract(&platform, created_data_contract.data_contract(), version); let data_contract_id = created_data_contract.data_contract().id(); @@ -2113,7 +2117,8 @@ mod tests { fn test_invalid_start_after_clause() { let (platform, version) = super::setup_platform(); - let created_data_contract = get_data_contract_fixture(None, version.protocol_version); + let created_data_contract = + get_data_contract_fixture(None, 0, version.protocol_version); store_data_contract(&platform, created_data_contract.data_contract(), version); let data_contract_id = created_data_contract.data_contract().id(); @@ -2145,7 +2150,8 @@ mod tests { fn test_invalid_limit() { let (platform, version) = super::setup_platform(); - let created_data_contract = get_data_contract_fixture(None, version.protocol_version); + let created_data_contract = + get_data_contract_fixture(None, 0, version.protocol_version); store_data_contract(&platform, created_data_contract.data_contract(), version); let data_contract_id = created_data_contract.data_contract().id(); @@ -2178,7 +2184,8 @@ mod tests { fn test_documents_not_found() { let (platform, version) = super::setup_platform(); - let created_data_contract = get_data_contract_fixture(None, version.protocol_version); + let created_data_contract = + get_data_contract_fixture(None, 0, version.protocol_version); store_data_contract(&platform, created_data_contract.data_contract(), version); let data_contract_id = created_data_contract.data_contract().id(); @@ -2229,7 +2236,8 @@ mod tests { fn test_documents_absence_proof() { let (platform, version) = super::setup_platform(); - let created_data_contract = get_data_contract_fixture(None, version.protocol_version); + let created_data_contract = + get_data_contract_fixture(None, 0, version.protocol_version); store_data_contract(&platform, created_data_contract.data_contract(), version); let data_contract_id = created_data_contract.data_contract().id(); diff --git a/packages/rs-drive-abci/src/query/v0/mod.rs b/packages/rs-drive-abci/src/query/v0/mod.rs index f888ea37f4..01c62e8172 100644 --- a/packages/rs-drive-abci/src/query/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/v0/mod.rs @@ -105,7 +105,7 @@ mod test { .expect("expected to get platform version"); drop(state); let mut data_contract = - get_data_contract_fixture(None, current_protocol_version).data_contract_owned(); + get_data_contract_fixture(None, 0, current_protocol_version).data_contract_owned(); data_contract.config_mut().set_keeps_history(true); data_contract.config_mut().set_readonly(false); diff --git a/packages/rs-drive-abci/tests/strategy_tests/failures.rs b/packages/rs-drive-abci/tests/strategy_tests/failures.rs index 0aa9d010a7..6b6aa1cfde 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/failures.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/failures.rs @@ -33,6 +33,7 @@ mod tests { let platform_version = PlatformVersion::latest(); let contract = json_document_to_created_contract( "tests/supporting_files/contract/dashpay/dashpay-contract-all-mutable.json", + 1, true, platform_version, ) @@ -40,6 +41,7 @@ mod tests { let mut contract_update_1 = json_document_to_created_contract( "tests/supporting_files/contract/dashpay/dashpay-contract-all-mutable-bad-update-skipped-position.json", + 2, false, platform_version, ) diff --git a/packages/rs-drive-abci/tests/strategy_tests/main.rs b/packages/rs-drive-abci/tests/strategy_tests/main.rs index 8fd51b80f4..8eaa79fda2 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/main.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/main.rs @@ -1162,6 +1162,7 @@ mod tests { let platform_version = PlatformVersion::latest(); let contract = json_document_to_created_contract( "tests/supporting_files/contract/dashpay/dashpay-contract-all-mutable.json", + 1, true, platform_version, ) @@ -1241,6 +1242,7 @@ mod tests { let platform_version = PlatformVersion::latest(); let contract = json_document_to_created_contract( "tests/supporting_files/contract/dashpay/dashpay-contract-all-mutable.json", + 1, true, platform_version, ) @@ -1248,6 +1250,7 @@ mod tests { let mut contract_update_1 = json_document_to_created_contract( "tests/supporting_files/contract/dashpay/dashpay-contract-all-mutable-update-1.json", + 1, true, platform_version, ) @@ -1258,6 +1261,7 @@ mod tests { let mut contract_update_2 = json_document_to_created_contract( "tests/supporting_files/contract/dashpay/dashpay-contract-all-mutable-update-2.json", + 1, true, platform_version, ) @@ -1345,6 +1349,7 @@ mod tests { let platform_version = PlatformVersion::latest(); let created_contract = json_document_to_created_contract( "tests/supporting_files/contract/dashpay/dashpay-contract-all-mutable.json", + 1, true, platform_version, ) @@ -1420,6 +1425,7 @@ mod tests { let platform_version = PlatformVersion::latest(); let created_contract = json_document_to_created_contract( "tests/supporting_files/contract/dashpay/dashpay-contract-all-mutable.json", + 1, true, platform_version, ) @@ -1505,6 +1511,7 @@ mod tests { let platform_version = PlatformVersion::latest(); let created_contract = json_document_to_created_contract( "tests/supporting_files/contract/dashpay/dashpay-contract-all-mutable.json", + 1, true, platform_version, ) @@ -1608,6 +1615,7 @@ mod tests { let platform_version = PlatformVersion::latest(); let created_contract = json_document_to_created_contract( "tests/supporting_files/contract/dashpay/dashpay-contract-all-mutable.json", + 1, true, platform_version, ) @@ -1715,7 +1723,7 @@ mod tests { .unwrap() .unwrap() ), - "edf712041923f8707e2b9b21a876cdc70a26dca939a0a28bfdd1802bfba9ca6a".to_string() + "8f55b983f206f005897ce067091f144787b21d7c840c47d49fdba5edae3645c5".to_string() ) } @@ -1725,6 +1733,7 @@ mod tests { let platform_version = PlatformVersion::latest(); let created_contract = json_document_to_created_contract( "tests/supporting_files/contract/dashpay/dashpay-contract-all-mutable.json", + 1, true, platform_version, ) @@ -1835,7 +1844,7 @@ mod tests { .unwrap() .unwrap() ), - "7e870501f9fa6d0d7794407c787c1017dfc97afc59dffa166a561335ff5043cc".to_string() + "6b5f954928a3f477b9371106f9594046ae3e059bf7eecf60f5f80f59719b8361".to_string() ) } @@ -1845,6 +1854,7 @@ mod tests { let platform_version = PlatformVersion::latest(); let created_contract = json_document_to_created_contract( "tests/supporting_files/contract/dashpay/dashpay-contract-all-mutable.json", + 1, true, platform_version, ) @@ -1954,6 +1964,7 @@ mod tests { let platform_version = PlatformVersion::latest(); let created_contract = json_document_to_created_contract( "tests/supporting_files/contract/dashpay/dashpay-contract-all-mutable.json", + 1, true, platform_version, ) @@ -2063,6 +2074,7 @@ mod tests { let platform_version = PlatformVersion::latest(); let created_contract = json_document_to_created_contract( "tests/supporting_files/contract/dashpay/dashpay-contract-all-mutable.json", + 1, true, platform_version, ) @@ -2170,6 +2182,7 @@ mod tests { let platform_version = PlatformVersion::latest(); let created_contract = json_document_to_created_contract( "tests/supporting_files/contract/dashpay/dashpay-contract-all-mutable.json", + 1, true, platform_version, ) diff --git a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs index 760f456852..ad802e8be2 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs @@ -383,13 +383,14 @@ impl NetworkStrategy { .clone() .into_partial_identity_info(); - let entropy_used = *created_contract.entropy_used(); + let identity_nonce = created_contract.identity_nonce(); let contract = created_contract.data_contract_mut(); contract.set_owner_id(identity.id); let old_id = contract.id(); - let new_id = DataContract::generate_data_contract_id_v0(identity.id, entropy_used); + let new_id = + DataContract::generate_data_contract_id_v0(identity.id, identity_nonce); contract.set_id(new_id); if let Some(contract_updates) = contract_updates { @@ -417,7 +418,7 @@ impl NetworkStrategy { let state_transition = DataContractCreateTransition::new_from_data_contract( contract.clone(), - *created_contract.entropy_used(), + identity_nonce, &identity, 1, //key id 1 should always be a high or critical auth key in these tests signer, diff --git a/packages/rs-drive/src/drive/batch/transitions/contract/data_contract_create_transition.rs b/packages/rs-drive/src/drive/batch/transitions/contract/data_contract_create_transition.rs index 3005ee1f1d..ed1a3d1b81 100644 --- a/packages/rs-drive/src/drive/batch/transitions/contract/data_contract_create_transition.rs +++ b/packages/rs-drive/src/drive/batch/transitions/contract/data_contract_create_transition.rs @@ -1,9 +1,10 @@ use crate::drive::batch::transitions::DriveHighLevelOperationConverter; -use crate::drive::batch::DriveOperation::DataContractOperation; -use crate::drive::batch::{DataContractOperationType, DriveOperation}; +use crate::drive::batch::DriveOperation::{DataContractOperation, IdentityOperation}; +use crate::drive::batch::{DataContractOperationType, DriveOperation, IdentityOperationType}; use crate::error::Error; use crate::state_transition_action::contract::data_contract_create::DataContractCreateTransitionAction; use dpp::block::epoch::Epoch; +use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::version::PlatformVersion; use std::borrow::Cow; @@ -14,6 +15,14 @@ impl DriveHighLevelOperationConverter for DataContractCreateTransitionAction { _platform_version: &PlatformVersion, ) -> Result>, Error> { let mut drive_operations = vec![]; + + drive_operations.push(IdentityOperation( + IdentityOperationType::UpdateIdentityNonce { + identity_id: self.data_contract_ref().owner_id().into_buffer(), + nonce: self.identity_nonce(), + }, + )); + // We must create the contract drive_operations.push(DataContractOperation( DataContractOperationType::ApplyContract { diff --git a/packages/rs-drive/src/drive/contract/contract_fetch_info.rs b/packages/rs-drive/src/drive/contract/contract_fetch_info.rs index 42d865b78f..1c48af9538 100644 --- a/packages/rs-drive/src/drive/contract/contract_fetch_info.rs +++ b/packages/rs-drive/src/drive/contract/contract_fetch_info.rs @@ -2,6 +2,7 @@ use crate::drive::flags::StorageFlags; use dpp::data_contract::DataContract; use dpp::data_contracts; use dpp::fee::fee_result::FeeResult; +use dpp::prelude::IdentityNonce; use dpp::system_data_contracts::load_system_data_contract; #[cfg(feature = "fixtures-and-mocks")] use dpp::tests::fixtures::get_dashpay_contract_fixture; @@ -32,7 +33,7 @@ pub struct DataContractFetchInfo { impl DataContractFetchInfo { /// This should ONLY be used for tests pub fn dpns_contract_fixture(protocol_version: u32) -> Self { - let dpns = get_dpns_data_contract_fixture(None, protocol_version); + let dpns = get_dpns_data_contract_fixture(None, 0, protocol_version); DataContractFetchInfo { contract: dpns.data_contract_owned(), storage_flags: None, @@ -43,7 +44,7 @@ impl DataContractFetchInfo { /// This should ONLY be used for tests pub fn dashpay_contract_fixture(protocol_version: u32) -> Self { - let dashpay = get_dashpay_contract_fixture(None, protocol_version); + let dashpay = get_dashpay_contract_fixture(None, 0, protocol_version); DataContractFetchInfo { contract: dashpay.data_contract_owned(), storage_flags: None, diff --git a/packages/rs-drive/src/drive/contract/get_fetch/fetch_contract_with_history/mod.rs b/packages/rs-drive/src/drive/contract/get_fetch/fetch_contract_with_history/mod.rs index 473a187dd6..38d4a790fd 100644 --- a/packages/rs-drive/src/drive/contract/get_fetch/fetch_contract_with_history/mod.rs +++ b/packages/rs-drive/src/drive/contract/get_fetch/fetch_contract_with_history/mod.rs @@ -250,7 +250,7 @@ mod tests { fn setup_test() -> TestData { let data_contract = - get_data_contract_fixture(None, PlatformVersion::latest().protocol_version) + get_data_contract_fixture(None, 0, PlatformVersion::latest().protocol_version) .data_contract_owned(); TestData { diff --git a/packages/rs-drive/src/drive/contract/mod.rs b/packages/rs-drive/src/drive/contract/mod.rs index f6aa60708e..a1e8a8370e 100644 --- a/packages/rs-drive/src/drive/contract/mod.rs +++ b/packages/rs-drive/src/drive/contract/mod.rs @@ -168,7 +168,7 @@ mod tests { let platform_version = PlatformVersion::latest(); // let's construct the grovedb structure for the dashpay data contract - let contract = get_dashpay_contract_fixture(None, 1).data_contract_owned(); + let contract = get_dashpay_contract_fixture(None, 0, 1).data_contract_owned(); drive .apply_contract( &contract, @@ -189,7 +189,7 @@ mod tests { let platform_version = PlatformVersion::latest(); // let's construct the grovedb structure for the dashpay data contract - let contract = get_dashpay_contract_with_generalized_encryption_key_fixture(None, 1) + let contract = get_dashpay_contract_with_generalized_encryption_key_fixture(None, 0, 1) .data_contract_owned(); drive .apply_contract( diff --git a/packages/rs-drive/src/drive/document/insert/mod.rs b/packages/rs-drive/src/drive/document/insert/mod.rs index 618d66c5e9..6fb720e255 100644 --- a/packages/rs-drive/src/drive/document/insert/mod.rs +++ b/packages/rs-drive/src/drive/document/insert/mod.rs @@ -881,7 +881,7 @@ mod tests { let platform_version = PlatformVersion::latest(); let created_contract = - get_dpns_data_contract_fixture(None, platform_version.protocol_version); + get_dpns_data_contract_fixture(None, 0, platform_version.protocol_version); drive .apply_contract( diff --git a/packages/rs-drive/src/drive/document/update/mod.rs b/packages/rs-drive/src/drive/document/update/mod.rs index 0f3d59b32d..cef2ccfd6c 100644 --- a/packages/rs-drive/src/drive/document/update/mod.rs +++ b/packages/rs-drive/src/drive/document/update/mod.rs @@ -1824,11 +1824,10 @@ mod tests { } }); - let factory = DataContractFactory::new(1, Some(Box::new(TestEntropyGenerator::new()))) - .expect("expected to create factory"); + let factory = DataContractFactory::new(1).expect("expected to create factory"); let contract = factory - .create_with_value_config(owner_id, documents, None, None) + .create_with_value_config(owner_id, 0, documents, None, None) .expect("data in fixture should be correct") .data_contract_owned(); diff --git a/packages/rs-drive/src/query/mod.rs b/packages/rs-drive/src/query/mod.rs index 6c5cf265ba..e2038a8d98 100644 --- a/packages/rs-drive/src/query/mod.rs +++ b/packages/rs-drive/src/query/mod.rs @@ -2047,7 +2047,7 @@ mod tests { #[test] fn test_drive_query_from_to_cbor() { let config = DriveConfig::default(); - let contract = get_data_contract_fixture(None, 1).data_contract_owned(); + let contract = get_data_contract_fixture(None, 0, 1).data_contract_owned(); let document_type = contract .document_type_for_name("niceDocument") .expect("expected to get nice document"); @@ -2100,7 +2100,7 @@ mod tests { ["lastName", "asc"], ] }); - let contract = get_data_contract_fixture(None, 1).data_contract_owned(); + let contract = get_data_contract_fixture(None, 0, 1).data_contract_owned(); let document_type = contract .document_type_for_name("niceDocument") .expect("expected to get nice document"); @@ -2129,7 +2129,7 @@ mod tests { ], "invalid": 0, }); - let contract = get_data_contract_fixture(None, 1).data_contract_owned(); + let contract = get_data_contract_fixture(None, 0, 1).data_contract_owned(); let document_type = contract .document_type_for_name("niceDocument") .expect("expected to get nice document"); @@ -2159,7 +2159,7 @@ mod tests { ], }); - let contract = get_data_contract_fixture(None, 1).data_contract_owned(); + let contract = get_data_contract_fixture(None, 0, 1).data_contract_owned(); let document_type = contract .document_type_for_name("niceDocument") .expect("expected to get nice document"); @@ -2189,7 +2189,7 @@ mod tests { ], }); - let contract = get_data_contract_fixture(None, 1).data_contract_owned(); + let contract = get_data_contract_fixture(None, 0, 1).data_contract_owned(); let document_type = contract .document_type_for_name("niceDocument") .expect("expected to get nice document"); @@ -2218,7 +2218,7 @@ mod tests { ["lastName", "asc"], ], }); - let contract = get_data_contract_fixture(None, 1).data_contract_owned(); + let contract = get_data_contract_fixture(None, 0, 1).data_contract_owned(); let document_type = contract .document_type_for_name("niceDocument") .expect("expected to get nice document"); @@ -2484,7 +2484,7 @@ mod tests { ], }); - let contract = get_data_contract_fixture(None, 1).data_contract_owned(); + let contract = get_data_contract_fixture(None, 0, 1).data_contract_owned(); let document_type = contract .document_type_for_name("niceDocument") .expect("expected to get nice document"); @@ -2512,7 +2512,7 @@ mod tests { ], }); - let contract = get_data_contract_fixture(None, 1).data_contract_owned(); + let contract = get_data_contract_fixture(None, 0, 1).data_contract_owned(); let document_type = contract .document_type_for_name("niceDocument") .expect("expected to get nice document"); @@ -2540,7 +2540,7 @@ mod tests { ], }); - let contract = get_data_contract_fixture(None, 1).data_contract_owned(); + let contract = get_data_contract_fixture(None, 0, 1).data_contract_owned(); let document_type = contract .document_type_for_name("niceDocument") .expect("expected to get nice document"); @@ -2568,7 +2568,7 @@ mod tests { ], }); - let contract = get_data_contract_fixture(None, 1).data_contract_owned(); + let contract = get_data_contract_fixture(None, 0, 1).data_contract_owned(); let document_type = contract .document_type_for_name("niceDocument") .expect("expected to get nice document"); diff --git a/packages/rs-drive/src/query/test_index.rs b/packages/rs-drive/src/query/test_index.rs index c66862fbb7..cb635cf7f1 100644 --- a/packages/rs-drive/src/query/test_index.rs +++ b/packages/rs-drive/src/query/test_index.rs @@ -93,7 +93,7 @@ mod tests { #[test] fn test_find_best_index() { let document_type = construct_indexed_document_type(); - let contract = get_dpns_data_contract_fixture(None, 1).data_contract_owned(); + let contract = get_dpns_data_contract_fixture(None, 0, 1).data_contract_owned(); let platform_version = PlatformVersion::latest(); @@ -140,7 +140,7 @@ mod tests { #[test] fn test_find_best_index_error() { let document_type = construct_indexed_document_type(); - let contract = get_dpns_data_contract_fixture(None, 1).data_contract_owned(); + let contract = get_dpns_data_contract_fixture(None, 0, 1).data_contract_owned(); let platform_version = PlatformVersion::latest(); diff --git a/packages/rs-drive/src/state_transition_action/contract/data_contract_create/mod.rs b/packages/rs-drive/src/state_transition_action/contract/data_contract_create/mod.rs index 62005f277a..8cd8754991 100644 --- a/packages/rs-drive/src/state_transition_action/contract/data_contract_create/mod.rs +++ b/packages/rs-drive/src/state_transition_action/contract/data_contract_create/mod.rs @@ -6,6 +6,7 @@ pub mod v0; use crate::state_transition_action::contract::data_contract_create::v0::DataContractCreateTransitionActionV0; use derive_more::From; use dpp::data_contract::DataContract; +use dpp::prelude::IdentityNonce; /// data contract create transition action #[derive(Debug, Clone, From)] @@ -27,4 +28,11 @@ impl DataContractCreateTransitionAction { DataContractCreateTransitionAction::V0(transition) => &transition.data_contract, } } + + /// identity nonce + pub fn identity_nonce(&self) -> IdentityNonce { + match self { + DataContractCreateTransitionAction::V0(transition) => transition.identity_nonce, + } + } } diff --git a/packages/rs-drive/src/state_transition_action/contract/data_contract_create/v0/mod.rs b/packages/rs-drive/src/state_transition_action/contract/data_contract_create/v0/mod.rs index 814cc31646..955583b913 100644 --- a/packages/rs-drive/src/state_transition_action/contract/data_contract_create/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/contract/data_contract_create/v0/mod.rs @@ -2,10 +2,13 @@ pub mod transformer; use dpp::data_contract::DataContract; +use dpp::prelude::IdentityNonce; /// data contract create transition action v0 #[derive(Debug, Clone)] pub struct DataContractCreateTransitionActionV0 { /// data contract pub data_contract: DataContract, + /// identity nonce + pub identity_nonce: IdentityNonce, } diff --git a/packages/rs-drive/src/state_transition_action/contract/data_contract_create/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/contract/data_contract_create/v0/transformer.rs index 2abf633324..01851b398b 100644 --- a/packages/rs-drive/src/state_transition_action/contract/data_contract_create/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/contract/data_contract_create/v0/transformer.rs @@ -20,6 +20,7 @@ impl TryFromPlatformVersioned true, platform_version, )?, + identity_nonce: value.identity_nonce, }) } } @@ -39,6 +40,7 @@ impl TryFromPlatformVersioned<&DataContractCreateTransitionV0> true, platform_version, )?, + identity_nonce: value.identity_nonce, }) } } diff --git a/packages/rs-drive/tests/query_tests.rs b/packages/rs-drive/tests/query_tests.rs index 966136f105..a031dd9952 100644 --- a/packages/rs-drive/tests/query_tests.rs +++ b/packages/rs-drive/tests/query_tests.rs @@ -4855,11 +4855,11 @@ fn test_query_a_b_c_d_e_contract() { } }); - let factory = DataContractFactory::new(platform_version.protocol_version, None) - .expect("should create factory"); + let factory = + DataContractFactory::new(platform_version.protocol_version).expect("should create factory"); let contract = factory - .create_with_value_config(owner_id, documents, None, None) + .create_with_value_config(owner_id, 0, documents, None, None) .expect("data in fixture should be correct") .data_contract_owned(); diff --git a/packages/rs-platform-version/src/version/mocks/v2_test.rs b/packages/rs-platform-version/src/version/mocks/v2_test.rs index 6bd9dda39e..d9a376fa1e 100644 --- a/packages/rs-platform-version/src/version/mocks/v2_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v2_test.rs @@ -610,7 +610,7 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { advanced_structure: None, identity_signatures: Some(0), balance: None, - nonce: None, + nonce: Some(0), state: 0, transform_into_action: 0, }, @@ -629,7 +629,7 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { advanced_structure: None, identity_signatures: None, balance: Some(0), - nonce: None, + nonce: Some(0), state: 0, transform_into_action: 0, }, @@ -639,7 +639,7 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { advanced_structure: None, identity_signatures: None, balance: Some(0), - nonce: None, + nonce: Some(0), state: 0, transform_into_action: 0, }, @@ -648,7 +648,7 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { advanced_structure: None, identity_signatures: None, balance: None, - nonce: None, + nonce: Some(0), state: 0, transform_into_action: 0, }, diff --git a/packages/rs-platform-version/src/version/mocks/v3_test.rs b/packages/rs-platform-version/src/version/mocks/v3_test.rs index cc1ae0aff4..062b39f61e 100644 --- a/packages/rs-platform-version/src/version/mocks/v3_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v3_test.rs @@ -610,7 +610,7 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { advanced_structure: None, identity_signatures: Some(0), balance: None, - nonce: None, + nonce: Some(0), state: 0, transform_into_action: 0, }, @@ -629,7 +629,7 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { advanced_structure: None, identity_signatures: None, balance: Some(0), - nonce: None, + nonce: Some(0), state: 0, transform_into_action: 0, }, @@ -639,7 +639,7 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { advanced_structure: None, identity_signatures: None, balance: Some(0), - nonce: None, + nonce: Some(0), state: 0, transform_into_action: 0, }, @@ -648,7 +648,7 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { advanced_structure: None, identity_signatures: None, balance: None, - nonce: None, + nonce: Some(0), state: 0, transform_into_action: 0, }, diff --git a/packages/rs-platform-version/src/version/v1.rs b/packages/rs-platform-version/src/version/v1.rs index 260717cce4..aa267f3674 100644 --- a/packages/rs-platform-version/src/version/v1.rs +++ b/packages/rs-platform-version/src/version/v1.rs @@ -645,7 +645,7 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { advanced_structure: None, identity_signatures: None, balance: None, - nonce: None, + nonce: Some(0), state: 0, transform_into_action: 0, }, diff --git a/packages/rs-sdk/src/platform/transition.rs b/packages/rs-sdk/src/platform/transition.rs index 347a01b6a8..6e0c23b3af 100644 --- a/packages/rs-sdk/src/platform/transition.rs +++ b/packages/rs-sdk/src/platform/transition.rs @@ -3,8 +3,10 @@ pub mod broadcast; pub(crate) mod broadcast_identity; pub mod broadcast_request; pub(crate) mod context; +mod put_contract; pub mod put_document; pub mod put_identity; +pub(crate) mod put_settings; pub mod top_up_identity; mod txid; pub mod withdraw_from_identity; diff --git a/packages/rs-sdk/src/platform/transition/put_contract.rs b/packages/rs-sdk/src/platform/transition/put_contract.rs new file mode 100644 index 0000000000..9635a47d1d --- /dev/null +++ b/packages/rs-sdk/src/platform/transition/put_contract.rs @@ -0,0 +1,134 @@ +use crate::platform::transition::broadcast_request::BroadcastRequestForStateTransition; +use std::collections::BTreeMap; + +use crate::{Error, Sdk}; + +use crate::platform::transition::put_settings::PutSettings; +use dapi_grpc::platform::VersionedGrpcResponse; +use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::DataContract; +use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; +use dpp::identity::signer::Signer; +use dpp::identity::{IdentityPublicKey, PartialIdentity}; +use dpp::state_transition::data_contract_create_transition::methods::DataContractCreateTransitionMethodsV0; +use dpp::state_transition::data_contract_create_transition::DataContractCreateTransition; +use dpp::state_transition::proof_result::StateTransitionProofResult; +use dpp::state_transition::StateTransition; +use drive::drive::Drive; +use rs_dapi_client::{DapiRequest, RequestSettings}; + +#[async_trait::async_trait] +/// A trait for putting a contract to platform +pub trait PutContract { + /// Puts a document on platform + /// setting settings to `None` sets default connection behavior + async fn put_to_platform( + &self, + sdk: &Sdk, + identity_public_key: IdentityPublicKey, + signer: &S, + settings: Option, + ) -> Result; + + /// Waits for the response of a state transition after it has been broadcast + async fn wait_for_response( + &self, + sdk: &Sdk, + state_transition: StateTransition, + ) -> Result; + + /// Puts a contract on platform and waits for the confirmation proof + async fn put_to_platform_and_wait_for_response( + &self, + sdk: &Sdk, + identity_public_key: IdentityPublicKey, + signer: &S, + ) -> Result; +} + +#[async_trait::async_trait] +impl PutContract for DataContract { + async fn put_to_platform( + &self, + sdk: &Sdk, + identity_public_key: IdentityPublicKey, + signer: &S, + settings: Option, + ) -> Result { + let new_identity_nonce = sdk + .get_identity_nonce(self.owner_id(), true, settings) + .await?; + + let key_id = identity_public_key.id(); + + let partial_identity = PartialIdentity { + id: self.owner_id(), + loaded_public_keys: BTreeMap::from([(key_id, identity_public_key)]), + balance: None, + revision: None, + not_found_public_keys: Default::default(), + }; + let transition = DataContractCreateTransition::new_from_data_contract( + self.clone(), + new_identity_nonce, + &partial_identity, + key_id, + signer, + sdk.version(), + None, + )?; + + let request = transition.broadcast_request_for_state_transition()?; + + request + .clone() + .execute(sdk, settings.unwrap_or_default().request_settings) + .await?; + + // response is empty for a broadcast, result comes from the stream wait for state transition result + + Ok(transition) + } + + async fn wait_for_response( + &self, + sdk: &Sdk, + state_transition: StateTransition, + ) -> Result { + let request = state_transition.wait_for_state_transition_result_request()?; + + let response = request.execute(sdk, RequestSettings::default()).await?; + + let proof = response.proof_owned()?; + + let (_, result) = Drive::verify_state_transition_was_executed_with_proof( + &state_transition, + proof.grovedb_proof.as_slice(), + &|_| Ok(None), + sdk.version(), + )?; + + //todo verify + + match result { + StateTransitionProofResult::VerifiedDataContract(data_contract) => Ok(data_contract), + _ => Err(Error::DapiClientError("proved a non document".to_string())), + } + } + + async fn put_to_platform_and_wait_for_response( + &self, + sdk: &Sdk, + identity_public_key: IdentityPublicKey, + signer: &S, + ) -> Result { + let state_transition = self + .put_to_platform(sdk, identity_public_key, signer, None) + .await?; + + let data_contract = + >::wait_for_response(self, sdk, state_transition).await?; + + Ok(data_contract) + } +} diff --git a/packages/rs-sdk/src/platform/transition/put_document.rs b/packages/rs-sdk/src/platform/transition/put_document.rs index 2ae25ac7da..e4a88ec994 100644 --- a/packages/rs-sdk/src/platform/transition/put_document.rs +++ b/packages/rs-sdk/src/platform/transition/put_document.rs @@ -3,6 +3,7 @@ use std::sync::Arc; use crate::{Error, Sdk}; +use crate::platform::transition::put_settings::PutSettings; use dapi_grpc::platform::VersionedGrpcResponse; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::data_contract::document_type::DocumentType; @@ -17,13 +18,6 @@ use dpp::state_transition::StateTransition; use drive::drive::Drive; use rs_dapi_client::{DapiRequest, RequestSettings}; -/// The options when putting something to platform -#[derive(Debug, Clone, Copy, Default)] -pub struct PutSettings { - pub request_settings: RequestSettings, - pub identity_nonce_stale_time_s: Option, -} - #[async_trait::async_trait] /// A trait for putting a document to platform pub trait PutDocument { diff --git a/packages/rs-sdk/src/platform/transition/put_settings.rs b/packages/rs-sdk/src/platform/transition/put_settings.rs new file mode 100644 index 0000000000..d6544132d9 --- /dev/null +++ b/packages/rs-sdk/src/platform/transition/put_settings.rs @@ -0,0 +1,8 @@ +use rs_dapi_client::RequestSettings; + +/// The options when putting something to platform +#[derive(Debug, Clone, Copy, Default)] +pub struct PutSettings { + pub request_settings: RequestSettings, + pub identity_nonce_stale_time_s: Option, +} diff --git a/packages/rs-sdk/src/platform/transition/withdraw_from_identity.rs b/packages/rs-sdk/src/platform/transition/withdraw_from_identity.rs index d298b08329..72c1a579b9 100644 --- a/packages/rs-sdk/src/platform/transition/withdraw_from_identity.rs +++ b/packages/rs-sdk/src/platform/transition/withdraw_from_identity.rs @@ -9,7 +9,7 @@ use dpp::identity::Identity; use dpp::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition; use crate::platform::transition::broadcast_request::BroadcastRequestForStateTransition; -use crate::platform::transition::put_document::PutSettings; +use crate::platform::transition::put_settings::PutSettings; use crate::{Error, Sdk}; use dpp::state_transition::identity_credit_withdrawal_transition::methods::IdentityCreditWithdrawalTransitionMethodsV0; use dpp::state_transition::proof_result::StateTransitionProofResult; diff --git a/packages/rs-sdk/src/sdk.rs b/packages/rs-sdk/src/sdk.rs index 9a51868478..68d0f789f3 100644 --- a/packages/rs-sdk/src/sdk.rs +++ b/packages/rs-sdk/src/sdk.rs @@ -9,14 +9,10 @@ use crate::internal_cache::InternalSdkCache; use crate::mock::MockResponse; #[cfg(feature = "mocks")] use crate::mock::{provider::GrpcContextProvider, MockDashPlatformSdk}; -use crate::platform::transition::put_document::PutSettings; +use crate::platform::transition::put_settings::PutSettings; use crate::platform::{Fetch, Identifier}; use dapi_grpc::mock::Mockable; -use dapi_grpc::platform::v0::get_identity_contract_nonce_request::GetIdentityContractNonceRequestV0; -use dapi_grpc::platform::v0::get_identity_contract_nonce_response::Version; -use dapi_grpc::platform::v0::{ - GetIdentityContractNonceRequest, GetIdentityContractNonceResponse, Proof, ResponseMetadata, -}; +use dapi_grpc::platform::v0::ResponseMetadata; use dpp::identity::identity_nonce::IDENTITY_NONCE_VALUE_FILTER; use dpp::prelude::IdentityNonce; use dpp::version::{PlatformVersion, PlatformVersionCurrentVersion}; diff --git a/packages/rs-sdk/tests/fetch/common.rs b/packages/rs-sdk/tests/fetch/common.rs index b757eb58e0..77e956034c 100644 --- a/packages/rs-sdk/tests/fetch/common.rs +++ b/packages/rs-sdk/tests/fetch/common.rs @@ -59,9 +59,9 @@ pub fn mock_data_contract( document_types.insert(doc.name().to_string(), schema.clone()); } - DataContractFactory::new(protocol_version, None) + DataContractFactory::new(protocol_version) .unwrap() - .create(owner_id, platform_value!(document_types), None, None) + .create(owner_id, 0, platform_value!(document_types), None, None) .expect("create data contract") .data_contract_owned() } diff --git a/packages/strategy-tests/src/lib.rs b/packages/strategy-tests/src/lib.rs index 9f32d67b58..cc0a2733f9 100644 --- a/packages/strategy-tests/src/lib.rs +++ b/packages/strategy-tests/src/lib.rs @@ -352,7 +352,7 @@ impl Strategy { Ok(state_transitions) } - /// Generates state transitions for the inital contracts of the contracts_with_updates field. + /// Generates state transitions for the initial contracts of the contracts_with_updates field. /// /// This method creates state transitions for data contracts by iterating over the contracts with updates /// present in the strategy. For each contract: @@ -382,6 +382,7 @@ impl Strategy { pub fn contract_state_transitions( &mut self, current_identities: &Vec, + identity_nonce_counter: &mut BTreeMap, signer: &SimpleSigner, rng: &mut StdRng, platform_version: &PlatformVersion, @@ -400,11 +401,13 @@ impl Strategy { let contract = created_contract.data_contract_mut(); - let bytes32 = Bytes32::random_with_rng(rng); + let identity_nonce = identity_nonce_counter.entry(identity.id).or_default(); + *identity_nonce += 1; contract.set_owner_id(identity.id); let old_id = contract.id(); - let new_id = DataContract::generate_data_contract_id_v0(identity.id, bytes32); + let new_id = + DataContract::generate_data_contract_id_v0(identity.id, *identity_nonce); contract.set_id(new_id); id_mapping.insert(old_id, new_id); // Store the mapping @@ -422,7 +425,7 @@ impl Strategy { let state_transition = DataContractCreateTransition::new_from_data_contract( contract.clone(), - bytes32, + *identity_nonce, &identity, 2, // key id 1 should always be a high or critical auth key in these tests signer, @@ -1277,8 +1280,13 @@ impl Strategy { // Do certain things on the first block if block_info.height == config.start_block_height { // Add initial contracts for contracts_with_updates on first block of strategy - let mut contract_state_transitions = - self.contract_state_transitions(current_identities, signer, rng, platform_version); + let mut contract_state_transitions = self.contract_state_transitions( + current_identities, + identity_nonce_counter, + signer, + rng, + platform_version, + ); state_transitions.append(&mut contract_state_transitions); } else { // Do operations diff --git a/packages/wasm-dpp/lib/test/fixtures/getDataContractFixture.js b/packages/wasm-dpp/lib/test/fixtures/getDataContractFixture.js index 76ef763590..de60dce4f1 100644 --- a/packages/wasm-dpp/lib/test/fixtures/getDataContractFixture.js +++ b/packages/wasm-dpp/lib/test/fixtures/getDataContractFixture.js @@ -280,5 +280,6 @@ module.exports = async function getDataContractFixture(ownerId = randomOwnerId) documentsMutableContractDefault: true, }; - return factory.create(ownerId, documents, config); + // eslint-disable-next-line + return factory.create(ownerId, BigInt(1), documents, config); }; diff --git a/packages/wasm-dpp/src/dash_platform_protocol.rs b/packages/wasm-dpp/src/dash_platform_protocol.rs index 90ef71a9db..ba7d920d57 100644 --- a/packages/wasm-dpp/src/dash_platform_protocol.rs +++ b/packages/wasm-dpp/src/dash_platform_protocol.rs @@ -43,10 +43,7 @@ impl DashPlatformProtocolWasm { let protocol_version = maybe_protocol_version.unwrap_or(LATEST_VERSION); let protocol = DashPlatformProtocol::new(protocol_version); - let data_contracts = Arc::new( - DataContractFacade::new(protocol_version, Some(Box::new(entropy_generator.clone()))) - .with_js_error()?, - ); + let data_contracts = Arc::new(DataContractFacade::new(protocol_version).with_js_error()?); let document_factory = DocumentFactoryWASM::new(protocol_version, Some(entropy_generator))?; diff --git a/packages/wasm-dpp/src/data_contract/data_contract.rs b/packages/wasm-dpp/src/data_contract/data_contract.rs index a244219819..b22dd39916 100644 --- a/packages/wasm-dpp/src/data_contract/data_contract.rs +++ b/packages/wasm-dpp/src/data_contract/data_contract.rs @@ -17,6 +17,7 @@ use dpp::data_contract::conversion::value::v0::DataContractValueConversionMethod use dpp::data_contract::created_data_contract::CreatedDataContract; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::data_contract::serialized_version::DataContractInSerializationFormat; +use dpp::prelude::IdentityNonce; use dpp::serialization::PlatformSerializableWithPlatformVersion; use dpp::version::PlatformVersion; use dpp::ProtocolError; @@ -33,7 +34,7 @@ use crate::{buffer::Buffer, identifier::IdentifierWrapper}; #[derive(Debug, Clone)] pub struct DataContractWasm { inner: DataContract, - entropy_used: Option>, + identity_nonce: Option, } /// CreatedDataContract contains entropy and is used to create @@ -42,7 +43,7 @@ impl From for DataContractWasm { fn from(v: CreatedDataContract) -> Self { DataContractWasm { inner: v.data_contract().clone(), - entropy_used: Some(v.entropy_used().to_vec()), + identity_nonce: Some(v.identity_nonce()), } } } @@ -53,7 +54,7 @@ impl From for DataContractWasm { fn from(v: DataContract) -> Self { DataContractWasm { inner: v, - entropy_used: None, + identity_nonce: None, } } } @@ -67,17 +68,13 @@ impl From<&DataContractWasm> for DataContract { impl TryFrom<&DataContractWasm> for CreatedDataContract { type Error = ProtocolError; fn try_from(v: &DataContractWasm) -> Result { - let entropy = if let Some(entropy_used) = &v.entropy_used { - Bytes32::from_vec(entropy_used.to_owned())? - } else { - Bytes32::default() - }; + let identity_nonce = v.identity_nonce.unwrap_or_default(); let platform_version = PlatformVersion::first(); - CreatedDataContract::from_contract_and_entropy( + CreatedDataContract::from_contract_and_identity_nonce( v.to_owned().into(), - entropy, + identity_nonce, platform_version, ) } @@ -300,18 +297,15 @@ impl DataContractWasm { self.inner.has_document_type_for_name(&doc_type) } - #[wasm_bindgen(js_name=setEntropy)] - pub fn set_entropy(&mut self, e: Vec) -> Result<(), JsValue> { - self.entropy_used = Some(e); + #[wasm_bindgen(js_name=setIdentityNonce)] + pub fn set_identity_nonce(&mut self, e: u64) -> Result<(), JsValue> { + self.identity_nonce = Some(e); Ok(()) } - #[wasm_bindgen(js_name=getEntropy)] - pub fn entropy(&mut self) -> JsValue { - self.entropy_used - .as_ref() - .map(|e| Buffer::from_bytes(e.as_slice()).into()) - .unwrap_or(JsValue::undefined()) + #[wasm_bindgen(js_name=getIdentityNonce)] + pub fn identity_nonce(&mut self) -> u64 { + self.identity_nonce.unwrap_or_default() } #[wasm_bindgen(js_name=getMetadata)] diff --git a/packages/wasm-dpp/src/data_contract/data_contract_facade.rs b/packages/wasm-dpp/src/data_contract/data_contract_facade.rs index a22bc6ab75..d412dd9fd9 100644 --- a/packages/wasm-dpp/src/data_contract/data_contract_facade.rs +++ b/packages/wasm-dpp/src/data_contract/data_contract_facade.rs @@ -32,8 +32,7 @@ pub struct DataContractFacadeWasm(pub(crate) Arc); impl DataContractFacadeWasm { pub fn new(protocol_version: u32, entropy_generator: ExternalEntropyGenerator) -> Self { - let inner = DataContractFacade::new(protocol_version, Some(Box::new(entropy_generator))) - .expect("should create facade"); + let inner = DataContractFacade::new(protocol_version).expect("should create facade"); Self(Arc::new(inner)) } @@ -46,6 +45,7 @@ impl DataContractFacadeWasm { pub fn create( &self, owner_id: Vec, + identity_nonce: IdentityNonce, documents: JsValue, definitions: Option, ) -> Result { @@ -57,6 +57,7 @@ impl DataContractFacadeWasm { self.0 .create( id, + identity_nonce, serde_wasm_bindgen::from_value(documents)?, None, definitions diff --git a/packages/wasm-dpp/src/data_contract/state_transition/data_contract_create_transition/mod.rs b/packages/wasm-dpp/src/data_contract/state_transition/data_contract_create_transition/mod.rs index 5fae65c71f..9a7aca12b9 100644 --- a/packages/wasm-dpp/src/data_contract/state_transition/data_contract_create_transition/mod.rs +++ b/packages/wasm-dpp/src/data_contract/state_transition/data_contract_create_transition/mod.rs @@ -67,9 +67,9 @@ impl DataContractCreateTransitionWasm { // Ok(()) // } - #[wasm_bindgen(js_name=getEntropy)] - pub fn get_entropy(&self) -> Buffer { - Buffer::from_bytes_owned(self.0.entropy().to_vec()) + #[wasm_bindgen(js_name=getIdentityNonce)] + pub fn get_identity_nonce(&self) -> u64 { + self.0.identity_nonce() } #[wasm_bindgen(js_name=getOwnerId)] diff --git a/packages/wasm-dpp/src/data_contract_factory/data_contract_factory.rs b/packages/wasm-dpp/src/data_contract_factory/data_contract_factory.rs index d171f31235..1275063bce 100644 --- a/packages/wasm-dpp/src/data_contract_factory/data_contract_factory.rs +++ b/packages/wasm-dpp/src/data_contract_factory/data_contract_factory.rs @@ -33,9 +33,9 @@ impl DataContractFactoryWasm { external_entropy_generator_arg: Option, ) -> DataContractFactoryWasm { if let Some(external_entropy_generator) = external_entropy_generator_arg { - DataContractFactory::new(protocol_version, Some(Box::new(external_entropy_generator))) + DataContractFactory::new(protocol_version) } else { - DataContractFactory::new(protocol_version, None) + DataContractFactory::new(protocol_version) } .with_js_error() .expect("should create a factory") @@ -46,6 +46,7 @@ impl DataContractFactoryWasm { pub fn create( &self, owner_id: Vec, + identity_nonce: u64, documents: JsValue, config: JsValue, ) -> Result { @@ -64,7 +65,13 @@ impl DataContractFactoryWasm { .with_js_error()?; //todo: contract config self.0 - .create_with_value_config(identifier, documents_object, contract_config, None) + .create_with_value_config( + identifier, + identity_nonce, + documents_object, + contract_config, + None, + ) .map(Into::into) .with_js_error() } diff --git a/packages/wasm-dpp/test/integration/dataContract/DataContractFacade.spec.js b/packages/wasm-dpp/test/integration/dataContract/DataContractFacade.spec.js index 5c469b4463..48a06e099b 100644 --- a/packages/wasm-dpp/test/integration/dataContract/DataContractFacade.spec.js +++ b/packages/wasm-dpp/test/integration/dataContract/DataContractFacade.spec.js @@ -41,6 +41,8 @@ describe('DataContractFacade', () => { it('should create DataContract', () => { const result = dpp.dataContract.create( dataContract.getOwnerId(), + // eslint-disable-next-line + BigInt(1), dataContract.getDocumentSchemas(), ); @@ -65,6 +67,8 @@ describe('DataContractFacade', () => { it('should create DataContract from string', async () => { const contract = dpp.dataContract.create( dataContract.getOwnerId(), + // eslint-disable-next-line + BigInt(1), dataContract.getDocumentSchemas(), ); diff --git a/packages/wasm-dpp/test/unit/dataContract/DataContract.spec.js b/packages/wasm-dpp/test/unit/dataContract/DataContract.spec.js index 9b42f3b81a..649e61bc98 100644 --- a/packages/wasm-dpp/test/unit/dataContract/DataContract.spec.js +++ b/packages/wasm-dpp/test/unit/dataContract/DataContract.spec.js @@ -9,7 +9,7 @@ describe('DataContract', () => { let documentSchema; let documentSchemas; let ownerId; - let entropy; + let identityNonce; let contractId; let dataContract; let schemaDefs; @@ -48,7 +48,8 @@ describe('DataContract', () => { }; ownerId = (await generateRandomIdentifier()).toBuffer(); - entropy = Buffer.alloc(32, 420); + // eslint-disable-next-line + identityNonce = BigInt(1); contractId = (await generateRandomIdentifier()).toBuffer(); schemaDefs = { something: { type: 'string' } }; @@ -287,11 +288,11 @@ describe('DataContract', () => { }); }); - describe('#setEntropy', () => { + describe('#setIdentityNonce', () => { it('should set entropy', () => { - dataContract.setEntropy(entropy); + dataContract.setIdentityNonce(identityNonce); - expect(dataContract.getEntropy()).to.deep.equal(entropy); + expect(dataContract.getIdentityNonce()).to.deep.equal(identityNonce); }); }); diff --git a/packages/wasm-dpp/test/unit/dataContract/stateTransition/DataContractCreateTransition/DataContractCreateTransition.spec.js b/packages/wasm-dpp/test/unit/dataContract/stateTransition/DataContractCreateTransition/DataContractCreateTransition.spec.js index 05dff347b7..c1d94c8484 100644 --- a/packages/wasm-dpp/test/unit/dataContract/stateTransition/DataContractCreateTransition/DataContractCreateTransition.spec.js +++ b/packages/wasm-dpp/test/unit/dataContract/stateTransition/DataContractCreateTransition/DataContractCreateTransition.spec.js @@ -20,7 +20,7 @@ describe('DataContractCreateTransition', () => { stateTransition = new DataContractCreateTransition({ protocolVersion: 1, dataContract: dataContract.toObject(), - entropy: dataContract.getEntropy(), + identityNonce: 1, }); }); // @@ -66,7 +66,7 @@ describe('DataContractCreateTransition', () => { it('should return serialized State Transition', () => { const result = stateTransition.toBuffer(); expect(result).to.be.instanceOf(Buffer); - expect(result).to.have.lengthOf(2388); + expect(result).to.have.lengthOf(2357); }); it('should be able to restore contract config from bytes', () => { diff --git a/packages/wasm-dpp/test/unit/document/Document.spec.js b/packages/wasm-dpp/test/unit/document/Document.spec.js index 3723dc3ce0..087a153e7a 100644 --- a/packages/wasm-dpp/test/unit/document/Document.spec.js +++ b/packages/wasm-dpp/test/unit/document/Document.spec.js @@ -74,7 +74,8 @@ describe('Document', () => { }, }; - dataContract = dataContractFactory.create(ownerId, rawDataContract); + // eslint-disable-next-line + dataContract = dataContractFactory.create(ownerId, BigInt(1), rawDataContract); rawDocument = { $protocolVersion: getLatestProtocolVersion(), From 340302d4507f4cb991f0fcdf4738c4c955033a85 Mon Sep 17 00:00:00 2001 From: Igor Markin Date: Thu, 29 Feb 2024 16:52:40 +0000 Subject: [PATCH 050/191] test(test-suite): restore dpns tests (#1725) --- .../platform-test-suite/test/e2e/dpns.spec.js | 69 ++++--------------- 1 file changed, 15 insertions(+), 54 deletions(-) diff --git a/packages/platform-test-suite/test/e2e/dpns.spec.js b/packages/platform-test-suite/test/e2e/dpns.spec.js index f5146dfc55..b154644cc9 100644 --- a/packages/platform-test-suite/test/e2e/dpns.spec.js +++ b/packages/platform-test-suite/test/e2e/dpns.spec.js @@ -92,13 +92,7 @@ describe('DPNS', () => { expect(createdTLD.getData().normalizedParentDomainName).to.equal(''); }); - // TODO(rs-drive-abci): restore - // There are two DataTriggerAction errors now. One is used in rs-drive-abci data trigger (new) - // And other is in dpp data trigger (old). New error is dispatched in this test, - // but it does not have binding yet. - // Decide what to do with rs-dpp data trigger and it's errors, - // and update bindings and test accordingly - it.skip('should not be able to update domain', async () => { + it('should not be able to update domain', async () => { createdTLD.set('label', 'anotherlabel'); let broadcastError; @@ -116,13 +110,7 @@ describe('DPNS', () => { expect(broadcastError.code).to.equal(4001); }); - // TODO(rs-drive-abci): restore - // There are two DataTriggerAction errors now. One is used in rs-drive-abci data trigger (new) - // And other is in dpp data trigger (old). New error is dispatched in this test, - // but it does not have binding yet. - // Decide what to do with rs-dpp data trigger and it's errors, - // and update bindings and test accordingly - it.skip('should not be able to delete domain', async () => { + it('should not be able to delete domain', async () => { let broadcastError; try { @@ -152,11 +140,7 @@ describe('DPNS', () => { } }); - // TODO(rs-drive-abci): test randomly returns StateTransition already in chain error, - // but it's happening because of retry attempts for the same ST. - // Underlying issue causing retry is different and should be debugged. - // (console.log error in dapi-client's GrpcTransport for more details) - it.skip('should not be able to register TLD', async () => { + it('should not be able to register TLD', async () => { let broadcastError; try { @@ -172,11 +156,7 @@ describe('DPNS', () => { expect(broadcastError.code).to.equal(4001); }); - // TODO(rs-drive-abci): test randomly returns StateTransition already in chain error, - // but it's happening because of retry attempts for the same ST. - // Underlying issue causing retry is different and should be debugged. - // (console.log error in dapi-client's GrpcTransport for more details) - it.skip('should be able to register a second level domain', async () => { + it('should be able to register a second level domain', async () => { registeredDomain = await client.platform.names.register(`${secondLevelDomain}0.${topLevelDomain}`, { dashUniqueIdentityId: identity.getId(), }, identity); @@ -185,11 +165,11 @@ describe('DPNS', () => { await waitForSTPropagated(); expect(registeredDomain.getType()).to.equal('domain'); - expect(registeredDomain.getData().label).to.equal(secondLevelDomain); + expect(registeredDomain.getData().label).to.equal(`${secondLevelDomain}0`); expect(registeredDomain.getData().normalizedParentDomainName).to.equal(topLevelDomain); }); - it.skip('should not be able register similar domain name', async () => { + it('should not be able register similar domain name', async () => { let broadcastError; try { @@ -206,18 +186,14 @@ describe('DPNS', () => { expect(broadcastError).to.exist(); expect(broadcastError.code).to.be.equal(4009); - expect(broadcastError.message).to.match(/Document \w* has duplicate unique properties \["normalizedLabel", "normalizedParentDomainName"] with other documents/); + expect(broadcastError.message).to.match(/Document \w* has duplicate unique properties \["normalizedParentDomainName", "normalizedLabel"] with other documents/); }); - // TODO(rs-drive-abci): test randomly returns StateTransition already in chain error, - // but it's happening because of retry attempts for the same ST. - // Underlying issue causing retry is different and should be debugged. - // (console.log error in dapi-client's GrpcTransport for more details) - it.skip('should not be able to register a subdomain for parent domain which is not exist', async () => { + it('should not be able to register a subdomain for parent domain which is not exist', async () => { let broadcastError; try { - const domain = `${getRandomDomain()}.${getRandomDomain()}.${topLevelDomain}`; + const domain = `${getRandomDomain()}.${getRandomDomain()}`; await client.platform.names.register(domain, { dashAliasIdentityId: identity.getId(), @@ -233,8 +209,7 @@ describe('DPNS', () => { expect(broadcastError.code).to.equal(4001); }); - // TODO(rs-drive-abci): restore - toObject mismatch (happens randomly) - it.skip('should be able to search a domain', async () => { + it('should be able to search a domain', async () => { const documents = await client.platform.names.search(secondLevelDomain, topLevelDomain); expect(documents).to.have.lengthOf(1); @@ -244,15 +219,13 @@ describe('DPNS', () => { expect(document.toObject()).to.deep.equal(registeredDomain.toObject()); }); - // TODO(rs-drive-abci): restore - toObject mismatch (happens randomly) - it.skip('should be able to resolve domain by it\'s name', async () => { - const document = await client.platform.names.resolve(`${secondLevelDomain}.${topLevelDomain}`); + it('should be able to resolve domain by it\'s name', async () => { + const document = await client.platform.names.resolve(`${secondLevelDomain}0.${topLevelDomain}`); expect(document.toObject()).to.deep.equal(registeredDomain.toObject()); }); - // TODO(rs-drive-abci): restore - toObject mismatch (happens randomly) - it.skip('should be able to resolve domain by it\'s record', async () => { + it('should be able to resolve domain by it\'s record', async () => { const [document] = await client.platform.names.resolveByRecord( 'dashUniqueIdentityId', registeredDomain.getData().records.dashUniqueIdentityId, @@ -261,13 +234,7 @@ describe('DPNS', () => { expect(document.toObject()).to.deep.equal(registeredDomain.toObject()); }); - // TODO(rs-drive-abci): restore - // There are two DataTriggerAction errors now. One is used in rs-drive-abci data trigger (new) - // And other is in dpp data trigger (old). New error is dispatched in this test, - // but it does not have binding yet. - // Decide what to do with rs-dpp data trigger and it's errors, - // and update bindings and test accordingly - it.skip('should not be able to update domain', async () => { + it('should not be able to update domain', async () => { registeredDomain.set('label', 'newlabel'); let broadcastError; @@ -287,13 +254,7 @@ describe('DPNS', () => { expect(broadcastError.code).to.equal(4001); }); - // TODO(rs-drive-abci): restore - // There are two DataTriggerAction errors now. One is used in rs-drive-abci data trigger (new) - // And other is in dpp data trigger (old). New error is dispatched in this test, - // but it does not have binding yet. - // Decide what to do with rs-dpp data trigger and it's errors, - // and update bindings and test accordingly - it.skip('should not be able to delete domain', async () => { + it('should not be able to delete domain', async () => { let broadcastError; try { From 41dd0ae830d704e1a84639934241cc85588f0eef Mon Sep 17 00:00:00 2001 From: pauldelucia Date: Fri, 1 Mar 2024 00:46:53 +0700 Subject: [PATCH 051/191] feat: add ContractUpdate to used_contract_ids function --- packages/strategy-tests/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/strategy-tests/src/lib.rs b/packages/strategy-tests/src/lib.rs index cc0a2733f9..be30b702e1 100644 --- a/packages/strategy-tests/src/lib.rs +++ b/packages/strategy-tests/src/lib.rs @@ -284,7 +284,7 @@ impl Strategy { .filter_map(|operation| { match &operation.op_type { OperationType::Document(document) => Some(document.contract.id()), - //todo add data contract updates + OperationType::ContractUpdate(op) => Some(op.contract.id()), _ => None, } }) From 3d09ba77484f1a69bdee73eb410110455e7c5098 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Tue, 5 Mar 2024 17:30:45 +0300 Subject: [PATCH 052/191] perf: query and check tx parallel processing (#1694) Co-authored-by: Lukasz Klimek <842586+lklimek@users.noreply.github.com> Co-authored-by: Quantum Explorer --- .cargo/config.toml | 9 +- .github/workflows/tests.yml | 3 +- Cargo.lock | 610 +-- Dockerfile | 4 +- README.md | 2 +- packages/dapi-grpc/Cargo.toml | 31 +- packages/dapi-grpc/build.rs | 14 +- .../v0/nodejs/PlatformPromiseClient.js | 39 + .../core/proto/org.dash.platform.dapi.v0.rs | 522 +++ .../proto/org.dash.platform.dapi.v0.rs | 1212 ++++++ packages/dapi/.env.example | 3 + packages/dapi/lib/config/index.js | 4 + .../lib/externalApis/drive/DriveClient.js | 285 -- .../fetchProofForStateTransitionFactory.js | 20 +- .../broadcastStateTransitionHandlerFactory.js | 21 +- .../platform/getDataContractHandlerFactory.js | 43 - .../getDataContractHistoryHandlerFactory.js | 43 - .../getDataContractsHandlerFactory.js | 45 - .../platform/getDocumentsHandlerFactory.js | 50 - .../platform/getEpochsInfoHandlerFactory.js | 32 - ...entitiesByPublicKeyHashesHandlerFactory.js | 44 - .../platform/getIdentitiesHandlerFactory.js | 45 - ...dentityBalanceAndRevisionHandlerFactory.js | 44 - .../getIdentityBalanceHandlerFactory.js | 44 - ...etIdentityByPublicKeyHashHandlerFactory.js | 44 - .../platform/getIdentityHandlerFactory.js | 44 - .../platform/getIdentityKeysHandlerFactory.js | 44 - .../platform/getProofsHandlerFactory.js | 31 - ...otocolVersionUpgradeStateHandlerFactory.js | 33 - ...lVersionUpgradeVoteStatusHandlerFactory.js | 33 - .../platform/platformHandlersFactory.js | 410 +- .../platform/unimplementedHandlerFactory.js | 30 + packages/dapi/scripts/api.js | 12 +- ...tateTransitionResultHandlerFactory.spec.js | 4 +- .../externalApis/drive/DriveClient.spec.js | 553 --- ...etchProofForStateTransitionFactory.spec.js | 8 +- .../getConsensusParamsHandlerFactory.spec.js | 159 - .../getDataContractHandlerFactory.spec.js | 163 - .../getDataContractsHandlerFactory.spec.js | 144 - .../getDocumentsHandlerFactory.spec.js | 193 - .../getEpochsInfoHandlerFactory.spec.js | 113 - ...iesByPublicKeyHashesHandlerFactory.spec.js | 159 - .../getIdentitiesHandlerFactory.spec.js | 142 - ...tyBalanceAndRevisionHandlerFactory.spec.js | 137 - .../getIdentityBalanceHandlerFactory.spec.js | 122 - ...ntityByPublicKeyHashHandlerFactory.spec.js | 132 - .../getIdentityHandlerFactory.spec.js | 134 - .../getIdentityKeysHandlerFactory.spec.js | 135 - .../platform/getProofsHandlerFactory.spec.js | 78 - ...lVersionUpgradeStateHandlerFactory.spec.js | 116 - ...ionUpgradeVoteStatusHandlerFactory.spec.js | 118 - .../configs/defaults/getBaseConfigFactory.js | 69 +- .../configs/getConfigFileMigrationsFactory.js | 20 +- packages/dashmate/docker-compose.yml | 20 + .../dashmate/src/config/configJsonSchema.js | 24 +- .../setup/setupLocalPresetTaskFactory.js | 47 +- .../platform/dapi/envoy/envoy.yaml.dot | 94 +- .../platform/drive/tenderdash/config.toml.dot | 5 +- packages/dashpay-contract/.eslintrc | 3 +- packages/dashpay-contract/Cargo.toml | 2 +- .../dashpay-contract/test/unit/schema.spec.js | 327 +- packages/data-contracts/Cargo.toml | 2 +- packages/dpns-contract/.eslintrc | 31 +- packages/dpns-contract/Cargo.toml | 2 +- .../test/unit/dpnsContract.spec.js | 278 +- packages/feature-flags-contract/.eslintrc | 31 +- packages/feature-flags-contract/Cargo.toml | 2 +- .../test/unit/featureFlagsContract.spec.js | 246 +- packages/js-grpc-common/index.js | 2 + .../server/error/UnimplementedGrpcError.js | 14 + .../.eslintrc | 29 +- .../Cargo.toml | 2 +- .../masternodeRewardSharesContract.spec.js | 86 +- packages/rs-dapi-client/Cargo.toml | 2 +- packages/rs-dpp/Cargo.toml | 4 +- packages/rs-drive-abci/.env.local | 9 +- packages/rs-drive-abci/.env.mainnet | 16 +- packages/rs-drive-abci/.env.testnet | 11 +- packages/rs-drive-abci/Cargo.toml | 84 +- .../rs-drive-abci/src/abci/app/check_tx.rs | 98 + .../rs-drive-abci/src/abci/app/consensus.rs | 143 + .../abci/{handler => app}/execution_result.rs | 0 packages/rs-drive-abci/src/abci/app/full.rs | 142 + packages/rs-drive-abci/src/abci/app/mod.rs | 33 + packages/rs-drive-abci/src/abci/config.rs | 20 +- packages/rs-drive-abci/src/abci/error.rs | 25 +- .../src/abci/handler/check_tx.rs | 78 + .../rs-drive-abci/src/abci/handler/echo.rs | 14 + .../src/abci/handler/error/mod.rs | 13 +- .../src/abci/handler/extend_vote.rs | 54 + .../src/abci/handler/finalize_block.rs | 51 + .../rs-drive-abci/src/abci/handler/info.rs | 57 + .../src/abci/handler/init_chain.rs | 49 + .../rs-drive-abci/src/abci/handler/mod.rs | 1407 +------ .../src/abci/handler/prepare_proposal.rs | 214 ++ .../src/abci/handler/process_proposal.rs | 244 ++ .../src/abci/handler/verify_vote_extension.rs | 96 + packages/rs-drive-abci/src/abci/mod.rs | 15 +- packages/rs-drive-abci/src/abci/server.rs | 95 - packages/rs-drive-abci/src/config.rs | 47 + .../src/execution/check_tx/mod.rs | 4 +- .../src/execution/check_tx/v0/mod.rs | 155 +- .../engine/initialization/init_chain/mod.rs | 4 +- .../engine/run_block_proposal/mod.rs | 4 +- .../engine/run_block_proposal/v0/mod.rs | 138 +- .../block_end/update_drive_cache/v0/mod.rs | 14 +- .../block_end/update_state_cache/v0/mod.rs | 13 +- .../clear_drive_block_cache/v0/mod.rs | 8 +- .../epoch/gather_epoch_info/v0/mod.rs | 2 +- .../v0/mod.rs | 10 +- .../create_genesis_state/v0/mod.rs | 16 +- .../v0/mod.rs | 10 +- .../process_raw_state_transitions/v0/mod.rs | 1 - .../v0/mod.rs | 8 +- .../v0/mod.rs | 8 +- .../v0/mod.rs | 8 +- .../check_tx_verification/v0/mod.rs | 4 +- .../asset_lock/proof/validate/chain/mod.rs | 5 +- .../asset_lock/proof/validate/instant/mod.rs | 8 +- .../state_transition/processor/v0/mod.rs | 4 +- .../data_contract_create/mod.rs | 10 +- .../data_contract_update/mod.rs | 20 +- .../data_contract_update/state/mod.rs | 4 +- .../state_transitions/documents_batch/mod.rs | 7 +- .../state/v0/fetch_documents.rs | 2 +- .../documents_batch/state/v0/mod.rs | 3 + .../identity_credit_transfer/mod.rs | 8 +- .../identity_credit_withdrawal/mod.rs | 8 +- .../state_transitions/identity_top_up/mod.rs | 8 +- .../state_transitions/identity_update/mod.rs | 7 +- packages/rs-drive-abci/src/lib.rs | 7 +- packages/rs-drive-abci/src/logging/logger.rs | 23 +- packages/rs-drive-abci/src/main.rs | 122 +- packages/rs-drive-abci/src/mimic/mod.rs | 44 +- .../src/platform_types/platform/mod.rs | 3 - .../src/platform_types/platform_state/mod.rs | 6 +- .../platform_types/platform_state/v0/mod.rs | 4 +- .../data_contract/mod.rs | 31 +- .../data_contract/v0/mod.rs | 113 +- .../data_contract_history/mod.rs | 37 +- .../data_contract_history/v0/mod.rs | 446 ++- .../data_contracts/mod.rs | 35 +- .../data_contracts/v0/mod.rs | 124 +- .../src/query/document_query/mod.rs | 32 +- .../src/query/document_query/v0/mod.rs | 376 +- .../identity_based_queries/balance/mod.rs | 31 +- .../identity_based_queries/balance/v0/mod.rs | 119 +- .../balance_and_revision/mod.rs | 35 +- .../balance_and_revision/v0/mod.rs | 125 +- .../identity_based_queries/identities/mod.rs | 31 +- .../identities/v0/mod.rs | 130 +- .../identities_by_public_key_hashes/mod.rs | 41 +- .../identities_by_public_key_hashes/v0/mod.rs | 126 +- .../identity_based_queries/identity/mod.rs | 31 +- .../identity_based_queries/identity/v0/mod.rs | 127 +- .../identity_by_public_key_hash/mod.rs | 44 +- .../identity_by_public_key_hash/v0/mod.rs | 129 +- .../identity_contract_nonce/mod.rs | 37 +- .../identity_contract_nonce/v0/mod.rs | 384 +- .../identity_nonce/mod.rs | 32 +- .../identity_nonce/v0/mod.rs | 280 +- .../query/identity_based_queries/keys/mod.rs | 31 +- .../identity_based_queries/keys/v0/mod.rs | 295 +- packages/rs-drive-abci/src/query/mod.rs | 3421 +---------------- .../rs-drive-abci/src/query/proofs/mod.rs | 31 +- .../rs-drive-abci/src/query/proofs/v0/mod.rs | 189 +- .../src/query/response_metadata/mod.rs | 6 +- .../src/query/response_metadata/v0/mod.rs | 33 +- packages/rs-drive-abci/src/query/service.rs | 333 ++ .../src/query/system/epoch_infos/mod.rs | 31 +- .../src/query/system/epoch_infos/v0/mod.rs | 171 +- .../query/system/version_upgrade_state/mod.rs | 40 +- .../system/version_upgrade_state/v0/mod.rs | 356 +- .../system/version_upgrade_vote_status/mod.rs | 42 +- .../version_upgrade_vote_status/v0/mod.rs | 389 +- packages/rs-drive-abci/src/query/v0/mod.rs | 457 --- packages/rs-drive-abci/src/server.rs | 73 + packages/rs-drive-abci/src/utils/mod.rs | 3 + packages/rs-drive-abci/src/utils/spawn.rs | 24 + .../tests/strategy_tests/execution.rs | 10 +- .../tests/strategy_tests/failures.rs | 11 +- .../tests/strategy_tests/main.rs | 9 +- .../tests/strategy_tests/query.rs | 88 +- .../tests/strategy_tests/strategy.rs | 4 +- .../strategy_tests/upgrade_fork_tests.rs | 108 +- .../verify_state_transitions.rs | 132 +- packages/rs-drive-proof-verifier/Cargo.toml | 8 +- packages/rs-drive-verify-c-binding/Cargo.toml | 2 +- packages/rs-drive/Cargo.toml | 2 +- .../drive/batch/drive_op_batch/document.rs | 6 +- .../batch/drive_op_batch/finalize_task.rs | 3 +- packages/rs-drive/src/drive/cache.rs | 283 +- .../rs-drive/src/drive/cache/data_contract.rs | 170 + .../src/drive/cache/protocol_version.rs | 93 + .../src/drive/cache/system_contracts.rs | 63 + .../src/drive/cache/system_contracts_cache.rs | 36 - .../v0/mod.rs | 4 +- .../get_contract_with_fetch_info/mod.rs | 4 +- .../get_contract_with_fetch_info/v0/mod.rs | 19 +- .../contract/update/update_contract/v0/mod.rs | 6 +- .../v0/mod.rs | 9 +- packages/rs-drive/src/drive/mod.rs | 7 +- packages/rs-drive/src/drive/open/mod.rs | 58 +- .../src/drive/operations/drop_cache/v0/mod.rs | 21 +- .../v0/mod.rs | 3 +- .../v0/mod.rs | 3 +- .../src/drive/system/genesis_time/mod.rs | 26 +- .../Cargo.toml | 2 +- packages/rs-platform-serialization/Cargo.toml | 2 +- .../rs-platform-value-convertible/Cargo.toml | 2 +- packages/rs-platform-value/Cargo.toml | 2 +- packages/rs-platform-version/Cargo.toml | 2 +- .../src/version/drive_abci_versions.rs | 1 - .../src/version/mocks/v2_test.rs | 1 - .../src/version/mocks/v3_test.rs | 1 - .../rs-platform-version/src/version/v1.rs | 1 - packages/rs-platform-versioning/Cargo.toml | 2 +- packages/rs-sdk/Cargo.toml | 34 +- packages/simple-signer/Cargo.toml | 2 +- packages/strategy-tests/Cargo.toml | 32 +- packages/strategy-tests/src/lib.rs | 10 +- packages/wasm-dpp/Cargo.toml | 2 +- packages/withdrawals-contract/.eslintrc | 31 +- packages/withdrawals-contract/Cargo.toml | 2 +- .../test/unit/withdrawalsContract.spec.js | 184 +- rust-toolchain.toml | 2 +- 226 files changed, 9776 insertions(+), 12075 deletions(-) delete mode 100644 packages/dapi/lib/externalApis/drive/DriveClient.js delete mode 100644 packages/dapi/lib/grpcServer/handlers/platform/getDataContractHandlerFactory.js delete mode 100644 packages/dapi/lib/grpcServer/handlers/platform/getDataContractHistoryHandlerFactory.js delete mode 100644 packages/dapi/lib/grpcServer/handlers/platform/getDataContractsHandlerFactory.js delete mode 100644 packages/dapi/lib/grpcServer/handlers/platform/getDocumentsHandlerFactory.js delete mode 100644 packages/dapi/lib/grpcServer/handlers/platform/getEpochsInfoHandlerFactory.js delete mode 100644 packages/dapi/lib/grpcServer/handlers/platform/getIdentitiesByPublicKeyHashesHandlerFactory.js delete mode 100644 packages/dapi/lib/grpcServer/handlers/platform/getIdentitiesHandlerFactory.js delete mode 100644 packages/dapi/lib/grpcServer/handlers/platform/getIdentityBalanceAndRevisionHandlerFactory.js delete mode 100644 packages/dapi/lib/grpcServer/handlers/platform/getIdentityBalanceHandlerFactory.js delete mode 100644 packages/dapi/lib/grpcServer/handlers/platform/getIdentityByPublicKeyHashHandlerFactory.js delete mode 100644 packages/dapi/lib/grpcServer/handlers/platform/getIdentityHandlerFactory.js delete mode 100644 packages/dapi/lib/grpcServer/handlers/platform/getIdentityKeysHandlerFactory.js delete mode 100644 packages/dapi/lib/grpcServer/handlers/platform/getProofsHandlerFactory.js delete mode 100644 packages/dapi/lib/grpcServer/handlers/platform/getProtocolVersionUpgradeStateHandlerFactory.js delete mode 100644 packages/dapi/lib/grpcServer/handlers/platform/getProtocolVersionUpgradeVoteStatusHandlerFactory.js create mode 100644 packages/dapi/lib/grpcServer/handlers/platform/unimplementedHandlerFactory.js delete mode 100644 packages/dapi/test/unit/externalApis/drive/DriveClient.spec.js delete mode 100644 packages/dapi/test/unit/grpcServer/handlers/platform/getConsensusParamsHandlerFactory.spec.js delete mode 100644 packages/dapi/test/unit/grpcServer/handlers/platform/getDataContractHandlerFactory.spec.js delete mode 100644 packages/dapi/test/unit/grpcServer/handlers/platform/getDataContractsHandlerFactory.spec.js delete mode 100644 packages/dapi/test/unit/grpcServer/handlers/platform/getDocumentsHandlerFactory.spec.js delete mode 100644 packages/dapi/test/unit/grpcServer/handlers/platform/getEpochsInfoHandlerFactory.spec.js delete mode 100644 packages/dapi/test/unit/grpcServer/handlers/platform/getIdentitiesByPublicKeyHashesHandlerFactory.spec.js delete mode 100644 packages/dapi/test/unit/grpcServer/handlers/platform/getIdentitiesHandlerFactory.spec.js delete mode 100644 packages/dapi/test/unit/grpcServer/handlers/platform/getIdentityBalanceAndRevisionHandlerFactory.spec.js delete mode 100644 packages/dapi/test/unit/grpcServer/handlers/platform/getIdentityBalanceHandlerFactory.spec.js delete mode 100644 packages/dapi/test/unit/grpcServer/handlers/platform/getIdentityByPublicKeyHashHandlerFactory.spec.js delete mode 100644 packages/dapi/test/unit/grpcServer/handlers/platform/getIdentityHandlerFactory.spec.js delete mode 100644 packages/dapi/test/unit/grpcServer/handlers/platform/getIdentityKeysHandlerFactory.spec.js delete mode 100644 packages/dapi/test/unit/grpcServer/handlers/platform/getProofsHandlerFactory.spec.js delete mode 100644 packages/dapi/test/unit/grpcServer/handlers/platform/getProtocolVersionUpgradeStateHandlerFactory.spec.js delete mode 100644 packages/dapi/test/unit/grpcServer/handlers/platform/getProtocolVersionUpgradeVoteStatusHandlerFactory.spec.js create mode 100644 packages/js-grpc-common/lib/server/error/UnimplementedGrpcError.js create mode 100644 packages/rs-drive-abci/src/abci/app/check_tx.rs create mode 100644 packages/rs-drive-abci/src/abci/app/consensus.rs rename packages/rs-drive-abci/src/abci/{handler => app}/execution_result.rs (100%) create mode 100644 packages/rs-drive-abci/src/abci/app/full.rs create mode 100644 packages/rs-drive-abci/src/abci/app/mod.rs create mode 100644 packages/rs-drive-abci/src/abci/handler/check_tx.rs create mode 100644 packages/rs-drive-abci/src/abci/handler/echo.rs create mode 100644 packages/rs-drive-abci/src/abci/handler/extend_vote.rs create mode 100644 packages/rs-drive-abci/src/abci/handler/finalize_block.rs create mode 100644 packages/rs-drive-abci/src/abci/handler/info.rs create mode 100644 packages/rs-drive-abci/src/abci/handler/init_chain.rs create mode 100644 packages/rs-drive-abci/src/abci/handler/prepare_proposal.rs create mode 100644 packages/rs-drive-abci/src/abci/handler/process_proposal.rs create mode 100644 packages/rs-drive-abci/src/abci/handler/verify_vote_extension.rs delete mode 100644 packages/rs-drive-abci/src/abci/server.rs create mode 100644 packages/rs-drive-abci/src/query/service.rs delete mode 100644 packages/rs-drive-abci/src/query/v0/mod.rs create mode 100644 packages/rs-drive-abci/src/server.rs create mode 100644 packages/rs-drive-abci/src/utils/mod.rs create mode 100644 packages/rs-drive-abci/src/utils/spawn.rs create mode 100644 packages/rs-drive/src/drive/cache/data_contract.rs create mode 100644 packages/rs-drive/src/drive/cache/protocol_version.rs create mode 100644 packages/rs-drive/src/drive/cache/system_contracts.rs delete mode 100644 packages/rs-drive/src/drive/cache/system_contracts_cache.rs diff --git a/.cargo/config.toml b/.cargo/config.toml index 5b529c3dcc..18bc8e4064 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -1,8 +1,13 @@ +# TODO: We shouldn't go with tokio_unstable to production + [target.aarch64-unknown-linux-musl] -rustflags = [ "-C", "target-feature=-crt-static" ] +rustflags = ["-C", "target-feature=-crt-static", "--cfg", "tokio_unstable"] [target.x86_64-unknown-linux-musl] -rustflags = [ "-C", "target-feature=-crt-static" ] +rustflags = ["-C", "target-feature=-crt-static", "--cfg", "tokio_unstable"] [target.aarch64-unknown-linux-gnu] linker = "aarch64-linux-gnu-gcc" + +[build] +rustflags = ["--cfg", "tokio_unstable"] diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 5a3bbed51a..1cbcc6a271 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -3,7 +3,7 @@ name: Tests on: workflow_dispatch: pull_request: - types: [opened, synchronize, reopened, ready_for_review] + types: [ opened, synchronize, reopened, ready_for_review ] branches: - master - 'v[0-9]+\.[0-9]+-dev' @@ -89,6 +89,7 @@ jobs: # Run drive tests on self-hosted 4x test-runner: ${{ contains(fromJSON('["drive-abci"]'), matrix.rs-package) && '[ "self-hosted", "linux", "arm64", "ubuntu-platform-4x" ]' || '[ "self-hosted", "linux", "arm64", "ubuntu-platform" ]' }} check-each-feature: ${{ contains(fromJSON('["rs-sdk","rs-dapi-client","dapi-grpc","dpp","drive-abci"]'), matrix.rs-package) }} + rs-crates-security: name: Rust crates security audit if: ${{ github.event_name == 'push' || github.event_name == 'workflow_dispatch' || github.event_name == 'schedule' || !github.event.pull_request.draft }} diff --git a/Cargo.lock b/Cargo.lock index 4b45915f59..74952ba8b3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -19,9 +19,9 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "ahash" -version = "0.7.8" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +checksum = "5a824f2aa7e75a0c98c5a504fceb80649e9c35265d44525b5f94de4771a395cd" dependencies = [ "getrandom", "once_cell", @@ -31,9 +31,9 @@ dependencies = [ [[package]] name = "ahash" -version = "0.8.9" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d713b3834d76b85304d4d525563c1276e2e30dc97cc67bfb4585a4a29fc2c89f" +checksum = "77c3a9648d43b9cd48db467b3f87fdd6e146bcc88ab0180006cef2179fe11d01" dependencies = [ "cfg-if", "once_cell", @@ -73,9 +73,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.12" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96b09b5178381e0874812a9b157f7fe84982617e48f71f4e3235482775e5b540" +checksum = "6e2e1ebcb11de5c03c67de28a7df593d32191b44939c482e97702baaaa6ab6a5" dependencies = [ "anstyle", "anstyle-parse", @@ -87,9 +87,9 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.6" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" +checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" [[package]] name = "anstyle-parse" @@ -121,9 +121,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.80" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ad32ce52e4161730f7098c077cd2ed6229b5804ccf99e5366be1ab72a98b4e1" +checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" [[package]] name = "arrayref" @@ -185,7 +185,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.48", ] [[package]] @@ -196,7 +196,7 @@ checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.48", ] [[package]] @@ -365,7 +365,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.50", + "syn 2.0.48", "which", ] @@ -458,7 +458,7 @@ dependencies = [ [[package]] name = "bls-dash-sys" version = "1.2.5" -source = "git+https://github.com/dashpay/bls-signatures?branch=develop#1c2fc79c19dc8041610c005e68d58bfb4bc32721" +source = "git+https://github.com/dashpay/bls-signatures?tag=v1.3.1#1c2fc79c19dc8041610c005e68d58bfb4bc32721" dependencies = [ "bindgen", "cc", @@ -468,7 +468,7 @@ dependencies = [ [[package]] name = "bls-signatures" version = "1.2.5" -source = "git+https://github.com/dashpay/bls-signatures?branch=develop#1c2fc79c19dc8041610c005e68d58bfb4bc32721" +source = "git+https://github.com/dashpay/bls-signatures?tag=v1.3.1#1c2fc79c19dc8041610c005e68d58bfb4bc32721" dependencies = [ "bls-dash-sys", "hex", @@ -496,7 +496,7 @@ dependencies = [ "proc-macro-crate 3.1.0", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.48", "syn_derive", ] @@ -517,15 +517,15 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.15.1" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c764d619ca78fccbf3069b37bd7af92577f044bb15236036662d79b6559f25b7" +checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" [[package]] name = "bytecheck" -version = "0.6.12" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" +checksum = "8b6372023ac861f6e6dc89c8344a8f398fb42aaba2b5dbc649ca0c0e9dbcb627" dependencies = [ "bytecheck_derive", "ptr_meta", @@ -534,9 +534,9 @@ dependencies = [ [[package]] name = "bytecheck_derive" -version = "0.6.12" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" +checksum = "a7ec4c6f261935ad534c0c22dbef2201b45918860eb1c574b972bd213a76af61" dependencies = [ "proc-macro2", "quote", @@ -586,9 +586,9 @@ dependencies = [ [[package]] name = "cargo-platform" -version = "0.1.7" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "694c8807f2ae16faecc43dc17d74b3eb042482789fd0eb64b39a2e04e087053f" +checksum = "ceed8ef69d8518a5dda55c07425450b58a4e1946f4951eab6d7191ee86c2443d" dependencies = [ "serde", ] @@ -614,10 +614,11 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.0.86" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f9fa1897e4325be0d68d48df6aa1a71ac2ed4d27723887e7754192705350730" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" dependencies = [ + "jobserver", "libc", ] @@ -644,9 +645,9 @@ checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" [[package]] name = "chrono" -version = "0.4.34" +version = "0.4.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bc015644b92d5890fab7489e49d21f879d5c990186827d42ec511919404f38b" +checksum = "41daef31d7a747c5c847246f36de49ced6f7403b4cdabc807a97b5cc184cda7a" dependencies = [ "android-tzdata", "iana-time-zone", @@ -705,9 +706,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.1" +version = "4.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c918d541ef2913577a0f9566e9ce27cb35b6df072075769e0b26cb5a554520da" +checksum = "1e578d6ec4194633722ccf9544794b71b1385c3c027efe0c55db226fc880865c" dependencies = [ "clap_builder", "clap_derive", @@ -715,33 +716,33 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.1" +version = "4.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f3e7391dad68afb0c2ede1bf619f579a3dc9c2ec67f089baa397123a2f3d1eb" +checksum = "4df4df40ec50c46000231c914968278b1eb05098cf8f1b3a518a95030e71d1c7" dependencies = [ "anstream", "anstyle", "clap_lex", - "strsim 0.11.0", + "strsim", ] [[package]] name = "clap_derive" -version = "4.5.0" +version = "4.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "307bc0538d5f0f83b8248db3087aa92fe504e4691294d0c96c0eabc33f47ba47" +checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.48", ] [[package]] name = "clap_lex" -version = "0.7.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" +checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" [[package]] name = "colorchoice" @@ -768,6 +769,43 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "console-api" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd326812b3fd01da5bb1af7d340d0d555fd3d4b641e7f1dfcf5962a902952787" +dependencies = [ + "futures-core", + "prost 0.12.3", + "prost-types 0.12.3", + "tonic 0.10.2", + "tracing-core", +] + +[[package]] +name = "console-subscriber" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7481d4c57092cd1c19dd541b92bdce883de840df30aa5d03fd48a3935c01842e" +dependencies = [ + "console-api", + "crossbeam-channel", + "crossbeam-utils", + "futures-task", + "hdrhistogram", + "humantime", + "prost-types 0.12.3", + "serde", + "serde_json", + "thread_local", + "tokio", + "tokio-stream", + "tonic 0.10.2", + "tracing", + "tracing-core", + "tracing-subscriber", +] + [[package]] name = "const-oid" version = "0.9.6" @@ -813,9 +851,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.4.0" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ "cfg-if", ] @@ -923,9 +961,9 @@ dependencies = [ [[package]] name = "curve25519-dalek" -version = "4.1.2" +version = "4.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a677b8922c94e01bdbb12126b0bc852f00447528dee1782229af9c720c3f348" +checksum = "e89b8c6a2e4b1f45971ad09761aafb85514a84744b67a95e32c3cc1352d1f65c" dependencies = [ "cfg-if", "cpufeatures", @@ -946,7 +984,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.48", ] [[package]] @@ -954,14 +992,15 @@ name = "dapi-grpc" version = "1.0.0-dev.5" dependencies = [ "dapi-grpc-macros", + "futures-core", "platform-version", - "prost 0.11.9", + "prost 0.12.3", "serde", "serde_bytes", "serde_json", - "tenderdash-proto 0.14.0-dev.6 (git+https://github.com/dashpay/rs-tenderdash-abci)", - "tonic", - "tonic-build", + "tenderdash-proto", + "tonic 0.11.0", + "tonic-build 0.9.2", ] [[package]] @@ -971,14 +1010,14 @@ dependencies = [ "dapi-grpc", "heck", "quote", - "syn 2.0.50", + "syn 2.0.48", ] [[package]] name = "darling" -version = "0.20.6" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c376d08ea6aa96aafe61237c7200d1241cb177b7d3a542d791f2d118e9cbb955" +checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" dependencies = [ "darling_core", "darling_macro", @@ -986,27 +1025,27 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.6" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33043dcd19068b8192064c704b3f83eb464f91f1ff527b44a4e2b08d9cdb8855" +checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", - "strsim 0.10.0", - "syn 2.0.50", + "strsim", + "syn 2.0.48", ] [[package]] name = "darling_macro" -version = "0.20.6" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5a91391accf613803c2a9bf9abccdbaa07c54b4244a5b64883f9c3c137c86be" +checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" dependencies = [ "darling_core", "quote", - "syn 2.0.50", + "syn 2.0.48", ] [[package]] @@ -1204,7 +1243,7 @@ dependencies = [ "env_logger 0.9.3", "getrandom", "hex", - "indexmap 2.2.3", + "indexmap 2.1.0", "integer-encoding 4.0.0", "itertools 0.10.5", "json-patch", @@ -1254,7 +1293,7 @@ dependencies = [ "grovedb-path", "grovedb-storage", "hex", - "indexmap 2.2.3", + "indexmap 2.1.0", "integer-encoding 4.0.0", "intmap", "itertools 0.11.0", @@ -1274,13 +1313,14 @@ dependencies = [ name = "drive-abci" version = "1.0.0-dev.5" dependencies = [ + "async-trait", "atty", "base64 0.20.0", "bincode 2.0.0-rc.3", - "bs58 0.4.0", "chrono", "ciborium", - "clap 4.5.1", + "clap 4.4.18", + "console-subscriber", "dapi-grpc", "dashcore-rpc", "delegate", @@ -1308,7 +1348,7 @@ dependencies = [ "rust_decimal_macros", "serde", "serde_json", - "serde_with 3.6.1", + "serde_with 3.5.0", "sha2", "simple-signer", "strategy-tests", @@ -1371,9 +1411,9 @@ dependencies = [ [[package]] name = "ed25519-dalek" -version = "2.1.1" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" +checksum = "1f628eaec48bfd21b865dc2950cfa014450c01d2fa2b69a86c2fd5844ec523c0" dependencies = [ "curve25519-dalek", "ed25519", @@ -1386,9 +1426,9 @@ dependencies = [ [[package]] name = "either" -version = "1.10.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" [[package]] name = "enum-map" @@ -1407,7 +1447,7 @@ checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.48", ] [[package]] @@ -1535,9 +1575,9 @@ dependencies = [ [[package]] name = "fiat-crypto" -version = "0.2.6" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1676f435fc1dadde4d03e43f5d62b259e1ce5f40bd4ffb21db2b42ebe59c1382" +checksum = "27573eac26f4dd11e2b1916c3fe1baa56407c83c71a773a8ba17ec0bca03b6b7" [[package]] name = "file-rotate" @@ -1697,7 +1737,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.48", ] [[package]] @@ -1865,7 +1905,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap 2.2.3", + "indexmap 2.1.0", "slab", "tokio", "tokio-util", @@ -1884,7 +1924,7 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ - "ahash 0.7.8", + "ahash 0.7.7", ] [[package]] @@ -1893,7 +1933,7 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ff8ae62cd3a9102e5637afc8452c55acf3844001bd5374e0b0bd7b6616c038" dependencies = [ - "ahash 0.8.9", + "ahash 0.8.7", ] [[package]] @@ -1902,10 +1942,23 @@ version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" dependencies = [ - "ahash 0.8.9", + "ahash 0.8.7", "allocator-api2", ] +[[package]] +name = "hdrhistogram" +version = "7.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "765c9198f173dd59ce26ff9f95ef0aafd0a0fe01fb9d72841bc5066a4c06511d" +dependencies = [ + "base64 0.21.7", + "byteorder", + "flate2", + "nom", + "num-traits", +] + [[package]] name = "heck" version = "0.4.1" @@ -1923,9 +1976,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.3.6" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd5256b483761cd23699d0da46cc6fd2ee3be420bbe6d020ae4a091e70b7e9fd" +checksum = "5d3d0e0f38255e7fa3cf31335b3a56f05febd18025f4db5ef7a0cfb4f8da651f" [[package]] name = "hex" @@ -2029,9 +2082,9 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.60" +version = "0.1.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +checksum = "b6a67363e2aa4443928ce15e57ebae94fd8949958fd1223c4cfc0cd473ad7539" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -2079,9 +2132,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.2.3" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177" +checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" dependencies = [ "equivalent", "hashbrown 0.14.3", @@ -2124,7 +2177,7 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" dependencies = [ - "hermit-abi 0.3.6", + "hermit-abi 0.3.4", "libc", "windows-sys 0.48.0", ] @@ -2137,12 +2190,12 @@ checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" [[package]] name = "is-terminal" -version = "0.4.12" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" +checksum = "0bad00257d07be169d870ab665980b06cdb366d792ad690bf2e76876dc503455" dependencies = [ - "hermit-abi 0.3.6", - "libc", + "hermit-abi 0.3.4", + "rustix 0.38.30", "windows-sys 0.52.0", ] @@ -2179,6 +2232,15 @@ version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" +[[package]] +name = "jobserver" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" +dependencies = [ + "libc", +] + [[package]] name = "js-sys" version = "0.3.63" @@ -2227,7 +2289,7 @@ name = "jsonschema" version = "0.15.0" source = "git+https://github.com/fominok/jsonschema-rs?branch=feat-unevaluated-properties#18f61ab46b4a06fb313fadadffd669058bddeafd" dependencies = [ - "ahash 0.7.8", + "ahash 0.7.7", "anyhow", "base64 0.21.7", "bytecount", @@ -2268,9 +2330,9 @@ checksum = "744a4c881f502e98c2241d2e5f50040ac73b30194d64452bb6260393b53f0dc9" [[package]] name = "libc" -version = "0.2.153" +version = "0.2.152" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" [[package]] name = "libloading" @@ -2300,9 +2362,9 @@ dependencies = [ [[package]] name = "libz-sys" -version = "1.1.15" +version = "1.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "037731f5d3aaa87a5675e895b63ddff1a87624bc29f77004ea829809654e48f6" +checksum = "295c17e837573c8c821dbaeb3cceb3d745ad082f7572191409e69cbc1b3fd050" dependencies = [ "cc", "pkg-config", @@ -2402,7 +2464,7 @@ version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fde3af1a009ed76a778cb84fdef9e7dbbdf5775ae3e4cc1f434a6a307f6f76c5" dependencies = [ - "ahash 0.8.9", + "ahash 0.8.7", "metrics-macros", "portable-atomic", ] @@ -2433,7 +2495,7 @@ checksum = "38b4faf00617defe497754acde3024865bc143d44a86799b24e191ecff91354f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.48", ] [[package]] @@ -2465,9 +2527,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.2" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" dependencies = [ "adler", ] @@ -2620,37 +2682,32 @@ dependencies = [ "num-traits", ] -[[package]] -name = "num-conv" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" - [[package]] name = "num-derive" -version = "0.4.2" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +checksum = "cfb77679af88f8b125209d354a202862602672222e7f2313fdd6dc349bad4712" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.48", ] [[package]] name = "num-integer" -version = "0.1.46" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" dependencies = [ + "autocfg", "num-traits", ] [[package]] name = "num-iter" -version = "0.1.44" +version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d869c01cc0c455284163fd0092f1f93835385ccab5a98a0dcc497b2f8bf055a9" +checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" dependencies = [ "autocfg", "num-integer", @@ -2671,9 +2728,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.18" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" dependencies = [ "autocfg", ] @@ -2684,7 +2741,7 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.3.6", + "hermit-abi 0.3.4", "libc", ] @@ -2796,27 +2853,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" dependencies = [ "fixedbitset", - "indexmap 2.2.3", + "indexmap 2.1.0", ] [[package]] name = "pin-project" -version = "1.1.4" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0302c4a0442c456bd56f841aee5c3bfd17967563f6fadc9ceb9f9c23cf3807e0" +checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.4" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "266c042b60c9c76b8d53061e52b2e0d1116abc57cefc8c5cd671619a56ac3690" +checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.48", ] [[package]] @@ -2843,9 +2900,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.30" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" +checksum = "2900ede94e305130c13ddd391e0ab7cbaeb783945ae07a279c268cb05109c6cb" [[package]] name = "platform-serialization" @@ -2861,7 +2918,7 @@ version = "1.0.0-dev.5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.48", "virtue 0.0.14", ] @@ -2874,7 +2931,7 @@ dependencies = [ "bs58 0.4.0", "ciborium", "hex", - "indexmap 2.2.3", + "indexmap 2.1.0", "lazy_static", "platform-serialization", "platform-version", @@ -2883,7 +2940,7 @@ dependencies = [ "serde", "serde_json", "thiserror", - "treediff 4.0.3", + "treediff 4.0.2", ] [[package]] @@ -2891,7 +2948,7 @@ name = "platform-value-convertible" version = "1.0.0-dev.5" dependencies = [ "quote", - "syn 2.0.50", + "syn 2.0.48", ] [[package]] @@ -2907,7 +2964,7 @@ version = "1.0.0-dev.5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.48", ] [[package]] @@ -3035,7 +3092,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a41cf62165e97c7f814d2221421dbb9afcbcdb0a88068e5ea206e19951c2cbb5" dependencies = [ "proc-macro2", - "syn 2.0.50", + "syn 2.0.48", ] [[package]] @@ -3054,7 +3111,7 @@ version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" dependencies = [ - "toml_edit 0.21.1", + "toml_edit 0.21.0", ] [[package]] @@ -3149,7 +3206,7 @@ dependencies = [ "prost 0.12.3", "prost-types 0.12.3", "regex", - "syn 2.0.50", + "syn 2.0.48", "tempfile", "which", ] @@ -3177,7 +3234,7 @@ dependencies = [ "itertools 0.11.0", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.48", ] [[package]] @@ -3220,11 +3277,11 @@ dependencies = [ [[package]] name = "pulldown-cmark" -version = "0.9.6" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57206b407293d2bcd3af849ce869d52068623f19e1b5ff8e8778e3309439682b" +checksum = "77a1a2f1f0a7ecff9c31abbe177637be0e97a0aef46cf8738ece09327985d998" dependencies = [ - "bitflags 2.4.2", + "bitflags 1.3.2", "memchr", "unicase", ] @@ -3336,7 +3393,7 @@ checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.5", + "regex-automata 0.4.4", "regex-syntax 0.8.2", ] @@ -3351,9 +3408,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.5" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd" +checksum = "3b7fa1134405e2ec9353fd416b17f8dacd46c473d7d3fd1cf202706a14eb792a" dependencies = [ "aho-corasick", "memchr", @@ -3374,9 +3431,9 @@ checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "rend" -version = "0.4.2" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" +checksum = "a2571463863a6bd50c32f94402933f03457a3fbaf697a707c5be741e459f08fd" dependencies = [ "bytecheck", ] @@ -3392,24 +3449,23 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.8" +version = "0.17.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" dependencies = [ "cc", - "cfg-if", "getrandom", "libc", "spin", "untrusted", - "windows-sys 0.52.0", + "windows-sys 0.48.0", ] [[package]] name = "rkyv" -version = "0.7.44" +version = "0.7.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cba464629b3394fc4dbc6f940ff8f5b4ff5c7aef40f29166fd4ad12acbc99c0" +checksum = "527a97cdfef66f65998b5f3b637c26f5a5ec09cc52a3f9932313ac645f4190f5" dependencies = [ "bitvec", "bytecheck", @@ -3425,9 +3481,9 @@ dependencies = [ [[package]] name = "rkyv_derive" -version = "0.7.44" +version = "0.7.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7dddfff8de25e6f62b9d64e6e432bf1c6736c57d20323e15ee10435fbda7c65" +checksum = "b5c462a1328c8e67e4d6dbad1eb0355dd43e8ab432c6e227a43657f16ade5033" dependencies = [ "proc-macro2", "quote", @@ -3470,7 +3526,7 @@ dependencies = [ "bincode 2.0.0-rc.3", "bip37-bloom-filter", "ciborium", - "clap 4.5.1", + "clap 4.4.18", "dapi-grpc", "dapi-grpc-macros", "dashcore-rpc", @@ -3509,9 +3565,9 @@ dependencies = [ [[package]] name = "rust_decimal" -version = "1.34.3" +version = "1.33.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39449a79f45e8da28c57c341891b69a183044b29518bb8f86dbac9df60bb7df" +checksum = "06676aec5ccb8fc1da723cc8c0f9a46549f21ebb8753d3915c6c41db1e7f1dc4" dependencies = [ "arrayvec", "borsh", @@ -3525,9 +3581,9 @@ dependencies = [ [[package]] name = "rust_decimal_macros" -version = "1.34.2" +version = "1.33.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e418701588729bef95e7a655f2b483ad64bb97c46e8e79fde83efd92aaab6d82" +checksum = "2e43721f4ef7060ebc2c3ede757733209564ca8207f47674181bcd425dd76945" dependencies = [ "quote", "rust_decimal", @@ -3570,9 +3626,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.31" +version = "0.38.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" +checksum = "322394588aaf33c24007e8bb3238ee3e4c5c09c084ab32bc73890b99ff326bca" dependencies = [ "bitflags 2.4.2", "errno", @@ -3609,30 +3665,32 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.6.3" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" +checksum = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792" dependencies = [ "openssl-probe", "rustls-pemfile", + "rustls-pki-types", "schannel", "security-framework", ] [[package]] name = "rustls-pemfile" -version = "1.0.4" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +checksum = "35e4980fa29e4c4b212ffb3db068a564cbf560e51d3944b7c88bd8bf5bec64f4" dependencies = [ "base64 0.21.7", + "rustls-pki-types", ] [[package]] name = "rustls-pki-types" -version = "1.3.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "048a63e5b3ac996d78d402940b5fa47973d2d080c6c6fffa1d0f19c4445310b7" +checksum = "0a716eb65e3158e90e17cd93d855216e27bde02745ab842f2cab4a39dba1bacf" [[package]] name = "rustls-webpki" @@ -3663,9 +3721,9 @@ checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" [[package]] name = "ryu" -version = "1.0.17" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" +checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" [[package]] name = "same-file" @@ -3762,18 +3820,18 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.22" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" +checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" dependencies = [ "serde", ] [[package]] name = "serde" -version = "1.0.197" +version = "1.0.195" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" +checksum = "63261df402c67811e9ac6def069e4786148c4563f4b50fd4bf30aa370d626b02" dependencies = [ "serde_derive", ] @@ -3809,22 +3867,22 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.197" +version = "1.0.195" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" +checksum = "46fe8f8603d81ba86327b23a2e9cdf49e1255fb94a4c5f297f6ee0547178ea2c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.48", ] [[package]] name = "serde_json" -version = "1.0.114" +version = "1.0.111" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" +checksum = "176e46fa42316f18edd598015a5166857fc835ec732f5215eac6b7bdbf0a84f4" dependencies = [ - "indexmap 2.2.3", + "indexmap 2.1.0", "itoa", "ryu", "serde", @@ -3838,7 +3896,7 @@ checksum = "0b2e6b945e9d3df726b65d6ee24060aff8e3533d431f677a9695db04eff9dfdb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.48", ] [[package]] @@ -3859,17 +3917,16 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.6.1" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15d167997bd841ec232f5b2b8e0e26606df2e7caa4c31b95ea9ca52b200bd270" +checksum = "f58c3a1b3e418f61c25b2aeb43fc6c95eaa252b8cecdda67f401943e9e08d33f" dependencies = [ "base64 0.21.7", "chrono", "hex", "serde", - "serde_derive", "serde_json", - "serde_with_macros 3.6.1", + "serde_with_macros 3.5.0", "time", ] @@ -3882,19 +3939,19 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.48", ] [[package]] name = "serde_with_macros" -version = "3.6.1" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "865f9743393e638991566a8b7a479043c2c8da94a33e0a31f18214c9cae0a64d" +checksum = "d2068b437a31fc68f25dd7edc296b078f04b45145c199d8eed9866e45f1ff274" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.48", ] [[package]] @@ -3974,9 +4031,9 @@ dependencies = [ [[package]] name = "sketches-ddsketch" -version = "0.2.2" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85636c14b73d81f541e525f585c0a2109e6744e1565b5c1668e31c70c10ed65c" +checksum = "68a406c1882ed7f29cd5e248c9848a80e7cb6ae0fea82346d2746f2f941c07e1" [[package]] name = "slab" @@ -4061,12 +4118,6 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" -[[package]] -name = "strsim" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01" - [[package]] name = "strum" version = "0.24.1" @@ -4108,7 +4159,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.50", + "syn 2.0.48", ] [[package]] @@ -4139,9 +4190,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.50" +version = "2.0.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74f1bdc9872430ce9b75da68329d1c1746faf50ffac5f19e02b71e37ff881ffb" +checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" dependencies = [ "proc-macro2", "quote", @@ -4157,7 +4208,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.48", ] [[package]] @@ -4192,20 +4243,21 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tempfile" -version = "3.10.0" +version = "3.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a365e8cd18e44762ef95d87f284f4b5cd04107fec2ff3052bd6a3e6069669e67" +checksum = "01ce4141aa927a6d1bd34a041795abd0db1cccba5d5f24b009f694bdf3a1f3fa" dependencies = [ "cfg-if", "fastrand 2.0.1", - "rustix 0.38.31", + "redox_syscall", + "rustix 0.38.30", "windows-sys 0.52.0", ] [[package]] name = "tenderdash-abci" version = "0.14.0-dev.6" -source = "git+https://github.com/dashpay/rs-tenderdash-abci?tag=v0.14.0-dev.6#701ba0fa92cb0f6bb5b986ec1ad141390040116c" +source = "git+https://github.com/dashpay/rs-tenderdash-abci?rev=81d28aa0b15fc0844dfa7f7251f6949f6c6c405a#81d28aa0b15fc0844dfa7f7251f6949f6c6c405a" dependencies = [ "bytes", "futures", @@ -4213,7 +4265,7 @@ dependencies = [ "lhash", "prost 0.12.3", "semver", - "tenderdash-proto 0.14.0-dev.6 (git+https://github.com/dashpay/rs-tenderdash-abci?tag=v0.14.0-dev.6)", + "tenderdash-proto", "thiserror", "tokio", "tokio-util", @@ -4226,25 +4278,7 @@ dependencies = [ [[package]] name = "tenderdash-proto" version = "0.14.0-dev.6" -source = "git+https://github.com/dashpay/rs-tenderdash-abci?tag=v0.14.0-dev.6#701ba0fa92cb0f6bb5b986ec1ad141390040116c" -dependencies = [ - "bytes", - "chrono", - "derive_more", - "flex-error", - "num-derive", - "num-traits", - "prost 0.12.3", - "serde", - "subtle-encoding", - "tenderdash-proto-compiler 0.14.0-dev.6 (git+https://github.com/dashpay/rs-tenderdash-abci?tag=v0.14.0-dev.6)", - "time", -] - -[[package]] -name = "tenderdash-proto" -version = "0.14.0-dev.6" -source = "git+https://github.com/dashpay/rs-tenderdash-abci#8b5afe6b653a430941d803f3c729c7c6d073734d" +source = "git+https://github.com/dashpay/rs-tenderdash-abci?rev=81d28aa0b15fc0844dfa7f7251f6949f6c6c405a#81d28aa0b15fc0844dfa7f7251f6949f6c6c405a" dependencies = [ "bytes", "chrono", @@ -4253,35 +4287,24 @@ dependencies = [ "num-derive", "num-traits", "prost 0.12.3", + "prost-types 0.12.3", "serde", "subtle-encoding", - "tenderdash-proto-compiler 0.14.0-dev.6 (git+https://github.com/dashpay/rs-tenderdash-abci)", + "tenderdash-proto-compiler", "time", + "tonic 0.11.0", ] [[package]] name = "tenderdash-proto-compiler" version = "0.14.0-dev.6" -source = "git+https://github.com/dashpay/rs-tenderdash-abci?tag=v0.14.0-dev.6#701ba0fa92cb0f6bb5b986ec1ad141390040116c" -dependencies = [ - "fs_extra", - "prost-build 0.12.3", - "regex", - "tempfile", - "ureq", - "walkdir", - "zip", -] - -[[package]] -name = "tenderdash-proto-compiler" -version = "0.14.0-dev.6" -source = "git+https://github.com/dashpay/rs-tenderdash-abci#8b5afe6b653a430941d803f3c729c7c6d073734d" +source = "git+https://github.com/dashpay/rs-tenderdash-abci?rev=81d28aa0b15fc0844dfa7f7251f6949f6c6c405a#81d28aa0b15fc0844dfa7f7251f6949f6c6c405a" dependencies = [ "fs_extra", "prost-build 0.12.3", "regex", "tempfile", + "tonic-build 0.11.0", "ureq", "walkdir", "zip", @@ -4335,29 +4358,29 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.57" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" +checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.57" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" +checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.48", ] [[package]] name = "thread_local" -version = "1.1.8" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" dependencies = [ "cfg-if", "once_cell", @@ -4365,13 +4388,12 @@ dependencies = [ [[package]] name = "time" -version = "0.3.34" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749" +checksum = "f657ba42c3f86e7680e53c8cd3af8abbe56b5491790b46e22e19c0d57463583e" dependencies = [ "deranged", "itoa", - "num-conv", "powerfmt", "serde", "time-core", @@ -4386,11 +4408,10 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.17" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774" +checksum = "26197e33420244aeb70c3e8c78376ca46571bc4e701e4791c2cd9f57dcb3a43f" dependencies = [ - "num-conv", "time-core", ] @@ -4435,6 +4456,7 @@ dependencies = [ "signal-hook-registry", "socket2 0.5.5", "tokio-macros", + "tracing", "windows-sys 0.48.0", ] @@ -4456,16 +4478,17 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.48", ] [[package]] name = "tokio-rustls" -version = "0.24.1" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" dependencies = [ - "rustls 0.21.10", + "rustls 0.22.2", + "rustls-pki-types", "tokio", ] @@ -4519,35 +4542,33 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.2.3", + "indexmap 2.1.0", "toml_datetime", "winnow", ] [[package]] name = "toml_edit" -version = "0.21.1" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" +checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03" dependencies = [ - "indexmap 2.2.3", + "indexmap 2.1.0", "toml_datetime", "winnow", ] [[package]] name = "tonic" -version = "0.9.2" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3082666a3a6433f7f511c7192923fa1fe07c69332d3c6a2e6bb040b569199d5a" +checksum = "d560933a0de61cf715926b9cac824d4c883c2c43142f787595e48280c40a1d0e" dependencies = [ "async-stream", "async-trait", "axum", "base64 0.21.7", "bytes", - "futures-core", - "futures-util", "h2", "http", "http-body", @@ -4555,9 +4576,37 @@ dependencies = [ "hyper-timeout", "percent-encoding", "pin-project", - "prost 0.11.9", + "prost 0.12.3", + "tokio", + "tokio-stream", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tonic" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76c4eb7a4e9ef9d4763600161f12f5070b92a578e1b634db88a6887844c91a13" +dependencies = [ + "async-stream", + "async-trait", + "axum", + "base64 0.21.7", + "bytes", + "h2", + "http", + "http-body", + "hyper", + "hyper-timeout", + "percent-encoding", + "pin-project", + "prost 0.12.3", "rustls-native-certs", "rustls-pemfile", + "rustls-pki-types", "tokio", "tokio-rustls", "tokio-stream", @@ -4580,6 +4629,19 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "tonic-build" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4ef6dd70a610078cb4e338a0f79d06bc759ff1b22d2120c2ff02ae264ba9c2" +dependencies = [ + "prettyplease 0.2.16", + "proc-macro2", + "prost-build 0.12.3", + "quote", + "syn 2.0.48", +] + [[package]] name = "tower" version = "0.4.13" @@ -4631,7 +4693,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.48", ] [[package]] @@ -4697,9 +4759,9 @@ dependencies = [ [[package]] name = "treediff" -version = "4.0.3" +version = "4.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d127780145176e2b5d16611cc25a900150e86e9fd79d3bde6ff3a37359c9cb5" +checksum = "52984d277bdf2a751072b5df30ec0377febdb02f7696d64c2d7d54630bac4303" [[package]] name = "triomphe" @@ -4742,9 +4804,9 @@ checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-normalization" -version = "0.1.23" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" dependencies = [ "tinyvec", ] @@ -4781,17 +4843,16 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "ureq" -version = "2.9.6" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11f214ce18d8b2cbe84ed3aa6486ed3f5b285cf8d8fbdbce9f3f767a724adc35" +checksum = "f8cdd25c339e200129fe4de81451814e5228c9b771d57378817d6117cc2b3f97" dependencies = [ "base64 0.21.7", "flate2", "log", "once_cell", - "rustls 0.22.2", - "rustls-pki-types", - "rustls-webpki 0.102.2", + "rustls 0.21.10", + "rustls-webpki 0.101.7", "url", "webpki-roots", ] @@ -4911,7 +4972,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.48", "wasm-bindgen-shared", ] @@ -4945,7 +5006,7 @@ checksum = "e128beba882dd1eb6200e1dc92ae6c5dbaa4311aa7bb211ca035779e5efc39f8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.48", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5001,12 +5062,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.26.1" +version = "0.25.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3de34ae270483955a94f4b21bdaaeb83d508bb84a01435f393818edb0012009" -dependencies = [ - "rustls-pki-types", -] +checksum = "1778a42e8b3b90bff8d0f5032bf22250792889a5cdc752aa0020c84abe3aaf10" [[package]] name = "which" @@ -5017,7 +5075,7 @@ dependencies = [ "either", "home", "once_cell", - "rustix 0.38.31", + "rustix 0.38.30", ] [[package]] @@ -5194,9 +5252,9 @@ checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" [[package]] name = "winnow" -version = "0.5.40" +version = "0.5.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +checksum = "b7cf47b659b318dccbd69cc4797a39ae128f533dce7902a1096044d1967b9c16" dependencies = [ "memchr", ] @@ -5246,7 +5304,7 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.48", ] [[package]] diff --git a/Dockerfile b/Dockerfile index c71825b40f..918aeba05b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -73,7 +73,7 @@ RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- \ --profile minimal \ -y \ # Rust version the same as in /README.md - --default-toolchain stable \ + --default-toolchain 1.76 \ --target wasm32-unknown-unknown # Install protoc - protobuf compiler @@ -265,6 +265,7 @@ CMD ["start"] # ABCI interface EXPOSE 26658 +EXPOSE 26659 # Prometheus port EXPOSE 29090 @@ -296,7 +297,6 @@ COPY --from=build-dashmate-helper /platform/package.json /platform/yarn.lock /pl COPY --from=build-dashmate-helper /platform/packages/dashmate packages/dashmate COPY --from=build-dashmate-helper /platform/packages/dashpay-contract packages/dashpay-contract COPY --from=build-dashmate-helper /platform/packages/wallet-lib packages/wallet-lib -COPY --from=build-dashmate-helper /platform/packages/js-dash-sdk packages/js-dash-sdk COPY --from=build-dashmate-helper /platform/packages/js-dapi-client packages/js-dapi-client COPY --from=build-dashmate-helper /platform/packages/js-grpc-common packages/js-grpc-common COPY --from=build-dashmate-helper /platform/packages/dapi-grpc packages/dapi-grpc diff --git a/README.md b/README.md index c01ce4f23c..628306d98b 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ this repository may be used on the following networks: - Install prerequisites: - [node.js](https://nodejs.org/) v20 - [docker](https://docs.docker.com/get-docker/) v20.10+ - - [rust](https://www.rust-lang.org/tools/install) v1.73+, with wasm32 target (`rustup target add wasm32-unknown-unknown`) + - [rust](https://www.rust-lang.org/tools/install) v1.76+, with wasm32 target (`rustup target add wasm32-unknown-unknown`) - [protoc - protobuf compiler](https://github.com/protocolbuffers/protobuf/releases) v25.2+ - if needed, set PROTOC environment variable to location of `protoc` binary - [wasm-bingen toolchain](https://rustwasm.github.io/wasm-bindgen/): diff --git a/packages/dapi-grpc/Cargo.toml b/packages/dapi-grpc/Cargo.toml index 69c11c653f..9ce1b4b228 100644 --- a/packages/dapi-grpc/Cargo.toml +++ b/packages/dapi-grpc/Cargo.toml @@ -3,36 +3,43 @@ name = "dapi-grpc" description = "GRPC client for Dash Platform" version = "1.0.0-dev.5" authors = [ - "Samuel Westrich ", - "Igor Markin ", - "Łukasz Klimek ", - "Anton Suprunchuk ", - "Ivan Shumkov ", + "Samuel Westrich ", + "Igor Markin ", + "Łukasz Klimek ", + "Anton Suprunchuk ", + "Ivan Shumkov ", ] edition = "2021" -rust-version = "1.73" +rust-version = "1.76" license = "MIT" [features] -default = ["core", "platform", "client", "serde"] +# Enable all features by default, otherwise different crates +# triggier bulding proto with different feature set that overwrites +# previous results and causes build errors +default = ["core", "platform", "client", "serde", "server"] core = [] platform = [] # Re-export Dash Platform protobuf types as `dapi_grpc::platform::proto` tenderdash-proto = [] client = ["tonic/channel", "tonic/tls", "tonic/tls-roots", "platform"] +server = ["tonic/channel", "tonic/tls", "tonic/tls-roots", "platform"] serde = ["dep:serde", "dep:serde_bytes"] mocks = ["dep:serde_json"] [dependencies] -prost = { version = "0.11.9" } -tonic = { version = "0.9.2", features = [ - "codegen", - "prost", +prost = { version = "0.12.3" } +futures-core = "0.3.30" +tonic = { version = "0.11", features = [ + "codegen", + "prost", ], default-features = false } serde = { version = "1.0.171", optional = true, features = ["derive"] } serde_bytes = { version = "0.11.12", optional = true } serde_json = { version = "1.0", optional = true } -tenderdash-proto = { git = "https://github.com/dashpay/rs-tenderdash-abci", version = "0.14.0-dev.6" } +tenderdash-proto = { git = "https://github.com/dashpay/rs-tenderdash-abci", rev = "81d28aa0b15fc0844dfa7f7251f6949f6c6c405a", features = [ + "grpc-server", +] } dapi-grpc-macros = { path = "../rs-dapi-grpc-macros" } platform-version = { path = "../rs-platform-version" } diff --git a/packages/dapi-grpc/build.rs b/packages/dapi-grpc/build.rs index 34800fd970..6101c49bbd 100644 --- a/packages/dapi-grpc/build.rs +++ b/packages/dapi-grpc/build.rs @@ -10,6 +10,7 @@ fn main() { PathBuf::from("protos/core/v0/core.proto"), PathBuf::from("src/core/proto"), ); + configure_core(core) .generate() .expect("generate core proto"); @@ -18,6 +19,7 @@ fn main() { PathBuf::from("protos/platform/v0/platform.proto"), PathBuf::from("src/platform/proto"), ); + configure_platform(platform) .generate() .expect("generate platform proto"); @@ -164,16 +166,16 @@ impl MappingConfig { let protobuf_file = abs_path(&protobuf_file); let out_dir = abs_path(&out_dir); + let build_server = cfg!(feature = "server"); + let build_client = cfg!(feature = "client"); + let builder = tonic_build::configure() - .build_server(false) + .build_server(build_server) + .build_client(build_client) + .build_transport(build_server || build_client) .out_dir(out_dir.clone()) .protoc_arg("--experimental_allow_proto3_optional"); - #[cfg(feature = "client")] - let builder = builder.build_client(true).build_transport(true); - #[cfg(not(feature = "client"))] - let builder = builder.build_client(false).build_transport(false); - Self { protobuf_file, out_dir, diff --git a/packages/dapi-grpc/clients/platform/v0/nodejs/PlatformPromiseClient.js b/packages/dapi-grpc/clients/platform/v0/nodejs/PlatformPromiseClient.js index dd34011d0e..11f70cce87 100644 --- a/packages/dapi-grpc/clients/platform/v0/nodejs/PlatformPromiseClient.js +++ b/packages/dapi-grpc/clients/platform/v0/nodejs/PlatformPromiseClient.js @@ -48,6 +48,8 @@ const { PBJSGetProtocolVersionUpgradeVoteStatusResponse, GetProtocolVersionUpgradeStateRequest: PBJSGetProtocolVersionUpgradeStateRequest, GetProtocolVersionUpgradeStateResponse: PBJSGetProtocolVersionUpgradeStateResponse, + GetProofsRequest: PBJSGetProofsRequest, + GetProofsResponse: PBJSGetProofsResponse, GetIdentityContractNonceRequest: PBJSGetIdentityContractNonceRequest, GetIdentityContractNonceResponse: PBJSGetIdentityContractNonceResponse, GetIdentityNonceRequest: PBJSGetIdentityNonceRequest, @@ -71,6 +73,7 @@ const { GetEpochsInfoResponse: ProtocGetEpochsInfoResponse, GetProtocolVersionUpgradeVoteStatusResponse: ProtocGetProtocolVersionUpgradeVoteStatusResponse, GetProtocolVersionUpgradeStateResponse: ProtocGetProtocolVersionUpgradeStateResponse, + GetProofsResponse: ProtocGetProofsResponse, GetIdentityContractNonceResponse: ProtocGetIdentityContractNonceResponse, GetIdentityNonceResponse: ProtocGetIdentityNonceResponse, } = require('./platform_protoc'); @@ -143,6 +146,10 @@ class PlatformPromiseClient { this.client.getProtocolVersionUpgradeState.bind(this.client), ); + this.client.getProofs = promisify( + this.client.getProofs.bind(this.client), + ); + this.client.getIdentityContractNonce = promisify( this.client.getIdentityContractNonce.bind(this.client), ); @@ -510,6 +517,38 @@ class PlatformPromiseClient { ); } + /** + * + * @param {!GetProofsRequest} request + * @param {?Object} metadata + * @param {CallOptions} [options={}] + * @returns {Promise} + */ + getProofs(request, metadata = {}, options = {}) { + if (!isObject(metadata)) { + throw new Error('metadata must be an object'); + } + + return this.client.getProofs( + request, + convertObjectToMetadata(metadata), + { + interceptors: [ + jsonToProtobufInterceptorFactory( + jsonToProtobufFactory( + ProtocGetProofsResponse, + PBJSGetProofsResponse, + ), + protobufToJsonFactory( + PBJSGetProofsRequest, + ), + ), + ], + ...options, + }, + ); + } + /** * @param {!PBJSGetIdentityContractNonceRequest} getIdentityContractNonceRequest * @param {?Object} metadata diff --git a/packages/dapi-grpc/src/core/proto/org.dash.platform.dapi.v0.rs b/packages/dapi-grpc/src/core/proto/org.dash.platform.dapi.v0.rs index b8fb055c6c..05b6d41005 100644 --- a/packages/dapi-grpc/src/core/proto/org.dash.platform.dapi.v0.rs +++ b/packages/dapi-grpc/src/core/proto/org.dash.platform.dapi.v0.rs @@ -719,3 +719,525 @@ pub mod core_client { } } } +/// Generated server implementations. +pub mod core_server { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + /// Generated trait containing gRPC methods that should be implemented for use with CoreServer. + #[async_trait] + pub trait Core: Send + Sync + 'static { + async fn get_status( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_block( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn broadcast_transaction( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_transaction( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_estimated_transaction_fee( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /// Server streaming response type for the subscribeToBlockHeadersWithChainLocks method. + type subscribeToBlockHeadersWithChainLocksStream: futures_core::Stream< + Item = std::result::Result< + super::BlockHeadersWithChainLocksResponse, + tonic::Status, + >, + > + + Send + + 'static; + async fn subscribe_to_block_headers_with_chain_locks( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /// Server streaming response type for the subscribeToTransactionsWithProofs method. + type subscribeToTransactionsWithProofsStream: futures_core::Stream< + Item = std::result::Result< + super::TransactionsWithProofsResponse, + tonic::Status, + >, + > + + Send + + 'static; + async fn subscribe_to_transactions_with_proofs( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + } + #[derive(Debug)] + pub struct CoreServer { + inner: _Inner, + accept_compression_encodings: EnabledCompressionEncodings, + send_compression_encodings: EnabledCompressionEncodings, + max_decoding_message_size: Option, + max_encoding_message_size: Option, + } + struct _Inner(Arc); + impl CoreServer { + pub fn new(inner: T) -> Self { + Self::from_arc(Arc::new(inner)) + } + pub fn from_arc(inner: Arc) -> Self { + let inner = _Inner(inner); + Self { + inner, + accept_compression_encodings: Default::default(), + send_compression_encodings: Default::default(), + max_decoding_message_size: None, + max_encoding_message_size: None, + } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> InterceptedService + where + F: tonic::service::Interceptor, + { + InterceptedService::new(Self::new(inner), interceptor) + } + /// Enable decompressing requests with the given encoding. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.accept_compression_encodings.enable(encoding); + self + } + /// Compress responses with the given encoding, if the client supports it. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.send_compression_encodings.enable(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.max_decoding_message_size = Some(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.max_encoding_message_size = Some(limit); + self + } + } + impl tonic::codegen::Service> for CoreServer + where + T: Core, + B: Body + Send + 'static, + B::Error: Into + Send + 'static, + { + type Response = http::Response; + type Error = std::convert::Infallible; + type Future = BoxFuture; + fn poll_ready( + &mut self, + _cx: &mut Context<'_>, + ) -> Poll> { + Poll::Ready(Ok(())) + } + fn call(&mut self, req: http::Request) -> Self::Future { + let inner = self.inner.clone(); + match req.uri().path() { + "/org.dash.platform.dapi.v0.Core/getStatus" => { + #[allow(non_camel_case_types)] + struct getStatusSvc(pub Arc); + impl tonic::server::UnaryService + for getStatusSvc { + type Response = super::GetStatusResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { (*inner).get_status(request).await }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = getStatusSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/org.dash.platform.dapi.v0.Core/getBlock" => { + #[allow(non_camel_case_types)] + struct getBlockSvc(pub Arc); + impl tonic::server::UnaryService + for getBlockSvc { + type Response = super::GetBlockResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { (*inner).get_block(request).await }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = getBlockSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/org.dash.platform.dapi.v0.Core/broadcastTransaction" => { + #[allow(non_camel_case_types)] + struct broadcastTransactionSvc(pub Arc); + impl< + T: Core, + > tonic::server::UnaryService + for broadcastTransactionSvc { + type Response = super::BroadcastTransactionResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner).broadcast_transaction(request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = broadcastTransactionSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/org.dash.platform.dapi.v0.Core/getTransaction" => { + #[allow(non_camel_case_types)] + struct getTransactionSvc(pub Arc); + impl< + T: Core, + > tonic::server::UnaryService + for getTransactionSvc { + type Response = super::GetTransactionResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner).get_transaction(request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = getTransactionSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/org.dash.platform.dapi.v0.Core/getEstimatedTransactionFee" => { + #[allow(non_camel_case_types)] + struct getEstimatedTransactionFeeSvc(pub Arc); + impl< + T: Core, + > tonic::server::UnaryService< + super::GetEstimatedTransactionFeeRequest, + > for getEstimatedTransactionFeeSvc { + type Response = super::GetEstimatedTransactionFeeResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::GetEstimatedTransactionFeeRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner).get_estimated_transaction_fee(request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = getEstimatedTransactionFeeSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/org.dash.platform.dapi.v0.Core/subscribeToBlockHeadersWithChainLocks" => { + #[allow(non_camel_case_types)] + struct subscribeToBlockHeadersWithChainLocksSvc(pub Arc); + impl< + T: Core, + > tonic::server::ServerStreamingService< + super::BlockHeadersWithChainLocksRequest, + > for subscribeToBlockHeadersWithChainLocksSvc { + type Response = super::BlockHeadersWithChainLocksResponse; + type ResponseStream = T::subscribeToBlockHeadersWithChainLocksStream; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::BlockHeadersWithChainLocksRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner) + .subscribe_to_block_headers_with_chain_locks(request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = subscribeToBlockHeadersWithChainLocksSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.server_streaming(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/org.dash.platform.dapi.v0.Core/subscribeToTransactionsWithProofs" => { + #[allow(non_camel_case_types)] + struct subscribeToTransactionsWithProofsSvc(pub Arc); + impl< + T: Core, + > tonic::server::ServerStreamingService< + super::TransactionsWithProofsRequest, + > for subscribeToTransactionsWithProofsSvc { + type Response = super::TransactionsWithProofsResponse; + type ResponseStream = T::subscribeToTransactionsWithProofsStream; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner) + .subscribe_to_transactions_with_proofs(request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = subscribeToTransactionsWithProofsSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.server_streaming(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + _ => { + Box::pin(async move { + Ok( + http::Response::builder() + .status(200) + .header("grpc-status", "12") + .header("content-type", "application/grpc") + .body(empty_body()) + .unwrap(), + ) + }) + } + } + } + } + impl Clone for CoreServer { + fn clone(&self) -> Self { + let inner = self.inner.clone(); + Self { + inner, + accept_compression_encodings: self.accept_compression_encodings, + send_compression_encodings: self.send_compression_encodings, + max_decoding_message_size: self.max_decoding_message_size, + max_encoding_message_size: self.max_encoding_message_size, + } + } + } + impl Clone for _Inner { + fn clone(&self) -> Self { + Self(Arc::clone(&self.0)) + } + } + impl std::fmt::Debug for _Inner { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{:?}", self.0) + } + } + impl tonic::server::NamedService for CoreServer { + const NAME: &'static str = "org.dash.platform.dapi.v0.Core"; + } +} diff --git a/packages/dapi-grpc/src/platform/proto/org.dash.platform.dapi.v0.rs b/packages/dapi-grpc/src/platform/proto/org.dash.platform.dapi.v0.rs index 48bbf3a222..34e7d78313 100644 --- a/packages/dapi-grpc/src/platform/proto/org.dash.platform.dapi.v0.rs +++ b/packages/dapi-grpc/src/platform/proto/org.dash.platform.dapi.v0.rs @@ -2816,3 +2816,1215 @@ pub mod platform_client { } } } +/// Generated server implementations. +pub mod platform_server { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + /// Generated trait containing gRPC methods that should be implemented for use with PlatformServer. + #[async_trait] + pub trait Platform: Send + Sync + 'static { + async fn broadcast_state_transition( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_identity( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_identities( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_identity_keys( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_identity_nonce( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_identity_contract_nonce( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_identity_balance( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_identity_balance_and_revision( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_proofs( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_data_contract( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_data_contract_history( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_data_contracts( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_documents( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_identities_by_public_key_hashes( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_identity_by_public_key_hash( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn wait_for_state_transition_result( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_consensus_params( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_protocol_version_upgrade_state( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_protocol_version_upgrade_vote_status( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_epochs_info( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + } + #[derive(Debug)] + pub struct PlatformServer { + inner: _Inner, + accept_compression_encodings: EnabledCompressionEncodings, + send_compression_encodings: EnabledCompressionEncodings, + max_decoding_message_size: Option, + max_encoding_message_size: Option, + } + struct _Inner(Arc); + impl PlatformServer { + pub fn new(inner: T) -> Self { + Self::from_arc(Arc::new(inner)) + } + pub fn from_arc(inner: Arc) -> Self { + let inner = _Inner(inner); + Self { + inner, + accept_compression_encodings: Default::default(), + send_compression_encodings: Default::default(), + max_decoding_message_size: None, + max_encoding_message_size: None, + } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> InterceptedService + where + F: tonic::service::Interceptor, + { + InterceptedService::new(Self::new(inner), interceptor) + } + /// Enable decompressing requests with the given encoding. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.accept_compression_encodings.enable(encoding); + self + } + /// Compress responses with the given encoding, if the client supports it. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.send_compression_encodings.enable(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.max_decoding_message_size = Some(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.max_encoding_message_size = Some(limit); + self + } + } + impl tonic::codegen::Service> for PlatformServer + where + T: Platform, + B: Body + Send + 'static, + B::Error: Into + Send + 'static, + { + type Response = http::Response; + type Error = std::convert::Infallible; + type Future = BoxFuture; + fn poll_ready( + &mut self, + _cx: &mut Context<'_>, + ) -> Poll> { + Poll::Ready(Ok(())) + } + fn call(&mut self, req: http::Request) -> Self::Future { + let inner = self.inner.clone(); + match req.uri().path() { + "/org.dash.platform.dapi.v0.Platform/broadcastStateTransition" => { + #[allow(non_camel_case_types)] + struct broadcastStateTransitionSvc(pub Arc); + impl< + T: Platform, + > tonic::server::UnaryService + for broadcastStateTransitionSvc { + type Response = super::BroadcastStateTransitionResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::BroadcastStateTransitionRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner).broadcast_state_transition(request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = broadcastStateTransitionSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/org.dash.platform.dapi.v0.Platform/getIdentity" => { + #[allow(non_camel_case_types)] + struct getIdentitySvc(pub Arc); + impl< + T: Platform, + > tonic::server::UnaryService + for getIdentitySvc { + type Response = super::GetIdentityResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner).get_identity(request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = getIdentitySvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/org.dash.platform.dapi.v0.Platform/getIdentities" => { + #[allow(non_camel_case_types)] + struct getIdentitiesSvc(pub Arc); + impl< + T: Platform, + > tonic::server::UnaryService + for getIdentitiesSvc { + type Response = super::GetIdentitiesResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner).get_identities(request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = getIdentitiesSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/org.dash.platform.dapi.v0.Platform/getIdentityKeys" => { + #[allow(non_camel_case_types)] + struct getIdentityKeysSvc(pub Arc); + impl< + T: Platform, + > tonic::server::UnaryService + for getIdentityKeysSvc { + type Response = super::GetIdentityKeysResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner).get_identity_keys(request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = getIdentityKeysSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/org.dash.platform.dapi.v0.Platform/getIdentityNonce" => { + #[allow(non_camel_case_types)] + struct getIdentityNonceSvc(pub Arc); + impl< + T: Platform, + > tonic::server::UnaryService + for getIdentityNonceSvc { + type Response = super::GetIdentityNonceResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner).get_identity_nonce(request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = getIdentityNonceSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/org.dash.platform.dapi.v0.Platform/getIdentityContractNonce" => { + #[allow(non_camel_case_types)] + struct getIdentityContractNonceSvc(pub Arc); + impl< + T: Platform, + > tonic::server::UnaryService + for getIdentityContractNonceSvc { + type Response = super::GetIdentityContractNonceResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::GetIdentityContractNonceRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner).get_identity_contract_nonce(request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = getIdentityContractNonceSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/org.dash.platform.dapi.v0.Platform/getIdentityBalance" => { + #[allow(non_camel_case_types)] + struct getIdentityBalanceSvc(pub Arc); + impl< + T: Platform, + > tonic::server::UnaryService + for getIdentityBalanceSvc { + type Response = super::GetIdentityBalanceResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner).get_identity_balance(request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = getIdentityBalanceSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/org.dash.platform.dapi.v0.Platform/getIdentityBalanceAndRevision" => { + #[allow(non_camel_case_types)] + struct getIdentityBalanceAndRevisionSvc(pub Arc); + impl< + T: Platform, + > tonic::server::UnaryService< + super::GetIdentityBalanceAndRevisionRequest, + > for getIdentityBalanceAndRevisionSvc { + type Response = super::GetIdentityBalanceAndRevisionResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::GetIdentityBalanceAndRevisionRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner).get_identity_balance_and_revision(request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = getIdentityBalanceAndRevisionSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/org.dash.platform.dapi.v0.Platform/getProofs" => { + #[allow(non_camel_case_types)] + struct getProofsSvc(pub Arc); + impl< + T: Platform, + > tonic::server::UnaryService + for getProofsSvc { + type Response = super::GetProofsResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { (*inner).get_proofs(request).await }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = getProofsSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/org.dash.platform.dapi.v0.Platform/getDataContract" => { + #[allow(non_camel_case_types)] + struct getDataContractSvc(pub Arc); + impl< + T: Platform, + > tonic::server::UnaryService + for getDataContractSvc { + type Response = super::GetDataContractResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner).get_data_contract(request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = getDataContractSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/org.dash.platform.dapi.v0.Platform/getDataContractHistory" => { + #[allow(non_camel_case_types)] + struct getDataContractHistorySvc(pub Arc); + impl< + T: Platform, + > tonic::server::UnaryService + for getDataContractHistorySvc { + type Response = super::GetDataContractHistoryResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner).get_data_contract_history(request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = getDataContractHistorySvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/org.dash.platform.dapi.v0.Platform/getDataContracts" => { + #[allow(non_camel_case_types)] + struct getDataContractsSvc(pub Arc); + impl< + T: Platform, + > tonic::server::UnaryService + for getDataContractsSvc { + type Response = super::GetDataContractsResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner).get_data_contracts(request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = getDataContractsSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/org.dash.platform.dapi.v0.Platform/getDocuments" => { + #[allow(non_camel_case_types)] + struct getDocumentsSvc(pub Arc); + impl< + T: Platform, + > tonic::server::UnaryService + for getDocumentsSvc { + type Response = super::GetDocumentsResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner).get_documents(request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = getDocumentsSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/org.dash.platform.dapi.v0.Platform/getIdentitiesByPublicKeyHashes" => { + #[allow(non_camel_case_types)] + struct getIdentitiesByPublicKeyHashesSvc(pub Arc); + impl< + T: Platform, + > tonic::server::UnaryService< + super::GetIdentitiesByPublicKeyHashesRequest, + > for getIdentitiesByPublicKeyHashesSvc { + type Response = super::GetIdentitiesByPublicKeyHashesResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::GetIdentitiesByPublicKeyHashesRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner).get_identities_by_public_key_hashes(request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = getIdentitiesByPublicKeyHashesSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/org.dash.platform.dapi.v0.Platform/getIdentityByPublicKeyHash" => { + #[allow(non_camel_case_types)] + struct getIdentityByPublicKeyHashSvc(pub Arc); + impl< + T: Platform, + > tonic::server::UnaryService< + super::GetIdentityByPublicKeyHashRequest, + > for getIdentityByPublicKeyHashSvc { + type Response = super::GetIdentityByPublicKeyHashResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::GetIdentityByPublicKeyHashRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner).get_identity_by_public_key_hash(request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = getIdentityByPublicKeyHashSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/org.dash.platform.dapi.v0.Platform/waitForStateTransitionResult" => { + #[allow(non_camel_case_types)] + struct waitForStateTransitionResultSvc(pub Arc); + impl< + T: Platform, + > tonic::server::UnaryService< + super::WaitForStateTransitionResultRequest, + > for waitForStateTransitionResultSvc { + type Response = super::WaitForStateTransitionResultResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::WaitForStateTransitionResultRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner).wait_for_state_transition_result(request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = waitForStateTransitionResultSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/org.dash.platform.dapi.v0.Platform/getConsensusParams" => { + #[allow(non_camel_case_types)] + struct getConsensusParamsSvc(pub Arc); + impl< + T: Platform, + > tonic::server::UnaryService + for getConsensusParamsSvc { + type Response = super::GetConsensusParamsResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner).get_consensus_params(request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = getConsensusParamsSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/org.dash.platform.dapi.v0.Platform/getProtocolVersionUpgradeState" => { + #[allow(non_camel_case_types)] + struct getProtocolVersionUpgradeStateSvc(pub Arc); + impl< + T: Platform, + > tonic::server::UnaryService< + super::GetProtocolVersionUpgradeStateRequest, + > for getProtocolVersionUpgradeStateSvc { + type Response = super::GetProtocolVersionUpgradeStateResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::GetProtocolVersionUpgradeStateRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner).get_protocol_version_upgrade_state(request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = getProtocolVersionUpgradeStateSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/org.dash.platform.dapi.v0.Platform/getProtocolVersionUpgradeVoteStatus" => { + #[allow(non_camel_case_types)] + struct getProtocolVersionUpgradeVoteStatusSvc( + pub Arc, + ); + impl< + T: Platform, + > tonic::server::UnaryService< + super::GetProtocolVersionUpgradeVoteStatusRequest, + > for getProtocolVersionUpgradeVoteStatusSvc { + type Response = super::GetProtocolVersionUpgradeVoteStatusResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::GetProtocolVersionUpgradeVoteStatusRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner) + .get_protocol_version_upgrade_vote_status(request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = getProtocolVersionUpgradeVoteStatusSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/org.dash.platform.dapi.v0.Platform/getEpochsInfo" => { + #[allow(non_camel_case_types)] + struct getEpochsInfoSvc(pub Arc); + impl< + T: Platform, + > tonic::server::UnaryService + for getEpochsInfoSvc { + type Response = super::GetEpochsInfoResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner).get_epochs_info(request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = getEpochsInfoSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + _ => { + Box::pin(async move { + Ok( + http::Response::builder() + .status(200) + .header("grpc-status", "12") + .header("content-type", "application/grpc") + .body(empty_body()) + .unwrap(), + ) + }) + } + } + } + } + impl Clone for PlatformServer { + fn clone(&self) -> Self { + let inner = self.inner.clone(); + Self { + inner, + accept_compression_encodings: self.accept_compression_encodings, + send_compression_encodings: self.send_compression_encodings, + max_decoding_message_size: self.max_decoding_message_size, + max_encoding_message_size: self.max_encoding_message_size, + } + } + } + impl Clone for _Inner { + fn clone(&self) -> Self { + Self(Arc::clone(&self.0)) + } + } + impl std::fmt::Debug for _Inner { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{:?}", self.0) + } + } + impl tonic::server::NamedService for PlatformServer { + const NAME: &'static str = "org.dash.platform.dapi.v0.Platform"; + } +} diff --git a/packages/dapi/.env.example b/packages/dapi/.env.example index be5c19be43..76ff9cd614 100644 --- a/packages/dapi/.env.example +++ b/packages/dapi/.env.example @@ -35,6 +35,9 @@ BLOCK_HEADERS_CACHE_SIZE=500 TENDERMINT_RPC_HOST=localhost TENDERMINT_RPC_PORT=26657 +DRIVE_RPC_HOST=localhost +DRIVE_RPC_PORT=26670 + # SERVICE_IMAGE_DRIVE= # Drive image name, if omitted dashpay/dashrive is used # SERVICE_IMAGE_DAPI= # DAPI image name, if omitted dashpay/dapi is used # SERVICE_IMAGE_CORE= # Dash Core image name, if omitted dashpay/dashcore is used diff --git a/packages/dapi/lib/config/index.js b/packages/dapi/lib/config/index.js index 2bbf4945fa..507b9f2ed2 100644 --- a/packages/dapi/lib/config/index.js +++ b/packages/dapi/lib/config/index.js @@ -92,6 +92,10 @@ module.exports = { host: config[OPTIONS.TENDERMINT_RPC_HOST], port: parseInt(config[OPTIONS.TENDERMINT_RPC_PORT], 10), }, + driveRpc: { + host: config[OPTIONS.DRIVE_RPC_HOST], + port: parseInt(config[OPTIONS.DRIVE_RPC_PORT], 10), + }, blockHeaders: { cache: { maxSize: Number(config[OPTIONS.BLOCK_HEADERS_CACHE_SIZE]), diff --git a/packages/dapi/lib/externalApis/drive/DriveClient.js b/packages/dapi/lib/externalApis/drive/DriveClient.js deleted file mode 100644 index 7614990771..0000000000 --- a/packages/dapi/lib/externalApis/drive/DriveClient.js +++ /dev/null @@ -1,285 +0,0 @@ -const jayson = require('jayson/promise'); - -const RPCError = require('../../rpcServer/RPCError'); -const createGrpcErrorFromDriveResponse = require('../../grpcServer/handlers/createGrpcErrorFromDriveResponse'); - -class DriveClient { - /** - * @param options - * @param {string} options.host - * @param {number} options.port - */ - constructor({ host, port }) { - this.client = jayson.client.http({ host, port }); - } - - /** - * Makes request to Drive and handle response - * - * @param {string} path - * @param {Uint8Array} data - * - * @return {Promise} - */ - async request(path, data) { - const requestOptions = { - path, - data: Buffer.from(data).toString('hex'), - }; - - const { result, error } = await this.client.request( - 'abci_query', - requestOptions, - ); - - // Handle JSON RPC error - if (error) { - throw new RPCError(error.code || -32602, error.message || 'Internal error', error.data); - } - - // Check and handle ABCI errors - const { response } = result; - - if (response.code === undefined || response.code === 0) { - // no errors found return the serialized response value - return Buffer.from(response.value, 'base64'); - } - - throw await createGrpcErrorFromDriveResponse(response.code, response.info); - } - - /** - * Fetch serialized data contract - * - * @param {GetDataContractRequest} request - * - * @return {Promise} - */ - async fetchDataContract(request) { - return this.request( - '/dataContract', - request.serializeBinary(), - ); - } - - /** - * Fetch serialized data contracts - * - * @param {GetDataContractsRequest} request - * - * @return {Promise} - */ - async fetchDataContracts(request) { - return this.request( - '/dataContracts', - request.serializeBinary(), - ); - } - - /** - * Fetch serialized data contract - * - * @param {GetDataContractHistoryRequest} request - * - * @return {Promise} - */ - async fetchDataContractHistory(request) { - return this.request( - '/dataContractHistory', - request.serializeBinary(), - ); - } - - /** - * Fetch serialized documents - * - * @param {GetDocumentsRequest} request - * - * @return {Promise} - */ - async fetchDocuments(request) { - return this.request( - '/dataContract/documents', - request.serializeBinary(), - ); - } - - /** - * Fetch serialized identity - * - * @param {GetIdentityRequest} request - * - * @return {Promise} - */ - async fetchIdentity(request) { - return this.request( - '/identity', - request.serializeBinary(), - ); - } - - /** - * Fetch serialized identities - * - * @param {GetIdentitiesRequest} request - * - * @return {Promise} - */ - async fetchIdentities(request) { - return this.request( - '/identities', - request.serializeBinary(), - ); - } - - /** - * Fetch serialized identity balance - * - * @param {GetIdentityBalanceRequest} request - * - * @return {Promise} - */ - async fetchIdentityBalance(request) { - return this.request( - '/identity/balance', - request.serializeBinary(), - ); - } - - /** - * Fetch serialized identity balance and revision - * - * @param {GetIdentityBalanceAndRevisionRequest} request - * - * @return {Promise} - */ - async fetchIdentityBalanceAndRevision(request) { - return this.request( - '/identity/balanceAndRevision', - request.serializeBinary(), - ); - } - - /** - * Fetch serialized identity keys - * - * @param {GetIdentityKeysRequest} request - * - * @return {Promise} - */ - async fetchIdentityKeys(request) { - return this.request( - '/identity/keys', - request.serializeBinary(), - ); - } - - /** - * Fetch serialized identity by its public key hash - * - * @param {GetIdentityByPublicKeyHashRequest} request - * - * @return {Promise} - */ - async fetchIdentityByPublicKeyHash(request) { - return this.request( - '/identity/by-public-key-hash', - request.serializeBinary(), - ); - } - - /** - * Fetch serialized identities by its public key hashes - * - * @param {GetIdentitiesByPublicKeyHashesRequest} request - * - * @return {Promise} - */ - async fetchIdentitiesByPublicKeyHashes(request) { - return this.request( - '/identities/by-public-key-hash', - request.serializeBinary(), - ); - } - - /** - * Fetch proofs by ids - * - * @param {GetProofsRequest} request - - * @return {Promise<{data: Buffer}>} - */ - async fetchProofs(request) { - return this.request( - '/proofs', - request.serializeBinary(), - ); - } - - /** - * Fetch epoch infos - * - * @param {GetEpochsInfoRequest} request - * @return {Promise} - */ - async fetchEpochsInfo(request) { - return this.request( - '/epochInfos', - request.serializeBinary(), - ); - } - - /** - * Fetch version upgrade vote status - * - * @param {GetProtocolVersionUpgradeVoteStatusRequest} request - * @return {Promise} - */ - async fetchVersionUpgradeVoteStatus(request) { - return this.request( - '/versionUpgrade/voteStatus', - request.serializeBinary(), - ); - } - - /** - * Fetch version upgrade state - * - * @param {GetProtocolVersionUpgradeStateRequest} request - * @return {Promise} - */ - async fetchVersionUpgradeState(request) { - return this.request( - '/versionUpgrade/state', - request.serializeBinary(), - ); - } - - /** - * Fetch identity contract nonce - * - * @param {GetIdentityContractNonceRequest} request - * @return {Promise} - */ - async fetchIdentityContractNonce(request) { - return this.request( - '/identity/contractNonce', - request.serializeBinary(), - ); - } - - /** - * Fetch identity nonce - * - * @param {GetIdentityNonceRequest} request - * @return {Promise} - */ - async fetchIdentityNonce(request) { - return this.request( - '/identity/nonce', - request.serializeBinary(), - ); - } -} - -module.exports = DriveClient; diff --git a/packages/dapi/lib/externalApis/drive/fetchProofForStateTransitionFactory.js b/packages/dapi/lib/externalApis/drive/fetchProofForStateTransitionFactory.js index 7014b1fef1..a14108e58d 100644 --- a/packages/dapi/lib/externalApis/drive/fetchProofForStateTransitionFactory.js +++ b/packages/dapi/lib/externalApis/drive/fetchProofForStateTransitionFactory.js @@ -1,13 +1,12 @@ const { v0: { GetProofsRequest, - GetProofsResponse, }, } = require('@dashevo/dapi-grpc'); const { StateTransitionTypes } = require('@dashevo/wasm-dpp'); /** - * @param {DriveClient} driveClient + * @param {PlatformPromiseClient} driveClient * @return {fetchProofForStateTransition} */ function fetchProofForStateTransitionFactory(driveClient) { @@ -17,12 +16,12 @@ function fetchProofForStateTransitionFactory(driveClient) { * @return {Promise} */ async function fetchProofForStateTransition(stateTransition) { - const getProofsRequest = new GetProofsRequest(); - const modifiedIds = stateTransition.getModifiedDataIds(); const { GetProofsRequestV0 } = GetProofsRequest; + const requestV0 = new GetProofsRequestV0(); + if (stateTransition.isDocumentStateTransition()) { const { DocumentRequest } = GetProofsRequestV0; @@ -34,7 +33,7 @@ function fetchProofForStateTransitionFactory(driveClient) { return documentRequest; }); - getProofsRequest.setV0(new GetProofsRequestV0().setDocumentsList(documentsList)); + requestV0.setDocumentsList(documentsList); } if (stateTransition.isIdentityStateTransition()) { const { IdentityRequest } = GetProofsRequestV0; @@ -65,7 +64,7 @@ function fetchProofForStateTransitionFactory(driveClient) { return proofRequests; }); - getProofsRequest.setV0(new GetProofsRequestV0().setIdentitiesList(identitiesList)); + requestV0.setIdentitiesList(identitiesList); } if (stateTransition.isDataContractStateTransition()) { const { ContractRequest } = GetProofsRequestV0; @@ -75,12 +74,13 @@ function fetchProofForStateTransitionFactory(driveClient) { return identityRequest; }); - getProofsRequest.setV0(new GetProofsRequestV0() - .setContractsList(contractsList)); + requestV0.setContractsList(contractsList); } - const responseBytes = await driveClient.fetchProofs(getProofsRequest); - return GetProofsResponse.deserializeBinary(responseBytes); + const request = new GetProofsRequest(); + request.setV0(requestV0); + + return driveClient.getProofs(request); } return fetchProofForStateTransition; diff --git a/packages/dapi/lib/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.js b/packages/dapi/lib/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.js index 245d95c4dc..b8a3657fd7 100644 --- a/packages/dapi/lib/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.js +++ b/packages/dapi/lib/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.js @@ -38,23 +38,27 @@ function broadcastStateTransitionHandlerFactory(rpcClient, createGrpcErrorFromDr throw new InvalidArgumentGrpcError('State Transition is not specified'); } - const tx = Buffer.from(stByteArray).toString('base64'); + const tx = Buffer.from(stByteArray) + .toString('base64'); let response; try { response = await rpcClient.request('broadcast_tx_sync', { tx }); } catch (e) { - logger.error(`Failed broadcasting state transition: ${e}`); - if (e.message === 'socket hang up') { throw new UnavailableGrpcError('Tenderdash is not available'); } + e.message = `Failed broadcasting state transition: ${e.message}`; + throw e; } - const { result, error: jsonRpcError } = response; + const { + result, + error: jsonRpcError, + } = response; if (jsonRpcError) { if (typeof jsonRpcError.data === 'string') { @@ -71,6 +75,15 @@ function broadcastStateTransitionHandlerFactory(rpcClient, createGrpcErrorFromDr throw new ResourceExhaustedGrpcError(jsonRpcError.data); } + // broadcasting is timed out + if (jsonRpcError.data.includes('context deadline exceeded')) { + throw new ResourceExhaustedGrpcError('broadcasting state transition is timed out'); + } + + if (jsonRpcError.data.includes('too_many_resets')) { + throw new ResourceExhaustedGrpcError('tenderdash is not responding: too many requests'); + } + if (jsonRpcError.data.startsWith('broadcast confirmation not received:')) { logger.error(`Failed broadcasting state transition: ${jsonRpcError.data}`); diff --git a/packages/dapi/lib/grpcServer/handlers/platform/getDataContractHandlerFactory.js b/packages/dapi/lib/grpcServer/handlers/platform/getDataContractHandlerFactory.js deleted file mode 100644 index 8d3c8a567a..0000000000 --- a/packages/dapi/lib/grpcServer/handlers/platform/getDataContractHandlerFactory.js +++ /dev/null @@ -1,43 +0,0 @@ -const { - server: { - error: { - InvalidArgumentGrpcError, - }, - }, -} = require('@dashevo/grpc-common'); - -const { - v0: { - GetDataContractResponse, - }, -} = require('@dashevo/dapi-grpc'); - -/** - * @param {DriveClient} driveClient - * - * @returns {getDataContractHandler} - */ -function getDataContractHandlerFactory(driveClient) { - /** - * @typedef getDataContractHandler - * - * @param {Object} call - * - * @returns {Promise} - */ - async function getDataContractHandler(call) { - const { request } = call; - - if (request.getV0().getId() === null) { - throw new InvalidArgumentGrpcError('id is not specified'); - } - - const dataContractResponseBuffer = await driveClient.fetchDataContract(request); - - return GetDataContractResponse.deserializeBinary(dataContractResponseBuffer); - } - - return getDataContractHandler; -} - -module.exports = getDataContractHandlerFactory; diff --git a/packages/dapi/lib/grpcServer/handlers/platform/getDataContractHistoryHandlerFactory.js b/packages/dapi/lib/grpcServer/handlers/platform/getDataContractHistoryHandlerFactory.js deleted file mode 100644 index 40f607a935..0000000000 --- a/packages/dapi/lib/grpcServer/handlers/platform/getDataContractHistoryHandlerFactory.js +++ /dev/null @@ -1,43 +0,0 @@ -const { - server: { - error: { - InvalidArgumentGrpcError, - }, - }, -} = require('@dashevo/grpc-common'); - -const { - v0: { - GetDataContractHistoryResponse, - }, -} = require('@dashevo/dapi-grpc'); - -/** - * @param {DriveClient} driveClient - * - * @returns {getDataContractHistoryHandler} - */ -function getDataContractHistoryHandlerFactory(driveClient) { - /** - * @typedef getDataContractHistoryHandler - * - * @param {Object} call - * - * @return {Promise} - */ - async function getDataContractHistoryHandler(call) { - const { request } = call; - - if (request.getV0().getId() === null) { - throw new InvalidArgumentGrpcError('id is not specified'); - } - - const dataContractHistoryResponseBuffer = await driveClient.fetchDataContractHistory(request); - - return GetDataContractHistoryResponse.deserializeBinary(dataContractHistoryResponseBuffer); - } - - return getDataContractHistoryHandler; -} - -module.exports = getDataContractHistoryHandlerFactory; diff --git a/packages/dapi/lib/grpcServer/handlers/platform/getDataContractsHandlerFactory.js b/packages/dapi/lib/grpcServer/handlers/platform/getDataContractsHandlerFactory.js deleted file mode 100644 index 5a2136e90e..0000000000 --- a/packages/dapi/lib/grpcServer/handlers/platform/getDataContractsHandlerFactory.js +++ /dev/null @@ -1,45 +0,0 @@ -const { - server: { - error: { - InvalidArgumentGrpcError, - }, - }, -} = require('@dashevo/grpc-common'); - -const { - v0: { - GetDataContractsResponse, - }, -} = require('@dashevo/dapi-grpc'); - -/** - * @param {DriveClient} driveClient - * - * @return {getDataContractsHandler} - */ -function getDataContractsHandlerFactory(driveClient) { - /** - * @typedef getDataContractsHandler - * - * @param {Object} call - * - * @returns {Promise} - */ - async function getDocumentsHandler(call) { - const { request } = call; - - if (!request.getV0().getDataContractId()) { - throw new InvalidArgumentGrpcError('dataContractId is not specified'); - } - - if (!request.getV0().getDocumentType()) { - throw new InvalidArgumentGrpcError('documentType is not specified'); - } - - const documentResponseBuffer = await driveClient.fetchDocuments( - request, - ); - - return GetDocumentsResponse.deserializeBinary(documentResponseBuffer); - } - - return getDocumentsHandler; -} - -module.exports = getDocumentsHandlerFactory; diff --git a/packages/dapi/lib/grpcServer/handlers/platform/getEpochsInfoHandlerFactory.js b/packages/dapi/lib/grpcServer/handlers/platform/getEpochsInfoHandlerFactory.js deleted file mode 100644 index 240fa42969..0000000000 --- a/packages/dapi/lib/grpcServer/handlers/platform/getEpochsInfoHandlerFactory.js +++ /dev/null @@ -1,32 +0,0 @@ -const { - v0: { - GetEpochsInfoResponse, - }, -} = require('@dashevo/dapi-grpc'); - -/** - * @param {DriveClient} driveClient - * - * @returns {getEpochsInfoHandler} - */ -function getEpochsInfoHandlerFactory(driveClient) { - /** - * @typedef getEpochsInfoHandler - * - * @param {Object} call - * - * @return {Promise} - */ - async function getEpochsInfoHandler(call) { - const { request } = call; - - const epochsInfoBuffer = await driveClient - .fetchEpochsInfo(request); - - return GetEpochsInfoResponse.deserializeBinary(epochsInfoBuffer); - } - - return getEpochsInfoHandler; -} - -module.exports = getEpochsInfoHandlerFactory; diff --git a/packages/dapi/lib/grpcServer/handlers/platform/getIdentitiesByPublicKeyHashesHandlerFactory.js b/packages/dapi/lib/grpcServer/handlers/platform/getIdentitiesByPublicKeyHashesHandlerFactory.js deleted file mode 100644 index e0d31d6244..0000000000 --- a/packages/dapi/lib/grpcServer/handlers/platform/getIdentitiesByPublicKeyHashesHandlerFactory.js +++ /dev/null @@ -1,44 +0,0 @@ -const { - server: { - error: { - InvalidArgumentGrpcError, - }, - }, -} = require('@dashevo/grpc-common'); - -const { - v0: { - GetIdentitiesByPublicKeyHashesResponse, - }, -} = require('@dashevo/dapi-grpc'); - -/** - * - * @param {DriveClient} driveClient - * @return {getIdentitiesByPublicKeyHashesHandler} - */ -function getIdentitiesByPublicKeyHashesHandlerFactory( - driveClient, -) { - /** - * @typedef getIdentitiesByPublicKeyHashesHandler - * @param {Object} call - * @return {Promise} - */ - async function getIdentitiesByPublicKeyHashesHandler(call) { - const { request } = call; - - if (request.getV0().getPublicKeyHashesList().length === 0) { - throw new InvalidArgumentGrpcError('No public key hashes were provided'); - } - - const identitiesResponseBuffer = await driveClient - .fetchIdentitiesByPublicKeyHashes(request); - - return GetIdentitiesByPublicKeyHashesResponse.deserializeBinary(identitiesResponseBuffer); - } - - return getIdentitiesByPublicKeyHashesHandler; -} - -module.exports = getIdentitiesByPublicKeyHashesHandlerFactory; diff --git a/packages/dapi/lib/grpcServer/handlers/platform/getIdentitiesHandlerFactory.js b/packages/dapi/lib/grpcServer/handlers/platform/getIdentitiesHandlerFactory.js deleted file mode 100644 index c2d12621e4..0000000000 --- a/packages/dapi/lib/grpcServer/handlers/platform/getIdentitiesHandlerFactory.js +++ /dev/null @@ -1,45 +0,0 @@ -const { - server: { - error: { - InvalidArgumentGrpcError, - }, - }, -} = require('@dashevo/grpc-common'); - -const { - v0: { - GetIdentitiesResponse, - }, -} = require('@dashevo/dapi-grpc'); - -/** - * @param {DriveClient} driveClient - * - * @return {getIdentitiesHandler} - */ -function getIdentitiesHandlerFactory(driveClient) { - /** - * @typedef getIdentitiesHandler - * - * @param {Object} call - * - * @return {Promise} - */ - async function getIdentitiesHandler(call) { - const { request } = call; - - const identitiIds = request.getV0().getIdsList(); - - if (identitiIds === null) { - throw new InvalidArgumentGrpcError('identity ids are not specified'); - } - - const identitiesResponseBuffer = await driveClient.fetchIdentities(request); - - return GetIdentitiesResponse.deserializeBinary(identitiesResponseBuffer); - } - - return getIdentitiesHandler; -} - -module.exports = getIdentitiesHandlerFactory; diff --git a/packages/dapi/lib/grpcServer/handlers/platform/getIdentityBalanceAndRevisionHandlerFactory.js b/packages/dapi/lib/grpcServer/handlers/platform/getIdentityBalanceAndRevisionHandlerFactory.js deleted file mode 100644 index 064fc3033b..0000000000 --- a/packages/dapi/lib/grpcServer/handlers/platform/getIdentityBalanceAndRevisionHandlerFactory.js +++ /dev/null @@ -1,44 +0,0 @@ -const { - server: { - error: { - InvalidArgumentGrpcError, - }, - }, -} = require('@dashevo/grpc-common'); - -const { - v0: { - GetIdentityBalanceAndRevisionResponse, - }, -} = require('@dashevo/dapi-grpc'); - -/** - * @param {DriveClient} driveClient - * - * @return {getIdentityBalanceAndRevisionHandler} - */ -function getIdentityBalanceAndRevisionHandlerFactory(driveClient) { - /** - * @typedef getIdentityBalanceAndRevisionHandler - * - * @param {Object} call - * - * @return {Promise} - */ - async function getIdentityBalanceAndRevisionHandler(call) { - const { request } = call; - - if (!request.getV0().getId()) { - throw new InvalidArgumentGrpcError('identity id is not specified'); - } - - const identityResponseBuffer = await driveClient - .fetchIdentityBalanceAndRevision(request); - - return GetIdentityBalanceAndRevisionResponse.deserializeBinary(identityResponseBuffer); - } - - return getIdentityBalanceAndRevisionHandler; -} - -module.exports = getIdentityBalanceAndRevisionHandlerFactory; diff --git a/packages/dapi/lib/grpcServer/handlers/platform/getIdentityBalanceHandlerFactory.js b/packages/dapi/lib/grpcServer/handlers/platform/getIdentityBalanceHandlerFactory.js deleted file mode 100644 index 300290e990..0000000000 --- a/packages/dapi/lib/grpcServer/handlers/platform/getIdentityBalanceHandlerFactory.js +++ /dev/null @@ -1,44 +0,0 @@ -const { - server: { - error: { - InvalidArgumentGrpcError, - }, - }, -} = require('@dashevo/grpc-common'); - -const { - v0: { - GetIdentityBalanceResponse, - }, -} = require('@dashevo/dapi-grpc'); - -/** - * @param {DriveClient} driveClient - * - * @return {getIdentityBalanceHandler} - */ -function getIdentityBalanceHandlerFactory(driveClient) { - /** - * @typedef getIdentityBalanceHandler - * - * @param {Object} call - * - * @return {Promise} - */ - async function getIdentityBalanceHandler(call) { - const { request } = call; - - if (!request.getV0().getId()) { - throw new InvalidArgumentGrpcError('identity id is not specified'); - } - - const identityResponseBuffer = await driveClient - .fetchIdentityBalance(request); - - return GetIdentityBalanceResponse.deserializeBinary(identityResponseBuffer); - } - - return getIdentityBalanceHandler; -} - -module.exports = getIdentityBalanceHandlerFactory; diff --git a/packages/dapi/lib/grpcServer/handlers/platform/getIdentityByPublicKeyHashHandlerFactory.js b/packages/dapi/lib/grpcServer/handlers/platform/getIdentityByPublicKeyHashHandlerFactory.js deleted file mode 100644 index 720181b237..0000000000 --- a/packages/dapi/lib/grpcServer/handlers/platform/getIdentityByPublicKeyHashHandlerFactory.js +++ /dev/null @@ -1,44 +0,0 @@ -const { - server: { - error: { - InvalidArgumentGrpcError, - }, - }, -} = require('@dashevo/grpc-common'); - -const { - v0: { - GetIdentityByPublicKeyHashResponse, - }, -} = require('@dashevo/dapi-grpc'); - -/** - * - * @param {DriveClient} driveClient - * @return {getIdentityByPublicKeyHashHandler} - */ -function getIdentityByPublicKeyHashHandlerFactory( - driveClient, -) { - /** - * @typedef getIdentityByPublicKeyHashHandler - * @param {Object} call - * @return {Promise} - */ - async function getIdentityByPublicKeyHashHandler(call) { - const { request } = call; - - if (request.getV0().getPublicKeyHash().length === 0) { - throw new InvalidArgumentGrpcError('No public key hash is provided'); - } - - const identitiesResponseBuffer = await driveClient - .fetchIdentityByPublicKeyHash(request); - - return GetIdentityByPublicKeyHashResponse.deserializeBinary(identitiesResponseBuffer); - } - - return getIdentityByPublicKeyHashHandler; -} - -module.exports = getIdentityByPublicKeyHashHandlerFactory; diff --git a/packages/dapi/lib/grpcServer/handlers/platform/getIdentityHandlerFactory.js b/packages/dapi/lib/grpcServer/handlers/platform/getIdentityHandlerFactory.js deleted file mode 100644 index 1a78a398b6..0000000000 --- a/packages/dapi/lib/grpcServer/handlers/platform/getIdentityHandlerFactory.js +++ /dev/null @@ -1,44 +0,0 @@ -const { - server: { - error: { - InvalidArgumentGrpcError, - }, - }, -} = require('@dashevo/grpc-common'); - -const { - v0: { - GetIdentityResponse, - }, -} = require('@dashevo/dapi-grpc'); - -/** - * @param {DriveClient} driveClient - * - * @returns {getIdentityHandler} - */ -function getIdentityHandlerFactory(driveClient) { - /** - * @typedef getIdentityHandler - * - * @param {Object} call - * - * @return {Promise} - */ - async function getIdentityHandler(call) { - const { request } = call; - - if (!request.getV0().getId()) { - throw new InvalidArgumentGrpcError('id is not specified'); - } - - const identityResponseBuffer = await driveClient - .fetchIdentity(request); - - return GetIdentityResponse.deserializeBinary(identityResponseBuffer); - } - - return getIdentityHandler; -} - -module.exports = getIdentityHandlerFactory; diff --git a/packages/dapi/lib/grpcServer/handlers/platform/getIdentityKeysHandlerFactory.js b/packages/dapi/lib/grpcServer/handlers/platform/getIdentityKeysHandlerFactory.js deleted file mode 100644 index 2d446eeee7..0000000000 --- a/packages/dapi/lib/grpcServer/handlers/platform/getIdentityKeysHandlerFactory.js +++ /dev/null @@ -1,44 +0,0 @@ -const { - server: { - error: { - InvalidArgumentGrpcError, - }, - }, -} = require('@dashevo/grpc-common'); - -const { - v0: { - GetIdentityKeysResponse, - }, -} = require('@dashevo/dapi-grpc'); - -/** - * @param {DriveClient} driveClient - * - * @return {getIdentityKeysHandler} - */ -function getIdentityKeysHandlerFactory(driveClient) { - /** - * @typedef getIdentityKeysHandler - * - * @param {Object} call - * - * @return {Promise} - */ - async function getIdentityKeysHandler(call) { - const { request } = call; - - if (!request.getV0().getIdentityId()) { - throw new InvalidArgumentGrpcError('identity id is not specified'); - } - - const identityResponseBuffer = await driveClient - .fetchIdentityKeys(request); - - return GetIdentityKeysResponse.deserializeBinary(identityResponseBuffer); - } - - return getIdentityKeysHandler; -} - -module.exports = getIdentityKeysHandlerFactory; diff --git a/packages/dapi/lib/grpcServer/handlers/platform/getProofsHandlerFactory.js b/packages/dapi/lib/grpcServer/handlers/platform/getProofsHandlerFactory.js deleted file mode 100644 index 044c2022dc..0000000000 --- a/packages/dapi/lib/grpcServer/handlers/platform/getProofsHandlerFactory.js +++ /dev/null @@ -1,31 +0,0 @@ -const { - v0: { - GetProofsResponse, - }, -} = require('@dashevo/dapi-grpc'); - -/** - * @param {DriveClient} driveClient - * - * @return {getProofsHandler} - */ -function getProofsHandlerFactory(driveClient) { - /** - * @typedef getProofsHandler - * - * @param {Object} call - * - * @return {Promise} - */ - async function getProofsHandler(call) { - const { request } = call; - - const proofsResponseBuffer = await driveClient.fetchProofs(request); - - return GetProofsResponse.deserializeBinary(proofsResponseBuffer); - } - - return getProofsHandler; -} - -module.exports = getProofsHandlerFactory; diff --git a/packages/dapi/lib/grpcServer/handlers/platform/getProtocolVersionUpgradeStateHandlerFactory.js b/packages/dapi/lib/grpcServer/handlers/platform/getProtocolVersionUpgradeStateHandlerFactory.js deleted file mode 100644 index ab60ab317f..0000000000 --- a/packages/dapi/lib/grpcServer/handlers/platform/getProtocolVersionUpgradeStateHandlerFactory.js +++ /dev/null @@ -1,33 +0,0 @@ -const { - v0: { - GetProtocolVersionUpgradeStateResponse, - }, -} = require('@dashevo/dapi-grpc'); - -/** - * @param {DriveClient} driveClient - * - * @returns {getProtocolVersionUpgradeStateHandler} - */ -function getProtocolVersionUpgradeStateHandlerFactory(driveClient) { - /** - * @typedef getProtocolVersionUpgradeStateHandler - * - * @param {Object} call - * - * @return {Promise} - */ - async function getProtocolVersionUpgradeStateHandler(call) { - const { request } = call; - - const versionUpgradeStateBuffer = await driveClient - .fetchVersionUpgradeState(request); - - return GetProtocolVersionUpgradeStateResponse - .deserializeBinary(versionUpgradeStateBuffer); - } - - return getProtocolVersionUpgradeStateHandler; -} - -module.exports = getProtocolVersionUpgradeStateHandlerFactory; diff --git a/packages/dapi/lib/grpcServer/handlers/platform/getProtocolVersionUpgradeVoteStatusHandlerFactory.js b/packages/dapi/lib/grpcServer/handlers/platform/getProtocolVersionUpgradeVoteStatusHandlerFactory.js deleted file mode 100644 index 4695e2193d..0000000000 --- a/packages/dapi/lib/grpcServer/handlers/platform/getProtocolVersionUpgradeVoteStatusHandlerFactory.js +++ /dev/null @@ -1,33 +0,0 @@ -const { - v0: { - GetProtocolVersionUpgradeVoteStatusResponse, - }, -} = require('@dashevo/dapi-grpc'); - -/** - * @param {DriveClient} driveClient - * - * @returns {getProtocolVersionUpgradeVoteStatusHandler} - */ -function getProtocolVersionUpgradeVoteStatusHandlerFactory(driveClient) { - /** - * @typedef getProtocolVersionUpgradeVoteStatusHandler - * - * @param {Object} call - * - * @return {Promise} - */ - async function getProtocolVersionUpgradeVoteStatusHandler(call) { - const { request } = call; - - const versionUpgradeVoteStatusBuffer = await driveClient - .fetchVersionUpgradeVoteStatus(request); - - return GetProtocolVersionUpgradeVoteStatusResponse - .deserializeBinary(versionUpgradeVoteStatusBuffer); - } - - return getProtocolVersionUpgradeVoteStatusHandler; -} - -module.exports = getProtocolVersionUpgradeVoteStatusHandlerFactory; diff --git a/packages/dapi/lib/grpcServer/handlers/platform/platformHandlersFactory.js b/packages/dapi/lib/grpcServer/handlers/platform/platformHandlersFactory.js index 647f1e6b1e..74eb18c49f 100644 --- a/packages/dapi/lib/grpcServer/handlers/platform/platformHandlersFactory.js +++ b/packages/dapi/lib/grpcServer/handlers/platform/platformHandlersFactory.js @@ -16,62 +16,15 @@ const { const { v0: { BroadcastStateTransitionRequest, - GetIdentityRequest, - GetIdentityKeysRequest, - GetDataContractRequest, - GetDataContractsRequest, - GetDataContractHistoryRequest, - GetDocumentsRequest, - GetIdentitiesRequest, - GetIdentitiesByPublicKeyHashesRequest, - GetIdentityByPublicKeyHashRequest, WaitForStateTransitionResultRequest, GetConsensusParamsRequest, - GetProofsRequest, - GetEpochsInfoRequest, - GetProtocolVersionUpgradeVoteStatusRequest, - GetProtocolVersionUpgradeStateRequest, - GetIdentityContractNonceRequest, - GetIdentityNonceRequest, pbjs: { BroadcastStateTransitionRequest: PBJSBroadcastStateTransitionRequest, BroadcastStateTransitionResponse: PBJSBroadcastStateTransitionResponse, - GetIdentityRequest: PBJSGetIdentityRequest, - GetIdentityResponse: PBJSGetIdentityResponse, - GetIdentitiesRequest: PBJSGetIdentitiesRequest, - GetIdentitiesResponse: PBJSGetIdentitiesResponse, - GetIdentityBalanceResponse: PBJSGetIdentityBalanceResponse, - GetIdentityBalanceAndRevisionResponse: PBJSGetIdentityBalanceAndRevisionResponse, - GetIdentityKeysRequest: PBJSGetIdentityKeysRequest, - GetIdentityKeysResponse: PBJSGetIdentityKeysResponse, - GetDataContractRequest: PBJSGetDataContractRequest, - GetDataContractResponse: PBJSGetDataContractResponse, - GetDataContractsRequest: PBJSGetDataContractsRequest, - GetDataContractsResponse: PBJSGetDataContractsResponse, - GetDocumentsRequest: PBJSGetDocumentsRequest, - GetDocumentsResponse: PBJSGetDocumentsResponse, - GetIdentitiesByPublicKeyHashesResponse: PBJSGetIdentitiesByPublicKeyHashesResponse, - GetIdentitiesByPublicKeyHashesRequest: PBJSGetIdentitiesByPublicKeyHashesRequest, - GetIdentityByPublicKeyHashResponse: PBJSGetIdentityByPublicKeyHashResponse, - GetIdentityByPublicKeyHashRequest: PBJSGetIdentityByPublicKeyHashRequest, WaitForStateTransitionResultRequest: PBJSWaitForStateTransitionResultRequest, WaitForStateTransitionResultResponse: PBJSWaitForStateTransitionResultResponse, GetConsensusParamsRequest: PBJSGetConsensusParamsRequest, GetConsensusParamsResponse: PBJSGetConsensusParamsResponse, - GetDataContractHistoryRequest: PBJSGetDataContractHistoryRequest, - GetDataContractHistoryResponse: PBJSGetDataContractHistoryResponse, - GetProofsRequest: PBJSGetProofsRequest, - GetProofsResponse: PBJSGetProofsResponse, - GetEpochsInfoRequest: PBJSGetEpochsInfoRequest, - GetEpochsInfoResponse: PBJSGetEpochsInfoResponse, - GetProtocolVersionUpgradeVoteStatusRequest: PBJSGetProtocolVersionUpgradeVoteStatusRequest, - GetProtocolVersionUpgradeVoteStatusResponse: PBJSGetProtocolVersionUpgradeVoteStatusResponse, - GetProtocolVersionUpgradeStateRequest: PBJSGetProtocolVersionUpgradeStateRequest, - GetProtocolVersionUpgradeStateResponse: PBJSGetProtocolVersionUpgradeStateResponse, - GetIdentityContractNonceRequest: PBJSGetIdentityContractNonceRequest, - GetIdentityContractNonceResponse: PBJSGetIdentityContractNonceResponse, - GetIdentityNonceRequest: PBJSGetIdentityNonceRequest, - GetIdentityNonceResponse: PBJSGetIdentityNonceResponse, }, }, } = require('@dashevo/dapi-grpc'); @@ -80,69 +33,17 @@ const logger = require('../../../logger'); const createGrpcErrorFromDriveResponse = require('../createGrpcErrorFromDriveResponse'); -const getIdentityHandlerFactory = require( - './getIdentityHandlerFactory', -); -const getIdentitiesHandlerFactory = require( - './getIdentitiesHandlerFactory', -); -const getIdentityBalanceHandlerFactory = require( - './getIdentityBalanceHandlerFactory', -); -const getIdentityKeysHandlerFactory = require( - './getIdentityKeysHandlerFactory', -); -const getIdentityBalanceAndRevisionHandlerFactory = require( - './getIdentityBalanceAndRevisionHandlerFactory', -); const broadcastStateTransitionHandlerFactory = require( './broadcastStateTransitionHandlerFactory', ); -const getDocumentsHandlerFactory = require( - './getDocumentsHandlerFactory', -); -const getDataContractHandlerFactory = require( - './getDataContractHandlerFactory', -); -const getDataContractsHandlerFactory = require( - './getDataContractsHandlerFactory', -); -const getDataContractHistoryHandlerFactory = require( - './getDataContractHistoryHandlerFactory', -); -const getIdentityByPublicKeyHashHandlerFactory = require( - './getIdentityByPublicKeyHashHandlerFactory', -); -const getIdentitiesByPublicKeyHashesHandlerFactory = require( - './getIdentitiesByPublicKeyHashesHandlerFactory', -); const waitForStateTransitionResultHandlerFactory = require( './waitForStateTransitionResultHandlerFactory', ); const getConsensusParamsHandlerFactory = require( './getConsensusParamsHandlerFactory', ); -const getProofsHandlerFactory = require( - './getProofsHandlerFactory', -); -const getEpochsInfoHandlerFactory = require( - './getEpochsInfoHandlerFactory', -); - -const getProtocolVersionUpgradeVoteStatusHandlerFactory = require( - './getProtocolVersionUpgradeVoteStatusHandlerFactory', -); - -const getProtocolVersionUpgradeStateHandlerFactory = require( - './getProtocolVersionUpgradeStateHandlerFactory', -); - -const getIdentityContractNonceHandlerFactory = require( - './getIdentityContractNonceHandlerFactory', -); - -const getIdentityNonceHandlerFactory = require( - './getIdentityNonceHandlerFactory', +const unimplementedHandlerFactory = require( + './unimplementedHandlerFactory', ); const fetchProofForStateTransitionFactory = require('../../../externalApis/drive/fetchProofForStateTransitionFactory'); @@ -154,7 +55,7 @@ const getConsensusParamsFactory = require('../../../externalApis/tenderdash/getC /** * @param {jaysonClient} rpcClient * @param {BlockchainListener} blockchainListener - * @param {DriveClient} driveClient + * @param {PlatformPromiseClient} driveClient * @param {DashPlatformProtocol} dpp * @param {boolean} isProductionEnvironment * @returns {Object} @@ -185,198 +86,6 @@ function platformHandlersFactory( wrapInErrorHandler(broadcastStateTransitionHandler), ); - // getIdentity - const getIdentityHandler = getIdentityHandlerFactory( - driveClient, - ); - - const wrappedGetIdentity = jsonToProtobufHandlerWrapper( - jsonToProtobufFactory( - GetIdentityRequest, - PBJSGetIdentityRequest, - ), - protobufToJsonFactory( - PBJSGetIdentityResponse, - ), - wrapInErrorHandler(getIdentityHandler), - ); - - // getIdentities - const getIdentitiesHandler = getIdentitiesHandlerFactory( - driveClient, - ); - - const wrappedGetIdentities = jsonToProtobufHandlerWrapper( - jsonToProtobufFactory( - GetIdentitiesRequest, - PBJSGetIdentitiesRequest, - ), - protobufToJsonFactory( - PBJSGetIdentitiesResponse, - ), - wrapInErrorHandler(getIdentitiesHandler), - ); - - // getIdentityBalance - const getIdentityBalanceHandler = getIdentityBalanceHandlerFactory( - driveClient, - ); - - const wrappedGetIdentityBalance = jsonToProtobufHandlerWrapper( - jsonToProtobufFactory( - GetIdentityRequest, - PBJSGetIdentityRequest, - ), - protobufToJsonFactory( - PBJSGetIdentityBalanceResponse, - ), - wrapInErrorHandler(getIdentityBalanceHandler), - ); - - // getIdentityBalanceAndRevision - const getIdentityBalanceAndRevisionHandler = getIdentityBalanceAndRevisionHandlerFactory( - driveClient, - ); - - const wrappedGetIdentityBalanceAndRevision = jsonToProtobufHandlerWrapper( - jsonToProtobufFactory( - GetIdentityRequest, - PBJSGetIdentityRequest, - ), - protobufToJsonFactory( - PBJSGetIdentityBalanceAndRevisionResponse, - ), - wrapInErrorHandler(getIdentityBalanceAndRevisionHandler), - ); - - // getIdentityKeys - const getIdentityKeysHandler = getIdentityKeysHandlerFactory( - driveClient, - ); - - const wrappedGetIdentityKeys = jsonToProtobufHandlerWrapper( - jsonToProtobufFactory( - GetIdentityKeysRequest, - PBJSGetIdentityKeysRequest, - ), - protobufToJsonFactory( - PBJSGetIdentityKeysResponse, - ), - wrapInErrorHandler(getIdentityKeysHandler), - ); - - // getDocuments - const getDocumentsHandler = getDocumentsHandlerFactory( - driveClient, - ); - - const wrappedGetDocuments = jsonToProtobufHandlerWrapper( - jsonToProtobufFactory( - GetDocumentsRequest, - PBJSGetDocumentsRequest, - ), - protobufToJsonFactory( - PBJSGetDocumentsResponse, - ), - wrapInErrorHandler(getDocumentsHandler), - ); - - // getDataContract - const getDataContractHandler = getDataContractHandlerFactory( - driveClient, - ); - - const wrappedGetDataContract = jsonToProtobufHandlerWrapper( - jsonToProtobufFactory( - GetDataContractRequest, - PBJSGetDataContractRequest, - ), - protobufToJsonFactory( - PBJSGetDataContractResponse, - ), - wrapInErrorHandler(getDataContractHandler), - ); - - // getDataContracts - const getDataContractsHandler = getDataContractsHandlerFactory( - driveClient, - ); - - const wrappedGetDataContracts = jsonToProtobufHandlerWrapper( - jsonToProtobufFactory( - GetDataContractsRequest, - PBJSGetDataContractsRequest, - ), - protobufToJsonFactory( - PBJSGetDataContractsResponse, - ), - wrapInErrorHandler(getDataContractsHandler), - ); - - // getDataContractHistory - const getDataContractHistoryHandler = getDataContractHistoryHandlerFactory( - driveClient, - ); - - const wrappedGetDataContractHistory = jsonToProtobufHandlerWrapper( - jsonToProtobufFactory( - GetDataContractHistoryRequest, - PBJSGetDataContractHistoryRequest, - ), - protobufToJsonFactory( - PBJSGetDataContractHistoryResponse, - ), - wrapInErrorHandler(getDataContractHistoryHandler), - ); - - // getIdentityByPublicKeyHash - const getIdentityByPublicKeyHashHandler = getIdentityByPublicKeyHashHandlerFactory( - driveClient, - ); - - const wrappedGetIdentityByPublicKeyHash = jsonToProtobufHandlerWrapper( - jsonToProtobufFactory( - GetIdentityByPublicKeyHashRequest, - PBJSGetIdentityByPublicKeyHashRequest, - ), - protobufToJsonFactory( - PBJSGetIdentityByPublicKeyHashResponse, - ), - wrapInErrorHandler(getIdentityByPublicKeyHashHandler), - ); - - // getIdentitiesByPublicKeyHashes - const getIdentitiesByPublicKeyHashesHandler = getIdentitiesByPublicKeyHashesHandlerFactory( - driveClient, - ); - - const wrappedGetIdentitiesByPublicKeyHashes = jsonToProtobufHandlerWrapper( - jsonToProtobufFactory( - GetIdentitiesByPublicKeyHashesRequest, - PBJSGetIdentitiesByPublicKeyHashesRequest, - ), - protobufToJsonFactory( - PBJSGetIdentitiesByPublicKeyHashesResponse, - ), - wrapInErrorHandler(getIdentitiesByPublicKeyHashesHandler), - ); - - // getProofs - const getProofsHandler = getProofsHandlerFactory( - driveClient, - ); - - const wrappedGetProofs = jsonToProtobufHandlerWrapper( - jsonToProtobufFactory( - GetProofsRequest, - PBJSGetProofsRequest, - ), - protobufToJsonFactory( - PBJSGetProofsResponse, - ), - wrapInErrorHandler(getProofsHandler), - ); - // waitForStateTransitionResult const fetchProofForStateTransition = fetchProofForStateTransitionFactory(driveClient); @@ -423,106 +132,27 @@ function platformHandlersFactory( wrapInErrorHandler(getConsensusParamsHandler), ); - // getEpochsInfo - const getEpochsInfoHandler = getEpochsInfoHandlerFactory( - driveClient, - ); - - const wrappedGetEpochsInfo = jsonToProtobufHandlerWrapper( - jsonToProtobufFactory( - GetEpochsInfoRequest, - PBJSGetEpochsInfoRequest, - ), - protobufToJsonFactory( - PBJSGetEpochsInfoResponse, - ), - wrapInErrorHandler(getEpochsInfoHandler), - ); - - // getProtocolVersionUpgradeVoteStatus - // eslint-disable-next-line max-len - const getProtocolVersionUpgradeVoteStatusHandler = getProtocolVersionUpgradeVoteStatusHandlerFactory( - driveClient, - ); - - const wrappedGetProtocolVersionUpgradeVoteStatus = jsonToProtobufHandlerWrapper( - jsonToProtobufFactory( - GetProtocolVersionUpgradeVoteStatusRequest, - PBJSGetProtocolVersionUpgradeVoteStatusRequest, - ), - protobufToJsonFactory( - PBJSGetProtocolVersionUpgradeVoteStatusResponse, - ), - wrapInErrorHandler(getProtocolVersionUpgradeVoteStatusHandler), - ); - - // getProtocolVersionUpgradeState - const getProtocolVersionUpgradeStateHandler = getProtocolVersionUpgradeStateHandlerFactory( - driveClient, - ); - - const wrappedGetProtocolVersionUpgradeState = jsonToProtobufHandlerWrapper( - jsonToProtobufFactory( - GetProtocolVersionUpgradeStateRequest, - PBJSGetProtocolVersionUpgradeStateRequest, - ), - protobufToJsonFactory( - PBJSGetProtocolVersionUpgradeStateResponse, - ), - wrapInErrorHandler(getProtocolVersionUpgradeStateHandler), - ); - - const getIdentityContractNonceHandler = getIdentityContractNonceHandlerFactory( - driveClient, - ); - - const wrappedGetIdentityContractNonceHandler = jsonToProtobufHandlerWrapper( - jsonToProtobufFactory( - GetIdentityContractNonceRequest, - PBJSGetIdentityContractNonceRequest, - ), - protobufToJsonFactory( - PBJSGetIdentityContractNonceResponse, - ), - wrapInErrorHandler(getIdentityContractNonceHandler), - ); - - const getIdentityNonceHandler = getIdentityNonceHandlerFactory( - driveClient, - ); - - const wrappedGetIdentityNonceHandler = jsonToProtobufHandlerWrapper( - jsonToProtobufFactory( - GetIdentityNonceRequest, - PBJSGetIdentityNonceRequest, - ), - protobufToJsonFactory( - PBJSGetIdentityNonceResponse, - ), - wrapInErrorHandler(getIdentityNonceHandler), - ); - return { broadcastStateTransition: wrappedBroadcastStateTransition, - getIdentity: wrappedGetIdentity, - getIdentities: wrappedGetIdentities, - getIdentityBalance: wrappedGetIdentityBalance, - getIdentityBalanceAndRevision: wrappedGetIdentityBalanceAndRevision, - getIdentityKeys: wrappedGetIdentityKeys, - getDocuments: wrappedGetDocuments, - getDataContract: wrappedGetDataContract, - getDataContracts: wrappedGetDataContracts, - getDataContractHistory: wrappedGetDataContractHistory, - getIdentityByPublicKeyHash: wrappedGetIdentityByPublicKeyHash, - getIdentitiesByPublicKeyHashes: wrappedGetIdentitiesByPublicKeyHashes, + getIdentity: wrapInErrorHandler(unimplementedHandlerFactory('getIdentity')), + getIdentities: wrapInErrorHandler(unimplementedHandlerFactory('getIdentities')), + getIdentityBalance: wrapInErrorHandler(unimplementedHandlerFactory('getIdentityBalance')), + getIdentityBalanceAndRevision: wrapInErrorHandler(unimplementedHandlerFactory('getIdentityBalanceAndRevision')), + getIdentityKeys: wrapInErrorHandler(unimplementedHandlerFactory('getIdentityKeys')), + getDocuments: wrapInErrorHandler(unimplementedHandlerFactory('getDocuments')), + getDataContract: wrapInErrorHandler(unimplementedHandlerFactory('getDataContract')), + getDataContracts: wrapInErrorHandler(unimplementedHandlerFactory('getDataContracts')), + getDataContractHistory: wrapInErrorHandler(unimplementedHandlerFactory('getDataContractHistory')), + getIdentityByPublicKeyHash: wrapInErrorHandler(unimplementedHandlerFactory('getIdentityByPublicKeyHash')), + getIdentitiesByPublicKeyHashes: wrapInErrorHandler(unimplementedHandlerFactory('getIdentitiesByPublicKeyHashes')), waitForStateTransitionResult: wrappedWaitForStateTransitionResult, getConsensusParams: wrappedGetConsensusParams, - getProofs: wrappedGetProofs, - getEpochsInfo: wrappedGetEpochsInfo, - getProtocolVersionUpgradeVoteStatus: wrappedGetProtocolVersionUpgradeVoteStatus, - getProtocolVersionUpgradeState: wrappedGetProtocolVersionUpgradeState, - getIdentityContractNonce: wrappedGetIdentityContractNonceHandler, - getIdentityNonce: wrappedGetIdentityNonceHandler, + getProofs: wrapInErrorHandler(unimplementedHandlerFactory('getProofs')), + getEpochsInfo: wrapInErrorHandler(unimplementedHandlerFactory('getEpochsInfo')), + getProtocolVersionUpgradeVoteStatus: wrapInErrorHandler(unimplementedHandlerFactory('getProtocolVersionUpgradeVoteStatus')), + getProtocolVersionUpgradeState: wrapInErrorHandler(unimplementedHandlerFactory('getProtocolVersionUpgradeState')), + getIdentityContractNonce: wrapInErrorHandler(unimplementedHandlerFactory('getIdentityContractNonce')), + getIdentityNonce: wrapInErrorHandler(unimplementedHandlerFactory('getIdentityNonce')), }; } diff --git a/packages/dapi/lib/grpcServer/handlers/platform/unimplementedHandlerFactory.js b/packages/dapi/lib/grpcServer/handlers/platform/unimplementedHandlerFactory.js new file mode 100644 index 0000000000..74f916e386 --- /dev/null +++ b/packages/dapi/lib/grpcServer/handlers/platform/unimplementedHandlerFactory.js @@ -0,0 +1,30 @@ +const { + server: { + error: { + UnimplementedGrpcError, + }, + }, +} = require('@dashevo/grpc-common'); + +const logger = require('../../../logger'); + +/** + * @param {string} name + * @returns {broadcastStateTransitionHandler} + */ +function unimplementedHandlerFactory(name) { + /** + * @typedef broadcastStateTransitionHandler + * + * @return {Promise} + */ + async function broadcastStateTransitionHandler() { + logger.error(`unimplemented endpoint '${name}' called`); + + throw new UnimplementedGrpcError('the endpoint is not implemented in DAPI'); + } + + return broadcastStateTransitionHandler; +} + +module.exports = unimplementedHandlerFactory; diff --git a/packages/dapi/scripts/api.js b/packages/dapi/scripts/api.js index 72d3b1f033..9e42387766 100644 --- a/packages/dapi/scripts/api.js +++ b/packages/dapi/scripts/api.js @@ -1,7 +1,6 @@ // Entry point for DAPI. const dotenv = require('dotenv'); const grpc = require('@grpc/grpc-js'); -// const loadBLS = require('@dashevo/bls'); const { server: { @@ -12,6 +11,9 @@ const { const { getCoreDefinition, getPlatformDefinition, + v0: { + PlatformPromiseClient, + }, } = require('@dashevo/dapi-grpc'); const { default: loadWasmDpp, DashPlatformProtocol } = require('@dashevo/wasm-dpp'); @@ -27,10 +29,8 @@ const config = require('../lib/config'); const { validateConfig } = require('../lib/config/validator'); const logger = require('../lib/logger'); const rpcServer = require('../lib/rpcServer/server'); -const DriveClient = require('../lib/externalApis/drive/DriveClient'); const dashCoreRpcClient = require('../lib/externalApis/dashcore/rpc'); const BlockchainListener = require('../lib/externalApis/tenderdash/BlockchainListener'); -// const DriveStateRepository = require('../lib/dpp/DriveStateRepository'); const coreHandlersFactory = require( '../lib/grpcServer/handlers/core/coreHandlersFactory', @@ -53,11 +53,7 @@ async function main() { const isProductionEnvironment = process.env.NODE_ENV === 'production'; - logger.info('Connecting to Drive'); - const driveClient = new DriveClient({ - host: config.tendermintCore.host, - port: config.tendermintCore.port, - }); + const driveClient = new PlatformPromiseClient(`http://${config.driveRpc.host}:${config.driveRpc.port}`, undefined); const rpcClient = RpcClient.http({ host: config.tendermintCore.host, diff --git a/packages/dapi/test/integration/grpcServer/handlers/platform/waitForStateTransitionResultHandlerFactory.spec.js b/packages/dapi/test/integration/grpcServer/handlers/platform/waitForStateTransitionResultHandlerFactory.spec.js index 2eac560cd1..7f748d91c4 100644 --- a/packages/dapi/test/integration/grpcServer/handlers/platform/waitForStateTransitionResultHandlerFactory.spec.js +++ b/packages/dapi/test/integration/grpcServer/handlers/platform/waitForStateTransitionResultHandlerFactory.spec.js @@ -194,7 +194,7 @@ describe('waitForStateTransitionResultHandlerFactory', () => { ); driveClientMock = { - fetchProofs: this.sinon.stub().resolves(response.serializeBinary()), + getProofs: this.sinon.stub().resolves(response), }; blockchainListener = new BlockchainListener(tenderDashWsClientMock); @@ -298,7 +298,7 @@ describe('waitForStateTransitionResultHandlerFactory', () => { .setIdentitiesList(identitiesList), ); - expect(driveClientMock.fetchProofs).to.be.calledOnceWithExactly(getProofsRequest); + expect(driveClientMock.getProofs).to.be.calledOnceWithExactly(getProofsRequest); }); it('should wait for state transition and return result with error', (done) => { diff --git a/packages/dapi/test/unit/externalApis/drive/DriveClient.spec.js b/packages/dapi/test/unit/externalApis/drive/DriveClient.spec.js deleted file mode 100644 index ad51a2034c..0000000000 --- a/packages/dapi/test/unit/externalApis/drive/DriveClient.spec.js +++ /dev/null @@ -1,553 +0,0 @@ -const chai = require('chai'); -const sinon = require('sinon'); -const cbor = require('cbor'); - -const chaiAsPromised = require('chai-as-promised'); -const dirtyChai = require('dirty-chai'); - -const { BytesValue, UInt32Value } = require('google-protobuf/google/protobuf/wrappers_pb'); - -const getIdentityFixture = require('@dashevo/wasm-dpp/lib/test/fixtures/getIdentityFixture'); -const InvalidArgumentGrpcError = require('@dashevo/grpc-common/lib/server/error/InvalidArgumentGrpcError'); -const GrpcErrorCodes = require('@dashevo/grpc-common/lib/server/error/GrpcErrorCodes'); -const { - v0: { - GetIdentitiesByPublicKeyHashesRequest, - GetIdentitiesByPublicKeyHashesResponse, - GetDataContractRequest, - GetDataContractResponse, - GetDocumentsRequest, - GetDocumentsResponse, - GetEpochsInfoRequest, - GetEpochsInfoResponse, - GetIdentityRequest, - GetIdentityResponse, - GetProofsRequest, - GetProofsResponse, - GetProtocolVersionUpgradeStateRequest, - GetProtocolVersionUpgradeStateResponse, - GetProtocolVersionUpgradeVoteStatusRequest, - GetProtocolVersionUpgradeVoteStatusResponse, - GetIdentityContractNonceRequest, - GetIdentityContractNonceResponse, - GetIdentityNonceRequest, - GetIdentityNonceResponse, - Proof, - ResponseMetadata, - }, -} = require('@dashevo/dapi-grpc'); - -const DriveClient = require('../../../../lib/externalApis/drive/DriveClient'); - -const RPCError = require('../../../../lib/rpcServer/RPCError'); - -chai.use(chaiAsPromised); -chai.use(dirtyChai); - -const { expect } = chai; - -describe('DriveClient', () => { - describe('constructor', () => { - it('Should create drive client with given options', () => { - const drive = new DriveClient({ host: '127.0.0.1', port: 3000 }); - - expect(drive.client.options.host).to.be.equal('127.0.0.1'); - expect(drive.client.options.port).to.be.equal(3000); - }); - }); - - it('should throw RPCError if JSON RPC call failed', async () => { - const drive = new DriveClient({ host: '127.0.0.1', port: 3000 }); - - const error = new Error('Some RPC error'); - - sinon.stub(drive.client, 'request') - .resolves({ error }); - - try { - await drive.fetchDataContract(new GetDataContractRequest()); - } catch (e) { - expect(e).to.be.an.instanceOf(RPCError); - expect(e.message).to.be.equal(error.message); - expect(e.code).to.be.equal(-32602); - } - }); - - it('should throw ABCI error if response have one', async () => { - const drive = new DriveClient({ host: '127.0.0.1', port: 3000 }); - - sinon.stub(drive.client, 'request') - .resolves({ - result: { - response: { - code: GrpcErrorCodes.INVALID_ARGUMENT, - info: cbor.encode({ - data: { - name: 'someData', - }, - message: 'some message', - }).toString('base64'), - }, - }, - }); - - try { - await drive.fetchDataContract(new GetDataContractRequest()); - } catch (e) { - expect(e).to.be.an.instanceOf(InvalidArgumentGrpcError); - expect(e.getCode()).to.equal(3); - expect(e.getMessage()).to.equal('some message'); - expect(e.getRawMetadata()).to.deep.equal({ - 'drive-error-data-bin': cbor.encode({ - name: 'someData', - }), - }); - } - }); - - describe('#fetchDataContract', () => { - it('Should call \'fetchContract\' RPC with the given parameters', async () => { - const drive = new DriveClient({ host: '127.0.0.1', port: 3000 }); - - const contractId = 'someId'; - const data = Buffer.from('someData'); - - const { GetDataContractRequestV0 } = GetDataContractRequest; - const request = new GetDataContractRequest(); - request.setV0( - new GetDataContractRequestV0() - .setId(contractId) - .setProve(false), - ); - - const { GetDataContractResponseV0 } = GetDataContractResponse; - const response = new GetDataContractResponse(); - response.setV0( - new GetDataContractResponseV0() - .setDataContract(data), - ); - const responseBytes = response.serializeBinary(); - - sinon.stub(drive.client, 'request') - .resolves({ - result: { - response: { code: 0, value: responseBytes }, - }, - }); - - const result = await drive.fetchDataContract(request); - - expect(drive.client.request).to.have.been.calledOnceWithExactly('abci_query', { - path: '/dataContract', - data: Buffer.from(request.serializeBinary()).toString('hex'), - }); - expect(result).to.be.deep.equal(responseBytes); - }); - }); - - describe('#fetchDocuments', () => { - it('Should call \'fetchDocuments\' RPC with the given parameters', async () => { - const drive = new DriveClient({ host: '127.0.0.1', port: 3000 }); - - const contractId = 'someId'; - const type = 'object'; - const options = { - where: 'id === someId', - }; - - const { GetDocumentsRequestV0 } = GetDocumentsRequest; - const request = new GetDocumentsRequest(); - request.setV0( - new GetDocumentsRequestV0() - .setDataContractId(contractId) - .setDocumentType(type) - .setWhere(cbor.encode({ where: options.where })), - ); - - const { GetDocumentsResponseV0 } = GetDocumentsResponse; - const response = new GetDocumentsResponse(); - response.setV0( - new GetDocumentsResponseV0() - .setDocuments(new GetDocumentsResponseV0.Documents().setDocumentsList([])), - ); - - const responseBytes = response.serializeBinary(); - - sinon.stub(drive.client, 'request') - .resolves({ - result: { - response: { code: 0, value: responseBytes }, - }, - }); - - const result = await drive.fetchDocuments(request); - - expect(drive.client.request).to.have.been.calledOnceWithExactly('abci_query', { - path: '/dataContract/documents', - data: Buffer.from(request.serializeBinary()).toString('hex'), // cbor encoded empty object - }); - expect(result).to.be.deep.equal(responseBytes); - }); - }); - - describe('#fetchIdentity', () => { - it('Should call \'fetchIdentity\' RPC with the given parameters', async () => { - const drive = new DriveClient({ host: '127.0.0.1', port: 3000 }); - - const identityId = 'someId'; - const data = Buffer.from('someData'); - - const { GetIdentityRequestV0 } = GetIdentityRequest; - const request = new GetIdentityRequest(); - request.setV0( - new GetIdentityRequestV0() - .setId(identityId), - ); - - const { GetIdentityResponseV0 } = GetIdentityResponse; - const response = new GetIdentityResponse(); - response.setV0( - new GetIdentityResponseV0() - .setIdentity(data), - ); - const responseBytes = response.serializeBinary(); - - sinon.stub(drive.client, 'request') - .resolves({ - result: { - response: { code: 0, value: responseBytes }, - }, - }); - - const result = await drive.fetchIdentity(request); - - expect(drive.client.request).to.have.been.calledOnceWithExactly('abci_query', { - path: '/identity', - data: Buffer.from(request.serializeBinary()).toString('hex'), - }); - expect(result).to.be.deep.equal(responseBytes); - }); - }); - - describe('#fetchIdentitiesByPublicKeyHashes', () => { - it('Should call \'fetchIdentitiesByPublicKeyHashes\' RPC with the given parameters', async () => { - const drive = new DriveClient({ host: '127.0.0.1', port: 3000 }); - - const identity = await getIdentityFixture(); - - const publicKeyHashes = [Buffer.alloc(1)]; - - const { GetIdentitiesByPublicKeyHashesRequestV0 } = GetIdentitiesByPublicKeyHashesRequest; - const request = new GetIdentitiesByPublicKeyHashesRequest(); - request.setV0( - new GetIdentitiesByPublicKeyHashesRequestV0() - .setPublicKeyHashesList(publicKeyHashes) - .setProve(false), - ); - - const { - IdentitiesByPublicKeyHashes, - PublicKeyHashIdentityEntry, - GetIdentitiesByPublicKeyHashesResponseV0, - } = GetIdentitiesByPublicKeyHashesResponse; - - const response = new GetIdentitiesByPublicKeyHashesResponse(); - response.setV0( - new GetIdentitiesByPublicKeyHashesResponseV0().setIdentities( - new IdentitiesByPublicKeyHashes() - .setIdentityEntriesList([ - new PublicKeyHashIdentityEntry() - .setPublicKeyHash(publicKeyHashes[0]) - .setValue(new BytesValue().setValue(identity.toBuffer())), - ]), - ), - ); - const responseBytes = response.serializeBinary(); - - sinon.stub(drive.client, 'request') - .resolves({ - result: { - response: { code: 0, value: responseBytes }, - }, - }); - - const result = await drive.fetchIdentitiesByPublicKeyHashes(request); - - expect(drive.client.request).to.have.been.calledOnceWithExactly('abci_query', { - path: '/identities/by-public-key-hash', - data: Buffer.from(request.serializeBinary()).toString('hex'), - }); - expect(result).to.be.deep.equal(responseBytes); - }); - }); - - describe('#fetchProofs', () => { - it('should call \'fetchProofs\' RPC with the given parameters', async () => { - const drive = new DriveClient({ host: '127.0.0.1', port: 3000 }); - - const identityIds = [Buffer.from('id')]; - - const request = new GetProofsRequest(); - const { GetProofsRequestV0 } = GetProofsRequest; - request.setV0( - new GetProofsRequestV0() - .setIdentitiesList(identityIds.map((id) => { - const { IdentityRequest } = GetProofsRequestV0; - const identityRequest = new IdentityRequest(); - identityRequest.setIdentityId(id); - identityRequest.setRequestType(IdentityRequest.Type.FULL_IDENTITY); - return identityRequest; - })), - ); - - const { GetProofsResponseV0 } = GetProofsResponse; - const response = new GetProofsResponse(); - response.setV0( - new GetProofsResponseV0() - .setProof(new Proof()) - .setMetadata(new ResponseMetadata()), - ); - - const responseBytes = response.serializeBinary(); - - sinon.stub(drive.client, 'request') - .resolves({ - result: { - response: { code: 0, value: responseBytes }, - }, - }); - - const result = await drive.fetchProofs(request); - - expect(drive.client.request).to.have.been.calledOnceWithExactly('abci_query', { - path: '/proofs', - data: Buffer.from(request.serializeBinary()).toString('hex'), - }); - - expect(result).to.be.deep.equal( - responseBytes, - ); - }); - }); - - describe('#fetchEpochsInfo', () => { - it('should call \'fetchEpochsInfo\' RPC with the given parameters', async () => { - const drive = new DriveClient({ host: '127.0.0.1', port: 3000 }); - - const { GetEpochsInfoRequestV0 } = GetEpochsInfoRequest; - const request = new GetEpochsInfoRequest(); - request.setV0( - new GetEpochsInfoRequestV0() - .setStartEpoch(new UInt32Value([1])) - .setCount(1), - ); - - const { GetEpochsInfoResponseV0 } = GetEpochsInfoResponse; - const response = new GetEpochsInfoResponse(); - const { EpochInfo, EpochInfos } = GetEpochsInfoResponseV0; - response.setV0( - new GetEpochsInfoResponseV0() - .setEpochs(new EpochInfos() - .setEpochInfosList([new EpochInfo() - .setNumber(1) - .setFirstBlockHeight(1) - .setFirstCoreBlockHeight(1) - .setStartTime(Date.now()) - .setFeeMultiplier(1.1)])), - ); - - const responseBytes = response.serializeBinary(); - - sinon.stub(drive.client, 'request') - .resolves({ - result: { - response: { code: 0, value: responseBytes }, - }, - }); - - const result = await drive.fetchEpochsInfo(request); - - expect(drive.client.request).to.have.been.calledOnceWithExactly('abci_query', { - path: '/epochInfos', - data: Buffer.from(request.serializeBinary()).toString('hex'), - }); - - expect(result).to.be.deep.equal( - responseBytes, - ); - }); - }); - - describe('#fetchVersionUpgradeVoteStatus', () => { - it('should call \'fetchEpochsInfo\' RPC with the given parameters', async () => { - const drive = new DriveClient({ host: '127.0.0.1', port: 3000 }); - - const { - GetProtocolVersionUpgradeVoteStatusRequestV0, - } = GetProtocolVersionUpgradeVoteStatusRequest; - const request = new GetProtocolVersionUpgradeVoteStatusRequest(); - request.setV0( - new GetProtocolVersionUpgradeVoteStatusRequestV0() - .setStartProTxHash(Buffer.alloc(32)) - .setCount(1), - ); - - const { - GetProtocolVersionUpgradeVoteStatusResponseV0, - } = GetProtocolVersionUpgradeVoteStatusResponse; - const response = new GetProtocolVersionUpgradeVoteStatusResponse(); - const { VersionSignal, VersionSignals } = GetProtocolVersionUpgradeVoteStatusResponseV0; - response.setV0( - new GetProtocolVersionUpgradeVoteStatusResponseV0() - .setVersions( - new VersionSignals() - .setVersionSignalsList([ - new VersionSignal() - .setProTxHash(Buffer.alloc(32)) - .setVersion(10), - ]), - - ), - ); - - const responseBytes = response.serializeBinary(); - - sinon.stub(drive.client, 'request') - .resolves({ - result: { - response: { code: 0, value: responseBytes }, - }, - }); - - const result = await drive.fetchVersionUpgradeVoteStatus(request); - - expect(drive.client.request).to.have.been.calledOnceWithExactly('abci_query', { - path: '/versionUpgrade/voteStatus', - data: Buffer.from(request.serializeBinary()).toString('hex'), - }); - - expect(result).to.be.deep.equal( - responseBytes, - ); - }); - }); - - describe('#fetchVersionUpgradeState', () => { - it('should call \'fetchEpochsInfo\' RPC with the given parameters', async () => { - const drive = new DriveClient({ host: '127.0.0.1', port: 3000 }); - - const { GetProtocolVersionUpgradeStateRequestV0 } = GetProtocolVersionUpgradeStateRequest; - const request = new GetProtocolVersionUpgradeStateRequest(); - request.setV0(new GetProtocolVersionUpgradeStateRequestV0()); - - const { GetProtocolVersionUpgradeStateResponseV0 } = GetProtocolVersionUpgradeStateResponse; - const response = new GetProtocolVersionUpgradeStateResponse(); - const { Versions, VersionEntry } = GetProtocolVersionUpgradeStateResponseV0; - response.setV0( - new GetProtocolVersionUpgradeStateResponseV0() - .setVersions( - new Versions() - .setVersionsList([ - new VersionEntry() - .setVersionNumber(1) - .setVoteCount(10), - ]), - ), - ); - - const responseBytes = response.serializeBinary(); - - sinon.stub(drive.client, 'request') - .resolves({ - result: { - response: { code: 0, value: responseBytes }, - }, - }); - - const result = await drive.fetchVersionUpgradeState(request); - - expect(drive.client.request).to.have.been.calledOnceWithExactly('abci_query', { - path: '/versionUpgrade/state', - data: Buffer.from(request.serializeBinary()).toString('hex'), - }); - - expect(result).to.be.deep.equal( - responseBytes, - ); - }); - }); - - describe('#getIdentityContractNonce', () => { - it('should call \'getIdentityContractNonce\' RPC with the given parameters', async () => { - const drive = new DriveClient({ host: '127.0.0.1', port: 3000 }); - - const { GetIdentityContractNonceRequestV0 } = GetIdentityContractNonceRequest; - const request = new GetIdentityContractNonceRequest(); - request.setV0(new GetIdentityContractNonceRequestV0()); - - const { GetIdentityContractNonceResponseV0 } = GetIdentityContractNonceResponse; - const response = new GetIdentityContractNonceResponse(); - response.setV0( - new GetIdentityContractNonceResponseV0() - .setIdentityContractNonce(10), - ); - - const responseBytes = response.serializeBinary(); - - sinon.stub(drive.client, 'request') - .resolves({ - result: { - response: { code: 0, value: responseBytes }, - }, - }); - - const result = await drive.fetchIdentityContractNonce(request); - - expect(drive.client.request).to.have.been.calledOnceWithExactly('abci_query', { - path: '/identity/contractNonce', - data: Buffer.from(request.serializeBinary()).toString('hex'), - }); - - expect(result).to.be.deep.equal( - responseBytes, - ); - }); - }); - - describe('#getIdentityNonce', () => { - it('should call \'getIdentityNonce\' RPC with the given parameters', async () => { - const drive = new DriveClient({ host: '127.0.0.1', port: 3000 }); - - const { GetIdentityNonceRequestV0 } = GetIdentityNonceRequest; - const request = new GetIdentityNonceRequest(); - request.setV0(new GetIdentityNonceRequestV0()); - - const { GetIdentityNonceResponseV0 } = GetIdentityNonceResponse; - const response = new GetIdentityNonceResponse(); - response.setV0( - new GetIdentityNonceResponseV0() - .setIdentityNonce(10), - ); - - const responseBytes = response.serializeBinary(); - - sinon.stub(drive.client, 'request') - .resolves({ - result: { - response: { code: 0, value: responseBytes }, - }, - }); - - const result = await drive.fetchIdentityNonce(request); - - expect(drive.client.request).to.have.been.calledOnceWithExactly('abci_query', { - path: '/identity/nonce', - data: Buffer.from(request.serializeBinary()).toString('hex'), - }); - - expect(result).to.be.deep.equal( - responseBytes, - ); - }); - }); -}); diff --git a/packages/dapi/test/unit/externalApis/drive/fetchProofForStateTransitionFactory.spec.js b/packages/dapi/test/unit/externalApis/drive/fetchProofForStateTransitionFactory.spec.js index d23051fcc4..91c277b8fd 100644 --- a/packages/dapi/test/unit/externalApis/drive/fetchProofForStateTransitionFactory.spec.js +++ b/packages/dapi/test/unit/externalApis/drive/fetchProofForStateTransitionFactory.spec.js @@ -30,13 +30,13 @@ describe('fetchProofForStateTransition', () => { identitiesProofResponse.setV0(new GetProofsResponseV0().setProof(new Proof([Buffer.from('identities contracts proof')]))); driveClientMock = { - fetchProofs: this.sinon.stub().callsFake(async (requestProto) => { + getProofs: this.sinon.stub().callsFake(async (requestProto) => { if (requestProto.getV0().getIdentitiesList().length > 0) { - return identitiesProofResponse.serializeBinary(); + return identitiesProofResponse; } if (requestProto.getV0().getDocumentsList().length > 0) { - return documentsProofResponse.serializeBinary(); + return documentsProofResponse; } if (requestProto.getV0().getContractsList().length > 0) { - return dataContractsProofResponse.serializeBinary(); + return dataContractsProofResponse; } return null; diff --git a/packages/dapi/test/unit/grpcServer/handlers/platform/getConsensusParamsHandlerFactory.spec.js b/packages/dapi/test/unit/grpcServer/handlers/platform/getConsensusParamsHandlerFactory.spec.js deleted file mode 100644 index f80d580d09..0000000000 --- a/packages/dapi/test/unit/grpcServer/handlers/platform/getConsensusParamsHandlerFactory.spec.js +++ /dev/null @@ -1,159 +0,0 @@ -const { - v0: { - GetConsensusParamsResponse, - }, -} = require('@dashevo/dapi-grpc'); -const { - server: { - error: { - InternalGrpcError, - }, - }, -} = require('@dashevo/grpc-common'); -const FailedPreconditionGrpcError = require('@dashevo/grpc-common/lib/server/error/FailedPreconditionGrpcError'); -const InvalidArgumentGrpcError = require('@dashevo/grpc-common/lib/server/error/InvalidArgumentGrpcError'); -const getConsensusParamsHandlerFactory = require('../../../../../lib/grpcServer/handlers/platform/getConsensusParamsHandlerFactory'); -const GrpcCallMock = require('../../../../../lib/test/mock/GrpcCallMock'); -const RPCError = require('../../../../../lib/rpcServer/RPCError'); - -describe('getConsensusParamsHandlerFactory', () => { - let getConsensusParamsHandler; - let getConsensusParamsMock; - let consensusParamsFixture; - let request; - let call; - - beforeEach(function beforeEach() { - request = { - getHeight: this.sinon.stub().returns(0), // gRPC returns 0 if in parameter is empty - getProve: this.sinon.stub().returns(false), - }; - - call = new GrpcCallMock(this.sinon, { - getV0: () => request, - }); - - consensusParamsFixture = { - block: { - max_bytes: '22020096', - max_gas: '1000', - time_iota_ms: '1000', - }, - evidence: { - max_age_num_blocks: '100000', - max_age_duration: '200000', - max_bytes: '22020096', - }, - validator: { - pub_key_types: [ - 'ed25519', - ], - }, - }; - - getConsensusParamsMock = this.sinon.stub().resolves(consensusParamsFixture); - - getConsensusParamsHandler = getConsensusParamsHandlerFactory( - getConsensusParamsMock, - ); - }); - - it('should return valid data', async () => { - const result = await getConsensusParamsHandler(call); - - expect(result).to.be.an.instanceOf(GetConsensusParamsResponse); - - const block = result.getV0().getBlock(); - expect(block).to.be.an.instanceOf(GetConsensusParamsResponse.ConsensusParamsBlock); - expect(block.getMaxBytes()).to.equal(consensusParamsFixture.block.max_bytes); - expect(block.getMaxGas()).to.equal(consensusParamsFixture.block.max_gas); - expect(block.getTimeIotaMs()).to.equal(consensusParamsFixture.block.time_iota_ms); - - const evidence = result.getV0().getEvidence(); - expect(evidence).to.be.an.instanceOf(GetConsensusParamsResponse.ConsensusParamsEvidence); - expect(evidence.getMaxBytes()).to.equal(consensusParamsFixture.evidence.max_bytes); - expect(evidence.getMaxAgeDuration()).to.equal(consensusParamsFixture.evidence.max_age_duration); - expect(evidence.getMaxAgeNumBlocks()) - .to.equal(consensusParamsFixture.evidence.max_age_num_blocks); - - expect(getConsensusParamsMock).to.be.calledOnceWith(undefined); - }); - - it('should throw FailedPreconditionGrpcError', async () => { - const error = new RPCError(-32603, 'invalid height', 'some data'); - getConsensusParamsMock.throws(error); - - try { - await getConsensusParamsHandler(call); - - expect.fail('should throw FailedPreconditionGrpcError'); - } catch (e) { - expect(e).to.be.an.instanceOf(FailedPreconditionGrpcError); - expect(e.getMessage()).to.equal('Invalid height: some data'); - expect(e.getCode()).to.equal(9); - } - }); - - it('should throw InternalGrpcError', async () => { - const error = new RPCError(32602, 'invalid height', 'some data'); - getConsensusParamsMock.throws(error); - - try { - await getConsensusParamsHandler(call); - - expect.fail('should throw InternalGrpcError'); - } catch (e) { - expect(e).to.be.an.instanceOf(InternalGrpcError); - expect(e.getError()).to.equal(e.getError()); - } - }); - - it('should throw InvalidArgumentGrpcError', async () => { - request.getProve.returns(true); - - try { - await getConsensusParamsHandler(call); - - expect.fail('should throw InvalidArgumentGrpcError'); - } catch (e) { - expect(e).to.be.an.instanceOf(InvalidArgumentGrpcError); - expect(e.getMessage()).to.equal('Prove is not implemented yet'); - } - }); - - it('should throw unknown error', async () => { - const error = new Error('unknown error'); - getConsensusParamsMock.throws(error); - - try { - await getConsensusParamsHandler(call); - - expect.fail('should throw InternalGrpcError'); - } catch (e) { - expect(e).to.equal(e); - } - }); - - it('should return valid data for height', async () => { - request.getHeight.returns(42); - - const result = await getConsensusParamsHandler(call); - - expect(result).to.be.an.instanceOf(GetConsensusParamsResponse); - - const block = result.getV0().getBlock(); - expect(block).to.be.an.instanceOf(GetConsensusParamsResponse.ConsensusParamsBlock); - expect(block.getMaxBytes()).to.equal(consensusParamsFixture.block.max_bytes); - expect(block.getMaxGas()).to.equal(consensusParamsFixture.block.max_gas); - expect(block.getTimeIotaMs()).to.equal(consensusParamsFixture.block.time_iota_ms); - - const evidence = result.getV0().getEvidence(); - expect(evidence).to.be.an.instanceOf(GetConsensusParamsResponse.ConsensusParamsEvidence); - expect(evidence.getMaxBytes()).to.equal(consensusParamsFixture.evidence.max_bytes); - expect(evidence.getMaxAgeDuration()).to.equal(consensusParamsFixture.evidence.max_age_duration); - expect(evidence.getMaxAgeNumBlocks()) - .to.equal(consensusParamsFixture.evidence.max_age_num_blocks); - - expect(getConsensusParamsMock).to.be.calledOnceWith(42); - }); -}); diff --git a/packages/dapi/test/unit/grpcServer/handlers/platform/getDataContractHandlerFactory.spec.js b/packages/dapi/test/unit/grpcServer/handlers/platform/getDataContractHandlerFactory.spec.js deleted file mode 100644 index f7a62f9293..0000000000 --- a/packages/dapi/test/unit/grpcServer/handlers/platform/getDataContractHandlerFactory.spec.js +++ /dev/null @@ -1,163 +0,0 @@ -const { - server: { - error: { - InvalidArgumentGrpcError, - }, - }, -} = require('@dashevo/grpc-common'); - -const { - v0: { - GetDataContractResponse, - Proof, - }, -} = require('@dashevo/dapi-grpc'); - -/* eslint-disable import/no-extraneous-dependencies */ -const generateRandomIdentifierAsync = require('@dashevo/wasm-dpp/lib/test/utils/generateRandomIdentifierAsync'); -const getDataContractFixture = require('@dashevo/wasm-dpp/lib/test/fixtures/getDataContractFixture'); - -const GrpcCallMock = require('../../../../../lib/test/mock/GrpcCallMock'); - -const getDataContractHandlerFactory = require( - '../../../../../lib/grpcServer/handlers/platform/getDataContractHandlerFactory', -); - -describe('getDataContractHandlerFactory', () => { - let call; - let getDataContractHandler; - let driveClientMock; - let request; - let id; - let dataContractFixture; - let proofFixture; - let proofMock; - let response; - let proofResponse; - - beforeEach(async function beforeEach() { - id = await generateRandomIdentifierAsync(); - request = { - getId: this.sinon.stub().returns(id), - getProve: this.sinon.stub().returns(true), - }; - - call = new GrpcCallMock(this.sinon, { - getV0: () => request, - }); - - dataContractFixture = await getDataContractFixture(); - proofFixture = { - merkleProof: Buffer.alloc(1, 1), - }; - - proofMock = new Proof(); - proofMock.setGrovedbProof(proofFixture.merkleProof); - - response = new GetDataContractResponse(); - response.setV0( - new GetDataContractResponse.GetDataContractResponseV0() - .setDataContract(dataContractFixture.toBuffer()), - ); - - proofResponse = new GetDataContractResponse(); - proofResponse.setV0( - new GetDataContractResponse.GetDataContractResponseV0() - .setProof(proofMock), - ); - - driveClientMock = { - fetchDataContract: this.sinon.stub().resolves(response.serializeBinary()), - }; - - getDataContractHandler = getDataContractHandlerFactory( - driveClientMock, - ); - }); - - it('should return data contract', async () => { - const result = await getDataContractHandler(call); - - expect(result).to.be.an.instanceOf(GetDataContractResponse); - - const contractBinary = result.getV0().getDataContract(); - expect(contractBinary).to.be.an.instanceOf(Uint8Array); - - expect(contractBinary).to.deep.equal(dataContractFixture.toBuffer()); - - const proof = result.getV0().getProof(); - - expect(proof).to.be.undefined(); - }); - - it('should return proof', async function it() { - driveClientMock = { - fetchDataContract: this.sinon.stub().resolves(proofResponse.serializeBinary()), - }; - - getDataContractHandler = getDataContractHandlerFactory( - driveClientMock, - ); - - const result = await getDataContractHandler(call); - - expect(result).to.be.an.instanceOf(GetDataContractResponse); - - const contractBinary = result.getV0().getDataContract(); - expect(contractBinary).to.be.equal(''); - - const proof = result.getV0().getProof(); - - expect(proof).to.be.an.instanceOf(Proof); - const merkleProof = proof.getGrovedbProof(); - - expect(merkleProof).to.deep.equal(proofFixture.merkleProof); - - expect(driveClientMock.fetchDataContract).to.be.calledOnceWith(call.request); - }); - - it('should not include proof', async () => { - request.getProve.returns(false); - response.getV0().setProof(null); - driveClientMock.fetchDataContract.resolves(response.serializeBinary()); - - const result = await getDataContractHandler(call); - - expect(result).to.be.an.instanceOf(GetDataContractResponse); - const proof = result.getV0().getProof(); - - expect(proof).to.be.undefined(); - - expect(driveClientMock.fetchDataContract).to.be.calledOnceWith(call.request); - }); - - it('should throw InvalidArgumentGrpcError error if id is not specified', async () => { - id = null; - request.getId.returns(id); - - try { - await getDataContractHandler(call); - - expect.fail('should thrown InvalidArgumentGrpcError error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidArgumentGrpcError); - expect(e.getMessage()).to.equal('id is not specified'); - expect(driveClientMock.fetchDataContract).to.be.not.called(); - } - }); - - it('should throw error if driveStateRepository throws an error', async () => { - const message = 'Some error'; - const abciResponseError = new Error(message); - - driveClientMock.fetchDataContract.throws(abciResponseError); - - try { - await getDataContractHandler(call); - - expect.fail('should throw error'); - } catch (e) { - expect(e).to.equal(abciResponseError); - } - }); -}); diff --git a/packages/dapi/test/unit/grpcServer/handlers/platform/getDataContractsHandlerFactory.spec.js b/packages/dapi/test/unit/grpcServer/handlers/platform/getDataContractsHandlerFactory.spec.js deleted file mode 100644 index 3eee6b5b0a..0000000000 --- a/packages/dapi/test/unit/grpcServer/handlers/platform/getDataContractsHandlerFactory.spec.js +++ /dev/null @@ -1,144 +0,0 @@ -const { BytesValue } = require('google-protobuf/google/protobuf/wrappers_pb'); - -const { - server: { - error: { - InvalidArgumentGrpcError, - }, - }, -} = require('@dashevo/grpc-common'); - -const { - v0: { - GetDataContractsResponse, - Proof, - }, -} = require('@dashevo/dapi-grpc'); - -/* eslint-disable import/no-extraneous-dependencies */ -const generateRandomIdentifierAsync = require('@dashevo/wasm-dpp/lib/test/utils/generateRandomIdentifierAsync'); -const getDataContractFixture = require('@dashevo/wasm-dpp/lib/test/fixtures/getDataContractFixture'); - -const GrpcCallMock = require('../../../../../lib/test/mock/GrpcCallMock'); - -const getDataContractsHandlerFactory = require('../../../../../lib/grpcServer/handlers/platform/getDataContractsHandlerFactory'); - -const { - DataContractEntry, - DataContracts, - GetDataContractsResponseV0, -} = GetDataContractsResponse; - -describe('getDataContractsHandlerFactory', () => { - let call; - let getDataContractsHandler; - let request; - let id; - let dataContractEntries; - let fetchDataContractsMock; - - beforeEach(async function beforeEach() { - id = await generateRandomIdentifierAsync(); - request = { - getIdsList: this.sinon.stub().returns([id]), - getProve: this.sinon.stub().returns(true), - }; - - call = new GrpcCallMock(this.sinon, { - getV0: () => request, - }); - - fetchDataContractsMock = this.sinon.stub(); - - getDataContractsHandler = getDataContractsHandlerFactory({ - fetchDataContracts: fetchDataContractsMock, - }); - }); - - it('should return data contracts', async () => { - const dataContractFixture = await getDataContractFixture(); - - const dataContractEntry = new DataContractEntry(); - dataContractEntry.setIdentifier(id.toBuffer()); - dataContractEntry.setDataContract(new BytesValue().setValue(dataContractFixture.toBuffer())); - - dataContractEntries = [ - dataContractEntry, - ]; - - const dataContracts = new DataContracts(); - dataContracts.setDataContractEntriesList(dataContractEntries); - - const response = new GetDataContractsResponse().setV0( - new GetDataContractsResponseV0().setDataContracts(dataContracts), - ); - - fetchDataContractsMock.resolves(response.serializeBinary()); - - const result = await getDataContractsHandler(call); - - expect(result).to.be.an.instanceOf(GetDataContractsResponse); - - const contractBinaries = result.getV0().getDataContracts().getDataContractEntriesList(); - - expect(contractBinaries).to.deep.equal(dataContractEntries); - - expect(fetchDataContractsMock).to.be.calledOnceWith(call.request); - }); - - it('should return proof', async () => { - const proofFixture = { - merkleProof: Buffer.alloc(1, 1), - }; - - const proofMock = new Proof(); - proofMock.setGrovedbProof(proofFixture.merkleProof); - - const response = new GetDataContractsResponse() - .setV0(new GetDataContractsResponseV0().setProof(proofMock)); - - fetchDataContractsMock.resolves(response.serializeBinary()); - - const result = await getDataContractsHandler(call); - - expect(result).to.be.an.instanceOf(GetDataContractsResponse); - - const proof = result.getV0().getProof(); - - expect(proof).to.be.an.instanceOf(Proof); - const merkleProof = proof.getGrovedbProof(); - - expect(merkleProof).to.deep.equal(proofFixture.merkleProof); - - expect(fetchDataContractsMock).to.be.calledOnceWith(call.request); - }); - - it('should throw InvalidArgumentGrpcError error if ids are not specified', async () => { - request.getIdsList.returns(null); - - try { - await getDataContractsHandler(call); - - expect.fail('should thrown InvalidArgumentGrpcError error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidArgumentGrpcError); - expect(e.getMessage()).to.equal('data contract ids are not specified'); - expect(fetchDataContractsMock).to.be.not.called(); - } - }); - - it('should throw error if driveStateRepository throws an error', async () => { - const message = 'Some error'; - const abciResponseError = new Error(message); - - fetchDataContractsMock.throws(abciResponseError); - - try { - await getDataContractsHandler(call); - - expect.fail('should throw error'); - } catch (e) { - expect(e).to.equal(abciResponseError); - } - }); -}); diff --git a/packages/dapi/test/unit/grpcServer/handlers/platform/getDocumentsHandlerFactory.spec.js b/packages/dapi/test/unit/grpcServer/handlers/platform/getDocumentsHandlerFactory.spec.js deleted file mode 100644 index 69aff5ffb0..0000000000 --- a/packages/dapi/test/unit/grpcServer/handlers/platform/getDocumentsHandlerFactory.spec.js +++ /dev/null @@ -1,193 +0,0 @@ -const cbor = require('cbor'); - -const { - server: { - error: { - InvalidArgumentGrpcError, - }, - }, -} = require('@dashevo/grpc-common'); - -const { - v0: { - GetDocumentsResponse, - Proof, - }, -} = require('@dashevo/dapi-grpc'); - -/* eslint-disable import/no-extraneous-dependencies */ -const generateRandomIdentifierAsync = require('@dashevo/wasm-dpp/lib/test/utils/generateRandomIdentifierAsync'); -const getDocumentsFixture = require('@dashevo/wasm-dpp/lib/test/fixtures/getDocumentsFixture'); - -const GrpcCallMock = require('../../../../../lib/test/mock/GrpcCallMock'); - -const getDocumentsHandlerFactory = require( - '../../../../../lib/grpcServer/handlers/platform/getDocumentsHandlerFactory', -); - -describe('getDocumentsHandlerFactory', () => { - let call; - let getDocumentsHandler; - let driveStateRepositoryMock; - let request; - let documentsFixture; - let dataContractId; - let documentType; - let where; - let orderBy; - let limit; - let startAfter; - let startAt; - let documentsSerialized; - let proofFixture; - let response; - let proofMock; - let proofResponse; - - beforeEach(async function beforeEach() { - dataContractId = await generateRandomIdentifierAsync(); - documentType = 'document'; - where = [['name', '==', 'John']]; - orderBy = [{ order: 'asc' }]; - limit = 20; - startAfter = new Uint8Array((await generateRandomIdentifierAsync()).toBuffer()); - startAt = new Uint8Array([]); - - request = { - getDataContractId: this.sinon.stub().returns(dataContractId), - getDocumentType: this.sinon.stub().returns(documentType), - getWhere_asU8: this.sinon.stub().returns(new Uint8Array(cbor.encode(where))), - getOrderBy_asU8: this.sinon.stub().returns(new Uint8Array(cbor.encode(orderBy))), - getLimit: this.sinon.stub().returns(limit), - getStartAfter_asU8: this.sinon.stub().returns(startAfter), - getStartAt_asU8: this.sinon.stub().returns(startAt), - getProve: this.sinon.stub().returns(false), - }; - - call = new GrpcCallMock(this.sinon, { - getV0: () => request, - }); - - const [document] = await getDocumentsFixture(); - - documentsFixture = [document]; - - documentsSerialized = documentsFixture.map((documentItem) => documentItem.toBuffer()); - proofFixture = { - merkleProof: Buffer.alloc(1, 1), - }; - - proofMock = new Proof(); - proofMock.setGrovedbProof(proofFixture.merkleProof); - - const { GetDocumentsResponseV0 } = GetDocumentsResponse; - response = new GetDocumentsResponse(); - response.setV0( - new GetDocumentsResponseV0() - .setDocuments( - new GetDocumentsResponseV0.Documents() - .setDocumentsList(documentsSerialized), - ), - ); - - proofResponse = new GetDocumentsResponse(); - proofResponse.setV0( - new GetDocumentsResponseV0().setProof(proofMock), - ); - - driveStateRepositoryMock = { - fetchDocuments: this.sinon.stub().resolves(response.serializeBinary()), - }; - - getDocumentsHandler = getDocumentsHandlerFactory( - driveStateRepositoryMock, - ); - }); - - it('should return valid result', async () => { - response.getV0().setProof(null); - - const result = await getDocumentsHandler(call); - - expect(result).to.be.an.instanceOf(GetDocumentsResponse); - const documents = result.getV0().getDocuments(); - - const documentsBinary = documents.getDocumentsList(); - expect(documentsBinary).to.be.an('array'); - expect(documentsBinary).to.have.lengthOf(documentsFixture.length); - - expect(driveStateRepositoryMock.fetchDocuments).to.be.calledOnceWith( - call.request, - ); - - expect(documentsBinary[0]).to.deep.equal(documentsSerialized[0]); - - const proof = result.getV0().getProof(); - - expect(proof).to.be.undefined(); - }); - - it('should return proof', async () => { - request.getProve.returns(true); - driveStateRepositoryMock.fetchDocuments.resolves(proofResponse.serializeBinary()); - - const result = await getDocumentsHandler(call); - - expect(result).to.be.an.instanceOf(GetDocumentsResponse); - - expect(driveStateRepositoryMock.fetchDocuments).to.be.calledOnceWith( - call.request, - ); - - const proof = result.getV0().getProof(); - - expect(proof).to.be.an.instanceOf(Proof); - const merkleProof = proof.getGrovedbProof(); - - expect(merkleProof).to.deep.equal(proofFixture.merkleProof); - }); - - it('should throw InvalidArgumentGrpcError if dataContractId is not specified', async () => { - dataContractId = null; - request.getDataContractId.returns(dataContractId); - - try { - await getDocumentsHandler(call); - - expect.fail('should throw InvalidArgumentGrpcError error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidArgumentGrpcError); - expect(e.getMessage()).to.equal('dataContractId is not specified'); - expect(driveStateRepositoryMock.fetchDocuments).to.be.not.called(); - } - }); - - it('should throw InvalidArgumentGrpcError if documentType is not specified', async () => { - documentType = null; - request.getDocumentType.returns(documentType); - - try { - await getDocumentsHandler(call); - - expect.fail('should throw InvalidArgumentGrpcError error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidArgumentGrpcError); - expect(e.getMessage()).to.equal('documentType is not specified'); - expect(driveStateRepositoryMock.fetchDocuments).to.be.not.called(); - } - }); - - it('should throw error if fetchDocuments throws an error', async () => { - const error = new Error('Some error'); - - driveStateRepositoryMock.fetchDocuments.throws(error); - - try { - await getDocumentsHandler(call); - - expect.fail('should throw InvalidArgumentGrpcError error'); - } catch (e) { - expect(e).to.equal(error); - } - }); -}); diff --git a/packages/dapi/test/unit/grpcServer/handlers/platform/getEpochsInfoHandlerFactory.spec.js b/packages/dapi/test/unit/grpcServer/handlers/platform/getEpochsInfoHandlerFactory.spec.js deleted file mode 100644 index 151f43b4e8..0000000000 --- a/packages/dapi/test/unit/grpcServer/handlers/platform/getEpochsInfoHandlerFactory.spec.js +++ /dev/null @@ -1,113 +0,0 @@ -const { - v0: { - GetEpochsInfoResponse, - Proof, - }, -} = require('@dashevo/dapi-grpc'); - -const getEpochsInfoHandlerFactory = require('../../../../../lib/grpcServer/handlers/platform/getEpochsInfoHandlerFactory'); - -const GrpcCallMock = require('../../../../../lib/test/mock/GrpcCallMock'); - -describe('getEpochsInfoHandlerFactory', () => { - let call; - let driveStateRepositoryMock; - let getEpochsInfoHandler; - let epochNumber; - let proofFixture; - let proofMock; - let request; - let response; - let proofResponse; - - beforeEach(async function beforeEach() { - request = { - getProve: this.sinon.stub().returns(false), - }; - call = new GrpcCallMock(this.sinon, { - getV0: () => request, - }); - - proofFixture = { - merkleProof: Buffer.alloc(1, 1), - }; - - proofMock = new Proof(); - proofMock.setGrovedbProof(proofFixture.merkleProof); - - epochNumber = 1; - const { GetEpochsInfoResponseV0 } = GetEpochsInfoResponse; - const { EpochInfos, EpochInfo } = GetEpochsInfoResponseV0; - response = new GetEpochsInfoResponse(); - response.setV0( - new GetEpochsInfoResponseV0() - .setEpochs(new EpochInfos() - .setEpochInfosList([new EpochInfo() - .setNumber(epochNumber) - .setFirstBlockHeight(1) - .setFirstCoreBlockHeight(1) - .setStartTime(Date.now()) - .setFeeMultiplier(1.1)])), - ); - - proofResponse = new GetEpochsInfoResponse(); - proofResponse.setV0( - new GetEpochsInfoResponseV0() - .setProof(proofMock), - ); - - driveStateRepositoryMock = { - fetchEpochsInfo: this.sinon.stub().resolves(response.serializeBinary()), - }; - - getEpochsInfoHandler = getEpochsInfoHandlerFactory( - driveStateRepositoryMock, - ); - }); - - it('should return valid result', async () => { - const result = await getEpochsInfoHandler(call); - - expect(result).to.be.an.instanceOf(GetEpochsInfoResponse); - expect(result.getV0() - .getEpochs().getEpochInfosList()[0].getNumber()).to.equal(epochNumber); - expect(driveStateRepositoryMock.fetchEpochsInfo).to.be.calledOnceWith(call.request); - - const proof = result.getV0().getProof(); - expect(proof).to.be.undefined(); - }); - - it('should return proof', async () => { - request.getProve.returns(true); - - driveStateRepositoryMock.fetchEpochsInfo.resolves(proofResponse.serializeBinary()); - - const result = await getEpochsInfoHandler(call); - - expect(result).to.be.an.instanceOf(GetEpochsInfoResponse); - - const proof = result.getV0().getProof(); - - expect(proof).to.be.an.instanceOf(Proof); - const merkleProof = proof.getGrovedbProof(); - - expect(merkleProof).to.deep.equal(proofFixture.merkleProof); - - expect(driveStateRepositoryMock.fetchEpochsInfo).to.be.calledOnceWith(call.request); - }); - - it('should throw an error when fetchEpochsInfo throws unknown error', async () => { - const error = new Error('Unknown error'); - - driveStateRepositoryMock.fetchEpochsInfo.throws(error); - - try { - await getEpochsInfoHandler(call); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.equal(error); - expect(driveStateRepositoryMock.fetchEpochsInfo).to.be.calledOnceWith(call.request); - } - }); -}); diff --git a/packages/dapi/test/unit/grpcServer/handlers/platform/getIdentitiesByPublicKeyHashesHandlerFactory.spec.js b/packages/dapi/test/unit/grpcServer/handlers/platform/getIdentitiesByPublicKeyHashesHandlerFactory.spec.js deleted file mode 100644 index 00388413e2..0000000000 --- a/packages/dapi/test/unit/grpcServer/handlers/platform/getIdentitiesByPublicKeyHashesHandlerFactory.spec.js +++ /dev/null @@ -1,159 +0,0 @@ -const { BytesValue } = require('google-protobuf/google/protobuf/wrappers_pb'); - -const { - server: { - error: { - InvalidArgumentGrpcError, - }, - }, -} = require('@dashevo/grpc-common'); - -const { - v0: { - GetIdentitiesByPublicKeyHashesResponse, - Proof, - }, -} = require('@dashevo/dapi-grpc'); - -const getIdentityFixture = require('@dashevo/wasm-dpp/lib/test/fixtures/getIdentityFixture'); - -const getIdentitiesByPublicKeyHashesHandlerFactory = require( - '../../../../../lib/grpcServer/handlers/platform/getIdentitiesByPublicKeyHashesHandlerFactory', -); - -const GrpcCallMock = require('../../../../../lib/test/mock/GrpcCallMock'); - -describe('getIdentitiesByPublicKeyHashesHandlerFactory', () => { - let call; - let driveClientMock; - let getIdentitiesByPublicKeyHashesHandler; - let identity; - let publicKeyHash; - let proofFixture; - let proofMock; - let response; - let proofResponse; - let request; - - beforeEach(async function beforeEach() { - publicKeyHash = Buffer.from('556c2910d46fda2b327ef9d9bda850cc84d30db0', 'hex'); - - request = { - getPublicKeyHashesList: this.sinon.stub().returns( - [publicKeyHash], - ), - getProve: this.sinon.stub().returns(false), - }; - - call = new GrpcCallMock(this.sinon, { - getV0: () => request, - }); - - identity = await getIdentityFixture(); - - proofFixture = { - merkleProof: Buffer.alloc(1, 1), - }; - - proofMock = new Proof(); - proofMock.setGrovedbProof(proofFixture.merkleProof); - - const { - IdentitiesByPublicKeyHashes, - PublicKeyHashIdentityEntry, - GetIdentitiesByPublicKeyHashesResponseV0, - } = GetIdentitiesByPublicKeyHashesResponse; - - response = new GetIdentitiesByPublicKeyHashesResponse(); - response.setV0( - new GetIdentitiesByPublicKeyHashesResponseV0().setIdentities( - new IdentitiesByPublicKeyHashes() - .setIdentityEntriesList([ - new PublicKeyHashIdentityEntry() - .setPublicKeyHash(publicKeyHash) - .setValue(new BytesValue().setValue(identity.toBuffer())), - ]), - ), - ); - - proofResponse = new GetIdentitiesByPublicKeyHashesResponse(); - proofResponse.setV0( - new GetIdentitiesByPublicKeyHashesResponseV0().setProof(proofMock), - ); - - driveClientMock = { - fetchIdentitiesByPublicKeyHashes: this.sinon.stub().resolves(response.serializeBinary()), - }; - - getIdentitiesByPublicKeyHashesHandler = getIdentitiesByPublicKeyHashesHandlerFactory( - driveClientMock, - ); - }); - - it('should return identities', async () => { - const result = await getIdentitiesByPublicKeyHashesHandler(call); - - expect(result).to.be.an.instanceOf(GetIdentitiesByPublicKeyHashesResponse); - - expect(result.getV0() - .getIdentities() - .getIdentityEntriesList()[0] - .getValue() - .getValue()).to.deep.equal( - identity.toBuffer(), - ); - - expect(driveClientMock.fetchIdentitiesByPublicKeyHashes) - .to.be.calledOnceWith(call.request); - - const proof = result.getV0().getProof(); - - expect(proof).to.be.undefined(); - }); - - it('should return proof', async () => { - request.getProve.returns(true); - driveClientMock.fetchIdentitiesByPublicKeyHashes.resolves(proofResponse.serializeBinary()); - - const result = await getIdentitiesByPublicKeyHashesHandler(call); - - expect(result).to.be.an.instanceOf(GetIdentitiesByPublicKeyHashesResponse); - - const proof = result.getV0().getProof(); - - expect(proof).to.be.an.instanceOf(Proof); - const merkleProof = proof.getGrovedbProof(); - - expect(merkleProof).to.deep.equal(proofFixture.merkleProof); - }); - - it('should throw an InvalidArgumentGrpcError if no hashes were submitted', async () => { - request.getPublicKeyHashesList.returns([]); - - try { - await getIdentitiesByPublicKeyHashesHandler(call); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidArgumentGrpcError); - expect(e.getMessage()).to.equal('No public key hashes were provided'); - expect(driveClientMock.fetchIdentitiesByPublicKeyHashes).to.not.be.called(); - } - }); - - it('should throw an error when fetchIdentity throws an error', async () => { - const error = new Error('Unknown error'); - - driveClientMock.fetchIdentitiesByPublicKeyHashes.throws(error); - - try { - await getIdentitiesByPublicKeyHashesHandler(call); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.equal(error); - expect(driveClientMock.fetchIdentitiesByPublicKeyHashes) - .to.be.calledOnceWith(call.request); - } - }); -}); diff --git a/packages/dapi/test/unit/grpcServer/handlers/platform/getIdentitiesHandlerFactory.spec.js b/packages/dapi/test/unit/grpcServer/handlers/platform/getIdentitiesHandlerFactory.spec.js deleted file mode 100644 index c0ae75cbdc..0000000000 --- a/packages/dapi/test/unit/grpcServer/handlers/platform/getIdentitiesHandlerFactory.spec.js +++ /dev/null @@ -1,142 +0,0 @@ -const { - server: { - error: { - InvalidArgumentGrpcError, - }, - }, -} = require('@dashevo/grpc-common'); - -const { - v0: { - GetIdentitiesResponse, - Proof, - }, -} = require('@dashevo/dapi-grpc'); - -const { - IdentityEntry, - IdentityValue, - GetIdentitiesResponseV0, - Identities, -} = GetIdentitiesResponse; - -/* eslint-disable import/no-extraneous-dependencies */ -const generateRandomIdentifierAsync = require('@dashevo/wasm-dpp/lib/test/utils/generateRandomIdentifierAsync'); -const getIdentityFixture = require('@dashevo/wasm-dpp/lib/test/fixtures/getIdentityFixture'); - -const GrpcCallMock = require('../../../../../lib/test/mock/GrpcCallMock'); - -const getIdentitiesHandlerFactory = require('../../../../../lib/grpcServer/handlers/platform/getIdentitiesHandlerFactory'); - -describe('getIdentitiesHandlerFactory', () => { - let call; - let getIdentitiesHandler; - let fetchIdentitiesMock; - let request; - let id; - - beforeEach(async function beforeEach() { - id = await generateRandomIdentifierAsync(); - request = { - getIdsList: this.sinon.stub().returns([id]), - getProve: this.sinon.stub().returns(true), - }; - - call = new GrpcCallMock(this.sinon, { - getV0: () => request, - }); - - fetchIdentitiesMock = this.sinon.stub(); - - getIdentitiesHandler = getIdentitiesHandlerFactory({ - fetchIdentities: fetchIdentitiesMock, - }); - }); - - it('should return identities', async () => { - const identityFixture = await getIdentityFixture(); - - const identityValue = new IdentityValue(); - identityValue.setValue(identityFixture.toBuffer()); - - const identityEntry = new IdentityEntry(); - identityEntry.setKey(id.toBuffer()); - identityEntry.setValue(identityValue); - - const identityEntries = [ - identityEntry, - ]; - - const identities = new Identities(); - identities.setIdentityEntriesList(identityEntries); - - const response = new GetIdentitiesResponse() - .setV0(new GetIdentitiesResponseV0().setIdentities(identities)); - - fetchIdentitiesMock.resolves(response.serializeBinary()); - - const result = await getIdentitiesHandler(call); - - expect(result).to.be.an.instanceOf(GetIdentitiesResponse); - - const identityBinaries = result.getV0().getIdentities().getIdentityEntriesList(); - - expect(identityBinaries).to.deep.equal(identityEntries); - }); - - it('should return proof', async () => { - const proofFixture = { - merkleProof: Buffer.alloc(1, 1), - }; - - const proofMock = new Proof(); - proofMock.setGrovedbProof(proofFixture.merkleProof); - - const response = new GetIdentitiesResponse() - .setV0(new GetIdentitiesResponseV0().setProof(proofMock)); - - fetchIdentitiesMock.resolves(response.serializeBinary()); - - const result = await getIdentitiesHandler(call); - - expect(result).to.be.an.instanceOf(GetIdentitiesResponse); - - const proof = result.getV0().getProof(); - - expect(proof).to.be.an.instanceOf(Proof); - const merkleProof = proof.getGrovedbProof(); - - expect(merkleProof).to.deep.equal(proofFixture.merkleProof); - - expect(fetchIdentitiesMock).to.be.calledOnceWith(call.request); - }); - - it('should throw InvalidArgumentGrpcError error if ids are not specified', async () => { - request.getIdsList.returns(null); - - try { - await getIdentitiesHandler(call); - - expect.fail('should thrown InvalidArgumentGrpcError error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidArgumentGrpcError); - expect(e.getMessage()).to.equal('identity ids are not specified'); - expect(fetchIdentitiesMock).to.be.not.called(); - } - }); - - it('should throw error if driveStateRepository throws an error', async () => { - const message = 'Some error'; - const abciResponseError = new Error(message); - - fetchIdentitiesMock.throws(abciResponseError); - - try { - await getIdentitiesHandler(call); - - expect.fail('should throw error'); - } catch (e) { - expect(e).to.equal(abciResponseError); - } - }); -}); diff --git a/packages/dapi/test/unit/grpcServer/handlers/platform/getIdentityBalanceAndRevisionHandlerFactory.spec.js b/packages/dapi/test/unit/grpcServer/handlers/platform/getIdentityBalanceAndRevisionHandlerFactory.spec.js deleted file mode 100644 index effbd19d62..0000000000 --- a/packages/dapi/test/unit/grpcServer/handlers/platform/getIdentityBalanceAndRevisionHandlerFactory.spec.js +++ /dev/null @@ -1,137 +0,0 @@ -const { - server: { - error: { - InvalidArgumentGrpcError, - }, - }, -} = require('@dashevo/grpc-common'); - -const { - v0: { - GetIdentityBalanceAndRevisionResponse, - Proof, - }, -} = require('@dashevo/dapi-grpc'); - -const { - GetIdentityBalanceAndRevisionResponseV0, -} = GetIdentityBalanceAndRevisionResponse; - -const { - BalanceAndRevision, -} = GetIdentityBalanceAndRevisionResponseV0; - -/* eslint-disable import/no-extraneous-dependencies */ -const generateRandomIdentifierAsync = require('@dashevo/wasm-dpp/lib/test/utils/generateRandomIdentifierAsync'); - -const GrpcCallMock = require('../../../../../lib/test/mock/GrpcCallMock'); - -const getIdentityBalanceAndRevisionHandlerFactory = require('../../../../../lib/grpcServer/handlers/platform/getIdentityBalanceAndRevisionHandlerFactory'); - -describe('getIdentityBalanceAndRevisionHandlerFactory', () => { - let call; - let getIdentityBalanceAndRevisionHandler; - let fetchIdentityBalanceAndRevisionMock; - let request; - let id; - - beforeEach(async function beforeEach() { - id = await generateRandomIdentifierAsync(); - - request = { - getId: this.sinon.stub().returns(id), - getProve: this.sinon.stub().returns(true), - }; - - call = new GrpcCallMock(this.sinon, { - getV0: () => request, - }); - - fetchIdentityBalanceAndRevisionMock = this.sinon.stub(); - - getIdentityBalanceAndRevisionHandler = getIdentityBalanceAndRevisionHandlerFactory({ - fetchIdentityBalanceAndRevision: fetchIdentityBalanceAndRevisionMock, - }); - }); - - it('should return identity balance and revision', async () => { - const revisionAndBalance = new BalanceAndRevision(); - - revisionAndBalance.setRevision(1); - revisionAndBalance.setBalance(15); - - const response = new GetIdentityBalanceAndRevisionResponse() - .setV0( - new GetIdentityBalanceAndRevisionResponseV0().setBalanceAndRevision(revisionAndBalance), - ); - - fetchIdentityBalanceAndRevisionMock.resolves(response.serializeBinary()); - - const result = await getIdentityBalanceAndRevisionHandler(call); - - expect(result).to.be.an.instanceOf(GetIdentityBalanceAndRevisionResponse); - - const identityRevisionAndBalance = result.getV0().getBalanceAndRevision(); - - expect(identityRevisionAndBalance.getRevision()).to.equals(1); - expect(identityRevisionAndBalance.getBalance()).to.equals(15); - - expect(fetchIdentityBalanceAndRevisionMock).to.be.calledOnceWith(call.request); - }); - - it('should return proof', async () => { - const proofFixture = { - merkleProof: Buffer.alloc(1, 1), - }; - - const proofMock = new Proof(); - proofMock.setGrovedbProof(proofFixture.merkleProof); - - const response = new GetIdentityBalanceAndRevisionResponse() - .setV0(new GetIdentityBalanceAndRevisionResponseV0().setProof(proofMock)); - - fetchIdentityBalanceAndRevisionMock.resolves(response.serializeBinary()); - - const result = await getIdentityBalanceAndRevisionHandler(call); - - expect(result).to.be.an.instanceOf(GetIdentityBalanceAndRevisionResponse); - - const proof = result.getV0().getProof(); - - expect(proof).to.be.an.instanceOf(Proof); - const merkleProof = proof.getGrovedbProof(); - - expect(merkleProof).to.deep.equal(proofFixture.merkleProof); - - expect(fetchIdentityBalanceAndRevisionMock).to.be.calledOnceWith(call.request); - }); - - it('should throw InvalidArgumentGrpcError error if ids are not specified', async () => { - request.getId.returns(null); - - try { - await getIdentityBalanceAndRevisionHandler(call); - - expect.fail('should thrown InvalidArgumentGrpcError error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidArgumentGrpcError); - expect(e.getMessage()).to.equal('identity id is not specified'); - expect(fetchIdentityBalanceAndRevisionMock).to.be.not.called(); - } - }); - - it('should throw error if driveStateRepository throws an error', async () => { - const message = 'Some error'; - const abciResponseError = new Error(message); - - fetchIdentityBalanceAndRevisionMock.throws(abciResponseError); - - try { - await getIdentityBalanceAndRevisionHandler(call); - - expect.fail('should throw error'); - } catch (e) { - expect(e).to.equal(abciResponseError); - } - }); -}); diff --git a/packages/dapi/test/unit/grpcServer/handlers/platform/getIdentityBalanceHandlerFactory.spec.js b/packages/dapi/test/unit/grpcServer/handlers/platform/getIdentityBalanceHandlerFactory.spec.js deleted file mode 100644 index 841901f649..0000000000 --- a/packages/dapi/test/unit/grpcServer/handlers/platform/getIdentityBalanceHandlerFactory.spec.js +++ /dev/null @@ -1,122 +0,0 @@ -const { - server: { - error: { - InvalidArgumentGrpcError, - }, - }, -} = require('@dashevo/grpc-common'); - -const { - v0: { - GetIdentityBalanceResponse, - Proof, - }, -} = require('@dashevo/dapi-grpc'); - -const { - GetIdentityBalanceResponseV0, -} = GetIdentityBalanceResponse; - -/* eslint-disable import/no-extraneous-dependencies */ -const generateRandomIdentifierAsync = require('@dashevo/wasm-dpp/lib/test/utils/generateRandomIdentifierAsync'); - -const GrpcCallMock = require('../../../../../lib/test/mock/GrpcCallMock'); - -const getIdentityBalanceHandlerFactory = require('../../../../../lib/grpcServer/handlers/platform/getIdentityBalanceHandlerFactory'); - -describe('getIdentityBalanceHandlerFactory', () => { - let call; - let getIdentityBalanceHandler; - let request; - let id; - let fetchIdentityBalanceMock; - - beforeEach(async function beforeEach() { - id = await generateRandomIdentifierAsync(); - request = { - getId: this.sinon.stub().returns(id), - getProve: this.sinon.stub().returns(true), - }; - - call = new GrpcCallMock(this.sinon, { - getV0: () => request, - }); - - fetchIdentityBalanceMock = this.sinon.stub(); - - getIdentityBalanceHandler = getIdentityBalanceHandlerFactory({ - fetchIdentityBalance: fetchIdentityBalanceMock, - }); - }); - - it('should return identity balance', async () => { - const response = new GetIdentityBalanceResponse() - .setV0(new GetIdentityBalanceResponseV0().setBalance(15)); - - fetchIdentityBalanceMock.resolves(response.serializeBinary()); - - const result = await getIdentityBalanceHandler(call); - - expect(result).to.be.an.instanceOf(GetIdentityBalanceResponse); - - const identityBalance = result.getV0().getBalance(); - - expect(identityBalance).to.deep.equal(15); - }); - - it('should return proof', async () => { - const proofFixture = { - merkleProof: Buffer.alloc(1, 1), - }; - - const proofMock = new Proof(); - proofMock.setGrovedbProof(proofFixture.merkleProof); - - const response = new GetIdentityBalanceResponse() - .setV0(new GetIdentityBalanceResponseV0().setProof(proofMock)); - - fetchIdentityBalanceMock.resolves(response.serializeBinary()); - - const result = await getIdentityBalanceHandler(call); - - expect(result).to.be.an.instanceOf(GetIdentityBalanceResponse); - - const proof = result.getV0().getProof(); - - expect(proof).to.be.an.instanceOf(Proof); - const merkleProof = proof.getGrovedbProof(); - - expect(merkleProof).to.deep.equal(proofFixture.merkleProof); - - expect(fetchIdentityBalanceMock).to.be.calledOnceWith(call.request); - }); - - it('should throw InvalidArgumentGrpcError error if ids are not specified', async () => { - request.getId.returns(null); - - try { - await getIdentityBalanceHandler(call); - - expect.fail('should thrown InvalidArgumentGrpcError error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidArgumentGrpcError); - expect(e.getMessage()).to.equal('identity id is not specified'); - expect(fetchIdentityBalanceMock).to.be.not.called(); - } - }); - - it('should throw error if driveStateRepository throws an error', async () => { - const message = 'Some error'; - const abciResponseError = new Error(message); - - fetchIdentityBalanceMock.throws(abciResponseError); - - try { - await getIdentityBalanceHandler(call); - - expect.fail('should throw error'); - } catch (e) { - expect(e).to.equal(abciResponseError); - } - }); -}); diff --git a/packages/dapi/test/unit/grpcServer/handlers/platform/getIdentityByPublicKeyHashHandlerFactory.spec.js b/packages/dapi/test/unit/grpcServer/handlers/platform/getIdentityByPublicKeyHashHandlerFactory.spec.js deleted file mode 100644 index 9f88a678a5..0000000000 --- a/packages/dapi/test/unit/grpcServer/handlers/platform/getIdentityByPublicKeyHashHandlerFactory.spec.js +++ /dev/null @@ -1,132 +0,0 @@ -const { - server: { - error: { - InvalidArgumentGrpcError, - }, - }, -} = require('@dashevo/grpc-common'); - -const { - v0: { - GetIdentityByPublicKeyHashResponse, - Proof, - }, -} = require('@dashevo/dapi-grpc'); - -const { - GetIdentityByPublicKeyHashResponseV0, -} = GetIdentityByPublicKeyHashResponse; - -/* eslint-disable import/no-extraneous-dependencies */ -const getIdentityFixture = require('@dashevo/wasm-dpp/lib/test/fixtures/getIdentityFixture'); - -const GrpcCallMock = require('../../../../../lib/test/mock/GrpcCallMock'); - -const getIdentityByPublicKeyHashHandlerFactory = require('../../../../../lib/grpcServer/handlers/platform/getIdentityByPublicKeyHashHandlerFactory'); - -describe('getIdentityByPublicKeyHashHandlerFactory', () => { - let call; - let getIdentityByPublicKeyHashHandler; - let request; - let fetchIdentityByPublicKeyHashMock; - - beforeEach(async function beforeEach() { - request = { - getPublicKeyHash: this.sinon.stub().returns( - Buffer.alloc(1, 1), - ), - getProve: this.sinon.stub().returns(true), - }; - - call = new GrpcCallMock(this.sinon, { - getV0: () => request, - }); - - fetchIdentityByPublicKeyHashMock = this.sinon.stub(); - - getIdentityByPublicKeyHashHandler = getIdentityByPublicKeyHashHandlerFactory({ - fetchIdentityByPublicKeyHash: fetchIdentityByPublicKeyHashMock, - }); - }); - - it('should return identity', async () => { - const identityFixture = await getIdentityFixture(); - - const response = new GetIdentityByPublicKeyHashResponse() - .setV0(new GetIdentityByPublicKeyHashResponseV0().setIdentity(identityFixture.toBuffer())); - - fetchIdentityByPublicKeyHashMock.resolves(response.serializeBinary()); - - const result = await getIdentityByPublicKeyHashHandler(call); - - expect(result).to.be.an.instanceOf(GetIdentityByPublicKeyHashResponse); - - const identity = result.getV0().getIdentity(); - - expect(identity).to.deep.equal(identityFixture.toBuffer()); - - expect(fetchIdentityByPublicKeyHashMock).to.be.calledOnceWith( - call.request, - ); - }); - - it('should return proof', async () => { - const proofFixture = { - merkleProof: Buffer.alloc(1, 1), - }; - - const proofMock = new Proof(); - - proofMock.setGrovedbProof(proofFixture.merkleProof); - - const response = new GetIdentityByPublicKeyHashResponse().setV0( - new GetIdentityByPublicKeyHashResponseV0().setProof(proofMock), - ); - - fetchIdentityByPublicKeyHashMock.resolves(response.serializeBinary()); - - const result = await getIdentityByPublicKeyHashHandler(call); - - expect(result).to.be.an.instanceOf(GetIdentityByPublicKeyHashResponse); - - const proof = result.getV0().getProof(); - - expect(proof).to.be.an.instanceOf(Proof); - const merkleProof = proof.getGrovedbProof(); - - expect(merkleProof).to.deep.equal(proofFixture.merkleProof); - - expect(fetchIdentityByPublicKeyHashMock).to.be.calledOnceWith( - call.request, - ); - }); - - it('should throw InvalidArgumentGrpcError error if ids are not specified', async () => { - request.getPublicKeyHash.returns([]); - - try { - await getIdentityByPublicKeyHashHandler(call); - - expect.fail('should thrown InvalidArgumentGrpcError error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidArgumentGrpcError); - expect(e.getMessage()).to.equal('No public key hash is provided'); - expect(fetchIdentityByPublicKeyHashMock).to.be.not.called(); - } - }); - - it('should throw error if driveStateRepository throws an error', async () => { - const message = 'Some error'; - const abciResponseError = new Error(message); - - fetchIdentityByPublicKeyHashMock.throws(abciResponseError); - - try { - await getIdentityByPublicKeyHashHandler(call); - - expect.fail('should throw error'); - } catch (e) { - expect(e).to.equal(abciResponseError); - } - }); -}); diff --git a/packages/dapi/test/unit/grpcServer/handlers/platform/getIdentityHandlerFactory.spec.js b/packages/dapi/test/unit/grpcServer/handlers/platform/getIdentityHandlerFactory.spec.js deleted file mode 100644 index e3340dfcf5..0000000000 --- a/packages/dapi/test/unit/grpcServer/handlers/platform/getIdentityHandlerFactory.spec.js +++ /dev/null @@ -1,134 +0,0 @@ -const { - server: { - error: { - InvalidArgumentGrpcError, - }, - }, -} = require('@dashevo/grpc-common'); - -const { - v0: { - GetIdentityResponse, - Proof, - }, -} = require('@dashevo/dapi-grpc'); - -/* eslint-disable import/no-extraneous-dependencies */ -const generateRandomIdentifierAsync = require('@dashevo/wasm-dpp/lib/test/utils/generateRandomIdentifierAsync'); -const getIdentityFixture = require('@dashevo/wasm-dpp/lib/test/fixtures/getIdentityFixture'); - -const getIdentityHandlerFactory = require('../../../../../lib/grpcServer/handlers/platform/getIdentityHandlerFactory'); - -const GrpcCallMock = require('../../../../../lib/test/mock/GrpcCallMock'); - -describe('getIdentityHandlerFactory', () => { - let call; - let driveStateRepositoryMock; - let id; - let getIdentityHandler; - let identity; - let proofFixture; - let proofMock; - let request; - let response; - let proofResponse; - - beforeEach(async function beforeEach() { - id = await generateRandomIdentifierAsync(); - request = { - getId: this.sinon.stub().returns(id), - getProve: this.sinon.stub().returns(false), - }; - call = new GrpcCallMock(this.sinon, { - getV0: () => request, - }); - - identity = await getIdentityFixture(); - - proofFixture = { - merkleProof: Buffer.alloc(1, 1), - }; - - proofMock = new Proof(); - proofMock.setGrovedbProof(proofFixture.merkleProof); - - response = new GetIdentityResponse(); - response.setV0( - new GetIdentityResponse.GetIdentityResponseV0() - .setIdentity(identity.toBuffer()), - ); - - proofResponse = new GetIdentityResponse(); - proofResponse.setV0( - new GetIdentityResponse.GetIdentityResponseV0() - .setProof(proofMock), - ); - - driveStateRepositoryMock = { - fetchIdentity: this.sinon.stub().resolves(response.serializeBinary()), - }; - - getIdentityHandler = getIdentityHandlerFactory( - driveStateRepositoryMock, - ); - }); - - it('should return valid result', async () => { - const result = await getIdentityHandler(call); - - expect(result).to.be.an.instanceOf(GetIdentityResponse); - expect(result.getV0().getIdentity()).to.deep.equal(identity.toBuffer()); - expect(driveStateRepositoryMock.fetchIdentity).to.be.calledOnceWith(call.request); - - const proof = result.getV0().getProof(); - expect(proof).to.be.undefined(); - }); - - it('should return proof', async () => { - request.getProve.returns(true); - - driveStateRepositoryMock.fetchIdentity.resolves(proofResponse.serializeBinary()); - - const result = await getIdentityHandler(call); - - expect(result).to.be.an.instanceOf(GetIdentityResponse); - - const proof = result.getV0().getProof(); - - expect(proof).to.be.an.instanceOf(Proof); - const merkleProof = proof.getGrovedbProof(); - - expect(merkleProof).to.deep.equal(proofFixture.merkleProof); - - expect(driveStateRepositoryMock.fetchIdentity).to.be.calledOnceWith(call.request); - }); - - it('should throw an InvalidArgumentGrpcError if id is not specified', async () => { - request.getId.returns(null); - - try { - await getIdentityHandler(call); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidArgumentGrpcError); - expect(e.getMessage()).to.equal('id is not specified'); - expect(driveStateRepositoryMock.fetchIdentity).to.not.be.called(); - } - }); - - it('should throw an error when fetchIdentity throws unknown error', async () => { - const error = new Error('Unknown error'); - - driveStateRepositoryMock.fetchIdentity.throws(error); - - try { - await getIdentityHandler(call); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.equal(error); - expect(driveStateRepositoryMock.fetchIdentity).to.be.calledOnceWith(call.request); - } - }); -}); diff --git a/packages/dapi/test/unit/grpcServer/handlers/platform/getIdentityKeysHandlerFactory.spec.js b/packages/dapi/test/unit/grpcServer/handlers/platform/getIdentityKeysHandlerFactory.spec.js deleted file mode 100644 index 38a0cb37b8..0000000000 --- a/packages/dapi/test/unit/grpcServer/handlers/platform/getIdentityKeysHandlerFactory.spec.js +++ /dev/null @@ -1,135 +0,0 @@ -const { - server: { - error: { - InvalidArgumentGrpcError, - }, - }, -} = require('@dashevo/grpc-common'); - -const { - v0: { - GetIdentityKeysResponse, - Proof, - }, -} = require('@dashevo/dapi-grpc'); - -const { - GetIdentityKeysResponseV0, -} = GetIdentityKeysResponse; - -const { - Keys, -} = GetIdentityKeysResponseV0; - -/* eslint-disable import/no-extraneous-dependencies */ -const generateRandomIdentifierAsync = require('@dashevo/wasm-dpp/lib/test/utils/generateRandomIdentifierAsync'); - -const GrpcCallMock = require('../../../../../lib/test/mock/GrpcCallMock'); - -const getIdentityKeysHandlerFactory = require('../../../../../lib/grpcServer/handlers/platform/getIdentityKeysHandlerFactory'); - -describe('getIdentityKeysHandlerFactory', () => { - let call; - let getIdentityKeysHandler; - let fetchIdentityKeysMock; - let request; - let id; - - beforeEach(async function beforeEach() { - id = await generateRandomIdentifierAsync(); - request = { - getIdentityId: this.sinon.stub().returns(id), - getProve: this.sinon.stub().returns(true), - }; - - call = new GrpcCallMock(this.sinon, { - getV0: () => request, - }); - - fetchIdentityKeysMock = this.sinon.stub(); - - getIdentityKeysHandler = getIdentityKeysHandlerFactory({ - fetchIdentityKeys: fetchIdentityKeysMock, - }); - }); - - it('should return identity keys', async () => { - const keysBytesList = [ - Buffer.from('key1'), - ]; - - const keys = new Keys(); - keys.setKeysBytesList(keysBytesList); - - const response = new GetIdentityKeysResponse() - .setV0(new GetIdentityKeysResponseV0().setKeys(keys)); - - fetchIdentityKeysMock.resolves(response.serializeBinary()); - - const result = await getIdentityKeysHandler(call); - - expect(result).to.be.an.instanceOf(GetIdentityKeysResponse); - - const keysBytes = result.getV0().getKeys().getKeysBytesList(); - - expect(keysBytes).to.deep.equal(keysBytesList); - - expect(fetchIdentityKeysMock).to.be.calledOnceWith(call.request); - }); - - it('should return proof', async () => { - const proofFixture = { - merkleProof: Buffer.alloc(1, 1), - }; - - const proofMock = new Proof(); - proofMock.setGrovedbProof(proofFixture.merkleProof); - - const response = new GetIdentityKeysResponse() - .setV0(new GetIdentityKeysResponseV0().setProof(proofMock)); - - fetchIdentityKeysMock.resolves(response.serializeBinary()); - - const result = await getIdentityKeysHandler(call); - - expect(result).to.be.an.instanceOf(GetIdentityKeysResponse); - - const proof = result.getV0().getProof(); - - expect(proof).to.be.an.instanceOf(Proof); - const merkleProof = proof.getGrovedbProof(); - - expect(merkleProof).to.deep.equal(proofFixture.merkleProof); - - expect(fetchIdentityKeysMock).to.be.calledOnceWith(call.request); - }); - - it('should throw InvalidArgumentGrpcError error if ids are not specified', async () => { - request.getIdentityId.returns(null); - - try { - await getIdentityKeysHandler(call); - - expect.fail('should thrown InvalidArgumentGrpcError error'); - } catch (e) { - expect(e).to.be.instanceOf(InvalidArgumentGrpcError); - expect(e.getMessage()).to.equal('identity id is not specified'); - expect(fetchIdentityKeysMock).to.be.not.called(); - } - }); - - it('should throw error if driveStateRepository throws an error', async () => { - const message = 'Some error'; - const abciResponseError = new Error(message); - - fetchIdentityKeysMock.throws(abciResponseError); - - try { - await getIdentityKeysHandler(call); - - expect.fail('should throw error'); - } catch (e) { - expect(e).to.equal(abciResponseError); - } - }); -}); diff --git a/packages/dapi/test/unit/grpcServer/handlers/platform/getProofsHandlerFactory.spec.js b/packages/dapi/test/unit/grpcServer/handlers/platform/getProofsHandlerFactory.spec.js deleted file mode 100644 index f701b3e5ef..0000000000 --- a/packages/dapi/test/unit/grpcServer/handlers/platform/getProofsHandlerFactory.spec.js +++ /dev/null @@ -1,78 +0,0 @@ -const { - v0: { - GetProofsResponse, - Proof, - }, -} = require('@dashevo/dapi-grpc'); - -const GrpcCallMock = require('../../../../../lib/test/mock/GrpcCallMock'); - -const getProofsHandlerFactory = require('../../../../../lib/grpcServer/handlers/platform/getProofsHandlerFactory'); - -const { - GetProofsResponseV0, -} = GetProofsResponse; - -describe('getProofsHandlerFactory', () => { - let call; - let getProofsHandler; - let driveClientMock; - let request; - let proofFixture; - let proofMock; - let response; - - beforeEach(async function beforeEach() { - request = { - getProve: this.sinon.stub().returns(true), - }; - - call = new GrpcCallMock(this.sinon, request); - - proofFixture = { - merkleProof: Buffer.alloc(1, 1), - }; - - proofMock = new Proof(); - proofMock.setGrovedbProof(proofFixture.merkleProof); - - response = new GetProofsResponse() - .setV0(new GetProofsResponseV0().setProof(proofMock)); - - driveClientMock = { - fetchProofs: this.sinon.stub().resolves(response.serializeBinary()), - }; - - getProofsHandler = getProofsHandlerFactory(driveClientMock); - }); - - it('should return proof', async () => { - const result = await getProofsHandler(call); - - expect(result).to.be.an.instanceOf(GetProofsResponse); - - const proof = result.getV0().getProof(); - - expect(proof).to.be.an.instanceOf(Proof); - const merkleProof = proof.getGrovedbProof(); - - expect(merkleProof).to.deep.equal(proofFixture.merkleProof); - - expect(driveClientMock.fetchProofs).to.be.calledOnceWith(call.request); - }); - - it('should throw error if driveStateRepository throws an error', async () => { - const message = 'Some error'; - const abciResponseError = new Error(message); - - driveClientMock.fetchProofs.throws(abciResponseError); - - try { - await getProofsHandler(call); - - expect.fail('should throw error'); - } catch (e) { - expect(e).to.equal(abciResponseError); - } - }); -}); diff --git a/packages/dapi/test/unit/grpcServer/handlers/platform/getProtocolVersionUpgradeStateHandlerFactory.spec.js b/packages/dapi/test/unit/grpcServer/handlers/platform/getProtocolVersionUpgradeStateHandlerFactory.spec.js deleted file mode 100644 index 4b545dbd7d..0000000000 --- a/packages/dapi/test/unit/grpcServer/handlers/platform/getProtocolVersionUpgradeStateHandlerFactory.spec.js +++ /dev/null @@ -1,116 +0,0 @@ -const { - v0: { - GetProtocolVersionUpgradeStateResponse, - Proof, - }, -} = require('@dashevo/dapi-grpc'); - -const getProtocolVersionUpgradeStateHandlerFactory = require('../../../../../lib/grpcServer/handlers/platform/getProtocolVersionUpgradeStateHandlerFactory'); - -const GrpcCallMock = require('../../../../../lib/test/mock/GrpcCallMock'); - -describe('getProtocolVersionUpgradeStateHandlerFactory', () => { - let call; - let driveStateRepositoryMock; - let getProtocolVersionUpgradeStateHandler; - let versionNumber; - let voteCount; - let proofFixture; - let proofMock; - let request; - let response; - let proofResponse; - - beforeEach(async function beforeEach() { - request = { - getProve: this.sinon.stub().returns(false), - }; - call = new GrpcCallMock(this.sinon, { - getV0: () => request, - }); - - proofFixture = { - merkleProof: Buffer.alloc(1, 1), - }; - - proofMock = new Proof(); - proofMock.setGrovedbProof(proofFixture.merkleProof); - - versionNumber = 1; - voteCount = 1; - const { GetProtocolVersionUpgradeStateResponseV0 } = GetProtocolVersionUpgradeStateResponse; - const { Versions, VersionEntry } = GetProtocolVersionUpgradeStateResponseV0; - response = new GetProtocolVersionUpgradeStateResponse(); - response.setV0( - new GetProtocolVersionUpgradeStateResponseV0() - .setVersions(new Versions() - .setVersionsList([new VersionEntry() - .setVersionNumber(versionNumber) - .setVoteCount(voteCount)])), - ); - - proofResponse = new GetProtocolVersionUpgradeStateResponse(); - proofResponse.setV0( - new GetProtocolVersionUpgradeStateResponseV0() - .setProof(proofMock), - ); - - driveStateRepositoryMock = { - fetchVersionUpgradeState: this.sinon.stub().resolves(response.serializeBinary()), - }; - - getProtocolVersionUpgradeStateHandler = getProtocolVersionUpgradeStateHandlerFactory( - driveStateRepositoryMock, - ); - }); - - it('should return valid result', async () => { - const result = await getProtocolVersionUpgradeStateHandler(call); - - expect(result).to.be.an.instanceOf(GetProtocolVersionUpgradeStateResponse); - expect(result.getV0() - .getVersions().getVersionsList()[0].getVersionNumber()).to.deep.equal(versionNumber); - expect(driveStateRepositoryMock.fetchVersionUpgradeState) - .to.be.calledOnceWith(call.request); - - const proof = result.getV0().getProof(); - expect(proof).to.be.undefined(); - }); - - it('should return proof', async () => { - request.getProve.returns(true); - - driveStateRepositoryMock.fetchVersionUpgradeState - .resolves(proofResponse.serializeBinary()); - - const result = await getProtocolVersionUpgradeStateHandler(call); - - expect(result).to.be.an.instanceOf(GetProtocolVersionUpgradeStateResponse); - - const proof = result.getV0().getProof(); - - expect(proof).to.be.an.instanceOf(Proof); - const merkleProof = proof.getGrovedbProof(); - - expect(merkleProof).to.deep.equal(proofFixture.merkleProof); - - expect(driveStateRepositoryMock.fetchVersionUpgradeState) - .to.be.calledOnceWith(call.request); - }); - - it('should throw an error when fetchVersionUpgradeState throws unknown error', async () => { - const error = new Error('Unknown error'); - - driveStateRepositoryMock.fetchVersionUpgradeState.throws(error); - - try { - await getProtocolVersionUpgradeStateHandler(call); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.equal(error); - expect(driveStateRepositoryMock.fetchVersionUpgradeState) - .to.be.calledOnceWith(call.request); - } - }); -}); diff --git a/packages/dapi/test/unit/grpcServer/handlers/platform/getProtocolVersionUpgradeVoteStatusHandlerFactory.spec.js b/packages/dapi/test/unit/grpcServer/handlers/platform/getProtocolVersionUpgradeVoteStatusHandlerFactory.spec.js deleted file mode 100644 index 2a0e09da6d..0000000000 --- a/packages/dapi/test/unit/grpcServer/handlers/platform/getProtocolVersionUpgradeVoteStatusHandlerFactory.spec.js +++ /dev/null @@ -1,118 +0,0 @@ -const { - v0: { - GetProtocolVersionUpgradeVoteStatusResponse, - Proof, - }, -} = require('@dashevo/dapi-grpc'); - -const getProtocolVersionUpgradeVoteStatusHandlerFactory = require('../../../../../lib/grpcServer/handlers/platform/getProtocolVersionUpgradeVoteStatusHandlerFactory'); - -const GrpcCallMock = require('../../../../../lib/test/mock/GrpcCallMock'); - -describe('getProtocolVersionUpgradeVoteStatusHandlerFactory', () => { - let call; - let driveStateRepositoryMock; - let getProtocolVersionUpgradeVoteStatusHandler; - let proTxHash; - let version; - let proofFixture; - let proofMock; - let request; - let response; - let proofResponse; - - beforeEach(async function beforeEach() { - request = { - getProve: this.sinon.stub().returns(false), - }; - call = new GrpcCallMock(this.sinon, { - getV0: () => request, - }); - - proofFixture = { - merkleProof: Buffer.alloc(1, 1), - }; - - proofMock = new Proof(); - proofMock.setGrovedbProof(proofFixture.merkleProof); - - version = 1; - proTxHash = Buffer.alloc(32).fill(1); - const { - GetProtocolVersionUpgradeVoteStatusResponseV0, - } = GetProtocolVersionUpgradeVoteStatusResponse; - const { VersionSignals, VersionSignal } = GetProtocolVersionUpgradeVoteStatusResponseV0; - response = new GetProtocolVersionUpgradeVoteStatusResponse(); - response.setV0( - new GetProtocolVersionUpgradeVoteStatusResponseV0() - .setVersions(new VersionSignals() - .setVersionSignalsList([new VersionSignal() - .setProTxHash(proTxHash) - .setVersion(version)])), - ); - - proofResponse = new GetProtocolVersionUpgradeVoteStatusResponse(); - proofResponse.setV0( - new GetProtocolVersionUpgradeVoteStatusResponseV0() - .setProof(proofMock), - ); - - driveStateRepositoryMock = { - fetchVersionUpgradeVoteStatus: this.sinon.stub().resolves(response.serializeBinary()), - }; - - getProtocolVersionUpgradeVoteStatusHandler = getProtocolVersionUpgradeVoteStatusHandlerFactory( - driveStateRepositoryMock, - ); - }); - - it('should return valid result', async () => { - const result = await getProtocolVersionUpgradeVoteStatusHandler(call); - - expect(result).to.be.an.instanceOf(GetProtocolVersionUpgradeVoteStatusResponse); - expect(result.getV0() - .getVersions().getVersionSignalsList()[0].getProTxHash()).to.deep.equal(proTxHash); - expect(driveStateRepositoryMock.fetchVersionUpgradeVoteStatus) - .to.be.calledOnceWith(call.request); - - const proof = result.getV0().getProof(); - expect(proof).to.be.undefined(); - }); - - it('should return proof', async () => { - request.getProve.returns(true); - - driveStateRepositoryMock.fetchVersionUpgradeVoteStatus - .resolves(proofResponse.serializeBinary()); - - const result = await getProtocolVersionUpgradeVoteStatusHandler(call); - - expect(result).to.be.an.instanceOf(GetProtocolVersionUpgradeVoteStatusResponse); - - const proof = result.getV0().getProof(); - - expect(proof).to.be.an.instanceOf(Proof); - const merkleProof = proof.getGrovedbProof(); - - expect(merkleProof).to.deep.equal(proofFixture.merkleProof); - - expect(driveStateRepositoryMock.fetchVersionUpgradeVoteStatus) - .to.be.calledOnceWith(call.request); - }); - - it('should throw an error when fetchVersionUpgradeVoteStatus throws unknown error', async () => { - const error = new Error('Unknown error'); - - driveStateRepositoryMock.fetchVersionUpgradeVoteStatus.throws(error); - - try { - await getProtocolVersionUpgradeVoteStatusHandler(call); - - expect.fail('should throw an error'); - } catch (e) { - expect(e).to.equal(error); - expect(driveStateRepositoryMock.fetchVersionUpgradeVoteStatus) - .to.be.calledOnceWith(call.request); - } - }); -}); diff --git a/packages/dashmate/configs/defaults/getBaseConfigFactory.js b/packages/dashmate/configs/defaults/getBaseConfigFactory.js index 5334ca58c9..b64a49ada2 100644 --- a/packages/dashmate/configs/defaults/getBaseConfigFactory.js +++ b/packages/dashmate/configs/defaults/getBaseConfigFactory.js @@ -6,7 +6,8 @@ import DashPayContract from '@dashevo/dashpay-contract/lib/systemIds.js'; import FeatureFlagsContract from '@dashevo/feature-flags-contract/lib/systemIds.js'; -import MasternodeRewardSharesContract from '@dashevo/masternode-reward-shares-contract/lib/systemIds.js'; +import MasternodeRewardSharesContract + from '@dashevo/masternode-reward-shares-contract/lib/systemIds.js'; import WithdrawalsContract from '@dashevo/withdrawals-contract/lib/systemIds.js'; @@ -18,11 +19,17 @@ import { } from '../../src/constants.js'; import Config from '../../src/config/Config.js'; -const { contractId: dpnsContractId, ownerId: dpnsOwnerId } = DPNSContract; +const { + contractId: dpnsContractId, + ownerId: dpnsOwnerId, +} = DPNSContract; const { contractId: dashpayContractId } = DashPayContract; -const { contractId: featureFlagsContractId, ownerId: featureFlagsOwnerId } = FeatureFlagsContract; +const { + contractId: featureFlagsContractId, + ownerId: featureFlagsOwnerId, +} = FeatureFlagsContract; const { contractId: masternodeRewardSharesContractId } = MasternodeRewardSharesContract; const { contractId: withdrawalsContractId } = WithdrawalsContract; @@ -72,7 +79,8 @@ export default function getBaseConfigFactory(homeDir) { port: 3001, }, docker: { - image: 'dashpay/dashd:20', commandArgs: [], + image: 'dashpay/dashd:20', + commandArgs: [], }, p2p: { host: '0.0.0.0', @@ -87,7 +95,8 @@ export default function getBaseConfigFactory(homeDir) { allowIps: ['127.0.0.1', '172.16.0.0/12', '192.168.0.0/16'], }, spork: { - address: null, privateKey: null, + address: null, + privateKey: null, }, masternode: { enable: true, @@ -96,14 +105,20 @@ export default function getBaseConfigFactory(homeDir) { }, }, miner: { - enable: false, interval: '2.5m', mediantime: null, address: null, + enable: false, + interval: '2.5m', + mediantime: null, + address: null, }, devnet: { - name: null, minimumDifficultyBlocks: 0, powTargetSpacing: 150, + name: null, + minimumDifficultyBlocks: 0, + powTargetSpacing: 150, }, log: { file: { - categories: [], path: homeDir.joinPath('logs', 'base', 'core.log'), + categories: [], + path: homeDir.joinPath('logs', 'base', 'core.log'), }, }, logIps: 0, @@ -122,14 +137,18 @@ export default function getBaseConfigFactory(homeDir) { responseTimeout: '15s', }, rateLimiter: { - maxTokens: 300, tokensPerFill: 150, fillInterval: '60s', enabled: true, + maxTokens: 300, + tokensPerFill: 150, + fillInterval: '60s', + enabled: true, }, ssl: { enabled: false, provider: 'zerossl', providerConfigs: { zerossl: { - apiKey: null, id: null, + apiKey: null, + id: null, }, }, }, @@ -162,9 +181,18 @@ export default function getBaseConfigFactory(homeDir) { }, logs: { stdout: { - destination: 'stdout', level: 'info', format: 'compact', color: true, + destination: 'stdout', + level: 'info', + format: 'compact', + color: true, }, }, + tokioConsole: { + enabled: false, + host: '127.0.0.1', + port: 6669, + retention_secs: 60 * 3, + }, validatorSet: { llmqType: 4, }, @@ -178,7 +206,7 @@ export default function getBaseConfigFactory(homeDir) { tenderdash: { mode: 'full', docker: { - image: 'dashpay/tenderdash:0.14.0-dev.2', + image: 'dashpay/tenderdash:experimental', }, p2p: { host: '0.0.0.0', @@ -196,7 +224,8 @@ export default function getBaseConfigFactory(homeDir) { maxOpenConnections: 900, }, pprof: { - enabled: false, port: 6060, + enabled: false, + port: 6060, }, metrics: { enabled: false, @@ -231,15 +260,20 @@ export default function getBaseConfigFactory(homeDir) { }, }, log: { - level: 'info', format: 'plain', path: null, + level: 'info', + format: 'plain', + path: null, }, node: { - id: null, key: null, + id: null, + key: null, }, genesis: { consensus_params: { block: { - max_bytes: '2097152', max_gas: '57631392000', time_iota_ms: '5000', + max_bytes: '2097152', + max_gas: '57631392000', + time_iota_ms: '5000', }, evidence: { max_age: '100000', @@ -323,7 +357,8 @@ export default function getBaseConfigFactory(homeDir) { }, }, api: { - enable: false, port: 9100, + enable: false, + port: 9100, }, }, }, diff --git a/packages/dashmate/configs/getConfigFileMigrationsFactory.js b/packages/dashmate/configs/getConfigFileMigrationsFactory.js index 937700acfe..70293add03 100644 --- a/packages/dashmate/configs/getConfigFileMigrationsFactory.js +++ b/packages/dashmate/configs/getConfigFileMigrationsFactory.js @@ -186,7 +186,8 @@ export default function getConfigFileMigrationsFactory(homeDir, defaultConfigs) } if (defaultConfigs.has(name) && !options.platform.drive.tenderdash.metrics) { - options.platform.drive.tenderdash.metrics = defaultConfigs.get(name).get('platform.drive.tenderdash.metrics'); + options.platform.drive.tenderdash.metrics = defaultConfigs.get(name) + .get('platform.drive.tenderdash.metrics'); } }); return configFile; @@ -426,7 +427,8 @@ export default function getConfigFileMigrationsFactory(homeDir, defaultConfigs) Object.entries(configFile.configs) .forEach(([name, options]) => { if (defaultConfigs.has(name)) { - options.platform.drive.tenderdash.genesis = defaultConfigs.get(name).get('platform.drive.tenderdash.genesis'); + options.platform.drive.tenderdash.genesis = defaultConfigs.get(name) + .get('platform.drive.tenderdash.genesis'); } options.platform.dapi.api.docker.deploy = base.get('platform.dapi.api.docker.deploy'); @@ -437,7 +439,8 @@ export default function getConfigFileMigrationsFactory(homeDir, defaultConfigs) baseConfigName = 'testnet'; } - options.platform.drive.abci.chainLock = defaultConfigs.get(baseConfigName).get('platform.drive.abci.chainLock'); + options.platform.drive.abci.chainLock = defaultConfigs.get(baseConfigName) + .get('platform.drive.abci.chainLock'); }); return configFile; @@ -461,6 +464,17 @@ export default function getConfigFileMigrationsFactory(homeDir, defaultConfigs) return configFile; }, + '1.0.0-dev.6': (configFile) => { + Object.entries(configFile.configs) + .forEach(([name, options]) => { + options.platform.drive.abci.tokioConsole = base.get('platform.drive.abci.tokioConsole'); + + const defaultConfig = getDefaultConfigByNameOrGroup(name, options.group); + options.platform.drive.tenderdash.docker.image = defaultConfig.get('platform.drive.tenderdash.docker.image'); + }); + + return configFile; + }, }; } diff --git a/packages/dashmate/docker-compose.yml b/packages/dashmate/docker-compose.yml index d5edfc86ff..95dc1a46f4 100644 --- a/packages/dashmate/docker-compose.yml +++ b/packages/dashmate/docker-compose.yml @@ -12,6 +12,8 @@ services: ports: - 127.0.0.1:${DASHMATE_HELPER_API_PORT:?err}:${DASHMATE_HELPER_API_PORT:?err} command: yarn workspace dashmate helper ${CONFIG_NAME:?err} + expose: + - ${DASHMATE_HELPER_API_PORT:?err} volumes: - ${DASHMATE_HOME_DIR:?err}:/home/dashmate/.dashmate - /var/run/docker.sock:/var/run/docker.sock @@ -67,12 +69,26 @@ services: - CHAIN_LOCK_QUORUM_TYPE=${PLATFORM_DRIVE_ABCI_CHAIN_LOCK_LLMQ_TYPE:?err} - CHAIN_LOCK_QUORUM_WINDOW=${PLATFORM_DRIVE_ABCI_CHAIN_LOCK_DKG_INTERVAL:?err} - CHAIN_LOCK_QUORUM_SIZE=${PLATFORM_DRIVE_ABCI_CHAIN_LOCK_LLMQ_SIZE:?err} + - DB_PATH=/var/lib/dash/rs-drive-abci/db + - ABCI_CONSENSUS_BIND_ADDRESS=tcp://0.0.0.0:26658 + - GRPC_BIND_ADDRESS=0.0.0.0:26670 + - PROMETHEUS_BIND_ADDRESS=http://0.0.0.0:29090 + - TOKIO_CONSOLE_ENABLED=${PLATFORM_DRIVE_ABCI_TOKIO_CONSOLE_ENABLED:?err} + - TOKIO_CONSOLE_ADDRESS=0.0.0.0:${PLATFORM_DRIVE_ABCI_TOKIO_CONSOLE_PORT:?err} + - TOKIO_CONSOLE_RETENTION_SECS=${PLATFORM_DRIVE_ABCI_TOKIO_CONSOLE_RETENTION_SECS:?err} stop_grace_period: 30s + expose: + - 26658 + - 26659 + - 26670 + - 29090 env_file: # Logger settings - ${DASHMATE_HOME_DIR:?err}/${CONFIG_NAME:?err}/platform/drive/abci/logger.env profiles: - platform + ports: + - ${PLATFORM_DRIVE_ABCI_TOKIO_CONSOLE_HOST:?err}:${PLATFORM_DRIVE_ABCI_TOKIO_CONSOLE_PORT:?err}:${PLATFORM_DRIVE_ABCI_TOKIO_CONSOLE_PORT:?err} drive_tenderdash: image: ${PLATFORM_DRIVE_TENDERDASH_DOCKER_IMAGE:?err} @@ -120,6 +136,8 @@ services: - TENDERMINT_RPC_HOST=drive_tenderdash - TENDERMINT_RPC_PORT=${PLATFORM_DRIVE_TENDERDASH_RPC_PORT:?err} - NODE_ENV=${ENVIRONMENT:?err} + - DRIVE_RPC_HOST=drive_abci + - DRIVE_RPC_PORT=26670 command: yarn run api stop_grace_period: 10s profiles: @@ -150,6 +168,8 @@ services: - NETWORK=devnet - TENDERMINT_RPC_HOST=drive_tenderdash - TENDERMINT_RPC_PORT=26657 + - DRIVE_RPC_HOST=drive_abci + - DRIVE_RPC_PORT=26670 command: yarn run core-streams stop_grace_period: 10s profiles: diff --git a/packages/dashmate/src/config/configJsonSchema.js b/packages/dashmate/src/config/configJsonSchema.js index ad738b51f2..4dd6df78f4 100644 --- a/packages/dashmate/src/config/configJsonSchema.js +++ b/packages/dashmate/src/config/configJsonSchema.js @@ -513,6 +513,28 @@ export default { additionalProperties: false, }, }, + tokioConsole: { + type: 'object', + properties: { + enabled: { + type: 'boolean', + }, + host: { + type: 'string', + minLength: 1, + format: 'ipv4', + }, + port: { + $ref: '#/definitions/port', + }, + retention_secs: { + type: 'integer', + minimum: 0, + }, + }, + required: ['enabled', 'host', 'port', 'retention_secs'], + additionalProperties: false, + }, validatorSet: { type: 'object', properties: { @@ -551,7 +573,7 @@ export default { }, }, additionalProperties: false, - required: ['docker', 'logs', 'validatorSet', 'chainLock', 'epochTime'], + required: ['docker', 'logs', 'tokioConsole', 'validatorSet', 'chainLock', 'epochTime'], }, tenderdash: { type: 'object', diff --git a/packages/dashmate/src/listr/tasks/setup/setupLocalPresetTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/setupLocalPresetTaskFactory.js index 0c0efc53e6..70a8cd7f96 100644 --- a/packages/dashmate/src/listr/tasks/setup/setupLocalPresetTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/setupLocalPresetTaskFactory.js @@ -77,7 +77,8 @@ export default function setupLocalPresetTaskFactory( ctx.minerInterval = await task.prompt({ type: 'input', message: 'Enter the interval between core blocks', - initial: configFile.getConfig('base').get('core.miner.interval'), + initial: configFile.getConfig('base') + .get('core.miner.interval'), validate: (state) => { if (state.match(/\d+(\.\d+)?([ms])/)) { return true; @@ -178,7 +179,8 @@ export default function setupLocalPresetTaskFactory( config.set('core.rpc.password', generateRandomString(12)); config.set('externalIp', hostDockerInternalIp); - const subnet = config.get('docker.network.subnet').split('.'); + const subnet = config.get('docker.network.subnet') + .split('.'); subnet[2] = nodeIndex; config.set('docker.network.subnet', subnet.join('.')); @@ -212,12 +214,15 @@ export default function setupLocalPresetTaskFactory( } else { config.set('description', `local node #${nodeIndex}`); + config.set('platform.drive.tenderdash.mode', 'validator'); + const key = generateTenderdashNodeKey(); const id = deriveTenderdashNodeId(key); config.set('platform.drive.tenderdash.node.id', id); config.set('platform.drive.tenderdash.node.key', key); + config.set('platform.drive.abci.tokioConsole.port', config.get('platform.drive.abci.tokioConsole.port') + (i * 100)); config.set('platform.dapi.envoy.http.port', config.get('platform.dapi.envoy.http.port') + (i * 100)); config.set('platform.drive.tenderdash.p2p.port', config.get('platform.drive.tenderdash.p2p.port') + (i * 100)); config.set('platform.drive.tenderdash.rpc.port', config.get('platform.drive.tenderdash.rpc.port') + (i * 100)); @@ -225,8 +230,6 @@ export default function setupLocalPresetTaskFactory( config.set('platform.drive.tenderdash.metrics.port', config.get('platform.drive.tenderdash.metrics.port') + (i * 100)); config.set('platform.drive.tenderdash.moniker', config.name); - config.set('platform.drive.tenderdash.mode', 'validator'); - // Setup logs if (ctx.debugLogs) { const stdoutLogger = config.get('platform.drive.abci.logs.stdout'); @@ -239,26 +242,37 @@ export default function setupLocalPresetTaskFactory( config.set('platform.drive.tenderdash.log.level', 'debug'); } - config.set('platform.dpns.masterPublicKey', dpnsDerivedMasterPrivateKey.privateKey.toPublicKey().toString()); - config.set('platform.dpns.secondPublicKey', dpnsDerivedSecondPrivateKey.privateKey.toPublicKey().toString()); + config.set('platform.dpns.masterPublicKey', dpnsDerivedMasterPrivateKey.privateKey.toPublicKey() + .toString()); + config.set('platform.dpns.secondPublicKey', dpnsDerivedSecondPrivateKey.privateKey.toPublicKey() + .toString()); - config.set('platform.featureFlags.masterPublicKey', featureFlagsDerivedMasterPrivateKey.privateKey.toPublicKey().toString()); - config.set('platform.featureFlags.secondPublicKey', featureFlagsDerivedSecondPrivateKey.privateKey.toPublicKey().toString()); + config.set('platform.featureFlags.masterPublicKey', featureFlagsDerivedMasterPrivateKey.privateKey.toPublicKey() + .toString()); + config.set('platform.featureFlags.secondPublicKey', featureFlagsDerivedSecondPrivateKey.privateKey.toPublicKey() + .toString()); - config.set('platform.dashpay.masterPublicKey', dashpayDerivedMasterPrivateKey.privateKey.toPublicKey().toString()); - config.set('platform.dashpay.secondPublicKey', dashpayDerivedSecondPrivateKey.privateKey.toPublicKey().toString()); + config.set('platform.dashpay.masterPublicKey', dashpayDerivedMasterPrivateKey.privateKey.toPublicKey() + .toString()); + config.set('platform.dashpay.secondPublicKey', dashpayDerivedSecondPrivateKey.privateKey.toPublicKey() + .toString()); - config.set('platform.withdrawals.masterPublicKey', withdrawalsDerivedMasterPrivateKey.privateKey.toPublicKey().toString()); - config.set('platform.withdrawals.secondPublicKey', withdrawalsDerivedSecondPrivateKey.privateKey.toPublicKey().toString()); + config.set('platform.withdrawals.masterPublicKey', withdrawalsDerivedMasterPrivateKey.privateKey.toPublicKey() + .toString()); + config.set('platform.withdrawals.secondPublicKey', withdrawalsDerivedSecondPrivateKey.privateKey.toPublicKey() + .toString()); config.set( 'platform.masternodeRewardShares.masterPublicKey', masternodeRewardSharesDerivedMasterPrivateKey.privateKey - .toPublicKey().toString(), - ); config.set( + .toPublicKey() + .toString(), + ); + config.set( 'platform.masternodeRewardShares.secondPublicKey', masternodeRewardSharesDerivedSecondPrivateKey.privateKey - .toPublicKey().toString(), + .toPublicKey() + .toString(), ); } }, @@ -290,8 +304,7 @@ export default function setupLocalPresetTaskFactory( const subTasks = platformConfigs.map((config) => ({ title: `Generate certificate for ${config.getName()}`, task: async () => obtainSelfSignedCertificateTask(config), - } - )); + })); return new Listr(subTasks); }, diff --git a/packages/dashmate/templates/platform/dapi/envoy/envoy.yaml.dot b/packages/dashmate/templates/platform/dapi/envoy/envoy.yaml.dot index 494f1cc52a..dab78d565f 100644 --- a/packages/dashmate/templates/platform/dapi/envoy/envoy.yaml.dot +++ b/packages/dashmate/templates/platform/dapi/envoy/envoy.yaml.dot @@ -64,63 +64,50 @@ - name: dapi_services domains: [ "*" ] routes: - # tx subscription streaming endpoint configuration + # DAPI core streaming endpoints - match: - prefix: "/org.dash.platform.dapi.v0.Core/subscribeToTransactionsWithProofs" + prefix: "/org.dash.platform.dapi.v0.Core/subscribeTo" route: - cluster: tx_filter_stream + cluster: dapi_tx_filter_stream timeout: 660s max_stream_duration: grpc_timeout_header_max: 600s - # block headers subscription streaming endpoint + # Other DAPI Core endpoints - match: - prefix: "/org.dash.platform.dapi.v0.Core/subscribeToBlockHeadersWithChainLocks" + prefix: "/org.dash.platform.dapi.v0.Core" route: - cluster: tx_filter_stream - timeout: 660s - max_stream_duration: - grpc_timeout_header_max: 600s - # set timeout for waitForStateTransitionResult + cluster: dapi_api + timeout: {{= it.platform.dapi.envoy.http.responseTimeout }} + # DAPI waitForStateTransitionResult endpoint with bigger timeout - match: - prefix: "/org.dash.platform.dapi.v0.Platform/waitForStateTransitionResult" + path: "/org.dash.platform.dapi.v0.Platform/waitForStateTransitionResult" route: - cluster: core_and_platform + cluster: dapi_api timeout: 80s - # core unary endpoints + # DAPI getConsensusParams endpoint - match: - prefix: "/org.dash.platform.dapi.v0.Core" + path: "/org.dash.platform.dapi.v0.Platform/getConsensusParams" route: - cluster: core_and_platform + cluster: dapi_api timeout: {{= it.platform.dapi.envoy.http.responseTimeout }} - # platform unary endpoints + # DAPI broadcastStateTransition endpoint + - match: + path: "/org.dash.platform.dapi.v0.Platform/broadcastStateTransition" + route: + cluster: dapi_api + timeout: {{= it.platform.dapi.envoy.http.responseTimeout }} + # Drive gRPC endpoints - match: prefix: "/org.dash.platform.dapi.v0.Platform" route: - cluster: core_and_platform + cluster: drive_grpc timeout: {{= it.platform.dapi.envoy.http.responseTimeout }} - # configuration of the static responses of unsupported api versions + # Static responses of unsupported api versions # core static response - match: safe_regex: google_re2: { } - regex: "\/org\\.dash\\.platform\\.dapi\\.v[1-9]+\\.Core" - response_headers_to_add: - - header: - key: "Content-Type" - value: "application/grpc-web+proto" - - header: - key: "grpc-status" - value: "12" - - header: - key: "grpc-message" - value: "Specified service version is not supported" - direct_response: - status: 204 - # platform static response - - match: - safe_regex: - google_re2: { } - regex: "\/org\\.dash\\.platform\\.dapi\\.v[1-9]+\\.Platform" + regex: "\/org\\.dash\\.platform\\.dapi\\.v[1-9]+\\." response_headers_to_add: - header: key: "Content-Type" @@ -137,7 +124,7 @@ - match: path: "/" route: - cluster: json_rpc + cluster: dapi_json_rpc cors: allow_origin_string_match: - prefix: "*" @@ -192,7 +179,7 @@ static_resources: filename: "/etc/ssl/private.key" {{?}} clusters: - - name: core_and_platform + - name: dapi_api connect_timeout: {{= it.platform.dapi.envoy.http.connectTimeout }} type: logical_dns lb_policy: round_robin @@ -205,7 +192,7 @@ static_resources: interval: 30s timeout: 5s load_assignment: - cluster_name: core_and_platform + cluster_name: dapi_api endpoints: - lb_endpoints: - endpoint: @@ -213,7 +200,7 @@ static_resources: socket_address: address: dapi_api port_value: 3005 - - name: tx_filter_stream + - name: dapi_tx_filter_stream connect_timeout: {{= it.platform.dapi.envoy.http.connectTimeout }} type: logical_dns lb_policy: round_robin @@ -226,7 +213,7 @@ static_resources: interval: 30s timeout: 5s load_assignment: - cluster_name: tx_filter_stream + cluster_name: dapi_tx_filter_stream endpoints: - lb_endpoints: - endpoint: @@ -234,12 +221,12 @@ static_resources: socket_address: address: dapi_tx_filter_stream port_value: 3006 - - name: json_rpc + - name: dapi_json_rpc connect_timeout: {{= it.platform.dapi.envoy.http.connectTimeout }} type: logical_dns lb_policy: round_robin load_assignment: - cluster_name: json_rpc + cluster_name: dapi_json_rpc endpoints: - lb_endpoints: - endpoint: @@ -247,6 +234,27 @@ static_resources: socket_address: address: dapi_api port_value: 3004 + - name: drive_grpc + connect_timeout: {{= it.platform.dapi.envoy.http.connectTimeout }} + type: logical_dns + lb_policy: round_robin + typed_extension_protocol_options: + envoy.extensions.upstreams.http.v3.HttpProtocolOptions: + "@type": type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions + explicit_http_config: + http2_protocol_options: + connection_keepalive: + interval: 30s + timeout: 5s + load_assignment: + cluster_name: drive_grpc + endpoints: + - lb_endpoints: + - endpoint: + address: + socket_address: + address: drive_abci + port_value: 26670 admin: address: diff --git a/packages/dashmate/templates/platform/drive/tenderdash/config.toml.dot b/packages/dashmate/templates/platform/drive/tenderdash/config.toml.dot index 6d77704583..ecec5e9726 100644 --- a/packages/dashmate/templates/platform/drive/tenderdash/config.toml.dot +++ b/packages/dashmate/templates/platform/drive/tenderdash/config.toml.dot @@ -12,7 +12,8 @@ # TCP or UNIX socket address of the ABCI application, # or the name of an ABCI application compiled in with the Tendermint binary -proxy-app = "tcp://drive_abci:26658" +#proxy-app = "tcp://drive_abci:26658" +proxy-app = "CheckTx:grpc:drive_abci:26670,*:socket:tcp://drive_abci:26658" # A custom human readable name for this node {{?it.platform.drive.tenderdash.moniker}}moniker = "{{=it.platform.drive.tenderdash.moniker}}"{{?}} @@ -72,7 +73,7 @@ genesis-file = "config/genesis.json" node-key-file = "config/node_key.json" # Mechanism to connect to the ABCI application: socket | grpc -abci = "socket" +abci = "routed" # If true, query the ABCI app on connecting to a new peer # so the app can decide if we should keep the connection or not diff --git a/packages/dashpay-contract/.eslintrc b/packages/dashpay-contract/.eslintrc index e2c337296e..00e5bd1251 100644 --- a/packages/dashpay-contract/.eslintrc +++ b/packages/dashpay-contract/.eslintrc @@ -17,6 +17,7 @@ "mocha": true }, "globals": { - "expect": true + "expect": true, + "BigInt": true } } diff --git a/packages/dashpay-contract/Cargo.toml b/packages/dashpay-contract/Cargo.toml index 7a26323326..0488e059a8 100644 --- a/packages/dashpay-contract/Cargo.toml +++ b/packages/dashpay-contract/Cargo.toml @@ -3,7 +3,7 @@ name = "dashpay-contract" description = "DashPay data contract schema and tools" version = "1.0.0-dev.5" edition = "2021" -rust-version = "1.73" +rust-version = "1.76" license = "MIT" [dependencies] diff --git a/packages/dashpay-contract/test/unit/schema.spec.js b/packages/dashpay-contract/test/unit/schema.spec.js index 1d7523d296..ff6eaf14ec 100644 --- a/packages/dashpay-contract/test/unit/schema.spec.js +++ b/packages/dashpay-contract/test/unit/schema.spec.js @@ -1,6 +1,9 @@ const { expect } = require('chai'); const crypto = require('crypto'); -const { DashPlatformProtocol, JsonSchemaError } = require('@dashevo/wasm-dpp'); +const { + DashPlatformProtocol, + JsonSchemaError, +} = require('@dashevo/wasm-dpp'); const generateRandomIdentifier = require('@dashevo/wasm-dpp/lib/test/utils/generateRandomIdentifierAsync'); const schema = require('../../schema/v1/dashpay.schema.json'); @@ -10,10 +13,16 @@ const encoded64Chars = '4fafc98bbfe597f7ba2c9f767d52036d2226175960a908e355e5c575 const expectJsonSchemaError = (validationResult) => { const errors = validationResult.getErrors(); - expect(errors).to.have.length(1); + expect(errors) + .to + .have + .length(1); const error = validationResult.getErrors()[0]; - expect(error).to.be.instanceof(JsonSchemaError); + expect(error) + .to + .be + .instanceof(JsonSchemaError); return error; }; @@ -29,11 +38,14 @@ describe('Dashpay Contract', () => { ); identityId = await generateRandomIdentifier(); - contract = dpp.dataContract.create(identityId, schema); + contract = dpp.dataContract.create(identityId, BigInt(1), schema); }); it('should have a valid contract definition', async () => { - expect(() => dpp.dataContract.create(identityId, schema)).to.not.throw(); + expect(() => dpp.dataContract.create(identityId, BigInt(1), schema)) + .to + .not + .throw(); }); describe('Documents', () => { @@ -55,8 +67,13 @@ describe('Dashpay Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('maxLength'); - expect(error.instancePath).to.deep.equal('/displayName'); + expect(error.keyword) + .to + .equal('maxLength'); + expect(error.instancePath) + .to + .deep + .equal('/displayName'); }); }); @@ -68,8 +85,13 @@ describe('Dashpay Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('maxLength'); - expect(error.instancePath).to.deep.equal('/publicMessage'); + expect(error.keyword) + .to + .equal('maxLength'); + expect(error.instancePath) + .to + .deep + .equal('/publicMessage'); }); }); @@ -81,8 +103,13 @@ describe('Dashpay Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('format'); - expect(error.instancePath).to.deep.equal('/avatarUrl'); + expect(error.keyword) + .to + .equal('format'); + expect(error.instancePath) + .to + .deep + .equal('/avatarUrl'); }); it('should have less than 2048 chars length', async () => { @@ -92,8 +119,13 @@ describe('Dashpay Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('maxLength'); - expect(error.instancePath).to.deep.equal('/avatarUrl'); + expect(error.keyword) + .to + .equal('maxLength'); + expect(error.instancePath) + .to + .deep + .equal('/avatarUrl'); }); it('should be of type URL', async () => { @@ -103,8 +135,13 @@ describe('Dashpay Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('format'); - expect(error.instancePath).to.deep.equal('/avatarUrl'); + expect(error.keyword) + .to + .equal('format'); + expect(error.instancePath) + .to + .deep + .equal('/avatarUrl'); }); }); @@ -116,8 +153,13 @@ describe('Dashpay Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('minItems'); - expect(error.instancePath).to.deep.equal('/avatarHash'); + expect(error.keyword) + .to + .equal('minItems'); + expect(error.instancePath) + .to + .deep + .equal('/avatarHash'); }); it('should have maximum length of 32', async () => { @@ -127,8 +169,13 @@ describe('Dashpay Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('maxItems'); - expect(error.instancePath).to.deep.equal('/avatarHash'); + expect(error.keyword) + .to + .equal('maxItems'); + expect(error.instancePath) + .to + .deep + .equal('/avatarHash'); }); it('should be of type array', async () => { @@ -138,8 +185,13 @@ describe('Dashpay Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('type'); - expect(error.instancePath).to.deep.equal('/avatarHash'); + expect(error.keyword) + .to + .equal('type'); + expect(error.instancePath) + .to + .deep + .equal('/avatarHash'); }); }); @@ -151,8 +203,13 @@ describe('Dashpay Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('minItems'); - expect(error.instancePath).to.deep.equal('/avatarFingerprint'); + expect(error.keyword) + .to + .equal('minItems'); + expect(error.instancePath) + .to + .deep + .equal('/avatarFingerprint'); }); it('should have maximum length of 8', async () => { @@ -162,8 +219,13 @@ describe('Dashpay Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('maxItems'); - expect(error.instancePath).to.deep.equal('/avatarFingerprint'); + expect(error.keyword) + .to + .equal('maxItems'); + expect(error.instancePath) + .to + .deep + .equal('/avatarFingerprint'); }); it('should be of type array', async () => { @@ -173,8 +235,13 @@ describe('Dashpay Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('type'); - expect(error.instancePath).to.deep.equal('/avatarFingerprint'); + expect(error.keyword) + .to + .equal('type'); + expect(error.instancePath) + .to + .deep + .equal('/avatarFingerprint'); }); }); @@ -185,8 +252,13 @@ describe('Dashpay Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('additionalProperties'); - expect(error.params.additionalProperties).to.deep.equal(['someOtherProperty']); + expect(error.keyword) + .to + .equal('additionalProperties'); + expect(error.params.additionalProperties) + .to + .deep + .equal(['someOtherProperty']); }); it('should be valid', async () => { @@ -194,7 +266,10 @@ describe('Dashpay Contract', () => { const result = profile.validate(dpp.protocolVersion); - expect(result.isValid()).to.be.true(); + expect(result.isValid()) + .to + .be + .true(); }); }); @@ -218,8 +293,12 @@ describe('Dashpay Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('required'); - expect(error.params.missingProperty).to.equal('encToUserId'); + expect(error.keyword) + .to + .equal('required'); + expect(error.params.missingProperty) + .to + .equal('encToUserId'); }); it('should have exactly 32 chars length', async () => { @@ -229,8 +308,12 @@ describe('Dashpay Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('maxItems'); - expect(error.instancePath).to.equal('/encToUserId'); + expect(error.keyword) + .to + .equal('maxItems'); + expect(error.instancePath) + .to + .equal('/encToUserId'); }); it('should have more or 32 chars length', async () => { @@ -240,8 +323,12 @@ describe('Dashpay Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('minItems'); - expect(error.instancePath).to.equal('/encToUserId'); + expect(error.keyword) + .to + .equal('minItems'); + expect(error.instancePath) + .to + .equal('/encToUserId'); }); }); @@ -253,8 +340,12 @@ describe('Dashpay Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('required'); - expect(error.params.missingProperty).to.equal('rootEncryptionKeyIndex'); + expect(error.keyword) + .to + .equal('required'); + expect(error.params.missingProperty) + .to + .equal('rootEncryptionKeyIndex'); }); it('should not be less than 0', async () => { @@ -264,8 +355,12 @@ describe('Dashpay Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('minimum'); - expect(error.instancePath).to.equal('/rootEncryptionKeyIndex'); + expect(error.keyword) + .to + .equal('minimum'); + expect(error.instancePath) + .to + .equal('/rootEncryptionKeyIndex'); }); }); @@ -277,8 +372,12 @@ describe('Dashpay Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('required'); - expect(error.params.missingProperty).to.equal('privateData'); + expect(error.keyword) + .to + .equal('required'); + expect(error.params.missingProperty) + .to + .equal('privateData'); }); }); @@ -289,8 +388,13 @@ describe('Dashpay Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('additionalProperties'); - expect(error.params.additionalProperties).to.deep.equal(['someOtherProperty']); + expect(error.keyword) + .to + .equal('additionalProperties'); + expect(error.params.additionalProperties) + .to + .deep + .equal(['someOtherProperty']); }); }); @@ -315,8 +419,12 @@ describe('Dashpay Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('required'); - expect(error.params.missingProperty).to.equal('toUserId'); + expect(error.keyword) + .to + .equal('required'); + expect(error.params.missingProperty) + .to + .equal('toUserId'); }); }); @@ -328,8 +436,12 @@ describe('Dashpay Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('required'); - expect(error.params.missingProperty).to.equal('encryptedPublicKey'); + expect(error.keyword) + .to + .equal('required'); + expect(error.params.missingProperty) + .to + .equal('encryptedPublicKey'); }); }); @@ -341,8 +453,12 @@ describe('Dashpay Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('required'); - expect(error.params.missingProperty).to.equal('senderKeyIndex'); + expect(error.keyword) + .to + .equal('required'); + expect(error.params.missingProperty) + .to + .equal('senderKeyIndex'); }); it('should not be less than 0', async () => { @@ -352,8 +468,12 @@ describe('Dashpay Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('minimum'); - expect(error.instancePath).to.equal('/senderKeyIndex'); + expect(error.keyword) + .to + .equal('minimum'); + expect(error.instancePath) + .to + .equal('/senderKeyIndex'); }); }); @@ -365,8 +485,12 @@ describe('Dashpay Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('required'); - expect(error.params.missingProperty).to.equal('recipientKeyIndex'); + expect(error.keyword) + .to + .equal('required'); + expect(error.params.missingProperty) + .to + .equal('recipientKeyIndex'); }); it('should not be less than 0', async () => { @@ -376,8 +500,12 @@ describe('Dashpay Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('minimum'); - expect(error.instancePath).to.equal('/recipientKeyIndex'); + expect(error.keyword) + .to + .equal('minimum'); + expect(error.instancePath) + .to + .equal('/recipientKeyIndex'); }); }); @@ -389,8 +517,13 @@ describe('Dashpay Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('minItems'); - expect(error.instancePath).to.deep.equal('/encryptedAccountLabel'); + expect(error.keyword) + .to + .equal('minItems'); + expect(error.instancePath) + .to + .deep + .equal('/encryptedAccountLabel'); }); it('should have maximum length of 80', async () => { @@ -400,8 +533,13 @@ describe('Dashpay Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('maxItems'); - expect(error.instancePath).to.deep.equal('/encryptedAccountLabel'); + expect(error.keyword) + .to + .equal('maxItems'); + expect(error.instancePath) + .to + .deep + .equal('/encryptedAccountLabel'); }); it('should be of type array', async () => { @@ -411,8 +549,13 @@ describe('Dashpay Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('type'); - expect(error.instancePath).to.deep.equal('/encryptedAccountLabel'); + expect(error.keyword) + .to + .equal('type'); + expect(error.instancePath) + .to + .deep + .equal('/encryptedAccountLabel'); }); }); @@ -424,8 +567,13 @@ describe('Dashpay Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('minItems'); - expect(error.instancePath).to.deep.equal('/autoAcceptProof'); + expect(error.keyword) + .to + .equal('minItems'); + expect(error.instancePath) + .to + .deep + .equal('/autoAcceptProof'); }); it('should have maximum length of 102', async () => { @@ -435,8 +583,13 @@ describe('Dashpay Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('maxItems'); - expect(error.instancePath).to.deep.equal('/autoAcceptProof'); + expect(error.keyword) + .to + .equal('maxItems'); + expect(error.instancePath) + .to + .deep + .equal('/autoAcceptProof'); }); it('should be of type array', async () => { @@ -446,8 +599,13 @@ describe('Dashpay Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('type'); - expect(error.instancePath).to.deep.equal('/autoAcceptProof'); + expect(error.keyword) + .to + .equal('type'); + expect(error.instancePath) + .to + .deep + .equal('/autoAcceptProof'); }); }); @@ -459,8 +617,12 @@ describe('Dashpay Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('required'); - expect(error.params.missingProperty).to.equal('accountReference'); + expect(error.keyword) + .to + .equal('required'); + expect(error.params.missingProperty) + .to + .equal('accountReference'); }); it('should not be less than 0', async () => { @@ -470,8 +632,12 @@ describe('Dashpay Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('minimum'); - expect(error.instancePath).to.equal('/accountReference'); + expect(error.keyword) + .to + .equal('minimum'); + expect(error.instancePath) + .to + .equal('/accountReference'); }); }); @@ -483,8 +649,12 @@ describe('Dashpay Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('minimum'); - expect(error.instancePath).to.equal('/coreHeightCreatedAt'); + expect(error.keyword) + .to + .equal('minimum'); + expect(error.instancePath) + .to + .equal('/coreHeightCreatedAt'); }); }); @@ -495,8 +665,13 @@ describe('Dashpay Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('additionalProperties'); - expect(error.params.additionalProperties).to.deep.equal(['someOtherProperty']); + expect(error.keyword) + .to + .equal('additionalProperties'); + expect(error.params.additionalProperties) + .to + .deep + .equal(['someOtherProperty']); }); }); }); diff --git a/packages/data-contracts/Cargo.toml b/packages/data-contracts/Cargo.toml index c8ce7c4f14..580e18ceae 100644 --- a/packages/data-contracts/Cargo.toml +++ b/packages/data-contracts/Cargo.toml @@ -3,7 +3,7 @@ name = "data-contracts" description = "Dash Platform system data contracts" version = "1.0.0-dev.5" edition = "2021" -rust-version = "1.73" +rust-version = "1.76" license = "MIT" [dependencies] diff --git a/packages/dpns-contract/.eslintrc b/packages/dpns-contract/.eslintrc index eec7881491..cb6c7636b6 100644 --- a/packages/dpns-contract/.eslintrc +++ b/packages/dpns-contract/.eslintrc @@ -1,15 +1,18 @@ { - "extends": "airbnb-base", - "rules": { - "no-plusplus": 0, - "eol-last": [ - "error", - "always" - ], - "class-methods-use-this": "off", - "curly": [ - "error", - "all" - ] - } -} \ No newline at end of file + "extends": "airbnb-base", + "rules": { + "no-plusplus": 0, + "eol-last": [ + "error", + "always" + ], + "class-methods-use-this": "off", + "curly": [ + "error", + "all" + ] + }, + "globals": { + "BigInt": true + } +} diff --git a/packages/dpns-contract/Cargo.toml b/packages/dpns-contract/Cargo.toml index 6345a8f79d..c213c3fb1f 100644 --- a/packages/dpns-contract/Cargo.toml +++ b/packages/dpns-contract/Cargo.toml @@ -3,7 +3,7 @@ name = "dpns-contract" description = "DPNS data contract schema and tools" version = "1.0.0-dev.5" edition = "2021" -rust-version = "1.73" +rust-version = "1.76" license = "MIT" [dependencies] diff --git a/packages/dpns-contract/test/unit/dpnsContract.spec.js b/packages/dpns-contract/test/unit/dpnsContract.spec.js index e0b4c46f55..faa8895151 100644 --- a/packages/dpns-contract/test/unit/dpnsContract.spec.js +++ b/packages/dpns-contract/test/unit/dpnsContract.spec.js @@ -1,7 +1,8 @@ const crypto = require('crypto'); const { - DashPlatformProtocol, JsonSchemaError, + DashPlatformProtocol, + JsonSchemaError, } = require('@dashevo/wasm-dpp'); const generateRandomIdentifier = require('@dashevo/wasm-dpp/lib/test/utils/generateRandomIdentifierAsync'); @@ -10,10 +11,16 @@ const dpnsContractDocumentsSchema = require('../../schema/v1/dpns-contract-docum const expectJsonSchemaError = (validationResult, errorCount = 1) => { const errors = validationResult.getErrors(); - expect(errors).to.have.length(errorCount); + expect(errors) + .to + .have + .length(errorCount); const error = validationResult.getErrors()[0]; - expect(error).to.be.instanceof(JsonSchemaError); + expect(error) + .to + .be + .instanceof(JsonSchemaError); return error; }; @@ -30,11 +37,14 @@ describe('DPNS Contract', () => { identityId = await generateRandomIdentifier(); - dataContract = dpp.dataContract.create(identityId, dpnsContractDocumentsSchema); + dataContract = dpp.dataContract.create(identityId, BigInt(1), dpnsContractDocumentsSchema); }); it('should have a valid contract definition', async () => { - expect(() => dpp.dataContract.create(identityId, dpnsContractDocumentsSchema)).to.not.throw(); + expect(() => dpp.dataContract.create(identityId, BigInt(1), dpnsContractDocumentsSchema)) + .to + .not + .throw(); }); describe('documents', () => { @@ -55,8 +65,12 @@ describe('DPNS Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('required'); - expect(error.params.missingProperty).to.equal('saltedDomainHash'); + expect(error.keyword) + .to + .equal('required'); + expect(error.params.missingProperty) + .to + .equal('saltedDomainHash'); }); it('should not be empty', async () => { @@ -66,8 +80,13 @@ describe('DPNS Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('minItems'); - expect(error.instancePath).to.deep.equal('/saltedDomainHash'); + expect(error.keyword) + .to + .equal('minItems'); + expect(error.instancePath) + .to + .deep + .equal('/saltedDomainHash'); }); it('should be not less than 32 bytes', async () => { @@ -77,8 +96,12 @@ describe('DPNS Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('minItems'); - expect(error.instancePath).to.equal('/saltedDomainHash'); + expect(error.keyword) + .to + .equal('minItems'); + expect(error.instancePath) + .to + .equal('/saltedDomainHash'); }); it('should be not longer than 32 bytes', async () => { @@ -88,8 +111,12 @@ describe('DPNS Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('maxItems'); - expect(error.instancePath).to.equal('/saltedDomainHash'); + expect(error.keyword) + .to + .equal('maxItems'); + expect(error.instancePath) + .to + .equal('/saltedDomainHash'); }); }); @@ -100,8 +127,13 @@ describe('DPNS Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('additionalProperties'); - expect(error.params.additionalProperties).to.deep.equal(['someOtherProperty']); + expect(error.keyword) + .to + .equal('additionalProperties'); + expect(error.params.additionalProperties) + .to + .deep + .equal(['someOtherProperty']); }); it('should be valid', async () => { @@ -109,7 +141,10 @@ describe('DPNS Contract', () => { const result = await preorder.validate(dpp.protocolVersion); - expect(result.isValid()).to.be.true(); + expect(result.isValid()) + .to + .be + .true(); }); }); @@ -139,8 +174,12 @@ describe('DPNS Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('required'); - expect(error.params.missingProperty).to.equal('label'); + expect(error.keyword) + .to + .equal('required'); + expect(error.params.missingProperty) + .to + .equal('label'); }); it('should follow pattern', async () => { @@ -150,8 +189,12 @@ describe('DPNS Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('pattern'); - expect(error.instancePath).to.equal('/label'); + expect(error.keyword) + .to + .equal('pattern'); + expect(error.instancePath) + .to + .equal('/label'); }); it('should be longer than 3 chars', async () => { @@ -161,8 +204,12 @@ describe('DPNS Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('minLength'); - expect(error.instancePath).to.equal('/label'); + expect(error.keyword) + .to + .equal('minLength'); + expect(error.instancePath) + .to + .equal('/label'); }); it('should be less than 63 chars', async () => { @@ -172,8 +219,12 @@ describe('DPNS Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult, 2); - expect(error.keyword).to.equal('pattern'); - expect(error.instancePath).to.equal('/label'); + expect(error.keyword) + .to + .equal('pattern'); + expect(error.instancePath) + .to + .equal('/label'); }); }); @@ -185,8 +236,12 @@ describe('DPNS Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('required'); - expect(error.params.missingProperty).to.equal('normalizedLabel'); + expect(error.keyword) + .to + .equal('required'); + expect(error.params.missingProperty) + .to + .equal('normalizedLabel'); }); it('should follow pattern', async () => { @@ -196,8 +251,12 @@ describe('DPNS Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('pattern'); - expect(error.instancePath).to.equal('/normalizedLabel'); + expect(error.keyword) + .to + .equal('pattern'); + expect(error.instancePath) + .to + .equal('/normalizedLabel'); }); it('should be less than 63 chars', async () => { @@ -207,8 +266,12 @@ describe('DPNS Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult, 2); - expect(error.keyword).to.equal('pattern'); - expect(error.instancePath).to.equal('/normalizedLabel'); + expect(error.keyword) + .to + .equal('pattern'); + expect(error.instancePath) + .to + .equal('/normalizedLabel'); }); }); @@ -220,8 +283,12 @@ describe('DPNS Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('required'); - expect(error.params.missingProperty).to.equal('normalizedParentDomainName'); + expect(error.keyword) + .to + .equal('required'); + expect(error.params.missingProperty) + .to + .equal('normalizedParentDomainName'); }); it('should be less than 190 chars', async () => { @@ -231,8 +298,12 @@ describe('DPNS Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult, 2); - expect(error.keyword).to.equal('pattern'); - expect(error.instancePath).to.equal('/normalizedParentDomainName'); + expect(error.keyword) + .to + .equal('pattern'); + expect(error.instancePath) + .to + .equal('/normalizedParentDomainName'); }); it('should follow pattern', async () => { @@ -242,8 +313,12 @@ describe('DPNS Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('pattern'); - expect(error.instancePath).to.equal('/normalizedParentDomainName'); + expect(error.keyword) + .to + .equal('pattern'); + expect(error.instancePath) + .to + .equal('/normalizedParentDomainName'); }); }); @@ -255,8 +330,12 @@ describe('DPNS Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('required'); - expect(error.params.missingProperty).to.equal('preorderSalt'); + expect(error.keyword) + .to + .equal('required'); + expect(error.params.missingProperty) + .to + .equal('preorderSalt'); }); it('should not be empty', async () => { @@ -267,8 +346,13 @@ describe('DPNS Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('minItems'); - expect(error.instancePath).to.deep.equal('/preorderSalt'); + expect(error.keyword) + .to + .equal('minItems'); + expect(error.instancePath) + .to + .deep + .equal('/preorderSalt'); }); it('should be not less than 32 bytes', async () => { @@ -278,8 +362,12 @@ describe('DPNS Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('minItems'); - expect(error.instancePath).to.equal('/preorderSalt'); + expect(error.keyword) + .to + .equal('minItems'); + expect(error.instancePath) + .to + .equal('/preorderSalt'); }); it('should be not longer than 32 bytes', async () => { @@ -289,8 +377,12 @@ describe('DPNS Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('maxItems'); - expect(error.instancePath).to.equal('/preorderSalt'); + expect(error.keyword) + .to + .equal('maxItems'); + expect(error.instancePath) + .to + .equal('/preorderSalt'); }); }); @@ -302,8 +394,13 @@ describe('DPNS Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('additionalProperties'); - expect(error.params.additionalProperties).to.deep.equal(['someOtherProperty']); + expect(error.keyword) + .to + .equal('additionalProperties'); + expect(error.params.additionalProperties) + .to + .deep + .equal(['someOtherProperty']); }); it('should be valid', async () => { @@ -311,7 +408,10 @@ describe('DPNS Contract', () => { const result = await domain.validate(dpp.protocolVersion); - expect(result.isValid()).to.be.true(); + expect(result.isValid()) + .to + .be + .true(); }); describe('Records', () => { @@ -322,8 +422,12 @@ describe('DPNS Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('required'); - expect(error.params.missingProperty).to.equal('records'); + expect(error.keyword) + .to + .equal('required'); + expect(error.params.missingProperty) + .to + .equal('records'); }); it('should not be empty', async () => { @@ -333,8 +437,13 @@ describe('DPNS Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('minProperties'); - expect(error.instancePath).to.deep.equal('/records'); + expect(error.keyword) + .to + .equal('minProperties'); + expect(error.instancePath) + .to + .deep + .equal('/records'); }); it('should not have additional properties', async () => { @@ -346,9 +455,16 @@ describe('DPNS Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('additionalProperties'); - expect(error.instancePath).to.equal('/records'); - expect(error.params.additionalProperties).to.deep.equal(['someOtherProperty']); + expect(error.keyword) + .to + .equal('additionalProperties'); + expect(error.instancePath) + .to + .equal('/records'); + expect(error.params.additionalProperties) + .to + .deep + .equal(['someOtherProperty']); }); describe('Dash Identity', () => { @@ -362,8 +478,12 @@ describe('DPNS Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('maxProperties'); - expect(error.instancePath).to.equal('/records'); + expect(error.keyword) + .to + .equal('maxProperties'); + expect(error.instancePath) + .to + .equal('/records'); }); describe('dashUniqueIdentityId', () => { @@ -374,7 +494,9 @@ describe('DPNS Contract', () => { expect(() => { dpp.document.create(dataContract, identityId, 'domain', rawDomainDocument); - }).to.throw(); + }) + .to + .throw(); }); it('should no more than 32 bytes', async () => { @@ -384,7 +506,9 @@ describe('DPNS Contract', () => { expect(() => { dpp.document.create(dataContract, identityId, 'domain', rawDomainDocument); - }).to.throw(); + }) + .to + .throw(); }); }); @@ -396,7 +520,9 @@ describe('DPNS Contract', () => { expect(() => { dpp.document.create(dataContract, identityId, 'domain', rawDomainDocument); - }).to.throw(); + }) + .to + .throw(); }); it('should no more than 32 bytes', async () => { @@ -406,7 +532,9 @@ describe('DPNS Contract', () => { expect(() => { dpp.document.create(dataContract, identityId, 'domain', rawDomainDocument); - }).to.throw(); + }) + .to + .throw(); }); }); }); @@ -420,8 +548,12 @@ describe('DPNS Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('required'); - expect(error.params.missingProperty).to.equal('subdomainRules'); + expect(error.keyword) + .to + .equal('required'); + expect(error.params.missingProperty) + .to + .equal('subdomainRules'); }); it('should not have additional properties', async () => { @@ -431,9 +563,16 @@ describe('DPNS Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('additionalProperties'); - expect(error.instancePath).to.equal('/subdomainRules'); - expect(error.params.additionalProperties).to.deep.equal(['someOtherProperty']); + expect(error.keyword) + .to + .equal('additionalProperties'); + expect(error.instancePath) + .to + .equal('/subdomainRules'); + expect(error.params.additionalProperties) + .to + .deep + .equal(['someOtherProperty']); }); describe('allowSubdomains', () => { @@ -444,8 +583,13 @@ describe('DPNS Contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('type'); - expect(error.instancePath).to.deep.equal('/subdomainRules/allowSubdomains'); + expect(error.keyword) + .to + .equal('type'); + expect(error.instancePath) + .to + .deep + .equal('/subdomainRules/allowSubdomains'); }); }); }); diff --git a/packages/feature-flags-contract/.eslintrc b/packages/feature-flags-contract/.eslintrc index eec7881491..cb6c7636b6 100644 --- a/packages/feature-flags-contract/.eslintrc +++ b/packages/feature-flags-contract/.eslintrc @@ -1,15 +1,18 @@ { - "extends": "airbnb-base", - "rules": { - "no-plusplus": 0, - "eol-last": [ - "error", - "always" - ], - "class-methods-use-this": "off", - "curly": [ - "error", - "all" - ] - } -} \ No newline at end of file + "extends": "airbnb-base", + "rules": { + "no-plusplus": 0, + "eol-last": [ + "error", + "always" + ], + "class-methods-use-this": "off", + "curly": [ + "error", + "all" + ] + }, + "globals": { + "BigInt": true + } +} diff --git a/packages/feature-flags-contract/Cargo.toml b/packages/feature-flags-contract/Cargo.toml index ba24b017d3..abdb57eb72 100644 --- a/packages/feature-flags-contract/Cargo.toml +++ b/packages/feature-flags-contract/Cargo.toml @@ -3,7 +3,7 @@ name = "feature-flags-contract" description = "Feature flags data contract schema and tools" version = "1.0.0-dev.5" edition = "2021" -rust-version = "1.73" +rust-version = "1.76" license = "MIT" [dependencies] diff --git a/packages/feature-flags-contract/test/unit/featureFlagsContract.spec.js b/packages/feature-flags-contract/test/unit/featureFlagsContract.spec.js index 217a5122b5..c15c4978db 100644 --- a/packages/feature-flags-contract/test/unit/featureFlagsContract.spec.js +++ b/packages/feature-flags-contract/test/unit/featureFlagsContract.spec.js @@ -1,4 +1,7 @@ -const { DashPlatformProtocol, JsonSchemaError } = require('@dashevo/wasm-dpp'); +const { + DashPlatformProtocol, + JsonSchemaError, +} = require('@dashevo/wasm-dpp'); const generateRandomIdentifier = require('@dashevo/wasm-dpp/lib/test/utils/generateRandomIdentifierAsync'); @@ -8,10 +11,16 @@ const featureFlagsContractDocumentsSchema = require('../../schema/v1/feature-fla const expectJsonSchemaError = (validationResult, errorCount = 1) => { const errors = validationResult.getErrors(); - expect(errors).to.have.length(errorCount); + expect(errors) + .to + .have + .length(errorCount); const error = validationResult.getErrors()[0]; - expect(error).to.be.instanceof(JsonSchemaError); + expect(error) + .to + .be + .instanceof(JsonSchemaError); return error; }; @@ -28,12 +37,24 @@ describe('Feature Flags contract', () => { identityId = await generateRandomIdentifier(); - dataContract = dpp.dataContract.create(identityId, featureFlagsContractDocumentsSchema); + dataContract = dpp.dataContract.create( + identityId, + BigInt(1), + featureFlagsContractDocumentsSchema, + ); }); it('should have a valid contract definition', async () => { - expect(() => dpp.dataContract.create(identityId, featureFlagsContractDocumentsSchema)) - .to.not.throw(); + expect(() => { + dpp.dataContract.create( + identityId, + BigInt(1), + featureFlagsContractDocumentsSchema, + ); + }) + .to + .not + .throw(); }); describe('documents', () => { @@ -68,8 +89,12 @@ describe('Feature Flags contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult, 2); - expect(error.keyword).to.equal('minProperties'); - expect(error.params.minProperties).to.equal(3); + expect(error.keyword) + .to + .equal('minProperties'); + expect(error.params.minProperties) + .to + .equal(3); }); it('should not have additional properties', async () => { @@ -86,8 +111,13 @@ describe('Feature Flags contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('additionalProperties'); - expect(error.params.additionalProperties).to.deep.equal(['someOtherProperty']); + expect(error.keyword) + .to + .equal('additionalProperties'); + expect(error.params.additionalProperties) + .to + .deep + .equal(['someOtherProperty']); }); describe('enabledAtHeight', () => { @@ -98,8 +128,12 @@ describe('Feature Flags contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('required'); - expect(error.params.missingProperty).to.equal('enableAtHeight'); + expect(error.keyword) + .to + .equal('required'); + expect(error.params.missingProperty) + .to + .equal('enableAtHeight'); }); it('should be integer', () => { @@ -109,8 +143,12 @@ describe('Feature Flags contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('type'); - expect(error.params.type).to.equal('integer'); + expect(error.keyword) + .to + .equal('type'); + expect(error.params.type) + .to + .equal('integer'); }); it('should be at least 1', () => { @@ -120,8 +158,12 @@ describe('Feature Flags contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('minimum'); - expect(error.params.minimum).to.equal(1); + expect(error.keyword) + .to + .equal('minimum'); + expect(error.params.minimum) + .to + .equal(1); }); }); @@ -140,8 +182,12 @@ describe('Feature Flags contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('minProperties'); - expect(error.params.minProperties).to.equal(1); + expect(error.keyword) + .to + .equal('minProperties'); + expect(error.params.minProperties) + .to + .equal(1); }); describe('maxBytes', () => { @@ -154,8 +200,12 @@ describe('Feature Flags contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('type'); - expect(error.params.type).to.equal('integer'); + expect(error.keyword) + .to + .equal('type'); + expect(error.params.type) + .to + .equal('integer'); }); it('should be at least 1', async () => { @@ -167,8 +217,12 @@ describe('Feature Flags contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('minimum'); - expect(error.params.minimum).to.equal(1); + expect(error.keyword) + .to + .equal('minimum'); + expect(error.params.minimum) + .to + .equal(1); }); }); @@ -182,8 +236,12 @@ describe('Feature Flags contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('type'); - expect(error.params.type).to.equal('integer'); + expect(error.keyword) + .to + .equal('type'); + expect(error.params.type) + .to + .equal('integer'); }); it('should be at least 1', async () => { @@ -195,8 +253,12 @@ describe('Feature Flags contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('minimum'); - expect(error.params.minimum).to.equal(1); + expect(error.keyword) + .to + .equal('minimum'); + expect(error.params.minimum) + .to + .equal(1); }); }); @@ -205,7 +267,10 @@ describe('Feature Flags contract', () => { const result = updateConsensusParams.validate(dpp.protocolVersion); - expect(result.isValid()).to.be.true(); + expect(result.isValid()) + .to + .be + .true(); }); }); @@ -228,8 +293,12 @@ describe('Feature Flags contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('minProperties'); - expect(error.params.minProperties).to.equal(1); + expect(error.keyword) + .to + .equal('minProperties'); + expect(error.params.minProperties) + .to + .equal(1); }); describe('maxBytes', () => { @@ -242,8 +311,12 @@ describe('Feature Flags contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('type'); - expect(error.params.type).to.equal('integer'); + expect(error.keyword) + .to + .equal('type'); + expect(error.params.type) + .to + .equal('integer'); }); it('should be at least 1', async () => { @@ -255,8 +328,12 @@ describe('Feature Flags contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('minimum'); - expect(error.params.minimum).to.equal(1); + expect(error.keyword) + .to + .equal('minimum'); + expect(error.params.minimum) + .to + .equal(1); }); }); @@ -270,8 +347,12 @@ describe('Feature Flags contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('type'); - expect(error.params.type).to.equal('integer'); + expect(error.keyword) + .to + .equal('type'); + expect(error.params.type) + .to + .equal('integer'); }); it('should be at least 1', async () => { @@ -283,8 +364,12 @@ describe('Feature Flags contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('minimum'); - expect(error.params.minimum).to.equal(1); + expect(error.keyword) + .to + .equal('minimum'); + expect(error.params.minimum) + .to + .equal(1); }); }); @@ -297,8 +382,12 @@ describe('Feature Flags contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('required'); - expect(error.params.missingProperty).to.equal('seconds'); + expect(error.keyword) + .to + .equal('required'); + expect(error.params.missingProperty) + .to + .equal('seconds'); }); it('should be integer', () => { @@ -308,8 +397,12 @@ describe('Feature Flags contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('type'); - expect(error.params.type).to.equal('integer'); + expect(error.keyword) + .to + .equal('type'); + expect(error.params.type) + .to + .equal('integer'); }); it('should be at least 1', () => { @@ -319,8 +412,12 @@ describe('Feature Flags contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('minimum'); - expect(error.params.minimum).to.equal(1); + expect(error.keyword) + .to + .equal('minimum'); + expect(error.params.minimum) + .to + .equal(1); }); }); @@ -332,8 +429,12 @@ describe('Feature Flags contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('required'); - expect(error.params.missingProperty).to.equal('nanos'); + expect(error.keyword) + .to + .equal('required'); + expect(error.params.missingProperty) + .to + .equal('nanos'); }); it('should be integer', () => { @@ -343,8 +444,12 @@ describe('Feature Flags contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('type'); - expect(error.params.type).to.equal('integer'); + expect(error.keyword) + .to + .equal('type'); + expect(error.params.type) + .to + .equal('integer'); }); it('should be at least 0', () => { @@ -354,8 +459,12 @@ describe('Feature Flags contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('minimum'); - expect(error.params.minimum).to.equal(0); + expect(error.keyword) + .to + .equal('minimum'); + expect(error.params.minimum) + .to + .equal(0); }); }); }); @@ -365,7 +474,10 @@ describe('Feature Flags contract', () => { const result = updateConsensusParams.validate(dpp.protocolVersion); - expect(result.isValid()).to.be.true(); + expect(result.isValid()) + .to + .be + .true(); }); }); @@ -383,8 +495,12 @@ describe('Feature Flags contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('minProperties'); - expect(error.params.minProperties).to.equal(1); + expect(error.keyword) + .to + .equal('minProperties'); + expect(error.params.minProperties) + .to + .equal(1); }); describe('appVersion', () => { @@ -397,8 +513,12 @@ describe('Feature Flags contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('type'); - expect(error.params.type).to.equal('integer'); + expect(error.keyword) + .to + .equal('type'); + expect(error.params.type) + .to + .equal('integer'); }); it('should be at least 1', async () => { @@ -410,8 +530,12 @@ describe('Feature Flags contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('minimum'); - expect(error.params.minimum).to.equal(1); + expect(error.keyword) + .to + .equal('minimum'); + expect(error.params.minimum) + .to + .equal(1); }); }); @@ -420,7 +544,10 @@ describe('Feature Flags contract', () => { const result = updateConsensusParams.validate(dpp.protocolVersion); - expect(result.isValid()).to.be.true(); + expect(result.isValid()) + .to + .be + .true(); }); }); @@ -429,7 +556,10 @@ describe('Feature Flags contract', () => { const result = updateConsensusParams.validate(dpp.protocolVersion); - expect(result.isValid()).to.be.true(); + expect(result.isValid()) + .to + .be + .true(); }); }); }); diff --git a/packages/js-grpc-common/index.js b/packages/js-grpc-common/index.js index ed85e5354c..add20ba40f 100644 --- a/packages/js-grpc-common/index.js +++ b/packages/js-grpc-common/index.js @@ -22,6 +22,7 @@ const ResourceExhaustedGrpcError = require('./lib/server/error/ResourceExhausted const DeadlineExceededGrpcError = require('./lib/server/error/DeadlineExceededGrpcError'); const NotFoundGrpcError = require('./lib/server/error/NotFoundGrpcError'); const UnavailableGrpcError = require('./lib/server/error/UnavailableGrpcError'); +const UnimplementedGrpcError = require('./lib/server/error/UnimplementedGrpcError'); const AlreadyExistsGrpcError = require('./lib/server/error/AlreadyExistsGrpcError'); const GrpcError = require('./lib/server/error/GrpcError'); @@ -59,6 +60,7 @@ module.exports = { NotFoundGrpcError, UnavailableGrpcError, AlreadyExistsGrpcError, + UnimplementedGrpcError, }, checks: { checkVersionWrapperFactory, diff --git a/packages/js-grpc-common/lib/server/error/UnimplementedGrpcError.js b/packages/js-grpc-common/lib/server/error/UnimplementedGrpcError.js new file mode 100644 index 0000000000..a9a054c9b8 --- /dev/null +++ b/packages/js-grpc-common/lib/server/error/UnimplementedGrpcError.js @@ -0,0 +1,14 @@ +const GrpcError = require('./GrpcError'); +const GrpcErrorCodes = require('./GrpcErrorCodes'); + +class UnimplementedGrpcError extends GrpcError { + /** + * @param {string} message + * @param {Object} [metadata] + */ + constructor(message, metadata = undefined) { + super(GrpcErrorCodes.UNIMPLEMENTED, message, metadata); + } +} + +module.exports = UnimplementedGrpcError; diff --git a/packages/masternode-reward-shares-contract/.eslintrc b/packages/masternode-reward-shares-contract/.eslintrc index 333860e2f9..cb6c7636b6 100644 --- a/packages/masternode-reward-shares-contract/.eslintrc +++ b/packages/masternode-reward-shares-contract/.eslintrc @@ -1,15 +1,18 @@ { - "extends": "airbnb-base", - "rules": { - "no-plusplus": 0, - "eol-last": [ - "error", - "always" - ], - "class-methods-use-this": "off", - "curly": [ - "error", - "all" - ] - } + "extends": "airbnb-base", + "rules": { + "no-plusplus": 0, + "eol-last": [ + "error", + "always" + ], + "class-methods-use-this": "off", + "curly": [ + "error", + "all" + ] + }, + "globals": { + "BigInt": true + } } diff --git a/packages/masternode-reward-shares-contract/Cargo.toml b/packages/masternode-reward-shares-contract/Cargo.toml index f323e75ea3..009a8dcd19 100644 --- a/packages/masternode-reward-shares-contract/Cargo.toml +++ b/packages/masternode-reward-shares-contract/Cargo.toml @@ -3,7 +3,7 @@ name = "masternode-reward-shares-contract" description = "Masternode reward shares data contract schema and tools" version = "1.0.0-dev.5" edition = "2021" -rust-version = "1.73" +rust-version = "1.76" license = "MIT" [dependencies] diff --git a/packages/masternode-reward-shares-contract/test/unit/masternodeRewardSharesContract.spec.js b/packages/masternode-reward-shares-contract/test/unit/masternodeRewardSharesContract.spec.js index adac76bbe9..e2eae634f1 100644 --- a/packages/masternode-reward-shares-contract/test/unit/masternodeRewardSharesContract.spec.js +++ b/packages/masternode-reward-shares-contract/test/unit/masternodeRewardSharesContract.spec.js @@ -1,4 +1,7 @@ -const { DashPlatformProtocol, JsonSchemaError } = require('@dashevo/wasm-dpp'); +const { + DashPlatformProtocol, + JsonSchemaError, +} = require('@dashevo/wasm-dpp'); const generateRandomIdentifier = require('@dashevo/wasm-dpp/lib/test/utils/generateRandomIdentifierAsync'); @@ -8,10 +11,16 @@ const rewardSharingContractSchema = require('../../schema/v1/masternode-reward-s const expectJsonSchemaError = (validationResult, errorCount = 1) => { const errors = validationResult.getErrors(); - expect(errors).to.have.length(errorCount); + expect(errors) + .to + .have + .length(errorCount); const error = validationResult.getErrors()[0]; - expect(error).to.be.instanceof(JsonSchemaError); + expect(error) + .to + .be + .instanceof(JsonSchemaError); return error; }; @@ -29,7 +38,11 @@ describe('Masternode reward shares contract', () => { identityId = await generateRandomIdentifier(); - contract = dpp.dataContract.create(identityId, rewardSharingContractSchema); + contract = dpp.dataContract.create( + identityId, + BigInt(1), + rewardSharingContractSchema, + ); rewardShare = { payToId: await generateRandomIdentifier(), @@ -38,8 +51,10 @@ describe('Masternode reward shares contract', () => { }); it('should have a valid contract definition', async () => { - expect(() => dpp.dataContract.create(identityId, rewardSharingContractSchema)) - .to.not.throw(); + expect(() => dpp.dataContract.create(identityId, BigInt(1), rewardSharingContractSchema)) + .to + .not + .throw(); }); describe('payToId', () => { @@ -50,22 +65,28 @@ describe('Masternode reward shares contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('required'); - expect(error.params.missingProperty).to.equal('payToId'); + expect(error.keyword) + .to + .equal('required'); + expect(error.params.missingProperty) + .to + .equal('payToId'); }); it('should have no less than 32 bytes', () => { rewardShare.payToId = Buffer.alloc(31); expect(() => dpp.document.create(contract, identityId, 'rewardShare', rewardShare)) - .to.throw(); + .to + .throw(); }); it('should have no more than 32 bytes', async () => { rewardShare.payToId = Buffer.alloc(33); expect(() => dpp.document.create(contract, identityId, 'rewardShare', rewardShare)) - .to.throw(); + .to + .throw(); }); }); @@ -77,8 +98,12 @@ describe('Masternode reward shares contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('required'); - expect(error.params.missingProperty).to.equal('percentage'); + expect(error.keyword) + .to + .equal('required'); + expect(error.params.missingProperty) + .to + .equal('percentage'); }); it('should not be less than 1', () => { @@ -88,8 +113,12 @@ describe('Masternode reward shares contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('minimum'); - expect(error.instancePath).to.equal('/percentage'); + expect(error.keyword) + .to + .equal('minimum'); + expect(error.instancePath) + .to + .equal('/percentage'); }); it('should not be more than 10000', () => { @@ -99,8 +128,12 @@ describe('Masternode reward shares contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('maximum'); - expect(error.instancePath).to.equal('/percentage'); + expect(error.keyword) + .to + .equal('maximum'); + expect(error.instancePath) + .to + .equal('/percentage'); }); it('should be a number', () => { @@ -110,9 +143,15 @@ describe('Masternode reward shares contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('type'); - expect(error.instancePath).to.equal('/percentage'); - expect(error.params.type).to.equal('integer'); + expect(error.keyword) + .to + .equal('type'); + expect(error.instancePath) + .to + .equal('/percentage'); + expect(error.params.type) + .to + .equal('integer'); }); }); @@ -123,7 +162,12 @@ describe('Masternode reward shares contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('additionalProperties'); - expect(error.params.additionalProperties).to.deep.equal(['someOtherProperty']); + expect(error.keyword) + .to + .equal('additionalProperties'); + expect(error.params.additionalProperties) + .to + .deep + .equal(['someOtherProperty']); }); }); diff --git a/packages/rs-dapi-client/Cargo.toml b/packages/rs-dapi-client/Cargo.toml index a2ee079345..203d400042 100644 --- a/packages/rs-dapi-client/Cargo.toml +++ b/packages/rs-dapi-client/Cargo.toml @@ -14,7 +14,7 @@ offline-testing = [] [dependencies] backon = "0.4.1" -dapi-grpc = { path = "../dapi-grpc", features = ["client"] } +dapi-grpc = { path = "../dapi-grpc" } futures = "0.3.28" http = "0.2.9" rand = { version = "0.8.5", features = ["small_rng"] } diff --git a/packages/rs-dpp/Cargo.toml b/packages/rs-dpp/Cargo.toml index d261852b3a..7fd2ea0334 100644 --- a/packages/rs-dpp/Cargo.toml +++ b/packages/rs-dpp/Cargo.toml @@ -2,7 +2,7 @@ name = "dpp" version = "1.0.0-dev.5" edition = "2021" -rust-version = "1.73" +rust-version = "1.76" authors = [ "Anton Suprunchuk ", "Samuel Westrich ", @@ -16,7 +16,7 @@ tracing = "0.1.4" anyhow = { version = "1.0.75" } async-trait = { version = "0.1.68" } base64 = "0.20.0" -bls-signatures = { git = "https://github.com/dashpay/bls-signatures", branch = "develop" } +bls-signatures = { git = "https://github.com/dashpay/bls-signatures", tag = "v1.3.1" } bs58 = "0.4.0" byteorder = { version = "1.4" } chrono = { version = "0.4.20", default-features = false, features = [ diff --git a/packages/rs-drive-abci/.env.local b/packages/rs-drive-abci/.env.local index c131e8c240..c8a1b0afc0 100644 --- a/packages/rs-drive-abci/.env.local +++ b/packages/rs-drive-abci/.env.local @@ -1,6 +1,7 @@ # ABCI host and port to listen -ABCI_BIND_ADDRESS="tcp://0.0.0.0:26658" -ABCI_PROMETHEUS_BIND_ADDRESS="http://0.0.0.0:29090" +ABCI_CONSENSUS_BIND_ADDRESS="tcp://0.0.0.0:26658" +PROMETHEUS_BIND_ADDRESS="http://0.0.0.0:29090" +GRPC_BIND_ADDRESS="0.0.0.0:26670" # stderr logging for humans ABCI_LOG_STDOUT_DESTINATION=stdout @@ -61,3 +62,7 @@ EPOCH_TIME_LENGTH_S=788400 CHAIN_ID=devnet BLOCK_SPACING_MS=5000 + +TOKIO_CONSOLE_ENABLED=false +TOKIO_CONSOLE_ADDRESS=127.0.0.1:6669 +TOKIO_CONSOLE_RETENTION_SECS=180 diff --git a/packages/rs-drive-abci/.env.mainnet b/packages/rs-drive-abci/.env.mainnet index a6733bc78b..d6c50901a6 100644 --- a/packages/rs-drive-abci/.env.mainnet +++ b/packages/rs-drive-abci/.env.mainnet @@ -1,6 +1,7 @@ # ABCI host and port to listen -ABCI_BIND_ADDRESS="tcp://0.0.0.0:26658" -ABCI_PROMETHEUS_BIND_ADDRESS="http://0.0.0.0:29090" +ABCI_CONSENSUS_BIND_ADDRESS="tcp://0.0.0.0:26658" +PROMETHEUS_BIND_ADDRESS="http://0.0.0.0:29090" +GRPC_BIND_ADDRESS="0.0.0.0:26670" # stderr logging for humans ABCI_LOG_STDOUT_DESTINATION=stdout @@ -21,15 +22,10 @@ CORE_JSON_RPC_PORT=9998 CORE_JSON_RPC_USERNAME=dashrpc CORE_JSON_RPC_PASSWORD=password -# DashCore ZMQ host and port -CORE_ZMQ_HOST=127.0.0.1 -CORE_ZMQ_PORT=29998 -CORE_ZMQ_CONNECTION_RETRIES=16 - INITIAL_CORE_CHAINLOCKED_HEIGHT=1243 # https://github.com/dashevo/dashcore-lib/blob/286c33a9d29d33f05d874c47a9b33764a0be0cf1/lib/constants/index.js#L42-L57 -VALIDATOR_SET_LLMQ_TYPE=llmq_100_67 +VALIDATOR_SET_QUORUM_TYPE=llmq_100_67 VALIDATOR_SET_QUORUM_SIZE=100 VALIDATOR_SET_ROTATION_BLOCK_COUNT=64 @@ -65,3 +61,7 @@ EPOCH_TIME_LENGTH_S=788400 CHAIN_ID=devnet BLOCK_SPACING_MS=5000 + +TOKIO_CONSOLE_ENABLED=false +TOKIO_CONSOLE_ADDRESS=127.0.0.1:6669 +TOKIO_CONSOLE_RETENTION_SECS=180 diff --git a/packages/rs-drive-abci/.env.testnet b/packages/rs-drive-abci/.env.testnet index 202a78efaf..4882b58c95 100644 --- a/packages/rs-drive-abci/.env.testnet +++ b/packages/rs-drive-abci/.env.testnet @@ -1,6 +1,7 @@ # ABCI host and port to listen -ABCI_BIND_ADDRESS="tcp://0.0.0.0:26658" -ABCI_PROMETHEUS_BIND_ADDRESS="http://0.0.0.0:29090" +ABCI_CONSENSUS_BIND_ADDRESS="tcp://0.0.0.0:26658" +PROMETHEUS_BIND_ADDRESS="http://0.0.0.0:29090" +GRPC_BIND_ADDRESS="0.0.0.0:26670" # stderr logging for humans ABCI_LOG_STDOUT_DESTINATION=stdout @@ -24,7 +25,7 @@ CORE_JSON_RPC_PASSWORD=password INITIAL_CORE_CHAINLOCKED_HEIGHT=1243 # https://github.com/dashevo/dashcore-lib/blob/286c33a9d29d33f05d874c47a9b33764a0be0cf1/lib/constants/index.js#L42-L57 -VALIDATOR_SET_LLMQ_TYPE=llmq_25_67 +VALIDATOR_SET_QUORUM_TYPE=llmq_25_67 VALIDATOR_SET_QUORUM_SIZE=25 VALIDATOR_SET_ROTATION_BLOCK_COUNT=64 @@ -60,3 +61,7 @@ EPOCH_TIME_LENGTH_S=788400 CHAIN_ID=devnet BLOCK_SPACING_MS=5000 + +TOKIO_CONSOLE_ENABLED=false +TOKIO_CONSOLE_ADDRESS=127.0.0.1:6669 +TOKIO_CONSOLE_RETENTION_SECS=180 diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index 0520a7d4f8..9c69fdf033 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -2,14 +2,14 @@ name = "drive-abci" version = "1.0.0-dev.5" authors = [ - "Samuel Westrich ", - "Ivan Shumkov ", - "Djavid Gabibiyan ", - "Lukasz Klimek ", - "Igor Markin ", + "Samuel Westrich ", + "Ivan Shumkov ", + "Djavid Gabibiyan ", + "Lukasz Klimek ", + "Igor Markin ", ] edition = "2021" -rust-version = "1.73" +rust-version = "1.76" license = "MIT" [dependencies] @@ -19,17 +19,16 @@ chrono = "0.4.20" serde = { version = "1.0.152", features = ["derive"] } serde_json = { version = "1.0", features = ["preserve_order"] } serde_with = { version = "3.1.0", features = [ - "hex", - "macros", + "hex", + "macros", ], default-features = false } drive = { path = "../rs-drive", default-features = false, features = [ - "full", - "grovedb_operations_logging", + "full", + "grovedb_operations_logging", ] } thiserror = "1.0.30" rand = "0.8.5" tempfile = "3.3.0" -bs58 = "0.4.0" hex = "0.4.3" indexmap = { version = "1.9.3", features = ["serde"] } sha2 = "0.10.6" @@ -41,21 +40,23 @@ rust_decimal_macros = "1.25.0" mockall = { version = "0.11", optional = true } prost = { version = "0.12", default-features = false } tracing = { version = "0.1.37", default-features = false, features = [] } -clap = { version = "4.4.10", optional = true, features = ["derive"] } +clap = { version = "4.4.10", features = ["derive"] } envy = { version = "0.4.2" } -dotenvy = { version = "0.15.7", optional = true } +dotenvy = { version = "0.15.7" } dapi-grpc = { path = "../dapi-grpc" } tracing-subscriber = { version = "0.3.16", default-features = false, features = [ - "env-filter", - "ansi", - "json", - "fmt", - "std", - "registry", - "tracing-log", + "env-filter", + "ansi", + "json", + "fmt", + "std", + "registry", + "tracing-log", ], optional = false } atty = { version = "0.2.14", optional = false } -tenderdash-abci = { git = "https://github.com/dashpay/rs-tenderdash-abci", tag = "v0.14.0-dev.6" } +tenderdash-abci = { git = "https://github.com/dashpay/rs-tenderdash-abci", rev = "81d28aa0b15fc0844dfa7f7251f6949f6c6c405a", features = [ + "grpc-server", +] } lazy_static = "1.4.0" itertools = { version = "0.10.5" } file-rotate = { version = "0.7.3" } @@ -66,31 +67,33 @@ metrics = { version = "0.21" } metrics-exporter-prometheus = { version = "0.12" } url = { version = "2.3.1" } ureq = { "version" = "2.6.2" } -tokio = { version = "1", features = [ - "macros", - "signal", - "rt-multi-thread", - "time", +tokio = { version = "1.36", features = [ + "macros", + "signal", + "rt-multi-thread", + "time", ] } tokio-util = { version = "0.7.8" } derive_more = "0.99.17" +async-trait = "0.1.77" +console-subscriber = { version = "0.2.0", optional = true } [dev-dependencies] base64 = "0.20.0" platform-version = { path = "../rs-platform-version", features = [ - "mock-versions", + "mock-versions", ] } dpp = { path = "../rs-dpp", features = [ - "abci", - "random-documents", - "state-transition-signing", - "random-identities", - "random-public-keys", - "random-document-types", - "fixtures-and-mocks", - "identity-value-conversion", - "data-contract-json-conversion", - "data-contract-cbor-conversion", + "abci", + "random-documents", + "state-transition-signing", + "random-identities", + "random-public-keys", + "random-document-types", + "fixtures-and-mocks", + "identity-value-conversion", + "data-contract-json-conversion", + "data-contract-cbor-conversion", ] } drive = { path = "../rs-drive" } strategy-tests = { path = "../strategy-tests" } @@ -100,12 +103,13 @@ rocksdb = { version = "0.21.0" } integer-encoding = { version = "4.0.0" } [features] -default = ["server", "mocks"] -server = ["clap", "dotenvy"] +# TODO: Remove console for production +default = ["mocks", "console"] mocks = ["mockall", "drive/fixtures-and-mocks"] +console = ["console-subscriber", "tokio/tracing"] [[bin]] name = "drive-abci" path = "src/main.rs" -required-features = ["server"] +required-features = ["console"] diff --git a/packages/rs-drive-abci/src/abci/app/check_tx.rs b/packages/rs-drive-abci/src/abci/app/check_tx.rs new file mode 100644 index 0000000000..23f7140002 --- /dev/null +++ b/packages/rs-drive-abci/src/abci/app/check_tx.rs @@ -0,0 +1,98 @@ +use crate::abci::app::PlatformApplication; +use crate::abci::handler; +use crate::error::Error; +use crate::platform_types::platform::Platform; +use crate::rpc::core::CoreRPCLike; +use crate::utils::spawn_blocking_task_with_name_if_supported; +use async_trait::async_trait; +use std::fmt::Debug; +use std::sync::Arc; +use tenderdash_abci::proto::abci as proto; +use tenderdash_abci::proto::abci::abci_application_server as grpc_abci_server; +use tenderdash_abci::proto::tonic; +use tokio; + +/// AbciApp is an implementation of gRPC ABCI Application, as defined by Tenderdash. +/// +/// AbciApp implements logic that should be triggered when Tenderdash performs various operations, like +/// creating new proposal or finalizing new block. +pub struct CheckTxAbciApplication +where + C: CoreRPCLike + Send + Sync + 'static, +{ + /// Platform + platform: Arc>, +} + +impl PlatformApplication for CheckTxAbciApplication +where + C: CoreRPCLike + Send + Sync + 'static, +{ + fn platform(&self) -> &Platform { + self.platform.as_ref() + } +} + +impl CheckTxAbciApplication +where + C: CoreRPCLike + Send + Sync + 'static, +{ + /// Create new ABCI app + pub fn new(platform: Arc>) -> Self { + Self { platform } + } +} + +impl Debug for CheckTxAbciApplication +where + C: CoreRPCLike + Send + Sync + 'static, +{ + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "") + } +} + +#[async_trait] +impl grpc_abci_server::AbciApplication for CheckTxAbciApplication +where + C: CoreRPCLike + Send + Sync + 'static, +{ + async fn echo( + &self, + request: tonic::Request, + ) -> Result, tonic::Status> { + let response = handler::echo(self, request.into_inner()).map_err(error_into_status)?; + + Ok(tonic::Response::new(response)) + } + + async fn check_tx( + &self, + request: tonic::Request, + ) -> Result, tonic::Status> { + let platform = Arc::clone(&self.platform); + + let proto_request = request.into_inner(); + + let check_tx_type = proto::CheckTxType::try_from(proto_request.r#type) + .map_err(|_| tonic::Status::invalid_argument("invalid check tx type"))?; + + let thread_name = match check_tx_type { + proto::CheckTxType::New => "check_tx", + proto::CheckTxType::Recheck => "re_check_tx", + }; + + spawn_blocking_task_with_name_if_supported(thread_name, move || { + let response = + handler::check_tx(&platform, proto_request).map_err(error_into_status)?; + + Ok(tonic::Response::new(response)) + })? + .await + .map_err(|error| tonic::Status::internal(format!("check tx panics: {}", error)))? + } +} + +pub fn error_into_status(error: Error) -> tonic::Status { + tonic::Status::internal(error.to_string()) +} diff --git a/packages/rs-drive-abci/src/abci/app/consensus.rs b/packages/rs-drive-abci/src/abci/app/consensus.rs new file mode 100644 index 0000000000..9db7ea5578 --- /dev/null +++ b/packages/rs-drive-abci/src/abci/app/consensus.rs @@ -0,0 +1,143 @@ +use crate::abci::app::{PlatformApplication, TransactionalApplication}; +use crate::abci::handler; +use crate::abci::handler::error::error_into_exception; +use crate::error::execution::ExecutionError; +use crate::error::Error; +use crate::platform_types::platform::Platform; +use crate::rpc::core::CoreRPCLike; +use drive::grovedb::Transaction; +use std::fmt::Debug; +use std::sync::RwLock; +use tenderdash_abci::proto::abci as proto; + +/// AbciApp is an implementation of ABCI Application, as defined by Tenderdash. +/// +/// AbciApp implements logic that should be triggered when Tenderdash performs various operations, like +/// creating new proposal or finalizing new block. +pub struct ConsensusAbciApplication<'a, C> { + /// Platform + platform: &'a Platform, + /// The current transaction + transaction: RwLock>>, +} + +impl<'a, C> ConsensusAbciApplication<'a, C> { + /// Create new ABCI app + pub fn new(platform: &'a Platform) -> Self { + Self { + platform, + transaction: RwLock::new(None), + } + } +} + +impl<'a, C> PlatformApplication for ConsensusAbciApplication<'a, C> { + fn platform(&self) -> &Platform { + self.platform + } +} + +impl<'a, C> TransactionalApplication<'a> for ConsensusAbciApplication<'a, C> { + /// create and store a new transaction + fn start_transaction(&self) { + let transaction = self.platform.drive.grove.start_transaction(); + self.transaction.write().unwrap().replace(transaction); + } + + fn transaction(&self) -> &RwLock>> { + &self.transaction + } + + /// Commit a transaction + fn commit_transaction(&self) -> Result<(), Error> { + let transaction = self + .transaction + .write() + .unwrap() + .take() + .ok_or(Error::Execution(ExecutionError::NotInTransaction( + "trying to commit a transaction, but we are not in one", + )))?; + + let platform_state = self.platform.state.read().unwrap(); + let platform_version = platform_state.current_platform_version()?; + self.platform + .drive + .commit_transaction(transaction, &platform_version.drive) + .map_err(Error::Drive) + } +} + +impl<'a, C> Debug for ConsensusAbciApplication<'a, C> { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "") + } +} + +impl<'a, C> tenderdash_abci::Application for ConsensusAbciApplication<'a, C> +where + C: CoreRPCLike, +{ + fn info( + &self, + request: proto::RequestInfo, + ) -> Result { + handler::info(self, request).map_err(error_into_exception) + } + + fn init_chain( + &self, + request: proto::RequestInitChain, + ) -> Result { + handler::init_chain(self, request).map_err(error_into_exception) + } + + fn query( + &self, + _request: proto::RequestQuery, + ) -> Result { + unreachable!("query is not implemented for consensus ABCI application") + } + + fn check_tx( + &self, + _request: proto::RequestCheckTx, + ) -> Result { + unreachable!("check_tx is not implemented for consensus ABCI application") + } + + fn extend_vote( + &self, + request: proto::RequestExtendVote, + ) -> Result { + handler::extend_vote(self, request).map_err(error_into_exception) + } + + fn finalize_block( + &self, + request: proto::RequestFinalizeBlock, + ) -> Result { + handler::finalize_block(self, request).map_err(error_into_exception) + } + + fn prepare_proposal( + &self, + request: proto::RequestPrepareProposal, + ) -> Result { + handler::prepare_proposal(self, request).map_err(error_into_exception) + } + + fn process_proposal( + &self, + request: proto::RequestProcessProposal, + ) -> Result { + handler::process_proposal(self, request).map_err(error_into_exception) + } + + fn verify_vote_extension( + &self, + request: proto::RequestVerifyVoteExtension, + ) -> Result { + handler::verify_vote_extension(self, request).map_err(error_into_exception) + } +} diff --git a/packages/rs-drive-abci/src/abci/handler/execution_result.rs b/packages/rs-drive-abci/src/abci/app/execution_result.rs similarity index 100% rename from packages/rs-drive-abci/src/abci/handler/execution_result.rs rename to packages/rs-drive-abci/src/abci/app/execution_result.rs diff --git a/packages/rs-drive-abci/src/abci/app/full.rs b/packages/rs-drive-abci/src/abci/app/full.rs new file mode 100644 index 0000000000..d4ff765d82 --- /dev/null +++ b/packages/rs-drive-abci/src/abci/app/full.rs @@ -0,0 +1,142 @@ +use crate::abci::app::{PlatformApplication, TransactionalApplication}; +use crate::abci::handler; +use crate::abci::handler::error::error_into_exception; +use crate::error::execution::ExecutionError; +use crate::error::Error; +use crate::platform_types::platform::Platform; +use crate::rpc::core::CoreRPCLike; +use drive::grovedb::Transaction; +use std::fmt::Debug; +use std::sync::RwLock; +use tenderdash_abci::proto::abci as proto; + +/// AbciApp is an implementation of ABCI Application, as defined by Tenderdash. +/// +/// AbciApp implements logic that should be triggered when Tenderdash performs various operations, like +/// creating new proposal or finalizing new block. +pub struct FullAbciApplication<'a, C> { + /// Platform + pub platform: &'a Platform, + /// The current transaction + pub transaction: RwLock>>, +} + +impl<'a, C> FullAbciApplication<'a, C> { + /// Create new ABCI app + pub fn new(platform: &'a Platform) -> Self { + Self { + platform, + transaction: RwLock::new(None), + } + } +} + +impl<'a, C> PlatformApplication for FullAbciApplication<'a, C> { + fn platform(&self) -> &Platform { + self.platform + } +} + +impl<'a, C> TransactionalApplication<'a> for FullAbciApplication<'a, C> { + /// create and store a new transaction + fn start_transaction(&self) { + let transaction = self.platform.drive.grove.start_transaction(); + self.transaction.write().unwrap().replace(transaction); + } + + fn transaction(&self) -> &RwLock>> { + &self.transaction + } + + /// Commit a transaction + fn commit_transaction(&self) -> Result<(), Error> { + let transaction = self + .transaction + .write() + .unwrap() + .take() + .ok_or(Error::Execution(ExecutionError::NotInTransaction( + "trying to commit a transaction, but we are not in one", + )))?; + let platform_state = self.platform.state.read().unwrap(); + let platform_version = platform_state.current_platform_version()?; + self.platform + .drive + .commit_transaction(transaction, &platform_version.drive) + .map_err(Error::Drive) + } +} + +impl<'a, C> Debug for FullAbciApplication<'a, C> { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "") + } +} + +impl<'a, C> tenderdash_abci::Application for FullAbciApplication<'a, C> +where + C: CoreRPCLike, +{ + fn info( + &self, + request: proto::RequestInfo, + ) -> Result { + handler::info(self, request).map_err(error_into_exception) + } + + fn init_chain( + &self, + request: proto::RequestInitChain, + ) -> Result { + handler::init_chain(self, request).map_err(error_into_exception) + } + + fn query( + &self, + _request: proto::RequestQuery, + ) -> Result { + unreachable!("query is not supported in full ABCI application") + } + + fn check_tx( + &self, + request: proto::RequestCheckTx, + ) -> Result { + handler::check_tx(self.platform, request).map_err(error_into_exception) + } + + fn extend_vote( + &self, + request: proto::RequestExtendVote, + ) -> Result { + handler::extend_vote(self, request).map_err(error_into_exception) + } + + fn finalize_block( + &self, + request: proto::RequestFinalizeBlock, + ) -> Result { + handler::finalize_block(self, request).map_err(error_into_exception) + } + + fn prepare_proposal( + &self, + request: proto::RequestPrepareProposal, + ) -> Result { + handler::prepare_proposal(self, request).map_err(error_into_exception) + } + + fn process_proposal( + &self, + request: proto::RequestProcessProposal, + ) -> Result { + handler::process_proposal(self, request).map_err(error_into_exception) + } + + fn verify_vote_extension( + &self, + request: proto::RequestVerifyVoteExtension, + ) -> Result { + handler::verify_vote_extension(self, request).map_err(error_into_exception) + } +} diff --git a/packages/rs-drive-abci/src/abci/app/mod.rs b/packages/rs-drive-abci/src/abci/app/mod.rs new file mode 100644 index 0000000000..5fbf906eb1 --- /dev/null +++ b/packages/rs-drive-abci/src/abci/app/mod.rs @@ -0,0 +1,33 @@ +use crate::error::Error; +use crate::platform_types::platform::Platform; +use drive::grovedb::Transaction; +use std::sync::RwLock; + +mod check_tx; +mod consensus; +/// Convert state transition execution result into ABCI response +pub mod execution_result; +mod full; + +use crate::rpc::core::DefaultCoreRPC; +pub use check_tx::CheckTxAbciApplication; +pub use consensus::ConsensusAbciApplication; +pub use full::FullAbciApplication; + +/// Platform-based ABCI application +pub trait PlatformApplication { + /// Returns Platform + fn platform(&self) -> &Platform; +} + +/// Transactional ABCI application +pub trait TransactionalApplication<'a> { + /// Creates and keeps a new transaction + fn start_transaction(&self); + + /// Returns the current transaction + fn transaction(&self) -> &RwLock>>; + + /// Commits created transaction + fn commit_transaction(&self) -> Result<(), Error>; +} diff --git a/packages/rs-drive-abci/src/abci/config.rs b/packages/rs-drive-abci/src/abci/config.rs index ca28bee122..18f3af7b4c 100644 --- a/packages/rs-drive-abci/src/abci/config.rs +++ b/packages/rs-drive-abci/src/abci/config.rs @@ -20,21 +20,8 @@ pub struct AbciConfig { /// Address should be an URL with scheme `tcp://` or `unix://`, for example: /// - `tcp://127.0.0.1:1234` /// - `unix:///var/run/abci.sock` - #[serde(rename = "abci_bind_address")] - pub bind_address: String, - - /// Address to listen for Prometheus connection. - /// - /// Optional. - /// - /// /// Address should be an URL with scheme `http://`, for example: - /// - `http://127.0.0.1:29090` - /// - /// Port number defaults to [DEFAULT_PROMETHEUS_PORT]. - /// - /// [DEFAULT_PROMETHEUS_PORT]: crate::metrics::DEFAULT_PROMETHEUS_PORT - #[serde(default, rename = "abci_prometheus_bind_address")] - pub prometheus_bind_address: Option, + #[serde(rename = "abci_consensus_bind_address")] + pub consensus_bind_address: String, /// Public keys used for system identity #[serde(flatten)] @@ -71,8 +58,7 @@ impl AbciConfig { impl Default for AbciConfig { fn default() -> Self { Self { - bind_address: "tcp://127.0.0.1:1234".to_string(), - prometheus_bind_address: None, + consensus_bind_address: "tcp://127.0.0.1:1234".to_string(), keys: Keys::new_random_keys_with_seed(18012014, PlatformVersion::first()) .expect("random keys for first version can not error"), //Dash genesis day genesis_height: AbciConfig::default_genesis_height(), diff --git a/packages/rs-drive-abci/src/abci/error.rs b/packages/rs-drive-abci/src/abci/error.rs index 9f0c31d663..1aa1b0a4e3 100644 --- a/packages/rs-drive-abci/src/abci/error.rs +++ b/packages/rs-drive-abci/src/abci/error.rs @@ -1,4 +1,6 @@ +use crate::error::Error; use dpp::bls_signatures::BlsError; +use dpp::consensus::ConsensusError; use tenderdash_abci::proto::abci::ExtendVoteExtension; use tenderdash_abci::proto::types::VoteExtension; @@ -22,6 +24,9 @@ pub enum AbciError { /// Vote extensions signature is invalid #[error("one of vote extension signatures is invalid")] VoteExtensionsSignatureInvalid, + /// Invalid vote extensions verification + #[error("invalid vote extensions verification")] + InvalidVoteExtensionsVerification, /// Cannot load withdrawal transactions #[error("cannot load withdrawal transactions: {0}")] WithdrawalTransactionsDBLoadError(String), @@ -74,14 +79,16 @@ pub enum AbciError { #[error("bls error from Tenderdash for threshold mechanisms: {1}: {0}")] BlsErrorOfTenderdashThresholdMechanism(BlsError, String), - /// Generic with code should only be used in tests - #[error("generic with code: {0}")] - GenericWithCode(u32), -} + /// Incompatibility version Error on info handshake between Drive ABCI and Tenderdash + #[error("ABCI version mismatch. Tenderdash requires ABCI protobuf definitions version {tenderdash}, our version is {drive}")] + AbciVersionMismatch { + /// ABCI version in Tenderdash + tenderdash: String, + /// ABCI version in Drive ABCI + drive: String, + }, -// used by `?` operator -impl From for String { - fn from(value: AbciError) -> Self { - value.to_string() - } + /// Generic with code should only be used in tests + #[error("invalid state transition error: {0}")] + InvalidStateTransition(#[from] ConsensusError), } diff --git a/packages/rs-drive-abci/src/abci/handler/check_tx.rs b/packages/rs-drive-abci/src/abci/handler/check_tx.rs new file mode 100644 index 0000000000..39063c26b5 --- /dev/null +++ b/packages/rs-drive-abci/src/abci/handler/check_tx.rs @@ -0,0 +1,78 @@ +use crate::abci::handler::error::consensus::AbciResponseInfoGetter; +use crate::abci::handler::error::HandlerError; +use crate::error::Error; +use crate::platform_types::platform::Platform; +use crate::rpc::core::CoreRPCLike; +use dpp::consensus::codes::ErrorWithCode; +use dpp::fee::SignedCredits; +use tenderdash_abci::proto::abci as proto; + +pub fn check_tx( + platform: &Platform, + request: proto::RequestCheckTx, +) -> Result +where + C: CoreRPCLike, +{ + let _timer = crate::metrics::abci_request_duration("check_tx"); + + let platform_state = platform.state.read().unwrap(); + let platform_version = platform_state.current_platform_version()?; + drop(platform_state); + + let proto::RequestCheckTx { tx, r#type } = request; + match platform.check_tx(tx.as_slice(), r#type.try_into()?, platform_version) { + Ok(validation_result) => { + let first_consensus_error = validation_result.errors.first(); + + let (code, info) = if let Some(consensus_error) = first_consensus_error { + ( + consensus_error.code(), + consensus_error.response_info_for_version(platform_version)?, + ) + } else { + // If there are no execution errors the code will be 0 + (0, "".to_string()) + }; + + let check_tx_result = validation_result.data.unwrap_or_default(); + + let gas_wanted = check_tx_result + .fee_result + .map(|fee_result| fee_result.total_base_fee()) + .unwrap_or_default(); + + // Todo: IMPORTANT We need tenderdash to support multiple senders + let first_unique_identifier = check_tx_result + .unique_identifiers + .first() + .cloned() + .unwrap_or_default(); + + Ok(proto::ResponseCheckTx { + code, + data: vec![], + info, + gas_wanted: gas_wanted as SignedCredits, + codespace: "".to_string(), + sender: first_unique_identifier, + priority: 0, + }) + } + Err(error) => { + let handler_error = HandlerError::Internal(error.to_string()); + + tracing::error!(?error, "check_tx failed"); + + Ok(proto::ResponseCheckTx { + code: handler_error.code(), + data: vec![], + info: handler_error.response_info()?, + gas_wanted: 0 as SignedCredits, + codespace: "".to_string(), + sender: "".to_string(), + priority: 0, + }) + } + } +} diff --git a/packages/rs-drive-abci/src/abci/handler/echo.rs b/packages/rs-drive-abci/src/abci/handler/echo.rs new file mode 100644 index 0000000000..7e8f60db3a --- /dev/null +++ b/packages/rs-drive-abci/src/abci/handler/echo.rs @@ -0,0 +1,14 @@ +use crate::abci::app::PlatformApplication; +use crate::error::Error; +use crate::rpc::core::CoreRPCLike; +use tenderdash_abci::proto::abci as proto; + +pub fn echo(_app: &A, request: proto::RequestEcho) -> Result +where + A: PlatformApplication, + C: CoreRPCLike, +{ + Ok(proto::ResponseEcho { + message: request.message, + }) +} diff --git a/packages/rs-drive-abci/src/abci/handler/error/mod.rs b/packages/rs-drive-abci/src/abci/handler/error/mod.rs index 7a832b0f7e..19735ff6d4 100644 --- a/packages/rs-drive-abci/src/abci/handler/error/mod.rs +++ b/packages/rs-drive-abci/src/abci/handler/error/mod.rs @@ -6,7 +6,7 @@ use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; use dpp::platform_value::platform_value; use dpp::platform_value::string_encoding::{encode, Encoding}; -use tenderdash_abci::proto::abci::ResponseException; +use tenderdash_abci::proto::abci as proto; /// ABCI handlers errors #[derive(Debug, thiserror::Error)] @@ -151,15 +151,14 @@ impl HandlerError { } /// Returns base64-encoded message for info field of ABCI handler responses - pub fn response_info(&self) -> Result { + pub fn response_info(&self) -> Result { let error_data_buffer = platform_value!({ "message": self.message(), // TODO: consider capturing stack with one of the libs // and send it to the client //"stack": "..." }) - .to_cbor_buffer() - .map_err(|e| ResponseException::from(Error::Protocol(e.into())))?; + .to_cbor_buffer()?; let error_data_base64 = encode(&error_data_buffer, Encoding::Base64); @@ -191,3 +190,9 @@ impl From<&Error> for HandlerError { Self::Internal(value.to_string()) } } + +pub fn error_into_exception(error: Error) -> proto::ResponseException { + proto::ResponseException { + error: error.to_string(), + } +} diff --git a/packages/rs-drive-abci/src/abci/handler/extend_vote.rs b/packages/rs-drive-abci/src/abci/handler/extend_vote.rs new file mode 100644 index 0000000000..ae4943adcb --- /dev/null +++ b/packages/rs-drive-abci/src/abci/handler/extend_vote.rs @@ -0,0 +1,54 @@ +use crate::abci::app::{PlatformApplication, TransactionalApplication}; +use crate::abci::AbciError; +use crate::error::execution::ExecutionError; +use crate::error::Error; +use crate::execution::types::block_execution_context::v0::BlockExecutionContextV0Getters; +use crate::execution::types::block_state_info::v0::{ + BlockStateInfoV0Getters, BlockStateInfoV0Methods, +}; +use crate::rpc::core::CoreRPCLike; +use tenderdash_abci::proto::abci as proto; + +pub fn extend_vote<'a, A, C>( + app: &A, + request: proto::RequestExtendVote, +) -> Result +where + A: PlatformApplication + TransactionalApplication<'a>, + C: CoreRPCLike, +{ + let _timer = crate::metrics::abci_request_duration("extend_vote"); + + let proto::RequestExtendVote { + hash: block_hash, + height, + round, + } = request; + let guarded_block_execution_context = app.platform().block_execution_context.read().unwrap(); + let block_execution_context = + guarded_block_execution_context + .as_ref() + .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( + "block execution context must be set in block begin handler for extend vote", + )))?; + + // Verify Tenderdash that it called this handler correctly + let block_state_info = &block_execution_context.block_state_info(); + + if !block_state_info.matches_current_block(height as u64, round as u32, block_hash.clone())? { + return Err(Error::from(AbciError::RequestForWrongBlockReceived(format!( + "received extend vote request for height: {} round: {}, block: {}; expected height: {} round: {}, block: {}", + height, round, hex::encode(block_hash), + block_state_info.height(), block_state_info.round(), block_state_info.block_hash().map(hex::encode).unwrap_or("None".to_string()) + ))) + .into()); + } + + // Extend vote with unsigned withdrawal transactions + // we only want to sign the hash of the transaction + let vote_extensions = block_execution_context + .unsigned_withdrawal_transactions() + .into(); + + Ok(proto::ResponseExtendVote { vote_extensions }) +} diff --git a/packages/rs-drive-abci/src/abci/handler/finalize_block.rs b/packages/rs-drive-abci/src/abci/handler/finalize_block.rs new file mode 100644 index 0000000000..f718092435 --- /dev/null +++ b/packages/rs-drive-abci/src/abci/handler/finalize_block.rs @@ -0,0 +1,51 @@ +use crate::abci::app::{PlatformApplication, TransactionalApplication}; +use crate::error::execution::ExecutionError; +use crate::error::Error; +use crate::rpc::core::CoreRPCLike; +use tenderdash_abci::proto::abci as proto; + +pub fn finalize_block<'a, A, C>( + app: &A, + request: proto::RequestFinalizeBlock, +) -> Result +where + A: PlatformApplication + TransactionalApplication<'a>, + C: CoreRPCLike, +{ + let _timer = crate::metrics::abci_request_duration("finalize_block"); + + let transaction_guard = app.transaction().read().unwrap(); + + let transaction = + transaction_guard + .as_ref() + .ok_or(Error::Execution(ExecutionError::NotInTransaction( + "trying to finalize block without a current transaction", + )))?; + + let block_finalization_outcome = app + .platform() + .finalize_block_proposal(request.try_into()?, transaction)?; + + //FIXME: tell tenderdash about the problem instead + // This can not go to production! + if !block_finalization_outcome.validation_result.is_valid() { + return Err(Error::Abci( + block_finalization_outcome + .validation_result + .errors + .into_iter() + .next() + .unwrap(), + )); + } + + drop(transaction_guard); + + app.commit_transaction()?; + + Ok(proto::ResponseFinalizeBlock { + events: vec![], + retain_height: 0, + }) +} diff --git a/packages/rs-drive-abci/src/abci/handler/info.rs b/packages/rs-drive-abci/src/abci/handler/info.rs new file mode 100644 index 0000000000..71a299dc87 --- /dev/null +++ b/packages/rs-drive-abci/src/abci/handler/info.rs @@ -0,0 +1,57 @@ +use crate::abci::app::PlatformApplication; +use crate::abci::AbciError; +use crate::error::Error; +use crate::platform_types::platform_state::v0::PlatformStateV0Methods; +use crate::rpc::core::CoreRPCLike; +use dpp::version::PlatformVersion; +use tenderdash_abci::proto::abci as proto; + +pub fn info(app: &A, request: proto::RequestInfo) -> Result +where + A: PlatformApplication, + C: CoreRPCLike, +{ + if !tenderdash_abci::check_version(&request.abci_version) { + return Err(AbciError::AbciVersionMismatch { + tenderdash: request.abci_version, + drive: tenderdash_abci::proto::ABCI_VERSION.to_string(), + } + .into()); + } + + let state_guard = app.platform().state.read().unwrap(); + + let state_app_hash = state_guard + .last_committed_block_app_hash() + .map(|app_hash| app_hash.to_vec()) + .unwrap_or_default(); + + let latest_platform_version = PlatformVersion::latest(); + + let response = proto::ResponseInfo { + data: "".to_string(), + app_version: latest_platform_version.protocol_version as u64, + last_block_height: state_guard.last_committed_block_height() as i64, + version: env!("CARGO_PKG_VERSION").to_string(), + last_block_app_hash: state_app_hash.clone(), + }; + + tracing::debug!( + protocol_version = latest_platform_version.protocol_version, + software_version = env!("CARGO_PKG_VERSION"), + block_version = request.block_version, + p2p_version = request.p2p_version, + app_hash = hex::encode(state_app_hash), + height = state_guard.last_committed_block_height(), + "Handshake with consensus engine", + ); + + if tracing::enabled!(tracing::Level::TRACE) { + tracing::trace!( + platform_state_fingerprint = hex::encode(state_guard.fingerprint()), + "platform runtime state", + ); + } + + Ok(response) +} diff --git a/packages/rs-drive-abci/src/abci/handler/init_chain.rs b/packages/rs-drive-abci/src/abci/handler/init_chain.rs new file mode 100644 index 0000000000..883217835f --- /dev/null +++ b/packages/rs-drive-abci/src/abci/handler/init_chain.rs @@ -0,0 +1,49 @@ +use crate::abci::app::{PlatformApplication, TransactionalApplication}; +use crate::error::Error; +use crate::platform_types::platform_state::PlatformState; +use crate::rpc::core::CoreRPCLike; +use tenderdash_abci::proto::abci as proto; + +pub fn init_chain<'a, A, C>( + app: &A, + request: proto::RequestInitChain, +) -> Result +where + A: PlatformApplication + TransactionalApplication<'a>, + C: CoreRPCLike, +{ + app.start_transaction(); + + let chain_id = request.chain_id.to_string(); + + // We need to drop the block execution context just in case init chain had already been called + let mut block_execution_context = app.platform().block_execution_context.write().unwrap(); + let block_context = block_execution_context.take(); //drop the block execution context + if block_context.is_some() { + tracing::warn!("block context was present during init chain, restarting"); + let protocol_version_in_consensus = app.platform().config.initial_protocol_version; + let mut platform_state_write_guard = app.platform().state.write().unwrap(); + *platform_state_write_guard = PlatformState::default_with_protocol_versions( + protocol_version_in_consensus, + protocol_version_in_consensus, + ); + drop(platform_state_write_guard); + } + drop(block_execution_context); + + let transaction_guard = app.transaction().read().unwrap(); + let transaction = transaction_guard.as_ref().unwrap(); + let response = app.platform().init_chain(request, transaction)?; + + transaction.set_savepoint(); + + let app_hash = hex::encode(&response.app_hash); + + tracing::info!( + app_hash, + chain_id, + "Platform chain initialized, initial state is created" + ); + + Ok(response) +} diff --git a/packages/rs-drive-abci/src/abci/handler/mod.rs b/packages/rs-drive-abci/src/abci/handler/mod.rs index 8bc4c6ae50..8acd0737eb 100644 --- a/packages/rs-drive-abci/src/abci/handler/mod.rs +++ b/packages/rs-drive-abci/src/abci/handler/mod.rs @@ -35,1390 +35,23 @@ //! can only make changes that are backwards compatible. Otherwise new calls must be made instead. //! -mod error; -mod execution_result; - -use crate::abci::server::AbciApplication; -use crate::error::execution::ExecutionError; - -use super::AbciError; -use crate::error::Error; -use crate::rpc::core::CoreRPCLike; -use dpp::errors::consensus::codes::ErrorWithCode; -use tenderdash_abci::proto::abci as proto; -use tenderdash_abci::proto::abci::response_verify_vote_extension::VerifyStatus; -use tenderdash_abci::proto::abci::tx_record::TxAction; -use tenderdash_abci::proto::abci::{ - ExecTxResult, ExtendVoteExtension, RequestCheckTx, RequestFinalizeBlock, RequestInitChain, - RequestPrepareProposal, RequestProcessProposal, RequestQuery, ResponseCheckTx, - ResponseFinalizeBlock, ResponseInitChain, ResponsePrepareProposal, ResponseProcessProposal, - ResponseQuery, TxRecord, -}; -use tenderdash_abci::proto::types::CoreChainLock; - -use crate::execution::types::block_execution_context::v0::{ - BlockExecutionContextV0Getters, BlockExecutionContextV0MutableGetters, - BlockExecutionContextV0Setters, -}; -use crate::execution::types::block_state_info::v0::{ - BlockStateInfoV0Getters, BlockStateInfoV0Methods, BlockStateInfoV0Setters, -}; -use crate::platform_types::block_execution_outcome; -use crate::platform_types::block_proposal::v0::BlockProposal; -use crate::platform_types::platform_state::v0::PlatformStateV0Methods; -use crate::platform_types::platform_state::PlatformState; -use crate::platform_types::state_transitions_processing_result::StateTransitionExecutionResult; -use dpp::dashcore::hashes::Hash; -use dpp::fee::SignedCredits; -use dpp::version::TryIntoPlatformVersioned; -use dpp::version::{PlatformVersion, PlatformVersionCurrentVersion}; -use error::consensus::AbciResponseInfoGetter; -use error::HandlerError; - -impl<'a, C> tenderdash_abci::Application for AbciApplication<'a, C> -where - C: CoreRPCLike, -{ - fn info( - &self, - request: proto::RequestInfo, - ) -> Result { - let state_guard = self.platform.state.read().unwrap(); - - if !tenderdash_abci::check_version(&request.abci_version) { - return Err(proto::ResponseException::from(format!( - "tenderdash requires protobuf definitions version {}, our version is {}", - request.abci_version, - tenderdash_abci::proto::ABCI_VERSION - ))); - } - - let state_app_hash = state_guard - .last_committed_block_app_hash() - .map(|app_hash| app_hash.to_vec()) - .unwrap_or_default(); - - let latest_platform_version = PlatformVersion::latest(); - - let response = proto::ResponseInfo { - data: "".to_string(), - app_version: latest_platform_version.protocol_version as u64, - last_block_height: state_guard.last_committed_block_height() as i64, - version: env!("CARGO_PKG_VERSION").to_string(), - last_block_app_hash: state_app_hash.clone(), - }; - - tracing::debug!( - protocol_version = latest_platform_version.protocol_version, - software_version = env!("CARGO_PKG_VERSION"), - block_version = request.block_version, - p2p_version = request.p2p_version, - app_hash = hex::encode(state_app_hash), - height = state_guard.last_committed_block_height(), - "Handshake with consensus engine", - ); - - if tracing::enabled!(tracing::Level::TRACE) { - tracing::trace!( - platform_state_fingerprint = hex::encode(state_guard.fingerprint()), - "platform runtime state", - ); - } - - Ok(response) - } - - fn init_chain( - &self, - request: RequestInitChain, - ) -> Result { - self.start_transaction(); - let chain_id = request.chain_id.to_string(); - - // We need to drop the block execution context just in case init chain had already been called - let mut block_execution_context = self.platform.block_execution_context.write().unwrap(); - let block_context = block_execution_context.take(); //drop the block execution context - if block_context.is_some() { - tracing::warn!("block context was present during init chain, restarting"); - let protocol_version_in_consensus = self.platform.config.initial_protocol_version; - let mut platform_state_write_guard = self.platform.state.write().unwrap(); - *platform_state_write_guard = PlatformState::default_with_protocol_versions( - protocol_version_in_consensus, - protocol_version_in_consensus, - ); - drop(platform_state_write_guard); - } - drop(block_execution_context); - - let transaction_guard = self.transaction.read().unwrap(); - let transaction = transaction_guard.as_ref().unwrap(); - let response = self.platform.init_chain(request, transaction)?; - - transaction.set_savepoint(); - - let app_hash = hex::encode(&response.app_hash); - - tracing::info!( - app_hash, - chain_id, - "Platform chain initialized, initial state is created" - ); - - Ok(response) - } - - fn prepare_proposal( - &self, - mut request: RequestPrepareProposal, - ) -> Result { - let timer = crate::metrics::abci_request_duration("prepare_proposal"); - - // We should get the latest CoreChainLock from core - // It is possible that we will not get a chain lock from core, in this case, just don't - // propose one - // This is done before all else - - let state = self.platform.state.read().unwrap(); - - let last_committed_core_height = state.last_committed_core_height(); - - let core_chain_lock_update = match self.platform.core_rpc.get_best_chain_lock() { - Ok(latest_chain_lock) => { - if state.last_committed_block_info().is_none() - || latest_chain_lock.block_height > last_committed_core_height - { - Some(latest_chain_lock) - } else { - None - } - } - Err(_) => None, - }; - - drop(state); - - // Filter out transactions exceeding max_block_size - let mut transactions_exceeding_max_block_size = Vec::new(); - { - let mut total_transactions_size = 0; - let mut index_to_remove_at = None; - for (i, raw_transaction) in request.txs.iter().enumerate() { - total_transactions_size += raw_transaction.len(); - - if total_transactions_size as i64 > request.max_tx_bytes { - index_to_remove_at = Some(i); - break; - } - } - - if let Some(index_to_remove_at) = index_to_remove_at { - transactions_exceeding_max_block_size - .extend(request.txs.drain(index_to_remove_at..)); - } - } - - let mut block_proposal: BlockProposal = (&request).try_into()?; - - if let Some(core_chain_lock_update) = core_chain_lock_update.as_ref() { - // We can't add this, as it slows down CI way too much - // todo: find a way to re-enable this without destroying CI - tracing::debug!( - "propose chain lock update to height {} at block {}", - core_chain_lock_update.block_height, - request.height - ); - block_proposal.core_chain_locked_height = core_chain_lock_update.block_height; - } else { - block_proposal.core_chain_locked_height = last_committed_core_height; - } - - // Prepare transaction - let transaction_guard = if request.height == self.platform.config.abci.genesis_height as i64 - { - // special logic on init chain - let transaction = self.transaction.read().unwrap(); - if transaction.is_none() { - return Err(Error::Abci(AbciError::BadRequest("received a prepare proposal request for the genesis height before an init chain request".to_string())))?; - } - if request.round > 0 { - transaction.as_ref().map(|tx| tx.rollback_to_savepoint()); - } - transaction - } else { - self.start_transaction(); - self.transaction.read().unwrap() - }; - - let transaction = transaction_guard.as_ref().unwrap(); - - // Running the proposal executes all the state transitions for the block - let run_result = self - .platform - .run_block_proposal(block_proposal, true, transaction)?; - - if !run_result.is_valid() { - // This is a system error, because we are proposing - return Err(run_result.errors.first().unwrap().to_string().into()); - } - - let block_execution_outcome::v0::BlockExecutionOutcome { - app_hash, - state_transitions_result, - validator_set_update, - protocol_version, - } = run_result.into_data().map_err(Error::Protocol)?; - - let platform_version = PlatformVersion::get(protocol_version) - .expect("must be set in run block proposal from existing protocol version"); - - // We need to let Tenderdash know about the transactions we should remove from execution - let valid_tx_count = state_transitions_result.valid_count(); - let failed_tx_count = state_transitions_result.failed_count(); - let delayed_tx_count = transactions_exceeding_max_block_size.len(); - let invalid_paid_tx_count = state_transitions_result.invalid_paid_count(); - let invalid_unpaid_tx_count = state_transitions_result.invalid_unpaid_count(); - - let mut tx_results = Vec::new(); - let mut tx_records = Vec::new(); - - for (state_transition_execution_result, raw_state_transition) in state_transitions_result - .into_execution_results() - .into_iter() - .zip(request.txs) - { - let tx_action = match &state_transition_execution_result { - StateTransitionExecutionResult::SuccessfulExecution(_, _) => TxAction::Unmodified, - // We have identity to pay for the state transition, so we keep it in the block - StateTransitionExecutionResult::PaidConsensusError(..) => TxAction::Unmodified, - // We don't have any associated identity to pay for the state transition, - // so we remove it from the block to prevent spam attacks. - // Such state transitions must be invalidated by check tx, but they might - // still be added to mempool due to inconsistency between check tx and tx processing - // (fees calculation) or malicious proposer. - StateTransitionExecutionResult::UnpaidConsensusError(_) => TxAction::Removed, - // We shouldn't include in the block any state transitions that produced an internal error - // during execution - StateTransitionExecutionResult::DriveAbciError(_) => TxAction::Removed, - }; - - let tx_result: ExecTxResult = - state_transition_execution_result.try_into_platform_versioned(platform_version)?; - - if tx_action != TxAction::Removed { - tx_results.push(tx_result); - } - - tx_records.push(TxRecord { - action: tx_action.into(), - tx: raw_state_transition, - }); - } - - // Add up exceeding transactions to the response - tx_records.extend( - transactions_exceeding_max_block_size - .into_iter() - .map(|tx| TxRecord { - action: TxAction::Delayed as i32, - tx, - }), - ); - - let response = ResponsePrepareProposal { - tx_results, - app_hash: app_hash.to_vec(), - tx_records, - core_chain_lock_update: core_chain_lock_update.map(|chain_lock| CoreChainLock { - core_block_hash: chain_lock.block_hash.to_byte_array().to_vec(), - core_block_height: chain_lock.block_height, - signature: chain_lock.signature.to_bytes().to_vec(), - }), - validator_set_update, - // TODO: implement consensus param updates - consensus_param_updates: None, - }; - - let mut block_execution_context_guard = - self.platform.block_execution_context.write().unwrap(); - - let block_execution_context = block_execution_context_guard - .as_mut() - .expect("expected that a block execution context was set"); - block_execution_context.set_proposer_results(Some(response.clone())); - - let elapsed_time_ms = timer.elapsed().as_millis(); - - tracing::info!( - invalid_paid_tx_count, - invalid_unpaid_tx_count, - valid_tx_count, - delayed_tx_count, - failed_tx_count, - "Prepared proposal with {} transitions for height: {}, round: {} in {} ms", - valid_tx_count + invalid_paid_tx_count, - request.height, - request.round, - elapsed_time_ms, - ); - - Ok(response) - } - - fn process_proposal( - &self, - request: RequestProcessProposal, - ) -> Result { - let timer = crate::metrics::abci_request_duration("process_proposal"); - - let mut block_execution_context_guard = - self.platform.block_execution_context.write().unwrap(); - - let mut drop_block_execution_context = false; - if let Some(block_execution_context) = block_execution_context_guard.as_mut() { - // We are already in a block, or in init chain. - // This only makes sense if we were the proposer unless we are at a future round - if block_execution_context.block_state_info().round() != (request.round as u32) { - // We were not the proposer, and we should process something new - drop_block_execution_context = true; - } else if let Some(current_block_hash) = - block_execution_context.block_state_info().block_hash() - { - // There is also the possibility that this block already came in, but tenderdash crashed - // Now tenderdash is sending it again - if let Some(proposal_info) = block_execution_context.proposer_results() { - tracing::debug!( - method = "process_proposal", - ?proposal_info, // TODO: It might be too big for debug - "we knew block hash, block execution context already had a proposer result", - ); - // We were the proposer as well, so we have the result in cache - return Ok(ResponseProcessProposal { - status: proto::response_process_proposal::ProposalStatus::Accept.into(), - app_hash: proposal_info.app_hash.clone(), - tx_results: proposal_info.tx_results.clone(), - consensus_param_updates: proposal_info.consensus_param_updates.clone(), - validator_set_update: proposal_info.validator_set_update.clone(), - }); - } - - if current_block_hash.as_slice() == request.hash { - // We were not the proposer, just drop the execution context - tracing::warn!( - method = "process_proposal", - ?request, // Shumkov, lklimek: this structure might be very big and we already logged it such as all other ABCI requests and responses - "block execution context already existed, but we are running it again for same height {}/round {}", - request.height, - request.round, - ); - drop_block_execution_context = true; - } else { - // We are getting a different block hash for a block of the same round - // This is a terrible issue - return Err(Error::Abci(AbciError::BadRequest( - "received a process proposal request twice with different hash".to_string(), - )))?; - } - } else { - let Some(proposal_info) = block_execution_context.proposer_results() else { - return Err(Error::Abci(AbciError::BadRequest( - "received a process proposal request twice".to_string(), - )))?; - }; - - let expected_transactions = proposal_info - .tx_records - .iter() - .filter_map(|record| { - if record.action == TxAction::Removed as i32 - || record.action == TxAction::Delayed as i32 - { - None - } else { - Some(&record.tx) - } - }) - .collect::>(); - - // While it is true that the length could be same, seeing how this is such a rare situation - // It does not seem worth to deal with situations where the length is the same but the transactions have changed - if expected_transactions.len() == request.txs.len() - && proposal_info.core_chain_lock_update == request.core_chain_lock_update - { - let (app_hash, tx_results, consensus_param_updates, validator_set_update) = { - tracing::debug!( - method = "process_proposal", - "we didn't know block hash (we were most likely proposer), block execution context already had a proposer result {:?}", - proposal_info, - ); - - // Cloning all required properties from proposal_info and then dropping it - let app_hash = proposal_info.app_hash.clone(); - let tx_results = proposal_info.tx_results.clone(); - let consensus_param_updates = proposal_info.consensus_param_updates.clone(); - let validator_set_update = proposal_info.validator_set_update.clone(); - ( - app_hash, - tx_results, - consensus_param_updates, - validator_set_update, - ) - }; - - // We need to set the block hash - block_execution_context - .block_state_info_mut() - .set_block_hash(Some(request.hash.clone().try_into().map_err(|_| { - Error::Abci(AbciError::BadRequestDataSize( - "block hash is not 32 bytes in process proposal".to_string(), - )) - })?)); - return Ok(ResponseProcessProposal { - status: proto::response_process_proposal::ProposalStatus::Accept.into(), - app_hash, - tx_results, - consensus_param_updates, - validator_set_update, - }); - } else { - tracing::warn!( - method = "process_proposal", - "we didn't know block hash (we were most likely proposer), block execution context already had a proposer result {:?}, but we are requesting a different amount of transactions, dropping the cache", - proposal_info, - ); - - drop_block_execution_context = true; - }; - } - } - - if drop_block_execution_context { - *block_execution_context_guard = None; - } - drop(block_execution_context_guard); - - // Get transaction - let transaction_guard = if request.height == self.platform.config.abci.genesis_height as i64 - { - // special logic on init chain - let transaction = self.transaction.read().unwrap(); - if transaction.is_none() { - return Err(Error::Abci(AbciError::BadRequest("received a process proposal request for the genesis height before an init chain request".to_string())))?; - } - if request.round > 0 { - transaction.as_ref().map(|tx| tx.rollback_to_savepoint()); - } - transaction - } else { - self.start_transaction(); - self.transaction.read().unwrap() - }; - let transaction = transaction_guard.as_ref().unwrap(); - - // Running the proposal executes all the state transitions for the block - let run_result = - self.platform - .run_block_proposal((&request).try_into()?, false, transaction)?; - - if !run_result.is_valid() { - // This was an error running this proposal, tell tenderdash that the block isn't valid - let response = ResponseProcessProposal { - status: proto::response_process_proposal::ProposalStatus::Reject.into(), - app_hash: [0; 32].to_vec(), // we must send 32 bytes - ..Default::default() - }; - - tracing::warn!( - errors = ?run_result.errors, - "Rejected invalid proposal for height: {}, round: {}", - request.height, - request.round, - ); - - Ok(response) - } else { - let block_execution_outcome::v0::BlockExecutionOutcome { - app_hash, - state_transitions_result: state_transition_results, - validator_set_update, - protocol_version, - } = run_result.into_data().map_err(Error::Protocol)?; - - let platform_version = PlatformVersion::get(protocol_version) - .expect("must be set in run block proposer from existing platform version"); - - let invalid_tx_count = state_transition_results.invalid_paid_count(); - let valid_tx_count = state_transition_results.valid_count(); - - let tx_results = state_transition_results - .into_execution_results() - .into_iter() - // To prevent spam attacks we add to the block state transitions covered with fees only - .filter(|execution_result| { - matches!( - execution_result, - StateTransitionExecutionResult::SuccessfulExecution(_, _) - | StateTransitionExecutionResult::PaidConsensusError(..) - ) - }) - .map(|execution_result| { - execution_result.try_into_platform_versioned(platform_version) - }) - .collect::>()?; - - let response = ResponseProcessProposal { - app_hash: app_hash.to_vec(), - tx_results, - status: proto::response_process_proposal::ProposalStatus::Accept.into(), - validator_set_update, - // TODO: Implement consensus param updates - consensus_param_updates: None, - }; - - let elapsed_time_ms = timer.elapsed().as_millis(); - - tracing::info!( - invalid_tx_count, - valid_tx_count, - elapsed_time_ms, - "Processed proposal with {} transactions for height: {}, round: {} in {} ms", - valid_tx_count + invalid_tx_count, - request.height, - request.round, - elapsed_time_ms, - ); - - Ok(response) - } - } - - fn extend_vote( - &self, - request: proto::RequestExtendVote, - ) -> Result { - let _timer = crate::metrics::abci_request_duration("extend_vote"); - - let proto::RequestExtendVote { - hash: block_hash, - height, - round, - } = request; - let guarded_block_execution_context = self.platform.block_execution_context.read().unwrap(); - let block_execution_context = - guarded_block_execution_context - .as_ref() - .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( - "block execution context must be set in block begin handler for extend vote", - )))?; - - // Verify Tenderdash that it called this handler correctly - let block_state_info = &block_execution_context.block_state_info(); - - if !block_state_info.matches_current_block( - height as u64, - round as u32, - block_hash.clone(), - )? { - return Err(Error::from(AbciError::RequestForWrongBlockReceived(format!( - "received extend vote request for height: {} round: {}, block: {}; expected height: {} round: {}, block: {}", - height, round, hex::encode(block_hash), - block_state_info.height(), block_state_info.round(), block_state_info.block_hash().map(hex::encode).unwrap_or("None".to_string()) - ))) - .into()); - } - - // Extend vote with unsigned withdrawal transactions - // we only want to sign the hash of the transaction - let vote_extensions = block_execution_context - .unsigned_withdrawal_transactions() - .into(); - - Ok(proto::ResponseExtendVote { vote_extensions }) - } - - /// Todo: Verify vote extension not really needed because extend vote is deterministic - fn verify_vote_extension( - &self, - request: proto::RequestVerifyVoteExtension, - ) -> Result { - let _timer = crate::metrics::abci_request_duration("verify_vote_extension"); - - // Verify that this is a vote extension for our current executed block and our proposer - let proto::RequestVerifyVoteExtension { - height, - round, - vote_extensions, - .. - } = request; - - let height: u64 = height as u64; - let round: u32 = round as u32; - - // Make sure we are in a block execution phase - let guarded_block_execution_context = self.platform.block_execution_context.read().unwrap(); - let Some(block_execution_context) = guarded_block_execution_context.as_ref() else { - tracing::warn!( - "vote extensions for height: {}, round: {} are rejected because we are not in a block execution phase", - height, - round, - ); - - return Ok(proto::ResponseVerifyVoteExtension { - status: VerifyStatus::Reject.into(), - }); - }; - - // Make sure vote extension is for our currently executing block - - let block_state_info = block_execution_context.block_state_info(); - - // We might get vote extension to verify for previous (in case if other node is behind) - // or future round (in case if the current node is behind), so we make sure that only height - // is matching. It's fine because withdrawal transactions to sign are the same for any round - // of the same height - if block_state_info.height() != height { - tracing::warn!( - "vote extensions for height: {}, round: {} are rejected because we are at height: {}", - height, - round, - block_state_info.height(), - ); - - return Ok(proto::ResponseVerifyVoteExtension { - status: VerifyStatus::Reject.into(), - }); - } - - // Verify that a validator is requesting a signatures - // for a correct set of withdrawal transactions - - let expected_withdrawals = block_execution_context.unsigned_withdrawal_transactions(); - - if expected_withdrawals != &vote_extensions { - let expected_extensions: Vec = expected_withdrawals.into(); - - tracing::error!( - received_extensions = ?vote_extensions, - ?expected_extensions, - "vote extensions for height: {}, round: {} mismatch", - height, round - ); - - return Ok(proto::ResponseVerifyVoteExtension { - status: VerifyStatus::Reject.into(), - }); - } - - tracing::debug!( - "vote extensions for height: {}, round: {} are successfully verified", - height, - round, - ); - - Ok(proto::ResponseVerifyVoteExtension { - status: VerifyStatus::Accept.into(), - }) - } - - fn finalize_block( - &self, - request: RequestFinalizeBlock, - ) -> Result { - let _timer = crate::metrics::abci_request_duration("finalize_block"); - - let transaction_guard = self.transaction.read().unwrap(); - - let transaction = transaction_guard.as_ref().ok_or(Error::Execution( - ExecutionError::NotInTransaction( - "trying to finalize block without a current transaction", - ), - ))?; - - let block_finalization_outcome = self - .platform - .finalize_block_proposal(request.try_into()?, transaction)?; - - //FIXME: tell tenderdash about the problem instead - // This can not go to production! - if !block_finalization_outcome.validation_result.is_valid() { - return Err(Error::Abci( - block_finalization_outcome - .validation_result - .errors - .into_iter() - .next() - .unwrap(), - ) - .into()); - } - - drop(transaction_guard); - - self.commit_transaction()?; - - Ok(ResponseFinalizeBlock { - events: vec![], - retain_height: 0, - }) - } - - fn check_tx( - &self, - request: RequestCheckTx, - ) -> Result { - let _timer = crate::metrics::abci_request_duration("check_tx"); - - let RequestCheckTx { tx, r#type } = request; - match self.platform.check_tx(tx.as_slice(), r#type.try_into()?) { - Ok(validation_result) => { - let platform_state = self.platform.state.read().unwrap(); - let platform_version = platform_state.current_platform_version()?; - let first_consensus_error = validation_result.errors.first(); - - let (code, info) = if let Some(consensus_error) = first_consensus_error { - ( - consensus_error.code(), - consensus_error - .response_info_for_version(platform_version) - .map_err(proto::ResponseException::from)?, - ) - } else { - // If there are no execution errors the code will be 0 - (0, "".to_string()) - }; - - let check_tx_result = validation_result.data.unwrap_or_default(); - - let gas_wanted = check_tx_result - .fee_result - .map(|fee_result| fee_result.total_base_fee()) - .unwrap_or_default(); - - // Todo: IMPORTANT We need tenderdash to support multiple senders - let first_unique_identifier = check_tx_result - .unique_identifiers - .first() - .cloned() - .unwrap_or_default(); - - Ok(ResponseCheckTx { - code, - data: vec![], - info, - gas_wanted: gas_wanted as SignedCredits, - codespace: "".to_string(), - sender: first_unique_identifier, - priority: 0, - }) - } - Err(error) => { - let handler_error = HandlerError::Internal(error.to_string()); - - tracing::error!(?error, "check_tx failed"); - - Ok(ResponseCheckTx { - code: handler_error.code(), - data: vec![], - info: handler_error.response_info()?, - gas_wanted: 0 as SignedCredits, - codespace: "".to_string(), - sender: "".to_string(), - priority: 0, - }) - } - } - } - - fn query(&self, request: RequestQuery) -> Result { - let _timer = crate::metrics::abci_request_duration("query"); - - let RequestQuery { data, path, .. } = &request; - - // TODO: It must be proto::ResponseException - let Some(platform_version) = PlatformVersion::get_maybe_current() else { - let handler_error = - HandlerError::Unavailable("platform is not initialized".to_string()); - - let response = ResponseQuery { - code: handler_error.code(), - log: "".to_string(), - info: handler_error.response_info()?, - index: 0, - key: vec![], - value: vec![], - proof_ops: None, - height: self.platform.state.read().unwrap().last_committed_height() as i64, - codespace: "".to_string(), - }; - - tracing::error!(?response, "platform version not initialized"); - - return Ok(response); - }; - - let result = self - .platform - .query(path.as_str(), data.as_slice(), platform_version)?; - - let (code, data, info) = if result.is_valid() { - (0, result.data.unwrap_or_default(), "success".to_string()) - } else { - let error = result - .errors - .first() - .expect("validation result should have at least one error"); - - let handler_error = HandlerError::from(error); - - (handler_error.code(), vec![], handler_error.response_info()?) - }; - - let response = ResponseQuery { - //todo: right now just put GRPC error codes, - // later we will use own error codes - code, - log: "".to_string(), - info, - index: 0, - key: vec![], - value: data, - proof_ops: None, - height: self.platform.state.read().unwrap().last_committed_height() as i64, - codespace: "".to_string(), - }; - - Ok(response) - } -} -// -// #[cfg(test)] -// mod tests { -// mod handlers { -// use crate::config::PlatformConfig; -// use crate::rpc::core::MockCoreRPCLike; -// use chrono::{Duration, Utc}; -// use dashcore_rpc::dashcore::hashes::hex::FromHex; -// use dashcore_rpc::dashcore::BlockHash; -// use dpp::contracts::withdrawals_contract; -// -// use dpp::identity::core_script::CoreScript; -// use dpp::identity::state_transition::identity_credit_withdrawal_transition::Pooling; -// use dpp::platform_value::{platform_value, BinaryData}; -// use dpp::prelude::Identifier; -// use dpp::system_data_contracts::{load_system_data_contract, SystemDataContract}; -// use dpp::tests::fixtures::get_withdrawal_document_fixture; -// use dpp::util::hash; -// use drive::common::helpers::identities::create_test_masternode_identities; -// use dpp::block::block_info::BlockInfo; -// use drive::drive::identity::withdrawals::WithdrawalTransactionIdAndBytes; -// use drive::fee::epoch::CreditsPerEpoch; -// use drive::fee_pools::epochs::Epoch; -// use drive::tests::helpers::setup::setup_document; -// use rust_decimal::prelude::ToPrimitive; -// use serde_json::json; -// use std::cmp::Ordering; -// use std::ops::Div; -// use tenderdash_abci::Application; -// use tenderdash_abci::proto::abci::{RequestPrepareProposal, RequestProcessProposal}; -// use tenderdash_abci::proto::google::protobuf::Timestamp; -// -// use crate::abci::messages::{ -// AfterFinalizeBlockRequest, BlockBeginRequest, BlockEndRequest, BlockFees, -// }; -// use crate::platform::Platform; -// use crate::test::fixture::abci::static_init_chain_request; -// use crate::test::helpers::fee_pools::create_test_masternode_share_identities_and_documents; -// use crate::test::helpers::setup::{TempPlatform, TestPlatformBuilder}; -// -// -// fn prepare_withdrawal_test(platform: &TempPlatform) { -// let transaction = platform.drive.grove.start_transaction(); -// //this should happen after -// let data_contract = load_system_data_contract(SystemDataContract::Withdrawals) -// .expect("to load system data contract"); -// -// // Init withdrawal requests -// let withdrawals: Vec = (0..16) -// .map(|index: u64| (index.to_be_bytes().to_vec(), vec![index as u8; 32])) -// .collect(); -// -// let owner_id = Identifier::new([1u8; 32]); -// -// for (_, tx_bytes) in withdrawals.iter() { -// let tx_id = hash::hash(tx_bytes); -// -// let document = get_withdrawal_document_fixture( -// &data_contract, -// owner_id, -// platform_value!({ -// "amount": 1000u64, -// "coreFeePerByte": 1u32, -// "pooling": Pooling::Never as u8, -// "outputScript": CoreScript::from_bytes((0..23).collect::>()), -// "status": withdrawals_contract::WithdrawalStatus::POOLED as u8, -// "transactionIndex": 1u64, -// "transactionSignHeight": 93u64, -// "transactionId": BinaryData::new(tx_id), -// }), -// None, -// ) -// .expect("expected withdrawal document"); -// -// let document_type = data_contract -// .document_type(withdrawals_contract::document_types::WITHDRAWAL) -// .expect("expected to get document type"); -// -// setup_document( -// &platform.drive, -// &document, -// &data_contract, -// document_type, -// Some(&transaction), -// ); -// } -// -// let block_info = BlockInfo { -// time_ms: 1, -// height: 1, -// epoch: Epoch::new(1).unwrap(), -// }; -// -// let mut drive_operations = vec![]; -// -// platform -// .drive -// .add_enqueue_withdrawal_transaction_operations(&withdrawals, &mut drive_operations); -// -// platform -// .drive -// .apply_drive_operations(drive_operations, true, &block_info, Some(&transaction)) -// .expect("to apply drive operations"); -// -// platform.drive.grove.commit_transaction(transaction).unwrap().expect("expected to commit transaction") -// } -// -// #[test] -// fn test_abci_flow_with_withdrawals() { -// let mut platform = TestPlatformBuilder::new() -// .with_config(PlatformConfig { -// verify_sum_trees: false, -// ..Default::default() -// }) -// .build_with_mock_rpc(); -// -// let mut core_rpc_mock = MockCoreRPCLike::new(); -// -// core_rpc_mock -// .expect_get_block_hash() -// // .times(total_days) -// .returning(|_| { -// Ok(BlockHash::from_hex( -// "0000000000000000000000000000000000000000000000000000000000000000", -// ) -// .unwrap()) -// }); -// -// core_rpc_mock -// .expect_get_block_json() -// // .times(total_days) -// .returning(|_| Ok(json!({}))); -// -// platform.core_rpc = core_rpc_mock; -// -// // init chain -// let init_chain_request = static_init_chain_request(); -// -// platform -// .init_chain(init_chain_request) -// .expect("should init chain"); -// -// prepare_withdrawal_test(&platform); -// -// let transaction = platform.drive.grove.start_transaction(); -// -// // setup the contract -// let contract = platform.create_mn_shares_contract(Some(&transaction)); -// -// let genesis_time = Utc::now(); -// -// let total_days = 29; -// -// let epoch_1_start_day = 18; -// -// let blocks_per_day = 50i64; -// -// let epoch_1_start_block = 13; -// -// let proposers_count = 50u16; -// -// let storage_fees_per_block = 42000; -// -// // and create masternode identities -// let proposers = create_test_masternode_identities( -// &platform.drive, -// proposers_count, -// Some(51), -// Some(&transaction), -// ); -// -// create_test_masternode_share_identities_and_documents( -// &platform.drive, -// &contract, -// &proposers, -// Some(53), -// Some(&transaction), -// ); -// -// platform.drive.grove.commit_transaction(transaction).unwrap().expect("expected to commit transaction"); -// -// let block_interval = 86400i64.div(blocks_per_day); -// -// let mut previous_block_time_ms: Option = None; -// -// // process blocks -// for day in 0..total_days { -// for block_num in 0..blocks_per_day { -// let block_time = if day == 0 && block_num == 0 { -// genesis_time -// } else { -// genesis_time -// + Duration::days(day as i64) -// + Duration::seconds(block_interval * block_num) -// }; -// -// let block_height = 1 + (blocks_per_day as u64 * day as u64) + block_num as u64; -// -// let block_time_ms = block_time -// .timestamp_millis() -// .to_u64() -// .expect("block time can not be before 1970"); -// -// //todo: before we had total_hpmns, where should we put it -// let request_process_proposal = RequestPrepareProposal { -// max_tx_bytes: 0, -// txs: vec![], -// local_last_commit: None, -// misbehavior: vec![], -// height: block_height as i64, -// round: 0, -// time: Some(Timestamp { -// seconds: (block_time_ms / 1000) as i64, -// nanos: ((block_time_ms % 1000) * 1000) as i32, -// }), -// next_validators_hash: [0u8;32].to_vec(), -// core_chain_locked_height: 1, -// proposer_pro_tx_hash: proposers -// .get(block_height as usize % (proposers_count as usize)) -// .unwrap().to_vec(), -// proposed_app_version: 1, -// version: None, -// quorum_hash: [0u8;32].to_vec(), -// }; -// -// // We are going to process the proposal, during processing we expect internal -// // subroutines to take place, these subroutines will create the transactions -// let process_proposal_response = platform -// .process_proposal(block_begin_request) -// .unwrap_or_else(|e| { -// panic!( -// "should begin process block #{} for day #{} : {:?}", -// block_height, day, e -// ) -// }); -// -// // Set previous block time -// previous_block_time_ms = Some(block_time_ms); -// -// // Should calculate correct current epochs -// let (epoch_index, epoch_change) = if day > epoch_1_start_day { -// (1, false) -// } else if day == epoch_1_start_day { -// match block_num.cmp(&epoch_1_start_block) { -// Ordering::Less => (0, false), -// Ordering::Equal => (1, true), -// Ordering::Greater => (1, false), -// } -// } else if day == 0 && block_num == 0 { -// (0, true) -// } else { -// (0, false) -// }; -// -// assert_eq!( -// block_begin_response.epoch_info.current_epoch_index, -// epoch_index -// ); -// -// assert_eq!( -// block_begin_response.epoch_info.is_epoch_change, -// epoch_change -// ); -// -// if day == 0 && block_num == 0 { -// let unsigned_withdrawal_hexes = block_begin_response -// .unsigned_withdrawal_transactions -// .iter() -// .map(hex::encode) -// .collect::>(); -// -// assert_eq!(unsigned_withdrawal_hexes, vec![ -// "200000000000000000000000000000000000000000000000000000000000000000010000002b32db6c2c0a6235fb1397e8225ea85e0f0e6e8c7b126d0016ccbde0e667151e", -// "200101010101010101010101010101010101010101010101010101010101010101010000002b32db6c2c0a6235fb1397e8225ea85e0f0e6e8c7b126d0016ccbde0e667151e", -// "200202020202020202020202020202020202020202020202020202020202020202010000002b32db6c2c0a6235fb1397e8225ea85e0f0e6e8c7b126d0016ccbde0e667151e", -// "200303030303030303030303030303030303030303030303030303030303030303010000002b32db6c2c0a6235fb1397e8225ea85e0f0e6e8c7b126d0016ccbde0e667151e", -// "200404040404040404040404040404040404040404040404040404040404040404010000002b32db6c2c0a6235fb1397e8225ea85e0f0e6e8c7b126d0016ccbde0e667151e", -// "200505050505050505050505050505050505050505050505050505050505050505010000002b32db6c2c0a6235fb1397e8225ea85e0f0e6e8c7b126d0016ccbde0e667151e", -// "200606060606060606060606060606060606060606060606060606060606060606010000002b32db6c2c0a6235fb1397e8225ea85e0f0e6e8c7b126d0016ccbde0e667151e", -// "200707070707070707070707070707070707070707070707070707070707070707010000002b32db6c2c0a6235fb1397e8225ea85e0f0e6e8c7b126d0016ccbde0e667151e", -// "200808080808080808080808080808080808080808080808080808080808080808010000002b32db6c2c0a6235fb1397e8225ea85e0f0e6e8c7b126d0016ccbde0e667151e", -// "200909090909090909090909090909090909090909090909090909090909090909010000002b32db6c2c0a6235fb1397e8225ea85e0f0e6e8c7b126d0016ccbde0e667151e", -// "200a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a010000002b32db6c2c0a6235fb1397e8225ea85e0f0e6e8c7b126d0016ccbde0e667151e", -// "200b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b010000002b32db6c2c0a6235fb1397e8225ea85e0f0e6e8c7b126d0016ccbde0e667151e", -// "200c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c010000002b32db6c2c0a6235fb1397e8225ea85e0f0e6e8c7b126d0016ccbde0e667151e", -// "200d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d010000002b32db6c2c0a6235fb1397e8225ea85e0f0e6e8c7b126d0016ccbde0e667151e", -// "200e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e010000002b32db6c2c0a6235fb1397e8225ea85e0f0e6e8c7b126d0016ccbde0e667151e", -// "200f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f010000002b32db6c2c0a6235fb1397e8225ea85e0f0e6e8c7b126d0016ccbde0e667151e", -// ]); -// } else { -// assert_eq!( -// block_begin_response.unsigned_withdrawal_transactions.len(), -// 0 -// ); -// } -// -// let block_end_request = BlockEndRequest { -// fees: BlockFees { -// storage_fee: storage_fees_per_block, -// processing_fee: 1600, -// refunds_per_epoch: CreditsPerEpoch::from_iter([(0, 100)]), -// }, -// }; -// -// let block_end_response = platform -// .block_end(block_end_request, Some(&transaction)) -// .unwrap_or_else(|_| { -// panic!( -// "should end process block #{} for day #{}", -// block_height, day -// ) -// }); -// -// let after_finalize_block_request = AfterFinalizeBlockRequest { -// updated_data_contract_ids: Vec::new(), -// }; -// -// platform -// .after_finalize_block(after_finalize_block_request) -// .unwrap_or_else(|_| { -// panic!( -// "should begin process block #{} for day #{}", -// block_height, day -// ) -// }); -// -// // Should pay to all proposers for epoch 0, when epochs 1 started -// if epoch_index != 0 && epoch_change { -// assert!(block_end_response.proposers_paid_count.is_some()); -// assert!(block_end_response.paid_epoch_index.is_some()); -// -// assert_eq!( -// block_end_response.proposers_paid_count.unwrap(), -// proposers_count -// ); -// assert_eq!(block_end_response.paid_epoch_index.unwrap(), 0); -// } else { -// assert!(block_end_response.proposers_paid_count.is_none()); -// assert!(block_end_response.paid_epoch_index.is_none()); -// }; -// } -// } -// } -// -// #[test] -// fn test_chain_halt_for_36_days() { -// // TODO refactor to remove code duplication -// -// let mut platform = TestPlatformBuilder::new() -// .with_config(PlatformConfig { -// verify_sum_trees: false, -// ..Default::default() -// }) -// .build_with_mock_rpc(); -// -// let mut core_rpc_mock = MockCoreRPCLike::new(); -// -// core_rpc_mock -// .expect_get_block_hash() -// // .times(1) // TODO: investigate why it always n + 1 -// .returning(|_| { -// Ok(BlockHash::from_hex( -// "0000000000000000000000000000000000000000000000000000000000000000", -// ) -// .unwrap()) -// }); -// -// core_rpc_mock -// .expect_get_block_json() -// // .times(1) // TODO: investigate why it always n + 1 -// .returning(|_| Ok(json!({}))); -// -// platform.core_rpc = core_rpc_mock; -// -// let transaction = platform.drive.grove.start_transaction(); -// -// // init chain -// let init_chain_request = static_init_chain_request(); -// -// platform -// .init_chain(init_chain_request, Some(&transaction)) -// .expect("should init chain"); -// -// // setup the contract -// let contract = platform.create_mn_shares_contract(Some(&transaction)); -// -// let genesis_time = Utc::now(); -// -// let epoch_2_start_day = 37; -// -// let blocks_per_day = 50i64; -// -// let proposers_count = 50u16; -// -// let storage_fees_per_block = 42000; -// -// // and create masternode identities -// let proposers = create_test_masternode_identities( -// &platform.drive, -// proposers_count, -// Some(52), -// Some(&transaction), -// ); -// -// create_test_masternode_share_identities_and_documents( -// &platform.drive, -// &contract, -// &proposers, -// Some(54), -// Some(&transaction), -// ); -// -// let block_interval = 86400i64.div(blocks_per_day); -// -// let mut previous_block_time_ms: Option = None; -// -// // process blocks -// for day in [0, 1, 2, 3, 37] { -// for block_num in 0..blocks_per_day { -// let block_time = if day == 0 && block_num == 0 { -// genesis_time -// } else { -// genesis_time -// + Duration::days(day as i64) -// + Duration::seconds(block_interval * block_num) -// }; -// -// let block_height = 1 + (blocks_per_day as u64 * day as u64) + block_num as u64; -// -// let block_time_ms = block_time -// .timestamp_millis() -// .to_u64() -// .expect("block time can not be before 1970"); -// -// // Processing block -// let block_begin_request = BlockBeginRequest { -// block_height, -// block_time_ms, -// previous_block_time_ms, -// proposer_pro_tx_hash: *proposers -// .get(block_height as usize % (proposers_count as usize)) -// .unwrap(), -// proposed_app_version: 1, -// validator_set_quorum_hash: Default::default(), -// last_synced_core_height: 1, -// core_chain_locked_height: 1, -// total_hpmns: proposers_count as u32, -// }; -// -// let block_begin_response = platform -// .block_begin(block_begin_request, Some(&transaction)) -// .unwrap_or_else(|_| { -// panic!( -// "should begin process block #{} for day #{}", -// block_height, day -// ) -// }); -// -// // Set previous block time -// previous_block_time_ms = Some(block_time_ms); -// -// // Should calculate correct current epochs -// let (epoch_index, epoch_change) = if day == epoch_2_start_day { -// if block_num == 0 { -// (2, true) -// } else { -// (2, false) -// } -// } else if day == 0 && block_num == 0 { -// (0, true) -// } else { -// (0, false) -// }; -// -// assert_eq!( -// block_begin_response.epoch_info.current_epoch_index, -// epoch_index -// ); -// -// assert_eq!( -// block_begin_response.epoch_info.is_epoch_change, -// epoch_change -// ); -// -// let block_end_request = BlockEndRequest { -// fees: BlockFees { -// storage_fee: storage_fees_per_block, -// processing_fee: 1600, -// refunds_per_epoch: CreditsPerEpoch::from_iter([(0, 100)]), -// }, -// }; -// -// let block_end_response = platform -// .block_end(block_end_request, Some(&transaction)) -// .unwrap_or_else(|_| { -// panic!( -// "should end process block #{} for day #{}", -// block_height, day -// ) -// }); -// -// let after_finalize_block_request = AfterFinalizeBlockRequest { -// updated_data_contract_ids: Vec::new(), -// }; -// -// platform -// .after_finalize_block(after_finalize_block_request) -// .unwrap_or_else(|_| { -// panic!( -// "should begin process block #{} for day #{}", -// block_height, day -// ) -// }); -// -// // Should pay to all proposers for epoch 0, when epochs 1 started -// if epoch_index != 0 && epoch_change { -// assert!(block_end_response.proposers_paid_count.is_some()); -// assert!(block_end_response.paid_epoch_index.is_some()); -// -// assert_eq!( -// block_end_response.proposers_paid_count.unwrap(), -// blocks_per_day as u16, -// ); -// assert_eq!(block_end_response.paid_epoch_index.unwrap(), 0); -// } else { -// assert!(block_end_response.proposers_paid_count.is_none()); -// assert!(block_end_response.paid_epoch_index.is_none()); -// }; -// } -// } -// } -// } -// } +mod check_tx; +mod echo; +pub mod error; +mod extend_vote; +mod finalize_block; +mod info; +mod init_chain; +mod prepare_proposal; +mod process_proposal; +mod verify_vote_extension; + +pub use check_tx::check_tx; +pub use echo::echo; +pub use extend_vote::extend_vote; +pub use finalize_block::finalize_block; +pub use info::info; +pub use init_chain::init_chain; +pub use prepare_proposal::prepare_proposal; +pub use process_proposal::process_proposal; +pub use verify_vote_extension::verify_vote_extension; diff --git a/packages/rs-drive-abci/src/abci/handler/prepare_proposal.rs b/packages/rs-drive-abci/src/abci/handler/prepare_proposal.rs new file mode 100644 index 0000000000..d7e53e992e --- /dev/null +++ b/packages/rs-drive-abci/src/abci/handler/prepare_proposal.rs @@ -0,0 +1,214 @@ +use crate::abci::app::{PlatformApplication, TransactionalApplication}; +use crate::abci::AbciError; +use crate::error::Error; +use crate::execution::types::block_execution_context::v0::BlockExecutionContextV0Setters; +use crate::platform_types::block_execution_outcome; +use crate::platform_types::block_proposal::v0::BlockProposal; +use crate::platform_types::platform_state::v0::PlatformStateV0Methods; +use crate::platform_types::state_transitions_processing_result::StateTransitionExecutionResult; +use crate::rpc::core::CoreRPCLike; +use dpp::dashcore::hashes::Hash; +use dpp::version::PlatformVersion; +use dpp::version::TryIntoPlatformVersioned; +use tenderdash_abci::proto::abci as proto; +use tenderdash_abci::proto::abci::tx_record::TxAction; +use tenderdash_abci::proto::abci::{ExecTxResult, TxRecord}; +use tenderdash_abci::proto::types::CoreChainLock; + +pub fn prepare_proposal<'a, A, C>( + app: &A, + mut request: proto::RequestPrepareProposal, +) -> Result +where + A: PlatformApplication + TransactionalApplication<'a>, + C: CoreRPCLike, +{ + let timer = crate::metrics::abci_request_duration("prepare_proposal"); + + // We should get the latest CoreChainLock from core + // It is possible that we will not get a chain lock from core, in this case, just don't + // propose one + // This is done before all else + + let state = app.platform().state.read().unwrap(); + + let last_committed_core_height = state.last_committed_core_height(); + + let core_chain_lock_update = match app.platform().core_rpc.get_best_chain_lock() { + Ok(latest_chain_lock) => { + if state.last_committed_block_info().is_none() + || latest_chain_lock.block_height > last_committed_core_height + { + Some(latest_chain_lock) + } else { + None + } + } + Err(_) => None, + }; + + drop(state); + + // Filter out transactions exceeding max_block_size + let mut transactions_exceeding_max_block_size = Vec::new(); + { + let mut total_transactions_size = 0; + let mut index_to_remove_at = None; + for (i, raw_transaction) in request.txs.iter().enumerate() { + total_transactions_size += raw_transaction.len(); + + if total_transactions_size as i64 > request.max_tx_bytes { + index_to_remove_at = Some(i); + break; + } + } + + if let Some(index_to_remove_at) = index_to_remove_at { + transactions_exceeding_max_block_size.extend(request.txs.drain(index_to_remove_at..)); + } + } + + let mut block_proposal: BlockProposal = (&request).try_into()?; + + if let Some(core_chain_lock_update) = core_chain_lock_update.as_ref() { + // We can't add this, as it slows down CI way too much + // todo: find a way to re-enable this without destroying CI + tracing::debug!( + "propose chain lock update to height {} at block {}", + core_chain_lock_update.block_height, + request.height + ); + block_proposal.core_chain_locked_height = core_chain_lock_update.block_height; + } else { + block_proposal.core_chain_locked_height = last_committed_core_height; + } + + // Prepare transaction + let transaction_guard = if request.height == app.platform().config.abci.genesis_height as i64 { + // special logic on init chain + let transaction = app.transaction().read().unwrap(); + if transaction.is_none() { + return Err(Error::Abci(AbciError::BadRequest("received a prepare proposal request for the genesis height before an init chain request".to_string())))?; + } + if request.round > 0 { + transaction.as_ref().map(|tx| tx.rollback_to_savepoint()); + } + transaction + } else { + app.start_transaction(); + app.transaction().read().unwrap() + }; + + let transaction = transaction_guard.as_ref().unwrap(); + + // Running the proposal executes all the state transitions for the block + let mut run_result = app + .platform() + .run_block_proposal(block_proposal, true, transaction)?; + + if !run_result.is_valid() { + // This is a system error, because we are proposing + return Err(run_result.errors.remove(0).into()); + } + + let block_execution_outcome::v0::BlockExecutionOutcome { + app_hash, + state_transitions_result, + validator_set_update, + protocol_version, + } = run_result.into_data().map_err(Error::Protocol)?; + + let platform_version = PlatformVersion::get(protocol_version) + .expect("must be set in run block proposal from existing protocol version"); + + // We need to let Tenderdash know about the transactions we should remove from execution + let valid_tx_count = state_transitions_result.valid_count(); + let failed_tx_count = state_transitions_result.failed_count(); + let delayed_tx_count = transactions_exceeding_max_block_size.len(); + let invalid_paid_tx_count = state_transitions_result.invalid_paid_count(); + let invalid_unpaid_tx_count = state_transitions_result.invalid_unpaid_count(); + + let mut tx_results = Vec::new(); + let mut tx_records = Vec::new(); + + for (state_transition_execution_result, raw_state_transition) in state_transitions_result + .into_execution_results() + .into_iter() + .zip(request.txs) + { + let tx_action = match &state_transition_execution_result { + StateTransitionExecutionResult::SuccessfulExecution(..) => TxAction::Unmodified, + // We have identity to pay for the state transition, so we keep it in the block + StateTransitionExecutionResult::PaidConsensusError(..) => TxAction::Unmodified, + // We don't have any associated identity to pay for the state transition, + // so we remove it from the block to prevent spam attacks. + // Such state transitions must be invalidated by check tx, but they might + // still be added to mempool due to inconsistency between check tx and tx processing + // (fees calculation) or malicious proposer. + StateTransitionExecutionResult::UnpaidConsensusError(..) => TxAction::Removed, + // We shouldn't include in the block any state transitions that produced an internal error + // during execution + StateTransitionExecutionResult::DriveAbciError(..) => TxAction::Removed, + }; + + let tx_result: ExecTxResult = + state_transition_execution_result.try_into_platform_versioned(platform_version)?; + + if tx_action != TxAction::Removed { + tx_results.push(tx_result); + } + + tx_records.push(TxRecord { + action: tx_action.into(), + tx: raw_state_transition, + }); + } + + // Add up exceeding transactions to the response + tx_records.extend( + transactions_exceeding_max_block_size + .into_iter() + .map(|tx| TxRecord { + action: TxAction::Delayed as i32, + tx, + }), + ); + + let response = proto::ResponsePrepareProposal { + tx_results, + app_hash: app_hash.to_vec(), + tx_records, + core_chain_lock_update: core_chain_lock_update.map(|chain_lock| CoreChainLock { + core_block_hash: chain_lock.block_hash.to_byte_array().to_vec(), + core_block_height: chain_lock.block_height, + signature: chain_lock.signature.to_bytes().to_vec(), + }), + validator_set_update, + // TODO: implement consensus param updates + consensus_param_updates: None, + }; + + let mut block_execution_context_guard = app.platform().block_execution_context.write().unwrap(); + + let block_execution_context = block_execution_context_guard + .as_mut() + .expect("expected that a block execution context was set"); + block_execution_context.set_proposer_results(Some(response.clone())); + + let elapsed_time_ms = timer.elapsed().as_millis(); + + tracing::info!( + invalid_paid_tx_count, + invalid_unpaid_tx_count, + valid_tx_count, + delayed_tx_count, + failed_tx_count, + "Prepared proposal with {} transitions for height: {}, round: {} in {} ms", + valid_tx_count + invalid_paid_tx_count, + request.height, + request.round, + elapsed_time_ms, + ); + + Ok(response) +} diff --git a/packages/rs-drive-abci/src/abci/handler/process_proposal.rs b/packages/rs-drive-abci/src/abci/handler/process_proposal.rs new file mode 100644 index 0000000000..9a1b69d728 --- /dev/null +++ b/packages/rs-drive-abci/src/abci/handler/process_proposal.rs @@ -0,0 +1,244 @@ +use crate::abci::app::{PlatformApplication, TransactionalApplication}; +use crate::abci::AbciError; +use crate::error::Error; +use crate::execution::types::block_execution_context::v0::{ + BlockExecutionContextV0Getters, BlockExecutionContextV0MutableGetters, +}; +use crate::execution::types::block_state_info::v0::{ + BlockStateInfoV0Getters, BlockStateInfoV0Setters, +}; +use crate::platform_types::block_execution_outcome; +use crate::platform_types::state_transitions_processing_result::StateTransitionExecutionResult; +use crate::rpc::core::CoreRPCLike; +use dpp::version::PlatformVersion; +use dpp::version::TryIntoPlatformVersioned; +use tenderdash_abci::proto::abci as proto; +use tenderdash_abci::proto::abci::tx_record::TxAction; + +pub fn process_proposal<'a, A, C>( + app: &A, + request: proto::RequestProcessProposal, +) -> Result +where + A: PlatformApplication + TransactionalApplication<'a>, + C: CoreRPCLike, +{ + let timer = crate::metrics::abci_request_duration("process_proposal"); + + let mut block_execution_context_guard = app.platform().block_execution_context.write().unwrap(); + + let mut drop_block_execution_context = false; + if let Some(block_execution_context) = block_execution_context_guard.as_mut() { + // We are already in a block, or in init chain. + // This only makes sense if we were the proposer unless we are at a future round + if block_execution_context.block_state_info().round() != (request.round as u32) { + // We were not the proposer, and we should process something new + drop_block_execution_context = true; + } else if let Some(current_block_hash) = + block_execution_context.block_state_info().block_hash() + { + // There is also the possibility that this block already came in, but tenderdash crashed + // Now tenderdash is sending it again + if let Some(proposal_info) = block_execution_context.proposer_results() { + tracing::debug!( + method = "process_proposal", + ?proposal_info, // TODO: It might be too big for debug + "we knew block hash, block execution context already had a proposer result", + ); + // We were the proposer as well, so we have the result in cache + return Ok(proto::ResponseProcessProposal { + status: proto::response_process_proposal::ProposalStatus::Accept.into(), + app_hash: proposal_info.app_hash.clone(), + tx_results: proposal_info.tx_results.clone(), + consensus_param_updates: proposal_info.consensus_param_updates.clone(), + validator_set_update: proposal_info.validator_set_update.clone(), + }); + } + + if current_block_hash.as_slice() == request.hash { + // We were not the proposer, just drop the execution context + tracing::warn!( + method = "process_proposal", + ?request, // Shumkov, lklimek: this structure might be very big and we already logged it such as all other ABCI requests and responses + "block execution context already existed, but we are running it again for same height {}/round {}", + request.height, + request.round, + ); + drop_block_execution_context = true; + } else { + // We are getting a different block hash for a block of the same round + // This is a terrible issue + return Err(Error::Abci(AbciError::BadRequest( + "received a process proposal request twice with different hash".to_string(), + )))?; + } + } else { + let Some(proposal_info) = block_execution_context.proposer_results() else { + return Err(Error::Abci(AbciError::BadRequest( + "received a process proposal request twice".to_string(), + )))?; + }; + + let expected_transactions = proposal_info + .tx_records + .iter() + .filter_map(|record| { + if record.action == TxAction::Removed as i32 + || record.action == TxAction::Delayed as i32 + { + None + } else { + Some(&record.tx) + } + }) + .collect::>(); + + // While it is true that the length could be same, seeing how this is such a rare situation + // It does not seem worth to deal with situations where the length is the same but the transactions have changed + if expected_transactions.len() == request.txs.len() + && proposal_info.core_chain_lock_update == request.core_chain_lock_update + { + let (app_hash, tx_results, consensus_param_updates, validator_set_update) = { + tracing::debug!( + method = "process_proposal", + "we didn't know block hash (we were most likely proposer), block execution context already had a proposer result {:?}", + proposal_info, + ); + + // Cloning all required properties from proposal_info and then dropping it + let app_hash = proposal_info.app_hash.clone(); + let tx_results = proposal_info.tx_results.clone(); + let consensus_param_updates = proposal_info.consensus_param_updates.clone(); + let validator_set_update = proposal_info.validator_set_update.clone(); + ( + app_hash, + tx_results, + consensus_param_updates, + validator_set_update, + ) + }; + + // We need to set the block hash + block_execution_context + .block_state_info_mut() + .set_block_hash(Some(request.hash.clone().try_into().map_err(|_| { + Error::Abci(AbciError::BadRequestDataSize( + "block hash is not 32 bytes in process proposal".to_string(), + )) + })?)); + return Ok(proto::ResponseProcessProposal { + status: proto::response_process_proposal::ProposalStatus::Accept.into(), + app_hash, + tx_results, + consensus_param_updates, + validator_set_update, + }); + } else { + tracing::warn!( + method = "process_proposal", + "we didn't know block hash (we were most likely proposer), block execution context already had a proposer result {:?}, but we are requesting a different amount of transactions, dropping the cache", + proposal_info, + ); + + drop_block_execution_context = true; + }; + } + } + + if drop_block_execution_context { + *block_execution_context_guard = None; + } + drop(block_execution_context_guard); + + // Get transaction + let transaction_guard = if request.height == app.platform().config.abci.genesis_height as i64 { + // special logic on init chain + let transaction = app.transaction().read().unwrap(); + if transaction.is_none() { + return Err(Error::Abci(AbciError::BadRequest("received a process proposal request for the genesis height before an init chain request".to_string())))?; + } + if request.round > 0 { + transaction.as_ref().map(|tx| tx.rollback_to_savepoint()); + } + transaction + } else { + app.start_transaction(); + app.transaction().read().unwrap() + }; + let transaction = transaction_guard.as_ref().unwrap(); + + // Running the proposal executes all the state transitions for the block + let run_result = + app.platform() + .run_block_proposal((&request).try_into()?, false, transaction)?; + + if !run_result.is_valid() { + // This was an error running this proposal, tell tenderdash that the block isn't valid + let response = proto::ResponseProcessProposal { + status: proto::response_process_proposal::ProposalStatus::Reject.into(), + app_hash: [0; 32].to_vec(), // we must send 32 bytes + ..Default::default() + }; + + tracing::warn!( + errors = ?run_result.errors, + "Rejected invalid proposal for height: {}, round: {}", + request.height, + request.round, + ); + + Ok(response) + } else { + let block_execution_outcome::v0::BlockExecutionOutcome { + app_hash, + state_transitions_result: state_transition_results, + validator_set_update, + protocol_version, + } = run_result.into_data().map_err(Error::Protocol)?; + + let platform_version = PlatformVersion::get(protocol_version) + .expect("must be set in run block proposer from existing platform version"); + + let invalid_tx_count = state_transition_results.invalid_paid_count(); + let valid_tx_count = state_transition_results.valid_count(); + + let tx_results = state_transition_results + .into_execution_results() + .into_iter() + // To prevent spam attacks we add to the block state transitions covered with fees only + .filter(|execution_result| { + matches!( + execution_result, + StateTransitionExecutionResult::SuccessfulExecution(..) + | StateTransitionExecutionResult::PaidConsensusError(..) + ) + }) + .map(|execution_result| execution_result.try_into_platform_versioned(platform_version)) + .collect::>()?; + + let response = proto::ResponseProcessProposal { + app_hash: app_hash.to_vec(), + tx_results, + // TODO: Must be reject if results are different + status: proto::response_process_proposal::ProposalStatus::Accept.into(), + validator_set_update, + // TODO: Implement consensus param updates + consensus_param_updates: None, + }; + + let elapsed_time_ms = timer.elapsed().as_millis(); + + tracing::info!( + invalid_tx_count, + valid_tx_count, + elapsed_time_ms, + "Processed proposal with {} transactions for height: {}, round: {} in {} ms", + valid_tx_count + invalid_tx_count, + request.height, + request.round, + elapsed_time_ms, + ); + + Ok(response) + } +} diff --git a/packages/rs-drive-abci/src/abci/handler/verify_vote_extension.rs b/packages/rs-drive-abci/src/abci/handler/verify_vote_extension.rs new file mode 100644 index 0000000000..9452b2859f --- /dev/null +++ b/packages/rs-drive-abci/src/abci/handler/verify_vote_extension.rs @@ -0,0 +1,96 @@ +use crate::abci::app::PlatformApplication; +use crate::error::Error; +use crate::execution::types::block_execution_context::v0::BlockExecutionContextV0Getters; +use crate::execution::types::block_state_info::v0::BlockStateInfoV0Getters; +use crate::rpc::core::CoreRPCLike; +use tenderdash_abci::proto::abci as proto; +use tenderdash_abci::proto::abci::response_verify_vote_extension::VerifyStatus; +use tenderdash_abci::proto::abci::ExtendVoteExtension; + +/// Todo: Verify vote extension not really needed because extend vote is deterministic +pub fn verify_vote_extension( + app: &A, + request: proto::RequestVerifyVoteExtension, +) -> Result +where + A: PlatformApplication, + C: CoreRPCLike, +{ + let _timer = crate::metrics::abci_request_duration("verify_vote_extension"); + + // Verify that this is a vote extension for our current executed block and our proposer + let proto::RequestVerifyVoteExtension { + height, + round, + vote_extensions, + .. + } = request; + + let height: u64 = height as u64; + let round: u32 = round as u32; + + // Make sure we are in a block execution phase + let guarded_block_execution_context = app.platform().block_execution_context.read().unwrap(); + let Some(block_execution_context) = guarded_block_execution_context.as_ref() else { + tracing::warn!( + "vote extensions for height: {}, round: {} are rejected because we are not in a block execution phase", + height, + round, + ); + + return Ok(proto::ResponseVerifyVoteExtension { + status: VerifyStatus::Reject.into(), + }); + }; + + // Make sure vote extension is for our currently executing block + + let block_state_info = block_execution_context.block_state_info(); + + // We might get vote extension to verify for previous (in case if other node is behind) + // or future round (in case if the current node is behind), so we make sure that only height + // is matching. It's fine because withdrawal transactions to sign are the same for any round + // of the same height + if block_state_info.height() != height { + tracing::warn!( + "vote extensions for height: {}, round: {} are rejected because we are at height: {}", + height, + round, + block_state_info.height(), + ); + + return Ok(proto::ResponseVerifyVoteExtension { + status: VerifyStatus::Reject.into(), + }); + } + + // Verify that a validator is requesting a signatures + // for a correct set of withdrawal transactions + + let expected_withdrawals = block_execution_context.unsigned_withdrawal_transactions(); + + if expected_withdrawals != &vote_extensions { + let expected_extensions: Vec = expected_withdrawals.into(); + + tracing::error!( + received_extensions = ?vote_extensions, + ?expected_extensions, + "vote extensions for height: {}, round: {} mismatch", + height, round + ); + + return Ok(proto::ResponseVerifyVoteExtension { + status: VerifyStatus::Reject.into(), + }); + } + + tracing::debug!( + "vote extensions for height: {}, round: {} are successfully verified", + height, + round, + ); + + Ok(proto::ResponseVerifyVoteExtension { + status: VerifyStatus::Accept.into(), + }) +} diff --git a/packages/rs-drive-abci/src/abci/mod.rs b/packages/rs-drive-abci/src/abci/mod.rs index f404881f81..e9b7681eae 100644 --- a/packages/rs-drive-abci/src/abci/mod.rs +++ b/packages/rs-drive-abci/src/abci/mod.rs @@ -1,16 +1,11 @@ mod error; -/// The handlers of abci messages -#[cfg(any(feature = "server", test))] -pub mod handler; - // server configuration pub mod config; -#[cfg(any(feature = "server", test))] -pub(crate) mod server; + +/// ABCI applications +pub mod app; + +mod handler; pub use error::AbciError; -#[cfg(feature = "server")] -pub use server::start; -#[cfg(any(feature = "server", test))] -pub use server::AbciApplication; diff --git a/packages/rs-drive-abci/src/abci/server.rs b/packages/rs-drive-abci/src/abci/server.rs deleted file mode 100644 index c3d2247ddc..0000000000 --- a/packages/rs-drive-abci/src/abci/server.rs +++ /dev/null @@ -1,95 +0,0 @@ -//! This module implements ABCI application server. -//! -use crate::error::execution::ExecutionError; -use crate::{ - config::PlatformConfig, error::Error, platform_types::platform::Platform, - rpc::core::CoreRPCLike, -}; -use drive::grovedb::Transaction; -use std::fmt::Debug; -use std::sync::RwLock; -use tokio_util::sync::CancellationToken; - -/// AbciApp is an implementation of ABCI Application, as defined by Tenderdash. -/// -/// AbciApp implements logic that should be triggered when Tenderdash performs various operations, like -/// creating new proposal or finalizing new block. -pub struct AbciApplication<'a, C> { - /// Platform - pub platform: &'a Platform, - /// The current transaction - pub transaction: RwLock>>, -} - -/// Start ABCI server and process incoming connections. -/// -/// Should never return. -pub fn start( - config: &PlatformConfig, - core_rpc: C, - cancel: CancellationToken, -) -> Result<(), Error> { - let bind_address = config.abci.bind_address.clone(); - - let platform: Platform = - Platform::open_with_client(&config.db_path, Some(config.clone()), core_rpc)?; - - let abci = AbciApplication::new(&platform)?; - - let server = tenderdash_abci::ServerBuilder::new(abci, &bind_address) - .with_cancel_token(cancel.clone()) - .build() - .map_err(super::AbciError::from)?; - - while !cancel.is_cancelled() { - tracing::info!("waiting for new ABCI connection"); - match server.next_client() { - Err(e) => tracing::error!("ABCI connection terminated: {:?}", e), - Ok(_) => tracing::info!("ABCI connection closed"), - } - } - - Ok(()) -} - -impl<'a, C> AbciApplication<'a, C> { - /// Create new ABCI app - pub fn new(platform: &'a Platform) -> Result, Error> { - let app = AbciApplication { - platform, - transaction: RwLock::new(None), - }; - - Ok(app) - } - - /// create and store a new transaction - pub fn start_transaction(&self) { - let transaction = self.platform.drive.grove.start_transaction(); - self.transaction.write().unwrap().replace(transaction); - } - - /// Commit a transaction - pub fn commit_transaction(&self) -> Result<(), Error> { - let transaction = self - .transaction - .write() - .unwrap() - .take() - .ok_or(Error::Execution(ExecutionError::NotInTransaction( - "trying to commit a transaction, but we are not in one", - )))?; - let platform_state = self.platform.state.read().unwrap(); - let platform_version = platform_state.current_platform_version()?; - self.platform - .drive - .commit_transaction(transaction, &platform_version.drive) - .map_err(Error::Drive) - } -} - -impl<'a, C> Debug for AbciApplication<'a, C> { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "") - } -} diff --git a/packages/rs-drive-abci/src/config.rs b/packages/rs-drive-abci/src/config.rs index 1667097503..29e862e916 100644 --- a/packages/rs-drive-abci/src/config.rs +++ b/packages/rs-drive-abci/src/config.rs @@ -156,6 +156,19 @@ pub struct PlatformConfig { #[serde(flatten)] pub abci: AbciConfig, + /// Address to listen for Prometheus connection. + /// + /// Optional. + /// + /// /// Address should be an URL with scheme `http://`, for example: + /// - `http://127.0.0.1:29090` + /// + /// Port number defaults to [crate::metrics::DEFAULT_PROMETHEUS_PORT]. + pub prometheus_bind_address: Option, + + /// Address to listen for gRPC connection. + pub grpc_bind_address: String, + /// Execution config #[serde(flatten)] pub execution: ExecutionConfig, @@ -192,6 +205,17 @@ pub struct PlatformConfig { /// This should be None, except in the case of Testing platform #[serde(skip)] pub testing_configs: PlatformTestConfig, + + /// Enable tokio console (console feature must be enabled) + pub tokio_console_enabled: bool, + + /// Tokio console address to connect to + #[serde(default = "PlatformConfig::default_tokio_console_address")] + pub tokio_console_address: String, + + /// Number of seconds to store task information if there is no clients connected + #[serde(default = "PlatformConfig::default_tokio_console_retention_secs")] + pub tokio_console_retention_secs: u64, } impl ExecutionConfig { @@ -218,6 +242,14 @@ impl PlatformConfig { 1 } + fn default_tokio_console_address() -> String { + String::from("127.0.0.1:6669") + } + + fn default_tokio_console_retention_secs() -> u64 { + 60 * 3 + } + /// Return type of quorum pub fn validator_set_quorum_type(&self) -> QuorumType { let found = if let Ok(t) = self.validator_set_quorum_type.trim().parse::() { @@ -311,7 +343,12 @@ impl PlatformConfig { execution: Default::default(), db_path: PathBuf::from("/var/lib/dash-platform/data"), testing_configs: PlatformTestConfig::default(), + tokio_console_enabled: false, + tokio_console_address: PlatformConfig::default_tokio_console_address(), + tokio_console_retention_secs: PlatformConfig::default_tokio_console_retention_secs(), initial_protocol_version: 1, + prometheus_bind_address: None, + grpc_bind_address: "0.0.0.0:26670".to_string(), } } @@ -330,6 +367,11 @@ impl PlatformConfig { db_path: PathBuf::from("/var/lib/dash-platform/data"), testing_configs: PlatformTestConfig::default(), initial_protocol_version: 1, + prometheus_bind_address: None, + grpc_bind_address: "0.0.0.0:26670".to_string(), + tokio_console_enabled: false, + tokio_console_address: PlatformConfig::default_tokio_console_address(), + tokio_console_retention_secs: PlatformConfig::default_tokio_console_retention_secs(), } } @@ -348,6 +390,11 @@ impl PlatformConfig { db_path: PathBuf::from("/var/lib/dash-platform/data"), testing_configs: PlatformTestConfig::default(), initial_protocol_version: 1, + prometheus_bind_address: None, + grpc_bind_address: "0.0.0.0:26670".to_string(), + tokio_console_enabled: false, + tokio_console_address: PlatformConfig::default_tokio_console_address(), + tokio_console_retention_secs: PlatformConfig::default_tokio_console_retention_secs(), } } } diff --git a/packages/rs-drive-abci/src/execution/check_tx/mod.rs b/packages/rs-drive-abci/src/execution/check_tx/mod.rs index 0dcc4d18e9..c856e4d179 100644 --- a/packages/rs-drive-abci/src/execution/check_tx/mod.rs +++ b/packages/rs-drive-abci/src/execution/check_tx/mod.rs @@ -9,6 +9,7 @@ use dpp::fee::fee_result::FeeResult; use dpp::identifier::Identifier; use dpp::prelude::IdentityNonce; use dpp::validation::ValidationResult; +use dpp::version::PlatformVersion; mod v0; @@ -88,9 +89,8 @@ where &self, raw_tx: &[u8], check_tx_level: CheckTxLevel, + platform_version: &PlatformVersion, ) -> Result, Error> { - let state = self.state.read().expect("expected to get state"); - let platform_version = state.current_platform_version()?; match platform_version.drive_abci.methods.engine.check_tx { 0 => self.check_tx_v0(raw_tx, check_tx_level, platform_version), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { diff --git a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs index 0f6146e3b2..416eda3226 100644 --- a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs @@ -34,27 +34,31 @@ where pub(in crate::execution) fn execute_tx( &self, raw_tx: Vec, - block_info: &dpp::block::block_info::BlockInfo, transaction: &Transaction, ) -> Result { let state_transition = StateTransition::deserialize_from_bytes(raw_tx.as_slice()).map_err(Error::Protocol)?; + let state_read_guard = self.state.read().unwrap(); + let platform_ref = PlatformRef { drive: &self.drive, state: &state_read_guard, config: &self.config, core_rpc: &self.core_rpc, - block_info, }; let state_transition_execution_event = process_state_transition(&platform_ref, state_transition, Some(transaction))?; if state_transition_execution_event.is_valid() { - let platform_version = platform_ref.state.current_platform_version()?; let execution_event = state_transition_execution_event.into_data()?; - self.execute_event(execution_event, block_info, transaction, platform_version) + self.execute_event( + execution_event, + state_read_guard.last_block_info(), + transaction, + platform_ref.state.current_platform_version()?, + ) } else { Ok(ConsensusExecutionError( SimpleConsensusValidationResult::new_with_errors( @@ -95,17 +99,16 @@ where } }; - let state_read_guard = self.state.read().unwrap(); + // TODO: We lock state for entire check tx execution that could lead to performance issues + // and writer starvation. - // Latest committed or genesis block info - let block_info = state_read_guard.any_block_info(); + let state_read_guard = self.state.read().unwrap(); let platform_ref = PlatformRef { drive: &self.drive, state: &state_read_guard, config: &self.config, core_rpc: &self.core_rpc, - block_info, }; let unique_identifiers = state_transition.unique_identifiers(); @@ -119,14 +122,19 @@ where // We should run the execution event in dry run to see if we would have enough fees for the transition validation_result.and_then_borrowed_validation(|execution_event| { if let Some(execution_event) = execution_event { - self.validate_fees_of_event(execution_event, block_info, None, platform_version) - .map(|validation_result| { - validation_result.map(|fee_result| CheckTxResult { - level: check_tx_level, - fee_result: Some(fee_result), - unique_identifiers, - }) + self.validate_fees_of_event( + execution_event, + state_read_guard.last_block_info(), + None, + platform_version, + ) + .map(|validation_result| { + validation_result.map(|fee_result| CheckTxResult { + level: check_tx_level, + fee_result: Some(fee_result), + unique_identifiers, }) + }) } else { Ok(ValidationResult::new_with_data(CheckTxResult { level: check_tx_level, @@ -192,6 +200,8 @@ mod tests { use rand::rngs::StdRng; use rand::SeedableRng; use std::collections::BTreeMap; + use std::time; + use std::time::SystemTime; // This test needs to be redone with new contract bytes, but is still useful for debugging #[test] @@ -260,13 +270,13 @@ mod tests { let transaction = platform.drive.grove.start_transaction(); let check_result = platform - .check_tx(&tx, FirstTimeCheck) + .check_tx(&tx, FirstTimeCheck, platform_version) .expect("expected to check tx"); assert!(check_result.is_valid()); let check_result = platform - .check_tx(&tx, Recheck) + .check_tx(&tx, Recheck, platform_version) .expect("expected to check tx"); assert!(check_result.is_valid()); @@ -283,7 +293,7 @@ mod tests { .expect("expected to process state transition"); let check_result = platform - .check_tx(&tx, Recheck) + .check_tx(&tx, Recheck, platform_version) .expect("expected to check tx"); assert!(!check_result.is_valid()); @@ -349,13 +359,13 @@ mod tests { .expect("expected to insert identity"); let validation_result = platform - .check_tx(serialized.as_slice(), FirstTimeCheck) + .check_tx(serialized.as_slice(), FirstTimeCheck, platform_version) .expect("expected to check tx"); assert!(validation_result.errors.is_empty()); let check_result = platform - .check_tx(serialized.as_slice(), Recheck) + .check_tx(serialized.as_slice(), Recheck, platform_version) .expect("expected to check tx"); assert!(check_result.is_valid()); @@ -374,7 +384,7 @@ mod tests { .expect("expected to process state transition"); let check_result = platform - .check_tx(serialized.as_slice(), Recheck) + .check_tx(serialized.as_slice(), Recheck, platform_version) .expect("expected to check tx"); assert!(check_result.is_valid()); // it should still be valid, because we didn't commit the transaction @@ -387,7 +397,7 @@ mod tests { .expect("expected to commit"); let check_result = platform - .check_tx(serialized.as_slice(), Recheck) + .check_tx(serialized.as_slice(), Recheck, platform_version) .expect("expected to check tx"); assert!(check_result.is_valid()); // it should still be valid, because we don't validate state @@ -453,13 +463,13 @@ mod tests { .expect("expected to insert identity"); let validation_result = platform - .check_tx(serialized.as_slice(), FirstTimeCheck) + .check_tx(serialized.as_slice(), FirstTimeCheck, platform_version) .expect("expected to check tx"); assert!(validation_result.errors.is_empty()); let check_result = platform - .check_tx(serialized.as_slice(), Recheck) + .check_tx(serialized.as_slice(), Recheck, platform_version) .expect("expected to check tx"); assert!(check_result.is_valid()); @@ -478,7 +488,7 @@ mod tests { .expect("expected to process state transition"); let check_result = platform - .check_tx(serialized.as_slice(), Recheck) + .check_tx(serialized.as_slice(), Recheck, platform_version) .expect("expected to check tx"); assert!(check_result.is_valid()); // it should still be valid, because we didn't commit the transaction @@ -491,7 +501,7 @@ mod tests { .expect("expected to commit"); let check_result = platform - .check_tx(serialized.as_slice(), Recheck) + .check_tx(serialized.as_slice(), Recheck, platform_version) .expect("expected to check tx"); assert!(!check_result.is_valid()); // the identity shouldn't have enough balance anymore @@ -501,7 +511,8 @@ mod tests { fn document_update_check_tx() { let mut platform = TestPlatformBuilder::new() .with_config(PlatformConfig::default()) - .build_with_mock_rpc(); + .build_with_mock_rpc() + .set_genesis_state(); platform .core_rpc @@ -634,19 +645,10 @@ mod tests { .serialize_to_bytes() .expect("expected documents batch serialized state transition"); - platform - .drive - .create_initial_state_structure(None, platform_version) - .expect("expected to create state structure"); - let transaction = platform.drive.grove.start_transaction(); let validation_result = platform - .execute_tx( - identity_create_serialized_transition, - &BlockInfo::default(), - &transaction, - ) + .execute_tx(identity_create_serialized_transition, &transaction) .expect("expected to execute identity_create tx"); assert!( @@ -656,19 +658,11 @@ mod tests { ); let validation_result = platform - .execute_tx( - data_contract_create_serialized_transition, - &BlockInfo::default(), - &transaction, - ) + .execute_tx(data_contract_create_serialized_transition, &transaction) .expect("expected to execute data_contract_create tx"); assert!(matches!(validation_result, SuccessfulPaidExecution(..))); let validation_result = platform - .execute_tx( - documents_batch_create_serialized_transition, - &BlockInfo::default(), - &transaction, - ) + .execute_tx(documents_batch_create_serialized_transition, &transaction) .expect("expected to execute document_create tx"); assert!(matches!(validation_result, SuccessfulPaidExecution(..))); @@ -683,6 +677,7 @@ mod tests { .check_tx( documents_batch_update_serialized_transition.as_slice(), FirstTimeCheck, + platform_version, ) .expect("expected to check tx"); @@ -759,11 +754,7 @@ mod tests { let transaction = platform.drive.grove.start_transaction(); let validation_result = platform - .execute_tx( - identity_create_serialized_transition, - &BlockInfo::default(), - &transaction, - ) + .execute_tx(identity_create_serialized_transition, &transaction) .expect("expected to execute identity_create tx"); assert!(matches!(validation_result, SuccessfulPaidExecution(..))); @@ -800,6 +791,7 @@ mod tests { .check_tx( identity_top_up_serialized_transition.as_slice(), FirstTimeCheck, + platform_version, ) .expect("expected to check tx"); @@ -808,11 +800,7 @@ mod tests { let transaction = platform.drive.grove.start_transaction(); let validation_result = platform - .execute_tx( - identity_top_up_serialized_transition, - &BlockInfo::default(), - &transaction, - ) + .execute_tx(identity_top_up_serialized_transition, &transaction) .expect("expected to execute identity top up tx"); assert!(matches!(validation_result, SuccessfulPaidExecution(..))); @@ -894,11 +882,7 @@ mod tests { let transaction = platform.drive.grove.start_transaction(); let validation_result = platform - .execute_tx( - identity_create_serialized_transition, - &BlockInfo::default(), - &transaction, - ) + .execute_tx(identity_create_serialized_transition, &transaction) .expect("expected to execute identity_create tx"); assert!(matches!(validation_result, SuccessfulPaidExecution(..))); @@ -935,6 +919,7 @@ mod tests { .check_tx( identity_top_up_serialized_transition.as_slice(), FirstTimeCheck, + platform_version, ) .expect("expected to check tx"); @@ -943,11 +928,7 @@ mod tests { let transaction = platform.drive.grove.start_transaction(); let validation_result = platform - .execute_tx( - identity_top_up_serialized_transition.clone(), - &BlockInfo::default(), - &transaction, - ) + .execute_tx(identity_top_up_serialized_transition.clone(), &transaction) .expect("expected to execute identity top up tx"); assert!(matches!(validation_result, SuccessfulPaidExecution(..))); @@ -962,6 +943,7 @@ mod tests { .check_tx( identity_top_up_serialized_transition.as_slice(), FirstTimeCheck, + platform_version, ) .expect("expected to check tx"); @@ -973,7 +955,11 @@ mod tests { )); let validation_result = platform - .check_tx(identity_top_up_serialized_transition.as_slice(), Recheck) + .check_tx( + identity_top_up_serialized_transition.as_slice(), + Recheck, + platform_version, + ) .expect("expected to check tx"); assert!(matches!( @@ -1062,6 +1048,7 @@ mod tests { .check_tx( identity_top_up_serialized_transition.as_slice(), FirstTimeCheck, + platform_version, ) .expect("expected to check tx"); @@ -1143,11 +1130,7 @@ mod tests { let transaction = platform.drive.grove.start_transaction(); let validation_result = platform - .execute_tx( - identity_create_serialized_transition, - &BlockInfo::default(), - &transaction, - ) + .execute_tx(identity_create_serialized_transition, &transaction) .expect("expected to execute identity_create tx"); assert!(matches!(validation_result, SuccessfulPaidExecution(..))); @@ -1184,6 +1167,7 @@ mod tests { .check_tx( identity_top_up_serialized_transition.as_slice(), FirstTimeCheck, + platform_version, ) .expect("expected to check tx"); @@ -1192,11 +1176,7 @@ mod tests { let transaction = platform.drive.grove.start_transaction(); let validation_result = platform - .execute_tx( - identity_top_up_serialized_transition.clone(), - &BlockInfo::default(), - &transaction, - ) + .execute_tx(identity_top_up_serialized_transition.clone(), &transaction) .expect("expected to execute identity top up tx"); assert!(matches!(validation_result, SuccessfulPaidExecution(..))); @@ -1251,6 +1231,7 @@ mod tests { .check_tx( identity_create_serialized_transition.as_slice(), FirstTimeCheck, + platform_version, ) .expect("expected to check tx"); @@ -1262,7 +1243,11 @@ mod tests { )); let validation_result = platform - .check_tx(identity_create_serialized_transition.as_slice(), Recheck) + .check_tx( + identity_create_serialized_transition.as_slice(), + Recheck, + platform_version, + ) .expect("expected to check tx"); assert!(matches!( @@ -1374,7 +1359,11 @@ mod tests { .expect("expected to serialize"); let validation_result = platform - .check_tx(update_transition_bytes.as_slice(), FirstTimeCheck) + .check_tx( + update_transition_bytes.as_slice(), + FirstTimeCheck, + platform_version, + ) .expect("expected to execute identity top up tx"); // Only master keys can sign an update @@ -1500,7 +1489,11 @@ mod tests { .expect("expected to serialize"); let validation_result = platform - .check_tx(update_transition_bytes.as_slice(), FirstTimeCheck) + .check_tx( + update_transition_bytes.as_slice(), + FirstTimeCheck, + platform_version, + ) .expect("expected to execute identity top up tx"); // we won't have enough funds diff --git a/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/mod.rs b/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/mod.rs index fe2df6ea99..86cd53cdac 100644 --- a/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/mod.rs @@ -22,9 +22,9 @@ where transaction: &Transaction, ) -> Result { let state = self.state.read().expect("expected to get state"); - let current_protocol_version = state.current_protocol_version_in_consensus(); + let platform_version = state.current_platform_version()?; drop(state); - let platform_version = PlatformVersion::get(current_protocol_version)?; + match platform_version.drive_abci.methods.engine.init_chain { 0 => self.init_chain_v0(request, transaction, platform_version), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { diff --git a/packages/rs-drive-abci/src/execution/engine/run_block_proposal/mod.rs b/packages/rs-drive-abci/src/execution/engine/run_block_proposal/mod.rs index aee3c50528..639c2dd8fa 100644 --- a/packages/rs-drive-abci/src/execution/engine/run_block_proposal/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/run_block_proposal/mod.rs @@ -46,9 +46,9 @@ where ) -> Result, Error> { let state = self.state.read().expect("expected to get state"); - let current_protocol_version = state.current_protocol_version_in_consensus(); + let platform_version = state.current_platform_version()?; drop(state); - let platform_version = PlatformVersion::get(current_protocol_version)?; + let epoch_info = self.gather_epoch_info(&block_proposal, transaction, platform_version)?; match platform_version diff --git a/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs b/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs index 8c06b7344f..98216c72f8 100644 --- a/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs @@ -67,9 +67,6 @@ where platform_version: &PlatformVersion, ) -> Result, Error> { - // Start by getting information from the state - let state = self.state.read().unwrap(); - tracing::trace!( method = "run_block_proposal_v0", ?block_proposal, @@ -79,12 +76,15 @@ where block_proposal.round, ); + // Start by getting information from the state + let state = self.state.read().unwrap(); + let last_block_time_ms = state.last_committed_block_time_ms(); let last_block_height = state.last_committed_known_height_or(self.config.abci.genesis_height.saturating_sub(1)); let last_block_core_height = state.last_committed_known_core_height_or(self.config.abci.genesis_core_height); - let hpmn_list_len = state.hpmn_list_len(); + let hpmn_list_len = state.hpmn_list_len() as u32; let mut block_platform_state = state.clone(); @@ -230,99 +230,58 @@ where Error::Execution(ExecutionError::UpdateValidatorProposedAppVersionError(e)) })?; // This is a system error - let mut block_execution_context = block_execution_context::v0::BlockExecutionContextV0 { - block_state_info: block_state_info.into(), - epoch_info: epoch_info.clone(), - hpmn_count: hpmn_list_len as u32, - unsigned_withdrawal_transactions: Default::default(), - block_platform_state, - proposer_results: None, - }; - // Determine a new protocol version if enough proposers voted - if block_execution_context - .epoch_info - .is_epoch_change_but_not_genesis() - { + if epoch_info.is_epoch_change_but_not_genesis() { tracing::info!( - epoch_index = block_execution_context.epoch_info.current_epoch_index(), + epoch_index = epoch_info.current_epoch_index(), "epoch change occurring from epoch {} to epoch {}", - block_execution_context - .epoch_info + epoch_info .previous_epoch_index() .expect("must be set since we aren't on genesis"), - block_execution_context.epoch_info.current_epoch_index(), + epoch_info.current_epoch_index(), ); - if block_execution_context - .block_platform_state - .current_protocol_version_in_consensus() - == block_execution_context - .block_platform_state - .next_epoch_protocol_version() + if block_platform_state.current_protocol_version_in_consensus() + == block_platform_state.next_epoch_protocol_version() { tracing::trace!( - epoch_index = block_execution_context.epoch_info.current_epoch_index(), + epoch_index = epoch_info.current_epoch_index(), "protocol version remains the same {}", - block_execution_context - .block_platform_state - .current_protocol_version_in_consensus(), + block_platform_state.current_protocol_version_in_consensus(), ); } else { tracing::info!( - epoch_index = block_execution_context.epoch_info.current_epoch_index(), + epoch_index = epoch_info.current_epoch_index(), "protocol version changed from {} to {}", - block_execution_context - .block_platform_state - .current_protocol_version_in_consensus(), - block_execution_context - .block_platform_state - .next_epoch_protocol_version(), + block_platform_state.current_protocol_version_in_consensus(), + block_platform_state.next_epoch_protocol_version(), ); } // Set current protocol version to the version from upcoming epoch - block_execution_context - .block_platform_state - .set_current_protocol_version_in_consensus( - block_execution_context - .block_platform_state - .next_epoch_protocol_version(), - ); + block_platform_state.set_current_protocol_version_in_consensus( + block_platform_state.next_epoch_protocol_version(), + ); // Determine new protocol version based on votes for the next epoch let maybe_new_protocol_version = self.check_for_desired_protocol_upgrade( - block_execution_context.hpmn_count, - block_execution_context - .block_platform_state - .current_protocol_version_in_consensus(), + hpmn_list_len, + block_platform_state.current_protocol_version_in_consensus(), transaction, )?; if let Some(new_protocol_version) = maybe_new_protocol_version { - block_execution_context - .block_platform_state - .set_next_epoch_protocol_version(new_protocol_version); + block_platform_state.set_next_epoch_protocol_version(new_protocol_version); } else { - block_execution_context - .block_platform_state - .set_next_epoch_protocol_version( - block_execution_context - .block_platform_state - .current_protocol_version_in_consensus(), - ); + block_platform_state.set_next_epoch_protocol_version( + block_platform_state.current_protocol_version_in_consensus(), + ); } } - let mut block_execution_context: BlockExecutionContext = block_execution_context.into(); - // Mark all previously broadcasted and chainlocked withdrawals as complete // only when we are on a new core height - if block_execution_context - .block_state_info() - .core_chain_locked_height() - != last_block_core_height - { + if block_state_info.core_chain_locked_height() != last_block_core_height { self.update_broadcasted_withdrawal_statuses( &block_info, transaction, @@ -331,34 +290,28 @@ where } // Preparing withdrawal transactions for signing and broadcasting - { - // To process withdrawals we need to dequeue untiled transactions from the withdrawal transactions queue - // Untiled transactions then converted to unsigned transactions, appending current block information - // required for signature verification (core height and quorum hash) - let unsigned_withdrawal_transaction_bytes = self - .dequeue_and_build_unsigned_withdrawal_transactions( - validator_set_quorum_hash, - &block_info, - Some(transaction), - platform_version, - )?; - - // Save unsigned transaction bytes to block execution context - // to be signed (on extend_vote), verified (on verify_vote) and broadcasted (on finalize_block) - block_execution_context - .set_unsigned_withdrawal_transactions(unsigned_withdrawal_transaction_bytes); - } + // To process withdrawals we need to dequeue untiled transactions from the withdrawal transactions queue + // Untiled transactions then converted to unsigned transactions, appending current block information + // required for signature verification (core height and quorum hash) + // Then we save unsigned transaction bytes to block execution context + // to be signed (on extend_vote), verified (on verify_vote) and broadcasted (on finalize_block) + let unsigned_withdrawal_transaction_bytes = self + .dequeue_and_build_unsigned_withdrawal_transactions( + validator_set_quorum_hash, + &block_info, + Some(transaction), + platform_version, + )?; + // Process transactions let state_transitions_result = self.process_raw_state_transitions( raw_state_transitions, - block_execution_context.block_platform_state(), + &block_platform_state, &block_info, transaction, platform_version, )?; - let mut block_execution_context: BlockExecutionContext = block_execution_context; - // Pool withdrawals into transactions queue // Takes queued withdrawals, creates untiled withdrawal transaction payload, saves them to queue @@ -369,6 +322,19 @@ where platform_version, )?; + // Create a new block execution context + + let mut block_execution_context: BlockExecutionContext = + block_execution_context::v0::BlockExecutionContextV0 { + block_state_info: block_state_info.into(), + epoch_info: epoch_info.clone(), + hpmn_count: hpmn_list_len, + unsigned_withdrawal_transactions: unsigned_withdrawal_transaction_bytes, + block_platform_state, + proposer_results: None, + } + .into(); + // while we have the state transitions executed, we now need to process the block fees let block_fees_v0: BlockFeesV0 = state_transitions_result.aggregated_fees().clone().into(); diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_end/update_drive_cache/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_end/update_drive_cache/v0/mod.rs index bed5932843..1947221527 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/block_end/update_drive_cache/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/block_end/update_drive_cache/v0/mod.rs @@ -9,13 +9,15 @@ where /// the data contract cache and the platform versions cache. /// pub(super) fn update_drive_cache_v0(&self) { - let mut drive_cache = self.drive.cache.write().unwrap(); - // Update global cache with updated contracts - drive_cache.cached_contracts.merge_block_cache(); - // This is unnecessary since we clear block cache before every proposal execution - drive_cache.cached_contracts.clear_block_cache(); + self.drive + .cache + .data_contracts + .merge_and_clear_block_cache(); + + let mut protocol_versions_counter = + self.drive.cache.protocol_versions_counter.write().unwrap(); - drive_cache.protocol_versions_counter.merge_block_cache() + protocol_versions_counter.merge_block_cache() } } diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_end/update_state_cache/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_end/update_state_cache/v0/mod.rs index 115f360179..12b23df2ca 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/block_end/update_state_cache/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/block_end/update_state_cache/v0/mod.rs @@ -40,16 +40,21 @@ where transaction: &Transaction, platform_version: &PlatformVersion, ) -> Result<(), Error> { - let mut block_execution_context = self.block_execution_context.write().unwrap(); + let mut block_execution_context_guard = self.block_execution_context.write().unwrap(); - let block_execution_context = block_execution_context.take().ok_or(Error::Execution( - ExecutionError::CorruptedCodeExecution("there should be a block execution context"), - ))?; + let block_execution_context = + block_execution_context_guard + .take() + .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( + "there should be a block execution context", + )))?; let mut state_cache = self.state.write().unwrap(); *state_cache = block_execution_context.block_platform_state_owned(); + drop(block_execution_context_guard); + if let Some(next_validator_set_quorum_hash) = state_cache.take_next_validator_set_quorum_hash() { diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_start/clear_drive_block_cache/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_start/clear_drive_block_cache/v0/mod.rs index 1529688bf4..31af9c5035 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/block_start/clear_drive_block_cache/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/block_start/clear_drive_block_cache/v0/mod.rs @@ -9,9 +9,11 @@ where /// the block data contract cache and the block platform versions cache. /// pub(super) fn clear_drive_block_cache_v0(&self) { - let mut drive_cache = self.drive.cache.write().unwrap(); + self.drive.cache.data_contracts.clear_block_cache(); - drive_cache.cached_contracts.clear_block_cache(); - drive_cache.protocol_versions_counter.clear_block_cache() + let mut protocol_versions_counter = + self.drive.cache.protocol_versions_counter.write().unwrap(); + + protocol_versions_counter.clear_block_cache() } } diff --git a/packages/rs-drive-abci/src/execution/platform_events/epoch/gather_epoch_info/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/epoch/gather_epoch_info/v0/mod.rs index ea3dd74b65..373531cb5f 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/epoch/gather_epoch_info/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/epoch/gather_epoch_info/v0/mod.rs @@ -18,8 +18,8 @@ impl Platform { ) -> Result { // Start by getting information from the state let state = self.state.read().unwrap(); - let last_block_time_ms = state.last_committed_block_time_ms(); + drop(state); // Init block execution context let block_state_info = block_state_info::v0::BlockStateInfoV0::from_block_proposal( diff --git a/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/fetch_reward_shares_list_for_masternode/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/fetch_reward_shares_list_for_masternode/v0/mod.rs index ab98ca11eb..0ba65237c5 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/fetch_reward_shares_list_for_masternode/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/fetch_reward_shares_list_for_masternode/v0/mod.rs @@ -32,15 +32,17 @@ impl Platform { transaction: TransactionArg, platform_version: &PlatformVersion, ) -> Result, Error> { - let cache = self.drive.cache.read().unwrap(); - - let masternode_rewards_contract = &cache.system_data_contracts.masternode_reward_shares; + let masternode_rewards_contract = self + .drive + .cache + .system_data_contracts + .read_masternode_reward_shares(); let document_type = masternode_rewards_contract.document_type_for_name(MN_REWARD_SHARES_DOCUMENT_TYPE)?; let drive_query = DriveQuery { - contract: masternode_rewards_contract, + contract: &masternode_rewards_contract, document_type, internal_clauses: InternalClauses { primary_key_in_clause: None, diff --git a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs index e9eb70c81c..3e9f3aa6ca 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs @@ -81,22 +81,22 @@ impl Platform { // Create system identities and contracts - let cache = self.drive.cache.read().unwrap(); + let system_data_contracts = &self.drive.cache.system_data_contracts; - let dpns_data_contract = cache.system_data_contracts.dpns.clone(); + let dpns_data_contract = system_data_contracts.read_dpns().clone(); let system_data_contract_types = BTreeMap::from_iter([ ( SystemDataContract::DPNS, ( - cache.system_data_contracts.dpns.clone(), + system_data_contracts.read_dpns().clone(), system_identity_public_keys.dpns_contract_owner(), ), ), ( SystemDataContract::Withdrawals, ( - cache.system_data_contracts.withdrawals.clone(), + system_data_contracts.read_withdrawals().clone(), system_identity_public_keys.withdrawals_contract_owner(), ), ), @@ -114,21 +114,21 @@ impl Platform { ( SystemDataContract::Dashpay, ( - cache.system_data_contracts.dashpay.clone(), + system_data_contracts.read_dashpay().clone(), system_identity_public_keys.dashpay_contract_owner(), ), ), ( SystemDataContract::MasternodeRewards, ( - cache.system_data_contracts.masternode_reward_shares.clone(), + system_data_contracts + .read_masternode_reward_shares() + .clone(), system_identity_public_keys.masternode_reward_shares_contract_owner(), ), ), ]); - drop(cache); - for (_, (data_contract, identity_public_keys_set)) in system_data_contract_types { let public_keys = [ ( diff --git a/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/check_for_desired_protocol_upgrade/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/check_for_desired_protocol_upgrade/v0/mod.rs index dfd442eb4b..beb752f230 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/check_for_desired_protocol_upgrade/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/check_for_desired_protocol_upgrade/v0/mod.rs @@ -30,11 +30,11 @@ impl Platform { // if we are at an epoch change, check to see if over 75% of blocks of previous epoch // were on the future version - let mut cache = self.drive.cache.write().unwrap(); - let mut versions_passing_threshold = cache - .protocol_versions_counter - .versions_passing_threshold(required_upgraded_hpns); - drop(cache); + let mut protocol_versions_counter = + self.drive.cache.protocol_versions_counter.write().unwrap(); + let mut versions_passing_threshold = + protocol_versions_counter.versions_passing_threshold(required_upgraded_hpns); + drop(protocol_versions_counter); if versions_passing_threshold.len() > 1 { return Err(Error::Execution( diff --git a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_raw_state_transitions/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_raw_state_transitions/v0/mod.rs index 204cbe2662..b82077e350 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_raw_state_transitions/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_raw_state_transitions/v0/mod.rs @@ -64,7 +64,6 @@ where state: block_platform_state, config: &self.config, core_rpc: &self.core_rpc, - block_info, }; let mut processing_result = StateTransitionsProcessingResult::default(); diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/dequeue_and_build_unsigned_withdrawal_transactions/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/dequeue_and_build_unsigned_withdrawal_transactions/v0/mod.rs index d805a4db0a..7c8ac25ef3 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/dequeue_and_build_unsigned_withdrawal_transactions/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/dequeue_and_build_unsigned_withdrawal_transactions/v0/mod.rs @@ -74,14 +74,12 @@ where transaction_indices.last().expect("must be present") ); - let cache = self.drive.cache.read().unwrap(); + let withdrawals_contract = self.drive.cache.system_data_contracts.read_withdrawals(); self.drive.add_update_multiple_documents_operations( &documents, - &cache.system_data_contracts.withdrawals, - cache - .system_data_contracts - .withdrawals + &withdrawals_contract, + withdrawals_contract .document_type_for_name(withdrawal::NAME) .map_err(|_| { Error::Execution(ExecutionError::CorruptedCodeExecution( diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v0/mod.rs index a4ece9021e..d4f23e18b1 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v0/mod.rs @@ -109,14 +109,12 @@ where end_transaction_index, ); - let cache = self.drive.cache.read().unwrap(); + let withdrawals_contract = self.drive.cache.system_data_contracts.read_withdrawals(); self.drive.add_update_multiple_documents_operations( &documents, - &cache.system_data_contracts.withdrawals, - cache - .system_data_contracts - .withdrawals + &withdrawals_contract, + withdrawals_contract .document_type_for_name(withdrawal::NAME) .map_err(|_| { Error::Execution(ExecutionError::CorruptedCodeExecution( diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/update_broadcasted_withdrawal_statuses/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/update_broadcasted_withdrawal_statuses/v0/mod.rs index 68ef67c202..90b0291997 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/update_broadcasted_withdrawal_statuses/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/update_broadcasted_withdrawal_statuses/v0/mod.rs @@ -133,14 +133,12 @@ where return Ok(()); } - let cache = self.drive.cache.read().unwrap(); + let withdrawals_contract = self.drive.cache.system_data_contracts.read_withdrawals(); self.drive.add_update_multiple_documents_operations( &documents_to_update, - &cache.system_data_contracts.withdrawals, - cache - .system_data_contracts - .withdrawals + &withdrawals_contract, + withdrawals_contract .document_type_for_name(withdrawal::NAME) .map_err(|_| { Error::Execution(ExecutionError::CorruptedCodeExecution( diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs index a2e83aaf42..396f18f61e 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs @@ -61,7 +61,7 @@ pub(super) fn state_transition_to_execution_event_for_check_tx_v0<'a, C: CoreRPC let result = state_transition.validate_nonces( &platform.into(), - platform.block_info, + platform.state.last_block_info(), None, platform_version, )?; @@ -158,7 +158,7 @@ pub(super) fn state_transition_to_execution_event_for_check_tx_v0<'a, C: CoreRPC let result = state_transition.validate_balance( maybe_identity.as_mut(), &platform.into(), - platform.block_info, + platform.state.last_block_info(), None, platform_version, )?; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/validate/chain/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/validate/chain/mod.rs index 619c9b7d81..1ab5b225e1 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/validate/chain/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/validate/chain/mod.rs @@ -10,6 +10,7 @@ use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; use crate::execution::validation::state_transition::common::asset_lock::proof::validate::AssetLockProofValidation; use crate::execution::validation::state_transition::common::asset_lock::proof::verify_is_not_spent::AssetLockProofVerifyIsNotSpent; +use crate::platform_types::platform_state::v0::PlatformStateV0Methods; // TODO: Versioning impl AssetLockProofValidation for ChainAssetLockProof { @@ -21,10 +22,10 @@ impl AssetLockProofValidation for ChainAssetLockProof { ) -> Result { let mut result = SimpleConsensusValidationResult::default(); - if platform_ref.block_info.core_height < self.core_chain_locked_height { + if platform_ref.state.last_committed_core_height() < self.core_chain_locked_height { result.add_error(InvalidAssetLockProofCoreChainHeightError::new( self.core_chain_locked_height, - platform_ref.block_info.core_height, + platform_ref.state.last_committed_core_height(), )); return Ok(result); diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/validate/instant/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/validate/instant/mod.rs index 7972ad50cf..cade050df5 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/validate/instant/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/validate/instant/mod.rs @@ -10,6 +10,7 @@ use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; use crate::execution::validation::state_transition::common::asset_lock::proof::validate::AssetLockProofValidation; use crate::execution::validation::state_transition::common::asset_lock::proof::verify_is_not_spent::AssetLockProofVerifyIsNotSpent; +use crate::platform_types::platform_state::v0::PlatformStateV0Methods; // TODO: Versioning impl AssetLockProofValidation for InstantAssetLockProof { @@ -23,9 +24,10 @@ impl AssetLockProofValidation for InstantAssetLockProof { // Verify instant lock signature with Core - let is_instant_lock_signature_valid = self - .instant_lock() - .verify_signature(platform_ref.core_rpc, platform_ref.block_info.core_height)?; + let is_instant_lock_signature_valid = self.instant_lock().verify_signature( + platform_ref.core_rpc, + platform_ref.state.last_committed_core_height(), + )?; if !is_instant_lock_signature_valid { result.add_error(InvalidInstantAssetLockProofSignatureError::new()); diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs index c25b7382ed..3c180e5890 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs @@ -113,7 +113,7 @@ pub(in crate::execution) fn process_state_transition_v0<'a, C: CoreRPCLike>( let result = state_transition.validate_balance( maybe_identity.as_mut(), &platform.into(), - platform.block_info, + platform.state.last_block_info(), transaction, platform_version, )?; @@ -125,7 +125,7 @@ pub(in crate::execution) fn process_state_transition_v0<'a, C: CoreRPCLike>( // Validating identity contract nonce, this must happen after validating the signature let result = state_transition.validate_nonces( &platform.into(), - platform.block_info, + platform.state.last_block_info(), transaction, platform_version, )?; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs index 9ad789d320..8df547254f 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs @@ -5,7 +5,7 @@ mod structure; use dpp::prelude::ConsensusValidationResult; use dpp::state_transition::data_contract_create_transition::DataContractCreateTransition; use dpp::validation::SimpleConsensusValidationResult; -use dpp::version::PlatformVersion; +use dpp::version::{PlatformVersion, PlatformVersionCurrentVersion}; use drive::grovedb::TransactionArg; use drive::state_transition_action::StateTransitionAction; @@ -34,8 +34,8 @@ impl StateTransitionActionTransformerV0 for DataContractCreateTransition { _execution_context: &mut StateTransitionExecutionContext, _tx: TransactionArg, ) -> Result, Error> { - let platform_version = - PlatformVersion::get(platform.state.current_protocol_version_in_consensus())?; + let platform_version = platform.state.current_platform_version()?; + match platform_version .drive_abci .validation_and_processing @@ -83,8 +83,8 @@ impl StateTransitionStateValidationV0 for DataContractCreateTransition { _execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, ) -> Result, Error> { - let platform_version = - PlatformVersion::get(platform.state.current_protocol_version_in_consensus())?; + let platform_version = platform.state.current_platform_version()?; + match platform_version .drive_abci .validation_and_processing diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs index 1017a908ce..41260881b7 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs @@ -33,8 +33,8 @@ impl StateTransitionActionTransformerV0 for DataContractUpdateTransition { _execution_context: &mut StateTransitionExecutionContext, _tx: TransactionArg, ) -> Result, Error> { - let platform_version = - PlatformVersion::get(platform.state.current_protocol_version_in_consensus())?; + let platform_version = platform.state.current_platform_version()?; + match platform_version .drive_abci .validation_and_processing @@ -138,6 +138,7 @@ mod tests { use dpp::state_transition::data_contract_update_transition::DataContractUpdateTransition; use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; + use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use dpp::version::TryFromPlatformVersioned; use platform_version::version::LATEST_PLATFORM_VERSION; use platform_version::{DefaultForPlatformVersion, TryIntoPlatformVersioned}; @@ -188,12 +189,13 @@ mod tests { signature_public_key_id: 0, }; + let state = platform.state.read().unwrap(); + let platform_ref = PlatformRef { drive: &platform.drive, - state: &platform.state.read().unwrap(), + state: &state, config: &platform.config, core_rpc: &platform.core_rpc, - block_info: &BlockInfo::default(), }; let mut execution_context = @@ -267,12 +269,13 @@ mod tests { signature_public_key_id: 0, }; + let state = platform.state.read().unwrap(); + let platform_ref = PlatformRef { drive: &platform.drive, - state: &platform.state.read().unwrap(), + state: &state, config: &platform.config, core_rpc: &platform.core_rpc, - block_info: &BlockInfo::default(), }; let mut execution_context = @@ -416,12 +419,13 @@ mod tests { let state_transition: DataContractUpdateTransition = state_transition.into(); + let state = platform.state.read().unwrap(); + let platform_ref = PlatformRef { drive: &platform.drive, - state: &platform.state.read().unwrap(), + state: &state, config: &platform.config, core_rpc: &platform.core_rpc, - block_info: &BlockInfo::default(), }; let mut execution_context = diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/mod.rs index c028265335..8b6998db1e 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/mod.rs @@ -22,8 +22,8 @@ impl StateTransitionStateValidationV0 for DataContractUpdateTransition { _execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, ) -> Result, Error> { - let platform_version = - PlatformVersion::get(platform.state.current_protocol_version_in_consensus())?; + let platform_version = platform.state.current_platform_version()?; + match platform_version .drive_abci .validation_and_processing diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs index 2866ef1adf..ea5ddbe072 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs @@ -40,8 +40,8 @@ impl StateTransitionActionTransformerV0 for DocumentsBatchTransition { _execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, ) -> Result, Error> { - let platform_version = - PlatformVersion::get(platform.state.current_protocol_version_in_consensus())?; + let platform_version = platform.state.current_platform_version()?; + match platform_version .drive_abci .validation_and_processing @@ -166,8 +166,7 @@ impl StateTransitionStateValidationV0 for DocumentsBatchTransition { _execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, ) -> Result, Error> { - let platform_version = - PlatformVersion::get(platform.state.current_protocol_version_in_consensus())?; + let platform_version = platform.state.current_platform_version()?; match platform_version .drive_abci diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/fetch_documents.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/fetch_documents.rs index 6ca0dc3544..2f39393efc 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/fetch_documents.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/fetch_documents.rs @@ -82,7 +82,7 @@ pub(crate) fn fetch_documents_for_transitions_knowing_contract_id_and_document_t let add_to_cache_if_pulled = transaction.is_some(); let (_, contract_fetch_info) = drive.get_contract_with_fetch_info_and_fee( contract_id.to_buffer(), - Some(&platform.state.last_committed_block_epoch()), + Some(platform.state.last_committed_block_epoch_ref()), add_to_cache_if_pulled, transaction, platform_version, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs index fba7c1cb58..58241cb613 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs @@ -161,10 +161,13 @@ impl DocumentsBatchStateTransitionStateValidationV0 for DocumentsBatchTransition tx: TransactionArg, ) -> Result, Error> { let platform_version = platform.state.current_platform_version()?; + let mut execution_context = StateTransitionExecutionContext::default_for_platform_version(platform_version)?; + let validation_result = self.try_into_action_v0(platform, validate, tx, &mut execution_context)?; + Ok(validation_result.map(Into::into)) } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/mod.rs index 23661be98c..19600f0f1c 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/mod.rs @@ -33,8 +33,8 @@ impl StateTransitionActionTransformerV0 for IdentityCreditTransferTransition { _execution_context: &mut StateTransitionExecutionContext, _tx: TransactionArg, ) -> Result, Error> { - let platform_version = - PlatformVersion::get(platform.state.current_protocol_version_in_consensus())?; + let platform_version = platform.state.current_platform_version()?; + match platform_version .drive_abci .validation_and_processing @@ -82,8 +82,8 @@ impl StateTransitionStateValidationV0 for IdentityCreditTransferTransition { _execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, ) -> Result, Error> { - let platform_version = - PlatformVersion::get(platform.state.current_protocol_version_in_consensus())?; + let platform_version = platform.state.current_platform_version()?; + match platform_version .drive_abci .validation_and_processing diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs index 08ab182ca9..9af6130534 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs @@ -34,8 +34,8 @@ impl StateTransitionActionTransformerV0 for IdentityCreditWithdrawalTransition { _execution_context: &mut StateTransitionExecutionContext, _tx: TransactionArg, ) -> Result, Error> { - let platform_version = - PlatformVersion::get(platform.state.current_protocol_version_in_consensus())?; + let platform_version = platform.state.current_platform_version()?; + match platform_version .drive_abci .validation_and_processing @@ -84,8 +84,8 @@ impl StateTransitionStateValidationV0 for IdentityCreditWithdrawalTransition { _execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, ) -> Result, Error> { - let platform_version = - PlatformVersion::get(platform.state.current_protocol_version_in_consensus())?; + let platform_version = platform.state.current_platform_version()?; + match platform_version .drive_abci .validation_and_processing diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/mod.rs index e4ea255968..9f795234b1 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/mod.rs @@ -34,8 +34,8 @@ impl StateTransitionActionTransformerV0 for IdentityTopUpTransition { execution_context: &mut StateTransitionExecutionContext, _tx: TransactionArg, ) -> Result, Error> { - let platform_version = - PlatformVersion::get(platform.state.current_protocol_version_in_consensus())?; + let platform_version = platform.state.current_platform_version()?; + match platform_version .drive_abci .validation_and_processing @@ -83,8 +83,8 @@ impl StateTransitionStateValidationV0 for IdentityTopUpTransition { execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, ) -> Result, Error> { - let platform_version = - PlatformVersion::get(platform.state.current_protocol_version_in_consensus())?; + let platform_version = platform.state.current_platform_version()?; + match platform_version .drive_abci .validation_and_processing diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/mod.rs index 2f1d062a37..2af9cb76ed 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/mod.rs @@ -35,8 +35,8 @@ impl StateTransitionActionTransformerV0 for IdentityUpdateTransition { _execution_context: &mut StateTransitionExecutionContext, _tx: TransactionArg, ) -> Result, Error> { - let platform_version = - PlatformVersion::get(platform.state.current_protocol_version_in_consensus())?; + let platform_version = platform.state.current_platform_version()?; + match platform_version .drive_abci .validation_and_processing @@ -84,8 +84,7 @@ impl StateTransitionStateValidationV0 for IdentityUpdateTransition { _execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, ) -> Result, Error> { - let platform_version = - PlatformVersion::get(platform.state.current_protocol_version_in_consensus())?; + let platform_version = platform.state.current_platform_version()?; match platform_version .drive_abci .validation_and_processing diff --git a/packages/rs-drive-abci/src/lib.rs b/packages/rs-drive-abci/src/lib.rs index ac645f7582..5e475d189a 100644 --- a/packages/rs-drive-abci/src/lib.rs +++ b/packages/rs-drive-abci/src/lib.rs @@ -37,9 +37,14 @@ pub mod metrics; pub mod test; /// Mimic of block execution for tests -#[cfg(all(feature = "server", any(feature = "mocks", test)))] +#[cfg(any(feature = "mocks", test))] pub mod mimic; /// Platform module pub mod platform_types; /// Querying pub mod query; +/// Various utils +pub mod utils; + +/// Drive server +pub mod server; diff --git a/packages/rs-drive-abci/src/logging/logger.rs b/packages/rs-drive-abci/src/logging/logger.rs index bb2755baed..121ce76b93 100644 --- a/packages/rs-drive-abci/src/logging/logger.rs +++ b/packages/rs-drive-abci/src/logging/logger.rs @@ -177,19 +177,24 @@ impl Loggers { /// drive_abci::logging::Loggers::default().try_install().ok(); /// ``` pub fn try_install(&self) -> Result<(), Error> { - // Based on examples from https://docs.rs/tracing-subscriber/0.3.17/tracing_subscriber/layer/index.html - let loggers = self - .0 - .values() - .map(|l| Ok(Box::new(l.layer()?))) - .collect::, _>>()?; + let layers = self.tracing_subscriber_layers()?; registry() - .with(loggers) + .with(layers) .try_init() .map_err(Error::TryInitError) } + /// Returns tracing subscriber layers + pub fn tracing_subscriber_layers(&self) -> Result>>, Error> { + // Based on examples from https://docs.rs/tracing-subscriber/0.3.17/tracing_subscriber/layer/index.html + + self.0 + .values() + .map(|l| Ok(Box::new(l.layer()?))) + .collect::, _>>() + } + /// Flushes all loggers. /// /// In case of multiple errors, returns only the last one. @@ -313,7 +318,9 @@ impl Logger { let formatter = fmt::layer::() .with_writer(make_writer) - .with_ansi(ansi); + .with_ansi(ansi) + .with_thread_names(true) + .with_thread_ids(true); let formatter = match self.format { LogFormat::Full => formatter.with_filter(filter).boxed(), diff --git a/packages/rs-drive-abci/src/main.rs b/packages/rs-drive-abci/src/main.rs index 40c71f7e4c..9eaeabab40 100644 --- a/packages/rs-drive-abci/src/main.rs +++ b/packages/rs-drive-abci/src/main.rs @@ -5,19 +5,24 @@ use clap::{Parser, Subcommand}; use drive_abci::config::{FromEnv, PlatformConfig}; use drive_abci::core::wait_for_core_to_sync::v0::wait_for_core_to_sync_v0; -use drive_abci::logging; use drive_abci::logging::{LogBuilder, LogConfig, LogDestination, Loggers}; use drive_abci::metrics::{Prometheus, DEFAULT_PROMETHEUS_PORT}; +use drive_abci::platform_types::platform::Platform; use drive_abci::rpc::core::DefaultCoreRPC; +use drive_abci::{logging, server}; use itertools::Itertools; use std::fs::remove_file; +use std::net::SocketAddr; use std::path::PathBuf; use std::process::ExitCode; -use tokio::runtime::Builder; +use std::sync::Arc; +use tokio::runtime::{Builder, Runtime}; use tokio::signal::unix::{signal, SignalKind}; use tokio::time::Duration; use tokio_util::sync::CancellationToken; -use tracing::warn; +use tracing_subscriber::layer::SubscriberExt; +use tracing_subscriber::util::SubscriberInitExt; +use tracing_subscriber::{registry, Layer, Registry}; const SHUTDOWN_TIMEOUT_MILIS: u64 = 5000; // 5s; Docker defaults to 10s @@ -60,7 +65,7 @@ struct Cli { command: Commands, /// Path to the config (.env) file. #[arg(short, long, value_hint = clap::ValueHint::FilePath) ] - config: Option, + config: Option, /// Enable verbose logging. Use multiple times for even more logs. /// @@ -82,7 +87,12 @@ struct Cli { } impl Cli { - fn run(self, config: PlatformConfig, cancel: CancellationToken) -> Result<(), String> { + fn run( + self, + runtime: &Runtime, + config: PlatformConfig, + cancel: CancellationToken, + ) -> Result<(), String> { match self.command { Commands::Start => { verify_grovedb(&config.db_path, false)?; @@ -99,9 +109,21 @@ impl Cli { // Drive and Tenderdash rely on Core. Various functions will fail if Core is not synced. // We need to make sure that Core is ready before we start Drive ABCI app // Tenderdash won't start too until ABCI port is open. - wait_for_core_to_sync_v0(&core_rpc, cancel.clone()).unwrap(); + wait_for_core_to_sync_v0(&core_rpc, cancel.clone()).map_err(|e| e.to_string())?; + + if cancel.is_cancelled() { + return Ok(()); + } + + let platform: Platform = Platform::open_with_client( + config.db_path.clone(), + Some(config.clone()), + core_rpc, + ) + .expect("Failed to open platform"); + + server::start(runtime, Arc::new(platform), config, cancel); - drive_abci::abci::start(&config, core_rpc, cancel).map_err(|e| e.to_string())?; return Ok(()); } Commands::Config => dump_config(&config)?, @@ -116,46 +138,84 @@ impl Cli { fn main() -> Result<(), ExitCode> { let cli = Cli::parse(); let config = load_config(&cli.config); - // We use `cancel` to notify other subsystems that the server is shutting down - let cancel = tokio_util::sync::CancellationToken::new(); - - let loggers = configure_logging(&cli, &config).expect("failed to configure logging"); - - install_panic_hook(cancel.clone()); // Start tokio runtime and thread listening for signals. // The runtime will be reused by Prometheus and rs-tenderdash-abci. - - // TODO: 8 MB stack threads as some recursions in GroveDB can be pretty deep - // We could remove such a stack stack size once deletion of a node doesn't recurse in grovedb - let runtime = Builder::new_multi_thread() - .enable_all() + // TODO: 8 MB stack threads as some recursions in GroveDB can be pretty deep + // We could remove such a stack stack size once deletion of a node doesn't recurse in grovedb .thread_stack_size(8 * 1024 * 1024) + .enable_all() .build() .expect("cannot initialize tokio runtime"); - let rt_guard = runtime.enter(); + + // We use `cancel` to notify other subsystems that the server is shutting down + let cancel = CancellationToken::new(); + + let loggers = configure_logging(&cli, &config).expect("failed to configure logging"); + + // If tokio console is enabled, we install loggers together with tokio console + // due to type compatibility issue + + #[cfg(not(feature = "console"))] + loggers.install(); + + #[cfg(feature = "console")] + if config.tokio_console_enabled { + #[cfg(not(tokio_unstable))] + panic!("tokio_unstable flag should be set"); + + // Initialize Tokio console subscriber + + let socket_addr: SocketAddr = config + .tokio_console_address + .parse() + .expect("cannot parse tokio console address"); + + let console_layer = console_subscriber::ConsoleLayer::builder() + .retention(Duration::from_secs(config.tokio_console_retention_secs)) + .server_addr(socket_addr) + .spawn(); + + tracing_subscriber::registry() + .with( + loggers + .tracing_subscriber_layers() + .expect("should return layers"), + ) + .with(console_layer) + .try_init() + .expect("can't init tracing subscribers"); + } else { + loggers.install(); + } + + // Log panics + + install_panic_hook(cancel.clone()); + + // Start runtime in the main thread + + let runtime_guard = runtime.enter(); runtime.spawn(handle_signals(cancel.clone(), loggers)); - // Main thread is not started in runtime, as it is synchronous and we don't want to run into - // potential, hard to debug, issues. - let status = match cli.run(config, cancel) { + let result = match cli.run(&runtime, config, cancel) { Ok(()) => { tracing::debug!("shutdown complete"); - ExitCode::SUCCESS + Ok(()) } Err(e) => { tracing::error!(error = e, "drive-abci failed"); - ExitCode::FAILURE + Err(ExitCode::FAILURE) } }; - drop(rt_guard); + drop(runtime_guard); runtime.shutdown_timeout(Duration::from_millis(SHUTDOWN_TIMEOUT_MILIS)); tracing::info!("drive-abci server is stopped"); - Err(status) + result } /// Handle signals received from operating system @@ -193,16 +253,13 @@ async fn handle_signals(cancel: CancellationToken, logs: Loggers) -> Result<(), /// Start prometheus exporter if it's configured. fn start_prometheus(config: &PlatformConfig) -> Result, String> { let prometheus_addr = config - .abci .prometheus_bind_address .clone() .filter(|s| !s.is_empty()); if let Some(addr) = prometheus_addr { let addr = url::Url::parse(&addr).map_err(|e| e.to_string())?; - Ok(Some( - drive_abci::metrics::Prometheus::new(addr).map_err(|e| e.to_string())?, - )) + Ok(Some(Prometheus::new(addr).map_err(|e| e.to_string())?)) } else { Ok(None) } @@ -219,7 +276,7 @@ fn dump_config(config: &PlatformConfig) -> Result<(), String> { /// Check status of ABCI server. fn check_status(config: &PlatformConfig) -> Result<(), String> { - if let Some(prometheus_addr) = &config.abci.prometheus_bind_address { + if let Some(prometheus_addr) = &config.prometheus_bind_address { let url = url::Url::parse(prometheus_addr).expect("cannot parse ABCI_PROMETHEUS_BIND_ADDRESS"); @@ -302,7 +359,7 @@ fn load_config(path: &Option) -> PlatformConfig { } } else if let Err(e) = dotenvy::dotenv() { if e.not_found() { - warn!("cannot find any matching .env file"); + tracing::warn!("cannot find any matching .env file"); } else { panic!("cannot load config file: {}", e); } @@ -333,7 +390,6 @@ fn configure_logging(cli: &Cli, config: &PlatformConfig) -> Result AbciApplication<'a, C> { +impl<'a, C: CoreRPCLike> FullAbciApplication<'a, C> { /// Execute a block with various state transitions /// Returns the withdrawal transactions that were signed in the block pub fn mimic_execute_block( @@ -173,7 +182,32 @@ impl<'a, C: CoreRPCLike> AbciApplication<'a, C> { tx_results.iter().try_for_each(|tx_result| { if tx_result.code > 0 && !expect_validation_errors.contains(&tx_result.code) { - Err(Error::Abci(AbciError::GenericWithCode(tx_result.code))) + // Deserialize the tx result info that contains + // encoded consensus error if error code is greater than 0 + let info_bytes = decode(&tx_result.info, Encoding::Base64) + .expect("can't decode tx result info from base64 to bytes"); + + let info_cbor_map: BTreeMap = + ciborium::de::from_reader(info_bytes.as_slice()).map_err(|_| { + ProtocolError::StructureError(StructureError::InvalidCBOR( + "unable to decode document for document call", + )) + })?; + let info_map: BTreeMap = Value::convert_from_cbor_map(info_cbor_map) + .map_err(ProtocolError::ValueError)?; + + let data_map: BTreeMap = info_map + .get_optional_str_value_map("data") + .expect("expected data map") + .unwrap(); + + let serialized_error = data_map.get_bytes("serializedError").unwrap(); + + // Deserialize the consensus error + let error = ConsensusError::deserialize_from_bytes(&serialized_error) + .expect("expected to deserialize consensus error"); + + Err(Error::Abci(AbciError::InvalidStateTransition(error))) } else { Ok(()) } @@ -386,7 +420,7 @@ impl<'a, C: CoreRPCLike> AbciApplication<'a, C> { if !expect_vote_extension_errors && response_validate_vote_extension.status != VerifyStatus::Accept as i32 { - return Err(Error::Abci(AbciError::GenericWithCode(1))); + return Err(Error::Abci(AbciError::InvalidVoteExtensionsVerification)); } } diff --git a/packages/rs-drive-abci/src/platform_types/platform/mod.rs b/packages/rs-drive-abci/src/platform_types/platform/mod.rs index 4ab7ecfe28..62659501b1 100644 --- a/packages/rs-drive-abci/src/platform_types/platform/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/platform/mod.rs @@ -17,7 +17,6 @@ use dashcore_rpc::dashcore::BlockHash; use crate::execution::types::block_execution_context::BlockExecutionContext; use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::platform_types::platform_state::PlatformState; -use dpp::block::block_info::BlockInfo; use dpp::version::{PlatformVersion, PlatformVersionCurrentVersion}; use serde_json::json; @@ -50,8 +49,6 @@ pub struct PlatformRef<'a, C> { pub config: &'a PlatformConfig, /// Core RPC Client pub core_rpc: &'a C, - /// Block info - pub block_info: &'a BlockInfo, } // @append_only diff --git a/packages/rs-drive-abci/src/platform_types/platform_state/mod.rs b/packages/rs-drive-abci/src/platform_types/platform_state/mod.rs index afd052a1b5..91806b2d60 100644 --- a/packages/rs-drive-abci/src/platform_types/platform_state/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/platform_state/mod.rs @@ -35,7 +35,7 @@ pub enum PlatformState { /// Platform state #[derive(Clone, Debug, Encode, Decode, From)] -enum PlatformStateForSaving { +pub(crate) enum PlatformStateForSaving { /// Version 0 V0(PlatformStateForSavingV0), } @@ -337,9 +337,9 @@ impl PlatformStateV0Methods for PlatformState { } } - fn any_block_info(&self) -> &BlockInfo { + fn last_block_info(&self) -> &BlockInfo { match self { - PlatformState::V0(v0) => v0.any_block_info(), + PlatformState::V0(v0) => v0.last_block_info(), } } diff --git a/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs b/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs index 556f81da55..16916a52c2 100644 --- a/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs @@ -360,7 +360,7 @@ pub trait PlatformStateV0Methods { fn genesis_block_info(&self) -> Option<&BlockInfo>; /// Returns the last committed block info if present or the genesis block info if not or default one - fn any_block_info(&self) -> &BlockInfo; + fn last_block_info(&self) -> &BlockInfo; /// Sets the last committed block info. fn set_last_committed_block_info(&mut self, info: Option); @@ -782,7 +782,7 @@ impl PlatformStateV0Methods for PlatformStateV0 { &mut self.hpmn_masternode_list } - fn any_block_info(&self) -> &BlockInfo { + fn last_block_info(&self) -> &BlockInfo { self.last_committed_block_info .as_ref() .map(|b| b.basic_info()) diff --git a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract/mod.rs b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract/mod.rs index d86e337a80..0548473a96 100644 --- a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract/mod.rs +++ b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract/mod.rs @@ -1,30 +1,21 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; -use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; -use dapi_grpc::platform::v0::get_data_contract_request::Version; -use dapi_grpc::platform::v0::GetDataContractRequest; -use dapi_grpc::Message; -use dpp::check_validation_result_with_data; -use dpp::validation::ValidationResult; +use dapi_grpc::platform::v0::get_data_contract_request::Version as RequestVersion; +use dapi_grpc::platform::v0::get_data_contract_response::Version as ResponseVersion; +use dapi_grpc::platform::v0::{GetDataContractRequest, GetDataContractResponse}; use dpp::version::PlatformVersion; mod v0; impl Platform { /// Querying of a data contract - pub(in crate::query) fn query_data_contract( + pub fn query_data_contract( &self, - state: &PlatformState, - query_data: &[u8], + GetDataContractRequest { version }: GetDataContractRequest, platform_version: &PlatformVersion, - ) -> Result>, Error> { - let GetDataContractRequest { version } = - check_validation_result_with_data!(GetDataContractRequest::decode(query_data).map_err( - |e| QueryError::InvalidArgument(format!("invalid query proto message: {}", e)) - )); - + ) -> Result, Error> { let Some(version) = version else { return Ok(QueryValidationResult::new_with_error( QueryError::DecodingError("could not decode data contract query".to_string()), @@ -38,7 +29,7 @@ impl Platform { .data_contract; let feature_version = match &version { - Version::V0(_) => 0, + RequestVersion::V0(_) => 0, }; if !feature_version_bounds.check_version(feature_version) { return Ok(QueryValidationResult::new_with_error( @@ -52,8 +43,12 @@ impl Platform { )); } match version { - Version::V0(get_data_contract_request) => { - self.query_data_contract_v0(state, get_data_contract_request, platform_version) + RequestVersion::V0(request_v0) => { + let result = self.query_data_contract_v0(request_v0, platform_version)?; + + Ok(result.map(|response_v0| GetDataContractResponse { + version: Some(ResponseVersion::V0(response_v0)), + })) } } } diff --git a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract/v0/mod.rs b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract/v0/mod.rs index 8dcd67b4f4..19db60e292 100644 --- a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract/v0/mod.rs @@ -2,11 +2,12 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; use crate::platform_types::platform_state::v0::PlatformStateV0Methods; -use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_data_contract_request::GetDataContractRequestV0; -use dapi_grpc::platform::v0::get_data_contract_response::GetDataContractResponseV0; -use dapi_grpc::platform::v0::{get_data_contract_response, GetDataContractResponse, Proof}; +use dapi_grpc::platform::v0::get_data_contract_response::{ + get_data_contract_response_v0, GetDataContractResponseV0, +}; +use dapi_grpc::platform::v0::{get_data_contract_response, GetDataContractResponse}; use dapi_grpc::Message; use dpp::check_validation_result_with_data; use dpp::identifier::Identifier; @@ -17,38 +18,27 @@ use dpp::version::PlatformVersion; impl Platform { pub(super) fn query_data_contract_v0( &self, - state: &PlatformState, - request: GetDataContractRequestV0, + GetDataContractRequestV0 { id, prove }: GetDataContractRequestV0, platform_version: &PlatformVersion, - ) -> Result>, Error> { - let metadata = self.response_metadata_v0(state); - let quorum_type = self.config.validator_set_quorum_type() as u32; - let GetDataContractRequestV0 { id, prove } = request; + ) -> Result, Error> { let contract_id: Identifier = check_validation_result_with_data!(id.try_into().map_err(|_| { QueryError::InvalidArgument( "id must be a valid identifier (32 bytes long)".to_string(), ) })); - let response_data = if prove { + + let response = if prove { let proof = self.drive .prove_contract(contract_id.into_buffer(), None, platform_version)?; - GetDataContractResponse { - version: Some(get_data_contract_response::Version::V0(GetDataContractResponseV0 { - result: Some(get_data_contract_response::get_data_contract_response_v0::Result::Proof(Proof { - grovedb_proof: proof, - quorum_hash: state.last_committed_quorum_hash().to_vec(), - quorum_type, - block_id_hash: state.last_committed_block_id_hash().to_vec(), - signature: state.last_committed_block_signature().to_vec(), - round: state.last_committed_block_round(), - })), - metadata: Some(metadata), - })), + let (metadata, proof) = self.response_metadata_and_proof_v0(proof); + + GetDataContractResponseV0 { + result: Some(get_data_contract_response_v0::Result::Proof(proof)), + metadata: Some(metadata), } - .encode_to_vec() } else { let maybe_data_contract_fetch_info = self .drive @@ -71,14 +61,77 @@ impl Platform { .serialize_to_bytes_with_platform_version(platform_version) .map_err(Error::Protocol)?; - GetDataContractResponse { - version: Some(get_data_contract_response::Version::V0(GetDataContractResponseV0 { - result: Some(get_data_contract_response::get_data_contract_response_v0::Result::DataContract(serialized_data_contract)), - metadata: Some(metadata), - })), + GetDataContractResponseV0 { + result: Some(get_data_contract_response_v0::Result::DataContract( + serialized_data_contract, + )), + metadata: Some(self.response_metadata_v0()), } - .encode_to_vec() }; - Ok(QueryValidationResult::new_with_data(response_data)) + + Ok(QueryValidationResult::new_with_data(response)) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::query::tests::{assert_invalid_identifier, setup_platform}; + + #[test] + fn test_invalid_data_contract_id() { + let (platform, version) = setup_platform(); + + let request = GetDataContractRequestV0 { + id: vec![0; 8], + prove: false, + }; + + let result = platform.query_data_contract_v0(request, version); + + assert_invalid_identifier(result.unwrap()); + } + + #[test] + fn test_data_contract_not_found() { + let (platform, version) = setup_platform(); + + let id = vec![0; 32]; + let request = GetDataContractRequestV0 { + id: id.clone(), + prove: false, + }; + + let result = platform + .query_data_contract_v0(request, version) + .expect("expected query to succeed"); + + assert!(matches!( + result.errors.as_slice(), + [QueryError::NotFound(msg)] if msg.contains("data contract") + )); + } + + #[test] + fn test_data_contract_absence_proof() { + let (platform, version) = setup_platform(); + + let id = vec![0; 32]; + let request = GetDataContractRequestV0 { + id: id.clone(), + prove: true, + }; + + let validation_result = platform + .query_data_contract_v0(request, version) + .expect("expected query to succeed"); + + assert!(matches!( + validation_result.data, + Some(GetDataContractResponseV0 { + result: Some(get_data_contract_response_v0::Result::Proof(_)), + metadata: Some(_), + }) + )); } } diff --git a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/mod.rs b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/mod.rs index e9558a077c..8810637f0f 100644 --- a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/mod.rs +++ b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/mod.rs @@ -1,33 +1,22 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; -use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; -use dapi_grpc::platform::v0::get_data_contract_history_request::Version; -use dapi_grpc::platform::v0::GetDataContractHistoryRequest; -use dpp::check_validation_result_with_data; -use dpp::validation::ValidationResult; +use dapi_grpc::platform::v0::get_data_contract_history_request::Version as RequestVersion; +use dapi_grpc::platform::v0::get_data_contract_history_response::Version as ResponseVersion; +use dapi_grpc::platform::v0::{GetDataContractHistoryRequest, GetDataContractHistoryResponse}; -use dapi_grpc::Message; use dpp::version::PlatformVersion; mod v0; impl Platform { /// Querying of a data contract history - pub(in crate::query) fn query_data_contract_history( + pub fn query_data_contract_history( &self, - state: &PlatformState, - query_data: &[u8], + GetDataContractHistoryRequest { version }: GetDataContractHistoryRequest, platform_version: &PlatformVersion, - ) -> Result>, Error> { - let GetDataContractHistoryRequest { version } = - check_validation_result_with_data!(GetDataContractHistoryRequest::decode(query_data) - .map_err(|e| QueryError::InvalidArgument(format!( - "invalid query proto message: {}", - e - )))); - + ) -> Result, Error> { let Some(version) = version else { return Ok(QueryValidationResult::new_with_error( QueryError::DecodingError("could not decode data contract query".to_string()), @@ -41,7 +30,7 @@ impl Platform { .data_contract_history; let feature_version = match &version { - Version::V0(_) => 0, + RequestVersion::V0(_) => 0, }; if !feature_version_bounds.check_version(feature_version) { return Ok(QueryValidationResult::new_with_error( @@ -55,11 +44,13 @@ impl Platform { )); } match version { - Version::V0(get_data_contract_history_request) => self.query_data_contract_history_v0( - state, - get_data_contract_history_request, - platform_version, - ), + RequestVersion::V0(request_v0) => { + let result = self.query_data_contract_history_v0(request_v0, platform_version)?; + + Ok(result.map(|response_v0| GetDataContractHistoryResponse { + version: Some(ResponseVersion::V0(response_v0)), + })) + } } } } diff --git a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/v0/mod.rs b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/v0/mod.rs index 5ab84e76f6..2b6a12e019 100644 --- a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/v0/mod.rs @@ -1,38 +1,28 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; -use crate::platform_types::platform_state::v0::PlatformStateV0Methods; -use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_data_contract_history_request::GetDataContractHistoryRequestV0; -use dapi_grpc::platform::v0::get_data_contract_history_response::GetDataContractHistoryResponseV0; -use dapi_grpc::platform::v0::{ - get_data_contract_history_response, GetDataContractHistoryResponse, Proof, -}; +use dapi_grpc::platform::v0::get_data_contract_history_response::{get_data_contract_history_response_v0, GetDataContractHistoryResponseV0}; use dpp::identifier::Identifier; use dpp::serialization::PlatformSerializableWithPlatformVersion; use dpp::validation::ValidationResult; use dpp::version::PlatformVersion; use dpp::{check_validation_result_with_data, ProtocolError}; -use dapi_grpc::Message; use dapi_grpc::platform::v0::get_data_contract_history_response::get_data_contract_history_response_v0::DataContractHistoryEntry; impl Platform { pub(super) fn query_data_contract_history_v0( &self, - state: &PlatformState, - request: GetDataContractHistoryRequestV0, - platform_version: &PlatformVersion, - ) -> Result>, Error> { - let metadata = self.response_metadata_v0(state); - let quorum_type = self.config.validator_set_quorum_type() as u32; - let GetDataContractHistoryRequestV0 { + GetDataContractHistoryRequestV0 { id, limit, offset, start_at_ms, prove, - } = request; + }: GetDataContractHistoryRequestV0, + platform_version: &PlatformVersion, + ) -> Result, Error> { let contract_id: Identifier = check_validation_result_with_data!(id.try_into().map_err(|_| { QueryError::InvalidArgument( @@ -46,6 +36,7 @@ impl Platform { .map_err(|_| QueryError::InvalidArgument("limit out of bounds".to_string())) }) .transpose()); + let offset = check_validation_result_with_data!(offset .map(|offset| { u16::try_from(offset) @@ -53,7 +44,7 @@ impl Platform { }) .transpose()); - let response_data = if prove { + let response = if prove { let proof = self.drive.prove_contract_history( contract_id.to_buffer(), None, @@ -62,20 +53,13 @@ impl Platform { offset, platform_version, )?; - GetDataContractHistoryResponse { - version: Some(get_data_contract_history_response::Version::V0(GetDataContractHistoryResponseV0 { - result: Some(get_data_contract_history_response::get_data_contract_history_response_v0::Result::Proof(Proof { - grovedb_proof: proof, - quorum_hash: state.last_committed_quorum_hash().to_vec(), - quorum_type, - block_id_hash: state.last_committed_block_id_hash().to_vec(), - signature: state.last_committed_block_signature().to_vec(), - round: state.last_committed_block_round(), - })), - metadata: Some(metadata), - })), + + let (metadata, proof) = self.response_metadata_and_proof_v0(proof); + + GetDataContractHistoryResponseV0 { + result: Some(get_data_contract_history_response_v0::Result::Proof(proof)), + metadata: Some(metadata), } - .encode_to_vec() } else { let contracts = self.drive.fetch_contract_with_history( contract_id.to_buffer(), @@ -103,18 +87,402 @@ impl Platform { }) .collect::, ProtocolError>>()?; - GetDataContractHistoryResponse { - version: Some(get_data_contract_history_response::Version::V0(GetDataContractHistoryResponseV0 { - result: Some(get_data_contract_history_response::get_data_contract_history_response_v0::Result::DataContractHistory( - get_data_contract_history_response::get_data_contract_history_response_v0::DataContractHistory { + GetDataContractHistoryResponseV0 { + result: Some( + get_data_contract_history_response_v0::Result::DataContractHistory( + get_data_contract_history_response_v0::DataContractHistory { data_contract_entries: contract_historical_entries, - } - )), - metadata: Some(metadata), - })), + }, + ), + ), + metadata: Some(self.response_metadata_v0()), } - .encode_to_vec() }; - Ok(QueryValidationResult::new_with_data(response_data)) + + Ok(QueryValidationResult::new_with_data(response)) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::platform_types::platform_state::v0::PlatformStateV0Methods; + use crate::query::tests::{assert_invalid_identifier, setup_platform}; + use crate::rpc::core::MockCoreRPCLike; + use crate::test::helpers::setup::{TempPlatform, TestPlatformBuilder}; + use dapi_grpc::platform::v0::{ + get_data_contract_history_response, GetDataContractHistoryRequest, + GetDataContractHistoryResponse, + }; + use dpp::block::block_info::BlockInfo; + use dpp::data_contract::accessors::v0::DataContractV0Getters; + use dpp::data_contract::config::v0::DataContractConfigSettersV0; + use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; + use dpp::data_contract::schema::DataContractSchemaMethodsV0; + use dpp::data_contract::DataContract; + use dpp::platform_value::platform_value; + use dpp::serialization::PlatformDeserializableWithPotentialValidationFromVersionedStructure; + use dpp::tests::fixtures::get_data_contract_fixture; + use drive::drive::Drive; + + fn default_request_v0() -> GetDataContractHistoryRequestV0 { + GetDataContractHistoryRequestV0 { + id: vec![1; 32], + limit: Some(10), + offset: Some(0), + start_at_ms: 0, + prove: false, + } + } + + /// Set up simple contract history with one update + fn set_up_history(platform: &TempPlatform) -> DataContract { + let state = platform.platform.state.read().unwrap(); + let current_protocol_version = state.current_protocol_version_in_consensus(); + let platform_version = PlatformVersion::get(current_protocol_version) + .expect("expected to get platform version"); + drop(state); + let mut data_contract = + get_data_contract_fixture(None, 0, current_protocol_version).data_contract_owned(); + data_contract.config_mut().set_keeps_history(true); + data_contract.config_mut().set_readonly(false); + + platform + .drive + .apply_contract( + &data_contract, + BlockInfo { + time_ms: 1000, + height: 10, + core_height: 20, + epoch: Default::default(), + }, + true, + None, + None, + platform_version, + ) + .expect("To apply contract"); + + let mut updated_data_contract = data_contract.clone(); + + let updated_document_schema = platform_value!({ + "type": "object", + "properties": { + "name": { + "type": "string", + "position": 0 + }, + "newProp": { + "type": "integer", + "minimum": 0, + "position": 1 + } + }, + "required": [ + "$createdAt" + ], + "additionalProperties": false + }); + + updated_data_contract + .set_document_schema( + "niceDocument", + updated_document_schema, + true, + platform_version, + ) + .expect("to be able to set document schema"); + + platform + .drive + .apply_contract( + &updated_data_contract, + BlockInfo { + time_ms: 2000, + height: 11, + core_height: 21, + epoch: Default::default(), + }, + true, + None, + None, + platform_version, + ) + .expect("To apply contract"); + + data_contract + } + + struct TestData { + platform: TempPlatform, + original_data_contract: DataContract, + } + + fn set_up_test() -> TestData { + let platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure(); + + let original_data_contract = set_up_history(&platform); + + TestData { + platform, + original_data_contract, + } + } + + #[test] + fn test_invalid_data_contract_id() { + let (platform, version) = setup_platform(); + + let request = GetDataContractHistoryRequestV0 { + id: vec![0; 8], + limit: None, + offset: None, + start_at_ms: 0, + prove: false, + }; + + let result = platform + .query_data_contract_history_v0(request, version) + .expect("expected query to succeed"); + + assert_invalid_identifier(result); + } + + #[test] + fn test_invalid_limit_overflow() { + let (platform, version) = setup_platform(); + + let request = GetDataContractHistoryRequestV0 { + id: vec![0; 32], + limit: Some(u32::MAX), + offset: None, + start_at_ms: 0, + prove: false, + }; + + let result = platform + .query_data_contract_history_v0(request, version) + .expect("expected query to succeed"); + + assert!(matches!( + result.errors.as_slice(), + [QueryError::InvalidArgument(msg)] if msg == "limit out of bounds" + )); + } + + #[test] + fn test_invalid_offset_overflow() { + let (platform, version) = setup_platform(); + + let request = GetDataContractHistoryRequestV0 { + id: vec![0; 32], + limit: None, + offset: Some(u32::MAX), + start_at_ms: 0, + prove: false, + }; + + let result = platform + .query_data_contract_history_v0(request, version) + .expect("expected query to succeed"); + + assert!( + matches!(result.errors.as_slice(), [QueryError::InvalidArgument(msg)] if msg == "offset out of bounds") + ); + } + + #[test] + fn test_data_contract_not_found() { + let (platform, version) = setup_platform(); + + let id = vec![0; 32]; + + let request = GetDataContractHistoryRequestV0 { + id, + limit: None, + offset: None, + start_at_ms: 0, + prove: false, + }; + + let result = platform + .query_data_contract_history_v0(request, version) + .expect("expected query to succeed"); + + assert!(matches!( + result.errors.as_slice(), + [QueryError::NotFound(msg)] if msg.contains("data contract") + )); + } + + #[test] + pub fn should_return_contract_history_with_no_errors_if_parameters_are_valid() { + let platform_version = PlatformVersion::latest(); + + let TestData { + platform, + original_data_contract, + } = set_up_test(); + + let request = GetDataContractHistoryRequestV0 { + id: original_data_contract.id().to_vec(), + ..default_request_v0() + }; + + let result = platform + .query_data_contract_history_v0(request, platform_version) + .expect("To return result"); + + let ValidationResult { errors, data } = result; + + assert!( + errors.is_empty(), + "expect no errors to be returned from the query" + ); + + let response = data.expect("expect data to be returned from the query"); + + let GetDataContractHistoryResponseV0 { + result: + Some(get_data_contract_history_response_v0::Result::DataContractHistory( + data_contract_history, + )), + metadata: Some(_), + } = response + else { + panic!("expect result to be DataContractHistory"); + }; + + let mut history_entries = data_contract_history.data_contract_entries; + assert_eq!(history_entries.len(), 2); + + let second_entry = history_entries.pop().unwrap(); + let first_entry = history_entries.pop().unwrap(); + + assert_eq!(first_entry.date, 1000); + let first_entry_data_contract = first_entry.value; + let first_data_contract_update = + DataContract::versioned_deserialize(&first_entry_data_contract, true, platform_version) + .expect("To decode data contract"); + assert_eq!(first_data_contract_update, original_data_contract); + + assert_eq!(second_entry.date, 2000); + + let second_entry_data_contract = second_entry.value; + + let second_data_contract_update = DataContract::versioned_deserialize( + &second_entry_data_contract, + true, + platform_version, + ) + .expect("To decode data contract"); + + let updated_doc = second_data_contract_update + .document_type_for_name("niceDocument") + .expect("should return document type"); + + assert!( + updated_doc.properties().contains_key("newProp"), + "expect data contract to have newProp field", + ); + } + + #[test] + pub fn should_return_contract_history_proofs_with_no_errors_if_parameters_are_valid() { + let platform_version = PlatformVersion::latest(); + let TestData { + platform, + original_data_contract, + } = set_up_test(); + + let request_v0 = GetDataContractHistoryRequestV0 { + id: original_data_contract.id().to_vec(), + prove: true, + ..default_request_v0() + }; + + let start_at_ms = request_v0.start_at_ms; + + let result = platform + .query_data_contract_history_v0(request_v0, platform_version) + .expect("To return result"); + + let ValidationResult { errors, data } = result; + + assert!( + errors.is_empty(), + "expect no errors to be returned from the query" + ); + + let response = data.expect("expect data to be returned from the query"); + + let GetDataContractHistoryResponseV0 { + result: Some(get_data_contract_history_response_v0::Result::Proof(proof)), + metadata: Some(_), + } = response + else { + panic!("expect result to be Proof"); + }; + + // Check that the proof has correct values inside + let (_root_hash, contract_history) = Drive::verify_contract_history( + &proof.grovedb_proof, + original_data_contract.id().to_buffer(), + start_at_ms, + Some(10), + Some(0), + platform_version, + ) + .expect("To verify contract history"); + + let mut history_entries = contract_history.expect("history to exist"); + + assert_eq!(history_entries.len(), 2); + + // Taking entries by date + let first_data_contract_update = + history_entries.remove(&1000).expect("first entry to exist"); + let second_data_contract_update = history_entries + .remove(&2000) + .expect("second entry to exist"); + + assert_eq!(first_data_contract_update, original_data_contract); + + let updated_doc = second_data_contract_update + .document_type_for_name("niceDocument") + .expect("To have niceDocument document"); + + assert!( + updated_doc.properties().contains_key("newProp"), + "expect data contract to have newProp field", + ); + } + + #[test] + fn test_data_contract_history_absence_proof() { + let (platform, version) = setup_platform(); + + let request = GetDataContractHistoryRequestV0 { + id: vec![0; 32], + limit: None, + offset: None, + start_at_ms: 0, + prove: true, + }; + + let result = platform + .query_data_contract_history_v0(request, version) + .expect("expected query to succeed"); + + assert!(matches!( + result.data, + Some(GetDataContractHistoryResponseV0 { + result: Some(get_data_contract_history_response_v0::Result::Proof(_)), + metadata: Some(_), + }) + )); } } diff --git a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contracts/mod.rs b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contracts/mod.rs index 8fc0cf823b..14086382af 100644 --- a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contracts/mod.rs +++ b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contracts/mod.rs @@ -1,32 +1,21 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; -use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; -use dapi_grpc::platform::v0::get_data_contracts_request::Version; -use dapi_grpc::platform::v0::GetDataContractsRequest; -use dapi_grpc::Message; -use dpp::check_validation_result_with_data; -use dpp::validation::ValidationResult; +use dapi_grpc::platform::v0::get_data_contracts_request::Version as RequestVersion; +use dapi_grpc::platform::v0::get_data_contracts_response::Version as ResponseVersion; +use dapi_grpc::platform::v0::{GetDataContractsRequest, GetDataContractsResponse}; use dpp::version::PlatformVersion; mod v0; impl Platform { /// Querying of data contracts - pub(in crate::query) fn query_data_contracts( + pub fn query_data_contracts( &self, - state: &PlatformState, - query_data: &[u8], + GetDataContractsRequest { version }: GetDataContractsRequest, platform_version: &PlatformVersion, - ) -> Result>, Error> { - let GetDataContractsRequest { version } = - check_validation_result_with_data!(GetDataContractsRequest::decode(query_data) - .map_err(|e| QueryError::InvalidArgument(format!( - "invalid query proto message: {}", - e - )))); - + ) -> Result, Error> { let Some(version) = version else { return Ok(QueryValidationResult::new_with_error( QueryError::DecodingError("could not decode data contracts query".to_string()), @@ -40,8 +29,9 @@ impl Platform { .data_contracts; let feature_version = match &version { - Version::V0(_) => 0, + RequestVersion::V0(_) => 0, }; + if !feature_version_bounds.check_version(feature_version) { return Ok(QueryValidationResult::new_with_error( QueryError::UnsupportedQueryVersion( @@ -53,9 +43,14 @@ impl Platform { ), )); } + match version { - Version::V0(get_data_contracts_request) => { - self.query_data_contracts_v0(state, get_data_contracts_request, platform_version) + RequestVersion::V0(request_v0) => { + let request = self.query_data_contracts_v0(request_v0, platform_version)?; + + Ok(request.map(|response_v0| GetDataContractsResponse { + version: Some(ResponseVersion::V0(response_v0)), + })) } } } diff --git a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contracts/v0/mod.rs b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contracts/v0/mod.rs index 20c7bfbca0..89e36f054f 100644 --- a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contracts/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contracts/v0/mod.rs @@ -1,14 +1,13 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; -use crate::platform_types::platform_state::v0::PlatformStateV0Methods; -use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_data_contracts_request::GetDataContractsRequestV0; -use dapi_grpc::platform::v0::get_data_contracts_response::DataContractEntry; +use dapi_grpc::platform::v0::get_data_contracts_response; use dapi_grpc::platform::v0::get_data_contracts_response::GetDataContractsResponseV0; -use dapi_grpc::platform::v0::{get_data_contracts_response, GetDataContractsResponse, Proof}; -use dapi_grpc::Message; +use dapi_grpc::platform::v0::get_data_contracts_response::{ + get_data_contracts_response_v0, DataContractEntry, +}; use dpp::platform_value::Bytes32; use dpp::serialization::PlatformSerializableWithPlatformVersion; use dpp::validation::ValidationResult; @@ -18,13 +17,9 @@ use dpp::{check_validation_result_with_data, ProtocolError}; impl Platform { pub(super) fn query_data_contracts_v0( &self, - state: &PlatformState, - request: GetDataContractsRequestV0, + GetDataContractsRequestV0 { ids, prove }: GetDataContractsRequestV0, platform_version: &PlatformVersion, - ) -> Result>, Error> { - let metadata = self.response_metadata_v0(state); - let quorum_type = self.config.validator_set_quorum_type() as u32; - let GetDataContractsRequestV0 { ids, prove } = request; + ) -> Result, Error> { let contract_ids = check_validation_result_with_data!(ids .into_iter() .map(|contract_id_vec| { @@ -37,24 +32,18 @@ impl Platform { }) }) .collect::, QueryError>>()); - let response_data = if prove { + + let response = if prove { let proof = self.drive .prove_contracts(contract_ids.as_slice(), None, platform_version)?; - GetDataContractsResponse { - version: Some(get_data_contracts_response::Version::V0(GetDataContractsResponseV0 { - result: Some(get_data_contracts_response::get_data_contracts_response_v0::Result::Proof(Proof { - grovedb_proof: proof, - quorum_hash: state.last_committed_quorum_hash().to_vec(), - quorum_type, - block_id_hash: state.last_committed_block_id_hash().to_vec(), - signature: state.last_committed_block_signature().to_vec(), - round: state.last_committed_block_round(), - })), - metadata: Some(metadata), - })), + + let (metadata, proof) = self.response_metadata_and_proof_v0(proof); + + GetDataContractsResponseV0 { + result: Some(get_data_contracts_response_v0::Result::Proof(proof)), + metadata: Some(metadata), } - .encode_to_vec() } else { let contracts = self.drive.get_contracts_with_fetch_info( contract_ids.as_slice(), @@ -79,15 +68,84 @@ impl Platform { }) .collect::, ProtocolError>>()?; - GetDataContractsResponse { - version: Some(get_data_contracts_response::Version::V0(GetDataContractsResponseV0 { - result: Some(get_data_contracts_response::get_data_contracts_response_v0::Result::DataContracts(get_data_contracts_response::DataContracts { data_contract_entries: contracts } - )), - metadata: Some(metadata), - })), + GetDataContractsResponseV0 { + result: Some(get_data_contracts_response_v0::Result::DataContracts( + get_data_contracts_response::DataContracts { + data_contract_entries: contracts, + }, + )), + metadata: Some(self.response_metadata_v0()), } - .encode_to_vec() }; - Ok(QueryValidationResult::new_with_data(response_data)) + + Ok(QueryValidationResult::new_with_data(response)) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::query::tests::{assert_invalid_identifier, setup_platform}; + + #[test] + fn test_invalid_data_contract_id() { + let (platform, version) = setup_platform(); + + let request = GetDataContractsRequestV0 { + ids: vec![vec![0; 8]], + prove: false, + }; + + let result = platform + .query_data_contracts_v0(request, version) + .expect("expected query to succeed"); + + assert_invalid_identifier(result); + } + + #[test] + fn test_data_contracts_not_found() { + let (platform, version) = setup_platform(); + + let id = vec![0; 32]; + let request = GetDataContractsRequestV0 { + ids: vec![id.clone()], + prove: false, + }; + + let result = platform + .query_data_contracts_v0(request, version) + .expect("expected query to succeed"); + + assert!(matches!( + result.data, + Some(GetDataContractsResponseV0 { + result: Some(get_data_contracts_response_v0::Result::DataContracts(contracts)), + metadata: Some(_), + }) if contracts.data_contract_entries.len() == 1 && contracts.data_contract_entries[0].data_contract.is_none() + )); + } + + #[test] + fn test_data_contracts_absence_proof() { + let (platform, version) = setup_platform(); + + let id = vec![0; 32]; + let request = GetDataContractsRequestV0 { + ids: vec![id.clone()], + prove: true, + }; + + let result = platform + .query_data_contracts_v0(request, version) + .expect("expected query to succeed"); + + assert!(matches!( + result.data, + Some(GetDataContractsResponseV0 { + result: Some(get_data_contracts_response_v0::Result::Proof(_)), + metadata: Some(_), + }) + )); } } diff --git a/packages/rs-drive-abci/src/query/document_query/mod.rs b/packages/rs-drive-abci/src/query/document_query/mod.rs index e9da1c417f..5a032a2572 100644 --- a/packages/rs-drive-abci/src/query/document_query/mod.rs +++ b/packages/rs-drive-abci/src/query/document_query/mod.rs @@ -1,31 +1,21 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; -use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; -use dapi_grpc::platform::v0::get_documents_request::Version; -use dapi_grpc::platform::v0::GetDocumentsRequest; -use dpp::check_validation_result_with_data; -use dpp::validation::ValidationResult; - -use dapi_grpc::Message; +use dapi_grpc::platform::v0::get_documents_request::Version as RequestVersion; +use dapi_grpc::platform::v0::get_documents_response::Version as ResponseVersion; +use dapi_grpc::platform::v0::{GetDocumentsRequest, GetDocumentsResponse}; use dpp::version::PlatformVersion; mod v0; impl Platform { /// Querying of documents - pub(in crate::query) fn query_documents( + pub fn query_documents( &self, - state: &PlatformState, - query_data: &[u8], + GetDocumentsRequest { version }: GetDocumentsRequest, platform_version: &PlatformVersion, - ) -> Result>, Error> { - let GetDocumentsRequest { version } = - check_validation_result_with_data!(GetDocumentsRequest::decode(query_data).map_err( - |e| QueryError::InvalidArgument(format!("invalid query proto message: {}", e)) - )); - + ) -> Result, Error> { let Some(version) = version else { return Ok(QueryValidationResult::new_with_error( QueryError::DecodingError("could not decode data contracts query".to_string()), @@ -35,7 +25,7 @@ impl Platform { let feature_version_bounds = &platform_version.drive_abci.query.document_query; let feature_version = match &version { - Version::V0(_) => 0, + RequestVersion::V0(_) => 0, }; if !feature_version_bounds.check_version(feature_version) { return Ok(QueryValidationResult::new_with_error( @@ -49,8 +39,12 @@ impl Platform { )); } match version { - Version::V0(get_documents_request) => { - self.query_documents_v0(state, get_documents_request, platform_version) + RequestVersion::V0(request_v0) => { + let result = self.query_documents_v0(request_v0, platform_version)?; + + Ok(result.map(|response_v0| GetDocumentsResponse { + version: Some(ResponseVersion::V0(response_v0)), + })) } } } diff --git a/packages/rs-drive-abci/src/query/document_query/v0/mod.rs b/packages/rs-drive-abci/src/query/document_query/v0/mod.rs index 0f2b4c2b11..a2ea4c5997 100644 --- a/packages/rs-drive-abci/src/query/document_query/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/document_query/v0/mod.rs @@ -1,14 +1,13 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; -use crate::platform_types::platform_state::v0::PlatformStateV0Methods; -use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_documents_request::get_documents_request_v0::Start; use dapi_grpc::platform::v0::get_documents_request::GetDocumentsRequestV0; -use dapi_grpc::platform::v0::get_documents_response::GetDocumentsResponseV0; -use dapi_grpc::platform::v0::{get_documents_response, GetDocumentsResponse, Proof}; -use dapi_grpc::Message; +use dapi_grpc::platform::v0::get_documents_response::{ + get_documents_response_v0, GetDocumentsResponseV0, +}; +use dapi_grpc::platform::v0::{get_documents_response, GetDocumentsResponse}; use dpp::check_validation_result_with_data; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::identifier::Identifier; @@ -21,13 +20,7 @@ use drive::query::DriveQuery; impl Platform { pub(super) fn query_documents_v0( &self, - state: &PlatformState, - request: GetDocumentsRequestV0, - platform_version: &PlatformVersion, - ) -> Result>, Error> { - let metadata = self.response_metadata_v0(state); - let quorum_type = self.config.validator_set_quorum_type() as u32; - let GetDocumentsRequestV0 { + GetDocumentsRequestV0 { data_contract_id, document_type: document_type_name, r#where, @@ -35,12 +28,15 @@ impl Platform { limit, prove, start, - } = request; + }: GetDocumentsRequestV0, + platform_version: &PlatformVersion, + ) -> Result, Error> { let contract_id: Identifier = check_validation_result_with_data!(data_contract_id .try_into() .map_err(|_| QueryError::InvalidArgument( "id must be a valid identifier (32 bytes long)".to_string() ))); + let (_, contract) = self.drive.get_contract_with_fetch_info_and_fee( contract_id.to_buffer(), None, @@ -48,12 +44,15 @@ impl Platform { None, platform_version, )?; + let contract = check_validation_result_with_data!(contract.ok_or(QueryError::Query( QuerySyntaxError::DataContractNotFound( "contract not found when querying from value with contract info", ) ))); + let contract_ref = &contract.contract; + let document_type = check_validation_result_with_data!(contract_ref .document_type_for_name(document_type_name.as_str()) .map_err(|_| QueryError::InvalidArgument(format!( @@ -129,7 +128,8 @@ impl Platform { document_type, &self.config.drive, )); - let response_data = if prove { + + let response = if prove { let proof = match drive_query.execute_with_proof(&self.drive, None, None, platform_version) { Ok(result) => result.0, @@ -140,26 +140,13 @@ impl Platform { } Err(e) => return Err(e.into()), }; - GetDocumentsResponse { - version: Some(get_documents_response::Version::V0( - GetDocumentsResponseV0 { - result: Some( - get_documents_response::get_documents_response_v0::Result::Proof( - Proof { - grovedb_proof: proof, - quorum_hash: state.last_committed_quorum_hash().to_vec(), - quorum_type, - block_id_hash: state.last_committed_block_id_hash().to_vec(), - signature: state.last_committed_block_signature().to_vec(), - round: state.last_committed_block_round(), - }, - ), - ), - metadata: Some(metadata), - }, - )), + + let (metadata, proof) = self.response_metadata_and_proof_v0(proof); + + GetDocumentsResponseV0 { + result: Some(get_documents_response_v0::Result::Proof(proof)), + metadata: Some(metadata), } - .encode_to_vec() } else { let results = match drive_query.execute_raw_results_no_proof( &self.drive, @@ -176,22 +163,317 @@ impl Platform { Err(e) => return Err(e.into()), }; - GetDocumentsResponse { - version: Some(get_documents_response::Version::V0( - GetDocumentsResponseV0 { - result: Some( - get_documents_response::get_documents_response_v0::Result::Documents( - get_documents_response::get_documents_response_v0::Documents { - documents: results, - }, - ), - ), - metadata: Some(metadata), - }, + GetDocumentsResponseV0 { + result: Some(get_documents_response_v0::Result::Documents( + get_documents_response_v0::Documents { documents: results }, )), + metadata: Some(self.response_metadata_v0()), } - .encode_to_vec() }; - Ok(QueryValidationResult::new_with_data(response_data)) + + Ok(QueryValidationResult::new_with_data(response)) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::query::tests::{assert_invalid_identifier, setup_platform, store_data_contract}; + use dpp::tests::fixtures::get_data_contract_fixture; + + #[test] + fn test_invalid_document_id() { + let (platform, version) = setup_platform(); + + let request = GetDocumentsRequestV0 { + data_contract_id: vec![0; 8], + document_type: "niceDocument".to_string(), + r#where: vec![], + limit: 0, + order_by: vec![], + prove: false, + start: None, + }; + + let result = platform + .query_documents_v0(request, version) + .expect("expected query to succeed"); + + assert_invalid_identifier(result); + } + + #[test] + fn test_data_contract_not_found_in_documents_request() { + let (platform, version) = setup_platform(); + + let data_contract_id = vec![0; 32]; + + let request = GetDocumentsRequestV0 { + data_contract_id: data_contract_id.clone(), + document_type: "niceDocument".to_string(), + r#where: vec![], + limit: 0, + order_by: vec![], + prove: false, + start: None, + }; + + let result = platform + .query_documents_v0(request, version) + .expect("expected query to succeed"); + + assert!(matches!( + result.errors.as_slice(), + [QueryError::Query(QuerySyntaxError::DataContractNotFound(msg))] if msg == &"contract not found when querying from value with contract info" + )); + } + + #[test] + fn test_absent_document_type() { + let (platform, version) = setup_platform(); + + let created_data_contract = get_data_contract_fixture(None, 0, version.protocol_version); + store_data_contract(&platform, created_data_contract.data_contract(), version); + + let data_contract_id = created_data_contract.data_contract().id(); + let document_type = "fakeDocument"; + + let request = GetDocumentsRequestV0 { + data_contract_id: data_contract_id.to_vec(), + document_type: document_type.to_string(), + r#where: vec![], + limit: 0, + order_by: vec![], + prove: false, + start: None, + }; + + let result = platform + .query_documents_v0(request, version) + .expect("expected query to succeed"); + + assert!(matches!( + result.errors.as_slice(), + [QueryError::InvalidArgument(msg)] if msg.contains(format!( + "document type {} not found for contract", + document_type, + ).as_str()))) + } + + #[test] + fn test_invalid_where_clause() { + let (platform, version) = setup_platform(); + + let created_data_contract = get_data_contract_fixture(None, 0, version.protocol_version); + store_data_contract(&platform, created_data_contract.data_contract(), version); + + let data_contract_id = created_data_contract.data_contract().id(); + let document_type = "niceDocument"; + + let request = GetDocumentsRequestV0 { + data_contract_id: data_contract_id.to_vec(), + document_type: document_type.to_string(), + r#where: vec![0x9F], // Incomplete CBOR array + limit: 0, + order_by: vec![], + prove: false, + start: None, + }; + + let result = platform + .query_documents_v0(request, version) + .expect("expected query to succeed"); + + assert!(matches!( + result.errors.as_slice(), + [QueryError::Query(QuerySyntaxError::DeserializationError(msg))] if msg == "unable to decode 'where' query from cbor" + )) + } + + #[test] + fn test_invalid_order_by_clause() { + let (platform, version) = setup_platform(); + + let created_data_contract = get_data_contract_fixture(None, 0, version.protocol_version); + store_data_contract(&platform, created_data_contract.data_contract(), version); + + let data_contract_id = created_data_contract.data_contract().id(); + let document_type = "niceDocument"; + + let request = GetDocumentsRequestV0 { + data_contract_id: data_contract_id.to_vec(), + document_type: document_type.to_string(), + r#where: vec![], + limit: 0, + order_by: vec![0x9F], // Incomplete CBOR array + prove: false, + start: None, + }; + + let result = platform + .query_documents_v0(request, version) + .expect("expected query to succeed"); + + assert!(matches!( + result.errors.as_slice(), + [QueryError::Query(QuerySyntaxError::DeserializationError(msg))] if msg == "unable to decode 'order_by' query from cbor" + )); + } + + #[test] + fn test_invalid_start_at_clause() { + let (platform, version) = setup_platform(); + + let created_data_contract = get_data_contract_fixture(None, 0, version.protocol_version); + store_data_contract(&platform, created_data_contract.data_contract(), version); + + let data_contract_id = created_data_contract.data_contract().id(); + let document_type = "niceDocument"; + + let request = GetDocumentsRequestV0 { + data_contract_id: data_contract_id.to_vec(), + document_type: document_type.to_string(), + r#where: vec![], + limit: 0, + order_by: vec![], + prove: false, + start: Some(Start::StartAt(vec![0; 8])), + }; + + let result = platform + .query_documents_v0(request, version) + .expect("expected query to succeed"); + + assert!(matches!( + result.errors.as_slice(), + [QueryError::Query(QuerySyntaxError::InvalidStartsWithClause(msg))] if msg == &"start at should be a 32 byte identifier" + )) + } + + #[test] + fn test_invalid_start_after_clause() { + let (platform, version) = setup_platform(); + + let created_data_contract = get_data_contract_fixture(None, 0, version.protocol_version); + store_data_contract(&platform, created_data_contract.data_contract(), version); + + let data_contract_id = created_data_contract.data_contract().id(); + let document_type = "niceDocument"; + + let request = GetDocumentsRequestV0 { + data_contract_id: data_contract_id.to_vec(), + document_type: document_type.to_string(), + r#where: vec![], + limit: 0, + order_by: vec![], + prove: false, + start: Some(Start::StartAfter(vec![0; 8])), + }; + + let result = platform + .query_documents_v0(request, version) + .expect("expected query to succeed"); + + assert!(matches!( + result.errors.as_slice(), + [QueryError::Query(QuerySyntaxError::InvalidStartsWithClause(msg))] if msg == &"start after should be a 32 byte identifier" + )); + } + + #[test] + fn test_invalid_limit() { + let (platform, version) = setup_platform(); + + let created_data_contract = get_data_contract_fixture(None, 0, version.protocol_version); + store_data_contract(&platform, created_data_contract.data_contract(), version); + + let data_contract_id = created_data_contract.data_contract().id(); + let document_type = "niceDocument"; + let limit = u32::MAX; + + let request = GetDocumentsRequestV0 { + data_contract_id: data_contract_id.to_vec(), + document_type: document_type.to_string(), + r#where: vec![], + limit, + order_by: vec![], + prove: false, + start: None, + }; + + let result = platform + .query_documents_v0(request, version) + .expect("expected query to succeed"); + + assert!(matches!( + result.errors.as_slice(), + [QueryError::Query(QuerySyntaxError::InvalidLimit(msg))] if msg == &format!("limit {} out of bounds", limit) + )) + } + + #[test] + fn test_documents_not_found() { + let (platform, version) = setup_platform(); + + let created_data_contract = get_data_contract_fixture(None, 0, version.protocol_version); + store_data_contract(&platform, created_data_contract.data_contract(), version); + + let data_contract_id = created_data_contract.data_contract().id(); + let document_type = "niceDocument"; + + let request = GetDocumentsRequestV0 { + data_contract_id: data_contract_id.to_vec(), + document_type: document_type.to_string(), + r#where: vec![], + limit: 0, + order_by: vec![], + prove: false, + start: None, + }; + + let result = platform + .query_documents_v0(request, version) + .expect("expected query to succeed"); + + assert!(matches!( + result.data, + Some(GetDocumentsResponseV0 { + result: Some(get_documents_response_v0::Result::Documents(documents)), + metadata: Some(_), + }) if documents.documents.is_empty() + )); + } + + #[test] + fn test_documents_absence_proof() { + let (platform, version) = setup_platform(); + + let created_data_contract = get_data_contract_fixture(None, 0, version.protocol_version); + store_data_contract(&platform, created_data_contract.data_contract(), version); + + let data_contract_id = created_data_contract.data_contract().id(); + let document_type = "niceDocument"; + + let request = GetDocumentsRequestV0 { + data_contract_id: data_contract_id.to_vec(), + document_type: document_type.to_string(), + r#where: vec![], + limit: 0, + order_by: vec![], + prove: true, + start: None, + }; + + let result = platform + .query_documents_v0(request, version) + .expect("expected query to succeed"); + + assert!(matches!( + result.data, + Some(GetDocumentsResponseV0 { + result: Some(get_documents_response_v0::Result::Proof(_)), + metadata: Some(_), + }) + )); } } diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/balance/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/balance/mod.rs index cd20f1fe62..4b4d5262a6 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/balance/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/balance/mod.rs @@ -1,30 +1,21 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; -use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; -use dapi_grpc::platform::v0::get_identity_request::Version; -use dapi_grpc::platform::v0::GetIdentityRequest; -use dapi_grpc::Message; -use dpp::check_validation_result_with_data; -use dpp::validation::ValidationResult; +use dapi_grpc::platform::v0::get_identity_balance_request::Version as RequestVersion; +use dapi_grpc::platform::v0::get_identity_balance_response::Version as ResponseVersion; +use dapi_grpc::platform::v0::{GetIdentityBalanceRequest, GetIdentityBalanceResponse}; use dpp::version::PlatformVersion; mod v0; impl Platform { /// Querying of an identity by a public key hash - pub(in crate::query) fn query_balance( + pub fn query_balance( &self, - state: &PlatformState, - query_data: &[u8], + GetIdentityBalanceRequest { version }: GetIdentityBalanceRequest, platform_version: &PlatformVersion, - ) -> Result>, Error> { - let GetIdentityRequest { version } = - check_validation_result_with_data!(GetIdentityRequest::decode(query_data).map_err( - |e| QueryError::InvalidArgument(format!("invalid query proto message: {}", e)) - )); - + ) -> Result, Error> { let Some(version) = version else { return Ok(QueryValidationResult::new_with_error( QueryError::DecodingError("could not decode identity balance query".to_string()), @@ -38,7 +29,7 @@ impl Platform { .balance; let feature_version = match &version { - Version::V0(_) => 0, + RequestVersion::V0(_) => 0, }; if !feature_version_bounds.check_version(feature_version) { return Ok(QueryValidationResult::new_with_error( @@ -52,8 +43,12 @@ impl Platform { )); } match version { - Version::V0(get_identity_request) => { - self.query_balance_v0(state, get_identity_request, platform_version) + RequestVersion::V0(request_v0) => { + let result = self.query_balance_v0(request_v0, platform_version)?; + + Ok(result.map(|response_v0| GetIdentityBalanceResponse { + version: Some(ResponseVersion::V0(response_v0)), + })) } } } diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/balance/v0/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/balance/v0/mod.rs index 1465f4e378..9ed1698dd0 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/balance/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/balance/v0/mod.rs @@ -1,13 +1,10 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; -use crate::platform_types::platform_state::v0::PlatformStateV0Methods; -use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; +use dapi_grpc::platform::v0::get_identity_balance_request::GetIdentityBalanceRequestV0; +use dapi_grpc::platform::v0::get_identity_balance_response::get_identity_balance_response_v0; use dapi_grpc::platform::v0::get_identity_balance_response::GetIdentityBalanceResponseV0; -use dapi_grpc::platform::v0::get_identity_request::GetIdentityRequestV0; -use dapi_grpc::platform::v0::{get_identity_balance_response, GetIdentityBalanceResponse, Proof}; -use dapi_grpc::Message; use dpp::check_validation_result_with_data; use dpp::identifier::Identifier; use dpp::validation::ValidationResult; @@ -16,40 +13,29 @@ use dpp::version::PlatformVersion; impl Platform { pub(super) fn query_balance_v0( &self, - state: &PlatformState, - get_identity_request: GetIdentityRequestV0, + GetIdentityBalanceRequestV0 { id, prove }: GetIdentityBalanceRequestV0, platform_version: &PlatformVersion, - ) -> Result>, Error> { - let metadata = self.response_metadata_v0(state); - let quorum_type = self.config.validator_set_quorum_type() as u32; - let GetIdentityRequestV0 { id, prove } = get_identity_request; + ) -> Result, Error> { let identity_id: Identifier = check_validation_result_with_data!(id.try_into().map_err(|_| { QueryError::InvalidArgument( "id must be a valid identifier (32 bytes long)".to_string(), ) })); - let response_data = if prove { + + let response = if prove { let proof = check_validation_result_with_data!(self.drive.prove_identity_balance( identity_id.into_buffer(), None, &platform_version.drive )); - GetIdentityBalanceResponse { - version: Some(get_identity_balance_response::Version::V0(GetIdentityBalanceResponseV0 { - result: Some(get_identity_balance_response::get_identity_balance_response_v0::Result::Proof(Proof { - grovedb_proof: proof, - quorum_hash: state.last_committed_quorum_hash().to_vec(), - quorum_type, - block_id_hash: state.last_committed_block_id_hash().to_vec(), - signature: state.last_committed_block_signature().to_vec(), - round: state.last_committed_block_round(), - })), - metadata: Some(metadata), - })), - } - .encode_to_vec() + let (metadata, proof) = self.response_metadata_and_proof_v0(proof); + + GetIdentityBalanceResponseV0 { + result: Some(get_identity_balance_response_v0::Result::Proof(proof)), + metadata: Some(metadata), + } } else { let maybe_balance = self.drive.fetch_identity_balance( identity_id.into_buffer(), @@ -63,14 +49,79 @@ impl Platform { ))); }; - GetIdentityBalanceResponse { - version: Some(get_identity_balance_response::Version::V0(GetIdentityBalanceResponseV0 { - result: Some(get_identity_balance_response::get_identity_balance_response_v0::Result::Balance(balance)), - metadata: Some(metadata), - })), - } - .encode_to_vec() + GetIdentityBalanceResponseV0 { + result: Some(get_identity_balance_response_v0::Result::Balance(balance)), + metadata: Some(self.response_metadata_v0()), + } }; - Ok(QueryValidationResult::new_with_data(response_data)) + + Ok(QueryValidationResult::new_with_data(response)) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::query::tests::{assert_invalid_identifier, setup_platform}; + + #[test] + fn test_invalid_identity_id() { + let (platform, version) = setup_platform(); + + let request = GetIdentityBalanceRequestV0 { + id: vec![0; 8], + prove: false, + }; + + let result = platform + .query_balance_v0(request, version) + .expect("should query balance"); + + assert_invalid_identifier(result); + } + + #[test] + fn test_identity_not_found() { + let (platform, version) = setup_platform(); + + let id = vec![0; 32]; + + let request = GetIdentityBalanceRequestV0 { + id: id.clone(), + prove: false, + }; + + let result = platform + .query_balance_v0(request, version) + .expect("expected query to succeed"); + + assert!(matches!( + result.errors.as_slice(), + [QueryError::NotFound(_)] + )); + } + + #[test] + fn test_identity_balance_absence_proof() { + let (platform, version) = setup_platform(); + + let id = vec![0; 32]; + + let request = GetIdentityBalanceRequestV0 { + id: id.clone(), + prove: true, + }; + + let result = platform + .query_balance_v0(request, version) + .expect("should query balance"); + + assert!(matches!( + result.data, + Some(GetIdentityBalanceResponseV0 { + result: Some(get_identity_balance_response_v0::Result::Proof(_)), + metadata: Some(_) + }) + )); } } diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/balance_and_revision/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/balance_and_revision/mod.rs index 65f258eb2e..4a7778e573 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/balance_and_revision/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/balance_and_revision/mod.rs @@ -1,30 +1,23 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; -use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; -use dapi_grpc::platform::v0::get_identity_request::Version; -use dapi_grpc::platform::v0::GetIdentityRequest; -use dapi_grpc::Message; -use dpp::check_validation_result_with_data; -use dpp::validation::ValidationResult; +use dapi_grpc::platform::v0::get_identity_balance_and_revision_request::Version as RequestVersion; +use dapi_grpc::platform::v0::get_identity_balance_and_revision_response::Version as ResponseVersion; +use dapi_grpc::platform::v0::{ + GetIdentityBalanceAndRevisionRequest, GetIdentityBalanceAndRevisionResponse, +}; use dpp::version::PlatformVersion; mod v0; impl Platform { /// Querying of an identity by a public key hash - pub(in crate::query) fn query_balance_and_revision( + pub fn query_balance_and_revision( &self, - state: &PlatformState, - query_data: &[u8], + GetIdentityBalanceAndRevisionRequest { version }: GetIdentityBalanceAndRevisionRequest, platform_version: &PlatformVersion, - ) -> Result>, Error> { - let GetIdentityRequest { version } = - check_validation_result_with_data!(GetIdentityRequest::decode(query_data).map_err( - |e| QueryError::InvalidArgument(format!("invalid query proto message: {}", e)) - )); - + ) -> Result, Error> { let Some(version) = version else { return Ok(QueryValidationResult::new_with_error( QueryError::DecodingError( @@ -40,7 +33,7 @@ impl Platform { .balance_and_revision; let feature_version = match &version { - Version::V0(_) => 0, + RequestVersion::V0(_) => 0, }; if !feature_version_bounds.check_version(feature_version) { return Ok(QueryValidationResult::new_with_error( @@ -54,8 +47,14 @@ impl Platform { )); } match version { - Version::V0(get_identity_request) => { - self.query_balance_and_revision_v0(state, get_identity_request, platform_version) + RequestVersion::V0(request_v0) => { + let result = self.query_balance_and_revision_v0(request_v0, platform_version)?; + + Ok( + result.map(|response_v0| GetIdentityBalanceAndRevisionResponse { + version: Some(ResponseVersion::V0(response_v0)), + }), + ) } } } diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/balance_and_revision/v0/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/balance_and_revision/v0/mod.rs index 32c0c21383..e40061afb5 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/balance_and_revision/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/balance_and_revision/v0/mod.rs @@ -1,59 +1,41 @@ use crate::error::Error; use crate::platform_types::platform::Platform; -use crate::platform_types::platform_state::v0::PlatformStateV0Methods; -use crate::platform_types::platform_state::PlatformState; use crate::query::QueryError; use crate::query::QueryValidationResult; -use dapi_grpc::platform::v0::get_identity_balance_and_revision_response::{GetIdentityBalanceAndRevisionResponseV0}; -use dapi_grpc::platform::v0::{ - get_identity_balance_and_revision_response, - GetIdentityBalanceAndRevisionResponse, Proof, -}; +use dapi_grpc::platform::v0::get_identity_balance_and_revision_response::{get_identity_balance_and_revision_response_v0, GetIdentityBalanceAndRevisionResponseV0}; use dpp::check_validation_result_with_data; use dpp::identifier::Identifier; use dpp::validation::ValidationResult; use dpp::version::PlatformVersion; -use dapi_grpc::Message; +use dapi_grpc::platform::v0::get_identity_balance_and_revision_request::GetIdentityBalanceAndRevisionRequestV0; use dapi_grpc::platform::v0::get_identity_balance_and_revision_response::get_identity_balance_and_revision_response_v0::BalanceAndRevision; -use dapi_grpc::platform::v0::get_identity_request::GetIdentityRequestV0; impl Platform { pub(super) fn query_balance_and_revision_v0( &self, - state: &PlatformState, - get_identity_request: GetIdentityRequestV0, + GetIdentityBalanceAndRevisionRequestV0 { id, prove }: GetIdentityBalanceAndRevisionRequestV0, platform_version: &PlatformVersion, - ) -> Result>, Error> { - let metadata = self.response_metadata_v0(state); - let quorum_type = self.config.validator_set_quorum_type() as u32; - let GetIdentityRequestV0 { id, prove } = get_identity_request; + ) -> Result, Error> { let identity_id: Identifier = check_validation_result_with_data!(id.try_into().map_err(|_| { QueryError::InvalidArgument( "id must be a valid identifier (32 bytes long)".to_string(), ) })); - let response_data = if prove { + + let response = if prove { let proof = self.drive.prove_identity_balance_and_revision( identity_id.into_buffer(), None, &platform_version.drive, )?; - GetIdentityBalanceAndRevisionResponse { - version: Some(get_identity_balance_and_revision_response::Version::V0(GetIdentityBalanceAndRevisionResponseV0 { - result: Some(get_identity_balance_and_revision_response::get_identity_balance_and_revision_response_v0::Result::Proof(Proof { - grovedb_proof: proof, - quorum_hash: state.last_committed_quorum_hash().to_vec(), - quorum_type, - block_id_hash: state.last_committed_block_id_hash().to_vec(), - signature: state.last_committed_block_signature().to_vec(), - round: state.last_committed_block_round(), - })), - metadata: Some(metadata), - })), + let (metadata, proof) = self.response_metadata_and_proof_v0(proof); + + GetIdentityBalanceAndRevisionResponseV0 { + result: Some(get_identity_balance_and_revision_response_v0::Result::Proof(proof)), + metadata: Some(metadata), } - .encode_to_vec() } else { let maybe_balance = self.drive.fetch_identity_balance( identity_id.into_buffer(), @@ -80,18 +62,83 @@ impl Platform { ))); }; - GetIdentityBalanceAndRevisionResponse { - version: Some(get_identity_balance_and_revision_response::Version::V0(GetIdentityBalanceAndRevisionResponseV0 { - result: Some( - get_identity_balance_and_revision_response::get_identity_balance_and_revision_response_v0::Result::BalanceAndRevision( - BalanceAndRevision { balance, revision }, - ), + GetIdentityBalanceAndRevisionResponseV0 { + result: Some( + get_identity_balance_and_revision_response_v0::Result::BalanceAndRevision( + BalanceAndRevision { balance, revision }, ), - metadata: Some(metadata), - })), + ), + metadata: Some(self.response_metadata_v0()), } - .encode_to_vec() }; - Ok(QueryValidationResult::new_with_data(response_data)) + + Ok(QueryValidationResult::new_with_data(response)) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::query::tests::{assert_invalid_identifier, setup_platform}; + + #[test] + fn test_invalid_identity_id() { + let (platform, version) = setup_platform(); + + let request = GetIdentityBalanceAndRevisionRequestV0 { + id: vec![0; 8], + prove: false, + }; + + let result = platform + .query_balance_and_revision_v0(request, version) + .expect("should query balance and revision"); + + assert_invalid_identifier(result); + } + + #[test] + fn test_identity_not_found_when_querying_balance_and_revision() { + let (platform, version) = setup_platform(); + + let id = vec![0; 32]; + + let request = GetIdentityBalanceAndRevisionRequestV0 { + id: id.clone(), + prove: false, + }; + + let result = platform + .query_balance_and_revision_v0(request, version) + .expect("expected query to succeed"); + + assert!(matches!( + result.errors.as_slice(), + [QueryError::NotFound(_)] + )); + } + + #[test] + fn test_identity_balance_and_revision_absence_proof() { + let (platform, version) = setup_platform(); + + let id = vec![0; 32]; + + let request = GetIdentityBalanceAndRevisionRequestV0 { + id: id.clone(), + prove: true, + }; + + let result = platform + .query_balance_and_revision_v0(request, version) + .expect("should query balance and revision"); + + assert!(matches!( + result.data, + Some(GetIdentityBalanceAndRevisionResponseV0 { + result: Some(get_identity_balance_and_revision_response_v0::Result::Proof(_)), + metadata: Some(_) + }) + )); } } diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identities/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identities/mod.rs index 1e0febb697..6af9f376b7 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/identities/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identities/mod.rs @@ -1,30 +1,21 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; -use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; -use dapi_grpc::platform::v0::get_identities_request::Version; -use dapi_grpc::platform::v0::GetIdentitiesRequest; -use dapi_grpc::Message; -use dpp::check_validation_result_with_data; -use dpp::validation::ValidationResult; +use dapi_grpc::platform::v0::get_identities_request::Version as RequestVersion; +use dapi_grpc::platform::v0::get_identities_response::Version as ResponseVersion; +use dapi_grpc::platform::v0::{GetIdentitiesRequest, GetIdentitiesResponse}; use dpp::version::PlatformVersion; mod v0; impl Platform { /// Querying of an identity by a public key hash - pub(in crate::query) fn query_identities( + pub fn query_identities( &self, - state: &PlatformState, - query_data: &[u8], + GetIdentitiesRequest { version }: GetIdentitiesRequest, platform_version: &PlatformVersion, - ) -> Result>, Error> { - let GetIdentitiesRequest { version } = - check_validation_result_with_data!(GetIdentitiesRequest::decode(query_data).map_err( - |e| QueryError::InvalidArgument(format!("invalid query proto message: {}", e)) - )); - + ) -> Result, Error> { let Some(version) = version else { return Ok(QueryValidationResult::new_with_error( QueryError::DecodingError("could not decode identities query".to_string()), @@ -38,7 +29,7 @@ impl Platform { .identities; let feature_version = match &version { - Version::V0(_) => 0, + RequestVersion::V0(_) => 0, }; if !feature_version_bounds.check_version(feature_version) { return Ok(QueryValidationResult::new_with_error( @@ -52,8 +43,12 @@ impl Platform { )); } match version { - Version::V0(get_identity_request) => { - self.query_identities_v0(state, get_identity_request, platform_version) + RequestVersion::V0(request_v0) => { + let result = self.query_identities_v0(request_v0, platform_version)?; + + Ok(result.map(|response_v0| GetIdentitiesResponse { + version: Some(ResponseVersion::V0(response_v0)), + })) } } } diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identities/v0/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identities/v0/mod.rs index c6e250452b..04b2080812 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/identities/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identities/v0/mod.rs @@ -1,13 +1,12 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; -use crate::platform_types::platform_state::v0::PlatformStateV0Methods; -use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_identities_request::GetIdentitiesRequestV0; -use dapi_grpc::platform::v0::get_identities_response::{GetIdentitiesResponseV0, IdentityEntry}; -use dapi_grpc::platform::v0::{get_identities_response, GetIdentitiesResponse, Proof}; -use dapi_grpc::Message; +use dapi_grpc::platform::v0::get_identities_response::{ + get_identities_response_v0, GetIdentitiesResponseV0, IdentityEntry, +}; +use dapi_grpc::platform::v0::{get_identities_response, GetIdentitiesResponse}; use dpp::platform_value::Bytes32; use dpp::serialization::PlatformSerializable; use dpp::validation::ValidationResult; @@ -17,13 +16,9 @@ use dpp::{check_validation_result_with_data, ProtocolError}; impl Platform { pub(super) fn query_identities_v0( &self, - state: &PlatformState, - get_identities_request: GetIdentitiesRequestV0, + GetIdentitiesRequestV0 { ids, prove }: GetIdentitiesRequestV0, platform_version: &PlatformVersion, - ) -> Result>, Error> { - let metadata = self.response_metadata_v0(state); - let quorum_type = self.config.validator_set_quorum_type() as u32; - let GetIdentitiesRequestV0 { ids, prove } = get_identities_request; + ) -> Result, Error> { let identity_ids = check_validation_result_with_data!(ids .into_iter() .map(|identity_id_vec| { @@ -36,33 +31,20 @@ impl Platform { }) }) .collect::, QueryError>>()); - let response_data = if prove { + + let response = if prove { let proof = self.drive.prove_full_identities( identity_ids.as_slice(), None, &platform_version.drive, )?; - GetIdentitiesResponse { - version: Some(get_identities_response::Version::V0( - GetIdentitiesResponseV0 { - result: Some( - get_identities_response::get_identities_response_v0::Result::Proof( - Proof { - grovedb_proof: proof, - quorum_hash: state.last_committed_quorum_hash().to_vec(), - quorum_type, - block_id_hash: state.last_committed_block_id_hash().to_vec(), - signature: state.last_committed_block_signature().to_vec(), - round: state.last_committed_block_round(), - }, - ), - ), - metadata: Some(metadata), - }, - )), + let (metadata, proof) = self.response_metadata_and_proof_v0(proof); + + GetIdentitiesResponseV0 { + result: Some(get_identities_response_v0::Result::Proof(proof)), + metadata: Some(metadata), } - .encode_to_vec() } else { let identities = self.drive.fetch_full_identities( identity_ids.as_slice(), @@ -88,22 +70,82 @@ impl Platform { }) .collect::, ProtocolError>>()?; - GetIdentitiesResponse { - version: Some(get_identities_response::Version::V0( - GetIdentitiesResponseV0 { - result: Some( - get_identities_response::get_identities_response_v0::Result::Identities( - get_identities_response::Identities { - identity_entries: identities, - }, - ), - ), - metadata: Some(metadata), + GetIdentitiesResponseV0 { + result: Some(get_identities_response_v0::Result::Identities( + get_identities_response::Identities { + identity_entries: identities, }, )), + metadata: Some(self.response_metadata_v0()), } - .encode_to_vec() }; - Ok(QueryValidationResult::new_with_data(response_data)) + + Ok(QueryValidationResult::new_with_data(response)) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::query::tests::{assert_invalid_identifier, setup_platform}; + + #[test] + fn test_invalid_identity_id() { + let (platform, version) = setup_platform(); + + let request = GetIdentitiesRequestV0 { + ids: vec![vec![0; 8]], + prove: false, + }; + + let result = platform + .query_identities_v0(request, version) + .expect("should query identities"); + + assert_invalid_identifier(result); + } + + #[test] + fn test_identities_not_found() { + let (platform, version) = setup_platform(); + + let id = vec![0; 32]; + + let request = GetIdentitiesRequestV0 { + ids: vec![id.clone()], + prove: false, + }; + + let result = platform + .query_identities_v0(request, version) + .expect("should query identities"); + + assert!(matches!(result.data, Some(GetIdentitiesResponseV0 { + result: Some(get_identities_response_v0::Result::Identities(identites)), + metadata: Some(_) + }) if identites.identity_entries.len() == 1 && identites.identity_entries[0].value.is_none())); + } + + #[test] + fn test_identities_absence_proof() { + let (platform, version) = setup_platform(); + + let id = vec![0; 32]; + let request = GetIdentitiesRequestV0 { + ids: vec![id.clone()], + prove: true, + }; + + let result = platform + .query_identities_v0(request, version) + .expect("should query identities"); + + assert!(matches!( + result.data, + Some(GetIdentitiesResponseV0 { + result: Some(get_identities_response_v0::Result::Proof(_)), + metadata: Some(_) + }) + )); } } diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identities_by_public_key_hashes/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identities_by_public_key_hashes/mod.rs index a5be0292b7..1d3d801b7f 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/identities_by_public_key_hashes/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identities_by_public_key_hashes/mod.rs @@ -1,31 +1,23 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; -use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; -use dapi_grpc::platform::v0::get_identities_by_public_key_hashes_request::Version; -use dapi_grpc::platform::v0::GetIdentitiesByPublicKeyHashesRequest; -use dapi_grpc::Message; -use dpp::check_validation_result_with_data; -use dpp::validation::ValidationResult; +use dapi_grpc::platform::v0::get_identities_by_public_key_hashes_request::Version as RequestVersion; +use dapi_grpc::platform::v0::get_identities_by_public_key_hashes_response::Version as ResponseVersion; +use dapi_grpc::platform::v0::{ + GetIdentitiesByPublicKeyHashesRequest, GetIdentitiesByPublicKeyHashesResponse, +}; use dpp::version::PlatformVersion; mod v0; impl Platform { /// Querying of an identity by a public key hash - pub(in crate::query) fn query_identities_by_public_key_hashes( + pub fn query_identities_by_public_key_hashes( &self, - state: &PlatformState, - query_data: &[u8], + GetIdentitiesByPublicKeyHashesRequest { version }: GetIdentitiesByPublicKeyHashesRequest, platform_version: &PlatformVersion, - ) -> Result>, Error> { - let GetIdentitiesByPublicKeyHashesRequest { version } = check_validation_result_with_data!( - GetIdentitiesByPublicKeyHashesRequest::decode(query_data).map_err(|e| { - QueryError::InvalidArgument(format!("invalid query proto message: {}", e)) - }) - ); - + ) -> Result, Error> { let Some(version) = version else { return Ok(QueryValidationResult::new_with_error( QueryError::DecodingError( @@ -41,7 +33,7 @@ impl Platform { .identities_by_public_key_hashes; let feature_version = match &version { - Version::V0(_) => 0, + RequestVersion::V0(_) => 0, }; if !feature_version_bounds.check_version(feature_version) { return Ok(QueryValidationResult::new_with_error( @@ -55,11 +47,16 @@ impl Platform { )); } match version { - Version::V0(get_identity_request) => self.query_identities_by_public_key_hashes_v0( - state, - get_identity_request, - platform_version, - ), + RequestVersion::V0(request_v0) => { + let result = + self.query_identities_by_public_key_hashes_v0(request_v0, platform_version)?; + + Ok( + result.map(|response_v0| GetIdentitiesByPublicKeyHashesResponse { + version: Some(ResponseVersion::V0(response_v0)), + }), + ) + } } } } diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identities_by_public_key_hashes/v0/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identities_by_public_key_hashes/v0/mod.rs index b1fa2b20b9..e750b4c622 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/identities_by_public_key_hashes/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identities_by_public_key_hashes/v0/mod.rs @@ -1,17 +1,13 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; -use crate::platform_types::platform_state::v0::PlatformStateV0Methods; -use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_identities_by_public_key_hashes_request::GetIdentitiesByPublicKeyHashesRequestV0; +use dapi_grpc::platform::v0::get_identities_by_public_key_hashes_response; use dapi_grpc::platform::v0::get_identities_by_public_key_hashes_response::{ - GetIdentitiesByPublicKeyHashesResponseV0, PublicKeyHashIdentityEntry, + get_identities_by_public_key_hashes_response_v0, GetIdentitiesByPublicKeyHashesResponseV0, + PublicKeyHashIdentityEntry, }; -use dapi_grpc::platform::v0::{ - get_identities_by_public_key_hashes_response, GetIdentitiesByPublicKeyHashesResponse, Proof, -}; -use dapi_grpc::Message; use dpp::platform_value::Bytes20; use dpp::serialization::PlatformSerializable; use dpp::validation::ValidationResult; @@ -21,16 +17,12 @@ use dpp::{check_validation_result_with_data, ProtocolError}; impl Platform { pub(super) fn query_identities_by_public_key_hashes_v0( &self, - state: &PlatformState, - get_identities_by_public_key_hashes_request: GetIdentitiesByPublicKeyHashesRequestV0, - platform_version: &PlatformVersion, - ) -> Result>, Error> { - let metadata = self.response_metadata_v0(state); - let quorum_type = self.config.validator_set_quorum_type() as u32; - let GetIdentitiesByPublicKeyHashesRequestV0 { + GetIdentitiesByPublicKeyHashesRequestV0 { public_key_hashes, prove, - } = get_identities_by_public_key_hashes_request; + }: GetIdentitiesByPublicKeyHashesRequestV0, + platform_version: &PlatformVersion, + ) -> Result, Error> { let public_key_hashes = check_validation_result_with_data!(public_key_hashes .into_iter() .map(|pub_key_hash_vec| { @@ -43,7 +35,8 @@ impl Platform { }) }) .collect::, QueryError>>()); - let response_data = if prove { + + let response = if prove { let proof = self .drive .prove_full_identities_by_unique_public_key_hashes( @@ -52,20 +45,12 @@ impl Platform { platform_version, )?; - GetIdentitiesByPublicKeyHashesResponse { - version: Some(get_identities_by_public_key_hashes_response::Version::V0(GetIdentitiesByPublicKeyHashesResponseV0 { - result: Some(get_identities_by_public_key_hashes_response::get_identities_by_public_key_hashes_response_v0::Result::Proof(Proof { - grovedb_proof: proof, - quorum_hash: state.last_committed_quorum_hash().to_vec(), - quorum_type, - block_id_hash: state.last_committed_block_id_hash().to_vec(), - signature: state.last_committed_block_signature().to_vec(), - round: state.last_committed_block_round(), - })), - metadata: Some(metadata), - })), + let (metadata, proof) = self.response_metadata_and_proof_v0(proof); + + GetIdentitiesByPublicKeyHashesResponseV0 { + result: Some(get_identities_by_public_key_hashes_response_v0::Result::Proof(proof)), + metadata: Some(metadata), } - .encode_to_vec() } else { let identities = self .drive @@ -86,18 +71,85 @@ impl Platform { }) .collect::, ProtocolError>>()?; - GetIdentitiesByPublicKeyHashesResponse { - version: Some(get_identities_by_public_key_hashes_response::Version::V0(GetIdentitiesByPublicKeyHashesResponseV0 { - metadata: Some(metadata), - result: Some(get_identities_by_public_key_hashes_response::get_identities_by_public_key_hashes_response_v0::Result::Identities( + GetIdentitiesByPublicKeyHashesResponseV0 { + metadata: Some(self.response_metadata_v0()), + result: Some( + get_identities_by_public_key_hashes_response_v0::Result::Identities( get_identities_by_public_key_hashes_response::IdentitiesByPublicKeyHashes { identity_entries: identities, }, - )), - })), + ), + ), } - .encode_to_vec() }; - Ok(QueryValidationResult::new_with_data(response_data)) + + Ok(QueryValidationResult::new_with_data(response)) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::query::tests::setup_platform; + + #[test] + fn test_invalid_public_key_hash() { + let (platform, version) = setup_platform(); + + let request = GetIdentitiesByPublicKeyHashesRequestV0 { + public_key_hashes: vec![vec![0; 8]], + prove: false, + }; + + let result = platform + .query_identities_by_public_key_hashes_v0(request, version) + .expect("should query identities by public key hashes"); + + assert!( + matches!(result.errors.as_slice(), [QueryError::InvalidArgument(msg)] if msg == "public key hash must be 20 bytes long") + ); + } + + #[test] + fn test_identities_not_found() { + let (platform, version) = setup_platform(); + + let request = GetIdentitiesByPublicKeyHashesRequestV0 { + public_key_hashes: vec![vec![0; 20]], + prove: false, + }; + + let result = platform + .query_identities_by_public_key_hashes_v0(request, version) + .expect("expected query to succeed"); + + assert!( + matches!(result.data, Some(GetIdentitiesByPublicKeyHashesResponseV0 { + result: Some(get_identities_by_public_key_hashes_response_v0::Result::Identities(identites)), + metadata: Some(_) + }) if identites.identity_entries.len() == 1 && identites.identity_entries[0].value.is_none()) + ); + } + + #[test] + fn test_identities_absence_proof() { + let (platform, version) = setup_platform(); + + let request = GetIdentitiesByPublicKeyHashesRequestV0 { + public_key_hashes: vec![vec![0; 20]], + prove: true, + }; + + let result = platform + .query_identities_by_public_key_hashes_v0(request, version) + .expect("expected query to succeed"); + + assert!(matches!( + result.data, + Some(GetIdentitiesByPublicKeyHashesResponseV0 { + result: Some(get_identities_by_public_key_hashes_response_v0::Result::Proof(_)), + metadata: Some(_) + }) + )); } } diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identity/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identity/mod.rs index c1364cabfa..d4f5e655fd 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/identity/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identity/mod.rs @@ -1,30 +1,21 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; -use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; -use dapi_grpc::platform::v0::get_identity_request::Version; -use dapi_grpc::platform::v0::GetIdentityRequest; -use dapi_grpc::Message; -use dpp::check_validation_result_with_data; -use dpp::validation::ValidationResult; +use dapi_grpc::platform::v0::get_identity_request::Version as RequestVersion; +use dapi_grpc::platform::v0::get_identity_response::Version as ResponseVersion; +use dapi_grpc::platform::v0::{GetIdentityRequest, GetIdentityResponse}; use dpp::version::PlatformVersion; mod v0; impl Platform { /// Querying of an identity - pub(in crate::query) fn query_identity( + pub fn query_identity( &self, - state: &PlatformState, - query_data: &[u8], + GetIdentityRequest { version }: GetIdentityRequest, platform_version: &PlatformVersion, - ) -> Result>, Error> { - let GetIdentityRequest { version } = - check_validation_result_with_data!(GetIdentityRequest::decode(query_data).map_err( - |e| QueryError::InvalidArgument(format!("invalid query proto message: {}", e)) - )); - + ) -> Result, Error> { let Some(version) = version else { return Ok(QueryValidationResult::new_with_error( QueryError::DecodingError("could not decode identity query".to_string()), @@ -38,7 +29,7 @@ impl Platform { .identity; let feature_version = match &version { - Version::V0(_) => 0, + RequestVersion::V0(_) => 0, }; if !feature_version_bounds.check_version(feature_version) { return Ok(QueryValidationResult::new_with_error( @@ -52,8 +43,12 @@ impl Platform { )); } match version { - Version::V0(get_identity_request) => { - self.query_identity_v0(state, get_identity_request, platform_version) + RequestVersion::V0(request_v0) => { + let result = self.query_identity_v0(request_v0, platform_version)?; + + Ok(result.map(|response| GetIdentityResponse { + version: Some(ResponseVersion::V0(response)), + })) } } } diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identity/v0/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identity/v0/mod.rs index 57f6babe39..26338cc517 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/identity/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identity/v0/mod.rs @@ -1,13 +1,12 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; -use crate::platform_types::platform_state::v0::PlatformStateV0Methods; -use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_identity_request::GetIdentityRequestV0; -use dapi_grpc::platform::v0::get_identity_response::GetIdentityResponseV0; -use dapi_grpc::platform::v0::{get_identity_response, GetIdentityResponse, Proof}; -use dapi_grpc::Message; +use dapi_grpc::platform::v0::get_identity_response::{ + get_identity_response_v0, GetIdentityResponseV0, +}; +use dapi_grpc::platform::v0::{get_identity_response, GetIdentityResponse}; use dpp::check_validation_result_with_data; use dpp::identifier::Identifier; use dpp::serialization::PlatformSerializable; @@ -17,42 +16,29 @@ use dpp::version::PlatformVersion; impl Platform { pub(super) fn query_identity_v0( &self, - state: &PlatformState, - get_identity_request: GetIdentityRequestV0, + GetIdentityRequestV0 { id, prove }: GetIdentityRequestV0, platform_version: &PlatformVersion, - ) -> Result>, Error> { - let metadata = self.response_metadata_v0(state); - let quorum_type = self.config.validator_set_quorum_type() as u32; - let GetIdentityRequestV0 { id, prove } = get_identity_request; + ) -> Result, Error> { let identity_id: Identifier = check_validation_result_with_data!(id.try_into().map_err(|_| { QueryError::InvalidArgument( "id must be a valid identifier (32 bytes long)".to_string(), ) })); - let response_data = if prove { + + let response = if prove { let proof = self.drive.prove_full_identity( identity_id.into_buffer(), None, &platform_version.drive, )?; - GetIdentityResponse { - version: Some(get_identity_response::Version::V0(GetIdentityResponseV0 { - result: Some( - get_identity_response::get_identity_response_v0::Result::Proof(Proof { - grovedb_proof: proof, - quorum_hash: state.last_committed_quorum_hash().to_vec(), - quorum_type, - block_id_hash: state.last_committed_block_id_hash().to_vec(), - signature: state.last_committed_block_signature().to_vec(), - round: state.last_committed_block_round(), - }), - ), - metadata: Some(metadata), - })), + let (metadata, proof) = self.response_metadata_and_proof_v0(proof); + + GetIdentityResponseV0 { + result: Some(get_identity_response_v0::Result::Proof(proof)), + metadata: Some(metadata), } - .encode_to_vec() } else { let maybe_identity = self.drive.fetch_full_identity( identity_id.into_buffer(), @@ -68,18 +54,83 @@ impl Platform { .serialize_consume_to_bytes() .map_err(Error::Protocol)?; - GetIdentityResponse { - version: Some(get_identity_response::Version::V0(GetIdentityResponseV0 { - result: Some( - get_identity_response::get_identity_response_v0::Result::Identity( - serialized_identity, - ), - ), - metadata: Some(metadata), - })), + GetIdentityResponseV0 { + result: Some(get_identity_response_v0::Result::Identity( + serialized_identity, + )), + metadata: Some(self.response_metadata_v0()), } - .encode_to_vec() }; - Ok(QueryValidationResult::new_with_data(response_data)) + + Ok(QueryValidationResult::new_with_data(response)) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::query::tests::{assert_invalid_identifier, setup_platform}; + + #[test] + fn test_invalid_identity_id() { + let (platform, version) = setup_platform(); + + let version = PlatformVersion::latest(); + + let request = GetIdentityRequestV0 { + id: vec![0; 8], + prove: false, + }; + + let result = platform + .query_identity_v0(request, version) + .expect("should execute query"); + + assert_invalid_identifier(result); + } + + #[test] + fn test_identity_not_found() { + let (platform, version) = setup_platform(); + + let id = vec![0; 32]; + let request = GetIdentityRequestV0 { + id: id.clone(), + prove: false, + }; + + let result = platform + .query_identity_v0(request, version) + .expect("should execute query"); + + let validation_error = result.first_error().unwrap(); + + assert!(matches!( + validation_error, + QueryError::NotFound(msg) if msg.contains("identity") + )); + } + + #[test] + fn test_identity_absence_proof() { + let (platform, version) = setup_platform(); + + let id = vec![0; 32]; + let request = GetIdentityRequestV0 { + id: id.clone(), + prove: true, + }; + + let result = platform + .query_identity_v0(request, version) + .expect("should execute query"); + + assert!(matches!( + result.data, + Some(GetIdentityResponseV0 { + result: Some(get_identity_response_v0::Result::Proof(_)), + metadata: Some(_) + }) + )) } } diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identity_by_public_key_hash/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identity_by_public_key_hash/mod.rs index 01ec853823..483b807b11 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/identity_by_public_key_hash/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identity_by_public_key_hash/mod.rs @@ -1,31 +1,23 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; -use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; -use dapi_grpc::platform::v0::get_identity_by_public_key_hash_request::Version; -use dapi_grpc::platform::v0::GetIdentityByPublicKeyHashRequest; -use dapi_grpc::Message; -use dpp::check_validation_result_with_data; -use dpp::validation::ValidationResult; +use dapi_grpc::platform::v0::get_identity_by_public_key_hash_request::Version as RequestVersion; +use dapi_grpc::platform::v0::get_identity_by_public_key_hash_response::Version as ResponseVersion; +use dapi_grpc::platform::v0::{ + GetIdentityByPublicKeyHashRequest, GetIdentityByPublicKeyHashResponse, +}; use dpp::version::PlatformVersion; mod v0; impl Platform { /// Querying of an identity by a public key hash - pub(in crate::query) fn query_identity_by_public_key_hash( + pub fn query_identity_by_public_key_hash( &self, - state: &PlatformState, - query_data: &[u8], + GetIdentityByPublicKeyHashRequest { version }: GetIdentityByPublicKeyHashRequest, platform_version: &PlatformVersion, - ) -> Result>, Error> { - let GetIdentityByPublicKeyHashRequest { version } = check_validation_result_with_data!( - GetIdentityByPublicKeyHashRequest::decode(query_data).map_err(|e| { - QueryError::InvalidArgument(format!("invalid query proto message: {}", e)) - }) - ); - + ) -> Result, Error> { let Some(version) = version else { return Ok(QueryValidationResult::new_with_error( QueryError::DecodingError( @@ -41,8 +33,9 @@ impl Platform { .identity_by_public_key_hash; let feature_version = match &version { - Version::V0(_) => 0, + RequestVersion::V0(_) => 0, }; + if !feature_version_bounds.check_version(feature_version) { return Ok(QueryValidationResult::new_with_error( QueryError::UnsupportedQueryVersion( @@ -54,13 +47,18 @@ impl Platform { ), )); } + match version { - Version::V0(get_identity_by_public_key_hash_request) => self - .query_identity_by_public_key_hash_v0( - state, - get_identity_by_public_key_hash_request, - platform_version, - ), + RequestVersion::V0(request_v0) => { + let request = + self.query_identity_by_public_key_hash_v0(request_v0, platform_version)?; + + Ok( + request.map(|response_v0| GetIdentityByPublicKeyHashResponse { + version: Some(ResponseVersion::V0(response_v0)), + }), + ) + } } } } diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identity_by_public_key_hash/v0/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identity_by_public_key_hash/v0/mod.rs index 7177c71e60..76ef09cdbd 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/identity_by_public_key_hash/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identity_by_public_key_hash/v0/mod.rs @@ -1,15 +1,11 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; -use crate::platform_types::platform_state::v0::PlatformStateV0Methods; -use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_identity_by_public_key_hash_request::GetIdentityByPublicKeyHashRequestV0; -use dapi_grpc::platform::v0::get_identity_by_public_key_hash_response::GetIdentityByPublicKeyHashResponseV0; -use dapi_grpc::platform::v0::{ - get_identity_by_public_key_hash_response, GetIdentityByPublicKeyHashResponse, Proof, +use dapi_grpc::platform::v0::get_identity_by_public_key_hash_response::{ + get_identity_by_public_key_hash_response_v0, GetIdentityByPublicKeyHashResponseV0, }; -use dapi_grpc::Message; use dpp::check_validation_result_with_data; use dpp::platform_value::Bytes20; use dpp::serialization::PlatformSerializable; @@ -19,43 +15,34 @@ use dpp::version::PlatformVersion; impl Platform { pub(super) fn query_identity_by_public_key_hash_v0( &self, - state: &PlatformState, - request: GetIdentityByPublicKeyHashRequestV0, - platform_version: &PlatformVersion, - ) -> Result>, Error> { - let metadata = self.response_metadata_v0(state); - let quorum_type = self.config.validator_set_quorum_type() as u32; - let GetIdentityByPublicKeyHashRequestV0 { + GetIdentityByPublicKeyHashRequestV0 { public_key_hash, prove, - } = request; + }: GetIdentityByPublicKeyHashRequestV0, + platform_version: &PlatformVersion, + ) -> Result, Error> { let public_key_hash = check_validation_result_with_data!(Bytes20::from_vec(public_key_hash) .map(|bytes| bytes.0) .map_err(|_| QueryError::InvalidArgument( "public key hash must be 20 bytes long".to_string() ))); - let response_data = if prove { + + let response = if prove { let proof = self.drive.prove_full_identity_by_unique_public_key_hash( public_key_hash, None, platform_version, )?; - GetIdentityByPublicKeyHashResponse { - version: Some(get_identity_by_public_key_hash_response::Version::V0(GetIdentityByPublicKeyHashResponseV0 { - result: Some(get_identity_by_public_key_hash_response::get_identity_by_public_key_hash_response_v0::Result::Proof(Proof { - grovedb_proof: proof, - quorum_hash: state.last_committed_quorum_hash().to_vec(), - quorum_type, - block_id_hash: state.last_committed_block_id_hash().to_vec(), - signature: state.last_committed_block_signature().to_vec(), - round: state.last_committed_block_round(), - })), - metadata: Some(metadata), - })), + let (metadata, proof) = self.response_metadata_and_proof_v0(proof); + + GetIdentityByPublicKeyHashResponseV0 { + result: Some(get_identity_by_public_key_hash_response_v0::Result::Proof( + proof, + )), + metadata: Some(metadata), } - .encode_to_vec() } else { let maybe_identity = self.drive.fetch_full_identity_by_unique_public_key_hash( public_key_hash, @@ -74,14 +61,86 @@ impl Platform { .serialize_consume_to_bytes() .map_err(Error::Protocol)?; - GetIdentityByPublicKeyHashResponse { - version: Some(get_identity_by_public_key_hash_response::Version::V0(GetIdentityByPublicKeyHashResponseV0 { - metadata: Some(metadata), - result: Some(get_identity_by_public_key_hash_response::get_identity_by_public_key_hash_response_v0::Result::Identity(serialized_identity)), - })), + GetIdentityByPublicKeyHashResponseV0 { + metadata: Some(self.response_metadata_v0()), + result: Some( + get_identity_by_public_key_hash_response_v0::Result::Identity( + serialized_identity, + ), + ), } - .encode_to_vec() }; - Ok(QueryValidationResult::new_with_data(response_data)) + + Ok(QueryValidationResult::new_with_data(response)) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::query::tests::setup_platform; + + #[test] + fn test_invalid_public_key_hash() { + let (platform, version) = setup_platform(); + + let request = GetIdentityByPublicKeyHashRequestV0 { + public_key_hash: vec![0; 8], + prove: false, + }; + + let result = platform + .query_identity_by_public_key_hash_v0(request, version) + .expect("expected query to succeed"); + + assert!(matches!( + result.errors.as_slice(), + [QueryError::InvalidArgument(msg)] if msg == &"public key hash must be 20 bytes long".to_string() + )); + } + + #[test] + fn test_identity_not_found() { + let (platform, version) = setup_platform(); + + let public_key_hash = vec![0; 20]; + let request = GetIdentityByPublicKeyHashRequestV0 { + public_key_hash: public_key_hash.clone(), + prove: false, + }; + + let result = platform + .query_identity_by_public_key_hash_v0(request, version) + .expect("expected query to succeed"); + + assert!(matches!( + result.errors.as_slice(), + [QueryError::NotFound(msg)] if msg.contains("identity for public key hash") + )) + } + + #[test] + fn test_identity_absence_proof() { + let (platform, version) = setup_platform(); + + let public_key_hash = vec![0; 20]; + let request = GetIdentityByPublicKeyHashRequestV0 { + public_key_hash: public_key_hash.clone(), + prove: true, + }; + + let result = platform + .query_identity_by_public_key_hash_v0(request, version) + .expect("expected query to succeed"); + + assert!(matches!( + result.data, + Some(GetIdentityByPublicKeyHashResponseV0 { + result: Some(get_identity_by_public_key_hash_response_v0::Result::Proof( + _ + )), + metadata: Some(_), + }) + )); } } diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identity_contract_nonce/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identity_contract_nonce/mod.rs index 329f2e8410..334229e154 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/identity_contract_nonce/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identity_contract_nonce/mod.rs @@ -1,31 +1,21 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; -use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; -use dapi_grpc::platform::v0::get_identity_contract_nonce_request::Version; -use dapi_grpc::platform::v0::GetIdentityContractNonceRequest; -use dapi_grpc::Message; -use dpp::check_validation_result_with_data; -use dpp::validation::ValidationResult; +use dapi_grpc::platform::v0::get_identity_contract_nonce_request::Version as RequestVersion; +use dapi_grpc::platform::v0::get_identity_contract_nonce_response::Version as ResponseVersion; +use dapi_grpc::platform::v0::{GetIdentityContractNonceRequest, GetIdentityContractNonceResponse}; use dpp::version::PlatformVersion; mod v0; impl Platform { /// Querying of an identity by a public key hash - pub(in crate::query) fn query_identity_contract_nonce( + pub fn query_identity_contract_nonce( &self, - state: &PlatformState, - query_data: &[u8], + GetIdentityContractNonceRequest { version }: GetIdentityContractNonceRequest, platform_version: &PlatformVersion, - ) -> Result>, Error> { - let GetIdentityContractNonceRequest { version } = - check_validation_result_with_data!(GetIdentityContractNonceRequest::decode(query_data) - .map_err(|e| { - QueryError::InvalidArgument(format!("invalid query proto message: {}", e)) - })); - + ) -> Result, Error> { let Some(version) = version else { return Ok(QueryValidationResult::new_with_error( QueryError::DecodingError( @@ -41,7 +31,7 @@ impl Platform { .identity_contract_nonce; let feature_version = match &version { - Version::V0(_) => 0, + RequestVersion::V0(_) => 0, }; if !feature_version_bounds.check_version(feature_version) { return Ok(QueryValidationResult::new_with_error( @@ -55,12 +45,13 @@ impl Platform { )); } match version { - Version::V0(get_identity_contract_nonce_request) => self - .query_identity_contract_nonce_v0( - state, - get_identity_contract_nonce_request, - platform_version, - ), + RequestVersion::V0(request_v0) => { + let result = self.query_identity_contract_nonce_v0(request_v0, platform_version)?; + + Ok(result.map(|response_v0| GetIdentityContractNonceResponse { + version: Some(ResponseVersion::V0(response_v0)), + })) + } } } } diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identity_contract_nonce/v0/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identity_contract_nonce/v0/mod.rs index a2276d52e5..2e0607a217 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/identity_contract_nonce/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identity_contract_nonce/v0/mod.rs @@ -1,46 +1,39 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; -use crate::platform_types::platform_state::v0::PlatformStateV0Methods; -use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_identity_contract_nonce_request::GetIdentityContractNonceRequestV0; -use dapi_grpc::platform::v0::get_identity_contract_nonce_response::GetIdentityContractNonceResponseV0; -use dapi_grpc::platform::v0::{ - get_identity_contract_nonce_response, GetIdentityContractNonceResponse, Proof, +use dapi_grpc::platform::v0::get_identity_contract_nonce_response::{ + get_identity_contract_nonce_response_v0, GetIdentityContractNonceResponseV0, }; -use dapi_grpc::Message; use dpp::check_validation_result_with_data; use dpp::platform_value::Identifier; -use dpp::serialization::PlatformSerializable; use dpp::validation::ValidationResult; use dpp::version::PlatformVersion; impl Platform { pub(super) fn query_identity_contract_nonce_v0( &self, - state: &PlatformState, - request: GetIdentityContractNonceRequestV0, - platform_version: &PlatformVersion, - ) -> Result>, Error> { - let metadata = self.response_metadata_v0(state); - let quorum_type = self.config.validator_set_quorum_type() as u32; - let GetIdentityContractNonceRequestV0 { + GetIdentityContractNonceRequestV0 { identity_id, contract_id, prove, - } = request; + }: GetIdentityContractNonceRequestV0, + platform_version: &PlatformVersion, + ) -> Result, Error> { let identity_id = check_validation_result_with_data!(Identifier::from_vec(identity_id) .map(|bytes| bytes.0) .map_err(|_| QueryError::InvalidArgument( "identity id must be 32 bytes long".to_string() ))); + let contract_id = check_validation_result_with_data!(Identifier::from_vec(contract_id) .map(|bytes| bytes.0) .map_err(|_| QueryError::InvalidArgument( "contract id must be 32 bytes long".to_string() ))); - let response_data = if prove { + + let response = if prove { let proof = self.drive.prove_identity_contract_nonce( identity_id.0, contract_id.0, @@ -48,19 +41,14 @@ impl Platform { &platform_version.drive, )?; - GetIdentityContractNonceResponse { - version: Some(get_identity_contract_nonce_response::Version::V0(GetIdentityContractNonceResponseV0 { - result: Some(get_identity_contract_nonce_response::get_identity_contract_nonce_response_v0::Result::Proof(Proof { - grovedb_proof: proof, - quorum_hash: state.last_committed_quorum_hash().to_vec(), - quorum_type, - block_id_hash: state.last_committed_block_id_hash().to_vec(), - signature: state.last_committed_block_signature().to_vec(), - round: state.last_committed_block_round(), - })), - metadata: Some(metadata), - })), - }.encode_to_vec() + let (metadata, proof) = self.response_metadata_and_proof_v0(proof); + + GetIdentityContractNonceResponseV0 { + result: Some(get_identity_contract_nonce_response_v0::Result::Proof( + proof, + )), + metadata: Some(metadata), + } } else { let maybe_identity = self.drive.fetch_identity_contract_nonce( identity_id.0, @@ -73,14 +61,338 @@ impl Platform { // default here is 0; let identity_contract_nonce = maybe_identity.unwrap_or_default(); - GetIdentityContractNonceResponse { - version: Some(get_identity_contract_nonce_response::Version::V0(GetIdentityContractNonceResponseV0 { - metadata: Some(metadata), - result: Some(get_identity_contract_nonce_response::get_identity_contract_nonce_response_v0::Result::IdentityContractNonce(identity_contract_nonce)), - })), + GetIdentityContractNonceResponseV0 { + metadata: Some(self.response_metadata_v0()), + result: Some( + get_identity_contract_nonce_response_v0::Result::IdentityContractNonce( + identity_contract_nonce, + ), + ), } - .encode_to_vec() }; - Ok(QueryValidationResult::new_with_data(response_data)) + + Ok(QueryValidationResult::new_with_data(response)) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::query::tests::setup_platform; + use dpp::block::block_info::BlockInfo; + use dpp::data_contract::accessors::v0::DataContractV0Getters; + use dpp::identity::accessors::IdentityGettersV0; + use dpp::identity::identity_nonce::{ + IDENTITY_NONCE_VALUE_FILTER, IDENTITY_NONCE_VALUE_FILTER_MAX_BYTES, + }; + use drive::common::identities::create_test_identity_with_rng; + use rand::rngs::StdRng; + use rand::{Rng, SeedableRng}; + + #[test] + fn test_invalid_identity_id() { + let (platform, version) = setup_platform(); + + let request = GetIdentityContractNonceRequestV0 { + identity_id: vec![0; 8], + prove: false, + contract_id: vec![1; 32], + }; + + let result = platform + .query_identity_contract_nonce_v0(request, version) + .expect("expected query to succeed"); + + assert!(matches!( + result.errors.as_slice(), + [QueryError::InvalidArgument(msg)] if msg.contains("identity id must be 32 bytes long"))); + } + + #[test] + fn test_invalid_contract_id() { + let (platform, version) = setup_platform(); + + let request = GetIdentityContractNonceRequestV0 { + identity_id: vec![0; 32], + prove: false, + contract_id: vec![1; 8], + }; + + let result = platform + .query_identity_contract_nonce_v0(request, version) + .expect("expected query to succeed"); + + assert!(matches!( + result.errors.as_slice(), + [QueryError::InvalidArgument(msg)] if msg.contains("contract id must be 32 bytes long"))); + } + + #[test] + fn test_identity_not_found_when_querying_identity_nonce() { + let (platform, version) = setup_platform(); + + let request = GetIdentityContractNonceRequestV0 { + identity_id: vec![0; 32], + prove: false, + contract_id: vec![0; 32], + }; + + let result = platform + .query_identity_contract_nonce_v0(request, version) + .expect("expected query to succeed"); + + assert!(result.is_valid()); + + assert!(matches!( + result.data, + Some(GetIdentityContractNonceResponseV0 { + result: Some( + get_identity_contract_nonce_response_v0::Result::IdentityContractNonce(0) + ), + metadata: Some(_), + }) + )); + } + + #[test] + fn test_contract_info_not_found_when_querying_identity_nonce_with_known_identity() { + let (platform, version) = setup_platform(); + let mut rng = StdRng::seed_from_u64(45); + let id = rng.gen::<[u8; 32]>(); + let identity = create_test_identity_with_rng(&platform.drive, id, &mut rng, None, version) + .expect("expected to create a test identity"); + + let request = GetIdentityContractNonceRequestV0 { + identity_id: id.to_vec(), + prove: false, + contract_id: vec![0; 32], + }; + + let result = platform + .query_identity_contract_nonce_v0(request, version) + .expect("expected query to succeed"); + + assert!(result.is_valid()); + + assert!(matches!( + result.data, + Some(GetIdentityContractNonceResponseV0 { + result: Some( + get_identity_contract_nonce_response_v0::Result::IdentityContractNonce(0) + ), + metadata: Some(_), + }) + )); + } + + #[test] + fn test_identity_is_found_when_querying_identity_nonce() { + let (platform, version) = setup_platform(); + let mut rng = StdRng::seed_from_u64(10); + let id = rng.gen::<[u8; 32]>(); + let identity = create_test_identity_with_rng(&platform.drive, id, &mut rng, None, version) + .expect("expected to create a test identity"); + + let dashpay = platform.drive.cache.system_data_contracts.read_dashpay(); + + platform + .drive + .merge_identity_contract_nonce( + identity.id().to_buffer(), + dashpay.id().to_buffer(), + 1, + &BlockInfo::default(), + true, + None, + &mut vec![], + version, + ) + .expect("expected to set nonce"); + + let request = GetIdentityContractNonceRequestV0 { + identity_id: id.to_vec(), + prove: false, + contract_id: dashpay.id().to_vec(), + }; + + let result = platform + .query_identity_contract_nonce_v0(request, version) + .expect("expected query to succeed"); + + assert!(result.is_valid()); + + assert!(matches!( + result.data, + Some(GetIdentityContractNonceResponseV0 { + result: Some( + get_identity_contract_nonce_response_v0::Result::IdentityContractNonce(1) + ), + metadata: Some(_), + }) + )); + } + + #[test] + fn test_identity_is_found_when_querying_identity_nonce_after_update() { + let (platform, version) = setup_platform(); + let mut rng = StdRng::seed_from_u64(10); + let id = rng.gen::<[u8; 32]>(); + let identity = create_test_identity_with_rng(&platform.drive, id, &mut rng, None, version) + .expect("expected to create a test identity"); + + let dashpay = platform.drive.cache.system_data_contracts.read_dashpay(); + + platform + .drive + .merge_identity_contract_nonce( + identity.id().to_buffer(), + dashpay.id().to_buffer(), + 1, + &BlockInfo::default(), + true, + None, + &mut vec![], + version, + ) + .expect("expected to set nonce"); + + platform + .drive + .merge_identity_contract_nonce( + identity.id().to_buffer(), + dashpay.id().to_buffer(), + 3, + &BlockInfo::default(), + true, + None, + &mut vec![], + version, + ) + .expect("expected to set nonce"); + + let request = GetIdentityContractNonceRequestV0 { + identity_id: id.to_vec(), + prove: false, + contract_id: dashpay.id().to_vec(), + }; + + let result = platform + .query_identity_contract_nonce_v0(request, version) + .expect("expected query to succeed"); + + assert!(result.is_valid()); + + assert!(matches!( + result.data, + Some(GetIdentityContractNonceResponseV0 { + result: Some( + get_identity_contract_nonce_response_v0::Result::IdentityContractNonce(nonce) + ), + metadata: Some(_), + }) if nonce & IDENTITY_NONCE_VALUE_FILTER == 3 && nonce >> IDENTITY_NONCE_VALUE_FILTER_MAX_BYTES == 1 + )); + } + + #[test] + fn test_identity_is_found_when_querying_identity_nonce_after_update_for_past() { + let (platform, version) = setup_platform(); + let mut rng = StdRng::seed_from_u64(10); + let id = rng.gen::<[u8; 32]>(); + let identity = create_test_identity_with_rng(&platform.drive, id, &mut rng, None, version) + .expect("expected to create a test identity"); + + let dashpay = platform.drive.cache.system_data_contracts.read_dashpay(); + + platform + .drive + .merge_identity_contract_nonce( + identity.id().to_buffer(), + dashpay.id().to_buffer(), + 1, + &BlockInfo::default(), + true, + None, + &mut vec![], + version, + ) + .expect("expected to set nonce"); + + platform + .drive + .merge_identity_contract_nonce( + identity.id().to_buffer(), + dashpay.id().to_buffer(), + 3, + &BlockInfo::default(), + true, + None, + &mut vec![], + version, + ) + .expect("expected to set nonce"); + + // we already added 3, and now are adding 2 + platform + .drive + .merge_identity_contract_nonce( + identity.id().to_buffer(), + dashpay.id().to_buffer(), + 2, + &BlockInfo::default(), + true, + None, + &mut vec![], + version, + ) + .expect("expected to set nonce"); + + let request = GetIdentityContractNonceRequestV0 { + identity_id: id.to_vec(), + prove: false, + contract_id: dashpay.id().to_vec(), + }; + + let result = platform + .query_identity_contract_nonce_v0(request, version) + .expect("expected query to succeed"); + + assert!(result.is_valid()); + + assert!(matches!( + result.data, + Some(GetIdentityContractNonceResponseV0 { + result: Some( + get_identity_contract_nonce_response_v0::Result::IdentityContractNonce(3) + ), + metadata: Some(_), + }) + )); + } + + #[test] + fn test_identity_contract_nonce_absence_proof() { + let (platform, version) = setup_platform(); + + let id = vec![0; 32]; + + let request = GetIdentityContractNonceRequestV0 { + identity_id: vec![0; 32], + prove: true, + contract_id: vec![0; 32], + }; + + let result = platform + .query_identity_contract_nonce_v0(request, version) + .expect("expected query to succeed"); + + assert!(result.is_valid()); + + assert!(matches!( + result.data, + Some(GetIdentityContractNonceResponseV0 { + result: Some(get_identity_contract_nonce_response_v0::Result::Proof(_)), + metadata: Some(_), + }) + )); } } diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identity_nonce/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identity_nonce/mod.rs index 97a85e20f7..abcae1e255 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/identity_nonce/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identity_nonce/mod.rs @@ -1,31 +1,21 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; -use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; -use dapi_grpc::platform::v0::get_identity_nonce_request::Version; -use dapi_grpc::platform::v0::GetIdentityNonceRequest; -use dapi_grpc::Message; -use dpp::check_validation_result_with_data; -use dpp::validation::ValidationResult; +use dapi_grpc::platform::v0::get_identity_nonce_request::Version as RequestVersion; +use dapi_grpc::platform::v0::get_identity_nonce_response::Version as ResponseVersion; +use dapi_grpc::platform::v0::{GetIdentityNonceRequest, GetIdentityNonceResponse}; use dpp::version::PlatformVersion; mod v0; impl Platform { /// Querying of an identity by the nonce - pub(in crate::query) fn query_identity_nonce( + pub fn query_identity_nonce( &self, - state: &PlatformState, - query_data: &[u8], + GetIdentityNonceRequest { version }: GetIdentityNonceRequest, platform_version: &PlatformVersion, - ) -> Result>, Error> { - let GetIdentityNonceRequest { version } = - check_validation_result_with_data!(GetIdentityNonceRequest::decode(query_data) - .map_err(|e| { - QueryError::InvalidArgument(format!("invalid query proto message: {}", e)) - })); - + ) -> Result, Error> { let Some(version) = version else { return Ok(QueryValidationResult::new_with_error( QueryError::DecodingError("could not decode identity nonce query".to_string()), @@ -39,7 +29,7 @@ impl Platform { .identity_nonce; let feature_version = match &version { - Version::V0(_) => 0, + RequestVersion::V0(_) => 0, }; if !feature_version_bounds.check_version(feature_version) { return Ok(QueryValidationResult::new_with_error( @@ -53,8 +43,12 @@ impl Platform { )); } match version { - Version::V0(get_identity_nonce_request) => { - self.query_identity_nonce_v0(state, get_identity_nonce_request, platform_version) + RequestVersion::V0(request_v0) => { + let result = self.query_identity_nonce_v0(request_v0, platform_version)?; + + Ok(result.map(|response_v0| GetIdentityNonceResponse { + version: Some(ResponseVersion::V0(response_v0)), + })) } } } diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identity_nonce/v0/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identity_nonce/v0/mod.rs index 32faedea69..9f982a75b8 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/identity_nonce/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identity_nonce/v0/mod.rs @@ -1,52 +1,39 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; -use crate::platform_types::platform_state::v0::PlatformStateV0Methods; -use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_identity_nonce_request::GetIdentityNonceRequestV0; -use dapi_grpc::platform::v0::get_identity_nonce_response::GetIdentityNonceResponseV0; -use dapi_grpc::platform::v0::{get_identity_nonce_response, GetIdentityNonceResponse, Proof}; -use dapi_grpc::Message; +use dapi_grpc::platform::v0::get_identity_nonce_response::{ + get_identity_nonce_response_v0, GetIdentityNonceResponseV0, +}; use dpp::check_validation_result_with_data; use dpp::platform_value::Identifier; -use dpp::serialization::PlatformSerializable; use dpp::validation::ValidationResult; use dpp::version::PlatformVersion; impl Platform { pub(super) fn query_identity_nonce_v0( &self, - state: &PlatformState, - request: GetIdentityNonceRequestV0, + GetIdentityNonceRequestV0 { identity_id, prove }: GetIdentityNonceRequestV0, platform_version: &PlatformVersion, - ) -> Result>, Error> { - let metadata = self.response_metadata_v0(state); - let quorum_type = self.config.validator_set_quorum_type() as u32; - let GetIdentityNonceRequestV0 { identity_id, prove } = request; + ) -> Result, Error> { let identity_id = check_validation_result_with_data!(Identifier::from_vec(identity_id) .map(|bytes| bytes.0) .map_err(|_| QueryError::InvalidArgument( "identity id must be 32 bytes long".to_string() ))); - let response_data = if prove { + + let response = if prove { let proof = self .drive .prove_identity_nonce(identity_id.0, None, platform_version)?; - GetIdentityNonceResponse { - version: Some(get_identity_nonce_response::Version::V0(GetIdentityNonceResponseV0 { - result: Some(get_identity_nonce_response::get_identity_nonce_response_v0::Result::Proof(Proof { - grovedb_proof: proof, - quorum_hash: state.last_committed_quorum_hash().to_vec(), - quorum_type, - block_id_hash: state.last_committed_block_id_hash().to_vec(), - signature: state.last_committed_block_signature().to_vec(), - round: state.last_committed_block_round(), - })), - metadata: Some(metadata), - })), - }.encode_to_vec() + let (metadata, proof) = self.response_metadata_and_proof_v0(proof); + + GetIdentityNonceResponseV0 { + result: Some(get_identity_nonce_response_v0::Result::Proof(proof)), + metadata: Some(metadata), + } } else { let maybe_identity = self.drive @@ -55,14 +42,241 @@ impl Platform { // default here is 0; let identity_nonce = maybe_identity.unwrap_or_default(); - GetIdentityNonceResponse { - version: Some(get_identity_nonce_response::Version::V0(GetIdentityNonceResponseV0 { - metadata: Some(metadata), - result: Some(get_identity_nonce_response::get_identity_nonce_response_v0::Result::IdentityNonce(identity_nonce)), - })), + GetIdentityNonceResponseV0 { + metadata: Some(self.response_metadata_v0()), + result: Some(get_identity_nonce_response_v0::Result::IdentityNonce( + identity_nonce, + )), } - .encode_to_vec() }; - Ok(QueryValidationResult::new_with_data(response_data)) + + Ok(QueryValidationResult::new_with_data(response)) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::query::tests::setup_platform; + use dpp::block::block_info::BlockInfo; + use dpp::identity::accessors::IdentityGettersV0; + use dpp::identity::identity_nonce::{ + IDENTITY_NONCE_VALUE_FILTER, IDENTITY_NONCE_VALUE_FILTER_MAX_BYTES, + }; + use drive::common::identities::create_test_identity_with_rng; + use rand::prelude::StdRng; + use rand::{Rng, SeedableRng}; + + #[test] + fn test_invalid_identity_id() { + let (platform, version) = setup_platform(); + + let request = GetIdentityNonceRequestV0 { + identity_id: vec![0; 8], + prove: false, + }; + + let result = platform + .query_identity_nonce_v0(request, version) + .expect("expected query to succeed"); + + assert!(matches!( + result.errors.as_slice(), + [QueryError::InvalidArgument(msg)] if msg.contains("identity id must be 32 bytes long"))); + } + + #[test] + fn test_identity_not_found_when_querying_identity_nonce() { + let (platform, version) = setup_platform(); + + let request = GetIdentityNonceRequestV0 { + identity_id: vec![0; 32], + prove: false, + }; + + let result = platform + .query_identity_nonce_v0(request, version) + .expect("expected query to succeed"); + + assert!(result.is_valid()); + + assert!(matches!( + result.data, + Some(GetIdentityNonceResponseV0 { + result: Some(get_identity_nonce_response_v0::Result::IdentityNonce(0)), + metadata: Some(_), + }) + )); + } + + #[test] + fn test_identity_is_found_when_querying_identity_nonce() { + let (platform, version) = setup_platform(); + let mut rng = StdRng::seed_from_u64(10); + let id = rng.gen::<[u8; 32]>(); + let identity = create_test_identity_with_rng(&platform.drive, id, &mut rng, None, version) + .expect("expected to create a test identity"); + + let request = GetIdentityNonceRequestV0 { + identity_id: id.to_vec(), + prove: false, + }; + + let result = platform + .query_identity_nonce_v0(request, version) + .expect("expected query to succeed"); + + assert!(result.is_valid()); + + assert!(matches!( + result.data, + Some(GetIdentityNonceResponseV0 { + result: Some(get_identity_nonce_response_v0::Result::IdentityNonce(0)), + metadata: Some(_), + }) + )); + } + + #[test] + fn test_identity_is_found_when_querying_identity_nonce_after_update() { + let (platform, version) = setup_platform(); + let mut rng = StdRng::seed_from_u64(10); + let id = rng.gen::<[u8; 32]>(); + let identity = create_test_identity_with_rng(&platform.drive, id, &mut rng, None, version) + .expect("expected to create a test identity"); + + let dashpay = platform.drive.cache.system_data_contracts.read_dashpay(); + + platform + .drive + .merge_identity_nonce( + identity.id().to_buffer(), + 1, + &BlockInfo::genesis(), + true, + None, + version, + ) + .expect("expected to set nonce"); + + platform + .drive + .merge_identity_nonce( + identity.id().to_buffer(), + 3, + &BlockInfo::genesis(), + true, + None, + version, + ) + .expect("expected to set nonce"); + + let request = GetIdentityNonceRequestV0 { + identity_id: id.to_vec(), + prove: false, + }; + + let result = platform + .query_identity_nonce_v0(request, version) + .expect("expected query to succeed"); + + assert!(result.is_valid()); + + assert!(matches!( + result.data, + Some(GetIdentityNonceResponseV0 { + result: Some(get_identity_nonce_response_v0::Result::IdentityNonce(nonce)), + metadata: Some(_), + }) if nonce & IDENTITY_NONCE_VALUE_FILTER == 3 && nonce >> IDENTITY_NONCE_VALUE_FILTER_MAX_BYTES == 1 + )); + } + + #[test] + fn test_identity_is_found_when_querying_identity_nonce_after_update_for_past() { + let (platform, version) = setup_platform(); + let mut rng = StdRng::seed_from_u64(10); + let id = rng.gen::<[u8; 32]>(); + let identity = create_test_identity_with_rng(&platform.drive, id, &mut rng, None, version) + .expect("expected to create a test identity"); + + platform + .drive + .merge_identity_nonce( + identity.id().to_buffer(), + 1, + &BlockInfo::default(), + true, + None, + version, + ) + .expect("expected to set nonce"); + + platform + .drive + .merge_identity_nonce( + identity.id().to_buffer(), + 3, + &BlockInfo::default(), + true, + None, + version, + ) + .expect("expected to set nonce"); + + // we already added 3, and now are adding 2 + platform + .drive + .merge_identity_nonce( + identity.id().to_buffer(), + 2, + &BlockInfo::default(), + true, + None, + version, + ) + .expect("expected to set nonce"); + + let request = GetIdentityNonceRequestV0 { + identity_id: id.to_vec(), + prove: false, + }; + + let result = platform + .query_identity_nonce_v0(request, version) + .expect("expected query to succeed"); + + assert!(result.is_valid()); + + assert!(matches!( + result.data, + Some(GetIdentityNonceResponseV0 { + result: Some(get_identity_nonce_response_v0::Result::IdentityNonce(3)), + metadata: Some(_), + }) + )); + } + + #[test] + fn test_identity_contract_nonce_absence_proof() { + let (platform, version) = setup_platform(); + + let id = vec![0; 32]; + + let request = GetIdentityNonceRequestV0 { + identity_id: vec![0; 32], + prove: true, + }; + + let result = platform + .query_identity_nonce_v0(request, version) + .expect("expected query to succeed"); + + assert!(matches!( + result.data, + Some(GetIdentityNonceResponseV0 { + result: Some(get_identity_nonce_response_v0::Result::Proof(_)), + metadata: Some(_), + }) + )); } } diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/keys/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/keys/mod.rs index b9c263f3dc..88a6d2e3b3 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/keys/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/keys/mod.rs @@ -1,30 +1,21 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; -use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; -use dapi_grpc::platform::v0::get_identity_keys_request::Version; -use dapi_grpc::platform::v0::GetIdentityKeysRequest; -use dapi_grpc::Message; -use dpp::check_validation_result_with_data; -use dpp::validation::ValidationResult; +use dapi_grpc::platform::v0::get_identity_keys_request::Version as RequestVersion; +use dapi_grpc::platform::v0::get_identity_keys_response::Version as ResponseVersion; +use dapi_grpc::platform::v0::{GetIdentityKeysRequest, GetIdentityKeysResponse}; use dpp::version::PlatformVersion; mod v0; impl Platform { /// Querying of an identity's keys - pub(in crate::query) fn query_keys( + pub fn query_keys( &self, - state: &PlatformState, - query_data: &[u8], + GetIdentityKeysRequest { version }: GetIdentityKeysRequest, platform_version: &PlatformVersion, - ) -> Result>, Error> { - let GetIdentityKeysRequest { version } = - check_validation_result_with_data!(GetIdentityKeysRequest::decode(query_data).map_err( - |e| QueryError::InvalidArgument(format!("invalid query proto message: {}", e)) - )); - + ) -> Result, Error> { let Some(version) = version else { return Ok(QueryValidationResult::new_with_error( QueryError::DecodingError("could not decode identity keys query".to_string()), @@ -38,7 +29,7 @@ impl Platform { .keys; let feature_version = match &version { - Version::V0(_) => 0, + RequestVersion::V0(_) => 0, }; if !feature_version_bounds.check_version(feature_version) { return Ok(QueryValidationResult::new_with_error( @@ -52,8 +43,12 @@ impl Platform { )); } match version { - Version::V0(get_identity_request) => { - self.query_keys_v0(state, get_identity_request, platform_version) + RequestVersion::V0(request_v0) => { + let result = self.query_keys_v0(request_v0, platform_version)?; + + Ok(result.map(|response_v0| GetIdentityKeysResponse { + version: Some(ResponseVersion::V0(response_v0)), + })) } } } diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/keys/v0/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/keys/v0/mod.rs index bd6bbee538..16b2f968f1 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/keys/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/keys/v0/mod.rs @@ -1,13 +1,11 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; -use crate::platform_types::platform_state::v0::PlatformStateV0Methods; -use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_identity_keys_request::GetIdentityKeysRequestV0; -use dapi_grpc::platform::v0::get_identity_keys_response::GetIdentityKeysResponseV0; -use dapi_grpc::platform::v0::{get_identity_keys_response, GetIdentityKeysResponse, Proof}; -use dapi_grpc::Message; +use dapi_grpc::platform::v0::get_identity_keys_response::{ + get_identity_keys_response_v0, GetIdentityKeysResponseV0, +}; use dpp::check_validation_result_with_data; use dpp::identifier::Identifier; use drive::error::query::QuerySyntaxError; @@ -74,24 +72,21 @@ fn convert_key_request_type( impl Platform { pub(super) fn query_keys_v0( &self, - state: &PlatformState, - request: GetIdentityKeysRequestV0, - platform_version: &PlatformVersion, - ) -> Result>, Error> { - let metadata = self.response_metadata_v0(state); - let quorum_type = self.config.validator_set_quorum_type() as u32; - let GetIdentityKeysRequestV0 { + GetIdentityKeysRequestV0 { identity_id, request_type, limit, offset, prove, - } = request; + }: GetIdentityKeysRequestV0, + platform_version: &PlatformVersion, + ) -> Result, Error> { let identity_id: Identifier = check_validation_result_with_data!(identity_id .try_into() .map_err(|_| QueryError::InvalidArgument( "id must be a valid identifier (32 bytes long)".to_string() ))); + if let Some(limit) = limit { if limit > u16::MAX as u32 { return Ok(QueryValidationResult::new_with_error(QueryError::Query( @@ -115,64 +110,282 @@ impl Platform { ))); } } + let Some(request_type) = request_type else { return Ok(QueryValidationResult::new_with_error(QueryError::Query( QuerySyntaxError::InvalidParameter("key request must be defined".to_string()), ))); }; + let Some(request) = request_type.request else { return Ok(QueryValidationResult::new_with_error(QueryError::Query( QuerySyntaxError::InvalidParameter("key request must be defined".to_string()), ))); }; + let key_request_type = check_validation_result_with_data!(convert_key_request_type(request)); + let key_request = IdentityKeysRequest { identity_id: identity_id.into_buffer(), request_type: key_request_type, limit: limit.map(|l| l as u16), offset: offset.map(|o| o as u16), }; - let response_data = if prove { + + let response = if prove { let proof = self .drive .prove_identity_keys(key_request, None, platform_version)?; - GetIdentityKeysResponse { - version: Some(get_identity_keys_response::Version::V0(GetIdentityKeysResponseV0 { - result: Some(get_identity_keys_response::get_identity_keys_response_v0::Result::Proof(Proof { - grovedb_proof: proof, - quorum_hash: state.last_committed_quorum_hash().to_vec(), - quorum_type, - block_id_hash: state.last_committed_block_id_hash().to_vec(), - signature: state.last_committed_block_signature().to_vec(), - round: state.last_committed_block_round(), - })), - metadata: Some(metadata), - })), + let (metadata, proof) = self.response_metadata_and_proof_v0(proof); + + GetIdentityKeysResponseV0 { + result: Some(get_identity_keys_response_v0::Result::Proof(proof)), + metadata: Some(metadata), } - .encode_to_vec() } else { let keys: SerializedKeyVec = self.drive .fetch_identity_keys(key_request, None, platform_version)?; - GetIdentityKeysResponse { - version: Some(get_identity_keys_response::Version::V0( - GetIdentityKeysResponseV0 { - result: Some( - get_identity_keys_response::get_identity_keys_response_v0::Result::Keys( - get_identity_keys_response::get_identity_keys_response_v0::Keys { - keys_bytes: keys, - }, - ), - ), - metadata: Some(metadata), - }, + GetIdentityKeysResponseV0 { + result: Some(get_identity_keys_response_v0::Result::Keys( + get_identity_keys_response_v0::Keys { keys_bytes: keys }, )), + metadata: Some(self.response_metadata_v0()), } - .encode_to_vec() }; - Ok(QueryValidationResult::new_with_data(response_data)) + + Ok(QueryValidationResult::new_with_data(response)) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::query::tests::{assert_invalid_identifier, setup_platform}; + use dapi_grpc::platform::v0::key_request_type::Request; + use dapi_grpc::platform::v0::{AllKeys, KeyRequestType, SearchKey, SecurityLevelMap}; + + #[test] + fn test_invalid_identity_id() { + let (platform, version) = setup_platform(); + + let request = GetIdentityKeysRequestV0 { + identity_id: vec![0; 8], + request_type: None, + limit: None, + offset: None, + prove: false, + }; + + let result = platform + .query_keys_v0(request, version) + .expect("expected query to succeed"); + + assert_invalid_identifier(result); + } + + #[test] + fn test_invalid_limit_u16_overflow() { + let (platform, version) = setup_platform(); + + let request = GetIdentityKeysRequestV0 { + identity_id: vec![0; 32], + request_type: None, + limit: Some(u32::MAX), + offset: None, + prove: false, + }; + + let result = platform + .query_keys_v0(request, version) + .expect("expected query to succeed"); + + assert!(matches!( + result.errors.as_slice(), + [QueryError::Query(QuerySyntaxError::InvalidParameter(msg))] if msg == "limit out of bounds" + )); + } + + #[test] + fn test_invalid_limit_max() { + let (platform, version) = setup_platform(); + + let request = GetIdentityKeysRequestV0 { + identity_id: vec![0; 32], + request_type: None, + limit: Some((platform.config.drive.max_query_limit + 1) as u32), + offset: None, + prove: false, + }; + + let result = platform + .query_keys_v0(request, version) + .expect("expected query to succeed"); + + let error_message = format!( + "limit greater than max limit {}", + platform.config.drive.max_query_limit + ); + + assert!(matches!( + result.errors.as_slice(), + [QueryError::Query(QuerySyntaxError::InvalidLimit(msg))] if msg == &error_message + )); + } + + #[test] + fn test_invalid_offset_u16_overflow() { + let (platform, version) = setup_platform(); + + let request = GetIdentityKeysRequestV0 { + identity_id: vec![0; 32], + request_type: None, + limit: None, + offset: Some(u32::MAX), + prove: false, + }; + + let result = platform + .query_keys_v0(request, version) + .expect("expected query to succeed"); + + assert!(matches!( + result.errors.as_slice(), + [QueryError::Query(QuerySyntaxError::InvalidParameter(msg))] if msg == "offset out of bounds" + )); + } + + #[test] + fn test_missing_request_type() { + let (platform, version) = setup_platform(); + + let request = GetIdentityKeysRequestV0 { + identity_id: vec![0; 32], + request_type: None, + limit: None, + offset: None, + prove: false, + }; + + let result = platform + .query_keys_v0(request, version) + .expect("expected query to succeed"); + + assert!(matches!( + result.errors.as_slice(), + [QueryError::Query(QuerySyntaxError::InvalidParameter(msg))] if msg == "key request must be defined" + )); + } + + #[test] + fn test_missing_request() { + let (platform, version) = setup_platform(); + + let request = GetIdentityKeysRequestV0 { + identity_id: vec![0; 32], + request_type: Some(KeyRequestType { request: None }), + limit: None, + offset: None, + prove: false, + }; + + let result = platform + .query_keys_v0(request, version) + .expect("expected query to succeed"); + + assert!(matches!( + result.errors.as_slice(), + [QueryError::Query(QuerySyntaxError::InvalidParameter(msg))] if msg == "key request must be defined" + )); + } + + #[test] + fn test_invalid_key_request_type() { + let (platform, version) = setup_platform(); + + let request = GetIdentityKeysRequestV0 { + identity_id: vec![0; 32], + request_type: Some(KeyRequestType { + request: Some(Request::SearchKey(SearchKey { + purpose_map: [( + 0, + SecurityLevelMap { + security_level_map: [(u32::MAX, 0)].into_iter().collect(), + }, + )] + .into_iter() + .collect(), + })), + }), + limit: None, + offset: None, + prove: false, + }; + + let result = platform + .query_keys_v0(request, version) + .expect("expected query to succeed"); + + assert!(matches!( + result.errors.as_slice(), + [QueryError::Query(QuerySyntaxError::InvalidKeyParameter(msg))] if msg == "security level out of bounds" + )); + } + + #[test] + fn test_absent_keys() { + let (platform, version) = setup_platform(); + + let request = GetIdentityKeysRequestV0 { + identity_id: vec![0; 32], + request_type: Some(KeyRequestType { + request: Some(Request::AllKeys(AllKeys {})), + }), + limit: None, + offset: None, + prove: false, + }; + + let result = platform + .query_keys_v0(request, version) + .expect("expected query to succeed"); + + assert!(matches!( + result.data, + Some(GetIdentityKeysResponseV0 { + result: Some(get_identity_keys_response_v0::Result::Keys(keys)), + .. + }) if keys.keys_bytes.is_empty() + )); + } + + #[test] + fn test_absent_keys_proof() { + let (platform, version) = setup_platform(); + + let request = GetIdentityKeysRequestV0 { + identity_id: vec![0; 32], + request_type: Some(KeyRequestType { + request: Some(Request::AllKeys(AllKeys {})), + }), + limit: None, + offset: None, + prove: true, + }; + + let result = platform + .query_keys_v0(request, version) + .expect("expected query to succeed"); + + assert!(matches!( + result.data, + Some(GetIdentityKeysResponseV0 { + result: Some(get_identity_keys_response_v0::Result::Proof(_)), + metadata: Some(_) + }) + )); } } diff --git a/packages/rs-drive-abci/src/query/mod.rs b/packages/rs-drive-abci/src/query/mod.rs index 8e8c1dcced..fd3c28bd9f 100644 --- a/packages/rs-drive-abci/src/query/mod.rs +++ b/packages/rs-drive-abci/src/query/mod.rs @@ -3,88 +3,36 @@ mod document_query; mod identity_based_queries; mod proofs; mod response_metadata; +mod service; mod system; -mod v0; use crate::error::query::QueryError; -use crate::error::Error; -use crate::platform_types::platform::Platform; -use crate::error::execution::ExecutionError; use dpp::validation::ValidationResult; -use dpp::version::PlatformVersion; + +pub use service::QueryService; /// A query validation result pub type QueryValidationResult = ValidationResult; -impl Platform { - /// Querying - pub fn query( - &self, - query_path: &str, - query_data: &[u8], - platform_version: &PlatformVersion, - ) -> Result>, Error> { - match platform_version.drive_abci.query.base_query_structure { - 0 => self.query_v0(query_path, query_data, platform_version), - version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { - method: "Platform::query".to_string(), - known_versions: vec![0], - received: version, - })), - } - } -} - #[cfg(test)] mod tests { - #[macro_export] - macro_rules! extract_single_variant_or_panic { - ($expression:expr, $pattern:pat, $binding:ident) => { - match $expression { - $pattern => $binding, - // _ => panic!( - // "Expected pattern {} but got another variant", - // stringify!($pattern) - // ), - } - }; - } - - #[macro_export] - macro_rules! extract_variant_or_panic { - ($expression:expr, $pattern:pat, $binding:ident) => { - match $expression { - $pattern => $binding, - _ => panic!( - "Expected pattern {} but got another variant", - stringify!($pattern) - ), - } - }; - } - - use crate::config::PlatformConfig; use crate::error::query::QueryError; use crate::platform_types::platform::Platform; use crate::query::QueryValidationResult; use crate::rpc::core::MockCoreRPCLike; use crate::test::helpers::setup::{TempPlatform, TestPlatformBuilder}; use dpp::block::block_info::BlockInfo; - use dpp::block::epoch::Epoch; - use dpp::prelude::DataContract; + use dpp::data_contract::DataContract; use drive::drive::batch::DataContractOperationType; use drive::drive::batch::DriveOperation::DataContractOperation; use platform_version::version::PlatformVersion; use std::borrow::Cow; - fn setup_platform<'a>() -> (TempPlatform, &'a PlatformVersion) { + pub fn setup_platform<'a>() -> (TempPlatform, &'a PlatformVersion) { let platform = TestPlatformBuilder::new() - .with_config(PlatformConfig { - ..Default::default() - }) - .build_with_mock_rpc(); - let platform = platform.set_initial_state_structure(); + .build_with_mock_rpc() + .set_initial_state_structure(); let platform_version = platform .platform @@ -97,7 +45,7 @@ mod tests { (platform, platform_version) } - fn store_data_contract( + pub fn store_data_contract( platform: &Platform, data_contract: &DataContract, platform_version: &PlatformVersion, @@ -107,12 +55,7 @@ mod tests { storage_flags: None, }); - let block_info = BlockInfo { - time_ms: 0, - height: 0, - core_height: 0, - epoch: Epoch::default(), - }; + let block_info = BlockInfo::genesis(); platform .drive @@ -120,3348 +63,12 @@ mod tests { .expect("expected to apply drive operations"); } - fn assert_invalid_identifier(validation_result: QueryValidationResult>) { - let validation_error = validation_result.first_error().unwrap(); - - assert!(matches!( - validation_error, - QueryError::InvalidArgument(msg) if msg.contains("id must be a valid identifier (32 bytes long)") - )); - } - - #[test] - fn test_invalid_path() { - let (platform, platform_version) = setup_platform(); - - let data = vec![0; 32]; - let path = "/invalid_path"; - let result = platform.query(path, &data, platform_version); - assert!(result.is_ok()); - - let validation_result = result.unwrap(); + pub fn assert_invalid_identifier( + validation_result: QueryValidationResult, + ) { assert!(matches!( - validation_result.first_error().unwrap(), - QueryError::InvalidArgument(msg) if msg == &format!("query path '{}' is not supported", path).to_string() + validation_result.errors.as_slice(), + [QueryError::InvalidArgument(msg)] if msg.contains("id must be a valid identifier (32 bytes long)") )); } - - #[test] - fn test_invalid_query_data() { - let (platform, version) = setup_platform(); - - let paths = vec![ - "/identity", - "/identities", - "/identity/balance", - "/identity/balanceAndRevision", - "/identity/keys", - "/dataContract", - "/dataContracts", - "/dataContractHistory", - "/documents", - "/dataContract/documents", - "/identity/by-public-key-hash", - "/identities/by-public-key-hash", - "/proofs", - ]; - - paths.iter().for_each(|path| { - let result = platform.query(path, &[0; 8], version); - assert!(result.is_ok()); - - let validation_result = result.unwrap(); - let validation_error = validation_result.first_error().unwrap(); - - assert!( - matches!(validation_error, QueryError::InvalidArgument(msg) if msg.contains("invalid query proto message")) - ); - }) - } - - mod identity { - use crate::error::query::QueryError; - use crate::query::tests::assert_invalid_identifier; - use bs58::encode; - use dapi_grpc::platform::v0::get_identity_request::GetIdentityRequestV0; - use dapi_grpc::platform::v0::{ - get_identity_request, get_identity_response, GetIdentityRequest, GetIdentityResponse, - }; - use dapi_grpc::Message; - - const QUERY_PATH: &str = "/identity"; - - #[test] - fn test_invalid_identity_id() { - let (platform, version) = super::setup_platform(); - - let request = GetIdentityRequest { - version: Some(get_identity_request::Version::V0(GetIdentityRequestV0 { - id: vec![0; 8], - prove: false, - })), - } - .encode_to_vec(); - - let result = platform.query(QUERY_PATH, &request, version); - assert!(result.is_ok()); - assert_invalid_identifier(result.unwrap()); - } - - #[test] - fn test_identity_not_found() { - let (platform, version) = super::setup_platform(); - - let id = vec![0; 32]; - let request = GetIdentityRequest { - version: Some(get_identity_request::Version::V0(GetIdentityRequestV0 { - id: id.clone(), - prove: false, - })), - } - .encode_to_vec(); - - let result = platform.query(QUERY_PATH, &request, version); - assert!(result.is_ok()); - let validation_result = result.unwrap(); - let validation_error = validation_result.first_error().unwrap(); - - let error_message = format!("identity {} not found", encode(id).into_string()); - - assert!(matches!( - validation_error, - QueryError::NotFound(msg) if msg.contains(&error_message) - )); - } - - #[test] - fn test_identity_absence_proof() { - let (platform, version) = super::setup_platform(); - - let id = vec![0; 32]; - let request = GetIdentityRequest { - version: Some(get_identity_request::Version::V0(GetIdentityRequestV0 { - id: id.clone(), - prove: true, - })), - } - .encode_to_vec(); - - let result = platform.query(QUERY_PATH, &request, version); - assert!(result.is_ok()); - let validation_result = result.unwrap(); - let response = - GetIdentityResponse::decode(validation_result.data.unwrap().as_slice()).unwrap(); - - assert!(matches!( - extract_single_variant_or_panic!( - response.version.expect("expected a versioned response"), - get_identity_response::Version::V0(inner), - inner - ) - .result - .unwrap(), - get_identity_response::get_identity_response_v0::Result::Proof(_) - )); - } - } - - mod identities { - use dapi_grpc::platform::v0::get_identities_request::GetIdentitiesRequestV0; - use dapi_grpc::platform::v0::{ - get_identities_request, get_identities_response, GetIdentitiesRequest, - GetIdentitiesResponse, - }; - use dapi_grpc::Message; - - const QUERY_PATH: &str = "/identities"; - - #[test] - fn test_invalid_identity_id() { - let (platform, version) = super::setup_platform(); - - let request = GetIdentitiesRequest { - version: Some(get_identities_request::Version::V0( - GetIdentitiesRequestV0 { - ids: vec![vec![0; 8]], - prove: false, - }, - )), - } - .encode_to_vec(); - - let result = platform.query(QUERY_PATH, &request, version); - assert!(result.is_ok()); - super::assert_invalid_identifier(result.unwrap()); - } - - #[test] - fn test_identities_not_found() { - let (platform, version) = super::setup_platform(); - - let id = vec![0; 32]; - - let request = GetIdentitiesRequest { - version: Some(get_identities_request::Version::V0( - GetIdentitiesRequestV0 { - ids: vec![id.clone()], - prove: false, - }, - )), - } - .encode_to_vec(); - - let result = platform.query(QUERY_PATH, &request, version); - assert!(result.is_ok()); - - let validation_result = result.unwrap(); - let data = validation_result.data.unwrap(); - let response = GetIdentitiesResponse::decode(data.as_slice()).unwrap(); - - let get_identities_response::get_identities_response_v0::Result::Identities(identities) = - extract_single_variant_or_panic!( - response.version.expect("expected a versioned response"), - get_identities_response::Version::V0(inner), - inner - ) - .result - .unwrap() - else { - panic!("invalid response") - }; - - assert!(identities.identity_entries[0].value.is_none()); - } - - #[test] - fn test_identities_absence_proof() { - let (platform, version) = super::setup_platform(); - - let id = vec![0; 32]; - let request = GetIdentitiesRequest { - version: Some(get_identities_request::Version::V0( - GetIdentitiesRequestV0 { - ids: vec![id.clone()], - prove: true, - }, - )), - } - .encode_to_vec(); - - let result = platform.query(QUERY_PATH, &request, version); - assert!(result.is_ok()); - let validation_result = result.unwrap(); - let response = - GetIdentitiesResponse::decode(validation_result.data.unwrap().as_slice()).unwrap(); - - assert!(matches!( - extract_single_variant_or_panic!( - response.version.expect("expected a versioned response"), - get_identities_response::Version::V0(inner), - inner - ) - .result - .unwrap(), - get_identities_response::get_identities_response_v0::Result::Proof(_) - )); - } - } - - mod identity_balance { - use crate::error::query::QueryError; - - use dapi_grpc::platform::v0::get_identity_balance_request::{ - GetIdentityBalanceRequestV0, Version, - }; - use dapi_grpc::platform::v0::{ - get_identity_balance_response, GetIdentityBalanceRequest, GetIdentityBalanceResponse, - }; - use dapi_grpc::Message; - - const QUERY_PATH: &str = "/identity/balance"; - - #[test] - fn test_invalid_identity_id() { - let (platform, version) = super::setup_platform(); - - let request = GetIdentityBalanceRequest { - version: Some(Version::V0(GetIdentityBalanceRequestV0 { - id: vec![0; 8], - prove: false, - })), - } - .encode_to_vec(); - - let result = platform.query(QUERY_PATH, &request, version); - assert!(result.is_ok()); - super::assert_invalid_identifier(result.unwrap()); - } - - #[test] - fn test_identity_not_found() { - let (platform, version) = super::setup_platform(); - - let id = vec![0; 32]; - - let request = GetIdentityBalanceRequest { - version: Some(Version::V0(GetIdentityBalanceRequestV0 { - id: id.clone(), - prove: false, - })), - } - .encode_to_vec(); - - let validation_result = platform - .query(QUERY_PATH, &request, version) - .expect("expected query to succeed"); - let validation_error = validation_result.first_error().unwrap(); - - assert_eq!( - validation_error.to_string(), - "not found error: No Identity found".to_string() - ); - - assert!(matches!(validation_error, QueryError::NotFound(_))); - } - - #[test] - fn test_identity_balance_absence_proof() { - let (platform, version) = super::setup_platform(); - - let id = vec![0; 32]; - - let request = GetIdentityBalanceRequest { - version: Some(Version::V0(GetIdentityBalanceRequestV0 { - id: id.clone(), - prove: true, - })), - } - .encode_to_vec(); - - let result = platform.query(QUERY_PATH, &request, version); - let validation_result = result.unwrap(); - let response = - GetIdentityBalanceResponse::decode(validation_result.data.unwrap().as_slice()) - .unwrap(); - - assert!(matches!( - extract_single_variant_or_panic!( - response.version.expect("expected a versioned response"), - get_identity_balance_response::Version::V0(inner), - inner - ) - .result - .unwrap(), - get_identity_balance_response::get_identity_balance_response_v0::Result::Proof(_) - )); - } - } - - mod identity_nonce { - use crate::error::query::QueryError; - - use dapi_grpc::platform::v0::get_identity_nonce_request::{ - GetIdentityNonceRequestV0, Version, - }; - use dapi_grpc::platform::v0::get_identity_nonce_response::get_identity_nonce_response_v0; - use dapi_grpc::platform::v0::{ - get_identity_nonce_response, GetIdentityNonceRequest, GetIdentityNonceResponse, - }; - use dapi_grpc::Message; - use dpp::block::block_info::BlockInfo; - use dpp::data_contract::document_type::random_document::CreateRandomDocument; - use dpp::identity::accessors::IdentityGettersV0; - use dpp::identity::identity_nonce::{ - IDENTITY_NONCE_VALUE_FILTER, IDENTITY_NONCE_VALUE_FILTER_MAX_BYTES, - }; - use drive::common::identities::create_test_identity_with_rng; - use rand::prelude::StdRng; - use rand::{Rng, SeedableRng}; - - const QUERY_PATH: &str = "/identity/nonce"; - - #[test] - fn test_invalid_identity_id() { - let (platform, version) = super::setup_platform(); - - let request = GetIdentityNonceRequest { - version: Some(Version::V0(GetIdentityNonceRequestV0 { - identity_id: vec![0; 8], - prove: false, - })), - } - .encode_to_vec(); - - let result = platform.query(QUERY_PATH, &request, version); - assert!(result.is_ok()); - let validation_error = result.as_ref().unwrap().first_error().unwrap(); - - assert!(matches!( - validation_error, - QueryError::InvalidArgument(msg) if msg.contains("identity id must be 32 bytes long"))); - } - - #[test] - fn test_identity_not_found_when_querying_identity_nonce() { - let (platform, version) = super::setup_platform(); - - let request = GetIdentityNonceRequest { - version: Some(Version::V0(GetIdentityNonceRequestV0 { - identity_id: vec![0; 32], - prove: false, - })), - } - .encode_to_vec(); - - let validation_result = platform - .query(QUERY_PATH, &request, version) - .expect("expected query to succeed"); - - assert!(validation_result.first_error().is_none()); - - let response_data = validation_result.into_data().expect("expected data"); - - let GetIdentityNonceResponse { version } = - GetIdentityNonceResponse::decode(response_data.as_slice()) - .expect("expected to decode the response"); - - let v0 = match version.unwrap() { - get_identity_nonce_response::Version::V0(v0) => v0, - }; - - let nonce = match v0.result.unwrap() { - get_identity_nonce_response_v0::Result::IdentityNonce(nonce) => nonce, - get_identity_nonce_response_v0::Result::Proof(_) => { - panic!("expected non proved") - } - }; - - assert_eq!(nonce, 0); - } - - #[test] - fn test_identity_is_found_when_querying_identity_nonce() { - let (platform, version) = super::setup_platform(); - let mut rng = StdRng::seed_from_u64(10); - let id = rng.gen::<[u8; 32]>(); - let identity = - create_test_identity_with_rng(&platform.drive, id, &mut rng, None, version) - .expect("expected to create a test identity"); - - let request = GetIdentityNonceRequest { - version: Some(Version::V0(GetIdentityNonceRequestV0 { - identity_id: id.to_vec(), - prove: false, - })), - } - .encode_to_vec(); - - let validation_result = platform - .query(QUERY_PATH, &request, version) - .expect("expected query to succeed"); - - assert!(validation_result.first_error().is_none()); - - let response_data = validation_result.into_data().expect("expected data"); - - let GetIdentityNonceResponse { version } = - GetIdentityNonceResponse::decode(response_data.as_slice()) - .expect("expected to decode the response"); - - let v0 = match version.unwrap() { - get_identity_nonce_response::Version::V0(v0) => v0, - }; - - let nonce = match v0.result.unwrap() { - get_identity_nonce_response_v0::Result::IdentityNonce(nonce) => nonce, - get_identity_nonce_response_v0::Result::Proof(_) => { - panic!("expected non proved") - } - }; - - assert_eq!(nonce, 0); - } - - #[test] - fn test_identity_is_found_when_querying_identity_nonce_after_update() { - let (platform, version) = super::setup_platform(); - let mut rng = StdRng::seed_from_u64(10); - let id = rng.gen::<[u8; 32]>(); - let identity = - create_test_identity_with_rng(&platform.drive, id, &mut rng, None, version) - .expect("expected to create a test identity"); - - let cache = platform.drive.cache.read().unwrap(); - - let dashpay = &cache.system_data_contracts.dashpay; - - platform - .drive - .merge_identity_nonce( - identity.id().to_buffer(), - 1, - &BlockInfo::default(), - true, - None, - version, - ) - .expect("expected to set nonce"); - - platform - .drive - .merge_identity_nonce( - identity.id().to_buffer(), - 3, - &BlockInfo::default(), - true, - None, - version, - ) - .expect("expected to set nonce"); - - let request = GetIdentityNonceRequest { - version: Some(Version::V0(GetIdentityNonceRequestV0 { - identity_id: id.to_vec(), - prove: false, - })), - } - .encode_to_vec(); - - let validation_result = platform - .query(QUERY_PATH, &request, version) - .expect("expected query to succeed"); - - assert!(validation_result.first_error().is_none()); - - let response_data = validation_result.into_data().expect("expected data"); - - let GetIdentityNonceResponse { version } = - GetIdentityNonceResponse::decode(response_data.as_slice()) - .expect("expected to decode the response"); - - let v0 = match version.unwrap() { - get_identity_nonce_response::Version::V0(v0) => v0, - }; - - let nonce = match v0.result.unwrap() { - get_identity_nonce_response_v0::Result::IdentityNonce(nonce) => nonce, - get_identity_nonce_response_v0::Result::Proof(_) => { - panic!("expected non proved") - } - }; - - assert_eq!(nonce & IDENTITY_NONCE_VALUE_FILTER, 3); - assert_eq!(nonce >> IDENTITY_NONCE_VALUE_FILTER_MAX_BYTES, 1); - // the previous last one was not there - } - - #[test] - fn test_identity_is_found_when_querying_identity_nonce_after_update_for_past() { - let (platform, version) = super::setup_platform(); - let mut rng = StdRng::seed_from_u64(10); - let id = rng.gen::<[u8; 32]>(); - let identity = - create_test_identity_with_rng(&platform.drive, id, &mut rng, None, version) - .expect("expected to create a test identity"); - - platform - .drive - .merge_identity_nonce( - identity.id().to_buffer(), - 1, - &BlockInfo::default(), - true, - None, - version, - ) - .expect("expected to set nonce"); - - platform - .drive - .merge_identity_nonce( - identity.id().to_buffer(), - 3, - &BlockInfo::default(), - true, - None, - version, - ) - .expect("expected to set nonce"); - - // we already added 3, and now are adding 2 - platform - .drive - .merge_identity_nonce( - identity.id().to_buffer(), - 2, - &BlockInfo::default(), - true, - None, - version, - ) - .expect("expected to set nonce"); - - let request = GetIdentityNonceRequest { - version: Some(Version::V0(GetIdentityNonceRequestV0 { - identity_id: id.to_vec(), - prove: false, - })), - } - .encode_to_vec(); - - let validation_result = platform - .query(QUERY_PATH, &request, version) - .expect("expected query to succeed"); - - assert!(validation_result.first_error().is_none()); - - let response_data = validation_result.into_data().expect("expected data"); - - let GetIdentityNonceResponse { version } = - GetIdentityNonceResponse::decode(response_data.as_slice()) - .expect("expected to decode the response"); - - let v0 = match version.unwrap() { - get_identity_nonce_response::Version::V0(v0) => v0, - }; - - let nonce = match v0.result.unwrap() { - get_identity_nonce_response_v0::Result::IdentityNonce(nonce) => nonce, - get_identity_nonce_response_v0::Result::Proof(_) => { - panic!("expected non proved") - } - }; - - assert_eq!(nonce, 3); - } - - #[test] - fn test_identity_contract_nonce_absence_proof() { - let (platform, version) = super::setup_platform(); - - let id = vec![0; 32]; - - let request = GetIdentityNonceRequest { - version: Some(Version::V0(GetIdentityNonceRequestV0 { - identity_id: vec![0; 32], - prove: true, - })), - } - .encode_to_vec(); - - let result = platform.query(QUERY_PATH, &request, version); - let validation_result = result.unwrap(); - let response = - GetIdentityNonceResponse::decode(validation_result.data.unwrap().as_slice()) - .unwrap(); - - assert!(matches!( - extract_single_variant_or_panic!( - response.version.expect("expected a versioned response"), - get_identity_nonce_response::Version::V0(inner), - inner - ) - .result - .unwrap(), - get_identity_nonce_response::get_identity_nonce_response_v0::Result::Proof(_) - )); - } - } - - mod identity_contract_nonce { - use crate::error::query::QueryError; - use std::collections::BTreeMap; - - use dapi_grpc::platform::v0::get_identity_contract_nonce_request::{ - GetIdentityContractNonceRequestV0, Version, - }; - use dapi_grpc::platform::v0::get_identity_contract_nonce_response::get_identity_contract_nonce_response_v0; - use dapi_grpc::platform::v0::{ - get_identity_contract_nonce_response, GetIdentityContractNonceRequest, - GetIdentityContractNonceResponse, - }; - use dapi_grpc::Message; - use dpp::block::block_info::BlockInfo; - use dpp::data_contract::accessors::v0::DataContractV0Getters; - use dpp::data_contract::document_type::random_document::CreateRandomDocument; - use dpp::identifier::Identifier; - use dpp::identity::accessors::IdentityGettersV0; - use dpp::identity::identity_nonce::{ - IDENTITY_NONCE_VALUE_FILTER, IDENTITY_NONCE_VALUE_FILTER_MAX_BYTES, - }; - use dpp::identity::{Identity, IdentityV0}; - use dpp::prelude::IdentityNonce; - use drive::common::identities::{ - create_test_identities_with_rng, create_test_identity_with_rng, - }; - use drive::drive::object_size_info::DocumentInfo::DocumentRefInfo; - use drive::drive::object_size_info::{DocumentAndContractInfo, OwnedDocumentInfo}; - use rand::prelude::StdRng; - use rand::{Rng, SeedableRng}; - - const QUERY_PATH: &str = "/identity/contractNonce"; - - #[test] - fn test_invalid_identity_id() { - let (platform, version) = super::setup_platform(); - - let request = GetIdentityContractNonceRequest { - version: Some(Version::V0(GetIdentityContractNonceRequestV0 { - identity_id: vec![0; 8], - prove: false, - contract_id: vec![1; 32], - })), - } - .encode_to_vec(); - - let result = platform.query(QUERY_PATH, &request, version); - assert!(result.is_ok()); - let validation_error = result.as_ref().unwrap().first_error().unwrap(); - - assert!(matches!( - validation_error, - QueryError::InvalidArgument(msg) if msg.contains("identity id must be 32 bytes long"))); - } - - #[test] - fn test_invalid_contract_id() { - let (platform, version) = super::setup_platform(); - - let request = GetIdentityContractNonceRequest { - version: Some(Version::V0(GetIdentityContractNonceRequestV0 { - identity_id: vec![0; 32], - prove: false, - contract_id: vec![1; 8], - })), - } - .encode_to_vec(); - - let result = platform.query(QUERY_PATH, &request, version); - assert!(result.is_ok()); - let validation_error = result.as_ref().unwrap().first_error().unwrap(); - - assert!(matches!( - validation_error, - QueryError::InvalidArgument(msg) if msg.contains("contract id must be 32 bytes long"))); - } - - #[test] - fn test_identity_not_found_when_querying_identity_nonce() { - let (platform, version) = super::setup_platform(); - - let request = GetIdentityContractNonceRequest { - version: Some(Version::V0(GetIdentityContractNonceRequestV0 { - identity_id: vec![0; 32], - prove: false, - contract_id: vec![0; 32], - })), - } - .encode_to_vec(); - - let validation_result = platform - .query(QUERY_PATH, &request, version) - .expect("expected query to succeed"); - - assert!(validation_result.first_error().is_none()); - - let response_data = validation_result.into_data().expect("expected data"); - - let GetIdentityContractNonceResponse { version } = - GetIdentityContractNonceResponse::decode(response_data.as_slice()) - .expect("expected to decode the response"); - - let v0 = match version.unwrap() { - get_identity_contract_nonce_response::Version::V0(v0) => v0, - }; - - let nonce = match v0.result.unwrap() { - get_identity_contract_nonce_response_v0::Result::IdentityContractNonce(nonce) => { - nonce - } - get_identity_contract_nonce_response_v0::Result::Proof(_) => { - panic!("expected non proved") - } - }; - - assert_eq!(nonce, 0); - } - - #[test] - fn test_contract_info_not_found_when_querying_identity_nonce_with_known_identity() { - let (platform, version) = super::setup_platform(); - let mut rng = StdRng::seed_from_u64(45); - let id = rng.gen::<[u8; 32]>(); - let identity = - create_test_identity_with_rng(&platform.drive, id, &mut rng, None, version) - .expect("expected to create a test identity"); - - let request = GetIdentityContractNonceRequest { - version: Some(Version::V0(GetIdentityContractNonceRequestV0 { - identity_id: id.to_vec(), - prove: false, - contract_id: vec![0; 32], - })), - } - .encode_to_vec(); - - let validation_result = platform - .query(QUERY_PATH, &request, version) - .expect("expected query to succeed"); - - assert!(validation_result.first_error().is_none()); - - let response_data = validation_result.into_data().expect("expected data"); - - let GetIdentityContractNonceResponse { version } = - GetIdentityContractNonceResponse::decode(response_data.as_slice()) - .expect("expected to decode the response"); - - let v0 = match version.unwrap() { - get_identity_contract_nonce_response::Version::V0(v0) => v0, - }; - - let nonce = match v0.result.unwrap() { - get_identity_contract_nonce_response_v0::Result::IdentityContractNonce(nonce) => { - nonce - } - get_identity_contract_nonce_response_v0::Result::Proof(_) => { - panic!("expected non proved") - } - }; - - assert_eq!(nonce, 0); - } - - #[test] - fn test_identity_is_found_when_querying_identity_nonce() { - let (platform, version) = super::setup_platform(); - let mut rng = StdRng::seed_from_u64(10); - let id = rng.gen::<[u8; 32]>(); - let identity = - create_test_identity_with_rng(&platform.drive, id, &mut rng, None, version) - .expect("expected to create a test identity"); - - let cache = platform.drive.cache.read().unwrap(); - - let dashpay = &cache.system_data_contracts.dashpay; - - platform - .drive - .merge_identity_contract_nonce( - identity.id().to_buffer(), - dashpay.id().to_buffer(), - 1, - &BlockInfo::default(), - true, - None, - &mut vec![], - version, - ) - .expect("expected to set nonce"); - - let request = GetIdentityContractNonceRequest { - version: Some(Version::V0(GetIdentityContractNonceRequestV0 { - identity_id: id.to_vec(), - prove: false, - contract_id: dashpay.id().to_vec(), - })), - } - .encode_to_vec(); - - let validation_result = platform - .query(QUERY_PATH, &request, version) - .expect("expected query to succeed"); - - assert!(validation_result.first_error().is_none()); - - let response_data = validation_result.into_data().expect("expected data"); - - let GetIdentityContractNonceResponse { version } = - GetIdentityContractNonceResponse::decode(response_data.as_slice()) - .expect("expected to decode the response"); - - let v0 = match version.unwrap() { - get_identity_contract_nonce_response::Version::V0(v0) => v0, - }; - - let nonce = match v0.result.unwrap() { - get_identity_contract_nonce_response_v0::Result::IdentityContractNonce(nonce) => { - nonce - } - get_identity_contract_nonce_response_v0::Result::Proof(_) => { - panic!("expected non proved") - } - }; - - assert_eq!(nonce, 1); - } - - #[test] - fn test_identity_is_found_when_querying_identity_nonce_after_update() { - let (platform, version) = super::setup_platform(); - let mut rng = StdRng::seed_from_u64(10); - let id = rng.gen::<[u8; 32]>(); - let identity = - create_test_identity_with_rng(&platform.drive, id, &mut rng, None, version) - .expect("expected to create a test identity"); - - let cache = platform.drive.cache.read().unwrap(); - - let dashpay = &cache.system_data_contracts.dashpay; - - platform - .drive - .merge_identity_contract_nonce( - identity.id().to_buffer(), - dashpay.id().to_buffer(), - 1, - &BlockInfo::default(), - true, - None, - &mut vec![], - version, - ) - .expect("expected to set nonce"); - - platform - .drive - .merge_identity_contract_nonce( - identity.id().to_buffer(), - dashpay.id().to_buffer(), - 3, - &BlockInfo::default(), - true, - None, - &mut vec![], - version, - ) - .expect("expected to set nonce"); - - let request = GetIdentityContractNonceRequest { - version: Some(Version::V0(GetIdentityContractNonceRequestV0 { - identity_id: id.to_vec(), - prove: false, - contract_id: dashpay.id().to_vec(), - })), - } - .encode_to_vec(); - - let validation_result = platform - .query(QUERY_PATH, &request, version) - .expect("expected query to succeed"); - - assert!(validation_result.first_error().is_none()); - - let response_data = validation_result.into_data().expect("expected data"); - - let GetIdentityContractNonceResponse { version } = - GetIdentityContractNonceResponse::decode(response_data.as_slice()) - .expect("expected to decode the response"); - - let v0 = match version.unwrap() { - get_identity_contract_nonce_response::Version::V0(v0) => v0, - }; - - let nonce = match v0.result.unwrap() { - get_identity_contract_nonce_response_v0::Result::IdentityContractNonce(nonce) => { - nonce - } - get_identity_contract_nonce_response_v0::Result::Proof(_) => { - panic!("expected non proved") - } - }; - - assert_eq!(nonce & IDENTITY_NONCE_VALUE_FILTER, 3); - assert_eq!(nonce >> IDENTITY_NONCE_VALUE_FILTER_MAX_BYTES, 1); - // the previous last one was not there - } - - #[test] - fn test_identity_is_found_when_querying_identity_nonce_after_update_for_past() { - let (platform, version) = super::setup_platform(); - let mut rng = StdRng::seed_from_u64(10); - let id = rng.gen::<[u8; 32]>(); - let identity = - create_test_identity_with_rng(&platform.drive, id, &mut rng, None, version) - .expect("expected to create a test identity"); - - let cache = platform.drive.cache.read().unwrap(); - - let dashpay = &cache.system_data_contracts.dashpay; - - platform - .drive - .merge_identity_contract_nonce( - identity.id().to_buffer(), - dashpay.id().to_buffer(), - 1, - &BlockInfo::default(), - true, - None, - &mut vec![], - version, - ) - .expect("expected to set nonce"); - - platform - .drive - .merge_identity_contract_nonce( - identity.id().to_buffer(), - dashpay.id().to_buffer(), - 3, - &BlockInfo::default(), - true, - None, - &mut vec![], - version, - ) - .expect("expected to set nonce"); - - // we already added 3, and now are adding 2 - platform - .drive - .merge_identity_contract_nonce( - identity.id().to_buffer(), - dashpay.id().to_buffer(), - 2, - &BlockInfo::default(), - true, - None, - &mut vec![], - version, - ) - .expect("expected to set nonce"); - - let request = GetIdentityContractNonceRequest { - version: Some(Version::V0(GetIdentityContractNonceRequestV0 { - identity_id: id.to_vec(), - prove: false, - contract_id: dashpay.id().to_vec(), - })), - } - .encode_to_vec(); - - let validation_result = platform - .query(QUERY_PATH, &request, version) - .expect("expected query to succeed"); - - assert!(validation_result.first_error().is_none()); - - let response_data = validation_result.into_data().expect("expected data"); - - let GetIdentityContractNonceResponse { version } = - GetIdentityContractNonceResponse::decode(response_data.as_slice()) - .expect("expected to decode the response"); - - let v0 = match version.unwrap() { - get_identity_contract_nonce_response::Version::V0(v0) => v0, - }; - - let nonce = match v0.result.unwrap() { - get_identity_contract_nonce_response_v0::Result::IdentityContractNonce(nonce) => { - nonce - } - get_identity_contract_nonce_response_v0::Result::Proof(_) => { - panic!("expected non proved") - } - }; - - assert_eq!(nonce, 3); - } - - #[test] - fn test_identity_contract_nonce_absence_proof() { - let (platform, version) = super::setup_platform(); - - let id = vec![0; 32]; - - let request = GetIdentityContractNonceRequest { - version: Some(Version::V0(GetIdentityContractNonceRequestV0 { - identity_id: vec![0; 32], - prove: true, - contract_id: vec![0; 32], - })), - } - .encode_to_vec(); - - let result = platform.query(QUERY_PATH, &request, version); - let validation_result = result.unwrap(); - let response = GetIdentityContractNonceResponse::decode( - validation_result.data.unwrap().as_slice(), - ) - .unwrap(); - - assert!(matches!( - extract_single_variant_or_panic!( - response.version.expect("expected a versioned response"), - get_identity_contract_nonce_response::Version::V0(inner), - inner - ) - .result - .unwrap(), - get_identity_contract_nonce_response::get_identity_contract_nonce_response_v0::Result::Proof(_) - )); - } - } - - mod identity_balance_and_revision { - use crate::error::query::QueryError; - use dapi_grpc::platform::v0::get_identity_balance_and_revision_request::{ - GetIdentityBalanceAndRevisionRequestV0, Version, - }; - use dapi_grpc::platform::v0::{ - get_identity_balance_and_revision_response, GetIdentityBalanceAndRevisionRequest, - GetIdentityBalanceAndRevisionResponse, - }; - use dapi_grpc::Message; - - const QUERY_PATH: &str = "/identity/balanceAndRevision"; - - #[test] - fn test_invalid_identity_id() { - let (platform, version) = super::setup_platform(); - - let request = GetIdentityBalanceAndRevisionRequest { - version: Some(Version::V0(GetIdentityBalanceAndRevisionRequestV0 { - id: vec![0; 8], - prove: false, - })), - } - .encode_to_vec(); - - let result = platform.query(QUERY_PATH, &request, version); - assert!(result.is_ok()); - super::assert_invalid_identifier(result.unwrap()); - } - - #[test] - fn test_identity_not_found_when_querying_balance_and_revision() { - let (platform, version) = super::setup_platform(); - - let id = vec![0; 32]; - - let request = GetIdentityBalanceAndRevisionRequest { - version: Some(Version::V0(GetIdentityBalanceAndRevisionRequestV0 { - id: id.clone(), - prove: false, - })), - } - .encode_to_vec(); - - let validation_result = platform - .query(QUERY_PATH, &request, version) - .expect("expected query to succeed"); - let validation_error = validation_result.first_error().unwrap(); - - assert_eq!( - validation_error.to_string(), - "not found error: No Identity balance found".to_string() - ); - - assert!(matches!(validation_error, QueryError::NotFound(_))); - } - - #[test] - fn test_identity_balance_and_revision_absence_proof() { - let (platform, version) = super::setup_platform(); - - let id = vec![0; 32]; - - let request = GetIdentityBalanceAndRevisionRequest { - version: Some(Version::V0(GetIdentityBalanceAndRevisionRequestV0 { - id: id.clone(), - prove: true, - })), - } - .encode_to_vec(); - - let result = platform.query(QUERY_PATH, &request, version); - assert!(result.is_ok()); - let validation_result = result.unwrap(); - let response = GetIdentityBalanceAndRevisionResponse::decode( - validation_result.data.unwrap().as_slice(), - ) - .unwrap(); - - assert!(matches!( - extract_single_variant_or_panic!(response.version.expect("expected a versioned response"), get_identity_balance_and_revision_response::Version::V0(inner), inner).result.unwrap(), - get_identity_balance_and_revision_response::get_identity_balance_and_revision_response_v0::Result::Proof(_) - )); - } - } - - mod identity_keys { - use crate::error::query::QueryError; - use dapi_grpc::platform::v0::get_identity_keys_request::{ - GetIdentityKeysRequestV0, Version, - }; - use dapi_grpc::platform::v0::{ - get_identity_keys_response, key_request_type::Request, AllKeys, GetIdentityKeysRequest, - GetIdentityKeysResponse, KeyRequestType, SearchKey, SecurityLevelMap, - }; - use dapi_grpc::Message; - use drive::error::query::QuerySyntaxError; - - const QUERY_PATH: &str = "/identity/keys"; - - #[test] - fn test_invalid_identity_id() { - let (platform, version) = super::setup_platform(); - - let request = GetIdentityKeysRequest { - version: Some(Version::V0(GetIdentityKeysRequestV0 { - identity_id: vec![0; 8], - request_type: None, - limit: None, - offset: None, - prove: false, - })), - } - .encode_to_vec(); - - let result = platform.query(QUERY_PATH, &request, version); - assert!(result.is_ok()); - super::assert_invalid_identifier(result.unwrap()); - } - - #[test] - fn test_invalid_limit_u16_overflow() { - let (platform, version) = super::setup_platform(); - - let request = GetIdentityKeysRequest { - version: Some(Version::V0(GetIdentityKeysRequestV0 { - identity_id: vec![0; 32], - request_type: None, - limit: Some(u32::MAX), - offset: None, - prove: false, - })), - } - .encode_to_vec(); - - let result = platform.query(QUERY_PATH, &request, version); - assert!(result.is_ok()); - let validation_result = result.unwrap(); - let validation_error = validation_result.first_error().unwrap(); - - assert!(matches!( - validation_error, - QueryError::Query(QuerySyntaxError::InvalidParameter(msg)) if msg == "limit out of bounds" - )); - } - - #[test] - fn test_invalid_limit_max() { - let (platform, version) = super::setup_platform(); - - let request = GetIdentityKeysRequest { - version: Some(Version::V0(GetIdentityKeysRequestV0 { - identity_id: vec![0; 32], - request_type: None, - limit: Some((platform.config.drive.max_query_limit + 1) as u32), - offset: None, - prove: false, - })), - } - .encode_to_vec(); - - let result = platform.query(QUERY_PATH, &request, version); - assert!(result.is_ok()); - let validation_result = result.unwrap(); - let validation_error = validation_result.first_error().unwrap(); - - let error_message = format!( - "limit greater than max limit {}", - platform.config.drive.max_query_limit - ); - - assert!(matches!( - validation_error, - QueryError::Query(QuerySyntaxError::InvalidLimit(msg)) if msg == &error_message - )); - } - - #[test] - fn test_invalid_offset_u16_overflow() { - let (platform, version) = super::setup_platform(); - - let request = GetIdentityKeysRequest { - version: Some(Version::V0(GetIdentityKeysRequestV0 { - identity_id: vec![0; 32], - request_type: None, - limit: None, - offset: Some(u32::MAX), - prove: false, - })), - } - .encode_to_vec(); - - let validation_result = platform - .query(QUERY_PATH, &request, version) - .expect("expected query to succeed"); - let validation_error = validation_result.first_error().unwrap(); - - assert!(matches!( - validation_error, - QueryError::Query(QuerySyntaxError::InvalidParameter(msg)) if msg == "offset out of bounds" - )); - } - - #[test] - fn test_missing_request_type() { - let (platform, version) = super::setup_platform(); - - let request = GetIdentityKeysRequest { - version: Some(Version::V0(GetIdentityKeysRequestV0 { - identity_id: vec![0; 32], - request_type: None, - limit: None, - offset: None, - prove: false, - })), - } - .encode_to_vec(); - - let result = platform.query(QUERY_PATH, &request, version); - assert!(result.is_ok()); - let validation_result = result.unwrap(); - let validation_error = validation_result.first_error().unwrap(); - - assert!(matches!( - validation_error, - QueryError::Query(QuerySyntaxError::InvalidParameter(msg)) if msg == "key request must be defined" - )); - } - - #[test] - fn test_missing_request() { - let (platform, version) = super::setup_platform(); - - let request = GetIdentityKeysRequest { - version: Some(Version::V0(GetIdentityKeysRequestV0 { - identity_id: vec![0; 32], - request_type: Some(KeyRequestType { request: None }), - limit: None, - offset: None, - prove: false, - })), - } - .encode_to_vec(); - - let result = platform.query(QUERY_PATH, &request, version); - assert!(result.is_ok()); - let validation_result = result.unwrap(); - let validation_error = validation_result.first_error().unwrap(); - - assert!(matches!( - validation_error, - QueryError::Query(QuerySyntaxError::InvalidParameter(msg)) if msg == "key request must be defined" - )); - } - - #[test] - fn test_invalid_key_request_type() { - let (platform, version) = super::setup_platform(); - - let request = GetIdentityKeysRequest { - version: Some(Version::V0(GetIdentityKeysRequestV0 { - identity_id: vec![0; 32], - request_type: Some(KeyRequestType { - request: Some(Request::SearchKey(SearchKey { - purpose_map: [( - 0, - SecurityLevelMap { - security_level_map: [(u32::MAX, 0)].into_iter().collect(), - }, - )] - .into_iter() - .collect(), - })), - }), - limit: None, - offset: None, - prove: false, - })), - } - .encode_to_vec(); - - let result = platform.query(QUERY_PATH, &request, version); - assert!(result.is_ok()); - let validation_result = result.unwrap(); - let validation_error = validation_result.first_error().unwrap(); - - assert!(matches!( - validation_error, - QueryError::Query(QuerySyntaxError::InvalidKeyParameter(msg)) if msg == "security level out of bounds" - )); - } - - #[test] - fn test_absent_keys() { - let (platform, version) = super::setup_platform(); - - let request = GetIdentityKeysRequest { - version: Some(Version::V0(GetIdentityKeysRequestV0 { - identity_id: vec![0; 32], - request_type: Some(KeyRequestType { - request: Some(Request::AllKeys(AllKeys {})), - }), - limit: None, - offset: None, - prove: false, - })), - } - .encode_to_vec(); - - let result = platform.query(QUERY_PATH, &request, version); - assert!(result.is_ok()); - - let validation_result = result.unwrap(); - let data = validation_result.data.unwrap(); - - let response = GetIdentityKeysResponse::decode(data.as_slice()).unwrap(); - let get_identity_keys_response::get_identity_keys_response_v0::Result::Keys(keys) = - extract_single_variant_or_panic!( - response.version.expect("expected a versioned response"), - get_identity_keys_response::Version::V0(inner), - inner - ) - .result - .unwrap() - else { - panic!("invalid response") - }; - - assert_eq!(keys.keys_bytes.len(), 0); - } - - #[test] - fn test_absent_keys_proof() { - let (platform, version) = super::setup_platform(); - - let request = GetIdentityKeysRequest { - version: Some(Version::V0(GetIdentityKeysRequestV0 { - identity_id: vec![0; 32], - request_type: Some(KeyRequestType { - request: Some(Request::AllKeys(AllKeys {})), - }), - limit: None, - offset: None, - prove: true, - })), - } - .encode_to_vec(); - - let validation_result = platform - .query(QUERY_PATH, &request, version) - .expect("expected query to succeed"); - let response = - GetIdentityKeysResponse::decode(validation_result.data.unwrap().as_slice()) - .unwrap(); - - assert!(matches!( - extract_single_variant_or_panic!( - response.version.expect("expected a versioned response"), - get_identity_keys_response::Version::V0(inner), - inner - ) - .result - .unwrap(), - get_identity_keys_response::get_identity_keys_response_v0::Result::Proof(_) - )); - } - } - - mod data_contract { - use crate::error::query::QueryError; - use bs58::encode; - use dapi_grpc::platform::v0::get_data_contract_request::{ - GetDataContractRequestV0, Version, - }; - use dapi_grpc::platform::v0::{ - get_data_contract_response, GetDataContractRequest, GetDataContractResponse, - }; - use dapi_grpc::Message; - - const QUERY_PATH: &str = "/dataContract"; - - #[test] - fn test_invalid_data_contract_id() { - let (platform, version) = super::setup_platform(); - - let request = GetDataContractRequest { - version: Some(Version::V0(GetDataContractRequestV0 { - id: vec![0; 8], - prove: false, - })), - } - .encode_to_vec(); - - let result = platform.query(QUERY_PATH, &request, version); - assert!(result.is_ok()); - super::assert_invalid_identifier(result.unwrap()); - } - - #[test] - fn test_data_contract_not_found() { - let (platform, version) = super::setup_platform(); - - let id = vec![0; 32]; - let request = GetDataContractRequest { - version: Some(Version::V0(GetDataContractRequestV0 { - id: id.clone(), - prove: false, - })), - } - .encode_to_vec(); - - let result = platform.query(QUERY_PATH, &request, version); - assert!(result.is_ok()); - let validation_result = result.unwrap(); - let validation_error = validation_result.first_error().unwrap(); - - let error_message = format!("data contract {} not found", encode(id).into_string()); - - assert!(matches!( - validation_error, - QueryError::NotFound(msg) if msg.contains(&error_message) - )); - } - - #[test] - fn test_data_contract_absence_proof() { - let (platform, version) = super::setup_platform(); - - let id = vec![0; 32]; - let request = GetDataContractRequest { - version: Some(Version::V0(GetDataContractRequestV0 { - id: id.clone(), - prove: true, - })), - } - .encode_to_vec(); - - let validation_result = platform - .query(QUERY_PATH, &request, version) - .expect("expected query to succeed"); - let response = - GetDataContractResponse::decode(validation_result.data.unwrap().as_slice()) - .unwrap(); - - assert!(matches!( - extract_single_variant_or_panic!( - response.version.expect("expected a versioned response"), - get_data_contract_response::Version::V0(inner), - inner - ) - .result - .unwrap(), - get_data_contract_response::get_data_contract_response_v0::Result::Proof(_) - )); - } - } - - mod data_contracts { - use dapi_grpc::platform::v0::get_data_contracts_request::{ - GetDataContractsRequestV0, Version, - }; - use dapi_grpc::platform::v0::{ - get_data_contracts_response, GetDataContractsRequest, GetDataContractsResponse, - }; - use dapi_grpc::Message; - - const QUERY_PATH: &str = "/dataContracts"; - - #[test] - fn test_invalid_data_contract_id() { - let (platform, version) = super::setup_platform(); - - let request = GetDataContractsRequest { - version: Some(Version::V0(GetDataContractsRequestV0 { - ids: vec![vec![0; 8]], - prove: false, - })), - } - .encode_to_vec(); - - let result = platform.query(QUERY_PATH, &request, version); - assert!(result.is_ok()); - super::assert_invalid_identifier(result.unwrap()); - } - - #[test] - fn test_data_contracts_not_found() { - let (platform, version) = super::setup_platform(); - - let id = vec![0; 32]; - let request = GetDataContractsRequest { - version: Some(Version::V0(GetDataContractsRequestV0 { - ids: vec![id.clone()], - prove: false, - })), - } - .encode_to_vec(); - - let result = platform.query(QUERY_PATH, &request, version); - assert!(result.is_ok()); - - let validation_result = result.unwrap(); - let data = validation_result.data.unwrap(); - let response = GetDataContractsResponse::decode(data.as_slice()).unwrap(); - - let get_data_contracts_response::get_data_contracts_response_v0::Result::DataContracts( - contracts, - ) = extract_single_variant_or_panic!( - response.version.expect("expected a versioned response"), - get_data_contracts_response::Version::V0(inner), - inner - ) - .result - .expect("expected a response") - else { - panic!("invalid response") - }; - - assert!(contracts.data_contract_entries[0].data_contract.is_none()); - } - - #[test] - fn test_data_contracts_absence_proof() { - let (platform, version) = super::setup_platform(); - - let id = vec![0; 32]; - let request = GetDataContractsRequest { - version: Some(Version::V0(GetDataContractsRequestV0 { - ids: vec![id.clone()], - prove: true, - })), - } - .encode_to_vec(); - - let validation_result = platform - .query(QUERY_PATH, &request, version) - .expect("expected query to succeed"); - let response = - GetDataContractsResponse::decode(validation_result.data.unwrap().as_slice()) - .unwrap(); - - assert!(matches!( - extract_single_variant_or_panic!( - response.version.expect("expected a versioned response"), - get_data_contracts_response::Version::V0(inner), - inner - ) - .result - .unwrap(), - get_data_contracts_response::get_data_contracts_response_v0::Result::Proof(_) - )); - } - } - - mod data_contract_history { - use crate::error::query::QueryError; - use bs58::encode; - use dapi_grpc::platform::v0::get_data_contract_history_request::{ - GetDataContractHistoryRequestV0, Version, - }; - use dapi_grpc::platform::v0::{ - get_data_contract_history_response, GetDataContractHistoryRequest, - GetDataContractHistoryResponse, - }; - use dapi_grpc::Message; - - const QUERY_PATH: &str = "/dataContractHistory"; - - #[test] - fn test_invalid_data_contract_id() { - let (platform, version) = super::setup_platform(); - - let request = GetDataContractHistoryRequest { - version: Some(Version::V0(GetDataContractHistoryRequestV0 { - id: vec![0; 8], - limit: None, - offset: None, - start_at_ms: 0, - prove: false, - })), - } - .encode_to_vec(); - - let result = platform.query(QUERY_PATH, &request, version); - assert!(result.is_ok()); - super::assert_invalid_identifier(result.unwrap()); - } - - #[test] - fn test_invalid_limit_overflow() { - let (platform, version) = super::setup_platform(); - - let request = GetDataContractHistoryRequest { - version: Some(Version::V0(GetDataContractHistoryRequestV0 { - id: vec![0; 32], - limit: Some(u32::MAX), - offset: None, - start_at_ms: 0, - prove: false, - })), - } - .encode_to_vec(); - - let validation_result = platform - .query(QUERY_PATH, &request, version) - .expect("expected query to succeed"); - let validation_error = validation_result.first_error().unwrap(); - - assert!(matches!(validation_error, QueryError::InvalidArgument(_))); - assert_eq!( - validation_error.to_string().as_str(), - "invalid argument error: limit out of bounds" - ) - } - - #[test] - fn test_invalid_offset_overflow() { - let (platform, version) = super::setup_platform(); - - let request = GetDataContractHistoryRequest { - version: Some(Version::V0(GetDataContractHistoryRequestV0 { - id: vec![0; 32], - limit: None, - offset: Some(u32::MAX), - start_at_ms: 0, - prove: false, - })), - } - .encode_to_vec(); - - let validation_result = platform - .query(QUERY_PATH, &request, version) - .expect("expected query to succeed"); - let validation_error = validation_result.first_error().unwrap(); - - assert!(matches!(validation_error, QueryError::InvalidArgument(_))); - assert_eq!( - validation_error.to_string().as_str(), - "invalid argument error: offset out of bounds" - ); - } - - #[test] - fn test_data_contract_not_found() { - let (platform, version) = super::setup_platform(); - - let id = vec![0; 32]; - - let request = GetDataContractHistoryRequest { - version: Some(Version::V0(GetDataContractHistoryRequestV0 { - id: vec![0; 32], - limit: None, - offset: None, - start_at_ms: 0, - prove: false, - })), - } - .encode_to_vec(); - - let result = platform.query(QUERY_PATH, &request, version); - assert!(result.is_ok()); - let validation_result = result.unwrap(); - let validation_error = validation_result.first_error().unwrap(); - - let error_message = format!( - "data contract {} history not found", - encode(id).into_string() - ); - - assert!(matches!( - validation_error, - QueryError::NotFound(msg) if msg.contains(&error_message) - )); - } - - #[test] - fn test_data_contract_history_absence_proof() { - let (platform, version) = super::setup_platform(); - - let request = GetDataContractHistoryRequest { - version: Some(Version::V0(GetDataContractHistoryRequestV0 { - id: vec![0; 32], - limit: None, - offset: None, - start_at_ms: 0, - prove: true, - })), - } - .encode_to_vec(); - - let validation_result = platform - .query(QUERY_PATH, &request, version) - .expect("expected query to succeed"); - let response = - GetDataContractHistoryResponse::decode(validation_result.data.unwrap().as_slice()) - .unwrap(); - - assert!(matches!( - extract_single_variant_or_panic!(response.version.expect("expected a versioned response"), get_data_contract_history_response::Version::V0(inner), inner).result.unwrap(), - get_data_contract_history_response::get_data_contract_history_response_v0::Result::Proof(_) - )); - } - } - - mod documents { - use crate::error::query::QueryError; - use crate::query::tests::store_data_contract; - use dapi_grpc::platform::v0::{ - get_documents_response, GetDocumentsRequest, GetDocumentsResponse, - }; - - use dapi_grpc::platform::v0::get_documents_request::get_documents_request_v0::Start; - use dapi_grpc::platform::v0::get_documents_request::{GetDocumentsRequestV0, Version}; - use dapi_grpc::Message; - use dpp::data_contract::accessors::v0::DataContractV0Getters; - use dpp::platform_value::string_encoding::Encoding; - use dpp::tests::fixtures::get_data_contract_fixture; - use drive::error::query::QuerySyntaxError; - - const QUERY_PATH: &str = "/documents"; - - #[test] - fn test_invalid_document_id() { - let (platform, version) = super::setup_platform(); - - let request = GetDocumentsRequest { - version: Some(Version::V0(GetDocumentsRequestV0 { - data_contract_id: vec![0; 8], - document_type: "niceDocument".to_string(), - r#where: vec![], - limit: 0, - order_by: vec![], - prove: false, - start: None, - })), - } - .encode_to_vec(); - - let result = platform.query(QUERY_PATH, &request, version); - assert!(result.is_ok()); - super::assert_invalid_identifier(result.unwrap()); - } - - #[test] - fn test_data_contract_not_found_in_documents_request() { - let (platform, version) = super::setup_platform(); - - let data_contract_id = vec![0; 32]; - - let request = GetDocumentsRequest { - version: Some(Version::V0(GetDocumentsRequestV0 { - data_contract_id: data_contract_id.clone(), - document_type: "niceDocument".to_string(), - r#where: vec![], - limit: 0, - order_by: vec![], - prove: false, - start: None, - })), - } - .encode_to_vec(); - - let validation_result = platform - .query(QUERY_PATH, &request, version) - .expect("expected query to succeed"); - let validation_error = validation_result.first_error().expect("expected an error"); - assert_eq!(validation_error.to_string().as_str(), "query syntax error: contract not found error: contract not found when querying from value with contract info"); - assert!(matches!( - validation_error, - QueryError::Query(QuerySyntaxError::DataContractNotFound(_)) - )); - } - - #[test] - fn test_absent_document_type() { - let (platform, version) = super::setup_platform(); - - let created_data_contract = - get_data_contract_fixture(None, 0, version.protocol_version); - store_data_contract(&platform, created_data_contract.data_contract(), version); - - let data_contract_id = created_data_contract.data_contract().id(); - let document_type = "fakeDocument"; - - let request = GetDocumentsRequest { - version: Some(Version::V0(GetDocumentsRequestV0 { - data_contract_id: data_contract_id.to_vec(), - document_type: document_type.to_string(), - r#where: vec![], - limit: 0, - order_by: vec![], - prove: false, - start: None, - })), - } - .encode_to_vec(); - - let result = platform.query(QUERY_PATH, &request, version); - let validation_result = result.unwrap(); - - let message = format!( - "document type {} not found for contract {}", - document_type, - data_contract_id.to_string(Encoding::Base58) - ); - assert!(matches!( - validation_result.first_error().unwrap(), - QueryError::InvalidArgument(msg) if msg.contains(message.as_str()) - )) - } - - #[test] - fn test_invalid_where_clause() { - let (platform, version) = super::setup_platform(); - - let created_data_contract = - get_data_contract_fixture(None, 0, version.protocol_version); - store_data_contract(&platform, created_data_contract.data_contract(), version); - - let data_contract_id = created_data_contract.data_contract().id(); - let document_type = "niceDocument"; - - let request = GetDocumentsRequest { - version: Some(Version::V0(GetDocumentsRequestV0 { - data_contract_id: data_contract_id.to_vec(), - document_type: document_type.to_string(), - r#where: vec![0x9F], // Incomplete CBOR array - limit: 0, - order_by: vec![], - prove: false, - start: None, - })), - } - .encode_to_vec(); - - let result = platform.query(QUERY_PATH, &request, version); - let validation_result = result.unwrap(); - - assert!(matches!( - validation_result.first_error().unwrap(), - QueryError::Query(QuerySyntaxError::DeserializationError(msg)) if msg == &"unable to decode 'where' query from cbor".to_string() - )) - } - - #[test] - fn test_invalid_order_by_clause() { - let (platform, version) = super::setup_platform(); - - let created_data_contract = - get_data_contract_fixture(None, 0, version.protocol_version); - store_data_contract(&platform, created_data_contract.data_contract(), version); - - let data_contract_id = created_data_contract.data_contract().id(); - let document_type = "niceDocument"; - - let request = GetDocumentsRequest { - version: Some(Version::V0(GetDocumentsRequestV0 { - data_contract_id: data_contract_id.to_vec(), - document_type: document_type.to_string(), - r#where: vec![], - limit: 0, - order_by: vec![0x9F], // Incomplete CBOR array - prove: false, - start: None, - })), - } - .encode_to_vec(); - - let result = platform.query(QUERY_PATH, &request, version); - let validation_result = result.unwrap(); - - assert!(matches!( - validation_result.first_error().unwrap(), - QueryError::Query(QuerySyntaxError::DeserializationError(msg)) if msg == &"unable to decode 'order_by' query from cbor".to_string() - )) - } - - #[test] - fn test_invalid_start_at_clause() { - let (platform, version) = super::setup_platform(); - - let created_data_contract = - get_data_contract_fixture(None, 0, version.protocol_version); - store_data_contract(&platform, created_data_contract.data_contract(), version); - - let data_contract_id = created_data_contract.data_contract().id(); - let document_type = "niceDocument"; - - let request = GetDocumentsRequest { - version: Some(Version::V0(GetDocumentsRequestV0 { - data_contract_id: data_contract_id.to_vec(), - document_type: document_type.to_string(), - r#where: vec![], - limit: 0, - order_by: vec![], - prove: false, - start: Some(Start::StartAt(vec![0; 8])), - })), - } - .encode_to_vec(); - - let result = platform.query(QUERY_PATH, &request, version); - let validation_result = result.unwrap(); - - assert!(matches!( - validation_result.first_error().unwrap(), - QueryError::Query(QuerySyntaxError::InvalidStartsWithClause(msg)) if msg == &"start at should be a 32 byte identifier".to_string() - )) - } - - #[test] - fn test_invalid_start_after_clause() { - let (platform, version) = super::setup_platform(); - - let created_data_contract = - get_data_contract_fixture(None, 0, version.protocol_version); - store_data_contract(&platform, created_data_contract.data_contract(), version); - - let data_contract_id = created_data_contract.data_contract().id(); - let document_type = "niceDocument"; - - let request = GetDocumentsRequest { - version: Some(Version::V0(GetDocumentsRequestV0 { - data_contract_id: data_contract_id.to_vec(), - document_type: document_type.to_string(), - r#where: vec![], - limit: 0, - order_by: vec![], - prove: false, - start: Some(Start::StartAfter(vec![0; 8])), - })), - } - .encode_to_vec(); - - let result = platform.query(QUERY_PATH, &request, version); - let validation_result = result.unwrap(); - - assert!(matches!( - validation_result.first_error().unwrap(), - QueryError::Query(QuerySyntaxError::InvalidStartsWithClause(msg)) if msg == &"start after should be a 32 byte identifier".to_string() - )) - } - - #[test] - fn test_invalid_limit() { - let (platform, version) = super::setup_platform(); - - let created_data_contract = - get_data_contract_fixture(None, 0, version.protocol_version); - store_data_contract(&platform, created_data_contract.data_contract(), version); - - let data_contract_id = created_data_contract.data_contract().id(); - let document_type = "niceDocument"; - let limit = u32::MAX; - - let request = GetDocumentsRequest { - version: Some(Version::V0(GetDocumentsRequestV0 { - data_contract_id: data_contract_id.to_vec(), - document_type: document_type.to_string(), - r#where: vec![], - limit, - order_by: vec![], - prove: false, - start: None, - })), - } - .encode_to_vec(); - - let result = platform.query(QUERY_PATH, &request, version); - let validation_result = result.unwrap(); - - assert!(matches!( - validation_result.first_error().unwrap(), - QueryError::Query(QuerySyntaxError::InvalidLimit(msg)) if msg == &format!("limit {} out of bounds", limit).to_string() - )) - } - - #[test] - fn test_documents_not_found() { - let (platform, version) = super::setup_platform(); - - let created_data_contract = - get_data_contract_fixture(None, 0, version.protocol_version); - store_data_contract(&platform, created_data_contract.data_contract(), version); - - let data_contract_id = created_data_contract.data_contract().id(); - let document_type = "niceDocument"; - - let request = GetDocumentsRequest { - version: Some(Version::V0(GetDocumentsRequestV0 { - data_contract_id: data_contract_id.to_vec(), - document_type: document_type.to_string(), - r#where: vec![], - limit: 0, - order_by: vec![], - prove: false, - start: None, - })), - } - .encode_to_vec(); - - let result = platform.query(QUERY_PATH, &request, version); - assert!(result.is_ok()); - let validation_result = result.unwrap(); - assert!(validation_result.is_valid()); - let response = GetDocumentsResponse::decode( - validation_result.data.expect("data must exist").as_slice(), - ) - .expect("response decoded"); - - let Some(result) = extract_single_variant_or_panic!( - response.version.expect("expected a versioned response"), - get_documents_response::Version::V0(inner), - inner - ) - .result - else { - panic!("invalid response") - }; - - let get_documents_response::get_documents_response_v0::Result::Documents(documents) = - result - else { - panic!("invalid response") - }; - - assert_eq!(documents.documents.len(), 0); - } - - #[test] - fn test_documents_absence_proof() { - let (platform, version) = super::setup_platform(); - - let created_data_contract = - get_data_contract_fixture(None, 0, version.protocol_version); - store_data_contract(&platform, created_data_contract.data_contract(), version); - - let data_contract_id = created_data_contract.data_contract().id(); - let document_type = "niceDocument"; - - let request = GetDocumentsRequest { - version: Some(Version::V0(GetDocumentsRequestV0 { - data_contract_id: data_contract_id.to_vec(), - document_type: document_type.to_string(), - r#where: vec![], - limit: 0, - order_by: vec![], - prove: true, - start: None, - })), - } - .encode_to_vec(); - - let result = platform.query(QUERY_PATH, &request, version); - assert!(result.is_ok()); - let validation_result = result.unwrap(); - assert!(validation_result.is_valid()); - let response = GetDocumentsResponse::decode( - validation_result.data.expect("data must exist").as_slice(), - ) - .expect("response decoded"); - - assert!(matches!( - extract_single_variant_or_panic!( - response.version.expect("expected a versioned response"), - get_documents_response::Version::V0(inner), - inner - ) - .result - .unwrap(), - get_documents_response::get_documents_response_v0::Result::Proof(_) - )); - } - } - - mod identity_by_public_key_hash { - use crate::query::QueryError; - use dapi_grpc::platform::v0::get_identity_by_public_key_hash_request::{ - GetIdentityByPublicKeyHashRequestV0, Version, - }; - use dapi_grpc::platform::v0::{ - get_identity_by_public_key_hash_response, GetIdentityByPublicKeyHashRequest, - GetIdentityByPublicKeyHashResponse, - }; - use dapi_grpc::Message; - - const PATH: &str = "/identity/by-public-key-hash"; - - #[test] - fn test_invalid_public_key_hash() { - let (platform, version) = super::setup_platform(); - - let request = GetIdentityByPublicKeyHashRequest { - version: Some(Version::V0(GetIdentityByPublicKeyHashRequestV0 { - public_key_hash: vec![0; 8], - prove: false, - })), - } - .encode_to_vec(); - - let result = platform.query(PATH, &request, version); - assert!(result.is_ok()); - - let validation_result = result.unwrap(); - - assert!(matches!( - validation_result.first_error().unwrap(), - QueryError::InvalidArgument(msg) if msg == &"public key hash must be 20 bytes long".to_string() - )); - } - - #[test] - fn test_identity_not_found() { - let (platform, version) = super::setup_platform(); - - let public_key_hash = vec![0; 20]; - let request = GetIdentityByPublicKeyHashRequest { - version: Some(Version::V0(GetIdentityByPublicKeyHashRequestV0 { - public_key_hash: public_key_hash.clone(), - prove: false, - })), - } - .encode_to_vec(); - - let validation_result = platform - .query(PATH, &request, version) - .expect("expected query to succeed"); - - assert!(matches!( - validation_result.first_error().unwrap(), - QueryError::NotFound(msg) if msg == &format!("identity for public key hash {} not found", hex::encode(public_key_hash.as_slice())).to_string() - )) - } - - #[test] - fn test_identity_absence_proof() { - let (platform, version) = super::setup_platform(); - - let public_key_hash = vec![0; 20]; - let request = GetIdentityByPublicKeyHashRequest { - version: Some(Version::V0(GetIdentityByPublicKeyHashRequestV0 { - public_key_hash: public_key_hash.clone(), - prove: true, - })), - } - .encode_to_vec(); - - let validation_result = platform - .query(PATH, &request, version) - .expect("expected query to succeed"); - - let response = GetIdentityByPublicKeyHashResponse::decode( - validation_result.data.unwrap().as_slice(), - ) - .expect("response decoded"); - - assert!(matches!( - extract_single_variant_or_panic!(response.version.expect("expected a versioned response"), get_identity_by_public_key_hash_response::Version::V0(inner), inner).result.unwrap(), - get_identity_by_public_key_hash_response::get_identity_by_public_key_hash_response_v0::Result::Proof(_) - )); - } - } - - mod identities_by_public_key_hash { - use crate::query::QueryError; - use dapi_grpc::platform::v0::get_identities_by_public_key_hashes_request::{ - GetIdentitiesByPublicKeyHashesRequestV0, Version, - }; - use dapi_grpc::platform::v0::{ - get_identities_by_public_key_hashes_response, GetIdentitiesByPublicKeyHashesRequest, - GetIdentitiesByPublicKeyHashesResponse, - }; - use dapi_grpc::Message; - - const PATH: &str = "/identities/by-public-key-hash"; - - #[test] - fn test_invalid_public_key_hash() { - let (platform, version) = super::setup_platform(); - - let request = GetIdentitiesByPublicKeyHashesRequest { - version: Some(Version::V0(GetIdentitiesByPublicKeyHashesRequestV0 { - public_key_hashes: vec![vec![0; 8]], - prove: false, - })), - } - .encode_to_vec(); - - let result = platform.query(PATH, &request, version); - assert!(result.is_ok()); - - let validation_result = result.unwrap(); - - assert!(matches!( - validation_result.first_error().unwrap(), - QueryError::InvalidArgument(msg) if msg == &"public key hash must be 20 bytes long".to_string() - )); - } - - #[test] - fn test_identities_not_found() { - let (platform, version) = super::setup_platform(); - - let request = GetIdentitiesByPublicKeyHashesRequest { - version: Some(Version::V0(GetIdentitiesByPublicKeyHashesRequestV0 { - public_key_hashes: vec![vec![0; 20]], - prove: false, - })), - } - .encode_to_vec(); - - let validation_result = platform - .query(PATH, &request, version) - .expect("expected query to succeed"); - let response = GetIdentitiesByPublicKeyHashesResponse::decode( - validation_result.data.unwrap().as_slice(), - ) - .expect("response decoded"); - - let get_identities_by_public_key_hashes_response::get_identities_by_public_key_hashes_response_v0::Result::Identities(identities) = - extract_single_variant_or_panic!(response.version.expect("expected a versioned response"), get_identities_by_public_key_hashes_response::Version::V0(inner), inner).result.expect("expected a versioned result") - else { - panic!("invalid response") - }; - - assert!(identities.identity_entries.first().unwrap().value.is_none()); - } - - #[test] - fn test_identities_absence_proof() { - let (platform, version) = super::setup_platform(); - - let request = GetIdentitiesByPublicKeyHashesRequest { - version: Some(Version::V0(GetIdentitiesByPublicKeyHashesRequestV0 { - public_key_hashes: vec![vec![0; 20]], - prove: true, - })), - } - .encode_to_vec(); - - let result = platform.query(PATH, &request, version); - assert!(result.is_ok()); - - let validation_result = result.unwrap(); - let response = GetIdentitiesByPublicKeyHashesResponse::decode( - validation_result.data.unwrap().as_slice(), - ) - .expect("response decoded"); - - assert!(matches!( - extract_single_variant_or_panic!(response.version.expect("expected a versioned response"), get_identities_by_public_key_hashes_response::Version::V0(inner), inner).result.unwrap(), - get_identities_by_public_key_hashes_response::get_identities_by_public_key_hashes_response_v0::Result::Proof(_) - )); - } - } - - mod proofs { - use crate::query::QueryError; - use dapi_grpc::platform::v0::get_proofs_request::get_proofs_request_v0::{ - ContractRequest, DocumentRequest, IdentityRequest, - }; - use dapi_grpc::platform::v0::get_proofs_request::{GetProofsRequestV0, Version}; - use dapi_grpc::platform::v0::{GetProofsRequest, GetProofsResponse}; - use dapi_grpc::platform::VersionedGrpcResponse; - use dapi_grpc::Message; - - const PATH: &str = "/proofs"; - - #[test] - fn test_invalid_identity_ids() { - let (platform, version) = super::setup_platform(); - - let request = GetProofsRequest { - version: Some(Version::V0(GetProofsRequestV0 { - identities: vec![IdentityRequest { - identity_id: vec![0; 8], - request_type: 0, - }], - contracts: vec![], - documents: vec![], - })), - } - .encode_to_vec(); - - let result = platform.query(PATH, &request, version); - assert!(result.is_ok()); - super::assert_invalid_identifier(result.unwrap()); - } - - #[test] - fn test_invalid_identity_prove_request_type() { - let (platform, version) = super::setup_platform(); - - let request_type = 10; - - let request = GetProofsRequest { - version: Some(Version::V0(GetProofsRequestV0 { - identities: vec![IdentityRequest { - identity_id: vec![0; 32], - request_type, - }], - contracts: vec![], - documents: vec![], - })), - } - .encode_to_vec(); - - let result = platform.query(PATH, &request, version); - assert!(result.is_ok()); - let validation_result = result.unwrap(); - - assert!(matches!( - validation_result.first_error().unwrap(), - QueryError::InvalidArgument(msg) if msg == &format!( - "invalid prove request type '{}'", - request_type - ).to_string() - )) - } - - #[test] - fn test_invalid_contract_ids() { - let (platform, version) = super::setup_platform(); - - let request = GetProofsRequest { - version: Some(Version::V0(GetProofsRequestV0 { - identities: vec![], - contracts: vec![ContractRequest { - contract_id: vec![0; 8], - }], - documents: vec![], - })), - } - .encode_to_vec(); - - let result = platform.query(PATH, &request, version); - assert!(result.is_ok()); - super::assert_invalid_identifier(result.unwrap()); - } - - #[test] - fn test_invalid_contract_id_for_documents_proof() { - let (platform, version) = super::setup_platform(); - - let request = GetProofsRequest { - version: Some(Version::V0(GetProofsRequestV0 { - identities: vec![], - contracts: vec![], - documents: vec![DocumentRequest { - contract_id: vec![0; 8], - document_type: "niceDocument".to_string(), - document_type_keeps_history: false, - document_id: vec![0; 32], - }], - })), - } - .encode_to_vec(); - - let result = platform.query(PATH, &request, version); - assert!(result.is_ok()); - super::assert_invalid_identifier(result.unwrap()); - } - - #[test] - fn test_invalid_document_id() { - let (platform, version) = super::setup_platform(); - - let request = GetProofsRequest { - version: Some(Version::V0(GetProofsRequestV0 { - identities: vec![], - contracts: vec![], - documents: vec![DocumentRequest { - contract_id: vec![0; 32], - document_type: "niceDocument".to_string(), - document_type_keeps_history: false, - document_id: vec![0; 8], - }], - })), - } - .encode_to_vec(); - - let result = platform.query(PATH, &request, version); - assert!(result.is_ok()); - super::assert_invalid_identifier(result.unwrap()); - } - - #[test] - fn test_proof_of_absence() { - let (platform, version) = super::setup_platform(); - - let request = GetProofsRequest { - version: Some(Version::V0(GetProofsRequestV0 { - identities: vec![], - contracts: vec![], - documents: vec![DocumentRequest { - contract_id: vec![0; 32], - document_type: "niceDocument".to_string(), - document_type_keeps_history: false, - document_id: vec![0; 32], - }], - })), - } - .encode_to_vec(); - - let validation_result = platform - .query(PATH, &request, version) - .expect("expected query to succeed"); - let response = - GetProofsResponse::decode(validation_result.data.unwrap().as_slice()).unwrap(); - - let proof = response - .proof() - .expect("expected a proof in versioned response"); - - assert!(!proof.grovedb_proof.is_empty()) - } - } - - mod version_upgrade_state { - use dapi_grpc::platform::v0::get_protocol_version_upgrade_state_request::{ - GetProtocolVersionUpgradeStateRequestV0, Version, - }; - use dapi_grpc::platform::v0::get_protocol_version_upgrade_state_response::get_protocol_version_upgrade_state_response_v0; - use dapi_grpc::platform::v0::{ - get_protocol_version_upgrade_state_response, GetProtocolVersionUpgradeStateRequest, - GetProtocolVersionUpgradeStateResponse, - }; - use dapi_grpc::Message; - use drive::drive::grove_operations::BatchInsertApplyType; - use drive::drive::object_size_info::PathKeyElementInfo; - use drive::drive::protocol_upgrade::{ - desired_version_for_validators_path, versions_counter_path, versions_counter_path_vec, - }; - use drive::drive::Drive; - use drive::grovedb::{Element, PathQuery, Query, QueryItem}; - use drive::query::GroveDb; - use integer_encoding::VarInt; - use rand::rngs::StdRng; - use rand::{Rng, SeedableRng}; - use std::ops::RangeFull; - - const PATH: &str = "/versionUpgrade/state"; - - #[test] - fn test_query_empty_upgrade_state() { - let (platform, version) = super::setup_platform(); - - let request = GetProtocolVersionUpgradeStateRequest { - version: Some(Version::V0(GetProtocolVersionUpgradeStateRequestV0 { - prove: false, - })), - } - .encode_to_vec(); - - let validation_result = platform - .query(PATH, &request, version) - .expect("expected query to succeed"); - let response = GetProtocolVersionUpgradeStateResponse::decode( - validation_result.data.unwrap().as_slice(), - ) - .unwrap(); - - let result = extract_single_variant_or_panic!( - response.version.expect("expected a versioned response"), - get_protocol_version_upgrade_state_response::Version::V0(inner), - inner - ) - .result - .expect("expected a result"); - - let versions = extract_variant_or_panic!( - result, - get_protocol_version_upgrade_state_response_v0::Result::Versions(inner), - inner - ); - - // we just started chain, there should be no versions - - assert!(versions.versions.is_empty()) - } - - #[test] - fn test_query_upgrade_state() { - let (platform, version) = super::setup_platform(); - - let mut rand = StdRng::seed_from_u64(10); - - let drive = &platform.drive; - - let mut cache = drive.cache.write().unwrap(); - let version_counter = &mut cache.protocol_versions_counter; - - let transaction = drive.grove.start_transaction(); - - version_counter - .load_if_needed(drive, Some(&transaction), &version.drive) - .expect("expected to load version counter"); - - let path = desired_version_for_validators_path(); - let version_bytes = version.protocol_version.encode_var_vec(); - let version_element = Element::new_item(version_bytes.clone()); - - let validator_pro_tx_hash: [u8; 32] = rand.gen(); - - let mut operations = vec![]; - drive - .batch_insert_if_changed_value( - PathKeyElementInfo::PathFixedSizeKeyRefElement(( - path, - validator_pro_tx_hash.as_slice(), - version_element, - )), - BatchInsertApplyType::StatefulBatchInsert, - Some(&transaction), - &mut operations, - &version.drive, - ) - .expect("expected batch to insert"); - - let mut version_count = version_counter - .get(&version.protocol_version) - .cloned() - .unwrap_or_default(); - - version_count += 1; - - version_counter.set_block_cache_version_count(version.protocol_version, version_count); // push to block_cache - - drive - .batch_insert( - PathKeyElementInfo::PathFixedSizeKeyRefElement(( - versions_counter_path(), - version_bytes.as_slice(), - Element::new_item(version_count.encode_var_vec()), - )), - &mut operations, - &version.drive, - ) - .expect("expected batch to insert"); - - drive - .apply_batch_low_level_drive_operations( - None, - Some(&transaction), - operations, - &mut vec![], - &version.drive, - ) - .expect("expected to apply operations"); - - drive - .commit_transaction(transaction, &version.drive) - .expect("expected to commit"); - - cache.protocol_versions_counter.merge_block_cache(); - - drop(cache); - - let request = GetProtocolVersionUpgradeStateRequest { - version: Some(Version::V0(GetProtocolVersionUpgradeStateRequestV0 { - prove: false, - })), - } - .encode_to_vec(); - - let validation_result = platform - .query(PATH, &request, version) - .expect("expected query to succeed"); - let response = GetProtocolVersionUpgradeStateResponse::decode( - validation_result.data.unwrap().as_slice(), - ) - .unwrap(); - - let result = extract_single_variant_or_panic!( - response.version.expect("expected a versioned response"), - get_protocol_version_upgrade_state_response::Version::V0(inner), - inner - ) - .result - .expect("expected a result"); - - let versions = extract_variant_or_panic!( - result, - get_protocol_version_upgrade_state_response_v0::Result::Versions(inner), - inner - ); - - assert_eq!(versions.versions.len(), 1) - } - - #[test] - fn test_prove_empty_upgrade_state() { - let (platform, version) = super::setup_platform(); - - let request = GetProtocolVersionUpgradeStateRequest { - version: Some(Version::V0(GetProtocolVersionUpgradeStateRequestV0 { - prove: true, - })), - } - .encode_to_vec(); - - let validation_result = platform - .query(PATH, &request, version) - .expect("expected query to succeed"); - let response = GetProtocolVersionUpgradeStateResponse::decode( - validation_result.data.unwrap().as_slice(), - ) - .unwrap(); - - let result = extract_single_variant_or_panic!( - response.version.expect("expected a versioned response"), - get_protocol_version_upgrade_state_response::Version::V0(inner), - inner - ) - .result - .expect("expected a result"); - - let proof = extract_variant_or_panic!( - result, - get_protocol_version_upgrade_state_response_v0::Result::Proof(inner), - inner - ); - - let path_query = PathQuery::new_unsized( - versions_counter_path_vec(), - Query::new_single_query_item(QueryItem::RangeFull(RangeFull)), - ); - - let elements = GroveDb::verify_query(proof.grovedb_proof.as_slice(), &path_query) - .expect("expected to be able to verify query") - .1; - - // we just started chain, there should be no versions - - assert!(elements.is_empty()) - } - - #[test] - fn test_prove_upgrade_state() { - let (platform, version) = super::setup_platform(); - - let mut rand = StdRng::seed_from_u64(10); - - let drive = &platform.drive; - - let mut cache = drive.cache.write().unwrap(); - let version_counter = &mut cache.protocol_versions_counter; - - let transaction = drive.grove.start_transaction(); - - version_counter - .load_if_needed(drive, Some(&transaction), &version.drive) - .expect("expected to load version counter"); - - let path = desired_version_for_validators_path(); - let version_bytes = version.protocol_version.encode_var_vec(); - let version_element = Element::new_item(version_bytes.clone()); - - let validator_pro_tx_hash: [u8; 32] = rand.gen(); - - let mut operations = vec![]; - drive - .batch_insert_if_changed_value( - PathKeyElementInfo::PathFixedSizeKeyRefElement(( - path, - validator_pro_tx_hash.as_slice(), - version_element, - )), - BatchInsertApplyType::StatefulBatchInsert, - Some(&transaction), - &mut operations, - &version.drive, - ) - .expect("expected batch to insert"); - - let mut version_count = version_counter - .get(&version.protocol_version) - .cloned() - .unwrap_or_default(); - - version_count += 1; - - version_counter.set_block_cache_version_count(version.protocol_version, version_count); // push to block_cache - - drive - .batch_insert( - PathKeyElementInfo::PathFixedSizeKeyRefElement(( - versions_counter_path(), - version_bytes.as_slice(), - Element::new_item(version_count.encode_var_vec()), - )), - &mut operations, - &version.drive, - ) - .expect("expected batch to insert"); - - drive - .apply_batch_low_level_drive_operations( - None, - Some(&transaction), - operations, - &mut vec![], - &version.drive, - ) - .expect("expected to apply operations"); - - drive - .commit_transaction(transaction, &version.drive) - .expect("expected to commit"); - - cache.protocol_versions_counter.merge_block_cache(); - - drop(cache); - - let request = GetProtocolVersionUpgradeStateRequest { - version: Some(Version::V0(GetProtocolVersionUpgradeStateRequestV0 { - prove: true, - })), - } - .encode_to_vec(); - - let validation_result = platform - .query(PATH, &request, version) - .expect("expected query to succeed"); - let response = GetProtocolVersionUpgradeStateResponse::decode( - validation_result.data.unwrap().as_slice(), - ) - .unwrap(); - - let result = extract_single_variant_or_panic!( - response.version.expect("expected a versioned response"), - get_protocol_version_upgrade_state_response::Version::V0(inner), - inner - ) - .result - .expect("expected a result"); - - let proof = extract_variant_or_panic!( - result, - get_protocol_version_upgrade_state_response_v0::Result::Proof(inner), - inner - ); - - let path_query = PathQuery::new_unsized( - versions_counter_path_vec(), - Query::new_single_query_item(QueryItem::RangeFull(RangeFull)), - ); - - let elements = GroveDb::verify_query(proof.grovedb_proof.as_slice(), &path_query) - .expect("expected to be able to verify query") - .1; - - // we just started chain, there should be no versions - - assert_eq!(elements.len(), 1); - - let (_, _, element) = elements.first().unwrap(); - - assert!(element.is_some()); - - let element = element.clone().unwrap(); - - let count_bytes = element.as_item_bytes().expect("expected item bytes"); - - let count = u16::decode_var(count_bytes) - .expect("expected to decode var int") - .0; - - assert_eq!(count, 1); - - let upgrade = Drive::verify_upgrade_state(proof.grovedb_proof.as_slice(), version) - .expect("expected to verify the upgrade counts") - .1; - - assert_eq!(upgrade.len(), 1); - assert_eq!(upgrade.get(&1), Some(1).as_ref()); - } - } - - mod version_upgrade_vote_status { - use dapi_grpc::platform::v0::get_protocol_version_upgrade_vote_status_request::Version; - - use dapi_grpc::platform::v0::get_protocol_version_upgrade_vote_status_request::GetProtocolVersionUpgradeVoteStatusRequestV0; - use dapi_grpc::platform::v0::get_protocol_version_upgrade_vote_status_response::get_protocol_version_upgrade_vote_status_response_v0; - use dapi_grpc::platform::v0::{ - get_protocol_version_upgrade_vote_status_response, - GetProtocolVersionUpgradeVoteStatusRequest, - GetProtocolVersionUpgradeVoteStatusResponse, - }; - use dapi_grpc::Message; - use drive::drive::grove_operations::BatchInsertApplyType; - use drive::drive::object_size_info::PathKeyElementInfo; - use drive::drive::protocol_upgrade::{ - desired_version_for_validators_path, desired_version_for_validators_path_vec, - versions_counter_path, - }; - use drive::drive::Drive; - use drive::grovedb::{Element, PathQuery, Query, QueryItem, SizedQuery}; - use drive::query::GroveDb; - use integer_encoding::VarInt; - use rand::rngs::StdRng; - use rand::{Rng, SeedableRng}; - - const PATH: &str = "/versionUpgrade/voteStatus"; - - #[test] - fn test_query_empty_upgrade_vote_status() { - let (platform, version) = super::setup_platform(); - - let mut rand = StdRng::seed_from_u64(10); - - let validator_pro_tx_hash: [u8; 32] = rand.gen(); - - let request = GetProtocolVersionUpgradeVoteStatusRequest { - version: Some(Version::V0(GetProtocolVersionUpgradeVoteStatusRequestV0 { - start_pro_tx_hash: validator_pro_tx_hash.to_vec(), - count: 5, - prove: false, - })), - } - .encode_to_vec(); - - let validation_result = platform - .query(PATH, &request, version) - .expect("expected query to succeed"); - let response = GetProtocolVersionUpgradeVoteStatusResponse::decode( - validation_result.data.unwrap().as_slice(), - ) - .unwrap(); - - let result = extract_single_variant_or_panic!( - response.version.expect("expected a versioned response"), - get_protocol_version_upgrade_vote_status_response::Version::V0(inner), - inner - ) - .result - .expect("expected a result"); - - let version_signals = extract_variant_or_panic!( - result, - get_protocol_version_upgrade_vote_status_response::get_protocol_version_upgrade_vote_status_response_v0::Result::Versions(inner), - inner - ); - - // we just started chain, there should be no versions - - assert!(version_signals.version_signals.is_empty()) - } - - #[test] - fn test_query_upgrade_vote_status() { - let (platform, version) = super::setup_platform(); - - let mut rand = StdRng::seed_from_u64(10); - - let validator_pro_tx_hash: [u8; 32] = rand.gen(); - - let drive = &platform.drive; - - let mut cache = drive.cache.write().unwrap(); - let version_counter = &mut cache.protocol_versions_counter; - - let transaction = drive.grove.start_transaction(); - - version_counter - .load_if_needed(drive, Some(&transaction), &version.drive) - .expect("expected to load version counter"); - - let path = desired_version_for_validators_path(); - let version_bytes = version.protocol_version.encode_var_vec(); - let version_element = Element::new_item(version_bytes.clone()); - - let mut operations = vec![]; - drive - .batch_insert_if_changed_value( - PathKeyElementInfo::PathFixedSizeKeyRefElement(( - path, - validator_pro_tx_hash.as_slice(), - version_element, - )), - BatchInsertApplyType::StatefulBatchInsert, - Some(&transaction), - &mut operations, - &version.drive, - ) - .expect("expected batch to insert"); - - let mut version_count = version_counter - .get(&version.protocol_version) - .cloned() - .unwrap_or_default(); - - version_count += 1; - - version_counter.set_block_cache_version_count(version.protocol_version, version_count); // push to block_cache - - drive - .batch_insert( - PathKeyElementInfo::PathFixedSizeKeyRefElement(( - versions_counter_path(), - version_bytes.as_slice(), - Element::new_item(version_count.encode_var_vec()), - )), - &mut operations, - &version.drive, - ) - .expect("expected batch to insert"); - - drive - .apply_batch_low_level_drive_operations( - None, - Some(&transaction), - operations, - &mut vec![], - &version.drive, - ) - .expect("expected to apply operations"); - - drive - .commit_transaction(transaction, &version.drive) - .expect("expected to commit"); - - cache.protocol_versions_counter.merge_block_cache(); - - drop(cache); - - let request = GetProtocolVersionUpgradeVoteStatusRequest { - version: Some(Version::V0(GetProtocolVersionUpgradeVoteStatusRequestV0 { - start_pro_tx_hash: validator_pro_tx_hash.to_vec(), - count: 5, - prove: false, - })), - } - .encode_to_vec(); - - let validation_result = platform - .query(PATH, &request, version) - .expect("expected query to succeed"); - let response = GetProtocolVersionUpgradeVoteStatusResponse::decode( - validation_result.data.unwrap().as_slice(), - ) - .unwrap(); - - let result = extract_single_variant_or_panic!( - response.version.expect("expected a versioned response"), - get_protocol_version_upgrade_vote_status_response::Version::V0(inner), - inner - ) - .result - .expect("expected a result"); - - let version_signals = extract_variant_or_panic!( - result, - get_protocol_version_upgrade_vote_status_response::get_protocol_version_upgrade_vote_status_response_v0::Result::Versions(inner), - inner - ); - - assert_eq!(version_signals.version_signals.len(), 1) - } - - #[test] - fn test_prove_empty_upgrade_vote_status() { - let (platform, version) = super::setup_platform(); - - let mut rand = StdRng::seed_from_u64(10); - - let validator_pro_tx_hash: [u8; 32] = rand.gen(); - - let request = GetProtocolVersionUpgradeVoteStatusRequest { - version: Some(Version::V0(GetProtocolVersionUpgradeVoteStatusRequestV0 { - start_pro_tx_hash: validator_pro_tx_hash.to_vec(), - count: 5, - prove: true, - })), - } - .encode_to_vec(); - - let validation_result = platform - .query(PATH, &request, version) - .expect("expected query to succeed"); - let response = GetProtocolVersionUpgradeVoteStatusResponse::decode( - validation_result.data.unwrap().as_slice(), - ) - .unwrap(); - - let result = extract_single_variant_or_panic!( - response.version.expect("expected a versioned response"), - get_protocol_version_upgrade_vote_status_response::Version::V0(inner), - inner - ) - .result - .expect("expected a result"); - - let proof = extract_variant_or_panic!( - result, - get_protocol_version_upgrade_vote_status_response_v0::Result::Proof(inner), - inner - ); - - let path = desired_version_for_validators_path_vec(); - - let query_item = QueryItem::RangeFrom(validator_pro_tx_hash.to_vec()..); - - let path_query = PathQuery::new( - path, - SizedQuery::new(Query::new_single_query_item(query_item), Some(5), None), - ); - - let elements = GroveDb::verify_query(proof.grovedb_proof.as_slice(), &path_query) - .expect("expected to be able to verify query") - .1; - - // we just started chain, there should be no versions - - assert!(elements.is_empty()) - } - - #[test] - fn test_prove_upgrade_vote_status() { - let (platform, version) = super::setup_platform(); - - let mut rand = StdRng::seed_from_u64(10); - - let drive = &platform.drive; - - let mut cache = drive.cache.write().unwrap(); - let version_counter = &mut cache.protocol_versions_counter; - - let transaction = drive.grove.start_transaction(); - - version_counter - .load_if_needed(drive, Some(&transaction), &version.drive) - .expect("expected to load version counter"); - - let path = desired_version_for_validators_path(); - let version_bytes = version.protocol_version.encode_var_vec(); - let version_element = Element::new_item(version_bytes.clone()); - - let validator_pro_tx_hash: [u8; 32] = rand.gen(); - - let mut operations = vec![]; - drive - .batch_insert_if_changed_value( - PathKeyElementInfo::PathFixedSizeKeyRefElement(( - path, - validator_pro_tx_hash.as_slice(), - version_element, - )), - BatchInsertApplyType::StatefulBatchInsert, - Some(&transaction), - &mut operations, - &version.drive, - ) - .expect("expected batch to insert"); - - let mut version_count = version_counter - .get(&version.protocol_version) - .cloned() - .unwrap_or_default(); - - version_count += 1; - - version_counter.set_block_cache_version_count(version.protocol_version, version_count); // push to block_cache - - drive - .batch_insert( - PathKeyElementInfo::PathFixedSizeKeyRefElement(( - versions_counter_path(), - version_bytes.as_slice(), - Element::new_item(version_count.encode_var_vec()), - )), - &mut operations, - &version.drive, - ) - .expect("expected batch to insert"); - - drive - .apply_batch_low_level_drive_operations( - None, - Some(&transaction), - operations, - &mut vec![], - &version.drive, - ) - .expect("expected to apply operations"); - - drive - .commit_transaction(transaction, &version.drive) - .expect("expected to commit"); - - cache.protocol_versions_counter.merge_block_cache(); - - drop(cache); - - let request = GetProtocolVersionUpgradeVoteStatusRequest { - version: Some(Version::V0(GetProtocolVersionUpgradeVoteStatusRequestV0 { - start_pro_tx_hash: validator_pro_tx_hash.to_vec(), - count: 5, - prove: true, - })), - } - .encode_to_vec(); - - let validation_result = platform - .query(PATH, &request, version) - .expect("expected query to succeed"); - let response = GetProtocolVersionUpgradeVoteStatusResponse::decode( - validation_result.data.unwrap().as_slice(), - ) - .unwrap(); - - let result = extract_single_variant_or_panic!( - response.version.expect("expected a versioned response"), - get_protocol_version_upgrade_vote_status_response::Version::V0(inner), - inner - ) - .result - .expect("expected a result"); - - let proof = extract_variant_or_panic!( - result, - get_protocol_version_upgrade_vote_status_response_v0::Result::Proof(inner), - inner - ); - - let path = desired_version_for_validators_path_vec(); - - let query_item = QueryItem::RangeFrom(validator_pro_tx_hash.to_vec()..); - - let path_query = PathQuery::new( - path, - SizedQuery::new(Query::new_single_query_item(query_item), Some(5), None), - ); - - let elements = GroveDb::verify_query(proof.grovedb_proof.as_slice(), &path_query) - .expect("expected to be able to verify query") - .1; - - // we just started chain, there should be no versions - - assert_eq!(elements.len(), 1); - - let (_, _, element) = elements.first().unwrap(); - - assert!(element.is_some()); - - let element = element.clone().unwrap(); - - let count_bytes = element.as_item_bytes().expect("expected item bytes"); - - let count = u16::decode_var(count_bytes) - .expect("expected to decode var int") - .0; - - assert_eq!(count, 1); - - let upgrade = Drive::verify_upgrade_vote_status( - proof.grovedb_proof.as_slice(), - Some(validator_pro_tx_hash), - 5, - version, - ) - .expect("expected to verify the upgrade counts") - .1; - - assert_eq!(upgrade.len(), 1); - assert_eq!(upgrade.get(&validator_pro_tx_hash), Some(1).as_ref()); - } - } - - mod epoch_infos { - use dapi_grpc::platform::v0::get_epochs_info_request::{GetEpochsInfoRequestV0, Version}; - use dapi_grpc::platform::v0::{ - get_epochs_info_response, GetEpochsInfoRequest, GetEpochsInfoResponse, - }; - use dapi_grpc::Message; - - const PATH: &str = "/epochInfos"; - - #[test] - fn test_query_empty_epoch_infos() { - let (platform, version) = super::setup_platform(); - - let request = GetEpochsInfoRequest { - version: Some(Version::V0(GetEpochsInfoRequestV0 { - start_epoch: None, // 0 - count: 5, - ascending: true, - prove: false, - })), - } - .encode_to_vec(); - - let validation_result = platform - .query(PATH, &request, version) - .expect("expected query to succeed"); - let response = GetEpochsInfoResponse::decode( - validation_result.data.expect("expected data").as_slice(), - ) - .expect("expected to decode response"); - - let result = extract_single_variant_or_panic!( - response.version.expect("expected a versioned response"), - get_epochs_info_response::Version::V0(inner), - inner - ) - .result - .expect("expected a result"); - - let epoch_infos = extract_variant_or_panic!( - result, - get_epochs_info_response::get_epochs_info_response_v0::Result::Epochs(inner), - inner - ); - - // we just started chain, there should be only 1 epoch info for the first epoch - - assert!(epoch_infos.epoch_infos.is_empty()) - } - - #[test] - fn test_query_empty_epoch_infos_descending() { - let (platform, version) = super::setup_platform(); - - let request = GetEpochsInfoRequest { - version: Some(Version::V0(GetEpochsInfoRequestV0 { - start_epoch: None, // 0 - count: 5, - ascending: false, - prove: false, - })), - } - .encode_to_vec(); - - let validation_result = platform - .query(PATH, &request, version) - .expect("expected query to succeed"); - let response = GetEpochsInfoResponse::decode( - validation_result.data.expect("expected data").as_slice(), - ) - .expect("expected to decode response"); - - let result = extract_single_variant_or_panic!( - response.version.expect("expected a versioned response"), - get_epochs_info_response::Version::V0(inner), - inner - ) - .result - .expect("expected a result"); - - let epoch_infos = extract_variant_or_panic!( - result, - get_epochs_info_response::get_epochs_info_response_v0::Result::Epochs(inner), - inner - ); - - // we just started chain, there should be only 1 epoch info for the first epoch - - assert!(epoch_infos.epoch_infos.is_empty()) - } - } } diff --git a/packages/rs-drive-abci/src/query/proofs/mod.rs b/packages/rs-drive-abci/src/query/proofs/mod.rs index b14a1b0654..9ced568d3d 100644 --- a/packages/rs-drive-abci/src/query/proofs/mod.rs +++ b/packages/rs-drive-abci/src/query/proofs/mod.rs @@ -1,30 +1,21 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; -use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; -use dapi_grpc::platform::v0::get_proofs_request::Version; -use dapi_grpc::platform::v0::GetProofsRequest; -use dapi_grpc::Message; -use dpp::check_validation_result_with_data; -use dpp::validation::ValidationResult; +use dapi_grpc::platform::v0::get_proofs_request::Version as RequestVersion; +use dapi_grpc::platform::v0::get_proofs_response::Version as ResponseVersion; +use dapi_grpc::platform::v0::{GetProofsRequest, GetProofsResponse}; use dpp::version::PlatformVersion; mod v0; impl Platform { /// Querying of platform proofs - pub(in crate::query) fn query_proofs( + pub fn query_proofs( &self, - state: &PlatformState, - query_data: &[u8], + GetProofsRequest { version }: GetProofsRequest, platform_version: &PlatformVersion, - ) -> Result>, Error> { - let GetProofsRequest { version } = - check_validation_result_with_data!(GetProofsRequest::decode(query_data).map_err(|e| { - QueryError::InvalidArgument(format!("invalid query proto message: {}", e)) - })); - + ) -> Result, Error> { let Some(version) = version else { return Ok(QueryValidationResult::new_with_error( QueryError::DecodingError("could not decode identity keys query".to_string()), @@ -34,7 +25,7 @@ impl Platform { let feature_version_bounds = &platform_version.drive_abci.query.proofs_query; let feature_version = match &version { - Version::V0(_) => 0, + RequestVersion::V0(_) => 0, }; if !feature_version_bounds.check_version(feature_version) { return Ok(QueryValidationResult::new_with_error( @@ -48,8 +39,12 @@ impl Platform { )); } match version { - Version::V0(get_identity_request) => { - self.query_proofs_v0(state, get_identity_request, platform_version) + RequestVersion::V0(request_v0) => { + let result = self.query_proofs_v0(request_v0, platform_version)?; + + Ok(result.map(|response_v0| GetProofsResponse { + version: Some(ResponseVersion::V0(response_v0)), + })) } } } diff --git a/packages/rs-drive-abci/src/query/proofs/v0/mod.rs b/packages/rs-drive-abci/src/query/proofs/v0/mod.rs index c03403a8dd..55c31c6ae8 100644 --- a/packages/rs-drive-abci/src/query/proofs/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/proofs/v0/mod.rs @@ -1,13 +1,9 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; -use crate::platform_types::platform_state::v0::PlatformStateV0Methods; -use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_proofs_request::GetProofsRequestV0; -use dapi_grpc::platform::v0::get_proofs_response::GetProofsResponseV0; -use dapi_grpc::platform::v0::{get_proofs_response, GetProofsResponse, Proof}; -use dapi_grpc::Message; +use dapi_grpc::platform::v0::get_proofs_response::{get_proofs_response_v0, GetProofsResponseV0}; use dpp::check_validation_result_with_data; use dpp::platform_value::Bytes32; use dpp::prelude::Identifier; @@ -19,17 +15,13 @@ use drive::query::SingleDocumentDriveQuery; impl Platform { pub(super) fn query_proofs_v0( &self, - state: &PlatformState, - request: GetProofsRequestV0, - platform_version: &PlatformVersion, - ) -> Result>, Error> { - let metadata = self.response_metadata_v0(state); - let quorum_type = self.config.validator_set_quorum_type() as u32; - let GetProofsRequestV0 { + GetProofsRequestV0 { identities, contracts, documents, - } = request; + }: GetProofsRequestV0, + platform_version: &PlatformVersion, + ) -> Result, Error> { let contract_ids = check_validation_result_with_data!(contracts .into_iter() .map(|contract_request| { @@ -104,23 +96,158 @@ impl Platform { platform_version, )?; - let response_data = GetProofsResponse { - version: Some(get_proofs_response::Version::V0(GetProofsResponseV0 { - result: Some(get_proofs_response::get_proofs_response_v0::Result::Proof( - Proof { - grovedb_proof: proof, - quorum_hash: state.last_committed_quorum_hash().to_vec(), - quorum_type, - block_id_hash: state.last_committed_block_id_hash().to_vec(), - signature: state.last_committed_block_signature().to_vec(), - round: state.last_committed_block_round(), - }, - )), - metadata: Some(metadata), - })), - } - .encode_to_vec(); - - Ok(QueryValidationResult::new_with_data(response_data)) + let (metadata, proof) = self.response_metadata_and_proof_v0(proof); + + let response = GetProofsResponseV0 { + result: Some(get_proofs_response_v0::Result::Proof(proof)), + metadata: Some(metadata), + }; + + Ok(QueryValidationResult::new_with_data(response)) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::query::tests::{assert_invalid_identifier, setup_platform}; + use dapi_grpc::platform::v0::get_proofs_request::get_proofs_request_v0::{ + ContractRequest, DocumentRequest, IdentityRequest, + }; + + #[test] + fn test_invalid_identity_ids() { + let (platform, version) = setup_platform(); + + let request = GetProofsRequestV0 { + identities: vec![IdentityRequest { + identity_id: vec![0; 8], + request_type: 0, + }], + contracts: vec![], + documents: vec![], + }; + + let result = platform + .query_proofs_v0(request, version) + .expect("expected query to succeed"); + + assert_invalid_identifier(result); + } + + #[test] + fn test_invalid_identity_prove_request_type() { + let (platform, version) = setup_platform(); + + let request_type = 10; + + let request = GetProofsRequestV0 { + identities: vec![IdentityRequest { + identity_id: vec![0; 32], + request_type, + }], + contracts: vec![], + documents: vec![], + }; + + let result = platform + .query_proofs_v0(request, version) + .expect("expected query to succeed"); + + assert!(matches!( + result.errors.as_slice(), + [QueryError::InvalidArgument(msg)] if msg == &format!( + "invalid prove request type '{}'", + request_type + ) + )) + } + + #[test] + fn test_invalid_contract_ids() { + let (platform, version) = setup_platform(); + + let request = GetProofsRequestV0 { + identities: vec![], + contracts: vec![ContractRequest { + contract_id: vec![0; 8], + }], + documents: vec![], + }; + + let result = platform + .query_proofs_v0(request, version) + .expect("expected query to succeed"); + + assert_invalid_identifier(result); + } + + #[test] + fn test_invalid_contract_id_for_documents_proof() { + let (platform, version) = setup_platform(); + + let request = GetProofsRequestV0 { + identities: vec![], + contracts: vec![], + documents: vec![DocumentRequest { + contract_id: vec![0; 8], + document_type: "niceDocument".to_string(), + document_type_keeps_history: false, + document_id: vec![0; 32], + }], + }; + + let result = platform + .query_proofs_v0(request, version) + .expect("expected query to succeed"); + + assert_invalid_identifier(result); + } + + #[test] + fn test_invalid_document_id() { + let (platform, version) = setup_platform(); + + let request = GetProofsRequestV0 { + identities: vec![], + contracts: vec![], + documents: vec![DocumentRequest { + contract_id: vec![0; 32], + document_type: "niceDocument".to_string(), + document_type_keeps_history: false, + document_id: vec![0; 8], + }], + }; + + let result = platform + .query_proofs_v0(request, version) + .expect("expected query to succeed"); + + assert_invalid_identifier(result); + } + + #[test] + fn test_proof_of_absence() { + let (platform, version) = setup_platform(); + + let request = GetProofsRequestV0 { + identities: vec![], + contracts: vec![], + documents: vec![DocumentRequest { + contract_id: vec![0; 32], + document_type: "niceDocument".to_string(), + document_type_keeps_history: false, + document_id: vec![0; 32], + }], + }; + + let validation_result = platform + .query_proofs_v0(request, version) + .expect("expected query to succeed"); + + assert!(matches!(validation_result.data, Some(GetProofsResponseV0 { + result: Some(get_proofs_response_v0::Result::Proof(proof)), + metadata: Some(_), + }) if !proof.grovedb_proof.is_empty())); } } diff --git a/packages/rs-drive-abci/src/query/response_metadata/mod.rs b/packages/rs-drive-abci/src/query/response_metadata/mod.rs index b84c1581ea..445935d530 100644 --- a/packages/rs-drive-abci/src/query/response_metadata/mod.rs +++ b/packages/rs-drive-abci/src/query/response_metadata/mod.rs @@ -4,18 +4,18 @@ use crate::error::execution::ExecutionError; use crate::error::Error; use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::platform_types::platform_state::PlatformState; -use dapi_grpc::platform::v0::ResponseMetadata; +use dapi_grpc::platform::v0::{Proof, ResponseMetadata}; use dpp::version::PlatformVersion; impl Platform { pub(in crate::query) fn response_metadata( &self, - state: &PlatformState, platform_version: &PlatformVersion, ) -> Result { match platform_version.drive_abci.query.response_metadata { - 0 => Ok(self.response_metadata_v0(state)), + 0 => Ok(self.response_metadata_v0()), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "response_metadata".to_string(), known_versions: vec![0], diff --git a/packages/rs-drive-abci/src/query/response_metadata/v0/mod.rs b/packages/rs-drive-abci/src/query/response_metadata/v0/mod.rs index 492db68f4c..0858ec3e59 100644 --- a/packages/rs-drive-abci/src/query/response_metadata/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/response_metadata/v0/mod.rs @@ -1,10 +1,12 @@ use crate::platform_types::platform::Platform; use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::platform_types::platform_state::PlatformState; -use dapi_grpc::platform::v0::ResponseMetadata; +use dapi_grpc::platform::v0::{Proof, ResponseMetadata}; impl Platform { - pub(in crate::query) fn response_metadata_v0(&self, state: &PlatformState) -> ResponseMetadata { + pub(in crate::query) fn response_metadata_v0(&self) -> ResponseMetadata { + let state = self.state.read().unwrap(); + ResponseMetadata { height: state.last_committed_height(), core_chain_locked_height: state.last_committed_core_height(), @@ -14,4 +16,31 @@ impl Platform { protocol_version: state.current_protocol_version_in_consensus(), } } + + pub(in crate::query) fn response_metadata_and_proof_v0( + &self, + proof: Vec, + ) -> (ResponseMetadata, Proof) { + let state = self.state.read().unwrap(); + + let metadata = ResponseMetadata { + height: state.last_committed_height(), + core_chain_locked_height: state.last_committed_core_height(), + epoch: state.last_committed_block_epoch().index as u32, + time_ms: state.last_committed_block_time_ms().unwrap_or_default(), + chain_id: self.config.abci.chain_id.clone(), + protocol_version: state.current_protocol_version_in_consensus(), + }; + + let proof = Proof { + grovedb_proof: proof, + quorum_hash: state.last_committed_quorum_hash().to_vec(), + quorum_type: self.config.validator_set_quorum_type() as u32, + block_id_hash: state.last_committed_block_id_hash().to_vec(), + signature: state.last_committed_block_signature().to_vec(), + round: state.last_committed_block_round(), + }; + + (metadata, proof) + } } diff --git a/packages/rs-drive-abci/src/query/service.rs b/packages/rs-drive-abci/src/query/service.rs new file mode 100644 index 0000000000..de4db1c118 --- /dev/null +++ b/packages/rs-drive-abci/src/query/service.rs @@ -0,0 +1,333 @@ +use crate::error::query::QueryError; +use crate::error::Error; +use crate::platform_types::platform::Platform; +use crate::query::QueryValidationResult; +use crate::rpc::core::DefaultCoreRPC; +use crate::utils::spawn_blocking_task_with_name_if_supported; +use async_trait::async_trait; +use dapi_grpc::platform::v0::platform_server::Platform as PlatformService; +use dapi_grpc::platform::v0::{ + BroadcastStateTransitionRequest, BroadcastStateTransitionResponse, GetConsensusParamsRequest, + GetConsensusParamsResponse, GetDataContractHistoryRequest, GetDataContractHistoryResponse, + GetDataContractRequest, GetDataContractResponse, GetDataContractsRequest, + GetDataContractsResponse, GetDocumentsRequest, GetDocumentsResponse, GetEpochsInfoRequest, + GetEpochsInfoResponse, GetIdentitiesByPublicKeyHashesRequest, + GetIdentitiesByPublicKeyHashesResponse, GetIdentitiesRequest, GetIdentitiesResponse, + GetIdentityBalanceAndRevisionRequest, GetIdentityBalanceAndRevisionResponse, + GetIdentityBalanceRequest, GetIdentityBalanceResponse, GetIdentityByPublicKeyHashRequest, + GetIdentityByPublicKeyHashResponse, GetIdentityContractNonceRequest, + GetIdentityContractNonceResponse, GetIdentityKeysRequest, GetIdentityKeysResponse, + GetIdentityNonceRequest, GetIdentityNonceResponse, GetIdentityRequest, GetIdentityResponse, + GetProofsRequest, GetProofsResponse, GetProtocolVersionUpgradeStateRequest, + GetProtocolVersionUpgradeStateResponse, GetProtocolVersionUpgradeVoteStatusRequest, + GetProtocolVersionUpgradeVoteStatusResponse, WaitForStateTransitionResultRequest, + WaitForStateTransitionResultResponse, +}; +use dapi_grpc::tonic::{Request, Response, Status}; +use dpp::version::PlatformVersion; +use dpp::version::PlatformVersionCurrentVersion; +use std::sync::Arc; +use tracing::Instrument; + +/// Service to handle platform queries +pub struct QueryService { + platform: Arc>, +} + +type QueryMethod = + fn(&Platform, RQ, &PlatformVersion) -> Result, Error>; + +impl QueryService { + /// Creates new QueryService + pub fn new(platform: Arc>) -> Self { + Self { platform } + } + + async fn handle_blocking_query( + &self, + request: Request, + query_method: QueryMethod, + endpoint_name: &str, + ) -> Result, Status> + where + RS: Clone + Send + 'static, + RQ: Send + 'static, + { + let platform = Arc::clone(&self.platform); + + spawn_blocking_task_with_name_if_supported("query", move || { + let Some(platform_version) = PlatformVersion::get_maybe_current() else { + return Err(Status::unavailable("platform is not initialized")); + }; + + let mut result = query_method(&platform, request.into_inner(), platform_version) + .map_err(error_into_status)?; + + if result.is_valid() { + let response = result + .into_data() + .map_err(|error| error_into_status(error.into()))?; + + Ok(Response::new(response)) + } else { + let error = result.errors.swap_remove(0); + + Err(query_error_into_status(error)) + } + })? + .instrument(tracing::trace_span!("query", endpoint_name)) + .await + .map_err(|error| Status::internal(format!("join error: {}", error)))? + } +} + +fn respond_with_unimplemented(name: &str) -> Result, Status> { + tracing::error!("{} endpoint is called but it's not supported", name); + + Err(Status::unimplemented("the endpoint is not supported")) +} + +#[async_trait] +impl PlatformService for QueryService { + async fn broadcast_state_transition( + &self, + _request: Request, + ) -> Result, Status> { + respond_with_unimplemented("broadcast_state_transition") + } + + async fn get_identity( + &self, + request: Request, + ) -> Result, Status> { + self.handle_blocking_query( + request, + Platform::::query_identity, + "get_identity", + ) + .await + } + + async fn get_identities( + &self, + request: Request, + ) -> Result, Status> { + self.handle_blocking_query( + request, + Platform::::query_identities, + "get_identities", + ) + .await + } + + async fn get_identity_keys( + &self, + request: Request, + ) -> Result, Status> { + self.handle_blocking_query( + request, + Platform::::query_keys, + "get_identity_keys", + ) + .await + } + + async fn get_identity_nonce( + &self, + request: Request, + ) -> Result, Status> { + self.handle_blocking_query( + request, + Platform::::query_identity_nonce, + "get_identity_nonce", + ) + .await + } + + async fn get_identity_contract_nonce( + &self, + request: Request, + ) -> Result, Status> { + self.handle_blocking_query( + request, + Platform::::query_identity_contract_nonce, + "get_identity_contract_nonce", + ) + .await + } + + async fn get_identity_balance( + &self, + request: Request, + ) -> Result, Status> { + self.handle_blocking_query( + request, + Platform::::query_balance, + "get_identity_balance", + ) + .await + } + + async fn get_identity_balance_and_revision( + &self, + request: Request, + ) -> Result, Status> { + self.handle_blocking_query( + request, + Platform::::query_balance_and_revision, + "get_identity_balance_and_revision", + ) + .await + } + + async fn get_proofs( + &self, + request: Request, + ) -> Result, Status> { + self.handle_blocking_query( + request, + Platform::::query_proofs, + "get_proofs", + ) + .await + } + + async fn get_data_contract( + &self, + request: Request, + ) -> Result, Status> { + self.handle_blocking_query( + request, + Platform::::query_data_contract, + "get_data_contract", + ) + .await + } + + async fn get_data_contract_history( + &self, + request: Request, + ) -> Result, Status> { + self.handle_blocking_query( + request, + Platform::::query_data_contract_history, + "get_data_contract_history", + ) + .await + } + + async fn get_data_contracts( + &self, + request: Request, + ) -> Result, Status> { + self.handle_blocking_query( + request, + Platform::::query_data_contracts, + "get_data_contracts", + ) + .await + } + + async fn get_documents( + &self, + request: Request, + ) -> Result, Status> { + self.handle_blocking_query( + request, + Platform::::query_documents, + "get_documents", + ) + .await + } + + async fn get_identities_by_public_key_hashes( + &self, + request: Request, + ) -> Result, Status> { + self.handle_blocking_query( + request, + Platform::::query_identities_by_public_key_hashes, + "get_identities_by_public_key_hashes", + ) + .await + } + + async fn get_identity_by_public_key_hash( + &self, + request: Request, + ) -> Result, Status> { + self.handle_blocking_query( + request, + Platform::::query_identity_by_public_key_hash, + "get_identity_by_public_key_hash", + ) + .await + } + + async fn wait_for_state_transition_result( + &self, + _request: Request, + ) -> Result, Status> { + respond_with_unimplemented("wait_for_state_transition_result") + } + + async fn get_consensus_params( + &self, + _request: Request, + ) -> Result, Status> { + respond_with_unimplemented("get_consensus_params") + } + + async fn get_protocol_version_upgrade_state( + &self, + request: Request, + ) -> Result, Status> { + self.handle_blocking_query( + request, + Platform::::query_version_upgrade_state, + "get_protocol_version_upgrade_state", + ) + .await + } + + async fn get_protocol_version_upgrade_vote_status( + &self, + request: Request, + ) -> Result, Status> { + self.handle_blocking_query( + request, + Platform::::query_version_upgrade_vote_status, + "get_protocol_version_upgrade_vote_status", + ) + .await + } + + async fn get_epochs_info( + &self, + request: Request, + ) -> Result, Status> { + self.handle_blocking_query( + request, + Platform::::query_epoch_infos, + "get_epochs_info", + ) + .await + } +} + +fn query_error_into_status(error: QueryError) -> Status { + match error { + QueryError::NotFound(message) => Status::not_found(message), + QueryError::InvalidArgument(message) => Status::invalid_argument(message), + QueryError::Query(error) => Status::invalid_argument(error.to_string()), + _ => { + tracing::error!("unexpected query error: {:?}", error); + + Status::unknown(error.to_string()) + } + } +} + +fn error_into_status(error: Error) -> Status { + Status::internal(format!("query: {}", error)) +} diff --git a/packages/rs-drive-abci/src/query/system/epoch_infos/mod.rs b/packages/rs-drive-abci/src/query/system/epoch_infos/mod.rs index c9bc9b7e72..8872a9d8e8 100644 --- a/packages/rs-drive-abci/src/query/system/epoch_infos/mod.rs +++ b/packages/rs-drive-abci/src/query/system/epoch_infos/mod.rs @@ -3,28 +3,19 @@ mod v0; use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; -use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; -use dapi_grpc::platform::v0::get_epochs_info_request::Version; -use dapi_grpc::platform::v0::GetEpochsInfoRequest; -use dapi_grpc::Message; -use dpp::check_validation_result_with_data; -use dpp::validation::ValidationResult; +use dapi_grpc::platform::v0::get_epochs_info_request::Version as RequestVersion; +use dapi_grpc::platform::v0::get_epochs_info_response::Version as ResponseVersion; +use dapi_grpc::platform::v0::{GetEpochsInfoRequest, GetEpochsInfoResponse}; use dpp::version::PlatformVersion; impl Platform { /// Querying of version upgrade state - pub(in crate::query) fn query_epoch_infos( + pub fn query_epoch_infos( &self, - state: &PlatformState, - query_data: &[u8], + GetEpochsInfoRequest { version }: GetEpochsInfoRequest, platform_version: &PlatformVersion, - ) -> Result>, Error> { - let GetEpochsInfoRequest { version } = - check_validation_result_with_data!(GetEpochsInfoRequest::decode(query_data).map_err( - |e| { QueryError::InvalidArgument(format!("invalid query proto message: {}", e)) } - )); - + ) -> Result, Error> { let Some(version) = version else { return Ok(QueryValidationResult::new_with_error( QueryError::DecodingError("could not decode epoch info request".to_string()), @@ -34,7 +25,7 @@ impl Platform { let feature_version_bounds = &platform_version.drive_abci.query.system.epoch_infos; let feature_version = match &version { - Version::V0(_) => 0, + RequestVersion::V0(_) => 0, }; if !feature_version_bounds.check_version(feature_version) { return Ok(QueryValidationResult::new_with_error( @@ -48,8 +39,12 @@ impl Platform { )); } match version { - Version::V0(get_epoch_infos_request) => { - self.query_epoch_infos_v0(state, get_epoch_infos_request, platform_version) + RequestVersion::V0(request_v0) => { + let result = self.query_epoch_infos_v0(request_v0, platform_version)?; + + Ok(result.map(|response_v0| GetEpochsInfoResponse { + version: Some(ResponseVersion::V0(response_v0)), + })) } } } diff --git a/packages/rs-drive-abci/src/query/system/epoch_infos/v0/mod.rs b/packages/rs-drive-abci/src/query/system/epoch_infos/v0/mod.rs index 8ef742d5ee..3bd0e9eec9 100644 --- a/packages/rs-drive-abci/src/query/system/epoch_infos/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/system/epoch_infos/v0/mod.rs @@ -2,34 +2,31 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; use crate::platform_types::platform_state::v0::PlatformStateV0Methods; -use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_epochs_info_request::GetEpochsInfoRequestV0; use dapi_grpc::platform::v0::get_epochs_info_response::get_epochs_info_response_v0::EpochInfos; -use dapi_grpc::platform::v0::get_epochs_info_response::GetEpochsInfoResponseV0; -use dapi_grpc::platform::v0::{get_epochs_info_response, GetEpochsInfoResponse, Proof}; +use dapi_grpc::platform::v0::get_epochs_info_response::{ + get_epochs_info_response_v0, GetEpochsInfoResponseV0, +}; +use dapi_grpc::platform::v0::{Proof, ResponseMetadata}; use dpp::block::extended_epoch_info::v0::ExtendedEpochInfoV0Getters; use dpp::check_validation_result_with_data; -use dapi_grpc::Message; use dpp::validation::ValidationResult; use dpp::version::PlatformVersion; impl Platform { pub(super) fn query_epoch_infos_v0( &self, - state: &PlatformState, - request: GetEpochsInfoRequestV0, - platform_version: &PlatformVersion, - ) -> Result>, Error> { - let metadata = self.response_metadata_v0(state); - let quorum_type = self.config.validator_set_quorum_type() as u32; - let GetEpochsInfoRequestV0 { + GetEpochsInfoRequestV0 { start_epoch, count, ascending, prove, - } = request; + }: GetEpochsInfoRequestV0, + platform_version: &PlatformVersion, + ) -> Result, Error> { + let state = self.state.read().unwrap(); let start_epoch = start_epoch.unwrap_or_else(|| { if ascending { @@ -54,36 +51,43 @@ impl Platform { )); } - let response_data = if prove { - let proof = check_validation_result_with_data!(self.drive.prove_epochs_infos( - start_epoch as u16, - count as u16, - ascending, - None, - platform_version - )); + let metadata = ResponseMetadata { + height: state.last_committed_height(), + core_chain_locked_height: state.last_committed_core_height(), + epoch: state.last_committed_block_epoch().index as u32, + time_ms: state.last_committed_block_time_ms().unwrap_or_default(), + chain_id: self.config.abci.chain_id.clone(), + protocol_version: state.current_protocol_version_in_consensus(), + }; - GetEpochsInfoResponse { - version: Some(get_epochs_info_response::Version::V0( - GetEpochsInfoResponseV0 { - result: Some( - get_epochs_info_response::get_epochs_info_response_v0::Result::Proof( - Proof { - grovedb_proof: proof, - quorum_hash: state.last_committed_quorum_hash().to_vec(), - quorum_type, - block_id_hash: state.last_committed_block_id_hash().to_vec(), - signature: state.last_committed_block_signature().to_vec(), - round: state.last_committed_block_round(), - }, - ), - ), - metadata: Some(metadata), - }, - )), + let response = if prove { + let mut proof_response = Proof { + grovedb_proof: Vec::new(), + quorum_hash: state.last_committed_quorum_hash().to_vec(), + quorum_type: self.config.validator_set_quorum_type() as u32, + block_id_hash: state.last_committed_block_id_hash().to_vec(), + signature: state.last_committed_block_signature().to_vec(), + round: state.last_committed_block_round(), + }; + + drop(state); + + proof_response.grovedb_proof = + check_validation_result_with_data!(self.drive.prove_epochs_infos( + start_epoch as u16, + count as u16, + ascending, + None, + platform_version + )); + + GetEpochsInfoResponseV0 { + result: Some(get_epochs_info_response_v0::Result::Proof(proof_response)), + metadata: Some(metadata), } - .encode_to_vec() } else { + drop(state); + let result = check_validation_result_with_data!(self.drive.get_epochs_infos( start_epoch as u16, count as u16, @@ -91,33 +95,80 @@ impl Platform { None, platform_version )); + let epoch_infos = result .into_iter() - .map(|epoch_info| { - get_epochs_info_response::get_epochs_info_response_v0::EpochInfo { - number: epoch_info.index() as u32, - first_block_height: epoch_info.first_block_height(), - first_core_block_height: epoch_info.first_core_block_height(), - start_time: epoch_info.first_block_time(), - fee_multiplier: epoch_info.fee_multiplier(), - } + .map(|epoch_info| get_epochs_info_response_v0::EpochInfo { + number: epoch_info.index() as u32, + first_block_height: epoch_info.first_block_height(), + first_core_block_height: epoch_info.first_core_block_height(), + start_time: epoch_info.first_block_time(), + fee_multiplier: epoch_info.fee_multiplier(), }) .collect(); - GetEpochsInfoResponse { - version: Some(get_epochs_info_response::Version::V0( - GetEpochsInfoResponseV0 { - result: Some( - get_epochs_info_response::get_epochs_info_response_v0::Result::Epochs( - EpochInfos { epoch_infos }, - ), - ), - metadata: Some(metadata), - }, - )), + GetEpochsInfoResponseV0 { + result: Some(get_epochs_info_response_v0::Result::Epochs(EpochInfos { + epoch_infos, + })), + metadata: Some(metadata), } - .encode_to_vec() }; - Ok(QueryValidationResult::new_with_data(response_data)) + + Ok(QueryValidationResult::new_with_data(response)) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::query::tests::setup_platform; + + #[test] + fn test_query_empty_epoch_infos() { + let (platform, version) = setup_platform(); + + let request = GetEpochsInfoRequestV0 { + start_epoch: None, // 0 + count: 5, + ascending: true, + prove: false, + }; + + let result = platform + .query_epoch_infos_v0(request, version) + .expect("expected query to succeed"); + + assert!(matches!( + result.data, + Some(GetEpochsInfoResponseV0 { + result: Some(get_epochs_info_response_v0::Result::Epochs(EpochInfos { epoch_infos })), + metadata: Some(_), + }) if epoch_infos.is_empty() + )); + } + + #[test] + fn test_query_empty_epoch_infos_descending() { + let (platform, version) = setup_platform(); + + let request = GetEpochsInfoRequestV0 { + start_epoch: None, // 0 + count: 5, + ascending: false, + prove: false, + }; + + let validation_result = platform + .query_epoch_infos_v0(request, version) + .expect("expected query to succeed"); + + assert!(matches!( + validation_result.data, + Some(GetEpochsInfoResponseV0 { + result: Some(get_epochs_info_response_v0::Result::Epochs(EpochInfos { epoch_infos })), + metadata: Some(_), + }) if epoch_infos.is_empty() + )); } } diff --git a/packages/rs-drive-abci/src/query/system/version_upgrade_state/mod.rs b/packages/rs-drive-abci/src/query/system/version_upgrade_state/mod.rs index 112fbc98c6..1c98a8be1c 100644 --- a/packages/rs-drive-abci/src/query/system/version_upgrade_state/mod.rs +++ b/packages/rs-drive-abci/src/query/system/version_upgrade_state/mod.rs @@ -3,29 +3,22 @@ mod v0; use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; -use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; -use dapi_grpc::platform::v0::get_protocol_version_upgrade_state_request::Version; -use dapi_grpc::platform::v0::GetProtocolVersionUpgradeStateRequest; +use dapi_grpc::platform::v0::get_protocol_version_upgrade_state_request::Version as RequestVersion; +use dapi_grpc::platform::v0::get_protocol_version_upgrade_state_response::Version as ResponseVersion; +use dapi_grpc::platform::v0::{ + GetProtocolVersionUpgradeStateRequest, GetProtocolVersionUpgradeStateResponse, +}; use dapi_grpc::Message; -use dpp::check_validation_result_with_data; -use dpp::validation::ValidationResult; use dpp::version::PlatformVersion; impl Platform { /// Querying of version upgrade state - pub(in crate::query) fn query_version_upgrade_state( + pub fn query_version_upgrade_state( &self, - state: &PlatformState, - query_data: &[u8], + GetProtocolVersionUpgradeStateRequest { version }: GetProtocolVersionUpgradeStateRequest, platform_version: &PlatformVersion, - ) -> Result>, Error> { - let GetProtocolVersionUpgradeStateRequest { version } = check_validation_result_with_data!( - GetProtocolVersionUpgradeStateRequest::decode(query_data).map_err(|e| { - QueryError::InvalidArgument(format!("invalid query proto message: {}", e)) - }) - ); - + ) -> Result, Error> { let Some(version) = version else { return Ok(QueryValidationResult::new_with_error( QueryError::DecodingError("could not decode identity keys query".to_string()), @@ -39,7 +32,7 @@ impl Platform { .version_upgrade_state; let feature_version = match &version { - Version::V0(_) => 0, + RequestVersion::V0(_) => 0, }; if !feature_version_bounds.check_version(feature_version) { return Ok(QueryValidationResult::new_with_error( @@ -53,12 +46,15 @@ impl Platform { )); } match version { - Version::V0(get_protocol_version_upgrade_state_request) => self - .query_version_upgrade_state_v0( - state, - get_protocol_version_upgrade_state_request, - platform_version, - ), + RequestVersion::V0(request_v0) => { + let result = self.query_version_upgrade_state_v0(request_v0, platform_version)?; + + Ok( + result.map(|response_v0| GetProtocolVersionUpgradeStateResponse { + version: Some(ResponseVersion::V0(response_v0)), + }), + ) + } } } } diff --git a/packages/rs-drive-abci/src/query/system/version_upgrade_state/v0/mod.rs b/packages/rs-drive-abci/src/query/system/version_upgrade_state/v0/mod.rs index 27a751d246..a3d7b5e01c 100644 --- a/packages/rs-drive-abci/src/query/system/version_upgrade_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/system/version_upgrade_state/v0/mod.rs @@ -1,60 +1,36 @@ use crate::error::Error; use crate::platform_types::platform::Platform; -use crate::platform_types::platform_state::v0::PlatformStateV0Methods; -use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; -use dapi_grpc::platform::v0::{ - get_protocol_version_upgrade_state_response, GetProtocolVersionUpgradeStateResponse, Proof, -}; use dpp::check_validation_result_with_data; use dpp::validation::ValidationResult; use dpp::version::PlatformVersion; -use dapi_grpc::Message; use dapi_grpc::platform::v0::get_protocol_version_upgrade_state_request::GetProtocolVersionUpgradeStateRequestV0; use dapi_grpc::platform::v0::get_protocol_version_upgrade_state_response::get_protocol_version_upgrade_state_response_v0::{VersionEntry, Versions}; -use dapi_grpc::platform::v0::get_protocol_version_upgrade_state_response::GetProtocolVersionUpgradeStateResponseV0; +use dapi_grpc::platform::v0::get_protocol_version_upgrade_state_response::{get_protocol_version_upgrade_state_response_v0, GetProtocolVersionUpgradeStateResponseV0}; impl Platform { pub(super) fn query_version_upgrade_state_v0( &self, - state: &PlatformState, - request: GetProtocolVersionUpgradeStateRequestV0, + GetProtocolVersionUpgradeStateRequestV0 { prove }: GetProtocolVersionUpgradeStateRequestV0, platform_version: &PlatformVersion, - ) -> Result>, Error> { - let metadata = self.response_metadata_v0(state); - let quorum_type = self.config.validator_set_quorum_type() as u32; - let GetProtocolVersionUpgradeStateRequestV0 { prove } = request; - - let response_data = if prove { + ) -> Result, Error> { + let response = if prove { let proof = check_validation_result_with_data!(self .drive .fetch_proved_versions_with_counter(None, &platform_version.drive)); - GetProtocolVersionUpgradeStateResponse { - version: Some(get_protocol_version_upgrade_state_response::Version::V0( - GetProtocolVersionUpgradeStateResponseV0 { - result: Some( - get_protocol_version_upgrade_state_response::get_protocol_version_upgrade_state_response_v0::Result::Proof( - Proof { - grovedb_proof: proof, - quorum_hash: state.last_committed_quorum_hash().to_vec(), - quorum_type, - block_id_hash: state.last_committed_block_id_hash().to_vec(), - signature: state.last_committed_block_signature().to_vec(), - round: state.last_committed_block_round(), - }, - ), - ), - metadata: Some(metadata), - }, - )), + let (metadata, proof) = self.response_metadata_and_proof_v0(proof); + + GetProtocolVersionUpgradeStateResponseV0 { + result: Some(get_protocol_version_upgrade_state_response_v0::Result::Proof(proof)), + metadata: Some(metadata), } - .encode_to_vec() } else { - let drive_cache = self.drive.cache.read().unwrap(); - let versions = drive_cache - .protocol_versions_counter + let protocol_versions_counter = + self.drive.cache.protocol_versions_counter.read().unwrap(); + + let versions = protocol_versions_counter .global_cache .iter() .map(|(protocol_version, count)| VersionEntry { @@ -63,20 +39,300 @@ impl Platform { }) .collect(); - GetProtocolVersionUpgradeStateResponse { - version: Some(get_protocol_version_upgrade_state_response::Version::V0( - GetProtocolVersionUpgradeStateResponseV0 { - result: Some( - get_protocol_version_upgrade_state_response::get_protocol_version_upgrade_state_response_v0::Result::Versions( - Versions { versions }, - ), - ), - metadata: Some(metadata), - }, - )), + drop(protocol_versions_counter); + + GetProtocolVersionUpgradeStateResponseV0 { + result: Some( + get_protocol_version_upgrade_state_response_v0::Result::Versions(Versions { + versions, + }), + ), + metadata: Some(self.response_metadata_v0()), } - .encode_to_vec() }; - Ok(QueryValidationResult::new_with_data(response_data)) + + Ok(QueryValidationResult::new_with_data(response)) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::query::tests::setup_platform; + use drive::drive::grove_operations::BatchInsertApplyType; + use drive::drive::object_size_info::PathKeyElementInfo; + use drive::drive::protocol_upgrade::{ + desired_version_for_validators_path, versions_counter_path, versions_counter_path_vec, + }; + use drive::drive::Drive; + use drive::grovedb::{Element, GroveDb, PathQuery}; + use drive::query::{Query, QueryItem}; + use integer_encoding::VarInt; + use rand::rngs::StdRng; + use rand::{Rng, SeedableRng}; + use std::ops::RangeFull; + + #[test] + fn test_query_empty_upgrade_state() { + let (platform, version) = setup_platform(); + + let request = GetProtocolVersionUpgradeStateRequestV0 { prove: false }; + + let validation_result = platform + .query_version_upgrade_state_v0(request, version) + .expect("expected query to succeed"); + + assert!(matches!( + validation_result.data, + Some(GetProtocolVersionUpgradeStateResponseV0 { + result: Some(get_protocol_version_upgrade_state_response_v0::Result::Versions(versions)), + metadata: Some(_) + }) if versions.versions.is_empty() + )); + } + + #[test] + fn test_query_upgrade_state() { + let (platform, version) = setup_platform(); + + let mut rand = StdRng::seed_from_u64(10); + + let drive = &platform.drive; + + let mut version_counter = drive.cache.protocol_versions_counter.write().unwrap(); + + let transaction = drive.grove.start_transaction(); + + version_counter + .load_if_needed(drive, Some(&transaction), &version.drive) + .expect("expected to load version counter"); + + let path = desired_version_for_validators_path(); + let version_bytes = version.protocol_version.encode_var_vec(); + let version_element = Element::new_item(version_bytes.clone()); + + let validator_pro_tx_hash: [u8; 32] = rand.gen(); + + let mut operations = vec![]; + drive + .batch_insert_if_changed_value( + PathKeyElementInfo::PathFixedSizeKeyRefElement(( + path, + validator_pro_tx_hash.as_slice(), + version_element, + )), + BatchInsertApplyType::StatefulBatchInsert, + Some(&transaction), + &mut operations, + &version.drive, + ) + .expect("expected batch to insert"); + + let mut version_count = version_counter + .get(&version.protocol_version) + .cloned() + .unwrap_or_default(); + + version_count += 1; + + version_counter.set_block_cache_version_count(version.protocol_version, version_count); // push to block_cache + + drive + .batch_insert( + PathKeyElementInfo::PathFixedSizeKeyRefElement(( + versions_counter_path(), + version_bytes.as_slice(), + Element::new_item(version_count.encode_var_vec()), + )), + &mut operations, + &version.drive, + ) + .expect("expected batch to insert"); + + drive + .apply_batch_low_level_drive_operations( + None, + Some(&transaction), + operations, + &mut vec![], + &version.drive, + ) + .expect("expected to apply operations"); + + drive + .commit_transaction(transaction, &version.drive) + .expect("expected to commit"); + + version_counter.merge_block_cache(); + drop(version_counter); + + let request = GetProtocolVersionUpgradeStateRequestV0 { prove: false }; + + let validation_result = platform + .query_version_upgrade_state_v0(request, version) + .expect("expected query to succeed"); + + assert!(matches!( + validation_result.data, + Some(GetProtocolVersionUpgradeStateResponseV0 { + result: Some(get_protocol_version_upgrade_state_response_v0::Result::Versions(versions)), + metadata: Some(_) + }) if versions.versions.len() == 1 + )); + } + + #[test] + fn test_prove_empty_upgrade_state() { + let (platform, version) = setup_platform(); + + let request = GetProtocolVersionUpgradeStateRequestV0 { prove: true }; + + let validation_result = platform + .query_version_upgrade_state_v0(request, version) + .expect("expected query to succeed"); + + let path_query = PathQuery::new_unsized( + versions_counter_path_vec(), + Query::new_single_query_item(QueryItem::RangeFull(RangeFull)), + ); + + // we just started chain, there should be no versions + + if let Some(GetProtocolVersionUpgradeStateResponseV0 { + result: Some(get_protocol_version_upgrade_state_response_v0::Result::Proof(proof)), + metadata: Some(_), + }) = validation_result.data + { + let elements = GroveDb::verify_query(proof.grovedb_proof.as_slice(), &path_query) + .expect("expected to be able to verify query") + .1; + + assert!(elements.is_empty()); + } else { + panic!("expected a proof"); + } + } + + #[test] + fn test_prove_upgrade_state() { + let (platform, version) = setup_platform(); + + let mut rand = StdRng::seed_from_u64(10); + + let drive = &platform.drive; + + let version_counter = &mut drive.cache.protocol_versions_counter.write().unwrap(); + + let transaction = drive.grove.start_transaction(); + + version_counter + .load_if_needed(drive, Some(&transaction), &version.drive) + .expect("expected to load version counter"); + + let path = desired_version_for_validators_path(); + let version_bytes = version.protocol_version.encode_var_vec(); + let version_element = Element::new_item(version_bytes.clone()); + + let validator_pro_tx_hash: [u8; 32] = rand.gen(); + + let mut operations = vec![]; + drive + .batch_insert_if_changed_value( + PathKeyElementInfo::PathFixedSizeKeyRefElement(( + path, + validator_pro_tx_hash.as_slice(), + version_element, + )), + BatchInsertApplyType::StatefulBatchInsert, + Some(&transaction), + &mut operations, + &version.drive, + ) + .expect("expected batch to insert"); + + let mut version_count = version_counter + .get(&version.protocol_version) + .cloned() + .unwrap_or_default(); + + version_count += 1; + + version_counter.set_block_cache_version_count(version.protocol_version, version_count); // push to block_cache + + drive + .batch_insert( + PathKeyElementInfo::PathFixedSizeKeyRefElement(( + versions_counter_path(), + version_bytes.as_slice(), + Element::new_item(version_count.encode_var_vec()), + )), + &mut operations, + &version.drive, + ) + .expect("expected batch to insert"); + + drive + .apply_batch_low_level_drive_operations( + None, + Some(&transaction), + operations, + &mut vec![], + &version.drive, + ) + .expect("expected to apply operations"); + + drive + .commit_transaction(transaction, &version.drive) + .expect("expected to commit"); + + version_counter.merge_block_cache(); + + let request = GetProtocolVersionUpgradeStateRequestV0 { prove: true }; + + let validation_result = platform + .query_version_upgrade_state_v0(request, version) + .expect("expected query to succeed"); + + let Some(GetProtocolVersionUpgradeStateResponseV0 { + result: Some(get_protocol_version_upgrade_state_response_v0::Result::Proof(proof)), + metadata: Some(_), + }) = validation_result.data + else { + panic!("expected a proof"); + }; + + let path_query = PathQuery::new_unsized( + versions_counter_path_vec(), + Query::new_single_query_item(QueryItem::RangeFull(RangeFull)), + ); + + let elements = GroveDb::verify_query(proof.grovedb_proof.as_slice(), &path_query) + .expect("expected to be able to verify query") + .1; + + // we just started chain, there should be no versions + + assert_eq!(elements.len(), 1); + + let (_, _, element) = elements.first().unwrap(); + + assert!(element.is_some()); + + let element = element.clone().unwrap(); + + let count_bytes = element.as_item_bytes().expect("expected item bytes"); + + let count = u16::decode_var(count_bytes) + .expect("expected to decode var int") + .0; + + assert_eq!(count, 1); + + let upgrade = Drive::verify_upgrade_state(proof.grovedb_proof.as_slice(), version) + .expect("expected to verify the upgrade counts") + .1; + + assert_eq!(upgrade.len(), 1); + assert_eq!(upgrade.get(&1), Some(1).as_ref()); } } diff --git a/packages/rs-drive-abci/src/query/system/version_upgrade_vote_status/mod.rs b/packages/rs-drive-abci/src/query/system/version_upgrade_vote_status/mod.rs index 0d3ffa4e63..96816cee56 100644 --- a/packages/rs-drive-abci/src/query/system/version_upgrade_vote_status/mod.rs +++ b/packages/rs-drive-abci/src/query/system/version_upgrade_vote_status/mod.rs @@ -3,29 +3,21 @@ mod v0; use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; -use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; -use dapi_grpc::platform::v0::get_protocol_version_upgrade_vote_status_request::Version; -use dapi_grpc::platform::v0::GetProtocolVersionUpgradeVoteStatusRequest; -use dapi_grpc::Message; -use dpp::check_validation_result_with_data; -use dpp::validation::ValidationResult; +use dapi_grpc::platform::v0::get_protocol_version_upgrade_vote_status_request::Version as RequestVersion; +use dapi_grpc::platform::v0::get_protocol_version_upgrade_vote_status_response::Version as ResponseVersion; +use dapi_grpc::platform::v0::{ + GetProtocolVersionUpgradeVoteStatusRequest, GetProtocolVersionUpgradeVoteStatusResponse, +}; use dpp::version::PlatformVersion; impl Platform { /// Querying of version upgrade vote status - pub(in crate::query) fn query_version_upgrade_vote_status( + pub fn query_version_upgrade_vote_status( &self, - state: &PlatformState, - query_data: &[u8], + GetProtocolVersionUpgradeVoteStatusRequest { version } : GetProtocolVersionUpgradeVoteStatusRequest, platform_version: &PlatformVersion, - ) -> Result>, Error> { - let GetProtocolVersionUpgradeVoteStatusRequest { version } = check_validation_result_with_data!( - GetProtocolVersionUpgradeVoteStatusRequest::decode(query_data).map_err(|e| { - QueryError::InvalidArgument(format!("invalid query proto message: {}", e)) - }) - ); - + ) -> Result, Error> { let Some(version) = version else { return Ok(QueryValidationResult::new_with_error( QueryError::DecodingError("could not decode identity keys query".to_string()), @@ -39,7 +31,7 @@ impl Platform { .version_upgrade_vote_status; let feature_version = match &version { - Version::V0(_) => 0, + RequestVersion::V0(_) => 0, }; if !feature_version_bounds.check_version(feature_version) { return Ok(QueryValidationResult::new_with_error( @@ -53,12 +45,16 @@ impl Platform { )); } match version { - Version::V0(get_protocol_version_upgrade_vote_status_request) => self - .query_version_upgrade_vote_status_v0( - state, - get_protocol_version_upgrade_vote_status_request, - platform_version, - ), + RequestVersion::V0(request_v0) => { + let result = + self.query_version_upgrade_vote_status_v0(request_v0, platform_version)?; + + Ok( + result.map(|response_v0| GetProtocolVersionUpgradeVoteStatusResponse { + version: Some(ResponseVersion::V0(response_v0)), + }), + ) + } } } } diff --git a/packages/rs-drive-abci/src/query/system/version_upgrade_vote_status/v0/mod.rs b/packages/rs-drive-abci/src/query/system/version_upgrade_vote_status/v0/mod.rs index f60e32785a..37a5ade56b 100644 --- a/packages/rs-drive-abci/src/query/system/version_upgrade_vote_status/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/system/version_upgrade_vote_status/v0/mod.rs @@ -1,37 +1,25 @@ use crate::error::Error; use crate::platform_types::platform::Platform; -use crate::platform_types::platform_state::v0::PlatformStateV0Methods; -use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; -use dapi_grpc::platform::v0::{ - get_protocol_version_upgrade_vote_status_response, GetProtocolVersionUpgradeVoteStatusResponse, - Proof, -}; use dpp::check_validation_result_with_data; use dpp::validation::ValidationResult; use dpp::version::PlatformVersion; -use dapi_grpc::Message; use dapi_grpc::platform::v0::get_protocol_version_upgrade_vote_status_request::GetProtocolVersionUpgradeVoteStatusRequestV0; use dapi_grpc::platform::v0::get_protocol_version_upgrade_vote_status_response::get_protocol_version_upgrade_vote_status_response_v0::{VersionSignal, VersionSignals}; -use dapi_grpc::platform::v0::get_protocol_version_upgrade_vote_status_response::GetProtocolVersionUpgradeVoteStatusResponseV0; +use dapi_grpc::platform::v0::get_protocol_version_upgrade_vote_status_response::{get_protocol_version_upgrade_vote_status_response_v0, GetProtocolVersionUpgradeVoteStatusResponseV0}; use crate::error::query::QueryError; impl Platform { pub(super) fn query_version_upgrade_vote_status_v0( &self, - state: &PlatformState, - request: GetProtocolVersionUpgradeVoteStatusRequestV0, - platform_version: &PlatformVersion, - ) -> Result>, Error> { - let metadata = self.response_metadata_v0(state); - let quorum_type = self.config.validator_set_quorum_type() as u32; - let GetProtocolVersionUpgradeVoteStatusRequestV0 { + GetProtocolVersionUpgradeVoteStatusRequestV0 { start_pro_tx_hash, count, prove, - } = request; - + }: GetProtocolVersionUpgradeVoteStatusRequestV0, + platform_version: &PlatformVersion, + ) -> Result, Error> { let start_pro_tx_hash: Option<[u8; 32]> = if start_pro_tx_hash.is_empty() { None } else { @@ -54,7 +42,7 @@ impl Platform { )); } - let response_data = if prove { + let response = if prove { let proof = check_validation_result_with_data!(self .drive .fetch_proved_validator_version_votes( @@ -64,26 +52,14 @@ impl Platform { &platform_version.drive )); - GetProtocolVersionUpgradeVoteStatusResponse { - version: Some(get_protocol_version_upgrade_vote_status_response::Version::V0( - GetProtocolVersionUpgradeVoteStatusResponseV0 { - result: Some( - get_protocol_version_upgrade_vote_status_response::get_protocol_version_upgrade_vote_status_response_v0::Result::Proof( - Proof { - grovedb_proof: proof, - quorum_hash: state.last_committed_quorum_hash().to_vec(), - quorum_type, - block_id_hash: state.last_committed_block_id_hash().to_vec(), - signature: state.last_committed_block_signature().to_vec(), - round: state.last_committed_block_round(), - }, - ), - ), - metadata: Some(metadata), - }, - )), + let (metadata, proof) = self.response_metadata_and_proof_v0(proof); + + GetProtocolVersionUpgradeVoteStatusResponseV0 { + result: Some( + get_protocol_version_upgrade_vote_status_response_v0::Result::Proof(proof), + ), + metadata: Some(metadata), } - .encode_to_vec() } else { let result = check_validation_result_with_data!(self.drive.fetch_validator_version_votes( @@ -100,22 +76,333 @@ impl Platform { }) .collect(); - GetProtocolVersionUpgradeVoteStatusResponse { - version: Some(get_protocol_version_upgrade_vote_status_response::Version::V0( - GetProtocolVersionUpgradeVoteStatusResponseV0 { - result: Some( - get_protocol_version_upgrade_vote_status_response::get_protocol_version_upgrade_vote_status_response_v0::Result::Versions( - VersionSignals { - version_signals: versions, - }, - ), - ), - metadata: Some(metadata), - }, + GetProtocolVersionUpgradeVoteStatusResponseV0 { + result: Some( + get_protocol_version_upgrade_vote_status_response_v0::Result::Versions( + VersionSignals { + version_signals: versions, + }, + ), + ), + metadata: Some(self.response_metadata_v0()), + } + }; + + Ok(QueryValidationResult::new_with_data(response)) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::query::tests::setup_platform; + use drive::drive::grove_operations::BatchInsertApplyType; + use drive::drive::object_size_info::PathKeyElementInfo; + use drive::drive::protocol_upgrade::{ + desired_version_for_validators_path, desired_version_for_validators_path_vec, + versions_counter_path, + }; + use drive::drive::Drive; + use drive::grovedb::{Element, GroveDb, QueryItem, SizedQuery}; + use drive::query::{PathQuery, Query}; + use integer_encoding::VarInt; + use rand::rngs::StdRng; + use rand::{Rng, SeedableRng}; + + #[test] + fn test_query_empty_upgrade_vote_status() { + let (platform, version) = setup_platform(); + + let mut rand = StdRng::seed_from_u64(10); + + let validator_pro_tx_hash: [u8; 32] = rand.gen(); + + let request = GetProtocolVersionUpgradeVoteStatusRequestV0 { + start_pro_tx_hash: validator_pro_tx_hash.to_vec(), + count: 5, + prove: false, + }; + + let validation_result = platform + .query_version_upgrade_vote_status_v0(request, version) + .expect("expected query to succeed"); + + assert!(matches!(validation_result.data, Some( + GetProtocolVersionUpgradeVoteStatusResponseV0 { + result: Some(get_protocol_version_upgrade_vote_status_response_v0::Result::Versions(VersionSignals { version_signals })) , + metadata: Some(_), + } + ) if version_signals.is_empty())); + } + + #[test] + fn test_query_upgrade_vote_status() { + let (platform, version) = setup_platform(); + + let mut rand = StdRng::seed_from_u64(10); + + let validator_pro_tx_hash: [u8; 32] = rand.gen(); + + let drive = &platform.drive; + + let version_counter = &mut drive.cache.protocol_versions_counter.write().unwrap(); + let transaction = drive.grove.start_transaction(); + + version_counter + .load_if_needed(drive, Some(&transaction), &version.drive) + .expect("expected to load version counter"); + + let path = desired_version_for_validators_path(); + let version_bytes = version.protocol_version.encode_var_vec(); + let version_element = Element::new_item(version_bytes.clone()); + + let mut operations = vec![]; + drive + .batch_insert_if_changed_value( + PathKeyElementInfo::PathFixedSizeKeyRefElement(( + path, + validator_pro_tx_hash.as_slice(), + version_element, + )), + BatchInsertApplyType::StatefulBatchInsert, + Some(&transaction), + &mut operations, + &version.drive, + ) + .expect("expected batch to insert"); + + let mut version_count = version_counter + .get(&version.protocol_version) + .cloned() + .unwrap_or_default(); + + version_count += 1; + + version_counter.set_block_cache_version_count(version.protocol_version, version_count); // push to block_cache + + drive + .batch_insert( + PathKeyElementInfo::PathFixedSizeKeyRefElement(( + versions_counter_path(), + version_bytes.as_slice(), + Element::new_item(version_count.encode_var_vec()), )), + &mut operations, + &version.drive, + ) + .expect("expected batch to insert"); + + drive + .apply_batch_low_level_drive_operations( + None, + Some(&transaction), + operations, + &mut vec![], + &version.drive, + ) + .expect("expected to apply operations"); + + drive + .commit_transaction(transaction, &version.drive) + .expect("expected to commit"); + + version_counter.merge_block_cache(); + + let request = GetProtocolVersionUpgradeVoteStatusRequestV0 { + start_pro_tx_hash: validator_pro_tx_hash.to_vec(), + count: 5, + prove: false, + }; + + let validation_result = platform + .query_version_upgrade_vote_status_v0(request, version) + .expect("expected query to succeed"); + + assert!(matches!(validation_result.data, Some( + GetProtocolVersionUpgradeVoteStatusResponseV0 { + result: Some(get_protocol_version_upgrade_vote_status_response_v0::Result::Versions(VersionSignals { version_signals })) , + metadata: Some(_), } - .encode_to_vec() + ) if version_signals.len() == 1)); + } + + #[test] + fn test_prove_empty_upgrade_vote_status() { + let (platform, version) = setup_platform(); + + let mut rand = StdRng::seed_from_u64(10); + + let validator_pro_tx_hash: [u8; 32] = rand.gen(); + + let request = GetProtocolVersionUpgradeVoteStatusRequestV0 { + start_pro_tx_hash: validator_pro_tx_hash.to_vec(), + count: 5, + prove: true, + }; + + let validation_result = platform + .query_version_upgrade_vote_status_v0(request, version) + .expect("expected query to succeed"); + + let Some(GetProtocolVersionUpgradeVoteStatusResponseV0 { + result: Some(get_protocol_version_upgrade_vote_status_response_v0::Result::Proof(proof)), + metadata: Some(_), + }) = validation_result.data + else { + panic!("expected a proof") + }; + + let path = desired_version_for_validators_path_vec(); + + let query_item = QueryItem::RangeFrom(validator_pro_tx_hash.to_vec()..); + + let path_query = PathQuery::new( + path, + SizedQuery::new(Query::new_single_query_item(query_item), Some(5), None), + ); + + let elements = GroveDb::verify_query(proof.grovedb_proof.as_slice(), &path_query) + .expect("expected to be able to verify query") + .1; + + // we just started chain, there should be no versions + + assert!(elements.is_empty()) + } + + #[test] + fn test_prove_upgrade_vote_status() { + let (platform, version) = setup_platform(); + + let mut rand = StdRng::seed_from_u64(10); + + let drive = &platform.drive; + + let version_counter = &mut drive.cache.protocol_versions_counter.write().unwrap(); + + let transaction = drive.grove.start_transaction(); + + version_counter + .load_if_needed(drive, Some(&transaction), &version.drive) + .expect("expected to load version counter"); + + let path = desired_version_for_validators_path(); + let version_bytes = version.protocol_version.encode_var_vec(); + let version_element = Element::new_item(version_bytes.clone()); + + let validator_pro_tx_hash: [u8; 32] = rand.gen(); + + let mut operations = vec![]; + drive + .batch_insert_if_changed_value( + PathKeyElementInfo::PathFixedSizeKeyRefElement(( + path, + validator_pro_tx_hash.as_slice(), + version_element, + )), + BatchInsertApplyType::StatefulBatchInsert, + Some(&transaction), + &mut operations, + &version.drive, + ) + .expect("expected batch to insert"); + + let mut version_count = version_counter + .get(&version.protocol_version) + .cloned() + .unwrap_or_default(); + + version_count += 1; + + version_counter.set_block_cache_version_count(version.protocol_version, version_count); // push to block_cache + + drive + .batch_insert( + PathKeyElementInfo::PathFixedSizeKeyRefElement(( + versions_counter_path(), + version_bytes.as_slice(), + Element::new_item(version_count.encode_var_vec()), + )), + &mut operations, + &version.drive, + ) + .expect("expected batch to insert"); + + drive + .apply_batch_low_level_drive_operations( + None, + Some(&transaction), + operations, + &mut vec![], + &version.drive, + ) + .expect("expected to apply operations"); + + drive + .commit_transaction(transaction, &version.drive) + .expect("expected to commit"); + + version_counter.merge_block_cache(); + + let request = GetProtocolVersionUpgradeVoteStatusRequestV0 { + start_pro_tx_hash: validator_pro_tx_hash.to_vec(), + count: 5, + prove: true, }; - Ok(QueryValidationResult::new_with_data(response_data)) + + let validation_result = platform + .query_version_upgrade_vote_status_v0(request, version) + .expect("expected query to succeed"); + + let Some(GetProtocolVersionUpgradeVoteStatusResponseV0 { + result: Some(get_protocol_version_upgrade_vote_status_response_v0::Result::Proof(proof)), + metadata: Some(_), + }) = validation_result.data + else { + panic!("expected a proof") + }; + + let path = desired_version_for_validators_path_vec(); + + let query_item = QueryItem::RangeFrom(validator_pro_tx_hash.to_vec()..); + + let path_query = PathQuery::new( + path, + SizedQuery::new(Query::new_single_query_item(query_item), Some(5), None), + ); + + let elements = GroveDb::verify_query(proof.grovedb_proof.as_slice(), &path_query) + .expect("expected to be able to verify query") + .1; + + // we just started chain, there should be no versions + + assert_eq!(elements.len(), 1); + + let (_, _, element) = elements.first().unwrap(); + + assert!(element.is_some()); + + let element = element.clone().unwrap(); + + let count_bytes = element.as_item_bytes().expect("expected item bytes"); + + let count = u16::decode_var(count_bytes) + .expect("expected to decode var int") + .0; + + assert_eq!(count, 1); + + let upgrade = Drive::verify_upgrade_vote_status( + proof.grovedb_proof.as_slice(), + Some(validator_pro_tx_hash), + 5, + version, + ) + .expect("expected to verify the upgrade counts") + .1; + + assert_eq!(upgrade.len(), 1); + assert_eq!(upgrade.get(&validator_pro_tx_hash), Some(1).as_ref()); } } diff --git a/packages/rs-drive-abci/src/query/v0/mod.rs b/packages/rs-drive-abci/src/query/v0/mod.rs deleted file mode 100644 index 01c62e8172..0000000000 --- a/packages/rs-drive-abci/src/query/v0/mod.rs +++ /dev/null @@ -1,457 +0,0 @@ -use crate::error::query::QueryError; -use crate::error::Error; -use crate::platform_types::platform::Platform; - -use crate::query::QueryValidationResult; - -use dpp::version::PlatformVersion; - -impl Platform { - /// Querying - pub(super) fn query_v0( - &self, - query_path: &str, - query_data: &[u8], - platform_version: &PlatformVersion, - ) -> Result>, Error> { - let state = self.state.read().unwrap(); - match query_path { - "/identity" => self.query_identity(&state, query_data, platform_version), - "/identities" => self.query_identities(&state, query_data, platform_version), - "/identity/contractNonce" => { - self.query_identity_contract_nonce(&state, query_data, platform_version) - } - "/identity/nonce" => self.query_identity_nonce(&state, query_data, platform_version), - "/identity/balance" => self.query_balance(&state, query_data, platform_version), - "/identity/balanceAndRevision" => { - self.query_balance_and_revision(&state, query_data, platform_version) - } - "/identity/keys" => self.query_keys(&state, query_data, platform_version), - "/identity/by-public-key-hash" => { - self.query_identity_by_public_key_hash(&state, query_data, platform_version) - } - "/identities/by-public-key-hash" => { - self.query_identities_by_public_key_hashes(&state, query_data, platform_version) - } - "/dataContract" => self.query_data_contract(&state, query_data, platform_version), - "/dataContracts" => self.query_data_contracts(&state, query_data, platform_version), - "/dataContractHistory" => { - self.query_data_contract_history(&state, query_data, platform_version) - } - "/documents" | "/dataContract/documents" => { - self.query_documents(&state, query_data, platform_version) - } - "/proofs" => self.query_proofs(&state, query_data, platform_version), - "/versionUpgrade/state" => { - self.query_version_upgrade_state(&state, query_data, platform_version) - } - "/versionUpgrade/voteStatus" => { - self.query_version_upgrade_vote_status(&state, query_data, platform_version) - } - "/epochInfos" => self.query_epoch_infos(&state, query_data, platform_version), - other => Ok(QueryValidationResult::new_with_error( - QueryError::InvalidArgument(format!("query path '{}' is not supported", other)), - )), - } - } -} - -#[cfg(test)] -mod test { - pub mod query_data_contract_history { - use crate::rpc::core::MockCoreRPCLike; - use crate::test::helpers::setup::{TempPlatform, TestPlatformBuilder}; - use dapi_grpc::platform::v0::{ - get_data_contract_history_request, get_data_contract_history_response, - GetDataContractHistoryRequest, GetDataContractHistoryResponse, - }; - use dpp::block::block_info::BlockInfo; - - use crate::platform_types::platform_state::v0::PlatformStateV0Methods; - use dpp::data_contract::accessors::v0::DataContractV0Getters; - use dpp::data_contract::config::v0::DataContractConfigSettersV0; - - use crate::error::query::QueryError; - use dapi_grpc::platform::v0::get_data_contract_history_request::GetDataContractHistoryRequestV0; - use dapi_grpc::platform::v0::get_data_contract_history_response::{ - get_data_contract_history_response_v0, GetDataContractHistoryResponseV0, - }; - use dapi_grpc::Message; - use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; - use dpp::data_contract::schema::DataContractSchemaMethodsV0; - use dpp::data_contract::DataContract; - use dpp::platform_value::platform_value; - use dpp::serialization::PlatformDeserializableWithPotentialValidationFromVersionedStructure; - use dpp::tests::fixtures::get_data_contract_fixture; - use dpp::validation::ValidationResult; - use dpp::version::PlatformVersion; - use drive::drive::Drive; - - fn default_request_v0() -> GetDataContractHistoryRequestV0 { - GetDataContractHistoryRequestV0 { - id: vec![1; 32], - limit: Some(10), - offset: Some(0), - start_at_ms: 0, - prove: false, - } - } - - /// Set up simple contract history with one update - fn set_up_history(platform: &TempPlatform) -> DataContract { - let state = platform.platform.state.read().unwrap(); - let current_protocol_version = state.current_protocol_version_in_consensus(); - let platform_version = PlatformVersion::get(current_protocol_version) - .expect("expected to get platform version"); - drop(state); - let mut data_contract = - get_data_contract_fixture(None, 0, current_protocol_version).data_contract_owned(); - data_contract.config_mut().set_keeps_history(true); - data_contract.config_mut().set_readonly(false); - - platform - .drive - .apply_contract( - &data_contract, - BlockInfo { - time_ms: 1000, - height: 10, - core_height: 20, - epoch: Default::default(), - }, - true, - None, - None, - platform_version, - ) - .expect("To apply contract"); - - let mut updated_data_contract = data_contract.clone(); - - let updated_document_schema = platform_value!({ - "type": "object", - "properties": { - "name": { - "type": "string", - "position": 0 - }, - "newProp": { - "type": "integer", - "minimum": 0, - "position": 1 - } - }, - "required": [ - "$createdAt" - ], - "additionalProperties": false - }); - - updated_data_contract - .set_document_schema( - "niceDocument", - updated_document_schema, - true, - platform_version, - ) - .expect("to be able to set document schema"); - - platform - .drive - .apply_contract( - &updated_data_contract, - BlockInfo { - time_ms: 2000, - height: 11, - core_height: 21, - epoch: Default::default(), - }, - true, - None, - None, - platform_version, - ) - .expect("To apply contract"); - - data_contract - } - - struct TestData { - platform: TempPlatform, - original_data_contract: DataContract, - } - - fn set_up_test() -> TestData { - let platform = TestPlatformBuilder::new() - .build_with_mock_rpc() - .set_initial_state_structure(); - - let original_data_contract = set_up_history(&platform); - - TestData { - platform, - original_data_contract, - } - } - - #[test] - pub fn should_return_contract_history_with_no_errors_if_parameters_are_valid() { - let platform_version = PlatformVersion::latest(); - - let TestData { - platform, - original_data_contract, - } = set_up_test(); - - let request = GetDataContractHistoryRequest { - version: Some(get_data_contract_history_request::Version::V0( - GetDataContractHistoryRequestV0 { - id: original_data_contract.id().to_vec(), - ..default_request_v0() - }, - )), - }; - - let request_data = request.encode_to_vec(); - - let result = platform - .query_v0("/dataContractHistory", &request_data, platform_version) - .expect("To return result"); - - let ValidationResult { errors, data } = result; - - assert!( - errors.is_empty(), - "expect no errors to be returned from the query" - ); - - let data = data.expect("expect data to be returned from the query"); - let _data_ref = data.as_slice(); - - let response = GetDataContractHistoryResponse::decode(data.as_slice()) - .expect("To decode response"); - - let GetDataContractHistoryResponse { version } = response; - - let get_data_contract_history_response::Version::V0(GetDataContractHistoryResponseV0 { - result, - metadata: _, - }) = version.expect("expected a versioned response"); - - let res = result.expect("expect result to be returned from the query"); - - let contract_history = match res { - get_data_contract_history_response_v0::Result::DataContractHistory( - data_contract_history, - ) => data_contract_history, - get_data_contract_history_response_v0::Result::Proof(_) => { - panic!("expect result to be DataContractHistory"); - } - }; - - let mut history_entries = contract_history.data_contract_entries; - assert_eq!(history_entries.len(), 2); - - let second_entry = history_entries.pop().unwrap(); - let first_entry = history_entries.pop().unwrap(); - - assert_eq!(first_entry.date, 1000); - let first_entry_data_contract = first_entry.value; - let first_data_contract_update = DataContract::versioned_deserialize( - &first_entry_data_contract, - true, - platform_version, - ) - .expect("To decode data contract"); - assert_eq!(first_data_contract_update, original_data_contract); - - assert_eq!(second_entry.date, 2000); - - let second_entry_data_contract = second_entry.value; - - let second_data_contract_update = DataContract::versioned_deserialize( - &second_entry_data_contract, - true, - platform_version, - ) - .expect("To decode data contract"); - - let updated_doc = second_data_contract_update - .document_type_for_name("niceDocument") - .expect("should return document type"); - - assert!( - updated_doc.properties().contains_key("newProp"), - "expect data contract to have newProp field", - ); - } - - #[test] - pub fn should_return_contract_history_proofs_with_no_errors_if_parameters_are_valid() { - let platform_version = PlatformVersion::latest(); - let TestData { - platform, - original_data_contract, - } = set_up_test(); - - let request_v0 = GetDataContractHistoryRequestV0 { - id: original_data_contract.id().to_vec(), - prove: true, - ..default_request_v0() - }; - - let start_at_ms = request_v0.start_at_ms; - - let request = GetDataContractHistoryRequest { - version: Some(get_data_contract_history_request::Version::V0(request_v0)), - }; - - let request_data = request.encode_to_vec(); - - let result = platform - .query_v0("/dataContractHistory", &request_data, platform_version) - .expect("To return result"); - - let ValidationResult { errors, data } = result; - - assert!( - errors.is_empty(), - "expect no errors to be returned from the query" - ); - - let data = data.expect("expect data to be returned from the query"); - let _data_ref = data.as_slice(); - - let response = GetDataContractHistoryResponse::decode(data.as_slice()) - .expect("To decode response"); - - let GetDataContractHistoryResponse { version } = response; - - let get_data_contract_history_response::Version::V0(GetDataContractHistoryResponseV0 { - result, - metadata: _, - }) = version.expect("expected a versioned response"); - - let res = result.expect("expect result to be returned from the query"); - - let contract_proof = match res { - get_data_contract_history_response_v0::Result::DataContractHistory(_) => { - panic!("expect result to be Proof"); - } - get_data_contract_history_response_v0::Result::Proof(proof) => proof, - }; - - // Check that the proof has correct values inside - let (_root_hash, contract_history) = Drive::verify_contract_history( - &contract_proof.grovedb_proof, - original_data_contract.id().to_buffer(), - start_at_ms, - Some(10), - Some(0), - platform_version, - ) - .expect("To verify contract history"); - - let mut history_entries = contract_history.expect("history to exist"); - - assert_eq!(history_entries.len(), 2); - - // Taking entries by date - let first_data_contract_update = - history_entries.remove(&1000).expect("first entry to exist"); - let second_data_contract_update = history_entries - .remove(&2000) - .expect("second entry to exist"); - - assert_eq!(first_data_contract_update, original_data_contract); - - let updated_doc = second_data_contract_update - .document_type_for_name("niceDocument") - .expect("To have niceDocument document"); - - assert!( - updated_doc.properties().contains_key("newProp"), - "expect data contract to have newProp field", - ); - } - - #[test] - pub fn should_return_error_when_limit_is_larger_than_u16() { - let platform_version = PlatformVersion::latest(); - let TestData { - platform, - original_data_contract, - } = set_up_test(); - - let request = GetDataContractHistoryRequest { - version: Some(get_data_contract_history_request::Version::V0( - GetDataContractHistoryRequestV0 { - id: original_data_contract.id().to_vec(), - limit: Some(100000), - ..default_request_v0() - }, - )), - }; - - let request_data = request.encode_to_vec(); - - let validation_result = platform - .query_v0("/dataContractHistory", &request_data, platform_version) - .expect("To return validation result with an error"); - - assert!(!validation_result.is_valid()); - - let error = validation_result - .errors - .first() - .expect("expect error to exist"); - - assert!(matches!(error, QueryError::InvalidArgument(_))); - - assert_eq!( - error.to_string(), - "invalid argument error: limit out of bounds" - ); - } - - #[test] - pub fn should_return_error_when_offset_is_larger_than_u16() { - let platform_version = PlatformVersion::latest(); - - let TestData { - platform, - original_data_contract, - } = set_up_test(); - - let request = GetDataContractHistoryRequest { - version: Some(get_data_contract_history_request::Version::V0( - GetDataContractHistoryRequestV0 { - id: original_data_contract.id().to_vec(), - offset: Some(100000), - ..default_request_v0() - }, - )), - }; - - let request_data = request.encode_to_vec(); - - let validation_result = platform - .query_v0("/dataContractHistory", &request_data, platform_version) - .expect("To return validation result with an error"); - - assert!(!validation_result.is_valid()); - - let error = validation_result - .errors - .first() - .expect("expect error to exist"); - - assert!(matches!(error, QueryError::InvalidArgument(_))); - - assert_eq!( - error.to_string(), - "invalid argument error: offset out of bounds" - ); - } - } -} diff --git a/packages/rs-drive-abci/src/server.rs b/packages/rs-drive-abci/src/server.rs new file mode 100644 index 0000000000..20294a99ab --- /dev/null +++ b/packages/rs-drive-abci/src/server.rs @@ -0,0 +1,73 @@ +//! This module implements Drive ABCI server. +//! + +use crate::abci::app::CheckTxAbciApplication; +use crate::abci::app::ConsensusAbciApplication; +use crate::config::PlatformConfig; +use crate::platform_types::platform::Platform; +use crate::query::QueryService; +use crate::rpc::core::DefaultCoreRPC; +use std::sync::Arc; +use tokio::runtime::Runtime; +use tokio_util::sync::CancellationToken; + +/// Starts gRPC and ABCI servers to serve Query, CheckTx and Consensus applications +/// +/// Should only return when server is stopped +pub fn start( + runtime: &Runtime, + platform: Arc>, + config: PlatformConfig, + cancel: CancellationToken, +) { + let query_service = QueryService::new(Arc::clone(&platform)); + let check_tx_service = CheckTxAbciApplication::new(Arc::clone(&platform)); + + let grpc_server = dapi_grpc::tonic::transport::Server::builder() + .add_service(dapi_grpc::platform::v0::platform_server::PlatformServer::new(query_service)) + .add_service( + tenderdash_abci::proto::abci::abci_application_server::AbciApplicationServer::new( + check_tx_service, + ), + ); + + let grpc_server_cancel = cancel.clone(); + + runtime.spawn(async move { + tracing::info!("gRPC server is listening on {}", &config.grpc_bind_address); + + grpc_server + .serve_with_shutdown( + config + .grpc_bind_address + .parse() + .expect("invalid grpc address"), + grpc_server_cancel.cancelled(), + ) + .await + .expect("gRPC server failed"); + + tracing::info!("gRPC server is stopped"); + }); + + // Start blocking ABCI socket-server that process consensus requests sequentially + + let app = ConsensusAbciApplication::new(platform.as_ref()); + + let server = tenderdash_abci::ServerBuilder::new(app, &config.abci.consensus_bind_address) + .with_cancel_token(cancel.clone()) + .with_runtime(runtime.handle().clone()) + .build() + .expect("failed to build ABCI server"); + + while !cancel.is_cancelled() { + tracing::info!( + "ABCI app is waiting for new connection on {}", + config.abci.consensus_bind_address + ); + match server.next_client() { + Err(e) => tracing::error!("ABCI connection terminated: {:?}", e), + Ok(_) => tracing::info!("ABCI connection closed"), + } + } +} diff --git a/packages/rs-drive-abci/src/utils/mod.rs b/packages/rs-drive-abci/src/utils/mod.rs new file mode 100644 index 0000000000..39d1e40dfd --- /dev/null +++ b/packages/rs-drive-abci/src/utils/mod.rs @@ -0,0 +1,3 @@ +mod spawn; + +pub use spawn::spawn_blocking_task_with_name_if_supported; diff --git a/packages/rs-drive-abci/src/utils/spawn.rs b/packages/rs-drive-abci/src/utils/spawn.rs new file mode 100644 index 0000000000..c8c6de52bd --- /dev/null +++ b/packages/rs-drive-abci/src/utils/spawn.rs @@ -0,0 +1,24 @@ +use std::io; +use tokio::task::JoinHandle; + +/// Spawn a blocking tokio task with name if tokio_unstable flag is set +pub fn spawn_blocking_task_with_name_if_supported( + name: &str, + function: Function, +) -> io::Result> +where + Function: FnOnce() -> Output + Send + 'static, + Output: Send + 'static, +{ + #[cfg(all(tokio_unstable, feature = "console"))] + { + tokio::task::Builder::new() + .name(name) + .spawn_blocking(function) + } + + #[cfg(not(all(tokio_unstable, feature = "console")))] + { + Ok(tokio::task::spawn_blocking(function)) + } +} diff --git a/packages/rs-drive-abci/tests/strategy_tests/execution.rs b/packages/rs-drive-abci/tests/strategy_tests/execution.rs index c4c678ea6b..806dbb232c 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/execution.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/execution.rs @@ -24,7 +24,7 @@ use dpp::bls_signatures::PrivateKey; use dpp::dashcore::consensus::Encodable; use dpp::dashcore::hashes::{sha256d, HashEngine}; use dpp::dashcore::{ChainLock, QuorumSigningRequestId, VarInt}; -use drive_abci::abci::AbciApplication; +use drive_abci::abci::app::FullAbciApplication; use drive_abci::config::PlatformConfig; use drive_abci::mimic::test_quorum::TestQuorumInfo; use drive_abci::mimic::{MimicExecuteBlockOptions, MimicExecuteBlockOutcome}; @@ -676,7 +676,8 @@ pub(crate) fn create_chain_for_strategy( config: PlatformConfig, rng: StdRng, ) -> ChainExecutionOutcome { - let abci_application = AbciApplication::new(platform).expect("expected new abci application"); + let abci_application = FullAbciApplication::new(platform); + let seed = strategy .failure_testing .as_ref() @@ -695,7 +696,7 @@ pub(crate) fn create_chain_for_strategy( } pub(crate) fn start_chain_for_strategy( - abci_application: AbciApplication, + abci_application: FullAbciApplication, block_count: u64, proposers_with_updates: Vec, quorums: BTreeMap, @@ -782,7 +783,7 @@ pub(crate) fn start_chain_for_strategy( } pub(crate) fn continue_chain_for_strategy( - abci_app: AbciApplication, + abci_app: FullAbciApplication, chain_execution_parameters: ChainExecutionParameters, mut strategy: NetworkStrategy, config: PlatformConfig, @@ -1005,7 +1006,6 @@ pub(crate) fn continue_chain_for_strategy( &abci_app, &root_app_hash, &state_transaction_results, - &block_info, &expected_validation_errors, platform_version, ); diff --git a/packages/rs-drive-abci/tests/strategy_tests/failures.rs b/packages/rs-drive-abci/tests/strategy_tests/failures.rs index 6b6aa1cfde..7c7c68e24a 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/failures.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/failures.rs @@ -260,15 +260,12 @@ mod tests { platform_version, ); - let cache = platform + let dpns_contract = platform .drive .cache - .read() - .expect("expected to get a read lock on the cache"); - - let dpns_contract = cache.system_data_contracts.dpns.clone(); - - drop(cache); + .system_data_contracts + .read_dpns() + .clone(); let dpns_contract_for_type = dpns_contract.clone(); diff --git a/packages/rs-drive-abci/tests/strategy_tests/main.rs b/packages/rs-drive-abci/tests/strategy_tests/main.rs index 8eaa79fda2..093ff7178f 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/main.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/main.rs @@ -783,8 +783,12 @@ mod tests { // will be able to propose a block (and then get paid later on). let platform = abci_app.platform; - let drive_cache = platform.drive.cache.read().unwrap(); - let counter = &drive_cache.protocol_versions_counter; + let counter = &platform + .drive + .cache + .protocol_versions_counter + .read() + .unwrap(); platform .drive .fetch_versions_with_counter(None, &platform_version.drive) @@ -1712,6 +1716,7 @@ mod tests { .iter() .all(|(_, balance)| *balance != 0); assert!(all_have_balances, "all masternodes should have a balance"); + assert_eq!( hex::encode( outcome diff --git a/packages/rs-drive-abci/tests/strategy_tests/query.rs b/packages/rs-drive-abci/tests/strategy_tests/query.rs index d958bdcb66..69e385a1fd 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/query.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/query.rs @@ -3,9 +3,8 @@ use dapi_grpc::platform::v0::get_identities_by_public_key_hashes_request::GetIde use dapi_grpc::platform::v0::get_identities_by_public_key_hashes_response::PublicKeyHashIdentityEntry; use dapi_grpc::platform::v0::{ get_identities_by_public_key_hashes_request, get_identities_by_public_key_hashes_response, - GetIdentitiesByPublicKeyHashesRequest, GetIdentitiesByPublicKeyHashesResponse, Proof, + GetIdentitiesByPublicKeyHashesRequest, Proof, }; -use dapi_grpc::Message; use dashcore_rpc::dashcore_rpc_json::QuorumType; use dpp::identity::accessors::IdentityGettersV0; use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; @@ -16,7 +15,8 @@ use dpp::validation::SimpleValidationResult; use dpp::version::PlatformVersion; use drive::drive::verify::RootHash; use drive::drive::Drive; -use drive_abci::abci::{AbciApplication, AbciError}; +use drive_abci::abci::app::FullAbciApplication; +use drive_abci::abci::AbciError; use drive_abci::rpc::core::MockCoreRPCLike; use rand::prelude::SliceRandom; use rand::rngs::StdRng; @@ -169,7 +169,7 @@ impl QueryStrategy { &self, proof_verification: &ProofVerification, current_identities: &Vec, - abci_app: &AbciApplication, + abci_app: &FullAbciApplication, seed: StrategyRandomness, platform_version: &PlatformVersion, ) { @@ -196,7 +196,7 @@ impl QueryStrategy { proof_verification: &ProofVerification, current_identities: &Vec, frequency: &Frequency, - abci_app: &AbciApplication, + abci_app: &FullAbciApplication, rng: &mut StdRng, platform_version: &PlatformVersion, ) { @@ -240,14 +240,9 @@ impl QueryStrategy { }, )), }; - let encoded_request = request.encode_to_vec(); let query_validation_result = abci_app .platform - .query( - "/identities/by-public-key-hash", - encoded_request.as_slice(), - platform_version, - ) + .query_identities_by_public_key_hashes(request, platform_version) .expect("expected to run query"); assert!( @@ -256,11 +251,9 @@ impl QueryStrategy { query_validation_result.errors ); - let query_data = query_validation_result + let response = query_validation_result .into_data() .expect("expected data on query_validation_result"); - let response = GetIdentitiesByPublicKeyHashesResponse::decode(query_data.as_slice()) - .expect("expected to deserialize"); let versioned_result = response.version.expect("expected a result"); match versioned_result { @@ -332,18 +325,12 @@ mod tests { use crate::strategy::NetworkStrategy; use dapi_grpc::platform::v0::get_epochs_info_request::{GetEpochsInfoRequestV0, Version}; - use dapi_grpc::platform::v0::{ - get_epochs_info_response, GetEpochsInfoRequest, GetEpochsInfoResponse, - }; + use dapi_grpc::platform::v0::{get_epochs_info_response, GetEpochsInfoRequest}; use dpp::block::epoch::EpochIndex; use dpp::block::extended_epoch_info::v0::ExtendedEpochInfoV0Getters; - use dpp::data_contract::accessors::v0::DataContractV0Getters; - - use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; use dpp::version::PlatformVersion; use drive_abci::config::{ExecutionConfig, PlatformConfig, PlatformTestConfig}; - use drive_abci::platform_types::platform_state::v0::PlatformStateV0Methods; use drive_abci::test::helpers::setup::TestPlatformBuilder; @@ -352,8 +339,6 @@ mod tests { use crate::strategy::CoreHeightIncrease::RandomCoreHeightIncrease; - use tenderdash_abci::Application; - macro_rules! extract_single_variant_or_panic { ($expression:expr, $pattern:pat, $binding:ident) => { match $expression { @@ -442,8 +427,7 @@ mod tests { ascending: true, prove: false, })), - } - .encode_to_vec(); + }; let platform_state = outcome .abci_app @@ -451,19 +435,21 @@ mod tests { .state .read() .expect("expected to read state"); + let protocol_version = platform_state.current_protocol_version_in_consensus(); + drop(platform_state); + let platform_version = PlatformVersion::get(protocol_version) .expect("expected to get current platform version"); + let validation_result = outcome .abci_app .platform - .query("/epochInfos", &request, platform_version) + .query_epoch_infos(request, platform_version) .expect("expected query to succeed"); - let response = GetEpochsInfoResponse::decode( - validation_result.data.expect("expected data").as_slice(), - ) - .expect("expected to decode response"); + + let response = validation_result.into_data().expect("expected data"); let result = extract_single_variant_or_panic!( response.version.expect("expected a versioned response"), @@ -548,8 +534,7 @@ mod tests { ascending: false, prove: false, })), - } - .encode_to_vec(); + }; let platform_state = outcome .abci_app @@ -557,19 +542,21 @@ mod tests { .state .read() .expect("expected to read state"); + let protocol_version = platform_state.current_protocol_version_in_consensus(); + drop(platform_state); + let platform_version = PlatformVersion::get(protocol_version) .expect("expected to get current platform version"); + let validation_result = outcome .abci_app .platform - .query("/epochInfos", &request, platform_version) + .query_epoch_infos(request, platform_version) .expect("expected query to succeed"); - let response = GetEpochsInfoResponse::decode( - validation_result.data.expect("expected data").as_slice(), - ) - .expect("expected to decode response"); + + let response = validation_result.into_data().expect("expected data"); let result = extract_single_variant_or_panic!( response.version.expect("expected a versioned response"), @@ -655,8 +642,7 @@ mod tests { ascending: true, prove: true, })), - } - .encode_to_vec(); + }; let platform_state = outcome .abci_app @@ -664,20 +650,23 @@ mod tests { .state .read() .expect("expected to read state"); + let protocol_version = platform_state.current_protocol_version_in_consensus(); + let current_epoch = platform_state.last_committed_block_epoch_ref().index; + drop(platform_state); + let platform_version = PlatformVersion::get(protocol_version) .expect("expected to get current platform version"); + let validation_result = outcome .abci_app .platform - .query("/epochInfos", &request, platform_version) + .query_epoch_infos(request, platform_version) .expect("expected query to succeed"); - let response = GetEpochsInfoResponse::decode( - validation_result.data.expect("expected data").as_slice(), - ) - .expect("expected to decode response"); + + let response = validation_result.data.expect("expected data"); let result = extract_single_variant_or_panic!( response.version.expect("expected a versioned response"), @@ -715,18 +704,15 @@ mod tests { ascending: false, prove: true, })), - } - .encode_to_vec(); + }; let validation_result = outcome .abci_app .platform - .query("/epochInfos", &request, platform_version) + .query_epoch_infos(request, platform_version) .expect("expected query to succeed"); - let response = GetEpochsInfoResponse::decode( - validation_result.data.expect("expected data").as_slice(), - ) - .expect("expected to decode response"); + + let response = validation_result.data.expect("expected data"); let get_epochs_info_response::Version::V0(response_v0) = response.version.expect("expected a versioned response"); diff --git a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs index ad802e8be2..55a0c8f714 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs @@ -34,7 +34,6 @@ use dpp::identity::KeyType::ECDSA_SECP256K1; use dpp::data_contract::accessors::v0::{DataContractV0Getters, DataContractV0Setters}; use dpp::state_transition::data_contract_update_transition::methods::DataContractUpdateTransitionMethodsV0; use drive::query::DriveQuery; -use drive_abci::abci::AbciApplication; use drive_abci::mimic::test_quorum::TestQuorumInfo; use drive_abci::platform_types::platform::Platform; use drive_abci::rpc::core::MockCoreRPCLike; @@ -59,6 +58,7 @@ use dpp::state_transition::documents_batch_transition::{DocumentsBatchTransition use dpp::state_transition::documents_batch_transition::document_transition::{DocumentDeleteTransition, DocumentReplaceTransition}; use drive::drive::document::query::QueryDocumentsOutcomeV0Methods; use dpp::state_transition::data_contract_create_transition::methods::v0::DataContractCreateTransitionMethodsV0; +use drive_abci::abci::app::FullAbciApplication; use drive_abci::platform_types::withdrawal::unsigned_withdrawal_txs::v0::UnsignedWithdrawalTxs; use crate::strategy::CoreHeightIncrease::NoCoreHeightIncrease; @@ -1129,7 +1129,7 @@ pub struct ValidatorVersionMigration { #[derive(Debug)] pub struct ChainExecutionOutcome<'a> { - pub abci_app: AbciApplication<'a, MockCoreRPCLike>, + pub abci_app: FullAbciApplication<'a, MockCoreRPCLike>, pub masternode_identity_balances: BTreeMap<[u8; 32], Credits>, pub identities: Vec, pub proposers: Vec, diff --git a/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs b/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs index 7eaaf64b0a..f22d651c8f 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs @@ -112,8 +112,12 @@ mod tests { ); { let platform = abci_app.platform; - let drive_cache = platform.drive.cache.read().unwrap(); - let counter = &drive_cache.protocol_versions_counter; + let counter = platform + .drive + .cache + .protocol_versions_counter + .read() + .unwrap(); platform .drive .fetch_versions_with_counter(None, &platform_version.drive) @@ -196,8 +200,12 @@ mod tests { StrategyRandomness::SeedEntropy(7), ); { - let drive_cache = platform.drive.cache.read().unwrap(); - let counter = &drive_cache.protocol_versions_counter; + let counter = &platform + .drive + .cache + .protocol_versions_counter + .read() + .unwrap(); assert_eq!( platform .state @@ -260,8 +268,12 @@ mod tests { StrategyRandomness::SeedEntropy(18), ); { - let drive_cache = platform.drive.cache.read().unwrap(); - let counter = &drive_cache.protocol_versions_counter; + let counter = &platform + .drive + .cache + .protocol_versions_counter + .read() + .unwrap(); assert_eq!( platform .state @@ -387,8 +399,12 @@ mod tests { ); { let platform = abci_app.platform; - let drive_cache = platform.drive.cache.read().unwrap(); - let counter = &drive_cache.protocol_versions_counter; + let counter = &platform + .drive + .cache + .protocol_versions_counter + .read() + .unwrap(); platform .drive .fetch_versions_with_counter(None, &platform_version.drive) @@ -468,8 +484,12 @@ mod tests { StrategyRandomness::SeedEntropy(7), ); { - let drive_cache = platform.drive.cache.read().unwrap(); - let counter = &drive_cache.protocol_versions_counter; + let counter = &platform + .drive + .cache + .protocol_versions_counter + .read() + .unwrap(); assert_eq!( platform .state @@ -532,8 +552,12 @@ mod tests { StrategyRandomness::SeedEntropy(18), ); { - let drive_cache = platform.drive.cache.read().unwrap(); - let counter = &drive_cache.protocol_versions_counter; + let counter = &platform + .drive + .cache + .protocol_versions_counter + .read() + .unwrap(); assert_eq!( platform .state @@ -661,8 +685,6 @@ mod tests { ); { let platform = abci_app.platform; - let drive_cache = platform.drive.cache.read().unwrap(); - let _counter = &drive_cache.protocol_versions_counter; assert_eq!( platform .state @@ -688,7 +710,12 @@ mod tests { platform.state.read().unwrap().next_epoch_protocol_version(), 1 ); - let counter = &drive_cache.protocol_versions_counter; + let counter = &platform + .drive + .cache + .protocol_versions_counter + .read() + .unwrap(); assert_eq!( (counter.get(&1), counter.get(&TEST_PROTOCOL_VERSION_2)), (Some(&35), Some(&64)) @@ -739,8 +766,12 @@ mod tests { StrategyRandomness::SeedEntropy(7), ); { - let drive_cache = platform.drive.cache.read().unwrap(); - let counter = &drive_cache.protocol_versions_counter; + let counter = &platform + .drive + .cache + .protocol_versions_counter + .read() + .unwrap(); assert_eq!( platform .state @@ -805,7 +836,6 @@ mod tests { StrategyRandomness::SeedEntropy(8), ); { - let _drive_cache = platform.drive.cache.read().unwrap(); assert_eq!( platform .state @@ -930,8 +960,6 @@ mod tests { ); { let platform = abci_app.platform; - let drive_cache = platform.drive.cache.read().unwrap(); - let _counter = &drive_cache.protocol_versions_counter; assert_eq!( platform .state @@ -998,8 +1026,12 @@ mod tests { StrategyRandomness::SeedEntropy(99), ); { - let drive_cache = platform.drive.cache.read().unwrap(); - let counter = &drive_cache.protocol_versions_counter; + let counter = &platform + .drive + .cache + .protocol_versions_counter + .read() + .unwrap(); assert_eq!( platform .state @@ -1109,8 +1141,12 @@ mod tests { StrategyRandomness::SeedEntropy(40), ); { - let drive_cache = platform.drive.cache.read().unwrap(); - let counter = &drive_cache.protocol_versions_counter; + let counter = &platform + .drive + .cache + .protocol_versions_counter + .read() + .unwrap(); assert_eq!( (counter.get(&1), counter.get(&TEST_PROTOCOL_VERSION_2)), (Some(&172), Some(&24)) @@ -1174,8 +1210,12 @@ mod tests { StrategyRandomness::SeedEntropy(40), ); { - let drive_cache = platform.drive.cache.read().unwrap(); - let counter = &drive_cache.protocol_versions_counter; + let counter = &platform + .drive + .cache + .protocol_versions_counter + .read() + .unwrap(); assert_eq!( (counter.get(&1), counter.get(&TEST_PROTOCOL_VERSION_2)), (Some(&23), Some(&2)) @@ -1301,8 +1341,12 @@ mod tests { } = run_chain_for_strategy(&mut platform, 1400, strategy, config.clone(), 15); { let platform = abci_app.platform; - let drive_cache = platform.drive.cache.read().unwrap(); - let counter = &drive_cache.protocol_versions_counter; + let counter = &platform + .drive + .cache + .protocol_versions_counter + .read() + .unwrap(); assert_eq!( platform @@ -1405,8 +1449,12 @@ mod tests { StrategyRandomness::SeedEntropy(7), ); { - let drive_cache = platform.drive.cache.read().unwrap(); - let counter = &drive_cache.protocol_versions_counter; + let counter = &platform + .drive + .cache + .protocol_versions_counter + .read() + .unwrap(); assert_eq!( platform .state diff --git a/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs b/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs index d3bcbcbbcd..94003ce94b 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs @@ -1,5 +1,5 @@ use dapi_grpc::platform::v0::get_proofs_request::{get_proofs_request_v0, GetProofsRequestV0}; -use dapi_grpc::platform::v0::{get_proofs_request, GetProofsRequest, GetProofsResponse}; +use dapi_grpc::platform::v0::{get_proofs_request, GetProofsRequest}; use dapi_grpc::platform::VersionedGrpcResponse; use dpp::block::block_info::BlockInfo; use dpp::data_contract::accessors::v0::DataContractV0Getters; @@ -7,7 +7,6 @@ use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::document::Document; use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; -use dapi_grpc::Message; use dpp::state_transition::StateTransition; use dpp::version::PlatformVersion; use drive::drive::identity::key::fetch::IdentityKeysRequest; @@ -15,10 +14,8 @@ use drive::drive::Drive; use drive::query::SingleDocumentDriveQuery; use drive::state_transition_action::document::documents_batch::document_transition::DocumentTransitionAction; use drive::state_transition_action::StateTransitionAction; -use drive_abci::abci::AbciApplication; use drive_abci::execution::validation::state_transition::transformer::StateTransitionActionTransformerV0; use drive_abci::platform_types::platform::PlatformRef; -use drive_abci::platform_types::platform_state::v0::PlatformStateV0Methods; use drive_abci::rpc::core::MockCoreRPCLike; use tenderdash_abci::proto::abci::ExecTxResult; @@ -26,14 +23,15 @@ use dpp::state_transition::documents_batch_transition::accessors::DocumentsBatch use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; use drive::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::DocumentFromCreateTransitionAction; use drive::state_transition_action::document::documents_batch::document_transition::document_replace_transition_action::DocumentFromReplaceTransitionAction; +use drive_abci::abci::app::FullAbciApplication; use drive_abci::execution::types::state_transition_execution_context::StateTransitionExecutionContext; +use drive_abci::platform_types::platform_state::v0::PlatformStateV0Methods; use platform_version::DefaultForPlatformVersion; pub(crate) fn verify_state_transitions_were_or_were_not_executed( - abci_app: &AbciApplication, + abci_app: &FullAbciApplication, expected_root_hash: &[u8; 32], state_transitions: &[(StateTransition, ExecTxResult)], - block_info: &BlockInfo, expected_validation_errors: &[u32], platform_version: &PlatformVersion, ) -> bool { @@ -43,7 +41,6 @@ pub(crate) fn verify_state_transitions_were_or_were_not_executed( state: &state, config: &abci_app.platform.config, core_rpc: &abci_app.platform.core_rpc, - block_info, }; //actions are easier to transform to queries @@ -108,25 +105,19 @@ pub(crate) fn verify_state_transitions_were_or_were_not_executed( .push(get_proofs_request_v0::ContractRequest { contract_id: data_contract_create.data_contract_ref().id().to_vec(), }); + let versioned_request = GetProofsRequest { version: Some(get_proofs_request::Version::V0(proofs_request)), }; + let result = abci_app .platform - .query( - "/proofs", - &versioned_request.encode_to_vec(), - platform_version, - ) + .query_proofs(versioned_request, platform_version) .expect("expected to query proofs"); - let serialized_get_proofs_response = - result.into_data().expect("expected queries to be valid"); - let response_proof = - GetProofsResponse::decode(serialized_get_proofs_response.as_slice()) - .expect("expected to decode proof response") - .proof_owned() - .expect("proof should be present"); + let response = result.into_data().expect("expected queries to be valid"); + + let response_proof = response.proof_owned().expect("expected to get proof"); // let fetched_contract = abci_app // .platform.drive.fetch_contract(data_contract_create.data_contract_ref().id().into_buffer(), None, None, None, platform_version).unwrap().unwrap(); @@ -155,7 +146,7 @@ pub(crate) fn verify_state_transitions_were_or_were_not_executed( } else { //there is the possibility that the state transition was not executed because it already existed, // we can discount that for now in tests - assert!(contract.is_none(),) + assert!(contract.is_none()) } } StateTransitionAction::DataContractUpdateAction(data_contract_update) => { @@ -169,18 +160,9 @@ pub(crate) fn verify_state_transitions_were_or_were_not_executed( }; let result = abci_app .platform - .query( - "/proofs", - &versioned_request.encode_to_vec(), - platform_version, - ) + .query_proofs(versioned_request, platform_version) .expect("expected to query proofs"); - let serialized_get_proofs_response = - result.into_data().expect("expected queries to be valid"); - - let response = - GetProofsResponse::decode(serialized_get_proofs_response.as_slice()) - .expect("expected to decode proof response"); + let response = result.into_data().expect("expected queries to be valid"); let response_proof = response.proof_owned().expect("expected to get proof"); @@ -260,18 +242,9 @@ pub(crate) fn verify_state_transitions_were_or_were_not_executed( }; let result = abci_app .platform - .query( - "/proofs", - &versioned_request.encode_to_vec(), - platform_version, - ) + .query_proofs(versioned_request, platform_version) .expect("expected to query proofs"); - let serialized_get_proofs_response = - result.into_data().expect("expected queries to be valid"); - - let response = - GetProofsResponse::decode(serialized_get_proofs_response.as_slice()) - .expect("expected to decode proof response"); + let response = result.into_data().expect("expected queries to be valid"); let response_proof = response.proof_owned().expect("proof should be present"); @@ -419,18 +392,9 @@ pub(crate) fn verify_state_transitions_were_or_were_not_executed( }; let result = abci_app .platform - .query( - "/proofs", - &versioned_request.encode_to_vec(), - platform_version, - ) + .query_proofs(versioned_request, platform_version) .expect("expected to query proofs"); - let serialized_get_proofs_response = - result.into_data().expect("expected queries to be valid"); - - let response = - GetProofsResponse::decode(serialized_get_proofs_response.as_slice()) - .expect("expected to decode proof response"); + let response = result.into_data().expect("expected queries to be valid"); let response_proof = response.proof_owned().expect("proof should be present"); @@ -474,20 +438,11 @@ pub(crate) fn verify_state_transitions_were_or_were_not_executed( }; let result = abci_app .platform - .query( - "/proofs", - &versioned_request.encode_to_vec(), - platform_version, - ) + .query_proofs(versioned_request, platform_version) .expect("expected to query proofs"); - let serialized_get_proofs_response = - result.into_data().expect("expected queries to be valid"); + let response = result.into_data().expect("expected queries to be valid"); - let response_proof = - GetProofsResponse::decode(serialized_get_proofs_response.as_slice()) - .expect("expected to decode proof response") - .proof_owned() - .expect("proof should be present"); + let response_proof = response.proof_owned().expect("proof should be present"); // we expect to get an identity that matches the state transition let (root_hash, balance) = Drive::verify_identity_balance_for_identity_id( @@ -537,21 +492,12 @@ pub(crate) fn verify_state_transitions_were_or_were_not_executed( }; let result = abci_app .platform - .query( - "/proofs", - &versioned_request.encode_to_vec(), - platform_version, - ) + .query_proofs(versioned_request, platform_version) .expect("expected to query proofs"); - let serialized_get_proofs_response = - result.into_data().expect("expected queries to be valid"); + let response = result.into_data().expect("expected queries to be valid"); - let response_proof = - GetProofsResponse::decode(serialized_get_proofs_response.as_slice()) - .expect("expected to decode proof response") - .proof_owned() - .expect("proof should be present"); + let response_proof = response.proof_owned().expect("proof should be present"); // we expect to get an identity that matches the state transition let (root_hash, balance) = Drive::verify_identity_balance_for_identity_id( @@ -586,20 +532,11 @@ pub(crate) fn verify_state_transitions_were_or_were_not_executed( }; let result = abci_app .platform - .query( - "/proofs", - &versioned_request.encode_to_vec(), - platform_version, - ) + .query_proofs(versioned_request, platform_version) .expect("expected to query proofs"); - let serialized_get_proofs_response = - result.into_data().expect("expected queries to be valid"); + let response = result.into_data().expect("expected queries to be valid"); - let response_proof = - GetProofsResponse::decode(serialized_get_proofs_response.as_slice()) - .expect("expected to decode proof response") - .proof_owned() - .expect("proof should be present"); + let response_proof = response.proof_owned().expect("proof should be present"); // we expect to get an identity that matches the state transition let (root_hash, identity) = Drive::verify_identity_keys_by_identity_id( @@ -658,20 +595,11 @@ pub(crate) fn verify_state_transitions_were_or_were_not_executed( let result = abci_app .platform - .query( - "/proofs", - &versioned_request.encode_to_vec(), - platform_version, - ) + .query_proofs(versioned_request, platform_version) .expect("expected to query proofs"); - let serialized_get_proofs_response = - result.into_data().expect("expected queries to be valid"); - - let response_proof = - GetProofsResponse::decode(serialized_get_proofs_response.as_slice()) - .expect("expected to decode proof response") - .proof_owned() - .expect("proof should be present"); + let response = result.into_data().expect("expected queries to be valid"); + + let response_proof = response.proof_owned().expect("proof should be present"); // we expect to get an identity that matches the state transition let (root_hash_identity, _balance_identity) = diff --git a/packages/rs-drive-proof-verifier/Cargo.toml b/packages/rs-drive-proof-verifier/Cargo.toml index a5d07175d8..17e7b2a5f8 100644 --- a/packages/rs-drive-proof-verifier/Cargo.toml +++ b/packages/rs-drive-proof-verifier/Cargo.toml @@ -2,7 +2,7 @@ name = "drive-proof-verifier" version = "1.0.0-dev.5" edition = "2021" -rust-version = "1.73" +rust-version = "1.76" crate-type = ["cdylib"] @@ -17,13 +17,13 @@ json = ["dep:serde_json"] thiserror = { version = "1.0.39" } dapi-grpc = { path = "../dapi-grpc" } drive = { path = "../rs-drive", default-features = false, features = [ - "verify", + "verify", ] } dpp = { path = "../rs-dpp" } -tenderdash-abci = { git = "https://github.com/dashpay/rs-tenderdash-abci", tag = "v0.14.0-dev.6" } +tenderdash-abci = { git = "https://github.com/dashpay/rs-tenderdash-abci", rev = "81d28aa0b15fc0844dfa7f7251f6949f6c6c405a" } tracing = { version = "0.1.37" } serde = { version = "1.0.171", default-features = false, optional = true } serde_json = { version = "1.0.103", features = [ - "preserve_order", + "preserve_order", ], optional = true } hex = { version = "0.4.3" } diff --git a/packages/rs-drive-verify-c-binding/Cargo.toml b/packages/rs-drive-verify-c-binding/Cargo.toml index 0d4d737124..3a2ccf94a1 100644 --- a/packages/rs-drive-verify-c-binding/Cargo.toml +++ b/packages/rs-drive-verify-c-binding/Cargo.toml @@ -2,7 +2,7 @@ name = "rs-drive-verify-c-binding" version = "0.25.16-rc.3" edition = "2021" -rust-version = "1.73" +rust-version = "1.76" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [lib] diff --git a/packages/rs-drive/Cargo.toml b/packages/rs-drive/Cargo.toml index 3a232fcf6d..03b18e1746 100644 --- a/packages/rs-drive/Cargo.toml +++ b/packages/rs-drive/Cargo.toml @@ -9,7 +9,7 @@ authors = [ "Wisdom Ogwu { DocumentOperationType::AddWithdrawalDocument { owned_document_info, } => { - let cache = drive.cache.read().expect("should get cache lock"); - - let contract = &cache.system_data_contracts.withdrawals; + let contract = drive.cache.system_data_contracts.read_withdrawals(); let document_type = contract.document_type_for_name(withdrawal::NAME)?; let document_and_contract_info = DocumentAndContractInfo { owned_document_info, - contract, + contract: &contract, document_type, }; drive.add_document_for_contract_operations( diff --git a/packages/rs-drive/src/drive/batch/drive_op_batch/finalize_task.rs b/packages/rs-drive/src/drive/batch/drive_op_batch/finalize_task.rs index 1264e747b5..b45d7c154d 100644 --- a/packages/rs-drive/src/drive/batch/drive_op_batch/finalize_task.rs +++ b/packages/rs-drive/src/drive/batch/drive_op_batch/finalize_task.rs @@ -20,8 +20,7 @@ impl DriveOperationFinalizeTask { pub fn execute(self, drive: &Drive, _platform_version: &PlatformVersion) { match self { DriveOperationFinalizeTask::RemoveDataContractFromCache { contract_id } => { - let mut drive_cache = drive.cache.write().unwrap(); - drive_cache.cached_contracts.remove(contract_id.to_buffer()); + drive.cache.data_contracts.remove(contract_id.to_buffer()); } } } diff --git a/packages/rs-drive/src/drive/cache.rs b/packages/rs-drive/src/drive/cache.rs index 367e5b9ab1..96c6d67309 100644 --- a/packages/rs-drive/src/drive/cache.rs +++ b/packages/rs-drive/src/drive/cache.rs @@ -1,283 +1,24 @@ -#[cfg(any(feature = "full", feature = "verify"))] -use crate::drive::contract::DataContractFetchInfo; -use crate::drive::Drive; -use crate::error::Error; -use dpp::data_contract::accessors::v0::DataContractV0Getters; -#[cfg(any(feature = "full", feature = "verify"))] use dpp::identity::TimestampMillis; -#[cfg(any(feature = "full", feature = "verify"))] -use dpp::util::deserializer::ProtocolVersion; -use grovedb::TransactionArg; -#[cfg(any(feature = "full", feature = "verify"))] -use moka::sync::Cache; -#[cfg(any(feature = "full", feature = "verify"))] -use nohash_hasher::IntMap; -use platform_version::version::drive_versions::DriveVersion; -#[cfg(any(feature = "full", feature = "verify"))] -use std::sync::Arc; +use std::sync::RwLock; -#[cfg(feature = "full")] -mod system_contracts_cache; +mod data_contract; +mod protocol_version; +mod system_contracts; -#[cfg(feature = "full")] -pub use system_contracts_cache::SystemDataContracts; +pub use data_contract::DataContractCache; +pub use protocol_version::ProtocolVersionsCache; +pub use system_contracts::SystemDataContracts; /// Drive cache struct -#[cfg(feature = "full")] pub struct DriveCache { /// Cached contracts - pub cached_contracts: DataContractCache, + pub data_contracts: DataContractCache, + // TODO: We probably don't need this since we have it genesis cache in the platform /// Genesis time in ms - pub genesis_time_ms: Option, + pub genesis_time_ms: RwLock>, + // TODO: Make protocol versions cache thread-safe /// Lazy loaded counter of votes to upgrade protocol version - pub protocol_versions_counter: ProtocolVersionsCache, + pub protocol_versions_counter: RwLock, /// Versioned system data contracts pub system_data_contracts: SystemDataContracts, } - -/// ProtocolVersion cache that handles both global and block data -#[cfg(feature = "full")] -#[derive(Default)] -pub struct ProtocolVersionsCache { - /// The current global cache for protocol versions - // TODO: If we persist this in the state and it should be loaded for correct - // use then it's not actually the cache. Move out of cache because it's confusing - pub global_cache: IntMap, - block_cache: IntMap, - loaded: bool, - needs_wipe: bool, -} - -/// DataContract cache that handles both global and block data -#[cfg(feature = "full")] -pub struct DataContractCache { - global_cache: Cache<[u8; 32], Arc>, - block_cache: Cache<[u8; 32], Arc>, -} - -#[cfg(feature = "full")] -impl ProtocolVersionsCache { - /// Create a new ProtocolVersionsCache instance - pub fn new() -> Self { - Self::default() - } - - /// Load the protocol versions cache from disk if needed - pub fn load_if_needed( - &mut self, - drive: &Drive, - transaction: TransactionArg, - drive_version: &DriveVersion, - ) -> Result<(), Error> { - if !self.loaded { - self.global_cache = drive.fetch_versions_with_counter(transaction, drive_version)?; - self.loaded = true; - }; - Ok(()) - } - - /// Sets the protocol version to the block cache - pub fn set_block_cache_version_count(&mut self, version: ProtocolVersion, count: u64) { - self.block_cache.insert(version, count); - } - - /// Tries to get a version from block cache if present - /// if block cache doesn't have the version set - /// then it tries get the version from global cache - pub fn get(&self, version: &ProtocolVersion) -> Option<&u64> { - if let Some(count) = self.block_cache.get(version) { - Some(count) - } else { - self.global_cache.get(version) - } - } - - /// Merge block cache to global cache - pub fn merge_block_cache(&mut self) { - if self.needs_wipe { - self.global_cache.clear(); - self.block_cache.clear(); - self.needs_wipe = false; - } else { - self.global_cache.extend(self.block_cache.drain()); - } - } - - /// Clear block cache - pub fn clear_block_cache(&mut self) { - self.block_cache.clear() - } - - /// Versions passing threshold - pub fn versions_passing_threshold( - &mut self, - required_upgraded_hpns: u64, - ) -> Vec { - self.needs_wipe = true; - let mut cache = self.global_cache.clone(); - - cache.extend(self.block_cache.drain()); - cache - .into_iter() - .filter_map(|(protocol_version, count)| { - if count >= required_upgraded_hpns { - Some(protocol_version) - } else { - None - } - }) - .collect::>() - } -} - -#[cfg(feature = "full")] -impl DataContractCache { - /// Create a new DataContract cache instance - pub fn new(global_cache_max_capacity: u64, block_cache_max_capacity: u64) -> Self { - Self { - global_cache: Cache::new(global_cache_max_capacity), - block_cache: Cache::new(block_cache_max_capacity), - } - } - - /// Inserts DataContract to block cache - /// otherwise to goes to global cache - pub fn insert(&mut self, fetch_info: Arc, is_block_cache: bool) { - let data_contract_id_bytes = fetch_info.contract.id().to_buffer(); - - if is_block_cache { - self.block_cache.insert(data_contract_id_bytes, fetch_info); - } else { - self.global_cache.insert(data_contract_id_bytes, fetch_info); - } - } - - /// Tries to get a data contract from block cache if present - /// if block cache doesn't have the contract - /// then it tries get the contract from global cache - pub fn get( - &self, - contract_id: [u8; 32], - is_block_cache: bool, - ) -> Option> { - let maybe_fetch_info = if is_block_cache { - self.block_cache.get(&contract_id) - } else { - None - }; - - maybe_fetch_info.or_else(|| self.global_cache.get(&contract_id)) - } - - /// Remove contract from both block and global cache - pub fn remove(&mut self, contract_id: [u8; 32]) { - self.block_cache.remove(&contract_id); - self.global_cache.remove(&contract_id); - } - - /// Merge block cache to global cache - pub fn merge_block_cache(&mut self) { - for (contract_id, fetch_info) in self.block_cache.iter() { - self.global_cache.insert(*contract_id, fetch_info); - } - } - - /// Clear block cache - pub fn clear_block_cache(&mut self) { - self.block_cache.invalidate_all(); - } -} - -#[cfg(feature = "full")] -#[cfg(test)] -mod tests { - use super::*; - - mod get { - use super::*; - use dpp::data_contract::accessors::v0::{DataContractV0Getters, DataContractV0Setters}; - use dpp::version::PlatformVersion; - - #[test] - fn test_get_from_global_cache_when_block_cache_is_not_requested() { - let data_contract_cache = DataContractCache::new(10, 10); - - let protocol_version = PlatformVersion::latest().protocol_version; - - // Create global contract - let fetch_info_global = Arc::new(DataContractFetchInfo::dpns_contract_fixture( - protocol_version, - )); - - let contract_id = fetch_info_global.contract.id().to_buffer(); - - data_contract_cache - .global_cache - .insert(contract_id, Arc::clone(&fetch_info_global)); - - // Create transactional contract with a new version - let mut fetch_info_block = - DataContractFetchInfo::dpns_contract_fixture(protocol_version); - - fetch_info_block.contract.increment_version(); - - let fetch_info_block_boxed = Arc::new(fetch_info_block); - - data_contract_cache - .block_cache - .insert(contract_id, Arc::clone(&fetch_info_block_boxed)); - - let fetch_info_from_cache = data_contract_cache - .get(contract_id, false) - .expect("should be present"); - - assert_eq!(fetch_info_from_cache, fetch_info_global) - } - - #[test] - fn test_get_from_global_cache_when_block_cache_does_not_have_contract() { - let data_contract_cache = DataContractCache::new(10, 10); - - let protocol_version = PlatformVersion::latest().protocol_version; - - let fetch_info_global = Arc::new(DataContractFetchInfo::dpns_contract_fixture( - protocol_version, - )); - - let contract_id = fetch_info_global.contract.id().to_buffer(); - - data_contract_cache - .global_cache - .insert(contract_id, Arc::clone(&fetch_info_global)); - - let fetch_info_from_cache = data_contract_cache - .get(contract_id, true) - .expect("should be present"); - - assert_eq!(fetch_info_from_cache, fetch_info_global) - } - - #[test] - fn test_get_from_block_cache() { - let data_contract_cache = DataContractCache::new(10, 10); - - let protocol_version = PlatformVersion::latest().protocol_version; - - let fetch_info_block = Arc::new(DataContractFetchInfo::dpns_contract_fixture( - protocol_version, - )); - - let contract_id = fetch_info_block.contract.id().to_buffer(); - - data_contract_cache - .block_cache - .insert(contract_id, Arc::clone(&fetch_info_block)); - - let fetch_info_from_cache = data_contract_cache - .get(contract_id, true) - .expect("should be present"); - - assert_eq!(fetch_info_from_cache, fetch_info_block) - } - } -} diff --git a/packages/rs-drive/src/drive/cache/data_contract.rs b/packages/rs-drive/src/drive/cache/data_contract.rs new file mode 100644 index 0000000000..bb55dae364 --- /dev/null +++ b/packages/rs-drive/src/drive/cache/data_contract.rs @@ -0,0 +1,170 @@ +use crate::drive::contract::DataContractFetchInfo; +use dpp::data_contract::accessors::v0::DataContractV0Getters; +use moka::sync::Cache; +use std::sync::Arc; + +/// DataContract cache that handles both global and block data +#[cfg(feature = "full")] +pub struct DataContractCache { + global_cache: Cache<[u8; 32], Arc>, + block_cache: Cache<[u8; 32], Arc>, +} + +#[cfg(feature = "full")] +impl DataContractCache { + /// Create a new DataContract cache instance + pub fn new(global_cache_max_capacity: u64, block_cache_max_capacity: u64) -> Self { + Self { + global_cache: Cache::new(global_cache_max_capacity), + block_cache: Cache::new(block_cache_max_capacity), + } + } + + /// Inserts DataContract to block cache + /// otherwise to goes to global cache + pub fn insert(&self, fetch_info: Arc, is_block_cache: bool) { + let data_contract_id_bytes = fetch_info.contract.id().to_buffer(); + + if is_block_cache { + self.block_cache.insert(data_contract_id_bytes, fetch_info); + } else { + self.global_cache.insert(data_contract_id_bytes, fetch_info); + } + } + + /// Tries to get a data contract from block cache if present + /// if block cache doesn't have the contract + /// then it tries get the contract from global cache + pub fn get( + &self, + contract_id: [u8; 32], + is_block_cache: bool, + ) -> Option> { + let maybe_fetch_info = if is_block_cache { + self.block_cache.get(&contract_id) + } else { + None + }; + + maybe_fetch_info.or_else(|| self.global_cache.get(&contract_id)) + } + + /// Remove contract from both block and global cache + pub fn remove(&self, contract_id: [u8; 32]) { + self.block_cache.remove(&contract_id); + self.global_cache.remove(&contract_id); + } + + /// Move block cache to global cache + pub fn merge_and_clear_block_cache(&self) { + for (contract_id, fetch_info) in self.block_cache.into_iter() { + self.global_cache + .insert(Arc::unwrap_or_clone(contract_id), fetch_info); + } + self.clear_block_cache(); + } + + /// Clear block cache + pub fn clear_block_cache(&self) { + self.block_cache.invalidate_all(); + } + + /// Clear cache + pub fn clear(&self) { + self.block_cache.invalidate_all(); + self.global_cache.invalidate_all(); + } +} + +#[cfg(test)] +mod tests { + use super::*; + + mod get { + use super::*; + use dpp::data_contract::accessors::v0::{DataContractV0Getters, DataContractV0Setters}; + use dpp::version::PlatformVersion; + + #[test] + fn test_get_from_global_cache_when_block_cache_is_not_requested() { + let data_contract_cache = DataContractCache::new(10, 10); + + let protocol_version = PlatformVersion::latest().protocol_version; + + // Create global contract + let fetch_info_global = Arc::new(DataContractFetchInfo::dpns_contract_fixture( + protocol_version, + )); + + let contract_id = fetch_info_global.contract.id().to_buffer(); + + data_contract_cache + .global_cache + .insert(contract_id, Arc::clone(&fetch_info_global)); + + // Create transactional contract with a new version + let mut fetch_info_block = + DataContractFetchInfo::dpns_contract_fixture(protocol_version); + + fetch_info_block.contract.increment_version(); + + let fetch_info_block_boxed = Arc::new(fetch_info_block); + + data_contract_cache + .block_cache + .insert(contract_id, Arc::clone(&fetch_info_block_boxed)); + + let fetch_info_from_cache = data_contract_cache + .get(contract_id, false) + .expect("should be present"); + + assert_eq!(fetch_info_from_cache, fetch_info_global) + } + + #[test] + fn test_get_from_global_cache_when_block_cache_does_not_have_contract() { + let data_contract_cache = DataContractCache::new(10, 10); + + let protocol_version = PlatformVersion::latest().protocol_version; + + let fetch_info_global = Arc::new(DataContractFetchInfo::dpns_contract_fixture( + protocol_version, + )); + + let contract_id = fetch_info_global.contract.id().to_buffer(); + + data_contract_cache + .global_cache + .insert(contract_id, Arc::clone(&fetch_info_global)); + + let fetch_info_from_cache = data_contract_cache + .get(contract_id, true) + .expect("should be present"); + + assert_eq!(fetch_info_from_cache, fetch_info_global) + } + + #[test] + fn test_get_from_block_cache() { + let data_contract_cache = DataContractCache::new(10, 10); + + let protocol_version = PlatformVersion::latest().protocol_version; + + let fetch_info_block = Arc::new(DataContractFetchInfo::dpns_contract_fixture( + protocol_version, + )); + + let contract_id = fetch_info_block.contract.id().to_buffer(); + + data_contract_cache + .block_cache + .insert(contract_id, Arc::clone(&fetch_info_block)); + + let fetch_info_from_cache = data_contract_cache + .get(contract_id, true) + .expect("should be present"); + + assert_eq!(fetch_info_from_cache, fetch_info_block) + } + } +} diff --git a/packages/rs-drive/src/drive/cache/protocol_version.rs b/packages/rs-drive/src/drive/cache/protocol_version.rs new file mode 100644 index 0000000000..cb1622da39 --- /dev/null +++ b/packages/rs-drive/src/drive/cache/protocol_version.rs @@ -0,0 +1,93 @@ +use crate::drive::Drive; +use crate::error::Error; +use dpp::util::deserializer::ProtocolVersion; +use grovedb::TransactionArg; +use nohash_hasher::IntMap; +use platform_version::version::drive_versions::DriveVersion; + +/// ProtocolVersion cache that handles both global and block data +#[derive(Default)] +pub struct ProtocolVersionsCache { + /// The current global cache for protocol versions + // TODO: If we persist this in the state and it should be loaded for correct + // use then it's not actually the cache. Move out of cache because it's confusing + pub global_cache: IntMap, + block_cache: IntMap, + loaded: bool, + needs_wipe: bool, +} + +#[cfg(feature = "full")] +impl ProtocolVersionsCache { + /// Create a new ProtocolVersionsCache instance + pub fn new() -> Self { + Self::default() + } + + /// Load the protocol versions cache from disk if needed + pub fn load_if_needed( + &mut self, + drive: &Drive, + transaction: TransactionArg, + drive_version: &DriveVersion, + ) -> Result<(), Error> { + if !self.loaded { + self.global_cache = drive.fetch_versions_with_counter(transaction, drive_version)?; + self.loaded = true; + }; + Ok(()) + } + + /// Sets the protocol version to the block cache + pub fn set_block_cache_version_count(&mut self, version: ProtocolVersion, count: u64) { + self.block_cache.insert(version, count); + } + + /// Tries to get a version from block cache if present + /// if block cache doesn't have the version set + /// then it tries get the version from global cache + pub fn get(&self, version: &ProtocolVersion) -> Option<&u64> { + if let Some(count) = self.block_cache.get(version) { + Some(count) + } else { + self.global_cache.get(version) + } + } + + /// Merge block cache to global cache + pub fn merge_block_cache(&mut self) { + if self.needs_wipe { + self.global_cache.clear(); + self.block_cache.clear(); + self.needs_wipe = false; + } else { + self.global_cache.extend(self.block_cache.drain()); + } + } + + /// Clear block cache + pub fn clear_block_cache(&mut self) { + self.block_cache.clear() + } + + /// Versions passing threshold + pub fn versions_passing_threshold( + &mut self, + required_upgraded_hpns: u64, + ) -> Vec { + self.needs_wipe = true; + let mut cache = self.global_cache.clone(); + + cache.extend(self.block_cache.drain()); + cache + .into_iter() + .filter_map(|(protocol_version, count)| { + if count >= required_upgraded_hpns { + Some(protocol_version) + } else { + None + } + }) + .collect::>() + } +} diff --git a/packages/rs-drive/src/drive/cache/system_contracts.rs b/packages/rs-drive/src/drive/cache/system_contracts.rs new file mode 100644 index 0000000000..831b5bb678 --- /dev/null +++ b/packages/rs-drive/src/drive/cache/system_contracts.rs @@ -0,0 +1,63 @@ +use crate::error::Error; +use dpp::data_contract::DataContract; +use dpp::system_data_contracts::{load_system_data_contract, SystemDataContract}; +use platform_version::version::PlatformVersion; +use std::sync::{RwLock, RwLockReadGuard}; + +/// System contracts +pub struct SystemDataContracts { + /// Withdrawal contract + withdrawals: RwLock, + /// DPNS contract + dpns: RwLock, + /// Dashpay contract + dashpay: RwLock, + /// Masternode reward shares contract + masternode_reward_shares: RwLock, +} + +impl SystemDataContracts { + /// load genesis system contracts + pub fn load_genesis_system_contracts( + platform_version: &PlatformVersion, + ) -> Result { + Ok(Self { + withdrawals: RwLock::new(load_system_data_contract( + SystemDataContract::Withdrawals, + platform_version, + )?), + dpns: RwLock::new(load_system_data_contract( + SystemDataContract::DPNS, + platform_version, + )?), + dashpay: RwLock::new(load_system_data_contract( + SystemDataContract::Dashpay, + platform_version, + )?), + masternode_reward_shares: RwLock::new(load_system_data_contract( + SystemDataContract::MasternodeRewards, + platform_version, + )?), + }) + } + + /// Returns withdrawals contract + pub fn read_withdrawals(&self) -> RwLockReadGuard { + self.withdrawals.read().unwrap() + } + + /// Returns DPNS contract + pub fn read_dpns(&self) -> RwLockReadGuard { + self.dpns.read().unwrap() + } + + /// Returns Dashpay contract + pub fn read_dashpay(&self) -> RwLockReadGuard { + self.dashpay.read().unwrap() + } + + /// Returns Masternode reward shares contract + pub fn read_masternode_reward_shares(&self) -> RwLockReadGuard { + self.masternode_reward_shares.read().unwrap() + } +} diff --git a/packages/rs-drive/src/drive/cache/system_contracts_cache.rs b/packages/rs-drive/src/drive/cache/system_contracts_cache.rs deleted file mode 100644 index d9a4af3288..0000000000 --- a/packages/rs-drive/src/drive/cache/system_contracts_cache.rs +++ /dev/null @@ -1,36 +0,0 @@ -use crate::error::Error; -use dpp::data_contract::DataContract; -use dpp::system_data_contracts::{load_system_data_contract, SystemDataContract}; -use platform_version::version::PlatformVersion; - -/// System contracts -pub struct SystemDataContracts { - /// Withdrawal contract - pub withdrawals: DataContract, - /// DPNS contract - pub dpns: DataContract, - /// Dashpay contract - pub dashpay: DataContract, - /// Masternode reward shares contract - pub masternode_reward_shares: DataContract, -} - -impl SystemDataContracts { - /// load genesis system contracts - pub fn load_genesis_system_contracts( - platform_version: &PlatformVersion, - ) -> Result { - Ok(Self { - withdrawals: load_system_data_contract( - SystemDataContract::Withdrawals, - platform_version, - )?, - dpns: load_system_data_contract(SystemDataContract::DPNS, platform_version)?, - dashpay: load_system_data_contract(SystemDataContract::Dashpay, platform_version)?, - masternode_reward_shares: load_system_data_contract( - SystemDataContract::MasternodeRewards, - platform_version, - )?, - }) - } -} diff --git a/packages/rs-drive/src/drive/contract/get_fetch/get_cached_contract_with_fetch_info/v0/mod.rs b/packages/rs-drive/src/drive/contract/get_fetch/get_cached_contract_with_fetch_info/v0/mod.rs index 79fb9c71a2..a596c12755 100644 --- a/packages/rs-drive/src/drive/contract/get_fetch/get_cached_contract_with_fetch_info/v0/mod.rs +++ b/packages/rs-drive/src/drive/contract/get_fetch/get_cached_contract_with_fetch_info/v0/mod.rs @@ -11,9 +11,7 @@ impl Drive { transaction: TransactionArg, ) -> Option> { self.cache - .read() - .unwrap() - .cached_contracts + .data_contracts .get(contract_id, transaction.is_some()) .map(|fetch_info| Arc::clone(&fetch_info)) } diff --git a/packages/rs-drive/src/drive/contract/get_fetch/get_contract_with_fetch_info/mod.rs b/packages/rs-drive/src/drive/contract/get_fetch/get_contract_with_fetch_info/mod.rs index 0192b1290a..7bb32ba00f 100644 --- a/packages/rs-drive/src/drive/contract/get_fetch/get_contract_with_fetch_info/mod.rs +++ b/packages/rs-drive/src/drive/contract/get_fetch/get_contract_with_fetch_info/mod.rs @@ -362,9 +362,7 @@ mod tests { // Commit transaction and merge block (transactional) cache to global cache transaction.commit().expect("expected to commit"); - let mut drive_cache = drive.cache.write().unwrap(); - drive_cache.cached_contracts.merge_block_cache(); - drop(drive_cache); + drive.cache.data_contracts.merge_and_clear_block_cache(); /* *DataContracts fetched with user query and during block execution must have equal costs diff --git a/packages/rs-drive/src/drive/contract/get_fetch/get_contract_with_fetch_info/v0/mod.rs b/packages/rs-drive/src/drive/contract/get_fetch/get_contract_with_fetch_info/v0/mod.rs index 9e48288ace..f9c4d73ee8 100644 --- a/packages/rs-drive/src/drive/contract/get_fetch/get_contract_with_fetch_info/v0/mod.rs +++ b/packages/rs-drive/src/drive/contract/get_fetch/get_contract_with_fetch_info/v0/mod.rs @@ -114,10 +114,9 @@ impl Drive { drive_operations: &mut Vec, platform_version: &PlatformVersion, ) -> Result>, Error> { - let cache = self.cache.read().unwrap(); - - match cache - .cached_contracts + match self + .cache + .data_contracts .get(contract_id, transaction.is_some()) { None => { @@ -132,10 +131,8 @@ impl Drive { if add_to_cache_if_pulled { // Store a contract in cache if present if let Some(contract_fetch_info) = &maybe_contract_fetch_info { - drop(cache); - let mut cache = self.cache.write().unwrap(); - cache - .cached_contracts + self.cache + .data_contracts .insert(Arc::clone(contract_fetch_info), transaction.is_some()); }; } @@ -163,11 +160,9 @@ impl Drive { cost: contract_fetch_info.cost.clone(), fee: Some(fee.clone()), }); - drop(cache); - let mut cache = self.cache.write().unwrap(); // we override the cache for the contract as the fee is now calculated - cache - .cached_contracts + self.cache + .data_contracts .insert(updated_contract_fetch_info, transaction.is_some()); fee diff --git a/packages/rs-drive/src/drive/contract/update/update_contract/v0/mod.rs b/packages/rs-drive/src/drive/contract/update/update_contract/v0/mod.rs index e0efe9e743..c271eced7d 100644 --- a/packages/rs-drive/src/drive/contract/update/update_contract/v0/mod.rs +++ b/packages/rs-drive/src/drive/contract/update/update_contract/v0/mod.rs @@ -121,10 +121,8 @@ impl Drive { "contract should exist", )))?; - let mut drive_cache = self.cache.write().unwrap(); - - drive_cache - .cached_contracts + self.cache + .data_contracts .insert(updated_contract_fetch_info, transaction.is_some()); Drive::calculate_fee( diff --git a/packages/rs-drive/src/drive/identity/withdrawals/document/find_withdrawal_documents_by_status_and_transaction_indices/v0/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/document/find_withdrawal_documents_by_status_and_transaction_indices/v0/mod.rs index ad7536faeb..48840939f4 100644 --- a/packages/rs-drive/src/drive/identity/withdrawals/document/find_withdrawal_documents_by_status_and_transaction_indices/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/withdrawals/document/find_withdrawal_documents_by_status_and_transaction_indices/v0/mod.rs @@ -60,15 +60,12 @@ impl Drive { }, ); - let cache = self.cache.read().unwrap(); + let contract = self.cache.system_data_contracts.read_withdrawals(); - let document_type = cache - .system_data_contracts - .withdrawals - .document_type_for_name(withdrawal::NAME)?; + let document_type = contract.document_type_for_name(withdrawal::NAME)?; let drive_query = DriveQuery { - contract: &cache.system_data_contracts.withdrawals, + contract: &contract, document_type, internal_clauses: InternalClauses { primary_key_in_clause: None, diff --git a/packages/rs-drive/src/drive/mod.rs b/packages/rs-drive/src/drive/mod.rs index 4ee34d9eb8..307b295716 100644 --- a/packages/rs-drive/src/drive/mod.rs +++ b/packages/rs-drive/src/drive/mod.rs @@ -27,9 +27,6 @@ // DEALINGS IN THE SOFTWARE. // -#[cfg(any(feature = "full", feature = "verify"))] -use std::sync::RwLock; - #[cfg(any(feature = "full", feature = "verify"))] use grovedb::GroveDb; @@ -45,7 +42,7 @@ pub mod balances; #[cfg(feature = "full")] pub mod batch; /// Drive Cache -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(feature = "full")] pub mod cache; #[cfg(any(feature = "full", feature = "verify"))] pub mod config; @@ -112,7 +109,7 @@ pub struct Drive { pub config: DriveConfig, /// Drive Cache #[cfg(feature = "full")] - pub cache: RwLock, + pub cache: DriveCache, } // The root tree structure is very important! diff --git a/packages/rs-drive/src/drive/open/mod.rs b/packages/rs-drive/src/drive/open/mod.rs index 457b88f4e7..d6f1381857 100644 --- a/packages/rs-drive/src/drive/open/mod.rs +++ b/packages/rs-drive/src/drive/open/mod.rs @@ -12,7 +12,7 @@ use std::path::Path; use std::sync::RwLock; impl Drive { - /// Opens a path in GroveDB. + /// Opens GroveDB database /// /// This is a non-versioned method which opens a specified path as a GroveDB instance and returns a `Drive` /// instance with this GroveDB, cache and other configurations. @@ -31,39 +31,35 @@ impl Drive { path: P, config: Option, ) -> Result<(Self, Option), Error> { - match GroveDb::open(path) { - Ok(grove) => { - let config = config.unwrap_or_default(); - let genesis_time_ms = config.default_genesis_time; - let data_contracts_global_cache_size = config.data_contracts_global_cache_size; - let data_contracts_block_cache_size = config.data_contracts_block_cache_size; + let grove = GroveDb::open(path)?; - let protocol_version = - Drive::fetch_current_protocol_version_with_grovedb(&grove, None)?; + let config = config.unwrap_or_default(); + let genesis_time_ms = config.default_genesis_time; + let data_contracts_global_cache_size = config.data_contracts_global_cache_size; + let data_contracts_block_cache_size = config.data_contracts_block_cache_size; - let platform_version = - PlatformVersion::get(protocol_version.unwrap_or(INITIAL_PROTOCOL_VERSION)) - .map_err(ProtocolError::PlatformVersionError)?; + let protocol_version = Drive::fetch_current_protocol_version_with_grovedb(&grove, None)?; - let drive = Drive { - grove, - config, - cache: RwLock::new(DriveCache { - cached_contracts: DataContractCache::new( - data_contracts_global_cache_size, - data_contracts_block_cache_size, - ), - genesis_time_ms, - protocol_versions_counter: ProtocolVersionsCache::new(), - system_data_contracts: SystemDataContracts::load_genesis_system_contracts( - platform_version, - )?, - }), - }; + let platform_version = + PlatformVersion::get(protocol_version.unwrap_or(INITIAL_PROTOCOL_VERSION)) + .map_err(ProtocolError::PlatformVersionError)?; - Ok((drive, protocol_version)) - } - Err(e) => Err(Error::GroveDB(e)), - } + let drive = Drive { + grove, + config, + cache: DriveCache { + data_contracts: DataContractCache::new( + data_contracts_global_cache_size, + data_contracts_block_cache_size, + ), + genesis_time_ms: RwLock::new(genesis_time_ms), + protocol_versions_counter: RwLock::new(ProtocolVersionsCache::new()), + system_data_contracts: SystemDataContracts::load_genesis_system_contracts( + platform_version, + )?, + }, + }; + + Ok((drive, protocol_version)) } } diff --git a/packages/rs-drive/src/drive/operations/drop_cache/v0/mod.rs b/packages/rs-drive/src/drive/operations/drop_cache/v0/mod.rs index 90791990d0..cf47c3f51e 100644 --- a/packages/rs-drive/src/drive/operations/drop_cache/v0/mod.rs +++ b/packages/rs-drive/src/drive/operations/drop_cache/v0/mod.rs @@ -5,14 +5,17 @@ impl Drive { /// Drops the drive cache pub(super) fn drop_cache_v0(&self) { let genesis_time_ms = self.config.default_genesis_time; - let data_contracts_global_cache_size = self.config.data_contracts_global_cache_size; - let data_contracts_block_cache_size = self.config.data_contracts_block_cache_size; - let mut cache = self.cache.write().unwrap(); - cache.cached_contracts = DataContractCache::new( - data_contracts_global_cache_size, - data_contracts_block_cache_size, - ); - cache.genesis_time_ms = genesis_time_ms; - cache.protocol_versions_counter = ProtocolVersionsCache::new(); + self.cache.data_contracts.clear(); + + let mut genesis_time_ms_cache = self.cache.genesis_time_ms.write().unwrap(); + + *genesis_time_ms_cache = genesis_time_ms; + + drop(genesis_time_ms_cache); + + let mut protocol_versions_counter_cache = + self.cache.protocol_versions_counter.write().unwrap(); + + *protocol_versions_counter_cache = ProtocolVersionsCache::new(); } } diff --git a/packages/rs-drive/src/drive/protocol_upgrade/remove_validators_proposed_app_versions/v0/mod.rs b/packages/rs-drive/src/drive/protocol_upgrade/remove_validators_proposed_app_versions/v0/mod.rs index 5e8048d6df..517e51dd73 100644 --- a/packages/rs-drive/src/drive/protocol_upgrade/remove_validators_proposed_app_versions/v0/mod.rs +++ b/packages/rs-drive/src/drive/protocol_upgrade/remove_validators_proposed_app_versions/v0/mod.rs @@ -107,8 +107,7 @@ impl Drive { where I: IntoIterator, { - let mut cache = self.cache.write().unwrap(); - let version_counter = &mut cache.protocol_versions_counter; + let version_counter = &mut self.cache.protocol_versions_counter.write().unwrap(); version_counter.load_if_needed(self, transaction, drive_version)?; diff --git a/packages/rs-drive/src/drive/protocol_upgrade/update_validator_proposed_app_version/v0/mod.rs b/packages/rs-drive/src/drive/protocol_upgrade/update_validator_proposed_app_version/v0/mod.rs index 2bc7862682..7178d7e9e1 100644 --- a/packages/rs-drive/src/drive/protocol_upgrade/update_validator_proposed_app_version/v0/mod.rs +++ b/packages/rs-drive/src/drive/protocol_upgrade/update_validator_proposed_app_version/v0/mod.rs @@ -59,8 +59,7 @@ impl Drive { drive_operations: &mut Vec, drive_version: &DriveVersion, ) -> Result { - let mut cache = self.cache.write().unwrap(); - let version_counter = &mut cache.protocol_versions_counter; + let version_counter = &mut self.cache.protocol_versions_counter.write().unwrap(); version_counter.load_if_needed(self, transaction, drive_version)?; diff --git a/packages/rs-drive/src/drive/system/genesis_time/mod.rs b/packages/rs-drive/src/drive/system/genesis_time/mod.rs index 1f1d1b1197..e6f6abd062 100644 --- a/packages/rs-drive/src/drive/system/genesis_time/mod.rs +++ b/packages/rs-drive/src/drive/system/genesis_time/mod.rs @@ -43,23 +43,23 @@ impl Drive { /// Returns the genesis time. Checks cache first, then storage. pub fn get_genesis_time(&self, transaction: TransactionArg) -> Result, Error> { // let's first check the cache - let cache = self.cache.read().unwrap(); + let genesis_time_ms = self.cache.genesis_time_ms.read().unwrap(); let platform_version = PlatformVersion::latest(); - if cache.genesis_time_ms.is_some() { - return Ok(cache.genesis_time_ms); + if genesis_time_ms.is_some() { + return Ok(*genesis_time_ms); }; - drop(cache); + drop(genesis_time_ms); let epoch = Epoch::new(GENESIS_EPOCH_INDEX).unwrap(); match self.get_epoch_start_time(&epoch, transaction, platform_version) { Ok(genesis_time_ms) => { - let mut cache = self.cache.write().unwrap(); + let mut genesis_time_ms_cache = self.cache.genesis_time_ms.write().unwrap(); - cache.genesis_time_ms = Some(genesis_time_ms); + *genesis_time_ms_cache = Some(genesis_time_ms); Ok(Some(genesis_time_ms)) } @@ -72,8 +72,8 @@ impl Drive { /// Sets genesis time pub fn set_genesis_time(&self, genesis_time_ms: u64) { - let mut cache = self.cache.write().unwrap(); - cache.genesis_time_ms = Some(genesis_time_ms); + let mut genesis_time_ms_cache = self.cache.genesis_time_ms.write().unwrap(); + *genesis_time_ms_cache = Some(genesis_time_ms); } } @@ -106,13 +106,13 @@ mod tests { fn should_return_some_if_cache_is_set() { let drive = setup_drive(None); - let mut cache = drive.cache.write().unwrap(); + let mut genesis_time_ms_cache = drive.cache.genesis_time_ms.write().unwrap(); let genesis_time_ms = 100; - cache.genesis_time_ms = Some(genesis_time_ms); + *genesis_time_ms_cache = Some(genesis_time_ms); - drop(cache); + drop(genesis_time_ms_cache); let result = drive .get_genesis_time(None) @@ -169,9 +169,9 @@ mod tests { drive.set_genesis_time(genesis_time_ms); - let cache = drive.cache.read().unwrap(); + let genesis_time_ms_cache = drive.cache.genesis_time_ms.read().unwrap(); - assert!(matches!(cache.genesis_time_ms, Some(g) if g == genesis_time_ms)); + assert!(matches!(*genesis_time_ms_cache, Some(g) if g == genesis_time_ms)); } } } diff --git a/packages/rs-platform-serialization-derive/Cargo.toml b/packages/rs-platform-serialization-derive/Cargo.toml index f2c5256f7f..cca0e802c1 100644 --- a/packages/rs-platform-serialization-derive/Cargo.toml +++ b/packages/rs-platform-serialization-derive/Cargo.toml @@ -4,7 +4,7 @@ authors = ["Samuel Westrich "] description = "Bincode serialization and deserialization derivations" version = "1.0.0-dev.5" edition = "2021" -rust-version = "1.73" +rust-version = "1.76" license = "MIT" private = true diff --git a/packages/rs-platform-serialization/Cargo.toml b/packages/rs-platform-serialization/Cargo.toml index 000e14a411..51714c67bf 100644 --- a/packages/rs-platform-serialization/Cargo.toml +++ b/packages/rs-platform-serialization/Cargo.toml @@ -4,7 +4,7 @@ authors = ["Samuel Westrich "] description = "Bincode based serialization and deserialization" version = "1.0.0-dev.5" edition = "2021" -rust-version = "1.73" +rust-version = "1.76" license = "MIT" private = true diff --git a/packages/rs-platform-value-convertible/Cargo.toml b/packages/rs-platform-value-convertible/Cargo.toml index 6e9bc485db..fbcc3134d2 100644 --- a/packages/rs-platform-value-convertible/Cargo.toml +++ b/packages/rs-platform-value-convertible/Cargo.toml @@ -4,7 +4,7 @@ authors = ["Samuel Westrich "] description = "Convertion to and from platform values" version = "1.0.0-dev.5" edition = "2021" -rust-version = "1.73" +rust-version = "1.76" license = "MIT" private = true diff --git a/packages/rs-platform-value/Cargo.toml b/packages/rs-platform-value/Cargo.toml index ce92f4b6e2..b84c76bd31 100644 --- a/packages/rs-platform-value/Cargo.toml +++ b/packages/rs-platform-value/Cargo.toml @@ -4,7 +4,7 @@ authors = ["Samuel Westrich "] description = "A simple value module" version = "1.0.0-dev.5" edition = "2021" -rust-version = "1.73" +rust-version = "1.76" license = "MIT" private = true diff --git a/packages/rs-platform-version/Cargo.toml b/packages/rs-platform-version/Cargo.toml index 42666be4eb..5774fc1a54 100644 --- a/packages/rs-platform-version/Cargo.toml +++ b/packages/rs-platform-version/Cargo.toml @@ -4,7 +4,7 @@ authors = ["Samuel Westrich "] description = "Bincode based serialization and deserialization" version = "1.0.0-dev.5" edition = "2021" -rust-version = "1.73" +rust-version = "1.76" license = "MIT" private = true diff --git a/packages/rs-platform-version/src/version/drive_abci_versions.rs b/packages/rs-platform-version/src/version/drive_abci_versions.rs index 9c05683083..a24ef3b214 100644 --- a/packages/rs-platform-version/src/version/drive_abci_versions.rs +++ b/packages/rs-platform-version/src/version/drive_abci_versions.rs @@ -11,7 +11,6 @@ pub struct DriveAbciVersion { #[derive(Clone, Debug, Default)] pub struct DriveAbciQueryVersions { pub response_metadata: FeatureVersion, - pub base_query_structure: FeatureVersion, pub proofs_query: FeatureVersionBounds, pub document_query: FeatureVersionBounds, pub identity_based_queries: DriveAbciQueryIdentityVersions, diff --git a/packages/rs-platform-version/src/version/mocks/v2_test.rs b/packages/rs-platform-version/src/version/mocks/v2_test.rs index d9a376fa1e..6e72787ffe 100644 --- a/packages/rs-platform-version/src/version/mocks/v2_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v2_test.rs @@ -693,7 +693,6 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { }, query: DriveAbciQueryVersions { response_metadata: 0, - base_query_structure: 0, proofs_query: FeatureVersionBounds { min_version: 0, max_version: 0, diff --git a/packages/rs-platform-version/src/version/mocks/v3_test.rs b/packages/rs-platform-version/src/version/mocks/v3_test.rs index 062b39f61e..79f5a610ee 100644 --- a/packages/rs-platform-version/src/version/mocks/v3_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v3_test.rs @@ -693,7 +693,6 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { }, query: DriveAbciQueryVersions { response_metadata: 0, - base_query_structure: 0, proofs_query: FeatureVersionBounds { min_version: 0, max_version: 0, diff --git a/packages/rs-platform-version/src/version/v1.rs b/packages/rs-platform-version/src/version/v1.rs index aa267f3674..234684b094 100644 --- a/packages/rs-platform-version/src/version/v1.rs +++ b/packages/rs-platform-version/src/version/v1.rs @@ -690,7 +690,6 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { }, query: DriveAbciQueryVersions { response_metadata: 0, - base_query_structure: 0, proofs_query: FeatureVersionBounds { min_version: 0, max_version: 0, diff --git a/packages/rs-platform-versioning/Cargo.toml b/packages/rs-platform-versioning/Cargo.toml index 54bc14175e..9444c21f73 100644 --- a/packages/rs-platform-versioning/Cargo.toml +++ b/packages/rs-platform-versioning/Cargo.toml @@ -4,7 +4,7 @@ authors = ["Samuel Westrich "] description = "Version derivation" version = "1.0.0-dev.5" edition = "2021" -rust-version = "1.73" +rust-version = "1.76" license = "MIT" private = true diff --git a/packages/rs-sdk/Cargo.toml b/packages/rs-sdk/Cargo.toml index 2ca7eb515f..bdc02fb849 100644 --- a/packages/rs-sdk/Cargo.toml +++ b/packages/rs-sdk/Cargo.toml @@ -5,10 +5,10 @@ edition = "2021" [dependencies] dpp = { path = "../rs-dpp", features = ["all_features"] } -dapi-grpc = { path = "../dapi-grpc", features = ["client"] } +dapi-grpc = { path = "../dapi-grpc" } rs-dapi-client = { path = "../rs-dapi-client", default-features = false } drive = { path = "../rs-drive", default-features = false, features = [ - "verify", + "verify", ] } drive-proof-verifier = { path = "../rs-drive-proof-verifier" } dapi-grpc-macros = { path = "../rs-dapi-grpc-macros" } @@ -38,9 +38,9 @@ rs-dapi-client = { path = "../rs-dapi-client", features = ["mocks"] } base64 = { version = "0.21.0" } tracing-subscriber = { version = "0.3.16" } dpp = { path = "../rs-dpp", features = [ - "client", - "validation", - "random-documents", + "client", + "validation", + "random-documents", ] } data-contracts = { path = "../data-contracts" } tokio-test = { version = "0.4.3" } @@ -49,18 +49,18 @@ clap = { version = "4.4.18", features = ["derive"] } [features] default = ["mocks", "offline-testing"] mocks = [ - "dep:serde_json", - "rs-dapi-client/mocks", - "rs-dapi-client/dump", - "dpp/document-cbor-conversion", - "dpp/identity-value-conversion", - "dpp/random-identities", - "drive-proof-verifier/mocks", - "dep:bincode", - "dep:hex", - "dep:dotenvy", - "dep:envy", - "dep:lru", + "dep:serde_json", + "rs-dapi-client/mocks", + "rs-dapi-client/dump", + "dpp/document-cbor-conversion", + "dpp/identity-value-conversion", + "dpp/random-identities", + "drive-proof-verifier/mocks", + "dep:bincode", + "dep:hex", + "dep:dotenvy", + "dep:envy", + "dep:lru", ] # Run integration tests using test vectors from `tests/vectors/` instead of connecting to live Dash Platform. diff --git a/packages/simple-signer/Cargo.toml b/packages/simple-signer/Cargo.toml index 2dd6ed50f7..226938a0e4 100644 --- a/packages/simple-signer/Cargo.toml +++ b/packages/simple-signer/Cargo.toml @@ -2,7 +2,7 @@ name = "simple-signer" version = "1.0.0-dev.5" edition = "2021" -rust-version = "1.73" +rust-version = "1.76" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/packages/strategy-tests/Cargo.toml b/packages/strategy-tests/Cargo.toml index 9e8b0a1e8c..c73a37f8a5 100644 --- a/packages/strategy-tests/Cargo.toml +++ b/packages/strategy-tests/Cargo.toml @@ -2,12 +2,12 @@ name = "strategy-tests" version = "1.0.0-dev.5" authors = [ - "Samuel Westrich ", - "Ivan Shumkov ", - "Paul DeLucia ", + "Samuel Westrich ", + "Ivan Shumkov ", + "Paul DeLucia ", ] edition = "2021" -rust-version = "1.73" +rust-version = "1.76" license = "MIT" [dependencies] @@ -15,29 +15,29 @@ tracing = "0.1.4" futures = "0.3" bincode = { version = "2.0.0-rc.3", features = ["serde"] } drive = { path = "../rs-drive", default-features = false, features = [ - "verify", + "verify", ] } rand = "0.8.5" hex = "0.4.3" serde_json = "1.0" dpp = { path = "../rs-dpp", features = [ - "abci", - "random-documents", - "state-transition-signing", - "random-identities", - "random-public-keys", - "random-document-types", - "fixtures-and-mocks", - "identity-value-conversion", - "data-contract-json-conversion", - "data-contract-cbor-conversion", + "abci", + "random-documents", + "state-transition-signing", + "random-identities", + "random-public-keys", + "random-document-types", + "fixtures-and-mocks", + "identity-value-conversion", + "data-contract-json-conversion", + "data-contract-cbor-conversion", ] } simple-signer = { path = "../simple-signer" } platform-version = { path = "../rs-platform-version" } [dev-dependencies] platform-version = { path = "../rs-platform-version", features = [ - "mock-versions", + "mock-versions", ] } # For tests of grovedb verify diff --git a/packages/strategy-tests/src/lib.rs b/packages/strategy-tests/src/lib.rs index be30b702e1..24bc26652e 100644 --- a/packages/strategy-tests/src/lib.rs +++ b/packages/strategy-tests/src/lib.rs @@ -281,12 +281,10 @@ impl Strategy { pub fn used_contract_ids(&self) -> BTreeSet { self.operations .iter() - .filter_map(|operation| { - match &operation.op_type { - OperationType::Document(document) => Some(document.contract.id()), - OperationType::ContractUpdate(op) => Some(op.contract.id()), - _ => None, - } + .filter_map(|operation| match &operation.op_type { + OperationType::Document(document) => Some(document.contract.id()), + OperationType::ContractUpdate(op) => Some(op.contract.id()), + _ => None, }) .collect() } diff --git a/packages/wasm-dpp/Cargo.toml b/packages/wasm-dpp/Cargo.toml index 7d44d1c5d6..fa3c2f3656 100644 --- a/packages/wasm-dpp/Cargo.toml +++ b/packages/wasm-dpp/Cargo.toml @@ -2,7 +2,7 @@ name = "wasm-dpp" version = "1.0.0-dev.5" edition = "2021" -rust-version = "1.73" +rust-version = "1.76" authors = ["Anton Suprunchuk "] [lib] diff --git a/packages/withdrawals-contract/.eslintrc b/packages/withdrawals-contract/.eslintrc index eec7881491..cb6c7636b6 100644 --- a/packages/withdrawals-contract/.eslintrc +++ b/packages/withdrawals-contract/.eslintrc @@ -1,15 +1,18 @@ { - "extends": "airbnb-base", - "rules": { - "no-plusplus": 0, - "eol-last": [ - "error", - "always" - ], - "class-methods-use-this": "off", - "curly": [ - "error", - "all" - ] - } -} \ No newline at end of file + "extends": "airbnb-base", + "rules": { + "no-plusplus": 0, + "eol-last": [ + "error", + "always" + ], + "class-methods-use-this": "off", + "curly": [ + "error", + "all" + ] + }, + "globals": { + "BigInt": true + } +} diff --git a/packages/withdrawals-contract/Cargo.toml b/packages/withdrawals-contract/Cargo.toml index 8a35c84d32..eb4fabae2d 100644 --- a/packages/withdrawals-contract/Cargo.toml +++ b/packages/withdrawals-contract/Cargo.toml @@ -3,7 +3,7 @@ name = "withdrawals-contract" description = "Witdrawals data contract schema and tools" version = "1.0.0-dev.5" edition = "2021" -rust-version = "1.73" +rust-version = "1.76" license = "MIT" [dependencies] diff --git a/packages/withdrawals-contract/test/unit/withdrawalsContract.spec.js b/packages/withdrawals-contract/test/unit/withdrawalsContract.spec.js index 70e573318b..09770ee81f 100644 --- a/packages/withdrawals-contract/test/unit/withdrawalsContract.spec.js +++ b/packages/withdrawals-contract/test/unit/withdrawalsContract.spec.js @@ -1,4 +1,7 @@ -const { DashPlatformProtocol, JsonSchemaError } = require('@dashevo/wasm-dpp'); +const { + DashPlatformProtocol, + JsonSchemaError, +} = require('@dashevo/wasm-dpp'); const generateRandomIdentifier = require('@dashevo/wasm-dpp/lib/test/utils/generateRandomIdentifierAsync'); @@ -8,10 +11,16 @@ const withdrawalContractDocumentsSchema = require('../../schema/v1/withdrawals-d const expectJsonSchemaError = (validationResult, errorCount = 1) => { const errors = validationResult.getErrors(); - expect(errors).to.have.length(errorCount); + expect(errors) + .to + .have + .length(errorCount); const error = validationResult.getErrors()[0]; - expect(error).to.be.instanceof(JsonSchemaError); + expect(error) + .to + .be + .instanceof(JsonSchemaError); return error; }; @@ -28,12 +37,18 @@ describe('Withdrawals contract', () => { identityId = await generateRandomIdentifier(); - dataContract = dpp.dataContract.create(identityId, withdrawalContractDocumentsSchema); + dataContract = dpp.dataContract.create( + identityId, + BigInt(1), + withdrawalContractDocumentsSchema, + ); }); it('should have a valid contract definition', async () => { - expect(() => dpp.dataContract.create(identityId, withdrawalContractDocumentsSchema)) - .to.not.throw(); + expect(() => dpp.dataContract.create(identityId, BigInt(1), withdrawalContractDocumentsSchema)) + .to + .not + .throw(); }); describe('documents', () => { @@ -59,8 +74,12 @@ describe('Withdrawals contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('required'); - expect(error.params.missingProperty).to.equal('amount'); + expect(error.keyword) + .to + .equal('required'); + expect(error.params.missingProperty) + .to + .equal('amount'); }); it('should be integer', () => { @@ -70,8 +89,12 @@ describe('Withdrawals contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('type'); - expect(error.params.type).to.equal('integer'); + expect(error.keyword) + .to + .equal('type'); + expect(error.params.type) + .to + .equal('integer'); }); it('should be at least 1000', () => { @@ -81,8 +104,12 @@ describe('Withdrawals contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('minimum'); - expect(error.params.minimum).to.equal(1000); + expect(error.keyword) + .to + .equal('minimum'); + expect(error.params.minimum) + .to + .equal(1000); }); }); @@ -94,8 +121,12 @@ describe('Withdrawals contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('type'); - expect(error.params.type).to.equal('integer'); + expect(error.keyword) + .to + .equal('type'); + expect(error.params.type) + .to + .equal('integer'); }); it('should be at least 1', () => { @@ -105,8 +136,12 @@ describe('Withdrawals contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('minimum'); - expect(error.params.minimum).to.equal(1); + expect(error.keyword) + .to + .equal('minimum'); + expect(error.params.minimum) + .to + .equal(1); }); }); @@ -118,8 +153,12 @@ describe('Withdrawals contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('type'); - expect(error.params.type).to.equal('integer'); + expect(error.keyword) + .to + .equal('type'); + expect(error.params.type) + .to + .equal('integer'); }); it('should be at least 1', () => { @@ -129,8 +168,12 @@ describe('Withdrawals contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('minimum'); - expect(error.params.minimum).to.equal(1); + expect(error.keyword) + .to + .equal('minimum'); + expect(error.params.minimum) + .to + .equal(1); }); }); @@ -142,8 +185,12 @@ describe('Withdrawals contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('required'); - expect(error.params.missingProperty).to.equal('coreFeePerByte'); + expect(error.keyword) + .to + .equal('required'); + expect(error.params.missingProperty) + .to + .equal('coreFeePerByte'); }); it('should be integer', () => { @@ -153,8 +200,12 @@ describe('Withdrawals contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('type'); - expect(error.params.type).to.equal('integer'); + expect(error.keyword) + .to + .equal('type'); + expect(error.params.type) + .to + .equal('integer'); }); it('should be at least 1', () => { @@ -164,8 +215,12 @@ describe('Withdrawals contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('minimum'); - expect(error.params.minimum).to.equal(1); + expect(error.keyword) + .to + .equal('minimum'); + expect(error.params.minimum) + .to + .equal(1); }); }); @@ -177,8 +232,12 @@ describe('Withdrawals contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('required'); - expect(error.params.missingProperty).to.equal('pooling'); + expect(error.keyword) + .to + .equal('required'); + expect(error.params.missingProperty) + .to + .equal('pooling'); }); it('should be integer', () => { @@ -188,8 +247,12 @@ describe('Withdrawals contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult, 2); - expect(error.keyword).to.equal('type'); - expect(error.params.type).to.equal('integer'); + expect(error.keyword) + .to + .equal('type'); + expect(error.params.type) + .to + .equal('integer'); }); it('should be within enum range', () => { @@ -199,7 +262,9 @@ describe('Withdrawals contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('enum'); + expect(error.keyword) + .to + .equal('enum'); }); }); @@ -211,8 +276,12 @@ describe('Withdrawals contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('required'); - expect(error.params.missingProperty).to.equal('outputScript'); + expect(error.keyword) + .to + .equal('required'); + expect(error.params.missingProperty) + .to + .equal('outputScript'); }); it('should be byte array', () => { @@ -222,8 +291,12 @@ describe('Withdrawals contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('type'); - expect(error.params.type).to.equal('array'); + expect(error.keyword) + .to + .equal('type'); + expect(error.params.type) + .to + .equal('array'); }); it('should be not less then 23 bytes long', () => { @@ -233,8 +306,12 @@ describe('Withdrawals contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('minItems'); - expect(error.params.minItems).to.equal(23); + expect(error.keyword) + .to + .equal('minItems'); + expect(error.params.minItems) + .to + .equal(23); }); it('should be not more then 25 bytes long', () => { @@ -244,8 +321,12 @@ describe('Withdrawals contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('maxItems'); - expect(error.params.maxItems).to.equal(25); + expect(error.keyword) + .to + .equal('maxItems'); + expect(error.params.maxItems) + .to + .equal(25); }); }); @@ -257,8 +338,12 @@ describe('Withdrawals contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('required'); - expect(error.params.missingProperty).to.equal('status'); + expect(error.keyword) + .to + .equal('required'); + expect(error.params.missingProperty) + .to + .equal('status'); }); it('should be integer', () => { @@ -268,8 +353,12 @@ describe('Withdrawals contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult, 2); - expect(error.keyword).to.equal('type'); - expect(error.params.type).to.equal('integer'); + expect(error.keyword) + .to + .equal('type'); + expect(error.params.type) + .to + .equal('integer'); }); it('should be within enum range', () => { @@ -279,7 +368,9 @@ describe('Withdrawals contract', () => { const validationResult = document.validate(dpp.protocolVersion); const error = expectJsonSchemaError(validationResult); - expect(error.keyword).to.equal('enum'); + expect(error.keyword) + .to + .equal('enum'); }); }); @@ -288,7 +379,10 @@ describe('Withdrawals contract', () => { const result = await withdrawal.validate(dpp.protocolVersion); - expect(result.isValid()).to.be.true(); + expect(result.isValid()) + .to + .be + .true(); }); }); }); diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 0b9461857b..6ff0f74bf9 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,5 +1,5 @@ [toolchain] # Rust version the same as in /README.md -channel = "stable" +channel = "1.76" targets = ["wasm32-unknown-unknown"] From 208718f78eab2cc8cb1fad05ca4551655e2bd804 Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Tue, 5 Mar 2024 23:48:37 +0700 Subject: [PATCH 053/191] feat(platform): better RW locking of platform state using parking lot (#1734) --- Cargo.lock | 2 + packages/rs-drive-abci/Cargo.toml | 1 + .../rs-drive-abci/src/abci/app/consensus.rs | 2 +- packages/rs-drive-abci/src/abci/app/full.rs | 2 +- .../src/abci/handler/check_tx.rs | 2 +- .../rs-drive-abci/src/abci/handler/info.rs | 2 +- .../src/abci/handler/init_chain.rs | 2 +- .../src/abci/handler/prepare_proposal.rs | 2 +- .../src/execution/check_tx/v0/mod.rs | 24 +-- .../engine/finalize_block_proposal/mod.rs | 2 +- .../engine/finalize_block_proposal/v0/mod.rs | 2 +- .../engine/initialization/init_chain/mod.rs | 2 +- .../initialization/init_chain/v0/mod.rs | 2 +- .../engine/run_block_proposal/mod.rs | 2 +- .../engine/run_block_proposal/v0/mod.rs | 4 +- .../block_end/update_drive_cache/v0/mod.rs | 3 +- .../block_end/update_state_cache/v0/mod.rs | 2 +- .../clear_drive_block_cache/v0/mod.rs | 3 +- .../epoch/gather_epoch_info/v0/mod.rs | 2 +- .../v0/mod.rs | 2 +- .../create_genesis_state/v0/mod.rs | 22 ++- .../v0/mod.rs | 3 +- .../data_contract_update/mod.rs | 6 +- .../data_triggers/triggers/dashpay/v0/mod.rs | 6 +- .../data_triggers/triggers/dpns/v0/mod.rs | 2 +- .../triggers/feature_flags/v0/mod.rs | 2 +- .../triggers/withdrawals/v0/mod.rs | 4 +- .../src/platform_types/platform/mod.rs | 12 +- .../data_contract_history/v0/mod.rs | 2 +- packages/rs-drive-abci/src/query/mod.rs | 1 - .../src/query/response_metadata/v0/mod.rs | 4 +- .../src/query/system/epoch_infos/v0/mod.rs | 2 +- .../system/version_upgrade_state/v0/mod.rs | 7 +- .../version_upgrade_vote_status/v0/mod.rs | 4 +- .../rs-drive-abci/src/test/helpers/setup.rs | 1 - .../tests/strategy_tests/core_update_tests.rs | 4 +- .../tests/strategy_tests/execution.rs | 6 +- .../tests/strategy_tests/main.rs | 25 +-- .../tests/strategy_tests/query.rs | 21 +-- .../tests/strategy_tests/strategy.rs | 2 +- .../strategy_tests/upgrade_fork_tests.rs | 169 +++--------------- .../verify_state_transitions.rs | 2 +- packages/rs-drive/Cargo.toml | 1 + packages/rs-drive/src/drive/cache.rs | 4 +- .../src/drive/cache/system_contracts.rs | 32 ++-- packages/rs-drive/src/drive/open/mod.rs | 4 +- .../src/drive/operations/drop_cache/v0/mod.rs | 5 +- .../v0/mod.rs | 2 +- .../v0/mod.rs | 2 +- .../src/drive/system/genesis_time/mod.rs | 10 +- 50 files changed, 144 insertions(+), 288 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 74952ba8b3..c37eb2c196 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1299,6 +1299,7 @@ dependencies = [ "itertools 0.11.0", "moka", "nohash-hasher", + "parking_lot", "platform-version", "rand", "serde", @@ -1338,6 +1339,7 @@ dependencies = [ "metrics", "metrics-exporter-prometheus", "mockall", + "parking_lot", "platform-version", "prost 0.12.3", "rand", diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index 9c69fdf033..50e993c329 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -29,6 +29,7 @@ drive = { path = "../rs-drive", default-features = false, features = [ thiserror = "1.0.30" rand = "0.8.5" tempfile = "3.3.0" +parking_lot = "0.12.1" hex = "0.4.3" indexmap = { version = "1.9.3", features = ["serde"] } sha2 = "0.10.6" diff --git a/packages/rs-drive-abci/src/abci/app/consensus.rs b/packages/rs-drive-abci/src/abci/app/consensus.rs index 9db7ea5578..be940cd1d9 100644 --- a/packages/rs-drive-abci/src/abci/app/consensus.rs +++ b/packages/rs-drive-abci/src/abci/app/consensus.rs @@ -59,7 +59,7 @@ impl<'a, C> TransactionalApplication<'a> for ConsensusAbciApplication<'a, C> { "trying to commit a transaction, but we are not in one", )))?; - let platform_state = self.platform.state.read().unwrap(); + let platform_state = self.platform.state.read(); let platform_version = platform_state.current_platform_version()?; self.platform .drive diff --git a/packages/rs-drive-abci/src/abci/app/full.rs b/packages/rs-drive-abci/src/abci/app/full.rs index d4ff765d82..4dc20c4c39 100644 --- a/packages/rs-drive-abci/src/abci/app/full.rs +++ b/packages/rs-drive-abci/src/abci/app/full.rs @@ -58,7 +58,7 @@ impl<'a, C> TransactionalApplication<'a> for FullAbciApplication<'a, C> { .ok_or(Error::Execution(ExecutionError::NotInTransaction( "trying to commit a transaction, but we are not in one", )))?; - let platform_state = self.platform.state.read().unwrap(); + let platform_state = self.platform.state.read(); let platform_version = platform_state.current_platform_version()?; self.platform .drive diff --git a/packages/rs-drive-abci/src/abci/handler/check_tx.rs b/packages/rs-drive-abci/src/abci/handler/check_tx.rs index 39063c26b5..63eed5b87f 100644 --- a/packages/rs-drive-abci/src/abci/handler/check_tx.rs +++ b/packages/rs-drive-abci/src/abci/handler/check_tx.rs @@ -16,7 +16,7 @@ where { let _timer = crate::metrics::abci_request_duration("check_tx"); - let platform_state = platform.state.read().unwrap(); + let platform_state = platform.state.read(); let platform_version = platform_state.current_platform_version()?; drop(platform_state); diff --git a/packages/rs-drive-abci/src/abci/handler/info.rs b/packages/rs-drive-abci/src/abci/handler/info.rs index 71a299dc87..7c6fd64869 100644 --- a/packages/rs-drive-abci/src/abci/handler/info.rs +++ b/packages/rs-drive-abci/src/abci/handler/info.rs @@ -19,7 +19,7 @@ where .into()); } - let state_guard = app.platform().state.read().unwrap(); + let state_guard = app.platform().state.read(); let state_app_hash = state_guard .last_committed_block_app_hash() diff --git a/packages/rs-drive-abci/src/abci/handler/init_chain.rs b/packages/rs-drive-abci/src/abci/handler/init_chain.rs index 883217835f..0d433ee845 100644 --- a/packages/rs-drive-abci/src/abci/handler/init_chain.rs +++ b/packages/rs-drive-abci/src/abci/handler/init_chain.rs @@ -22,7 +22,7 @@ where if block_context.is_some() { tracing::warn!("block context was present during init chain, restarting"); let protocol_version_in_consensus = app.platform().config.initial_protocol_version; - let mut platform_state_write_guard = app.platform().state.write().unwrap(); + let mut platform_state_write_guard = app.platform().state.write(); *platform_state_write_guard = PlatformState::default_with_protocol_versions( protocol_version_in_consensus, protocol_version_in_consensus, diff --git a/packages/rs-drive-abci/src/abci/handler/prepare_proposal.rs b/packages/rs-drive-abci/src/abci/handler/prepare_proposal.rs index d7e53e992e..b4587cffb9 100644 --- a/packages/rs-drive-abci/src/abci/handler/prepare_proposal.rs +++ b/packages/rs-drive-abci/src/abci/handler/prepare_proposal.rs @@ -30,7 +30,7 @@ where // propose one // This is done before all else - let state = app.platform().state.read().unwrap(); + let state = app.platform().state.read(); let last_committed_core_height = state.last_committed_core_height(); diff --git a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs index 416eda3226..ea5d271d2d 100644 --- a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs @@ -39,7 +39,7 @@ where let state_transition = StateTransition::deserialize_from_bytes(raw_tx.as_slice()).map_err(Error::Protocol)?; - let state_read_guard = self.state.read().unwrap(); + let state_read_guard = self.state.read(); let platform_ref = PlatformRef { drive: &self.drive, @@ -102,7 +102,7 @@ where // TODO: We lock state for entire check tx execution that could lead to performance issues // and writer starvation. - let state_read_guard = self.state.read().unwrap(); + let state_read_guard = self.state.read(); let platform_ref = PlatformRef { drive: &self.drive, @@ -216,7 +216,7 @@ mod tests { .expect_verify_instant_lock() .returning(|_, _| Ok(true)); - let state = platform.state.read().unwrap(); + let state = platform.state.read(); let protocol_version = state.current_protocol_version_in_consensus(); let platform_version = PlatformVersion::get(protocol_version).unwrap(); @@ -310,7 +310,7 @@ mod tests { .expect_verify_instant_lock() .returning(|_, _| Ok(true)); - let state = platform.state.read().unwrap(); + let state = platform.state.read(); let protocol_version = state.current_protocol_version_in_consensus(); let platform_version = PlatformVersion::get(protocol_version).unwrap(); @@ -414,7 +414,7 @@ mod tests { .expect_verify_instant_lock() .returning(|_, _| Ok(true)); - let state = platform.state.read().unwrap(); + let state = platform.state.read(); let protocol_version = state.current_protocol_version_in_consensus(); let platform_version = PlatformVersion::get(protocol_version).unwrap(); @@ -519,7 +519,7 @@ mod tests { .expect_verify_instant_lock() .returning(|_, _| Ok(true)); - let platform_state = platform.state.read().unwrap(); + let platform_state = platform.state.read(); let platform_version = platform_state.current_platform_version().unwrap(); let mut signer = SimpleSigner::default(); @@ -695,7 +695,7 @@ mod tests { .expect_verify_instant_lock() .returning(|_, _| Ok(true)); - let platform_state = platform.state.read().unwrap(); + let platform_state = platform.state.read(); let platform_version = platform_state.current_platform_version().unwrap(); let mut signer = SimpleSigner::default(); @@ -823,7 +823,7 @@ mod tests { .expect_verify_instant_lock() .returning(|_, _| Ok(true)); - let platform_state = platform.state.read().unwrap(); + let platform_state = platform.state.read(); let platform_version = platform_state.current_platform_version().unwrap(); let mut signer = SimpleSigner::default(); @@ -981,7 +981,7 @@ mod tests { .expect_verify_instant_lock() .returning(|_, _| Ok(true)); - let platform_state = platform.state.read().unwrap(); + let platform_state = platform.state.read(); let platform_version = platform_state.current_platform_version().unwrap(); let mut signer = SimpleSigner::default(); @@ -1071,7 +1071,7 @@ mod tests { .expect_verify_instant_lock() .returning(|_, _| Ok(true)); - let platform_state = platform.state.read().unwrap(); + let platform_state = platform.state.read(); let platform_version = platform_state.current_platform_version().unwrap(); let mut signer = SimpleSigner::default(); @@ -1291,7 +1291,7 @@ mod tests { .expect_verify_instant_lock() .returning(|_, _| Ok(true)); - let platform_state = platform.state.read().unwrap(); + let platform_state = platform.state.read(); let platform_version = platform_state.current_platform_version().unwrap(); let genesis_time = 0; @@ -1404,7 +1404,7 @@ mod tests { .expect_verify_instant_lock() .returning(|_, _| Ok(true)); - let platform_state = platform.state.read().unwrap(); + let platform_state = platform.state.read(); let platform_version = platform_state.current_platform_version().unwrap(); let genesis_time = 0; diff --git a/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/mod.rs b/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/mod.rs index 88998b490d..5e1e721870 100644 --- a/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/mod.rs @@ -36,7 +36,7 @@ where request_finalize_block: FinalizeBlockCleanedRequest, transaction: &Transaction, ) -> Result { - let state = self.state.read().expect("expected to get state"); + let state = self.state.read(); let current_protocol_version = state.current_protocol_version_in_consensus(); drop(state); let platform_version = PlatformVersion::get(current_protocol_version)?; diff --git a/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/v0/mod.rs b/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/v0/mod.rs index 1ee33c8596..332aeb9c15 100644 --- a/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/v0/mod.rs @@ -134,7 +134,7 @@ where return Ok(validation_result.into()); } - let state_cache = self.state.read().unwrap(); + let state_cache = self.state.read(); let current_quorum_hash = state_cache.current_validator_set_quorum_hash().into(); if current_quorum_hash != commit_info.quorum_hash { validation_result.add_error(AbciError::WrongFinalizeBlockReceived(format!( diff --git a/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/mod.rs b/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/mod.rs index 86cd53cdac..3cdd67c646 100644 --- a/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/mod.rs @@ -21,7 +21,7 @@ where request: RequestInitChain, transaction: &Transaction, ) -> Result { - let state = self.state.read().expect("expected to get state"); + let state = self.state.read(); let platform_version = state.current_platform_version()?; drop(state); diff --git a/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/v0/mod.rs b/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/v0/mod.rs index 2aa68d7f04..5d21e80174 100644 --- a/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/v0/mod.rs @@ -44,7 +44,7 @@ where platform_version, )?; - let mut state_guard = self.state.write().unwrap(); + let mut state_guard = self.state.write(); let genesis_block_info = BlockInfo { height: request.initial_height, diff --git a/packages/rs-drive-abci/src/execution/engine/run_block_proposal/mod.rs b/packages/rs-drive-abci/src/execution/engine/run_block_proposal/mod.rs index 639c2dd8fa..cdcf50ff12 100644 --- a/packages/rs-drive-abci/src/execution/engine/run_block_proposal/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/run_block_proposal/mod.rs @@ -45,7 +45,7 @@ where transaction: &Transaction, ) -> Result, Error> { - let state = self.state.read().expect("expected to get state"); + let state = self.state.read(); let platform_version = state.current_platform_version()?; drop(state); diff --git a/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs b/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs index 98216c72f8..9c3126197d 100644 --- a/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs @@ -77,7 +77,7 @@ where ); // Start by getting information from the state - let state = self.state.read().unwrap(); + let state = self.state.read(); let last_block_time_ms = state.last_committed_block_time_ms(); let last_block_height = @@ -360,7 +360,7 @@ where .block_state_info_mut() .set_app_hash(Some(root_hash)); - let state = self.state.read().unwrap(); + let state = self.state.read(); let validator_set_update = self.validator_set_update(&state, &mut block_execution_context, platform_version)?; diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_end/update_drive_cache/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_end/update_drive_cache/v0/mod.rs index 1947221527..96f8fcea4b 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/block_end/update_drive_cache/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/block_end/update_drive_cache/v0/mod.rs @@ -15,8 +15,7 @@ where .data_contracts .merge_and_clear_block_cache(); - let mut protocol_versions_counter = - self.drive.cache.protocol_versions_counter.write().unwrap(); + let mut protocol_versions_counter = self.drive.cache.protocol_versions_counter.write(); protocol_versions_counter.merge_block_cache() } diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_end/update_state_cache/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_end/update_state_cache/v0/mod.rs index 12b23df2ca..4d1f8a69cd 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/block_end/update_state_cache/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/block_end/update_state_cache/v0/mod.rs @@ -49,7 +49,7 @@ where "there should be a block execution context", )))?; - let mut state_cache = self.state.write().unwrap(); + let mut state_cache = self.state.write(); *state_cache = block_execution_context.block_platform_state_owned(); diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_start/clear_drive_block_cache/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_start/clear_drive_block_cache/v0/mod.rs index 31af9c5035..06750ab6e0 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/block_start/clear_drive_block_cache/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/block_start/clear_drive_block_cache/v0/mod.rs @@ -11,8 +11,7 @@ where pub(super) fn clear_drive_block_cache_v0(&self) { self.drive.cache.data_contracts.clear_block_cache(); - let mut protocol_versions_counter = - self.drive.cache.protocol_versions_counter.write().unwrap(); + let mut protocol_versions_counter = self.drive.cache.protocol_versions_counter.write(); protocol_versions_counter.clear_block_cache() } diff --git a/packages/rs-drive-abci/src/execution/platform_events/epoch/gather_epoch_info/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/epoch/gather_epoch_info/v0/mod.rs index 373531cb5f..3e1bacb368 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/epoch/gather_epoch_info/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/epoch/gather_epoch_info/v0/mod.rs @@ -17,7 +17,7 @@ impl Platform { platform_version: &PlatformVersion, ) -> Result { // Start by getting information from the state - let state = self.state.read().unwrap(); + let state = self.state.read(); let last_block_time_ms = state.last_committed_block_time_ms(); drop(state); diff --git a/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/add_epoch_pool_to_proposers_payout_operations/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/add_epoch_pool_to_proposers_payout_operations/v0/mod.rs index 0c7a65f0a7..00728ea52b 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/add_epoch_pool_to_proposers_payout_operations/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/add_epoch_pool_to_proposers_payout_operations/v0/mod.rs @@ -187,7 +187,7 @@ mod tests { .build_with_mock_rpc() .set_initial_state_structure(); - let platform_read_guard = platform.state.read().unwrap(); + let platform_read_guard = platform.state.read(); let platform_version = platform_read_guard .current_platform_version() .expect("platform_version"); diff --git a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs index 3e9f3aa6ca..805c6a239d 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs @@ -83,20 +83,20 @@ impl Platform { let system_data_contracts = &self.drive.cache.system_data_contracts; - let dpns_data_contract = system_data_contracts.read_dpns().clone(); + let dpns_data_contract = system_data_contracts.read_dpns(); let system_data_contract_types = BTreeMap::from_iter([ ( SystemDataContract::DPNS, ( - system_data_contracts.read_dpns().clone(), + system_data_contracts.read_dpns(), system_identity_public_keys.dpns_contract_owner(), ), ), ( SystemDataContract::Withdrawals, ( - system_data_contracts.read_withdrawals().clone(), + system_data_contracts.read_withdrawals(), system_identity_public_keys.withdrawals_contract_owner(), ), ), @@ -114,22 +114,20 @@ impl Platform { ( SystemDataContract::Dashpay, ( - system_data_contracts.read_dashpay().clone(), + system_data_contracts.read_dashpay(), system_identity_public_keys.dashpay_contract_owner(), ), ), ( SystemDataContract::MasternodeRewards, ( - system_data_contracts - .read_masternode_reward_shares() - .clone(), + system_data_contracts.read_masternode_reward_shares(), system_identity_public_keys.masternode_reward_shares_contract_owner(), ), ), ]); - for (_, (data_contract, identity_public_keys_set)) in system_data_contract_types { + for (_, (data_contract, identity_public_keys_set)) in &system_data_contract_types { let public_keys = [ ( 0, @@ -193,10 +191,10 @@ impl Platform { Ok(()) } - fn register_system_data_contract_operations( + fn register_system_data_contract_operations<'a>( &self, - data_contract: DataContract, - operations: &mut Vec, + data_contract: &'a DataContract, + operations: &mut Vec>, platform_version: &PlatformVersion, ) -> Result<(), Error> { let serialization = @@ -204,7 +202,7 @@ impl Platform { operations.push(DriveOperation::DataContractOperation( //todo: remove cbor DataContractOperationType::ApplyContractWithSerialization { - contract: Cow::Owned(data_contract), + contract: Cow::Borrowed(data_contract), serialized_contract: serialization, storage_flags: None, }, diff --git a/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/check_for_desired_protocol_upgrade/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/check_for_desired_protocol_upgrade/v0/mod.rs index beb752f230..2d7073d9b7 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/check_for_desired_protocol_upgrade/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/check_for_desired_protocol_upgrade/v0/mod.rs @@ -30,8 +30,7 @@ impl Platform { // if we are at an epoch change, check to see if over 75% of blocks of previous epoch // were on the future version - let mut protocol_versions_counter = - self.drive.cache.protocol_versions_counter.write().unwrap(); + let mut protocol_versions_counter = self.drive.cache.protocol_versions_counter.write(); let mut versions_passing_threshold = protocol_versions_counter.versions_passing_threshold(required_upgraded_hpns); drop(protocol_versions_counter); diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs index 41260881b7..3d69dd2469 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs @@ -189,7 +189,7 @@ mod tests { signature_public_key_id: 0, }; - let state = platform.state.read().unwrap(); + let state = platform.state.read(); let platform_ref = PlatformRef { drive: &platform.drive, @@ -269,7 +269,7 @@ mod tests { signature_public_key_id: 0, }; - let state = platform.state.read().unwrap(); + let state = platform.state.read(); let platform_ref = PlatformRef { drive: &platform.drive, @@ -419,7 +419,7 @@ mod tests { let state_transition: DataContractUpdateTransition = state_transition.into(); - let state = platform.state.read().unwrap(); + let state = platform.state.read(); let platform_ref = PlatformRef { drive: &platform.drive, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/v0/mod.rs index 766537be43..1f19eb86d5 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/v0/mod.rs @@ -168,7 +168,7 @@ mod test { .set_initial_state_structure(); let mut nonce_counter = BTreeMap::new(); - let state_read_guard = platform.state.read().unwrap(); + let state_read_guard = platform.state.read(); let platform_ref = PlatformStateRef { drive: &platform.drive, state: &state_read_guard, @@ -242,7 +242,7 @@ mod test { let mut nonce_counter = BTreeMap::new(); - let mut state_write_guard = platform.state.write().unwrap(); + let mut state_write_guard = platform.state.write(); state_write_guard.set_last_committed_block_info(Some( ExtendedBlockInfoV0 { @@ -359,7 +359,7 @@ mod test { let mut nonce_counter = BTreeMap::new(); - let mut state_write_guard = platform.state.write().unwrap(); + let mut state_write_guard = platform.state.write(); state_write_guard.set_last_committed_block_info(Some( ExtendedBlockInfoV0 { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs index c1d1904bd1..f4aac4d269 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs @@ -444,7 +444,7 @@ mod test { let mut nonce_counter = BTreeMap::new(); - let state_read_guard = platform.state.read().unwrap(); + let state_read_guard = platform.state.read(); let platform_ref = PlatformStateRef { drive: &platform.drive, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/feature_flags/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/feature_flags/v0/mod.rs index ca09ece118..6ded8e0759 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/feature_flags/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/feature_flags/v0/mod.rs @@ -117,7 +117,7 @@ mod test { // let platform = TestPlatformBuilder::new() // .build_with_mock_rpc() // .set_initial_state_structure(); - // let state_read_guard = platform.state.read().unwrap(); + // let state_read_guard = platform.state.read(); // // let platform_ref = PlatformStateRef { // drive: &platform.drive, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs index 4c4a93467f..0ba0081999 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs @@ -158,7 +158,7 @@ mod tests { let platform = TestPlatformBuilder::new() .build_with_mock_rpc() .set_initial_state_structure(); - let state_read_guard = platform.state.read().unwrap(); + let state_read_guard = platform.state.read(); let platform_ref = PlatformStateRef { drive: &platform.drive, state: &state_read_guard, @@ -248,7 +248,7 @@ mod tests { let platform = TestPlatformBuilder::new() .build_with_mock_rpc() .set_genesis_state(); - let state_read_guard = platform.state.read().unwrap(); + let state_read_guard = platform.state.read(); let platform_ref = PlatformStateRef { drive: &platform.drive, diff --git a/packages/rs-drive-abci/src/platform_types/platform/mod.rs b/packages/rs-drive-abci/src/platform_types/platform/mod.rs index 62659501b1..ddf16149c6 100644 --- a/packages/rs-drive-abci/src/platform_types/platform/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/platform/mod.rs @@ -29,7 +29,11 @@ pub struct Platform { /// Drive pub drive: Drive, /// State - pub state: RwLock, + // We use a parking_lot::RwLock because of it's writer priority which is essential so our + // readers in check_tx don't starve block finalization + // Todo: Block finalization can still be delayed until we acquire the write lock. We might want + // to think of a custom approach where the writer is always placed at the front of the queue. + pub state: parking_lot::RwLock, /// Configuration pub config: PlatformConfig, /// Block execution context @@ -154,7 +158,7 @@ impl Platform { persisted_state.current_protocol_version_in_consensus(), )?); - let mut state_cache = self.state.write().unwrap(); + let mut state_cache = self.state.write(); *state_cache = persisted_state; Ok(true) @@ -220,7 +224,7 @@ impl Platform { let platform: Platform = Platform { drive, - state: RwLock::new(platform_state), + state: parking_lot::RwLock::new(platform_state), config, block_execution_context: RwLock::new(None), core_rpc, @@ -249,7 +253,7 @@ impl Platform { Ok(Platform { drive, - state: RwLock::new(platform_state), + state: parking_lot::RwLock::new(platform_state), config, block_execution_context: RwLock::new(None), core_rpc, diff --git a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/v0/mod.rs b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/v0/mod.rs index 2b6a12e019..0a3367ee8f 100644 --- a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/v0/mod.rs @@ -137,7 +137,7 @@ mod tests { /// Set up simple contract history with one update fn set_up_history(platform: &TempPlatform) -> DataContract { - let state = platform.platform.state.read().unwrap(); + let state = platform.platform.state.read(); let current_protocol_version = state.current_protocol_version_in_consensus(); let platform_version = PlatformVersion::get(current_protocol_version) .expect("expected to get platform version"); diff --git a/packages/rs-drive-abci/src/query/mod.rs b/packages/rs-drive-abci/src/query/mod.rs index fd3c28bd9f..9e384a8503 100644 --- a/packages/rs-drive-abci/src/query/mod.rs +++ b/packages/rs-drive-abci/src/query/mod.rs @@ -38,7 +38,6 @@ mod tests { .platform .state .read() - .unwrap() .current_platform_version() .unwrap(); diff --git a/packages/rs-drive-abci/src/query/response_metadata/v0/mod.rs b/packages/rs-drive-abci/src/query/response_metadata/v0/mod.rs index 0858ec3e59..51103521e9 100644 --- a/packages/rs-drive-abci/src/query/response_metadata/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/response_metadata/v0/mod.rs @@ -5,7 +5,7 @@ use dapi_grpc::platform::v0::{Proof, ResponseMetadata}; impl Platform { pub(in crate::query) fn response_metadata_v0(&self) -> ResponseMetadata { - let state = self.state.read().unwrap(); + let state = self.state.read(); ResponseMetadata { height: state.last_committed_height(), @@ -21,7 +21,7 @@ impl Platform { &self, proof: Vec, ) -> (ResponseMetadata, Proof) { - let state = self.state.read().unwrap(); + let state = self.state.read(); let metadata = ResponseMetadata { height: state.last_committed_height(), diff --git a/packages/rs-drive-abci/src/query/system/epoch_infos/v0/mod.rs b/packages/rs-drive-abci/src/query/system/epoch_infos/v0/mod.rs index 3bd0e9eec9..c75833b8b4 100644 --- a/packages/rs-drive-abci/src/query/system/epoch_infos/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/system/epoch_infos/v0/mod.rs @@ -26,7 +26,7 @@ impl Platform { }: GetEpochsInfoRequestV0, platform_version: &PlatformVersion, ) -> Result, Error> { - let state = self.state.read().unwrap(); + let state = self.state.read(); let start_epoch = start_epoch.unwrap_or_else(|| { if ascending { diff --git a/packages/rs-drive-abci/src/query/system/version_upgrade_state/v0/mod.rs b/packages/rs-drive-abci/src/query/system/version_upgrade_state/v0/mod.rs index a3d7b5e01c..5359cf28b8 100644 --- a/packages/rs-drive-abci/src/query/system/version_upgrade_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/system/version_upgrade_state/v0/mod.rs @@ -27,8 +27,7 @@ impl Platform { metadata: Some(metadata), } } else { - let protocol_versions_counter = - self.drive.cache.protocol_versions_counter.read().unwrap(); + let protocol_versions_counter = self.drive.cache.protocol_versions_counter.read(); let versions = protocol_versions_counter .global_cache @@ -99,7 +98,7 @@ mod tests { let drive = &platform.drive; - let mut version_counter = drive.cache.protocol_versions_counter.write().unwrap(); + let mut version_counter = drive.cache.protocol_versions_counter.write(); let transaction = drive.grove.start_transaction(); @@ -221,7 +220,7 @@ mod tests { let drive = &platform.drive; - let version_counter = &mut drive.cache.protocol_versions_counter.write().unwrap(); + let version_counter = &mut drive.cache.protocol_versions_counter.write(); let transaction = drive.grove.start_transaction(); diff --git a/packages/rs-drive-abci/src/query/system/version_upgrade_vote_status/v0/mod.rs b/packages/rs-drive-abci/src/query/system/version_upgrade_vote_status/v0/mod.rs index 37a5ade56b..38e99f2d1e 100644 --- a/packages/rs-drive-abci/src/query/system/version_upgrade_vote_status/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/system/version_upgrade_vote_status/v0/mod.rs @@ -145,7 +145,7 @@ mod tests { let drive = &platform.drive; - let version_counter = &mut drive.cache.protocol_versions_counter.write().unwrap(); + let version_counter = &mut drive.cache.protocol_versions_counter.write(); let transaction = drive.grove.start_transaction(); version_counter @@ -278,7 +278,7 @@ mod tests { let drive = &platform.drive; - let version_counter = &mut drive.cache.protocol_versions_counter.write().unwrap(); + let version_counter = &mut drive.cache.protocol_versions_counter.write(); let transaction = drive.grove.start_transaction(); diff --git a/packages/rs-drive-abci/src/test/helpers/setup.rs b/packages/rs-drive-abci/src/test/helpers/setup.rs index 3f647d44f4..afae260d6c 100644 --- a/packages/rs-drive-abci/src/test/helpers/setup.rs +++ b/packages/rs-drive-abci/src/test/helpers/setup.rs @@ -111,7 +111,6 @@ impl TempPlatform { self.platform .state .read() - .unwrap() .current_platform_version() .expect("expected to get current platform version"), ) diff --git a/packages/rs-drive-abci/tests/strategy_tests/core_update_tests.rs b/packages/rs-drive-abci/tests/strategy_tests/core_update_tests.rs index 90bc0b003f..7c9e528eeb 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/core_update_tests.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/core_update_tests.rs @@ -83,7 +83,7 @@ mod tests { // we expect to see quorums with banned members - let state = outcome.abci_app.platform.state.read().unwrap(); + let state = outcome.abci_app.platform.state.read(); let banned_count = state .validator_sets() @@ -183,7 +183,7 @@ mod tests { // we expect to see quorums with banned members - let _state = outcome.abci_app.platform.state.read().unwrap(); + let _state = outcome.abci_app.platform.state.read(); // We should also see validator sets with less than the quorum size diff --git a/packages/rs-drive-abci/tests/strategy_tests/execution.rs b/packages/rs-drive-abci/tests/strategy_tests/execution.rs index 806dbb232c..846759c632 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/execution.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/execution.rs @@ -758,7 +758,6 @@ pub(crate) fn start_chain_for_strategy( .platform .state .read() - .unwrap() .current_validator_set_quorum_hash(); continue_chain_for_strategy( @@ -841,7 +840,7 @@ pub(crate) fn continue_chain_for_strategy( let mut state_transition_results_per_block = BTreeMap::new(); for block_height in block_start..(block_start + block_count) { - let state = platform.state.read().expect("lock is poisoned"); + let state = platform.state.read(); let epoch_info = EpochInfoV0::calculate( first_block_time, current_time_ms, @@ -977,7 +976,7 @@ pub(crate) fn continue_chain_for_strategy( continue; } - let platform_state = platform.state.read().expect("lock is poisoned"); + let platform_state = platform.state.read(); let platform_version = platform_state.current_platform_version().unwrap(); @@ -1067,7 +1066,6 @@ pub(crate) fn continue_chain_for_strategy( platform .state .read() - .expect("lock is poisoned") .last_committed_block_info() .as_ref() .unwrap() diff --git a/packages/rs-drive-abci/tests/strategy_tests/main.rs b/packages/rs-drive-abci/tests/strategy_tests/main.rs index 093ff7178f..3fa9d80839 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/main.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/main.rs @@ -296,7 +296,7 @@ mod tests { .unwrap() .expect("expected root hash"); - let state = abci_app.platform.state.read().unwrap(); + let state = abci_app.platform.state.read(); let protocol_version = state.current_protocol_version_in_consensus(); drop(state); @@ -330,7 +330,6 @@ mod tests { .platform .state .read() - .unwrap() .last_committed_block_info() .as_ref() .unwrap() @@ -432,7 +431,7 @@ mod tests { .unwrap() .expect("expected root hash"); - let state = abci_app.platform.state.read().unwrap(); + let state = abci_app.platform.state.read(); let protocol_version = state.current_protocol_version_in_consensus(); drop(state); @@ -466,7 +465,6 @@ mod tests { .platform .state .read() - .unwrap() .last_committed_block_info() .as_ref() .unwrap() @@ -783,12 +781,7 @@ mod tests { // will be able to propose a block (and then get paid later on). let platform = abci_app.platform; - let counter = &platform - .drive - .cache - .protocol_versions_counter - .read() - .unwrap(); + let counter = &platform.drive.cache.protocol_versions_counter.read(); platform .drive .fetch_versions_with_counter(None, &platform_version.drive) @@ -798,7 +791,6 @@ mod tests { platform .state .read() - .unwrap() .last_committed_block_info() .as_ref() .unwrap() @@ -870,7 +862,7 @@ mod tests { // can expect it to be much higher. let platform = abci_app.platform; - let platform_state = platform.state.read().unwrap(); + let platform_state = platform.state.read(); assert!(platform_state.hpmn_masternode_list().len() > 100); } @@ -938,7 +930,7 @@ mod tests { // With these params if we add new mns the hpmn masternode list would be randomly different than 100. let platform = abci_app.platform; - let platform_state = platform.state.read().unwrap(); + let platform_state = platform.state.read(); assert_ne!(platform_state.hpmn_masternode_list().len(), 100); } @@ -1006,7 +998,7 @@ mod tests { let platform_version = PlatformVersion::latest(); let platform = abci_app.platform; - let _platform_state = platform.state.read().unwrap(); + let _platform_state = platform.state.read(); // We need to find if any masternode has ever had their keys disabled. @@ -2434,7 +2426,7 @@ mod tests { .build_with_mock_rpc(); let outcome = run_chain_for_strategy(&mut platform, 10, strategy, config, 15); - let state = outcome.abci_app.platform.state.read().unwrap(); + let state = outcome.abci_app.platform.state.read(); let protocol_version = state.current_protocol_version_in_consensus(); let platform_version = PlatformVersion::get(protocol_version).unwrap(); @@ -3596,7 +3588,7 @@ mod tests { .. } = run_chain_for_strategy(&mut platform, 100, strategy.clone(), config.clone(), 89); - let state = abci_app.platform.state.read().unwrap(); + let state = abci_app.platform.state.read(); let protocol_version = state.current_protocol_version_in_consensus(); drop(state); let platform_version = PlatformVersion::get(protocol_version).unwrap(); @@ -3636,7 +3628,6 @@ mod tests { .platform .state .read() - .unwrap() .last_committed_block_info() .as_ref() .unwrap() diff --git a/packages/rs-drive-abci/tests/strategy_tests/query.rs b/packages/rs-drive-abci/tests/strategy_tests/query.rs index 69e385a1fd..aaff4ae9a1 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/query.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/query.rs @@ -429,12 +429,7 @@ mod tests { })), }; - let platform_state = outcome - .abci_app - .platform - .state - .read() - .expect("expected to read state"); + let platform_state = outcome.abci_app.platform.state.read(); let protocol_version = platform_state.current_protocol_version_in_consensus(); @@ -536,12 +531,7 @@ mod tests { })), }; - let platform_state = outcome - .abci_app - .platform - .state - .read() - .expect("expected to read state"); + let platform_state = outcome.abci_app.platform.state.read(); let protocol_version = platform_state.current_protocol_version_in_consensus(); @@ -644,12 +634,7 @@ mod tests { })), }; - let platform_state = outcome - .abci_app - .platform - .state - .read() - .expect("expected to read state"); + let platform_state = outcome.abci_app.platform.state.read(); let protocol_version = platform_state.current_protocol_version_in_consensus(); diff --git a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs index 55a0c8f714..28a7b53e23 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs @@ -1016,7 +1016,7 @@ impl NetworkStrategy { rng: &mut StdRng, ) -> (Vec, Vec) { let mut finalize_block_operations = vec![]; - let platform_state = platform.state.read().unwrap(); + let platform_state = platform.state.read(); let platform_version = platform_state .current_platform_version() .expect("expected platform version"); diff --git a/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs b/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs index f22d651c8f..ba02a87eed 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs @@ -112,12 +112,7 @@ mod tests { ); { let platform = abci_app.platform; - let counter = platform - .drive - .cache - .protocol_versions_counter - .read() - .unwrap(); + let counter = platform.drive.cache.protocol_versions_counter.read(); platform .drive .fetch_versions_with_counter(None, &platform_version.drive) @@ -127,7 +122,6 @@ mod tests { platform .state .read() - .unwrap() .last_committed_block_info() .as_ref() .unwrap() @@ -140,7 +134,6 @@ mod tests { platform .state .read() - .unwrap() .current_protocol_version_in_consensus(), 1 ); @@ -160,7 +153,6 @@ mod tests { let block_start = platform .state .read() - .unwrap() .last_committed_block_info() .as_ref() .unwrap() @@ -200,17 +192,11 @@ mod tests { StrategyRandomness::SeedEntropy(7), ); { - let counter = &platform - .drive - .cache - .protocol_versions_counter - .read() - .unwrap(); + let counter = &platform.drive.cache.protocol_versions_counter.read(); assert_eq!( platform .state .read() - .unwrap() .last_committed_block_info() .as_ref() .unwrap() @@ -223,12 +209,11 @@ mod tests { platform .state .read() - .unwrap() .current_protocol_version_in_consensus(), 1 ); assert_eq!( - platform.state.read().unwrap().next_epoch_protocol_version(), + platform.state.read().next_epoch_protocol_version(), TEST_PROTOCOL_VERSION_2 ); assert_eq!(counter.get(&1), None); //no one has proposed 1 yet @@ -241,7 +226,6 @@ mod tests { let block_start = platform .state .read() - .unwrap() .last_committed_block_info() .as_ref() .unwrap() @@ -268,17 +252,11 @@ mod tests { StrategyRandomness::SeedEntropy(18), ); { - let counter = &platform - .drive - .cache - .protocol_versions_counter - .read() - .unwrap(); + let counter = &platform.drive.cache.protocol_versions_counter.read(); assert_eq!( platform .state .read() - .unwrap() .last_committed_block_info() .as_ref() .unwrap() @@ -291,12 +269,11 @@ mod tests { platform .state .read() - .unwrap() .current_protocol_version_in_consensus(), TEST_PROTOCOL_VERSION_2 ); assert_eq!( - platform.state.read().unwrap().next_epoch_protocol_version(), + platform.state.read().next_epoch_protocol_version(), TEST_PROTOCOL_VERSION_2 ); assert_eq!(counter.get(&1), None); //no one has proposed 1 yet @@ -399,12 +376,7 @@ mod tests { ); { let platform = abci_app.platform; - let counter = &platform - .drive - .cache - .protocol_versions_counter - .read() - .unwrap(); + let counter = &platform.drive.cache.protocol_versions_counter.read(); platform .drive .fetch_versions_with_counter(None, &platform_version.drive) @@ -414,7 +386,6 @@ mod tests { platform .state .read() - .unwrap() .last_committed_block_info() .as_ref() .unwrap() @@ -427,14 +398,10 @@ mod tests { platform .state .read() - .unwrap() .current_protocol_version_in_consensus(), 1 ); - assert_eq!( - platform.state.read().unwrap().next_epoch_protocol_version(), - 1 - ); + assert_eq!(platform.state.read().next_epoch_protocol_version(), 1); assert_eq!( (counter.get(&1), counter.get(&TEST_PROTOCOL_VERSION_2)), (Some(&6), Some(&44)) @@ -447,7 +414,6 @@ mod tests { let block_start = platform .state .read() - .unwrap() .last_committed_block_info() .as_ref() .unwrap() @@ -484,17 +450,11 @@ mod tests { StrategyRandomness::SeedEntropy(7), ); { - let counter = &platform - .drive - .cache - .protocol_versions_counter - .read() - .unwrap(); + let counter = &platform.drive.cache.protocol_versions_counter.read(); assert_eq!( platform .state .read() - .unwrap() .last_committed_block_info() .as_ref() .unwrap() @@ -507,12 +467,11 @@ mod tests { platform .state .read() - .unwrap() .current_protocol_version_in_consensus(), 1 ); assert_eq!( - platform.state.read().unwrap().next_epoch_protocol_version(), + platform.state.read().next_epoch_protocol_version(), TEST_PROTOCOL_VERSION_2 ); assert_eq!(counter.get(&1), None); //no one has proposed 1 yet @@ -525,7 +484,6 @@ mod tests { let block_start = platform .state .read() - .unwrap() .last_committed_block_info() .as_ref() .unwrap() @@ -552,17 +510,11 @@ mod tests { StrategyRandomness::SeedEntropy(18), ); { - let counter = &platform - .drive - .cache - .protocol_versions_counter - .read() - .unwrap(); + let counter = &platform.drive.cache.protocol_versions_counter.read(); assert_eq!( platform .state .read() - .unwrap() .last_committed_block_info() .as_ref() .unwrap() @@ -575,12 +527,11 @@ mod tests { platform .state .read() - .unwrap() .current_protocol_version_in_consensus(), TEST_PROTOCOL_VERSION_2 ); assert_eq!( - platform.state.read().unwrap().next_epoch_protocol_version(), + platform.state.read().next_epoch_protocol_version(), TEST_PROTOCOL_VERSION_2 ); assert_eq!(counter.get(&1), None); //no one has proposed 1 yet @@ -689,7 +640,6 @@ mod tests { platform .state .read() - .unwrap() .last_committed_block_info() .as_ref() .unwrap() @@ -702,20 +652,11 @@ mod tests { platform .state .read() - .unwrap() .current_protocol_version_in_consensus(), 1 ); - assert_eq!( - platform.state.read().unwrap().next_epoch_protocol_version(), - 1 - ); - let counter = &platform - .drive - .cache - .protocol_versions_counter - .read() - .unwrap(); + assert_eq!(platform.state.read().next_epoch_protocol_version(), 1); + let counter = &platform.drive.cache.protocol_versions_counter.read(); assert_eq!( (counter.get(&1), counter.get(&TEST_PROTOCOL_VERSION_2)), (Some(&35), Some(&64)) @@ -729,7 +670,6 @@ mod tests { let block_start = platform .state .read() - .unwrap() .last_committed_block_info() .as_ref() .unwrap() @@ -766,17 +706,11 @@ mod tests { StrategyRandomness::SeedEntropy(7), ); { - let counter = &platform - .drive - .cache - .protocol_versions_counter - .read() - .unwrap(); + let counter = &platform.drive.cache.protocol_versions_counter.read(); assert_eq!( platform .state .read() - .unwrap() .last_committed_block_info() .as_ref() .unwrap() @@ -789,12 +723,11 @@ mod tests { platform .state .read() - .unwrap() .current_protocol_version_in_consensus(), 1 ); assert_eq!( - platform.state.read().unwrap().next_epoch_protocol_version(), + platform.state.read().next_epoch_protocol_version(), TEST_PROTOCOL_VERSION_2 ); // the counter is for the current voting during that window @@ -809,7 +742,6 @@ mod tests { let block_start = platform .state .read() - .unwrap() .last_committed_block_info() .as_ref() .unwrap() @@ -840,7 +772,6 @@ mod tests { platform .state .read() - .unwrap() .last_committed_block_info() .as_ref() .unwrap() @@ -853,12 +784,11 @@ mod tests { platform .state .read() - .unwrap() .current_protocol_version_in_consensus(), TEST_PROTOCOL_VERSION_2 ); assert_eq!( - platform.state.read().unwrap().next_epoch_protocol_version(), + platform.state.read().next_epoch_protocol_version(), TEST_PROTOCOL_VERSION_2 ); } @@ -964,7 +894,6 @@ mod tests { platform .state .read() - .unwrap() .last_committed_block_info() .as_ref() .unwrap() @@ -977,7 +906,6 @@ mod tests { platform .state .read() - .unwrap() .current_protocol_version_in_consensus(), 1 ); @@ -989,7 +917,6 @@ mod tests { let block_start = platform .state .read() - .unwrap() .last_committed_block_info() .as_ref() .unwrap() @@ -1026,17 +953,11 @@ mod tests { StrategyRandomness::SeedEntropy(99), ); { - let counter = &platform - .drive - .cache - .protocol_versions_counter - .read() - .unwrap(); + let counter = &platform.drive.cache.protocol_versions_counter.read(); assert_eq!( platform .state .read() - .unwrap() .last_committed_block_info() .as_ref() .unwrap() @@ -1049,12 +970,11 @@ mod tests { platform .state .read() - .unwrap() .current_protocol_version_in_consensus(), 1 ); assert_eq!( - platform.state.read().unwrap().next_epoch_protocol_version(), + platform.state.read().next_epoch_protocol_version(), TEST_PROTOCOL_VERSION_2 ); assert_eq!( @@ -1102,7 +1022,6 @@ mod tests { let block_start = platform .state .read() - .unwrap() .last_committed_block_info() .as_ref() .unwrap() @@ -1141,12 +1060,7 @@ mod tests { StrategyRandomness::SeedEntropy(40), ); { - let counter = &platform - .drive - .cache - .protocol_versions_counter - .read() - .unwrap(); + let counter = &platform.drive.cache.protocol_versions_counter.read(); assert_eq!( (counter.get(&1), counter.get(&TEST_PROTOCOL_VERSION_2)), (Some(&172), Some(&24)) @@ -1156,7 +1070,6 @@ mod tests { platform .state .read() - .unwrap() .last_committed_block_info() .as_ref() .unwrap() @@ -1169,20 +1082,15 @@ mod tests { platform .state .read() - .unwrap() .current_protocol_version_in_consensus(), TEST_PROTOCOL_VERSION_2 ); - assert_eq!( - platform.state.read().unwrap().next_epoch_protocol_version(), - 1 - ); + assert_eq!(platform.state.read().next_epoch_protocol_version(), 1); } let block_start = platform .state .read() - .unwrap() .last_committed_block_info() .as_ref() .unwrap() @@ -1210,12 +1118,7 @@ mod tests { StrategyRandomness::SeedEntropy(40), ); { - let counter = &platform - .drive - .cache - .protocol_versions_counter - .read() - .unwrap(); + let counter = &platform.drive.cache.protocol_versions_counter.read(); assert_eq!( (counter.get(&1), counter.get(&TEST_PROTOCOL_VERSION_2)), (Some(&23), Some(&2)) @@ -1224,7 +1127,6 @@ mod tests { platform .state .read() - .unwrap() .last_committed_block_info() .as_ref() .unwrap() @@ -1237,14 +1139,10 @@ mod tests { platform .state .read() - .unwrap() .current_protocol_version_in_consensus(), 1 ); - assert_eq!( - platform.state.read().unwrap().next_epoch_protocol_version(), - 1 - ); + assert_eq!(platform.state.read().next_epoch_protocol_version(), 1); } }) .expect("Failed to create thread with custom stack size"); @@ -1341,18 +1239,12 @@ mod tests { } = run_chain_for_strategy(&mut platform, 1400, strategy, config.clone(), 15); { let platform = abci_app.platform; - let counter = &platform - .drive - .cache - .protocol_versions_counter - .read() - .unwrap(); + let counter = &platform.drive.cache.protocol_versions_counter.read(); assert_eq!( platform .state .read() - .unwrap() .last_committed_block_info() .as_ref() .unwrap() @@ -1365,12 +1257,11 @@ mod tests { platform .state .read() - .unwrap() .current_protocol_version_in_consensus(), 1 ); assert_eq!( - platform.state.read().unwrap().next_epoch_protocol_version(), + platform.state.read().next_epoch_protocol_version(), TEST_PROTOCOL_VERSION_2 ); assert_eq!( @@ -1422,7 +1313,6 @@ mod tests { let block_start = platform .state .read() - .unwrap() .last_committed_block_info() .as_ref() .unwrap() @@ -1449,17 +1339,11 @@ mod tests { StrategyRandomness::SeedEntropy(7), ); { - let counter = &platform - .drive - .cache - .protocol_versions_counter - .read() - .unwrap(); + let counter = &platform.drive.cache.protocol_versions_counter.read(); assert_eq!( platform .state .read() - .unwrap() .last_committed_block_info() .as_ref() .unwrap() @@ -1472,12 +1356,11 @@ mod tests { platform .state .read() - .unwrap() .current_protocol_version_in_consensus(), TEST_PROTOCOL_VERSION_2 ); assert_eq!( - platform.state.read().unwrap().next_epoch_protocol_version(), + platform.state.read().next_epoch_protocol_version(), TEST_PROTOCOL_VERSION_3 ); assert_eq!( diff --git a/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs b/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs index 94003ce94b..1330c96f6c 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs @@ -35,7 +35,7 @@ pub(crate) fn verify_state_transitions_were_or_were_not_executed( expected_validation_errors: &[u32], platform_version: &PlatformVersion, ) -> bool { - let state = abci_app.platform.state.read().unwrap(); + let state = abci_app.platform.state.read(); let platform = PlatformRef { drive: &abci_app.platform.drive, state: &state, diff --git a/packages/rs-drive/Cargo.toml b/packages/rs-drive/Cargo.toml index 03b18e1746..40aea3de43 100644 --- a/packages/rs-drive/Cargo.toml +++ b/packages/rs-drive/Cargo.toml @@ -14,6 +14,7 @@ license = "MIT" private = true [dependencies] +parking_lot = "0.12.1" serde = { version = "1.0.152", features = ["derive"] } platform-version = { path = "../rs-platform-version" } ciborium = { git = "https://github.com/qrayven/ciborium", branch = "feat-ser-null-as-undefined" } diff --git a/packages/rs-drive/src/drive/cache.rs b/packages/rs-drive/src/drive/cache.rs index 96c6d67309..594a693e2c 100644 --- a/packages/rs-drive/src/drive/cache.rs +++ b/packages/rs-drive/src/drive/cache.rs @@ -15,10 +15,10 @@ pub struct DriveCache { pub data_contracts: DataContractCache, // TODO: We probably don't need this since we have it genesis cache in the platform /// Genesis time in ms - pub genesis_time_ms: RwLock>, + pub genesis_time_ms: parking_lot::RwLock>, // TODO: Make protocol versions cache thread-safe /// Lazy loaded counter of votes to upgrade protocol version - pub protocol_versions_counter: RwLock, + pub protocol_versions_counter: parking_lot::RwLock, /// Versioned system data contracts pub system_data_contracts: SystemDataContracts, } diff --git a/packages/rs-drive/src/drive/cache/system_contracts.rs b/packages/rs-drive/src/drive/cache/system_contracts.rs index 831b5bb678..a85260866e 100644 --- a/packages/rs-drive/src/drive/cache/system_contracts.rs +++ b/packages/rs-drive/src/drive/cache/system_contracts.rs @@ -7,13 +7,13 @@ use std::sync::{RwLock, RwLockReadGuard}; /// System contracts pub struct SystemDataContracts { /// Withdrawal contract - withdrawals: RwLock, + withdrawals: parking_lot::RwLock, /// DPNS contract - dpns: RwLock, + dpns: parking_lot::RwLock, /// Dashpay contract - dashpay: RwLock, + dashpay: parking_lot::RwLock, /// Masternode reward shares contract - masternode_reward_shares: RwLock, + masternode_reward_shares: parking_lot::RwLock, } impl SystemDataContracts { @@ -22,19 +22,19 @@ impl SystemDataContracts { platform_version: &PlatformVersion, ) -> Result { Ok(Self { - withdrawals: RwLock::new(load_system_data_contract( + withdrawals: parking_lot::RwLock::new(load_system_data_contract( SystemDataContract::Withdrawals, platform_version, )?), - dpns: RwLock::new(load_system_data_contract( + dpns: parking_lot::RwLock::new(load_system_data_contract( SystemDataContract::DPNS, platform_version, )?), - dashpay: RwLock::new(load_system_data_contract( + dashpay: parking_lot::RwLock::new(load_system_data_contract( SystemDataContract::Dashpay, platform_version, )?), - masternode_reward_shares: RwLock::new(load_system_data_contract( + masternode_reward_shares: parking_lot::RwLock::new(load_system_data_contract( SystemDataContract::MasternodeRewards, platform_version, )?), @@ -42,22 +42,22 @@ impl SystemDataContracts { } /// Returns withdrawals contract - pub fn read_withdrawals(&self) -> RwLockReadGuard { - self.withdrawals.read().unwrap() + pub fn read_withdrawals(&self) -> parking_lot::RwLockReadGuard { + self.withdrawals.read() } /// Returns DPNS contract - pub fn read_dpns(&self) -> RwLockReadGuard { - self.dpns.read().unwrap() + pub fn read_dpns(&self) -> parking_lot::RwLockReadGuard { + self.dpns.read() } /// Returns Dashpay contract - pub fn read_dashpay(&self) -> RwLockReadGuard { - self.dashpay.read().unwrap() + pub fn read_dashpay(&self) -> parking_lot::RwLockReadGuard { + self.dashpay.read() } /// Returns Masternode reward shares contract - pub fn read_masternode_reward_shares(&self) -> RwLockReadGuard { - self.masternode_reward_shares.read().unwrap() + pub fn read_masternode_reward_shares(&self) -> parking_lot::RwLockReadGuard { + self.masternode_reward_shares.read() } } diff --git a/packages/rs-drive/src/drive/open/mod.rs b/packages/rs-drive/src/drive/open/mod.rs index d6f1381857..f05ae1bfc6 100644 --- a/packages/rs-drive/src/drive/open/mod.rs +++ b/packages/rs-drive/src/drive/open/mod.rs @@ -52,8 +52,8 @@ impl Drive { data_contracts_global_cache_size, data_contracts_block_cache_size, ), - genesis_time_ms: RwLock::new(genesis_time_ms), - protocol_versions_counter: RwLock::new(ProtocolVersionsCache::new()), + genesis_time_ms: parking_lot::RwLock::new(genesis_time_ms), + protocol_versions_counter: parking_lot::RwLock::new(ProtocolVersionsCache::new()), system_data_contracts: SystemDataContracts::load_genesis_system_contracts( platform_version, )?, diff --git a/packages/rs-drive/src/drive/operations/drop_cache/v0/mod.rs b/packages/rs-drive/src/drive/operations/drop_cache/v0/mod.rs index cf47c3f51e..bc485fc3e0 100644 --- a/packages/rs-drive/src/drive/operations/drop_cache/v0/mod.rs +++ b/packages/rs-drive/src/drive/operations/drop_cache/v0/mod.rs @@ -7,14 +7,13 @@ impl Drive { let genesis_time_ms = self.config.default_genesis_time; self.cache.data_contracts.clear(); - let mut genesis_time_ms_cache = self.cache.genesis_time_ms.write().unwrap(); + let mut genesis_time_ms_cache = self.cache.genesis_time_ms.write(); *genesis_time_ms_cache = genesis_time_ms; drop(genesis_time_ms_cache); - let mut protocol_versions_counter_cache = - self.cache.protocol_versions_counter.write().unwrap(); + let mut protocol_versions_counter_cache = self.cache.protocol_versions_counter.write(); *protocol_versions_counter_cache = ProtocolVersionsCache::new(); } diff --git a/packages/rs-drive/src/drive/protocol_upgrade/remove_validators_proposed_app_versions/v0/mod.rs b/packages/rs-drive/src/drive/protocol_upgrade/remove_validators_proposed_app_versions/v0/mod.rs index 517e51dd73..35fc19539e 100644 --- a/packages/rs-drive/src/drive/protocol_upgrade/remove_validators_proposed_app_versions/v0/mod.rs +++ b/packages/rs-drive/src/drive/protocol_upgrade/remove_validators_proposed_app_versions/v0/mod.rs @@ -107,7 +107,7 @@ impl Drive { where I: IntoIterator, { - let version_counter = &mut self.cache.protocol_versions_counter.write().unwrap(); + let version_counter = &mut self.cache.protocol_versions_counter.write(); version_counter.load_if_needed(self, transaction, drive_version)?; diff --git a/packages/rs-drive/src/drive/protocol_upgrade/update_validator_proposed_app_version/v0/mod.rs b/packages/rs-drive/src/drive/protocol_upgrade/update_validator_proposed_app_version/v0/mod.rs index 7178d7e9e1..bd473f6f91 100644 --- a/packages/rs-drive/src/drive/protocol_upgrade/update_validator_proposed_app_version/v0/mod.rs +++ b/packages/rs-drive/src/drive/protocol_upgrade/update_validator_proposed_app_version/v0/mod.rs @@ -59,7 +59,7 @@ impl Drive { drive_operations: &mut Vec, drive_version: &DriveVersion, ) -> Result { - let version_counter = &mut self.cache.protocol_versions_counter.write().unwrap(); + let version_counter = &mut self.cache.protocol_versions_counter.write(); version_counter.load_if_needed(self, transaction, drive_version)?; diff --git a/packages/rs-drive/src/drive/system/genesis_time/mod.rs b/packages/rs-drive/src/drive/system/genesis_time/mod.rs index e6f6abd062..62a7508b34 100644 --- a/packages/rs-drive/src/drive/system/genesis_time/mod.rs +++ b/packages/rs-drive/src/drive/system/genesis_time/mod.rs @@ -43,7 +43,7 @@ impl Drive { /// Returns the genesis time. Checks cache first, then storage. pub fn get_genesis_time(&self, transaction: TransactionArg) -> Result, Error> { // let's first check the cache - let genesis_time_ms = self.cache.genesis_time_ms.read().unwrap(); + let genesis_time_ms = self.cache.genesis_time_ms.read(); let platform_version = PlatformVersion::latest(); @@ -57,7 +57,7 @@ impl Drive { match self.get_epoch_start_time(&epoch, transaction, platform_version) { Ok(genesis_time_ms) => { - let mut genesis_time_ms_cache = self.cache.genesis_time_ms.write().unwrap(); + let mut genesis_time_ms_cache = self.cache.genesis_time_ms.write(); *genesis_time_ms_cache = Some(genesis_time_ms); @@ -72,7 +72,7 @@ impl Drive { /// Sets genesis time pub fn set_genesis_time(&self, genesis_time_ms: u64) { - let mut genesis_time_ms_cache = self.cache.genesis_time_ms.write().unwrap(); + let mut genesis_time_ms_cache = self.cache.genesis_time_ms.write(); *genesis_time_ms_cache = Some(genesis_time_ms); } } @@ -106,7 +106,7 @@ mod tests { fn should_return_some_if_cache_is_set() { let drive = setup_drive(None); - let mut genesis_time_ms_cache = drive.cache.genesis_time_ms.write().unwrap(); + let mut genesis_time_ms_cache = drive.cache.genesis_time_ms.write(); let genesis_time_ms = 100; @@ -169,7 +169,7 @@ mod tests { drive.set_genesis_time(genesis_time_ms); - let genesis_time_ms_cache = drive.cache.genesis_time_ms.read().unwrap(); + let genesis_time_ms_cache = drive.cache.genesis_time_ms.read(); assert!(matches!(*genesis_time_ms_cache, Some(g) if g == genesis_time_ms)); } From f90a2d3f635548c68917c1d7b8aa3f915aab5bdf Mon Sep 17 00:00:00 2001 From: Paul DeLucia <69597248+pauldelucia@users.noreply.github.com> Date: Tue, 5 Mar 2024 23:50:11 +0700 Subject: [PATCH 054/191] feat(sdk): make sdk put_settings public outside of crate (#1732) --- packages/rs-sdk/src/platform/transition.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/rs-sdk/src/platform/transition.rs b/packages/rs-sdk/src/platform/transition.rs index 6e0c23b3af..6b9f8ac2e7 100644 --- a/packages/rs-sdk/src/platform/transition.rs +++ b/packages/rs-sdk/src/platform/transition.rs @@ -6,7 +6,7 @@ pub(crate) mod context; mod put_contract; pub mod put_document; pub mod put_identity; -pub(crate) mod put_settings; +pub mod put_settings; pub mod top_up_identity; mod txid; pub mod withdraw_from_identity; From 0c3f75f7cda3817875d9ef428352fa5bbe49c89a Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Tue, 5 Mar 2024 19:52:29 +0300 Subject: [PATCH 055/191] chore(release): update changelog and bump version to 1.0.0-dev.6 (#1735) --- CHANGELOG.md | 39 ++++++++++++++++ Cargo.lock | 46 +++++++++---------- package.json | 2 +- packages/bench-suite/package.json | 2 +- packages/dapi-grpc/Cargo.toml | 2 +- packages/dapi-grpc/package.json | 2 +- packages/dapi/package.json | 2 +- packages/dash-spv/package.json | 2 +- packages/dashmate/package.json | 2 +- packages/dashpay-contract/Cargo.toml | 2 +- packages/dashpay-contract/package.json | 2 +- packages/data-contracts/Cargo.toml | 2 +- packages/dpns-contract/Cargo.toml | 2 +- packages/dpns-contract/package.json | 2 +- packages/feature-flags-contract/Cargo.toml | 2 +- packages/feature-flags-contract/package.json | 2 +- packages/js-dapi-client/package.json | 2 +- packages/js-dash-sdk/package.json | 2 +- packages/js-grpc-common/package.json | 2 +- .../Cargo.toml | 2 +- .../package.json | 2 +- packages/platform-test-suite/package.json | 2 +- packages/rs-dapi-client/Cargo.toml | 2 +- packages/rs-dapi-grpc-macros/Cargo.toml | 2 +- packages/rs-dpp/Cargo.toml | 2 +- packages/rs-drive-abci/Cargo.toml | 2 +- packages/rs-drive-proof-verifier/Cargo.toml | 2 +- packages/rs-drive/Cargo.toml | 2 +- .../Cargo.toml | 2 +- packages/rs-platform-serialization/Cargo.toml | 2 +- .../rs-platform-value-convertible/Cargo.toml | 2 +- packages/rs-platform-value/Cargo.toml | 2 +- packages/rs-platform-version/Cargo.toml | 2 +- packages/rs-platform-versioning/Cargo.toml | 2 +- packages/rs-sdk/Cargo.toml | 2 +- packages/simple-signer/Cargo.toml | 2 +- packages/strategy-tests/Cargo.toml | 2 +- packages/wallet-lib/package.json | 2 +- packages/wasm-dpp/Cargo.toml | 2 +- packages/wasm-dpp/package.json | 2 +- packages/withdrawals-contract/Cargo.toml | 2 +- packages/withdrawals-contract/package.json | 2 +- 42 files changed, 102 insertions(+), 63 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c0f6799a1c..bfb808d763 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,42 @@ +## [1.0.0-dev.6](https://github.com/dashpay/platform/compare/v1.0.0-dev.5...v1.0.0-dev.6) (2024-03-05) + + +### ⚠ BREAKING CHANGES + +* **platform:** identity nonce for Data Contract Create (#1724) + +### Features + +* add ContractUpdate to used_contract_ids function +* **platform:** identity nonce for Data Contract Create ([#1724](https://github.com/dashpay/platform/issues/1724)) +* **sdk:** add fetch_current_with_metadata to ExtendedEpochInfo ([#1708](https://github.com/dashpay/platform/issues/1708)) +* **sdk:** fetch with metadata ([#1707](https://github.com/dashpay/platform/issues/1707)) +* **sdk:** re-fetch nonce on interval ([#1706](https://github.com/dashpay/platform/issues/1706)) + + +### Bug Fixes + +* **drive-abci:** reject reward shares operations ([#1722](https://github.com/dashpay/platform/issues/1722)) +* make strategy tests compatible with all networks and platform tui ([#1705](https://github.com/dashpay/platform/issues/1705)) +* **sdk:** nonce manager caching bug ([#1711](https://github.com/dashpay/platform/issues/1711)) +* **test-suite:** masternode identities ([#1709](https://github.com/dashpay/platform/issues/1709)) + + +### Performance Improvements + +* query and check tx parallel processing ([#1694](https://github.com/dashpay/platform/issues/1694)) + + +### Miscellaneous Chores + +* fix npm audit warning ([#1723](https://github.com/dashpay/platform/issues/1723)) + + +### Tests + +* **test-suite:** restore dpns tests ([#1725](https://github.com/dashpay/platform/issues/1725)) +* **test-suite:** withdrawals identityRecent index ([#1716](https://github.com/dashpay/platform/issues/1716)) + ## [1.0.0-dev.5](https://github.com/dashpay/platform/compare/v1.0.0-dev.4...v1.0.0-dev.5) (2024-02-20) ### ⚠ BREAKING CHANGES diff --git a/Cargo.lock b/Cargo.lock index c37eb2c196..c603ed5a38 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -989,7 +989,7 @@ dependencies = [ [[package]] name = "dapi-grpc" -version = "1.0.0-dev.5" +version = "1.0.0-dev.6" dependencies = [ "dapi-grpc-macros", "futures-core", @@ -1005,7 +1005,7 @@ dependencies = [ [[package]] name = "dapi-grpc-macros" -version = "1.0.0-dev.5" +version = "1.0.0-dev.6" dependencies = [ "dapi-grpc", "heck", @@ -1111,7 +1111,7 @@ dependencies = [ [[package]] name = "dashpay-contract" -version = "1.0.0-dev.5" +version = "1.0.0-dev.6" dependencies = [ "platform-value", "platform-version", @@ -1121,7 +1121,7 @@ dependencies = [ [[package]] name = "data-contracts" -version = "1.0.0-dev.5" +version = "1.0.0-dev.6" dependencies = [ "dashpay-contract", "dpns-contract", @@ -1214,7 +1214,7 @@ checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" [[package]] name = "dpns-contract" -version = "1.0.0-dev.5" +version = "1.0.0-dev.6" dependencies = [ "platform-value", "platform-version", @@ -1224,7 +1224,7 @@ dependencies = [ [[package]] name = "dpp" -version = "1.0.0-dev.5" +version = "1.0.0-dev.6" dependencies = [ "anyhow", "async-trait", @@ -1276,7 +1276,7 @@ dependencies = [ [[package]] name = "drive" -version = "1.0.0-dev.5" +version = "1.0.0-dev.6" dependencies = [ "anyhow", "base64 0.21.7", @@ -1312,7 +1312,7 @@ dependencies = [ [[package]] name = "drive-abci" -version = "1.0.0-dev.5" +version = "1.0.0-dev.6" dependencies = [ "async-trait", "atty", @@ -1367,7 +1367,7 @@ dependencies = [ [[package]] name = "drive-proof-verifier" -version = "1.0.0-dev.5" +version = "1.0.0-dev.6" dependencies = [ "dapi-grpc", "dpp", @@ -1567,7 +1567,7 @@ checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" [[package]] name = "feature-flags-contract" -version = "1.0.0-dev.5" +version = "1.0.0-dev.6" dependencies = [ "platform-value", "platform-version", @@ -2431,7 +2431,7 @@ dependencies = [ [[package]] name = "masternode-reward-shares-contract" -version = "1.0.0-dev.5" +version = "1.0.0-dev.6" dependencies = [ "platform-value", "platform-version", @@ -2908,7 +2908,7 @@ checksum = "2900ede94e305130c13ddd391e0ab7cbaeb783945ae07a279c268cb05109c6cb" [[package]] name = "platform-serialization" -version = "1.0.0-dev.5" +version = "1.0.0-dev.6" dependencies = [ "bincode 2.0.0-rc.3", "platform-version", @@ -2916,7 +2916,7 @@ dependencies = [ [[package]] name = "platform-serialization-derive" -version = "1.0.0-dev.5" +version = "1.0.0-dev.6" dependencies = [ "proc-macro2", "quote", @@ -2926,7 +2926,7 @@ dependencies = [ [[package]] name = "platform-value" -version = "1.0.0-dev.5" +version = "1.0.0-dev.6" dependencies = [ "base64 0.13.1", "bincode 2.0.0-rc.3", @@ -2947,7 +2947,7 @@ dependencies = [ [[package]] name = "platform-value-convertible" -version = "1.0.0-dev.5" +version = "1.0.0-dev.6" dependencies = [ "quote", "syn 2.0.48", @@ -2955,14 +2955,14 @@ dependencies = [ [[package]] name = "platform-version" -version = "1.0.0-dev.5" +version = "1.0.0-dev.6" dependencies = [ "thiserror", ] [[package]] name = "platform-versioning" -version = "1.0.0-dev.5" +version = "1.0.0-dev.6" dependencies = [ "proc-macro2", "quote", @@ -3504,7 +3504,7 @@ dependencies = [ [[package]] name = "rs-dapi-client" -version = "1.0.0-dev.5" +version = "1.0.0-dev.6" dependencies = [ "backon", "chrono", @@ -3521,7 +3521,7 @@ dependencies = [ [[package]] name = "rs-sdk" -version = "1.0.0-dev.5" +version = "1.0.0-dev.6" dependencies = [ "async-trait", "base64 0.21.7", @@ -4008,7 +4008,7 @@ checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" [[package]] name = "simple-signer" -version = "1.0.0-dev.5" +version = "1.0.0-dev.6" dependencies = [ "anyhow", "bincode 2.0.0-rc.3", @@ -4099,7 +4099,7 @@ dependencies = [ [[package]] name = "strategy-tests" -version = "1.0.0-dev.5" +version = "1.0.0-dev.6" dependencies = [ "bincode 2.0.0-rc.3", "dpp", @@ -5021,7 +5021,7 @@ checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93" [[package]] name = "wasm-dpp" -version = "1.0.0-dev.5" +version = "1.0.0-dev.6" dependencies = [ "anyhow", "async-trait", @@ -5263,7 +5263,7 @@ dependencies = [ [[package]] name = "withdrawals-contract" -version = "1.0.0-dev.5" +version = "1.0.0-dev.6" dependencies = [ "num_enum", "platform-value", diff --git a/package.json b/package.json index 364bb1d8b1..2a6d598ade 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/platform", - "version": "1.0.0-dev.5", + "version": "1.0.0-dev.6", "private": true, "scripts": { "setup": "yarn install && yarn run build && yarn run configure", diff --git a/packages/bench-suite/package.json b/packages/bench-suite/package.json index 5aef8856e4..d34a2b8f2d 100644 --- a/packages/bench-suite/package.json +++ b/packages/bench-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/bench-suite", "private": true, - "version": "1.0.0-dev.5", + "version": "1.0.0-dev.6", "description": "Dash Platform benchmark tool", "scripts": { "bench": "node ./bin/bench.js", diff --git a/packages/dapi-grpc/Cargo.toml b/packages/dapi-grpc/Cargo.toml index 9ce1b4b228..ddf532951b 100644 --- a/packages/dapi-grpc/Cargo.toml +++ b/packages/dapi-grpc/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc" description = "GRPC client for Dash Platform" -version = "1.0.0-dev.5" +version = "1.0.0-dev.6" authors = [ "Samuel Westrich ", "Igor Markin ", diff --git a/packages/dapi-grpc/package.json b/packages/dapi-grpc/package.json index c9fbaa230d..1878b323ed 100644 --- a/packages/dapi-grpc/package.json +++ b/packages/dapi-grpc/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-grpc", - "version": "1.0.0-dev.5", + "version": "1.0.0-dev.6", "description": "DAPI GRPC definition file and generated clients", "browser": "browser.js", "main": "node.js", diff --git a/packages/dapi/package.json b/packages/dapi/package.json index d96c85b2fa..b0a4d58b13 100644 --- a/packages/dapi/package.json +++ b/packages/dapi/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/dapi", "private": true, - "version": "1.0.0-dev.5", + "version": "1.0.0-dev.6", "description": "A decentralized API for the Dash network", "scripts": { "api": "node scripts/api.js", diff --git a/packages/dash-spv/package.json b/packages/dash-spv/package.json index 609134df08..6d07a5c7c0 100644 --- a/packages/dash-spv/package.json +++ b/packages/dash-spv/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dash-spv", - "version": "1.0.0-dev.5", + "version": "1.0.0-dev.6", "description": "Repository containing SPV functions used by @dashevo", "main": "index.js", "scripts": { diff --git a/packages/dashmate/package.json b/packages/dashmate/package.json index edc881890c..94c40fc359 100644 --- a/packages/dashmate/package.json +++ b/packages/dashmate/package.json @@ -1,6 +1,6 @@ { "name": "dashmate", - "version": "1.0.0-dev.5", + "version": "1.0.0-dev.6", "description": "Distribution package for Dash node installation", "scripts": { "lint": "eslint .", diff --git a/packages/dashpay-contract/Cargo.toml b/packages/dashpay-contract/Cargo.toml index 0488e059a8..f913d88a98 100644 --- a/packages/dashpay-contract/Cargo.toml +++ b/packages/dashpay-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dashpay-contract" description = "DashPay data contract schema and tools" -version = "1.0.0-dev.5" +version = "1.0.0-dev.6" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/dashpay-contract/package.json b/packages/dashpay-contract/package.json index 930967226b..558519f9ce 100644 --- a/packages/dashpay-contract/package.json +++ b/packages/dashpay-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dashpay-contract", - "version": "1.0.0-dev.5", + "version": "1.0.0-dev.6", "description": "Reference contract of the DashPay DPA on Dash Evolution", "scripts": { "lint": "eslint .", diff --git a/packages/data-contracts/Cargo.toml b/packages/data-contracts/Cargo.toml index 580e18ceae..8fdf75afc2 100644 --- a/packages/data-contracts/Cargo.toml +++ b/packages/data-contracts/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "data-contracts" description = "Dash Platform system data contracts" -version = "1.0.0-dev.5" +version = "1.0.0-dev.6" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/dpns-contract/Cargo.toml b/packages/dpns-contract/Cargo.toml index c213c3fb1f..7e178482a0 100644 --- a/packages/dpns-contract/Cargo.toml +++ b/packages/dpns-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dpns-contract" description = "DPNS data contract schema and tools" -version = "1.0.0-dev.5" +version = "1.0.0-dev.6" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/dpns-contract/package.json b/packages/dpns-contract/package.json index a757fceaf9..3c66b09d2a 100644 --- a/packages/dpns-contract/package.json +++ b/packages/dpns-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dpns-contract", - "version": "1.0.0-dev.5", + "version": "1.0.0-dev.6", "description": "A contract and helper scripts for DPNS DApp", "scripts": { "lint": "eslint .", diff --git a/packages/feature-flags-contract/Cargo.toml b/packages/feature-flags-contract/Cargo.toml index abdb57eb72..8ebf7f1fda 100644 --- a/packages/feature-flags-contract/Cargo.toml +++ b/packages/feature-flags-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "feature-flags-contract" description = "Feature flags data contract schema and tools" -version = "1.0.0-dev.5" +version = "1.0.0-dev.6" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/feature-flags-contract/package.json b/packages/feature-flags-contract/package.json index a968ed3381..31c620930d 100644 --- a/packages/feature-flags-contract/package.json +++ b/packages/feature-flags-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/feature-flags-contract", - "version": "1.0.0-dev.5", + "version": "1.0.0-dev.6", "description": "Data Contract to store Dash Platform feature flags", "scripts": { "build": "", diff --git a/packages/js-dapi-client/package.json b/packages/js-dapi-client/package.json index 9a9e0374a3..078957393b 100644 --- a/packages/js-dapi-client/package.json +++ b/packages/js-dapi-client/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-client", - "version": "1.0.0-dev.5", + "version": "1.0.0-dev.6", "description": "Client library used to access Dash DAPI endpoints", "main": "lib/index.js", "contributors": [ diff --git a/packages/js-dash-sdk/package.json b/packages/js-dash-sdk/package.json index 95a6be5ea9..099885cb4b 100644 --- a/packages/js-dash-sdk/package.json +++ b/packages/js-dash-sdk/package.json @@ -1,6 +1,6 @@ { "name": "dash", - "version": "4.0.0-dev.5", + "version": "4.0.0-dev.6", "description": "Dash library for JavaScript/TypeScript ecosystem (Wallet, DAPI, Primitives, BLS, ...)", "main": "build/index.js", "unpkg": "dist/dash.min.js", diff --git a/packages/js-grpc-common/package.json b/packages/js-grpc-common/package.json index bf584c8106..e37983400b 100644 --- a/packages/js-grpc-common/package.json +++ b/packages/js-grpc-common/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/grpc-common", - "version": "1.0.0-dev.5", + "version": "1.0.0-dev.6", "description": "Common GRPC library", "main": "index.js", "scripts": { diff --git a/packages/masternode-reward-shares-contract/Cargo.toml b/packages/masternode-reward-shares-contract/Cargo.toml index 009a8dcd19..e18b2e5c2e 100644 --- a/packages/masternode-reward-shares-contract/Cargo.toml +++ b/packages/masternode-reward-shares-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "masternode-reward-shares-contract" description = "Masternode reward shares data contract schema and tools" -version = "1.0.0-dev.5" +version = "1.0.0-dev.6" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/masternode-reward-shares-contract/package.json b/packages/masternode-reward-shares-contract/package.json index 6af8c4797d..3f7d86dc56 100644 --- a/packages/masternode-reward-shares-contract/package.json +++ b/packages/masternode-reward-shares-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/masternode-reward-shares-contract", - "version": "1.0.0-dev.5", + "version": "1.0.0-dev.6", "description": "A contract and helper scripts for reward sharing", "scripts": { "lint": "eslint .", diff --git a/packages/platform-test-suite/package.json b/packages/platform-test-suite/package.json index 580770785d..e510cc7cd5 100644 --- a/packages/platform-test-suite/package.json +++ b/packages/platform-test-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/platform-test-suite", "private": true, - "version": "1.0.0-dev.5", + "version": "1.0.0-dev.6", "description": "Dash Network end-to-end tests", "scripts": { "test": "yarn exec bin/test.sh", diff --git a/packages/rs-dapi-client/Cargo.toml b/packages/rs-dapi-client/Cargo.toml index 203d400042..42ff23d25c 100644 --- a/packages/rs-dapi-client/Cargo.toml +++ b/packages/rs-dapi-client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rs-dapi-client" -version = "1.0.0-dev.5" +version = "1.0.0-dev.6" edition = "2021" [features] diff --git a/packages/rs-dapi-grpc-macros/Cargo.toml b/packages/rs-dapi-grpc-macros/Cargo.toml index 29a16aa050..a0fa6e6976 100644 --- a/packages/rs-dapi-grpc-macros/Cargo.toml +++ b/packages/rs-dapi-grpc-macros/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc-macros" -version = "1.0.0-dev.5" +version = "1.0.0-dev.6" edition = "2021" description = "Macros used by dapi-grpc. Internal use only." diff --git a/packages/rs-dpp/Cargo.toml b/packages/rs-dpp/Cargo.toml index 7fd2ea0334..fdce3c3505 100644 --- a/packages/rs-dpp/Cargo.toml +++ b/packages/rs-dpp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dpp" -version = "1.0.0-dev.5" +version = "1.0.0-dev.6" edition = "2021" rust-version = "1.76" authors = [ diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index 50e993c329..332d578fd3 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drive-abci" -version = "1.0.0-dev.5" +version = "1.0.0-dev.6" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/rs-drive-proof-verifier/Cargo.toml b/packages/rs-drive-proof-verifier/Cargo.toml index 17e7b2a5f8..7349770984 100644 --- a/packages/rs-drive-proof-verifier/Cargo.toml +++ b/packages/rs-drive-proof-verifier/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drive-proof-verifier" -version = "1.0.0-dev.5" +version = "1.0.0-dev.6" edition = "2021" rust-version = "1.76" diff --git a/packages/rs-drive/Cargo.toml b/packages/rs-drive/Cargo.toml index 40aea3de43..d0f0b56f94 100644 --- a/packages/rs-drive/Cargo.toml +++ b/packages/rs-drive/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "drive" description = "Dash drive built on top of GroveDB" -version = "1.0.0-dev.5" +version = "1.0.0-dev.6" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/rs-platform-serialization-derive/Cargo.toml b/packages/rs-platform-serialization-derive/Cargo.toml index cca0e802c1..01a4c749f2 100644 --- a/packages/rs-platform-serialization-derive/Cargo.toml +++ b/packages/rs-platform-serialization-derive/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization-derive" authors = ["Samuel Westrich "] description = "Bincode serialization and deserialization derivations" -version = "1.0.0-dev.5" +version = "1.0.0-dev.6" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/rs-platform-serialization/Cargo.toml b/packages/rs-platform-serialization/Cargo.toml index 51714c67bf..0789334a74 100644 --- a/packages/rs-platform-serialization/Cargo.toml +++ b/packages/rs-platform-serialization/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization" authors = ["Samuel Westrich "] description = "Bincode based serialization and deserialization" -version = "1.0.0-dev.5" +version = "1.0.0-dev.6" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/rs-platform-value-convertible/Cargo.toml b/packages/rs-platform-value-convertible/Cargo.toml index fbcc3134d2..8f746c189f 100644 --- a/packages/rs-platform-value-convertible/Cargo.toml +++ b/packages/rs-platform-value-convertible/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-value-convertible" authors = ["Samuel Westrich "] description = "Convertion to and from platform values" -version = "1.0.0-dev.5" +version = "1.0.0-dev.6" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/rs-platform-value/Cargo.toml b/packages/rs-platform-value/Cargo.toml index b84c76bd31..c4750d0ec9 100644 --- a/packages/rs-platform-value/Cargo.toml +++ b/packages/rs-platform-value/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-value" authors = ["Samuel Westrich "] description = "A simple value module" -version = "1.0.0-dev.5" +version = "1.0.0-dev.6" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/rs-platform-version/Cargo.toml b/packages/rs-platform-version/Cargo.toml index 5774fc1a54..8b201e8ad2 100644 --- a/packages/rs-platform-version/Cargo.toml +++ b/packages/rs-platform-version/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-version" authors = ["Samuel Westrich "] description = "Bincode based serialization and deserialization" -version = "1.0.0-dev.5" +version = "1.0.0-dev.6" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/rs-platform-versioning/Cargo.toml b/packages/rs-platform-versioning/Cargo.toml index 9444c21f73..edb3b95a16 100644 --- a/packages/rs-platform-versioning/Cargo.toml +++ b/packages/rs-platform-versioning/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-versioning" authors = ["Samuel Westrich "] description = "Version derivation" -version = "1.0.0-dev.5" +version = "1.0.0-dev.6" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/rs-sdk/Cargo.toml b/packages/rs-sdk/Cargo.toml index bdc02fb849..a4fc71b585 100644 --- a/packages/rs-sdk/Cargo.toml +++ b/packages/rs-sdk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rs-sdk" -version = "1.0.0-dev.5" +version = "1.0.0-dev.6" edition = "2021" [dependencies] diff --git a/packages/simple-signer/Cargo.toml b/packages/simple-signer/Cargo.toml index 226938a0e4..ff6560ee07 100644 --- a/packages/simple-signer/Cargo.toml +++ b/packages/simple-signer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "simple-signer" -version = "1.0.0-dev.5" +version = "1.0.0-dev.6" edition = "2021" rust-version = "1.76" diff --git a/packages/strategy-tests/Cargo.toml b/packages/strategy-tests/Cargo.toml index c73a37f8a5..46ac32bc2b 100644 --- a/packages/strategy-tests/Cargo.toml +++ b/packages/strategy-tests/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "strategy-tests" -version = "1.0.0-dev.5" +version = "1.0.0-dev.6" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/wallet-lib/package.json b/packages/wallet-lib/package.json index 99783b3452..05d2a84738 100644 --- a/packages/wallet-lib/package.json +++ b/packages/wallet-lib/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wallet-lib", - "version": "8.0.0-dev.5", + "version": "8.0.0-dev.6", "description": "Light wallet library for Dash", "main": "src/index.js", "unpkg": "dist/wallet-lib.min.js", diff --git a/packages/wasm-dpp/Cargo.toml b/packages/wasm-dpp/Cargo.toml index fa3c2f3656..dd4f64e369 100644 --- a/packages/wasm-dpp/Cargo.toml +++ b/packages/wasm-dpp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasm-dpp" -version = "1.0.0-dev.5" +version = "1.0.0-dev.6" edition = "2021" rust-version = "1.76" authors = ["Anton Suprunchuk "] diff --git a/packages/wasm-dpp/package.json b/packages/wasm-dpp/package.json index 28b1e149d8..9ade788b3c 100644 --- a/packages/wasm-dpp/package.json +++ b/packages/wasm-dpp/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wasm-dpp", - "version": "1.0.0-dev.5", + "version": "1.0.0-dev.6", "description": "The JavaScript implementation of the Dash Platform Protocol", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/withdrawals-contract/Cargo.toml b/packages/withdrawals-contract/Cargo.toml index eb4fabae2d..15e74849f3 100644 --- a/packages/withdrawals-contract/Cargo.toml +++ b/packages/withdrawals-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "withdrawals-contract" description = "Witdrawals data contract schema and tools" -version = "1.0.0-dev.5" +version = "1.0.0-dev.6" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/withdrawals-contract/package.json b/packages/withdrawals-contract/package.json index b513df1d0c..34a0789f23 100644 --- a/packages/withdrawals-contract/package.json +++ b/packages/withdrawals-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/withdrawals-contract", - "version": "1.0.0-dev.5", + "version": "1.0.0-dev.6", "description": "Data Contract to manipulate and track withdrawals", "scripts": { "build": "", From aba85d4b7e2eb12156181556f024fab7f6373e94 Mon Sep 17 00:00:00 2001 From: PastaPastaPasta <6443210+PastaPastaPasta@users.noreply.github.com> Date: Wed, 6 Mar 2024 03:31:05 -0600 Subject: [PATCH 056/191] refactor: reduce cargo clippy warnings (#1738) --- packages/rs-drive/src/drive/batch/transitions/mod.rs | 1 - packages/rs-drive/src/drive/contract/contract_fetch_info.rs | 1 - .../src/drive/contract/prove/prove_contract/v0/mod.rs | 2 +- .../fetch_identity_contract_nonce/v0/mod.rs | 2 +- .../merge_identity_contract_nonce/mod.rs | 2 +- .../merge_identity_contract_nonce/v0/mod.rs | 6 +++--- .../for_identity_contract_info_group/v0/mod.rs | 2 +- .../for_identity_contract_info_group_keys/v0/mod.rs | 4 +--- .../drive/identity/fetch/nonce/prove_identity_nonce/mod.rs | 4 ---- packages/rs-drive/src/drive/identity/fetch/queries/mod.rs | 2 +- .../identity/update/methods/merge_identity_nonce/v0/mod.rs | 1 - .../initialize_identity_nonce_operation/v0/mod.rs | 2 +- .../operations/merge_identity_nonce_operations/v0/mod.rs | 6 ++---- .../identity/verify_identity_keys_by_identity_id/v0/mod.rs | 2 +- .../document/documents_batch/document_transition/mod.rs | 4 ++-- .../identity/identity_credit_transfer/mod.rs | 2 +- .../identity/identity_credit_transfer/v0/mod.rs | 2 +- .../identity/identity_credit_withdrawal/mod.rs | 2 +- .../identity/identity_credit_withdrawal/v0/mod.rs | 2 +- .../system/bump_identity_data_contract_nonce_action/mod.rs | 1 - .../bump_identity_data_contract_nonce_action/transformer.rs | 2 +- 21 files changed, 20 insertions(+), 32 deletions(-) diff --git a/packages/rs-drive/src/drive/batch/transitions/mod.rs b/packages/rs-drive/src/drive/batch/transitions/mod.rs index b9165a98f6..2b7d475e45 100644 --- a/packages/rs-drive/src/drive/batch/transitions/mod.rs +++ b/packages/rs-drive/src/drive/batch/transitions/mod.rs @@ -8,7 +8,6 @@ mod document; mod identity; mod system; -use crate::drive::batch::transitions::document::DriveHighLevelDocumentOperationConverter; use crate::drive::batch::DriveOperation; use crate::error::Error; use crate::state_transition_action::StateTransitionAction; diff --git a/packages/rs-drive/src/drive/contract/contract_fetch_info.rs b/packages/rs-drive/src/drive/contract/contract_fetch_info.rs index 1c48af9538..3b72fc9197 100644 --- a/packages/rs-drive/src/drive/contract/contract_fetch_info.rs +++ b/packages/rs-drive/src/drive/contract/contract_fetch_info.rs @@ -2,7 +2,6 @@ use crate::drive::flags::StorageFlags; use dpp::data_contract::DataContract; use dpp::data_contracts; use dpp::fee::fee_result::FeeResult; -use dpp::prelude::IdentityNonce; use dpp::system_data_contracts::load_system_data_contract; #[cfg(feature = "fixtures-and-mocks")] use dpp::tests::fixtures::get_dashpay_contract_fixture; diff --git a/packages/rs-drive/src/drive/contract/prove/prove_contract/v0/mod.rs b/packages/rs-drive/src/drive/contract/prove/prove_contract/v0/mod.rs index 61fa964310..48e694a94d 100644 --- a/packages/rs-drive/src/drive/contract/prove/prove_contract/v0/mod.rs +++ b/packages/rs-drive/src/drive/contract/prove/prove_contract/v0/mod.rs @@ -1,7 +1,7 @@ use crate::drive::Drive; use crate::error::Error; -use crate::drive::contract::paths::{contract_root_path, contract_root_path_vec}; +use crate::drive::contract::paths::contract_root_path; use dpp::version::PlatformVersion; use grovedb::TransactionArg; diff --git a/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/fetch_identity_contract_nonce/v0/mod.rs b/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/fetch_identity_contract_nonce/v0/mod.rs index bb4ec6af34..1a6b646549 100644 --- a/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/fetch_identity_contract_nonce/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/fetch_identity_contract_nonce/v0/mod.rs @@ -7,7 +7,7 @@ use crate::error::Error; use crate::fee::op::LowLevelDriveOperation; use dpp::block::block_info::BlockInfo; use dpp::fee::fee_result::FeeResult; -use dpp::prelude::{IdentityNonce, Revision}; +use dpp::prelude::{IdentityNonce}; use crate::drive::identity::contract_info::ContractInfoStructure::IdentityContractNonceKey; use dpp::version::PlatformVersion; diff --git a/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/merge_identity_contract_nonce/mod.rs b/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/merge_identity_contract_nonce/mod.rs index 15adca893e..364dcec761 100644 --- a/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/merge_identity_contract_nonce/mod.rs +++ b/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/merge_identity_contract_nonce/mod.rs @@ -1,6 +1,6 @@ use crate::drive::Drive; use crate::error::drive::DriveError; -use crate::error::identity::IdentityError; + use crate::error::Error; use crate::fee::op::LowLevelDriveOperation; use dpp::block::block_info::BlockInfo; diff --git a/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/merge_identity_contract_nonce/v0/mod.rs b/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/merge_identity_contract_nonce/v0/mod.rs index 392e92c788..156e524468 100644 --- a/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/merge_identity_contract_nonce/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/merge_identity_contract_nonce/v0/mod.rs @@ -6,7 +6,7 @@ use crate::drive::object_size_info::{PathKeyElementInfo, PathKeyInfo}; use crate::drive::Drive; use crate::error::Error; use crate::fee::op::LowLevelDriveOperation; -use dpp::data_contract::accessors::v0::DataContractV0Getters; + use dpp::version::PlatformVersion; use grovedb::batch::KeyInfoPath; use grovedb::{Element, EstimatedLayerInformation, TransactionArg}; @@ -17,7 +17,7 @@ use dpp::identity::identity_nonce::{IDENTITY_NONCE_VALUE_FILTER, IDENTITY_NONCE_ use dpp::prelude::IdentityNonce; use crate::drive::identity::contract_info::identity_contract_nonce::merge_identity_contract_nonce::MergeIdentityNonceResult; use crate::drive::identity::contract_info::identity_contract_nonce::merge_identity_contract_nonce::MergeIdentityNonceResult::{MergeIdentityNonceSuccess, NonceAlreadyPresentAtTip, NonceAlreadyPresentInPast, NonceTooFarInFuture, NonceTooFarInPast}; -use crate::error::identity::IdentityError; + impl Drive { pub(in crate::drive::identity::contract_info) fn merge_identity_contract_nonce_v0( @@ -157,7 +157,7 @@ impl Drive { )?; } - let (existing_nonce, fees) = if previous_nonce_is_sure_to_not_exist { + let (existing_nonce, _fees) = if previous_nonce_is_sure_to_not_exist { (None, FeeResult::default()) } else { self.fetch_identity_contract_nonce_with_fees( diff --git a/packages/rs-drive/src/drive/identity/estimation_costs/for_identity_contract_info_group/v0/mod.rs b/packages/rs-drive/src/drive/identity/estimation_costs/for_identity_contract_info_group/v0/mod.rs index da5ee687a7..9fc0347ab8 100644 --- a/packages/rs-drive/src/drive/identity/estimation_costs/for_identity_contract_info_group/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/estimation_costs/for_identity_contract_info_group/v0/mod.rs @@ -3,7 +3,7 @@ use crate::drive::Drive; use grovedb::batch::KeyInfoPath; use grovedb::EstimatedLayerCount::ApproximateElements; use grovedb::EstimatedLayerInformation; -use grovedb::EstimatedLayerSizes::{AllSubtrees, Mix}; +use grovedb::EstimatedLayerSizes::Mix; use grovedb::EstimatedSumTrees::NoSumTrees; use std::collections::HashMap; diff --git a/packages/rs-drive/src/drive/identity/estimation_costs/for_identity_contract_info_group_keys/v0/mod.rs b/packages/rs-drive/src/drive/identity/estimation_costs/for_identity_contract_info_group_keys/v0/mod.rs index 3a9b4003c2..efa3892a36 100644 --- a/packages/rs-drive/src/drive/identity/estimation_costs/for_identity_contract_info_group_keys/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/estimation_costs/for_identity_contract_info_group_keys/v0/mod.rs @@ -1,6 +1,4 @@ -use crate::drive::identity::{ - identity_contract_info_group_keys_path_vec, identity_contract_info_group_path_vec, -}; +use crate::drive::identity::identity_contract_info_group_keys_path_vec; use crate::drive::Drive; use grovedb::batch::KeyInfoPath; use grovedb::EstimatedLayerCount::ApproximateElements; diff --git a/packages/rs-drive/src/drive/identity/fetch/nonce/prove_identity_nonce/mod.rs b/packages/rs-drive/src/drive/identity/fetch/nonce/prove_identity_nonce/mod.rs index a4f18d1af1..fb836958c8 100644 --- a/packages/rs-drive/src/drive/identity/fetch/nonce/prove_identity_nonce/mod.rs +++ b/packages/rs-drive/src/drive/identity/fetch/nonce/prove_identity_nonce/mod.rs @@ -2,10 +2,6 @@ mod v0; use crate::drive::Drive; use crate::error::{drive::DriveError, Error}; -use crate::fee::op::LowLevelDriveOperation; -use dpp::block::block_info::BlockInfo; -use dpp::fee::fee_result::FeeResult; -use dpp::prelude::IdentityNonce; use dpp::version::PlatformVersion; use grovedb::TransactionArg; diff --git a/packages/rs-drive/src/drive/identity/fetch/queries/mod.rs b/packages/rs-drive/src/drive/identity/fetch/queries/mod.rs index 7d964588ad..0d474ab05c 100644 --- a/packages/rs-drive/src/drive/identity/fetch/queries/mod.rs +++ b/packages/rs-drive/src/drive/identity/fetch/queries/mod.rs @@ -7,7 +7,7 @@ use crate::error::Error; use crate::drive::identity::contract_info::ContractInfoStructure::IdentityContractNonceKey; use crate::drive::identity::IdentityRootStructure::{IdentityTreeNonce, IdentityTreeRevision}; use crate::drive::identity::{ - identity_contract_info_group_path, identity_contract_info_group_path_vec, identity_path_vec, + identity_contract_info_group_path_vec, identity_path_vec, }; use crate::error::query::QuerySyntaxError; use grovedb::{PathQuery, Query, SizedQuery}; diff --git a/packages/rs-drive/src/drive/identity/update/methods/merge_identity_nonce/v0/mod.rs b/packages/rs-drive/src/drive/identity/update/methods/merge_identity_nonce/v0/mod.rs index fd549dfe59..640315c7d9 100644 --- a/packages/rs-drive/src/drive/identity/update/methods/merge_identity_nonce/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/update/methods/merge_identity_nonce/v0/mod.rs @@ -13,7 +13,6 @@ use dpp::prelude::IdentityNonce; use dpp::version::PlatformVersion; use grovedb::{EstimatedLayerInformation, TransactionArg}; -use crate::drive::identity::update::methods::merge_identity_nonce::MergeIdentityContractNonceResultToResult; use dpp::identity::identity_nonce::MergeIdentityNonceResult; use std::collections::HashMap; diff --git a/packages/rs-drive/src/drive/identity/update/operations/initialize_identity_nonce_operation/v0/mod.rs b/packages/rs-drive/src/drive/identity/update/operations/initialize_identity_nonce_operation/v0/mod.rs index 4d209c4f40..1d750618bc 100644 --- a/packages/rs-drive/src/drive/identity/update/operations/initialize_identity_nonce_operation/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/update/operations/initialize_identity_nonce_operation/v0/mod.rs @@ -1,7 +1,7 @@ use crate::drive::identity::{identity_path_vec, IdentityRootStructure}; use crate::drive::Drive; use crate::fee::op::LowLevelDriveOperation; -use dpp::prelude::{IdentityNonce, Revision}; +use dpp::prelude::IdentityNonce; use grovedb::Element; impl Drive { diff --git a/packages/rs-drive/src/drive/identity/update/operations/merge_identity_nonce_operations/v0/mod.rs b/packages/rs-drive/src/drive/identity/update/operations/merge_identity_nonce_operations/v0/mod.rs index 4276f47e32..cb0f44651a 100644 --- a/packages/rs-drive/src/drive/identity/update/operations/merge_identity_nonce_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/update/operations/merge_identity_nonce_operations/v0/mod.rs @@ -1,4 +1,4 @@ -use crate::drive::identity::{identity_path, identity_path_vec, IdentityRootStructure}; +use crate::drive::identity::identity_path; use crate::drive::Drive; use crate::error::Error; @@ -13,7 +13,6 @@ use grovedb::{Element, EstimatedLayerInformation, TransactionArg}; use crate::drive::identity::IdentityRootStructure::IdentityTreeNonce; use crate::drive::object_size_info::PathKeyElementInfo; -use crate::error::identity::IdentityError; use dpp::block::block_info::BlockInfo; use dpp::identity::identity_nonce::MergeIdentityNonceResult::{ MergeIdentityNonceSuccess, NonceAlreadyPresentAtTip, NonceAlreadyPresentInPast, @@ -21,8 +20,7 @@ use dpp::identity::identity_nonce::MergeIdentityNonceResult::{ }; use dpp::identity::identity_nonce::{ MergeIdentityNonceResult, IDENTITY_NONCE_VALUE_FILTER, IDENTITY_NONCE_VALUE_FILTER_MAX_BYTES, - MAX_MISSING_IDENTITY_REVISIONS, MISSING_IDENTITY_REVISIONS_FILTER, - MISSING_IDENTITY_REVISIONS_MAX_BYTES, + MISSING_IDENTITY_REVISIONS_FILTER, MISSING_IDENTITY_REVISIONS_MAX_BYTES, }; use std::collections::HashMap; diff --git a/packages/rs-drive/src/drive/verify/identity/verify_identity_keys_by_identity_id/v0/mod.rs b/packages/rs-drive/src/drive/verify/identity/verify_identity_keys_by_identity_id/v0/mod.rs index 9a8de2f313..3d239241e0 100644 --- a/packages/rs-drive/src/drive/verify/identity/verify_identity_keys_by_identity_id/v0/mod.rs +++ b/packages/rs-drive/src/drive/verify/identity/verify_identity_keys_by_identity_id/v0/mod.rs @@ -1,4 +1,4 @@ -use crate::drive::balances::{balance_path, balance_path_vec}; +use crate::drive::balances::balance_path; use crate::drive::identity::{identity_key_tree_path, identity_path_vec, IdentityRootStructure}; use crate::drive::Drive; diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/mod.rs index 765a0df3b9..a6fabb8d4e 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/mod.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/mod.rs @@ -42,7 +42,7 @@ impl DocumentTransitionAction { DocumentTransitionAction::CreateAction(d) => Some(d.base()), DocumentTransitionAction::DeleteAction(d) => Some(d.base()), DocumentTransitionAction::ReplaceAction(d) => Some(d.base()), - DocumentTransitionAction::BumpIdentityDataContractNonce(d) => None, + DocumentTransitionAction::BumpIdentityDataContractNonce(_) => None, } } @@ -52,7 +52,7 @@ impl DocumentTransitionAction { DocumentTransitionAction::CreateAction(d) => Some(d.base_owned()), DocumentTransitionAction::DeleteAction(d) => Some(d.base_owned()), DocumentTransitionAction::ReplaceAction(d) => Some(d.base_owned()), - DocumentTransitionAction::BumpIdentityDataContractNonce(d) => None, + DocumentTransitionAction::BumpIdentityDataContractNonce(_) => None, } } } diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_credit_transfer/mod.rs b/packages/rs-drive/src/state_transition_action/identity/identity_credit_transfer/mod.rs index bbea82a346..44bb92d031 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_credit_transfer/mod.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_credit_transfer/mod.rs @@ -7,7 +7,7 @@ use crate::state_transition_action::identity::identity_credit_transfer::v0::Iden use derive_more::From; use dpp::fee::Credits; use dpp::platform_value::Identifier; -use dpp::prelude::{IdentityNonce, Revision}; +use dpp::prelude::IdentityNonce; /// action #[derive(Debug, Clone, From)] diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_credit_transfer/v0/mod.rs b/packages/rs-drive/src/state_transition_action/identity/identity_credit_transfer/v0/mod.rs index baf368b7e7..b850805b35 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_credit_transfer/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_credit_transfer/v0/mod.rs @@ -2,7 +2,7 @@ mod transformer; use dpp::fee::Credits; use dpp::platform_value::Identifier; -use dpp::prelude::{IdentityNonce, Revision}; +use dpp::prelude::IdentityNonce; use serde::{Deserialize, Serialize}; /// action v0 diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/mod.rs b/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/mod.rs index 58149d6b2e..08f4a46eff 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/mod.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/mod.rs @@ -8,7 +8,7 @@ use derive_more::From; use dpp::document::Document; use dpp::platform_value::Identifier; -use dpp::prelude::{IdentityNonce, Revision}; +use dpp::prelude::IdentityNonce; /// action #[derive(Debug, Clone, From)] diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/mod.rs b/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/mod.rs index d2b7d2de27..858a08122d 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/mod.rs @@ -2,7 +2,7 @@ mod transformer; use dpp::document::Document; use dpp::identifier::Identifier; -use dpp::prelude::{IdentityNonce, Revision}; +use dpp::prelude::IdentityNonce; use serde::{Deserialize, Serialize}; diff --git a/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/mod.rs b/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/mod.rs index 7e69fea371..68be72fc6b 100644 --- a/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/mod.rs +++ b/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/mod.rs @@ -1,5 +1,4 @@ use derive_more::From; -use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::platform_value::Identifier; use dpp::prelude::IdentityNonce; diff --git a/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/transformer.rs b/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/transformer.rs index a47799761d..10f46f6f14 100644 --- a/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/transformer.rs @@ -4,7 +4,7 @@ use dpp::ProtocolError; use dpp::state_transition::data_contract_update_transition::DataContractUpdateTransition; use dpp::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; use crate::state_transition_action::contract::data_contract_update::DataContractUpdateTransitionAction; -use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::{DocumentBaseTransitionAction, DocumentBaseTransitionActionV0}; +use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionAction; use crate::state_transition_action::system::bump_identity_data_contract_nonce_action::{BumpIdentityDataContractNonceAction, BumpIdentityDataContractNonceActionV0}; impl BumpIdentityDataContractNonceAction { From 242770d8dbbed239af28f7fc63a48b69fdb6ef7b Mon Sep 17 00:00:00 2001 From: Paul DeLucia <69597248+pauldelucia@users.noreply.github.com> Date: Wed, 6 Mar 2024 17:20:06 +0700 Subject: [PATCH 057/191] feat: enable random contract creation in strategies (#1729) Co-authored-by: Ivan Shumkov Co-authored-by: QuantumExplorer --- .../document_type/index/random_index.rs | 2 +- .../data_contract/generate_data_contract.rs | 2 +- packages/strategy-tests/src/lib.rs | 117 +++++++++++++++--- 3 files changed, 105 insertions(+), 16 deletions(-) diff --git a/packages/rs-dpp/src/data_contract/document_type/index/random_index.rs b/packages/rs-dpp/src/data_contract/document_type/index/random_index.rs index 269fa14ac2..49c6953e00 100644 --- a/packages/rs-dpp/src/data_contract/document_type/index/random_index.rs +++ b/packages/rs-dpp/src/data_contract/document_type/index/random_index.rs @@ -27,7 +27,7 @@ impl Index { .drain(..) .map(|field_name| IndexProperty { name: field_name, - ascending: rng.gen(), + ascending: true, }) .collect::>(); diff --git a/packages/rs-dpp/src/data_contract/generate_data_contract.rs b/packages/rs-dpp/src/data_contract/generate_data_contract.rs index 9656708b33..0280124e11 100644 --- a/packages/rs-dpp/src/data_contract/generate_data_contract.rs +++ b/packages/rs-dpp/src/data_contract/generate_data_contract.rs @@ -6,7 +6,7 @@ use std::io::Write; use crate::util::hash::hash_double; impl DataContract { - /// Generate data contract id based on owner id and entropy + /// Generate data contract id based on owner id and identity nonce pub fn generate_data_contract_id_v0( owner_id: impl AsRef<[u8]>, identity_nonce: IdentityNonce, diff --git a/packages/strategy-tests/src/lib.rs b/packages/strategy-tests/src/lib.rs index 24bc26652e..f0eea09ce9 100644 --- a/packages/strategy-tests/src/lib.rs +++ b/packages/strategy-tests/src/lib.rs @@ -8,11 +8,11 @@ use dpp::dashcore::PrivateKey; use dpp::data_contract::created_data_contract::CreatedDataContract; use dpp::data_contract::document_type::random_document::CreateRandomDocument; use dpp::data_contract::document_type::v0::DocumentTypeV0; -use dpp::data_contract::DataContract; +use dpp::data_contract::{DataContract, DataContractFactory}; use dpp::document::{Document, DocumentV0Getters}; use dpp::identity::state_transition::asset_lock_proof::AssetLockProof; -use dpp::identity::{Identity, KeyType, PartialIdentity, Purpose, SecurityLevel}; +use dpp::identity::{Identity, KeyID, KeyType, PartialIdentity, Purpose, SecurityLevel}; use dpp::platform_value::string_encoding::Encoding; use dpp::serialization::{ PlatformDeserializableWithPotentialValidationFromVersionedStructure, @@ -37,7 +37,7 @@ use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::identifier::Identifier; use dpp::data_contract::document_type::DocumentType; use dpp::identity::accessors::IdentityGettersV0; -use dpp::platform_value::{BinaryData, Bytes32}; +use dpp::platform_value::{BinaryData, Value}; use dpp::ProtocolError; use dpp::ProtocolError::{PlatformDeserializationError, PlatformSerializationError}; use dpp::state_transition::documents_batch_transition::document_base_transition::v0::DocumentBaseTransitionV0; @@ -1118,17 +1118,107 @@ impl Strategy { operations.push(state_transition); } } - // OperationType::ContractCreate(new_fields_optional_count_range, new_fields_required_count_range, new_index_count_range, document_type_count) - // if !current_identities.is_empty() => { - // DataContract::; - // - // DocumentType::random_document() - // } + OperationType::ContractCreate(params, doc_type_range) + if !current_identities.is_empty() => + { + let contract_factory = match DataContractFactory::new( + platform_version.protocol_version, + ) { + Ok(contract_factory) => contract_factory, + Err(e) => { + error!("Failed to get DataContractFactory while creating random contract: {e}"); + continue; + } + }; + + // Create `count` ContractCreate transitions and push to operations vec + for _ in 0..count { + // Get the contract owner_id from loaded_identity and loaded_identity nonce + let identity = ¤t_identities[0]; + let identity_nonce = + identity_nonce_counter.entry(identity.id()).or_default(); + *identity_nonce += 1; + let owner_id = identity.id(); + + // Generate a contract id + let contract_id = DataContract::generate_data_contract_id_v0( + owner_id, + *identity_nonce, + ); + + // Create `doc_type_count` doc types + let doc_types = Value::Map(doc_type_range.clone().filter_map(|_| { + match DocumentTypeV0::random_document_type( + params.clone(), + contract_id, + rng, + platform_version, + ) { + Ok(new_document_type) => { + let mut doc_type_clone = new_document_type.schema().clone(); + let name = doc_type_clone.remove("title").expect( + "Expected to get a doc type title in ContractCreate", + ); + Some((Value::Text(name.to_string()), doc_type_clone)) + } + Err(e) => { + error!("Error generating random document type: {:?}", e); + None + } + } + }).collect()); + + let created_data_contract = match contract_factory.create( + owner_id, + *identity_nonce, + doc_types, + None, + None, + ) { + Ok(contract) => contract, + Err(e) => { + error!("Failed to create random data contract: {e}"); + continue; + } + }; + + let transition = match contract_factory + .create_data_contract_create_transition(created_data_contract) + { + Ok(transition) => transition, + Err(e) => { + error!("Failed to create ContractCreate transition: {e}"); + continue; + } + }; + + // Sign transition + let public_key = identity.get_first_public_key_matching( + Purpose::AUTHENTICATION, + HashSet::from([SecurityLevel::CRITICAL]), + HashSet::from([KeyType::ECDSA_SECP256K1]), + ) + .expect("Expected to get identity public key in ContractCreate"); + let mut state_transition = + StateTransition::DataContractCreate(transition); + if let Err(e) = state_transition.sign_external( + public_key, + signer, + None::< + fn(Identifier, String) -> Result, + >, + ) { + error!("Error signing state transition: {:?}", e); + } + + operations.push(state_transition); + } + } OperationType::ContractUpdate(DataContractUpdateOp { action: DataContractUpdateAction::DataContractNewDocumentTypes(params), contract, document_type: None, - }) => { + }) if !current_identities.is_empty() => { let contract_key = contract.id().to_string(Encoding::Base58); for _ in 0..count { @@ -1275,9 +1365,8 @@ impl Strategy { // Do we also need to add identities to the identity_nonce_counter? - // Do certain things on the first block + // Add initial contracts for contracts_with_updates on first block of strategy if block_info.height == config.start_block_height { - // Add initial contracts for contracts_with_updates on first block of strategy let mut contract_state_transitions = self.contract_state_transitions( current_identities, identity_nonce_counter, @@ -1287,7 +1376,7 @@ impl Strategy { ); state_transitions.append(&mut contract_state_transitions); } else { - // Do operations + // Do operations and contract updates after the first block let (mut document_state_transitions, mut add_to_finalize_block_operations) = self .state_transitions_for_block( document_query_callback, @@ -1305,7 +1394,7 @@ impl Strategy { finalize_block_operations.append(&mut add_to_finalize_block_operations); state_transitions.append(&mut document_state_transitions); - // Do contract updates for contracts_with_updates + // Contract updates for contracts_with_updates let mut contract_update_state_transitions = self.contract_update_state_transitions( current_identities, block_info.height, From a55764f54d884c0b35d8c7d8317cadff9c2d4b75 Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Wed, 6 Mar 2024 22:11:25 +0700 Subject: [PATCH 058/191] refactor(drive): expose more groveDB internals (#1739) --- packages/rs-drive/src/lib.rs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/rs-drive/src/lib.rs b/packages/rs-drive/src/lib.rs index 51188eba9d..29e8a40568 100644 --- a/packages/rs-drive/src/lib.rs +++ b/packages/rs-drive/src/lib.rs @@ -32,6 +32,15 @@ pub use dpp; /// GroveDB module #[cfg(feature = "full")] pub use grovedb; + +#[cfg(feature = "full")] +pub use grovedb_path; + +#[cfg(feature = "full")] +pub use grovedb_costs; + +#[cfg(feature = "full")] +pub use grovedb_storage; #[cfg(feature = "full")] mod fee; /// State transition action module From 33c428e26fae5728effffeb0d0cb1dbc502a8c71 Mon Sep 17 00:00:00 2001 From: PastaPastaPasta <6443210+PastaPastaPasta@users.noreply.github.com> Date: Wed, 6 Mar 2024 13:03:04 -0600 Subject: [PATCH 059/191] refactor: reduce cargo clippy warnings (#1741) --- .../src/drive/batch/grovedb_op_batch/mod.rs | 2 +- .../data_contract_create_transition.rs | 21 ++--- .../data_contract_update_transition.rs | 19 ++-- .../document/document_delete_transition.rs | 25 +++--- .../document/document_update_transition.rs | 27 +++--- .../src/drive/batch/transitions/mod.rs | 2 +- packages/rs-drive/src/drive/cache.rs | 1 - .../src/drive/cache/system_contracts.rs | 1 - .../merge_identity_contract_nonce/v0/mod.rs | 86 ++++++++++-------- .../merge_identity_nonce_operations/v0/mod.rs | 89 ++++++++++--------- .../src/drive/operations/drop_cache/v0/mod.rs | 2 +- .../src/drive/prove/prove_multiple/mod.rs | 4 +- .../src/drive/prove/prove_multiple/v0/mod.rs | 4 +- packages/rs-drive/src/query/conditions.rs | 2 +- .../v0/mod.rs | 2 - 15 files changed, 141 insertions(+), 146 deletions(-) diff --git a/packages/rs-drive/src/drive/batch/grovedb_op_batch/mod.rs b/packages/rs-drive/src/drive/batch/grovedb_op_batch/mod.rs index 9c16b1ff61..f8d09a16aa 100644 --- a/packages/rs-drive/src/drive/batch/grovedb_op_batch/mod.rs +++ b/packages/rs-drive/src/drive/batch/grovedb_op_batch/mod.rs @@ -245,7 +245,7 @@ impl GroveDbOpBatchV0Methods for GroveDbOpBatch { ); self.operations.iter().find_map(|op| { - if &op.path == &path && op.key == KeyInfo::KnownKey(key.to_vec()) { + if op.path == path && op.key == KeyInfo::KnownKey(key.to_vec()) { Some(&op.op) } else { None diff --git a/packages/rs-drive/src/drive/batch/transitions/contract/data_contract_create_transition.rs b/packages/rs-drive/src/drive/batch/transitions/contract/data_contract_create_transition.rs index ed1a3d1b81..02cf44580a 100644 --- a/packages/rs-drive/src/drive/batch/transitions/contract/data_contract_create_transition.rs +++ b/packages/rs-drive/src/drive/batch/transitions/contract/data_contract_create_transition.rs @@ -14,23 +14,16 @@ impl DriveHighLevelOperationConverter for DataContractCreateTransitionAction { _epoch: &Epoch, _platform_version: &PlatformVersion, ) -> Result>, Error> { - let mut drive_operations = vec![]; - - drive_operations.push(IdentityOperation( - IdentityOperationType::UpdateIdentityNonce { + Ok(vec![ + IdentityOperation(IdentityOperationType::UpdateIdentityNonce { identity_id: self.data_contract_ref().owner_id().into_buffer(), nonce: self.identity_nonce(), - }, - )); - - // We must create the contract - drive_operations.push(DataContractOperation( - DataContractOperationType::ApplyContract { + }), + // We must create the contract + DataContractOperation(DataContractOperationType::ApplyContract { contract: Cow::Owned(self.data_contract()), storage_flags: None, - }, - )); - - Ok(drive_operations) + }), + ]) } } diff --git a/packages/rs-drive/src/drive/batch/transitions/contract/data_contract_update_transition.rs b/packages/rs-drive/src/drive/batch/transitions/contract/data_contract_update_transition.rs index bdb9194db3..c2f242b5f2 100644 --- a/packages/rs-drive/src/drive/batch/transitions/contract/data_contract_update_transition.rs +++ b/packages/rs-drive/src/drive/batch/transitions/contract/data_contract_update_transition.rs @@ -14,22 +14,17 @@ impl DriveHighLevelOperationConverter for DataContractUpdateTransitionAction { _epoch: &Epoch, _platform_version: &PlatformVersion, ) -> Result>, Error> { - let mut drive_operations = vec![]; - // We must create the contract - drive_operations.push(IdentityOperation( - IdentityOperationType::UpdateIdentityContractNonce { + Ok(vec![ + // We must create the contract + IdentityOperation(IdentityOperationType::UpdateIdentityContractNonce { identity_id: self.data_contract_ref().owner_id().into_buffer(), contract_id: self.data_contract_ref().id().into_buffer(), nonce: self.identity_contract_nonce(), - }, - )); - drive_operations.push(DataContractOperation( - DataContractOperationType::ApplyContract { + }), + DataContractOperation(DataContractOperationType::ApplyContract { contract: Cow::Owned(self.data_contract()), storage_flags: None, - }, - )); - - Ok(drive_operations) + }), + ]) } } diff --git a/packages/rs-drive/src/drive/batch/transitions/document/document_delete_transition.rs b/packages/rs-drive/src/drive/batch/transitions/document/document_delete_transition.rs index 4cca6387ab..816bb1fa84 100644 --- a/packages/rs-drive/src/drive/batch/transitions/document/document_delete_transition.rs +++ b/packages/rs-drive/src/drive/batch/transitions/document/document_delete_transition.rs @@ -26,22 +26,19 @@ impl DriveHighLevelDocumentOperationConverter for DocumentDeleteTransitionAction let identity_contract_nonce = base.identity_contract_nonce(); - let mut drive_operations = vec![]; - drive_operations.push(IdentityOperation( - IdentityOperationType::UpdateIdentityContractNonce { + Ok(vec![ + IdentityOperation(IdentityOperationType::UpdateIdentityContractNonce { identity_id: owner_id.into_buffer(), contract_id: data_contract_id.into_buffer(), nonce: identity_contract_nonce, - }, - )); - drive_operations.push(DocumentOperation( - DocumentOperationType::DeleteDocumentOfNamedTypeForContractId { - document_id: base.id().to_buffer(), - contract_id: base.data_contract_id().to_buffer(), - document_type_name: Cow::Owned(base.document_type_name_owned()), - }, - )); - - Ok(drive_operations) + }), + DocumentOperation( + DocumentOperationType::DeleteDocumentOfNamedTypeForContractId { + document_id: base.id().to_buffer(), + contract_id: base.data_contract_id().to_buffer(), + document_type_name: Cow::Owned(base.document_type_name_owned()), + }, + ), + ]) } } diff --git a/packages/rs-drive/src/drive/batch/transitions/document/document_update_transition.rs b/packages/rs-drive/src/drive/batch/transitions/document/document_update_transition.rs index d7c2067063..58bfaaf1ca 100644 --- a/packages/rs-drive/src/drive/batch/transitions/document/document_update_transition.rs +++ b/packages/rs-drive/src/drive/batch/transitions/document/document_update_transition.rs @@ -29,23 +29,20 @@ impl DriveHighLevelDocumentOperationConverter for DocumentReplaceTransitionActio let storage_flags = StorageFlags::new_single_epoch(epoch.index, Some(owner_id.to_buffer())); - let mut drive_operations = vec![]; - drive_operations.push(IdentityOperation( - IdentityOperationType::UpdateIdentityContractNonce { + Ok(vec![ + IdentityOperation(IdentityOperationType::UpdateIdentityContractNonce { identity_id: owner_id.into_buffer(), contract_id: data_contract_id.into_buffer(), nonce: identity_contract_nonce, - }, - )); - drive_operations.push(DocumentOperation(DocumentOperationType::UpdateDocument { - owned_document_info: OwnedDocumentInfo { - document_info: DocumentOwnedInfo((document, Some(Cow::Owned(storage_flags)))), - owner_id: Some(owner_id.into_buffer()), - }, - contract_id: data_contract_id, - document_type_name: Cow::Owned(document_type_name), - })); - - Ok(drive_operations) + }), + DocumentOperation(DocumentOperationType::UpdateDocument { + owned_document_info: OwnedDocumentInfo { + document_info: DocumentOwnedInfo((document, Some(Cow::Owned(storage_flags)))), + owner_id: Some(owner_id.into_buffer()), + }, + contract_id: data_contract_id, + document_type_name: Cow::Owned(document_type_name), + }), + ]) } } diff --git a/packages/rs-drive/src/drive/batch/transitions/mod.rs b/packages/rs-drive/src/drive/batch/transitions/mod.rs index 2b7d475e45..d5a8dade2b 100644 --- a/packages/rs-drive/src/drive/batch/transitions/mod.rs +++ b/packages/rs-drive/src/drive/batch/transitions/mod.rs @@ -24,7 +24,7 @@ pub trait DriveHighLevelOperationConverter { ) -> Result>, Error>; } -impl<'s> DriveHighLevelOperationConverter for StateTransitionAction { +impl DriveHighLevelOperationConverter for StateTransitionAction { fn into_high_level_drive_operations<'a>( self, epoch: &Epoch, diff --git a/packages/rs-drive/src/drive/cache.rs b/packages/rs-drive/src/drive/cache.rs index 594a693e2c..936869cf04 100644 --- a/packages/rs-drive/src/drive/cache.rs +++ b/packages/rs-drive/src/drive/cache.rs @@ -1,5 +1,4 @@ use dpp::identity::TimestampMillis; -use std::sync::RwLock; mod data_contract; mod protocol_version; diff --git a/packages/rs-drive/src/drive/cache/system_contracts.rs b/packages/rs-drive/src/drive/cache/system_contracts.rs index a85260866e..f9883ca7f5 100644 --- a/packages/rs-drive/src/drive/cache/system_contracts.rs +++ b/packages/rs-drive/src/drive/cache/system_contracts.rs @@ -2,7 +2,6 @@ use crate::error::Error; use dpp::data_contract::DataContract; use dpp::system_data_contracts::{load_system_data_contract, SystemDataContract}; use platform_version::version::PlatformVersion; -use std::sync::{RwLock, RwLockReadGuard}; /// System contracts pub struct SystemDataContracts { diff --git a/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/merge_identity_contract_nonce/v0/mod.rs b/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/merge_identity_contract_nonce/v0/mod.rs index 156e524468..f54bd0e539 100644 --- a/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/merge_identity_contract_nonce/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/merge_identity_contract_nonce/v0/mod.rs @@ -175,53 +175,61 @@ impl Drive { revision_nonce } else if let Some(existing_nonce) = existing_nonce { let actual_existing_revision = existing_nonce & IDENTITY_NONCE_VALUE_FILTER; - if actual_existing_revision == revision_nonce { - // we were not able to update the revision as it is the same as we already had - return Ok((NonceAlreadyPresentAtTip, drive_operations)); - } else if actual_existing_revision < revision_nonce { - if revision_nonce - actual_existing_revision > MISSING_IDENTITY_REVISIONS_MAX_BYTES - { - // we are too far away from the actual revision - return Ok((NonceTooFarInFuture, drive_operations)); - } else { - let missing_amount_of_revisions = revision_nonce - actual_existing_revision - 1; - let new_previous_missing_revisions = (existing_nonce - & MISSING_IDENTITY_REVISIONS_FILTER) - << (missing_amount_of_revisions + 1); - // the missing_revisions_bytes are the amount of bytes to put in the missing area - let missing_revisions_bytes = if missing_amount_of_revisions > 0 { - ((1 << missing_amount_of_revisions) - 1) - << IDENTITY_NONCE_VALUE_FILTER_MAX_BYTES + match actual_existing_revision.cmp(&revision_nonce) { + std::cmp::Ordering::Equal => { + // we were not able to update the revision as it is the same as we already had + return Ok((NonceAlreadyPresentAtTip, drive_operations)); + } + std::cmp::Ordering::Less => { + if revision_nonce - actual_existing_revision + > MISSING_IDENTITY_REVISIONS_MAX_BYTES + { + // we are too far away from the actual revision + return Ok((NonceTooFarInFuture, drive_operations)); } else { - 0 - }; - new_previous_missing_revisions | revision_nonce | missing_revisions_bytes + let missing_amount_of_revisions = + revision_nonce - actual_existing_revision - 1; + let new_previous_missing_revisions = (existing_nonce + & MISSING_IDENTITY_REVISIONS_FILTER) + << (missing_amount_of_revisions + 1); + // the missing_revisions_bytes are the amount of bytes to put in the missing area + let missing_revisions_bytes = if missing_amount_of_revisions > 0 { + ((1 << missing_amount_of_revisions) - 1) + << IDENTITY_NONCE_VALUE_FILTER_MAX_BYTES + } else { + 0 + }; + new_previous_missing_revisions | revision_nonce | missing_revisions_bytes + } } - } else { - let previous_revision_position_from_top = actual_existing_revision - revision_nonce; - if previous_revision_position_from_top >= MISSING_IDENTITY_REVISIONS_MAX_BYTES { - // we are too far away from the actual revision - return Ok((NonceTooFarInPast, drive_operations)); - } else { - let old_missing_revisions = existing_nonce & MISSING_IDENTITY_REVISIONS_FILTER; - if old_missing_revisions == 0 { - return Ok(( - NonceAlreadyPresentInPast(previous_revision_position_from_top), - drive_operations, - )); + std::cmp::Ordering::Greater => { + let previous_revision_position_from_top = + actual_existing_revision - revision_nonce; + if previous_revision_position_from_top >= MISSING_IDENTITY_REVISIONS_MAX_BYTES { + // we are too far away from the actual revision + return Ok((NonceTooFarInPast, drive_operations)); } else { - let byte_to_unset = 1 - << (previous_revision_position_from_top - 1 - + IDENTITY_NONCE_VALUE_FILTER_MAX_BYTES); - let old_revision_already_set = - old_missing_revisions | byte_to_unset != old_missing_revisions; - if old_revision_already_set { + let old_missing_revisions = + existing_nonce & MISSING_IDENTITY_REVISIONS_FILTER; + if old_missing_revisions == 0 { return Ok(( NonceAlreadyPresentInPast(previous_revision_position_from_top), drive_operations, )); } else { - existing_nonce & !byte_to_unset + let byte_to_unset = 1 + << (previous_revision_position_from_top - 1 + + IDENTITY_NONCE_VALUE_FILTER_MAX_BYTES); + let old_revision_already_set = + old_missing_revisions | byte_to_unset != old_missing_revisions; + if old_revision_already_set { + return Ok(( + NonceAlreadyPresentInPast(previous_revision_position_from_top), + drive_operations, + )); + } else { + existing_nonce & !byte_to_unset + } } } } diff --git a/packages/rs-drive/src/drive/identity/update/operations/merge_identity_nonce_operations/v0/mod.rs b/packages/rs-drive/src/drive/identity/update/operations/merge_identity_nonce_operations/v0/mod.rs index cb0f44651a..09514ada1a 100644 --- a/packages/rs-drive/src/drive/identity/update/operations/merge_identity_nonce_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/update/operations/merge_identity_nonce_operations/v0/mod.rs @@ -56,7 +56,7 @@ impl Drive { )?; } - let (existing_nonce, fees) = self.fetch_identity_nonce_with_fees( + let (existing_nonce, _unused_fees) = self.fetch_identity_nonce_with_fees( identity_id, block_info, estimated_costs_only_with_layer_info.is_none(), @@ -69,53 +69,62 @@ impl Drive { revision_nonce } else if let Some(existing_nonce) = existing_nonce { let actual_existing_revision = existing_nonce & IDENTITY_NONCE_VALUE_FILTER; - if actual_existing_revision == revision_nonce { - // we were not able to update the revision as it is the same as we already had - return Ok((NonceAlreadyPresentAtTip, drive_operations)); - } else if actual_existing_revision < revision_nonce { - if revision_nonce - actual_existing_revision > MISSING_IDENTITY_REVISIONS_MAX_BYTES - { - // we are too far away from the actual revision - return Ok((NonceTooFarInFuture, drive_operations)); - } else { - let missing_amount_of_revisions = revision_nonce - actual_existing_revision - 1; - let new_previous_missing_revisions = (existing_nonce - & MISSING_IDENTITY_REVISIONS_FILTER) - << (missing_amount_of_revisions + 1); - // the missing_revisions_bytes are the amount of bytes to put in the missing area - let missing_revisions_bytes = if missing_amount_of_revisions > 0 { - ((1 << missing_amount_of_revisions) - 1) - << IDENTITY_NONCE_VALUE_FILTER_MAX_BYTES + // equal + match actual_existing_revision.cmp(&revision_nonce) { + std::cmp::Ordering::Equal => { + // we were not able to update the revision as it is the same as we already had + return Ok((NonceAlreadyPresentAtTip, drive_operations)); + } + std::cmp::Ordering::Less => { + if revision_nonce - actual_existing_revision + > MISSING_IDENTITY_REVISIONS_MAX_BYTES + { + // we are too far away from the actual revision + return Ok((NonceTooFarInFuture, drive_operations)); } else { - 0 - }; - new_previous_missing_revisions | revision_nonce | missing_revisions_bytes + let missing_amount_of_revisions = + revision_nonce - actual_existing_revision - 1; + let new_previous_missing_revisions = (existing_nonce + & MISSING_IDENTITY_REVISIONS_FILTER) + << (missing_amount_of_revisions + 1); + // the missing_revisions_bytes are the amount of bytes to put in the missing area + let missing_revisions_bytes = if missing_amount_of_revisions > 0 { + ((1 << missing_amount_of_revisions) - 1) + << IDENTITY_NONCE_VALUE_FILTER_MAX_BYTES + } else { + 0 + }; + new_previous_missing_revisions | revision_nonce | missing_revisions_bytes + } } - } else { - let previous_revision_position_from_top = actual_existing_revision - revision_nonce; - if previous_revision_position_from_top >= MISSING_IDENTITY_REVISIONS_MAX_BYTES { - // we are too far away from the actual revision - return Ok((NonceTooFarInPast, drive_operations)); - } else { - let old_missing_revisions = existing_nonce & MISSING_IDENTITY_REVISIONS_FILTER; - if old_missing_revisions == 0 { - return Ok(( - NonceAlreadyPresentInPast(previous_revision_position_from_top), - drive_operations, - )); + std::cmp::Ordering::Greater => { + let previous_revision_position_from_top = + actual_existing_revision - revision_nonce; + if previous_revision_position_from_top >= MISSING_IDENTITY_REVISIONS_MAX_BYTES { + // we are too far away from the actual revision + return Ok((NonceTooFarInPast, drive_operations)); } else { - let byte_to_unset = 1 - << (previous_revision_position_from_top - 1 - + IDENTITY_NONCE_VALUE_FILTER_MAX_BYTES); - let old_revision_already_set = - old_missing_revisions | byte_to_unset != old_missing_revisions; - if old_revision_already_set { + let old_missing_revisions = + existing_nonce & MISSING_IDENTITY_REVISIONS_FILTER; + if old_missing_revisions == 0 { return Ok(( NonceAlreadyPresentInPast(previous_revision_position_from_top), drive_operations, )); } else { - existing_nonce & !byte_to_unset + let byte_to_unset = 1 + << (previous_revision_position_from_top - 1 + + IDENTITY_NONCE_VALUE_FILTER_MAX_BYTES); + let old_revision_already_set = + old_missing_revisions | byte_to_unset != old_missing_revisions; + if old_revision_already_set { + return Ok(( + NonceAlreadyPresentInPast(previous_revision_position_from_top), + drive_operations, + )); + } else { + existing_nonce & !byte_to_unset + } } } } diff --git a/packages/rs-drive/src/drive/operations/drop_cache/v0/mod.rs b/packages/rs-drive/src/drive/operations/drop_cache/v0/mod.rs index bc485fc3e0..1f86ae8372 100644 --- a/packages/rs-drive/src/drive/operations/drop_cache/v0/mod.rs +++ b/packages/rs-drive/src/drive/operations/drop_cache/v0/mod.rs @@ -1,4 +1,4 @@ -use crate::drive::cache::{DataContractCache, ProtocolVersionsCache}; +use crate::drive::cache::ProtocolVersionsCache; use crate::drive::Drive; impl Drive { diff --git a/packages/rs-drive/src/drive/prove/prove_multiple/mod.rs b/packages/rs-drive/src/drive/prove/prove_multiple/mod.rs index e67785411d..d814d4be8b 100644 --- a/packages/rs-drive/src/drive/prove/prove_multiple/mod.rs +++ b/packages/rs-drive/src/drive/prove/prove_multiple/mod.rs @@ -30,9 +30,9 @@ impl Drive { /// or an `Error` if the function fails. pub fn prove_multiple( &self, - identity_queries: &Vec, + identity_queries: &[IdentityDriveQuery], contract_ids: &[([u8; 32], Option)], //bool represents if it is historical - document_queries: &Vec, + document_queries: &[SingleDocumentDriveQuery], transaction: TransactionArg, platform_version: &PlatformVersion, ) -> Result, Error> { diff --git a/packages/rs-drive/src/drive/prove/prove_multiple/v0/mod.rs b/packages/rs-drive/src/drive/prove/prove_multiple/v0/mod.rs index 4fd6009ff1..df90006d23 100644 --- a/packages/rs-drive/src/drive/prove/prove_multiple/v0/mod.rs +++ b/packages/rs-drive/src/drive/prove/prove_multiple/v0/mod.rs @@ -26,9 +26,9 @@ impl Drive { /// or an `Error` if the function fails. pub(super) fn prove_multiple_v0( &self, - identity_queries: &Vec, + identity_queries: &[IdentityDriveQuery], contract_ids: &[([u8; 32], Option)], //bool is history - document_queries: &Vec, + document_queries: &[SingleDocumentDriveQuery], transaction: TransactionArg, platform_version: &PlatformVersion, ) -> Result, Error> { diff --git a/packages/rs-drive/src/query/conditions.rs b/packages/rs-drive/src/query/conditions.rs index 6e4dacf6db..da13162ebc 100644 --- a/packages/rs-drive/src/query/conditions.rs +++ b/packages/rs-drive/src/query/conditions.rs @@ -1283,7 +1283,7 @@ impl<'a> WhereClause { } } -impl<'a> From for Value { +impl From for Value { fn from(value: WhereClause) -> Self { Value::Array(vec![value.field.into(), value.operator.into(), value.value]) } diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/v0/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/v0/mod.rs index 5e1b75d016..00d3ceda69 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/v0/mod.rs @@ -6,8 +6,6 @@ use dpp::platform_value::{Identifier, Value}; use dpp::prelude::Revision; use dpp::ProtocolError; -use dpp::state_transition::documents_batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; - use std::collections::BTreeMap; use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::{DocumentBaseTransitionAction, DocumentBaseTransitionActionAccessorsV0}; From e21cc84fd8784d870ac5118df5773bebc40b9cdd Mon Sep 17 00:00:00 2001 From: PastaPastaPasta <6443210+PastaPastaPasta@users.noreply.github.com> Date: Thu, 7 Mar 2024 00:42:26 -0600 Subject: [PATCH 060/191] fix: resolve strategy-tests test failures (#1743) --- packages/strategy-tests/Cargo.toml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/strategy-tests/Cargo.toml b/packages/strategy-tests/Cargo.toml index 46ac32bc2b..f6b3c0e6ea 100644 --- a/packages/strategy-tests/Cargo.toml +++ b/packages/strategy-tests/Cargo.toml @@ -22,7 +22,9 @@ hex = "0.4.3" serde_json = "1.0" dpp = { path = "../rs-dpp", features = [ "abci", + "client", "random-documents", + "state-transitions", "state-transition-signing", "random-identities", "random-public-keys", From 00eed12301ecd6ae4bbeac5533ceb1643453bc7d Mon Sep 17 00:00:00 2001 From: PastaPastaPasta <6443210+PastaPastaPasta@users.noreply.github.com> Date: Thu, 7 Mar 2024 01:42:53 -0600 Subject: [PATCH 061/191] refactor: reduce cargo clippy warnings in rs-dpp (#1742) --- .../created_data_contract/mod.rs | 2 +- .../v0/mod.rs | 2 +- .../class_methods/try_from_schema/v0/mod.rs | 13 ++- .../rs-dpp/src/data_contract/factory/mod.rs | 1 - .../src/data_contract/factory/v0/mod.rs | 3 +- .../src/document/extended_document/mod.rs | 4 + .../src/document/extended_document/v0/mod.rs | 11 +- packages/rs-dpp/src/identity/identity.rs | 5 + .../rs-dpp/src/identity/identity_factory.rs | 10 +- .../rs-dpp/src/identity/identity_nonce.rs | 105 +++++++++--------- .../identity/identity_public_key/key_type.rs | 7 ++ .../instant/instant_asset_lock_proof.rs | 3 + .../state_transition/asset_lock_proof/mod.rs | 2 + packages/rs-dpp/src/identity/v0/mod.rs | 9 +- packages/rs-dpp/src/state_transition/mod.rs | 18 ++- .../accessors/mod.rs | 1 - .../data_contract_create_transition/mod.rs | 1 + .../data_contract_create_transition/v0/mod.rs | 3 +- .../v0/v0_methods.rs | 3 - .../data_contract_update_transition/mod.rs | 1 + .../data_contract_update_transition/v0/mod.rs | 1 + .../document_base_transition/mod.rs | 5 + .../document_base_transition/v0/mod.rs | 10 +- .../document_create_transition/convertible.rs | 24 +++- .../document_transition/mod.rs | 1 + .../documents_batch_transition/mod.rs | 1 + .../methods/hash/v0/mod.rs | 8 +- 27 files changed, 164 insertions(+), 90 deletions(-) diff --git a/packages/rs-dpp/src/data_contract/created_data_contract/mod.rs b/packages/rs-dpp/src/data_contract/created_data_contract/mod.rs index 4f41654c69..043f133a72 100644 --- a/packages/rs-dpp/src/data_contract/created_data_contract/mod.rs +++ b/packages/rs-dpp/src/data_contract/created_data_contract/mod.rs @@ -16,7 +16,7 @@ use crate::serialization::{ PlatformSerializableWithPlatformVersion, }; use crate::ProtocolError::{PlatformDeserializationError, PlatformSerializationError}; -use platform_value::{Bytes32, Value}; +use platform_value::Value; use platform_version::TryIntoPlatformVersioned; /// The created data contract is a intermediate structure that can be consumed by a diff --git a/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/v0/mod.rs index 34ac327d9d..ea55c12581 100644 --- a/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/v0/mod.rs @@ -21,7 +21,7 @@ impl DocumentTypeV0 { if document_schemas.is_empty() { return Err(ProtocolError::ConsensusError(Box::new( - DataContractEmptySchemaError::new(data_contract_id.clone()).into(), + DataContractEmptySchemaError::new(data_contract_id).into(), ))); } diff --git a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs index 7dfcbadac8..12cd06737f 100644 --- a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs @@ -1,16 +1,19 @@ use crate::data_contract::document_type::v0::DocumentTypeV0; #[cfg(feature = "validation")] use crate::data_contract::document_type::v0::StatelessJsonSchemaLazyValidator; +#[cfg(feature = "validation")] +use crate::consensus::ConsensusError; use indexmap::IndexMap; -use std::collections::{BTreeMap, BTreeSet, HashSet}; +use std::collections::{BTreeMap, BTreeSet}; +#[cfg(feature = "validation")] +use std::collections::HashSet; use std::convert::TryInto; - +#[cfg(feature = "validation")] use crate::consensus::basic::data_contract::{ DuplicateIndexNameError, InvalidIndexPropertyTypeError, InvalidIndexedPropertyConstraintError, SystemPropertyIndexAlreadyPresentError, UndefinedIndexPropertyError, UniqueIndicesLimitReachedError, }; -use crate::consensus::ConsensusError; use crate::data_contract::document_type::array::ArrayItemType; use crate::data_contract::document_type::index::Index; use crate::data_contract::document_type::index_level::IndexLevel; @@ -21,7 +24,9 @@ use crate::data_contract::document_type::schema::{ traversal_validator, validate_max_depth, }; +#[cfg(feature = "validation")] use crate::consensus::basic::document::MissingPositionsInDocumentTypePropertiesError; +#[cfg(feature = "validation")] use crate::consensus::basic::BasicError; use crate::data_contract::document_type::schema::enrich_with_base_schema; use crate::data_contract::document_type::{property_names, DocumentType}; @@ -203,7 +208,9 @@ impl DocumentTypeV0 { let index_values = Value::inner_optional_array_slice_value(schema_map, property_names::INDICES)?; + #[cfg(feature = "validation")] let mut index_names: HashSet = HashSet::new(); + #[cfg(feature = "validation")] let mut unique_indices_count = 0; let indices: Vec = index_values diff --git a/packages/rs-dpp/src/data_contract/factory/mod.rs b/packages/rs-dpp/src/data_contract/factory/mod.rs index 10eff21751..ff3a11ec2e 100644 --- a/packages/rs-dpp/src/data_contract/factory/mod.rs +++ b/packages/rs-dpp/src/data_contract/factory/mod.rs @@ -3,7 +3,6 @@ mod v0; use crate::data_contract::created_data_contract::CreatedDataContract; use crate::data_contract::DataContract; -use crate::util::entropy_generator::EntropyGenerator; use crate::version::PlatformVersion; use crate::ProtocolError; use derive_more::From; diff --git a/packages/rs-dpp/src/data_contract/factory/v0/mod.rs b/packages/rs-dpp/src/data_contract/factory/v0/mod.rs index 51db4fd3dc..70acb1d979 100644 --- a/packages/rs-dpp/src/data_contract/factory/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/factory/v0/mod.rs @@ -1,4 +1,4 @@ -use platform_value::{Bytes32, Value}; +use platform_value::Value; use platform_version::TryFromPlatformVersioned; use crate::consensus::basic::decode::SerializedObjectParsingError; @@ -20,7 +20,6 @@ use crate::state_transition::data_contract_create_transition::DataContractCreate use crate::state_transition::data_contract_update_transition::DataContractUpdateTransition; use crate::prelude::IdentityNonce; -use crate::util::entropy_generator::{DefaultEntropyGenerator, EntropyGenerator}; use crate::version::PlatformVersion; use crate::{errors::ProtocolError, prelude::Identifier}; diff --git a/packages/rs-dpp/src/document/extended_document/mod.rs b/packages/rs-dpp/src/document/extended_document/mod.rs index 41ed3b1d43..c7bdcb43dd 100644 --- a/packages/rs-dpp/src/document/extended_document/mod.rs +++ b/packages/rs-dpp/src/document/extended_document/mod.rs @@ -7,6 +7,7 @@ pub(crate) mod v0; pub use fields::{property_names, IDENTIFIER_FIELDS}; +#[cfg(any(feature = "document-json-conversion", feature = "document-value-conversion"))] use crate::data_contract::DataContract; use crate::ProtocolError; @@ -14,11 +15,14 @@ use crate::document::extended_document::v0::ExtendedDocumentV0; #[cfg(feature = "document-json-conversion")] use crate::document::serialization_traits::DocumentJsonMethodsV0; +#[cfg(feature = "validation")] use crate::validation::SimpleConsensusValidationResult; use platform_value::Value; use platform_version::version::PlatformVersion; use platform_versioning::PlatformVersioned; +#[cfg(feature = "document-json-conversion")] use serde_json::Value as JsonValue; +#[cfg(feature = "document-value-conversion")] use std::collections::BTreeMap; #[derive(Debug, Clone, PlatformVersioned)] diff --git a/packages/rs-dpp/src/document/extended_document/v0/mod.rs b/packages/rs-dpp/src/document/extended_document/v0/mod.rs index a4f76ed7de..663f647441 100644 --- a/packages/rs-dpp/src/document/extended_document/v0/mod.rs +++ b/packages/rs-dpp/src/document/extended_document/v0/mod.rs @@ -6,6 +6,7 @@ mod serialize; use crate::data_contract::document_type::DocumentTypeRef; use crate::data_contract::DataContract; +#[cfg(any(feature = "document-value-conversion", feature = "document-json-conversion"))] use crate::document::extended_document::fields::property_names; use crate::document::{Document, DocumentV0Getters, ExtendedDocument}; use crate::identity::TimestampMillis; @@ -16,8 +17,11 @@ use crate::util::hash::hash_double_to_vec; use crate::ProtocolError; use platform_value::btreemap_extensions::{ - BTreeValueMapInsertionPathHelper, BTreeValueMapPathHelper, BTreeValueMapReplacementPathHelper, - BTreeValueRemoveFromMapHelper, + BTreeValueMapInsertionPathHelper, BTreeValueMapPathHelper, +}; +#[cfg(feature = "document-value-conversion")] +use platform_value::btreemap_extensions::{ + BTreeValueMapReplacementPathHelper, BTreeValueRemoveFromMapHelper, }; use platform_value::{Bytes32, Identifier, ReplacementType, Value}; use serde::{Deserialize, Serialize}; @@ -34,10 +38,11 @@ use crate::document::serialization_traits::DocumentPlatformValueMethodsV0; use crate::document::serialization_traits::ExtendedDocumentPlatformConversionMethodsV0; #[cfg(feature = "validation")] use crate::validation::SimpleConsensusValidationResult; -use platform_value::converter::serde_json::BTreeValueJsonConverter; use platform_version::version::PlatformVersion; #[cfg(feature = "document-json-conversion")] use serde_json::Value as JsonValue; +#[cfg(feature = "document-json-conversion")] +use platform_value::converter::serde_json::BTreeValueJsonConverter; /// The `ExtendedDocumentV0` struct represents the data provided by the platform in response to a query. #[derive(Debug, Clone)] diff --git a/packages/rs-dpp/src/identity/identity.rs b/packages/rs-dpp/src/identity/identity.rs index 179712f0a8..1c8951d13b 100644 --- a/packages/rs-dpp/src/identity/identity.rs +++ b/packages/rs-dpp/src/identity/identity.rs @@ -2,17 +2,22 @@ use crate::identity::v0::IdentityV0; use crate::identity::{IdentityPublicKey, KeyID}; use crate::prelude::Revision; +#[cfg(feature = "identity-hashing")] use crate::serialization::PlatformSerializable; +#[cfg(feature = "identity-hashing")] use crate::util::hash; use crate::version::PlatformVersion; use crate::ProtocolError; +#[cfg(feature = "identity-serialization")] use bincode::{Decode, Encode}; use derive_more::From; +#[cfg(feature = "identity-serialization")] use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; use platform_value::Identifier; use crate::fee::Credits; +#[cfg(feature = "identity-serde-conversion")] use serde::{Deserialize, Serialize}; use std::collections::{BTreeMap, BTreeSet}; diff --git a/packages/rs-dpp/src/identity/identity_factory.rs b/packages/rs-dpp/src/identity/identity_factory.rs index d0d64ac2bc..7078f76b1b 100644 --- a/packages/rs-dpp/src/identity/identity_factory.rs +++ b/packages/rs-dpp/src/identity/identity_factory.rs @@ -1,5 +1,8 @@ use crate::identity::state_transition::asset_lock_proof::chain::ChainAssetLockProof; -use crate::identity::state_transition::asset_lock_proof::{AssetLockProof, InstantAssetLockProof}; +#[cfg(all(feature = "state-transitions", feature = "client"))] +use crate::identity::state_transition::asset_lock_proof::AssetLockProof; +use crate::identity::state_transition::asset_lock_proof::InstantAssetLockProof; +#[cfg(all(feature = "state-transitions", feature = "client"))] use crate::identity::state_transition::AssetLockProved; #[cfg(all(feature = "state-transitions", feature = "client"))] use crate::identity::{IdentityV0, TimestampMillis}; @@ -23,8 +26,10 @@ use crate::identity::accessors::IdentityGettersV0; #[cfg(all(feature = "validation", feature = "identity-value-conversion"))] use crate::identity::conversion::platform_value::IdentityPlatformValueConversionMethodsV0; +#[cfg(all(feature = "state-transitions", feature = "client"))] use crate::identity::core_script::CoreScript; -use crate::prelude::{IdentityNonce, Revision}; +#[cfg(all(feature = "state-transitions", feature = "client"))] +use crate::prelude::{IdentityNonce}; #[cfg(all(feature = "identity-serialization", feature = "client"))] use crate::serialization::PlatformDeserializable; #[cfg(all(feature = "state-transitions", feature = "client"))] @@ -54,6 +59,7 @@ use crate::state_transition::identity_update_transition::IdentityUpdateTransitio #[cfg(all(feature = "state-transitions", feature = "client"))] use crate::state_transition::public_key_in_creation::IdentityPublicKeyInCreation; use crate::version::PlatformVersion; +#[cfg(all(feature = "state-transitions", feature = "client"))] use crate::withdrawal::Pooling; #[cfg(any( all(feature = "identity-serialization", feature = "client"), diff --git a/packages/rs-dpp/src/identity/identity_nonce.rs b/packages/rs-dpp/src/identity/identity_nonce.rs index 85c41f6fa5..6072728aa6 100644 --- a/packages/rs-dpp/src/identity/identity_nonce.rs +++ b/packages/rs-dpp/src/identity/identity_nonce.rs @@ -38,7 +38,7 @@ pub enum MergeIdentityNonceResult { impl Display for MergeIdentityNonceResult { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - f.write_str(self.error_message().unwrap_or_else(|| "no error")) + f.write_str(self.error_message().unwrap_or("no error")) } } @@ -61,10 +61,7 @@ impl MergeIdentityNonceResult { /// Is this result an error? pub fn is_error(&self) -> bool { - match self { - MergeIdentityNonceResult::MergeIdentityNonceSuccess(_) => false, - _ => true, - } + !matches!(self, MergeIdentityNonceResult::MergeIdentityNonceSuccess(_)) } } @@ -93,64 +90,68 @@ pub fn validate_identity_nonce_update( identity_id: Identifier, ) -> SimpleConsensusValidationResult { let actual_existing_revision = existing_nonce & IDENTITY_NONCE_VALUE_FILTER; - if actual_existing_revision == new_revision_nonce { - // we were not able to update the revision as it is the same as we already had - return SimpleConsensusValidationResult::new_with_error(ConsensusError::StateError( - StateError::InvalidIdentityNonceError(InvalidIdentityNonceError { - identity_id, - current_identity_nonce: Some(existing_nonce), - setting_identity_nonce: new_revision_nonce, - error: MergeIdentityNonceResult::NonceAlreadyPresentAtTip, - }), - )); - } else if actual_existing_revision < new_revision_nonce { - if new_revision_nonce - actual_existing_revision > MISSING_IDENTITY_REVISIONS_MAX_BYTES { - // we are too far away from the actual revision + match actual_existing_revision.cmp(&new_revision_nonce) { + std::cmp::Ordering::Equal => { + // we were not able to update the revision as it is the same as we already had return SimpleConsensusValidationResult::new_with_error(ConsensusError::StateError( StateError::InvalidIdentityNonceError(InvalidIdentityNonceError { identity_id, current_identity_nonce: Some(existing_nonce), setting_identity_nonce: new_revision_nonce, - error: MergeIdentityNonceResult::NonceTooFarInFuture, + error: MergeIdentityNonceResult::NonceAlreadyPresentAtTip, }), )); } - } else { - let previous_revision_position_from_top = actual_existing_revision - new_revision_nonce; - if previous_revision_position_from_top > MISSING_IDENTITY_REVISIONS_MAX_BYTES { - // we are too far away from the actual revision - return SimpleConsensusValidationResult::new_with_error(ConsensusError::StateError( - StateError::InvalidIdentityNonceError(InvalidIdentityNonceError { - identity_id, - current_identity_nonce: Some(existing_nonce), - setting_identity_nonce: new_revision_nonce, - error: MergeIdentityNonceResult::NonceTooFarInPast, - }), - )); - } else { - let old_missing_revisions = existing_nonce & MISSING_IDENTITY_REVISIONS_FILTER; - let old_revision_already_set = if old_missing_revisions == 0 { - true + std::cmp::Ordering::Less => { + if new_revision_nonce - actual_existing_revision > MISSING_IDENTITY_REVISIONS_MAX_BYTES { + // we are too far away from the actual revision + return SimpleConsensusValidationResult::new_with_error(ConsensusError::StateError( + StateError::InvalidIdentityNonceError(InvalidIdentityNonceError { + identity_id, + current_identity_nonce: Some(existing_nonce), + setting_identity_nonce: new_revision_nonce, + error: MergeIdentityNonceResult::NonceTooFarInFuture, + }), + )); + } + } + std::cmp::Ordering::Greater => { + let previous_revision_position_from_top = actual_existing_revision - new_revision_nonce; + if previous_revision_position_from_top > MISSING_IDENTITY_REVISIONS_MAX_BYTES { + // we are too far away from the actual revision + return SimpleConsensusValidationResult::new_with_error(ConsensusError::StateError( + StateError::InvalidIdentityNonceError(InvalidIdentityNonceError { + identity_id, + current_identity_nonce: Some(existing_nonce), + setting_identity_nonce: new_revision_nonce, + error: MergeIdentityNonceResult::NonceTooFarInPast, + }), + )); } else { - let byte_to_unset = 1 - << (previous_revision_position_from_top - 1 + let old_missing_revisions = existing_nonce & MISSING_IDENTITY_REVISIONS_FILTER; + let old_revision_already_set = if old_missing_revisions == 0 { + true + } else { + let byte_to_unset = 1 + << (previous_revision_position_from_top - 1 + IDENTITY_NONCE_VALUE_FILTER_MAX_BYTES); - old_missing_revisions | byte_to_unset != old_missing_revisions - }; + old_missing_revisions | byte_to_unset != old_missing_revisions + }; - if old_revision_already_set { - return SimpleConsensusValidationResult::new_with_error( - ConsensusError::StateError(StateError::InvalidIdentityNonceError( - InvalidIdentityNonceError { - identity_id, - current_identity_nonce: Some(existing_nonce), - setting_identity_nonce: new_revision_nonce, - error: MergeIdentityNonceResult::NonceAlreadyPresentInPast( - previous_revision_position_from_top, - ), - }, - )), - ); + if old_revision_already_set { + return SimpleConsensusValidationResult::new_with_error( + ConsensusError::StateError(StateError::InvalidIdentityNonceError( + InvalidIdentityNonceError { + identity_id, + current_identity_nonce: Some(existing_nonce), + setting_identity_nonce: new_revision_nonce, + error: MergeIdentityNonceResult::NonceAlreadyPresentInPast( + previous_revision_position_from_top, + ), + }, + )), + ); + } } } } diff --git a/packages/rs-dpp/src/identity/identity_public_key/key_type.rs b/packages/rs-dpp/src/identity/identity_public_key/key_type.rs index 37140f7176..b9eacd487f 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/key_type.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/key_type.rs @@ -1,11 +1,16 @@ +#[cfg(feature = "random-public-keys")] use crate::util::hash::ripemd160_sha256; use anyhow::bail; use bincode::{Decode, Encode}; #[cfg(feature = "cbor")] use ciborium::value::Value as CborValue; +#[cfg(feature = "random-public-keys")] use dashcore::secp256k1::rand::rngs::StdRng as EcdsaRng; +#[cfg(feature = "random-public-keys")] use dashcore::secp256k1::rand::SeedableRng; +#[cfg(feature = "random-public-keys")] use dashcore::secp256k1::Secp256k1; +#[cfg(feature = "random-public-keys")] use dashcore::Network; use itertools::Itertools; use lazy_static::lazy_static; @@ -19,7 +24,9 @@ use crate::fee::default_costs::KnownCostItem::{ use crate::fee::Credits; use crate::version::PlatformVersion; use crate::ProtocolError; +#[cfg(feature = "random-public-keys")] use rand::rngs::StdRng; +#[cfg(feature = "random-public-keys")] use rand::Rng; use serde_repr::{Deserialize_repr, Serialize_repr}; use std::collections::HashMap; diff --git a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs index 1288ed5225..7020604fb1 100644 --- a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs +++ b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs @@ -6,7 +6,9 @@ use dashcore::transaction::special_transaction::TransactionPayload; use dashcore::{InstantLock, OutPoint, Transaction, TxIn, TxOut}; use platform_value::{BinaryData, Value}; +#[cfg(feature = "validation")] use crate::identity::state_transition::asset_lock_proof::instant::methods; +#[cfg(feature = "validation")] use platform_version::version::PlatformVersion; use serde::de::Error as DeError; use serde::ser::Error as SerError; @@ -16,6 +18,7 @@ use crate::prelude::Identifier; #[cfg(feature = "cbor")] use crate::util::cbor_value::CborCanonicalMap; use crate::util::hash::hash_double; +#[cfg(feature = "validation")] use crate::validation::SimpleConsensusValidationResult; use crate::ProtocolError; diff --git a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/mod.rs b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/mod.rs index dd69e8e935..e5b45b3503 100644 --- a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/mod.rs +++ b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/mod.rs @@ -8,11 +8,13 @@ pub use bincode::{Decode, Encode}; pub use instant::*; use platform_value::Value; +#[cfg(feature = "validation")] use platform_version::version::PlatformVersion; use serde::de::Error; use crate::identity::state_transition::asset_lock_proof::chain::ChainAssetLockProof; use crate::prelude::Identifier; +#[cfg(feature = "validation")] use crate::validation::SimpleConsensusValidationResult; use crate::{ProtocolError, SerdeParsingError}; diff --git a/packages/rs-dpp/src/identity/v0/mod.rs b/packages/rs-dpp/src/identity/v0/mod.rs index 82180d7183..47bd892074 100644 --- a/packages/rs-dpp/src/identity/v0/mod.rs +++ b/packages/rs-dpp/src/identity/v0/mod.rs @@ -3,16 +3,22 @@ mod conversion; pub mod random; use std::collections::BTreeMap; +#[cfg(feature = "identity-value-conversion")] use std::convert::TryFrom; use std::hash::{Hash, Hasher}; +#[cfg(feature = "identity-value-conversion")] use platform_value::Value; +#[cfg(feature = "identity-serde-conversion")] use serde::{Deserialize, Serialize}; use crate::identity::{IdentityPublicKey, KeyID, PartialIdentity}; use crate::prelude::Revision; -use crate::{errors::ProtocolError, identifier::Identifier}; +#[cfg(feature = "identity-value-conversion")] +use crate::errors::ProtocolError; +use crate::identifier::Identifier; +#[cfg(feature = "identity-serialization")] use bincode::{Decode, Encode}; /// Implement the Identity. Identity is a low-level construct that provides the foundation @@ -24,6 +30,7 @@ use bincode::{Decode, Encode}; derive(Serialize, Deserialize), serde(rename_all = "camelCase") )] + pub struct IdentityV0 { pub id: Identifier, #[cfg_attr( diff --git a/packages/rs-dpp/src/state_transition/mod.rs b/packages/rs-dpp/src/state_transition/mod.rs index a94ba43e3a..012deee68a 100644 --- a/packages/rs-dpp/src/state_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/mod.rs @@ -1,4 +1,5 @@ use derive_more::From; +#[cfg(feature = "state-transition-serde-conversion")] use serde::{Deserialize, Serialize}; pub use abstract_state_transition::state_transition_helpers; @@ -7,18 +8,23 @@ use platform_value::{BinaryData, Identifier}; pub use state_transition_types::*; use bincode::{Decode, Encode}; +#[cfg(any(feature = "state-transition-signing", feature="state-transition-validation"))] use dashcore::signer; use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize, PlatformSignable}; mod abstract_state_transition; -use crate::{BlsModule, ProtocolError}; +#[cfg(any(feature = "state-transition-signing", feature="state-transition-validation"))] +use crate::BlsModule; +use crate::ProtocolError; mod state_transition_types; pub mod state_transition_factory; pub mod errors; -use crate::util::hash::{hash_double_to_vec, hash_single, ripemd160_sha256}; +#[cfg(feature = "state-transition-signing")] +use crate::util::hash::ripemd160_sha256; +use crate::util::hash::{hash_double_to_vec, hash_single}; pub mod proof_result; mod serialization; @@ -502,7 +508,7 @@ impl StateTransition { Ok(()) } - #[cfg(all(feature = "state-transition-validation"))] + #[cfg(feature = "state-transition-validation")] fn verify_by_raw_public_key( &self, public_key: &[u8], @@ -564,7 +570,7 @@ impl StateTransition { } } - #[cfg(all(feature = "state-transition-validation"))] + #[cfg(feature = "state-transition-validation")] fn verify_ecdsa_hash_160_signature_by_public_key_hash( &self, public_key_hash: &[u8], @@ -586,7 +592,7 @@ impl StateTransition { ) } - #[cfg(all(feature = "state-transition-validation"))] + #[cfg(feature = "state-transition-validation")] /// Verifies an ECDSA signature with the public key fn verify_ecdsa_signature_by_public_key(&self, public_key: &[u8]) -> Result<(), ProtocolError> { if self.signature().is_empty() { @@ -608,7 +614,7 @@ impl StateTransition { ) } - #[cfg(all(feature = "state-transition-validation"))] + #[cfg(feature = "state-transition-validation")] /// Verifies a BLS signature with the public key fn verify_bls_signature_by_public_key( &self, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/accessors/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/accessors/mod.rs index f25a78cd94..301bb1743e 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/accessors/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/accessors/mod.rs @@ -4,7 +4,6 @@ use crate::data_contract::serialized_version::DataContractInSerializationFormat; use crate::prelude::IdentityNonce; use crate::state_transition::data_contract_create_transition::DataContractCreateTransition; -use platform_value::Bytes32; pub use v0::*; impl DataContractCreateTransitionAccessorsV0 for DataContractCreateTransition { diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/mod.rs index bb2fb267bf..1ea016bdfa 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/mod.rs @@ -23,6 +23,7 @@ use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize, Plat use platform_version::{TryFromPlatformVersioned, TryIntoPlatformVersioned}; use platform_versioning::PlatformVersioned; +#[cfg(feature = "state-transition-serde-conversion")] use serde::{Deserialize, Serialize}; use crate::data_contract::created_data_contract::CreatedDataContract; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/mod.rs index 72bd31f8b7..973d127f17 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/mod.rs @@ -10,7 +10,8 @@ mod version; use platform_serialization_derive::PlatformSignable; -use platform_value::{BinaryData, Bytes32}; +use platform_value::BinaryData; +#[cfg(feature = "state-transition-serde-conversion")] use serde::{Deserialize, Serialize}; use crate::{data_contract::DataContract, identity::KeyID, ProtocolError}; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/v0_methods.rs index 7284f655fc..20eb5f00e9 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/v0_methods.rs @@ -1,8 +1,5 @@ use crate::state_transition::data_contract_create_transition::DataContractCreateTransitionV0; -use platform_value::Bytes32; -use tracing::info; - use crate::{data_contract::DataContract, identity::KeyID, NonConsensusError, ProtocolError}; use crate::serialization::Signable; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/mod.rs index a1b6314940..85b5a7317a 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/mod.rs @@ -6,6 +6,7 @@ use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize, Plat use platform_versioning::PlatformVersioned; +#[cfg(feature = "state-transition-serde-conversion")] use serde::{Deserialize, Serialize}; pub mod accessors; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/v0/mod.rs index 70e13309b9..51b74438c6 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/v0/mod.rs @@ -9,6 +9,7 @@ mod value_conversion; mod version; use platform_value::BinaryData; +#[cfg(feature = "state-transition-serde-conversion")] use serde::{Deserialize, Serialize}; use bincode::{Decode, Encode}; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/mod.rs index 71c8be9215..1896b971cf 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/mod.rs @@ -3,18 +3,23 @@ mod from_document; pub mod v0; mod v0_methods; +#[cfg(any(feature = "state-transition-value-conversion", feature = "state-transition-json-conversion"))] use crate::data_contract::DataContract; use crate::state_transition::documents_batch_transition::document_base_transition::v0::{ DocumentBaseTransitionV0, DocumentTransitionObjectLike, }; +#[cfg(any(feature = "state-transition-value-conversion", feature = "state-transition-json-conversion"))] use crate::ProtocolError; use bincode::{Decode, Encode}; use derive_more::{Display, From}; pub use fields::*; +#[cfg(any(feature = "state-transition-value-conversion", feature = "state-transition-json-conversion"))] use platform_value::Value; +#[cfg(feature = "state-transition-serde-conversion")] use serde::{Deserialize, Serialize}; #[cfg(feature = "state-transition-json-conversion")] use serde_json::Value as JsonValue; +#[cfg(feature = "state-transition-value-conversion")] use std::collections::BTreeMap; #[derive(Debug, Clone, Encode, Decode, PartialEq, Display, From)] diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/v0/mod.rs index 0ed9ca83d1..44af2f3ab0 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/v0/mod.rs @@ -1,20 +1,28 @@ pub mod from_document; pub mod v0_methods; +#[cfg(feature = "state-transition-value-conversion")] use std::collections::BTreeMap; use bincode::{Decode, Encode}; use derive_more::Display; +#[cfg(feature = "state-transition-value-conversion")] use platform_value::btreemap_extensions::BTreeValueRemoveFromMapHelper; +#[cfg(feature = "state-transition-value-conversion")] use platform_value::Value; +#[cfg(feature = "state-transition-serde-conversion")] use serde::{Deserialize, Serialize}; +#[cfg(feature = "state-transition-json-conversion")] use serde_json::Value as JsonValue; use crate::data_contract::accessors::v0::DataContractV0Getters; use crate::prelude::IdentityNonce; +#[cfg(feature = "state-transition-value-conversion")] use crate::state_transition::documents_batch_transition::document_base_transition::property_names; -use crate::{data_contract::DataContract, errors::ProtocolError, identifier::Identifier}; +#[cfg(any(feature = "state-transition-json-conversion", feature = "state-transition-value-conversion"))] +use crate::{data_contract::DataContract, errors::ProtocolError}; +use crate::identifier::Identifier; #[derive(Debug, Clone, Encode, Decode, Default, PartialEq, Display)] #[cfg_attr( diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/convertible.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/convertible.rs index 4a677bd9fe..f5cecbb8d5 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/convertible.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/convertible.rs @@ -1,21 +1,35 @@ +#[cfg(feature = "state-transition-json-conversion")] use crate::data_contract::accessors::v0::DataContractV0Getters; +#[cfg(feature = "state-transition-json-conversion")] use crate::data_contract::document_type::accessors::DocumentTypeV0Getters; -use crate::prelude::{DataContract, IdentityNonce}; +#[cfg(any(feature = "state-transition-json-conversion", feature = "state-transition-value-conversion"))] +use crate::prelude::DataContract; +#[cfg(feature = "state-transition-json-conversion")] use crate::state_transition::data_contract_update_transition::IDENTIFIER_FIELDS; use crate::state_transition::documents_batch_transition::document_base_transition::v0::DocumentTransitionObjectLike; +#[cfg(feature = "state-transition-json-conversion")] use crate::state_transition::documents_batch_transition::document_create_transition::v0::BINARY_FIELDS; -use crate::state_transition::documents_batch_transition::document_create_transition::{ - DocumentCreateTransition, DocumentCreateTransitionV0, -}; +use crate::state_transition::documents_batch_transition::document_create_transition::DocumentCreateTransition; +#[cfg(feature = "state-transition-value-conversion")] +use crate::state_transition::documents_batch_transition::document_create_transition::DocumentCreateTransitionV0; +#[cfg(feature = "state-transition-value-conversion")] use crate::state_transition::documents_batch_transition::fields::property_names::STATE_TRANSITION_PROTOCOL_VERSION; +#[cfg(any(feature = "state-transition-json-conversion", feature = "state-transition-value-conversion"))] use crate::ProtocolError; +#[cfg(any(feature = "state-transition-json-conversion", feature = "state-transition-value-conversion"))] use platform_value::btreemap_extensions::{ BTreeValueMapHelper, BTreeValueMapReplacementPathHelper, BTreeValueRemoveFromMapHelper, }; -use platform_value::{ReplacementType, Value}; +#[cfg(any(feature = "state-transition-json-conversion", feature = "state-transition-value-conversion"))] +use platform_value::Value; +#[cfg(feature = "state-transition-json-conversion")] +use platform_value::ReplacementType; +#[cfg(feature = "state-transition-json-conversion")] use serde_json::Value as JsonValue; +#[cfg(feature = "state-transition-value-conversion")] use std::collections::BTreeMap; +#[cfg(any(feature = "state-transition-json-conversion", feature = "state-transition-value-conversion"))] impl DocumentTransitionObjectLike for DocumentCreateTransition { #[cfg(feature = "state-transition-json-conversion")] fn from_json_object( diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/mod.rs index d0ccd53b8f..a270d11f17 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/mod.rs @@ -2,6 +2,7 @@ use std::collections::BTreeMap; use bincode::{Decode, Encode}; use derive_more::From; +#[cfg(feature = "state-transition-serde-conversion")] use serde::{Deserialize, Serialize}; use crate::prelude::{Identifier, IdentityNonce}; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/mod.rs index d3c905890c..046e6eee7b 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/mod.rs @@ -5,6 +5,7 @@ use std::convert::TryInto; use derive_more::From; use platform_value::Value; +#[cfg(feature = "state-transition-serde-conversion")] use serde::{Deserialize, Serialize}; use crate::ProtocolError; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/hash/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/hash/v0/mod.rs index 1892b3be62..269484a6bd 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/hash/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/hash/v0/mod.rs @@ -8,12 +8,6 @@ impl IdentityPublicKeyInCreation { /// Get the original public key hash pub(super) fn hash_v0(&self) -> Result<[u8; 20], ProtocolError> { Into::::into(self.clone()) - .hash()? - .try_into() - .map_err(|_| { - ProtocolError::CorruptedCodeExecution( - "hash should always output 20 bytes".to_string(), - ) - }) + .hash() } } From 3331c09706d03cbd017d78b702b9424b78a89de5 Mon Sep 17 00:00:00 2001 From: PastaPastaPasta <6443210+PastaPastaPasta@users.noreply.github.com> Date: Thu, 7 Mar 2024 01:44:15 -0600 Subject: [PATCH 062/191] refactor: resolve a few clippy warnings in rs-platform-serializaation and rs-platform-value (#1744) --- .../src/features/impl_alloc.rs | 3 +- packages/rs-platform-value/src/inner_value.rs | 2 +- .../src/inner_value_at_path.rs | 28 +++++++++++-------- .../src/value_serialization/de.rs | 2 +- .../src/value_serialization/ser.rs | 28 ++++++++++--------- 5 files changed, 34 insertions(+), 29 deletions(-) diff --git a/packages/rs-platform-serialization/src/features/impl_alloc.rs b/packages/rs-platform-serialization/src/features/impl_alloc.rs index 79eeb5b641..dea7ca64f6 100644 --- a/packages/rs-platform-serialization/src/features/impl_alloc.rs +++ b/packages/rs-platform-serialization/src/features/impl_alloc.rs @@ -335,8 +335,7 @@ where if core::any::TypeId::of::() == core::any::TypeId::of::() { decoder.claim_container_read::(len)?; // optimize for reading u8 vecs - let mut vec = Vec::new(); - vec.resize(len, 0u8); + let mut vec = vec![0u8; len]; decoder.reader().read(&mut vec)?; // Safety: Vec is Vec return Ok(unsafe { core::mem::transmute(vec) }); diff --git a/packages/rs-platform-value/src/inner_value.rs b/packages/rs-platform-value/src/inner_value.rs index 9d6dc182a9..570b50ae5e 100644 --- a/packages/rs-platform-value/src/inner_value.rs +++ b/packages/rs-platform-value/src/inner_value.rs @@ -79,7 +79,7 @@ impl Value { map.remove_key(key) } - pub fn remove_many(&mut self, keys: &Vec<&str>) -> Result<(), Error> { + pub fn remove_many(&mut self, keys: &[&str]) -> Result<(), Error> { let map = self.as_map_mut_ref()?; keys.iter() .try_for_each(|key| map.remove_key(key).map(|_| ())) diff --git a/packages/rs-platform-value/src/inner_value_at_path.rs b/packages/rs-platform-value/src/inner_value_at_path.rs index 885f76a491..3f7574d065 100644 --- a/packages/rs-platform-value/src/inner_value_at_path.rs +++ b/packages/rs-platform-value/src/inner_value_at_path.rs @@ -333,18 +333,22 @@ impl Value { )); }; // We are setting the value of just member of the array - if number_part < array.len() { - //this already exists - current_value = array.get_mut(number_part).unwrap() - } else if array.len() == number_part { - //we should create a new map - array.push(Value::Map(ValueMap::new())); - current_value = array.get_mut(number_part).unwrap(); - } else { - return Err(Error::StructureError( - "trying to insert into an array path higher than current array length" - .to_string(), - )); + match number_part.cmp(&array.len()) { + std::cmp::Ordering::Less => { + //this already exists + current_value = array.get_mut(number_part).unwrap(); + }, + std::cmp::Ordering::Equal => { + //we should create a new map + array.push(Value::Map(ValueMap::new())); + current_value = array.get_mut(number_part).unwrap(); + }, + std::cmp::Ordering::Greater => { + return Err(Error::StructureError( + "trying to insert into an array path higher than current array length" + .to_string(), + )); + } } } else { let map = current_value.to_map_mut()?; diff --git a/packages/rs-platform-value/src/value_serialization/de.rs b/packages/rs-platform-value/src/value_serialization/de.rs index 9971854a0f..2f064926bd 100644 --- a/packages/rs-platform-value/src/value_serialization/de.rs +++ b/packages/rs-platform-value/src/value_serialization/de.rs @@ -514,7 +514,7 @@ impl<'a, 'de> de::MapAccess<'de> for ValueMapDeserializer<'a> { } } -impl<'a, 'de> de::VariantAccess<'de> for Deserializer { +impl<'de> de::VariantAccess<'de> for Deserializer { type Error = Error; fn unit_variant(self) -> Result<(), Self::Error> { diff --git a/packages/rs-platform-value/src/value_serialization/ser.rs b/packages/rs-platform-value/src/value_serialization/ser.rs index 2a4dde959f..63d7238e1f 100644 --- a/packages/rs-platform-value/src/value_serialization/ser.rs +++ b/packages/rs-platform-value/src/value_serialization/ser.rs @@ -253,9 +253,11 @@ impl serde::Serializer for Serializer { where T: ?Sized + Serialize, { - let mut values = ValueMap::new(); - values.push((Value::Text(String::from(variant)), tri!(to_value(value)))); - Ok(Value::Map(values)) + Ok(Value::Map( + vec![ + (Value::Text(String::from(variant)), tri!(to_value(value))) + ] + )) } #[inline] @@ -445,11 +447,11 @@ impl serde::ser::SerializeTupleVariant for SerializeTupleVariant { } fn end(self) -> Result { - let mut object = Vec::new(); - - object.push((Value::Text(self.name), Value::Array(self.vec))); - - Ok(Value::Map(object)) + Ok(Value::Map( + vec![ + (Value::Text(self.name), Value::Array(self.vec)) + ] + )) } } @@ -712,10 +714,10 @@ impl serde::ser::SerializeStructVariant for SerializeStructVariant { } fn end(self) -> Result { - let mut object = Vec::new(); - - object.push((Value::Text(self.name), Value::Map(self.map))); - - Ok(Value::Map(object)) + Ok(Value::Map( + vec![ + (Value::Text(self.name), Value::Map(self.map)) + ] + )) } } From a3d9651b2728736358ccd82794ec63d72ce6dedb Mon Sep 17 00:00:00 2001 From: thephez Date: Thu, 7 Mar 2024 02:46:02 -0500 Subject: [PATCH 063/191] docs: update and expand mkdocs redirects (#1740) --- mkdocs.yml | 95 ++++++++++++++++++++++++++++++++---------------------- 1 file changed, 57 insertions(+), 38 deletions(-) diff --git a/mkdocs.yml b/mkdocs.yml index 64637fd664..eefb233fec 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -2,41 +2,60 @@ site_name: Dash Platform plugins: - redirects: redirect_maps: - 'SDK/README.md': 'https://dashplatform.readme.io/docs/dash-sdk-overview' - 'SDK/Overview.md': 'https://dashplatform.readme.io/docs/dash-sdk-overview' - 'SDK/examples/fetch-an-identity-from-its-name.md': 'https://dashplatform.readme.io/docs/dash-sdk-examples-fetch-an-identity-from-its-name' - 'SDK/examples/generate-a-new-mnemonic.md': 'https://dashplatform.readme.io/docs/dash-sdk-examples-generate-a-new-mnemonic' - 'SDK/examples/pay-to-another-address.md': 'https://dashplatform.readme.io/docs/dash-sdk-examples-paying-to-another-address' - 'SDK/examples/receive-money-and-check-balance.md': 'https://dashplatform.readme.io/docs/dash-sdk-examples-receive-money-and-check-balance' - 'SDK/examples/sign-and-verify-messages.md': 'https://dashplatform.readme.io/docs/dash-sdk-examples-sign-and-verify-messages' - 'SDK/examples/use-different-account.md': 'https://dashplatform.readme.io/docs/dash-sdk-examples-use-different-account' - 'SDK/getting-started/about-schemas.md': 'https://dashplatform.readme.io/docs/dash-sdk-getting-started-about-schemas' - 'SDK/getting-started/core-concepts.md': 'https://dashplatform.readme.io/docs/dash-sdk-getting-started-core-concepts' - 'SDK/getting-started/dash-platform-applications.md': 'https://dashplatform.readme.io/docs/dash-sdk-getting-started-dash-platform-applications' - 'SDK/getting-started/multiple-apps.md': 'https://dashplatform.readme.io/docs/dash-sdk-getting-started-working-with-multiple-apps' - 'SDK/getting-started/quickstart.md': 'https://dashplatform.readme.io/docs/dash-sdk-getting-started-quick-start' - 'SDK/getting-started/with-typescript.md': 'https://dashplatform.readme.io/docs/dash-sdk-getting-started-with-typescript' - 'SDK/platform/about-platform.md': 'https://dashplatform.readme.io/docs/dash-sdk-platform' - 'SDK/platform/contracts/about-contracts.md': 'https://dashplatform.readme.io/docs/dash-sdk-contracts' - 'SDK/platform/contracts/create.md': 'https://dashplatform.readme.io/docs/dash-sdk-contracts-create' - 'SDK/platform/contracts/get.md': 'https://dashplatform.readme.io/docs/dash-sdk-contracts-get' - 'SDK/platform/contracts/publish.md': 'https://dashplatform.readme.io/docs/dash-sdk-contracts-publish' - 'SDK/platform/contracts/update.md': 'https://dashplatform.readme.io/docs/dash-sdk-contracts-update' - 'SDK/platform/documents/about-documents.md': 'https://dashplatform.readme.io/docs/dash-sdk-documents' - 'SDK/platform/documents/broadcast.md': 'https://dashplatform.readme.io/docs/dash-sdk-documents-broadcast' - 'SDK/platform/documents/create.md': 'https://dashplatform.readme.io/docs/dash-sdk-documents-create' - 'SDK/platform/documents/get.md': 'https://dashplatform.readme.io/docs/dash-sdk-documents-get' - 'SDK/platform/identities/about-identity.md': 'https://dashplatform.readme.io/docs/dash-sdk-identities' - 'SDK/platform/identities/get.md': 'https://dashplatform.readme.io/docs/dash-sdk-identities-get' - 'SDK/platform/identities/register.md': 'https://dashplatform.readme.io/docs/dash-sdk-identities-register' - 'SDK/platform/identities/topUp.md': 'https://dashplatform.readme.io/docs/dash-sdk-identities-topup' - 'SDK/platform/names/about-dpns.md': 'https://dashplatform.readme.io/docs/dash-sdk-names' - 'SDK/platform/names/register.md': 'https://dashplatform.readme.io/docs/dash-sdk-names-register' - 'SDK/platform/names/resolve.md': 'https://dashplatform.readme.io/docs/dash-sdk-names-resolve' - 'SDK/platform/names/resolveByRecord.md': 'https://dashplatform.readme.io/docs/dash-sdk-names-resolvebyrecord' - 'SDK/platform/names/search.md': 'https://dashplatform.readme.io/docs/dash-sdk-names-search' - 'SDK/usage/dapi.md': 'https://dashplatform.readme.io/docs/dash-sdk-usage-dapi' - 'SDK/usage/dashcorelib-primitives.md': 'https://dashplatform.readme.io/docs/dash-sdk-usage-dashcore-lib-primitives' - 'SDK/wallet/about-wallet-lib.md': 'https://dashplatform.readme.io/docs/dash-sdk-wallet' - 'SDK/wallet/accounts.md': 'https://dashplatform.readme.io/docs/dash-sdk-wallet-accounts' - 'SDK/wallet/signing-encrypt.md': 'https://dashplatform.readme.io/docs/dash-sdk-wallet-signing-encrypt' + 'SDK/README.md': 'https://docs.dash.org/projects/platform/en/stable/docs/sdk-js/overview.html' + 'SDK/Overview.md': 'https://docs.dash.org/projects/platform/en/stable/docs/sdk-js/overview.html' + 'SDK/examples/fetch-an-identity-from-its-name.md': 'https://docs.dash.org/projects/platform/en/stable/docs/sdk-js/examples/fetch-an-identity-from-its-name.html' + 'SDK/examples/generate-a-new-mnemonic.md': 'https://docs.dash.org/projects/platform/en/stable/docs/sdk-js/examples/generate-a-new-mnemonic.html' + 'SDK/examples/pay-to-another-address.md': 'https://docs.dash.org/projects/platform/en/stable/docs/sdk-js/examples/paying-to-another-address.html' + 'SDK/examples/receive-money-and-check-balance.md': 'https://docs.dash.org/projects/platform/en/stable/docs/sdk-js/examples/receive-money-and-check-balance.html' + 'SDK/examples/sign-and-verify-messages.md': 'https://docs.dash.org/projects/platform/en/stable/docs/sdk-js/examples/sign-and-verify-messages.html' + 'SDK/examples/use-different-account.md': 'https://docs.dash.org/projects/platform/en/stable/docs/sdk-js/examples/use-different-account.html' + 'SDK/getting-started/about-schemas.md': 'https://docs.dash.org/projects/platform/en/stable/docs/sdk-js/getting-started/about-schemas.html' + 'SDK/getting-started/core-concepts.md': 'https://docs.dash.org/projects/platform/en/stable/docs/sdk-js/getting-started/core-concepts.html' + 'SDK/getting-started/dash-platform-applications.md': 'https://docs.dash.org/projects/platform/en/stable/docs/sdk-js/getting-started/dash-platform-applications.html' + 'SDK/getting-started/multiple-apps.md': 'https://docs.dash.org/projects/platform/en/stable/docs/sdk-js/getting-started/working-with-multiple-apps.html' + 'SDK/getting-started/quickstart.md': 'https://docs.dash.org/projects/platform/en/stable/docs/sdk-js/getting-started/quick-start.html' + 'SDK/getting-started/with-typescript.md': 'https://docs.dash.org/projects/platform/en/stable/docs/sdk-js/getting-started/with-typescript.html' + 'SDK/platform/about-platform.md': 'https://docs.dash.org/projects/platform/en/stable/docs/sdk-js/platform/platform.html' + 'SDK/platform/contracts/about-contracts.md': 'https://docs.dash.org/projects/platform/en/stable/docs/sdk-js/platform/contracts/contracts.html' + 'SDK/platform/contracts/create.md': 'https://docs.dash.org/projects/platform/en/stable/docs/sdk-js/platform/contracts/create.html' + 'SDK/platform/contracts/get.md': 'https://docs.dash.org/projects/platform/en/stable/docs/sdk-js/platform/contracts/get.html' + 'SDK/platform/contracts/publish.md': 'https://docs.dash.org/projects/platform/en/stable/docs/sdk-js/platform/contracts/publish.html' + 'SDK/platform/contracts/update.md': 'https://docs.dash.org/projects/platform/en/stable/docs/sdk-js/platform/contracts/update.html' + 'SDK/platform/documents/about-documents.md': 'https://docs.dash.org/projects/platform/en/stable/docs/sdk-js/platform/documents/documents.html' + 'SDK/platform/documents/broadcast.md': 'https://docs.dash.org/projects/platform/en/stable/docs/sdk-js/platform/documents/broadcast.html' + 'SDK/platform/documents/create.md': 'https://docs.dash.org/projects/platform/en/stable/docs/sdk-js/platform/documents/create.html' + 'SDK/platform/documents/get.md': 'https://docs.dash.org/projects/platform/en/stable/docs/sdk-js/platform/documents/get.html' + 'SDK/platform/identities/about-identity.md': 'https://docs.dash.org/projects/platform/en/stable/docs/sdk-js/platform/identities/identities.html' + 'SDK/platform/identities/get.md': 'https://docs.dash.org/projects/platform/en/stable/docs/sdk-js/platform/identities/get.html' + 'SDK/platform/identities/register.md': 'https://docs.dash.org/projects/platform/en/stable/docs/sdk-js/platform/identities/register.html' + 'SDK/platform/identities/topUp.md': 'https://docs.dash.org/projects/platform/en/stable/docs/sdk-js/platform/identities/register.html' + 'SDK/platform/names/about-dpns.md': 'https://docs.dash.org/projects/platform/en/stable/docs/sdk-js/platform/names/names.html' + 'SDK/platform/names/register.md': 'https://docs.dash.org/projects/platform/en/stable/docs/sdk-js/platform/names/register.html' + 'SDK/platform/names/resolve.md': 'https://docs.dash.org/projects/platform/en/stable/docs/sdk-js/platform/names/resolve.html' + 'SDK/platform/names/resolveByRecord.md': 'https://docs.dash.org/projects/platform/en/stable/docs/sdk-js/platform/names/resolvebyrecord.html' + 'SDK/platform/names/search.md': 'https://docs.dash.org/projects/platform/en/stable/docs/sdk-js/platform/names/search.html' + 'SDK/usage/dapi.md': 'https://docs.dash.org/projects/platform/en/stable/docs/sdk-js/usage/dapi.html#' + 'SDK/usage/dashcorelib-primitives.md': 'https://docs.dash.org/projects/platform/en/stable/docs/sdk-js/usage/dashcore-lib-primitives.html' + 'SDK/wallet/about-wallet-lib.md': 'https://docs.dash.org/projects/platform/en/stable/docs/sdk-js/wallet/wallet.html' + 'SDK/wallet/accounts.md': 'https://docs.dash.org/projects/platform/en/stable/docs/sdk-js/wallet/accounts.html' + 'SDK/wallet/signing-encrypt.md': 'https://docs.dash.org/projects/platform/en/stable/docs/sdk-js/wallet/signing-encrypt.html' + 'DAPI-Client/README.md': 'https://docs.dash.org/projects/platform/en/stable/docs/dapi-client-js/overview.html' + 'DAPI-Client/getting-started/quickstart.md': 'https://docs.dash.org/projects/platform/en/stable/docs/dapi-client-js/quick-start.html' + 'DAPI-Client/usage/application/DAPIClient.md': 'https://docs.dash.org/projects/platform/en/stable/docs/dapi-client-js/usage/dapiclient.html' + 'DAPI-Client/usage/application/core/broadcastTransaction.md': 'https://docs.dash.org/projects/platform/en/stable/docs/dapi-client-js/usage/core/broadcasttransaction.html' + 'DAPI-Client/usage/application/core/generateToAddress.md': 'https://docs.dash.org/projects/platform/en/stable/docs/dapi-client-js/usage/core/generatetoaddress.html' + 'DAPI-Client/usage/application/core/getBestBlockHash.md': 'https://docs.dash.org/projects/platform/en/stable/docs/dapi-client-js/usage/core/getbestblockhash.html' + 'DAPI-Client/usage/application/core/getBlockByHash.md': 'https://docs.dash.org/projects/platform/en/stable/docs/dapi-client-js/usage/core/getblockbyhash.html' + 'DAPI-Client/usage/application/core/getBlockByHeight.md': 'https://docs.dash.org/projects/platform/en/stable/docs/dapi-client-js/usage/core/getblockbyheight.html' + 'DAPI-Client/usage/application/core/getBlockHash.md': 'https://docs.dash.org/projects/platform/en/stable/docs/dapi-client-js/usage/core/getblockhash.html' + 'DAPI-Client/usage/application/core/getMnListDiff.md': 'https://docs.dash.org/projects/platform/en/stable/docs/dapi-client-js/usage/core/getmnlistdiff.html' + 'DAPI-Client/usage/application/core/getStatus.md': 'https://docs.dash.org/projects/platform/en/stable/docs/dapi-client-js/usage/core/getstatus.html' + 'DAPI-Client/usage/application/core/getTransaction.md': 'https://docs.dash.org/projects/platform/en/stable/docs/dapi-client-js/usage/core/gettransaction.html' + 'DAPI-Client/usage/utils/subscribeToTransactionsWithProofs.md': 'https://docs.dash.org/projects/platform/en/stable/docs/dapi-client-js/usage/core/subscribetotransactionswithproofs.html' + 'DAPI-Client/usage/application/platform/broadcastStateTransition.md': 'https://docs.dash.org/projects/platform/en/stable/docs/dapi-client-js/usage/platform/broadcaststatetransition.html' + 'DAPI-Client/usage/application/getDataContract.md': 'https://docs.dash.org/projects/platform/en/stable/docs/dapi-client-js/usage/platform/getdatacontract.html' + 'DAPI-Client/usage/application/getDocuments.md': 'https://docs.dash.org/projects/platform/en/stable/docs/dapi-client-js/usage/platform/getdocuments.html' + 'DAPI-Client/usage/application/getIdentity.md': 'https://docs.dash.org/projects/platform/en/stable/docs/dapi-client-js/usage/platform/getidentity.html' + 'DAPI-Client/usage/application/getIdentityByFirstPublicKey.md': 'https://docs.dash.org/projects/platform/en/stable/docs/dapi-client-js/usage/platform/getidentitybyfirstpublickey.html' + 'DAPI-Client/usage/application/getIdentityIdByFirstPublicKey.md': 'https://docs.dash.org/projects/platform/en/stable/docs/dapi-client-js/usage/platform/getidentityidbyfirstpublickey.html' From d65761a4ede54eb200e75789cb5924f5741489c2 Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Fri, 8 Mar 2024 05:32:48 +0700 Subject: [PATCH 064/191] chore: fmt (#1751) --- .../class_methods/try_from_schema/v0/mod.rs | 20 ++++---- .../src/document/extended_document/mod.rs | 5 +- .../src/document/extended_document/v0/mod.rs | 9 ++-- .../rs-dpp/src/identity/identity_factory.rs | 2 +- .../rs-dpp/src/identity/identity_nonce.rs | 41 ++++++++------- packages/rs-dpp/src/state_transition/mod.rs | 10 +++- .../document_base_transition/mod.rs | 15 ++++-- .../document_base_transition/v0/mod.rs | 7 ++- .../document_create_transition/convertible.rs | 27 +++++++--- .../methods/hash/v0/mod.rs | 3 +- .../fetch_identity_contract_nonce/v0/mod.rs | 2 +- .../merge_identity_contract_nonce/v0/mod.rs | 5 +- .../src/drive/identity/fetch/queries/mod.rs | 4 +- .../src/inner_value_at_path.rs | 4 +- .../src/value_serialization/ser.rs | 27 +++++----- packages/strategy-tests/src/lib.rs | 50 ++++++++++++------- 16 files changed, 141 insertions(+), 90 deletions(-) diff --git a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs index 12cd06737f..829be3233e 100644 --- a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs @@ -1,19 +1,11 @@ -use crate::data_contract::document_type::v0::DocumentTypeV0; -#[cfg(feature = "validation")] -use crate::data_contract::document_type::v0::StatelessJsonSchemaLazyValidator; -#[cfg(feature = "validation")] -use crate::consensus::ConsensusError; -use indexmap::IndexMap; -use std::collections::{BTreeMap, BTreeSet}; -#[cfg(feature = "validation")] -use std::collections::HashSet; -use std::convert::TryInto; #[cfg(feature = "validation")] use crate::consensus::basic::data_contract::{ DuplicateIndexNameError, InvalidIndexPropertyTypeError, InvalidIndexedPropertyConstraintError, SystemPropertyIndexAlreadyPresentError, UndefinedIndexPropertyError, UniqueIndicesLimitReachedError, }; +#[cfg(feature = "validation")] +use crate::consensus::ConsensusError; use crate::data_contract::document_type::array::ArrayItemType; use crate::data_contract::document_type::index::Index; use crate::data_contract::document_type::index_level::IndexLevel; @@ -23,6 +15,14 @@ use crate::data_contract::document_type::schema::{ byte_array_has_no_items_as_parent_validator, pattern_is_valid_regex_validator, traversal_validator, validate_max_depth, }; +use crate::data_contract::document_type::v0::DocumentTypeV0; +#[cfg(feature = "validation")] +use crate::data_contract::document_type::v0::StatelessJsonSchemaLazyValidator; +use indexmap::IndexMap; +#[cfg(feature = "validation")] +use std::collections::HashSet; +use std::collections::{BTreeMap, BTreeSet}; +use std::convert::TryInto; #[cfg(feature = "validation")] use crate::consensus::basic::document::MissingPositionsInDocumentTypePropertiesError; diff --git a/packages/rs-dpp/src/document/extended_document/mod.rs b/packages/rs-dpp/src/document/extended_document/mod.rs index c7bdcb43dd..582ff3d32a 100644 --- a/packages/rs-dpp/src/document/extended_document/mod.rs +++ b/packages/rs-dpp/src/document/extended_document/mod.rs @@ -7,7 +7,10 @@ pub(crate) mod v0; pub use fields::{property_names, IDENTIFIER_FIELDS}; -#[cfg(any(feature = "document-json-conversion", feature = "document-value-conversion"))] +#[cfg(any( + feature = "document-json-conversion", + feature = "document-value-conversion" +))] use crate::data_contract::DataContract; use crate::ProtocolError; diff --git a/packages/rs-dpp/src/document/extended_document/v0/mod.rs b/packages/rs-dpp/src/document/extended_document/v0/mod.rs index 663f647441..76a0490cdf 100644 --- a/packages/rs-dpp/src/document/extended_document/v0/mod.rs +++ b/packages/rs-dpp/src/document/extended_document/v0/mod.rs @@ -6,7 +6,10 @@ mod serialize; use crate::data_contract::document_type::DocumentTypeRef; use crate::data_contract::DataContract; -#[cfg(any(feature = "document-value-conversion", feature = "document-json-conversion"))] +#[cfg(any( + feature = "document-value-conversion", + feature = "document-json-conversion" +))] use crate::document::extended_document::fields::property_names; use crate::document::{Document, DocumentV0Getters, ExtendedDocument}; use crate::identity::TimestampMillis; @@ -38,11 +41,11 @@ use crate::document::serialization_traits::DocumentPlatformValueMethodsV0; use crate::document::serialization_traits::ExtendedDocumentPlatformConversionMethodsV0; #[cfg(feature = "validation")] use crate::validation::SimpleConsensusValidationResult; +#[cfg(feature = "document-json-conversion")] +use platform_value::converter::serde_json::BTreeValueJsonConverter; use platform_version::version::PlatformVersion; #[cfg(feature = "document-json-conversion")] use serde_json::Value as JsonValue; -#[cfg(feature = "document-json-conversion")] -use platform_value::converter::serde_json::BTreeValueJsonConverter; /// The `ExtendedDocumentV0` struct represents the data provided by the platform in response to a query. #[derive(Debug, Clone)] diff --git a/packages/rs-dpp/src/identity/identity_factory.rs b/packages/rs-dpp/src/identity/identity_factory.rs index 7078f76b1b..11e29ce6fd 100644 --- a/packages/rs-dpp/src/identity/identity_factory.rs +++ b/packages/rs-dpp/src/identity/identity_factory.rs @@ -29,7 +29,7 @@ use crate::identity::conversion::platform_value::IdentityPlatformValueConversion #[cfg(all(feature = "state-transitions", feature = "client"))] use crate::identity::core_script::CoreScript; #[cfg(all(feature = "state-transitions", feature = "client"))] -use crate::prelude::{IdentityNonce}; +use crate::prelude::IdentityNonce; #[cfg(all(feature = "identity-serialization", feature = "client"))] use crate::serialization::PlatformDeserializable; #[cfg(all(feature = "state-transitions", feature = "client"))] diff --git a/packages/rs-dpp/src/identity/identity_nonce.rs b/packages/rs-dpp/src/identity/identity_nonce.rs index 6072728aa6..fd98642a97 100644 --- a/packages/rs-dpp/src/identity/identity_nonce.rs +++ b/packages/rs-dpp/src/identity/identity_nonce.rs @@ -103,30 +103,35 @@ pub fn validate_identity_nonce_update( )); } std::cmp::Ordering::Less => { - if new_revision_nonce - actual_existing_revision > MISSING_IDENTITY_REVISIONS_MAX_BYTES { + if new_revision_nonce - actual_existing_revision > MISSING_IDENTITY_REVISIONS_MAX_BYTES + { // we are too far away from the actual revision - return SimpleConsensusValidationResult::new_with_error(ConsensusError::StateError( - StateError::InvalidIdentityNonceError(InvalidIdentityNonceError { - identity_id, - current_identity_nonce: Some(existing_nonce), - setting_identity_nonce: new_revision_nonce, - error: MergeIdentityNonceResult::NonceTooFarInFuture, - }), - )); + return SimpleConsensusValidationResult::new_with_error( + ConsensusError::StateError(StateError::InvalidIdentityNonceError( + InvalidIdentityNonceError { + identity_id, + current_identity_nonce: Some(existing_nonce), + setting_identity_nonce: new_revision_nonce, + error: MergeIdentityNonceResult::NonceTooFarInFuture, + }, + )), + ); } } std::cmp::Ordering::Greater => { let previous_revision_position_from_top = actual_existing_revision - new_revision_nonce; if previous_revision_position_from_top > MISSING_IDENTITY_REVISIONS_MAX_BYTES { // we are too far away from the actual revision - return SimpleConsensusValidationResult::new_with_error(ConsensusError::StateError( - StateError::InvalidIdentityNonceError(InvalidIdentityNonceError { - identity_id, - current_identity_nonce: Some(existing_nonce), - setting_identity_nonce: new_revision_nonce, - error: MergeIdentityNonceResult::NonceTooFarInPast, - }), - )); + return SimpleConsensusValidationResult::new_with_error( + ConsensusError::StateError(StateError::InvalidIdentityNonceError( + InvalidIdentityNonceError { + identity_id, + current_identity_nonce: Some(existing_nonce), + setting_identity_nonce: new_revision_nonce, + error: MergeIdentityNonceResult::NonceTooFarInPast, + }, + )), + ); } else { let old_missing_revisions = existing_nonce & MISSING_IDENTITY_REVISIONS_FILTER; let old_revision_already_set = if old_missing_revisions == 0 { @@ -134,7 +139,7 @@ pub fn validate_identity_nonce_update( } else { let byte_to_unset = 1 << (previous_revision_position_from_top - 1 - + IDENTITY_NONCE_VALUE_FILTER_MAX_BYTES); + + IDENTITY_NONCE_VALUE_FILTER_MAX_BYTES); old_missing_revisions | byte_to_unset != old_missing_revisions }; diff --git a/packages/rs-dpp/src/state_transition/mod.rs b/packages/rs-dpp/src/state_transition/mod.rs index 012deee68a..340ec4146b 100644 --- a/packages/rs-dpp/src/state_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/mod.rs @@ -8,12 +8,18 @@ use platform_value::{BinaryData, Identifier}; pub use state_transition_types::*; use bincode::{Decode, Encode}; -#[cfg(any(feature = "state-transition-signing", feature="state-transition-validation"))] +#[cfg(any( + feature = "state-transition-signing", + feature = "state-transition-validation" +))] use dashcore::signer; use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize, PlatformSignable}; mod abstract_state_transition; -#[cfg(any(feature = "state-transition-signing", feature="state-transition-validation"))] +#[cfg(any( + feature = "state-transition-signing", + feature = "state-transition-validation" +))] use crate::BlsModule; use crate::ProtocolError; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/mod.rs index 1896b971cf..25dd569fb3 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/mod.rs @@ -3,17 +3,26 @@ mod from_document; pub mod v0; mod v0_methods; -#[cfg(any(feature = "state-transition-value-conversion", feature = "state-transition-json-conversion"))] +#[cfg(any( + feature = "state-transition-value-conversion", + feature = "state-transition-json-conversion" +))] use crate::data_contract::DataContract; use crate::state_transition::documents_batch_transition::document_base_transition::v0::{ DocumentBaseTransitionV0, DocumentTransitionObjectLike, }; -#[cfg(any(feature = "state-transition-value-conversion", feature = "state-transition-json-conversion"))] +#[cfg(any( + feature = "state-transition-value-conversion", + feature = "state-transition-json-conversion" +))] use crate::ProtocolError; use bincode::{Decode, Encode}; use derive_more::{Display, From}; pub use fields::*; -#[cfg(any(feature = "state-transition-value-conversion", feature = "state-transition-json-conversion"))] +#[cfg(any( + feature = "state-transition-value-conversion", + feature = "state-transition-json-conversion" +))] use platform_value::Value; #[cfg(feature = "state-transition-serde-conversion")] use serde::{Deserialize, Serialize}; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/v0/mod.rs index 44af2f3ab0..b72265f8f2 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/v0/mod.rs @@ -17,12 +17,15 @@ use serde::{Deserialize, Serialize}; use serde_json::Value as JsonValue; use crate::data_contract::accessors::v0::DataContractV0Getters; +use crate::identifier::Identifier; use crate::prelude::IdentityNonce; #[cfg(feature = "state-transition-value-conversion")] use crate::state_transition::documents_batch_transition::document_base_transition::property_names; -#[cfg(any(feature = "state-transition-json-conversion", feature = "state-transition-value-conversion"))] +#[cfg(any( + feature = "state-transition-json-conversion", + feature = "state-transition-value-conversion" +))] use crate::{data_contract::DataContract, errors::ProtocolError}; -use crate::identifier::Identifier; #[derive(Debug, Clone, Encode, Decode, Default, PartialEq, Display)] #[cfg_attr( diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/convertible.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/convertible.rs index f5cecbb8d5..727c65822f 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/convertible.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/convertible.rs @@ -2,7 +2,10 @@ use crate::data_contract::accessors::v0::DataContractV0Getters; #[cfg(feature = "state-transition-json-conversion")] use crate::data_contract::document_type::accessors::DocumentTypeV0Getters; -#[cfg(any(feature = "state-transition-json-conversion", feature = "state-transition-value-conversion"))] +#[cfg(any( + feature = "state-transition-json-conversion", + feature = "state-transition-value-conversion" +))] use crate::prelude::DataContract; #[cfg(feature = "state-transition-json-conversion")] use crate::state_transition::data_contract_update_transition::IDENTIFIER_FIELDS; @@ -14,22 +17,34 @@ use crate::state_transition::documents_batch_transition::document_create_transit use crate::state_transition::documents_batch_transition::document_create_transition::DocumentCreateTransitionV0; #[cfg(feature = "state-transition-value-conversion")] use crate::state_transition::documents_batch_transition::fields::property_names::STATE_TRANSITION_PROTOCOL_VERSION; -#[cfg(any(feature = "state-transition-json-conversion", feature = "state-transition-value-conversion"))] +#[cfg(any( + feature = "state-transition-json-conversion", + feature = "state-transition-value-conversion" +))] use crate::ProtocolError; -#[cfg(any(feature = "state-transition-json-conversion", feature = "state-transition-value-conversion"))] +#[cfg(any( + feature = "state-transition-json-conversion", + feature = "state-transition-value-conversion" +))] use platform_value::btreemap_extensions::{ BTreeValueMapHelper, BTreeValueMapReplacementPathHelper, BTreeValueRemoveFromMapHelper, }; -#[cfg(any(feature = "state-transition-json-conversion", feature = "state-transition-value-conversion"))] -use platform_value::Value; #[cfg(feature = "state-transition-json-conversion")] use platform_value::ReplacementType; +#[cfg(any( + feature = "state-transition-json-conversion", + feature = "state-transition-value-conversion" +))] +use platform_value::Value; #[cfg(feature = "state-transition-json-conversion")] use serde_json::Value as JsonValue; #[cfg(feature = "state-transition-value-conversion")] use std::collections::BTreeMap; -#[cfg(any(feature = "state-transition-json-conversion", feature = "state-transition-value-conversion"))] +#[cfg(any( + feature = "state-transition-json-conversion", + feature = "state-transition-value-conversion" +))] impl DocumentTransitionObjectLike for DocumentCreateTransition { #[cfg(feature = "state-transition-json-conversion")] fn from_json_object( diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/hash/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/hash/v0/mod.rs index 269484a6bd..c8545cc203 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/hash/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/hash/v0/mod.rs @@ -7,7 +7,6 @@ use std::convert::TryInto; impl IdentityPublicKeyInCreation { /// Get the original public key hash pub(super) fn hash_v0(&self) -> Result<[u8; 20], ProtocolError> { - Into::::into(self.clone()) - .hash() + Into::::into(self.clone()).hash() } } diff --git a/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/fetch_identity_contract_nonce/v0/mod.rs b/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/fetch_identity_contract_nonce/v0/mod.rs index 1a6b646549..a1e0ca636a 100644 --- a/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/fetch_identity_contract_nonce/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/fetch_identity_contract_nonce/v0/mod.rs @@ -7,7 +7,7 @@ use crate::error::Error; use crate::fee::op::LowLevelDriveOperation; use dpp::block::block_info::BlockInfo; use dpp::fee::fee_result::FeeResult; -use dpp::prelude::{IdentityNonce}; +use dpp::prelude::IdentityNonce; use crate::drive::identity::contract_info::ContractInfoStructure::IdentityContractNonceKey; use dpp::version::PlatformVersion; diff --git a/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/merge_identity_contract_nonce/v0/mod.rs b/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/merge_identity_contract_nonce/v0/mod.rs index f54bd0e539..dd201da45e 100644 --- a/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/merge_identity_contract_nonce/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/merge_identity_contract_nonce/v0/mod.rs @@ -1,7 +1,9 @@ use crate::drive::grove_operations::BatchInsertTreeApplyType; use crate::drive::identity::contract_info::ContractInfoStructure::IdentityContractNonceKey; use crate::drive::identity::IdentityRootStructure::IdentityContractInfo; -use crate::drive::identity::{identity_contract_info_group_path, identity_contract_info_root_path_vec, identity_path_vec}; +use crate::drive::identity::{ + identity_contract_info_group_path, identity_contract_info_root_path_vec, identity_path_vec, +}; use crate::drive::object_size_info::{PathKeyElementInfo, PathKeyInfo}; use crate::drive::Drive; use crate::error::Error; @@ -18,7 +20,6 @@ use dpp::prelude::IdentityNonce; use crate::drive::identity::contract_info::identity_contract_nonce::merge_identity_contract_nonce::MergeIdentityNonceResult; use crate::drive::identity::contract_info::identity_contract_nonce::merge_identity_contract_nonce::MergeIdentityNonceResult::{MergeIdentityNonceSuccess, NonceAlreadyPresentAtTip, NonceAlreadyPresentInPast, NonceTooFarInFuture, NonceTooFarInPast}; - impl Drive { pub(in crate::drive::identity::contract_info) fn merge_identity_contract_nonce_v0( &self, diff --git a/packages/rs-drive/src/drive/identity/fetch/queries/mod.rs b/packages/rs-drive/src/drive/identity/fetch/queries/mod.rs index 0d474ab05c..d4120d07ce 100644 --- a/packages/rs-drive/src/drive/identity/fetch/queries/mod.rs +++ b/packages/rs-drive/src/drive/identity/fetch/queries/mod.rs @@ -6,9 +6,7 @@ use crate::error::Error; use crate::drive::identity::contract_info::ContractInfoStructure::IdentityContractNonceKey; use crate::drive::identity::IdentityRootStructure::{IdentityTreeNonce, IdentityTreeRevision}; -use crate::drive::identity::{ - identity_contract_info_group_path_vec, identity_path_vec, -}; +use crate::drive::identity::{identity_contract_info_group_path_vec, identity_path_vec}; use crate::error::query::QuerySyntaxError; use grovedb::{PathQuery, Query, SizedQuery}; diff --git a/packages/rs-platform-value/src/inner_value_at_path.rs b/packages/rs-platform-value/src/inner_value_at_path.rs index 3f7574d065..d98dc7cc6b 100644 --- a/packages/rs-platform-value/src/inner_value_at_path.rs +++ b/packages/rs-platform-value/src/inner_value_at_path.rs @@ -337,12 +337,12 @@ impl Value { std::cmp::Ordering::Less => { //this already exists current_value = array.get_mut(number_part).unwrap(); - }, + } std::cmp::Ordering::Equal => { //we should create a new map array.push(Value::Map(ValueMap::new())); current_value = array.get_mut(number_part).unwrap(); - }, + } std::cmp::Ordering::Greater => { return Err(Error::StructureError( "trying to insert into an array path higher than current array length" diff --git a/packages/rs-platform-value/src/value_serialization/ser.rs b/packages/rs-platform-value/src/value_serialization/ser.rs index 63d7238e1f..00d022223c 100644 --- a/packages/rs-platform-value/src/value_serialization/ser.rs +++ b/packages/rs-platform-value/src/value_serialization/ser.rs @@ -253,11 +253,10 @@ impl serde::Serializer for Serializer { where T: ?Sized + Serialize, { - Ok(Value::Map( - vec![ - (Value::Text(String::from(variant)), tri!(to_value(value))) - ] - )) + Ok(Value::Map(vec![( + Value::Text(String::from(variant)), + tri!(to_value(value)), + )])) } #[inline] @@ -447,11 +446,10 @@ impl serde::ser::SerializeTupleVariant for SerializeTupleVariant { } fn end(self) -> Result { - Ok(Value::Map( - vec![ - (Value::Text(self.name), Value::Array(self.vec)) - ] - )) + Ok(Value::Map(vec![( + Value::Text(self.name), + Value::Array(self.vec), + )])) } } @@ -714,10 +712,9 @@ impl serde::ser::SerializeStructVariant for SerializeStructVariant { } fn end(self) -> Result { - Ok(Value::Map( - vec![ - (Value::Text(self.name), Value::Map(self.map)) - ] - )) + Ok(Value::Map(vec![( + Value::Text(self.name), + Value::Map(self.map), + )])) } } diff --git a/packages/strategy-tests/src/lib.rs b/packages/strategy-tests/src/lib.rs index f0eea09ce9..a11c7c4831 100644 --- a/packages/strategy-tests/src/lib.rs +++ b/packages/strategy-tests/src/lib.rs @@ -1147,26 +1147,37 @@ impl Strategy { ); // Create `doc_type_count` doc types - let doc_types = Value::Map(doc_type_range.clone().filter_map(|_| { - match DocumentTypeV0::random_document_type( - params.clone(), - contract_id, - rng, - platform_version, - ) { - Ok(new_document_type) => { - let mut doc_type_clone = new_document_type.schema().clone(); - let name = doc_type_clone.remove("title").expect( + let doc_types = + Value::Map( + doc_type_range + .clone() + .filter_map(|_| match DocumentTypeV0::random_document_type( + params.clone(), + contract_id, + rng, + platform_version, + ) { + Ok(new_document_type) => { + let mut doc_type_clone = + new_document_type.schema().clone(); + let name = doc_type_clone.remove("title").expect( "Expected to get a doc type title in ContractCreate", ); - Some((Value::Text(name.to_string()), doc_type_clone)) - } - Err(e) => { - error!("Error generating random document type: {:?}", e); - None - } - } - }).collect()); + Some(( + Value::Text(name.to_string()), + doc_type_clone, + )) + } + Err(e) => { + error!( + "Error generating random document type: {:?}", + e + ); + None + } + }) + .collect(), + ); let created_data_contract = match contract_factory.create( owner_id, @@ -1193,7 +1204,8 @@ impl Strategy { }; // Sign transition - let public_key = identity.get_first_public_key_matching( + let public_key = identity + .get_first_public_key_matching( Purpose::AUTHENTICATION, HashSet::from([SecurityLevel::CRITICAL]), HashSet::from([KeyType::ECDSA_SECP256K1]), From 853ad4c8c23bbfcc1efc5466af49a6cf56c05d83 Mon Sep 17 00:00:00 2001 From: PastaPastaPasta <6443210+PastaPastaPasta@users.noreply.github.com> Date: Fri, 8 Mar 2024 00:17:16 -0600 Subject: [PATCH 065/191] refactor: resolve clippy warnings in rs-drive-abci (#1755) Co-authored-by: Quantum Explorer --- .../rs-drive-abci/src/abci/app/check_tx.rs | 1 - packages/rs-drive-abci/src/abci/error.rs | 1 - .../src/execution/check_tx/mod.rs | 2 - .../src/execution/check_tx/v0/mod.rs | 3 - .../engine/initialization/init_chain/mod.rs | 2 - .../engine/run_block_proposal/mod.rs | 2 - .../engine/run_block_proposal/v0/mod.rs | 1 - .../mod.rs | 2 - .../v0/mod.rs | 3 - .../identity_nonce/v0/mod.rs | 3 +- .../data_contract_create/mod.rs | 6 +- .../data_contract_create/structure/v0/mod.rs | 5 +- .../identity_contract_nonce/mod.rs | 11 +-- .../identity_contract_nonce/v0/mod.rs | 31 +++---- .../data_contract_update/mod.rs | 13 +-- .../data_contract_update/state/mod.rs | 2 - .../data_contract_update/state/v0/mod.rs | 1 - .../data_contract_update/structure/v0/mod.rs | 1 - .../state_v0/mod.rs | 1 - .../structure_v0/mod.rs | 1 - .../documents_batch/data_triggers/executor.rs | 1 - .../identity_contract_nonce/v0/mod.rs | 26 +++--- .../state_transitions/documents_batch/mod.rs | 1 - .../documents_batch/state/v0/data_triggers.rs | 3 + .../state/v0/fetch_documents.rs | 2 + .../documents_batch/state/v0/mod.rs | 88 +++++++++---------- .../state_transitions/identity_create/mod.rs | 3 +- .../identity_credit_transfer/balance/mod.rs | 5 +- .../balance/v0/mod.rs | 2 +- .../identity_credit_transfer/mod.rs | 4 +- .../identity_credit_transfer/nonce/v0/mod.rs | 3 +- .../identity_credit_withdrawal/balance/mod.rs | 5 +- .../balance/v0/mod.rs | 2 +- .../identity_credit_withdrawal/mod.rs | 4 +- .../nonce/v0/mod.rs | 3 +- .../state_transitions/identity_top_up/mod.rs | 4 +- .../state_transitions/identity_update/mod.rs | 4 +- .../identity_update/nonce/v0/mod.rs | 3 +- packages/rs-drive-abci/src/main.rs | 1 - packages/rs-drive-abci/src/mimic/mod.rs | 2 +- .../src/platform_types/commit/v0/mod.rs | 2 +- .../src/platform_types/platform_state/mod.rs | 3 + .../data_contract/v0/mod.rs | 3 - .../data_contract_history/v0/mod.rs | 4 - .../src/query/document_query/v0/mod.rs | 1 - .../identities/v0/mod.rs | 2 +- .../identity_based_queries/identity/v0/mod.rs | 3 +- .../identity_contract_nonce/v0/mod.rs | 7 +- .../identity_nonce/v0/mod.rs | 8 +- .../src/query/response_metadata/mod.rs | 7 +- .../src/query/response_metadata/v0/mod.rs | 1 - .../query/system/version_upgrade_state/mod.rs | 1 - .../tests/strategy_tests/execution.rs | 4 +- .../tests/strategy_tests/main.rs | 5 +- .../tests/strategy_tests/query.rs | 2 +- .../tests/strategy_tests/strategy.rs | 48 ++++++---- .../verify_state_transitions.rs | 1 - 57 files changed, 148 insertions(+), 212 deletions(-) diff --git a/packages/rs-drive-abci/src/abci/app/check_tx.rs b/packages/rs-drive-abci/src/abci/app/check_tx.rs index 23f7140002..8e0c4ee4fa 100644 --- a/packages/rs-drive-abci/src/abci/app/check_tx.rs +++ b/packages/rs-drive-abci/src/abci/app/check_tx.rs @@ -10,7 +10,6 @@ use std::sync::Arc; use tenderdash_abci::proto::abci as proto; use tenderdash_abci::proto::abci::abci_application_server as grpc_abci_server; use tenderdash_abci::proto::tonic; -use tokio; /// AbciApp is an implementation of gRPC ABCI Application, as defined by Tenderdash. /// diff --git a/packages/rs-drive-abci/src/abci/error.rs b/packages/rs-drive-abci/src/abci/error.rs index 1aa1b0a4e3..2b19bd97fb 100644 --- a/packages/rs-drive-abci/src/abci/error.rs +++ b/packages/rs-drive-abci/src/abci/error.rs @@ -1,4 +1,3 @@ -use crate::error::Error; use dpp::bls_signatures::BlsError; use dpp::consensus::ConsensusError; use tenderdash_abci::proto::abci::ExtendVoteExtension; diff --git a/packages/rs-drive-abci/src/execution/check_tx/mod.rs b/packages/rs-drive-abci/src/execution/check_tx/mod.rs index c856e4d179..1f7f3d679f 100644 --- a/packages/rs-drive-abci/src/execution/check_tx/mod.rs +++ b/packages/rs-drive-abci/src/execution/check_tx/mod.rs @@ -6,8 +6,6 @@ use crate::abci::AbciError; use crate::rpc::core::CoreRPCLike; use dpp::consensus::ConsensusError; use dpp::fee::fee_result::FeeResult; -use dpp::identifier::Identifier; -use dpp::prelude::IdentityNonce; use dpp::validation::ValidationResult; use dpp::version::PlatformVersion; diff --git a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs index ea5d271d2d..c004922a26 100644 --- a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs @@ -16,7 +16,6 @@ use dpp::consensus::ConsensusError; #[cfg(test)] use crate::execution::validation::state_transition::processor::process_state_transition; -use dpp::fee::fee_result::FeeResult; use dpp::serialization::PlatformDeserializable; use dpp::state_transition::StateTransition; #[cfg(test)] @@ -200,8 +199,6 @@ mod tests { use rand::rngs::StdRng; use rand::SeedableRng; use std::collections::BTreeMap; - use std::time; - use std::time::SystemTime; // This test needs to be redone with new contract bytes, but is still useful for debugging #[test] diff --git a/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/mod.rs b/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/mod.rs index 3cdd67c646..875c99ae14 100644 --- a/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/mod.rs @@ -6,8 +6,6 @@ use crate::platform_types::platform::Platform; use crate::rpc::core::CoreRPCLike; use crate::error::execution::ExecutionError; -use crate::platform_types::platform_state::v0::PlatformStateV0Methods; -use dpp::version::PlatformVersion; use drive::grovedb::Transaction; use tenderdash_abci::proto::abci::{RequestInitChain, ResponseInitChain}; diff --git a/packages/rs-drive-abci/src/execution/engine/run_block_proposal/mod.rs b/packages/rs-drive-abci/src/execution/engine/run_block_proposal/mod.rs index cdcf50ff12..f13cc7e2a2 100644 --- a/packages/rs-drive-abci/src/execution/engine/run_block_proposal/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/run_block_proposal/mod.rs @@ -1,11 +1,9 @@ use crate::error::execution::ExecutionError; use crate::error::Error; use crate::platform_types::platform::Platform; -use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::platform_types::{block_execution_outcome, block_proposal}; use crate::rpc::core::CoreRPCLike; use dpp::validation::ValidationResult; -use dpp::version::PlatformVersion; use drive::grovedb::Transaction; mod v0; diff --git a/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs b/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs index 9c3126197d..77295b4d71 100644 --- a/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs @@ -12,7 +12,6 @@ use crate::error::execution::ExecutionError; use crate::error::Error; use crate::execution::types::block_execution_context::v0::{ BlockExecutionContextV0Getters, BlockExecutionContextV0MutableGetters, - BlockExecutionContextV0Setters, }; use crate::execution::types::block_execution_context::BlockExecutionContext; use crate::execution::types::block_fees::v0::BlockFeesV0; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_state_transition_identity_signed/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_state_transition_identity_signed/mod.rs index 73b3aa8388..ac837e5b92 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_state_transition_identity_signed/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_state_transition_identity_signed/mod.rs @@ -17,8 +17,6 @@ use crate::execution::validation::state_transition::common::validate_state_trans pub mod v0; -pub type GetDataContractFn = fn(Identifier) -> Result, ProtocolError>; - pub trait ValidateStateTransitionIdentitySignature { fn validate_state_transition_identity_signed( &self, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_state_transition_identity_signed/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_state_transition_identity_signed/v0/mod.rs index f89bd8e747..f7d929ab80 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_state_transition_identity_signed/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_state_transition_identity_signed/v0/mod.rs @@ -13,12 +13,9 @@ use crate::execution::types::state_transition_execution_context::{ StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0, }; use dpp::consensus::ConsensusError; -use dpp::data_contract::accessors::v0::DataContractV0Getters; -use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use crate::error::execution::ExecutionError; use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; -use dpp::state_transition::documents_batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; use dpp::state_transition::StateTransition; use dpp::validation::ConsensusValidationResult; use dpp::version::PlatformVersion; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/identity_nonce/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/identity_nonce/v0/mod.rs index 07ceddc454..fb717690e1 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/identity_nonce/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/identity_nonce/v0/mod.rs @@ -31,7 +31,8 @@ impl DataContractCreateTransitionIdentityNonceV0 for DataContractCreateTransitio ) -> Result { let revision_nonce = self.identity_nonce(); let identity_id = self.data_contract().owner_id(); - let (existing_nonce, fees) = platform.drive.fetch_identity_nonce_with_fees( + //todo: use fees + let (existing_nonce, _unused_fees) = platform.drive.fetch_identity_nonce_with_fees( identity_id.to_buffer(), block_info, true, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs index 8df547254f..06ab5da282 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs @@ -5,7 +5,7 @@ mod structure; use dpp::prelude::ConsensusValidationResult; use dpp::state_transition::data_contract_create_transition::DataContractCreateTransition; use dpp::validation::SimpleConsensusValidationResult; -use dpp::version::{PlatformVersion, PlatformVersionCurrentVersion}; +use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; use drive::state_transition_action::StateTransitionAction; @@ -16,15 +16,13 @@ use crate::execution::types::state_transition_execution_context::StateTransition use crate::execution::validation::state_transition::data_contract_create::state::v0::DataContractCreateStateTransitionStateValidationV0; use crate::execution::validation::state_transition::data_contract_create::structure::v0::DataContractCreatedStateTransitionStructureValidationV0; -use crate::platform_types::platform::{PlatformRef, PlatformStateRef}; +use crate::platform_types::platform::PlatformRef; use crate::rpc::core::CoreRPCLike; use crate::execution::validation::state_transition::processor::v0::{ StateTransitionBasicStructureValidationV0, StateTransitionStateValidationV0, - StateTransitionStructureKnownInStateValidationV0, }; use crate::execution::validation::state_transition::transformer::StateTransitionActionTransformerV0; -use crate::platform_types::platform_state::v0::PlatformStateV0Methods; impl StateTransitionActionTransformerV0 for DataContractCreateTransition { fn transform_into_action( diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/structure/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/structure/v0/mod.rs index 4f7a248d35..5261b3e5c9 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/structure/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/structure/v0/mod.rs @@ -1,8 +1,5 @@ use crate::error::Error; -use dpp::consensus::basic::data_contract::{ - DataContractEmptySchemaError, InvalidDataContractIdError, -}; -use dpp::consensus::basic::document::DataContractNotPresentError; +use dpp::consensus::basic::data_contract::InvalidDataContractIdError; use dpp::consensus::basic::BasicError; use dpp::prelude::DataContract; use dpp::state_transition::data_contract_create_transition::accessors::DataContractCreateTransitionAccessorsV0; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/identity_contract_nonce/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/identity_contract_nonce/mod.rs index a9c080fa8c..ebf8d8267a 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/identity_contract_nonce/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/identity_contract_nonce/mod.rs @@ -1,18 +1,13 @@ use dpp::block::block_info::BlockInfo; use dpp::state_transition::data_contract_update_transition::DataContractUpdateTransition; -use dpp::validation::{ConsensusValidationResult, SimpleConsensusValidationResult}; +use dpp::validation::SimpleConsensusValidationResult; use drive::grovedb::TransactionArg; -use drive::state_transition_action::StateTransitionAction; use dpp::version::PlatformVersion; use crate::error::Error; use crate::error::execution::ExecutionError; -use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; use crate::execution::validation::state_transition::data_contract_update::identity_contract_nonce::v0::DataContractUpdateStateTransitionIdentityContractNonceV0; -use crate::execution::validation::state_transition::data_contract_update::state::v0::DataContractUpdateStateTransitionStateValidationV0; -use crate::execution::validation::state_transition::processor::v0::{StateTransitionNonceValidationV0, StateTransitionStateValidationV0}; -use crate::platform_types::platform::{PlatformRef, PlatformStateRef}; -use crate::platform_types::platform_state::v0::PlatformStateV0Methods; -use crate::rpc::core::CoreRPCLike; +use crate::execution::validation::state_transition::processor::v0::{StateTransitionNonceValidationV0}; +use crate::platform_types::platform::{PlatformStateRef}; pub(crate) mod v0; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/identity_contract_nonce/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/identity_contract_nonce/v0/mod.rs index 97f180c1a9..9e008c260b 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/identity_contract_nonce/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/identity_contract_nonce/v0/mod.rs @@ -1,20 +1,8 @@ use crate::error::Error; use dpp::block::block_info::BlockInfo; -use dpp::consensus::state::identity::invalid_identity_contract_nonce_error::InvalidIdentityNonceError; -use dpp::consensus::state::state_error::StateError; -use dpp::consensus::ConsensusError; -use dpp::identity::identity_nonce::{ - validate_identity_nonce_update, validate_new_identity_nonce, MergeIdentityNonceResult, - IDENTITY_NONCE_VALUE_FILTER, IDENTITY_NONCE_VALUE_FILTER_MAX_BYTES, - MISSING_IDENTITY_REVISIONS_FILTER, MISSING_IDENTITY_REVISIONS_MAX_BYTES, -}; +use dpp::identity::identity_nonce::{validate_identity_nonce_update, validate_new_identity_nonce}; use dpp::state_transition::data_contract_update_transition::accessors::DataContractUpdateTransitionAccessorsV0; use dpp::state_transition::data_contract_update_transition::DataContractUpdateTransition; -use dpp::state_transition::documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; -use dpp::state_transition::documents_batch_transition::document_transition::DocumentTransitionV0Methods; - -use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; -use dpp::state_transition::StateTransitionLike; use dpp::validation::SimpleConsensusValidationResult; @@ -44,14 +32,15 @@ impl DataContractUpdateStateTransitionIdentityContractNonceV0 for DataContractUp let revision_nonce = self.identity_contract_nonce(); let identity_id = self.data_contract().owner_id(); let contract_id = self.data_contract().id(); - let (existing_nonce, fees) = platform.drive.fetch_identity_contract_nonce_with_fees( - identity_id.to_buffer(), - contract_id.to_buffer(), - block_info, - true, - tx, - platform_version, - )?; + let (existing_nonce, _unused_fees) = + platform.drive.fetch_identity_contract_nonce_with_fees( + identity_id.to_buffer(), + contract_id.to_buffer(), + block_info, + true, + tx, + platform_version, + )?; let result = if let Some(existing_nonce) = existing_nonce { validate_identity_nonce_update(existing_nonce, revision_nonce, identity_id) diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs index 3d69dd2469..1871336f18 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs @@ -3,7 +3,7 @@ mod state; mod structure; use dpp::state_transition::data_contract_update_transition::DataContractUpdateTransition; -use dpp::validation::{ConsensusValidationResult, SimpleConsensusValidationResult}; +use dpp::validation::ConsensusValidationResult; use drive::grovedb::TransactionArg; @@ -11,18 +11,12 @@ use crate::error::execution::ExecutionError; use crate::error::Error; use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; -use dpp::version::PlatformVersion; + use drive::state_transition_action::StateTransitionAction; use crate::execution::validation::state_transition::data_contract_update::state::v0::DataContractUpdateStateTransitionStateValidationV0; -use crate::execution::validation::state_transition::data_contract_update::structure::v0::DataContractUpdateStateTransitionStructureValidationV0; -use crate::execution::validation::state_transition::processor::v0::{ - StateTransitionBasicStructureValidationV0, StateTransitionStateValidationV0, - StateTransitionStructureKnownInStateValidationV0, -}; use crate::execution::validation::state_transition::transformer::StateTransitionActionTransformerV0; -use crate::platform_types::platform::{PlatformRef, PlatformStateRef}; -use crate::platform_types::platform_state::v0::PlatformStateV0Methods; +use crate::platform_types::platform::PlatformRef; use crate::rpc::core::CoreRPCLike; impl StateTransitionActionTransformerV0 for DataContractUpdateTransition { @@ -138,7 +132,6 @@ mod tests { use dpp::state_transition::data_contract_update_transition::DataContractUpdateTransition; use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; - use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use dpp::version::TryFromPlatformVersioned; use platform_version::version::LATEST_PLATFORM_VERSION; use platform_version::{DefaultForPlatformVersion, TryIntoPlatformVersioned}; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/mod.rs index 8b6998db1e..81b2af66a7 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/mod.rs @@ -4,11 +4,9 @@ use crate::execution::types::state_transition_execution_context::StateTransition use crate::execution::validation::state_transition::data_contract_update::state::v0::DataContractUpdateStateTransitionStateValidationV0; use crate::execution::validation::state_transition::processor::v0::StateTransitionStateValidationV0; use crate::platform_types::platform::PlatformRef; -use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::rpc::core::CoreRPCLike; use dpp::state_transition::data_contract_update_transition::DataContractUpdateTransition; use dpp::validation::ConsensusValidationResult; -use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; use drive::state_transition_action::StateTransitionAction; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/v0/mod.rs index 0b7897e053..d96b85eab5 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/v0/mod.rs @@ -27,7 +27,6 @@ use dpp::state_transition::data_contract_update_transition::accessors::DataContr use dpp::ProtocolError; use dpp::state_transition::data_contract_update_transition::DataContractUpdateTransition; -use dpp::state_transition::StateTransitionLike; use dpp::version::{PlatformVersion, TryIntoPlatformVersioned}; use drive::grovedb::TransactionArg; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/structure/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/structure/v0/mod.rs index 69600bb335..20853351ae 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/structure/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/structure/v0/mod.rs @@ -4,7 +4,6 @@ use dpp::state_transition::data_contract_update_transition::accessors::DataContr use dpp::ProtocolError; use dpp::state_transition::data_contract_update_transition::DataContractUpdateTransition; -use dpp::state_transition::StateTransitionLike; use dpp::validation::SimpleConsensusValidationResult; use dpp::version::PlatformVersion; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/state_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/state_v0/mod.rs index 963bb4708d..0bad59c56c 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/state_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/state_v0/mod.rs @@ -3,7 +3,6 @@ use dpp::consensus::ConsensusError; use dpp::consensus::state::document::document_already_present_error::DocumentAlreadyPresentError; use dpp::consensus::state::state_error::StateError; use dpp::data_contract::accessors::v0::DataContractV0Getters; -use dpp::document::{DocumentV0Getters}; use dpp::prelude::{ConsensusValidationResult, Identifier}; use dpp::validation::SimpleConsensusValidationResult; use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/structure_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/structure_v0/mod.rs index 8430b1a1fa..8d3bee2f76 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/structure_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/structure_v0/mod.rs @@ -6,7 +6,6 @@ use dpp::consensus::state::state_error::StateError; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::data_contract::validation::DataContractValidationMethodsV0; -use dpp::document::{DocumentV0Getters}; use dpp::document::extended_document::property_names; use dpp::identity::TimestampMillis; use dpp::ProtocolError; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/executor.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/executor.rs index a44a47846d..ac229976a5 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/executor.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/executor.rs @@ -6,7 +6,6 @@ use drive::state_transition_action::document::documents_batch::document_transiti use dpp::state_transition::documents_batch_transition::document_transition::action_type::TransitionActionTypeGetter; use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; use dpp::version::PlatformVersion; -use drive::error::drive::DriveError; use crate::execution::validation::state_transition::documents_batch::data_triggers::bindings::data_trigger_binding::DataTriggerBinding; use crate::execution::validation::state_transition::documents_batch::data_triggers::bindings::data_trigger_binding::DataTriggerBindingV0Getters; use crate::error::Error; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/identity_contract_nonce/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/identity_contract_nonce/v0/mod.rs index 8b764a5d9f..3240e4a875 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/identity_contract_nonce/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/identity_contract_nonce/v0/mod.rs @@ -1,13 +1,6 @@ use crate::error::Error; use dpp::block::block_info::BlockInfo; -use dpp::consensus::state::identity::invalid_identity_contract_nonce_error::InvalidIdentityNonceError; -use dpp::consensus::state::state_error::StateError; -use dpp::consensus::ConsensusError; -use dpp::identity::identity_nonce::{ - validate_identity_nonce_update, validate_new_identity_nonce, MergeIdentityNonceResult, - IDENTITY_NONCE_VALUE_FILTER, IDENTITY_NONCE_VALUE_FILTER_MAX_BYTES, - MISSING_IDENTITY_REVISIONS_FILTER, MISSING_IDENTITY_REVISIONS_MAX_BYTES, -}; +use dpp::identity::identity_nonce::{validate_identity_nonce_update, validate_new_identity_nonce}; use dpp::state_transition::documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; use dpp::state_transition::documents_batch_transition::document_transition::DocumentTransitionV0Methods; @@ -43,14 +36,15 @@ impl DocumentsBatchStateTransitionIdentityContractNonceV0 for DocumentsBatchTran for transition in self.transitions() { let revision_nonce = transition.identity_contract_nonce(); let identity_id = self.owner_id(); - let (existing_nonce, fees) = platform.drive.fetch_identity_contract_nonce_with_fees( - identity_id.to_buffer(), - transition.data_contract_id().to_buffer(), - block_info, - true, - tx, - platform_version, - )?; + let (existing_nonce, _unused_fees) = + platform.drive.fetch_identity_contract_nonce_with_fees( + identity_id.to_buffer(), + transition.data_contract_id().to_buffer(), + block_info, + true, + tx, + platform_version, + )?; let result = if let Some(existing_nonce) = existing_nonce { validate_identity_nonce_update(existing_nonce, revision_nonce, identity_id) diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs index ea5ddbe072..a618e7404c 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs @@ -30,7 +30,6 @@ use crate::execution::validation::state_transition::processor::v0::{ StateTransitionStateValidationV0, StateTransitionStructureKnownInStateValidationV0, }; use crate::execution::validation::state_transition::transformer::StateTransitionActionTransformerV0; -use crate::platform_types::platform_state::v0::PlatformStateV0Methods; impl StateTransitionActionTransformerV0 for DocumentsBatchTransition { fn transform_into_action( diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/data_triggers.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/data_triggers.rs index a49f3b754a..47a71a2e69 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/data_triggers.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/data_triggers.rs @@ -7,6 +7,9 @@ use dpp::version::PlatformVersion; use drive::state_transition_action::document::documents_batch::document_transition::DocumentTransitionAction; +#[allow(dead_code)] +#[deprecated(note = "This function is marked as unused.")] +#[allow(deprecated)] pub(super) fn execute_data_triggers( document_transition_actions: &Vec, context: &DataTriggerExecutionContext, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/fetch_documents.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/fetch_documents.rs index 2f39393efc..e61e0bdc37 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/fetch_documents.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/fetch_documents.rs @@ -25,6 +25,8 @@ use drive::grovedb::TransactionArg; use drive::query::{DriveQuery, InternalClauses, WhereClause, WhereOperator}; #[allow(dead_code)] +#[deprecated(note = "This function is marked as unused.")] +#[allow(deprecated)] pub(crate) fn fetch_documents_for_transitions( platform: &PlatformStateRef, document_transitions: &[&DocumentTransition], diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs index 58241cb613..1652427b3d 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs @@ -1,8 +1,6 @@ use dpp::consensus::ConsensusError; use dpp::consensus::state::state_error::StateError; use dpp::prelude::ConsensusValidationResult; -use dpp::state_transition::documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; -use dpp::state_transition::documents_batch_transition::document_transition::action_type::TransitionActionTypeGetter; use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; use dpp::state_transition::StateTransitionLike; use drive::state_transition_action::StateTransitionAction; @@ -18,7 +16,6 @@ use crate::execution::validation::state_transition::documents_batch::action_vali use crate::execution::validation::state_transition::documents_batch::action_validation::document_delete_transition_action::DocumentDeleteTransitionActionValidation; use crate::execution::validation::state_transition::documents_batch::action_validation::document_replace_transition_action::DocumentReplaceTransitionActionValidation; use crate::execution::validation::state_transition::documents_batch::data_triggers::{data_trigger_bindings_list, DataTriggerExecutionContext, DataTriggerExecutor}; -use crate::execution::validation::state_transition::documents_batch::state::v0::data_triggers::execute_data_triggers; use crate::platform_types::platform::{PlatformStateRef}; use crate::execution::validation::state_transition::state_transitions::documents_batch::transformer::v0::DocumentsBatchTransitionTransformerV0; @@ -97,53 +94,50 @@ impl DocumentsBatchStateTransitionStateValidationV0 for DocumentsBatchTransition )?, ), ); - } else { - if platform.config.execution.use_document_triggers { - // we should also validate document triggers - let data_trigger_execution_context = DataTriggerExecutionContext { - platform, - transaction, - owner_id: &self.owner_id(), - state_transition_execution_context: &state_transition_execution_context, - }; - let data_trigger_execution_result = transition.validate_with_data_triggers( - &data_trigger_bindings, - &data_trigger_execution_context, - platform_version, - )?; - - if !data_trigger_execution_result.is_valid() { - tracing::debug!( - "{:?} state transition data trigger was not valid, errors are {:?}", - transition, - data_trigger_execution_result.errors, - ); - // If a state transition isn't valid because of data triggers we still need - // to bump the identity data contract nonce - let consensus_errors: Vec = data_trigger_execution_result - .errors - .into_iter() - .map(|e| ConsensusError::StateError(StateError::DataTriggerError(e))) - .collect(); - validation_result.add_errors(consensus_errors); - validated_transitions.push( - DocumentTransitionAction::BumpIdentityDataContractNonce( - BumpIdentityDataContractNonceAction::from_document_base_transition_action( - transition.base_owned().ok_or(Error::Execution( - ExecutionError::CorruptedCodeExecution( - "base should always exist on transition", - ), - ))?, - owner_id, - )?, - ), - ); - } else { - validated_transitions.push(transition); - } + } else if platform.config.execution.use_document_triggers { + // we should also validate document triggers + let data_trigger_execution_context = DataTriggerExecutionContext { + platform, + transaction, + owner_id: &self.owner_id(), + state_transition_execution_context: &state_transition_execution_context, + }; + let data_trigger_execution_result = transition.validate_with_data_triggers( + &data_trigger_bindings, + &data_trigger_execution_context, + platform_version, + )?; + + if !data_trigger_execution_result.is_valid() { + tracing::debug!( + "{:?} state transition data trigger was not valid, errors are {:?}", + transition, + data_trigger_execution_result.errors, + ); + // If a state transition isn't valid because of data triggers we still need + // to bump the identity data contract nonce + let consensus_errors: Vec = data_trigger_execution_result + .errors + .into_iter() + .map(|e| ConsensusError::StateError(StateError::DataTriggerError(e))) + .collect(); + validation_result.add_errors(consensus_errors); + validated_transitions + .push(DocumentTransitionAction::BumpIdentityDataContractNonce( + BumpIdentityDataContractNonceAction::from_document_base_transition_action( + transition.base_owned().ok_or(Error::Execution( + ExecutionError::CorruptedCodeExecution( + "base should always exist on transition", + ), + ))?, + owner_id, + )?, + )); } else { validated_transitions.push(transition); } + } else { + validated_transitions.push(transition); } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/mod.rs index d77902f007..531d3f7eb8 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/mod.rs @@ -10,10 +10,9 @@ use crate::execution::validation::state_transition::identity_create::state::v0:: use crate::execution::validation::state_transition::identity_create::structure::v0::IdentityCreateStateTransitionStructureValidationV0; use crate::execution::validation::state_transition::processor::v0::{ StateTransitionBasicStructureValidationV0, StateTransitionStateValidationV0, - StateTransitionStructureKnownInStateValidationV0, }; use crate::execution::validation::state_transition::transformer::StateTransitionActionTransformerV0; -use crate::platform_types::platform::{PlatformRef, PlatformStateRef}; +use crate::platform_types::platform::PlatformRef; use crate::rpc::core::CoreRPCLike; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/balance/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/balance/mod.rs index 6d4b28e950..175b9c8a52 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/balance/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/balance/mod.rs @@ -1,10 +1,7 @@ use crate::error::execution::ExecutionError; use crate::error::Error; use crate::execution::validation::state_transition::identity_credit_transfer::balance::v0::IdentityCreditTransferTransitionBalanceValidationV0; -use crate::execution::validation::state_transition::identity_credit_transfer::nonce::v0::IdentityCreditTransferTransitionIdentityNonceV0; -use crate::execution::validation::state_transition::processor::v0::{ - StateTransitionBalanceValidationV0, StateTransitionNonceValidationV0, -}; +use crate::execution::validation::state_transition::processor::v0::StateTransitionBalanceValidationV0; use crate::platform_types::platform::PlatformStateRef; use dpp::block::block_info::BlockInfo; use dpp::identity::PartialIdentity; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/balance/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/balance/v0/mod.rs index cc2490e61c..5837914edc 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/balance/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/balance/v0/mod.rs @@ -30,7 +30,7 @@ impl IdentityCreditTransferTransitionBalanceValidationV0 for IdentityCreditTrans &self, identity: Option<&mut PartialIdentity>, platform: &PlatformStateRef, - block_info: &BlockInfo, + _unused_block_info: &BlockInfo, tx: TransactionArg, platform_version: &PlatformVersion, ) -> Result { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/mod.rs index 19600f0f1c..790735d946 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/mod.rs @@ -13,17 +13,15 @@ use drive::grovedb::TransactionArg; use crate::error::execution::ExecutionError; use crate::error::Error; use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; -use crate::platform_types::platform::{PlatformRef, PlatformStateRef}; +use crate::platform_types::platform::PlatformRef; use crate::rpc::core::CoreRPCLike; use crate::execution::validation::state_transition::identity_credit_transfer::state::v0::IdentityCreditTransferStateTransitionStateValidationV0; use crate::execution::validation::state_transition::identity_credit_transfer::structure::v0::IdentityCreditTransferStateTransitionStructureValidationV0; use crate::execution::validation::state_transition::processor::v0::{ StateTransitionBasicStructureValidationV0, StateTransitionStateValidationV0, - StateTransitionStructureKnownInStateValidationV0, }; use crate::execution::validation::state_transition::transformer::StateTransitionActionTransformerV0; -use crate::platform_types::platform_state::v0::PlatformStateV0Methods; impl StateTransitionActionTransformerV0 for IdentityCreditTransferTransition { fn transform_into_action( diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/nonce/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/nonce/v0/mod.rs index 04fef9aa47..476fe78549 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/nonce/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/nonce/v0/mod.rs @@ -31,7 +31,8 @@ impl IdentityCreditTransferTransitionIdentityNonceV0 for IdentityCreditTransferT ) -> Result { let revision_nonce = self.nonce(); let identity_id = self.identity_id(); - let (existing_nonce, fees) = platform.drive.fetch_identity_nonce_with_fees( + //todo: use fees + let (existing_nonce, _unused_fees) = platform.drive.fetch_identity_nonce_with_fees( identity_id.to_buffer(), block_info, true, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/balance/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/balance/mod.rs index fc451fc666..291d5b0f72 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/balance/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/balance/mod.rs @@ -1,10 +1,7 @@ use crate::error::execution::ExecutionError; use crate::error::Error; use crate::execution::validation::state_transition::identity_credit_withdrawal::balance::v0::IdentityCreditTransferTransitionBalanceValidationV0; -use crate::execution::validation::state_transition::identity_credit_withdrawal::nonce::v0::IdentityCreditWithdrawalTransitionIdentityContractNonceV0; -use crate::execution::validation::state_transition::processor::v0::{ - StateTransitionBalanceValidationV0, StateTransitionNonceValidationV0, -}; +use crate::execution::validation::state_transition::processor::v0::StateTransitionBalanceValidationV0; use crate::platform_types::platform::PlatformStateRef; use dpp::block::block_info::BlockInfo; use dpp::identity::PartialIdentity; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/balance/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/balance/v0/mod.rs index 6e97691e67..6ec3199b56 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/balance/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/balance/v0/mod.rs @@ -30,7 +30,7 @@ impl IdentityCreditTransferTransitionBalanceValidationV0 for IdentityCreditWithd &self, identity: Option<&mut PartialIdentity>, platform: &PlatformStateRef, - block_info: &BlockInfo, + _unused_block_info: &BlockInfo, tx: TransactionArg, platform_version: &PlatformVersion, ) -> Result { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs index 9af6130534..d619e77760 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs @@ -13,7 +13,7 @@ use drive::grovedb::TransactionArg; use crate::error::execution::ExecutionError; use crate::error::Error; use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; -use crate::platform_types::platform::{PlatformRef, PlatformStateRef}; +use crate::platform_types::platform::PlatformRef; use crate::rpc::core::CoreRPCLike; use crate::execution::validation::state_transition::identity_credit_withdrawal::state::v0::IdentityCreditWithdrawalStateTransitionStateValidationV0; @@ -21,10 +21,8 @@ use crate::execution::validation::state_transition::identity_credit_withdrawal:: use crate::execution::validation::state_transition::processor::v0::{ StateTransitionBasicStructureValidationV0, StateTransitionStateValidationV0, - StateTransitionStructureKnownInStateValidationV0, }; use crate::execution::validation::state_transition::transformer::StateTransitionActionTransformerV0; -use crate::platform_types::platform_state::v0::PlatformStateV0Methods; impl StateTransitionActionTransformerV0 for IdentityCreditWithdrawalTransition { fn transform_into_action( diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/nonce/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/nonce/v0/mod.rs index e4ab5cbd40..381ef6156a 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/nonce/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/nonce/v0/mod.rs @@ -33,7 +33,8 @@ impl IdentityCreditWithdrawalTransitionIdentityContractNonceV0 ) -> Result { let revision_nonce = self.nonce(); let identity_id = self.identity_id(); - let (existing_nonce, fees) = platform.drive.fetch_identity_nonce_with_fees( + //todo: use fees + let (existing_nonce, _unused_fees) = platform.drive.fetch_identity_nonce_with_fees( identity_id.to_buffer(), block_info, true, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/mod.rs index 9f795234b1..c3b5f61152 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/mod.rs @@ -13,18 +13,16 @@ use crate::error::execution::ExecutionError; use crate::error::Error; use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; -use crate::platform_types::platform::{PlatformRef, PlatformStateRef}; +use crate::platform_types::platform::PlatformRef; use crate::rpc::core::CoreRPCLike; use crate::execution::validation::state_transition::identity_top_up::state::v0::IdentityTopUpStateTransitionStateValidationV0; use crate::execution::validation::state_transition::identity_top_up::structure::v0::IdentityTopUpStateTransitionStructureValidationV0; use crate::execution::validation::state_transition::processor::v0::{ StateTransitionBasicStructureValidationV0, StateTransitionStateValidationV0, - StateTransitionStructureKnownInStateValidationV0, }; use crate::execution::validation::state_transition::transformer::StateTransitionActionTransformerV0; -use crate::platform_types::platform_state::v0::PlatformStateV0Methods; impl StateTransitionActionTransformerV0 for IdentityTopUpTransition { fn transform_into_action( diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/mod.rs index 2af9cb76ed..2fd5093131 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/mod.rs @@ -14,18 +14,16 @@ use crate::error::execution::ExecutionError; use crate::error::Error; use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; -use crate::platform_types::platform::{PlatformRef, PlatformStateRef}; +use crate::platform_types::platform::PlatformRef; use crate::rpc::core::CoreRPCLike; use crate::execution::validation::state_transition::identity_update::state::v0::IdentityUpdateStateTransitionStateValidationV0; use crate::execution::validation::state_transition::identity_update::structure::v0::IdentityUpdateStateTransitionStructureValidationV0; use crate::execution::validation::state_transition::processor::v0::{ StateTransitionBasicStructureValidationV0, StateTransitionStateValidationV0, - StateTransitionStructureKnownInStateValidationV0, }; use crate::execution::validation::state_transition::transformer::StateTransitionActionTransformerV0; -use crate::platform_types::platform_state::v0::PlatformStateV0Methods; impl StateTransitionActionTransformerV0 for IdentityUpdateTransition { fn transform_into_action( diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/nonce/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/nonce/v0/mod.rs index b01e7f8217..382146c34b 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/nonce/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/nonce/v0/mod.rs @@ -31,7 +31,8 @@ impl IdentityUpdateTransitionIdentityContractNonceV0 for IdentityUpdateTransitio ) -> Result { let revision_nonce = self.nonce(); let identity_id = self.identity_id(); - let (existing_nonce, fees) = platform.drive.fetch_identity_nonce_with_fees( + //todo: use fees + let (existing_nonce, _unused_fees) = platform.drive.fetch_identity_nonce_with_fees( identity_id.to_buffer(), block_info, true, diff --git a/packages/rs-drive-abci/src/main.rs b/packages/rs-drive-abci/src/main.rs index 9eaeabab40..bce62ceefb 100644 --- a/packages/rs-drive-abci/src/main.rs +++ b/packages/rs-drive-abci/src/main.rs @@ -22,7 +22,6 @@ use tokio::time::Duration; use tokio_util::sync::CancellationToken; use tracing_subscriber::layer::SubscriberExt; use tracing_subscriber::util::SubscriberInitExt; -use tracing_subscriber::{registry, Layer, Registry}; const SHUTDOWN_TIMEOUT_MILIS: u64 = 5000; // 5s; Docker defaults to 10s diff --git a/packages/rs-drive-abci/src/mimic/mod.rs b/packages/rs-drive-abci/src/mimic/mod.rs index c2da5ddd16..50f8662afd 100644 --- a/packages/rs-drive-abci/src/mimic/mod.rs +++ b/packages/rs-drive-abci/src/mimic/mod.rs @@ -484,7 +484,7 @@ impl<'a, C: CoreRPCLike> FullAbciApplication<'a, C> { if self.platform.config.testing_configs.block_signing { let quorum_hash: [u8; 32] = quorum_hash.try_into().expect("wrong quorum hash len"); let digest = commit - .sign_digest( + .calculate_sign_hash( CHAIN_ID, quorum_type as u8, &quorum_hash, diff --git a/packages/rs-drive-abci/src/platform_types/commit/v0/mod.rs b/packages/rs-drive-abci/src/platform_types/commit/v0/mod.rs index 0d0513aa47..403a3fff30 100644 --- a/packages/rs-drive-abci/src/platform_types/commit/v0/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/commit/v0/mod.rs @@ -107,7 +107,7 @@ impl CommitV0 { let hash = match self .inner - .sign_digest( + .calculate_sign_hash( &self.chain_id, self.quorum_type as u8, quorum_hash, diff --git a/packages/rs-drive-abci/src/platform_types/platform_state/mod.rs b/packages/rs-drive-abci/src/platform_types/platform_state/mod.rs index 91806b2d60..6a4bb7408d 100644 --- a/packages/rs-drive-abci/src/platform_types/platform_state/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/platform_state/mod.rs @@ -41,6 +41,9 @@ pub(crate) enum PlatformStateForSaving { } impl PlatformStateForSaving { + #[allow(dead_code)] + #[deprecated(note = "This function is marked as unused.")] + #[allow(deprecated)] pub fn current_protocol_version_in_consensus(&self) -> ProtocolVersion { match self { PlatformStateForSaving::V0(v0) => v0.current_protocol_version_in_consensus, diff --git a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract/v0/mod.rs b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract/v0/mod.rs index 19db60e292..89a3443f8f 100644 --- a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract/v0/mod.rs @@ -1,14 +1,11 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; -use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_data_contract_request::GetDataContractRequestV0; use dapi_grpc::platform::v0::get_data_contract_response::{ get_data_contract_response_v0, GetDataContractResponseV0, }; -use dapi_grpc::platform::v0::{get_data_contract_response, GetDataContractResponse}; -use dapi_grpc::Message; use dpp::check_validation_result_with_data; use dpp::identifier::Identifier; use dpp::serialization::PlatformSerializableWithPlatformVersion; diff --git a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/v0/mod.rs b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/v0/mod.rs index 0a3367ee8f..96708f9e23 100644 --- a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/v0/mod.rs @@ -110,10 +110,6 @@ mod tests { use crate::query::tests::{assert_invalid_identifier, setup_platform}; use crate::rpc::core::MockCoreRPCLike; use crate::test::helpers::setup::{TempPlatform, TestPlatformBuilder}; - use dapi_grpc::platform::v0::{ - get_data_contract_history_response, GetDataContractHistoryRequest, - GetDataContractHistoryResponse, - }; use dpp::block::block_info::BlockInfo; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::config::v0::DataContractConfigSettersV0; diff --git a/packages/rs-drive-abci/src/query/document_query/v0/mod.rs b/packages/rs-drive-abci/src/query/document_query/v0/mod.rs index a2ea4c5997..0fee35536e 100644 --- a/packages/rs-drive-abci/src/query/document_query/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/document_query/v0/mod.rs @@ -7,7 +7,6 @@ use dapi_grpc::platform::v0::get_documents_request::GetDocumentsRequestV0; use dapi_grpc::platform::v0::get_documents_response::{ get_documents_response_v0, GetDocumentsResponseV0, }; -use dapi_grpc::platform::v0::{get_documents_response, GetDocumentsResponse}; use dpp::check_validation_result_with_data; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::identifier::Identifier; diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identities/v0/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identities/v0/mod.rs index 04b2080812..7942d972e0 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/identities/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identities/v0/mod.rs @@ -3,10 +3,10 @@ use crate::error::Error; use crate::platform_types::platform::Platform; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_identities_request::GetIdentitiesRequestV0; +use dapi_grpc::platform::v0::get_identities_response; use dapi_grpc::platform::v0::get_identities_response::{ get_identities_response_v0, GetIdentitiesResponseV0, IdentityEntry, }; -use dapi_grpc::platform::v0::{get_identities_response, GetIdentitiesResponse}; use dpp::platform_value::Bytes32; use dpp::serialization::PlatformSerializable; use dpp::validation::ValidationResult; diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identity/v0/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identity/v0/mod.rs index 26338cc517..b73cced131 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/identity/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identity/v0/mod.rs @@ -6,7 +6,6 @@ use dapi_grpc::platform::v0::get_identity_request::GetIdentityRequestV0; use dapi_grpc::platform::v0::get_identity_response::{ get_identity_response_v0, GetIdentityResponseV0, }; -use dapi_grpc::platform::v0::{get_identity_response, GetIdentityResponse}; use dpp::check_validation_result_with_data; use dpp::identifier::Identifier; use dpp::serialization::PlatformSerializable; @@ -73,7 +72,7 @@ mod tests { #[test] fn test_invalid_identity_id() { - let (platform, version) = setup_platform(); + let (platform, _unused_version) = setup_platform(); let version = PlatformVersion::latest(); diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identity_contract_nonce/v0/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identity_contract_nonce/v0/mod.rs index 2e0607a217..7c5bccac35 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/identity_contract_nonce/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identity_contract_nonce/v0/mod.rs @@ -159,8 +159,9 @@ mod tests { let (platform, version) = setup_platform(); let mut rng = StdRng::seed_from_u64(45); let id = rng.gen::<[u8; 32]>(); - let identity = create_test_identity_with_rng(&platform.drive, id, &mut rng, None, version) - .expect("expected to create a test identity"); + let _unused_identity = + create_test_identity_with_rng(&platform.drive, id, &mut rng, None, version) + .expect("expected to create a test identity"); let request = GetIdentityContractNonceRequestV0 { identity_id: id.to_vec(), @@ -373,8 +374,6 @@ mod tests { fn test_identity_contract_nonce_absence_proof() { let (platform, version) = setup_platform(); - let id = vec![0; 32]; - let request = GetIdentityContractNonceRequestV0 { identity_id: vec![0; 32], prove: true, diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identity_nonce/v0/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identity_nonce/v0/mod.rs index 9f982a75b8..3e77dfd200 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/identity_nonce/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identity_nonce/v0/mod.rs @@ -114,8 +114,9 @@ mod tests { let (platform, version) = setup_platform(); let mut rng = StdRng::seed_from_u64(10); let id = rng.gen::<[u8; 32]>(); - let identity = create_test_identity_with_rng(&platform.drive, id, &mut rng, None, version) - .expect("expected to create a test identity"); + let _unused_identity = + create_test_identity_with_rng(&platform.drive, id, &mut rng, None, version) + .expect("expected to create a test identity"); let request = GetIdentityNonceRequestV0 { identity_id: id.to_vec(), @@ -145,7 +146,6 @@ mod tests { let identity = create_test_identity_with_rng(&platform.drive, id, &mut rng, None, version) .expect("expected to create a test identity"); - let dashpay = platform.drive.cache.system_data_contracts.read_dashpay(); platform .drive @@ -260,8 +260,6 @@ mod tests { fn test_identity_contract_nonce_absence_proof() { let (platform, version) = setup_platform(); - let id = vec![0; 32]; - let request = GetIdentityNonceRequestV0 { identity_id: vec![0; 32], prove: true, diff --git a/packages/rs-drive-abci/src/query/response_metadata/mod.rs b/packages/rs-drive-abci/src/query/response_metadata/mod.rs index 445935d530..8e784fecaf 100644 --- a/packages/rs-drive-abci/src/query/response_metadata/mod.rs +++ b/packages/rs-drive-abci/src/query/response_metadata/mod.rs @@ -4,12 +4,13 @@ use crate::error::execution::ExecutionError; use crate::error::Error; use crate::platform_types::platform::Platform; -use crate::platform_types::platform_state::v0::PlatformStateV0Methods; -use crate::platform_types::platform_state::PlatformState; -use dapi_grpc::platform::v0::{Proof, ResponseMetadata}; +use dapi_grpc::platform::v0::ResponseMetadata; use dpp::version::PlatformVersion; impl Platform { + #[allow(dead_code)] + #[deprecated(note = "This function is marked as unused.")] + #[allow(deprecated)] pub(in crate::query) fn response_metadata( &self, platform_version: &PlatformVersion, diff --git a/packages/rs-drive-abci/src/query/response_metadata/v0/mod.rs b/packages/rs-drive-abci/src/query/response_metadata/v0/mod.rs index 51103521e9..053b02c192 100644 --- a/packages/rs-drive-abci/src/query/response_metadata/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/response_metadata/v0/mod.rs @@ -1,6 +1,5 @@ use crate::platform_types::platform::Platform; use crate::platform_types::platform_state::v0::PlatformStateV0Methods; -use crate::platform_types::platform_state::PlatformState; use dapi_grpc::platform::v0::{Proof, ResponseMetadata}; impl Platform { diff --git a/packages/rs-drive-abci/src/query/system/version_upgrade_state/mod.rs b/packages/rs-drive-abci/src/query/system/version_upgrade_state/mod.rs index 1c98a8be1c..da629c34fd 100644 --- a/packages/rs-drive-abci/src/query/system/version_upgrade_state/mod.rs +++ b/packages/rs-drive-abci/src/query/system/version_upgrade_state/mod.rs @@ -9,7 +9,6 @@ use dapi_grpc::platform::v0::get_protocol_version_upgrade_state_response::Versio use dapi_grpc::platform::v0::{ GetProtocolVersionUpgradeStateRequest, GetProtocolVersionUpgradeStateResponse, }; -use dapi_grpc::Message; use dpp::version::PlatformVersion; impl Platform { diff --git a/packages/rs-drive-abci/tests/strategy_tests/execution.rs b/packages/rs-drive-abci/tests/strategy_tests/execution.rs index 846759c632..814bb6f896 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/execution.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/execution.rs @@ -827,8 +827,6 @@ pub(crate) fn continue_chain_for_strategy( }), ); - let mut current_core_height = core_height_start; - let mut total_withdrawals = UnsignedWithdrawalTxs::default(); let mut current_quorum_with_test_info = @@ -852,7 +850,7 @@ pub(crate) fn continue_chain_for_strategy( ) .expect("should calculate epoch info"); - current_core_height = state.last_committed_core_height(); + let current_core_height = state.last_committed_core_height(); drop(state); diff --git a/packages/rs-drive-abci/tests/strategy_tests/main.rs b/packages/rs-drive-abci/tests/strategy_tests/main.rs index 3fa9d80839..79616b2f2b 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/main.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/main.rs @@ -113,6 +113,9 @@ mod tests { use dpp::state_transition::StateTransition; use tenderdash_abci::Application; + #[allow(dead_code)] + #[deprecated(note = "This function is marked as unused.")] + #[allow(deprecated)] pub fn generate_quorums_extended_info(n: u32) -> QuorumListExtendedInfo { let mut quorums = QuorumListExtendedInfo::new(); @@ -2055,7 +2058,7 @@ mod tests { let outcome = run_chain_for_strategy(&mut platform, block_count, strategy, config, 15); for tx_results_per_block in outcome.state_transition_results_per_block.values() { - for (state_transition, result) in tx_results_per_block { + for (state_transition, _unused_result) in tx_results_per_block { // We can't ever get a documents batch transition, because the proposer will remove it from a block assert!(!matches!( state_transition, diff --git a/packages/rs-drive-abci/tests/strategy_tests/query.rs b/packages/rs-drive-abci/tests/strategy_tests/query.rs index aaff4ae9a1..a89178dfd6 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/query.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/query.rs @@ -95,7 +95,7 @@ impl<'a> ProofVerification<'a> { r#type: SignedMsgType::Precommit.into(), }; - let digest = match v.sign_digest( + let digest = match v.calculate_sign_hash( &self.chain_id, self.quorum_type as u8, self.quorum_hash, diff --git a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs index 28a7b53e23..9de626aab8 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs @@ -1,11 +1,11 @@ use crate::masternodes::MasternodeListItemWithUpdates; use crate::query::QueryStrategy; use crate::BlockHeight; -use dashcore_rpc::dashcore::{self, Network, PrivateKey}; +use dashcore_rpc::dashcore::{Network, PrivateKey}; use dashcore_rpc::dashcore::{ProTxHash, QuorumHash}; use dpp::block::block_info::BlockInfo; use dpp::state_transition::identity_topup_transition::methods::IdentityTopUpTransitionMethodsV0; -use dpp::{NativeBlsModule, ProtocolError}; +use dpp::ProtocolError; use dpp::dashcore::secp256k1::SecretKey; use dpp::data_contract::document_type::random_document::CreateRandomDocument; @@ -43,7 +43,6 @@ use strategy_tests::Strategy; use strategy_tests::transitions::{create_state_transitions_for_identities, instant_asset_lock_proof_fixture}; use std::borrow::Cow; use std::collections::{BTreeMap, HashMap, HashSet}; -use std::ops::AddAssign; use std::str::FromStr; use tenderdash_abci::proto::abci::{ExecTxResult, ValidatorSetUpdate}; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; @@ -114,18 +113,6 @@ impl MasternodeListChangesStrategy { || self.changed_ip_masternodes.is_set() } - pub fn removed_any_masternode_types(&self) -> bool { - self.removed_masternodes.is_set() || self.removed_hpmns.is_set() - } - - pub fn updated_any_masternode_types(&self) -> bool { - self.updated_masternodes.is_set() || self.updated_hpmns.is_set() - } - - pub fn added_any_masternode_types(&self) -> bool { - self.new_masternodes.is_set() || self.new_hpmns.is_set() - } - pub fn any_kind_of_update_is_set(&self) -> bool { self.updated_hpmns.is_set() || self.banned_hpmns.is_set() @@ -138,8 +125,30 @@ impl MasternodeListChangesStrategy { || self.unbanned_masternodes.is_set() || self.changed_ip_masternodes.is_set() } + + #[allow(dead_code)] + #[deprecated(note = "This function is marked as unused.")] + #[allow(deprecated)] + pub fn removed_any_masternode_types(&self) -> bool { + self.removed_masternodes.is_set() || self.removed_hpmns.is_set() + } + #[allow(dead_code)] + #[deprecated(note = "This function is marked as unused.")] + #[allow(deprecated)] + pub fn updated_any_masternode_types(&self) -> bool { + self.updated_masternodes.is_set() || self.updated_hpmns.is_set() + } + #[allow(dead_code)] + #[deprecated(note = "This function is marked as unused.")] + #[allow(deprecated)] + pub fn added_any_masternode_types(&self) -> bool { + self.new_masternodes.is_set() || self.new_hpmns.is_set() + } } +#[allow(dead_code)] +#[deprecated(note = "This function is marked as unused.")] +#[allow(deprecated)] pub enum StrategyMode { ProposerOnly, ProposerAndValidatorHashValidationOnly, @@ -185,6 +194,9 @@ impl CoreHeightIncrease { } } } + #[allow(dead_code)] + #[deprecated(note = "This function is marked as unused.")] + #[allow(deprecated)] pub fn average_core_height(&self, block_count: u64, initial_core_height: u32) -> u32 { match self { NoCoreHeightIncrease => initial_core_height, @@ -198,6 +210,9 @@ impl CoreHeightIncrease { } } + #[allow(dead_code)] + #[deprecated(note = "This function is marked as unused.")] + #[allow(deprecated)] pub fn add_events_if_hit(&mut self, core_height: u32, rng: &mut StdRng) -> u32 { match self { NoCoreHeightIncrease => 0, @@ -313,6 +328,9 @@ impl NetworkStrategy { } // TODO: This belongs to `DocumentOp` + #[allow(dead_code)] + #[deprecated(note = "This function is marked as unused.")] + #[allow(deprecated)] pub fn add_strategy_contracts_into_drive( &mut self, drive: &Drive, diff --git a/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs b/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs index 1330c96f6c..1c538d5770 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs @@ -1,7 +1,6 @@ use dapi_grpc::platform::v0::get_proofs_request::{get_proofs_request_v0, GetProofsRequestV0}; use dapi_grpc::platform::v0::{get_proofs_request, GetProofsRequest}; use dapi_grpc::platform::VersionedGrpcResponse; -use dpp::block::block_info::BlockInfo; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::document::Document; From c14ed92d0761584e3739397bde598d93be6a1e47 Mon Sep 17 00:00:00 2001 From: PastaPastaPasta <6443210+PastaPastaPasta@users.noreply.github.com> Date: Fri, 8 Mar 2024 00:28:53 -0600 Subject: [PATCH 066/191] refactor: resolve clippy warnings in rs-drive (#1752) --- .../src/drive/batch/drive_op_batch/mod.rs | 86 +++++++++---------- packages/rs-drive/src/drive/contract/mod.rs | 5 ++ packages/rs-drive/src/drive/document/mod.rs | 2 + .../rs-drive/src/drive/document/query/mod.rs | 6 +- .../document/query/query_documents/mod.rs | 1 - .../rs-drive/src/drive/document/update/mod.rs | 2 +- .../v0/mod.rs | 5 +- .../grove_operations/grove_clear/v0/mod.rs | 6 +- .../src/drive/grove_operations/mod.rs | 8 +- .../fetch_identity_contract_nonce/mod.rs | 3 + .../fetch/fetch_by_public_key_hashes/mod.rs | 6 +- .../fetch/nonce/fetch_identity_nonce/mod.rs | 3 + .../src/drive/identity/key/insert/mod.rs | 3 + .../drive/object_size_info/deletion_info.rs | 2 + .../drive/object_size_info/path_key_info.rs | 2 + packages/rs-drive/src/drive/open/mod.rs | 1 - .../mod.rs | 2 + .../v0/mod.rs | 2 + .../mod.rs | 2 + .../v0/mod.rs | 2 + packages/rs-drive/src/drive/test_utils.rs | 3 + packages/rs-drive/src/error/proof.rs | 2 + packages/rs-drive/src/query/mod.rs | 6 +- packages/rs-drive/tests/query_tests.rs | 2 +- 24 files changed, 95 insertions(+), 67 deletions(-) diff --git a/packages/rs-drive/src/drive/batch/drive_op_batch/mod.rs b/packages/rs-drive/src/drive/batch/drive_op_batch/mod.rs index 123580df30..52ac785026 100644 --- a/packages/rs-drive/src/drive/batch/drive_op_batch/mod.rs +++ b/packages/rs-drive/src/drive/batch/drive_op_batch/mod.rs @@ -53,7 +53,9 @@ pub trait DriveLowLevelOperationConverter { /// The drive operation context keeps track of changes that might affect other operations /// Notably Identity balance changes are kept track of pub struct DriveOperationContext { - //todo: why is this not being used? + #[allow(dead_code)] + #[deprecated(note = "This function is marked as unused.")] + #[allow(deprecated)] identity_balance_changes: BTreeMap<[u8; 32], i64>, } @@ -887,7 +889,6 @@ mod tests { let platform_version = PlatformVersion::latest(); - let mut drive_operations = vec![]; let db_transaction = drive.grove.start_transaction(); let contract = setup_contract( @@ -921,31 +922,29 @@ mod tests { ) .expect("expected to get document"); - let mut operations = vec![]; - - operations.push(AddOperation { - owned_document_info: OwnedDocumentInfo { - document_info: DocumentRefInfo(( - &person_document0, - StorageFlags::optional_default_as_cow(), - )), - owner_id: Some(random_owner_id0), + let operations = vec![ + AddOperation { + owned_document_info: OwnedDocumentInfo { + document_info: DocumentRefInfo(( + &person_document0, + StorageFlags::optional_default_as_cow(), + )), + owner_id: Some(random_owner_id0), + }, + override_document: false, }, - override_document: false, - }); - - operations.push(AddOperation { - owned_document_info: OwnedDocumentInfo { - document_info: DocumentRefInfo(( - &person_document1, - StorageFlags::optional_default_as_cow(), - )), - owner_id: Some(random_owner_id1), + AddOperation { + owned_document_info: OwnedDocumentInfo { + document_info: DocumentRefInfo(( + &person_document1, + StorageFlags::optional_default_as_cow(), + )), + owner_id: Some(random_owner_id1), + }, + override_document: false, }, - override_document: false, - }); - - drive_operations.push(DocumentOperation( + ]; + let drive_operations = vec![DocumentOperation( MultipleDocumentOperationsForSameContractDocumentType { document_operations: DocumentOperationsForContractDocumentType { operations, @@ -953,7 +952,7 @@ mod tests { document_type, }, }, - )); + )]; drive .apply_drive_operations( @@ -967,8 +966,6 @@ mod tests { // This was the setup now let's do the update - drive_operations = vec![]; - let person_document0 = json_document_to_document( "tests/supporting_files/contract/family/person0-older.json", Some(random_owner_id0.into()), @@ -985,23 +982,22 @@ mod tests { ) .expect("expected to get document"); - let mut operations = vec![]; - - operations.push(UpdateOperation(UpdateOperationInfo { - document: &person_document0, - serialized_document: None, - owner_id: Some(random_owner_id0), - storage_flags: None, - })); - - operations.push(UpdateOperation(UpdateOperationInfo { - document: &person_document1, - serialized_document: None, - owner_id: Some(random_owner_id1), - storage_flags: None, - })); + let operations = vec![ + UpdateOperation(UpdateOperationInfo { + document: &person_document0, + serialized_document: None, + owner_id: Some(random_owner_id0), + storage_flags: None, + }), + UpdateOperation(UpdateOperationInfo { + document: &person_document1, + serialized_document: None, + owner_id: Some(random_owner_id1), + storage_flags: None, + }), + ]; - drive_operations.push(DocumentOperation( + let drive_operations = vec![DocumentOperation( MultipleDocumentOperationsForSameContractDocumentType { document_operations: DocumentOperationsForContractDocumentType { operations, @@ -1009,7 +1005,7 @@ mod tests { document_type, }, }, - )); + )]; drive .apply_drive_operations( diff --git a/packages/rs-drive/src/drive/contract/mod.rs b/packages/rs-drive/src/drive/contract/mod.rs index a1e8a8370e..704e462aea 100644 --- a/packages/rs-drive/src/drive/contract/mod.rs +++ b/packages/rs-drive/src/drive/contract/mod.rs @@ -95,6 +95,9 @@ mod tests { use crate::tests::helpers::setup::setup_drive_with_initial_state_structure; use dpp::version::PlatformVersion; + #[allow(dead_code)] + #[deprecated(note = "This function is marked as unused.")] + #[allow(deprecated)] fn setup_deep_nested_50_contract() -> (Drive, DataContract) { let drive: Drive = setup_drive_with_initial_state_structure(); let platform_version = PlatformVersion::latest(); @@ -118,6 +121,8 @@ mod tests { } #[allow(dead_code)] + #[deprecated(note = "This function is marked as unused.")] + #[allow(deprecated)] fn setup_deep_nested_10_contract() -> (Drive, DataContract) { let drive: Drive = setup_drive_with_initial_state_structure(); let platform_version = PlatformVersion::latest(); diff --git a/packages/rs-drive/src/drive/document/mod.rs b/packages/rs-drive/src/drive/document/mod.rs index 58b28cd5bb..614890f5c7 100644 --- a/packages/rs-drive/src/drive/document/mod.rs +++ b/packages/rs-drive/src/drive/document/mod.rs @@ -147,6 +147,8 @@ fn contract_documents_keeping_history_primary_key_path_for_unknown_document_id( #[cfg(any(feature = "full", feature = "verify"))] #[allow(dead_code)] +#[deprecated(note = "This function is marked as unused.")] +#[allow(deprecated)] /// Returns the size of the path to a contract document. fn contract_documents_keeping_history_primary_key_path_for_document_id_size( document_type_name_len: u32, diff --git a/packages/rs-drive/src/drive/document/query/mod.rs b/packages/rs-drive/src/drive/document/query/mod.rs index ac0f06a31a..5daa25ed23 100644 --- a/packages/rs-drive/src/drive/document/query/mod.rs +++ b/packages/rs-drive/src/drive/document/query/mod.rs @@ -46,6 +46,8 @@ use grovedb::TransactionArg; use crate::drive::Drive; +#[cfg(feature = "fixtures-and-mocks")] +use crate::drive::verify::RootHash; #[cfg(feature = "fixtures-and-mocks")] use crate::error::query::QuerySyntaxError; #[cfg(feature = "fixtures-and-mocks")] @@ -289,7 +291,7 @@ impl Drive { block_info: Option, transaction: TransactionArg, protocol_version: Option, - ) -> Result<([u8; 32], Vec>, u64), Error> { + ) -> Result<(RootHash, Vec>, u64), Error> { let platform_version = PlatformVersion::get_version_or_current_or_latest(protocol_version)?; let mut drive_operations: Vec = vec![]; @@ -327,7 +329,7 @@ impl Drive { transaction: TransactionArg, drive_operations: &mut Vec, protocol_version: Option, - ) -> Result<([u8; 32], Vec>), Error> { + ) -> Result<(RootHash, Vec>), Error> { let platform_version = PlatformVersion::get_version_or_current_or_latest(protocol_version)?; let query = DriveQuery::from_cbor(query_cbor, contract, document_type, &self.config)?; diff --git a/packages/rs-drive/src/drive/document/query/query_documents/mod.rs b/packages/rs-drive/src/drive/document/query/query_documents/mod.rs index 362ddf218c..ca35f3a5e4 100644 --- a/packages/rs-drive/src/drive/document/query/query_documents/mod.rs +++ b/packages/rs-drive/src/drive/document/query/query_documents/mod.rs @@ -1,4 +1,3 @@ -use crate::drive::document::query::query_documents::v0::QueryDocumentsOutcomeV0; use crate::drive::Drive; use crate::error::drive::DriveError; use crate::error::Error; diff --git a/packages/rs-drive/src/drive/document/update/mod.rs b/packages/rs-drive/src/drive/document/update/mod.rs index cef2ccfd6c..edf3fac3a1 100644 --- a/packages/rs-drive/src/drive/document/update/mod.rs +++ b/packages/rs-drive/src/drive/document/update/mod.rs @@ -76,10 +76,10 @@ mod tests { use crate::drive::object_size_info::{DocumentAndContractInfo, OwnedDocumentInfo}; use crate::drive::Drive; + use crate::common::setup_contract; use crate::drive::document::tests::setup_dashpay; use crate::query::DriveQuery; use crate::tests::helpers::setup::{setup_drive, setup_drive_with_initial_state_structure}; - use crate::{common::setup_contract, drive::test_utils::TestEntropyGenerator}; use dpp::block::epoch::Epoch; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::conversion::value::v0::DataContractValueConversionMethodsV0; diff --git a/packages/rs-drive/src/drive/grove_operations/grove_apply_batch_with_add_costs/v0/mod.rs b/packages/rs-drive/src/drive/grove_operations/grove_apply_batch_with_add_costs/v0/mod.rs index d1cb90764d..1ada7f8918 100644 --- a/packages/rs-drive/src/drive/grove_operations/grove_apply_batch_with_add_costs/v0/mod.rs +++ b/packages/rs-drive/src/drive/grove_operations/grove_apply_batch_with_add_costs/v0/mod.rs @@ -11,7 +11,6 @@ use grovedb::batch::{BatchApplyOptions, GroveDbOp}; use grovedb::TransactionArg; use grovedb_costs::storage_cost::removal::StorageRemovedBytes::BasicStorageRemoval; use grovedb_costs::storage_cost::transition::OperationStorageTransitionType; -use tracing::Level; impl Drive { /// Applies the given groveDB operations batch and gets and passes the costs to `push_drive_operation_result`. @@ -45,7 +44,7 @@ impl Drive { // Clone ops only if we log them #[cfg(feature = "grovedb_operations_logging")] - let maybe_params_for_logs = if tracing::event_enabled!(target: "drive_grovedb_operations", Level::TRACE) + let maybe_params_for_logs = if tracing::event_enabled!(target: "drive_grovedb_operations", tracing::Level::TRACE) { let root_hash = self .grove @@ -158,7 +157,7 @@ impl Drive { ); #[cfg(feature = "grovedb_operations_logging")] - if tracing::event_enabled!(target: "drive_grovedb_operations", Level::TRACE) + if tracing::event_enabled!(target: "drive_grovedb_operations", tracing::Level::TRACE) && cost_context.value.is_ok() { let root_hash = self diff --git a/packages/rs-drive/src/drive/grove_operations/grove_clear/v0/mod.rs b/packages/rs-drive/src/drive/grove_operations/grove_clear/v0/mod.rs index 7801d9e5e5..6b97e162cb 100644 --- a/packages/rs-drive/src/drive/grove_operations/grove_clear/v0/mod.rs +++ b/packages/rs-drive/src/drive/grove_operations/grove_clear/v0/mod.rs @@ -3,7 +3,6 @@ use crate::error::Error; use grovedb::operations::delete::ClearOptions; use grovedb::TransactionArg; use grovedb_path::SubtreePath; -use tracing::Level; impl Drive { /// Pushes the `OperationCost` of deleting an element in groveDB to `drive_operations`. @@ -19,7 +18,7 @@ impl Drive { }; #[cfg(feature = "grovedb_operations_logging")] - let maybe_params_for_logs = if tracing::event_enabled!(target: "drive_grovedb_operations", Level::TRACE) + let maybe_params_for_logs = if tracing::event_enabled!(target: "drive_grovedb_operations", tracing::Level::TRACE) { let root_hash = self .grove @@ -33,6 +32,7 @@ impl Drive { }; // we will always return true if there is no error when we don't check for subtrees + #[allow(clippy::let_and_return)] // due to feature below; we must allow this lint here let result = self .grove .clear_subtree(path, Some(options), transaction) @@ -40,7 +40,7 @@ impl Drive { .map(|_| ()); #[cfg(feature = "grovedb_operations_logging")] - if tracing::event_enabled!(target: "drive_grovedb_operations", Level::TRACE) + if tracing::event_enabled!(target: "drive_grovedb_operations", tracing::Level::TRACE) && result.is_ok() { let root_hash = self diff --git a/packages/rs-drive/src/drive/grove_operations/mod.rs b/packages/rs-drive/src/drive/grove_operations/mod.rs index 8542905532..4991b9bc67 100644 --- a/packages/rs-drive/src/drive/grove_operations/mod.rs +++ b/packages/rs-drive/src/drive/grove_operations/mod.rs @@ -235,15 +235,15 @@ impl BatchInsertTreeApplyType { /// - A variant of `DirectQueryType::StatelessDirectQuery` if the current type is `BatchInsertTreeApplyType::StatelessBatchInsertTree`. /// - `DirectQueryType::StatefulDirectQuery` if the current type is `BatchInsertTreeApplyType::StatefulBatchInsertTree`. /// ``` - pub(crate) fn to_direct_query_type(&self) -> DirectQueryType { + pub(crate) fn to_direct_query_type(self) -> DirectQueryType { match self { BatchInsertTreeApplyType::StatelessBatchInsertTree { in_tree_using_sums, is_sum_tree, flags_len, } => DirectQueryType::StatelessDirectQuery { - in_tree_using_sums: *in_tree_using_sums, - query_target: QueryTarget::QueryTargetTree(*flags_len, *is_sum_tree), + in_tree_using_sums, + query_target: QueryTarget::QueryTargetTree(flags_len, is_sum_tree), }, BatchInsertTreeApplyType::StatefulBatchInsertTree => { DirectQueryType::StatefulDirectQuery @@ -371,6 +371,8 @@ impl DirectQueryType { /// let query_type = direct_query.add_reference_sizes(ref_sizes); /// ``` #[allow(dead_code)] + #[deprecated(note = "This function is marked as unused.")] + #[allow(deprecated)] pub(crate) fn add_reference_sizes(self, reference_sizes: Vec) -> QueryType { match self { DirectQueryType::StatelessDirectQuery { diff --git a/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/fetch_identity_contract_nonce/mod.rs b/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/fetch_identity_contract_nonce/mod.rs index 1b04e5100c..6d402e6698 100644 --- a/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/fetch_identity_contract_nonce/mod.rs +++ b/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/fetch_identity_contract_nonce/mod.rs @@ -73,6 +73,9 @@ impl Drive { /// # Returns /// /// Returns a `Result` containing an `Option` for the Identity's revision, otherwise an `Error` if the operation fails or the version is not supported. + #[allow(dead_code)] + #[deprecated(note = "This function is marked as unused.")] + #[allow(deprecated)] pub(crate) fn fetch_identity_contract_nonce_operations( &self, identity_id: [u8; 32], diff --git a/packages/rs-drive/src/drive/identity/fetch/fetch_by_public_key_hashes/mod.rs b/packages/rs-drive/src/drive/identity/fetch/fetch_by_public_key_hashes/mod.rs index b41b9587d2..8c3f7af159 100644 --- a/packages/rs-drive/src/drive/identity/fetch/fetch_by_public_key_hashes/mod.rs +++ b/packages/rs-drive/src/drive/identity/fetch/fetch_by_public_key_hashes/mod.rs @@ -58,11 +58,7 @@ mod tests { assert_eq!(public_keys.len(), 5); for (_, key) in public_keys { - let hash = key - .hash() - .expect("expected to get hash") - .try_into() - .expect("expected 20 bytes"); + let hash = key.hash().expect("expected to get hash"); if key.key_type().is_unique_key_type() { let identity_id = drive .fetch_identity_id_by_unique_public_key_hash( diff --git a/packages/rs-drive/src/drive/identity/fetch/nonce/fetch_identity_nonce/mod.rs b/packages/rs-drive/src/drive/identity/fetch/nonce/fetch_identity_nonce/mod.rs index 57d88f4641..888a59736d 100644 --- a/packages/rs-drive/src/drive/identity/fetch/nonce/fetch_identity_nonce/mod.rs +++ b/packages/rs-drive/src/drive/identity/fetch/nonce/fetch_identity_nonce/mod.rs @@ -64,6 +64,9 @@ impl Drive { /// # Returns /// /// Returns a `Result` containing an `Option` for the Identity's nonce, otherwise an `Error` if the operation fails or the version is not supported. + #[allow(dead_code)] + #[deprecated(note = "This function is marked as unused.")] + #[allow(deprecated)] pub(crate) fn fetch_identity_nonce_operations( &self, identity_id: [u8; 32], diff --git a/packages/rs-drive/src/drive/identity/key/insert/mod.rs b/packages/rs-drive/src/drive/identity/key/insert/mod.rs index d22e3ab2d2..e6d1fbe1ba 100644 --- a/packages/rs-drive/src/drive/identity/key/insert/mod.rs +++ b/packages/rs-drive/src/drive/identity/key/insert/mod.rs @@ -9,6 +9,9 @@ mod replace_key_in_storage; use dpp::identity::IdentityPublicKey; /// The contract apply info +#[allow(dead_code)] +#[deprecated(note = "This function is marked as unused.")] +#[allow(deprecated)] pub enum DataContractApplyInfo { /// Keys of the contract apply info Keys(Vec), diff --git a/packages/rs-drive/src/drive/object_size_info/deletion_info.rs b/packages/rs-drive/src/drive/object_size_info/deletion_info.rs index affc6dd8d5..a8372d5cdf 100644 --- a/packages/rs-drive/src/drive/object_size_info/deletion_info.rs +++ b/packages/rs-drive/src/drive/object_size_info/deletion_info.rs @@ -3,6 +3,8 @@ use crate::drive::object_size_info::PathInfo; /// Deletion Info #[allow(dead_code)] +#[deprecated(note = "This function is marked as unused.")] +#[allow(deprecated)] pub struct DeletionInfo<'a, const N: usize> { upper_path: PathInfo<'a, N>, lower_path: Vec>, diff --git a/packages/rs-drive/src/drive/object_size_info/path_key_info.rs b/packages/rs-drive/src/drive/object_size_info/path_key_info.rs index b3dad9d3a4..6290f83bf7 100644 --- a/packages/rs-drive/src/drive/object_size_info/path_key_info.rs +++ b/packages/rs-drive/src/drive/object_size_info/path_key_info.rs @@ -133,6 +133,8 @@ impl<'a, const N: usize> PathKeyInfo<'a, N> { /// Get the KeyInfoPath for grovedb estimated costs #[allow(dead_code)] + #[deprecated(note = "This function is marked as unused.")] + #[allow(deprecated)] pub(crate) fn convert_to_key_info_path(self) -> Result { match self { PathKey((path, key)) => { diff --git a/packages/rs-drive/src/drive/open/mod.rs b/packages/rs-drive/src/drive/open/mod.rs index f05ae1bfc6..5f3d00f1d2 100644 --- a/packages/rs-drive/src/drive/open/mod.rs +++ b/packages/rs-drive/src/drive/open/mod.rs @@ -9,7 +9,6 @@ use dpp::util::deserializer::ProtocolVersion; use grovedb::GroveDb; use platform_version::version::PlatformVersion; use std::path::Path; -use std::sync::RwLock; impl Drive { /// Opens GroveDB database diff --git a/packages/rs-drive/src/drive/operations/apply_partial_batch_grovedb_operations/mod.rs b/packages/rs-drive/src/drive/operations/apply_partial_batch_grovedb_operations/mod.rs index 064aed9089..6d7a171113 100644 --- a/packages/rs-drive/src/drive/operations/apply_partial_batch_grovedb_operations/mod.rs +++ b/packages/rs-drive/src/drive/operations/apply_partial_batch_grovedb_operations/mod.rs @@ -32,6 +32,8 @@ impl Drive { /// * `Result<(), Error>` - On success, returns `Ok(())`. On error, returns an `Error`. /// #[allow(dead_code)] + #[deprecated(note = "This function is marked as unused.")] + #[allow(deprecated)] pub(crate) fn apply_partial_batch_grovedb_operations( &self, estimated_costs_only_with_layer_info: Option< diff --git a/packages/rs-drive/src/drive/operations/apply_partial_batch_grovedb_operations/v0/mod.rs b/packages/rs-drive/src/drive/operations/apply_partial_batch_grovedb_operations/v0/mod.rs index e206fd17c4..40bd8b2e67 100644 --- a/packages/rs-drive/src/drive/operations/apply_partial_batch_grovedb_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/operations/apply_partial_batch_grovedb_operations/v0/mod.rs @@ -13,6 +13,8 @@ use std::collections::HashMap; impl Drive { #[allow(dead_code)] + #[deprecated(note = "This function is marked as unused.")] + #[allow(deprecated)] /// Applies a partial batch of groveDB operations if apply is True, otherwise gets the cost of the operations. pub(super) fn apply_partial_batch_grovedb_operations_v0( &self, diff --git a/packages/rs-drive/src/drive/operations/apply_partial_batch_low_level_drive_operations/mod.rs b/packages/rs-drive/src/drive/operations/apply_partial_batch_low_level_drive_operations/mod.rs index 0f93c267b7..73f4b38666 100644 --- a/packages/rs-drive/src/drive/operations/apply_partial_batch_low_level_drive_operations/mod.rs +++ b/packages/rs-drive/src/drive/operations/apply_partial_batch_low_level_drive_operations/mod.rs @@ -32,6 +32,8 @@ impl Drive { /// * `Result<(), Error>` - On success, returns `Ok(())`. On error, returns an `Error`. /// #[allow(dead_code)] + #[deprecated(note = "This function is marked as unused.")] + #[allow(deprecated)] pub(crate) fn apply_partial_batch_low_level_drive_operations( &self, estimated_costs_only_with_layer_info: Option< diff --git a/packages/rs-drive/src/drive/operations/apply_partial_batch_low_level_drive_operations/v0/mod.rs b/packages/rs-drive/src/drive/operations/apply_partial_batch_low_level_drive_operations/v0/mod.rs index 5e6dbb28a2..ec6e6fcf9e 100644 --- a/packages/rs-drive/src/drive/operations/apply_partial_batch_low_level_drive_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/operations/apply_partial_batch_low_level_drive_operations/v0/mod.rs @@ -13,6 +13,8 @@ impl Drive { //this will be used later /// Applies a batch of Drive operations to groveDB. #[allow(dead_code)] + #[deprecated(note = "This function is marked as unused.")] + #[allow(deprecated)] pub(super) fn apply_partial_batch_low_level_drive_operations_v0( &self, estimated_costs_only_with_layer_info: Option< diff --git a/packages/rs-drive/src/drive/test_utils.rs b/packages/rs-drive/src/drive/test_utils.rs index 8b11a919f4..f48d00d75b 100644 --- a/packages/rs-drive/src/drive/test_utils.rs +++ b/packages/rs-drive/src/drive/test_utils.rs @@ -10,6 +10,9 @@ pub(crate) struct TestEntropyGenerator { impl TestEntropyGenerator { /// new test entropy generator + #[allow(dead_code)] + #[deprecated(note = "This function is marked as unused.")] + #[allow(deprecated)] pub(crate) fn new() -> Self { Self { rng: RefCell::new(SmallRng::seed_from_u64(1337)), diff --git a/packages/rs-drive/src/error/proof.rs b/packages/rs-drive/src/error/proof.rs index 1d2965d724..f997c7c1d6 100644 --- a/packages/rs-drive/src/error/proof.rs +++ b/packages/rs-drive/src/error/proof.rs @@ -60,6 +60,8 @@ pub enum ProofError { }, } #[allow(dead_code)] +#[deprecated(note = "This function is marked as unused.")] +#[allow(deprecated)] fn get_error_code(error: &ProofError) -> u32 { match error { ProofError::TooManyElements(_) => 6000, diff --git a/packages/rs-drive/src/query/mod.rs b/packages/rs-drive/src/query/mod.rs index e2038a8d98..1feb4fa168 100644 --- a/packages/rs-drive/src/query/mod.rs +++ b/packages/rs-drive/src/query/mod.rs @@ -127,6 +127,8 @@ mod test_index; #[cfg(any(feature = "full", feature = "verify"))] pub use single_document_drive_query::SingleDocumentDriveQuery; +#[cfg(all(feature = "full", feature = "verify"))] +use crate::drive::verify::RootHash; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::data_contract::document_type::methods::DocumentTypeV0Methods; use dpp::document::DocumentV0Getters; @@ -1715,7 +1717,7 @@ impl<'a> DriveQuery<'a> { block_info: Option, transaction: TransactionArg, platform_version: &PlatformVersion, - ) -> Result<([u8; 32], Vec>, u64), Error> { + ) -> Result<(RootHash, Vec>, u64), Error> { let mut drive_operations = vec![]; let (root_hash, items) = self.execute_with_proof_only_get_elements_internal( drive, @@ -1746,7 +1748,7 @@ impl<'a> DriveQuery<'a> { transaction: TransactionArg, drive_operations: &mut Vec, platform_version: &PlatformVersion, - ) -> Result<([u8; 32], Vec>), Error> { + ) -> Result<(RootHash, Vec>), Error> { let path_query = self.construct_path_query_operations( drive, true, diff --git a/packages/rs-drive/tests/query_tests.rs b/packages/rs-drive/tests/query_tests.rs index a031dd9952..9f0eb82387 100644 --- a/packages/rs-drive/tests/query_tests.rs +++ b/packages/rs-drive/tests/query_tests.rs @@ -791,7 +791,7 @@ pub fn setup_dpns_test_with_data(path: &str) -> (Drive, DataContract) { let file = File::open(path).expect("should read domains from file"); - for domain_json in io::BufReader::new(file).lines().flatten() { + for domain_json in io::BufReader::new(file).lines().map_while(Result::ok) { let domain_json: serde_json::Value = serde_json::from_str(&domain_json).expect("should parse json"); From 3a84f7ae805974e11b9ddac0cd75c1dd40164e23 Mon Sep 17 00:00:00 2001 From: PastaPastaPasta <6443210+PastaPastaPasta@users.noreply.github.com> Date: Fri, 8 Mar 2024 01:21:16 -0600 Subject: [PATCH 067/191] refactor: resolve clippy warnings in wasm-dpp (#1753) --- .../wasm-dpp/src/data_contract/data_contract.rs | 4 +--- .../src/data_contract/data_contract_facade.rs | 2 +- .../data_contract_update_transition/mod.rs | 1 - .../data_contract_factory/data_contract_factory.rs | 13 ++++--------- packages/wasm-dpp/src/document/document_facade.rs | 9 ++++----- packages/wasm-dpp/src/document/extended_document.rs | 4 +++- packages/wasm-dpp/src/document/factory.rs | 6 +++--- packages/wasm-dpp/src/document/mod.rs | 7 ++++++- .../document_transition/mod.rs | 4 +++- .../document_batch_transition/mod.rs | 7 ++----- packages/wasm-dpp/src/errors/consensus/basic/mod.rs | 2 -- .../invalid_identity_contract_nonce_error.rs | 2 +- packages/wasm-dpp/src/identifier/mod.rs | 1 - packages/wasm-dpp/src/identity/errors/mod.rs | 2 -- packages/wasm-dpp/src/identity/identity_facade.rs | 3 +-- packages/wasm-dpp/src/identity/identity_factory.rs | 2 +- .../src/identity/identity_public_key/mod.rs | 2 +- .../identity_create_transition.rs | 2 +- .../transition.rs | 2 +- .../to_object.rs | 2 +- .../transition.rs | 2 +- .../identity_topup_transition.rs | 5 +---- .../identity_update_transition.rs | 1 - packages/wasm-dpp/src/metadata.rs | 2 +- .../state_transition/state_transition_factory.rs | 1 - packages/wasm-dpp/src/utils.rs | 9 +++++++++ 26 files changed, 46 insertions(+), 51 deletions(-) diff --git a/packages/wasm-dpp/src/data_contract/data_contract.rs b/packages/wasm-dpp/src/data_contract/data_contract.rs index b22dd39916..8edb345b8d 100644 --- a/packages/wasm-dpp/src/data_contract/data_contract.rs +++ b/packages/wasm-dpp/src/data_contract/data_contract.rs @@ -8,7 +8,7 @@ use wasm_bindgen::prelude::*; use dpp::data_contract::schema::DataContractSchemaMethodsV0; use dpp::data_contract::DataContract; -use dpp::platform_value::{platform_value, Bytes32, Value}; +use dpp::platform_value::{platform_value, Value}; use dpp::data_contract::accessors::v0::{DataContractV0Getters, DataContractV0Setters}; use dpp::data_contract::config::DataContractConfig; @@ -153,8 +153,6 @@ impl DataContractWasm { .document_type_for_name(doc_type) .with_js_error()?; - let binary_paths_o = document_type.binary_paths(); - let mut binary_paths = BTreeMap::new(); document_type.binary_paths().iter().for_each(|path| { diff --git a/packages/wasm-dpp/src/data_contract/data_contract_facade.rs b/packages/wasm-dpp/src/data_contract/data_contract_facade.rs index d412dd9fd9..033ac7b827 100644 --- a/packages/wasm-dpp/src/data_contract/data_contract_facade.rs +++ b/packages/wasm-dpp/src/data_contract/data_contract_facade.rs @@ -31,7 +31,7 @@ impl From for DataContractFacadeWasm { pub struct DataContractFacadeWasm(pub(crate) Arc); impl DataContractFacadeWasm { - pub fn new(protocol_version: u32, entropy_generator: ExternalEntropyGenerator) -> Self { + pub fn new(protocol_version: u32) -> Self { let inner = DataContractFacade::new(protocol_version).expect("should create facade"); Self(Arc::new(inner)) diff --git a/packages/wasm-dpp/src/data_contract/state_transition/data_contract_update_transition/mod.rs b/packages/wasm-dpp/src/data_contract/state_transition/data_contract_update_transition/mod.rs index 7104b840d1..bc76954ccd 100644 --- a/packages/wasm-dpp/src/data_contract/state_transition/data_contract_update_transition/mod.rs +++ b/packages/wasm-dpp/src/data_contract/state_transition/data_contract_update_transition/mod.rs @@ -3,7 +3,6 @@ // pub use validation::*; use dpp::consensus::ConsensusError; -use dpp::ed25519_dalek::ed25519::signature::SignerMut; use dpp::serialization::{PlatformDeserializable, PlatformSerializable}; use dpp::state_transition::data_contract_update_transition::accessors::DataContractUpdateTransitionAccessorsV0; use dpp::state_transition::data_contract_update_transition::DataContractUpdateTransition; diff --git a/packages/wasm-dpp/src/data_contract_factory/data_contract_factory.rs b/packages/wasm-dpp/src/data_contract_factory/data_contract_factory.rs index 1275063bce..3036b9d849 100644 --- a/packages/wasm-dpp/src/data_contract_factory/data_contract_factory.rs +++ b/packages/wasm-dpp/src/data_contract_factory/data_contract_factory.rs @@ -30,16 +30,11 @@ impl DataContractFactoryWasm { #[wasm_bindgen(constructor)] pub fn new( protocol_version: u32, - external_entropy_generator_arg: Option, ) -> DataContractFactoryWasm { - if let Some(external_entropy_generator) = external_entropy_generator_arg { - DataContractFactory::new(protocol_version) - } else { - DataContractFactory::new(protocol_version) - } - .with_js_error() - .expect("should create a factory") - .into() + DataContractFactory::new(protocol_version) + .with_js_error() + .expect("should create a factory") + .into() } #[wasm_bindgen(js_name=create)] diff --git a/packages/wasm-dpp/src/document/document_facade.rs b/packages/wasm-dpp/src/document/document_facade.rs index bbb4d40524..609794eaa9 100644 --- a/packages/wasm-dpp/src/document/document_facade.rs +++ b/packages/wasm-dpp/src/document/document_facade.rs @@ -1,5 +1,4 @@ -use std::sync::Arc; - +use std::rc::Rc; use wasm_bindgen::{prelude::*, JsValue}; use crate::document::factory::DocumentFactoryWASM; @@ -11,14 +10,14 @@ use crate::document::state_transition::document_batch_transition::DocumentsBatch #[wasm_bindgen(js_name=DocumentFacade)] pub struct DocumentFacadeWasm { // validator: Arc, - factory: Arc, + factory: Rc, // data_contract_fetcher_and_validator: Arc, } impl DocumentFacadeWasm { pub fn new_with_arc( // document_validator: Arc, - document_factory: Arc, + document_factory: Rc, // data_contract_fetcher_and_validator: Arc, ) -> Self { Self { @@ -33,7 +32,7 @@ impl DocumentFacadeWasm { #[wasm_bindgen(constructor)] pub fn new(document_factory: DocumentFactoryWASM) -> Self { Self { - factory: Arc::new(document_factory), + factory: Rc::new(document_factory), } } diff --git a/packages/wasm-dpp/src/document/extended_document.rs b/packages/wasm-dpp/src/document/extended_document.rs index 7d186fa7f3..5a8a26f495 100644 --- a/packages/wasm-dpp/src/document/extended_document.rs +++ b/packages/wasm-dpp/src/document/extended_document.rs @@ -11,7 +11,6 @@ use dpp::util::json_value::JsonValueExt; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::document::serialization_traits::ExtendedDocumentPlatformConversionMethodsV0; use dpp::platform_value::converter::serde_json::BTreeValueJsonConverter; -use dpp::serialization::PlatformSerializable; use dpp::version::PlatformVersion; use dpp::ProtocolError; use serde::{Deserialize, Serialize}; @@ -363,6 +362,9 @@ impl ExtendedDocumentWasm { } impl ExtendedDocumentWasm { + #[allow(dead_code)] + #[deprecated(note = "This function is marked as unused.")] + #[allow(deprecated)] fn get_binary_type_of_path(&self, path: &String) -> Result { let document_type = self.0.document_type().with_js_error()?; diff --git a/packages/wasm-dpp/src/document/factory.rs b/packages/wasm-dpp/src/document/factory.rs index 88934bacc5..22f8cd0ff4 100644 --- a/packages/wasm-dpp/src/document/factory.rs +++ b/packages/wasm-dpp/src/document/factory.rs @@ -118,15 +118,15 @@ impl DocumentFactoryWASM { js_sys::Object::entries(nonce_counter_value) .iter() .for_each(|entry| { - let key_value = js_sys::Array::try_from(entry.clone()).unwrap(); + let key_value = js_sys::Array::from(&entry); let identity_id = identifier_from_js_value(&key_value.get(0)).unwrap(); let contract_ids = key_value.get(1); let contract_ids = js_sys::Object::try_from(&contract_ids).unwrap(); - js_sys::Object::entries(&contract_ids) + js_sys::Object::entries(contract_ids) .iter() .for_each(|entry| { - let key_value = js_sys::Array::try_from(entry.clone()).unwrap(); + let key_value = js_sys::Array::from(&entry); let contract_id = identifier_from_js_value(&key_value.get(0)).unwrap(); let nonce = key_value.get(1).as_f64().unwrap() as u64; nonce_counter.insert((identity_id, contract_id), nonce); diff --git a/packages/wasm-dpp/src/document/mod.rs b/packages/wasm-dpp/src/document/mod.rs index f600c00ef6..42b176856b 100644 --- a/packages/wasm-dpp/src/document/mod.rs +++ b/packages/wasm-dpp/src/document/mod.rs @@ -32,7 +32,6 @@ use dpp::document::{Document, DocumentV0Setters, EXTENDED_DOCUMENT_IDENTIFIER_FI pub use extended_document::ExtendedDocumentWasm; use dpp::identity::TimestampMillis; -use dpp::platform_value::btreemap_extensions::BTreeValueMapReplacementPathHelper; use dpp::platform_value::converter::serde_json::BTreeValueJsonConverter; use dpp::platform_value::ReplacementType; use dpp::platform_value::Value; @@ -51,6 +50,9 @@ pub(crate) struct ConversionOptions { pub skip_identifiers_conversion: bool, } +#[allow(dead_code)] +#[deprecated(note = "This function is marked as unused.")] +#[allow(deprecated)] pub(super) enum BinaryType { Identifier, Buffer, @@ -315,6 +317,9 @@ impl DocumentWasm { } impl DocumentWasm { + #[allow(dead_code)] + #[deprecated(note = "This function is marked as unused.")] + #[allow(deprecated)] fn get_binary_type_of_path( &self, path: &String, diff --git a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/document_transition/mod.rs b/packages/wasm-dpp/src/document/state_transition/document_batch_transition/document_transition/mod.rs index 0b7ba08b84..6c1f46845e 100644 --- a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/document_transition/mod.rs +++ b/packages/wasm-dpp/src/document/state_transition/document_batch_transition/document_transition/mod.rs @@ -6,7 +6,6 @@ mod document_create_transition; // pub use document_delete_transition::*; // pub use document_replace_transition::*; -use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::platform_value::Value; use dpp::prelude::TimestampMillis; use dpp::state_transition::documents_batch_transition::document_transition::action_type::TransitionActionTypeGetter; @@ -277,6 +276,9 @@ impl Inner for DocumentTransitionWasm { // } // } +#[allow(dead_code)] +#[deprecated(note = "This function is marked as unused.")] +#[allow(deprecated)] pub(crate) fn to_object<'a>( value: Value, options: &JsValue, diff --git a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/mod.rs b/packages/wasm-dpp/src/document/state_transition/document_batch_transition/mod.rs index ec3b92a7f2..e9eb452e80 100644 --- a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/mod.rs +++ b/packages/wasm-dpp/src/document/state_transition/document_batch_transition/mod.rs @@ -3,7 +3,6 @@ use dpp::identity::KeyID; use dpp::{ prelude::Identifier, state_transition::{StateTransitionLike, StateTransitionType}, - util::json_value::JsonValueExt, ProtocolError, }; use js_sys::Array; @@ -14,9 +13,7 @@ use dpp::consensus::ConsensusError; use dpp::platform_value::BinaryData; use dpp::serialization::PlatformSerializable; use dpp::state_transition::documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; -use dpp::state_transition::documents_batch_transition::document_transition::{ - DocumentTransition, DocumentTransitionV0Methods, -}; +use dpp::state_transition::documents_batch_transition::document_transition::DocumentTransition; use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; use dpp::state_transition::StateTransition; use wasm_bindgen::prelude::*; @@ -25,7 +22,7 @@ use crate::{ bls_adapter::{BlsAdapter, JsBlsAdapter}, buffer::Buffer, identifier::IdentifierWrapper, - utils::{Inner, IntoWasm, WithJsError}, + utils::{IntoWasm, WithJsError}, IdentityPublicKeyWasm, }; diff --git a/packages/wasm-dpp/src/errors/consensus/basic/mod.rs b/packages/wasm-dpp/src/errors/consensus/basic/mod.rs index d1bc60b4c3..93a4a87d4e 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/mod.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/mod.rs @@ -25,8 +25,6 @@ pub use json_schema_compilation_error::*; pub use json_schema_error::*; pub use public_key_is_disabled_error::*; pub use public_key_security_level_not_met_error::*; -#[cfg(test)] -pub use test_consensus_error::*; pub use unsupported_protocol_version_error::*; pub use unsupported_version_error::*; pub use wrong_public_key_purpose_error::*; diff --git a/packages/wasm-dpp/src/errors/consensus/state/identity/invalid_identity_contract_nonce_error.rs b/packages/wasm-dpp/src/errors/consensus/state/identity/invalid_identity_contract_nonce_error.rs index 41f4bf76ca..7f54347cd9 100644 --- a/packages/wasm-dpp/src/errors/consensus/state/identity/invalid_identity_contract_nonce_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/state/identity/invalid_identity_contract_nonce_error.rs @@ -28,7 +28,7 @@ impl InvalidIdentityNonceErrorWasm { pub fn current_identity_contract_nonce(&self) -> Option { self.inner .current_identity_contract_nonce() - .map(|nonce| *nonce as u64) + .map(|nonce| *nonce) } #[wasm_bindgen(js_name=getSettingIdentityContractNonce)] diff --git a/packages/wasm-dpp/src/identifier/mod.rs b/packages/wasm-dpp/src/identifier/mod.rs index a4da431e02..ea6c5b95a6 100644 --- a/packages/wasm-dpp/src/identifier/mod.rs +++ b/packages/wasm-dpp/src/identifier/mod.rs @@ -1,6 +1,5 @@ use dpp::prelude::Identifier; use itertools::Itertools; -pub use serde::{Deserialize, Serialize}; use serde_json::Value; use wasm_bindgen::prelude::*; diff --git a/packages/wasm-dpp/src/identity/errors/mod.rs b/packages/wasm-dpp/src/identity/errors/mod.rs index 857500f06d..32ce0974de 100644 --- a/packages/wasm-dpp/src/identity/errors/mod.rs +++ b/packages/wasm-dpp/src/identity/errors/mod.rs @@ -1,5 +1,3 @@ -pub use asset_lock_output_not_found_error::*; -pub use asset_lock_transaction_is_not_found_error::*; pub use invalid_identity_error::*; pub use unknown_asset_lock_proof_type_error::*; diff --git a/packages/wasm-dpp/src/identity/identity_facade.rs b/packages/wasm-dpp/src/identity/identity_facade.rs index 941c61d19b..5bf8c68d5f 100644 --- a/packages/wasm-dpp/src/identity/identity_facade.rs +++ b/packages/wasm-dpp/src/identity/identity_facade.rs @@ -23,9 +23,8 @@ use crate::with_js_error; use dpp::dashcore::{consensus, InstantLock, Transaction}; use crate::identity::IdentityWasm; -use dpp::fee::Credits; use dpp::identity::core_script::CoreScript; -use dpp::prelude::{IdentityNonce, Revision}; +use dpp::prelude::IdentityNonce; use dpp::withdrawal::Pooling; use dpp::NonConsensusError; use serde::Deserialize; diff --git a/packages/wasm-dpp/src/identity/identity_factory.rs b/packages/wasm-dpp/src/identity/identity_factory.rs index 4a0aea0683..cd99678be5 100644 --- a/packages/wasm-dpp/src/identity/identity_factory.rs +++ b/packages/wasm-dpp/src/identity/identity_factory.rs @@ -18,7 +18,7 @@ use crate::{ }; use dpp::dashcore::{consensus, InstantLock, Transaction}; -use dpp::prelude::{Identity, IdentityNonce, Revision}; +use dpp::prelude::{Identity, IdentityNonce}; use serde::Deserialize; use std::convert::TryInto; diff --git a/packages/wasm-dpp/src/identity/identity_public_key/mod.rs b/packages/wasm-dpp/src/identity/identity_public_key/mod.rs index 4565733075..850d696fc4 100644 --- a/packages/wasm-dpp/src/identity/identity_public_key/mod.rs +++ b/packages/wasm-dpp/src/identity/identity_public_key/mod.rs @@ -1,4 +1,4 @@ -pub use serde::{Deserialize, Serialize}; +pub use serde::Serialize; use std::convert::TryInto; use wasm_bindgen::prelude::*; diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs index 21964f9361..87b6adb762 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs @@ -28,7 +28,7 @@ use crate::bls_adapter::JsBlsAdapter; use crate::utils::{generic_of_js_val, WithJsError}; use dpp::platform_value::string_encoding; use dpp::platform_value::string_encoding::Encoding; -use dpp::serialization::{PlatformSerializable, ValueConvertible}; +use dpp::serialization::PlatformSerializable; use dpp::state_transition::identity_create_transition::accessors::IdentityCreateTransitionAccessorsV0; use dpp::state_transition::StateTransition; use dpp::{ diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_credit_transfer_transition/transition.rs b/packages/wasm-dpp/src/identity/state_transition/identity_credit_transfer_transition/transition.rs index 2c44a7fb37..93d1a24a27 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_credit_transfer_transition/transition.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_credit_transfer_transition/transition.rs @@ -15,7 +15,7 @@ use dpp::identifier::Identifier; use dpp::identity::KeyType; use dpp::platform_value::string_encoding::Encoding; use dpp::platform_value::{string_encoding, BinaryData}; -use dpp::serialization::{PlatformSerializable, ValueConvertible}; +use dpp::serialization::PlatformSerializable; use dpp::state_transition::identity_credit_transfer_transition::accessors::IdentityCreditTransferTransitionAccessorsV0; use dpp::state_transition::identity_credit_transfer_transition::IdentityCreditTransferTransition; diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/to_object.rs b/packages/wasm-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/to_object.rs index 0135bcbb91..b0dc0002c8 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/to_object.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/to_object.rs @@ -1,7 +1,7 @@ use dpp::identity::KeyID; use dpp::identity::core_script::CoreScript; -use dpp::prelude::{IdentityNonce, Revision}; +use dpp::prelude::IdentityNonce; use dpp::state_transition::identity_credit_withdrawal_transition::accessors::IdentityCreditWithdrawalTransitionAccessorsV0; use dpp::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition; use dpp::state_transition::StateTransitionIdentitySigned; diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/transition.rs b/packages/wasm-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/transition.rs index 915de97d49..0ac2899c57 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/transition.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/transition.rs @@ -16,7 +16,7 @@ use dpp::identity::KeyType; use dpp::platform_value; use dpp::platform_value::string_encoding::Encoding; use dpp::platform_value::{string_encoding, BinaryData}; -use dpp::serialization::{PlatformSerializable, ValueConvertible}; +use dpp::serialization::PlatformSerializable; use dpp::state_transition::identity_credit_withdrawal_transition::accessors::IdentityCreditWithdrawalTransitionAccessorsV0; use dpp::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition; use dpp::state_transition::StateTransitionLike; diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_topup_transition/identity_topup_transition.rs b/packages/wasm-dpp/src/identity/state_transition/identity_topup_transition/identity_topup_transition.rs index e26ff9c7bc..0de70583fa 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_topup_transition/identity_topup_transition.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_topup_transition/identity_topup_transition.rs @@ -7,7 +7,6 @@ use crate::errors::from_dpp_err; use dpp::identity::state_transition::AssetLockProved; use dpp::identity::KeyType; use dpp::platform_value::BinaryData; -use dpp::serialization::ValueConvertible; use dpp::version::PlatformVersion; @@ -67,9 +66,7 @@ impl IdentityTopUpTransitionWasm { pub fn set_asset_lock_proof(&mut self, asset_lock_proof: JsValue) -> Result<(), JsValue> { let asset_lock_proof = create_asset_lock_proof_from_wasm_instance(&asset_lock_proof)?; - self.0.set_asset_lock_proof(asset_lock_proof); - - Ok(()) + self.0.set_asset_lock_proof(asset_lock_proof).map_err(from_dpp_err) } #[wasm_bindgen(getter, js_name=assetLockProof)] diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/identity_update_transition.rs b/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/identity_update_transition.rs index 474d11ab56..79d50f80f0 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/identity_update_transition.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/identity_update_transition.rs @@ -27,7 +27,6 @@ use dpp::platform_value::string_encoding::Encoding; use dpp::platform_value::{string_encoding, BinaryData}; use dpp::prelude::Revision; use dpp::serialization::PlatformSerializable; -use dpp::serialization::ValueConvertible; use dpp::state_transition::identity_update_transition::accessors::IdentityUpdateTransitionAccessorsV0; use dpp::state_transition::identity_update_transition::IdentityUpdateTransition; use dpp::state_transition::public_key_in_creation::IdentityPublicKeyInCreation; diff --git a/packages/wasm-dpp/src/metadata.rs b/packages/wasm-dpp/src/metadata.rs index 2ba4a9e1b8..e2a19afdf0 100644 --- a/packages/wasm-dpp/src/metadata.rs +++ b/packages/wasm-dpp/src/metadata.rs @@ -1,6 +1,6 @@ #![allow(clippy::from_over_into)] -pub use serde::{Deserialize, Serialize}; +pub use serde::Serialize; use wasm_bindgen::prelude::*; use crate::utils::ToSerdeJSONExt; diff --git a/packages/wasm-dpp/src/state_transition/state_transition_factory.rs b/packages/wasm-dpp/src/state_transition/state_transition_factory.rs index 63d53bf4dd..9941bc9a34 100644 --- a/packages/wasm-dpp/src/state_transition/state_transition_factory.rs +++ b/packages/wasm-dpp/src/state_transition/state_transition_factory.rs @@ -58,7 +58,6 @@ impl StateTransitionFactoryWasm { StateTransition::DocumentsBatch(st) => { Ok(DocumentsBatchTransitionWasm::from(st).into()) } - _ => Err("Unsupported state transition type".into()), }, Err(dpp::ProtocolError::StateTransitionError(e)) => match e { StateTransitionError::InvalidStateTransitionError { diff --git a/packages/wasm-dpp/src/utils.rs b/packages/wasm-dpp/src/utils.rs index 5ea7f849ab..2e2879a723 100644 --- a/packages/wasm-dpp/src/utils.rs +++ b/packages/wasm-dpp/src/utils.rs @@ -66,6 +66,9 @@ where iter.into_iter().map(|v| v.into()).collect() } +#[allow(dead_code)] +#[deprecated(note = "This function is marked as unused.")] +#[allow(deprecated)] pub fn to_vec_of_serde_values( values: impl IntoIterator>, ) -> Result, JsValue> { @@ -229,6 +232,9 @@ pub fn get_bool_from_options( } } +#[allow(dead_code)] +#[deprecated(note = "This function is marked as unused.")] +#[allow(deprecated)] pub fn get_class_name(value: &JsValue) -> String { js_sys::Object::get_prototype_of(value) .constructor() @@ -236,6 +242,9 @@ pub fn get_class_name(value: &JsValue) -> String { .into() } +#[allow(dead_code)] +#[deprecated(note = "This function is marked as unused.")] +#[allow(deprecated)] pub fn try_to_u64(value: JsValue) -> Result { if value.is_bigint() { js_sys::BigInt::new(&value) From 06fa6f51dd79311c8371112d1042a01d1b5f5f52 Mon Sep 17 00:00:00 2001 From: PastaPastaPasta <6443210+PastaPastaPasta@users.noreply.github.com> Date: Fri, 8 Mar 2024 01:38:27 -0600 Subject: [PATCH 068/191] refactor: resolve a few clippy warnings in dapi-grpc, rs-drive-proof-verifier, rs-platform-serialization, rs-platform-serialization-derive, rs-platform-value, rs-sdk, strategy-tests (#1756) --- .../src/derive_bincode.rs | 3 ++ .../src/lib.rs | 2 ++ .../rs-platform-serialization/src/de/impls.rs | 6 ++++ .../rs-platform-serialization/src/enc/mod.rs | 5 ++++ .../src/features/impl_std.rs | 16 +++++++++- packages/rs-platform-value/src/pointer.rs | 30 +++++++++---------- .../src/value_serialization/mod.rs | 26 +++++++--------- packages/rs-sdk/src/core/transaction.rs | 1 - packages/rs-sdk/src/mock.rs | 2 -- packages/rs-sdk/src/platform/fetch.rs | 1 - .../tests/fetch/identity_contract_nonce.rs | 12 ++------ packages/strategy-tests/src/lib.rs | 11 ++++--- packages/strategy-tests/src/transitions.rs | 2 -- 13 files changed, 64 insertions(+), 53 deletions(-) diff --git a/packages/rs-platform-serialization-derive/src/derive_bincode.rs b/packages/rs-platform-serialization-derive/src/derive_bincode.rs index 9583f9fb97..74af5c330b 100644 --- a/packages/rs-platform-serialization-derive/src/derive_bincode.rs +++ b/packages/rs-platform-serialization-derive/src/derive_bincode.rs @@ -59,6 +59,9 @@ pub(crate) fn derive_decode_inner(input: TokenStream) -> Result { generator.finish() } +#[allow(dead_code)] +#[deprecated(note = "This function is marked as unused.")] +#[allow(deprecated)] pub(crate) fn derive_borrow_decode_inner(input: TokenStream) -> Result { let parse = Parse::new(input)?; let (mut generator, attributes, body) = parse.into_generator(); diff --git a/packages/rs-platform-serialization-derive/src/lib.rs b/packages/rs-platform-serialization-derive/src/lib.rs index 46b8f0ce6e..e78576cb03 100644 --- a/packages/rs-platform-serialization-derive/src/lib.rs +++ b/packages/rs-platform-serialization-derive/src/lib.rs @@ -26,7 +26,9 @@ struct VersionAttributes { unversioned: bool, platform_serialize_into: Option, platform_version_path: Option, + #[allow(dead_code)] // TODO this is never read allow_prepend_version: bool, + #[allow(dead_code)] // TODO this is never read force_prepend_version: bool, } diff --git a/packages/rs-platform-serialization/src/de/impls.rs b/packages/rs-platform-serialization/src/de/impls.rs index 59bcaeb90d..36ed3cb3fd 100644 --- a/packages/rs-platform-serialization/src/de/impls.rs +++ b/packages/rs-platform-serialization/src/de/impls.rs @@ -689,6 +689,9 @@ where } } +#[allow(dead_code)] +#[deprecated(note = "This function is marked as unused.")] +#[allow(deprecated)] const UTF8_CHAR_WIDTH: [u8; 256] = [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x1F @@ -709,6 +712,9 @@ const UTF8_CHAR_WIDTH: [u8; 256] = [ ]; // This function is a copy of core::str::utf8_char_width +#[allow(dead_code)] +#[deprecated(note = "This function is marked as unused.")] +#[allow(deprecated)] const fn utf8_char_width(b: u8) -> usize { UTF8_CHAR_WIDTH[b as usize] as usize } diff --git a/packages/rs-platform-serialization/src/enc/mod.rs b/packages/rs-platform-serialization/src/enc/mod.rs index 6db99cda0f..75bcf2c758 100644 --- a/packages/rs-platform-serialization/src/enc/mod.rs +++ b/packages/rs-platform-serialization/src/enc/mod.rs @@ -12,6 +12,9 @@ pub(crate) struct VecWriter { impl VecWriter { /// Create a new vec writer with the given capacity + #[allow(dead_code)] + #[deprecated(note = "This function is marked as unused.")] + #[allow(deprecated)] pub fn with_capacity(cap: usize) -> Self { Self { inner: Vec::with_capacity(cap), @@ -19,6 +22,8 @@ impl VecWriter { } // May not be used in all feature combinations #[allow(dead_code)] + #[deprecated(note = "This function is marked as unused.")] + #[allow(deprecated)] pub(crate) fn collect(self) -> Vec { self.inner } diff --git a/packages/rs-platform-serialization/src/features/impl_std.rs b/packages/rs-platform-serialization/src/features/impl_std.rs index 620087e97b..8f2f00ad6a 100644 --- a/packages/rs-platform-serialization/src/features/impl_std.rs +++ b/packages/rs-platform-serialization/src/features/impl_std.rs @@ -26,6 +26,9 @@ use std::{ /// /// [config]: config/index.html #[cfg_attr(docsrs, doc(cfg(feature = "std")))] +#[allow(dead_code)] +#[deprecated(note = "This function is marked as unused.")] +#[allow(deprecated)] pub fn platform_versioned_decode_from_std_read( src: &mut R, config: C, @@ -40,6 +43,9 @@ pub(crate) struct IoReader { } impl IoReader { + #[allow(dead_code)] + #[deprecated(note = "This function is marked as unused.")] + #[allow(deprecated)] pub fn new(reader: R) -> Self { Self { reader } } @@ -66,6 +72,9 @@ where /// /// [config]: config/index.html #[cfg_attr(docsrs, doc(cfg(feature = "std")))] +#[allow(dead_code)] +#[deprecated(note = "This function is marked as unused.")] +#[allow(deprecated)] pub fn encode_into_std_write( val: E, dst: &mut W, @@ -83,13 +92,18 @@ pub(crate) struct IoWriter<'a, W: std::io::Write> { } impl<'a, W: std::io::Write> IoWriter<'a, W> { + #[allow(dead_code)] + #[deprecated(note = "This function is marked as unused.")] + #[allow(deprecated)] pub fn new(writer: &'a mut W) -> Self { Self { writer, bytes_written: 0, } } - + #[allow(dead_code)] + #[deprecated(note = "This function is marked as unused.")] + #[allow(deprecated)] pub fn bytes_written(&self) -> usize { self.bytes_written } diff --git a/packages/rs-platform-value/src/pointer.rs b/packages/rs-platform-value/src/pointer.rs index 79cbd5b2c1..fa42add829 100644 --- a/packages/rs-platform-value/src/pointer.rs +++ b/packages/rs-platform-value/src/pointer.rs @@ -71,24 +71,22 @@ impl Value { /// ``` /// use platform_value::Value; /// - /// fn main() { - /// use platform_value::platform_value; - /// let mut value: Value = platform_value!({"x": 1.0, "y": 2.0}); + /// use platform_value::platform_value; + /// let mut value: Value = platform_value!({"x": 1.0, "y": 2.0}); /// - /// // Check value using read-only pointer - /// assert_eq!(value.pointer("/x"), Some(&1.0.into())); - /// // Change value with direct assignment - /// *value.pointer_mut("/x").unwrap() = 1.5.into(); - /// // Check that new value was written - /// assert_eq!(value.pointer("/x"), Some(&1.5.into())); - /// // Or change the value only if it exists - /// value.pointer_mut("/x").map(|v| *v = 1.5.into()); + /// // Check value using read-only pointer + /// assert_eq!(value.pointer("/x"), Some(&1.0.into())); + /// // Change value with direct assignment + /// *value.pointer_mut("/x").unwrap() = 1.5.into(); + /// // Check that new value was written + /// assert_eq!(value.pointer("/x"), Some(&1.5.into())); + /// // Or change the value only if it exists + /// value.pointer_mut("/x").map(|v| *v = 1.5.into()); /// - /// // "Steal" ownership of a value. Can replace with any valid Value. - /// let old_x = value.pointer_mut("/x").map(Value::take).unwrap(); - /// assert_eq!(old_x, 1.5); - /// assert_eq!(value.pointer("/x").unwrap(), &Value::Null); - /// } + /// // "Steal" ownership of a value. Can replace with any valid Value. + /// let old_x = value.pointer_mut("/x").map(Value::take).unwrap(); + /// assert_eq!(old_x, 1.5); + /// assert_eq!(value.pointer("/x").unwrap(), &Value::Null); /// ``` pub fn pointer_mut(&mut self, pointer: &str) -> Option<&mut Value> { if pointer.is_empty() { diff --git a/packages/rs-platform-value/src/value_serialization/mod.rs b/packages/rs-platform-value/src/value_serialization/mod.rs index e3af45fdba..05666781a5 100644 --- a/packages/rs-platform-value/src/value_serialization/mod.rs +++ b/packages/rs-platform-value/src/value_serialization/mod.rs @@ -52,13 +52,11 @@ pub mod ser; /// ``` /// use std::collections::BTreeMap; /// -/// fn main() { -/// // The keys in this map are vectors, not strings. -/// let mut map = BTreeMap::new(); -/// map.insert(vec![32, 64], "x86"); +/// // The keys in this map are vectors, not strings. +/// let mut map = BTreeMap::new(); +/// map.insert(vec![32, 64], "x86"); /// -/// println!("{}", platform_value::to_value(map).unwrap_err()); -/// } +/// println!("{}", platform_value::to_value(map).unwrap_err()); /// ``` pub fn to_value(value: T) -> Result where @@ -81,16 +79,14 @@ where /// location: String, /// } /// -/// fn main() { -/// // The type of `j` is `serde_json::Value` -/// let j = platform_value!({ -/// "fingerprint": "0xF9BA143B95FF6D82", -/// "location": "Menlo Park, CA" -/// }); +/// // The type of `j` is `serde_json::Value` +/// let j = platform_value!({ +/// "fingerprint": "0xF9BA143B95FF6D82", +/// "location": "Menlo Park, CA" +/// }); /// -/// let u: User = platform_value::from_value(j).unwrap(); -/// println!("{:#?}", u); -/// } +/// let u: User = platform_value::from_value(j).unwrap(); +/// println!("{:#?}", u); /// ``` /// /// # Errors diff --git a/packages/rs-sdk/src/core/transaction.rs b/packages/rs-sdk/src/core/transaction.rs index ffdc6b373b..a7046a2fdb 100644 --- a/packages/rs-sdk/src/core/transaction.rs +++ b/packages/rs-sdk/src/core/transaction.rs @@ -16,7 +16,6 @@ use dpp::prelude::AssetLockProof; use rs_dapi_client::{DapiRequestExecutor, RequestSettings}; use std::time::Duration; use tokio::time::{sleep, timeout}; -use tracing::info; impl Sdk { /// Starts the stream to listen for instant send lock messages diff --git a/packages/rs-sdk/src/mock.rs b/packages/rs-sdk/src/mock.rs index 9cd4a16e04..2e6d35da99 100644 --- a/packages/rs-sdk/src/mock.rs +++ b/packages/rs-sdk/src/mock.rs @@ -39,6 +39,4 @@ pub use noop::MockResponse; #[cfg(feature = "mocks")] pub use requests::MockResponse; #[cfg(feature = "mocks")] -pub use requests::*; -#[cfg(feature = "mocks")] pub use sdk::MockDashPlatformSdk; diff --git a/packages/rs-sdk/src/platform/fetch.rs b/packages/rs-sdk/src/platform/fetch.rs index 23a4d13a65..2bd0ff19be 100644 --- a/packages/rs-sdk/src/platform/fetch.rs +++ b/packages/rs-sdk/src/platform/fetch.rs @@ -9,7 +9,6 @@ //! traits. The associated [Fetch::Request]` type needs to implement [TransportRequest]. use crate::mock::MockResponse; -use crate::platform::query; use crate::{error::Error, platform::query::Query, Sdk}; use dapi_grpc::platform::v0::{self as platform_proto, ResponseMetadata}; use dpp::block::extended_epoch_info::ExtendedEpochInfo; diff --git a/packages/rs-sdk/tests/fetch/identity_contract_nonce.rs b/packages/rs-sdk/tests/fetch/identity_contract_nonce.rs index becf74119e..59bf7f8e8e 100644 --- a/packages/rs-sdk/tests/fetch/identity_contract_nonce.rs +++ b/packages/rs-sdk/tests/fetch/identity_contract_nonce.rs @@ -1,12 +1,6 @@ -use dpp::identity::accessors::IdentityGettersV0; -use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; -use dpp::prelude::{Identifier, IdentityPublicKey}; -use dpp::{identity::hash::IdentityPublicKeyHashMethodsV0, prelude::Identity}; -use drive_proof_verifier::types::{ - IdentityBalance, IdentityBalanceAndRevision, IdentityContractNonceFetcher, -}; -use rs_sdk::platform::types::identity::PublicKeyHash; -use rs_sdk::platform::{Fetch, FetchMany}; +use dpp::prelude::Identifier; +use drive_proof_verifier::types::IdentityContractNonceFetcher; +use rs_sdk::platform::Fetch; use super::{common::setup_logs, config::Config}; diff --git a/packages/strategy-tests/src/lib.rs b/packages/strategy-tests/src/lib.rs index a11c7c4831..b62761bfb4 100644 --- a/packages/strategy-tests/src/lib.rs +++ b/packages/strategy-tests/src/lib.rs @@ -12,7 +12,7 @@ use dpp::data_contract::{DataContract, DataContractFactory}; use dpp::document::{Document, DocumentV0Getters}; use dpp::identity::state_transition::asset_lock_proof::AssetLockProof; -use dpp::identity::{Identity, KeyID, KeyType, PartialIdentity, Purpose, SecurityLevel}; +use dpp::identity::{Identity, KeyType, PartialIdentity, Purpose, SecurityLevel}; use dpp::platform_value::string_encoding::Encoding; use dpp::serialization::{ PlatformDeserializableWithPotentialValidationFromVersionedStructure, @@ -30,7 +30,7 @@ use operations::{DataContractUpdateAction, DataContractUpdateOp}; use platform_version::TryFromPlatformVersioned; use rand::prelude::StdRng; use rand::Rng; -use tracing::{error, info}; +use tracing::error; use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet}; use bincode::{Decode, Encode}; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; @@ -421,7 +421,7 @@ impl Strategy { } } - let state_transition = DataContractCreateTransition::new_from_data_contract( + DataContractCreateTransition::new_from_data_contract( contract.clone(), *identity_nonce, &identity, @@ -430,8 +430,7 @@ impl Strategy { platform_version, None, ) - .expect("expected to create a create state transition from a data contract"); - state_transition + .expect("expected to create a create state transition from a data contract") }) .collect() } @@ -1110,7 +1109,7 @@ impl Strategy { let state_transition = crate::transitions::create_identity_credit_transfer_transition( owner, - &recipient, + recipient, identity_nonce_counter, signer, 1000, diff --git a/packages/strategy-tests/src/transitions.rs b/packages/strategy-tests/src/transitions.rs index 9f9b62aeb4..5a47e6f1c3 100644 --- a/packages/strategy-tests/src/transitions.rs +++ b/packages/strategy-tests/src/transitions.rs @@ -41,8 +41,6 @@ use dpp::dashcore::transaction::special_transaction::asset_lock::AssetLockPayloa use dpp::dashcore::transaction::special_transaction::TransactionPayload; use std::collections::{BTreeMap, HashSet}; use std::str::FromStr; -use tracing::error; -use tracing::info; /// Constructs an `AssetLockProof` representing an instant asset lock proof. /// From 4129cf7e87a26b65614e976eb9551589b3e6a0e6 Mon Sep 17 00:00:00 2001 From: PastaPastaPasta <6443210+PastaPastaPasta@users.noreply.github.com> Date: Fri, 8 Mar 2024 01:39:00 -0600 Subject: [PATCH 069/191] refactor: resolve clippy warnings in rs-dpp (#1754) --- Cargo.lock | 1 - packages/rs-dpp/Cargo.toml | 1 - .../src/data_contract/data_contract_facade.rs | 1 - .../mod.rs | 2 +- .../class_methods/try_from_schema/v0/mod.rs | 2 + .../get_raw_for_document_type/v0/mod.rs | 48 +++++++------- packages/rs-dpp/src/document/v0/mod.rs | 4 +- .../invalid_identity_contract_nonce_error.rs | 4 +- .../rs-dpp/src/identity/identity_facade.rs | 2 +- .../rs-dpp/src/identity/identity_factory.rs | 19 +++--- .../instant/methods/validate_structure/mod.rs | 1 + .../src/serialization/serialization_traits.rs | 9 ++- packages/rs-dpp/src/signing.rs | 2 +- packages/rs-dpp/src/state_transition/mod.rs | 62 ++++++++++++------- .../src/state_transition/serialization.rs | 2 +- .../data_contract_create_transition/fields.rs | 4 +- .../json_conversion.rs | 1 - .../document_base_transition/v0/mod.rs | 1 + .../document_create_transition/convertible.rs | 8 +++ .../document_create_transition/mod.rs | 1 + .../document_create_transition/v0/mod.rs | 8 ++- .../document_delete_transition/mod.rs | 1 + .../document_delete_transition/v0/mod.rs | 1 + .../document_replace_transition/mod.rs | 1 + .../document_replace_transition/v0/mod.rs | 3 +- .../v0/v0_methods.rs | 3 +- .../document_replace_transition/v0_methods.rs | 2 +- .../documents_batch_transition/methods/mod.rs | 13 +++- .../methods/v0/mod.rs | 9 ++- .../documents_batch_transition/v0/mod.rs | 1 + .../v0/v0_methods.rs | 23 +++++-- .../validation/validate_base_structure/mod.rs | 2 +- .../validate_base_structure/v0/mod.rs | 2 +- .../identity_create_transition/fields.rs | 6 +- .../identity_create_transition/methods/mod.rs | 11 +++- .../methods/v0/mod.rs | 9 ++- .../identity_create_transition/mod.rs | 1 + .../identity_create_transition/v0/mod.rs | 1 + .../v0/v0_methods.rs | 17 ++++- .../accessors/mod.rs | 2 +- .../mod.rs | 1 + .../v0/mod.rs | 3 +- .../accessors/mod.rs | 2 +- .../accessors/v0/mod.rs | 2 +- .../methods/mod.rs | 10 +++ .../methods/v0/mod.rs | 11 +++- .../mod.rs | 1 + .../v0/mod.rs | 3 +- .../v0/v0_methods.rs | 9 +++ .../identity_topup_transition/methods/mod.rs | 7 +++ .../methods/v0/mod.rs | 8 ++- .../identity/identity_topup_transition/mod.rs | 1 + .../identity_topup_transition/v0/mod.rs | 1 + .../v0/state_transition_like.rs | 1 - .../v0/v0_methods.rs | 15 ++++- .../identity_update_transition/methods/mod.rs | 8 +++ .../methods/v0/mod.rs | 13 +++- .../identity_update_transition/mod.rs | 1 + .../identity_update_transition/v0/mod.rs | 1 + .../v0/v0_methods.rs | 17 ++++- .../methods/hash/v0/mod.rs | 1 - .../identity/public_key_in_creation/mod.rs | 1 + .../state_transition_identity_signed.rs | 20 ++++-- packages/rs-dpp/src/validation/mod.rs | 1 + 64 files changed, 311 insertions(+), 118 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c603ed5a38..3b28b8e16a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1271,7 +1271,6 @@ dependencies = [ "test-case", "thiserror", "tokio", - "tracing", ] [[package]] diff --git a/packages/rs-dpp/Cargo.toml b/packages/rs-dpp/Cargo.toml index fdce3c3505..001517b8d4 100644 --- a/packages/rs-dpp/Cargo.toml +++ b/packages/rs-dpp/Cargo.toml @@ -12,7 +12,6 @@ authors = [ ] [dependencies] -tracing = "0.1.4" anyhow = { version = "1.0.75" } async-trait = { version = "0.1.68" } base64 = "0.20.0" diff --git a/packages/rs-dpp/src/data_contract/data_contract_facade.rs b/packages/rs-dpp/src/data_contract/data_contract_facade.rs index 7a086a4d13..d1f606622e 100644 --- a/packages/rs-dpp/src/data_contract/data_contract_facade.rs +++ b/packages/rs-dpp/src/data_contract/data_contract_facade.rs @@ -6,7 +6,6 @@ use crate::prelude::{Identifier, IdentityNonce}; use crate::state_transition::data_contract_create_transition::DataContractCreateTransition; #[cfg(feature = "state-transitions")] use crate::state_transition::data_contract_update_transition::DataContractUpdateTransition; -use crate::util::entropy_generator::EntropyGenerator; use crate::ProtocolError; use platform_value::Value; diff --git a/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/mod.rs b/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/mod.rs index c0fdd444b7..e35381dae1 100644 --- a/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/mod.rs @@ -88,7 +88,7 @@ mod test { match result { Err(crate::ProtocolError::ConsensusError(e)) => match e.deref() { ConsensusError::BasicError(err) => match err { - BasicError::DataContractEmptySchemaError(e) => {} + BasicError::DataContractEmptySchemaError(_) => {} _ => panic!("Expected DataContractEmptySchemaError"), }, _ => panic!("Expected basic consensus error"), diff --git a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs index 829be3233e..3bb46da014 100644 --- a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs @@ -71,6 +71,8 @@ impl DocumentTypeV0 { #[cfg(not(feature = "validation"))] if validate { + // TODO we are silently dropping this error when we shouldn't be + // but returning this error causes tests to fail; investigate more. ProtocolError::CorruptedCodeExecution( "validation is not enabled but is being called on try_from_schema_v0".to_string(), ); diff --git a/packages/rs-dpp/src/document/document_methods/get_raw_for_document_type/v0/mod.rs b/packages/rs-dpp/src/document/document_methods/get_raw_for_document_type/v0/mod.rs index ca13d60c55..419d5ee683 100644 --- a/packages/rs-dpp/src/document/document_methods/get_raw_for_document_type/v0/mod.rs +++ b/packages/rs-dpp/src/document/document_methods/get_raw_for_document_type/v0/mod.rs @@ -18,31 +18,31 @@ pub trait DocumentGetRawForDocumentTypeV0: DocumentV0Getters { // todo: maybe merge with document_type.serialize_value_for_key() because we use different // code paths for query and index creation // returns the owner id if the key path is $ownerId and an owner id is given - if key_path == "$ownerId" && owner_id.is_some() { - Ok(Some(Vec::from(owner_id.unwrap()))) - } else { - match key_path { - // returns self.id or self.owner_id if key path is $id or $ownerId - "$id" => return Ok(Some(self.id().to_vec())), - "$ownerId" => return Ok(Some(self.owner_id().to_vec())), - "$createdAt" => { - return Ok(self - .created_at() - .map(|time| DocumentPropertyType::encode_date_timestamp(time).unwrap())) - } - "$updatedAt" => { - return Ok(self - .updated_at() - .map(|time| DocumentPropertyType::encode_date_timestamp(time).unwrap())) - } - _ => {} + if key_path == "$ownerId" { + if let Some(owner_id) = owner_id { + return Ok(Some(Vec::from(owner_id))); } - self.properties() - .get_optional_at_path(key_path)? - .map(|value| { - document_type.serialize_value_for_key(key_path, value, platform_version) - }) - .transpose() } + + match key_path { + // returns self.id or self.owner_id if key path is $id or $ownerId + "$id" => return Ok(Some(self.id().to_vec())), + "$ownerId" => return Ok(Some(self.owner_id().to_vec())), + "$createdAt" => { + return Ok(self + .created_at() + .map(|time| DocumentPropertyType::encode_date_timestamp(time).unwrap())) + } + "$updatedAt" => { + return Ok(self + .updated_at() + .map(|time| DocumentPropertyType::encode_date_timestamp(time).unwrap())) + } + _ => {} + } + self.properties() + .get_optional_at_path(key_path)? + .map(|value| document_type.serialize_value_for_key(key_path, value, platform_version)) + .transpose() } } diff --git a/packages/rs-dpp/src/document/v0/mod.rs b/packages/rs-dpp/src/document/v0/mod.rs index aae6e1a25c..650da783e8 100644 --- a/packages/rs-dpp/src/document/v0/mod.rs +++ b/packages/rs-dpp/src/document/v0/mod.rs @@ -78,12 +78,12 @@ impl fmt::Display for DocumentV0 { write!(f, "owner_id:{} ", self.owner_id)?; if let Some(created_at) = self.created_at { let naive = NaiveDateTime::from_timestamp_millis(created_at as i64).unwrap_or_default(); - let datetime: DateTime = DateTime::from_utc(naive, Utc); + let datetime: DateTime = DateTime::from_naive_utc_and_offset(naive, Utc); write!(f, "created_at:{} ", datetime.format("%Y-%m-%d %H:%M:%S"))?; } if let Some(updated_at) = self.updated_at { let naive = NaiveDateTime::from_timestamp_millis(updated_at as i64).unwrap_or_default(); - let datetime: DateTime = DateTime::from_utc(naive, Utc); + let datetime: DateTime = DateTime::from_naive_utc_and_offset(naive, Utc); write!(f, "updated_at:{} ", datetime.format("%Y-%m-%d %H:%M:%S"))?; } diff --git a/packages/rs-dpp/src/errors/consensus/state/identity/invalid_identity_contract_nonce_error.rs b/packages/rs-dpp/src/errors/consensus/state/identity/invalid_identity_contract_nonce_error.rs index 893a98f553..39bbbfaaaf 100644 --- a/packages/rs-dpp/src/errors/consensus/state/identity/invalid_identity_contract_nonce_error.rs +++ b/packages/rs-dpp/src/errors/consensus/state/identity/invalid_identity_contract_nonce_error.rs @@ -1,11 +1,11 @@ use crate::consensus::state::state_error::StateError; use crate::consensus::ConsensusError; -use crate::errors::ProtocolError; +use crate::ProtocolError; // needed for PlatformDeserialize and PlatformSerialize use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; use std::fmt::{Display, Formatter}; use thiserror::Error; -use crate::prelude::{Identifier, IdentityNonce, Revision}; +use crate::prelude::{Identifier, IdentityNonce}; use crate::identity::identity_nonce::MergeIdentityNonceResult; use bincode::{Decode, Encode}; diff --git a/packages/rs-dpp/src/identity/identity_facade.rs b/packages/rs-dpp/src/identity/identity_facade.rs index 5f8f5c8015..eac0744190 100644 --- a/packages/rs-dpp/src/identity/identity_facade.rs +++ b/packages/rs-dpp/src/identity/identity_facade.rs @@ -5,7 +5,7 @@ use std::collections::BTreeMap; use crate::identity::state_transition::asset_lock_proof::chain::ChainAssetLockProof; use crate::identity::state_transition::asset_lock_proof::{AssetLockProof, InstantAssetLockProof}; use crate::identity::{Identity, IdentityPublicKey, KeyID, TimestampMillis}; -use crate::prelude::{Identifier, IdentityNonce, Revision}; +use crate::prelude::{Identifier, IdentityNonce}; use crate::identity::identity_factory::IdentityFactory; #[cfg(feature = "state-transitions")] diff --git a/packages/rs-dpp/src/identity/identity_factory.rs b/packages/rs-dpp/src/identity/identity_factory.rs index 11e29ce6fd..95b44630a7 100644 --- a/packages/rs-dpp/src/identity/identity_factory.rs +++ b/packages/rs-dpp/src/identity/identity_factory.rs @@ -200,7 +200,7 @@ impl IdentityFactory { let mut identity_topup_transition = IdentityTopUpTransitionV0::default(); identity_topup_transition.set_identity_id(identity_id); - identity_topup_transition.set_asset_lock_proof(asset_lock_proof); + identity_topup_transition.set_asset_lock_proof(asset_lock_proof)?; Ok(IdentityTopUpTransition::V0(identity_topup_transition)) } @@ -236,14 +236,15 @@ impl IdentityFactory { output_script: CoreScript, identity_nonce: IdentityNonce, ) -> Result { - let mut identity_credit_withdrawal_transition = - IdentityCreditWithdrawalTransitionV0::default(); - identity_credit_withdrawal_transition.identity_id = identity_id; - identity_credit_withdrawal_transition.amount = amount; - identity_credit_withdrawal_transition.core_fee_per_byte = core_fee_per_byte; - identity_credit_withdrawal_transition.pooling = pooling; - identity_credit_withdrawal_transition.output_script = output_script; - identity_credit_withdrawal_transition.nonce = identity_nonce; + let identity_credit_withdrawal_transition = IdentityCreditWithdrawalTransitionV0 { + identity_id, + amount, + core_fee_per_byte, + pooling, + output_script, + nonce: identity_nonce, + ..Default::default() + }; Ok(IdentityCreditWithdrawalTransition::from( identity_credit_withdrawal_transition, diff --git a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/instant/methods/validate_structure/mod.rs b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/instant/methods/validate_structure/mod.rs index 9743445699..6cd29ce70e 100644 --- a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/instant/methods/validate_structure/mod.rs +++ b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/instant/methods/validate_structure/mod.rs @@ -1,3 +1,4 @@ mod v0; +#[allow(unused_imports)] // Removing causes build failures; yet clippy insists it's unused pub(in crate::identity::state_transition::asset_lock_proof::instant) use v0::validate_instant_asset_lock_proof_structure_v0; diff --git a/packages/rs-dpp/src/serialization/serialization_traits.rs b/packages/rs-dpp/src/serialization/serialization_traits.rs index 031532840b..ced6d61b98 100644 --- a/packages/rs-dpp/src/serialization/serialization_traits.rs +++ b/packages/rs-dpp/src/serialization/serialization_traits.rs @@ -1,10 +1,17 @@ +#[cfg(any( + feature = "message-signature-verification", + feature = "message-signing" +))] use crate::identity::KeyType; use serde::{Deserialize, Serialize}; +#[cfg(feature = "message-signature-verification")] use crate::validation::SimpleConsensusValidationResult; use crate::version::PlatformVersion; -use crate::{BlsModule, ProtocolError}; +#[cfg(feature = "message-signing")] +use crate::BlsModule; +use crate::ProtocolError; use platform_value::Value; pub trait Signable { diff --git a/packages/rs-dpp/src/signing.rs b/packages/rs-dpp/src/signing.rs index 8bd84c4e2f..e5cd2e8574 100644 --- a/packages/rs-dpp/src/signing.rs +++ b/packages/rs-dpp/src/signing.rs @@ -122,7 +122,7 @@ impl PlatformMessageSignable for &[u8] { KeyType::BIP13_SCRIPT_HASH | KeyType::EDDSA_25519_HASH160 => { Err(ProtocolError::InvalidSigningKeyTypeError(format!( "key type {} can not sign", - key_type.to_string() + key_type ))) } } diff --git a/packages/rs-dpp/src/state_transition/mod.rs b/packages/rs-dpp/src/state_transition/mod.rs index 340ec4146b..b9dadd68e3 100644 --- a/packages/rs-dpp/src/state_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/mod.rs @@ -39,18 +39,30 @@ mod traits; // pub mod state_transition_fee; -pub use traits::*; - +#[cfg(feature = "state-transition-signing")] +use crate::consensus::signature::InvalidSignaturePublicKeySecurityLevelError; +#[cfg(feature = "state-transition-validation")] use crate::consensus::signature::{ - InvalidSignaturePublicKeySecurityLevelError, InvalidStateTransitionSignatureError, - PublicKeyIsDisabledError, SignatureError, + InvalidStateTransitionSignatureError, PublicKeyIsDisabledError, SignatureError, }; +#[cfg(feature = "state-transition-validation")] use crate::consensus::ConsensusError; +pub use traits::*; +#[cfg(any( + feature = "state-transition-signing", + feature = "state-transition-validation" +))] use crate::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; +#[cfg(feature = "state-transition-signing")] use crate::identity::signer::Signer; use crate::identity::state_transition::OptionallyAssetLockProved; -use crate::identity::{IdentityPublicKey, KeyID, KeyType, Purpose, SecurityLevel}; +#[cfg(any( + feature = "state-transition-signing", + feature = "state-transition-validation" +))] +use crate::identity::{IdentityPublicKey, KeyType, Purpose}; +use crate::identity::{KeyID, SecurityLevel}; use crate::prelude::AssetLockProof; pub use state_transitions::*; @@ -89,6 +101,7 @@ use crate::state_transition::identity_topup_transition::{ use crate::state_transition::identity_update_transition::{ IdentityUpdateTransition, IdentityUpdateTransitionSignable, }; +#[cfg(feature = "state-transition-signing")] use crate::state_transition::state_transitions::document::documents_batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; pub type GetDataContractSecurityLevelRequirementFn = @@ -175,6 +188,7 @@ macro_rules! call_method_identity_signed { }; } +#[cfg(feature = "state-transition-signing")] macro_rules! call_errorable_method_identity_signed { ($state_transition:expr, $method:ident, $args:tt ) => { match $state_transition { @@ -209,25 +223,25 @@ macro_rules! call_errorable_method_identity_signed { } }; } - -macro_rules! call_static_method { - ($state_transition:expr, $method:ident ) => { - match $state_transition { - StateTransition::DataContractCreate(_) => DataContractCreateTransition::$method(), - StateTransition::DataContractUpdate(_) => DataContractUpdateTransition::$method(), - StateTransition::DocumentsBatch(_) => DocumentsBatchTransition::$method(), - StateTransition::IdentityCreate(_) => IdentityCreateTransition::$method(), - StateTransition::IdentityTopUp(_) => IdentityTopUpTransition::$method(), - StateTransition::IdentityCreditWithdrawal(_) => { - IdentityCreditWithdrawalTransition::$method() - } - StateTransition::IdentityUpdate(_) => IdentityUpdateTransition::$method(), - StateTransition::IdentityCreditTransfer(_) => { - IdentityCreditTransferTransition::$method() - } - } - }; -} +// TODO unused macros below +// macro_rules! call_static_method { +// ($state_transition:expr, $method:ident ) => { +// match $state_transition { +// StateTransition::DataContractCreate(_) => DataContractCreateTransition::$method(), +// StateTransition::DataContractUpdate(_) => DataContractUpdateTransition::$method(), +// StateTransition::DocumentsBatch(_) => DocumentsBatchTransition::$method(), +// StateTransition::IdentityCreate(_) => IdentityCreateTransition::$method(), +// StateTransition::IdentityTopUp(_) => IdentityTopUpTransition::$method(), +// StateTransition::IdentityCreditWithdrawal(_) => { +// IdentityCreditWithdrawalTransition::$method() +// } +// StateTransition::IdentityUpdate(_) => IdentityUpdateTransition::$method(), +// StateTransition::IdentityCreditTransfer(_) => { +// IdentityCreditTransferTransition::$method() +// } +// } +// }; +// } #[derive( Debug, diff --git a/packages/rs-dpp/src/state_transition/serialization.rs b/packages/rs-dpp/src/state_transition/serialization.rs index f966b90ebb..76889fe459 100644 --- a/packages/rs-dpp/src/state_transition/serialization.rs +++ b/packages/rs-dpp/src/state_transition/serialization.rs @@ -287,7 +287,7 @@ mod tests { let platform_version = PlatformVersion::latest(); let identity = Identity::random_identity(5, Some(5), platform_version) .expect("expected a random identity"); - let mut created_data_contract = + let created_data_contract = get_data_contract_fixture(Some(identity.id()), 0, platform_version.protocol_version); let data_contract_update_transition = DataContractUpdateTransition::V0(DataContractUpdateTransitionV0 { diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/fields.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/fields.rs index 6243063733..3ae3b41bb2 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/fields.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/fields.rs @@ -3,8 +3,10 @@ use crate::state_transition::state_transitions; pub use state_transitions::common_fields::property_names::{ IDENTITY_NONCE, SIGNATURE, SIGNATURE_PUBLIC_KEY_ID, STATE_TRANSITION_PROTOCOL_VERSION, }; +#[allow(unused_imports)] // Removing causes build failures; yet clippy insists it's unused +pub use state_transitions::contract::common_fields::property_names::DATA_CONTRACT; pub use state_transitions::contract::common_fields::property_names::{ - DATA_CONTRACT, DATA_CONTRACT_ID, DATA_CONTRACT_OWNER_ID, DATA_CONTRACT_PROTOCOL_VERSION, + DATA_CONTRACT_ID, DATA_CONTRACT_OWNER_ID, DATA_CONTRACT_PROTOCOL_VERSION, }; pub const IDENTIFIER_FIELDS: [&str; 2] = [DATA_CONTRACT_ID, DATA_CONTRACT_OWNER_ID]; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/json_conversion.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/json_conversion.rs index ccc91ff4ac..b4ddf94b09 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/json_conversion.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/json_conversion.rs @@ -35,7 +35,6 @@ mod test { use crate::prelude::IdentityNonce; use dpp::util::json_value::JsonValueExt; - use platform_value::Bytes32; #[test] fn should_return_state_transition_in_json_format() { diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/v0/mod.rs index b72265f8f2..8392b81223 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/v0/mod.rs @@ -16,6 +16,7 @@ use serde::{Deserialize, Serialize}; #[cfg(feature = "state-transition-json-conversion")] use serde_json::Value as JsonValue; +#[cfg(feature = "state-transition-value-conversion")] use crate::data_contract::accessors::v0::DataContractV0Getters; use crate::identifier::Identifier; use crate::prelude::IdentityNonce; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/convertible.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/convertible.rs index 727c65822f..bca79958ba 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/convertible.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/convertible.rs @@ -9,9 +9,17 @@ use crate::data_contract::document_type::accessors::DocumentTypeV0Getters; use crate::prelude::DataContract; #[cfg(feature = "state-transition-json-conversion")] use crate::state_transition::data_contract_update_transition::IDENTIFIER_FIELDS; +#[cfg(any( + feature = "state-transition-json-conversion", + feature = "state-transition-value-conversion" +))] use crate::state_transition::documents_batch_transition::document_base_transition::v0::DocumentTransitionObjectLike; #[cfg(feature = "state-transition-json-conversion")] use crate::state_transition::documents_batch_transition::document_create_transition::v0::BINARY_FIELDS; +#[cfg(any( + feature = "state-transition-json-conversion", + feature = "state-transition-value-conversion" +))] use crate::state_transition::documents_batch_transition::document_create_transition::DocumentCreateTransition; #[cfg(feature = "state-transition-value-conversion")] use crate::state_transition::documents_batch_transition::document_create_transition::DocumentCreateTransitionV0; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/mod.rs index 9dd9788263..ef1683d5ee 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/mod.rs @@ -11,6 +11,7 @@ use bincode::{Decode, Encode}; use derive_more::{Display, From}; use platform_value::Identifier; use platform_version::version::PlatformVersion; +#[cfg(feature = "state-transition-serde-conversion")] use serde::{Deserialize, Serialize}; pub use v0::DocumentCreateTransitionV0; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/mod.rs index a0d6c3ac04..3114573e72 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/mod.rs @@ -3,8 +3,10 @@ pub mod v0_methods; use bincode::{Decode, Encode}; +#[cfg(feature = "state-transition-value-conversion")] use platform_value::btreemap_extensions::BTreeValueRemoveFromMapHelper; use platform_value::{Identifier, Value}; +#[cfg(feature = "state-transition-serde-conversion")] use serde::{Deserialize, Serialize}; use std::collections::BTreeMap; @@ -18,9 +20,9 @@ use crate::{data_contract::DataContract, errors::ProtocolError}; use crate::data_contract::accessors::v0::DataContractV0Getters; use crate::data_contract::document_type::methods::DocumentTypeV0Methods; use crate::document::{Document, DocumentV0}; -use crate::state_transition::documents_batch_transition::document_base_transition::v0::{ - DocumentBaseTransitionV0, DocumentTransitionObjectLike, -}; +use crate::state_transition::documents_batch_transition::document_base_transition::v0::DocumentBaseTransitionV0; +#[cfg(feature = "state-transition-value-conversion")] +use crate::state_transition::documents_batch_transition::document_base_transition::v0::DocumentTransitionObjectLike; use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; use derive_more::Display; use platform_version::version::PlatformVersion; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/mod.rs index 94f386fbdb..5d7c661358 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/mod.rs @@ -4,6 +4,7 @@ mod v0_methods; use bincode::{Decode, Encode}; use derive_more::{Display, From}; +#[cfg(feature = "state-transition-serde-conversion")] use serde::{Deserialize, Serialize}; pub use v0::*; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/v0/mod.rs index d858b37db8..83c1b4b49b 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/v0/mod.rs @@ -6,6 +6,7 @@ use crate::state_transition::documents_batch_transition::document_base_transitio use bincode::{Decode, Encode}; use derive_more::Display; +#[cfg(feature = "state-transition-serde-conversion")] use serde::{Deserialize, Serialize}; pub use super::super::document_base_transition::IDENTIFIER_FIELDS; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/mod.rs index 655f4aad9f..07cdba7f09 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/mod.rs @@ -8,6 +8,7 @@ use bincode::{Decode, Encode}; use derive_more::{Display, From}; use platform_value::Identifier; use platform_version::version::PlatformVersion; +#[cfg(feature = "state-transition-serde-conversion")] use serde::{Deserialize, Serialize}; pub use v0::*; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/mod.rs index c02a2e6531..87f74b04e7 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/mod.rs @@ -2,11 +2,12 @@ mod from_document; pub mod v0_methods; use crate::identity::TimestampMillis; -use crate::prelude::{IdentityNonce, Revision}; +use crate::prelude::Revision; use bincode::{Decode, Encode}; use derive_more::Display; use platform_value::{Identifier, Value}; +#[cfg(feature = "state-transition-serde-conversion")] use serde::{Deserialize, Serialize}; use crate::document::{Document, DocumentV0}; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/v0_methods.rs index a7fbc8f896..bc27aeb63c 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/v0_methods.rs @@ -3,12 +3,11 @@ use platform_value::Value; use std::collections::BTreeMap; use crate::identity::TimestampMillis; -use crate::prelude::{IdentityNonce, Revision}; +use crate::prelude::Revision; use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; use crate::state_transition::documents_batch_transition::document_transition::document_replace_transition::DocumentReplaceTransitionV0; -use crate::state_transition::documents_batch_transition::DocumentReplaceTransition; pub trait DocumentReplaceTransitionV0Methods { /// Returns a reference to the `base` field of the `DocumentReplaceTransitionV0`. diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0_methods.rs index e1566587aa..41c6f54104 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0_methods.rs @@ -1,7 +1,7 @@ use std::collections::BTreeMap; use platform_value::Value; use crate::identity::TimestampMillis; -use crate::prelude::{IdentityNonce, Revision}; +use crate::prelude::Revision; use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; use crate::state_transition::documents_batch_transition::document_transition::document_replace_transition::v0::v0_methods::DocumentReplaceTransitionV0Methods; use crate::state_transition::documents_batch_transition::document_transition::DocumentReplaceTransition; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs index bacbc32cd3..034c61c6bf 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs @@ -1,15 +1,22 @@ +#[cfg(feature = "state-transition-signing")] use crate::data_contract::document_type::DocumentTypeRef; +#[cfg(feature = "state-transition-signing")] use crate::document::Document; +#[cfg(feature = "state-transition-signing")] use crate::identity::signer::Signer; +#[cfg(feature = "state-transition-signing")] use crate::identity::IdentityPublicKey; use crate::prelude::IdentityNonce; use crate::state_transition::documents_batch_transition::document_transition::DocumentTransition; use crate::state_transition::documents_batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; -use crate::state_transition::documents_batch_transition::{ - DocumentsBatchTransition, DocumentsBatchTransitionV0, -}; +use crate::state_transition::documents_batch_transition::DocumentsBatchTransition; +#[cfg(feature = "state-transition-signing")] +use crate::state_transition::documents_batch_transition::DocumentsBatchTransitionV0; +#[cfg(feature = "state-transition-signing")] use crate::state_transition::StateTransition; +#[cfg(feature = "state-transition-signing")] use crate::ProtocolError; +#[cfg(feature = "state-transition-signing")] use platform_version::version::{FeatureVersion, PlatformVersion}; pub mod v0; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/v0/mod.rs index 8670f2f5d3..38a3fdf911 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/v0/mod.rs @@ -1,16 +1,23 @@ +#[cfg(feature = "state-transition-signing")] use crate::data_contract::document_type::DocumentTypeRef; +#[cfg(feature = "state-transition-signing")] use crate::document::Document; +#[cfg(feature = "state-transition-signing")] use crate::identity::signer::Signer; -use crate::identity::{IdentityPublicKey, SecurityLevel}; +#[cfg(feature = "state-transition-signing")] +use crate::identity::IdentityPublicKey; +use crate::identity::SecurityLevel; use crate::prelude::IdentityNonce; use crate::state_transition::documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; use crate::state_transition::documents_batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; use crate::state_transition::documents_batch_transition::document_transition::{ DocumentTransition, DocumentTransitionV0Methods, }; +#[cfg(feature = "state-transition-signing")] use crate::state_transition::StateTransition; use crate::ProtocolError; use platform_value::Identifier; +#[cfg(feature = "state-transition-signing")] use platform_version::version::{FeatureVersion, PlatformVersion}; use std::convert::TryFrom; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/mod.rs index 11556521d3..47a8917eda 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/mod.rs @@ -16,6 +16,7 @@ use bincode::{Decode, Encode}; use platform_serialization_derive::PlatformSignable; use platform_value::{BinaryData, Identifier}; +#[cfg(feature = "state-transition-serde-conversion")] use serde::{Deserialize, Serialize}; #[derive(Debug, Clone, PartialEq, Encode, Decode, PlatformSignable)] diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs index 5f23df7eee..dac57e5197 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs @@ -1,19 +1,32 @@ +#[cfg(feature = "state-transition-signing")] use crate::data_contract::document_type::DocumentTypeRef; +#[cfg(feature = "state-transition-signing")] use crate::document::{Document, DocumentV0Getters}; +#[cfg(feature = "state-transition-signing")] use crate::identity::signer::Signer; +#[cfg(feature = "state-transition-signing")] use crate::identity::SecurityLevel; -use crate::prelude::{IdentityNonce, IdentityPublicKey}; +use crate::prelude::IdentityNonce; +#[cfg(feature = "state-transition-signing")] +use crate::prelude::IdentityPublicKey; + use crate::state_transition::documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; +#[cfg(feature = "state-transition-signing")] use crate::state_transition::documents_batch_transition::document_create_transition::DocumentCreateTransition; +#[cfg(feature = "state-transition-signing")] +use crate::state_transition::documents_batch_transition::document_transition::DocumentReplaceTransition; use crate::state_transition::documents_batch_transition::document_transition::{ - DocumentReplaceTransition, DocumentTransition, DocumentTransitionV0Methods, + DocumentTransition, DocumentTransitionV0Methods, }; use crate::state_transition::documents_batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; -use crate::state_transition::documents_batch_transition::{ - DocumentsBatchTransition, DocumentsBatchTransitionV0, -}; +#[cfg(feature = "state-transition-signing")] +use crate::state_transition::documents_batch_transition::DocumentsBatchTransition; +use crate::state_transition::documents_batch_transition::DocumentsBatchTransitionV0; +#[cfg(feature = "state-transition-signing")] use crate::state_transition::StateTransition; +#[cfg(feature = "state-transition-signing")] use crate::ProtocolError; +#[cfg(feature = "state-transition-signing")] use platform_version::version::{FeatureVersion, PlatformVersion}; impl DocumentsBatchTransitionAccessorsV0 for DocumentsBatchTransitionV0 { diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/validate_base_structure/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/validate_base_structure/mod.rs index 400433a814..129236c3fb 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/validate_base_structure/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/validate_base_structure/mod.rs @@ -6,7 +6,7 @@ use platform_version::version::PlatformVersion; mod v0; impl DocumentsBatchTransition { - pub fn validate_base_structure<'d>( + pub fn validate_base_structure( &self, platform_version: &PlatformVersion, ) -> Result { diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/validate_base_structure/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/validate_base_structure/v0/mod.rs index 9018e8d8be..cd14fe19a6 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/validate_base_structure/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/validate_base_structure/v0/mod.rs @@ -22,7 +22,7 @@ use std::collections::BTreeMap; const MAX_TRANSITIONS_IN_BATCH: usize = 1; impl DocumentsBatchTransition { - pub(super) fn validate_base_structure_v0<'d>( + pub(super) fn validate_base_structure_v0( &self, platform_version: &PlatformVersion, ) -> Result { diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/fields.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/fields.rs index 74fc567172..25602cb8b0 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/fields.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/fields.rs @@ -3,8 +3,12 @@ use crate::state_transition::state_transitions; pub use state_transitions::common_fields::property_names::{ SIGNATURE, STATE_TRANSITION_PROTOCOL_VERSION, }; +#[allow(unused_imports)] // Removing causes build failures; yet clippy insists it's unused pub use state_transitions::identity::common_fields::property_names::{ - ASSET_LOCK_PROOF, IDENTITY_ID, PUBLIC_KEYS, PUBLIC_KEYS_DATA, PUBLIC_KEYS_SIGNATURE, + ASSET_LOCK_PROOF, PUBLIC_KEYS, +}; +pub use state_transitions::identity::common_fields::property_names::{ + IDENTITY_ID, PUBLIC_KEYS_DATA, PUBLIC_KEYS_SIGNATURE, }; pub const IDENTIFIER_FIELDS: [&str; 1] = [IDENTITY_ID]; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/methods/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/methods/mod.rs index 9377c04bad..ef49e752e3 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/methods/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/methods/mod.rs @@ -2,14 +2,21 @@ mod v0; pub use v0::*; +#[cfg(feature = "state-transition-signing")] use crate::identity::signer::Signer; +#[cfg(feature = "state-transition-signing")] use crate::identity::Identity; +#[cfg(feature = "state-transition-signing")] use crate::prelude::AssetLockProof; +#[cfg(feature = "state-transition-signing")] use crate::state_transition::identity_create_transition::v0::IdentityCreateTransitionV0; use crate::state_transition::identity_create_transition::IdentityCreateTransition; - -use crate::state_transition::{StateTransition, StateTransitionType}; +#[cfg(feature = "state-transition-signing")] +use crate::state_transition::StateTransition; +use crate::state_transition::StateTransitionType; +#[cfg(feature = "state-transition-signing")] use crate::version::PlatformVersion; +#[cfg(feature = "state-transition-signing")] use crate::{BlsModule, ProtocolError}; impl IdentityCreateTransitionMethodsV0 for IdentityCreateTransition { diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/methods/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/methods/v0/mod.rs index a2ff6b1663..d171b73c25 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/methods/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/methods/v0/mod.rs @@ -1,8 +1,15 @@ +#[cfg(feature = "state-transition-signing")] use crate::identity::signer::Signer; +#[cfg(feature = "state-transition-signing")] use crate::identity::Identity; +#[cfg(feature = "state-transition-signing")] use crate::prelude::AssetLockProof; -use crate::state_transition::{StateTransition, StateTransitionType}; +#[cfg(feature = "state-transition-signing")] +use crate::state_transition::StateTransition; +use crate::state_transition::StateTransitionType; +#[cfg(feature = "state-transition-signing")] use crate::{BlsModule, ProtocolError}; +#[cfg(feature = "state-transition-signing")] use platform_version::version::PlatformVersion; pub trait IdentityCreateTransitionMethodsV0 { diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/mod.rs index 15cd5a6ef4..d4f4a6cd4a 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/mod.rs @@ -21,6 +21,7 @@ use fields::*; use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize, PlatformSignable}; use platform_version::version::PlatformVersion; use platform_versioning::PlatformVersioned; +#[cfg(feature = "state-transition-serde-conversion")] use serde::{Deserialize, Serialize}; pub type IdentityCreateTransitionLatest = IdentityCreateTransitionV0; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/mod.rs index 91b155844c..70dba1ee7d 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/mod.rs @@ -14,6 +14,7 @@ use bincode::{Decode, Encode}; use platform_serialization_derive::PlatformSignable; use platform_value::BinaryData; +#[cfg(feature = "state-transition-serde-conversion")] use serde::{Deserialize, Serialize}; use crate::identity::state_transition::asset_lock_proof::AssetLockProof; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/v0_methods.rs index eb55b95f6e..1388daece9 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/v0_methods.rs @@ -1,24 +1,35 @@ -use crate::{prelude::Identifier, state_transition::StateTransitionType, BlsModule, ProtocolError}; +use crate::{prelude::Identifier, state_transition::StateTransitionType}; +#[cfg(feature = "state-transition-signing")] +use crate::{BlsModule, ProtocolError}; +#[cfg(feature = "state-transition-signing")] use crate::identity::accessors::IdentityGettersV0; +#[cfg(feature = "state-transition-signing")] use crate::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; +#[cfg(feature = "state-transition-signing")] use crate::identity::signer::Signer; +#[cfg(feature = "state-transition-signing")] use crate::identity::state_transition::AssetLockProved; +#[cfg(feature = "state-transition-signing")] use crate::identity::Identity; +#[cfg(feature = "state-transition-signing")] use crate::identity::KeyType::ECDSA_HASH160; +#[cfg(feature = "state-transition-signing")] use crate::prelude::AssetLockProof; +#[cfg(feature = "state-transition-signing")] use crate::serialization::Signable; use crate::state_transition::identity_create_transition::accessors::IdentityCreateTransitionAccessorsV0; use crate::state_transition::identity_create_transition::methods::IdentityCreateTransitionMethodsV0; +#[cfg(feature = "state-transition-signing")] use crate::state_transition::public_key_in_creation::accessors::IdentityPublicKeyInCreationV0Setters; use crate::state_transition::identity_create_transition::v0::IdentityCreateTransitionV0; use crate::state_transition::public_key_in_creation::IdentityPublicKeyInCreation; +#[cfg(feature = "state-transition-signing")] use crate::state_transition::StateTransition; +#[cfg(feature = "state-transition-signing")] use crate::version::PlatformVersion; -use tracing::info; - impl IdentityCreateTransitionMethodsV0 for IdentityCreateTransitionV0 { #[cfg(feature = "state-transition-signing")] fn try_from_identity_with_signer( diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/accessors/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/accessors/mod.rs index 6cd7ea9928..e263f3faeb 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/accessors/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/accessors/mod.rs @@ -1,6 +1,6 @@ mod v0; -use crate::prelude::{IdentityNonce, Revision}; +use crate::prelude::IdentityNonce; use crate::state_transition::identity_credit_transfer_transition::IdentityCreditTransferTransition; use platform_value::Identifier; pub use v0::*; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/mod.rs index eee8925ca7..b991b7402b 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/mod.rs @@ -23,6 +23,7 @@ use fields::*; use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize, PlatformSignable}; use platform_version::version::PlatformVersion; use platform_versioning::PlatformVersioned; +#[cfg(feature = "state-transition-serde-conversion")] use serde::{Deserialize, Serialize}; pub type IdentityCreditTransferTransitionLatest = IdentityCreditTransferTransitionV0; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/v0/mod.rs index 18bfa5dbbd..3537591658 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/v0/mod.rs @@ -10,12 +10,13 @@ mod version; use crate::identity::KeyID; -use crate::prelude::{Identifier, IdentityNonce, Revision}; +use crate::prelude::{Identifier, IdentityNonce}; use crate::ProtocolError; use bincode::{Decode, Encode}; use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize, PlatformSignable}; use platform_value::BinaryData; +#[cfg(feature = "state-transition-serde-conversion")] use serde::{Deserialize, Serialize}; #[derive( diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/accessors/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/accessors/mod.rs index 721171e9c4..dbf33c5a56 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/accessors/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/accessors/mod.rs @@ -4,7 +4,7 @@ use crate::identity::core_script::CoreScript; use platform_value::Identifier; pub use v0::*; -use crate::prelude::{IdentityNonce, Revision}; +use crate::prelude::IdentityNonce; use crate::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition; use crate::withdrawal::Pooling; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/accessors/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/accessors/v0/mod.rs index 0f1dc16ea9..1bcd8b2945 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/accessors/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/accessors/v0/mod.rs @@ -1,5 +1,5 @@ use crate::identity::core_script::CoreScript; -use crate::prelude::{IdentityNonce, Revision}; +use crate::prelude::IdentityNonce; use crate::withdrawal::Pooling; use platform_value::Identifier; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/methods/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/methods/mod.rs index e2ce78a39f..5eba3ea31f 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/methods/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/methods/mod.rs @@ -1,18 +1,28 @@ mod v0; use crate::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition; +#[cfg(feature = "state-transition-signing")] use platform_version::version::FeatureVersion; pub use v0::*; +#[cfg(feature = "state-transition-signing")] use crate::identity::signer::Signer; +#[cfg(feature = "state-transition-signing")] use crate::identity::Identity; +#[cfg(feature = "state-transition-signing")] use crate::identity::core_script::CoreScript; +#[cfg(feature = "state-transition-signing")] use crate::prelude::IdentityNonce; +#[cfg(feature = "state-transition-signing")] use crate::state_transition::identity_credit_withdrawal_transition::v0::IdentityCreditWithdrawalTransitionV0; +#[cfg(feature = "state-transition-signing")] use crate::state_transition::StateTransition; +#[cfg(feature = "state-transition-signing")] use crate::version::PlatformVersion; +#[cfg(feature = "state-transition-signing")] use crate::withdrawal::Pooling; +#[cfg(feature = "state-transition-signing")] use crate::ProtocolError; impl IdentityCreditWithdrawalTransitionMethodsV0 for IdentityCreditWithdrawalTransition { diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/methods/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/methods/v0/mod.rs index af1205f67f..9ed7e264ef 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/methods/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/methods/v0/mod.rs @@ -1,10 +1,19 @@ +#[cfg(feature = "state-transition-signing")] use crate::identity::core_script::CoreScript; +#[cfg(feature = "state-transition-signing")] use crate::identity::signer::Signer; +#[cfg(feature = "state-transition-signing")] use crate::identity::Identity; +#[cfg(feature = "state-transition-signing")] use crate::prelude::IdentityNonce; -use crate::state_transition::{StateTransition, StateTransitionType}; +#[cfg(feature = "state-transition-signing")] +use crate::state_transition::StateTransition; +use crate::state_transition::StateTransitionType; +#[cfg(feature = "state-transition-signing")] use crate::withdrawal::Pooling; +#[cfg(feature = "state-transition-signing")] use crate::ProtocolError; +#[cfg(feature = "state-transition-signing")] use platform_version::version::{FeatureVersion, PlatformVersion}; pub trait IdentityCreditWithdrawalTransitionMethodsV0 { diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/mod.rs index 0f9533af4a..dc0b3af805 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/mod.rs @@ -24,6 +24,7 @@ use fields::*; use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize, PlatformSignable}; use platform_version::version::PlatformVersion; use platform_versioning::PlatformVersioned; +#[cfg(feature = "state-transition-serde-conversion")] use serde::{Deserialize, Serialize}; pub type IdentityCreditWithdrawalTransitionLatest = IdentityCreditWithdrawalTransitionV0; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/mod.rs index 245651fcd4..f2eceacdfc 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/mod.rs @@ -12,13 +12,14 @@ use bincode::{Decode, Encode}; use dashcore::transaction::special_transaction::asset_unlock::qualified_asset_unlock::ASSET_UNLOCK_TX_SIZE; use platform_serialization_derive::PlatformSignable; use platform_value::BinaryData; +#[cfg(feature = "state-transition-serde-conversion")] use serde::{Deserialize, Serialize}; use crate::balances::credits::CREDITS_PER_DUFF; use crate::prelude::IdentityNonce; use crate::{ identity::{core_script::CoreScript, KeyID}, - prelude::{Identifier, Revision}, + prelude::Identifier, withdrawal::Pooling, ProtocolError, }; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/v0_methods.rs index c898036baf..4e5ab951c3 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/v0_methods.rs @@ -1,14 +1,23 @@ +#[cfg(feature = "state-transition-signing")] use crate::identity::accessors::IdentityGettersV0; +#[cfg(feature = "state-transition-signing")] use crate::identity::core_script::CoreScript; +#[cfg(feature = "state-transition-signing")] use crate::identity::signer::Signer; +#[cfg(feature = "state-transition-signing")] use crate::identity::{Identity, KeyType, Purpose, SecurityLevel}; +#[cfg(feature = "state-transition-signing")] use crate::prelude::IdentityNonce; +#[cfg(feature = "state-transition-signing")] use crate::ProtocolError; +#[cfg(feature = "state-transition-signing")] use platform_version::version::{FeatureVersion, PlatformVersion}; use crate::state_transition::identity_credit_withdrawal_transition::methods::IdentityCreditWithdrawalTransitionMethodsV0; use crate::state_transition::identity_credit_withdrawal_transition::v0::IdentityCreditWithdrawalTransitionV0; +#[cfg(feature = "state-transition-signing")] use crate::state_transition::{GetDataContractSecurityLevelRequirementFn, StateTransition}; +#[cfg(feature = "state-transition-signing")] use crate::withdrawal::Pooling; impl IdentityCreditWithdrawalTransitionMethodsV0 for IdentityCreditWithdrawalTransitionV0 { diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/methods/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/methods/mod.rs index 2983c6e067..32f59f9e4a 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/methods/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/methods/mod.rs @@ -2,14 +2,21 @@ mod v0; pub use v0::*; +#[cfg(feature = "state-transition-signing")] use crate::identity::Identity; +#[cfg(feature = "state-transition-signing")] use crate::prelude::AssetLockProof; +#[cfg(feature = "state-transition-signing")] use crate::state_transition::identity_topup_transition::v0::IdentityTopUpTransitionV0; use crate::state_transition::identity_topup_transition::IdentityTopUpTransition; +#[cfg(feature = "state-transition-signing")] use crate::state_transition::StateTransition; +#[cfg(feature = "state-transition-signing")] use crate::version::FeatureVersion; +#[cfg(feature = "state-transition-signing")] use crate::ProtocolError; +#[cfg(feature = "state-transition-signing")] use platform_version::version::PlatformVersion; impl IdentityTopUpTransitionMethodsV0 for IdentityTopUpTransition { diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/methods/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/methods/v0/mod.rs index 64918489d8..4f25e0e407 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/methods/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/methods/v0/mod.rs @@ -1,7 +1,13 @@ +#[cfg(feature = "state-transition-signing")] use crate::identity::Identity; +#[cfg(feature = "state-transition-signing")] use crate::prelude::AssetLockProof; -use crate::state_transition::{StateTransition, StateTransitionType}; +#[cfg(feature = "state-transition-signing")] +use crate::state_transition::StateTransition; +use crate::state_transition::StateTransitionType; +#[cfg(feature = "state-transition-signing")] use crate::ProtocolError; +#[cfg(feature = "state-transition-signing")] use platform_version::version::{FeatureVersion, PlatformVersion}; pub trait IdentityTopUpTransitionMethodsV0 { diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/mod.rs index fb009a867e..58fe27b587 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/mod.rs @@ -22,6 +22,7 @@ use derive_more::From; use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize, PlatformSignable}; use platform_version::version::PlatformVersion; use platform_versioning::PlatformVersioned; +#[cfg(feature = "state-transition-serde-conversion")] use serde::{Deserialize, Serialize}; #[derive( diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/v0/mod.rs index f2bd2b0616..673eb859e5 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/v0/mod.rs @@ -13,6 +13,7 @@ use platform_serialization_derive::PlatformSignable; use platform_value::BinaryData; +#[cfg(feature = "state-transition-serde-conversion")] use serde::{Deserialize, Serialize}; use crate::identity::state_transition::asset_lock_proof::AssetLockProof; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/v0/state_transition_like.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/v0/state_transition_like.rs index ad8a66aa85..4c36f94ec1 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/v0/state_transition_like.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/v0/state_transition_like.rs @@ -4,7 +4,6 @@ use crate::state_transition::identity_topup_transition::IdentityTopUpTransition; use crate::{ prelude::Identifier, state_transition::{StateTransitionLike, StateTransitionType}, - ProtocolError, }; use crate::state_transition::identity_topup_transition::v0::IdentityTopUpTransitionV0; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/v0/v0_methods.rs index 425c50f012..3814262abb 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/v0/v0_methods.rs @@ -1,18 +1,27 @@ -use crate::{prelude::Identifier, ProtocolError}; -use dashcore::signer; - +#[cfg(feature = "state-transition-signing")] use crate::identity::accessors::IdentityGettersV0; +#[cfg(feature = "state-transition-signing")] use crate::identity::Identity; +#[cfg(feature = "state-transition-signing")] use crate::prelude::AssetLockProof; +use crate::prelude::Identifier; +#[cfg(feature = "state-transition-signing")] +use crate::ProtocolError; +#[cfg(feature = "state-transition-signing")] +use dashcore::signer; use crate::state_transition::identity_topup_transition::accessors::IdentityTopUpTransitionAccessorsV0; use crate::state_transition::identity_topup_transition::methods::IdentityTopUpTransitionMethodsV0; +#[cfg(feature = "state-transition-signing")] use crate::serialization::Signable; +#[cfg(feature = "state-transition-signing")] use platform_version::version::PlatformVersion; use crate::state_transition::identity_topup_transition::v0::IdentityTopUpTransitionV0; +#[cfg(feature = "state-transition-signing")] use crate::state_transition::StateTransition; +#[cfg(feature = "state-transition-signing")] use crate::version::FeatureVersion; impl IdentityTopUpTransitionMethodsV0 for IdentityTopUpTransitionV0 { diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/methods/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/methods/mod.rs index b6c0e802dc..ebc2d1af96 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/methods/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/methods/mod.rs @@ -1,17 +1,25 @@ mod v0; pub use v0::*; +#[cfg(feature = "state-transition-signing")] use crate::identity::signer::Signer; +#[cfg(feature = "state-transition-signing")] use crate::identity::{Identity, IdentityPublicKey, KeyID}; +#[cfg(feature = "state-transition-signing")] use crate::state_transition::identity_update_transition::v0::IdentityUpdateTransitionV0; use crate::state_transition::identity_update_transition::IdentityUpdateTransition; +#[cfg(feature = "state-transition-signing")] use crate::state_transition::StateTransition; +#[cfg(feature = "state-transition-signing")] use crate::version::FeatureVersion; +#[cfg(feature = "state-transition-signing")] use crate::ProtocolError; +#[cfg(feature = "state-transition-signing")] use crate::prelude::IdentityNonce; +#[cfg(feature = "state-transition-signing")] use platform_version::version::PlatformVersion; impl IdentityUpdateTransitionMethodsV0 for IdentityUpdateTransition { diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/methods/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/methods/v0/mod.rs index ea675e04e6..93c8adc3d0 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/methods/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/methods/v0/mod.rs @@ -1,11 +1,18 @@ -use platform_version::version::PlatformVersion; - +#[cfg(feature = "state-transition-signing")] use crate::identity::signer::Signer; +#[cfg(feature = "state-transition-signing")] use crate::identity::{Identity, IdentityPublicKey}; +#[cfg(feature = "state-transition-signing")] use crate::prelude::IdentityNonce; +#[cfg(feature = "state-transition-signing")] use crate::state_transition::StateTransition; +use crate::state_transition::StateTransitionType; +#[cfg(feature = "state-transition-signing")] use crate::version::FeatureVersion; -use crate::{identity::KeyID, state_transition::StateTransitionType, ProtocolError}; +#[cfg(feature = "state-transition-signing")] +use crate::{identity::KeyID, ProtocolError}; +#[cfg(feature = "state-transition-signing")] +use platform_version::version::PlatformVersion; pub trait IdentityUpdateTransitionMethodsV0 { #[cfg(feature = "state-transition-signing")] diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/mod.rs index f164926580..c886979839 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/mod.rs @@ -24,6 +24,7 @@ use derive_more::From; use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize, PlatformSignable}; use platform_version::version::PlatformVersion; use platform_versioning::PlatformVersioned; +#[cfg(feature = "state-transition-serde-conversion")] use serde::{Deserialize, Serialize}; #[derive( diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/mod.rs index df59c947b0..c1aa3c0e85 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/mod.rs @@ -11,6 +11,7 @@ mod version; use bincode::{Decode, Encode}; use platform_serialization_derive::PlatformSignable; use platform_value::{BinaryData, Value}; +#[cfg(feature = "state-transition-serde-conversion")] use serde::{Deserialize, Serialize}; use std::convert::{TryFrom, TryInto}; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/v0_methods.rs index 7a32bde43f..87c7c261c9 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/v0_methods.rs @@ -1,30 +1,41 @@ +#[cfg(feature = "state-transition-signing")] use crate::serialization::Signable; +#[cfg(feature = "state-transition-signing")] use platform_version::version::PlatformVersion; +#[cfg(feature = "state-transition-signing")] use crate::consensus::signature::{ InvalidSignaturePublicKeySecurityLevelError, MissingPublicKeyError, SignatureError, }; +#[cfg(feature = "state-transition-signing")] use crate::consensus::ConsensusError; +#[cfg(feature = "state-transition-signing")] use crate::identity::signer::Signer; +#[cfg(feature = "state-transition-signing")] use crate::identity::{Identity, IdentityPublicKey}; +#[cfg(feature = "state-transition-signing")] use crate::identity::accessors::IdentityGettersV0; +#[cfg(feature = "state-transition-signing")] use crate::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; use crate::prelude::IdentityNonce; use crate::state_transition::identity_update_transition::accessors::IdentityUpdateTransitionAccessorsV0; use crate::state_transition::identity_update_transition::methods::IdentityUpdateTransitionMethodsV0; use crate::state_transition::identity_update_transition::v0::IdentityUpdateTransitionV0; +#[cfg(feature = "state-transition-signing")] use crate::state_transition::public_key_in_creation::accessors::IdentityPublicKeyInCreationV0Setters; use crate::state_transition::public_key_in_creation::IdentityPublicKeyInCreation; +#[cfg(feature = "state-transition-signing")] use crate::state_transition::{GetDataContractSecurityLevelRequirementFn, StateTransition}; +#[cfg(feature = "state-transition-signing")] use crate::version::FeatureVersion; use crate::{ - identity::{KeyID, SecurityLevel}, + identity::KeyID, prelude::{Identifier, Revision, TimestampMillis}, - ProtocolError, }; - +#[cfg(feature = "state-transition-signing")] +use crate::{identity::SecurityLevel, ProtocolError}; impl IdentityUpdateTransitionMethodsV0 for IdentityUpdateTransitionV0 { #[cfg(feature = "state-transition-signing")] fn try_from_identity_with_signer<'a, S: Signer>( diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/hash/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/hash/v0/mod.rs index c8545cc203..f1b1c549cd 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/hash/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/hash/v0/mod.rs @@ -2,7 +2,6 @@ use crate::identity::identity_public_key::methods::hash::IdentityPublicKeyHashMe use crate::identity::IdentityPublicKey; use crate::state_transition::public_key_in_creation::IdentityPublicKeyInCreation; use crate::ProtocolError; -use std::convert::TryInto; impl IdentityPublicKeyInCreation { /// Get the original public key hash diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/mod.rs index 93f9d4f376..63bd4949c6 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/mod.rs @@ -7,6 +7,7 @@ use derive_more::From; use platform_serialization_derive::PlatformSignable; use platform_version::version::PlatformVersion; +#[cfg(feature = "state-transition-serde-conversion")] use serde::{Deserialize, Serialize}; pub mod accessors; diff --git a/packages/rs-dpp/src/state_transition/traits/state_transition_identity_signed.rs b/packages/rs-dpp/src/state_transition/traits/state_transition_identity_signed.rs index 4b19b3cda4..8e956af747 100644 --- a/packages/rs-dpp/src/state_transition/traits/state_transition_identity_signed.rs +++ b/packages/rs-dpp/src/state_transition/traits/state_transition_identity_signed.rs @@ -1,18 +1,30 @@ -use anyhow::anyhow; -use dashcore::secp256k1::{PublicKey as RawPublicKey, SecretKey as RawSecretKey}; - +#[cfg(any( + feature = "state-transition-signing", + feature = "state-transition-validation" +))] use crate::consensus::signature::{ InvalidSignaturePublicKeySecurityLevelError, PublicKeyIsDisabledError, }; +use anyhow::anyhow; +use dashcore::secp256k1::{PublicKey as RawPublicKey, SecretKey as RawSecretKey}; #[cfg(feature = "state-transition-validation")] use crate::state_transition::errors::WrongPublicKeyPurposeError; +#[cfg(any( + feature = "state-transition-signing", + feature = "state-transition-validation" +))] use crate::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; use crate::state_transition::StateTransitionLike; +#[cfg(any( + feature = "state-transition-signing", + feature = "state-transition-validation" +))] +use crate::identity::{IdentityPublicKey, Purpose}; use crate::{ - identity::{IdentityPublicKey, KeyID, Purpose, SecurityLevel}, + identity::{KeyID, SecurityLevel}, prelude::*, }; diff --git a/packages/rs-dpp/src/validation/mod.rs b/packages/rs-dpp/src/validation/mod.rs index d8f6579fbd..cb3abb6f20 100644 --- a/packages/rs-dpp/src/validation/mod.rs +++ b/packages/rs-dpp/src/validation/mod.rs @@ -6,6 +6,7 @@ pub use validation_result::{ ValidationResult, }; +#[cfg(feature = "validation")] use crate::version::PlatformVersion; #[cfg(feature = "validation")] use crate::ProtocolError; From 5681c4c89c0c3cd17a844ecddf8da383765f611e Mon Sep 17 00:00:00 2001 From: pauldelucia Date: Fri, 8 Mar 2024 17:32:31 +0700 Subject: [PATCH 070/191] fix: update strategy test document transitions with initial contract ids --- packages/strategy-tests/src/lib.rs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/packages/strategy-tests/src/lib.rs b/packages/strategy-tests/src/lib.rs index b62761bfb4..adc50eeec7 100644 --- a/packages/strategy-tests/src/lib.rs +++ b/packages/strategy-tests/src/lib.rs @@ -420,7 +420,19 @@ impl Strategy { updated_contract_data.set_owner_id(contract.owner_id()); } } - + + // Update any document transitions that registered to the old contract id + let mut operations = std::mem::replace(&mut self.operations, Vec::new()); + for op in operations.iter_mut() { + if let OperationType::Document(document_op) = &mut op.op_type { + document_op.contract = contract.clone(); + let document_type = contract.document_type_cloned_for_name(document_op.document_type.name()) + .expect("Expected to get a document type for name while creating initial strategy contracts"); + document_op.document_type = document_type.clone(); + } + } + self.operations = operations; + DataContractCreateTransition::new_from_data_contract( contract.clone(), *identity_nonce, From 26fb3eaacf14079b717df0f6a558d8e1c06a48d5 Mon Sep 17 00:00:00 2001 From: pauldelucia Date: Fri, 8 Mar 2024 17:39:12 +0700 Subject: [PATCH 071/191] fix: remove unnecessary clone --- packages/strategy-tests/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/strategy-tests/src/lib.rs b/packages/strategy-tests/src/lib.rs index adc50eeec7..1edc16f114 100644 --- a/packages/strategy-tests/src/lib.rs +++ b/packages/strategy-tests/src/lib.rs @@ -428,7 +428,7 @@ impl Strategy { document_op.contract = contract.clone(); let document_type = contract.document_type_cloned_for_name(document_op.document_type.name()) .expect("Expected to get a document type for name while creating initial strategy contracts"); - document_op.document_type = document_type.clone(); + document_op.document_type = document_type; } } self.operations = operations; From 22137c78bc5d9747d72f50a8449ddf030e44e647 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Fri, 8 Mar 2024 15:42:34 +0300 Subject: [PATCH 072/191] fix(drive): inconsistent platform state and version during ABCI calls (#1733) --- .pnp.cjs | 1 + Cargo.lock | 9 +- packages/dashmate/package.json | 1 + .../waitForNodeToBeReadyTaskFactory.js | 10 +- packages/rs-drive-abci/Cargo.toml | 2 +- .../rs-drive-abci/src/abci/app/consensus.rs | 22 +- packages/rs-drive-abci/src/abci/app/full.rs | 22 +- packages/rs-drive-abci/src/abci/app/mod.rs | 10 +- .../src/abci/handler/check_tx.rs | 10 +- .../src/abci/handler/extend_vote.rs | 13 +- .../src/abci/handler/finalize_block.rs | 33 +- .../rs-drive-abci/src/abci/handler/info.rs | 10 +- .../src/abci/handler/init_chain.rs | 27 +- .../src/abci/handler/prepare_proposal.rs | 50 +-- .../src/abci/handler/process_proposal.rs | 47 ++- .../src/abci/handler/verify_vote_extension.rs | 8 +- .../src/execution/check_tx/mod.rs | 4 +- .../src/execution/check_tx/v0/mod.rs | 118 ++++--- .../engine/finalize_block_proposal/mod.rs | 9 +- .../engine/finalize_block_proposal/v0/mod.rs | 54 ++-- .../engine/initialization/init_chain/mod.rs | 8 +- .../initialization/init_chain/v0/mod.rs | 42 ++- .../engine/run_block_proposal/mod.rs | 15 +- .../engine/run_block_proposal/v0/mod.rs | 38 ++- .../block_end/update_state_cache/mod.rs | 9 +- .../block_end/update_state_cache/v0/mod.rs | 34 +- .../clear_drive_block_cache/v0/mod.rs | 3 +- .../update_core_info/mod.rs | 1 + .../epoch/gather_epoch_info/mod.rs | 9 +- .../epoch/gather_epoch_info/v0/mod.rs | 7 +- .../v0/mod.rs | 2 +- .../v0/mod.rs | 2 +- .../create_genesis_state/v0/mod.rs | 10 +- .../v0/mod.rs | 2 +- .../v0/mod.rs | 2 +- .../v0/mod.rs | 2 +- .../data_contract_update/mod.rs | 6 +- .../data_triggers/triggers/dashpay/v0/mod.rs | 44 +-- .../data_triggers/triggers/dpns/v0/mod.rs | 10 +- .../triggers/feature_flags/v0/mod.rs | 2 +- .../triggers/withdrawals/v0/mod.rs | 4 +- packages/rs-drive-abci/src/mimic/mod.rs | 60 ++-- .../block_execution_outcome/v0/mod.rs | 3 + .../src/platform_types/platform/mod.rs | 24 +- .../data_contract/mod.rs | 5 +- .../data_contract/v0/mod.rs | 24 +- .../data_contract_history/mod.rs | 8 +- .../data_contract_history/v0/mod.rs | 71 +++-- .../data_contracts/mod.rs | 5 +- .../data_contracts/v0/mod.rs | 24 +- .../src/query/document_query/mod.rs | 5 +- .../src/query/document_query/v0/mod.rs | 52 +-- .../identity_based_queries/balance/mod.rs | 4 +- .../identity_based_queries/balance/v0/mod.rs | 24 +- .../balance_and_revision/mod.rs | 8 +- .../balance_and_revision/v0/mod.rs | 26 +- .../identity_based_queries/identities/mod.rs | 5 +- .../identities/v0/mod.rs | 24 +- .../identities_by_public_key_hashes/mod.rs | 9 +- .../identities_by_public_key_hashes/v0/mod.rs | 26 +- .../identity_based_queries/identity/mod.rs | 5 +- .../identity_based_queries/identity/v0/mod.rs | 24 +- .../identity_by_public_key_hash/mod.rs | 9 +- .../identity_by_public_key_hash/v0/mod.rs | 22 +- .../identity_contract_nonce/mod.rs | 8 +- .../identity_contract_nonce/v0/mod.rs | 48 +-- .../identity_nonce/mod.rs | 5 +- .../identity_nonce/v0/mod.rs | 37 +-- .../query/identity_based_queries/keys/mod.rs | 4 +- .../identity_based_queries/keys/v0/mod.rs | 48 +-- packages/rs-drive-abci/src/query/mod.rs | 21 +- .../rs-drive-abci/src/query/proofs/mod.rs | 4 +- .../rs-drive-abci/src/query/proofs/v0/mod.rs | 34 +- .../src/query/response_metadata/mod.rs | 4 +- .../src/query/response_metadata/v0/mod.rs | 50 ++- packages/rs-drive-abci/src/query/service.rs | 29 +- .../src/query/system/epoch_infos/mod.rs | 5 +- .../src/query/system/epoch_infos/v0/mod.rs | 60 ++-- .../query/system/version_upgrade_state/mod.rs | 8 +- .../system/version_upgrade_state/v0/mod.rs | 30 +- .../system/version_upgrade_vote_status/mod.rs | 9 +- .../version_upgrade_vote_status/v0/mod.rs | 28 +- .../rs-drive-abci/src/test/helpers/setup.rs | 2 +- .../tests/strategy_tests/core_update_tests.rs | 4 +- .../tests/strategy_tests/execution.rs | 8 +- .../tests/strategy_tests/failures.rs | 6 +- .../tests/strategy_tests/main.rs | 47 ++- .../tests/strategy_tests/query.rs | 24 +- .../tests/strategy_tests/strategy.rs | 2 +- .../strategy_tests/upgrade_fork_tests.rs | 297 +++++------------- .../verify_state_transitions.rs | 18 +- packages/rs-drive/Cargo.toml | 1 + .../drive/batch/drive_op_batch/document.rs | 2 +- .../src/drive/cache/system_contracts.rs | 35 ++- .../v0/mod.rs | 2 +- yarn.lock | 1 + 96 files changed, 1085 insertions(+), 975 deletions(-) diff --git a/.pnp.cjs b/.pnp.cjs index 707b2acdeb..c435d36b2c 100755 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -8416,6 +8416,7 @@ const RAW_RUNTIME_STATE = ["ajv-formats", "virtual:e822c5b02ef2b3c5fb9c8d88d5e0ca208365bff76f80510f4ccf9b1de44e2078264bcb00d3cdd5e193c256e9ab81e27c34fcfb1ad3a0e8c1dc8fa0066c78c468#npm:2.1.1"],\ ["awilix", "npm:4.3.4"],\ ["begoo", "npm:2.0.2"],\ + ["bs58", "npm:4.0.1"],\ ["chai", "npm:4.3.10"],\ ["chai-as-promised", "virtual:e2d057e7cc143d3cb9bec864f4a2d862441b5a09f81f8e6c46e7a098cbc89e4d07017cc6e2e2142d5704bb55da853cbec2d025ebc0b30e8696c31380c00f2c7d#npm:7.1.1"],\ ["chalk", "npm:4.1.2"],\ diff --git a/Cargo.lock b/Cargo.lock index 3b28b8e16a..52ee1b2e6c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -125,6 +125,12 @@ version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" +[[package]] +name = "arc-swap" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b3d0060af21e8d11a926981cc00c6c1541aa91dd64b9f881985c3da1094425f" + [[package]] name = "arrayref" version = "0.3.7" @@ -1278,6 +1284,7 @@ name = "drive" version = "1.0.0-dev.6" dependencies = [ "anyhow", + "arc-swap", "base64 0.21.7", "bs58 0.5.0", "byteorder", @@ -1313,6 +1320,7 @@ dependencies = [ name = "drive-abci" version = "1.0.0-dev.6" dependencies = [ + "arc-swap", "async-trait", "atty", "base64 0.20.0", @@ -1338,7 +1346,6 @@ dependencies = [ "metrics", "metrics-exporter-prometheus", "mockall", - "parking_lot", "platform-version", "prost 0.12.3", "rand", diff --git a/packages/dashmate/package.json b/packages/dashmate/package.json index 94c40fc359..43fc6129fa 100644 --- a/packages/dashmate/package.json +++ b/packages/dashmate/package.json @@ -73,6 +73,7 @@ "ajv-formats": "^2.1.1", "awilix": "^4.2.6", "begoo": "^2.0.2", + "bs58": "^4.0.1", "chalk": "^4.1.0", "cron": "^2.1.0", "dockerode": "^3.3.5", diff --git a/packages/dashmate/src/listr/tasks/platform/waitForNodeToBeReadyTaskFactory.js b/packages/dashmate/src/listr/tasks/platform/waitForNodeToBeReadyTaskFactory.js index e1dd60ee28..3b1bb0c61c 100644 --- a/packages/dashmate/src/listr/tasks/platform/waitForNodeToBeReadyTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/platform/waitForNodeToBeReadyTaskFactory.js @@ -1,5 +1,7 @@ import DAPIClient from '@dashevo/dapi-client'; +import bs58 from 'bs58'; import { Listr } from 'listr2'; +import WithdrawalsContract from '@dashevo/withdrawals-contract/lib/systemIds.js'; import wait from '../../../util/wait.js'; /** @@ -31,12 +33,16 @@ export default function waitForNodeToBeReadyTaskFactory() { }, }); + const withdrawalsContractId = bs58.decode(WithdrawalsContract.contractId); + let success = false; do { - const response = await dapiClient.platform.getEpochsInfo(0, 1, { + const response = await dapiClient.platform.getDataContract(withdrawalsContractId, { retries: 0, + prove: false, }) - .catch(() => {}); + .catch(() => { + }); success = Boolean(response); diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index 332d578fd3..318d7eab49 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -13,6 +13,7 @@ rust-version = "1.76" license = "MIT" [dependencies] +arc-swap = "1.7.0" bincode = { version = "2.0.0-rc.3", features = ["serde"] } ciborium = { git = "https://github.com/qrayven/ciborium", branch = "feat-ser-null-as-undefined" } chrono = "0.4.20" @@ -29,7 +30,6 @@ drive = { path = "../rs-drive", default-features = false, features = [ thiserror = "1.0.30" rand = "0.8.5" tempfile = "3.3.0" -parking_lot = "0.12.1" hex = "0.4.3" indexmap = { version = "1.9.3", features = ["serde"] } sha2 = "0.10.6" diff --git a/packages/rs-drive-abci/src/abci/app/consensus.rs b/packages/rs-drive-abci/src/abci/app/consensus.rs index be940cd1d9..13bb627f48 100644 --- a/packages/rs-drive-abci/src/abci/app/consensus.rs +++ b/packages/rs-drive-abci/src/abci/app/consensus.rs @@ -1,11 +1,14 @@ -use crate::abci::app::{PlatformApplication, TransactionalApplication}; +use crate::abci::app::{BlockExecutionApplication, PlatformApplication, TransactionalApplication}; use crate::abci::handler; use crate::abci::handler::error::error_into_exception; use crate::error::execution::ExecutionError; use crate::error::Error; +use crate::execution::types::block_execution_context::BlockExecutionContext; use crate::platform_types::platform::Platform; use crate::rpc::core::CoreRPCLike; +use dpp::version::PlatformVersion; use drive::grovedb::Transaction; +use std::cell::{Ref, RefCell, RefMut}; use std::fmt::Debug; use std::sync::RwLock; use tenderdash_abci::proto::abci as proto; @@ -17,8 +20,10 @@ use tenderdash_abci::proto::abci as proto; pub struct ConsensusAbciApplication<'a, C> { /// Platform platform: &'a Platform, - /// The current transaction + /// The current GroveDb transaction transaction: RwLock>>, + /// The current block execution context + block_execution_context: RwLock>, } impl<'a, C> ConsensusAbciApplication<'a, C> { @@ -26,7 +31,8 @@ impl<'a, C> ConsensusAbciApplication<'a, C> { pub fn new(platform: &'a Platform) -> Self { Self { platform, - transaction: RwLock::new(None), + transaction: Default::default(), + block_execution_context: Default::default(), } } } @@ -37,6 +43,12 @@ impl<'a, C> PlatformApplication for ConsensusAbciApplication<'a, C> { } } +impl<'a, C> BlockExecutionApplication for ConsensusAbciApplication<'a, C> { + fn block_execution_context(&self) -> &RwLock> { + &self.block_execution_context + } +} + impl<'a, C> TransactionalApplication<'a> for ConsensusAbciApplication<'a, C> { /// create and store a new transaction fn start_transaction(&self) { @@ -49,7 +61,7 @@ impl<'a, C> TransactionalApplication<'a> for ConsensusAbciApplication<'a, C> { } /// Commit a transaction - fn commit_transaction(&self) -> Result<(), Error> { + fn commit_transaction(&self, platform_version: &PlatformVersion) -> Result<(), Error> { let transaction = self .transaction .write() @@ -59,8 +71,6 @@ impl<'a, C> TransactionalApplication<'a> for ConsensusAbciApplication<'a, C> { "trying to commit a transaction, but we are not in one", )))?; - let platform_state = self.platform.state.read(); - let platform_version = platform_state.current_platform_version()?; self.platform .drive .commit_transaction(transaction, &platform_version.drive) diff --git a/packages/rs-drive-abci/src/abci/app/full.rs b/packages/rs-drive-abci/src/abci/app/full.rs index 4dc20c4c39..e760301deb 100644 --- a/packages/rs-drive-abci/src/abci/app/full.rs +++ b/packages/rs-drive-abci/src/abci/app/full.rs @@ -1,10 +1,12 @@ -use crate::abci::app::{PlatformApplication, TransactionalApplication}; +use crate::abci::app::{BlockExecutionApplication, PlatformApplication, TransactionalApplication}; use crate::abci::handler; use crate::abci::handler::error::error_into_exception; use crate::error::execution::ExecutionError; use crate::error::Error; +use crate::execution::types::block_execution_context::BlockExecutionContext; use crate::platform_types::platform::Platform; use crate::rpc::core::CoreRPCLike; +use dpp::version::PlatformVersion; use drive::grovedb::Transaction; use std::fmt::Debug; use std::sync::RwLock; @@ -17,8 +19,10 @@ use tenderdash_abci::proto::abci as proto; pub struct FullAbciApplication<'a, C> { /// Platform pub platform: &'a Platform, - /// The current transaction + /// The current GroveDB transaction pub transaction: RwLock>>, + /// The current block execution context + pub block_execution_context: RwLock>, } impl<'a, C> FullAbciApplication<'a, C> { @@ -26,7 +30,8 @@ impl<'a, C> FullAbciApplication<'a, C> { pub fn new(platform: &'a Platform) -> Self { Self { platform, - transaction: RwLock::new(None), + transaction: Default::default(), + block_execution_context: Default::default(), } } } @@ -37,6 +42,12 @@ impl<'a, C> PlatformApplication for FullAbciApplication<'a, C> { } } +impl<'a, C> BlockExecutionApplication for FullAbciApplication<'a, C> { + fn block_execution_context(&self) -> &RwLock> { + &self.block_execution_context + } +} + impl<'a, C> TransactionalApplication<'a> for FullAbciApplication<'a, C> { /// create and store a new transaction fn start_transaction(&self) { @@ -49,7 +60,7 @@ impl<'a, C> TransactionalApplication<'a> for FullAbciApplication<'a, C> { } /// Commit a transaction - fn commit_transaction(&self) -> Result<(), Error> { + fn commit_transaction(&self, platform_version: &PlatformVersion) -> Result<(), Error> { let transaction = self .transaction .write() @@ -58,8 +69,7 @@ impl<'a, C> TransactionalApplication<'a> for FullAbciApplication<'a, C> { .ok_or(Error::Execution(ExecutionError::NotInTransaction( "trying to commit a transaction, but we are not in one", )))?; - let platform_state = self.platform.state.read(); - let platform_version = platform_state.current_platform_version()?; + self.platform .drive .commit_transaction(transaction, &platform_version.drive) diff --git a/packages/rs-drive-abci/src/abci/app/mod.rs b/packages/rs-drive-abci/src/abci/app/mod.rs index 5fbf906eb1..d86290b566 100644 --- a/packages/rs-drive-abci/src/abci/app/mod.rs +++ b/packages/rs-drive-abci/src/abci/app/mod.rs @@ -9,9 +9,11 @@ mod consensus; pub mod execution_result; mod full; +use crate::execution::types::block_execution_context::BlockExecutionContext; use crate::rpc::core::DefaultCoreRPC; pub use check_tx::CheckTxAbciApplication; pub use consensus::ConsensusAbciApplication; +use dpp::version::PlatformVersion; pub use full::FullAbciApplication; /// Platform-based ABCI application @@ -29,5 +31,11 @@ pub trait TransactionalApplication<'a> { fn transaction(&self) -> &RwLock>>; /// Commits created transaction - fn commit_transaction(&self) -> Result<(), Error>; + fn commit_transaction(&self, platform_version: &PlatformVersion) -> Result<(), Error>; +} + +/// Application that executes blocks and need to keep context between handlers +pub trait BlockExecutionApplication { + /// Returns the current block execution context + fn block_execution_context(&self) -> &RwLock>; } diff --git a/packages/rs-drive-abci/src/abci/handler/check_tx.rs b/packages/rs-drive-abci/src/abci/handler/check_tx.rs index 63eed5b87f..93de303577 100644 --- a/packages/rs-drive-abci/src/abci/handler/check_tx.rs +++ b/packages/rs-drive-abci/src/abci/handler/check_tx.rs @@ -16,12 +16,16 @@ where { let _timer = crate::metrics::abci_request_duration("check_tx"); - let platform_state = platform.state.read(); + let platform_state = platform.state.load(); let platform_version = platform_state.current_platform_version()?; - drop(platform_state); let proto::RequestCheckTx { tx, r#type } = request; - match platform.check_tx(tx.as_slice(), r#type.try_into()?, platform_version) { + match platform.check_tx( + tx.as_slice(), + r#type.try_into()?, + &platform_state, + platform_version, + ) { Ok(validation_result) => { let first_consensus_error = validation_result.errors.first(); diff --git a/packages/rs-drive-abci/src/abci/handler/extend_vote.rs b/packages/rs-drive-abci/src/abci/handler/extend_vote.rs index ae4943adcb..b000deea6b 100644 --- a/packages/rs-drive-abci/src/abci/handler/extend_vote.rs +++ b/packages/rs-drive-abci/src/abci/handler/extend_vote.rs @@ -1,4 +1,4 @@ -use crate::abci::app::{PlatformApplication, TransactionalApplication}; +use crate::abci::app::{BlockExecutionApplication, PlatformApplication, TransactionalApplication}; use crate::abci::AbciError; use crate::error::execution::ExecutionError; use crate::error::Error; @@ -14,7 +14,7 @@ pub fn extend_vote<'a, A, C>( request: proto::RequestExtendVote, ) -> Result where - A: PlatformApplication + TransactionalApplication<'a>, + A: PlatformApplication + TransactionalApplication<'a> + BlockExecutionApplication, C: CoreRPCLike, { let _timer = crate::metrics::abci_request_duration("extend_vote"); @@ -24,9 +24,9 @@ where height, round, } = request; - let guarded_block_execution_context = app.platform().block_execution_context.read().unwrap(); + let block_execution_context_guard = app.block_execution_context().read().unwrap(); let block_execution_context = - guarded_block_execution_context + block_execution_context_guard .as_ref() .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( "block execution context must be set in block begin handler for extend vote", @@ -36,12 +36,11 @@ where let block_state_info = &block_execution_context.block_state_info(); if !block_state_info.matches_current_block(height as u64, round as u32, block_hash.clone())? { - return Err(Error::from(AbciError::RequestForWrongBlockReceived(format!( + return Err(AbciError::RequestForWrongBlockReceived(format!( "received extend vote request for height: {} round: {}, block: {}; expected height: {} round: {}, block: {}", height, round, hex::encode(block_hash), block_state_info.height(), block_state_info.round(), block_state_info.block_hash().map(hex::encode).unwrap_or("None".to_string()) - ))) - .into()); + )).into()); } // Extend vote with unsigned withdrawal transactions diff --git a/packages/rs-drive-abci/src/abci/handler/finalize_block.rs b/packages/rs-drive-abci/src/abci/handler/finalize_block.rs index f718092435..388262a0fa 100644 --- a/packages/rs-drive-abci/src/abci/handler/finalize_block.rs +++ b/packages/rs-drive-abci/src/abci/handler/finalize_block.rs @@ -1,6 +1,7 @@ -use crate::abci::app::{PlatformApplication, TransactionalApplication}; +use crate::abci::app::{BlockExecutionApplication, PlatformApplication, TransactionalApplication}; use crate::error::execution::ExecutionError; use crate::error::Error; +use crate::execution::types::block_execution_context::v0::BlockExecutionContextV0Getters; use crate::rpc::core::CoreRPCLike; use tenderdash_abci::proto::abci as proto; @@ -9,13 +10,12 @@ pub fn finalize_block<'a, A, C>( request: proto::RequestFinalizeBlock, ) -> Result where - A: PlatformApplication + TransactionalApplication<'a>, + A: PlatformApplication + TransactionalApplication<'a> + BlockExecutionApplication, C: CoreRPCLike, { let _timer = crate::metrics::abci_request_duration("finalize_block"); let transaction_guard = app.transaction().read().unwrap(); - let transaction = transaction_guard .as_ref() @@ -23,9 +23,26 @@ where "trying to finalize block without a current transaction", )))?; - let block_finalization_outcome = app - .platform() - .finalize_block_proposal(request.try_into()?, transaction)?; + // Get current block platform version + let block_execution_context = app + .block_execution_context() + .write() + .unwrap() + .take() + .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( + "block execution context must be set in block begin handler for finalize block", + )))?; + + let platform_version = app.platform().state.load().current_platform_version()?; + + let block_finalization_outcome = app.platform().finalize_block_proposal( + request.try_into()?, + block_execution_context, + transaction, + platform_version, + )?; + + drop(transaction_guard); //FIXME: tell tenderdash about the problem instead // This can not go to production! @@ -40,9 +57,7 @@ where )); } - drop(transaction_guard); - - app.commit_transaction()?; + app.commit_transaction(platform_version)?; Ok(proto::ResponseFinalizeBlock { events: vec![], diff --git a/packages/rs-drive-abci/src/abci/handler/info.rs b/packages/rs-drive-abci/src/abci/handler/info.rs index 7c6fd64869..5ec0bdf74c 100644 --- a/packages/rs-drive-abci/src/abci/handler/info.rs +++ b/packages/rs-drive-abci/src/abci/handler/info.rs @@ -19,9 +19,9 @@ where .into()); } - let state_guard = app.platform().state.read(); + let platform_state = app.platform().state.load(); - let state_app_hash = state_guard + let state_app_hash = platform_state .last_committed_block_app_hash() .map(|app_hash| app_hash.to_vec()) .unwrap_or_default(); @@ -31,7 +31,7 @@ where let response = proto::ResponseInfo { data: "".to_string(), app_version: latest_platform_version.protocol_version as u64, - last_block_height: state_guard.last_committed_block_height() as i64, + last_block_height: platform_state.last_committed_block_height() as i64, version: env!("CARGO_PKG_VERSION").to_string(), last_block_app_hash: state_app_hash.clone(), }; @@ -42,13 +42,13 @@ where block_version = request.block_version, p2p_version = request.p2p_version, app_hash = hex::encode(state_app_hash), - height = state_guard.last_committed_block_height(), + height = platform_state.last_committed_block_height(), "Handshake with consensus engine", ); if tracing::enabled!(tracing::Level::TRACE) { tracing::trace!( - platform_state_fingerprint = hex::encode(state_guard.fingerprint()), + platform_state_fingerprint = hex::encode(platform_state.fingerprint()), "platform runtime state", ); } diff --git a/packages/rs-drive-abci/src/abci/handler/init_chain.rs b/packages/rs-drive-abci/src/abci/handler/init_chain.rs index 0d433ee845..f47e7e903f 100644 --- a/packages/rs-drive-abci/src/abci/handler/init_chain.rs +++ b/packages/rs-drive-abci/src/abci/handler/init_chain.rs @@ -1,7 +1,8 @@ -use crate::abci::app::{PlatformApplication, TransactionalApplication}; +use crate::abci::app::{BlockExecutionApplication, PlatformApplication, TransactionalApplication}; use crate::error::Error; use crate::platform_types::platform_state::PlatformState; use crate::rpc::core::CoreRPCLike; +use std::sync::Arc; use tenderdash_abci::proto::abci as proto; pub fn init_chain<'a, A, C>( @@ -9,30 +10,24 @@ pub fn init_chain<'a, A, C>( request: proto::RequestInitChain, ) -> Result where - A: PlatformApplication + TransactionalApplication<'a>, + A: PlatformApplication + TransactionalApplication<'a> + BlockExecutionApplication, C: CoreRPCLike, { app.start_transaction(); - let chain_id = request.chain_id.to_string(); + let transaction_guard = app.transaction().read().unwrap(); + let transaction = transaction_guard + .as_ref() + .expect("transaction must be started"); // We need to drop the block execution context just in case init chain had already been called - let mut block_execution_context = app.platform().block_execution_context.write().unwrap(); - let block_context = block_execution_context.take(); //drop the block execution context + let block_context = app.block_execution_context().write().unwrap().take(); //drop the block execution context if block_context.is_some() { - tracing::warn!("block context was present during init chain, restarting"); - let protocol_version_in_consensus = app.platform().config.initial_protocol_version; - let mut platform_state_write_guard = app.platform().state.write(); - *platform_state_write_guard = PlatformState::default_with_protocol_versions( - protocol_version_in_consensus, - protocol_version_in_consensus, - ); - drop(platform_state_write_guard); + tracing::warn!("block context was present during init chain, dropping it"); } - drop(block_execution_context); - let transaction_guard = app.transaction().read().unwrap(); - let transaction = transaction_guard.as_ref().unwrap(); + let chain_id = request.chain_id.to_string(); + let response = app.platform().init_chain(request, transaction)?; transaction.set_savepoint(); diff --git a/packages/rs-drive-abci/src/abci/handler/prepare_proposal.rs b/packages/rs-drive-abci/src/abci/handler/prepare_proposal.rs index b4587cffb9..e655f99a3a 100644 --- a/packages/rs-drive-abci/src/abci/handler/prepare_proposal.rs +++ b/packages/rs-drive-abci/src/abci/handler/prepare_proposal.rs @@ -1,4 +1,4 @@ -use crate::abci::app::{PlatformApplication, TransactionalApplication}; +use crate::abci::app::{BlockExecutionApplication, PlatformApplication, TransactionalApplication}; use crate::abci::AbciError; use crate::error::Error; use crate::execution::types::block_execution_context::v0::BlockExecutionContextV0Setters; @@ -20,7 +20,7 @@ pub fn prepare_proposal<'a, A, C>( mut request: proto::RequestPrepareProposal, ) -> Result where - A: PlatformApplication + TransactionalApplication<'a>, + A: PlatformApplication + TransactionalApplication<'a> + BlockExecutionApplication, C: CoreRPCLike, { let timer = crate::metrics::abci_request_duration("prepare_proposal"); @@ -30,13 +30,13 @@ where // propose one // This is done before all else - let state = app.platform().state.read(); + let platform_state = app.platform().state.load(); - let last_committed_core_height = state.last_committed_core_height(); + let last_committed_core_height = platform_state.last_committed_core_height(); let core_chain_lock_update = match app.platform().core_rpc.get_best_chain_lock() { Ok(latest_chain_lock) => { - if state.last_committed_block_info().is_none() + if platform_state.last_committed_block_info().is_none() || latest_chain_lock.block_height > last_committed_core_height { Some(latest_chain_lock) @@ -47,8 +47,6 @@ where Err(_) => None, }; - drop(state); - // Filter out transactions exceeding max_block_size let mut transactions_exceeding_max_block_size = Vec::new(); { @@ -86,29 +84,33 @@ where // Prepare transaction let transaction_guard = if request.height == app.platform().config.abci.genesis_height as i64 { // special logic on init chain - let transaction = app.transaction().read().unwrap(); - if transaction.is_none() { + let transaction_guard = app.transaction().read().unwrap(); + if transaction_guard.is_none() { return Err(Error::Abci(AbciError::BadRequest("received a prepare proposal request for the genesis height before an init chain request".to_string())))?; - } + }; if request.round > 0 { - transaction.as_ref().map(|tx| tx.rollback_to_savepoint()); - } - transaction + transaction_guard + .as_ref() + .map(|tx| tx.rollback_to_savepoint()); + }; + transaction_guard } else { app.start_transaction(); app.transaction().read().unwrap() }; - let transaction = transaction_guard.as_ref().unwrap(); + let transaction = transaction_guard + .as_ref() + .expect("transaction must be started"); // Running the proposal executes all the state transitions for the block - let mut run_result = app - .platform() - .run_block_proposal(block_proposal, true, transaction)?; + let mut run_result = + app.platform() + .run_block_proposal(block_proposal, true, &platform_state, transaction)?; if !run_result.is_valid() { // This is a system error, because we are proposing - return Err(run_result.errors.remove(0).into()); + return Err(run_result.errors.remove(0)); } let block_execution_outcome::v0::BlockExecutionOutcome { @@ -116,8 +118,10 @@ where state_transitions_result, validator_set_update, protocol_version, + mut block_execution_context, } = run_result.into_data().map_err(Error::Protocol)?; + // TODO: This is current protocol version and can be read from the state let platform_version = PlatformVersion::get(protocol_version) .expect("must be set in run block proposal from existing protocol version"); @@ -188,13 +192,13 @@ where consensus_param_updates: None, }; - let mut block_execution_context_guard = app.platform().block_execution_context.write().unwrap(); - - let block_execution_context = block_execution_context_guard - .as_mut() - .expect("expected that a block execution context was set"); block_execution_context.set_proposer_results(Some(response.clone())); + app.block_execution_context() + .write() + .unwrap() + .replace(block_execution_context); + let elapsed_time_ms = timer.elapsed().as_millis(); tracing::info!( diff --git a/packages/rs-drive-abci/src/abci/handler/process_proposal.rs b/packages/rs-drive-abci/src/abci/handler/process_proposal.rs index 9a1b69d728..53ff41f5df 100644 --- a/packages/rs-drive-abci/src/abci/handler/process_proposal.rs +++ b/packages/rs-drive-abci/src/abci/handler/process_proposal.rs @@ -1,4 +1,4 @@ -use crate::abci::app::{PlatformApplication, TransactionalApplication}; +use crate::abci::app::{BlockExecutionApplication, PlatformApplication, TransactionalApplication}; use crate::abci::AbciError; use crate::error::Error; use crate::execution::types::block_execution_context::v0::{ @@ -20,14 +20,13 @@ pub fn process_proposal<'a, A, C>( request: proto::RequestProcessProposal, ) -> Result where - A: PlatformApplication + TransactionalApplication<'a>, + A: PlatformApplication + TransactionalApplication<'a> + BlockExecutionApplication, C: CoreRPCLike, { let timer = crate::metrics::abci_request_duration("process_proposal"); - let mut block_execution_context_guard = app.platform().block_execution_context.write().unwrap(); - let mut drop_block_execution_context = false; + let mut block_execution_context_guard = app.block_execution_context().write().unwrap(); if let Some(block_execution_context) = block_execution_context_guard.as_mut() { // We are already in a block, or in init chain. // This only makes sense if we were the proposer unless we are at a future round @@ -70,13 +69,13 @@ where // This is a terrible issue return Err(Error::Abci(AbciError::BadRequest( "received a process proposal request twice with different hash".to_string(), - )))?; + ))); } } else { let Some(proposal_info) = block_execution_context.proposer_results() else { return Err(Error::Abci(AbciError::BadRequest( "received a process proposal request twice".to_string(), - )))?; + ))); }; let expected_transactions = proposal_info @@ -146,31 +145,41 @@ where } if drop_block_execution_context { - *block_execution_context_guard = None; + block_execution_context_guard.take(); } drop(block_execution_context_guard); // Get transaction let transaction_guard = if request.height == app.platform().config.abci.genesis_height as i64 { // special logic on init chain - let transaction = app.transaction().read().unwrap(); - if transaction.is_none() { - return Err(Error::Abci(AbciError::BadRequest("received a process proposal request for the genesis height before an init chain request".to_string())))?; + let transaction_guard = app.transaction().read().unwrap(); + if transaction_guard.is_none() { + return Err(Error::Abci(AbciError::BadRequest("received a process proposal request for the genesis height before an init chain request".to_string()))); } if request.round > 0 { - transaction.as_ref().map(|tx| tx.rollback_to_savepoint()); + transaction_guard + .as_ref() + .map(|tx| tx.rollback_to_savepoint()); } - transaction + transaction_guard } else { app.start_transaction(); app.transaction().read().unwrap() }; - let transaction = transaction_guard.as_ref().unwrap(); + + let transaction = transaction_guard + .as_ref() + .expect("transaction must be started"); + + let platform_state = app.platform().state.load(); // Running the proposal executes all the state transitions for the block - let run_result = - app.platform() - .run_block_proposal((&request).try_into()?, false, transaction)?; + let run_result = app.platform().run_block_proposal( + (&request).try_into()?, + false, + &platform_state, + transaction, + )?; if !run_result.is_valid() { // This was an error running this proposal, tell tenderdash that the block isn't valid @@ -194,11 +203,17 @@ where state_transitions_result: state_transition_results, validator_set_update, protocol_version, + block_execution_context, } = run_result.into_data().map_err(Error::Protocol)?; let platform_version = PlatformVersion::get(protocol_version) .expect("must be set in run block proposer from existing platform version"); + app.block_execution_context() + .write() + .unwrap() + .replace(block_execution_context); + let invalid_tx_count = state_transition_results.invalid_paid_count(); let valid_tx_count = state_transition_results.valid_count(); diff --git a/packages/rs-drive-abci/src/abci/handler/verify_vote_extension.rs b/packages/rs-drive-abci/src/abci/handler/verify_vote_extension.rs index 9452b2859f..fc75ec193b 100644 --- a/packages/rs-drive-abci/src/abci/handler/verify_vote_extension.rs +++ b/packages/rs-drive-abci/src/abci/handler/verify_vote_extension.rs @@ -1,4 +1,4 @@ -use crate::abci::app::PlatformApplication; +use crate::abci::app::{BlockExecutionApplication, PlatformApplication}; use crate::error::Error; use crate::execution::types::block_execution_context::v0::BlockExecutionContextV0Getters; use crate::execution::types::block_state_info::v0::BlockStateInfoV0Getters; @@ -13,7 +13,7 @@ pub fn verify_vote_extension( request: proto::RequestVerifyVoteExtension, ) -> Result where - A: PlatformApplication, + A: PlatformApplication + BlockExecutionApplication, C: CoreRPCLike, { let _timer = crate::metrics::abci_request_duration("verify_vote_extension"); @@ -30,8 +30,8 @@ where let round: u32 = round as u32; // Make sure we are in a block execution phase - let guarded_block_execution_context = app.platform().block_execution_context.read().unwrap(); - let Some(block_execution_context) = guarded_block_execution_context.as_ref() else { + let block_execution_context_ref = app.block_execution_context().read().unwrap(); + let Some(block_execution_context) = block_execution_context_ref.as_ref() else { tracing::warn!( "vote extensions for height: {}, round: {} are rejected because we are not in a block execution phase", height, diff --git a/packages/rs-drive-abci/src/execution/check_tx/mod.rs b/packages/rs-drive-abci/src/execution/check_tx/mod.rs index 1f7f3d679f..73d1bf379d 100644 --- a/packages/rs-drive-abci/src/execution/check_tx/mod.rs +++ b/packages/rs-drive-abci/src/execution/check_tx/mod.rs @@ -3,6 +3,7 @@ use crate::error::Error; use crate::platform_types::platform::Platform; use crate::abci::AbciError; +use crate::platform_types::platform_state::PlatformState; use crate::rpc::core::CoreRPCLike; use dpp::consensus::ConsensusError; use dpp::fee::fee_result::FeeResult; @@ -87,10 +88,11 @@ where &self, raw_tx: &[u8], check_tx_level: CheckTxLevel, + platform_state: &PlatformState, platform_version: &PlatformVersion, ) -> Result, Error> { match platform_version.drive_abci.methods.engine.check_tx { - 0 => self.check_tx_v0(raw_tx, check_tx_level, platform_version), + 0 => self.check_tx_v0(raw_tx, check_tx_level, platform_state, platform_version), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "check_tx".to_string(), known_versions: vec![0], diff --git a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs index c004922a26..bdda71fac8 100644 --- a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs @@ -16,6 +16,7 @@ use dpp::consensus::ConsensusError; #[cfg(test)] use crate::execution::validation::state_transition::processor::process_state_transition; +use crate::platform_types::platform_state::PlatformState; use dpp::serialization::PlatformDeserializable; use dpp::state_transition::StateTransition; #[cfg(test)] @@ -38,7 +39,7 @@ where let state_transition = StateTransition::deserialize_from_bytes(raw_tx.as_slice()).map_err(Error::Protocol)?; - let state_read_guard = self.state.read(); + let state_read_guard = self.state.load(); let platform_ref = PlatformRef { drive: &self.drive, @@ -85,6 +86,7 @@ where &self, raw_tx: &[u8], check_tx_level: CheckTxLevel, + platform_state: &PlatformState, platform_version: &PlatformVersion, ) -> Result, Error> { let state_transition = match StateTransition::deserialize_from_bytes(raw_tx) { @@ -98,14 +100,9 @@ where } }; - // TODO: We lock state for entire check tx execution that could lead to performance issues - // and writer starvation. - - let state_read_guard = self.state.read(); - let platform_ref = PlatformRef { drive: &self.drive, - state: &state_read_guard, + state: platform_state, config: &self.config, core_rpc: &self.core_rpc, }; @@ -123,7 +120,7 @@ where if let Some(execution_event) = execution_event { self.validate_fees_of_event( execution_event, - state_read_guard.last_block_info(), + platform_state.last_block_info(), None, platform_version, ) @@ -213,8 +210,8 @@ mod tests { .expect_verify_instant_lock() .returning(|_, _| Ok(true)); - let state = platform.state.read(); - let protocol_version = state.current_protocol_version_in_consensus(); + let platform_state = platform.state.load(); + let protocol_version = platform_state.current_protocol_version_in_consensus(); let platform_version = PlatformVersion::get(protocol_version).unwrap(); let tx: Vec = vec![ @@ -267,13 +264,13 @@ mod tests { let transaction = platform.drive.grove.start_transaction(); let check_result = platform - .check_tx(&tx, FirstTimeCheck, platform_version) + .check_tx(&tx, FirstTimeCheck, &platform_state, platform_version) .expect("expected to check tx"); assert!(check_result.is_valid()); let check_result = platform - .check_tx(&tx, Recheck, platform_version) + .check_tx(&tx, Recheck, &platform_state, platform_version) .expect("expected to check tx"); assert!(check_result.is_valid()); @@ -282,7 +279,7 @@ mod tests { .platform .process_raw_state_transitions( &vec![tx.clone()], - &state, + &platform_state, &BlockInfo::default(), &transaction, platform_version, @@ -290,7 +287,7 @@ mod tests { .expect("expected to process state transition"); let check_result = platform - .check_tx(&tx, Recheck, platform_version) + .check_tx(&tx, Recheck, &platform_state, platform_version) .expect("expected to check tx"); assert!(!check_result.is_valid()); @@ -307,8 +304,8 @@ mod tests { .expect_verify_instant_lock() .returning(|_, _| Ok(true)); - let state = platform.state.read(); - let protocol_version = state.current_protocol_version_in_consensus(); + let platform_state = platform.state.load(); + let protocol_version = platform_state.current_protocol_version_in_consensus(); let platform_version = PlatformVersion::get(protocol_version).unwrap(); let (key, private_key) = IdentityPublicKey::random_ecdsa_critical_level_authentication_key( @@ -356,13 +353,23 @@ mod tests { .expect("expected to insert identity"); let validation_result = platform - .check_tx(serialized.as_slice(), FirstTimeCheck, platform_version) + .check_tx( + serialized.as_slice(), + FirstTimeCheck, + &platform_state, + platform_version, + ) .expect("expected to check tx"); assert!(validation_result.errors.is_empty()); let check_result = platform - .check_tx(serialized.as_slice(), Recheck, platform_version) + .check_tx( + serialized.as_slice(), + Recheck, + &platform_state, + platform_version, + ) .expect("expected to check tx"); assert!(check_result.is_valid()); @@ -373,7 +380,7 @@ mod tests { .platform .process_raw_state_transitions( &vec![serialized.clone()], - &state, + &platform_state, &BlockInfo::default(), &transaction, platform_version, @@ -381,7 +388,12 @@ mod tests { .expect("expected to process state transition"); let check_result = platform - .check_tx(serialized.as_slice(), Recheck, platform_version) + .check_tx( + serialized.as_slice(), + Recheck, + &platform_state, + platform_version, + ) .expect("expected to check tx"); assert!(check_result.is_valid()); // it should still be valid, because we didn't commit the transaction @@ -394,7 +406,12 @@ mod tests { .expect("expected to commit"); let check_result = platform - .check_tx(serialized.as_slice(), Recheck, platform_version) + .check_tx( + serialized.as_slice(), + Recheck, + &platform_state, + platform_version, + ) .expect("expected to check tx"); assert!(check_result.is_valid()); // it should still be valid, because we don't validate state @@ -411,8 +428,8 @@ mod tests { .expect_verify_instant_lock() .returning(|_, _| Ok(true)); - let state = platform.state.read(); - let protocol_version = state.current_protocol_version_in_consensus(); + let platform_state = platform.state.load(); + let protocol_version = platform_state.current_protocol_version_in_consensus(); let platform_version = PlatformVersion::get(protocol_version).unwrap(); let (key, private_key) = IdentityPublicKey::random_ecdsa_critical_level_authentication_key( @@ -460,13 +477,23 @@ mod tests { .expect("expected to insert identity"); let validation_result = platform - .check_tx(serialized.as_slice(), FirstTimeCheck, platform_version) + .check_tx( + serialized.as_slice(), + FirstTimeCheck, + &platform_state, + platform_version, + ) .expect("expected to check tx"); assert!(validation_result.errors.is_empty()); let check_result = platform - .check_tx(serialized.as_slice(), Recheck, platform_version) + .check_tx( + serialized.as_slice(), + Recheck, + &platform_state, + platform_version, + ) .expect("expected to check tx"); assert!(check_result.is_valid()); @@ -477,7 +504,7 @@ mod tests { .platform .process_raw_state_transitions( &vec![serialized.clone()], - &state, + &platform_state, &BlockInfo::default(), &transaction, platform_version, @@ -485,7 +512,12 @@ mod tests { .expect("expected to process state transition"); let check_result = platform - .check_tx(serialized.as_slice(), Recheck, platform_version) + .check_tx( + serialized.as_slice(), + Recheck, + &platform_state, + platform_version, + ) .expect("expected to check tx"); assert!(check_result.is_valid()); // it should still be valid, because we didn't commit the transaction @@ -498,7 +530,12 @@ mod tests { .expect("expected to commit"); let check_result = platform - .check_tx(serialized.as_slice(), Recheck, platform_version) + .check_tx( + serialized.as_slice(), + Recheck, + &platform_state, + platform_version, + ) .expect("expected to check tx"); assert!(!check_result.is_valid()); // the identity shouldn't have enough balance anymore @@ -516,7 +553,7 @@ mod tests { .expect_verify_instant_lock() .returning(|_, _| Ok(true)); - let platform_state = platform.state.read(); + let platform_state = platform.state.load(); let platform_version = platform_state.current_platform_version().unwrap(); let mut signer = SimpleSigner::default(); @@ -674,6 +711,7 @@ mod tests { .check_tx( documents_batch_update_serialized_transition.as_slice(), FirstTimeCheck, + &platform_state, platform_version, ) .expect("expected to check tx"); @@ -692,7 +730,7 @@ mod tests { .expect_verify_instant_lock() .returning(|_, _| Ok(true)); - let platform_state = platform.state.read(); + let platform_state = platform.state.load(); let platform_version = platform_state.current_platform_version().unwrap(); let mut signer = SimpleSigner::default(); @@ -788,6 +826,7 @@ mod tests { .check_tx( identity_top_up_serialized_transition.as_slice(), FirstTimeCheck, + &platform_state, platform_version, ) .expect("expected to check tx"); @@ -820,7 +859,7 @@ mod tests { .expect_verify_instant_lock() .returning(|_, _| Ok(true)); - let platform_state = platform.state.read(); + let platform_state = platform.state.load(); let platform_version = platform_state.current_platform_version().unwrap(); let mut signer = SimpleSigner::default(); @@ -916,6 +955,7 @@ mod tests { .check_tx( identity_top_up_serialized_transition.as_slice(), FirstTimeCheck, + &platform_state, platform_version, ) .expect("expected to check tx"); @@ -940,6 +980,7 @@ mod tests { .check_tx( identity_top_up_serialized_transition.as_slice(), FirstTimeCheck, + &platform_state, platform_version, ) .expect("expected to check tx"); @@ -955,6 +996,7 @@ mod tests { .check_tx( identity_top_up_serialized_transition.as_slice(), Recheck, + &platform_state, platform_version, ) .expect("expected to check tx"); @@ -978,7 +1020,7 @@ mod tests { .expect_verify_instant_lock() .returning(|_, _| Ok(true)); - let platform_state = platform.state.read(); + let platform_state = platform.state.load(); let platform_version = platform_state.current_platform_version().unwrap(); let mut signer = SimpleSigner::default(); @@ -1045,6 +1087,7 @@ mod tests { .check_tx( identity_top_up_serialized_transition.as_slice(), FirstTimeCheck, + &platform_state, platform_version, ) .expect("expected to check tx"); @@ -1068,7 +1111,7 @@ mod tests { .expect_verify_instant_lock() .returning(|_, _| Ok(true)); - let platform_state = platform.state.read(); + let platform_state = platform.state.load(); let platform_version = platform_state.current_platform_version().unwrap(); let mut signer = SimpleSigner::default(); @@ -1164,6 +1207,7 @@ mod tests { .check_tx( identity_top_up_serialized_transition.as_slice(), FirstTimeCheck, + &platform_state, platform_version, ) .expect("expected to check tx"); @@ -1228,6 +1272,7 @@ mod tests { .check_tx( identity_create_serialized_transition.as_slice(), FirstTimeCheck, + &platform_state, platform_version, ) .expect("expected to check tx"); @@ -1243,6 +1288,7 @@ mod tests { .check_tx( identity_create_serialized_transition.as_slice(), Recheck, + &platform_state, platform_version, ) .expect("expected to check tx"); @@ -1288,7 +1334,7 @@ mod tests { .expect_verify_instant_lock() .returning(|_, _| Ok(true)); - let platform_state = platform.state.read(); + let platform_state = platform.state.load(); let platform_version = platform_state.current_platform_version().unwrap(); let genesis_time = 0; @@ -1359,6 +1405,7 @@ mod tests { .check_tx( update_transition_bytes.as_slice(), FirstTimeCheck, + &platform_state, platform_version, ) .expect("expected to execute identity top up tx"); @@ -1401,7 +1448,7 @@ mod tests { .expect_verify_instant_lock() .returning(|_, _| Ok(true)); - let platform_state = platform.state.read(); + let platform_state = platform.state.load(); let platform_version = platform_state.current_platform_version().unwrap(); let genesis_time = 0; @@ -1489,6 +1536,7 @@ mod tests { .check_tx( update_transition_bytes.as_slice(), FirstTimeCheck, + &platform_state, platform_version, ) .expect("expected to execute identity top up tx"); diff --git a/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/mod.rs b/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/mod.rs index 5e1e721870..31a95672c6 100644 --- a/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/mod.rs @@ -1,9 +1,9 @@ use crate::error::execution::ExecutionError; use crate::error::Error; +use crate::execution::types::block_execution_context::BlockExecutionContext; use crate::platform_types::block_execution_outcome; use crate::platform_types::cleaned_abci_messages::finalized_block_cleaned_request::v0::FinalizeBlockCleanedRequest; use crate::platform_types::platform::Platform; -use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::rpc::core::CoreRPCLike; use dpp::version::PlatformVersion; use drive::grovedb::Transaction; @@ -34,12 +34,10 @@ where pub(crate) fn finalize_block_proposal( &self, request_finalize_block: FinalizeBlockCleanedRequest, + block_execution_context: BlockExecutionContext, transaction: &Transaction, + platform_version: &PlatformVersion, ) -> Result { - let state = self.state.read(); - let current_protocol_version = state.current_protocol_version_in_consensus(); - drop(state); - let platform_version = PlatformVersion::get(current_protocol_version)?; match platform_version .drive_abci .methods @@ -48,6 +46,7 @@ where { 0 => self.finalize_block_proposal_v0( request_finalize_block, + block_execution_context, transaction, platform_version, ), diff --git a/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/v0/mod.rs b/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/v0/mod.rs index 332aeb9c15..b7a8522b92 100644 --- a/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/v0/mod.rs @@ -16,12 +16,13 @@ use tenderdash_abci::{ }; use crate::abci::AbciError; -use crate::error::execution::ExecutionError; use crate::error::Error; use crate::execution::types::block_execution_context::v0::{ BlockExecutionContextV0Getters, BlockExecutionContextV0MutableGetters, + BlockExecutionContextV0OwnedGetters, }; +use crate::execution::types::block_execution_context::BlockExecutionContext; use crate::execution::types::block_state_info::v0::{ BlockStateInfoV0Getters, BlockStateInfoV0Methods, }; @@ -61,24 +62,20 @@ where pub(super) fn finalize_block_proposal_v0( &self, request_finalize_block: FinalizeBlockCleanedRequest, + mut block_execution_context: BlockExecutionContext, transaction: &Transaction, - _platform_version: &PlatformVersion, + _last_committed_platform_version: &PlatformVersion, ) -> Result { let mut validation_result = SimpleValidationResult::::new_with_errors(vec![]); - // Retrieve block execution context before we do anything at all - let guarded_block_execution_context = self.block_execution_context.read().unwrap(); - let block_execution_context = - guarded_block_execution_context - .as_ref() - .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( - "block execution context must be set in block begin handler for finalize block proposal", - )))?; - let block_state_info = block_execution_context.block_state_info(); let epoch_info = block_execution_context.epoch_info(); let block_platform_state = block_execution_context.block_platform_state(); + // TODO: The block was processed with last committed platform version, it's wrong to call all functions + // here with new version. Except probably state storage version. + // Another problem that block was processed wit last committed version but we storing state with new version. + // It means when we load the state we would expect this block to be processed with the new version. let current_protocol_version = block_platform_state.current_protocol_version_in_consensus(); let platform_version = PlatformVersion::get(current_protocol_version)?; @@ -134,8 +131,9 @@ where return Ok(validation_result.into()); } - let state_cache = self.state.read(); - let current_quorum_hash = state_cache.current_validator_set_quorum_hash().into(); + let current_quorum_hash = block_platform_state + .current_validator_set_quorum_hash() + .into(); if current_quorum_hash != commit_info.quorum_hash { validation_result.add_error(AbciError::WrongFinalizeBlockReceived(format!( "received a block for h: {} r: {} with validator set quorum hash {} expected current validator set quorum hash is {}", @@ -170,7 +168,9 @@ where { // Verify commit - let quorum_public_key = &state_cache.current_validator_set()?.threshold_public_key(); + let quorum_public_key = block_platform_state + .current_validator_set()? + .threshold_public_key(); let quorum_type = self.config.validator_set_quorum_type(); // TODO: We already had commit in the function above, why do we need to create it again with clone? let commit = Commit::new_from_cleaned( @@ -188,7 +188,6 @@ where return Ok(validation_result.into()); } } - drop(state_cache); if height == self.config.abci.genesis_height { self.drive @@ -204,27 +203,13 @@ where to_commit_block_info.core_height = block_header.core_chain_locked_height; - drop(guarded_block_execution_context); - // Append signatures and broadcast asset unlock transactions to Core - // Borrow execution context as mutable - let mut mutable_block_execution_context_guard = - self.block_execution_context.write().unwrap(); - let mutable_block_execution_context = - mutable_block_execution_context_guard - .as_mut() - .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( - "block execution context must be set in block begin handler for finalize block proposal", - )))?; - // Drain withdrawal transaction instead of cloning - let unsigned_withdrawal_transactions = mutable_block_execution_context + let unsigned_withdrawal_transactions = block_execution_context .unsigned_withdrawal_transactions_mut() .drain(); - drop(mutable_block_execution_context_guard); - // Drain signatures instead of cloning let signatures = commit_info .threshold_vote_extensions @@ -260,7 +245,14 @@ where } .into(); - self.update_state_cache(extended_block_info, transaction, platform_version)?; + let block_platform_state = block_execution_context.block_platform_state_owned(); + + self.update_state_cache( + extended_block_info, + block_platform_state, + transaction, + platform_version, + )?; self.update_drive_cache(platform_version)?; diff --git a/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/mod.rs b/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/mod.rs index 875c99ae14..57ec814c04 100644 --- a/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/mod.rs @@ -6,6 +6,7 @@ use crate::platform_types::platform::Platform; use crate::rpc::core::CoreRPCLike; use crate::error::execution::ExecutionError; +use dpp::version::PlatformVersion; use drive::grovedb::Transaction; use tenderdash_abci::proto::abci::{RequestInitChain, ResponseInitChain}; @@ -19,9 +20,10 @@ where request: RequestInitChain, transaction: &Transaction, ) -> Result { - let state = self.state.read(); - let platform_version = state.current_platform_version()?; - drop(state); + // We don't have platform state at this point, so we should + // use initial protocol version from genesis + let protocol_version = self.config.initial_protocol_version; + let platform_version = PlatformVersion::get(protocol_version)?; match platform_version.drive_abci.methods.engine.init_chain { 0 => self.init_chain_v0(request, transaction, platform_version), diff --git a/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/v0/mod.rs b/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/v0/mod.rs index 5d21e80174..bff63f2aba 100644 --- a/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/v0/mod.rs @@ -9,8 +9,10 @@ use drive::grovedb::Transaction; use crate::platform_types::cleaned_abci_messages::request_init_chain_cleaned_params; use crate::platform_types::platform_state::v0::PlatformStateV0Methods; +use crate::platform_types::platform_state::PlatformState; use crate::platform_types::system_identity_public_keys::v0::SystemIdentityPublicKeysV0; use dpp::version::PlatformVersion; +use std::sync::Arc; use tenderdash_abci::proto::abci::{RequestInitChain, ResponseInitChain, ValidatorSetUpdate}; impl Platform @@ -28,6 +30,7 @@ where request_init_chain_cleaned_params::v0::RequestInitChainCleanedParams::try_from( request, )?; + // We get core height early, as this also verifies v20 fork let core_height = self.initial_core_height(request.initial_core_height, platform_version)?; @@ -37,6 +40,7 @@ where let system_identity_public_keys_v0: SystemIdentityPublicKeysV0 = self.config.abci.keys.clone().into(); + // Create genesis drive state self.create_genesis_state( genesis_time, system_identity_public_keys_v0.into(), @@ -44,7 +48,11 @@ where platform_version, )?; - let mut state_guard = self.state.write(); + // Create platform execution state + let mut initial_platform_state = PlatformState::default_with_protocol_versions( + request.initial_protocol_version, + request.initial_protocol_version, + ); let genesis_block_info = BlockInfo { height: request.initial_height, @@ -55,7 +63,7 @@ where self.update_core_info( None, - &mut state_guard, + &mut initial_platform_state, core_height, true, &genesis_block_info, @@ -63,23 +71,23 @@ where platform_version, )?; - let (quorum_hash, validator_set) = - { - let validator_set_inner = state_guard.validator_sets().first().ok_or( - ExecutionError::InitializationError("we should have at least one quorum"), - )?; + let (quorum_hash, validator_set) = { + let validator_set_inner = initial_platform_state.validator_sets().first().ok_or( + ExecutionError::InitializationError("we should have at least one quorum"), + )?; - ( - *validator_set_inner.0, - ValidatorSetUpdate::from(validator_set_inner.1), - ) - }; + ( + *validator_set_inner.0, + ValidatorSetUpdate::from(validator_set_inner.1), + ) + }; - state_guard.set_current_validator_set_quorum_hash(quorum_hash); + initial_platform_state.set_current_validator_set_quorum_hash(quorum_hash); - state_guard.set_genesis_block_info(Some(genesis_block_info)); + initial_platform_state.set_genesis_block_info(Some(genesis_block_info)); - state_guard.set_current_protocol_version_in_consensus(request.initial_protocol_version); + initial_platform_state + .set_current_protocol_version_in_consensus(request.initial_protocol_version); self.drive.store_current_protocol_version( request.initial_protocol_version, @@ -89,11 +97,13 @@ where if tracing::enabled!(tracing::Level::TRACE) { tracing::trace!( - platform_state_fingerprint = hex::encode(state_guard.fingerprint()), + platform_state_fingerprint = hex::encode(initial_platform_state.fingerprint()), "platform runtime state", ); } + self.state.store(Arc::new(initial_platform_state)); + let app_hash = self .drive .grove diff --git a/packages/rs-drive-abci/src/execution/engine/run_block_proposal/mod.rs b/packages/rs-drive-abci/src/execution/engine/run_block_proposal/mod.rs index f13cc7e2a2..5e02cbab35 100644 --- a/packages/rs-drive-abci/src/execution/engine/run_block_proposal/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/run_block_proposal/mod.rs @@ -1,6 +1,8 @@ use crate::error::execution::ExecutionError; use crate::error::Error; use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::v0::PlatformStateV0Methods; +use crate::platform_types::platform_state::PlatformState; use crate::platform_types::{block_execution_outcome, block_proposal}; use crate::rpc::core::CoreRPCLike; use dpp::validation::ValidationResult; @@ -40,14 +42,18 @@ where &self, block_proposal: block_proposal::v0::BlockProposal, known_from_us: bool, + platform_state: &PlatformState, transaction: &Transaction, ) -> Result, Error> { - let state = self.state.read(); - let platform_version = state.current_platform_version()?; - drop(state); + let platform_version = platform_state.current_platform_version()?; - let epoch_info = self.gather_epoch_info(&block_proposal, transaction, platform_version)?; + let epoch_info = self.gather_epoch_info( + &block_proposal, + transaction, + platform_state, + platform_version, + )?; match platform_version .drive_abci @@ -60,6 +66,7 @@ where known_from_us, epoch_info.into(), transaction, + platform_state, platform_version, ), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { diff --git a/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs b/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs index 77295b4d71..716a264d16 100644 --- a/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs @@ -26,6 +26,7 @@ use crate::platform_types::epoch_info::v0::{EpochInfoV0Getters, EpochInfoV0Metho use crate::platform_types::epoch_info::EpochInfo; use crate::platform_types::platform::Platform; use crate::platform_types::platform_state::v0::PlatformStateV0Methods; +use crate::platform_types::platform_state::PlatformState; use crate::platform_types::verify_chain_lock_result::v0::VerifyChainLockResult; use crate::rpc::core::CoreRPCLike; @@ -63,6 +64,7 @@ where known_from_us: bool, epoch_info: EpochInfo, transaction: &Transaction, + last_committed_platform_state: &PlatformState, platform_version: &PlatformVersion, ) -> Result, Error> { @@ -75,17 +77,15 @@ where block_proposal.round, ); - // Start by getting information from the state - let state = self.state.read(); + let last_block_time_ms = last_committed_platform_state.last_committed_block_time_ms(); + let last_block_height = last_committed_platform_state + .last_committed_known_height_or(self.config.abci.genesis_height.saturating_sub(1)); + let last_block_core_height = last_committed_platform_state + .last_committed_known_core_height_or(self.config.abci.genesis_core_height); + let hpmn_list_len = last_committed_platform_state.hpmn_list_len() as u32; - let last_block_time_ms = state.last_committed_block_time_ms(); - let last_block_height = - state.last_committed_known_height_or(self.config.abci.genesis_height.saturating_sub(1)); - let last_block_core_height = - state.last_committed_known_core_height_or(self.config.abci.genesis_core_height); - let hpmn_list_len = state.hpmn_list_len() as u32; - - let mut block_platform_state = state.clone(); + // Create a bock state from previous committed state + let mut block_platform_state = last_committed_platform_state.clone(); // Init block execution context let block_state_info = block_state_info::v0::BlockStateInfoV0::from_block_proposal( @@ -207,7 +207,7 @@ where // Update the masternode list and create masternode identities and also update the active quorums self.update_core_info( - Some(&state), + Some(last_committed_platform_state), &mut block_platform_state, core_chain_locked_height, false, @@ -215,7 +215,6 @@ where transaction, platform_version, )?; - drop(state); // Update the validator proposed app version self.drive @@ -359,9 +358,11 @@ where .block_state_info_mut() .set_app_hash(Some(root_hash)); - let state = self.state.read(); - let validator_set_update = - self.validator_set_update(&state, &mut block_execution_context, platform_version)?; + let validator_set_update = self.validator_set_update( + last_committed_platform_state, + &mut block_execution_context, + platform_version, + )?; if tracing::enabled!(tracing::Level::TRACE) { tracing::trace!( @@ -373,17 +374,14 @@ where ); } - self.block_execution_context - .write() - .unwrap() - .replace(block_execution_context); - Ok(ValidationResult::new_with_data( block_execution_outcome::v0::BlockExecutionOutcome { app_hash: root_hash, state_transitions_result, validator_set_update, + // TODO: We already know the version outside sine we have state and platform version what pass here protocol_version: platform_version.protocol_version, + block_execution_context, }, )) } diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_end/update_state_cache/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_end/update_state_cache/mod.rs index a055056edc..2027e434de 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/block_end/update_state_cache/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/block_end/update_state_cache/mod.rs @@ -5,6 +5,7 @@ use crate::error::Error; use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; use crate::rpc::core::CoreRPCLike; use dpp::block::extended_block_info::ExtendedBlockInfo; use dpp::version::PlatformVersion; @@ -35,6 +36,7 @@ where pub fn update_state_cache( &self, extended_block_info: ExtendedBlockInfo, + block_platform_state: PlatformState, transaction: &Transaction, platform_version: &PlatformVersion, ) -> Result<(), Error> { @@ -44,7 +46,12 @@ where .block_end .update_state_cache { - 0 => self.update_state_cache_v0(extended_block_info, transaction, platform_version), + 0 => self.update_state_cache_v0( + extended_block_info, + block_platform_state, + transaction, + platform_version, + ), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "update_state_cache".to_string(), known_versions: vec![0], diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_end/update_state_cache/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_end/update_state_cache/v0/mod.rs index 4d1f8a69cd..2283108676 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/block_end/update_state_cache/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/block_end/update_state_cache/v0/mod.rs @@ -3,10 +3,12 @@ use crate::error::Error; use crate::execution::types::block_execution_context::v0::BlockExecutionContextV0OwnedGetters; use crate::platform_types::platform::Platform; use crate::platform_types::platform_state::v0::PlatformStateV0Methods; +use crate::platform_types::platform_state::PlatformState; use crate::rpc::core::CoreRPCLike; use dpp::block::extended_block_info::ExtendedBlockInfo; use dpp::version::{PlatformVersion, PlatformVersionCurrentVersion}; use drive::grovedb::Transaction; +use std::sync::Arc; impl Platform where @@ -37,41 +39,33 @@ where pub(super) fn update_state_cache_v0( &self, extended_block_info: ExtendedBlockInfo, + mut block_platform_state: PlatformState, transaction: &Transaction, platform_version: &PlatformVersion, ) -> Result<(), Error> { - let mut block_execution_context_guard = self.block_execution_context.write().unwrap(); - - let block_execution_context = - block_execution_context_guard - .take() - .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( - "there should be a block execution context", - )))?; - - let mut state_cache = self.state.write(); - - *state_cache = block_execution_context.block_platform_state_owned(); - - drop(block_execution_context_guard); + // Update block state and store it in shared lock if let Some(next_validator_set_quorum_hash) = - state_cache.take_next_validator_set_quorum_hash() + block_platform_state.take_next_validator_set_quorum_hash() { - state_cache.set_current_validator_set_quorum_hash(next_validator_set_quorum_hash); + block_platform_state + .set_current_validator_set_quorum_hash(next_validator_set_quorum_hash); } - state_cache.set_last_committed_block_info(Some(extended_block_info)); + block_platform_state.set_last_committed_block_info(Some(extended_block_info)); - state_cache.set_genesis_block_info(None); + block_platform_state.set_genesis_block_info(None); //todo: verify this with an update let version = PlatformVersion::get(platform_version.protocol_version)?; PlatformVersion::set_current(version); - // Persist state cache - self.store_platform_state(&state_cache, Some(transaction), platform_version)?; + // Persist block state + + self.store_platform_state(&block_platform_state, Some(transaction), platform_version)?; + + self.state.store(Arc::new(block_platform_state)); Ok(()) } diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_start/clear_drive_block_cache/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_start/clear_drive_block_cache/v0/mod.rs index 06750ab6e0..d988eb34c7 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/block_start/clear_drive_block_cache/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/block_start/clear_drive_block_cache/v0/mod.rs @@ -11,7 +11,8 @@ where pub(super) fn clear_drive_block_cache_v0(&self) { self.drive.cache.data_contracts.clear_block_cache(); - let mut protocol_versions_counter = self.drive.cache.protocol_versions_counter.write(); + let mut protocol_versions_counter = + self.drive.cache.protocol_versions_counter.write(); protocol_versions_counter.clear_block_cache() } diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_core_info/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_core_info/mod.rs index 744ed975e5..4ed94af5f7 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_core_info/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_core_info/mod.rs @@ -8,6 +8,7 @@ use crate::rpc::core::CoreRPCLike; use dpp::block::block_info::BlockInfo; use dpp::version::PlatformVersion; use drive::grovedb::Transaction; +use std::sync::Arc; impl Platform where diff --git a/packages/rs-drive-abci/src/execution/platform_events/epoch/gather_epoch_info/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/epoch/gather_epoch_info/mod.rs index b319ac4fb3..835af9653b 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/epoch/gather_epoch_info/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/epoch/gather_epoch_info/mod.rs @@ -6,6 +6,7 @@ use crate::error::Error; use crate::platform_types::block_proposal; use crate::platform_types::epoch_info::v0::EpochInfoV0; use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; use dpp::version::PlatformVersion; use drive::grovedb::Transaction; @@ -28,10 +29,16 @@ impl Platform { &self, block_proposal: &block_proposal::v0::BlockProposal, transaction: &Transaction, + platform_state: &PlatformState, platform_version: &PlatformVersion, ) -> Result { match platform_version.drive_abci.methods.epoch.gather_epoch_info { - 0 => self.gather_epoch_info_v0(block_proposal, transaction, platform_version), + 0 => self.gather_epoch_info_v0( + block_proposal, + transaction, + platform_state, + platform_version, + ), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "gather_epoch_info".to_string(), known_versions: vec![0], diff --git a/packages/rs-drive-abci/src/execution/platform_events/epoch/gather_epoch_info/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/epoch/gather_epoch_info/v0/mod.rs index 3e1bacb368..81d3ff3d12 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/epoch/gather_epoch_info/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/epoch/gather_epoch_info/v0/mod.rs @@ -6,6 +6,7 @@ use crate::platform_types::block_proposal; use crate::platform_types::epoch_info::v0::EpochInfoV0; use crate::platform_types::platform::Platform; use crate::platform_types::platform_state::v0::PlatformStateV0Methods; +use crate::platform_types::platform_state::PlatformState; use drive::grovedb::Transaction; impl Platform { @@ -14,12 +15,11 @@ impl Platform { &self, block_proposal: &block_proposal::v0::BlockProposal, transaction: &Transaction, + platform_state: &PlatformState, platform_version: &PlatformVersion, ) -> Result { // Start by getting information from the state - let state = self.state.read(); - let last_block_time_ms = state.last_committed_block_time_ms(); - drop(state); + let last_block_time_ms = platform_state.last_committed_block_time_ms(); // Init block execution context let block_state_info = block_state_info::v0::BlockStateInfoV0::from_block_proposal( @@ -33,6 +33,7 @@ impl Platform { block_time_ms, .. } = &block_proposal; + let genesis_time_ms = self.get_genesis_time(*height, *block_time_ms, transaction, platform_version)?; diff --git a/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/add_epoch_pool_to_proposers_payout_operations/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/add_epoch_pool_to_proposers_payout_operations/v0/mod.rs index 00728ea52b..d5a5d1705e 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/add_epoch_pool_to_proposers_payout_operations/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/add_epoch_pool_to_proposers_payout_operations/v0/mod.rs @@ -187,7 +187,7 @@ mod tests { .build_with_mock_rpc() .set_initial_state_structure(); - let platform_read_guard = platform.state.read(); + let platform_read_guard = platform.state.load(); let platform_version = platform_read_guard .current_platform_version() .expect("platform_version"); diff --git a/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/fetch_reward_shares_list_for_masternode/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/fetch_reward_shares_list_for_masternode/v0/mod.rs index 0ba65237c5..3c2a9900c1 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/fetch_reward_shares_list_for_masternode/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/fetch_reward_shares_list_for_masternode/v0/mod.rs @@ -36,7 +36,7 @@ impl Platform { .drive .cache .system_data_contracts - .read_masternode_reward_shares(); + .load_masternode_reward_shares(); let document_type = masternode_rewards_contract.document_type_for_name(MN_REWARD_SHARES_DOCUMENT_TYPE)?; diff --git a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs index 805c6a239d..2c6221a572 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs @@ -83,20 +83,20 @@ impl Platform { let system_data_contracts = &self.drive.cache.system_data_contracts; - let dpns_data_contract = system_data_contracts.read_dpns(); + let dpns_data_contract = system_data_contracts.load_dpns(); let system_data_contract_types = BTreeMap::from_iter([ ( SystemDataContract::DPNS, ( - system_data_contracts.read_dpns(), + system_data_contracts.load_dpns(), system_identity_public_keys.dpns_contract_owner(), ), ), ( SystemDataContract::Withdrawals, ( - system_data_contracts.read_withdrawals(), + system_data_contracts.load_withdrawals(), system_identity_public_keys.withdrawals_contract_owner(), ), ), @@ -114,14 +114,14 @@ impl Platform { ( SystemDataContract::Dashpay, ( - system_data_contracts.read_dashpay(), + system_data_contracts.load_dashpay(), system_identity_public_keys.dashpay_contract_owner(), ), ), ( SystemDataContract::MasternodeRewards, ( - system_data_contracts.read_masternode_reward_shares(), + system_data_contracts.load_masternode_reward_shares(), system_identity_public_keys.masternode_reward_shares_contract_owner(), ), ), diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/dequeue_and_build_unsigned_withdrawal_transactions/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/dequeue_and_build_unsigned_withdrawal_transactions/v0/mod.rs index 7c8ac25ef3..9659528dc2 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/dequeue_and_build_unsigned_withdrawal_transactions/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/dequeue_and_build_unsigned_withdrawal_transactions/v0/mod.rs @@ -74,7 +74,7 @@ where transaction_indices.last().expect("must be present") ); - let withdrawals_contract = self.drive.cache.system_data_contracts.read_withdrawals(); + let withdrawals_contract = self.drive.cache.system_data_contracts.load_withdrawals(); self.drive.add_update_multiple_documents_operations( &documents, diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v0/mod.rs index d4f23e18b1..d65b4138f5 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/pool_withdrawals_into_transactions_queue/v0/mod.rs @@ -109,7 +109,7 @@ where end_transaction_index, ); - let withdrawals_contract = self.drive.cache.system_data_contracts.read_withdrawals(); + let withdrawals_contract = self.drive.cache.system_data_contracts.load_withdrawals(); self.drive.add_update_multiple_documents_operations( &documents, diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/update_broadcasted_withdrawal_statuses/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/update_broadcasted_withdrawal_statuses/v0/mod.rs index 90b0291997..97b5a922ba 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/update_broadcasted_withdrawal_statuses/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/update_broadcasted_withdrawal_statuses/v0/mod.rs @@ -133,7 +133,7 @@ where return Ok(()); } - let withdrawals_contract = self.drive.cache.system_data_contracts.read_withdrawals(); + let withdrawals_contract = self.drive.cache.system_data_contracts.load_withdrawals(); self.drive.add_update_multiple_documents_operations( &documents_to_update, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs index 1871336f18..9ce2c7c2e3 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs @@ -182,7 +182,7 @@ mod tests { signature_public_key_id: 0, }; - let state = platform.state.read(); + let state = platform.state.load(); let platform_ref = PlatformRef { drive: &platform.drive, @@ -262,7 +262,7 @@ mod tests { signature_public_key_id: 0, }; - let state = platform.state.read(); + let state = platform.state.load(); let platform_ref = PlatformRef { drive: &platform.drive, @@ -412,7 +412,7 @@ mod tests { let state_transition: DataContractUpdateTransition = state_transition.into(); - let state = platform.state.read(); + let state = platform.state.load(); let platform_ref = PlatformRef { drive: &platform.drive, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/v0/mod.rs index 1f19eb86d5..4ee5096db7 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/v0/mod.rs @@ -168,14 +168,14 @@ mod test { .set_initial_state_structure(); let mut nonce_counter = BTreeMap::new(); - let state_read_guard = platform.state.read(); + let state = platform.state.load(); let platform_ref = PlatformStateRef { drive: &platform.drive, - state: &state_read_guard, + state: &state, config: &platform.config, }; - let protocol_version = state_read_guard.current_protocol_version_in_consensus(); - let platform_version = state_read_guard + let protocol_version = state.current_protocol_version_in_consensus(); + let platform_version = state .current_platform_version() .expect("should return a platform version"); @@ -183,7 +183,7 @@ mod test { None, 0, None, - state_read_guard.current_protocol_version_in_consensus(), + state.current_protocol_version_in_consensus(), ); contact_request_document.set(CORE_HEIGHT_CREATED_AT, platform_value!(10u32)); let owner_id = &contact_request_document.owner_id(); @@ -242,9 +242,10 @@ mod test { let mut nonce_counter = BTreeMap::new(); - let mut state_write_guard = platform.state.write(); + let platform_state = platform.state.load(); + let mut platform_state = (**platform_state).clone(); - state_write_guard.set_last_committed_block_info(Some( + platform_state.set_last_committed_block_info(Some( ExtendedBlockInfoV0 { basic_info: BlockInfo { time_ms: 500000, @@ -262,11 +263,11 @@ mod test { )); let platform_ref = PlatformStateRef { drive: &platform.drive, - state: &state_write_guard, + state: &platform_state, config: &platform.config, }; - let protocol_version = state_write_guard.current_protocol_version_in_consensus(); - let platform_version = state_write_guard + let protocol_version = platform_state.current_protocol_version_in_consensus(); + let platform_version = platform_state .current_platform_version() .expect("should return a platform version"); @@ -274,7 +275,7 @@ mod test { None, 0, None, - state_write_guard.current_protocol_version_in_consensus(), + platform_state.current_protocol_version_in_consensus(), ); let owner_id = contact_request_document.owner_id(); contact_request_document.set("toUserId", platform_value::to_value(owner_id).unwrap()); @@ -282,7 +283,7 @@ mod test { let data_contract = get_dashpay_contract_fixture( None, 0, - state_write_guard.current_protocol_version_in_consensus(), + platform_state.current_protocol_version_in_consensus(), ) .data_contract_owned(); let document_type = data_contract @@ -308,7 +309,7 @@ mod test { StateTransitionExecutionContext::default_for_platform_version(platform_version) .unwrap(); let identity_fixture = - get_identity_fixture(state_write_guard.current_protocol_version_in_consensus()) + get_identity_fixture(platform_state.current_protocol_version_in_consensus()) .expect("expected to get identity fixture"); platform @@ -319,7 +320,7 @@ mod test { &BlockInfo::default(), true, None, - state_write_guard.current_platform_version().unwrap(), + platform_state.current_platform_version().unwrap(), ) .expect("expected to insert identity"); @@ -359,9 +360,10 @@ mod test { let mut nonce_counter = BTreeMap::new(); - let mut state_write_guard = platform.state.write(); + let platform_state = platform.state.load(); + let mut platform_state = (**platform_state).clone(); - state_write_guard.set_last_committed_block_info(Some( + platform_state.set_last_committed_block_info(Some( ExtendedBlockInfoV0 { basic_info: BlockInfo { time_ms: 500000, @@ -380,11 +382,11 @@ mod test { let platform_ref = PlatformStateRef { drive: &platform.drive, - state: &state_write_guard, + state: &platform_state, config: &platform.config, }; - let protocol_version = state_write_guard.current_protocol_version_in_consensus(); - let platform_version = state_write_guard + let protocol_version = platform_state.current_protocol_version_in_consensus(); + let platform_version = platform_state .current_platform_version() .expect("should return a platform version"); @@ -392,12 +394,12 @@ mod test { None, 0, None, - state_write_guard.current_protocol_version_in_consensus(), + platform_state.current_protocol_version_in_consensus(), ); let data_contract = get_dashpay_contract_fixture( None, 0, - state_write_guard.current_protocol_version_in_consensus(), + platform_state.current_protocol_version_in_consensus(), ) .data_contract_owned(); let document_type = data_contract diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs index f4aac4d269..aa6e6895e6 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs @@ -444,15 +444,15 @@ mod test { let mut nonce_counter = BTreeMap::new(); - let state_read_guard = platform.state.read(); + let state = platform.state.load(); let platform_ref = PlatformStateRef { drive: &platform.drive, - state: &state_read_guard, + state: &state, config: &platform.config, }; - let platform_version = state_read_guard + let platform_version = state .current_platform_version() .expect("should return a platform version"); @@ -465,12 +465,12 @@ mod test { owner_id, ..Default::default() }, - state_read_guard.current_protocol_version_in_consensus(), + state.current_protocol_version_in_consensus(), ); let data_contract = get_dpns_data_contract_fixture( Some(owner_id), 0, - state_read_guard.current_protocol_version_in_consensus(), + state.current_protocol_version_in_consensus(), ) .data_contract_owned(); let document_type = data_contract diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/feature_flags/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/feature_flags/v0/mod.rs index 6ded8e0759..0717d0b0fd 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/feature_flags/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/feature_flags/v0/mod.rs @@ -117,7 +117,7 @@ mod test { // let platform = TestPlatformBuilder::new() // .build_with_mock_rpc() // .set_initial_state_structure(); - // let state_read_guard = platform.state.read(); + // let state_read_guard = platform.state.load(); // // let platform_ref = PlatformStateRef { // drive: &platform.drive, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs index 0ba0081999..c3a07d3441 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs @@ -158,7 +158,7 @@ mod tests { let platform = TestPlatformBuilder::new() .build_with_mock_rpc() .set_initial_state_structure(); - let state_read_guard = platform.state.read(); + let state_read_guard = platform.state.load(); let platform_ref = PlatformStateRef { drive: &platform.drive, state: &state_read_guard, @@ -248,7 +248,7 @@ mod tests { let platform = TestPlatformBuilder::new() .build_with_mock_rpc() .set_genesis_state(); - let state_read_guard = platform.state.read(); + let state_read_guard = platform.state.load(); let platform_ref = PlatformStateRef { drive: &platform.drive, diff --git a/packages/rs-drive-abci/src/mimic/mod.rs b/packages/rs-drive-abci/src/mimic/mod.rs index 50f8662afd..53c31e6eee 100644 --- a/packages/rs-drive-abci/src/mimic/mod.rs +++ b/packages/rs-drive-abci/src/mimic/mod.rs @@ -98,25 +98,25 @@ impl<'a, C: CoreRPCLike> FullAbciApplication<'a, C> { ) -> Result { // This will be NONE, except on init chain let original_block_execution_context = self - .platform .block_execution_context .read() .unwrap() .as_ref() .cloned(); - let transaction_guard = self.transaction.read().unwrap(); - - let init_chain_root_hash = transaction_guard.as_ref().map(|transaction| { - self.platform - .drive - .grove - .root_hash(Some(transaction)) - .unwrap() - .unwrap() - }); - - drop(transaction_guard); + let init_chain_root_hash = self + .transaction + .read() + .unwrap() + .as_ref() + .map(|transaction| { + self.platform + .drive + .grove + .root_hash(Some(transaction)) + .unwrap() + .unwrap() + }); const APP_VERSION: u64 = 0; @@ -298,26 +298,26 @@ impl<'a, C: CoreRPCLike> FullAbciApplication<'a, C> { ) }); - let mut block_execution_context = - self.platform.block_execution_context.write().unwrap(); - - let application_hash = block_execution_context + let application_hash = self + .block_execution_context + .read() + .unwrap() .as_ref() .expect("expected a block execution context") .block_state_info() .app_hash() .expect("expected an application hash after process proposal"); - *block_execution_context = original_block_execution_context.clone(); - drop(block_execution_context); + let mut block_execution_context_guard = self.block_execution_context.write().unwrap(); + *block_execution_context_guard = original_block_execution_context; + drop(block_execution_context_guard); if let Some(init_chain_root_hash) = init_chain_root_hash //we are in init chain { // special logic on init chain - let transaction = self.transaction.write().unwrap(); - - let transaction = transaction.as_ref().ok_or(Error::Execution( + let transaction_guard = self.transaction.read().unwrap(); + let transaction = transaction_guard.as_ref().ok_or(Error::Execution( ExecutionError::NotInTransaction( "trying to finalize block without a current transaction", ), @@ -347,9 +347,10 @@ impl<'a, C: CoreRPCLike> FullAbciApplication<'a, C> { ) }); - let block_execution_context = self.platform.block_execution_context.read().unwrap(); - - let process_proposal_application_hash = block_execution_context + let process_proposal_application_hash = self + .block_execution_context + .read() + .unwrap() .as_ref() .expect("expected a block execution context") .block_state_info() @@ -363,7 +364,6 @@ impl<'a, C: CoreRPCLike> FullAbciApplication<'a, C> { ); let transaction_guard = self.transaction.read().unwrap(); - let transaction = transaction_guard.as_ref().ok_or(Error::Execution( ExecutionError::NotInTransaction( "trying to finalize block without a current transaction", @@ -427,10 +427,9 @@ impl<'a, C: CoreRPCLike> FullAbciApplication<'a, C> { //FixMe: This is not correct for the threshold vote extension (we need to sign and do // things differently - let guarded_block_execution_context = self.platform.block_execution_context.read().unwrap(); + let block_execution_context_ref = self.block_execution_context.read().unwrap(); let block_execution_context = - guarded_block_execution_context - .as_ref() + block_execution_context_ref.as_ref() .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( "block execution context must be set in block begin handler for mimic block execution", )))?.v0()?; @@ -454,7 +453,7 @@ impl<'a, C: CoreRPCLike> FullAbciApplication<'a, C> { .unsigned_withdrawal_transactions .clone(); - drop(guarded_block_execution_context); + drop(block_execution_context_ref); // We need to sign the block @@ -559,7 +558,6 @@ impl<'a, C: CoreRPCLike> FullAbciApplication<'a, C> { }; let transaction_guard = self.transaction.read().unwrap(); - let transaction = transaction_guard.as_ref().ok_or(Error::Execution( ExecutionError::NotInTransaction( "trying to finalize block without a current transaction", diff --git a/packages/rs-drive-abci/src/platform_types/block_execution_outcome/v0/mod.rs b/packages/rs-drive-abci/src/platform_types/block_execution_outcome/v0/mod.rs index 14d02aeb2f..e863244a03 100644 --- a/packages/rs-drive-abci/src/platform_types/block_execution_outcome/v0/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/block_execution_outcome/v0/mod.rs @@ -1,4 +1,5 @@ use crate::abci::AbciError; +use crate::execution::types::block_execution_context::BlockExecutionContext; use crate::platform_types::state_transitions_processing_result::StateTransitionsProcessingResult; use dpp::util::deserializer::ProtocolVersion; use dpp::validation::SimpleValidationResult; @@ -17,6 +18,8 @@ pub struct BlockExecutionOutcome { pub validator_set_update: Option, /// Current block protocol version pub protocol_version: ProtocolVersion, + /// Block execution context + pub block_execution_context: BlockExecutionContext, } /// The outcome of the finalization of the block diff --git a/packages/rs-drive-abci/src/platform_types/platform/mod.rs b/packages/rs-drive-abci/src/platform_types/platform/mod.rs index ddf16149c6..f705633e91 100644 --- a/packages/rs-drive-abci/src/platform_types/platform/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/platform/mod.rs @@ -7,10 +7,11 @@ use std::fmt::{Debug, Formatter}; #[cfg(any(feature = "mocks", test))] use crate::rpc::core::MockCoreRPCLike; +use arc_swap::ArcSwap; use drive::drive::defaults::INITIAL_PROTOCOL_VERSION; use std::path::Path; use std::str::FromStr; -use std::sync::RwLock; +use std::sync::Arc; use dashcore_rpc::dashcore::BlockHash; @@ -29,15 +30,13 @@ pub struct Platform { /// Drive pub drive: Drive, /// State - // We use a parking_lot::RwLock because of it's writer priority which is essential so our - // readers in check_tx don't starve block finalization - // Todo: Block finalization can still be delayed until we acquire the write lock. We might want - // to think of a custom approach where the writer is always placed at the front of the queue. - pub state: parking_lot::RwLock, + // We use ArcSwap that provide very fast and consistent reads + // and atomic write (swap). This is important as we want read state + // for query and check tx and we don't want to block affect the + // state update on finalize block, and vise versa. + pub state: ArcSwap, /// Configuration pub config: PlatformConfig, - /// Block execution context - pub block_execution_context: RwLock>, /// Core RPC Client pub core_rpc: C, } @@ -158,8 +157,7 @@ impl Platform { persisted_state.current_protocol_version_in_consensus(), )?); - let mut state_cache = self.state.write(); - *state_cache = persisted_state; + self.state.store(Arc::new(persisted_state)); Ok(true) } @@ -224,9 +222,8 @@ impl Platform { let platform: Platform = Platform { drive, - state: parking_lot::RwLock::new(platform_state), + state: ArcSwap::new(Arc::new(platform_state)), config, - block_execution_context: RwLock::new(None), core_rpc, }; @@ -253,9 +250,8 @@ impl Platform { Ok(Platform { drive, - state: parking_lot::RwLock::new(platform_state), + state: ArcSwap::new(Arc::new(platform_state)), config, - block_execution_context: RwLock::new(None), core_rpc, }) } diff --git a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract/mod.rs b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract/mod.rs index 0548473a96..288e55f3bf 100644 --- a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract/mod.rs +++ b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract/mod.rs @@ -1,6 +1,7 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_data_contract_request::Version as RequestVersion; use dapi_grpc::platform::v0::get_data_contract_response::Version as ResponseVersion; @@ -14,6 +15,7 @@ impl Platform { pub fn query_data_contract( &self, GetDataContractRequest { version }: GetDataContractRequest, + platform_state: &PlatformState, platform_version: &PlatformVersion, ) -> Result, Error> { let Some(version) = version else { @@ -44,7 +46,8 @@ impl Platform { } match version { RequestVersion::V0(request_v0) => { - let result = self.query_data_contract_v0(request_v0, platform_version)?; + let result = + self.query_data_contract_v0(request_v0, platform_state, platform_version)?; Ok(result.map(|response_v0| GetDataContractResponse { version: Some(ResponseVersion::V0(response_v0)), diff --git a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract/v0/mod.rs b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract/v0/mod.rs index 89a3443f8f..1d4f8fcbcc 100644 --- a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract/v0/mod.rs @@ -1,6 +1,7 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_data_contract_request::GetDataContractRequestV0; use dapi_grpc::platform::v0::get_data_contract_response::{ @@ -16,6 +17,7 @@ impl Platform { pub(super) fn query_data_contract_v0( &self, GetDataContractRequestV0 { id, prove }: GetDataContractRequestV0, + platform_state: &PlatformState, platform_version: &PlatformVersion, ) -> Result, Error> { let contract_id: Identifier = @@ -30,11 +32,11 @@ impl Platform { self.drive .prove_contract(contract_id.into_buffer(), None, platform_version)?; - let (metadata, proof) = self.response_metadata_and_proof_v0(proof); - GetDataContractResponseV0 { - result: Some(get_data_contract_response_v0::Result::Proof(proof)), - metadata: Some(metadata), + result: Some(get_data_contract_response_v0::Result::Proof( + self.response_proof_v0(platform_state, proof), + )), + metadata: Some(self.response_metadata_v0(platform_state)), } } else { let maybe_data_contract_fetch_info = self @@ -62,7 +64,7 @@ impl Platform { result: Some(get_data_contract_response_v0::Result::DataContract( serialized_data_contract, )), - metadata: Some(self.response_metadata_v0()), + metadata: Some(self.response_metadata_v0(platform_state)), } }; @@ -77,21 +79,21 @@ mod tests { #[test] fn test_invalid_data_contract_id() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let request = GetDataContractRequestV0 { id: vec![0; 8], prove: false, }; - let result = platform.query_data_contract_v0(request, version); + let result = platform.query_data_contract_v0(request, &state, version); assert_invalid_identifier(result.unwrap()); } #[test] fn test_data_contract_not_found() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let id = vec![0; 32]; let request = GetDataContractRequestV0 { @@ -100,7 +102,7 @@ mod tests { }; let result = platform - .query_data_contract_v0(request, version) + .query_data_contract_v0(request, &state, version) .expect("expected query to succeed"); assert!(matches!( @@ -111,7 +113,7 @@ mod tests { #[test] fn test_data_contract_absence_proof() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let id = vec![0; 32]; let request = GetDataContractRequestV0 { @@ -120,7 +122,7 @@ mod tests { }; let validation_result = platform - .query_data_contract_v0(request, version) + .query_data_contract_v0(request, &state, version) .expect("expected query to succeed"); assert!(matches!( diff --git a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/mod.rs b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/mod.rs index 8810637f0f..70186b9ff7 100644 --- a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/mod.rs +++ b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/mod.rs @@ -6,6 +6,7 @@ use dapi_grpc::platform::v0::get_data_contract_history_request::Version as Reque use dapi_grpc::platform::v0::get_data_contract_history_response::Version as ResponseVersion; use dapi_grpc::platform::v0::{GetDataContractHistoryRequest, GetDataContractHistoryResponse}; +use crate::platform_types::platform_state::PlatformState; use dpp::version::PlatformVersion; mod v0; @@ -15,6 +16,7 @@ impl Platform { pub fn query_data_contract_history( &self, GetDataContractHistoryRequest { version }: GetDataContractHistoryRequest, + platform_state: &PlatformState, platform_version: &PlatformVersion, ) -> Result, Error> { let Some(version) = version else { @@ -45,7 +47,11 @@ impl Platform { } match version { RequestVersion::V0(request_v0) => { - let result = self.query_data_contract_history_v0(request_v0, platform_version)?; + let result = self.query_data_contract_history_v0( + request_v0, + &platform_state, + platform_version, + )?; Ok(result.map(|response_v0| GetDataContractHistoryResponse { version: Some(ResponseVersion::V0(response_v0)), diff --git a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/v0/mod.rs b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/v0/mod.rs index 96708f9e23..2f5fc6e922 100644 --- a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/v0/mod.rs @@ -10,6 +10,7 @@ use dpp::validation::ValidationResult; use dpp::version::PlatformVersion; use dpp::{check_validation_result_with_data, ProtocolError}; use dapi_grpc::platform::v0::get_data_contract_history_response::get_data_contract_history_response_v0::DataContractHistoryEntry; +use crate::platform_types::platform_state::PlatformState; impl Platform { pub(super) fn query_data_contract_history_v0( @@ -21,6 +22,7 @@ impl Platform { start_at_ms, prove, }: GetDataContractHistoryRequestV0, + platform_state: &PlatformState, platform_version: &PlatformVersion, ) -> Result, Error> { let contract_id: Identifier = @@ -54,11 +56,11 @@ impl Platform { platform_version, )?; - let (metadata, proof) = self.response_metadata_and_proof_v0(proof); - GetDataContractHistoryResponseV0 { - result: Some(get_data_contract_history_response_v0::Result::Proof(proof)), - metadata: Some(metadata), + result: Some(get_data_contract_history_response_v0::Result::Proof( + self.response_proof_v0(platform_state, proof), + )), + metadata: Some(self.response_metadata_v0(platform_state)), } } else { let contracts = self.drive.fetch_contract_with_history( @@ -95,7 +97,7 @@ impl Platform { }, ), ), - metadata: Some(self.response_metadata_v0()), + metadata: Some(self.response_metadata_v0(platform_state)), } }; @@ -120,6 +122,7 @@ mod tests { use dpp::serialization::PlatformDeserializableWithPotentialValidationFromVersionedStructure; use dpp::tests::fixtures::get_data_contract_fixture; use drive::drive::Drive; + use std::sync::Arc; fn default_request_v0() -> GetDataContractHistoryRequestV0 { GetDataContractHistoryRequestV0 { @@ -133,7 +136,7 @@ mod tests { /// Set up simple contract history with one update fn set_up_history(platform: &TempPlatform) -> DataContract { - let state = platform.platform.state.read(); + let state = platform.platform.state.load(); let current_protocol_version = state.current_protocol_version_in_consensus(); let platform_version = PlatformVersion::get(current_protocol_version) .expect("expected to get platform version"); @@ -210,27 +213,35 @@ mod tests { data_contract } - struct TestData { + struct TestData<'a> { platform: TempPlatform, original_data_contract: DataContract, + version: &'a PlatformVersion, + state: Arc, } - fn set_up_test() -> TestData { + fn set_up_test<'a>() -> TestData<'a> { let platform = TestPlatformBuilder::new() .build_with_mock_rpc() .set_initial_state_structure(); let original_data_contract = set_up_history(&platform); + // We can't return a reference to Arc (`load` method) so we clone Arc (`load_full`). + // This is a bit slower but we don't care since we are in test environment + let platform_state = platform.platform.state.load_full(); + TestData { platform, original_data_contract, + version: PlatformVersion::latest(), + state: platform_state, } } #[test] fn test_invalid_data_contract_id() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let request = GetDataContractHistoryRequestV0 { id: vec![0; 8], @@ -241,7 +252,7 @@ mod tests { }; let result = platform - .query_data_contract_history_v0(request, version) + .query_data_contract_history_v0(request, &state, version) .expect("expected query to succeed"); assert_invalid_identifier(result); @@ -249,7 +260,7 @@ mod tests { #[test] fn test_invalid_limit_overflow() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let request = GetDataContractHistoryRequestV0 { id: vec![0; 32], @@ -260,7 +271,7 @@ mod tests { }; let result = platform - .query_data_contract_history_v0(request, version) + .query_data_contract_history_v0(request, &state, version) .expect("expected query to succeed"); assert!(matches!( @@ -271,7 +282,7 @@ mod tests { #[test] fn test_invalid_offset_overflow() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let request = GetDataContractHistoryRequestV0 { id: vec![0; 32], @@ -282,7 +293,7 @@ mod tests { }; let result = platform - .query_data_contract_history_v0(request, version) + .query_data_contract_history_v0(request, &state, version) .expect("expected query to succeed"); assert!( @@ -292,7 +303,7 @@ mod tests { #[test] fn test_data_contract_not_found() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let id = vec![0; 32]; @@ -305,7 +316,7 @@ mod tests { }; let result = platform - .query_data_contract_history_v0(request, version) + .query_data_contract_history_v0(request, &state, version) .expect("expected query to succeed"); assert!(matches!( @@ -316,11 +327,11 @@ mod tests { #[test] pub fn should_return_contract_history_with_no_errors_if_parameters_are_valid() { - let platform_version = PlatformVersion::latest(); - let TestData { platform, original_data_contract, + version, + state, } = set_up_test(); let request = GetDataContractHistoryRequestV0 { @@ -329,7 +340,7 @@ mod tests { }; let result = platform - .query_data_contract_history_v0(request, platform_version) + .query_data_contract_history_v0(request, &state, version) .expect("To return result"); let ValidationResult { errors, data } = result; @@ -361,7 +372,7 @@ mod tests { assert_eq!(first_entry.date, 1000); let first_entry_data_contract = first_entry.value; let first_data_contract_update = - DataContract::versioned_deserialize(&first_entry_data_contract, true, platform_version) + DataContract::versioned_deserialize(&first_entry_data_contract, true, version) .expect("To decode data contract"); assert_eq!(first_data_contract_update, original_data_contract); @@ -369,12 +380,9 @@ mod tests { let second_entry_data_contract = second_entry.value; - let second_data_contract_update = DataContract::versioned_deserialize( - &second_entry_data_contract, - true, - platform_version, - ) - .expect("To decode data contract"); + let second_data_contract_update = + DataContract::versioned_deserialize(&second_entry_data_contract, true, version) + .expect("To decode data contract"); let updated_doc = second_data_contract_update .document_type_for_name("niceDocument") @@ -388,10 +396,11 @@ mod tests { #[test] pub fn should_return_contract_history_proofs_with_no_errors_if_parameters_are_valid() { - let platform_version = PlatformVersion::latest(); let TestData { platform, original_data_contract, + version, + state, } = set_up_test(); let request_v0 = GetDataContractHistoryRequestV0 { @@ -403,7 +412,7 @@ mod tests { let start_at_ms = request_v0.start_at_ms; let result = platform - .query_data_contract_history_v0(request_v0, platform_version) + .query_data_contract_history_v0(request_v0, &state, version) .expect("To return result"); let ValidationResult { errors, data } = result; @@ -430,7 +439,7 @@ mod tests { start_at_ms, Some(10), Some(0), - platform_version, + version, ) .expect("To verify contract history"); @@ -459,7 +468,7 @@ mod tests { #[test] fn test_data_contract_history_absence_proof() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let request = GetDataContractHistoryRequestV0 { id: vec![0; 32], @@ -470,7 +479,7 @@ mod tests { }; let result = platform - .query_data_contract_history_v0(request, version) + .query_data_contract_history_v0(request, &state, version) .expect("expected query to succeed"); assert!(matches!( diff --git a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contracts/mod.rs b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contracts/mod.rs index 14086382af..c2087c825e 100644 --- a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contracts/mod.rs +++ b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contracts/mod.rs @@ -1,6 +1,7 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_data_contracts_request::Version as RequestVersion; use dapi_grpc::platform::v0::get_data_contracts_response::Version as ResponseVersion; @@ -14,6 +15,7 @@ impl Platform { pub fn query_data_contracts( &self, GetDataContractsRequest { version }: GetDataContractsRequest, + platform_state: &PlatformState, platform_version: &PlatformVersion, ) -> Result, Error> { let Some(version) = version else { @@ -46,7 +48,8 @@ impl Platform { match version { RequestVersion::V0(request_v0) => { - let request = self.query_data_contracts_v0(request_v0, platform_version)?; + let request = + self.query_data_contracts_v0(request_v0, platform_state, platform_version)?; Ok(request.map(|response_v0| GetDataContractsResponse { version: Some(ResponseVersion::V0(response_v0)), diff --git a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contracts/v0/mod.rs b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contracts/v0/mod.rs index 89e36f054f..16c82e7406 100644 --- a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contracts/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contracts/v0/mod.rs @@ -1,6 +1,7 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_data_contracts_request::GetDataContractsRequestV0; use dapi_grpc::platform::v0::get_data_contracts_response; @@ -18,6 +19,7 @@ impl Platform { pub(super) fn query_data_contracts_v0( &self, GetDataContractsRequestV0 { ids, prove }: GetDataContractsRequestV0, + platform_state: &PlatformState, platform_version: &PlatformVersion, ) -> Result, Error> { let contract_ids = check_validation_result_with_data!(ids @@ -38,11 +40,11 @@ impl Platform { self.drive .prove_contracts(contract_ids.as_slice(), None, platform_version)?; - let (metadata, proof) = self.response_metadata_and_proof_v0(proof); - GetDataContractsResponseV0 { - result: Some(get_data_contracts_response_v0::Result::Proof(proof)), - metadata: Some(metadata), + result: Some(get_data_contracts_response_v0::Result::Proof( + self.response_proof_v0(platform_state, proof), + )), + metadata: Some(self.response_metadata_v0(platform_state)), } } else { let contracts = self.drive.get_contracts_with_fetch_info( @@ -74,7 +76,7 @@ impl Platform { data_contract_entries: contracts, }, )), - metadata: Some(self.response_metadata_v0()), + metadata: Some(self.response_metadata_v0(platform_state)), } }; @@ -89,7 +91,7 @@ mod tests { #[test] fn test_invalid_data_contract_id() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let request = GetDataContractsRequestV0 { ids: vec![vec![0; 8]], @@ -97,7 +99,7 @@ mod tests { }; let result = platform - .query_data_contracts_v0(request, version) + .query_data_contracts_v0(request, &state, version) .expect("expected query to succeed"); assert_invalid_identifier(result); @@ -105,7 +107,7 @@ mod tests { #[test] fn test_data_contracts_not_found() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let id = vec![0; 32]; let request = GetDataContractsRequestV0 { @@ -114,7 +116,7 @@ mod tests { }; let result = platform - .query_data_contracts_v0(request, version) + .query_data_contracts_v0(request, &state, version) .expect("expected query to succeed"); assert!(matches!( @@ -128,7 +130,7 @@ mod tests { #[test] fn test_data_contracts_absence_proof() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let id = vec![0; 32]; let request = GetDataContractsRequestV0 { @@ -137,7 +139,7 @@ mod tests { }; let result = platform - .query_data_contracts_v0(request, version) + .query_data_contracts_v0(request, &state, version) .expect("expected query to succeed"); assert!(matches!( diff --git a/packages/rs-drive-abci/src/query/document_query/mod.rs b/packages/rs-drive-abci/src/query/document_query/mod.rs index 5a032a2572..417e1b9112 100644 --- a/packages/rs-drive-abci/src/query/document_query/mod.rs +++ b/packages/rs-drive-abci/src/query/document_query/mod.rs @@ -1,6 +1,7 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_documents_request::Version as RequestVersion; use dapi_grpc::platform::v0::get_documents_response::Version as ResponseVersion; @@ -14,6 +15,7 @@ impl Platform { pub fn query_documents( &self, GetDocumentsRequest { version }: GetDocumentsRequest, + platform_state: &PlatformState, platform_version: &PlatformVersion, ) -> Result, Error> { let Some(version) = version else { @@ -40,7 +42,8 @@ impl Platform { } match version { RequestVersion::V0(request_v0) => { - let result = self.query_documents_v0(request_v0, platform_version)?; + let result = + self.query_documents_v0(request_v0, platform_state, platform_version)?; Ok(result.map(|response_v0| GetDocumentsResponse { version: Some(ResponseVersion::V0(response_v0)), diff --git a/packages/rs-drive-abci/src/query/document_query/v0/mod.rs b/packages/rs-drive-abci/src/query/document_query/v0/mod.rs index 0fee35536e..37f0a253b1 100644 --- a/packages/rs-drive-abci/src/query/document_query/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/document_query/v0/mod.rs @@ -1,6 +1,7 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_documents_request::get_documents_request_v0::Start; use dapi_grpc::platform::v0::get_documents_request::GetDocumentsRequestV0; @@ -28,6 +29,7 @@ impl Platform { prove, start, }: GetDocumentsRequestV0, + platform_state: &PlatformState, platform_version: &PlatformVersion, ) -> Result, Error> { let contract_id: Identifier = check_validation_result_with_data!(data_contract_id @@ -140,11 +142,11 @@ impl Platform { Err(e) => return Err(e.into()), }; - let (metadata, proof) = self.response_metadata_and_proof_v0(proof); - GetDocumentsResponseV0 { - result: Some(get_documents_response_v0::Result::Proof(proof)), - metadata: Some(metadata), + result: Some(get_documents_response_v0::Result::Proof( + self.response_proof_v0(platform_state, proof), + )), + metadata: Some(self.response_metadata_v0(platform_state)), } } else { let results = match drive_query.execute_raw_results_no_proof( @@ -166,7 +168,7 @@ impl Platform { result: Some(get_documents_response_v0::Result::Documents( get_documents_response_v0::Documents { documents: results }, )), - metadata: Some(self.response_metadata_v0()), + metadata: Some(self.response_metadata_v0(platform_state)), } }; @@ -182,7 +184,7 @@ mod tests { #[test] fn test_invalid_document_id() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let request = GetDocumentsRequestV0 { data_contract_id: vec![0; 8], @@ -195,7 +197,7 @@ mod tests { }; let result = platform - .query_documents_v0(request, version) + .query_documents_v0(request, &state, version) .expect("expected query to succeed"); assert_invalid_identifier(result); @@ -203,7 +205,7 @@ mod tests { #[test] fn test_data_contract_not_found_in_documents_request() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let data_contract_id = vec![0; 32]; @@ -218,7 +220,7 @@ mod tests { }; let result = platform - .query_documents_v0(request, version) + .query_documents_v0(request, &state, version) .expect("expected query to succeed"); assert!(matches!( @@ -229,7 +231,7 @@ mod tests { #[test] fn test_absent_document_type() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let created_data_contract = get_data_contract_fixture(None, 0, version.protocol_version); store_data_contract(&platform, created_data_contract.data_contract(), version); @@ -248,7 +250,7 @@ mod tests { }; let result = platform - .query_documents_v0(request, version) + .query_documents_v0(request, &state, version) .expect("expected query to succeed"); assert!(matches!( @@ -261,7 +263,7 @@ mod tests { #[test] fn test_invalid_where_clause() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let created_data_contract = get_data_contract_fixture(None, 0, version.protocol_version); store_data_contract(&platform, created_data_contract.data_contract(), version); @@ -280,7 +282,7 @@ mod tests { }; let result = platform - .query_documents_v0(request, version) + .query_documents_v0(request, &state, version) .expect("expected query to succeed"); assert!(matches!( @@ -291,7 +293,7 @@ mod tests { #[test] fn test_invalid_order_by_clause() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let created_data_contract = get_data_contract_fixture(None, 0, version.protocol_version); store_data_contract(&platform, created_data_contract.data_contract(), version); @@ -310,7 +312,7 @@ mod tests { }; let result = platform - .query_documents_v0(request, version) + .query_documents_v0(request, &state, version) .expect("expected query to succeed"); assert!(matches!( @@ -321,7 +323,7 @@ mod tests { #[test] fn test_invalid_start_at_clause() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let created_data_contract = get_data_contract_fixture(None, 0, version.protocol_version); store_data_contract(&platform, created_data_contract.data_contract(), version); @@ -340,7 +342,7 @@ mod tests { }; let result = platform - .query_documents_v0(request, version) + .query_documents_v0(request, &state, version) .expect("expected query to succeed"); assert!(matches!( @@ -351,7 +353,7 @@ mod tests { #[test] fn test_invalid_start_after_clause() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let created_data_contract = get_data_contract_fixture(None, 0, version.protocol_version); store_data_contract(&platform, created_data_contract.data_contract(), version); @@ -370,7 +372,7 @@ mod tests { }; let result = platform - .query_documents_v0(request, version) + .query_documents_v0(request, &state, version) .expect("expected query to succeed"); assert!(matches!( @@ -381,7 +383,7 @@ mod tests { #[test] fn test_invalid_limit() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let created_data_contract = get_data_contract_fixture(None, 0, version.protocol_version); store_data_contract(&platform, created_data_contract.data_contract(), version); @@ -401,7 +403,7 @@ mod tests { }; let result = platform - .query_documents_v0(request, version) + .query_documents_v0(request, &state, version) .expect("expected query to succeed"); assert!(matches!( @@ -412,7 +414,7 @@ mod tests { #[test] fn test_documents_not_found() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let created_data_contract = get_data_contract_fixture(None, 0, version.protocol_version); store_data_contract(&platform, created_data_contract.data_contract(), version); @@ -431,7 +433,7 @@ mod tests { }; let result = platform - .query_documents_v0(request, version) + .query_documents_v0(request, &state, version) .expect("expected query to succeed"); assert!(matches!( @@ -445,7 +447,7 @@ mod tests { #[test] fn test_documents_absence_proof() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let created_data_contract = get_data_contract_fixture(None, 0, version.protocol_version); store_data_contract(&platform, created_data_contract.data_contract(), version); @@ -464,7 +466,7 @@ mod tests { }; let result = platform - .query_documents_v0(request, version) + .query_documents_v0(request, &state, version) .expect("expected query to succeed"); assert!(matches!( diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/balance/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/balance/mod.rs index 4b4d5262a6..04c575aa16 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/balance/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/balance/mod.rs @@ -1,6 +1,7 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_identity_balance_request::Version as RequestVersion; use dapi_grpc::platform::v0::get_identity_balance_response::Version as ResponseVersion; @@ -14,6 +15,7 @@ impl Platform { pub fn query_balance( &self, GetIdentityBalanceRequest { version }: GetIdentityBalanceRequest, + platform_state: &PlatformState, platform_version: &PlatformVersion, ) -> Result, Error> { let Some(version) = version else { @@ -44,7 +46,7 @@ impl Platform { } match version { RequestVersion::V0(request_v0) => { - let result = self.query_balance_v0(request_v0, platform_version)?; + let result = self.query_balance_v0(request_v0, platform_state, platform_version)?; Ok(result.map(|response_v0| GetIdentityBalanceResponse { version: Some(ResponseVersion::V0(response_v0)), diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/balance/v0/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/balance/v0/mod.rs index 9ed1698dd0..6595495757 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/balance/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/balance/v0/mod.rs @@ -1,6 +1,7 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_identity_balance_request::GetIdentityBalanceRequestV0; use dapi_grpc::platform::v0::get_identity_balance_response::get_identity_balance_response_v0; @@ -14,6 +15,7 @@ impl Platform { pub(super) fn query_balance_v0( &self, GetIdentityBalanceRequestV0 { id, prove }: GetIdentityBalanceRequestV0, + platform_state: &PlatformState, platform_version: &PlatformVersion, ) -> Result, Error> { let identity_id: Identifier = @@ -30,11 +32,11 @@ impl Platform { &platform_version.drive )); - let (metadata, proof) = self.response_metadata_and_proof_v0(proof); - GetIdentityBalanceResponseV0 { - result: Some(get_identity_balance_response_v0::Result::Proof(proof)), - metadata: Some(metadata), + result: Some(get_identity_balance_response_v0::Result::Proof( + self.response_proof_v0(platform_state, proof), + )), + metadata: Some(self.response_metadata_v0(platform_state)), } } else { let maybe_balance = self.drive.fetch_identity_balance( @@ -51,7 +53,7 @@ impl Platform { GetIdentityBalanceResponseV0 { result: Some(get_identity_balance_response_v0::Result::Balance(balance)), - metadata: Some(self.response_metadata_v0()), + metadata: Some(self.response_metadata_v0(platform_state)), } }; @@ -66,7 +68,7 @@ mod tests { #[test] fn test_invalid_identity_id() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let request = GetIdentityBalanceRequestV0 { id: vec![0; 8], @@ -74,7 +76,7 @@ mod tests { }; let result = platform - .query_balance_v0(request, version) + .query_balance_v0(request, &state, version) .expect("should query balance"); assert_invalid_identifier(result); @@ -82,7 +84,7 @@ mod tests { #[test] fn test_identity_not_found() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let id = vec![0; 32]; @@ -92,7 +94,7 @@ mod tests { }; let result = platform - .query_balance_v0(request, version) + .query_balance_v0(request, &state, version) .expect("expected query to succeed"); assert!(matches!( @@ -103,7 +105,7 @@ mod tests { #[test] fn test_identity_balance_absence_proof() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let id = vec![0; 32]; @@ -113,7 +115,7 @@ mod tests { }; let result = platform - .query_balance_v0(request, version) + .query_balance_v0(request, &state, version) .expect("should query balance"); assert!(matches!( diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/balance_and_revision/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/balance_and_revision/mod.rs index 4a7778e573..7259411c9c 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/balance_and_revision/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/balance_and_revision/mod.rs @@ -1,6 +1,7 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_identity_balance_and_revision_request::Version as RequestVersion; use dapi_grpc::platform::v0::get_identity_balance_and_revision_response::Version as ResponseVersion; @@ -16,6 +17,7 @@ impl Platform { pub fn query_balance_and_revision( &self, GetIdentityBalanceAndRevisionRequest { version }: GetIdentityBalanceAndRevisionRequest, + platform_state: &PlatformState, platform_version: &PlatformVersion, ) -> Result, Error> { let Some(version) = version else { @@ -48,7 +50,11 @@ impl Platform { } match version { RequestVersion::V0(request_v0) => { - let result = self.query_balance_and_revision_v0(request_v0, platform_version)?; + let result = self.query_balance_and_revision_v0( + request_v0, + platform_state, + platform_version, + )?; Ok( result.map(|response_v0| GetIdentityBalanceAndRevisionResponse { diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/balance_and_revision/v0/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/balance_and_revision/v0/mod.rs index e40061afb5..097d9753e7 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/balance_and_revision/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/balance_and_revision/v0/mod.rs @@ -9,11 +9,13 @@ use dpp::validation::ValidationResult; use dpp::version::PlatformVersion; use dapi_grpc::platform::v0::get_identity_balance_and_revision_request::GetIdentityBalanceAndRevisionRequestV0; use dapi_grpc::platform::v0::get_identity_balance_and_revision_response::get_identity_balance_and_revision_response_v0::BalanceAndRevision; +use crate::platform_types::platform_state::PlatformState; impl Platform { pub(super) fn query_balance_and_revision_v0( &self, GetIdentityBalanceAndRevisionRequestV0 { id, prove }: GetIdentityBalanceAndRevisionRequestV0, + platform_state: &PlatformState, platform_version: &PlatformVersion, ) -> Result, Error> { let identity_id: Identifier = @@ -30,11 +32,13 @@ impl Platform { &platform_version.drive, )?; - let (metadata, proof) = self.response_metadata_and_proof_v0(proof); - GetIdentityBalanceAndRevisionResponseV0 { - result: Some(get_identity_balance_and_revision_response_v0::Result::Proof(proof)), - metadata: Some(metadata), + result: Some( + get_identity_balance_and_revision_response_v0::Result::Proof( + self.response_proof_v0(platform_state, proof), + ), + ), + metadata: Some(self.response_metadata_v0(platform_state)), } } else { let maybe_balance = self.drive.fetch_identity_balance( @@ -68,7 +72,7 @@ impl Platform { BalanceAndRevision { balance, revision }, ), ), - metadata: Some(self.response_metadata_v0()), + metadata: Some(self.response_metadata_v0(platform_state)), } }; @@ -83,7 +87,7 @@ mod tests { #[test] fn test_invalid_identity_id() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let request = GetIdentityBalanceAndRevisionRequestV0 { id: vec![0; 8], @@ -91,7 +95,7 @@ mod tests { }; let result = platform - .query_balance_and_revision_v0(request, version) + .query_balance_and_revision_v0(request, &state, version) .expect("should query balance and revision"); assert_invalid_identifier(result); @@ -99,7 +103,7 @@ mod tests { #[test] fn test_identity_not_found_when_querying_balance_and_revision() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let id = vec![0; 32]; @@ -109,7 +113,7 @@ mod tests { }; let result = platform - .query_balance_and_revision_v0(request, version) + .query_balance_and_revision_v0(request, &state, version) .expect("expected query to succeed"); assert!(matches!( @@ -120,7 +124,7 @@ mod tests { #[test] fn test_identity_balance_and_revision_absence_proof() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let id = vec![0; 32]; @@ -130,7 +134,7 @@ mod tests { }; let result = platform - .query_balance_and_revision_v0(request, version) + .query_balance_and_revision_v0(request, &state, version) .expect("should query balance and revision"); assert!(matches!( diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identities/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identities/mod.rs index 6af9f376b7..3fcab01fcd 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/identities/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identities/mod.rs @@ -1,6 +1,7 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_identities_request::Version as RequestVersion; use dapi_grpc::platform::v0::get_identities_response::Version as ResponseVersion; @@ -14,6 +15,7 @@ impl Platform { pub fn query_identities( &self, GetIdentitiesRequest { version }: GetIdentitiesRequest, + platform_state: &PlatformState, platform_version: &PlatformVersion, ) -> Result, Error> { let Some(version) = version else { @@ -44,7 +46,8 @@ impl Platform { } match version { RequestVersion::V0(request_v0) => { - let result = self.query_identities_v0(request_v0, platform_version)?; + let result = + self.query_identities_v0(request_v0, platform_state, platform_version)?; Ok(result.map(|response_v0| GetIdentitiesResponse { version: Some(ResponseVersion::V0(response_v0)), diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identities/v0/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identities/v0/mod.rs index 7942d972e0..47fe819409 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/identities/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identities/v0/mod.rs @@ -1,6 +1,7 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_identities_request::GetIdentitiesRequestV0; use dapi_grpc::platform::v0::get_identities_response; @@ -17,6 +18,7 @@ impl Platform { pub(super) fn query_identities_v0( &self, GetIdentitiesRequestV0 { ids, prove }: GetIdentitiesRequestV0, + platform_state: &PlatformState, platform_version: &PlatformVersion, ) -> Result, Error> { let identity_ids = check_validation_result_with_data!(ids @@ -39,11 +41,11 @@ impl Platform { &platform_version.drive, )?; - let (metadata, proof) = self.response_metadata_and_proof_v0(proof); - GetIdentitiesResponseV0 { - result: Some(get_identities_response_v0::Result::Proof(proof)), - metadata: Some(metadata), + result: Some(get_identities_response_v0::Result::Proof( + self.response_proof_v0(platform_state, proof), + )), + metadata: Some(self.response_metadata_v0(platform_state)), } } else { let identities = self.drive.fetch_full_identities( @@ -76,7 +78,7 @@ impl Platform { identity_entries: identities, }, )), - metadata: Some(self.response_metadata_v0()), + metadata: Some(self.response_metadata_v0(platform_state)), } }; @@ -91,7 +93,7 @@ mod tests { #[test] fn test_invalid_identity_id() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let request = GetIdentitiesRequestV0 { ids: vec![vec![0; 8]], @@ -99,7 +101,7 @@ mod tests { }; let result = platform - .query_identities_v0(request, version) + .query_identities_v0(request, &state, version) .expect("should query identities"); assert_invalid_identifier(result); @@ -107,7 +109,7 @@ mod tests { #[test] fn test_identities_not_found() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let id = vec![0; 32]; @@ -117,7 +119,7 @@ mod tests { }; let result = platform - .query_identities_v0(request, version) + .query_identities_v0(request, &state, version) .expect("should query identities"); assert!(matches!(result.data, Some(GetIdentitiesResponseV0 { @@ -128,7 +130,7 @@ mod tests { #[test] fn test_identities_absence_proof() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let id = vec![0; 32]; let request = GetIdentitiesRequestV0 { @@ -137,7 +139,7 @@ mod tests { }; let result = platform - .query_identities_v0(request, version) + .query_identities_v0(request, &state, version) .expect("should query identities"); assert!(matches!( diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identities_by_public_key_hashes/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identities_by_public_key_hashes/mod.rs index 1d3d801b7f..63db7e9b98 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/identities_by_public_key_hashes/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identities_by_public_key_hashes/mod.rs @@ -1,6 +1,7 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_identities_by_public_key_hashes_request::Version as RequestVersion; use dapi_grpc::platform::v0::get_identities_by_public_key_hashes_response::Version as ResponseVersion; @@ -16,6 +17,7 @@ impl Platform { pub fn query_identities_by_public_key_hashes( &self, GetIdentitiesByPublicKeyHashesRequest { version }: GetIdentitiesByPublicKeyHashesRequest, + platform_state: &PlatformState, platform_version: &PlatformVersion, ) -> Result, Error> { let Some(version) = version else { @@ -48,8 +50,11 @@ impl Platform { } match version { RequestVersion::V0(request_v0) => { - let result = - self.query_identities_by_public_key_hashes_v0(request_v0, platform_version)?; + let result = self.query_identities_by_public_key_hashes_v0( + request_v0, + platform_state, + platform_version, + )?; Ok( result.map(|response_v0| GetIdentitiesByPublicKeyHashesResponse { diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identities_by_public_key_hashes/v0/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identities_by_public_key_hashes/v0/mod.rs index e750b4c622..4a6f8c190d 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/identities_by_public_key_hashes/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identities_by_public_key_hashes/v0/mod.rs @@ -1,6 +1,7 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_identities_by_public_key_hashes_request::GetIdentitiesByPublicKeyHashesRequestV0; use dapi_grpc::platform::v0::get_identities_by_public_key_hashes_response; @@ -21,6 +22,7 @@ impl Platform { public_key_hashes, prove, }: GetIdentitiesByPublicKeyHashesRequestV0, + platform_state: &PlatformState, platform_version: &PlatformVersion, ) -> Result, Error> { let public_key_hashes = check_validation_result_with_data!(public_key_hashes @@ -45,11 +47,13 @@ impl Platform { platform_version, )?; - let (metadata, proof) = self.response_metadata_and_proof_v0(proof); - GetIdentitiesByPublicKeyHashesResponseV0 { - result: Some(get_identities_by_public_key_hashes_response_v0::Result::Proof(proof)), - metadata: Some(metadata), + result: Some( + get_identities_by_public_key_hashes_response_v0::Result::Proof( + self.response_proof_v0(platform_state, proof), + ), + ), + metadata: Some(self.response_metadata_v0(platform_state)), } } else { let identities = self @@ -72,7 +76,7 @@ impl Platform { .collect::, ProtocolError>>()?; GetIdentitiesByPublicKeyHashesResponseV0 { - metadata: Some(self.response_metadata_v0()), + metadata: Some(self.response_metadata_v0(platform_state)), result: Some( get_identities_by_public_key_hashes_response_v0::Result::Identities( get_identities_by_public_key_hashes_response::IdentitiesByPublicKeyHashes { @@ -94,7 +98,7 @@ mod tests { #[test] fn test_invalid_public_key_hash() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let request = GetIdentitiesByPublicKeyHashesRequestV0 { public_key_hashes: vec![vec![0; 8]], @@ -102,7 +106,7 @@ mod tests { }; let result = platform - .query_identities_by_public_key_hashes_v0(request, version) + .query_identities_by_public_key_hashes_v0(request, &state, version) .expect("should query identities by public key hashes"); assert!( @@ -112,7 +116,7 @@ mod tests { #[test] fn test_identities_not_found() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let request = GetIdentitiesByPublicKeyHashesRequestV0 { public_key_hashes: vec![vec![0; 20]], @@ -120,7 +124,7 @@ mod tests { }; let result = platform - .query_identities_by_public_key_hashes_v0(request, version) + .query_identities_by_public_key_hashes_v0(request, &state, version) .expect("expected query to succeed"); assert!( @@ -133,7 +137,7 @@ mod tests { #[test] fn test_identities_absence_proof() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let request = GetIdentitiesByPublicKeyHashesRequestV0 { public_key_hashes: vec![vec![0; 20]], @@ -141,7 +145,7 @@ mod tests { }; let result = platform - .query_identities_by_public_key_hashes_v0(request, version) + .query_identities_by_public_key_hashes_v0(request, &state, version) .expect("expected query to succeed"); assert!(matches!( diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identity/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identity/mod.rs index d4f5e655fd..00bb4a2139 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/identity/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identity/mod.rs @@ -1,6 +1,7 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_identity_request::Version as RequestVersion; use dapi_grpc::platform::v0::get_identity_response::Version as ResponseVersion; @@ -14,6 +15,7 @@ impl Platform { pub fn query_identity( &self, GetIdentityRequest { version }: GetIdentityRequest, + platform_state: &PlatformState, platform_version: &PlatformVersion, ) -> Result, Error> { let Some(version) = version else { @@ -44,7 +46,8 @@ impl Platform { } match version { RequestVersion::V0(request_v0) => { - let result = self.query_identity_v0(request_v0, platform_version)?; + let result = + self.query_identity_v0(request_v0, platform_state, platform_version)?; Ok(result.map(|response| GetIdentityResponse { version: Some(ResponseVersion::V0(response)), diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identity/v0/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identity/v0/mod.rs index b73cced131..84aea46a8f 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/identity/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identity/v0/mod.rs @@ -1,6 +1,7 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_identity_request::GetIdentityRequestV0; use dapi_grpc::platform::v0::get_identity_response::{ @@ -16,6 +17,7 @@ impl Platform { pub(super) fn query_identity_v0( &self, GetIdentityRequestV0 { id, prove }: GetIdentityRequestV0, + platform_state: &PlatformState, platform_version: &PlatformVersion, ) -> Result, Error> { let identity_id: Identifier = @@ -32,11 +34,11 @@ impl Platform { &platform_version.drive, )?; - let (metadata, proof) = self.response_metadata_and_proof_v0(proof); - GetIdentityResponseV0 { - result: Some(get_identity_response_v0::Result::Proof(proof)), - metadata: Some(metadata), + result: Some(get_identity_response_v0::Result::Proof( + self.response_proof_v0(platform_state, proof), + )), + metadata: Some(self.response_metadata_v0(platform_state)), } } else { let maybe_identity = self.drive.fetch_full_identity( @@ -57,7 +59,7 @@ impl Platform { result: Some(get_identity_response_v0::Result::Identity( serialized_identity, )), - metadata: Some(self.response_metadata_v0()), + metadata: Some(self.response_metadata_v0(platform_state)), } }; @@ -72,7 +74,7 @@ mod tests { #[test] fn test_invalid_identity_id() { - let (platform, _unused_version) = setup_platform(); + let (platform, state, version) = setup_platform(); let version = PlatformVersion::latest(); @@ -82,7 +84,7 @@ mod tests { }; let result = platform - .query_identity_v0(request, version) + .query_identity_v0(request, &state, version) .expect("should execute query"); assert_invalid_identifier(result); @@ -90,7 +92,7 @@ mod tests { #[test] fn test_identity_not_found() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let id = vec![0; 32]; let request = GetIdentityRequestV0 { @@ -99,7 +101,7 @@ mod tests { }; let result = platform - .query_identity_v0(request, version) + .query_identity_v0(request, &state, version) .expect("should execute query"); let validation_error = result.first_error().unwrap(); @@ -112,7 +114,7 @@ mod tests { #[test] fn test_identity_absence_proof() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let id = vec![0; 32]; let request = GetIdentityRequestV0 { @@ -121,7 +123,7 @@ mod tests { }; let result = platform - .query_identity_v0(request, version) + .query_identity_v0(request, &state, version) .expect("should execute query"); assert!(matches!( diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identity_by_public_key_hash/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identity_by_public_key_hash/mod.rs index 483b807b11..db20b658b6 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/identity_by_public_key_hash/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identity_by_public_key_hash/mod.rs @@ -1,6 +1,7 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_identity_by_public_key_hash_request::Version as RequestVersion; use dapi_grpc::platform::v0::get_identity_by_public_key_hash_response::Version as ResponseVersion; @@ -16,6 +17,7 @@ impl Platform { pub fn query_identity_by_public_key_hash( &self, GetIdentityByPublicKeyHashRequest { version }: GetIdentityByPublicKeyHashRequest, + platform_state: &PlatformState, platform_version: &PlatformVersion, ) -> Result, Error> { let Some(version) = version else { @@ -50,8 +52,11 @@ impl Platform { match version { RequestVersion::V0(request_v0) => { - let request = - self.query_identity_by_public_key_hash_v0(request_v0, platform_version)?; + let request = self.query_identity_by_public_key_hash_v0( + request_v0, + platform_state, + platform_version, + )?; Ok( request.map(|response_v0| GetIdentityByPublicKeyHashResponse { diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identity_by_public_key_hash/v0/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identity_by_public_key_hash/v0/mod.rs index 76ef09cdbd..2500b19d42 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/identity_by_public_key_hash/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identity_by_public_key_hash/v0/mod.rs @@ -1,6 +1,7 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_identity_by_public_key_hash_request::GetIdentityByPublicKeyHashRequestV0; use dapi_grpc::platform::v0::get_identity_by_public_key_hash_response::{ @@ -19,6 +20,7 @@ impl Platform { public_key_hash, prove, }: GetIdentityByPublicKeyHashRequestV0, + platform_state: &PlatformState, platform_version: &PlatformVersion, ) -> Result, Error> { let public_key_hash = @@ -35,13 +37,11 @@ impl Platform { platform_version, )?; - let (metadata, proof) = self.response_metadata_and_proof_v0(proof); - GetIdentityByPublicKeyHashResponseV0 { result: Some(get_identity_by_public_key_hash_response_v0::Result::Proof( - proof, + self.response_proof_v0(platform_state, proof), )), - metadata: Some(metadata), + metadata: Some(self.response_metadata_v0(platform_state)), } } else { let maybe_identity = self.drive.fetch_full_identity_by_unique_public_key_hash( @@ -62,7 +62,7 @@ impl Platform { .map_err(Error::Protocol)?; GetIdentityByPublicKeyHashResponseV0 { - metadata: Some(self.response_metadata_v0()), + metadata: Some(self.response_metadata_v0(platform_state)), result: Some( get_identity_by_public_key_hash_response_v0::Result::Identity( serialized_identity, @@ -82,7 +82,7 @@ mod tests { #[test] fn test_invalid_public_key_hash() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let request = GetIdentityByPublicKeyHashRequestV0 { public_key_hash: vec![0; 8], @@ -90,7 +90,7 @@ mod tests { }; let result = platform - .query_identity_by_public_key_hash_v0(request, version) + .query_identity_by_public_key_hash_v0(request, &state, version) .expect("expected query to succeed"); assert!(matches!( @@ -101,7 +101,7 @@ mod tests { #[test] fn test_identity_not_found() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let public_key_hash = vec![0; 20]; let request = GetIdentityByPublicKeyHashRequestV0 { @@ -110,7 +110,7 @@ mod tests { }; let result = platform - .query_identity_by_public_key_hash_v0(request, version) + .query_identity_by_public_key_hash_v0(request, &state, version) .expect("expected query to succeed"); assert!(matches!( @@ -121,7 +121,7 @@ mod tests { #[test] fn test_identity_absence_proof() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let public_key_hash = vec![0; 20]; let request = GetIdentityByPublicKeyHashRequestV0 { @@ -130,7 +130,7 @@ mod tests { }; let result = platform - .query_identity_by_public_key_hash_v0(request, version) + .query_identity_by_public_key_hash_v0(request, &state, version) .expect("expected query to succeed"); assert!(matches!( diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identity_contract_nonce/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identity_contract_nonce/mod.rs index 334229e154..dc25837dfc 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/identity_contract_nonce/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identity_contract_nonce/mod.rs @@ -1,6 +1,7 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_identity_contract_nonce_request::Version as RequestVersion; use dapi_grpc::platform::v0::get_identity_contract_nonce_response::Version as ResponseVersion; @@ -14,6 +15,7 @@ impl Platform { pub fn query_identity_contract_nonce( &self, GetIdentityContractNonceRequest { version }: GetIdentityContractNonceRequest, + platform_state: &PlatformState, platform_version: &PlatformVersion, ) -> Result, Error> { let Some(version) = version else { @@ -46,7 +48,11 @@ impl Platform { } match version { RequestVersion::V0(request_v0) => { - let result = self.query_identity_contract_nonce_v0(request_v0, platform_version)?; + let result = self.query_identity_contract_nonce_v0( + request_v0, + platform_state, + platform_version, + )?; Ok(result.map(|response_v0| GetIdentityContractNonceResponse { version: Some(ResponseVersion::V0(response_v0)), diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identity_contract_nonce/v0/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identity_contract_nonce/v0/mod.rs index 7c5bccac35..a25d95c98c 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/identity_contract_nonce/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identity_contract_nonce/v0/mod.rs @@ -1,6 +1,7 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_identity_contract_nonce_request::GetIdentityContractNonceRequestV0; use dapi_grpc::platform::v0::get_identity_contract_nonce_response::{ @@ -19,6 +20,7 @@ impl Platform { contract_id, prove, }: GetIdentityContractNonceRequestV0, + platform_state: &PlatformState, platform_version: &PlatformVersion, ) -> Result, Error> { let identity_id = check_validation_result_with_data!(Identifier::from_vec(identity_id) @@ -41,13 +43,11 @@ impl Platform { &platform_version.drive, )?; - let (metadata, proof) = self.response_metadata_and_proof_v0(proof); - GetIdentityContractNonceResponseV0 { result: Some(get_identity_contract_nonce_response_v0::Result::Proof( - proof, + self.response_proof_v0(platform_state, proof), )), - metadata: Some(metadata), + metadata: Some(self.response_metadata_v0(platform_state)), } } else { let maybe_identity = self.drive.fetch_identity_contract_nonce( @@ -62,7 +62,7 @@ impl Platform { let identity_contract_nonce = maybe_identity.unwrap_or_default(); GetIdentityContractNonceResponseV0 { - metadata: Some(self.response_metadata_v0()), + metadata: Some(self.response_metadata_v0(platform_state)), result: Some( get_identity_contract_nonce_response_v0::Result::IdentityContractNonce( identity_contract_nonce, @@ -91,7 +91,7 @@ mod tests { #[test] fn test_invalid_identity_id() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let request = GetIdentityContractNonceRequestV0 { identity_id: vec![0; 8], @@ -100,7 +100,7 @@ mod tests { }; let result = platform - .query_identity_contract_nonce_v0(request, version) + .query_identity_contract_nonce_v0(request, &state, version) .expect("expected query to succeed"); assert!(matches!( @@ -110,7 +110,7 @@ mod tests { #[test] fn test_invalid_contract_id() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let request = GetIdentityContractNonceRequestV0 { identity_id: vec![0; 32], @@ -119,7 +119,7 @@ mod tests { }; let result = platform - .query_identity_contract_nonce_v0(request, version) + .query_identity_contract_nonce_v0(request, &state, version) .expect("expected query to succeed"); assert!(matches!( @@ -129,7 +129,7 @@ mod tests { #[test] fn test_identity_not_found_when_querying_identity_nonce() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let request = GetIdentityContractNonceRequestV0 { identity_id: vec![0; 32], @@ -138,7 +138,7 @@ mod tests { }; let result = platform - .query_identity_contract_nonce_v0(request, version) + .query_identity_contract_nonce_v0(request, &state, version) .expect("expected query to succeed"); assert!(result.is_valid()); @@ -156,7 +156,7 @@ mod tests { #[test] fn test_contract_info_not_found_when_querying_identity_nonce_with_known_identity() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let mut rng = StdRng::seed_from_u64(45); let id = rng.gen::<[u8; 32]>(); let _unused_identity = @@ -170,7 +170,7 @@ mod tests { }; let result = platform - .query_identity_contract_nonce_v0(request, version) + .query_identity_contract_nonce_v0(request, &state, version) .expect("expected query to succeed"); assert!(result.is_valid()); @@ -188,13 +188,13 @@ mod tests { #[test] fn test_identity_is_found_when_querying_identity_nonce() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let mut rng = StdRng::seed_from_u64(10); let id = rng.gen::<[u8; 32]>(); let identity = create_test_identity_with_rng(&platform.drive, id, &mut rng, None, version) .expect("expected to create a test identity"); - let dashpay = platform.drive.cache.system_data_contracts.read_dashpay(); + let dashpay = platform.drive.cache.system_data_contracts.load_dashpay(); platform .drive @@ -217,7 +217,7 @@ mod tests { }; let result = platform - .query_identity_contract_nonce_v0(request, version) + .query_identity_contract_nonce_v0(request, &state, version) .expect("expected query to succeed"); assert!(result.is_valid()); @@ -235,13 +235,13 @@ mod tests { #[test] fn test_identity_is_found_when_querying_identity_nonce_after_update() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let mut rng = StdRng::seed_from_u64(10); let id = rng.gen::<[u8; 32]>(); let identity = create_test_identity_with_rng(&platform.drive, id, &mut rng, None, version) .expect("expected to create a test identity"); - let dashpay = platform.drive.cache.system_data_contracts.read_dashpay(); + let dashpay = platform.drive.cache.system_data_contracts.load_dashpay(); platform .drive @@ -278,7 +278,7 @@ mod tests { }; let result = platform - .query_identity_contract_nonce_v0(request, version) + .query_identity_contract_nonce_v0(request, &state, version) .expect("expected query to succeed"); assert!(result.is_valid()); @@ -296,13 +296,13 @@ mod tests { #[test] fn test_identity_is_found_when_querying_identity_nonce_after_update_for_past() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let mut rng = StdRng::seed_from_u64(10); let id = rng.gen::<[u8; 32]>(); let identity = create_test_identity_with_rng(&platform.drive, id, &mut rng, None, version) .expect("expected to create a test identity"); - let dashpay = platform.drive.cache.system_data_contracts.read_dashpay(); + let dashpay = platform.drive.cache.system_data_contracts.load_dashpay(); platform .drive @@ -354,7 +354,7 @@ mod tests { }; let result = platform - .query_identity_contract_nonce_v0(request, version) + .query_identity_contract_nonce_v0(request, &state, version) .expect("expected query to succeed"); assert!(result.is_valid()); @@ -372,7 +372,7 @@ mod tests { #[test] fn test_identity_contract_nonce_absence_proof() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let request = GetIdentityContractNonceRequestV0 { identity_id: vec![0; 32], @@ -381,7 +381,7 @@ mod tests { }; let result = platform - .query_identity_contract_nonce_v0(request, version) + .query_identity_contract_nonce_v0(request, &state, version) .expect("expected query to succeed"); assert!(result.is_valid()); diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identity_nonce/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identity_nonce/mod.rs index abcae1e255..e5cf40cac3 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/identity_nonce/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identity_nonce/mod.rs @@ -1,6 +1,7 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_identity_nonce_request::Version as RequestVersion; use dapi_grpc::platform::v0::get_identity_nonce_response::Version as ResponseVersion; @@ -14,6 +15,7 @@ impl Platform { pub fn query_identity_nonce( &self, GetIdentityNonceRequest { version }: GetIdentityNonceRequest, + platform_state: &PlatformState, platform_version: &PlatformVersion, ) -> Result, Error> { let Some(version) = version else { @@ -44,7 +46,8 @@ impl Platform { } match version { RequestVersion::V0(request_v0) => { - let result = self.query_identity_nonce_v0(request_v0, platform_version)?; + let result = + self.query_identity_nonce_v0(request_v0, platform_state, platform_version)?; Ok(result.map(|response_v0| GetIdentityNonceResponse { version: Some(ResponseVersion::V0(response_v0)), diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identity_nonce/v0/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identity_nonce/v0/mod.rs index 3e77dfd200..d64ca871d7 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/identity_nonce/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identity_nonce/v0/mod.rs @@ -1,6 +1,7 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_identity_nonce_request::GetIdentityNonceRequestV0; use dapi_grpc::platform::v0::get_identity_nonce_response::{ @@ -15,6 +16,7 @@ impl Platform { pub(super) fn query_identity_nonce_v0( &self, GetIdentityNonceRequestV0 { identity_id, prove }: GetIdentityNonceRequestV0, + platform_state: &PlatformState, platform_version: &PlatformVersion, ) -> Result, Error> { let identity_id = check_validation_result_with_data!(Identifier::from_vec(identity_id) @@ -28,11 +30,11 @@ impl Platform { .drive .prove_identity_nonce(identity_id.0, None, platform_version)?; - let (metadata, proof) = self.response_metadata_and_proof_v0(proof); - GetIdentityNonceResponseV0 { - result: Some(get_identity_nonce_response_v0::Result::Proof(proof)), - metadata: Some(metadata), + result: Some(get_identity_nonce_response_v0::Result::Proof( + self.response_proof_v0(platform_state, proof), + )), + metadata: Some(self.response_metadata_v0(platform_state)), } } else { let maybe_identity = @@ -43,7 +45,7 @@ impl Platform { let identity_nonce = maybe_identity.unwrap_or_default(); GetIdentityNonceResponseV0 { - metadata: Some(self.response_metadata_v0()), + metadata: Some(self.response_metadata_v0(platform_state)), result: Some(get_identity_nonce_response_v0::Result::IdentityNonce( identity_nonce, )), @@ -69,7 +71,7 @@ mod tests { #[test] fn test_invalid_identity_id() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let request = GetIdentityNonceRequestV0 { identity_id: vec![0; 8], @@ -77,7 +79,7 @@ mod tests { }; let result = platform - .query_identity_nonce_v0(request, version) + .query_identity_nonce_v0(request, &state, version) .expect("expected query to succeed"); assert!(matches!( @@ -87,7 +89,7 @@ mod tests { #[test] fn test_identity_not_found_when_querying_identity_nonce() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let request = GetIdentityNonceRequestV0 { identity_id: vec![0; 32], @@ -95,7 +97,7 @@ mod tests { }; let result = platform - .query_identity_nonce_v0(request, version) + .query_identity_nonce_v0(request, &state, version) .expect("expected query to succeed"); assert!(result.is_valid()); @@ -111,7 +113,7 @@ mod tests { #[test] fn test_identity_is_found_when_querying_identity_nonce() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let mut rng = StdRng::seed_from_u64(10); let id = rng.gen::<[u8; 32]>(); let _unused_identity = @@ -124,7 +126,7 @@ mod tests { }; let result = platform - .query_identity_nonce_v0(request, version) + .query_identity_nonce_v0(request, &state, version) .expect("expected query to succeed"); assert!(result.is_valid()); @@ -140,13 +142,12 @@ mod tests { #[test] fn test_identity_is_found_when_querying_identity_nonce_after_update() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let mut rng = StdRng::seed_from_u64(10); let id = rng.gen::<[u8; 32]>(); let identity = create_test_identity_with_rng(&platform.drive, id, &mut rng, None, version) .expect("expected to create a test identity"); - platform .drive .merge_identity_nonce( @@ -177,7 +178,7 @@ mod tests { }; let result = platform - .query_identity_nonce_v0(request, version) + .query_identity_nonce_v0(request, &state, version) .expect("expected query to succeed"); assert!(result.is_valid()); @@ -193,7 +194,7 @@ mod tests { #[test] fn test_identity_is_found_when_querying_identity_nonce_after_update_for_past() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let mut rng = StdRng::seed_from_u64(10); let id = rng.gen::<[u8; 32]>(); let identity = create_test_identity_with_rng(&platform.drive, id, &mut rng, None, version) @@ -242,7 +243,7 @@ mod tests { }; let result = platform - .query_identity_nonce_v0(request, version) + .query_identity_nonce_v0(request, &state, version) .expect("expected query to succeed"); assert!(result.is_valid()); @@ -258,7 +259,7 @@ mod tests { #[test] fn test_identity_contract_nonce_absence_proof() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let request = GetIdentityNonceRequestV0 { identity_id: vec![0; 32], @@ -266,7 +267,7 @@ mod tests { }; let result = platform - .query_identity_nonce_v0(request, version) + .query_identity_nonce_v0(request, &state, version) .expect("expected query to succeed"); assert!(matches!( diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/keys/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/keys/mod.rs index 88a6d2e3b3..51ba2bd9bd 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/keys/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/keys/mod.rs @@ -1,6 +1,7 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_identity_keys_request::Version as RequestVersion; use dapi_grpc::platform::v0::get_identity_keys_response::Version as ResponseVersion; @@ -14,6 +15,7 @@ impl Platform { pub fn query_keys( &self, GetIdentityKeysRequest { version }: GetIdentityKeysRequest, + platform_state: &PlatformState, platform_version: &PlatformVersion, ) -> Result, Error> { let Some(version) = version else { @@ -44,7 +46,7 @@ impl Platform { } match version { RequestVersion::V0(request_v0) => { - let result = self.query_keys_v0(request_v0, platform_version)?; + let result = self.query_keys_v0(request_v0, platform_state, platform_version)?; Ok(result.map(|response_v0| GetIdentityKeysResponse { version: Some(ResponseVersion::V0(response_v0)), diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/keys/v0/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/keys/v0/mod.rs index 16b2f968f1..de77fe63db 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/keys/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/keys/v0/mod.rs @@ -11,6 +11,7 @@ use dpp::identifier::Identifier; use drive::error::query::QuerySyntaxError; use std::collections::BTreeMap; +use crate::platform_types::platform_state::PlatformState; use dpp::identity::{KeyID, Purpose, SecurityLevel}; use dpp::validation::ValidationResult; use dpp::version::PlatformVersion; @@ -79,6 +80,7 @@ impl Platform { offset, prove, }: GetIdentityKeysRequestV0, + platform_state: &PlatformState, platform_version: &PlatformVersion, ) -> Result, Error> { let identity_id: Identifier = check_validation_result_with_data!(identity_id @@ -138,11 +140,11 @@ impl Platform { .drive .prove_identity_keys(key_request, None, platform_version)?; - let (metadata, proof) = self.response_metadata_and_proof_v0(proof); - GetIdentityKeysResponseV0 { - result: Some(get_identity_keys_response_v0::Result::Proof(proof)), - metadata: Some(metadata), + result: Some(get_identity_keys_response_v0::Result::Proof( + self.response_proof_v0(platform_state, proof), + )), + metadata: Some(self.response_metadata_v0(platform_state)), } } else { let keys: SerializedKeyVec = @@ -153,7 +155,7 @@ impl Platform { result: Some(get_identity_keys_response_v0::Result::Keys( get_identity_keys_response_v0::Keys { keys_bytes: keys }, )), - metadata: Some(self.response_metadata_v0()), + metadata: Some(self.response_metadata_v0(platform_state)), } }; @@ -170,7 +172,7 @@ mod tests { #[test] fn test_invalid_identity_id() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let request = GetIdentityKeysRequestV0 { identity_id: vec![0; 8], @@ -181,7 +183,7 @@ mod tests { }; let result = platform - .query_keys_v0(request, version) + .query_keys_v0(request, &state, version) .expect("expected query to succeed"); assert_invalid_identifier(result); @@ -189,7 +191,7 @@ mod tests { #[test] fn test_invalid_limit_u16_overflow() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let request = GetIdentityKeysRequestV0 { identity_id: vec![0; 32], @@ -200,7 +202,7 @@ mod tests { }; let result = platform - .query_keys_v0(request, version) + .query_keys_v0(request, &state, version) .expect("expected query to succeed"); assert!(matches!( @@ -211,7 +213,7 @@ mod tests { #[test] fn test_invalid_limit_max() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let request = GetIdentityKeysRequestV0 { identity_id: vec![0; 32], @@ -222,7 +224,7 @@ mod tests { }; let result = platform - .query_keys_v0(request, version) + .query_keys_v0(request, &state, version) .expect("expected query to succeed"); let error_message = format!( @@ -238,7 +240,7 @@ mod tests { #[test] fn test_invalid_offset_u16_overflow() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let request = GetIdentityKeysRequestV0 { identity_id: vec![0; 32], @@ -249,7 +251,7 @@ mod tests { }; let result = platform - .query_keys_v0(request, version) + .query_keys_v0(request, &state, version) .expect("expected query to succeed"); assert!(matches!( @@ -260,7 +262,7 @@ mod tests { #[test] fn test_missing_request_type() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let request = GetIdentityKeysRequestV0 { identity_id: vec![0; 32], @@ -271,7 +273,7 @@ mod tests { }; let result = platform - .query_keys_v0(request, version) + .query_keys_v0(request, &state, version) .expect("expected query to succeed"); assert!(matches!( @@ -282,7 +284,7 @@ mod tests { #[test] fn test_missing_request() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let request = GetIdentityKeysRequestV0 { identity_id: vec![0; 32], @@ -293,7 +295,7 @@ mod tests { }; let result = platform - .query_keys_v0(request, version) + .query_keys_v0(request, &state, version) .expect("expected query to succeed"); assert!(matches!( @@ -304,7 +306,7 @@ mod tests { #[test] fn test_invalid_key_request_type() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let request = GetIdentityKeysRequestV0 { identity_id: vec![0; 32], @@ -326,7 +328,7 @@ mod tests { }; let result = platform - .query_keys_v0(request, version) + .query_keys_v0(request, &state, version) .expect("expected query to succeed"); assert!(matches!( @@ -337,7 +339,7 @@ mod tests { #[test] fn test_absent_keys() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let request = GetIdentityKeysRequestV0 { identity_id: vec![0; 32], @@ -350,7 +352,7 @@ mod tests { }; let result = platform - .query_keys_v0(request, version) + .query_keys_v0(request, &state, version) .expect("expected query to succeed"); assert!(matches!( @@ -364,7 +366,7 @@ mod tests { #[test] fn test_absent_keys_proof() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let request = GetIdentityKeysRequestV0 { identity_id: vec![0; 32], @@ -377,7 +379,7 @@ mod tests { }; let result = platform - .query_keys_v0(request, version) + .query_keys_v0(request, &state, version) .expect("expected query to succeed"); assert!(matches!( diff --git a/packages/rs-drive-abci/src/query/mod.rs b/packages/rs-drive-abci/src/query/mod.rs index 9e384a8503..233707a3de 100644 --- a/packages/rs-drive-abci/src/query/mod.rs +++ b/packages/rs-drive-abci/src/query/mod.rs @@ -19,6 +19,7 @@ pub type QueryValidationResult = ValidationResult; mod tests { use crate::error::query::QueryError; use crate::platform_types::platform::Platform; + use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use crate::rpc::core::MockCoreRPCLike; use crate::test::helpers::setup::{TempPlatform, TestPlatformBuilder}; @@ -28,20 +29,24 @@ mod tests { use drive::drive::batch::DriveOperation::DataContractOperation; use platform_version::version::PlatformVersion; use std::borrow::Cow; + use std::sync::Arc; - pub fn setup_platform<'a>() -> (TempPlatform, &'a PlatformVersion) { + pub fn setup_platform<'a>() -> ( + TempPlatform, + Arc, + &'a PlatformVersion, + ) { let platform = TestPlatformBuilder::new() .build_with_mock_rpc() .set_initial_state_structure(); - let platform_version = platform - .platform - .state - .read() - .current_platform_version() - .unwrap(); + // We can't return a reference to Arc (`load` method) so we clone Arc (`load_full`). + // This is a bit slower but we don't care since we are in test environment + let platform_state = platform.platform.state.load_full(); + + let platform_version = platform_state.current_platform_version().unwrap(); - (platform, platform_version) + (platform, platform_state, platform_version) } pub fn store_data_contract( diff --git a/packages/rs-drive-abci/src/query/proofs/mod.rs b/packages/rs-drive-abci/src/query/proofs/mod.rs index 9ced568d3d..6921e014d5 100644 --- a/packages/rs-drive-abci/src/query/proofs/mod.rs +++ b/packages/rs-drive-abci/src/query/proofs/mod.rs @@ -1,6 +1,7 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_proofs_request::Version as RequestVersion; use dapi_grpc::platform::v0::get_proofs_response::Version as ResponseVersion; @@ -14,6 +15,7 @@ impl Platform { pub fn query_proofs( &self, GetProofsRequest { version }: GetProofsRequest, + platform_state: &PlatformState, platform_version: &PlatformVersion, ) -> Result, Error> { let Some(version) = version else { @@ -40,7 +42,7 @@ impl Platform { } match version { RequestVersion::V0(request_v0) => { - let result = self.query_proofs_v0(request_v0, platform_version)?; + let result = self.query_proofs_v0(request_v0, platform_state, platform_version)?; Ok(result.map(|response_v0| GetProofsResponse { version: Some(ResponseVersion::V0(response_v0)), diff --git a/packages/rs-drive-abci/src/query/proofs/v0/mod.rs b/packages/rs-drive-abci/src/query/proofs/v0/mod.rs index 55c31c6ae8..c1e15fe44b 100644 --- a/packages/rs-drive-abci/src/query/proofs/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/proofs/v0/mod.rs @@ -1,6 +1,7 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_proofs_request::GetProofsRequestV0; use dapi_grpc::platform::v0::get_proofs_response::{get_proofs_response_v0, GetProofsResponseV0}; @@ -20,6 +21,7 @@ impl Platform { contracts, documents, }: GetProofsRequestV0, + platform_state: &PlatformState, platform_version: &PlatformVersion, ) -> Result, Error> { let contract_ids = check_validation_result_with_data!(contracts @@ -96,11 +98,11 @@ impl Platform { platform_version, )?; - let (metadata, proof) = self.response_metadata_and_proof_v0(proof); - let response = GetProofsResponseV0 { - result: Some(get_proofs_response_v0::Result::Proof(proof)), - metadata: Some(metadata), + result: Some(get_proofs_response_v0::Result::Proof( + self.response_proof_v0(platform_state, proof), + )), + metadata: Some(self.response_metadata_v0(platform_state)), }; Ok(QueryValidationResult::new_with_data(response)) @@ -117,7 +119,7 @@ mod tests { #[test] fn test_invalid_identity_ids() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let request = GetProofsRequestV0 { identities: vec![IdentityRequest { @@ -129,7 +131,7 @@ mod tests { }; let result = platform - .query_proofs_v0(request, version) + .query_proofs_v0(request, &state, version) .expect("expected query to succeed"); assert_invalid_identifier(result); @@ -137,7 +139,7 @@ mod tests { #[test] fn test_invalid_identity_prove_request_type() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let request_type = 10; @@ -151,7 +153,7 @@ mod tests { }; let result = platform - .query_proofs_v0(request, version) + .query_proofs_v0(request, &state, version) .expect("expected query to succeed"); assert!(matches!( @@ -165,7 +167,7 @@ mod tests { #[test] fn test_invalid_contract_ids() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let request = GetProofsRequestV0 { identities: vec![], @@ -176,7 +178,7 @@ mod tests { }; let result = platform - .query_proofs_v0(request, version) + .query_proofs_v0(request, &state, version) .expect("expected query to succeed"); assert_invalid_identifier(result); @@ -184,7 +186,7 @@ mod tests { #[test] fn test_invalid_contract_id_for_documents_proof() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let request = GetProofsRequestV0 { identities: vec![], @@ -198,7 +200,7 @@ mod tests { }; let result = platform - .query_proofs_v0(request, version) + .query_proofs_v0(request, &state, version) .expect("expected query to succeed"); assert_invalid_identifier(result); @@ -206,7 +208,7 @@ mod tests { #[test] fn test_invalid_document_id() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let request = GetProofsRequestV0 { identities: vec![], @@ -220,7 +222,7 @@ mod tests { }; let result = platform - .query_proofs_v0(request, version) + .query_proofs_v0(request, &state, version) .expect("expected query to succeed"); assert_invalid_identifier(result); @@ -228,7 +230,7 @@ mod tests { #[test] fn test_proof_of_absence() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let request = GetProofsRequestV0 { identities: vec![], @@ -242,7 +244,7 @@ mod tests { }; let validation_result = platform - .query_proofs_v0(request, version) + .query_proofs_v0(request, &state, version) .expect("expected query to succeed"); assert!(matches!(validation_result.data, Some(GetProofsResponseV0 { diff --git a/packages/rs-drive-abci/src/query/response_metadata/mod.rs b/packages/rs-drive-abci/src/query/response_metadata/mod.rs index 8e784fecaf..8efee43e90 100644 --- a/packages/rs-drive-abci/src/query/response_metadata/mod.rs +++ b/packages/rs-drive-abci/src/query/response_metadata/mod.rs @@ -4,6 +4,7 @@ use crate::error::execution::ExecutionError; use crate::error::Error; use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; use dapi_grpc::platform::v0::ResponseMetadata; use dpp::version::PlatformVersion; @@ -13,10 +14,11 @@ impl Platform { #[allow(deprecated)] pub(in crate::query) fn response_metadata( &self, + platform_state: &PlatformState, platform_version: &PlatformVersion, ) -> Result { match platform_version.drive_abci.query.response_metadata { - 0 => Ok(self.response_metadata_v0()), + 0 => Ok(self.response_metadata_v0(platform_state)), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "response_metadata".to_string(), known_versions: vec![0], diff --git a/packages/rs-drive-abci/src/query/response_metadata/v0/mod.rs b/packages/rs-drive-abci/src/query/response_metadata/v0/mod.rs index 053b02c192..461220a739 100644 --- a/packages/rs-drive-abci/src/query/response_metadata/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/response_metadata/v0/mod.rs @@ -1,45 +1,37 @@ use crate::platform_types::platform::Platform; use crate::platform_types::platform_state::v0::PlatformStateV0Methods; +use crate::platform_types::platform_state::PlatformState; use dapi_grpc::platform::v0::{Proof, ResponseMetadata}; impl Platform { - pub(in crate::query) fn response_metadata_v0(&self) -> ResponseMetadata { - let state = self.state.read(); - + pub(in crate::query) fn response_metadata_v0( + &self, + platform_state: &PlatformState, + ) -> ResponseMetadata { ResponseMetadata { - height: state.last_committed_height(), - core_chain_locked_height: state.last_committed_core_height(), - epoch: state.last_committed_block_epoch().index as u32, - time_ms: state.last_committed_block_time_ms().unwrap_or_default(), + height: platform_state.last_committed_height(), + core_chain_locked_height: platform_state.last_committed_core_height(), + epoch: platform_state.last_committed_block_epoch().index as u32, + time_ms: platform_state + .last_committed_block_time_ms() + .unwrap_or_default(), chain_id: self.config.abci.chain_id.clone(), - protocol_version: state.current_protocol_version_in_consensus(), + protocol_version: platform_state.current_protocol_version_in_consensus(), } } - pub(in crate::query) fn response_metadata_and_proof_v0( + pub(in crate::query) fn response_proof_v0( &self, + platform_state: &PlatformState, proof: Vec, - ) -> (ResponseMetadata, Proof) { - let state = self.state.read(); - - let metadata = ResponseMetadata { - height: state.last_committed_height(), - core_chain_locked_height: state.last_committed_core_height(), - epoch: state.last_committed_block_epoch().index as u32, - time_ms: state.last_committed_block_time_ms().unwrap_or_default(), - chain_id: self.config.abci.chain_id.clone(), - protocol_version: state.current_protocol_version_in_consensus(), - }; - - let proof = Proof { + ) -> Proof { + Proof { grovedb_proof: proof, - quorum_hash: state.last_committed_quorum_hash().to_vec(), + quorum_hash: platform_state.last_committed_quorum_hash().to_vec(), quorum_type: self.config.validator_set_quorum_type() as u32, - block_id_hash: state.last_committed_block_id_hash().to_vec(), - signature: state.last_committed_block_signature().to_vec(), - round: state.last_committed_block_round(), - }; - - (metadata, proof) + block_id_hash: platform_state.last_committed_block_id_hash().to_vec(), + signature: platform_state.last_committed_block_signature().to_vec(), + round: platform_state.last_committed_block_round(), + } } } diff --git a/packages/rs-drive-abci/src/query/service.rs b/packages/rs-drive-abci/src/query/service.rs index de4db1c118..5d73e3bd33 100644 --- a/packages/rs-drive-abci/src/query/service.rs +++ b/packages/rs-drive-abci/src/query/service.rs @@ -1,6 +1,7 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use crate::rpc::core::DefaultCoreRPC; use crate::utils::spawn_blocking_task_with_name_if_supported; @@ -25,7 +26,6 @@ use dapi_grpc::platform::v0::{ }; use dapi_grpc::tonic::{Request, Response, Status}; use dpp::version::PlatformVersion; -use dpp::version::PlatformVersionCurrentVersion; use std::sync::Arc; use tracing::Instrument; @@ -34,8 +34,12 @@ pub struct QueryService { platform: Arc>, } -type QueryMethod = - fn(&Platform, RQ, &PlatformVersion) -> Result, Error>; +type QueryMethod = fn( + &Platform, + RQ, + &PlatformState, + &PlatformVersion, +) -> Result, Error>; impl QueryService { /// Creates new QueryService @@ -56,12 +60,19 @@ impl QueryService { let platform = Arc::clone(&self.platform); spawn_blocking_task_with_name_if_supported("query", move || { - let Some(platform_version) = PlatformVersion::get_maybe_current() else { - return Err(Status::unavailable("platform is not initialized")); - }; - - let mut result = query_method(&platform, request.into_inner(), platform_version) - .map_err(error_into_status)?; + let platform_state = platform.state.load(); + + let platform_version = platform_state + .current_platform_version() + .map_err(|e| Status::unavailable("platform is not initialized"))?; + + let mut result = query_method( + &platform, + request.into_inner(), + &platform_state, + platform_version, + ) + .map_err(error_into_status)?; if result.is_valid() { let response = result diff --git a/packages/rs-drive-abci/src/query/system/epoch_infos/mod.rs b/packages/rs-drive-abci/src/query/system/epoch_infos/mod.rs index 8872a9d8e8..bf3fc6497d 100644 --- a/packages/rs-drive-abci/src/query/system/epoch_infos/mod.rs +++ b/packages/rs-drive-abci/src/query/system/epoch_infos/mod.rs @@ -3,6 +3,7 @@ mod v0; use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_epochs_info_request::Version as RequestVersion; use dapi_grpc::platform::v0::get_epochs_info_response::Version as ResponseVersion; @@ -14,6 +15,7 @@ impl Platform { pub fn query_epoch_infos( &self, GetEpochsInfoRequest { version }: GetEpochsInfoRequest, + platform_state: &PlatformState, platform_version: &PlatformVersion, ) -> Result, Error> { let Some(version) = version else { @@ -40,7 +42,8 @@ impl Platform { } match version { RequestVersion::V0(request_v0) => { - let result = self.query_epoch_infos_v0(request_v0, platform_version)?; + let result = + self.query_epoch_infos_v0(request_v0, platform_state, platform_version)?; Ok(result.map(|response_v0| GetEpochsInfoResponse { version: Some(ResponseVersion::V0(response_v0)), diff --git a/packages/rs-drive-abci/src/query/system/epoch_infos/v0/mod.rs b/packages/rs-drive-abci/src/query/system/epoch_infos/v0/mod.rs index c75833b8b4..8b9b04d855 100644 --- a/packages/rs-drive-abci/src/query/system/epoch_infos/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/system/epoch_infos/v0/mod.rs @@ -8,10 +8,10 @@ use dapi_grpc::platform::v0::get_epochs_info_response::get_epochs_info_response_ use dapi_grpc::platform::v0::get_epochs_info_response::{ get_epochs_info_response_v0, GetEpochsInfoResponseV0, }; -use dapi_grpc::platform::v0::{Proof, ResponseMetadata}; use dpp::block::extended_epoch_info::v0::ExtendedEpochInfoV0Getters; use dpp::check_validation_result_with_data; +use crate::platform_types::platform_state::PlatformState; use dpp::validation::ValidationResult; use dpp::version::PlatformVersion; @@ -24,15 +24,14 @@ impl Platform { ascending, prove, }: GetEpochsInfoRequestV0, + platform_state: &PlatformState, platform_version: &PlatformVersion, ) -> Result, Error> { - let state = self.state.read(); - let start_epoch = start_epoch.unwrap_or_else(|| { if ascending { 0 } else { - state.last_committed_block_epoch_ref().index as u32 + platform_state.last_committed_block_epoch_ref().index as u32 } }); @@ -51,43 +50,22 @@ impl Platform { )); } - let metadata = ResponseMetadata { - height: state.last_committed_height(), - core_chain_locked_height: state.last_committed_core_height(), - epoch: state.last_committed_block_epoch().index as u32, - time_ms: state.last_committed_block_time_ms().unwrap_or_default(), - chain_id: self.config.abci.chain_id.clone(), - protocol_version: state.current_protocol_version_in_consensus(), - }; - let response = if prove { - let mut proof_response = Proof { - grovedb_proof: Vec::new(), - quorum_hash: state.last_committed_quorum_hash().to_vec(), - quorum_type: self.config.validator_set_quorum_type() as u32, - block_id_hash: state.last_committed_block_id_hash().to_vec(), - signature: state.last_committed_block_signature().to_vec(), - round: state.last_committed_block_round(), - }; - - drop(state); - - proof_response.grovedb_proof = - check_validation_result_with_data!(self.drive.prove_epochs_infos( - start_epoch as u16, - count as u16, - ascending, - None, - platform_version - )); + let proof = check_validation_result_with_data!(self.drive.prove_epochs_infos( + start_epoch as u16, + count as u16, + ascending, + None, + platform_version + )); GetEpochsInfoResponseV0 { - result: Some(get_epochs_info_response_v0::Result::Proof(proof_response)), - metadata: Some(metadata), + result: Some(get_epochs_info_response_v0::Result::Proof( + self.response_proof_v0(platform_state, proof), + )), + metadata: Some(self.response_metadata_v0(platform_state)), } } else { - drop(state); - let result = check_validation_result_with_data!(self.drive.get_epochs_infos( start_epoch as u16, count as u16, @@ -111,7 +89,7 @@ impl Platform { result: Some(get_epochs_info_response_v0::Result::Epochs(EpochInfos { epoch_infos, })), - metadata: Some(metadata), + metadata: Some(self.response_metadata_v0(platform_state)), } }; @@ -126,7 +104,7 @@ mod tests { #[test] fn test_query_empty_epoch_infos() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let request = GetEpochsInfoRequestV0 { start_epoch: None, // 0 @@ -136,7 +114,7 @@ mod tests { }; let result = platform - .query_epoch_infos_v0(request, version) + .query_epoch_infos_v0(request, &state, version) .expect("expected query to succeed"); assert!(matches!( @@ -150,7 +128,7 @@ mod tests { #[test] fn test_query_empty_epoch_infos_descending() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let request = GetEpochsInfoRequestV0 { start_epoch: None, // 0 @@ -160,7 +138,7 @@ mod tests { }; let validation_result = platform - .query_epoch_infos_v0(request, version) + .query_epoch_infos_v0(request, &state, version) .expect("expected query to succeed"); assert!(matches!( diff --git a/packages/rs-drive-abci/src/query/system/version_upgrade_state/mod.rs b/packages/rs-drive-abci/src/query/system/version_upgrade_state/mod.rs index da629c34fd..d5d9e90105 100644 --- a/packages/rs-drive-abci/src/query/system/version_upgrade_state/mod.rs +++ b/packages/rs-drive-abci/src/query/system/version_upgrade_state/mod.rs @@ -3,6 +3,7 @@ mod v0; use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_protocol_version_upgrade_state_request::Version as RequestVersion; use dapi_grpc::platform::v0::get_protocol_version_upgrade_state_response::Version as ResponseVersion; @@ -16,6 +17,7 @@ impl Platform { pub fn query_version_upgrade_state( &self, GetProtocolVersionUpgradeStateRequest { version }: GetProtocolVersionUpgradeStateRequest, + platform_state: &PlatformState, platform_version: &PlatformVersion, ) -> Result, Error> { let Some(version) = version else { @@ -46,7 +48,11 @@ impl Platform { } match version { RequestVersion::V0(request_v0) => { - let result = self.query_version_upgrade_state_v0(request_v0, platform_version)?; + let result = self.query_version_upgrade_state_v0( + request_v0, + platform_state, + platform_version, + )?; Ok( result.map(|response_v0| GetProtocolVersionUpgradeStateResponse { diff --git a/packages/rs-drive-abci/src/query/system/version_upgrade_state/v0/mod.rs b/packages/rs-drive-abci/src/query/system/version_upgrade_state/v0/mod.rs index 5359cf28b8..6736a589a3 100644 --- a/packages/rs-drive-abci/src/query/system/version_upgrade_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/system/version_upgrade_state/v0/mod.rs @@ -8,11 +8,13 @@ use dpp::version::PlatformVersion; use dapi_grpc::platform::v0::get_protocol_version_upgrade_state_request::GetProtocolVersionUpgradeStateRequestV0; use dapi_grpc::platform::v0::get_protocol_version_upgrade_state_response::get_protocol_version_upgrade_state_response_v0::{VersionEntry, Versions}; use dapi_grpc::platform::v0::get_protocol_version_upgrade_state_response::{get_protocol_version_upgrade_state_response_v0, GetProtocolVersionUpgradeStateResponseV0}; +use crate::platform_types::platform_state::PlatformState; impl Platform { pub(super) fn query_version_upgrade_state_v0( &self, GetProtocolVersionUpgradeStateRequestV0 { prove }: GetProtocolVersionUpgradeStateRequestV0, + platform_state: &PlatformState, platform_version: &PlatformVersion, ) -> Result, Error> { let response = if prove { @@ -20,11 +22,13 @@ impl Platform { .drive .fetch_proved_versions_with_counter(None, &platform_version.drive)); - let (metadata, proof) = self.response_metadata_and_proof_v0(proof); - GetProtocolVersionUpgradeStateResponseV0 { - result: Some(get_protocol_version_upgrade_state_response_v0::Result::Proof(proof)), - metadata: Some(metadata), + result: Some( + get_protocol_version_upgrade_state_response_v0::Result::Proof( + self.response_proof_v0(platform_state, proof), + ), + ), + metadata: Some(self.response_metadata_v0(platform_state)), } } else { let protocol_versions_counter = self.drive.cache.protocol_versions_counter.read(); @@ -46,7 +50,7 @@ impl Platform { versions, }), ), - metadata: Some(self.response_metadata_v0()), + metadata: Some(self.response_metadata_v0(platform_state)), } }; @@ -73,12 +77,12 @@ mod tests { #[test] fn test_query_empty_upgrade_state() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let request = GetProtocolVersionUpgradeStateRequestV0 { prove: false }; let validation_result = platform - .query_version_upgrade_state_v0(request, version) + .query_version_upgrade_state_v0(request, &state, version) .expect("expected query to succeed"); assert!(matches!( @@ -92,7 +96,7 @@ mod tests { #[test] fn test_query_upgrade_state() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let mut rand = StdRng::seed_from_u64(10); @@ -168,7 +172,7 @@ mod tests { let request = GetProtocolVersionUpgradeStateRequestV0 { prove: false }; let validation_result = platform - .query_version_upgrade_state_v0(request, version) + .query_version_upgrade_state_v0(request, &state, version) .expect("expected query to succeed"); assert!(matches!( @@ -182,12 +186,12 @@ mod tests { #[test] fn test_prove_empty_upgrade_state() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let request = GetProtocolVersionUpgradeStateRequestV0 { prove: true }; let validation_result = platform - .query_version_upgrade_state_v0(request, version) + .query_version_upgrade_state_v0(request, &state, version) .expect("expected query to succeed"); let path_query = PathQuery::new_unsized( @@ -214,7 +218,7 @@ mod tests { #[test] fn test_prove_upgrade_state() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let mut rand = StdRng::seed_from_u64(10); @@ -289,7 +293,7 @@ mod tests { let request = GetProtocolVersionUpgradeStateRequestV0 { prove: true }; let validation_result = platform - .query_version_upgrade_state_v0(request, version) + .query_version_upgrade_state_v0(request, &state, version) .expect("expected query to succeed"); let Some(GetProtocolVersionUpgradeStateResponseV0 { diff --git a/packages/rs-drive-abci/src/query/system/version_upgrade_vote_status/mod.rs b/packages/rs-drive-abci/src/query/system/version_upgrade_vote_status/mod.rs index 96816cee56..b99caf6f49 100644 --- a/packages/rs-drive-abci/src/query/system/version_upgrade_vote_status/mod.rs +++ b/packages/rs-drive-abci/src/query/system/version_upgrade_vote_status/mod.rs @@ -3,6 +3,7 @@ mod v0; use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_protocol_version_upgrade_vote_status_request::Version as RequestVersion; use dapi_grpc::platform::v0::get_protocol_version_upgrade_vote_status_response::Version as ResponseVersion; @@ -16,6 +17,7 @@ impl Platform { pub fn query_version_upgrade_vote_status( &self, GetProtocolVersionUpgradeVoteStatusRequest { version } : GetProtocolVersionUpgradeVoteStatusRequest, + platform_state: &PlatformState, platform_version: &PlatformVersion, ) -> Result, Error> { let Some(version) = version else { @@ -46,8 +48,11 @@ impl Platform { } match version { RequestVersion::V0(request_v0) => { - let result = - self.query_version_upgrade_vote_status_v0(request_v0, platform_version)?; + let result = self.query_version_upgrade_vote_status_v0( + request_v0, + platform_state, + platform_version, + )?; Ok( result.map(|response_v0| GetProtocolVersionUpgradeVoteStatusResponse { diff --git a/packages/rs-drive-abci/src/query/system/version_upgrade_vote_status/v0/mod.rs b/packages/rs-drive-abci/src/query/system/version_upgrade_vote_status/v0/mod.rs index 38e99f2d1e..52dd78ef9e 100644 --- a/packages/rs-drive-abci/src/query/system/version_upgrade_vote_status/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/system/version_upgrade_vote_status/v0/mod.rs @@ -9,6 +9,7 @@ use dapi_grpc::platform::v0::get_protocol_version_upgrade_vote_status_request::G use dapi_grpc::platform::v0::get_protocol_version_upgrade_vote_status_response::get_protocol_version_upgrade_vote_status_response_v0::{VersionSignal, VersionSignals}; use dapi_grpc::platform::v0::get_protocol_version_upgrade_vote_status_response::{get_protocol_version_upgrade_vote_status_response_v0, GetProtocolVersionUpgradeVoteStatusResponseV0}; use crate::error::query::QueryError; +use crate::platform_types::platform_state::PlatformState; impl Platform { pub(super) fn query_version_upgrade_vote_status_v0( @@ -18,6 +19,7 @@ impl Platform { count, prove, }: GetProtocolVersionUpgradeVoteStatusRequestV0, + platform_state: &PlatformState, platform_version: &PlatformVersion, ) -> Result, Error> { let start_pro_tx_hash: Option<[u8; 32]> = if start_pro_tx_hash.is_empty() { @@ -52,13 +54,13 @@ impl Platform { &platform_version.drive )); - let (metadata, proof) = self.response_metadata_and_proof_v0(proof); - GetProtocolVersionUpgradeVoteStatusResponseV0 { result: Some( - get_protocol_version_upgrade_vote_status_response_v0::Result::Proof(proof), + get_protocol_version_upgrade_vote_status_response_v0::Result::Proof( + self.response_proof_v0(platform_state, proof), + ), ), - metadata: Some(metadata), + metadata: Some(self.response_metadata_v0(platform_state)), } } else { let result = @@ -84,7 +86,7 @@ impl Platform { }, ), ), - metadata: Some(self.response_metadata_v0()), + metadata: Some(self.response_metadata_v0(platform_state)), } }; @@ -111,7 +113,7 @@ mod tests { #[test] fn test_query_empty_upgrade_vote_status() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let mut rand = StdRng::seed_from_u64(10); @@ -124,7 +126,7 @@ mod tests { }; let validation_result = platform - .query_version_upgrade_vote_status_v0(request, version) + .query_version_upgrade_vote_status_v0(request, &state, version) .expect("expected query to succeed"); assert!(matches!(validation_result.data, Some( @@ -137,7 +139,7 @@ mod tests { #[test] fn test_query_upgrade_vote_status() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let mut rand = StdRng::seed_from_u64(10); @@ -215,7 +217,7 @@ mod tests { }; let validation_result = platform - .query_version_upgrade_vote_status_v0(request, version) + .query_version_upgrade_vote_status_v0(request, &state, version) .expect("expected query to succeed"); assert!(matches!(validation_result.data, Some( @@ -228,7 +230,7 @@ mod tests { #[test] fn test_prove_empty_upgrade_vote_status() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let mut rand = StdRng::seed_from_u64(10); @@ -241,7 +243,7 @@ mod tests { }; let validation_result = platform - .query_version_upgrade_vote_status_v0(request, version) + .query_version_upgrade_vote_status_v0(request, &state, version) .expect("expected query to succeed"); let Some(GetProtocolVersionUpgradeVoteStatusResponseV0 { @@ -272,7 +274,7 @@ mod tests { #[test] fn test_prove_upgrade_vote_status() { - let (platform, version) = setup_platform(); + let (platform, state, version) = setup_platform(); let mut rand = StdRng::seed_from_u64(10); @@ -351,7 +353,7 @@ mod tests { }; let validation_result = platform - .query_version_upgrade_vote_status_v0(request, version) + .query_version_upgrade_vote_status_v0(request, &state, version) .expect("expected query to succeed"); let Some(GetProtocolVersionUpgradeVoteStatusResponseV0 { diff --git a/packages/rs-drive-abci/src/test/helpers/setup.rs b/packages/rs-drive-abci/src/test/helpers/setup.rs index afae260d6c..19632be9de 100644 --- a/packages/rs-drive-abci/src/test/helpers/setup.rs +++ b/packages/rs-drive-abci/src/test/helpers/setup.rs @@ -110,7 +110,7 @@ impl TempPlatform { None, self.platform .state - .read() + .load() .current_platform_version() .expect("expected to get current platform version"), ) diff --git a/packages/rs-drive-abci/tests/strategy_tests/core_update_tests.rs b/packages/rs-drive-abci/tests/strategy_tests/core_update_tests.rs index 7c9e528eeb..49405ee099 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/core_update_tests.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/core_update_tests.rs @@ -83,7 +83,7 @@ mod tests { // we expect to see quorums with banned members - let state = outcome.abci_app.platform.state.read(); + let state = outcome.abci_app.platform.state.load(); let banned_count = state .validator_sets() @@ -183,7 +183,7 @@ mod tests { // we expect to see quorums with banned members - let _state = outcome.abci_app.platform.state.read(); + let _state = outcome.abci_app.platform.state.load(); // We should also see validator sets with less than the quorum size diff --git a/packages/rs-drive-abci/tests/strategy_tests/execution.rs b/packages/rs-drive-abci/tests/strategy_tests/execution.rs index 814bb6f896..cb24972491 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/execution.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/execution.rs @@ -757,7 +757,7 @@ pub(crate) fn start_chain_for_strategy( current_quorum_hash = abci_application .platform .state - .read() + .load() .current_validator_set_quorum_hash(); continue_chain_for_strategy( @@ -838,7 +838,7 @@ pub(crate) fn continue_chain_for_strategy( let mut state_transition_results_per_block = BTreeMap::new(); for block_height in block_start..(block_start + block_count) { - let state = platform.state.read(); + let state = platform.state.load(); let epoch_info = EpochInfoV0::calculate( first_block_time, current_time_ms, @@ -974,7 +974,7 @@ pub(crate) fn continue_chain_for_strategy( continue; } - let platform_state = platform.state.read(); + let platform_state = platform.state.load(); let platform_version = platform_state.current_platform_version().unwrap(); @@ -1063,7 +1063,7 @@ pub(crate) fn continue_chain_for_strategy( } else { platform .state - .read() + .load() .last_committed_block_info() .as_ref() .unwrap() diff --git a/packages/rs-drive-abci/tests/strategy_tests/failures.rs b/packages/rs-drive-abci/tests/strategy_tests/failures.rs index 7c7c68e24a..c01c8be759 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/failures.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/failures.rs @@ -264,7 +264,7 @@ mod tests { .drive .cache .system_data_contracts - .read_dpns() + .load_dpns() .clone(); let dpns_contract_for_type = dpns_contract.clone(); @@ -274,7 +274,7 @@ mod tests { .expect("expected a profile document type"); let document_op_1 = DocumentOp { - contract: dpns_contract.clone(), + contract: dpns_contract.as_ref().clone(), action: DocumentAction::DocumentActionInsertSpecific( BTreeMap::from([ ("label".into(), "simon1".into()), @@ -297,7 +297,7 @@ mod tests { }; let document_op_2 = DocumentOp { - contract: dpns_contract, + contract: dpns_contract.as_ref().clone(), action: DocumentAction::DocumentActionInsertSpecific( BTreeMap::from([ ("label".into(), "simon1".into()), diff --git a/packages/rs-drive-abci/tests/strategy_tests/main.rs b/packages/rs-drive-abci/tests/strategy_tests/main.rs index 79616b2f2b..bc24b6ec30 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/main.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/main.rs @@ -299,10 +299,10 @@ mod tests { .unwrap() .expect("expected root hash"); - let state = abci_app.platform.state.read(); + let state = abci_app.platform.state.load(); let protocol_version = state.current_protocol_version_in_consensus(); - drop(state); + let platform_version = PlatformVersion::get(protocol_version).expect("expected platform version"); @@ -329,10 +329,9 @@ mod tests { assert_eq!(last_block_height, 15); assert_eq!(last_block_app_hash, known_root_hash); - let block_start = abci_app - .platform - .state - .read() + let state = abci_app.platform.state.load(); + + let block_start = state .last_committed_block_info() .as_ref() .unwrap() @@ -434,10 +433,10 @@ mod tests { .unwrap() .expect("expected root hash"); - let state = abci_app.platform.state.read(); + let state = abci_app.platform.state.load(); let protocol_version = state.current_protocol_version_in_consensus(); - drop(state); + let platform_version = PlatformVersion::get(protocol_version).expect("expected platform version"); @@ -464,10 +463,9 @@ mod tests { assert_eq!(last_block_height, 15); assert_eq!(last_block_app_hash, known_root_hash); - let block_start = abci_app - .platform - .state - .read() + let state = abci_app.platform.state.load(); + + let block_start = state .last_committed_block_info() .as_ref() .unwrap() @@ -790,10 +788,10 @@ mod tests { .fetch_versions_with_counter(None, &platform_version.drive) .expect("expected to get versions"); + let state = abci_app.platform.state.load(); + assert_eq!( - platform - .state - .read() + state .last_committed_block_info() .as_ref() .unwrap() @@ -865,7 +863,7 @@ mod tests { // can expect it to be much higher. let platform = abci_app.platform; - let platform_state = platform.state.read(); + let platform_state = platform.state.load(); assert!(platform_state.hpmn_masternode_list().len() > 100); } @@ -933,7 +931,7 @@ mod tests { // With these params if we add new mns the hpmn masternode list would be randomly different than 100. let platform = abci_app.platform; - let platform_state = platform.state.read(); + let platform_state = platform.state.load(); assert_ne!(platform_state.hpmn_masternode_list().len(), 100); } @@ -1001,7 +999,7 @@ mod tests { let platform_version = PlatformVersion::latest(); let platform = abci_app.platform; - let _platform_state = platform.state.read(); + let _platform_state = platform.state.load(); // We need to find if any masternode has ever had their keys disabled. @@ -2429,7 +2427,7 @@ mod tests { .build_with_mock_rpc(); let outcome = run_chain_for_strategy(&mut platform, 10, strategy, config, 15); - let state = outcome.abci_app.platform.state.read(); + let state = outcome.abci_app.platform.state.load(); let protocol_version = state.current_protocol_version_in_consensus(); let platform_version = PlatformVersion::get(protocol_version).unwrap(); @@ -3591,9 +3589,9 @@ mod tests { .. } = run_chain_for_strategy(&mut platform, 100, strategy.clone(), config.clone(), 89); - let state = abci_app.platform.state.read(); + let state = abci_app.platform.state.load(); let protocol_version = state.current_protocol_version_in_consensus(); - drop(state); + let platform_version = PlatformVersion::get(protocol_version).unwrap(); let known_root_hash = abci_app @@ -3627,10 +3625,9 @@ mod tests { assert_eq!(last_block_height, 100); assert_eq!(last_block_app_hash, known_root_hash); - let block_start = abci_app - .platform - .state - .read() + let state = abci_app.platform.state.load(); + + let block_start = state .last_committed_block_info() .as_ref() .unwrap() diff --git a/packages/rs-drive-abci/tests/strategy_tests/query.rs b/packages/rs-drive-abci/tests/strategy_tests/query.rs index a89178dfd6..77faf51a20 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/query.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/query.rs @@ -202,6 +202,8 @@ impl QueryStrategy { ) { let events = frequency.events_if_hit(rng); + let platform_state = abci_app.platform.state.load(); + for _i in 0..events { let identity_count = rng.gen_range(1..10); let chosen_identities = current_identities.choose_multiple(rng, identity_count); @@ -242,7 +244,7 @@ impl QueryStrategy { }; let query_validation_result = abci_app .platform - .query_identities_by_public_key_hashes(request, platform_version) + .query_identities_by_public_key_hashes(request, &platform_state, platform_version) .expect("expected to run query"); assert!( @@ -429,19 +431,17 @@ mod tests { })), }; - let platform_state = outcome.abci_app.platform.state.read(); + let platform_state = outcome.abci_app.platform.state.load(); let protocol_version = platform_state.current_protocol_version_in_consensus(); - drop(platform_state); - let platform_version = PlatformVersion::get(protocol_version) .expect("expected to get current platform version"); let validation_result = outcome .abci_app .platform - .query_epoch_infos(request, platform_version) + .query_epoch_infos(request, &platform_state, platform_version) .expect("expected query to succeed"); let response = validation_result.into_data().expect("expected data"); @@ -531,19 +531,17 @@ mod tests { })), }; - let platform_state = outcome.abci_app.platform.state.read(); + let platform_state = outcome.abci_app.platform.state.load(); let protocol_version = platform_state.current_protocol_version_in_consensus(); - drop(platform_state); - let platform_version = PlatformVersion::get(protocol_version) .expect("expected to get current platform version"); let validation_result = outcome .abci_app .platform - .query_epoch_infos(request, platform_version) + .query_epoch_infos(request, &platform_state, platform_version) .expect("expected query to succeed"); let response = validation_result.into_data().expect("expected data"); @@ -634,21 +632,19 @@ mod tests { })), }; - let platform_state = outcome.abci_app.platform.state.read(); + let platform_state = outcome.abci_app.platform.state.load(); let protocol_version = platform_state.current_protocol_version_in_consensus(); let current_epoch = platform_state.last_committed_block_epoch_ref().index; - drop(platform_state); - let platform_version = PlatformVersion::get(protocol_version) .expect("expected to get current platform version"); let validation_result = outcome .abci_app .platform - .query_epoch_infos(request, platform_version) + .query_epoch_infos(request, &platform_state, platform_version) .expect("expected query to succeed"); let response = validation_result.data.expect("expected data"); @@ -694,7 +690,7 @@ mod tests { let validation_result = outcome .abci_app .platform - .query_epoch_infos(request, platform_version) + .query_epoch_infos(request, &platform_state, platform_version) .expect("expected query to succeed"); let response = validation_result.data.expect("expected data"); diff --git a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs index 9de626aab8..b223aa3552 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs @@ -1034,7 +1034,7 @@ impl NetworkStrategy { rng: &mut StdRng, ) -> (Vec, Vec) { let mut finalize_block_operations = vec![]; - let platform_state = platform.state.read(); + let platform_state = platform.state.load(); let platform_version = platform_state .current_platform_version() .expect("expected platform version"); diff --git a/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs b/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs index ba02a87eed..894da37975 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs @@ -110,8 +110,11 @@ mod tests { config.clone(), 13, ); + + let platform = abci_app.platform; + let state = platform.state.load(); + { - let platform = abci_app.platform; let counter = platform.drive.cache.protocol_versions_counter.read(); platform .drive @@ -119,9 +122,7 @@ mod tests { .expect("expected to get versions"); assert_eq!( - platform - .state - .read() + state .last_committed_block_info() .as_ref() .unwrap() @@ -130,13 +131,7 @@ mod tests { .index, 0 ); - assert_eq!( - platform - .state - .read() - .current_protocol_version_in_consensus(), - 1 - ); + assert_eq!(state.current_protocol_version_in_consensus(), 1); assert_eq!( (counter.get(&1), counter.get(&TEST_PROTOCOL_VERSION_2)), (Some(&17), Some(&414)) @@ -147,12 +142,8 @@ mod tests { // we did not yet hit the epoch change // let's go a little longer - let platform = abci_app.platform; - let hour_in_ms = 1000 * 60 * 60; - let block_start = platform - .state - .read() + let block_start = state .last_committed_block_info() .as_ref() .unwrap() @@ -191,12 +182,12 @@ mod tests { config.clone(), StrategyRandomness::SeedEntropy(7), ); + + let state = platform.state.load(); { let counter = &platform.drive.cache.protocol_versions_counter.read(); assert_eq!( - platform - .state - .read() + state .last_committed_block_info() .as_ref() .unwrap() @@ -205,17 +196,8 @@ mod tests { .index, 1 ); - assert_eq!( - platform - .state - .read() - .current_protocol_version_in_consensus(), - 1 - ); - assert_eq!( - platform.state.read().next_epoch_protocol_version(), - TEST_PROTOCOL_VERSION_2 - ); + assert_eq!(state.current_protocol_version_in_consensus(), 1); + assert_eq!(state.next_epoch_protocol_version(), TEST_PROTOCOL_VERSION_2); assert_eq!(counter.get(&1), None); //no one has proposed 1 yet assert_eq!(counter.get(&TEST_PROTOCOL_VERSION_2), Some(&154)); } @@ -223,15 +205,14 @@ mod tests { // we locked in // let's go a little longer to see activation - let block_start = platform - .state - .read() + let block_start = state .last_committed_block_info() .as_ref() .unwrap() .basic_info() .height + 1; + let ChainExecutionOutcome { .. } = continue_chain_for_strategy( abci_app, ChainExecutionParameters { @@ -251,12 +232,13 @@ mod tests { config, StrategyRandomness::SeedEntropy(18), ); + + let state = platform.state.load(); + { let counter = &platform.drive.cache.protocol_versions_counter.read(); assert_eq!( - platform - .state - .read() + state .last_committed_block_info() .as_ref() .unwrap() @@ -266,16 +248,10 @@ mod tests { 2 ); assert_eq!( - platform - .state - .read() - .current_protocol_version_in_consensus(), - TEST_PROTOCOL_VERSION_2 - ); - assert_eq!( - platform.state.read().next_epoch_protocol_version(), + state.current_protocol_version_in_consensus(), TEST_PROTOCOL_VERSION_2 ); + assert_eq!(state.next_epoch_protocol_version(), TEST_PROTOCOL_VERSION_2); assert_eq!(counter.get(&1), None); //no one has proposed 1 yet assert_eq!(counter.get(&TEST_PROTOCOL_VERSION_2), Some(&122)); } @@ -374,8 +350,11 @@ mod tests { config.clone(), 13, ); + + let platform = abci_app.platform; + let state = platform.state.load(); + { - let platform = abci_app.platform; let counter = &platform.drive.cache.protocol_versions_counter.read(); platform .drive @@ -383,9 +362,7 @@ mod tests { .expect("expected to get versions"); assert_eq!( - platform - .state - .read() + state .last_committed_block_info() .as_ref() .unwrap() @@ -394,14 +371,8 @@ mod tests { .index, 0 ); - assert_eq!( - platform - .state - .read() - .current_protocol_version_in_consensus(), - 1 - ); - assert_eq!(platform.state.read().next_epoch_protocol_version(), 1); + assert_eq!(state.current_protocol_version_in_consensus(), 1); + assert_eq!(state.next_epoch_protocol_version(), 1); assert_eq!( (counter.get(&1), counter.get(&TEST_PROTOCOL_VERSION_2)), (Some(&6), Some(&44)) @@ -411,9 +382,7 @@ mod tests { let platform = abci_app.platform; - let block_start = platform - .state - .read() + let block_start = state .last_committed_block_info() .as_ref() .unwrap() @@ -449,12 +418,12 @@ mod tests { config.clone(), StrategyRandomness::SeedEntropy(7), ); + + let state = platform.state.load(); { let counter = &platform.drive.cache.protocol_versions_counter.read(); assert_eq!( - platform - .state - .read() + state .last_committed_block_info() .as_ref() .unwrap() @@ -463,17 +432,8 @@ mod tests { .index, 1 ); - assert_eq!( - platform - .state - .read() - .current_protocol_version_in_consensus(), - 1 - ); - assert_eq!( - platform.state.read().next_epoch_protocol_version(), - TEST_PROTOCOL_VERSION_2 - ); + assert_eq!(state.current_protocol_version_in_consensus(), 1); + assert_eq!(state.next_epoch_protocol_version(), TEST_PROTOCOL_VERSION_2); assert_eq!(counter.get(&1), None); //no one has proposed 1 yet assert_eq!(counter.get(&TEST_PROTOCOL_VERSION_2), Some(&1)); } @@ -481,9 +441,7 @@ mod tests { // we locked in // let's go 120 blocks more to see activation - let block_start = platform - .state - .read() + let block_start = state .last_committed_block_info() .as_ref() .unwrap() @@ -509,12 +467,11 @@ mod tests { config, StrategyRandomness::SeedEntropy(18), ); + let state = platform.state.load(); { let counter = &platform.drive.cache.protocol_versions_counter.read(); assert_eq!( - platform - .state - .read() + state .last_committed_block_info() .as_ref() .unwrap() @@ -524,16 +481,10 @@ mod tests { 2 ); assert_eq!( - platform - .state - .read() - .current_protocol_version_in_consensus(), - TEST_PROTOCOL_VERSION_2 - ); - assert_eq!( - platform.state.read().next_epoch_protocol_version(), + state.current_protocol_version_in_consensus(), TEST_PROTOCOL_VERSION_2 ); + assert_eq!(state.next_epoch_protocol_version(), TEST_PROTOCOL_VERSION_2); assert_eq!(counter.get(&1), None); //no one has proposed 1 yet assert_eq!(counter.get(&TEST_PROTOCOL_VERSION_2), Some(&1)); } @@ -634,12 +585,11 @@ mod tests { config.clone(), 16, ); + let platform = abci_app.platform; + let state = platform.state.load(); { - let platform = abci_app.platform; assert_eq!( - platform - .state - .read() + state .last_committed_block_info() .as_ref() .unwrap() @@ -648,14 +598,8 @@ mod tests { .index, 5 ); - assert_eq!( - platform - .state - .read() - .current_protocol_version_in_consensus(), - 1 - ); - assert_eq!(platform.state.read().next_epoch_protocol_version(), 1); + assert_eq!(state.current_protocol_version_in_consensus(), 1); + assert_eq!(state.next_epoch_protocol_version(), 1); let counter = &platform.drive.cache.protocol_versions_counter.read(); assert_eq!( (counter.get(&1), counter.get(&TEST_PROTOCOL_VERSION_2)), @@ -667,9 +611,7 @@ mod tests { // let's go a little longer let platform = abci_app.platform; - let block_start = platform - .state - .read() + let block_start = state .last_committed_block_info() .as_ref() .unwrap() @@ -705,12 +647,11 @@ mod tests { config.clone(), StrategyRandomness::SeedEntropy(7), ); + let state = platform.state.load(); { let counter = &platform.drive.cache.protocol_versions_counter.read(); assert_eq!( - platform - .state - .read() + state .last_committed_block_info() .as_ref() .unwrap() @@ -719,17 +660,8 @@ mod tests { .index, 11 ); - assert_eq!( - platform - .state - .read() - .current_protocol_version_in_consensus(), - 1 - ); - assert_eq!( - platform.state.read().next_epoch_protocol_version(), - TEST_PROTOCOL_VERSION_2 - ); + assert_eq!(state.current_protocol_version_in_consensus(), 1); + assert_eq!(state.next_epoch_protocol_version(), TEST_PROTOCOL_VERSION_2); // the counter is for the current voting during that window assert_eq!( (counter.get(&1), counter.get(&TEST_PROTOCOL_VERSION_2)), @@ -739,9 +671,7 @@ mod tests { // we are now locked in, the current protocol version will change on next epoch - let block_start = platform - .state - .read() + let block_start = state .last_committed_block_info() .as_ref() .unwrap() @@ -767,11 +697,12 @@ mod tests { config, StrategyRandomness::SeedEntropy(8), ); + + let state = platform.state.load(); + { assert_eq!( - platform - .state - .read() + state .last_committed_block_info() .as_ref() .unwrap() @@ -781,16 +712,10 @@ mod tests { 12 ); assert_eq!( - platform - .state - .read() - .current_protocol_version_in_consensus(), - TEST_PROTOCOL_VERSION_2 - ); - assert_eq!( - platform.state.read().next_epoch_protocol_version(), + state.current_protocol_version_in_consensus(), TEST_PROTOCOL_VERSION_2 ); + assert_eq!(state.next_epoch_protocol_version(), TEST_PROTOCOL_VERSION_2); } }) .expect("Failed to create thread with custom stack size"); @@ -888,12 +813,13 @@ mod tests { config.clone(), 15, ); + + let platform = abci_app.platform; + let state = platform.state.load(); + { - let platform = abci_app.platform; assert_eq!( - platform - .state - .read() + state .last_committed_block_info() .as_ref() .unwrap() @@ -902,21 +828,13 @@ mod tests { .index, 4 ); - assert_eq!( - platform - .state - .read() - .current_protocol_version_in_consensus(), - 1 - ); + assert_eq!(state.current_protocol_version_in_consensus(), 1); } // we still did not yet hit the required threshold to upgrade // let's go a just a little longer let platform = abci_app.platform; - let block_start = platform - .state - .read() + let block_start = state .last_committed_block_info() .as_ref() .unwrap() @@ -952,12 +870,11 @@ mod tests { config.clone(), StrategyRandomness::SeedEntropy(99), ); + let state = platform.state.load(); { let counter = &platform.drive.cache.protocol_versions_counter.read(); assert_eq!( - platform - .state - .read() + state .last_committed_block_info() .as_ref() .unwrap() @@ -966,17 +883,8 @@ mod tests { .index, 11 ); - assert_eq!( - platform - .state - .read() - .current_protocol_version_in_consensus(), - 1 - ); - assert_eq!( - platform.state.read().next_epoch_protocol_version(), - TEST_PROTOCOL_VERSION_2 - ); + assert_eq!(state.current_protocol_version_in_consensus(), 1); + assert_eq!(state.next_epoch_protocol_version(), TEST_PROTOCOL_VERSION_2); assert_eq!( (counter.get(&1), counter.get(&TEST_PROTOCOL_VERSION_2)), (Some(&18), Some(&111)) @@ -1019,9 +927,7 @@ mod tests { ..Default::default() }; - let block_start = platform - .state - .read() + let block_start = state .last_committed_block_info() .as_ref() .unwrap() @@ -1059,7 +965,9 @@ mod tests { config.clone(), StrategyRandomness::SeedEntropy(40), ); + let state = platform.state.load(); { + let counter = &platform.drive.cache.protocol_versions_counter.read(); let counter = &platform.drive.cache.protocol_versions_counter.read(); assert_eq!( (counter.get(&1), counter.get(&TEST_PROTOCOL_VERSION_2)), @@ -1067,9 +975,7 @@ mod tests { ); //a lot nodes reverted to previous version, however this won't impact things assert_eq!( - platform - .state - .read() + state .last_committed_block_info() .as_ref() .unwrap() @@ -1079,18 +985,13 @@ mod tests { 12 ); assert_eq!( - platform - .state - .read() - .current_protocol_version_in_consensus(), + state.current_protocol_version_in_consensus(), TEST_PROTOCOL_VERSION_2 ); - assert_eq!(platform.state.read().next_epoch_protocol_version(), 1); + assert_eq!(state.next_epoch_protocol_version(), 1); } - let block_start = platform - .state - .read() + let block_start = state .last_committed_block_info() .as_ref() .unwrap() @@ -1117,6 +1018,7 @@ mod tests { config, StrategyRandomness::SeedEntropy(40), ); + let state = platform.state.load(); { let counter = &platform.drive.cache.protocol_versions_counter.read(); assert_eq!( @@ -1124,9 +1026,7 @@ mod tests { (Some(&23), Some(&2)) ); assert_eq!( - platform - .state - .read() + state .last_committed_block_info() .as_ref() .unwrap() @@ -1135,14 +1035,8 @@ mod tests { .index, 13 ); - assert_eq!( - platform - .state - .read() - .current_protocol_version_in_consensus(), - 1 - ); - assert_eq!(platform.state.read().next_epoch_protocol_version(), 1); + assert_eq!(state.current_protocol_version_in_consensus(), 1); + assert_eq!(state.next_epoch_protocol_version(), 1); } }) .expect("Failed to create thread with custom stack size"); @@ -1237,14 +1131,13 @@ mod tests { identity_contract_nonce_counter, .. } = run_chain_for_strategy(&mut platform, 1400, strategy, config.clone(), 15); + let state = abci_app.platform.state.load(); { let platform = abci_app.platform; let counter = &platform.drive.cache.protocol_versions_counter.read(); assert_eq!( - platform - .state - .read() + state .last_committed_block_info() .as_ref() .unwrap() @@ -1253,17 +1146,8 @@ mod tests { .index, 3 ); - assert_eq!( - platform - .state - .read() - .current_protocol_version_in_consensus(), - 1 - ); - assert_eq!( - platform.state.read().next_epoch_protocol_version(), - TEST_PROTOCOL_VERSION_2 - ); + assert_eq!(state.current_protocol_version_in_consensus(), 1); + assert_eq!(state.next_epoch_protocol_version(), TEST_PROTOCOL_VERSION_2); assert_eq!( ( counter.get(&1), @@ -1310,9 +1194,7 @@ mod tests { // we hit the required threshold to upgrade // let's go a little longer let platform = abci_app.platform; - let block_start = platform - .state - .read() + let block_start = state .last_committed_block_info() .as_ref() .unwrap() @@ -1338,12 +1220,11 @@ mod tests { config, StrategyRandomness::SeedEntropy(7), ); + let state = platform.state.load(); { let counter = &platform.drive.cache.protocol_versions_counter.read(); assert_eq!( - platform - .state - .read() + state .last_committed_block_info() .as_ref() .unwrap() @@ -1353,16 +1234,10 @@ mod tests { 5 ); assert_eq!( - platform - .state - .read() - .current_protocol_version_in_consensus(), + state.current_protocol_version_in_consensus(), TEST_PROTOCOL_VERSION_2 ); - assert_eq!( - platform.state.read().next_epoch_protocol_version(), - TEST_PROTOCOL_VERSION_3 - ); + assert_eq!(state.next_epoch_protocol_version(), TEST_PROTOCOL_VERSION_3); assert_eq!( ( counter.get(&1), diff --git a/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs b/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs index 1c538d5770..ed7d7f3bad 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs @@ -34,7 +34,7 @@ pub(crate) fn verify_state_transitions_were_or_were_not_executed( expected_validation_errors: &[u32], platform_version: &PlatformVersion, ) -> bool { - let state = abci_app.platform.state.read(); + let state = abci_app.platform.state.load(); let platform = PlatformRef { drive: &abci_app.platform.drive, state: &state, @@ -111,7 +111,7 @@ pub(crate) fn verify_state_transitions_were_or_were_not_executed( let result = abci_app .platform - .query_proofs(versioned_request, platform_version) + .query_proofs(versioned_request, &state, platform_version) .expect("expected to query proofs"); let response = result.into_data().expect("expected queries to be valid"); @@ -159,7 +159,7 @@ pub(crate) fn verify_state_transitions_were_or_were_not_executed( }; let result = abci_app .platform - .query_proofs(versioned_request, platform_version) + .query_proofs(versioned_request, &state, platform_version) .expect("expected to query proofs"); let response = result.into_data().expect("expected queries to be valid"); @@ -241,7 +241,7 @@ pub(crate) fn verify_state_transitions_were_or_were_not_executed( }; let result = abci_app .platform - .query_proofs(versioned_request, platform_version) + .query_proofs(versioned_request, &state, platform_version) .expect("expected to query proofs"); let response = result.into_data().expect("expected queries to be valid"); @@ -391,7 +391,7 @@ pub(crate) fn verify_state_transitions_were_or_were_not_executed( }; let result = abci_app .platform - .query_proofs(versioned_request, platform_version) + .query_proofs(versioned_request, &state, platform_version) .expect("expected to query proofs"); let response = result.into_data().expect("expected queries to be valid"); @@ -437,7 +437,7 @@ pub(crate) fn verify_state_transitions_were_or_were_not_executed( }; let result = abci_app .platform - .query_proofs(versioned_request, platform_version) + .query_proofs(versioned_request, &state, platform_version) .expect("expected to query proofs"); let response = result.into_data().expect("expected queries to be valid"); @@ -491,7 +491,7 @@ pub(crate) fn verify_state_transitions_were_or_were_not_executed( }; let result = abci_app .platform - .query_proofs(versioned_request, platform_version) + .query_proofs(versioned_request, &state, platform_version) .expect("expected to query proofs"); let response = result.into_data().expect("expected queries to be valid"); @@ -531,7 +531,7 @@ pub(crate) fn verify_state_transitions_were_or_were_not_executed( }; let result = abci_app .platform - .query_proofs(versioned_request, platform_version) + .query_proofs(versioned_request, &state, platform_version) .expect("expected to query proofs"); let response = result.into_data().expect("expected queries to be valid"); @@ -594,7 +594,7 @@ pub(crate) fn verify_state_transitions_were_or_were_not_executed( let result = abci_app .platform - .query_proofs(versioned_request, platform_version) + .query_proofs(versioned_request, &state, platform_version) .expect("expected to query proofs"); let response = result.into_data().expect("expected queries to be valid"); diff --git a/packages/rs-drive/Cargo.toml b/packages/rs-drive/Cargo.toml index d0f0b56f94..7e76c9afb4 100644 --- a/packages/rs-drive/Cargo.toml +++ b/packages/rs-drive/Cargo.toml @@ -15,6 +15,7 @@ private = true [dependencies] parking_lot = "0.12.1" +arc-swap = "1.7.0" serde = { version = "1.0.152", features = ["derive"] } platform-version = { path = "../rs-platform-version" } ciborium = { git = "https://github.com/qrayven/ciborium", branch = "feat-ser-null-as-undefined" } diff --git a/packages/rs-drive/src/drive/batch/drive_op_batch/document.rs b/packages/rs-drive/src/drive/batch/drive_op_batch/document.rs index b94cb3adb6..8b62329254 100644 --- a/packages/rs-drive/src/drive/batch/drive_op_batch/document.rs +++ b/packages/rs-drive/src/drive/batch/drive_op_batch/document.rs @@ -247,7 +247,7 @@ impl DriveLowLevelOperationConverter for DocumentOperationType<'_> { DocumentOperationType::AddWithdrawalDocument { owned_document_info, } => { - let contract = drive.cache.system_data_contracts.read_withdrawals(); + let contract = drive.cache.system_data_contracts.load_withdrawals(); let document_type = contract.document_type_for_name(withdrawal::NAME)?; diff --git a/packages/rs-drive/src/drive/cache/system_contracts.rs b/packages/rs-drive/src/drive/cache/system_contracts.rs index f9883ca7f5..b301d63cac 100644 --- a/packages/rs-drive/src/drive/cache/system_contracts.rs +++ b/packages/rs-drive/src/drive/cache/system_contracts.rs @@ -1,18 +1,21 @@ use crate::error::Error; +use arc_swap::{ArcSwap, Guard}; use dpp::data_contract::DataContract; use dpp::system_data_contracts::{load_system_data_contract, SystemDataContract}; use platform_version::version::PlatformVersion; +use std::sync::Arc; +// TODO: Use ArcSwap /// System contracts pub struct SystemDataContracts { /// Withdrawal contract - withdrawals: parking_lot::RwLock, + withdrawals: ArcSwap, /// DPNS contract - dpns: parking_lot::RwLock, + dpns: ArcSwap, /// Dashpay contract - dashpay: parking_lot::RwLock, + dashpay: ArcSwap, /// Masternode reward shares contract - masternode_reward_shares: parking_lot::RwLock, + masternode_reward_shares: ArcSwap, } impl SystemDataContracts { @@ -21,19 +24,19 @@ impl SystemDataContracts { platform_version: &PlatformVersion, ) -> Result { Ok(Self { - withdrawals: parking_lot::RwLock::new(load_system_data_contract( + withdrawals: ArcSwap::from_pointee(load_system_data_contract( SystemDataContract::Withdrawals, platform_version, )?), - dpns: parking_lot::RwLock::new(load_system_data_contract( + dpns: ArcSwap::from_pointee(load_system_data_contract( SystemDataContract::DPNS, platform_version, )?), - dashpay: parking_lot::RwLock::new(load_system_data_contract( + dashpay: ArcSwap::from_pointee(load_system_data_contract( SystemDataContract::Dashpay, platform_version, )?), - masternode_reward_shares: parking_lot::RwLock::new(load_system_data_contract( + masternode_reward_shares: ArcSwap::from_pointee(load_system_data_contract( SystemDataContract::MasternodeRewards, platform_version, )?), @@ -41,22 +44,22 @@ impl SystemDataContracts { } /// Returns withdrawals contract - pub fn read_withdrawals(&self) -> parking_lot::RwLockReadGuard { - self.withdrawals.read() + pub fn load_withdrawals(&self) -> Guard> { + self.withdrawals.load() } /// Returns DPNS contract - pub fn read_dpns(&self) -> parking_lot::RwLockReadGuard { - self.dpns.read() + pub fn load_dpns(&self) -> Guard> { + self.dpns.load() } /// Returns Dashpay contract - pub fn read_dashpay(&self) -> parking_lot::RwLockReadGuard { - self.dashpay.read() + pub fn load_dashpay(&self) -> Guard> { + self.dashpay.load() } /// Returns Masternode reward shares contract - pub fn read_masternode_reward_shares(&self) -> parking_lot::RwLockReadGuard { - self.masternode_reward_shares.read() + pub fn load_masternode_reward_shares(&self) -> Guard> { + self.masternode_reward_shares.load() } } diff --git a/packages/rs-drive/src/drive/identity/withdrawals/document/find_withdrawal_documents_by_status_and_transaction_indices/v0/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/document/find_withdrawal_documents_by_status_and_transaction_indices/v0/mod.rs index 48840939f4..9cf1f594a2 100644 --- a/packages/rs-drive/src/drive/identity/withdrawals/document/find_withdrawal_documents_by_status_and_transaction_indices/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/withdrawals/document/find_withdrawal_documents_by_status_and_transaction_indices/v0/mod.rs @@ -60,7 +60,7 @@ impl Drive { }, ); - let contract = self.cache.system_data_contracts.read_withdrawals(); + let contract = self.cache.system_data_contracts.load_withdrawals(); let document_type = contract.document_type_for_name(withdrawal::NAME)?; diff --git a/yarn.lock b/yarn.lock index 67363b23e1..01f3763a8f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6274,6 +6274,7 @@ __metadata: ajv-formats: "npm:^2.1.1" awilix: "npm:^4.2.6" begoo: "npm:^2.0.2" + bs58: "npm:^4.0.1" chai: "npm:^4.3.10" chai-as-promised: "npm:^7.1.1" chalk: "npm:^4.1.0" From 8030d3d1fbc55a0153ca73793c6ee5bdc17a7ba2 Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Fri, 8 Mar 2024 20:58:46 +0700 Subject: [PATCH 073/191] feat(platform)!: state transition fee increase and priorities (#1750) --- .../src/document/document_factory/v0/mod.rs | 1 + .../specialized_document_factory/v0/mod.rs | 1 + .../rs-dpp/src/fee/default_costs/constants.rs | 2 +- packages/rs-dpp/src/fee/fee_result/mod.rs | 16 ++ packages/rs-dpp/src/lib.rs | 4 + packages/rs-dpp/src/state_transition/mod.rs | 12 +- .../src/state_transition/serialization.rs | 5 + .../state_transitions/common_fields.rs | 2 + .../state_transition_like.rs | 16 ++ .../data_contract_create_transition/v0/mod.rs | 5 +- .../v0/state_transition_like.rs | 9 + .../v0/v0_methods.rs | 1 + .../v0/value_conversion.rs | 9 + .../methods/mod.rs | 4 +- .../methods/v0/mod.rs | 3 +- .../state_transition_like.rs | 16 ++ .../data_contract_update_transition/v0/mod.rs | 4 +- .../v0/state_transition_like.rs | 9 + .../v0/v0_methods.rs | 4 +- .../v0/value_conversion.rs | 12 +- .../documents_batch_transition/methods/mod.rs | 6 +- .../methods/v0/mod.rs | 4 +- .../state_transition_like.rs | 16 ++ .../documents_batch_transition/v0/mod.rs | 2 + .../v0/state_transition_like.rs | 9 + .../v0/v0_methods.rs | 7 +- .../state_transition_like.rs | 16 ++ .../identity_create_transition/v0/mod.rs | 7 +- .../v0/state_transition_like.rs | 9 + .../state_transition_like.rs | 16 ++ .../v0/mod.rs | 4 +- .../v0/state_transition_like.rs | 9 + .../methods/mod.rs | 4 +- .../methods/v0/mod.rs | 3 +- .../state_transition_like.rs | 16 ++ .../v0/mod.rs | 3 +- .../v0/state_transition_like.rs | 9 + .../v0/v0_methods.rs | 4 +- .../identity_topup_transition/methods/mod.rs | 4 +- .../methods/v0/mod.rs | 3 +- .../state_transition_like.rs | 16 ++ .../identity_topup_transition/v0/mod.rs | 3 +- .../v0/state_transition_like.rs | 9 + .../v0/v0_methods.rs | 6 +- .../v0/value_conversion.rs | 7 + .../identity_update_transition/methods/mod.rs | 4 +- .../methods/v0/mod.rs | 3 +- .../state_transition_like.rs | 16 ++ .../v0/json_conversion.rs | 1 + .../identity_update_transition/v0/mod.rs | 5 +- .../v0/state_transition_like.rs | 9 + .../v0/v0_methods.rs | 4 +- .../v0/value_conversion.rs | 9 +- .../traits/state_transition_like.rs | 6 +- .../src/abci/handler/check_tx.rs | 2 +- .../src/execution/check_tx/mod.rs | 3 + .../src/execution/check_tx/v0/mod.rs | 157 ++++++++++++++++++ .../clear_drive_block_cache/v0/mod.rs | 3 +- .../execute_event/v0/mod.rs | 4 + .../validate_fees_of_event/v0/mod.rs | 6 + .../execution/types/execution_event/mod.rs | 15 ++ .../data_contract_update/mod.rs | 2 + .../documents_batch/state/v0/mod.rs | 2 + .../documents_batch/transformer/v0/mod.rs | 2 + .../tests/strategy_tests/strategy.rs | 6 + .../contract/data_contract_create/mod.rs | 9 +- .../contract/data_contract_create/v0/mod.rs | 4 +- .../data_contract_create/v0/transformer.rs | 2 + .../contract/data_contract_update/mod.rs | 9 +- .../contract/data_contract_update/v0/mod.rs | 4 +- .../data_contract_update/v0/transformer.rs | 2 + .../document/documents_batch/mod.rs | 8 + .../document/documents_batch/v0/mod.rs | 3 + .../identity/identity_create/mod.rs | 8 + .../identity/identity_create/v0/mod.rs | 3 + .../identity_create/v0/transformer.rs | 2 + .../identity/identity_credit_transfer/mod.rs | 9 +- .../identity_credit_transfer/v0/mod.rs | 4 +- .../v0/transformer.rs | 4 + .../identity_credit_withdrawal/mod.rs | 11 +- .../identity_credit_withdrawal/v0/mod.rs | 4 +- .../v0/transformer.rs | 1 + .../identity/identity_topup/mod.rs | 8 + .../identity/identity_topup/v0/mod.rs | 3 + .../identity/identity_topup/v0/transformer.rs | 4 + .../identity/identity_update/mod.rs | 10 +- .../identity/identity_update/v0/mod.rs | 4 +- .../identity_update/v0/transformer.rs | 4 + .../src/state_transition_action/mod.rs | 33 +++- .../mod.rs | 8 +- .../transformer.rs | 16 +- .../v0/mod.rs | 6 +- .../v0/transformer.rs | 17 ++ .../system/bump_identity_nonce_action/mod.rs | 8 +- .../bump_identity_nonce_action/v0/mod.rs | 7 +- .../v0/transformer.rs | 72 ++++++-- .../src/platform/transition/put_document.rs | 6 +- .../src/platform/transition/put_settings.rs | 2 + .../platform/transition/top_up_identity.rs | 5 +- .../transition/withdraw_from_identity.rs | 4 + packages/strategy-tests/src/lib.rs | 5 + packages/strategy-tests/src/transitions.rs | 5 + .../data_contract_factory.rs | 4 +- .../identity_topup_transition.rs | 4 +- .../DataContractCreateTransition.spec.js | 2 +- .../DataContractUpdateTransition.spec.js | 2 +- 106 files changed, 841 insertions(+), 71 deletions(-) diff --git a/packages/rs-dpp/src/document/document_factory/v0/mod.rs b/packages/rs-dpp/src/document/document_factory/v0/mod.rs index 2fe4f9d922..fdfe9bc248 100644 --- a/packages/rs-dpp/src/document/document_factory/v0/mod.rs +++ b/packages/rs-dpp/src/document/document_factory/v0/mod.rs @@ -237,6 +237,7 @@ impl DocumentFactoryV0 { Ok(DocumentsBatchTransitionV0 { owner_id, transitions, + user_fee_increase: 0, signature_public_key_id: 0, signature: Default::default(), } diff --git a/packages/rs-dpp/src/document/specialized_document_factory/v0/mod.rs b/packages/rs-dpp/src/document/specialized_document_factory/v0/mod.rs index c3fc31defb..0d844c6ba6 100644 --- a/packages/rs-dpp/src/document/specialized_document_factory/v0/mod.rs +++ b/packages/rs-dpp/src/document/specialized_document_factory/v0/mod.rs @@ -246,6 +246,7 @@ impl SpecializedDocumentFactoryV0 { Ok(DocumentsBatchTransitionV0 { owner_id, transitions, + user_fee_increase: 0, signature_public_key_id: 0, signature: Default::default(), } diff --git a/packages/rs-dpp/src/fee/default_costs/constants.rs b/packages/rs-dpp/src/fee/default_costs/constants.rs index f93be480f1..a3afb06691 100644 --- a/packages/rs-dpp/src/fee/default_costs/constants.rs +++ b/packages/rs-dpp/src/fee/default_costs/constants.rs @@ -1,7 +1,7 @@ use crate::fee::Credits; pub const BASE_ST_PROCESSING_FEE: Credits = 10000; // 84000 -pub const FEE_MULTIPLIER: Credits = 2; +pub const DEFAULT_SYSTEM_FEE_MULTIPLIER: Credits = 2; pub const DEFAULT_USER_TIP: Credits = 0; pub const STORAGE_CREDIT_PER_BYTE: Credits = 5000; pub const PROCESSING_CREDIT_PER_BYTE: Credits = 12; diff --git a/packages/rs-dpp/src/fee/fee_result/mod.rs b/packages/rs-dpp/src/fee/fee_result/mod.rs index 1956719049..c58e7b97c2 100644 --- a/packages/rs-dpp/src/fee/fee_result/mod.rs +++ b/packages/rs-dpp/src/fee/fee_result/mod.rs @@ -41,6 +41,7 @@ use crate::consensus::fee::fee_error::FeeError; use crate::fee::fee_result::refunds::FeeRefunds; use crate::fee::fee_result::BalanceChange::{AddToBalance, NoBalanceChange, RemoveFromBalance}; use crate::fee::Credits; +use crate::prelude::UserFeeIncrease; use crate::ProtocolError; use platform_value::Identifier; use std::cmp::Ordering; @@ -192,6 +193,21 @@ impl FeeResult { removed_bytes_from_system: 0, } } + + /// Apply a fee multiplier to a fee result + pub fn apply_user_fee_increase(&mut self, add_fee_percentage_multiplier: UserFeeIncrease) { + let additional_processing_fee = (self.processing_fee as u128) + .saturating_mul(add_fee_percentage_multiplier as u128) + .saturating_div(100); + if additional_processing_fee > u64::MAX as u128 { + self.processing_fee = u64::MAX; + } else { + self.processing_fee = self + .processing_fee + .saturating_add(additional_processing_fee as u64); + } + } + /// Convenience method to get total fee pub fn total_base_fee(&self) -> Credits { self.storage_fee + self.processing_fee diff --git a/packages/rs-dpp/src/lib.rs b/packages/rs-dpp/src/lib.rs index e06eb659e9..1ebf54d0a7 100644 --- a/packages/rs-dpp/src/lib.rs +++ b/packages/rs-dpp/src/lib.rs @@ -65,6 +65,10 @@ pub mod prelude { pub type TimestampMillis = u64; pub type Revision = u64; pub type IdentityNonce = u64; + + /// UserFeeIncrease is the additional percentage of the processing fee. + /// A 1 here means we pay 1% more in processing fees. A 100 means we pay 100% more. + pub type UserFeeIncrease = u16; } pub use bincode; diff --git a/packages/rs-dpp/src/state_transition/mod.rs b/packages/rs-dpp/src/state_transition/mod.rs index b9dadd68e3..2f079353f4 100644 --- a/packages/rs-dpp/src/state_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/mod.rs @@ -63,7 +63,7 @@ use crate::identity::state_transition::OptionallyAssetLockProved; ))] use crate::identity::{IdentityPublicKey, KeyType, Purpose}; use crate::identity::{KeyID, SecurityLevel}; -use crate::prelude::AssetLockProof; +use crate::prelude::{AssetLockProof, UserFeeIncrease}; pub use state_transitions::*; use crate::serialization::Signable; @@ -315,6 +315,11 @@ impl StateTransition { call_method!(self, signature) } + /// returns the fee_increase additional percentage multiplier, it affects only processing costs + pub fn user_fee_increase(&self) -> UserFeeIncrease { + call_method!(self, user_fee_increase) + } + /// The transaction id is a single hash of the data with the signature pub fn transaction_id(&self) -> Result<[u8; 32], ProtocolError> { Ok(hash_single( @@ -347,6 +352,11 @@ impl StateTransition { call_method!(self, set_signature, signature) } + /// set fee multiplier + pub fn set_user_fee_increase(&mut self, fee_multiplier: UserFeeIncrease) { + call_method!(self, set_user_fee_increase, fee_multiplier) + } + /// set a new signature pub fn set_signature_public_key_id(&mut self, public_key_id: KeyID) { call_method_identity_signed!(self, set_signature_public_key_id, public_key_id) diff --git a/packages/rs-dpp/src/state_transition/serialization.rs b/packages/rs-dpp/src/state_transition/serialization.rs index 76889fe459..5757fd76c3 100644 --- a/packages/rs-dpp/src/state_transition/serialization.rs +++ b/packages/rs-dpp/src/state_transition/serialization.rs @@ -88,6 +88,7 @@ mod tests { let identity_topup_transition = IdentityTopUpTransitionV0 { asset_lock_proof: AssetLockProof::Instant(asset_lock_proof), identity_id: identity.id(), + user_fee_increase: 0, signature: [1u8; 65].to_vec().into(), }; let state_transition: StateTransition = identity_topup_transition.into(); @@ -125,6 +126,7 @@ mod tests { add_public_keys: add_public_keys_in_creation, disable_public_keys: vec![], public_keys_disabled_at: None, + user_fee_increase: 0, }; let key_signable_bytes = identity_update_transition @@ -192,6 +194,7 @@ mod tests { add_public_keys: add_public_keys_in_creation, disable_public_keys: vec![3, 4, 5], public_keys_disabled_at: Some(15), + user_fee_increase: 0, }; let key_signable_bytes = identity_update_transition @@ -246,6 +249,7 @@ mod tests { pooling: Pooling::Standard, output_script: CoreScript::from_bytes((0..23).collect::>()), nonce: 1, + user_fee_increase: 0, signature_public_key_id: 0, signature: [1u8; 65].to_vec().into(), }; @@ -296,6 +300,7 @@ mod tests { .data_contract_owned() .try_into_platform_versioned(platform_version) .expect("expected a data contract"), + user_fee_increase: 0, signature_public_key_id: 0, signature: [1u8; 65].to_vec().into(), }); diff --git a/packages/rs-dpp/src/state_transition/state_transitions/common_fields.rs b/packages/rs-dpp/src/state_transition/state_transitions/common_fields.rs index 9080f26523..fc9a770f23 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/common_fields.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/common_fields.rs @@ -2,6 +2,8 @@ pub mod property_names { pub const STATE_TRANSITION_PROTOCOL_VERSION: &str = "$version"; pub const IDENTITY_CONTRACT_NONCE: &str = "identityContractNonce"; pub const IDENTITY_NONCE: &str = "identityNonce"; + + pub const USER_FEE_INCREASE: &str = "userFeeIncrease"; pub const SIGNATURE_PUBLIC_KEY_ID: &str = "signaturePublicKeyId"; pub const SIGNATURE: &str = "signature"; pub const TRANSITION_TYPE: &str = "type"; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/state_transition_like.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/state_transition_like.rs index 4c629619ab..e8c7765558 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/state_transition_like.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/state_transition_like.rs @@ -1,3 +1,4 @@ +use crate::prelude::UserFeeIncrease; use crate::state_transition::data_contract_create_transition::DataContractCreateTransition; use crate::state_transition::{StateTransitionLike, StateTransitionType}; use crate::version::FeatureVersion; @@ -35,6 +36,21 @@ impl StateTransitionLike for DataContractCreateTransition { } } + /// returns the fee multiplier + fn user_fee_increase(&self) -> UserFeeIncrease { + match self { + DataContractCreateTransition::V0(transition) => transition.user_fee_increase(), + } + } + /// set a fee multiplier + fn set_user_fee_increase(&mut self, fee_multiplier: UserFeeIncrease) { + match self { + DataContractCreateTransition::V0(transition) => { + transition.set_user_fee_increase(fee_multiplier) + } + } + } + fn set_signature_bytes(&mut self, signature: Vec) { match self { DataContractCreateTransition::V0(transition) => { diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/mod.rs index 973d127f17..054004a6dc 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/mod.rs @@ -18,7 +18,7 @@ use crate::{data_contract::DataContract, identity::KeyID, ProtocolError}; use crate::data_contract::created_data_contract::CreatedDataContract; use crate::data_contract::serialized_version::DataContractInSerializationFormat; -use crate::prelude::IdentityNonce; +use crate::prelude::{IdentityNonce, UserFeeIncrease}; use crate::state_transition::data_contract_create_transition::DataContractCreateTransition; use bincode::{Decode, Encode}; use platform_version::{TryFromPlatformVersioned, TryIntoPlatformVersioned}; @@ -37,6 +37,7 @@ use crate::version::PlatformVersion; pub struct DataContractCreateTransitionV0 { pub data_contract: DataContractInSerializationFormat, pub identity_nonce: IdentityNonce, + pub user_fee_increase: UserFeeIncrease, #[platform_signable(exclude_from_sig_hash)] pub signature_public_key_id: KeyID, #[platform_signable(exclude_from_sig_hash)] @@ -67,6 +68,7 @@ impl TryFromPlatformVersioned for DataContractCreateTransitionV0 { Ok(DataContractCreateTransitionV0 { data_contract: value.try_into_platform_versioned(platform_version)?, identity_nonce: Default::default(), + user_fee_increase: 0, signature_public_key_id: 0, signature: Default::default(), }) @@ -84,6 +86,7 @@ impl TryFromPlatformVersioned for DataContractCreateTransit Ok(DataContractCreateTransitionV0 { data_contract: data_contract.try_into_platform_versioned(platform_version)?, identity_nonce, + user_fee_increase: 0, signature_public_key_id: 0, signature: Default::default(), }) diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/state_transition_like.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/state_transition_like.rs index d92fb6ec4e..6f879c2b7e 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/state_transition_like.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/state_transition_like.rs @@ -1,5 +1,6 @@ use platform_value::BinaryData; +use crate::prelude::UserFeeIncrease; use crate::{ prelude::Identifier, state_transition::{StateTransitionLike, StateTransitionType}, @@ -48,4 +49,12 @@ impl StateTransitionLike for DataContractCreateTransitionV0 { self.data_contract.id() )] } + + fn user_fee_increase(&self) -> UserFeeIncrease { + self.user_fee_increase + } + + fn set_user_fee_increase(&mut self, fee_multiplier: UserFeeIncrease) { + self.user_fee_increase = fee_multiplier + } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/v0_methods.rs index 20eb5f00e9..ddf987f5a5 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/v0_methods.rs @@ -38,6 +38,7 @@ impl DataContractCreateTransitionMethodsV0 for DataContractCreateTransitionV0 { let transition = DataContractCreateTransition::V0(DataContractCreateTransitionV0 { data_contract: data_contract.try_into_platform_versioned(platform_version)?, identity_nonce, + user_fee_increase: 0, signature_public_key_id: key_id, signature: Default::default(), }); diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/value_conversion.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/value_conversion.rs index 64af95bf2c..f79c2f765f 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/value_conversion.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/value_conversion.rs @@ -11,6 +11,7 @@ use crate::data_contract::conversion::value::v0::DataContractValueConversionMeth use crate::state_transition::{StateTransitionFieldTypes, StateTransitionValueConvert}; use crate::state_transition::data_contract_create_transition::{DataContractCreateTransitionV0}; use crate::state_transition::data_contract_create_transition::fields::*; +use crate::state_transition::state_transitions::common_fields::property_names::USER_FEE_INCREASE; use crate::state_transition::state_transitions::contract::data_contract_create_transition::fields::{BINARY_FIELDS, IDENTIFIER_FIELDS, U32_FIELDS}; impl<'a> StateTransitionValueConvert<'a> for DataContractCreateTransitionV0 { @@ -41,6 +42,10 @@ impl<'a> StateTransitionValueConvert<'a> for DataContractCreateTransitionV0 { platform_version, )? .try_into_platform_versioned(platform_version)?, + user_fee_increase: raw_object + .get_optional_integer(USER_FEE_INCREASE) + .map_err(ProtocolError::ValueError)? + .unwrap_or_default(), }) } @@ -71,6 +76,10 @@ impl<'a> StateTransitionValueConvert<'a> for DataContractCreateTransitionV0 { platform_version, )? .try_into_platform_versioned(platform_version)?, + user_fee_increase: raw_value_map + .remove_optional_integer(USER_FEE_INCREASE) + .map_err(ProtocolError::ValueError)? + .unwrap_or_default(), }) } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/methods/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/methods/mod.rs index 6f7196258e..98522c5972 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/methods/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/methods/mod.rs @@ -12,7 +12,7 @@ use crate::state_transition::StateTransition; use crate::version::FeatureVersion; use crate::ProtocolError; -use crate::prelude::IdentityNonce; +use crate::prelude::{IdentityNonce, UserFeeIncrease}; use platform_version::version::PlatformVersion; impl DataContractUpdateTransitionMethodsV0 for DataContractUpdateTransition { @@ -21,6 +21,7 @@ impl DataContractUpdateTransitionMethodsV0 for DataContractUpdateTransition { identity: &PartialIdentity, key_id: KeyID, identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, signer: &S, platform_version: &PlatformVersion, feature_version: Option, @@ -37,6 +38,7 @@ impl DataContractUpdateTransitionMethodsV0 for DataContractUpdateTransition { identity, key_id, identity_contract_nonce, + user_fee_increase, signer, platform_version, feature_version, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/methods/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/methods/v0/mod.rs index eacbc8925d..1dd2d579b3 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/methods/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/methods/v0/mod.rs @@ -2,7 +2,7 @@ use crate::data_contract::DataContract; use crate::identity::signer::Signer; use crate::identity::{KeyID, PartialIdentity}; -use crate::prelude::IdentityNonce; +use crate::prelude::{IdentityNonce, UserFeeIncrease}; use crate::state_transition::StateTransition; use crate::version::FeatureVersion; use crate::ProtocolError; @@ -27,6 +27,7 @@ pub trait DataContractUpdateTransitionMethodsV0 { identity: &PartialIdentity, key_id: KeyID, identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, signer: &S, platform_version: &PlatformVersion, feature_version: Option, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/state_transition_like.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/state_transition_like.rs index 64cd37651d..7c03a33bec 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/state_transition_like.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/state_transition_like.rs @@ -1,3 +1,4 @@ +use crate::prelude::UserFeeIncrease; use crate::state_transition::data_contract_update_transition::DataContractUpdateTransition; use crate::state_transition::{StateTransitionLike, StateTransitionType}; use crate::version::FeatureVersion; @@ -54,4 +55,19 @@ impl StateTransitionLike for DataContractUpdateTransition { DataContractUpdateTransition::V0(transition) => transition.unique_identifiers(), } } + + /// returns the fee increase multiplier + fn user_fee_increase(&self) -> UserFeeIncrease { + match self { + DataContractUpdateTransition::V0(transition) => transition.user_fee_increase(), + } + } + /// set a fee increase multiplier + fn set_user_fee_increase(&mut self, user_fee_increase: UserFeeIncrease) { + match self { + DataContractUpdateTransition::V0(transition) => { + transition.set_user_fee_increase(user_fee_increase) + } + } + } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/v0/mod.rs index 51b74438c6..144d706ecc 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/v0/mod.rs @@ -18,7 +18,7 @@ use platform_version::version::PlatformVersion; use platform_version::{TryFromPlatformVersioned, TryIntoPlatformVersioned}; use crate::data_contract::serialized_version::DataContractInSerializationFormat; -use crate::prelude::IdentityNonce; +use crate::prelude::{IdentityNonce, UserFeeIncrease}; use crate::state_transition::data_contract_update_transition::DataContractUpdateTransition; use crate::state_transition::StateTransition; use crate::{data_contract::DataContract, identity::KeyID, ProtocolError}; @@ -37,6 +37,7 @@ pub struct DataContractUpdateTransitionV0 { )] pub identity_contract_nonce: IdentityNonce, pub data_contract: DataContractInSerializationFormat, + pub user_fee_increase: UserFeeIncrease, #[platform_signable(exclude_from_sig_hash)] pub signature_public_key_id: KeyID, #[platform_signable(exclude_from_sig_hash)] @@ -53,6 +54,7 @@ impl TryFromPlatformVersioned<(DataContract, IdentityNonce)> for DataContractUpd Ok(DataContractUpdateTransitionV0 { identity_contract_nonce: value.1, data_contract: value.0.try_into_platform_versioned(platform_version)?, + user_fee_increase: 0, signature_public_key_id: 0, signature: Default::default(), }) diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/v0/state_transition_like.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/v0/state_transition_like.rs index 54e7e1e452..5ada17858d 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/v0/state_transition_like.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/v0/state_transition_like.rs @@ -1,5 +1,6 @@ use platform_value::BinaryData; +use crate::prelude::UserFeeIncrease; use crate::{ prelude::Identifier, state_transition::{StateTransitionLike, StateTransitionType}, @@ -49,4 +50,12 @@ impl StateTransitionLike for DataContractUpdateTransitionV0 { self.identity_contract_nonce )] } + + fn user_fee_increase(&self) -> UserFeeIncrease { + self.user_fee_increase + } + + fn set_user_fee_increase(&mut self, fee_multiplier: UserFeeIncrease) { + self.user_fee_increase = fee_multiplier + } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/v0/v0_methods.rs index 0079341985..732b684b7a 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/v0/v0_methods.rs @@ -3,7 +3,7 @@ use crate::identity::signer::Signer; use crate::identity::{KeyID, PartialIdentity}; use crate::serialization::Signable; -use crate::prelude::IdentityNonce; +use crate::prelude::{IdentityNonce, UserFeeIncrease}; use crate::state_transition::data_contract_update_transition::methods::DataContractUpdateTransitionMethodsV0; use crate::state_transition::data_contract_update_transition::{ DataContractUpdateTransition, DataContractUpdateTransitionV0, @@ -20,6 +20,7 @@ impl DataContractUpdateTransitionMethodsV0 for DataContractUpdateTransitionV0 { identity: &PartialIdentity, key_id: KeyID, identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, signer: &S, platform_version: &PlatformVersion, _feature_version: Option, @@ -27,6 +28,7 @@ impl DataContractUpdateTransitionMethodsV0 for DataContractUpdateTransitionV0 { let transition = DataContractUpdateTransition::V0(DataContractUpdateTransitionV0 { identity_contract_nonce, data_contract: data_contract.try_into_platform_versioned(platform_version)?, + user_fee_increase, signature_public_key_id: key_id, signature: Default::default(), }); diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/v0/value_conversion.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/v0/value_conversion.rs index 25d7cf9098..9759ab775b 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/v0/value_conversion.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/v0/value_conversion.rs @@ -4,7 +4,9 @@ use crate::state_transition::data_contract_update_transition::fields::*; use crate::state_transition::data_contract_update_transition::{ DataContractUpdateTransitionV0, BINARY_FIELDS, IDENTIFIER_FIELDS, U32_FIELDS, }; -use crate::state_transition::state_transitions::common_fields::property_names::IDENTITY_CONTRACT_NONCE; +use crate::state_transition::state_transitions::common_fields::property_names::{ + IDENTITY_CONTRACT_NONCE, USER_FEE_INCREASE, +}; use crate::state_transition::StateTransitionFieldTypes; use crate::state_transition::StateTransitionValueConvert; use crate::ProtocolError; @@ -76,6 +78,10 @@ impl<'a> StateTransitionValueConvert<'a> for DataContractUpdateTransitionV0 { platform_version, )? .try_into_platform_versioned(platform_version)?, + user_fee_increase: raw_object + .get_optional_integer(USER_FEE_INCREASE) + .map_err(ProtocolError::ValueError)? + .unwrap_or_default(), }) } @@ -110,6 +116,10 @@ impl<'a> StateTransitionValueConvert<'a> for DataContractUpdateTransitionV0 { platform_version, )? .try_into_platform_versioned(platform_version)?, + user_fee_increase: raw_value_map + .remove_optional_integer(USER_FEE_INCREASE) + .map_err(ProtocolError::ValueError)? + .unwrap_or_default(), }) } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs index 034c61c6bf..c44b929bc4 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs @@ -6,7 +6,7 @@ use crate::document::Document; use crate::identity::signer::Signer; #[cfg(feature = "state-transition-signing")] use crate::identity::IdentityPublicKey; -use crate::prelude::IdentityNonce; +use crate::prelude::{IdentityNonce, UserFeeIncrease}; use crate::state_transition::documents_batch_transition::document_transition::DocumentTransition; use crate::state_transition::documents_batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; use crate::state_transition::documents_batch_transition::DocumentsBatchTransition; @@ -43,6 +43,7 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransition { entropy: [u8; 32], identity_public_key: &IdentityPublicKey, identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, signer: &S, platform_version: &PlatformVersion, batch_feature_version: Option, @@ -63,6 +64,7 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransition { entropy, identity_public_key, identity_contract_nonce, + user_fee_increase, signer, platform_version, batch_feature_version, @@ -84,6 +86,7 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransition { document_type: DocumentTypeRef, identity_public_key: &IdentityPublicKey, identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, signer: &S, platform_version: &PlatformVersion, batch_feature_version: Option, @@ -103,6 +106,7 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransition { document_type, identity_public_key, identity_contract_nonce, + user_fee_increase, signer, platform_version, batch_feature_version, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/v0/mod.rs index 38a3fdf911..ef36e3ce41 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/v0/mod.rs @@ -7,7 +7,7 @@ use crate::identity::signer::Signer; #[cfg(feature = "state-transition-signing")] use crate::identity::IdentityPublicKey; use crate::identity::SecurityLevel; -use crate::prelude::IdentityNonce; +use crate::prelude::{IdentityNonce, UserFeeIncrease}; use crate::state_transition::documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; use crate::state_transition::documents_batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; use crate::state_transition::documents_batch_transition::document_transition::{ @@ -29,6 +29,7 @@ pub trait DocumentsBatchTransitionMethodsV0: DocumentsBatchTransitionAccessorsV0 entropy: [u8; 32], identity_public_key: &IdentityPublicKey, identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, signer: &S, platform_version: &PlatformVersion, batch_feature_version: Option, @@ -42,6 +43,7 @@ pub trait DocumentsBatchTransitionMethodsV0: DocumentsBatchTransitionAccessorsV0 document_type: DocumentTypeRef, identity_public_key: &IdentityPublicKey, identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, signer: &S, platform_version: &PlatformVersion, _batch_feature_version: Option, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/state_transition_like.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/state_transition_like.rs index 463df4ab97..40f051e36a 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/state_transition_like.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/state_transition_like.rs @@ -1,3 +1,4 @@ +use crate::prelude::UserFeeIncrease; use crate::state_transition::documents_batch_transition::DocumentsBatchTransition; use crate::state_transition::{StateTransitionLike, StateTransitionType}; use crate::version::FeatureVersion; @@ -41,6 +42,21 @@ impl StateTransitionLike for DocumentsBatchTransition { } } + /// returns the fee multiplier + fn user_fee_increase(&self) -> UserFeeIncrease { + match self { + DocumentsBatchTransition::V0(transition) => transition.user_fee_increase(), + } + } + /// set a fee multiplier + fn set_user_fee_increase(&mut self, fee_multiplier: UserFeeIncrease) { + match self { + DocumentsBatchTransition::V0(transition) => { + transition.set_user_fee_increase(fee_multiplier) + } + } + } + fn owner_id(&self) -> Identifier { match self { DocumentsBatchTransition::V0(transition) => transition.owner_id(), diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/mod.rs index 47a8917eda..4f301bb452 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/mod.rs @@ -15,6 +15,7 @@ use crate::ProtocolError; use bincode::{Decode, Encode}; use platform_serialization_derive::PlatformSignable; +use crate::prelude::UserFeeIncrease; use platform_value::{BinaryData, Identifier}; #[cfg(feature = "state-transition-serde-conversion")] use serde::{Deserialize, Serialize}; @@ -28,6 +29,7 @@ use serde::{Deserialize, Serialize}; pub struct DocumentsBatchTransitionV0 { pub owner_id: Identifier, pub transitions: Vec, + pub user_fee_increase: UserFeeIncrease, #[platform_signable(exclude_from_sig_hash)] pub signature_public_key_id: KeyID, #[platform_signable(exclude_from_sig_hash)] diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/state_transition_like.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/state_transition_like.rs index a3b2141274..4e7f896ef7 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/state_transition_like.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/state_transition_like.rs @@ -1,3 +1,4 @@ +use crate::prelude::UserFeeIncrease; use crate::state_transition::documents_batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; use crate::state_transition::documents_batch_transition::document_transition::DocumentTransitionV0Methods; use crate::state_transition::documents_batch_transition::{ @@ -60,4 +61,12 @@ impl StateTransitionLike for DocumentsBatchTransitionV0 { }) .collect() } + + fn user_fee_increase(&self) -> UserFeeIncrease { + self.user_fee_increase + } + + fn set_user_fee_increase(&mut self, fee_multiplier: UserFeeIncrease) { + self.user_fee_increase = fee_multiplier + } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs index dac57e5197..7711326a0e 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs @@ -6,10 +6,9 @@ use crate::document::{Document, DocumentV0Getters}; use crate::identity::signer::Signer; #[cfg(feature = "state-transition-signing")] use crate::identity::SecurityLevel; -use crate::prelude::IdentityNonce; #[cfg(feature = "state-transition-signing")] use crate::prelude::IdentityPublicKey; - +use crate::prelude::{IdentityNonce, UserFeeIncrease}; use crate::state_transition::documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; #[cfg(feature = "state-transition-signing")] use crate::state_transition::documents_batch_transition::document_create_transition::DocumentCreateTransition; @@ -47,6 +46,7 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransitionV0 { entropy: [u8; 32], identity_public_key: &IdentityPublicKey, identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, signer: &S, platform_version: &PlatformVersion, _batch_feature_version: Option, @@ -66,6 +66,7 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransitionV0 { let documents_batch_transition: DocumentsBatchTransition = DocumentsBatchTransitionV0 { owner_id, transitions: vec![create_transition.into()], + user_fee_increase, signature_public_key_id: 0, signature: Default::default(), } @@ -85,6 +86,7 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransitionV0 { document_type: DocumentTypeRef, identity_public_key: &IdentityPublicKey, identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, signer: &S, platform_version: &PlatformVersion, _batch_feature_version: Option, @@ -103,6 +105,7 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransitionV0 { let documents_batch_transition: DocumentsBatchTransition = DocumentsBatchTransitionV0 { owner_id, transitions: vec![replace_transition.into()], + user_fee_increase, signature_public_key_id: 0, signature: Default::default(), } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/state_transition_like.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/state_transition_like.rs index 6ef7dc800b..4c4c51d055 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/state_transition_like.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/state_transition_like.rs @@ -1,3 +1,4 @@ +use crate::prelude::UserFeeIncrease; use crate::state_transition::identity_create_transition::IdentityCreateTransition; use crate::state_transition::{StateTransitionLike, StateTransitionType}; use crate::version::FeatureVersion; @@ -41,6 +42,21 @@ impl StateTransitionLike for IdentityCreateTransition { } } + /// returns the fee multiplier + fn user_fee_increase(&self) -> UserFeeIncrease { + match self { + IdentityCreateTransition::V0(transition) => transition.user_fee_increase(), + } + } + /// set a fee multiplier + fn set_user_fee_increase(&mut self, fee_multiplier: UserFeeIncrease) { + match self { + IdentityCreateTransition::V0(transition) => { + transition.set_user_fee_increase(fee_multiplier) + } + } + } + fn owner_id(&self) -> Identifier { match self { IdentityCreateTransition::V0(transition) => transition.owner_id(), diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/mod.rs index 70dba1ee7d..36fba74378 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/mod.rs @@ -19,7 +19,7 @@ use serde::{Deserialize, Serialize}; use crate::identity::state_transition::asset_lock_proof::AssetLockProof; use crate::identity::Identity; -use crate::prelude::Identifier; +use crate::prelude::{Identifier, UserFeeIncrease}; use crate::identity::accessors::IdentityGettersV0; use crate::identity::state_transition::AssetLockProved; @@ -46,6 +46,7 @@ pub struct IdentityCreateTransitionV0 { #[platform_signable(into = "Vec")] pub public_keys: Vec, pub asset_lock_proof: AssetLockProof, + pub user_fee_increase: UserFeeIncrease, #[platform_signable(exclude_from_sig_hash)] pub signature: BinaryData, #[cfg_attr(feature = "state-transition-serde-conversion", serde(skip))] @@ -63,7 +64,7 @@ struct IdentityCreateTransitionV0Inner { public_keys: Vec, asset_lock_proof: AssetLockProof, // Generic identity ST fields - // protocol_version: u32, + user_fee_increase: UserFeeIncrease, signature: BinaryData, } @@ -74,12 +75,14 @@ impl TryFrom for IdentityCreateTransitionV0 { let IdentityCreateTransitionV0Inner { public_keys, asset_lock_proof, + user_fee_increase, signature, } = value; let identity_id = asset_lock_proof.create_identifier()?; Ok(Self { public_keys, asset_lock_proof, + user_fee_increase, signature, identity_id, }) diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/state_transition_like.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/state_transition_like.rs index 9856412851..9aa5ee38a6 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/state_transition_like.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/state_transition_like.rs @@ -1,5 +1,6 @@ use platform_value::BinaryData; +use crate::prelude::UserFeeIncrease; use crate::state_transition::identity_create_transition::IdentityCreateTransition; use crate::{ prelude::Identifier, @@ -54,4 +55,12 @@ impl StateTransitionLike for IdentityCreateTransitionV0 { fn unique_identifiers(&self) -> Vec { vec![base64::encode(self.identity_id)] } + + fn user_fee_increase(&self) -> UserFeeIncrease { + self.user_fee_increase + } + + fn set_user_fee_increase(&mut self, fee_multiplier: UserFeeIncrease) { + self.user_fee_increase = fee_multiplier + } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/state_transition_like.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/state_transition_like.rs index 4ed8e142ad..dd5cede96b 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/state_transition_like.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/state_transition_like.rs @@ -1,3 +1,4 @@ +use crate::prelude::UserFeeIncrease; use crate::state_transition::identity_credit_transfer_transition::IdentityCreditTransferTransition; use crate::state_transition::{StateTransitionLike, StateTransitionType}; use crate::version::FeatureVersion; @@ -43,6 +44,21 @@ impl StateTransitionLike for IdentityCreditTransferTransition { } } + /// returns the fee multiplier + fn user_fee_increase(&self) -> UserFeeIncrease { + match self { + IdentityCreditTransferTransition::V0(transition) => transition.user_fee_increase(), + } + } + /// set a fee multiplier + fn set_user_fee_increase(&mut self, fee_multiplier: UserFeeIncrease) { + match self { + IdentityCreditTransferTransition::V0(transition) => { + transition.set_user_fee_increase(fee_multiplier) + } + } + } + fn owner_id(&self) -> Identifier { match self { IdentityCreditTransferTransition::V0(transition) => transition.owner_id(), diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/v0/mod.rs index 3537591658..b04b6f3f76 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/v0/mod.rs @@ -10,7 +10,7 @@ mod version; use crate::identity::KeyID; -use crate::prelude::{Identifier, IdentityNonce}; +use crate::prelude::{Identifier, IdentityNonce, UserFeeIncrease}; use crate::ProtocolError; use bincode::{Decode, Encode}; @@ -42,6 +42,7 @@ pub struct IdentityCreditTransferTransitionV0 { pub recipient_id: Identifier, pub amount: u64, pub nonce: IdentityNonce, + pub user_fee_increase: UserFeeIncrease, #[platform_signable(exclude_from_sig_hash)] pub signature_public_key_id: KeyID, #[platform_signable(exclude_from_sig_hash)] @@ -79,6 +80,7 @@ mod test { recipient_id: Identifier::random(), amount: rng.gen(), nonce: 1, + user_fee_increase: 0, signature_public_key_id: rng.gen(), signature: [0; 65].to_vec().into(), }; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/v0/state_transition_like.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/v0/state_transition_like.rs index dcff464586..95133643c2 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/v0/state_transition_like.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/v0/state_transition_like.rs @@ -1,5 +1,6 @@ use platform_value::BinaryData; +use crate::prelude::UserFeeIncrease; use crate::{ prelude::Identifier, state_transition::{StateTransitionLike, StateTransitionType}, @@ -58,4 +59,12 @@ impl StateTransitionLike for IdentityCreditTransferTransitionV0 { self.nonce )] } + + fn user_fee_increase(&self) -> UserFeeIncrease { + self.user_fee_increase + } + + fn set_user_fee_increase(&mut self, fee_multiplier: UserFeeIncrease) { + self.user_fee_increase = fee_multiplier + } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/methods/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/methods/mod.rs index 5eba3ea31f..3aaef91f3c 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/methods/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/methods/mod.rs @@ -13,7 +13,7 @@ use crate::identity::Identity; #[cfg(feature = "state-transition-signing")] use crate::identity::core_script::CoreScript; #[cfg(feature = "state-transition-signing")] -use crate::prelude::IdentityNonce; +use crate::prelude::{IdentityNonce, UserFeeIncrease}; #[cfg(feature = "state-transition-signing")] use crate::state_transition::identity_credit_withdrawal_transition::v0::IdentityCreditWithdrawalTransitionV0; #[cfg(feature = "state-transition-signing")] @@ -33,6 +33,7 @@ impl IdentityCreditWithdrawalTransitionMethodsV0 for IdentityCreditWithdrawalTra amount: u64, pooling: Pooling, core_fee_per_byte: u32, + user_fee_increase: UserFeeIncrease, signer: S, nonce: IdentityNonce, platform_version: &PlatformVersion, @@ -50,6 +51,7 @@ impl IdentityCreditWithdrawalTransitionMethodsV0 for IdentityCreditWithdrawalTra amount, pooling, core_fee_per_byte, + user_fee_increase, signer, nonce, platform_version, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/methods/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/methods/v0/mod.rs index 9ed7e264ef..c739eadb0e 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/methods/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/methods/v0/mod.rs @@ -5,7 +5,7 @@ use crate::identity::signer::Signer; #[cfg(feature = "state-transition-signing")] use crate::identity::Identity; #[cfg(feature = "state-transition-signing")] -use crate::prelude::IdentityNonce; +use crate::prelude::{IdentityNonce, UserFeeIncrease}; #[cfg(feature = "state-transition-signing")] use crate::state_transition::StateTransition; use crate::state_transition::StateTransitionType; @@ -24,6 +24,7 @@ pub trait IdentityCreditWithdrawalTransitionMethodsV0 { amount: u64, pooling: Pooling, core_fee_per_byte: u32, + user_fee_increase: UserFeeIncrease, signer: S, nonce: IdentityNonce, _platform_version: &PlatformVersion, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/state_transition_like.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/state_transition_like.rs index 2710ba1ab1..dc21b8c52d 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/state_transition_like.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/state_transition_like.rs @@ -1,3 +1,4 @@ +use crate::prelude::UserFeeIncrease; use crate::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition; use crate::state_transition::{StateTransitionLike, StateTransitionType}; use crate::version::FeatureVersion; @@ -39,6 +40,21 @@ impl StateTransitionLike for IdentityCreditWithdrawalTransition { } } + /// returns the fee multiplier + fn user_fee_increase(&self) -> UserFeeIncrease { + match self { + IdentityCreditWithdrawalTransition::V0(transition) => transition.user_fee_increase(), + } + } + /// set a fee multiplier + fn set_user_fee_increase(&mut self, fee_multiplier: UserFeeIncrease) { + match self { + IdentityCreditWithdrawalTransition::V0(transition) => { + transition.set_user_fee_increase(fee_multiplier) + } + } + } + fn set_signature_bytes(&mut self, signature: Vec) { match self { IdentityCreditWithdrawalTransition::V0(transition) => { diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/mod.rs index f2eceacdfc..2a5246b9ab 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/mod.rs @@ -16,7 +16,7 @@ use platform_value::BinaryData; use serde::{Deserialize, Serialize}; use crate::balances::credits::CREDITS_PER_DUFF; -use crate::prelude::IdentityNonce; +use crate::prelude::{IdentityNonce, UserFeeIncrease}; use crate::{ identity::{core_script::CoreScript, KeyID}, prelude::Identifier, @@ -46,6 +46,7 @@ pub struct IdentityCreditWithdrawalTransitionV0 { pub pooling: Pooling, pub output_script: CoreScript, pub nonce: IdentityNonce, + pub user_fee_increase: UserFeeIncrease, #[platform_signable(exclude_from_sig_hash)] pub signature_public_key_id: KeyID, #[platform_signable(exclude_from_sig_hash)] diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/state_transition_like.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/state_transition_like.rs index d9fce1286e..15c9358967 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/state_transition_like.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/state_transition_like.rs @@ -1,5 +1,6 @@ use platform_value::BinaryData; +use crate::prelude::UserFeeIncrease; use crate::{ prelude::Identifier, state_transition::{StateTransitionLike, StateTransitionType}, @@ -59,4 +60,12 @@ impl StateTransitionLike for IdentityCreditWithdrawalTransitionV0 { self.nonce )] } + + fn user_fee_increase(&self) -> UserFeeIncrease { + self.user_fee_increase + } + + fn set_user_fee_increase(&mut self, fee_multiplier: UserFeeIncrease) { + self.user_fee_increase = fee_multiplier + } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/v0_methods.rs index 4e5ab951c3..8824c15498 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/v0_methods.rs @@ -7,7 +7,7 @@ use crate::identity::signer::Signer; #[cfg(feature = "state-transition-signing")] use crate::identity::{Identity, KeyType, Purpose, SecurityLevel}; #[cfg(feature = "state-transition-signing")] -use crate::prelude::IdentityNonce; +use crate::prelude::{IdentityNonce, UserFeeIncrease}; #[cfg(feature = "state-transition-signing")] use crate::ProtocolError; #[cfg(feature = "state-transition-signing")] @@ -28,6 +28,7 @@ impl IdentityCreditWithdrawalTransitionMethodsV0 for IdentityCreditWithdrawalTra amount: u64, pooling: Pooling, core_fee_per_byte: u32, + user_fee_increase: UserFeeIncrease, signer: S, nonce: IdentityNonce, _platform_version: &PlatformVersion, @@ -40,6 +41,7 @@ impl IdentityCreditWithdrawalTransitionMethodsV0 for IdentityCreditWithdrawalTra pooling, output_script, nonce, + user_fee_increase, signature_public_key_id: 0, signature: Default::default(), } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/methods/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/methods/mod.rs index 32f59f9e4a..243117c294 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/methods/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/methods/mod.rs @@ -5,7 +5,7 @@ pub use v0::*; #[cfg(feature = "state-transition-signing")] use crate::identity::Identity; #[cfg(feature = "state-transition-signing")] -use crate::prelude::AssetLockProof; +use crate::prelude::{AssetLockProof, UserFeeIncrease}; #[cfg(feature = "state-transition-signing")] use crate::state_transition::identity_topup_transition::v0::IdentityTopUpTransitionV0; use crate::state_transition::identity_topup_transition::IdentityTopUpTransition; @@ -25,6 +25,7 @@ impl IdentityTopUpTransitionMethodsV0 for IdentityTopUpTransition { identity: &Identity, asset_lock_proof: AssetLockProof, asset_lock_proof_private_key: &[u8], + user_fee_increase: UserFeeIncrease, platform_version: &PlatformVersion, version: Option, ) -> Result { @@ -38,6 +39,7 @@ impl IdentityTopUpTransitionMethodsV0 for IdentityTopUpTransition { identity, asset_lock_proof, asset_lock_proof_private_key, + user_fee_increase, platform_version, version, )?), diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/methods/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/methods/v0/mod.rs index 4f25e0e407..d314b9325a 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/methods/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/methods/v0/mod.rs @@ -1,7 +1,7 @@ #[cfg(feature = "state-transition-signing")] use crate::identity::Identity; #[cfg(feature = "state-transition-signing")] -use crate::prelude::AssetLockProof; +use crate::prelude::{AssetLockProof, UserFeeIncrease}; #[cfg(feature = "state-transition-signing")] use crate::state_transition::StateTransition; use crate::state_transition::StateTransitionType; @@ -16,6 +16,7 @@ pub trait IdentityTopUpTransitionMethodsV0 { identity: &Identity, asset_lock_proof: AssetLockProof, asset_lock_proof_private_key: &[u8], + user_fee_increase: UserFeeIncrease, platform_version: &PlatformVersion, version: Option, ) -> Result; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/state_transition_like.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/state_transition_like.rs index 6f8ef71baa..ced05743a7 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/state_transition_like.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/state_transition_like.rs @@ -1,3 +1,4 @@ +use crate::prelude::UserFeeIncrease; use crate::state_transition::identity_topup_transition::IdentityTopUpTransition; use crate::state_transition::{StateTransitionLike, StateTransitionType}; use crate::version::FeatureVersion; @@ -41,6 +42,21 @@ impl StateTransitionLike for IdentityTopUpTransition { } } + /// returns the fee multiplier + fn user_fee_increase(&self) -> UserFeeIncrease { + match self { + IdentityTopUpTransition::V0(transition) => transition.user_fee_increase(), + } + } + /// set a fee multiplier + fn set_user_fee_increase(&mut self, fee_multiplier: UserFeeIncrease) { + match self { + IdentityTopUpTransition::V0(transition) => { + transition.set_user_fee_increase(fee_multiplier) + } + } + } + fn owner_id(&self) -> Identifier { match self { IdentityTopUpTransition::V0(transition) => transition.owner_id(), diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/v0/mod.rs index 673eb859e5..8541ad0e7b 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/v0/mod.rs @@ -18,7 +18,7 @@ use serde::{Deserialize, Serialize}; use crate::identity::state_transition::asset_lock_proof::AssetLockProof; -use crate::prelude::Identifier; +use crate::prelude::{Identifier, UserFeeIncrease}; use crate::ProtocolError; @@ -41,6 +41,7 @@ pub struct IdentityTopUpTransitionV0 { // Own ST fields pub asset_lock_proof: AssetLockProof, pub identity_id: Identifier, + pub user_fee_increase: UserFeeIncrease, #[platform_signable(exclude_from_sig_hash)] pub signature: BinaryData, } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/v0/state_transition_like.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/v0/state_transition_like.rs index 4c36f94ec1..a04e462f90 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/v0/state_transition_like.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/v0/state_transition_like.rs @@ -1,5 +1,6 @@ use platform_value::BinaryData; +use crate::prelude::UserFeeIncrease; use crate::state_transition::identity_topup_transition::IdentityTopUpTransition; use crate::{ prelude::Identifier, @@ -65,4 +66,12 @@ impl StateTransitionLike for IdentityTopUpTransitionV0 { } } } + + fn user_fee_increase(&self) -> UserFeeIncrease { + self.user_fee_increase + } + + fn set_user_fee_increase(&mut self, fee_multiplier: UserFeeIncrease) { + self.user_fee_increase = fee_multiplier + } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/v0/v0_methods.rs index 3814262abb..da2b8f680b 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/v0/v0_methods.rs @@ -2,10 +2,10 @@ use crate::identity::accessors::IdentityGettersV0; #[cfg(feature = "state-transition-signing")] use crate::identity::Identity; -#[cfg(feature = "state-transition-signing")] -use crate::prelude::AssetLockProof; use crate::prelude::Identifier; #[cfg(feature = "state-transition-signing")] +use crate::prelude::{AssetLockProof, UserFeeIncrease}; +#[cfg(feature = "state-transition-signing")] use crate::ProtocolError; #[cfg(feature = "state-transition-signing")] use dashcore::signer; @@ -30,12 +30,14 @@ impl IdentityTopUpTransitionMethodsV0 for IdentityTopUpTransitionV0 { identity: &Identity, asset_lock_proof: AssetLockProof, asset_lock_proof_private_key: &[u8], + user_fee_increase: UserFeeIncrease, _platform_version: &PlatformVersion, _version: Option, ) -> Result { let identity_top_up_transition = IdentityTopUpTransitionV0 { asset_lock_proof, identity_id: identity.id(), + user_fee_increase, signature: Default::default(), }; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/v0/value_conversion.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/v0/value_conversion.rs index d1dd35f4c4..46ba75bd23 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/v0/value_conversion.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/v0/value_conversion.rs @@ -11,6 +11,7 @@ use crate::state_transition::identity_topup_transition::fields::*; use crate::state_transition::identity_topup_transition::v0::IdentityTopUpTransitionV0; use crate::state_transition::StateTransitionValueConvert; +use crate::state_transition::state_transitions::common_fields::property_names::USER_FEE_INCREASE; use platform_version::version::PlatformVersion; impl<'a> StateTransitionValueConvert<'a> for IdentityTopUpTransitionV0 { @@ -33,10 +34,16 @@ impl<'a> StateTransitionValueConvert<'a> for IdentityTopUpTransitionV0 { .map_err(ProtocolError::ValueError)?; let asset_lock_proof = AssetLockProof::try_from(raw_asset_lock_proof)?; + let user_fee_increase = raw_object + .get_optional_integer(USER_FEE_INCREASE) + .map_err(ProtocolError::ValueError)? + .unwrap_or_default(); + Ok(IdentityTopUpTransitionV0 { signature, identity_id, asset_lock_proof, + user_fee_increase, }) } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/methods/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/methods/mod.rs index ebc2d1af96..7b5b482cb6 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/methods/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/methods/mod.rs @@ -18,7 +18,7 @@ use crate::version::FeatureVersion; use crate::ProtocolError; #[cfg(feature = "state-transition-signing")] -use crate::prelude::IdentityNonce; +use crate::prelude::{IdentityNonce, UserFeeIncrease}; #[cfg(feature = "state-transition-signing")] use platform_version::version::PlatformVersion; @@ -31,6 +31,7 @@ impl IdentityUpdateTransitionMethodsV0 for IdentityUpdateTransition { disable_public_keys: Vec, public_keys_disabled_at: Option, nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, signer: &S, platform_version: &PlatformVersion, version: Option, @@ -49,6 +50,7 @@ impl IdentityUpdateTransitionMethodsV0 for IdentityUpdateTransition { disable_public_keys, public_keys_disabled_at, nonce, + user_fee_increase, signer, platform_version, version, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/methods/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/methods/v0/mod.rs index 93c8adc3d0..82bbceb7f1 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/methods/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/methods/v0/mod.rs @@ -3,7 +3,7 @@ use crate::identity::signer::Signer; #[cfg(feature = "state-transition-signing")] use crate::identity::{Identity, IdentityPublicKey}; #[cfg(feature = "state-transition-signing")] -use crate::prelude::IdentityNonce; +use crate::prelude::{IdentityNonce, UserFeeIncrease}; #[cfg(feature = "state-transition-signing")] use crate::state_transition::StateTransition; use crate::state_transition::StateTransitionType; @@ -23,6 +23,7 @@ pub trait IdentityUpdateTransitionMethodsV0 { disable_public_keys: Vec, public_keys_disabled_at: Option, nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, signer: &S, platform_version: &PlatformVersion, version: Option, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/state_transition_like.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/state_transition_like.rs index 7b8aaef35b..ccd82e9af9 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/state_transition_like.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/state_transition_like.rs @@ -1,3 +1,4 @@ +use crate::prelude::UserFeeIncrease; use crate::state_transition::identity_update_transition::IdentityUpdateTransition; use crate::state_transition::{StateTransitionLike, StateTransitionType}; use crate::version::FeatureVersion; @@ -41,6 +42,21 @@ impl StateTransitionLike for IdentityUpdateTransition { } } + /// returns the fee multiplier + fn user_fee_increase(&self) -> UserFeeIncrease { + match self { + IdentityUpdateTransition::V0(transition) => transition.user_fee_increase(), + } + } + /// set a fee multiplier + fn set_user_fee_increase(&mut self, fee_multiplier: UserFeeIncrease) { + match self { + IdentityUpdateTransition::V0(transition) => { + transition.set_user_fee_increase(fee_multiplier) + } + } + } + fn owner_id(&self) -> Identifier { match self { IdentityUpdateTransition::V0(transition) => transition.owner_id(), diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/json_conversion.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/json_conversion.rs index 2cdaa09100..6ecab17352 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/json_conversion.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/json_conversion.rs @@ -29,6 +29,7 @@ mod test { add_public_keys: vec![public_key.into()], disable_public_keys: vec![], public_keys_disabled_at: None, + user_fee_increase: 0, signature_public_key_id: 0, signature: BinaryData::new(buffer.to_vec()), } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/mod.rs index c1aa3c0e85..1a00215f53 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/mod.rs @@ -19,7 +19,7 @@ use std::convert::{TryFrom, TryInto}; use crate::state_transition::public_key_in_creation::IdentityPublicKeyInCreation; use crate::state_transition::public_key_in_creation::IdentityPublicKeyInCreationSignable; -use crate::prelude::IdentityNonce; +use crate::prelude::{IdentityNonce, UserFeeIncrease}; use crate::{ identity::KeyID, prelude::{Identifier, Revision, TimestampMillis}, @@ -60,6 +60,9 @@ pub struct IdentityUpdateTransitionV0 { /// Timestamp when keys were disabled pub public_keys_disabled_at: Option, + /// The fee multiplier + pub user_fee_increase: UserFeeIncrease, + /// The ID of the public key used to sing the State Transition #[platform_signable(exclude_from_sig_hash)] pub signature_public_key_id: KeyID, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/state_transition_like.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/state_transition_like.rs index 12e38921b1..8145e1d385 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/state_transition_like.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/state_transition_like.rs @@ -1,5 +1,6 @@ use platform_value::BinaryData; +use crate::prelude::UserFeeIncrease; use crate::{ prelude::Identifier, state_transition::{StateTransitionLike, StateTransitionType}, @@ -58,4 +59,12 @@ impl StateTransitionLike for IdentityUpdateTransitionV0 { self.nonce )] } + + fn user_fee_increase(&self) -> UserFeeIncrease { + self.user_fee_increase + } + + fn set_user_fee_increase(&mut self, fee_multiplier: UserFeeIncrease) { + self.user_fee_increase = fee_multiplier + } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/v0_methods.rs index 87c7c261c9..9d58fafe15 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/v0_methods.rs @@ -19,7 +19,7 @@ use crate::identity::{Identity, IdentityPublicKey}; use crate::identity::accessors::IdentityGettersV0; #[cfg(feature = "state-transition-signing")] use crate::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; -use crate::prelude::IdentityNonce; +use crate::prelude::{IdentityNonce, UserFeeIncrease}; use crate::state_transition::identity_update_transition::accessors::IdentityUpdateTransitionAccessorsV0; use crate::state_transition::identity_update_transition::methods::IdentityUpdateTransitionMethodsV0; use crate::state_transition::identity_update_transition::v0::IdentityUpdateTransitionV0; @@ -45,6 +45,7 @@ impl IdentityUpdateTransitionMethodsV0 for IdentityUpdateTransitionV0 { disable_public_keys: Vec, public_keys_disabled_at: Option, nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, signer: &S, _platform_version: &PlatformVersion, _version: Option, @@ -63,6 +64,7 @@ impl IdentityUpdateTransitionMethodsV0 for IdentityUpdateTransitionV0 { add_public_keys: add_public_keys_in_creation, disable_public_keys, public_keys_disabled_at, + user_fee_increase, }; let state_transition: StateTransition = identity_update_transition.clone().into(); diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/value_conversion.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/value_conversion.rs index abe58de381..2af88151d8 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/value_conversion.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/value_conversion.rs @@ -9,7 +9,9 @@ use crate::state_transition::identity_update_transition::v0::{ use crate::state_transition::public_key_in_creation::IdentityPublicKeyInCreation; use crate::state_transition::StateTransitionValueConvert; -use crate::state_transition::state_transitions::common_fields::property_names::NONCE; +use crate::state_transition::state_transitions::common_fields::property_names::{ + NONCE, USER_FEE_INCREASE, +}; use platform_version::version::PlatformVersion; impl<'a> StateTransitionValueConvert<'a> for IdentityUpdateTransitionV0 { @@ -33,6 +35,10 @@ impl<'a> StateTransitionValueConvert<'a> for IdentityUpdateTransitionV0 { let nonce = raw_object .get_integer(NONCE) .map_err(ProtocolError::ValueError)?; + let user_fee_increase = raw_object + .get_optional_integer(USER_FEE_INCREASE) + .map_err(ProtocolError::ValueError)? + .unwrap_or_default(); let add_public_keys = raw_object .remove_optional_array(property_names::ADD_PUBLIC_KEYS) .map_err(ProtocolError::ValueError)? @@ -55,6 +61,7 @@ impl<'a> StateTransitionValueConvert<'a> for IdentityUpdateTransitionV0 { add_public_keys, disable_public_keys, public_keys_disabled_at, + user_fee_increase, }) } diff --git a/packages/rs-dpp/src/state_transition/traits/state_transition_like.rs b/packages/rs-dpp/src/state_transition/traits/state_transition_like.rs index efed047cd4..a1d78449be 100644 --- a/packages/rs-dpp/src/state_transition/traits/state_transition_like.rs +++ b/packages/rs-dpp/src/state_transition/traits/state_transition_like.rs @@ -2,7 +2,7 @@ use std::fmt::Debug; use platform_value::BinaryData; -use crate::prelude::Identifier; +use crate::prelude::{Identifier, UserFeeIncrease}; use crate::version::FeatureVersion; use crate::state_transition::StateTransitionType; @@ -37,6 +37,10 @@ pub trait StateTransitionLike: fn signature(&self) -> &BinaryData; /// set a new signature fn set_signature(&mut self, signature: BinaryData); + /// returns the fee multiplier + fn user_fee_increase(&self) -> UserFeeIncrease; + /// set a fee multiplier + fn set_user_fee_increase(&mut self, fee_multiplier: UserFeeIncrease); /// get modified ids list fn modified_data_ids(&self) -> Vec; diff --git a/packages/rs-drive-abci/src/abci/handler/check_tx.rs b/packages/rs-drive-abci/src/abci/handler/check_tx.rs index 93de303577..da8dfff55d 100644 --- a/packages/rs-drive-abci/src/abci/handler/check_tx.rs +++ b/packages/rs-drive-abci/src/abci/handler/check_tx.rs @@ -60,7 +60,7 @@ where gas_wanted: gas_wanted as SignedCredits, codespace: "".to_string(), sender: first_unique_identifier, - priority: 0, + priority: check_tx_result.priority as i64, }) } Err(error) => { diff --git a/packages/rs-drive-abci/src/execution/check_tx/mod.rs b/packages/rs-drive-abci/src/execution/check_tx/mod.rs index 73d1bf379d..354fed2eab 100644 --- a/packages/rs-drive-abci/src/execution/check_tx/mod.rs +++ b/packages/rs-drive-abci/src/execution/check_tx/mod.rs @@ -64,6 +64,9 @@ pub struct CheckTxResult { /// reject the transition. All transitions return only 1 unique identifier except the documents /// batch transition that returns 1 for each document transition pub unique_identifiers: Vec, + /// Priority to return to tenderdash. State Transitions with higher priority take precedence + /// over state transitions with lower priority + pub priority: u32, } impl Platform diff --git a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs index bdda71fac8..4ad51c685e 100644 --- a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs @@ -109,6 +109,8 @@ where let unique_identifiers = state_transition.unique_identifiers(); + let priority = state_transition.user_fee_increase() as u32 * 100; + let validation_result = state_transition_to_execution_event_for_check_tx( &platform_ref, state_transition, @@ -129,6 +131,7 @@ where level: check_tx_level, fee_result: Some(fee_result), unique_identifiers, + priority, }) }) } else { @@ -136,6 +139,7 @@ where level: check_tx_level, fee_result: None, unique_identifiers, + priority, })) } }) @@ -376,7 +380,140 @@ mod tests { let transaction = platform.drive.grove.start_transaction(); + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![serialized.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 2604790); + + let check_result = platform + .check_tx( + serialized.as_slice(), + Recheck, + &platform_state, + platform_version, + ) + .expect("expected to check tx"); + + assert!(check_result.is_valid()); // it should still be valid, because we didn't commit the transaction + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit"); + + let check_result = platform + .check_tx( + serialized.as_slice(), + Recheck, + &platform_state, + platform_version, + ) + .expect("expected to check tx"); + + assert!(check_result.is_valid()); // it should still be valid, because we don't validate state + } + + #[test] + fn data_contract_create_check_tx_priority() { + let mut platform = TestPlatformBuilder::new() + .with_config(PlatformConfig::default()) + .build_with_mock_rpc(); + platform + .core_rpc + .expect_verify_instant_lock() + .returning(|_, _| Ok(true)); + + let platform_state = platform.state.load(); + let protocol_version = platform_state.current_protocol_version_in_consensus(); + let platform_version = PlatformVersion::get(protocol_version).unwrap(); + + let (key, private_key) = IdentityPublicKey::random_ecdsa_critical_level_authentication_key( + 1, + Some(1), + platform_version, + ) + .expect("expected to get key pair"); + + platform + .drive + .create_initial_state_structure(None, platform_version) + .expect("expected to create state structure"); + let identity: Identity = IdentityV0 { + id: Identifier::new([ + 158, 113, 180, 126, 91, 83, 62, 44, 83, 54, 97, 88, 240, 215, 84, 139, 167, 156, + 166, 203, 222, 4, 64, 31, 215, 199, 149, 151, 190, 246, 251, 44, + ]), + public_keys: BTreeMap::from([(1, key.clone())]), + balance: 1000000000, + revision: 0, + } + .into(); + + let dashpay = get_dashpay_contract_fixture(Some(identity.id()), 1, protocol_version); + let mut create_contract_state_transition: StateTransition = dashpay + .try_into_platform_versioned(platform_version) + .expect("expected a state transition"); + + create_contract_state_transition.set_user_fee_increase(100); // This means that things will be twice as expensive + + create_contract_state_transition + .sign(&key, private_key.as_slice(), &NativeBlsModule) + .expect("expected to sign transition"); + let serialized = create_contract_state_transition + .serialize_to_bytes() + .expect("serialized state transition"); + platform + .drive + .add_new_identity( + identity, + false, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to insert identity"); + + let validation_result = platform + .check_tx( + serialized.as_slice(), + FirstTimeCheck, + &platform_state, + platform_version, + ) + .expect("expected to check tx"); + + assert!(validation_result.errors.is_empty()); + + assert_eq!(validation_result.data.unwrap().priority, 10000); + + let check_result = platform + .check_tx( + serialized.as_slice(), + Recheck, + &platform_state, + platform_version, + ) + .expect("expected to check tx"); + + assert!(check_result.is_valid()); + + assert_eq!(check_result.data.unwrap().priority, 10000); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform .platform .process_raw_state_transitions( &vec![serialized.clone()], @@ -387,6 +524,13 @@ mod tests { ) .expect("expected to process state transition"); + // The processing fees should be twice as much as a fee multiplier of 0, + // since a fee multiplier of 100 means 100% more of 1 (gives 2) + assert_eq!( + processing_result.aggregated_fees().processing_fee, + 2604790 * 2 + ); + let check_result = platform .check_tx( serialized.as_slice(), @@ -398,6 +542,8 @@ mod tests { assert!(check_result.is_valid()); // it should still be valid, because we didn't commit the transaction + assert_eq!(check_result.data.unwrap().priority, 10000); + platform .drive .grove @@ -415,6 +561,8 @@ mod tests { .expect("expected to check tx"); assert!(check_result.is_valid()); // it should still be valid, because we don't validate state + + assert_eq!(check_result.data.unwrap().priority, 10000); } #[test] @@ -649,6 +797,7 @@ mod tests { entropy.0, &key, 1, + 0, &signer, platform_version, None, @@ -667,6 +816,7 @@ mod tests { profile, &key, 2, + 0, &signer, platform_version, None, @@ -813,6 +963,7 @@ mod tests { &identity, asset_lock_proof_top_up, pk.as_slice(), + 0, platform_version, None, ) @@ -942,6 +1093,7 @@ mod tests { &identity, asset_lock_proof_top_up, pk.as_slice(), + 0, platform_version, None, ) @@ -1074,6 +1226,7 @@ mod tests { &identity, asset_lock_proof_top_up, pk.as_slice(), + 0, platform_version, None, ) @@ -1194,6 +1347,7 @@ mod tests { &identity, asset_lock_proof_top_up.clone(), pk.as_slice(), + 0, platform_version, None, ) @@ -1380,6 +1534,7 @@ mod tests { add_public_keys: vec![IdentityPublicKeyInCreation::V0(new_key)], disable_public_keys: vec![], public_keys_disabled_at: None, + user_fee_increase: 0, signature_public_key_id: 1, signature: Default::default(), } @@ -1492,6 +1647,7 @@ mod tests { add_public_keys: vec![IdentityPublicKeyInCreation::V0(new_key.clone())], disable_public_keys: vec![], public_keys_disabled_at: None, + user_fee_increase: 0, signature_public_key_id: 0, signature: Default::default(), } @@ -1516,6 +1672,7 @@ mod tests { add_public_keys: vec![IdentityPublicKeyInCreation::V0(new_key)], disable_public_keys: vec![], public_keys_disabled_at: None, + user_fee_increase: 0, signature_public_key_id: 0, signature: Default::default(), } diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_start/clear_drive_block_cache/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_start/clear_drive_block_cache/v0/mod.rs index d988eb34c7..06750ab6e0 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/block_start/clear_drive_block_cache/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/block_start/clear_drive_block_cache/v0/mod.rs @@ -11,8 +11,7 @@ where pub(super) fn clear_drive_block_cache_v0(&self) { self.drive.cache.data_contracts.clear_block_cache(); - let mut protocol_versions_counter = - self.drive.cache.protocol_versions_counter.write(); + let mut protocol_versions_counter = self.drive.cache.protocol_versions_counter.write(); protocol_versions_counter.clear_block_cache() } diff --git a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/execute_event/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/execute_event/v0/mod.rs index c5cc4e1a01..929fff2092 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/execute_event/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/execute_event/v0/mod.rs @@ -56,12 +56,14 @@ where identity, operations, execution_operations, + user_fee_increase, .. } | ExecutionEvent::PaidDriveEvent { identity, operations, execution_operations, + user_fee_increase, .. } => { if fee_validation_result.is_valid_with_data() { @@ -84,6 +86,8 @@ where platform_version, )?; + individual_fee_result.apply_user_fee_increase(user_fee_increase); + let balance_change = individual_fee_result.into_balance_change(identity.id); let outcome = self.drive.apply_balance_change_from_fee_to_identity( diff --git a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/validate_fees_of_event/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/validate_fees_of_event/v0/mod.rs index be0d150f59..f1e4106fea 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/validate_fees_of_event/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/validate_fees_of_event/v0/mod.rs @@ -48,6 +48,7 @@ where added_balance, operations, execution_operations, + user_fee_increase, } => { let previous_balance = identity.balance.ok_or(Error::Execution( ExecutionError::CorruptedCodeExecution("partial identity info with no balance"), @@ -71,6 +72,8 @@ where platform_version, )?; + estimated_fee_result.apply_user_fee_increase(*user_fee_increase); + // TODO: Should take into account refunds as well let total_fee = estimated_fee_result.total_base_fee(); if previous_balance_with_top_up >= total_fee { @@ -96,6 +99,7 @@ where removed_balance, operations, execution_operations, + user_fee_increase, } => { let balance = identity.balance.ok_or(Error::Execution( ExecutionError::CorruptedCodeExecution("partial identity info with no balance"), @@ -120,6 +124,8 @@ where platform_version, )?; + estimated_fee_result.apply_user_fee_increase(*user_fee_increase); + // TODO: Should take into account refunds as well let required_balance = estimated_fee_result.total_base_fee(); if balance_after_principal_operation >= required_balance { diff --git a/packages/rs-drive-abci/src/execution/types/execution_event/mod.rs b/packages/rs-drive-abci/src/execution/types/execution_event/mod.rs index 6ff45363d5..f09a669c30 100644 --- a/packages/rs-drive-abci/src/execution/types/execution_event/mod.rs +++ b/packages/rs-drive-abci/src/execution/types/execution_event/mod.rs @@ -9,6 +9,7 @@ use dpp::block::epoch::Epoch; use dpp::fee::Credits; use dpp::identity::PartialIdentity; +use dpp::prelude::UserFeeIncrease; use dpp::version::PlatformVersion; use drive::state_transition_action::StateTransitionAction; @@ -33,6 +34,8 @@ pub(in crate::execution) enum ExecutionEvent<'a> { operations: Vec>, /// the execution operations that we must also pay for execution_operations: Vec, + /// the fee multiplier that the user agreed to, 0 means 100% of the base fee, 1 means 101% + user_fee_increase: UserFeeIncrease, }, /// A drive event that is paid from an asset lock PaidFromAssetLockDriveEvent { @@ -44,6 +47,8 @@ pub(in crate::execution) enum ExecutionEvent<'a> { operations: Vec>, /// the execution operations that we must also pay for execution_operations: Vec, + /// the fee multiplier that the user agreed to, 0 means 100% of the base fee, 1 means 101% + user_fee_increase: UserFeeIncrease, }, /// A drive event that is free FreeDriveEvent { @@ -62,6 +67,7 @@ impl<'a> ExecutionEvent<'a> { ) -> Result { match &action { StateTransitionAction::IdentityCreateAction(identity_create_action) => { + let user_fee_increase = identity_create_action.user_fee_increase(); let identity = identity_create_action.into(); let operations = action.into_high_level_drive_operations(epoch, platform_version)?; @@ -70,9 +76,11 @@ impl<'a> ExecutionEvent<'a> { added_balance: 0, operations, execution_operations: execution_context.operations_consume(), + user_fee_increase, }) } StateTransitionAction::IdentityTopUpAction(identity_top_up_action) => { + let user_fee_increase = identity_top_up_action.user_fee_increase(); let added_balance = identity_top_up_action.top_up_balance_amount(); let operations = action.into_high_level_drive_operations(epoch, platform_version)?; @@ -82,6 +90,7 @@ impl<'a> ExecutionEvent<'a> { added_balance, operations, execution_operations: execution_context.operations_consume(), + user_fee_increase, }) } else { Err(Error::Execution(ExecutionError::CorruptedCodeExecution( @@ -90,6 +99,7 @@ impl<'a> ExecutionEvent<'a> { } } StateTransitionAction::IdentityCreditWithdrawalAction(identity_credit_withdrawal) => { + let user_fee_increase = identity_credit_withdrawal.user_fee_increase(); let removed_balance = identity_credit_withdrawal.amount(); let operations = action.into_high_level_drive_operations(epoch, platform_version)?; @@ -99,6 +109,7 @@ impl<'a> ExecutionEvent<'a> { removed_balance: Some(removed_balance), operations, execution_operations: execution_context.operations_consume(), + user_fee_increase, }) } else { Err(Error::Execution(ExecutionError::CorruptedCodeExecution( @@ -107,6 +118,7 @@ impl<'a> ExecutionEvent<'a> { } } StateTransitionAction::IdentityCreditTransferAction(identity_credit_transfer) => { + let user_fee_increase = identity_credit_transfer.user_fee_increase(); let removed_balance = identity_credit_transfer.transfer_amount(); let operations = action.into_high_level_drive_operations(epoch, platform_version)?; @@ -116,6 +128,7 @@ impl<'a> ExecutionEvent<'a> { removed_balance: Some(removed_balance), operations, execution_operations: execution_context.operations_consume(), + user_fee_increase, }) } else { Err(Error::Execution(ExecutionError::CorruptedCodeExecution( @@ -124,6 +137,7 @@ impl<'a> ExecutionEvent<'a> { } } _ => { + let user_fee_increase = action.user_fee_increase(); let operations = action.into_high_level_drive_operations(epoch, platform_version)?; if let Some(identity) = identity { @@ -132,6 +146,7 @@ impl<'a> ExecutionEvent<'a> { removed_balance: None, operations, execution_operations: execution_context.operations_consume(), + user_fee_increase, }) } else { Err(Error::Execution(ExecutionError::CorruptedCodeExecution( diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs index 9ce2c7c2e3..008e292a09 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs @@ -178,6 +178,7 @@ mod tests { platform_version, ) .expect("to be able to convert data contract to serialization format"), + user_fee_increase: 0, signature: BinaryData::new(vec![0; 65]), signature_public_key_id: 0, }; @@ -258,6 +259,7 @@ mod tests { platform_version, ) .expect("to be able to convert data contract to serialization format"), + user_fee_increase: 0, signature: BinaryData::new(vec![0; 65]), signature_public_key_id: 0, }; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs index 1652427b3d..ac3ccabd4b 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs @@ -91,6 +91,7 @@ impl DocumentsBatchStateTransitionStateValidationV0 for DocumentsBatchTransition ), ))?, owner_id, + state_transition_action.user_fee_increase(), )?, ), ); @@ -131,6 +132,7 @@ impl DocumentsBatchStateTransitionStateValidationV0 for DocumentsBatchTransition ), ))?, owner_id, + state_transition_action.user_fee_increase(), )?, )); } else { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs index 06dab8e893..8ba97782e9 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs @@ -103,6 +103,7 @@ impl DocumentsBatchTransitionTransformerV0 for DocumentsBatchTransition { execution_context: &mut StateTransitionExecutionContext, ) -> Result, Error> { let owner_id = self.owner_id(); + let user_fee_increase = self.user_fee_increase(); let platform_version = platform.state.current_platform_version()?; let mut transitions_by_contracts_and_types: BTreeMap< &Identifier, @@ -155,6 +156,7 @@ impl DocumentsBatchTransitionTransformerV0 for DocumentsBatchTransition { let batch_transition_action = DocumentsBatchTransitionActionV0 { owner_id, transitions: validation_result.into_data()?, + user_fee_increase, } .into(); Ok(ConsensusValidationResult::new_with_data( diff --git a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs index b223aa3552..b419637495 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs @@ -484,6 +484,7 @@ impl NetworkStrategy { &identity, 1, //key id 1 should always be a high or critical auth key in these tests *identity_contract_nonce, + 0, signer, platform_version, None, @@ -572,6 +573,7 @@ impl NetworkStrategy { DocumentsBatchTransitionV0 { owner_id: identity.id(), transitions: vec![document_create_transition.into()], + user_fee_increase: 0, signature_public_key_id: 0, signature: BinaryData::default(), } @@ -686,6 +688,7 @@ impl NetworkStrategy { DocumentsBatchTransitionV0 { owner_id: identity.id(), transitions: vec![document_create_transition.into()], + user_fee_increase: 0, signature_public_key_id: 0, signature: BinaryData::default(), } @@ -784,6 +787,7 @@ impl NetworkStrategy { DocumentsBatchTransitionV0 { owner_id: identity.id, transitions: vec![document_delete_transition.into()], + user_fee_increase: 0, signature_public_key_id: 0, signature: BinaryData::default(), } @@ -884,6 +888,7 @@ impl NetworkStrategy { DocumentsBatchTransitionV0 { owner_id: identity.id, transitions: vec![document_replace_transition.into()], + user_fee_increase: 0, signature_public_key_id: 0, signature: BinaryData::default(), } @@ -1126,6 +1131,7 @@ impl NetworkStrategy { identity, asset_lock_proof, secret_key.as_ref(), + 0, platform_version, None, ) diff --git a/packages/rs-drive/src/state_transition_action/contract/data_contract_create/mod.rs b/packages/rs-drive/src/state_transition_action/contract/data_contract_create/mod.rs index 8cd8754991..f34eca7070 100644 --- a/packages/rs-drive/src/state_transition_action/contract/data_contract_create/mod.rs +++ b/packages/rs-drive/src/state_transition_action/contract/data_contract_create/mod.rs @@ -6,7 +6,7 @@ pub mod v0; use crate::state_transition_action::contract::data_contract_create::v0::DataContractCreateTransitionActionV0; use derive_more::From; use dpp::data_contract::DataContract; -use dpp::prelude::IdentityNonce; +use dpp::prelude::{IdentityNonce, UserFeeIncrease}; /// data contract create transition action #[derive(Debug, Clone, From)] @@ -35,4 +35,11 @@ impl DataContractCreateTransitionAction { DataContractCreateTransitionAction::V0(transition) => transition.identity_nonce, } } + + /// fee multiplier + pub fn user_fee_increase(&self) -> UserFeeIncrease { + match self { + DataContractCreateTransitionAction::V0(transition) => transition.user_fee_increase, + } + } } diff --git a/packages/rs-drive/src/state_transition_action/contract/data_contract_create/v0/mod.rs b/packages/rs-drive/src/state_transition_action/contract/data_contract_create/v0/mod.rs index 955583b913..2bcde179d6 100644 --- a/packages/rs-drive/src/state_transition_action/contract/data_contract_create/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/contract/data_contract_create/v0/mod.rs @@ -2,7 +2,7 @@ pub mod transformer; use dpp::data_contract::DataContract; -use dpp::prelude::IdentityNonce; +use dpp::prelude::{IdentityNonce, UserFeeIncrease}; /// data contract create transition action v0 #[derive(Debug, Clone)] @@ -11,4 +11,6 @@ pub struct DataContractCreateTransitionActionV0 { pub data_contract: DataContract, /// identity nonce pub identity_nonce: IdentityNonce, + /// fee multiplier + pub user_fee_increase: UserFeeIncrease, } diff --git a/packages/rs-drive/src/state_transition_action/contract/data_contract_create/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/contract/data_contract_create/v0/transformer.rs index 01851b398b..9291d78737 100644 --- a/packages/rs-drive/src/state_transition_action/contract/data_contract_create/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/contract/data_contract_create/v0/transformer.rs @@ -21,6 +21,7 @@ impl TryFromPlatformVersioned platform_version, )?, identity_nonce: value.identity_nonce, + user_fee_increase: value.user_fee_increase, }) } } @@ -41,6 +42,7 @@ impl TryFromPlatformVersioned<&DataContractCreateTransitionV0> platform_version, )?, identity_nonce: value.identity_nonce, + user_fee_increase: value.user_fee_increase, }) } } diff --git a/packages/rs-drive/src/state_transition_action/contract/data_contract_update/mod.rs b/packages/rs-drive/src/state_transition_action/contract/data_contract_update/mod.rs index 525bb12833..3ea424e0e6 100644 --- a/packages/rs-drive/src/state_transition_action/contract/data_contract_update/mod.rs +++ b/packages/rs-drive/src/state_transition_action/contract/data_contract_update/mod.rs @@ -6,7 +6,7 @@ pub mod v0; use crate::state_transition_action::contract::data_contract_update::v0::DataContractUpdateTransitionActionV0; use derive_more::From; use dpp::data_contract::DataContract; -use dpp::prelude::IdentityNonce; +use dpp::prelude::{IdentityNonce, UserFeeIncrease}; /// data contract update transition action #[derive(Debug, Clone, From)] @@ -37,4 +37,11 @@ impl DataContractUpdateTransitionAction { } } } + + /// fee multiplier + pub fn user_fee_increase(&self) -> UserFeeIncrease { + match self { + DataContractUpdateTransitionAction::V0(transition) => transition.user_fee_increase, + } + } } diff --git a/packages/rs-drive/src/state_transition_action/contract/data_contract_update/v0/mod.rs b/packages/rs-drive/src/state_transition_action/contract/data_contract_update/v0/mod.rs index 84e8bce987..5b3bfca097 100644 --- a/packages/rs-drive/src/state_transition_action/contract/data_contract_update/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/contract/data_contract_update/v0/mod.rs @@ -2,7 +2,7 @@ pub mod transformer; use dpp::data_contract::DataContract; -use dpp::prelude::IdentityNonce; +use dpp::prelude::{IdentityNonce, UserFeeIncrease}; /// data contract update transition action v0 #[derive(Debug, Clone)] @@ -11,4 +11,6 @@ pub struct DataContractUpdateTransitionActionV0 { pub data_contract: DataContract, /// identity contract nonce pub identity_contract_nonce: IdentityNonce, + /// fee multiplier + pub user_fee_increase: UserFeeIncrease, } diff --git a/packages/rs-drive/src/state_transition_action/contract/data_contract_update/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/contract/data_contract_update/v0/transformer.rs index ecbad8494f..009da92b40 100644 --- a/packages/rs-drive/src/state_transition_action/contract/data_contract_update/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/contract/data_contract_update/v0/transformer.rs @@ -21,6 +21,7 @@ impl TryFromPlatformVersioned platform_version, )?, identity_contract_nonce: value.identity_contract_nonce, + user_fee_increase: value.user_fee_increase, }) } } @@ -41,6 +42,7 @@ impl TryFromPlatformVersioned<&DataContractUpdateTransitionV0> platform_version, )?, identity_contract_nonce: value.identity_contract_nonce, + user_fee_increase: value.user_fee_increase, }) } } diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/mod.rs index db1ff2017b..d6581cd9d1 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/mod.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/mod.rs @@ -5,6 +5,7 @@ use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::identity::SecurityLevel; use dpp::platform_value::Identifier; +use dpp::prelude::UserFeeIncrease; use dpp::ProtocolError; use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; @@ -62,6 +63,13 @@ impl DocumentsBatchTransitionAction { DocumentsBatchTransitionAction::V0(v0) => v0.transitions = transitions, } } + + /// fee multiplier + pub fn user_fee_increase(&self) -> UserFeeIncrease { + match self { + DocumentsBatchTransitionAction::V0(transition) => transition.user_fee_increase, + } + } } impl DocumentsBatchTransitionAction { diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/v0/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/v0/mod.rs index 62689f8607..6fef9bd853 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/v0/mod.rs @@ -1,5 +1,6 @@ use crate::state_transition_action::document::documents_batch::document_transition::DocumentTransitionAction; use dpp::identifier::Identifier; +use dpp::prelude::UserFeeIncrease; /// action v0 #[derive(Default, Debug, Clone)] @@ -8,4 +9,6 @@ pub struct DocumentsBatchTransitionActionV0 { pub owner_id: Identifier, /// The inner transitions pub transitions: Vec, + /// fee multiplier + pub user_fee_increase: UserFeeIncrease, } diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_create/mod.rs b/packages/rs-drive/src/state_transition_action/identity/identity_create/mod.rs index bafaaeca53..c2c978ca99 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_create/mod.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_create/mod.rs @@ -9,6 +9,7 @@ use crate::state_transition_action::identity::identity_create::v0::{ use derive_more::From; use dpp::identity::{Identity, IdentityPublicKey, PartialIdentity}; use dpp::platform_value::{Bytes36, Identifier}; +use dpp::prelude::UserFeeIncrease; use dpp::version::PlatformVersion; use dpp::ProtocolError; @@ -48,6 +49,13 @@ impl IdentityCreateTransitionAction { IdentityCreateTransitionAction::V0(action) => action.asset_lock_outpoint, } } + + /// fee multiplier + pub fn user_fee_increase(&self) -> UserFeeIncrease { + match self { + IdentityCreateTransitionAction::V0(transition) => transition.user_fee_increase, + } + } } impl From for PartialIdentity { diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_create/v0/mod.rs b/packages/rs-drive/src/state_transition_action/identity/identity_create/v0/mod.rs index e3b7115293..4abd643ff9 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_create/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_create/v0/mod.rs @@ -7,6 +7,7 @@ use dpp::identity::{IdentityPublicKey, IdentityV0, PartialIdentity}; use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; use dpp::identity::Identity; use dpp::platform_value::Bytes36; +use dpp::prelude::UserFeeIncrease; use dpp::version::PlatformVersion; use dpp::ProtocolError; use serde::{Deserialize, Serialize}; @@ -23,6 +24,8 @@ pub struct IdentityCreateTransitionActionV0 { pub identity_id: Identifier, /// asset lock outpoint pub asset_lock_outpoint: Bytes36, + /// fee multiplier + pub user_fee_increase: UserFeeIncrease, } impl From for PartialIdentity { diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_create/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/identity/identity_create/v0/transformer.rs index c41f188bbc..5a7880a477 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_create/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_create/v0/transformer.rs @@ -36,6 +36,7 @@ impl IdentityCreateTransitionActionV0 { initial_balance_amount, identity_id, asset_lock_outpoint: Bytes36::new(outpoint_bytes), + user_fee_increase: value.user_fee_increase, }) } @@ -66,6 +67,7 @@ impl IdentityCreateTransitionActionV0 { initial_balance_amount, identity_id: *identity_id, asset_lock_outpoint: Bytes36::new(outpoint_bytes), + user_fee_increase: value.user_fee_increase, }) } } diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_credit_transfer/mod.rs b/packages/rs-drive/src/state_transition_action/identity/identity_credit_transfer/mod.rs index 44bb92d031..01dabf088d 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_credit_transfer/mod.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_credit_transfer/mod.rs @@ -7,7 +7,7 @@ use crate::state_transition_action::identity::identity_credit_transfer::v0::Iden use derive_more::From; use dpp::fee::Credits; use dpp::platform_value::Identifier; -use dpp::prelude::IdentityNonce; +use dpp::prelude::{IdentityNonce, UserFeeIncrease}; /// action #[derive(Debug, Clone, From)] @@ -44,4 +44,11 @@ impl IdentityCreditTransferTransitionAction { IdentityCreditTransferTransitionAction::V0(transition) => transition.recipient_id, } } + + /// fee multiplier + pub fn user_fee_increase(&self) -> UserFeeIncrease { + match self { + IdentityCreditTransferTransitionAction::V0(transition) => transition.user_fee_increase, + } + } } diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_credit_transfer/v0/mod.rs b/packages/rs-drive/src/state_transition_action/identity/identity_credit_transfer/v0/mod.rs index b850805b35..9ee87543cb 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_credit_transfer/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_credit_transfer/v0/mod.rs @@ -2,7 +2,7 @@ mod transformer; use dpp::fee::Credits; use dpp::platform_value::Identifier; -use dpp::prelude::IdentityNonce; +use dpp::prelude::{IdentityNonce, UserFeeIncrease}; use serde::{Deserialize, Serialize}; /// action v0 @@ -17,4 +17,6 @@ pub struct IdentityCreditTransferTransitionActionV0 { pub identity_id: Identifier, /// nonce pub nonce: IdentityNonce, + /// fee multiplier + pub user_fee_increase: UserFeeIncrease, } diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_credit_transfer/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/identity/identity_credit_transfer/v0/transformer.rs index 356147f1f5..72f79a34d6 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_credit_transfer/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_credit_transfer/v0/transformer.rs @@ -8,6 +8,7 @@ impl From for IdentityCreditTransferTransiti recipient_id, amount, nonce, + user_fee_increase, .. } = value; IdentityCreditTransferTransitionActionV0 { @@ -15,6 +16,7 @@ impl From for IdentityCreditTransferTransiti recipient_id, transfer_amount: amount, nonce, + user_fee_increase, } } } @@ -26,6 +28,7 @@ impl From<&IdentityCreditTransferTransitionV0> for IdentityCreditTransferTransit recipient_id, amount, nonce, + user_fee_increase, .. } = value; IdentityCreditTransferTransitionActionV0 { @@ -33,6 +36,7 @@ impl From<&IdentityCreditTransferTransitionV0> for IdentityCreditTransferTransit recipient_id: *recipient_id, transfer_amount: *amount, nonce: *nonce, + user_fee_increase: *user_fee_increase, } } } diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/mod.rs b/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/mod.rs index 08f4a46eff..ef579b4d5c 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/mod.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/mod.rs @@ -8,7 +8,7 @@ use derive_more::From; use dpp::document::Document; use dpp::platform_value::Identifier; -use dpp::prelude::IdentityNonce; +use dpp::prelude::{IdentityNonce, UserFeeIncrease}; /// action #[derive(Debug, Clone, From)] @@ -56,4 +56,13 @@ impl IdentityCreditWithdrawalTransitionAction { } } } + + /// fee multiplier + pub fn user_fee_increase(&self) -> UserFeeIncrease { + match self { + IdentityCreditWithdrawalTransitionAction::V0(transition) => { + transition.user_fee_increase + } + } + } } diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/mod.rs b/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/mod.rs index 858a08122d..0e1be9120c 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/mod.rs @@ -2,7 +2,7 @@ mod transformer; use dpp::document::Document; use dpp::identifier::Identifier; -use dpp::prelude::IdentityNonce; +use dpp::prelude::{IdentityNonce, UserFeeIncrease}; use serde::{Deserialize, Serialize}; @@ -18,4 +18,6 @@ pub struct IdentityCreditWithdrawalTransitionActionV0 { pub prepared_withdrawal_document: Document, /// amount pub amount: u64, + /// fee multiplier + pub user_fee_increase: UserFeeIncrease, } diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs index 90ec624839..b1d352b97e 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs @@ -47,6 +47,7 @@ impl IdentityCreditWithdrawalTransitionActionV0 { nonce: identity_credit_withdrawal.nonce, prepared_withdrawal_document: withdrawal_document, amount: identity_credit_withdrawal.amount, + user_fee_increase: identity_credit_withdrawal.user_fee_increase, } } } diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_topup/mod.rs b/packages/rs-drive/src/state_transition_action/identity/identity_topup/mod.rs index 0743a68fb0..b9900811c4 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_topup/mod.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_topup/mod.rs @@ -7,6 +7,7 @@ use crate::state_transition_action::identity::identity_topup::v0::IdentityTopUpT use derive_more::From; use dpp::platform_value::{Bytes36, Identifier}; +use dpp::prelude::UserFeeIncrease; /// action #[derive(Debug, Clone, From)] @@ -36,4 +37,11 @@ impl IdentityTopUpTransitionAction { IdentityTopUpTransitionAction::V0(action) => action.asset_lock_outpoint, } } + + /// fee multiplier + pub fn user_fee_increase(&self) -> UserFeeIncrease { + match self { + IdentityTopUpTransitionAction::V0(transition) => transition.user_fee_increase, + } + } } diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_topup/v0/mod.rs b/packages/rs-drive/src/state_transition_action/identity/identity_topup/v0/mod.rs index 2c718c420b..98d6b5ad7d 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_topup/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_topup/v0/mod.rs @@ -3,6 +3,7 @@ mod transformer; use dpp::identifier::Identifier; use dpp::platform_value::Bytes36; +use dpp::prelude::UserFeeIncrease; use serde::{Deserialize, Serialize}; /// action v0 @@ -15,4 +16,6 @@ pub struct IdentityTopUpTransitionActionV0 { pub identity_id: Identifier, /// asset lock outpoint pub asset_lock_outpoint: Bytes36, + /// fee multiplier + pub user_fee_increase: UserFeeIncrease, } diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_topup/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/identity/identity_topup/v0/transformer.rs index d14579d294..75516f4fd6 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_topup/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_topup/v0/transformer.rs @@ -17,6 +17,7 @@ impl IdentityTopUpTransitionActionV0 { let IdentityTopUpTransitionV0 { identity_id, asset_lock_proof, + user_fee_increase, .. } = value; @@ -34,6 +35,7 @@ impl IdentityTopUpTransitionActionV0 { top_up_balance_amount, identity_id, asset_lock_outpoint: Bytes36::new(outpoint_bytes), + user_fee_increase, }) } @@ -45,6 +47,7 @@ impl IdentityTopUpTransitionActionV0 { let IdentityTopUpTransitionV0 { identity_id, asset_lock_proof, + user_fee_increase, .. } = value; @@ -62,6 +65,7 @@ impl IdentityTopUpTransitionActionV0 { top_up_balance_amount, identity_id: *identity_id, asset_lock_outpoint: Bytes36::new(outpoint_bytes), + user_fee_increase: *user_fee_increase, }) } } diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_update/mod.rs b/packages/rs-drive/src/state_transition_action/identity/identity_update/mod.rs index 564fa1a141..51e2224988 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_update/mod.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_update/mod.rs @@ -3,11 +3,12 @@ pub mod transformer; /// v0 pub mod v0; +use crate::state_transition_action::identity::identity_credit_withdrawal::IdentityCreditWithdrawalTransitionAction; use crate::state_transition_action::identity::identity_update::v0::IdentityUpdateTransitionActionV0; use derive_more::From; use dpp::identity::{IdentityPublicKey, KeyID, TimestampMillis}; use dpp::platform_value::Identifier; -use dpp::prelude::Revision; +use dpp::prelude::{Revision, UserFeeIncrease}; /// action #[derive(Debug, Clone, From)] @@ -59,4 +60,11 @@ impl IdentityUpdateTransitionAction { IdentityUpdateTransitionAction::V0(transition) => transition.revision, } } + + /// fee multiplier + pub fn user_fee_increase(&self) -> UserFeeIncrease { + match self { + IdentityUpdateTransitionAction::V0(transition) => transition.user_fee_increase, + } + } } diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_update/v0/mod.rs b/packages/rs-drive/src/state_transition_action/identity/identity_update/v0/mod.rs index c85f4d09f3..7c1f947b30 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_update/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_update/v0/mod.rs @@ -2,7 +2,7 @@ mod transformer; use dpp::identifier::Identifier; use dpp::identity::{IdentityPublicKey, KeyID, TimestampMillis}; -use dpp::prelude::{IdentityNonce, Revision}; +use dpp::prelude::{IdentityNonce, Revision, UserFeeIncrease}; use serde::{Deserialize, Serialize}; /// action v0 @@ -21,4 +21,6 @@ pub struct IdentityUpdateTransitionActionV0 { pub revision: Revision, /// nonce used to prevent replay attacks pub nonce: IdentityNonce, + /// fee multiplier + pub user_fee_increase: UserFeeIncrease, } diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_update/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/identity/identity_update/v0/transformer.rs index 4400b10ed6..6b96f281fd 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_update/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_update/v0/transformer.rs @@ -10,6 +10,7 @@ impl From for IdentityUpdateTransitionActionV0 { public_keys_disabled_at, revision, nonce, + user_fee_increase, .. } = value; IdentityUpdateTransitionActionV0 { @@ -19,6 +20,7 @@ impl From for IdentityUpdateTransitionActionV0 { identity_id, revision, nonce, + user_fee_increase, } } } @@ -32,6 +34,7 @@ impl From<&IdentityUpdateTransitionV0> for IdentityUpdateTransitionActionV0 { public_keys_disabled_at, revision, nonce, + user_fee_increase, .. } = value; IdentityUpdateTransitionActionV0 { @@ -44,6 +47,7 @@ impl From<&IdentityUpdateTransitionV0> for IdentityUpdateTransitionActionV0 { identity_id: *identity_id, revision: *revision, nonce: *nonce, + user_fee_increase: *user_fee_increase, } } } diff --git a/packages/rs-drive/src/state_transition_action/mod.rs b/packages/rs-drive/src/state_transition_action/mod.rs index c0385bbef1..f3f90a1c6a 100644 --- a/packages/rs-drive/src/state_transition_action/mod.rs +++ b/packages/rs-drive/src/state_transition_action/mod.rs @@ -16,9 +16,14 @@ use crate::state_transition_action::identity::identity_credit_transfer::Identity use crate::state_transition_action::identity::identity_credit_withdrawal::IdentityCreditWithdrawalTransitionAction; use crate::state_transition_action::identity::identity_topup::IdentityTopUpTransitionAction; use crate::state_transition_action::identity::identity_update::IdentityUpdateTransitionAction; -use crate::state_transition_action::system::bump_identity_data_contract_nonce_action::BumpIdentityDataContractNonceAction; -use crate::state_transition_action::system::bump_identity_nonce_action::BumpIdentityNonceAction; +use crate::state_transition_action::system::bump_identity_data_contract_nonce_action::{ + BumpIdentityDataContractNonceAction, BumpIdentityDataContractNonceActionAccessorsV0, +}; +use crate::state_transition_action::system::bump_identity_nonce_action::{ + BumpIdentityNonceAction, BumpIdentityNonceActionAccessorsV0, +}; use derive_more::From; +use dpp::prelude::UserFeeIncrease; /// ST action #[derive(Debug, Clone, From)] @@ -48,3 +53,27 @@ pub enum StateTransitionAction { /// it will also only happen if the state validation fails BumpIdentityDataContractNonceAction(BumpIdentityDataContractNonceAction), } + +impl StateTransitionAction { + /// The fee multiplier for the action + pub fn user_fee_increase(&self) -> UserFeeIncrease { + match self { + StateTransitionAction::DataContractCreateAction(action) => action.user_fee_increase(), + StateTransitionAction::DataContractUpdateAction(action) => action.user_fee_increase(), + StateTransitionAction::DocumentsBatchAction(action) => action.user_fee_increase(), + StateTransitionAction::IdentityCreateAction(action) => action.user_fee_increase(), + StateTransitionAction::IdentityTopUpAction(action) => action.user_fee_increase(), + StateTransitionAction::IdentityCreditWithdrawalAction(action) => { + action.user_fee_increase() + } + StateTransitionAction::IdentityUpdateAction(action) => action.user_fee_increase(), + StateTransitionAction::IdentityCreditTransferAction(action) => { + action.user_fee_increase() + } + StateTransitionAction::BumpIdentityNonceAction(action) => action.user_fee_increase(), + StateTransitionAction::BumpIdentityDataContractNonceAction(action) => { + action.user_fee_increase() + } + } + } +} diff --git a/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/mod.rs b/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/mod.rs index 68be72fc6b..bcd59379b3 100644 --- a/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/mod.rs +++ b/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/mod.rs @@ -1,7 +1,7 @@ use derive_more::From; use dpp::platform_value::Identifier; -use dpp::prelude::IdentityNonce; +use dpp::prelude::{IdentityNonce, UserFeeIncrease}; /// transformer module pub mod transformer; @@ -34,4 +34,10 @@ impl BumpIdentityDataContractNonceActionAccessorsV0 for BumpIdentityDataContract BumpIdentityDataContractNonceAction::V0(v0) => v0.identity_contract_nonce, } } + + fn user_fee_increase(&self) -> UserFeeIncrease { + match self { + BumpIdentityDataContractNonceAction::V0(transition) => transition.user_fee_increase, + } + } } diff --git a/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/transformer.rs b/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/transformer.rs index 10f46f6f14..ec98eb4d65 100644 --- a/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/transformer.rs @@ -1,4 +1,5 @@ use dpp::platform_value::Identifier; +use dpp::prelude::UserFeeIncrease; use dpp::ProtocolError; use dpp::state_transition::data_contract_update_transition::DataContractUpdateTransition; @@ -12,11 +13,16 @@ impl BumpIdentityDataContractNonceAction { pub fn from_document_base_transition( value: DocumentBaseTransition, identity_id: Identifier, + user_fee_increase: UserFeeIncrease, ) -> Result { match value { DocumentBaseTransition::V0(v0) => Ok( - BumpIdentityDataContractNonceActionV0::try_from_base_transition(v0, identity_id)? - .into(), + BumpIdentityDataContractNonceActionV0::try_from_base_transition( + v0, + identity_id, + user_fee_increase, + )? + .into(), ), } } @@ -25,12 +31,14 @@ impl BumpIdentityDataContractNonceAction { pub fn from_borrowed_document_base_transition( value: &DocumentBaseTransition, identity_id: Identifier, + user_fee_increase: UserFeeIncrease, ) -> Result { match value { DocumentBaseTransition::V0(v0) => Ok( BumpIdentityDataContractNonceActionV0::try_from_borrowed_base_transition( v0, identity_id, + user_fee_increase, )? .into(), ), @@ -41,12 +49,14 @@ impl BumpIdentityDataContractNonceAction { pub fn from_document_base_transition_action( value: DocumentBaseTransitionAction, identity_id: Identifier, + user_fee_increase: UserFeeIncrease, ) -> Result { match value { DocumentBaseTransitionAction::V0(v0) => Ok( BumpIdentityDataContractNonceActionV0::try_from_base_transition_action( v0, identity_id, + user_fee_increase, )? .into(), ), @@ -57,12 +67,14 @@ impl BumpIdentityDataContractNonceAction { pub fn from_document_borrowed_base_transition_action( value: &DocumentBaseTransitionAction, identity_id: Identifier, + user_fee_increase: UserFeeIncrease, ) -> Result { match value { DocumentBaseTransitionAction::V0(v0) => Ok( BumpIdentityDataContractNonceActionV0::try_from_borrowed_base_transition_action( v0, identity_id, + user_fee_increase, )? .into(), ), diff --git a/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/v0/mod.rs b/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/v0/mod.rs index 4d812bb703..52780ee2b4 100644 --- a/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/v0/mod.rs @@ -2,7 +2,7 @@ pub mod transformer; use dpp::identifier::Identifier; -use dpp::prelude::IdentityNonce; +use dpp::prelude::{IdentityNonce, UserFeeIncrease}; #[derive(Debug, Clone)] /// Version 0 of the bump identity data contract nonce action @@ -14,6 +14,8 @@ pub struct BumpIdentityDataContractNonceActionV0 { pub data_contract_id: Identifier, /// The identity contract nonce, this is used to stop replay attacks pub identity_contract_nonce: IdentityNonce, + /// fee multiplier + pub user_fee_increase: UserFeeIncrease, } /// document base transition action accessors v0 @@ -24,4 +26,6 @@ pub trait BumpIdentityDataContractNonceActionAccessorsV0 { fn data_contract_id(&self) -> Identifier; /// Identity contract nonce fn identity_contract_nonce(&self) -> IdentityNonce; + /// Fee multiplier + fn user_fee_increase(&self) -> UserFeeIncrease; } diff --git a/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/v0/transformer.rs index f7219d1f59..6a338e35c4 100644 --- a/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/v0/transformer.rs @@ -1,5 +1,6 @@ use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::platform_value::Identifier; +use dpp::prelude::UserFeeIncrease; use dpp::ProtocolError; use dpp::state_transition::data_contract_update_transition::DataContractUpdateTransitionV0; @@ -13,6 +14,7 @@ impl BumpIdentityDataContractNonceActionV0 { pub fn try_from_base_transition( value: DocumentBaseTransitionV0, identity_id: Identifier, + user_fee_increase: UserFeeIncrease, ) -> Result { let DocumentBaseTransitionV0 { data_contract_id, @@ -23,6 +25,7 @@ impl BumpIdentityDataContractNonceActionV0 { identity_id, data_contract_id, identity_contract_nonce, + user_fee_increase, }) } @@ -30,6 +33,7 @@ impl BumpIdentityDataContractNonceActionV0 { pub fn try_from_borrowed_base_transition( value: &DocumentBaseTransitionV0, identity_id: Identifier, + user_fee_increase: UserFeeIncrease, ) -> Result { let DocumentBaseTransitionV0 { data_contract_id, @@ -40,6 +44,7 @@ impl BumpIdentityDataContractNonceActionV0 { identity_id, data_contract_id: *data_contract_id, identity_contract_nonce: *identity_contract_nonce, + user_fee_increase, }) } @@ -47,6 +52,7 @@ impl BumpIdentityDataContractNonceActionV0 { pub fn try_from_base_transition_action( value: DocumentBaseTransitionActionV0, identity_id: Identifier, + user_fee_increase: UserFeeIncrease, ) -> Result { let DocumentBaseTransitionActionV0 { data_contract, @@ -57,6 +63,7 @@ impl BumpIdentityDataContractNonceActionV0 { identity_id, data_contract_id: data_contract.contract.id(), identity_contract_nonce, + user_fee_increase, }) } @@ -64,6 +71,7 @@ impl BumpIdentityDataContractNonceActionV0 { pub fn try_from_borrowed_base_transition_action( value: &DocumentBaseTransitionActionV0, identity_id: Identifier, + user_fee_increase: UserFeeIncrease, ) -> Result { let DocumentBaseTransitionActionV0 { data_contract, @@ -74,6 +82,7 @@ impl BumpIdentityDataContractNonceActionV0 { identity_id, data_contract_id: data_contract.contract.id(), identity_contract_nonce: *identity_contract_nonce, + user_fee_increase, }) } @@ -84,12 +93,14 @@ impl BumpIdentityDataContractNonceActionV0 { let DataContractUpdateTransitionV0 { data_contract, identity_contract_nonce, + user_fee_increase, .. } = value; Ok(BumpIdentityDataContractNonceActionV0 { identity_id: data_contract.owner_id(), data_contract_id: data_contract.id(), identity_contract_nonce, + user_fee_increase, }) } @@ -100,12 +111,14 @@ impl BumpIdentityDataContractNonceActionV0 { let DataContractUpdateTransitionV0 { data_contract, identity_contract_nonce, + user_fee_increase, .. } = value; Ok(BumpIdentityDataContractNonceActionV0 { identity_id: data_contract.owner_id(), data_contract_id: data_contract.id(), identity_contract_nonce: *identity_contract_nonce, + user_fee_increase: *user_fee_increase, }) } @@ -116,12 +129,14 @@ impl BumpIdentityDataContractNonceActionV0 { let DataContractUpdateTransitionActionV0 { data_contract, identity_contract_nonce, + user_fee_increase, .. } = value; Ok(BumpIdentityDataContractNonceActionV0 { identity_id: data_contract.owner_id(), data_contract_id: data_contract.id(), identity_contract_nonce, + user_fee_increase, }) } @@ -132,12 +147,14 @@ impl BumpIdentityDataContractNonceActionV0 { let DataContractUpdateTransitionActionV0 { data_contract, identity_contract_nonce, + user_fee_increase, .. } = value; Ok(BumpIdentityDataContractNonceActionV0 { identity_id: data_contract.owner_id(), data_contract_id: data_contract.id(), identity_contract_nonce: *identity_contract_nonce, + user_fee_increase: *user_fee_increase, }) } } diff --git a/packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/mod.rs b/packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/mod.rs index c586a02020..c66be8b36a 100644 --- a/packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/mod.rs +++ b/packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/mod.rs @@ -1,7 +1,7 @@ use derive_more::From; use dpp::platform_value::Identifier; -use dpp::prelude::IdentityNonce; +use dpp::prelude::{IdentityNonce, UserFeeIncrease}; /// transformer module pub mod transformer; @@ -28,4 +28,10 @@ impl BumpIdentityNonceActionAccessorsV0 for BumpIdentityNonceAction { BumpIdentityNonceAction::V0(v0) => v0.identity_nonce, } } + + fn user_fee_increase(&self) -> UserFeeIncrease { + match self { + BumpIdentityNonceAction::V0(transition) => transition.user_fee_increase, + } + } } diff --git a/packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/v0/mod.rs b/packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/v0/mod.rs index 17e3637571..8437a51f70 100644 --- a/packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/v0/mod.rs @@ -2,7 +2,7 @@ pub mod transformer; use dpp::identifier::Identifier; -use dpp::prelude::IdentityNonce; +use dpp::prelude::{IdentityNonce, UserFeeIncrease}; #[derive(Debug, Clone)] /// Version 0 of the bump identity nonce action @@ -13,6 +13,8 @@ pub struct BumpIdentityNonceActionV0 { pub identity_id: Identifier, /// The identity contract nonce, this is used to stop replay attacks pub identity_nonce: IdentityNonce, + /// fee multiplier + pub user_fee_increase: UserFeeIncrease, } /// document base transition action accessors v0 @@ -21,4 +23,7 @@ pub trait BumpIdentityNonceActionAccessorsV0 { fn identity_id(&self) -> Identifier; /// Identity contract nonce fn identity_nonce(&self) -> IdentityNonce; + + /// fee multiplier + fn user_fee_increase(&self) -> UserFeeIncrease; } diff --git a/packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/v0/transformer.rs index ee46bc5865..9c99de4923 100644 --- a/packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/v0/transformer.rs @@ -13,11 +13,15 @@ impl BumpIdentityNonceActionV0 { value: IdentityUpdateTransitionV0, ) -> Result { let IdentityUpdateTransitionV0 { - identity_id, nonce, .. + identity_id, + nonce, + user_fee_increase, + .. } = value; Ok(BumpIdentityNonceActionV0 { identity_id, identity_nonce: nonce, + user_fee_increase, }) } @@ -26,11 +30,15 @@ impl BumpIdentityNonceActionV0 { value: &IdentityUpdateTransitionV0, ) -> Result { let IdentityUpdateTransitionV0 { - identity_id, nonce, .. + identity_id, + nonce, + user_fee_increase, + .. } = value; Ok(BumpIdentityNonceActionV0 { identity_id: *identity_id, identity_nonce: *nonce, + user_fee_increase: *user_fee_increase, }) } @@ -39,11 +47,15 @@ impl BumpIdentityNonceActionV0 { value: IdentityUpdateTransitionActionV0, ) -> Result { let IdentityUpdateTransitionActionV0 { - identity_id, nonce, .. + identity_id, + nonce, + user_fee_increase, + .. } = value; Ok(BumpIdentityNonceActionV0 { identity_id, identity_nonce: nonce, + user_fee_increase, }) } @@ -52,11 +64,15 @@ impl BumpIdentityNonceActionV0 { value: &IdentityUpdateTransitionActionV0, ) -> Result { let IdentityUpdateTransitionActionV0 { - identity_id, nonce, .. + identity_id, + nonce, + user_fee_increase, + .. } = value; Ok(BumpIdentityNonceActionV0 { identity_id: *identity_id, identity_nonce: *nonce, + user_fee_increase: *user_fee_increase, }) } @@ -65,11 +81,15 @@ impl BumpIdentityNonceActionV0 { value: IdentityCreditTransferTransitionV0, ) -> Result { let IdentityCreditTransferTransitionV0 { - identity_id, nonce, .. + identity_id, + nonce, + user_fee_increase, + .. } = value; Ok(BumpIdentityNonceActionV0 { identity_id, identity_nonce: nonce, + user_fee_increase, }) } @@ -78,11 +98,15 @@ impl BumpIdentityNonceActionV0 { value: &IdentityCreditTransferTransitionV0, ) -> Result { let IdentityCreditTransferTransitionV0 { - identity_id, nonce, .. + identity_id, + nonce, + user_fee_increase, + .. } = value; Ok(BumpIdentityNonceActionV0 { identity_id: *identity_id, identity_nonce: *nonce, + user_fee_increase: *user_fee_increase, }) } @@ -91,11 +115,15 @@ impl BumpIdentityNonceActionV0 { value: IdentityCreditTransferTransitionActionV0, ) -> Result { let IdentityCreditTransferTransitionActionV0 { - identity_id, nonce, .. + identity_id, + nonce, + user_fee_increase, + .. } = value; Ok(BumpIdentityNonceActionV0 { identity_id, identity_nonce: nonce, + user_fee_increase, }) } @@ -104,11 +132,15 @@ impl BumpIdentityNonceActionV0 { value: &IdentityCreditTransferTransitionActionV0, ) -> Result { let IdentityCreditTransferTransitionActionV0 { - identity_id, nonce, .. + identity_id, + nonce, + user_fee_increase, + .. } = value; Ok(BumpIdentityNonceActionV0 { identity_id: *identity_id, identity_nonce: *nonce, + user_fee_increase: *user_fee_increase, }) } @@ -117,11 +149,15 @@ impl BumpIdentityNonceActionV0 { value: IdentityCreditWithdrawalTransitionV0, ) -> Result { let IdentityCreditWithdrawalTransitionV0 { - identity_id, nonce, .. + identity_id, + nonce, + user_fee_increase, + .. } = value; Ok(BumpIdentityNonceActionV0 { identity_id, identity_nonce: nonce, + user_fee_increase, }) } @@ -130,11 +166,15 @@ impl BumpIdentityNonceActionV0 { value: &IdentityCreditWithdrawalTransitionV0, ) -> Result { let IdentityCreditWithdrawalTransitionV0 { - identity_id, nonce, .. + identity_id, + nonce, + user_fee_increase, + .. } = value; Ok(BumpIdentityNonceActionV0 { identity_id: *identity_id, identity_nonce: *nonce, + user_fee_increase: *user_fee_increase, }) } @@ -143,11 +183,15 @@ impl BumpIdentityNonceActionV0 { value: IdentityCreditWithdrawalTransitionActionV0, ) -> Result { let IdentityCreditWithdrawalTransitionActionV0 { - identity_id, nonce, .. + identity_id, + nonce, + user_fee_increase, + .. } = value; Ok(BumpIdentityNonceActionV0 { identity_id, identity_nonce: nonce, + user_fee_increase, }) } @@ -156,11 +200,15 @@ impl BumpIdentityNonceActionV0 { value: &IdentityCreditWithdrawalTransitionActionV0, ) -> Result { let IdentityCreditWithdrawalTransitionActionV0 { - identity_id, nonce, .. + identity_id, + nonce, + user_fee_increase, + .. } = value; Ok(BumpIdentityNonceActionV0 { identity_id: *identity_id, identity_nonce: *nonce, + user_fee_increase: *user_fee_increase, }) } } diff --git a/packages/rs-sdk/src/platform/transition/put_document.rs b/packages/rs-sdk/src/platform/transition/put_document.rs index e4a88ec994..8c9edfd70b 100644 --- a/packages/rs-sdk/src/platform/transition/put_document.rs +++ b/packages/rs-sdk/src/platform/transition/put_document.rs @@ -72,12 +72,16 @@ impl PutDocument for Document { settings, ) .await?; + + let settings = settings.unwrap_or_default(); + let transition = DocumentsBatchTransition::new_document_creation_transition_from_document( self.clone(), document_type.as_ref(), document_state_transition_entropy, &identity_public_key, new_identity_contract_nonce, + settings.user_fee_increase.unwrap_or_default(), signer, sdk.version(), None, @@ -89,7 +93,7 @@ impl PutDocument for Document { request .clone() - .execute(sdk, settings.unwrap_or_default().request_settings) + .execute(sdk, settings.request_settings) .await?; // response is empty for a broadcast, result comes from the stream wait for state transition result diff --git a/packages/rs-sdk/src/platform/transition/put_settings.rs b/packages/rs-sdk/src/platform/transition/put_settings.rs index d6544132d9..7ddaef7a68 100644 --- a/packages/rs-sdk/src/platform/transition/put_settings.rs +++ b/packages/rs-sdk/src/platform/transition/put_settings.rs @@ -1,3 +1,4 @@ +use dpp::prelude::UserFeeIncrease; use rs_dapi_client::RequestSettings; /// The options when putting something to platform @@ -5,4 +6,5 @@ use rs_dapi_client::RequestSettings; pub struct PutSettings { pub request_settings: RequestSettings, pub identity_nonce_stale_time_s: Option, + pub user_fee_increase: Option, } diff --git a/packages/rs-sdk/src/platform/transition/top_up_identity.rs b/packages/rs-sdk/src/platform/transition/top_up_identity.rs index eadf539639..2aa5eb3b94 100644 --- a/packages/rs-sdk/src/platform/transition/top_up_identity.rs +++ b/packages/rs-sdk/src/platform/transition/top_up_identity.rs @@ -3,7 +3,7 @@ use crate::{Error, Sdk}; use dapi_grpc::platform::VersionedGrpcResponse; use dpp::dashcore::PrivateKey; use dpp::identity::Identity; -use dpp::prelude::AssetLockProof; +use dpp::prelude::{AssetLockProof, UserFeeIncrease}; use dpp::state_transition::identity_topup_transition::methods::IdentityTopUpTransitionMethodsV0; use dpp::state_transition::identity_topup_transition::IdentityTopUpTransition; use dpp::state_transition::proof_result::StateTransitionProofResult; @@ -17,6 +17,7 @@ pub trait TopUpIdentity { sdk: &Sdk, asset_lock_proof: AssetLockProof, asset_lock_proof_private_key: &PrivateKey, + user_fee_increase: Option, ) -> Result; } @@ -27,11 +28,13 @@ impl TopUpIdentity for Identity { sdk: &Sdk, asset_lock_proof: AssetLockProof, asset_lock_proof_private_key: &PrivateKey, + user_fee_increase: Option, ) -> Result { let state_transition = IdentityTopUpTransition::try_from_identity( self, asset_lock_proof, asset_lock_proof_private_key.inner.as_ref(), + user_fee_increase.unwrap_or_default(), sdk.version(), None, )?; diff --git a/packages/rs-sdk/src/platform/transition/withdraw_from_identity.rs b/packages/rs-sdk/src/platform/transition/withdraw_from_identity.rs index 72c1a579b9..093c182e43 100644 --- a/packages/rs-sdk/src/platform/transition/withdraw_from_identity.rs +++ b/packages/rs-sdk/src/platform/transition/withdraw_from_identity.rs @@ -5,6 +5,7 @@ use dpp::identity::accessors::IdentityGettersV0; use dpp::identity::core_script::CoreScript; use dpp::identity::signer::Signer; use dpp::identity::Identity; +use dpp::prelude::UserFeeIncrease; use dpp::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition; @@ -26,6 +27,7 @@ pub trait WithdrawFromIdentity { address: Address, amount: u64, core_fee_per_byte: Option, + user_fee_increase: Option, signer: S, settings: Option, ) -> Result; @@ -39,6 +41,7 @@ impl WithdrawFromIdentity for Identity { address: Address, amount: u64, core_fee_per_byte: Option, + user_fee_increase: Option, signer: S, settings: Option, ) -> Result { @@ -49,6 +52,7 @@ impl WithdrawFromIdentity for Identity { amount, Pooling::Never, core_fee_per_byte.unwrap_or(1), + user_fee_increase.unwrap_or_default(), signer, new_identity_nonce, sdk.version(), diff --git a/packages/strategy-tests/src/lib.rs b/packages/strategy-tests/src/lib.rs index b62761bfb4..0b1e155b3a 100644 --- a/packages/strategy-tests/src/lib.rs +++ b/packages/strategy-tests/src/lib.rs @@ -523,6 +523,7 @@ impl Strategy { &identity_info, 2, // Assuming key id 2 is a high or critical auth key *nonce, + 0, signer, platform_version, None, @@ -666,6 +667,7 @@ impl Strategy { DocumentsBatchTransitionV0 { owner_id: identity.id(), transitions: vec![document_create_transition.into()], + user_fee_increase: 0, signature_public_key_id: 2, signature: BinaryData::default(), } @@ -779,6 +781,7 @@ impl Strategy { DocumentsBatchTransitionV0 { owner_id: identity.id(), transitions: vec![document_create_transition.into()], + user_fee_increase: 0, signature_public_key_id: 1, signature: BinaryData::default(), } @@ -881,6 +884,7 @@ impl Strategy { DocumentsBatchTransitionV0 { owner_id: identity.id, transitions: vec![document_delete_transition.into()], + user_fee_increase: 0, signature_public_key_id: 1, signature: BinaryData::default(), } @@ -986,6 +990,7 @@ impl Strategy { DocumentsBatchTransitionV0 { owner_id: identity.id, transitions: vec![document_replace_transition.into()], + user_fee_increase: 0, signature_public_key_id: 1, signature: BinaryData::default(), } diff --git a/packages/strategy-tests/src/transitions.rs b/packages/strategy-tests/src/transitions.rs index 5a47e6f1c3..b0c57dae6b 100644 --- a/packages/strategy-tests/src/transitions.rs +++ b/packages/strategy-tests/src/transitions.rs @@ -236,6 +236,7 @@ pub fn create_identity_top_up_transition( identity, asset_lock_proof, pk_bytes.as_ref(), + 0, platform_version, None, ) @@ -315,6 +316,7 @@ pub fn create_identity_update_transition_add_keys( vec![], None, *identity_nonce, + 0, signer, platform_version, None, @@ -423,6 +425,7 @@ pub fn create_identity_update_transition_disable_keys( key_ids_to_disable, Some(block_time), *identity_nonce, + 0, signer, platform_version, None, @@ -476,6 +479,7 @@ pub fn create_identity_withdrawal_transition( pooling: Pooling::Never, output_script: CoreScript::random_p2sh(rng), nonce: *nonce, + user_fee_increase: 0, signature_public_key_id: 0, signature: Default::default(), } @@ -546,6 +550,7 @@ pub fn create_identity_credit_transfer_transition( recipient_id: recipient.id(), amount, nonce: *nonce, + user_fee_increase: 0, signature_public_key_id: 0, signature: Default::default(), } diff --git a/packages/wasm-dpp/src/data_contract_factory/data_contract_factory.rs b/packages/wasm-dpp/src/data_contract_factory/data_contract_factory.rs index 3036b9d849..4d1d87166b 100644 --- a/packages/wasm-dpp/src/data_contract_factory/data_contract_factory.rs +++ b/packages/wasm-dpp/src/data_contract_factory/data_contract_factory.rs @@ -28,9 +28,7 @@ impl From for DataContractFactory { #[wasm_bindgen(js_class=DataContractFactory)] impl DataContractFactoryWasm { #[wasm_bindgen(constructor)] - pub fn new( - protocol_version: u32, - ) -> DataContractFactoryWasm { + pub fn new(protocol_version: u32) -> DataContractFactoryWasm { DataContractFactory::new(protocol_version) .with_js_error() .expect("should create a factory") diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_topup_transition/identity_topup_transition.rs b/packages/wasm-dpp/src/identity/state_transition/identity_topup_transition/identity_topup_transition.rs index 0de70583fa..bbe6315614 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_topup_transition/identity_topup_transition.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_topup_transition/identity_topup_transition.rs @@ -66,7 +66,9 @@ impl IdentityTopUpTransitionWasm { pub fn set_asset_lock_proof(&mut self, asset_lock_proof: JsValue) -> Result<(), JsValue> { let asset_lock_proof = create_asset_lock_proof_from_wasm_instance(&asset_lock_proof)?; - self.0.set_asset_lock_proof(asset_lock_proof).map_err(from_dpp_err) + self.0 + .set_asset_lock_proof(asset_lock_proof) + .map_err(from_dpp_err) } #[wasm_bindgen(getter, js_name=assetLockProof)] diff --git a/packages/wasm-dpp/test/unit/dataContract/stateTransition/DataContractCreateTransition/DataContractCreateTransition.spec.js b/packages/wasm-dpp/test/unit/dataContract/stateTransition/DataContractCreateTransition/DataContractCreateTransition.spec.js index c1d94c8484..973c2f90e3 100644 --- a/packages/wasm-dpp/test/unit/dataContract/stateTransition/DataContractCreateTransition/DataContractCreateTransition.spec.js +++ b/packages/wasm-dpp/test/unit/dataContract/stateTransition/DataContractCreateTransition/DataContractCreateTransition.spec.js @@ -66,7 +66,7 @@ describe('DataContractCreateTransition', () => { it('should return serialized State Transition', () => { const result = stateTransition.toBuffer(); expect(result).to.be.instanceOf(Buffer); - expect(result).to.have.lengthOf(2357); + expect(result).to.have.lengthOf(2358); }); it('should be able to restore contract config from bytes', () => { diff --git a/packages/wasm-dpp/test/unit/dataContract/stateTransition/DataContractUpdateTransition/DataContractUpdateTransition.spec.js b/packages/wasm-dpp/test/unit/dataContract/stateTransition/DataContractUpdateTransition/DataContractUpdateTransition.spec.js index 074e375d90..dd2cda514c 100644 --- a/packages/wasm-dpp/test/unit/dataContract/stateTransition/DataContractUpdateTransition/DataContractUpdateTransition.spec.js +++ b/packages/wasm-dpp/test/unit/dataContract/stateTransition/DataContractUpdateTransition/DataContractUpdateTransition.spec.js @@ -65,7 +65,7 @@ describe('DataContractUpdateTransition', () => { it('should return serialized State Transition', () => { const result = stateTransition.toBuffer(); expect(result).to.be.instanceOf(Buffer); - expect(result).to.have.lengthOf(2357); + expect(result).to.have.lengthOf(2358); }); it('should be able to restore contract config from bytes', () => { From b1d3a529e51c332e2ad9e889b87dab21b41f6fd2 Mon Sep 17 00:00:00 2001 From: Igor Markin Date: Fri, 8 Mar 2024 14:54:23 +0000 Subject: [PATCH 074/191] fix(drive): internal error on querying specific identity keys (#1728) --- .../v0/nodejs/PlatformPromiseClient.js | 36 ++++ .../platform/v0/web/PlatformPromiseClient.js | 14 ++ .../v0/nodejs/PlatformPromiseClient.spec.js | 11 ++ .../methods/platform/PlatformMethodsFacade.js | 2 + .../GetIdentityKeysResponse.js | 52 ++++++ .../getIdentityKeys/getIdentityKeysFactory.js | 78 ++++++++ .../platform/PlatformMethodsFacade.spec.js | 22 +++ .../getIdentityKeys/GetIdentityKeys.spec.js | 130 +++++++++++++ .../getIdentityKeysFactory.spec.js | 173 ++++++++++++++++++ .../src/drive/identity/key/fetch/mod.rs | 2 +- 10 files changed, 519 insertions(+), 1 deletion(-) create mode 100644 packages/js-dapi-client/lib/methods/platform/getIdentityKeys/GetIdentityKeysResponse.js create mode 100644 packages/js-dapi-client/lib/methods/platform/getIdentityKeys/getIdentityKeysFactory.js create mode 100644 packages/js-dapi-client/test/unit/methods/platform/getIdentityKeys/GetIdentityKeys.spec.js create mode 100644 packages/js-dapi-client/test/unit/methods/platform/getIdentityKeys/getIdentityKeysFactory.spec.js diff --git a/packages/dapi-grpc/clients/platform/v0/nodejs/PlatformPromiseClient.js b/packages/dapi-grpc/clients/platform/v0/nodejs/PlatformPromiseClient.js index 11f70cce87..dc2043a177 100644 --- a/packages/dapi-grpc/clients/platform/v0/nodejs/PlatformPromiseClient.js +++ b/packages/dapi-grpc/clients/platform/v0/nodejs/PlatformPromiseClient.js @@ -54,6 +54,8 @@ const { GetIdentityContractNonceResponse: PBJSGetIdentityContractNonceResponse, GetIdentityNonceRequest: PBJSGetIdentityNonceRequest, GetIdentityNonceResponse: PBJSGetIdentityNonceResponse, + GetIdentityKeysRequest: PBJSGetIdentityKeysRequest, + GetIdentityKeysResponse: PBJSGetIdentityKeysResponse, }, }, }, @@ -76,6 +78,7 @@ const { GetProofsResponse: ProtocGetProofsResponse, GetIdentityContractNonceResponse: ProtocGetIdentityContractNonceResponse, GetIdentityNonceResponse: ProtocGetIdentityNonceResponse, + GetIdentityKeysResponse: ProtocGetIdentityKeysResponse, } = require('./platform_protoc'); const getPlatformDefinition = require('../../../../lib/getPlatformDefinition'); @@ -158,6 +161,10 @@ class PlatformPromiseClient { this.client.getIdentityNonce.bind(this.client), ); + this.client.getIdentityKeys = promisify( + this.client.getIdentityKeys.bind(this.client), + ); + this.protocolVersion = undefined; } @@ -613,6 +620,35 @@ class PlatformPromiseClient { ); } + getIdentityKeys( + getIdentityKeysRequest, + metadata = {}, + options = {}, + ) { + if (!isObject(metadata)) { + throw new Error('metadata must be an object'); + } + + return this.client.getIdentityKeys( + getIdentityKeysRequest, + convertObjectToMetadata(metadata), + { + interceptors: [ + jsonToProtobufInterceptorFactory( + jsonToProtobufFactory( + ProtocGetIdentityKeysResponse, + PBJSGetIdentityKeysResponse, + ), + protobufToJsonFactory( + PBJSGetIdentityKeysRequest, + ), + ), + ], + ...options, + }, + ); + } + /** * @param {string} protocolVersion */ diff --git a/packages/dapi-grpc/clients/platform/v0/web/PlatformPromiseClient.js b/packages/dapi-grpc/clients/platform/v0/web/PlatformPromiseClient.js index 35f72fc812..2d14532505 100644 --- a/packages/dapi-grpc/clients/platform/v0/web/PlatformPromiseClient.js +++ b/packages/dapi-grpc/clients/platform/v0/web/PlatformPromiseClient.js @@ -204,6 +204,20 @@ class PlatformPromiseClient { ); } + /** + * @param {!GetIdentityKeysRequest} getIdentityKeysRequest + * @param {?Object} metadata + * @return {Promise} + */ + getIdentityKeys(getIdentityKeysRequest, metadata = {}) { + return promisify( + this.client.getIdentityKeys.bind(this.client), + )( + getIdentityKeysRequest, + metadata, + ); + } + /** * @param {string} protocolVersion */ diff --git a/packages/dapi-grpc/test/unit/clients/platform/v0/nodejs/PlatformPromiseClient.spec.js b/packages/dapi-grpc/test/unit/clients/platform/v0/nodejs/PlatformPromiseClient.spec.js index 78efcbe41d..a022a3691b 100644 --- a/packages/dapi-grpc/test/unit/clients/platform/v0/nodejs/PlatformPromiseClient.spec.js +++ b/packages/dapi-grpc/test/unit/clients/platform/v0/nodejs/PlatformPromiseClient.spec.js @@ -20,6 +20,7 @@ describe('PlatformPromiseClient', () => { getProtocolVersionUpgradeState: this.sinon.stub().resolves(response), getIdentityContractNonce: this.sinon.stub().resolves(response), getIdentityNonce: this.sinon.stub().resolves(response), + getIdentityKeys: this.sinon.stub().resolves(response), }; }); @@ -138,4 +139,14 @@ describe('PlatformPromiseClient', () => { .to.be.calledOnceWith(request); }); }); + + describe('#getIdentityKeys', () => { + it('should get identity keys', async () => { + const result = await platformPromiseClient.getIdentityKeys(request); + + expect(result).to.equal(response); + expect(platformPromiseClient.client.getIdentityKeys) + .to.be.calledOnceWith(request); + }); + }); }); diff --git a/packages/js-dapi-client/lib/methods/platform/PlatformMethodsFacade.js b/packages/js-dapi-client/lib/methods/platform/PlatformMethodsFacade.js index 9fecc4be33..0ad680800d 100644 --- a/packages/js-dapi-client/lib/methods/platform/PlatformMethodsFacade.js +++ b/packages/js-dapi-client/lib/methods/platform/PlatformMethodsFacade.js @@ -11,6 +11,7 @@ const getProtocolVersionUpgradeVoteStatusFactory = require('./getProtocolVersion const getProtocolVersionUpgradeStateFactory = require('./getProtocolVersionUpgradeState/getProtocolVersionUpgradeStateFactory'); const getIdentityContractNonceFactory = require('./getIdentityContractNonce/getIdentityContractNonceFactory'); const getIdentityNonceFactory = require('./getIdentityNonce/getIdentityNonceFactory'); +const getIdentityKeysFactory = require('./getIdentityKeys/getIdentityKeysFactory'); class PlatformMethodsFacade { /** @@ -32,6 +33,7 @@ class PlatformMethodsFacade { this.getProtocolVersionUpgradeState = getProtocolVersionUpgradeStateFactory(grpcTransport); this.getIdentityContractNonce = getIdentityContractNonceFactory(grpcTransport); this.getIdentityNonce = getIdentityNonceFactory(grpcTransport); + this.getIdentityKeys = getIdentityKeysFactory(grpcTransport); } } diff --git a/packages/js-dapi-client/lib/methods/platform/getIdentityKeys/GetIdentityKeysResponse.js b/packages/js-dapi-client/lib/methods/platform/getIdentityKeys/GetIdentityKeysResponse.js new file mode 100644 index 0000000000..de377cfdfb --- /dev/null +++ b/packages/js-dapi-client/lib/methods/platform/getIdentityKeys/GetIdentityKeysResponse.js @@ -0,0 +1,52 @@ +const AbstractResponse = require('../response/AbstractResponse'); +const InvalidResponseError = require('../response/errors/InvalidResponseError'); + +class GetIdentityKeysResponse extends AbstractResponse { + /** + * @param {number} identityKeys + * @param {Metadata} metadata + * @param {Proof} [proof] + */ + constructor(identityKeys, metadata, proof = undefined) { + super(metadata, proof); + + this.identityKeys = identityKeys; + } + + /** + * @returns {number} + */ + getIdentityKeys() { + return this.identityKeys; + } + + /** + * @param proto + * @returns {GetIdentityKeysResponse} + */ + static createFromProto(proto) { + // eslint-disable-next-line + const keys = proto.getV0().getKeys(); + const { metadata, proof } = AbstractResponse.createMetadataAndProofFromProto( + proto, + ); + + let identityKeys = []; + if ((typeof keys === 'undefined' || keys === null) && !proof) { + throw new InvalidResponseError('Identity keys are not defined'); + } else if (!proof) { + identityKeys = keys.getKeysBytesList(); + if ((typeof identityKeys === 'undefined' || identityKeys === null) && !proof) { + throw new InvalidResponseError('Identity keys are not defined'); + } + } + + return new GetIdentityKeysResponse( + identityKeys, + metadata, + proof, + ); + } +} + +module.exports = GetIdentityKeysResponse; diff --git a/packages/js-dapi-client/lib/methods/platform/getIdentityKeys/getIdentityKeysFactory.js b/packages/js-dapi-client/lib/methods/platform/getIdentityKeys/getIdentityKeysFactory.js new file mode 100644 index 0000000000..d54b660106 --- /dev/null +++ b/packages/js-dapi-client/lib/methods/platform/getIdentityKeys/getIdentityKeysFactory.js @@ -0,0 +1,78 @@ +const { + v0: { + PlatformPromiseClient, + GetIdentityKeysRequest, + KeyRequestType, + SpecificKeys, + }, +} = require('@dashevo/dapi-grpc'); +const { UInt32Value } = require('google-protobuf/google/protobuf/wrappers_pb'); + +const GetIdentityKeysResponse = require('./GetIdentityKeysResponse'); +const InvalidResponseError = require('../response/errors/InvalidResponseError'); + +/** + * @param {GrpcTransport} grpcTransport + * @returns {getIdentityKeys} + */ +function getIdentityKeysFactory(grpcTransport) { + /** + * Fetch the version upgrade vote status + * @typedef {getIdentityKeys} + * @param {Buffer} identityId + * @param {number[]} keyIds + * @param {number} limit + * @param {DAPIClientOptions & {prove: boolean}} [options] + * @returns {Promise} + */ + async function getIdentityKeys(identityId, keyIds, limit = 100, options = {}) { + const { GetIdentityKeysRequestV0 } = GetIdentityKeysRequest; + const getIdentityKeysRequest = new GetIdentityKeysRequest(); + + if (Buffer.isBuffer(identityId)) { + // eslint-disable-next-line no-param-reassign + identityId = Buffer.from(identityId); + } + + getIdentityKeysRequest.setV0( + new GetIdentityKeysRequestV0() + .setIdentityId(identityId) + .setRequestType(new KeyRequestType() + .setSpecificKeys(new SpecificKeys().setKeyIdsList(keyIds))) + .setLimit(new UInt32Value([limit])) + .setProve(!!options.prove), + ); + + let lastError; + + // TODO: simple retry before the dapi versioning is properly implemented + for (let i = 0; i < 3; i += 1) { + try { + // eslint-disable-next-line no-await-in-loop + const getIdentityKeysResponse = await grpcTransport.request( + PlatformPromiseClient, + 'getIdentityKeys', + getIdentityKeysRequest, + options, + ); + + return GetIdentityKeysResponse + .createFromProto(getIdentityKeysResponse); + } catch (e) { + if (e instanceof InvalidResponseError) { + lastError = e; + } else { + throw e; + } + } + } + + // If we made it past the cycle it means that the retry didn't work, + // and we're throwing the last error encountered + throw lastError; + } + + return getIdentityKeys; +} + +module.exports = getIdentityKeysFactory; diff --git a/packages/js-dapi-client/test/integration/methods/platform/PlatformMethodsFacade.spec.js b/packages/js-dapi-client/test/integration/methods/platform/PlatformMethodsFacade.spec.js index ca28a61c21..1b972962c7 100644 --- a/packages/js-dapi-client/test/integration/methods/platform/PlatformMethodsFacade.spec.js +++ b/packages/js-dapi-client/test/integration/methods/platform/PlatformMethodsFacade.spec.js @@ -9,6 +9,7 @@ const { GetProtocolVersionUpgradeStateResponse, GetIdentityContractNonceResponse, GetIdentityNonceResponse, + GetIdentityKeysResponse, BroadcastStateTransitionResponse, WaitForStateTransitionResultResponse, }, @@ -32,6 +33,7 @@ const { const { GetProtocolVersionUpgradeStateResponseV0 } = GetProtocolVersionUpgradeStateResponse; const { GetIdentityContractNonceResponseV0 } = GetIdentityContractNonceResponse; const { GetIdentityNonceResponseV0 } = GetIdentityNonceResponse; +const { GetIdentityKeysResponseV0 } = GetIdentityKeysResponse; describe('PlatformMethodsFacade', () => { let grpcTransportMock; @@ -241,4 +243,24 @@ describe('PlatformMethodsFacade', () => { expect(grpcTransportMock.request).to.be.calledOnce(); }); }); + + describe('#getIdentityKeys', () => { + it('should get keys', async () => { + const response = new GetIdentityKeysResponse(); + + const { Keys } = GetIdentityKeysResponseV0; + + response.setV0( + new GetIdentityKeysResponseV0() + .setKeys(new Keys().setKeysBytesList([Buffer.alloc(41), Buffer.alloc(46)])) + .setMetadata(new ResponseMetadata()), + ); + + grpcTransportMock.request.resolves(response); + + await platformMethods.getIdentityKeys(Buffer.alloc(32), [0, 1], 100, {}); + + expect(grpcTransportMock.request).to.be.calledOnce(); + }); + }); }); diff --git a/packages/js-dapi-client/test/unit/methods/platform/getIdentityKeys/GetIdentityKeys.spec.js b/packages/js-dapi-client/test/unit/methods/platform/getIdentityKeys/GetIdentityKeys.spec.js new file mode 100644 index 0000000000..e9d13836c2 --- /dev/null +++ b/packages/js-dapi-client/test/unit/methods/platform/getIdentityKeys/GetIdentityKeys.spec.js @@ -0,0 +1,130 @@ +const { + v0: { + GetIdentityKeysResponse, + ResponseMetadata, + Proof: ProofResponse, + }, +} = require('@dashevo/dapi-grpc'); + +const GetIdentityKeysResponseClass = require('../../../../../lib/methods/platform/getIdentityKeys/GetIdentityKeysResponse'); +const getMetadataFixture = require('../../../../../lib/test/fixtures/getMetadataFixture'); +const InvalidResponseError = require('../../../../../lib/methods/platform/response/errors/InvalidResponseError'); +const getProofFixture = require('../../../../../lib/test/fixtures/getProofFixture'); +const Proof = require('../../../../../lib/methods/platform/response/Proof'); +const Metadata = require('../../../../../lib/methods/platform/response/Metadata'); + +describe('GetIdentityKeysResponse', () => { + let getIdentityKeysResponse; + let metadataFixture; + let keys; + let proto; + let proofFixture; + + beforeEach(async () => { + metadataFixture = getMetadataFixture(); + keys = [Buffer.alloc(41).fill(1), Buffer.alloc(48).fill(2), Buffer.alloc(55).fill(3)]; + proofFixture = getProofFixture(); + + const { GetIdentityKeysResponseV0 } = GetIdentityKeysResponse; + proto = new GetIdentityKeysResponse(); + + const metadata = new ResponseMetadata(); + metadata.setHeight(metadataFixture.height); + metadata.setCoreChainLockedHeight(metadataFixture.coreChainLockedHeight); + metadata.setTimeMs(metadataFixture.timeMs); + metadata.setProtocolVersion(metadataFixture.protocolVersion); + + const { Keys } = GetIdentityKeysResponseV0; + + proto.setV0( + new GetIdentityKeysResponseV0() + .setKeys(new Keys().setKeysBytesList(keys)) + .setMetadata(metadata), + ); + + getIdentityKeysResponse = new GetIdentityKeysResponseClass( + keys, + new Metadata(metadataFixture), + ); + }); + + it('should return Identity Keys', () => { + const identityKeys = getIdentityKeysResponse.getIdentityKeys(); + const proof = getIdentityKeysResponse.getProof(); + + expect(identityKeys).to.deep.equal(keys); + expect(proof).to.equal(undefined); + }); + + it('should return proof', () => { + getIdentityKeysResponse = new GetIdentityKeysResponseClass( + Buffer.alloc(0), + new Metadata(metadataFixture), + new Proof(proofFixture), + ); + + const identityKeys = getIdentityKeysResponse.getIdentityKeys(); + const proof = getIdentityKeysResponse.getProof(); + + expect(identityKeys).to.deep.equal(Buffer.alloc(0)); + expect(proof).to.be.an.instanceOf(Proof); + expect(proof.getGrovedbProof()).to.deep.equal(proofFixture.merkleProof); + expect(proof.getQuorumHash()).to.deep.equal(proofFixture.quorumHash); + expect(proof.getSignature()).to.deep.equal(proofFixture.signature); + expect(proof.getRound()).to.deep.equal(proofFixture.round); + }); + + it('should create an instance from proto', () => { + getIdentityKeysResponse = GetIdentityKeysResponseClass.createFromProto(proto); + expect(getIdentityKeysResponse).to.be + .an.instanceOf(GetIdentityKeysResponseClass); + expect(getIdentityKeysResponse.getIdentityKeys()).to.deep.equal(keys); + + expect(getIdentityKeysResponse.getMetadata()) + .to.be.an.instanceOf(Metadata); + expect(getIdentityKeysResponse.getMetadata().getHeight()) + .to.equal(metadataFixture.height); + expect(getIdentityKeysResponse.getMetadata().getCoreChainLockedHeight()) + .to.equal(metadataFixture.coreChainLockedHeight); + + expect(getIdentityKeysResponse.getProof()).to.equal(undefined); + }); + + it('should create an instance with proof from proto', () => { + const proofProto = new ProofResponse(); + + proofProto.setQuorumHash(proofFixture.quorumHash); + proofProto.setSignature(proofFixture.signature); + proofProto.setGrovedbProof(proofFixture.merkleProof); + proofProto.setRound(proofFixture.round); + + proto.getV0().setKeys(undefined); + proto.getV0().setProof(proofProto); + + getIdentityKeysResponse = GetIdentityKeysResponseClass.createFromProto(proto); + + expect(getIdentityKeysResponse.getIdentityKeys()) + .to.deep.equal([]); + expect(getIdentityKeysResponse.getMetadata()).to.deep.equal(metadataFixture); + + const proof = getIdentityKeysResponse.getProof(); + expect(proof).to.be.an.instanceOf(Proof); + expect(proof.getGrovedbProof()).to.deep.equal(proofFixture.merkleProof); + expect(proof.getQuorumHash()).to.deep.equal(proofFixture.quorumHash); + expect(proof.getSignature()).to.deep.equal(proofFixture.signature); + expect(proof.getRound()).to.deep.equal(proofFixture.round); + }); + + it('should throw InvalidResponseError if Metadata is not defined', () => { + proto.getV0().setMetadata(undefined); + + try { + getIdentityKeysResponse = GetIdentityKeysResponseClass + .createFromProto(proto); + + expect.fail('should throw InvalidResponseError'); + } catch (e) { + expect(e).to.be.an.instanceOf(InvalidResponseError); + } + }); +}); diff --git a/packages/js-dapi-client/test/unit/methods/platform/getIdentityKeys/getIdentityKeysFactory.spec.js b/packages/js-dapi-client/test/unit/methods/platform/getIdentityKeys/getIdentityKeysFactory.spec.js new file mode 100644 index 0000000000..b1368ee41b --- /dev/null +++ b/packages/js-dapi-client/test/unit/methods/platform/getIdentityKeys/getIdentityKeysFactory.spec.js @@ -0,0 +1,173 @@ +const { + v0: { + PlatformPromiseClient, + GetIdentityKeysRequest, + GetIdentityKeysResponse, + ResponseMetadata, + Proof: ProofResponse, + KeyRequestType, + SpecificKeys, + }, +} = require('@dashevo/dapi-grpc'); +const { UInt32Value } = require('google-protobuf/google/protobuf/wrappers_pb'); + +const { GetIdentityKeysResponseV0 } = GetIdentityKeysResponse; +const { Keys } = GetIdentityKeysResponseV0; + +const getIdentityKeysFactory = require('../../../../../lib/methods/platform/getIdentityKeys/getIdentityKeysFactory'); +const getMetadataFixture = require('../../../../../lib/test/fixtures/getMetadataFixture'); +const getProofFixture = require('../../../../../lib/test/fixtures/getProofFixture'); +const Proof = require('../../../../../lib/methods/platform/response/Proof'); + +describe('getIdentityKeysFactory', () => { + let grpcTransportMock; + let getIdentityKeys; + let options; + let response; + let keys; + let identityId; + let keyIds; + let limit; + let metadataFixture; + let proofFixture; + let proofResponse; + + beforeEach(async function beforeEach() { + keys = [Buffer.alloc(41), Buffer.alloc(46)]; + keyIds = [0, 1]; + limit = 100; + + identityId = Buffer.alloc(32).fill(0); + + metadataFixture = getMetadataFixture(); + proofFixture = getProofFixture(); + + const metadata = new ResponseMetadata(); + metadata.setHeight(metadataFixture.height); + metadata.setCoreChainLockedHeight(metadataFixture.coreChainLockedHeight); + metadata.setTimeMs(metadataFixture.timeMs); + metadata.setProtocolVersion(metadataFixture.protocolVersion); + + response = new GetIdentityKeysResponse(); + + response.setV0( + new GetIdentityKeysResponseV0() + .setKeys(new Keys().setKeysBytesList(keys)) + .setMetadata(metadata), + ); + + proofResponse = new ProofResponse(); + + proofResponse.setQuorumHash(proofFixture.quorumHash); + proofResponse.setSignature(proofFixture.signature); + proofResponse.setGrovedbProof(proofFixture.merkleProof); + proofResponse.setRound(proofFixture.round); + + grpcTransportMock = { + request: this.sinon.stub().resolves(response), + }; + + getIdentityKeys = getIdentityKeysFactory(grpcTransportMock); + + options = { + timeout: 1000, + }; + }); + + it('should return identity keys', async () => { + const result = await getIdentityKeys(identityId, keyIds, limit, options); + + const { GetIdentityKeysRequestV0 } = GetIdentityKeysRequest; + const request = new GetIdentityKeysRequest(); + request.setV0( + new GetIdentityKeysRequestV0() + .setIdentityId(identityId) + .setRequestType(new KeyRequestType().setSpecificKeys(new SpecificKeys() + .setKeyIdsList(keyIds))) + .setLimit(new UInt32Value([limit])) + .setProve(false), + ); + + expect(grpcTransportMock.request).to.be.calledOnceWithExactly( + PlatformPromiseClient, + 'getIdentityKeys', + request, + options, + ); + expect(result.getIdentityKeys()).to.deep.equal(keys); + expect(result.getMetadata()).to.deep.equal(metadataFixture); + expect(result.getProof()).to.equal(undefined); + }); + + it('should return proof', async () => { + options.prove = true; + response.getV0().setKeys(undefined); + response.getV0().setProof(proofResponse); + + const result = await getIdentityKeys(identityId, keyIds, limit, options); + + const { GetIdentityKeysRequestV0 } = GetIdentityKeysRequest; + const request = new GetIdentityKeysRequest(); + request.setV0( + new GetIdentityKeysRequestV0() + .setIdentityId(identityId) + .setRequestType(new KeyRequestType().setSpecificKeys(new SpecificKeys() + .setKeyIdsList(keyIds))) + .setLimit(new UInt32Value([limit])) + .setProve(true), + ); + + expect(grpcTransportMock.request).to.be.calledOnceWithExactly( + PlatformPromiseClient, + 'getIdentityKeys', + request, + options, + ); + + expect(result.getIdentityKeys()).to.deep.equal([]); + + expect(result.getMetadata()).to.deep.equal(metadataFixture); + + expect(result.getProof()).to.be.an.instanceOf(Proof); + expect(result.getProof().getGrovedbProof()).to.deep.equal(proofFixture.merkleProof); + expect(result.getProof().getQuorumHash()).to.deep.equal(proofFixture.quorumHash); + expect(result.getProof().getSignature()).to.deep.equal(proofFixture.signature); + expect(result.getProof().getRound()).to.deep.equal(proofFixture.round); + expect(result.getMetadata()).to.deep.equal(metadataFixture); + expect(result.getMetadata().getHeight()).to.equal(metadataFixture.height); + expect(result.getMetadata().getCoreChainLockedHeight()).to.equal( + metadataFixture.coreChainLockedHeight, + ); + }); + + it('should throw unknown error', async () => { + const error = new Error('Unknown found'); + + grpcTransportMock.request.throws(error); + + const { GetIdentityKeysRequestV0 } = GetIdentityKeysRequest; + const request = new GetIdentityKeysRequest(); + request.setV0( + new GetIdentityKeysRequestV0() + .setIdentityId(identityId) + .setRequestType(new KeyRequestType().setSpecificKeys(new SpecificKeys() + .setKeyIdsList(keyIds))) + .setLimit(new UInt32Value([100])) + .setProve(false), + ); + + try { + await getIdentityKeys(identityId, keyIds, limit, options); + + expect.fail('should throw unknown error'); + } catch (e) { + expect(e).to.deep.equal(error); + expect(grpcTransportMock.request).to.be.calledOnceWithExactly( + PlatformPromiseClient, + 'getIdentityKeys', + request, + options, + ); + } + }); +}); diff --git a/packages/rs-drive/src/drive/identity/key/fetch/mod.rs b/packages/rs-drive/src/drive/identity/key/fetch/mod.rs index 0b201c3d64..38fdd96e42 100644 --- a/packages/rs-drive/src/drive/identity/key/fetch/mod.rs +++ b/packages/rs-drive/src/drive/identity/key/fetch/mod.rs @@ -867,7 +867,7 @@ impl IdentityKeysRequest { query: SizedQuery { query: Self::specific_keys_query(key_ids), limit, - offset, + offset: None, }, } } From 54471f6fac133da12f22b577595040c360146e29 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Fri, 8 Mar 2024 17:55:58 +0300 Subject: [PATCH 075/191] chore: update testnet genesis and core nightly (#1758) --- .../configs/defaults/getLocalConfigFactory.js | 6 ++++-- .../configs/defaults/getTestnetConfigFactory.js | 12 +++++++----- .../configs/getConfigFileMigrationsFactory.js | 13 +++++++++++++ 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/packages/dashmate/configs/defaults/getLocalConfigFactory.js b/packages/dashmate/configs/defaults/getLocalConfigFactory.js index aecfba296f..27457d3ba4 100644 --- a/packages/dashmate/configs/defaults/getLocalConfigFactory.js +++ b/packages/dashmate/configs/defaults/getLocalConfigFactory.js @@ -25,7 +25,8 @@ export default function getLocalConfigFactory(getBaseConfig) { }, core: { docker: { - image: 'dashpay/dashd:20.1.0-devpr5855.4d19698f', commandArgs: [], + image: 'dashpay/dashd:20.1.0-nightly.2024.02.15', + commandArgs: [], }, p2p: { port: 20001, @@ -83,7 +84,8 @@ export default function getLocalConfigFactory(getBaseConfig) { network: NETWORK_LOCAL, }; - return new Config('local', lodashMerge({}, getBaseConfig().getOptions(), options)); + return new Config('local', lodashMerge({}, getBaseConfig() + .getOptions(), options)); } return getLocalConfig; diff --git a/packages/dashmate/configs/defaults/getTestnetConfigFactory.js b/packages/dashmate/configs/defaults/getTestnetConfigFactory.js index 3edc08edb8..889db4ef36 100644 --- a/packages/dashmate/configs/defaults/getTestnetConfigFactory.js +++ b/packages/dashmate/configs/defaults/getTestnetConfigFactory.js @@ -25,7 +25,8 @@ export default function getTestnetConfigFactory(homeDir, getBaseConfig) { }, core: { docker: { - image: 'dashpay/dashd:20.1.0-devpr5855.4d19698f', commandArgs: [], + image: 'dashpay/dashd:20.1.0-nightly.2024.02.15', + commandArgs: [], }, p2p: { port: 19999, @@ -88,10 +89,10 @@ export default function getTestnetConfigFactory(homeDir, getBaseConfig) { port: 36660, }, genesis: { - genesis_time: '2023-11-02T10:18:00.000Z', - chain_id: 'dash-testnet-37', + genesis_time: '2024-03-07T13:26:00.000Z', + chain_id: 'dash-testnet-39', validator_quorum_type: 6, - initial_core_chain_locked_height: 918609, + initial_core_chain_locked_height: 984306, }, }, }, @@ -119,7 +120,8 @@ export default function getTestnetConfigFactory(homeDir, getBaseConfig) { network: NETWORK_TESTNET, }; - return new Config('testnet', lodashMerge({}, getBaseConfig().getOptions(), options)); + return new Config('testnet', lodashMerge({}, getBaseConfig() + .getOptions(), options)); } return getTestnetConfig; diff --git a/packages/dashmate/configs/getConfigFileMigrationsFactory.js b/packages/dashmate/configs/getConfigFileMigrationsFactory.js index 70293add03..95e0b6b8dd 100644 --- a/packages/dashmate/configs/getConfigFileMigrationsFactory.js +++ b/packages/dashmate/configs/getConfigFileMigrationsFactory.js @@ -475,6 +475,19 @@ export default function getConfigFileMigrationsFactory(homeDir, defaultConfigs) return configFile; }, + '1.0.0-dev.7': (configFile) => { + Object.entries(configFile.configs) + .forEach(([name, options]) => { + if (options.network === NETWORK_TESTNET && name !== 'base') { + options.platform.drive.tenderdash.genesis = testnet.get('platform.drive.tenderdash.genesis'); + } + + const defaultConfig = getDefaultConfigByNameOrGroup(name, options.group); + options.core.docker.image = defaultConfig.get('core.docker.image'); + }); + + return configFile; + }, }; } From 9a93eae77dbaa0d1b60342f91d41ebae8cdade52 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Fri, 8 Mar 2024 17:59:03 +0300 Subject: [PATCH 076/191] chore(release): update changelog and bump version to 1.0.0-dev.7 (#1759) --- CHANGELOG.md | 44 ++++++++++++++++++ Cargo.lock | 46 +++++++++---------- package.json | 2 +- packages/bench-suite/package.json | 2 +- packages/dapi-grpc/Cargo.toml | 2 +- packages/dapi-grpc/package.json | 2 +- packages/dapi/package.json | 2 +- packages/dash-spv/package.json | 2 +- packages/dashmate/package.json | 2 +- packages/dashpay-contract/Cargo.toml | 2 +- packages/dashpay-contract/package.json | 2 +- packages/data-contracts/Cargo.toml | 2 +- packages/dpns-contract/Cargo.toml | 2 +- packages/dpns-contract/package.json | 2 +- packages/feature-flags-contract/Cargo.toml | 2 +- packages/feature-flags-contract/package.json | 2 +- packages/js-dapi-client/package.json | 2 +- packages/js-dash-sdk/package.json | 2 +- packages/js-grpc-common/package.json | 2 +- .../Cargo.toml | 2 +- .../package.json | 2 +- packages/platform-test-suite/package.json | 2 +- packages/rs-dapi-client/Cargo.toml | 2 +- packages/rs-dapi-grpc-macros/Cargo.toml | 2 +- packages/rs-dpp/Cargo.toml | 2 +- packages/rs-drive-abci/Cargo.toml | 2 +- packages/rs-drive-proof-verifier/Cargo.toml | 2 +- packages/rs-drive/Cargo.toml | 2 +- .../Cargo.toml | 2 +- packages/rs-platform-serialization/Cargo.toml | 2 +- .../rs-platform-value-convertible/Cargo.toml | 2 +- packages/rs-platform-value/Cargo.toml | 2 +- packages/rs-platform-version/Cargo.toml | 2 +- packages/rs-platform-versioning/Cargo.toml | 2 +- packages/rs-sdk/Cargo.toml | 2 +- packages/simple-signer/Cargo.toml | 2 +- packages/strategy-tests/Cargo.toml | 2 +- packages/wallet-lib/package.json | 2 +- packages/wasm-dpp/Cargo.toml | 2 +- packages/wasm-dpp/package.json | 2 +- packages/withdrawals-contract/Cargo.toml | 2 +- packages/withdrawals-contract/package.json | 2 +- 42 files changed, 107 insertions(+), 63 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bfb808d763..81505eef46 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,47 @@ +## [1.0.0-dev.7](https://github.com/dashpay/platform/compare/v1.0.0-dev.6...v1.0.0-dev.7) (2024-03-08) + + +### ⚠ BREAKING CHANGES + +* **platform:** addded fee increase field to state transitions (#1750) + +### Features + +* enable random contract creation in strategies ([#1729](https://github.com/dashpay/platform/issues/1729)) +* **platform:** state transition fee increase and priorities ([#1750](https://github.com/dashpay/platform/issues/1750)) + + +### Bug Fixes + +* **drive:** inconsistent platform state and version during ABCI calls ([#1733](https://github.com/dashpay/platform/issues/1733)) +* **drive:** internal error on querying specific identity keys ([#1728](https://github.com/dashpay/platform/issues/1728)) +* resolve strategy-tests test failures ([#1743](https://github.com/dashpay/platform/issues/1743)) + + +### Documentation + +* update and expand mkdocs redirects ([#1740](https://github.com/dashpay/platform/issues/1740)) + + +### Code Refactoring + +* **drive:** expose more groveDB internals ([#1739](https://github.com/dashpay/platform/issues/1739)) +* reduce cargo clippy warnings ([#1738](https://github.com/dashpay/platform/issues/1738)) +* reduce cargo clippy warnings ([#1741](https://github.com/dashpay/platform/issues/1741)) +* reduce cargo clippy warnings in rs-dpp ([#1742](https://github.com/dashpay/platform/issues/1742)) +* resolve a few clippy warnings in dapi-grpc, rs-drive-proof-verifier, rs-platform-serialization, rs-platform-serialization-derive, rs-platform-value, rs-sdk, strategy-tests ([#1756](https://github.com/dashpay/platform/issues/1756)) +* resolve a few clippy warnings in rs-platform-serializaation and rs-platform-value ([#1744](https://github.com/dashpay/platform/issues/1744)) +* resolve clippy warnings in rs-dpp ([#1754](https://github.com/dashpay/platform/issues/1754)) +* resolve clippy warnings in rs-drive ([#1752](https://github.com/dashpay/platform/issues/1752)) +* resolve clippy warnings in rs-drive-abci ([#1755](https://github.com/dashpay/platform/issues/1755)) +* resolve clippy warnings in wasm-dpp ([#1753](https://github.com/dashpay/platform/issues/1753)) + + +### Miscellaneous Chores + +* fmt ([#1751](https://github.com/dashpay/platform/issues/1751)) +* update testnet genesis and core nightly ([#1758](https://github.com/dashpay/platform/issues/1758)) + ## [1.0.0-dev.6](https://github.com/dashpay/platform/compare/v1.0.0-dev.5...v1.0.0-dev.6) (2024-03-05) diff --git a/Cargo.lock b/Cargo.lock index 52ee1b2e6c..9b1a053a2f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -995,7 +995,7 @@ dependencies = [ [[package]] name = "dapi-grpc" -version = "1.0.0-dev.6" +version = "1.0.0-dev.7" dependencies = [ "dapi-grpc-macros", "futures-core", @@ -1011,7 +1011,7 @@ dependencies = [ [[package]] name = "dapi-grpc-macros" -version = "1.0.0-dev.6" +version = "1.0.0-dev.7" dependencies = [ "dapi-grpc", "heck", @@ -1117,7 +1117,7 @@ dependencies = [ [[package]] name = "dashpay-contract" -version = "1.0.0-dev.6" +version = "1.0.0-dev.7" dependencies = [ "platform-value", "platform-version", @@ -1127,7 +1127,7 @@ dependencies = [ [[package]] name = "data-contracts" -version = "1.0.0-dev.6" +version = "1.0.0-dev.7" dependencies = [ "dashpay-contract", "dpns-contract", @@ -1220,7 +1220,7 @@ checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" [[package]] name = "dpns-contract" -version = "1.0.0-dev.6" +version = "1.0.0-dev.7" dependencies = [ "platform-value", "platform-version", @@ -1230,7 +1230,7 @@ dependencies = [ [[package]] name = "dpp" -version = "1.0.0-dev.6" +version = "1.0.0-dev.7" dependencies = [ "anyhow", "async-trait", @@ -1281,7 +1281,7 @@ dependencies = [ [[package]] name = "drive" -version = "1.0.0-dev.6" +version = "1.0.0-dev.7" dependencies = [ "anyhow", "arc-swap", @@ -1318,7 +1318,7 @@ dependencies = [ [[package]] name = "drive-abci" -version = "1.0.0-dev.6" +version = "1.0.0-dev.7" dependencies = [ "arc-swap", "async-trait", @@ -1373,7 +1373,7 @@ dependencies = [ [[package]] name = "drive-proof-verifier" -version = "1.0.0-dev.6" +version = "1.0.0-dev.7" dependencies = [ "dapi-grpc", "dpp", @@ -1573,7 +1573,7 @@ checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" [[package]] name = "feature-flags-contract" -version = "1.0.0-dev.6" +version = "1.0.0-dev.7" dependencies = [ "platform-value", "platform-version", @@ -2437,7 +2437,7 @@ dependencies = [ [[package]] name = "masternode-reward-shares-contract" -version = "1.0.0-dev.6" +version = "1.0.0-dev.7" dependencies = [ "platform-value", "platform-version", @@ -2914,7 +2914,7 @@ checksum = "2900ede94e305130c13ddd391e0ab7cbaeb783945ae07a279c268cb05109c6cb" [[package]] name = "platform-serialization" -version = "1.0.0-dev.6" +version = "1.0.0-dev.7" dependencies = [ "bincode 2.0.0-rc.3", "platform-version", @@ -2922,7 +2922,7 @@ dependencies = [ [[package]] name = "platform-serialization-derive" -version = "1.0.0-dev.6" +version = "1.0.0-dev.7" dependencies = [ "proc-macro2", "quote", @@ -2932,7 +2932,7 @@ dependencies = [ [[package]] name = "platform-value" -version = "1.0.0-dev.6" +version = "1.0.0-dev.7" dependencies = [ "base64 0.13.1", "bincode 2.0.0-rc.3", @@ -2953,7 +2953,7 @@ dependencies = [ [[package]] name = "platform-value-convertible" -version = "1.0.0-dev.6" +version = "1.0.0-dev.7" dependencies = [ "quote", "syn 2.0.48", @@ -2961,14 +2961,14 @@ dependencies = [ [[package]] name = "platform-version" -version = "1.0.0-dev.6" +version = "1.0.0-dev.7" dependencies = [ "thiserror", ] [[package]] name = "platform-versioning" -version = "1.0.0-dev.6" +version = "1.0.0-dev.7" dependencies = [ "proc-macro2", "quote", @@ -3510,7 +3510,7 @@ dependencies = [ [[package]] name = "rs-dapi-client" -version = "1.0.0-dev.6" +version = "1.0.0-dev.7" dependencies = [ "backon", "chrono", @@ -3527,7 +3527,7 @@ dependencies = [ [[package]] name = "rs-sdk" -version = "1.0.0-dev.6" +version = "1.0.0-dev.7" dependencies = [ "async-trait", "base64 0.21.7", @@ -4014,7 +4014,7 @@ checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" [[package]] name = "simple-signer" -version = "1.0.0-dev.6" +version = "1.0.0-dev.7" dependencies = [ "anyhow", "bincode 2.0.0-rc.3", @@ -4105,7 +4105,7 @@ dependencies = [ [[package]] name = "strategy-tests" -version = "1.0.0-dev.6" +version = "1.0.0-dev.7" dependencies = [ "bincode 2.0.0-rc.3", "dpp", @@ -5027,7 +5027,7 @@ checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93" [[package]] name = "wasm-dpp" -version = "1.0.0-dev.6" +version = "1.0.0-dev.7" dependencies = [ "anyhow", "async-trait", @@ -5269,7 +5269,7 @@ dependencies = [ [[package]] name = "withdrawals-contract" -version = "1.0.0-dev.6" +version = "1.0.0-dev.7" dependencies = [ "num_enum", "platform-value", diff --git a/package.json b/package.json index 2a6d598ade..2e5227b12d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/platform", - "version": "1.0.0-dev.6", + "version": "1.0.0-dev.7", "private": true, "scripts": { "setup": "yarn install && yarn run build && yarn run configure", diff --git a/packages/bench-suite/package.json b/packages/bench-suite/package.json index d34a2b8f2d..ce1193d5b7 100644 --- a/packages/bench-suite/package.json +++ b/packages/bench-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/bench-suite", "private": true, - "version": "1.0.0-dev.6", + "version": "1.0.0-dev.7", "description": "Dash Platform benchmark tool", "scripts": { "bench": "node ./bin/bench.js", diff --git a/packages/dapi-grpc/Cargo.toml b/packages/dapi-grpc/Cargo.toml index ddf532951b..a81e737ebc 100644 --- a/packages/dapi-grpc/Cargo.toml +++ b/packages/dapi-grpc/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc" description = "GRPC client for Dash Platform" -version = "1.0.0-dev.6" +version = "1.0.0-dev.7" authors = [ "Samuel Westrich ", "Igor Markin ", diff --git a/packages/dapi-grpc/package.json b/packages/dapi-grpc/package.json index 1878b323ed..9b8b2db0fd 100644 --- a/packages/dapi-grpc/package.json +++ b/packages/dapi-grpc/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-grpc", - "version": "1.0.0-dev.6", + "version": "1.0.0-dev.7", "description": "DAPI GRPC definition file and generated clients", "browser": "browser.js", "main": "node.js", diff --git a/packages/dapi/package.json b/packages/dapi/package.json index b0a4d58b13..c3c26fd4b3 100644 --- a/packages/dapi/package.json +++ b/packages/dapi/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/dapi", "private": true, - "version": "1.0.0-dev.6", + "version": "1.0.0-dev.7", "description": "A decentralized API for the Dash network", "scripts": { "api": "node scripts/api.js", diff --git a/packages/dash-spv/package.json b/packages/dash-spv/package.json index 6d07a5c7c0..a7aa961683 100644 --- a/packages/dash-spv/package.json +++ b/packages/dash-spv/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dash-spv", - "version": "1.0.0-dev.6", + "version": "1.0.0-dev.7", "description": "Repository containing SPV functions used by @dashevo", "main": "index.js", "scripts": { diff --git a/packages/dashmate/package.json b/packages/dashmate/package.json index 43fc6129fa..a491677fae 100644 --- a/packages/dashmate/package.json +++ b/packages/dashmate/package.json @@ -1,6 +1,6 @@ { "name": "dashmate", - "version": "1.0.0-dev.6", + "version": "1.0.0-dev.7", "description": "Distribution package for Dash node installation", "scripts": { "lint": "eslint .", diff --git a/packages/dashpay-contract/Cargo.toml b/packages/dashpay-contract/Cargo.toml index f913d88a98..7ae9aab7d0 100644 --- a/packages/dashpay-contract/Cargo.toml +++ b/packages/dashpay-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dashpay-contract" description = "DashPay data contract schema and tools" -version = "1.0.0-dev.6" +version = "1.0.0-dev.7" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/dashpay-contract/package.json b/packages/dashpay-contract/package.json index 558519f9ce..1f52d9954a 100644 --- a/packages/dashpay-contract/package.json +++ b/packages/dashpay-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dashpay-contract", - "version": "1.0.0-dev.6", + "version": "1.0.0-dev.7", "description": "Reference contract of the DashPay DPA on Dash Evolution", "scripts": { "lint": "eslint .", diff --git a/packages/data-contracts/Cargo.toml b/packages/data-contracts/Cargo.toml index 8fdf75afc2..c452a5743d 100644 --- a/packages/data-contracts/Cargo.toml +++ b/packages/data-contracts/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "data-contracts" description = "Dash Platform system data contracts" -version = "1.0.0-dev.6" +version = "1.0.0-dev.7" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/dpns-contract/Cargo.toml b/packages/dpns-contract/Cargo.toml index 7e178482a0..06cc4f3305 100644 --- a/packages/dpns-contract/Cargo.toml +++ b/packages/dpns-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dpns-contract" description = "DPNS data contract schema and tools" -version = "1.0.0-dev.6" +version = "1.0.0-dev.7" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/dpns-contract/package.json b/packages/dpns-contract/package.json index 3c66b09d2a..823f56242e 100644 --- a/packages/dpns-contract/package.json +++ b/packages/dpns-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dpns-contract", - "version": "1.0.0-dev.6", + "version": "1.0.0-dev.7", "description": "A contract and helper scripts for DPNS DApp", "scripts": { "lint": "eslint .", diff --git a/packages/feature-flags-contract/Cargo.toml b/packages/feature-flags-contract/Cargo.toml index 8ebf7f1fda..fc6059583d 100644 --- a/packages/feature-flags-contract/Cargo.toml +++ b/packages/feature-flags-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "feature-flags-contract" description = "Feature flags data contract schema and tools" -version = "1.0.0-dev.6" +version = "1.0.0-dev.7" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/feature-flags-contract/package.json b/packages/feature-flags-contract/package.json index 31c620930d..71dbb6daca 100644 --- a/packages/feature-flags-contract/package.json +++ b/packages/feature-flags-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/feature-flags-contract", - "version": "1.0.0-dev.6", + "version": "1.0.0-dev.7", "description": "Data Contract to store Dash Platform feature flags", "scripts": { "build": "", diff --git a/packages/js-dapi-client/package.json b/packages/js-dapi-client/package.json index 078957393b..cb45075f30 100644 --- a/packages/js-dapi-client/package.json +++ b/packages/js-dapi-client/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-client", - "version": "1.0.0-dev.6", + "version": "1.0.0-dev.7", "description": "Client library used to access Dash DAPI endpoints", "main": "lib/index.js", "contributors": [ diff --git a/packages/js-dash-sdk/package.json b/packages/js-dash-sdk/package.json index 099885cb4b..bebf112986 100644 --- a/packages/js-dash-sdk/package.json +++ b/packages/js-dash-sdk/package.json @@ -1,6 +1,6 @@ { "name": "dash", - "version": "4.0.0-dev.6", + "version": "4.0.0-dev.7", "description": "Dash library for JavaScript/TypeScript ecosystem (Wallet, DAPI, Primitives, BLS, ...)", "main": "build/index.js", "unpkg": "dist/dash.min.js", diff --git a/packages/js-grpc-common/package.json b/packages/js-grpc-common/package.json index e37983400b..f832c4efcb 100644 --- a/packages/js-grpc-common/package.json +++ b/packages/js-grpc-common/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/grpc-common", - "version": "1.0.0-dev.6", + "version": "1.0.0-dev.7", "description": "Common GRPC library", "main": "index.js", "scripts": { diff --git a/packages/masternode-reward-shares-contract/Cargo.toml b/packages/masternode-reward-shares-contract/Cargo.toml index e18b2e5c2e..e911d3c402 100644 --- a/packages/masternode-reward-shares-contract/Cargo.toml +++ b/packages/masternode-reward-shares-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "masternode-reward-shares-contract" description = "Masternode reward shares data contract schema and tools" -version = "1.0.0-dev.6" +version = "1.0.0-dev.7" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/masternode-reward-shares-contract/package.json b/packages/masternode-reward-shares-contract/package.json index 3f7d86dc56..b56aae5dd0 100644 --- a/packages/masternode-reward-shares-contract/package.json +++ b/packages/masternode-reward-shares-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/masternode-reward-shares-contract", - "version": "1.0.0-dev.6", + "version": "1.0.0-dev.7", "description": "A contract and helper scripts for reward sharing", "scripts": { "lint": "eslint .", diff --git a/packages/platform-test-suite/package.json b/packages/platform-test-suite/package.json index e510cc7cd5..c0fc7ab6f5 100644 --- a/packages/platform-test-suite/package.json +++ b/packages/platform-test-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/platform-test-suite", "private": true, - "version": "1.0.0-dev.6", + "version": "1.0.0-dev.7", "description": "Dash Network end-to-end tests", "scripts": { "test": "yarn exec bin/test.sh", diff --git a/packages/rs-dapi-client/Cargo.toml b/packages/rs-dapi-client/Cargo.toml index 42ff23d25c..4e2d5ade5c 100644 --- a/packages/rs-dapi-client/Cargo.toml +++ b/packages/rs-dapi-client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rs-dapi-client" -version = "1.0.0-dev.6" +version = "1.0.0-dev.7" edition = "2021" [features] diff --git a/packages/rs-dapi-grpc-macros/Cargo.toml b/packages/rs-dapi-grpc-macros/Cargo.toml index a0fa6e6976..9e4e120d22 100644 --- a/packages/rs-dapi-grpc-macros/Cargo.toml +++ b/packages/rs-dapi-grpc-macros/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc-macros" -version = "1.0.0-dev.6" +version = "1.0.0-dev.7" edition = "2021" description = "Macros used by dapi-grpc. Internal use only." diff --git a/packages/rs-dpp/Cargo.toml b/packages/rs-dpp/Cargo.toml index 001517b8d4..6d2448fb8e 100644 --- a/packages/rs-dpp/Cargo.toml +++ b/packages/rs-dpp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dpp" -version = "1.0.0-dev.6" +version = "1.0.0-dev.7" edition = "2021" rust-version = "1.76" authors = [ diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index 318d7eab49..e58d7534db 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drive-abci" -version = "1.0.0-dev.6" +version = "1.0.0-dev.7" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/rs-drive-proof-verifier/Cargo.toml b/packages/rs-drive-proof-verifier/Cargo.toml index 7349770984..abfeb245fe 100644 --- a/packages/rs-drive-proof-verifier/Cargo.toml +++ b/packages/rs-drive-proof-verifier/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drive-proof-verifier" -version = "1.0.0-dev.6" +version = "1.0.0-dev.7" edition = "2021" rust-version = "1.76" diff --git a/packages/rs-drive/Cargo.toml b/packages/rs-drive/Cargo.toml index 7e76c9afb4..dd97727d5f 100644 --- a/packages/rs-drive/Cargo.toml +++ b/packages/rs-drive/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "drive" description = "Dash drive built on top of GroveDB" -version = "1.0.0-dev.6" +version = "1.0.0-dev.7" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/rs-platform-serialization-derive/Cargo.toml b/packages/rs-platform-serialization-derive/Cargo.toml index 01a4c749f2..da9ba0859c 100644 --- a/packages/rs-platform-serialization-derive/Cargo.toml +++ b/packages/rs-platform-serialization-derive/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization-derive" authors = ["Samuel Westrich "] description = "Bincode serialization and deserialization derivations" -version = "1.0.0-dev.6" +version = "1.0.0-dev.7" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/rs-platform-serialization/Cargo.toml b/packages/rs-platform-serialization/Cargo.toml index 0789334a74..11ceacd57f 100644 --- a/packages/rs-platform-serialization/Cargo.toml +++ b/packages/rs-platform-serialization/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization" authors = ["Samuel Westrich "] description = "Bincode based serialization and deserialization" -version = "1.0.0-dev.6" +version = "1.0.0-dev.7" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/rs-platform-value-convertible/Cargo.toml b/packages/rs-platform-value-convertible/Cargo.toml index 8f746c189f..03fb6b1dce 100644 --- a/packages/rs-platform-value-convertible/Cargo.toml +++ b/packages/rs-platform-value-convertible/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-value-convertible" authors = ["Samuel Westrich "] description = "Convertion to and from platform values" -version = "1.0.0-dev.6" +version = "1.0.0-dev.7" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/rs-platform-value/Cargo.toml b/packages/rs-platform-value/Cargo.toml index c4750d0ec9..58207402b9 100644 --- a/packages/rs-platform-value/Cargo.toml +++ b/packages/rs-platform-value/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-value" authors = ["Samuel Westrich "] description = "A simple value module" -version = "1.0.0-dev.6" +version = "1.0.0-dev.7" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/rs-platform-version/Cargo.toml b/packages/rs-platform-version/Cargo.toml index 8b201e8ad2..fc6d03cb2c 100644 --- a/packages/rs-platform-version/Cargo.toml +++ b/packages/rs-platform-version/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-version" authors = ["Samuel Westrich "] description = "Bincode based serialization and deserialization" -version = "1.0.0-dev.6" +version = "1.0.0-dev.7" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/rs-platform-versioning/Cargo.toml b/packages/rs-platform-versioning/Cargo.toml index edb3b95a16..7c0f5c66a6 100644 --- a/packages/rs-platform-versioning/Cargo.toml +++ b/packages/rs-platform-versioning/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-versioning" authors = ["Samuel Westrich "] description = "Version derivation" -version = "1.0.0-dev.6" +version = "1.0.0-dev.7" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/rs-sdk/Cargo.toml b/packages/rs-sdk/Cargo.toml index a4fc71b585..86e2cb873f 100644 --- a/packages/rs-sdk/Cargo.toml +++ b/packages/rs-sdk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rs-sdk" -version = "1.0.0-dev.6" +version = "1.0.0-dev.7" edition = "2021" [dependencies] diff --git a/packages/simple-signer/Cargo.toml b/packages/simple-signer/Cargo.toml index ff6560ee07..53a3244de3 100644 --- a/packages/simple-signer/Cargo.toml +++ b/packages/simple-signer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "simple-signer" -version = "1.0.0-dev.6" +version = "1.0.0-dev.7" edition = "2021" rust-version = "1.76" diff --git a/packages/strategy-tests/Cargo.toml b/packages/strategy-tests/Cargo.toml index f6b3c0e6ea..d0a35c4c9a 100644 --- a/packages/strategy-tests/Cargo.toml +++ b/packages/strategy-tests/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "strategy-tests" -version = "1.0.0-dev.6" +version = "1.0.0-dev.7" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/wallet-lib/package.json b/packages/wallet-lib/package.json index 05d2a84738..13839be28a 100644 --- a/packages/wallet-lib/package.json +++ b/packages/wallet-lib/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wallet-lib", - "version": "8.0.0-dev.6", + "version": "8.0.0-dev.7", "description": "Light wallet library for Dash", "main": "src/index.js", "unpkg": "dist/wallet-lib.min.js", diff --git a/packages/wasm-dpp/Cargo.toml b/packages/wasm-dpp/Cargo.toml index dd4f64e369..4e30760e00 100644 --- a/packages/wasm-dpp/Cargo.toml +++ b/packages/wasm-dpp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasm-dpp" -version = "1.0.0-dev.6" +version = "1.0.0-dev.7" edition = "2021" rust-version = "1.76" authors = ["Anton Suprunchuk "] diff --git a/packages/wasm-dpp/package.json b/packages/wasm-dpp/package.json index 9ade788b3c..7cc485ab16 100644 --- a/packages/wasm-dpp/package.json +++ b/packages/wasm-dpp/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wasm-dpp", - "version": "1.0.0-dev.6", + "version": "1.0.0-dev.7", "description": "The JavaScript implementation of the Dash Platform Protocol", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/withdrawals-contract/Cargo.toml b/packages/withdrawals-contract/Cargo.toml index 15e74849f3..ffb133ae02 100644 --- a/packages/withdrawals-contract/Cargo.toml +++ b/packages/withdrawals-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "withdrawals-contract" description = "Witdrawals data contract schema and tools" -version = "1.0.0-dev.6" +version = "1.0.0-dev.7" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/withdrawals-contract/package.json b/packages/withdrawals-contract/package.json index 34a0789f23..dbd0450d0b 100644 --- a/packages/withdrawals-contract/package.json +++ b/packages/withdrawals-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/withdrawals-contract", - "version": "1.0.0-dev.6", + "version": "1.0.0-dev.7", "description": "Data Contract to manipulate and track withdrawals", "scripts": { "build": "", From 1ca71e3cefd74f279fd340110eabfad1cde12af6 Mon Sep 17 00:00:00 2001 From: Paul DeLucia <69597248+pauldelucia@users.noreply.github.com> Date: Sat, 9 Mar 2024 19:52:51 +0700 Subject: [PATCH 077/191] refactor: strategy test start identities (#1749) --- .../tests/strategy_tests/chain_lock_update.rs | 2 +- .../tests/strategy_tests/core_update_tests.rs | 6 +- .../tests/strategy_tests/failures.rs | 376 +++++++++--------- .../tests/strategy_tests/main.rs | 68 ++-- .../tests/strategy_tests/query.rs | 6 +- .../tests/strategy_tests/strategy.rs | 11 +- .../strategy_tests/upgrade_fork_tests.rs | 14 +- packages/strategy-tests/src/lib.rs | 18 +- 8 files changed, 258 insertions(+), 243 deletions(-) diff --git a/packages/rs-drive-abci/tests/strategy_tests/chain_lock_update.rs b/packages/rs-drive-abci/tests/strategy_tests/chain_lock_update.rs index 5842362770..552ca3497f 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/chain_lock_update.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/chain_lock_update.rs @@ -18,7 +18,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: vec![], + start_identities: (0, 0), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, diff --git a/packages/rs-drive-abci/tests/strategy_tests/core_update_tests.rs b/packages/rs-drive-abci/tests/strategy_tests/core_update_tests.rs index 49405ee099..520ae17c22 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/core_update_tests.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/core_update_tests.rs @@ -17,7 +17,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: vec![], + start_identities: (0, 0), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, @@ -117,7 +117,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: vec![], + start_identities: (0, 0), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, @@ -203,7 +203,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: vec![], + start_identities: (0, 0), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, diff --git a/packages/rs-drive-abci/tests/strategy_tests/failures.rs b/packages/rs-drive-abci/tests/strategy_tests/failures.rs index c01c8be759..32da82fac0 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/failures.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/failures.rs @@ -57,7 +57,7 @@ mod tests { Some(BTreeMap::from([(3, contract_update_1)])), )], operations: vec![], - start_identities: vec![], + start_identities: (0, 0), identities_inserts: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -134,7 +134,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: vec![], + start_identities: (0, 0), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, @@ -204,190 +204,190 @@ mod tests { run_chain_for_strategy(&mut platform, 15, strategy, config, 15); } - #[test] - fn run_chain_block_two_state_transitions_conflicting_unique_index() { - // In this test we try to insert two state transitions with the same unique index - // We use the dpns contract and we insert two documents both with the same "name" - // This is a common scenario we should see quite often - let config = PlatformConfig { - validator_set_quorum_size: 100, - validator_set_quorum_type: "llmq_100_67".to_string(), - chain_lock_quorum_type: "llmq_100_67".to_string(), - execution: ExecutionConfig { - //we disable document triggers because we are using dpns and dpns needs a preorder - use_document_triggers: false, - validator_set_rotation_block_count: 25, - ..Default::default() - }, - block_spacing_ms: 3000, - testing_configs: PlatformTestConfig::default_with_no_block_signing(), - ..Default::default() - }; - let mut platform = TestPlatformBuilder::new() - .with_config(config.clone()) - .build_with_mock_rpc(); - - let platform_version = PlatformVersion::latest(); - - let mut rng = StdRng::seed_from_u64(567); - - let mut simple_signer = SimpleSigner::default(); - - let (identity1, keys) = - Identity::random_identity_with_main_keys_with_private_key::>( - 2, - &mut rng, - platform_version, - ) - .unwrap(); - - simple_signer.add_keys(keys); - - let (identity2, keys) = - Identity::random_identity_with_main_keys_with_private_key::>( - 2, - &mut rng, - platform_version, - ) - .unwrap(); - - simple_signer.add_keys(keys); - - let start_identities = strategy_tests::transitions::create_state_transitions_for_identities( - vec![identity1, identity2], - &mut simple_signer, - &mut rng, - platform_version, - ); - - let dpns_contract = platform - .drive - .cache - .system_data_contracts - .load_dpns() - .clone(); - - let dpns_contract_for_type = dpns_contract.clone(); - - let domain_document_type_ref = dpns_contract_for_type - .document_type_for_name("domain") - .expect("expected a profile document type"); - - let document_op_1 = DocumentOp { - contract: dpns_contract.as_ref().clone(), - action: DocumentAction::DocumentActionInsertSpecific( - BTreeMap::from([ - ("label".into(), "simon1".into()), - ("normalizedLabel".into(), "s1m0n1".into()), - ("normalizedParentDomainName".into(), "dash".into()), - ( - "records".into(), - BTreeMap::from([( - "dashUniqueIdentityId", - Value::from(start_identities.first().unwrap().0.id()), - )]) - .into(), - ), - ]), - Some(start_identities.first().unwrap().0.id()), - DocumentFieldFillType::FillIfNotRequired, - DocumentFieldFillSize::AnyDocumentFillSize, - ), - document_type: domain_document_type_ref.to_owned_document_type(), - }; - - let document_op_2 = DocumentOp { - contract: dpns_contract.as_ref().clone(), - action: DocumentAction::DocumentActionInsertSpecific( - BTreeMap::from([ - ("label".into(), "simon1".into()), - ("normalizedLabel".into(), "s1m0n1".into()), - ("normalizedParentDomainName".into(), "dash".into()), - ( - "records".into(), - BTreeMap::from([( - "dashUniqueIdentityId", - Value::from(start_identities.last().unwrap().0.id()), - )]) - .into(), - ), - ]), - Some(start_identities.last().unwrap().0.id()), - DocumentFieldFillType::FillIfNotRequired, - DocumentFieldFillSize::AnyDocumentFillSize, - ), - document_type: domain_document_type_ref.to_owned_document_type(), - }; - - let strategy = NetworkStrategy { - strategy: Strategy { - contracts_with_updates: vec![], - operations: vec![ - Operation { - op_type: OperationType::Document(document_op_1), - frequency: Frequency { - times_per_block_range: 1..2, - chance_per_block: None, - }, - }, - Operation { - op_type: OperationType::Document(document_op_2), - frequency: Frequency { - times_per_block_range: 1..2, - chance_per_block: None, - }, - }, - ], - start_identities, - identities_inserts: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, - identity_contract_nonce_gaps: None, - signer: Some(simple_signer), - }, - total_hpmns: 100, - extra_normal_mns: 0, - validator_quorum_count: 24, - chain_lock_quorum_count: 24, - upgrading_info: None, - core_height_increase: KnownCoreHeightIncreases(vec![10, 11]), - proposer_strategy: Default::default(), - rotate_quorums: false, - failure_testing: Some(FailureStrategy { - deterministic_start_seed: None, - dont_finalize_block: false, - expect_every_block_errors_with_codes: vec![4009], //duplicate unique index - rounds_before_successful_block: None, - expect_specific_block_errors_with_codes: Default::default(), - }), - query_testing: None, - verify_state_transition_results: true, - ..Default::default() - }; - - // On the first block we only have identities and contracts - let outcome = - run_chain_for_strategy(&mut platform, 2, strategy.clone(), config.clone(), 15); - - let state_transitions_block_2 = &outcome - .state_transition_results_per_block - .get(&2) - .expect("expected to get block 2"); - - let first_document_insert_result = &state_transitions_block_2 - .first() - .expect("expected a document insert") - .1; - - assert_eq!(first_document_insert_result.code, 0); - - let second_document_insert_result = &state_transitions_block_2 - .get(1) - .expect("expected an invalid state transition") - .1; - - // Second document should fail with DuplicateUniqueIndexError - assert_eq!(second_document_insert_result.code, 4009); - } + // #[test] + // fn run_chain_block_two_state_transitions_conflicting_unique_index() { + // // In this test we try to insert two state transitions with the same unique index + // // We use the dpns contract and we insert two documents both with the same "name" + // // This is a common scenario we should see quite often + // let config = PlatformConfig { + // validator_set_quorum_size: 100, + // validator_set_quorum_type: "llmq_100_67".to_string(), + // chain_lock_quorum_type: "llmq_100_67".to_string(), + // execution: ExecutionConfig { + // //we disable document triggers because we are using dpns and dpns needs a preorder + // use_document_triggers: false, + // validator_set_rotation_block_count: 25, + // ..Default::default() + // }, + // block_spacing_ms: 3000, + // testing_configs: PlatformTestConfig::default_with_no_block_signing(), + // ..Default::default() + // }; + // let mut platform = TestPlatformBuilder::new() + // .with_config(config.clone()) + // .build_with_mock_rpc(); + + // let platform_version = PlatformVersion::latest(); + + // let mut rng = StdRng::seed_from_u64(567); + + // let mut simple_signer = SimpleSigner::default(); + + // let (identity1, keys) = + // Identity::random_identity_with_main_keys_with_private_key::>( + // 2, + // &mut rng, + // platform_version, + // ) + // .unwrap(); + + // simple_signer.add_keys(keys); + + // let (identity2, keys) = + // Identity::random_identity_with_main_keys_with_private_key::>( + // 2, + // &mut rng, + // platform_version, + // ) + // .unwrap(); + + // simple_signer.add_keys(keys); + + // let start_identities = strategy_tests::transitions::create_state_transitions_for_identities( + // vec![identity1, identity2], + // &mut simple_signer, + // &mut rng, + // platform_version, + // ); + + // let dpns_contract = platform + // .drive + // .cache + // .system_data_contracts + // .read_dpns() + // .clone(); + + // let dpns_contract_for_type = dpns_contract.clone(); + + // let domain_document_type_ref = dpns_contract_for_type + // .document_type_for_name("domain") + // .expect("expected a profile document type"); + + // let document_op_1 = DocumentOp { + // contract: dpns_contract.clone(), + // action: DocumentAction::DocumentActionInsertSpecific( + // BTreeMap::from([ + // ("label".into(), "simon1".into()), + // ("normalizedLabel".into(), "s1m0n1".into()), + // ("normalizedParentDomainName".into(), "dash".into()), + // ( + // "records".into(), + // BTreeMap::from([( + // "dashUniqueIdentityId", + // Value::from(start_identities.first().unwrap().0.id()), + // )]) + // .into(), + // ), + // ]), + // Some(start_identities.first().unwrap().0.id()), + // DocumentFieldFillType::FillIfNotRequired, + // DocumentFieldFillSize::AnyDocumentFillSize, + // ), + // document_type: domain_document_type_ref.to_owned_document_type(), + // }; + + // let document_op_2 = DocumentOp { + // contract: dpns_contract, + // action: DocumentAction::DocumentActionInsertSpecific( + // BTreeMap::from([ + // ("label".into(), "simon1".into()), + // ("normalizedLabel".into(), "s1m0n1".into()), + // ("normalizedParentDomainName".into(), "dash".into()), + // ( + // "records".into(), + // BTreeMap::from([( + // "dashUniqueIdentityId", + // Value::from(start_identities.last().unwrap().0.id()), + // )]) + // .into(), + // ), + // ]), + // Some(start_identities.last().unwrap().0.id()), + // DocumentFieldFillType::FillIfNotRequired, + // DocumentFieldFillSize::AnyDocumentFillSize, + // ), + // document_type: domain_document_type_ref.to_owned_document_type(), + // }; + + // let strategy = NetworkStrategy { + // strategy: Strategy { + // contracts_with_updates: vec![], + // operations: vec![ + // Operation { + // op_type: OperationType::Document(document_op_1), + // frequency: Frequency { + // times_per_block_range: 1..2, + // chance_per_block: None, + // }, + // }, + // Operation { + // op_type: OperationType::Document(document_op_2), + // frequency: Frequency { + // times_per_block_range: 1..2, + // chance_per_block: None, + // }, + // }, + // ], + // start_identities, + // identities_inserts: Frequency { + // times_per_block_range: Default::default(), + // chance_per_block: None, + // }, + // identity_contract_nonce_gaps: None, + // signer: Some(simple_signer), + // }, + // total_hpmns: 100, + // extra_normal_mns: 0, + // validator_quorum_count: 24, + // chain_lock_quorum_count: 24, + // upgrading_info: None, + // core_height_increase: KnownCoreHeightIncreases(vec![10, 11]), + // proposer_strategy: Default::default(), + // rotate_quorums: false, + // failure_testing: Some(FailureStrategy { + // deterministic_start_seed: None, + // dont_finalize_block: false, + // expect_every_block_errors_with_codes: vec![4009], //duplicate unique index + // rounds_before_successful_block: None, + // expect_specific_block_errors_with_codes: Default::default(), + // }), + // query_testing: None, + // verify_state_transition_results: true, + // ..Default::default() + // }; + + // // On the first block we only have identities and contracts + // let outcome = + // run_chain_for_strategy(&mut platform, 2, strategy.clone(), config.clone(), 15); + + // let state_transitions_block_2 = &outcome + // .state_transition_results_per_block + // .get(&2) + // .expect("expected to get block 2"); + + // let first_document_insert_result = &state_transitions_block_2 + // .first() + // .expect("expected a document insert") + // .1; + + // assert_eq!(first_document_insert_result.code, 0); + + // let second_document_insert_result = &state_transitions_block_2 + // .get(1) + // .expect("expected an invalid state transition") + // .1; + + // // Second document should fail with DuplicateUniqueIndexError + // assert_eq!(second_document_insert_result.code, 4009); + // } } diff --git a/packages/rs-drive-abci/tests/strategy_tests/main.rs b/packages/rs-drive-abci/tests/strategy_tests/main.rs index bc24b6ec30..4ebb9dc3fd 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/main.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/main.rs @@ -145,7 +145,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: vec![], + start_identities: (0, 0), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, @@ -191,7 +191,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: vec![], + start_identities: (0, 0), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, @@ -238,7 +238,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: vec![], + start_identities: (0, 0), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, @@ -366,7 +366,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: vec![], + start_identities: (0, 0), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, @@ -501,7 +501,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: vec![], + start_identities: (0, 0), identities_inserts: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -562,7 +562,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: vec![], + start_identities: (0, 0), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, @@ -612,7 +612,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: vec![], + start_identities: (0, 0), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, @@ -670,7 +670,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: vec![], + start_identities: (0, 0), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, @@ -733,7 +733,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: vec![], + start_identities: (0, 0), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, @@ -809,7 +809,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: vec![], + start_identities: (0, 0), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, @@ -874,7 +874,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: vec![], + start_identities: (0, 0), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, @@ -942,7 +942,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: vec![], + start_identities: (0, 0), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, @@ -1037,7 +1037,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: vec![], + start_identities: (0, 0), identities_inserts: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -1091,7 +1091,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: vec![], + start_identities: (0, 0), identities_inserts: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -1169,7 +1169,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![(contract, None)], operations: vec![], - start_identities: vec![], + start_identities: (0, 0), identities_inserts: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -1276,7 +1276,7 @@ mod tests { ])), )], operations: vec![], - start_identities: vec![], + start_identities: (0, 0), identities_inserts: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -1376,7 +1376,7 @@ mod tests { chance_per_block: None, }, }], - start_identities: vec![], + start_identities: (0, 0), identities_inserts: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -1452,7 +1452,7 @@ mod tests { chance_per_block: None, }, }], - start_identities: vec![], + start_identities: (0, 0), identities_inserts: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -1556,7 +1556,7 @@ mod tests { }, }, ], - start_identities: vec![], + start_identities: (0, 0), identities_inserts: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -1660,7 +1660,7 @@ mod tests { }, }, ], - start_identities: vec![], + start_identities: (0, 0), identities_inserts: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -1779,7 +1779,7 @@ mod tests { }, }, ], - start_identities: vec![], + start_identities: (0, 0), identities_inserts: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -1900,7 +1900,7 @@ mod tests { }, }, ], - start_identities: vec![], + start_identities: (0, 0), identities_inserts: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -2010,7 +2010,7 @@ mod tests { }, }, ], - start_identities: vec![], + start_identities: (0, 0), identities_inserts: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -2120,7 +2120,7 @@ mod tests { }, }, ], - start_identities: vec![], + start_identities: (0, 0), identities_inserts: Frequency { times_per_block_range: 1..30, chance_per_block: None, @@ -2244,7 +2244,7 @@ mod tests { }, }, ], - start_identities: vec![], + start_identities: (0, 0), identities_inserts: Frequency { times_per_block_range: 1..6, chance_per_block: None, @@ -2312,7 +2312,7 @@ mod tests { chance_per_block: None, }, }], - start_identities: vec![], + start_identities: (0, 0), identities_inserts: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -2386,7 +2386,7 @@ mod tests { chance_per_block: None, }, }], - start_identities: vec![], + start_identities: (0, 0), identities_inserts: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -2467,7 +2467,7 @@ mod tests { chance_per_block: None, }, }], - start_identities: vec![], + start_identities: (0, 0), identities_inserts: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -2556,7 +2556,7 @@ mod tests { }, }, ], - start_identities: vec![], + start_identities: (0, 0), identities_inserts: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -3112,7 +3112,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: vec![], + start_identities: (0, 0), identities_inserts: Frequency { //we do this to create some paying transactions times_per_block_range: 1..2, @@ -3272,7 +3272,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: vec![], + start_identities: (0, 0), identities_inserts: Frequency { //we do this to create some paying transactions times_per_block_range: 1..2, @@ -3403,7 +3403,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: vec![], + start_identities: (0, 0), identities_inserts: Frequency { //we do this to create some paying transactions times_per_block_range: 1..2, @@ -3535,7 +3535,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: vec![], + start_identities: (0, 0), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, @@ -3668,7 +3668,7 @@ mod tests { chance_per_block: None, }, }], - start_identities: vec![], + start_identities: (0, 0), identities_inserts: Frequency { times_per_block_range: 6..10, chance_per_block: None, diff --git a/packages/rs-drive-abci/tests/strategy_tests/query.rs b/packages/rs-drive-abci/tests/strategy_tests/query.rs index 77faf51a20..916fdef060 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/query.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/query.rs @@ -371,7 +371,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: vec![], + start_identities: (0, 0), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, @@ -471,7 +471,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: vec![], + start_identities: (0, 0), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, @@ -572,7 +572,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: vec![], + start_identities: (0, 0), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, diff --git a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs index b419637495..495a46c6d1 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs @@ -365,8 +365,15 @@ impl NetworkStrategy { platform_version: &PlatformVersion, ) -> Result, ProtocolError> { let mut state_transitions = vec![]; - if block_info.height == 1 && !self.strategy.start_identities.is_empty() { - state_transitions.append(&mut self.strategy.start_identities.clone()); + if block_info.height == 1 && self.strategy.start_identities.0 > 0 { + let mut new_transitions = NetworkStrategy::create_identities_state_transitions( + self.strategy.start_identities.0.into(), + 5, + signer, + rng, + platform_version, + ); + state_transitions.append(&mut new_transitions); } let frequency = &self.strategy.identities_inserts; if frequency.check_hit(rng) { diff --git a/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs b/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs index 894da37975..14b309688c 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs @@ -35,7 +35,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: vec![], + start_identities: (0, 0), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, @@ -278,7 +278,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: vec![], + start_identities: (0, 0), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, @@ -510,7 +510,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: vec![], + start_identities: (0, 0), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, @@ -739,7 +739,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: vec![], + start_identities: (0, 0), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, @@ -899,7 +899,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: vec![], + start_identities: (0, 0), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, @@ -1060,7 +1060,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: vec![], + start_identities: (0, 0), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, @@ -1162,7 +1162,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: vec![], + start_identities: (0, 0), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, diff --git a/packages/strategy-tests/src/lib.rs b/packages/strategy-tests/src/lib.rs index 0b1e155b3a..786bd0dc77 100644 --- a/packages/strategy-tests/src/lib.rs +++ b/packages/strategy-tests/src/lib.rs @@ -92,7 +92,7 @@ pub struct Strategy { Option>, )>, pub operations: Vec, - pub start_identities: Vec<(Identity, StateTransition)>, + pub start_identities: (u8, u8), pub identities_inserts: Frequency, pub identity_contract_nonce_gaps: Option, pub signer: Option, @@ -120,7 +120,7 @@ pub enum LocalDocumentQuery<'a> { struct StrategyInSerializationFormat { pub contracts_with_updates: Vec<(Vec, Option>>)>, pub operations: Vec>, - pub start_identities: Vec<(Identity, StateTransition)>, + pub start_identities: (u8, u8), pub identities_inserts: Frequency, pub identity_contract_nonce_gaps: Option, pub signer: Option, @@ -325,8 +325,16 @@ impl Strategy { let mut state_transitions = vec![]; // Add start_identities - if block_info.height == config.start_block_height && !self.start_identities.is_empty() { - state_transitions.append(&mut self.start_identities.clone()); + if block_info.height == config.start_block_height && self.start_identities.0 > 0 { + let mut new_transitions = crate::transitions::create_identities_state_transitions( + self.start_identities.0.into(), // number of identities + self.start_identities.1.into(), // number of keys per identity + signer, + rng, + create_asset_lock, + platform_version, + )?; + state_transitions.append(&mut new_transitions); } // Add identities_inserts @@ -1557,7 +1565,7 @@ mod tests { }, }, ], - start_identities, + start_identities: (2, 3), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, From 65dcc261b9e3ceae27aa8ef0818260c2abd2ce44 Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Sun, 10 Mar 2024 18:27:01 +0700 Subject: [PATCH 078/191] small fix --- packages/strategy-tests/src/lib.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/strategy-tests/src/lib.rs b/packages/strategy-tests/src/lib.rs index 8f2da88682..f56082eb33 100644 --- a/packages/strategy-tests/src/lib.rs +++ b/packages/strategy-tests/src/lib.rs @@ -430,8 +430,7 @@ impl Strategy { } // Update any document transitions that registered to the old contract id - let mut operations = std::mem::replace(&mut self.operations, Vec::new()); - for op in operations.iter_mut() { + for op in self.operations.iter_mut() { if let OperationType::Document(document_op) = &mut op.op_type { document_op.contract = contract.clone(); let document_type = contract.document_type_cloned_for_name(document_op.document_type.name()) @@ -439,7 +438,6 @@ impl Strategy { document_op.document_type = document_type; } } - self.operations = operations; DataContractCreateTransition::new_from_data_contract( contract.clone(), From e83150382756780f640f68ee53ebd0e55c12ea74 Mon Sep 17 00:00:00 2001 From: PastaPastaPasta <6443210+PastaPastaPasta@users.noreply.github.com> Date: Sun, 10 Mar 2024 12:19:24 -0500 Subject: [PATCH 079/191] refactor: resolve various warnings during build or by clippy (#1761) --- packages/dapi-grpc/src/lib.rs | 1 + packages/rs-dpp/src/identity/mod.rs | 6 +-- packages/rs-dpp/src/signing.rs | 4 +- packages/rs-dpp/src/state_transition/mod.rs | 14 +++---- .../document_delete_transition/mod.rs | 2 +- .../document_replace_transition/mod.rs | 2 +- packages/rs-dpp/src/util/deserializer.rs | 3 ++ .../rs-drive-abci/src/abci/app/consensus.rs | 1 - .../src/abci/handler/finalize_block.rs | 1 - .../src/abci/handler/init_chain.rs | 2 - .../src/abci/handler/prepare_proposal.rs | 2 +- .../src/abci/handler/process_proposal.rs | 10 ++--- .../src/abci/handler/verify_vote_extension.rs | 2 +- .../engine/run_block_proposal/mod.rs | 1 - .../block_end/update_state_cache/v0/mod.rs | 2 - .../update_core_info/mod.rs | 1 - .../mod.rs | 6 +-- .../v0/mod.rs | 7 ++-- .../verify_chain_lock/v0/mod.rs | 12 +++--- .../verify_chain_lock_through_core/v0/mod.rs | 7 ++-- .../create_genesis_state/v0/mod.rs | 2 +- .../execute_event/v0/mod.rs | 6 +-- .../process_raw_state_transitions/v0/mod.rs | 3 +- .../validate_fees_of_event/v0/mod.rs | 6 +-- .../execution/types/execution_event/mod.rs | 20 ++++----- .../check_tx_verification/v0/mod.rs | 8 ++-- .../mod.rs | 5 --- .../bindings/data_trigger_binding/v0/mod.rs | 2 +- .../data_triggers/triggers/dpns/v0/mod.rs | 2 +- .../triggers/feature_flags/v0/mod.rs | 2 +- .../triggers/withdrawals/v0/mod.rs | 2 +- .../balance/v0/mod.rs | 5 +-- .../balance/v0/mod.rs | 5 +-- .../rs-drive-abci/src/logging/destination.rs | 1 - .../src/platform_types/platform/mod.rs | 1 - .../src/platform_types/platform_state/mod.rs | 8 +++- .../platform_types/platform_state/v0/mod.rs | 2 +- .../unsigned_withdrawal_txs/v0/mod.rs | 6 +-- .../data_contract_history/mod.rs | 2 +- .../identity_based_queries/identity/v0/mod.rs | 2 +- packages/rs-drive-abci/src/query/service.rs | 2 +- packages/rs-drive-abci/src/rpc/core.rs | 6 +-- .../tests/strategy_tests/execution.rs | 2 +- .../strategy_tests/upgrade_fork_tests.rs | 1 - packages/rs-drive-proof-verifier/src/proof.rs | 12 +++--- packages/rs-drive/Cargo.toml | 1 - packages/rs-drive/src/query/conditions.rs | 2 +- .../identity/identity_update/mod.rs | 1 - packages/rs-drive/tests/query_tests.rs | 36 ++++++++-------- .../Cargo.toml | 1 - packages/rs-platform-serialization/Cargo.toml | 1 - .../rs-platform-value-convertible/Cargo.toml | 1 - packages/rs-platform-value/Cargo.toml | 1 - packages/rs-platform-version/Cargo.toml | 1 - packages/rs-platform-versioning/Cargo.toml | 1 - packages/rs-sdk/src/core_client.rs | 4 ++ packages/rs-sdk/src/lib.rs | 3 +- packages/rs-sdk/src/mock/sdk.rs | 2 + packages/rs-sdk/src/sdk.rs | 20 ++++----- packages/strategy-tests/src/lib.rs | 8 ++-- packages/strategy-tests/src/operations.rs | 42 +++++++++---------- packages/strategy-tests/src/transitions.rs | 14 +++---- .../src/data_contract/data_contract_facade.rs | 1 - .../data_contract_factory.rs | 1 - .../src/document/extended_document.rs | 1 + packages/wasm-dpp/src/document/factory.rs | 36 +++++++--------- .../invalid_identity_contract_nonce_error.rs | 3 +- .../transition.rs | 12 +++--- .../identity_public_key_transitions.rs | 2 + packages/wasm-dpp/src/lib.rs | 2 +- 70 files changed, 187 insertions(+), 209 deletions(-) diff --git a/packages/dapi-grpc/src/lib.rs b/packages/dapi-grpc/src/lib.rs index debc593aca..41843149a7 100644 --- a/packages/dapi-grpc/src/lib.rs +++ b/packages/dapi-grpc/src/lib.rs @@ -2,6 +2,7 @@ pub use prost::Message; #[cfg(feature = "core")] pub mod core { + #![allow(non_camel_case_types)] pub mod v0 { include!("core/proto/org.dash.platform.dapi.v0.rs"); } diff --git a/packages/rs-dpp/src/identity/mod.rs b/packages/rs-dpp/src/identity/mod.rs index 2a5c7ddfb5..0aaf90ad0a 100644 --- a/packages/rs-dpp/src/identity/mod.rs +++ b/packages/rs-dpp/src/identity/mod.rs @@ -18,16 +18,16 @@ pub mod signer; pub mod accessors; pub(crate) mod conversion; -mod fields; +pub mod fields; #[cfg(feature = "client")] mod identity_facade; #[cfg(feature = "factories")] pub mod identity_factory; pub mod identity_nonce; -mod methods; +pub mod methods; #[cfg(feature = "random-identities")] pub mod random; -mod v0; +pub mod v0; pub mod versions; pub use fields::*; diff --git a/packages/rs-dpp/src/signing.rs b/packages/rs-dpp/src/signing.rs index e5cd2e8574..d63b6db0d6 100644 --- a/packages/rs-dpp/src/signing.rs +++ b/packages/rs-dpp/src/signing.rs @@ -6,7 +6,9 @@ use crate::identity::KeyType; use crate::serialization::PlatformMessageSignable; #[cfg(feature = "message-signature-verification")] use crate::validation::SimpleConsensusValidationResult; -use crate::{BlsModule, ProtocolError}; +#[cfg(feature = "message-signing")] +use crate::BlsModule; +use crate::ProtocolError; use dashcore::signer; impl PlatformMessageSignable for &[u8] { diff --git a/packages/rs-dpp/src/state_transition/mod.rs b/packages/rs-dpp/src/state_transition/mod.rs index 2f079353f4..1102f63335 100644 --- a/packages/rs-dpp/src/state_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/mod.rs @@ -57,11 +57,13 @@ use crate::identity::identity_public_key::accessors::v0::IdentityPublicKeyGetter #[cfg(feature = "state-transition-signing")] use crate::identity::signer::Signer; use crate::identity::state_transition::OptionallyAssetLockProved; +#[cfg(feature = "state-transition-signing")] +use crate::identity::Purpose; #[cfg(any( feature = "state-transition-signing", feature = "state-transition-validation" ))] -use crate::identity::{IdentityPublicKey, KeyType, Purpose}; +use crate::identity::{IdentityPublicKey, KeyType}; use crate::identity::{KeyID, SecurityLevel}; use crate::prelude::{AssetLockProof, UserFeeIncrease}; pub use state_transitions::*; @@ -76,15 +78,13 @@ use crate::state_transition::data_contract_update_transition::{ use crate::state_transition::documents_batch_transition::{ DocumentsBatchTransition, DocumentsBatchTransitionSignable, }; -#[cfg(any( - feature = "state-transition-signing", - feature = "state-transition-validation" -))] +#[cfg(feature = "state-transition-signing")] +use crate::state_transition::errors::InvalidSignaturePublicKeyError; +#[cfg(feature = "state-transition-signing")] use crate::state_transition::errors::WrongPublicKeyPurposeError; #[cfg(feature = "state-transition-validation")] use crate::state_transition::errors::{ - InvalidIdentityPublicKeyTypeError, InvalidSignaturePublicKeyError, PublicKeyMismatchError, - StateTransitionIsNotSignedError, + InvalidIdentityPublicKeyTypeError, PublicKeyMismatchError, StateTransitionIsNotSignedError, }; use crate::state_transition::identity_create_transition::{ IdentityCreateTransition, IdentityCreateTransitionSignable, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/mod.rs index 5d7c661358..7a0f8fb2a6 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/mod.rs @@ -1,6 +1,6 @@ mod from_document; pub mod v0; -mod v0_methods; +pub mod v0_methods; use bincode::{Decode, Encode}; use derive_more::{Display, From}; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/mod.rs index 07cdba7f09..8b0b3f54f4 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/mod.rs @@ -1,6 +1,6 @@ mod from_document; pub mod v0; -mod v0_methods; +pub mod v0_methods; use crate::document::Document; use crate::ProtocolError; diff --git a/packages/rs-dpp/src/util/deserializer.rs b/packages/rs-dpp/src/util/deserializer.rs index caddd4303e..b9dc94db20 100644 --- a/packages/rs-dpp/src/util/deserializer.rs +++ b/packages/rs-dpp/src/util/deserializer.rs @@ -1,5 +1,8 @@ +#[cfg(feature = "cbor")] use crate::consensus::basic::decode::ProtocolVersionParsingError; +#[cfg(feature = "cbor")] use crate::consensus::basic::BasicError; +#[cfg(feature = "cbor")] use crate::consensus::ConsensusError; use integer_encoding::VarInt; use platform_version::version::FeatureVersion; diff --git a/packages/rs-drive-abci/src/abci/app/consensus.rs b/packages/rs-drive-abci/src/abci/app/consensus.rs index 13bb627f48..a1f0842984 100644 --- a/packages/rs-drive-abci/src/abci/app/consensus.rs +++ b/packages/rs-drive-abci/src/abci/app/consensus.rs @@ -8,7 +8,6 @@ use crate::platform_types::platform::Platform; use crate::rpc::core::CoreRPCLike; use dpp::version::PlatformVersion; use drive::grovedb::Transaction; -use std::cell::{Ref, RefCell, RefMut}; use std::fmt::Debug; use std::sync::RwLock; use tenderdash_abci::proto::abci as proto; diff --git a/packages/rs-drive-abci/src/abci/handler/finalize_block.rs b/packages/rs-drive-abci/src/abci/handler/finalize_block.rs index 388262a0fa..f1a5eb2d25 100644 --- a/packages/rs-drive-abci/src/abci/handler/finalize_block.rs +++ b/packages/rs-drive-abci/src/abci/handler/finalize_block.rs @@ -1,7 +1,6 @@ use crate::abci::app::{BlockExecutionApplication, PlatformApplication, TransactionalApplication}; use crate::error::execution::ExecutionError; use crate::error::Error; -use crate::execution::types::block_execution_context::v0::BlockExecutionContextV0Getters; use crate::rpc::core::CoreRPCLike; use tenderdash_abci::proto::abci as proto; diff --git a/packages/rs-drive-abci/src/abci/handler/init_chain.rs b/packages/rs-drive-abci/src/abci/handler/init_chain.rs index f47e7e903f..a62a26021c 100644 --- a/packages/rs-drive-abci/src/abci/handler/init_chain.rs +++ b/packages/rs-drive-abci/src/abci/handler/init_chain.rs @@ -1,8 +1,6 @@ use crate::abci::app::{BlockExecutionApplication, PlatformApplication, TransactionalApplication}; use crate::error::Error; -use crate::platform_types::platform_state::PlatformState; use crate::rpc::core::CoreRPCLike; -use std::sync::Arc; use tenderdash_abci::proto::abci as proto; pub fn init_chain<'a, A, C>( diff --git a/packages/rs-drive-abci/src/abci/handler/prepare_proposal.rs b/packages/rs-drive-abci/src/abci/handler/prepare_proposal.rs index e655f99a3a..ccffb85a98 100644 --- a/packages/rs-drive-abci/src/abci/handler/prepare_proposal.rs +++ b/packages/rs-drive-abci/src/abci/handler/prepare_proposal.rs @@ -86,7 +86,7 @@ where // special logic on init chain let transaction_guard = app.transaction().read().unwrap(); if transaction_guard.is_none() { - return Err(Error::Abci(AbciError::BadRequest("received a prepare proposal request for the genesis height before an init chain request".to_string())))?; + Err(Error::Abci(AbciError::BadRequest("received a prepare proposal request for the genesis height before an init chain request".to_string())))?; }; if request.round > 0 { transaction_guard diff --git a/packages/rs-drive-abci/src/abci/handler/process_proposal.rs b/packages/rs-drive-abci/src/abci/handler/process_proposal.rs index 53ff41f5df..9a60a8a1e4 100644 --- a/packages/rs-drive-abci/src/abci/handler/process_proposal.rs +++ b/packages/rs-drive-abci/src/abci/handler/process_proposal.rs @@ -67,15 +67,15 @@ where } else { // We are getting a different block hash for a block of the same round // This is a terrible issue - return Err(Error::Abci(AbciError::BadRequest( + Err(Error::Abci(AbciError::BadRequest( "received a process proposal request twice with different hash".to_string(), - ))); + )))?; } } else { let Some(proposal_info) = block_execution_context.proposer_results() else { - return Err(Error::Abci(AbciError::BadRequest( + Err(Error::Abci(AbciError::BadRequest( "received a process proposal request twice".to_string(), - ))); + )))? }; let expected_transactions = proposal_info @@ -154,7 +154,7 @@ where // special logic on init chain let transaction_guard = app.transaction().read().unwrap(); if transaction_guard.is_none() { - return Err(Error::Abci(AbciError::BadRequest("received a process proposal request for the genesis height before an init chain request".to_string()))); + Err(Error::Abci(AbciError::BadRequest("received a process proposal request for the genesis height before an init chain request".to_string())))?; } if request.round > 0 { transaction_guard diff --git a/packages/rs-drive-abci/src/abci/handler/verify_vote_extension.rs b/packages/rs-drive-abci/src/abci/handler/verify_vote_extension.rs index fc75ec193b..47d7e27e3b 100644 --- a/packages/rs-drive-abci/src/abci/handler/verify_vote_extension.rs +++ b/packages/rs-drive-abci/src/abci/handler/verify_vote_extension.rs @@ -69,7 +69,7 @@ where let expected_withdrawals = block_execution_context.unsigned_withdrawal_transactions(); - if expected_withdrawals != &vote_extensions { + if expected_withdrawals != vote_extensions.as_slice() { let expected_extensions: Vec = expected_withdrawals.into(); tracing::error!( diff --git a/packages/rs-drive-abci/src/execution/engine/run_block_proposal/mod.rs b/packages/rs-drive-abci/src/execution/engine/run_block_proposal/mod.rs index 5e02cbab35..7904104c4a 100644 --- a/packages/rs-drive-abci/src/execution/engine/run_block_proposal/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/run_block_proposal/mod.rs @@ -1,7 +1,6 @@ use crate::error::execution::ExecutionError; use crate::error::Error; use crate::platform_types::platform::Platform; -use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::platform_types::platform_state::PlatformState; use crate::platform_types::{block_execution_outcome, block_proposal}; use crate::rpc::core::CoreRPCLike; diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_end/update_state_cache/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_end/update_state_cache/v0/mod.rs index 2283108676..9390dd369f 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/block_end/update_state_cache/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/block_end/update_state_cache/v0/mod.rs @@ -1,6 +1,4 @@ -use crate::error::execution::ExecutionError; use crate::error::Error; -use crate::execution::types::block_execution_context::v0::BlockExecutionContextV0OwnedGetters; use crate::platform_types::platform::Platform; use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::platform_types::platform_state::PlatformState; diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_core_info/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_core_info/mod.rs index 4ed94af5f7..744ed975e5 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_core_info/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_core_info/mod.rs @@ -8,7 +8,6 @@ use crate::rpc::core::CoreRPCLike; use dpp::block::block_info::BlockInfo; use dpp::version::PlatformVersion; use drive::grovedb::Transaction; -use std::sync::Arc; impl Platform where diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/make_sure_core_is_synced_to_chain_lock/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/make_sure_core_is_synced_to_chain_lock/mod.rs index 59abfb78f6..52eb63c4e4 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/make_sure_core_is_synced_to_chain_lock/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/make_sure_core_is_synced_to_chain_lock/mod.rs @@ -11,11 +11,11 @@ pub mod v0; /// As we ask to make sure that core is synced to the chain lock, we get back one of 3 pub enum CoreSyncStatus { /// Core is synced - CoreIsSynced, + Done, /// Core is 1 or 2 blocks off, we should retry shortly - CoreAlmostSynced, + Almost, /// Core is more than 2 blocks off - CoreNotSynced, + Not, } impl Platform diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/make_sure_core_is_synced_to_chain_lock/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/make_sure_core_is_synced_to_chain_lock/v0/mod.rs index 68fafb2020..cfed56c58b 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/make_sure_core_is_synced_to_chain_lock/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/make_sure_core_is_synced_to_chain_lock/v0/mod.rs @@ -4,7 +4,6 @@ use crate::rpc::core::CoreRPCLike; use dashcore_rpc::dashcore::ChainLock; use dpp::version::PlatformVersion; use crate::execution::platform_events::core_chain_lock::make_sure_core_is_synced_to_chain_lock::CoreSyncStatus; -use crate::execution::platform_events::core_chain_lock::make_sure_core_is_synced_to_chain_lock::CoreSyncStatus::{CoreIsSynced, CoreAlmostSynced, CoreNotSynced}; impl Platform where @@ -21,7 +20,7 @@ where // We need to make sure core is synced to the core height we see as valid for the state transitions let best_chain_locked_height = self.core_rpc.submit_chain_lock(chain_lock)?; Ok(if best_chain_locked_height >= given_chain_lock_height { - CoreIsSynced + CoreSyncStatus::Done } else if best_chain_locked_height - given_chain_lock_height <= platform_version .drive_abci @@ -29,9 +28,9 @@ where .core_chain_lock .recent_block_count_amount { - CoreAlmostSynced + CoreSyncStatus::Almost } else { - CoreNotSynced + CoreSyncStatus::Not }) } } diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock/v0/mod.rs index 136ba114e0..012e4cacd1 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock/v0/mod.rs @@ -34,13 +34,13 @@ where { Ok(sync_status) => { match sync_status { - CoreSyncStatus::CoreIsSynced => Ok(VerifyChainLockResult { + CoreSyncStatus::Done => Ok(VerifyChainLockResult { chain_lock_signature_is_deserializable: true, found_valid_locally: Some(true), found_valid_by_core: None, core_is_synced: Some(true), }), - CoreSyncStatus::CoreAlmostSynced => { + CoreSyncStatus::Almost => { for _i in 0..CORE_ALMOST_SYNCED_RETRIES { // The chain lock is valid we just need to sleep a bit and retry sleep(Duration::from_millis(CORE_ALMOST_SYNCED_SLEEP_TIME)); @@ -63,7 +63,7 @@ where core_is_synced: Some(false), }) } - CoreSyncStatus::CoreNotSynced => Ok(VerifyChainLockResult { + CoreSyncStatus::Not => Ok(VerifyChainLockResult { chain_lock_signature_is_deserializable: true, found_valid_locally: Some(valid), found_valid_by_core: Some(true), @@ -102,13 +102,13 @@ where if let Some(sync_status) = status { // if we had make_sure_core_is_synced set to true match sync_status { - CoreSyncStatus::CoreIsSynced => Ok(VerifyChainLockResult { + CoreSyncStatus::Done => Ok(VerifyChainLockResult { chain_lock_signature_is_deserializable: true, found_valid_locally: None, found_valid_by_core: None, core_is_synced: Some(true), }), - CoreSyncStatus::CoreAlmostSynced => { + CoreSyncStatus::Almost => { for _i in 0..CORE_ALMOST_SYNCED_RETRIES { // The chain lock is valid we just need to sleep a bit and retry sleep(Duration::from_millis(CORE_ALMOST_SYNCED_SLEEP_TIME)); @@ -129,7 +129,7 @@ where core_is_synced: Some(false), }) } - CoreSyncStatus::CoreNotSynced => Ok(VerifyChainLockResult { + CoreSyncStatus::Not => Ok(VerifyChainLockResult { chain_lock_signature_is_deserializable: true, found_valid_locally: None, found_valid_by_core: Some(true), diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_through_core/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_through_core/v0/mod.rs index 063794afc1..5344e17937 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_through_core/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_through_core/v0/mod.rs @@ -2,7 +2,6 @@ use crate::error::Error; use dpp::dashcore::ChainLock; use dpp::version::PlatformVersion; use crate::execution::platform_events::core_chain_lock::make_sure_core_is_synced_to_chain_lock::CoreSyncStatus; -use crate::execution::platform_events::core_chain_lock::make_sure_core_is_synced_to_chain_lock::CoreSyncStatus::{CoreAlmostSynced, CoreIsSynced, CoreNotSynced}; use crate::platform_types::platform::Platform; @@ -24,7 +23,7 @@ where let best_chain_locked_height = self.core_rpc.submit_chain_lock(chain_lock)?; Ok(if best_chain_locked_height >= given_chain_lock_height { - (true, Some(CoreIsSynced)) + (true, Some(CoreSyncStatus::Done)) } else if best_chain_locked_height - given_chain_lock_height <= platform_version .drive_abci @@ -32,9 +31,9 @@ where .core_chain_lock .recent_block_count_amount { - (true, Some(CoreAlmostSynced)) + (true, Some(CoreSyncStatus::Almost)) } else { - (true, Some(CoreNotSynced)) + (true, Some(CoreSyncStatus::Not)) }) } else { Ok((self.core_rpc.verify_chain_lock(chain_lock)?, None)) diff --git a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs index 2c6221a572..130ab04e8c 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs @@ -127,7 +127,7 @@ impl Platform { ), ]); - for (_, (data_contract, identity_public_keys_set)) in &system_data_contract_types { + for (data_contract, identity_public_keys_set) in system_data_contract_types.values() { let public_keys = [ ( 0, diff --git a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/execute_event/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/execute_event/v0/mod.rs index 929fff2092..5918335414 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/execute_event/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/execute_event/v0/mod.rs @@ -52,14 +52,14 @@ where self.validate_fees_of_event(&event, block_info, Some(transaction), platform_version)?; match event { - ExecutionEvent::PaidFromAssetLockDriveEvent { + ExecutionEvent::PaidFromAssetLock { identity, operations, execution_operations, user_fee_increase, .. } - | ExecutionEvent::PaidDriveEvent { + | ExecutionEvent::Paid { identity, operations, execution_operations, @@ -108,7 +108,7 @@ where )) } } - ExecutionEvent::FreeDriveEvent { operations } => { + ExecutionEvent::Free { operations } => { self.drive .apply_drive_operations( operations, diff --git a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_raw_state_transitions/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_raw_state_transitions/v0/mod.rs index b82077e350..aa44b63409 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_raw_state_transitions/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_raw_state_transitions/v0/mod.rs @@ -250,8 +250,7 @@ where StateTransitionExecutionResult::DriveAbciError(format!( "{} {}", - first_consensus_error.to_string(), - payment_consensus_error.to_string() + first_consensus_error, payment_consensus_error )) } } diff --git a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/validate_fees_of_event/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/validate_fees_of_event/v0/mod.rs index f1e4106fea..363fc75838 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/validate_fees_of_event/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/validate_fees_of_event/v0/mod.rs @@ -43,7 +43,7 @@ where platform_version: &PlatformVersion, ) -> Result, Error> { match event { - ExecutionEvent::PaidFromAssetLockDriveEvent { + ExecutionEvent::PaidFromAssetLock { identity, added_balance, operations, @@ -94,7 +94,7 @@ where )) } } - ExecutionEvent::PaidDriveEvent { + ExecutionEvent::Paid { identity, removed_balance, operations, @@ -146,7 +146,7 @@ where )) } } - ExecutionEvent::FreeDriveEvent { .. } => Ok(ConsensusValidationResult::new_with_data( + ExecutionEvent::Free { .. } => Ok(ConsensusValidationResult::new_with_data( FeeResult::default(), )), } diff --git a/packages/rs-drive-abci/src/execution/types/execution_event/mod.rs b/packages/rs-drive-abci/src/execution/types/execution_event/mod.rs index f09a669c30..48078a0be9 100644 --- a/packages/rs-drive-abci/src/execution/types/execution_event/mod.rs +++ b/packages/rs-drive-abci/src/execution/types/execution_event/mod.rs @@ -2,9 +2,6 @@ mod v0; use crate::error::execution::ExecutionError; use crate::error::Error; -use crate::execution::types::execution_event::ExecutionEvent::{ - PaidDriveEvent, PaidFromAssetLockDriveEvent, -}; use dpp::block::epoch::Epoch; use dpp::fee::Credits; @@ -25,7 +22,7 @@ use drive::drive::batch::DriveOperation; #[derive(Clone)] pub(in crate::execution) enum ExecutionEvent<'a> { /// A drive event that is paid by an identity - PaidDriveEvent { + Paid { /// The identity requesting the event identity: PartialIdentity, /// The removed balance in the case of a transfer or withdrawal @@ -38,7 +35,7 @@ pub(in crate::execution) enum ExecutionEvent<'a> { user_fee_increase: UserFeeIncrease, }, /// A drive event that is paid from an asset lock - PaidFromAssetLockDriveEvent { + PaidFromAssetLock { /// The identity requesting the event identity: PartialIdentity, /// The added balance @@ -51,7 +48,8 @@ pub(in crate::execution) enum ExecutionEvent<'a> { user_fee_increase: UserFeeIncrease, }, /// A drive event that is free - FreeDriveEvent { + #[allow(dead_code)] // TODO investigate why `variant `Free` is never constructed` + Free { /// the operations that should be performed operations: Vec>, }, @@ -71,7 +69,7 @@ impl<'a> ExecutionEvent<'a> { let identity = identity_create_action.into(); let operations = action.into_high_level_drive_operations(epoch, platform_version)?; - Ok(PaidFromAssetLockDriveEvent { + Ok(ExecutionEvent::PaidFromAssetLock { identity, added_balance: 0, operations, @@ -85,7 +83,7 @@ impl<'a> ExecutionEvent<'a> { let operations = action.into_high_level_drive_operations(epoch, platform_version)?; if let Some(identity) = identity { - Ok(PaidFromAssetLockDriveEvent { + Ok(ExecutionEvent::PaidFromAssetLock { identity, added_balance, operations, @@ -104,7 +102,7 @@ impl<'a> ExecutionEvent<'a> { let operations = action.into_high_level_drive_operations(epoch, platform_version)?; if let Some(identity) = identity { - Ok(PaidDriveEvent { + Ok(ExecutionEvent::Paid { identity, removed_balance: Some(removed_balance), operations, @@ -123,7 +121,7 @@ impl<'a> ExecutionEvent<'a> { let operations = action.into_high_level_drive_operations(epoch, platform_version)?; if let Some(identity) = identity { - Ok(PaidDriveEvent { + Ok(ExecutionEvent::Paid { identity, removed_balance: Some(removed_balance), operations, @@ -141,7 +139,7 @@ impl<'a> ExecutionEvent<'a> { let operations = action.into_high_level_drive_operations(epoch, platform_version)?; if let Some(identity) = identity { - Ok(PaidDriveEvent { + Ok(ExecutionEvent::Paid { identity, removed_balance: None, operations, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs index 396f18f61e..368bfffe1c 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs @@ -265,10 +265,8 @@ pub(super) fn state_transition_to_execution_event_for_check_tx_v0<'a, C: CoreRPC ) } } - _ => { - return Err(Error::Execution(ExecutionError::CorruptedCodeExecution( - "CheckTxLevel must be first time check or recheck", - ))) - } + _ => Err(Error::Execution(ExecutionError::CorruptedCodeExecution( + "CheckTxLevel must be first time check or recheck", + ))), } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_state_transition_identity_signed/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_state_transition_identity_signed/mod.rs index ac837e5b92..30985f0850 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_state_transition_identity_signed/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_state_transition_identity_signed/mod.rs @@ -1,12 +1,7 @@ -use std::sync::Arc; - -use dpp::identifier::Identifier; use dpp::identity::PartialIdentity; -use dpp::ProtocolError; use dpp::state_transition::StateTransition; use dpp::validation::ConsensusValidationResult; use dpp::version::{PlatformVersion}; -use drive::drive::contract::DataContractFetchInfo; use drive::drive::Drive; use drive::grovedb::TransactionArg; use drive::state_transition_action::StateTransitionAction; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/bindings/data_trigger_binding/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/bindings/data_trigger_binding/v0/mod.rs index a719f3cde9..7c390af6f2 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/bindings/data_trigger_binding/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/bindings/data_trigger_binding/v0/mod.rs @@ -88,7 +88,7 @@ impl DataTriggerBindingV0Getters for DataTriggerBindingV0 { document_type: &str, transition_action_type: DocumentTransitionActionType, ) -> bool { - &self.data_contract_id == data_contract_id + self.data_contract_id == data_contract_id && self.document_type == document_type && self.transition_action_type == transition_action_type } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs index aa6e6895e6..d7a6e9e354 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs @@ -1,7 +1,7 @@ use dpp::consensus::state::data_trigger::data_trigger_condition_error::DataTriggerConditionError; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contracts::dpns_contract::v1::document_types::domain::properties::PARENT_DOMAIN_NAME; -///! The `dpns_triggers` module contains data triggers specific to the DPNS data contract. +/// The `dpns_triggers` module contains data triggers specific to the DPNS data contract. use dpp::util::hash::hash_double; use std::collections::BTreeMap; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/feature_flags/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/feature_flags/v0/mod.rs index 0717d0b0fd..1fb54f9526 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/feature_flags/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/feature_flags/v0/mod.rs @@ -1,4 +1,4 @@ -///! The `feature_flags_data_triggers` module contains data triggers related to feature flags. +//! The `feature_flags_data_triggers` module contains data triggers related to feature flags. use crate::error::execution::ExecutionError; use crate::error::Error; use crate::platform_types::platform_state::v0::PlatformStateV0Methods; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs index c3a07d3441..95a0c92828 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs @@ -1,4 +1,4 @@ -///! The `withdrawals_data_triggers` module contains data triggers related to withdrawals. +//! The `withdrawals_data_triggers` module contains data triggers related to withdrawals. use crate::error::execution::ExecutionError; use crate::error::Error; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/balance/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/balance/v0/mod.rs index 5837914edc..9a75dc331e 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/balance/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/balance/v0/mod.rs @@ -35,7 +35,7 @@ impl IdentityCreditTransferTransitionBalanceValidationV0 for IdentityCreditTrans platform_version: &PlatformVersion, ) -> Result { let balance = if let Some(identity) = identity { - let balance = if let Some(balance) = identity.balance { + if let Some(balance) = identity.balance { balance } else { let maybe_existing_identity_balance = platform.drive.fetch_identity_balance( @@ -53,8 +53,7 @@ impl IdentityCreditTransferTransitionBalanceValidationV0 for IdentityCreditTrans identity.balance = Some(existing_identity_balance); existing_identity_balance - }; - balance + } } else { let maybe_existing_identity_balance = platform.drive.fetch_identity_balance( self.identity_id().to_buffer(), diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/balance/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/balance/v0/mod.rs index 6ec3199b56..07c976d3ed 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/balance/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/balance/v0/mod.rs @@ -35,7 +35,7 @@ impl IdentityCreditTransferTransitionBalanceValidationV0 for IdentityCreditWithd platform_version: &PlatformVersion, ) -> Result { let balance = if let Some(identity) = identity { - let balance = if let Some(balance) = identity.balance { + if let Some(balance) = identity.balance { balance } else { let maybe_existing_identity_balance = platform.drive.fetch_identity_balance( @@ -53,8 +53,7 @@ impl IdentityCreditTransferTransitionBalanceValidationV0 for IdentityCreditWithd identity.balance = Some(existing_identity_balance); existing_identity_balance - }; - balance + } } else { let maybe_existing_identity_balance = platform.drive.fetch_identity_balance( self.identity_id().to_buffer(), diff --git a/packages/rs-drive-abci/src/logging/destination.rs b/packages/rs-drive-abci/src/logging/destination.rs index 26f5e3c070..4f31892620 100644 --- a/packages/rs-drive-abci/src/logging/destination.rs +++ b/packages/rs-drive-abci/src/logging/destination.rs @@ -258,7 +258,6 @@ impl TryFrom<&LogConfig> for Reopen { let open_fn = move || { OpenOptions::new() .create(true) - .write(true) .append(true) .mode(mode) .open(&opened_path) diff --git a/packages/rs-drive-abci/src/platform_types/platform/mod.rs b/packages/rs-drive-abci/src/platform_types/platform/mod.rs index f705633e91..e70d196f0d 100644 --- a/packages/rs-drive-abci/src/platform_types/platform/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/platform/mod.rs @@ -15,7 +15,6 @@ use std::sync::Arc; use dashcore_rpc::dashcore::BlockHash; -use crate::execution::types::block_execution_context::BlockExecutionContext; use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::platform_types::platform_state::PlatformState; use dpp::version::{PlatformVersion, PlatformVersionCurrentVersion}; diff --git a/packages/rs-drive-abci/src/platform_types/platform_state/mod.rs b/packages/rs-drive-abci/src/platform_types/platform_state/mod.rs index 6a4bb7408d..e3903584d4 100644 --- a/packages/rs-drive-abci/src/platform_types/platform_state/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/platform_state/mod.rs @@ -35,12 +35,18 @@ pub enum PlatformState { /// Platform state #[derive(Clone, Debug, Encode, Decode, From)] -pub(crate) enum PlatformStateForSaving { +pub enum PlatformStateForSaving { /// Version 0 V0(PlatformStateForSavingV0), } impl PlatformStateForSaving { + /// Retrieves the current protocol version used in consensus. + /// + /// Matches against `PlatformStateForSaving` variants to extract the protocol version. + /// + /// # Returns + /// A `ProtocolVersion` indicating the current consensus protocol version. #[allow(dead_code)] #[deprecated(note = "This function is marked as unused.")] #[allow(deprecated)] diff --git a/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs b/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs index 16916a52c2..e0b3c1699e 100644 --- a/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs @@ -114,7 +114,7 @@ fn hex_encoded_validator_sets(validator_sets: &IndexMap, /// Information about the last block diff --git a/packages/rs-drive-abci/src/platform_types/withdrawal/unsigned_withdrawal_txs/v0/mod.rs b/packages/rs-drive-abci/src/platform_types/withdrawal/unsigned_withdrawal_txs/v0/mod.rs index 626a9ed710..feb02c4453 100644 --- a/packages/rs-drive-abci/src/platform_types/withdrawal/unsigned_withdrawal_txs/v0/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/withdrawal/unsigned_withdrawal_txs/v0/mod.rs @@ -49,7 +49,7 @@ impl UnsignedWithdrawalTxs { /// Verifies that the collection of unsigned withdrawal transactions matches the given vote extensions /// created based on these transactions - pub fn are_matching_with_vote_extensions(&self, other: &Vec) -> bool { + pub fn are_matching_with_vote_extensions(&self, other: &[VoteExtension]) -> bool { if self.0.len() != other.len() { return false; }; @@ -84,8 +84,8 @@ impl Display for UnsignedWithdrawalTxs { } } -impl PartialEq> for UnsignedWithdrawalTxs { - fn eq(&self, other: &Vec) -> bool { +impl PartialEq<[ExtendVoteExtension]> for UnsignedWithdrawalTxs { + fn eq(&self, other: &[ExtendVoteExtension]) -> bool { if self.0.len() != other.len() { return false; }; diff --git a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/mod.rs b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/mod.rs index 70186b9ff7..e6e1bdf081 100644 --- a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/mod.rs +++ b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/mod.rs @@ -49,7 +49,7 @@ impl Platform { RequestVersion::V0(request_v0) => { let result = self.query_data_contract_history_v0( request_v0, - &platform_state, + platform_state, platform_version, )?; diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identity/v0/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identity/v0/mod.rs index 84aea46a8f..9420ee1650 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/identity/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identity/v0/mod.rs @@ -74,7 +74,7 @@ mod tests { #[test] fn test_invalid_identity_id() { - let (platform, state, version) = setup_platform(); + let (platform, state, _unused_version) = setup_platform(); let version = PlatformVersion::latest(); diff --git a/packages/rs-drive-abci/src/query/service.rs b/packages/rs-drive-abci/src/query/service.rs index 5d73e3bd33..a3c9598ef7 100644 --- a/packages/rs-drive-abci/src/query/service.rs +++ b/packages/rs-drive-abci/src/query/service.rs @@ -64,7 +64,7 @@ impl QueryService { let platform_version = platform_state .current_platform_version() - .map_err(|e| Status::unavailable("platform is not initialized"))?; + .map_err(|_| Status::unavailable("platform is not initialized"))?; let mut result = query_method( &platform, diff --git a/packages/rs-drive-abci/src/rpc/core.rs b/packages/rs-drive-abci/src/rpc/core.rs index 48e3e839be..63fdf94b40 100644 --- a/packages/rs-drive-abci/src/rpc/core.rs +++ b/packages/rs-drive-abci/src/rpc/core.rs @@ -117,7 +117,7 @@ pub trait CoreRPCLike { fn masternode_sync_status(&self) -> Result; /// Sends raw transaction to the network - fn send_raw_transaction(&self, transaction: &Vec) -> Result; + fn send_raw_transaction(&self, transaction: &[u8]) -> Result; } #[derive(Debug)] @@ -312,8 +312,8 @@ impl CoreRPCLike for DefaultCoreRPC { retry!(self.inner.mnsync_status()) } - fn send_raw_transaction(&self, transaction: &Vec) -> Result { - retry!(self.inner.send_raw_transaction(transaction.as_slice())) + fn send_raw_transaction(&self, transaction: &[u8]) -> Result { + retry!(self.inner.send_raw_transaction(transaction)) } fn get_asset_unlock_statuses( diff --git a/packages/rs-drive-abci/tests/strategy_tests/execution.rs b/packages/rs-drive-abci/tests/strategy_tests/execution.rs index cb24972491..af9d6a8adc 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/execution.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/execution.rs @@ -791,7 +791,7 @@ pub(crate) fn continue_chain_for_strategy( let platform = abci_app.platform; let ChainExecutionParameters { block_start, - core_height_start, + core_height_start: _, block_count, proposers: proposers_with_updates, quorums, diff --git a/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs b/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs index 14b309688c..a058ad46dd 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs @@ -967,7 +967,6 @@ mod tests { ); let state = platform.state.load(); { - let counter = &platform.drive.cache.protocol_versions_counter.read(); let counter = &platform.drive.cache.protocol_versions_counter.read(); assert_eq!( (counter.get(&1), counter.get(&TEST_PROTOCOL_VERSION_2)), diff --git a/packages/rs-drive-proof-verifier/src/proof.rs b/packages/rs-drive-proof-verifier/src/proof.rs index e67cb8d893..c568c21560 100644 --- a/packages/rs-drive-proof-verifier/src/proof.rs +++ b/packages/rs-drive-proof-verifier/src/proof.rs @@ -371,16 +371,16 @@ fn parse_key_request_type(request: &Option) -> Result { + .map(|(level, &kind)| { + let kt = match GrpcKeyKind::try_from(kind) { + Ok(GrpcKeyKind::CurrentKeyOfKindRequest) => { Ok(KeyKindRequestType::CurrentKeyOfKindRequest) } - Some(GrpcKeyKind::AllKeysOfKindRequest) => { + Ok(GrpcKeyKind::AllKeysOfKindRequest) => { Ok(KeyKindRequestType::AllKeysOfKindRequest) } - None => Err(Error::RequestDecodeError { - error: format!("missing requested key type: {}", *kind), + _ => Err(Error::RequestDecodeError { + error: format!("missing requested key type: {}", kind), }), }; match kt { diff --git a/packages/rs-drive/Cargo.toml b/packages/rs-drive/Cargo.toml index dd97727d5f..abaab44b39 100644 --- a/packages/rs-drive/Cargo.toml +++ b/packages/rs-drive/Cargo.toml @@ -11,7 +11,6 @@ authors = [ edition = "2021" rust-version = "1.76" license = "MIT" -private = true [dependencies] parking_lot = "0.12.1" diff --git a/packages/rs-drive/src/query/conditions.rs b/packages/rs-drive/src/query/conditions.rs index da13162ebc..8f43aa88d0 100644 --- a/packages/rs-drive/src/query/conditions.rs +++ b/packages/rs-drive/src/query/conditions.rs @@ -1151,7 +1151,7 @@ impl<'a> WhereClause { negated, expr, pattern, - escape_char, + escape_char: _, } => { let where_operator = WhereOperator::StartsWith; if *negated { diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_update/mod.rs b/packages/rs-drive/src/state_transition_action/identity/identity_update/mod.rs index 51e2224988..7679a64b21 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_update/mod.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_update/mod.rs @@ -3,7 +3,6 @@ pub mod transformer; /// v0 pub mod v0; -use crate::state_transition_action::identity::identity_credit_withdrawal::IdentityCreditWithdrawalTransitionAction; use crate::state_transition_action::identity::identity_update::v0::IdentityUpdateTransitionActionV0; use derive_more::From; use dpp::identity::{IdentityPublicKey, KeyID, TimestampMillis}; diff --git a/packages/rs-drive/tests/query_tests.rs b/packages/rs-drive/tests/query_tests.rs index 9f0eb82387..13b0cd0a25 100644 --- a/packages/rs-drive/tests/query_tests.rs +++ b/packages/rs-drive/tests/query_tests.rs @@ -31,21 +31,6 @@ //! use ciborium::cbor; -#[cfg(feature = "full")] -use grovedb::TransactionArg; -#[cfg(feature = "full")] -use std::borrow::Cow; -#[cfg(feature = "full")] -use std::collections::HashMap; -#[cfg(feature = "full")] -use std::fs::File; -#[cfg(feature = "full")] -use std::io::{self, BufRead}; -#[cfg(feature = "full")] -use std::option::Option::None; -#[cfg(feature = "full")] -use std::sync::Arc; - #[cfg(feature = "full")] use dpp::data_contract::DataContractFactory; #[cfg(feature = "full")] @@ -69,6 +54,8 @@ use drive::query::DriveQuery; #[cfg(feature = "full")] #[cfg(test)] use drive::tests::helpers::setup::setup_drive; +#[cfg(feature = "full")] +use grovedb::TransactionArg; use rand::random; #[cfg(feature = "full")] use rand::seq::SliceRandom; @@ -78,6 +65,18 @@ use rand::{Rng, SeedableRng}; use serde::{Deserialize, Serialize}; #[cfg(feature = "full")] use serde_json::json; +#[cfg(feature = "full")] +use std::borrow::Cow; +#[cfg(feature = "full")] +use std::collections::HashMap; +#[cfg(feature = "full")] +use std::fs::File; +#[cfg(feature = "full")] +use std::io::{self, BufRead}; +#[cfg(feature = "full")] +use std::option::Option::None; +#[cfg(feature = "full")] +use std::sync::Arc; #[cfg(feature = "full")] use dpp::document::Document; @@ -85,6 +84,8 @@ use dpp::document::Document; use dpp::platform_value::Value; use dpp::platform_value::{platform_value, Bytes32, Identifier}; +#[cfg(feature = "full")] +use base64::Engine; #[cfg(feature = "full")] use dpp::block::block_info::BlockInfo; use dpp::data_contract::accessors::v0::DataContractV0Getters; @@ -2970,14 +2971,15 @@ fn test_family_with_nulls_query() { let document = Document::from_bytes(result.as_slice(), person_document_type, platform_version) .expect("we should be able to deserialize the document"); - base64::encode(document.id().as_slice()) + base64::engine::general_purpose::STANDARD.encode(document.id().as_slice()) }) .collect(); for i in 0..10 { drive .delete_document_for_contract( - base64::decode(ids.get(i).unwrap()) + base64::engine::general_purpose::STANDARD + .decode(ids.get(i).unwrap()) .expect("expected to decode from base64") .try_into() .expect("expected to get 32 bytes"), diff --git a/packages/rs-platform-serialization-derive/Cargo.toml b/packages/rs-platform-serialization-derive/Cargo.toml index da9ba0859c..e9cbfb6c67 100644 --- a/packages/rs-platform-serialization-derive/Cargo.toml +++ b/packages/rs-platform-serialization-derive/Cargo.toml @@ -6,7 +6,6 @@ version = "1.0.0-dev.7" edition = "2021" rust-version = "1.76" license = "MIT" -private = true [lib] proc-macro = true diff --git a/packages/rs-platform-serialization/Cargo.toml b/packages/rs-platform-serialization/Cargo.toml index 11ceacd57f..cf16bfb0cd 100644 --- a/packages/rs-platform-serialization/Cargo.toml +++ b/packages/rs-platform-serialization/Cargo.toml @@ -6,7 +6,6 @@ version = "1.0.0-dev.7" edition = "2021" rust-version = "1.76" license = "MIT" -private = true [dependencies] bincode = { version = "2.0.0-rc.3", features = ["serde"] } diff --git a/packages/rs-platform-value-convertible/Cargo.toml b/packages/rs-platform-value-convertible/Cargo.toml index 03fb6b1dce..d00e021be6 100644 --- a/packages/rs-platform-value-convertible/Cargo.toml +++ b/packages/rs-platform-value-convertible/Cargo.toml @@ -6,7 +6,6 @@ version = "1.0.0-dev.7" edition = "2021" rust-version = "1.76" license = "MIT" -private = true [lib] proc-macro = true diff --git a/packages/rs-platform-value/Cargo.toml b/packages/rs-platform-value/Cargo.toml index 58207402b9..4995a0f02f 100644 --- a/packages/rs-platform-value/Cargo.toml +++ b/packages/rs-platform-value/Cargo.toml @@ -6,7 +6,6 @@ version = "1.0.0-dev.7" edition = "2021" rust-version = "1.76" license = "MIT" -private = true [dependencies] bincode = { version = "2.0.0-rc.3", features = ["serde"] } diff --git a/packages/rs-platform-version/Cargo.toml b/packages/rs-platform-version/Cargo.toml index fc6d03cb2c..bf0d0d3796 100644 --- a/packages/rs-platform-version/Cargo.toml +++ b/packages/rs-platform-version/Cargo.toml @@ -6,7 +6,6 @@ version = "1.0.0-dev.7" edition = "2021" rust-version = "1.76" license = "MIT" -private = true [dependencies] thiserror = { version = "1.0" } diff --git a/packages/rs-platform-versioning/Cargo.toml b/packages/rs-platform-versioning/Cargo.toml index 7c0f5c66a6..910d563abd 100644 --- a/packages/rs-platform-versioning/Cargo.toml +++ b/packages/rs-platform-versioning/Cargo.toml @@ -6,7 +6,6 @@ version = "1.0.0-dev.7" edition = "2021" rust-version = "1.76" license = "MIT" -private = true [lib] proc-macro = true diff --git a/packages/rs-sdk/src/core_client.rs b/packages/rs-sdk/src/core_client.rs index 228ea3e5b9..acb2372077 100644 --- a/packages/rs-sdk/src/core_client.rs +++ b/packages/rs-sdk/src/core_client.rs @@ -76,6 +76,8 @@ impl CoreClient { /// ## See also /// /// * [Dash Core documentation](https://docs.dash.org/projects/core/en/stable/docs/api/remote-procedure-calls-wallet.html#listunspent) + #[allow(dead_code)] + #[deprecated(note = "This function is marked as unused.")] pub fn list_unspent( &self, minimum_sum_satoshi: Option, @@ -93,6 +95,8 @@ impl CoreClient { } /// Return address to which change of transaction can be sent. + #[allow(dead_code)] + #[deprecated(note = "This function is marked as unused.")] pub fn get_balance(&self) -> Result { self.core .lock() diff --git a/packages/rs-sdk/src/lib.rs b/packages/rs-sdk/src/lib.rs index 3af1cb7199..56575e63a1 100644 --- a/packages/rs-sdk/src/lib.rs +++ b/packages/rs-sdk/src/lib.rs @@ -57,7 +57,8 @@ //! To enable logging, you can use the `tracing_subscriber` crate which allows applications to customize how events are processed and recorded. //! An example can be found in `tests/common.rs:setup_logs()`. //! -#![warn(missing_docs)] +// TODO re-enable when docs are complete +// #![warn(missing_docs)] #![allow(rustdoc::private_intra_doc_links)] pub mod core; diff --git a/packages/rs-sdk/src/mock/sdk.rs b/packages/rs-sdk/src/mock/sdk.rs index b1d864e72e..3ec8da08e6 100644 --- a/packages/rs-sdk/src/mock/sdk.rs +++ b/packages/rs-sdk/src/mock/sdk.rs @@ -317,6 +317,8 @@ impl MockDashPlatformSdk { } /// Wrapper around [FromProof] that uses mock expectations instead of executing [FromProof] trait. + #[allow(dead_code)] + #[deprecated(note = "This function is marked as unused.")] pub(crate) fn parse_proof>( &self, request: O::Request, diff --git a/packages/rs-sdk/src/sdk.rs b/packages/rs-sdk/src/sdk.rs index 68d0f789f3..df24ca08d6 100644 --- a/packages/rs-sdk/src/sdk.rs +++ b/packages/rs-sdk/src/sdk.rs @@ -259,7 +259,7 @@ impl Sdk { if should_query_platform { let platform_nonce = IdentityNonceFetcher::fetch_with_settings( - &self, + self, identity_id, settings.request_settings, ) @@ -284,12 +284,10 @@ impl Sdk { } else { platform_nonce } + } else if bump_first { + *current_nonce + 1 } else { - if bump_first { - *current_nonce + 1 - } else { - *current_nonce - } + *current_nonce }; e.insert((insert_nonce, current_time_s)); Ok(insert_nonce & IDENTITY_NONCE_VALUE_FILTER) @@ -353,7 +351,7 @@ impl Sdk { if should_query_platform { let platform_nonce = IdentityContractNonceFetcher::fetch_with_settings( - &self, + self, (identity_id, contract_id), settings.request_settings, ) @@ -378,12 +376,10 @@ impl Sdk { } else { platform_nonce } + } else if bump_first { + *current_nonce + 1 } else { - if bump_first { - *current_nonce + 1 - } else { - *current_nonce - } + *current_nonce }; e.insert((insert_nonce, current_time_s)); Ok(insert_nonce & IDENTITY_NONCE_VALUE_FILTER) diff --git a/packages/strategy-tests/src/lib.rs b/packages/strategy-tests/src/lib.rs index f56082eb33..106cea4f5b 100644 --- a/packages/strategy-tests/src/lib.rs +++ b/packages/strategy-tests/src/lib.rs @@ -387,7 +387,7 @@ impl Strategy { /// ``` pub fn contract_state_transitions( &mut self, - current_identities: &Vec, + current_identities: &[Identity], identity_nonce_counter: &mut BTreeMap, signer: &SimpleSigner, rng: &mut StdRng, @@ -481,7 +481,7 @@ impl Strategy { /// ``` pub fn contract_update_state_transitions( &mut self, - current_identities: &Vec, + current_identities: &[Identity], block_height: u64, initial_block_height: u64, signer: &SimpleSigner, @@ -603,7 +603,7 @@ impl Strategy { ) -> PartialIdentity, create_asset_lock: &mut impl FnMut(u64) -> Option<(AssetLockProof, PrivateKey)>, block_info: &BlockInfo, - current_identities: &mut Vec, + current_identities: &mut [Identity], known_contracts: &mut BTreeMap, signer: &mut SimpleSigner, identity_nonce_counter: &mut BTreeMap, @@ -1123,7 +1123,7 @@ impl Strategy { // Generate state transition for identity transfer operation OperationType::IdentityTransfer if current_identities.len() > 1 => { - let identities_clone = current_identities.clone(); + let identities_clone = current_identities.to_owned(); // Sender is the first in the list, which should be loaded_identity let owner = &mut current_identities[0]; // Recipient is the second in the list diff --git a/packages/strategy-tests/src/operations.rs b/packages/strategy-tests/src/operations.rs index 40cb9a8ae9..9ad6a08d0e 100644 --- a/packages/strategy-tests/src/operations.rs +++ b/packages/strategy-tests/src/operations.rs @@ -349,16 +349,16 @@ pub enum OperationType { #[derive(Clone, Debug, Encode, Decode)] enum OperationTypeInSerializationFormat { - OperationTypeInSerializationFormatDocument(Vec), - OperationTypeInSerializationFormatIdentityTopUp, - OperationTypeInSerializationFormatIdentityUpdate(IdentityUpdateOp), - OperationTypeInSerializationFormatIdentityWithdrawal, - OperationTypeInSerializationFormatContractCreate( + Document(Vec), + IdentityTopUp, + IdentityUpdate(IdentityUpdateOp), + IdentityWithdrawal, + ContractCreate( RandomDocumentTypeParameters, DocumentTypeCount, ), - OperationTypeInSerializationFormatContractUpdate(Vec), - OperationTypeInSerializationFormatIdentityTransfer, + ContractUpdate(Vec), + IdentityTransfer, } impl PlatformSerializableWithPlatformVersion for OperationType { @@ -380,27 +380,27 @@ impl PlatformSerializableWithPlatformVersion for OperationType { OperationType::Document(document_op) => { // let's just serialize it to make things easier let document_op_in_serialization_format = document_op.serialize_consume_to_bytes_with_platform_version(platform_version)?; - OperationTypeInSerializationFormat::OperationTypeInSerializationFormatDocument(document_op_in_serialization_format) + OperationTypeInSerializationFormat::Document(document_op_in_serialization_format) } OperationType::IdentityTopUp => { - OperationTypeInSerializationFormat::OperationTypeInSerializationFormatIdentityTopUp + OperationTypeInSerializationFormat::IdentityTopUp } OperationType::IdentityUpdate(identity_update_op) => { - OperationTypeInSerializationFormat::OperationTypeInSerializationFormatIdentityUpdate(identity_update_op) + OperationTypeInSerializationFormat::IdentityUpdate(identity_update_op) } OperationType::IdentityWithdrawal => { - OperationTypeInSerializationFormat::OperationTypeInSerializationFormatIdentityWithdrawal + OperationTypeInSerializationFormat::IdentityWithdrawal } OperationType::ContractCreate(p, c) => { - OperationTypeInSerializationFormat::OperationTypeInSerializationFormatContractCreate(p,c) + OperationTypeInSerializationFormat::ContractCreate(p, c) } OperationType::ContractUpdate(update_op) => { // let's just serialize it to make things easier let contract_op_in_serialization_format = update_op.serialize_consume_to_bytes_with_platform_version(platform_version)?; - OperationTypeInSerializationFormat::OperationTypeInSerializationFormatContractUpdate(contract_op_in_serialization_format) + OperationTypeInSerializationFormat::ContractUpdate(contract_op_in_serialization_format) } OperationType::IdentityTransfer => { - OperationTypeInSerializationFormat::OperationTypeInSerializationFormatIdentityTransfer + OperationTypeInSerializationFormat::IdentityTransfer } }; let config = bincode::config::standard() @@ -431,27 +431,27 @@ impl PlatformDeserializableWithPotentialValidationFromVersionedStructure for Ope })? .0; Ok(match operation_type { - OperationTypeInSerializationFormat::OperationTypeInSerializationFormatDocument(serialized_op) => { + OperationTypeInSerializationFormat::Document(serialized_op) => { let document_op = DocumentOp::versioned_deserialize(serialized_op.as_slice(), validate, platform_version)?; OperationType::Document(document_op) } - OperationTypeInSerializationFormat::OperationTypeInSerializationFormatIdentityTopUp => { + OperationTypeInSerializationFormat::IdentityTopUp => { OperationType::IdentityTopUp } - OperationTypeInSerializationFormat::OperationTypeInSerializationFormatIdentityUpdate(identity_update_op) => { + OperationTypeInSerializationFormat::IdentityUpdate(identity_update_op) => { OperationType::IdentityUpdate(identity_update_op) } - OperationTypeInSerializationFormat::OperationTypeInSerializationFormatIdentityWithdrawal => { + OperationTypeInSerializationFormat::IdentityWithdrawal => { OperationType::IdentityWithdrawal } - OperationTypeInSerializationFormat::OperationTypeInSerializationFormatContractCreate(p, c) => { + OperationTypeInSerializationFormat::ContractCreate(p, c) => { OperationType::ContractCreate(p, c) } - OperationTypeInSerializationFormat::OperationTypeInSerializationFormatContractUpdate(serialized_op) => { + OperationTypeInSerializationFormat::ContractUpdate(serialized_op) => { let update_op = DataContractUpdateOp::versioned_deserialize(serialized_op.as_slice(), validate, platform_version)?; OperationType::ContractUpdate(update_op) } - OperationTypeInSerializationFormat::OperationTypeInSerializationFormatIdentityTransfer => { + OperationTypeInSerializationFormat::IdentityTransfer => { OperationType::IdentityTransfer } }) diff --git a/packages/strategy-tests/src/transitions.rs b/packages/strategy-tests/src/transitions.rs index b0c57dae6b..e14b5086ae 100644 --- a/packages/strategy-tests/src/transitions.rs +++ b/packages/strategy-tests/src/transitions.rs @@ -637,10 +637,9 @@ pub fn create_identities_state_transitions( // Update keys with new KeyIDs and add them to signer let mut current_id_num = starting_id_num; for (key, _) in &mut keys { - if let IdentityPublicKey::V0(ref mut id_pub_key_v0) = key { - id_pub_key_v0.set_id(current_id_num); - current_id_num += 1; // Increment for each key - } + let IdentityPublicKey::V0(ref mut id_pub_key_v0) = key; + id_pub_key_v0.set_id(current_id_num); + current_id_num += 1; // Increment for each key } signer.add_keys(keys); @@ -658,10 +657,9 @@ pub fn create_identities_state_transitions( .values_mut() .enumerate() .for_each(|(key_index, public_key)| { - if let IdentityPublicKey::V0(ref mut id_pub_key_v0) = public_key { - let new_id = identity_starting_id + key_index as u32; - id_pub_key_v0.set_id(new_id); - } + let IdentityPublicKey::V0(ref mut id_pub_key_v0) = public_key; + let new_id = identity_starting_id + key_index as u32; + id_pub_key_v0.set_id(new_id); }); // Attempt to create an asset lock diff --git a/packages/wasm-dpp/src/data_contract/data_contract_facade.rs b/packages/wasm-dpp/src/data_contract/data_contract_facade.rs index 033ac7b827..1f7b1066cf 100644 --- a/packages/wasm-dpp/src/data_contract/data_contract_facade.rs +++ b/packages/wasm-dpp/src/data_contract/data_contract_facade.rs @@ -8,7 +8,6 @@ use dpp::identifier::Identifier; use crate::data_contract::state_transition::DataContractCreateTransitionWasm; use crate::data_contract::state_transition::DataContractUpdateTransitionWasm; use crate::data_contract::DataContractWasm; -use crate::entropy_generator::ExternalEntropyGenerator; use crate::errors::protocol_error::from_protocol_error; use crate::utils::{ get_bool_from_options, ToSerdeJSONExt, WithJsError, SKIP_VALIDATION_PROPERTY_NAME, diff --git a/packages/wasm-dpp/src/data_contract_factory/data_contract_factory.rs b/packages/wasm-dpp/src/data_contract_factory/data_contract_factory.rs index 4d1d87166b..d8b183ae9c 100644 --- a/packages/wasm-dpp/src/data_contract_factory/data_contract_factory.rs +++ b/packages/wasm-dpp/src/data_contract_factory/data_contract_factory.rs @@ -4,7 +4,6 @@ use dpp::data_contract::created_data_contract::CreatedDataContract; use dpp::{data_contract::DataContractFactory, platform_value, prelude::Identifier, ProtocolError}; use wasm_bindgen::prelude::*; -use crate::entropy_generator::ExternalEntropyGenerator; use crate::utils::{ToSerdeJSONExt, WithJsError}; use crate::data_contract::{DataContractCreateTransitionWasm, DataContractWasm}; diff --git a/packages/wasm-dpp/src/document/extended_document.rs b/packages/wasm-dpp/src/document/extended_document.rs index 5a8a26f495..08d81ff81c 100644 --- a/packages/wasm-dpp/src/document/extended_document.rs +++ b/packages/wasm-dpp/src/document/extended_document.rs @@ -19,6 +19,7 @@ use wasm_bindgen::prelude::*; use crate::buffer::Buffer; use crate::data_contract::DataContractWasm; +#[allow(deprecated)] // BinaryType is unsed in unused code below use crate::document::BinaryType; use crate::document::{ConversionOptions, DocumentWasm}; use crate::errors::RustConversionError; diff --git a/packages/wasm-dpp/src/document/factory.rs b/packages/wasm-dpp/src/document/factory.rs index 22f8cd0ff4..0b927a6080 100644 --- a/packages/wasm-dpp/src/document/factory.rs +++ b/packages/wasm-dpp/src/document/factory.rs @@ -312,33 +312,29 @@ fn extract_documents_of_action( documents: &JsValue, action: &str, ) -> Result, anyhow::Error> { - let mut extracted_documents: Vec = vec![]; - let documents_with_action = js_sys::Reflect::get(documents, &action.to_string().into()).unwrap_or(JsValue::NULL); if documents_with_action.is_null() || documents_with_action.is_undefined() { - return Ok(extracted_documents); + return Ok(vec![]); } let documents_array = js_sys::Array::try_from(documents_with_action) .map_err(|e| anyhow!("property '{}' isn't an array: {}", action, e))?; - for js_document in documents_array.iter() { - let document: ExtendedDocument = js_document - .to_wasm::("ExtendedDocument") - .map_err(|e| { - anyhow!( - "Element in '{}' isn't an Extended Document instance: {:#?}", - action, - e - ) - })? - .clone() - .into(); - - extracted_documents.push(document) - } - - Ok(extracted_documents) + documents_array + .iter() + .map(|js_document| { + js_document + .to_wasm::("ExtendedDocument") + .map_err(|e| { + anyhow!( + "Element in '{}' isn't an Extended Document instance: {:#?}", + action, + e + ) + }) + .map(|wasm_doc| wasm_doc.clone().into()) + }) + .collect() } diff --git a/packages/wasm-dpp/src/errors/consensus/state/identity/invalid_identity_contract_nonce_error.rs b/packages/wasm-dpp/src/errors/consensus/state/identity/invalid_identity_contract_nonce_error.rs index 7f54347cd9..0a28526e2c 100644 --- a/packages/wasm-dpp/src/errors/consensus/state/identity/invalid_identity_contract_nonce_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/state/identity/invalid_identity_contract_nonce_error.rs @@ -27,8 +27,7 @@ impl InvalidIdentityNonceErrorWasm { #[wasm_bindgen(js_name=getCurrentIdentityContractNonce)] pub fn current_identity_contract_nonce(&self) -> Option { self.inner - .current_identity_contract_nonce() - .map(|nonce| *nonce) + .current_identity_contract_nonce().copied() } #[wasm_bindgen(js_name=getSettingIdentityContractNonce)] diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/transition.rs b/packages/wasm-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/transition.rs index 0ac2899c57..e1c960d701 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/transition.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/transition.rs @@ -46,7 +46,7 @@ impl IdentityCreditWithdrawalTransitionWasm { let platform_version = &PlatformVersion::get(platform_version).map_err(|e| JsValue::from(e.to_string()))?; - IdentityCreditWithdrawalTransition::default_versioned(&platform_version) + IdentityCreditWithdrawalTransition::default_versioned(platform_version) .map(Into::into) .map_err(from_dpp_err) } @@ -78,7 +78,7 @@ impl IdentityCreditWithdrawalTransitionWasm { #[wasm_bindgen(js_name=getAmount)] pub fn get_amount(&self) -> u64 { - self.0.amount() as u64 + self.0.amount() } #[wasm_bindgen(js_name=setAmount)] @@ -88,12 +88,12 @@ impl IdentityCreditWithdrawalTransitionWasm { #[wasm_bindgen(js_name=getCoreFeePerByte)] pub fn get_core_fee_per_byte(&self) -> u32 { - self.0.core_fee_per_byte() as u32 + self.0.core_fee_per_byte() } #[wasm_bindgen(js_name=setCoreFeePerByte)] pub fn set_core_fee_per_byte(&mut self, core_fee_per_byte: u32) { - self.0.set_core_fee_per_byte(core_fee_per_byte as u32); + self.0.set_core_fee_per_byte(core_fee_per_byte); } #[wasm_bindgen(js_name=getPooling)] @@ -126,7 +126,7 @@ impl IdentityCreditWithdrawalTransitionWasm { #[wasm_bindgen(js_name=getNonce)] pub fn get_nonce(&self) -> u64 { - self.0.nonce() as u64 + self.0.nonce() } #[wasm_bindgen(js_name=setNonce)] @@ -385,7 +385,7 @@ impl IdentityCreditWithdrawalTransitionWasm { #[wasm_bindgen(js_name=setSignature)] pub fn set_signature(&mut self, signature: Option>) { self.0 - .set_signature(BinaryData::new(signature.unwrap_or(vec![]))) + .set_signature(BinaryData::new(signature.unwrap_or_default())) } #[wasm_bindgen] diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_public_key_transitions.rs b/packages/wasm-dpp/src/identity/state_transition/identity_public_key_transitions.rs index dae2e8d300..29141a4198 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_public_key_transitions.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_public_key_transitions.rs @@ -19,6 +19,8 @@ use dpp::version::PlatformVersion; #[derive(Deserialize, Default)] #[serde(rename_all = "camelCase")] struct ToObjectOptions { + #[allow(dead_code)] + #[deprecated(note = "This function is marked as unused.")] pub skip_signature: Option, } diff --git a/packages/wasm-dpp/src/lib.rs b/packages/wasm-dpp/src/lib.rs index 48cc428167..ddc83513fe 100644 --- a/packages/wasm-dpp/src/lib.rs +++ b/packages/wasm-dpp/src/lib.rs @@ -19,7 +19,7 @@ mod identifier; mod identity; mod metadata; // mod state_repository; -mod state_transition; +pub mod state_transition; // mod version; mod utils; From 18dee4cebbf43601d935e1aedb1ea7ee865e5f27 Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Mon, 11 Mar 2024 05:32:36 +0700 Subject: [PATCH 080/191] refactor(drive): relax versioning of calls with fees (#1762) --- .../grove_operations/grove_apply_batch/mod.rs | 16 ++++------ .../grove_apply_batch/v0/mod.rs | 24 -------------- .../grove_apply_batch_with_add_costs/mod.rs | 2 +- .../grove_apply_partial_batch/mod.rs | 23 +++++-------- .../grove_apply_partial_batch/v0/mod.rs | 32 ------------------- .../mod.rs | 2 +- .../src/version/drive_versions.rs | 2 -- .../src/version/mocks/v2_test.rs | 2 -- .../src/version/mocks/v3_test.rs | 2 -- .../rs-platform-version/src/version/v1.rs | 2 -- 10 files changed, 17 insertions(+), 90 deletions(-) delete mode 100644 packages/rs-drive/src/drive/grove_operations/grove_apply_batch/v0/mod.rs delete mode 100644 packages/rs-drive/src/drive/grove_operations/grove_apply_partial_batch/v0/mod.rs diff --git a/packages/rs-drive/src/drive/grove_operations/grove_apply_batch/mod.rs b/packages/rs-drive/src/drive/grove_operations/grove_apply_batch/mod.rs index 2363512b02..ff7f574279 100644 --- a/packages/rs-drive/src/drive/grove_operations/grove_apply_batch/mod.rs +++ b/packages/rs-drive/src/drive/grove_operations/grove_apply_batch/mod.rs @@ -1,4 +1,3 @@ -mod v0; use crate::drive::batch::GroveDbOpBatch; use crate::drive::Drive; @@ -26,13 +25,12 @@ impl Drive { transaction: TransactionArg, drive_version: &DriveVersion, ) -> Result<(), Error> { - match drive_version.grove_methods.apply.grove_apply_batch { - 0 => self.grove_apply_batch_v0(ops, validate, transaction, drive_version), - version => Err(Error::Drive(DriveError::UnknownVersionMismatch { - method: "grove_apply_batch".to_string(), - known_versions: vec![0], - received: version, - })), - } + self.grove_apply_batch_with_add_costs( + ops, + validate, + transaction, + &mut vec![], + drive_version, + ) } } diff --git a/packages/rs-drive/src/drive/grove_operations/grove_apply_batch/v0/mod.rs b/packages/rs-drive/src/drive/grove_operations/grove_apply_batch/v0/mod.rs deleted file mode 100644 index 7f9e246c71..0000000000 --- a/packages/rs-drive/src/drive/grove_operations/grove_apply_batch/v0/mod.rs +++ /dev/null @@ -1,24 +0,0 @@ -use crate::drive::batch::GroveDbOpBatch; -use crate::drive::Drive; -use crate::error::Error; -use dpp::version::drive_versions::DriveVersion; -use grovedb::TransactionArg; - -impl Drive { - /// Applies the given groveDB operations batch. - pub(super) fn grove_apply_batch_v0( - &self, - ops: GroveDbOpBatch, - validate: bool, - transaction: TransactionArg, - drive_version: &DriveVersion, - ) -> Result<(), Error> { - self.grove_apply_batch_with_add_costs( - ops, - validate, - transaction, - &mut vec![], - drive_version, - ) - } -} diff --git a/packages/rs-drive/src/drive/grove_operations/grove_apply_batch_with_add_costs/mod.rs b/packages/rs-drive/src/drive/grove_operations/grove_apply_batch_with_add_costs/mod.rs index c698886bd8..a3492f2c85 100644 --- a/packages/rs-drive/src/drive/grove_operations/grove_apply_batch_with_add_costs/mod.rs +++ b/packages/rs-drive/src/drive/grove_operations/grove_apply_batch_with_add_costs/mod.rs @@ -35,7 +35,7 @@ impl Drive { match drive_version .grove_methods .apply - .grove_apply_batch_with_add_costs + .grove_apply_batch { 0 => self.grove_apply_batch_with_add_costs_v0( ops, diff --git a/packages/rs-drive/src/drive/grove_operations/grove_apply_partial_batch/mod.rs b/packages/rs-drive/src/drive/grove_operations/grove_apply_partial_batch/mod.rs index 4be68d4d4c..1f135b343d 100644 --- a/packages/rs-drive/src/drive/grove_operations/grove_apply_partial_batch/mod.rs +++ b/packages/rs-drive/src/drive/grove_operations/grove_apply_partial_batch/mod.rs @@ -1,4 +1,3 @@ -mod v0; use crate::drive::batch::GroveDbOpBatch; use crate::drive::Drive; @@ -35,19 +34,13 @@ impl Drive { ) -> Result, GroveError>, drive_version: &DriveVersion, ) -> Result<(), Error> { - match drive_version.grove_methods.apply.grove_apply_partial_batch { - 0 => self.grove_apply_partial_batch_v0( - ops, - validate, - add_on_operations, - transaction, - drive_version, - ), - version => Err(Error::Drive(DriveError::UnknownVersionMismatch { - method: "grove_apply_partial_batch".to_string(), - known_versions: vec![0], - received: version, - })), - } + self.grove_apply_partial_batch_with_add_costs( + ops, + validate, + transaction, + add_on_operations, + &mut vec![], + drive_version, + ) } } diff --git a/packages/rs-drive/src/drive/grove_operations/grove_apply_partial_batch/v0/mod.rs b/packages/rs-drive/src/drive/grove_operations/grove_apply_partial_batch/v0/mod.rs deleted file mode 100644 index 26f8d07613..0000000000 --- a/packages/rs-drive/src/drive/grove_operations/grove_apply_partial_batch/v0/mod.rs +++ /dev/null @@ -1,32 +0,0 @@ -use crate::drive::batch::GroveDbOpBatch; -use crate::drive::Drive; -use crate::error::Error; -use crate::query::GroveError; -use dpp::version::drive_versions::DriveVersion; -use grovedb::batch::{GroveDbOp, OpsByLevelPath}; -use grovedb::TransactionArg; -use grovedb_costs::OperationCost; - -impl Drive { - /// Applies the given groveDB operations batch. - pub(super) fn grove_apply_partial_batch_v0( - &self, - ops: GroveDbOpBatch, - validate: bool, - add_on_operations: impl FnMut( - &OperationCost, - &Option, - ) -> Result, GroveError>, - transaction: TransactionArg, - drive_version: &DriveVersion, - ) -> Result<(), Error> { - self.grove_apply_partial_batch_with_add_costs( - ops, - validate, - transaction, - add_on_operations, - &mut vec![], - drive_version, - ) - } -} diff --git a/packages/rs-drive/src/drive/grove_operations/grove_apply_partial_batch_with_add_costs/mod.rs b/packages/rs-drive/src/drive/grove_operations/grove_apply_partial_batch_with_add_costs/mod.rs index 014e377ae7..c8ca580aa5 100644 --- a/packages/rs-drive/src/drive/grove_operations/grove_apply_partial_batch_with_add_costs/mod.rs +++ b/packages/rs-drive/src/drive/grove_operations/grove_apply_partial_batch_with_add_costs/mod.rs @@ -43,7 +43,7 @@ impl Drive { match drive_version .grove_methods .apply - .grove_apply_partial_batch_with_add_costs + .grove_apply_partial_batch { 0 => self.grove_apply_partial_batch_with_add_costs_v0( ops, diff --git a/packages/rs-platform-version/src/version/drive_versions.rs b/packages/rs-platform-version/src/version/drive_versions.rs index 48a133cbc0..a484584fc6 100644 --- a/packages/rs-platform-version/src/version/drive_versions.rs +++ b/packages/rs-platform-version/src/version/drive_versions.rs @@ -343,9 +343,7 @@ pub struct DriveGroveBatchMethodVersions { pub struct DriveGroveApplyMethodVersions { pub grove_apply_operation: FeatureVersion, pub grove_apply_batch: FeatureVersion, - pub grove_apply_batch_with_add_costs: FeatureVersion, pub grove_apply_partial_batch: FeatureVersion, - pub grove_apply_partial_batch_with_add_costs: FeatureVersion, } #[derive(Clone, Debug, Default)] diff --git a/packages/rs-platform-version/src/version/mocks/v2_test.rs b/packages/rs-platform-version/src/version/mocks/v2_test.rs index 6e72787ffe..608bdfcc1f 100644 --- a/packages/rs-platform-version/src/version/mocks/v2_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v2_test.rs @@ -466,9 +466,7 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { apply: DriveGroveApplyMethodVersions { grove_apply_operation: 0, grove_apply_batch: 0, - grove_apply_batch_with_add_costs: 0, grove_apply_partial_batch: 0, - grove_apply_partial_batch_with_add_costs: 0, }, costs: DriveGroveCostMethodVersions { grove_batch_operations_costs: 0, diff --git a/packages/rs-platform-version/src/version/mocks/v3_test.rs b/packages/rs-platform-version/src/version/mocks/v3_test.rs index 79f5a610ee..b780f4e7de 100644 --- a/packages/rs-platform-version/src/version/mocks/v3_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v3_test.rs @@ -466,9 +466,7 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { apply: DriveGroveApplyMethodVersions { grove_apply_operation: 0, grove_apply_batch: 0, - grove_apply_batch_with_add_costs: 0, grove_apply_partial_batch: 0, - grove_apply_partial_batch_with_add_costs: 0, }, costs: DriveGroveCostMethodVersions { grove_batch_operations_costs: 0, diff --git a/packages/rs-platform-version/src/version/v1.rs b/packages/rs-platform-version/src/version/v1.rs index 234684b094..4f1b649e23 100644 --- a/packages/rs-platform-version/src/version/v1.rs +++ b/packages/rs-platform-version/src/version/v1.rs @@ -463,9 +463,7 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { apply: DriveGroveApplyMethodVersions { grove_apply_operation: 0, grove_apply_batch: 0, - grove_apply_batch_with_add_costs: 0, grove_apply_partial_batch: 0, - grove_apply_partial_batch_with_add_costs: 0, }, costs: DriveGroveCostMethodVersions { grove_batch_operations_costs: 0, From 1196a28bdc0628895158d4ddc0d9dae7e5014d7a Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Mon, 11 Mar 2024 19:46:49 +0700 Subject: [PATCH 081/191] fix(platform)!: advanced data contract structure validation position (#1763) --- .../rs-dpp/src/data_contract/accessors/mod.rs | 6 + .../src/data_contract/accessors/v0/mod.rs | 3 + .../document_type/v0/random_document_type.rs | 185 ++++++++++++++++- .../src/data_contract/v0/accessors/mod.rs | 4 + .../data_contract_create_transition/mod.rs | 3 +- .../fixtures/get_dashpay_contract_fixture.rs | 4 +- .../src/execution/check_tx/v0/mod.rs | 191 ++++++++++++++++++ .../v0/mod.rs | 2 +- .../verify_chain_lock_through_core/v0/mod.rs | 2 +- .../check_tx_verification/v0/mod.rs | 12 +- .../mod.rs | 6 +- .../v0/mod.rs | 2 +- .../state_transition/processor/v0/mod.rs | 160 ++++++++++----- .../advanced_structure/mod.rs | 36 ++++ .../advanced_structure/v0/mod.rs | 46 +++++ .../{structure => basic_structure}/mod.rs | 0 .../{structure => basic_structure}/v0/mod.rs | 26 +-- .../data_contract_create/mod.rs | 34 +++- .../data_contract_create/state/v0/mod.rs | 15 +- .../advanced_structure/mod.rs | 36 ++++ .../advanced_structure/v0/mod.rs | 42 ++++ .../data_contract_update/mod.rs | 30 ++- .../data_contract_update/state/mod.rs | 2 + .../data_contract_update/structure/mod.rs | 31 --- .../data_contract_update/structure/v0/mod.rs | 31 --- .../state_transitions/documents_batch/mod.rs | 19 +- .../documents_batch/state/v0/mod.rs | 13 +- .../documents_batch/transformer/v0/mod.rs | 16 +- .../state_transitions/identity_create/mod.rs | 14 +- .../identity_create/state/v0/mod.rs | 4 +- .../identity_credit_transfer/mod.rs | 16 +- .../structure/v0/mod.rs | 2 +- .../identity_credit_withdrawal/mod.rs | 15 +- .../state_transitions/identity_top_up/mod.rs | 14 +- .../state_transitions/identity_update/mod.rs | 14 +- .../identity_update/state/v0/mod.rs | 4 +- .../state_transition/state_transitions/mod.rs | 10 + .../state_transition/transformer/mod.rs | 21 +- .../verify_state_transitions.rs | 3 +- .../data_contract_create/transformer.rs | 30 +-- .../data_contract_create/v0/transformer.rs | 27 +-- .../bump_identity_nonce_action/transformer.rs | 46 +++++ .../v0/transformer.rs | 71 +++++++ .../src/version/drive_abci_versions.rs | 2 +- .../src/version/mocks/v2_test.rs | 18 +- .../src/version/mocks/v3_test.rs | 18 +- .../rs-platform-version/src/version/v1.rs | 18 +- packages/strategy-tests/src/lib.rs | 4 +- packages/strategy-tests/src/operations.rs | 43 ++-- .../invalid_identity_contract_nonce_error.rs | 3 +- 50 files changed, 1047 insertions(+), 307 deletions(-) create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/advanced_structure/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/advanced_structure/v0/mod.rs rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/{structure => basic_structure}/mod.rs (100%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/{structure => basic_structure}/v0/mod.rs (63%) create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/advanced_structure/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/advanced_structure/v0/mod.rs delete mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/structure/mod.rs delete mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/structure/v0/mod.rs diff --git a/packages/rs-dpp/src/data_contract/accessors/mod.rs b/packages/rs-dpp/src/data_contract/accessors/mod.rs index 344de28e3f..6d295c7a70 100644 --- a/packages/rs-dpp/src/data_contract/accessors/mod.rs +++ b/packages/rs-dpp/src/data_contract/accessors/mod.rs @@ -72,6 +72,12 @@ impl DataContractV0Getters for DataContract { } } + fn document_types_mut(&mut self) -> &mut BTreeMap { + match self { + DataContract::V0(v0) => v0.document_types_mut(), + } + } + fn metadata(&self) -> Option<&Metadata> { match self { DataContract::V0(v0) => v0.metadata(), diff --git a/packages/rs-dpp/src/data_contract/accessors/v0/mod.rs b/packages/rs-dpp/src/data_contract/accessors/v0/mod.rs index f5b276d1cf..b0809d41e5 100644 --- a/packages/rs-dpp/src/data_contract/accessors/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/accessors/v0/mod.rs @@ -30,6 +30,9 @@ pub trait DataContractV0Getters { /// Returns a mapping of document names to their corresponding document types. fn document_types(&self) -> &BTreeMap; + /// Returns a mapping of document names to their corresponding document types as mutable. + fn document_types_mut(&mut self) -> &mut BTreeMap; + /// Returns optional metadata associated with the contract. fn metadata(&self) -> Option<&Metadata>; diff --git a/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs b/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs index a4362c4bec..4240da16b2 100644 --- a/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs +++ b/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs @@ -191,10 +191,17 @@ impl DocumentTypeV0 { } }; - let optional_field_count = - rng.gen_range(parameters.new_fields_optional_count_range.clone()); - let required_field_count = - rng.gen_range(parameters.new_fields_required_count_range.clone()); + let optional_field_count = if parameters.new_fields_optional_count_range.is_empty() { + 0 + } else { + rng.gen_range(parameters.new_fields_optional_count_range.clone()) + }; + + let required_field_count = if parameters.new_fields_required_count_range.is_empty() { + 0 + } else { + rng.gen_range(parameters.new_fields_required_count_range.clone()) + }; let mut properties = IndexMap::new(); let mut required_fields = BTreeSet::new(); @@ -210,7 +217,12 @@ impl DocumentTypeV0 { required_fields.insert(field_name); } - let index_count = rng.gen_range(parameters.new_indexes_count_range.clone()); + let index_count = if parameters.new_indexes_count_range.is_empty() { + 0 + } else { + rng.gen_range(parameters.new_indexes_count_range.clone()) + }; + let field_names: Vec = properties.keys().cloned().collect(); // DPP only allows 10 properties per index (v1.0-dev) let ten_field_names = field_names @@ -419,4 +431,167 @@ impl DocumentTypeV0 { json_schema_validator: StatelessJsonSchemaLazyValidator::new(), }) } + + /// This is used to create an invalid random document type, often for testing + pub fn invalid_random_document_type( + parameters: RandomDocumentTypeParameters, + data_contract_id: Identifier, + rng: &mut StdRng, + platform_version: &PlatformVersion, + ) -> Result { + // Call the validation function at the beginning + parameters.validate_parameters()?; + + let field_weights = ¶meters.field_weights; + + let total_weight = field_weights.string_weight + + field_weights.float_weight + + field_weights.integer_weight + + field_weights.date_weight + + field_weights.boolean_weight + + field_weights.byte_array_weight; + + let random_field = |required: bool, rng: &mut StdRng| -> DocumentProperty { + let random_weight = rng.gen_range(0..total_weight); + let document_type = if random_weight < field_weights.string_weight { + let has_min_len = rng.gen_bool(parameters.field_bounds.string_has_min_len_chance); + let min_len = if has_min_len { + Some(rng.gen_range(parameters.field_bounds.string_min_len.clone())) + } else { + None + }; + // If a string property is used in an index it must have maxLength 63 or less (v1.0-dev) + let max_len = Some(63); + DocumentPropertyType::String(min_len, max_len) + } else if random_weight < field_weights.string_weight + field_weights.integer_weight { + DocumentPropertyType::Integer + } else if random_weight + < field_weights.string_weight + + field_weights.integer_weight + + field_weights.float_weight + { + DocumentPropertyType::Number + } else if random_weight + < field_weights.string_weight + + field_weights.integer_weight + + field_weights.float_weight + + field_weights.date_weight + { + DocumentPropertyType::Date + } else if random_weight + < field_weights.string_weight + + field_weights.integer_weight + + field_weights.float_weight + + field_weights.date_weight + + field_weights.boolean_weight + { + DocumentPropertyType::Boolean + } else { + let has_min_len = + rng.gen_bool(parameters.field_bounds.byte_array_has_min_len_chance); + let min_len = if has_min_len { + Some(rng.gen_range(parameters.field_bounds.byte_array_min_len.clone())) + } else { + None + }; + // Indexed arrays must have maxItems 255 or less (v1.0-dev) + let max_len = Some(255); + DocumentPropertyType::ByteArray(min_len, max_len) + }; + + DocumentProperty { + property_type: document_type, + required, + } + }; + + let optional_field_count = if parameters.new_fields_optional_count_range.is_empty() { + 0 + } else { + rng.gen_range(parameters.new_fields_optional_count_range.clone()) + }; + + let required_field_count = if parameters.new_fields_required_count_range.is_empty() { + 0 + } else { + rng.gen_range(parameters.new_fields_required_count_range.clone()) + }; + + let mut properties = IndexMap::new(); + let mut required_fields = BTreeSet::new(); + + for _ in 0..optional_field_count { + let field_name = format!("field_{}", rng.gen::()); + properties.insert(field_name, random_field(false, rng)); + } + + for _ in 0..required_field_count { + let field_name = format!("field_{}", rng.gen::()); + properties.insert(field_name.clone(), random_field(true, rng)); + required_fields.insert(field_name); + } + + let index_count = if parameters.new_indexes_count_range.is_empty() { + 0 + } else { + rng.gen_range(parameters.new_indexes_count_range.clone()) + }; + + let field_names: Vec = properties.keys().cloned().collect(); + // DPP only allows 10 properties per index (v1.0-dev) + let ten_field_names = field_names + .choose_multiple(&mut rand::thread_rng(), 10) + .cloned() + .collect_vec(); + + let mut indices = Vec::with_capacity(index_count as usize); + + for _ in 0..index_count { + match Index::random(&ten_field_names, &indices, rng) { + Ok(index) => indices.push(index), + Err(_) => break, + } + } + + let documents_keep_history = rng.gen_bool(parameters.keep_history_chance); + let documents_mutable = rng.gen_bool(parameters.documents_mutable_chance); + + let name = format!("doc_type_{}", rng.gen::()); + + let index_structure = + IndexLevel::try_from_indices(indices.as_slice(), name.as_str(), platform_version)?; + let (identifier_paths, binary_paths) = DocumentType::find_identifier_and_binary_paths( + &properties, + &PlatformVersion::latest() + .dpp + .contract_versions + .document_type_versions, + )?; + + // Combine everything into the final schema + let schema = json!({ + "invalid": "yo", + }); + + // TODO: It might not work properly + Ok(DocumentTypeV0 { + name, + schema: schema.into(), + indices, + index_structure, + flattened_properties: properties.clone(), + properties, + identifier_paths, + binary_paths, + required_fields, + documents_keep_history, + documents_mutable, + data_contract_id, + requires_identity_encryption_bounded_key: None, + requires_identity_decryption_bounded_key: None, + security_level_requirement: SecurityLevel::HIGH, + #[cfg(feature = "validation")] + json_schema_validator: StatelessJsonSchemaLazyValidator::new(), + }) + } } diff --git a/packages/rs-dpp/src/data_contract/v0/accessors/mod.rs b/packages/rs-dpp/src/data_contract/v0/accessors/mod.rs index 461037c65b..1706792a57 100644 --- a/packages/rs-dpp/src/data_contract/v0/accessors/mod.rs +++ b/packages/rs-dpp/src/data_contract/v0/accessors/mod.rs @@ -62,6 +62,10 @@ impl DataContractV0Getters for DataContractV0 { &self.document_types } + fn document_types_mut(&mut self) -> &mut BTreeMap { + &mut self.document_types + } + fn metadata(&self) -> Option<&Metadata> { self.metadata.as_ref() } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/mod.rs index 1ea016bdfa..efbac4ea41 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/mod.rs @@ -183,7 +183,8 @@ mod test { .validation_and_processing .state_transitions .contract_create_state_transition - .base_structure, + .basic_structure + .unwrap(), ), ), ( diff --git a/packages/rs-dpp/src/tests/fixtures/get_dashpay_contract_fixture.rs b/packages/rs-dpp/src/tests/fixtures/get_dashpay_contract_fixture.rs index b4aed770c2..5a0320c208 100644 --- a/packages/rs-dpp/src/tests/fixtures/get_dashpay_contract_fixture.rs +++ b/packages/rs-dpp/src/tests/fixtures/get_dashpay_contract_fixture.rs @@ -17,13 +17,13 @@ pub fn get_dashpay_contract_fixture( let platform_version = PlatformVersion::get(protocol_version).expect("expected to get version"); - let dpns_schema = SystemDataContract::Dashpay + let dashpay_schema = SystemDataContract::Dashpay .source(platform_version) .expect("DPNS contract must be defined") .document_schemas; let owner_id = owner_id.unwrap_or_else(generate_random_identifier_struct); factory - .create_with_value_config(owner_id, identity_nonce, dpns_schema.into(), None, None) + .create_with_value_config(owner_id, identity_nonce, dashpay_schema.into(), None, None) .expect("data in fixture should be correct") } diff --git a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs index 4ad51c685e..387e4b2947 100644 --- a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs @@ -192,6 +192,11 @@ mod tests { use dpp::NativeBlsModule; use crate::execution::check_tx::CheckTxLevel::{FirstTimeCheck, Recheck}; + use dpp::data_contract::document_type::v0::random_document_type::{ + FieldMinMaxBounds, FieldTypeWeights, RandomDocumentTypeParameters, + }; + use dpp::data_contract::document_type::v0::DocumentTypeV0; + use dpp::data_contract::document_type::DocumentType; use dpp::identity::contract_bounds::ContractBounds::SingleContractDocumentType; use dpp::platform_value::Bytes32; use dpp::system_data_contracts::dashpay_contract; @@ -423,6 +428,192 @@ mod tests { assert!(check_result.is_valid()); // it should still be valid, because we don't validate state } + #[test] + fn data_contract_create_check_tx_for_invalid_contract() { + let mut platform = TestPlatformBuilder::new() + .with_config(PlatformConfig::default()) + .build_with_mock_rpc(); + + platform + .core_rpc + .expect_verify_instant_lock() + .returning(|_, _| Ok(true)); + + let platform_state = platform.state.load(); + let protocol_version = platform_state.current_protocol_version_in_consensus(); + let platform_version = PlatformVersion::get(protocol_version).unwrap(); + + let (key, private_key) = IdentityPublicKey::random_ecdsa_critical_level_authentication_key( + 1, + Some(1), + platform_version, + ) + .expect("expected to get key pair"); + + platform + .drive + .create_initial_state_structure(None, platform_version) + .expect("expected to create state structure"); + let identity: Identity = IdentityV0 { + id: Identifier::new([ + 158, 113, 180, 126, 91, 83, 62, 44, 83, 54, 97, 88, 240, 215, 84, 139, 167, 156, + 166, 203, 222, 4, 64, 31, 215, 199, 149, 151, 190, 246, 251, 44, + ]), + public_keys: BTreeMap::from([(1, key.clone())]), + balance: 1000000000, + revision: 0, + } + .into(); + + let mut dashpay = get_dashpay_contract_fixture(Some(identity.id()), 1, protocol_version); + + let dashpay_id = dashpay.data_contract().id(); + // we need to alter dashpay to make it invalid + + let document_types = dashpay.data_contract_mut().document_types_mut(); + + let parameters = RandomDocumentTypeParameters { + new_fields_optional_count_range: 5..6, + new_fields_required_count_range: 3..4, + new_indexes_count_range: Default::default(), + field_weights: FieldTypeWeights { + string_weight: 5, + float_weight: 3, + integer_weight: 2, + date_weight: 0, + boolean_weight: 1, + byte_array_weight: 0, + }, + field_bounds: FieldMinMaxBounds { + string_min_len: Default::default(), + string_has_min_len_chance: 0.0, + string_max_len: Default::default(), + string_has_max_len_chance: 0.0, + integer_min: Default::default(), + integer_has_min_chance: 0.0, + integer_max: Default::default(), + integer_has_max_chance: 0.0, + float_min: Default::default(), + float_has_min_chance: 0.0, + float_max: Default::default(), + float_has_max_chance: 0.0, + date_min: 0, + date_max: 100, + byte_array_min_len: Default::default(), + byte_array_has_min_len_chance: 0.0, + byte_array_max_len: Default::default(), + byte_array_has_max_len_chance: 0.0, + }, + keep_history_chance: 0.0, + documents_mutable_chance: 0.0, + }; + + let mut rng = StdRng::seed_from_u64(6); + + document_types.insert( + "invalid".to_string(), + DocumentType::V0( + DocumentTypeV0::invalid_random_document_type( + parameters, + dashpay_id, + &mut rng, + platform_version, + ) + .expect("expected an invalid document type"), + ), + ); + + let mut create_contract_state_transition: StateTransition = dashpay + .try_into_platform_versioned(platform_version) + .expect("expected a state transition"); + create_contract_state_transition + .sign(&key, private_key.as_slice(), &NativeBlsModule) + .expect("expected to sign transition"); + let serialized = create_contract_state_transition + .serialize_to_bytes() + .expect("serialized state transition"); + platform + .drive + .add_new_identity( + identity, + false, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to insert identity"); + + let validation_result = platform + .check_tx( + serialized.as_slice(), + FirstTimeCheck, + &platform_state, + platform_version, + ) + .expect("expected to check tx"); + + assert!(validation_result.errors.is_empty()); + + let check_result = platform + .check_tx( + serialized.as_slice(), + Recheck, + &platform_state, + platform_version, + ) + .expect("expected to check tx"); + + assert!(check_result.is_valid()); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![serialized.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + // We have one invalid paid for state transition + assert_eq!(processing_result.invalid_paid_count(), 1); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 736520); + + let check_result = platform + .check_tx( + serialized.as_slice(), + Recheck, + &platform_state, + platform_version, + ) + .expect("expected to check tx"); + + assert!(check_result.is_valid()); // it should still be valid, because we didn't commit the transaction + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit"); + + let check_result = platform + .check_tx( + serialized.as_slice(), + Recheck, + &platform_state, + platform_version, + ) + .expect("expected to check tx"); + + assert!(check_result.is_valid()); // it should still be valid, because we don't validate state + } + #[test] fn data_contract_create_check_tx_priority() { let mut platform = TestPlatformBuilder::new() diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/make_sure_core_is_synced_to_chain_lock/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/make_sure_core_is_synced_to_chain_lock/v0/mod.rs index cfed56c58b..4ca9f9705c 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/make_sure_core_is_synced_to_chain_lock/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/make_sure_core_is_synced_to_chain_lock/v0/mod.rs @@ -1,9 +1,9 @@ use crate::error::Error; +use crate::execution::platform_events::core_chain_lock::make_sure_core_is_synced_to_chain_lock::CoreSyncStatus; use crate::platform_types::platform::Platform; use crate::rpc::core::CoreRPCLike; use dashcore_rpc::dashcore::ChainLock; use dpp::version::PlatformVersion; -use crate::execution::platform_events::core_chain_lock::make_sure_core_is_synced_to_chain_lock::CoreSyncStatus; impl Platform where diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_through_core/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_through_core/v0/mod.rs index 5344e17937..240f1718e1 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_through_core/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_through_core/v0/mod.rs @@ -1,7 +1,7 @@ use crate::error::Error; +use crate::execution::platform_events::core_chain_lock::make_sure_core_is_synced_to_chain_lock::CoreSyncStatus; use dpp::dashcore::ChainLock; use dpp::version::PlatformVersion; -use crate::execution::platform_events::core_chain_lock::make_sure_core_is_synced_to_chain_lock::CoreSyncStatus; use crate::platform_types::platform::Platform; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs index 368bfffe1c..1ff3545a76 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs @@ -15,6 +15,7 @@ use crate::execution::types::state_transition_execution_context::StateTransition use crate::execution::validation::state_transition::common::asset_lock::proof::verify_is_not_spent::AssetLockProofVerifyIsNotSpent; use crate::execution::validation::state_transition::processor::process_state_transition; use crate::execution::validation::state_transition::processor::v0::{StateTransitionBalanceValidationV0, StateTransitionBasicStructureValidationV0, StateTransitionNonceValidationV0, StateTransitionSignatureValidationV0, StateTransitionStructureKnownInStateValidationV0}; +use crate::execution::validation::state_transition::ValidationMode; /// A trait for validating state transitions within a blockchain. pub(crate) trait StateTransitionCheckTxValidationV0 { @@ -74,10 +75,11 @@ pub(super) fn state_transition_to_execution_event_for_check_tx_v0<'a, C: CoreRPC ); } - let action = if state_transition.requires_advance_structure_validation() { + let action = if state_transition.requires_advance_structure_validation_from_state() + { let state_transition_action_result = state_transition.transform_into_action( platform, - true, + ValidationMode::CheckTx, &mut state_transition_execution_context, None, )?; @@ -120,7 +122,7 @@ pub(super) fn state_transition_to_execution_event_for_check_tx_v0<'a, C: CoreRPC let state_transition_action_result = state_transition .transform_into_action( platform, - true, + ValidationMode::CheckTx, &mut state_transition_execution_context, None, )?; @@ -176,7 +178,7 @@ pub(super) fn state_transition_to_execution_event_for_check_tx_v0<'a, C: CoreRPC } else { let state_transition_action_result = state_transition.transform_into_action( platform, - true, + ValidationMode::CheckTx, &mut state_transition_execution_context, None, )?; @@ -230,7 +232,7 @@ pub(super) fn state_transition_to_execution_event_for_check_tx_v0<'a, C: CoreRPC let state_transition_action_result = state_transition.transform_into_action( platform, - true, + ValidationMode::RecheckTx, &mut state_transition_execution_context, None, )?; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_unique_identity_public_key_hashes_in_state/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_unique_identity_public_key_hashes_in_state/mod.rs index 830dca757a..84398f0dde 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_unique_identity_public_key_hashes_in_state/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_unique_identity_public_key_hashes_in_state/mod.rs @@ -6,11 +6,11 @@ use dpp::version::PlatformVersion; use crate::error::Error; use crate::error::execution::ExecutionError; use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; -use crate::execution::validation::state_transition::common::validate_unique_identity_public_key_hashes_in_state::v0::validate_unique_identity_public_key_hashes_in_state_v0; +use crate::execution::validation::state_transition::common::validate_unique_identity_public_key_hashes_in_state::v0::validate_unique_identity_public_key_hashes_not_in_state_v0; pub mod v0; -pub(crate) fn validate_unique_identity_public_key_hashes_in_state( +pub(crate) fn validate_unique_identity_public_key_hashes_not_in_state( identity_public_keys_with_witness: &[IdentityPublicKeyInCreation], drive: &Drive, execution_context: &mut StateTransitionExecutionContext, @@ -24,7 +24,7 @@ pub(crate) fn validate_unique_identity_public_key_hashes_in_state( .common_validation_methods .validate_unique_identity_public_key_hashes_in_state { - 0 => validate_unique_identity_public_key_hashes_in_state_v0( + 0 => validate_unique_identity_public_key_hashes_not_in_state_v0( identity_public_keys_with_witness, drive, execution_context, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_unique_identity_public_key_hashes_in_state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_unique_identity_public_key_hashes_in_state/v0/mod.rs index 7d533821be..ff1f78ef01 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_unique_identity_public_key_hashes_in_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_unique_identity_public_key_hashes_in_state/v0/mod.rs @@ -18,7 +18,7 @@ use dpp::version::PlatformVersion; use std::collections::HashMap; /// This will validate that all keys are valid against the state -pub(super) fn validate_unique_identity_public_key_hashes_in_state_v0( +pub(super) fn validate_unique_identity_public_key_hashes_not_in_state_v0( identity_public_keys_with_witness: &[IdentityPublicKeyInCreation], drive: &Drive, _execution_context: &mut StateTransitionExecutionContext, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs index 3c180e5890..a4dc72983e 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs @@ -22,6 +22,7 @@ use crate::execution::validation::state_transition::common::validate_state_trans use crate::execution::validation::state_transition::state_transitions::identity_update::identity_and_signatures::v0::IdentityUpdateStateTransitionIdentityAndSignaturesValidationV0; use crate::execution::validation::state_transition::state_transitions::identity_create::identity_and_signatures::v0::IdentityCreateStateTransitionIdentityAndSignaturesValidationV0; use crate::execution::validation::state_transition::state_transitions::identity_top_up::identity_retrieval::v0::IdentityTopUpStateTransitionIdentityRetrievalV0; +use crate::execution::validation::state_transition::ValidationMode; pub(in crate::execution) fn process_state_transition_v0<'a, C: CoreRPCLike>( platform: &'a PlatformRef, @@ -32,20 +33,10 @@ pub(in crate::execution) fn process_state_transition_v0<'a, C: CoreRPCLike>( let mut state_transition_execution_context = StateTransitionExecutionContext::default_for_platform_version(platform_version)?; - // We start with basic structure validation, this is structure validation that does not require - // state. - let consensus_result = state_transition.validate_basic_structure(platform_version)?; - - if !consensus_result.is_valid() { - return Ok( - ConsensusValidationResult::::new_with_errors(consensus_result.errors), - ); - } - - let action = if state_transition.requires_advance_structure_validation() { + let action = if state_transition.requires_state_to_validate_identity_and_signatures() { let state_transition_action_result = state_transition.transform_into_action( platform, - true, + ValidationMode::Validator, &mut state_transition_execution_context, transaction, )?; @@ -61,23 +52,67 @@ pub(in crate::execution) fn process_state_transition_v0<'a, C: CoreRPCLike>( None }; - // Validating structure - let result = state_transition.validate_advanced_structure_from_state( - &platform.into(), + // Validating signatures + let result = state_transition.validate_identity_and_signatures( + platform.drive, action.as_ref(), + transaction, + &mut state_transition_execution_context, platform_version, )?; + if !result.is_valid() { return Ok(ConsensusValidationResult::::new_with_errors(result.errors)); } - let action = if state_transition.requires_state_to_validate_identity_and_signatures() { + let mut maybe_identity = result.into_data()?; + + // Validating identity contract nonce, this must happen after validating the signature + let result = state_transition.validate_nonces( + &platform.into(), + platform.state.last_block_info(), + transaction, + platform_version, + )?; + + if !result.is_valid() { + return Ok(ConsensusValidationResult::::new_with_errors(result.errors)); + } + + // We validate basic structure validation after verifying the identity, + // this is structure validation that does not require state and is already checked on check_tx + let consensus_result = state_transition.validate_basic_structure(platform_version)?; + + if !consensus_result.is_valid() { + return Ok( + ConsensusValidationResult::::new_with_errors(consensus_result.errors), + ); + } + + // Next we have advanced structure validation, this is structure validation that does not require + // state but isn't checked on check_tx. If advanced structure fails identity nonces or identity + // contract nonces will be bumped + let consensus_result = state_transition.validate_advanced_structure(platform_version)?; + + if !consensus_result.is_valid() { + return consensus_result.map_result(|action| { + ExecutionEvent::create_from_state_transition_action( + action, + maybe_identity, + platform.state.last_committed_block_epoch_ref(), + state_transition_execution_context, + platform_version, + ) + }); + } + + let action = if state_transition.requires_advance_structure_validation_from_state() { if let Some(action) = action { Some(action) } else { let state_transition_action_result = state_transition.transform_into_action( platform, - true, + ValidationMode::Validator, &mut state_transition_execution_context, transaction, )?; @@ -94,22 +129,18 @@ pub(in crate::execution) fn process_state_transition_v0<'a, C: CoreRPCLike>( None }; - // Validating signatures - let result = state_transition.validate_identity_and_signatures( - platform.drive, + // Validating structure + let result = state_transition.validate_advanced_structure_from_state( + &platform.into(), action.as_ref(), - transaction, - &mut state_transition_execution_context, platform_version, )?; - if !result.is_valid() { return Ok(ConsensusValidationResult::::new_with_errors(result.errors)); } - let mut maybe_identity = result.into_data()?; - - // Validating identity contract nonce, this must happen after validating the signature + // Validating that we have sufficient balance for a transfer or withdrawal, + // this must happen after validating the signature let result = state_transition.validate_balance( maybe_identity.as_mut(), &platform.into(), @@ -122,22 +153,11 @@ pub(in crate::execution) fn process_state_transition_v0<'a, C: CoreRPCLike>( return Ok(ConsensusValidationResult::::new_with_errors(result.errors)); } - // Validating identity contract nonce, this must happen after validating the signature - let result = state_transition.validate_nonces( - &platform.into(), - platform.state.last_block_info(), - transaction, - platform_version, - )?; - - if !result.is_valid() { - return Ok(ConsensusValidationResult::::new_with_errors(result.errors)); - } - // Validating state let result = state_transition.validate_state( action, platform, + ValidationMode::Validator, &mut state_transition_execution_context, transaction, )?; @@ -203,6 +223,26 @@ pub(crate) trait StateTransitionBasicStructureValidationV0 { ) -> Result; } +/// A trait for validating state transitions within a blockchain. +/// The advanced structure validation should always happen in a block +/// and not in check_tx +pub(crate) trait StateTransitionAdvancedStructureValidationV0 { + /// Validates the structure of a transaction by checking its basic elements. + /// + /// # Arguments + /// + /// * `platform` - A reference to the platform state ref. + /// * `platform_version` - The platform version. + /// + /// # Returns + /// + /// * `Result` - A result with either a SimpleConsensusValidationResult or an Error. + fn validate_advanced_structure( + &self, + platform_version: &PlatformVersion, + ) -> Result, Error>; +} + /// A trait for validating state transitions within a blockchain. pub(crate) trait StateTransitionNonceValidationV0 { /// Validates the structure of a transaction by checking its basic elements. @@ -244,7 +284,7 @@ pub(crate) trait StateTransitionStructureKnownInStateValidationV0 { ) -> Result; /// This means we should transform into the action before validation of the structure - fn requires_advance_structure_validation(&self) -> bool { + fn requires_advance_structure_validation_from_state(&self) -> bool { false } } @@ -297,6 +337,7 @@ pub(crate) trait StateTransitionStateValidationV0: &self, action: Option, platform: &PlatformRef, + validation_mode: ValidationMode, execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, ) -> Result, Error>; @@ -311,8 +352,9 @@ impl StateTransitionBasicStructureValidationV0 for StateTransition { StateTransition::DataContractCreate(st) => { st.validate_basic_structure(platform_version) } - StateTransition::DataContractUpdate(st) => { - st.validate_basic_structure(platform_version) + StateTransition::DataContractUpdate(_) => { + // no basic structure validation + Ok(SimpleConsensusValidationResult::new()) } StateTransition::IdentityCreate(st) => st.validate_basic_structure(platform_version), StateTransition::IdentityUpdate(st) => st.validate_basic_structure(platform_version), @@ -381,6 +423,23 @@ impl StateTransitionBalanceValidationV0 for StateTransition { } } +impl StateTransitionAdvancedStructureValidationV0 for StateTransition { + fn validate_advanced_structure( + &self, + platform_version: &PlatformVersion, + ) -> Result, Error> { + match self { + StateTransition::DataContractCreate(st) => { + st.validate_advanced_structure(platform_version) + } + StateTransition::DataContractUpdate(st) => { + st.validate_advanced_structure(platform_version) + } + _ => Ok(ConsensusValidationResult::::new()), + } + } +} + impl StateTransitionStructureKnownInStateValidationV0 for StateTransition { fn validate_advanced_structure_from_state( &self, @@ -397,7 +456,7 @@ impl StateTransitionStructureKnownInStateValidationV0 for StateTransition { } /// This means we should transform into the action before validation of the structure - fn requires_advance_structure_validation(&self) -> bool { + fn requires_advance_structure_validation_from_state(&self) -> bool { matches!(self, StateTransition::DocumentsBatch(_)) } } @@ -557,36 +616,37 @@ impl StateTransitionStateValidationV0 for StateTransition { &self, action: Option, platform: &PlatformRef, + validation_mode: ValidationMode, execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, ) -> Result, Error> { match self { // The replay attack is prevented by checking if a data contract exists with this id first StateTransition::DataContractCreate(st) => { - st.validate_state(action, platform, execution_context, tx) + st.validate_state(action, platform, validation_mode, execution_context, tx) } // The replay attack is prevented by identity data contract nonce StateTransition::DataContractUpdate(st) => { - st.validate_state(action, platform, execution_context, tx) + st.validate_state(action, platform, validation_mode, execution_context, tx) } StateTransition::IdentityCreate(st) => { - st.validate_state(action, platform, execution_context, tx) + st.validate_state(action, platform, validation_mode, execution_context, tx) } StateTransition::IdentityUpdate(st) => { - st.validate_state(action, platform, execution_context, tx) + st.validate_state(action, platform, validation_mode, execution_context, tx) } StateTransition::IdentityTopUp(st) => { - st.validate_state(action, platform, execution_context, tx) + st.validate_state(action, platform, validation_mode, execution_context, tx) } StateTransition::IdentityCreditWithdrawal(st) => { - st.validate_state(action, platform, execution_context, tx) + st.validate_state(action, platform, validation_mode, execution_context, tx) } // The replay attack is prevented by identity data contract nonce StateTransition::DocumentsBatch(st) => { - st.validate_state(action, platform, execution_context, tx) + st.validate_state(action, platform, validation_mode, execution_context, tx) } StateTransition::IdentityCreditTransfer(st) => { - st.validate_state(action, platform, execution_context, tx) + st.validate_state(action, platform, validation_mode, execution_context, tx) } } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/advanced_structure/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/advanced_structure/mod.rs new file mode 100644 index 0000000000..025d570014 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/advanced_structure/mod.rs @@ -0,0 +1,36 @@ +use crate::error::execution::ExecutionError; +use crate::error::Error; +use crate::execution::validation::state_transition::data_contract_create::advanced_structure::v0::DataContractCreatedStateTransitionAdvancedStructureValidationV0; +use crate::execution::validation::state_transition::processor::v0::StateTransitionAdvancedStructureValidationV0; +use dpp::state_transition::data_contract_create_transition::DataContractCreateTransition; +use dpp::validation::ConsensusValidationResult; +use dpp::version::PlatformVersion; +use drive::state_transition_action::StateTransitionAction; + +pub(crate) mod v0; + +impl StateTransitionAdvancedStructureValidationV0 for DataContractCreateTransition { + fn validate_advanced_structure( + &self, + platform_version: &PlatformVersion, + ) -> Result, Error> { + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .contract_create_state_transition + .advanced_structure + { + Some(0) => self.validate_advanced_structure_v0(platform_version), + Some(version) => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "data contract create transition: validate_advanced_structure".to_string(), + known_versions: vec![0], + received: version, + })), + None => Err(Error::Execution(ExecutionError::VersionNotActive { + method: "data contract create transition: validate_advanced_structure".to_string(), + known_versions: vec![0], + })), + } + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/advanced_structure/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/advanced_structure/v0/mod.rs new file mode 100644 index 0000000000..f310f0bb34 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/advanced_structure/v0/mod.rs @@ -0,0 +1,46 @@ +use crate::error::Error; +use dpp::prelude::DataContract; +use dpp::state_transition::data_contract_create_transition::accessors::DataContractCreateTransitionAccessorsV0; +use dpp::state_transition::data_contract_create_transition::DataContractCreateTransition; +use dpp::validation::ConsensusValidationResult; +use dpp::version::PlatformVersion; +use dpp::ProtocolError; +use drive::state_transition_action::system::bump_identity_nonce_action::BumpIdentityNonceAction; +use drive::state_transition_action::StateTransitionAction; + +pub(in crate::execution::validation::state_transition::state_transitions::data_contract_create) trait DataContractCreatedStateTransitionAdvancedStructureValidationV0 { + fn validate_advanced_structure_v0(&self, platform_version: &PlatformVersion) -> Result, Error>; +} + +impl DataContractCreatedStateTransitionAdvancedStructureValidationV0 + for DataContractCreateTransition +{ + fn validate_advanced_structure_v0( + &self, + platform_version: &PlatformVersion, + ) -> Result, Error> { + // Validate data contract + let result = DataContract::try_from_platform_versioned( + self.data_contract().clone(), + true, + platform_version, + ); + + // Return validation result if any consensus errors happened + // during data contract validation + match result { + Err(ProtocolError::ConsensusError(consensus_error)) => { + let bump_action = StateTransitionAction::BumpIdentityNonceAction( + BumpIdentityNonceAction::from_borrowed_data_contract_create_transition(self)?, + ); + + Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + vec![*consensus_error], + )) + } + Err(protocol_error) => Err(protocol_error.into()), + Ok(_) => Ok(ConsensusValidationResult::new()), + } + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/structure/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/basic_structure/mod.rs similarity index 100% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/structure/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/basic_structure/mod.rs diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/structure/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/basic_structure/v0/mod.rs similarity index 63% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/structure/v0/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/basic_structure/v0/mod.rs index 5261b3e5c9..51772a0043 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/structure/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/basic_structure/v0/mod.rs @@ -6,36 +6,16 @@ use dpp::state_transition::data_contract_create_transition::accessors::DataContr use dpp::state_transition::data_contract_create_transition::DataContractCreateTransition; use dpp::validation::SimpleConsensusValidationResult; use dpp::version::PlatformVersion; -use dpp::ProtocolError; -pub(in crate::execution::validation::state_transition::state_transitions::data_contract_create) trait DataContractCreatedStateTransitionStructureValidationV0 { +pub(in crate::execution::validation::state_transition::state_transitions::data_contract_create) trait DataContractCreatedStateTransitionBasicStructureValidationV0 { fn validate_base_structure_v0(&self, platform_version: &PlatformVersion) -> Result; } -impl DataContractCreatedStateTransitionStructureValidationV0 for DataContractCreateTransition { +impl DataContractCreatedStateTransitionBasicStructureValidationV0 for DataContractCreateTransition { fn validate_base_structure_v0( &self, - platform_version: &PlatformVersion, + _platform_version: &PlatformVersion, ) -> Result { - // Validate data contract - let result = DataContract::try_from_platform_versioned( - self.data_contract().clone(), - true, - platform_version, - ); - - // Return validation result if any consensus errors happened - // during data contract validation - match result { - Err(ProtocolError::ConsensusError(consensus_error)) => { - return Ok(SimpleConsensusValidationResult::new_with_error( - *consensus_error, - )) - } - Err(protocol_error) => return Err(protocol_error.into()), - Ok(_) => {} - } - // Validate data contract id let generated_id = DataContract::generate_data_contract_id_v0( self.data_contract().owner_id(), diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs index 06ab5da282..5628c924a8 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs @@ -1,6 +1,7 @@ +mod advanced_structure; +mod basic_structure; mod identity_nonce; mod state; -mod structure; use dpp::prelude::ConsensusValidationResult; use dpp::state_transition::data_contract_create_transition::DataContractCreateTransition; @@ -14,8 +15,8 @@ use crate::error::execution::ExecutionError; use crate::error::Error; use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; +use crate::execution::validation::state_transition::data_contract_create::basic_structure::v0::DataContractCreatedStateTransitionBasicStructureValidationV0; use crate::execution::validation::state_transition::data_contract_create::state::v0::DataContractCreateStateTransitionStateValidationV0; -use crate::execution::validation::state_transition::data_contract_create::structure::v0::DataContractCreatedStateTransitionStructureValidationV0; use crate::platform_types::platform::PlatformRef; use crate::rpc::core::CoreRPCLike; @@ -23,12 +24,24 @@ use crate::execution::validation::state_transition::processor::v0::{ StateTransitionBasicStructureValidationV0, StateTransitionStateValidationV0, }; use crate::execution::validation::state_transition::transformer::StateTransitionActionTransformerV0; +use crate::execution::validation::state_transition::ValidationMode; + +impl ValidationMode { + /// Returns if we should validate the contract when we transform it from its serialized form + pub fn should_validate_contract_on_transform_into_action(&self) -> bool { + match self { + ValidationMode::CheckTx => false, + ValidationMode::RecheckTx => false, + ValidationMode::Validator => true, + } + } +} impl StateTransitionActionTransformerV0 for DataContractCreateTransition { fn transform_into_action( &self, platform: &PlatformRef, - _validate: bool, + validation_mode: ValidationMode, _execution_context: &mut StateTransitionExecutionContext, _tx: TransactionArg, ) -> Result, Error> { @@ -41,7 +54,7 @@ impl StateTransitionActionTransformerV0 for DataContractCreateTransition { .contract_create_state_transition .transform_into_action { - 0 => self.transform_into_action_v0::(platform_version), + 0 => self.transform_into_action_v0::(validation_mode, platform_version), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "data contract create transition: transform_into_action".to_string(), known_versions: vec![0], @@ -61,14 +74,18 @@ impl StateTransitionBasicStructureValidationV0 for DataContractCreateTransition .validation_and_processing .state_transitions .contract_create_state_transition - .base_structure + .basic_structure { - 0 => self.validate_base_structure_v0(platform_version), - version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + Some(0) => self.validate_base_structure_v0(platform_version), + Some(version) => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "data contract create transition: validate_basic_structure".to_string(), known_versions: vec![0], received: version, })), + None => Err(Error::Execution(ExecutionError::VersionNotActive { + method: "data contract create transition: validate_basic_structure".to_string(), + known_versions: vec![0], + })), } } } @@ -78,6 +95,7 @@ impl StateTransitionStateValidationV0 for DataContractCreateTransition { &self, _action: Option, platform: &PlatformRef, + validation_mode: ValidationMode, _execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, ) -> Result, Error> { @@ -90,7 +108,7 @@ impl StateTransitionStateValidationV0 for DataContractCreateTransition { .contract_create_state_transition .state { - 0 => self.validate_state_v0(platform, tx, platform_version), + 0 => self.validate_state_v0(platform, tx, validation_mode, platform_version), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "data contract create transition: validate_state".to_string(), known_versions: vec![0], diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/state/v0/mod.rs index 15e656dce8..21f5c48df2 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/state/v0/mod.rs @@ -8,7 +8,8 @@ use dpp::prelude::ConsensusValidationResult; use dpp::state_transition::data_contract_create_transition::accessors::DataContractCreateTransitionAccessorsV0; use dpp::state_transition::data_contract_create_transition::DataContractCreateTransition; -use dpp::version::{PlatformVersion, TryIntoPlatformVersioned}; +use crate::execution::validation::state_transition::ValidationMode; +use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; use drive::state_transition_action::contract::data_contract_create::DataContractCreateTransitionAction; use drive::state_transition_action::StateTransitionAction; @@ -18,11 +19,13 @@ pub(in crate::execution::validation::state_transition::state_transitions::data_c &self, platform: &PlatformRef, tx: TransactionArg, + validation_mode: ValidationMode, platform_version: &PlatformVersion, ) -> Result, Error>; fn transform_into_action_v0( &self, + validation_mode: ValidationMode, platform_version: &PlatformVersion, ) -> Result, Error>; } @@ -32,6 +35,7 @@ impl DataContractCreateStateTransitionStateValidationV0 for DataContractCreateTr &self, platform: &PlatformRef, tx: TransactionArg, + validation_mode: ValidationMode, platform_version: &PlatformVersion, ) -> Result, Error> { let drive = platform.drive; @@ -54,16 +58,21 @@ impl DataContractCreateStateTransitionStateValidationV0 for DataContractCreateTr .into(), ])) } else { - self.transform_into_action_v0::(platform_version) + self.transform_into_action_v0::(validation_mode, platform_version) } } fn transform_into_action_v0( &self, + validation_mode: ValidationMode, platform_version: &PlatformVersion, ) -> Result, Error> { let create_action: DataContractCreateTransitionAction = - self.try_into_platform_versioned(platform_version)?; + DataContractCreateTransitionAction::try_from_borrowed_platform_versioned( + self, + validation_mode.should_validate_contract_on_transform_into_action(), + platform_version, + )?; let action: StateTransitionAction = create_action.into(); Ok(action.into()) } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/advanced_structure/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/advanced_structure/mod.rs new file mode 100644 index 0000000000..547d60e115 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/advanced_structure/mod.rs @@ -0,0 +1,36 @@ +use crate::error::execution::ExecutionError; +use crate::error::Error; +use crate::execution::validation::state_transition::data_contract_update::advanced_structure::v0::DataContractUpdateStateTransitionAdvancedStructureValidationV0; +use crate::execution::validation::state_transition::processor::v0::StateTransitionAdvancedStructureValidationV0; +use dpp::state_transition::data_contract_update_transition::DataContractUpdateTransition; +use dpp::validation::ConsensusValidationResult; +use dpp::version::PlatformVersion; +use drive::state_transition_action::StateTransitionAction; + +pub(crate) mod v0; + +impl StateTransitionAdvancedStructureValidationV0 for DataContractUpdateTransition { + fn validate_advanced_structure( + &self, + platform_version: &PlatformVersion, + ) -> Result, Error> { + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .contract_update_state_transition + .advanced_structure + { + Some(0) => self.validate_advanced_structure_v0(platform_version), + Some(version) => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "data contract update transition: validate_basic_structure".to_string(), + known_versions: vec![0], + received: version, + })), + None => Err(Error::Execution(ExecutionError::VersionNotActive { + method: "data contract update transition: validate_basic_structure".to_string(), + known_versions: vec![0], + })), + } + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/advanced_structure/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/advanced_structure/v0/mod.rs new file mode 100644 index 0000000000..1eed199665 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/advanced_structure/v0/mod.rs @@ -0,0 +1,42 @@ +use crate::error::Error; +use dpp::data_contract::DataContract; +use dpp::state_transition::data_contract_update_transition::accessors::DataContractUpdateTransitionAccessorsV0; +use dpp::ProtocolError; + +use dpp::state_transition::data_contract_update_transition::DataContractUpdateTransition; +use dpp::validation::ConsensusValidationResult; +use dpp::version::PlatformVersion; +use drive::state_transition_action::system::bump_identity_data_contract_nonce_action::BumpIdentityDataContractNonceAction; +use drive::state_transition_action::StateTransitionAction; + +pub(in crate::execution::validation::state_transition::state_transitions::data_contract_update) trait DataContractUpdateStateTransitionAdvancedStructureValidationV0 { + fn validate_advanced_structure_v0(&self, platform_version: &PlatformVersion) -> Result, Error>; +} + +impl DataContractUpdateStateTransitionAdvancedStructureValidationV0 + for DataContractUpdateTransition +{ + fn validate_advanced_structure_v0( + &self, + platform_version: &PlatformVersion, + ) -> Result, Error> { + match DataContract::try_from_platform_versioned( + self.data_contract().clone(), + true, + platform_version, + ) { + Err(ProtocolError::ConsensusError(consensus_error)) => { + let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( + BumpIdentityDataContractNonceAction::from_borrowed_data_contract_update_transition(self)?, + ); + + Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + vec![*consensus_error], + )) + } + Err(protocol_error) => Err(protocol_error.into()), + Ok(_) => Ok(ConsensusValidationResult::new()), + } + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs index 008e292a09..b41661607b 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs @@ -1,6 +1,6 @@ +mod advanced_structure; mod identity_contract_nonce; mod state; -mod structure; use dpp::state_transition::data_contract_update_transition::DataContractUpdateTransition; use dpp::validation::ConsensusValidationResult; @@ -16,6 +16,7 @@ use drive::state_transition_action::StateTransitionAction; use crate::execution::validation::state_transition::data_contract_update::state::v0::DataContractUpdateStateTransitionStateValidationV0; use crate::execution::validation::state_transition::transformer::StateTransitionActionTransformerV0; +use crate::execution::validation::state_transition::ValidationMode; use crate::platform_types::platform::PlatformRef; use crate::rpc::core::CoreRPCLike; @@ -23,7 +24,7 @@ impl StateTransitionActionTransformerV0 for DataContractUpdateTransition { fn transform_into_action( &self, platform: &PlatformRef, - _validate: bool, + _validation_mode: ValidationMode, _execution_context: &mut StateTransitionExecutionContext, _tx: TransactionArg, ) -> Result, Error> { @@ -132,6 +133,7 @@ mod tests { use dpp::state_transition::data_contract_update_transition::DataContractUpdateTransition; use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; + use crate::execution::validation::state_transition::ValidationMode; use dpp::version::TryFromPlatformVersioned; use platform_version::version::LATEST_PLATFORM_VERSION; use platform_version::{DefaultForPlatformVersion, TryIntoPlatformVersioned}; @@ -197,7 +199,13 @@ mod tests { .expect("expected a platform version"); let result = DataContractUpdateTransition::V0(state_transition) - .validate_state(None, &platform_ref, &mut execution_context, None) + .validate_state( + None, + &platform_ref, + ValidationMode::Validator, + &mut execution_context, + None, + ) .expect("state transition to be validated"); assert!(!result.is_valid()); @@ -278,7 +286,13 @@ mod tests { .expect("expected a platform version"); let result = DataContractUpdateTransition::V0(state_transition) - .validate_state(None, &platform_ref, &mut execution_context, None) + .validate_state( + None, + &platform_ref, + ValidationMode::Validator, + &mut execution_context, + None, + ) .expect("state transition to be validated"); assert!(result.is_valid()); @@ -428,7 +442,13 @@ mod tests { .expect("expected a platform version"); let result = state_transition - .validate_state(None, &platform_ref, &mut execution_context, None) + .validate_state( + None, + &platform_ref, + ValidationMode::Validator, + &mut execution_context, + None, + ) .expect("state transition to be validated"); assert!(!result.is_valid()); diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/mod.rs index 81b2af66a7..ac7dd03f15 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/mod.rs @@ -3,6 +3,7 @@ use crate::error::Error; use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; use crate::execution::validation::state_transition::data_contract_update::state::v0::DataContractUpdateStateTransitionStateValidationV0; use crate::execution::validation::state_transition::processor::v0::StateTransitionStateValidationV0; +use crate::execution::validation::state_transition::ValidationMode; use crate::platform_types::platform::PlatformRef; use crate::rpc::core::CoreRPCLike; use dpp::state_transition::data_contract_update_transition::DataContractUpdateTransition; @@ -17,6 +18,7 @@ impl StateTransitionStateValidationV0 for DataContractUpdateTransition { &self, _action: Option, platform: &PlatformRef, + _validation_mode: ValidationMode, _execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, ) -> Result, Error> { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/structure/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/structure/mod.rs deleted file mode 100644 index b4f95f7e29..0000000000 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/structure/mod.rs +++ /dev/null @@ -1,31 +0,0 @@ -use crate::error::execution::ExecutionError; -use crate::error::Error; -use crate::execution::validation::state_transition::data_contract_update::structure::v0::DataContractUpdateStateTransitionStructureValidationV0; -use crate::execution::validation::state_transition::processor::v0::StateTransitionBasicStructureValidationV0; -use dpp::state_transition::data_contract_update_transition::DataContractUpdateTransition; -use dpp::validation::SimpleConsensusValidationResult; -use dpp::version::PlatformVersion; - -pub(crate) mod v0; - -impl StateTransitionBasicStructureValidationV0 for DataContractUpdateTransition { - fn validate_basic_structure( - &self, - platform_version: &PlatformVersion, - ) -> Result { - match platform_version - .drive_abci - .validation_and_processing - .state_transitions - .contract_update_state_transition - .base_structure - { - 0 => self.validate_base_structure_v0(platform_version), - version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { - method: "data contract update transition: validate_basic_structure".to_string(), - known_versions: vec![0], - received: version, - })), - } - } -} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/structure/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/structure/v0/mod.rs deleted file mode 100644 index 20853351ae..0000000000 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/structure/v0/mod.rs +++ /dev/null @@ -1,31 +0,0 @@ -use crate::error::Error; -use dpp::data_contract::DataContract; -use dpp::state_transition::data_contract_update_transition::accessors::DataContractUpdateTransitionAccessorsV0; -use dpp::ProtocolError; - -use dpp::state_transition::data_contract_update_transition::DataContractUpdateTransition; -use dpp::validation::SimpleConsensusValidationResult; -use dpp::version::PlatformVersion; - -pub(in crate::execution::validation::state_transition::state_transitions::data_contract_update) trait DataContractUpdateStateTransitionStructureValidationV0 { - fn validate_base_structure_v0(&self, platform_version: &PlatformVersion) -> Result; -} - -impl DataContractUpdateStateTransitionStructureValidationV0 for DataContractUpdateTransition { - fn validate_base_structure_v0( - &self, - platform_version: &PlatformVersion, - ) -> Result { - match DataContract::try_from_platform_versioned( - self.data_contract().clone(), - true, - platform_version, - ) { - Ok(_) => Ok(SimpleConsensusValidationResult::default()), - Err(ProtocolError::ConsensusError(e)) => Ok( - SimpleConsensusValidationResult::new_with_error(e.as_ref().clone()), - ), - Err(e) => Err(e.into()), - } - } -} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs index a618e7404c..c351f33b3d 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs @@ -30,12 +30,24 @@ use crate::execution::validation::state_transition::processor::v0::{ StateTransitionStateValidationV0, StateTransitionStructureKnownInStateValidationV0, }; use crate::execution::validation::state_transition::transformer::StateTransitionActionTransformerV0; +use crate::execution::validation::state_transition::ValidationMode; + +impl ValidationMode { + /// Returns a bool on whether we should validate that documents are valid against the state + pub fn should_validate_document_valid_against_state(&self) -> bool { + match self { + ValidationMode::CheckTx => false, + ValidationMode::RecheckTx => false, + ValidationMode::Validator => true, + } + } +} impl StateTransitionActionTransformerV0 for DocumentsBatchTransition { fn transform_into_action( &self, platform: &PlatformRef, - validate: bool, + validation_mode: ValidationMode, _execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, ) -> Result, Error> { @@ -48,7 +60,7 @@ impl StateTransitionActionTransformerV0 for DocumentsBatchTransition { .documents_batch_state_transition .transform_into_action { - 0 => self.transform_into_action_v0(&platform.into(), validate, tx), + 0 => self.transform_into_action_v0(&platform.into(), validation_mode, tx), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "documents batch transition: transform_into_action".to_string(), known_versions: vec![0], @@ -152,7 +164,7 @@ impl StateTransitionStructureKnownInStateValidationV0 for DocumentsBatchTransiti } } - fn requires_advance_structure_validation(&self) -> bool { + fn requires_advance_structure_validation_from_state(&self) -> bool { true } } @@ -162,6 +174,7 @@ impl StateTransitionStateValidationV0 for DocumentsBatchTransition { &self, action: Option, platform: &PlatformRef, + _validation_mode: ValidationMode, _execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, ) -> Result, Error> { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs index ac3ccabd4b..e28e432d64 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs @@ -18,6 +18,7 @@ use crate::execution::validation::state_transition::documents_batch::action_vali use crate::execution::validation::state_transition::documents_batch::data_triggers::{data_trigger_bindings_list, DataTriggerExecutionContext, DataTriggerExecutor}; use crate::platform_types::platform::{PlatformStateRef}; use crate::execution::validation::state_transition::state_transitions::documents_batch::transformer::v0::DocumentsBatchTransitionTransformerV0; +use crate::execution::validation::state_transition::ValidationMode; mod data_triggers; pub mod fetch_documents; @@ -35,7 +36,7 @@ pub(in crate::execution::validation::state_transition::state_transitions::docume fn transform_into_action_v0( &self, platform: &PlatformStateRef, - validate: bool, + validation_mode: ValidationMode, tx: TransactionArg, ) -> Result, Error>; } @@ -153,7 +154,7 @@ impl DocumentsBatchStateTransitionStateValidationV0 for DocumentsBatchTransition fn transform_into_action_v0( &self, platform: &PlatformStateRef, - validate: bool, + validation_mode: ValidationMode, tx: TransactionArg, ) -> Result, Error> { let platform_version = platform.state.current_platform_version()?; @@ -161,8 +162,12 @@ impl DocumentsBatchStateTransitionStateValidationV0 for DocumentsBatchTransition let mut execution_context = StateTransitionExecutionContext::default_for_platform_version(platform_version)?; - let validation_result = - self.try_into_action_v0(platform, validate, tx, &mut execution_context)?; + let validation_result = self.try_into_action_v0( + platform, + validation_mode.should_validate_document_valid_against_state(), + tx, + &mut execution_context, + )?; Ok(validation_result.map(Into::into)) } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs index 8ba97782e9..d64ec65d74 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs @@ -98,7 +98,7 @@ impl DocumentsBatchTransitionTransformerV0 for DocumentsBatchTransition { fn try_into_action_v0( &self, platform: &PlatformStateRef, - validate: bool, + validate_against_state: bool, transaction: TransactionArg, execution_context: &mut StateTransitionExecutionContext, ) -> Result, Error> { @@ -139,7 +139,7 @@ impl DocumentsBatchTransitionTransformerV0 for DocumentsBatchTransition { |(data_contract_id, document_transitions_by_document_type)| { Self::transform_document_transitions_within_contract_v0( platform, - validate, + validate_against_state, data_contract_id, owner_id, document_transitions_by_document_type, @@ -173,7 +173,7 @@ impl DocumentsBatchTransitionTransformerV0 for DocumentsBatchTransition { impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition { fn transform_document_transitions_within_contract_v0( platform: &PlatformStateRef, - validate: bool, + validate_against_state: bool, data_contract_id: &Identifier, owner_id: Identifier, document_transitions: &BTreeMap<&String, Vec<&DocumentTransition>>, @@ -206,7 +206,7 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition .map(|(document_type_name, document_transitions)| { Self::transform_document_transitions_within_document_type_v0( platform, - validate, + validate_against_state, data_contract_fetch_info.clone(), document_type_name, owner_id, @@ -223,7 +223,7 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition fn transform_document_transitions_within_document_type_v0( platform: &PlatformStateRef, - validate: bool, + validate_against_state: bool, data_contract_fetch_info: Arc, document_type_name: &str, owner_id: Identifier, @@ -286,7 +286,7 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition .map(|transition| { // we validate every transition in this document type Self::transform_transition_v0( - validate, + validate_against_state, data_contract_fetch_info.clone(), transition, &replaced_documents, @@ -321,7 +321,7 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition /// The data contract can be of multiple difference versions fn transform_transition_v0<'a>( - validate: bool, + validate_against_state: bool, data_contract_fetch_info: Arc, transition: &DocumentTransition, replaced_documents: &[Document], @@ -369,7 +369,7 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition return Ok(result); } - if validate { + if validate_against_state { //there are situations where we don't want to validate this against the state // for example when we already applied the state transition action // and we are just validating it happened diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/mod.rs index 531d3f7eb8..43201f4e2f 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/mod.rs @@ -23,6 +23,7 @@ use dpp::validation::SimpleConsensusValidationResult; use dpp::version::PlatformVersion; use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; +use crate::execution::validation::state_transition::ValidationMode; use drive::grovedb::TransactionArg; use drive::state_transition_action::StateTransitionAction; @@ -30,7 +31,7 @@ impl StateTransitionActionTransformerV0 for IdentityCreateTransition { fn transform_into_action( &self, platform: &PlatformRef, - _validate: bool, + _validation_mode: ValidationMode, execution_context: &mut StateTransitionExecutionContext, _tx: TransactionArg, ) -> Result, Error> { @@ -62,14 +63,18 @@ impl StateTransitionBasicStructureValidationV0 for IdentityCreateTransition { .validation_and_processing .state_transitions .identity_create_state_transition - .base_structure + .basic_structure { - 0 => self.validate_base_structure_v0(platform_version), - version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + Some(0) => self.validate_base_structure_v0(platform_version), + Some(version) => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "identity create transition: validate_basic_structure".to_string(), known_versions: vec![0], received: version, })), + None => Err(Error::Execution(ExecutionError::VersionNotActive { + method: "identity create transition: validate_basic_structure".to_string(), + known_versions: vec![0], + })), } } } @@ -79,6 +84,7 @@ impl StateTransitionStateValidationV0 for IdentityCreateTransition { &self, _action: Option, platform: &PlatformRef, + _validation_mode: ValidationMode, execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, ) -> Result, Error> { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/state/v0/mod.rs index c8da55d588..d48fc7d1ac 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/state/v0/mod.rs @@ -33,7 +33,7 @@ use dpp::version::DefaultForPlatformVersion; use drive::grovedb::TransactionArg; use crate::execution::validation::state_transition::common::asset_lock::transaction::fetch_asset_lock_transaction_output_sync::fetch_asset_lock_transaction_output_sync; -use crate::execution::validation::state_transition::common::validate_unique_identity_public_key_hashes_in_state::validate_unique_identity_public_key_hashes_in_state; +use crate::execution::validation::state_transition::common::validate_unique_identity_public_key_hashes_in_state::validate_unique_identity_public_key_hashes_not_in_state; pub(in crate::execution::validation::state_transition::state_transitions::identity_create) trait IdentityCreateStateTransitionStateValidationV0 { @@ -90,7 +90,7 @@ impl IdentityCreateStateTransitionStateValidationV0 for IdentityCreateTransition // Now we should check the state of added keys to make sure there aren't any that already exist validation_result.add_errors( - validate_unique_identity_public_key_hashes_in_state( + validate_unique_identity_public_key_hashes_not_in_state( self.public_keys(), drive, &mut state_transition_execution_context, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/mod.rs index 790735d946..5c95785d11 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/mod.rs @@ -22,12 +22,13 @@ use crate::execution::validation::state_transition::processor::v0::{ StateTransitionBasicStructureValidationV0, StateTransitionStateValidationV0, }; use crate::execution::validation::state_transition::transformer::StateTransitionActionTransformerV0; +use crate::execution::validation::state_transition::ValidationMode; impl StateTransitionActionTransformerV0 for IdentityCreditTransferTransition { fn transform_into_action( &self, platform: &PlatformRef, - _validate: bool, + _validation_mode: ValidationMode, _execution_context: &mut StateTransitionExecutionContext, _tx: TransactionArg, ) -> Result, Error> { @@ -60,14 +61,18 @@ impl StateTransitionBasicStructureValidationV0 for IdentityCreditTransferTransit .validation_and_processing .state_transitions .identity_credit_transfer_state_transition - .base_structure + .basic_structure { - 0 => self.validate_base_structure_v0(), - version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { - method: "identity credit transfer transition: validate_structure".to_string(), + Some(0) => self.validate_base_structure_v0(), + Some(version) => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "identity credit transfer transition: validate_basic_structure".to_string(), known_versions: vec![0], received: version, })), + None => Err(Error::Execution(ExecutionError::VersionNotActive { + method: "identity credit transfer transition: validate_basic_structure".to_string(), + known_versions: vec![0], + })), } } } @@ -77,6 +82,7 @@ impl StateTransitionStateValidationV0 for IdentityCreditTransferTransition { &self, _action: Option, platform: &PlatformRef, + _validation_mode: ValidationMode, _execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, ) -> Result, Error> { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/structure/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/structure/v0/mod.rs index 9a0951d43a..7d0784624b 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/structure/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/structure/v0/mod.rs @@ -8,7 +8,7 @@ use dpp::state_transition::identity_credit_transfer_transition::accessors::Ident use dpp::state_transition::identity_credit_transfer_transition::IdentityCreditTransferTransition; use dpp::validation::SimpleConsensusValidationResult; -const MIN_TRANSFER_AMOUNT: u64 = 1000; +const MIN_TRANSFER_AMOUNT: u64 = 100000; pub(in crate::execution::validation::state_transition::state_transitions::identity_credit_transfer) trait IdentityCreditTransferStateTransitionStructureValidationV0 { fn validate_base_structure_v0(&self) -> Result; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs index d619e77760..d9a41cb229 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs @@ -23,12 +23,13 @@ use crate::execution::validation::state_transition::processor::v0::{ StateTransitionBasicStructureValidationV0, StateTransitionStateValidationV0, }; use crate::execution::validation::state_transition::transformer::StateTransitionActionTransformerV0; +use crate::execution::validation::state_transition::ValidationMode; impl StateTransitionActionTransformerV0 for IdentityCreditWithdrawalTransition { fn transform_into_action( &self, platform: &PlatformRef, - _validate: bool, + _validation_mode: ValidationMode, _execution_context: &mut StateTransitionExecutionContext, _tx: TransactionArg, ) -> Result, Error> { @@ -61,15 +62,20 @@ impl StateTransitionBasicStructureValidationV0 for IdentityCreditWithdrawalTrans .validation_and_processing .state_transitions .identity_credit_withdrawal_state_transition - .base_structure + .basic_structure { - 0 => self.validate_base_structure_v0(), - version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + Some(0) => self.validate_base_structure_v0(), + Some(version) => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "identity credit withdrawal transition: validate_basic_structure" .to_string(), known_versions: vec![0], received: version, })), + None => Err(Error::Execution(ExecutionError::VersionNotActive { + method: "identity credit withdrawal transition: validate_basic_structure" + .to_string(), + known_versions: vec![0], + })), } } } @@ -79,6 +85,7 @@ impl StateTransitionStateValidationV0 for IdentityCreditWithdrawalTransition { &self, _action: Option, platform: &PlatformRef, + _validation_mode: ValidationMode, _execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, ) -> Result, Error> { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/mod.rs index c3b5f61152..bdf37ebdc8 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/mod.rs @@ -23,12 +23,13 @@ use crate::execution::validation::state_transition::processor::v0::{ }; use crate::execution::validation::state_transition::transformer::StateTransitionActionTransformerV0; +use crate::execution::validation::state_transition::ValidationMode; impl StateTransitionActionTransformerV0 for IdentityTopUpTransition { fn transform_into_action( &self, platform: &PlatformRef, - _validate: bool, + _validation_mode: ValidationMode, execution_context: &mut StateTransitionExecutionContext, _tx: TransactionArg, ) -> Result, Error> { @@ -61,14 +62,18 @@ impl StateTransitionBasicStructureValidationV0 for IdentityTopUpTransition { .validation_and_processing .state_transitions .identity_top_up_state_transition - .base_structure + .basic_structure { - 0 => self.validate_base_structure_v0(platform_version), - version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + Some(0) => self.validate_base_structure_v0(platform_version), + Some(version) => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "identity top up transition: validate_basic_structure".to_string(), known_versions: vec![0], received: version, })), + None => Err(Error::Execution(ExecutionError::VersionNotActive { + method: "identity top up transition: validate_basic_structure".to_string(), + known_versions: vec![0], + })), } } } @@ -78,6 +83,7 @@ impl StateTransitionStateValidationV0 for IdentityTopUpTransition { &self, _action: Option, platform: &PlatformRef, + _validation_mode: ValidationMode, execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, ) -> Result, Error> { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/mod.rs index 2fd5093131..4363faab6f 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/mod.rs @@ -24,12 +24,13 @@ use crate::execution::validation::state_transition::processor::v0::{ }; use crate::execution::validation::state_transition::transformer::StateTransitionActionTransformerV0; +use crate::execution::validation::state_transition::ValidationMode; impl StateTransitionActionTransformerV0 for IdentityUpdateTransition { fn transform_into_action( &self, platform: &PlatformRef, - _validate: bool, + _validation_mode: ValidationMode, _execution_context: &mut StateTransitionExecutionContext, _tx: TransactionArg, ) -> Result, Error> { @@ -62,14 +63,18 @@ impl StateTransitionBasicStructureValidationV0 for IdentityUpdateTransition { .validation_and_processing .state_transitions .identity_update_state_transition - .base_structure + .basic_structure { - 0 => self.validate_base_structure_v0(platform_version), - version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + Some(0) => self.validate_base_structure_v0(platform_version), + Some(version) => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "identity update transition: validate_basic_structure".to_string(), known_versions: vec![0], received: version, })), + None => Err(Error::Execution(ExecutionError::VersionNotActive { + method: "identity update transition: validate_basic_structure".to_string(), + known_versions: vec![0], + })), } } } @@ -79,6 +84,7 @@ impl StateTransitionStateValidationV0 for IdentityUpdateTransition { &self, _action: Option, platform: &PlatformRef, + _validation_mode: ValidationMode, _execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, ) -> Result, Error> { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/state/v0/mod.rs index 41b6a6c94a..078374d64a 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/state/v0/mod.rs @@ -24,7 +24,7 @@ use crate::execution::types::state_transition_execution_context::StateTransition use crate::execution::validation::state_transition::common::validate_identity_public_key_contract_bounds::validate_identity_public_keys_contract_bounds; use crate::execution::validation::state_transition::common::validate_identity_public_key_ids_dont_exist_in_state::validate_identity_public_key_ids_dont_exist_in_state; use crate::execution::validation::state_transition::common::validate_identity_public_key_ids_exist_in_state::validate_identity_public_key_ids_exist_in_state; -use crate::execution::validation::state_transition::common::validate_unique_identity_public_key_hashes_in_state::validate_unique_identity_public_key_hashes_in_state; +use crate::execution::validation::state_transition::common::validate_unique_identity_public_key_hashes_in_state::validate_unique_identity_public_key_hashes_not_in_state; use crate::platform_types::platform_state::v0::PlatformStateV0Methods; pub(in crate::execution::validation::state_transition::state_transitions::identity_update) trait IdentityUpdateStateTransitionStateValidationV0 @@ -55,7 +55,7 @@ impl IdentityUpdateStateTransitionStateValidationV0 for IdentityUpdateTransition // Now we should check the state of added keys to make sure there aren't any that already exist validation_result.add_errors( - validate_unique_identity_public_key_hashes_in_state( + validate_unique_identity_public_key_hashes_not_in_state( self.public_keys_to_add(), drive, &mut state_transition_execution_context, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/mod.rs index 39b3dee515..c9dcaf4a8b 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/mod.rs @@ -21,3 +21,13 @@ pub mod data_contract_create; /// Module for updating an existing data contract entity. pub mod data_contract_update; + +/// The validation mode we are using +pub enum ValidationMode { + /// The basic checktx before the state transition is put into mempool + CheckTx, + /// Rechecking a state transition every block + RecheckTx, + /// The validation of the validator + Validator, +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/transformer/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/transformer/mod.rs index 700f73381d..05ca80fc96 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/transformer/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/transformer/mod.rs @@ -1,5 +1,6 @@ use crate::error::Error; use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; +use crate::execution::validation::state_transition::ValidationMode; use crate::platform_types::platform::PlatformRef; use crate::rpc::core::CoreRPCLike; use dpp::prelude::ConsensusValidationResult; @@ -28,7 +29,7 @@ pub trait StateTransitionActionTransformerV0 { fn transform_into_action( &self, platform: &PlatformRef, - validate: bool, + validation_mode: ValidationMode, execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, ) -> Result, Error>; @@ -38,34 +39,34 @@ impl StateTransitionActionTransformerV0 for StateTransition { fn transform_into_action( &self, platform: &PlatformRef, - validate: bool, + validation_mode: ValidationMode, execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, ) -> Result, Error> { match self { StateTransition::DataContractCreate(st) => { - st.transform_into_action(platform, validate, execution_context, tx) + st.transform_into_action(platform, validation_mode, execution_context, tx) } StateTransition::DataContractUpdate(st) => { - st.transform_into_action(platform, validate, execution_context, tx) + st.transform_into_action(platform, validation_mode, execution_context, tx) } StateTransition::IdentityCreate(st) => { - st.transform_into_action(platform, validate, execution_context, tx) + st.transform_into_action(platform, validation_mode, execution_context, tx) } StateTransition::IdentityUpdate(st) => { - st.transform_into_action(platform, validate, execution_context, tx) + st.transform_into_action(platform, validation_mode, execution_context, tx) } StateTransition::IdentityTopUp(st) => { - st.transform_into_action(platform, validate, execution_context, tx) + st.transform_into_action(platform, validation_mode, execution_context, tx) } StateTransition::IdentityCreditWithdrawal(st) => { - st.transform_into_action(platform, validate, execution_context, tx) + st.transform_into_action(platform, validation_mode, execution_context, tx) } StateTransition::DocumentsBatch(st) => { - st.transform_into_action(platform, validate, execution_context, tx) + st.transform_into_action(platform, validation_mode, execution_context, tx) } StateTransition::IdentityCreditTransfer(st) => { - st.transform_into_action(platform, validate, execution_context, tx) + st.transform_into_action(platform, validation_mode, execution_context, tx) } } } diff --git a/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs b/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs index ed7d7f3bad..5a9618717c 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs @@ -24,6 +24,7 @@ use drive::state_transition_action::document::documents_batch::document_transiti use drive::state_transition_action::document::documents_batch::document_transition::document_replace_transition_action::DocumentFromReplaceTransitionAction; use drive_abci::abci::app::FullAbciApplication; use drive_abci::execution::types::state_transition_execution_context::StateTransitionExecutionContext; +use drive_abci::execution::validation::state_transition::ValidationMode; use drive_abci::platform_types::platform_state::v0::PlatformStateV0Methods; use platform_version::DefaultForPlatformVersion; @@ -59,7 +60,7 @@ pub(crate) fn verify_state_transitions_were_or_were_not_executed( let consensus_validation_result = match state_transition.transform_into_action( &platform, - false, + ValidationMode::CheckTx, //using check_tx so we don't validate state &mut execution_context, None, ) { diff --git a/packages/rs-drive/src/state_transition_action/contract/data_contract_create/transformer.rs b/packages/rs-drive/src/state_transition_action/contract/data_contract_create/transformer.rs index 4c04b4b762..4644d28d31 100644 --- a/packages/rs-drive/src/state_transition_action/contract/data_contract_create/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/contract/data_contract_create/transformer.rs @@ -3,40 +3,42 @@ use crate::state_transition_action::contract::data_contract_create::DataContract use dpp::state_transition::data_contract_create_transition::DataContractCreateTransition; use dpp::ProtocolError; use platform_version::version::PlatformVersion; -use platform_version::TryFromPlatformVersioned; -impl TryFromPlatformVersioned for DataContractCreateTransitionAction { - type Error = ProtocolError; - - fn try_from_platform_versioned( +impl DataContractCreateTransitionAction { + /// tries to transform the DataContractCreateTransition into a DataContractCreateTransitionAction + /// if validation is true the data contract transformation verifies that the data contract is valid + /// if validation is false, the data contract base structure is created regardless of if it is valid + pub fn try_from_platform_versioned( value: DataContractCreateTransition, + validate: bool, platform_version: &PlatformVersion, - ) -> Result { + ) -> Result { match value { DataContractCreateTransition::V0(v0) => Ok( DataContractCreateTransitionActionV0::try_from_platform_versioned( v0, + validate, platform_version, )? .into(), ), } } -} -impl TryFromPlatformVersioned<&DataContractCreateTransition> - for DataContractCreateTransitionAction -{ - type Error = ProtocolError; + /// tries to transform the borrowed DataContractCreateTransition into a DataContractCreateTransitionAction + /// if validation is true the data contract transformation verifies that the data contract is valid + /// if validation is false, the data contract base structure is created regardless of if it is valid - fn try_from_platform_versioned( + pub fn try_from_borrowed_platform_versioned( value: &DataContractCreateTransition, + validate: bool, platform_version: &PlatformVersion, - ) -> Result { + ) -> Result { match value { DataContractCreateTransition::V0(v0) => Ok( - DataContractCreateTransitionActionV0::try_from_platform_versioned( + DataContractCreateTransitionActionV0::try_from_borrowed_platform_versioned( v0, + validate, platform_version, )? .into(), diff --git a/packages/rs-drive/src/state_transition_action/contract/data_contract_create/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/contract/data_contract_create/v0/transformer.rs index 9291d78737..a4c0c1a6cb 100644 --- a/packages/rs-drive/src/state_transition_action/contract/data_contract_create/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/contract/data_contract_create/v0/transformer.rs @@ -3,42 +3,33 @@ use dpp::prelude::DataContract; use dpp::state_transition::data_contract_create_transition::DataContractCreateTransitionV0; use dpp::ProtocolError; use platform_version::version::PlatformVersion; -use platform_version::TryFromPlatformVersioned; -impl TryFromPlatformVersioned - for DataContractCreateTransitionActionV0 -{ - type Error = ProtocolError; - - fn try_from_platform_versioned( +impl DataContractCreateTransitionActionV0 { + pub(in crate::state_transition_action::contract::data_contract_create) fn try_from_platform_versioned( value: DataContractCreateTransitionV0, + validate: bool, platform_version: &PlatformVersion, - ) -> Result { + ) -> Result { Ok(DataContractCreateTransitionActionV0 { data_contract: DataContract::try_from_platform_versioned( value.data_contract, - true, + validate, platform_version, )?, identity_nonce: value.identity_nonce, user_fee_increase: value.user_fee_increase, }) } -} - -impl TryFromPlatformVersioned<&DataContractCreateTransitionV0> - for DataContractCreateTransitionActionV0 -{ - type Error = ProtocolError; - fn try_from_platform_versioned( + pub(in crate::state_transition_action::contract::data_contract_create) fn try_from_borrowed_platform_versioned( value: &DataContractCreateTransitionV0, + validate: bool, platform_version: &PlatformVersion, - ) -> Result { + ) -> Result { Ok(DataContractCreateTransitionActionV0 { data_contract: DataContract::try_from_platform_versioned( value.data_contract.clone(), - true, + validate, platform_version, )?, identity_nonce: value.identity_nonce, diff --git a/packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/transformer.rs b/packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/transformer.rs index 14fbe1091e..ec75a3ffed 100644 --- a/packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/transformer.rs @@ -1,9 +1,11 @@ +use crate::state_transition_action::contract::data_contract_create::DataContractCreateTransitionAction; use crate::state_transition_action::identity::identity_credit_transfer::IdentityCreditTransferTransitionAction; use crate::state_transition_action::identity::identity_credit_withdrawal::IdentityCreditWithdrawalTransitionAction; use crate::state_transition_action::identity::identity_update::IdentityUpdateTransitionAction; use crate::state_transition_action::system::bump_identity_nonce_action::{ BumpIdentityNonceAction, BumpIdentityNonceActionV0, }; +use dpp::state_transition::data_contract_create_transition::DataContractCreateTransition; use dpp::state_transition::identity_credit_transfer_transition::IdentityCreditTransferTransition; use dpp::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition; use dpp::state_transition::identity_update_transition::IdentityUpdateTransition; @@ -54,6 +56,50 @@ impl BumpIdentityNonceAction { } } + /// from data contract create transition + pub fn from_data_contract_create_transition( + value: DataContractCreateTransition, + ) -> Result { + match value { + DataContractCreateTransition::V0(v0) => { + Ok(BumpIdentityNonceActionV0::try_from_contract_create(v0)?.into()) + } + } + } + + /// from borrowed data contract create transition + pub fn from_borrowed_data_contract_create_transition( + value: &DataContractCreateTransition, + ) -> Result { + match value { + DataContractCreateTransition::V0(v0) => { + Ok(BumpIdentityNonceActionV0::try_from_borrowed_contract_create(v0)?.into()) + } + } + } + + /// from data contract create transition action + pub fn from_data_contract_create_action( + value: DataContractCreateTransitionAction, + ) -> Result { + match value { + DataContractCreateTransitionAction::V0(v0) => { + Ok(BumpIdentityNonceActionV0::try_from_contract_create_action(v0)?.into()) + } + } + } + + /// from borrowed data contract create transition action + pub fn from_borrowed_data_contract_create_action( + value: &DataContractCreateTransitionAction, + ) -> Result { + match value { + DataContractCreateTransitionAction::V0(v0) => { + Ok(BumpIdentityNonceActionV0::try_from_borrowed_contract_create_action(v0)?.into()) + } + } + } + /// from identity transfer pub fn from_identity_credit_transfer_transition( value: IdentityCreditTransferTransition, diff --git a/packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/v0/transformer.rs index 9c99de4923..5c626a336f 100644 --- a/packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/v0/transformer.rs @@ -1,7 +1,10 @@ +use crate::state_transition_action::contract::data_contract_create::v0::DataContractCreateTransitionActionV0; use crate::state_transition_action::identity::identity_credit_transfer::v0::IdentityCreditTransferTransitionActionV0; use crate::state_transition_action::identity::identity_credit_withdrawal::v0::IdentityCreditWithdrawalTransitionActionV0; use crate::state_transition_action::identity::identity_update::v0::IdentityUpdateTransitionActionV0; use crate::state_transition_action::system::bump_identity_nonce_action::BumpIdentityNonceActionV0; +use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::state_transition::data_contract_create_transition::DataContractCreateTransitionV0; use dpp::state_transition::identity_credit_transfer_transition::v0::IdentityCreditTransferTransitionV0; use dpp::state_transition::identity_credit_withdrawal_transition::v0::IdentityCreditWithdrawalTransitionV0; use dpp::state_transition::identity_update_transition::v0::IdentityUpdateTransitionV0; @@ -76,6 +79,74 @@ impl BumpIdentityNonceActionV0 { }) } + /// try from contract create + pub fn try_from_contract_create( + value: DataContractCreateTransitionV0, + ) -> Result { + let DataContractCreateTransitionV0 { + data_contract, + identity_nonce, + user_fee_increase, + .. + } = value; + Ok(BumpIdentityNonceActionV0 { + identity_id: data_contract.owner_id(), + identity_nonce, + user_fee_increase, + }) + } + + /// try from contract create + pub fn try_from_borrowed_contract_create( + value: &DataContractCreateTransitionV0, + ) -> Result { + let DataContractCreateTransitionV0 { + data_contract, + identity_nonce, + user_fee_increase, + .. + } = value; + Ok(BumpIdentityNonceActionV0 { + identity_id: data_contract.owner_id(), + identity_nonce: *identity_nonce, + user_fee_increase: *user_fee_increase, + }) + } + + /// try from contract create action + pub fn try_from_contract_create_action( + value: DataContractCreateTransitionActionV0, + ) -> Result { + let DataContractCreateTransitionActionV0 { + data_contract, + identity_nonce, + user_fee_increase, + .. + } = value; + Ok(BumpIdentityNonceActionV0 { + identity_id: data_contract.owner_id(), + identity_nonce, + user_fee_increase, + }) + } + + /// try from contract create + pub fn try_from_borrowed_contract_create_action( + value: &DataContractCreateTransitionActionV0, + ) -> Result { + let DataContractCreateTransitionActionV0 { + data_contract, + identity_nonce, + user_fee_increase, + .. + } = value; + Ok(BumpIdentityNonceActionV0 { + identity_id: data_contract.owner_id(), + identity_nonce: *identity_nonce, + user_fee_increase: *user_fee_increase, + }) + } + /// try from identity credit transfer pub fn try_from_identity_credit_transfer( value: IdentityCreditTransferTransitionV0, diff --git a/packages/rs-platform-version/src/version/drive_abci_versions.rs b/packages/rs-platform-version/src/version/drive_abci_versions.rs index a24ef3b214..902094ddec 100644 --- a/packages/rs-platform-version/src/version/drive_abci_versions.rs +++ b/packages/rs-platform-version/src/version/drive_abci_versions.rs @@ -121,7 +121,7 @@ pub struct DriveAbciValidationDataTriggerVersions { #[derive(Clone, Debug, Default)] pub struct DriveAbciStateTransitionValidationVersion { - pub base_structure: FeatureVersion, + pub basic_structure: OptionalFeatureVersion, pub advanced_structure: OptionalFeatureVersion, pub identity_signatures: OptionalFeatureVersion, pub balance: OptionalFeatureVersion, diff --git a/packages/rs-platform-version/src/version/mocks/v2_test.rs b/packages/rs-platform-version/src/version/mocks/v2_test.rs index 608bdfcc1f..b710380902 100644 --- a/packages/rs-platform-version/src/version/mocks/v2_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v2_test.rs @@ -595,7 +595,7 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { validate_unique_identity_public_key_hashes_in_state: 0, }, identity_create_state_transition: DriveAbciStateTransitionValidationVersion { - base_structure: 0, + basic_structure: Some(0), advanced_structure: None, identity_signatures: Some(0), balance: None, @@ -604,7 +604,7 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { transform_into_action: 0, }, identity_update_state_transition: DriveAbciStateTransitionValidationVersion { - base_structure: 0, + basic_structure: Some(0), advanced_structure: None, identity_signatures: Some(0), balance: None, @@ -613,7 +613,7 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { transform_into_action: 0, }, identity_top_up_state_transition: DriveAbciStateTransitionValidationVersion { - base_structure: 0, + basic_structure: Some(0), advanced_structure: None, identity_signatures: Some(0), balance: None, @@ -623,7 +623,7 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { }, identity_credit_withdrawal_state_transition: DriveAbciStateTransitionValidationVersion { - base_structure: 0, + basic_structure: Some(0), advanced_structure: None, identity_signatures: None, balance: Some(0), @@ -633,7 +633,7 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { }, identity_credit_transfer_state_transition: DriveAbciStateTransitionValidationVersion { - base_structure: 0, + basic_structure: Some(0), advanced_structure: None, identity_signatures: None, balance: Some(0), @@ -642,8 +642,8 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { transform_into_action: 0, }, contract_create_state_transition: DriveAbciStateTransitionValidationVersion { - base_structure: 0, - advanced_structure: None, + basic_structure: Some(0), + advanced_structure: Some(0), identity_signatures: None, balance: None, nonce: Some(0), @@ -651,8 +651,8 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { transform_into_action: 0, }, contract_update_state_transition: DriveAbciStateTransitionValidationVersion { - base_structure: 0, - advanced_structure: None, + basic_structure: None, + advanced_structure: Some(0), identity_signatures: None, balance: None, nonce: Some(0), diff --git a/packages/rs-platform-version/src/version/mocks/v3_test.rs b/packages/rs-platform-version/src/version/mocks/v3_test.rs index b780f4e7de..f423c2400f 100644 --- a/packages/rs-platform-version/src/version/mocks/v3_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v3_test.rs @@ -595,7 +595,7 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { validate_unique_identity_public_key_hashes_in_state: 0, }, identity_create_state_transition: DriveAbciStateTransitionValidationVersion { - base_structure: 0, + basic_structure: Some(0), advanced_structure: None, identity_signatures: Some(0), balance: None, @@ -604,7 +604,7 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { transform_into_action: 0, }, identity_update_state_transition: DriveAbciStateTransitionValidationVersion { - base_structure: 0, + basic_structure: Some(0), advanced_structure: None, identity_signatures: Some(0), balance: None, @@ -613,7 +613,7 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { transform_into_action: 0, }, identity_top_up_state_transition: DriveAbciStateTransitionValidationVersion { - base_structure: 0, + basic_structure: Some(0), advanced_structure: None, identity_signatures: Some(0), balance: None, @@ -623,7 +623,7 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { }, identity_credit_withdrawal_state_transition: DriveAbciStateTransitionValidationVersion { - base_structure: 0, + basic_structure: Some(0), advanced_structure: None, identity_signatures: None, balance: Some(0), @@ -633,7 +633,7 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { }, identity_credit_transfer_state_transition: DriveAbciStateTransitionValidationVersion { - base_structure: 0, + basic_structure: Some(0), advanced_structure: None, identity_signatures: None, balance: Some(0), @@ -642,8 +642,8 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { transform_into_action: 0, }, contract_create_state_transition: DriveAbciStateTransitionValidationVersion { - base_structure: 0, - advanced_structure: None, + basic_structure: Some(0), + advanced_structure: Some(0), identity_signatures: None, balance: None, nonce: Some(0), @@ -651,8 +651,8 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { transform_into_action: 0, }, contract_update_state_transition: DriveAbciStateTransitionValidationVersion { - base_structure: 0, - advanced_structure: None, + basic_structure: None, + advanced_structure: Some(0), identity_signatures: None, balance: None, nonce: Some(0), diff --git a/packages/rs-platform-version/src/version/v1.rs b/packages/rs-platform-version/src/version/v1.rs index 4f1b649e23..0666b2a9c2 100644 --- a/packages/rs-platform-version/src/version/v1.rs +++ b/packages/rs-platform-version/src/version/v1.rs @@ -592,7 +592,7 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { validate_unique_identity_public_key_hashes_in_state: 0, }, identity_create_state_transition: DriveAbciStateTransitionValidationVersion { - base_structure: 0, + basic_structure: Some(0), advanced_structure: None, identity_signatures: Some(0), balance: None, @@ -601,7 +601,7 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { transform_into_action: 0, }, identity_update_state_transition: DriveAbciStateTransitionValidationVersion { - base_structure: 0, + basic_structure: Some(0), advanced_structure: None, identity_signatures: Some(0), balance: None, @@ -610,7 +610,7 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { transform_into_action: 0, }, identity_top_up_state_transition: DriveAbciStateTransitionValidationVersion { - base_structure: 0, + basic_structure: Some(0), advanced_structure: None, identity_signatures: Some(0), balance: None, @@ -620,7 +620,7 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { }, identity_credit_withdrawal_state_transition: DriveAbciStateTransitionValidationVersion { - base_structure: 0, + basic_structure: Some(0), advanced_structure: None, identity_signatures: None, balance: Some(0), @@ -630,7 +630,7 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { }, identity_credit_transfer_state_transition: DriveAbciStateTransitionValidationVersion { - base_structure: 0, + basic_structure: Some(0), advanced_structure: None, identity_signatures: None, balance: Some(0), @@ -639,8 +639,8 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { transform_into_action: 0, }, contract_create_state_transition: DriveAbciStateTransitionValidationVersion { - base_structure: 0, - advanced_structure: None, + basic_structure: Some(0), + advanced_structure: Some(0), identity_signatures: None, balance: None, nonce: Some(0), @@ -648,8 +648,8 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { transform_into_action: 0, }, contract_update_state_transition: DriveAbciStateTransitionValidationVersion { - base_structure: 0, - advanced_structure: None, + basic_structure: None, + advanced_structure: Some(0), identity_signatures: None, balance: None, nonce: Some(0), diff --git a/packages/strategy-tests/src/lib.rs b/packages/strategy-tests/src/lib.rs index 106cea4f5b..79f57f2dc2 100644 --- a/packages/strategy-tests/src/lib.rs +++ b/packages/strategy-tests/src/lib.rs @@ -428,7 +428,7 @@ impl Strategy { updated_contract_data.set_owner_id(contract.owner_id()); } } - + // Update any document transitions that registered to the old contract id for op in self.operations.iter_mut() { if let OperationType::Document(document_op) = &mut op.op_type { @@ -438,7 +438,7 @@ impl Strategy { document_op.document_type = document_type; } } - + DataContractCreateTransition::new_from_data_contract( contract.clone(), *identity_nonce, diff --git a/packages/strategy-tests/src/operations.rs b/packages/strategy-tests/src/operations.rs index 9ad6a08d0e..933fe417ea 100644 --- a/packages/strategy-tests/src/operations.rs +++ b/packages/strategy-tests/src/operations.rs @@ -353,10 +353,7 @@ enum OperationTypeInSerializationFormat { IdentityTopUp, IdentityUpdate(IdentityUpdateOp), IdentityWithdrawal, - ContractCreate( - RandomDocumentTypeParameters, - DocumentTypeCount, - ), + ContractCreate(RandomDocumentTypeParameters, DocumentTypeCount), ContractUpdate(Vec), IdentityTransfer, } @@ -379,12 +376,11 @@ impl PlatformSerializableWithPlatformVersion for OperationType { let op = match self { OperationType::Document(document_op) => { // let's just serialize it to make things easier - let document_op_in_serialization_format = document_op.serialize_consume_to_bytes_with_platform_version(platform_version)?; + let document_op_in_serialization_format = document_op + .serialize_consume_to_bytes_with_platform_version(platform_version)?; OperationTypeInSerializationFormat::Document(document_op_in_serialization_format) } - OperationType::IdentityTopUp => { - OperationTypeInSerializationFormat::IdentityTopUp - } + OperationType::IdentityTopUp => OperationTypeInSerializationFormat::IdentityTopUp, OperationType::IdentityUpdate(identity_update_op) => { OperationTypeInSerializationFormat::IdentityUpdate(identity_update_op) } @@ -396,12 +392,13 @@ impl PlatformSerializableWithPlatformVersion for OperationType { } OperationType::ContractUpdate(update_op) => { // let's just serialize it to make things easier - let contract_op_in_serialization_format = update_op.serialize_consume_to_bytes_with_platform_version(platform_version)?; - OperationTypeInSerializationFormat::ContractUpdate(contract_op_in_serialization_format) - } - OperationType::IdentityTransfer => { - OperationTypeInSerializationFormat::IdentityTransfer + let contract_op_in_serialization_format = + update_op.serialize_consume_to_bytes_with_platform_version(platform_version)?; + OperationTypeInSerializationFormat::ContractUpdate( + contract_op_in_serialization_format, + ) } + OperationType::IdentityTransfer => OperationTypeInSerializationFormat::IdentityTransfer, }; let config = bincode::config::standard() .with_big_endian() @@ -432,12 +429,14 @@ impl PlatformDeserializableWithPotentialValidationFromVersionedStructure for Ope .0; Ok(match operation_type { OperationTypeInSerializationFormat::Document(serialized_op) => { - let document_op = DocumentOp::versioned_deserialize(serialized_op.as_slice(), validate, platform_version)?; + let document_op = DocumentOp::versioned_deserialize( + serialized_op.as_slice(), + validate, + platform_version, + )?; OperationType::Document(document_op) } - OperationTypeInSerializationFormat::IdentityTopUp => { - OperationType::IdentityTopUp - } + OperationTypeInSerializationFormat::IdentityTopUp => OperationType::IdentityTopUp, OperationTypeInSerializationFormat::IdentityUpdate(identity_update_op) => { OperationType::IdentityUpdate(identity_update_op) } @@ -448,12 +447,14 @@ impl PlatformDeserializableWithPotentialValidationFromVersionedStructure for Ope OperationType::ContractCreate(p, c) } OperationTypeInSerializationFormat::ContractUpdate(serialized_op) => { - let update_op = DataContractUpdateOp::versioned_deserialize(serialized_op.as_slice(), validate, platform_version)?; + let update_op = DataContractUpdateOp::versioned_deserialize( + serialized_op.as_slice(), + validate, + platform_version, + )?; OperationType::ContractUpdate(update_op) } - OperationTypeInSerializationFormat::IdentityTransfer => { - OperationType::IdentityTransfer - } + OperationTypeInSerializationFormat::IdentityTransfer => OperationType::IdentityTransfer, }) } } diff --git a/packages/wasm-dpp/src/errors/consensus/state/identity/invalid_identity_contract_nonce_error.rs b/packages/wasm-dpp/src/errors/consensus/state/identity/invalid_identity_contract_nonce_error.rs index 0a28526e2c..ef4f2e9266 100644 --- a/packages/wasm-dpp/src/errors/consensus/state/identity/invalid_identity_contract_nonce_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/state/identity/invalid_identity_contract_nonce_error.rs @@ -26,8 +26,7 @@ impl InvalidIdentityNonceErrorWasm { #[wasm_bindgen(js_name=getCurrentIdentityContractNonce)] pub fn current_identity_contract_nonce(&self) -> Option { - self.inner - .current_identity_contract_nonce().copied() + self.inner.current_identity_contract_nonce().copied() } #[wasm_bindgen(js_name=getSettingIdentityContractNonce)] From e92cc41b0c3b4108c6ecbf9ca8df1eb021962525 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Mon, 11 Mar 2024 16:25:57 +0300 Subject: [PATCH 082/191] chore(dashmate): upgrade to Core 20.1 (#1760) --- .../dashmate/configs/defaults/getLocalConfigFactory.js | 2 +- .../dashmate/configs/defaults/getTestnetConfigFactory.js | 2 +- .../dashmate/configs/getConfigFileMigrationsFactory.js | 9 +++++++++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/packages/dashmate/configs/defaults/getLocalConfigFactory.js b/packages/dashmate/configs/defaults/getLocalConfigFactory.js index 27457d3ba4..88b2870fc9 100644 --- a/packages/dashmate/configs/defaults/getLocalConfigFactory.js +++ b/packages/dashmate/configs/defaults/getLocalConfigFactory.js @@ -25,7 +25,7 @@ export default function getLocalConfigFactory(getBaseConfig) { }, core: { docker: { - image: 'dashpay/dashd:20.1.0-nightly.2024.02.15', + image: 'dashpay/dashd:20.1.0', commandArgs: [], }, p2p: { diff --git a/packages/dashmate/configs/defaults/getTestnetConfigFactory.js b/packages/dashmate/configs/defaults/getTestnetConfigFactory.js index 889db4ef36..9bbd65df22 100644 --- a/packages/dashmate/configs/defaults/getTestnetConfigFactory.js +++ b/packages/dashmate/configs/defaults/getTestnetConfigFactory.js @@ -25,7 +25,7 @@ export default function getTestnetConfigFactory(homeDir, getBaseConfig) { }, core: { docker: { - image: 'dashpay/dashd:20.1.0-nightly.2024.02.15', + image: 'dashpay/dashd:20.1.0', commandArgs: [], }, p2p: { diff --git a/packages/dashmate/configs/getConfigFileMigrationsFactory.js b/packages/dashmate/configs/getConfigFileMigrationsFactory.js index 95e0b6b8dd..e3a91df901 100644 --- a/packages/dashmate/configs/getConfigFileMigrationsFactory.js +++ b/packages/dashmate/configs/getConfigFileMigrationsFactory.js @@ -488,6 +488,15 @@ export default function getConfigFileMigrationsFactory(homeDir, defaultConfigs) return configFile; }, + '1.0.0-dev.8': (configFile) => { + Object.entries(configFile.configs) + .forEach(([name, options]) => { + const defaultConfig = getDefaultConfigByNameOrGroup(name, options.group); + options.core.docker.image = defaultConfig.get('core.docker.image'); + }); + + return configFile; + }, }; } From 7298616a89a6392b6f1d8a3db8e4a48e738b0b73 Mon Sep 17 00:00:00 2001 From: PastaPastaPasta <6443210+PastaPastaPasta@users.noreply.github.com> Date: Tue, 12 Mar 2024 19:38:08 -0500 Subject: [PATCH 083/191] refactor: drop unused includes; use calculate_sign_hash (#1767) --- packages/rs-drive-proof-verifier/src/verify.rs | 2 +- .../src/drive/grove_operations/grove_apply_batch/mod.rs | 1 - .../src/drive/grove_operations/grove_apply_partial_batch/mod.rs | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/rs-drive-proof-verifier/src/verify.rs b/packages/rs-drive-proof-verifier/src/verify.rs index 77b3f8d657..284efb5a89 100644 --- a/packages/rs-drive-proof-verifier/src/verify.rs +++ b/packages/rs-drive-proof-verifier/src/verify.rs @@ -75,7 +75,7 @@ pub(crate) fn verify_tenderdash_proof( // Verify signature let sign_digest = commit - .sign_digest( + .calculate_sign_hash( &chain_id, quorum_type.try_into().expect("quorum type out of range"), &quorum_hash, diff --git a/packages/rs-drive/src/drive/grove_operations/grove_apply_batch/mod.rs b/packages/rs-drive/src/drive/grove_operations/grove_apply_batch/mod.rs index ff7f574279..3b55694140 100644 --- a/packages/rs-drive/src/drive/grove_operations/grove_apply_batch/mod.rs +++ b/packages/rs-drive/src/drive/grove_operations/grove_apply_batch/mod.rs @@ -1,7 +1,6 @@ use crate::drive::batch::GroveDbOpBatch; use crate::drive::Drive; -use crate::error::drive::DriveError; use crate::error::Error; use dpp::version::drive_versions::DriveVersion; use grovedb::TransactionArg; diff --git a/packages/rs-drive/src/drive/grove_operations/grove_apply_partial_batch/mod.rs b/packages/rs-drive/src/drive/grove_operations/grove_apply_partial_batch/mod.rs index 1f135b343d..992d4edfb9 100644 --- a/packages/rs-drive/src/drive/grove_operations/grove_apply_partial_batch/mod.rs +++ b/packages/rs-drive/src/drive/grove_operations/grove_apply_partial_batch/mod.rs @@ -1,7 +1,6 @@ use crate::drive::batch::GroveDbOpBatch; use crate::drive::Drive; -use crate::error::drive::DriveError; use crate::error::Error; use crate::query::GroveError; use dpp::version::drive_versions::DriveVersion; From a2ad3c42adbe87e9bda140bf3b262eb9ef577706 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Thu, 14 Mar 2024 05:46:44 +0300 Subject: [PATCH 084/191] chore!: update tenderdash to 0.14-dev.4 (#1770) --- Cargo.lock | 16 +- packages/dapi-grpc/Cargo.toml | 4 +- .../configs/defaults/getBaseConfigFactory.js | 7 +- .../defaults/getTestnetConfigFactory.js | 7 + .../configs/getConfigFileMigrationsFactory.js | 18 +- .../dashmate/src/config/configJsonSchema.js | 23 +- .../platform/drive/tenderdash/config.toml.dot | 37 +++ packages/rs-dpp/Cargo.toml | 214 +++++++++--------- packages/rs-drive-abci/Cargo.toml | 6 +- .../src/abci/app/execution_result.rs | 17 +- packages/rs-drive-proof-verifier/Cargo.toml | 4 +- packages/rs-drive/Cargo.toml | 2 +- 12 files changed, 216 insertions(+), 139 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9b1a053a2f..782190d96a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -651,9 +651,9 @@ checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" [[package]] name = "chrono" -version = "0.4.32" +version = "0.4.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41daef31d7a747c5c847246f36de49ced6f7403b4cdabc807a97b5cc184cda7a" +checksum = "8eaf5903dcbc0a39312feb77df2ff4c76387d591b9fc7b04a238dcf8bb62639a" dependencies = [ "android-tzdata", "iana-time-zone", @@ -4264,8 +4264,8 @@ dependencies = [ [[package]] name = "tenderdash-abci" -version = "0.14.0-dev.6" -source = "git+https://github.com/dashpay/rs-tenderdash-abci?rev=81d28aa0b15fc0844dfa7f7251f6949f6c6c405a#81d28aa0b15fc0844dfa7f7251f6949f6c6c405a" +version = "0.14.0-dev.8" +source = "git+https://github.com/dashpay/rs-tenderdash-abci#86ba24b8f6d92e6eb24c7d6aff39f9f733d307ba" dependencies = [ "bytes", "futures", @@ -4285,8 +4285,8 @@ dependencies = [ [[package]] name = "tenderdash-proto" -version = "0.14.0-dev.6" -source = "git+https://github.com/dashpay/rs-tenderdash-abci?rev=81d28aa0b15fc0844dfa7f7251f6949f6c6c405a#81d28aa0b15fc0844dfa7f7251f6949f6c6c405a" +version = "0.14.0-dev.8" +source = "git+https://github.com/dashpay/rs-tenderdash-abci#86ba24b8f6d92e6eb24c7d6aff39f9f733d307ba" dependencies = [ "bytes", "chrono", @@ -4305,8 +4305,8 @@ dependencies = [ [[package]] name = "tenderdash-proto-compiler" -version = "0.14.0-dev.6" -source = "git+https://github.com/dashpay/rs-tenderdash-abci?rev=81d28aa0b15fc0844dfa7f7251f6949f6c6c405a#81d28aa0b15fc0844dfa7f7251f6949f6c6c405a" +version = "0.14.0-dev.8" +source = "git+https://github.com/dashpay/rs-tenderdash-abci#86ba24b8f6d92e6eb24c7d6aff39f9f733d307ba" dependencies = [ "fs_extra", "prost-build 0.12.3", diff --git a/packages/dapi-grpc/Cargo.toml b/packages/dapi-grpc/Cargo.toml index a81e737ebc..5117e113e0 100644 --- a/packages/dapi-grpc/Cargo.toml +++ b/packages/dapi-grpc/Cargo.toml @@ -37,8 +37,8 @@ tonic = { version = "0.11", features = [ serde = { version = "1.0.171", optional = true, features = ["derive"] } serde_bytes = { version = "0.11.12", optional = true } serde_json = { version = "1.0", optional = true } -tenderdash-proto = { git = "https://github.com/dashpay/rs-tenderdash-abci", rev = "81d28aa0b15fc0844dfa7f7251f6949f6c6c405a", features = [ - "grpc-server", +tenderdash-proto = { git = "https://github.com/dashpay/rs-tenderdash-abci", version = "0.14.0-dev.8", features = [ + "grpc", ] } dapi-grpc-macros = { path = "../rs-dapi-grpc-macros" } platform-version = { path = "../rs-platform-version" } diff --git a/packages/dashmate/configs/defaults/getBaseConfigFactory.js b/packages/dashmate/configs/defaults/getBaseConfigFactory.js index b64a49ada2..9521b0d715 100644 --- a/packages/dashmate/configs/defaults/getBaseConfigFactory.js +++ b/packages/dashmate/configs/defaults/getBaseConfigFactory.js @@ -206,7 +206,7 @@ export default function getBaseConfigFactory(homeDir) { tenderdash: { mode: 'full', docker: { - image: 'dashpay/tenderdash:experimental', + image: 'dashpay/tenderdash:0.14.0-dev.4', }, p2p: { host: '0.0.0.0', @@ -222,6 +222,7 @@ export default function getBaseConfigFactory(homeDir) { host: '127.0.0.1', port: 26657, maxOpenConnections: 900, + timeoutBroadcastTx: 0, }, pprof: { enabled: false, @@ -236,6 +237,10 @@ export default function getBaseConfigFactory(homeDir) { cacheSize: 15000, size: 5000, maxTxsBytes: 1073741824, + timeoutCheckTx: '0', + txEnqueueTimeout: '0', + txSendRateLimit: 0, + txRecvRateLimit: 0, }, consensus: { createEmptyBlocks: true, diff --git a/packages/dashmate/configs/defaults/getTestnetConfigFactory.js b/packages/dashmate/configs/defaults/getTestnetConfigFactory.js index 9bbd65df22..c885080be7 100644 --- a/packages/dashmate/configs/defaults/getTestnetConfigFactory.js +++ b/packages/dashmate/configs/defaults/getTestnetConfigFactory.js @@ -79,8 +79,15 @@ export default function getTestnetConfigFactory(homeDir, getBaseConfig) { ], port: 36656, }, + mempool: { + timeoutCheckTx: '1s', + txEnqueueTimeout: '10ms', + txSendRateLimit: 10, + txRecvRateLimit: 12, + }, rpc: { port: 36657, + timeoutBroadcastTx: '1s', }, pprof: { port: 36060, diff --git a/packages/dashmate/configs/getConfigFileMigrationsFactory.js b/packages/dashmate/configs/getConfigFileMigrationsFactory.js index e3a91df901..1a6676ec91 100644 --- a/packages/dashmate/configs/getConfigFileMigrationsFactory.js +++ b/packages/dashmate/configs/getConfigFileMigrationsFactory.js @@ -1,6 +1,7 @@ /* eslint-disable no-param-reassign */ import fs from 'fs'; import path from 'path'; +import lodash from 'lodash'; import { NETWORK_LOCAL, @@ -416,7 +417,7 @@ export default function getConfigFileMigrationsFactory(homeDir, defaultConfigs) options.platform.drive.tenderdash.p2p.sendRate = defaultConfig.get('platform.drive.tenderdash.p2p.sendRate'); options.platform.drive.tenderdash.p2p.recvRate = defaultConfig.get('platform.drive.tenderdash.p2p.recvRate'); - options.platform.drive.tenderdash.mempool = base.get('platform.drive.tenderdash.mempool'); + options.platform.drive.tenderdash.mempool = lodash.clone(base.get('platform.drive.tenderdash.mempool')); options.platform.drive.tenderdash.consensus.peer = base.get('platform.drive.tenderdash.consensus.peer'); options.platform.drive.tenderdash.consensus.unsafeOverride = base.get('platform.drive.tenderdash.consensus.unsafeOverride'); }); @@ -497,6 +498,21 @@ export default function getConfigFileMigrationsFactory(homeDir, defaultConfigs) return configFile; }, + '1.0.0-dev.9': (configFile) => { + Object.entries(configFile.configs) + .forEach(([name, options]) => { + options.platform.drive.tenderdash.docker.image = base.get('platform.drive.tenderdash.docker.image'); + + const defaultConfig = getDefaultConfigByNameOrGroup(name, options.group); + options.platform.drive.tenderdash.mempool.timeoutCheckTx = defaultConfig.get('platform.drive.tenderdash.mempool.timeoutCheckTx'); + options.platform.drive.tenderdash.mempool.txEnqueueTimeout = defaultConfig.get('platform.drive.tenderdash.mempool.txEnqueueTimeout'); + options.platform.drive.tenderdash.mempool.txSendRateLimit = defaultConfig.get('platform.drive.tenderdash.mempool.txSendRateLimit'); + options.platform.drive.tenderdash.mempool.txRecvRateLimit = defaultConfig.get('platform.drive.tenderdash.mempool.txRecvRateLimit'); + options.platform.drive.tenderdash.rpc.timeoutBroadcastTx = defaultConfig.get('platform.drive.tenderdash.rpc.timeoutBroadcastTx'); + }); + + return configFile; + }, }; } diff --git a/packages/dashmate/src/config/configJsonSchema.js b/packages/dashmate/src/config/configJsonSchema.js index 4dd6df78f4..e669e05133 100644 --- a/packages/dashmate/src/config/configJsonSchema.js +++ b/packages/dashmate/src/config/configJsonSchema.js @@ -74,7 +74,7 @@ export default { }, duration: { type: 'string', - pattern: '^[0-9]+(\\.[0-9]+)?(ms|m|s|h)$', + pattern: '^0|([0-9]+(\\.[0-9]+)?(ms|m|s|h))$', }, optionalDuration: { type: ['null', 'string'], @@ -642,9 +642,23 @@ export default { type: 'integer', minimum: 0, }, + timeoutCheckTx: { + $ref: '#/definitions/duration', + }, + txEnqueueTimeout: { + $ref: '#/definitions/duration', + }, + txSendRateLimit: { + type: 'integer', + minimum: 0, + }, + txRecvRateLimit: { + type: 'integer', + minimum: 0, + }, }, additionalProperties: false, - required: ['size', 'maxTxsBytes', 'cacheSize'], + required: ['size', 'maxTxsBytes', 'cacheSize', 'timeoutCheckTx', 'txEnqueueTimeout', 'txSendRateLimit', 'txRecvRateLimit'], }, consensus: { type: 'object', @@ -752,8 +766,11 @@ export default { type: 'integer', minimum: 0, }, + timeoutBroadcastTx: { + $ref: '#/definitions/duration', + }, }, - required: ['host', 'port', 'maxOpenConnections'], + required: ['host', 'port', 'maxOpenConnections', 'timeoutBroadcastTx'], additionalProperties: false, }, pprof: { diff --git a/packages/dashmate/templates/platform/drive/tenderdash/config.toml.dot b/packages/dashmate/templates/platform/drive/tenderdash/config.toml.dot index ecec5e9726..8dbf0527fb 100644 --- a/packages/dashmate/templates/platform/drive/tenderdash/config.toml.dot +++ b/packages/dashmate/templates/platform/drive/tenderdash/config.toml.dot @@ -194,6 +194,13 @@ event-log-max-items = 0 # See https://github.com/tendermint/tendermint/issues/3435 timeout-broadcast-tx-commit = "10s" +# Timeout of transaction broadcast to mempool; 0 to disable. +# +# This setting affects timeout of CheckTX operations used before +# adding transaction to the mempool. If the operation takes longer, +# the transaction is rejected with an error. +timeout-broadcast-tx = "{{=it.platform.drive.tenderdash.rpc.timeoutBroadcastTx}}" + # Maximum size of request body, in bytes max-body-bytes = 1000000 @@ -323,6 +330,36 @@ cache-size = {{= it.platform.drive.tenderdash.mempool.cacheSize }} # again in the future. keep-invalid-txs-in-cache = true +# Timeout of check TX operations received from other nodes, using p2p protocol. +# Use 0 to disable. +timeout-check-tx = "{{=it.platform.drive.tenderdash.mempool.timeoutCheckTx}}" + +# TxEnqueueTimeout defines how many nanoseconds new mempool transaction (received +# from other nodes) will wait when internal processing queue is full +# (most likely due to busy CheckTx execution).Once the timeout is reached, the transaction +# will be silently dropped. +# +# If set to 0, the timeout is disabled and transactions will wait indefinitely. +tx-enqueue-timeout = "{{=it.platform.drive.tenderdash.mempool.txEnqueueTimeout}}" + +# tx-send-rate-limit is the rate limit for sending transactions to peers, in transactions per second. +# If zero, the rate limiter is disabled. +# +# Default: 0 +tx-send-rate-limit = {{=it.platform.drive.tenderdash.mempool.txSendRateLimit}} + +# tx-recv-rate-limit is the rate limit for receiving transactions from peers, in transactions per second. +# If zero, the rate limiter is disabled. +# +# Default: 0 +tx-recv-rate-limit = {{=it.platform.drive.tenderdash.mempool.txRecvRateLimit}} + +# tx-recv-rate-punish-peer set to true means that when tx-recv-rate-limit is reached, the peer will be punished +# (disconnected). If set to false, the peer will be throttled (messages will be dropped). +# +# Default: false +tx-recv-rate-punish-peer = false + # Maximum size of a single transaction. # NOTE: the max size of a tx transmitted over the network is {max-tx-bytes}. max-tx-bytes = 1048576 diff --git a/packages/rs-dpp/Cargo.toml b/packages/rs-dpp/Cargo.toml index 6d2448fb8e..5af10dcb76 100644 --- a/packages/rs-dpp/Cargo.toml +++ b/packages/rs-dpp/Cargo.toml @@ -4,11 +4,11 @@ version = "1.0.0-dev.7" edition = "2021" rust-version = "1.76" authors = [ - "Anton Suprunchuk ", - "Samuel Westrich ", - "Ivan Shumkov ", - "Djavid Gabibiyan ", - "Igor Markin ", + "Anton Suprunchuk ", + "Samuel Westrich ", + "Ivan Shumkov ", + "Djavid Gabibiyan ", + "Igor Markin ", ] [dependencies] @@ -18,17 +18,17 @@ base64 = "0.20.0" bls-signatures = { git = "https://github.com/dashpay/bls-signatures", tag = "v1.3.1" } bs58 = "0.4.0" byteorder = { version = "1.4" } -chrono = { version = "0.4.20", default-features = false, features = [ - "wasmbind", - "clock", +chrono = { version = "0.4.35", default-features = false, features = [ + "wasmbind", + "clock", ] } ciborium = { git = "https://github.com/qrayven/ciborium", branch = "feat-ser-null-as-undefined", optional = true } dashcore = { git = "https://github.com/dashpay/rust-dashcore", features = [ - "std", - "secp-recovery", - "rand", - "signer", - "serde", + "std", + "secp-recovery", + "rand", + "signer", + "serde", ], default-features = false, branch = "master" } env_logger = { version = "0.9" } getrandom = { version = "0.2", features = ["js"] } @@ -38,7 +38,7 @@ itertools = { version = "0.10" } json-patch = "0.2.6" jsonptr = "0.1.5" jsonschema = { git = "https://github.com/fominok/jsonschema-rs", branch = "feat-unevaluated-properties", default-features = false, features = [ - "draft202012", + "draft202012", ] } lazy_static = { version = "1.4" } log = { version = "0.4.6" } @@ -73,100 +73,100 @@ dpp = { path = ".", features = ["all_features_without_client"] } [features] default = [ - "json-object", - "platform-value", - "system_contracts", - "state-transitions", - "extended-document", + "json-object", + "platform-value", + "system_contracts", + "state-transitions", + "extended-document", ] all_features = [ - "json-object", - "platform-value", - "system_contracts", - "state-transitions", - "extended-document", - "cbor", - "validation", - "identity-hashing", - "identity-serialization", - "ciborium", - "document-serde-conversion", - "document-value-conversion", - "document-json-conversion", - "document-cbor-conversion", - "data-contract-serde-conversion", - "data-contract-value-conversion", - "data-contract-json-conversion", - "data-contract-cbor-conversion", - "identity-serde-conversion", - "identity-value-conversion", - "identity-json-conversion", - "identity-cbor-conversion", - "state-transition-serde-conversion", - "state-transition-value-conversion", - "state-transition-json-conversion", - "state-transition-validation", - "state-transition-signing", - "state-transitions", - "factories", - "fixtures-and-mocks", - "random-public-keys", - "random-identities", - "random-documents", - "random-document-types", - "fee-distribution", - "client", + "json-object", + "platform-value", + "system_contracts", + "state-transitions", + "extended-document", + "cbor", + "validation", + "identity-hashing", + "identity-serialization", + "ciborium", + "document-serde-conversion", + "document-value-conversion", + "document-json-conversion", + "document-cbor-conversion", + "data-contract-serde-conversion", + "data-contract-value-conversion", + "data-contract-json-conversion", + "data-contract-cbor-conversion", + "identity-serde-conversion", + "identity-value-conversion", + "identity-json-conversion", + "identity-cbor-conversion", + "state-transition-serde-conversion", + "state-transition-value-conversion", + "state-transition-json-conversion", + "state-transition-validation", + "state-transition-signing", + "state-transitions", + "factories", + "fixtures-and-mocks", + "random-public-keys", + "random-identities", + "random-documents", + "random-document-types", + "fee-distribution", + "client", ] all_features_without_client = [ - "json-object", - "platform-value", - "system_contracts", - "state-transitions", - "extended-document", - "cbor", - "validation", - "identity-hashing", - "identity-serialization", - "ciborium", - "document-serde-conversion", - "document-value-conversion", - "document-json-conversion", - "document-cbor-conversion", - "data-contract-serde-conversion", - "data-contract-value-conversion", - "data-contract-json-conversion", - "data-contract-cbor-conversion", - "identity-serde-conversion", - "identity-value-conversion", - "identity-json-conversion", - "identity-cbor-conversion", - "state-transition-serde-conversion", - "state-transition-value-conversion", - "state-transition-json-conversion", - "state-transition-validation", - "state-transition-signing", - "state-transitions", - "factories", - "fixtures-and-mocks", - "random-public-keys", - "random-identities", - "random-documents", - "random-document-types", - "fee-distribution", + "json-object", + "platform-value", + "system_contracts", + "state-transitions", + "extended-document", + "cbor", + "validation", + "identity-hashing", + "identity-serialization", + "ciborium", + "document-serde-conversion", + "document-value-conversion", + "document-json-conversion", + "document-cbor-conversion", + "data-contract-serde-conversion", + "data-contract-value-conversion", + "data-contract-json-conversion", + "data-contract-cbor-conversion", + "identity-serde-conversion", + "identity-value-conversion", + "identity-json-conversion", + "identity-cbor-conversion", + "state-transition-serde-conversion", + "state-transition-value-conversion", + "state-transition-json-conversion", + "state-transition-validation", + "state-transition-signing", + "state-transitions", + "factories", + "fixtures-and-mocks", + "random-public-keys", + "random-identities", + "random-documents", + "random-document-types", + "fee-distribution", ] drive = ["state-transitions", "fee-distribution", "system_contracts"] abci = [ - "state-transitions", - "state-transition-validation", - "validation", - "random-public-keys", - "identity-serialization", + "state-transitions", + "state-transition-validation", + "validation", + "random-public-keys", + "identity-serialization", ] cbor = ["ciborium"] validation = [ - "platform-value", - "document-value-conversion", - "state-transition-serde-conversion", + "platform-value", + "document-value-conversion", + "state-transition-serde-conversion", ] json-object = ["platform-value"] platform-value = [] @@ -188,16 +188,16 @@ identity-json-conversion = ["identity-value-conversion"] identity-cbor-conversion = ["identity-value-conversion", "cbor"] state-transition-serde-conversion = ["data-contract-serde-conversion"] state-transition-value-conversion = [ - "platform-value", - "state-transition-serde-conversion", - "data-contract-value-conversion", + "platform-value", + "state-transition-serde-conversion", + "data-contract-value-conversion", ] state-transition-json-conversion = [ - "json-object", - "data-contract-json-conversion", + "json-object", + "data-contract-json-conversion", ] state-transition-validation = ["state-transitions", "message-signature-verification"] -state-transition-signing = ["state-transitions", "message-signing","state-transition-validation"] +state-transition-signing = ["state-transitions", "message-signing", "state-transition-validation"] state-transitions = [] system_contracts = ["factories"] fixtures-and-mocks = ["system_contracts"] @@ -207,9 +207,9 @@ random-documents = [] random-document-types = [] fee-distribution = [] extended-document = [ - "document-serde-conversion", - "data-contract-serde-conversion", - "data-contract-json-conversion", + "document-serde-conversion", + "data-contract-serde-conversion", + "data-contract-json-conversion", ] factories = [] diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index e58d7534db..1756746b9f 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -16,7 +16,7 @@ license = "MIT" arc-swap = "1.7.0" bincode = { version = "2.0.0-rc.3", features = ["serde"] } ciborium = { git = "https://github.com/qrayven/ciborium", branch = "feat-ser-null-as-undefined" } -chrono = "0.4.20" +chrono = "0.4.35" serde = { version = "1.0.152", features = ["derive"] } serde_json = { version = "1.0", features = ["preserve_order"] } serde_with = { version = "3.1.0", features = [ @@ -55,8 +55,8 @@ tracing-subscriber = { version = "0.3.16", default-features = false, features = "tracing-log", ], optional = false } atty = { version = "0.2.14", optional = false } -tenderdash-abci = { git = "https://github.com/dashpay/rs-tenderdash-abci", rev = "81d28aa0b15fc0844dfa7f7251f6949f6c6c405a", features = [ - "grpc-server", +tenderdash-abci = { git = "https://github.com/dashpay/rs-tenderdash-abci", version = "0.14.0-dev.8", features = [ + "grpc", ] } lazy_static = "1.4.0" itertools = { version = "0.10.5" } diff --git a/packages/rs-drive-abci/src/abci/app/execution_result.rs b/packages/rs-drive-abci/src/abci/app/execution_result.rs index 94e12f05f3..7f06475c21 100644 --- a/packages/rs-drive-abci/src/abci/app/execution_result.rs +++ b/packages/rs-drive-abci/src/abci/app/execution_result.rs @@ -15,19 +15,14 @@ impl TryIntoPlatformVersioned for StateTransitionExecutionResult { platform_version: &PlatformVersion, ) -> Result { let response = match self { - StateTransitionExecutionResult::SuccessfulExecution(estimated_fees, actual_fees) => { - ExecTxResult { - code: 0, - gas_wanted: estimated_fees.total_base_fee() as SignedCredits, - gas_used: actual_fees.total_base_fee() as SignedCredits, - ..Default::default() - } - } + StateTransitionExecutionResult::SuccessfulExecution(_, actual_fees) => ExecTxResult { + code: 0, + gas_used: actual_fees.total_base_fee() as SignedCredits, + ..Default::default() + }, StateTransitionExecutionResult::UnpaidConsensusError(error) => ExecTxResult { code: HandlerError::from(&error).code(), info: error.response_info_for_version(platform_version)?, - // TODO: We need to pass processing fees as well - gas_wanted: 0, gas_used: 0, ..Default::default() }, @@ -35,8 +30,6 @@ impl TryIntoPlatformVersioned for StateTransitionExecutionResult { ExecTxResult { code: HandlerError::from(&error).code(), info: error.response_info_for_version(platform_version)?, - // TODO: Improve gas wanted - gas_wanted: actual_fees.total_base_fee() as SignedCredits, gas_used: actual_fees.total_base_fee() as SignedCredits, ..Default::default() } diff --git a/packages/rs-drive-proof-verifier/Cargo.toml b/packages/rs-drive-proof-verifier/Cargo.toml index abfeb245fe..0a581742d3 100644 --- a/packages/rs-drive-proof-verifier/Cargo.toml +++ b/packages/rs-drive-proof-verifier/Cargo.toml @@ -20,7 +20,9 @@ drive = { path = "../rs-drive", default-features = false, features = [ "verify", ] } dpp = { path = "../rs-dpp" } -tenderdash-abci = { git = "https://github.com/dashpay/rs-tenderdash-abci", rev = "81d28aa0b15fc0844dfa7f7251f6949f6c6c405a" } +tenderdash-abci = { git = "https://github.com/dashpay/rs-tenderdash-abci", version = "0.14.0-dev.8", features = [ + "grpc", +] } tracing = { version = "0.1.37" } serde = { version = "1.0.171", default-features = false, optional = true } serde_json = { version = "1.0.103", features = [ diff --git a/packages/rs-drive/Cargo.toml b/packages/rs-drive/Cargo.toml index abaab44b39..65003b373e 100644 --- a/packages/rs-drive/Cargo.toml +++ b/packages/rs-drive/Cargo.toml @@ -38,7 +38,7 @@ tempfile = { version = "3", optional = true } serde_json = { version = "1.0", features = ["preserve_order"], optional = true } enum-map = { version = "2.0.3", optional = true } intmap = { version = "2.0.0", features = ["serde"], optional = true } -chrono = { version = "0.4.20", optional = true } +chrono = { version = "0.4.35", optional = true } itertools = { version = "0.11.0", optional = true } grovedb = { git = "https://github.com/dashpay/grovedb", rev = "d007bed7544bf837bdf155e696a530b90d5f82e5", optional = true } grovedb-costs = { git = "https://github.com/dashpay/grovedb", rev = "d007bed7544bf837bdf155e696a530b90d5f82e5", optional = true } From 6cb2068a94e843df85e04e818c329a17f63b9a2e Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Thu, 14 Mar 2024 12:47:17 +0700 Subject: [PATCH 085/191] fix(platform)!: data contract validation improvements (#1768) --- .../createIdentityCreateTransition.ts | 1 + .../createIdentityFixtureInAccount.ts | 1 + .../rs-dpp/src/data_contract/accessors/mod.rs | 7 +- .../src/data_contract/accessors/v0/mod.rs | 7 +- .../methods/validate_config_update/mod.rs | 2 +- .../methods/validate_config_update/v0/mod.rs | 16 + .../mod.rs | 2 +- .../class_methods/try_from_schema/v0/mod.rs | 173 ++++--- .../data_contract/document_type/index/mod.rs | 47 +- .../document_type/methods/mod.rs | 1 + .../methods/serialize_value_for_key/v0/mod.rs | 4 +- .../methods/validate_update/mod.rs | 28 ++ .../methods/validate_update/v0/mod.rs | 107 ++++ .../document_type/property/array.rs | 2 +- .../document_type/property/mod.rs | 179 ++++--- .../schema/enrich_with_base_schema/mod.rs | 39 +- .../schema/enrich_with_base_schema/v0/mod.rs | 35 +- .../data_contract/document_type/schema/mod.rs | 1 - .../schema/validate_max_depth/v0/mod.rs | 6 +- .../src/data_contract/errors/contract.rs | 68 ++- .../errors/invalid_data_contract_error.rs | 34 -- .../data_contract/errors/json_schema_error.rs | 7 +- .../rs-dpp/src/data_contract/errors/mod.rs | 4 - .../src/data_contract/errors/structure.rs | 23 - .../methods/validation/v0/mod.rs | 5 +- .../keys_for_document_type.rs | 23 +- .../src/data_contract/v0/accessors/mod.rs | 18 +- .../get_raw_for_contract/v0/mod.rs | 2 +- .../src/document/extended_document/v0/mod.rs | 1 + .../extended_document/v0/serialize.rs | 10 +- .../deserialize/v0/mod.rs | 3 +- .../platform_serialization_conversion/mod.rs | 30 ++ .../v0/mod.rs | 15 +- .../rs-dpp/src/document/v0/cbor_conversion.rs | 8 +- packages/rs-dpp/src/document/v0/serialize.rs | 88 +++- .../src/errors/consensus/basic/basic_error.rs | 18 +- ...t_invalid_index_definition_update_error.rs | 2 +- ...d_document_type_required_security_level.rs | 60 +++ .../consensus/basic/data_contract/mod.rs | 7 + .../unknown_security_level_error.rs | 47 ++ .../unknown_storage_key_requirements_error.rs | 47 ++ .../consensus/basic/decode/decoding_error.rs | 44 ++ .../src/errors/consensus/basic/decode/mod.rs | 2 + .../src/errors/consensus/basic/value_error.rs | 8 +- packages/rs-dpp/src/errors/consensus/codes.rs | 28 +- .../document_type_update_error.rs | 54 ++ .../consensus/state/data_contract/mod.rs | 1 + .../src/errors/consensus/state/state_error.rs | 4 + packages/rs-dpp/src/errors/protocol_error.rs | 17 +- .../identity_public_key/security_level.rs | 31 +- packages/rs-dpp/src/util/json_schema.rs | 13 +- packages/rs-drive-abci/src/error/mod.rs | 7 + .../src/execution/check_tx/v0/mod.rs | 466 +++++++++++++++++- .../check_tx_verification/v0/mod.rs | 95 ++-- .../state_transition/processor/v0/mod.rs | 203 +++++--- .../advanced_structure/mod.rs | 36 -- .../advanced_structure/v0/mod.rs | 46 -- .../data_contract_create/mod.rs | 3 +- .../data_contract_create/state/v0/mod.rs | 39 +- .../advanced_structure/mod.rs | 36 -- .../advanced_structure/v0/mod.rs | 42 -- .../data_contract_update/mod.rs | 5 +- .../data_contract_update/state/mod.rs | 11 +- .../data_contract_update/state/v0/mod.rs | 362 +++++++++----- .../state_transitions/documents_batch/mod.rs | 8 +- .../state_transition/state_transitions/mod.rs | 12 + packages/rs-drive-abci/src/mimic/mod.rs | 7 +- .../tests/strategy_tests/failures.rs | 12 +- .../tests/strategy_tests/main.rs | 4 +- .../tests/strategy_tests/strategy.rs | 22 +- .../verify_state_transitions.rs | 7 +- .../drive/batch/drive_op_batch/document.rs | 25 +- .../data_contract_create_transition.rs | 16 +- .../grove_operations/grove_apply_batch/mod.rs | 1 - .../grove_apply_batch_with_add_costs/mod.rs | 6 +- .../grove_apply_partial_batch/mod.rs | 1 - .../mod.rs | 6 +- .../drive/identity/contract_info/keys/mod.rs | 4 +- packages/rs-drive/src/error/mod.rs | 7 + .../data_contract_create/transformer.rs | 14 +- .../data_contract_create/v0/transformer.rs | 4 +- .../data_contract_update/transformer.rs | 38 +- .../data_contract_update/v0/transformer.rs | 27 +- .../src/converter/serde_json.rs | 12 +- .../src/version/dpp_versions.rs | 6 + .../src/version/mocks/v2_test.rs | 10 +- .../src/version/mocks/v3_test.rs | 14 +- .../rs-platform-version/src/version/v1.rs | 14 +- .../rs-sdk/src/platform/document_query.rs | 8 +- .../src/data_contract/data_contract.rs | 7 +- .../wasm-dpp/src/data_contract/errors/mod.rs | 9 - packages/wasm-dpp/src/document/mod.rs | 3 + .../wasm-dpp/src/errors/protocol_error.rs | 8 - .../src/identity/identity_public_key/mod.rs | 3 +- .../identity_public_key_transitions.rs | 3 +- .../test/unit/identity/Identity.spec.js | 4 +- .../unit/identity/IdentityPublicKey.spec.js | 6 +- 97 files changed, 2097 insertions(+), 962 deletions(-) create mode 100644 packages/rs-dpp/src/data_contract/document_type/methods/validate_update/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/document_type/methods/validate_update/v0/mod.rs delete mode 100644 packages/rs-dpp/src/data_contract/errors/invalid_data_contract_error.rs delete mode 100644 packages/rs-dpp/src/data_contract/errors/structure.rs create mode 100644 packages/rs-dpp/src/errors/consensus/basic/data_contract/invalid_document_type_required_security_level.rs create mode 100644 packages/rs-dpp/src/errors/consensus/basic/data_contract/unknown_security_level_error.rs create mode 100644 packages/rs-dpp/src/errors/consensus/basic/data_contract/unknown_storage_key_requirements_error.rs create mode 100644 packages/rs-dpp/src/errors/consensus/basic/decode/decoding_error.rs create mode 100644 packages/rs-dpp/src/errors/consensus/state/data_contract/document_type_update_error.rs delete mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/advanced_structure/mod.rs delete mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/advanced_structure/v0/mod.rs delete mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/advanced_structure/mod.rs delete mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/advanced_structure/v0/mod.rs diff --git a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/internal/createIdentityCreateTransition.ts b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/internal/createIdentityCreateTransition.ts index 40aaa6ff7a..d26c80a52a 100644 --- a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/internal/createIdentityCreateTransition.ts +++ b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/internal/createIdentityCreateTransition.ts @@ -40,6 +40,7 @@ export async function createIdentityCreateTransition( const keyOne = new IdentityPublicKey(1); keyOne.setData(identityMasterPublicKey.toBuffer()); + keyOne.setSecurityLevel(IdentityPublicKey.SECURITY_LEVELS.MASTER); const keyTwo = new IdentityPublicKey(1); keyTwo.setId(1); diff --git a/packages/js-dash-sdk/src/test/fixtures/createIdentityFixtureInAccount.ts b/packages/js-dash-sdk/src/test/fixtures/createIdentityFixtureInAccount.ts index 062cb2cc73..986e6e10d7 100644 --- a/packages/js-dash-sdk/src/test/fixtures/createIdentityFixtureInAccount.ts +++ b/packages/js-dash-sdk/src/test/fixtures/createIdentityFixtureInAccount.ts @@ -16,6 +16,7 @@ export async function createIdentityFixtureInAccount(account) { const publicKeyOne = new IdentityPublicKey(1); publicKeyOne.setData(identityMasterPrivateKey.toPublicKey().toBuffer()); + publicKeyOne.setSecurityLevel(IdentityPublicKey.SECURITY_LEVELS.MASTER); const publicKeyTwo = new IdentityPublicKey(1); publicKeyTwo.setId(1); diff --git a/packages/rs-dpp/src/data_contract/accessors/mod.rs b/packages/rs-dpp/src/data_contract/accessors/mod.rs index 6d295c7a70..b595839588 100644 --- a/packages/rs-dpp/src/data_contract/accessors/mod.rs +++ b/packages/rs-dpp/src/data_contract/accessors/mod.rs @@ -4,9 +4,10 @@ use crate::data_contract::document_type::{DocumentType, DocumentTypeRef}; use crate::data_contract::DocumentName; use crate::metadata::Metadata; use crate::prelude::DataContract; -use crate::ProtocolError; + use platform_value::Identifier; +use crate::data_contract::errors::DataContractError; use std::collections::BTreeMap; pub mod v0; @@ -36,13 +37,13 @@ impl DataContractV0Getters for DataContract { } } - fn document_type_cloned_for_name(&self, name: &str) -> Result { + fn document_type_cloned_for_name(&self, name: &str) -> Result { match self { DataContract::V0(v0) => v0.document_type_cloned_for_name(name), } } - fn document_type_for_name(&self, name: &str) -> Result { + fn document_type_for_name(&self, name: &str) -> Result { match self { DataContract::V0(v0) => v0.document_type_for_name(name), } diff --git a/packages/rs-dpp/src/data_contract/accessors/v0/mod.rs b/packages/rs-dpp/src/data_contract/accessors/v0/mod.rs index b0809d41e5..aa03cf94f2 100644 --- a/packages/rs-dpp/src/data_contract/accessors/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/accessors/v0/mod.rs @@ -1,8 +1,9 @@ use crate::data_contract::config::DataContractConfig; use crate::data_contract::document_type::{DocumentType, DocumentTypeRef}; +use crate::data_contract::errors::DataContractError; use crate::data_contract::DocumentName; use crate::metadata::Metadata; -use crate::ProtocolError; + use platform_value::Identifier; use std::collections::BTreeMap; @@ -17,10 +18,10 @@ pub trait DataContractV0Getters { /// Returns the identifier of the contract owner. fn owner_id(&self) -> Identifier; - fn document_type_cloned_for_name(&self, name: &str) -> Result; + fn document_type_cloned_for_name(&self, name: &str) -> Result; /// Returns the document type for the given document name. - fn document_type_for_name(&self, name: &str) -> Result; + fn document_type_for_name(&self, name: &str) -> Result; fn document_type_optional_for_name(&self, name: &str) -> Option; fn document_type_cloned_optional_for_name(&self, name: &str) -> Option; diff --git a/packages/rs-dpp/src/data_contract/config/methods/validate_config_update/mod.rs b/packages/rs-dpp/src/data_contract/config/methods/validate_config_update/mod.rs index 9372a89271..be4557d724 100644 --- a/packages/rs-dpp/src/data_contract/config/methods/validate_config_update/mod.rs +++ b/packages/rs-dpp/src/data_contract/config/methods/validate_config_update/mod.rs @@ -21,7 +21,7 @@ impl DataContractConfig { { 0 => Ok(self.validate_config_update_v0(new_config, contract_id)), version => Err(ProtocolError::UnknownVersionMismatch { - method: "DataContractConfig::from_value".to_string(), + method: "validate_config_update".to_string(), known_versions: vec![0], received: version, }), diff --git a/packages/rs-dpp/src/data_contract/config/methods/validate_config_update/v0/mod.rs b/packages/rs-dpp/src/data_contract/config/methods/validate_config_update/v0/mod.rs index 9087683dcb..e0217a46d8 100644 --- a/packages/rs-dpp/src/data_contract/config/methods/validate_config_update/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/config/methods/validate_config_update/v0/mod.rs @@ -11,12 +11,16 @@ impl DataContractConfig { new_config: &DataContractConfig, contract_id: Identifier, ) -> SimpleConsensusValidationResult { + // Validate: Old contract is not read_only + if self.readonly() { return SimpleConsensusValidationResult::new_with_error( DataContractIsReadonlyError::new(contract_id).into(), ); } + // Validate: New contract is not read_only + if new_config.readonly() { return SimpleConsensusValidationResult::new_with_error( DataContractConfigUpdateError::new( @@ -27,6 +31,8 @@ impl DataContractConfig { ); } + // Validate: Keeps history did not change + if new_config.keeps_history() != self.keeps_history() { return SimpleConsensusValidationResult::new_with_error( DataContractConfigUpdateError::new( @@ -41,6 +47,8 @@ impl DataContractConfig { ); } + // Validate: Can be deleted did not change + if new_config.can_be_deleted() != self.can_be_deleted() { return SimpleConsensusValidationResult::new_with_error( DataContractConfigUpdateError::new( @@ -55,6 +63,8 @@ impl DataContractConfig { ); } + // Validate: Documents keep history did not change + if new_config.documents_keep_history_contract_default() != self.documents_keep_history_contract_default() { @@ -67,6 +77,8 @@ impl DataContractConfig { ); } + // Validate: Documents mutable contract default did not change + if new_config.documents_mutable_contract_default() != self.documents_mutable_contract_default() { @@ -79,6 +91,8 @@ impl DataContractConfig { ); } + // Validate: Requires identity encryption bounded key did not change + if new_config.requires_identity_encryption_bounded_key() != self.requires_identity_encryption_bounded_key() { @@ -91,6 +105,8 @@ impl DataContractConfig { ); } + // Validate: Requires identity decryption bounded key did not change + if new_config.requires_identity_decryption_bounded_key() != self.requires_identity_decryption_bounded_key() { diff --git a/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/mod.rs b/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/mod.rs index e35381dae1..c12066f6c5 100644 --- a/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/mod.rs @@ -82,7 +82,7 @@ mod test { false, false, false, - &crate::version::PlatformVersion::latest(), + crate::version::PlatformVersion::latest(), ); match result { diff --git a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs index 3bb46da014..5bdf1b9880 100644 --- a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs @@ -24,13 +24,13 @@ use std::collections::HashSet; use std::collections::{BTreeMap, BTreeSet}; use std::convert::TryInto; +use crate::consensus::basic::data_contract::InvalidDocumentTypeRequiredSecurityLevelError; #[cfg(feature = "validation")] use crate::consensus::basic::document::MissingPositionsInDocumentTypePropertiesError; #[cfg(feature = "validation")] use crate::consensus::basic::BasicError; -use crate::data_contract::document_type::schema::enrich_with_base_schema; use crate::data_contract::document_type::{property_names, DocumentType}; -use crate::data_contract::errors::{DataContractError, StructureError}; +use crate::data_contract::errors::DataContractError; use crate::data_contract::storage_requirements::keys_for_document_type::StorageKeyRequirements; use crate::identity::SecurityLevel; use crate::util::json_schema::resolve_uri; @@ -50,6 +50,36 @@ const MAX_INDEXED_STRING_PROPERTY_LENGTH: u16 = 63; const MAX_INDEXED_BYTE_ARRAY_PROPERTY_LENGTH: u16 = 255; const MAX_INDEXED_ARRAY_ITEMS: usize = 1024; +#[inline] +fn consensus_or_protocol_data_contract_error( + data_contract_error: DataContractError, +) -> ProtocolError { + #[cfg(feature = "validation")] + { + ProtocolError::ConsensusError( + ConsensusError::BasicError(BasicError::ContractError(data_contract_error)).into(), + ) + } + #[cfg(not(feature = "validation"))] + { + ProtocolError::DataContractError(data_contract_error) + } +} + +#[inline] +fn consensus_or_protocol_value_error(platform_value_error: platform_value::Error) -> ProtocolError { + #[cfg(feature = "validation")] + { + ProtocolError::ConsensusError( + ConsensusError::BasicError(BasicError::ValueError(platform_value_error.into())).into(), + ) + } + #[cfg(not(feature = "validation"))] + { + ProtocolError::ValueError(platform_value_error.into()) + } +} + impl DocumentTypeV0 { // TODO: Split into multiple functions pub(crate) fn try_from_schema_v0( @@ -63,7 +93,7 @@ impl DocumentTypeV0 { platform_version: &PlatformVersion, ) -> Result { // Create a full root JSON Schema from shorten contract document type schema - let root_schema = enrich_with_base_schema( + let root_schema = DocumentType::enrich_with_base_schema( schema.clone(), schema_defs.map(|defs| Value::from(defs.clone())), platform_version, @@ -84,19 +114,21 @@ impl DocumentTypeV0 { #[cfg(feature = "validation")] if validate { // Make sure JSON Schema is compilable - let root_json_schema = root_schema - .try_to_validating_json() - .map_err(ProtocolError::ValueError)?; + let root_json_schema = root_schema.try_to_validating_json().map_err(|e| { + ProtocolError::ConsensusError( + ConsensusError::BasicError(BasicError::ValueError(e.into())).into(), + ) + })?; json_schema_validator.compile(&root_json_schema, platform_version)?; // Validate against JSON Schema DOCUMENT_META_SCHEMA_V0 - .validate( - &root_schema - .try_to_validating_json() - .map_err(ProtocolError::ValueError)?, - ) + .validate(&root_schema.try_to_validating_json().map_err(|e| { + ProtocolError::ConsensusError( + ConsensusError::BasicError(BasicError::ValueError(e.into())).into(), + ) + })?) .map_err(|mut errs| ConsensusError::from(errs.next().unwrap()))?; // Validate document schema depth @@ -127,23 +159,24 @@ impl DocumentTypeV0 { } } + // This has already been validated, but we leave the map_err here for consistency let schema_map = schema.to_map().map_err(|err| { - ProtocolError::DataContractError(DataContractError::InvalidContractStructure(format!( - "document schema must be an object: {err}" - ))) + consensus_or_protocol_data_contract_error(DataContractError::InvalidContractStructure( + format!("document schema must be an object: {err}"), + )) })?; // TODO: These properties aren't defined in JSON meta schema // Do documents of this type keep history? (Overrides contract value) let documents_keep_history: bool = Value::inner_optional_bool_value(schema_map, "documentsKeepHistory") - .map_err(ProtocolError::ValueError)? + .map_err(consensus_or_protocol_value_error)? .unwrap_or(default_keeps_history); // Are documents of this type mutable? (Overrides contract value) let documents_mutable: bool = Value::inner_optional_bool_value(schema_map, "documentsMutable") - .map_err(ProtocolError::ValueError)? + .map_err(consensus_or_protocol_value_error)? .unwrap_or(default_mutability); // Extract the properties @@ -151,7 +184,8 @@ impl DocumentTypeV0 { schema_map, property_names::PROPERTIES, property_names::POSITION, - )? + ) + .map_err(consensus_or_protocol_value_error)? .unwrap_or_default(); #[cfg(feature = "validation")] @@ -195,7 +229,8 @@ impl DocumentTypeV0 { property_key.clone(), property_value, &root_schema, - )?; + ) + .map_err(consensus_or_protocol_data_contract_error)?; insert_values_nested( &mut document_properties, @@ -203,12 +238,14 @@ impl DocumentTypeV0 { property_key, property_value, &root_schema, - )?; + ) + .map_err(consensus_or_protocol_data_contract_error)?; } // Initialize indices let index_values = - Value::inner_optional_array_slice_value(schema_map, property_names::INDICES)?; + Value::inner_optional_array_slice_value(schema_map, property_names::INDICES) + .map_err(consensus_or_protocol_value_error)?; #[cfg(feature = "validation")] let mut index_names: HashSet = HashSet::new(); @@ -221,14 +258,11 @@ impl DocumentTypeV0 { .iter() .map(|index_value| { let index: Index = index_value - .as_map() - .ok_or(ProtocolError::DataContractError( - DataContractError::InvalidContractStructure( - "index definition is not a map as expected".to_string(), - ), - ))? + .to_map() + .map_err(consensus_or_protocol_value_error)? .as_slice() - .try_into()?; + .try_into() + .map_err(consensus_or_protocol_data_contract_error)?; #[cfg(feature = "validation")] if validate { @@ -370,18 +404,35 @@ impl DocumentTypeV0 { )?; let security_level_requirement = schema - .get_optional_integer::(property_names::SECURITY_LEVEL_REQUIREMENT)? + .get_optional_integer::(property_names::SECURITY_LEVEL_REQUIREMENT) + .map_err(consensus_or_protocol_value_error)? .map(SecurityLevel::try_from) .transpose()? .unwrap_or(SecurityLevel::HIGH); + #[cfg(feature = "validation")] + if validate && security_level_requirement == SecurityLevel::MASTER { + return Err(ConsensusError::BasicError( + BasicError::InvalidDocumentTypeRequiredSecurityLevelError( + InvalidDocumentTypeRequiredSecurityLevelError::new( + security_level_requirement, + data_contract_id, + name.to_string(), + ), + ), + ) + .into()); + } + let requires_identity_encryption_bounded_key = schema - .get_optional_integer::(property_names::REQUIRES_IDENTITY_ENCRYPTION_BOUNDED_KEY)? + .get_optional_integer::(property_names::REQUIRES_IDENTITY_ENCRYPTION_BOUNDED_KEY) + .map_err(consensus_or_protocol_value_error)? .map(StorageKeyRequirements::try_from) .transpose()?; let requires_identity_decryption_bounded_key = schema - .get_optional_integer::(property_names::REQUIRES_IDENTITY_DECRYPTION_BOUNDED_KEY)? + .get_optional_integer::(property_names::REQUIRES_IDENTITY_DECRYPTION_BOUNDED_KEY) + .map_err(consensus_or_protocol_value_error)? .map(StorageKeyRequirements::try_from) .transpose()?; @@ -414,7 +465,7 @@ fn insert_values( property_key: String, property_value: &Value, root_schema: &Value, -) -> Result<(), ProtocolError> { +) -> Result<(), DataContractError> { let mut to_visit: Vec<(Option, String, &Value)> = vec![(prefix, property_key, property_value)]; @@ -426,20 +477,13 @@ fn insert_values( let mut inner_properties = property_value.to_btree_ref_string_map()?; - if let Some(schema_ref) = inner_properties - .get_optional_str(property_names::REF) - .map_err(ProtocolError::ValueError)? - { - let referenced_sub_schema = resolve_uri(root_schema, schema_ref).map_err(|err| { - ProtocolError::Generic(format!("invalid schema reference url: {err}")) - })?; + if let Some(schema_ref) = inner_properties.get_optional_str(property_names::REF)? { + let referenced_sub_schema = resolve_uri(root_schema, schema_ref)?; inner_properties = referenced_sub_schema.to_btree_ref_string_map()? } - let type_value = inner_properties - .get_str(property_names::TYPE) - .map_err(ProtocolError::ValueError)?; + let type_value = inner_properties.get_str(property_names::TYPE)?; let is_required = known_required.contains(&prefixed_property_key); let field_type: DocumentPropertyType; @@ -465,10 +509,8 @@ fn insert_values( ), } } else { - return Err(ProtocolError::DataContractError( - DataContractError::InvalidContractStructure( - "byteArray should always be true if defined".to_string(), - ), + return Err(DataContractError::InvalidContractStructure( + "byteArray should always be true if defined".to_string(), )); } } @@ -493,16 +535,16 @@ fn insert_values( let properties = properties_as_value .as_map() - .ok_or(ProtocolError::StructureError( - StructureError::ValueWrongType("properties must be a map"), + .ok_or(DataContractError::ValueWrongType( + "properties must be a map".to_string(), ))?; for (object_property_key, object_property_value) in properties.iter() { let object_property_string = object_property_key .as_text() - .ok_or(ProtocolError::StructureError(StructureError::KeyWrongType( - "property key must be a string", - )))? + .ok_or(DataContractError::KeyWrongType( + "property key must be a string".to_string(), + ))? .to_string(); to_visit.push(( Some(prefixed_property_key.clone()), @@ -549,23 +591,16 @@ fn insert_values_nested( property_key: String, property_value: &Value, root_schema: &Value, -) -> Result<(), ProtocolError> { +) -> Result<(), DataContractError> { let mut inner_properties = property_value.to_btree_ref_string_map()?; - if let Some(schema_ref) = inner_properties - .get_optional_str(property_names::REF) - .map_err(ProtocolError::ValueError)? - { - let referenced_sub_schema = resolve_uri(root_schema, schema_ref).map_err(|err| { - ProtocolError::Generic(format!("invalid schema reference url: {err}")) - })?; + if let Some(schema_ref) = inner_properties.get_optional_str(property_names::REF)? { + let referenced_sub_schema = resolve_uri(root_schema, schema_ref)?; inner_properties = referenced_sub_schema.to_btree_ref_string_map()?; } - let type_value = inner_properties - .get_str(property_names::TYPE) - .map_err(ProtocolError::ValueError)?; + let type_value = inner_properties.get_str(property_names::TYPE)?; let is_required = known_required.contains(&property_key); @@ -594,10 +629,8 @@ fn insert_values_nested( ), } } else { - return Err(ProtocolError::DataContractError( - DataContractError::InvalidContractStructure( - "byteArray should always be true if defined".to_string(), - ), + return Err(DataContractError::InvalidContractStructure( + "byteArray should always be true if defined".to_string(), )); } } @@ -614,8 +647,8 @@ fn insert_values_nested( let properties = properties_as_value .as_map() - .ok_or(ProtocolError::StructureError( - StructureError::ValueWrongType("properties must be a map"), + .ok_or(DataContractError::ValueWrongType( + "properties must be a map".to_string(), ))?; let mut sorted_properties: Vec<_> = properties.iter().collect(); @@ -645,9 +678,9 @@ fn insert_values_nested( for (object_property_key, object_property_value) in properties.iter() { let object_property_string = object_property_key .as_text() - .ok_or(ProtocolError::StructureError(StructureError::KeyWrongType( - "property key must be a string", - )))? + .ok_or(DataContractError::KeyWrongType( + "property key must be a string".to_string(), + ))? .to_string(); insert_values_nested( diff --git a/packages/rs-dpp/src/data_contract/document_type/index/mod.rs b/packages/rs-dpp/src/data_contract/document_type/index/mod.rs index 21db11aba4..9213e18cbb 100644 --- a/packages/rs-dpp/src/data_contract/document_type/index/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/index/mod.rs @@ -8,7 +8,7 @@ pub enum OrderBy { Desc, } -use crate::data_contract::errors::{DataContractError, StructureError}; +use crate::data_contract::errors::DataContractError; use crate::ProtocolError; use anyhow::anyhow; @@ -174,7 +174,7 @@ impl Index { } impl TryFrom<&[(Value, Value)]> for Index { - type Error = ProtocolError; + type Error = DataContractError; fn try_from(index_type_value_map: &[(Value, Value)]) -> Result { // Decouple the map @@ -188,20 +188,16 @@ impl TryFrom<&[(Value, Value)]> for Index { let mut index_properties: Vec = Vec::new(); for (key_value, value_value) in index_type_value_map { - let key = key_value.to_str().map_err(ProtocolError::ValueError)?; + let key = key_value.to_str()?; match key { "name" => { name = Some( value_value .as_text() - .ok_or({ - ProtocolError::DataContractError( - DataContractError::InvalidContractStructure( - "index name should be a string".to_string(), - ), - ) - })? + .ok_or(DataContractError::InvalidContractStructure( + "index name should be a string".to_string(), + ))? .to_owned(), ); } @@ -212,25 +208,26 @@ impl TryFrom<&[(Value, Value)]> for Index { } "properties" => { let properties = - value_value.as_array().ok_or(ProtocolError::StructureError( - StructureError::ValueWrongType("properties value should be an array"), - ))?; + value_value + .as_array() + .ok_or(DataContractError::ValueWrongType( + "properties value should be an array".to_string(), + ))?; // Iterate over this and get the index properties for property in properties { - let property_map = property.as_map().ok_or( - ProtocolError::StructureError(StructureError::ValueWrongType( - "each property of an index should be a map", - )), - )?; + let property_map = + property.as_map().ok_or(DataContractError::ValueWrongType( + "each property of an index should be a map".to_string(), + ))?; let index_property = IndexProperty::from_platform_value(property_map)?; index_properties.push(index_property); } } _ => { - return Err(ProtocolError::StructureError( - StructureError::ValueWrongType("unexpected property name"), + return Err(DataContractError::ValueWrongType( + "unexpected property name".to_string(), )) } } @@ -251,20 +248,20 @@ impl TryFrom<&[(Value, Value)]> for Index { impl IndexProperty { pub fn from_platform_value( index_property_map: &[(Value, Value)], - ) -> Result { + ) -> Result { let property = &index_property_map[0]; let key = property .0 // key .as_text() - .ok_or(ProtocolError::DataContractError( - DataContractError::KeyWrongType("key should be of type string"), + .ok_or(DataContractError::KeyWrongType( + "key should be of type string".to_string(), ))?; let value = property .1 // value .as_text() - .ok_or(ProtocolError::DataContractError( - DataContractError::ValueWrongType("value should be of type string"), + .ok_or(DataContractError::ValueWrongType( + "value should be of type string".to_string(), ))?; let ascending = value == "asc"; diff --git a/packages/rs-dpp/src/data_contract/document_type/methods/mod.rs b/packages/rs-dpp/src/data_contract/document_type/methods/mod.rs index 576d821348..da9f57f17a 100644 --- a/packages/rs-dpp/src/data_contract/document_type/methods/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/methods/mod.rs @@ -4,6 +4,7 @@ mod estimated_size; mod index_for_types; mod max_size; mod serialize_value_for_key; +mod validate_update; use std::collections::BTreeMap; diff --git a/packages/rs-dpp/src/data_contract/document_type/methods/serialize_value_for_key/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/methods/serialize_value_for_key/v0/mod.rs index 3539b7615e..00a384fce1 100644 --- a/packages/rs-dpp/src/data_contract/document_type/methods/serialize_value_for_key/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/methods/serialize_value_for_key/v0/mod.rs @@ -21,7 +21,7 @@ impl DocumentTypeV0 { if bytes.len() != DEFAULT_HASH_SIZE { Err(ProtocolError::DataContractError( DataContractError::FieldRequirementUnmet( - "expected system value to be 32 bytes long", + "expected system value to be 32 bytes long".to_string(), ), )) } else { @@ -39,7 +39,7 @@ impl DocumentTypeV0 { if bytes.len() > MAX_INDEX_SIZE { Err(ProtocolError::DataContractError( DataContractError::FieldRequirementUnmet( - "value must be less than 256 bytes long", + "value must be less than 256 bytes long".to_string(), ), )) } else { diff --git a/packages/rs-dpp/src/data_contract/document_type/methods/validate_update/mod.rs b/packages/rs-dpp/src/data_contract/document_type/methods/validate_update/mod.rs new file mode 100644 index 0000000000..2cc81554c1 --- /dev/null +++ b/packages/rs-dpp/src/data_contract/document_type/methods/validate_update/mod.rs @@ -0,0 +1,28 @@ +use crate::data_contract::document_type::{DocumentType, DocumentTypeRef}; +use crate::validation::SimpleConsensusValidationResult; +use crate::ProtocolError; +use platform_version::version::PlatformVersion; + +mod v0; + +impl<'a> DocumentTypeRef<'a> { + pub fn validate_update( + &self, + new_document_type: &DocumentType, + platform_version: &PlatformVersion, + ) -> Result { + match platform_version + .dpp + .validation + .document_type + .validate_update + { + 0 => Ok(self.validate_update_v0(new_document_type)), + version => Err(ProtocolError::UnknownVersionMismatch { + method: "validate_config_update".to_string(), + known_versions: vec![0], + received: version, + }), + } + } +} diff --git a/packages/rs-dpp/src/data_contract/document_type/methods/validate_update/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/methods/validate_update/v0/mod.rs new file mode 100644 index 0000000000..5dcbc9bd3b --- /dev/null +++ b/packages/rs-dpp/src/data_contract/document_type/methods/validate_update/v0/mod.rs @@ -0,0 +1,107 @@ +use crate::consensus::state::data_contract::document_type_update_error::DocumentTypeUpdateError; +use crate::data_contract::document_type::accessors::DocumentTypeV0Getters; +use crate::data_contract::document_type::{DocumentType, DocumentTypeRef}; +use crate::validation::SimpleConsensusValidationResult; + +impl<'a> DocumentTypeRef<'a> { + pub(super) fn validate_update_v0( + &self, + new_document_type: &DocumentType, + ) -> SimpleConsensusValidationResult { + if new_document_type.documents_keep_history() != self.documents_keep_history() { + return SimpleConsensusValidationResult::new_with_error( + DocumentTypeUpdateError::new( + self.data_contract_id(), + self.name(), + format!( + "document type can not change whether it keeps history: changing from {} to {}", + self.documents_keep_history(), + new_document_type.documents_keep_history() + ), + ) + .into(), + ); + } + + if new_document_type.documents_mutable() != self.documents_mutable() { + return SimpleConsensusValidationResult::new_with_error( + DocumentTypeUpdateError::new( + self.data_contract_id(), + self.name(), + format!( + "document type can not change whether its documents are mutable: changing from {} to {}", + self.documents_mutable(), + new_document_type.documents_mutable() + ), + ) + .into(), + ); + } + + if new_document_type.requires_identity_encryption_bounded_key() + != self.requires_identity_encryption_bounded_key() + { + return SimpleConsensusValidationResult::new_with_error( + DocumentTypeUpdateError::new( + self.data_contract_id(), + self.name(), + format!( + "document type can not change whether it required an identity encryption bounded key: changing from {:?} to {:?}", + self.requires_identity_encryption_bounded_key(), + new_document_type.requires_identity_encryption_bounded_key() + ), + ) + .into(), + ); + } + + if new_document_type.requires_identity_decryption_bounded_key() + != self.requires_identity_decryption_bounded_key() + { + return SimpleConsensusValidationResult::new_with_error( + DocumentTypeUpdateError::new( + self.data_contract_id(), + self.name(), + format!( + "document type can not change whether it required an identity decryption bounded key: changing from {:?} to {:?}", + self.requires_identity_decryption_bounded_key(), + new_document_type.requires_identity_decryption_bounded_key() + ), + ) + .into(), + ); + } + + if new_document_type.security_level_requirement() != self.security_level_requirement() { + return SimpleConsensusValidationResult::new_with_error( + DocumentTypeUpdateError::new( + self.data_contract_id(), + self.name(), + format!( + "document type can not change the security level requirement for its updates: changing from {:?} to {:?}", + self.security_level_requirement(), + new_document_type.security_level_requirement() + ), + ) + .into(), + ); + } + + if new_document_type.required_fields() != self.required_fields() { + return SimpleConsensusValidationResult::new_with_error( + DocumentTypeUpdateError::new( + self.data_contract_id(), + self.name(), + format!( + "document type can not change required fields: changing from {:?} to {:?}", + self.required_fields(), + new_document_type.required_fields() + ), + ) + .into(), + ); + } + + SimpleConsensusValidationResult::new() + } +} diff --git a/packages/rs-dpp/src/data_contract/document_type/property/array.rs b/packages/rs-dpp/src/data_contract/document_type/property/array.rs index 2e45caf15e..fd4e533fd2 100644 --- a/packages/rs-dpp/src/data_contract/document_type/property/array.rs +++ b/packages/rs-dpp/src/data_contract/document_type/property/array.rs @@ -122,6 +122,6 @@ impl ArrayItemType { fn get_field_type_matching_error() -> ProtocolError { ProtocolError::DataContractError(DataContractError::ValueWrongType( - "document field type doesn't match document value for array", + "document field type doesn't match document value for array".to_string(), )) } diff --git a/packages/rs-dpp/src/data_contract/document_type/property/mod.rs b/packages/rs-dpp/src/data_contract/document_type/property/mod.rs index d1c9e08226..9910d4af4e 100644 --- a/packages/rs-dpp/src/data_contract/document_type/property/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/property/mod.rs @@ -4,6 +4,7 @@ use std::io::{BufReader, Read}; use crate::data_contract::errors::DataContractError; +use crate::consensus::basic::decode::DecodingError; use crate::prelude::TimestampMillis; use crate::ProtocolError; use array::ArrayItemType; @@ -44,14 +45,16 @@ pub enum DocumentPropertyType { } impl DocumentPropertyType { - pub fn try_from_name(name: &str) -> Result { + pub fn try_from_name(name: &str) -> Result { match name { "integer" => Ok(DocumentPropertyType::Integer), "number" => Ok(DocumentPropertyType::Number), "boolean" => Ok(DocumentPropertyType::Boolean), "date" => Ok(DocumentPropertyType::Date), "identifier" => Ok(DocumentPropertyType::Identifier), - _ => Err(DataContractError::ValueWrongType("invalid type").into()), + _ => Err(DataContractError::ValueWrongType( + "invalid type".to_string(), + )), } } @@ -363,20 +366,20 @@ impl DocumentPropertyType { } } - fn read_varint_value(buf: &mut BufReader<&[u8]>) -> Result, ProtocolError> { + fn read_varint_value(buf: &mut BufReader<&[u8]>) -> Result, DataContractError> { let bytes: usize = buf.read_varint().map_err(|_| { - ProtocolError::DataContractError(DataContractError::CorruptedSerialization( - "error reading varint length from serialized document", - )) + DataContractError::CorruptedSerialization( + "error reading varint length from serialized document".to_string(), + ) })?; if bytes == 0 { Ok(vec![]) } else { let mut value: Vec = vec![0u8; bytes]; buf.read_exact(&mut value).map_err(|_| { - ProtocolError::DataContractError(DataContractError::CorruptedSerialization( - "error reading varint from serialized document", - )) + DataContractError::CorruptedSerialization( + "error reading varint from serialized document".to_string(), + ) })?; Ok(value) } @@ -388,7 +391,7 @@ impl DocumentPropertyType { &self, buf: &mut BufReader<&[u8]>, required: bool, - ) -> Result<(Option, bool), ProtocolError> { + ) -> Result<(Option, bool), DataContractError> { if !required { let marker = buf.read_u8().ok(); match marker { @@ -401,33 +404,33 @@ impl DocumentPropertyType { DocumentPropertyType::String(_, _) => { let bytes = Self::read_varint_value(buf)?; let string = String::from_utf8(bytes).map_err(|_| { - ProtocolError::DataContractError(DataContractError::CorruptedSerialization( - "error reading string from serialized document", - )) + DataContractError::CorruptedSerialization( + "error reading string from serialized document".to_string(), + ) })?; Ok((Some(Value::Text(string)), false)) } DocumentPropertyType::Date | DocumentPropertyType::Number => { let date = buf.read_f64::().map_err(|_| { - ProtocolError::DataContractError(DataContractError::CorruptedSerialization( - "error reading date/number from serialized document", - )) + DataContractError::CorruptedSerialization( + "error reading date/number from serialized document".to_string(), + ) })?; Ok((Some(Value::Float(date)), false)) } DocumentPropertyType::Integer => { let integer = buf.read_i64::().map_err(|_| { - ProtocolError::DataContractError(DataContractError::CorruptedSerialization( - "error reading integer from serialized document", - )) + DataContractError::CorruptedSerialization( + "error reading integer from serialized document".to_string(), + ) })?; Ok((Some(Value::I64(integer)), false)) } DocumentPropertyType::Boolean => { let value = buf.read_u8().map_err(|_| { - ProtocolError::DataContractError(DataContractError::CorruptedSerialization( - "error reading bool from serialized document", - )) + DataContractError::CorruptedSerialization( + "error reading bool from serialized document".to_string(), + ) })?; match value { 0 => Ok((Some(Value::Bool(false)), false)), @@ -441,9 +444,10 @@ impl DocumentPropertyType { let len = *min as usize; let mut bytes = vec![0; len]; buf.read_exact(&mut bytes).map_err(|_| { - ProtocolError::DecodingError( - "error reading 32 byte non main identifier".to_string(), - ) + DataContractError::DecodingContractError(DecodingError::new(format!( + "expected to read {} bytes (min size for byte array)", + len + ))) })?; // To save space we use predefined types for most popular blob sizes // so we don't need to store the size of the blob @@ -464,9 +468,9 @@ impl DocumentPropertyType { DocumentPropertyType::Identifier => { let mut id = [0; 32]; buf.read_exact(&mut id).map_err(|_| { - ProtocolError::DecodingError( - "error reading 32 byte non main identifier".to_string(), - ) + DataContractError::DecodingContractError(DecodingError::new( + "expected to read 32 bytes (identifier)".to_string(), + )) })?; //dbg!(hex::encode(&id)); Ok((Some(Value::Identifier(id)), false)) @@ -474,15 +478,15 @@ impl DocumentPropertyType { DocumentPropertyType::Object(inner_fields) => { let object_byte_len: usize = buf.read_varint().map_err(|_| { - ProtocolError::DataContractError(DataContractError::CorruptedSerialization( - "error reading varint of object length", - )) + DataContractError::CorruptedSerialization( + "error reading varint of object length".to_string(), + ) })?; let mut object_bytes = vec![0u8; object_byte_len]; buf.read_exact(&mut object_bytes).map_err(|_| { - ProtocolError::DataContractError(DataContractError::CorruptedSerialization( - "error reading object bytes", - )) + DataContractError::CorruptedSerialization( + "error reading object bytes".to_string(), + ) })?; // Wrap the bytes in a BufReader let mut object_buf_reader = BufReader::new(&object_bytes[..]); @@ -492,10 +496,8 @@ impl DocumentPropertyType { .filter_map(|(key, field)| { if finished_buffer { return if field.required { - Some(Err(ProtocolError::DataContractError( - DataContractError::CorruptedSerialization( - "required field after finished buffer in object", - ), + Some(Err(DataContractError::CorruptedSerialization( + "required field after finished buffer in object".to_string(), ))) } else { None @@ -516,20 +518,18 @@ impl DocumentPropertyType { Err(e) => Some(Err(e)), } }) - .collect::, ProtocolError>>()?; + .collect::, DataContractError>>()?; if values.is_empty() { Ok((None, false)) } else { Ok((Some(Value::Map(values)), false)) } } - DocumentPropertyType::Array(_array_field_type) => { - Err(ProtocolError::DataContractError( - DataContractError::Unsupported("serialization of arrays not yet supported"), - )) - } - DocumentPropertyType::VariableTypeArray(_) => Err(ProtocolError::DataContractError( - DataContractError::Unsupported("serialization of arrays not yet supported"), + DocumentPropertyType::Array(_array_field_type) => Err(DataContractError::Unsupported( + "serialization of arrays not yet supported".to_string(), + )), + DocumentPropertyType::VariableTypeArray(_) => Err(DataContractError::Unsupported( + "serialization of variable type arrays not yet supported".to_string(), )), } } @@ -550,7 +550,7 @@ impl DocumentPropertyType { r_vec.extend(vec); Ok(r_vec) } else { - Err(get_field_type_matching_error()) + Err(get_field_type_matching_error().into()) } } DocumentPropertyType::Date => { @@ -640,7 +640,7 @@ impl DocumentPropertyType { len_prepended_vec.append(&mut r_vec); Ok(len_prepended_vec) } else { - Err(get_field_type_matching_error()) + Err(get_field_type_matching_error().into()) } } DocumentPropertyType::Array(array_field_type) => { @@ -655,12 +655,12 @@ impl DocumentPropertyType { })?; Ok(r_vec) } else { - Err(get_field_type_matching_error()) + Err(get_field_type_matching_error().into()) } } DocumentPropertyType::VariableTypeArray(_) => Err(ProtocolError::DataContractError( DataContractError::Unsupported( - "serialization of variable type arrays not yet supported", + "serialization of variable type arrays not yet supported".to_string(), ), )), } @@ -726,7 +726,7 @@ impl DocumentPropertyType { } DocumentPropertyType::Object(inner_fields) => { let Some(value_map) = value.as_map() else { - return Err(get_field_type_matching_error()); + return Err(get_field_type_matching_error().into()); }; let value_map = Value::map_ref_into_btree_string_map(value_map)?; let mut r_vec = vec![]; @@ -768,12 +768,14 @@ impl DocumentPropertyType { })?; Ok(r_vec) } else { - Err(get_field_type_matching_error()) + Err(get_field_type_matching_error().into()) } } DocumentPropertyType::VariableTypeArray(_) => Err(ProtocolError::DataContractError( - DataContractError::Unsupported("serialization of arrays not yet supported"), + DataContractError::Unsupported( + "serialization of arrays not yet supported".to_string(), + ), )), }; } @@ -821,13 +823,13 @@ impl DocumentPropertyType { } DocumentPropertyType::Object(_) => Err(ProtocolError::DataContractError( DataContractError::EncodingDataStructureNotSupported( - "we should never try encoding an object", + "we should never try encoding an object".to_string(), ), )), DocumentPropertyType::Array(_) | DocumentPropertyType::VariableTypeArray(_) => { Err(ProtocolError::DataContractError( DataContractError::EncodingDataStructureNotSupported( - "we should never try encoding an array", + "we should never try encoding an array".to_string(), ), )) } @@ -835,60 +837,59 @@ impl DocumentPropertyType { } // Given a field type and a value this function chooses and executes the right encoding method - pub fn value_from_string(&self, str: &str) -> Result { + pub fn value_from_string(&self, str: &str) -> Result { match self { DocumentPropertyType::String(min, max) => { if let Some(min) = min { if str.len() < *min as usize { - return Err(ProtocolError::DataContractError( - DataContractError::FieldRequirementUnmet("string is too small"), + return Err(DataContractError::FieldRequirementUnmet( + "string is too small".to_string(), )); } } if let Some(max) = max { if str.len() > *max as usize { - return Err(ProtocolError::DataContractError( - DataContractError::FieldRequirementUnmet("string is too big"), + return Err(DataContractError::FieldRequirementUnmet( + "string is too big".to_string(), )); } } Ok(Value::Text(str.to_string())) } DocumentPropertyType::Integer => str.parse::().map(Value::I128).map_err(|_| { - ProtocolError::DataContractError(DataContractError::ValueWrongType( - "value is not an integer from string", - )) + DataContractError::ValueWrongType("value is not an integer from string".to_string()) }), DocumentPropertyType::Number | DocumentPropertyType::Date => { str.parse::().map(Value::Float).map_err(|_| { - ProtocolError::DataContractError(DataContractError::ValueWrongType( - "value is not a float from string", - )) + DataContractError::ValueWrongType( + "value is not a float from string".to_string(), + ) }) } DocumentPropertyType::ByteArray(min, max) => { if let Some(min) = min { if str.len() / 2 < *min as usize { - return Err(ProtocolError::DataContractError( - DataContractError::FieldRequirementUnmet("byte array is too small"), + return Err(DataContractError::FieldRequirementUnmet( + "byte array is too small".to_string(), )); } } if let Some(max) = max { if str.len() / 2 > *max as usize { - return Err(ProtocolError::DataContractError( - DataContractError::FieldRequirementUnmet("byte array is too big"), + return Err(DataContractError::FieldRequirementUnmet( + "byte array is too big".to_string(), )); } } Ok(Value::Bytes(hex::decode(str).map_err(|_| { - ProtocolError::DataContractError(DataContractError::ValueDecodingError( - "could not parse hex bytes", - )) + DataContractError::ValueDecodingError("could not parse hex bytes".to_string()) })?)) } DocumentPropertyType::Identifier => Ok(Value::Identifier( - Value::Text(str.to_owned()).to_identifier()?.into_buffer(), + Value::Text(str.to_owned()) + .to_identifier() + .map_err(|e| DataContractError::ValueDecodingError(format!("{:?}", e)))? + .into_buffer(), )), DocumentPropertyType::Boolean => { if str.to_lowercase().as_str() == "true" { @@ -896,23 +897,19 @@ impl DocumentPropertyType { } else if str.to_lowercase().as_str() == "false" { Ok(Value::Bool(false)) } else { - Err(ProtocolError::DataContractError( - DataContractError::ValueDecodingError( - "could not parse a boolean to a value", - ), + Err(DataContractError::ValueDecodingError( + "could not parse a boolean to a value".to_string(), )) } } - DocumentPropertyType::Object(_) => Err(ProtocolError::DataContractError( - DataContractError::EncodingDataStructureNotSupported( - "we should never try encoding an object", - ), - )), + DocumentPropertyType::Object(_) => { + Err(DataContractError::EncodingDataStructureNotSupported( + "we should never try encoding an object".to_string(), + )) + } DocumentPropertyType::Array(_) | DocumentPropertyType::VariableTypeArray(_) => { - Err(ProtocolError::DataContractError( - DataContractError::EncodingDataStructureNotSupported( - "we should never try encoding an array", - ), + Err(DataContractError::EncodingDataStructureNotSupported( + "we should never try encoding an array".to_string(), )) } } @@ -1012,8 +1009,8 @@ impl DocumentPropertyType { } } -fn get_field_type_matching_error() -> ProtocolError { - ProtocolError::DataContractError(DataContractError::ValueWrongType( - "document field type doesn't match document value", - )) +fn get_field_type_matching_error() -> DataContractError { + DataContractError::ValueWrongType( + "document field type doesn't match document value".to_string(), + ) } diff --git a/packages/rs-dpp/src/data_contract/document_type/schema/enrich_with_base_schema/mod.rs b/packages/rs-dpp/src/data_contract/document_type/schema/enrich_with_base_schema/mod.rs index 1cda5bc717..8dad4f62c0 100644 --- a/packages/rs-dpp/src/data_contract/document_type/schema/enrich_with_base_schema/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/schema/enrich_with_base_schema/mod.rs @@ -1,26 +1,29 @@ mod v0; +use crate::data_contract::document_type::DocumentType; use crate::ProtocolError; use platform_value::Value; use platform_version::version::PlatformVersion; -pub fn enrich_with_base_schema( - schema: Value, - schema_defs: Option, - platform_version: &PlatformVersion, -) -> Result { - match platform_version - .dpp - .contract_versions - .document_type_versions - .schema - .enrich_with_base_schema - { - 0 => v0::enrich_with_base_schema_v0(schema, schema_defs), - version => Err(ProtocolError::UnknownVersionMismatch { - method: "enrich_with_base_schema".to_string(), - known_versions: vec![0], - received: version, - }), +impl DocumentType { + pub fn enrich_with_base_schema( + schema: Value, + schema_defs: Option, + platform_version: &PlatformVersion, + ) -> Result { + match platform_version + .dpp + .contract_versions + .document_type_versions + .schema + .enrich_with_base_schema + { + 0 => v0::enrich_with_base_schema_v0(schema, schema_defs), + version => Err(ProtocolError::UnknownVersionMismatch { + method: "enrich_with_base_schema".to_string(), + known_versions: vec![0], + received: version, + }), + } } } diff --git a/packages/rs-dpp/src/data_contract/document_type/schema/enrich_with_base_schema/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/schema/enrich_with_base_schema/v0/mod.rs index 87730098b3..706070c876 100644 --- a/packages/rs-dpp/src/data_contract/document_type/schema/enrich_with_base_schema/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/schema/enrich_with_base_schema/v0/mod.rs @@ -1,3 +1,5 @@ +use crate::consensus::basic::BasicError; +use crate::consensus::ConsensusError; use crate::data_contract::document_type::property_names; use crate::data_contract::errors::DataContractError; use crate::data_contract::serialized_version::v0::property_names as contract_property_names; @@ -16,17 +18,25 @@ pub fn enrich_with_base_schema_v0( schema_defs: Option, ) -> Result { let schema_map = schema.to_map_mut().map_err(|err| { - ProtocolError::DataContractError(DataContractError::InvalidContractStructure(format!( - "document schema must be an object: {err}" - ))) + ProtocolError::ConsensusError( + ConsensusError::BasicError(BasicError::ContractError( + DataContractError::InvalidContractStructure(format!( + "document schema must be an object: {err}" + )), + )) + .into(), + ) })?; // Add $schema if schema_map.get_optional_key(PROPERTY_SCHEMA).is_some() { - return Err(ProtocolError::DataContractError( - DataContractError::InvalidContractStructure( - "document schema shouldn't contain '$schema' property".to_string(), - ), + return Err(ProtocolError::ConsensusError( + ConsensusError::BasicError(BasicError::ContractError( + DataContractError::InvalidContractStructure( + "document schema shouldn't contain '$schema' property".to_string(), + ), + )) + .into(), )); } @@ -40,10 +50,13 @@ pub fn enrich_with_base_schema_v0( .get_optional_key(contract_property_names::DEFINITIONS) .is_some() { - return Err(ProtocolError::DataContractError( - DataContractError::InvalidContractStructure( - "document schema shouldn't contain '$schema' property".to_string(), - ), + return Err(ProtocolError::ConsensusError( + ConsensusError::BasicError(BasicError::ContractError( + DataContractError::InvalidContractStructure( + "document schema shouldn't contain '$defs' property".to_string(), + ), + )) + .into(), )); } diff --git a/packages/rs-dpp/src/data_contract/document_type/schema/mod.rs b/packages/rs-dpp/src/data_contract/document_type/schema/mod.rs index 6e739dfc49..169953690a 100644 --- a/packages/rs-dpp/src/data_contract/document_type/schema/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/schema/mod.rs @@ -1,5 +1,4 @@ mod enrich_with_base_schema; -pub use enrich_with_base_schema::*; mod find_identifier_and_binary_paths; diff --git a/packages/rs-dpp/src/data_contract/document_type/schema/validate_max_depth/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/schema/validate_max_depth/v0/mod.rs index 613e55bd87..621d0e8f57 100644 --- a/packages/rs-dpp/src/data_contract/document_type/schema/validate_max_depth/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/schema/validate_max_depth/v0/mod.rs @@ -190,7 +190,7 @@ mod test { let err = get_ref_error(result); assert_eq!( err.message(), - "invalid ref for max depth '#/$defs/object': value error: structure error: unable to get property $defs in $defs.object" + "invalid ref for max depth '#/$defs/object': value decoding error: StructureError(\"unable to get property $defs in $defs.object\")" .to_string() ); } @@ -220,7 +220,7 @@ mod test { let err = get_ref_error(result); assert_eq!( err.message(), - "invalid ref for max depth 'https://json-schema.org/some': Generic Error: only local references are allowed" + "invalid ref for max depth 'https://json-schema.org/some': invalid uri error: only local uri references are allowed" .to_string() ); } @@ -250,7 +250,7 @@ mod test { let err = get_ref_error(result); assert_eq!( err.message(), - "invalid ref for max depth '': Generic Error: only local references are allowed" + "invalid ref for max depth '': invalid uri error: only local uri references are allowed" .to_string() ); } diff --git a/packages/rs-dpp/src/data_contract/errors/contract.rs b/packages/rs-dpp/src/data_contract/errors/contract.rs index c4d601063e..82df4397c1 100644 --- a/packages/rs-dpp/src/data_contract/errors/contract.rs +++ b/packages/rs-dpp/src/data_contract/errors/contract.rs @@ -1,22 +1,20 @@ +use crate::consensus::basic::decode::DecodingError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; use thiserror::Error; -use crate::data_contract::DataContract; - use crate::consensus::basic::document::InvalidDocumentTypeError; use crate::data_contract::errors::json_schema_error::JsonSchemaError; -use crate::errors::consensus::ConsensusError; +use crate::ProtocolError; // @append_only -#[derive(Error, Debug)] +#[derive(Error, Debug, PlatformSerialize, PlatformDeserialize, Encode, Decode, Clone)] pub enum DataContractError { - #[error("Data Contract already exists")] - DataContractAlreadyExistsError, + #[error(transparent)] + DecodingContractError(DecodingError), - #[error("Invalid Data Contract: {errors:?}")] - InvalidDataContractError { - errors: Vec, - raw_data_contract: DataContract, - }, + #[error(transparent)] + DecodingDocumentError(DecodingError), #[error(transparent)] InvalidDocumentTypeError(InvalidDocumentTypeError), @@ -25,47 +23,67 @@ pub enum DataContractError { MissingRequiredKey(String), #[error("field requirement unmet: {0}")] - FieldRequirementUnmet(&'static str), + FieldRequirementUnmet(String), #[error("key wrong type error: {0}")] - KeyWrongType(&'static str), + KeyWrongType(String), #[error("value wrong type error: {0}")] - ValueWrongType(&'static str), + ValueWrongType(String), + + #[error("invalid uri error: {0}")] + InvalidURI(String), + + /// Key wrong bounds error + #[error("key out of bounds error: {0}")] + KeyWrongBounds(String), + + /// A key value pair must exist + #[error("key value must exist: {0}")] + KeyValueMustExist(String), #[error("value decoding error: {0}")] - ValueDecodingError(&'static str), + ValueDecodingError(String), #[error("encoding data structure not supported error: {0}")] - EncodingDataStructureNotSupported(&'static str), + EncodingDataStructureNotSupported(String), #[error("invalid contract structure: {0}")] InvalidContractStructure(String), #[error("document type not found: {0}")] - DocumentTypeNotFound(&'static str), + DocumentTypeNotFound(String), #[error("document type field not found: {0}")] DocumentTypeFieldNotFound(String), #[error("reference definition not found error: {0}")] - ReferenceDefinitionNotFound(&'static str), + ReferenceDefinitionNotFound(String), #[error("document owner id missing error: {0}")] - DocumentOwnerIdMissing(&'static str), + DocumentOwnerIdMissing(String), #[error("document id missing error: {0}")] - DocumentIdMissing(&'static str), + DocumentIdMissing(String), #[error("Operation not supported: {0}")] - Unsupported(&'static str), + Unsupported(String), #[error("Corrupted Serialization: {0}")] - CorruptedSerialization(&'static str), - - #[error("Corrupted Code Execution: {0}")] - CorruptedCodeExecution(&'static str), + CorruptedSerialization(String), #[error("Corrupted Code Execution: {0}")] JsonSchema(JsonSchemaError), } + +impl From for DataContractError { + fn from(value: platform_value::Error) -> Self { + DataContractError::ValueDecodingError(format!("{:?}", value)) + } +} + +impl From<(platform_value::Error, &str)> for DataContractError { + fn from(value: (platform_value::Error, &str)) -> Self { + DataContractError::ValueDecodingError(format!("{}: {:?}", value.1, value.0)) + } +} diff --git a/packages/rs-dpp/src/data_contract/errors/invalid_data_contract_error.rs b/packages/rs-dpp/src/data_contract/errors/invalid_data_contract_error.rs deleted file mode 100644 index 05ea1636d4..0000000000 --- a/packages/rs-dpp/src/data_contract/errors/invalid_data_contract_error.rs +++ /dev/null @@ -1,34 +0,0 @@ -use crate::consensus::ConsensusError; -use crate::ProtocolError; -use platform_value::Value; -use thiserror::Error; - -// @append_only -#[derive(Error, Debug)] -#[error("Invalid Data Contract: {errors:?}")] -pub struct InvalidDataContractError { - pub errors: Vec, - raw_data_contract: Value, -} - -impl InvalidDataContractError { - pub fn new(errors: Vec, raw_data_contract: Value) -> Self { - Self { - errors, - raw_data_contract, - } - } - - pub fn errors(&self) -> &[ConsensusError] { - &self.errors - } - pub fn raw_data_contract(&self) -> Value { - self.raw_data_contract.clone() - } -} - -impl From for ProtocolError { - fn from(err: InvalidDataContractError) -> Self { - Self::InvalidDataContractError(err) - } -} diff --git a/packages/rs-dpp/src/data_contract/errors/json_schema_error.rs b/packages/rs-dpp/src/data_contract/errors/json_schema_error.rs index ea959b1d0f..30c63fde5a 100644 --- a/packages/rs-dpp/src/data_contract/errors/json_schema_error.rs +++ b/packages/rs-dpp/src/data_contract/errors/json_schema_error.rs @@ -1,8 +1,11 @@ +use crate::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; use thiserror::Error; // @append_only -#[derive(Error, Debug)] +#[derive(Error, Debug, PlatformSerialize, PlatformDeserialize, Encode, Decode, Clone)] pub enum JsonSchemaError { #[error("can't create json schema: {0}")] - CreateSchemaError(&'static str), + CreateSchemaError(String), } diff --git a/packages/rs-dpp/src/data_contract/errors/mod.rs b/packages/rs-dpp/src/data_contract/errors/mod.rs index 55ee043347..dd860ad6fe 100644 --- a/packages/rs-dpp/src/data_contract/errors/mod.rs +++ b/packages/rs-dpp/src/data_contract/errors/mod.rs @@ -1,15 +1,11 @@ mod contract; mod data_contract_not_present_error; mod identity_not_present_error; -mod invalid_data_contract_error; mod invalid_document_type_error; mod json_schema_error; -mod structure; pub use contract::DataContractError; pub use data_contract_not_present_error::*; pub use identity_not_present_error::*; -pub use invalid_data_contract_error::*; pub use invalid_document_type_error::*; pub use json_schema_error::JsonSchemaError; -pub use structure::StructureError; diff --git a/packages/rs-dpp/src/data_contract/errors/structure.rs b/packages/rs-dpp/src/data_contract/errors/structure.rs deleted file mode 100644 index effe7abc63..0000000000 --- a/packages/rs-dpp/src/data_contract/errors/structure.rs +++ /dev/null @@ -1,23 +0,0 @@ -// @append_only -/// structure errors -#[derive(Debug, thiserror::Error)] -pub enum StructureError { - /// Invalid protocol version error - #[error("invalid protocol version error: {0}")] - InvalidProtocolVersion(&'static str), - /// Invalid CBOR error - #[error("invalid cbor error: {0}")] - InvalidCBOR(&'static str), - /// Key wrong type error - #[error("key wrong type error: {0}")] - KeyWrongType(&'static str), - /// Key wrong bounds error - #[error("key out of bounds error: {0}")] - KeyWrongBounds(&'static str), - /// Value wrong type error - #[error("value wrong type error: {0}")] - ValueWrongType(&'static str), - /// A key value pair must exist - #[error("key value must exist: {0}")] - KeyValueMustExist(&'static str), -} diff --git a/packages/rs-dpp/src/data_contract/methods/validation/v0/mod.rs b/packages/rs-dpp/src/data_contract/methods/validation/v0/mod.rs index f347ddb46c..c84d23d11d 100644 --- a/packages/rs-dpp/src/data_contract/methods/validation/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/methods/validation/v0/mod.rs @@ -1,7 +1,6 @@ use crate::data_contract::accessors::v0::DataContractV0Getters; use crate::data_contract::document_type::accessors::DocumentTypeV0Getters; -use crate::data_contract::document_type::schema::enrich_with_base_schema; -use crate::data_contract::document_type::DocumentTypeRef; +use crate::data_contract::document_type::{DocumentType, DocumentTypeRef}; use crate::consensus::basic::document::{InvalidDocumentTypeError, MissingDocumentTypeError}; use crate::data_contract::schema::DataContractSchemaMethodsV0; @@ -48,7 +47,7 @@ impl DataContract { // Compile json schema validator if it's not yet compiled if !validator.is_compiled(platform_version)? { - let root_schema = enrich_with_base_schema( + let root_schema = DocumentType::enrich_with_base_schema( // TODO: I just wondering if we could you references here // instead of cloning document_type.schema().clone(), diff --git a/packages/rs-dpp/src/data_contract/storage_requirements/keys_for_document_type.rs b/packages/rs-dpp/src/data_contract/storage_requirements/keys_for_document_type.rs index 56f0f4017e..b825466eba 100644 --- a/packages/rs-dpp/src/data_contract/storage_requirements/keys_for_document_type.rs +++ b/packages/rs-dpp/src/data_contract/storage_requirements/keys_for_document_type.rs @@ -1,3 +1,6 @@ +use crate::consensus::basic::data_contract::UnknownStorageKeyRequirementsError; +use crate::consensus::basic::BasicError; +use crate::consensus::ConsensusError; use crate::ProtocolError; use bincode::{Decode, Encode}; use serde_repr::*; @@ -20,10 +23,12 @@ impl TryFrom for StorageKeyRequirements { 0 => Ok(Self::Unique), 1 => Ok(Self::Multiple), 2 => Ok(Self::MultipleReferenceToLatest), - value => Err(ProtocolError::UnknownStorageKeyRequirements(format!( - "unrecognized storage key requirements: {}", - value - ))), + value => Err(ProtocolError::ConsensusError( + ConsensusError::BasicError(BasicError::UnknownStorageKeyRequirementsError( + UnknownStorageKeyRequirementsError::new(vec![0, 1, 3], value.into()), + )) + .into(), + )), } } } @@ -35,10 +40,12 @@ impl TryFrom for StorageKeyRequirements { 0 => Ok(Self::Unique), 1 => Ok(Self::Multiple), 2 => Ok(Self::MultipleReferenceToLatest), - value => Err(ProtocolError::UnknownStorageKeyRequirements(format!( - "unrecognized storage key requirements: {}", - value - ))), + value => Err(ProtocolError::ConsensusError( + ConsensusError::BasicError(BasicError::UnknownStorageKeyRequirementsError( + UnknownStorageKeyRequirementsError::new(vec![0, 1, 3], value), + )) + .into(), + )), } } } diff --git a/packages/rs-dpp/src/data_contract/v0/accessors/mod.rs b/packages/rs-dpp/src/data_contract/v0/accessors/mod.rs index 1706792a57..a3d617dc62 100644 --- a/packages/rs-dpp/src/data_contract/v0/accessors/mod.rs +++ b/packages/rs-dpp/src/data_contract/v0/accessors/mod.rs @@ -6,7 +6,7 @@ use crate::data_contract::errors::DataContractError; use crate::data_contract::v0::DataContractV0; use crate::data_contract::DocumentName; use crate::metadata::Metadata; -use crate::ProtocolError; + use platform_value::Identifier; use std::collections::BTreeMap; @@ -27,20 +27,20 @@ impl DataContractV0Getters for DataContractV0 { self.owner_id } - fn document_type_cloned_for_name(&self, name: &str) -> Result { + fn document_type_cloned_for_name(&self, name: &str) -> Result { self.document_type_cloned_optional_for_name(name) .ok_or_else(|| { - ProtocolError::DataContractError(DataContractError::DocumentTypeNotFound( - "can not get document type from contract", - )) + DataContractError::DocumentTypeNotFound( + "can not get document type from contract".to_string(), + ) }) } - fn document_type_for_name(&self, name: &str) -> Result { + fn document_type_for_name(&self, name: &str) -> Result { self.document_type_optional_for_name(name).ok_or_else(|| { - ProtocolError::DataContractError(DataContractError::DocumentTypeNotFound( - "can not get document type from contract", - )) + DataContractError::DocumentTypeNotFound( + "can not get document type from contract".to_string(), + ) }) } diff --git a/packages/rs-dpp/src/document/document_methods/get_raw_for_contract/v0/mod.rs b/packages/rs-dpp/src/document/document_methods/get_raw_for_contract/v0/mod.rs index 9a78e8128b..8750f4034d 100644 --- a/packages/rs-dpp/src/document/document_methods/get_raw_for_contract/v0/mod.rs +++ b/packages/rs-dpp/src/document/document_methods/get_raw_for_contract/v0/mod.rs @@ -18,7 +18,7 @@ pub trait DocumentGetRawForContractV0: DocumentV0Getters + DocumentGetRawForDocu ) -> Result>, ProtocolError> { let document_type = contract.document_types().get(document_type_name).ok_or({ ProtocolError::DataContractError(DataContractError::DocumentTypeNotFound( - "document type should exist for name", + "document type should exist for name".to_string(), )) })?; self.get_raw_for_document_type_v0(key, document_type.as_ref(), owner_id, platform_version) diff --git a/packages/rs-dpp/src/document/extended_document/v0/mod.rs b/packages/rs-dpp/src/document/extended_document/v0/mod.rs index 76a0490cdf..ba5d88d3bd 100644 --- a/packages/rs-dpp/src/document/extended_document/v0/mod.rs +++ b/packages/rs-dpp/src/document/extended_document/v0/mod.rs @@ -153,6 +153,7 @@ impl ExtendedDocumentV0 { // We can unwrap because the Document can not be created without a valid Document Type self.data_contract .document_type_for_name(self.document_type_name.as_str()) + .map_err(ProtocolError::DataContractError) } pub fn can_be_modified(&self) -> Result { diff --git a/packages/rs-dpp/src/document/extended_document/v0/serialize.rs b/packages/rs-dpp/src/document/extended_document/v0/serialize.rs index 64c5f0a35d..255d49bd96 100644 --- a/packages/rs-dpp/src/document/extended_document/v0/serialize.rs +++ b/packages/rs-dpp/src/document/extended_document/v0/serialize.rs @@ -21,6 +21,8 @@ use crate::version::PlatformVersion; use integer_encoding::{VarInt, VarIntReader}; +use crate::consensus::basic::decode::DecodingError; +use crate::data_contract::errors::DataContractError; use platform_version::version::FeatureVersion; impl ExtendedDocumentPlatformSerializationMethodsV0 for ExtendedDocumentV0 { @@ -95,9 +97,11 @@ impl ExtendedDocumentPlatformDeserializationMethodsV0 for ExtendedDocumentV0 { let (document_type_name_len, rest) = serialized_document .split_first() - .ok_or(ProtocolError::DecodingError( - "error reading document type name len from serialized extended document" - .to_string(), + .ok_or(DataContractError::DecodingDocumentError( + DecodingError::new( + "error reading document type name len from serialized extended document" + .to_string(), + ), ))?; if serialized_document.len() < *document_type_name_len as usize { return Err(ProtocolError::DecodingError( diff --git a/packages/rs-dpp/src/document/serialization_traits/platform_serialization_conversion/deserialize/v0/mod.rs b/packages/rs-dpp/src/document/serialization_traits/platform_serialization_conversion/deserialize/v0/mod.rs index b832c1977c..fdf1fa37e9 100644 --- a/packages/rs-dpp/src/document/serialization_traits/platform_serialization_conversion/deserialize/v0/mod.rs +++ b/packages/rs-dpp/src/document/serialization_traits/platform_serialization_conversion/deserialize/v0/mod.rs @@ -1,4 +1,5 @@ use crate::data_contract::document_type::DocumentTypeRef; +use crate::data_contract::errors::DataContractError; use crate::ProtocolError; use platform_version::version::PlatformVersion; @@ -8,7 +9,7 @@ pub(in crate::document) trait DocumentPlatformDeserializationMethodsV0 { serialized_document: &[u8], document_type: DocumentTypeRef, platform_version: &PlatformVersion, - ) -> Result + ) -> Result where Self: Sized; } diff --git a/packages/rs-dpp/src/document/serialization_traits/platform_serialization_conversion/mod.rs b/packages/rs-dpp/src/document/serialization_traits/platform_serialization_conversion/mod.rs index 2fff26077c..e3a112c47e 100644 --- a/packages/rs-dpp/src/document/serialization_traits/platform_serialization_conversion/mod.rs +++ b/packages/rs-dpp/src/document/serialization_traits/platform_serialization_conversion/mod.rs @@ -4,6 +4,8 @@ mod v0; use crate::data_contract::document_type::DocumentTypeRef; use crate::document::{Document, DocumentV0}; +#[cfg(feature = "validation")] +use crate::prelude::ConsensusValidationResult; use crate::ProtocolError; use platform_version::version::{FeatureVersion, PlatformVersion}; pub use v0::*; @@ -73,6 +75,34 @@ impl DocumentPlatformConversionMethodsV0 for Document { }), } } + + #[cfg(feature = "validation")] + fn from_bytes_in_consensus( + serialized_document: &[u8], + document_type: DocumentTypeRef, + platform_version: &PlatformVersion, + ) -> Result, ProtocolError> + where + Self: Sized, + { + match platform_version + .dpp + .document_versions + .document_structure_version + { + 0 => Ok(DocumentV0::from_bytes_in_consensus( + serialized_document, + document_type, + platform_version, + )? + .map(|document_v0| document_v0.into())), + version => Err(ProtocolError::UnknownVersionMismatch { + method: "Document::from_bytes_in_consensus".to_string(), + known_versions: vec![0], + received: version, + }), + } + } } #[cfg(test)] diff --git a/packages/rs-dpp/src/document/serialization_traits/platform_serialization_conversion/v0/mod.rs b/packages/rs-dpp/src/document/serialization_traits/platform_serialization_conversion/v0/mod.rs index fcc676d680..f0ec01c62e 100644 --- a/packages/rs-dpp/src/document/serialization_traits/platform_serialization_conversion/v0/mod.rs +++ b/packages/rs-dpp/src/document/serialization_traits/platform_serialization_conversion/v0/mod.rs @@ -1,9 +1,10 @@ use crate::data_contract::document_type::DocumentTypeRef; +use crate::validation::ConsensusValidationResult; use crate::version::PlatformVersion; use crate::ProtocolError; use platform_version::version::FeatureVersion; -pub trait DocumentPlatformConversionMethodsV0 { +pub trait DocumentPlatformConversionMethodsV0: Clone { /// Serializes the document. /// /// The serialization of a document follows the pattern: @@ -42,6 +43,18 @@ pub trait DocumentPlatformConversionMethodsV0 { ) -> Result where Self: Sized; + + #[cfg(feature = "validation")] + /// Reads a serialized document and creates a Document from it. + /// This will return a ConsensusValidationResult instead when the error is happening + /// in consensus (deserialization of a message from the network) + fn from_bytes_in_consensus( + serialized_document: &[u8], + document_type: DocumentTypeRef, + platform_version: &PlatformVersion, + ) -> Result, ProtocolError> + where + Self: Sized; } pub trait ExtendedDocumentPlatformConversionMethodsV0 { diff --git a/packages/rs-dpp/src/document/v0/cbor_conversion.rs b/packages/rs-dpp/src/document/v0/cbor_conversion.rs index bcd4f40919..fc02148b3a 100644 --- a/packages/rs-dpp/src/document/v0/cbor_conversion.rs +++ b/packages/rs-dpp/src/document/v0/cbor_conversion.rs @@ -1,5 +1,3 @@ -use crate::data_contract::errors::StructureError; - use crate::document::property_names; use crate::identity::TimestampMillis; @@ -122,9 +120,9 @@ impl DocumentCborMethodsV0 for DocumentV0 { // we would need dedicated deserialization functions based on the document type let document_cbor_map: BTreeMap = ciborium::de::from_reader(document_cbor).map_err(|_| { - ProtocolError::StructureError(StructureError::InvalidCBOR( - "unable to decode document for document call", - )) + ProtocolError::InvalidCBOR( + "unable to decode document for document call".to_string(), + ) })?; let document_map: BTreeMap = Value::convert_from_cbor_map(document_cbor_map).map_err(ProtocolError::ValueError)?; diff --git a/packages/rs-dpp/src/document/v0/serialize.rs b/packages/rs-dpp/src/document/v0/serialize.rs index 25c833a2c5..10bca9826a 100644 --- a/packages/rs-dpp/src/document/v0/serialize.rs +++ b/packages/rs-dpp/src/document/v0/serialize.rs @@ -3,6 +3,9 @@ use crate::data_contract::errors::DataContractError; use crate::document::property_names::{CREATED_AT, UPDATED_AT}; +#[cfg(feature = "validation")] +use crate::prelude::ConsensusValidationResult; + use crate::prelude::Revision; use crate::ProtocolError; @@ -22,6 +25,9 @@ use platform_version::version::FeatureVersion; use std::collections::BTreeMap; +use crate::consensus::basic::decode::DecodingError; +use crate::consensus::basic::BasicError; +use crate::consensus::ConsensusError; use std::io::{BufReader, Read}; impl DocumentPlatformSerializationMethodsV0 for DocumentV0 { @@ -247,37 +253,39 @@ impl DocumentPlatformDeserializationMethodsV0 for DocumentV0 { serialized_document: &[u8], document_type: DocumentTypeRef, _platform_version: &PlatformVersion, - ) -> Result { + ) -> Result { let mut buf = BufReader::new(serialized_document); if serialized_document.len() < 64 { - return Err(ProtocolError::DecodingError( - "serialized document is too small, must have id and owner id".to_string(), + return Err(DataContractError::DecodingDocumentError( + DecodingError::new( + "serialized document is too small, must have id and owner id".to_string(), + ), )); } // $id let mut id = [0; 32]; buf.read_exact(&mut id).map_err(|_| { - ProtocolError::DecodingError( + DataContractError::DecodingDocumentError(DecodingError::new( "error reading from serialized document for id".to_string(), - ) + )) })?; // $ownerId let mut owner_id = [0; 32]; buf.read_exact(&mut owner_id).map_err(|_| { - ProtocolError::DecodingError( + DataContractError::DecodingDocumentError(DecodingError::new( "error reading from serialized document for owner id".to_string(), - ) + )) })?; // $revision // if the document type is mutable then we should deserialize the revision let revision: Option = if document_type.requires_revision() { let revision = buf.read_varint().map_err(|_| { - ProtocolError::DecodingError( + DataContractError::DecodingDocumentError(DecodingError::new( "error reading revision from serialized document for revision".to_string(), - ) + )) })?; Some(revision) } else { @@ -296,10 +304,8 @@ impl DocumentPlatformDeserializationMethodsV0 for DocumentV0 { .filter_map(|(key, property)| { if finished_buffer { return if property.required { - Some(Err(ProtocolError::DataContractError( - DataContractError::CorruptedSerialization( - "required field after finished buffer", - ), + Some(Err(DataContractError::CorruptedSerialization( + "required field after finished buffer".to_string(), ))) } else { None @@ -317,7 +323,7 @@ impl DocumentPlatformDeserializationMethodsV0 for DocumentV0 { Err(e) => Some(Err(e)), } }) - .collect::, ProtocolError>>()?; + .collect::, DataContractError>>()?; Ok(DocumentV0 { id: Identifier::new(id), @@ -334,12 +340,12 @@ fn read_timestamp( buf: &mut BufReader<&[u8]>, document_type: DocumentTypeRef, property_name: &str, -) -> Result, ProtocolError> { +) -> Result, DataContractError> { if !document_type.required_fields().contains(property_name) { let marker = buf.read_u8().map_err(|_| { - ProtocolError::DataContractError(DataContractError::CorruptedSerialization( - "error reading created at optional byte from serialized document", - )) + DataContractError::CorruptedSerialization( + "error reading created at optional byte from serialized document".to_string(), + ) })?; if marker == 0 { @@ -348,9 +354,9 @@ fn read_timestamp( } let timestamp = buf.read_u64::().map_err(|_| { - ProtocolError::DataContractError(DataContractError::CorruptedSerialization( - "error reading created at from serialized document", - )) + DataContractError::CorruptedSerialization( + "error reading created at from serialized document".to_string(), + ) })?; Ok(Some(timestamp)) @@ -427,12 +433,46 @@ impl DocumentPlatformConversionMethodsV0 for DocumentV0 { platform_version: &PlatformVersion, ) -> Result { let serialized_version = serialized_document.read_varint().map_err(|_| { - ProtocolError::DecodingError( + DataContractError::DecodingDocumentError(DecodingError::new( "error reading revision from serialized document for revision".to_string(), - ) + )) + })?; + match serialized_version { + 0 => DocumentV0::from_bytes_v0(serialized_document, document_type, platform_version) + .map_err(ProtocolError::DataContractError), + version => Err(ProtocolError::UnknownVersionMismatch { + method: "Document::from_bytes (deserialization)".to_string(), + known_versions: vec![0], + received: version, + }), + } + } + + /// Reads a serialized document and creates a DocumentV0 from it. + #[cfg(feature = "validation")] + fn from_bytes_in_consensus( + mut serialized_document: &[u8], + document_type: DocumentTypeRef, + platform_version: &PlatformVersion, + ) -> Result, ProtocolError> { + let serialized_version = serialized_document.read_varint().map_err(|_| { + DataContractError::DecodingDocumentError(DecodingError::new( + "error reading revision from serialized document for revision".to_string(), + )) })?; match serialized_version { - 0 => DocumentV0::from_bytes_v0(serialized_document, document_type, platform_version), + 0 => { + match DocumentV0::from_bytes_v0( + serialized_document, + document_type, + platform_version, + ) { + Ok(document) => Ok(ConsensusValidationResult::new_with_data(document)), + Err(err) => Ok(ConsensusValidationResult::new_with_error( + ConsensusError::BasicError(BasicError::ContractError(err)), + )), + } + } version => Err(ProtocolError::UnknownVersionMismatch { method: "Document::from_bytes (deserialization)".to_string(), known_versions: vec![0], diff --git a/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs b/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs index 0673649dfd..04b65dfe3c 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs @@ -9,10 +9,11 @@ use crate::consensus::basic::data_contract::{ DataContractImmutablePropertiesUpdateError, DataContractInvalidIndexDefinitionUpdateError, DataContractUniqueIndicesChangedError, DuplicateIndexError, DuplicateIndexNameError, IncompatibleDataContractSchemaError, IncompatibleRe2PatternError, InvalidCompoundIndexError, - InvalidDataContractIdError, InvalidDataContractVersionError, InvalidIndexPropertyTypeError, + InvalidDataContractIdError, InvalidDataContractVersionError, + InvalidDocumentTypeRequiredSecurityLevelError, InvalidIndexPropertyTypeError, InvalidIndexedPropertyConstraintError, InvalidJsonSchemaRefError, SystemPropertyIndexAlreadyPresentError, UndefinedIndexPropertyError, - UniqueIndicesLimitReachedError, + UniqueIndicesLimitReachedError, UnknownSecurityLevelError, UnknownStorageKeyRequirementsError, }; use crate::consensus::basic::decode::{ ProtocolVersionParsingError, SerializedObjectParsingError, VersionError, @@ -57,6 +58,7 @@ use crate::consensus::basic::json_schema_compilation_error::JsonSchemaCompilatio use crate::consensus::basic::json_schema_error::JsonSchemaError; use crate::consensus::basic::unsupported_version_error::UnsupportedVersionError; use crate::consensus::basic::value_error::ValueError; +use crate::data_contract::errors::DataContractError; #[derive(Error, Debug, PlatformSerialize, PlatformDeserialize, Encode, Decode, Clone)] pub enum BasicError { @@ -72,6 +74,15 @@ pub enum BasicError { #[error(transparent)] VersionError(VersionError), + #[error(transparent)] + ContractError(DataContractError), + + #[error(transparent)] + UnknownSecurityLevelError(UnknownSecurityLevelError), + + #[error(transparent)] + UnknownStorageKeyRequirementsError(UnknownStorageKeyRequirementsError), + #[error(transparent)] SerializedObjectParsingError(SerializedObjectParsingError), @@ -260,6 +271,9 @@ pub enum BasicError { #[error(transparent)] MissingMasterPublicKeyError(MissingMasterPublicKeyError), + #[error(transparent)] + InvalidDocumentTypeRequiredSecurityLevelError(InvalidDocumentTypeRequiredSecurityLevelError), + #[error(transparent)] InvalidIdentityPublicKeySecurityLevelError(InvalidIdentityPublicKeySecurityLevelError), diff --git a/packages/rs-dpp/src/errors/consensus/basic/data_contract/data_contract_invalid_index_definition_update_error.rs b/packages/rs-dpp/src/errors/consensus/basic/data_contract/data_contract_invalid_index_definition_update_error.rs index 5c0b8020a5..52f4633e2a 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/data_contract/data_contract_invalid_index_definition_update_error.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/data_contract/data_contract_invalid_index_definition_update_error.rs @@ -8,7 +8,7 @@ use thiserror::Error; #[derive( Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, )] -#[error("Document with type {document_type} has badly constructed index '{index_path}'. Existing properties in the indices should be defined in the beginning of it.")] +#[error("Document with type {document_type} could not add or remove '{index_path}' during data contract update as we do not allow modifications of data contract index paths")] #[platform_serialize(unversioned)] pub struct DataContractInvalidIndexDefinitionUpdateError { /* diff --git a/packages/rs-dpp/src/errors/consensus/basic/data_contract/invalid_document_type_required_security_level.rs b/packages/rs-dpp/src/errors/consensus/basic/data_contract/invalid_document_type_required_security_level.rs new file mode 100644 index 0000000000..dae65b2728 --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/basic/data_contract/invalid_document_type_required_security_level.rs @@ -0,0 +1,60 @@ +use crate::consensus::basic::BasicError; +use crate::consensus::ConsensusError; +use crate::errors::ProtocolError; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use thiserror::Error; + +use crate::identity::SecurityLevel; + +use bincode::{Decode, Encode}; +use platform_value::Identifier; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error("Invalid document type security level error security level: got {security_level:?} for {contract_id}::{document_type_name}")] +#[platform_serialize(unversioned)] +pub struct InvalidDocumentTypeRequiredSecurityLevelError { + /* + + DO NOT CHANGE ORDER OF FIELDS WITHOUT INTRODUCING OF NEW VERSION + + */ + security_level: SecurityLevel, + contract_id: Identifier, + document_type_name: String, +} + +impl InvalidDocumentTypeRequiredSecurityLevelError { + pub fn new( + security_level: SecurityLevel, + contract_id: Identifier, + document_type_name: String, + ) -> Self { + Self { + security_level, + contract_id, + document_type_name, + } + } + + pub fn security_level(&self) -> SecurityLevel { + self.security_level + } + + pub fn contract_id(&self) -> Identifier { + self.contract_id + } + + pub fn document_type_name(&self) -> &String { + &self.document_type_name + } +} + +impl From for ConsensusError { + fn from(err: InvalidDocumentTypeRequiredSecurityLevelError) -> Self { + Self::BasicError(BasicError::InvalidDocumentTypeRequiredSecurityLevelError( + err, + )) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/basic/data_contract/mod.rs b/packages/rs-dpp/src/errors/consensus/basic/data_contract/mod.rs index 2423bb0f86..eaba49c96f 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/data_contract/mod.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/data_contract/mod.rs @@ -11,12 +11,15 @@ mod incompatible_re2_pattern_error; mod invalid_compound_index_error; mod invalid_data_contract_id_error; mod invalid_data_contract_version_error; +mod invalid_document_type_required_security_level; mod invalid_index_property_type_error; mod invalid_indexed_property_constraint_error; mod invalid_json_schema_ref_error; mod system_property_index_already_present_error; mod undefined_index_property_error; mod unique_indices_limit_reached_error; +mod unknown_security_level_error; +mod unknown_storage_key_requirements_error; pub use data_contract_empty_schema_error::*; pub use data_contract_have_new_unique_index_error::*; @@ -30,6 +33,7 @@ pub use incompatible_re2_pattern_error::*; pub use invalid_compound_index_error::*; pub use invalid_data_contract_id_error::*; pub use invalid_data_contract_version_error::*; +pub use invalid_document_type_required_security_level::*; pub use invalid_index_property_type_error::*; pub use invalid_indexed_property_constraint_error::*; pub use invalid_json_schema_ref_error::*; @@ -37,3 +41,6 @@ pub use invalid_json_schema_ref_error::*; pub use system_property_index_already_present_error::*; pub use undefined_index_property_error::*; pub use unique_indices_limit_reached_error::*; + +pub use unknown_security_level_error::*; +pub use unknown_storage_key_requirements_error::*; diff --git a/packages/rs-dpp/src/errors/consensus/basic/data_contract/unknown_security_level_error.rs b/packages/rs-dpp/src/errors/consensus/basic/data_contract/unknown_security_level_error.rs new file mode 100644 index 0000000000..325c564110 --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/basic/data_contract/unknown_security_level_error.rs @@ -0,0 +1,47 @@ +use crate::consensus::basic::BasicError; +use crate::consensus::ConsensusError; +use crate::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error( + "Unrecognized security level: allowed {:?}, got {}", + allowed_values, + received +)] +#[platform_serialize(unversioned)] +pub struct UnknownSecurityLevelError { + /* + + DO NOT CHANGE ORDER OF FIELDS WITHOUT INTRODUCING OF NEW VERSION + + */ + allowed_values: Vec, + received: u8, +} + +impl UnknownSecurityLevelError { + pub fn new(allowed_values: Vec, received: u8) -> Self { + Self { + allowed_values, + received, + } + } + + pub fn allowed_values(&self) -> Vec { + self.allowed_values.clone() + } + pub fn received(&self) -> u8 { + self.received + } +} + +impl From for ConsensusError { + fn from(err: UnknownSecurityLevelError) -> Self { + Self::BasicError(BasicError::UnknownSecurityLevelError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/basic/data_contract/unknown_storage_key_requirements_error.rs b/packages/rs-dpp/src/errors/consensus/basic/data_contract/unknown_storage_key_requirements_error.rs new file mode 100644 index 0000000000..82d00e7037 --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/basic/data_contract/unknown_storage_key_requirements_error.rs @@ -0,0 +1,47 @@ +use crate::consensus::basic::BasicError; +use crate::consensus::ConsensusError; +use crate::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error( + "Unrecognized storage key requirements: allowed {:?}, got {}", + allowed_values, + received +)] +#[platform_serialize(unversioned)] +pub struct UnknownStorageKeyRequirementsError { + /* + + DO NOT CHANGE ORDER OF FIELDS WITHOUT INTRODUCING OF NEW VERSION + + */ + allowed_values: Vec, + received: i128, +} + +impl UnknownStorageKeyRequirementsError { + pub fn new(allowed_values: Vec, received: i128) -> Self { + Self { + allowed_values, + received, + } + } + + pub fn allowed_values(&self) -> Vec { + self.allowed_values.clone() + } + pub fn received(&self) -> i128 { + self.received + } +} + +impl From for ConsensusError { + fn from(err: UnknownStorageKeyRequirementsError) -> Self { + Self::BasicError(BasicError::UnknownStorageKeyRequirementsError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/basic/decode/decoding_error.rs b/packages/rs-dpp/src/errors/consensus/basic/decode/decoding_error.rs new file mode 100644 index 0000000000..2fe833be13 --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/basic/decode/decoding_error.rs @@ -0,0 +1,44 @@ +use crate::consensus::basic::BasicError; +use crate::errors::ProtocolError; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use thiserror::Error; + +use crate::consensus::ConsensusError; +use crate::data_contract::errors::DataContractError; +use bincode::{Decode, Encode}; + +#[derive(Error, Debug, Clone, Encode, Decode, PlatformSerialize, PlatformDeserialize)] +#[error("Decoding error: {error}")] +#[platform_serialize(unversioned)] +pub struct DecodingError { + /* + + DO NOT CHANGE ORDER OF FIELDS WITHOUT INTRODUCING OF NEW VERSION + + */ + error: String, +} + +impl DecodingError { + pub fn new(error: String) -> Self { + Self { error } + } + + pub fn error(&self) -> &str { + &self.error + } +} + +impl From for ConsensusError { + fn from(err: DecodingError) -> Self { + Self::BasicError(BasicError::ContractError( + DataContractError::DecodingContractError(err), + )) + } +} + +impl From for DataContractError { + fn from(err: DecodingError) -> Self { + Self::DecodingContractError(err) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/basic/decode/mod.rs b/packages/rs-dpp/src/errors/consensus/basic/decode/mod.rs index 115329f17c..68796ee211 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/decode/mod.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/decode/mod.rs @@ -1,7 +1,9 @@ +mod decoding_error; mod protocol_version_parsing_error; mod serialized_object_parsing_error; mod version_error; +pub use decoding_error::*; pub use protocol_version_parsing_error::*; pub use serialized_object_parsing_error::*; pub use version_error::*; diff --git a/packages/rs-dpp/src/errors/consensus/basic/value_error.rs b/packages/rs-dpp/src/errors/consensus/basic/value_error.rs index ce787a06d7..3c7c6550fa 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/value_error.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/value_error.rs @@ -1,6 +1,6 @@ use crate::consensus::basic::BasicError; use crate::consensus::ConsensusError; -use crate::errors::ProtocolError; +use crate::ProtocolError; use bincode::{Decode, Encode}; use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; use platform_value::Error as PlatformValueError; @@ -36,3 +36,9 @@ impl From for ConsensusError { Self::BasicError(BasicError::ValueError(err)) } } + +impl From for ValueError { + fn from(err: PlatformValueError) -> Self { + ValueError::new(err) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/codes.rs b/packages/rs-dpp/src/errors/consensus/codes.rs index 151744c457..9b0108d97d 100644 --- a/packages/rs-dpp/src/errors/consensus/codes.rs +++ b/packages/rs-dpp/src/errors/consensus/codes.rs @@ -1,6 +1,7 @@ use crate::consensus::signature::SignatureError; #[cfg(feature = "state-transition-validation")] use crate::consensus::state::data_trigger::DataTriggerError; +use crate::data_contract::errors::DataContractError; use crate::errors::consensus::{ basic::BasicError, fee::fee_error::FeeError, state::state_error::StateError, ConsensusError, @@ -64,6 +65,30 @@ impl ErrorWithCode for BasicError { Self::DataContractUniqueIndicesChangedError { .. } => 1053, Self::DataContractInvalidIndexDefinitionUpdateError { .. } => 1054, Self::DataContractHaveNewUniqueIndexError { .. } => 1055, + Self::InvalidDocumentTypeRequiredSecurityLevelError { .. } => 1071, + Self::UnknownSecurityLevelError { .. } => 1072, + Self::UnknownStorageKeyRequirementsError { .. } => 1073, + Self::ContractError(DataContractError::DecodingContractError { .. }) => 1074, + Self::ContractError(DataContractError::DecodingDocumentError { .. }) => 1076, + Self::ContractError(DataContractError::InvalidDocumentTypeError { .. }) => 1077, + Self::ContractError(DataContractError::MissingRequiredKey(_)) => 1078, + Self::ContractError(DataContractError::FieldRequirementUnmet(_)) => 1079, + Self::ContractError(DataContractError::KeyWrongType(_)) => 1080, + Self::ContractError(DataContractError::ValueWrongType(_)) => 1081, + Self::ContractError(DataContractError::ValueDecodingError(_)) => 1082, + Self::ContractError(DataContractError::EncodingDataStructureNotSupported(_)) => 1083, + Self::ContractError(DataContractError::InvalidContractStructure(_)) => 1084, + Self::ContractError(DataContractError::DocumentTypeNotFound(_)) => 1085, + Self::ContractError(DataContractError::DocumentTypeFieldNotFound(_)) => 1086, + Self::ContractError(DataContractError::ReferenceDefinitionNotFound(_)) => 1087, + Self::ContractError(DataContractError::DocumentOwnerIdMissing(_)) => 1088, + Self::ContractError(DataContractError::DocumentIdMissing(_)) => 1089, + Self::ContractError(DataContractError::Unsupported(_)) => 1090, + Self::ContractError(DataContractError::CorruptedSerialization(_)) => 1091, + Self::ContractError(DataContractError::JsonSchema(_)) => 1092, + Self::ContractError(DataContractError::InvalidURI(_)) => 1093, + Self::ContractError(DataContractError::KeyWrongBounds(_)) => 1094, + Self::ContractError(DataContractError::KeyValueMustExist(_)) => 1095, // Document Self::DataContractNotPresentError { .. } => 1018, @@ -164,7 +189,7 @@ impl ErrorWithCode for StateError { Self::DocumentTimestampWindowViolationError { .. } => 4008, Self::DuplicateUniqueIndexError { .. } => 4009, Self::InvalidDocumentRevisionError { .. } => 4010, - Self::DocumentTimestampsAreEqualError(_) => 4025, + Self::DocumentTimestampsAreEqualError(_) => 4031, // Identity Self::IdentityAlreadyExistsError(_) => 4011, @@ -181,6 +206,7 @@ impl ErrorWithCode for StateError { Self::IdentityInsufficientBalanceError(_) => 4026, Self::IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError(_) => 4028, Self::InvalidAssetLockProofValueError(_) => 4029, + Self::DocumentTypeUpdateError(_) => 4030, } } } diff --git a/packages/rs-dpp/src/errors/consensus/state/data_contract/document_type_update_error.rs b/packages/rs-dpp/src/errors/consensus/state/data_contract/document_type_update_error.rs new file mode 100644 index 0000000000..26d56ad916 --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/state/data_contract/document_type_update_error.rs @@ -0,0 +1,54 @@ +use crate::consensus::state::state_error::StateError; +use crate::consensus::ConsensusError; +use crate::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use platform_value::Identifier; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error("Can't update Document Type {data_contract_id}::{document_type_name} config: {additional_message}")] +#[platform_serialize(unversioned)] +pub struct DocumentTypeUpdateError { + /* + + DO NOT CHANGE ORDER OF FIELDS WITHOUT INTRODUCING OF NEW VERSION + + */ + data_contract_id: Identifier, + document_type_name: String, + additional_message: String, +} + +impl DocumentTypeUpdateError { + pub fn new( + data_contract_id: Identifier, + document_type_name: impl Into, + additional_message: impl Into, + ) -> Self { + Self { + data_contract_id, + document_type_name: document_type_name.into(), + additional_message: additional_message.into(), + } + } + + pub fn data_contract_id(&self) -> &Identifier { + &self.data_contract_id + } + + pub fn document_type_name(&self) -> &String { + &self.document_type_name + } + pub fn additional_message(&self) -> &str { + &self.additional_message + } +} + +impl From for ConsensusError { + fn from(err: DocumentTypeUpdateError) -> Self { + Self::StateError(StateError::DocumentTypeUpdateError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/state/data_contract/mod.rs b/packages/rs-dpp/src/errors/consensus/state/data_contract/mod.rs index fe67475ed8..0cd2bfeb82 100644 --- a/packages/rs-dpp/src/errors/consensus/state/data_contract/mod.rs +++ b/packages/rs-dpp/src/errors/consensus/state/data_contract/mod.rs @@ -1,3 +1,4 @@ pub mod data_contract_already_present_error; pub mod data_contract_config_update_error; pub mod data_contract_is_readonly_error; +pub mod document_type_update_error; diff --git a/packages/rs-dpp/src/errors/consensus/state/state_error.rs b/packages/rs-dpp/src/errors/consensus/state/state_error.rs index 7c2b957563..49bbcf73c6 100644 --- a/packages/rs-dpp/src/errors/consensus/state/state_error.rs +++ b/packages/rs-dpp/src/errors/consensus/state/state_error.rs @@ -28,6 +28,7 @@ use crate::consensus::state::identity::{ IdentityAlreadyExistsError, IdentityInsufficientBalanceError, }; use crate::consensus::ConsensusError; +use crate::consensus::state::data_contract::document_type_update_error::DocumentTypeUpdateError; use crate::consensus::state::identity::identity_public_key_already_exists_for_unique_contract_bounds_error::IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError; use crate::consensus::state::identity::invalid_asset_lock_proof_value::InvalidAssetLockProofValueError; use crate::consensus::state::identity::invalid_identity_contract_nonce_error::InvalidIdentityNonceError; @@ -125,6 +126,9 @@ pub enum StateError { #[error(transparent)] DataContractConfigUpdateError(DataContractConfigUpdateError), + + #[error(transparent)] + DocumentTypeUpdateError(DocumentTypeUpdateError), } impl From for ConsensusError { diff --git a/packages/rs-dpp/src/errors/protocol_error.rs b/packages/rs-dpp/src/errors/protocol_error.rs index 579f0faea5..4f8b4dec40 100644 --- a/packages/rs-dpp/src/errors/protocol_error.rs +++ b/packages/rs-dpp/src/errors/protocol_error.rs @@ -89,9 +89,6 @@ pub enum ProtocolError { #[error("Invalid key contract bounds error {0}")] InvalidKeyContractBoundsError(String), - #[error("unknown storage key requirements {0}")] - UnknownStorageKeyRequirements(String), - #[error(transparent)] DataContractError(#[from] DataContractError), @@ -102,9 +99,6 @@ pub enum ProtocolError { #[error("Invalid State Transition Type: {0}")] InvalidStateTransitionType(String), - #[error(transparent)] - StructureError(#[from] StructureError), - #[error(transparent)] PlatformVersionError(#[from] PlatformVersionError), @@ -150,13 +144,6 @@ pub enum ProtocolError { #[error(transparent)] CompatibleProtocolVersionIsNotDefinedError(#[from] CompatibleProtocolVersionIsNotDefinedError), - // Data Contract - #[error("Data Contract already exists")] - DataContractAlreadyExistsError, - - #[error(transparent)] - InvalidDataContractError(InvalidDataContractError), - #[error(transparent)] InvalidDocumentTypeError(InvalidDocumentTypeError), @@ -219,6 +206,10 @@ pub enum ProtocolError { #[error(transparent)] InvalidVectorSizeError(InvalidVectorSizeError), + + /// Invalid CBOR error + #[error("invalid cbor error: {0}")] + InvalidCBOR(String), } impl From<&str> for ProtocolError { diff --git a/packages/rs-dpp/src/identity/identity_public_key/security_level.rs b/packages/rs-dpp/src/identity/identity_public_key/security_level.rs index c0abe76f76..978134016b 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/security_level.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/security_level.rs @@ -1,10 +1,13 @@ -use anyhow::bail; use bincode::{Decode, Encode}; #[cfg(feature = "cbor")] use ciborium::value::Value as CborValue; use serde_repr::{Deserialize_repr, Serialize_repr}; +use crate::consensus::basic::data_contract::UnknownSecurityLevelError; +use crate::consensus::basic::BasicError; +use crate::consensus::ConsensusError; +use crate::ProtocolError; use std::convert::TryFrom; #[repr(u8)] @@ -25,9 +28,9 @@ use std::convert::TryFrom; strum::EnumIter, )] pub enum SecurityLevel { - #[default] MASTER = 0, CRITICAL = 1, + #[default] HIGH = 2, MEDIUM = 3, } @@ -40,14 +43,19 @@ impl Into for SecurityLevel { } impl TryFrom for SecurityLevel { - type Error = anyhow::Error; - fn try_from(value: u8) -> Result { + type Error = ProtocolError; + fn try_from(value: u8) -> Result { match value { 0 => Ok(Self::MASTER), 1 => Ok(Self::CRITICAL), 2 => Ok(Self::HIGH), 3 => Ok(Self::MEDIUM), - value => bail!("unrecognized security level: {}", value), + value => Err(ProtocolError::ConsensusError( + ConsensusError::BasicError(BasicError::UnknownSecurityLevelError( + UnknownSecurityLevelError::new(vec![0, 1, 2, 3], value), + )) + .into(), + )), } } } @@ -66,6 +74,19 @@ impl SecurityLevel { pub fn highest_level() -> SecurityLevel { Self::MASTER } + pub fn stronger_security_than(self: SecurityLevel, rhs: SecurityLevel) -> bool { + // Example: + // self: High 2 rhs: Master 0 + // Master has a stronger security level than high + // We expect False + // High < Master + // 2 < 0 <=> false + (self as u8) < (rhs as u8) + } + + pub fn stronger_or_equal_security_than(self: SecurityLevel, rhs: SecurityLevel) -> bool { + (self as u8) <= (rhs as u8) + } } impl std::fmt::Display for SecurityLevel { diff --git a/packages/rs-dpp/src/util/json_schema.rs b/packages/rs-dpp/src/util/json_schema.rs index 60103f715c..41e390c7f6 100644 --- a/packages/rs-dpp/src/util/json_schema.rs +++ b/packages/rs-dpp/src/util/json_schema.rs @@ -2,7 +2,8 @@ use anyhow::{anyhow, bail}; use platform_value::Value; use serde_json::Value as JsonValue; -use crate::{identifier, ProtocolError}; +use crate::data_contract::errors::DataContractError; +use crate::identifier; pub trait JsonSchemaExt { /// returns true if json value contains property 'type`, and it equals 'object' @@ -25,17 +26,15 @@ pub trait JsonSchemaExt { fn is_type_of_identifier(&self) -> bool; } -pub fn resolve_uri<'a>(value: &'a Value, uri: &str) -> Result<&'a Value, ProtocolError> { +pub fn resolve_uri<'a>(value: &'a Value, uri: &str) -> Result<&'a Value, DataContractError> { if !uri.starts_with("#/") { - return Err(ProtocolError::Generic( - "only local references are allowed".to_string(), + return Err(DataContractError::InvalidURI( + "only local uri references are allowed".to_string(), )); } let string_path = uri.strip_prefix("#/").unwrap().replace('/', "."); - value - .get_value_at_path(&string_path) - .map_err(ProtocolError::ValueError) + value.get_value_at_path(&string_path).map_err(|e| e.into()) } impl JsonSchemaExt for JsonValue { diff --git a/packages/rs-drive-abci/src/error/mod.rs b/packages/rs-drive-abci/src/error/mod.rs index 27300dc32c..3bf2c4aa97 100644 --- a/packages/rs-drive-abci/src/error/mod.rs +++ b/packages/rs-drive-abci/src/error/mod.rs @@ -4,6 +4,7 @@ use crate::error::serialization::SerializationError; use crate::logging; use dashcore_rpc::Error as CoreRpcError; use dpp::bls_signatures::BlsError; +use dpp::data_contract::errors::DataContractError; use dpp::platform_value::Error as ValueError; use dpp::version::PlatformVersionError; use drive::dpp::ProtocolError; @@ -61,6 +62,12 @@ impl From for Error { } } +impl From for Error { + fn from(value: DataContractError) -> Self { + Self::Protocol(ProtocolError::DataContractError(value)) + } +} + impl From for Error { fn from(value: ValueError) -> Self { let platform_error: ProtocolError = value.into(); diff --git a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs index 387e4b2947..5f40d10654 100644 --- a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs @@ -162,7 +162,7 @@ mod tests { use dpp::dashcore::secp256k1::Secp256k1; use dpp::dashcore::{key::KeyPair, signer, Network, PrivateKey}; - use dpp::data_contract::accessors::v0::DataContractV0Getters; + use dpp::data_contract::accessors::v0::{DataContractV0Getters, DataContractV0Setters}; use dpp::data_contract::document_type::random_document::{ CreateRandomDocument, DocumentFieldFillSize, DocumentFieldFillType, }; @@ -187,11 +187,15 @@ mod tests { use dpp::state_transition::public_key_in_creation::v0::IdentityPublicKeyInCreationV0; use dpp::state_transition::public_key_in_creation::IdentityPublicKeyInCreation; use dpp::state_transition::{StateTransition, StateTransitionLike}; - use dpp::tests::fixtures::{get_dashpay_contract_fixture, instant_asset_lock_proof_fixture}; + use dpp::tests::fixtures::{ + get_dashpay_contract_fixture, get_dpns_data_contract_fixture, + instant_asset_lock_proof_fixture, + }; use dpp::version::PlatformVersion; use dpp::NativeBlsModule; use crate::execution::check_tx::CheckTxLevel::{FirstTimeCheck, Recheck}; + use dpp::consensus::state::state_error::StateError; use dpp::data_contract::document_type::v0::random_document_type::{ FieldMinMaxBounds, FieldTypeWeights, RandomDocumentTypeParameters, }; @@ -199,9 +203,10 @@ mod tests { use dpp::data_contract::document_type::DocumentType; use dpp::identity::contract_bounds::ContractBounds::SingleContractDocumentType; use dpp::platform_value::Bytes32; + use dpp::state_transition::data_contract_update_transition::DataContractUpdateTransition; use dpp::system_data_contracts::dashpay_contract; use dpp::system_data_contracts::SystemDataContract::Dashpay; - use platform_version::TryIntoPlatformVersioned; + use platform_version::{TryFromPlatformVersioned, TryIntoPlatformVersioned}; use rand::rngs::StdRng; use rand::SeedableRng; use std::collections::BTreeMap; @@ -396,7 +401,7 @@ mod tests { ) .expect("expected to process state transition"); - assert_eq!(processing_result.aggregated_fees().processing_fee, 2604790); + assert_eq!(processing_result.aggregated_fees().processing_fee, 2796590); let check_result = platform .check_tx( @@ -425,7 +430,12 @@ mod tests { ) .expect("expected to check tx"); - assert!(check_result.is_valid()); // it should still be valid, because we don't validate state + assert!(!check_result.is_valid()); // it should no longer be valid, because of the nonce check + + assert!(matches!( + check_result.errors.first().expect("expected an error"), + ConsensusError::StateError(StateError::InvalidIdentityNonceError(_)) + )); } #[test] @@ -611,7 +621,12 @@ mod tests { ) .expect("expected to check tx"); - assert!(check_result.is_valid()); // it should still be valid, because we don't validate state + assert!(!check_result.is_valid()); // it should no longer be valid, because of the nonce check + + assert!(matches!( + check_result.errors.first().expect("expected an error"), + ConsensusError::StateError(StateError::InvalidIdentityNonceError(_)) + )); } #[test] @@ -719,7 +734,7 @@ mod tests { // since a fee multiplier of 100 means 100% more of 1 (gives 2) assert_eq!( processing_result.aggregated_fees().processing_fee, - 2604790 * 2 + 2796590 * 2 ); let check_result = platform @@ -751,9 +766,12 @@ mod tests { ) .expect("expected to check tx"); - assert!(check_result.is_valid()); // it should still be valid, because we don't validate state + assert!(!check_result.is_valid()); // it should no longer be valid, because of the nonce check - assert_eq!(check_result.data.unwrap().priority, 10000); + assert!(matches!( + check_result.errors.first().expect("expected an error"), + ConsensusError::StateError(StateError::InvalidIdentityNonceError(_)) + )); } #[test] @@ -880,6 +898,432 @@ mod tests { assert!(!check_result.is_valid()); // the identity shouldn't have enough balance anymore } + #[test] + fn data_contract_update_check_tx() { + let mut platform = TestPlatformBuilder::new() + .with_config(PlatformConfig::default()) + .build_with_mock_rpc(); + + platform + .core_rpc + .expect_verify_instant_lock() + .returning(|_, _| Ok(true)); + + let platform_state = platform.state.load(); + let protocol_version = platform_state.current_protocol_version_in_consensus(); + let platform_version = PlatformVersion::get(protocol_version).unwrap(); + + let (key, private_key) = IdentityPublicKey::random_ecdsa_critical_level_authentication_key( + 1, + Some(1), + platform_version, + ) + .expect("expected to get key pair"); + + platform + .drive + .create_initial_state_structure(None, platform_version) + .expect("expected to create state structure"); + let identity: Identity = IdentityV0 { + id: Identifier::new([ + 158, 113, 180, 126, 91, 83, 62, 44, 83, 54, 97, 88, 240, 215, 84, 139, 167, 156, + 166, 203, 222, 4, 64, 31, 215, 199, 149, 151, 190, 246, 251, 44, + ]), + public_keys: BTreeMap::from([(1, key.clone())]), + balance: 1000000000, + revision: 0, + } + .into(); + + let dashpay_created_contract = + get_dashpay_contract_fixture(Some(identity.id()), 1, protocol_version); + let mut modified_dashpay_contract = dashpay_created_contract.data_contract().clone(); + let mut create_contract_state_transition: StateTransition = dashpay_created_contract + .try_into_platform_versioned(platform_version) + .expect("expected a state transition"); + create_contract_state_transition + .sign(&key, private_key.as_slice(), &NativeBlsModule) + .expect("expected to sign transition"); + let serialized = create_contract_state_transition + .serialize_to_bytes() + .expect("serialized state transition"); + platform + .drive + .add_new_identity( + identity.clone(), + false, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to insert identity"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![serialized.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 2796590); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit"); + + // Now let's do the data contract update + let _dashpay_id = modified_dashpay_contract.id(); + // we need to alter dashpay to make it invalid + + modified_dashpay_contract.set_version(2); + + let document_types = modified_dashpay_contract.document_types_mut(); + + let dpns_contract = + get_dpns_data_contract_fixture(Some(identity.id()), 1, protocol_version) + .data_contract_owned(); + + document_types.insert( + "preorder".to_string(), + dpns_contract + .document_type_for_name("preorder") + .expect("expected document type") + .to_owned_document_type(), + ); + + let mut update_contract_state_transition: StateTransition = + DataContractUpdateTransition::try_from_platform_versioned( + (modified_dashpay_contract, 2), + platform_version, + ) + .expect("expected a state transition") + .into(); + + update_contract_state_transition + .sign(&key, private_key.as_slice(), &NativeBlsModule) + .expect("expected to sign transition"); + let serialized_update = update_contract_state_transition + .serialize_to_bytes() + .expect("serialized state transition"); + + let validation_result = platform + .check_tx( + serialized_update.as_slice(), + FirstTimeCheck, + &platform_state, + platform_version, + ) + .expect("expected to check tx"); + + assert!(validation_result.errors.is_empty()); + + let check_result = platform + .check_tx( + serialized_update.as_slice(), + Recheck, + &platform_state, + platform_version, + ) + .expect("expected to check tx"); + + assert!(check_result.is_valid()); + + let transaction = platform.drive.grove.start_transaction(); + + let update_processing_result = platform + .platform + .process_raw_state_transitions( + &vec![serialized_update.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + // We have one invalid paid for state transition + assert_eq!(update_processing_result.valid_count(), 1); + + assert_eq!( + update_processing_result.aggregated_fees().processing_fee, + 5704920 + ); + + let check_result = platform + .check_tx( + serialized_update.as_slice(), + Recheck, + &platform_state, + platform_version, + ) + .expect("expected to check tx"); + + assert!(check_result.is_valid()); // it should still be valid, because we didn't commit the transaction + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit"); + + let check_result = platform + .check_tx( + serialized_update.as_slice(), + Recheck, + &platform_state, + platform_version, + ) + .expect("expected to check tx"); + + assert!(!check_result.is_valid()); // it should no longer be valid, because of the nonce check + + assert!(matches!( + check_result.errors.first().expect("expected an error"), + ConsensusError::StateError(StateError::InvalidIdentityNonceError(_)) + )); + } + + #[test] + fn data_contract_update_check_tx_for_invalid_update() { + let mut platform = TestPlatformBuilder::new() + .with_config(PlatformConfig::default()) + .build_with_mock_rpc(); + + platform + .core_rpc + .expect_verify_instant_lock() + .returning(|_, _| Ok(true)); + + let platform_state = platform.state.load(); + let protocol_version = platform_state.current_protocol_version_in_consensus(); + let platform_version = PlatformVersion::get(protocol_version).unwrap(); + + let (key, private_key) = IdentityPublicKey::random_ecdsa_critical_level_authentication_key( + 1, + Some(1), + platform_version, + ) + .expect("expected to get key pair"); + + platform + .drive + .create_initial_state_structure(None, platform_version) + .expect("expected to create state structure"); + let identity: Identity = IdentityV0 { + id: Identifier::new([ + 158, 113, 180, 126, 91, 83, 62, 44, 83, 54, 97, 88, 240, 215, 84, 139, 167, 156, + 166, 203, 222, 4, 64, 31, 215, 199, 149, 151, 190, 246, 251, 44, + ]), + public_keys: BTreeMap::from([(1, key.clone())]), + balance: 1000000000, + revision: 0, + } + .into(); + + let dashpay_created_contract = + get_dashpay_contract_fixture(Some(identity.id()), 1, protocol_version); + let mut modified_dashpay_contract = dashpay_created_contract.data_contract().clone(); + let mut create_contract_state_transition: StateTransition = dashpay_created_contract + .try_into_platform_versioned(platform_version) + .expect("expected a state transition"); + create_contract_state_transition + .sign(&key, private_key.as_slice(), &NativeBlsModule) + .expect("expected to sign transition"); + let serialized = create_contract_state_transition + .serialize_to_bytes() + .expect("serialized state transition"); + platform + .drive + .add_new_identity( + identity, + false, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to insert identity"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![serialized.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 2796590); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit"); + + // Now let's do the data contract update + let dashpay_id = modified_dashpay_contract.id(); + // we need to alter dashpay to make it invalid + + let document_types = modified_dashpay_contract.document_types_mut(); + + let parameters = RandomDocumentTypeParameters { + new_fields_optional_count_range: 5..6, + new_fields_required_count_range: 3..4, + new_indexes_count_range: Default::default(), + field_weights: FieldTypeWeights { + string_weight: 5, + float_weight: 3, + integer_weight: 2, + date_weight: 0, + boolean_weight: 1, + byte_array_weight: 0, + }, + field_bounds: FieldMinMaxBounds { + string_min_len: Default::default(), + string_has_min_len_chance: 0.0, + string_max_len: Default::default(), + string_has_max_len_chance: 0.0, + integer_min: Default::default(), + integer_has_min_chance: 0.0, + integer_max: Default::default(), + integer_has_max_chance: 0.0, + float_min: Default::default(), + float_has_min_chance: 0.0, + float_max: Default::default(), + float_has_max_chance: 0.0, + date_min: 0, + date_max: 100, + byte_array_min_len: Default::default(), + byte_array_has_min_len_chance: 0.0, + byte_array_max_len: Default::default(), + byte_array_has_max_len_chance: 0.0, + }, + keep_history_chance: 0.0, + documents_mutable_chance: 0.0, + }; + + let mut rng = StdRng::seed_from_u64(6); + + document_types.insert( + "invalid".to_string(), + DocumentType::V0( + DocumentTypeV0::invalid_random_document_type( + parameters, + dashpay_id, + &mut rng, + platform_version, + ) + .expect("expected an invalid document type"), + ), + ); + + let mut update_contract_state_transition: StateTransition = + DataContractUpdateTransition::try_from_platform_versioned( + (modified_dashpay_contract, 2), + platform_version, + ) + .expect("expected a state transition") + .into(); + + update_contract_state_transition + .sign(&key, private_key.as_slice(), &NativeBlsModule) + .expect("expected to sign transition"); + let serialized_update = update_contract_state_transition + .serialize_to_bytes() + .expect("serialized state transition"); + + let validation_result = platform + .check_tx( + serialized_update.as_slice(), + FirstTimeCheck, + &platform_state, + platform_version, + ) + .expect("expected to check tx"); + + assert!(validation_result.errors.is_empty()); + + let check_result = platform + .check_tx( + serialized_update.as_slice(), + Recheck, + &platform_state, + platform_version, + ) + .expect("expected to check tx"); + + assert!(check_result.is_valid()); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![serialized_update.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + // We have one invalid paid for state transition + assert_eq!(processing_result.invalid_paid_count(), 1); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 1127060); + + let check_result = platform + .check_tx( + serialized_update.as_slice(), + Recheck, + &platform_state, + platform_version, + ) + .expect("expected to check tx"); + + assert!(check_result.is_valid()); // it should still be valid, because we didn't commit the transaction + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit"); + + let check_result = platform + .check_tx( + serialized_update.as_slice(), + Recheck, + &platform_state, + platform_version, + ) + .expect("expected to check tx"); + + assert!(!check_result.is_valid()); // it should no longer be valid, because of the nonce check + + assert!(matches!( + check_result.errors.first().expect("expected an error"), + ConsensusError::StateError(StateError::InvalidIdentityNonceError(_)) + )); + } + #[test] fn document_update_check_tx() { let mut platform = TestPlatformBuilder::new() @@ -987,7 +1431,7 @@ mod tests { profile, entropy.0, &key, - 1, + 2, 0, &signer, platform_version, @@ -1006,7 +1450,7 @@ mod tests { altered_document, profile, &key, - 2, + 3, 0, &signer, platform_version, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs index 1ff3545a76..aecac82af5 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs @@ -49,30 +49,34 @@ pub(super) fn state_transition_to_execution_event_for_check_tx_v0<'a, C: CoreRPC platform_version, )?; - // First we validate the basic structure - let result = state_transition.validate_basic_structure(platform_version)?; + if state_transition.has_basic_structure_validation() { + // First we validate the basic structure + let result = state_transition.validate_basic_structure(platform_version)?; - if !result.is_valid() { - return Ok( - ConsensusValidationResult::>::new_with_errors( - result.errors, - ), - ); + if !result.is_valid() { + return Ok( + ConsensusValidationResult::>::new_with_errors( + result.errors, + ), + ); + } } - let result = state_transition.validate_nonces( - &platform.into(), - platform.state.last_block_info(), - None, - platform_version, - )?; + if state_transition.has_nonces_validation() { + let result = state_transition.validate_nonces( + &platform.into(), + platform.state.last_block_info(), + None, + platform_version, + )?; - if !result.is_valid() { - return Ok( - ConsensusValidationResult::>::new_with_errors( - result.errors, - ), - ); + if !result.is_valid() { + return Ok( + ConsensusValidationResult::>::new_with_errors( + result.errors, + ), + ); + } } let action = if state_transition.requires_advance_structure_validation_from_state() @@ -90,12 +94,12 @@ pub(super) fn state_transition_to_execution_event_for_check_tx_v0<'a, C: CoreRPC ), ); } - let action = Some(state_transition_action_result.into_data()?); + let action = state_transition_action_result.into_data()?; // Validating structure let result = state_transition.validate_advanced_structure_from_state( &platform.into(), - action.as_ref(), + &action, platform_version, )?; @@ -106,7 +110,7 @@ pub(super) fn state_transition_to_execution_event_for_check_tx_v0<'a, C: CoreRPC ), ); } - action + Some(action) } else { None }; @@ -157,20 +161,22 @@ pub(super) fn state_transition_to_execution_event_for_check_tx_v0<'a, C: CoreRPC } let mut maybe_identity = result.into_data()?; - let result = state_transition.validate_balance( - maybe_identity.as_mut(), - &platform.into(), - platform.state.last_block_info(), - None, - platform_version, - )?; + if state_transition.has_balance_validation() { + let result = state_transition.validate_balance( + maybe_identity.as_mut(), + &platform.into(), + platform.state.last_block_info(), + None, + platform_version, + )?; - if !result.is_valid() { - return Ok( - ConsensusValidationResult::>::new_with_errors( - result.errors, - ), - ); + if !result.is_valid() { + return Ok( + ConsensusValidationResult::>::new_with_errors( + result.errors, + ), + ); + } } let action = if let Some(action) = action { @@ -223,6 +229,23 @@ pub(super) fn state_transition_to_execution_event_for_check_tx_v0<'a, C: CoreRPC ) } } else { + if state_transition.has_nonces_validation() { + let result = state_transition.validate_nonces( + &platform.into(), + platform.state.last_block_info(), + None, + platform_version, + )?; + + if !result.is_valid() { + return Ok( + ConsensusValidationResult::>::new_with_errors( + result.errors, + ), + ); + } + } + // TODO: We aren't calculating processing fees atm. We probably should reconsider this let mut state_transition_execution_context = diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs index a4dc72983e..5a59d37228 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs @@ -62,53 +62,74 @@ pub(in crate::execution) fn process_state_transition_v0<'a, C: CoreRPCLike>( )?; if !result.is_valid() { + // If the signature is not valid we do not have the user pay for the state transition + // Since it is most likely not from them + // Proposers should remove such transactions from the block + // Other validators should reject blocks with such transactions return Ok(ConsensusValidationResult::::new_with_errors(result.errors)); } let mut maybe_identity = result.into_data()?; - // Validating identity contract nonce, this must happen after validating the signature - let result = state_transition.validate_nonces( - &platform.into(), - platform.state.last_block_info(), - transaction, - platform_version, - )?; + if state_transition.has_nonces_validation() { + // Validating identity contract nonce, this must happen after validating the signature + let result = state_transition.validate_nonces( + &platform.into(), + platform.state.last_block_info(), + transaction, + platform_version, + )?; - if !result.is_valid() { - return Ok(ConsensusValidationResult::::new_with_errors(result.errors)); + if !result.is_valid() { + // If the nonce is not valid the state transition is not paid for, most likely because + // this is just a replayed block + // Proposers should remove such transactions from the block + // Other validators should reject blocks with such transactions + return Ok(ConsensusValidationResult::::new_with_errors(result.errors)); + } } - // We validate basic structure validation after verifying the identity, - // this is structure validation that does not require state and is already checked on check_tx - let consensus_result = state_transition.validate_basic_structure(platform_version)?; - - if !consensus_result.is_valid() { - return Ok( - ConsensusValidationResult::::new_with_errors(consensus_result.errors), - ); + if state_transition.has_basic_structure_validation() { + // We validate basic structure validation after verifying the identity, + // this is structure validation that does not require state and is already checked on check_tx + let consensus_result = state_transition.validate_basic_structure(platform_version)?; + + if !consensus_result.is_valid() { + // Basic structure validation is extremely cheap to process, because of this attacks are + // not likely. + // Often the basic structure validation is necessary for estimated costs + // Proposers should remove such transactions from the block + // Other validators should reject blocks with such transactions + return Ok( + ConsensusValidationResult::::new_with_errors( + consensus_result.errors, + ), + ); + } } - // Next we have advanced structure validation, this is structure validation that does not require - // state but isn't checked on check_tx. If advanced structure fails identity nonces or identity - // contract nonces will be bumped - let consensus_result = state_transition.validate_advanced_structure(platform_version)?; - - if !consensus_result.is_valid() { - return consensus_result.map_result(|action| { - ExecutionEvent::create_from_state_transition_action( - action, - maybe_identity, - platform.state.last_committed_block_epoch_ref(), - state_transition_execution_context, - platform_version, - ) - }); + if state_transition.has_advanced_structure_validation() { + // Next we have advanced structure validation, this is structure validation that does not require + // state but isn't checked on check_tx. If advanced structure fails identity nonces or identity + // contract nonces will be bumped + let consensus_result = state_transition.validate_advanced_structure(platform_version)?; + + if !consensus_result.is_valid() { + return consensus_result.map_result(|action| { + ExecutionEvent::create_from_state_transition_action( + action, + maybe_identity, + platform.state.last_committed_block_epoch_ref(), + state_transition_execution_context, + platform_version, + ) + }); + } } let action = if state_transition.requires_advance_structure_validation_from_state() { - if let Some(action) = action { - Some(action) + let action = if let Some(action) = action { + action } else { let state_transition_action_result = state_transition.transform_into_action( platform, @@ -123,34 +144,38 @@ pub(in crate::execution) fn process_state_transition_v0<'a, C: CoreRPCLike>( ), ); } - Some(state_transition_action_result.into_data()?) + state_transition_action_result.into_data()? + }; + + // Validating structure + let result = state_transition.validate_advanced_structure_from_state( + &platform.into(), + &action, + platform_version, + )?; + if !result.is_valid() { + return Ok(ConsensusValidationResult::::new_with_errors(result.errors)); } + + Some(action) } else { None }; - // Validating structure - let result = state_transition.validate_advanced_structure_from_state( - &platform.into(), - action.as_ref(), - platform_version, - )?; - if !result.is_valid() { - return Ok(ConsensusValidationResult::::new_with_errors(result.errors)); - } - - // Validating that we have sufficient balance for a transfer or withdrawal, - // this must happen after validating the signature - let result = state_transition.validate_balance( - maybe_identity.as_mut(), - &platform.into(), - platform.state.last_block_info(), - transaction, - platform_version, - )?; + if state_transition.has_balance_validation() { + // Validating that we have sufficient balance for a transfer or withdrawal, + // this must happen after validating the signature + let result = state_transition.validate_balance( + maybe_identity.as_mut(), + &platform.into(), + platform.state.last_block_info(), + transaction, + platform_version, + )?; - if !result.is_valid() { - return Ok(ConsensusValidationResult::::new_with_errors(result.errors)); + if !result.is_valid() { + return Ok(ConsensusValidationResult::::new_with_errors(result.errors)); + } } // Validating state @@ -221,6 +246,12 @@ pub(crate) trait StateTransitionBasicStructureValidationV0 { &self, platform_version: &PlatformVersion, ) -> Result; + + /// True if the state transition has basic structure validation. + /// Currently only data contract update does not + fn has_basic_structure_validation(&self) -> bool { + true + } } /// A trait for validating state transitions within a blockchain. @@ -241,6 +272,10 @@ pub(crate) trait StateTransitionAdvancedStructureValidationV0 { &self, platform_version: &PlatformVersion, ) -> Result, Error>; + + /// True if the state transition has advanced structure validation. + /// This structure validation makes users pay if there is a failure + fn has_advanced_structure_validation(&self) -> bool; } /// A trait for validating state transitions within a blockchain. @@ -261,6 +296,12 @@ pub(crate) trait StateTransitionNonceValidationV0 { tx: TransactionArg, platform_version: &PlatformVersion, ) -> Result; + + /// True if the state transition validates nonces, either identity nonces or identity contract + /// nonces + fn has_nonces_validation(&self) -> bool { + true + } } /// A trait for validating state transitions within a blockchain. @@ -279,7 +320,7 @@ pub(crate) trait StateTransitionStructureKnownInStateValidationV0 { fn validate_advanced_structure_from_state( &self, platform: &PlatformStateRef, - action: Option<&StateTransitionAction>, + action: &StateTransitionAction, platform_version: &PlatformVersion, ) -> Result; @@ -313,6 +354,13 @@ pub(crate) trait StateTransitionBalanceValidationV0 { tx: TransactionArg, platform_version: &PlatformVersion, ) -> Result; + + /// True if the state transition has a balance validation. + /// This balance validation is not for the operations of the state transition, but more as a + /// quick early verification that the user has the balance they want to transfer or withdraw. + fn has_balance_validation(&self) -> bool { + true + } } /// A trait for validating state transitions within a blockchain. @@ -368,6 +416,9 @@ impl StateTransitionBasicStructureValidationV0 for StateTransition { } } } + fn has_basic_structure_validation(&self) -> bool { + !matches!(self, StateTransition::DataContractUpdate(_)) + } } impl StateTransitionNonceValidationV0 for StateTransition { @@ -400,6 +451,18 @@ impl StateTransitionNonceValidationV0 for StateTransition { _ => Ok(SimpleConsensusValidationResult::new()), } } + + fn has_nonces_validation(&self) -> bool { + matches!( + self, + StateTransition::DocumentsBatch(_) + | StateTransition::DataContractCreate(_) + | StateTransition::DataContractUpdate(_) + | StateTransition::IdentityUpdate(_) + | StateTransition::IdentityCreditTransfer(_) + | StateTransition::IdentityCreditWithdrawal(_) + ) + } } impl StateTransitionBalanceValidationV0 for StateTransition { @@ -421,22 +484,26 @@ impl StateTransitionBalanceValidationV0 for StateTransition { _ => Ok(SimpleConsensusValidationResult::new()), } } + + fn has_balance_validation(&self) -> bool { + matches!( + self, + StateTransition::IdentityCreditTransfer(_) + | StateTransition::IdentityCreditWithdrawal(_) + ) + } } impl StateTransitionAdvancedStructureValidationV0 for StateTransition { + fn has_advanced_structure_validation(&self) -> bool { + false + } + fn validate_advanced_structure( &self, - platform_version: &PlatformVersion, + _platform_version: &PlatformVersion, ) -> Result, Error> { - match self { - StateTransition::DataContractCreate(st) => { - st.validate_advanced_structure(platform_version) - } - StateTransition::DataContractUpdate(st) => { - st.validate_advanced_structure(platform_version) - } - _ => Ok(ConsensusValidationResult::::new()), - } + Ok(ConsensusValidationResult::::new()) } } @@ -444,7 +511,7 @@ impl StateTransitionStructureKnownInStateValidationV0 for StateTransition { fn validate_advanced_structure_from_state( &self, platform: &PlatformStateRef, - action: Option<&StateTransitionAction>, + action: &StateTransitionAction, platform_version: &PlatformVersion, ) -> Result { match self { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/advanced_structure/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/advanced_structure/mod.rs deleted file mode 100644 index 025d570014..0000000000 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/advanced_structure/mod.rs +++ /dev/null @@ -1,36 +0,0 @@ -use crate::error::execution::ExecutionError; -use crate::error::Error; -use crate::execution::validation::state_transition::data_contract_create::advanced_structure::v0::DataContractCreatedStateTransitionAdvancedStructureValidationV0; -use crate::execution::validation::state_transition::processor::v0::StateTransitionAdvancedStructureValidationV0; -use dpp::state_transition::data_contract_create_transition::DataContractCreateTransition; -use dpp::validation::ConsensusValidationResult; -use dpp::version::PlatformVersion; -use drive::state_transition_action::StateTransitionAction; - -pub(crate) mod v0; - -impl StateTransitionAdvancedStructureValidationV0 for DataContractCreateTransition { - fn validate_advanced_structure( - &self, - platform_version: &PlatformVersion, - ) -> Result, Error> { - match platform_version - .drive_abci - .validation_and_processing - .state_transitions - .contract_create_state_transition - .advanced_structure - { - Some(0) => self.validate_advanced_structure_v0(platform_version), - Some(version) => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { - method: "data contract create transition: validate_advanced_structure".to_string(), - known_versions: vec![0], - received: version, - })), - None => Err(Error::Execution(ExecutionError::VersionNotActive { - method: "data contract create transition: validate_advanced_structure".to_string(), - known_versions: vec![0], - })), - } - } -} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/advanced_structure/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/advanced_structure/v0/mod.rs deleted file mode 100644 index f310f0bb34..0000000000 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/advanced_structure/v0/mod.rs +++ /dev/null @@ -1,46 +0,0 @@ -use crate::error::Error; -use dpp::prelude::DataContract; -use dpp::state_transition::data_contract_create_transition::accessors::DataContractCreateTransitionAccessorsV0; -use dpp::state_transition::data_contract_create_transition::DataContractCreateTransition; -use dpp::validation::ConsensusValidationResult; -use dpp::version::PlatformVersion; -use dpp::ProtocolError; -use drive::state_transition_action::system::bump_identity_nonce_action::BumpIdentityNonceAction; -use drive::state_transition_action::StateTransitionAction; - -pub(in crate::execution::validation::state_transition::state_transitions::data_contract_create) trait DataContractCreatedStateTransitionAdvancedStructureValidationV0 { - fn validate_advanced_structure_v0(&self, platform_version: &PlatformVersion) -> Result, Error>; -} - -impl DataContractCreatedStateTransitionAdvancedStructureValidationV0 - for DataContractCreateTransition -{ - fn validate_advanced_structure_v0( - &self, - platform_version: &PlatformVersion, - ) -> Result, Error> { - // Validate data contract - let result = DataContract::try_from_platform_versioned( - self.data_contract().clone(), - true, - platform_version, - ); - - // Return validation result if any consensus errors happened - // during data contract validation - match result { - Err(ProtocolError::ConsensusError(consensus_error)) => { - let bump_action = StateTransitionAction::BumpIdentityNonceAction( - BumpIdentityNonceAction::from_borrowed_data_contract_create_transition(self)?, - ); - - Ok(ConsensusValidationResult::new_with_data_and_errors( - bump_action, - vec![*consensus_error], - )) - } - Err(protocol_error) => Err(protocol_error.into()), - Ok(_) => Ok(ConsensusValidationResult::new()), - } - } -} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs index 5628c924a8..8f6dd60d61 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs @@ -1,4 +1,3 @@ -mod advanced_structure; mod basic_structure; mod identity_nonce; mod state; @@ -108,7 +107,7 @@ impl StateTransitionStateValidationV0 for DataContractCreateTransition { .contract_create_state_transition .state { - 0 => self.validate_state_v0(platform, tx, validation_mode, platform_version), + 0 => self.validate_state_v0(platform, validation_mode, tx, platform_version), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "data contract create transition: validate_state".to_string(), known_versions: vec![0], diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/state/v0/mod.rs index 21f5c48df2..b938cf97f2 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/state/v0/mod.rs @@ -7,19 +7,21 @@ use dpp::consensus::state::state_error::StateError; use dpp::prelude::ConsensusValidationResult; use dpp::state_transition::data_contract_create_transition::accessors::DataContractCreateTransitionAccessorsV0; use dpp::state_transition::data_contract_create_transition::DataContractCreateTransition; +use dpp::ProtocolError; use crate::execution::validation::state_transition::ValidationMode; use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; use drive::state_transition_action::contract::data_contract_create::DataContractCreateTransitionAction; +use drive::state_transition_action::system::bump_identity_nonce_action::BumpIdentityNonceAction; use drive::state_transition_action::StateTransitionAction; pub(in crate::execution::validation::state_transition::state_transitions::data_contract_create) trait DataContractCreateStateTransitionStateValidationV0 { fn validate_state_v0( &self, platform: &PlatformRef, - tx: TransactionArg, validation_mode: ValidationMode, + tx: TransactionArg, platform_version: &PlatformVersion, ) -> Result, Error>; @@ -34,8 +36,8 @@ impl DataContractCreateStateTransitionStateValidationV0 for DataContractCreateTr fn validate_state_v0( &self, platform: &PlatformRef, - tx: TransactionArg, validation_mode: ValidationMode, + tx: TransactionArg, platform_version: &PlatformVersion, ) -> Result, Error> { let drive = platform.drive; @@ -67,13 +69,30 @@ impl DataContractCreateStateTransitionStateValidationV0 for DataContractCreateTr validation_mode: ValidationMode, platform_version: &PlatformVersion, ) -> Result, Error> { - let create_action: DataContractCreateTransitionAction = - DataContractCreateTransitionAction::try_from_borrowed_platform_versioned( - self, - validation_mode.should_validate_contract_on_transform_into_action(), - platform_version, - )?; - let action: StateTransitionAction = create_action.into(); - Ok(action.into()) + let result = DataContractCreateTransitionAction::try_from_borrowed_transition( + self, + validation_mode.should_validate_contract_on_transform_into_action(), + platform_version, + ); + + // Return validation result if any consensus errors happened + // during data contract validation + match result { + Err(ProtocolError::ConsensusError(consensus_error)) => { + let bump_action = StateTransitionAction::BumpIdentityNonceAction( + BumpIdentityNonceAction::from_borrowed_data_contract_create_transition(self)?, + ); + + Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + vec![*consensus_error], + )) + } + Err(protocol_error) => Err(protocol_error.into()), + Ok(create_action) => { + let action: StateTransitionAction = create_action.into(); + Ok(action.into()) + } + } } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/advanced_structure/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/advanced_structure/mod.rs deleted file mode 100644 index 547d60e115..0000000000 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/advanced_structure/mod.rs +++ /dev/null @@ -1,36 +0,0 @@ -use crate::error::execution::ExecutionError; -use crate::error::Error; -use crate::execution::validation::state_transition::data_contract_update::advanced_structure::v0::DataContractUpdateStateTransitionAdvancedStructureValidationV0; -use crate::execution::validation::state_transition::processor::v0::StateTransitionAdvancedStructureValidationV0; -use dpp::state_transition::data_contract_update_transition::DataContractUpdateTransition; -use dpp::validation::ConsensusValidationResult; -use dpp::version::PlatformVersion; -use drive::state_transition_action::StateTransitionAction; - -pub(crate) mod v0; - -impl StateTransitionAdvancedStructureValidationV0 for DataContractUpdateTransition { - fn validate_advanced_structure( - &self, - platform_version: &PlatformVersion, - ) -> Result, Error> { - match platform_version - .drive_abci - .validation_and_processing - .state_transitions - .contract_update_state_transition - .advanced_structure - { - Some(0) => self.validate_advanced_structure_v0(platform_version), - Some(version) => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { - method: "data contract update transition: validate_basic_structure".to_string(), - known_versions: vec![0], - received: version, - })), - None => Err(Error::Execution(ExecutionError::VersionNotActive { - method: "data contract update transition: validate_basic_structure".to_string(), - known_versions: vec![0], - })), - } - } -} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/advanced_structure/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/advanced_structure/v0/mod.rs deleted file mode 100644 index 1eed199665..0000000000 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/advanced_structure/v0/mod.rs +++ /dev/null @@ -1,42 +0,0 @@ -use crate::error::Error; -use dpp::data_contract::DataContract; -use dpp::state_transition::data_contract_update_transition::accessors::DataContractUpdateTransitionAccessorsV0; -use dpp::ProtocolError; - -use dpp::state_transition::data_contract_update_transition::DataContractUpdateTransition; -use dpp::validation::ConsensusValidationResult; -use dpp::version::PlatformVersion; -use drive::state_transition_action::system::bump_identity_data_contract_nonce_action::BumpIdentityDataContractNonceAction; -use drive::state_transition_action::StateTransitionAction; - -pub(in crate::execution::validation::state_transition::state_transitions::data_contract_update) trait DataContractUpdateStateTransitionAdvancedStructureValidationV0 { - fn validate_advanced_structure_v0(&self, platform_version: &PlatformVersion) -> Result, Error>; -} - -impl DataContractUpdateStateTransitionAdvancedStructureValidationV0 - for DataContractUpdateTransition -{ - fn validate_advanced_structure_v0( - &self, - platform_version: &PlatformVersion, - ) -> Result, Error> { - match DataContract::try_from_platform_versioned( - self.data_contract().clone(), - true, - platform_version, - ) { - Err(ProtocolError::ConsensusError(consensus_error)) => { - let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( - BumpIdentityDataContractNonceAction::from_borrowed_data_contract_update_transition(self)?, - ); - - Ok(ConsensusValidationResult::new_with_data_and_errors( - bump_action, - vec![*consensus_error], - )) - } - Err(protocol_error) => Err(protocol_error.into()), - Ok(_) => Ok(ConsensusValidationResult::new()), - } - } -} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs index b41661607b..f9b98831dc 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs @@ -1,4 +1,3 @@ -mod advanced_structure; mod identity_contract_nonce; mod state; @@ -24,7 +23,7 @@ impl StateTransitionActionTransformerV0 for DataContractUpdateTransition { fn transform_into_action( &self, platform: &PlatformRef, - _validation_mode: ValidationMode, + validation_mode: ValidationMode, _execution_context: &mut StateTransitionExecutionContext, _tx: TransactionArg, ) -> Result, Error> { @@ -37,7 +36,7 @@ impl StateTransitionActionTransformerV0 for DataContractUpdateTransition { .contract_update_state_transition .transform_into_action { - 0 => self.transform_into_action_v0(platform_version), + 0 => self.transform_into_action_v0(validation_mode, platform_version), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "data contract update transition: transform_into_action".to_string(), known_versions: vec![0], diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/mod.rs index ac7dd03f15..00f9612d93 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/mod.rs @@ -16,9 +16,9 @@ pub(crate) mod v0; impl StateTransitionStateValidationV0 for DataContractUpdateTransition { fn validate_state( &self, - _action: Option, + action: Option, platform: &PlatformRef, - _validation_mode: ValidationMode, + validation_mode: ValidationMode, _execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, ) -> Result, Error> { @@ -31,7 +31,12 @@ impl StateTransitionStateValidationV0 for DataContractUpdateTransition { .contract_update_state_transition .state { - 0 => self.validate_state_v0(platform, tx, platform_version), + 0 => { + if action.is_some() { + return Err(Error::Execution(ExecutionError::CorruptedCodeExecution("data contract update is calling validate state, and the action is already known. It should not be known at this point"))); + } + self.validate_state_v0(platform, validation_mode, tx, platform_version) + } version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "data contract update transition: validate_state".to_string(), known_versions: vec![0], diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/v0/mod.rs index d96b85eab5..093fed9188 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/v0/mod.rs @@ -8,15 +8,15 @@ use dpp::consensus::basic::data_contract::{ }; use dpp::consensus::basic::document::DataContractNotPresentError; use dpp::consensus::basic::BasicError; -use dpp::consensus::state::data_contract::data_contract_is_readonly_error::DataContractIsReadonlyError; -use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::consensus::ConsensusError; -use dpp::data_contract::config::v0::DataContractConfigGettersV0; +use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::data_contract::document_type::schema::{ get_operation_and_property_name_json, validate_schema_compatibility, }; +use dpp::data_contract::errors::DataContractError; use dpp::data_contract::schema::DataContractSchemaMethodsV0; use dpp::data_contract::JsonValue; use dpp::platform_value::converter::serde_json::BTreeValueJsonConverter; @@ -27,23 +27,28 @@ use dpp::state_transition::data_contract_update_transition::accessors::DataContr use dpp::ProtocolError; use dpp::state_transition::data_contract_update_transition::DataContractUpdateTransition; -use dpp::version::{PlatformVersion, TryIntoPlatformVersioned}; +use dpp::version::PlatformVersion; +use crate::error::execution::ExecutionError; +use crate::execution::validation::state_transition::ValidationMode; use drive::grovedb::TransactionArg; use drive::state_transition_action::contract::data_contract_update::DataContractUpdateTransitionAction; use drive::state_transition_action::system::bump_identity_data_contract_nonce_action::BumpIdentityDataContractNonceAction; + use drive::state_transition_action::StateTransitionAction; pub(in crate::execution::validation::state_transition::state_transitions::data_contract_update) trait DataContractUpdateStateTransitionStateValidationV0 { fn validate_state_v0( &self, platform: &PlatformRef, + validation_mode: ValidationMode, tx: TransactionArg, platform_version: &PlatformVersion, ) -> Result, Error>; fn transform_into_action_v0( &self, + validation_mode: ValidationMode, platform_version: &PlatformVersion ) -> Result, Error>; } @@ -52,25 +57,21 @@ impl DataContractUpdateStateTransitionStateValidationV0 for DataContractUpdateTr fn validate_state_v0( &self, platform: &PlatformRef, + validation_mode: ValidationMode, tx: TransactionArg, platform_version: &PlatformVersion, ) -> Result, Error> { - let action = self.transform_into_action_v0(platform_version)?; + let action = self.transform_into_action_v0(validation_mode, platform_version)?; if !action.is_valid() { - let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( - BumpIdentityDataContractNonceAction::from_borrowed_data_contract_update_transition( - self, - )?, - ); - - return Ok(ConsensusValidationResult::new_with_data_and_errors( - bump_action, - action.errors, - )); + return Ok(action); } - let state_transition_action = action.data.as_ref().unwrap(); + let state_transition_action = action.data.as_ref().ok_or(Error::Execution( + ExecutionError::CorruptedCodeExecution( + "we should always have an action at this point in data contract update", + ), + ))?; let new_data_contract = match state_transition_action { StateTransitionAction::DataContractUpdateAction(action) => { @@ -78,12 +79,19 @@ impl DataContractUpdateStateTransitionStateValidationV0 for DataContractUpdateTr } _ => None, } - .unwrap(); + .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( + "we should always have a data contract at this point in data contract update", + )))?; let drive = platform.drive; - let mut validation_result = ConsensusValidationResult::default(); + + // Check previous data contract already exists in the state + // Failure (contract does not exist): Keep ST and transform it to a nonce bump action. + // How: A user pushed an update for a data contract that didn’t exist. + // Note: Existing in the state can also mean that it exists in the current block state, meaning that the contract was inserted in the same block with a previous transition. + // Data contract should exist - let add_to_cache_if_pulled = tx.is_some(); + let add_to_cache_if_pulled = validation_mode.can_alter_cache(); // Data contract should exist let Some(contract_fetch_info) = drive .get_contract_with_fetch_info_and_fee( @@ -95,10 +103,6 @@ impl DataContractUpdateStateTransitionStateValidationV0 for DataContractUpdateTr )? .1 else { - validation_result.add_error(BasicError::DataContractNotPresentError( - DataContractNotPresentError::new(new_data_contract.id()), - )); - let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( BumpIdentityDataContractNonceAction::from_borrowed_data_contract_update_transition( self, @@ -107,18 +111,24 @@ impl DataContractUpdateStateTransitionStateValidationV0 for DataContractUpdateTr return Ok(ConsensusValidationResult::new_with_data_and_errors( bump_action, - validation_result.errors, + vec![ + BasicError::DataContractNotPresentError(DataContractNotPresentError::new( + new_data_contract.id(), + )) + .into(), + ], )); }; let old_data_contract = &contract_fetch_info.contract; + // Check version is bumped + // Failure (version != previous version + 1): Keep ST and transform it to a nonce bump action. + // How: A user pushed an update that was not the next version. + let new_version = new_data_contract.version(); let old_version = old_data_contract.version(); if new_version < old_version || new_version - old_version != 1 { - validation_result.add_error(BasicError::InvalidDataContractVersionError( - InvalidDataContractVersionError::new(old_version + 1, new_version), - )); let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( BumpIdentityDataContractNonceAction::from_borrowed_data_contract_update_transition( self, @@ -127,12 +137,33 @@ impl DataContractUpdateStateTransitionStateValidationV0 for DataContractUpdateTr return Ok(ConsensusValidationResult::new_with_data_and_errors( bump_action, - validation_result.errors, + vec![BasicError::InvalidDataContractVersionError( + InvalidDataContractVersionError::new(old_version + 1, new_version), + ) + .into()], )); } - if old_data_contract.config().readonly() { - validation_result.add_error(DataContractIsReadonlyError::new(new_data_contract.id())); + // Validate that the config was not updated + // * Includes verifications that: + // - Old contract is not read_only + // - New contract is not read_only + // - Keeps history did not change + // - Can be deleted did not change + // - Documents keep history did not change + // - Documents mutable contract default did not change + // - Requires identity encryption bounded key did not change + // - Requires identity decryption bounded key did not change + // * Failure (contract does not exist): Keep ST and transform it to a nonce bump action. + // * How: A user pushed an update to a contract that changed its configuration. + + let config_validation_result = old_data_contract.config().validate_config_update( + new_data_contract.config(), + self.data_contract().id(), + platform_version, + )?; + + if !config_validation_result.is_valid() { let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( BumpIdentityDataContractNonceAction::from_borrowed_data_contract_update_transition( self, @@ -141,7 +172,7 @@ impl DataContractUpdateStateTransitionStateValidationV0 for DataContractUpdateTr return Ok(ConsensusValidationResult::new_with_data_and_errors( bump_action, - validation_result.errors, + config_validation_result.errors, )); } @@ -155,57 +186,82 @@ impl DataContractUpdateStateTransitionStateValidationV0 for DataContractUpdateTr old_data_contract.document_type_optional_for_name(new_contract_document_type_name) else { // if it's a new document type (ie the old data contract didn't have it) - // then new indices on it are fine + // then new indices on it are fine and we don't need to validate that configuration didn't change continue; }; - // If the new contract document type doesn't contain all previous indexes then - // there is a problem - if let Some(non_subset_path) = new_contract_document_type - .index_structure() - .contains_subset_first_non_subset_path(old_contract_document_type.index_structure()) - { - validation_result.add_error( - BasicError::DataContractInvalidIndexDefinitionUpdateError( - DataContractInvalidIndexDefinitionUpdateError::new( - new_contract_document_type_name.clone(), - non_subset_path, - ), - ), - ) - } - } - if !validation_result.is_valid() { - let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( - BumpIdentityDataContractNonceAction::from_borrowed_data_contract_update_transition( - self, - )?, - ); + let validate_update_result = old_contract_document_type + .validate_update(new_contract_document_type, platform_version)?; - return Ok(ConsensusValidationResult::new_with_data_and_errors( - bump_action, - validation_result.errors, - )); - } - - let config_validation_result = old_data_contract.config().validate_config_update( - new_data_contract.config(), - self.data_contract().id(), - platform_version, - )?; + if !validate_update_result.is_valid() { + let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( + BumpIdentityDataContractNonceAction::from_borrowed_data_contract_update_transition( + self, + )?, + ); - if !config_validation_result.is_valid() { - validation_result.merge(config_validation_result); - let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( - BumpIdentityDataContractNonceAction::from_borrowed_data_contract_update_transition( - self, - )?, - ); + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + validate_update_result.errors, + )); + } - return Ok(ConsensusValidationResult::new_with_data_and_errors( - bump_action, - validation_result.errors, - )); + // We currently don't allow indexes to change + if new_contract_document_type.index_structure() + != old_contract_document_type.index_structure() + { + // We want to figure out what changed, so we compare one way then the other + + // If the new contract document type doesn't contain all previous indexes + if let Some(non_subset_path) = new_contract_document_type + .index_structure() + .contains_subset_first_non_subset_path( + old_contract_document_type.index_structure(), + ) + { + let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( + BumpIdentityDataContractNonceAction::from_borrowed_data_contract_update_transition( + self, + )?, + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + vec![BasicError::DataContractInvalidIndexDefinitionUpdateError( + DataContractInvalidIndexDefinitionUpdateError::new( + new_contract_document_type_name.clone(), + non_subset_path, + ), + ) + .into()], + )); + } + + // If the old contract document type doesn't contain all new indexes + if let Some(non_subset_path) = old_contract_document_type + .index_structure() + .contains_subset_first_non_subset_path( + new_contract_document_type.index_structure(), + ) + { + let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( + BumpIdentityDataContractNonceAction::from_borrowed_data_contract_update_transition( + self, + )?, + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + vec![BasicError::DataContractInvalidIndexDefinitionUpdateError( + DataContractInvalidIndexDefinitionUpdateError::new( + new_contract_document_type_name.clone(), + non_subset_path, + ), + ) + .into()], + )); + } + } } // Schema defs should be compatible @@ -216,26 +272,52 @@ impl DataContractUpdateStateTransitionStateValidationV0 for DataContractUpdateTr // as for document schema if let Some(old_defs) = old_data_contract.schema_defs() { let Some(new_defs) = self.data_contract().schema_defs() else { - validation_result.add_error(BasicError::IncompatibleDataContractSchemaError( - IncompatibleDataContractSchemaError::new( - self.data_contract().id(), - "remove".to_string(), - "$defs".to_string(), - old_defs.into(), - Value::Null, - ), - )); + let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( + BumpIdentityDataContractNonceAction::from_borrowed_data_contract_update_transition( + self, + )?, + ); - return Ok(validation_result); + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + vec![BasicError::IncompatibleDataContractSchemaError( + IncompatibleDataContractSchemaError::new( + self.data_contract().id(), + "remove".to_string(), + "$defs".to_string(), + old_defs.into(), + Value::Null, + ), + ) + .into()], + )); }; + // Old defs are in state so should be valid let old_defs_json: JsonValue = old_defs .to_json_value() .map_err(ProtocolError::ValueError)?; - let new_defs_json: JsonValue = new_defs - .to_json_value() - .map_err(ProtocolError::ValueError)?; + let new_defs_json: JsonValue = match new_defs.to_json_value() { + Ok(json_value) => json_value, + Err(e) => { + let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( + BumpIdentityDataContractNonceAction::from_borrowed_data_contract_update_transition( + self, + )?, + ); + + let data_contract_error: DataContractError = + (e, "json schema new defs invalid").into(); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + vec![ConsensusError::BasicError(BasicError::ContractError( + data_contract_error, + ))], + )); + } + }; let diffs = validate_schema_compatibility(&old_defs_json, &new_defs_json, platform_version)?; @@ -244,16 +326,6 @@ impl DataContractUpdateStateTransitionStateValidationV0 for DataContractUpdateTr let (operation_name, property_name) = get_operation_and_property_name_json(&diffs[0]); - validation_result.add_error(BasicError::IncompatibleDataContractSchemaError( - IncompatibleDataContractSchemaError::new( - self.data_contract().id(), - operation_name.to_owned(), - property_name.to_owned(), - old_defs_json.into(), - new_defs_json.into(), - ), - )); - let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( BumpIdentityDataContractNonceAction::from_borrowed_data_contract_update_transition( self, @@ -262,12 +334,22 @@ impl DataContractUpdateStateTransitionStateValidationV0 for DataContractUpdateTr return Ok(ConsensusValidationResult::new_with_data_and_errors( bump_action, - validation_result.errors, + vec![BasicError::IncompatibleDataContractSchemaError( + IncompatibleDataContractSchemaError::new( + self.data_contract().id(), + operation_name.to_owned(), + property_name.to_owned(), + old_defs_json.into(), + new_defs_json.into(), + ), + ) + .into()], )); } } for (document_type_name, old_document_schema) in old_data_contract.document_schemas() { + // The old document schema is in the state already so we are guaranteed that it can be transformed into a JSON value let old_document_schema_json: JsonValue = old_document_schema .clone() .try_into() @@ -278,10 +360,28 @@ impl DataContractUpdateStateTransitionStateValidationV0 for DataContractUpdateTr .map(|document_type| document_type.schema().clone()) .unwrap_or(ValueMap::new().into()); - let new_document_schema_json: JsonValue = new_document_schema - .clone() - .try_into() - .map_err(ProtocolError::ValueError)?; + // The new document schema is not the state already so we are not guaranteed that it can be transformed into a JSON value + // If it can not we should throw a consensus validation error + let new_document_schema_json: JsonValue = match new_document_schema.clone().try_into() { + Ok(json_value) => json_value, + Err(e) => { + let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( + BumpIdentityDataContractNonceAction::from_borrowed_data_contract_update_transition( + self, + )?, + ); + + let data_contract_error: DataContractError = + (e, "json schema new schema invalid").into(); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + vec![ConsensusError::BasicError(BasicError::ContractError( + data_contract_error, + ))], + )); + } + }; let diffs = validate_schema_compatibility( &old_document_schema_json, @@ -293,16 +393,6 @@ impl DataContractUpdateStateTransitionStateValidationV0 for DataContractUpdateTr let (operation_name, property_name) = get_operation_and_property_name_json(&diffs[0]); - validation_result.add_error(BasicError::IncompatibleDataContractSchemaError( - IncompatibleDataContractSchemaError::new( - self.data_contract().id(), - operation_name.to_owned(), - property_name.to_owned(), - old_document_schema.clone(), - new_document_schema, - ), - )); - let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( BumpIdentityDataContractNonceAction::from_borrowed_data_contract_update_transition( self, @@ -311,7 +401,16 @@ impl DataContractUpdateStateTransitionStateValidationV0 for DataContractUpdateTr return Ok(ConsensusValidationResult::new_with_data_and_errors( bump_action, - validation_result.errors, + vec![BasicError::IncompatibleDataContractSchemaError( + IncompatibleDataContractSchemaError::new( + self.data_contract().id(), + operation_name.to_owned(), + property_name.to_owned(), + old_document_schema.clone(), + new_document_schema, + ), + ) + .into()], )); } } @@ -321,14 +420,33 @@ impl DataContractUpdateStateTransitionStateValidationV0 for DataContractUpdateTr fn transform_into_action_v0( &self, + validation_mode: ValidationMode, platform_version: &PlatformVersion, ) -> Result, Error> { - let action: StateTransitionAction = TryIntoPlatformVersioned::< - DataContractUpdateTransitionAction, - >::try_into_platform_versioned( - self, platform_version - )? - .into(); - Ok(action.into()) + let result = DataContractUpdateTransitionAction::try_from_borrowed_transition( + self, + validation_mode.should_validate_contract_on_transform_into_action(), + platform_version, + ); + + // Return validation result if any consensus errors happened + // during data contract validation + match result { + Err(ProtocolError::ConsensusError(consensus_error)) => { + let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( + BumpIdentityDataContractNonceAction::from_borrowed_data_contract_update_transition(self)?, + ); + + Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + vec![*consensus_error], + )) + } + Err(protocol_error) => Err(protocol_error.into()), + Ok(create_action) => { + let action: StateTransitionAction = create_action.into(); + Ok(action.into()) + } + } } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs index c351f33b3d..67e8c0b349 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs @@ -128,7 +128,7 @@ impl StateTransitionStructureKnownInStateValidationV0 for DocumentsBatchTransiti fn validate_advanced_structure_from_state( &self, platform: &PlatformStateRef, - action: Option<&StateTransitionAction>, + action: &StateTransitionAction, platform_version: &PlatformVersion, ) -> Result { match platform_version @@ -139,10 +139,6 @@ impl StateTransitionStructureKnownInStateValidationV0 for DocumentsBatchTransiti .advanced_structure { 0 => { - let action = - action.ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( - "documents batch structure validation should have an action", - )))?; let StateTransitionAction::DocumentsBatchAction(documents_batch_transition_action) = action else { @@ -157,7 +153,7 @@ impl StateTransitionStructureKnownInStateValidationV0 for DocumentsBatchTransiti ) } version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { - method: "documents batch transition: base structure".to_string(), + method: "documents batch transition: advanced structure from state".to_string(), known_versions: vec![0], received: version, })), diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/mod.rs index c9dcaf4a8b..b3c2ec8804 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/mod.rs @@ -23,6 +23,7 @@ pub mod data_contract_create; pub mod data_contract_update; /// The validation mode we are using +#[derive(Clone, Copy, Debug)] pub enum ValidationMode { /// The basic checktx before the state transition is put into mempool CheckTx, @@ -31,3 +32,14 @@ pub enum ValidationMode { /// The validation of the validator Validator, } + +impl ValidationMode { + /// Can this validation mode alter cache on drive? + pub fn can_alter_cache(&self) -> bool { + match self { + ValidationMode::CheckTx => false, + ValidationMode::RecheckTx => false, + ValidationMode::Validator => true, + } + } +} diff --git a/packages/rs-drive-abci/src/mimic/mod.rs b/packages/rs-drive-abci/src/mimic/mod.rs index 53c31e6eee..d043556adf 100644 --- a/packages/rs-drive-abci/src/mimic/mod.rs +++ b/packages/rs-drive-abci/src/mimic/mod.rs @@ -15,7 +15,6 @@ use ciborium::Value as CborValue; use dpp::block::block_info::BlockInfo; use dpp::consensus::ConsensusError; use dpp::dashcore::hashes::Hash; -use dpp::data_contract::errors::StructureError; use dpp::platform_value::btreemap_extensions::BTreeValueMapHelper; use dpp::platform_value::string_encoding::{decode, Encoding}; use dpp::platform_value::Value; @@ -189,9 +188,9 @@ impl<'a, C: CoreRPCLike> FullAbciApplication<'a, C> { let info_cbor_map: BTreeMap = ciborium::de::from_reader(info_bytes.as_slice()).map_err(|_| { - ProtocolError::StructureError(StructureError::InvalidCBOR( - "unable to decode document for document call", - )) + ProtocolError::InvalidCBOR( + "unable to decode document for document call".to_string(), + ) })?; let info_map: BTreeMap = Value::convert_from_cbor_map(info_cbor_map) .map_err(ProtocolError::ValueError)?; diff --git a/packages/rs-drive-abci/tests/strategy_tests/failures.rs b/packages/rs-drive-abci/tests/strategy_tests/failures.rs index 32da82fac0..db809b1a07 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/failures.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/failures.rs @@ -1,8 +1,7 @@ #[cfg(test)] mod tests { use crate::execution::run_chain_for_strategy; - use rand::rngs::StdRng; - use rand::SeedableRng; + use std::collections::{BTreeMap, HashMap}; use strategy_tests::frequency::Frequency; @@ -11,22 +10,13 @@ mod tests { use drive_abci::config::{ExecutionConfig, PlatformConfig, PlatformTestConfig}; - use crate::strategy::CoreHeightIncrease::KnownCoreHeightIncreases; use dpp::dashcore::hashes::Hash; use dpp::dashcore::{BlockHash, ChainLock}; use dpp::data_contract::accessors::v0::{DataContractV0Getters, DataContractV0Setters}; - use dpp::data_contract::document_type::random_document::{ - DocumentFieldFillSize, DocumentFieldFillType, - }; - use dpp::identity::accessors::IdentityGettersV0; - use dpp::platform_value::Value; - use dpp::prelude::Identity; use dpp::tests::json_document::json_document_to_created_contract; use dpp::version::PlatformVersion; use drive_abci::test::helpers::setup::TestPlatformBuilder; - use simple_signer::signer::SimpleSigner; - use strategy_tests::operations::{DocumentAction, DocumentOp, Operation, OperationType}; #[test] fn run_chain_insert_one_new_identity_and_a_contract_with_bad_update() { diff --git a/packages/rs-drive-abci/tests/strategy_tests/main.rs b/packages/rs-drive-abci/tests/strategy_tests/main.rs index 4ebb9dc3fd..ef6cddab41 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/main.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/main.rs @@ -1721,7 +1721,7 @@ mod tests { .unwrap() .unwrap() ), - "8f55b983f206f005897ce067091f144787b21d7c840c47d49fdba5edae3645c5".to_string() + "af96b62e5b41ff40791e3c909979c4143590873bddddbcc3f781ac644eb688b1".to_string() ) } @@ -1842,7 +1842,7 @@ mod tests { .unwrap() .unwrap() ), - "6b5f954928a3f477b9371106f9594046ae3e059bf7eecf60f5f80f59719b8361".to_string() + "9aaf2d490aecf00a23dfaf39140ef97a9f239371f5a66b57f9ab15fa38d81fe4".to_string() ) } diff --git a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs index 495a46c6d1..6bc503f06f 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs @@ -394,6 +394,7 @@ impl NetworkStrategy { &mut self, current_identities: &Vec, signer: &SimpleSigner, + contract_nonce_counter: &mut BTreeMap<(Identifier, Identifier), u64>, rng: &mut StdRng, platform_version: &PlatformVersion, ) -> Vec { @@ -441,7 +442,12 @@ impl NetworkStrategy { } }); - let state_transition = DataContractCreateTransition::new_from_data_contract( + let identity_contract_nonce = contract_nonce_counter + .entry((identity.id, contract.id())) + .or_default(); + *identity_contract_nonce += 1; + + DataContractCreateTransition::new_from_data_contract( contract.clone(), identity_nonce, &identity, @@ -450,8 +456,7 @@ impl NetworkStrategy { platform_version, None, ) - .expect("expected to create a create state transition from a data contract"); - state_transition + .expect("expected to create a create state transition from a data contract") }) .collect() } @@ -1067,14 +1072,19 @@ impl NetworkStrategy { if block_info.height == 1 { // add contracts on block 1 - let mut contract_state_transitions = - self.contract_state_transitions(current_identities, signer, rng, platform_version); + let mut contract_state_transitions = self.contract_state_transitions( + current_identities, + signer, + contract_nonce_counter, + rng, + platform_version, + ); state_transitions.append(&mut contract_state_transitions); } else { // Don't do any state transitions on block 1 let (mut document_state_transitions, mut add_to_finalize_block_operations) = self .state_transitions_for_block( - &platform, + platform, block_info, current_identities, signer, diff --git a/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs b/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs index 5a9618717c..05226c1a61 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs @@ -314,7 +314,12 @@ pub(crate) fn verify_state_transitions_were_or_were_not_executed( match document_transition_action { DocumentTransitionAction::CreateAction(creation_action) => { if *was_executed { - let document = document.expect("expected a document"); + let document = document.unwrap_or_else(|| { + panic!( + "expected a document on block {}", + platform.state.last_committed_block_height() + ) + }); // dbg!( // &document, // Document::try_from_create_transition( diff --git a/packages/rs-drive/src/drive/batch/drive_op_batch/document.rs b/packages/rs-drive/src/drive/batch/drive_op_batch/document.rs index 8b62329254..d26327ff8f 100644 --- a/packages/rs-drive/src/drive/batch/drive_op_batch/document.rs +++ b/packages/rs-drive/src/drive/batch/drive_op_batch/document.rs @@ -17,6 +17,7 @@ use dpp::prelude::Identifier; use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; use dpp::version::PlatformVersion; +use dpp::ProtocolError; use grovedb::batch::KeyInfoPath; use grovedb::{EstimatedLayerInformation, TransactionArg}; use std::borrow::Cow; @@ -179,7 +180,9 @@ impl DriveLowLevelOperationConverter for DocumentOperationType<'_> { override_document, storage_flags, } => { - let document_type = contract.document_type_for_name(document_type_name)?; + let document_type = contract + .document_type_for_name(document_type_name) + .map_err(ProtocolError::DataContractError)?; let document = Document::from_bytes(serialized_document, document_type, platform_version)?; @@ -225,7 +228,9 @@ impl DriveLowLevelOperationConverter for DocumentOperationType<'_> { let contract = &contract_fetch_info.contract; - let document_type = contract.document_type_for_name(document_type_name.as_str())?; + let document_type = contract + .document_type_for_name(document_type_name.as_str()) + .map_err(ProtocolError::DataContractError)?; let document_and_contract_info = DocumentAndContractInfo { owned_document_info, @@ -249,7 +254,9 @@ impl DriveLowLevelOperationConverter for DocumentOperationType<'_> { } => { let contract = drive.cache.system_data_contracts.load_withdrawals(); - let document_type = contract.document_type_for_name(withdrawal::NAME)?; + let document_type = contract + .document_type_for_name(withdrawal::NAME) + .map_err(ProtocolError::DataContractError)?; let document_and_contract_info = DocumentAndContractInfo { owned_document_info, @@ -325,7 +332,9 @@ impl DriveLowLevelOperationConverter for DocumentOperationType<'_> { owner_id, storage_flags, } => { - let document_type = contract.document_type_for_name(document_type_name)?; + let document_type = contract + .document_type_for_name(document_type_name) + .map_err(ProtocolError::DataContractError)?; let document = Document::from_bytes(serialized_document, document_type, platform_version)?; @@ -361,7 +370,9 @@ impl DriveLowLevelOperationConverter for DocumentOperationType<'_> { let document_info = DocumentRefAndSerialization((document, serialized_document, storage_flags)); - let document_type = contract.document_type_for_name(document_type_name)?; + let document_type = contract + .document_type_for_name(document_type_name) + .map_err(ProtocolError::DataContractError)?; let document_and_contract_info = DocumentAndContractInfo { owned_document_info: OwnedDocumentInfo { @@ -471,7 +482,9 @@ impl DriveLowLevelOperationConverter for DocumentOperationType<'_> { let contract = &contract_fetch_info.contract; - let document_type = contract.document_type_for_name(document_type_name.as_str())?; + let document_type = contract + .document_type_for_name(document_type_name.as_str()) + .map_err(ProtocolError::DataContractError)?; let document_and_contract_info = DocumentAndContractInfo { owned_document_info, diff --git a/packages/rs-drive/src/drive/batch/transitions/contract/data_contract_create_transition.rs b/packages/rs-drive/src/drive/batch/transitions/contract/data_contract_create_transition.rs index 02cf44580a..f1582bd152 100644 --- a/packages/rs-drive/src/drive/batch/transitions/contract/data_contract_create_transition.rs +++ b/packages/rs-drive/src/drive/batch/transitions/contract/data_contract_create_transition.rs @@ -5,6 +5,7 @@ use crate::error::Error; use crate::state_transition_action::contract::data_contract_create::DataContractCreateTransitionAction; use dpp::block::epoch::Epoch; use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::config::v0::DataContractConfigGettersV0; use dpp::version::PlatformVersion; use std::borrow::Cow; @@ -14,16 +15,25 @@ impl DriveHighLevelOperationConverter for DataContractCreateTransitionAction { _epoch: &Epoch, _platform_version: &PlatformVersion, ) -> Result>, Error> { - Ok(vec![ + let operations = vec![ IdentityOperation(IdentityOperationType::UpdateIdentityNonce { identity_id: self.data_contract_ref().owner_id().into_buffer(), nonce: self.identity_nonce(), }), - // We must create the contract + // We should add an identity contract nonce now to make it so there are no additional + // bytes used later for bumping the identity data contract nonce for updating the + // contract + IdentityOperation(IdentityOperationType::UpdateIdentityContractNonce { + identity_id: self.data_contract_ref().owner_id().into_buffer(), + contract_id: self.data_contract_ref().id().into_buffer(), + nonce: 1, + }), DataContractOperation(DataContractOperationType::ApplyContract { contract: Cow::Owned(self.data_contract()), storage_flags: None, }), - ]) + ]; + + Ok(operations) } } diff --git a/packages/rs-drive/src/drive/grove_operations/grove_apply_batch/mod.rs b/packages/rs-drive/src/drive/grove_operations/grove_apply_batch/mod.rs index 3b55694140..9fe2b6d301 100644 --- a/packages/rs-drive/src/drive/grove_operations/grove_apply_batch/mod.rs +++ b/packages/rs-drive/src/drive/grove_operations/grove_apply_batch/mod.rs @@ -1,4 +1,3 @@ - use crate::drive::batch::GroveDbOpBatch; use crate::drive::Drive; use crate::error::Error; diff --git a/packages/rs-drive/src/drive/grove_operations/grove_apply_batch_with_add_costs/mod.rs b/packages/rs-drive/src/drive/grove_operations/grove_apply_batch_with_add_costs/mod.rs index a3492f2c85..f18bc3f867 100644 --- a/packages/rs-drive/src/drive/grove_operations/grove_apply_batch_with_add_costs/mod.rs +++ b/packages/rs-drive/src/drive/grove_operations/grove_apply_batch_with_add_costs/mod.rs @@ -32,11 +32,7 @@ impl Drive { drive_operations: &mut Vec, drive_version: &DriveVersion, ) -> Result<(), Error> { - match drive_version - .grove_methods - .apply - .grove_apply_batch - { + match drive_version.grove_methods.apply.grove_apply_batch { 0 => self.grove_apply_batch_with_add_costs_v0( ops, validate, diff --git a/packages/rs-drive/src/drive/grove_operations/grove_apply_partial_batch/mod.rs b/packages/rs-drive/src/drive/grove_operations/grove_apply_partial_batch/mod.rs index 992d4edfb9..16405e421c 100644 --- a/packages/rs-drive/src/drive/grove_operations/grove_apply_partial_batch/mod.rs +++ b/packages/rs-drive/src/drive/grove_operations/grove_apply_partial_batch/mod.rs @@ -1,4 +1,3 @@ - use crate::drive::batch::GroveDbOpBatch; use crate::drive::Drive; use crate::error::Error; diff --git a/packages/rs-drive/src/drive/grove_operations/grove_apply_partial_batch_with_add_costs/mod.rs b/packages/rs-drive/src/drive/grove_operations/grove_apply_partial_batch_with_add_costs/mod.rs index c8ca580aa5..73306f80b2 100644 --- a/packages/rs-drive/src/drive/grove_operations/grove_apply_partial_batch_with_add_costs/mod.rs +++ b/packages/rs-drive/src/drive/grove_operations/grove_apply_partial_batch_with_add_costs/mod.rs @@ -40,11 +40,7 @@ impl Drive { drive_operations: &mut Vec, drive_version: &DriveVersion, ) -> Result<(), Error> { - match drive_version - .grove_methods - .apply - .grove_apply_partial_batch - { + match drive_version.grove_methods.apply.grove_apply_partial_batch { 0 => self.grove_apply_partial_batch_with_add_costs_v0( ops, validate, diff --git a/packages/rs-drive/src/drive/identity/contract_info/keys/mod.rs b/packages/rs-drive/src/drive/identity/contract_info/keys/mod.rs index dc34b6c8d0..bab412d5fe 100644 --- a/packages/rs-drive/src/drive/identity/contract_info/keys/mod.rs +++ b/packages/rs-drive/src/drive/identity/contract_info/keys/mod.rs @@ -90,9 +90,7 @@ impl IdentityDataContractKeyApplyInfo { document_type_name: document_type, .. } => { - let document_type = contract - .document_type_for_name(document_type) - .map_err(Error::Protocol)?; + let document_type = contract.document_type_for_name(document_type)?; Ok(ContractBased { contract_id: contract.id(), document_type_keys: BTreeMap::from([( diff --git a/packages/rs-drive/src/error/mod.rs b/packages/rs-drive/src/error/mod.rs index c2c50ad8e0..5dc1f759eb 100644 --- a/packages/rs-drive/src/error/mod.rs +++ b/packages/rs-drive/src/error/mod.rs @@ -3,6 +3,7 @@ use crate::error::contract::DataContractError; use crate::error::proof::ProofError; use crate::error::storage_flags::StorageFlagsError; use document::DocumentError; +use dpp::data_contract::errors::DataContractError as ProtocolDataContractError; use dpp::platform_value::Error as ValueError; use dpp::ProtocolError; use fee::FeeError; @@ -63,3 +64,9 @@ pub enum Error { #[error("contract: {0}")] DataContract(#[from] DataContractError), } + +impl From for Error { + fn from(value: ProtocolDataContractError) -> Self { + Self::Protocol(ProtocolError::DataContractError(value)) + } +} diff --git a/packages/rs-drive/src/state_transition_action/contract/data_contract_create/transformer.rs b/packages/rs-drive/src/state_transition_action/contract/data_contract_create/transformer.rs index 4644d28d31..c94355e6ef 100644 --- a/packages/rs-drive/src/state_transition_action/contract/data_contract_create/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/contract/data_contract_create/transformer.rs @@ -8,20 +8,20 @@ impl DataContractCreateTransitionAction { /// tries to transform the DataContractCreateTransition into a DataContractCreateTransitionAction /// if validation is true the data contract transformation verifies that the data contract is valid /// if validation is false, the data contract base structure is created regardless of if it is valid - pub fn try_from_platform_versioned( + pub fn try_from_transition( value: DataContractCreateTransition, validate: bool, platform_version: &PlatformVersion, ) -> Result { match value { - DataContractCreateTransition::V0(v0) => Ok( - DataContractCreateTransitionActionV0::try_from_platform_versioned( + DataContractCreateTransition::V0(v0) => { + Ok(DataContractCreateTransitionActionV0::try_from_transition( v0, validate, platform_version, )? - .into(), - ), + .into()) + } } } @@ -29,14 +29,14 @@ impl DataContractCreateTransitionAction { /// if validation is true the data contract transformation verifies that the data contract is valid /// if validation is false, the data contract base structure is created regardless of if it is valid - pub fn try_from_borrowed_platform_versioned( + pub fn try_from_borrowed_transition( value: &DataContractCreateTransition, validate: bool, platform_version: &PlatformVersion, ) -> Result { match value { DataContractCreateTransition::V0(v0) => Ok( - DataContractCreateTransitionActionV0::try_from_borrowed_platform_versioned( + DataContractCreateTransitionActionV0::try_from_borrowed_transition( v0, validate, platform_version, diff --git a/packages/rs-drive/src/state_transition_action/contract/data_contract_create/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/contract/data_contract_create/v0/transformer.rs index a4c0c1a6cb..d43fcdf434 100644 --- a/packages/rs-drive/src/state_transition_action/contract/data_contract_create/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/contract/data_contract_create/v0/transformer.rs @@ -5,7 +5,7 @@ use dpp::ProtocolError; use platform_version::version::PlatformVersion; impl DataContractCreateTransitionActionV0 { - pub(in crate::state_transition_action::contract::data_contract_create) fn try_from_platform_versioned( + pub(in crate::state_transition_action::contract::data_contract_create) fn try_from_transition( value: DataContractCreateTransitionV0, validate: bool, platform_version: &PlatformVersion, @@ -21,7 +21,7 @@ impl DataContractCreateTransitionActionV0 { }) } - pub(in crate::state_transition_action::contract::data_contract_create) fn try_from_borrowed_platform_versioned( + pub(in crate::state_transition_action::contract::data_contract_create) fn try_from_borrowed_transition( value: &DataContractCreateTransitionV0, validate: bool, platform_version: &PlatformVersion, diff --git a/packages/rs-drive/src/state_transition_action/contract/data_contract_update/transformer.rs b/packages/rs-drive/src/state_transition_action/contract/data_contract_update/transformer.rs index 8e009f6415..51cac39e6d 100644 --- a/packages/rs-drive/src/state_transition_action/contract/data_contract_update/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/contract/data_contract_update/transformer.rs @@ -3,40 +3,42 @@ use crate::state_transition_action::contract::data_contract_update::DataContract use dpp::state_transition::data_contract_update_transition::DataContractUpdateTransition; use dpp::ProtocolError; use platform_version::version::PlatformVersion; -use platform_version::TryFromPlatformVersioned; -impl TryFromPlatformVersioned for DataContractUpdateTransitionAction { - type Error = ProtocolError; - - fn try_from_platform_versioned( +impl DataContractUpdateTransitionAction { + /// tries to transform the DataContractUpdateTransition into a DataContractUpdateTransitionAction + /// if validation is true the data contract transformation verifies that the data contract is valid + /// if validation is false, the data contract base structure is created regardless of if it is valid + pub fn try_from_transition( value: DataContractUpdateTransition, + validate: bool, platform_version: &PlatformVersion, - ) -> Result { + ) -> Result { match value { - DataContractUpdateTransition::V0(v0) => Ok( - DataContractUpdateTransitionActionV0::try_from_platform_versioned( + DataContractUpdateTransition::V0(v0) => { + Ok(DataContractUpdateTransitionActionV0::try_from_transition( v0, + validate, platform_version, )? - .into(), - ), + .into()) + } } } -} -impl TryFromPlatformVersioned<&DataContractUpdateTransition> - for DataContractUpdateTransitionAction -{ - type Error = ProtocolError; + /// tries to transform the borrowed DataContractUpdateTransition into a DataContractUpdateTransitionAction + /// if validation is true the data contract transformation verifies that the data contract is valid + /// if validation is false, the data contract base structure is created regardless of if it is valid - fn try_from_platform_versioned( + pub fn try_from_borrowed_transition( value: &DataContractUpdateTransition, + validate: bool, platform_version: &PlatformVersion, - ) -> Result { + ) -> Result { match value { DataContractUpdateTransition::V0(v0) => Ok( - DataContractUpdateTransitionActionV0::try_from_platform_versioned( + DataContractUpdateTransitionActionV0::try_from_borrowed_transition( v0, + validate, platform_version, )? .into(), diff --git a/packages/rs-drive/src/state_transition_action/contract/data_contract_update/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/contract/data_contract_update/v0/transformer.rs index 009da92b40..7a13b3823c 100644 --- a/packages/rs-drive/src/state_transition_action/contract/data_contract_update/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/contract/data_contract_update/v0/transformer.rs @@ -3,42 +3,33 @@ use dpp::data_contract::DataContract; use dpp::state_transition::data_contract_update_transition::DataContractUpdateTransitionV0; use dpp::ProtocolError; use platform_version::version::PlatformVersion; -use platform_version::TryFromPlatformVersioned; -impl TryFromPlatformVersioned - for DataContractUpdateTransitionActionV0 -{ - type Error = ProtocolError; - - fn try_from_platform_versioned( +impl DataContractUpdateTransitionActionV0 { + pub(in crate::state_transition_action::contract::data_contract_update) fn try_from_transition( value: DataContractUpdateTransitionV0, + validate: bool, platform_version: &PlatformVersion, - ) -> Result { + ) -> Result { Ok(DataContractUpdateTransitionActionV0 { data_contract: DataContract::try_from_platform_versioned( value.data_contract, - true, + validate, platform_version, )?, identity_contract_nonce: value.identity_contract_nonce, user_fee_increase: value.user_fee_increase, }) } -} - -impl TryFromPlatformVersioned<&DataContractUpdateTransitionV0> - for DataContractUpdateTransitionActionV0 -{ - type Error = ProtocolError; - fn try_from_platform_versioned( + pub(in crate::state_transition_action::contract::data_contract_update) fn try_from_borrowed_transition( value: &DataContractUpdateTransitionV0, + validate: bool, platform_version: &PlatformVersion, - ) -> Result { + ) -> Result { Ok(DataContractUpdateTransitionActionV0 { data_contract: DataContract::try_from_platform_versioned( value.data_contract.clone(), - true, + validate, platform_version, )?, identity_contract_nonce: value.identity_contract_nonce, diff --git a/packages/rs-platform-value/src/converter/serde_json.rs b/packages/rs-platform-value/src/converter/serde_json.rs index bdd8025569..c83e456ce7 100644 --- a/packages/rs-platform-value/src/converter/serde_json.rs +++ b/packages/rs-platform-value/src/converter/serde_json.rs @@ -319,8 +319,16 @@ impl TryInto for Value { Value::Identifier(bytes) => { JsonValue::String(bs58::encode(bytes.as_slice()).into_string()) } - Value::EnumU8(_) => todo!(), - Value::EnumString(_) => todo!(), + Value::EnumU8(_) => { + return Err(Error::Unsupported( + "No support for conversion of EnumU8 to JSONValue".to_string(), + )) + } + Value::EnumString(_) => { + return Err(Error::Unsupported( + "No support for conversion of EnumString to JSONValue".to_string(), + )) + } }) } } diff --git a/packages/rs-platform-version/src/version/dpp_versions.rs b/packages/rs-platform-version/src/version/dpp_versions.rs index 637645003f..958c7bdc3a 100644 --- a/packages/rs-platform-version/src/version/dpp_versions.rs +++ b/packages/rs-platform-version/src/version/dpp_versions.rs @@ -58,6 +58,7 @@ pub struct DPPValidationVersions { pub validate_time_in_block_time_window: FeatureVersion, pub json_schema_validator: JsonSchemaValidatorVersions, pub data_contract: DataContractValidationVersions, + pub document_type: DocumentTypeValidationVersions, } #[derive(Clone, Debug, Default)] @@ -70,6 +71,11 @@ pub struct DataContractValidationVersions { pub validate_property_definition: FeatureVersion, } +#[derive(Clone, Debug, Default)] +pub struct DocumentTypeValidationVersions { + pub validate_update: FeatureVersion, +} + #[derive(Clone, Debug, Default)] pub struct JsonSchemaValidatorVersions { pub new: FeatureVersion, diff --git a/packages/rs-platform-version/src/version/mocks/v2_test.rs b/packages/rs-platform-version/src/version/mocks/v2_test.rs index b710380902..9de7bbd2bf 100644 --- a/packages/rs-platform-version/src/version/mocks/v2_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v2_test.rs @@ -3,10 +3,11 @@ use crate::version::dpp_versions::{ ContractVersions, CostVersions, DPPValidationVersions, DPPVersion, DataContractMethodVersions, DataContractValidationVersions, DocumentFeatureVersionBounds, DocumentMethodVersions, DocumentTransitionVersions, DocumentTypeClassMethodVersions, DocumentTypeIndexVersions, - DocumentTypeMethodVersions, DocumentTypeSchemaVersions, DocumentTypeVersions, DocumentVersions, - DocumentsBatchTransitionValidationVersions, DocumentsBatchTransitionVersions, - IdentityKeyTypeMethodVersions, IdentityTransitionAssetLockVersions, IdentityTransitionVersions, - IdentityVersions, JsonSchemaValidatorVersions, PublicKeyInCreationMethodVersions, + DocumentTypeMethodVersions, DocumentTypeSchemaVersions, DocumentTypeValidationVersions, + DocumentTypeVersions, DocumentVersions, DocumentsBatchTransitionValidationVersions, + DocumentsBatchTransitionVersions, IdentityKeyTypeMethodVersions, + IdentityTransitionAssetLockVersions, IdentityTransitionVersions, IdentityVersions, + JsonSchemaValidatorVersions, PublicKeyInCreationMethodVersions, RecursiveSchemaValidatorVersions, StateTransitionConversionVersions, StateTransitionMethodVersions, StateTransitionSerializationVersions, StateTransitionVersions, }; @@ -803,6 +804,7 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { validate_not_defined_properties: 0, validate_property_definition: 0, }, + document_type: DocumentTypeValidationVersions { validate_update: 0 }, }, state_transition_serialization_versions: StateTransitionSerializationVersions { identity_public_key_in_creation: FeatureVersionBounds { diff --git a/packages/rs-platform-version/src/version/mocks/v3_test.rs b/packages/rs-platform-version/src/version/mocks/v3_test.rs index f423c2400f..a9eaa473f0 100644 --- a/packages/rs-platform-version/src/version/mocks/v3_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v3_test.rs @@ -3,10 +3,11 @@ use crate::version::dpp_versions::{ ContractVersions, CostVersions, DPPValidationVersions, DPPVersion, DataContractMethodVersions, DataContractValidationVersions, DocumentFeatureVersionBounds, DocumentMethodVersions, DocumentTransitionVersions, DocumentTypeClassMethodVersions, DocumentTypeIndexVersions, - DocumentTypeMethodVersions, DocumentTypeSchemaVersions, DocumentTypeVersions, DocumentVersions, - DocumentsBatchTransitionValidationVersions, DocumentsBatchTransitionVersions, - IdentityKeyTypeMethodVersions, IdentityTransitionAssetLockVersions, IdentityTransitionVersions, - IdentityVersions, JsonSchemaValidatorVersions, PublicKeyInCreationMethodVersions, + DocumentTypeMethodVersions, DocumentTypeSchemaVersions, DocumentTypeValidationVersions, + DocumentTypeVersions, DocumentVersions, DocumentsBatchTransitionValidationVersions, + DocumentsBatchTransitionVersions, IdentityKeyTypeMethodVersions, + IdentityTransitionAssetLockVersions, IdentityTransitionVersions, IdentityVersions, + JsonSchemaValidatorVersions, PublicKeyInCreationMethodVersions, RecursiveSchemaValidatorVersions, StateTransitionConversionVersions, StateTransitionMethodVersions, StateTransitionSerializationVersions, StateTransitionVersions, }; @@ -643,7 +644,7 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { }, contract_create_state_transition: DriveAbciStateTransitionValidationVersion { basic_structure: Some(0), - advanced_structure: Some(0), + advanced_structure: None, identity_signatures: None, balance: None, nonce: Some(0), @@ -652,7 +653,7 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { }, contract_update_state_transition: DriveAbciStateTransitionValidationVersion { basic_structure: None, - advanced_structure: Some(0), + advanced_structure: None, identity_signatures: None, balance: None, nonce: Some(0), @@ -803,6 +804,7 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { validate_not_defined_properties: 0, validate_property_definition: 0, }, + document_type: DocumentTypeValidationVersions { validate_update: 0 }, }, state_transition_serialization_versions: StateTransitionSerializationVersions { identity_public_key_in_creation: FeatureVersionBounds { diff --git a/packages/rs-platform-version/src/version/v1.rs b/packages/rs-platform-version/src/version/v1.rs index 0666b2a9c2..24de1e3570 100644 --- a/packages/rs-platform-version/src/version/v1.rs +++ b/packages/rs-platform-version/src/version/v1.rs @@ -3,10 +3,11 @@ use crate::version::dpp_versions::{ ContractVersions, CostVersions, DPPValidationVersions, DPPVersion, DataContractMethodVersions, DataContractValidationVersions, DocumentFeatureVersionBounds, DocumentMethodVersions, DocumentTransitionVersions, DocumentTypeClassMethodVersions, DocumentTypeIndexVersions, - DocumentTypeMethodVersions, DocumentTypeSchemaVersions, DocumentTypeVersions, DocumentVersions, - DocumentsBatchTransitionValidationVersions, DocumentsBatchTransitionVersions, - IdentityKeyTypeMethodVersions, IdentityTransitionAssetLockVersions, IdentityTransitionVersions, - IdentityVersions, JsonSchemaValidatorVersions, PublicKeyInCreationMethodVersions, + DocumentTypeMethodVersions, DocumentTypeSchemaVersions, DocumentTypeValidationVersions, + DocumentTypeVersions, DocumentVersions, DocumentsBatchTransitionValidationVersions, + DocumentsBatchTransitionVersions, IdentityKeyTypeMethodVersions, + IdentityTransitionAssetLockVersions, IdentityTransitionVersions, IdentityVersions, + JsonSchemaValidatorVersions, PublicKeyInCreationMethodVersions, RecursiveSchemaValidatorVersions, StateTransitionConversionVersions, StateTransitionMethodVersions, StateTransitionSerializationVersions, StateTransitionVersions, }; @@ -640,7 +641,7 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { }, contract_create_state_transition: DriveAbciStateTransitionValidationVersion { basic_structure: Some(0), - advanced_structure: Some(0), + advanced_structure: None, identity_signatures: None, balance: None, nonce: Some(0), @@ -649,7 +650,7 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { }, contract_update_state_transition: DriveAbciStateTransitionValidationVersion { basic_structure: None, - advanced_structure: Some(0), + advanced_structure: None, identity_signatures: None, balance: None, nonce: Some(0), @@ -800,6 +801,7 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { validate_not_defined_properties: 0, validate_property_definition: 0, }, + document_type: DocumentTypeValidationVersions { validate_update: 0 }, }, state_transition_serialization_versions: StateTransitionSerializationVersions { identity_public_key_in_creation: FeatureVersionBounds { diff --git a/packages/rs-sdk/src/platform/document_query.rs b/packages/rs-sdk/src/platform/document_query.rs index 6834b82425..854dddb8c0 100644 --- a/packages/rs-sdk/src/platform/document_query.rs +++ b/packages/rs-sdk/src/platform/document_query.rs @@ -17,6 +17,7 @@ use dpp::{ document::Document, platform_value::{platform_value, Value}, prelude::{DataContract, Identifier}, + ProtocolError, }; use drive::query::{DriveQuery, InternalClauses, OrderClause, WhereClause, WhereOperator}; use drive_proof_verifier::{types::Documents, FromProof}; @@ -58,7 +59,9 @@ impl DocumentQuery { ) -> Result { let contract = contract.into(); // ensure document type name is correct - contract.document_type_for_name(document_type_name)?; + contract + .document_type_for_name(document_type_name) + .map_err(ProtocolError::DataContractError)?; Ok(Self { data_contract: Arc::clone(&contract), @@ -298,7 +301,8 @@ impl<'a> TryFrom<&'a DocumentQuery> for DriveQuery<'a> { // let data_contract = request.data_contract.clone(); let document_type = request .data_contract - .document_type_for_name(&request.document_type_name)?; + .document_type_for_name(&request.document_type_name) + .map_err(ProtocolError::DataContractError)?; let internal_clauses = InternalClauses::extract_from_clauses(request.where_clauses.clone()) .map_err(Error::Drive)?; diff --git a/packages/wasm-dpp/src/data_contract/data_contract.rs b/packages/wasm-dpp/src/data_contract/data_contract.rs index 8edb345b8d..fc272a5c5c 100644 --- a/packages/wasm-dpp/src/data_contract/data_contract.rs +++ b/packages/wasm-dpp/src/data_contract/data_contract.rs @@ -151,6 +151,7 @@ impl DataContractWasm { let document_type = self .inner .document_type_for_name(doc_type) + .map_err(ProtocolError::DataContractError) .with_js_error()?; let mut binary_paths = BTreeMap::new(); @@ -234,7 +235,11 @@ impl DataContractWasm { #[wasm_bindgen(js_name=getDocumentSchema)] pub fn document_schema(&mut self, name: &str) -> Result { - let document_type = self.inner.document_type_for_name(name).with_js_error()?; + let document_type = self + .inner + .document_type_for_name(name) + .map_err(ProtocolError::DataContractError) + .with_js_error()?; let serializer = serde_wasm_bindgen::Serializer::json_compatible(); diff --git a/packages/wasm-dpp/src/data_contract/errors/mod.rs b/packages/wasm-dpp/src/data_contract/errors/mod.rs index 62defde301..0068e7977b 100644 --- a/packages/wasm-dpp/src/data_contract/errors/mod.rs +++ b/packages/wasm-dpp/src/data_contract/errors/mod.rs @@ -11,15 +11,6 @@ pub use invalid_data_contract::*; pub fn from_data_contract_to_js_error(e: DataContractError) -> JsValue { match e { - DataContractError::InvalidDataContractError { - errors, - raw_data_contract, - } => InvalidDataContractError::new( - errors, - serde_wasm_bindgen::to_value(&raw_data_contract) - .expect("statically known structure should be a valid JSON"), - ) - .into(), DataContractError::InvalidDocumentTypeError(err) => { invalid_document_type::InvalidDocumentTypeInDataContractError::new( err.document_type(), diff --git a/packages/wasm-dpp/src/document/mod.rs b/packages/wasm-dpp/src/document/mod.rs index 42b176856b..3c6892249d 100644 --- a/packages/wasm-dpp/src/document/mod.rs +++ b/packages/wasm-dpp/src/document/mod.rs @@ -84,6 +84,7 @@ impl DocumentWasm { let document_type = js_data_contract .inner() .document_type_for_name(document_type_name.as_str()) + .map_err(ProtocolError::DataContractError) .with_js_error()?; let identifier_paths = document_type.identifier_paths().iter().map(|s| s.as_str()); @@ -298,6 +299,7 @@ impl DocumentWasm { let document_type = data_contract .inner() .document_type_for_name(document_type_name.as_str()) + .map_err(ProtocolError::DataContractError) .with_js_error()?; let bytes = self .0 @@ -329,6 +331,7 @@ impl DocumentWasm { let document_type = data_contract .inner() .document_type_for_name(document_type_name.as_str()) + .map_err(ProtocolError::DataContractError) .with_js_error()?; if document_type.binary_paths().contains(path) { diff --git a/packages/wasm-dpp/src/errors/protocol_error.rs b/packages/wasm-dpp/src/errors/protocol_error.rs index ec88edc686..a91e8820a5 100644 --- a/packages/wasm-dpp/src/errors/protocol_error.rs +++ b/packages/wasm-dpp/src/errors/protocol_error.rs @@ -1,4 +1,3 @@ -use crate::data_contract::errors::InvalidDataContractError; use wasm_bindgen::JsValue; use crate::errors::consensus::consensus_error::from_consensus_error; @@ -8,13 +7,6 @@ pub fn from_protocol_error(protocol_error: dpp::ProtocolError) -> JsValue { dpp::ProtocolError::ConsensusError(consensus_error) => { from_consensus_error(*consensus_error) } - dpp::ProtocolError::InvalidDataContractError(err) => { - let raw_data_contract = err.raw_data_contract(); - let protocol = serde_wasm_bindgen::to_value(&raw_data_contract); - protocol.map_or_else(JsValue::from, |raw_contract| { - InvalidDataContractError::new(err.errors, raw_contract).into() - }) - } dpp::ProtocolError::Error(anyhow_error) => { format!("Non-protocol error: {}", anyhow_error).into() } diff --git a/packages/wasm-dpp/src/identity/identity_public_key/mod.rs b/packages/wasm-dpp/src/identity/identity_public_key/mod.rs index 850d696fc4..0066b86294 100644 --- a/packages/wasm-dpp/src/identity/identity_public_key/mod.rs +++ b/packages/wasm-dpp/src/identity/identity_public_key/mod.rs @@ -12,6 +12,7 @@ use dpp::identity::identity_public_key::hash::IdentityPublicKeyHashMethodsV0; use dpp::identity::{IdentityPublicKey, KeyID, TimestampMillis}; use dpp::platform_value::{BinaryData, ReplacementType}; use dpp::serialization::ValueConvertible; +use dpp::ProtocolError; use dpp::version::PlatformVersion; mod purpose; @@ -97,7 +98,7 @@ impl IdentityPublicKeyWasm { self.0.set_security_level( security_level .try_into() - .map_err(|e: anyhow::Error| e.to_string())?, + .map_err(|e: ProtocolError| e.to_string())?, ); Ok(()) } diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_public_key_transitions.rs b/packages/wasm-dpp/src/identity/state_transition/identity_public_key_transitions.rs index 29141a4198..fb4289784a 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_public_key_transitions.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_public_key_transitions.rs @@ -9,6 +9,7 @@ use dpp::state_transition::public_key_in_creation::IdentityPublicKeyInCreation; use js_sys::Reflect::delete_property; pub use serde::{Deserialize, Serialize}; +use dpp::ProtocolError; use std::convert::TryInto; use wasm_bindgen::prelude::*; @@ -96,7 +97,7 @@ impl IdentityPublicKeyWithWitnessWasm { self.0.set_security_level( security_level .try_into() - .map_err(|e: anyhow::Error| e.to_string())?, + .map_err(|e: ProtocolError| e.to_string())?, ); Ok(()) } diff --git a/packages/wasm-dpp/test/unit/identity/Identity.spec.js b/packages/wasm-dpp/test/unit/identity/Identity.spec.js index eff3e1da06..dbff88969b 100644 --- a/packages/wasm-dpp/test/unit/identity/Identity.spec.js +++ b/packages/wasm-dpp/test/unit/identity/Identity.spec.js @@ -80,7 +80,7 @@ describe('Identity', () => { type: KeyType.ECDSA_SECP256K1, data: Buffer.alloc(36).fill('a'), purpose: KeyPurpose.AUTHENTICATION, - securityLevel: KeySecurityLevel.MASTER, + securityLevel: KeySecurityLevel.HIGH, readOnly: false, disabledAt: null, contractBounds: null, @@ -159,7 +159,7 @@ describe('Identity', () => { type: KeyType.ECDSA_SECP256K1, data: rawIdentity.publicKeys[0].data.toString('base64'), purpose: KeyPurpose.AUTHENTICATION, - securityLevel: KeySecurityLevel.MASTER, + securityLevel: KeySecurityLevel.HIGH, readOnly: false, disabledAt: null, contractBounds: null, diff --git a/packages/wasm-dpp/test/unit/identity/IdentityPublicKey.spec.js b/packages/wasm-dpp/test/unit/identity/IdentityPublicKey.spec.js index bbf4496928..f726c5869c 100644 --- a/packages/wasm-dpp/test/unit/identity/IdentityPublicKey.spec.js +++ b/packages/wasm-dpp/test/unit/identity/IdentityPublicKey.spec.js @@ -12,7 +12,7 @@ describe('IdentityPublicKey', () => { type: IdentityPublicKey.TYPES.ECDSA_SECP256K1, data: keyData, purpose: IdentityPublicKey.PURPOSES.AUTHENTICATION, - securityLevel: IdentityPublicKey.SECURITY_LEVELS.MASTER, + securityLevel: IdentityPublicKey.SECURITY_LEVELS.HIGH, readOnly: false, contractBounds: null, }; @@ -194,7 +194,7 @@ describe('IdentityPublicKey', () => { type: IdentityPublicKey.TYPES.ECDSA_SECP256K1, data: 'AkVuTKyF3YgKLAQlLEtaUL2HTditwGILfWUVqjzYnIgH', purpose: IdentityPublicKey.PURPOSES.AUTHENTICATION, - securityLevel: IdentityPublicKey.SECURITY_LEVELS.MASTER, + securityLevel: IdentityPublicKey.SECURITY_LEVELS.HIGH, readOnly: false, disabledAt: now.getTime(), contractBounds: null, @@ -215,7 +215,7 @@ describe('IdentityPublicKey', () => { type: IdentityPublicKey.TYPES.ECDSA_SECP256K1, data: Buffer.from('AkVuTKyF3YgKLAQlLEtaUL2HTditwGILfWUVqjzYnIgH', 'base64'), purpose: IdentityPublicKey.PURPOSES.AUTHENTICATION, - securityLevel: IdentityPublicKey.SECURITY_LEVELS.MASTER, + securityLevel: IdentityPublicKey.SECURITY_LEVELS.HIGH, readOnly: false, disabledAt: now.getTime(), contractBounds: null, From 83d94247778a60153f84f31bed10061b991d2704 Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Thu, 14 Mar 2024 14:30:08 +0700 Subject: [PATCH 086/191] feat(platform)!: key disabled at based on state transition block time (#1771) --- packages/rs-dpp/src/document/v0/mod.rs | 8 ++- packages/rs-dpp/src/errors/consensus/codes.rs | 1 - ..._key_disabled_at_window_violation_error.rs | 50 ------------------- .../errors/consensus/state/identity/mod.rs | 1 - .../src/errors/consensus/state/state_error.rs | 6 --- .../rs-dpp/src/identity/identity_facade.rs | 6 +-- .../rs-dpp/src/identity/identity_factory.rs | 12 +---- .../v0/stateTransition/identityUpdate.json | 12 ----- .../src/state_transition/serialization.rs | 2 - .../accessors/mod.rs | 16 +----- .../accessors/v0/mod.rs | 4 +- .../identity_update_transition/fields.rs | 1 - .../identity_update_transition/methods/mod.rs | 2 - .../methods/v0/mod.rs | 1 - .../v0/json_conversion.rs | 1 - .../identity_update_transition/v0/mod.rs | 5 +- .../v0/v0_methods.rs | 12 +---- .../v0/value_conversion.rs | 6 --- .../get_identity_update_transition_fixture.rs | 1 - .../src/execution/check_tx/v0/mod.rs | 3 -- .../disable_identity_keys/v0/mod.rs | 2 - .../update_operator_identity/v0/mod.rs | 4 +- .../update_owner_withdrawal_address/v0/mod.rs | 1 - .../update_voter_identity/v0/mod.rs | 1 - .../identity_update/state/v0/mod.rs | 47 ----------------- .../identity_update/structure/v0/mod.rs | 15 +----- .../drive/batch/drive_op_batch/identity.rs | 7 +-- .../data_contract_create_transition.rs | 1 - .../identity/identity_update_transition.rs | 18 +++---- .../identity/identity_update/mod.rs | 9 +--- .../identity/identity_update/v0/mod.rs | 4 +- .../identity_update/v0/transformer.rs | 4 -- .../src/converter/serde_json.rs | 1 - packages/strategy-tests/src/transitions.rs | 2 - .../getIdentityUpdateTransitionFixture.js | 1 - .../wasm-dpp/src/data_contract/errors/mod.rs | 2 - .../src/errors/consensus/consensus_error.rs | 10 ++-- ..._key_disabled_at_window_violation_error.rs | 49 ------------------ .../errors/consensus/state/identity/mod.rs | 2 - .../wasm-dpp/src/identity/identity_facade.rs | 2 - .../wasm-dpp/src/identity/identity_factory.rs | 3 -- .../identity_update_transition.rs | 33 ------------ .../identity_update_transition/to_object.rs | 3 -- .../identity/IdentityFacade.spec.js | 1 - ...entityUpdateTransitionStateFactory.spec.js | 34 ------------- .../unit/identity/IdentityFactory.spec.js | 1 - .../IdentityUpdateTransition.spec.js | 21 -------- 47 files changed, 25 insertions(+), 403 deletions(-) delete mode 100644 packages/rs-dpp/src/errors/consensus/state/identity/identity_public_key_disabled_at_window_violation_error.rs delete mode 100644 packages/wasm-dpp/src/errors/consensus/state/identity/identity_public_key_disabled_at_window_violation_error.rs diff --git a/packages/rs-dpp/src/document/v0/mod.rs b/packages/rs-dpp/src/document/v0/mod.rs index 650da783e8..3eb6169fe0 100644 --- a/packages/rs-dpp/src/document/v0/mod.rs +++ b/packages/rs-dpp/src/document/v0/mod.rs @@ -12,7 +12,7 @@ pub(super) mod json_conversion; mod platform_value_conversion; pub mod serialize; -use chrono::{DateTime, NaiveDateTime, Utc}; +use chrono::DateTime; use std::collections::BTreeMap; use std::fmt; @@ -77,13 +77,11 @@ impl fmt::Display for DocumentV0 { write!(f, "id:{} ", self.id)?; write!(f, "owner_id:{} ", self.owner_id)?; if let Some(created_at) = self.created_at { - let naive = NaiveDateTime::from_timestamp_millis(created_at as i64).unwrap_or_default(); - let datetime: DateTime = DateTime::from_naive_utc_and_offset(naive, Utc); + let datetime = DateTime::from_timestamp_millis(created_at as i64).unwrap_or_default(); write!(f, "created_at:{} ", datetime.format("%Y-%m-%d %H:%M:%S"))?; } if let Some(updated_at) = self.updated_at { - let naive = NaiveDateTime::from_timestamp_millis(updated_at as i64).unwrap_or_default(); - let datetime: DateTime = DateTime::from_naive_utc_and_offset(naive, Utc); + let datetime = DateTime::from_timestamp_millis(updated_at as i64).unwrap_or_default(); write!(f, "updated_at:{} ", datetime.format("%Y-%m-%d %H:%M:%S"))?; } diff --git a/packages/rs-dpp/src/errors/consensus/codes.rs b/packages/rs-dpp/src/errors/consensus/codes.rs index 9b0108d97d..8860dbe5ab 100644 --- a/packages/rs-dpp/src/errors/consensus/codes.rs +++ b/packages/rs-dpp/src/errors/consensus/codes.rs @@ -193,7 +193,6 @@ impl ErrorWithCode for StateError { // Identity Self::IdentityAlreadyExistsError(_) => 4011, - Self::IdentityPublicKeyDisabledAtWindowViolationError { .. } => 4012, Self::IdentityPublicKeyIsReadOnlyError { .. } => 4017, Self::InvalidIdentityPublicKeyIdError { .. } => 4018, Self::InvalidIdentityRevisionError { .. } => 4019, diff --git a/packages/rs-dpp/src/errors/consensus/state/identity/identity_public_key_disabled_at_window_violation_error.rs b/packages/rs-dpp/src/errors/consensus/state/identity/identity_public_key_disabled_at_window_violation_error.rs deleted file mode 100644 index 772a5a123f..0000000000 --- a/packages/rs-dpp/src/errors/consensus/state/identity/identity_public_key_disabled_at_window_violation_error.rs +++ /dev/null @@ -1,50 +0,0 @@ -use crate::consensus::state::state_error::StateError; -use crate::consensus::ConsensusError; -use crate::errors::ProtocolError; -use bincode::{Decode, Encode}; -use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; -use thiserror::Error; - -#[derive( - Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, -)] -#[error("Identity public keys disabled time ({disabled_at}) is out of block time window from {time_window_start} and {time_window_end}")] -#[platform_serialize(unversioned)] -pub struct IdentityPublicKeyDisabledAtWindowViolationError { - /* - - DO NOT CHANGE ORDER OF FIELDS WITHOUT INTRODUCING OF NEW VERSION - - */ - disabled_at: u64, - time_window_start: u64, - time_window_end: u64, -} - -impl IdentityPublicKeyDisabledAtWindowViolationError { - pub fn new(disabled_at: u64, time_window_start: u64, time_window_end: u64) -> Self { - Self { - disabled_at, - time_window_start, - time_window_end, - } - } - - pub fn disabled_at(&self) -> u64 { - self.disabled_at - } - - pub fn time_window_start(&self) -> u64 { - self.time_window_start - } - pub fn time_window_end(&self) -> u64 { - self.time_window_end - } -} -impl From for ConsensusError { - fn from(err: IdentityPublicKeyDisabledAtWindowViolationError) -> Self { - Self::StateError(StateError::IdentityPublicKeyDisabledAtWindowViolationError( - err, - )) - } -} diff --git a/packages/rs-dpp/src/errors/consensus/state/identity/mod.rs b/packages/rs-dpp/src/errors/consensus/state/identity/mod.rs index 6b8fbc0e27..178b283855 100644 --- a/packages/rs-dpp/src/errors/consensus/state/identity/mod.rs +++ b/packages/rs-dpp/src/errors/consensus/state/identity/mod.rs @@ -6,7 +6,6 @@ pub mod duplicated_identity_public_key_state_error; mod identity_already_exists_error; mod identity_insufficient_balance_error; pub mod identity_public_key_already_exists_for_unique_contract_bounds_error; -pub mod identity_public_key_disabled_at_window_violation_error; pub mod identity_public_key_is_disabled_error; pub mod identity_public_key_is_read_only_error; pub mod invalid_asset_lock_proof_value; diff --git a/packages/rs-dpp/src/errors/consensus/state/state_error.rs b/packages/rs-dpp/src/errors/consensus/state/state_error.rs index 49bbcf73c6..a4e689a0d0 100644 --- a/packages/rs-dpp/src/errors/consensus/state/state_error.rs +++ b/packages/rs-dpp/src/errors/consensus/state/state_error.rs @@ -17,7 +17,6 @@ use crate::consensus::state::document::duplicate_unique_index_error::DuplicateUn use crate::consensus::state::document::invalid_document_revision_error::InvalidDocumentRevisionError; use crate::consensus::state::identity::duplicated_identity_public_key_id_state_error::DuplicatedIdentityPublicKeyIdStateError; use crate::consensus::state::identity::duplicated_identity_public_key_state_error::DuplicatedIdentityPublicKeyStateError; -use crate::consensus::state::identity::identity_public_key_disabled_at_window_violation_error::IdentityPublicKeyDisabledAtWindowViolationError; use crate::consensus::state::identity::identity_public_key_is_disabled_error::IdentityPublicKeyIsDisabledError; use crate::consensus::state::identity::identity_public_key_is_read_only_error::IdentityPublicKeyIsReadOnlyError; use crate::consensus::state::identity::invalid_identity_public_key_id_error::InvalidIdentityPublicKeyIdError; @@ -80,11 +79,6 @@ pub enum StateError { IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError, ), - #[error(transparent)] - IdentityPublicKeyDisabledAtWindowViolationError( - IdentityPublicKeyDisabledAtWindowViolationError, - ), - #[error(transparent)] IdentityPublicKeyIsReadOnlyError(IdentityPublicKeyIsReadOnlyError), diff --git a/packages/rs-dpp/src/identity/identity_facade.rs b/packages/rs-dpp/src/identity/identity_facade.rs index eac0744190..919c68c624 100644 --- a/packages/rs-dpp/src/identity/identity_facade.rs +++ b/packages/rs-dpp/src/identity/identity_facade.rs @@ -4,7 +4,7 @@ use std::collections::BTreeMap; use crate::identity::state_transition::asset_lock_proof::chain::ChainAssetLockProof; use crate::identity::state_transition::asset_lock_proof::{AssetLockProof, InstantAssetLockProof}; -use crate::identity::{Identity, IdentityPublicKey, KeyID, TimestampMillis}; +use crate::identity::{Identity, IdentityPublicKey, KeyID}; use crate::prelude::{Identifier, IdentityNonce}; use crate::identity::identity_factory::IdentityFactory; @@ -143,16 +143,12 @@ impl IdentityFacade { identity_nonce: u64, add_public_keys: Option>, public_key_ids_to_disable: Option>, - // Pass disable time as argument because SystemTime::now() does not work for wasm target - // https://github.com/rust-lang/rust/issues/48564 - disable_time: Option, ) -> Result { self.factory.create_identity_update_transition( identity, identity_nonce, add_public_keys, public_key_ids_to_disable, - disable_time, ) } } diff --git a/packages/rs-dpp/src/identity/identity_factory.rs b/packages/rs-dpp/src/identity/identity_factory.rs index 95b44630a7..c6aface591 100644 --- a/packages/rs-dpp/src/identity/identity_factory.rs +++ b/packages/rs-dpp/src/identity/identity_factory.rs @@ -5,7 +5,7 @@ use crate::identity::state_transition::asset_lock_proof::InstantAssetLockProof; #[cfg(all(feature = "state-transitions", feature = "client"))] use crate::identity::state_transition::AssetLockProved; #[cfg(all(feature = "state-transitions", feature = "client"))] -use crate::identity::{IdentityV0, TimestampMillis}; +use crate::identity::IdentityV0; use crate::identity::{Identity, IdentityPublicKey, KeyID}; @@ -258,9 +258,6 @@ impl IdentityFactory { identity_nonce: u64, add_public_keys: Option>, public_key_ids_to_disable: Option>, - // Pass disable time as argument because SystemTime::now() does not work for wasm target - // https://github.com/rust-lang/rust/issues/48564 - disable_time: Option, ) -> Result { let mut identity_update_transition = IdentityUpdateTransitionV0::default(); identity_update_transition.set_identity_id(identity.id().to_owned()); @@ -272,14 +269,7 @@ impl IdentityFactory { } if let Some(public_key_ids_to_disable) = public_key_ids_to_disable { - if disable_time.is_none() { - return Err(ProtocolError::Generic( - "Public keys disabled at must be present".to_string(), - )); - } - identity_update_transition.set_public_key_ids_to_disable(public_key_ids_to_disable); - identity_update_transition.set_public_keys_disabled_at(disable_time); } Ok(IdentityUpdateTransition::V0(identity_update_transition)) diff --git a/packages/rs-dpp/src/schema/identity/v0/stateTransition/identityUpdate.json b/packages/rs-dpp/src/schema/identity/v0/stateTransition/identityUpdate.json index ff241acdfc..b31632dd9e 100644 --- a/packages/rs-dpp/src/schema/identity/v0/stateTransition/identityUpdate.json +++ b/packages/rs-dpp/src/schema/identity/v0/stateTransition/identityUpdate.json @@ -28,10 +28,6 @@ "minimum": 0, "description": "Identity update revision" }, - "publicKeysDisabledAt": { - "type": "integer", - "minimum": 0 - }, "addPublicKeys": { "type": "array", "minItems": 1, @@ -53,14 +49,6 @@ "minimum": 0 } }, - "dependentRequired": { - "disablePublicKeys": [ - "publicKeysDisabledAt" - ], - "publicKeysDisabledAt": [ - "disablePublicKeys" - ] - }, "anyOf": [ { "type": "object", diff --git a/packages/rs-dpp/src/state_transition/serialization.rs b/packages/rs-dpp/src/state_transition/serialization.rs index 5757fd76c3..1c1722c5ab 100644 --- a/packages/rs-dpp/src/state_transition/serialization.rs +++ b/packages/rs-dpp/src/state_transition/serialization.rs @@ -125,7 +125,6 @@ mod tests { nonce: 1, add_public_keys: add_public_keys_in_creation, disable_public_keys: vec![], - public_keys_disabled_at: None, user_fee_increase: 0, }; @@ -193,7 +192,6 @@ mod tests { nonce: 1, add_public_keys: add_public_keys_in_creation, disable_public_keys: vec![3, 4, 5], - public_keys_disabled_at: Some(15), user_fee_increase: 0, }; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/accessors/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/accessors/mod.rs index fe814f4f48..858f0ee423 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/accessors/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/accessors/mod.rs @@ -1,6 +1,6 @@ mod v0; -use crate::identity::{KeyID, TimestampMillis}; +use crate::identity::KeyID; use crate::prelude::{IdentityNonce, Revision}; use crate::state_transition::identity_update_transition::IdentityUpdateTransition; use crate::state_transition::public_key_in_creation::IdentityPublicKeyInCreation; @@ -78,20 +78,6 @@ impl IdentityUpdateTransitionAccessorsV0 for IdentityUpdateTransition { } } - fn set_public_keys_disabled_at(&mut self, public_keys_disabled_at: Option) { - match self { - IdentityUpdateTransition::V0(transition) => { - transition.set_public_keys_disabled_at(public_keys_disabled_at) - } - } - } - - fn public_keys_disabled_at(&self) -> Option { - match self { - IdentityUpdateTransition::V0(transition) => transition.public_keys_disabled_at(), - } - } - fn owner_id(&self) -> Identifier { match self { IdentityUpdateTransition::V0(transition) => transition.owner_id(), diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/accessors/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/accessors/v0/mod.rs index a3510e6fda..30a8daf515 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/accessors/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/accessors/v0/mod.rs @@ -2,7 +2,7 @@ use crate::prelude::IdentityNonce; use crate::state_transition::public_key_in_creation::IdentityPublicKeyInCreation; use crate::{ identity::KeyID, - prelude::{Identifier, Revision, TimestampMillis}, + prelude::{Identifier, Revision}, }; pub trait IdentityUpdateTransitionAccessorsV0 { @@ -17,7 +17,5 @@ pub trait IdentityUpdateTransitionAccessorsV0 { fn public_keys_to_add_mut(&mut self) -> &mut [IdentityPublicKeyInCreation]; fn set_public_key_ids_to_disable(&mut self, disable_public_keys: Vec); fn public_key_ids_to_disable(&self) -> &[KeyID]; - fn set_public_keys_disabled_at(&mut self, public_keys_disabled_at: Option); - fn public_keys_disabled_at(&self) -> Option; fn owner_id(&self) -> Identifier; } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/fields.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/fields.rs index 338100d928..115e5cc326 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/fields.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/fields.rs @@ -14,7 +14,6 @@ pub mod property_names { pub const ADD_PUBLIC_KEYS_SIGNATURE: &str = "addPublicKeys[].signature"; pub const ADD_PUBLIC_KEYS: &str = "addPublicKeys"; pub const DISABLE_PUBLIC_KEYS: &str = "disablePublicKeys"; - pub const PUBLIC_KEYS_DISABLED_AT: &str = "publicKeysDisabledAt"; } pub const IDENTIFIER_FIELDS: [&str; 1] = [IDENTITY_ID]; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/methods/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/methods/mod.rs index 7b5b482cb6..dc530225de 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/methods/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/methods/mod.rs @@ -29,7 +29,6 @@ impl IdentityUpdateTransitionMethodsV0 for IdentityUpdateTransition { master_public_key_id: &KeyID, add_public_keys: Vec, disable_public_keys: Vec, - public_keys_disabled_at: Option, nonce: IdentityNonce, user_fee_increase: UserFeeIncrease, signer: &S, @@ -48,7 +47,6 @@ impl IdentityUpdateTransitionMethodsV0 for IdentityUpdateTransition { master_public_key_id, add_public_keys, disable_public_keys, - public_keys_disabled_at, nonce, user_fee_increase, signer, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/methods/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/methods/v0/mod.rs index 82bbceb7f1..338f5afc44 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/methods/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/methods/v0/mod.rs @@ -21,7 +21,6 @@ pub trait IdentityUpdateTransitionMethodsV0 { master_public_key_id: &KeyID, add_public_keys: Vec, disable_public_keys: Vec, - public_keys_disabled_at: Option, nonce: IdentityNonce, user_fee_increase: UserFeeIncrease, signer: &S, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/json_conversion.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/json_conversion.rs index 6ecab17352..15a8383f41 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/json_conversion.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/json_conversion.rs @@ -28,7 +28,6 @@ mod test { nonce: 1, add_public_keys: vec![public_key.into()], disable_public_keys: vec![], - public_keys_disabled_at: None, user_fee_increase: 0, signature_public_key_id: 0, signature: BinaryData::new(buffer.to_vec()), diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/mod.rs index 1a00215f53..55fb52ba7f 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/mod.rs @@ -22,7 +22,7 @@ use crate::state_transition::public_key_in_creation::IdentityPublicKeyInCreation use crate::prelude::{IdentityNonce, UserFeeIncrease}; use crate::{ identity::KeyID, - prelude::{Identifier, Revision, TimestampMillis}, + prelude::{Identifier, Revision}, ProtocolError, }; @@ -57,9 +57,6 @@ pub struct IdentityUpdateTransitionV0 { #[cfg_attr(feature = "state-transition-serde-conversion", serde(default))] pub disable_public_keys: Vec, - /// Timestamp when keys were disabled - pub public_keys_disabled_at: Option, - /// The fee multiplier pub user_fee_increase: UserFeeIncrease, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/v0_methods.rs index 9d58fafe15..3d143f1660 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/v0_methods.rs @@ -32,7 +32,7 @@ use crate::state_transition::{GetDataContractSecurityLevelRequirementFn, StateTr use crate::version::FeatureVersion; use crate::{ identity::KeyID, - prelude::{Identifier, Revision, TimestampMillis}, + prelude::{Identifier, Revision}, }; #[cfg(feature = "state-transition-signing")] use crate::{identity::SecurityLevel, ProtocolError}; @@ -43,7 +43,6 @@ impl IdentityUpdateTransitionMethodsV0 for IdentityUpdateTransitionV0 { master_public_key_id: &KeyID, add_public_keys: Vec, disable_public_keys: Vec, - public_keys_disabled_at: Option, nonce: IdentityNonce, user_fee_increase: UserFeeIncrease, signer: &S, @@ -63,7 +62,6 @@ impl IdentityUpdateTransitionMethodsV0 for IdentityUpdateTransitionV0 { nonce, add_public_keys: add_public_keys_in_creation, disable_public_keys, - public_keys_disabled_at, user_fee_increase, }; @@ -158,14 +156,6 @@ impl IdentityUpdateTransitionAccessorsV0 for IdentityUpdateTransitionV0 { &self.disable_public_keys } - fn set_public_keys_disabled_at(&mut self, public_keys_disabled_at: Option) { - self.public_keys_disabled_at = public_keys_disabled_at; - } - - fn public_keys_disabled_at(&self) -> Option { - self.public_keys_disabled_at - } - fn owner_id(&self) -> Identifier { self.identity_id } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/value_conversion.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/value_conversion.rs index 2af88151d8..67c42289be 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/value_conversion.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/value_conversion.rs @@ -48,9 +48,6 @@ impl<'a> StateTransitionValueConvert<'a> for IdentityUpdateTransitionV0 { .collect::, ProtocolError>>()?; let disable_public_keys = remove_integer_list_or_default(&mut raw_object, property_names::DISABLE_PUBLIC_KEYS)?; - let public_keys_disabled_at = raw_object - .remove_optional_integer(property_names::PUBLIC_KEYS_DISABLED_AT) - .map_err(ProtocolError::ValueError)?; Ok(IdentityUpdateTransitionV0 { signature, @@ -60,7 +57,6 @@ impl<'a> StateTransitionValueConvert<'a> for IdentityUpdateTransitionV0 { nonce, add_public_keys, disable_public_keys, - public_keys_disabled_at, user_fee_increase, }) } @@ -120,8 +116,6 @@ impl<'a> StateTransitionValueConvert<'a> for IdentityUpdateTransitionV0 { value.remove_optional_value_if_empty_array(property_names::DISABLE_PUBLIC_KEYS)?; - value.remove_optional_value_if_null(property_names::PUBLIC_KEYS_DISABLED_AT)?; - Ok(value) } diff --git a/packages/rs-dpp/src/tests/fixtures/get_identity_update_transition_fixture.rs b/packages/rs-dpp/src/tests/fixtures/get_identity_update_transition_fixture.rs index b2a9320780..65f4df81f2 100644 --- a/packages/rs-dpp/src/tests/fixtures/get_identity_update_transition_fixture.rs +++ b/packages/rs-dpp/src/tests/fixtures/get_identity_update_transition_fixture.rs @@ -40,7 +40,6 @@ pub fn get_identity_update_transition_fixture( } .into()], disable_public_keys: vec![0], - public_keys_disabled_at: Some(1234567), ..Default::default() } .into(), diff --git a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs index 5f40d10654..7809daa834 100644 --- a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs @@ -2168,7 +2168,6 @@ mod tests { nonce: 1, add_public_keys: vec![IdentityPublicKeyInCreation::V0(new_key)], disable_public_keys: vec![], - public_keys_disabled_at: None, user_fee_increase: 0, signature_public_key_id: 1, signature: Default::default(), @@ -2281,7 +2280,6 @@ mod tests { nonce: 1, add_public_keys: vec![IdentityPublicKeyInCreation::V0(new_key.clone())], disable_public_keys: vec![], - public_keys_disabled_at: None, user_fee_increase: 0, signature_public_key_id: 0, signature: Default::default(), @@ -2306,7 +2304,6 @@ mod tests { nonce: 1, add_public_keys: vec![IdentityPublicKeyInCreation::V0(new_key)], disable_public_keys: vec![], - public_keys_disabled_at: None, user_fee_increase: 0, signature_public_key_id: 0, signature: Default::default(), diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/disable_identity_keys/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/disable_identity_keys/v0/mod.rs index 6efc66d844..91d385e98d 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/disable_identity_keys/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/disable_identity_keys/v0/mod.rs @@ -97,7 +97,6 @@ where drive_operations.push(IdentityOperation(DisableIdentityKeys { identity_id: operator_identifier, keys_ids: operator_identity_keys, - disable_at: block_info.time_ms, })); tracing::trace!( @@ -111,7 +110,6 @@ where drive_operations.push(IdentityOperation(DisableIdentityKeys { identity_id: voter_identifier, keys_ids: voter_identity_keys, - disable_at: block_info.time_ms, })); Ok(()) diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_operator_identity/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_operator_identity/v0/mod.rs index 98c1b95edb..e64e2848ae 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_operator_identity/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_operator_identity/v0/mod.rs @@ -35,7 +35,7 @@ where pub(super) fn update_operator_identity_v0( &self, masternode: &(ProTxHash, DMNStateDiff), - block_info: &BlockInfo, + _block_info: &BlockInfo, platform_state: &PlatformState, transaction: &Transaction, drive_operations: &mut Vec, @@ -144,7 +144,6 @@ where drive_operations.push(IdentityOperation(DisableIdentityKeys { identity_id: new_operator_identifier, keys_ids: old_operator_identity_key_ids_to_disable, - disable_at: block_info.time_ms, })); } @@ -232,7 +231,6 @@ where drive_operations.push(IdentityOperation(DisableIdentityKeys { identity_id: old_operator_identifier, keys_ids: old_operator_identity_key_ids_to_disable, - disable_at: block_info.time_ms, })); } let new_payout_address = diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_owner_withdrawal_address/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_owner_withdrawal_address/v0/mod.rs index fc45189d7b..86de80f1d3 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_owner_withdrawal_address/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_owner_withdrawal_address/v0/mod.rs @@ -85,7 +85,6 @@ where drive_operations.push(IdentityOperation(DisableIdentityKeys { identity_id: owner_identifier, keys_ids: key_ids_to_disable, - disable_at: block_info.time_ms, })); } diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_voter_identity/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_voter_identity/v0/mod.rs index 87ee96806d..ec574f89a6 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_voter_identity/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_voter_identity/v0/mod.rs @@ -85,7 +85,6 @@ where drive_operations.push(IdentityOperation(DisableIdentityKeys { identity_id: old_voter_identifier, keys_ids: old_voter_identity_key_ids, - disable_at: block_info.time_ms, })); // Part 2 : Create or Update Voting identity based on new key diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/state/v0/mod.rs index 078374d64a..dbfb3fdbb3 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/state/v0/mod.rs @@ -1,19 +1,13 @@ -use crate::error::execution::ExecutionError; use crate::error::Error; use crate::platform_types::platform::PlatformRef; use crate::rpc::core::CoreRPCLike; -use dpp::consensus::state::identity::identity_public_key_disabled_at_window_violation_error::IdentityPublicKeyDisabledAtWindowViolationError; -use dpp::consensus::state::state_error::StateError; - use dpp::prelude::ConsensusValidationResult; use dpp::state_transition::identity_update_transition::accessors::IdentityUpdateTransitionAccessorsV0; use dpp::state_transition::identity_update_transition::IdentityUpdateTransition; -use dpp::validation::block_time_window::validate_time_in_block_time_window::validate_time_in_block_time_window; use dpp::version::PlatformVersion; -use dpp::ProtocolError; use drive::state_transition_action::identity::identity_update::IdentityUpdateTransitionAction; use drive::state_transition_action::StateTransitionAction; @@ -25,7 +19,6 @@ use crate::execution::validation::state_transition::common::validate_identity_pu use crate::execution::validation::state_transition::common::validate_identity_public_key_ids_dont_exist_in_state::validate_identity_public_key_ids_dont_exist_in_state; use crate::execution::validation::state_transition::common::validate_identity_public_key_ids_exist_in_state::validate_identity_public_key_ids_exist_in_state; use crate::execution::validation::state_transition::common::validate_unique_identity_public_key_hashes_in_state::validate_unique_identity_public_key_hashes_not_in_state; -use crate::platform_types::platform_state::v0::PlatformStateV0Methods; pub(in crate::execution::validation::state_transition::state_transitions::identity_update) trait IdentityUpdateStateTransitionStateValidationV0 { @@ -148,46 +141,6 @@ impl IdentityUpdateStateTransitionStateValidationV0 for IdentityUpdateTransition validation_result.errors, )); } - - if let Some(disabled_at_ms) = self.public_keys_disabled_at() { - // We need to verify the time the keys were disabled - - let last_block_time = - platform - .state - .last_committed_block_time_ms() - .ok_or(Error::Execution(ExecutionError::StateNotInitialized( - "expected a last platform block during identity update validation", - )))?; - - let window_validation_result = validate_time_in_block_time_window( - last_block_time, - disabled_at_ms, - platform.config.block_spacing_ms, - platform_version, - ) - .map_err(|e| Error::Protocol(ProtocolError::NonConsensusError(e)))?; - - if !window_validation_result.valid { - validation_result.add_error( - StateError::IdentityPublicKeyDisabledAtWindowViolationError( - IdentityPublicKeyDisabledAtWindowViolationError::new( - disabled_at_ms, - window_validation_result.time_window_start, - window_validation_result.time_window_end, - ), - ), - ); - let bump_action = StateTransitionAction::BumpIdentityNonceAction( - BumpIdentityNonceAction::from_borrowed_identity_update_transition(self)?, - ); - - return Ok(ConsensusValidationResult::new_with_data_and_errors( - bump_action, - validation_result.errors, - )); - } - } } self.transform_into_action_v0() } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/structure/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/structure/v0/mod.rs index 3c7ce366d6..df1f538c1e 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/structure/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/structure/v0/mod.rs @@ -1,7 +1,6 @@ use crate::error::Error; use dpp::consensus::basic::identity::{ - DuplicatedIdentityPublicKeyIdBasicError, InvalidIdentityUpdateTransitionDisableKeysError, - InvalidIdentityUpdateTransitionEmptyError, + DuplicatedIdentityPublicKeyIdBasicError, InvalidIdentityUpdateTransitionEmptyError, }; use dpp::consensus::state::identity::max_identity_public_key_limit_reached_error::MaxIdentityPublicKeyLimitReachedError; use dpp::consensus::ConsensusError; @@ -61,18 +60,6 @@ impl IdentityUpdateStateTransitionStructureValidationV0 for IdentityUpdateTransi ids.insert(key_id); } - - // Ensure disable at timestamp is present - if self.public_keys_disabled_at().is_none() { - result.add_error(ConsensusError::from( - InvalidIdentityUpdateTransitionDisableKeysError::new(), - )) - } - } else if self.public_keys_disabled_at().is_some() { - // Ensure there are public keys to disable when disable at timestamp is present - result.add_error(ConsensusError::from( - InvalidIdentityUpdateTransitionDisableKeysError::new(), - )) } if !result.is_valid() { diff --git a/packages/rs-drive/src/drive/batch/drive_op_batch/identity.rs b/packages/rs-drive/src/drive/batch/drive_op_batch/identity.rs index 491a78faf3..78416eb878 100644 --- a/packages/rs-drive/src/drive/batch/drive_op_batch/identity.rs +++ b/packages/rs-drive/src/drive/batch/drive_op_batch/identity.rs @@ -3,7 +3,7 @@ use crate::drive::Drive; use crate::error::Error; use crate::fee::op::LowLevelDriveOperation; use dpp::block::block_info::BlockInfo; -use dpp::identity::{Identity, IdentityPublicKey, KeyID, TimestampMillis}; +use dpp::identity::{Identity, IdentityPublicKey, KeyID}; use dpp::prelude::{IdentityNonce, Revision}; use crate::drive::identity::update::methods::merge_identity_nonce::MergeIdentityContractNonceResultToResult; @@ -56,8 +56,6 @@ pub enum IdentityOperationType { identity_id: [u8; 32], /// The keys to be added keys_ids: Vec, - /// The time at which they were disabled - disable_at: TimestampMillis, }, /// Re-Enable Identity Keys @@ -157,11 +155,10 @@ impl DriveLowLevelOperationConverter for IdentityOperationType { IdentityOperationType::DisableIdentityKeys { identity_id, keys_ids, - disable_at, } => drive.disable_identity_keys_operations( identity_id, keys_ids, - disable_at, + block_info.time_ms, estimated_costs_only_with_layer_info, transaction, platform_version, diff --git a/packages/rs-drive/src/drive/batch/transitions/contract/data_contract_create_transition.rs b/packages/rs-drive/src/drive/batch/transitions/contract/data_contract_create_transition.rs index f1582bd152..4f148deaf6 100644 --- a/packages/rs-drive/src/drive/batch/transitions/contract/data_contract_create_transition.rs +++ b/packages/rs-drive/src/drive/batch/transitions/contract/data_contract_create_transition.rs @@ -5,7 +5,6 @@ use crate::error::Error; use crate::state_transition_action::contract::data_contract_create::DataContractCreateTransitionAction; use dpp::block::epoch::Epoch; use dpp::data_contract::accessors::v0::DataContractV0Getters; -use dpp::data_contract::config::v0::DataContractConfigGettersV0; use dpp::version::PlatformVersion; use std::borrow::Cow; diff --git a/packages/rs-drive/src/drive/batch/transitions/identity/identity_update_transition.rs b/packages/rs-drive/src/drive/batch/transitions/identity/identity_update_transition.rs index 0d4683b321..a0a3ec0a1f 100644 --- a/packages/rs-drive/src/drive/batch/transitions/identity/identity_update_transition.rs +++ b/packages/rs-drive/src/drive/batch/transitions/identity/identity_update_transition.rs @@ -18,7 +18,6 @@ impl DriveHighLevelOperationConverter for IdentityUpdateTransitionAction { ) -> Result>, Error> { let identity_id = self.identity_id(); let revision = self.revision(); - let public_keys_disabled_at = self.public_keys_disabled_at(); let (add_public_keys, disable_public_keys) = self.public_keys_to_add_and_disable_owned(); let (unique_keys, non_unique_keys): (Vec, Vec) = @@ -44,16 +43,13 @@ impl DriveHighLevelOperationConverter for IdentityUpdateTransitionAction { }, )); } - if let Some(public_keys_disabled_at) = public_keys_disabled_at { - if !disable_public_keys.is_empty() { - drive_operations.push(IdentityOperation( - IdentityOperationType::DisableIdentityKeys { - identity_id: identity_id.to_buffer(), - keys_ids: disable_public_keys, - disable_at: public_keys_disabled_at, - }, - )); - } + if !disable_public_keys.is_empty() { + drive_operations.push(IdentityOperation( + IdentityOperationType::DisableIdentityKeys { + identity_id: identity_id.to_buffer(), + keys_ids: disable_public_keys, + }, + )); } Ok(drive_operations) diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_update/mod.rs b/packages/rs-drive/src/state_transition_action/identity/identity_update/mod.rs index 7679a64b21..fe9e5312fb 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_update/mod.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_update/mod.rs @@ -5,7 +5,7 @@ pub mod v0; use crate::state_transition_action::identity::identity_update::v0::IdentityUpdateTransitionActionV0; use derive_more::From; -use dpp::identity::{IdentityPublicKey, KeyID, TimestampMillis}; +use dpp::identity::{IdentityPublicKey, KeyID}; use dpp::platform_value::Identifier; use dpp::prelude::{Revision, UserFeeIncrease}; @@ -39,13 +39,6 @@ impl IdentityUpdateTransitionAction { } } - /// Public Keys Disabled At - pub fn public_keys_disabled_at(&self) -> Option { - match self { - IdentityUpdateTransitionAction::V0(transition) => transition.public_keys_disabled_at, - } - } - /// Identity Id pub fn identity_id(&self) -> Identifier { match self { diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_update/v0/mod.rs b/packages/rs-drive/src/state_transition_action/identity/identity_update/v0/mod.rs index 7c1f947b30..b09c5052e1 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_update/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_update/v0/mod.rs @@ -1,7 +1,7 @@ mod transformer; use dpp::identifier::Identifier; -use dpp::identity::{IdentityPublicKey, KeyID, TimestampMillis}; +use dpp::identity::{IdentityPublicKey, KeyID}; use dpp::prelude::{IdentityNonce, Revision, UserFeeIncrease}; use serde::{Deserialize, Serialize}; @@ -13,8 +13,6 @@ pub struct IdentityUpdateTransitionActionV0 { pub add_public_keys: Vec, /// disable public keys pub disable_public_keys: Vec, - /// public keys disabled at - pub public_keys_disabled_at: Option, /// identity id pub identity_id: Identifier, /// revision diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_update/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/identity/identity_update/v0/transformer.rs index 6b96f281fd..9d548b9d12 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_update/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_update/v0/transformer.rs @@ -7,7 +7,6 @@ impl From for IdentityUpdateTransitionActionV0 { identity_id, add_public_keys, disable_public_keys, - public_keys_disabled_at, revision, nonce, user_fee_increase, @@ -16,7 +15,6 @@ impl From for IdentityUpdateTransitionActionV0 { IdentityUpdateTransitionActionV0 { add_public_keys: add_public_keys.into_iter().map(|a| a.into()).collect(), disable_public_keys, - public_keys_disabled_at, identity_id, revision, nonce, @@ -31,7 +29,6 @@ impl From<&IdentityUpdateTransitionV0> for IdentityUpdateTransitionActionV0 { identity_id, add_public_keys, disable_public_keys, - public_keys_disabled_at, revision, nonce, user_fee_increase, @@ -43,7 +40,6 @@ impl From<&IdentityUpdateTransitionV0> for IdentityUpdateTransitionActionV0 { .map(|key| key.clone().into()) .collect(), disable_public_keys: disable_public_keys.clone(), - public_keys_disabled_at: *public_keys_disabled_at, identity_id: *identity_id, revision: *revision, nonce: *nonce, diff --git a/packages/rs-platform-value/src/converter/serde_json.rs b/packages/rs-platform-value/src/converter/serde_json.rs index c83e456ce7..6cddde462c 100644 --- a/packages/rs-platform-value/src/converter/serde_json.rs +++ b/packages/rs-platform-value/src/converter/serde_json.rs @@ -421,7 +421,6 @@ mod tests { "revision": 0, "signature": "HxtcTSpRdACokorvpx/f4ezM40e0WtgW2GUvjiwNkHPwKDppkIoS2cirhqpZURlhDuYdu+E0KllbHNlYghcK9Bg=", "signaturePublicKeyId": 1, - "publicKeysDisabledAt": 1234567, "addPublicKeys": [ { "id": 0, diff --git a/packages/strategy-tests/src/transitions.rs b/packages/strategy-tests/src/transitions.rs index e14b5086ae..487edef141 100644 --- a/packages/strategy-tests/src/transitions.rs +++ b/packages/strategy-tests/src/transitions.rs @@ -314,7 +314,6 @@ pub fn create_identity_update_transition_add_keys( key_id, add_public_keys.clone(), vec![], - None, *identity_nonce, 0, signer, @@ -423,7 +422,6 @@ pub fn create_identity_update_transition_disable_keys( key_id, vec![], key_ids_to_disable, - Some(block_time), *identity_nonce, 0, signer, diff --git a/packages/wasm-dpp/lib/test/fixtures/getIdentityUpdateTransitionFixture.js b/packages/wasm-dpp/lib/test/fixtures/getIdentityUpdateTransitionFixture.js index 64a839fbb8..f94537b664 100644 --- a/packages/wasm-dpp/lib/test/fixtures/getIdentityUpdateTransitionFixture.js +++ b/packages/wasm-dpp/lib/test/fixtures/getIdentityUpdateTransitionFixture.js @@ -14,7 +14,6 @@ module.exports = async function getIdentityUpdateTransitionFixture() { stateTransition.setPublicKeysToAdd([key]); stateTransition.setPublicKeyIdsToDisable([0]); - stateTransition.setPublicKeysDisabledAt(new Date()); return stateTransition; }; diff --git a/packages/wasm-dpp/src/data_contract/errors/mod.rs b/packages/wasm-dpp/src/data_contract/errors/mod.rs index 0068e7977b..95609c0f89 100644 --- a/packages/wasm-dpp/src/data_contract/errors/mod.rs +++ b/packages/wasm-dpp/src/data_contract/errors/mod.rs @@ -7,8 +7,6 @@ use wasm_bindgen::prelude::*; pub use data_contract_generic_error::*; use dpp::data_contract::errors::DataContractError; -pub use invalid_data_contract::*; - pub fn from_data_contract_to_js_error(e: DataContractError) -> JsValue { match e { DataContractError::InvalidDocumentTypeError(err) => { diff --git a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs index c61a9813b3..81f3ab7f3a 100644 --- a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs @@ -91,10 +91,9 @@ use crate::errors::consensus::state::document::{ DuplicateUniqueIndexErrorWasm, InvalidDocumentRevisionErrorWasm, }; use crate::errors::consensus::state::identity::{ - IdentityAlreadyExistsErrorWasm, IdentityPublicKeyDisabledAtWindowViolationErrorWasm, - IdentityPublicKeyIsDisabledErrorWasm, IdentityPublicKeyIsReadOnlyErrorWasm, - InvalidIdentityPublicKeyIdErrorWasm, InvalidIdentityRevisionErrorWasm, - MaxIdentityPublicKeyLimitReachedErrorWasm, + IdentityAlreadyExistsErrorWasm, IdentityPublicKeyIsDisabledErrorWasm, + IdentityPublicKeyIsReadOnlyErrorWasm, InvalidIdentityPublicKeyIdErrorWasm, + InvalidIdentityRevisionErrorWasm, MaxIdentityPublicKeyLimitReachedErrorWasm, }; use crate::errors::consensus::basic::data_contract::{ @@ -170,9 +169,6 @@ pub fn from_state_error(state_error: &StateError) -> JsValue { StateError::InvalidIdentityRevisionError(e) => { InvalidIdentityRevisionErrorWasm::from(e).into() } - StateError::IdentityPublicKeyDisabledAtWindowViolationError(e) => { - IdentityPublicKeyDisabledAtWindowViolationErrorWasm::from(e).into() - } StateError::IdentityPublicKeyIsReadOnlyError(e) => { IdentityPublicKeyIsReadOnlyErrorWasm::from(e).into() } diff --git a/packages/wasm-dpp/src/errors/consensus/state/identity/identity_public_key_disabled_at_window_violation_error.rs b/packages/wasm-dpp/src/errors/consensus/state/identity/identity_public_key_disabled_at_window_violation_error.rs deleted file mode 100644 index d29d630616..0000000000 --- a/packages/wasm-dpp/src/errors/consensus/state/identity/identity_public_key_disabled_at_window_violation_error.rs +++ /dev/null @@ -1,49 +0,0 @@ -use dpp::consensus::codes::ErrorWithCode; -use dpp::consensus::state::identity::identity_public_key_disabled_at_window_violation_error::IdentityPublicKeyDisabledAtWindowViolationError; -use dpp::consensus::ConsensusError; - -use wasm_bindgen::prelude::*; - -#[wasm_bindgen(js_name=IdentityPublicKeyDisabledAtWindowViolationError)] -pub struct IdentityPublicKeyDisabledAtWindowViolationErrorWasm { - inner: IdentityPublicKeyDisabledAtWindowViolationError, -} - -impl From<&IdentityPublicKeyDisabledAtWindowViolationError> - for IdentityPublicKeyDisabledAtWindowViolationErrorWasm -{ - fn from(e: &IdentityPublicKeyDisabledAtWindowViolationError) -> Self { - Self { inner: e.clone() } - } -} - -#[wasm_bindgen(js_class=IdentityPublicKeyDisabledAtWindowViolationError)] -impl IdentityPublicKeyDisabledAtWindowViolationErrorWasm { - #[wasm_bindgen(js_name=getDisabledAt)] - pub fn disabled_at(&self) -> js_sys::Date { - // TODO: Figure out how to match rust timestamps with JS timestamps - js_sys::Date::new(&JsValue::from_f64(self.inner.disabled_at() as f64)) - } - - #[wasm_bindgen(js_name=getTimeWindowStart)] - pub fn time_window_start(&self) -> js_sys::Date { - // TODO: Figure out how to match rust timestamps with JS timestamps - js_sys::Date::new(&JsValue::from_f64(self.inner.time_window_start() as f64)) - } - - #[wasm_bindgen(js_name=getTimeWindowEnd)] - pub fn time_window_end(&self) -> js_sys::Date { - // TODO: Figure out how to match rust timestamps with JS timestamps - js_sys::Date::new(&JsValue::from_f64(self.inner.time_window_end() as f64)) - } - - #[wasm_bindgen(js_name=getCode)] - pub fn get_code(&self) -> u32 { - ConsensusError::from(self.inner.clone()).code() - } - - #[wasm_bindgen(getter)] - pub fn message(&self) -> String { - self.inner.to_string() - } -} diff --git a/packages/wasm-dpp/src/errors/consensus/state/identity/mod.rs b/packages/wasm-dpp/src/errors/consensus/state/identity/mod.rs index 4fe5e33f35..9ac274fbdf 100644 --- a/packages/wasm-dpp/src/errors/consensus/state/identity/mod.rs +++ b/packages/wasm-dpp/src/errors/consensus/state/identity/mod.rs @@ -1,7 +1,6 @@ mod duplicated_identity_public_key_id_state_error; mod duplicated_identity_public_key_state_error; mod identity_already_exists_error; -mod identity_public_key_disabled_at_window_violation_error; mod identity_public_key_is_disabled_error; mod identity_public_key_is_read_only_error; mod invalid_identity_contract_nonce_error; @@ -13,7 +12,6 @@ mod missing_identity_public_key_ids_error; pub use duplicated_identity_public_key_id_state_error::*; pub use duplicated_identity_public_key_state_error::*; pub use identity_already_exists_error::*; -pub use identity_public_key_disabled_at_window_violation_error::*; pub use identity_public_key_is_disabled_error::*; pub use identity_public_key_is_read_only_error::*; pub use invalid_identity_contract_nonce_error::*; diff --git a/packages/wasm-dpp/src/identity/identity_facade.rs b/packages/wasm-dpp/src/identity/identity_facade.rs index 5bf8c68d5f..d14892d4f9 100644 --- a/packages/wasm-dpp/src/identity/identity_facade.rs +++ b/packages/wasm-dpp/src/identity/identity_facade.rs @@ -257,7 +257,6 @@ impl IdentityFacadeWasm { ) -> Result { let (add_public_keys, disable_public_keys) = super::factory_utils::parse_create_identity_update_transition_keys(public_keys)?; - let now = js_sys::Date::now() as u64; self.0 .create_identity_update_transition( @@ -265,7 +264,6 @@ impl IdentityFacadeWasm { identity_nonce, add_public_keys, disable_public_keys, - Some(now), ) .map(Into::into) .with_js_error() diff --git a/packages/wasm-dpp/src/identity/identity_factory.rs b/packages/wasm-dpp/src/identity/identity_factory.rs index cd99678be5..b4fcf35d55 100644 --- a/packages/wasm-dpp/src/identity/identity_factory.rs +++ b/packages/wasm-dpp/src/identity/identity_factory.rs @@ -243,15 +243,12 @@ impl IdentityFactoryWasm { let (add_public_keys, disable_public_keys) = super::factory_utils::parse_create_identity_update_transition_keys(public_keys)?; - let now = js_sys::Date::now() as u64; - self.0 .create_identity_update_transition( identity.to_owned().into(), identity_nonce, add_public_keys, disable_public_keys, - Some(now), ) .map(Into::into) .with_js_error() diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/identity_update_transition.rs b/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/identity_update_transition.rs index 79d50f80f0..6f8786a9cb 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/identity_update_transition.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/identity_update_transition.rs @@ -144,23 +144,6 @@ impl IdentityUpdateTransitionWasm { self.0.set_public_key_ids_to_disable(keys); } - #[wasm_bindgen(js_name=getPublicKeysDisabledAt)] - pub fn get_public_keys_disabled_at(&self) -> Option { - self.0 - .public_keys_disabled_at() - .map(|timestamp| js_sys::Date::new(&JsValue::from_f64(timestamp as f64))) - } - - #[wasm_bindgen(js_name=setPublicKeysDisabledAt)] - pub fn set_public_keys_disabled_at(&mut self, timestamp: Option) { - if let Some(timestamp) = timestamp { - self.0 - .set_public_keys_disabled_at(Some(timestamp.get_time() as TimestampMillis)); - } else { - self.0.set_public_keys_disabled_at(None); - } - } - #[wasm_bindgen(js_name=getType)] pub fn get_type(&self) -> u8 { self.0.state_transition_type() as u8 @@ -231,14 +214,6 @@ impl IdentityUpdateTransitionWasm { )?; } - if let Some(timestamp) = object.public_keys_disabled_at { - js_sys::Reflect::set( - &js_object, - &"publicKeysDisabledAt".to_owned().into(), - &js_sys::Date::new(&JsValue::from_f64(timestamp as f64)).into(), - )?; - } - if let Some(public_keys_to_add) = object.public_keys_to_add { let keys_objects = public_keys_to_add .into_iter() @@ -325,14 +300,6 @@ impl IdentityUpdateTransitionWasm { )?; } - if let Some(timestamp) = object.public_keys_disabled_at { - js_sys::Reflect::set( - &js_object, - &"publicKeysDisabledAt".to_owned().into(), - &JsValue::from_f64(timestamp as f64), - )?; - } - if let Some(public_keys_to_add) = object.public_keys_to_add { let keys_objects = public_keys_to_add .into_iter() diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/to_object.rs b/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/to_object.rs index 82ea33c2a1..bf343c1580 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/to_object.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/to_object.rs @@ -19,7 +19,6 @@ pub struct ToObject { pub revision: u32, pub signature: Option>, pub signature_public_key_id: KeyID, - pub public_keys_disabled_at: Option, pub public_keys_to_add: Option>, pub public_key_ids_to_disable: Option>, pub identity_id: Identifier, @@ -46,8 +45,6 @@ pub fn to_object_struct( to_object.signature = signature; } - to_object.public_keys_disabled_at = transition.public_keys_disabled_at(); - let public_keys_to_add = transition.public_keys_to_add(); if !public_keys_to_add.is_empty() { to_object.public_keys_to_add = Some(public_keys_to_add.to_owned()); diff --git a/packages/wasm-dpp/test/integration/identity/IdentityFacade.spec.js b/packages/wasm-dpp/test/integration/identity/IdentityFacade.spec.js index 5d935cac68..90778aa72e 100644 --- a/packages/wasm-dpp/test/integration/identity/IdentityFacade.spec.js +++ b/packages/wasm-dpp/test/integration/identity/IdentityFacade.spec.js @@ -192,7 +192,6 @@ describe('IdentityFacade', () => { stateTransition.getPublicKeysToAdd().map((pk) => pk.toObject()), ).to.deep.equal(publicKeys.add.map((k) => k.toObject())); expect(stateTransition.getPublicKeyIdsToDisable()).to.deep.equal([]); - expect(stateTransition.getPublicKeysDisabledAt()).to.equal(undefined); }); }); diff --git a/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityUpdateTransition/validation/state/validateIdentityUpdateTransitionStateFactory.spec.js b/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityUpdateTransition/validation/state/validateIdentityUpdateTransitionStateFactory.spec.js index 13673211ee..19d40b4ff8 100644 --- a/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityUpdateTransition/validation/state/validateIdentityUpdateTransitionStateFactory.spec.js +++ b/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityUpdateTransition/validation/state/validateIdentityUpdateTransitionStateFactory.spec.js @@ -24,7 +24,6 @@ describe.skip('validateIdentityUpdateTransitionStateFactory', () => { let IdentityPublicKeyIsDisabledError; let InvalidIdentityPublicKeyIdError; let MissingMasterPublicKeyError; - let IdentityPublicKeyDisabledAtWindowViolationError; let MaxIdentityPublicKeyLimitReachedError; let StateTransitionExecutionContext; let IdentityUpdateTransitionStateValidator; @@ -37,7 +36,6 @@ describe.skip('validateIdentityUpdateTransitionStateFactory', () => { IdentityPublicKeyIsReadOnlyError, IdentityPublicKeyIsDisabledError, InvalidIdentityPublicKeyIdError, - IdentityPublicKeyDisabledAtWindowViolationError, MaxIdentityPublicKeyLimitReachedError, StateTransitionExecutionContext, IdentityUpdateTransitionStateValidator, @@ -68,7 +66,6 @@ describe.skip('validateIdentityUpdateTransitionStateFactory', () => { stateTransition.setRevision(identity.getRevision() + 1); stateTransition.setPublicKeyIdsToDisable(undefined); - stateTransition.setPublicKeysDisabledAt(undefined); const privateKey = '9b67f852093bc61cea0eeca38599dbfba0de28574d2ed9b99d10d33dc1bde7b2'; @@ -116,35 +113,8 @@ describe.skip('validateIdentityUpdateTransitionStateFactory', () => { expect(error.getPublicKeyIndex()).to.equal(0); }); - it('should return invalid result if disabledAt has violated time window', async () => { - stateTransition.setPublicKeyIdsToDisable([1]); - // blockTime - 10 minutes - const disabledAt = new Date(blockTime - 1000 * 60 * 60 * 10); - stateTransition.setPublicKeysDisabledAt(disabledAt); - - const timeWindowStart = new Date(blockTime); - timeWindowStart.setMinutes( - timeWindowStart.getMinutes() - 5, - ); - - const timeWindowEnd = new Date(blockTime); - timeWindowEnd.setMinutes( - timeWindowEnd.getMinutes() + 5, - ); - - const result = await validateIdentityUpdateTransitionState(stateTransition); - - await expectValidationError(result, IdentityPublicKeyDisabledAtWindowViolationError); - - const [error] = result.getErrors(); - expect(error.getDisabledAt()).to.deep.equal(disabledAt); - expect(error.getTimeWindowStart()).to.be.instanceOf(Date); - expect(error.getTimeWindowEnd()).to.be.instanceOf(Date); - }); - it('should throw InvalidIdentityPublicKeyIdError if identity does not contain public key with disabling ID', async () => { stateTransition.setPublicKeyIdsToDisable([3]); - stateTransition.setPublicKeysDisabledAt(new Date()); const result = await validateIdentityUpdateTransitionState(stateTransition); @@ -156,7 +126,6 @@ describe.skip('validateIdentityUpdateTransitionStateFactory', () => { it('should pass when disabling public key', async function () { stateTransition.setPublicKeyIdsToDisable([1]); - stateTransition.setPublicKeysDisabledAt(new Date()); stateTransition.setPublicKeysToAdd(undefined); const result = await validateIdentityUpdateTransitionState(stateTransition); @@ -176,7 +145,6 @@ describe.skip('validateIdentityUpdateTransitionStateFactory', () => { it('should pass when adding public key', async function () { stateTransition.setPublicKeyIdsToDisable(undefined); - stateTransition.setPublicKeysDisabledAt(undefined); const result = await validateIdentityUpdateTransitionState(stateTransition); @@ -195,7 +163,6 @@ describe.skip('validateIdentityUpdateTransitionStateFactory', () => { it('should pass when both adding and disabling public keys', async function () { stateTransition.setPublicKeyIdsToDisable([1]); - stateTransition.setPublicKeysDisabledAt(new Date()); const result = await validateIdentityUpdateTransitionState(stateTransition); @@ -262,7 +229,6 @@ describe.skip('validateIdentityUpdateTransitionStateFactory', () => { it('should return valid result on dry run', async function () { stateTransition.setPublicKeyIdsToDisable([3]); - stateTransition.setPublicKeysDisabledAt(new Date()); // Make code that executes after dry run check to fail stateRepositoryMock.fetchLatestPlatformBlockTime.resolves({}); diff --git a/packages/wasm-dpp/test/unit/identity/IdentityFactory.spec.js b/packages/wasm-dpp/test/unit/identity/IdentityFactory.spec.js index be6722652a..25c23be0c9 100644 --- a/packages/wasm-dpp/test/unit/identity/IdentityFactory.spec.js +++ b/packages/wasm-dpp/test/unit/identity/IdentityFactory.spec.js @@ -250,7 +250,6 @@ describe('IdentityFactory', () => { expect(stateTransition.getPublicKeysToAdd().map((k) => k.toObject())) .to.deep.equal(addPublicKeys.map((k) => k.toObject())); expect(stateTransition.getPublicKeyIdsToDisable()).to.deep.equal([0]); - expect(stateTransition.getPublicKeysDisabledAt()).to.deep.equal(new Date()); }); }); diff --git a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityUpdateTransition/IdentityUpdateTransition.spec.js b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityUpdateTransition/IdentityUpdateTransition.spec.js index 1a65bba88a..178ab4d865 100644 --- a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityUpdateTransition/IdentityUpdateTransition.spec.js +++ b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityUpdateTransition/IdentityUpdateTransition.spec.js @@ -99,23 +99,6 @@ describe('IdentityUpdateTransition', () => { }); }); - describe('#getPublicKeysDisabledAt', () => { - it('should return time to disable public keys', () => { - expect(stateTransition.getPublicKeysDisabledAt()) - .to.deep.equal(rawStateTransition.publicKeysDisabledAt); - }); - }); - - describe('#setPublicKeysDisabledAt', () => { - it('should set time to disable public keys', () => { - const now = new Date(); - - stateTransition.setPublicKeysDisabledAt(now); - - expect(stateTransition.getPublicKeysDisabledAt()).to.deep.equal(new Date(now)); - }); - }); - describe('#toObject', () => { it('should return raw state transition', () => { rawStateTransition = stateTransition.toObject(); @@ -126,7 +109,6 @@ describe('IdentityUpdateTransition', () => { signature: undefined, identityId: rawStateTransition.identityId, revision: rawStateTransition.revision, - publicKeysDisabledAt: rawStateTransition.publicKeysDisabledAt, addPublicKeys: rawStateTransition.addPublicKeys, disablePublicKeys: rawStateTransition.disablePublicKeys, signaturePublicKeyId: 0, @@ -141,7 +123,6 @@ describe('IdentityUpdateTransition', () => { type: StateTransitionTypes.IdentityUpdate, identityId: rawStateTransition.identityId, revision: rawStateTransition.revision, - publicKeysDisabledAt: rawStateTransition.publicKeysDisabledAt, addPublicKeys: rawStateTransition.addPublicKeys, disablePublicKeys: rawStateTransition.disablePublicKeys, }); @@ -149,7 +130,6 @@ describe('IdentityUpdateTransition', () => { it('should return raw state transition without optional properties', () => { stateTransition.setPublicKeyIdsToDisable(undefined); - stateTransition.setPublicKeysDisabledAt(undefined); stateTransition.setPublicKeysToAdd(undefined); rawStateTransition = stateTransition.toObject(); @@ -175,7 +155,6 @@ describe('IdentityUpdateTransition', () => { signature: undefined, identityId: stateTransition.getIdentityId().toString(), revision: rawStateTransition.revision, - publicKeysDisabledAt: rawStateTransition.publicKeysDisabledAt.getTime(), addPublicKeys: stateTransition.getPublicKeysToAdd().map((k) => k.toJSON()), disablePublicKeys: rawStateTransition.disablePublicKeys, signaturePublicKeyId: 0, From 825d963c3b292b6a9042db53e53297619167dd56 Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Thu, 14 Mar 2024 14:55:18 +0700 Subject: [PATCH 087/191] feat(platform)!: identity update can not disable a key it is also adding (#1772) --- .../src/errors/consensus/basic/basic_error.rs | 10 ++++-- ...so_being_added_in_same_transition_error.rs | 36 +++++++++++++++++++ .../errors/consensus/basic/identity/mod.rs | 2 ++ packages/rs-dpp/src/errors/consensus/codes.rs | 1 + .../identity_update/structure/v0/mod.rs | 14 +++++++- 5 files changed, 60 insertions(+), 3 deletions(-) create mode 100644 packages/rs-dpp/src/errors/consensus/basic/identity/disabling_key_id_also_being_added_in_same_transition_error.rs diff --git a/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs b/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs index 04b65dfe3c..d29eb47fb0 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs @@ -29,8 +29,9 @@ use crate::consensus::basic::document::{ MissingPositionsInDocumentTypePropertiesError, }; use crate::consensus::basic::identity::{ - DataContractBoundsNotPresentError, DuplicatedIdentityPublicKeyBasicError, - DuplicatedIdentityPublicKeyIdBasicError, IdentityAssetLockProofLockedTransactionMismatchError, + DataContractBoundsNotPresentError, DisablingKeyIdAlsoBeingAddedInSameTransitionError, + DuplicatedIdentityPublicKeyBasicError, DuplicatedIdentityPublicKeyIdBasicError, + IdentityAssetLockProofLockedTransactionMismatchError, IdentityAssetLockTransactionIsNotFoundError, IdentityAssetLockTransactionOutPointAlreadyExistsError, IdentityAssetLockTransactionOutputNotFoundError, IdentityCreditTransferToSelfError, @@ -219,6 +220,11 @@ pub enum BasicError { #[error(transparent)] DuplicatedIdentityPublicKeyIdBasicError(DuplicatedIdentityPublicKeyIdBasicError), + #[error(transparent)] + DisablingKeyIdAlsoBeingAddedInSameTransitionError( + DisablingKeyIdAlsoBeingAddedInSameTransitionError, + ), + #[error(transparent)] IdentityAssetLockProofLockedTransactionMismatchError( IdentityAssetLockProofLockedTransactionMismatchError, diff --git a/packages/rs-dpp/src/errors/consensus/basic/identity/disabling_key_id_also_being_added_in_same_transition_error.rs b/packages/rs-dpp/src/errors/consensus/basic/identity/disabling_key_id_also_being_added_in_same_transition_error.rs new file mode 100644 index 0000000000..4d37c1e4e7 --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/basic/identity/disabling_key_id_also_being_added_in_same_transition_error.rs @@ -0,0 +1,36 @@ +use crate::consensus::basic::BasicError; +use crate::consensus::ConsensusError; +use crate::errors::ProtocolError; +use crate::identity::KeyID; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error("Disabling a key with id {key_id:?} that is being added in same state transition")] +#[platform_serialize(unversioned)] +pub struct DisablingKeyIdAlsoBeingAddedInSameTransitionError { + /* + + DO NOT CHANGE ORDER OF FIELDS WITHOUT INTRODUCING OF NEW VERSION + + */ + key_id: KeyID, +} + +impl DisablingKeyIdAlsoBeingAddedInSameTransitionError { + pub fn new(key_id: KeyID) -> Self { + Self { key_id } + } + + pub fn key_id(&self) -> KeyID { + self.key_id + } +} +impl From for ConsensusError { + fn from(err: DisablingKeyIdAlsoBeingAddedInSameTransitionError) -> Self { + Self::BasicError(BasicError::DisablingKeyIdAlsoBeingAddedInSameTransitionError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/basic/identity/mod.rs b/packages/rs-dpp/src/errors/consensus/basic/identity/mod.rs index fc70b59971..2193b587c2 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/identity/mod.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/identity/mod.rs @@ -1,4 +1,5 @@ pub use data_contract_bounds_not_present_error::*; +pub use disabling_key_id_also_being_added_in_same_transition_error::*; pub use duplicated_identity_public_key_basic_error::*; pub use duplicated_identity_public_key_id_basic_error::*; pub use identity_asset_lock_proof_locked_transaction_mismatch_error::*; @@ -27,6 +28,7 @@ pub use missing_master_public_key_error::*; pub use not_implemented_identity_credit_withdrawal_transition_pooling_error::*; mod data_contract_bounds_not_present_error; +mod disabling_key_id_also_being_added_in_same_transition_error; mod duplicated_identity_public_key_basic_error; mod duplicated_identity_public_key_id_basic_error; mod identity_asset_lock_proof_locked_transaction_mismatch_error; diff --git a/packages/rs-dpp/src/errors/consensus/codes.rs b/packages/rs-dpp/src/errors/consensus/codes.rs index 8860dbe5ab..838c419f5d 100644 --- a/packages/rs-dpp/src/errors/consensus/codes.rs +++ b/packages/rs-dpp/src/errors/consensus/codes.rs @@ -124,6 +124,7 @@ impl ErrorWithCode for BasicError { Self::InvalidInstantAssetLockProofSignatureError(_) => 1042, Self::InvalidIdentityAssetLockProofChainLockValidationError(_) => 1043, Self::DataContractBoundsNotPresentError(_) => 1066, + Self::DisablingKeyIdAlsoBeingAddedInSameTransitionError(_) => 1096, Self::MissingMasterPublicKeyError(_) => 1046, Self::InvalidIdentityPublicKeySecurityLevelError(_) => 1047, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/structure/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/structure/v0/mod.rs index df1f538c1e..951f1ca3d6 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/structure/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/structure/v0/mod.rs @@ -1,11 +1,12 @@ use crate::error::Error; use dpp::consensus::basic::identity::{ - DuplicatedIdentityPublicKeyIdBasicError, InvalidIdentityUpdateTransitionEmptyError, + DisablingKeyIdAlsoBeingAddedInSameTransitionError, DuplicatedIdentityPublicKeyIdBasicError, InvalidIdentityUpdateTransitionEmptyError, }; use dpp::consensus::state::identity::max_identity_public_key_limit_reached_error::MaxIdentityPublicKeyLimitReachedError; use dpp::consensus::ConsensusError; use dpp::state_transition::identity_update_transition::accessors::IdentityUpdateTransitionAccessorsV0; use dpp::state_transition::identity_update_transition::IdentityUpdateTransition; +use dpp::state_transition::public_key_in_creation::accessors::IdentityPublicKeyInCreationV0Getters; use dpp::state_transition::public_key_in_creation::IdentityPublicKeyInCreation; use dpp::validation::SimpleConsensusValidationResult; use dpp::version::PlatformVersion; @@ -58,6 +59,17 @@ impl IdentityUpdateStateTransitionStructureValidationV0 for IdentityUpdateTransi break; } + if self + .public_keys_to_add() + .iter() + .any(|public_key_in_creation| public_key_in_creation.id() == *key_id) + { + result.add_error(ConsensusError::from( + DisablingKeyIdAlsoBeingAddedInSameTransitionError::new(*key_id), + )); + break; + } + ids.insert(key_id); } } From 47cab980148050603ab33f394cc646254672e65e Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Thu, 14 Mar 2024 20:33:16 +0700 Subject: [PATCH 088/191] fix(platform): wrong state used to get current validator set (#1773) --- packages/rs-drive-abci/src/error/execution.rs | 2 +- .../engine/finalize_block_proposal/v0/mod.rs | 6 +++-- .../block_end/validator_set_update/v0/mod.rs | 9 +++++--- .../update_operator_identity/v0/mod.rs | 7 +++--- .../update_voter_identity/v0/mod.rs | 7 +++--- .../identity_update/structure/v0/mod.rs | 3 ++- .../src/platform_types/platform/mod.rs | 2 +- .../platform_types/platform_state/v0/mod.rs | 4 +++- .../platform_types/validator_set/v0/mod.rs | 22 +++++++++++++++---- 9 files changed, 43 insertions(+), 19 deletions(-) diff --git a/packages/rs-drive-abci/src/error/execution.rs b/packages/rs-drive-abci/src/error/execution.rs index ce9a588686..165bbe4f75 100644 --- a/packages/rs-drive-abci/src/error/execution.rs +++ b/packages/rs-drive-abci/src/error/execution.rs @@ -53,7 +53,7 @@ pub enum ExecutionError { /// The platform encountered a corrupted cache state error. #[error("platform corrupted cached state error: {0}")] - CorruptedCachedState(&'static str), + CorruptedCachedState(String), /// The fork is not yet active for core. #[error("initialization fork not active: {0}")] diff --git a/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/v0/mod.rs b/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/v0/mod.rs index b7a8522b92..53eb058e6a 100644 --- a/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/v0/mod.rs @@ -131,9 +131,11 @@ where return Ok(validation_result.into()); } - let current_quorum_hash = block_platform_state + let last_committed_state = self.state.load(); + let current_quorum_hash = last_committed_state .current_validator_set_quorum_hash() .into(); + if current_quorum_hash != commit_info.quorum_hash { validation_result.add_error(AbciError::WrongFinalizeBlockReceived(format!( "received a block for h: {} r: {} with validator set quorum hash {} expected current validator set quorum hash is {}", @@ -168,7 +170,7 @@ where { // Verify commit - let quorum_public_key = block_platform_state + let quorum_public_key = last_committed_state .current_validator_set()? .threshold_public_key(); let quorum_type = self.config.validator_set_quorum_type(); diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_end/validator_set_update/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_end/validator_set_update/v0/mod.rs index 27b5fc3714..b30f628705 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/block_end/validator_set_update/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/block_end/validator_set_update/v0/mod.rs @@ -10,6 +10,7 @@ use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::platform_types::platform_state::PlatformState; use crate::platform_types::validator_set::v0::ValidatorSetV0Getters; use crate::rpc::core::CoreRPCLike; +use itertools::Itertools; use tenderdash_abci::proto::abci::ValidatorSetUpdate; @@ -64,13 +65,15 @@ where .validator_sets() .get_index_of(&platform_state.current_validator_set_quorum_hash()) .ok_or(Error::Execution(ExecutionError::CorruptedCachedState( - "current quorums do not contain current validator set", - )))?; + format!("perform_rotation: current validator set quorum hash {} not in current known validator sets [{}] processing block {}", platform_state.current_validator_set_quorum_hash(), platform_state + .validator_sets().keys().map(|quorum_hash| quorum_hash.to_string()).join(" | "), + platform_state.last_committed_block_height() + 1, + ))))?; // we should rotate the quorum let quorum_count = platform_state.validator_sets().len(); match quorum_count { 0 => Err(Error::Execution(ExecutionError::CorruptedCachedState( - "no current quorums", + "no current quorums".to_string(), ))), 1 => Ok(None), count => { diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_operator_identity/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_operator_identity/v0/mod.rs index e64e2848ae..68d9515b03 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_operator_identity/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_operator_identity/v0/mod.rs @@ -57,9 +57,10 @@ where .full_masternode_list() .get(pro_tx_hash) .ok_or_else(|| { - Error::Execution(ExecutionError::CorruptedCachedState( - "expected masternode to be in state", - )) + Error::Execution(ExecutionError::CorruptedCachedState(format!( + "expected masternode {} to be in state", + pro_tx_hash.to_string() + ))) })?; let old_operator_identifier = Self::get_operator_identifier_from_masternode_list_item( diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_voter_identity/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_voter_identity/v0/mod.rs index ec574f89a6..7a142ef5d0 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_voter_identity/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_voter_identity/v0/mod.rs @@ -47,9 +47,10 @@ where .full_masternode_list() .get(pro_tx_hash) .ok_or_else(|| { - Error::Execution(ExecutionError::CorruptedCachedState( - "expected masternode to be in state", - )) + Error::Execution(ExecutionError::CorruptedCachedState(format!( + "expected masternode {} to be in state", + pro_tx_hash + ))) })?; let old_voter_identifier = diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/structure/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/structure/v0/mod.rs index 951f1ca3d6..b17952d8ff 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/structure/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/structure/v0/mod.rs @@ -1,6 +1,7 @@ use crate::error::Error; use dpp::consensus::basic::identity::{ - DisablingKeyIdAlsoBeingAddedInSameTransitionError, DuplicatedIdentityPublicKeyIdBasicError, InvalidIdentityUpdateTransitionEmptyError, + DisablingKeyIdAlsoBeingAddedInSameTransitionError, DuplicatedIdentityPublicKeyIdBasicError, + InvalidIdentityUpdateTransitionEmptyError, }; use dpp::consensus::state::identity::max_identity_public_key_limit_reached_error::MaxIdentityPublicKeyLimitReachedError; use dpp::consensus::ConsensusError; diff --git a/packages/rs-drive-abci/src/platform_types/platform/mod.rs b/packages/rs-drive-abci/src/platform_types/platform/mod.rs index e70d196f0d..a824dfc83d 100644 --- a/packages/rs-drive-abci/src/platform_types/platform/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/platform/mod.rs @@ -184,7 +184,7 @@ impl Platform { Platform::::fetch_platform_state(&drive, None, platform_version)? else { return Err(Error::Execution(ExecutionError::CorruptedCachedState( - "execution state should be stored as well as protocol version", + "execution state should be stored as well as protocol version".to_string(), ))); }; diff --git a/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs b/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs index e0b3c1699e..b587b08066 100644 --- a/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs @@ -20,6 +20,7 @@ use dpp::block::extended_block_info::v0::ExtendedBlockInfoV0Getters; use dpp::bls_signatures::PublicKey as ThresholdBlsPublicKey; use dpp::version::{PlatformVersion, TryIntoPlatformVersioned}; +use itertools::Itertools; use std::collections::BTreeMap; use std::fmt::{Debug, Formatter}; @@ -586,7 +587,8 @@ impl PlatformStateV0Methods for PlatformStateV0 { self.validator_sets .get(&self.current_validator_set_quorum_hash) .ok_or(Error::Execution(ExecutionError::CorruptedCachedState( - "current validator quorum hash not in current known validator sets", + format!("current_validator_set: current validator quorum hash {} not in current known validator sets {} last committed block is {} (we might be processing new block)", self.current_validator_set_quorum_hash.to_string(), self.validator_sets.keys().into_iter().map(|quorum_hash| quorum_hash.to_string()).join(" | "), + self.last_committed_block_info.as_ref().map(|block_info| block_info.basic_info().height).unwrap_or_default()), ))) } diff --git a/packages/rs-drive-abci/src/platform_types/validator_set/v0/mod.rs b/packages/rs-drive-abci/src/platform_types/validator_set/v0/mod.rs index b8745e96fa..50b37afdc8 100644 --- a/packages/rs-drive-abci/src/platform_types/validator_set/v0/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/validator_set/v0/mod.rs @@ -57,19 +57,30 @@ impl ValidatorSetV0 { ) -> Result { if self.quorum_hash != rhs.quorum_hash { return Err(Error::Execution(ExecutionError::CorruptedCachedState( - "updating validator set doesn't match quorum hash", + format!( + "updating validator set doesn't match quorum hash ours: {} theirs: {}", + self.quorum_hash.to_string(), + rhs.quorum_hash.to_string() + ), ))); } if self.core_height != rhs.core_height { return Err(Error::Execution(ExecutionError::CorruptedCachedState( - "updating validator set doesn't match core height", + format!( + "updating validator set doesn't match core height ours: {} theirs: {}", + self.core_height, rhs.core_height + ), ))); } if self.threshold_public_key != rhs.threshold_public_key { return Err(Error::Execution(ExecutionError::CorruptedCachedState( - "updating validator set doesn't match threshold public key", + format!( + "updating validator set doesn't match threshold public key ours: {} theirs: {}", + hex::encode(*self.threshold_public_key.to_bytes()), + hex::encode(*rhs.threshold_public_key.to_bytes()) + ), ))); } @@ -80,7 +91,10 @@ impl ValidatorSetV0 { rhs.members.get(pro_tx_hash).map_or_else( || { Some(Err(Error::Execution(ExecutionError::CorruptedCachedState( - "validator set does not contain all same members", + format!( + "validator set does not contain all same members, missing {}", + pro_tx_hash.to_string() + ), )))) }, |new_validator_state| { From 9c5d9995d8c6bbf2663210f0f66d12172c00e890 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Thu, 14 Mar 2024 17:18:26 +0300 Subject: [PATCH 089/191] chore(release): update changelog and bump version to 1.0.0-dev.8 (#1774) --- CHANGELOG.md | 39 ++++++++++++++++ Cargo.lock | 46 +++++++++---------- package.json | 2 +- packages/bench-suite/package.json | 2 +- packages/dapi-grpc/Cargo.toml | 2 +- packages/dapi-grpc/package.json | 2 +- packages/dapi/package.json | 2 +- packages/dash-spv/package.json | 2 +- packages/dashmate/package.json | 2 +- packages/dashpay-contract/Cargo.toml | 2 +- packages/dashpay-contract/package.json | 2 +- packages/data-contracts/Cargo.toml | 2 +- packages/dpns-contract/Cargo.toml | 2 +- packages/dpns-contract/package.json | 2 +- packages/feature-flags-contract/Cargo.toml | 2 +- packages/feature-flags-contract/package.json | 2 +- packages/js-dapi-client/package.json | 2 +- packages/js-dash-sdk/package.json | 2 +- packages/js-grpc-common/package.json | 2 +- .../Cargo.toml | 2 +- .../package.json | 2 +- packages/platform-test-suite/package.json | 2 +- packages/rs-dapi-client/Cargo.toml | 2 +- packages/rs-dapi-grpc-macros/Cargo.toml | 2 +- packages/rs-dpp/Cargo.toml | 2 +- packages/rs-drive-abci/Cargo.toml | 2 +- packages/rs-drive-proof-verifier/Cargo.toml | 2 +- packages/rs-drive/Cargo.toml | 2 +- .../Cargo.toml | 2 +- packages/rs-platform-serialization/Cargo.toml | 2 +- .../rs-platform-value-convertible/Cargo.toml | 2 +- packages/rs-platform-value/Cargo.toml | 2 +- packages/rs-platform-version/Cargo.toml | 2 +- packages/rs-platform-versioning/Cargo.toml | 2 +- packages/rs-sdk/Cargo.toml | 2 +- packages/simple-signer/Cargo.toml | 2 +- packages/strategy-tests/Cargo.toml | 2 +- packages/wallet-lib/package.json | 2 +- packages/wasm-dpp/Cargo.toml | 2 +- packages/wasm-dpp/package.json | 2 +- packages/withdrawals-contract/Cargo.toml | 2 +- packages/withdrawals-contract/package.json | 2 +- 42 files changed, 102 insertions(+), 63 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 81505eef46..879d16aa94 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,42 @@ +## [1.0.0-dev.8](https://github.com/dashpay/platform/compare/v1.0.0-dev.7...v1.0.0-dev.8) (2024-03-14) + + +### ⚠ BREAKING CHANGES + +* **platform:** identity update can not disable a key it is also adding (#1772) +* **platform:** key disabled at based on state transition block time (#1771) +* **platform:** data contract validation improvements (#1768) +* update tenderdash to 0.14-dev.4 (#1770) +* **platform:** advanced data contract structure validation position (#1763) + +### Features + +* **platform:** identity update can not disable a key it is also adding ([#1772](https://github.com/dashpay/platform/issues/1772)) +* **platform:** key disabled at based on state transition block time ([#1771](https://github.com/dashpay/platform/issues/1771)) + + +### Bug Fixes + +* **platform:** advanced data contract structure validation position ([#1763](https://github.com/dashpay/platform/issues/1763)) +* **platform:** data contract validation improvements ([#1768](https://github.com/dashpay/platform/issues/1768)) +* **platform:** wrong state used to get current validator set ([#1773](https://github.com/dashpay/platform/issues/1773)) +* remove unnecessary clone +* update strategy test document transitions with initial contract ids + + +### Code Refactoring + +* **drive:** relax versioning of calls with fees ([#1762](https://github.com/dashpay/platform/issues/1762)) +* drop unused includes; use calculate_sign_hash ([#1767](https://github.com/dashpay/platform/issues/1767)) +* resolve various warnings during build or by clippy ([#1761](https://github.com/dashpay/platform/issues/1761)) +* strategy test start identities ([#1749](https://github.com/dashpay/platform/issues/1749)) + + +### Miscellaneous Chores + +* **dashmate:** upgrade to Core 20.1 ([#1760](https://github.com/dashpay/platform/issues/1760)) +* update tenderdash to 0.14-dev.4 ([#1770](https://github.com/dashpay/platform/issues/1770)) + ## [1.0.0-dev.7](https://github.com/dashpay/platform/compare/v1.0.0-dev.6...v1.0.0-dev.7) (2024-03-08) diff --git a/Cargo.lock b/Cargo.lock index 782190d96a..117c727a4f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -995,7 +995,7 @@ dependencies = [ [[package]] name = "dapi-grpc" -version = "1.0.0-dev.7" +version = "1.0.0-dev.8" dependencies = [ "dapi-grpc-macros", "futures-core", @@ -1011,7 +1011,7 @@ dependencies = [ [[package]] name = "dapi-grpc-macros" -version = "1.0.0-dev.7" +version = "1.0.0-dev.8" dependencies = [ "dapi-grpc", "heck", @@ -1117,7 +1117,7 @@ dependencies = [ [[package]] name = "dashpay-contract" -version = "1.0.0-dev.7" +version = "1.0.0-dev.8" dependencies = [ "platform-value", "platform-version", @@ -1127,7 +1127,7 @@ dependencies = [ [[package]] name = "data-contracts" -version = "1.0.0-dev.7" +version = "1.0.0-dev.8" dependencies = [ "dashpay-contract", "dpns-contract", @@ -1220,7 +1220,7 @@ checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" [[package]] name = "dpns-contract" -version = "1.0.0-dev.7" +version = "1.0.0-dev.8" dependencies = [ "platform-value", "platform-version", @@ -1230,7 +1230,7 @@ dependencies = [ [[package]] name = "dpp" -version = "1.0.0-dev.7" +version = "1.0.0-dev.8" dependencies = [ "anyhow", "async-trait", @@ -1281,7 +1281,7 @@ dependencies = [ [[package]] name = "drive" -version = "1.0.0-dev.7" +version = "1.0.0-dev.8" dependencies = [ "anyhow", "arc-swap", @@ -1318,7 +1318,7 @@ dependencies = [ [[package]] name = "drive-abci" -version = "1.0.0-dev.7" +version = "1.0.0-dev.8" dependencies = [ "arc-swap", "async-trait", @@ -1373,7 +1373,7 @@ dependencies = [ [[package]] name = "drive-proof-verifier" -version = "1.0.0-dev.7" +version = "1.0.0-dev.8" dependencies = [ "dapi-grpc", "dpp", @@ -1573,7 +1573,7 @@ checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" [[package]] name = "feature-flags-contract" -version = "1.0.0-dev.7" +version = "1.0.0-dev.8" dependencies = [ "platform-value", "platform-version", @@ -2437,7 +2437,7 @@ dependencies = [ [[package]] name = "masternode-reward-shares-contract" -version = "1.0.0-dev.7" +version = "1.0.0-dev.8" dependencies = [ "platform-value", "platform-version", @@ -2914,7 +2914,7 @@ checksum = "2900ede94e305130c13ddd391e0ab7cbaeb783945ae07a279c268cb05109c6cb" [[package]] name = "platform-serialization" -version = "1.0.0-dev.7" +version = "1.0.0-dev.8" dependencies = [ "bincode 2.0.0-rc.3", "platform-version", @@ -2922,7 +2922,7 @@ dependencies = [ [[package]] name = "platform-serialization-derive" -version = "1.0.0-dev.7" +version = "1.0.0-dev.8" dependencies = [ "proc-macro2", "quote", @@ -2932,7 +2932,7 @@ dependencies = [ [[package]] name = "platform-value" -version = "1.0.0-dev.7" +version = "1.0.0-dev.8" dependencies = [ "base64 0.13.1", "bincode 2.0.0-rc.3", @@ -2953,7 +2953,7 @@ dependencies = [ [[package]] name = "platform-value-convertible" -version = "1.0.0-dev.7" +version = "1.0.0-dev.8" dependencies = [ "quote", "syn 2.0.48", @@ -2961,14 +2961,14 @@ dependencies = [ [[package]] name = "platform-version" -version = "1.0.0-dev.7" +version = "1.0.0-dev.8" dependencies = [ "thiserror", ] [[package]] name = "platform-versioning" -version = "1.0.0-dev.7" +version = "1.0.0-dev.8" dependencies = [ "proc-macro2", "quote", @@ -3510,7 +3510,7 @@ dependencies = [ [[package]] name = "rs-dapi-client" -version = "1.0.0-dev.7" +version = "1.0.0-dev.8" dependencies = [ "backon", "chrono", @@ -3527,7 +3527,7 @@ dependencies = [ [[package]] name = "rs-sdk" -version = "1.0.0-dev.7" +version = "1.0.0-dev.8" dependencies = [ "async-trait", "base64 0.21.7", @@ -4014,7 +4014,7 @@ checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" [[package]] name = "simple-signer" -version = "1.0.0-dev.7" +version = "1.0.0-dev.8" dependencies = [ "anyhow", "bincode 2.0.0-rc.3", @@ -4105,7 +4105,7 @@ dependencies = [ [[package]] name = "strategy-tests" -version = "1.0.0-dev.7" +version = "1.0.0-dev.8" dependencies = [ "bincode 2.0.0-rc.3", "dpp", @@ -5027,7 +5027,7 @@ checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93" [[package]] name = "wasm-dpp" -version = "1.0.0-dev.7" +version = "1.0.0-dev.8" dependencies = [ "anyhow", "async-trait", @@ -5269,7 +5269,7 @@ dependencies = [ [[package]] name = "withdrawals-contract" -version = "1.0.0-dev.7" +version = "1.0.0-dev.8" dependencies = [ "num_enum", "platform-value", diff --git a/package.json b/package.json index 2e5227b12d..e241b9b590 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/platform", - "version": "1.0.0-dev.7", + "version": "1.0.0-dev.8", "private": true, "scripts": { "setup": "yarn install && yarn run build && yarn run configure", diff --git a/packages/bench-suite/package.json b/packages/bench-suite/package.json index ce1193d5b7..aabe097350 100644 --- a/packages/bench-suite/package.json +++ b/packages/bench-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/bench-suite", "private": true, - "version": "1.0.0-dev.7", + "version": "1.0.0-dev.8", "description": "Dash Platform benchmark tool", "scripts": { "bench": "node ./bin/bench.js", diff --git a/packages/dapi-grpc/Cargo.toml b/packages/dapi-grpc/Cargo.toml index 5117e113e0..d12fa9cb41 100644 --- a/packages/dapi-grpc/Cargo.toml +++ b/packages/dapi-grpc/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc" description = "GRPC client for Dash Platform" -version = "1.0.0-dev.7" +version = "1.0.0-dev.8" authors = [ "Samuel Westrich ", "Igor Markin ", diff --git a/packages/dapi-grpc/package.json b/packages/dapi-grpc/package.json index 9b8b2db0fd..0a2efa1a89 100644 --- a/packages/dapi-grpc/package.json +++ b/packages/dapi-grpc/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-grpc", - "version": "1.0.0-dev.7", + "version": "1.0.0-dev.8", "description": "DAPI GRPC definition file and generated clients", "browser": "browser.js", "main": "node.js", diff --git a/packages/dapi/package.json b/packages/dapi/package.json index c3c26fd4b3..b23f41fe43 100644 --- a/packages/dapi/package.json +++ b/packages/dapi/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/dapi", "private": true, - "version": "1.0.0-dev.7", + "version": "1.0.0-dev.8", "description": "A decentralized API for the Dash network", "scripts": { "api": "node scripts/api.js", diff --git a/packages/dash-spv/package.json b/packages/dash-spv/package.json index a7aa961683..c69313d61e 100644 --- a/packages/dash-spv/package.json +++ b/packages/dash-spv/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dash-spv", - "version": "1.0.0-dev.7", + "version": "1.0.0-dev.8", "description": "Repository containing SPV functions used by @dashevo", "main": "index.js", "scripts": { diff --git a/packages/dashmate/package.json b/packages/dashmate/package.json index a491677fae..d344da4324 100644 --- a/packages/dashmate/package.json +++ b/packages/dashmate/package.json @@ -1,6 +1,6 @@ { "name": "dashmate", - "version": "1.0.0-dev.7", + "version": "1.0.0-dev.8", "description": "Distribution package for Dash node installation", "scripts": { "lint": "eslint .", diff --git a/packages/dashpay-contract/Cargo.toml b/packages/dashpay-contract/Cargo.toml index 7ae9aab7d0..78a9823871 100644 --- a/packages/dashpay-contract/Cargo.toml +++ b/packages/dashpay-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dashpay-contract" description = "DashPay data contract schema and tools" -version = "1.0.0-dev.7" +version = "1.0.0-dev.8" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/dashpay-contract/package.json b/packages/dashpay-contract/package.json index 1f52d9954a..97e0c6bf19 100644 --- a/packages/dashpay-contract/package.json +++ b/packages/dashpay-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dashpay-contract", - "version": "1.0.0-dev.7", + "version": "1.0.0-dev.8", "description": "Reference contract of the DashPay DPA on Dash Evolution", "scripts": { "lint": "eslint .", diff --git a/packages/data-contracts/Cargo.toml b/packages/data-contracts/Cargo.toml index c452a5743d..3733179596 100644 --- a/packages/data-contracts/Cargo.toml +++ b/packages/data-contracts/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "data-contracts" description = "Dash Platform system data contracts" -version = "1.0.0-dev.7" +version = "1.0.0-dev.8" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/dpns-contract/Cargo.toml b/packages/dpns-contract/Cargo.toml index 06cc4f3305..ec0235daa7 100644 --- a/packages/dpns-contract/Cargo.toml +++ b/packages/dpns-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dpns-contract" description = "DPNS data contract schema and tools" -version = "1.0.0-dev.7" +version = "1.0.0-dev.8" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/dpns-contract/package.json b/packages/dpns-contract/package.json index 823f56242e..18ac712e2d 100644 --- a/packages/dpns-contract/package.json +++ b/packages/dpns-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dpns-contract", - "version": "1.0.0-dev.7", + "version": "1.0.0-dev.8", "description": "A contract and helper scripts for DPNS DApp", "scripts": { "lint": "eslint .", diff --git a/packages/feature-flags-contract/Cargo.toml b/packages/feature-flags-contract/Cargo.toml index fc6059583d..2776d9a300 100644 --- a/packages/feature-flags-contract/Cargo.toml +++ b/packages/feature-flags-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "feature-flags-contract" description = "Feature flags data contract schema and tools" -version = "1.0.0-dev.7" +version = "1.0.0-dev.8" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/feature-flags-contract/package.json b/packages/feature-flags-contract/package.json index 71dbb6daca..6f78f58d04 100644 --- a/packages/feature-flags-contract/package.json +++ b/packages/feature-flags-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/feature-flags-contract", - "version": "1.0.0-dev.7", + "version": "1.0.0-dev.8", "description": "Data Contract to store Dash Platform feature flags", "scripts": { "build": "", diff --git a/packages/js-dapi-client/package.json b/packages/js-dapi-client/package.json index cb45075f30..5508ea0b2e 100644 --- a/packages/js-dapi-client/package.json +++ b/packages/js-dapi-client/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-client", - "version": "1.0.0-dev.7", + "version": "1.0.0-dev.8", "description": "Client library used to access Dash DAPI endpoints", "main": "lib/index.js", "contributors": [ diff --git a/packages/js-dash-sdk/package.json b/packages/js-dash-sdk/package.json index bebf112986..a3d4f4ac1a 100644 --- a/packages/js-dash-sdk/package.json +++ b/packages/js-dash-sdk/package.json @@ -1,6 +1,6 @@ { "name": "dash", - "version": "4.0.0-dev.7", + "version": "4.0.0-dev.8", "description": "Dash library for JavaScript/TypeScript ecosystem (Wallet, DAPI, Primitives, BLS, ...)", "main": "build/index.js", "unpkg": "dist/dash.min.js", diff --git a/packages/js-grpc-common/package.json b/packages/js-grpc-common/package.json index f832c4efcb..b44146e4fb 100644 --- a/packages/js-grpc-common/package.json +++ b/packages/js-grpc-common/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/grpc-common", - "version": "1.0.0-dev.7", + "version": "1.0.0-dev.8", "description": "Common GRPC library", "main": "index.js", "scripts": { diff --git a/packages/masternode-reward-shares-contract/Cargo.toml b/packages/masternode-reward-shares-contract/Cargo.toml index e911d3c402..2a4e0d241f 100644 --- a/packages/masternode-reward-shares-contract/Cargo.toml +++ b/packages/masternode-reward-shares-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "masternode-reward-shares-contract" description = "Masternode reward shares data contract schema and tools" -version = "1.0.0-dev.7" +version = "1.0.0-dev.8" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/masternode-reward-shares-contract/package.json b/packages/masternode-reward-shares-contract/package.json index b56aae5dd0..fbf04cb08c 100644 --- a/packages/masternode-reward-shares-contract/package.json +++ b/packages/masternode-reward-shares-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/masternode-reward-shares-contract", - "version": "1.0.0-dev.7", + "version": "1.0.0-dev.8", "description": "A contract and helper scripts for reward sharing", "scripts": { "lint": "eslint .", diff --git a/packages/platform-test-suite/package.json b/packages/platform-test-suite/package.json index c0fc7ab6f5..e7df10bafe 100644 --- a/packages/platform-test-suite/package.json +++ b/packages/platform-test-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/platform-test-suite", "private": true, - "version": "1.0.0-dev.7", + "version": "1.0.0-dev.8", "description": "Dash Network end-to-end tests", "scripts": { "test": "yarn exec bin/test.sh", diff --git a/packages/rs-dapi-client/Cargo.toml b/packages/rs-dapi-client/Cargo.toml index 4e2d5ade5c..2d161832a3 100644 --- a/packages/rs-dapi-client/Cargo.toml +++ b/packages/rs-dapi-client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rs-dapi-client" -version = "1.0.0-dev.7" +version = "1.0.0-dev.8" edition = "2021" [features] diff --git a/packages/rs-dapi-grpc-macros/Cargo.toml b/packages/rs-dapi-grpc-macros/Cargo.toml index 9e4e120d22..6f7e3fa786 100644 --- a/packages/rs-dapi-grpc-macros/Cargo.toml +++ b/packages/rs-dapi-grpc-macros/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc-macros" -version = "1.0.0-dev.7" +version = "1.0.0-dev.8" edition = "2021" description = "Macros used by dapi-grpc. Internal use only." diff --git a/packages/rs-dpp/Cargo.toml b/packages/rs-dpp/Cargo.toml index 5af10dcb76..4540d0b63d 100644 --- a/packages/rs-dpp/Cargo.toml +++ b/packages/rs-dpp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dpp" -version = "1.0.0-dev.7" +version = "1.0.0-dev.8" edition = "2021" rust-version = "1.76" authors = [ diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index 1756746b9f..8ad3c35d6d 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drive-abci" -version = "1.0.0-dev.7" +version = "1.0.0-dev.8" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/rs-drive-proof-verifier/Cargo.toml b/packages/rs-drive-proof-verifier/Cargo.toml index 0a581742d3..e0ef185c51 100644 --- a/packages/rs-drive-proof-verifier/Cargo.toml +++ b/packages/rs-drive-proof-verifier/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drive-proof-verifier" -version = "1.0.0-dev.7" +version = "1.0.0-dev.8" edition = "2021" rust-version = "1.76" diff --git a/packages/rs-drive/Cargo.toml b/packages/rs-drive/Cargo.toml index 65003b373e..b1d5c32ce5 100644 --- a/packages/rs-drive/Cargo.toml +++ b/packages/rs-drive/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "drive" description = "Dash drive built on top of GroveDB" -version = "1.0.0-dev.7" +version = "1.0.0-dev.8" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/rs-platform-serialization-derive/Cargo.toml b/packages/rs-platform-serialization-derive/Cargo.toml index e9cbfb6c67..cbeea61c47 100644 --- a/packages/rs-platform-serialization-derive/Cargo.toml +++ b/packages/rs-platform-serialization-derive/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization-derive" authors = ["Samuel Westrich "] description = "Bincode serialization and deserialization derivations" -version = "1.0.0-dev.7" +version = "1.0.0-dev.8" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/rs-platform-serialization/Cargo.toml b/packages/rs-platform-serialization/Cargo.toml index cf16bfb0cd..18dcae020d 100644 --- a/packages/rs-platform-serialization/Cargo.toml +++ b/packages/rs-platform-serialization/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization" authors = ["Samuel Westrich "] description = "Bincode based serialization and deserialization" -version = "1.0.0-dev.7" +version = "1.0.0-dev.8" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/rs-platform-value-convertible/Cargo.toml b/packages/rs-platform-value-convertible/Cargo.toml index d00e021be6..9e0e96e64c 100644 --- a/packages/rs-platform-value-convertible/Cargo.toml +++ b/packages/rs-platform-value-convertible/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-value-convertible" authors = ["Samuel Westrich "] description = "Convertion to and from platform values" -version = "1.0.0-dev.7" +version = "1.0.0-dev.8" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/rs-platform-value/Cargo.toml b/packages/rs-platform-value/Cargo.toml index 4995a0f02f..4e270f9844 100644 --- a/packages/rs-platform-value/Cargo.toml +++ b/packages/rs-platform-value/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-value" authors = ["Samuel Westrich "] description = "A simple value module" -version = "1.0.0-dev.7" +version = "1.0.0-dev.8" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/rs-platform-version/Cargo.toml b/packages/rs-platform-version/Cargo.toml index bf0d0d3796..e4a06b1371 100644 --- a/packages/rs-platform-version/Cargo.toml +++ b/packages/rs-platform-version/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-version" authors = ["Samuel Westrich "] description = "Bincode based serialization and deserialization" -version = "1.0.0-dev.7" +version = "1.0.0-dev.8" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/rs-platform-versioning/Cargo.toml b/packages/rs-platform-versioning/Cargo.toml index 910d563abd..e7deb150a4 100644 --- a/packages/rs-platform-versioning/Cargo.toml +++ b/packages/rs-platform-versioning/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-versioning" authors = ["Samuel Westrich "] description = "Version derivation" -version = "1.0.0-dev.7" +version = "1.0.0-dev.8" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/rs-sdk/Cargo.toml b/packages/rs-sdk/Cargo.toml index 86e2cb873f..ccd8e38b59 100644 --- a/packages/rs-sdk/Cargo.toml +++ b/packages/rs-sdk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rs-sdk" -version = "1.0.0-dev.7" +version = "1.0.0-dev.8" edition = "2021" [dependencies] diff --git a/packages/simple-signer/Cargo.toml b/packages/simple-signer/Cargo.toml index 53a3244de3..dfbf0796cb 100644 --- a/packages/simple-signer/Cargo.toml +++ b/packages/simple-signer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "simple-signer" -version = "1.0.0-dev.7" +version = "1.0.0-dev.8" edition = "2021" rust-version = "1.76" diff --git a/packages/strategy-tests/Cargo.toml b/packages/strategy-tests/Cargo.toml index d0a35c4c9a..926899b4e2 100644 --- a/packages/strategy-tests/Cargo.toml +++ b/packages/strategy-tests/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "strategy-tests" -version = "1.0.0-dev.7" +version = "1.0.0-dev.8" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/wallet-lib/package.json b/packages/wallet-lib/package.json index 13839be28a..da51b2879a 100644 --- a/packages/wallet-lib/package.json +++ b/packages/wallet-lib/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wallet-lib", - "version": "8.0.0-dev.7", + "version": "8.0.0-dev.8", "description": "Light wallet library for Dash", "main": "src/index.js", "unpkg": "dist/wallet-lib.min.js", diff --git a/packages/wasm-dpp/Cargo.toml b/packages/wasm-dpp/Cargo.toml index 4e30760e00..e62c5c48b1 100644 --- a/packages/wasm-dpp/Cargo.toml +++ b/packages/wasm-dpp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasm-dpp" -version = "1.0.0-dev.7" +version = "1.0.0-dev.8" edition = "2021" rust-version = "1.76" authors = ["Anton Suprunchuk "] diff --git a/packages/wasm-dpp/package.json b/packages/wasm-dpp/package.json index 7cc485ab16..c41b737317 100644 --- a/packages/wasm-dpp/package.json +++ b/packages/wasm-dpp/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wasm-dpp", - "version": "1.0.0-dev.7", + "version": "1.0.0-dev.8", "description": "The JavaScript implementation of the Dash Platform Protocol", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/withdrawals-contract/Cargo.toml b/packages/withdrawals-contract/Cargo.toml index ffb133ae02..c91e9df05c 100644 --- a/packages/withdrawals-contract/Cargo.toml +++ b/packages/withdrawals-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "withdrawals-contract" description = "Witdrawals data contract schema and tools" -version = "1.0.0-dev.7" +version = "1.0.0-dev.8" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/withdrawals-contract/package.json b/packages/withdrawals-contract/package.json index dbd0450d0b..ac825854d8 100644 --- a/packages/withdrawals-contract/package.json +++ b/packages/withdrawals-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/withdrawals-contract", - "version": "1.0.0-dev.7", + "version": "1.0.0-dev.8", "description": "Data Contract to manipulate and track withdrawals", "scripts": { "build": "", From 8405c30286db75e1bcc14cd19658bda343f0f319 Mon Sep 17 00:00:00 2001 From: Paul DeLucia <69597248+pauldelucia@users.noreply.github.com> Date: Fri, 15 Mar 2024 02:02:11 +0700 Subject: [PATCH 090/191] refactor: make strategy start identities a new struct (#1764) --- .../tests/strategy_tests/chain_lock_update.rs | 4 +- .../tests/strategy_tests/core_update_tests.rs | 8 +-- .../tests/strategy_tests/failures.rs | 6 +- .../tests/strategy_tests/main.rs | 69 ++++++++++--------- .../tests/strategy_tests/query.rs | 8 +-- .../tests/strategy_tests/strategy.rs | 4 +- .../strategy_tests/upgrade_fork_tests.rs | 16 ++--- packages/strategy-tests/src/lib.rs | 30 +++++--- 8 files changed, 78 insertions(+), 67 deletions(-) diff --git a/packages/rs-drive-abci/tests/strategy_tests/chain_lock_update.rs b/packages/rs-drive-abci/tests/strategy_tests/chain_lock_update.rs index 552ca3497f..c5fda75422 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/chain_lock_update.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/chain_lock_update.rs @@ -8,7 +8,7 @@ mod tests { use drive_abci::test::helpers::setup::TestPlatformBuilder; use strategy_tests::frequency::Frequency; - use strategy_tests::Strategy; + use strategy_tests::{StartIdentities, Strategy}; #[test] fn run_chain_lock_update_quorums_not_changing() { @@ -18,7 +18,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: (0, 0), + start_identities: StartIdentities::default(), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, diff --git a/packages/rs-drive-abci/tests/strategy_tests/core_update_tests.rs b/packages/rs-drive-abci/tests/strategy_tests/core_update_tests.rs index 520ae17c22..de8eddbf67 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/core_update_tests.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/core_update_tests.rs @@ -9,7 +9,7 @@ mod tests { use drive_abci::platform_types::validator_set::v0::ValidatorSetV0Getters; use drive_abci::test::helpers::setup::TestPlatformBuilder; use strategy_tests::frequency::Frequency; - use strategy_tests::Strategy; + use strategy_tests::{StartIdentities, Strategy}; #[test] fn run_chain_random_bans() { @@ -17,7 +17,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: (0, 0), + start_identities: StartIdentities::default(), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, @@ -117,7 +117,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: (0, 0), + start_identities: StartIdentities::default(), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, @@ -203,7 +203,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: (0, 0), + start_identities: StartIdentities::default(), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, diff --git a/packages/rs-drive-abci/tests/strategy_tests/failures.rs b/packages/rs-drive-abci/tests/strategy_tests/failures.rs index db809b1a07..6a4e58c7fb 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/failures.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/failures.rs @@ -6,7 +6,7 @@ mod tests { use strategy_tests::frequency::Frequency; use crate::strategy::{FailureStrategy, NetworkStrategy}; - use strategy_tests::Strategy; + use strategy_tests::{StartIdentities, Strategy}; use drive_abci::config::{ExecutionConfig, PlatformConfig, PlatformTestConfig}; @@ -47,7 +47,7 @@ mod tests { Some(BTreeMap::from([(3, contract_update_1)])), )], operations: vec![], - start_identities: (0, 0), + start_identities: StartIdentities::default(), identities_inserts: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -124,7 +124,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: (0, 0), + start_identities: StartIdentities::default(), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, diff --git a/packages/rs-drive-abci/tests/strategy_tests/main.rs b/packages/rs-drive-abci/tests/strategy_tests/main.rs index ef6cddab41..b7b8c77c55 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/main.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/main.rs @@ -80,6 +80,7 @@ mod tests { use dashcore_rpc::dashcore_rpc_json::{AssetUnlockStatus, ExtendedQuorumDetails}; use dashcore_rpc::json::AssetUnlockStatusResult; use dpp::block::extended_block_info::v0::ExtendedBlockInfoV0Getters; + use strategy_tests::StartIdentities; use std::sync::{Arc, Mutex}; use strategy_tests::operations::DocumentAction::DocumentActionReplace; use strategy_tests::operations::{ @@ -145,7 +146,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: (0, 0), + start_identities: StartIdentities::default(), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, @@ -191,7 +192,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: (0, 0), + start_identities: StartIdentities::default(), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, @@ -238,7 +239,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: (0, 0), + start_identities: StartIdentities::default(), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, @@ -366,7 +367,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: (0, 0), + start_identities: StartIdentities::default(), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, @@ -501,7 +502,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: (0, 0), + start_identities: StartIdentities::default(), identities_inserts: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -562,7 +563,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: (0, 0), + start_identities: StartIdentities::default(), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, @@ -612,7 +613,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: (0, 0), + start_identities: StartIdentities::default(), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, @@ -670,7 +671,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: (0, 0), + start_identities: StartIdentities::default(), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, @@ -733,7 +734,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: (0, 0), + start_identities: StartIdentities::default(), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, @@ -809,7 +810,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: (0, 0), + start_identities: StartIdentities::default(), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, @@ -874,7 +875,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: (0, 0), + start_identities: StartIdentities::default(), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, @@ -942,7 +943,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: (0, 0), + start_identities: StartIdentities::default(), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, @@ -1037,7 +1038,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: (0, 0), + start_identities: StartIdentities::default(), identities_inserts: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -1091,7 +1092,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: (0, 0), + start_identities: StartIdentities::default(), identities_inserts: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -1169,7 +1170,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![(contract, None)], operations: vec![], - start_identities: (0, 0), + start_identities: StartIdentities::default(), identities_inserts: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -1276,7 +1277,7 @@ mod tests { ])), )], operations: vec![], - start_identities: (0, 0), + start_identities: StartIdentities::default(), identities_inserts: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -1376,7 +1377,7 @@ mod tests { chance_per_block: None, }, }], - start_identities: (0, 0), + start_identities: StartIdentities::default(), identities_inserts: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -1452,7 +1453,7 @@ mod tests { chance_per_block: None, }, }], - start_identities: (0, 0), + start_identities: StartIdentities::default(), identities_inserts: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -1556,7 +1557,7 @@ mod tests { }, }, ], - start_identities: (0, 0), + start_identities: StartIdentities::default(), identities_inserts: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -1660,7 +1661,7 @@ mod tests { }, }, ], - start_identities: (0, 0), + start_identities: StartIdentities::default(), identities_inserts: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -1779,7 +1780,7 @@ mod tests { }, }, ], - start_identities: (0, 0), + start_identities: StartIdentities::default(), identities_inserts: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -1900,7 +1901,7 @@ mod tests { }, }, ], - start_identities: (0, 0), + start_identities: StartIdentities::default(), identities_inserts: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -2010,7 +2011,7 @@ mod tests { }, }, ], - start_identities: (0, 0), + start_identities: StartIdentities::default(), identities_inserts: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -2120,7 +2121,7 @@ mod tests { }, }, ], - start_identities: (0, 0), + start_identities: StartIdentities::default(), identities_inserts: Frequency { times_per_block_range: 1..30, chance_per_block: None, @@ -2244,7 +2245,7 @@ mod tests { }, }, ], - start_identities: (0, 0), + start_identities: StartIdentities::default(), identities_inserts: Frequency { times_per_block_range: 1..6, chance_per_block: None, @@ -2312,7 +2313,7 @@ mod tests { chance_per_block: None, }, }], - start_identities: (0, 0), + start_identities: StartIdentities::default(), identities_inserts: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -2386,7 +2387,7 @@ mod tests { chance_per_block: None, }, }], - start_identities: (0, 0), + start_identities: StartIdentities::default(), identities_inserts: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -2467,7 +2468,7 @@ mod tests { chance_per_block: None, }, }], - start_identities: (0, 0), + start_identities: StartIdentities::default(), identities_inserts: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -2556,7 +2557,7 @@ mod tests { }, }, ], - start_identities: (0, 0), + start_identities: StartIdentities::default(), identities_inserts: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -3112,7 +3113,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: (0, 0), + start_identities: StartIdentities::default(), identities_inserts: Frequency { //we do this to create some paying transactions times_per_block_range: 1..2, @@ -3272,7 +3273,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: (0, 0), + start_identities: StartIdentities::default(), identities_inserts: Frequency { //we do this to create some paying transactions times_per_block_range: 1..2, @@ -3403,7 +3404,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: (0, 0), + start_identities: StartIdentities::default(), identities_inserts: Frequency { //we do this to create some paying transactions times_per_block_range: 1..2, @@ -3535,7 +3536,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: (0, 0), + start_identities: StartIdentities::default(), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, @@ -3668,7 +3669,7 @@ mod tests { chance_per_block: None, }, }], - start_identities: (0, 0), + start_identities: StartIdentities::default(), identities_inserts: Frequency { times_per_block_range: 6..10, chance_per_block: None, diff --git a/packages/rs-drive-abci/tests/strategy_tests/query.rs b/packages/rs-drive-abci/tests/strategy_tests/query.rs index 916fdef060..1ace93ed31 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/query.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/query.rs @@ -337,7 +337,7 @@ mod tests { use drive_abci::test::helpers::setup::TestPlatformBuilder; - use strategy_tests::Strategy; + use strategy_tests::{StartIdentities, Strategy}; use crate::strategy::CoreHeightIncrease::RandomCoreHeightIncrease; @@ -371,7 +371,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: (0, 0), + start_identities: StartIdentities::default(), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, @@ -471,7 +471,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: (0, 0), + start_identities: StartIdentities::default(), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, @@ -572,7 +572,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: (0, 0), + start_identities: StartIdentities::default(), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, diff --git a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs index 6bc503f06f..949090e0c7 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs @@ -365,9 +365,9 @@ impl NetworkStrategy { platform_version: &PlatformVersion, ) -> Result, ProtocolError> { let mut state_transitions = vec![]; - if block_info.height == 1 && self.strategy.start_identities.0 > 0 { + if block_info.height == 1 && self.strategy.start_identities.number_of_identities > 0 { let mut new_transitions = NetworkStrategy::create_identities_state_transitions( - self.strategy.start_identities.0.into(), + self.strategy.start_identities.number_of_identities.into(), 5, signer, rng, diff --git a/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs b/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs index a058ad46dd..a5070a898c 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs @@ -17,7 +17,7 @@ mod tests { use platform_version::version::mocks::v2_test::TEST_PROTOCOL_VERSION_2; use platform_version::version::mocks::v3_test::TEST_PROTOCOL_VERSION_3; use strategy_tests::frequency::Frequency; - use strategy_tests::Strategy; + use strategy_tests::{StartIdentities, Strategy}; #[test] fn run_chain_version_upgrade() { @@ -35,7 +35,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: (0, 0), + start_identities: StartIdentities::default(), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, @@ -278,7 +278,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: (0, 0), + start_identities: StartIdentities::default(), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, @@ -510,7 +510,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: (0, 0), + start_identities: StartIdentities::default(), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, @@ -739,7 +739,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: (0, 0), + start_identities: StartIdentities::default(), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, @@ -899,7 +899,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: (0, 0), + start_identities: StartIdentities::default(), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, @@ -1059,7 +1059,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: (0, 0), + start_identities: StartIdentities::default(), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, @@ -1161,7 +1161,7 @@ mod tests { strategy: Strategy { contracts_with_updates: vec![], operations: vec![], - start_identities: (0, 0), + start_identities: StartIdentities::default(), identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, diff --git a/packages/strategy-tests/src/lib.rs b/packages/strategy-tests/src/lib.rs index 79f57f2dc2..c9c942e690 100644 --- a/packages/strategy-tests/src/lib.rs +++ b/packages/strategy-tests/src/lib.rs @@ -64,9 +64,7 @@ pub mod transitions; /// /// - `operations`: A list of `Operation`s which define individual tasks or actions that are part of the strategy. Operations could encompass a range of blockchain-related actions like transfers, state changes, contract creations, etc. /// -/// - `start_identities`: A list of tuples representing the starting state of identities. Each tuple contains: -/// 1. `Identity`: The initial identity state. -/// 2. `StateTransition`: The state transition that led to the current state of the identity. +/// - `start_identities`: An instance of StartIdentities, which specifies the number of identities to register on the first block of the strategy, along with number of keys per identity and starting balance of each identity. /// /// - `identities_inserts`: Defines the frequency distribution of identity inserts. `Frequency` might encapsulate statistical data like mean, median, variance, etc., for understanding or predicting the frequency of identity insertions. /// @@ -92,7 +90,7 @@ pub struct Strategy { Option>, )>, pub operations: Vec, - pub start_identities: (u8, u8), + pub start_identities: StartIdentities, pub identities_inserts: Frequency, pub identity_contract_nonce_gaps: Option, pub signer: Option, @@ -105,6 +103,14 @@ pub struct StrategyConfig { pub number_of_blocks: u64, } +/// Identities to register on the first block of the strategy +#[derive(Clone, Debug, PartialEq, Default, Encode, Decode)] +pub struct StartIdentities { + pub number_of_identities: u8, + pub keys_per_identity: u8, + pub starting_balances: Option, +} + #[derive(Clone, Debug, PartialEq)] pub struct RandomDocumentQuery<'a> { pub data_contract: &'a DataContract, @@ -120,7 +126,7 @@ pub enum LocalDocumentQuery<'a> { struct StrategyInSerializationFormat { pub contracts_with_updates: Vec<(Vec, Option>>)>, pub operations: Vec>, - pub start_identities: (u8, u8), + pub start_identities: StartIdentities, pub identities_inserts: Frequency, pub identity_contract_nonce_gaps: Option, pub signer: Option, @@ -325,10 +331,10 @@ impl Strategy { let mut state_transitions = vec![]; // Add start_identities - if block_info.height == config.start_block_height && self.start_identities.0 > 0 { + if block_info.height == config.start_block_height && self.start_identities.number_of_identities > 0 { let mut new_transitions = crate::transitions::create_identities_state_transitions( - self.start_identities.0.into(), // number of identities - self.start_identities.1.into(), // number of keys per identity + self.start_identities.number_of_identities.into(), // number of identities + self.start_identities.keys_per_identity.into(), // number of keys per identity signer, rng, create_asset_lock, @@ -1449,7 +1455,7 @@ mod tests { use crate::frequency::Frequency; use crate::operations::{DocumentAction, DocumentOp, Operation, OperationType}; use crate::transitions::create_state_transitions_for_identities; - use crate::Strategy; + use crate::{StartIdentities, Strategy}; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::document_type::random_document::{ DocumentFieldFillSize, DocumentFieldFillType, @@ -1575,7 +1581,11 @@ mod tests { }, }, ], - start_identities: (2, 3), + start_identities: StartIdentities { + number_of_identities: 2, + keys_per_identity: 3, + starting_balances: None, + }, identities_inserts: Frequency { times_per_block_range: Default::default(), chance_per_block: None, From 08f6b183cb34741a7de13effb0a0b976af5357ea Mon Sep 17 00:00:00 2001 From: pshenmic Date: Fri, 15 Mar 2024 09:51:17 +0300 Subject: [PATCH 091/191] chore(dashmate): readme fixes (#1624) --- packages/dashmate/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/dashmate/README.md b/packages/dashmate/README.md index 7fa5d7a014..acfa37c0c5 100644 --- a/packages/dashmate/README.md +++ b/packages/dashmate/README.md @@ -62,7 +62,7 @@ Example usage: ```bash $ dashmate stop -$ npm update -g dashmate +$ npm install -g dashmate $ dashmate update ╔══════════════════╤══════════════════════════════╤════════════╗ ║ Service │ Image │ Updated ║ @@ -87,7 +87,7 @@ In some cases, you must also additionally reset platform data: ```bash $ dashmate stop -$ npm update -g dashmate +$ npm install -g dashmate $ dashmate reset --platform-only --hard $ dashmate update $ dashmate setup From d2d389ee8c2af182891e9eaada7ed054b2e65f47 Mon Sep 17 00:00:00 2001 From: Igor Markin Date: Fri, 15 Mar 2024 12:21:35 +0000 Subject: [PATCH 092/191] fix(drive): internal error on querying proofs (#1747) --- .../rs-drive-abci/src/query/proofs/v0/mod.rs | 32 +++++++++++++++++++ .../src/drive/prove/prove_multiple/v0/mod.rs | 6 +++- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/packages/rs-drive-abci/src/query/proofs/v0/mod.rs b/packages/rs-drive-abci/src/query/proofs/v0/mod.rs index c1e15fe44b..992fd62060 100644 --- a/packages/rs-drive-abci/src/query/proofs/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/proofs/v0/mod.rs @@ -252,4 +252,36 @@ mod tests { metadata: Some(_), }) if !proof.grovedb_proof.is_empty())); } + + #[test] + fn test_prove_all() { + let (platform, state, version) = setup_platform(); + + let request = GetProofsRequestV0 { + identities: vec![ + IdentityRequest { + identity_id: vec![0; 32], + request_type: 0, + } + ], + contracts: vec![ContractRequest { + contract_id: vec![0; 32] + }], + documents: vec![DocumentRequest { + contract_id: vec![0; 32], + document_type: "niceDocument".to_string(), + document_type_keeps_history: false, + document_id: vec![1; 32], + }], + }; + + let validation_result = platform + .query_proofs_v0(request, &state, version) + .expect("expected query to succeed"); + + assert!(matches!(validation_result.data, Some(GetProofsResponseV0 { + result: Some(get_proofs_response_v0::Result::Proof(proof)), + metadata: Some(_), + }) if !proof.grovedb_proof.is_empty())); + } } diff --git a/packages/rs-drive/src/drive/prove/prove_multiple/v0/mod.rs b/packages/rs-drive/src/drive/prove/prove_multiple/v0/mod.rs index df90006d23..db1e1a5397 100644 --- a/packages/rs-drive/src/drive/prove/prove_multiple/v0/mod.rs +++ b/packages/rs-drive/src/drive/prove/prove_multiple/v0/mod.rs @@ -89,7 +89,11 @@ impl Drive { path_queries.extend( document_queries .iter() - .map(|drive_query| drive_query.construct_path_query()), + .map(|drive_query| { + let mut path_query = drive_query.construct_path_query(); + path_query.query.limit = None; + path_query + }), ); count += document_queries.len(); } From f133e817766c39b95e608272eb11eace9974b8e2 Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Fri, 15 Mar 2024 19:43:00 +0700 Subject: [PATCH 093/191] feat: created at updated at from block time (#1780) --- .../test/functional/platform/Document.spec.js | 135 +++----------- packages/rs-dpp/src/block/block_info/mod.rs | 3 +- .../is_equal_ignoring_timestamps/mod.rs | 2 + .../is_equal_ignoring_timestamps/v0/mod.rs | 14 ++ .../src/document/document_methods/mod.rs | 9 + packages/rs-dpp/src/document/mod.rs | 26 ++- packages/rs-dpp/src/document/v0/mod.rs | 5 + .../document_create_transition/mod.rs | 47 ++++- .../v0/from_document.rs | 2 - .../document_create_transition/v0/mod.rs | 95 ++++------ .../v0/v0_methods.rs | 38 ---- .../document_create_transition/v0_methods.rs | 25 --- .../document_replace_transition/mod.rs | 38 +++- .../v0/from_document.rs | 1 - .../document_replace_transition/v0/mod.rs | 39 ++-- .../v0/v0_methods.rs | 15 -- .../document_replace_transition/v0_methods.rs | 13 -- .../document_transition/mod.rs | 66 ++----- .../find_duplicates_by_id/v0/mod.rs | 3 - .../src/execution/check_tx/v0/mod.rs | 8 +- .../process_raw_state_transitions/v0/mod.rs | 17 +- .../check_tx_verification/v0/mod.rs | 15 +- .../state_transition/processor/mod.rs | 3 + .../state_transition/processor/v0/mod.rs | 3 + .../data_contract_create/mod.rs | 2 + .../data_contract_update/mod.rs | 2 + .../document_create_transition_action/mod.rs | 4 +- .../structure_v0/mod.rs | 170 +----------------- .../document_replace_transition_action/mod.rs | 4 +- .../structure_v0/mod.rs | 85 +-------- .../advanced_structure/v0/mod.rs | 7 +- .../data_triggers/triggers/dashpay/v0/mod.rs | 6 +- .../data_triggers/triggers/dpns/v0/mod.rs | 3 +- .../state_transitions/documents_batch/mod.rs | 6 +- .../documents_batch/state/v0/mod.rs | 4 + .../documents_batch/transformer/v0/mod.rs | 15 +- .../state_transitions/identity_create/mod.rs | 2 + .../identity_credit_transfer/mod.rs | 2 + .../identity_credit_withdrawal/mod.rs | 2 + .../state_transitions/identity_top_up/mod.rs | 2 + .../state_transitions/identity_update/mod.rs | 2 + .../state_transition/transformer/mod.rs | 83 ++++++--- .../tests/strategy_tests/failures.rs | 1 - .../tests/strategy_tests/main.rs | 6 +- .../tests/strategy_tests/strategy.rs | 18 -- .../verify_state_transitions.rs | 1 + packages/rs-drive-proof-verifier/src/proof.rs | 1 + .../v0/mod.rs | 2 +- .../mod.rs | 4 + .../v0/mod.rs | 26 ++- .../document_base_transition_action/mod.rs | 11 ++ .../document_base_transition_action/v0/mod.rs | 5 + .../document_create_transition_action/mod.rs | 6 - .../transformer.rs | 7 +- .../v0/mod.rs | 11 +- .../v0/transformer.rs | 55 +++--- .../transformer.rs | 2 + .../v0/transformer.rs | 22 ++- .../src/version/dpp_versions.rs | 1 + .../src/version/mocks/v2_test.rs | 1 + .../src/version/mocks/v3_test.rs | 1 + .../rs-platform-version/src/version/v1.rs | 1 + .../src/platform/transition/broadcast.rs | 2 + .../src/platform/transition/put_contract.rs | 3 + .../src/platform/transition/put_document.rs | 3 + .../src/platform/transition/put_identity.rs | 2 + .../platform/transition/top_up_identity.rs | 3 + .../transition/withdraw_from_identity.rs | 3 + packages/strategy-tests/src/lib.rs | 24 +-- .../document_transition/mod.rs | 161 ----------------- 70 files changed, 497 insertions(+), 909 deletions(-) create mode 100644 packages/rs-dpp/src/document/document_methods/is_equal_ignoring_timestamps/mod.rs create mode 100644 packages/rs-dpp/src/document/document_methods/is_equal_ignoring_timestamps/v0/mod.rs diff --git a/packages/platform-test-suite/test/functional/platform/Document.spec.js b/packages/platform-test-suite/test/functional/platform/Document.spec.js index 28c51dc7c8..3b03f98586 100644 --- a/packages/platform-test-suite/test/functional/platform/Document.spec.js +++ b/packages/platform-test-suite/test/functional/platform/Document.spec.js @@ -18,6 +18,16 @@ const { }, } = Dash; +const getDocumentObject = (document) => { + const documentObject = document.toObject(); + + // Delete createdAt and updatedAt fields because they could vary slightly + delete documentObject.$createdAt; + delete documentObject.$updatedAt; + + return documentObject; +}; + describe('Platform', () => { describe('Document', function main() { this.timeout(700000); @@ -219,33 +229,28 @@ describe('Platform', () => { expect(fetchedDocument) .to .exist(); - expect(document.toObject()) - .to - .deep - .equal(fetchedDocument.toObject()); + expect(fetchedDocument.getUpdatedAt()) - .to - .be - .deep - .equal(fetchedDocument.getCreatedAt()); + .to.be.greaterThanOrEqual(document.getUpdatedAt()); + expect(fetchedDocument.getCreatedAt()) + .to.be.greaterThanOrEqual(document.getCreatedAt()); + + expect(getDocumentObject(document)).to.deep.equal(getDocumentObject(fetchedDocument)); + expect(fetchedDocument.getUpdatedAt()).to.be.deep.equal(fetchedDocument.getCreatedAt()); }); it('should be able to fetch created document by created timestamp', async () => { const [fetchedDocument] = await client.platform.documents.get( 'customContracts.indexedDocument', { - where: [['$createdAt', '==', document.getCreatedAt() + where: [['$createdAt', '>', document.getCreatedAt() .getTime()]], + orderBy: [['$createdAt', 'desc']], }, ); - expect(fetchedDocument) - .to - .exist(); - expect(document.toObject()) - .to - .deep - .equal(fetchedDocument.toObject()); + expect(fetchedDocument).to.exist(); + expect(getDocumentObject(document)).to.deep.equal(getDocumentObject(fetchedDocument)); }); it('should be able to update document', async () => { @@ -361,65 +366,6 @@ describe('Platform', () => { .greaterThanOrEqual(0); }); - it('should fail to update document with timestamp in violated time frame', async () => { - const [storedDocument] = await client.platform.documents.get( - 'customContracts.indexedDocument', - { where: [['$id', '==', document.getId()]] }, - ); - - const updatedAt = storedDocument.getUpdatedAt(); - - updatedAt.setMinutes(updatedAt.getMinutes() - 10); - - let broadcastError; - - const documentsBatchTransition = await client.platform.documents.broadcast({ - replace: [storedDocument], - }, identity); - - // Additional wait time to mitigate testnet latency - await waitForSTPropagated(); - - const transitions = documentsBatchTransition.getTransitions(); - transitions[0].setRevision(transitions[0].getRevision() + 1); - transitions[0].setUpdatedAt(updatedAt); - - documentsBatchTransition.setTransitions(transitions); - const identityContractNonce = await client.platform - .nonceManager - .getIdentityContractNonce(identity.getId(), storedDocument.getDataContractId()) + 1; - - documentsBatchTransition.setIdentityContractNonce(identityContractNonce); - const signedTransition = await signStateTransition( - client.platform, - documentsBatchTransition, - identity, - 1, - ); - - try { - await client.platform.broadcastStateTransition(signedTransition); - } catch (e) { - client.platform.nonceManager.setIdentityContractNonce( - identity.getId(), - dataContractFixture.getId(), - identityContractNonce, - ); - broadcastError = e; - } - - expect(broadcastError) - .to - .exist(); - expect(broadcastError.code) - .to - .be - .equal(4008); - expect(broadcastError.message) - .to - .match(/Document \w* updatedAt timestamp .* are out of block time window from .* and .*/); - }); - it('should be able to delete a document', async () => { await client.platform.documents.broadcast({ delete: [document], @@ -437,44 +383,5 @@ describe('Platform', () => { .not .exist(); }); - - it('should fail to create a new document with timestamp in violated time frame', async () => { - document = await client.platform.documents.create( - 'customContracts.indexedDocument', - identity, - { - firstName: 'myName', - lastName: 'lastName', - }, - ); - - const timestamp = document.getCreatedAt(); - - timestamp.setMinutes(timestamp.getMinutes() - 10); - - document.setCreatedAt(timestamp); - document.setUpdatedAt(timestamp); - - let broadcastError; - - try { - await client.platform.documents.broadcast({ - create: [document], - }, identity); - } catch (e) { - broadcastError = e; - } - - expect(broadcastError) - .to - .exist(); - expect(broadcastError.message) - .to - .match(/Document \w* createdAt timestamp .* are out of block time window from .* and .*/); - expect(broadcastError.code) - .to - .be - .equal(4008); - }); }); }); diff --git a/packages/rs-dpp/src/block/block_info/mod.rs b/packages/rs-dpp/src/block/block_info/mod.rs index d2da67b984..5fe7df6c7a 100644 --- a/packages/rs-dpp/src/block/block_info/mod.rs +++ b/packages/rs-dpp/src/block/block_info/mod.rs @@ -1,4 +1,5 @@ use crate::block::epoch::{Epoch, EPOCH_0}; +use crate::prelude::TimestampMillis; use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; @@ -16,7 +17,7 @@ pub const DEFAULT_BLOCK_INFO: BlockInfo = BlockInfo { #[derive(Clone, Default, Debug, PartialEq, Eq, Encode, Decode, Serialize, Deserialize)] pub struct BlockInfo { /// Block time in milliseconds - pub time_ms: u64, + pub time_ms: TimestampMillis, /// Block height pub height: u64, diff --git a/packages/rs-dpp/src/document/document_methods/is_equal_ignoring_timestamps/mod.rs b/packages/rs-dpp/src/document/document_methods/is_equal_ignoring_timestamps/mod.rs new file mode 100644 index 0000000000..85654bb28a --- /dev/null +++ b/packages/rs-dpp/src/document/document_methods/is_equal_ignoring_timestamps/mod.rs @@ -0,0 +1,2 @@ +mod v0; +pub(in crate::document) use v0::*; diff --git a/packages/rs-dpp/src/document/document_methods/is_equal_ignoring_timestamps/v0/mod.rs b/packages/rs-dpp/src/document/document_methods/is_equal_ignoring_timestamps/v0/mod.rs new file mode 100644 index 0000000000..a209038657 --- /dev/null +++ b/packages/rs-dpp/src/document/document_methods/is_equal_ignoring_timestamps/v0/mod.rs @@ -0,0 +1,14 @@ +use crate::document::document_methods::DocumentGetRawForDocumentTypeV0; +use crate::document::DocumentV0Getters; + +pub trait DocumentIsEqualIgnoringTimestampsV0: + DocumentV0Getters + DocumentGetRawForDocumentTypeV0 +{ + /// Return a value given the path to its key and the document type for a contract. + fn is_equal_ignoring_timestamps_v0(&self, rhs: &Self) -> bool { + self.id() == rhs.id() + && self.owner_id() == rhs.owner_id() + && self.properties() == rhs.properties() + && self.revision() == rhs.revision() + } +} diff --git a/packages/rs-dpp/src/document/document_methods/mod.rs b/packages/rs-dpp/src/document/document_methods/mod.rs index 18edf4b8d7..0c786833a1 100644 --- a/packages/rs-dpp/src/document/document_methods/mod.rs +++ b/packages/rs-dpp/src/document/document_methods/mod.rs @@ -6,10 +6,12 @@ use crate::ProtocolError; mod get_raw_for_contract; mod get_raw_for_document_type; mod hash; +mod is_equal_ignoring_timestamps; pub(in crate::document) use get_raw_for_contract::*; pub(in crate::document) use get_raw_for_document_type::*; pub(in crate::document) use hash::*; +pub(in crate::document) use is_equal_ignoring_timestamps::*; pub trait DocumentMethodsV0 { /// Return a value given the path to its key and the document type for a contract. @@ -39,4 +41,11 @@ pub trait DocumentMethodsV0 { ) -> Result, ProtocolError>; fn increment_revision(&mut self) -> Result<(), ProtocolError>; + + /// Returns if the documents are equal but ignoring the timestamp + fn is_equal_ignoring_timestamps( + &self, + rhs: &Self, + platform_version: &PlatformVersion, + ) -> Result; } diff --git a/packages/rs-dpp/src/document/mod.rs b/packages/rs-dpp/src/document/mod.rs index f929194ba2..bf088048c7 100644 --- a/packages/rs-dpp/src/document/mod.rs +++ b/packages/rs-dpp/src/document/mod.rs @@ -34,7 +34,7 @@ use crate::data_contract::document_type::DocumentTypeRef; use crate::data_contract::DataContract; use crate::document::document_methods::{ DocumentGetRawForContractV0, DocumentGetRawForDocumentTypeV0, DocumentHashV0Method, - DocumentMethodsV0, + DocumentIsEqualIgnoringTimestampsV0, DocumentMethodsV0, }; use crate::document::errors::DocumentError; use crate::version::PlatformVersion; @@ -178,6 +178,30 @@ impl DocumentMethodsV0 for Document { Ok(()) } + + fn is_equal_ignoring_timestamps( + &self, + rhs: &Self, + platform_version: &PlatformVersion, + ) -> Result { + match (self, rhs) { + (Document::V0(document_v0), Document::V0(rhs_v0)) => { + match platform_version + .dpp + .document_versions + .document_method_versions + .is_equal_ignoring_timestamps + { + 0 => Ok(document_v0.is_equal_ignoring_timestamps_v0(rhs_v0)), + version => Err(ProtocolError::UnknownVersionMismatch { + method: "DocumentMethodV0::is_equal_ignoring_timestamps".to_string(), + known_versions: vec![0], + received: version, + }), + } + } + } + } } #[cfg(test)] diff --git a/packages/rs-dpp/src/document/v0/mod.rs b/packages/rs-dpp/src/document/v0/mod.rs index 3eb6169fe0..241de1d145 100644 --- a/packages/rs-dpp/src/document/v0/mod.rs +++ b/packages/rs-dpp/src/document/v0/mod.rs @@ -21,6 +21,7 @@ use serde::{Deserialize, Serialize}; use crate::document::document_methods::{ DocumentGetRawForContractV0, DocumentGetRawForDocumentTypeV0, DocumentHashV0Method, + DocumentIsEqualIgnoringTimestampsV0, }; use crate::identity::TimestampMillis; @@ -64,6 +65,10 @@ impl DocumentGetRawForContractV0 for DocumentV0 { //automatically done } +impl DocumentIsEqualIgnoringTimestampsV0 for DocumentV0 { + //automatically done +} + impl DocumentGetRawForDocumentTypeV0 for DocumentV0 { //automatically done } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/mod.rs index ef1683d5ee..f9900da9c0 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/mod.rs @@ -5,6 +5,7 @@ mod v0_methods; use crate::data_contract::DataContract; use crate::document::Document; +use crate::identity::TimestampMillis; use crate::state_transition::documents_batch_transition::document_create_transition::v0::DocumentFromCreateTransitionV0; use crate::ProtocolError; use bincode::{Decode, Encode}; @@ -33,12 +34,17 @@ impl Default for DocumentCreateTransition { /// document from create transition pub trait DocumentFromCreateTransition { - /// Attempts to create a new `Document` from the given `DocumentCreateTransition` reference and `owner_id`. + /// Attempts to create a new `Document` from the given `DocumentCreateTransition` reference, `owner_id`, and additional metadata. /// /// # Arguments /// - /// * `value` - A reference to the `DocumentCreateTransition` containing information about the document being created. + /// * `document_create_transition` - A reference to the `DocumentCreateTransition` containing information about the document being created. /// * `owner_id` - The `Identifier` of the document's owner. + /// * `block_time` - The timestamp (in milliseconds) representing when the document creation is being processed. + /// * `requires_created_at` - A boolean indicating if a `created_at` timestamp is required for the document. + /// * `requires_updated_at` - A boolean indicating if an `updated_at` timestamp is required for the document. + /// * `data_contract` - A reference to the `DataContract` associated with this document, defining its structure and rules. + /// * `platform_version` - A reference to the `PlatformVersion` indicating the version of the platform for compatibility. /// /// # Returns /// @@ -46,17 +52,26 @@ pub trait DocumentFromCreateTransition { fn try_from_create_transition( document_create_transition: &DocumentCreateTransition, owner_id: Identifier, + block_time: TimestampMillis, + requires_created_at: bool, + requires_updated_at: bool, data_contract: &DataContract, platform_version: &PlatformVersion, ) -> Result where Self: Sized; - /// Attempts to create a new `Document` from the given `DocumentCreateTransition` instance and `owner_id`. + + /// Attempts to create a new `Document` from the given `DocumentCreateTransition` instance, `owner_id`, and additional metadata. /// /// # Arguments /// - /// * `value` - A `DocumentCreateTransition` instance containing information about the document being created. + /// * `document_create_transition` - A `DocumentCreateTransition` instance containing information about the document being created. /// * `owner_id` - The `Identifier` of the document's owner. + /// * `block_time` - The timestamp (in milliseconds) representing when the document creation is being processed. + /// * `requires_created_at` - A boolean indicating if a `created_at` timestamp is required for the document. + /// * `requires_updated_at` - A boolean indicating if an `updated_at` timestamp is required for the document. + /// * `data_contract` - A reference to the `DataContract` associated with this document, defining its structure and rules. + /// * `platform_version` - A reference to the `PlatformVersion` indicating the version of the platform for compatibility. /// /// # Returns /// @@ -64,6 +79,9 @@ pub trait DocumentFromCreateTransition { fn try_from_owned_create_transition( document_create_transition: DocumentCreateTransition, owner_id: Identifier, + block_time: TimestampMillis, + requires_created_at: bool, + requires_updated_at: bool, data_contract: &DataContract, platform_version: &PlatformVersion, ) -> Result @@ -75,6 +93,9 @@ impl DocumentFromCreateTransition for Document { fn try_from_create_transition( document_create_transition: &DocumentCreateTransition, owner_id: Identifier, + block_time: TimestampMillis, + requires_created_at: bool, + requires_updated_at: bool, data_contract: &DataContract, platform_version: &PlatformVersion, ) -> Result @@ -82,15 +103,24 @@ impl DocumentFromCreateTransition for Document { Self: Sized, { match document_create_transition { - DocumentCreateTransition::V0(v0) => { - Self::try_from_create_transition_v0(v0, owner_id, data_contract, platform_version) - } + DocumentCreateTransition::V0(v0) => Self::try_from_create_transition_v0( + v0, + owner_id, + block_time, + requires_created_at, + requires_updated_at, + data_contract, + platform_version, + ), } } fn try_from_owned_create_transition( document_create_transition: DocumentCreateTransition, owner_id: Identifier, + block_time: TimestampMillis, + requires_created_at: bool, + requires_updated_at: bool, data_contract: &DataContract, platform_version: &PlatformVersion, ) -> Result @@ -101,6 +131,9 @@ impl DocumentFromCreateTransition for Document { DocumentCreateTransition::V0(v0) => Self::try_from_owned_create_transition_v0( v0, owner_id, + block_time, + requires_created_at, + requires_updated_at, data_contract, platform_version, ), diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/from_document.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/from_document.rs index 3ff9c2709c..ea399612f4 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/from_document.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/from_document.rs @@ -24,8 +24,6 @@ impl DocumentCreateTransitionV0 { base_feature_version, )?, entropy, - created_at: document.created_at(), - updated_at: document.updated_at(), data: document.properties_consumed(), }) } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/mod.rs index 3114573e72..37c1159b2a 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/mod.rs @@ -32,8 +32,6 @@ use crate::state_transition::documents_batch_transition; mod property_names { pub const ENTROPY: &str = "$entropy"; - pub const CREATED_AT: &str = "$createdAt"; - pub const UPDATED_AT: &str = "$updatedAt"; } /// The Binary fields in [`DocumentCreateTransition`] @@ -47,14 +45,7 @@ pub use super::super::document_base_transition::IDENTIFIER_FIELDS; derive(Serialize, Deserialize), serde(rename_all = "camelCase") )] -#[display( - fmt = "Base: {}, Entropy: {:?}, Created At: {:?}, Updated At: {:?}, Data: {:?}", - "base", - "entropy", - "created_at", - "updated_at", - "data" -)] +#[display(fmt = "Base: {}, Entropy: {:?}, Data: {:?}", "base", "entropy", "data")] pub struct DocumentCreateTransitionV0 { /// Document Base Transition #[cfg_attr(feature = "state-transition-serde-conversion", serde(flatten))] @@ -67,18 +58,6 @@ pub struct DocumentCreateTransitionV0 { )] pub entropy: [u8; 32], - #[cfg_attr( - feature = "state-transition-serde-conversion", - serde(rename = "$createdAt", skip_serializing_if = "Option::is_none") - )] - pub created_at: Option, - // TODO: It should be moved to update transition - #[cfg_attr( - feature = "state-transition-serde-conversion", - serde(rename = "$updatedAt", skip_serializing_if = "Option::is_none") - )] - pub updated_at: Option, - #[cfg_attr(feature = "state-transition-serde-conversion", serde(flatten))] pub data: BTreeMap, } @@ -153,12 +132,6 @@ impl DocumentCreateTransitionV0 { entropy: map .remove_hash256_bytes(property_names::ENTROPY) .map_err(ProtocolError::ValueError)?, - created_at: map - .remove_optional_integer(property_names::CREATED_AT) - .map_err(ProtocolError::ValueError)?, - updated_at: map - .remove_optional_integer(property_names::UPDATED_AT) - .map_err(ProtocolError::ValueError)?, data: map, }) } @@ -170,18 +143,6 @@ impl DocumentCreateTransitionV0 { property_names::ENTROPY.to_string(), Value::Bytes(self.entropy.to_vec()), ); - if let Some(created_at) = self.created_at { - transition_base_map.insert( - property_names::CREATED_AT.to_string(), - Value::U64(created_at), - ); - } - if let Some(updated_at) = self.updated_at { - transition_base_map.insert( - property_names::UPDATED_AT.to_string(), - Value::U64(updated_at), - ); - } transition_base_map.extend(self.data.clone()); @@ -204,6 +165,9 @@ pub trait DocumentFromCreateTransitionV0 { fn try_from_owned_create_transition_v0( v0: DocumentCreateTransitionV0, owner_id: Identifier, + block_time: TimestampMillis, + requires_created_at: bool, + requires_updated_at: bool, data_contract: &DataContract, platform_version: &PlatformVersion, ) -> Result @@ -222,6 +186,9 @@ pub trait DocumentFromCreateTransitionV0 { fn try_from_create_transition_v0( v0: &DocumentCreateTransitionV0, owner_id: Identifier, + block_time: TimestampMillis, + requires_created_at: bool, + requires_updated_at: bool, data_contract: &DataContract, platform_version: &PlatformVersion, ) -> Result @@ -233,19 +200,16 @@ impl DocumentFromCreateTransitionV0 for Document { fn try_from_owned_create_transition_v0( v0: DocumentCreateTransitionV0, owner_id: Identifier, + block_time: TimestampMillis, + requires_created_at: bool, + requires_updated_at: bool, data_contract: &DataContract, platform_version: &PlatformVersion, ) -> Result where Self: Sized, { - let DocumentCreateTransitionV0 { - base, - created_at, - updated_at, - data, - .. - } = v0; + let DocumentCreateTransitionV0 { base, data, .. } = v0; match base { DocumentBaseTransition::V0(base_v0) => { @@ -258,6 +222,17 @@ impl DocumentFromCreateTransitionV0 for Document { let document_type = data_contract.document_type_for_name(document_type_name.as_str())?; + let created_at = if requires_created_at { + Some(block_time) + } else { + None + }; + let updated_at = if requires_updated_at { + Some(block_time) + } else { + None + }; + match platform_version .dpp .document_versions @@ -285,19 +260,16 @@ impl DocumentFromCreateTransitionV0 for Document { fn try_from_create_transition_v0( v0: &DocumentCreateTransitionV0, owner_id: Identifier, + block_time: TimestampMillis, + requires_created_at: bool, + requires_updated_at: bool, data_contract: &DataContract, platform_version: &PlatformVersion, ) -> Result where Self: Sized, { - let DocumentCreateTransitionV0 { - base, - created_at, - updated_at, - data, - .. - } = v0; + let DocumentCreateTransitionV0 { base, data, .. } = v0; match base { DocumentBaseTransition::V0(base_v0) => { @@ -310,6 +282,17 @@ impl DocumentFromCreateTransitionV0 for Document { let document_type = data_contract.document_type_for_name(document_type_name.as_str())?; + let created_at = if requires_created_at { + Some(block_time) + } else { + None + }; + let updated_at = if requires_updated_at { + Some(block_time) + } else { + None + }; + match platform_version .dpp .document_versions @@ -320,8 +303,8 @@ impl DocumentFromCreateTransitionV0 for Document { owner_id, properties: data.clone(), revision: document_type.initial_revision(), - created_at: *created_at, - updated_at: *updated_at, + created_at, + updated_at, } .into()), version => Err(ProtocolError::UnknownVersionMismatch { diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/v0_methods.rs index 62b19c64ad..e15c8b6dc2 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/v0_methods.rs @@ -1,5 +1,3 @@ -use crate::identity::TimestampMillis; - use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; use crate::state_transition::documents_batch_transition::document_create_transition::DocumentCreateTransitionV0; @@ -31,26 +29,6 @@ pub trait DocumentCreateTransitionV0Methods { /// * `entropy` - An array of 32 bytes to set. fn set_entropy(&mut self, entropy: [u8; 32]); - /// Returns a reference to the `created_at` field of the `DocumentCreateTransitionV0`. - fn created_at(&self) -> Option; - - /// Sets the value of the `created_at` field in the `DocumentCreateTransitionV0`. - /// - /// # Arguments - /// - /// * `created_at` - An `Option` containing a `TimestampMillis` value to set. - fn set_created_at(&mut self, created_at: Option); - - /// Returns a reference to the `updated_at` field of the `DocumentCreateTransitionV0`. - fn updated_at(&self) -> Option; - - /// Sets the value of the `updated_at` field in the `DocumentCreateTransitionV0`. - /// - /// # Arguments - /// - /// * `updated_at` - An `Option` containing a `TimestampMillis` value to set. - fn set_updated_at(&mut self, updated_at: Option); - /// Returns an optional reference to the `data` field of the `DocumentCreateTransitionV0`. fn data(&self) -> &BTreeMap; @@ -86,22 +64,6 @@ impl DocumentCreateTransitionV0Methods for DocumentCreateTransitionV0 { self.entropy = entropy; } - fn created_at(&self) -> Option { - self.created_at - } - - fn set_created_at(&mut self, created_at: Option) { - self.created_at = created_at; - } - - fn updated_at(&self) -> Option { - self.updated_at - } - - fn set_updated_at(&mut self, updated_at: Option) { - self.updated_at = updated_at; - } - fn data(&self) -> &BTreeMap { &self.data } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0_methods.rs index 3d7be5840b..ac937493d7 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0_methods.rs @@ -1,6 +1,5 @@ use std::collections::BTreeMap; use platform_value::{Value}; -use crate::identity::TimestampMillis; use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; use crate::state_transition::documents_batch_transition::document_create_transition::DocumentCreateTransition; use crate::state_transition::documents_batch_transition::document_create_transition::v0::v0_methods::DocumentCreateTransitionV0Methods; @@ -36,30 +35,6 @@ impl DocumentCreateTransitionV0Methods for DocumentCreateTransition { } } - fn created_at(&self) -> Option { - match self { - DocumentCreateTransition::V0(v0) => v0.created_at, - } - } - - fn set_created_at(&mut self, created_at: Option) { - match self { - DocumentCreateTransition::V0(v0) => v0.created_at = created_at, - } - } - - fn updated_at(&self) -> Option { - match self { - DocumentCreateTransition::V0(v0) => v0.updated_at, - } - } - - fn set_updated_at(&mut self, updated_at: Option) { - match self { - DocumentCreateTransition::V0(v0) => v0.updated_at = updated_at, - } - } - fn data(&self) -> &BTreeMap { match self { DocumentCreateTransition::V0(v0) => &v0.data, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/mod.rs index 8b0b3f54f4..d0bb9694df 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/mod.rs @@ -24,12 +24,16 @@ pub enum DocumentReplaceTransition { /// document from replace transition pub trait DocumentFromReplaceTransition { - /// Attempts to create a new `Document` from the given `DocumentReplaceTransition` reference and `owner_id`. + /// Attempts to create a new `Document` from the given `DocumentReplaceTransition` reference, `owner_id`, and additional metadata. /// /// # Arguments /// - /// * `value` - A reference to the `DocumentReplaceTransition` containing information about the document being replaced. + /// * `document_replace_transition_action` - A reference to the `DocumentReplaceTransition` containing information about the document being replaced. /// * `owner_id` - The `Identifier` of the document's owner. + /// * `created_at` - An optional timestamp representing when the document was created. + /// * `block_time` - The timestamp representing the blockchain time at which the document was updated. + /// * `requires_updated_at` - A boolean indicating if an `updated_at` timestamp is required for the document. + /// * `platform_version` - A reference to the `PlatformVersion` indicating the version of the platform for compatibility. /// /// # Returns /// @@ -38,16 +42,23 @@ pub trait DocumentFromReplaceTransition { document_replace_transition_action: &DocumentReplaceTransition, owner_id: Identifier, created_at: Option, + block_time: u64, + requires_updated_at: bool, platform_version: &PlatformVersion, ) -> Result where Self: Sized; - /// Attempts to create a new `Document` from the given `DocumentReplaceTransition` instance and `owner_id`. + + /// Attempts to create a new `Document` from the given `DocumentReplaceTransition` instance, `owner_id`, and additional metadata. /// /// # Arguments /// - /// * `value` - A `DocumentReplaceTransition` instance containing information about the document being replaced. + /// * `document_replace_transition_action` - A `DocumentReplaceTransition` instance containing information about the document being replaced. /// * `owner_id` - The `Identifier` of the document's owner. + /// * `created_at` - An optional timestamp representing when the document was created. + /// * `block_time` - The timestamp representing the blockchain time at which the document was updated. + /// * `requires_updated_at` - A boolean indicating if an `updated_at` timestamp is required for the document. + /// * `platform_version` - A reference to the `PlatformVersion` indicating the version of the platform for compatibility. /// /// # Returns /// @@ -56,6 +67,8 @@ pub trait DocumentFromReplaceTransition { document_replace_transition_action: DocumentReplaceTransition, owner_id: Identifier, created_at: Option, + block_time: u64, + requires_updated_at: bool, platform_version: &PlatformVersion, ) -> Result where @@ -67,12 +80,19 @@ impl DocumentFromReplaceTransition for Document { document_replace_transition: &DocumentReplaceTransition, owner_id: Identifier, created_at: Option, + block_time: u64, + requires_updated_at: bool, platform_version: &PlatformVersion, ) -> Result { match document_replace_transition { - DocumentReplaceTransition::V0(v0) => { - Self::try_from_replace_transition_v0(v0, owner_id, created_at, platform_version) - } + DocumentReplaceTransition::V0(v0) => Self::try_from_replace_transition_v0( + v0, + owner_id, + created_at, + block_time, + requires_updated_at, + platform_version, + ), } } @@ -80,6 +100,8 @@ impl DocumentFromReplaceTransition for Document { document_replace_transition: DocumentReplaceTransition, owner_id: Identifier, created_at: Option, + block_time: u64, + requires_updated_at: bool, platform_version: &PlatformVersion, ) -> Result { match document_replace_transition { @@ -87,6 +109,8 @@ impl DocumentFromReplaceTransition for Document { v0, owner_id, created_at, + block_time, + requires_updated_at, platform_version, ), } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/from_document.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/from_document.rs index 1e2db4383b..5fbd783eb6 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/from_document.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/from_document.rs @@ -28,7 +28,6 @@ impl DocumentReplaceTransitionV0 { document: Box::new(document.clone()), })) })?, - updated_at: document.updated_at(), data: document.properties_consumed(), }) } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/mod.rs index 87f74b04e7..3e651751f1 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/mod.rs @@ -1,7 +1,6 @@ mod from_document; pub mod v0_methods; -use crate::identity::TimestampMillis; use crate::prelude::Revision; use bincode::{Decode, Encode}; use derive_more::Display; @@ -21,7 +20,6 @@ use crate::state_transition::documents_batch_transition::document_base_transitio mod property_names { pub const REVISION: &str = "$revision"; - pub const UPDATED_AT: &str = "$updatedAt"; } #[derive(Debug, Clone, Default, Encode, Decode, PartialEq, Display)] @@ -30,13 +28,7 @@ mod property_names { derive(Serialize, Deserialize), serde(rename_all = "camelCase") )] -#[display( - fmt = "Base: {}, Revision: {}, Updated At: {:?}, Data: {:?}", - "base", - "revision", - "updated_at", - "data" -)] +#[display(fmt = "Base: {}, Revision: {}, Data: {:?}", "base", "revision", "data")] pub struct DocumentReplaceTransitionV0 { #[cfg_attr(feature = "state-transition-serde-conversion", serde(flatten))] pub base: DocumentBaseTransition, @@ -45,11 +37,6 @@ pub struct DocumentReplaceTransitionV0 { serde(rename = "$revision") )] pub revision: Revision, - #[cfg_attr( - feature = "state-transition-serde-conversion", - serde(skip_serializing_if = "Option::is_none", rename = "$updatedAt") - )] - pub updated_at: Option, #[cfg_attr(feature = "state-transition-serde-conversion", serde(flatten))] pub data: BTreeMap, } @@ -275,6 +262,8 @@ pub trait DocumentFromReplaceTransitionV0 { value: &DocumentReplaceTransitionV0, owner_id: Identifier, created_at: Option, + block_time: u64, + requires_updated_at: bool, platform_version: &PlatformVersion, ) -> Result where @@ -294,6 +283,8 @@ pub trait DocumentFromReplaceTransitionV0 { value: DocumentReplaceTransitionV0, owner_id: Identifier, created_at: Option, + block_time: u64, + requires_updated_at: bool, platform_version: &PlatformVersion, ) -> Result where @@ -305,17 +296,24 @@ impl DocumentFromReplaceTransitionV0 for Document { value: &DocumentReplaceTransitionV0, owner_id: Identifier, created_at: Option, + block_time: u64, + requires_updated_at: bool, platform_version: &PlatformVersion, ) -> Result { let DocumentReplaceTransitionV0 { base, revision, - updated_at, data, } = value; let id = base.id(); + let updated_at = if requires_updated_at { + Some(block_time) + } else { + None + }; + match platform_version .dpp .document_versions @@ -327,7 +325,7 @@ impl DocumentFromReplaceTransitionV0 for Document { properties: data.clone(), revision: Some(*revision), created_at, - updated_at: *updated_at, + updated_at, } .into()), version => Err(ProtocolError::UnknownVersionMismatch { @@ -342,17 +340,24 @@ impl DocumentFromReplaceTransitionV0 for Document { value: DocumentReplaceTransitionV0, owner_id: Identifier, created_at: Option, + block_time: u64, + requires_updated_at: bool, platform_version: &PlatformVersion, ) -> Result { let DocumentReplaceTransitionV0 { base, revision, - updated_at, data, } = value; let id = base.id(); + let updated_at = if requires_updated_at { + Some(block_time) + } else { + None + }; + match platform_version .dpp .document_versions diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/v0_methods.rs index bc27aeb63c..9bee325bb1 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/v0_methods.rs @@ -2,7 +2,6 @@ use platform_value::Value; use std::collections::BTreeMap; -use crate::identity::TimestampMillis; use crate::prelude::Revision; use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; @@ -24,12 +23,6 @@ pub trait DocumentReplaceTransitionV0Methods { /// Sets the value of the `revision` field in the `DocumentReplaceTransitionV0`. fn set_revision(&mut self, revision: Revision); - /// Returns a reference to the `updated_at` field of the `DocumentReplaceTransitionV0`. - fn updated_at(&self) -> Option; - - /// Sets the value of the `updated_at` field in the `DocumentReplaceTransitionV0`. - fn set_updated_at(&mut self, updated_at: Option); - /// Returns a reference to the `data` field of the `DocumentReplaceTransitionV0`. fn data(&self) -> &BTreeMap; @@ -61,14 +54,6 @@ impl DocumentReplaceTransitionV0Methods for DocumentReplaceTransitionV0 { self.revision = revision; } - fn updated_at(&self) -> Option { - self.updated_at - } - - fn set_updated_at(&mut self, updated_at: Option) { - self.updated_at = updated_at; - } - fn data(&self) -> &BTreeMap { &self.data } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0_methods.rs index 41c6f54104..29f79a05e2 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0_methods.rs @@ -1,6 +1,5 @@ use std::collections::BTreeMap; use platform_value::Value; -use crate::identity::TimestampMillis; use crate::prelude::Revision; use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; use crate::state_transition::documents_batch_transition::document_transition::document_replace_transition::v0::v0_methods::DocumentReplaceTransitionV0Methods; @@ -37,18 +36,6 @@ impl DocumentReplaceTransitionV0Methods for DocumentReplaceTransition { } } - fn updated_at(&self) -> Option { - match self { - DocumentReplaceTransition::V0(v0) => v0.updated_at, - } - } - - fn set_updated_at(&mut self, updated_at: Option) { - match self { - DocumentReplaceTransition::V0(v0) => v0.updated_at = updated_at, - } - } - fn data(&self) -> &BTreeMap { match self { DocumentReplaceTransition::V0(v0) => &v0.data, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/mod.rs index a270d11f17..8eb647444d 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/mod.rs @@ -14,7 +14,6 @@ pub mod document_create_transition; pub mod document_delete_transition; pub mod document_replace_transition; -use crate::identity::TimestampMillis; use crate::prelude::Revision; use crate::state_transition::documents_batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; use derive_more::Display; @@ -31,14 +30,6 @@ pub const PROPERTY_ACTION: &str = "$action"; pub trait DocumentTransitionV0Methods { fn base(&self) -> &DocumentBaseTransition; - /// returns the creation timestamp (in milliseconds) if it exists for given type of document transition - fn created_at(&self) -> Option; - /// returns the update timestamp (in milliseconds) if it exists for given type of document transition - fn updated_at(&self) -> Option; - /// set the created_at (in milliseconds) if it exists - fn set_created_at(&mut self, timestamp_millis: Option); - /// set the updated_at (in milliseconds) if it exists - fn set_updated_at(&mut self, timestamp_millis: Option); /// returns the value of dynamic property. The dynamic property is a property that is not specified in protocol /// the `path` supports dot-syntax: i.e: property.internal_property fn get_dynamic_property(&self, path: &str) -> Option<&Value>; @@ -228,47 +219,6 @@ impl DocumentTransitionV0Methods for DocumentTransition { } } - fn created_at(&self) -> Option { - match self { - DocumentTransition::Create(t) => t.created_at(), - DocumentTransition::Replace(_) => None, - DocumentTransition::Delete(_) => None, - } - } - - fn updated_at(&self) -> Option { - match self { - DocumentTransition::Create(t) => t.updated_at(), - DocumentTransition::Replace(t) => t.updated_at(), - DocumentTransition::Delete(_) => None, - } - } - - // TODO: it's confusing to set a value and internally it's not setting if your variant doesn't have it. - fn set_created_at(&mut self, timestamp_millis: Option) { - match self { - DocumentTransition::Create(ref mut t) => t.set_created_at(timestamp_millis), - DocumentTransition::Replace(_) => {} - DocumentTransition::Delete(_) => {} - } - } - - fn set_updated_at(&mut self, timestamp_millis: Option) { - match self { - DocumentTransition::Create(ref mut t) => t.set_updated_at(timestamp_millis), - DocumentTransition::Replace(ref mut t) => t.set_updated_at(timestamp_millis), - DocumentTransition::Delete(_) => {} - } - } - - fn set_revision(&mut self, revision: Revision) { - match self { - DocumentTransition::Create(_) => {} - DocumentTransition::Replace(ref mut t) => t.set_revision(revision), - DocumentTransition::Delete(_) => {} - } - } - fn get_dynamic_property(&self, path: &str) -> Option<&Value> { match self { DocumentTransition::Create(t) => t.data().get(path), @@ -305,6 +255,14 @@ impl DocumentTransitionV0Methods for DocumentTransition { } } + fn identity_contract_nonce(&self) -> IdentityNonce { + match self { + DocumentTransition::Create(t) => t.base().identity_contract_nonce(), + DocumentTransition::Replace(t) => t.base().identity_contract_nonce(), + DocumentTransition::Delete(t) => t.base().identity_contract_nonce(), + } + } + #[cfg(test)] fn insert_dynamic_property(&mut self, property_name: String, value: Value) { match self { @@ -342,11 +300,11 @@ impl DocumentTransitionV0Methods for DocumentTransition { } } - fn identity_contract_nonce(&self) -> IdentityNonce { + fn set_revision(&mut self, revision: Revision) { match self { - DocumentTransition::Create(t) => t.base().identity_contract_nonce(), - DocumentTransition::Replace(t) => t.base().identity_contract_nonce(), - DocumentTransition::Delete(t) => t.base().identity_contract_nonce(), + DocumentTransition::Create(_) => {} + DocumentTransition::Replace(ref mut t) => t.set_revision(revision), + DocumentTransition::Delete(_) => {} } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/find_duplicates_by_id/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/find_duplicates_by_id/v0/mod.rs index e9d67fcafa..14409746e4 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/find_duplicates_by_id/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/find_duplicates_by_id/v0/mod.rs @@ -71,8 +71,6 @@ mod test { data_contract_id: Identifier::random(), }), entropy: Default::default(), - created_at: None, - updated_at: None, data: Default::default(), })); @@ -87,7 +85,6 @@ mod test { data_contract_id: Identifier::random(), }), revision: Default::default(), - updated_at: None, data: Default::default(), }, )); diff --git a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs index 7809daa834..6a7d59032d 100644 --- a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs @@ -48,8 +48,12 @@ where core_rpc: &self.core_rpc, }; - let state_transition_execution_event = - process_state_transition(&platform_ref, state_transition, Some(transaction))?; + let state_transition_execution_event = process_state_transition( + &platform_ref, + self.state.load().last_block_info(), + state_transition, + Some(transaction), + )?; if state_transition_execution_event.is_valid() { let execution_event = state_transition_execution_event.into_data()?; diff --git a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_raw_state_transitions/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_raw_state_transitions/v0/mod.rs index aa44b63409..3acf5fb487 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_raw_state_transitions/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_raw_state_transitions/v0/mod.rs @@ -170,13 +170,16 @@ where let is_st_asset_lock_funded = state_transition.optional_asset_lock_proof().is_some(); // Validate state transition and produce an execution event - let mut st_validation_result = - process_state_transition(platform_ref, state_transition, Some(transaction)).map_err( - |error| StateTransitionAwareError { - error, - raw_state_transition: raw_state_transition.into(), - }, - )?; + let mut st_validation_result = process_state_transition( + platform_ref, + block_info, + state_transition, + Some(transaction), + ) + .map_err(|error| StateTransitionAwareError { + error, + raw_state_transition: raw_state_transition.into(), + })?; // State Transition is invalid if !st_validation_result.is_valid() { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs index aecac82af5..fa08af7a16 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs @@ -41,7 +41,16 @@ pub(super) fn state_transition_to_execution_event_for_check_tx_v0<'a, C: CoreRPC match check_tx_level { CheckTxLevel::FirstTimeCheck => { if state_transition.requires_check_tx_full_validation() { - Ok(process_state_transition(platform, state_transition, None)?.map(Some)) + // it's okay to pass last_block_info here + // last block info is being used for the block time so we insert created at + // and updated at + Ok(process_state_transition( + platform, + platform.state.last_block_info(), + state_transition, + None, + )? + .map(Some)) } else { // we need to validate the structure, the fees, and the signature let mut state_transition_execution_context = @@ -83,6 +92,7 @@ pub(super) fn state_transition_to_execution_event_for_check_tx_v0<'a, C: CoreRPC { let state_transition_action_result = state_transition.transform_into_action( platform, + platform.state.last_block_info(), ValidationMode::CheckTx, &mut state_transition_execution_context, None, @@ -126,6 +136,7 @@ pub(super) fn state_transition_to_execution_event_for_check_tx_v0<'a, C: CoreRPC let state_transition_action_result = state_transition .transform_into_action( platform, + platform.state.last_block_info(), ValidationMode::CheckTx, &mut state_transition_execution_context, None, @@ -184,6 +195,7 @@ pub(super) fn state_transition_to_execution_event_for_check_tx_v0<'a, C: CoreRPC } else { let state_transition_action_result = state_transition.transform_into_action( platform, + platform.state.last_block_info(), ValidationMode::CheckTx, &mut state_transition_execution_context, None, @@ -255,6 +267,7 @@ pub(super) fn state_transition_to_execution_event_for_check_tx_v0<'a, C: CoreRPC let state_transition_action_result = state_transition.transform_into_action( platform, + platform.state.last_block_info(), ValidationMode::RecheckTx, &mut state_transition_execution_context, None, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/processor/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/processor/mod.rs index 58b133813b..339e5d1b1f 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/processor/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/processor/mod.rs @@ -5,6 +5,7 @@ use crate::error::Error; use crate::execution::types::execution_event::ExecutionEvent; use crate::platform_types::platform::PlatformRef; use crate::rpc::core::CoreRPCLike; +use dpp::block::block_info::BlockInfo; use dpp::prelude::ConsensusValidationResult; use dpp::state_transition::StateTransition; @@ -25,6 +26,7 @@ use drive::grovedb::TransactionArg; /// pub(in crate::execution) fn process_state_transition<'a, C: CoreRPCLike>( platform: &'a PlatformRef, + block_info: &BlockInfo, state_transition: StateTransition, transaction: TransactionArg, ) -> Result>, Error> { @@ -36,6 +38,7 @@ pub(in crate::execution) fn process_state_transition<'a, C: CoreRPCLike>( { 0 => v0::process_state_transition_v0( platform, + block_info, state_transition, transaction, platform_version, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs index 5a59d37228..acff8bcfbd 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs @@ -26,6 +26,7 @@ use crate::execution::validation::state_transition::ValidationMode; pub(in crate::execution) fn process_state_transition_v0<'a, C: CoreRPCLike>( platform: &'a PlatformRef, + block_info: &BlockInfo, state_transition: StateTransition, transaction: TransactionArg, platform_version: &PlatformVersion, @@ -36,6 +37,7 @@ pub(in crate::execution) fn process_state_transition_v0<'a, C: CoreRPCLike>( let action = if state_transition.requires_state_to_validate_identity_and_signatures() { let state_transition_action_result = state_transition.transform_into_action( platform, + block_info, ValidationMode::Validator, &mut state_transition_execution_context, transaction, @@ -133,6 +135,7 @@ pub(in crate::execution) fn process_state_transition_v0<'a, C: CoreRPCLike>( } else { let state_transition_action_result = state_transition.transform_into_action( platform, + block_info, ValidationMode::Validator, &mut state_transition_execution_context, transaction, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs index 8f6dd60d61..c4e8a24799 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs @@ -2,6 +2,7 @@ mod basic_structure; mod identity_nonce; mod state; +use dpp::block::block_info::BlockInfo; use dpp::prelude::ConsensusValidationResult; use dpp::state_transition::data_contract_create_transition::DataContractCreateTransition; use dpp::validation::SimpleConsensusValidationResult; @@ -40,6 +41,7 @@ impl StateTransitionActionTransformerV0 for DataContractCreateTransition { fn transform_into_action( &self, platform: &PlatformRef, + _block_info: &BlockInfo, validation_mode: ValidationMode, _execution_context: &mut StateTransitionExecutionContext, _tx: TransactionArg, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs index f9b98831dc..4b058bc7d3 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs @@ -1,6 +1,7 @@ mod identity_contract_nonce; mod state; +use dpp::block::block_info::BlockInfo; use dpp::state_transition::data_contract_update_transition::DataContractUpdateTransition; use dpp::validation::ConsensusValidationResult; @@ -23,6 +24,7 @@ impl StateTransitionActionTransformerV0 for DataContractUpdateTransition { fn transform_into_action( &self, platform: &PlatformRef, + _block_info: &BlockInfo, validation_mode: ValidationMode, _execution_context: &mut StateTransitionExecutionContext, _tx: TransactionArg, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/mod.rs index 1d287f1095..78cc9ccc27 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/mod.rs @@ -15,7 +15,6 @@ mod structure_v0; pub trait DocumentCreateTransitionActionValidation { fn validate_structure( &self, - platform: &PlatformStateRef, platform_version: &PlatformVersion, ) -> Result; @@ -31,7 +30,6 @@ pub trait DocumentCreateTransitionActionValidation { impl DocumentCreateTransitionActionValidation for DocumentCreateTransitionAction { fn validate_structure( &self, - platform: &PlatformStateRef, platform_version: &PlatformVersion, ) -> Result { match platform_version @@ -41,7 +39,7 @@ impl DocumentCreateTransitionActionValidation for DocumentCreateTransitionAction .documents_batch_state_transition .document_create_transition_structure_validation { - 0 => self.validate_structure_v0(platform, platform_version), + 0 => self.validate_structure_v0(platform_version), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "DocumentCreateTransitionAction::validate_structure".to_string(), known_versions: vec![0], diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/structure_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/structure_v0/mod.rs index be05c9bd56..bda10d4b2c 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/structure_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/structure_v0/mod.rs @@ -1,34 +1,21 @@ -use dpp::consensus::basic::document::{InvalidDocumentTypeError, MissingDocumentTypeError}; -use dpp::consensus::ConsensusError; -use dpp::consensus::state::document::document_timestamp_window_violation_error::DocumentTimestampWindowViolationError; -use dpp::consensus::state::document::document_timestamps_mismatch_error::DocumentTimestampsMismatchError; -use dpp::consensus::state::state_error::StateError; +use dpp::consensus::basic::document::InvalidDocumentTypeError; use dpp::data_contract::accessors::v0::DataContractV0Getters; -use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::data_contract::validation::DataContractValidationMethodsV0; -use dpp::document::extended_document::property_names; -use dpp::identity::TimestampMillis; -use dpp::ProtocolError; use dpp::validation::{SimpleConsensusValidationResult}; -use dpp::validation::block_time_window::validate_time_in_block_time_window::validate_time_in_block_time_window; use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; use drive::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::{DocumentCreateTransitionAction, DocumentCreateTransitionActionAccessorsV0}; use dpp::version::PlatformVersion; use crate::error::Error; -use crate::platform_types::platform::PlatformStateRef; -use crate::platform_types::platform_state::v0::PlatformStateV0Methods; pub(super) trait DocumentCreateTransitionActionStructureValidationV0 { fn validate_structure_v0( &self, - platform: &PlatformStateRef, platform_version: &PlatformVersion, ) -> Result; } impl DocumentCreateTransitionActionStructureValidationV0 for DocumentCreateTransitionAction { fn validate_structure_v0( &self, - platform: &PlatformStateRef, platform_version: &PlatformVersion, ) -> Result { let contract_fetch_info = self.base().data_contract_fetch_info(); @@ -36,75 +23,16 @@ impl DocumentCreateTransitionActionStructureValidationV0 for DocumentCreateTrans // Make sure that the document type is defined in the contract let document_type_name = self.base().document_type_name(); - let Some(document_type) = data_contract.document_type_optional_for_name(document_type_name) - else { + if data_contract + .document_type_optional_for_name(document_type_name) + .is_none() + { return Ok(SimpleConsensusValidationResult::new_with_error( InvalidDocumentTypeError::new(document_type_name.clone(), data_contract.id()) .into(), )); }; - // Make sure that timestamps are present if required - let required_fields = document_type.required_fields(); - - if required_fields.contains(property_names::CREATED_AT) && self.created_at().is_none() { - // TODO: Create a special consensus error for this - return Ok(SimpleConsensusValidationResult::new_with_error( - MissingDocumentTypeError::new().into(), - )); - } - - if required_fields.contains(property_names::UPDATED_AT) && self.updated_at().is_none() { - // TODO: Create a special consensus error for this - return Ok(SimpleConsensusValidationResult::new_with_error( - MissingDocumentTypeError::new().into(), - )); - } - - if self.created_at().is_some() - && self.updated_at().is_some() - && self.created_at() != self.updated_at() - { - return Ok(SimpleConsensusValidationResult::new_with_error( - DocumentTimestampsMismatchError::new(self.base().id()).into(), - )); - } - - let validation_result = check_if_timestamps_are_equal(self); - if !validation_result.is_valid() { - return Ok(validation_result); - } - - // Validate timestamps against block time - // we do validation here but not in validate state because it's a cheap validation - // and validate state implements expensive validation only - let latest_block_time_ms = platform.state.last_committed_block_time_ms(); - let average_block_spacing_ms = platform.config.block_spacing_ms; - - // We do not need to perform these checks on genesis - if let Some(latest_block_time_ms) = latest_block_time_ms { - let validation_result = check_created_inside_time_window( - self, - latest_block_time_ms, - average_block_spacing_ms, - platform_version, - )?; - if !validation_result.is_valid() { - return Ok(validation_result); - } - - let validation_result = check_updated_inside_time_window( - self, - latest_block_time_ms, - average_block_spacing_ms, - platform_version, - )?; - - if !validation_result.is_valid() { - return Ok(validation_result); - } - } - // Validate user defined properties data_contract @@ -112,91 +40,3 @@ impl DocumentCreateTransitionActionStructureValidationV0 for DocumentCreateTrans .map_err(Error::Protocol) } } - -fn check_if_timestamps_are_equal( - document_transition: &DocumentCreateTransitionAction, -) -> SimpleConsensusValidationResult { - let mut result = SimpleConsensusValidationResult::default(); - let created_at = document_transition.created_at(); - let updated_at = document_transition.updated_at(); - - if created_at.is_some() && updated_at.is_some() && updated_at.unwrap() != created_at.unwrap() { - result.add_error(ConsensusError::StateError( - StateError::DocumentTimestampsMismatchError(DocumentTimestampsMismatchError::new( - document_transition.base().id(), - )), - )); - } - - result -} - -fn check_created_inside_time_window( - document_transition: &DocumentCreateTransitionAction, - last_block_ts_millis: TimestampMillis, - average_block_spacing_ms: u64, - platform_version: &PlatformVersion, -) -> Result { - let mut result = SimpleConsensusValidationResult::default(); - let created_at = match document_transition.created_at() { - Some(t) => t, - None => return Ok(result), - }; - - let window_validation = validate_time_in_block_time_window( - last_block_ts_millis, - created_at, - average_block_spacing_ms, - platform_version, - ) - .map_err(|e| Error::Protocol(ProtocolError::NonConsensusError(e)))?; - if !window_validation.valid { - result.add_error(ConsensusError::StateError( - StateError::DocumentTimestampWindowViolationError( - DocumentTimestampWindowViolationError::new( - String::from("createdAt"), - document_transition.base().id(), - created_at as i64, - window_validation.time_window_start as i64, - window_validation.time_window_end as i64, - ), - ), - )); - } - Ok(result) -} - -fn check_updated_inside_time_window( - document_transition: &DocumentCreateTransitionAction, - last_block_ts_millis: TimestampMillis, - average_block_spacing_ms: u64, - platform_version: &PlatformVersion, -) -> Result { - let mut result = SimpleConsensusValidationResult::default(); - let updated_at = match document_transition.updated_at() { - Some(t) => t, - None => return Ok(result), - }; - - let window_validation = validate_time_in_block_time_window( - last_block_ts_millis, - updated_at, - average_block_spacing_ms, - platform_version, - ) - .map_err(|e| Error::Protocol(ProtocolError::NonConsensusError(e)))?; - if !window_validation.valid { - result.add_error(ConsensusError::StateError( - StateError::DocumentTimestampWindowViolationError( - DocumentTimestampWindowViolationError::new( - String::from("updatedAt"), - document_transition.base().id(), - updated_at as i64, - window_validation.time_window_start as i64, - window_validation.time_window_end as i64, - ), - ), - )); - } - Ok(result) -} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/mod.rs index 1ac0639b8f..42b5ea4c7c 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/mod.rs @@ -16,7 +16,6 @@ mod structure_v0; pub trait DocumentReplaceTransitionActionValidation { fn validate_structure( &self, - platform: &PlatformStateRef, platform_version: &PlatformVersion, ) -> Result; @@ -32,7 +31,6 @@ pub trait DocumentReplaceTransitionActionValidation { impl DocumentReplaceTransitionActionValidation for DocumentReplaceTransitionAction { fn validate_structure( &self, - platform: &PlatformStateRef, platform_version: &PlatformVersion, ) -> Result { match platform_version @@ -42,7 +40,7 @@ impl DocumentReplaceTransitionActionValidation for DocumentReplaceTransitionActi .documents_batch_state_transition .document_replace_transition_structure_validation { - 0 => self.validate_structure_v0(platform, platform_version), + 0 => self.validate_structure_v0(platform_version), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "DocumentReplaceTransitionAction::validate_structure".to_string(), known_versions: vec![0], diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/structure_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/structure_v0/mod.rs index 8d3bee2f76..92807f5bdc 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/structure_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/structure_v0/mod.rs @@ -1,34 +1,21 @@ -use dpp::consensus::basic::document::{InvalidDocumentTypeError, MissingDocumentTypeError}; -use dpp::consensus::state::document::document_timestamp_window_violation_error::DocumentTimestampWindowViolationError; -use dpp::consensus::ConsensusError; - -use dpp::consensus::state::state_error::StateError; +use dpp::consensus::basic::document::InvalidDocumentTypeError; use dpp::data_contract::accessors::v0::DataContractV0Getters; -use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::data_contract::validation::DataContractValidationMethodsV0; -use dpp::document::extended_document::property_names; -use dpp::identity::TimestampMillis; -use dpp::ProtocolError; -use dpp::validation::block_time_window::validate_time_in_block_time_window::validate_time_in_block_time_window; use dpp::validation::SimpleConsensusValidationResult; use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; use drive::state_transition_action::document::documents_batch::document_transition::document_replace_transition_action::{DocumentReplaceTransitionAction, DocumentReplaceTransitionActionAccessorsV0}; use dpp::version::PlatformVersion; use crate::error::Error; -use crate::platform_types::platform::PlatformStateRef; -use crate::platform_types::platform_state::v0::PlatformStateV0Methods; pub(super) trait DocumentReplaceTransitionActionStructureValidationV0 { fn validate_structure_v0( &self, - platform: &PlatformStateRef, platform_version: &PlatformVersion, ) -> Result; } impl DocumentReplaceTransitionActionStructureValidationV0 for DocumentReplaceTransitionAction { fn validate_structure_v0( &self, - platform: &PlatformStateRef, platform_version: &PlatformVersion, ) -> Result { let contract_fetch_info = self.base().data_contract_fetch_info(); @@ -36,41 +23,14 @@ impl DocumentReplaceTransitionActionStructureValidationV0 for DocumentReplaceTra let document_type_name = self.base().document_type_name(); // Make sure that the document type is defined in the contract - let Some(document_type) = data_contract.document_type_optional_for_name(document_type_name) - else { + if data_contract + .document_type_optional_for_name(document_type_name) + .is_none() + { return Ok(SimpleConsensusValidationResult::new_with_error( InvalidDocumentTypeError::new(document_type_name.clone(), data_contract.id()) .into(), )); - }; - - // Make sure that timestamps are present if required - let required_fields = document_type.required_fields(); - - if required_fields.contains(property_names::UPDATED_AT) && self.updated_at().is_none() { - // TODO: Create a special consensus error for this - return Ok(SimpleConsensusValidationResult::new_with_error( - MissingDocumentTypeError::new().into(), - )); - } - - // Validate timestamps against block time - // we do validation here but not in validate state because it's a cheap validation - // and validate state implements expensive validation only - let latest_block_time_ms = platform.state.last_committed_block_time_ms(); - let average_block_spacing_ms = platform.config.block_spacing_ms; - - if let Some(latest_block_time_ms) = latest_block_time_ms { - let validation_result = check_updated_inside_time_window( - self, - latest_block_time_ms, - average_block_spacing_ms, - platform_version, - )?; - - if !validation_result.is_valid() { - return Ok(validation_result); - } } // Validate user defined properties @@ -80,38 +40,3 @@ impl DocumentReplaceTransitionActionStructureValidationV0 for DocumentReplaceTra .map_err(Error::Protocol) } } - -fn check_updated_inside_time_window( - document_transition: &DocumentReplaceTransitionAction, - last_block_ts_millis: TimestampMillis, - average_block_spacing_ms: u64, - platform_version: &PlatformVersion, -) -> Result { - let mut result = SimpleConsensusValidationResult::default(); - let updated_at = match document_transition.updated_at() { - Some(t) => t, - None => return Ok(result), - }; - - let window_validation = validate_time_in_block_time_window( - last_block_ts_millis, - updated_at, - average_block_spacing_ms, - platform_version, - ) - .map_err(|e| Error::Protocol(ProtocolError::NonConsensusError(e)))?; - if !window_validation.valid { - result.add_error(ConsensusError::StateError( - StateError::DocumentTimestampWindowViolationError( - DocumentTimestampWindowViolationError::new( - String::from("updatedAt"), - document_transition.base().id(), - updated_at as i64, - window_validation.time_window_start as i64, - window_validation.time_window_end as i64, - ), - ), - )); - } - Ok(result) -} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/v0/mod.rs index ba72d4989e..53ff2d122a 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/v0/mod.rs @@ -19,13 +19,11 @@ use crate::execution::validation::state_transition::state_transitions::documents use crate::execution::validation::state_transition::state_transitions::documents_batch::action_validation::document_create_transition_action::DocumentCreateTransitionActionValidation; use dpp::state_transition::documents_batch_transition::document_create_transition::v0::v0_methods::DocumentCreateTransitionV0Methods; use crate::error::execution::ExecutionError; -use crate::platform_types::platform::PlatformStateRef; pub(in crate::execution::validation::state_transition::state_transitions::documents_batch) trait DocumentsBatchStateTransitionStructureValidationV0 { fn validate_advanced_structure_from_state_v0( &self, - platform: &PlatformStateRef, action: &DocumentsBatchTransitionAction, platform_version: &PlatformVersion, ) -> Result; @@ -34,7 +32,6 @@ pub(in crate::execution::validation::state_transition::state_transitions::docume impl DocumentsBatchStateTransitionStructureValidationV0 for DocumentsBatchTransition { fn validate_advanced_structure_from_state_v0( &self, - platform: &PlatformStateRef, action: &DocumentsBatchTransitionAction, platform_version: &PlatformVersion, ) -> Result { @@ -62,13 +59,13 @@ impl DocumentsBatchStateTransitionStructureValidationV0 for DocumentsBatchTransi for transition in action.transitions() { match transition { DocumentTransitionAction::CreateAction(create_action) => { - let result = create_action.validate_structure(platform, platform_version)?; + let result = create_action.validate_structure(platform_version)?; if !result.is_valid() { return Ok(result); } } DocumentTransitionAction::ReplaceAction(replace_action) => { - let result = replace_action.validate_structure(platform, platform_version)?; + let result = replace_action.validate_structure(platform_version)?; if !result.is_valid() { return Ok(result); } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/v0/mod.rs index 4ee5096db7..456a6d898c 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/v0/mod.rs @@ -223,7 +223,7 @@ mod test { }; let result = create_contact_request_data_trigger( - &DocumentCreateTransitionAction::from_document_borrowed_create_transition_with_contract_lookup(document_create_transition, |_identifier| { + &DocumentCreateTransitionAction::from_document_borrowed_create_transition_with_contract_lookup(document_create_transition, &BlockInfo::default(), |_identifier| { Ok(Arc::new(DataContractFetchInfo::dashpay_contract_fixture(protocol_version))) }).expect("expected to create action").into(), &data_trigger_context, @@ -334,7 +334,7 @@ mod test { let _dashpay_identity_id = data_trigger_context.owner_id.to_owned(); let result = create_contact_request_data_trigger( - &DocumentCreateTransitionAction::from_document_borrowed_create_transition_with_contract_lookup(document_create_transition, |_identifier| { + &DocumentCreateTransitionAction::from_document_borrowed_create_transition_with_contract_lookup(document_create_transition, &BlockInfo::default(), |_identifier| { Ok(Arc::new(DataContractFetchInfo::dashpay_contract_fixture(protocol_version))) }).expect("expected to create action").into(), &data_trigger_context, @@ -440,7 +440,7 @@ mod test { let _dashpay_identity_id = data_trigger_context.owner_id.to_owned(); let result = create_contact_request_data_trigger( - &DocumentCreateTransitionAction::from_document_borrowed_create_transition_with_contract_lookup(document_create_transition, |_identifier| { + &DocumentCreateTransitionAction::from_document_borrowed_create_transition_with_contract_lookup(document_create_transition, &BlockInfo::default(), |_identifier| { Ok(Arc::new(DataContractFetchInfo::dashpay_contract_fixture(protocol_version))) }).expect("expected to create action").into(), &data_trigger_context, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs index d7a6e9e354..46cf317e90 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs @@ -423,6 +423,7 @@ pub fn create_domain_data_trigger_v0( #[cfg(test)] mod test { use std::sync::Arc; + use dpp::block::block_info::BlockInfo; use dpp::platform_value::Bytes32; use drive::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::DocumentCreateTransitionAction; use drive::state_transition_action::document::documents_batch::document_transition::DocumentTransitionActionType; @@ -500,7 +501,7 @@ mod test { let result = create_domain_data_trigger_v0( &DocumentCreateTransitionAction::from_document_borrowed_create_transition_with_contract_lookup( - document_create_transition,|_identifier| { + document_create_transition, &BlockInfo::default(), |_identifier| { Ok(Arc::new(DataContractFetchInfo::dpns_contract_fixture(platform_version.protocol_version))) }).expect("expected to create action").into(), &data_trigger_context, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs index 67e8c0b349..ebcfdd56d6 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs @@ -47,6 +47,7 @@ impl StateTransitionActionTransformerV0 for DocumentsBatchTransition { fn transform_into_action( &self, platform: &PlatformRef, + block_info: &BlockInfo, validation_mode: ValidationMode, _execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, @@ -60,7 +61,7 @@ impl StateTransitionActionTransformerV0 for DocumentsBatchTransition { .documents_batch_state_transition .transform_into_action { - 0 => self.transform_into_action_v0(&platform.into(), validation_mode, tx), + 0 => self.transform_into_action_v0(&platform.into(), block_info, validation_mode, tx), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "documents batch transition: transform_into_action".to_string(), known_versions: vec![0], @@ -127,7 +128,7 @@ impl StateTransitionNonceValidationV0 for DocumentsBatchTransition { impl StateTransitionStructureKnownInStateValidationV0 for DocumentsBatchTransition { fn validate_advanced_structure_from_state( &self, - platform: &PlatformStateRef, + _platform: &PlatformStateRef, action: &StateTransitionAction, platform_version: &PlatformVersion, ) -> Result { @@ -147,7 +148,6 @@ impl StateTransitionStructureKnownInStateValidationV0 for DocumentsBatchTransiti ))); }; self.validate_advanced_structure_from_state_v0( - platform, documents_batch_transition_action, platform_version, ) diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs index e28e432d64..e3d1bbb2c3 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs @@ -1,3 +1,4 @@ +use dpp::block::block_info::BlockInfo; use dpp::consensus::ConsensusError; use dpp::consensus::state::state_error::StateError; use dpp::prelude::ConsensusValidationResult; @@ -36,6 +37,7 @@ pub(in crate::execution::validation::state_transition::state_transitions::docume fn transform_into_action_v0( &self, platform: &PlatformStateRef, + block_info: &BlockInfo, validation_mode: ValidationMode, tx: TransactionArg, ) -> Result, Error>; @@ -154,6 +156,7 @@ impl DocumentsBatchStateTransitionStateValidationV0 for DocumentsBatchTransition fn transform_into_action_v0( &self, platform: &PlatformStateRef, + block_info: &BlockInfo, validation_mode: ValidationMode, tx: TransactionArg, ) -> Result, Error> { @@ -164,6 +167,7 @@ impl DocumentsBatchStateTransitionStateValidationV0 for DocumentsBatchTransition let validation_result = self.try_into_action_v0( platform, + block_info, validation_mode.should_validate_document_valid_against_state(), tx, &mut execution_context, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs index d64ec65d74..a9c83da52f 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs @@ -14,6 +14,7 @@ use dpp::consensus::state::document::invalid_document_revision_error::InvalidDoc use dpp::consensus::state::state_error::StateError; use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::block::block_info::BlockInfo; use dpp::document::{Document, DocumentV0Getters}; use dpp::validation::SimpleConsensusValidationResult; use dpp::{consensus::ConsensusError, prelude::Identifier, validation::ConsensusValidationResult}; @@ -43,6 +44,7 @@ pub(in crate::execution::validation::state_transition::state_transitions::docume fn try_into_action_v0( &self, platform: &PlatformStateRef, + block_info: &BlockInfo, validate: bool, transaction: TransactionArg, execution_context: &mut StateTransitionExecutionContext, @@ -52,6 +54,7 @@ pub(in crate::execution::validation::state_transition::state_transitions::docume trait DocumentsBatchTransitionInternalTransformerV0 { fn transform_document_transitions_within_contract_v0( platform: &PlatformStateRef, + block_info: &BlockInfo, validate: bool, data_contract_id: &Identifier, owner_id: Identifier, @@ -62,6 +65,7 @@ trait DocumentsBatchTransitionInternalTransformerV0 { ) -> Result>, Error>; fn transform_document_transitions_within_document_type_v0( platform: &PlatformStateRef, + block_info: &BlockInfo, validate: bool, data_contract_fetch_info: Arc, document_type_name: &str, @@ -74,6 +78,7 @@ trait DocumentsBatchTransitionInternalTransformerV0 { /// The data contract can be of multiple difference versions fn transform_transition_v0( validate: bool, + block_info: &BlockInfo, data_contract_fetch_info: Arc, transition: &DocumentTransition, replaced_documents: &[Document], @@ -98,6 +103,7 @@ impl DocumentsBatchTransitionTransformerV0 for DocumentsBatchTransition { fn try_into_action_v0( &self, platform: &PlatformStateRef, + block_info: &BlockInfo, validate_against_state: bool, transaction: TransactionArg, execution_context: &mut StateTransitionExecutionContext, @@ -139,6 +145,7 @@ impl DocumentsBatchTransitionTransformerV0 for DocumentsBatchTransition { |(data_contract_id, document_transitions_by_document_type)| { Self::transform_document_transitions_within_contract_v0( platform, + block_info, validate_against_state, data_contract_id, owner_id, @@ -173,6 +180,7 @@ impl DocumentsBatchTransitionTransformerV0 for DocumentsBatchTransition { impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition { fn transform_document_transitions_within_contract_v0( platform: &PlatformStateRef, + block_info: &BlockInfo, validate_against_state: bool, data_contract_id: &Identifier, owner_id: Identifier, @@ -206,6 +214,7 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition .map(|(document_type_name, document_transitions)| { Self::transform_document_transitions_within_document_type_v0( platform, + block_info, validate_against_state, data_contract_fetch_info.clone(), document_type_name, @@ -223,6 +232,7 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition fn transform_document_transitions_within_document_type_v0( platform: &PlatformStateRef, + block_info: &BlockInfo, validate_against_state: bool, data_contract_fetch_info: Arc, document_type_name: &str, @@ -287,6 +297,7 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition // we validate every transition in this document type Self::transform_transition_v0( validate_against_state, + block_info, data_contract_fetch_info.clone(), transition, &replaced_documents, @@ -322,6 +333,7 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition /// The data contract can be of multiple difference versions fn transform_transition_v0<'a>( validate_against_state: bool, + block_info: &BlockInfo, data_contract_fetch_info: Arc, transition: &DocumentTransition, replaced_documents: &[Document], @@ -331,7 +343,7 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition DocumentTransition::Create(document_create_transition) => { let result = ConsensusValidationResult::::new(); - let document_create_action = DocumentCreateTransitionAction::from_document_borrowed_create_transition_with_contract_lookup(document_create_transition, |_identifier| { + let document_create_action = DocumentCreateTransitionAction::from_document_borrowed_create_transition_with_contract_lookup(document_create_transition, block_info, |_identifier| { Ok(data_contract_fetch_info.clone()) })?; @@ -388,6 +400,7 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition DocumentReplaceTransitionAction::try_from_borrowed_document_replace_transition( document_replace_transition, original_document_created_at, + block_info.time_ms, |_identifier| Ok(data_contract_fetch_info.clone()), )?; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/mod.rs index 43201f4e2f..c9464414b6 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/mod.rs @@ -3,6 +3,7 @@ mod state; mod structure; use crate::error::Error; +use dpp::block::block_info::BlockInfo; use crate::error::execution::ExecutionError; @@ -31,6 +32,7 @@ impl StateTransitionActionTransformerV0 for IdentityCreateTransition { fn transform_into_action( &self, platform: &PlatformRef, + _block_info: &BlockInfo, _validation_mode: ValidationMode, execution_context: &mut StateTransitionExecutionContext, _tx: TransactionArg, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/mod.rs index 5c95785d11..71e641336d 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/mod.rs @@ -3,6 +3,7 @@ mod nonce; mod state; mod structure; +use dpp::block::block_info::BlockInfo; use dpp::state_transition::identity_credit_transfer_transition::IdentityCreditTransferTransition; use dpp::validation::{ConsensusValidationResult, SimpleConsensusValidationResult}; use dpp::version::PlatformVersion; @@ -28,6 +29,7 @@ impl StateTransitionActionTransformerV0 for IdentityCreditTransferTransition { fn transform_into_action( &self, platform: &PlatformRef, + _block_info: &BlockInfo, _validation_mode: ValidationMode, _execution_context: &mut StateTransitionExecutionContext, _tx: TransactionArg, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs index d9a41cb229..8f2cc9ed67 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs @@ -3,6 +3,7 @@ mod nonce; mod state; mod structure; +use dpp::block::block_info::BlockInfo; use dpp::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition; use dpp::validation::{ConsensusValidationResult, SimpleConsensusValidationResult}; use dpp::version::PlatformVersion; @@ -29,6 +30,7 @@ impl StateTransitionActionTransformerV0 for IdentityCreditWithdrawalTransition { fn transform_into_action( &self, platform: &PlatformRef, + _block_info: &BlockInfo, _validation_mode: ValidationMode, _execution_context: &mut StateTransitionExecutionContext, _tx: TransactionArg, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/mod.rs index bdf37ebdc8..62d7e80cd5 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/mod.rs @@ -2,6 +2,7 @@ pub(crate) mod identity_retrieval; mod state; mod structure; +use dpp::block::block_info::BlockInfo; use dpp::state_transition::identity_topup_transition::IdentityTopUpTransition; use dpp::validation::{ConsensusValidationResult, SimpleConsensusValidationResult}; use dpp::version::PlatformVersion; @@ -29,6 +30,7 @@ impl StateTransitionActionTransformerV0 for IdentityTopUpTransition { fn transform_into_action( &self, platform: &PlatformRef, + _block_info: &BlockInfo, _validation_mode: ValidationMode, execution_context: &mut StateTransitionExecutionContext, _tx: TransactionArg, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/mod.rs index 4363faab6f..571f999ea1 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/mod.rs @@ -3,6 +3,7 @@ mod nonce; mod state; mod structure; +use dpp::block::block_info::BlockInfo; use dpp::state_transition::identity_update_transition::IdentityUpdateTransition; use dpp::validation::{ConsensusValidationResult, SimpleConsensusValidationResult}; use dpp::version::PlatformVersion; @@ -30,6 +31,7 @@ impl StateTransitionActionTransformerV0 for IdentityUpdateTransition { fn transform_into_action( &self, platform: &PlatformRef, + _block_info: &BlockInfo, _validation_mode: ValidationMode, _execution_context: &mut StateTransitionExecutionContext, _tx: TransactionArg, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/transformer/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/transformer/mod.rs index 05ca80fc96..616836d4b4 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/transformer/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/transformer/mod.rs @@ -3,6 +3,7 @@ use crate::execution::types::state_transition_execution_context::StateTransition use crate::execution::validation::state_transition::ValidationMode; use crate::platform_types::platform::PlatformRef; use crate::rpc::core::CoreRPCLike; +use dpp::block::block_info::BlockInfo; use dpp::prelude::ConsensusValidationResult; use dpp::state_transition::StateTransition; use drive::grovedb::TransactionArg; @@ -29,6 +30,7 @@ pub trait StateTransitionActionTransformerV0 { fn transform_into_action( &self, platform: &PlatformRef, + block_info: &BlockInfo, validation_mode: ValidationMode, execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, @@ -39,35 +41,68 @@ impl StateTransitionActionTransformerV0 for StateTransition { fn transform_into_action( &self, platform: &PlatformRef, + block_info: &BlockInfo, validation_mode: ValidationMode, execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, ) -> Result, Error> { match self { - StateTransition::DataContractCreate(st) => { - st.transform_into_action(platform, validation_mode, execution_context, tx) - } - StateTransition::DataContractUpdate(st) => { - st.transform_into_action(platform, validation_mode, execution_context, tx) - } - StateTransition::IdentityCreate(st) => { - st.transform_into_action(platform, validation_mode, execution_context, tx) - } - StateTransition::IdentityUpdate(st) => { - st.transform_into_action(platform, validation_mode, execution_context, tx) - } - StateTransition::IdentityTopUp(st) => { - st.transform_into_action(platform, validation_mode, execution_context, tx) - } - StateTransition::IdentityCreditWithdrawal(st) => { - st.transform_into_action(platform, validation_mode, execution_context, tx) - } - StateTransition::DocumentsBatch(st) => { - st.transform_into_action(platform, validation_mode, execution_context, tx) - } - StateTransition::IdentityCreditTransfer(st) => { - st.transform_into_action(platform, validation_mode, execution_context, tx) - } + StateTransition::DataContractCreate(st) => st.transform_into_action( + platform, + block_info, + validation_mode, + execution_context, + tx, + ), + StateTransition::DataContractUpdate(st) => st.transform_into_action( + platform, + block_info, + validation_mode, + execution_context, + tx, + ), + StateTransition::IdentityCreate(st) => st.transform_into_action( + platform, + block_info, + validation_mode, + execution_context, + tx, + ), + StateTransition::IdentityUpdate(st) => st.transform_into_action( + platform, + block_info, + validation_mode, + execution_context, + tx, + ), + StateTransition::IdentityTopUp(st) => st.transform_into_action( + platform, + block_info, + validation_mode, + execution_context, + tx, + ), + StateTransition::IdentityCreditWithdrawal(st) => st.transform_into_action( + platform, + block_info, + validation_mode, + execution_context, + tx, + ), + StateTransition::DocumentsBatch(st) => st.transform_into_action( + platform, + block_info, + validation_mode, + execution_context, + tx, + ), + StateTransition::IdentityCreditTransfer(st) => st.transform_into_action( + platform, + block_info, + validation_mode, + execution_context, + tx, + ), } } } diff --git a/packages/rs-drive-abci/tests/strategy_tests/failures.rs b/packages/rs-drive-abci/tests/strategy_tests/failures.rs index 6a4e58c7fb..ea50c4439c 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/failures.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/failures.rs @@ -1,7 +1,6 @@ #[cfg(test)] mod tests { use crate::execution::run_chain_for_strategy; - use std::collections::{BTreeMap, HashMap}; use strategy_tests::frequency::Frequency; diff --git a/packages/rs-drive-abci/tests/strategy_tests/main.rs b/packages/rs-drive-abci/tests/strategy_tests/main.rs index b7b8c77c55..4bd72e50bf 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/main.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/main.rs @@ -80,12 +80,12 @@ mod tests { use dashcore_rpc::dashcore_rpc_json::{AssetUnlockStatus, ExtendedQuorumDetails}; use dashcore_rpc::json::AssetUnlockStatusResult; use dpp::block::extended_block_info::v0::ExtendedBlockInfoV0Getters; - use strategy_tests::StartIdentities; use std::sync::{Arc, Mutex}; use strategy_tests::operations::DocumentAction::DocumentActionReplace; use strategy_tests::operations::{ DocumentAction, DocumentOp, IdentityUpdateOp, Operation, OperationType, }; + use strategy_tests::StartIdentities; use crate::strategy::CoreHeightIncrease::RandomCoreHeightIncrease; use dpp::dashcore::bls_sig_utils::BLSSignature; @@ -1722,7 +1722,7 @@ mod tests { .unwrap() .unwrap() ), - "af96b62e5b41ff40791e3c909979c4143590873bddddbcc3f781ac644eb688b1".to_string() + "2200b6da58af74075a6280091d94ad13773e3f7847e4e230b5d5398ede9cf8a5".to_string() ) } @@ -1843,7 +1843,7 @@ mod tests { .unwrap() .unwrap() ), - "9aaf2d490aecf00a23dfaf39140ef97a9f239371f5a66b57f9ab15fa38d81fe4".to_string() + "87ea052870576604c828f0675517942942f577dcc6fe51d2aff57b062682c899".to_string() ) } diff --git a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs index 949090e0c7..7adfe29233 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs @@ -547,13 +547,6 @@ impl NetworkStrategy { documents .into_iter() .for_each(|(document, identity, entropy)| { - let updated_at = - if document_type.required_fields().contains("$updatedAt") { - document.created_at() - } else { - None - }; - let identity_contract_nonce = contract_nonce_counter .entry((identity.id(), contract.id())) .or_default(); @@ -575,8 +568,6 @@ impl NetworkStrategy { } .into(), entropy: entropy.to_buffer(), - created_at: document.created_at(), - updated_at, data: document.properties_consumed(), } .into(); @@ -668,12 +659,6 @@ impl NetworkStrategy { document .properties_mut() .append(&mut specific_document_key_value_pairs.clone()); - let updated_at = - if document_type.required_fields().contains("$updatedAt") { - document.created_at() - } else { - None - }; let identity_contract_nonce = contract_nonce_counter .entry((identity.id(), contract.id())) @@ -690,8 +675,6 @@ impl NetworkStrategy { } .into(), entropy: entropy.to_buffer(), - created_at: document.created_at(), - updated_at, data: document.properties_consumed(), } .into(); @@ -891,7 +874,6 @@ impl NetworkStrategy { .revision() .expect("expected to unwrap revision") + 1, - updated_at: Some(block_info.time_ms), data: random_new_document.properties_consumed(), } .into(); diff --git a/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs b/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs index 05226c1a61..749e1ce0d0 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs @@ -60,6 +60,7 @@ pub(crate) fn verify_state_transitions_were_or_were_not_executed( let consensus_validation_result = match state_transition.transform_into_action( &platform, + abci_app.platform.state.load().last_block_info(), ValidationMode::CheckTx, //using check_tx so we don't validate state &mut execution_context, None, diff --git a/packages/rs-drive-proof-verifier/src/proof.rs b/packages/rs-drive-proof-verifier/src/proof.rs index c568c21560..a29702445a 100644 --- a/packages/rs-drive-proof-verifier/src/proof.rs +++ b/packages/rs-drive-proof-verifier/src/proof.rs @@ -812,6 +812,7 @@ impl FromProof for StateTransitionPro let (root_hash, result) = Drive::verify_state_transition_was_executed_with_proof( &state_transition, + mtd.time_ms, &proof.grovedb_proof, &known_contracts_provider_fn, platform_version, diff --git a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/v0/mod.rs b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/v0/mod.rs index f0a5a72c86..5d4faad553 100644 --- a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/v0/mod.rs @@ -35,7 +35,7 @@ impl Drive { document_id: document_create_transition.base().id(), allow_original: false, created_at: document_create_transition.created_at(), - updated_at: document_create_transition.updated_at(), + updated_at: document_create_transition.created_at(), data: document_create_transition.data(), }; self.validate_uniqueness_of_data(request, transaction, platform_version) diff --git a/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/mod.rs b/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/mod.rs index 7adb5fb5f5..f1bdffe673 100644 --- a/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/mod.rs +++ b/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/mod.rs @@ -6,10 +6,12 @@ use crate::error::drive::DriveError; use crate::error::Error; use dpp::data_contract::DataContract; use dpp::identifier::Identifier; +use dpp::identity::TimestampMillis; use dpp::state_transition::proof_result::StateTransitionProofResult; use dpp::state_transition::StateTransition; use dpp::version::PlatformVersion; use std::sync::Arc; + mod v0; impl Drive { @@ -42,6 +44,7 @@ impl Drive { /// pub fn verify_state_transition_was_executed_with_proof( state_transition: &StateTransition, + block_time: TimestampMillis, proof: &[u8], known_contracts_provider_fn: &impl Fn(&Identifier) -> Result>, Error>, platform_version: &PlatformVersion, @@ -55,6 +58,7 @@ impl Drive { { 0 => Drive::verify_state_transition_was_executed_with_proof_v0( state_transition, + block_time, proof, known_contracts_provider_fn, platform_version, diff --git a/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs b/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs index 547aea015d..4cdcdc9b03 100644 --- a/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs +++ b/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs @@ -3,8 +3,9 @@ use std::sync::Arc; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::data_contract::serialized_version::DataContractInSerializationFormat; -use dpp::document::{Document, DocumentV0Getters}; -use dpp::identity::PartialIdentity; +use dpp::document::{Document, DocumentV0Getters, property_names}; +use dpp::document::document_methods::DocumentMethodsV0; +use dpp::identity::{PartialIdentity, TimestampMillis}; use dpp::prelude::{DataContract, Identifier}; use dpp::state_transition::data_contract_create_transition::accessors::DataContractCreateTransitionAccessorsV0; use dpp::state_transition::data_contract_update_transition::accessors::DataContractUpdateTransitionAccessorsV0; @@ -36,6 +37,7 @@ use crate::query::SingleDocumentDriveQuery; impl Drive { pub(super) fn verify_state_transition_was_executed_with_proof_v0( state_transition: &StateTransition, + block_time: TimestampMillis, proof: &[u8], known_contracts_provider_fn: &impl Fn(&Identifier) -> Result>, Error>, platform_version: &PlatformVersion, @@ -121,15 +123,26 @@ impl Drive { match transition { DocumentTransition::Create(create_transition) => { let document = document.ok_or(Error::Proof(ProofError::IncorrectProof(format!("proof did not contain document with id {} expected to exist because of state transition (create)", create_transition.base().id()))))?; + let requires_created_at = document_type + .required_fields() + .contains(property_names::CREATED_AT); + let requires_updated_at = document_type + .required_fields() + .contains(property_names::UPDATED_AT); let expected_document = Document::try_from_create_transition( create_transition, documents_batch_transition.owner_id(), + block_time, + requires_created_at, + requires_updated_at, &contract, platform_version, )?; - if document != expected_document { - return Err(Error::Proof(ProofError::IncorrectProof(format!("proof of state transition execution did not contain exact expected document after create with id {}", create_transition.base().id())))); + if !document + .is_equal_ignoring_timestamps(&expected_document, platform_version)? + { + return Err(Error::Proof(ProofError::IncorrectProof(format!("proof of state transition execution did not contain expected document (time fields were not checked) after create with id {}", create_transition.base().id())))); } Ok(( root_hash, @@ -138,10 +151,15 @@ impl Drive { } DocumentTransition::Replace(replace_transition) => { let document = document.ok_or(Error::Proof(ProofError::IncorrectProof(format!("proof did not contain document with id {} expected to exist because of state transition (replace)", replace_transition.base().id()))))?; + let requires_updated_at = document_type + .required_fields() + .contains(property_names::UPDATED_AT); let expected_document = Document::try_from_replace_transition( replace_transition, documents_batch_transition.owner_id(), document.created_at(), //we can trust the created at (as we don't care) + block_time, + requires_updated_at, platform_version, )?; diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_base_transition_action/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_base_transition_action/mod.rs index 0dff481b01..39e40d8501 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_base_transition_action/mod.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_base_transition_action/mod.rs @@ -2,7 +2,9 @@ use derive_more::From; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::platform_value::Identifier; +use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::prelude::IdentityNonce; +use dpp::ProtocolError; use std::sync::Arc; /// transformer module @@ -27,6 +29,15 @@ impl DocumentBaseTransitionActionAccessorsV0 for DocumentBaseTransitionAction { } } + fn document_type_field_is_required(&self, field: &str) -> Result { + Ok(self + .data_contract_fetch_info() + .contract + .document_type_for_name(self.document_type_name())? + .required_fields() + .contains(field)) + } + fn document_type_name(&self) -> &String { match self { DocumentBaseTransitionAction::V0(v0) => &v0.document_type_name, diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_base_transition_action/v0/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_base_transition_action/v0/mod.rs index c3064f2425..89d5c0ac4e 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_base_transition_action/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_base_transition_action/v0/mod.rs @@ -5,6 +5,7 @@ use std::sync::Arc; use dpp::identifier::Identifier; use dpp::prelude::IdentityNonce; +use dpp::ProtocolError; use crate::drive::contract::DataContractFetchInfo; @@ -25,6 +26,10 @@ pub struct DocumentBaseTransitionActionV0 { pub trait DocumentBaseTransitionActionAccessorsV0 { /// The document Id fn id(&self) -> Identifier; + + /// Is a field required on the document type? + fn document_type_field_is_required(&self, field: &str) -> Result; + /// Name of document type found int the data contract associated with the `data_contract_id` fn document_type_name(&self) -> &String; /// document type name owned diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/mod.rs index b535ae50a9..4438bbc17c 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/mod.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/mod.rs @@ -42,12 +42,6 @@ impl DocumentCreateTransitionActionAccessorsV0 for DocumentCreateTransitionActio } } - fn updated_at(&self) -> Option { - match self { - DocumentCreateTransitionAction::V0(v0) => v0.updated_at, - } - } - fn data(&self) -> &BTreeMap { match self { DocumentCreateTransitionAction::V0(v0) => &v0.data, diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/transformer.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/transformer.rs index 829d5fbc7e..6933d82685 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/transformer.rs @@ -1,3 +1,4 @@ +use dpp::block::block_info::BlockInfo; use dpp::platform_value::Identifier; use std::sync::Arc; @@ -10,20 +11,22 @@ impl DocumentCreateTransitionAction { /// from_document_create_transition_with_contract_lookup pub fn from_document_create_transition_with_contract_lookup( value: DocumentCreateTransition, + block_info: &BlockInfo, get_data_contract: impl Fn(Identifier) -> Result, ProtocolError>, ) -> Result { match value { - DocumentCreateTransition::V0(v0) => Ok(DocumentCreateTransitionActionV0::try_from_document_create_transition_with_contract_lookup(v0, get_data_contract)?.into()), + DocumentCreateTransition::V0(v0) => Ok(DocumentCreateTransitionActionV0::try_from_document_create_transition_with_contract_lookup(v0, block_info, get_data_contract)?.into()), } } /// from_document_borrowed_create_transition_with_contract_lookup pub fn from_document_borrowed_create_transition_with_contract_lookup( value: &DocumentCreateTransition, + block_info: &BlockInfo, get_data_contract: impl Fn(Identifier) -> Result, ProtocolError>, ) -> Result { match value { - DocumentCreateTransition::V0(v0) => Ok(DocumentCreateTransitionActionV0::try_from_borrowed_document_create_transition_with_contract_lookup(v0, get_data_contract)?.into()), + DocumentCreateTransition::V0(v0) => Ok(DocumentCreateTransitionActionV0::try_from_borrowed_document_create_transition_with_contract_lookup(v0, block_info, get_data_contract)?.into()), } } } diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/mod.rs index 74a0ee61bc..44d4e812b0 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/mod.rs @@ -21,9 +21,6 @@ pub struct DocumentCreateTransitionActionV0 { pub base: DocumentBaseTransitionAction, /// The creation time of the document pub created_at: Option, - //todo: remove updated_at - /// The time the document was last updated - pub updated_at: Option, /// Document properties pub data: BTreeMap, } @@ -36,8 +33,6 @@ pub trait DocumentCreateTransitionActionAccessorsV0 { fn base_owned(self) -> DocumentBaseTransitionAction; /// created at fn created_at(&self) -> Option; - /// updated at - fn updated_at(&self) -> Option; /// data fn data(&self) -> &BTreeMap; /// data mut @@ -93,7 +88,6 @@ impl DocumentFromCreateTransitionActionV0 for Document { let DocumentCreateTransitionActionV0 { base, created_at, - updated_at, data, } = v0; @@ -121,7 +115,7 @@ impl DocumentFromCreateTransitionActionV0 for Document { properties: data.clone(), revision: document_type.initial_revision(), created_at: *created_at, - updated_at: *updated_at, + updated_at: *created_at, } .into()), version => Err(ProtocolError::UnknownVersionMismatch { @@ -142,7 +136,6 @@ impl DocumentFromCreateTransitionActionV0 for Document { let DocumentCreateTransitionActionV0 { base, created_at, - updated_at, data, } = v0; @@ -170,7 +163,7 @@ impl DocumentFromCreateTransitionActionV0 for Document { properties: data, revision: document_type.initial_revision(), created_at, - updated_at, + updated_at: created_at, } .into()), version => Err(ProtocolError::UnknownVersionMismatch { diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/transformer.rs index fa3ceea3ff..68abb06b75 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/transformer.rs @@ -1,55 +1,60 @@ +use dpp::block::block_info::BlockInfo; +use dpp::document::property_names; use dpp::platform_value::Identifier; use std::sync::Arc; use dpp::ProtocolError; use dpp::state_transition::documents_batch_transition::document_create_transition::v0::DocumentCreateTransitionV0; use crate::drive::contract::DataContractFetchInfo; -use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionAction; +use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::{DocumentBaseTransitionAction, DocumentBaseTransitionActionAccessorsV0}; use crate::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::DocumentCreateTransitionActionV0; impl DocumentCreateTransitionActionV0 { /// try from document create transition with contract lookup pub fn try_from_document_create_transition_with_contract_lookup( value: DocumentCreateTransitionV0, + block_info: &BlockInfo, get_data_contract: impl Fn(Identifier) -> Result, ProtocolError>, ) -> Result { - let DocumentCreateTransitionV0 { + let DocumentCreateTransitionV0 { base, data, .. } = value; + let base = DocumentBaseTransitionAction::from_base_transition_with_contract_lookup( base, - created_at, - updated_at, - data, - .. - } = value; + get_data_contract, + )?; + let created_at = if base.document_type_field_is_required(property_names::CREATED_AT)? { + Some(block_info.time_ms) + } else { + None + }; + Ok(DocumentCreateTransitionActionV0 { - base: DocumentBaseTransitionAction::from_base_transition_with_contract_lookup( - base, - get_data_contract, - )?, + base, created_at, - updated_at, data, }) } - /// try from ... + /// try from borrowed document create transition with contract lookup pub fn try_from_borrowed_document_create_transition_with_contract_lookup( value: &DocumentCreateTransitionV0, + block_info: &BlockInfo, get_data_contract: impl Fn(Identifier) -> Result, ProtocolError>, ) -> Result { - let DocumentCreateTransitionV0 { - base, - created_at, - updated_at, - data, - .. - } = value; - Ok(DocumentCreateTransitionActionV0 { - base: DocumentBaseTransitionAction::from_borrowed_base_transition_with_contract_lookup( + let DocumentCreateTransitionV0 { base, data, .. } = value; + let base = + DocumentBaseTransitionAction::from_borrowed_base_transition_with_contract_lookup( base, get_data_contract, - )?, - created_at: *created_at, - updated_at: *updated_at, + )?; + let created_at = if base.document_type_field_is_required(property_names::CREATED_AT)? { + Some(block_info.time_ms) + } else { + None + }; + + Ok(DocumentCreateTransitionActionV0 { + base, + created_at, //todo: get rid of clone data: data.clone(), }) diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/transformer.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/transformer.rs index 81f3d42475..3107fcefc6 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/transformer.rs @@ -12,6 +12,7 @@ impl DocumentReplaceTransitionAction { pub fn try_from_borrowed_document_replace_transition( document_replace_transition: &DocumentReplaceTransition, originally_created_at: Option, + block_time_ms: TimestampMillis, get_data_contract: impl Fn(Identifier) -> Result, ProtocolError>, ) -> Result { match document_replace_transition { @@ -19,6 +20,7 @@ impl DocumentReplaceTransitionAction { DocumentReplaceTransitionActionV0::try_from_borrowed_document_replace_transition( v0, originally_created_at, + block_time_ms, get_data_contract, )? .into(), diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/v0/transformer.rs index 55681111fe..ec7190048a 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/v0/transformer.rs @@ -1,3 +1,4 @@ +use dpp::document::property_names; use dpp::platform_value::Identifier; use std::sync::Arc; @@ -6,31 +7,38 @@ use dpp::ProtocolError; use dpp::state_transition::documents_batch_transition::document_transition::document_replace_transition::DocumentReplaceTransitionV0; use crate::drive::contract::DataContractFetchInfo; use crate::state_transition_action::document::documents_batch::document_transition::document_replace_transition_action::v0::DocumentReplaceTransitionActionV0; -use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionAction; +use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::{DocumentBaseTransitionAction, DocumentBaseTransitionActionAccessorsV0}; impl DocumentReplaceTransitionActionV0 { /// try from borrowed pub fn try_from_borrowed_document_replace_transition( document_replace_transition: &DocumentReplaceTransitionV0, originally_created_at: Option, + block_time_ms: TimestampMillis, get_data_contract: impl Fn(Identifier) -> Result, ProtocolError>, ) -> Result { let DocumentReplaceTransitionV0 { base, revision, - updated_at, data, .. } = document_replace_transition; - Ok(DocumentReplaceTransitionActionV0 { - base: DocumentBaseTransitionAction::from_borrowed_base_transition_with_contract_lookup( + let base = + DocumentBaseTransitionAction::from_borrowed_base_transition_with_contract_lookup( base, get_data_contract, - )?, + )?; + let updated_at = if base.document_type_field_is_required(property_names::UPDATED_AT)? { + Some(block_time_ms) + } else { + None + }; + + Ok(DocumentReplaceTransitionActionV0 { + base, revision: *revision, created_at: originally_created_at, - updated_at: *updated_at, - //todo: remove clone + updated_at, data: data.clone(), }) } diff --git a/packages/rs-platform-version/src/version/dpp_versions.rs b/packages/rs-platform-version/src/version/dpp_versions.rs index 958c7bdc3a..f1af570e6c 100644 --- a/packages/rs-platform-version/src/version/dpp_versions.rs +++ b/packages/rs-platform-version/src/version/dpp_versions.rs @@ -220,6 +220,7 @@ pub struct DocumentVersions { #[derive(Clone, Debug, Default)] pub struct DocumentMethodVersions { + pub is_equal_ignoring_timestamps: FeatureVersion, pub hash: FeatureVersion, pub get_raw_for_contract: FeatureVersion, pub get_raw_for_document_type: FeatureVersion, diff --git a/packages/rs-platform-version/src/version/mocks/v2_test.rs b/packages/rs-platform-version/src/version/mocks/v2_test.rs index 9de7bbd2bf..bb37dfb50b 100644 --- a/packages/rs-platform-version/src/version/mocks/v2_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v2_test.rs @@ -974,6 +974,7 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { default_current_version: 0, }, document_method_versions: DocumentMethodVersions { + is_equal_ignoring_timestamps: 0, hash: 0, get_raw_for_contract: 0, get_raw_for_document_type: 0, diff --git a/packages/rs-platform-version/src/version/mocks/v3_test.rs b/packages/rs-platform-version/src/version/mocks/v3_test.rs index a9eaa473f0..9974e6b528 100644 --- a/packages/rs-platform-version/src/version/mocks/v3_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v3_test.rs @@ -974,6 +974,7 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { default_current_version: 0, }, document_method_versions: DocumentMethodVersions { + is_equal_ignoring_timestamps: 0, hash: 0, get_raw_for_contract: 0, get_raw_for_document_type: 0, diff --git a/packages/rs-platform-version/src/version/v1.rs b/packages/rs-platform-version/src/version/v1.rs index 24de1e3570..c4d6d59a0c 100644 --- a/packages/rs-platform-version/src/version/v1.rs +++ b/packages/rs-platform-version/src/version/v1.rs @@ -971,6 +971,7 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { default_current_version: 0, }, document_method_versions: DocumentMethodVersions { + is_equal_ignoring_timestamps: 0, hash: 0, get_raw_for_contract: 0, get_raw_for_document_type: 0, diff --git a/packages/rs-sdk/src/platform/transition/broadcast.rs b/packages/rs-sdk/src/platform/transition/broadcast.rs index b3c04895c4..01c196055c 100644 --- a/packages/rs-sdk/src/platform/transition/broadcast.rs +++ b/packages/rs-sdk/src/platform/transition/broadcast.rs @@ -44,10 +44,12 @@ impl BroadcastStateTransition for StateTransition { let response = request.execute(sdk, RequestSettings::default()).await?; + let block_time = response.metadata()?.time_ms; let proof = response.proof_owned()?; let (_, result) = Drive::verify_state_transition_was_executed_with_proof( self, + block_time, proof.grovedb_proof.as_slice(), &|_| Ok(None), sdk.version(), diff --git a/packages/rs-sdk/src/platform/transition/put_contract.rs b/packages/rs-sdk/src/platform/transition/put_contract.rs index 9635a47d1d..52e0b9bab1 100644 --- a/packages/rs-sdk/src/platform/transition/put_contract.rs +++ b/packages/rs-sdk/src/platform/transition/put_contract.rs @@ -99,10 +99,13 @@ impl PutContract for DataContract { let response = request.execute(sdk, RequestSettings::default()).await?; + let block_time = response.metadata()?.time_ms; + let proof = response.proof_owned()?; let (_, result) = Drive::verify_state_transition_was_executed_with_proof( &state_transition, + block_time, proof.grovedb_proof.as_slice(), &|_| Ok(None), sdk.version(), diff --git a/packages/rs-sdk/src/platform/transition/put_document.rs b/packages/rs-sdk/src/platform/transition/put_document.rs index 8c9edfd70b..741460df6f 100644 --- a/packages/rs-sdk/src/platform/transition/put_document.rs +++ b/packages/rs-sdk/src/platform/transition/put_document.rs @@ -111,10 +111,13 @@ impl PutDocument for Document { let response = request.execute(sdk, RequestSettings::default()).await?; + let block_time = response.metadata()?.time_ms; + let proof = response.proof_owned()?; let (_, result) = Drive::verify_state_transition_was_executed_with_proof( &state_transition, + block_time, proof.grovedb_proof.as_slice(), &|_| Ok(Some(data_contract.clone())), sdk.version(), diff --git a/packages/rs-sdk/src/platform/transition/put_identity.rs b/packages/rs-sdk/src/platform/transition/put_identity.rs index fe7f9d8913..02b8b35407 100644 --- a/packages/rs-sdk/src/platform/transition/put_identity.rs +++ b/packages/rs-sdk/src/platform/transition/put_identity.rs @@ -96,10 +96,12 @@ impl PutIdentity for Identity { let response = request.execute(sdk, RequestSettings::default()).await?; + let block_time = response.metadata()?.time_ms; let proof = response.proof_owned()?; let (_, result) = Drive::verify_state_transition_was_executed_with_proof( &state_transition, + block_time, proof.grovedb_proof.as_slice(), &|_| Ok(None), sdk.version(), diff --git a/packages/rs-sdk/src/platform/transition/top_up_identity.rs b/packages/rs-sdk/src/platform/transition/top_up_identity.rs index 2aa5eb3b94..a9bcc46fd7 100644 --- a/packages/rs-sdk/src/platform/transition/top_up_identity.rs +++ b/packages/rs-sdk/src/platform/transition/top_up_identity.rs @@ -50,10 +50,13 @@ impl TopUpIdentity for Identity { let response = request.execute(sdk, RequestSettings::default()).await?; + let block_time = response.metadata()?.time_ms; + let proof = response.proof_owned()?; let (_, result) = Drive::verify_state_transition_was_executed_with_proof( &state_transition, + block_time, proof.grovedb_proof.as_slice(), &|_| Ok(None), sdk.version(), diff --git a/packages/rs-sdk/src/platform/transition/withdraw_from_identity.rs b/packages/rs-sdk/src/platform/transition/withdraw_from_identity.rs index 093c182e43..feb45fdf30 100644 --- a/packages/rs-sdk/src/platform/transition/withdraw_from_identity.rs +++ b/packages/rs-sdk/src/platform/transition/withdraw_from_identity.rs @@ -70,10 +70,13 @@ impl WithdrawFromIdentity for Identity { let response = request.execute(sdk, RequestSettings::default()).await?; + let block_time = response.metadata()?.time_ms; + let proof = response.proof_owned()?; let (_, result) = Drive::verify_state_transition_was_executed_with_proof( &state_transition, + block_time, proof.grovedb_proof.as_slice(), &|_| Ok(None), sdk.version(), diff --git a/packages/strategy-tests/src/lib.rs b/packages/strategy-tests/src/lib.rs index c9c942e690..4895144dad 100644 --- a/packages/strategy-tests/src/lib.rs +++ b/packages/strategy-tests/src/lib.rs @@ -331,10 +331,12 @@ impl Strategy { let mut state_transitions = vec![]; // Add start_identities - if block_info.height == config.start_block_height && self.start_identities.number_of_identities > 0 { + if block_info.height == config.start_block_height + && self.start_identities.number_of_identities > 0 + { let mut new_transitions = crate::transitions::create_identities_state_transitions( self.start_identities.number_of_identities.into(), // number of identities - self.start_identities.keys_per_identity.into(), // number of keys per identity + self.start_identities.keys_per_identity.into(), // number of keys per identity signer, rng, create_asset_lock, @@ -654,13 +656,6 @@ impl Strategy { documents .into_iter() .for_each(|(document, identity, entropy)| { - let updated_at = - if document_type.required_fields().contains("$updatedAt") { - document.created_at() - } else { - None - }; - let identity_contract_nonce = contract_nonce_counter .entry((identity.id(), contract.id())) .or_default(); @@ -681,8 +676,6 @@ impl Strategy { } .into(), entropy: entropy.to_buffer(), - created_at: document.created_at(), - updated_at, data: document.properties_consumed(), } .into(); @@ -773,12 +766,6 @@ impl Strategy { document .properties_mut() .append(&mut specific_document_key_value_pairs.clone()); - let updated_at = - if document_type.required_fields().contains("$updatedAt") { - document.created_at() - } else { - None - }; let identity_contract_nonce = contract_nonce_counter .entry((identity.id(), contract.id())) @@ -795,8 +782,6 @@ impl Strategy { } .into(), entropy: entropy.to_buffer(), - created_at: document.created_at(), - updated_at, data: document.properties_consumed(), } .into(); @@ -1005,7 +990,6 @@ impl Strategy { .revision() .expect("expected to unwrap revision") + 1, - updated_at: Some(block_info.time_ms), data: random_new_document.properties_consumed(), } .into(); diff --git a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/document_transition/mod.rs b/packages/wasm-dpp/src/document/state_transition/document_batch_transition/document_transition/mod.rs index 6c1f46845e..8bf5078a2d 100644 --- a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/document_transition/mod.rs +++ b/packages/wasm-dpp/src/document/state_transition/document_batch_transition/document_transition/mod.rs @@ -7,7 +7,6 @@ mod document_create_transition; // pub use document_replace_transition::*; use dpp::platform_value::Value; -use dpp::prelude::TimestampMillis; use dpp::state_transition::documents_batch_transition::document_transition::action_type::TransitionActionTypeGetter; use dpp::state_transition::documents_batch_transition::document_transition::DocumentTransitionV0Methods; use dpp::{ @@ -47,11 +46,6 @@ impl DocumentTransitionWasm { self.0.action_type() as u8 } - // #[wasm_bindgen(js_name=getDataContract)] - // pub fn get_data_contract(&self) -> DataContractWasm { - // self.0.data_contract().to_owned().into() - // } - #[wasm_bindgen(js_name=getDataContractId)] pub fn get_data_contract_id(&self) -> IdentifierWrapper { self.0.data_contract_id().to_owned().into() @@ -77,162 +71,7 @@ impl DocumentTransitionWasm { pub fn set_revision(&mut self, revision: u32) { self.0.set_revision(revision as u64); } - - #[wasm_bindgen(js_name=getCreatedAt)] - pub fn get_created_at(&self) -> JsValue { - if let Some(created_at) = self.0.created_at() { - js_sys::Date::new(&JsValue::from_f64(created_at as f64)).into() - } else { - JsValue::NULL - } - } - - #[wasm_bindgen(js_name=getUpdatedAt)] - pub fn get_updated_at(&self) -> JsValue { - if let Some(updated_at) = self.0.updated_at() { - js_sys::Date::new(&JsValue::from_f64(updated_at as f64)).into() - } else { - JsValue::NULL - } - } - - #[wasm_bindgen(js_name=setUpdatedAt)] - pub fn set_updated_at(&mut self, updated_at: Option) -> Result<(), JsValue> { - self.0 - .set_updated_at(updated_at.map(|timestamp| timestamp.get_time() as TimestampMillis)); - - Ok(()) - } - - #[wasm_bindgen(js_name=setCreatedAt)] - pub fn set_created_at(&mut self, created_at: Option) { - self.0 - .set_created_at(created_at.map(|timestamp| timestamp.get_time() as TimestampMillis)); - } - - // #[wasm_bindgen(js_name=getData)] - // pub fn get_data(&self) -> Result { - // if let Some(data) = self.0.data() { - // let (identifier_paths, binary_paths) = self - // .0 - // .data_contract() - // .get_identifiers_and_binary_paths(self.0.document_type_name()) - // .with_js_error()?; - // - // let js_value = to_object( - // data.clone().into(), - // &JsValue::NULL, - // identifier_paths, - // binary_paths, - // )?; - // Ok(js_value) - // } else { - // Ok(JsValue::NULL) - // } - // } - // - // #[wasm_bindgen(js_name=get)] - // pub fn get(&self, path: &str, data_contract: &DataContractWasm) -> JsValue { - // let binary_type = self.get_binary_type_of_path(path, data_contract); - // - // if let Some(value) = self.0.get_dynamic_property(path) { - // match binary_type { - // BinaryType::Identifier => { - // if let Ok(bytes) = value.to_identifier_bytes() { - // let id: IdentifierWrapper = Identifier::from_bytes(&bytes).unwrap().into(); - // return id.into(); - // } - // } - // BinaryType::Buffer => { - // if let Ok(bytes) = value.to_binary_bytes() { - // return Buffer::from_bytes(&bytes).into(); - // } - // } - // BinaryType::None => { - // let serializer = serde_wasm_bindgen::Serializer::json_compatible(); - // if let Ok(js_value) = value.serialize(&serializer) { - // return js_value; - // } - // } - // } - // } - // - // JsValue::undefined() - // } - - // #[wasm_bindgen(js_name=toObject)] - // pub fn to_object( - // &self, - // options: &JsValue, - // data_contract: &DataContractWasm, - // ) -> Result { - // match self.0 { - // DocumentTransition::Create(ref t) => DocumentCreateTransitionWasm::from(t.to_owned()) - // .to_object(options, data_contract.inner()), - // DocumentTransition::Replace(ref t) => DocumentReplaceTransitionWasm::from(t.to_owned()) - // .to_object(options, data_contract.inner()), - // DocumentTransition::Delete(ref t) => DocumentDeleteTransitionWasm::from(t.to_owned()) - // .to_object(options, data_contract.inner()), - // } - // } - - // #[wasm_bindgen(js_name=toJSON)] - // pub fn to_json(&self) -> Result { - // let json_value = self.0.to_json().with_js_error()?; - // with_js_error!(json_value.serialize(&serde_wasm_bindgen::Serializer::json_compatible())) - // } - // - // #[wasm_bindgen(js_name=fromTransitionCreate)] - // pub fn from_transition_create( - // js_create_transition: DocumentCreateTransitionWasm, - // ) -> DocumentTransitionWasm { - // let transition_create: DocumentCreateTransition = js_create_transition.into(); - // let document_transition = DocumentTransition::Create(transition_create); - // - // document_transition.into() - // } - // - // #[wasm_bindgen(js_name=fromTransitionReplace)] - // pub fn from_transition_replace( - // js_replace_transition: DocumentReplaceTransitionWasm, - // ) -> DocumentTransitionWasm { - // let transition_replace: DocumentReplaceTransition = js_replace_transition.into(); - // let document_transition = DocumentTransition::Replace(transition_replace); - // - // document_transition.into() - // } - // - // #[wasm_bindgen(js_name=fromTransitionDelete)] - // pub fn from_transition_delete( - // js_delete_transition: DocumentDeleteTransitionWasm, - // ) -> DocumentTransitionWasm { - // let transition_delete: DocumentDeleteTransition = js_delete_transition.into(); - // let document_transition = DocumentTransition::Delete(transition_delete); - // - // document_transition.into() - // } } -// -// impl DocumentTransitionWasm { -// fn get_binary_type_of_path( -// &self, -// path: impl AsRef, -// data_contract: DataContractWasm, -// ) -> Result { -// let document_type = data_contract -// .inner() -// .document_type_for_name(self.0.document_type_name().as_str()) -// .with_js_error()?; -// -// if document_type.binary_paths().contains(&path) { -// Ok(BinaryType::Buffer) -// } else if document_type.identifier_paths().contains(&path) { -// Ok(BinaryType::Identifier) -// } else { -// Ok(BinaryType::None) -// } -// } -// } impl From for DocumentTransitionWasm { fn from(v: DocumentTransition) -> Self { From ea18e910fb3729b1c556f4cd44122f7cc4de8554 Mon Sep 17 00:00:00 2001 From: Igor Markin Date: Fri, 15 Mar 2024 14:06:41 +0000 Subject: [PATCH 094/191] chore: fix npm audit for follow-redirects package (#1781) --- .pnp.cjs | 14 +++++++------- ...directs-npm-1.15.4-3384d6a415-2e8f5f259a.zip | Bin 11151 -> 0 bytes ...directs-npm-1.15.6-50635fe51d-70c7612c4c.zip | Bin 0 -> 11162 bytes package.json | 2 +- yarn.lock | 8 ++++---- 5 files changed, 12 insertions(+), 12 deletions(-) delete mode 100644 .yarn/cache/follow-redirects-npm-1.15.4-3384d6a415-2e8f5f259a.zip create mode 100644 .yarn/cache/follow-redirects-npm-1.15.6-50635fe51d-70c7612c4c.zip diff --git a/.pnp.cjs b/.pnp.cjs index c435d36b2c..899c2bff35 100755 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -10376,17 +10376,17 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["follow-redirects", [\ - ["npm:1.15.4", {\ - "packageLocation": "./.yarn/cache/follow-redirects-npm-1.15.4-3384d6a415-2e8f5f259a.zip/node_modules/follow-redirects/",\ + ["npm:1.15.6", {\ + "packageLocation": "./.yarn/cache/follow-redirects-npm-1.15.6-50635fe51d-70c7612c4c.zip/node_modules/follow-redirects/",\ "packageDependencies": [\ - ["follow-redirects", "npm:1.15.4"]\ + ["follow-redirects", "npm:1.15.6"]\ ],\ "linkType": "SOFT"\ }],\ - ["virtual:a313c479c5c7e54d9ec8fbeeea69ff640f56b8989ea2dff42351a3fa5c4061fb80a52d8ede0f0826a181a216820c2d2c3f15da881e7fdf31cef1c446e42f0c45#npm:1.15.4", {\ - "packageLocation": "./.yarn/__virtual__/follow-redirects-virtual-035839a7fb/0/cache/follow-redirects-npm-1.15.4-3384d6a415-2e8f5f259a.zip/node_modules/follow-redirects/",\ + ["virtual:a313c479c5c7e54d9ec8fbeeea69ff640f56b8989ea2dff42351a3fa5c4061fb80a52d8ede0f0826a181a216820c2d2c3f15da881e7fdf31cef1c446e42f0c45#npm:1.15.6", {\ + "packageLocation": "./.yarn/__virtual__/follow-redirects-virtual-23ff1601e1/0/cache/follow-redirects-npm-1.15.6-50635fe51d-70c7612c4c.zip/node_modules/follow-redirects/",\ "packageDependencies": [\ - ["follow-redirects", "virtual:a313c479c5c7e54d9ec8fbeeea69ff640f56b8989ea2dff42351a3fa5c4061fb80a52d8ede0f0826a181a216820c2d2c3f15da881e7fdf31cef1c446e42f0c45#npm:1.15.4"],\ + ["follow-redirects", "virtual:a313c479c5c7e54d9ec8fbeeea69ff640f56b8989ea2dff42351a3fa5c4061fb80a52d8ede0f0826a181a216820c2d2c3f15da881e7fdf31cef1c446e42f0c45#npm:1.15.6"],\ ["@types/debug", null],\ ["debug", null]\ ],\ @@ -11264,7 +11264,7 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["http-proxy", "npm:1.18.1"],\ ["eventemitter3", "npm:4.0.7"],\ - ["follow-redirects", "virtual:a313c479c5c7e54d9ec8fbeeea69ff640f56b8989ea2dff42351a3fa5c4061fb80a52d8ede0f0826a181a216820c2d2c3f15da881e7fdf31cef1c446e42f0c45#npm:1.15.4"],\ + ["follow-redirects", "virtual:a313c479c5c7e54d9ec8fbeeea69ff640f56b8989ea2dff42351a3fa5c4061fb80a52d8ede0f0826a181a216820c2d2c3f15da881e7fdf31cef1c446e42f0c45#npm:1.15.6"],\ ["requires-port", "npm:1.0.0"]\ ],\ "linkType": "HARD"\ diff --git a/.yarn/cache/follow-redirects-npm-1.15.4-3384d6a415-2e8f5f259a.zip b/.yarn/cache/follow-redirects-npm-1.15.4-3384d6a415-2e8f5f259a.zip deleted file mode 100644 index 5bb42e70fe8362f2d5fb77e4b85a830f95df5614..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11151 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

    i6vMQ~6b$zB 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 diff --git a/.yarn/cache/follow-redirects-npm-1.15.6-50635fe51d-70c7612c4c.zip b/.yarn/cache/follow-redirects-npm-1.15.6-50635fe51d-70c7612c4c.zip new file mode 100644 index 0000000000000000000000000000000000000000..d64f38e50a7b8d349330f2203cef4e9cb8368f0f GIT binary patch literal 11162 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 F{{e?PdMW?_ literal 0 HcmV?d00001 diff --git a/package.json b/package.json index e241b9b590..41569399cf 100644 --- a/package.json +++ b/package.json @@ -88,7 +88,7 @@ "ansi-regex": "5.0.1", "cacache": "18.0.0", "node-gyp": "10.0.1", - "follow-redirects": "^1.15.4", + "follow-redirects": "^1.15.5", "socks": "^2.8.1" }, "dependencies": { diff --git a/yarn.lock b/yarn.lock index 01f3763a8f..59d895d024 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7788,13 +7788,13 @@ __metadata: languageName: node linkType: hard -"follow-redirects@npm:^1.15.4": - version: 1.15.4 - resolution: "follow-redirects@npm:1.15.4" +"follow-redirects@npm:^1.15.5": + version: 1.15.6 + resolution: "follow-redirects@npm:1.15.6" peerDependenciesMeta: debug: optional: true - checksum: 2e8f5f259a6b02dfa8dc199e08431848a7c3beed32eb4c19945966164a52c89f07b86c3afcc32ebe4279cf0a960520e45a63013d6350309c5ec90133c5d9351a + checksum: 70c7612c4cab18e546e36b991bbf8009a1a41cf85354afe04b113d1117569abf760269409cb3eb842d9f7b03d62826687086b081c566ea7b1e6613cf29030bf7 languageName: node linkType: hard From 9c8d72c6a99c5a2dde897e662bb1e47e378cd69b Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Sat, 16 Mar 2024 18:18:25 +0700 Subject: [PATCH 095/191] feat: query retry on race condition (#1776) --- .../src/abci/handler/finalize_block.rs | 12 +- packages/rs-drive-abci/src/error/query.rs | 4 + .../engine/run_block_proposal/v0/mod.rs | 5 +- .../triggers/feature_flags/v0/mod.rs | 2 +- .../src/platform_types/platform/mod.rs | 9 ++ .../src/platform_types/platform_state/mod.rs | 10 +- .../platform_types/platform_state/v0/mod.rs | 114 ++++++++---------- .../src/query/response_metadata/v0/mod.rs | 2 +- packages/rs-drive-abci/src/query/service.rs | 102 +++++++++++++--- 9 files changed, 166 insertions(+), 94 deletions(-) diff --git a/packages/rs-drive-abci/src/abci/handler/finalize_block.rs b/packages/rs-drive-abci/src/abci/handler/finalize_block.rs index f1a5eb2d25..7166e80768 100644 --- a/packages/rs-drive-abci/src/abci/handler/finalize_block.rs +++ b/packages/rs-drive-abci/src/abci/handler/finalize_block.rs @@ -1,7 +1,9 @@ use crate::abci::app::{BlockExecutionApplication, PlatformApplication, TransactionalApplication}; use crate::error::execution::ExecutionError; use crate::error::Error; +use crate::platform_types::cleaned_abci_messages::finalized_block_cleaned_request::v0::FinalizeBlockCleanedRequest; use crate::rpc::core::CoreRPCLike; +use std::sync::atomic::Ordering; use tenderdash_abci::proto::abci as proto; pub fn finalize_block<'a, A, C>( @@ -34,8 +36,12 @@ where let platform_version = app.platform().state.load().current_platform_version()?; + let request_finalize_block: FinalizeBlockCleanedRequest = request.try_into()?; + + let block_height = request_finalize_block.height; + let block_finalization_outcome = app.platform().finalize_block_proposal( - request.try_into()?, + request_finalize_block, block_execution_context, transaction, platform_version, @@ -58,6 +64,10 @@ where app.commit_transaction(platform_version)?; + app.platform() + .committed_block_height_guard + .store(block_height, Ordering::Relaxed); + Ok(proto::ResponseFinalizeBlock { events: vec![], retain_height: 0, diff --git a/packages/rs-drive-abci/src/error/query.rs b/packages/rs-drive-abci/src/error/query.rs index 5cff82e1be..0a6e931703 100644 --- a/packages/rs-drive-abci/src/error/query.rs +++ b/packages/rs-drive-abci/src/error/query.rs @@ -44,6 +44,10 @@ pub enum QueryError { #[error("not found error: {0}")] NotFound(String), + /// Server issue + #[error("query not serviceable: {0}")] + NotServiceable(String), + /// Decoding Error #[error("decoding error: {0}")] DecodingError(String), diff --git a/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs b/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs index 716a264d16..d030918065 100644 --- a/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs @@ -78,8 +78,9 @@ where ); let last_block_time_ms = last_committed_platform_state.last_committed_block_time_ms(); - let last_block_height = last_committed_platform_state - .last_committed_known_height_or(self.config.abci.genesis_height.saturating_sub(1)); + let last_block_height = last_committed_platform_state.last_committed_known_block_height_or( + self.config.abci.genesis_height.saturating_sub(1), + ); let last_block_core_height = last_committed_platform_state .last_committed_known_core_height_or(self.config.abci.genesis_core_height); let hpmn_list_len = last_committed_platform_state.hpmn_list_len() as u32; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/feature_flags/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/feature_flags/v0/mod.rs index 1fb54f9526..ddc16c6349 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/feature_flags/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/feature_flags/v0/mod.rs @@ -71,7 +71,7 @@ pub fn create_feature_flag_data_trigger_v0( ))) })?; - let latest_block_height = context.platform.state.last_committed_height(); + let latest_block_height = context.platform.state.last_committed_block_height(); if enable_at_height < latest_block_height { let err = DataTriggerConditionError::new( diff --git a/packages/rs-drive-abci/src/platform_types/platform/mod.rs b/packages/rs-drive-abci/src/platform_types/platform/mod.rs index a824dfc83d..3cab0f01fc 100644 --- a/packages/rs-drive-abci/src/platform_types/platform/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/platform/mod.rs @@ -11,6 +11,7 @@ use arc_swap::ArcSwap; use drive::drive::defaults::INITIAL_PROTOCOL_VERSION; use std::path::Path; use std::str::FromStr; +use std::sync::atomic::AtomicU64; use std::sync::Arc; use dashcore_rpc::dashcore::BlockHash; @@ -34,6 +35,8 @@ pub struct Platform { // for query and check tx and we don't want to block affect the // state update on finalize block, and vise versa. pub state: ArcSwap, + /// block height guard + pub committed_block_height_guard: AtomicU64, /// Configuration pub config: PlatformConfig, /// Core RPC Client @@ -219,9 +222,12 @@ impl Platform { platform_state.current_protocol_version_in_consensus(), )?); + let height = platform_state.last_committed_block_height(); + let platform: Platform = Platform { drive, state: ArcSwap::new(Arc::new(platform_state)), + committed_block_height_guard: AtomicU64::from(height), config, core_rpc, }; @@ -245,11 +251,14 @@ impl Platform { next_epoch_protocol_version, ); + let height = platform_state.last_committed_block_height(); + PlatformVersion::set_current(PlatformVersion::get(current_protocol_version_in_consensus)?); Ok(Platform { drive, state: ArcSwap::new(Arc::new(platform_state)), + committed_block_height_guard: AtomicU64::from(height), config, core_rpc, }) diff --git a/packages/rs-drive-abci/src/platform_types/platform_state/mod.rs b/packages/rs-drive-abci/src/platform_types/platform_state/mod.rs index e3903584d4..b5d5b88ec7 100644 --- a/packages/rs-drive-abci/src/platform_types/platform_state/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/platform_state/mod.rs @@ -202,15 +202,9 @@ impl TryFromPlatformVersioned for PlatformState { } impl PlatformStateV0Methods for PlatformState { - fn last_committed_height(&self) -> u64 { + fn last_committed_known_block_height_or(&self, default: u64) -> u64 { match self { - PlatformState::V0(v0) => v0.last_committed_height(), - } - } - - fn last_committed_known_height_or(&self, default: u64) -> u64 { - match self { - PlatformState::V0(v0) => v0.last_committed_known_height_or(default), + PlatformState::V0(v0) => v0.last_committed_known_block_height_or(default), } } diff --git a/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs b/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs index b587b08066..224bd39ecd 100644 --- a/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs @@ -302,10 +302,10 @@ impl PlatformStateV0 { /// Platform state methods introduced in version 0 of Platform State Struct pub trait PlatformStateV0Methods { + /// The last block height or 0 for genesis + fn last_committed_block_height(&self) -> u64; /// The height of the platform, only committed blocks increase height - fn last_committed_height(&self) -> u64; - /// The height of the platform, only committed blocks increase height - fn last_committed_known_height_or(&self, default: u64) -> u64; + fn last_committed_known_block_height_or(&self, default: u64) -> u64; /// The height of the core blockchain that Platform knows about through chain locks fn last_committed_core_height(&self) -> u32; /// The height of the core blockchain that Platform knows about through chain locks @@ -318,8 +318,6 @@ pub trait PlatformStateV0Methods { fn last_committed_block_signature(&self) -> [u8; 96]; /// The last block app hash fn last_committed_block_app_hash(&self) -> Option<[u8; 32]>; - /// The last block height or 0 for genesis - fn last_committed_block_height(&self) -> u64; /// The last block round fn last_committed_block_round(&self) -> u32; /// The current epoch @@ -466,8 +464,8 @@ pub trait PlatformStateV0Methods { } impl PlatformStateV0Methods for PlatformStateV0 { - /// The height of the platform, only committed blocks increase height - fn last_committed_height(&self) -> u64 { + /// The last block height or 0 for genesis + fn last_committed_block_height(&self) -> u64 { self.last_committed_block_info .as_ref() .map(|block_info| block_info.basic_info().height) @@ -475,7 +473,7 @@ impl PlatformStateV0Methods for PlatformStateV0 { } /// The height of the platform, only committed blocks increase height - fn last_committed_known_height_or(&self, default: u64) -> u64 { + fn last_committed_known_block_height_or(&self, default: u64) -> u64 { self.last_committed_block_info .as_ref() .map(|block_info| block_info.basic_info().height) @@ -523,14 +521,6 @@ impl PlatformStateV0Methods for PlatformStateV0 { .unwrap_or_default() } - /// The last block id hash - fn last_committed_block_id_hash(&self) -> [u8; 32] { - self.last_committed_block_info - .as_ref() - .map(|block_info| *block_info.block_id_hash()) - .unwrap_or_default() - } - /// The last block signature fn last_committed_block_signature(&self) -> [u8; 96] { self.last_committed_block_info @@ -546,14 +536,6 @@ impl PlatformStateV0Methods for PlatformStateV0 { .map(|block_info| *block_info.app_hash()) } - /// The last block height or 0 for genesis - fn last_committed_block_height(&self) -> u64 { - self.last_committed_block_info - .as_ref() - .map(|block_info| block_info.basic_info().height) - .unwrap_or_default() - } - /// The last block round fn last_committed_block_round(&self) -> u32 { self.last_committed_block_info @@ -570,13 +552,6 @@ impl PlatformStateV0Methods for PlatformStateV0 { .unwrap_or_default() } - fn last_committed_block_epoch_ref(&self) -> &Epoch { - self.last_committed_block_info - .as_ref() - .map(|block_info| &block_info.basic_info().epoch) - .unwrap_or(&EPOCH_0) - } - /// HPMN list len fn hpmn_list_len(&self) -> usize { self.hpmn_masternode_list.len() @@ -592,21 +567,26 @@ impl PlatformStateV0Methods for PlatformStateV0 { ))) } - /// Get the current protocol version in consensus - fn current_protocol_version_in_consensus(&self) -> ProtocolVersion { - self.current_protocol_version_in_consensus - } - /// Returns information about the last committed block. fn last_committed_block_info(&self) -> &Option { &self.last_committed_block_info } + /// Get the current protocol version in consensus + fn current_protocol_version_in_consensus(&self) -> ProtocolVersion { + self.current_protocol_version_in_consensus + } + /// Returns the upcoming protocol version for the next epoch. fn next_epoch_protocol_version(&self) -> ProtocolVersion { self.next_epoch_protocol_version } + /// Returns the quorum hash of the current validator set. + fn current_validator_set_quorum_hash(&self) -> QuorumHash { + self.current_validator_set_quorum_hash + } + /// Returns the quorum hash of the next validator set, if it exists. fn next_validator_set_quorum_hash(&self) -> &Option { &self.next_validator_set_quorum_hash @@ -632,19 +612,25 @@ impl PlatformStateV0Methods for PlatformStateV0 { &self.full_masternode_list } + /// Returns the list of high performance masternodes. + fn hpmn_masternode_list(&self) -> &BTreeMap { + &self.hpmn_masternode_list + } + /// Returns information about the platform initialization state, if it exists. fn genesis_block_info(&self) -> Option<&BlockInfo> { self.genesis_block_info.as_ref() } - /// Returns the quorum hash of the current validator set. - fn current_validator_set_quorum_hash(&self) -> QuorumHash { - self.current_validator_set_quorum_hash - } - - /// Returns the list of high performance masternodes. - fn hpmn_masternode_list(&self) -> &BTreeMap { - &self.hpmn_masternode_list + fn last_block_info(&self) -> &BlockInfo { + self.last_committed_block_info + .as_ref() + .map(|b| b.basic_info()) + .unwrap_or_else(|| { + self.genesis_block_info + .as_ref() + .unwrap_or(&DEFAULT_BLOCK_INFO) + }) } /// Sets the last committed block info. @@ -754,17 +740,6 @@ impl PlatformStateV0Methods for PlatformStateV0 { &mut self.chain_lock_validating_quorums } - fn previous_height_chain_lock_validating_quorums( - &self, - ) -> Option<&( - u32, - u32, - Option, - BTreeMap, - )> { - self.previous_height_chain_lock_validating_quorums.as_ref() - } - fn previous_height_chain_lock_validating_quorums_mut( &mut self, ) -> &mut Option<( @@ -784,14 +759,29 @@ impl PlatformStateV0Methods for PlatformStateV0 { &mut self.hpmn_masternode_list } - fn last_block_info(&self) -> &BlockInfo { + fn last_committed_block_epoch_ref(&self) -> &Epoch { self.last_committed_block_info .as_ref() - .map(|b| b.basic_info()) - .unwrap_or_else(|| { - self.genesis_block_info - .as_ref() - .unwrap_or(&DEFAULT_BLOCK_INFO) - }) + .map(|block_info| &block_info.basic_info().epoch) + .unwrap_or(&EPOCH_0) + } + + /// The last block id hash + fn last_committed_block_id_hash(&self) -> [u8; 32] { + self.last_committed_block_info + .as_ref() + .map(|block_info| *block_info.block_id_hash()) + .unwrap_or_default() + } + + fn previous_height_chain_lock_validating_quorums( + &self, + ) -> Option<&( + u32, + u32, + Option, + BTreeMap, + )> { + self.previous_height_chain_lock_validating_quorums.as_ref() } } diff --git a/packages/rs-drive-abci/src/query/response_metadata/v0/mod.rs b/packages/rs-drive-abci/src/query/response_metadata/v0/mod.rs index 461220a739..1228627156 100644 --- a/packages/rs-drive-abci/src/query/response_metadata/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/response_metadata/v0/mod.rs @@ -9,7 +9,7 @@ impl Platform { platform_state: &PlatformState, ) -> ResponseMetadata { ResponseMetadata { - height: platform_state.last_committed_height(), + height: platform_state.last_committed_block_height(), core_chain_locked_height: platform_state.last_committed_core_height(), epoch: platform_state.last_committed_block_epoch().index as u32, time_ms: platform_state diff --git a/packages/rs-drive-abci/src/query/service.rs b/packages/rs-drive-abci/src/query/service.rs index a3c9598ef7..c4d47ed30c 100644 --- a/packages/rs-drive-abci/src/query/service.rs +++ b/packages/rs-drive-abci/src/query/service.rs @@ -1,6 +1,7 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use crate::rpc::core::DefaultCoreRPC; @@ -26,7 +27,10 @@ use dapi_grpc::platform::v0::{ }; use dapi_grpc::tonic::{Request, Response, Status}; use dpp::version::PlatformVersion; +use std::sync::atomic::Ordering; use std::sync::Arc; +use std::thread::sleep; +use std::time::Duration; use tracing::Instrument; /// Service to handle platform queries @@ -47,7 +51,7 @@ impl QueryService { Self { platform } } - async fn handle_blocking_query( + async fn handle_blocking_query<'a, RQ, RS>( &self, request: Request, query_method: QueryMethod, @@ -55,33 +59,93 @@ impl QueryService { ) -> Result, Status> where RS: Clone + Send + 'static, - RQ: Send + 'static, + RQ: Send + Clone + 'static, { let platform = Arc::clone(&self.platform); spawn_blocking_task_with_name_if_supported("query", move || { - let platform_state = platform.state.load(); - - let platform_version = platform_state - .current_platform_version() - .map_err(|_| Status::unavailable("platform is not initialized"))?; - - let mut result = query_method( - &platform, - request.into_inner(), - &platform_state, - platform_version, - ) - .map_err(error_into_status)?; - - if result.is_valid() { - let response = result + let mut result; + + let request_query = request.into_inner(); + + let mut query_counter = 0; + + loop { + let platform_state = platform.state.load(); + + let platform_version = platform_state + .current_platform_version() + .map_err(|_| Status::unavailable("platform is not initialized"))?; + + let mut needs_restart = false; + + loop { + let committed_block_height_guard = platform + .committed_block_height_guard + .load(Ordering::Relaxed); + let mut counter = 0; + if platform_state.last_committed_block_height() == committed_block_height_guard + { + break; + } else { + counter += 1; + sleep(Duration::from_millis(10)) + } + + // We try for up to 1 second + if counter >= 100 { + query_counter += 1; + needs_restart = true; + break; + } + } + + if query_counter > 3 { + return Err(query_error_into_status(QueryError::NotServiceable( + "platform is saturated (did not attempt query)".to_string(), + ))); + } + + if needs_restart { + continue; + } + + result = query_method( + &platform, + request_query.clone(), + &platform_state, + platform_version, + ); + + let committed_block_height_guard = platform + .committed_block_height_guard + .load(Ordering::Relaxed); + + if platform_state.last_committed_block_height() == committed_block_height_guard { + // in this case the query almost certainly executed correctly + break; + } else { + query_counter += 1; + + if query_counter > 2 { + // This should never be possible + return Err(query_error_into_status(QueryError::NotServiceable( + "platform is saturated".to_string(), + ))); + } + } + } + + let mut query_result = result.map_err(error_into_status)?; + + if query_result.is_valid() { + let response = query_result .into_data() .map_err(|error| error_into_status(error.into()))?; Ok(Response::new(response)) } else { - let error = result.errors.swap_remove(0); + let error = query_result.errors.swap_remove(0); Err(query_error_into_status(error)) } From 6a62ae394ad8783403589eee0f2c390d005b46d4 Mon Sep 17 00:00:00 2001 From: PastaPastaPasta <6443210+PastaPastaPasta@users.noreply.github.com> Date: Sat, 16 Mar 2024 14:25:08 -0500 Subject: [PATCH 096/191] ci: enforce warnings as errors (#1783) --- .github/workflows/tests-rs-package.yml | 1 + .../class_methods/try_from_schema/v0/mod.rs | 1 + .../v0/mod.rs | 1 + packages/rs-dpp/src/document/v0/serialize.rs | 2 + .../documents_batch_transition/methods/mod.rs | 4 +- .../methods/v0/mod.rs | 4 +- .../v0/v0_methods.rs | 4 +- .../v0/v0_methods.rs | 4 +- packages/rs-drive-abci/src/main.rs | 45 ++++++++++--------- packages/rs-drive-abci/src/utils/spawn.rs | 4 +- .../tests/strategy_tests/strategy.rs | 1 + packages/rs-drive/src/common/mod.rs | 2 + .../data_contract_create_transition.rs | 6 +-- .../src/drive/contract/contract_fetch_info.rs | 3 ++ .../rs-drive/src/drive/credit_pools/mod.rs | 1 + packages/rs-drive/src/drive/document/mod.rs | 2 +- 16 files changed, 54 insertions(+), 31 deletions(-) diff --git a/.github/workflows/tests-rs-package.yml b/.github/workflows/tests-rs-package.yml index 0690b7d03d..0e8771d4fb 100644 --- a/.github/workflows/tests-rs-package.yml +++ b/.github/workflows/tests-rs-package.yml @@ -222,6 +222,7 @@ jobs: set -ex features="${{ steps.crate_info.outputs.features }}" fails="" + RUSTFLAGS="-D warnings" cargo check --no-default-features --package "${{ inputs.package }}" --locked for feature in $features ; do echo " ============== Verify feature $feature ==============" diff --git a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs index 5bdf1b9880..1574c2ffe2 100644 --- a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs @@ -24,6 +24,7 @@ use std::collections::HashSet; use std::collections::{BTreeMap, BTreeSet}; use std::convert::TryInto; +#[cfg(feature = "validation")] use crate::consensus::basic::data_contract::InvalidDocumentTypeRequiredSecurityLevelError; #[cfg(feature = "validation")] use crate::consensus::basic::document::MissingPositionsInDocumentTypePropertiesError; diff --git a/packages/rs-dpp/src/document/serialization_traits/platform_serialization_conversion/v0/mod.rs b/packages/rs-dpp/src/document/serialization_traits/platform_serialization_conversion/v0/mod.rs index f0ec01c62e..ce942172bc 100644 --- a/packages/rs-dpp/src/document/serialization_traits/platform_serialization_conversion/v0/mod.rs +++ b/packages/rs-dpp/src/document/serialization_traits/platform_serialization_conversion/v0/mod.rs @@ -1,4 +1,5 @@ use crate::data_contract::document_type::DocumentTypeRef; +#[cfg(feature = "validation")] use crate::validation::ConsensusValidationResult; use crate::version::PlatformVersion; use crate::ProtocolError; diff --git a/packages/rs-dpp/src/document/v0/serialize.rs b/packages/rs-dpp/src/document/v0/serialize.rs index 10bca9826a..79c26d7ee0 100644 --- a/packages/rs-dpp/src/document/v0/serialize.rs +++ b/packages/rs-dpp/src/document/v0/serialize.rs @@ -26,7 +26,9 @@ use platform_version::version::FeatureVersion; use std::collections::BTreeMap; use crate::consensus::basic::decode::DecodingError; +#[cfg(feature = "validation")] use crate::consensus::basic::BasicError; +#[cfg(feature = "validation")] use crate::consensus::ConsensusError; use std::io::{BufReader, Read}; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs index c44b929bc4..9871d087af 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs @@ -6,7 +6,9 @@ use crate::document::Document; use crate::identity::signer::Signer; #[cfg(feature = "state-transition-signing")] use crate::identity::IdentityPublicKey; -use crate::prelude::{IdentityNonce, UserFeeIncrease}; +use crate::prelude::IdentityNonce; +#[cfg(feature = "state-transition-signing")] +use crate::prelude::UserFeeIncrease; use crate::state_transition::documents_batch_transition::document_transition::DocumentTransition; use crate::state_transition::documents_batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; use crate::state_transition::documents_batch_transition::DocumentsBatchTransition; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/v0/mod.rs index ef36e3ce41..dd366eb112 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/v0/mod.rs @@ -7,7 +7,9 @@ use crate::identity::signer::Signer; #[cfg(feature = "state-transition-signing")] use crate::identity::IdentityPublicKey; use crate::identity::SecurityLevel; -use crate::prelude::{IdentityNonce, UserFeeIncrease}; +use crate::prelude::IdentityNonce; +#[cfg(feature = "state-transition-signing")] +use crate::prelude::UserFeeIncrease; use crate::state_transition::documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; use crate::state_transition::documents_batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; use crate::state_transition::documents_batch_transition::document_transition::{ diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs index 7711326a0e..740913bdfb 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs @@ -8,7 +8,9 @@ use crate::identity::signer::Signer; use crate::identity::SecurityLevel; #[cfg(feature = "state-transition-signing")] use crate::prelude::IdentityPublicKey; -use crate::prelude::{IdentityNonce, UserFeeIncrease}; +use crate::prelude::IdentityNonce; +#[cfg(feature = "state-transition-signing")] +use crate::prelude::UserFeeIncrease; use crate::state_transition::documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; #[cfg(feature = "state-transition-signing")] use crate::state_transition::documents_batch_transition::document_create_transition::DocumentCreateTransition; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/v0_methods.rs index 3d143f1660..26af0304de 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/v0_methods.rs @@ -19,7 +19,9 @@ use crate::identity::{Identity, IdentityPublicKey}; use crate::identity::accessors::IdentityGettersV0; #[cfg(feature = "state-transition-signing")] use crate::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; -use crate::prelude::{IdentityNonce, UserFeeIncrease}; +use crate::prelude::IdentityNonce; +#[cfg(feature = "state-transition-signing")] +use crate::prelude::UserFeeIncrease; use crate::state_transition::identity_update_transition::accessors::IdentityUpdateTransitionAccessorsV0; use crate::state_transition::identity_update_transition::methods::IdentityUpdateTransitionMethodsV0; use crate::state_transition::identity_update_transition::v0::IdentityUpdateTransitionV0; diff --git a/packages/rs-drive-abci/src/main.rs b/packages/rs-drive-abci/src/main.rs index bce62ceefb..1ccaed597e 100644 --- a/packages/rs-drive-abci/src/main.rs +++ b/packages/rs-drive-abci/src/main.rs @@ -12,6 +12,7 @@ use drive_abci::rpc::core::DefaultCoreRPC; use drive_abci::{logging, server}; use itertools::Itertools; use std::fs::remove_file; +#[cfg(tokio_unstable)] use std::net::SocketAddr; use std::path::PathBuf; use std::process::ExitCode; @@ -20,7 +21,9 @@ use tokio::runtime::{Builder, Runtime}; use tokio::signal::unix::{signal, SignalKind}; use tokio::time::Duration; use tokio_util::sync::CancellationToken; +#[cfg(tokio_unstable)] use tracing_subscriber::layer::SubscriberExt; +#[cfg(tokio_unstable)] use tracing_subscriber::util::SubscriberInitExt; const SHUTDOWN_TIMEOUT_MILIS: u64 = 5000; // 5s; Docker defaults to 10s @@ -165,26 +168,28 @@ fn main() -> Result<(), ExitCode> { panic!("tokio_unstable flag should be set"); // Initialize Tokio console subscriber - - let socket_addr: SocketAddr = config - .tokio_console_address - .parse() - .expect("cannot parse tokio console address"); - - let console_layer = console_subscriber::ConsoleLayer::builder() - .retention(Duration::from_secs(config.tokio_console_retention_secs)) - .server_addr(socket_addr) - .spawn(); - - tracing_subscriber::registry() - .with( - loggers - .tracing_subscriber_layers() - .expect("should return layers"), - ) - .with(console_layer) - .try_init() - .expect("can't init tracing subscribers"); + #[cfg(tokio_unstable)] + { + let socket_addr: SocketAddr = config + .tokio_console_address + .parse() + .expect("cannot parse tokio console address"); + + let console_layer = console_subscriber::ConsoleLayer::builder() + .retention(Duration::from_secs(config.tokio_console_retention_secs)) + .server_addr(socket_addr) + .spawn(); + + tracing_subscriber::registry() + .with( + loggers + .tracing_subscriber_layers() + .expect("should return layers"), + ) + .with(console_layer) + .try_init() + .expect("can't init tracing subscribers"); + } } else { loggers.install(); } diff --git a/packages/rs-drive-abci/src/utils/spawn.rs b/packages/rs-drive-abci/src/utils/spawn.rs index c8c6de52bd..40ff8cb550 100644 --- a/packages/rs-drive-abci/src/utils/spawn.rs +++ b/packages/rs-drive-abci/src/utils/spawn.rs @@ -3,7 +3,7 @@ use tokio::task::JoinHandle; /// Spawn a blocking tokio task with name if tokio_unstable flag is set pub fn spawn_blocking_task_with_name_if_supported( - name: &str, + _sometimes_used_name: &str, function: Function, ) -> io::Result> where @@ -13,7 +13,7 @@ where #[cfg(all(tokio_unstable, feature = "console"))] { tokio::task::Builder::new() - .name(name) + .name(_sometimes_used_name) .spawn_blocking(function) } diff --git a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs index 7adfe29233..b5c08eafb8 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs @@ -179,6 +179,7 @@ pub enum CoreHeightIncrease { #[default] NoCoreHeightIncrease, RandomCoreHeightIncrease(Frequency), + #[allow(dead_code)] // TODO investigate why this is never constructed according to compiler KnownCoreHeightIncreases(Vec), } diff --git a/packages/rs-drive/src/common/mod.rs b/packages/rs-drive/src/common/mod.rs index 3d5a7aa60a..6ea5c70dae 100644 --- a/packages/rs-drive/src/common/mod.rs +++ b/packages/rs-drive/src/common/mod.rs @@ -60,10 +60,12 @@ use dpp::data_contract::DataContract; #[cfg(feature = "full")] use dpp::block::block_info::BlockInfo; +#[cfg(feature = "fixtures-and-mocks")] use dpp::prelude::Identifier; #[cfg(feature = "fixtures-and-mocks")] use dpp::tests::json_document::json_document_to_contract_with_ids; +#[cfg(feature = "fixtures-and-mocks")] use dpp::version::PlatformVersion; #[cfg(test)] diff --git a/packages/rs-drive/src/drive/batch/transitions/contract/data_contract_create_transition.rs b/packages/rs-drive/src/drive/batch/transitions/contract/data_contract_create_transition.rs index 4f148deaf6..0e3496c3fb 100644 --- a/packages/rs-drive/src/drive/batch/transitions/contract/data_contract_create_transition.rs +++ b/packages/rs-drive/src/drive/batch/transitions/contract/data_contract_create_transition.rs @@ -14,7 +14,7 @@ impl DriveHighLevelOperationConverter for DataContractCreateTransitionAction { _epoch: &Epoch, _platform_version: &PlatformVersion, ) -> Result>, Error> { - let operations = vec![ + Ok(vec![ IdentityOperation(IdentityOperationType::UpdateIdentityNonce { identity_id: self.data_contract_ref().owner_id().into_buffer(), nonce: self.identity_nonce(), @@ -31,8 +31,6 @@ impl DriveHighLevelOperationConverter for DataContractCreateTransitionAction { contract: Cow::Owned(self.data_contract()), storage_flags: None, }), - ]; - - Ok(operations) + ]) } } diff --git a/packages/rs-drive/src/drive/contract/contract_fetch_info.rs b/packages/rs-drive/src/drive/contract/contract_fetch_info.rs index 3b72fc9197..7a10f3214b 100644 --- a/packages/rs-drive/src/drive/contract/contract_fetch_info.rs +++ b/packages/rs-drive/src/drive/contract/contract_fetch_info.rs @@ -1,7 +1,9 @@ use crate::drive::flags::StorageFlags; use dpp::data_contract::DataContract; +#[cfg(feature = "fixtures-and-mocks")] use dpp::data_contracts; use dpp::fee::fee_result::FeeResult; +#[cfg(feature = "fixtures-and-mocks")] use dpp::system_data_contracts::load_system_data_contract; #[cfg(feature = "fixtures-and-mocks")] use dpp::tests::fixtures::get_dashpay_contract_fixture; @@ -10,6 +12,7 @@ use dpp::tests::fixtures::get_dpns_data_contract_fixture; #[cfg(feature = "fixtures-and-mocks")] use dpp::tests::fixtures::get_masternode_reward_shares_data_contract_fixture; use grovedb_costs::OperationCost; +#[cfg(feature = "fixtures-and-mocks")] use platform_version::version::PlatformVersion; #[cfg(any(feature = "full", feature = "verify"))] diff --git a/packages/rs-drive/src/drive/credit_pools/mod.rs b/packages/rs-drive/src/drive/credit_pools/mod.rs index eec8d8e57c..adaa871110 100644 --- a/packages/rs-drive/src/drive/credit_pools/mod.rs +++ b/packages/rs-drive/src/drive/credit_pools/mod.rs @@ -47,6 +47,7 @@ use crate::fee_pools::epochs::paths::EpochProposers; use dpp::block::epoch::{Epoch, EpochIndex}; #[cfg(feature = "full")] use dpp::fee::epoch::SignedCreditsPerEpoch; +#[cfg(feature = "full")] use dpp::fee::SignedCredits; #[cfg(feature = "full")] use grovedb::query_result_type::QueryResultType; diff --git a/packages/rs-drive/src/drive/document/mod.rs b/packages/rs-drive/src/drive/document/mod.rs index 614890f5c7..baeeaf70ef 100644 --- a/packages/rs-drive/src/drive/document/mod.rs +++ b/packages/rs-drive/src/drive/document/mod.rs @@ -33,7 +33,7 @@ //! Namely functions to return the paths to certain objects and the path sizes. //! -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(feature = "full")] use crate::drive::defaults::DEFAULT_HASH_SIZE_U8; #[cfg(feature = "full")] use crate::drive::flags::StorageFlags; From 77d62abc991f5db4b984f8e5943cbc42c94cc537 Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Mon, 18 Mar 2024 19:54:43 +0700 Subject: [PATCH 097/191] feat(platform)!: created at block height and variants (#1784) --- packages/rs-dpp/src/block/block_info/mod.rs | 6 +- packages/rs-dpp/src/block/epoch/mod.rs | 11 + .../create_document_from_data/v0/mod.rs | 55 +++ .../v0/mod.rs | 89 ++++- .../document_type/methods/mod.rs | 46 ++- .../src/data_contract/document_type/mod.rs | 19 +- .../document_type/random_document.rs | 342 ++++++++++++------ .../document_type/v0/random_document.rs | 226 ++++++++---- packages/rs-dpp/src/document/accessors/mod.rs | 50 ++- .../rs-dpp/src/document/accessors/v0/mod.rs | 8 + .../src/document/document_factory/mod.rs | 9 +- .../src/document/document_factory/v0/mod.rs | 45 ++- .../is_equal_ignoring_timestamps/v0/mod.rs | 10 +- .../src/document/document_methods/mod.rs | 10 +- .../document/extended_document/accessors.rs | 36 +- .../src/document/extended_document/mod.rs | 18 +- .../src/document/extended_document/v0/mod.rs | 30 +- packages/rs-dpp/src/document/fields.rs | 4 + packages/rs-dpp/src/document/mod.rs | 6 +- .../specialized_document_factory/mod.rs | 2 +- .../specialized_document_factory/v0/mod.rs | 44 ++- packages/rs-dpp/src/document/v0/accessors.rs | 150 ++++++++ .../rs-dpp/src/document/v0/cbor_conversion.rs | 32 +- .../rs-dpp/src/document/v0/json_conversion.rs | 39 ++ packages/rs-dpp/src/document/v0/mod.rs | 53 ++- packages/rs-dpp/src/document/v0/serialize.rs | 284 +++++++++++---- packages/rs-dpp/src/lib.rs | 4 + .../document_create_transition/mod.rs | 52 +-- .../document_create_transition/v0/mod.rs | 179 ++++++--- .../document_replace_transition/mod.rs | 91 +++-- .../document_replace_transition/v0/mod.rs | 132 +++++-- .../v0/v0_methods.rs | 2 +- .../tests/fixtures/get_documents_fixture.rs | 2 + packages/rs-dpp/src/tests/json_document.rs | 4 + .../create_genesis_state/v0/mod.rs | 8 +- .../documents_batch/transformer/v0/mod.rs | 10 +- .../rs-drive-abci/src/query/proofs/v0/mod.rs | 12 +- .../src/test/helpers/fee_pools.rs | 4 + .../tests/strategy_tests/main.rs | 6 +- .../tests/strategy_tests/strategy.rs | 12 +- packages/rs-drive-proof-verifier/src/proof.rs | 22 +- .../rs-drive/src/drive/document/delete/mod.rs | 12 +- .../rs-drive/src/drive/document/insert/mod.rs | 12 +- .../rs-drive/src/drive/document/update/mod.rs | 42 ++- .../src/drive/prove/prove_multiple/v0/mod.rs | 14 +- .../mod.rs | 6 +- .../v0/mod.rs | 43 +-- packages/rs-drive/src/error/proof.rs | 5 + .../document_create_transition_action/mod.rs | 13 + .../v0/mod.rs | 23 +- .../v0/transformer.rs | 34 ++ .../transformer.rs | 10 +- .../v0/mod.rs | 26 +- .../v0/transformer.rs | 27 +- .../v0/transformer.rs | 4 + packages/rs-drive/tests/query_tests.rs | 54 +-- .../rs-drive/tests/query_tests_history.rs | 8 +- packages/rs-sdk/src/platform.rs | 1 + .../src/platform/block_info_from_metadata.rs | 47 +++ .../src/platform/transition/broadcast.rs | 5 +- .../src/platform/transition/put_contract.rs | 5 +- .../src/platform/transition/put_document.rs | 5 +- .../src/platform/transition/put_identity.rs | 5 +- .../platform/transition/top_up_identity.rs | 5 +- .../transition/withdraw_from_identity.rs | 5 +- ...501c1ba166a2dd8f6efb31b0289dc011da983.json | Bin 0 -> 8838 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 0 -> 74125 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 0 -> 74125 bytes ...093d92d2c84b425f8393ffa9599b06a3a77be.json | Bin 0 -> 24201 bytes ...fcf0df7bf150009b1ced887a6f051ab86085b.json | Bin 0 -> 22301 bytes ...af38ff6415d9cabab87315b9d9d736194597f.json | Bin 0 -> 24327 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 0 -> 74137 bytes ...625892e0011f1264c65e1474532f59456ff51.json | Bin 0 -> 24213 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 0 -> 74123 bytes ...093d92d2c84b425f8393ffa9599b06a3a77be.json | Bin 0 -> 24199 bytes ...760d7a75e2a5427cbc90009bf8a2540448035.json | 1 + packages/strategy-tests/src/lib.rs | 12 +- .../integration/document/Document.spec.js | 4 + .../test/unit/document/Document.spec.js | 10 +- 79 files changed, 2035 insertions(+), 567 deletions(-) create mode 100644 packages/rs-sdk/src/platform/block_info_from_metadata.rs create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T08:55:01.204152704Z_GetDataContractRequest_e4cf74168e03a40bd159451456b501c1ba166a2dd8f6efb31b0289dc011da983.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T08:55:01.204915874Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T08:55:01.205188238Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T08:55:01.234819753Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T08:55:01.241108252Z_DocumentQuery_fb3b25c8fa37750a6c1b18d9085fcf0df7bf150009b1ced887a6f051ab86085b.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T08:55:01.244377672Z_DocumentQuery_90af5a08200f1b0e42dbd3ad7a6af38ff6415d9cabab87315b9d9d736194597f.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T08:56:19.629079892Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T08:56:19.649147329Z_DocumentQuery_c104c67292061fe0b8e2f959cd2625892e0011f1264c65e1474532f59456ff51.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T08:57:32.047138511Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T08:57:32.068486672Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json create mode 100644 packages/rs-sdk/tests/vectors/quorum_pubkey-106-6d309b63e7a286d50c8091772d4760d7a75e2a5427cbc90009bf8a2540448035.json diff --git a/packages/rs-dpp/src/block/block_info/mod.rs b/packages/rs-dpp/src/block/block_info/mod.rs index 5fe7df6c7a..edd9b54395 100644 --- a/packages/rs-dpp/src/block/block_info/mod.rs +++ b/packages/rs-dpp/src/block/block_info/mod.rs @@ -1,5 +1,5 @@ use crate::block::epoch::{Epoch, EPOCH_0}; -use crate::prelude::TimestampMillis; +use crate::prelude::{BlockHeight, CoreBlockHeight, TimestampMillis}; use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; @@ -20,10 +20,10 @@ pub struct BlockInfo { pub time_ms: TimestampMillis, /// Block height - pub height: u64, + pub height: BlockHeight, /// Core height - pub core_height: u32, + pub core_height: CoreBlockHeight, /// Current fee epoch pub epoch: Epoch, diff --git a/packages/rs-dpp/src/block/epoch/mod.rs b/packages/rs-dpp/src/block/epoch/mod.rs index 060836954a..e7fe4aef55 100644 --- a/packages/rs-dpp/src/block/epoch/mod.rs +++ b/packages/rs-dpp/src/block/epoch/mod.rs @@ -5,6 +5,9 @@ use serde::{Deserialize, Serialize}; /// Epoch key offset pub const EPOCH_KEY_OFFSET: u16 = 256; +/// The Highest allowed Epoch +pub const MAX_EPOCH: u16 = u16::MAX - EPOCH_KEY_OFFSET; + /// Epoch index type pub type EpochIndex = u16; @@ -39,3 +42,11 @@ impl Epoch { }) } } + +impl TryFrom for Epoch { + type Error = ProtocolError; + + fn try_from(value: EpochIndex) -> Result { + Self::new(value) + } +} diff --git a/packages/rs-dpp/src/data_contract/document_type/methods/create_document_from_data/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/methods/create_document_from_data/v0/mod.rs index ae392b645d..447d9c8806 100644 --- a/packages/rs-dpp/src/data_contract/document_type/methods/create_document_from_data/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/methods/create_document_from_data/v0/mod.rs @@ -1,8 +1,13 @@ use crate::data_contract::document_type::accessors::DocumentTypeV0Getters; use crate::data_contract::document_type::property_names::{CREATED_AT, UPDATED_AT}; use crate::data_contract::document_type::v0::DocumentTypeV0; +use crate::document::property_names::{ + CREATED_AT_BLOCK_HEIGHT, CREATED_AT_CORE_BLOCK_HEIGHT, UPDATED_AT_BLOCK_HEIGHT, + UPDATED_AT_CORE_BLOCK_HEIGHT, +}; use crate::document::{Document, DocumentV0, INITIAL_REVISION}; use crate::identity::TimestampMillis; +use crate::prelude::{BlockHeight, CoreBlockHeight}; use crate::version::PlatformVersion; use crate::ProtocolError; use chrono::Utc; @@ -14,6 +19,8 @@ impl DocumentTypeV0 { &self, data: Value, owner_id: Identifier, + block_height: BlockHeight, + core_block_height: CoreBlockHeight, document_entropy: [u8; 32], platform_version: &PlatformVersion, ) -> Result { @@ -40,9 +47,37 @@ impl DocumentTypeV0 { .get_optional_integer(UPDATED_AT) .map_err(ProtocolError::ValueError)?; + let mut created_at_block_height: Option = data + .get_optional_integer(CREATED_AT_BLOCK_HEIGHT) + .map_err(ProtocolError::ValueError)?; + + let mut updated_at_block_height: Option = data + .get_optional_integer(UPDATED_AT_BLOCK_HEIGHT) + .map_err(ProtocolError::ValueError)?; + + let mut created_at_core_block_height: Option = data + .get_optional_integer(CREATED_AT_CORE_BLOCK_HEIGHT) + .map_err(ProtocolError::ValueError)?; + + let mut updated_at_core_block_height: Option = data + .get_optional_integer(UPDATED_AT_CORE_BLOCK_HEIGHT) + .map_err(ProtocolError::ValueError)?; + let is_created_at_required = self.required_fields().contains(CREATED_AT); let is_updated_at_required = self.required_fields().contains(UPDATED_AT); + let is_created_at_block_height_required = + self.required_fields().contains(CREATED_AT_BLOCK_HEIGHT); + let is_updated_at_block_height_required = + self.required_fields().contains(UPDATED_AT_BLOCK_HEIGHT); + + let is_created_at_core_block_height_required = self + .required_fields() + .contains(CREATED_AT_CORE_BLOCK_HEIGHT); + let is_updated_at_core_block_height_required = self + .required_fields() + .contains(UPDATED_AT_CORE_BLOCK_HEIGHT); + if (is_created_at_required && created_at.is_none()) || (is_updated_at_required && updated_at.is_none()) { @@ -58,6 +93,22 @@ impl DocumentTypeV0 { }; }; + if is_created_at_block_height_required { + created_at_block_height = created_at_block_height.or(Some(block_height)); + }; + + if is_updated_at_block_height_required { + updated_at_block_height = updated_at_block_height.or(Some(block_height)); + }; + + if is_created_at_core_block_height_required { + created_at_core_block_height = created_at_core_block_height.or(Some(core_block_height)); + }; + + if is_updated_at_core_block_height_required { + updated_at_core_block_height = updated_at_core_block_height.or(Some(core_block_height)); + }; + match platform_version .dpp .document_versions @@ -73,6 +124,10 @@ impl DocumentTypeV0 { revision, created_at, updated_at, + created_at_block_height, + updated_at_block_height, + created_at_core_block_height, + updated_at_core_block_height, }; document diff --git a/packages/rs-dpp/src/data_contract/document_type/methods/create_document_with_prevalidated_properties/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/methods/create_document_with_prevalidated_properties/v0/mod.rs index a24dfe3c77..d9286ff6c1 100644 --- a/packages/rs-dpp/src/data_contract/document_type/methods/create_document_with_prevalidated_properties/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/methods/create_document_with_prevalidated_properties/v0/mod.rs @@ -1,13 +1,19 @@ use crate::data_contract::document_type::property_names::{CREATED_AT, UPDATED_AT}; use crate::document::{Document, DocumentV0}; -use crate::prelude::TimestampMillis; +use crate::prelude::{BlockHeight, CoreBlockHeight, TimestampMillis}; use crate::ProtocolError; use chrono::Utc; use platform_value::Value; +use crate::data_contract::document_type::accessors::DocumentTypeV0Getters; use crate::data_contract::document_type::v0::DocumentTypeV0; +use crate::document::property_names::{ + CREATED_AT_BLOCK_HEIGHT, CREATED_AT_CORE_BLOCK_HEIGHT, UPDATED_AT_BLOCK_HEIGHT, + UPDATED_AT_CORE_BLOCK_HEIGHT, +}; use crate::document::INITIAL_REVISION; use crate::version::PlatformVersion; +use platform_value::btreemap_extensions::BTreeValueMapHelper; use platform_value::Identifier; use std::collections::BTreeMap; @@ -18,19 +24,80 @@ impl DocumentTypeV0 { &self, id: Identifier, owner_id: Identifier, + block_height: BlockHeight, + core_block_height: CoreBlockHeight, properties: BTreeMap, platform_version: &PlatformVersion, ) -> Result { - let created_at = if self.required_fields.contains(CREATED_AT) { - Some(Utc::now().timestamp_millis() as TimestampMillis) - } else { - None + // Set timestamps if they are required and not exist + let mut created_at: Option = properties + .get_optional_integer(CREATED_AT) + .map_err(ProtocolError::ValueError)?; + + let mut updated_at: Option = properties + .get_optional_integer(UPDATED_AT) + .map_err(ProtocolError::ValueError)?; + + let mut created_at_block_height: Option = properties + .get_optional_integer(CREATED_AT_BLOCK_HEIGHT) + .map_err(ProtocolError::ValueError)?; + + let mut updated_at_block_height: Option = properties + .get_optional_integer(UPDATED_AT_BLOCK_HEIGHT) + .map_err(ProtocolError::ValueError)?; + + let mut created_at_core_block_height: Option = properties + .get_optional_integer(CREATED_AT_CORE_BLOCK_HEIGHT) + .map_err(ProtocolError::ValueError)?; + + let mut updated_at_core_block_height: Option = properties + .get_optional_integer(UPDATED_AT_CORE_BLOCK_HEIGHT) + .map_err(ProtocolError::ValueError)?; + + let is_created_at_required = self.required_fields().contains(CREATED_AT); + let is_updated_at_required = self.required_fields().contains(UPDATED_AT); + + let is_created_at_block_height_required = + self.required_fields().contains(CREATED_AT_BLOCK_HEIGHT); + let is_updated_at_block_height_required = + self.required_fields().contains(UPDATED_AT_BLOCK_HEIGHT); + + let is_created_at_core_block_height_required = self + .required_fields() + .contains(CREATED_AT_CORE_BLOCK_HEIGHT); + let is_updated_at_core_block_height_required = self + .required_fields() + .contains(UPDATED_AT_CORE_BLOCK_HEIGHT); + + if (is_created_at_required && created_at.is_none()) + || (is_updated_at_required && updated_at.is_none()) + { + //we want only one call to get current time + let now = Utc::now().timestamp_millis() as TimestampMillis; + + if is_created_at_required { + created_at = created_at.or(Some(now)); + }; + + if is_updated_at_required { + updated_at = updated_at.or(Some(now)); + }; }; - let updated_at = if self.required_fields.contains(UPDATED_AT) { - Some(Utc::now().timestamp_millis() as TimestampMillis) - } else { - None + if is_created_at_block_height_required { + created_at_block_height = created_at_block_height.or(Some(block_height)); + }; + + if is_updated_at_block_height_required { + updated_at_block_height = updated_at_block_height.or(Some(block_height)); + }; + + if is_created_at_core_block_height_required { + created_at_core_block_height = created_at_core_block_height.or(Some(core_block_height)); + }; + + if is_updated_at_core_block_height_required { + updated_at_core_block_height = updated_at_core_block_height.or(Some(core_block_height)); }; let revision = if self.documents_mutable { @@ -51,6 +118,10 @@ impl DocumentTypeV0 { revision, created_at, updated_at, + created_at_block_height, + updated_at_block_height, + created_at_core_block_height, + updated_at_core_block_height, } .into()), version => Err(ProtocolError::UnknownVersionMismatch { diff --git a/packages/rs-dpp/src/data_contract/document_type/methods/mod.rs b/packages/rs-dpp/src/data_contract/document_type/methods/mod.rs index da9f57f17a..394e1d3b14 100644 --- a/packages/rs-dpp/src/data_contract/document_type/methods/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/methods/mod.rs @@ -14,7 +14,7 @@ use crate::data_contract::document_type::index_level::IndexLevel; use crate::data_contract::document_type::v0::DocumentTypeV0; use crate::document::Document; use crate::document::INITIAL_REVISION; -use crate::prelude::Revision; +use crate::prelude::{BlockHeight, CoreBlockHeight, Revision}; use crate::version::PlatformVersion; use crate::ProtocolError; @@ -64,16 +64,48 @@ pub trait DocumentTypeV0Methods { &self, data: Value, owner_id: Identifier, + block_height: BlockHeight, + core_block_height: CoreBlockHeight, document_entropy: [u8; 32], platform_version: &PlatformVersion, ) -> Result; - /// Creates a document at the current time based on document type information - /// Properties set here must be pre validated + /// Creates a document at the current time based on specified document type information. + /// This function requires that all properties provided are pre-validated according to + /// the document's schema requirements. + /// + /// # Parameters: + /// - `id`: An identifier for the document. Unique within the context of the document's type. + /// - `owner_id`: The identifier of the entity that will own this document. + /// - `block_height`: The block height at which this document is considered to have been created. + /// While this value is recorded in the document, it is ignored when the document is broadcasted + /// to the network. This is because the actual block height at the time of broadcast may differ. + /// This parameter is included to fulfill schema requirements that specify a block height; you may + /// use the current block height, a placeholder value of 0, or any other value as necessary. + /// - `core_block_height`: Similar to `block_height`, this represents the core network's block height + /// at the document's creation time. It is handled the same way as `block_height` regarding broadcast + /// and schema requirements. + /// - `properties`: A collection of properties for the document, structured as a `BTreeMap`. + /// These must be pre-validated to match the document's schema definitions. + /// - `platform_version`: A reference to the current version of the platform for which the document is created. + /// + /// # Returns: + /// A `Result`, which is `Ok` if the document was successfully created, or an error + /// indicating what went wrong during the creation process. + /// + /// # Note: + /// The `block_height` and `core_block_height` are primarily included for schema compliance and local record-keeping. + /// These values are not used when the document is broadcasted to the network, as the network assigns its own block + /// heights upon receipt and processing of the document. After broadcasting, it is recommended to update these fields + /// in their created_at/updated_at variants as well as the base created_at/updated_at in the client-side + /// representation of the document to reflect the values returned by the network. The base created_at/updated_at + /// uses current time when creating the local document and is also ignored as it is also set network side. fn create_document_with_prevalidated_properties( &self, id: Identifier, owner_id: Identifier, + block_height: BlockHeight, + core_block_height: CoreBlockHeight, properties: BTreeMap, platform_version: &PlatformVersion, ) -> Result; @@ -200,6 +232,8 @@ impl DocumentTypeV0Methods for DocumentTypeV0 { &self, data: Value, owner_id: Identifier, + block_height: BlockHeight, + core_block_height: CoreBlockHeight, document_entropy: [u8; 32], platform_version: &PlatformVersion, ) -> Result { @@ -213,6 +247,8 @@ impl DocumentTypeV0Methods for DocumentTypeV0 { 0 => self.create_document_from_data_v0( data, owner_id, + block_height, + core_block_height, document_entropy, platform_version, ), @@ -228,6 +264,8 @@ impl DocumentTypeV0Methods for DocumentTypeV0 { &self, id: Identifier, owner_id: Identifier, + block_height: BlockHeight, + core_block_height: CoreBlockHeight, properties: BTreeMap, platform_version: &PlatformVersion, ) -> Result { @@ -241,6 +279,8 @@ impl DocumentTypeV0Methods for DocumentTypeV0 { 0 => self.create_document_with_prevalidated_properties_v0( id, owner_id, + block_height, + core_block_height, properties, platform_version, ), diff --git a/packages/rs-dpp/src/data_contract/document_type/mod.rs b/packages/rs-dpp/src/data_contract/document_type/mod.rs index 5e8064c02c..8822ad75c0 100644 --- a/packages/rs-dpp/src/data_contract/document_type/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/mod.rs @@ -16,7 +16,7 @@ pub mod v0; use crate::data_contract::document_type::methods::DocumentTypeV0Methods; use crate::data_contract::document_type::v0::DocumentTypeV0; use crate::document::Document; -use crate::prelude::Revision; +use crate::prelude::{BlockHeight, CoreBlockHeight, Revision}; use crate::version::PlatformVersion; use crate::ProtocolError; use derive_more::From; @@ -162,13 +162,20 @@ impl<'a> DocumentTypeV0Methods for DocumentTypeRef<'a> { &self, data: Value, owner_id: Identifier, + block_height: BlockHeight, + core_block_height: CoreBlockHeight, document_entropy: [u8; 32], platform_version: &PlatformVersion, ) -> Result { match self { - DocumentTypeRef::V0(v0) => { - v0.create_document_from_data(data, owner_id, document_entropy, platform_version) - } + DocumentTypeRef::V0(v0) => v0.create_document_from_data( + data, + owner_id, + block_height, + core_block_height, + document_entropy, + platform_version, + ), } } @@ -176,6 +183,8 @@ impl<'a> DocumentTypeV0Methods for DocumentTypeRef<'a> { &self, id: Identifier, owner_id: Identifier, + block_height: BlockHeight, + core_block_height: CoreBlockHeight, properties: BTreeMap, platform_version: &PlatformVersion, ) -> Result { @@ -183,6 +192,8 @@ impl<'a> DocumentTypeV0Methods for DocumentTypeRef<'a> { DocumentTypeRef::V0(v0) => v0.create_document_with_prevalidated_properties( id, owner_id, + block_height, + core_block_height, properties, platform_version, ), diff --git a/packages/rs-dpp/src/data_contract/document_type/random_document.rs b/packages/rs-dpp/src/data_contract/document_type/random_document.rs index 6582235183..9c91f4f7f5 100644 --- a/packages/rs-dpp/src/data_contract/document_type/random_document.rs +++ b/packages/rs-dpp/src/data_contract/document_type/random_document.rs @@ -1,6 +1,7 @@ use crate::data_contract::document_type::{DocumentType, DocumentTypeRef}; use crate::document::Document; use crate::identity::Identity; +use crate::prelude::{BlockHeight, CoreBlockHeight, TimestampMillis}; use crate::version::PlatformVersion; use crate::ProtocolError; use bincode::{Decode, Encode}; @@ -28,38 +29,98 @@ pub enum DocumentFieldFillSize { // TODO The factory is used in benchmark and tests. Probably it should be available under the test feature /// Functions for creating various types of random documents. pub trait CreateRandomDocument { - /// Random documents with DoNotFillIfNotRequired and AnyDocumentFillSize + /// Generates a single random document, employing default behavior for document field + /// filling where fields that are not required will not be filled (`DoNotFillIfNotRequired`) and + /// any fill size that is contractually allowed may be used (`AnyDocumentFillSize`). + /// This method provides a straightforward way to create a document with random data, with an + /// optional seed for deterministic randomness. + /// + /// # Parameters: + /// - `seed`: An optional seed value for initializing the random number generator for deterministic outcomes. + /// - `platform_version`: The version of the platform for which the document is being generated. + /// + /// # Returns: + /// A `Result`, which is `Ok` containing the document if successful, or an error + /// if the operation fails. + fn random_document( + &self, + seed: Option, + platform_version: &PlatformVersion, + ) -> Result; + + /// Generates a single random document using a specified random number generator. Applies default behavior + /// for filling document fields, not filling those that are not required and using any fill size allowed by + /// the contract. + /// + /// # Parameters: + /// - `rng`: A mutable reference to an `StdRng` random number generator. + /// - `platform_version`: The version of the platform for which the document is being generated. + /// + /// # Returns: + /// A `Result`, which is `Ok` containing the document if successful, or an error + /// if the operation fails. + fn random_document_with_rng( + &self, + rng: &mut StdRng, + platform_version: &PlatformVersion, + ) -> Result; + + /// Generates a specified number of random documents, employing default behavior for document field + /// filling where fields that are not required will not be filled (`DoNotFillIfNotRequired`) and + /// any fill size that is contractually allowed may be used (`AnyDocumentFillSize`). This method + /// is particularly useful for generating test documents or simulating documents in a variety of + /// sizes and completeness. + /// + /// # Parameters: + /// - `count`: The number of random documents to generate. + /// - `seed`: An optional seed value for initializing the random number generator for deterministic outcomes. + /// - `platform_version`: The version of the platform for which these documents are being generated. + /// + /// # Returns: + /// A `Result, ProtocolError>`, which is `Ok` containing a vector of documents if successful, + /// or an error if the operation fails. fn random_documents( &self, count: u32, seed: Option, platform_version: &PlatformVersion, ) -> Result, ProtocolError>; - /// Random documents with rng + + /// Generates a specified number of random documents using a specific random number generator (`rng`). + /// Default document field filling behavior is applied, where not required fields are not filled and any + /// fill size allowed by the contract may be used. This allows for controlled randomness in the document + /// generation process. + /// + /// # Parameters: + /// - `count`: The number of random documents to generate. + /// - `rng`: A mutable reference to an `StdRng` random number generator. + /// - `platform_version`: The version of the platform for which these documents are being generated. + /// + /// # Returns: + /// A `Result, ProtocolError>`, which is `Ok` containing a vector of documents if successful, + /// or an error if the operation fails. fn random_documents_with_rng( &self, count: u32, rng: &mut StdRng, platform_version: &PlatformVersion, ) -> Result, ProtocolError>; - /// Creates `count` Documents with random data using the random number generator given. - fn random_documents_with_params( - &self, - count: u32, - identities: &[Identity], - time_ms: u64, - document_field_fill_type: DocumentFieldFillType, - document_field_fill_size: DocumentFieldFillSize, - rng: &mut StdRng, - platform_version: &PlatformVersion, - ) -> Result, ProtocolError>; - /// Random document - fn random_document( - &self, - seed: Option, - platform_version: &PlatformVersion, - ) -> Result; - /// Creates a document with a random id, owner id, and properties using StdRng. + + /// Generates a single random document with a specified identifier and entropy values, using a given + /// random number generator. Defaults to not filling non-required fields and allowing any fill size, + /// unless specified otherwise through `document_field_fill_type` and `document_field_fill_size`. + /// + /// # Parameters: + /// - `rng`: A mutable reference to an `StdRng` random number generator. + /// - `owner_id`: The identifier for the owner of the document. + /// - `entropy`: A Bytes32 value to influence the randomness. + /// - `document_field_fill_type`: Specifies how document fields should be filled. + /// - `document_field_fill_size`: Specifies the size of the content to fill document fields with. + /// - `platform_version`: The version of the platform for which the document is being generated. + /// + /// # Returns: + /// A `Result`, which is `Ok` containing the document if successful, or an error + /// if the operation fails. fn random_document_with_identifier_and_entropy( &self, rng: &mut StdRng, @@ -69,88 +130,131 @@ pub trait CreateRandomDocument { document_field_fill_size: DocumentFieldFillSize, platform_version: &PlatformVersion, ) -> Result; - /// Random document with rng - fn random_document_with_rng( - &self, - rng: &mut StdRng, - platform_version: &PlatformVersion, - ) -> Result; - /// Creates a document with a random id, owner id, and properties using StdRng. + + /// Generates a single random document with specified parameters for customization, using a given + /// random number generator. Defaults to not filling non-required fields and allowing any fill size + /// unless explicitly specified through `document_field_fill_type` and `document_field_fill_size`. + /// + /// # Parameters: + /// - `owner_id`: The identifier for the owner of the document. + /// - `entropy`: A Bytes32 value to influence the randomness. + /// - `time_ms`: An optional timestamp in milliseconds. + /// - `block_height`: An optional block height to be used in created_at_block_height/updated_at_block_height. Will default to 0 if required but not provided. + /// - `core_block_height`: An optional core block height to be used in created_at_core_block_height/updated_at_core_block_height. Will default to 0 if required but not provided. + /// - `document_field_fill_type`: Specifies how document fields should be filled. + /// - `document_field_fill_size`: Specifies the size of the content to fill document fields with. + /// - `rng`: A mutable reference to an `StdRng` random number generator. + /// - `platform_version`: The version of the platform for which the document is being generated. + /// + /// # Returns: + /// A `Result`, which is `Ok` containing the document if successful, or an error + /// if the operation fails. fn random_document_with_params( &self, owner_id: Identifier, entropy: Bytes32, - time_ms: u64, + time_ms: Option, + block_height: Option, + core_block_height: Option, document_field_fill_type: DocumentFieldFillType, document_field_fill_size: DocumentFieldFillSize, rng: &mut StdRng, platform_version: &PlatformVersion, ) -> Result; + + /// Generates a specified number of random documents with additional parameters for customization, including + /// identities, timestamps, block heights, and specific document field filling strategies. + /// + /// # Parameters: + /// - `count`: The number of random documents to generate. + /// - `identities`: An array of `Identity` objects to associate with the documents. + /// - `time_ms`: An optional timestamp in milliseconds. + /// - `block_height`: An optional block height to be used in created_at_block_height/updated_at_block_height. Will default to 0 if required but not provided. + /// - `core_block_height`: An optional core block height to be used in created_at_core_block_height/updated_at_core_block_height. Will default to 0 if required but not provided. + /// - `document_field_fill_type`: Specifies how document fields should be filled. + /// - `document_field_fill_size`: Specifies the size of the content to fill document fields with. + /// - `rng`: A mutable reference to an `StdRng` random number generator. + /// - `platform_version`: The version of the platform for which these documents are being generated. + /// + /// # Returns: + /// A `Result, ProtocolError>` which is `Ok` containing a vector of tuples + /// if successful, each tuple consisting of a Document, its associated Identity, and a Bytes32 value, or an error + /// if the operation fails. + fn random_documents_with_params( + &self, + count: u32, + identities: &[Identity], + time_ms: Option, + block_height: Option, + core_block_height: Option, + document_field_fill_type: DocumentFieldFillType, + document_field_fill_size: DocumentFieldFillSize, + rng: &mut StdRng, + platform_version: &PlatformVersion, + ) -> Result, ProtocolError>; } impl CreateRandomDocument for DocumentType { - fn random_documents( + fn random_document( &self, - count: u32, seed: Option, platform_version: &PlatformVersion, - ) -> Result, ProtocolError> { + ) -> Result { match self { - DocumentType::V0(v0) => v0.random_documents(count, seed, platform_version), + DocumentType::V0(v0) => v0.random_document(seed, platform_version), } } - fn random_documents_with_rng( + fn random_document_with_rng( &self, - count: u32, rng: &mut StdRng, platform_version: &PlatformVersion, - ) -> Result, ProtocolError> { + ) -> Result { match self { - DocumentType::V0(v0) => v0.random_documents_with_rng(count, rng, platform_version), + DocumentType::V0(v0) => v0.random_document_with_rng(rng, platform_version), } } - fn random_documents_with_params( + fn random_documents( &self, count: u32, - identities: &[Identity], - time_ms: u64, - document_field_fill_type: DocumentFieldFillType, - document_field_fill_size: DocumentFieldFillSize, - rng: &mut StdRng, + seed: Option, platform_version: &PlatformVersion, - ) -> Result, ProtocolError> { + ) -> Result, ProtocolError> { match self { - DocumentType::V0(v0) => v0.random_documents_with_params( - count, - identities, - time_ms, - document_field_fill_type, - document_field_fill_size, - rng, - platform_version, - ), // Add more cases as necessary for other variants + DocumentType::V0(v0) => v0.random_documents(count, seed, platform_version), } } - fn random_document( + fn random_documents_with_rng( &self, - seed: Option, + count: u32, + rng: &mut StdRng, platform_version: &PlatformVersion, - ) -> Result { + ) -> Result, ProtocolError> { match self { - DocumentType::V0(v0) => v0.random_document(seed, platform_version), + DocumentType::V0(v0) => v0.random_documents_with_rng(count, rng, platform_version), } } - fn random_document_with_rng( + fn random_document_with_identifier_and_entropy( &self, rng: &mut StdRng, + owner_id: Identifier, + entropy: Bytes32, + document_field_fill_type: DocumentFieldFillType, + document_field_fill_size: DocumentFieldFillSize, platform_version: &PlatformVersion, ) -> Result { match self { - DocumentType::V0(v0) => v0.random_document_with_rng(rng, platform_version), + DocumentType::V0(v0) => v0.random_document_with_identifier_and_entropy( + rng, + owner_id, + entropy, + document_field_fill_type, + document_field_fill_size, + platform_version, + ), } } @@ -158,7 +262,9 @@ impl CreateRandomDocument for DocumentType { &self, owner_id: Identifier, entropy: Bytes32, - time_ms: u64, + time_ms: Option, + block_height: Option, + core_block_height: Option, document_field_fill_type: DocumentFieldFillType, document_field_fill_size: DocumentFieldFillSize, rng: &mut StdRng, @@ -169,6 +275,8 @@ impl CreateRandomDocument for DocumentType { owner_id, entropy, time_ms, + block_height, + core_block_height, document_field_fill_type, document_field_fill_size, rng, @@ -176,91 +284,95 @@ impl CreateRandomDocument for DocumentType { ), // Add more cases as necessary for other variants } } - fn random_document_with_identifier_and_entropy( + fn random_documents_with_params( &self, - rng: &mut StdRng, - owner_id: Identifier, - entropy: Bytes32, + count: u32, + identities: &[Identity], + time_ms: Option, + block_height: Option, + core_block_height: Option, document_field_fill_type: DocumentFieldFillType, document_field_fill_size: DocumentFieldFillSize, + rng: &mut StdRng, platform_version: &PlatformVersion, - ) -> Result { + ) -> Result, ProtocolError> { match self { - DocumentType::V0(v0) => v0.random_document_with_identifier_and_entropy( - rng, - owner_id, - entropy, + DocumentType::V0(v0) => v0.random_documents_with_params( + count, + identities, + time_ms, + block_height, + core_block_height, document_field_fill_type, document_field_fill_size, + rng, platform_version, - ), + ), // Add more cases as necessary for other variants } } } impl<'a> CreateRandomDocument for DocumentTypeRef<'a> { - fn random_documents( + fn random_document( &self, - count: u32, seed: Option, platform_version: &PlatformVersion, - ) -> Result, ProtocolError> { + ) -> Result { match self { - DocumentTypeRef::V0(v0) => v0.random_documents(count, seed, platform_version), + DocumentTypeRef::V0(v0) => v0.random_document(seed, platform_version), } } - fn random_documents_with_rng( + fn random_document_with_rng( &self, - count: u32, rng: &mut StdRng, platform_version: &PlatformVersion, - ) -> Result, ProtocolError> { + ) -> Result { match self { - DocumentTypeRef::V0(v0) => v0.random_documents_with_rng(count, rng, platform_version), + DocumentTypeRef::V0(v0) => v0.random_document_with_rng(rng, platform_version), } } - fn random_documents_with_params( + fn random_documents( &self, count: u32, - identities: &[Identity], - time_ms: u64, - document_field_fill_type: DocumentFieldFillType, - document_field_fill_size: DocumentFieldFillSize, - rng: &mut StdRng, + seed: Option, platform_version: &PlatformVersion, - ) -> Result, ProtocolError> { + ) -> Result, ProtocolError> { match self { - DocumentTypeRef::V0(v0) => v0.random_documents_with_params( - count, - identities, - time_ms, - document_field_fill_type, - document_field_fill_size, - rng, - platform_version, - ), // Add more cases as necessary for other variants + DocumentTypeRef::V0(v0) => v0.random_documents(count, seed, platform_version), } } - fn random_document( + fn random_documents_with_rng( &self, - seed: Option, + count: u32, + rng: &mut StdRng, platform_version: &PlatformVersion, - ) -> Result { + ) -> Result, ProtocolError> { match self { - DocumentTypeRef::V0(v0) => v0.random_document(seed, platform_version), + DocumentTypeRef::V0(v0) => v0.random_documents_with_rng(count, rng, platform_version), } } - fn random_document_with_rng( + fn random_document_with_identifier_and_entropy( &self, rng: &mut StdRng, + owner_id: Identifier, + entropy: Bytes32, + document_field_fill_type: DocumentFieldFillType, + document_field_fill_size: DocumentFieldFillSize, platform_version: &PlatformVersion, ) -> Result { match self { - DocumentTypeRef::V0(v0) => v0.random_document_with_rng(rng, platform_version), + DocumentTypeRef::V0(v0) => v0.random_document_with_identifier_and_entropy( + rng, + owner_id, + entropy, + document_field_fill_type, + document_field_fill_size, + platform_version, + ), } } @@ -268,7 +380,9 @@ impl<'a> CreateRandomDocument for DocumentTypeRef<'a> { &self, owner_id: Identifier, entropy: Bytes32, - time_ms: u64, + time_ms: Option, + block_height: Option, + core_block_height: Option, document_field_fill_type: DocumentFieldFillType, document_field_fill_size: DocumentFieldFillSize, rng: &mut StdRng, @@ -279,6 +393,8 @@ impl<'a> CreateRandomDocument for DocumentTypeRef<'a> { owner_id, entropy, time_ms, + block_height, + core_block_height, document_field_fill_type, document_field_fill_size, rng, @@ -287,24 +403,30 @@ impl<'a> CreateRandomDocument for DocumentTypeRef<'a> { } } - fn random_document_with_identifier_and_entropy( + fn random_documents_with_params( &self, - rng: &mut StdRng, - owner_id: Identifier, - entropy: Bytes32, + count: u32, + identities: &[Identity], + time_ms: Option, + block_height: Option, + core_block_height: Option, document_field_fill_type: DocumentFieldFillType, document_field_fill_size: DocumentFieldFillSize, + rng: &mut StdRng, platform_version: &PlatformVersion, - ) -> Result { + ) -> Result, ProtocolError> { match self { - DocumentTypeRef::V0(v0) => v0.random_document_with_identifier_and_entropy( - rng, - owner_id, - entropy, + DocumentTypeRef::V0(v0) => v0.random_documents_with_params( + count, + identities, + time_ms, + block_height, + core_block_height, document_field_fill_type, document_field_fill_size, + rng, platform_version, - ), + ), // Add more cases as necessary for other variants } } } diff --git a/packages/rs-dpp/src/data_contract/document_type/v0/random_document.rs b/packages/rs-dpp/src/data_contract/document_type/v0/random_document.rs index d4f78ca71f..68964bd464 100644 --- a/packages/rs-dpp/src/data_contract/document_type/v0/random_document.rs +++ b/packages/rs-dpp/src/data_contract/document_type/v0/random_document.rs @@ -9,18 +9,58 @@ use crate::data_contract::document_type::random_document::{ CreateRandomDocument, DocumentFieldFillSize, DocumentFieldFillType, }; use crate::data_contract::document_type::v0::DocumentTypeV0; +use std::time::{SystemTime, UNIX_EPOCH}; +use crate::document::property_names::{ + CREATED_AT_BLOCK_HEIGHT, CREATED_AT_CORE_BLOCK_HEIGHT, UPDATED_AT_BLOCK_HEIGHT, + UPDATED_AT_CORE_BLOCK_HEIGHT, +}; use crate::document::{Document, DocumentV0}; use crate::identity::accessors::IdentityGettersV0; use crate::identity::Identity; +use crate::prelude::{BlockHeight, CoreBlockHeight, TimestampMillis}; use crate::version::PlatformVersion; use crate::ProtocolError; use platform_value::{Bytes32, Identifier}; use rand::rngs::StdRng; use rand::{Rng, SeedableRng}; -use std::time::{SystemTime, UNIX_EPOCH}; impl CreateRandomDocument for DocumentTypeV0 { + /// Creates a random Document using a seed if given, otherwise entropy. + fn random_document( + &self, + seed: Option, + platform_version: &PlatformVersion, + ) -> Result { + let mut rng = match seed { + None => StdRng::from_entropy(), + Some(seed_value) => StdRng::seed_from_u64(seed_value), + }; + self.random_document_with_rng(&mut rng, platform_version) + } + + /// Creates a document with a random id, owner id, and properties using StdRng. + fn random_document_with_rng( + &self, + rng: &mut StdRng, + platform_version: &PlatformVersion, + ) -> Result { + let owner_id = Identifier::random_with_rng(rng); + let entropy = Bytes32::random_with_rng(rng); + + self.random_document_with_params( + owner_id, + entropy, + None, + None, + None, + DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + rng, + platform_version, + ) + } + /// Creates `count` Documents with random data using a seed if given, otherwise entropy. fn random_documents( &self, @@ -49,52 +89,6 @@ impl CreateRandomDocument for DocumentTypeV0 { Ok(vec) } - /// Creates `count` Documents with random data using the random number generator given. - fn random_documents_with_params( - &self, - count: u32, - identities: &[Identity], - time_ms: u64, - document_field_fill_type: DocumentFieldFillType, - document_field_fill_size: DocumentFieldFillSize, - rng: &mut StdRng, - platform_version: &PlatformVersion, - ) -> Result, ProtocolError> { - let mut vec = vec![]; - for _i in 0..count { - let identity_num = rng.gen_range(0..identities.len()); - let identity = identities.get(identity_num).unwrap().clone(); - let entropy = Bytes32::random_with_rng(rng); - vec.push(( - self.random_document_with_params( - identity.id(), - entropy, - time_ms, - document_field_fill_type, - document_field_fill_size, - rng, - platform_version, - )?, - identity, - entropy, - )); - } - Ok(vec) - } - - /// Creates a random Document using a seed if given, otherwise entropy. - fn random_document( - &self, - seed: Option, - platform_version: &PlatformVersion, - ) -> Result { - let mut rng = match seed { - None => StdRng::from_entropy(), - Some(seed_value) => StdRng::seed_from_u64(seed_value), - }; - self.random_document_with_rng(&mut rng, platform_version) - } - /// Creates a document with a random id, owner id, and properties using StdRng. fn random_document_with_identifier_and_entropy( &self, @@ -105,13 +99,12 @@ impl CreateRandomDocument for DocumentTypeV0 { document_field_fill_size: DocumentFieldFillSize, platform_version: &PlatformVersion, ) -> Result { - let now = SystemTime::now(); - let duration_since_epoch = now.duration_since(UNIX_EPOCH).expect("Time went backwards"); - let milliseconds = duration_since_epoch.as_millis() as u64; self.random_document_with_params( owner_id, entropy, - milliseconds, + None, + None, + None, document_field_fill_type, document_field_fill_size, rng, @@ -119,34 +112,14 @@ impl CreateRandomDocument for DocumentTypeV0 { ) } - /// Creates a document with a random id, owner id, and properties using StdRng. - fn random_document_with_rng( - &self, - rng: &mut StdRng, - platform_version: &PlatformVersion, - ) -> Result { - let owner_id = Identifier::random_with_rng(rng); - let entropy = Bytes32::random_with_rng(rng); - let now = SystemTime::now(); - let duration_since_epoch = now.duration_since(UNIX_EPOCH).expect("Time went backwards"); - let milliseconds = duration_since_epoch.as_millis() as u64; - self.random_document_with_params( - owner_id, - entropy, - milliseconds, - DocumentFieldFillType::FillIfNotRequired, - DocumentFieldFillSize::AnyDocumentFillSize, - rng, - platform_version, - ) - } - /// Creates a document with a given owner id and entropy, and properties using StdRng. fn random_document_with_params( &self, owner_id: Identifier, entropy: Bytes32, - time_ms: u64, + time_ms: Option, + block_height: Option, + core_block_height: Option, document_field_fill_type: DocumentFieldFillType, document_field_fill_size: DocumentFieldFillSize, rng: &mut StdRng, @@ -191,17 +164,77 @@ impl CreateRandomDocument for DocumentTypeV0 { }; let created_at = if self.required_fields.contains(CREATED_AT) { - Some(time_ms) + if time_ms.is_some() { + time_ms + } else { + let now = SystemTime::now(); + let duration_since_epoch = + now.duration_since(UNIX_EPOCH).expect("Time went backwards"); + let milliseconds = duration_since_epoch.as_millis() as u64; + Some(milliseconds) + } } else { None }; let updated_at = if self.required_fields.contains(UPDATED_AT) { - Some(time_ms) + if time_ms.is_some() { + time_ms + } else if created_at.is_some() { + created_at + } else { + let now = SystemTime::now(); + let duration_since_epoch = + now.duration_since(UNIX_EPOCH).expect("Time went backwards"); + let milliseconds = duration_since_epoch.as_millis() as u64; + Some(milliseconds) + } + } else { + None + }; + + let created_at_block_height = if self.required_fields.contains(CREATED_AT_BLOCK_HEIGHT) { + if block_height.is_some() { + block_height + } else { + Some(0) + } } else { None }; + let updated_at_block_height = if self.required_fields.contains(UPDATED_AT_BLOCK_HEIGHT) { + if block_height.is_some() { + block_height + } else { + Some(0) + } + } else { + None + }; + + let created_at_core_block_height = + if self.required_fields.contains(CREATED_AT_CORE_BLOCK_HEIGHT) { + if core_block_height.is_some() { + core_block_height + } else { + Some(0) + } + } else { + None + }; + + let updated_at_core_block_height = + if self.required_fields.contains(UPDATED_AT_CORE_BLOCK_HEIGHT) { + if core_block_height.is_some() { + core_block_height + } else { + Some(0) + } + } else { + None + }; + match platform_version .dpp .document_versions @@ -214,6 +247,10 @@ impl CreateRandomDocument for DocumentTypeV0 { revision, created_at, updated_at, + created_at_block_height, + updated_at_block_height, + created_at_core_block_height, + updated_at_core_block_height, } .into()), version => Err(ProtocolError::UnknownVersionMismatch { @@ -223,4 +260,41 @@ impl CreateRandomDocument for DocumentTypeV0 { }), } } + + /// Creates `count` Documents with random data using the random number generator given. + fn random_documents_with_params( + &self, + count: u32, + identities: &[Identity], + time_ms: Option, + block_height: Option, + core_block_height: Option, + document_field_fill_type: DocumentFieldFillType, + document_field_fill_size: DocumentFieldFillSize, + rng: &mut StdRng, + platform_version: &PlatformVersion, + ) -> Result, ProtocolError> { + let mut vec = vec![]; + for _i in 0..count { + let identity_num = rng.gen_range(0..identities.len()); + let identity = identities.get(identity_num).unwrap().clone(); + let entropy = Bytes32::random_with_rng(rng); + vec.push(( + self.random_document_with_params( + identity.id(), + entropy, + time_ms, + block_height, + core_block_height, + document_field_fill_type, + document_field_fill_size, + rng, + platform_version, + )?, + identity, + entropy, + )); + } + Ok(vec) + } } diff --git a/packages/rs-dpp/src/document/accessors/mod.rs b/packages/rs-dpp/src/document/accessors/mod.rs index c2cd2492c0..363f0c1696 100644 --- a/packages/rs-dpp/src/document/accessors/mod.rs +++ b/packages/rs-dpp/src/document/accessors/mod.rs @@ -4,7 +4,7 @@ pub use v0::*; use crate::document::Document; use crate::identity::TimestampMillis; -use crate::prelude::Revision; +use crate::prelude::{BlockHeight, CoreBlockHeight, Revision}; use platform_value::{Identifier, Value}; use std::collections::BTreeMap; @@ -68,6 +68,30 @@ impl DocumentV0Getters for Document { Document::V0(v0) => v0.updated_at, } } + + fn created_at_block_height(&self) -> Option { + match self { + Document::V0(v0) => v0.created_at_block_height, + } + } + + fn updated_at_block_height(&self) -> Option { + match self { + Document::V0(v0) => v0.updated_at_block_height, + } + } + + fn created_at_core_block_height(&self) -> Option { + match self { + Document::V0(v0) => v0.created_at_core_block_height, + } + } + + fn updated_at_core_block_height(&self) -> Option { + match self { + Document::V0(v0) => v0.updated_at_core_block_height, + } + } } impl DocumentV0Setters for Document { @@ -106,4 +130,28 @@ impl DocumentV0Setters for Document { Document::V0(v0) => v0.updated_at = updated_at, } } + + fn set_created_at_block_height(&mut self, created_at_block_height: Option) { + match self { + Document::V0(v0) => v0.created_at_block_height = created_at_block_height, + } + } + + fn set_updated_at_block_height(&mut self, updated_at_block_height: Option) { + match self { + Document::V0(v0) => v0.updated_at_block_height = updated_at_block_height, + } + } + + fn set_created_at_core_block_height(&mut self, created_at_core_block_height: Option) { + match self { + Document::V0(v0) => v0.created_at_core_block_height = created_at_core_block_height, + } + } + + fn set_updated_at_core_block_height(&mut self, updated_at_core_block_height: Option) { + match self { + Document::V0(v0) => v0.updated_at_core_block_height = updated_at_core_block_height, + } + } } diff --git a/packages/rs-dpp/src/document/accessors/v0/mod.rs b/packages/rs-dpp/src/document/accessors/v0/mod.rs index 0ae3b3acd3..08f8260723 100644 --- a/packages/rs-dpp/src/document/accessors/v0/mod.rs +++ b/packages/rs-dpp/src/document/accessors/v0/mod.rs @@ -38,6 +38,10 @@ pub trait DocumentV0Getters { fn id_ref(&self) -> &Identifier; fn owner_id_ref(&self) -> &Identifier; fn properties_consumed(self) -> BTreeMap; + fn created_at_block_height(&self) -> Option; + fn updated_at_block_height(&self) -> Option; + fn created_at_core_block_height(&self) -> Option; + fn updated_at_core_block_height(&self) -> Option; } pub trait DocumentV0Setters: DocumentV0Getters { @@ -123,4 +127,8 @@ pub trait DocumentV0Setters: DocumentV0Getters { self.properties_mut() .insert(property_name.to_string(), Value::Bytes(value)); } + fn set_created_at_block_height(&mut self, created_at_block_height: Option); + fn set_updated_at_block_height(&mut self, updated_at_block_height: Option); + fn set_created_at_core_block_height(&mut self, created_at_core_block_height: Option); + fn set_updated_at_core_block_height(&mut self, updated_at_core_block_height: Option); } diff --git a/packages/rs-dpp/src/document/document_factory/mod.rs b/packages/rs-dpp/src/document/document_factory/mod.rs index eed1368273..b026e80551 100644 --- a/packages/rs-dpp/src/document/document_factory/mod.rs +++ b/packages/rs-dpp/src/document/document_factory/mod.rs @@ -84,9 +84,12 @@ impl DocumentFactory { data: Value, ) -> Result { match self { - DocumentFactory::V0(v0) => { - v0.create_document(data_contract, owner_id, document_type_name, data) - } + DocumentFactory::V0(v0) => v0.create_document_without_time_based_properties( + data_contract, + owner_id, + document_type_name, + data, + ), } } diff --git a/packages/rs-dpp/src/document/document_factory/v0/mod.rs b/packages/rs-dpp/src/document/document_factory/v0/mod.rs index fdfe9bc248..d90199dc88 100644 --- a/packages/rs-dpp/src/document/document_factory/v0/mod.rs +++ b/packages/rs-dpp/src/document/document_factory/v0/mod.rs @@ -22,7 +22,7 @@ use crate::document::extended_document::v0::ExtendedDocumentV0; use crate::document::serialization_traits::DocumentPlatformConversionMethodsV0; #[cfg(feature = "extended-document")] use crate::document::ExtendedDocument; -use crate::prelude::TimestampMillis; +use crate::prelude::{BlockHeight, CoreBlockHeight, TimestampMillis}; #[cfg(feature = "state-transitions")] use crate::state_transition::documents_batch_transition::{ document_transition::{ @@ -91,6 +91,8 @@ impl DocumentFactoryV0 { &self, data_contract: &DataContract, owner_id: Identifier, + block_time: BlockHeight, + core_block_height: CoreBlockHeight, document_type_name: String, data: Value, ) -> Result { @@ -106,7 +108,43 @@ impl DocumentFactoryV0 { let document_type = data_contract.document_type_for_name(document_type_name.as_str())?; - document_type.create_document_from_data(data, owner_id, document_entropy, platform_version) + document_type.create_document_from_data( + data, + owner_id, + block_time, + core_block_height, + document_entropy, + platform_version, + ) + } + + pub fn create_document_without_time_based_properties( + &self, + data_contract: &DataContract, + owner_id: Identifier, + document_type_name: String, + data: Value, + ) -> Result { + let platform_version = PlatformVersion::get(self.protocol_version)?; + if !data_contract.has_document_type_for_name(&document_type_name) { + return Err(DataContractError::InvalidDocumentTypeError( + InvalidDocumentTypeError::new(document_type_name, data_contract.id()), + ) + .into()); + } + + let document_entropy = self.entropy_generator.generate()?; + + let document_type = data_contract.document_type_for_name(document_type_name.as_str())?; + + document_type.create_document_from_data( + data, + owner_id, + 0, + 0, + document_entropy, + platform_version, + ) } #[cfg(feature = "extended-document")] @@ -129,9 +167,12 @@ impl DocumentFactoryV0 { let document_type = data_contract.document_type_for_name(document_type_name.as_str())?; + // Extended documents are client side, so we don't need to fill in their timestamp properties let document = document_type.create_document_from_data( data, owner_id, + 0, + 0, document_entropy, platform_version, )?; diff --git a/packages/rs-dpp/src/document/document_methods/is_equal_ignoring_timestamps/v0/mod.rs b/packages/rs-dpp/src/document/document_methods/is_equal_ignoring_timestamps/v0/mod.rs index a209038657..660c26fb64 100644 --- a/packages/rs-dpp/src/document/document_methods/is_equal_ignoring_timestamps/v0/mod.rs +++ b/packages/rs-dpp/src/document/document_methods/is_equal_ignoring_timestamps/v0/mod.rs @@ -4,8 +4,14 @@ use crate::document::DocumentV0Getters; pub trait DocumentIsEqualIgnoringTimestampsV0: DocumentV0Getters + DocumentGetRawForDocumentTypeV0 { - /// Return a value given the path to its key and the document type for a contract. - fn is_equal_ignoring_timestamps_v0(&self, rhs: &Self) -> bool { + /// Checks to see if a document is equal without time based fields. + /// Since these fields are set on the network this function can be useful to make sure that + /// fields that were supplied have not changed, while ignoring those that are set network side. + /// Time based fields that are ignored are + /// created_at/updated_at + /// created_at_block_height/updated_at_block_height + /// created_at_core_block_height/updated_at_core_block_height + fn is_equal_ignoring_time_based_fields_v0(&self, rhs: &Self) -> bool { self.id() == rhs.id() && self.owner_id() == rhs.owner_id() && self.properties() == rhs.properties() diff --git a/packages/rs-dpp/src/document/document_methods/mod.rs b/packages/rs-dpp/src/document/document_methods/mod.rs index 0c786833a1..887d7f2642 100644 --- a/packages/rs-dpp/src/document/document_methods/mod.rs +++ b/packages/rs-dpp/src/document/document_methods/mod.rs @@ -42,8 +42,14 @@ pub trait DocumentMethodsV0 { fn increment_revision(&mut self) -> Result<(), ProtocolError>; - /// Returns if the documents are equal but ignoring the timestamp - fn is_equal_ignoring_timestamps( + /// Checks to see if a document is equal without time based fields. + /// Since these fields are set on the network this function can be useful to make sure that + /// fields that were supplied have not changed, while ignoring those that are set network side. + /// Time based fields that are ignored are + /// created_at/updated_at + /// created_at_block_height/updated_at_block_height + /// created_at_core_block_height/updated_at_core_block_height + fn is_equal_ignoring_time_based_fields( &self, rhs: &Self, platform_version: &PlatformVersion, diff --git a/packages/rs-dpp/src/document/extended_document/accessors.rs b/packages/rs-dpp/src/document/extended_document/accessors.rs index c051c7d79d..a471124d21 100644 --- a/packages/rs-dpp/src/document/extended_document/accessors.rs +++ b/packages/rs-dpp/src/document/extended_document/accessors.rs @@ -3,7 +3,7 @@ use crate::data_contract::DataContract; use crate::document::{Document, ExtendedDocument}; use crate::identity::TimestampMillis; use crate::metadata::Metadata; -use crate::prelude::Revision; +use crate::prelude::{BlockHeight, CoreBlockHeight, Revision}; use crate::ProtocolError; use platform_value::{Bytes32, Identifier, Value}; use std::collections::BTreeMap; @@ -56,6 +56,7 @@ impl ExtendedDocument { } /// Returns an optional reference to the document's creation timestamp in milliseconds. + /// It will be None if it is not required by the schema. pub fn created_at(&self) -> Option { match self { ExtendedDocument::V0(v0) => v0.created_at(), @@ -63,12 +64,45 @@ impl ExtendedDocument { } /// Returns an optional reference to the document's last update timestamp in milliseconds. + /// It will be None if it is not required by the schema. pub fn updated_at(&self) -> Option { match self { ExtendedDocument::V0(v0) => v0.updated_at(), } } + /// Returns an optional block height at which the document was created. + /// It will be None if it is not required by the schema. + pub fn created_at_block_height(&self) -> Option { + match self { + ExtendedDocument::V0(v0) => v0.created_at_block_height(), + } + } + + /// Returns an optional block height at which the document was last updated. + /// It will be None if it is not required by the schema. + pub fn updated_at_block_height(&self) -> Option { + match self { + ExtendedDocument::V0(v0) => v0.updated_at_block_height(), + } + } + + /// Returns an optional core block height at which the document was created. + /// It will be None if it is not required by the schema. + pub fn created_at_core_block_height(&self) -> Option { + match self { + ExtendedDocument::V0(v0) => v0.created_at_core_block_height(), + } + } + + /// Returns an optional core block height at which the document was last updated. + /// It will be None if it is not required by the schema. + pub fn updated_at_core_block_height(&self) -> Option { + match self { + ExtendedDocument::V0(v0) => v0.updated_at_core_block_height(), + } + } + /// Returns the document type name as a reference to a string. pub fn document_type_name(&self) -> &String { match self { diff --git a/packages/rs-dpp/src/document/extended_document/mod.rs b/packages/rs-dpp/src/document/extended_document/mod.rs index 582ff3d32a..a7fefc20bd 100644 --- a/packages/rs-dpp/src/document/extended_document/mod.rs +++ b/packages/rs-dpp/src/document/extended_document/mod.rs @@ -487,6 +487,22 @@ mod test { assert_eq!(init_doc.created_at(), doc.created_at()); assert_eq!(init_doc.updated_at(), doc.updated_at()); + assert_eq!( + init_doc.created_at_block_height(), + doc.created_at_block_height() + ); + assert_eq!( + init_doc.updated_at_block_height(), + doc.updated_at_block_height() + ); + assert_eq!( + init_doc.created_at_core_block_height(), + doc.created_at_core_block_height() + ); + assert_eq!( + init_doc.updated_at_core_block_height(), + doc.updated_at_core_block_height() + ); assert_eq!(init_doc.id(), doc.id()); assert_eq!(init_doc.data_contract_id(), doc.data_contract_id()); assert_eq!(init_doc.owner_id(), doc.owner_id()); @@ -531,7 +547,7 @@ mod test { let string = serde_json::to_string(&document)?; assert_eq!( - "{\"version\":0,\"$type\":\"domain\",\"$dataContractId\":\"566vcJkmebVCAb2Dkj2yVMSgGFcsshupnQqtsz1RFbcy\",\"document\":{\"$version\":\"0\",\"$id\":\"4veLBZPHDkaCPF9LfZ8fX3JZiS5q5iUVGhdBbaa9ga5E\",\"$ownerId\":\"HBNMY5QWuBVKNFLhgBTC1VmpEnscrmqKPMXpnYSHwhfn\",\"$dataContractId\":\"566vcJkmebVCAb2Dkj2yVMSgGFcsshupnQqtsz1RFbcy\",\"$protocolVersion\":0,\"$type\":\"domain\",\"label\":\"user-9999\",\"normalizedLabel\":\"user-9999\",\"normalizedParentDomainName\":\"dash\",\"preorderSalt\":\"BzQi567XVqc8wYiVHS887sJtL6MDbxLHNnp+UpTFSB0=\",\"records\":{\"dashUniqueIdentityId\":\"HBNMY5QWuBVKNFLhgBTC1VmpEnscrmqKPMXpnYSHwhfn\"},\"subdomainRules\":{\"allowSubdomains\":false},\"$revision\":1,\"$createdAt\":null,\"$updatedAt\":null}}", + "{\"version\":0,\"$type\":\"domain\",\"$dataContractId\":\"566vcJkmebVCAb2Dkj2yVMSgGFcsshupnQqtsz1RFbcy\",\"document\":{\"$version\":\"0\",\"$id\":\"4veLBZPHDkaCPF9LfZ8fX3JZiS5q5iUVGhdBbaa9ga5E\",\"$ownerId\":\"HBNMY5QWuBVKNFLhgBTC1VmpEnscrmqKPMXpnYSHwhfn\",\"$dataContractId\":\"566vcJkmebVCAb2Dkj2yVMSgGFcsshupnQqtsz1RFbcy\",\"$protocolVersion\":0,\"$type\":\"domain\",\"label\":\"user-9999\",\"normalizedLabel\":\"user-9999\",\"normalizedParentDomainName\":\"dash\",\"preorderSalt\":\"BzQi567XVqc8wYiVHS887sJtL6MDbxLHNnp+UpTFSB0=\",\"records\":{\"dashUniqueIdentityId\":\"HBNMY5QWuBVKNFLhgBTC1VmpEnscrmqKPMXpnYSHwhfn\"},\"subdomainRules\":{\"allowSubdomains\":false},\"$revision\":1,\"$createdAt\":null,\"$updatedAt\":null,\"$createdAtBlockHeight\":null,\"$updatedAtBlockHeight\":null,\"$createdAtCoreBlockHeight\":null,\"$updatedAtCoreBlockHeight\":null}}", string ); diff --git a/packages/rs-dpp/src/document/extended_document/v0/mod.rs b/packages/rs-dpp/src/document/extended_document/v0/mod.rs index ba5d88d3bd..918d190e14 100644 --- a/packages/rs-dpp/src/document/extended_document/v0/mod.rs +++ b/packages/rs-dpp/src/document/extended_document/v0/mod.rs @@ -14,7 +14,7 @@ use crate::document::extended_document::fields::property_names; use crate::document::{Document, DocumentV0Getters, ExtendedDocument}; use crate::identity::TimestampMillis; use crate::metadata::Metadata; -use crate::prelude::Revision; +use crate::prelude::{BlockHeight, CoreBlockHeight, Revision}; use crate::util::hash::hash_double_to_vec; use crate::ProtocolError; @@ -170,14 +170,42 @@ impl ExtendedDocumentV0 { self.document.revision() } + /// Returns an optional block timestamp at which the document was created. + /// It will be None if it is not required by the schema. pub fn created_at(&self) -> Option { self.document.created_at() } + /// Returns an optional block timestamp at which the document was updated. + /// It will be None if it is not required by the schema. pub fn updated_at(&self) -> Option { self.document.updated_at() } + /// Returns an optional block height at which the document was created. + /// It will be None if it is not required by the schema. + pub fn created_at_block_height(&self) -> Option { + self.document.created_at_block_height() + } + + /// Returns an optional block height at which the document was last updated. + /// It will be None if it is not required by the schema. + pub fn updated_at_block_height(&self) -> Option { + self.document.updated_at_block_height() + } + + /// Returns an optional core block height at which the document was created. + /// It will be None if it is not required by the schema. + pub fn created_at_core_block_height(&self) -> Option { + self.document.created_at_core_block_height() + } + + /// Returns an optional core block height at which the document was last updated. + /// It will be None if it is not required by the schema. + pub fn updated_at_core_block_height(&self) -> Option { + self.document.updated_at_core_block_height() + } + /// Create an extended document with additional information. /// /// # Arguments diff --git a/packages/rs-dpp/src/document/fields.rs b/packages/rs-dpp/src/document/fields.rs index efd49d69a5..3933bfeb10 100644 --- a/packages/rs-dpp/src/document/fields.rs +++ b/packages/rs-dpp/src/document/fields.rs @@ -7,6 +7,10 @@ pub mod property_names { pub const OWNER_ID: &str = "$ownerId"; pub const CREATED_AT: &str = "$createdAt"; pub const UPDATED_AT: &str = "$updatedAt"; + pub const CREATED_AT_BLOCK_HEIGHT: &str = "$createdAtBlockHeight"; + pub const UPDATED_AT_BLOCK_HEIGHT: &str = "$updatedAtBlockHeight"; + pub const CREATED_AT_CORE_BLOCK_HEIGHT: &str = "$createdAtCoreBlockHeight"; + pub const UPDATED_AT_CORE_BLOCK_HEIGHT: &str = "$updatedAtCoreBlockHeight"; } pub const IDENTIFIER_FIELDS: [&str; 3] = [ diff --git a/packages/rs-dpp/src/document/mod.rs b/packages/rs-dpp/src/document/mod.rs index bf088048c7..ad51973e5b 100644 --- a/packages/rs-dpp/src/document/mod.rs +++ b/packages/rs-dpp/src/document/mod.rs @@ -179,7 +179,7 @@ impl DocumentMethodsV0 for Document { Ok(()) } - fn is_equal_ignoring_timestamps( + fn is_equal_ignoring_time_based_fields( &self, rhs: &Self, platform_version: &PlatformVersion, @@ -192,9 +192,9 @@ impl DocumentMethodsV0 for Document { .document_method_versions .is_equal_ignoring_timestamps { - 0 => Ok(document_v0.is_equal_ignoring_timestamps_v0(rhs_v0)), + 0 => Ok(document_v0.is_equal_ignoring_time_based_fields_v0(rhs_v0)), version => Err(ProtocolError::UnknownVersionMismatch { - method: "DocumentMethodV0::is_equal_ignoring_timestamps".to_string(), + method: "DocumentMethodV0::is_equal_ignoring_time_based_fields".to_string(), known_versions: vec![0], received: version, }), diff --git a/packages/rs-dpp/src/document/specialized_document_factory/mod.rs b/packages/rs-dpp/src/document/specialized_document_factory/mod.rs index 1758e27ef1..2e8cd371cd 100644 --- a/packages/rs-dpp/src/document/specialized_document_factory/mod.rs +++ b/packages/rs-dpp/src/document/specialized_document_factory/mod.rs @@ -92,7 +92,7 @@ impl SpecializedDocumentFactory { ) -> Result { match self { SpecializedDocumentFactory::V0(v0) => { - v0.create_document(owner_id, document_type_name, data) + v0.create_document_without_time_based_properties(owner_id, document_type_name, data) } } } diff --git a/packages/rs-dpp/src/document/specialized_document_factory/v0/mod.rs b/packages/rs-dpp/src/document/specialized_document_factory/v0/mod.rs index 0d844c6ba6..525e93618d 100644 --- a/packages/rs-dpp/src/document/specialized_document_factory/v0/mod.rs +++ b/packages/rs-dpp/src/document/specialized_document_factory/v0/mod.rs @@ -21,7 +21,7 @@ use crate::document::extended_document::v0::ExtendedDocumentV0; use crate::document::serialization_traits::DocumentPlatformConversionMethodsV0; #[cfg(feature = "extended-document")] use crate::document::ExtendedDocument; -use crate::prelude::TimestampMillis; +use crate::prelude::{BlockHeight, CoreBlockHeight, TimestampMillis}; #[cfg(feature = "state-transitions")] use crate::state_transition::documents_batch_transition::{ document_transition::{ @@ -89,7 +89,38 @@ impl SpecializedDocumentFactoryV0 { entropy_generator, } } + pub fn create_document( + &self, + data_contract: &DataContract, + owner_id: Identifier, + block_time: BlockHeight, + core_block_height: CoreBlockHeight, + document_type_name: String, + data: Value, + ) -> Result { + let platform_version = PlatformVersion::get(self.protocol_version)?; + if !data_contract.has_document_type_for_name(&document_type_name) { + return Err(DataContractError::InvalidDocumentTypeError( + InvalidDocumentTypeError::new(document_type_name, data_contract.id()), + ) + .into()); + } + + let document_entropy = self.entropy_generator.generate()?; + + let document_type = data_contract.document_type_for_name(document_type_name.as_str())?; + + document_type.create_document_from_data( + data, + owner_id, + block_time, + core_block_height, + document_entropy, + platform_version, + ) + } + pub fn create_document_without_time_based_properties( &self, owner_id: Identifier, document_type_name: String, @@ -112,7 +143,14 @@ impl SpecializedDocumentFactoryV0 { .data_contract .document_type_for_name(document_type_name.as_str())?; - document_type.create_document_from_data(data, owner_id, document_entropy, platform_version) + document_type.create_document_from_data( + data, + owner_id, + 0, + 0, + document_entropy, + platform_version, + ) } #[cfg(feature = "extended-document")] pub fn create_extended_document( @@ -141,6 +179,8 @@ impl SpecializedDocumentFactoryV0 { let document = document_type.create_document_from_data( data, owner_id, + 0, + 0, document_entropy, platform_version, )?; diff --git a/packages/rs-dpp/src/document/v0/accessors.rs b/packages/rs-dpp/src/document/v0/accessors.rs index 857d65613a..fb924bf364 100644 --- a/packages/rs-dpp/src/document/v0/accessors.rs +++ b/packages/rs-dpp/src/document/v0/accessors.rs @@ -5,69 +5,219 @@ use platform_value::{Identifier, Value}; use std::collections::BTreeMap; impl DocumentV0Getters for DocumentV0 { + /// Returns the document's unique identifier. + /// + /// # Returns + /// An `Identifier` representing the unique ID of the document. fn id(&self) -> Identifier { self.id } + /// Returns the identifier of the document's owner. + /// + /// # Returns + /// An `Identifier` representing the owner's ID. fn owner_id(&self) -> Identifier { self.owner_id } + /// Provides a reference to the document's properties. + /// + /// # Returns + /// A reference to a `BTreeMap` containing the document's properties. fn properties(&self) -> &BTreeMap { &self.properties } + /// Provides a mutable reference to the document's properties. + /// + /// # Returns + /// A mutable reference to a `BTreeMap` containing the document's properties. fn properties_mut(&mut self) -> &mut BTreeMap { &mut self.properties } + /// Returns the document's revision, if it is part + /// of the document. The document will have this field if it's schema has this document type + /// as mutable. + /// + /// # Returns + /// An `Option` which is `Some(Revision)` if the document has a revision, or `None` if not. fn revision(&self) -> Option { self.revision } + /// Returns the timestamp of when the document was created, if it is part + /// of the document. The document will have this field if it's schema has it set as required. + /// + /// # Returns + /// An `Option` representing the creation time in milliseconds, or `None` if not available. fn created_at(&self) -> Option { self.created_at } + /// Returns the timestamp of the last update to the document, if it is part + /// of the document. The document will have this field if it's schema has it set as required. + /// + /// # Returns + /// An `Option` representing the update time in milliseconds, or `None` if not available. fn updated_at(&self) -> Option { self.updated_at } + /// Provides a reference to the document's unique identifier. + /// + /// # Returns + /// A reference to an `Identifier` representing the unique ID of the document. fn id_ref(&self) -> &Identifier { &self.id } + /// Provides a reference to the document's owner identifier. + /// + /// # Returns + /// A reference to an `Identifier` representing the owner's ID. fn owner_id_ref(&self) -> &Identifier { &self.owner_id } + /// Consumes the document and returns its properties. + /// + /// # Returns + /// A `BTreeMap` containing the document's properties. fn properties_consumed(self) -> BTreeMap { self.properties } + + /// Returns the block height at which the document was created, if it is part + /// of the document. The document will have this field if it's schema has it set as required. + /// + /// # Returns + /// An `Option` representing the creation block height, or `None` if not available. + fn created_at_block_height(&self) -> Option { + self.created_at_block_height + } + + /// Returns the block height at which the document was last updated, if it is part + /// of the document. The document will have this field if it's schema has it set as required. + /// + /// # Returns + /// An `Option` representing the update block height, or `None` if not available. + fn updated_at_block_height(&self) -> Option { + self.updated_at_block_height + } + + /// Returns the core network block height at which the document was created, if it is part + /// of the document. The document will have this field if it's schema has it set as required. + /// + /// # Returns + /// An `Option` representing the creation core block height, or `None` if not available. + fn created_at_core_block_height(&self) -> Option { + self.created_at_core_block_height + } + + /// Returns the core network block height at which the document was last updated, if it is part + /// of the document. The document will have this field if it's schema has it set as required. + /// + /// # Returns + /// An `Option` representing the update core block height, or `None` if not available. + fn updated_at_core_block_height(&self) -> Option { + self.updated_at_core_block_height + } } impl DocumentV0Setters for DocumentV0 { + /// Sets the document's unique identifier. + /// + /// # Parameters + /// - `id`: An `Identifier` to set as the document's unique ID. fn set_id(&mut self, id: Identifier) { self.id = id; } + /// Sets the identifier of the document's owner. + /// + /// # Parameters + /// - `owner_id`: An `Identifier` to set as the document's owner ID. fn set_owner_id(&mut self, owner_id: Identifier) { self.owner_id = owner_id; } + /// Sets the document's properties. + /// + /// # Parameters + /// - `properties`: A `BTreeMap` containing the properties to set for the document. fn set_properties(&mut self, properties: BTreeMap) { self.properties = properties; } + /// Sets the document's revision. This is applicable if the document's schema indicates + /// the document type as mutable. + /// + /// # Parameters + /// - `revision`: An `Option` to set as the document's revision. `None` indicates + /// the document does not have a revision. fn set_revision(&mut self, revision: Option) { self.revision = revision; } + /// Sets the timestamp of when the document was created. This is applicable if the document's + /// schema requires a creation timestamp. + /// + /// # Parameters + /// - `created_at`: An `Option` to set as the document's creation timestamp. + /// `None` indicates the timestamp is not available. fn set_created_at(&mut self, created_at: Option) { self.created_at = created_at; } + /// Sets the timestamp of the last update to the document. This is applicable if the document's + /// schema requires an update timestamp. + /// + /// # Parameters + /// - `updated_at`: An `Option` to set as the document's last update timestamp. + /// `None` indicates the timestamp is not available. fn set_updated_at(&mut self, updated_at: Option) { self.updated_at = updated_at; } + + /// Sets the block height at which the document was created. This is applicable if the document's + /// schema requires this information. + /// + /// # Parameters + /// - `created_at_block_height`: An `Option` to set as the document's creation block height. + /// `None` indicates the block height is not available. + fn set_created_at_block_height(&mut self, created_at_block_height: Option) { + self.created_at_block_height = created_at_block_height; + } + + /// Sets the block height at which the document was last updated. This is applicable if the document's + /// schema requires this information. + /// + /// # Parameters + /// - `updated_at_block_height`: An `Option` to set as the document's last update block height. + /// `None` indicates the block height is not available. + fn set_updated_at_block_height(&mut self, updated_at_block_height: Option) { + self.updated_at_block_height = updated_at_block_height; + } + + /// Sets the core network block height at which the document was created. This is applicable if the + /// document's schema requires this information. + /// + /// # Parameters + /// - `created_at_core_block_height`: An `Option` to set as the document's creation core block height. + /// `None` indicates the core block height is not available. + fn set_created_at_core_block_height(&mut self, created_at_core_block_height: Option) { + self.created_at_core_block_height = created_at_core_block_height; + } + + /// Sets the core network block height at which the document was last updated. This is applicable if the + /// document's schema requires this information. + /// + /// # Parameters + /// - `updated_at_core_block_height`: An `Option` to set as the document's last update core block height. + /// `None` indicates the core block height is not available. + fn set_updated_at_core_block_height(&mut self, updated_at_core_block_height: Option) { + self.updated_at_core_block_height = updated_at_core_block_height; + } } diff --git a/packages/rs-dpp/src/document/v0/cbor_conversion.rs b/packages/rs-dpp/src/document/v0/cbor_conversion.rs index fc02148b3a..2791de5e32 100644 --- a/packages/rs-dpp/src/document/v0/cbor_conversion.rs +++ b/packages/rs-dpp/src/document/v0/cbor_conversion.rs @@ -1,7 +1,7 @@ use crate::document::property_names; use crate::identity::TimestampMillis; -use crate::prelude::Revision; +use crate::prelude::{BlockHeight, CoreBlockHeight, Revision}; use crate::ProtocolError; @@ -41,6 +41,16 @@ pub struct DocumentForCbor { pub created_at: Option, #[serde(rename = "$updatedAt")] pub updated_at: Option, + + #[serde(rename = "$createdAtBlockHeight")] + pub created_at_block_height: Option, + #[serde(rename = "$updatedAtBlockHeight")] + pub updated_at_block_height: Option, + + #[serde(rename = "$createdAtCoreBlockHeight")] + pub created_at_core_block_height: Option, + #[serde(rename = "$updatedAtCoreBlockHeight")] + pub updated_at_core_block_height: Option, } #[cfg(feature = "cbor")] @@ -55,6 +65,10 @@ impl TryFrom for DocumentForCbor { revision, created_at, updated_at, + created_at_block_height, + updated_at_block_height, + created_at_core_block_height, + updated_at_core_block_height, } = value; Ok(DocumentForCbor { id: id.to_buffer(), @@ -64,6 +78,10 @@ impl TryFrom for DocumentForCbor { revision, created_at, updated_at, + created_at_block_height, + updated_at_block_height, + created_at_core_block_height, + updated_at_core_block_height, }) } } @@ -94,6 +112,14 @@ impl DocumentV0 { let created_at = document_map.remove_optional_integer(property_names::CREATED_AT)?; let updated_at = document_map.remove_optional_integer(property_names::UPDATED_AT)?; + let created_at_block_height = + document_map.remove_optional_integer(property_names::CREATED_AT_BLOCK_HEIGHT)?; + let updated_at_block_height = + document_map.remove_optional_integer(property_names::UPDATED_AT_BLOCK_HEIGHT)?; + let created_at_core_block_height = + document_map.remove_optional_integer(property_names::CREATED_AT_CORE_BLOCK_HEIGHT)?; + let updated_at_core_block_height = + document_map.remove_optional_integer(property_names::UPDATED_AT_CORE_BLOCK_HEIGHT)?; // dev-note: properties is everything other than the id and owner id Ok(DocumentV0 { @@ -103,6 +129,10 @@ impl DocumentV0 { revision, created_at, updated_at, + created_at_block_height, + updated_at_block_height, + created_at_core_block_height, + updated_at_core_block_height, }) } } diff --git a/packages/rs-dpp/src/document/v0/json_conversion.rs b/packages/rs-dpp/src/document/v0/json_conversion.rs index ea4fc8d046..87c1718a86 100644 --- a/packages/rs-dpp/src/document/v0/json_conversion.rs +++ b/packages/rs-dpp/src/document/v0/json_conversion.rs @@ -33,6 +33,33 @@ impl<'a> DocumentJsonMethodsV0<'a> for DocumentV0 { JsonValue::Number(updated_at.into()), ); } + if let Some(created_at_block_height) = self.created_at_block_height { + value_mut.insert( + property_names::CREATED_AT_BLOCK_HEIGHT.to_string(), + JsonValue::Number(created_at_block_height.into()), + ); + } + + if let Some(updated_at_block_height) = self.updated_at_block_height { + value_mut.insert( + property_names::UPDATED_AT_BLOCK_HEIGHT.to_string(), + JsonValue::Number(updated_at_block_height.into()), + ); + } + + if let Some(created_at_core_block_height) = self.created_at_core_block_height { + value_mut.insert( + property_names::CREATED_AT_CORE_BLOCK_HEIGHT.to_string(), + JsonValue::Number(created_at_core_block_height.into()), + ); + } + + if let Some(updated_at_core_block_height) = self.updated_at_core_block_height { + value_mut.insert( + property_names::UPDATED_AT_CORE_BLOCK_HEIGHT.to_string(), + JsonValue::Number(updated_at_core_block_height.into()), + ); + } if let Some(revision) = self.revision { value_mut.insert( property_names::REVISION.to_string(), @@ -84,6 +111,18 @@ impl<'a> DocumentJsonMethodsV0<'a> for DocumentV0 { if let Ok(value) = document_value.remove(property_names::UPDATED_AT) { document.updated_at = serde_json::from_value(value)? } + if let Ok(value) = document_value.remove(property_names::CREATED_AT_BLOCK_HEIGHT) { + document.created_at_block_height = serde_json::from_value(value)?; + } + if let Ok(value) = document_value.remove(property_names::UPDATED_AT_BLOCK_HEIGHT) { + document.updated_at_block_height = serde_json::from_value(value)?; + } + if let Ok(value) = document_value.remove(property_names::CREATED_AT_CORE_BLOCK_HEIGHT) { + document.created_at_core_block_height = serde_json::from_value(value)?; + } + if let Ok(value) = document_value.remove(property_names::UPDATED_AT_CORE_BLOCK_HEIGHT) { + document.updated_at_core_block_height = serde_json::from_value(value)?; + } let platform_value: Value = document_value.into(); diff --git a/packages/rs-dpp/src/document/v0/mod.rs b/packages/rs-dpp/src/document/v0/mod.rs index 241de1d145..c67f2cf676 100644 --- a/packages/rs-dpp/src/document/v0/mod.rs +++ b/packages/rs-dpp/src/document/v0/mod.rs @@ -25,8 +25,8 @@ use crate::document::document_methods::{ }; use crate::identity::TimestampMillis; -use crate::prelude::Identifier; use crate::prelude::Revision; +use crate::prelude::{BlockHeight, CoreBlockHeight, Identifier}; /// Documents contain the data that goes into data contracts. #[derive(Clone, Debug, PartialEq, Default)] @@ -41,24 +41,48 @@ pub struct DocumentV0 { /// The document's properties (data). #[cfg_attr(feature = "document-serde-conversion", serde(flatten))] pub properties: BTreeMap, - /// The document revision. + /// The document revision, if the document is mutable. #[cfg_attr( feature = "document-serde-conversion", serde(rename = "$revision", default) )] pub revision: Option, - /// The time in milliseconds that the document was created + /// The time in milliseconds that the document was created, if it is set as required by the document type schema. #[cfg_attr( feature = "document-serde-conversion", serde(rename = "$createdAt", default) )] pub created_at: Option, - /// The time in milliseconds that the document was last updated + /// The time in milliseconds that the document was last updated, if it is set as required by the document type schema. #[cfg_attr( feature = "document-serde-conversion", serde(rename = "$updatedAt", default) )] pub updated_at: Option, + /// The block that the document was created, if it is set as required by the document type schema. + #[cfg_attr( + feature = "document-serde-conversion", + serde(rename = "$createdAtBlockHeight", default) + )] + pub created_at_block_height: Option, + /// The block that the document was last updated, if it is set as required by the document type schema. + #[cfg_attr( + feature = "document-serde-conversion", + serde(rename = "$updatedAtBlockHeight", default) + )] + pub updated_at_block_height: Option, + /// The core block that the document was created, if it is set as required by the document type schema. + #[cfg_attr( + feature = "document-serde-conversion", + serde(rename = "$createdAtCoreBlockHeight", default) + )] + pub created_at_core_block_height: Option, + /// The core block that the document was last updated, if it is set as required by the document type schema. + #[cfg_attr( + feature = "document-serde-conversion", + serde(rename = "$updatedAtCoreBlockHeight", default) + )] + pub updated_at_core_block_height: Option, } impl DocumentGetRawForContractV0 for DocumentV0 { @@ -90,6 +114,27 @@ impl fmt::Display for DocumentV0 { write!(f, "updated_at:{} ", datetime.format("%Y-%m-%d %H:%M:%S"))?; } + if let Some(created_at_block_height) = self.created_at_block_height { + write!(f, "created_at_block_height:{} ", created_at_block_height)?; + } + if let Some(updated_at_block_height) = self.updated_at_block_height { + write!(f, "updated_at_block_height:{} ", updated_at_block_height)?; + } + if let Some(created_at_core_block_height) = self.created_at_core_block_height { + write!( + f, + "created_at_core_block_height:{} ", + created_at_core_block_height + )?; + } + if let Some(updated_at_core_block_height) = self.updated_at_core_block_height { + write!( + f, + "updated_at_core_block_height:{} ", + updated_at_core_block_height + )?; + } + if self.properties.is_empty() { write!(f, "no properties")?; } else { diff --git a/packages/rs-dpp/src/document/v0/serialize.rs b/packages/rs-dpp/src/document/v0/serialize.rs index 79c26d7ee0..b13ec9e46f 100644 --- a/packages/rs-dpp/src/document/v0/serialize.rs +++ b/packages/rs-dpp/src/document/v0/serialize.rs @@ -1,7 +1,10 @@ use crate::data_contract::document_type::DocumentTypeRef; use crate::data_contract::errors::DataContractError; -use crate::document::property_names::{CREATED_AT, UPDATED_AT}; +use crate::document::property_names::{ + CREATED_AT, CREATED_AT_BLOCK_HEIGHT, CREATED_AT_CORE_BLOCK_HEIGHT, UPDATED_AT, + UPDATED_AT_BLOCK_HEIGHT, UPDATED_AT_CORE_BLOCK_HEIGHT, +}; #[cfg(feature = "validation")] use crate::prelude::ConsensusValidationResult; @@ -53,45 +56,99 @@ impl DocumentPlatformSerializationMethodsV0 for DocumentV0 { buffer.extend((1 as Revision).encode_var_vec()) } + let mut bitwise_exists_flag: u8 = 0; + + let mut time_fields_data_buffer = vec![]; + // $createdAt if let Some(created_at) = &self.created_at { - if !document_type.required_fields().contains(CREATED_AT) { - buffer.push(1); - } + bitwise_exists_flag |= 1; // dbg!("we pushed created at {}", hex::encode(created_at.to_be_bytes())); - buffer.extend(created_at.to_be_bytes()); + time_fields_data_buffer.extend(created_at.to_be_bytes()); } else if document_type.required_fields().contains(CREATED_AT) { return Err(ProtocolError::DataContractError( DataContractError::MissingRequiredKey( "created at field is not present".to_string(), ), )); - } else { - // dbg!("we pushed created at with 0"); - // We don't have the created_at that wasn't required - buffer.push(0); } // $updatedAt if let Some(updated_at) = &self.updated_at { - if !document_type.required_fields().contains(UPDATED_AT) { - // dbg!("we added 1", field_name); - buffer.push(1); - } + bitwise_exists_flag |= 2; // dbg!("we pushed updated at {}", hex::encode(updated_at.to_be_bytes())); - buffer.extend(updated_at.to_be_bytes()); + time_fields_data_buffer.extend(updated_at.to_be_bytes()); } else if document_type.required_fields().contains(UPDATED_AT) { return Err(ProtocolError::DataContractError( DataContractError::MissingRequiredKey( "updated at field is not present".to_string(), ), )); - } else { - // dbg!("we pushed updated at with 0"); - // We don't have the updated_at that wasn't required - buffer.push(0); } + // $createdAtBlockHeight + if let Some(created_at_block_height) = &self.created_at_block_height { + bitwise_exists_flag |= 4; + time_fields_data_buffer.extend(created_at_block_height.to_be_bytes()); + } else if document_type + .required_fields() + .contains(CREATED_AT_BLOCK_HEIGHT) + { + return Err(ProtocolError::DataContractError( + DataContractError::MissingRequiredKey( + "created_at_block_height field is not present".to_string(), + ), + )); + } + + // $updatedAtBlockHeight + if let Some(updated_at_block_height) = &self.updated_at_block_height { + bitwise_exists_flag |= 8; + time_fields_data_buffer.extend(updated_at_block_height.to_be_bytes()); + } else if document_type + .required_fields() + .contains(UPDATED_AT_BLOCK_HEIGHT) + { + return Err(ProtocolError::DataContractError( + DataContractError::MissingRequiredKey( + "updated_at_block_height field is not present".to_string(), + ), + )); + } + + // $createdAtCoreBlockHeight + if let Some(created_at_core_block_height) = &self.created_at_core_block_height { + bitwise_exists_flag |= 16; + time_fields_data_buffer.extend(created_at_core_block_height.to_be_bytes()); + } else if document_type + .required_fields() + .contains(CREATED_AT_CORE_BLOCK_HEIGHT) + { + return Err(ProtocolError::DataContractError( + DataContractError::MissingRequiredKey( + "created_at_core_block_height field is not present".to_string(), + ), + )); + } + + // $updatedAtCoreBlockHeight + if let Some(updated_at_core_block_height) = &self.updated_at_core_block_height { + bitwise_exists_flag |= 32; + time_fields_data_buffer.extend(updated_at_core_block_height.to_be_bytes()); + } else if document_type + .required_fields() + .contains(UPDATED_AT_CORE_BLOCK_HEIGHT) + { + return Err(ProtocolError::DataContractError( + DataContractError::MissingRequiredKey( + "updated_at_core_block_height field is not present".to_string(), + ), + )); + } + + buffer.push(bitwise_exists_flag); + buffer.append(&mut time_fields_data_buffer); + // User defined properties document_type .properties() @@ -160,46 +217,99 @@ impl DocumentPlatformSerializationMethodsV0 for DocumentV0 { if let Some(revision) = self.revision { buffer.extend(revision.to_be_bytes()) } + let mut bitwise_exists_flag: u8 = 0; + + let mut time_fields_data_buffer = vec![]; // $createdAt - if let Some(created_at) = self.created_at { - if !document_type.required_fields().contains(CREATED_AT) { - buffer.push(1); - } + if let Some(created_at) = &self.created_at { + bitwise_exists_flag |= 1; // dbg!("we pushed created at {}", hex::encode(created_at.to_be_bytes())); - buffer.extend(created_at.to_be_bytes()); + time_fields_data_buffer.extend(created_at.to_be_bytes()); } else if document_type.required_fields().contains(CREATED_AT) { return Err(ProtocolError::DataContractError( DataContractError::MissingRequiredKey( "created at field is not present".to_string(), ), )); - } else { - // dbg!("we pushed created at with 0"); - // We don't have the created_at that wasn't required - buffer.push(0); } // $updatedAt - if let Some(updated_at) = self.updated_at { - if !document_type.required_fields().contains(UPDATED_AT) { - // dbg!("we added 1", field_name); - buffer.push(1); - } + if let Some(updated_at) = &self.updated_at { + bitwise_exists_flag |= 2; // dbg!("we pushed updated at {}", hex::encode(updated_at.to_be_bytes())); - buffer.extend(updated_at.to_be_bytes()); + time_fields_data_buffer.extend(updated_at.to_be_bytes()); } else if document_type.required_fields().contains(UPDATED_AT) { return Err(ProtocolError::DataContractError( DataContractError::MissingRequiredKey( "updated at field is not present".to_string(), ), )); - } else { - // dbg!("we pushed updated at with 0"); - // We don't have the updated_at that wasn't required - buffer.push(0); } + // $createdAtBlockHeight + if let Some(created_at_block_height) = &self.created_at_block_height { + bitwise_exists_flag |= 4; + time_fields_data_buffer.extend(created_at_block_height.to_be_bytes()); + } else if document_type + .required_fields() + .contains(CREATED_AT_BLOCK_HEIGHT) + { + return Err(ProtocolError::DataContractError( + DataContractError::MissingRequiredKey( + "created_at_block_height field is not present".to_string(), + ), + )); + } + + // $updatedAtBlockHeight + if let Some(updated_at_block_height) = &self.updated_at_block_height { + bitwise_exists_flag |= 8; + time_fields_data_buffer.extend(updated_at_block_height.to_be_bytes()); + } else if document_type + .required_fields() + .contains(UPDATED_AT_BLOCK_HEIGHT) + { + return Err(ProtocolError::DataContractError( + DataContractError::MissingRequiredKey( + "updated_at_block_height field is not present".to_string(), + ), + )); + } + + // $createdAtCoreBlockHeight + if let Some(created_at_core_block_height) = &self.created_at_core_block_height { + bitwise_exists_flag |= 16; + time_fields_data_buffer.extend(created_at_core_block_height.to_be_bytes()); + } else if document_type + .required_fields() + .contains(CREATED_AT_CORE_BLOCK_HEIGHT) + { + return Err(ProtocolError::DataContractError( + DataContractError::MissingRequiredKey( + "created_at_core_block_height field is not present".to_string(), + ), + )); + } + + // $updatedAtCoreBlockHeight + if let Some(updated_at_core_block_height) = &self.updated_at_core_block_height { + bitwise_exists_flag |= 32; + time_fields_data_buffer.extend(updated_at_core_block_height.to_be_bytes()); + } else if document_type + .required_fields() + .contains(UPDATED_AT_CORE_BLOCK_HEIGHT) + { + return Err(ProtocolError::DataContractError( + DataContractError::MissingRequiredKey( + "updated_at_core_block_height field is not present".to_string(), + ), + )); + } + + buffer.push(bitwise_exists_flag); + buffer.append(&mut time_fields_data_buffer); + // User defined properties document_type .properties() @@ -294,9 +404,73 @@ impl DocumentPlatformDeserializationMethodsV0 for DocumentV0 { None }; - // $createdAt - let created_at = read_timestamp(&mut buf, document_type, CREATED_AT)?; - let updated_at = read_timestamp(&mut buf, document_type, UPDATED_AT)?; + let timestamp_flags = buf.read_u8().map_err(|_| { + DataContractError::CorruptedSerialization( + "error reading timestamp flags from serialized document".to_string(), + ) + })?; + + let created_at = if timestamp_flags & 1 > 0 { + Some(buf.read_u64::().map_err(|_| { + DataContractError::CorruptedSerialization( + "error reading created_at timestamp from serialized document".to_string(), + ) + })?) + } else { + None + }; + + let updated_at = if timestamp_flags & 2 > 0 { + Some(buf.read_u64::().map_err(|_| { + DataContractError::CorruptedSerialization( + "error reading updated_at timestamp from serialized document".to_string(), + ) + })?) + } else { + None + }; + + let created_at_block_height = if timestamp_flags & 4 > 0 { + Some(buf.read_u64::().map_err(|_| { + DataContractError::CorruptedSerialization( + "error reading created_at_block_height from serialized document".to_string(), + ) + })?) + } else { + None + }; + + let updated_at_block_height = if timestamp_flags & 8 > 0 { + Some(buf.read_u64::().map_err(|_| { + DataContractError::CorruptedSerialization( + "error reading updated_at_block_height from serialized document".to_string(), + ) + })?) + } else { + None + }; + + let created_at_core_block_height = if timestamp_flags & 16 > 0 { + Some(buf.read_u32::().map_err(|_| { + DataContractError::CorruptedSerialization( + "error reading created_at_core_block_height from serialized document" + .to_string(), + ) + })?) + } else { + None + }; + + let updated_at_core_block_height = if timestamp_flags & 32 > 0 { + Some(buf.read_u32::().map_err(|_| { + DataContractError::CorruptedSerialization( + "error reading updated_at_core_block_height from serialized document" + .to_string(), + ) + })?) + } else { + None + }; let mut finished_buffer = false; @@ -334,36 +508,14 @@ impl DocumentPlatformDeserializationMethodsV0 for DocumentV0 { revision, created_at, updated_at, + created_at_block_height, + updated_at_block_height, + created_at_core_block_height, + updated_at_core_block_height, }) } } -fn read_timestamp( - buf: &mut BufReader<&[u8]>, - document_type: DocumentTypeRef, - property_name: &str, -) -> Result, DataContractError> { - if !document_type.required_fields().contains(property_name) { - let marker = buf.read_u8().map_err(|_| { - DataContractError::CorruptedSerialization( - "error reading created at optional byte from serialized document".to_string(), - ) - })?; - - if marker == 0 { - return Ok(None); - } - } - - let timestamp = buf.read_u64::().map_err(|_| { - DataContractError::CorruptedSerialization( - "error reading created at from serialized document".to_string(), - ) - })?; - - Ok(Some(timestamp)) -} - impl DocumentPlatformConversionMethodsV0 for DocumentV0 { /// Serializes the document. /// diff --git a/packages/rs-dpp/src/lib.rs b/packages/rs-dpp/src/lib.rs index 1ebf54d0a7..b2e8d074b7 100644 --- a/packages/rs-dpp/src/lib.rs +++ b/packages/rs-dpp/src/lib.rs @@ -62,6 +62,10 @@ pub mod prelude { pub use crate::identity::IdentityPublicKey; #[cfg(feature = "validation")] pub use crate::validation::ConsensusValidationResult; + + pub type BlockHeight = u64; + + pub type CoreBlockHeight = u32; pub type TimestampMillis = u64; pub type Revision = u64; pub type IdentityNonce = u64; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/mod.rs index f9900da9c0..2af4a2174f 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/mod.rs @@ -3,9 +3,9 @@ pub mod from_document; pub mod v0; mod v0_methods; -use crate::data_contract::DataContract; +use crate::block::block_info::BlockInfo; +use crate::data_contract::document_type::DocumentTypeRef; use crate::document::Document; -use crate::identity::TimestampMillis; use crate::state_transition::documents_batch_transition::document_create_transition::v0::DocumentFromCreateTransitionV0; use crate::ProtocolError; use bincode::{Decode, Encode}; @@ -40,10 +40,8 @@ pub trait DocumentFromCreateTransition { /// /// * `document_create_transition` - A reference to the `DocumentCreateTransition` containing information about the document being created. /// * `owner_id` - The `Identifier` of the document's owner. - /// * `block_time` - The timestamp (in milliseconds) representing when the document creation is being processed. - /// * `requires_created_at` - A boolean indicating if a `created_at` timestamp is required for the document. - /// * `requires_updated_at` - A boolean indicating if an `updated_at` timestamp is required for the document. - /// * `data_contract` - A reference to the `DataContract` associated with this document, defining its structure and rules. + /// * `block_info` - The block info containing information about the current block such as block time, block height and core block height. + /// * `document_type` - A reference to the `DocumentTypeRef` associated with this document, defining its structure and rules. /// * `platform_version` - A reference to the `PlatformVersion` indicating the version of the platform for compatibility. /// /// # Returns @@ -52,10 +50,8 @@ pub trait DocumentFromCreateTransition { fn try_from_create_transition( document_create_transition: &DocumentCreateTransition, owner_id: Identifier, - block_time: TimestampMillis, - requires_created_at: bool, - requires_updated_at: bool, - data_contract: &DataContract, + block_info: &BlockInfo, + document_type: &DocumentTypeRef, platform_version: &PlatformVersion, ) -> Result where @@ -67,10 +63,8 @@ pub trait DocumentFromCreateTransition { /// /// * `document_create_transition` - A `DocumentCreateTransition` instance containing information about the document being created. /// * `owner_id` - The `Identifier` of the document's owner. - /// * `block_time` - The timestamp (in milliseconds) representing when the document creation is being processed. - /// * `requires_created_at` - A boolean indicating if a `created_at` timestamp is required for the document. - /// * `requires_updated_at` - A boolean indicating if an `updated_at` timestamp is required for the document. - /// * `data_contract` - A reference to the `DataContract` associated with this document, defining its structure and rules. + /// * `block_info` - The block info containing information about the current block such as block time, block height and core block height. + /// * `document_type` - A reference to the `DocumentTypeRef` associated with this document, defining its structure and rules. /// * `platform_version` - A reference to the `PlatformVersion` indicating the version of the platform for compatibility. /// /// # Returns @@ -79,10 +73,8 @@ pub trait DocumentFromCreateTransition { fn try_from_owned_create_transition( document_create_transition: DocumentCreateTransition, owner_id: Identifier, - block_time: TimestampMillis, - requires_created_at: bool, - requires_updated_at: bool, - data_contract: &DataContract, + block_info: &BlockInfo, + document_type: &DocumentTypeRef, platform_version: &PlatformVersion, ) -> Result where @@ -93,10 +85,8 @@ impl DocumentFromCreateTransition for Document { fn try_from_create_transition( document_create_transition: &DocumentCreateTransition, owner_id: Identifier, - block_time: TimestampMillis, - requires_created_at: bool, - requires_updated_at: bool, - data_contract: &DataContract, + block_info: &BlockInfo, + document_type: &DocumentTypeRef, platform_version: &PlatformVersion, ) -> Result where @@ -106,10 +96,8 @@ impl DocumentFromCreateTransition for Document { DocumentCreateTransition::V0(v0) => Self::try_from_create_transition_v0( v0, owner_id, - block_time, - requires_created_at, - requires_updated_at, - data_contract, + block_info, + document_type, platform_version, ), } @@ -118,10 +106,8 @@ impl DocumentFromCreateTransition for Document { fn try_from_owned_create_transition( document_create_transition: DocumentCreateTransition, owner_id: Identifier, - block_time: TimestampMillis, - requires_created_at: bool, - requires_updated_at: bool, - data_contract: &DataContract, + block_info: &BlockInfo, + document_type: &DocumentTypeRef, platform_version: &PlatformVersion, ) -> Result where @@ -131,10 +117,8 @@ impl DocumentFromCreateTransition for Document { DocumentCreateTransition::V0(v0) => Self::try_from_owned_create_transition_v0( v0, owner_id, - block_time, - requires_created_at, - requires_updated_at, - data_contract, + block_info, + document_type, platform_version, ), } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/mod.rs index 37c1159b2a..52cc32c665 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/mod.rs @@ -13,12 +13,15 @@ use std::collections::BTreeMap; use std::string::ToString; -use crate::identity::TimestampMillis; +#[cfg(feature = "state-transition-value-conversion")] +use crate::data_contract::DataContract; -use crate::{data_contract::DataContract, errors::ProtocolError}; +use crate::{document, errors::ProtocolError}; -use crate::data_contract::accessors::v0::DataContractV0Getters; +use crate::block::block_info::BlockInfo; +use crate::data_contract::document_type::accessors::DocumentTypeV0Getters; use crate::data_contract::document_type::methods::DocumentTypeV0Methods; +use crate::data_contract::document_type::DocumentTypeRef; use crate::document::{Document, DocumentV0}; use crate::state_transition::documents_batch_transition::document_base_transition::v0::DocumentBaseTransitionV0; #[cfg(feature = "state-transition-value-conversion")] @@ -152,44 +155,52 @@ impl DocumentCreateTransitionV0 { /// documents from create transition v0 pub trait DocumentFromCreateTransitionV0 { - /// Attempts to create a new `Document` from the given `DocumentCreateTransition` instance and `owner_id`. + /// Attempts to create a new `Document` from the given `DocumentCreateTransitionV0` instance, incorporating additional metadata such as ownership and block information. + /// + /// This function is responsible for taking an owned `DocumentCreateTransitionV0` instance, which encapsulates the initial data for a document, and augmenting this with metadata including the document owner's identifier, block information, and the requirement status of `created_at` and `updated_at` timestamps, as dictated by the associated data contract and the current platform version. /// /// # Arguments /// - /// * `value` - A `DocumentCreateTransition` instance containing information about the document being created. - /// * `owner_id` - The `Identifier` of the document's owner. + /// * `v0` - An owned `DocumentCreateTransitionV0` instance containing the initial data for the document being created. + /// * `owner_id` - The `Identifier` of the document's owner, specifying who will own the newly created document. + /// * `block_info` - A reference to the `BlockInfo`, which provides context about the block height and other block-related metadata at the time of document creation. + /// * `document_type` - A reference to the `DocumentTypeRef` associated with this document, defining its structure and rules. + /// * `platform_version` - A reference to the `PlatformVersion`, which may influence the creation process or validation logic based on the version-specific rules or features of the platform. /// /// # Returns /// - /// * `Result` - A new `Document` object if successful, otherwise a `ProtocolError`. + /// * `Result` - On successful creation, returns a new `Document` object populated with the provided data and augmented with necessary metadata. If the creation process encounters any validation failures or other issues, it returns a `ProtocolError`. + /// fn try_from_owned_create_transition_v0( v0: DocumentCreateTransitionV0, owner_id: Identifier, - block_time: TimestampMillis, - requires_created_at: bool, - requires_updated_at: bool, - data_contract: &DataContract, + block_info: &BlockInfo, + document_type: &DocumentTypeRef, platform_version: &PlatformVersion, ) -> Result where Self: Sized; - /// Attempts to create a new `Document` from the given `DocumentCreateTransition` reference and `owner_id`. + /// Attempts to create a new `Document` from the given `DocumentCreateTransitionV0` reference, incorporating additional metadata like ownership and block information. + /// + /// This function takes a `DocumentCreateTransitionV0` reference, which contains the initial data for the document, and combines it with metadata such as the document owner's identifier, block information, and requirements for timestamp fields based on the associated data contract and platform version. /// /// # Arguments /// - /// * `value` - A reference to the `DocumentCreateTransitionActionV0` containing information about the document being created. + /// * `v0` - A reference to the `DocumentCreateTransitionV0` containing initial data for the document being created. /// * `owner_id` - The `Identifier` of the document's owner. + /// * `block_info` - A reference to the `BlockInfo` containing the block height at which the document is being created. + /// * `document_type` - A reference to the `DocumentTypeRef` associated with this document, defining its structure and rules. + /// * `platform_version` - A reference to the `PlatformVersion` indicating the version of the platform under which the document is being created. /// /// # Returns /// - /// * `Result` - A new `Document` object if successful, otherwise a `ProtocolError`. + /// * `Result` - A new `Document` object if successful, populated with the provided data and metadata. Returns a `ProtocolError` if the creation fails due to issues like missing required fields, incorrect types, or other validation failures. + /// fn try_from_create_transition_v0( v0: &DocumentCreateTransitionV0, owner_id: Identifier, - block_time: TimestampMillis, - requires_created_at: bool, - requires_updated_at: bool, - data_contract: &DataContract, + block_info: &BlockInfo, + document_type: &DocumentTypeRef, platform_version: &PlatformVersion, ) -> Result where @@ -200,10 +211,8 @@ impl DocumentFromCreateTransitionV0 for Document { fn try_from_owned_create_transition_v0( v0: DocumentCreateTransitionV0, owner_id: Identifier, - block_time: TimestampMillis, - requires_created_at: bool, - requires_updated_at: bool, - data_contract: &DataContract, + block_info: &BlockInfo, + document_type: &DocumentTypeRef, platform_version: &PlatformVersion, ) -> Result where @@ -213,22 +222,58 @@ impl DocumentFromCreateTransitionV0 for Document { match base { DocumentBaseTransition::V0(base_v0) => { - let DocumentBaseTransitionV0 { - id, - document_type_name, - .. - } = base_v0; - - let document_type = - data_contract.document_type_for_name(document_type_name.as_str())?; + let DocumentBaseTransitionV0 { id, .. } = base_v0; + + let requires_created_at = document_type + .required_fields() + .contains(document::property_names::CREATED_AT); + let requires_updated_at = document_type + .required_fields() + .contains(document::property_names::UPDATED_AT); + + let requires_created_at_block_height = document_type + .required_fields() + .contains(document::property_names::CREATED_AT_BLOCK_HEIGHT); + let requires_updated_at_block_height = document_type + .required_fields() + .contains(document::property_names::UPDATED_AT_BLOCK_HEIGHT); + + let requires_created_at_core_block_height = document_type + .required_fields() + .contains(document::property_names::CREATED_AT_CORE_BLOCK_HEIGHT); + let requires_updated_at_core_block_height = document_type + .required_fields() + .contains(document::property_names::UPDATED_AT_CORE_BLOCK_HEIGHT); let created_at = if requires_created_at { - Some(block_time) + Some(block_info.time_ms) } else { None }; let updated_at = if requires_updated_at { - Some(block_time) + Some(block_info.time_ms) + } else { + None + }; + + let created_at_block_height = if requires_created_at_block_height { + Some(block_info.height) + } else { + None + }; + let updated_at_block_height = if requires_updated_at_block_height { + Some(block_info.height) + } else { + None + }; + + let created_at_core_block_height = if requires_created_at_core_block_height { + Some(block_info.core_height) + } else { + None + }; + let updated_at_core_block_height = if requires_updated_at_core_block_height { + Some(block_info.core_height) } else { None }; @@ -245,6 +290,10 @@ impl DocumentFromCreateTransitionV0 for Document { revision: document_type.initial_revision(), created_at, updated_at, + created_at_block_height, + updated_at_block_height, + created_at_core_block_height, + updated_at_core_block_height, } .into()), version => Err(ProtocolError::UnknownVersionMismatch { @@ -260,10 +309,8 @@ impl DocumentFromCreateTransitionV0 for Document { fn try_from_create_transition_v0( v0: &DocumentCreateTransitionV0, owner_id: Identifier, - block_time: TimestampMillis, - requires_created_at: bool, - requires_updated_at: bool, - data_contract: &DataContract, + block_info: &BlockInfo, + document_type: &DocumentTypeRef, platform_version: &PlatformVersion, ) -> Result where @@ -273,22 +320,58 @@ impl DocumentFromCreateTransitionV0 for Document { match base { DocumentBaseTransition::V0(base_v0) => { - let DocumentBaseTransitionV0 { - id, - document_type_name, - .. - } = base_v0; - - let document_type = - data_contract.document_type_for_name(document_type_name.as_str())?; + let DocumentBaseTransitionV0 { id, .. } = base_v0; + + let requires_created_at = document_type + .required_fields() + .contains(document::property_names::CREATED_AT); + let requires_updated_at = document_type + .required_fields() + .contains(document::property_names::UPDATED_AT); + + let requires_created_at_block_height = document_type + .required_fields() + .contains(document::property_names::CREATED_AT_BLOCK_HEIGHT); + let requires_updated_at_block_height = document_type + .required_fields() + .contains(document::property_names::UPDATED_AT_BLOCK_HEIGHT); + + let requires_created_at_core_block_height = document_type + .required_fields() + .contains(document::property_names::CREATED_AT_CORE_BLOCK_HEIGHT); + let requires_updated_at_core_block_height = document_type + .required_fields() + .contains(document::property_names::UPDATED_AT_CORE_BLOCK_HEIGHT); let created_at = if requires_created_at { - Some(block_time) + Some(block_info.time_ms) } else { None }; let updated_at = if requires_updated_at { - Some(block_time) + Some(block_info.time_ms) + } else { + None + }; + + let created_at_block_height = if requires_created_at_block_height { + Some(block_info.height) + } else { + None + }; + let updated_at_block_height = if requires_updated_at_block_height { + Some(block_info.height) + } else { + None + }; + + let created_at_core_block_height = if requires_created_at_core_block_height { + Some(block_info.core_height) + } else { + None + }; + let updated_at_core_block_height = if requires_updated_at_core_block_height { + Some(block_info.core_height) } else { None }; @@ -305,6 +388,10 @@ impl DocumentFromCreateTransitionV0 for Document { revision: document_type.initial_revision(), created_at, updated_at, + created_at_block_height, + updated_at_block_height, + created_at_core_block_height, + updated_at_core_block_height, } .into()), version => Err(ProtocolError::UnknownVersionMismatch { diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/mod.rs index d0bb9694df..ddfebec72a 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/mod.rs @@ -2,7 +2,10 @@ mod from_document; pub mod v0; pub mod v0_methods; +use crate::block::block_info::BlockInfo; +use crate::data_contract::document_type::DocumentTypeRef; use crate::document::Document; +use crate::prelude::{BlockHeight, CoreBlockHeight, TimestampMillis}; use crate::ProtocolError; use bincode::{Decode, Encode}; use derive_more::{Display, From}; @@ -24,51 +27,71 @@ pub enum DocumentReplaceTransition { /// document from replace transition pub trait DocumentFromReplaceTransition { - /// Attempts to create a new `Document` from the given `DocumentReplaceTransition` reference, `owner_id`, and additional metadata. + /// Attempts to create a new `Document` from the given `DocumentReplaceTransition` reference, incorporating `owner_id`, creation metadata, and additional blockchain-related information. + /// + /// This method is designed to replace an existing document with new information, while also preserving and incorporating specific metadata about the document's creation and update history. /// /// # Arguments /// - /// * `document_replace_transition_action` - A reference to the `DocumentReplaceTransition` containing information about the document being replaced. + /// * `document_replace_transition_action` - A reference to the `DocumentReplaceTransition` containing the new information for the document being replaced. /// * `owner_id` - The `Identifier` of the document's owner. - /// * `created_at` - An optional timestamp representing when the document was created. - /// * `block_time` - The timestamp representing the blockchain time at which the document was updated. - /// * `requires_updated_at` - A boolean indicating if an `updated_at` timestamp is required for the document. - /// * `platform_version` - A reference to the `PlatformVersion` indicating the version of the platform for compatibility. + /// * `created_at` - An optional timestamp indicating when the original document was created. + /// * `created_at_block_height` - An optional block height indicating when the original document was created. + /// * `created_at_core_block_height` - An optional core block height indicating when the original document was created. + /// * `block_info` - Current block information used for updating document metadata. + /// * `document_type` - Reference to the document type to ensure compatibility and proper validation. + /// * `platform_version` - Reference to the current platform version to check for compatibility and apply version-specific logic. /// /// # Returns /// - /// * `Result` - A new `Document` object if successful, otherwise a `ProtocolError`. + /// * `Result` - On successful document replacement, returns a new `Document` object populated with the provided data and metadata. On failure, returns a `ProtocolError` detailing the issue. + /// + /// # Errors + /// + /// This function may return `ProtocolError` if there are validation errors related to document data, missing required metadata, or incompatibilities with the current platform version. fn try_from_replace_transition( document_replace_transition_action: &DocumentReplaceTransition, owner_id: Identifier, - created_at: Option, - block_time: u64, - requires_updated_at: bool, + created_at: Option, + created_at_block_height: Option, + created_at_core_block_height: Option, + block_info: &BlockInfo, + document_type: &DocumentTypeRef, platform_version: &PlatformVersion, ) -> Result where Self: Sized; - /// Attempts to create a new `Document` from the given `DocumentReplaceTransition` instance, `owner_id`, and additional metadata. + /// Attempts to create a new `Document` from the given `DocumentReplaceTransition` instance, incorporating `owner_id`, creation metadata, and additional blockchain-related information. + /// + /// This method functions similarly to `try_from_replace_transition`, but it consumes the `DocumentReplaceTransition` instance, making it suitable for use cases where the transition is not needed after document creation. /// /// # Arguments /// - /// * `document_replace_transition_action` - A `DocumentReplaceTransition` instance containing information about the document being replaced. + /// * `document_replace_transition_action` - An owned `DocumentReplaceTransition` instance containing the new information for the document being replaced. /// * `owner_id` - The `Identifier` of the document's owner. - /// * `created_at` - An optional timestamp representing when the document was created. - /// * `block_time` - The timestamp representing the blockchain time at which the document was updated. - /// * `requires_updated_at` - A boolean indicating if an `updated_at` timestamp is required for the document. - /// * `platform_version` - A reference to the `PlatformVersion` indicating the version of the platform for compatibility. + /// * `created_at` - An optional timestamp indicating when the original document was created. + /// * `created_at_block_height` - An optional block height indicating when the original document was created. + /// * `created_at_core_block_height` - An optional core block height indicating when the original document was created. + /// * `block_info` - Current block information used for updating document metadata. + /// * `document_type` - Reference to the document type to ensure compatibility and proper validation. + /// * `platform_version` - Reference to the current platform version to check for compatibility and apply version-specific logic. /// /// # Returns /// - /// * `Result` - A new `Document` object if successful, otherwise a `ProtocolError`. + /// * `Result` - On successful document replacement, returns a new `Document` object. On failure, returns a `ProtocolError` detailing the issue. + /// + /// # Errors + /// + /// This function may return `ProtocolError` for the same reasons as `try_from_replace_transition`, including validation failures, missing metadata, or platform incompatibilities. fn try_from_owned_replace_transition( document_replace_transition_action: DocumentReplaceTransition, owner_id: Identifier, - created_at: Option, - block_time: u64, - requires_updated_at: bool, + created_at: Option, + created_at_block_height: Option, + created_at_core_block_height: Option, + block_info: &BlockInfo, + document_type: &DocumentTypeRef, platform_version: &PlatformVersion, ) -> Result where @@ -79,9 +102,11 @@ impl DocumentFromReplaceTransition for Document { fn try_from_replace_transition( document_replace_transition: &DocumentReplaceTransition, owner_id: Identifier, - created_at: Option, - block_time: u64, - requires_updated_at: bool, + created_at: Option, + created_at_block_height: Option, + created_at_core_block_height: Option, + block_info: &BlockInfo, + document_type: &DocumentTypeRef, platform_version: &PlatformVersion, ) -> Result { match document_replace_transition { @@ -89,8 +114,10 @@ impl DocumentFromReplaceTransition for Document { v0, owner_id, created_at, - block_time, - requires_updated_at, + created_at_block_height, + created_at_core_block_height, + block_info, + document_type, platform_version, ), } @@ -99,9 +126,11 @@ impl DocumentFromReplaceTransition for Document { fn try_from_owned_replace_transition( document_replace_transition: DocumentReplaceTransition, owner_id: Identifier, - created_at: Option, - block_time: u64, - requires_updated_at: bool, + created_at: Option, + created_at_block_height: Option, + created_at_core_block_height: Option, + block_info: &BlockInfo, + document_type: &DocumentTypeRef, platform_version: &PlatformVersion, ) -> Result { match document_replace_transition { @@ -109,8 +138,10 @@ impl DocumentFromReplaceTransition for Document { v0, owner_id, created_at, - block_time, - requires_updated_at, + created_at_block_height, + created_at_core_block_height, + block_info, + document_type, platform_version, ), } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/mod.rs index 3e651751f1..0af9315b29 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/mod.rs @@ -1,7 +1,7 @@ mod from_document; pub mod v0_methods; -use crate::prelude::Revision; +use crate::prelude::{BlockHeight, CoreBlockHeight, Revision, TimestampMillis}; use bincode::{Decode, Encode}; use derive_more::Display; @@ -9,8 +9,11 @@ use platform_value::{Identifier, Value}; #[cfg(feature = "state-transition-serde-conversion")] use serde::{Deserialize, Serialize}; +use crate::block::block_info::BlockInfo; +use crate::data_contract::document_type::accessors::DocumentTypeV0Getters; +use crate::data_contract::document_type::DocumentTypeRef; use crate::document::{Document, DocumentV0}; -use crate::ProtocolError; +use crate::{document, ProtocolError}; use platform_version::version::PlatformVersion; use std::collections::BTreeMap; @@ -247,44 +250,66 @@ pub struct DocumentReplaceTransitionV0 { /// document from replace transition v0 pub trait DocumentFromReplaceTransitionV0 { - /// Attempts to create a new `Document` from the given `DocumentReplaceTransitionV0` reference and `owner_id`. + /// Attempts to create a new `Document` from the given `DocumentReplaceTransitionV0` reference. This operation is typically used to replace or update an existing document with new information. /// /// # Arguments /// - /// * `value` - A reference to the `DocumentReplaceTransitionAction` containing information about the document being created. + /// * `value` - A reference to the `DocumentReplaceTransitionV0` containing the new information for the document. /// * `owner_id` - The `Identifier` of the document's owner. - /// * `created_at` - The time if it exists that the original document was created. + /// * `created_at` - An optional timestamp representing when the original document was created. This is preserved during replacement. + /// * `created_at_block_height` - An optional height of the block at which the original document was created. This is preserved during replacement. + /// * `created_at_core_block_height` - An optional core block height at which the original document was created. This is preserved during replacement. + /// * `block_info` - Information about the current block at the time of this replace transition. + /// * `document_type` - A reference to the `DocumentTypeRef` indicating the type of the document being replaced. + /// * `platform_version` - A reference to the `PlatformVersion` indicating the version of the platform under which the document is being replaced. /// /// # Returns /// - /// * `Result` - A new `Document` object if successful, otherwise a `ProtocolError`. + /// * `Result` - On successful replacement, returns a new `Document` object populated with the provided data. Returns a `ProtocolError` if the replacement fails due to validation errors or other issues. + /// + /// # Errors + /// + /// This function may return a `ProtocolError` if validation fails, required fields are missing, or if there are mismatches between field types and the schema defined in the data contract. fn try_from_replace_transition_v0( value: &DocumentReplaceTransitionV0, owner_id: Identifier, - created_at: Option, - block_time: u64, - requires_updated_at: bool, + created_at: Option, + created_at_block_height: Option, + created_at_core_block_height: Option, + block_info: &BlockInfo, + document_type: &DocumentTypeRef, platform_version: &PlatformVersion, ) -> Result where Self: Sized; - /// Attempts to create a new `Document` from the given `DocumentReplaceTransitionV0` instance and `owner_id`. + /// Attempts to create a new `Document` from the given `DocumentReplaceTransitionV0` instance. This function is similar to `try_from_replace_transition_v0` but consumes the `DocumentReplaceTransitionV0` instance, making it suitable for scenarios where the transition is owned and should not be reused after document creation. /// /// # Arguments /// - /// * `value` - A `DocumentReplaceTransitionAction` instance containing information about the document being created. + /// * `value` - An owned `DocumentReplaceTransitionV0` instance containing the new information for the document. /// * `owner_id` - The `Identifier` of the document's owner. - /// * `created_at` - The time if it exists that the original document was created. + /// * `created_at` - An optional timestamp representing when the original document was created. This is preserved during replacement. + /// * `created_at_block_height` - An optional height of the block at which the original document was created. This is preserved during replacement. + /// * `created_at_core_block_height` - An optional core block height at which the original document was created. This is preserved during replacement. + /// * `block_info` - Information about the current block at the time of this replace transition. + /// * `document_type` - A reference to the `DocumentTypeRef` indicating the type of the document being replaced. + /// * `platform_version` - A reference to the `PlatformVersion` indicating the version of the platform under which the document is being replaced. /// /// # Returns /// - /// * `Result` - A new `Document` object if successful, otherwise a `ProtocolError`. + /// * `Result` - On successful replacement, returns a new `Document` object populated with the provided data. Returns a `ProtocolError` if the replacement fails due to validation errors or other issues. + /// + /// # Errors + /// + /// This function may return a `ProtocolError` for the same reasons as `try_from_replace_transition_v0`, including validation failures, missing required fields, or schema mismatches. fn try_from_owned_replace_transition_v0( value: DocumentReplaceTransitionV0, owner_id: Identifier, - created_at: Option, - block_time: u64, - requires_updated_at: bool, + created_at: Option, + created_at_block_height: Option, + created_at_core_block_height: Option, + block_info: &BlockInfo, + document_type: &DocumentTypeRef, platform_version: &PlatformVersion, ) -> Result where @@ -295,9 +320,11 @@ impl DocumentFromReplaceTransitionV0 for Document { fn try_from_replace_transition_v0( value: &DocumentReplaceTransitionV0, owner_id: Identifier, - created_at: Option, - block_time: u64, - requires_updated_at: bool, + created_at: Option, + created_at_block_height: Option, + created_at_core_block_height: Option, + block_info: &BlockInfo, + document_type: &DocumentTypeRef, platform_version: &PlatformVersion, ) -> Result { let DocumentReplaceTransitionV0 { @@ -308,8 +335,32 @@ impl DocumentFromReplaceTransitionV0 for Document { let id = base.id(); + let requires_updated_at = document_type + .required_fields() + .contains(document::property_names::UPDATED_AT); + + let requires_updated_at_block_height = document_type + .required_fields() + .contains(document::property_names::UPDATED_AT_BLOCK_HEIGHT); + + let requires_updated_at_core_block_height = document_type + .required_fields() + .contains(document::property_names::UPDATED_AT_CORE_BLOCK_HEIGHT); + let updated_at = if requires_updated_at { - Some(block_time) + Some(block_info.time_ms) + } else { + None + }; + + let updated_at_block_height = if requires_updated_at_block_height { + Some(block_info.height) + } else { + None + }; + + let updated_at_core_block_height = if requires_updated_at_core_block_height { + Some(block_info.core_height) } else { None }; @@ -326,6 +377,10 @@ impl DocumentFromReplaceTransitionV0 for Document { revision: Some(*revision), created_at, updated_at, + created_at_block_height, + updated_at_block_height, + created_at_core_block_height, + updated_at_core_block_height, } .into()), version => Err(ProtocolError::UnknownVersionMismatch { @@ -339,9 +394,11 @@ impl DocumentFromReplaceTransitionV0 for Document { fn try_from_owned_replace_transition_v0( value: DocumentReplaceTransitionV0, owner_id: Identifier, - created_at: Option, - block_time: u64, - requires_updated_at: bool, + created_at: Option, + created_at_block_height: Option, + created_at_core_block_height: Option, + block_info: &BlockInfo, + document_type: &DocumentTypeRef, platform_version: &PlatformVersion, ) -> Result { let DocumentReplaceTransitionV0 { @@ -352,12 +409,35 @@ impl DocumentFromReplaceTransitionV0 for Document { let id = base.id(); + let requires_updated_at = document_type + .required_fields() + .contains(document::property_names::UPDATED_AT); + + let requires_updated_at_block_height = document_type + .required_fields() + .contains(document::property_names::UPDATED_AT_BLOCK_HEIGHT); + + let requires_updated_at_core_block_height = document_type + .required_fields() + .contains(document::property_names::UPDATED_AT_CORE_BLOCK_HEIGHT); + let updated_at = if requires_updated_at { - Some(block_time) + Some(block_info.time_ms) + } else { + None + }; + + let updated_at_block_height = if requires_updated_at_block_height { + Some(block_info.height) } else { None }; + let updated_at_core_block_height = if requires_updated_at_core_block_height { + Some(block_info.core_height) + } else { + None + }; match platform_version .dpp .document_versions @@ -370,6 +450,10 @@ impl DocumentFromReplaceTransitionV0 for Document { revision: Some(revision), created_at, updated_at, + created_at_block_height, + updated_at_block_height, + created_at_core_block_height, + updated_at_core_block_height, } .into()), version => Err(ProtocolError::UnknownVersionMismatch { diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs index 740913bdfb..e561f10c81 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs @@ -6,9 +6,9 @@ use crate::document::{Document, DocumentV0Getters}; use crate::identity::signer::Signer; #[cfg(feature = "state-transition-signing")] use crate::identity::SecurityLevel; +use crate::prelude::IdentityNonce; #[cfg(feature = "state-transition-signing")] use crate::prelude::IdentityPublicKey; -use crate::prelude::IdentityNonce; #[cfg(feature = "state-transition-signing")] use crate::prelude::UserFeeIncrease; use crate::state_transition::documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; diff --git a/packages/rs-dpp/src/tests/fixtures/get_documents_fixture.rs b/packages/rs-dpp/src/tests/fixtures/get_documents_fixture.rs index ed44af2ffa..647203d72e 100644 --- a/packages/rs-dpp/src/tests/fixtures/get_documents_fixture.rs +++ b/packages/rs-dpp/src/tests/fixtures/get_documents_fixture.rs @@ -211,6 +211,8 @@ pub fn get_withdrawal_document_fixture( document_type.create_document_with_prevalidated_properties( id, owner_id, + 0, + 0, properties, platform_version, ) diff --git a/packages/rs-dpp/src/tests/json_document.rs b/packages/rs-dpp/src/tests/json_document.rs index d3f021f450..75addad411 100644 --- a/packages/rs-dpp/src/tests/json_document.rs +++ b/packages/rs-dpp/src/tests/json_document.rs @@ -140,6 +140,10 @@ pub fn json_document_to_document( revision: data.remove_optional_integer("$revision")?, created_at: data.remove_optional_integer("$createdAt")?, updated_at: data.remove_optional_integer("$updatedAt")?, + created_at_block_height: data.remove_optional_integer("$createdAtBlockHeight")?, + updated_at_block_height: data.remove_optional_integer("$updatedAtBlockHeight")?, + created_at_core_block_height: data.remove_optional_integer("$createdAtCoreBlockHeight")?, + updated_at_core_block_height: data.remove_optional_integer("$updatedAtCoreBlockHeight")?, }; data.replace_at_paths( diff --git a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs index 130ab04e8c..a73edfafad 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs @@ -255,6 +255,10 @@ impl Platform { revision: None, created_at: None, updated_at: None, + created_at_block_height: None, + updated_at_block_height: None, + created_at_core_block_height: None, + updated_at_core_block_height: None, } .into(); @@ -309,8 +313,8 @@ mod tests { assert_eq!( root_hash, [ - 48, 165, 165, 234, 103, 120, 205, 238, 156, 93, 195, 194, 17, 242, 245, 101, - 176, 129, 137, 59, 185, 249, 76, 104, 217, 226, 66, 115, 67, 226, 235, 180 + 234, 164, 235, 118, 224, 151, 97, 37, 216, 180, 69, 227, 187, 186, 178, 82, + 251, 35, 184, 238, 104, 188, 106, 117, 182, 210, 91, 97, 218, 177, 130, 64 ] ) } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs index a9c83da52f..64f5d94939 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs @@ -370,6 +370,12 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition // In this case we don't care about the created at let original_document_created_at = original_document.created_at(); + let original_document_created_at_block_height = + original_document.created_at_block_height(); + + let original_document_created_at_core_block_height = + original_document.created_at_core_block_height(); + let validation_result = Self::check_ownership_of_old_replaced_document_v0( document_replace_transition, original_document, @@ -400,7 +406,9 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition DocumentReplaceTransitionAction::try_from_borrowed_document_replace_transition( document_replace_transition, original_document_created_at, - block_info.time_ms, + original_document_created_at_block_height, + original_document_created_at_core_block_height, + block_info, |_identifier| Ok(data_contract_fetch_info.clone()), )?; diff --git a/packages/rs-drive-abci/src/query/proofs/v0/mod.rs b/packages/rs-drive-abci/src/query/proofs/v0/mod.rs index 992fd62060..5e3ab97726 100644 --- a/packages/rs-drive-abci/src/query/proofs/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/proofs/v0/mod.rs @@ -258,14 +258,12 @@ mod tests { let (platform, state, version) = setup_platform(); let request = GetProofsRequestV0 { - identities: vec![ - IdentityRequest { - identity_id: vec![0; 32], - request_type: 0, - } - ], + identities: vec![IdentityRequest { + identity_id: vec![0; 32], + request_type: 0, + }], contracts: vec![ContractRequest { - contract_id: vec![0; 32] + contract_id: vec![0; 32], }], documents: vec![DocumentRequest { contract_id: vec![0; 32], diff --git a/packages/rs-drive-abci/src/test/helpers/fee_pools.rs b/packages/rs-drive-abci/src/test/helpers/fee_pools.rs index d54805b332..3d1373377a 100644 --- a/packages/rs-drive-abci/src/test/helpers/fee_pools.rs +++ b/packages/rs-drive-abci/src/test/helpers/fee_pools.rs @@ -84,6 +84,10 @@ fn create_test_mn_share_document( revision: Some(INITIAL_REVISION), created_at: None, updated_at: None, + created_at_block_height: None, + updated_at_block_height: None, + created_at_core_block_height: None, + updated_at_core_block_height: None, } .into(); diff --git a/packages/rs-drive-abci/tests/strategy_tests/main.rs b/packages/rs-drive-abci/tests/strategy_tests/main.rs index 4bd72e50bf..390e244f84 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/main.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/main.rs @@ -1151,7 +1151,7 @@ mod tests { .unwrap() .unwrap() ), - "b91e7b8759189050aa92a00dc5fb240689bb0a58e3a2388c80f8d18156d4eb0b".to_string() + "6e2987b90789a80ebd2afbc7fc6f86925e504c5f06aad2fbe3982c12d8fbea8b".to_string() ) } @@ -1722,7 +1722,7 @@ mod tests { .unwrap() .unwrap() ), - "2200b6da58af74075a6280091d94ad13773e3f7847e4e230b5d5398ede9cf8a5".to_string() + "8797928259c0545f1f12d945b56db05c9e3f9a9511be8e984ef6e505dad50135".to_string() ) } @@ -1843,7 +1843,7 @@ mod tests { .unwrap() .unwrap() ), - "87ea052870576604c828f0675517942942f577dcc6fe51d2aff57b062682c899".to_string() + "e98075d5d775e0ae9eca7d4c062999076185ff7e71910a65fb0dc10d4bbffd7f".to_string() ) } diff --git a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs index b5c08eafb8..963d48260e 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs @@ -538,7 +538,9 @@ impl NetworkStrategy { .random_documents_with_params( count as u32, current_identities, - block_info.time_ms, + Some(block_info.time_ms), + Some(block_info.height), + Some(block_info.core_height), *fill_type, *fill_size, rng, @@ -633,7 +635,9 @@ impl NetworkStrategy { .random_documents_with_params( count as u32, &held_identity, - block_info.time_ms, + Some(block_info.time_ms), + Some(block_info.height), + Some(block_info.core_height), *fill_type, *fill_size, rng, @@ -645,7 +649,9 @@ impl NetworkStrategy { .random_documents_with_params( count as u32, current_identities, - block_info.time_ms, + Some(block_info.time_ms), + Some(block_info.height), + Some(block_info.core_height), *fill_type, *fill_size, rng, diff --git a/packages/rs-drive-proof-verifier/src/proof.rs b/packages/rs-drive-proof-verifier/src/proof.rs index a29702445a..ee085aca69 100644 --- a/packages/rs-drive-proof-verifier/src/proof.rs +++ b/packages/rs-drive-proof-verifier/src/proof.rs @@ -16,7 +16,7 @@ use dapi_grpc::platform::{ v0::{self as platform, key_request_type, KeyRequestType as GrpcKeyType}, VersionedGrpcResponse, }; -use dpp::block::epoch::EpochIndex; +use dpp::block::epoch::{EpochIndex, MAX_EPOCH}; use dpp::block::extended_epoch_info::ExtendedEpochInfo; use dpp::dashcore::hashes::Hash; use dpp::dashcore::ProTxHash; @@ -30,6 +30,7 @@ use drive::drive::identity::key::fetch::{ IdentityKeysRequest, KeyKindRequestType, KeyRequestType, PurposeU8, SecurityLevelU8, }; +use dpp::block::block_info::BlockInfo; use drive::drive::Drive; use drive::error::proof::ProofError; use drive::query::DriveQuery; @@ -801,7 +802,18 @@ impl FromProof for StateTransitionPro error: e.to_string(), })?; - let mtd = response.metadata().or(Err(Error::EmptyResponseMetadata))?; + let metadata = response.metadata().or(Err(Error::EmptyResponseMetadata))?; + + if metadata.epoch > MAX_EPOCH as u32 { + return Err(drive::error::Error::Proof(ProofError::InvalidMetadata(format!("platform returned an epoch {} that was higher that maximum of a 16 bit integer", metadata.epoch))).into()); + } + + let block_info = BlockInfo { + time_ms: metadata.time_ms, + height: metadata.height, + core_height: metadata.core_chain_locked_height, + epoch: (metadata.epoch as u16).try_into()?, + }; let known_contracts_provider_fn = |id: &Identifier| -> Result>, drive::error::Error> { @@ -812,7 +824,7 @@ impl FromProof for StateTransitionPro let (root_hash, result) = Drive::verify_state_transition_was_executed_with_proof( &state_transition, - mtd.time_ms, + &block_info, &proof.grovedb_proof, &known_contracts_provider_fn, platform_version, @@ -821,9 +833,9 @@ impl FromProof for StateTransitionPro error: e.to_string(), })?; - verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + verify_tenderdash_proof(proof, metadata, &root_hash, provider)?; - Ok((Some(result), mtd.clone())) + Ok((Some(result), metadata.clone())) } } diff --git a/packages/rs-drive/src/drive/document/delete/mod.rs b/packages/rs-drive/src/drive/document/delete/mod.rs index 89d77501c6..7e224f4970 100644 --- a/packages/rs-drive/src/drive/document/delete/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/mod.rs @@ -836,8 +836,8 @@ mod tests { / Epoch::new(0) .unwrap() .cost_for_known_cost_item(StorageDiskUsageCreditPerByte); - // We added 1557 bytes - assert_eq!(added_bytes, 1557); + // We added 1558 bytes + assert_eq!(added_bytes, 1558); let document_id = bs58::decode("AM47xnyLfTAC9f61ZQPGfMK5Datk2FeYZwgYvcAnzqFY") .into_vec() @@ -866,14 +866,14 @@ mod tests { .get(&0) .unwrap(); - assert_eq!(*removed_credits, 41827688); + assert_eq!(*removed_credits, 41854792); let refund_equivalent_bytes = removed_credits.to_unsigned() / Epoch::new(0) .unwrap() .cost_for_known_cost_item(StorageDiskUsageCreditPerByte); assert!(added_bytes > refund_equivalent_bytes); - assert_eq!(refund_equivalent_bytes, 1549); // we refunded 1549 instead of 1556 + assert_eq!(refund_equivalent_bytes, 1550); // we refunded 1550 instead of 1558 } #[test] @@ -932,8 +932,8 @@ mod tests { / Epoch::new(0) .unwrap() .cost_for_known_cost_item(StorageDiskUsageCreditPerByte); - // We added 1553 bytes - assert_eq!(added_bytes, 1557); + // We added 1558 bytes + assert_eq!(added_bytes, 1558); let document_id = bs58::decode("AM47xnyLfTAC9f61ZQPGfMK5Datk2FeYZwgYvcAnzqFY") .into_vec() diff --git a/packages/rs-drive/src/drive/document/insert/mod.rs b/packages/rs-drive/src/drive/document/insert/mod.rs index 6fb720e255..f25f5aa302 100644 --- a/packages/rs-drive/src/drive/document/insert/mod.rs +++ b/packages/rs-drive/src/drive/document/insert/mod.rs @@ -391,11 +391,11 @@ mod tests { assert_eq!( fee_result, FeeResult { - storage_fee: 1303 + storage_fee: 1304 * Epoch::new(0) .unwrap() .cost_for_known_cost_item(StorageDiskUsageCreditPerByte), - processing_fee: 1481210, + processing_fee: 1481610, ..Default::default() } ); @@ -460,8 +460,8 @@ mod tests { / Epoch::new(0) .unwrap() .cost_for_known_cost_item(StorageDiskUsageCreditPerByte); - assert_eq!(1303, added_bytes); - assert_eq!(142936000, processing_fee); + assert_eq!(1304, added_bytes); + assert_eq!(142936400, processing_fee); } #[test] @@ -683,11 +683,11 @@ mod tests { assert_eq!( fee_result, FeeResult { - storage_fee: 1761 + storage_fee: 1760 * Epoch::new(0) .unwrap() .cost_for_known_cost_item(StorageDiskUsageCreditPerByte), - processing_fee: 2069390, + processing_fee: 2068990, ..Default::default() } ); diff --git a/packages/rs-drive/src/drive/document/update/mod.rs b/packages/rs-drive/src/drive/document/update/mod.rs index edf3fac3a1..da170ee4b9 100644 --- a/packages/rs-drive/src/drive/document/update/mod.rs +++ b/packages/rs-drive/src/drive/document/update/mod.rs @@ -111,6 +111,8 @@ mod tests { platform_value!({"displayName": "Alice"}), Identifier::random(), random(), + random(), + random(), platform_version, ) .expect("should create document"); @@ -185,6 +187,8 @@ mod tests { platform_value!({"displayName": "Alice"}), Identifier::random(), random(), + random(), + random(), platform_version, ) .expect("should create document"); @@ -279,6 +283,8 @@ mod tests { platform_value!({"displayName": "Alice"}), Identifier::random(), random(), + random(), + random(), platform_version, ) .expect("should create document"); @@ -387,6 +393,8 @@ mod tests { platform_value!({"displayName": "Alice"}), Identifier::random(), random(), + random(), + random(), platform_version, ) .expect("should create document"); @@ -898,7 +906,7 @@ mod tests { .serialize_consume(document_type, platform_version) .expect("expected to serialize document"); - assert_eq!(document_serialized.len(), 120); + assert_eq!(document_serialized.len(), 119); let original_fees = apply_person( &drive, &contract, @@ -913,10 +921,10 @@ mod tests { .unwrap() .cost_for_known_cost_item(StorageDiskUsageCreditPerByte); let expected_added_bytes = if using_history { - //Explanation for 1236 + //Explanation for 1237 //todo - 1238 + 1237 } else { //Explanation for 959 @@ -932,13 +940,13 @@ mod tests { // 32 bytes for the unique id // 1 byte for key_size (required space for 64) - // Value -> 224 + // Value -> 223 // 1 for the flag option with flags // 1 for the flags size // 35 for flags 32 + 1 + 2 // 1 for the enum type // 1 for item - // 118 for item serialized bytes (verified above) + // 117 for item serialized bytes (verified above) // 1 for Basic Merk // 32 for node hash // 32 for value hash @@ -1051,7 +1059,7 @@ mod tests { //// 359 + 179 + 145 + 278 - 962 + 961 }; assert_eq!(original_bytes, expected_added_bytes); @@ -1074,14 +1082,14 @@ mod tests { .get(&0) .unwrap(); - assert_eq!(*removed_credits, 25940733); + assert_eq!(*removed_credits, 25913567); let refund_equivalent_bytes = removed_credits.to_unsigned() / Epoch::new(0) .unwrap() .cost_for_known_cost_item(StorageDiskUsageCreditPerByte); assert!(expected_added_bytes > refund_equivalent_bytes); - assert_eq!(refund_equivalent_bytes, 960); // we refunded 960 instead of 962 + assert_eq!(refund_equivalent_bytes, 959); // we refunded 959 instead of 962 // let's re-add it again let original_fees = apply_person( @@ -1119,7 +1127,7 @@ mod tests { .unwrap() .cost_for_known_cost_item(StorageDiskUsageCreditPerByte); - let expected_added_bytes = if using_history { 313 } else { 1 }; + let expected_added_bytes = if using_history { 312 } else { 1 }; assert_eq!(added_bytes, expected_added_bytes); } @@ -1189,7 +1197,7 @@ mod tests { / Epoch::new(0) .unwrap() .cost_for_known_cost_item(StorageDiskUsageCreditPerByte); - let expected_added_bytes = if using_history { 1238 } else { 962 }; + let expected_added_bytes = if using_history { 1237 } else { 961 }; assert_eq!(original_bytes, expected_added_bytes); if !using_history { // let's delete it, just to make sure everything is working. @@ -1209,14 +1217,14 @@ mod tests { .get(&0) .unwrap(); - assert_eq!(*removed_credits, 25940733); + assert_eq!(*removed_credits, 25913567); let refund_equivalent_bytes = removed_credits.to_unsigned() / Epoch::new(0) .unwrap() .cost_for_known_cost_item(StorageDiskUsageCreditPerByte); assert!(expected_added_bytes > refund_equivalent_bytes); - assert_eq!(refund_equivalent_bytes, 960); // we refunded 960 instead of 1011 + assert_eq!(refund_equivalent_bytes, 959); // we refunded 959 instead of 1011 // let's re-add it again let original_fees = apply_person( @@ -1384,10 +1392,10 @@ mod tests { .unwrap() .cost_for_known_cost_item(StorageDiskUsageCreditPerByte); let expected_added_bytes = if using_history { - //Explanation for 1238 + //Explanation for 1237 //todo - 1238 + 1237 } else { //Explanation for 959 @@ -1409,7 +1417,7 @@ mod tests { // 35 for flags 32 + 1 + 2 // 1 for the enum type // 1 for item - // 117 for item serialized bytes + // 116 for item serialized bytes // 1 for Basic Merk // 32 for node hash // 32 for value hash @@ -1522,7 +1530,7 @@ mod tests { // 360 + 179 + 145 + 278 = 960 - 962 + 961 }; assert_eq!(original_bytes, expected_added_bytes); @@ -1543,7 +1551,7 @@ mod tests { .unwrap() .cost_for_known_cost_item(StorageDiskUsageCreditPerByte); - let expected_added_bytes = if using_history { 1239 } else { 963 }; + let expected_added_bytes = if using_history { 1238 } else { 962 }; assert_eq!(added_bytes, expected_added_bytes); } diff --git a/packages/rs-drive/src/drive/prove/prove_multiple/v0/mod.rs b/packages/rs-drive/src/drive/prove/prove_multiple/v0/mod.rs index db1e1a5397..bc7bf5abfe 100644 --- a/packages/rs-drive/src/drive/prove/prove_multiple/v0/mod.rs +++ b/packages/rs-drive/src/drive/prove/prove_multiple/v0/mod.rs @@ -86,15 +86,11 @@ impl Drive { count += historical_contract_ids.len(); } if !document_queries.is_empty() { - path_queries.extend( - document_queries - .iter() - .map(|drive_query| { - let mut path_query = drive_query.construct_path_query(); - path_query.query.limit = None; - path_query - }), - ); + path_queries.extend(document_queries.iter().map(|drive_query| { + let mut path_query = drive_query.construct_path_query(); + path_query.query.limit = None; + path_query + })); count += document_queries.len(); } let verbose = match count { diff --git a/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/mod.rs b/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/mod.rs index f1bdffe673..24906c4ad5 100644 --- a/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/mod.rs +++ b/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/mod.rs @@ -4,9 +4,9 @@ use crate::drive::verify::RootHash; use crate::drive::Drive; use crate::error::drive::DriveError; use crate::error::Error; +use dpp::block::block_info::BlockInfo; use dpp::data_contract::DataContract; use dpp::identifier::Identifier; -use dpp::identity::TimestampMillis; use dpp::state_transition::proof_result::StateTransitionProofResult; use dpp::state_transition::StateTransition; use dpp::version::PlatformVersion; @@ -44,7 +44,7 @@ impl Drive { /// pub fn verify_state_transition_was_executed_with_proof( state_transition: &StateTransition, - block_time: TimestampMillis, + block_info: &BlockInfo, proof: &[u8], known_contracts_provider_fn: &impl Fn(&Identifier) -> Result>, Error>, platform_version: &PlatformVersion, @@ -58,7 +58,7 @@ impl Drive { { 0 => Drive::verify_state_transition_was_executed_with_proof_v0( state_transition, - block_time, + block_info, proof, known_contracts_provider_fn, platform_version, diff --git a/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs b/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs index 4cdcdc9b03..3f6c34cb8c 100644 --- a/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs +++ b/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs @@ -1,11 +1,12 @@ use std::collections::{BTreeMap}; use std::sync::Arc; +use dpp::block::block_info::BlockInfo; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::data_contract::serialized_version::DataContractInSerializationFormat; -use dpp::document::{Document, DocumentV0Getters, property_names}; +use dpp::document::{Document, DocumentV0Getters}; use dpp::document::document_methods::DocumentMethodsV0; -use dpp::identity::{PartialIdentity, TimestampMillis}; +use dpp::identity::PartialIdentity; use dpp::prelude::{DataContract, Identifier}; use dpp::state_transition::data_contract_create_transition::accessors::DataContractCreateTransitionAccessorsV0; use dpp::state_transition::data_contract_update_transition::accessors::DataContractUpdateTransitionAccessorsV0; @@ -37,7 +38,7 @@ use crate::query::SingleDocumentDriveQuery; impl Drive { pub(super) fn verify_state_transition_was_executed_with_proof_v0( state_transition: &StateTransition, - block_time: TimestampMillis, + block_info: &BlockInfo, proof: &[u8], known_contracts_provider_fn: &impl Fn(&Identifier) -> Result>, Error>, platform_version: &PlatformVersion, @@ -123,25 +124,18 @@ impl Drive { match transition { DocumentTransition::Create(create_transition) => { let document = document.ok_or(Error::Proof(ProofError::IncorrectProof(format!("proof did not contain document with id {} expected to exist because of state transition (create)", create_transition.base().id()))))?; - let requires_created_at = document_type - .required_fields() - .contains(property_names::CREATED_AT); - let requires_updated_at = document_type - .required_fields() - .contains(property_names::UPDATED_AT); let expected_document = Document::try_from_create_transition( create_transition, documents_batch_transition.owner_id(), - block_time, - requires_created_at, - requires_updated_at, - &contract, + block_info, + &document_type, platform_version, )?; - if !document - .is_equal_ignoring_timestamps(&expected_document, platform_version)? - { + if !document.is_equal_ignoring_time_based_fields( + &expected_document, + platform_version, + )? { return Err(Error::Proof(ProofError::IncorrectProof(format!("proof of state transition execution did not contain expected document (time fields were not checked) after create with id {}", create_transition.base().id())))); } Ok(( @@ -151,21 +145,24 @@ impl Drive { } DocumentTransition::Replace(replace_transition) => { let document = document.ok_or(Error::Proof(ProofError::IncorrectProof(format!("proof did not contain document with id {} expected to exist because of state transition (replace)", replace_transition.base().id()))))?; - let requires_updated_at = document_type - .required_fields() - .contains(property_names::UPDATED_AT); let expected_document = Document::try_from_replace_transition( replace_transition, documents_batch_transition.owner_id(), document.created_at(), //we can trust the created at (as we don't care) - block_time, - requires_updated_at, + document.created_at_block_height(), //we can trust the created at block height (as we don't care) + document.created_at_core_block_height(), //we can trust the created at core block height (as we don't care) + block_info, + &document_type, platform_version, )?; - if document != expected_document { - return Err(Error::Proof(ProofError::IncorrectProof(format!("proof of state transition execution did not contain exact expected document after replace with id {}", replace_transition.base().id())))); + if !document.is_equal_ignoring_time_based_fields( + &expected_document, + platform_version, + )? { + return Err(Error::Proof(ProofError::IncorrectProof(format!("proof of state transition execution did not contain expected document (time fields were not checked) after replace with id {}", replace_transition.base().id())))); } + Ok(( root_hash, VerifiedDocuments(BTreeMap::from([(document.id(), Some(document))])), diff --git a/packages/rs-drive/src/error/proof.rs b/packages/rs-drive/src/error/proof.rs index f997c7c1d6..f482f95bff 100644 --- a/packages/rs-drive/src/error/proof.rs +++ b/packages/rs-drive/src/error/proof.rs @@ -38,6 +38,10 @@ pub enum ProofError { #[error("unknown contract in documents batch transition error: {0}")] UnknownContract(String), + /// The metadata we got back from platform is incorrect + #[error("invalid metadata: {0}")] + InvalidMetadata(String), + /// We are trying to callback to retrieve a contract, but there was an error #[error("the contract could not be retrieved during verification: {0}")] ErrorRetrievingContract(String), @@ -75,5 +79,6 @@ fn get_error_code(error: &ProofError) -> u32 { ProofError::InvalidTransition(_) => 6008, ProofError::UnknownContract(_) => 6009, ProofError::ErrorRetrievingContract(_) => 6010, + ProofError::InvalidMetadata(_) => 6011, } } diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/mod.rs index 4438bbc17c..ec14a24a3a 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/mod.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/mod.rs @@ -9,6 +9,7 @@ use dpp::platform_value::{Identifier, Value}; use std::collections::BTreeMap; use dpp::document::Document; +use dpp::prelude::{BlockHeight, CoreBlockHeight}; use dpp::ProtocolError; @@ -42,6 +43,18 @@ impl DocumentCreateTransitionActionAccessorsV0 for DocumentCreateTransitionActio } } + fn created_at_block_height(&self) -> Option { + match self { + DocumentCreateTransitionAction::V0(v0) => v0.created_at_block_height, + } + } + + fn created_at_core_block_height(&self) -> Option { + match self { + DocumentCreateTransitionAction::V0(v0) => v0.created_at_core_block_height, + } + } + fn data(&self) -> &BTreeMap { match self { DocumentCreateTransitionAction::V0(v0) => &v0.data, diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/mod.rs index 44d4e812b0..92ab780a11 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/mod.rs @@ -9,6 +9,7 @@ use dpp::ProtocolError; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::document_type::methods::DocumentTypeV0Methods; +use dpp::prelude::{BlockHeight, CoreBlockHeight}; use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::{DocumentBaseTransitionAction, DocumentBaseTransitionActionV0}; @@ -21,6 +22,10 @@ pub struct DocumentCreateTransitionActionV0 { pub base: DocumentBaseTransitionAction, /// The creation time of the document pub created_at: Option, + /// The creation block height of the document + pub created_at_block_height: Option, + /// The creation core block height of the document + pub created_at_core_block_height: Option, /// Document properties pub data: BTreeMap, } @@ -31,8 +36,12 @@ pub trait DocumentCreateTransitionActionAccessorsV0 { fn base(&self) -> &DocumentBaseTransitionAction; /// base owned fn base_owned(self) -> DocumentBaseTransitionAction; - /// created at + /// created at time fn created_at(&self) -> Option; + /// created at block height + fn created_at_block_height(&self) -> Option; + /// created at core block height + fn created_at_core_block_height(&self) -> Option; /// data fn data(&self) -> &BTreeMap; /// data mut @@ -88,6 +97,8 @@ impl DocumentFromCreateTransitionActionV0 for Document { let DocumentCreateTransitionActionV0 { base, created_at, + created_at_block_height, + created_at_core_block_height, data, } = v0; @@ -116,6 +127,10 @@ impl DocumentFromCreateTransitionActionV0 for Document { revision: document_type.initial_revision(), created_at: *created_at, updated_at: *created_at, + created_at_block_height: *created_at_block_height, + updated_at_block_height: *created_at_block_height, + created_at_core_block_height: *created_at_core_block_height, + updated_at_core_block_height: *created_at_core_block_height, } .into()), version => Err(ProtocolError::UnknownVersionMismatch { @@ -136,6 +151,8 @@ impl DocumentFromCreateTransitionActionV0 for Document { let DocumentCreateTransitionActionV0 { base, created_at, + created_at_block_height, + created_at_core_block_height, data, } = v0; @@ -164,6 +181,10 @@ impl DocumentFromCreateTransitionActionV0 for Document { revision: document_type.initial_revision(), created_at, updated_at: created_at, + created_at_block_height, + updated_at_block_height: created_at_block_height, + created_at_core_block_height, + updated_at_core_block_height: created_at_core_block_height, } .into()), version => Err(ProtocolError::UnknownVersionMismatch { diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/transformer.rs index 68abb06b75..caec3badee 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/transformer.rs @@ -27,9 +27,26 @@ impl DocumentCreateTransitionActionV0 { None }; + let created_at_block_height = + if base.document_type_field_is_required(property_names::CREATED_AT_BLOCK_HEIGHT)? { + Some(block_info.height) + } else { + None + }; + + let created_at_core_block_height = if base + .document_type_field_is_required(property_names::CREATED_AT_CORE_BLOCK_HEIGHT)? + { + Some(block_info.core_height) + } else { + None + }; + Ok(DocumentCreateTransitionActionV0 { base, created_at, + created_at_block_height, + created_at_core_block_height, data, }) } @@ -52,9 +69,26 @@ impl DocumentCreateTransitionActionV0 { None }; + let created_at_block_height = + if base.document_type_field_is_required(property_names::CREATED_AT_BLOCK_HEIGHT)? { + Some(block_info.height) + } else { + None + }; + + let created_at_core_block_height = if base + .document_type_field_is_required(property_names::CREATED_AT_CORE_BLOCK_HEIGHT)? + { + Some(block_info.core_height) + } else { + None + }; + Ok(DocumentCreateTransitionActionV0 { base, created_at, + created_at_block_height, + created_at_core_block_height, //todo: get rid of clone data: data.clone(), }) diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/transformer.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/transformer.rs index 3107fcefc6..25eea91099 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/transformer.rs @@ -1,7 +1,9 @@ +use dpp::block::block_info::BlockInfo; use dpp::platform_value::Identifier; use std::sync::Arc; use dpp::identity::TimestampMillis; +use dpp::prelude::{BlockHeight, CoreBlockHeight}; use dpp::ProtocolError; use dpp::state_transition::documents_batch_transition::document_transition::DocumentReplaceTransition; use crate::drive::contract::DataContractFetchInfo; @@ -12,7 +14,9 @@ impl DocumentReplaceTransitionAction { pub fn try_from_borrowed_document_replace_transition( document_replace_transition: &DocumentReplaceTransition, originally_created_at: Option, - block_time_ms: TimestampMillis, + originally_created_at_block_height: Option, + originally_created_at_core_block_height: Option, + block_info: &BlockInfo, get_data_contract: impl Fn(Identifier) -> Result, ProtocolError>, ) -> Result { match document_replace_transition { @@ -20,7 +24,9 @@ impl DocumentReplaceTransitionAction { DocumentReplaceTransitionActionV0::try_from_borrowed_document_replace_transition( v0, originally_created_at, - block_time_ms, + originally_created_at_block_height, + originally_created_at_core_block_height, + block_info, get_data_contract, )? .into(), diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/v0/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/v0/mod.rs index 00d3ceda69..d86e8bdf15 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/v0/mod.rs @@ -3,7 +3,7 @@ pub mod transformer; use dpp::document::{Document, DocumentV0}; use dpp::identity::TimestampMillis; use dpp::platform_value::{Identifier, Value}; -use dpp::prelude::Revision; +use dpp::prelude::{BlockHeight, CoreBlockHeight, Revision}; use dpp::ProtocolError; use std::collections::BTreeMap; @@ -22,6 +22,14 @@ pub struct DocumentReplaceTransitionActionV0 { pub created_at: Option, /// The time the document was last updated pub updated_at: Option, + /// The block height at which the document was created + pub created_at_block_height: Option, + /// The block height at which the document was last updated + pub updated_at_block_height: Option, + /// The core block height at which the document was created + pub created_at_core_block_height: Option, + /// The core block height at which the document was last updated + pub updated_at_core_block_height: Option, /// Document properties pub data: BTreeMap, } @@ -93,6 +101,10 @@ impl DocumentFromReplaceTransitionActionV0 for Document { revision, created_at, updated_at, + created_at_block_height, + updated_at_block_height, + created_at_core_block_height, + updated_at_core_block_height, data, } = value; @@ -110,6 +122,10 @@ impl DocumentFromReplaceTransitionActionV0 for Document { revision: Some(*revision), created_at: *created_at, updated_at: *updated_at, + created_at_block_height: *created_at_block_height, + updated_at_block_height: *updated_at_block_height, + created_at_core_block_height: *created_at_core_block_height, + updated_at_core_block_height: *updated_at_core_block_height, } .into()), version => Err(ProtocolError::UnknownVersionMismatch { @@ -130,6 +146,10 @@ impl DocumentFromReplaceTransitionActionV0 for Document { revision, created_at, updated_at, + created_at_block_height, + updated_at_block_height, + created_at_core_block_height, + updated_at_core_block_height, data, } = value; @@ -147,6 +167,10 @@ impl DocumentFromReplaceTransitionActionV0 for Document { revision: Some(revision), created_at, updated_at, + created_at_block_height, + updated_at_block_height, + created_at_core_block_height, + updated_at_core_block_height, } .into()), version => Err(ProtocolError::UnknownVersionMismatch { diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/v0/transformer.rs index ec7190048a..a092683ada 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/v0/transformer.rs @@ -1,8 +1,10 @@ +use dpp::block::block_info::BlockInfo; use dpp::document::property_names; use dpp::platform_value::Identifier; use std::sync::Arc; use dpp::identity::TimestampMillis; +use dpp::prelude::{BlockHeight, CoreBlockHeight}; use dpp::ProtocolError; use dpp::state_transition::documents_batch_transition::document_transition::document_replace_transition::DocumentReplaceTransitionV0; use crate::drive::contract::DataContractFetchInfo; @@ -14,7 +16,9 @@ impl DocumentReplaceTransitionActionV0 { pub fn try_from_borrowed_document_replace_transition( document_replace_transition: &DocumentReplaceTransitionV0, originally_created_at: Option, - block_time_ms: TimestampMillis, + originally_created_at_block_height: Option, + originally_created_at_core_block_height: Option, + block_info: &BlockInfo, get_data_contract: impl Fn(Identifier) -> Result, ProtocolError>, ) -> Result { let DocumentReplaceTransitionV0 { @@ -29,7 +33,22 @@ impl DocumentReplaceTransitionActionV0 { get_data_contract, )?; let updated_at = if base.document_type_field_is_required(property_names::UPDATED_AT)? { - Some(block_time_ms) + Some(block_info.time_ms) + } else { + None + }; + + let updated_at_block_height = + if base.document_type_field_is_required(property_names::UPDATED_AT_BLOCK_HEIGHT)? { + Some(block_info.height) + } else { + None + }; + + let updated_at_core_block_height = if base + .document_type_field_is_required(property_names::UPDATED_AT_CORE_BLOCK_HEIGHT)? + { + Some(block_info.core_height) } else { None }; @@ -39,6 +58,10 @@ impl DocumentReplaceTransitionActionV0 { revision: *revision, created_at: originally_created_at, updated_at, + created_at_block_height: originally_created_at_block_height, + updated_at_block_height, + created_at_core_block_height: originally_created_at_core_block_height, + updated_at_core_block_height, data: data.clone(), }) } diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs index b1d352b97e..f4137d1393 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs @@ -39,6 +39,10 @@ impl IdentityCreditWithdrawalTransitionActionV0 { revision: Some(1), created_at: Some(creation_time_ms), updated_at: Some(creation_time_ms), + created_at_block_height: None, + updated_at_block_height: None, + created_at_core_block_height: None, + updated_at_core_block_height: None, } .into(); diff --git a/packages/rs-drive/tests/query_tests.rs b/packages/rs-drive/tests/query_tests.rs index 13b0cd0a25..5bf55d9786 100644 --- a/packages/rs-drive/tests/query_tests.rs +++ b/packages/rs-drive/tests/query_tests.rs @@ -993,8 +993,8 @@ fn test_family_basic_queries() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 89, 169, 192, 133, 222, 85, 217, 165, 166, 122, 195, 124, 55, 108, 16, 158, 1, 80, 226, 24, - 74, 1, 201, 200, 22, 166, 46, 239, 191, 250, 138, 149, + 66, 138, 16, 202, 64, 147, 26, 115, 247, 29, 235, 148, 80, 154, 249, 204, 148, 59, 248, 83, + 118, 140, 196, 38, 24, 59, 190, 48, 212, 130, 220, 215, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -2305,8 +2305,8 @@ fn test_family_basic_queries() { assert_eq!( root_hash.as_slice(), vec![ - 193, 111, 116, 17, 191, 90, 126, 227, 215, 15, 15, 21, 221, 30, 4, 212, 128, 169, 25, - 12, 86, 63, 246, 220, 225, 182, 234, 142, 99, 33, 154, 220 + 183, 156, 84, 144, 94, 45, 111, 118, 255, 200, 166, 248, 252, 127, 216, 105, 83, 124, + 126, 241, 19, 191, 32, 188, 112, 101, 249, 194, 188, 224, 188, 162 ], ); } @@ -2452,8 +2452,8 @@ fn test_family_starts_at_queries() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 89, 169, 192, 133, 222, 85, 217, 165, 166, 122, 195, 124, 55, 108, 16, 158, 1, 80, 226, 24, - 74, 1, 201, 200, 22, 166, 46, 239, 191, 250, 138, 149, + 66, 138, 16, 202, 64, 147, 26, 115, 247, 29, 235, 148, 80, 154, 249, 204, 148, 59, 248, 83, + 118, 140, 196, 38, 24, 59, 190, 48, 212, 130, 220, 215, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -2894,8 +2894,8 @@ fn test_family_with_nulls_query() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 100, 192, 55, 56, 28, 89, 114, 51, 246, 239, 246, 155, 157, 46, 242, 255, 61, 30, 111, 226, - 252, 227, 130, 243, 99, 202, 83, 249, 253, 202, 142, 36, + 120, 51, 207, 201, 227, 63, 44, 130, 175, 117, 220, 200, 56, 145, 137, 7, 203, 88, 178, 88, + 211, 192, 197, 201, 253, 79, 18, 50, 43, 156, 204, 153, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -3017,8 +3017,8 @@ fn test_query_with_cached_contract() { // Make sure the state is deterministic let expected_app_hash = vec![ - 89, 169, 192, 133, 222, 85, 217, 165, 166, 122, 195, 124, 55, 108, 16, 158, 1, 80, 226, 24, - 74, 1, 201, 200, 22, 166, 46, 239, 191, 250, 138, 149, + 66, 138, 16, 202, 64, 147, 26, 115, 247, 29, 235, 148, 80, 154, 249, 204, 148, 59, 248, 83, + 118, 140, 196, 38, 24, 59, 190, 48, 212, 130, 220, 215, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -3166,8 +3166,8 @@ fn test_dpns_query() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 88, 200, 104, 25, 220, 137, 57, 167, 129, 211, 38, 203, 187, 175, 80, 226, 238, 54, 203, - 58, 54, 63, 242, 12, 23, 205, 202, 0, 188, 153, 218, 1, + 104, 127, 253, 216, 170, 92, 9, 250, 226, 44, 134, 38, 89, 10, 135, 4, 121, 65, 255, 136, + 149, 217, 217, 169, 108, 37, 241, 86, 57, 214, 131, 96, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -3718,8 +3718,8 @@ fn test_dpns_query_start_at() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 88, 200, 104, 25, 220, 137, 57, 167, 129, 211, 38, 203, 187, 175, 80, 226, 238, 54, 203, - 58, 54, 63, 242, 12, 23, 205, 202, 0, 188, 153, 218, 1, + 104, 127, 253, 216, 170, 92, 9, 250, 226, 44, 134, 38, 89, 10, 135, 4, 121, 65, 255, 136, + 149, 217, 217, 169, 108, 37, 241, 86, 57, 214, 131, 96, ]; assert_eq!(root_hash.as_slice(), expected_app_hash,); @@ -3812,8 +3812,8 @@ fn test_dpns_query_start_after() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 88, 200, 104, 25, 220, 137, 57, 167, 129, 211, 38, 203, 187, 175, 80, 226, 238, 54, 203, - 58, 54, 63, 242, 12, 23, 205, 202, 0, 188, 153, 218, 1, + 104, 127, 253, 216, 170, 92, 9, 250, 226, 44, 134, 38, 89, 10, 135, 4, 121, 65, 255, 136, + 149, 217, 217, 169, 108, 37, 241, 86, 57, 214, 131, 96, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -3906,8 +3906,8 @@ fn test_dpns_query_start_at_desc() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 88, 200, 104, 25, 220, 137, 57, 167, 129, 211, 38, 203, 187, 175, 80, 226, 238, 54, 203, - 58, 54, 63, 242, 12, 23, 205, 202, 0, 188, 153, 218, 1, + 104, 127, 253, 216, 170, 92, 9, 250, 226, 44, 134, 38, 89, 10, 135, 4, 121, 65, 255, 136, + 149, 217, 217, 169, 108, 37, 241, 86, 57, 214, 131, 96, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -4000,8 +4000,8 @@ fn test_dpns_query_start_after_desc() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 88, 200, 104, 25, 220, 137, 57, 167, 129, 211, 38, 203, 187, 175, 80, 226, 238, 54, 203, - 58, 54, 63, 242, 12, 23, 205, 202, 0, 188, 153, 218, 1, + 104, 127, 253, 216, 170, 92, 9, 250, 226, 44, 134, 38, 89, 10, 135, 4, 121, 65, 255, 136, + 149, 217, 217, 169, 108, 37, 241, 86, 57, 214, 131, 96, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -4192,8 +4192,8 @@ fn test_dpns_query_start_at_with_null_id() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 196, 88, 107, 126, 145, 188, 9, 93, 124, 49, 144, 228, 194, 46, 199, 188, 22, 167, 13, 218, - 20, 0, 30, 204, 160, 186, 48, 189, 240, 106, 14, 108, + 11, 19, 155, 212, 245, 198, 124, 117, 180, 86, 195, 68, 236, 38, 209, 25, 16, 186, 122, 12, + 9, 73, 22, 156, 179, 16, 190, 94, 19, 60, 210, 82, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -4393,8 +4393,8 @@ fn test_dpns_query_start_after_with_null_id() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 196, 88, 107, 126, 145, 188, 9, 93, 124, 49, 144, 228, 194, 46, 199, 188, 22, 167, 13, 218, - 20, 0, 30, 204, 160, 186, 48, 189, 240, 106, 14, 108, + 11, 19, 155, 212, 245, 198, 124, 117, 180, 86, 195, 68, 236, 38, 209, 25, 16, 186, 122, 12, + 9, 73, 22, 156, 179, 16, 190, 94, 19, 60, 210, 82, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -4598,8 +4598,8 @@ fn test_dpns_query_start_after_with_null_id_desc() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 196, 88, 107, 126, 145, 188, 9, 93, 124, 49, 144, 228, 194, 46, 199, 188, 22, 167, 13, 218, - 20, 0, 30, 204, 160, 186, 48, 189, 240, 106, 14, 108, + 11, 19, 155, 212, 245, 198, 124, 117, 180, 86, 195, 68, 236, 38, 209, 25, 16, 186, 122, 12, + 9, 73, 22, 156, 179, 16, 190, 94, 19, 60, 210, 82, ]; assert_eq!(root_hash.as_slice(), expected_app_hash,); @@ -4982,6 +4982,8 @@ fn test_query_documents_by_created_at() { document_value, Identifier::random(), random(), + random(), + random(), platform_version, ) .expect("should create document"); diff --git a/packages/rs-drive/tests/query_tests_history.rs b/packages/rs-drive/tests/query_tests_history.rs index dbd756b7c1..4f863200f9 100644 --- a/packages/rs-drive/tests/query_tests_history.rs +++ b/packages/rs-drive/tests/query_tests_history.rs @@ -291,8 +291,8 @@ fn test_query_historical() { assert_eq!( root_hash.as_slice(), vec![ - 102, 136, 207, 211, 64, 180, 182, 231, 135, 104, 94, 128, 232, 166, 229, 141, 193, 34, - 150, 114, 64, 54, 125, 7, 88, 34, 175, 191, 184, 19, 0, 80 + 183, 18, 172, 146, 135, 191, 55, 236, 73, 61, 68, 217, 55, 134, 87, 148, 210, 99, 196, + 151, 94, 207, 218, 133, 70, 221, 228, 57, 197, 93, 12, 45, ] ); @@ -1655,8 +1655,8 @@ fn test_query_historical() { assert_eq!( root_hash.as_slice(), vec![ - 167, 173, 50, 226, 194, 111, 161, 168, 48, 247, 9, 139, 1, 108, 131, 162, 190, 115, - 218, 47, 154, 236, 223, 8, 43, 17, 147, 206, 255, 237, 64, 109 + 225, 224, 171, 0, 235, 104, 240, 209, 248, 74, 159, 9, 246, 185, 174, 114, 53, 133, + 235, 206, 36, 151, 226, 124, 108, 205, 152, 122, 6, 202, 177, 210 ] ); } diff --git a/packages/rs-sdk/src/platform.rs b/packages/rs-sdk/src/platform.rs index 56d224a4e8..7e630fd85c 100644 --- a/packages/rs-sdk/src/platform.rs +++ b/packages/rs-sdk/src/platform.rs @@ -5,6 +5,7 @@ // generated types. Later these re-exports could be swapped with actual dash-platform-sdk's requests // and while it will change the substance, the API structure will remain the same. +pub mod block_info_from_metadata; mod delegate; mod document_query; mod fetch; diff --git a/packages/rs-sdk/src/platform/block_info_from_metadata.rs b/packages/rs-sdk/src/platform/block_info_from_metadata.rs new file mode 100644 index 0000000000..a129e4a323 --- /dev/null +++ b/packages/rs-sdk/src/platform/block_info_from_metadata.rs @@ -0,0 +1,47 @@ +use crate::Error; +use dapi_grpc::platform::v0::ResponseMetadata; +use dpp::block::block_info::BlockInfo; +use dpp::block::epoch::MAX_EPOCH; +use drive::error::proof::ProofError; + +/// Constructs a `BlockInfo` structure from the provided response metadata. This function +/// translates metadata received from a platform response into a format that is specific to the +/// application's needs, particularly focusing on block-related information. It ensures that +/// the epoch value from the metadata does not exceed the maximum allowed for a 16-bit integer, +/// as this is a constraint for the `BlockInfo` structure. +/// +/// # Parameters +/// - `response_metadata`: A reference to `ResponseMetadata` obtained from a platform response. +/// This metadata includes various block-related information such as time in milliseconds, +/// height, core chain locked height, and epoch. +/// +/// # Returns +/// If successful, returns `Ok(BlockInfo)` where `BlockInfo` contains: +/// - `time_ms`: The timestamp of the block in milliseconds. +/// - `height`: The height of the block. +/// - `core_height`: The core chain locked height, indicating the height of the block in the core blockchain that is considered final and securely linked to this block. +/// - `epoch`: The epoch number, converted to a 16-bit integer. +/// +/// # Errors +/// Returns an error if: +/// - The `epoch` value in the response metadata exceeds the maximum value that can be represented by a 16-bit integer. This is considered a data validity error as it indicates the platform returned an unexpectedly high epoch number. +/// +/// The function encapsulates errors into the application's own `Error` type, providing a unified interface for error handling across the application. +pub fn block_info_from_metadata(response_metadata: &ResponseMetadata) -> Result { + if response_metadata.epoch > MAX_EPOCH as u32 { + return Err( + drive::error::Error::Proof(ProofError::InvalidMetadata(format!( + "platform returned an epoch {} that was higher that maximum of a 16 bit integer", + response_metadata.epoch + ))) + .into(), + ); + } + + Ok(BlockInfo { + time_ms: response_metadata.time_ms, + height: response_metadata.height, + core_height: response_metadata.core_chain_locked_height, + epoch: (response_metadata.epoch as u16).try_into()?, + }) +} diff --git a/packages/rs-sdk/src/platform/transition/broadcast.rs b/packages/rs-sdk/src/platform/transition/broadcast.rs index 01c196055c..b8c0089d3f 100644 --- a/packages/rs-sdk/src/platform/transition/broadcast.rs +++ b/packages/rs-sdk/src/platform/transition/broadcast.rs @@ -1,4 +1,5 @@ use super::broadcast_request::BroadcastRequestForStateTransition; +use crate::platform::block_info_from_metadata::block_info_from_metadata; use crate::{Error, Sdk}; use dapi_grpc::platform::VersionedGrpcResponse; use dpp::state_transition::proof_result::StateTransitionProofResult; @@ -44,12 +45,12 @@ impl BroadcastStateTransition for StateTransition { let response = request.execute(sdk, RequestSettings::default()).await?; - let block_time = response.metadata()?.time_ms; + let block_info = block_info_from_metadata(response.metadata()?)?; let proof = response.proof_owned()?; let (_, result) = Drive::verify_state_transition_was_executed_with_proof( self, - block_time, + &block_info, proof.grovedb_proof.as_slice(), &|_| Ok(None), sdk.version(), diff --git a/packages/rs-sdk/src/platform/transition/put_contract.rs b/packages/rs-sdk/src/platform/transition/put_contract.rs index 52e0b9bab1..79d8e87d5a 100644 --- a/packages/rs-sdk/src/platform/transition/put_contract.rs +++ b/packages/rs-sdk/src/platform/transition/put_contract.rs @@ -3,6 +3,7 @@ use std::collections::BTreeMap; use crate::{Error, Sdk}; +use crate::platform::block_info_from_metadata::block_info_from_metadata; use crate::platform::transition::put_settings::PutSettings; use dapi_grpc::platform::VersionedGrpcResponse; use dpp::data_contract::accessors::v0::DataContractV0Getters; @@ -99,13 +100,13 @@ impl PutContract for DataContract { let response = request.execute(sdk, RequestSettings::default()).await?; - let block_time = response.metadata()?.time_ms; + let block_info = block_info_from_metadata(response.metadata()?)?; let proof = response.proof_owned()?; let (_, result) = Drive::verify_state_transition_was_executed_with_proof( &state_transition, - block_time, + &block_info, proof.grovedb_proof.as_slice(), &|_| Ok(None), sdk.version(), diff --git a/packages/rs-sdk/src/platform/transition/put_document.rs b/packages/rs-sdk/src/platform/transition/put_document.rs index 741460df6f..7c9fecac3a 100644 --- a/packages/rs-sdk/src/platform/transition/put_document.rs +++ b/packages/rs-sdk/src/platform/transition/put_document.rs @@ -3,6 +3,7 @@ use std::sync::Arc; use crate::{Error, Sdk}; +use crate::platform::block_info_from_metadata::block_info_from_metadata; use crate::platform::transition::put_settings::PutSettings; use dapi_grpc::platform::VersionedGrpcResponse; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; @@ -111,13 +112,13 @@ impl PutDocument for Document { let response = request.execute(sdk, RequestSettings::default()).await?; - let block_time = response.metadata()?.time_ms; + let block_info = block_info_from_metadata(response.metadata()?)?; let proof = response.proof_owned()?; let (_, result) = Drive::verify_state_transition_was_executed_with_proof( &state_transition, - block_time, + &block_info, proof.grovedb_proof.as_slice(), &|_| Ok(Some(data_contract.clone())), sdk.version(), diff --git a/packages/rs-sdk/src/platform/transition/put_identity.rs b/packages/rs-sdk/src/platform/transition/put_identity.rs index 02b8b35407..281cfb15d8 100644 --- a/packages/rs-sdk/src/platform/transition/put_identity.rs +++ b/packages/rs-sdk/src/platform/transition/put_identity.rs @@ -8,6 +8,7 @@ use dpp::dashcore::PrivateKey; use dpp::identity::signer::Signer; use dpp::prelude::{AssetLockProof, Identity}; +use crate::platform::block_info_from_metadata::block_info_from_metadata; use dpp::state_transition::proof_result::StateTransitionProofResult; use drive::drive::Drive; use rs_dapi_client::{DapiRequest, RequestSettings}; @@ -96,12 +97,12 @@ impl PutIdentity for Identity { let response = request.execute(sdk, RequestSettings::default()).await?; - let block_time = response.metadata()?.time_ms; + let block_info = block_info_from_metadata(response.metadata()?)?; let proof = response.proof_owned()?; let (_, result) = Drive::verify_state_transition_was_executed_with_proof( &state_transition, - block_time, + &block_info, proof.grovedb_proof.as_slice(), &|_| Ok(None), sdk.version(), diff --git a/packages/rs-sdk/src/platform/transition/top_up_identity.rs b/packages/rs-sdk/src/platform/transition/top_up_identity.rs index a9bcc46fd7..59b776df4a 100644 --- a/packages/rs-sdk/src/platform/transition/top_up_identity.rs +++ b/packages/rs-sdk/src/platform/transition/top_up_identity.rs @@ -1,3 +1,4 @@ +use crate::platform::block_info_from_metadata::block_info_from_metadata; use crate::platform::transition::broadcast_request::BroadcastRequestForStateTransition; use crate::{Error, Sdk}; use dapi_grpc::platform::VersionedGrpcResponse; @@ -50,13 +51,13 @@ impl TopUpIdentity for Identity { let response = request.execute(sdk, RequestSettings::default()).await?; - let block_time = response.metadata()?.time_ms; + let block_info = block_info_from_metadata(response.metadata()?)?; let proof = response.proof_owned()?; let (_, result) = Drive::verify_state_transition_was_executed_with_proof( &state_transition, - block_time, + &block_info, proof.grovedb_proof.as_slice(), &|_| Ok(None), sdk.version(), diff --git a/packages/rs-sdk/src/platform/transition/withdraw_from_identity.rs b/packages/rs-sdk/src/platform/transition/withdraw_from_identity.rs index feb45fdf30..5e64ed1afb 100644 --- a/packages/rs-sdk/src/platform/transition/withdraw_from_identity.rs +++ b/packages/rs-sdk/src/platform/transition/withdraw_from_identity.rs @@ -9,6 +9,7 @@ use dpp::prelude::UserFeeIncrease; use dpp::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition; +use crate::platform::block_info_from_metadata::block_info_from_metadata; use crate::platform::transition::broadcast_request::BroadcastRequestForStateTransition; use crate::platform::transition::put_settings::PutSettings; use crate::{Error, Sdk}; @@ -70,13 +71,13 @@ impl WithdrawFromIdentity for Identity { let response = request.execute(sdk, RequestSettings::default()).await?; - let block_time = response.metadata()?.time_ms; + let block_info = block_info_from_metadata(response.metadata()?)?; let proof = response.proof_owned()?; let (_, result) = Drive::verify_state_transition_was_executed_with_proof( &state_transition, - block_time, + &block_info, proof.grovedb_proof.as_slice(), &|_| Ok(None), sdk.version(), diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T08:55:01.204152704Z_GetDataContractRequest_e4cf74168e03a40bd159451456b501c1ba166a2dd8f6efb31b0289dc011da983.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T08:55:01.204152704Z_GetDataContractRequest_e4cf74168e03a40bd159451456b501c1ba166a2dd8f6efb31b0289dc011da983.json new file mode 100644 index 0000000000000000000000000000000000000000..d8c481764e3c4b52a0763c55f80fa834c05c7362 GIT binary patch literal 8838 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 s#+4Bfo&)HI>0u)0SX{T9((=Y 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

    v>lK+Ks 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 CIj9@} literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T08:55:01.244377672Z_DocumentQuery_90af5a08200f1b0e42dbd3ad7a6af38ff6415d9cabab87315b9d9d736194597f.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T08:55:01.244377672Z_DocumentQuery_90af5a08200f1b0e42dbd3ad7a6af38ff6415d9cabab87315b9d9d736194597f.json new file mode 100644 index 0000000000000000000000000000000000000000..616fe5438d5f69dd258345b7063343e6c5977635 GIT binary patch literal 24327 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 bX+>^Vf7r$KN1G?tf0n8FfBd^3_kR92-S@qr literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T08:56:19.629079892Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T08:56:19.629079892Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json new file mode 100644 index 0000000000000000000000000000000000000000..32a7ebf451dce2cc61c5b019e2c1f5faa0957809 GIT binary patch literal 74137 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 JegDJz{|6XT2+IHf literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T08:56:19.649147329Z_DocumentQuery_c104c67292061fe0b8e2f959cd2625892e0011f1264c65e1474532f59456ff51.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T08:56:19.649147329Z_DocumentQuery_c104c67292061fe0b8e2f959cd2625892e0011f1264c65e1474532f59456ff51.json new file mode 100644 index 0000000000000000000000000000000000000000..be1c7b74bc6304747e0cddeb26470de86105fa5d GIT binary patch literal 24213 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 H4}SVTzW$$8 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T08:57:32.047138511Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T08:57:32.047138511Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json new file mode 100644 index 0000000000000000000000000000000000000000..10fb99d8cf67c71106bf05cb4ef3d8013331f4ae GIT binary patch literal 74123 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 ZY1gNWDjP3*A0$88MZ5goRawom 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/quorum_pubkey-106-6d309b63e7a286d50c8091772d4760d7a75e2a5427cbc90009bf8a2540448035.json b/packages/rs-sdk/tests/vectors/quorum_pubkey-106-6d309b63e7a286d50c8091772d4760d7a75e2a5427cbc90009bf8a2540448035.json new file mode 100644 index 0000000000..f746126bdd --- /dev/null +++ b/packages/rs-sdk/tests/vectors/quorum_pubkey-106-6d309b63e7a286d50c8091772d4760d7a75e2a5427cbc90009bf8a2540448035.json @@ -0,0 +1 @@ +[141,132,157,207,35,82,50,219,213,72,229,97,208,188,215,79,24,147,102,225,175,235,164,36,151,85,253,37,170,115,169,162,199,137,216,2,209,136,168,22,68,58,133,150,93,172,147,177] \ No newline at end of file diff --git a/packages/strategy-tests/src/lib.rs b/packages/strategy-tests/src/lib.rs index 4895144dad..8040850aa9 100644 --- a/packages/strategy-tests/src/lib.rs +++ b/packages/strategy-tests/src/lib.rs @@ -645,7 +645,9 @@ impl Strategy { .random_documents_with_params( count as u32, current_identities, - block_info.time_ms, + Some(block_info.time_ms), + Some(block_info.height), + Some(block_info.core_height), *fill_type, *fill_size, rng, @@ -739,7 +741,9 @@ impl Strategy { .random_documents_with_params( count as u32, &held_identity, - block_info.time_ms, + Some(block_info.time_ms), + Some(block_info.height), + Some(block_info.core_height), *fill_type, *fill_size, rng, @@ -751,7 +755,9 @@ impl Strategy { .random_documents_with_params( count as u32, current_identities, - block_info.time_ms, + Some(block_info.time_ms), + Some(block_info.height), + Some(block_info.core_height), *fill_type, *fill_size, rng, diff --git a/packages/wasm-dpp/test/integration/document/Document.spec.js b/packages/wasm-dpp/test/integration/document/Document.spec.js index 213d8c0fcc..bd8dc73ec9 100644 --- a/packages/wasm-dpp/test/integration/document/Document.spec.js +++ b/packages/wasm-dpp/test/integration/document/Document.spec.js @@ -55,7 +55,11 @@ describe('ExtendedDocument', () => { expect(result).to.deep.equal({ $createdAt: null, // TODO: it should be omitted + $createdAtBlockHeight: null, + $createdAtCoreBlockHeight: null, $updatedAt: null, + $updatedAtBlockHeight: null, + $updatedAtCoreBlockHeight: null, $dataContractId: dataContract.getId().toBuffer(), $id: document.getId().toBuffer(), $ownerId: document.getOwnerId().toBuffer(), diff --git a/packages/wasm-dpp/test/unit/document/Document.spec.js b/packages/wasm-dpp/test/unit/document/Document.spec.js index 087a153e7a..a6680c01a6 100644 --- a/packages/wasm-dpp/test/unit/document/Document.spec.js +++ b/packages/wasm-dpp/test/unit/document/Document.spec.js @@ -85,7 +85,11 @@ describe('Document', () => { $ownerId: ownerId, $revision: DocumentCreateTransition.INITIAL_REVISION, $createdAt: now, + $createdAtBlockHeight: 1, + $createdAtCoreBlockHeight: 1, $updatedAt: now, + $updatedAtBlockHeight: 1, + $updatedAtCoreBlockHeight: 1, }; rawDocumentWithBuffers = { @@ -96,7 +100,11 @@ describe('Document', () => { $ownerId: ownerId.toBuffer(), $revision: DocumentCreateTransition.INITIAL_REVISION, $createdAt: now, + $createdAtBlockHeight: 1, + $createdAtCoreBlockHeight: 1, $updatedAt: now, + $updatedAtBlockHeight: 1, + $updatedAtCoreBlockHeight: 1, }; document = new ExtendedDocument(rawDocument, dataContract); @@ -407,7 +415,7 @@ describe('Document', () => { it('should return serialized Document', () => { const buffer = document.toBuffer(); expect(buffer).to.be.instanceOf(Buffer); - expect(buffer.length).to.equal(624); + expect(buffer.length).to.equal(647); }); // TODO: remove or replace? From 97dc0df71b889fabc89b8d42a56e25ee2987b8f1 Mon Sep 17 00:00:00 2001 From: lklimek <842586+lklimek@users.noreply.github.com> Date: Mon, 18 Mar 2024 16:13:47 +0100 Subject: [PATCH 098/191] build: rs-tenderdash-abci 0.14.0-dev.9 (#1782) --- Cargo.lock | 20 ++++++++++---------- packages/dapi-grpc/Cargo.toml | 2 +- packages/rs-drive-abci/Cargo.toml | 2 +- packages/rs-drive-proof-verifier/Cargo.toml | 2 +- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 117c727a4f..878a8ac2f6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2069,7 +2069,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.5.5", + "socket2 0.4.10", "tokio", "tower-service", "tracing", @@ -2299,7 +2299,7 @@ source = "git+https://github.com/fominok/jsonschema-rs?branch=feat-unevaluated-p dependencies = [ "ahash 0.7.7", "anyhow", - "base64 0.21.7", + "base64 0.13.1", "bytecount", "fancy-regex", "fraction", @@ -3205,7 +3205,7 @@ checksum = "c55e02e35260070b6f716a2423c2ff1c3bb1642ddca6f99e1f26d06268a0e2d2" dependencies = [ "bytes", "heck", - "itertools 0.11.0", + "itertools 0.10.5", "log", "multimap", "once_cell", @@ -3239,7 +3239,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "efb6c9a1dd1def8e2124d17e83a20af56f1570d6c2d2bd9e266ccb768df3840e" dependencies = [ "anyhow", - "itertools 0.11.0", + "itertools 0.10.5", "proc-macro2", "quote", "syn 2.0.48", @@ -4264,8 +4264,8 @@ dependencies = [ [[package]] name = "tenderdash-abci" -version = "0.14.0-dev.8" -source = "git+https://github.com/dashpay/rs-tenderdash-abci#86ba24b8f6d92e6eb24c7d6aff39f9f733d307ba" +version = "0.14.0-dev.9" +source = "git+https://github.com/dashpay/rs-tenderdash-abci#af64c65d94ef233053be8616e4c92f571fb5aae0" dependencies = [ "bytes", "futures", @@ -4285,8 +4285,8 @@ dependencies = [ [[package]] name = "tenderdash-proto" -version = "0.14.0-dev.8" -source = "git+https://github.com/dashpay/rs-tenderdash-abci#86ba24b8f6d92e6eb24c7d6aff39f9f733d307ba" +version = "0.14.0-dev.9" +source = "git+https://github.com/dashpay/rs-tenderdash-abci#af64c65d94ef233053be8616e4c92f571fb5aae0" dependencies = [ "bytes", "chrono", @@ -4305,8 +4305,8 @@ dependencies = [ [[package]] name = "tenderdash-proto-compiler" -version = "0.14.0-dev.8" -source = "git+https://github.com/dashpay/rs-tenderdash-abci#86ba24b8f6d92e6eb24c7d6aff39f9f733d307ba" +version = "0.14.0-dev.9" +source = "git+https://github.com/dashpay/rs-tenderdash-abci#af64c65d94ef233053be8616e4c92f571fb5aae0" dependencies = [ "fs_extra", "prost-build 0.12.3", diff --git a/packages/dapi-grpc/Cargo.toml b/packages/dapi-grpc/Cargo.toml index d12fa9cb41..6c16c32d45 100644 --- a/packages/dapi-grpc/Cargo.toml +++ b/packages/dapi-grpc/Cargo.toml @@ -37,7 +37,7 @@ tonic = { version = "0.11", features = [ serde = { version = "1.0.171", optional = true, features = ["derive"] } serde_bytes = { version = "0.11.12", optional = true } serde_json = { version = "1.0", optional = true } -tenderdash-proto = { git = "https://github.com/dashpay/rs-tenderdash-abci", version = "0.14.0-dev.8", features = [ +tenderdash-proto = { git = "https://github.com/dashpay/rs-tenderdash-abci", version = "0.14.0-dev.9", features = [ "grpc", ] } dapi-grpc-macros = { path = "../rs-dapi-grpc-macros" } diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index 8ad3c35d6d..2455750787 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -55,7 +55,7 @@ tracing-subscriber = { version = "0.3.16", default-features = false, features = "tracing-log", ], optional = false } atty = { version = "0.2.14", optional = false } -tenderdash-abci = { git = "https://github.com/dashpay/rs-tenderdash-abci", version = "0.14.0-dev.8", features = [ +tenderdash-abci = { git = "https://github.com/dashpay/rs-tenderdash-abci", version = "0.14.0-dev.9", features = [ "grpc", ] } lazy_static = "1.4.0" diff --git a/packages/rs-drive-proof-verifier/Cargo.toml b/packages/rs-drive-proof-verifier/Cargo.toml index e0ef185c51..df0ecb8a69 100644 --- a/packages/rs-drive-proof-verifier/Cargo.toml +++ b/packages/rs-drive-proof-verifier/Cargo.toml @@ -20,7 +20,7 @@ drive = { path = "../rs-drive", default-features = false, features = [ "verify", ] } dpp = { path = "../rs-dpp" } -tenderdash-abci = { git = "https://github.com/dashpay/rs-tenderdash-abci", version = "0.14.0-dev.8", features = [ +tenderdash-abci = { git = "https://github.com/dashpay/rs-tenderdash-abci", version = "0.14.0-dev.9", features = [ "grpc", ] } tracing = { version = "0.1.37" } From faefb581faef66e1427e283da0f0169ca96e8629 Mon Sep 17 00:00:00 2001 From: lklimek <842586+lklimek@users.noreply.github.com> Date: Tue, 19 Mar 2024 00:29:33 +0100 Subject: [PATCH 099/191] fix(sdk)!: don't allow duplicate mock expectations (#1788) --- Cargo.lock | 11 +++ packages/rs-dapi-client/src/dapi_client.rs | 9 ++- packages/rs-dapi-client/src/mock.rs | 56 ++++++++++---- .../rs-dapi-client/tests/mock_dapi_client.rs | 2 +- packages/rs-sdk/Cargo.toml | 1 + packages/rs-sdk/src/error.rs | 4 + packages/rs-sdk/src/mock/sdk.rs | 73 +++++++----------- packages/rs-sdk/tests/fetch/broadcast.rs | 2 +- packages/rs-sdk/tests/fetch/config.rs | 44 ++++++++++- packages/rs-sdk/tests/fetch/data_contract.rs | 8 +- packages/rs-sdk/tests/fetch/document.rs | 10 +-- packages/rs-sdk/tests/fetch/epoch.rs | 10 +-- packages/rs-sdk/tests/fetch/identity.rs | 10 +-- .../tests/fetch/identity_contract_nonce.rs | 2 +- packages/rs-sdk/tests/fetch/mock_fetch.rs | 51 ++++++++++-- .../rs-sdk/tests/fetch/mock_fetch_many.rs | 17 +++- .../fetch/protocol_version_vote_count.rs | 2 +- .../tests/fetch/protocol_version_votes.rs | 10 +-- .../document_list_document_query/.gitkeep | 0 ...1733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json} | Bin 74123 -> 74129 bytes ...93d92d2c84b425f8393ffa9599b06a3a77be.json} | Bin 24199 -> 24205 bytes ...db039bd8eba37530edf9202046cf912eb8efd.json | 1 + .../document_list_drive_query/.gitkeep | 0 ...1733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json} | Bin 74137 -> 74129 bytes ...25892e0011f1264c65e1474532f59456ff51.json} | Bin 24213 -> 24205 bytes ...db039bd8eba37530edf9202046cf912eb8efd.json | 1 + .../tests/vectors/document_read/.gitkeep | 0 ...1733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json} | Bin 74125 -> 74129 bytes ...93d92d2c84b425f8393ffa9599b06a3a77be.json} | Bin 24201 -> 24205 bytes ...f38ff6415d9cabab87315b9d9d736194597f.json} | Bin 24327 -> 24331 bytes ...db039bd8eba37530edf9202046cf912eb8efd.json | 1 + .../document_read_no_contract/.gitkeep | 0 ...01c1ba166a2dd8f6efb31b0289dc011da983.json} | Bin 8838 -> 8842 bytes ...db039bd8eba37530edf9202046cf912eb8efd.json | 1 + .../document_read_no_document/.gitkeep | 0 ...1733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json} | Bin 74125 -> 74129 bytes ...cf0df7bf150009b1ced887a6f051ab86085b.json} | Bin 22301 -> 22305 bytes ...db039bd8eba37530edf9202046cf912eb8efd.json | 1 + ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 74133 -> 0 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 74133 -> 0 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 74133 -> 0 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 74133 -> 0 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 74133 -> 0 bytes ...501c1ba166a2dd8f6efb31b0289dc011da983.json | Bin 8856 -> 0 bytes ...093d92d2c84b425f8393ffa9599b06a3a77be.json | Bin 24209 -> 0 bytes ...093d92d2c84b425f8393ffa9599b06a3a77be.json | Bin 24209 -> 0 bytes ...625892e0011f1264c65e1474532f59456ff51.json | Bin 24209 -> 0 bytes ...af38ff6415d9cabab87315b9d9d736194597f.json | Bin 24335 -> 0 bytes ...7776113debe4287515ae60d0645da450a80a1.json | Bin 21973 -> 0 bytes ...fcf0df7bf150009b1ced887a6f051ab86085b.json | Bin 22299 -> 0 bytes ...760d7a75e2a5427cbc90009bf8a2540448035.json | 1 - ...b92786db9a793eeee5d9f52ac7c9b8bbda97c.json | 1 - .../vectors/test_data_contract_read/.gitkeep | 0 ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 0 -> 74129 bytes ...db039bd8eba37530edf9202046cf912eb8efd.json | 1 + .../.gitkeep | 0 ...8c03122daf7ab2e77108f4bf44af1ad15eae.json} | Bin 8856 -> 8842 bytes ...db039bd8eba37530edf9202046cf912eb8efd.json | 1 + .../test_data_contracts_1_ok_1_nx/.gitkeep | 0 ...67bd9ccc29eca3092a5664a5a9ba3bb7e967.json} | Bin 75606 -> 75602 bytes ...db039bd8eba37530edf9202046cf912eb8efd.json | 1 + .../vectors/test_data_contracts_2_nx/.gitkeep | 0 ...bbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json} | Bin 8709 -> 8695 bytes ...db039bd8eba37530edf9202046cf912eb8efd.json | 1 + .../tests/vectors/test_epoch_fetch/.gitkeep | 0 ...776113debe4287515ae60d0645da450a80a1.json} | Bin 21973 -> 21965 bytes ...caf3663c40a12d3b03827006d66058e439ac.json} | Bin 1466413 -> 1466417 bytes ...db039bd8eba37530edf9202046cf912eb8efd.json | 1 + .../vectors/test_epoch_fetch_current/.gitkeep | 0 ...776113debe4287515ae60d0645da450a80a1.json} | Bin 21973 -> 21965 bytes ...7089535588985622579e77969e0ffd68afc7.json} | Bin 20999 -> 21003 bytes ...db039bd8eba37530edf9202046cf912eb8efd.json | 1 + .../vectors/test_epoch_fetch_future/.gitkeep | 0 ...776113debe4287515ae60d0645da450a80a1.json} | Bin 21973 -> 21965 bytes ...dd01a7428085ffdcf1e11cccf19c48c5f7a1.json} | Bin 2668625 -> 2668627 bytes ...db039bd8eba37530edf9202046cf912eb8efd.json | 1 + .../tests/vectors/test_epoch_list/.gitkeep | 0 ...776113debe4287515ae60d0645da450a80a1.json} | Bin 21973 -> 21965 bytes ...592c8fe7361bed628d9a36747664c9789bf1.json} | Bin 2437719 -> 2437719 bytes ...db039bd8eba37530edf9202046cf912eb8efd.json | 1 + .../vectors/test_epoch_list_limit/.gitkeep | 0 ...7776113debe4287515ae60d0645da450a80a1.json | Bin 0 -> 21965 bytes ...0b93d9d2e841a5e3d60755f8e7be3b93315b.json} | Bin 2425345 -> 2425345 bytes ...db039bd8eba37530edf9202046cf912eb8efd.json | 1 + .../test_identity_balance_read/.gitkeep | 0 ...776113debe4287515ae60d0645da450a80a1.json} | Bin 11764 -> 11755 bytes ...db039bd8eba37530edf9202046cf912eb8efd.json | 1 + .../.gitkeep | 0 ...776113debe4287515ae60d0645da450a80a1.json} | Bin 20823 -> 20816 bytes ...db039bd8eba37530edf9202046cf912eb8efd.json | 1 + .../.gitkeep | 0 ...fa69b4749b19cc1f5ef0abf37fa0c04ab2ef.json} | Bin 14551 -> 14553 bytes ...db039bd8eba37530edf9202046cf912eb8efd.json | 1 + .../.gitkeep | 0 ...a459dc7a67570ea6df3f8858d3fae7820ffe.json} | Bin 15482 -> 15483 bytes ...db039bd8eba37530edf9202046cf912eb8efd.json | 1 + .../tests/vectors/test_identity_read/.gitkeep | 0 ...53464633a072722c5a04b15ee01f3a45de99.json} | Bin 24701 -> 24693 bytes ...db039bd8eba37530edf9202046cf912eb8efd.json | 1 + .../test_identity_read_by_key/.gitkeep | 0 ...53464633a072722c5a04b15ee01f3a45de99.json} | Bin 24701 -> 24693 bytes ...efbcc93fdbc66e012e606d530c327265c52d.json} | Bin 31425 -> 30799 bytes ...db039bd8eba37530edf9202046cf912eb8efd.json | 1 + .../test_protocol_version_vote_count/.gitkeep | 0 ...550f0ea4a6af6f68037e7d50ff4e4de74509.json} | Bin 8223 -> 8206 bytes ...db039bd8eba37530edf9202046cf912eb8efd.json | 1 + .../.gitkeep | 0 .../.gitkeep | 0 ...06e5eda740be44679cc960ea35f2134af628.json} | Bin 10896 -> 10881 bytes ...db039bd8eba37530edf9202046cf912eb8efd.json | 1 + .../test_protocol_version_votes_none/.gitkeep | 0 ...f1acc3394d29ac72f662d38e81344496631e.json} | Bin 10648 -> 10630 bytes ...db039bd8eba37530edf9202046cf912eb8efd.json | 1 + .../test_protocol_version_votes_nx/.gitkeep | 0 ...b1a05862cb8d40c088b193b59ca3564210bc.json} | Bin 11315 -> 11303 bytes ...db039bd8eba37530edf9202046cf912eb8efd.json | 1 + .../.gitkeep | 0 ...2dfc69cc7b123be24b7ad993281979b2a3a2.json} | Bin 11006 -> 10988 bytes ...db039bd8eba37530edf9202046cf912eb8efd.json | 1 + .../tests/vectors/test_wait_timeout/.gitkeep | 0 120 files changed, 245 insertions(+), 104 deletions(-) create mode 100644 packages/rs-sdk/tests/vectors/document_list_document_query/.gitkeep rename packages/rs-sdk/tests/vectors/{msg_2024-03-18T08:57:32.047138511Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json => document_list_document_query/msg_2024-03-18T17:30:02.264054333Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json} (97%) rename packages/rs-sdk/tests/vectors/{msg_2024-03-18T08:57:32.068486672Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json => document_list_document_query/msg_2024-03-18T17:30:02.342323339Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json} (91%) create mode 100644 packages/rs-sdk/tests/vectors/document_list_document_query/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json create mode 100644 packages/rs-sdk/tests/vectors/document_list_drive_query/.gitkeep rename packages/rs-sdk/tests/vectors/{msg_2024-03-18T08:56:19.629079892Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json => document_list_drive_query/msg_2024-03-18T17:30:02.267948117Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json} (97%) rename packages/rs-sdk/tests/vectors/{msg_2024-03-18T08:56:19.649147329Z_DocumentQuery_c104c67292061fe0b8e2f959cd2625892e0011f1264c65e1474532f59456ff51.json => document_list_drive_query/msg_2024-03-18T17:30:02.342760372Z_DocumentQuery_c104c67292061fe0b8e2f959cd2625892e0011f1264c65e1474532f59456ff51.json} (90%) create mode 100644 packages/rs-sdk/tests/vectors/document_list_drive_query/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json create mode 100644 packages/rs-sdk/tests/vectors/document_read/.gitkeep rename packages/rs-sdk/tests/vectors/{msg_2024-03-18T08:55:01.204915874Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json => document_read/msg_2024-03-18T17:30:02.267493110Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json} (96%) rename packages/rs-sdk/tests/vectors/{msg_2024-03-18T08:55:01.234819753Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json => document_read/msg_2024-03-18T17:30:02.345966821Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json} (90%) rename packages/rs-sdk/tests/vectors/{msg_2024-03-18T08:55:01.244377672Z_DocumentQuery_90af5a08200f1b0e42dbd3ad7a6af38ff6415d9cabab87315b9d9d736194597f.json => document_read/msg_2024-03-18T17:30:02.533877193Z_DocumentQuery_90af5a08200f1b0e42dbd3ad7a6af38ff6415d9cabab87315b9d9d736194597f.json} (90%) create mode 100644 packages/rs-sdk/tests/vectors/document_read/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json create mode 100644 packages/rs-sdk/tests/vectors/document_read_no_contract/.gitkeep rename packages/rs-sdk/tests/vectors/{msg_2024-03-18T08:55:01.204152704Z_GetDataContractRequest_e4cf74168e03a40bd159451456b501c1ba166a2dd8f6efb31b0289dc011da983.json => document_read_no_contract/msg_2024-03-18T17:30:02.266644051Z_GetDataContractRequest_e4cf74168e03a40bd159451456b501c1ba166a2dd8f6efb31b0289dc011da983.json} (74%) create mode 100644 packages/rs-sdk/tests/vectors/document_read_no_contract/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json create mode 100644 packages/rs-sdk/tests/vectors/document_read_no_document/.gitkeep rename packages/rs-sdk/tests/vectors/{msg_2024-03-18T08:55:01.205188238Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json => document_read_no_document/msg_2024-03-18T17:30:02.270343589Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json} (96%) rename packages/rs-sdk/tests/vectors/{msg_2024-03-18T08:55:01.241108252Z_DocumentQuery_fb3b25c8fa37750a6c1b18d9085fcf0df7bf150009b1ced887a6f051ab86085b.json => document_read_no_document/msg_2024-03-18T17:30:02.350206947Z_DocumentQuery_fb3b25c8fa37750a6c1b18d9085fcf0df7bf150009b1ced887a6f051ab86085b.json} (89%) create mode 100644 packages/rs-sdk/tests/vectors/document_read_no_document/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:53.458555110Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:53.462631138Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:53.462652017Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:53.471485849Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:53.485931461Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:53.488953093Z_GetDataContractRequest_e4cf74168e03a40bd159451456b501c1ba166a2dd8f6efb31b0289dc011da983.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:53.573920842Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:53.577076107Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:53.577082679Z_DocumentQuery_c104c67292061fe0b8e2f959cd2625892e0011f1264c65e1474532f59456ff51.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:54.216923773Z_DocumentQuery_90af5a08200f1b0e42dbd3ad7a6af38ff6415d9cabab87315b9d9d736194597f.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:54.251885544Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:54.258023385Z_DocumentQuery_fb3b25c8fa37750a6c1b18d9085fcf0df7bf150009b1ced887a6f051ab86085b.json delete mode 100644 packages/rs-sdk/tests/vectors/quorum_pubkey-106-6d309b63e7a286d50c8091772d4760d7a75e2a5427cbc90009bf8a2540448035.json delete mode 100644 packages/rs-sdk/tests/vectors/quorum_pubkey-106-701f88befd253a93e07bfd7efdab92786db9a793eeee5d9f52ac7c9b8bbda97c.json create mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_read/.gitkeep create mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_read/msg_2024-03-18T17:30:02.264404663Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json create mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_read/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json create mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/.gitkeep rename packages/rs-sdk/tests/vectors/{msg_2024-02-20T11:33:53.479909227Z_GetDataContractRequest_1d1e53ab5e04d9ec5dce4ff9ac048c03122daf7ab2e77108f4bf44af1ad15eae.json => test_data_contract_read_not_found/msg_2024-03-18T17:30:02.254826261Z_GetDataContractRequest_1d1e53ab5e04d9ec5dce4ff9ac048c03122daf7ab2e77108f4bf44af1ad15eae.json} (70%) create mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json create mode 100644 packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/.gitkeep rename packages/rs-sdk/tests/vectors/{msg_2024-02-20T11:33:53.480718000Z_GetDataContractsRequest_f229a0e58a5c4fb050f57c087bf067bd9ccc29eca3092a5664a5a9ba3bb7e967.json => test_data_contracts_1_ok_1_nx/msg_2024-03-18T17:30:02.262237140Z_GetDataContractsRequest_f229a0e58a5c4fb050f57c087bf067bd9ccc29eca3092a5664a5a9ba3bb7e967.json} (96%) create mode 100644 packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json create mode 100644 packages/rs-sdk/tests/vectors/test_data_contracts_2_nx/.gitkeep rename packages/rs-sdk/tests/vectors/{msg_2024-02-20T11:33:53.484884409Z_GetDataContractsRequest_93bdf343bce1bafb96fd873236cabbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json => test_data_contracts_2_nx/msg_2024-03-18T17:30:02.261742919Z_GetDataContractsRequest_93bdf343bce1bafb96fd873236cabbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json} (70%) create mode 100644 packages/rs-sdk/tests/vectors/test_data_contracts_2_nx/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch/.gitkeep rename packages/rs-sdk/tests/vectors/{msg_2024-02-20T11:33:53.470444798Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json => test_epoch_fetch/msg_2024-03-18T17:30:02.266794754Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json} (81%) rename packages/rs-sdk/tests/vectors/{msg_2024-02-20T11:33:53.596516327Z_GetEpochsInfoRequest_b2b426ac4a52cb4cb08904c63386caf3663c40a12d3b03827006d66058e439ac.json => test_epoch_fetch/msg_2024-03-18T17:30:02.329977013Z_GetEpochsInfoRequest_b2b426ac4a52cb4cb08904c63386caf3663c40a12d3b03827006d66058e439ac.json} (99%) create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_current/.gitkeep rename packages/rs-sdk/tests/vectors/{msg_2024-02-20T11:33:53.461986163Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json => test_epoch_fetch_current/msg_2024-03-18T17:30:02.275436110Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json} (81%) rename packages/rs-sdk/tests/vectors/{msg_2024-02-20T11:33:53.490170997Z_GetEpochsInfoRequest_1b87e649557ccb609adb9e2904c67089535588985622579e77969e0ffd68afc7.json => test_epoch_fetch_current/msg_2024-03-18T17:30:02.282004524Z_GetEpochsInfoRequest_1b87e649557ccb609adb9e2904c67089535588985622579e77969e0ffd68afc7.json} (85%) create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_future/.gitkeep rename packages/rs-sdk/tests/vectors/{msg_2024-02-20T11:33:53.585317181Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json => test_epoch_fetch_future/msg_2024-03-18T17:30:02.315343769Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json} (81%) rename packages/rs-sdk/tests/vectors/{msg_2024-02-20T11:33:53.948006184Z_GetEpochsInfoRequest_6a828350e795a088dbc835260a1add01a7428085ffdcf1e11cccf19c48c5f7a1.json => test_epoch_fetch_future/msg_2024-03-18T17:30:02.797274401Z_GetEpochsInfoRequest_6a828350e795a088dbc835260a1add01a7428085ffdcf1e11cccf19c48c5f7a1.json} (99%) create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list/.gitkeep rename packages/rs-sdk/tests/vectors/{msg_2024-02-20T11:33:53.562881817Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json => test_epoch_list/msg_2024-03-18T17:30:02.333739890Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json} (81%) rename packages/rs-sdk/tests/vectors/{msg_2024-02-20T11:33:54.305969656Z_GetEpochsInfoRequest_734f6594c67fe6a9ab170191031d592c8fe7361bed628d9a36747664c9789bf1.json => test_epoch_list/msg_2024-03-18T17:30:02.769567913Z_GetEpochsInfoRequest_734f6594c67fe6a9ab170191031d592c8fe7361bed628d9a36747664c9789bf1.json} (99%) create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list_limit/.gitkeep create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_2024-03-18T17:30:02.341524594Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json rename packages/rs-sdk/tests/vectors/{msg_2024-02-20T11:33:54.648522779Z_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json => test_epoch_list_limit/msg_2024-03-18T17:30:02.764646694Z_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json} (99%) create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list_limit/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_balance_read/.gitkeep rename packages/rs-sdk/tests/vectors/{msg_2024-02-20T11:33:54.228228459Z_GetIdentityBalanceRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json => test_identity_balance_read/msg_2024-03-18T17:30:02.341682532Z_GetIdentityBalanceRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json} (73%) create mode 100644 packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/.gitkeep rename packages/rs-sdk/tests/vectors/{msg_2024-02-20T11:33:54.235614684Z_GetIdentityBalanceAndRevisionRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json => test_identity_balance_revision_read/msg_2024-03-18T17:30:02.345340351Z_GetIdentityBalanceAndRevisionRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json} (80%) create mode 100644 packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/.gitkeep rename packages/rs-sdk/tests/vectors/{msg_2024-02-20T11:33:54.256001517Z_GetIdentityContractNonceRequest_b7c02dae0c3c762ece1f70a36f88fa69b4749b19cc1f5ef0abf37fa0c04ab2ef.json => test_identity_contract_no_nonce_read/msg_2024-03-18T17:30:02.540146201Z_GetIdentityContractNonceRequest_b7c02dae0c3c762ece1f70a36f88fa69b4749b19cc1f5ef0abf37fa0c04ab2ef.json} (75%) create mode 100644 packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/.gitkeep rename packages/rs-sdk/tests/vectors/{msg_2024-02-20T11:33:54.222895153Z_GetIdentityKeysRequest_b4ecff7acf52818aef9ed37a98d4a459dc7a67570ea6df3f8858d3fae7820ffe.json => test_identity_public_keys_all_read/msg_2024-03-18T17:30:02.532347572Z_GetIdentityKeysRequest_b4ecff7acf52818aef9ed37a98d4a459dc7a67570ea6df3f8858d3fae7820ffe.json} (75%) create mode 100644 packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_read/.gitkeep rename packages/rs-sdk/tests/vectors/{msg_2024-02-20T11:33:54.235379280Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json => test_identity_read/msg_2024-03-18T17:30:02.541907348Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json} (81%) create mode 100644 packages/rs-sdk/tests/vectors/test_identity_read/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_read_by_key/.gitkeep rename packages/rs-sdk/tests/vectors/{msg_2024-02-20T11:33:54.255202663Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json => test_identity_read_by_key/msg_2024-03-18T17:30:02.533475216Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json} (81%) rename packages/rs-sdk/tests/vectors/{msg_2024-02-20T11:33:54.612885967Z_IdentityRequest_6f74498ccb101c39329fd63ff2af65555849abef7f60625ccd3623e6e829c227.json => test_identity_read_by_key/msg_2024-03-18T17:30:02.579369080Z_IdentityRequest_8fb3b1a4ef0db316161d4ed79b93efbcc93fdbc66e012e606d530c327265c52d.json} (80%) create mode 100644 packages/rs-sdk/tests/vectors/test_identity_read_by_key/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/.gitkeep rename packages/rs-sdk/tests/vectors/{msg_2024-02-20T11:33:54.258421095Z_GetProtocolVersionUpgradeStateRequest_bb149e1933b9dc561bbfacfb6d09550f0ea4a6af6f68037e7d50ff4e4de74509.json => test_protocol_version_vote_count/msg_2024-03-18T17:30:02.555246935Z_GetProtocolVersionUpgradeStateRequest_bb149e1933b9dc561bbfacfb6d09550f0ea4a6af6f68037e7d50ff4e4de74509.json} (69%) create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_0/.gitkeep create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/.gitkeep rename packages/rs-sdk/tests/vectors/{msg_2024-02-20T11:33:54.269797646Z_GetProtocolVersionUpgradeVoteStatusRequest_ec9dca65a964669b3bc8195d5ff106e5eda740be44679cc960ea35f2134af628.json => test_protocol_version_votes_limit_2/msg_2024-03-18T17:30:02.564325075Z_GetProtocolVersionUpgradeVoteStatusRequest_ec9dca65a964669b3bc8195d5ff106e5eda740be44679cc960ea35f2134af628.json} (72%) create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/.gitkeep rename packages/rs-sdk/tests/vectors/{msg_2024-02-20T11:33:54.600823915Z_GetProtocolVersionUpgradeVoteStatusRequest_983670ac95678b1166deab32209bf1acc3394d29ac72f662d38e81344496631e.json => test_protocol_version_votes_none/msg_2024-03-18T17:30:02.568021928Z_GetProtocolVersionUpgradeVoteStatusRequest_983670ac95678b1166deab32209bf1acc3394d29ac72f662d38e81344496631e.json} (71%) create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/.gitkeep rename packages/rs-sdk/tests/vectors/{msg_2024-02-20T11:33:54.612509758Z_GetProtocolVersionUpgradeVoteStatusRequest_8534be7e0b4dd648520dc3a67209b1a05862cb8d40c088b193b59ca3564210bc.json => test_protocol_version_votes_nx/msg_2024-03-18T17:30:02.581804568Z_GetProtocolVersionUpgradeVoteStatusRequest_8534be7e0b4dd648520dc3a67209b1a05862cb8d40c088b193b59ca3564210bc.json} (74%) create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/.gitkeep rename packages/rs-sdk/tests/vectors/{msg_2024-02-20T11:33:54.612507684Z_GetProtocolVersionUpgradeVoteStatusRequest_92a45a0fe4f69d355022d2f2f7622dfc69cc7b123be24b7ad993281979b2a3a2.json => test_protocol_version_votes_zeros/msg_2024-03-18T17:30:02.590618781Z_GetProtocolVersionUpgradeVoteStatusRequest_92a45a0fe4f69d355022d2f2f7622dfc69cc7b123be24b7ad993281979b2a3a2.json} (72%) create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json create mode 100644 packages/rs-sdk/tests/vectors/test_wait_timeout/.gitkeep diff --git a/Cargo.lock b/Cargo.lock index 878a8ac2f6..d510e9a547 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3550,6 +3550,7 @@ dependencies = [ "http", "lru", "rs-dapi-client", + "sanitize-filename", "serde", "serde_json", "thiserror", @@ -3742,6 +3743,16 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "sanitize-filename" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ed72fbaf78e6f2d41744923916966c4fbe3d7c74e3037a8ee482f1115572603" +dependencies = [ + "lazy_static", + "regex", +] + [[package]] name = "schannel" version = "0.1.23" diff --git a/packages/rs-dapi-client/src/dapi_client.rs b/packages/rs-dapi-client/src/dapi_client.rs index 12962e9774..7486b8f5a9 100644 --- a/packages/rs-dapi-client/src/dapi_client.rs +++ b/packages/rs-dapi-client/src/dapi_client.rs @@ -25,10 +25,11 @@ pub enum DapiClientError { /// [AddressListError] errors #[error("address list error: {0}")] AddressList(AddressListError), + #[cfg(feature = "mocks")] - /// Expectation not found - #[error("mock expectation not found for request: {0}")] - MockExpectationNotFound(String), + #[error("mock error: {0}")] + /// Error happened in mock client + Mock(#[from] crate::mock::MockError), } impl CanRetry for DapiClientError { @@ -39,7 +40,7 @@ impl CanRetry for DapiClientError { Transport(transport_error, _) => transport_error.is_node_failure(), AddressList(_) => false, #[cfg(feature = "mocks")] - MockExpectationNotFound(_) => false, + Mock(_) => false, } } } diff --git a/packages/rs-dapi-client/src/mock.rs b/packages/rs-dapi-client/src/mock.rs index 4b9d332552..08142b4812 100644 --- a/packages/rs-dapi-client/src/mock.rs +++ b/packages/rs-dapi-client/src/mock.rs @@ -42,12 +42,12 @@ impl MockDapiClient { } /// Add a new expectation for a request - pub fn expect(&mut self, request: &R, response: &R::Response) -> &mut Self + pub fn expect(&mut self, request: &R, response: &R::Response) -> Result<&mut Self, MockError> where R: TransportRequest + Mockable, R::Response: Mockable, { - let key = self.expectations.add(request, response); + let key = self.expectations.add(request, response)?; tracing::trace!( %key, @@ -56,7 +56,7 @@ impl MockDapiClient { "mock added expectation" ); - self + Ok(self) } /// Load expectation from file. @@ -84,7 +84,12 @@ impl MockDapiClient { })?; let (request, response) = data.deserialize(); - self.expect(&request, &response); + self.expect(&request, &response).map_err(|e| { + std::io::Error::new( + std::io::ErrorKind::InvalidInput, + format!("unable to add expectation: {}", e), + ) + })?; Ok((request, response)) } } @@ -113,10 +118,11 @@ impl DapiRequestExecutor for MockDapiClient { return if let Some(response) = response { Ok(response) } else { - Err(DapiClientError::MockExpectationNotFound(format!( + Err(MockError::MockExpectationNotFound(format!( "unexpected mock request with key {}, use MockDapiClient::expect(): {:?}", key, request - ))) + )) + .into()) }; } } @@ -149,12 +155,7 @@ impl Key { let mut e = sha2::Sha256::new(); e.update(encoded); - let key = e.finalize().try_into().map_err(|e| { - std::io::Error::new( - std::io::ErrorKind::InvalidData, - format!("invalid key generated: {}", e), - ) - })?; + let key = e.finalize().into(); Ok(Self(key)) } @@ -175,7 +176,20 @@ impl Display for Key { } } +#[derive(Debug, thiserror::Error)] +/// Mock errors +pub enum MockError { + #[error("mock expectation not found for request: {0}")] + /// Expectation not found + MockExpectationNotFound(String), + + #[error("expectation already defined for request: {0}")] + /// Expectation already defined for request + MockExpectationConflict(String), +} + #[derive(Debug)] +/// Wrapper that encapsulated serialized form of expected response for a request struct ExpectedResponse(Vec); impl ExpectedResponse { @@ -199,14 +213,26 @@ struct Expectations { impl Expectations { /// Add expected request and provide given response. /// - /// If the expectation already exists, it will be silently replaced. - pub fn add(&mut self, request: &I, response: &O) -> Key { + /// If the expectation already exists, error is returned. + pub fn add( + &mut self, + request: &I, + response: &O, + ) -> Result { let key = Key::new(request); let value = ExpectedResponse::serialize(response); + if self.expectations.contains_key(&key) { + return Err(MockError::MockExpectationConflict(format!( + "expectation with key {} already defined for {} request", + key, + std::any::type_name::(), + ))); + } + self.expectations.insert(key.clone(), value); - key + Ok(key) } /// Get the response for a given request. diff --git a/packages/rs-dapi-client/tests/mock_dapi_client.rs b/packages/rs-dapi-client/tests/mock_dapi_client.rs index 117106c821..291feb861b 100644 --- a/packages/rs-dapi-client/tests/mock_dapi_client.rs +++ b/packages/rs-dapi-client/tests/mock_dapi_client.rs @@ -19,7 +19,7 @@ async fn test_mock_get_identity_dapi_client() { })) }; - dapi.expect(&request, &response); + dapi.expect(&request, &response).expect("expectation added"); let settings = RequestSettings::default(); diff --git a/packages/rs-sdk/Cargo.toml b/packages/rs-sdk/Cargo.toml index ccd8e38b59..10ca664020 100644 --- a/packages/rs-sdk/Cargo.toml +++ b/packages/rs-sdk/Cargo.toml @@ -45,6 +45,7 @@ dpp = { path = "../rs-dpp", features = [ data-contracts = { path = "../data-contracts" } tokio-test = { version = "0.4.3" } clap = { version = "4.4.18", features = ["derive"] } +sanitize-filename = { version = "0.5.0" } [features] default = ["mocks", "offline-testing"] diff --git a/packages/rs-sdk/src/error.rs b/packages/rs-sdk/src/error.rs index 5b68ff6246..96f8e0db92 100644 --- a/packages/rs-sdk/src/error.rs +++ b/packages/rs-sdk/src/error.rs @@ -30,6 +30,10 @@ pub enum Error { /// DAPI client error, for example, connection error #[error("Dapi client error: {0}")] DapiClientError(String), + #[cfg(feature = "mocks")] + /// DAPI mocks error + #[error("Dapi mocks error: {0}")] + DapiMocksError(#[from] rs_dapi_client::mock::MockError), /// Dash core error #[error("Dash core error: {0}")] CoreError(#[from] dpp::dashcore::Error), diff --git a/packages/rs-sdk/src/mock/sdk.rs b/packages/rs-sdk/src/mock/sdk.rs index 3ec8da08e6..65053e6dcc 100644 --- a/packages/rs-sdk/src/mock/sdk.rs +++ b/packages/rs-sdk/src/mock/sdk.rs @@ -8,6 +8,7 @@ use dapi_grpc::{ }; use dpp::version::PlatformVersion; use drive_proof_verifier::{error::ContextProviderError, FromProof, MockContextProvider}; +use rs_dapi_client::mock::MockError; use rs_dapi_client::{ mock::{Key, MockDapiClient}, transport::TransportRequest, @@ -175,7 +176,7 @@ impl MockDashPlatformSdk { })? .deserialize(); - self.dapi.lock().await.expect(&data.0, &data.1); + self.dapi.lock().await.expect(&data.0, &data.1)?; Ok(()) } @@ -195,8 +196,8 @@ impl MockDashPlatformSdk { /// /// ## Returns /// - /// * Some(O): If the object is expected to exist. - /// * None: If the object is expected to not exist. + /// * Reference to self on success, to allow chaining + /// * Error when expectation cannot be set or is already defined for this request /// /// ## Panics /// @@ -217,7 +218,7 @@ impl MockDashPlatformSdk { /// // Define query that will be sent /// let query = expected.id(); /// // Expect that in response to `query`, `expected` will be returned - /// api.mock().expect_fetch(query, Some(expected.clone())).await; + /// api.mock().expect_fetch(query, Some(expected.clone())).await.unwrap(); /// /// // Fetch the identity /// let retrieved = dpp::prelude::Identity::fetch(&api, query) @@ -233,14 +234,14 @@ impl MockDashPlatformSdk { &mut self, query: Q, object: Option, - ) -> &mut Self + ) -> Result<&mut Self, Error> where <::Request as TransportRequest>::Response: Default, { let grpc_request = query.query(self.prove).expect("query must be correct"); - self.expect(grpc_request, object).await; + self.expect(grpc_request, object).await?; - self + Ok(self) } /// Expect a [FetchMany] request and return provided object. @@ -260,8 +261,8 @@ impl MockDashPlatformSdk { /// /// ## Returns /// - /// * `Some(Vec)`: If the objects are expected to exist. - /// * `None`: If the objects are expected to not exist. + /// * Reference to self on success, to allow chaining + /// * Error when expectation cannot be set or is already defined for this request /// /// ## Panics /// @@ -280,7 +281,7 @@ impl MockDashPlatformSdk { &mut self, query: Q, objects: Option>>, - ) -> &mut Self + ) -> Result<&mut Self, Error> where BTreeMap>: MockResponse, <>::Request as TransportRequest>::Response: Default, @@ -291,9 +292,9 @@ impl MockDashPlatformSdk { > + Sync, { let grpc_request = query.query(self.prove).expect("query must be correct"); - self.expect(grpc_request, objects).await; + self.expect(grpc_request, objects).await?; - self + Ok(self) } /// Save expectations for a request. @@ -301,49 +302,33 @@ impl MockDashPlatformSdk { &mut self, grpc_request: I, returned_object: Option, - ) where + ) -> Result<(), Error> + where I::Response: Default, { let key = Key::new(&grpc_request); + // detect duplicates + if self.from_proof_expectations.contains_key(&key) { + return Err(MockError::MockExpectationConflict(format!( + "proof expectation key {} already defined for {} request: {:?}", + key, + std::any::type_name::(), + grpc_request + )) + .into()); + } + // This expectation will work for from_proof self.from_proof_expectations .insert(key, returned_object.mock_serialize(self)); // This expectation will work for execute let mut dapi_guard = self.dapi.lock().await; - // We don't really care about the response, as it will be mocked by from_proof - dapi_guard.expect(&grpc_request, &Default::default()); - } + // We don't really care about the response, as it will be mocked by from_proof, so we provide default() + dapi_guard.expect(&grpc_request, &Default::default())?; - /// Wrapper around [FromProof] that uses mock expectations instead of executing [FromProof] trait. - #[allow(dead_code)] - #[deprecated(note = "This function is marked as unused.")] - pub(crate) fn parse_proof>( - &self, - request: O::Request, - response: O::Response, - ) -> Result, drive_proof_verifier::Error> - where - O::Request: Mockable, - Option: MockResponse, - // O: FromProof<>::Request>, - { - let key = Key::new(&request); - - let data = match self.from_proof_expectations.get(&key) { - Some(d) => Option::::mock_deserialize(self, d), - None => { - let version = self.version(); - let provider = self.quorum_provider.as_ref() - .ok_or(ContextProviderError::InvalidQuorum( - "expectation not found and quorum info provider not initialized with sdk.mock().quorum_info_dir()".to_string() - ))?; - O::maybe_from_proof(request, response, version, provider)? - } - }; - - Ok(data) + Ok(()) } /// Wrapper around [FromProof] that uses mock expectations instead of executing [FromProof] trait. diff --git a/packages/rs-sdk/tests/fetch/broadcast.rs b/packages/rs-sdk/tests/fetch/broadcast.rs index 27d33987ab..dbc5a280a6 100644 --- a/packages/rs-sdk/tests/fetch/broadcast.rs +++ b/packages/rs-sdk/tests/fetch/broadcast.rs @@ -19,7 +19,7 @@ mod online { const TIMEOUT: std::time::Duration = std::time::Duration::from_millis(400); let cfg = Config::new(); - let sdk = cfg.setup_api().await; + let sdk = cfg.setup_api("test_wait_timeout").await; let sdk_ref: &Sdk = sdk.as_ref(); let request: WaitForStateTransitionResultRequest = WaitForStateTransitionResultRequestV0 { diff --git a/packages/rs-sdk/tests/fetch/config.rs b/packages/rs-sdk/tests/fetch/config.rs index 2c97bc33f2..ff2eb4c824 100644 --- a/packages/rs-sdk/tests/fetch/config.rs +++ b/packages/rs-sdk/tests/fetch/config.rs @@ -137,7 +137,30 @@ impl Config { /// new test vectors during execution /// * `offline-testing` is set - use mock implementation and /// load existing test vectors from disk - pub async fn setup_api(&self) -> Arc { + /// + /// ## Arguments + /// + /// * namespace - namespace to use when storing mock expectations; this is used to separate + /// expectations from different tests. + /// + /// When empty string is provided, expectations are stored in the root of the dump directory. + pub async fn setup_api(&self, namespace: &str) -> Arc { + let dump_dir = match namespace.is_empty() { + true => self.dump_dir.clone(), + false => self.dump_dir.join(sanitize_filename::sanitize(namespace)), + }; + + if dump_dir.is_relative() { + panic!( + "dump dir must be absolute path to avoid mistakes, got: {}", + dump_dir.display() + ); + } + + if dump_dir.as_os_str().eq("/") { + panic!("cannot use namespace with root dump dir"); + } + // offline testing takes precedence over network testing #[cfg(all(feature = "network-testing", not(feature = "offline-testing")))] let sdk = { @@ -150,7 +173,20 @@ impl Config { ); #[cfg(feature = "generate-test-vectors")] - let builder = builder.with_dump_dir(&self.dump_dir); + let builder = { + // When we use namespaces, clean up the namespaced dump dir before starting + // to avoid mixing expectations from different test runs + if !namespace.is_empty() { + if let Err(err) = std::fs::remove_dir_all(&dump_dir) { + tracing::warn!(?err, ?dump_dir, "failed to remove dump dir"); + } + std::fs::create_dir_all(&dump_dir).expect("create dump dir"); + // ensure dump dir is committed to git + std::fs::write(dump_dir.join(".gitkeep"), "").expect("create .gitkeep file") + } + + builder.with_dump_dir(&dump_dir) + }; builder.build().expect("cannot initialize api") }; @@ -164,8 +200,8 @@ impl Config { mock_sdk .mock() - .quorum_info_dir(&self.dump_dir) - .load_expectations(&self.dump_dir) + .quorum_info_dir(&dump_dir) + .load_expectations(&dump_dir) .await .expect("load expectations"); diff --git a/packages/rs-sdk/tests/fetch/data_contract.rs b/packages/rs-sdk/tests/fetch/data_contract.rs index 02d3743a7f..44fbbfb288 100644 --- a/packages/rs-sdk/tests/fetch/data_contract.rs +++ b/packages/rs-sdk/tests/fetch/data_contract.rs @@ -9,7 +9,7 @@ async fn test_data_contract_read_not_found() { let id = Identifier::from_bytes(&DATA_CONTRACT_ID_BYTES).expect("parse identity id"); let cfg = Config::new(); - let sdk = cfg.setup_api().await; + let sdk = cfg.setup_api("test_data_contract_read_not_found").await; let result = DataContract::fetch(&sdk, id).await; @@ -23,7 +23,7 @@ async fn test_data_contract_read() { let cfg = Config::new(); let id = cfg.existing_data_contract_id; - let sdk = cfg.setup_api().await; + let sdk = cfg.setup_api("test_data_contract_read").await; let result = DataContract::fetch_by_identifier(&sdk, id).await; @@ -40,7 +40,7 @@ async fn test_data_contracts_1_ok_1_nx() { let nx_id = Identifier::from_bytes(&[1; 32]).expect("parse identity id"); let ids = [id, nx_id]; - let sdk = cfg.setup_api().await; + let sdk = cfg.setup_api("test_data_contracts_1_ok_1_nx").await; let result = DataContract::fetch_by_identifiers(&sdk, ids) .await @@ -73,7 +73,7 @@ async fn test_data_contracts_2_nx() { let nx_id_2 = Identifier::from_bytes(&[1; 32]).expect("parse identity id"); let ids = vec![nx_id_1, nx_id_2]; - let sdk = cfg.setup_api().await; + let sdk = cfg.setup_api("test_data_contracts_2_nx").await; let result = DataContract::fetch_many(&sdk, ids) .await diff --git a/packages/rs-sdk/tests/fetch/document.rs b/packages/rs-sdk/tests/fetch/document.rs index fbe1f5ee8a..7308048ab7 100644 --- a/packages/rs-sdk/tests/fetch/document.rs +++ b/packages/rs-sdk/tests/fetch/document.rs @@ -16,7 +16,7 @@ async fn document_read() { setup_logs(); let cfg = Config::new(); - let sdk = cfg.setup_api().await; + let sdk = cfg.setup_api("document_read").await; let data_contract_id = cfg.existing_data_contract_id; @@ -58,7 +58,7 @@ async fn document_read_no_contract() { setup_logs(); let cfg = Config::new(); - let sdk = cfg.setup_api().await; + let sdk = cfg.setup_api("document_read_no_contract").await; let data_contract_id = Identifier::from_bytes(&[0; 32]).expect("create Identifier"); @@ -82,7 +82,7 @@ async fn document_read_no_document() { setup_logs(); let cfg = Config::new(); - let sdk = cfg.setup_api().await; + let sdk = cfg.setup_api("document_read_no_document").await; let data_contract_id = cfg.existing_data_contract_id; let document_id = [0; 32].into(); @@ -110,7 +110,7 @@ async fn document_list_drive_query() { setup_logs(); let cfg = Config::new(); - let sdk = cfg.setup_api().await; + let sdk = cfg.setup_api("document_list_drive_query").await; let data_contract_id = cfg.existing_data_contract_id; @@ -155,7 +155,7 @@ async fn document_list_document_query() { setup_logs(); let cfg = Config::new(); - let sdk = cfg.setup_api().await; + let sdk = cfg.setup_api("document_list_document_query").await; let data_contract_id = cfg.existing_data_contract_id; diff --git a/packages/rs-sdk/tests/fetch/epoch.rs b/packages/rs-sdk/tests/fetch/epoch.rs index 5a31840981..dda9aa6cd3 100644 --- a/packages/rs-sdk/tests/fetch/epoch.rs +++ b/packages/rs-sdk/tests/fetch/epoch.rs @@ -80,7 +80,7 @@ async fn test_epoch_list() { setup_logs(); let cfg = Config::new(); - let sdk = cfg.setup_api().await; + let sdk = cfg.setup_api("test_epoch_list").await; // Given some starting epoch and current epoch // Note the devnet does not necessarily start with epoch 0 @@ -107,7 +107,7 @@ async fn test_epoch_list_limit() { setup_logs(); let cfg = Config::new(); - let sdk = cfg.setup_api().await; + let sdk = cfg.setup_api("test_epoch_list_limit").await; // Given some starting epoch and current epoch // Note the devnet does not necessarily start with epoch 0 @@ -133,7 +133,7 @@ async fn test_epoch_fetch() { setup_logs(); let cfg = Config::new(); - let sdk = cfg.setup_api().await; + let sdk = cfg.setup_api("test_epoch_fetch").await; // Given some current epoch let current_epoch = get_current_epoch(&sdk, &cfg).await; @@ -152,7 +152,7 @@ async fn test_epoch_fetch_future() { setup_logs(); let cfg = Config::new(); - let sdk = cfg.setup_api().await; + let sdk = cfg.setup_api("test_epoch_fetch_future").await; // Given some current epoch let current_epoch = get_current_epoch(&sdk, &cfg).await; @@ -170,7 +170,7 @@ async fn test_epoch_fetch_current() { setup_logs(); let cfg = Config::new(); - let sdk = cfg.setup_api().await; + let sdk = cfg.setup_api("test_epoch_fetch_current").await; // Given some current epoch let expected_epoch = get_current_epoch(&sdk, &cfg).await; diff --git a/packages/rs-sdk/tests/fetch/identity.rs b/packages/rs-sdk/tests/fetch/identity.rs index b7711b55aa..13656a933e 100644 --- a/packages/rs-sdk/tests/fetch/identity.rs +++ b/packages/rs-sdk/tests/fetch/identity.rs @@ -17,7 +17,7 @@ async fn test_identity_read() { let cfg = Config::new(); let id: dpp::prelude::Identifier = cfg.existing_identity_id; - let sdk = cfg.setup_api().await; + let sdk = cfg.setup_api("test_identity_read").await; let identity = Identity::fetch(&sdk, id) .await @@ -33,7 +33,7 @@ async fn test_identity_read_by_key() { let cfg = Config::new(); let id = cfg.existing_identity_id; - let sdk = cfg.setup_api().await; + let sdk = cfg.setup_api("test_identity_read_by_key").await; let identity = Identity::fetch(&sdk, id) .await @@ -63,7 +63,7 @@ async fn test_identity_balance_read() { let cfg = Config::new(); let id: dpp::prelude::Identifier = cfg.existing_identity_id; - let sdk = cfg.setup_api().await; + let sdk = cfg.setup_api("test_identity_balance_read").await; let balance = IdentityBalance::fetch(&sdk, id) .await @@ -81,7 +81,7 @@ async fn test_identity_balance_revision_read() { let cfg = Config::new(); let id: dpp::prelude::Identifier = cfg.existing_identity_id; - let sdk = cfg.setup_api().await; + let sdk = cfg.setup_api("test_identity_balance_revision_read").await; let (balance, revision) = IdentityBalanceAndRevision::fetch(&sdk, id) .await @@ -99,7 +99,7 @@ async fn test_identity_public_keys_all_read() { let cfg = Config::new(); let id: dpp::prelude::Identifier = cfg.existing_identity_id; - let sdk = cfg.setup_api().await; + let sdk = cfg.setup_api("test_identity_public_keys_all_read").await; let public_keys = IdentityPublicKey::fetch_many(&sdk, id) .await diff --git a/packages/rs-sdk/tests/fetch/identity_contract_nonce.rs b/packages/rs-sdk/tests/fetch/identity_contract_nonce.rs index 59bf7f8e8e..83e0808abd 100644 --- a/packages/rs-sdk/tests/fetch/identity_contract_nonce.rs +++ b/packages/rs-sdk/tests/fetch/identity_contract_nonce.rs @@ -14,7 +14,7 @@ async fn test_identity_contract_no_nonce_read() { // We are putting a contract id that does not exist, hence we will never get a nonce let contract_id: dpp::prelude::Identifier = Identifier::from_bytes(&[5u8; 32]).unwrap(); - let sdk = cfg.setup_api().await; + let sdk = cfg.setup_api("test_identity_contract_no_nonce_read").await; let identity_contract_nonce = IdentityContractNonceFetcher::fetch(&sdk, (identity_id, contract_id)) diff --git a/packages/rs-sdk/tests/fetch/mock_fetch.rs b/packages/rs-sdk/tests/fetch/mock_fetch.rs index 29e9bb75dc..db18bd51fd 100644 --- a/packages/rs-sdk/tests/fetch/mock_fetch.rs +++ b/packages/rs-sdk/tests/fetch/mock_fetch.rs @@ -12,6 +12,7 @@ use dpp::{ document::Document, identity::{accessors::IdentityGettersV0, IdentityV0}, prelude::{DataContract, Identifier, Identity}, + version::PlatformVersion, }; use rs_sdk::{ platform::{DocumentQuery, Fetch}, @@ -26,7 +27,39 @@ async fn test_mock_fetch_identity() { let expected: Identity = Identity::from(IdentityV0::default()); let query = expected.id(); - sdk.mock().expect_fetch(query, Some(expected.clone())).await; + sdk.mock() + .expect_fetch(query, Some(expected.clone())) + .await + .unwrap(); + + let retrieved = Identity::fetch(&sdk, query) + .await + .unwrap() + .expect("object should exist"); + + assert_eq!(retrieved, expected); +} + +#[tokio::test] +/// When I define mock expectation twice for the same request, second call ends with error +async fn test_mock_fetch_duplicate_expectation() { + let sdk = Sdk::new_mock(); + + let expected: Identity = Identity::from(IdentityV0::default()); + let expected2 = + Identity::random_identity(3, Some(2), PlatformVersion::latest()).expect("random identity"); + + let query = expected.id(); + + sdk.mock() + .expect_fetch(query, Some(expected.clone())) + .await + .expect("first expectation should be added correctly"); + + sdk.mock() + .expect_fetch(query, Some(expected2)) + .await + .expect_err("conflicting expectation should fail"); let retrieved = Identity::fetch(&sdk, query) .await @@ -43,7 +76,10 @@ async fn test_mock_fetch_identity_not_found() { let id = Identifier::random(); - sdk.mock().expect_fetch(id, None as Option).await; + sdk.mock() + .expect_fetch(id, None as Option) + .await + .unwrap(); let retrieved = Identity::fetch(&sdk, id) .await @@ -61,7 +97,10 @@ async fn test_mock_fetch_data_contract() { let expected = mock_data_contract(Some(&document_type)); let id = expected.id(); - sdk.mock().expect_fetch(id, Some(expected.clone())).await; + sdk.mock() + .expect_fetch(id, Some(expected.clone())) + .await + .unwrap(); let retrieved = DataContract::fetch(&sdk, id) .await @@ -88,7 +127,8 @@ async fn test_mock_fetch_document() { // [DocumentQuery::new_with_data_contract_id] will fetch the data contract first, so we need to define an expectation for it. sdk.mock() .expect_fetch(data_contract.id(), Some(data_contract.clone())) - .await; + .await + .unwrap(); let query = DocumentQuery::new_with_data_contract_id(&sdk, data_contract.id(), document_type_name) @@ -98,7 +138,8 @@ async fn test_mock_fetch_document() { sdk.mock() .expect_fetch(query.clone(), Some(expected.clone())) - .await; + .await + .unwrap(); let retrieved = Document::fetch(&sdk, query) .await diff --git a/packages/rs-sdk/tests/fetch/mock_fetch_many.rs b/packages/rs-sdk/tests/fetch/mock_fetch_many.rs index ad9d1b9584..d0db46810d 100644 --- a/packages/rs-sdk/tests/fetch/mock_fetch_many.rs +++ b/packages/rs-sdk/tests/fetch/mock_fetch_many.rs @@ -28,18 +28,31 @@ async fn test_mock_document_fetch_many() { .expect("document should be created"); let expected = BTreeMap::from([(expected_doc.id(), Some(expected_doc.clone()))]); + // document that should not be returned, as it will be defined as a duplicate + let not_expected_doc = document_type + .random_document(None, sdk.version()) + .expect("document 2 should be created"); + let not_expected = BTreeMap::from([(not_expected_doc.id(), Some(not_expected_doc))]); + let document_type_name = document_type.name(); // [DocumentQuery::new_with_document_id] will fetch the data contract first, so we need to define an expectation for it. sdk.mock() .expect_fetch(data_contract.id(), Some(data_contract.clone())) - .await; + .await + .unwrap(); let query = DocumentQuery::new(data_contract, document_type_name).expect("create document query"); sdk.mock() .expect_fetch_many(query.clone(), Some(expected.clone())) - .await; + .await + .unwrap(); + + sdk.mock() + .expect_fetch_many(query.clone(), Some(not_expected)) + .await + .expect_err("duplicate expectations are not allowed"); let retrieved = Document::fetch_many(&sdk, query).await.unwrap(); diff --git a/packages/rs-sdk/tests/fetch/protocol_version_vote_count.rs b/packages/rs-sdk/tests/fetch/protocol_version_vote_count.rs index 39510233a9..2b0023226f 100644 --- a/packages/rs-sdk/tests/fetch/protocol_version_vote_count.rs +++ b/packages/rs-sdk/tests/fetch/protocol_version_vote_count.rs @@ -8,7 +8,7 @@ async fn test_protocol_version_vote_count() { setup_logs(); let cfg = Config::new(); - let sdk = cfg.setup_api().await; + let sdk = cfg.setup_api("test_protocol_version_vote_count").await; let votings = ProtocolVersionVoteCount::fetch_many(&sdk, ()) .await diff --git a/packages/rs-sdk/tests/fetch/protocol_version_votes.rs b/packages/rs-sdk/tests/fetch/protocol_version_votes.rs index c79ead12fb..62b1ae6a64 100644 --- a/packages/rs-sdk/tests/fetch/protocol_version_votes.rs +++ b/packages/rs-sdk/tests/fetch/protocol_version_votes.rs @@ -9,7 +9,7 @@ async fn test_protocol_version_votes_zeros() { setup_logs(); let cfg = Config::new(); - let sdk = cfg.setup_api().await; + let sdk = cfg.setup_api("test_protocol_version_votes_zeros").await; let starting_protxhash = ProTxHash::from_slice(&[0u8; 32]).expect("zero protxhash"); let votings = MasternodeProtocolVote::fetch_many(&sdk, starting_protxhash) @@ -27,7 +27,7 @@ async fn test_protocol_version_votes_none() { setup_logs(); let cfg = Config::new(); - let sdk = cfg.setup_api().await; + let sdk = cfg.setup_api("test_protocol_version_votes_none").await; let votings = MasternodeProtocolVote::fetch_many(&sdk, None) .await @@ -44,7 +44,7 @@ async fn test_protocol_version_votes_limit_2() { setup_logs(); let cfg = Config::new(); - let sdk = cfg.setup_api().await; + let sdk = cfg.setup_api("test_protocol_version_votes_limit_2").await; let starting_protxhash = ProTxHash::from_slice(&[0u8; 32]).expect("zero protxhash"); let votings = MasternodeProtocolVote::fetch_many_with_limit(&sdk, starting_protxhash, 2) @@ -62,7 +62,7 @@ async fn test_protocol_version_votes_nx() { setup_logs(); let cfg = Config::new(); - let sdk = cfg.setup_api().await; + let sdk = cfg.setup_api("test_protocol_version_votes_nx").await; let starting_protxhash = Some(ProTxHash::from_slice(&[0xffu8; 32]).expect("zero protxhash")); let votings = MasternodeProtocolVote::fetch_votes(&sdk, starting_protxhash, Some(2)) @@ -80,7 +80,7 @@ async fn test_protocol_version_votes_limit_0() { setup_logs(); let cfg = Config::new(); - let sdk = cfg.setup_api().await; + let sdk = cfg.setup_api("test_protocol_version_votes_limit_0").await; let result = MasternodeProtocolVote::fetch_votes(&sdk, None, Some(0)).await; diff --git a/packages/rs-sdk/tests/vectors/document_list_document_query/.gitkeep b/packages/rs-sdk/tests/vectors/document_list_document_query/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T08:57:32.047138511Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/document_list_document_query/msg_2024-03-18T17:30:02.264054333Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json similarity index 97% rename from packages/rs-sdk/tests/vectors/msg_2024-03-18T08:57:32.047138511Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json rename to packages/rs-sdk/tests/vectors/document_list_document_query/msg_2024-03-18T17:30:02.264054333Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json index 10fb99d8cf67c71106bf05cb4ef3d8013331f4ae..9bb19f7c1aac11fed896a3fc418f1fc234d37051 100644 GIT binary patch delta 1135 zcmZWoO>7fa5Y}6-V<%wmyiFWzlk7T3pwb}OyRyArgv2FAr3#cDs7e(Pl^(cMO%A?B z6u7iN_#2@)04bb`#82pnwg(av6=>BqIpmVIK#oPKB5oB_s`|ang|nb#K{H*L!%pt!1{Xi2Ww< zrR~J8G9>rY%H;!Fh!^_w#b+c>D=7E@iP?hEa>P=uJj&tdWkp+I$nSRhGG9<6J5eVO zbEp~il;-!3JG}dM;-@*y`C*bdjm+15_!>_sN5=AixcwH%6oRCU7dyoBxxCyOKx#JY z@V*h^`}m#9Irm;T>WD30Zb0gnjJ6t~oGK|_x(%nR8jSbZlnTQdf70-{+8*M`Q708N zWB#z{%g4P+yJ2fbPvx~wqbcV-RgrH?%2h2B`%IU#ECNl&&>_niQ0q7t=Gj3lh5m#V zarLpoGg&Qvb)oQRzly9dlGTdxQbDWEKW03hceLDvCcIK1iPC_=^dx7XP$~?X@t4WYzX0n^&$?4`p{5G_EWmcSrMqn~uyvOgRJb5-E&EwI)#NF@Lq$lNn^) zpdS8vv`{V=RU~^hDaYKwwE>dD8-cS8-b&d>zXqVWk#$b&w+Y-M`PG7?6Xj%JlAaU- zq_+MKKZyRLC4?3=1m@6%x2CmBn|W_naAhm2dgZwbCTo9_{OJSpU`9(Fs`FBedmAlz zGmF-0y_aiPl(7Ob<0EjdQR9JZg|A(6Wh#xGc{vEYWM3X{P&ySvO*soC#kT7Z~zQcdKHC%^Z!I;(nGCRt+?L{ZglZVL2qj_#+-E?!m40_6w zzJ3(GZE#l1{#DWMpTJ4c{ArWiG442RvOxGjXHb4Jz~7W`_*n*~*5tP?uv|3Y6GbiE zMFfj61_&d55c_;?6jo1bPNy{=+vLcSXZEBX$A zw{di(K)inqdSR7TJDz#OfP}@+d(Aw`4T5J3v)avc|5g^c<<*VU6=Qwok<8o@?{ZHF0e-eJEOdz!Wx3Pdl`J z+@e0i=KdNX`E4_nC-qoHnuX0b9O3ZR96o2tP(IQo`CgT=f_sz3_VIBK3FF_e&q^>o=#hAwm{=agQVG9&HQys z%ozN$2kn8%PgdyfK+@n*n~OSj)HZ#$SMp#BiXJxLtN9z7$7`#&#UA**~4$bbD z)MrY*Sqq_skyhG0VDp*^c>$UAFdxzzGjQYX68~w+J6e!(9i?>pnbf0v%60(D$Ld8l z4IQ#+bi2im1(aWpNq$f#oZls!%~j#-_A;fmEVZbcmzsr7*1S!fu={H@{$`**mJ3HK zq!jM;Xr&_4P>l7cE6)QSlxKvn=(i3@kIE#U2Oj>TQb?^3)53qgj7kjiM59P~ycT7@ zfE#srl5Z=qZPn;m67ru-B2Y)^AsQG4BGAH!j_97&)5B+~k?W)CK;L7@Pr;6t8Wf$R zKu6j#b4Vn^+*lFx&@y~x7dUM{c8*M ztw5Pg0dv650A`I+n1PG`H9+$n(jj_EcN33>3`dJoUd{o@!iW?FT1|agGXW}MUsr91 z$i|QjFG~9AN6GKXk$DuE-KeXl#Bf4;4*F{DR0rw%1YHaxzUm6!jl+`Ke8i)5P$+Li z3|0OurgO$efG7-kvQgx?&KC*aLMv(5`E+&EJoC8Q;0Z*&V&$L!=X6sDDn<@iK>Y8j_}RHeI<4EGh440^+Hh#`RiLV_n3F UilH81iZf$B)Qbu}(JI>i2T;K>8~^|S diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T08:57:32.068486672Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json b/packages/rs-sdk/tests/vectors/document_list_document_query/msg_2024-03-18T17:30:02.342323339Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json similarity index 91% rename from packages/rs-sdk/tests/vectors/msg_2024-03-18T08:57:32.068486672Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json rename to packages/rs-sdk/tests/vectors/document_list_document_query/msg_2024-03-18T17:30:02.342323339Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json index c03ae0a079d57970f64146f45c397029fb50d675..f3bc72032ed5fd64732833e218c16db7f3106486 100644 GIT binary patch delta 983 zcmY+D$xjqP6vi`*CTe8*y)sb=(9I%>Iy2BcYZGu>U;+*>0^$M)#w#vIBWgGrja%|1 z#%Ln(<`RVH71WDfjPc|}A$nGkzd-Qo;i8>%s=B)Bz3=UJX>)ajdo~o*x(FIt8nPg2g()t(@X!onpFG@U@_b z^a-Z9o+}z`Y>}{=@bS@g@N2K)U5{X{UvR8J%eY)I>|ix!VTB<-@`zol=&2SII~BWn z1t$uE-&sLZv9$eLosI8}kylgQGwU$PeWN3Sc(>wbgF(>|w2l}w#|70qAI%FU`7R^{ zH~JN$+`qL+Vfh9xS}o+dneUL|nXCBC|Mnq+*gnCBUV~~+@Tpxf)~scjG%9iq#vH}m zsR-UQD$a9$W+01RI{k5qj*c)qr7R>B`-_4ICA{ehtSILDt+3~&@$euC&`u#~u->&$ zPJ$Qu4D2DrVcK7@1?QQz*sPd6ptxQ`!fh6oh~+BD+Hr&TJyuDkJtSc-mB8|F1zrwT z;ar!+xLT4w#JrKC22(A9sXatjzefBK*I&mJJ30hs+jUDO9olm49%#W>|fM_D;mAh6pMXH{7F2uJZb_DLv%EB!WpR$2J! z8l+AN9=K~JV^QunsyN+Uix>f3q`F;f%RCG7nV@;5j9r}>bl4J#DJCcXPzsOhZCs*+ zpb5t740bd1ecJhOP)p4+&LDx6#X*D1Y^1qi!BU!%^CsluK)oII7V%qLH=z!SGUt7J5&M{r|;C;`BrcaCu^WEGpJ>ru)e!W**4eh6CjE&Cz4e{Fs* cAth^tlwdt=ZIAJ4#Ka^s|JO0?BRAUl7lXbz9{>OV delta 985 zcmY*YPe>GT6vkZ-A=JD#1|8JdQB)RP-JRK)bylTaOSeD%*~~P{9X04s6y_;{pa_Eg zx8g^TU}U#IA;Uuvi5;p_*0EDbbO;L5LzgJBH?xOwEd4TSDPj9)p4IgFI#TxesA$UAKi?n`cWJL7mQV_xFlItasu{`GL%RgCo#1`ZO& zni)TiRAQ})7ACqDi!s$l(7FnPMoq%|-KE&ISI6F?I$rH$ylf=o1=wOIL$?(ShgHlt zgpC@)-5wPu6B2hB`6>aHCEVQt;nDUh`Api1*+ zh)_W@7Dw+;2pF`HH=V+tpX&3uxGWi)KmGu9gXS)a6!Kx)GH;SkahZ)*jmwz>r|z20eo ze_m+3k+M6rgs&Ycmg@;01@egm`}0dAFK@GNySIX2w2lxGJ4PckDTav*F|O69_@H|V zh#924XQ1CX1&y+d4PC|D0VQA=SlXrIdYbS=j=(c`K1`U+QL$+lgC(XQUrg%y69r2gEq^lBOO;R6vgi*E_B}FzRS7ie&;*q`|jzn z!11xb&Bd0T$&~m=Q9A>2sToI;AuX{4kdpJTG?}VrHK?u)kfb`W8OS@Fs&sLGuVZHlW!@2Y zg&d`oFXIvAF7UJYB~9KppPx>DAIRiN(mG3dobDhQ2e@pDq1HqQwMJZ}d1{lEdx<(v z;?xs|&xN&ooQ1^Qb5v3OH8Y&*CYgyKc``&?b+p_xRQE)%6oWv+G>Fd(lN?2oj39Jk zi1^xZZ50cwDoHtrO45RkWV#ip!!L1qUGs*kj@$|$x*q-WXgI>-`-#(#ZmWy#tL=`= zH%uZOn6aOi4P9!U+=;7psThq>px)N@*+5?ijpZZ~c?KAx-E~6jR>;njit@LmT=_Fu z@0a8`BsWJ5N(a!rnXXJJD2?`cK~Og+t+h!?VHK0@R4&G8cw<`|xc7BKv3y!yC4hPULQDpN%8@?wX`#~nX63eKiiQ7aRmh13QFbm9 zzc@!+t7_u~9_jfyZKHkNy>Hh$Tq~pfsKXyTlBaMHU$KcV3=;SMOlBP5_g6#YIujQ@ zHcIPL0FlXNG?c<^_lTA?#-}OF<2r23PKB&|8Yb?P|2mbn;VJ$t8jQ;004&&K+*d0jZLj917r_lz dw(ioVYkrkT^1wpk)qjxuT9^F@83jP7=L?WSK;QrX delta 1105 zcmZ8gO=w(Y6y<(z(iz&ByzhHSrZbu5y_bcd9n#Fa_vY81CW}D?wUI(lN+E^fLRw6= zrD{v7rBFyyZuP3QYPDiSu~}5I5gG^%{ZVmIvM6HPg$qF{y6Zyf`6ez(AIxLk_jAs< z_ndonE%m`#YI%pECXcHfPQ8)vE2@&I$5At>##KI}o~7D}b+xjt=;CHx>}V&BTD)BL z`RJII6-^$$6d4XXuAE4d;rTTqm5?;wpVmB)(sIy{mIFQ+T#V%JJo&s(wkQp`7mzO# zSsb1{qUGc!GO~9Fr>_p+-}58n$)N#kzMj#tveJT+tFuRJa-_LFv^B;tFSaG=&2-yA;jM9rp*k5C{Fag>*Cp~9po zCPam==BdTAdkmi`yYdr(`R+LsIYi!j8p^&y17v%jWxJ_W+>&mI0(MsnS0MLP4!ggX z@cI`mP>m)>9iM+p_c(ZN3_R6DW_&PTCUSXUr{)`dT27Au`u#1WRinnM{{%XIOt73U zP(vk=e3*kJ(;XuZH0q1%vApX6?Zpy=!YON{glP!4V*m*|jm%@O=Z!pRUHWocuQ7>C zLOJxbc`D<}aofPFhh5&4GBP<#MpfGqg{TdvvXle-u`#z7A$cl;rk(!-S<3xS_H;iP zs&RC!mk>{C3JShOmiQY-%R?8vNMgRQ;BPpKc1adKv%A~l{au$5xlyE1UMy+pS|M{8 zt?CW_wXY)CEHpn+1fGkaN`Km7Me-Zm<2lEbE6{2?%WwVSNyqZuv4IS5j`tsNH{3ux zjcP@F_RUc42IR{6Ft!(Mco6zOvFk+bx>U0iN;yZawc-1V!A7?4=fN-ucMk%XXS*6R zUaRwlzfaPFU3&7o^yzcAIB!`tlBjmp>_@ eDm$TQm$4JW*ZYjZM1NGEVL6tkw7fP-+y4U@Zz>1? diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T08:56:19.649147329Z_DocumentQuery_c104c67292061fe0b8e2f959cd2625892e0011f1264c65e1474532f59456ff51.json b/packages/rs-sdk/tests/vectors/document_list_drive_query/msg_2024-03-18T17:30:02.342760372Z_DocumentQuery_c104c67292061fe0b8e2f959cd2625892e0011f1264c65e1474532f59456ff51.json similarity index 90% rename from packages/rs-sdk/tests/vectors/msg_2024-03-18T08:56:19.649147329Z_DocumentQuery_c104c67292061fe0b8e2f959cd2625892e0011f1264c65e1474532f59456ff51.json rename to packages/rs-sdk/tests/vectors/document_list_drive_query/msg_2024-03-18T17:30:02.342760372Z_DocumentQuery_c104c67292061fe0b8e2f959cd2625892e0011f1264c65e1474532f59456ff51.json index be1c7b74bc6304747e0cddeb26470de86105fa5d..682a346c8167ea932bc318f7668702e898fcd39c 100644 GIT binary patch delta 984 zcmYjQ%}*0)98Oy_N~H7qjmi1}%xJqBSn0=1TiQ{yf^35+Fc!qBd?j8%yc*q&S2fG- z#wQvzQQ}QZj2cgyEa*iK8skY1e(ZYjU_kx>qwX`zWha@;o0<3hJ)d)VAu_uVxqrJk z<~SwHH@C;Ud=amjGwVvO$7RvOhL%dieK_1=rSZK>qeTZ!pM}}F;-7?p*|Ordgd#Jp z`1G?NUK89+2+F>R^}8kJd{!Li;&=!9<*MF}8`^NaU|Vg4Y3sL&eY^ zf3F4tBQEyTw_}B*7MbyQMX_^-AWc_GbbOv}pCRC+$Dwr-hdALZU7qaFnB(SQXKgek zP0SS(r+WmWoN=#L@Rj+;==Rkf#T1cucQYxH4isk6OraEbrw}jf&<|CE$qANP47_#d zz!AZ9Clr?I;GV-8^-8D_E=AwkClqaE!I!Fu*L_BCEXpDmM{M>$F-HcpJyO7}q=h9m zAxM5IVWOS*SE=bac?AubVxI$j1GVtExr^L71%FgbTsdmMPcnggF-$vtT05e`D=n*w)7^LwPh@ nU*XRY2&@(aH|iYEAXiedF<r>03; z2=}%SpO|Q(aZP$?C24Co*rXCKdNkhP;1356jfWPl>H(iwdZ?3p$xP;ZpYQqmeq3+6 zy59E3FI{bUtacrV`u#ae)ezTo@Kib141Cle@*22KxjHLyGB71%DCk z)QpLhA;EG=@bd{1TbAHfO7YlIlzIi*Nm*MNUvJ0tDS zMvHVkBiJe^x*CGdrwXW1R4AlD;)}kZMh-g^5)@3xw4&LNh+Dw?Sho(OJM8~Go{z6j zTL`G|Qm={aj6?=J+)i2u&v-jaYqL2_))UxC8F)FO7%Lk1W>)d{VZnnyu$YoVj$3#i z*3WgI*4~M`XJZj+_^rpnlYq01;wyU4q(0+A4LLIw$=Y~U6-J}DcwT9@LZ+zR&*K9x z(c1alc@vk(U}4gP;Tnh&rFc&9+*VZSPG^zM(#f6)GAf&xJ7*x{?iC@C6?6=0#B=bI z7iY@mm2LySRuwlK2H2xSXoN&o+$83`11+O}XF0+~mTDSiv@~R2IbyV$KF;pOYdm1s#GAbGHte}C zvp!Y{e1-=%XkEXi?&C7klqv_q6UlgBLeUeyY5H}*PnVS-xFtice@DryaD{DUCok`y zQ*~;b=32^$>lq!M3E%ZG?nOX*s8+wXMKV#lFAzn1aa07ndmEZYyEOOEosSNp!)gJ? zc*V|GpD{c%oFm4t?-eZ;4gZA-etuXqWYVCYCVeMvrgW{~Q&(-#NNb_yMjtwX6;0z4bEK7gxM0*91KJbJm(}ZWsBA|sEnm$=FG<`|&=Pt%{Yy(S^?Js4s0AI(Yu*b$iQO_+pw znQ`J;lOHXjw3-f51dnv#Gipy_Xf2{$#gL|_JwDMV)L;^2_sWB*U-m;C(B#Q_$_5Zg zeXQyFqNa_mu{NMj_v@VMf2~w7GTk|(Xd^Qed5U}1z_kV~I6hrGt!eHVZAmb+vbH5| zj$-z8pSKU=RQv25ShEhSdWwQmhM%%dtwNzCSUZ>MQW=rnyyDdXVVoq2=+#0f(};iB z2BRS{TxFa8u=6(C_ogUS;&umUdc)miB6XX#I53HFOA^e(OU2lC{o8hHb|U n{qUZq<1H`%s`7*1s`zx`VND0#z;!C4HaMlN);Xm1xTyXIQ-4PL delta 1101 zcmZ9LU1$_n6vw%DlJ1};bMI`-CN4WOc`&A_nw{C1-BqzsSVW|lrjWJ)+fZz1OA9H5 z(v}vfC{m~&n;y-ni1>+EBx@cF`?!J_N|Po&6d(HH2lSml&OPUU ze&>HDZ?zn|)iU#5{i~=$Nc$GPH1Y(YZ;emxXtHwPq?J&ipG9)WGUgQFMK*b>+&3q)8io}lb9Ph z;qe;lwrJ3D| zUbYoq?m&r~6FszJMDvqQ9ICbpWrc;19@s%TE^k~FJo5`nCEl1b>XAxUe^FLcD6tMO z+<2!b)7Wd8PV_tcvq0zjClxo=3K#S=&#po3zE;z1UKt2;SzvPNng$^E8^htZEFOQo z07k_Ug%yt$Qq3MT(ThI$0*`p;d|e2Kj&D-*Q|k(=@4?S(_2yGwMb8Q5GhL#{-a06F z9c)BQ;dsw?FDc%OF`Ih$2ZR4m3KbPm2=GeBsexMNwly z(|fJ(LIPk(NINSYzYF&p_^N*)fE3}_VPy>!=GMu6zv#S=_GoNZd~T=hHfK` zbZnhBTfht(aLq)(!wTWL0o&)T#)StGsF>I6q(A`H`&fsb$_GqIX^iC~IpPJ*cR6y`sf_MZqTuj2-^n?8P>QJcesP=Q3J` zd0s#pzNaziTl*Eyp&ox|^qqrG7oTcbKv64adZ4h&k0gq~Fq#8c*9x~JbfMd$4eOiw z_=#_VVZ>*<9u?iAeIsd&~d_;OrP z(teNG^1()~oF3%QB6-^{!f(G`k3=1ZD1Yc8v8~utB z>kZ;CTocdRjc~dRa>&M0M=>#`unw7s?iYOE6%9$jVz**Eq2Wv$=7w#I+ltX>4c;~@ zPIG@^Ad6z3gxv(5AF&C)72EiSbaUChM0f)SuxvCL2_x=P#e@>m^CaZ;X> zee5HLDg99s)0BLAk02f?OZ|Z7b5Q~(f>YfArypZB{9_-0moWo%ybcZcy(Tyxz%NTt zq%_BS6uanBjH+g-_!Fvqkt4^cy#IcZM1%h=iYE3(NuoMJ7-_}%gM#Ho#fxsi8r}ar zWMYbECpmjx7o8&P%S=r?rdZ7iYPgEal?l3*H|U(8W7J@J%y2q`n~oJQi?*=jsD|Av z`Vw|9(a+JxVMT_&rCiVzW{4BLHe;ZeCV*-lKgtVcA_gwdci;Q^UK5klZ?lWOmz0Lnps#(Dz-U-amw?D zoe%dI_{J%eOY)E`+z!h(5pd|L_vp0?I=O^%q&3-%wgtzKK{?|`M=lK9CK@qXAj)Y zsDa1sfXj?(*mQ>vn7XE_(TIu)PnW}38TKfRH|r{(ga}V_m6!@jxM!5!OPat!LB@Pc z!nPrB)-OA?IG*II5b6-v@Ccla65h55M-zr?6}%fG^e2Q%(_?T{`>@+UC~)F@f~;g* z%o8r;Wemg!S4={Z&vyK@GT*mWhC4$9Zy$He$e7Xzo9&fo>+zvy%xAU0n?^!$P+%=B z;4>vm1Y|67q5T@d?E%@AQY;7*{Q{{B;aZwpT13OF=|hp@QlU!JrzCsQ@i1X4Cg3g* zP7TG7=^`9%X0ffp7M5WRmiS~$28{?T7RbpnP4-rcc&Oa>&tsT4f82{?D`6%mV<$|` zxPc|V7gmp7d2;D$1cT!Wb^{W=bP4n}OAJBa+Y!RcB!dXhAqMt;Su;|OOxa;PANC;J zUjoCyOjgA)E;hrUq!AfaL4s5*<4mq}cE84lbKGbvSpxPqZYRv~x@2h^iz?WQ2;8dW z6jQ_Nq}QcuP58|JFQ)|hnafpX@iEQ3%}Ts52+KL)Uop{0vk%bksK}*z!}Ers*a8lsEY{urEdltGqL+ zyjlX8k(VVbJy4iJ>qgyh<0zZ{iuwGA?W=X+OflqwB bzIU?x4hh9<>ASm)_(n)&x}la76eiR^@MJUF diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T08:55:01.244377672Z_DocumentQuery_90af5a08200f1b0e42dbd3ad7a6af38ff6415d9cabab87315b9d9d736194597f.json b/packages/rs-sdk/tests/vectors/document_read/msg_2024-03-18T17:30:02.533877193Z_DocumentQuery_90af5a08200f1b0e42dbd3ad7a6af38ff6415d9cabab87315b9d9d736194597f.json similarity index 90% rename from packages/rs-sdk/tests/vectors/msg_2024-03-18T08:55:01.244377672Z_DocumentQuery_90af5a08200f1b0e42dbd3ad7a6af38ff6415d9cabab87315b9d9d736194597f.json rename to packages/rs-sdk/tests/vectors/document_read/msg_2024-03-18T17:30:02.533877193Z_DocumentQuery_90af5a08200f1b0e42dbd3ad7a6af38ff6415d9cabab87315b9d9d736194597f.json index 616fe5438d5f69dd258345b7063343e6c5977635..30f65cfebecdbadd559198ee9221bab86eda8dcb 100644 GIT binary patch delta 983 zcmY+D%S%*o9L1T@AOyYN?=R>%&eie-j`McL>$`k~qt4WTDVnuzV}C)l>#0SDT9j0a z+EivBMG)C85SlCq3L>LrC9SGOk<+=iP2JVpxxf4Up7S~9o?P;sUGm+p3zWuUEip6% z8cLjG8u>tEV@urO&$NRxfqq|n@m0VM<5-8F7!o|$D`=@xOic=Mje@dWibg)0P8iJW zvoPJQSjs9+whB7i6lbRtM?#8hz2d}xh1a!;t~SBa-mCGIBIEuG{A$NO9dp39PWEQM`cbNbswjM8XESddrjfwA%O*I6Aov(a|0Fz&DqZ>WN<&RxFGf zRFY{WC(KjTadHg|D%!(}wF$xJUfq;Vh03b_x#EcgDh6#&O(AVOR)r4r+;%cUSIr7D zc|NIl*RQzAyzY|m!<~wHvbQ6IMR)G=a@U!A&wd;lG`LGj3j>N(&i%1RaG_Dr)F-Im z87pJ3wa3CLwLRKR_~RCSwkzg&Z!<5K5fm zsQR52tVC_xAw#!Ov&`nfnEK;U%uiJM+2`t?(#+_de8;xhHE9}rkg#^>OMWBZb9!*-mWOyYgW;7hOD5`$SS&)D4B9?s~+PS?3Y_KW9j bxmmEvFYhaTR%OH_)BmTLa=dc9or?Sc2c<)3 delta 963 zcmY+DPe>GD7{=MzponzdZ#+fo%$l^Qtn19|jJt#Fx}hsVE4#M3xvnb`bO=H_)*-JE zrGgI~gi?aKM6`n4O09!Igs#vjA}zZ0SC3t^cV;g&Fbv;(^F8nL{@!Qqtod%O`IbWg zsnbGRpv7-@8W;|A9J5VB*E^#+?gsjN*2?>U7QsYoJ!T_>aIpbX5gGNl+Wp56=#C21 zIfSdW!1vRNWH|HDMm*^i$nnl{NFX&#N-TUl_|Ik77Mzlb#fT!AaqMeBOtSt*OQ6zE zt`0hKgh)={U7TyA1zuRRa*)|PGCxMB_6s!T6#VWZWcj%_PGnDA;lcL(lm5s z1Qu->yJ3MzN8odqpk7ee6d^gzwwnc3vwXBbk`cvrvdQaYHQa!?yzF)Sp@UH7qYGui zZa$7pu6VDDot~??+RCytJKy3GGX({yD7g)#ikjbG5@}V685k_8*vc!=Q{;27KcK;t zy-_B=sYg*QX_!cIxv-3lF5xwO`3xbEAgm{ZV#fbxXGifRe-e7(6lQw_wwXmTA^Qze z#~MrhRW1(PvC2m5jd@yjHXGK?bG0J)RUUKA47-7{63U`iXK0?weo0e`aGL_9YIZG$q} zo5|aE2QiZuc*+#r+}!RZFDdtVeoF~~2RdP@C}WySswsh1rta!)B^6XPk~pHw(xax2 zYq-g>(-8)4W4}*Dg_kbGb_Tbr3mgq8_%tNr?OB0mnm{$CAjfH0>X$L+G`Vn*>0wG) z@)?+H4&qUo6?mEpCE+(58?Sp*pN(rV73F4zVwfKJxiO3X0M5WgLVZ+5B_i0R!Wxv; zu*uxrexJLe91*zGrEsde8R0RnU6c#)T3%mfg-d>CNW*!~=8qvlirXf}c%_fc_sXan VuC3P@%|S-?o0iTdg7`Y#@)s5%JW&7u diff --git a/packages/rs-sdk/tests/vectors/document_read/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json b/packages/rs-sdk/tests/vectors/document_read/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json new file mode 100644 index 0000000000..febf179550 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/document_read/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json @@ -0,0 +1 @@ +[140,166,219,3,87,141,69,160,158,153,22,179,34,58,44,164,191,240,111,196,114,27,180,199,89,247,126,103,234,93,92,229,246,192,127,27,164,78,63,100,86,79,205,231,251,65,175,178] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/document_read_no_contract/.gitkeep b/packages/rs-sdk/tests/vectors/document_read_no_contract/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T08:55:01.204152704Z_GetDataContractRequest_e4cf74168e03a40bd159451456b501c1ba166a2dd8f6efb31b0289dc011da983.json b/packages/rs-sdk/tests/vectors/document_read_no_contract/msg_2024-03-18T17:30:02.266644051Z_GetDataContractRequest_e4cf74168e03a40bd159451456b501c1ba166a2dd8f6efb31b0289dc011da983.json similarity index 74% rename from packages/rs-sdk/tests/vectors/msg_2024-03-18T08:55:01.204152704Z_GetDataContractRequest_e4cf74168e03a40bd159451456b501c1ba166a2dd8f6efb31b0289dc011da983.json rename to packages/rs-sdk/tests/vectors/document_read_no_contract/msg_2024-03-18T17:30:02.266644051Z_GetDataContractRequest_e4cf74168e03a40bd159451456b501c1ba166a2dd8f6efb31b0289dc011da983.json index d8c481764e3c4b52a0763c55f80fa834c05c7362..5272c47d83ede5e2309b1ca1751f1a7d8a80253c 100644 GIT binary patch delta 1142 zcmZ9LL5LG)6vxSz7{^Rz=Dp92*-gxRlOUqhZDuAjnT(=%QIT!+SPClZp%kp_77B$P zYD)`C*{)#ydW@hB&V0}oAMM%lv$4iz%EjR4Opj5l2m_nL%fa(kUTT$jA_ z6^$=zULir-Hdtkb-yrPhczC8ftW42o2W`C8tl?*J*N#4~G7i`I)<5g^maw-$D(&H2 zuU*J-v1RbldX1Cv>>obk!DiBVw4)OI@0VwI!#1j)<5W4os?VLl=m%+k^nct-VH|_g zEuN5g^fHQKykrGxkm7)AHpXE#dY|>NVw>RvJDnQtO6O-L`PM7d85>!JuuBdeZX%ub zM$@FpBZ79hELdy2hDku8>v1veg?Q@wxY8!PS7bbCGZrnzd1B0#1V)OBO@B+2jJ_Dh zVTJ?nlW8NXDn!%|{ zJyCeoW^^|&zLR)~JSCg9WEqu5cw44^A|n1O0#A$E?-mKuj>f+t>XIQ`-N@K(BraE z)96AZi|p%OKB}6aov!*SOK_$sn#buH&%f6({t_d;Ba^g5`%m2e;%{Z|n{_SQ{hMVl V>v%X+XPu0p5_yl;103sYdjTs%9wGn$ delta 1076 zcmZ8gOK1~O6eTnHH_5#B@@Ge#myX5!%fXODomKf#YIIH*rAu<(NPz$pS4*hNb2? z*s)CAuGMi)O2iU|=u1^Cg@;7G$1GGi7k1wOZXH+igLpAm#1UdQ8e%w2kd_2Pa)9F^ z5!r#)h*N8W!z3aX3FdQB;p7nKuH8Fx6K6t}pFtoURqKtm`WPbldoQR~15-j`gEZSt zkf^GOKRJnoa98Lr1%{0v!#??^b5=^ihnmW8&GBHxD%j2$XwwwObk^|&?$NdBFjkEXi?&C7klqv_q6UlgBLeUeyY5H}*PnVS-xFtice@DryaD{DUCok`y zQ*~;b=32^$>lq!M3E%ZG?nOX*s8+wXMKV#lFAzn1aa07ndmEZYyEOOEosSNp!)gJ? zc*V|GpD{c%oFm4t?-eZ;4gZA-etuXqWYVCYCVeMvrgW{~Q&(-#NNb_yMjtwX6;0z4bEK7gxM0*91KJbJm(}ZWsBA|sEnm$=FG<`|&=Pt%{Yy(S^?Js4s0AI(Yu*b$iQO_+pw znQ`J;lOHXjw3-f51dnv#Gipy_Xf2{$#gL|_JwDMV)L;^2_sWB*U-m;C(B#Q_$_5Zg zeXQyFqNa_mu{NMj_v@VMf2~w7GTk|(Xd^Qed5U}1z_kV~I6hrGt!eHVZAmb+vbH5| zj$-z8pSKU=RQv25ShEhSdWwQmhM%%dtwNzCSUZ>MQW=rnyyDdXVVoq2=+#0f(};iB z2BRS{TxFa8u=6(C_ogUS;&umUdc)miB6XX#I53HFOA^e(OU2lC{o8hHb|U n{qUZq<1H`%s`7*1s`zx`VND0#z;!C4HaMlN);Xm1xTyXIQ-4PL delta 1101 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 P{p;iZ@BaJY(TD#BMw@#gKT*FPWpPj;U! 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 P{p;iZ@BaJY(TD#BMw@#gKT*FPWpPj;U! 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 P{p;iZ@BaJY(TD#BMw@#gKT*FPWpPj;U! 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 P{p;iZ@BaJY(TD#BMw@#gKT*FPWpPj;U! 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 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:53.573920842Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json b/packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:53.573920842Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json deleted file mode 100644 index 3da06da09a6fef3ba60546282c55a29bde30565a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24209 zcmeI4U3c5Y5r%v1UxCAub9~WA$Jft4 z8C+JwzkK+jemr<_;yxU2?zHDz<=5M%-2EII9cRU3|HRMy(uZeWWwY8hLfByCvq@RZ zZe`#b?-%t)dA%$v9h{Wo)!Y}$`V+fqebEQ&GA$?*Ja=<@vY&;Bv`>v%Q#`xhS%@)!Q; z#zgga>gSnhqV9;;+vwm$91nvHQp^yOa-QV@BAYXIZh5=#cBWTee(eocn|0bqUQF__ z4-=0JmQ>-6wWh38wl6qO?#kDLjTP}SSL+?Mo%#OZ$bo7t@(fO<0$D>!@ z_un76A9iP6y~j!BdGQBdTrZ~vtP|j3o_)I=8*y+^)_Dk7c3&U&O?*AB@)*#9&omyC z#5Eo#{`mShdHA@ze0bdUqz;N(PPp-xwz|w2?xmUO*GJ#XkBY_7cWeE0PPDYtIlo6& z@2HP;q-~;s344b=63ciNqAh(T%QBgjZ+tb*YM)qkO~Qwxyr_K?K(-u}?GmRQbg$8{5Qh^5xXd^|zzWKH1aeHtTh^^vSfG zm)BLcm?nm(Z2Zl}NSFP~hs4W!<8mI-V=(OVRlQ6ued1rQvRRmMIrWX1lf2k1=AeZ0 z_5F8BdIw6H;NJ<*KN=?Q{p;uPA^O6*`cQhe4?Rk*j145sijyXxCLsxKY!zbhyLr@} zwDuFV)^!_;Hk}hkFJB(-0#RpZkBha!(T`OnBNg25(H<>!@cO^ue9@q9^*(RD?W>Lx zW<}z^HF9eiV*?ZmCVswH-Uc5X8!a}U&+PLenfV((TVM4P-8A`=QSBH3Ld6i`TC5n7 zNH;B(6`LpXx%FKhUU_30zIu^G)_nk{Syg4XRMq9}(m#p=4P%0TS>AiL^z%S7Pw0E* zvj@joX>WijfwLfUvZ^frTQCffaj{;E>ANX04(Go$!!qFxELmuCH0MjSmr*Sb&W z@Q!_ojThXl+<3_y3U0;^D>;t06pcU-hXcMW4L$dhJo|iIOJs}1EFZ_L_?vGdJ3XE( z7RPxkv#xSq0V8oDSZzc4l4nnXw^(+ICfqqrW66A;Rktw!N7HWZ+V_CBX3Py78dqt9 zA_&+aMvcT4>Xo4W@0$^{D6ZwdW=7*rSse{n$9Nyi`k%DowjkJJ)1LXtr|mKon(A3V zx^ukcD?eUBtmv?+ec8}QlOR${lhoqarlL-anyxBu zE|4vg&}y-NeA4)vWt%37C3)TW&{49^R$21ZzF72CVtHyk27G_j_KJ>2^y<}RLx(w;b%brD@M9uoHZw;4V)KA@Poq&;RNJN$xh%_>&x(B^05RtCsi~xl^-(hMSGh6z z*Xt--IofCsH9F z7!n9%>_n`0W^1&XL=tkohAexyPHN^RT)|TO3RCYvci`3gA zOncmXdK2IGk>TFmL^ve&gO$WPRv93_+Duy6hC@yGHkT0r0UT2{`{7$`nv0rk^;CyEw= zaa`DT6XPNn{UWNtz}Y0&2>ad}E4Tf{c$QgN5ceqJntCySU0mMk$Sk)$n>j|bW3OIj zRX7TJI}d(%@T&&_Y`xtkO@qDOO~2*Cy}4gzp{Q=1vzw+qzn;cE++f&p$)5G*O~9#f zw~JXh{>D!(wpY60uvN77{GuF(zHbX+y=6Z47qKkvxzqmHAU!)vNBzN|{RH!-WjQWq ztE1ZZ-h}&$DepA4JJ!7el8}%OYB{r?&IE&?zskI?J^MUsvUgpIlyS2EW|m zDuk7m1mO@hy*oSKC8<4^qi4jHKp0*7LpUoaMoZGZpA7#qMj9FNZdIt%e#k9I>k%L#k~I2_Vb zPVtD;!9m+eCD<$NQwE6|XPk4uTOg!yXRfPzOn;^~rkHR9Z$^x9XHY{bfsRiYVF?Uu z11MVJxs?#zHMvvR4l-dv9CAf80yCCll5>4bfkR0K_n+}z3rd*?#7N>DFtTG-mL)QK zNe%^!9I-xx3@2D3QF2P9j(7twAnupaq0<58903`WAx){LbGW!8G}9A2!*SsXCo-H< zc?jnufgwGi5LhQP`AaYj(b@if38qmC2)5nByP@Px5$p-I?qnFn+&C0>zH_c$N|gv{ z12vQ^+3Ek7Mgn0H|H;0D!KFh?;W&q5(qTT3IUSj1%3P^WCI2PIa_7j;X^QlDLXO1? zByXjCOyL~oU?uLD)d#%ejPV1sA?@=-3VfgA0@m3=bOE#|ep)7EVbs$aBfKplCv0_?BZ4Mi2^M$hWj}1Jj(s*bYpI!&EAD;y57@ zJfza-S4c|K={fOD^5>{^VXeYBsU?=WG_-V*9I+zdgTX)|&>0NFo?M#J%cyB8f`u#n z+6`z5X(jf7SjScsJR9I~6iIyYjEf@ib_ApYULavAb=E0v7~+_wlW4}|G2$v&z_Yl} zJ_o#tG6M=!QhEZdrSu6pNlGoAaSb%Aqn?Q-bu%U}$-1olh(CoN0ZK2T=2PY}W+I?P z@C>yOD(rMP<%SShIu|VKrC9^p5`FMEEQs-6-G?qsqv(=|9p%4_(KL(PAzI-K(moMZ zNE##klD9sCZYfea>Pl=SULsQH6@=(p#Q-2uHqV?yEHY$~ibW@H0uinSUMxU$uWyKC3Vo0be1?yXfja{Cyo^_D-K3A zsZKcow4nQC%$4FR%tI*`aRTp2HE_Xp67i{NR&u1mDVIs((h%a&cX|LTd};siEgRXS zXTlPtX~jfCqykWBu*mi)QyLknWZteCQkIh16sEDIr{jcIv(RTwaSZ5EXUi){($5g4 zOc={Uxf7qt%2*bIE&yUe@q{`l2KZ7_$`g*6Mq0SSVx*ZVuOT^Y1p*fmmRN2}hNaPk zn#j9P!gtwoCDmYAArzY6cj6u_X65}1jVlbmsj!i*3o#HOZEIX$Xe1+dj0^JOqgYF} zH`udJrO+gEWKUjH$*NGcWuym5wk&mlP)U+eMki8DUN2!AFlXymk}LZu(j?`Y$O9dl zAtc-+$3O!!E3kH-L(I&z>NXCmNy!EJ_72I0_&8ZEZ;)O)g8*VM>shuEsBTBdP#}3} zlzD^_lPohwGl@822rF`YpcKQ7NkX`ggb=EMufnlAfz;;i$DX7;BWprX6r!!vhn;$< z#pT^<__}ZkSrc1pQV*z9)LY8v?@oai)PW2zY?U#-IL2w_U2-kQ7{^yVArQos>A4-8 zvN(ikaR^|M_%TL7IJ!zV{4ur4i+-|m;@El6*E30cQZ}B%oq2*0hutvgxNEZuF^1(8 zIimCu1OueH+_sYK84{2q2Y9{`d9*i`*-fNFzI$!pAv>gkZJ-Xb&fBoZ&~lW5eFE zR1Nwv5V6}0Gh#5|No)>C5QRTWX-XDJZI;+g? zj{QRkKvKbyC~+ss$;OkEcI-RJGo*6UD~QNF34p214nDFkUDn z5Pfl%MK-6zUmeRDYgHUXP@P}f*M99+ITSyHM=JFX3P_R>X?b^J9ovWcf~R;mxrV%N zg?uQxL82^)*g}FGdon3W78ND2OvR9}PSPZADM*PSEf6PjNN5*=jbtH&UaJ!38|n5) zwkPFq+~gJgu?Z#LVIe&b`XEZ>14u$VeHp>#R{a%NNPwl^BTQ2& ww{FIk+HlV+({N3RIIOxzDJ`uX1k;-Cu76_1T9w-?H$RZn{2zaz$Jft4 z8C+JwzkK+jemr<_;yxU2?zHDz<=5M%-2EII9cRU3|HRMy(uZeWWwY8hLfByCvq@RZ zZe`#b?-%t)dA%$v9h{Wo)!Y}$`V+fqebEQ&GA$?*Ja=<@vY&;Bv`>v%Q#`xhS%@)!Q; z#zgga>gSnhqV9;;+vwm$91nvHQp^yOa-QV@BAYXIZh5=#cBWTee(eocn|0bqUQF__ z4-=0JmQ>-6wWh38wl6qO?#kDLjTP}SSL+?Mo%#OZ$bo7t@(fO<0$D>!@ z_un76A9iP6y~j!BdGQBdTrZ~vtP|j3o_)I=8*y+^)_Dk7c3&U&O?*AB@)*#9&omyC z#5Eo#{`mShdHA@ze0bdUqz;N(PPp-xwz|w2?xmUO*GJ#XkBY_7cWeE0PPDYtIlo6& z@2HP;q-~;s344b=63ciNqAh(T%QBgjZ+tb*YM)qkO~Qwxyr_K?K(-u}?GmRQbg$8{5Qh^5xXd^|zzWKH1aeHtTh^^vSfG zm)BLcm?nm(Z2Zl}NSFP~hs4W!<8mI-V=(OVRlQ6ued1rQvRRmMIrWX1lf2k1=AeZ0 z_5F8BdIw6H;NJ<*KN=?Q{p;uPA^O6*`cQhe4?Rk*j145sijyXxCLsxKY!zbhyLr@} zwDuFV)^!_;Hk}hkFJB(-0#RpZkBha!(T`OnBNg25(H<>!@cO^ue9@q9^*(RD?W>Lx zW<}z^HF9eiV*?ZmCVswH-Uc5X8!a}U&+PLenfV((TVM4P-8A`=QSBH3Ld6i`TC5n7 zNH;B(6`LpXx%FKhUU_30zIu^G)_nk{Syg4XRMq9}(m#p=4P%0TS>AiL^z%S7Pw0E* zvj@joX>WijfwLfUvZ^frTQCffaj{;E>ANX04(Go$!!qFxELmuCH0MjSmr*Sb&W z@Q!_ojThXl+<3_y3U0;^D>;t06pcU-hXcMW4L$dhJo|iIOJs}1EFZ_L_?vGdJ3XE( z7RPxkv#xSq0V8oDSZzc4l4nnXw^(+ICfqqrW66A;Rktw!N7HWZ+V_CBX3Py78dqt9 zA_&+aMvcT4>Xo4W@0$^{D6ZwdW=7*rSse{n$9Nyi`k%DowjkJJ)1LXtr|mKon(A3V zx^ukcD?eUBtmv?+ec8}QlOR${lhoqarlL-anyxBu zE|4vg&}y-NeA4)vWt%37C3)TW&{49^R$21ZzF72CVtHyk27G_j_KJ>2^y<}RLx(w;b%brD@M9uoHZw;4V)KA@Poq&;RNJN$xh%_>&x(B^05RtCsi~xl^-(hMSGh6z z*Xt--IofCsH9F z7!n9%>_n`0W^1&XL=tkohAexyPHN^RT)|TO3RCYvci`3gA zOncmXdK2IGk>TFmL^ve&gO$WPRv93_+Duy6hC@yGHkT0r0UT2{`{7$`nv0rk^;CyEw= zaa`DT6XPNn{UWNtz}Y0&2>ad}E4Tf{c$QgN5ceqJntCySU0mMk$Sk)$n>j|bW3OIj zRX7TJI}d(%@T&&_Y`xtkO@qDOO~2*Cy}4gzp{Q=1vzw+qzn;cE++f&p$)5G*O~9#f zw~JXh{>D!(wpY60uvN77{GuF(zHbX+y=6Z47qKkvxzqmHAU!)vNBzN|{RH!-WjQWq ztE1ZZ-h}&$DepA4JJ!7el8}%OYB{r?&IE&?zskI?J^MUsvUgpIlyS2EW|m zDuk7m1mO@hy*oSKC8<4^qi4jHKp0*7LpUoaMoZGZpA7#qMj9FNZdIt%e#k9I>k%L#k~I2_Vb zPVtD;!9m+eCD<$NQwE6|XPk4uTOg!yXRfPzOn;^~rkHR9Z$^x9XHY{bfsRiYVF?Uu z11MVJxs?#zHMvvR4l-dv9CAf80yCCll5>4bfkR0K_n+}z3rd*?#7N>DFtTG-mL)QK zNe%^!9I-xx3@2D3QF2P9j(7twAnupaq0<58903`WAx){LbGW!8G}9A2!*SsXCo-H< zc?jnufgwGi5LhQP`AaYj(b@if38qmC2)5nByP@Px5$p-I?qnFn+&C0>zH_c$N|gv{ z12vQ^+3Ek7Mgn0H|H;0D!KFh?;W&q5(qTT3IUSj1%3P^WCI2PIa_7j;X^QlDLXO1? zByXjCOyL~oU?uLD)d#%ejPV1sA?@=-3VfgA0@m3=bOE#|ep)7EVbs$aBfKplCv0_?BZ4Mi2^M$hWj}1Jj(s*bYpI!&EAD;y57@ zJfza-S4c|K={fOD^5>{^VXeYBsU?=WG_-V*9I+zdgTX)|&>0NFo?M#J%cyB8f`u#n z+6`z5X(jf7SjScsJR9I~6iIyYjEf@ib_ApYULavAb=E0v7~+_wlW4}|G2$v&z_Yl} zJ_o#tG6M=!QhEZdrSu6pNlGoAaSb%Aqn?Q-bu%U}$-1olh(CoN0ZK2T=2PY}W+I?P z@C>yOD(rMP<%SShIu|VKrC9^p5`FMEEQs-6-G?qsqv(=|9p%4_(KL(PAzI-K(moMZ zNE##klD9sCZYfea>Pl=SULsQH6@=(p#Q-2uHqV?yEHY$~ibW@H0uinSUMxU$uWyKC3Vo0be1?yXfja{Cyo^_D-K3A zsZKcow4nQC%$4FR%tI*`aRTp2HE_Xp67i{NR&u1mDVIs((h%a&cX|LTd};siEgRXS zXTlPtX~jfCqykWBu*mi)QyLknWZteCQkIh16sEDIr{jcIv(RTwaSZ5EXUi){($5g4 zOc={Uxf7qt%2*bIE&yUe@q{`l2KZ7_$`g*6Mq0SSVx*ZVuOT^Y1p*fmmRN2}hNaPk zn#j9P!gtwoCDmYAArzY6cj6u_X65}1jVlbmsj!i*3o#HOZEIX$Xe1+dj0^JOqgYF} zH`udJrO+gEWKUjH$*NGcWuym5wk&mlP)U+eMki8DUN2!AFlXymk}LZu(j?`Y$O9dl zAtc-+$3O!!E3kH-L(I&z>NXCmNy!EJ_72I0_&8ZEZ;)O)g8*VM>shuEsBTBdP#}3} zlzD^_lPohwGl@822rF`YpcKQ7NkX`ggb=EMufnlAfz;;i$DX7;BWprX6r!!vhn;$< z#pT^<__}ZkSrc1pQV*z9)LY8v?@oai)PW2zY?U#-IL2w_U2-kQ7{^yVArQos>A4-8 zvN(ikaR^|M_%TL7IJ!zV{4ur4i+-|m;@El6*E30cQZ}B%oq2*0hutvgxNEZuF^1(8 zIimCu1OueH+_sYK84{2q2Y9{`d9*i`*-fNFzI$!pAv>gkZJ-Xb&fBoZ&~lW5eFE zR1Nwv5V6}0Gh#5|No)>C5QRTWX-XDJZI;+g? zj{QRkKvKbyC~+ss$;OkEcI-RJGo*6UD~QNF34p214nDFkUDn z5Pfl%MK-6zUmeRDYgHUXP@P}f*M99+ITSyHM=JFX3P_R>X?b^J9ovWcf~R;mxrV%N zg?uQxL82^)*g}FGdon3W78ND2OvR9}PSPZADM*PSEf6PjNN5*=jbtH&UaJ!38|n5) zwkPFq+~gJgu?Z#LVIe&b`XEZ>14u$VeHp>#R{a%NNPwl^BTQ2& ww{FIk+HlV+({N3RIIOxzDJ`uX1k;-Cu76_1T9w-?H$RZn{2zaz$Jft4 z8C+JwzkK+jemr<_;yxU2?zHDz<=5M%-2EII9cRU3|HRMy(uZeWWwY8hLfByCvq@RZ zZe`#b?-%t)dA%$v9h{Wo)!Y}$`V+fqebEQ&GA$?*Ja=<@vY&;Bv`>v%Q#`xhS%@)!Q; z#zgga>gSnhqV9;;+vwm$91nvHQp^yOa-QV@BAYXIZh5=#cBWTee(eocn|0bqUQF__ z4-=0JmQ>-6wWh38wl6qO?#kDLjTP}SSL+?Mo%#OZ$bo7t@(fO<0$D>!@ z_un76A9iP6y~j!BdGQBdTrZ~vtP|j3o_)I=8*y+^)_Dk7c3&U&O?*AB@)*#9&omyC z#5Eo#{`mShdHA@ze0bdUqz;N(PPp-xwz|w2?xmUO*GJ#XkBY_7cWeE0PPDYtIlo6& z@2HP;q-~;s344b=63ciNqAh(T%QBgjZ+tb*YM)qkO~Qwxyr_K?K(-u}?GmRQbg$8{5Qh^5xXd^|zzWKH1aeHtTh^^vSfG zm)BLcm?nm(Z2Zl}NSFP~hs4W!<8mI-V=(OVRlQ6ued1rQvRRmMIrWX1lf2k1=AeZ0 z_5F8BdIw6H;NJ<*KN=?Q{p;uPA^O6*`cQhe4?Rk*j145sijyXxCLsxKY!zbhyLr@} zwDuFV)^!_;Hk}hkFJB(-0#RpZkBha!(T`OnBNg25(H<>!@cO^ue9@q9^*(RD?W>Lx zW<}z^HF9eiV*?ZmCVswH-Uc5X8!a}U&+PLenfV((TVM4P-8A`=QSBH3Ld6i`TC5n7 zNH;B(6`LpXx%FKhUU_30zIu^G)_nk{Syg4XRMq9}(m#p=4P%0TS>AiL^z%S7Pw0E* zvj@joX>WijfwLfUvZ^frTQCffaj{;E>ANX04(Go$!!qFxELmuCH0MjSmr*Sb&W z@Q!_ojThXl+<3_y3U0;^D>;t06pcU-hXcMW4L$dhJo|iIOJs}1EFZ_L_?vGdJ3XE( z7RPxkv#xSq0V8oDSZzc4l4nnXw^(+ICfqqrW66A;Rktw!N7HWZ+V_CBX3Py78dqt9 zA_&+aMvcT4>Xo4W@0$^{D6ZwdW=7*rSse{n$9Nyi`k%DowjkJJ)1LXtr|mKon(A3V zx^ukcD?eUBtmv?+ec8}QlOR${lhoqarlL-anyxBu zE|4vg&}y-NeA4)vWt%37C3)TW&{49^R$21ZzF72CVtHyk27G_j_KJ>2^y<}RLx(w;b%brD@M9uoHZw;4V)KA@Poq&;RNJN$xh%_>&x(B^05RtCsi~xl^-(hMSGh6z z*Xt--IofCsH9F z7!n9%>_n`0W^1&XL=tkohAexyPHN^RT)|TO3RCYvci`3gA zOncmXdK2IGk>TFmL^ve&gO$WPRv93_+Duy6hC@yGHkT0r0UT2{`{7$`nv0rk^;CyEw= zaa`DT6XPNn{UWNtz}Y0&2>ad}E4Tf{c$QgN5ceqJntCySU0mMk$Sk)$n>j}0biI0+ zRpBV??L7G5!LJ?!u=RGEG!6E8H~p3m_vU_?g`&E3&Tg9e{CXPuaD!pXC41JJHvy-{ z-7aS3_!~dD*k0*|!&cGS^NVsE`o1lQ^_KbEU&OMw=T7@)gY@hy9rXu;_7lvTmgTsd zwKo4+jJ4N1yV(Q`JkPcXeGny^T@0N@EsJQ)p4!guLZ`gE>MYk5d|j0{esX!S8T@jK zs}NRN5`;t4^zQ6@m!$Swj-C-)0;vP9P6vFz`Dyn7Y?z<6v>XK(L825gxKk|2IZSbm z3x*KEjUc2f!=0UVr9Q#2!y{ZDGPnV_nmd6MT;~v~9O02^pNdIappCY5T$fm*PpJl6 z2yaO#7mw3E7Di1BVL%zj2^@-Xe!*BUw*CDdV{8EDa6CQ-=q$u{J=zWFEGO^{;BZJ! zImIJV2M28@m0+*5PZ=a?oN>+pZ-J1;ow=^=G5wj|m}0^aycsdZok0z$1Uf!pge5Sr z4WMX==T<^=*W^xNJII6yamW?X2+UZHNzU~#1r8+{+<(Su@a>V)&GMr$EM9C?YI^qq$fVf{uhfW8Wa|C2ihBT#~&f(&Y&`eM849A5loXBua zY!@4NP+iV>>V<4pXVriQ|Ms z@Q_NQUm+<`r{}~s$)BUvg|!Ojq?TCf($LaLa>R;+4+aB?KxZ%vdva+?FQcZZ2o|pN zYd4@Nq?OnQVjWvm@N9s`Q6%xnGcJn6+Yyisc!7ke)LEyvVTfazPNEr;$B3(B0ng$> z`yB8p$_yw_N$Cl+meMEaBq_Cc#x>Bej(R4V)XkW@B0Gd^mu3xYOZ36xupq{NbsxGkjiO5;c9j1zM$;^EhiHW}Nc%)s zA!&^COWyhnx}`|zs4KCRc!@}%R}i9a6$5}s**tR+vB;1`Di)alE#rxBMt2TJVU}kb zR&xz-oKn{m(UB5LUBEkt>=C?~REAZ9FljDQYIUX>W?V|h4mx{blptlN7fKWgOdzC; zhv@*hCS}Fu=x9uTDOcf?*Al`~01(sElvdhmaD26c*KrG$(-5zk>j zek(zC=Xfl;iGXd&aYtN=DwxY5qd04qg3B%pS)IU=IZOC7on34PwK@WyHEAkzS@;T_ zNq|k7MGl{Wwb2m-aN-!;8gk?_;Bm6I3_qfTj+UewodHV{LmgY^l5G(90VNzlUfEvn z0u47q-Hvy^o!k5vE<(Kr(7nDOGAi9-{}FY@TL93w`^pS zo(W5orWF$nkqSVi!6MtIOlf4Ol6kvoNLfm1Q<%nfz?`jLNv`atNRyOnA`f(I zhLCWR90Lu^tialR4ly&=s@piMCM6f>+dCv1;^Snwyg_>H3<8M3tY_Iupt>C)LxJR_ zQRWd!OtQ=z%_QQ8A*{&pfl>@RCJEs}5<;j3z6!_g1X7#3AA6GajI0SkQHZuuA9m`c z7MFLc;p@UFWKC?XNj;!aQEw@uzdHq9PzN%=uvNzR;uxoycgeLJV;o=ggg_8irssBW z%Hj~F#UX%2;>Q>T;pi&e@W<3DFZ#*OiDTzMU(Y1*N!fT3cjgI39CpK`@Yr|fFUj<;;e%a;tJL*=A)l zrT2&j>q3YC@nJo|&LZv0ZV%a!*4)fn?zHvIwbpkc?K^I-S7o)DUrfW-Z2A3i>8vul zJN6GH07(T)qQspjCmT;v+Oh8>&ydPZuOK4#Bmf3uR+Nslkb!;E%3!dWP>}xA9Ne5iQz8p5ke5fvs`ixUbQKogoI=bk z`%)w<`ogrdxWuE`)|B8cQ_#7j1?<=-p!S6CjoiWfQiY$W?*3?i@s`W*Qv(;d{no%f z=0fv{JSg;eJ@>=uXY#r|@|XlYd5uZ8vKU{84mCc)N6OgD<}Mktuvgh5A_10uk1$QC w+`1WCYQsIROv5!L;;`x>rL?qm5KL>jyZ(t4YgKNq-26aN^MCw>jt4*d8v?SOo&W#< diff --git a/packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:54.216923773Z_DocumentQuery_90af5a08200f1b0e42dbd3ad7a6af38ff6415d9cabab87315b9d9d736194597f.json b/packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:54.216923773Z_DocumentQuery_90af5a08200f1b0e42dbd3ad7a6af38ff6415d9cabab87315b9d9d736194597f.json deleted file mode 100644 index 2a854d17b94f963c850282331ad80640d6e81c71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24335 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 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:54.251885544Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:54.251885544Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json deleted file mode 100644 index 78feda0e9b1b911165130edff0a180d867fbc408..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21973 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 NhUVY+Tj2-4`~y&&s3iaZ diff --git a/packages/rs-sdk/tests/vectors/quorum_pubkey-106-6d309b63e7a286d50c8091772d4760d7a75e2a5427cbc90009bf8a2540448035.json b/packages/rs-sdk/tests/vectors/quorum_pubkey-106-6d309b63e7a286d50c8091772d4760d7a75e2a5427cbc90009bf8a2540448035.json deleted file mode 100644 index f746126bdd..0000000000 --- a/packages/rs-sdk/tests/vectors/quorum_pubkey-106-6d309b63e7a286d50c8091772d4760d7a75e2a5427cbc90009bf8a2540448035.json +++ /dev/null @@ -1 +0,0 @@ -[141,132,157,207,35,82,50,219,213,72,229,97,208,188,215,79,24,147,102,225,175,235,164,36,151,85,253,37,170,115,169,162,199,137,216,2,209,136,168,22,68,58,133,150,93,172,147,177] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/quorum_pubkey-106-701f88befd253a93e07bfd7efdab92786db9a793eeee5d9f52ac7c9b8bbda97c.json b/packages/rs-sdk/tests/vectors/quorum_pubkey-106-701f88befd253a93e07bfd7efdab92786db9a793eeee5d9f52ac7c9b8bbda97c.json deleted file mode 100644 index 4bd53befe5..0000000000 --- a/packages/rs-sdk/tests/vectors/quorum_pubkey-106-701f88befd253a93e07bfd7efdab92786db9a793eeee5d9f52ac7c9b8bbda97c.json +++ /dev/null @@ -1 +0,0 @@ -[129,222,251,50,164,80,191,135,132,22,197,92,201,142,67,228,143,12,32,93,50,77,1,100,19,83,159,15,68,46,152,96,142,16,227,42,246,49,205,128,203,199,227,253,71,46,39,97] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_read/.gitkeep b/packages/rs-sdk/tests/vectors/test_data_contract_read/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_read/msg_2024-03-18T17:30:02.264404663Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/test_data_contract_read/msg_2024-03-18T17:30:02.264404663Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json new file mode 100644 index 0000000000000000000000000000000000000000..9bb19f7c1aac11fed896a3fc418f1fc234d37051 GIT binary patch literal 74129 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 delta 1328 zcmZWpON&1@98 zc~Am}&qNMORudC1DkLOmBCPSSTm(Hq;v;K3XnZ7iGjLeeuX;T=Fqh6$SAX@r{(5Kk zx!o7e!!`aov}0oEG?{6XJ0)`k^H! zO_Gem*bSx^mLL7>DxB2Hi8Cy_5f+rRO5E5KP_+>ALgQ9VT2-%wA&*ix*j0{+@n}87 zKcsoB;luL;=GuMy*b-QyAMZ!X`A^M9Qwn>v#Fe_lQb*x9EvrosAwwu4oTAv9HH`%! zout4W9(kCIcFsubr&l*?%I?O2uA)?pmnrud%3Aa!R!OTcSo9-YomH2fZr<~7!f@^#}ZRRcV~12X_5x zd-J`mOwRYqT9J~E&l{qw*D@>igs-uSN{$eVfzoC=!0#TJ)$k+}m=N?*W4+GYQoOKj z8W*O!R*@fP_mzs}evYO3ozz0Ng$~QNO1N)4jT40bEs$lS7bwBTbFHD+m-{eGT;R)Q zSlYJ0kL~8QzQVn#!ank4?QuqHY*Zya;rfcZo#48XKu$*3!xcLymmiXV+BE+>r{nF& z$AxOkdT#4=vKy9w-?s=%v9FNnmZo@cOwtkdRzrM8NY=nf41@@6pPmYWGQiUW|GO`3 z1DPU|-N$5~ZELJmS?nY)Yw(k=oFc`Djo4q4r7sW9DtyXv7X^-Ue7rVWn&U$b%0UW! zmtnD%WdXjL4Xseum;r9rLwkdq=|sCm#rT|=;c$E*PRIY7EFNDNnljB+l$MO_Rq+@L z#MGQ(h_BrcVoE}|g4d72;ZUK;p+DV~IL7~c`erbW7!MMBTMx<(bCNjNIhMS@-axp* hKAq)=*ka7v=aj}F9%&6+qGWd1HE}{p5nkLr_b-H&Vh#WR diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json b/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json new file mode 100644 index 0000000000..febf179550 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json @@ -0,0 +1 @@ +[140,166,219,3,87,141,69,160,158,153,22,179,34,58,44,164,191,240,111,196,114,27,180,199,89,247,126,103,234,93,92,229,246,192,127,27,164,78,63,100,86,79,205,231,251,65,175,178] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/.gitkeep b/packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:53.480718000Z_GetDataContractsRequest_f229a0e58a5c4fb050f57c087bf067bd9ccc29eca3092a5664a5a9ba3bb7e967.json b/packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/msg_2024-03-18T17:30:02.262237140Z_GetDataContractsRequest_f229a0e58a5c4fb050f57c087bf067bd9ccc29eca3092a5664a5a9ba3bb7e967.json similarity index 96% rename from packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:53.480718000Z_GetDataContractsRequest_f229a0e58a5c4fb050f57c087bf067bd9ccc29eca3092a5664a5a9ba3bb7e967.json rename to packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/msg_2024-03-18T17:30:02.262237140Z_GetDataContractsRequest_f229a0e58a5c4fb050f57c087bf067bd9ccc29eca3092a5664a5a9ba3bb7e967.json index cb54e1a5d4c517eb9a2d1988ca8f5c8d82255080..6aaa19f53e32034f8c230268df426149a3ed6b82 100644 GIT binary patch delta 1524 zcmZ8hO-x)>6waLoddaoZ!}!{tVr?Xksb z1Rd>7NJ$uPkvipayv6V-B3>Uh{IVu_vKO0kj*+oioW5M@@_e(FO~g-cYuVOnS)v|7 z8jazJQX~DYB6+SJ3(_IyZY;mYQRZPYaJQ%V(+}eEBX+qbN$d|3&(74!3ea##(D027 z&2N_)KEG__Z=0&oBFitfru=GvV!*|zFAy|q_@bkEYJ^lqR$TQe9~maO5JimcC4M(Y z{2)xSRRw@3C&w*K-8YF3-6CEJ6MtCd2HMlI$5U~B&_=TCDtD%ZY*x8rP_NZPu2-03 zGmZyK-fGP7b{Fw6kdx;gxQG`ji7z})Tm=g9XI7?(=VO)pOaR#;TCV$ux*X9w7t=iU zlKJM!Zj}hgPgVgOVktAc6C|0;>sA745}FTe7@>sHPO>A%2X1*hT5Kfj+iv>EicWGe zh6PV9-z%d~SGu)4{;yv$myvg>ln-nLH$1U!cwD1gmE)u19ydU?Q{TDV-lX%SjFOQx zS9x;L;`lyn`14{{zN`WG#Udj|BG`pJtOHq9cn~nbVwXnzYo~02GAc*y?fkrORI+d~(1-kuk^`9S8-ZjHTWCuwq6Np;c?t!7rtcrRfFC6Q1GmEo^;`A#a+AtyYQmZ~~nv}TOAP+^p= z5(<8#4d0)J;zPurIItwl{?@J#mj*QtmfQ9y?{&Km400DN7l@oFrF^efwUM4ZNPfsQ z90`V`%2!&po~HY?8g)zByNq6j3P>oL355qV46|< zOSCNFf`I7?cLNVW*NT{O3vKKy5MRH9`ClvC12A=gP%CWSBKMAKUhhYSLp#LQVLO)F8~r5Xc6L^PWNHMWoj3VA==FV?UyQ(@>8#wWQv=)r z&setM9Xm#1AfU8HmF8BLWU3wyV1TzEG42X`mlOzwvq%<#%BD*4iIC6TpsycOf6Wg3 udOz{jq~UMpiAP89FAm8IE|T4CEKDX(I^d==#p;|F=x#w`1jz0#h3&HQ)`U@AEZ!Y>O&EYSs%0wD5+0^Ni=?Uwt~2@?B1Dk z&v(xEedm0;6u!O`o{I{@@1nTa8|v!vX`jf&@+IFZmAqo!_i0SrXLPwAUlct%X*{g> zz-}S=FGnc45w&QoPEkaf+^mG+PaE(wJuYc!Qu1XRhg-EKZLLX)H%RL2ReUHTB-Njm zbibweWC8~rE`5^=dywGyMm*V9TfMhGr1+PNuxPtU@-3b1g*O#l3QMEpzO-TThAFPn zgF94kAskVBr4=dK+l9r`mN02Osi-_7X?jG_Dsm#P;T5PaWYcr~il*ijPqhGVd&o4p zeSXXmHXWTY`9v!k{0UuB_Z^BJG9>>gkvM2sU##?5x3eVvFW`xcjl2ksg_(leY^@ub)pWe#aGy)Y?pmw5A$VHw1d_2FznG`rH zpSO6~0O9XK3)`2PY&QOt0Zo)BJL=G95ve&3`EHIMZV?$;T$hxJS)9|Ao{8h$ilk@5 zD&*xoDsS4T8s-7P<=-Ta>_$*!LecLa^TT$aJq5IHq~yn&AkIN;B|om{$E0PrMcRlu zbZ%a0&_tp1zrvCJaN42rpvhPDy?nh2?xtc&b7AqlnvgLl=Ro{vTS!sj(Ui#YD_LN5 zw1{q+{aNw%O~T~OR*~SF85DG;QPHCici>A&xsalpbrzWzkF$;HwR(xy2|62>Z#Y2w zdQy@3qQxyK9N_aH{z$~4CqU9_Papv3P+S3cVBo#A36}LR#}VD`=a>cv#KRfk^A`L{ z$1C7|RPu^$=;$s?n_=?PE$Cyd26zdJPD7QMHoVn_SiV!~OjW+!f=hqwu<2JATD#*? z1RlQUw&T+^7A+1bIu%37b(mM2FN6W+Nm^)ANNe$xG&0!@5GNL>ulEFff?#9|^r23? zd=H1IMilP5R1>#@Oj_QRi;Dd{y0BSkpp*k#bM*kpe(O4;9AMK6?3@RSL$Q#8XU6VGgCZ$nywJa&V-Y$Ha zd89hDBQO*Gb5x;ZO1Bgi4|bLcHkpRpe?d{bo`w$0V4e>D;8fR{c6UFvTwqx& n0e(4)ZPM3Ul{%-ZK=`#mC*bCUUd3>u;d(rj5zXAzAv*s7bA8M( diff --git a/packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json b/packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json new file mode 100644 index 0000000000..febf179550 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json @@ -0,0 +1 @@ +[140,166,219,3,87,141,69,160,158,153,22,179,34,58,44,164,191,240,111,196,114,27,180,199,89,247,126,103,234,93,92,229,246,192,127,27,164,78,63,100,86,79,205,231,251,65,175,178] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_data_contracts_2_nx/.gitkeep b/packages/rs-sdk/tests/vectors/test_data_contracts_2_nx/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:53.484884409Z_GetDataContractsRequest_93bdf343bce1bafb96fd873236cabbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json b/packages/rs-sdk/tests/vectors/test_data_contracts_2_nx/msg_2024-03-18T17:30:02.261742919Z_GetDataContractsRequest_93bdf343bce1bafb96fd873236cabbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json similarity index 70% rename from packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:53.484884409Z_GetDataContractsRequest_93bdf343bce1bafb96fd873236cabbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json rename to packages/rs-sdk/tests/vectors/test_data_contracts_2_nx/msg_2024-03-18T17:30:02.261742919Z_GetDataContractsRequest_93bdf343bce1bafb96fd873236cabbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json index 19686d244233331c00269764874bb06ab97b0752..a69cccbdebc18d1217b71a85f9cac8f62c88e5ad 100644 GIT binary patch delta 1405 zcmZWpO=uit7-nZSyPMtY&i8(sWV6}s{0M@FB<{@4?94A1fa%Ak*G#lzN=!mYZ(oYlahrSL)BfkR!cmmJJm4lY=-{;Uctyf!YFst8`^ zrr$b(*@j@Ltgyz7F4w;3C_C(Dm@m0l9ua)g)>bdUm!6B~iVB;a#?PawnGdNNW(j7R z#NNkuH6LdQ<&#NmQOxa9*SJ*3@q7^AQL@Q$d@mlMI#?p>q>nQr0p6#%7m9+vMX**= zb`Vg|oYx`r_wPH=DC zqYEjHwLSQh$;kDzEx2Y0wnhb;lPSg+r`uhTY=~-t&wYPazj@~7dQFTyAJOWQOv2HI z(owYc^fbkTMGvRx_GK!5v7~XctaOs>-In!nO?y~idT%h*#yR8Y+tZ4JfFC+RA;H-a zaZ@nWj&a3RcAEan%Z$RZuQ6yTeC#TmBQhomFHy1MJg-ut)>Xl&w!$lP->hFMF$I&1 z&6LJ!Md7NYY0|GP4?mU#ty&XT+74C-`u$Oj)O%yy~fE& z1JOx3q*sRbT$jlvRbTLyZ9t}GXw3x4n3?eyJNsOd?PfgmwaIwP@t`zklFpa{xy2N$ z)&&P_c1&Vw02>U$GPzVlV~Ng?{%$a4x%P0Eqr#dvN6C&kid8}ctg@rtWB8+}@kCXb z+Ol}kS8Rc;aR*;>(&l^zhZuDFWU(aju1k?k)OHKtGKD?T(Kt>_hgfD$(V0amvO$_x j>8!bbW<(cyX!FBOPqF^wj=@mmhS?5sMy8FQg1i3#pEYE- delta 1352 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 Po7?DKr|GBCK6CYd9#;1R delta 2423 zcmZ`*T};zg6i-`A!Mfi2Z?RJzS{`iXEGeY{hWJr%D*JFP!5F7;#YD11vrw17ix1ev zWX_Qk>YbeEHtTp;NH$vxaqKIUC1lBX;7?-qvMqdMi!&K3xMYi&6ZX5O827S=b5s8J z-gAEEcYfzwZcQG$IeBdGTWftoW_r7=p`kwWXN@!5R3B+-iZq7n>s5{AptYfHtjE%6 zp@Gv5Npn5r2K6P}1{K?FQWb&*J?yedHJUakRPbP#b{Mqx$1;Q3S-(`WvG299zv0Qgyi7jHol|z)|KTcUX*Y_$m);_7gk$(Kz zTdB_xj_e*T7pf%^Qti?;9=~k++^WLIg^EYS*o~HJR$BP3+=nkx-3b17zu*w#H|!N7 ze41)cIfWW+5Mv7)aX;T8#!mj#Z>7QHhCSLFEkA9DC(bXdY`M6y#R9X!Y_JV5JFE=m zfR)24U>jjh*e2LhFc(a~B+P)hVIEi|Z1eca7Vn*BD8A^CG@tMqYB?xX^EOGb6q0SZ zP$p@$9~sAbvE))7Lzw~48N~6)W*bW1Df_7y^@h~E zkm~IFLJivg&m^T9?bV!}>GA;G760XG2_*way2I;MvIbc#lo=Z2(68`QKygIPx*S*g zfn&zhFk8Wc8Ia1{wN6{H9oO3^3@!Sw;6vs7z$B+IsQ5kNSXiJjnSxgCq>LVnA_f(<}Cyg2b`0+gyaexU^bg})3P5fwX!Lc!18wr$TodlrU#!S@gAyC z-C`4^C@;k@$Z|^vI%|bT=2FX3MUTrX6X;#dBD+wv5j1fCw|zPA(ASDmaS*

    nHTqZ*~z?=ND9G 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 z zA{g|El|i2f2lIsk!F*wlM6Q+Q3**D{o7eRTOrJQmn4kC@8~cw#LZ7G(`b1pNC(duf z_3+RqMh^26D~CR@9Q28D&?kaHpI906iEz*-27*4(Bav&RJ`o@Ei3(x=F&OMWmV)`h zo(c1XIT82e$^K*I7&P`D_50(3et$riFANC%zB=glaY4VY4D-NzzH90CBZq#!a_INV zLBB5t{XQ7<`<3B-1=T0YMW4_oD#F@e|M7Lj)F(cE*neCS`b0SB6Sd+0N1wP}dcXeg z!}Bfp{@*|Ux8Fa0KmUb4+#f7|zW;i!$H4dXq4(>TU!Q-?uix%};fLRz|Blzk;-9a- zt*@W%KgTck-{_CmU-Rp?`>*kJ{f&NqU;mE#>tFc(y8fnKUtI1#_C@7A*YV^1Uva-xe*bj+ zZGK-MzHbA*Zi`-juKSYy)Ah&tx;xnS53m2y%b8!VKk3(x*FW(;T>pH&zpsD8*Dn`} zpI`rp>tFb~|E^x&yKcJoqxH8-lJD>9kM({3@sj2L{@1$xnO*&NMW`x5o_k@P+dx9j)c^l$f{>ay|j?WXemeI1?G-RCv*@p{_bC;Z+~xzF#*pVwpj z{x$u6Jy5Sd<=4;Gzwr9i|GIB8_do3WH~;HK_1jJA{we&r5AWCO7yABdynJ~5LGR!2 zulvgLb^ly`-Dl~(Q+?l$v->f9{iwXq-S>p|Kc4%~`SsHU@9XyN>(}e7y&hKg*}5Mj z_ciT)GJUe>pG&}_pj;KeXD)nPwwB> zU+-VC`zm++ZQg(Im$~0x*FT=GU;k!b8S{VshrfPa{{Dad`Hz44^MC)_fB3t9{)gZH zyWjo$zxwz6?su<$DEIH(`|zvSzS-~D&>{k~w|f1CGH@_nq{(qFFJzYafNr{wGYXZYJC)7SkhzU7;L z#(yQnQ=WhR$N%zAfA=qc{?mVcsq=MTWxl?zKmGmVdH)A~y#FNk58wB#*4OX}di~1Wm+;pk{r+>@>b)K_uV=*lu)F>i?+fl9?w_Rl)$w&-d;dP%KlrbE z<}deu$t~XfzrPOL>tgbHH~D(~ciwN8U-y6KeTZ+BU+>5l$y=b;J>-7ke}CUn-WQeE zU-JIlc>Tk9J)iF%@9V(6-mzc*G_U`_eF^>bqVW3Z`|Ib!WawMR>!0-3J$(OqfB5>o zWVrvq-bdzj-?;xdyq-JX_g~`u+Ih#N*UA3+;rf%ku3oRV{I5F<+$_IdKk@fLx{Jx{ zrT)Hg+;`0H_fP)yh<&|rf4}O~jqjJsq1O-TtEt?0@5kZ4a^L>t-+Zq8>5qT@r@x

    Z$K!QPyRYl7m%5iCU-x6{mAvkY@Ab=g|2@5)a<4!2>o$HJ$NTwk opOl}z|4pCHCHG(c*Z;^(Wgb2M=im94^Z(laJOAfj{^l?L8!})KZ~y=R literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:46.205942235Z_GetEpochsInfoRequest_6a828350e795a088dbc835260a1add01a7428085ffdcf1e11cccf19c48c5f7a1.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:46.205942235Z_GetEpochsInfoRequest_6a828350e795a088dbc835260a1add01a7428085ffdcf1e11cccf19c48c5f7a1.json new file mode 100644 index 0000000000000000000000000000000000000000..c3f4a7dcbebe569dd6b98a2bd8e275e2b866972e GIT binary patch literal 2668628 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 /// Defines a detailed strategy for conducting simulations or tests on Dash Platform. /// @@ -106,7 +107,7 @@ pub struct Strategy { )>, pub operations: Vec, pub start_identities: StartIdentities, - pub identities_inserts: Frequency, + pub identities_inserts: IdentityInsertInfo, pub identity_contract_nonce_gaps: Option, pub signer: Option, } @@ -126,6 +127,24 @@ pub struct StartIdentities { pub starting_balances: Option, } +/// Identities to register on the first block of the strategy +#[derive(Clone, Debug, PartialEq, Encode, Decode)] +pub struct IdentityInsertInfo { + pub frequency: Frequency, + pub start_keys: u8, + pub extra_keys: KeyMaps, +} + +impl Default for IdentityInsertInfo { + fn default() -> Self { + Self { + frequency: Default::default(), + start_keys: 5, + extra_keys: Default::default(), + } + } +} + #[derive(Clone, Debug, PartialEq)] pub struct RandomDocumentQuery<'a> { pub data_contract: &'a DataContract, @@ -142,7 +161,7 @@ struct StrategyInSerializationFormat { pub contracts_with_updates: Vec<(Vec, Option>>)>, pub operations: Vec>, pub start_identities: StartIdentities, - pub identities_inserts: Frequency, + pub identities_inserts: IdentityInsertInfo, pub identity_contract_nonce_gaps: Option, pub signer: Option, } @@ -968,18 +987,17 @@ impl Strategy { if identities_count == 0 { break; } - + // Select a random identity from the current_identities let random_index = thread_rng().gen_range(0..identities_count); let random_identity = &mut current_identities[random_index]; - + // Get keys already added let keys_already_added = keys_already_added_count_map.get(&random_identity.id()) .expect("Expected to get keys_already_added in IdentityAddKeys ST creation"); - + // Create transition - let (state_transition, keys_to_add_at_end_block) = - crate::transitions::create_identity_update_transition_add_keys( + let (state_transition, keys_to_add_at_end_block) = crate::transitions::create_identity_update_transition_add_keys( random_identity, *keys_count, *keys_already_added, @@ -997,7 +1015,10 @@ impl Strategy { )); // Increment keys_already_added count - keys_already_added_count_map.insert(random_identity.id(), keys_already_added + *keys_count as u32); + keys_already_added_count_map.insert( + random_identity.id(), + keys_already_added + *keys_count as u32, + ); } } IdentityUpdateOp::IdentityUpdateDisableKey(keys_count) => { @@ -1299,6 +1320,7 @@ impl Strategy { let mut new_transitions = crate::transitions::create_identities_state_transitions( self.start_identities.number_of_identities.into(), // number of identities self.start_identities.keys_per_identity.into(), // number of keys per identity + &self.identities_inserts.extra_keys, signer, rng, create_asset_lock, @@ -1310,12 +1332,13 @@ impl Strategy { // Add identities_inserts // Don't do this on first block because we need to skip utxo refresh if block_info.height > config.start_block_height { - let frequency = &self.identities_inserts; + let frequency = &self.identities_inserts.frequency; if frequency.check_hit(rng) { let count = frequency.events(rng); let mut new_transitions = crate::transitions::create_identities_state_transitions( - count, // number of identities - 3, // number of keys per identity + count, // number of identities + self.identities_inserts.start_keys as KeyID, // number of keys per identity + &self.identities_inserts.extra_keys, signer, rng, create_asset_lock, @@ -1687,10 +1710,7 @@ mod tests { keys_per_identity: 3, starting_balances: None, }, - identities_inserts: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + identities_inserts: Default::default(), identity_contract_nonce_gaps: None, signer: Some(simple_signer), }; diff --git a/packages/strategy-tests/src/transitions.rs b/packages/strategy-tests/src/transitions.rs index 9f85336d51..fe2477efdf 100644 --- a/packages/strategy-tests/src/transitions.rs +++ b/packages/strategy-tests/src/transitions.rs @@ -34,10 +34,10 @@ use dpp::state_transition::{GetDataContractSecurityLevelRequirementFn, StateTran use dpp::version::PlatformVersion; use dpp::withdrawal::Pooling; use dpp::NativeBlsModule; -use drive::drive::identity::key; use rand::prelude::{IteratorRandom, StdRng}; use simple_signer::signer::SimpleSigner; +use crate::KeyMaps; use dpp::dashcore::transaction::special_transaction::asset_lock::AssetLockPayload; use dpp::dashcore::transaction::special_transaction::TransactionPayload; use std::collections::{BTreeMap, HashSet}; @@ -292,7 +292,8 @@ pub fn create_identity_update_transition_add_keys( ) -> (StateTransition, (Identifier, Vec)) { identity.bump_revision(); - let start_id = (identity.public_keys().len() as u32 + keys_already_added_this_block_count) as KeyID; + let start_id = + (identity.public_keys().len() as u32 + keys_already_added_this_block_count) as KeyID; let keys = IdentityPublicKey::random_authentication_keys_with_private_keys_with_rng( start_id, @@ -489,9 +490,15 @@ pub fn create_identity_withdrawal_transition( let identity_public_key = identity .get_first_public_key_matching( - Purpose::AUTHENTICATION, + Purpose::TRANSFER, HashSet::from([SecurityLevel::CRITICAL]), - HashSet::from([KeyType::ECDSA_SECP256K1, KeyType::BLS12_381]), + HashSet::from([ + KeyType::ECDSA_SECP256K1, + KeyType::BLS12_381, + KeyType::ECDSA_HASH160, + KeyType::BIP13_SCRIPT_HASH, + KeyType::EDDSA_25519_HASH160, + ]), ) .expect("expected to get a signing key"); @@ -560,7 +567,7 @@ pub fn create_identity_credit_transfer_transition( let identity_public_key = identity .get_first_public_key_matching( - Purpose::AUTHENTICATION, + Purpose::TRANSFER, HashSet::from([SecurityLevel::CRITICAL]), HashSet::from([KeyType::ECDSA_SECP256K1, KeyType::BLS12_381]), ) @@ -617,18 +624,39 @@ pub fn create_identity_credit_transfer_transition( pub fn create_identities_state_transitions( count: u16, key_count: KeyID, + extra_keys: &KeyMaps, signer: &mut SimpleSigner, rng: &mut StdRng, create_asset_lock: &mut impl FnMut(u64) -> Option<(AssetLockProof, PrivateKey)>, platform_version: &PlatformVersion, ) -> Result, ProtocolError> { - let (identities, mut keys) = Identity::random_identities_with_private_keys_with_rng::>( - count, - key_count, - rng, - platform_version, - ) - .expect("Expected to create identities and keys"); + let (mut identities, mut keys) = + Identity::random_identities_with_private_keys_with_rng::>( + count, + key_count, + rng, + platform_version, + ) + .expect("Expected to create identities and keys"); + + for identity in identities.iter_mut() { + for (purpose, security_to_key_type_map) in extra_keys { + for (security_level, key_types) in security_to_key_type_map { + for key_type in key_types { + let (key, private_key) = IdentityPublicKey::random_key_with_known_attributes( + (identity.public_keys().len() + 1) as KeyID, + rng, + *purpose, + *security_level, + *key_type, + platform_version, + )?; + identity.add_public_key(key.clone()); + keys.push((key, private_key)); + } + } + } + } let starting_id_num = signer .private_keys diff --git a/packages/wasm-dpp/src/errors/consensus/basic/invalid_signature_public_key_purpose_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/invalid_signature_public_key_purpose_error.rs new file mode 100644 index 0000000000..835d9559a8 --- /dev/null +++ b/packages/wasm-dpp/src/errors/consensus/basic/invalid_signature_public_key_purpose_error.rs @@ -0,0 +1,39 @@ +use dpp::consensus::codes::ErrorWithCode; +use dpp::consensus::signature::InvalidSignaturePublicKeyPurposeError; +use dpp::consensus::ConsensusError; + +use wasm_bindgen::prelude::*; + +#[wasm_bindgen(js_name=InvalidSignaturePublicKeyPurposeError)] +pub struct InvalidSignaturePublicKeyPurposeErrorWasm { + inner: InvalidSignaturePublicKeyPurposeError, +} + +impl From<&InvalidSignaturePublicKeyPurposeError> for InvalidSignaturePublicKeyPurposeErrorWasm { + fn from(e: &InvalidSignaturePublicKeyPurposeError) -> Self { + Self { inner: e.clone() } + } +} + +#[wasm_bindgen(js_class=InvalidSignaturePublicKeyPurposeError)] +impl InvalidSignaturePublicKeyPurposeErrorWasm { + #[wasm_bindgen(js_name=getPublicKeyPurpose)] + pub fn get_public_key_purpose(&self) -> u8 { + self.inner.public_key_purpose() as u8 + } + + #[wasm_bindgen(js_name=getKeyPurposeRequirement)] + pub fn get_allowed_key_purpose(&self) -> u8 { + self.inner.allowed_key_purpose() as u8 + } + + #[wasm_bindgen(js_name=getCode)] + pub fn get_code(&self) -> u32 { + ConsensusError::from(self.inner.clone()).code() + } + + #[wasm_bindgen(getter)] + pub fn message(&self) -> String { + self.inner.to_string() + } +} diff --git a/packages/wasm-dpp/src/errors/consensus/basic/mod.rs b/packages/wasm-dpp/src/errors/consensus/basic/mod.rs index 93a4a87d4e..a67ecbcb52 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/mod.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/mod.rs @@ -4,6 +4,7 @@ pub mod document; pub mod identity; mod incompatible_protocol_version_error; mod invalid_identifier_error; +mod invalid_signature_public_key_purpose_error; mod invalid_signature_public_key_security_level_error; mod invalid_state_transition_signature_error; mod json_schema_compilation_error; @@ -19,6 +20,7 @@ mod wrong_public_key_purpose_error; pub use incompatible_protocol_version_error::*; pub use invalid_identifier_error::*; +pub use invalid_signature_public_key_purpose_error::*; pub use invalid_signature_public_key_security_level_error::*; pub use invalid_state_transition_signature_error::*; pub use json_schema_compilation_error::*; diff --git a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs index 81f3ab7f3a..705442b6e3 100644 --- a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs @@ -1,5 +1,6 @@ use crate::errors::consensus::basic::{ - IncompatibleProtocolVersionErrorWasm, InvalidIdentifierErrorWasm, JsonSchemaErrorWasm, + IncompatibleProtocolVersionErrorWasm, InvalidIdentifierErrorWasm, + InvalidSignaturePublicKeyPurposeErrorWasm, JsonSchemaErrorWasm, UnsupportedProtocolVersionErrorWasm, UnsupportedVersionErrorWasm, }; use dpp::consensus::ConsensusError as DPPConsensusError; @@ -417,6 +418,9 @@ fn from_signature_error(signature_error: &SignatureError) -> JsValue { } SignatureError::BasicECDSAError(err) => BasicECDSAErrorWasm::from(err).into(), SignatureError::BasicBLSError(err) => BasicBLSErrorWasm::from(err).into(), + SignatureError::InvalidSignaturePublicKeyPurposeError(err) => { + InvalidSignaturePublicKeyPurposeErrorWasm::from(err).into() + } } } diff --git a/packages/wasm-dpp/src/identity/identity_public_key/purpose.rs b/packages/wasm-dpp/src/identity/identity_public_key/purpose.rs index 0623438ef2..5e598ffa52 100644 --- a/packages/wasm-dpp/src/identity/identity_public_key/purpose.rs +++ b/packages/wasm-dpp/src/identity/identity_public_key/purpose.rs @@ -10,7 +10,7 @@ pub enum PurposeWasm { /// this key cannot be used for signing documents DECRYPTION = 2, /// this key cannot be used for signing documents - WITHDRAW = 3, + TRANSFER = 3, /// this key cannot be used for signing documents SYSTEM = 4, /// this key cannot be used for signing documents @@ -23,7 +23,7 @@ impl From for PurposeWasm { Purpose::AUTHENTICATION => PurposeWasm::AUTHENTICATION, Purpose::ENCRYPTION => PurposeWasm::ENCRYPTION, Purpose::DECRYPTION => PurposeWasm::DECRYPTION, - Purpose::WITHDRAW => PurposeWasm::WITHDRAW, + Purpose::TRANSFER => PurposeWasm::TRANSFER, Purpose::SYSTEM => PurposeWasm::SYSTEM, Purpose::VOTING => PurposeWasm::VOTING, } diff --git a/packages/wasm-dpp/test/integration/dataContract/validation/validateDataContractFactory.spec.js b/packages/wasm-dpp/test/integration/dataContract/validation/validateDataContractFactory.spec.js index fb18dd6ef8..b2c1a582e6 100644 --- a/packages/wasm-dpp/test/integration/dataContract/validation/validateDataContractFactory.spec.js +++ b/packages/wasm-dpp/test/integration/dataContract/validation/validateDataContractFactory.spec.js @@ -1133,7 +1133,7 @@ describe.skip('validateDataContractFactory', () => { const [error] = result.getErrors(); - expect(error.getCode()).to.equal(1009); + expect(error.getCode()).to.equal(10202); expect(error.getPattern()).to.equal('^((?!-|_)[a-zA-Z0-9-_]{0,62}[a-zA-Z0-9])$'); expect(error.getPath()).to.equal('/documents/indexedDocument/properties/something'); }); diff --git a/packages/wasm-dpp/test/integration/error/consensus/deserializeConsensusError.spec.js b/packages/wasm-dpp/test/integration/error/consensus/deserializeConsensusError.spec.js index 338b0af120..68a3272a5f 100644 --- a/packages/wasm-dpp/test/integration/error/consensus/deserializeConsensusError.spec.js +++ b/packages/wasm-dpp/test/integration/error/consensus/deserializeConsensusError.spec.js @@ -18,14 +18,14 @@ describe('deserializeConsensusError', () => { const message = 'Can\'t read protocol version from serialized object: test'; expect(consensusError).to.be.instanceOf(ProtocolVersionParsingError); - expect(consensusError.getCode()).to.equals(1000); + expect(consensusError.getCode()).to.equals(10001); expect(consensusError.message).to.equals(message); const serializedConsensusError = consensusError.serialize(); const recoveredError = deserializeConsensusError(serializedConsensusError); expect(recoveredError).to.be.instanceOf(ProtocolVersionParsingError); - expect(recoveredError.getCode()).to.equals(1000); + expect(recoveredError.getCode()).to.equals(10001); expect(recoveredError.message).to.equals(message); }); }); diff --git a/packages/wasm-dpp/test/unit/dataContract/stateTransition/DataContractUpdateTransition/validation/state/validateDataContractUpdateTransitionStateFactory.spec.js b/packages/wasm-dpp/test/unit/dataContract/stateTransition/DataContractUpdateTransition/validation/state/validateDataContractUpdateTransitionStateFactory.spec.js index af71bb1ecb..2addf1f98d 100644 --- a/packages/wasm-dpp/test/unit/dataContract/stateTransition/DataContractUpdateTransition/validation/state/validateDataContractUpdateTransitionStateFactory.spec.js +++ b/packages/wasm-dpp/test/unit/dataContract/stateTransition/DataContractUpdateTransition/validation/state/validateDataContractUpdateTransitionStateFactory.spec.js @@ -97,7 +97,7 @@ describe.skip('validateDataContractUpdateTransitionStateFactory', () => { const [error] = result.getErrors(); expect(error).to.be.an.instanceOf(InvalidDataContractVersionError); - expect(error.getCode()).to.equal(1050); + expect(error.getCode()).to.equal(10212); }); it('should return valid result', async () => { diff --git a/packages/wasm-dpp/test/unit/dataContract/validation/validateDataContractPatterns.spec.js b/packages/wasm-dpp/test/unit/dataContract/validation/validateDataContractPatterns.spec.js index d9020ce065..f7f09bc512 100644 --- a/packages/wasm-dpp/test/unit/dataContract/validation/validateDataContractPatterns.spec.js +++ b/packages/wasm-dpp/test/unit/dataContract/validation/validateDataContractPatterns.spec.js @@ -66,7 +66,7 @@ describe.skip('validateDataContractPatterns', () => { const [error] = result.getErrors(); expect(error).to.be.instanceOf(IncompatibleRe2PatternError); - expect(error.getCode()).to.equal(1009); + expect(error.getCode()).to.equal(10202); expect(error.getPattern()).to.equal('^((?!-|_)[a-zA-Z0-9-_]{0,62}[a-zA-Z0-9])$'); expect(error.getPath()).to.equal('/documents/notFineDocument/properties/bar'); }); diff --git a/packages/wasm-dpp/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/validateDocumentsUniquenessByIndicesFactory.spec.js b/packages/wasm-dpp/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/validateDocumentsUniquenessByIndicesFactory.spec.js index df48283ad0..3bd09da5bc 100644 --- a/packages/wasm-dpp/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/validateDocumentsUniquenessByIndicesFactory.spec.js +++ b/packages/wasm-dpp/test/unit/document/stateTransition/DocumetsBatchTransition/validation/state/validateDocumentsUniquenessByIndicesFactory.spec.js @@ -201,7 +201,7 @@ describe.skip('validateDocumentsUniquenessByIndices', () => { await expectValidationError(result, DuplicateUniqueIndexError, 4); const errors = result.getErrors(); const [error] = result.getErrors(); - expect(error.getCode()).to.equal(4009); + expect(error.getCode()).to.equal(40105); expect(errors.map((e) => e.getDocumentId())).to.have.deep.members([ documentTransitionsJs[3].getId().toBuffer(), From d6688bef204bd5290440425bdea55e3babcf5d6e Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Tue, 19 Mar 2024 15:02:16 +0300 Subject: [PATCH 105/191] chore(release): update changelog and bump version to 1.0.0-dev.9 (#1790) --- CHANGELOG.md | 48 +++++++++++++++++++ Cargo.lock | 46 +++++++++--------- package.json | 2 +- packages/bench-suite/package.json | 2 +- packages/dapi-grpc/Cargo.toml | 2 +- packages/dapi-grpc/package.json | 2 +- packages/dapi/package.json | 2 +- packages/dash-spv/package.json | 2 +- packages/dashmate/package.json | 2 +- packages/dashpay-contract/Cargo.toml | 2 +- packages/dashpay-contract/package.json | 2 +- packages/data-contracts/Cargo.toml | 2 +- packages/dpns-contract/Cargo.toml | 2 +- packages/dpns-contract/package.json | 2 +- packages/feature-flags-contract/Cargo.toml | 2 +- packages/feature-flags-contract/package.json | 2 +- packages/js-dapi-client/package.json | 2 +- packages/js-dash-sdk/package.json | 2 +- packages/js-grpc-common/package.json | 2 +- .../Cargo.toml | 2 +- .../package.json | 2 +- packages/platform-test-suite/package.json | 2 +- packages/rs-dapi-client/Cargo.toml | 2 +- packages/rs-dapi-grpc-macros/Cargo.toml | 2 +- packages/rs-dpp/Cargo.toml | 2 +- packages/rs-drive-abci/Cargo.toml | 2 +- packages/rs-drive-proof-verifier/Cargo.toml | 2 +- packages/rs-drive/Cargo.toml | 2 +- .../Cargo.toml | 2 +- packages/rs-platform-serialization/Cargo.toml | 2 +- .../rs-platform-value-convertible/Cargo.toml | 2 +- packages/rs-platform-value/Cargo.toml | 2 +- packages/rs-platform-version/Cargo.toml | 2 +- packages/rs-platform-versioning/Cargo.toml | 2 +- packages/rs-sdk/Cargo.toml | 2 +- packages/simple-signer/Cargo.toml | 2 +- packages/strategy-tests/Cargo.toml | 2 +- packages/wallet-lib/package.json | 2 +- packages/wasm-dpp/Cargo.toml | 2 +- packages/wasm-dpp/package.json | 2 +- packages/withdrawals-contract/Cargo.toml | 2 +- packages/withdrawals-contract/package.json | 2 +- 42 files changed, 111 insertions(+), 63 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 879d16aa94..ab366eab7e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,51 @@ +## [1.0.0-dev.9](https://github.com/dashpay/platform/compare/v1.0.0-dev.8...v1.0.0-dev.9) (2024-03-19) + + +### ⚠ BREAKING CHANGES + +* **sdk:** don't allow duplicate mock expectations (#1788) +* created_at and updated_at from block time (#1780) +* created_at_block_height and variants (#1784) + + +### Features + +* created_at and updated_at from block time ([#1780](https://github.com/dashpay/platform/issues/1780)) +* created_at_block_height and variants ([#1784](https://github.com/dashpay/platform/issues/1784)) + + +### Bug Fixes + +* **drive:** internal error on querying proofs ([#1747](https://github.com/dashpay/platform/issues/1747)) +* identity add keys in strategy tests ([#1727](https://github.com/dashpay/platform/issues/1727)) +* **sdk:** don't allow duplicate mock expectations ([#1788](https://github.com/dashpay/platform/issues/1788)) +* query retry on race condition ([#1776](https://github.com/dashpay/platform/issues/1776)) +* identity state transition validation fixes ([#1786](https://github.com/dashpay/platform/issues/1786)) + + +### Code Refactoring + +* make strategy start identities a new struct ([#1764](https://github.com/dashpay/platform/issues/1764)) +* updated descriptions and function names in strategy tests plus readme file ([#1785](https://github.com/dashpay/platform/issues/1785)) + + +### Miscellaneous Chores + +* **dashmate:** readme fixes ([#1624](https://github.com/dashpay/platform/issues/1624)) +* fix npm audit for follow-redirects package ([#1781](https://github.com/dashpay/platform/issues/1781)) +* **dapi:** use broadcast_tx instead of deprecated broadcast_tx_sync ([#1775](https://github.com/dashpay/platform/issues/1775)) + + +### Build System + +* rs-tenderdash-abci 0.14.0-dev.9 ([#1782](https://github.com/dashpay/platform/issues/1782)) + + +### Continuous Integration + +* enforce warnings as errors ([#1783](https://github.com/dashpay/platform/issues/1783)) +* update doc build branch in action config ([#1748](https://github.com/dashpay/platform/issues/1748)) + ## [1.0.0-dev.8](https://github.com/dashpay/platform/compare/v1.0.0-dev.7...v1.0.0-dev.8) (2024-03-14) diff --git a/Cargo.lock b/Cargo.lock index d510e9a547..c28a3d3857 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -995,7 +995,7 @@ dependencies = [ [[package]] name = "dapi-grpc" -version = "1.0.0-dev.8" +version = "1.0.0-dev.9" dependencies = [ "dapi-grpc-macros", "futures-core", @@ -1011,7 +1011,7 @@ dependencies = [ [[package]] name = "dapi-grpc-macros" -version = "1.0.0-dev.8" +version = "1.0.0-dev.9" dependencies = [ "dapi-grpc", "heck", @@ -1117,7 +1117,7 @@ dependencies = [ [[package]] name = "dashpay-contract" -version = "1.0.0-dev.8" +version = "1.0.0-dev.9" dependencies = [ "platform-value", "platform-version", @@ -1127,7 +1127,7 @@ dependencies = [ [[package]] name = "data-contracts" -version = "1.0.0-dev.8" +version = "1.0.0-dev.9" dependencies = [ "dashpay-contract", "dpns-contract", @@ -1220,7 +1220,7 @@ checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" [[package]] name = "dpns-contract" -version = "1.0.0-dev.8" +version = "1.0.0-dev.9" dependencies = [ "platform-value", "platform-version", @@ -1230,7 +1230,7 @@ dependencies = [ [[package]] name = "dpp" -version = "1.0.0-dev.8" +version = "1.0.0-dev.9" dependencies = [ "anyhow", "async-trait", @@ -1281,7 +1281,7 @@ dependencies = [ [[package]] name = "drive" -version = "1.0.0-dev.8" +version = "1.0.0-dev.9" dependencies = [ "anyhow", "arc-swap", @@ -1318,7 +1318,7 @@ dependencies = [ [[package]] name = "drive-abci" -version = "1.0.0-dev.8" +version = "1.0.0-dev.9" dependencies = [ "arc-swap", "async-trait", @@ -1373,7 +1373,7 @@ dependencies = [ [[package]] name = "drive-proof-verifier" -version = "1.0.0-dev.8" +version = "1.0.0-dev.9" dependencies = [ "dapi-grpc", "dpp", @@ -1573,7 +1573,7 @@ checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" [[package]] name = "feature-flags-contract" -version = "1.0.0-dev.8" +version = "1.0.0-dev.9" dependencies = [ "platform-value", "platform-version", @@ -2437,7 +2437,7 @@ dependencies = [ [[package]] name = "masternode-reward-shares-contract" -version = "1.0.0-dev.8" +version = "1.0.0-dev.9" dependencies = [ "platform-value", "platform-version", @@ -2914,7 +2914,7 @@ checksum = "2900ede94e305130c13ddd391e0ab7cbaeb783945ae07a279c268cb05109c6cb" [[package]] name = "platform-serialization" -version = "1.0.0-dev.8" +version = "1.0.0-dev.9" dependencies = [ "bincode 2.0.0-rc.3", "platform-version", @@ -2922,7 +2922,7 @@ dependencies = [ [[package]] name = "platform-serialization-derive" -version = "1.0.0-dev.8" +version = "1.0.0-dev.9" dependencies = [ "proc-macro2", "quote", @@ -2932,7 +2932,7 @@ dependencies = [ [[package]] name = "platform-value" -version = "1.0.0-dev.8" +version = "1.0.0-dev.9" dependencies = [ "base64 0.13.1", "bincode 2.0.0-rc.3", @@ -2953,7 +2953,7 @@ dependencies = [ [[package]] name = "platform-value-convertible" -version = "1.0.0-dev.8" +version = "1.0.0-dev.9" dependencies = [ "quote", "syn 2.0.48", @@ -2961,14 +2961,14 @@ dependencies = [ [[package]] name = "platform-version" -version = "1.0.0-dev.8" +version = "1.0.0-dev.9" dependencies = [ "thiserror", ] [[package]] name = "platform-versioning" -version = "1.0.0-dev.8" +version = "1.0.0-dev.9" dependencies = [ "proc-macro2", "quote", @@ -3510,7 +3510,7 @@ dependencies = [ [[package]] name = "rs-dapi-client" -version = "1.0.0-dev.8" +version = "1.0.0-dev.9" dependencies = [ "backon", "chrono", @@ -3527,7 +3527,7 @@ dependencies = [ [[package]] name = "rs-sdk" -version = "1.0.0-dev.8" +version = "1.0.0-dev.9" dependencies = [ "async-trait", "base64 0.21.7", @@ -4025,7 +4025,7 @@ checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" [[package]] name = "simple-signer" -version = "1.0.0-dev.8" +version = "1.0.0-dev.9" dependencies = [ "anyhow", "bincode 2.0.0-rc.3", @@ -4116,7 +4116,7 @@ dependencies = [ [[package]] name = "strategy-tests" -version = "1.0.0-dev.8" +version = "1.0.0-dev.9" dependencies = [ "bincode 2.0.0-rc.3", "dpp", @@ -5038,7 +5038,7 @@ checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93" [[package]] name = "wasm-dpp" -version = "1.0.0-dev.8" +version = "1.0.0-dev.9" dependencies = [ "anyhow", "async-trait", @@ -5280,7 +5280,7 @@ dependencies = [ [[package]] name = "withdrawals-contract" -version = "1.0.0-dev.8" +version = "1.0.0-dev.9" dependencies = [ "num_enum", "platform-value", diff --git a/package.json b/package.json index 41569399cf..6fd706d8b3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/platform", - "version": "1.0.0-dev.8", + "version": "1.0.0-dev.9", "private": true, "scripts": { "setup": "yarn install && yarn run build && yarn run configure", diff --git a/packages/bench-suite/package.json b/packages/bench-suite/package.json index aabe097350..f1bbe641b0 100644 --- a/packages/bench-suite/package.json +++ b/packages/bench-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/bench-suite", "private": true, - "version": "1.0.0-dev.8", + "version": "1.0.0-dev.9", "description": "Dash Platform benchmark tool", "scripts": { "bench": "node ./bin/bench.js", diff --git a/packages/dapi-grpc/Cargo.toml b/packages/dapi-grpc/Cargo.toml index 6c16c32d45..55cf60954a 100644 --- a/packages/dapi-grpc/Cargo.toml +++ b/packages/dapi-grpc/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc" description = "GRPC client for Dash Platform" -version = "1.0.0-dev.8" +version = "1.0.0-dev.9" authors = [ "Samuel Westrich ", "Igor Markin ", diff --git a/packages/dapi-grpc/package.json b/packages/dapi-grpc/package.json index 0a2efa1a89..7939dcfc11 100644 --- a/packages/dapi-grpc/package.json +++ b/packages/dapi-grpc/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-grpc", - "version": "1.0.0-dev.8", + "version": "1.0.0-dev.9", "description": "DAPI GRPC definition file and generated clients", "browser": "browser.js", "main": "node.js", diff --git a/packages/dapi/package.json b/packages/dapi/package.json index b23f41fe43..e9160ab270 100644 --- a/packages/dapi/package.json +++ b/packages/dapi/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/dapi", "private": true, - "version": "1.0.0-dev.8", + "version": "1.0.0-dev.9", "description": "A decentralized API for the Dash network", "scripts": { "api": "node scripts/api.js", diff --git a/packages/dash-spv/package.json b/packages/dash-spv/package.json index c69313d61e..db6eedd1bb 100644 --- a/packages/dash-spv/package.json +++ b/packages/dash-spv/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dash-spv", - "version": "1.0.0-dev.8", + "version": "1.0.0-dev.9", "description": "Repository containing SPV functions used by @dashevo", "main": "index.js", "scripts": { diff --git a/packages/dashmate/package.json b/packages/dashmate/package.json index d344da4324..61f78ebe4e 100644 --- a/packages/dashmate/package.json +++ b/packages/dashmate/package.json @@ -1,6 +1,6 @@ { "name": "dashmate", - "version": "1.0.0-dev.8", + "version": "1.0.0-dev.9", "description": "Distribution package for Dash node installation", "scripts": { "lint": "eslint .", diff --git a/packages/dashpay-contract/Cargo.toml b/packages/dashpay-contract/Cargo.toml index 78a9823871..eb89220ff8 100644 --- a/packages/dashpay-contract/Cargo.toml +++ b/packages/dashpay-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dashpay-contract" description = "DashPay data contract schema and tools" -version = "1.0.0-dev.8" +version = "1.0.0-dev.9" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/dashpay-contract/package.json b/packages/dashpay-contract/package.json index 97e0c6bf19..e62aaed962 100644 --- a/packages/dashpay-contract/package.json +++ b/packages/dashpay-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dashpay-contract", - "version": "1.0.0-dev.8", + "version": "1.0.0-dev.9", "description": "Reference contract of the DashPay DPA on Dash Evolution", "scripts": { "lint": "eslint .", diff --git a/packages/data-contracts/Cargo.toml b/packages/data-contracts/Cargo.toml index 3733179596..3700ad2106 100644 --- a/packages/data-contracts/Cargo.toml +++ b/packages/data-contracts/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "data-contracts" description = "Dash Platform system data contracts" -version = "1.0.0-dev.8" +version = "1.0.0-dev.9" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/dpns-contract/Cargo.toml b/packages/dpns-contract/Cargo.toml index ec0235daa7..0bffd15bf6 100644 --- a/packages/dpns-contract/Cargo.toml +++ b/packages/dpns-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dpns-contract" description = "DPNS data contract schema and tools" -version = "1.0.0-dev.8" +version = "1.0.0-dev.9" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/dpns-contract/package.json b/packages/dpns-contract/package.json index 18ac712e2d..0d6f0ed447 100644 --- a/packages/dpns-contract/package.json +++ b/packages/dpns-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dpns-contract", - "version": "1.0.0-dev.8", + "version": "1.0.0-dev.9", "description": "A contract and helper scripts for DPNS DApp", "scripts": { "lint": "eslint .", diff --git a/packages/feature-flags-contract/Cargo.toml b/packages/feature-flags-contract/Cargo.toml index 2776d9a300..42d57d0d73 100644 --- a/packages/feature-flags-contract/Cargo.toml +++ b/packages/feature-flags-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "feature-flags-contract" description = "Feature flags data contract schema and tools" -version = "1.0.0-dev.8" +version = "1.0.0-dev.9" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/feature-flags-contract/package.json b/packages/feature-flags-contract/package.json index 6f78f58d04..47185c3efe 100644 --- a/packages/feature-flags-contract/package.json +++ b/packages/feature-flags-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/feature-flags-contract", - "version": "1.0.0-dev.8", + "version": "1.0.0-dev.9", "description": "Data Contract to store Dash Platform feature flags", "scripts": { "build": "", diff --git a/packages/js-dapi-client/package.json b/packages/js-dapi-client/package.json index 5508ea0b2e..99e020dfa0 100644 --- a/packages/js-dapi-client/package.json +++ b/packages/js-dapi-client/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-client", - "version": "1.0.0-dev.8", + "version": "1.0.0-dev.9", "description": "Client library used to access Dash DAPI endpoints", "main": "lib/index.js", "contributors": [ diff --git a/packages/js-dash-sdk/package.json b/packages/js-dash-sdk/package.json index a3d4f4ac1a..66bc8cd68c 100644 --- a/packages/js-dash-sdk/package.json +++ b/packages/js-dash-sdk/package.json @@ -1,6 +1,6 @@ { "name": "dash", - "version": "4.0.0-dev.8", + "version": "4.0.0-dev.9", "description": "Dash library for JavaScript/TypeScript ecosystem (Wallet, DAPI, Primitives, BLS, ...)", "main": "build/index.js", "unpkg": "dist/dash.min.js", diff --git a/packages/js-grpc-common/package.json b/packages/js-grpc-common/package.json index b44146e4fb..5de2ae9d67 100644 --- a/packages/js-grpc-common/package.json +++ b/packages/js-grpc-common/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/grpc-common", - "version": "1.0.0-dev.8", + "version": "1.0.0-dev.9", "description": "Common GRPC library", "main": "index.js", "scripts": { diff --git a/packages/masternode-reward-shares-contract/Cargo.toml b/packages/masternode-reward-shares-contract/Cargo.toml index 2a4e0d241f..42564d0e64 100644 --- a/packages/masternode-reward-shares-contract/Cargo.toml +++ b/packages/masternode-reward-shares-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "masternode-reward-shares-contract" description = "Masternode reward shares data contract schema and tools" -version = "1.0.0-dev.8" +version = "1.0.0-dev.9" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/masternode-reward-shares-contract/package.json b/packages/masternode-reward-shares-contract/package.json index fbf04cb08c..cd0ecd6451 100644 --- a/packages/masternode-reward-shares-contract/package.json +++ b/packages/masternode-reward-shares-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/masternode-reward-shares-contract", - "version": "1.0.0-dev.8", + "version": "1.0.0-dev.9", "description": "A contract and helper scripts for reward sharing", "scripts": { "lint": "eslint .", diff --git a/packages/platform-test-suite/package.json b/packages/platform-test-suite/package.json index e7df10bafe..65f634b49f 100644 --- a/packages/platform-test-suite/package.json +++ b/packages/platform-test-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/platform-test-suite", "private": true, - "version": "1.0.0-dev.8", + "version": "1.0.0-dev.9", "description": "Dash Network end-to-end tests", "scripts": { "test": "yarn exec bin/test.sh", diff --git a/packages/rs-dapi-client/Cargo.toml b/packages/rs-dapi-client/Cargo.toml index 2d161832a3..45195c7789 100644 --- a/packages/rs-dapi-client/Cargo.toml +++ b/packages/rs-dapi-client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rs-dapi-client" -version = "1.0.0-dev.8" +version = "1.0.0-dev.9" edition = "2021" [features] diff --git a/packages/rs-dapi-grpc-macros/Cargo.toml b/packages/rs-dapi-grpc-macros/Cargo.toml index 6f7e3fa786..791e6043bf 100644 --- a/packages/rs-dapi-grpc-macros/Cargo.toml +++ b/packages/rs-dapi-grpc-macros/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc-macros" -version = "1.0.0-dev.8" +version = "1.0.0-dev.9" edition = "2021" description = "Macros used by dapi-grpc. Internal use only." diff --git a/packages/rs-dpp/Cargo.toml b/packages/rs-dpp/Cargo.toml index 4540d0b63d..059fa07925 100644 --- a/packages/rs-dpp/Cargo.toml +++ b/packages/rs-dpp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dpp" -version = "1.0.0-dev.8" +version = "1.0.0-dev.9" edition = "2021" rust-version = "1.76" authors = [ diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index 2455750787..484a85c004 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drive-abci" -version = "1.0.0-dev.8" +version = "1.0.0-dev.9" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/rs-drive-proof-verifier/Cargo.toml b/packages/rs-drive-proof-verifier/Cargo.toml index df0ecb8a69..62c3deb0b7 100644 --- a/packages/rs-drive-proof-verifier/Cargo.toml +++ b/packages/rs-drive-proof-verifier/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drive-proof-verifier" -version = "1.0.0-dev.8" +version = "1.0.0-dev.9" edition = "2021" rust-version = "1.76" diff --git a/packages/rs-drive/Cargo.toml b/packages/rs-drive/Cargo.toml index b1d5c32ce5..242a33581b 100644 --- a/packages/rs-drive/Cargo.toml +++ b/packages/rs-drive/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "drive" description = "Dash drive built on top of GroveDB" -version = "1.0.0-dev.8" +version = "1.0.0-dev.9" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/rs-platform-serialization-derive/Cargo.toml b/packages/rs-platform-serialization-derive/Cargo.toml index cbeea61c47..1c0c9c6639 100644 --- a/packages/rs-platform-serialization-derive/Cargo.toml +++ b/packages/rs-platform-serialization-derive/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization-derive" authors = ["Samuel Westrich "] description = "Bincode serialization and deserialization derivations" -version = "1.0.0-dev.8" +version = "1.0.0-dev.9" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/rs-platform-serialization/Cargo.toml b/packages/rs-platform-serialization/Cargo.toml index 18dcae020d..e35dd5685b 100644 --- a/packages/rs-platform-serialization/Cargo.toml +++ b/packages/rs-platform-serialization/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization" authors = ["Samuel Westrich "] description = "Bincode based serialization and deserialization" -version = "1.0.0-dev.8" +version = "1.0.0-dev.9" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/rs-platform-value-convertible/Cargo.toml b/packages/rs-platform-value-convertible/Cargo.toml index 9e0e96e64c..ab8b546dd7 100644 --- a/packages/rs-platform-value-convertible/Cargo.toml +++ b/packages/rs-platform-value-convertible/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-value-convertible" authors = ["Samuel Westrich "] description = "Convertion to and from platform values" -version = "1.0.0-dev.8" +version = "1.0.0-dev.9" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/rs-platform-value/Cargo.toml b/packages/rs-platform-value/Cargo.toml index 4e270f9844..ef70f0f1bc 100644 --- a/packages/rs-platform-value/Cargo.toml +++ b/packages/rs-platform-value/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-value" authors = ["Samuel Westrich "] description = "A simple value module" -version = "1.0.0-dev.8" +version = "1.0.0-dev.9" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/rs-platform-version/Cargo.toml b/packages/rs-platform-version/Cargo.toml index e4a06b1371..5f28e6d3e5 100644 --- a/packages/rs-platform-version/Cargo.toml +++ b/packages/rs-platform-version/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-version" authors = ["Samuel Westrich "] description = "Bincode based serialization and deserialization" -version = "1.0.0-dev.8" +version = "1.0.0-dev.9" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/rs-platform-versioning/Cargo.toml b/packages/rs-platform-versioning/Cargo.toml index e7deb150a4..81c36d1a70 100644 --- a/packages/rs-platform-versioning/Cargo.toml +++ b/packages/rs-platform-versioning/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-versioning" authors = ["Samuel Westrich "] description = "Version derivation" -version = "1.0.0-dev.8" +version = "1.0.0-dev.9" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/rs-sdk/Cargo.toml b/packages/rs-sdk/Cargo.toml index 10ca664020..1a0acf7325 100644 --- a/packages/rs-sdk/Cargo.toml +++ b/packages/rs-sdk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rs-sdk" -version = "1.0.0-dev.8" +version = "1.0.0-dev.9" edition = "2021" [dependencies] diff --git a/packages/simple-signer/Cargo.toml b/packages/simple-signer/Cargo.toml index dfbf0796cb..302cae39b6 100644 --- a/packages/simple-signer/Cargo.toml +++ b/packages/simple-signer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "simple-signer" -version = "1.0.0-dev.8" +version = "1.0.0-dev.9" edition = "2021" rust-version = "1.76" diff --git a/packages/strategy-tests/Cargo.toml b/packages/strategy-tests/Cargo.toml index 926899b4e2..4b6edc67f7 100644 --- a/packages/strategy-tests/Cargo.toml +++ b/packages/strategy-tests/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "strategy-tests" -version = "1.0.0-dev.8" +version = "1.0.0-dev.9" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/wallet-lib/package.json b/packages/wallet-lib/package.json index da51b2879a..7724eaeda6 100644 --- a/packages/wallet-lib/package.json +++ b/packages/wallet-lib/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wallet-lib", - "version": "8.0.0-dev.8", + "version": "8.0.0-dev.9", "description": "Light wallet library for Dash", "main": "src/index.js", "unpkg": "dist/wallet-lib.min.js", diff --git a/packages/wasm-dpp/Cargo.toml b/packages/wasm-dpp/Cargo.toml index e62c5c48b1..cadcde0d0f 100644 --- a/packages/wasm-dpp/Cargo.toml +++ b/packages/wasm-dpp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasm-dpp" -version = "1.0.0-dev.8" +version = "1.0.0-dev.9" edition = "2021" rust-version = "1.76" authors = ["Anton Suprunchuk "] diff --git a/packages/wasm-dpp/package.json b/packages/wasm-dpp/package.json index c41b737317..b85ba5fde5 100644 --- a/packages/wasm-dpp/package.json +++ b/packages/wasm-dpp/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wasm-dpp", - "version": "1.0.0-dev.8", + "version": "1.0.0-dev.9", "description": "The JavaScript implementation of the Dash Platform Protocol", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/withdrawals-contract/Cargo.toml b/packages/withdrawals-contract/Cargo.toml index c91e9df05c..adc04eb28a 100644 --- a/packages/withdrawals-contract/Cargo.toml +++ b/packages/withdrawals-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "withdrawals-contract" description = "Witdrawals data contract schema and tools" -version = "1.0.0-dev.8" +version = "1.0.0-dev.9" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/withdrawals-contract/package.json b/packages/withdrawals-contract/package.json index ac825854d8..4456e402ed 100644 --- a/packages/withdrawals-contract/package.json +++ b/packages/withdrawals-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/withdrawals-contract", - "version": "1.0.0-dev.8", + "version": "1.0.0-dev.9", "description": "Data Contract to manipulate and track withdrawals", "scripts": { "build": "", From 8c47e8216be81844e8a385aeb0904bb3e3fed91c Mon Sep 17 00:00:00 2001 From: Paul DeLucia <69597248+pauldelucia@users.noreply.github.com> Date: Thu, 21 Mar 2024 00:44:16 +0700 Subject: [PATCH 106/191] fix(strategy-tests): default identity nonce and document op contract id (#1777) --- packages/strategy-tests/src/lib.rs | 50 ++++++++++++++-------- packages/strategy-tests/src/transitions.rs | 3 +- 2 files changed, 34 insertions(+), 19 deletions(-) diff --git a/packages/strategy-tests/src/lib.rs b/packages/strategy-tests/src/lib.rs index 88e2a25020..c20ab3e2cf 100644 --- a/packages/strategy-tests/src/lib.rs +++ b/packages/strategy-tests/src/lib.rs @@ -124,7 +124,7 @@ pub struct StrategyConfig { pub struct StartIdentities { pub number_of_identities: u8, pub keys_per_identity: u8, - pub starting_balances: Option, + pub starting_balances: u64, // starting balance in duffs } /// Identities to register on the first block of the strategy @@ -390,12 +390,13 @@ impl Strategy { rng: &mut StdRng, config: &StrategyConfig, platform_version: &PlatformVersion, - ) -> (Vec, Vec) { + ) -> (Vec, Vec, Vec) { let mut finalize_block_operations = vec![]; // Get identity state transitions let identity_state_transitions = match self.identity_state_transitions_for_block( block_info, + self.start_identities.starting_balances, signer, rng, create_asset_lock, @@ -405,17 +406,14 @@ impl Strategy { Ok(transitions) => transitions, Err(e) => { error!("identity_state_transitions_for_block error: {}", e); - return (vec![], finalize_block_operations); + return (vec![], finalize_block_operations, vec![]); } }; // Create state_transitions vec and identities vec based on identity_state_transitions outcome - let (mut identities, mut state_transitions): (Vec, Vec) = + let (identities, mut state_transitions): (Vec, Vec) = identity_state_transitions.into_iter().unzip(); - // Append the new identities to current_identities - current_identities.append(&mut identities); - // Do we also need to add identities to the identity_nonce_counter? // Add initial contracts for contracts_with_updates on first block of strategy @@ -460,7 +458,7 @@ impl Strategy { state_transitions.append(&mut initial_contract_update_state_transitions); } - (state_transitions, finalize_block_operations) + (state_transitions, finalize_block_operations, identities) } /// Processes strategy operations to generate state transitions specific to operations for a given block. @@ -575,16 +573,23 @@ impl Strategy { documents .into_iter() .for_each(|(document, identity, entropy)| { - let identity_contract_nonce = contract_nonce_counter - .entry((identity.id(), contract.id())) - .or_default(); + let identity_contract_nonce = if contract.owner_id() == identity.id() { + contract_nonce_counter + .entry((identity.id(), contract.id())) + .or_insert(1) + } else { + contract_nonce_counter + .entry((identity.id(), contract.id())) + .or_default() + }; + let gap = self .identity_contract_nonce_gaps .as_ref() .map_or(0, |gap_amount| gap_amount.events_if_hit(rng)) as u64; *identity_contract_nonce += 1 + gap; - + let document_create_transition: DocumentCreateTransition = DocumentCreateTransitionV0 { base: DocumentBaseTransitionV0 { @@ -1305,6 +1310,7 @@ impl Strategy { pub fn identity_state_transitions_for_block( &self, block_info: &BlockInfo, + amount: u64, signer: &mut SimpleSigner, rng: &mut StdRng, create_asset_lock: &mut impl FnMut(u64) -> Option<(AssetLockProof, PrivateKey)>, @@ -1321,6 +1327,7 @@ impl Strategy { self.start_identities.number_of_identities.into(), // number of identities self.start_identities.keys_per_identity.into(), // number of keys per identity &self.identities_inserts.extra_keys, + amount, signer, rng, create_asset_lock, @@ -1339,6 +1346,7 @@ impl Strategy { count, // number of identities self.identities_inserts.start_keys as KeyID, // number of keys per identity &self.identities_inserts.extra_keys, + 200000, // 0.002 dash signer, rng, create_asset_lock, @@ -1399,6 +1407,7 @@ impl Strategy { self.contracts_with_updates .iter_mut() .map(|(created_contract, contract_updates)| { + // Select a random identity from current_identities to be the contract owner let identity_num = rng.gen_range(0..current_identities.len()); let identity = current_identities .get(identity_num) @@ -1408,9 +1417,11 @@ impl Strategy { let contract = created_contract.data_contract_mut(); + // Get and bump the identity nonce let identity_nonce = identity_nonce_counter.entry(identity.id).or_default(); *identity_nonce += 1; + // Set the contract ID and owner ID with the random identity contract.set_owner_id(identity.id); let old_id = contract.id(); let new_id = @@ -1419,6 +1430,7 @@ impl Strategy { id_mapping.insert(old_id, new_id); // Store the mapping + // If there are contract updates, use the mapping to update their ID and owner ID too if let Some(contract_updates) = contract_updates { for (_, updated_contract) in contract_updates.iter_mut() { let updated_contract_data = updated_contract.data_contract_mut(); @@ -1433,10 +1445,12 @@ impl Strategy { // Update any document transitions that registered to the old contract id for op in self.operations.iter_mut() { if let OperationType::Document(document_op) = &mut op.op_type { - document_op.contract = contract.clone(); - let document_type = contract.document_type_cloned_for_name(document_op.document_type.name()) - .expect("Expected to get a document type for name while creating initial strategy contracts"); - document_op.document_type = document_type; + if document_op.contract.id() == old_id { + document_op.contract = contract.clone(); + let document_type = contract.document_type_cloned_for_name(document_op.document_type.name()) + .expect("Expected to get a document type for name while creating initial strategy contracts"); + document_op.document_type = document_type; + } } } @@ -1444,7 +1458,7 @@ impl Strategy { contract.clone(), *identity_nonce, &identity, - 2, // key id 1 should always be a high or critical auth key in these tests + 2, signer, platform_version, None, @@ -1708,7 +1722,7 @@ mod tests { start_identities: StartIdentities { number_of_identities: 2, keys_per_identity: 3, - starting_balances: None, + starting_balances: 100_000_000, }, identities_inserts: Default::default(), identity_contract_nonce_gaps: None, diff --git a/packages/strategy-tests/src/transitions.rs b/packages/strategy-tests/src/transitions.rs index fe2477efdf..3dcb36a224 100644 --- a/packages/strategy-tests/src/transitions.rs +++ b/packages/strategy-tests/src/transitions.rs @@ -625,6 +625,7 @@ pub fn create_identities_state_transitions( count: u16, key_count: KeyID, extra_keys: &KeyMaps, + balance: u64, signer: &mut SimpleSigner, rng: &mut StdRng, create_asset_lock: &mut impl FnMut(u64) -> Option<(AssetLockProof, PrivateKey)>, @@ -693,7 +694,7 @@ pub fn create_identities_state_transitions( }); // Attempt to create an asset lock - match create_asset_lock(200000) { + match create_asset_lock(balance) { Some((proof, private_key)) => { let pk = private_key.to_bytes(); match IdentityCreateTransition::try_from_identity_with_signer( From 4d8af752bae4eb75bce3997765dabd66c327c21d Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Thu, 21 Mar 2024 01:53:45 +0700 Subject: [PATCH 107/191] test: added a test registering many random contracts in strategy tests (#1791) --- .../tests/strategy_tests/main.rs | 97 ++++++++++++++ .../tests/strategy_tests/strategy.rs | 123 ++++++++++++++++-- packages/strategy-tests/src/lib.rs | 31 +++-- 3 files changed, 225 insertions(+), 26 deletions(-) diff --git a/packages/rs-drive-abci/tests/strategy_tests/main.rs b/packages/rs-drive-abci/tests/strategy_tests/main.rs index fb19363487..973770313a 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/main.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/main.rs @@ -111,6 +111,9 @@ mod tests { use itertools::Itertools; use tenderdash_abci::proto::abci::{RequestInfo, ResponseInfo}; + use dpp::data_contract::document_type::v0::random_document_type::{ + FieldMinMaxBounds, FieldTypeWeights, RandomDocumentTypeParameters, + }; use dpp::identity::{KeyType, Purpose, SecurityLevel}; use dpp::state_transition::StateTransition; use tenderdash_abci::Application; @@ -1229,6 +1232,100 @@ mod tests { .expect("expected to get a contract"); } + #[test] + fn run_chain_insert_one_new_identity_and_many_big_contracts() { + let strategy = NetworkStrategy { + strategy: Strategy { + contracts_with_updates: vec![], + operations: vec![Operation { + op_type: OperationType::ContractCreate( + RandomDocumentTypeParameters { + new_fields_optional_count_range: 1..30, + new_fields_required_count_range: 1..40, + new_indexes_count_range: 10..11, + field_weights: FieldTypeWeights { + string_weight: 50, + float_weight: 50, + integer_weight: 50, + date_weight: 50, + boolean_weight: 20, + byte_array_weight: 70, + }, + field_bounds: FieldMinMaxBounds { + string_min_len: 1..10, + string_has_min_len_chance: 0.5, + string_max_len: 10..63, + string_has_max_len_chance: 0.5, + integer_min: 1..10, + integer_has_min_chance: 0.5, + integer_max: 10..10000, + integer_has_max_chance: 0.5, + float_min: 0.1..10.0, + float_has_min_chance: 0.5, + float_max: 10.0..1000.0, + float_has_max_chance: 0.5, + date_min: 0, + date_max: 0, + byte_array_min_len: 1..10, + byte_array_has_min_len_chance: 0.0, + byte_array_max_len: 10..255, + byte_array_has_max_len_chance: 0.0, + }, + keep_history_chance: 1.0, + documents_mutable_chance: 1.0, + }, + 30..31, + ), + frequency: Frequency { + times_per_block_range: 30..31, + chance_per_block: None, + }, + }], + start_identities: StartIdentities::default(), + identities_inserts: IdentityInsertInfo { + frequency: Frequency { + times_per_block_range: 1..2, + chance_per_block: None, + }, + ..Default::default() + }, + + identity_contract_nonce_gaps: None, + signer: None, + }, + total_hpmns: 100, + extra_normal_mns: 0, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, + upgrading_info: None, + + proposer_strategy: Default::default(), + rotate_quorums: false, + failure_testing: None, + query_testing: None, + verify_state_transition_results: true, + ..Default::default() + }; + let config = PlatformConfig { + validator_set_quorum_size: 100, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), + execution: ExecutionConfig { + verify_sum_trees: true, + validator_set_rotation_block_count: 25, + ..Default::default() + }, + block_spacing_ms: 3000, + testing_configs: PlatformTestConfig::default_with_no_block_signing(), + ..Default::default() + }; + let mut platform = TestPlatformBuilder::new() + .with_config(config.clone()) + .build_with_mock_rpc(); + + run_chain_for_strategy(&mut platform, 30, strategy, config, 15); + } + #[test] fn run_chain_insert_one_new_identity_and_a_contract_with_updates() { let platform_version = PlatformVersion::latest(); diff --git a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs index 1835c10fb2..eb4246dbf6 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs @@ -9,12 +9,13 @@ use dpp::ProtocolError; use dpp::dashcore::secp256k1::SecretKey; use dpp::data_contract::document_type::random_document::CreateRandomDocument; -use dpp::data_contract::DataContract; +use dpp::data_contract::{DataContract, DataContractFactory}; use dpp::state_transition::identity_topup_transition::IdentityTopUpTransition; use strategy_tests::frequency::Frequency; use strategy_tests::operations::FinalizeBlockOperation::IdentityAddKeys; use strategy_tests::operations::{ - DocumentAction, DocumentOp, FinalizeBlockOperation, IdentityUpdateOp, OperationType, + DataContractUpdateAction, DataContractUpdateOp, DocumentAction, DocumentOp, + FinalizeBlockOperation, IdentityUpdateOp, OperationType, }; use dpp::document::DocumentV0Getters; @@ -46,8 +47,10 @@ use std::collections::{BTreeMap, HashMap, HashSet}; use std::str::FromStr; use tenderdash_abci::proto::abci::{ExecTxResult, ValidatorSetUpdate}; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; +use dpp::data_contract::document_type::v0::DocumentTypeV0; use dpp::identity::accessors::IdentityGettersV0; -use dpp::platform_value::BinaryData; +use dpp::platform_value::{BinaryData, Value}; +use dpp::platform_value::string_encoding::Encoding; use dpp::prelude::{Identifier, IdentityNonce}; use dpp::state_transition::documents_batch_transition::document_base_transition::v0::DocumentBaseTransitionV0; use dpp::state_transition::documents_batch_transition::document_create_transition::{DocumentCreateTransition, DocumentCreateTransitionV0}; @@ -1015,16 +1018,110 @@ impl NetworkStrategy { ); operations.push(state_transition); } - // OperationType::ContractCreate(new_fields_optional_count_range, new_fields_required_count_range, new_index_count_range, document_type_count) - // if !current_identities.is_empty() => { - // DataContract::; - // - // DocumentType::random_document() - // } - // OperationType::ContractUpdate(DataContractNewDocumentTypes(count)) - // if !current_identities.is_empty() => { - // - // } + OperationType::ContractCreate(params, doc_type_range) + if !current_identities.is_empty() => + { + let contract_factory = match DataContractFactory::new( + platform_version.protocol_version, + ) { + Ok(contract_factory) => contract_factory, + Err(e) => { + panic!("Failed to get DataContractFactory while creating random contract: {e}"); + } + }; + + // Create `count` ContractCreate transitions and push to operations vec + for _ in 0..count { + // Get the contract owner_id from loaded_identity and loaded_identity nonce + let identity = ¤t_identities[0]; + let identity_nonce = + identity_nonce_counter.entry(identity.id()).or_default(); + *identity_nonce += 1; + let owner_id = identity.id(); + + // Generate a contract id + let contract_id = DataContract::generate_data_contract_id_v0( + owner_id, + *identity_nonce, + ); + + // Create `doc_type_count` doc types + let doc_types = + Value::Map( + doc_type_range + .clone() + .filter_map(|_| match DocumentTypeV0::random_document_type( + params.clone(), + contract_id, + rng, + platform_version, + ) { + Ok(new_document_type) => { + let mut doc_type_clone = + new_document_type.schema().clone(); + let name = doc_type_clone.remove("title").expect( + "Expected to get a doc type title in ContractCreate", + ); + Some(( + Value::Text(name.to_string()), + doc_type_clone, + )) + } + Err(e) => { + panic!( + "Error generating random document type: {:?}", + e + ); + } + }) + .collect(), + ); + + let created_data_contract = match contract_factory.create( + owner_id, + *identity_nonce, + doc_types, + None, + None, + ) { + Ok(contract) => contract, + Err(e) => { + panic!("Failed to create random data contract: {e}"); + } + }; + + let transition = match contract_factory + .create_data_contract_create_transition(created_data_contract) + { + Ok(transition) => transition, + Err(e) => { + panic!("Failed to create ContractCreate transition: {e}"); + } + }; + + // Sign transition + let public_key = identity + .get_first_public_key_matching( + Purpose::AUTHENTICATION, + HashSet::from([SecurityLevel::CRITICAL]), + HashSet::from([KeyType::ECDSA_SECP256K1]), + ) + .expect("Expected to get identity public key in ContractCreate"); + let mut state_transition = + StateTransition::DataContractCreate(transition); + if let Err(e) = state_transition.sign_external( + public_key, + signer, + None::< + fn(Identifier, String) -> Result, + >, + ) { + panic!("Error signing state transition: {:?}", e); + } + + operations.push(state_transition); + } + } _ => {} } } diff --git a/packages/strategy-tests/src/lib.rs b/packages/strategy-tests/src/lib.rs index c20ab3e2cf..2b025e8d2e 100644 --- a/packages/strategy-tests/src/lib.rs +++ b/packages/strategy-tests/src/lib.rs @@ -390,7 +390,11 @@ impl Strategy { rng: &mut StdRng, config: &StrategyConfig, platform_version: &PlatformVersion, - ) -> (Vec, Vec, Vec) { + ) -> ( + Vec, + Vec, + Vec, + ) { let mut finalize_block_operations = vec![]; // Get identity state transitions @@ -573,23 +577,24 @@ impl Strategy { documents .into_iter() .for_each(|(document, identity, entropy)| { - let identity_contract_nonce = if contract.owner_id() == identity.id() { - contract_nonce_counter - .entry((identity.id(), contract.id())) - .or_insert(1) - } else { - contract_nonce_counter - .entry((identity.id(), contract.id())) - .or_default() - }; - + let identity_contract_nonce = + if contract.owner_id() == identity.id() { + contract_nonce_counter + .entry((identity.id(), contract.id())) + .or_insert(1) + } else { + contract_nonce_counter + .entry((identity.id(), contract.id())) + .or_default() + }; + let gap = self .identity_contract_nonce_gaps .as_ref() .map_or(0, |gap_amount| gap_amount.events_if_hit(rng)) as u64; *identity_contract_nonce += 1 + gap; - + let document_create_transition: DocumentCreateTransition = DocumentCreateTransitionV0 { base: DocumentBaseTransitionV0 { @@ -1449,7 +1454,7 @@ impl Strategy { document_op.contract = contract.clone(); let document_type = contract.document_type_cloned_for_name(document_op.document_type.name()) .expect("Expected to get a document type for name while creating initial strategy contracts"); - document_op.document_type = document_type; + document_op.document_type = document_type; } } } From 15824588b0e8068329ec54fad63da293f53e3293 Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Thu, 21 Mar 2024 20:03:48 +0700 Subject: [PATCH 108/191] fix(platform)!: max state transition size (#1792) --- ...tate_transition_max_size_exceeded_error.rs | 20 +++++++------- .../src/abci/handler/prepare_proposal.rs | 7 ++++- .../src/execution/check_tx/v0/mod.rs | 27 +++++++++++++++++++ .../process_raw_state_transitions/v0/mod.rs | 27 +++++++++++++++++++ .../contract/apply/apply_contract/v0/mod.rs | 11 ++++++++ .../contract/insert/insert_contract/v0/mod.rs | 15 ++++++++++- packages/rs-drive/src/error/contract.rs | 4 +++ .../src/version/dpp_versions.rs | 5 ++++ .../src/version/mocks/v2_test.rs | 2 ++ .../src/version/mocks/v3_test.rs | 2 ++ .../rs-platform-version/src/version/v1.rs | 2 ++ ...tate_transition_max_size_exceeded_error.rs | 12 ++++----- 12 files changed, 116 insertions(+), 18 deletions(-) diff --git a/packages/rs-dpp/src/errors/consensus/basic/state_transition/state_transition_max_size_exceeded_error.rs b/packages/rs-dpp/src/errors/consensus/basic/state_transition/state_transition_max_size_exceeded_error.rs index 8de34c07cd..8d33a1999d 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/state_transition/state_transition_max_size_exceeded_error.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/state_transition/state_transition_max_size_exceeded_error.rs @@ -8,7 +8,7 @@ use thiserror::Error; #[derive( Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, )] -#[error("State transition size {actual_size_kbytes} KB is more than maximum {max_size_kbytes} KB")] +#[error("State transition size {actual_size_bytes} is more than maximum {max_size_bytes}")] #[platform_serialize(unversioned)] pub struct StateTransitionMaxSizeExceededError { /* @@ -16,23 +16,23 @@ pub struct StateTransitionMaxSizeExceededError { DO NOT CHANGE ORDER OF FIELDS WITHOUT INTRODUCING OF NEW VERSION */ - actual_size_kbytes: usize, - max_size_kbytes: usize, + actual_size_bytes: u64, + max_size_bytes: u64, } impl StateTransitionMaxSizeExceededError { - pub fn new(actual_size_kbytes: usize, max_size_kbytes: usize) -> Self { + pub fn new(actual_size_bytes: u64, max_size_bytes: u64) -> Self { Self { - actual_size_kbytes, - max_size_kbytes, + actual_size_bytes, + max_size_bytes, } } - pub fn actual_size_kbytes(&self) -> usize { - self.actual_size_kbytes + pub fn actual_size_bytes(&self) -> u64 { + self.actual_size_bytes } - pub fn max_size_kbytes(&self) -> usize { - self.max_size_kbytes + pub fn max_size_bytes(&self) -> u64 { + self.max_size_bytes } } diff --git a/packages/rs-drive-abci/src/abci/handler/prepare_proposal.rs b/packages/rs-drive-abci/src/abci/handler/prepare_proposal.rs index ccffb85a98..e05a33ffca 100644 --- a/packages/rs-drive-abci/src/abci/handler/prepare_proposal.rs +++ b/packages/rs-drive-abci/src/abci/handler/prepare_proposal.rs @@ -207,8 +207,13 @@ where valid_tx_count, delayed_tx_count, failed_tx_count, - "Prepared proposal with {} transitions for height: {}, round: {} in {} ms", + "Prepared proposal with {} transition{} for height: {}, round: {} in {} ms", valid_tx_count + invalid_paid_tx_count, + if valid_tx_count + invalid_paid_tx_count > 0 { + "s" + } else { + "" + }, request.height, request.round, elapsed_time_ms, diff --git a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs index 5914b0f48c..241eaa7726 100644 --- a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs @@ -11,6 +11,7 @@ use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::rpc::core::CoreRPCLike; use dpp::consensus::basic::decode::SerializedObjectParsingError; +use dpp::consensus::basic::state_transition::StateTransitionMaxSizeExceededError; use dpp::consensus::basic::BasicError; use dpp::consensus::ConsensusError; @@ -93,6 +94,32 @@ where platform_state: &PlatformState, platform_version: &PlatformVersion, ) -> Result, Error> { + if raw_tx.len() as u64 + > platform_version + .dpp + .state_transitions + .max_state_transition_size + { + // The state transition is too big + let consensus_error = + ConsensusError::BasicError(BasicError::StateTransitionMaxSizeExceededError( + StateTransitionMaxSizeExceededError::new( + raw_tx.len() as u64, + platform_version + .dpp + .state_transitions + .max_state_transition_size, + ), + )); + tracing::debug!( + ?consensus_error, + "State transition too big on check tx (starts with {})", + hex::encode(raw_tx.split_at(80).0) + ); + + return Ok(ValidationResult::new_with_error(consensus_error)); + } + let state_transition = match StateTransition::deserialize_from_bytes(raw_tx) { Ok(state_transition) => state_transition, Err(err) => { diff --git a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_raw_state_transitions/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_raw_state_transitions/v0/mod.rs index 3acf5fb487..42f5e6cb5d 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_raw_state_transitions/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_raw_state_transitions/v0/mod.rs @@ -5,6 +5,9 @@ use crate::platform_types::platform_state::PlatformState; use crate::rpc::core::CoreRPCLike; use dpp::block::block_info::BlockInfo; use dpp::consensus::basic::decode::SerializedObjectParsingError; +use dpp::consensus::basic::state_transition::StateTransitionMaxSizeExceededError; +use dpp::consensus::basic::BasicError; +use dpp::consensus::ConsensusError; use dpp::dashcore::hashes::Hash; use dpp::fee::fee_result::FeeResult; use dpp::identity::state_transition::OptionallyAssetLockProved; @@ -111,6 +114,30 @@ where transaction: &Transaction, platform_version: &PlatformVersion, ) -> Result { + if raw_state_transition.len() as u64 + > platform_version + .dpp + .state_transitions + .max_state_transition_size + { + // The state transition is too big + let consensus_error = + ConsensusError::BasicError(BasicError::StateTransitionMaxSizeExceededError( + StateTransitionMaxSizeExceededError::new( + raw_state_transition.len() as u64, + platform_version + .dpp + .state_transitions + .max_state_transition_size, + ), + )); + tracing::debug!(?consensus_error, "State transition too big",); + + return Ok(StateTransitionExecutionResult::UnpaidConsensusError( + consensus_error, + )); + } + // Tenderdash hex-encoded ST hash let mut st_hash = String::new(); if tracing::enabled!(tracing::Level::DEBUG) { diff --git a/packages/rs-drive/src/drive/contract/apply/apply_contract/v0/mod.rs b/packages/rs-drive/src/drive/contract/apply/apply_contract/v0/mod.rs index d29f0e9a8b..75f8fa5af9 100644 --- a/packages/rs-drive/src/drive/contract/apply/apply_contract/v0/mod.rs +++ b/packages/rs-drive/src/drive/contract/apply/apply_contract/v0/mod.rs @@ -7,6 +7,7 @@ use dpp::data_contract::DataContract; use dpp::fee::fee_result::FeeResult; use dpp::serialization::PlatformSerializableWithPlatformVersion; +use crate::error::contract::DataContractError; use dpp::version::PlatformVersion; use grovedb::batch::KeyInfoPath; use grovedb::{EstimatedLayerInformation, TransactionArg}; @@ -76,6 +77,16 @@ impl Drive { let serialized_contract = contract .serialize_to_bytes_with_platform_version(platform_version) .map_err(Error::Protocol)?; + + if serialized_contract.len() as u64 > u32::MAX as u64 + || serialized_contract.len() as u32 + > platform_version.dpp.contract_versions.max_serialized_size + { + // This should normally be caught by DPP, but there is a rare possibility that the + // re-serialized size is bigger than the original serialized data contract. + return Err(Error::DataContract(DataContractError::ContractTooBig(format!("Trying to insert a data contract of size {} that is over the max allowed insertion size {}", serialized_contract.len(), platform_version.dpp.contract_versions.max_serialized_size)))); + } + self.apply_contract_with_serialization_operations( contract, serialized_contract, diff --git a/packages/rs-drive/src/drive/contract/insert/insert_contract/v0/mod.rs b/packages/rs-drive/src/drive/contract/insert/insert_contract/v0/mod.rs index 8233b88b3b..c71032de1c 100644 --- a/packages/rs-drive/src/drive/contract/insert/insert_contract/v0/mod.rs +++ b/packages/rs-drive/src/drive/contract/insert/insert_contract/v0/mod.rs @@ -15,6 +15,7 @@ use dpp::fee::fee_result::FeeResult; use dpp::data_contract::document_type::methods::DocumentTypeV0Methods; use dpp::serialization::PlatformSerializableWithPlatformVersion; +use crate::error::contract::DataContractError; use dpp::version::PlatformVersion; use grovedb::batch::KeyInfoPath; use grovedb::{Element, EstimatedLayerInformation, TransactionArg}; @@ -41,8 +42,20 @@ impl Drive { None }; + let serialized_contract = + contract.serialize_to_bytes_with_platform_version(platform_version)?; + + if serialized_contract.len() as u64 > u32::MAX as u64 + || serialized_contract.len() as u32 + > platform_version.dpp.contract_versions.max_serialized_size + { + // This should normally be caught by DPP, but there is a rare possibility that the + // re-serialized size is bigger than the original serialized data contract. + return Err(Error::DataContract(DataContractError::ContractTooBig(format!("Trying to insert a data contract of size {} that is over the max allowed insertion size {}", serialized_contract.len(), platform_version.dpp.contract_versions.max_serialized_size)))); + } + let contract_element = Element::Item( - contract.serialize_to_bytes_with_platform_version(platform_version)?, + serialized_contract, StorageFlags::map_to_some_element_flags(storage_flags.as_ref()), ); diff --git a/packages/rs-drive/src/error/contract.rs b/packages/rs-drive/src/error/contract.rs index b947149bda..ef08a8f961 100644 --- a/packages/rs-drive/src/error/contract.rs +++ b/packages/rs-drive/src/error/contract.rs @@ -12,4 +12,8 @@ pub enum DataContractError { /// Data contract missing or cannot be retrieved #[error("data contract cannot be retrieved: {0}")] MissingContract(String), + + /// Data contract storage error when data contract is too big + #[error("data contract is too big to be stored: {0}")] + ContractTooBig(String), } diff --git a/packages/rs-platform-version/src/version/dpp_versions.rs b/packages/rs-platform-version/src/version/dpp_versions.rs index f1af570e6c..7aaf7e48a5 100644 --- a/packages/rs-platform-version/src/version/dpp_versions.rs +++ b/packages/rs-platform-version/src/version/dpp_versions.rs @@ -16,6 +16,7 @@ pub struct DPPVersion { #[derive(Clone, Debug, Default)] pub struct StateTransitionVersions { + pub max_state_transition_size: u64, pub documents: DocumentTransitionVersions, pub identities: IdentityTransitionVersions, } @@ -130,6 +131,10 @@ pub struct DocumentFeatureVersionBounds { #[derive(Clone, Debug, Default)] pub struct ContractVersions { + /// The maximum that we can store a data contract in the state. There is a possibility that a client + /// sends a state transition serialized in a specific version and that the system re-serializes it + /// to the current version, and in so doing increases it's size. + pub max_serialized_size: u32, /// This is how we serialize and deserialize a contract pub contract_serialization_version: FeatureVersionBounds, /// This is the structure of the Contract as it is defined for code paths diff --git a/packages/rs-platform-version/src/version/mocks/v2_test.rs b/packages/rs-platform-version/src/version/mocks/v2_test.rs index 165d6c4977..8f7f572172 100644 --- a/packages/rs-platform-version/src/version/mocks/v2_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v2_test.rs @@ -897,6 +897,7 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { }, }, state_transitions: StateTransitionVersions { + max_state_transition_size: 20000, documents: DocumentTransitionVersions { documents_batch_transition: DocumentsBatchTransitionVersions { validation: DocumentsBatchTransitionValidationVersions { @@ -914,6 +915,7 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { }, }, contract_versions: ContractVersions { + max_serialized_size: 65000, contract_serialization_version: FeatureVersionBounds { min_version: 0, max_version: 0, diff --git a/packages/rs-platform-version/src/version/mocks/v3_test.rs b/packages/rs-platform-version/src/version/mocks/v3_test.rs index c2804c84eb..9e794e3cda 100644 --- a/packages/rs-platform-version/src/version/mocks/v3_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v3_test.rs @@ -897,6 +897,7 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { }, }, state_transitions: StateTransitionVersions { + max_state_transition_size: 20000, documents: DocumentTransitionVersions { documents_batch_transition: DocumentsBatchTransitionVersions { validation: DocumentsBatchTransitionValidationVersions { @@ -914,6 +915,7 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { }, }, contract_versions: ContractVersions { + max_serialized_size: 65000, contract_serialization_version: FeatureVersionBounds { min_version: 0, max_version: 0, diff --git a/packages/rs-platform-version/src/version/v1.rs b/packages/rs-platform-version/src/version/v1.rs index 07a10eb62b..f89e00da7c 100644 --- a/packages/rs-platform-version/src/version/v1.rs +++ b/packages/rs-platform-version/src/version/v1.rs @@ -894,6 +894,7 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { }, }, state_transitions: StateTransitionVersions { + max_state_transition_size: 20000, documents: DocumentTransitionVersions { documents_batch_transition: DocumentsBatchTransitionVersions { validation: DocumentsBatchTransitionValidationVersions { @@ -911,6 +912,7 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { }, }, contract_versions: ContractVersions { + max_serialized_size: 65000, contract_serialization_version: FeatureVersionBounds { min_version: 0, max_version: 0, diff --git a/packages/wasm-dpp/src/errors/consensus/basic/state_transition/state_transition_max_size_exceeded_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/state_transition/state_transition_max_size_exceeded_error.rs index d8607ff919..ac0f5a009d 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/state_transition/state_transition_max_size_exceeded_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/state_transition/state_transition_max_size_exceeded_error.rs @@ -17,14 +17,14 @@ impl From<&StateTransitionMaxSizeExceededError> for StateTransitionMaxSizeExceed #[wasm_bindgen(js_class=StateTransitionMaxSizeExceededError)] impl StateTransitionMaxSizeExceededErrorWasm { - #[wasm_bindgen(js_name=getActualSizeKBytes)] - pub fn get_actual_size_kbytes(&self) -> usize { - self.inner.actual_size_kbytes() + #[wasm_bindgen(js_name=getActualSizeBytes)] + pub fn get_actual_size_bytes(&self) -> u64 { + self.inner.actual_size_bytes() } - #[wasm_bindgen(js_name=getMaxSizeKBytes)] - pub fn get_max_size_kbytes(&self) -> usize { - self.inner.max_size_kbytes() + #[wasm_bindgen(js_name=getMaxSizeBytes)] + pub fn get_max_size_bytes(&self) -> u64 { + self.inner.max_size_bytes() } #[wasm_bindgen(js_name=getCode)] From d672ed85851f661a61bbd261ddd7049b808d418d Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Fri, 22 Mar 2024 04:15:24 +0700 Subject: [PATCH 109/191] perf(platform)!: use inline on versioned functions (#1793) --- .../methods/validate_config_update/v0/mod.rs | 1 + .../rs-dpp/src/data_contract/config/v0/mod.rs | 1 + .../methods/validate_update/v0/mod.rs | 1 + .../schema/enrich_with_base_schema/v0/mod.rs | 3 +- .../v0/mod.rs | 2 + .../v0/mod.rs | 3 +- .../v0/mod.rs | 3 +- .../traversal_validator/v0/mod.rs | 3 +- .../schema/validate_max_depth/v0/mod.rs | 3 +- .../methods/validation/v0/mod.rs | 2 + .../methods/create_basic_identity/v0/mod.rs | 1 + .../v0/mod.rs | 3 +- .../validate_base_structure/v0/mod.rs | 1 + .../duplicated_key_ids_witness/v0/mod.rs | 1 + .../methods/duplicated_keys_witness/v0/mod.rs | 1 + .../v0/mod.rs | 1 + .../methods/hash/v0/mod.rs | 1 + .../v0/mod.rs | 1 + .../v0/mod.rs | 1 + .../methods/compile/v0/mod.rs | 2 + .../methods/new/v0/mod.rs | 1 + .../methods/validate/v0/mod.rs | 1 + .../block_end/update_drive_cache/v0/mod.rs | 1 + .../block_end/update_state_cache/v0/mod.rs | 1 + .../block_end/validator_set_update/v0/mod.rs | 1 + .../v0/mod.rs | 1 + .../process_block_fees/v0/mod.rs | 1 + .../clear_drive_block_cache/v0/mod.rs | 1 + .../update_core_info/v0/mod.rs | 1 + .../create_operator_identity/v0/mod.rs | 1 + .../verify_chain_lock_locally/v0/mod.rs | 3 +- .../verify_chain_lock_through_core/v0/mod.rs | 3 +- .../v0/mod.rs | 2 +- .../v0/mod.rs | 4 +- .../create_genesis_state/v0/mod.rs | 3 +- .../data_triggers/bindings/list/v0/mod.rs | 3 +- .../data_triggers/triggers/dashpay/v0/mod.rs | 3 +- .../data_triggers/triggers/dpns/v0/mod.rs | 3 +- .../triggers/feature_flags/v0/mod.rs | 3 +- .../data_triggers/triggers/reject/v0/mod.rs | 3 +- .../triggers/withdrawals/v0/mod.rs | 3 +- .../rs-drive-abci/src/test/helpers/setup.rs | 2 +- .../tests/strategy_tests/strategy.rs | 4 +- .../balances/add_to_system_credits/v0/mod.rs | 1 + .../v0/mod.rs | 1 + .../calculate_total_credits_balance/v0/mod.rs | 1 + .../remove_from_system_credits/v0/mod.rs | 1 + .../v0/mod.rs | 1 + .../apply_drive_operations/v0/mod.rs | 1 + .../v0/mod.rs | 1 + .../contract/apply/apply_contract/v0/mod.rs | 2 + .../v0/mod.rs | 2 + .../v0/mod.rs | 1 + .../get_fetch/fetch_contract/v0/mod.rs | 2 + .../fetch_contract_with_history/v0/mod.rs | 1 + .../v0/mod.rs | 1 + .../get_contract_with_fetch_info/v0/mod.rs | 3 + .../get_contracts_with_fetch_info/v0/mod.rs | 1 + .../insert/add_contract_to_storage/v0/mod.rs | 1 + .../contract/insert/insert_contract/v0/mod.rs | 2 + .../contract/prove/prove_contract/v0/mod.rs | 1 + .../prove/prove_contract_history/v0/mod.rs | 1 + .../contract/prove/prove_contracts/v0/mod.rs | 1 + .../contract/update/update_contract/v0/mod.rs | 3 + .../get_unpaid_epoch_index/mod.rs | 32 +++++ .../get_unpaid_epoch_index/v0/mod.rs | 125 ++++++++++++++++++ .../drive/credit_pools/unpaid_epoch/mod.rs | 125 +----------------- .../delete_document_for_contract/v0/mod.rs | 1 + .../v0/mod.rs | 1 + .../delete_document_for_contract_id/v0/mod.rs | 1 + .../v0/mod.rs | 1 + .../v0/mod.rs | 1 + .../v0/mod.rs | 1 + .../v0/mod.rs | 1 + .../v0/mod.rs | 1 + .../v0/mod.rs | 3 +- .../v0/mod.rs | 1 + .../v0/mod.rs | 1 + .../v0/mod.rs | 1 + .../v0/mod.rs | 1 + .../validate_uniqueness_of_data/v0/mod.rs | 1 + .../v0/mod.rs | 1 + .../v0/mod.rs | 1 + .../validate_document_uniqueness/v0/mod.rs | 1 + .../document/insert/add_document/v0/mod.rs | 1 + .../add_document_for_contract/v0/mod.rs | 1 + .../v0/mod.rs | 1 + .../v0/mod.rs | 1 + .../v0/mod.rs | 1 + .../v0/mod.rs | 1 + .../document/query/query_documents/v0/mod.rs | 1 + .../update_document_for_contract/v0/mod.rs | 1 + .../update_document_for_contract_id/v0/mod.rs | 1 + .../v0/mod.rs | 1 + .../src/drive/fee/calculate_fee/v0/mod.rs | 3 +- .../fetch_all_current_identity_keys/v0/mod.rs | 1 + .../fetch/fetch_all_identity_keys/v0/mod.rs | 2 + .../fetch/fetch_identities_all_keys/v0/mod.rs | 1 + .../insert/insert_key_to_storage/v0/mod.rs | 1 + .../insert/insert_new_unique_key/v0/mod.rs | 1 + .../prove/prove_identities_all_keys/v0/mod.rs | 1 + .../key/prove/prove_identity_keys/v0/mod.rs | 1 + .../add_new_keys_to_identity/v0/mod.rs | 3 +- .../v0/mod.rs | 3 +- .../add_new_unique_keys_to_identity/v0/mod.rs | 3 +- .../methods/add_to_identity_balance/v0/mod.rs | 6 +- .../v0/mod.rs | 3 +- .../methods/disable_identity_keys/v0/mod.rs | 3 +- .../methods/merge_identity_nonce/v0/mod.rs | 3 +- .../methods/re_enable_identity_keys/v0/mod.rs | 3 +- .../update_identity_revision/v0/mod.rs | 3 +- .../merge_identity_nonce_operations/v0/mod.rs | 36 ++--- .../src/drive/prove/prove_multiple/v0/mod.rs | 1 + .../for_total_system_credits_update/v0/mod.rs | 1 + .../fetch_next_protocol_version/v0/mod.rs | 1 + .../v0/mod.rs | 1 + .../verify/contract/verify_contract/v0/mod.rs | 1 + .../verify_contract_history/v0/mod.rs | 1 + .../verify/document/verify_proof/v0/mod.rs | 1 + .../verify_proof_keep_serialized/v0/mod.rs | 1 + .../v0/mod.rs | 1 + .../v0/mod.rs | 1 + .../v0/mod.rs | 1 + .../v0/mod.rs | 1 + .../v0/mod.rs | 1 + .../single_document/verify_proof/v0/mod.rs | 1 + .../verify_proof_keep_serialized/v0/mod.rs | 1 + .../v0/mod.rs | 1 + .../system/verify_epoch_infos/v0/mod.rs | 1 + .../system/verify_upgrade_state/v0/mod.rs | 1 + .../verify_upgrade_vote_status/v0/mod.rs | 1 + .../src/version/drive_versions.rs | 6 + .../src/version/mocks/v2_test.rs | 23 ++-- .../src/version/mocks/v3_test.rs | 23 ++-- .../rs-platform-version/src/version/v1.rs | 23 ++-- 135 files changed, 390 insertions(+), 205 deletions(-) create mode 100644 packages/rs-drive/src/drive/credit_pools/unpaid_epoch/get_unpaid_epoch_index/mod.rs create mode 100644 packages/rs-drive/src/drive/credit_pools/unpaid_epoch/get_unpaid_epoch_index/v0/mod.rs diff --git a/packages/rs-dpp/src/data_contract/config/methods/validate_config_update/v0/mod.rs b/packages/rs-dpp/src/data_contract/config/methods/validate_config_update/v0/mod.rs index e0217a46d8..0003e220b1 100644 --- a/packages/rs-dpp/src/data_contract/config/methods/validate_config_update/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/config/methods/validate_config_update/v0/mod.rs @@ -6,6 +6,7 @@ use crate::validation::SimpleConsensusValidationResult; use platform_value::Identifier; impl DataContractConfig { + #[inline(always)] pub(super) fn validate_config_update_v0( &self, new_config: &DataContractConfig, diff --git a/packages/rs-dpp/src/data_contract/config/v0/mod.rs b/packages/rs-dpp/src/data_contract/config/v0/mod.rs index e4d6eb9c98..35734a01e5 100644 --- a/packages/rs-dpp/src/data_contract/config/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/config/v0/mod.rs @@ -134,6 +134,7 @@ impl DataContractConfigV0 { /// /// * `Result`: On success, a ContractConfig. /// On failure, a ProtocolError. + #[inline(always)] pub(super) fn get_contract_configuration_properties_v0( contract: &BTreeMap, ) -> Result { diff --git a/packages/rs-dpp/src/data_contract/document_type/methods/validate_update/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/methods/validate_update/v0/mod.rs index 5dcbc9bd3b..d9be23bd2d 100644 --- a/packages/rs-dpp/src/data_contract/document_type/methods/validate_update/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/methods/validate_update/v0/mod.rs @@ -4,6 +4,7 @@ use crate::data_contract::document_type::{DocumentType, DocumentTypeRef}; use crate::validation::SimpleConsensusValidationResult; impl<'a> DocumentTypeRef<'a> { + #[inline(always)] pub(super) fn validate_update_v0( &self, new_document_type: &DocumentType, diff --git a/packages/rs-dpp/src/data_contract/document_type/schema/enrich_with_base_schema/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/schema/enrich_with_base_schema/v0/mod.rs index 74401626f3..ea4066ebbd 100644 --- a/packages/rs-dpp/src/data_contract/document_type/schema/enrich_with_base_schema/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/schema/enrich_with_base_schema/v0/mod.rs @@ -10,7 +10,8 @@ pub const PROPERTY_SCHEMA: &str = "$schema"; const TIMESTAMPS: [&str; 2] = ["$createdAt", "$updatedAt"]; -pub fn enrich_with_base_schema_v0( +#[inline(always)] +pub(super) fn enrich_with_base_schema_v0( mut schema: Value, schema_defs: Option, ) -> Result { diff --git a/packages/rs-dpp/src/data_contract/document_type/schema/find_identifier_and_binary_paths/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/schema/find_identifier_and_binary_paths/v0/mod.rs index 865662bf41..35fb76650d 100644 --- a/packages/rs-dpp/src/data_contract/document_type/schema/find_identifier_and_binary_paths/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/schema/find_identifier_and_binary_paths/v0/mod.rs @@ -6,12 +6,14 @@ use indexmap::IndexMap; use std::collections::BTreeSet; impl DocumentTypeV0 { + #[inline(always)] pub(super) fn find_identifier_and_binary_paths_v0( properties: &IndexMap, ) -> (BTreeSet, BTreeSet) { Self::find_identifier_and_binary_paths_inner(properties, "") } + #[inline(always)] fn find_identifier_and_binary_paths_inner( properties: &IndexMap, current_path: &str, diff --git a/packages/rs-dpp/src/data_contract/document_type/schema/recursive_schema_validator/byte_array_has_no_items_as_parent_validator/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/schema/recursive_schema_validator/byte_array_has_no_items_as_parent_validator/v0/mod.rs index 1cdde43291..40d97cbfd4 100644 --- a/packages/rs-dpp/src/data_contract/document_type/schema/recursive_schema_validator/byte_array_has_no_items_as_parent_validator/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/schema/recursive_schema_validator/byte_array_has_no_items_as_parent_validator/v0/mod.rs @@ -5,7 +5,8 @@ use crate::consensus::ConsensusError; use crate::validation::SimpleConsensusValidationResult; use platform_value::Value; -pub fn byte_array_has_no_items_as_parent_validator_v0( +#[inline(always)] +pub(super) fn byte_array_has_no_items_as_parent_validator_v0( path: &str, key: &str, parent: &Value, diff --git a/packages/rs-dpp/src/data_contract/document_type/schema/recursive_schema_validator/pattern_is_valid_regex_validator/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/schema/recursive_schema_validator/pattern_is_valid_regex_validator/v0/mod.rs index 523de0662f..111c54f6ab 100644 --- a/packages/rs-dpp/src/data_contract/document_type/schema/recursive_schema_validator/pattern_is_valid_regex_validator/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/schema/recursive_schema_validator/pattern_is_valid_regex_validator/v0/mod.rs @@ -3,7 +3,8 @@ use crate::validation::SimpleConsensusValidationResult; use platform_value::Value; use regex::Regex; -pub fn pattern_is_valid_regex_validator_v0( +#[inline(always)] +pub(super) fn pattern_is_valid_regex_validator_v0( path: &str, key: &str, _parent: &Value, diff --git a/packages/rs-dpp/src/data_contract/document_type/schema/recursive_schema_validator/traversal_validator/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/schema/recursive_schema_validator/traversal_validator/v0/mod.rs index e4acc21e95..5e4891d5c1 100644 --- a/packages/rs-dpp/src/data_contract/document_type/schema/recursive_schema_validator/traversal_validator/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/schema/recursive_schema_validator/traversal_validator/v0/mod.rs @@ -15,7 +15,8 @@ pub type SubValidator = fn( platform_version: &PlatformVersion, ) -> Result<(), ProtocolError>; -pub fn traversal_validator_v0( +#[inline(always)] +pub(super) fn traversal_validator_v0( raw_data_contract: &Value, validators: &[SubValidator], platform_version: &PlatformVersion, diff --git a/packages/rs-dpp/src/data_contract/document_type/schema/validate_max_depth/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/schema/validate_max_depth/v0/mod.rs index 621d0e8f57..014cf6a896 100644 --- a/packages/rs-dpp/src/data_contract/document_type/schema/validate_max_depth/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/schema/validate_max_depth/v0/mod.rs @@ -9,7 +9,8 @@ use crate::validation::SimpleConsensusValidationResult; const MAX_DEPTH: usize = 500; -pub fn validate_max_depth_v0(value: &Value) -> SimpleConsensusValidationResult { +#[inline(always)] +pub(super) fn validate_max_depth_v0(value: &Value) -> SimpleConsensusValidationResult { let mut result = SimpleConsensusValidationResult::default(); let schema_depth = match calculate_max_depth(value) { Ok(depth) => depth, diff --git a/packages/rs-dpp/src/data_contract/methods/validation/v0/mod.rs b/packages/rs-dpp/src/data_contract/methods/validation/v0/mod.rs index 4b1791ac2b..847d1399a6 100644 --- a/packages/rs-dpp/src/data_contract/methods/validation/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/methods/validation/v0/mod.rs @@ -31,6 +31,7 @@ pub trait DataContractValidationMethodsV0 { } impl DataContract { + #[inline(always)] pub(super) fn validate_document_properties_v0( &self, name: &str, @@ -75,6 +76,7 @@ impl DataContract { } // TODO: Move to document + #[inline(always)] pub(super) fn validate_document_v0( &self, name: &str, diff --git a/packages/rs-dpp/src/identity/methods/create_basic_identity/v0/mod.rs b/packages/rs-dpp/src/identity/methods/create_basic_identity/v0/mod.rs index a385272e66..a9a5f170b7 100644 --- a/packages/rs-dpp/src/identity/methods/create_basic_identity/v0/mod.rs +++ b/packages/rs-dpp/src/identity/methods/create_basic_identity/v0/mod.rs @@ -4,6 +4,7 @@ use platform_value::Identifier; use std::collections::BTreeMap; impl Identity { + #[inline(always)] pub(super) fn create_basic_identity_v0(id: [u8; 32]) -> Self { IdentityV0 { id: Identifier::new(id), diff --git a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/validate_asset_lock_transaction_structure/v0/mod.rs b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/validate_asset_lock_transaction_structure/v0/mod.rs index 0a3bb4b1b2..40ff3c1949 100644 --- a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/validate_asset_lock_transaction_structure/v0/mod.rs +++ b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/validate_asset_lock_transaction_structure/v0/mod.rs @@ -8,7 +8,8 @@ use dashcore::transaction::special_transaction::TransactionPayload; use dashcore::Transaction; /// Validates asset lock transaction structure -pub fn validate_asset_lock_transaction_structure_v0( +#[inline(always)] +pub(super) fn validate_asset_lock_transaction_structure_v0( transaction: &Transaction, output_index: u32, ) -> Result { diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/validate_base_structure/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/validate_base_structure/v0/mod.rs index cd14fe19a6..5dd1ad582e 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/validate_base_structure/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/validate_base_structure/v0/mod.rs @@ -22,6 +22,7 @@ use std::collections::BTreeMap; const MAX_TRANSITIONS_IN_BATCH: usize = 1; impl DocumentsBatchTransition { + #[inline(always)] pub(super) fn validate_base_structure_v0( &self, platform_version: &PlatformVersion, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/duplicated_key_ids_witness/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/duplicated_key_ids_witness/v0/mod.rs index 8e79c3037f..2c8d2fcaa4 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/duplicated_key_ids_witness/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/duplicated_key_ids_witness/v0/mod.rs @@ -5,6 +5,7 @@ use std::collections::HashMap; impl IdentityPublicKeyInCreation { /// Find duplicate key ids + #[inline(always)] pub(super) fn duplicated_key_ids_witness_v0( public_keys: &[IdentityPublicKeyInCreation], ) -> Vec { diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/duplicated_keys_witness/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/duplicated_keys_witness/v0/mod.rs index 0d180f6121..99ee267e7a 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/duplicated_keys_witness/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/duplicated_keys_witness/v0/mod.rs @@ -4,6 +4,7 @@ use crate::state_transition::public_key_in_creation::IdentityPublicKeyInCreation use std::collections::HashMap; impl IdentityPublicKeyInCreation { + #[inline(always)] pub(super) fn duplicated_keys_witness_v0( public_keys: &[IdentityPublicKeyInCreation], ) -> Vec { diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/from_public_key_signed_with_private_key/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/from_public_key_signed_with_private_key/v0/mod.rs index 99fbe9a958..9aa0eea863 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/from_public_key_signed_with_private_key/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/from_public_key_signed_with_private_key/v0/mod.rs @@ -6,6 +6,7 @@ use crate::state_transition::public_key_in_creation::IdentityPublicKeyInCreation use crate::{BlsModule, ProtocolError}; impl IdentityPublicKeyInCreation { + #[inline(always)] pub(super) fn from_public_key_signed_with_private_key_v0( public_key: IdentityPublicKey, state_transition_bytes: &[u8], diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/hash/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/hash/v0/mod.rs index f1b1c549cd..deb51c0f7a 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/hash/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/hash/v0/mod.rs @@ -5,6 +5,7 @@ use crate::ProtocolError; impl IdentityPublicKeyInCreation { /// Get the original public key hash + #[inline(always)] pub(super) fn hash_v0(&self) -> Result<[u8; 20], ProtocolError> { Into::::into(self.clone()).hash() } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/validate_identity_public_keys_structure/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/validate_identity_public_keys_structure/v0/mod.rs index 4319b9a676..4cb4f89584 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/validate_identity_public_keys_structure/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/validate_identity_public_keys_structure/v0/mod.rs @@ -42,6 +42,7 @@ impl IdentityPublicKeyInCreation { /// This validation will validate the count of new keys, that there are no duplicates either by /// id or by data. This is done before signature and state validation to remove potential /// attack vectors. + #[inline(always)] pub(super) fn validate_identity_public_keys_structure_v0( identity_public_keys_with_witness: &[IdentityPublicKeyInCreation], in_create_identity: bool, diff --git a/packages/rs-dpp/src/validation/block_time_window/validate_time_in_block_time_window/v0/mod.rs b/packages/rs-dpp/src/validation/block_time_window/validate_time_in_block_time_window/v0/mod.rs index 200045be69..06ccebc28e 100644 --- a/packages/rs-dpp/src/validation/block_time_window/validate_time_in_block_time_window/v0/mod.rs +++ b/packages/rs-dpp/src/validation/block_time_window/validate_time_in_block_time_window/v0/mod.rs @@ -21,6 +21,7 @@ pub const BLOCK_TIME_WINDOW_MILLIS: u64 = BLOCK_TIME_WINDOW_MINUTES * 60 * 1000; /// # Errors /// /// If any arithmetic operation (subtraction or addition) overflows, an `NonConsensusError::Overflow` error is returned. +#[inline(always)] pub(super) fn validate_time_in_block_time_window_v0( last_block_header_time_millis: TimestampMillis, time_to_check_millis: TimestampMillis, diff --git a/packages/rs-dpp/src/validation/json_schema_validator/methods/compile/v0/mod.rs b/packages/rs-dpp/src/validation/json_schema_validator/methods/compile/v0/mod.rs index 9e01fb64e8..d5e934983d 100644 --- a/packages/rs-dpp/src/validation/json_schema_validator/methods/compile/v0/mod.rs +++ b/packages/rs-dpp/src/validation/json_schema_validator/methods/compile/v0/mod.rs @@ -6,6 +6,7 @@ use jsonschema::{JSONSchema, KeywordDefinition}; use serde_json::json; impl JsonSchemaValidator { + #[inline(always)] pub(super) fn compile_v0(&self, json_schema: &JsonValue) -> Result { if self.is_compiled_v0() { return Ok(false); @@ -44,6 +45,7 @@ impl JsonSchemaValidator { Ok(true) } + #[inline(always)] pub(super) fn is_compiled_v0(&self) -> bool { let validator_guard = self.validator.read().unwrap(); diff --git a/packages/rs-dpp/src/validation/json_schema_validator/methods/new/v0/mod.rs b/packages/rs-dpp/src/validation/json_schema_validator/methods/new/v0/mod.rs index 88dc187a2a..644351baeb 100644 --- a/packages/rs-dpp/src/validation/json_schema_validator/methods/new/v0/mod.rs +++ b/packages/rs-dpp/src/validation/json_schema_validator/methods/new/v0/mod.rs @@ -4,6 +4,7 @@ use crate::ProtocolError; use platform_version::version::PlatformVersion; impl JsonSchemaValidator { + #[inline(always)] pub(super) fn new_compiled_v0( json_schema: &JsonValue, platform_version: &PlatformVersion, diff --git a/packages/rs-dpp/src/validation/json_schema_validator/methods/validate/v0/mod.rs b/packages/rs-dpp/src/validation/json_schema_validator/methods/validate/v0/mod.rs index 31fcddeb15..a8650e98d8 100644 --- a/packages/rs-dpp/src/validation/json_schema_validator/methods/validate/v0/mod.rs +++ b/packages/rs-dpp/src/validation/json_schema_validator/methods/validate/v0/mod.rs @@ -5,6 +5,7 @@ use crate::ProtocolError; use serde_json::Value as JsonValue; impl JsonSchemaValidator { + #[inline(always)] pub(super) fn validate_v0( &self, instance: &JsonValue, diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_end/update_drive_cache/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_end/update_drive_cache/v0/mod.rs index 96f8fcea4b..386a335268 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/block_end/update_drive_cache/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/block_end/update_drive_cache/v0/mod.rs @@ -8,6 +8,7 @@ where /// Updates the drive cache at the end of finalize block. This does a few things like merging /// the data contract cache and the platform versions cache. /// + #[inline(always)] pub(super) fn update_drive_cache_v0(&self) { // Update global cache with updated contracts self.drive diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_end/update_state_cache/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_end/update_state_cache/v0/mod.rs index 9390dd369f..98ba2cab03 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/block_end/update_state_cache/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/block_end/update_state_cache/v0/mod.rs @@ -34,6 +34,7 @@ where /// This function may return an `Error` variant if there is a problem with updating the state cache /// and quorums or storing the ephemeral data. /// + #[inline(always)] pub(super) fn update_state_cache_v0( &self, extended_block_info: ExtendedBlockInfo, diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_end/validator_set_update/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_end/validator_set_update/v0/mod.rs index b30f628705..634d22b367 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/block_end/validator_set_update/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/block_end/validator_set_update/v0/mod.rs @@ -20,6 +20,7 @@ where { /// We need to validate against the platform state for rotation and not the block execution /// context state + #[inline(always)] pub(super) fn validator_set_update_v0( &self, platform_state: &PlatformState, diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/add_process_epoch_change_operations/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/add_process_epoch_change_operations/v0/mod.rs index 1314bd1116..b2e0f041d0 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/add_process_epoch_change_operations/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/add_process_epoch_change_operations/v0/mod.rs @@ -74,6 +74,7 @@ impl Platform { /// accumulated during the previous epoch. /// /// `DistributionLeftoverCredits` will be returned, except if we are at Genesis Epoch. + #[inline(always)] pub(super) fn add_process_epoch_change_operations_v0( &self, block_info: &BlockStateInfo, diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/process_block_fees/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/process_block_fees/v0/mod.rs index 5659c7affe..40e3e9d158 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/process_block_fees/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/process_block_fees/v0/mod.rs @@ -73,6 +73,7 @@ impl Platform { /// and distributing the block fees from the previous block and applies the batch. /// /// Returns `ProcessedBlockFeesOutcome`. + #[inline(always)] pub(super) fn process_block_fees_v0( &self, block_info: &BlockStateInfo, diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_start/clear_drive_block_cache/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_start/clear_drive_block_cache/v0/mod.rs index 06750ab6e0..3f64aec8b9 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/block_start/clear_drive_block_cache/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/block_start/clear_drive_block_cache/v0/mod.rs @@ -8,6 +8,7 @@ where /// Clears the drive cache at the start of block processing. This does a few things like clearing /// the block data contract cache and the block platform versions cache. /// + #[inline(always)] pub(super) fn clear_drive_block_cache_v0(&self) { self.drive.cache.data_contracts.clear_block_cache(); diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_core_info/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_core_info/v0/mod.rs index 912114b1bb..f0d40e393d 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_core_info/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_core_info/v0/mod.rs @@ -31,6 +31,7 @@ where /// /// * Result<(), Error> - Returns Ok(()) if the update is successful. Returns an error if /// there is a problem updating the masternode list, quorum information, or the state. + #[inline(always)] pub(super) fn update_core_info_v0( &self, platform_state: Option<&PlatformState>, diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/create_operator_identity/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/create_operator_identity/v0/mod.rs index a4a607b9ba..5b3d815efb 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/create_operator_identity/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/create_operator_identity/v0/mod.rs @@ -10,6 +10,7 @@ impl Platform where C: CoreRPCLike, { + #[inline(always)] pub(super) fn create_operator_identity_v0( masternode: &MasternodeListItem, platform_version: &PlatformVersion, diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_locally/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_locally/v0/mod.rs index d6ea9922c2..903617642b 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_locally/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_locally/v0/mod.rs @@ -23,7 +23,8 @@ where { /// Returning None here means we were unable to verify the chain lock because of an absence of /// the quorum - pub fn verify_chain_lock_locally_v0( + #[inline(always)] + pub(super) fn verify_chain_lock_locally_v0( &self, round: u32, platform_state: &PlatformState, diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_through_core/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_through_core/v0/mod.rs index 240f1718e1..1aa5d4db57 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_through_core/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_through_core/v0/mod.rs @@ -12,7 +12,8 @@ where C: CoreRPCLike, { /// Verify the chain lock through core v0 - pub fn verify_chain_lock_through_core_v0( + #[inline(always)] + pub(super) fn verify_chain_lock_through_core_v0( &self, chain_lock: &ChainLock, submit: bool, diff --git a/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/add_distribute_fees_from_oldest_unpaid_epoch_pool_to_proposers_operations/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/add_distribute_fees_from_oldest_unpaid_epoch_pool_to_proposers_operations/v0/mod.rs index fec5da6a84..fc6fc8bf64 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/add_distribute_fees_from_oldest_unpaid_epoch_pool_to_proposers_operations/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/add_distribute_fees_from_oldest_unpaid_epoch_pool_to_proposers_operations/v0/mod.rs @@ -216,7 +216,7 @@ mod tests { let next_unpaid_epoch_index = platform .drive - .get_unpaid_epoch_index_v0(Some(&transaction)) + .get_unpaid_epoch_index(Some(&transaction), platform_version) .expect("should get unpaid epoch index"); assert_eq!(next_unpaid_epoch_index, current_epoch.index); diff --git a/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/find_oldest_epoch_needing_payment/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/find_oldest_epoch_needing_payment/v0/mod.rs index 3027934ef5..f61025593b 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/find_oldest_epoch_needing_payment/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/find_oldest_epoch_needing_payment/v0/mod.rs @@ -25,7 +25,9 @@ impl Platform { return Ok(None); } - let unpaid_epoch_index = self.drive.get_unpaid_epoch_index_v0(transaction)?; + let unpaid_epoch_index = self + .drive + .get_unpaid_epoch_index(transaction, platform_version)?; // We pay for previous epochs only if unpaid_epoch_index == current_epoch_index { diff --git a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs index a73edfafad..61998bac9c 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs @@ -65,7 +65,8 @@ const DPNS_DASH_TLD_PREORDER_SALT: [u8; 32] = [ impl Platform { /// Creates trees and populates them with necessary identities, contracts and documents - pub fn create_genesis_state_v0( + #[inline(always)] + pub(super) fn create_genesis_state_v0( &self, genesis_time: TimestampMillis, system_identity_public_keys: SystemIdentityPublicKeys, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/bindings/list/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/bindings/list/v0/mod.rs index 4420c8766f..c96ec40cdf 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/bindings/list/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/bindings/list/v0/mod.rs @@ -23,7 +23,8 @@ use drive::state_transition_action::document::documents_batch::document_transiti /// # Errors /// /// Returns a `ProtocolError` if there was an error. -pub fn data_trigger_bindings_list_v0() -> Result, ProtocolError> { +#[inline(always)] +pub(super) fn data_trigger_bindings_list_v0() -> Result, ProtocolError> { let data_triggers = vec![ DataTriggerBindingV0 { data_contract_id: dpns_contract::ID, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/v0/mod.rs index 456a6d898c..e657a9f8c4 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/v0/mod.rs @@ -33,7 +33,8 @@ const BLOCKS_SIZE_WINDOW: u32 = 8; /// # Returns /// /// A `DataTriggerExecutionResult` indicating the success or failure of the trigger execution. -pub fn create_contact_request_data_trigger_v0( +#[inline(always)] +pub(super) fn create_contact_request_data_trigger_v0( document_transition: &DocumentTransitionAction, context: &DataTriggerExecutionContext<'_>, platform_version: &PlatformVersion, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs index 46cf317e90..eb46dd4e7a 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs @@ -44,7 +44,8 @@ pub const MAX_PRINTABLE_DOMAIN_NAME_LENGTH: usize = 253; /// # Returns /// /// A `DataTriggerExecutionResult` indicating the success or failure of the trigger execution. -pub fn create_domain_data_trigger_v0( +#[inline(always)] +pub(super) fn create_domain_data_trigger_v0( document_transition: &DocumentTransitionAction, context: &DataTriggerExecutionContext<'_>, platform_version: &PlatformVersion, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/feature_flags/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/feature_flags/v0/mod.rs index ddc16c6349..8e3da385d9 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/feature_flags/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/feature_flags/v0/mod.rs @@ -31,7 +31,8 @@ use super::{DataTriggerExecutionContext, DataTriggerExecutionResult}; /// # Returns /// /// A `DataTriggerExecutionResult` indicating the success or failure of the trigger execution. -pub fn create_feature_flag_data_trigger_v0( +#[inline(always)] +pub(super) fn create_feature_flag_data_trigger_v0( document_transition: &DocumentTransitionAction, context: &DataTriggerExecutionContext<'_>, _platform_version: &PlatformVersion, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/reject/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/reject/v0/mod.rs index 08a4cc093a..69c287e600 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/reject/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/reject/v0/mod.rs @@ -22,7 +22,8 @@ use crate::error::execution::ExecutionError; /// /// A `SimpleValidationResult` containing either a `DataTriggerActionError` indicating the failure of the trigger /// or an empty result indicating the success of the trigger. -pub fn reject_data_trigger_v0( +#[inline(always)] +pub(super) fn reject_data_trigger_v0( document_transition: &DocumentTransitionAction, ) -> Result { let data_contract_fetch_info = document_transition diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs index 95a0c92828..93b86034d6 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs @@ -33,7 +33,8 @@ use crate::execution::validation::state_transition::documents_batch::data_trigge /// # Returns /// /// A `DataTriggerExecutionResult` indicating the success or failure of the trigger execution. -pub fn delete_withdrawal_data_trigger_v0( +#[inline(always)] +pub(super) fn delete_withdrawal_data_trigger_v0( document_transition: &DocumentTransitionAction, context: &DataTriggerExecutionContext<'_>, platform_version: &PlatformVersion, diff --git a/packages/rs-drive-abci/src/test/helpers/setup.rs b/packages/rs-drive-abci/src/test/helpers/setup.rs index 19632be9de..b3f7e70eea 100644 --- a/packages/rs-drive-abci/src/test/helpers/setup.rs +++ b/packages/rs-drive-abci/src/test/helpers/setup.rs @@ -122,7 +122,7 @@ impl TempPlatform { /// Sets Platform to genesis state. pub fn set_genesis_state(self) -> Self { self.platform - .create_genesis_state_v0( + .create_genesis_state( Default::default(), static_system_identity_public_keys_v0().into(), None, diff --git a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs index eb4246dbf6..8f6ef67d7e 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs @@ -14,8 +14,7 @@ use dpp::state_transition::identity_topup_transition::IdentityTopUpTransition; use strategy_tests::frequency::Frequency; use strategy_tests::operations::FinalizeBlockOperation::IdentityAddKeys; use strategy_tests::operations::{ - DataContractUpdateAction, DataContractUpdateOp, DocumentAction, DocumentOp, - FinalizeBlockOperation, IdentityUpdateOp, OperationType, + DocumentAction, DocumentOp, FinalizeBlockOperation, IdentityUpdateOp, OperationType, }; use dpp::document::DocumentV0Getters; @@ -50,7 +49,6 @@ use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::data_contract::document_type::v0::DocumentTypeV0; use dpp::identity::accessors::IdentityGettersV0; use dpp::platform_value::{BinaryData, Value}; -use dpp::platform_value::string_encoding::Encoding; use dpp::prelude::{Identifier, IdentityNonce}; use dpp::state_transition::documents_batch_transition::document_base_transition::v0::DocumentBaseTransitionV0; use dpp::state_transition::documents_batch_transition::document_create_transition::{DocumentCreateTransition, DocumentCreateTransitionV0}; diff --git a/packages/rs-drive/src/drive/balances/add_to_system_credits/v0/mod.rs b/packages/rs-drive/src/drive/balances/add_to_system_credits/v0/mod.rs index 3648c86276..a146ac94b9 100644 --- a/packages/rs-drive/src/drive/balances/add_to_system_credits/v0/mod.rs +++ b/packages/rs-drive/src/drive/balances/add_to_system_credits/v0/mod.rs @@ -20,6 +20,7 @@ impl Drive { /// # Returns /// /// * `Result<(), Error>` - If successful, returns `Ok(())`. If an error occurs during the operation, returns an `Error`. + #[inline(always)] pub(super) fn add_to_system_credits_v0( &self, amount: u64, diff --git a/packages/rs-drive/src/drive/balances/add_to_system_credits_operations/v0/mod.rs b/packages/rs-drive/src/drive/balances/add_to_system_credits_operations/v0/mod.rs index 20506c1653..ea49713b11 100644 --- a/packages/rs-drive/src/drive/balances/add_to_system_credits_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/balances/add_to_system_credits_operations/v0/mod.rs @@ -16,6 +16,7 @@ use std::collections::HashMap; impl Drive { /// The operations to add to system credits + #[inline(always)] pub(super) fn add_to_system_credits_operations_v0( &self, amount: u64, diff --git a/packages/rs-drive/src/drive/balances/calculate_total_credits_balance/v0/mod.rs b/packages/rs-drive/src/drive/balances/calculate_total_credits_balance/v0/mod.rs index 1d6e65466d..b60c19c507 100644 --- a/packages/rs-drive/src/drive/balances/calculate_total_credits_balance/v0/mod.rs +++ b/packages/rs-drive/src/drive/balances/calculate_total_credits_balance/v0/mod.rs @@ -12,6 +12,7 @@ use grovedb_path::SubtreePath; impl Drive { /// Verify that the sum tree identity credits + pool credits + refunds are equal to the /// Total credits in the system + #[inline(always)] pub(super) fn calculate_total_credits_balance_v0( &self, transaction: TransactionArg, diff --git a/packages/rs-drive/src/drive/balances/remove_from_system_credits/v0/mod.rs b/packages/rs-drive/src/drive/balances/remove_from_system_credits/v0/mod.rs index 3369ce798a..21d087f8fd 100644 --- a/packages/rs-drive/src/drive/balances/remove_from_system_credits/v0/mod.rs +++ b/packages/rs-drive/src/drive/balances/remove_from_system_credits/v0/mod.rs @@ -8,6 +8,7 @@ use grovedb::TransactionArg; impl Drive { /// We remove from system credits when: /// - an identity withdraws some of their balance + #[inline(always)] pub(super) fn remove_from_system_credits_v0( &self, amount: u64, diff --git a/packages/rs-drive/src/drive/balances/remove_from_system_credits_operations/v0/mod.rs b/packages/rs-drive/src/drive/balances/remove_from_system_credits_operations/v0/mod.rs index 2d726879af..4856e0771c 100644 --- a/packages/rs-drive/src/drive/balances/remove_from_system_credits_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/balances/remove_from_system_credits_operations/v0/mod.rs @@ -17,6 +17,7 @@ use std::collections::HashMap; impl Drive { /// We remove from system credits when: /// - an identity withdraws some of their balance + #[inline(always)] pub(super) fn remove_from_system_credits_operations_v0( &self, amount: u64, diff --git a/packages/rs-drive/src/drive/batch/drive_op_batch/drive_methods/apply_drive_operations/v0/mod.rs b/packages/rs-drive/src/drive/batch/drive_op_batch/drive_methods/apply_drive_operations/v0/mod.rs index c26c4a6b20..bceb686403 100644 --- a/packages/rs-drive/src/drive/batch/drive_op_batch/drive_methods/apply_drive_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/batch/drive_op_batch/drive_methods/apply_drive_operations/v0/mod.rs @@ -35,6 +35,7 @@ impl Drive { /// /// If `apply` is set to true, it applies the low-level drive operations and updates side info accordingly. /// If not, it only estimates the costs and updates estimated costs with layer info. + #[inline(always)] pub(super) fn apply_drive_operations_v0( &self, operations: Vec, diff --git a/packages/rs-drive/src/drive/batch/drive_op_batch/drive_methods/convert_drive_operations_to_grove_operations/v0/mod.rs b/packages/rs-drive/src/drive/batch/drive_op_batch/drive_methods/convert_drive_operations_to_grove_operations/v0/mod.rs index 48350a9419..fa50fcc460 100644 --- a/packages/rs-drive/src/drive/batch/drive_op_batch/drive_methods/convert_drive_operations_to_grove_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/batch/drive_op_batch/drive_methods/convert_drive_operations_to_grove_operations/v0/mod.rs @@ -29,6 +29,7 @@ impl Drive { /// /// Returns a `Result` containing a `GroveDbOpBatch` with transformed grove database operations, /// or an error if any step in the conversion process fails. + #[inline(always)] pub(super) fn convert_drive_operations_to_grove_operations_v0( &self, drive_batch_operations: Vec, diff --git a/packages/rs-drive/src/drive/contract/apply/apply_contract/v0/mod.rs b/packages/rs-drive/src/drive/contract/apply/apply_contract/v0/mod.rs index 75f8fa5af9..181a76650d 100644 --- a/packages/rs-drive/src/drive/contract/apply/apply_contract/v0/mod.rs +++ b/packages/rs-drive/src/drive/contract/apply/apply_contract/v0/mod.rs @@ -40,6 +40,7 @@ impl Drive { /// # Errors /// /// This function returns an error if the contract application or fee calculation fails. + #[inline(always)] pub(super) fn apply_contract_v0( &self, contract: &DataContract, @@ -63,6 +64,7 @@ impl Drive { /// Gets the operations for applying a contract /// If the contract already exists, we get operations for an update /// Otherwise we get operations for an insert + #[inline(always)] pub(super) fn apply_contract_operations_v0( &self, contract: &DataContract, diff --git a/packages/rs-drive/src/drive/contract/apply/apply_contract_with_serialization/v0/mod.rs b/packages/rs-drive/src/drive/contract/apply/apply_contract_with_serialization/v0/mod.rs index e40133b589..1b1c360608 100644 --- a/packages/rs-drive/src/drive/contract/apply/apply_contract_with_serialization/v0/mod.rs +++ b/packages/rs-drive/src/drive/contract/apply/apply_contract_with_serialization/v0/mod.rs @@ -26,6 +26,7 @@ use std::collections::HashMap; impl Drive { /// Applies a contract and returns the fee for applying. /// If the contract already exists, an update is applied, otherwise an insert. + #[inline(always)] pub(super) fn apply_contract_with_serialization_v0( &self, contract: &DataContract, @@ -73,6 +74,7 @@ impl Drive { /// Gets the operations for applying a contract with it's serialization /// If the contract already exists, we get operations for an update /// Otherwise we get operations for an insert + #[inline(always)] pub(super) fn apply_contract_with_serialization_operations_v0( &self, contract: &DataContract, diff --git a/packages/rs-drive/src/drive/contract/estimation_costs/add_estimation_costs_for_contract_insertion/v0/mod.rs b/packages/rs-drive/src/drive/contract/estimation_costs/add_estimation_costs_for_contract_insertion/v0/mod.rs index 8a3f5c24a0..cf3ab59645 100644 --- a/packages/rs-drive/src/drive/contract/estimation_costs/add_estimation_costs_for_contract_insertion/v0/mod.rs +++ b/packages/rs-drive/src/drive/contract/estimation_costs/add_estimation_costs_for_contract_insertion/v0/mod.rs @@ -24,6 +24,7 @@ use std::collections::HashMap; impl Drive { /// Adds the estimation costs for a contract insertion + #[inline(always)] pub(super) fn add_estimation_costs_for_contract_insertion_v0( contract: &DataContract, estimated_costs_only_with_layer_info: &mut HashMap, diff --git a/packages/rs-drive/src/drive/contract/get_fetch/fetch_contract/v0/mod.rs b/packages/rs-drive/src/drive/contract/get_fetch/fetch_contract/v0/mod.rs index 1bde21c713..b238534842 100644 --- a/packages/rs-drive/src/drive/contract/get_fetch/fetch_contract/v0/mod.rs +++ b/packages/rs-drive/src/drive/contract/get_fetch/fetch_contract/v0/mod.rs @@ -42,6 +42,7 @@ impl Drive { /// # Errors /// /// This function returns an error if the contract fetching or fee calculation fails. + #[inline(always)] pub(super) fn fetch_contract_v0( &self, contract_id: [u8; 32], @@ -192,6 +193,7 @@ impl Drive { } /// Fetch contract from database and add operations + #[inline(always)] pub(super) fn fetch_contract_and_add_operations_v0( &self, contract_id: [u8; 32], diff --git a/packages/rs-drive/src/drive/contract/get_fetch/fetch_contract_with_history/v0/mod.rs b/packages/rs-drive/src/drive/contract/get_fetch/fetch_contract_with_history/v0/mod.rs index 38d81fdeab..5f96c029c7 100644 --- a/packages/rs-drive/src/drive/contract/get_fetch/fetch_contract_with_history/v0/mod.rs +++ b/packages/rs-drive/src/drive/contract/get_fetch/fetch_contract_with_history/v0/mod.rs @@ -47,6 +47,7 @@ impl Drive { /// * If the contract cannot be deserialized due to protocol errors. /// /// * If the queried contract path does not refer to a contract element. + #[inline(always)] pub(super) fn fetch_contract_with_history_v0( &self, contract_id: [u8; 32], diff --git a/packages/rs-drive/src/drive/contract/get_fetch/get_cached_contract_with_fetch_info/v0/mod.rs b/packages/rs-drive/src/drive/contract/get_fetch/get_cached_contract_with_fetch_info/v0/mod.rs index a596c12755..0e2d6af17d 100644 --- a/packages/rs-drive/src/drive/contract/get_fetch/get_cached_contract_with_fetch_info/v0/mod.rs +++ b/packages/rs-drive/src/drive/contract/get_fetch/get_cached_contract_with_fetch_info/v0/mod.rs @@ -5,6 +5,7 @@ use std::sync::Arc; impl Drive { /// Returns the contract fetch info with the given ID if it's in cache. + #[inline(always)] pub(super) fn get_cached_contract_with_fetch_info_v0( &self, contract_id: [u8; 32], diff --git a/packages/rs-drive/src/drive/contract/get_fetch/get_contract_with_fetch_info/v0/mod.rs b/packages/rs-drive/src/drive/contract/get_fetch/get_contract_with_fetch_info/v0/mod.rs index f9c4d73ee8..11440501e0 100644 --- a/packages/rs-drive/src/drive/contract/get_fetch/get_contract_with_fetch_info/v0/mod.rs +++ b/packages/rs-drive/src/drive/contract/get_fetch/get_contract_with_fetch_info/v0/mod.rs @@ -32,6 +32,7 @@ impl Drive { /// # Errors /// /// This function returns an error if the contract fetching fails. + #[inline(always)] pub(super) fn get_contract_with_fetch_info_v0( &self, contract_id: [u8; 32], @@ -73,6 +74,7 @@ impl Drive { /// # Errors /// /// This function returns an error if the contract fetching or fee calculation fails. + #[inline(always)] pub(super) fn get_contract_with_fetch_info_and_fee_v0( &self, contract_id: [u8; 32], @@ -105,6 +107,7 @@ impl Drive { } /// Returns the contract with fetch info and operations with the given ID. + #[inline(always)] pub(super) fn get_contract_with_fetch_info_and_add_to_operations_v0( &self, contract_id: [u8; 32], diff --git a/packages/rs-drive/src/drive/contract/get_fetch/get_contracts_with_fetch_info/v0/mod.rs b/packages/rs-drive/src/drive/contract/get_fetch/get_contracts_with_fetch_info/v0/mod.rs index 2e6d723366..be1654fc4d 100644 --- a/packages/rs-drive/src/drive/contract/get_fetch/get_contracts_with_fetch_info/v0/mod.rs +++ b/packages/rs-drive/src/drive/contract/get_fetch/get_contracts_with_fetch_info/v0/mod.rs @@ -29,6 +29,7 @@ impl Drive { /// # Errors /// /// This function returns an error if the contract fetching fails. + #[inline(always)] pub(super) fn get_contracts_with_fetch_info_v0( &self, contract_ids: &[[u8; 32]], diff --git a/packages/rs-drive/src/drive/contract/insert/add_contract_to_storage/v0/mod.rs b/packages/rs-drive/src/drive/contract/insert/add_contract_to_storage/v0/mod.rs index 32bf666d80..302be39f45 100644 --- a/packages/rs-drive/src/drive/contract/insert/add_contract_to_storage/v0/mod.rs +++ b/packages/rs-drive/src/drive/contract/insert/add_contract_to_storage/v0/mod.rs @@ -24,6 +24,7 @@ use std::collections::HashMap; impl Drive { /// Adds a contract to storage. + #[inline(always)] pub(super) fn add_contract_to_storage_v0( &self, contract_element: Element, diff --git a/packages/rs-drive/src/drive/contract/insert/insert_contract/v0/mod.rs b/packages/rs-drive/src/drive/contract/insert/insert_contract/v0/mod.rs index c71032de1c..2d7bc1f9c3 100644 --- a/packages/rs-drive/src/drive/contract/insert/insert_contract/v0/mod.rs +++ b/packages/rs-drive/src/drive/contract/insert/insert_contract/v0/mod.rs @@ -23,6 +23,7 @@ use std::collections::{HashMap, HashSet}; impl Drive { /// Insert a contract. + #[inline(always)] pub(super) fn insert_contract_v0( &self, contract: &DataContract, @@ -114,6 +115,7 @@ impl Drive { /// The operations for adding a contract. /// These operations add a contract to storage using `add_contract_to_storage` /// and insert the empty trees which will be necessary to later insert documents. + #[inline(always)] pub(super) fn insert_contract_add_operations_v0( &self, contract_element: Element, diff --git a/packages/rs-drive/src/drive/contract/prove/prove_contract/v0/mod.rs b/packages/rs-drive/src/drive/contract/prove/prove_contract/v0/mod.rs index 48e694a94d..c726ec80b7 100644 --- a/packages/rs-drive/src/drive/contract/prove/prove_contract/v0/mod.rs +++ b/packages/rs-drive/src/drive/contract/prove/prove_contract/v0/mod.rs @@ -26,6 +26,7 @@ impl Drive { /// # Errors /// /// This function returns an error if the path query generation or proof generation fails. + #[inline(always)] pub(super) fn prove_contract_v0( &self, contract_id: [u8; 32], diff --git a/packages/rs-drive/src/drive/contract/prove/prove_contract_history/v0/mod.rs b/packages/rs-drive/src/drive/contract/prove/prove_contract_history/v0/mod.rs index 5e4c0c6e25..01285e4d40 100644 --- a/packages/rs-drive/src/drive/contract/prove/prove_contract_history/v0/mod.rs +++ b/packages/rs-drive/src/drive/contract/prove/prove_contract_history/v0/mod.rs @@ -26,6 +26,7 @@ impl Drive { /// # Errors /// /// This function returns an error if the path query generation or proof generation fails. + #[inline(always)] pub(super) fn prove_contract_history_v0( &self, contract_id: [u8; 32], diff --git a/packages/rs-drive/src/drive/contract/prove/prove_contracts/v0/mod.rs b/packages/rs-drive/src/drive/contract/prove/prove_contracts/v0/mod.rs index 0ddfd41435..5dc4b5daa7 100644 --- a/packages/rs-drive/src/drive/contract/prove/prove_contracts/v0/mod.rs +++ b/packages/rs-drive/src/drive/contract/prove/prove_contracts/v0/mod.rs @@ -26,6 +26,7 @@ impl Drive { /// # Errors /// /// This function returns an error if the path query generation or proof generation fails. + #[inline(always)] pub(super) fn prove_contracts_v0( &self, contract_ids: &[[u8; 32]], diff --git a/packages/rs-drive/src/drive/contract/update/update_contract/v0/mod.rs b/packages/rs-drive/src/drive/contract/update/update_contract/v0/mod.rs index c271eced7d..00990e0715 100644 --- a/packages/rs-drive/src/drive/contract/update/update_contract/v0/mod.rs +++ b/packages/rs-drive/src/drive/contract/update/update_contract/v0/mod.rs @@ -45,6 +45,7 @@ impl Drive { /// # Errors /// /// This function returns an error if the contract update or fee calculation fails. + #[inline(always)] pub(super) fn update_contract_v0( &self, contract: &DataContract, @@ -135,6 +136,7 @@ impl Drive { } /// Updates a contract. + #[inline(always)] pub(super) fn update_contract_element_v0( &self, contract_element: Element, @@ -166,6 +168,7 @@ impl Drive { } /// Updates a contract. + #[inline(always)] pub(super) fn update_contract_add_operations_v0( &self, contract_element: Element, diff --git a/packages/rs-drive/src/drive/credit_pools/unpaid_epoch/get_unpaid_epoch_index/mod.rs b/packages/rs-drive/src/drive/credit_pools/unpaid_epoch/get_unpaid_epoch_index/mod.rs new file mode 100644 index 0000000000..6367491454 --- /dev/null +++ b/packages/rs-drive/src/drive/credit_pools/unpaid_epoch/get_unpaid_epoch_index/mod.rs @@ -0,0 +1,32 @@ +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use dpp::block::epoch::EpochIndex; +use grovedb::TransactionArg; +use platform_version::version::PlatformVersion; + +mod v0; + +impl Drive { + /// Returns the index of the unpaid Epoch. + pub fn get_unpaid_epoch_index( + &self, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result { + match platform_version + .drive + .methods + .credit_pools + .unpaid_epoch + .get_unpaid_epoch_index + { + 0 => self.get_unpaid_epoch_index_v0(transaction), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "get_unpaid_epoch_index".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/credit_pools/unpaid_epoch/get_unpaid_epoch_index/v0/mod.rs b/packages/rs-drive/src/drive/credit_pools/unpaid_epoch/get_unpaid_epoch_index/v0/mod.rs new file mode 100644 index 0000000000..9415228b29 --- /dev/null +++ b/packages/rs-drive/src/drive/credit_pools/unpaid_epoch/get_unpaid_epoch_index/v0/mod.rs @@ -0,0 +1,125 @@ +use crate::drive::credit_pools::paths::pools_path; +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fee_pools::epochs_root_tree_key_constants::KEY_UNPAID_EPOCH_INDEX; +use dpp::block::epoch::EpochIndex; + +use grovedb::{Element, TransactionArg}; + +impl Drive { + /// Returns the index of the unpaid Epoch. + #[inline(always)] + pub(super) fn get_unpaid_epoch_index_v0( + &self, + transaction: TransactionArg, + ) -> Result { + let element = self + .grove + .get(&pools_path(), KEY_UNPAID_EPOCH_INDEX, transaction) + .unwrap() + .map_err(Error::GroveDB)?; + + let Element::Item(encoded_epoch_index, _) = element else { + return Err(Error::Drive(DriveError::UnexpectedElementType( + "must be an item", + ))); + }; + + let epoch_index = + EpochIndex::from_be_bytes(encoded_epoch_index.as_slice().try_into().map_err(|_| { + Error::Drive(DriveError::CorruptedSerialization( + "item has an invalid length".to_string(), + )) + })?); + + Ok(epoch_index) + } +} + +#[cfg(feature = "full")] +#[cfg(test)] +mod tests { + use super::*; + + use crate::tests::helpers::setup::{setup_drive, setup_drive_with_initial_state_structure}; + + mod get_unpaid_epoch_index { + use super::*; + + #[test] + fn test_error_if_fee_pools_tree_is_not_initiated() { + let drive = setup_drive(None); + let transaction = drive.grove.start_transaction(); + + let result = drive.get_unpaid_epoch_index_v0(Some(&transaction)); + + assert!(matches!( + result, + Err(Error::GroveDB(grovedb::Error::PathParentLayerNotFound(_))) + )); + } + + #[test] + fn test_error_if_element_has_invalid_type() { + let drive = setup_drive_with_initial_state_structure(); + let transaction = drive.grove.start_transaction(); + + // We need to first delete the item, because you can not replace an item with a tree + drive + .grove + .delete( + &pools_path(), + KEY_UNPAID_EPOCH_INDEX.as_slice(), + None, + Some(&transaction), + ) + .unwrap() + .expect("should delete old item"); + + drive + .grove + .insert( + &pools_path(), + KEY_UNPAID_EPOCH_INDEX.as_slice(), + Element::empty_tree(), + None, + Some(&transaction), + ) + .unwrap() + .expect("should insert invalid data"); + + let result = drive.get_unpaid_epoch_index_v0(Some(&transaction)); + + assert!(matches!( + result, + Err(Error::Drive(DriveError::UnexpectedElementType(_))) + )); + } + + #[test] + fn test_error_if_value_has_invalid_length() { + let drive = setup_drive_with_initial_state_structure(); + let transaction = drive.grove.start_transaction(); + + drive + .grove + .insert( + &pools_path(), + KEY_UNPAID_EPOCH_INDEX.as_slice(), + Element::Item(u128::MAX.to_be_bytes().to_vec(), None), + None, + Some(&transaction), + ) + .unwrap() + .expect("should insert invalid data"); + + let result = drive.get_unpaid_epoch_index_v0(Some(&transaction)); + + assert!(matches!( + result, + Err(Error::Drive(DriveError::CorruptedSerialization(_))) + )); + } + } +} diff --git a/packages/rs-drive/src/drive/credit_pools/unpaid_epoch/mod.rs b/packages/rs-drive/src/drive/credit_pools/unpaid_epoch/mod.rs index 3092f0f401..7f5702dd3a 100644 --- a/packages/rs-drive/src/drive/credit_pools/unpaid_epoch/mod.rs +++ b/packages/rs-drive/src/drive/credit_pools/unpaid_epoch/mod.rs @@ -30,127 +30,4 @@ //! Unpaid Epoch. //! -use crate::drive::credit_pools::paths::pools_path; -use crate::drive::Drive; -use crate::error::drive::DriveError; -use crate::error::Error; -use crate::fee_pools::epochs_root_tree_key_constants::KEY_UNPAID_EPOCH_INDEX; -use dpp::block::epoch::EpochIndex; - -use grovedb::{Element, TransactionArg}; - -impl Drive { - /// Returns the index of the unpaid Epoch. - pub fn get_unpaid_epoch_index_v0( - &self, - transaction: TransactionArg, - ) -> Result { - let element = self - .grove - .get(&pools_path(), KEY_UNPAID_EPOCH_INDEX, transaction) - .unwrap() - .map_err(Error::GroveDB)?; - - let Element::Item(encoded_epoch_index, _) = element else { - return Err(Error::Drive(DriveError::UnexpectedElementType( - "must be an item", - ))); - }; - - let epoch_index = - EpochIndex::from_be_bytes(encoded_epoch_index.as_slice().try_into().map_err(|_| { - Error::Drive(DriveError::CorruptedSerialization( - "item has an invalid length".to_string(), - )) - })?); - - Ok(epoch_index) - } -} - -#[cfg(feature = "full")] -#[cfg(test)] -mod tests { - use super::*; - - use crate::tests::helpers::setup::{setup_drive, setup_drive_with_initial_state_structure}; - - mod get_unpaid_epoch_index { - use super::*; - - #[test] - fn test_error_if_fee_pools_tree_is_not_initiated() { - let drive = setup_drive(None); - let transaction = drive.grove.start_transaction(); - - let result = drive.get_unpaid_epoch_index_v0(Some(&transaction)); - - assert!(matches!( - result, - Err(Error::GroveDB(grovedb::Error::PathParentLayerNotFound(_))) - )); - } - - #[test] - fn test_error_if_element_has_invalid_type() { - let drive = setup_drive_with_initial_state_structure(); - let transaction = drive.grove.start_transaction(); - - // We need to first delete the item, because you can not replace an item with a tree - drive - .grove - .delete( - &pools_path(), - KEY_UNPAID_EPOCH_INDEX.as_slice(), - None, - Some(&transaction), - ) - .unwrap() - .expect("should delete old item"); - - drive - .grove - .insert( - &pools_path(), - KEY_UNPAID_EPOCH_INDEX.as_slice(), - Element::empty_tree(), - None, - Some(&transaction), - ) - .unwrap() - .expect("should insert invalid data"); - - let result = drive.get_unpaid_epoch_index_v0(Some(&transaction)); - - assert!(matches!( - result, - Err(Error::Drive(DriveError::UnexpectedElementType(_))) - )); - } - - #[test] - fn test_error_if_value_has_invalid_length() { - let drive = setup_drive_with_initial_state_structure(); - let transaction = drive.grove.start_transaction(); - - drive - .grove - .insert( - &pools_path(), - KEY_UNPAID_EPOCH_INDEX.as_slice(), - Element::Item(u128::MAX.to_be_bytes().to_vec(), None), - None, - Some(&transaction), - ) - .unwrap() - .expect("should insert invalid data"); - - let result = drive.get_unpaid_epoch_index_v0(Some(&transaction)); - - assert!(matches!( - result, - Err(Error::Drive(DriveError::CorruptedSerialization(_))) - )); - } - } -} +mod get_unpaid_epoch_index; diff --git a/packages/rs-drive/src/drive/document/delete/delete_document_for_contract/v0/mod.rs b/packages/rs-drive/src/drive/document/delete/delete_document_for_contract/v0/mod.rs index 4bed01a5ba..b9a941c44d 100644 --- a/packages/rs-drive/src/drive/document/delete/delete_document_for_contract/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/delete_document_for_contract/v0/mod.rs @@ -12,6 +12,7 @@ use std::collections::HashMap; impl Drive { /// Deletes a document and returns the associated fee. + #[inline(always)] pub(super) fn delete_document_for_contract_v0( &self, document_id: [u8; 32], diff --git a/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_apply_and_add_to_operations/v0/mod.rs b/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_apply_and_add_to_operations/v0/mod.rs index 2579d18c86..33ec82159d 100644 --- a/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_apply_and_add_to_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_apply_and_add_to_operations/v0/mod.rs @@ -10,6 +10,7 @@ use std::collections::HashMap; impl Drive { /// Deletes a document. + #[inline(always)] pub(super) fn delete_document_for_contract_apply_and_add_to_operations_v0( &self, document_id: [u8; 32], diff --git a/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_id/v0/mod.rs b/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_id/v0/mod.rs index 76d8e48b45..91da9282b7 100644 --- a/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_id/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_id/v0/mod.rs @@ -19,6 +19,7 @@ use dpp::version::PlatformVersion; impl Drive { /// Deletes a document and returns the associated fee. /// The contract CBOR is given instead of the contract itself. + #[inline(always)] pub(super) fn delete_document_for_contract_id_v0( &self, document_id: [u8; 32], diff --git a/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_id_with_named_type_operations/v0/mod.rs b/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_id_with_named_type_operations/v0/mod.rs index 02e8ab7017..87d1ed5e6d 100644 --- a/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_id_with_named_type_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_id_with_named_type_operations/v0/mod.rs @@ -17,6 +17,7 @@ use dpp::version::PlatformVersion; impl Drive { /// Prepares the operations for deleting a document. + #[inline(always)] pub(super) fn delete_document_for_contract_id_with_named_type_operations_v0( &self, document_id: [u8; 32], diff --git a/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_operations/v0/mod.rs b/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_operations/v0/mod.rs index d6388079c3..7eb61ca5fb 100644 --- a/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_operations/v0/mod.rs @@ -34,6 +34,7 @@ use dpp::version::PlatformVersion; impl Drive { /// Prepares the operations for deleting a document. + #[inline(always)] pub(super) fn delete_document_for_contract_operations_v0( &self, document_id: [u8; 32], diff --git a/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_with_named_type_operations/v0/mod.rs b/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_with_named_type_operations/v0/mod.rs index 00fa07d308..59b6755ab3 100644 --- a/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_with_named_type_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_with_named_type_operations/v0/mod.rs @@ -17,6 +17,7 @@ use dpp::version::PlatformVersion; impl Drive { /// Prepares the operations for deleting a document. + #[inline(always)] pub(super) fn delete_document_for_contract_with_named_type_operations_v0( &self, document_id: [u8; 32], diff --git a/packages/rs-drive/src/drive/document/delete/internal/add_estimation_costs_for_remove_document_to_primary_storage/v0/mod.rs b/packages/rs-drive/src/drive/document/delete/internal/add_estimation_costs_for_remove_document_to_primary_storage/v0/mod.rs index e1f97a19eb..23dcab25af 100644 --- a/packages/rs-drive/src/drive/document/delete/internal/add_estimation_costs_for_remove_document_to_primary_storage/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/internal/add_estimation_costs_for_remove_document_to_primary_storage/v0/mod.rs @@ -47,6 +47,7 @@ impl Drive { /// to derive estimations for mutable documents. In the future, the contract might dictate how often /// documents are expected to mutate. /// - The function assumes a default hash size (`DEFAULT_HASH_SIZE_U8`) and other default values for its estimations. + #[inline(always)] pub(super) fn add_estimation_costs_for_remove_document_to_primary_storage_v0( primary_key_path: [&[u8]; 5], document_type: DocumentTypeRef, diff --git a/packages/rs-drive/src/drive/document/delete/remove_document_from_primary_storage/v0/mod.rs b/packages/rs-drive/src/drive/document/delete/remove_document_from_primary_storage/v0/mod.rs index fe7bf90602..24016aa56f 100644 --- a/packages/rs-drive/src/drive/document/delete/remove_document_from_primary_storage/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/remove_document_from_primary_storage/v0/mod.rs @@ -21,6 +21,7 @@ use dpp::version::PlatformVersion; impl Drive { /// Removes the document from primary storage. + #[inline(always)] pub(super) fn remove_document_from_primary_storage_v0( &self, document_id: [u8; 32], diff --git a/packages/rs-drive/src/drive/document/delete/remove_indices_for_index_level_for_contract_operations/v0/mod.rs b/packages/rs-drive/src/drive/document/delete/remove_indices_for_index_level_for_contract_operations/v0/mod.rs index 2ddce191d5..1996c37c93 100644 --- a/packages/rs-drive/src/drive/document/delete/remove_indices_for_index_level_for_contract_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/remove_indices_for_index_level_for_contract_operations/v0/mod.rs @@ -26,6 +26,7 @@ use dpp::version::PlatformVersion; impl Drive { /// Removes indices for an index level and recurses. + #[inline] pub(super) fn remove_indices_for_index_level_for_contract_operations_v0( &self, document_and_contract_info: &DocumentAndContractInfo, @@ -133,7 +134,7 @@ impl Drive { sub_level_index_path_info.push(document_index_field)?; // Iteration 1. the index path is now something likeDataContracts/ContractID/Documents(1)/$ownerId//toUserId// // Iteration 2. the index path is now something likeDataContracts/ContractID/Documents(1)/$ownerId//toUserId//accountReference/ - self.remove_indices_for_index_level_for_contract_operations( + self.remove_indices_for_index_level_for_contract_operations_v0( document_and_contract_info, sub_level_index_path_info, sub_level, diff --git a/packages/rs-drive/src/drive/document/delete/remove_indices_for_top_index_level_for_contract_operations/v0/mod.rs b/packages/rs-drive/src/drive/document/delete/remove_indices_for_top_index_level_for_contract_operations/v0/mod.rs index dbc171c098..7e502ca517 100644 --- a/packages/rs-drive/src/drive/document/delete/remove_indices_for_top_index_level_for_contract_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/remove_indices_for_top_index_level_for_contract_operations/v0/mod.rs @@ -25,6 +25,7 @@ use dpp::version::PlatformVersion; impl Drive { /// Removes indices for the top index level and calls for lower levels. + #[inline(always)] pub(super) fn remove_indices_for_top_index_level_for_contract_operations_v0( &self, document_and_contract_info: &DocumentAndContractInfo, diff --git a/packages/rs-drive/src/drive/document/delete/remove_reference_for_index_level_for_contract_operations/v0/mod.rs b/packages/rs-drive/src/drive/document/delete/remove_reference_for_index_level_for_contract_operations/v0/mod.rs index ea6ce25248..24f5d220cd 100644 --- a/packages/rs-drive/src/drive/document/delete/remove_reference_for_index_level_for_contract_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/remove_reference_for_index_level_for_contract_operations/v0/mod.rs @@ -22,6 +22,7 @@ use dpp::version::PlatformVersion; impl Drive { /// Removes the terminal reference. + #[inline(always)] pub(super) fn remove_reference_for_index_level_for_contract_operations_v0( &self, document_and_contract_info: &DocumentAndContractInfo, diff --git a/packages/rs-drive/src/drive/document/estimation_costs/add_estimation_costs_for_add_document_to_primary_storage/v0/mod.rs b/packages/rs-drive/src/drive/document/estimation_costs/add_estimation_costs_for_add_document_to_primary_storage/v0/mod.rs index 6ca6efccd2..50466ab471 100644 --- a/packages/rs-drive/src/drive/document/estimation_costs/add_estimation_costs_for_add_document_to_primary_storage/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/estimation_costs/add_estimation_costs_for_add_document_to_primary_storage/v0/mod.rs @@ -52,6 +52,7 @@ impl Drive { /// # Panics /// This function will not panic under normal circumstances. However, unexpected behavior may result /// from incorrect arguments or unforeseen edge cases. + #[inline(always)] pub(super) fn add_estimation_costs_for_add_document_to_primary_storage_v0( document_and_contract_info: &DocumentAndContractInfo, primary_key_path: [&[u8]; 5], diff --git a/packages/rs-drive/src/drive/document/estimation_costs/stateless_delete_of_non_tree_for_costs/v0/mod.rs b/packages/rs-drive/src/drive/document/estimation_costs/stateless_delete_of_non_tree_for_costs/v0/mod.rs index ac6330292b..608fbefa7d 100644 --- a/packages/rs-drive/src/drive/document/estimation_costs/stateless_delete_of_non_tree_for_costs/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/estimation_costs/stateless_delete_of_non_tree_for_costs/v0/mod.rs @@ -37,6 +37,7 @@ impl Drive { /// # Errors /// Returns an `Error::Fee(FeeError::CorruptedEstimatedLayerInfoMissing)` if the required layer /// information is missing in the provided estimated costs. + #[inline(always)] pub(super) fn stateless_delete_of_non_tree_for_costs_v0( element_estimated_sizes: EstimatedLayerSizes, key_info_path: &KeyInfoPath, diff --git a/packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v0/mod.rs b/packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v0/mod.rs index 021a3fe4f5..68ee59386c 100644 --- a/packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v0/mod.rs @@ -34,6 +34,7 @@ impl Drive { /// /// * Contains a validation result indicating if the data is unique or not, or /// * An error that occurred during the operation. + #[inline(always)] pub(super) fn validate_uniqueness_of_data_v0( &self, request: UniquenessOfDataRequest, diff --git a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/v0/mod.rs b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/v0/mod.rs index 5d4faad553..8d2922c67e 100644 --- a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/v0/mod.rs @@ -19,6 +19,7 @@ use dpp::version::PlatformVersion; impl Drive { /// Validate that a document create transition action would be unique in the state + #[inline(always)] pub(super) fn validate_document_create_transition_action_uniqueness_v0( &self, contract: &DataContract, diff --git a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/v0/mod.rs b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/v0/mod.rs index e36ec5925d..eb796206e8 100644 --- a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/v0/mod.rs @@ -19,6 +19,7 @@ use dpp::version::PlatformVersion; impl Drive { /// Validate that a document replace transition action would be unique in the state + #[inline(always)] pub(super) fn validate_document_replace_transition_action_uniqueness_v0( &self, contract: &DataContract, diff --git a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_uniqueness/v0/mod.rs b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_uniqueness/v0/mod.rs index eff788a31d..5393e2ed99 100644 --- a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_uniqueness/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_uniqueness/v0/mod.rs @@ -16,6 +16,7 @@ use grovedb::TransactionArg; impl Drive { /// Validate that a document would be unique in the state + #[inline(always)] pub(super) fn validate_document_uniqueness_v0( &self, contract: &DataContract, diff --git a/packages/rs-drive/src/drive/document/insert/add_document/v0/mod.rs b/packages/rs-drive/src/drive/document/insert/add_document/v0/mod.rs index 228529c93d..703c0bd710 100644 --- a/packages/rs-drive/src/drive/document/insert/add_document/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/insert/add_document/v0/mod.rs @@ -13,6 +13,7 @@ use grovedb::TransactionArg; impl Drive { /// Adds a document using bincode serialization + #[inline(always)] pub(super) fn add_document_v0( &self, owned_document_info: OwnedDocumentInfo, diff --git a/packages/rs-drive/src/drive/document/insert/add_document_for_contract/v0/mod.rs b/packages/rs-drive/src/drive/document/insert/add_document_for_contract/v0/mod.rs index b035a8ba01..8039295db6 100644 --- a/packages/rs-drive/src/drive/document/insert/add_document_for_contract/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/insert/add_document_for_contract/v0/mod.rs @@ -11,6 +11,7 @@ use grovedb::TransactionArg; impl Drive { /// Adds a document to a contract. + #[inline(always)] pub(super) fn add_document_for_contract_v0( &self, document_and_contract_info: DocumentAndContractInfo, diff --git a/packages/rs-drive/src/drive/document/insert/add_document_for_contract_apply_and_add_to_operations/v0/mod.rs b/packages/rs-drive/src/drive/document/insert/add_document_for_contract_apply_and_add_to_operations/v0/mod.rs index 681436e719..06d9868b8e 100644 --- a/packages/rs-drive/src/drive/document/insert/add_document_for_contract_apply_and_add_to_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/insert/add_document_for_contract_apply_and_add_to_operations/v0/mod.rs @@ -11,6 +11,7 @@ use std::collections::HashMap; impl Drive { /// Performs the operations to add a document to a contract. + #[inline(always)] pub(super) fn add_document_for_contract_apply_and_add_to_operations_v0( &self, document_and_contract_info: DocumentAndContractInfo, diff --git a/packages/rs-drive/src/drive/document/insert/add_document_for_contract_operations/v0/mod.rs b/packages/rs-drive/src/drive/document/insert/add_document_for_contract_operations/v0/mod.rs index 30f2821623..e82d7b079a 100644 --- a/packages/rs-drive/src/drive/document/insert/add_document_for_contract_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/insert/add_document_for_contract_operations/v0/mod.rs @@ -17,6 +17,7 @@ use std::collections::HashMap; impl Drive { /// Gathers the operations to add a document to a contract. + #[inline(always)] pub(super) fn add_document_for_contract_operations_v0( &self, document_and_contract_info: DocumentAndContractInfo, diff --git a/packages/rs-drive/src/drive/document/insert/add_indices_for_index_level_for_contract_operations/v0/mod.rs b/packages/rs-drive/src/drive/document/insert/add_indices_for_index_level_for_contract_operations/v0/mod.rs index 8a0f4f3a10..1b44196d70 100644 --- a/packages/rs-drive/src/drive/document/insert/add_indices_for_index_level_for_contract_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/insert/add_indices_for_index_level_for_contract_operations/v0/mod.rs @@ -19,6 +19,7 @@ use std::collections::HashMap; impl Drive { /// Adds indices for an index level and recurses. + #[inline] pub(super) fn add_indices_for_index_level_for_contract_operations_v0( &self, document_and_contract_info: &DocumentAndContractInfo, diff --git a/packages/rs-drive/src/drive/document/insert/add_reference_for_index_level_for_contract_operations/v0/mod.rs b/packages/rs-drive/src/drive/document/insert/add_reference_for_index_level_for_contract_operations/v0/mod.rs index c46e791faa..3d8d4a4276 100644 --- a/packages/rs-drive/src/drive/document/insert/add_reference_for_index_level_for_contract_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/insert/add_reference_for_index_level_for_contract_operations/v0/mod.rs @@ -27,6 +27,7 @@ use std::collections::HashMap; impl Drive { /// Adds the terminal reference. + #[inline(always)] pub(super) fn add_reference_for_index_level_for_contract_operations_v0( &self, document_and_contract_info: &DocumentAndContractInfo, diff --git a/packages/rs-drive/src/drive/document/query/query_documents/v0/mod.rs b/packages/rs-drive/src/drive/document/query/query_documents/v0/mod.rs index 3a82270ddb..03494ae8c4 100644 --- a/packages/rs-drive/src/drive/document/query/query_documents/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/query/query_documents/v0/mod.rs @@ -77,6 +77,7 @@ impl Drive { /// /// * `Result` - Returns `QueryDocumentsOutcome` on success with the list of documents, /// number of skipped items, and cost. If the operation fails, it returns an `Error`. + #[inline(always)] pub(super) fn query_documents_v0( &self, query: DriveQuery, diff --git a/packages/rs-drive/src/drive/document/update/update_document_for_contract/v0/mod.rs b/packages/rs-drive/src/drive/document/update/update_document_for_contract/v0/mod.rs index 8046e33071..3b4fc7562a 100644 --- a/packages/rs-drive/src/drive/document/update/update_document_for_contract/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/update/update_document_for_contract/v0/mod.rs @@ -17,6 +17,7 @@ use std::collections::HashMap; impl Drive { /// Updates a document and returns the associated fee. + #[inline(always)] pub(super) fn update_document_for_contract_v0( &self, document: &Document, diff --git a/packages/rs-drive/src/drive/document/update/update_document_for_contract_id/v0/mod.rs b/packages/rs-drive/src/drive/document/update/update_document_for_contract_id/v0/mod.rs index 9965221665..ec10219dc2 100644 --- a/packages/rs-drive/src/drive/document/update/update_document_for_contract_id/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/update/update_document_for_contract_id/v0/mod.rs @@ -19,6 +19,7 @@ use std::collections::HashMap; impl Drive { /// Updates a serialized document given a contract id and returns the associated fee. + #[inline(always)] pub(super) fn update_document_for_contract_id_v0( &self, serialized_document: &[u8], diff --git a/packages/rs-drive/src/drive/document/update/update_document_with_serialization_for_contract/v0/mod.rs b/packages/rs-drive/src/drive/document/update/update_document_with_serialization_for_contract/v0/mod.rs index 7b66b9ecb0..18f02688a3 100644 --- a/packages/rs-drive/src/drive/document/update/update_document_with_serialization_for_contract/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/update/update_document_with_serialization_for_contract/v0/mod.rs @@ -18,6 +18,7 @@ use std::collections::HashMap; impl Drive { /// Updates a document and returns the associated fee. + #[inline(always)] pub(super) fn update_document_with_serialization_for_contract_v0( &self, document: &Document, diff --git a/packages/rs-drive/src/drive/fee/calculate_fee/v0/mod.rs b/packages/rs-drive/src/drive/fee/calculate_fee/v0/mod.rs index b704a2dc31..94e0b8edca 100644 --- a/packages/rs-drive/src/drive/fee/calculate_fee/v0/mod.rs +++ b/packages/rs-drive/src/drive/fee/calculate_fee/v0/mod.rs @@ -9,7 +9,8 @@ use enum_map::EnumMap; impl Drive { /// Calculates fees for the given operations. Returns the storage and processing costs. - pub fn calculate_fee_v0( + #[inline(always)] + pub(super) fn calculate_fee_v0( base_operations: Option>, drive_operations: Option>, epoch: &Epoch, diff --git a/packages/rs-drive/src/drive/identity/key/fetch/fetch_all_current_identity_keys/v0/mod.rs b/packages/rs-drive/src/drive/identity/key/fetch/fetch_all_current_identity_keys/v0/mod.rs index 18d572717c..11faa93b9a 100644 --- a/packages/rs-drive/src/drive/identity/key/fetch/fetch_all_current_identity_keys/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/key/fetch/fetch_all_current_identity_keys/v0/mod.rs @@ -10,6 +10,7 @@ use std::collections::BTreeMap; impl Drive { /// Fetch all the current keys of every kind for a specific Identity + #[inline(always)] pub(super) fn fetch_all_current_identity_keys_v0( &self, identity_id: [u8; 32], diff --git a/packages/rs-drive/src/drive/identity/key/fetch/fetch_all_identity_keys/v0/mod.rs b/packages/rs-drive/src/drive/identity/key/fetch/fetch_all_identity_keys/v0/mod.rs index 0b0c1005fe..1f7e5d54b6 100644 --- a/packages/rs-drive/src/drive/identity/key/fetch/fetch_all_identity_keys/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/key/fetch/fetch_all_identity_keys/v0/mod.rs @@ -10,6 +10,7 @@ use std::collections::BTreeMap; impl Drive { /// Fetch all the keys of every kind for a specific Identity + #[inline(always)] pub(super) fn fetch_all_identity_keys_v0( &self, identity_id: [u8; 32], @@ -26,6 +27,7 @@ impl Drive { } /// Operations for fetching all the keys of every kind for a specific Identity + #[inline(always)] pub(super) fn fetch_all_identity_keys_operations_v0( &self, identity_id: [u8; 32], diff --git a/packages/rs-drive/src/drive/identity/key/fetch/fetch_identities_all_keys/v0/mod.rs b/packages/rs-drive/src/drive/identity/key/fetch/fetch_identities_all_keys/v0/mod.rs index 6792dc73b3..3a54dda22e 100644 --- a/packages/rs-drive/src/drive/identity/key/fetch/fetch_identities_all_keys/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/key/fetch/fetch_identities_all_keys/v0/mod.rs @@ -29,6 +29,7 @@ impl Drive { /// # Errors /// /// This function returns an error if the key fetching fails. + #[inline(always)] pub(super) fn fetch_identities_all_keys_v0( &self, identity_ids: &[[u8; 32]], diff --git a/packages/rs-drive/src/drive/identity/key/insert/insert_key_to_storage/v0/mod.rs b/packages/rs-drive/src/drive/identity/key/insert/insert_key_to_storage/v0/mod.rs index 4feb42f4b5..a873758592 100644 --- a/packages/rs-drive/src/drive/identity/key/insert/insert_key_to_storage/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/key/insert/insert_key_to_storage/v0/mod.rs @@ -10,6 +10,7 @@ use platform_version::version::PlatformVersion; impl Drive { /// Generates a vector of operations for inserting key to storage. + #[inline(always)] pub(super) fn insert_key_to_storage_operations_v0( &self, identity_id: [u8; 32], diff --git a/packages/rs-drive/src/drive/identity/key/insert/insert_new_unique_key/v0/mod.rs b/packages/rs-drive/src/drive/identity/key/insert/insert_new_unique_key/v0/mod.rs index d876d28b05..ada6196c74 100644 --- a/packages/rs-drive/src/drive/identity/key/insert/insert_new_unique_key/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/key/insert/insert_new_unique_key/v0/mod.rs @@ -13,6 +13,7 @@ use std::collections::HashMap; impl Drive { /// Insert a new key into an identity operations + #[inline(always)] pub(super) fn insert_new_unique_key_operations_v0( &self, identity_id: [u8; 32], diff --git a/packages/rs-drive/src/drive/identity/key/prove/prove_identities_all_keys/v0/mod.rs b/packages/rs-drive/src/drive/identity/key/prove/prove_identities_all_keys/v0/mod.rs index 97e250f7f2..3b4ecc23cd 100644 --- a/packages/rs-drive/src/drive/identity/key/prove/prove_identities_all_keys/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/key/prove/prove_identities_all_keys/v0/mod.rs @@ -27,6 +27,7 @@ impl Drive { /// # Errors /// /// This function returns an error if the path query generation or proof generation fails. + #[inline(always)] pub(super) fn prove_identities_all_keys_v0( &self, identity_ids: &[[u8; 32]], diff --git a/packages/rs-drive/src/drive/identity/key/prove/prove_identity_keys/v0/mod.rs b/packages/rs-drive/src/drive/identity/key/prove/prove_identity_keys/v0/mod.rs index 4916db7bfa..472ccba415 100644 --- a/packages/rs-drive/src/drive/identity/key/prove/prove_identity_keys/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/key/prove/prove_identity_keys/v0/mod.rs @@ -24,6 +24,7 @@ impl Drive { /// proof is successfully generated. /// * `Err(Error)` - An error if the proof cannot be generated. /// + #[inline(always)] pub(super) fn prove_identity_keys_v0( &self, key_request: IdentityKeysRequest, diff --git a/packages/rs-drive/src/drive/identity/update/methods/add_new_keys_to_identity/v0/mod.rs b/packages/rs-drive/src/drive/identity/update/methods/add_new_keys_to_identity/v0/mod.rs index f33d3b5f09..5e02fa2d61 100644 --- a/packages/rs-drive/src/drive/identity/update/methods/add_new_keys_to_identity/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/update/methods/add_new_keys_to_identity/v0/mod.rs @@ -12,7 +12,8 @@ use std::collections::HashMap; impl Drive { /// The operations for adding new keys to an identity /// This should not be called for adding new keys to a masternode - pub fn add_new_keys_to_identity_operations_v0( + #[inline(always)] + pub(super) fn add_new_keys_to_identity_operations_v0( &self, identity_id: [u8; 32], unique_keys_to_add: Vec, diff --git a/packages/rs-drive/src/drive/identity/update/methods/add_new_non_unique_keys_to_identity/v0/mod.rs b/packages/rs-drive/src/drive/identity/update/methods/add_new_non_unique_keys_to_identity/v0/mod.rs index 3b3cd55a5c..12c3c5922f 100644 --- a/packages/rs-drive/src/drive/identity/update/methods/add_new_non_unique_keys_to_identity/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/update/methods/add_new_non_unique_keys_to_identity/v0/mod.rs @@ -12,7 +12,8 @@ use std::collections::HashMap; impl Drive { /// Add new non unique keys to an identity - pub fn add_new_non_unique_keys_to_identity_v0( + #[inline(always)] + pub(super) fn add_new_non_unique_keys_to_identity_v0( &self, identity_id: [u8; 32], keys_to_add: Vec, diff --git a/packages/rs-drive/src/drive/identity/update/methods/add_new_unique_keys_to_identity/v0/mod.rs b/packages/rs-drive/src/drive/identity/update/methods/add_new_unique_keys_to_identity/v0/mod.rs index 15ba0f3898..76251a5d54 100644 --- a/packages/rs-drive/src/drive/identity/update/methods/add_new_unique_keys_to_identity/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/update/methods/add_new_unique_keys_to_identity/v0/mod.rs @@ -12,7 +12,8 @@ use std::collections::HashMap; impl Drive { /// Add new keys to an identity - pub fn add_new_unique_keys_to_identity_v0( + #[inline(always)] + pub(super) fn add_new_unique_keys_to_identity_v0( &self, identity_id: [u8; 32], keys_to_add: Vec, diff --git a/packages/rs-drive/src/drive/identity/update/methods/add_to_identity_balance/v0/mod.rs b/packages/rs-drive/src/drive/identity/update/methods/add_to_identity_balance/v0/mod.rs index a57614649b..e655606a07 100644 --- a/packages/rs-drive/src/drive/identity/update/methods/add_to_identity_balance/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/update/methods/add_to_identity_balance/v0/mod.rs @@ -14,7 +14,8 @@ use std::collections::HashMap; impl Drive { /// Balances are stored in the balance tree under the identity's id - pub fn add_to_identity_balance_v0( + #[inline(always)] + pub(super) fn add_to_identity_balance_v0( &self, identity_id: [u8; 32], added_balance: Credits, @@ -59,7 +60,8 @@ impl Drive { /// Balances are stored in the balance tree under the identity's id /// This gets operations based on apply flag (stateful vs stateless) - pub fn add_to_identity_balance_operations_v0( + #[inline(always)] + pub(super) fn add_to_identity_balance_operations_v0( &self, identity_id: [u8; 32], added_balance: Credits, diff --git a/packages/rs-drive/src/drive/identity/update/methods/apply_balance_change_from_fee_to_identity/v0/mod.rs b/packages/rs-drive/src/drive/identity/update/methods/apply_balance_change_from_fee_to_identity/v0/mod.rs index 2f705e9e11..0b93587c32 100644 --- a/packages/rs-drive/src/drive/identity/update/methods/apply_balance_change_from_fee_to_identity/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/update/methods/apply_balance_change_from_fee_to_identity/v0/mod.rs @@ -48,7 +48,8 @@ impl Drive { /// If calculated balance is below 0 it will go to negative balance /// /// Balances are stored in the identity under key 0 - pub fn apply_balance_change_from_fee_to_identity_operations_v0( + #[inline(always)] + pub(super) fn apply_balance_change_from_fee_to_identity_operations_v0( &self, balance_change: BalanceChangeForIdentity, transaction: TransactionArg, diff --git a/packages/rs-drive/src/drive/identity/update/methods/disable_identity_keys/v0/mod.rs b/packages/rs-drive/src/drive/identity/update/methods/disable_identity_keys/v0/mod.rs index 19247c4601..63c70f3362 100644 --- a/packages/rs-drive/src/drive/identity/update/methods/disable_identity_keys/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/update/methods/disable_identity_keys/v0/mod.rs @@ -93,7 +93,8 @@ impl Drive { /// A `Result` containing a vector of `LowLevelDriveOperation` which represents the operations /// performed during the disabling process, or an `Error` if the operation fails. /// - pub fn disable_identity_keys_operations_v0( + #[inline(always)] + pub(super) fn disable_identity_keys_operations_v0( &self, identity_id: [u8; 32], key_ids: Vec, diff --git a/packages/rs-drive/src/drive/identity/update/methods/merge_identity_nonce/v0/mod.rs b/packages/rs-drive/src/drive/identity/update/methods/merge_identity_nonce/v0/mod.rs index 640315c7d9..c5073ac634 100644 --- a/packages/rs-drive/src/drive/identity/update/methods/merge_identity_nonce/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/update/methods/merge_identity_nonce/v0/mod.rs @@ -18,7 +18,8 @@ use std::collections::HashMap; impl Drive { /// Update nonce for specific identity - pub fn merge_identity_nonce_v0( + #[inline(always)] + pub(super) fn merge_identity_nonce_v0( &self, identity_id: [u8; 32], nonce: IdentityNonce, diff --git a/packages/rs-drive/src/drive/identity/update/methods/re_enable_identity_keys/v0/mod.rs b/packages/rs-drive/src/drive/identity/update/methods/re_enable_identity_keys/v0/mod.rs index b5fe344b47..848aa1e81f 100644 --- a/packages/rs-drive/src/drive/identity/update/methods/re_enable_identity_keys/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/update/methods/re_enable_identity_keys/v0/mod.rs @@ -40,7 +40,8 @@ impl Drive { /// A `Result` containing a vector of `LowLevelDriveOperation` which represents the operations /// performed during the re-enabling process, or an `Error` if the process fails. /// - pub fn re_enable_identity_keys_operations_v0( + #[inline(always)] + pub(super) fn re_enable_identity_keys_operations_v0( &self, identity_id: [u8; 32], key_ids: Vec, diff --git a/packages/rs-drive/src/drive/identity/update/methods/update_identity_revision/v0/mod.rs b/packages/rs-drive/src/drive/identity/update/methods/update_identity_revision/v0/mod.rs index ce00b4d896..58a55021f7 100644 --- a/packages/rs-drive/src/drive/identity/update/methods/update_identity_revision/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/update/methods/update_identity_revision/v0/mod.rs @@ -18,7 +18,8 @@ use std::collections::HashMap; impl Drive { //todo: this should probably not exist /// Update revision for specific identity - pub fn update_identity_revision_v0( + #[inline(always)] + pub(super) fn update_identity_revision_v0( &self, identity_id: [u8; 32], revision: Revision, diff --git a/packages/rs-drive/src/drive/identity/update/operations/merge_identity_nonce_operations/v0/mod.rs b/packages/rs-drive/src/drive/identity/update/operations/merge_identity_nonce_operations/v0/mod.rs index 09514ada1a..f27d412a5b 100644 --- a/packages/rs-drive/src/drive/identity/update/operations/merge_identity_nonce_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/update/operations/merge_identity_nonce_operations/v0/mod.rs @@ -201,7 +201,7 @@ mod tests { .expect("expected to insert identity"); drive - .merge_identity_nonce_v0( + .merge_identity_nonce( identity.id().to_buffer(), 1, &BlockInfo::default(), @@ -227,7 +227,7 @@ mod tests { let transaction = drive.grove.start_transaction(); drive - .merge_identity_nonce_v0( + .merge_identity_nonce( identity.id().to_buffer(), 2, &BlockInfo::default(), @@ -247,7 +247,7 @@ mod tests { let transaction = drive.grove.start_transaction(); let (result, _) = drive - .merge_identity_nonce_v0( + .merge_identity_nonce( identity.id().to_buffer(), 0, &BlockInfo::default(), @@ -269,7 +269,7 @@ mod tests { let transaction = drive.grove.start_transaction(); let (result, _) = drive - .merge_identity_nonce_v0( + .merge_identity_nonce( identity.id().to_buffer(), 10, &BlockInfo::default(), @@ -282,7 +282,7 @@ mod tests { assert!(result.error_message().is_none()); let (result, _) = drive - .merge_identity_nonce_v0( + .merge_identity_nonce( identity.id().to_buffer(), 9, &BlockInfo::default(), @@ -295,7 +295,7 @@ mod tests { assert!(result.error_message().is_none()); let (result, _) = drive - .merge_identity_nonce_v0( + .merge_identity_nonce( identity.id().to_buffer(), 8, &BlockInfo::default(), @@ -308,7 +308,7 @@ mod tests { assert!(result.error_message().is_none()); let (result, _) = drive - .merge_identity_nonce_v0( + .merge_identity_nonce( identity.id().to_buffer(), 3, &BlockInfo::default(), @@ -321,7 +321,7 @@ mod tests { assert!(result.error_message().is_none()); let (result, _) = drive - .merge_identity_nonce_v0( + .merge_identity_nonce( identity.id().to_buffer(), 12, &BlockInfo::default(), @@ -334,7 +334,7 @@ mod tests { assert!(result.error_message().is_none()); let (result, _) = drive - .merge_identity_nonce_v0( + .merge_identity_nonce( identity.id().to_buffer(), 11, &BlockInfo::default(), @@ -347,7 +347,7 @@ mod tests { assert!(result.error_message().is_none()); let (result, _) = drive - .merge_identity_nonce_v0( + .merge_identity_nonce( identity.id().to_buffer(), 11, &BlockInfo::default(), @@ -363,7 +363,7 @@ mod tests { ); let (result, _) = drive - .merge_identity_nonce_v0( + .merge_identity_nonce( identity.id().to_buffer(), 12, &BlockInfo::default(), @@ -376,7 +376,7 @@ mod tests { assert_eq!(result.error_message(), Some("nonce already present at tip")); let (result, _) = drive - .merge_identity_nonce_v0( + .merge_identity_nonce( identity.id().to_buffer(), 0, &BlockInfo::default(), @@ -389,7 +389,7 @@ mod tests { assert_eq!(result.error_message(), Some("nonce is an invalid value")); let (result, _) = drive - .merge_identity_nonce_v0( + .merge_identity_nonce( identity.id().to_buffer(), 12 + 25, &BlockInfo::default(), @@ -402,7 +402,7 @@ mod tests { assert_eq!(result.error_message(), Some("nonce too far in future")); let (result, _) = drive - .merge_identity_nonce_v0( + .merge_identity_nonce( identity.id().to_buffer(), 12 + 24, // 36 &BlockInfo::default(), @@ -415,7 +415,7 @@ mod tests { assert!(result.error_message().is_none()); let (result, _) = drive - .merge_identity_nonce_v0( + .merge_identity_nonce( identity.id().to_buffer(), 13, &BlockInfo::default(), @@ -428,7 +428,7 @@ mod tests { assert!(result.error_message().is_none()); let (result, _) = drive - .merge_identity_nonce_v0( + .merge_identity_nonce( identity.id().to_buffer(), 12, &BlockInfo::default(), @@ -441,7 +441,7 @@ mod tests { assert_eq!(result.error_message(), Some("nonce too far in past")); let (result, _) = drive - .merge_identity_nonce_v0( + .merge_identity_nonce( identity.id().to_buffer(), 8, &BlockInfo::default(), @@ -454,7 +454,7 @@ mod tests { assert_eq!(result.error_message(), Some("nonce too far in past")); let (result, _) = drive - .merge_identity_nonce_v0( + .merge_identity_nonce( identity.id().to_buffer(), IdentityNonce::MAX, &BlockInfo::default(), diff --git a/packages/rs-drive/src/drive/prove/prove_multiple/v0/mod.rs b/packages/rs-drive/src/drive/prove/prove_multiple/v0/mod.rs index bc7bf5abfe..21a2aae90c 100644 --- a/packages/rs-drive/src/drive/prove/prove_multiple/v0/mod.rs +++ b/packages/rs-drive/src/drive/prove/prove_multiple/v0/mod.rs @@ -24,6 +24,7 @@ impl Drive { /// # Returns /// Returns a `Result` with a `Vec` containing the proof data if the function succeeds, /// or an `Error` if the function fails. + #[inline(always)] pub(super) fn prove_multiple_v0( &self, identity_queries: &[IdentityDriveQuery], diff --git a/packages/rs-drive/src/drive/system/estimation_costs/for_total_system_credits_update/v0/mod.rs b/packages/rs-drive/src/drive/system/estimation_costs/for_total_system_credits_update/v0/mod.rs index d0ed16345c..a442ca21d6 100644 --- a/packages/rs-drive/src/drive/system/estimation_costs/for_total_system_credits_update/v0/mod.rs +++ b/packages/rs-drive/src/drive/system/estimation_costs/for_total_system_credits_update/v0/mod.rs @@ -15,6 +15,7 @@ impl Drive { /// /// This method operates on the provided HashMap, `estimated_costs_only_with_layer_info`, and adds /// new entries to it, representing the estimated costs for the total system credits update. + #[inline(always)] pub(super) fn add_estimation_costs_for_total_system_credits_update_v0( estimated_costs_only_with_layer_info: &mut HashMap, ) { diff --git a/packages/rs-drive/src/drive/system/protocol_version/fetch_next_protocol_version/v0/mod.rs b/packages/rs-drive/src/drive/system/protocol_version/fetch_next_protocol_version/v0/mod.rs index 4212321adf..dcca2a014f 100644 --- a/packages/rs-drive/src/drive/system/protocol_version/fetch_next_protocol_version/v0/mod.rs +++ b/packages/rs-drive/src/drive/system/protocol_version/fetch_next_protocol_version/v0/mod.rs @@ -11,6 +11,7 @@ use integer_encoding::VarInt; impl Drive { /// Gets the next protocol version from the backing store + #[inline(always)] pub(super) fn fetch_next_protocol_version_v0( &self, transaction: TransactionArg, diff --git a/packages/rs-drive/src/drive/system/protocol_version/set_next_protocol_version_operations/v0/mod.rs b/packages/rs-drive/src/drive/system/protocol_version/set_next_protocol_version_operations/v0/mod.rs index 451fc5ef43..5bcd133eb5 100644 --- a/packages/rs-drive/src/drive/system/protocol_version/set_next_protocol_version_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/system/protocol_version/set_next_protocol_version_operations/v0/mod.rs @@ -12,6 +12,7 @@ use integer_encoding::VarInt; impl Drive { /// Sets the next protocol version + #[inline(always)] pub(super) fn set_next_protocol_version_operations_v0( &self, protocol_version: ProtocolVersion, diff --git a/packages/rs-drive/src/drive/verify/contract/verify_contract/v0/mod.rs b/packages/rs-drive/src/drive/verify/contract/verify_contract/v0/mod.rs index a39cd8070a..cb9e20885f 100644 --- a/packages/rs-drive/src/drive/verify/contract/verify_contract/v0/mod.rs +++ b/packages/rs-drive/src/drive/verify/contract/verify_contract/v0/mod.rs @@ -34,6 +34,7 @@ impl Drive { /// /// - The proof is corrupted. /// - The GroveDb query fails. + #[inline(always)] pub(super) fn verify_contract_v0( proof: &[u8], contract_known_keeps_history: Option, diff --git a/packages/rs-drive/src/drive/verify/contract/verify_contract_history/v0/mod.rs b/packages/rs-drive/src/drive/verify/contract/verify_contract_history/v0/mod.rs index c6fdd207ce..9ef543589f 100644 --- a/packages/rs-drive/src/drive/verify/contract/verify_contract_history/v0/mod.rs +++ b/packages/rs-drive/src/drive/verify/contract/verify_contract_history/v0/mod.rs @@ -36,6 +36,7 @@ impl Drive { /// - The proof is corrupted. /// - The GroveDb query fails. /// - The contract serialization fails. + #[inline(always)] pub(super) fn verify_contract_history_v0( proof: &[u8], contract_id: [u8; 32], diff --git a/packages/rs-drive/src/drive/verify/document/verify_proof/v0/mod.rs b/packages/rs-drive/src/drive/verify/document/verify_proof/v0/mod.rs index 5225ceeb02..c45d0e11c8 100644 --- a/packages/rs-drive/src/drive/verify/document/verify_proof/v0/mod.rs +++ b/packages/rs-drive/src/drive/verify/document/verify_proof/v0/mod.rs @@ -29,6 +29,7 @@ impl<'a> DriveQuery<'a> { /// This function will return an `Error` variant if: /// 1. The proof verification fails. /// 2. There is a deserialization error when parsing the serialized document(s) into `Document` struct(s). + #[inline(always)] pub(super) fn verify_proof_v0( &self, proof: &[u8], diff --git a/packages/rs-drive/src/drive/verify/document/verify_proof_keep_serialized/v0/mod.rs b/packages/rs-drive/src/drive/verify/document/verify_proof_keep_serialized/v0/mod.rs index b7a8f206a9..812eb5ccf9 100644 --- a/packages/rs-drive/src/drive/verify/document/verify_proof_keep_serialized/v0/mod.rs +++ b/packages/rs-drive/src/drive/verify/document/verify_proof_keep_serialized/v0/mod.rs @@ -23,6 +23,7 @@ impl<'a> DriveQuery<'a> { /// * The start at document is not present in proof and it is expected to be. /// * The path query fails to verify against the given proof. /// * Converting the element into bytes fails. + #[inline(always)] pub(super) fn verify_proof_keep_serialized_v0( &self, proof: &[u8], diff --git a/packages/rs-drive/src/drive/verify/document/verify_start_at_document_in_proof/v0/mod.rs b/packages/rs-drive/src/drive/verify/document/verify_start_at_document_in_proof/v0/mod.rs index 5d7594f2c2..921a4a16c3 100644 --- a/packages/rs-drive/src/drive/verify/document/verify_start_at_document_in_proof/v0/mod.rs +++ b/packages/rs-drive/src/drive/verify/document/verify_start_at_document_in_proof/v0/mod.rs @@ -29,6 +29,7 @@ impl<'a> DriveQuery<'a> { /// This function returns an Error in the following cases: /// * If the proof is corrupted (wrong path, wrong key, etc.). /// * If the provided proof has an incorrect number of elements. + #[inline(always)] pub(super) fn verify_start_at_document_in_proof_v0( &self, proof: &[u8], diff --git a/packages/rs-drive/src/drive/verify/identity/verify_full_identity_by_identity_id/v0/mod.rs b/packages/rs-drive/src/drive/verify/identity/verify_full_identity_by_identity_id/v0/mod.rs index b2dc872406..bef45fa57d 100644 --- a/packages/rs-drive/src/drive/verify/identity/verify_full_identity_by_identity_id/v0/mod.rs +++ b/packages/rs-drive/src/drive/verify/identity/verify_full_identity_by_identity_id/v0/mod.rs @@ -40,6 +40,7 @@ impl Drive { /// - The identity ID does not correspond to a valid full identity. /// - The balance, revision, or keys information is missing or incorrect. /// + #[inline(always)] pub(super) fn verify_full_identity_by_identity_id_v0( proof: &[u8], is_proof_subset: bool, diff --git a/packages/rs-drive/src/drive/verify/identity/verify_full_identity_by_public_key_hash/v0/mod.rs b/packages/rs-drive/src/drive/verify/identity/verify_full_identity_by_public_key_hash/v0/mod.rs index 9f8c971c81..70d3f6a8b7 100644 --- a/packages/rs-drive/src/drive/verify/identity/verify_full_identity_by_public_key_hash/v0/mod.rs +++ b/packages/rs-drive/src/drive/verify/identity/verify_full_identity_by_public_key_hash/v0/mod.rs @@ -37,6 +37,7 @@ impl Drive { /// * The public key hash does not correspond to a valid identity ID. /// * The identity ID does not correspond to a valid full identity. /// + #[inline(always)] pub(super) fn verify_full_identity_by_public_key_hash_v0( proof: &[u8], public_key_hash: [u8; 20], diff --git a/packages/rs-drive/src/drive/verify/identity/verify_identity_id_by_public_key_hash/v0/mod.rs b/packages/rs-drive/src/drive/verify/identity/verify_identity_id_by_public_key_hash/v0/mod.rs index fb83fac0dc..5ff239fc96 100644 --- a/packages/rs-drive/src/drive/verify/identity/verify_identity_id_by_public_key_hash/v0/mod.rs +++ b/packages/rs-drive/src/drive/verify/identity/verify_identity_id_by_public_key_hash/v0/mod.rs @@ -31,6 +31,7 @@ impl Drive { /// - The proved key value is not for the correct path or key in unique key hashes. /// - More than one identity ID is found. /// + #[inline(always)] pub(super) fn verify_identity_id_by_public_key_hash_v0( proof: &[u8], is_proof_subset: bool, diff --git a/packages/rs-drive/src/drive/verify/identity/verify_identity_keys_by_identity_id/v0/mod.rs b/packages/rs-drive/src/drive/verify/identity/verify_identity_keys_by_identity_id/v0/mod.rs index 3d239241e0..2958beb75e 100644 --- a/packages/rs-drive/src/drive/verify/identity/verify_identity_keys_by_identity_id/v0/mod.rs +++ b/packages/rs-drive/src/drive/verify/identity/verify_identity_keys_by_identity_id/v0/mod.rs @@ -40,6 +40,7 @@ impl Drive { /// - The identity ID does not correspond to a valid partial identity. /// - The keys information is missing or incorrect. /// + #[inline(always)] pub(super) fn verify_identity_keys_by_identity_id_v0( proof: &[u8], key_request: IdentityKeysRequest, diff --git a/packages/rs-drive/src/drive/verify/single_document/verify_proof/v0/mod.rs b/packages/rs-drive/src/drive/verify/single_document/verify_proof/v0/mod.rs index f289666a16..6461b5d705 100644 --- a/packages/rs-drive/src/drive/verify/single_document/verify_proof/v0/mod.rs +++ b/packages/rs-drive/src/drive/verify/single_document/verify_proof/v0/mod.rs @@ -31,6 +31,7 @@ impl SingleDocumentDriveQuery { /// - The proof is corrupted. /// - The GroveDb query fails. /// - The document serialization fails. + #[inline(always)] pub(super) fn verify_proof_v0( &self, is_subset: bool, diff --git a/packages/rs-drive/src/drive/verify/single_document/verify_proof_keep_serialized/v0/mod.rs b/packages/rs-drive/src/drive/verify/single_document/verify_proof_keep_serialized/v0/mod.rs index 3cb6b107be..6eb25d7581 100644 --- a/packages/rs-drive/src/drive/verify/single_document/verify_proof_keep_serialized/v0/mod.rs +++ b/packages/rs-drive/src/drive/verify/single_document/verify_proof_keep_serialized/v0/mod.rs @@ -28,6 +28,7 @@ impl SingleDocumentDriveQuery { /// - The proof is corrupted. /// - The GroveDb verification fails. /// - The elements returned are not items, the proof is incorrect. + #[inline(always)] pub(super) fn verify_proof_keep_serialized_v0( &self, is_subset: bool, diff --git a/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs b/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs index 3f6c34cb8c..f0eb680a00 100644 --- a/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs +++ b/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs @@ -36,6 +36,7 @@ use crate::error::proof::ProofError; use crate::query::SingleDocumentDriveQuery; impl Drive { + #[inline(always)] pub(super) fn verify_state_transition_was_executed_with_proof_v0( state_transition: &StateTransition, block_info: &BlockInfo, diff --git a/packages/rs-drive/src/drive/verify/system/verify_epoch_infos/v0/mod.rs b/packages/rs-drive/src/drive/verify/system/verify_epoch_infos/v0/mod.rs index cea7d679d2..beaaf3f69e 100644 --- a/packages/rs-drive/src/drive/verify/system/verify_epoch_infos/v0/mod.rs +++ b/packages/rs-drive/src/drive/verify/system/verify_epoch_infos/v0/mod.rs @@ -38,6 +38,7 @@ impl Drive { /// /// - The proof is corrupted. /// - The GroveDb query fails. + #[inline(always)] pub(super) fn verify_epoch_infos_v0( proof: &[u8], current_epoch: EpochIndex, diff --git a/packages/rs-drive/src/drive/verify/system/verify_upgrade_state/v0/mod.rs b/packages/rs-drive/src/drive/verify/system/verify_upgrade_state/v0/mod.rs index 63ff9e7e55..be917455bf 100644 --- a/packages/rs-drive/src/drive/verify/system/verify_upgrade_state/v0/mod.rs +++ b/packages/rs-drive/src/drive/verify/system/verify_upgrade_state/v0/mod.rs @@ -28,6 +28,7 @@ impl Drive { /// /// - The proof is corrupted. /// - The GroveDb query fails. + #[inline(always)] pub(super) fn verify_upgrade_state_v0( proof: &[u8], ) -> Result<(RootHash, IntMap), Error> { diff --git a/packages/rs-drive/src/drive/verify/system/verify_upgrade_vote_status/v0/mod.rs b/packages/rs-drive/src/drive/verify/system/verify_upgrade_vote_status/v0/mod.rs index 57172d286c..163eb60689 100644 --- a/packages/rs-drive/src/drive/verify/system/verify_upgrade_vote_status/v0/mod.rs +++ b/packages/rs-drive/src/drive/verify/system/verify_upgrade_vote_status/v0/mod.rs @@ -29,6 +29,7 @@ impl Drive { /// /// - The proof is corrupted. /// - The GroveDb query fails. + #[inline(always)] pub(super) fn verify_upgrade_vote_status_v0( proof: &[u8], start_protx_hash: Option<[u8; 32]>, diff --git a/packages/rs-platform-version/src/version/drive_versions.rs b/packages/rs-platform-version/src/version/drive_versions.rs index a484584fc6..e523ebbe60 100644 --- a/packages/rs-platform-version/src/version/drive_versions.rs +++ b/packages/rs-platform-version/src/version/drive_versions.rs @@ -361,6 +361,7 @@ pub struct DriveCreditPoolMethodVersions { pub epochs: DriveCreditPoolEpochsMethodVersions, pub pending_epoch_refunds: DriveCreditPoolPendingEpochRefundsMethodVersions, pub storage_fee_distribution_pool: DriveCreditPoolStorageFeeDistributionPoolMethodVersions, + pub unpaid_epoch: DriveCreditPoolUnpaidEpochMethodVersions, } #[derive(Clone, Debug, Default)] @@ -382,6 +383,11 @@ pub struct DriveCreditPoolEpochsMethodVersions { pub is_epochs_proposers_tree_empty: FeatureVersion, } +#[derive(Clone, Debug, Default)] +pub struct DriveCreditPoolUnpaidEpochMethodVersions { + pub get_unpaid_epoch_index: FeatureVersion, +} + #[derive(Clone, Debug, Default)] pub struct DriveCreditPoolPendingEpochRefundsMethodVersions { pub add_delete_pending_epoch_refunds_except_specified: FeatureVersion, diff --git a/packages/rs-platform-version/src/version/mocks/v2_test.rs b/packages/rs-platform-version/src/version/mocks/v2_test.rs index 8f7f572172..6190251017 100644 --- a/packages/rs-platform-version/src/version/mocks/v2_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v2_test.rs @@ -38,16 +38,16 @@ use crate::version::drive_versions::{ DriveCreditPoolEpochsMethodVersions, DriveCreditPoolMethodVersions, DriveCreditPoolPendingEpochRefundsMethodVersions, DriveCreditPoolStorageFeeDistributionPoolMethodVersions, - DriveDataContractOperationMethodVersions, DriveDocumentDeleteMethodVersions, - DriveDocumentEstimationCostsMethodVersions, DriveDocumentIndexUniquenessMethodVersions, - DriveDocumentInsertMethodVersions, DriveDocumentMethodVersions, - DriveDocumentQueryMethodVersions, DriveDocumentUpdateMethodVersions, - DriveEstimatedCostsMethodVersions, DriveFeesMethodVersions, DriveGroveApplyMethodVersions, - DriveGroveBasicMethodVersions, DriveGroveBatchMethodVersions, DriveGroveCostMethodVersions, - DriveGroveMethodVersions, DriveIdentityContractInfoMethodVersions, - DriveIdentityCostEstimationMethodVersions, DriveIdentityFetchAttributesMethodVersions, - DriveIdentityFetchFullIdentityMethodVersions, DriveIdentityFetchMethodVersions, - DriveIdentityFetchPartialIdentityMethodVersions, + DriveCreditPoolUnpaidEpochMethodVersions, DriveDataContractOperationMethodVersions, + DriveDocumentDeleteMethodVersions, DriveDocumentEstimationCostsMethodVersions, + DriveDocumentIndexUniquenessMethodVersions, DriveDocumentInsertMethodVersions, + DriveDocumentMethodVersions, DriveDocumentQueryMethodVersions, + DriveDocumentUpdateMethodVersions, DriveEstimatedCostsMethodVersions, DriveFeesMethodVersions, + DriveGroveApplyMethodVersions, DriveGroveBasicMethodVersions, DriveGroveBatchMethodVersions, + DriveGroveCostMethodVersions, DriveGroveMethodVersions, + DriveIdentityContractInfoMethodVersions, DriveIdentityCostEstimationMethodVersions, + DriveIdentityFetchAttributesMethodVersions, DriveIdentityFetchFullIdentityMethodVersions, + DriveIdentityFetchMethodVersions, DriveIdentityFetchPartialIdentityMethodVersions, DriveIdentityFetchPublicKeyHashesMethodVersions, DriveIdentityInsertMethodVersions, DriveIdentityKeyHashesToIdentityInsertMethodVersions, DriveIdentityKeysFetchMethodVersions, DriveIdentityKeysInsertMethodVersions, DriveIdentityKeysMethodVersions, @@ -134,6 +134,9 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { DriveCreditPoolStorageFeeDistributionPoolMethodVersions { get_storage_fees_from_distribution_pool: 0, }, + unpaid_epoch: DriveCreditPoolUnpaidEpochMethodVersions { + get_unpaid_epoch_index: 0, + }, }, protocol_upgrade: DriveProtocolUpgradeVersions { clear_version_information: 0, diff --git a/packages/rs-platform-version/src/version/mocks/v3_test.rs b/packages/rs-platform-version/src/version/mocks/v3_test.rs index 9e794e3cda..4bb33961fc 100644 --- a/packages/rs-platform-version/src/version/mocks/v3_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v3_test.rs @@ -38,16 +38,16 @@ use crate::version::drive_versions::{ DriveCreditPoolEpochsMethodVersions, DriveCreditPoolMethodVersions, DriveCreditPoolPendingEpochRefundsMethodVersions, DriveCreditPoolStorageFeeDistributionPoolMethodVersions, - DriveDataContractOperationMethodVersions, DriveDocumentDeleteMethodVersions, - DriveDocumentEstimationCostsMethodVersions, DriveDocumentIndexUniquenessMethodVersions, - DriveDocumentInsertMethodVersions, DriveDocumentMethodVersions, - DriveDocumentQueryMethodVersions, DriveDocumentUpdateMethodVersions, - DriveEstimatedCostsMethodVersions, DriveFeesMethodVersions, DriveGroveApplyMethodVersions, - DriveGroveBasicMethodVersions, DriveGroveBatchMethodVersions, DriveGroveCostMethodVersions, - DriveGroveMethodVersions, DriveIdentityContractInfoMethodVersions, - DriveIdentityCostEstimationMethodVersions, DriveIdentityFetchAttributesMethodVersions, - DriveIdentityFetchFullIdentityMethodVersions, DriveIdentityFetchMethodVersions, - DriveIdentityFetchPartialIdentityMethodVersions, + DriveCreditPoolUnpaidEpochMethodVersions, DriveDataContractOperationMethodVersions, + DriveDocumentDeleteMethodVersions, DriveDocumentEstimationCostsMethodVersions, + DriveDocumentIndexUniquenessMethodVersions, DriveDocumentInsertMethodVersions, + DriveDocumentMethodVersions, DriveDocumentQueryMethodVersions, + DriveDocumentUpdateMethodVersions, DriveEstimatedCostsMethodVersions, DriveFeesMethodVersions, + DriveGroveApplyMethodVersions, DriveGroveBasicMethodVersions, DriveGroveBatchMethodVersions, + DriveGroveCostMethodVersions, DriveGroveMethodVersions, + DriveIdentityContractInfoMethodVersions, DriveIdentityCostEstimationMethodVersions, + DriveIdentityFetchAttributesMethodVersions, DriveIdentityFetchFullIdentityMethodVersions, + DriveIdentityFetchMethodVersions, DriveIdentityFetchPartialIdentityMethodVersions, DriveIdentityFetchPublicKeyHashesMethodVersions, DriveIdentityInsertMethodVersions, DriveIdentityKeyHashesToIdentityInsertMethodVersions, DriveIdentityKeysFetchMethodVersions, DriveIdentityKeysInsertMethodVersions, DriveIdentityKeysMethodVersions, @@ -134,6 +134,9 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { DriveCreditPoolStorageFeeDistributionPoolMethodVersions { get_storage_fees_from_distribution_pool: 0, }, + unpaid_epoch: DriveCreditPoolUnpaidEpochMethodVersions { + get_unpaid_epoch_index: 0, + }, }, protocol_upgrade: DriveProtocolUpgradeVersions { clear_version_information: 0, diff --git a/packages/rs-platform-version/src/version/v1.rs b/packages/rs-platform-version/src/version/v1.rs index f89e00da7c..94ffca820f 100644 --- a/packages/rs-platform-version/src/version/v1.rs +++ b/packages/rs-platform-version/src/version/v1.rs @@ -38,16 +38,16 @@ use crate::version::drive_versions::{ DriveCreditPoolEpochsMethodVersions, DriveCreditPoolMethodVersions, DriveCreditPoolPendingEpochRefundsMethodVersions, DriveCreditPoolStorageFeeDistributionPoolMethodVersions, - DriveDataContractOperationMethodVersions, DriveDocumentDeleteMethodVersions, - DriveDocumentEstimationCostsMethodVersions, DriveDocumentIndexUniquenessMethodVersions, - DriveDocumentInsertMethodVersions, DriveDocumentMethodVersions, - DriveDocumentQueryMethodVersions, DriveDocumentUpdateMethodVersions, - DriveEstimatedCostsMethodVersions, DriveFeesMethodVersions, DriveGroveApplyMethodVersions, - DriveGroveBasicMethodVersions, DriveGroveBatchMethodVersions, DriveGroveCostMethodVersions, - DriveGroveMethodVersions, DriveIdentityContractInfoMethodVersions, - DriveIdentityCostEstimationMethodVersions, DriveIdentityFetchAttributesMethodVersions, - DriveIdentityFetchFullIdentityMethodVersions, DriveIdentityFetchMethodVersions, - DriveIdentityFetchPartialIdentityMethodVersions, + DriveCreditPoolUnpaidEpochMethodVersions, DriveDataContractOperationMethodVersions, + DriveDocumentDeleteMethodVersions, DriveDocumentEstimationCostsMethodVersions, + DriveDocumentIndexUniquenessMethodVersions, DriveDocumentInsertMethodVersions, + DriveDocumentMethodVersions, DriveDocumentQueryMethodVersions, + DriveDocumentUpdateMethodVersions, DriveEstimatedCostsMethodVersions, DriveFeesMethodVersions, + DriveGroveApplyMethodVersions, DriveGroveBasicMethodVersions, DriveGroveBatchMethodVersions, + DriveGroveCostMethodVersions, DriveGroveMethodVersions, + DriveIdentityContractInfoMethodVersions, DriveIdentityCostEstimationMethodVersions, + DriveIdentityFetchAttributesMethodVersions, DriveIdentityFetchFullIdentityMethodVersions, + DriveIdentityFetchMethodVersions, DriveIdentityFetchPartialIdentityMethodVersions, DriveIdentityFetchPublicKeyHashesMethodVersions, DriveIdentityInsertMethodVersions, DriveIdentityKeyHashesToIdentityInsertMethodVersions, DriveIdentityKeysFetchMethodVersions, DriveIdentityKeysInsertMethodVersions, DriveIdentityKeysMethodVersions, @@ -131,6 +131,9 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { DriveCreditPoolStorageFeeDistributionPoolMethodVersions { get_storage_fees_from_distribution_pool: 0, }, + unpaid_epoch: DriveCreditPoolUnpaidEpochMethodVersions { + get_unpaid_epoch_index: 0, + }, }, protocol_upgrade: DriveProtocolUpgradeVersions { clear_version_information: 0, From 02481fc17e9d0836b122f36651b0decacbe17ad2 Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Sun, 24 Mar 2024 22:28:04 +0700 Subject: [PATCH 110/191] feat(platform)!: various document validation improvements (#1795) --- .../methods/validation/v0/mod.rs | 20 ++-- .../src/errors/consensus/basic/basic_error.rs | 13 +-- ...tity_contract_nonce_out_of_bounds_error.rs | 25 ++-- ...ax_documents_transitions_exceeded_error.rs | 6 +- packages/rs-dpp/src/errors/consensus/codes.rs | 2 +- .../v0/identity_signed.rs | 9 +- .../validate_base_structure/v0/mod.rs | 28 +++-- .../methods/compile/mod.rs | 23 +++- .../methods/compile/v0/mod.rs | 59 +++++++++- .../check_tx_verification/v0/mod.rs | 98 +++++++--------- .../mod.rs | 4 - .../v0/mod.rs | 33 +----- .../state_transition/processor/v0/mod.rs | 107 +++++++----------- .../identity_nonce/v0/mod.rs | 14 ++- .../identity_contract_nonce/v0/mod.rs | 14 ++- .../state_v0/mod.rs | 3 + .../advanced_structure/v0/mod.rs | 37 +++++- .../state_transitions/documents_batch/mod.rs | 5 +- .../identity_credit_transfer/nonce/v0/mod.rs | 14 ++- .../nonce/v0/mod.rs | 14 ++- .../identity_update/nonce/v0/mod.rs | 14 ++- .../validate_uniqueness_of_data/mod.rs | 10 +- .../validate_uniqueness_of_data/v0/mod.rs | 44 ++++++- .../v0/mod.rs | 4 + .../v0/mod.rs | 6 + .../validate_document_uniqueness/v0/mod.rs | 4 + .../document_replace_transition_action/mod.rs | 30 ++++- .../v0/mod.rs | 10 ++ .../src/version/dpp_versions.rs | 2 + .../src/version/mocks/v2_test.rs | 2 + .../src/version/mocks/v3_test.rs | 2 + .../rs-platform-version/src/version/v1.rs | 2 + ...tity_contract_nonce_out_of_bounds_error.rs | 8 +- .../src/errors/consensus/consensus_error.rs | 2 +- 34 files changed, 442 insertions(+), 226 deletions(-) diff --git a/packages/rs-dpp/src/data_contract/methods/validation/v0/mod.rs b/packages/rs-dpp/src/data_contract/methods/validation/v0/mod.rs index 847d1399a6..0b6b79e17d 100644 --- a/packages/rs-dpp/src/data_contract/methods/validation/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/methods/validation/v0/mod.rs @@ -48,6 +48,15 @@ impl DataContract { DocumentTypeRef::V0(v0) => v0.json_schema_validator.deref(), }; + let json_value = match value.try_into_validating_json() { + Ok(json_value) => json_value, + Err(e) => { + return Ok(SimpleConsensusValidationResult::new_with_error( + ConsensusError::BasicError(BasicError::ValueError(e.into())), + )) + } + }; + // Compile json schema validator if it's not yet compiled if !validator.is_compiled(platform_version)? { // It is normal that we get a protocol error here, since the document type is coming @@ -64,14 +73,9 @@ impl DataContract { .try_to_validating_json() .map_err(ProtocolError::ValueError)?; - validator.compile(&root_json_schema, platform_version)?; - } - - match value.try_into_validating_json() { - Ok(json_value) => validator.validate(&json_value, platform_version), - Err(e) => Ok(SimpleConsensusValidationResult::new_with_error( - ConsensusError::BasicError(BasicError::ValueError(e.into())), - )), + validator.compile_and_validate(&root_json_schema, &json_value, platform_version) + } else { + validator.validate(&json_value, platform_version) } } diff --git a/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs b/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs index 516c49f9a5..fcf6f11083 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs @@ -21,12 +21,11 @@ use crate::consensus::basic::decode::{ use crate::consensus::basic::document::{ DataContractNotPresentError, DocumentTransitionsAreAbsentError, DuplicateDocumentTransitionsWithIdsError, DuplicateDocumentTransitionsWithIndicesError, - IdentityContractNonceOutOfBoundsError, InconsistentCompoundIndexDataError, - InvalidDocumentTransitionActionError, InvalidDocumentTransitionIdError, - InvalidDocumentTypeError, MaxDocumentsTransitionsExceededError, - MissingDataContractIdBasicError, MissingDocumentTransitionActionError, - MissingDocumentTransitionTypeError, MissingDocumentTypeError, - MissingPositionsInDocumentTypePropertiesError, + InconsistentCompoundIndexDataError, InvalidDocumentTransitionActionError, + InvalidDocumentTransitionIdError, InvalidDocumentTypeError, + MaxDocumentsTransitionsExceededError, MissingDataContractIdBasicError, + MissingDocumentTransitionActionError, MissingDocumentTransitionTypeError, + MissingDocumentTypeError, MissingPositionsInDocumentTypePropertiesError, NonceOutOfBoundsError, }; use crate::consensus::basic::identity::{ DataContractBoundsNotPresentError, DisablingKeyIdAlsoBeingAddedInSameTransitionError, @@ -183,7 +182,7 @@ pub enum BasicError { DuplicateDocumentTransitionsWithIndicesError(DuplicateDocumentTransitionsWithIndicesError), #[error(transparent)] - IdentityContractNonceOutOfBoundsError(IdentityContractNonceOutOfBoundsError), + NonceOutOfBoundsError(NonceOutOfBoundsError), #[error(transparent)] InconsistentCompoundIndexDataError(InconsistentCompoundIndexDataError), diff --git a/packages/rs-dpp/src/errors/consensus/basic/document/identity_contract_nonce_out_of_bounds_error.rs b/packages/rs-dpp/src/errors/consensus/basic/document/identity_contract_nonce_out_of_bounds_error.rs index cfa38282ac..6785b03e5e 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/document/identity_contract_nonce_out_of_bounds_error.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/document/identity_contract_nonce_out_of_bounds_error.rs @@ -9,34 +9,29 @@ use thiserror::Error; #[derive( Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, )] -#[error( - "Identity contract nonce is out of bounds: {}", - identity_contract_nonce -)] +#[error("Nonce is out of bounds: {}", nonce)] #[platform_serialize(unversioned)] -pub struct IdentityContractNonceOutOfBoundsError { +pub struct NonceOutOfBoundsError { /* DO NOT CHANGE ORDER OF FIELDS WITHOUT INTRODUCING OF NEW VERSION */ - identity_contract_nonce: IdentityNonce, + nonce: IdentityNonce, } -impl IdentityContractNonceOutOfBoundsError { - pub fn new(identity_contract_nonce: IdentityNonce) -> Self { - Self { - identity_contract_nonce, - } +impl NonceOutOfBoundsError { + pub fn new(nonce: IdentityNonce) -> Self { + Self { nonce: nonce } } pub fn identity_contract_nonce(&self) -> IdentityNonce { - self.identity_contract_nonce + self.nonce } } -impl From for ConsensusError { - fn from(err: IdentityContractNonceOutOfBoundsError) -> Self { - Self::BasicError(BasicError::IdentityContractNonceOutOfBoundsError(err)) +impl From for ConsensusError { + fn from(err: NonceOutOfBoundsError) -> Self { + Self::BasicError(BasicError::NonceOutOfBoundsError(err)) } } diff --git a/packages/rs-dpp/src/errors/consensus/basic/document/max_documents_transitions_exceeded_error.rs b/packages/rs-dpp/src/errors/consensus/basic/document/max_documents_transitions_exceeded_error.rs index 8ebd868154..549ae5d3fc 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/document/max_documents_transitions_exceeded_error.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/document/max_documents_transitions_exceeded_error.rs @@ -17,15 +17,15 @@ pub struct MaxDocumentsTransitionsExceededError { DO NOT CHANGE ORDER OF FIELDS WITHOUT INTRODUCING OF NEW VERSION */ - max_transitions: u32, + max_transitions: u16, } impl MaxDocumentsTransitionsExceededError { - pub fn new(max_transitions: u32) -> Self { + pub fn new(max_transitions: u16) -> Self { Self { max_transitions } } - pub fn max_transitions(&self) -> u32 { + pub fn max_transitions(&self) -> u16 { self.max_transitions } } diff --git a/packages/rs-dpp/src/errors/consensus/codes.rs b/packages/rs-dpp/src/errors/consensus/codes.rs index a843928069..67b765c460 100644 --- a/packages/rs-dpp/src/errors/consensus/codes.rs +++ b/packages/rs-dpp/src/errors/consensus/codes.rs @@ -103,7 +103,7 @@ impl ErrorWithCode for BasicError { Self::MissingPositionsInDocumentTypePropertiesError { .. } => 10411, Self::MaxDocumentsTransitionsExceededError { .. } => 10412, Self::DocumentTransitionsAreAbsentError { .. } => 10413, - Self::IdentityContractNonceOutOfBoundsError(_) => 10414, + Self::NonceOutOfBoundsError(_) => 10414, // Identity Errors: 10500-10599 Self::DuplicatedIdentityPublicKeyBasicError(_) => 10500, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/identity_signed.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/identity_signed.rs index c93ce54bca..fd4916864a 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/identity_signed.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/identity_signed.rs @@ -1,4 +1,4 @@ -use crate::identity::SecurityLevel::HIGH; +use crate::identity::SecurityLevel::{CRITICAL, HIGH, MEDIUM}; use crate::identity::{KeyID, SecurityLevel}; use crate::state_transition::documents_batch_transition::DocumentsBatchTransitionV0; @@ -14,7 +14,10 @@ impl StateTransitionIdentitySigned for DocumentsBatchTransitionV0 { } fn security_level_requirement(&self) -> Vec { - // TODO: should use contract_based_security_level_requirement instead - vec![HIGH] + // These are the available key levels that must sign the state transition + // However the fact that it is signed by one of these does not guarantee that it + // meets the security level requirement, as that is dictated from within the data + // contract + vec![CRITICAL, HIGH, MEDIUM] } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/validate_base_structure/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/validate_base_structure/v0/mod.rs index 5dd1ad582e..84ccb224aa 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/validate_base_structure/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/validate_base_structure/v0/mod.rs @@ -1,6 +1,6 @@ use crate::consensus::basic::document::{ DocumentTransitionsAreAbsentError, DuplicateDocumentTransitionsWithIdsError, - IdentityContractNonceOutOfBoundsError, MaxDocumentsTransitionsExceededError, + MaxDocumentsTransitionsExceededError, NonceOutOfBoundsError, }; use crate::consensus::basic::BasicError; @@ -19,8 +19,6 @@ use platform_version::version::PlatformVersion; use std::collections::btree_map::Entry; use std::collections::BTreeMap; -const MAX_TRANSITIONS_IN_BATCH: usize = 1; - impl DocumentsBatchTransition { #[inline(always)] pub(super) fn validate_base_structure_v0( @@ -33,9 +31,23 @@ impl DocumentsBatchTransition { )); } - if self.transitions().len() > MAX_TRANSITIONS_IN_BATCH { + let transitions_len = self.transitions().len(); + + if transitions_len > u16::MAX as usize + || transitions_len as u16 + > platform_version + .dpp + .state_transitions + .max_transitions_in_documents_batch + { return Ok(SimpleConsensusValidationResult::new_with_error( - MaxDocumentsTransitionsExceededError::new(MAX_TRANSITIONS_IN_BATCH as u32).into(), + MaxDocumentsTransitionsExceededError::new( + platform_version + .dpp + .state_transitions + .max_transitions_in_documents_batch, + ) + .into(), )); } @@ -63,10 +75,8 @@ impl DocumentsBatchTransition { // We need to make sure that the identity contract nonce is within the allowed bounds // This means that it is stored on 40 bits if transition.identity_contract_nonce() & MISSING_IDENTITY_REVISIONS_FILTER > 0 { - result.add_error(BasicError::IdentityContractNonceOutOfBoundsError( - IdentityContractNonceOutOfBoundsError::new( - transition.identity_contract_nonce(), - ), + result.add_error(BasicError::NonceOutOfBoundsError( + NonceOutOfBoundsError::new(transition.identity_contract_nonce()), )); } } diff --git a/packages/rs-dpp/src/validation/json_schema_validator/methods/compile/mod.rs b/packages/rs-dpp/src/validation/json_schema_validator/methods/compile/mod.rs index 834ad2cc75..fdeb79f2c9 100644 --- a/packages/rs-dpp/src/validation/json_schema_validator/methods/compile/mod.rs +++ b/packages/rs-dpp/src/validation/json_schema_validator/methods/compile/mod.rs @@ -1,5 +1,5 @@ use crate::data_contract::JsonValue; -use crate::validation::JsonSchemaValidator; +use crate::validation::{JsonSchemaValidator, SimpleConsensusValidationResult}; use crate::ProtocolError; use platform_version::version::PlatformVersion; @@ -26,6 +26,27 @@ impl JsonSchemaValidator { } } + pub fn compile_and_validate( + &self, + json_schema: &JsonValue, + json_value: &JsonValue, + platform_version: &PlatformVersion, + ) -> Result { + match platform_version + .dpp + .validation + .json_schema_validator + .compile_and_validate + { + 0 => self.compile_and_validate_v0(json_schema, json_value), + version => Err(ProtocolError::UnknownVersionMismatch { + method: "JsonSchemaLazyValidator.compile_and_validate".to_string(), + known_versions: vec![0], + received: version, + }), + } + } + pub fn is_compiled(&self, platform_version: &PlatformVersion) -> Result { match platform_version .dpp diff --git a/packages/rs-dpp/src/validation/json_schema_validator/methods/compile/v0/mod.rs b/packages/rs-dpp/src/validation/json_schema_validator/methods/compile/v0/mod.rs index d5e934983d..c9031d3e58 100644 --- a/packages/rs-dpp/src/validation/json_schema_validator/methods/compile/v0/mod.rs +++ b/packages/rs-dpp/src/validation/json_schema_validator/methods/compile/v0/mod.rs @@ -1,6 +1,6 @@ use crate::consensus::ConsensusError; use crate::data_contract::JsonValue; -use crate::validation::JsonSchemaValidator; +use crate::validation::{JsonSchemaValidator, SimpleConsensusValidationResult}; use crate::ProtocolError; use jsonschema::{JSONSchema, KeywordDefinition}; use serde_json::json; @@ -45,6 +45,63 @@ impl JsonSchemaValidator { Ok(true) } + #[inline(always)] + pub(super) fn compile_and_validate_v0( + &self, + json_schema: &JsonValue, + json_value: &JsonValue, + ) -> Result { + let mut validator_guard = self.validator.write().unwrap(); + + // Check again to ensure no other thread has modified it after dropping the read lock + if let Some(validator) = validator_guard.as_ref() { + match validator.validate(json_value) { + Ok(_) => Ok(SimpleConsensusValidationResult::new()), + Err(validation_errors) => { + let errors: Vec = + validation_errors.map(ConsensusError::from).collect(); + + Ok(SimpleConsensusValidationResult::new_with_errors(errors)) + } + } + } else { + let validator = JSONSchema::options() + .with_meta_schemas() + .should_ignore_unknown_formats(false) + .should_validate_formats(true) + .with_draft(jsonschema::Draft::Draft202012) + .clone() // doesn't work otherwise + .add_keyword( + "byteArray", + KeywordDefinition::Schema(json!({ + "items": { + "type": "integer", + "minimum": 0, + "maximum": 255, + }, + })), + ) + .compile(json_schema) + .map_err(|error| { + // Todo: not sure this is a consensus error + ProtocolError::ConsensusError(Box::new(ConsensusError::from(error))) + })?; + + let validation_result = if let Err(validation_errors) = validator.validate(json_value) { + let errors: Vec = + validation_errors.map(ConsensusError::from).collect(); + + Ok(SimpleConsensusValidationResult::new_with_errors(errors)) + } else { + Ok(SimpleConsensusValidationResult::new()) + }; + + *validator_guard = Some(validator); + + validation_result + } + } + #[inline(always)] pub(super) fn is_compiled_v0(&self) -> bool { let validator_guard = self.validator.read().unwrap(); diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs index 0e2e4b91b7..8f97dad370 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs @@ -6,6 +6,7 @@ use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::rpc::core::CoreRPCLike; use dpp::identity::state_transition::OptionallyAssetLockProved; use dpp::prelude::ConsensusValidationResult; +use dpp::ProtocolError; use dpp::state_transition::{StateTransition}; use dpp::version::{DefaultForPlatformVersion, PlatformVersion}; @@ -58,9 +59,13 @@ pub(super) fn state_transition_to_execution_event_for_check_tx_v0<'a, C: CoreRPC platform_version, )?; - if state_transition.has_basic_structure_validation() { - // First we validate the basic structure - let result = state_transition.validate_basic_structure(platform_version)?; + if state_transition.has_nonces_validation() { + let result = state_transition.validate_nonces( + &platform.into(), + platform.state.last_block_info(), + None, + platform_version, + )?; if !result.is_valid() { return Ok( @@ -71,13 +76,9 @@ pub(super) fn state_transition_to_execution_event_for_check_tx_v0<'a, C: CoreRPC } } - if state_transition.has_nonces_validation() { - let result = state_transition.validate_nonces( - &platform.into(), - platform.state.last_block_info(), - None, - platform_version, - )?; + if state_transition.has_basic_structure_validation() { + // First we validate the basic structure + let result = state_transition.validate_basic_structure(platform_version)?; if !result.is_valid() { return Ok( @@ -88,8 +89,25 @@ pub(super) fn state_transition_to_execution_event_for_check_tx_v0<'a, C: CoreRPC } } - let action = if state_transition.requires_advance_structure_validation_from_state() - { + // Validating signatures + let result = state_transition.validate_identity_and_signatures( + platform.drive, + None, + &mut state_transition_execution_context, + platform_version, + )?; + + if !result.is_valid() { + return Ok( + ConsensusValidationResult::>::new_with_errors( + result.errors, + ), + ); + } + + let mut maybe_identity = result.into_data()?; + + let action = if state_transition.has_advanced_structure_validation_with_state() { let state_transition_action_result = state_transition.transform_into_action( platform, platform.state.last_block_info(), @@ -106,10 +124,19 @@ pub(super) fn state_transition_to_execution_event_for_check_tx_v0<'a, C: CoreRPC } let action = state_transition_action_result.into_data()?; + let identity = + maybe_identity + .as_ref() + .ok_or(ProtocolError::CorruptedCodeExecution( + "the identity should always be known on advanced structure validation" + .to_string(), + ))?; + // Validating structure let result = state_transition.validate_advanced_structure_from_state( &platform.into(), &action, + identity, platform_version, )?; @@ -125,53 +152,6 @@ pub(super) fn state_transition_to_execution_event_for_check_tx_v0<'a, C: CoreRPC None }; - // We want to validate the signature before we check that the signature security level is good. - - let action = if state_transition - .requires_state_to_validate_identity_and_signatures() - { - if let Some(action) = action { - Some(action) - } else { - let state_transition_action_result = state_transition - .transform_into_action( - platform, - platform.state.last_block_info(), - ValidationMode::CheckTx, - &mut state_transition_execution_context, - None, - )?; - if !state_transition_action_result.is_valid_with_data() { - return Ok( - ConsensusValidationResult::>::new_with_errors( - state_transition_action_result.errors, - ), - ); - } - Some(state_transition_action_result.into_data()?) - } - } else { - None - }; - - // Validating signatures - let result = state_transition.validate_identity_and_signatures( - platform.drive, - action.as_ref(), - None, - &mut state_transition_execution_context, - platform_version, - )?; - - if !result.is_valid() { - return Ok( - ConsensusValidationResult::>::new_with_errors( - result.errors, - ), - ); - } - let mut maybe_identity = result.into_data()?; - if state_transition.has_balance_validation() { let result = state_transition.validate_balance( maybe_identity.as_mut(), diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_state_transition_identity_signed/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_state_transition_identity_signed/mod.rs index 30985f0850..2d83765796 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_state_transition_identity_signed/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_state_transition_identity_signed/mod.rs @@ -4,7 +4,6 @@ use dpp::validation::ConsensusValidationResult; use dpp::version::{PlatformVersion}; use drive::drive::Drive; use drive::grovedb::TransactionArg; -use drive::state_transition_action::StateTransitionAction; use crate::error::Error; use crate::error::execution::ExecutionError; use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; @@ -16,7 +15,6 @@ pub trait ValidateStateTransitionIdentitySignature { fn validate_state_transition_identity_signed( &self, drive: &Drive, - action: Option<&StateTransitionAction>, request_revision: bool, transaction: TransactionArg, execution_context: &mut StateTransitionExecutionContext, @@ -28,7 +26,6 @@ impl ValidateStateTransitionIdentitySignature for StateTransition { fn validate_state_transition_identity_signed( &self, drive: &Drive, - action: Option<&StateTransitionAction>, request_revision: bool, transaction: TransactionArg, execution_context: &mut StateTransitionExecutionContext, @@ -43,7 +40,6 @@ impl ValidateStateTransitionIdentitySignature for StateTransition { { 0 => self.validate_state_transition_identity_signed_v0( drive, - action, request_revision, transaction, execution_context, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_state_transition_identity_signed/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_state_transition_identity_signed/v0/mod.rs index 82afdd2418..6f47ec2eed 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_state_transition_identity_signed/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_state_transition_identity_signed/v0/mod.rs @@ -15,7 +15,6 @@ use crate::execution::types::state_transition_execution_context::{ }; use dpp::consensus::ConsensusError; -use crate::error::execution::ExecutionError; use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; use dpp::state_transition::StateTransition; use dpp::validation::ConsensusValidationResult; @@ -32,7 +31,6 @@ use drive::dpp::identity::KeyType; use drive::drive::identity::key::fetch::IdentityKeysRequest; use drive::drive::Drive; use drive::grovedb::TransactionArg; -use drive::state_transition_action::StateTransitionAction; use lazy_static::lazy_static; use std::collections::HashSet; @@ -50,7 +48,6 @@ pub(super) trait ValidateStateTransitionIdentitySignatureV0<'a> { fn validate_state_transition_identity_signed_v0( &self, drive: &Drive, - action: Option<&StateTransitionAction>, request_revision: bool, transaction: TransactionArg, execution_context: &mut StateTransitionExecutionContext, @@ -62,7 +59,6 @@ impl<'a> ValidateStateTransitionIdentitySignatureV0<'a> for StateTransition { fn validate_state_transition_identity_signed_v0( &self, drive: &Drive, - action: Option<&StateTransitionAction>, request_identity_revision: bool, transaction: TransactionArg, execution_context: &mut StateTransitionExecutionContext, @@ -78,34 +74,11 @@ impl<'a> ValidateStateTransitionIdentitySignatureV0<'a> for StateTransition { let owner_id = self.owner_id(); - let security_levels = match self { - StateTransition::DocumentsBatch(_) => { - // We will have an action during consensus validation, but not on mempool check_tx - if let Some(action) = action { - let StateTransitionAction::DocumentsBatchAction(documents_batch_action) = - action - else { - return Err(Error::Execution(ExecutionError::CorruptedCodeExecution( - "we expect a documents batch state transition action when validating the signature of the documents batch transition", - ))); - }; - documents_batch_action.contract_based_security_level_requirement() - } else { - // In this case we just validate the transition - // If it is not valid during consensus validation because the key wasn't the - // right level then we will disable the key as it most likely is an attack - self.security_level_requirement() - .ok_or(ProtocolError::CorruptedCodeExecution( - "state_transition does not have security level".to_string(), - )) - } - } - _ => self - .security_level_requirement() + let security_levels = + self.security_level_requirement() .ok_or(ProtocolError::CorruptedCodeExecution( "state_transition does not have security level".to_string(), - )), - }?; + ))?; let purpose = self .purpose_requirement() diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs index d8b1eff9d8..1344ad2100 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs @@ -35,30 +35,9 @@ pub(in crate::execution) fn process_state_transition_v0<'a, C: CoreRPCLike>( let mut state_transition_execution_context = StateTransitionExecutionContext::default_for_platform_version(platform_version)?; - let action = if state_transition.requires_state_to_validate_identity_and_signatures() { - let state_transition_action_result = state_transition.transform_into_action( - platform, - block_info, - ValidationMode::Validator, - &mut state_transition_execution_context, - transaction, - )?; - if !state_transition_action_result.is_valid_with_data() { - return Ok( - ConsensusValidationResult::::new_with_errors( - state_transition_action_result.errors, - ), - ); - } - Some(state_transition_action_result.into_data()?) - } else { - None - }; - // Validating signatures let result = state_transition.validate_identity_and_signatures( platform.drive, - action.as_ref(), transaction, &mut state_transition_execution_context, platform_version, @@ -111,7 +90,7 @@ pub(in crate::execution) fn process_state_transition_v0<'a, C: CoreRPCLike>( } } - if state_transition.has_advanced_structure_validation() { + if state_transition.has_advanced_structure_validation_without_state() { // Next we have advanced structure validation, this is structure validation that does not require // state but isn't checked on check_tx. If advanced structure fails identity nonces or identity // contract nonces will be bumped @@ -139,35 +118,38 @@ pub(in crate::execution) fn process_state_transition_v0<'a, C: CoreRPCLike>( } } - let action = if state_transition.requires_advance_structure_validation_from_state() { - let action = if let Some(action) = action { - action - } else { - let state_transition_action_result = state_transition.transform_into_action( - platform, - block_info, - ValidationMode::Validator, - &mut state_transition_execution_context, - transaction, - )?; - if !state_transition_action_result.is_valid_with_data() { - return state_transition_action_result.map_result(|action| { - ExecutionEvent::create_from_state_transition_action( - action, - maybe_identity, - platform.state.last_committed_block_epoch_ref(), - state_transition_execution_context, - platform_version, - ) - }); - } - state_transition_action_result.into_data()? - }; + let action = if state_transition.has_advanced_structure_validation_with_state() { + let state_transition_action_result = state_transition.transform_into_action( + platform, + block_info, + ValidationMode::Validator, + &mut state_transition_execution_context, + transaction, + )?; + if !state_transition_action_result.is_valid_with_data() { + return state_transition_action_result.map_result(|action| { + ExecutionEvent::create_from_state_transition_action( + action, + maybe_identity, + platform.state.last_committed_block_epoch_ref(), + state_transition_execution_context, + platform_version, + ) + }); + } + let action = state_transition_action_result.into_data()?; + + let identity_ref = maybe_identity.as_ref().ok_or(Error::Execution( + ExecutionError::CorruptedCodeExecution( + "The identity must be known on advanced structure validation", + ), + ))?; // Validating structure let result = state_transition.validate_advanced_structure_from_state( &platform.into(), &action, + identity_ref, platform_version, )?; if !result.is_valid() { @@ -243,16 +225,10 @@ pub(crate) trait StateTransitionSignatureValidationV0 { fn validate_identity_and_signatures( &self, drive: &Drive, - action: Option<&StateTransitionAction>, tx: TransactionArg, execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion, ) -> Result>, Error>; - - /// This means we should transform into the action before validation of the identity and signatures - fn requires_state_to_validate_identity_and_signatures(&self) -> bool { - false - } } /// A trait for validating state transitions within a blockchain. @@ -302,7 +278,7 @@ pub(crate) trait StateTransitionAdvancedStructureValidationV0 { /// True if the state transition has advanced structure validation. /// This structure validation makes users pay if there is a failure - fn has_advanced_structure_validation(&self) -> bool; + fn has_advanced_structure_validation_without_state(&self) -> bool; } /// A trait for validating state transitions within a blockchain. @@ -348,11 +324,12 @@ pub(crate) trait StateTransitionStructureKnownInStateValidationV0 { &self, platform: &PlatformStateRef, action: &StateTransitionAction, + identity: &PartialIdentity, platform_version: &PlatformVersion, ) -> Result, Error>; /// This means we should transform into the action before validation of the structure - fn requires_advance_structure_validation_from_state(&self) -> bool { + fn has_advanced_structure_validation_with_state(&self) -> bool { false } } @@ -522,7 +499,7 @@ impl StateTransitionBalanceValidationV0 for StateTransition { } impl StateTransitionAdvancedStructureValidationV0 for StateTransition { - fn has_advanced_structure_validation(&self) -> bool { + fn has_advanced_structure_validation_without_state(&self) -> bool { matches!(self, StateTransition::IdentityUpdate(_)) } @@ -574,18 +551,22 @@ impl StateTransitionStructureKnownInStateValidationV0 for StateTransition { &self, platform: &PlatformStateRef, action: &StateTransitionAction, + identity: &PartialIdentity, platform_version: &PlatformVersion, ) -> Result, Error> { match self { - StateTransition::DocumentsBatch(st) => { - st.validate_advanced_structure_from_state(platform, action, platform_version) - } + StateTransition::DocumentsBatch(st) => st.validate_advanced_structure_from_state( + platform, + action, + identity, + platform_version, + ), _ => Ok(ConsensusValidationResult::new()), } } /// This means we should transform into the action before validation of the structure - fn requires_advance_structure_validation_from_state(&self) -> bool { + fn has_advanced_structure_validation_with_state(&self) -> bool { matches!(self, StateTransition::DocumentsBatch(_)) } } @@ -594,7 +575,6 @@ impl StateTransitionSignatureValidationV0 for StateTransition { fn validate_identity_and_signatures( &self, drive: &Drive, - action: Option<&StateTransitionAction>, tx: TransactionArg, execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion, @@ -609,7 +589,6 @@ impl StateTransitionSignatureValidationV0 for StateTransition { Ok(self .validate_state_transition_identity_signed( drive, - action, false, tx, execution_context, @@ -622,7 +601,6 @@ impl StateTransitionSignatureValidationV0 for StateTransition { Ok(self .validate_state_transition_identity_signed( drive, - action, true, tx, execution_context, @@ -698,11 +676,6 @@ impl StateTransitionSignatureValidationV0 for StateTransition { } } } - - /// This means we should transform into the action before validation of the identity and signatures - fn requires_state_to_validate_identity_and_signatures(&self) -> bool { - matches!(self, StateTransition::DocumentsBatch(_)) - } } impl StateTransitionStateValidationV0 for StateTransition { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/identity_nonce/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/identity_nonce/v0/mod.rs index fb717690e1..580496810a 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/identity_nonce/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/identity_nonce/v0/mod.rs @@ -1,6 +1,10 @@ use crate::error::Error; use dpp::block::block_info::BlockInfo; -use dpp::identity::identity_nonce::{validate_identity_nonce_update, validate_new_identity_nonce}; +use dpp::consensus::basic::document::NonceOutOfBoundsError; +use dpp::consensus::basic::BasicError; +use dpp::identity::identity_nonce::{ + validate_identity_nonce_update, validate_new_identity_nonce, MISSING_IDENTITY_REVISIONS_FILTER, +}; use dpp::state_transition::data_contract_create_transition::accessors::DataContractCreateTransitionAccessorsV0; use dpp::state_transition::data_contract_create_transition::DataContractCreateTransition; @@ -30,6 +34,14 @@ impl DataContractCreateTransitionIdentityNonceV0 for DataContractCreateTransitio platform_version: &PlatformVersion, ) -> Result { let revision_nonce = self.identity_nonce(); + + if revision_nonce & MISSING_IDENTITY_REVISIONS_FILTER > 0 { + return Ok(SimpleConsensusValidationResult::new_with_error( + BasicError::NonceOutOfBoundsError(NonceOutOfBoundsError::new(revision_nonce)) + .into(), + )); + } + let identity_id = self.data_contract().owner_id(); //todo: use fees let (existing_nonce, _unused_fees) = platform.drive.fetch_identity_nonce_with_fees( diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/identity_contract_nonce/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/identity_contract_nonce/v0/mod.rs index 9e008c260b..f5e4f22594 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/identity_contract_nonce/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/identity_contract_nonce/v0/mod.rs @@ -1,6 +1,10 @@ use crate::error::Error; use dpp::block::block_info::BlockInfo; -use dpp::identity::identity_nonce::{validate_identity_nonce_update, validate_new_identity_nonce}; +use dpp::consensus::basic::document::NonceOutOfBoundsError; +use dpp::consensus::basic::BasicError; +use dpp::identity::identity_nonce::{ + validate_identity_nonce_update, validate_new_identity_nonce, MISSING_IDENTITY_REVISIONS_FILTER, +}; use dpp::state_transition::data_contract_update_transition::accessors::DataContractUpdateTransitionAccessorsV0; use dpp::state_transition::data_contract_update_transition::DataContractUpdateTransition; @@ -30,6 +34,14 @@ impl DataContractUpdateStateTransitionIdentityContractNonceV0 for DataContractUp platform_version: &PlatformVersion, ) -> Result { let revision_nonce = self.identity_contract_nonce(); + + if revision_nonce & MISSING_IDENTITY_REVISIONS_FILTER > 0 { + return Ok(SimpleConsensusValidationResult::new_with_error( + BasicError::NonceOutOfBoundsError(NonceOutOfBoundsError::new(revision_nonce)) + .into(), + )); + } + let identity_id = self.data_contract().owner_id(); let contract_id = self.data_contract().id(); let (existing_nonce, _unused_fees) = diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/state_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/state_v0/mod.rs index c2ec518776..7021001aff 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/state_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/state_v0/mod.rs @@ -39,6 +39,9 @@ impl DocumentReplaceTransitionActionStateValidationV0 for DocumentReplaceTransit )); }; + // There is no need to verify that the document already existed, since this is done when + // transforming into an action + // The rest of state validation is actually happening in documents batch transition transformer // TODO: Think more about this architecture diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/v0/mod.rs index 9bfc0321fe..d0618f96a0 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/v0/mod.rs @@ -1,6 +1,9 @@ use crate::error::Error; use dpp::consensus::basic::document::InvalidDocumentTransitionIdError; +use dpp::consensus::signature::{InvalidSignaturePublicKeySecurityLevelError, SignatureError}; use dpp::document::Document; +use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; +use dpp::identity::PartialIdentity; use dpp::state_transition::documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; use dpp::state_transition::documents_batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; use dpp::state_transition::documents_batch_transition::document_transition::{ @@ -8,7 +11,7 @@ use dpp::state_transition::documents_batch_transition::document_transition::{ }; use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; -use dpp::state_transition::StateTransitionLike; +use dpp::state_transition::{StateTransitionIdentitySigned, StateTransitionLike}; use dpp::validation::ConsensusValidationResult; @@ -29,6 +32,7 @@ pub(in crate::execution::validation::state_transition::state_transitions::docume fn validate_advanced_structure_from_state_v0( &self, action: &DocumentsBatchTransitionAction, + identity: &PartialIdentity, platform_version: &PlatformVersion, ) -> Result, Error>; } @@ -37,8 +41,39 @@ impl DocumentsBatchStateTransitionStructureValidationV0 for DocumentsBatchTransi fn validate_advanced_structure_from_state_v0( &self, action: &DocumentsBatchTransitionAction, + identity: &PartialIdentity, platform_version: &PlatformVersion, ) -> Result, Error> { + let security_levels = action.contract_based_security_level_requirement()?; + + let signing_key = identity.loaded_public_keys.get(&self.signature_public_key_id()).ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution("the key must exist for advanced structure validation as we already fetched it during signature validation")))?; + + if !security_levels.contains(&signing_key.security_level()) { + // We only need to bump the first identity data contract nonce as that will make a replay + // attack not possible + + let first_transition = self.transitions().first().ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution("There must be at least one state transition as this is already verified in basic validation")))?; + + let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( + BumpIdentityDataContractNonceAction::from_borrowed_document_base_transition( + first_transition.base(), + self.owner_id(), + self.user_fee_increase(), + ), + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + vec![SignatureError::InvalidSignaturePublicKeySecurityLevelError( + InvalidSignaturePublicKeySecurityLevelError::new( + signing_key.security_level(), + security_levels, + ), + ) + .into()], + )); + } + // We should validate that all newly created documents have valid ids for transition in self.transitions() { if let DocumentTransition::Create(create_transition) = transition { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs index 20e1b22015..1095dd9206 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs @@ -6,6 +6,7 @@ mod state; mod transformer; use dpp::block::block_info::BlockInfo; +use dpp::identity::PartialIdentity; use dpp::prelude::*; use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; use dpp::validation::SimpleConsensusValidationResult; @@ -130,6 +131,7 @@ impl StateTransitionStructureKnownInStateValidationV0 for DocumentsBatchTransiti &self, _platform: &PlatformStateRef, action: &StateTransitionAction, + identity: &PartialIdentity, platform_version: &PlatformVersion, ) -> Result, Error> { match platform_version @@ -149,6 +151,7 @@ impl StateTransitionStructureKnownInStateValidationV0 for DocumentsBatchTransiti }; self.validate_advanced_structure_from_state_v0( documents_batch_transition_action, + identity, platform_version, ) } @@ -160,7 +163,7 @@ impl StateTransitionStructureKnownInStateValidationV0 for DocumentsBatchTransiti } } - fn requires_advance_structure_validation_from_state(&self) -> bool { + fn has_advanced_structure_validation_with_state(&self) -> bool { true } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/nonce/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/nonce/v0/mod.rs index 476fe78549..d39bd3b5a6 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/nonce/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/nonce/v0/mod.rs @@ -1,6 +1,10 @@ use crate::error::Error; use dpp::block::block_info::BlockInfo; -use dpp::identity::identity_nonce::{validate_identity_nonce_update, validate_new_identity_nonce}; +use dpp::consensus::basic::document::NonceOutOfBoundsError; +use dpp::consensus::basic::BasicError; +use dpp::identity::identity_nonce::{ + validate_identity_nonce_update, validate_new_identity_nonce, MISSING_IDENTITY_REVISIONS_FILTER, +}; use dpp::state_transition::identity_credit_transfer_transition::accessors::IdentityCreditTransferTransitionAccessorsV0; use dpp::state_transition::identity_credit_transfer_transition::IdentityCreditTransferTransition; @@ -30,6 +34,14 @@ impl IdentityCreditTransferTransitionIdentityNonceV0 for IdentityCreditTransferT platform_version: &PlatformVersion, ) -> Result { let revision_nonce = self.nonce(); + + if revision_nonce & MISSING_IDENTITY_REVISIONS_FILTER > 0 { + return Ok(SimpleConsensusValidationResult::new_with_error( + BasicError::NonceOutOfBoundsError(NonceOutOfBoundsError::new(revision_nonce)) + .into(), + )); + } + let identity_id = self.identity_id(); //todo: use fees let (existing_nonce, _unused_fees) = platform.drive.fetch_identity_nonce_with_fees( diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/nonce/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/nonce/v0/mod.rs index 381ef6156a..3d72880089 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/nonce/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/nonce/v0/mod.rs @@ -1,6 +1,10 @@ use crate::error::Error; use dpp::block::block_info::BlockInfo; -use dpp::identity::identity_nonce::{validate_identity_nonce_update, validate_new_identity_nonce}; +use dpp::consensus::basic::document::NonceOutOfBoundsError; +use dpp::consensus::basic::BasicError; +use dpp::identity::identity_nonce::{ + validate_identity_nonce_update, validate_new_identity_nonce, MISSING_IDENTITY_REVISIONS_FILTER, +}; use dpp::state_transition::identity_credit_withdrawal_transition::accessors::IdentityCreditWithdrawalTransitionAccessorsV0; use dpp::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition; @@ -32,6 +36,14 @@ impl IdentityCreditWithdrawalTransitionIdentityContractNonceV0 platform_version: &PlatformVersion, ) -> Result { let revision_nonce = self.nonce(); + + if revision_nonce & MISSING_IDENTITY_REVISIONS_FILTER > 0 { + return Ok(SimpleConsensusValidationResult::new_with_error( + BasicError::NonceOutOfBoundsError(NonceOutOfBoundsError::new(revision_nonce)) + .into(), + )); + } + let identity_id = self.identity_id(); //todo: use fees let (existing_nonce, _unused_fees) = platform.drive.fetch_identity_nonce_with_fees( diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/nonce/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/nonce/v0/mod.rs index 382146c34b..86ae885214 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/nonce/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/nonce/v0/mod.rs @@ -1,6 +1,10 @@ use crate::error::Error; use dpp::block::block_info::BlockInfo; -use dpp::identity::identity_nonce::{validate_identity_nonce_update, validate_new_identity_nonce}; +use dpp::consensus::basic::document::NonceOutOfBoundsError; +use dpp::consensus::basic::BasicError; +use dpp::identity::identity_nonce::{ + validate_identity_nonce_update, validate_new_identity_nonce, MISSING_IDENTITY_REVISIONS_FILTER, +}; use dpp::state_transition::identity_update_transition::accessors::IdentityUpdateTransitionAccessorsV0; use dpp::state_transition::identity_update_transition::IdentityUpdateTransition; @@ -30,6 +34,14 @@ impl IdentityUpdateTransitionIdentityContractNonceV0 for IdentityUpdateTransitio platform_version: &PlatformVersion, ) -> Result { let revision_nonce = self.nonce(); + + if revision_nonce & MISSING_IDENTITY_REVISIONS_FILTER > 0 { + return Ok(SimpleConsensusValidationResult::new_with_error( + BasicError::NonceOutOfBoundsError(NonceOutOfBoundsError::new(revision_nonce)) + .into(), + )); + } + let identity_id = self.identity_id(); //todo: use fees let (existing_nonce, _unused_fees) = platform.drive.fetch_identity_nonce_with_fees( diff --git a/packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/mod.rs b/packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/mod.rs index f3fd6babb4..9e964740ae 100644 --- a/packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/mod.rs +++ b/packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/mod.rs @@ -9,7 +9,7 @@ use dpp::data_contract::DataContract; use dpp::identifier::Identifier; use dpp::platform_value::Value; -use dpp::prelude::TimestampMillis; +use dpp::prelude::{BlockHeight, CoreBlockHeight, TimestampMillis}; use dpp::validation::SimpleConsensusValidationResult; use dpp::version::PlatformVersion; @@ -40,6 +40,14 @@ pub(in crate::drive::document::index_uniqueness) struct UniquenessOfDataRequest< pub created_at: Option, /// Optional timestamp indicating the last time the document was updated. pub updated_at: Option, + /// Optional timestamp indicating the block height at which the document was created. + pub created_at_block_height: Option, + /// Optional timestamp indicating the last block height the document was updated. + pub updated_at_block_height: Option, + /// Optional timestamp indicating the core height at which the document was created. + pub created_at_core_block_height: Option, + /// Optional timestamp indicating the last core block height the document was updated. + pub updated_at_core_block_height: Option, /// The actual data to be checked for uniqueness, represented as a mapping. pub data: &'a BTreeMap, } diff --git a/packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v0/mod.rs b/packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v0/mod.rs index 68ee59386c..8a3b7c1479 100644 --- a/packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v0/mod.rs @@ -7,7 +7,7 @@ use crate::query::{DriveQuery, InternalClauses, WhereClause, WhereOperator}; use dpp::consensus::state::document::duplicate_unique_index_error::DuplicateUniqueIndexError; use dpp::consensus::state::state_error::StateError; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; -use dpp::document::DocumentV0Getters; +use dpp::document::{property_names, DocumentV0Getters}; use dpp::platform_value::platform_value; use dpp::validation::SimpleConsensusValidationResult; use dpp::version::PlatformVersion; @@ -49,6 +49,10 @@ impl Drive { allow_original, created_at, updated_at, + created_at_block_height, + updated_at_block_height, + created_at_core_block_height, + updated_at_core_block_height, data, } = request; @@ -65,23 +69,55 @@ impl Drive { .iter() .filter_map(|property| { let value = match property.name.as_str() { - "$ownerId" => { + property_names::OWNER_ID => { platform_value!(owner_id) } - "$createdAt" => { + property_names::CREATED_AT => { if let Some(created_at) = created_at { platform_value!(created_at) } else { return None; } } - "$updatedAt" => { + property_names::UPDATED_AT => { if let Some(updated_at) = updated_at { platform_value!(updated_at) } else { return None; } } + property_names::CREATED_AT_BLOCK_HEIGHT => { + if let Some(created_at_block_height) = created_at_block_height { + platform_value!(created_at_block_height) + } else { + return None; + } + } + property_names::UPDATED_AT_BLOCK_HEIGHT => { + if let Some(updated_at_block_height) = updated_at_block_height { + platform_value!(updated_at_block_height) + } else { + return None; + } + } + property_names::CREATED_AT_CORE_BLOCK_HEIGHT => { + if let Some(created_at_core_block_height) = + created_at_core_block_height + { + platform_value!(created_at_core_block_height) + } else { + return None; + } + } + property_names::UPDATED_AT_CORE_BLOCK_HEIGHT => { + if let Some(updated_at_core_block_height) = + updated_at_core_block_height + { + platform_value!(updated_at_core_block_height) + } else { + return None; + } + } _ => { if let Some(value) = data.get(property.name.as_str()) { diff --git a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/v0/mod.rs b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/v0/mod.rs index 8d2922c67e..6475414400 100644 --- a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/v0/mod.rs @@ -37,6 +37,10 @@ impl Drive { allow_original: false, created_at: document_create_transition.created_at(), updated_at: document_create_transition.created_at(), + created_at_block_height: document_create_transition.created_at_block_height(), + updated_at_block_height: document_create_transition.created_at_block_height(), + created_at_core_block_height: document_create_transition.created_at_core_block_height(), + updated_at_core_block_height: document_create_transition.created_at_core_block_height(), data: document_create_transition.data(), }; self.validate_uniqueness_of_data(request, transaction, platform_version) diff --git a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/v0/mod.rs b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/v0/mod.rs index eb796206e8..76682ed3c7 100644 --- a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/v0/mod.rs @@ -37,6 +37,12 @@ impl Drive { allow_original: true, created_at: document_replace_transition.created_at(), updated_at: document_replace_transition.updated_at(), + created_at_block_height: document_replace_transition.created_at_block_height(), + updated_at_block_height: document_replace_transition.updated_at_block_height(), + created_at_core_block_height: document_replace_transition + .created_at_core_block_height(), + updated_at_core_block_height: document_replace_transition + .updated_at_core_block_height(), data: document_replace_transition.data(), }; self.validate_uniqueness_of_data(request, transaction, platform_version) diff --git a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_uniqueness/v0/mod.rs b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_uniqueness/v0/mod.rs index 5393e2ed99..8fdf2b5a39 100644 --- a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_uniqueness/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_uniqueness/v0/mod.rs @@ -35,6 +35,10 @@ impl Drive { allow_original, created_at: document.created_at(), updated_at: document.updated_at(), + created_at_block_height: document.created_at_block_height(), + updated_at_block_height: document.updated_at_block_height(), + created_at_core_block_height: document.created_at_core_block_height(), + updated_at_core_block_height: document.updated_at_core_block_height(), data: document.properties(), }; self.validate_uniqueness_of_data(request, transaction, platform_version) diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/mod.rs index 3569b4bc36..5f9ac7d1c4 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/mod.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/mod.rs @@ -7,7 +7,7 @@ use derive_more::From; use dpp::document::Document; use dpp::identity::TimestampMillis; use dpp::platform_value::{Identifier, Value}; -use dpp::prelude::Revision; +use dpp::prelude::{BlockHeight, CoreBlockHeight, Revision}; use dpp::ProtocolError; pub use v0::*; @@ -55,6 +55,34 @@ impl DocumentReplaceTransitionActionAccessorsV0 for DocumentReplaceTransitionAct } } + /// Returns the block height at which the document was created. + fn created_at_block_height(&self) -> Option { + match self { + DocumentReplaceTransitionAction::V0(v0) => v0.created_at_block_height, + } + } + + /// Returns the block height at which the document was last updated. + fn updated_at_block_height(&self) -> Option { + match self { + DocumentReplaceTransitionAction::V0(v0) => v0.updated_at_block_height, + } + } + + /// Returns the core block height at which the document was created. + fn created_at_core_block_height(&self) -> Option { + match self { + DocumentReplaceTransitionAction::V0(v0) => v0.created_at_core_block_height, + } + } + + /// Returns the core block height at which the document was last updated. + fn updated_at_core_block_height(&self) -> Option { + match self { + DocumentReplaceTransitionAction::V0(v0) => v0.updated_at_core_block_height, + } + } + fn data(&self) -> &BTreeMap { match self { DocumentReplaceTransitionAction::V0(v0) => &v0.data, diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/v0/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/v0/mod.rs index d86e8bdf15..c28811dd63 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/v0/mod.rs @@ -46,6 +46,16 @@ pub trait DocumentReplaceTransitionActionAccessorsV0 { fn created_at(&self) -> Option; /// updated at fn updated_at(&self) -> Option; + /// Returns the block height at which the document was created. + fn created_at_block_height(&self) -> Option; + + /// Returns the block height at which the document was last updated. + fn updated_at_block_height(&self) -> Option; + /// Returns the core block height at which the document was created. + fn created_at_core_block_height(&self) -> Option; + + /// Returns the core block height at which the document was last updated. + fn updated_at_core_block_height(&self) -> Option; /// data fn data(&self) -> &BTreeMap; /// data owned diff --git a/packages/rs-platform-version/src/version/dpp_versions.rs b/packages/rs-platform-version/src/version/dpp_versions.rs index 7aaf7e48a5..5d2875703c 100644 --- a/packages/rs-platform-version/src/version/dpp_versions.rs +++ b/packages/rs-platform-version/src/version/dpp_versions.rs @@ -17,6 +17,7 @@ pub struct DPPVersion { #[derive(Clone, Debug, Default)] pub struct StateTransitionVersions { pub max_state_transition_size: u64, + pub max_transitions_in_documents_batch: u16, pub documents: DocumentTransitionVersions, pub identities: IdentityTransitionVersions, } @@ -82,6 +83,7 @@ pub struct JsonSchemaValidatorVersions { pub new: FeatureVersion, pub validate: FeatureVersion, pub compile: FeatureVersion, + pub compile_and_validate: FeatureVersion, } #[derive(Clone, Debug, Default)] diff --git a/packages/rs-platform-version/src/version/mocks/v2_test.rs b/packages/rs-platform-version/src/version/mocks/v2_test.rs index 6190251017..8f547ae34f 100644 --- a/packages/rs-platform-version/src/version/mocks/v2_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v2_test.rs @@ -799,6 +799,7 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { new: 0, validate: 0, compile: 0, + compile_and_validate: 0, }, data_contract: DataContractValidationVersions { validate: 0, @@ -901,6 +902,7 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { }, state_transitions: StateTransitionVersions { max_state_transition_size: 20000, + max_transitions_in_documents_batch: 1, documents: DocumentTransitionVersions { documents_batch_transition: DocumentsBatchTransitionVersions { validation: DocumentsBatchTransitionValidationVersions { diff --git a/packages/rs-platform-version/src/version/mocks/v3_test.rs b/packages/rs-platform-version/src/version/mocks/v3_test.rs index 4bb33961fc..1e77c40597 100644 --- a/packages/rs-platform-version/src/version/mocks/v3_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v3_test.rs @@ -799,6 +799,7 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { new: 0, validate: 0, compile: 0, + compile_and_validate: 0, }, data_contract: DataContractValidationVersions { validate: 0, @@ -901,6 +902,7 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { }, state_transitions: StateTransitionVersions { max_state_transition_size: 20000, + max_transitions_in_documents_batch: 1, documents: DocumentTransitionVersions { documents_batch_transition: DocumentsBatchTransitionVersions { validation: DocumentsBatchTransitionValidationVersions { diff --git a/packages/rs-platform-version/src/version/v1.rs b/packages/rs-platform-version/src/version/v1.rs index 94ffca820f..d448ee6a05 100644 --- a/packages/rs-platform-version/src/version/v1.rs +++ b/packages/rs-platform-version/src/version/v1.rs @@ -796,6 +796,7 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { new: 0, validate: 0, compile: 0, + compile_and_validate: 0, }, data_contract: DataContractValidationVersions { validate: 0, @@ -898,6 +899,7 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { }, state_transitions: StateTransitionVersions { max_state_transition_size: 20000, + max_transitions_in_documents_batch: 1, documents: DocumentTransitionVersions { documents_batch_transition: DocumentsBatchTransitionVersions { validation: DocumentsBatchTransitionValidationVersions { diff --git a/packages/wasm-dpp/src/errors/consensus/basic/document/identity_contract_nonce_out_of_bounds_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/document/identity_contract_nonce_out_of_bounds_error.rs index dff1ed3953..8254d685ec 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/document/identity_contract_nonce_out_of_bounds_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/document/identity_contract_nonce_out_of_bounds_error.rs @@ -1,4 +1,4 @@ -use dpp::consensus::basic::document::IdentityContractNonceOutOfBoundsError; +use dpp::consensus::basic::document::NonceOutOfBoundsError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; @@ -6,11 +6,11 @@ use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=IdentityContractNonceOutOfBoundsError)] pub struct IdentityContractNonceOutOfBoundsErrorWasm { - inner: IdentityContractNonceOutOfBoundsError, + inner: NonceOutOfBoundsError, } -impl From<&IdentityContractNonceOutOfBoundsError> for IdentityContractNonceOutOfBoundsErrorWasm { - fn from(e: &IdentityContractNonceOutOfBoundsError) -> Self { +impl From<&NonceOutOfBoundsError> for IdentityContractNonceOutOfBoundsErrorWasm { + fn from(e: &NonceOutOfBoundsError) -> Self { Self { inner: e.clone() } } } diff --git a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs index 705442b6e3..0b23211d7f 100644 --- a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs @@ -318,7 +318,7 @@ fn from_basic_error(basic_error: &BasicError) -> JsValue { BasicError::IdentityCreditTransferToSelfError(err) => { IdentityCreditTransferToSelfErrorWasm::from(err).into() } - BasicError::IdentityContractNonceOutOfBoundsError(err) => { + BasicError::NonceOutOfBoundsError(err) => { IdentityContractNonceOutOfBoundsErrorWasm::from(err).into() } ProtocolVersionParsingError(e) => ProtocolVersionParsingErrorWasm::from(e).into(), From 69476722c92e61b2454d839eb898ceb665077bf9 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Thu, 28 Mar 2024 13:44:09 +0300 Subject: [PATCH 111/191] feat(dpp)!: validate document type name (#1798) --- .../class_methods/try_from_schema/v0/mod.rs | 184 ++++++++++++++++++ .../document_type/v0/random_document_type.rs | 3 +- .../src/errors/consensus/basic/basic_error.rs | 5 +- .../invalid_document_type_name_error.rs | 36 ++++ .../consensus/basic/data_contract/mod.rs | 2 + packages/rs-dpp/src/errors/consensus/codes.rs | 1 + .../tests/strategy_tests/strategy.rs | 50 +++-- packages/strategy-tests/src/lib.rs | 7 +- .../invalid_document_type_name_error.rs | 34 ++++ .../consensus/basic/data_contract/mod.rs | 2 + .../src/errors/consensus/consensus_error.rs | 4 + 11 files changed, 294 insertions(+), 34 deletions(-) create mode 100644 packages/rs-dpp/src/errors/consensus/basic/data_contract/invalid_document_type_name_error.rs create mode 100644 packages/wasm-dpp/src/errors/consensus/basic/data_contract/invalid_document_type_name_error.rs diff --git a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs index 1574c2ffe2..d41549f643 100644 --- a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs @@ -24,6 +24,8 @@ use std::collections::HashSet; use std::collections::{BTreeMap, BTreeSet}; use std::convert::TryInto; +#[cfg(any(test, feature = "validation"))] +use crate::consensus::basic::data_contract::InvalidDocumentTypeNameError; #[cfg(feature = "validation")] use crate::consensus::basic::data_contract::InvalidDocumentTypeRequiredSecurityLevelError; #[cfg(feature = "validation")] @@ -114,6 +116,18 @@ impl DocumentTypeV0 { #[cfg(feature = "validation")] if validate { + // Make sure a document type name is compliant + if !name + .chars() + .all(|c| c.is_ascii_alphanumeric() || c == '_' || c == '-') + || name.is_empty() + || name.len() > 64 + { + return Err(ProtocolError::ConsensusError(Box::new( + InvalidDocumentTypeNameError::new(name.to_string()).into(), + ))); + } + // Make sure JSON Schema is compilable let root_json_schema = root_schema.try_to_validating_json().map_err(|e| { ProtocolError::ConsensusError( @@ -715,3 +729,173 @@ fn insert_values_nested( Ok(()) } + +#[cfg(test)] +mod tests { + use super::*; + use platform_value::platform_value; + + mod document_type_name { + use super::*; + + #[test] + fn should_be_valid() { + let platform_version = PlatformVersion::latest(); + + let schema = platform_value!({ + "type": "object", + "properties": { + "valid_name": { + "type": "string", + "position": 0 + } + }, + "additionalProperties": false + }); + + let result = DocumentTypeV0::try_from_schema_v0( + Identifier::new([1; 32]), + "valid_name-a-b-123", + schema, + None, + false, + false, + true, + platform_version, + ) + .expect("should be valid"); + } + + #[test] + fn should_no_be_empty() { + let platform_version = PlatformVersion::latest(); + + let schema = platform_value!({ + "type": "object", + "properties": { + "valid_name": { + "type": "string", + "position": 0 + } + }, + "additionalProperties": false + }); + + let result = DocumentTypeV0::try_from_schema_v0( + Identifier::new([1; 32]), + "", + schema, + None, + false, + false, + true, + platform_version, + ); + + assert!(matches!( + result, + Err(ProtocolError::ConsensusError(boxed) + ) if matches!( + boxed.as_ref(), + ConsensusError::BasicError( + BasicError::InvalidDocumentTypeNameError(InvalidDocumentTypeNameError { .. }) + )) + )); + } + + #[test] + fn should_no_be_longer_than_64_chars() { + let platform_version = PlatformVersion::latest(); + + let schema = platform_value!({ + "type": "object", + "properties": { + "valid_name": { + "type": "string", + "position": 0 + } + }, + "additionalProperties": false + }); + + let result = DocumentTypeV0::try_from_schema_v0( + Identifier::new([1; 32]), + &"a".repeat(65), + schema, + None, + false, + false, + true, + platform_version, + ); + + assert!(matches!( + result, + Err(ProtocolError::ConsensusError(boxed) + ) if matches!( + boxed.as_ref(), + ConsensusError::BasicError( + BasicError::InvalidDocumentTypeNameError(InvalidDocumentTypeNameError { .. }) + )) + )); + } + + #[test] + fn should_no_be_alphanumeric() { + let platform_version = PlatformVersion::latest(); + + let schema = platform_value!({ + "type": "object", + "properties": { + "valid_name": { + "type": "string", + "position": 0 + } + }, + "additionalProperties": false + }); + + let result = DocumentTypeV0::try_from_schema_v0( + Identifier::new([1; 32]), + "invalid name", + schema.clone(), + None, + false, + false, + true, + platform_version, + ); + + assert!(matches!( + result, + Err(ProtocolError::ConsensusError(boxed) + ) if matches!( + boxed.as_ref(), + ConsensusError::BasicError( + BasicError::InvalidDocumentTypeNameError(InvalidDocumentTypeNameError { .. }) + )) + )); + + let result = DocumentTypeV0::try_from_schema_v0( + Identifier::new([1; 32]), + "invalid&name", + schema, + None, + false, + false, + true, + platform_version, + ); + + assert!(matches!( + result, + Err(ProtocolError::ConsensusError(boxed) + ) if matches!( + boxed.as_ref(), + ConsensusError::BasicError( + BasicError::InvalidDocumentTypeNameError(InvalidDocumentTypeNameError { .. }) + )) + )); + } + } +} diff --git a/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs b/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs index 4240da16b2..0f3068574d 100644 --- a/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs +++ b/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs @@ -345,7 +345,7 @@ impl DocumentTypeV0 { }, ArrayItemType::Identifier => json!({"type": "array"}), ArrayItemType::Boolean => json!({"type": "bool"}), - ArrayItemType::Date => json!({"type": "date"}), + ArrayItemType::Date => json!({"type": "date"}), }; json!({ @@ -402,7 +402,6 @@ impl DocumentTypeV0 { // Combine everything into the final schema let schema = json!({ - "title": name, "type": "object", "properties": properties_json_schema, "required": required_fields.iter().cloned().collect::>(), diff --git a/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs b/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs index fcf6f11083..b69c9e1719 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs @@ -9,7 +9,7 @@ use crate::consensus::basic::data_contract::{ DataContractImmutablePropertiesUpdateError, DataContractInvalidIndexDefinitionUpdateError, DataContractUniqueIndicesChangedError, DuplicateIndexError, DuplicateIndexNameError, IncompatibleDataContractSchemaError, IncompatibleRe2PatternError, InvalidCompoundIndexError, - InvalidDataContractIdError, InvalidDataContractVersionError, + InvalidDataContractIdError, InvalidDataContractVersionError, InvalidDocumentTypeNameError, InvalidDocumentTypeRequiredSecurityLevelError, InvalidIndexPropertyTypeError, InvalidIndexedPropertyConstraintError, InvalidJsonSchemaRefError, SystemPropertyIndexAlreadyPresentError, UndefinedIndexPropertyError, @@ -339,6 +339,9 @@ pub enum BasicError { #[error(transparent)] IdentityCreditTransferToSelfError(IdentityCreditTransferToSelfError), + + #[error(transparent)] + InvalidDocumentTypeNameError(InvalidDocumentTypeNameError), } impl From for ConsensusError { diff --git a/packages/rs-dpp/src/errors/consensus/basic/data_contract/invalid_document_type_name_error.rs b/packages/rs-dpp/src/errors/consensus/basic/data_contract/invalid_document_type_name_error.rs new file mode 100644 index 0000000000..8b9a8bf1c7 --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/basic/data_contract/invalid_document_type_name_error.rs @@ -0,0 +1,36 @@ +use crate::consensus::basic::BasicError; +use crate::consensus::ConsensusError; +use crate::errors::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error("document type name '{name}' is not supported. It must be from 1 to 64 alphanumeric chars, and '_' or '-'.")] +#[platform_serialize(unversioned)] +pub struct InvalidDocumentTypeNameError { + /* + + DO NOT CHANGE ORDER OF FIELDS WITHOUT INTRODUCING OF NEW VERSION + + */ + name: String, +} + +impl InvalidDocumentTypeNameError { + pub fn new(name: String) -> Self { + Self { name } + } + + pub fn name(&self) -> &str { + &self.name + } +} + +impl From for ConsensusError { + fn from(err: InvalidDocumentTypeNameError) -> Self { + Self::BasicError(BasicError::InvalidDocumentTypeNameError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/basic/data_contract/mod.rs b/packages/rs-dpp/src/errors/consensus/basic/data_contract/mod.rs index eaba49c96f..5a5fdb4457 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/data_contract/mod.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/data_contract/mod.rs @@ -11,6 +11,7 @@ mod incompatible_re2_pattern_error; mod invalid_compound_index_error; mod invalid_data_contract_id_error; mod invalid_data_contract_version_error; +mod invalid_document_type_name_error; mod invalid_document_type_required_security_level; mod invalid_index_property_type_error; mod invalid_indexed_property_constraint_error; @@ -42,5 +43,6 @@ pub use system_property_index_already_present_error::*; pub use undefined_index_property_error::*; pub use unique_indices_limit_reached_error::*; +pub use invalid_document_type_name_error::*; pub use unknown_security_level_error::*; pub use unknown_storage_key_requirements_error::*; diff --git a/packages/rs-dpp/src/errors/consensus/codes.rs b/packages/rs-dpp/src/errors/consensus/codes.rs index 67b765c460..f30affcf39 100644 --- a/packages/rs-dpp/src/errors/consensus/codes.rs +++ b/packages/rs-dpp/src/errors/consensus/codes.rs @@ -104,6 +104,7 @@ impl ErrorWithCode for BasicError { Self::MaxDocumentsTransitionsExceededError { .. } => 10412, Self::DocumentTransitionsAreAbsentError { .. } => 10413, Self::NonceOutOfBoundsError(_) => 10414, + Self::InvalidDocumentTypeNameError(_) => 10415, // Identity Errors: 10500-10599 Self::DuplicatedIdentityPublicKeyBasicError(_) => 10500, diff --git a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs index 8f6ef67d7e..8359379df3 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs @@ -1045,35 +1045,33 @@ impl NetworkStrategy { // Create `doc_type_count` doc types let doc_types = - Value::Map( - doc_type_range - .clone() - .filter_map(|_| match DocumentTypeV0::random_document_type( - params.clone(), - contract_id, - rng, - platform_version, - ) { - Ok(new_document_type) => { - let mut doc_type_clone = - new_document_type.schema().clone(); - let name = doc_type_clone.remove("title").expect( - "Expected to get a doc type title in ContractCreate", - ); - Some(( - Value::Text(name.to_string()), - doc_type_clone, - )) - } - Err(e) => { - panic!( + Value::Map( + doc_type_range + .clone() + .filter_map(|_| match DocumentTypeV0::random_document_type( + params.clone(), + contract_id, + rng, + platform_version, + ) { + Ok(new_document_type) => { + let doc_type_clone = + new_document_type.schema().clone(); + + Some(( + Value::Text(new_document_type.name().clone()), + doc_type_clone, + )) + } + Err(e) => { + panic!( "Error generating random document type: {:?}", e ); - } - }) - .collect(), - ); + } + }) + .collect(), + ); let created_data_contract = match contract_factory.create( owner_id, diff --git a/packages/strategy-tests/src/lib.rs b/packages/strategy-tests/src/lib.rs index 2b025e8d2e..5fe907463a 100644 --- a/packages/strategy-tests/src/lib.rs +++ b/packages/strategy-tests/src/lib.rs @@ -1129,13 +1129,10 @@ impl Strategy { platform_version, ) { Ok(new_document_type) => { - let mut doc_type_clone = + let doc_type_clone = new_document_type.schema().clone(); - let name = doc_type_clone.remove("title").expect( - "Expected to get a doc type title in ContractCreate", - ); Some(( - Value::Text(name.to_string()), + Value::Text(new_document_type.name().clone()), doc_type_clone, )) } diff --git a/packages/wasm-dpp/src/errors/consensus/basic/data_contract/invalid_document_type_name_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/invalid_document_type_name_error.rs new file mode 100644 index 0000000000..10f366a420 --- /dev/null +++ b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/invalid_document_type_name_error.rs @@ -0,0 +1,34 @@ +use dpp::consensus::basic::data_contract::InvalidDocumentTypeNameError; +use dpp::consensus::codes::ErrorWithCode; +use dpp::consensus::ConsensusError; + +use wasm_bindgen::prelude::*; + +#[wasm_bindgen(js_name=InvalidDocumentTypeNameError)] +pub struct InvalidDocumentTypeNameErrorWasm { + inner: InvalidDocumentTypeNameError, +} + +#[wasm_bindgen] +impl InvalidDocumentTypeNameErrorWasm { + #[wasm_bindgen(js_name=getName)] + pub fn get_name(&self) -> String { + self.inner.name().to_string() + } + + #[wasm_bindgen(js_name=getCode)] + pub fn get_code(&self) -> u32 { + ConsensusError::from(self.inner.clone()).code() + } + + #[wasm_bindgen(getter)] + pub fn message(&self) -> String { + self.inner.to_string() + } +} + +impl From<&InvalidDocumentTypeNameError> for InvalidDocumentTypeNameErrorWasm { + fn from(e: &InvalidDocumentTypeNameError) -> Self { + Self { inner: e.clone() } + } +} diff --git a/packages/wasm-dpp/src/errors/consensus/basic/data_contract/mod.rs b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/mod.rs index e60cd487f8..b0ba34b228 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/data_contract/mod.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/mod.rs @@ -10,6 +10,7 @@ mod incompatible_re2_pattern_error; mod index_error; mod invalid_data_contract_id_error; mod invalid_data_contract_version_error; +mod invalid_document_type_name_error; mod invalid_json_schema_ref_error; pub use data_contract_empty_schema_error::*; @@ -24,4 +25,5 @@ pub use incompatible_re2_pattern_error::*; pub use index_error::*; pub use invalid_data_contract_id_error::*; pub use invalid_data_contract_version_error::*; +pub use invalid_document_type_name_error::*; pub use invalid_json_schema_ref_error::*; diff --git a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs index 0b23211d7f..a596370cbc 100644 --- a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs @@ -64,6 +64,7 @@ use crate::errors::consensus::basic::data_contract::{ DataContractImmutablePropertiesUpdateErrorWasm, DataContractInvalidIndexDefinitionUpdateErrorWasm, DataContractUniqueIndicesChangedErrorWasm, IncompatibleDataContractSchemaErrorWasm, InvalidDataContractIdErrorWasm, + InvalidDocumentTypeNameErrorWasm, }; use crate::errors::consensus::basic::document::{ DuplicateDocumentTransitionsWithIdsErrorWasm, DuplicateDocumentTransitionsWithIndicesErrorWasm, @@ -321,6 +322,9 @@ fn from_basic_error(basic_error: &BasicError) -> JsValue { BasicError::NonceOutOfBoundsError(err) => { IdentityContractNonceOutOfBoundsErrorWasm::from(err).into() } + BasicError::InvalidDocumentTypeNameError(err) => { + InvalidDocumentTypeNameErrorWasm::from(err).into() + } ProtocolVersionParsingError(e) => ProtocolVersionParsingErrorWasm::from(e).into(), SerializedObjectParsingError(e) => SerializedObjectParsingErrorWasm::from(e).into(), JsonSchemaError(e) => JsonSchemaErrorWasm::from(e).into(), From 1ac3638a0f7425bdc635dc91f8cc582f90dcbdcf Mon Sep 17 00:00:00 2001 From: Igor Markin Date: Thu, 28 Mar 2024 16:25:33 +0000 Subject: [PATCH 112/191] fix: state transition already in chain error on low credit transfer amount (#1797) --- ...d_identity_credit_transfer_amount_error.rs | 41 +++++++++++++++++++ .../errors/consensus/basic/identity/mod.rs | 2 + .../src/errors/consensus/consensus_error.rs | 5 +++ 3 files changed, 48 insertions(+) create mode 100644 packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_identity_credit_transfer_amount_error.rs diff --git a/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_identity_credit_transfer_amount_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_identity_credit_transfer_amount_error.rs new file mode 100644 index 0000000000..8a27502bf8 --- /dev/null +++ b/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_identity_credit_transfer_amount_error.rs @@ -0,0 +1,41 @@ +use dpp::consensus::basic::identity::InvalidIdentityCreditTransferAmountError; +use dpp::consensus::codes::ErrorWithCode; +use dpp::consensus::ConsensusError; + +use wasm_bindgen::prelude::*; + +#[wasm_bindgen(js_name=InvalidIdentityCreditTransferAmountError)] +pub struct InvalidIdentityCreditTransferAmountErrorWasm { + inner: InvalidIdentityCreditTransferAmountError, +} + +impl From<&InvalidIdentityCreditTransferAmountError> + for InvalidIdentityCreditTransferAmountErrorWasm +{ + fn from(e: &InvalidIdentityCreditTransferAmountError) -> Self { + Self { inner: e.clone() } + } +} + +#[wasm_bindgen(js_class=InvalidIdentityCreditTransferAmountError)] +impl InvalidIdentityCreditTransferAmountErrorWasm { + #[wasm_bindgen(js_name=getAmount)] + pub fn amount(&self) -> u64 { + self.inner.amount() + } + + #[wasm_bindgen(js_name=getMinAmount)] + pub fn min_amount(&self) -> u64 { + self.inner.min_amount() + } + + #[wasm_bindgen(js_name=getCode)] + pub fn get_code(&self) -> u32 { + ConsensusError::from(self.inner.clone()).code() + } + + #[wasm_bindgen(getter)] + pub fn message(&self) -> String { + self.inner.to_string() + } +} diff --git a/packages/wasm-dpp/src/errors/consensus/basic/identity/mod.rs b/packages/wasm-dpp/src/errors/consensus/basic/identity/mod.rs index dc1a57edc2..907b08e999 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/identity/mod.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/identity/mod.rs @@ -13,6 +13,7 @@ mod invalid_asset_lock_transaction_output_return_size_error; mod invalid_identity_asset_lock_proof_chain_lock_validation_error; mod invalid_identity_asset_lock_transaction_error; mod invalid_identity_asset_lock_transaction_output_error; +mod invalid_identity_credit_transfer_amount_error; mod invalid_identity_credit_withdrawal_transition_core_fee_error; mod invalid_identity_credit_withdrawal_transition_output_script_error; mod invalid_identity_credit_withdrawal_transition_pooling_error; @@ -40,6 +41,7 @@ pub use invalid_asset_lock_transaction_output_return_size_error::*; pub use invalid_identity_asset_lock_proof_chain_lock_validation_error::*; pub use invalid_identity_asset_lock_transaction_error::*; pub use invalid_identity_asset_lock_transaction_output_error::*; +pub use invalid_identity_credit_transfer_amount_error::*; pub use invalid_identity_credit_withdrawal_transition_core_fee_error::*; pub use invalid_identity_credit_withdrawal_transition_output_script_error::*; pub use invalid_identity_credit_withdrawal_transition_pooling_error::*; diff --git a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs index a596370cbc..61d7e3868e 100644 --- a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs @@ -17,6 +17,7 @@ use crate::errors::consensus::basic::identity::{ InvalidIdentityAssetLockProofChainLockValidationErrorWasm, InvalidIdentityAssetLockTransactionErrorWasm, InvalidIdentityAssetLockTransactionOutputErrorWasm, + InvalidIdentityCreditTransferAmountErrorWasm, InvalidIdentityCreditWithdrawalTransitionCoreFeeErrorWasm, InvalidIdentityCreditWithdrawalTransitionOutputScriptErrorWasm, InvalidIdentityKeySignatureErrorWasm, InvalidIdentityPublicKeyDataErrorWasm, @@ -40,6 +41,7 @@ use dpp::consensus::basic::BasicError::{ InvalidAssetLockProofTransactionHeightError, InvalidAssetLockTransactionOutputReturnSizeError, InvalidIdentityAssetLockProofChainLockValidationError, InvalidIdentityAssetLockTransactionError, InvalidIdentityAssetLockTransactionOutputError, + InvalidIdentityCreditTransferAmountError, InvalidIdentityCreditWithdrawalTransitionCoreFeeError, InvalidIdentityCreditWithdrawalTransitionOutputScriptError, InvalidIdentityPublicKeyDataError, InvalidIdentityPublicKeySecurityLevelError, InvalidInstantAssetLockProofError, @@ -380,6 +382,9 @@ fn from_basic_error(basic_error: &BasicError) -> JsValue { InvalidAssetLockProofTransactionHeightError(e) => { InvalidAssetLockProofTransactionHeightErrorWasm::from(e).into() } + InvalidIdentityCreditTransferAmountError(e) => { + InvalidIdentityCreditTransferAmountErrorWasm::from(e).into() + } InvalidIdentityCreditWithdrawalTransitionCoreFeeError(e) => { InvalidIdentityCreditWithdrawalTransitionCoreFeeErrorWasm::from(e).into() } From b8fd57d7a868870a0de591e9fdbe4cf7955406ca Mon Sep 17 00:00:00 2001 From: Paul DeLucia <69597248+pauldelucia@users.noreply.github.com> Date: Fri, 29 Mar 2024 15:19:30 +0700 Subject: [PATCH 113/191] feat(strategy-tests): add extra_keys field for StartIdentities and use random identities for transfers (#1794) --- packages/strategy-tests/src/lib.rs | 52 +++++++++++++++------- packages/strategy-tests/src/transitions.rs | 10 ++++- 2 files changed, 43 insertions(+), 19 deletions(-) diff --git a/packages/strategy-tests/src/lib.rs b/packages/strategy-tests/src/lib.rs index 5fe907463a..c72a8b33bf 100644 --- a/packages/strategy-tests/src/lib.rs +++ b/packages/strategy-tests/src/lib.rs @@ -41,7 +41,7 @@ use dpp::state_transition::data_contract_update_transition::methods::DataContrac use operations::{DataContractUpdateAction, DataContractUpdateOp}; use platform_version::TryFromPlatformVersioned; use rand::prelude::StdRng; -use rand::{thread_rng, Rng}; +use rand::Rng; use tracing::error; use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet}; use bincode::{Decode, Encode}; @@ -125,6 +125,7 @@ pub struct StartIdentities { pub number_of_identities: u8, pub keys_per_identity: u8, pub starting_balances: u64, // starting balance in duffs + pub extra_keys: KeyMaps, } /// Identities to register on the first block of the strategy @@ -418,8 +419,6 @@ impl Strategy { let (identities, mut state_transitions): (Vec, Vec) = identity_state_transitions.into_iter().unzip(); - // Do we also need to add identities to the identity_nonce_counter? - // Add initial contracts for contracts_with_updates on first block of strategy if block_info.height == config.start_block_height { let mut contract_state_transitions = self.initial_contract_state_transitions( @@ -999,7 +998,7 @@ impl Strategy { } // Select a random identity from the current_identities - let random_index = thread_rng().gen_range(0..identities_count); + let random_index = rng.gen_range(0..identities_count); let random_identity = &mut current_identities[random_index]; // Get keys already added @@ -1072,23 +1071,40 @@ impl Strategy { // Generate state transition for identity transfer operation OperationType::IdentityTransfer if current_identities.len() > 1 => { - let identities_clone = current_identities.to_owned(); - // Sender is the first in the list, which should be loaded_identity - let owner = &mut current_identities[0]; - // Recipient is the second in the list - let recipient = &identities_clone[1]; for _ in 0..count { + let identities_count = current_identities.len(); + if identities_count == 0 { + break; + } + + // Select a random identity from the current_identities for the sender + let random_index_sender = rng.gen_range(0..identities_count); + + // Clone current_identities to a Vec for manipulation + let mut unused_identities: Vec<_> = + current_identities.iter().cloned().collect(); + unused_identities.remove(random_index_sender); // Remove the sender + let unused_identities_count = unused_identities.len(); + + // Select a random identity from the remaining ones for the recipient + let random_index_recipient = rng.gen_range(0..unused_identities_count); + let recipient = &unused_identities[random_index_recipient]; + + // Use the sender index on the original slice + let sender = &mut current_identities[random_index_sender]; + let state_transition = crate::transitions::create_identity_credit_transfer_transition( - owner, + sender, recipient, identity_nonce_counter, signer, - 1000, + 300000, ); operations.push(state_transition); } } + OperationType::ContractCreate(params, doc_type_range) if !current_identities.is_empty() => { @@ -1326,9 +1342,9 @@ impl Strategy { && self.start_identities.number_of_identities > 0 { let mut new_transitions = crate::transitions::create_identities_state_transitions( - self.start_identities.number_of_identities.into(), // number of identities - self.start_identities.keys_per_identity.into(), // number of keys per identity - &self.identities_inserts.extra_keys, + self.start_identities.number_of_identities.into(), + self.start_identities.keys_per_identity.into(), + &self.start_identities.extra_keys, amount, signer, rng, @@ -1343,10 +1359,11 @@ impl Strategy { if block_info.height > config.start_block_height { let frequency = &self.identities_inserts.frequency; if frequency.check_hit(rng) { - let count = frequency.events(rng); + let count = frequency.events(rng); // number of identities to create + let mut new_transitions = crate::transitions::create_identities_state_transitions( - count, // number of identities - self.identities_inserts.start_keys as KeyID, // number of keys per identity + count, + self.identities_inserts.start_keys as KeyID, &self.identities_inserts.extra_keys, 200000, // 0.002 dash signer, @@ -1725,6 +1742,7 @@ mod tests { number_of_identities: 2, keys_per_identity: 3, starting_balances: 100_000_000, + extra_keys: BTreeMap::new(), }, identities_inserts: Default::default(), identity_contract_nonce_gaps: None, diff --git a/packages/strategy-tests/src/transitions.rs b/packages/strategy-tests/src/transitions.rs index 3dcb36a224..870003063e 100644 --- a/packages/strategy-tests/src/transitions.rs +++ b/packages/strategy-tests/src/transitions.rs @@ -292,8 +292,14 @@ pub fn create_identity_update_transition_add_keys( ) -> (StateTransition, (Identifier, Vec)) { identity.bump_revision(); - let start_id = - (identity.public_keys().len() as u32 + keys_already_added_this_block_count) as KeyID; + let start_id = (identity + .public_keys() + .values() + .map(|pk| pk.id()) + .max() + .expect("Expected a max public key id") as u32 + + keys_already_added_this_block_count + + 1) as KeyID; let keys = IdentityPublicKey::random_authentication_keys_with_private_keys_with_rng( start_id, From 0f6a465828bfde381e3a38179606d3cb26155aab Mon Sep 17 00:00:00 2001 From: pauldelucia Date: Sun, 31 Mar 2024 13:08:34 +0700 Subject: [PATCH 114/191] feat: pass asset lock vector rather than callback in strategies --- packages/strategy-tests/src/lib.rs | 28 ++++---- packages/strategy-tests/src/transitions.rs | 77 +++++++++++----------- 2 files changed, 54 insertions(+), 51 deletions(-) diff --git a/packages/strategy-tests/src/lib.rs b/packages/strategy-tests/src/lib.rs index c72a8b33bf..b2de4ca353 100644 --- a/packages/strategy-tests/src/lib.rs +++ b/packages/strategy-tests/src/lib.rs @@ -333,7 +333,7 @@ impl Strategy { /// # Parameters /// - `document_query_callback`: Callback for querying documents based on specified criteria. /// - `identity_fetch_callback`: Callback for fetching identity details, including public keys. - /// - `create_asset_lock`: Callback for creating asset lock proofs, primarily for identity transactions. + /// - `asset_lock_proofs`: A vector of asset lock proofs and associated private keys. /// - `block_info`: Information about the current block, such as its height and timestamp. /// - `current_identities`: A mutable list of identities present in the simulation, potentially expanded with new identities. /// - `known_contracts`: A mutable map of contracts known in the simulation, including any updates. @@ -357,7 +357,7 @@ impl Strategy { /// let (state_transitions, finalize_ops) = strategy.state_transitions_for_block( /// &mut document_query_callback, /// &mut identity_fetch_callback, - /// &mut create_asset_lock, + /// &mut asset_lock_proofs, /// &block_info, /// &mut current_identities, /// &mut known_contracts, @@ -381,7 +381,7 @@ impl Strategy { Identifier, Option, ) -> PartialIdentity, - create_asset_lock: &mut impl FnMut(u64) -> Option<(AssetLockProof, PrivateKey)>, + asset_lock_proofs: &mut Vec<(AssetLockProof, PrivateKey)>, block_info: &BlockInfo, current_identities: &mut Vec, known_contracts: &mut BTreeMap, @@ -404,7 +404,7 @@ impl Strategy { self.start_identities.starting_balances, signer, rng, - create_asset_lock, + asset_lock_proofs, config, platform_version, ) { @@ -435,7 +435,7 @@ impl Strategy { .operations_based_transitions( document_query_callback, identity_fetch_callback, - create_asset_lock, + asset_lock_proofs, block_info, current_identities, known_contracts, @@ -480,7 +480,7 @@ impl Strategy { /// # Parameters /// - `document_query_callback`: A callback function for querying existing documents based on specified criteria. /// - `identity_fetch_callback`: A callback function for fetching identity information, including public keys. - /// - `create_asset_lock`: A callback function for creating asset lock proofs for identity transactions. + /// - `asset_lock_proofs`: A vector of asset lock proofs and associated private keys. /// - `block_info`: Information about the current block, including height and time. /// - `current_identities`: A mutable reference to the list of current identities involved in the operations. /// - `known_contracts`: A mutable reference to a map of known contracts and their updates. @@ -505,7 +505,7 @@ impl Strategy { /// let (state_transitions, finalize_ops) = strategy.operations_based_transitions( /// &mut document_query_callback, /// &mut identity_fetch_callback, - /// &mut create_asset_lock, + /// &mut asset_lock_proofs, /// &block_info, /// &mut current_identities, /// &mut known_contracts, @@ -527,7 +527,7 @@ impl Strategy { Identifier, Option, ) -> PartialIdentity, - create_asset_lock: &mut impl FnMut(u64) -> Option<(AssetLockProof, PrivateKey)>, + asset_lock_proofs: &mut Vec<(AssetLockProof, PrivateKey)>, block_info: &BlockInfo, current_identities: &mut [Identity], known_contracts: &mut BTreeMap, @@ -968,7 +968,7 @@ impl Strategy { for random_identity in cyclic_identities.take(count.into()) { match crate::transitions::create_identity_top_up_transition( random_identity, - create_asset_lock, + asset_lock_proofs, platform_version, ) { Ok(transition) => operations.push(transition), @@ -1301,7 +1301,7 @@ impl Strategy { /// - `block_info`: Provides details about the current block, such as height, to guide the generation of state transitions. /// - `signer`: A mutable reference to a signer instance, used for signing the state transitions of identities. /// - `rng`: A mutable reference to a random number generator, for creating randomized elements where necessary. - /// - `create_asset_lock`: A mutable reference to a callback function that generates an asset lock proof and associated private key, used in identity creation transactions. + /// - `asset_lock_proofs`: A vector of asset lock proofs and associated private keys. /// - `config`: Configuration details of the strategy, including the start block height. /// - `platform_version`: Specifies the version of the Dash Platform, ensuring compatibility with its features and behaviors. /// @@ -1311,7 +1311,7 @@ impl Strategy { /// # Examples /// ```ignore /// // Assuming `strategy` is an instance of `Strategy`, with `block_info`, `signer`, `rng`, - /// // `create_asset_lock`, `config`, and `platform_version` properly initialized: + /// // `asset_lock_proofs`, `config`, and `platform_version` properly initialized: /// let identity_transitions = strategy.identity_state_transitions_for_block( /// &block_info, /// &mut signer, @@ -1331,7 +1331,7 @@ impl Strategy { amount: u64, signer: &mut SimpleSigner, rng: &mut StdRng, - create_asset_lock: &mut impl FnMut(u64) -> Option<(AssetLockProof, PrivateKey)>, + asset_lock_proofs: &mut Vec<(AssetLockProof, PrivateKey)>, config: &StrategyConfig, platform_version: &PlatformVersion, ) -> Result, ProtocolError> { @@ -1348,7 +1348,7 @@ impl Strategy { amount, signer, rng, - create_asset_lock, + asset_lock_proofs, platform_version, )?; state_transitions.append(&mut new_transitions); @@ -1368,7 +1368,7 @@ impl Strategy { 200000, // 0.002 dash signer, rng, - create_asset_lock, + asset_lock_proofs, platform_version, )?; state_transitions.append(&mut new_transitions); diff --git a/packages/strategy-tests/src/transitions.rs b/packages/strategy-tests/src/transitions.rs index 870003063e..d025169c84 100644 --- a/packages/strategy-tests/src/transitions.rs +++ b/packages/strategy-tests/src/transitions.rs @@ -224,24 +224,27 @@ pub fn instant_asset_lock_is_lock_fixture(tx_id: Txid) -> InstantLock { /// - If there's an error during the creation of the identity top-up transition. pub fn create_identity_top_up_transition( identity: &Identity, - create_asset_lock: &mut impl FnMut(u64) -> Option<(AssetLockProof, PrivateKey)>, + asset_lock_proofs: &mut Vec<(AssetLockProof, PrivateKey)>, platform_version: &PlatformVersion, ) -> Result { - let (asset_lock_proof, private_key) = create_asset_lock(200000).ok_or( - ProtocolError::Generic("Failed to create asset lock proof".to_string()), - )?; - - let pk_bytes = private_key.to_bytes(); - - IdentityTopUpTransition::try_from_identity( - identity, - asset_lock_proof, - pk_bytes.as_ref(), - 0, - platform_version, - None, - ) - .map_err(|e| ProtocolError::Generic(format!("Error creating top up transition: {:?}", e))) + if let Some(proof_and_pk) = asset_lock_proofs.pop() { + let (asset_lock_proof, private_key) = proof_and_pk; + let pk_bytes = private_key.to_bytes(); + + IdentityTopUpTransition::try_from_identity( + identity, + asset_lock_proof, + pk_bytes.as_ref(), + 0, + platform_version, + None, + ) + .map_err(|e| ProtocolError::Generic(format!("Error creating top up transition: {:?}", e))) + } else { + Err(ProtocolError::Generic( + "No asset lock proofs available for create_identity_top_up_transition".to_string(), + )) + } } /// Creates a state transition for updating an identity by adding a specified number of new public authentication keys. @@ -634,7 +637,7 @@ pub fn create_identities_state_transitions( balance: u64, signer: &mut SimpleSigner, rng: &mut StdRng, - create_asset_lock: &mut impl FnMut(u64) -> Option<(AssetLockProof, PrivateKey)>, + asset_lock_proofs: &mut Vec<(AssetLockProof, PrivateKey)>, platform_version: &PlatformVersion, ) -> Result, ProtocolError> { let (mut identities, mut keys) = @@ -699,28 +702,28 @@ pub fn create_identities_state_transitions( id_pub_key_v0.set_id(new_id); }); - // Attempt to create an asset lock - match create_asset_lock(balance) { - Some((proof, private_key)) => { - let pk = private_key.to_bytes(); - match IdentityCreateTransition::try_from_identity_with_signer( - &identity, - proof, - &pk, - signer, - &NativeBlsModule, - platform_version, - ) { - Ok(identity_create_transition) => { - identity.set_id(identity_create_transition.owner_id()); - Ok((identity, identity_create_transition)) - } - Err(e) => Err(e), + if let Some(proof_and_pk) = asset_lock_proofs.pop() { + let (asset_lock_proof, private_key) = proof_and_pk; + let pk = private_key.to_bytes(); + match IdentityCreateTransition::try_from_identity_with_signer( + &identity, + asset_lock_proof, + &pk, + signer, + &NativeBlsModule, + platform_version, + ) { + Ok(identity_create_transition) => { + identity.set_id(identity_create_transition.owner_id()); + Ok((identity, identity_create_transition)) } + Err(e) => Err(e), } - None => Err(ProtocolError::Generic( - "Failed to create asset lock proof".to_string(), - )), + } else { + Err(ProtocolError::Generic( + "No asset lock proofs available for create_identities_state_transitions" + .to_string(), + )) } }) .collect::, ProtocolError>>() From 3014b6f524a8a914c13904659806dc3e5480f45d Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Mon, 1 Apr 2024 05:05:51 +0700 Subject: [PATCH 115/191] feat(platform)!: mitigate issues of asset lock based transitions (#1796) --- Cargo.lock | 782 +++++++++--------- .../platform/drive/tenderdash/config.toml.dot | 2 +- .../js-dash-sdk/src/SDK/Client/Client.spec.ts | 10 +- .../platform-test-suite/test/e2e/dpns.spec.js | 4 +- .../test/functional/platform/Identity.spec.js | 24 +- .../test/functional/platform/proofs.spec.js | 8 +- packages/rs-dpp/src/asset_lock/mod.rs | 14 + .../reduced_asset_lock_value/mod.rs | 90 ++ .../reduced_asset_lock_value/v0/mod.rs | 23 + .../class_methods/try_from_schema/v0/mod.rs | 2 +- .../src/errors/consensus/basic/basic_error.rs | 12 +- ...tity_contract_nonce_out_of_bounds_error.rs | 2 +- ...ction_out_point_already_consumed_error.rs} | 12 +- ...tion_out_point_not_enough_balance_error.rs | 72 ++ .../errors/consensus/basic/identity/mod.rs | 7 +- packages/rs-dpp/src/errors/consensus/codes.rs | 6 +- .../invalid_asset_lock_proof_value.rs | 43 - .../errors/consensus/state/identity/mod.rs | 1 - .../src/errors/consensus/state/state_error.rs | 4 - .../mod.rs | 11 +- .../v0/mod.rs | 36 +- packages/rs-dpp/src/lib.rs | 1 + packages/rs-dpp/src/state_transition/mod.rs | 30 + .../validation/mod.rs | 2 +- .../mod.rs | 2 +- .../v0/mod.rs | 0 .../accessors/mod.rs | 6 + .../accessors/v0/mod.rs | 4 + .../identity_create_transition/mod.rs | 22 - .../v0/v0_methods.rs | 5 + .../identity/identity_topup_transition/mod.rs | 22 - .../v0/mod.rs | 18 +- .../src/validation/block_time_window/mod.rs | 2 - .../validate_time_in_block_time_window/mod.rs | 31 - .../v0/mod.rs | 53 -- .../block_time_window/validation_result.rs | 14 - packages/rs-dpp/src/validation/mod.rs | 3 - .../src/validation/validation_result.rs | 11 + .../src/abci/app/execution_result.rs | 2 +- .../src/abci/handler/prepare_proposal.rs | 2 +- .../src/execution/check_tx/v0/mod.rs | 281 ++++++- .../decode_raw_state_transitions/mod.rs | 53 ++ .../decode_raw_state_transitions/v0/mod.rs | 129 +++ .../execute_event/mod.rs | 10 +- .../execute_event/v0/mod.rs | 69 +- .../state_transition_processing/mod.rs | 1 + .../process_raw_state_transitions/v0/mod.rs | 275 +++--- .../validate_fees_of_event/v0/mod.rs | 7 +- .../execution/types/execution_event/mod.rs | 31 +- .../rs-drive-abci/src/execution/types/mod.rs | 3 + .../types/state_transition_container/mod.rs | 54 ++ .../state_transition_container/v0/mod.rs | 60 ++ .../check_tx_verification/v0/mod.rs | 306 ++++--- .../asset_lock/proof/validate/chain/mod.rs | 33 +- .../asset_lock/proof/validate/instant/mod.rs | 41 +- .../common/asset_lock/proof/validate/mod.rs | 33 +- .../proof/verify_is_not_spent/chain/mod.rs | 45 +- .../proof/verify_is_not_spent/instant/mod.rs | 42 +- .../proof/verify_is_not_spent/mod.rs | 67 +- .../proof/verify_is_not_spent/v0/mod.rs | 72 ++ .../v0/mod.rs | 36 +- .../state_transition/processor/mod.rs | 8 +- .../state_transition/processor/v0/mod.rs | 300 ++++--- .../basic_structure/v0/mod.rs | 4 +- .../data_contract_create/mod.rs | 3 +- .../advanced_structure/v0/mod.rs | 3 + .../state_transitions/documents_batch/mod.rs | 14 +- .../{structure => advanced_structure}/mod.rs | 0 .../advanced_structure/v0/mod.rs | 132 +++ .../basic_structure}/mod.rs | 0 .../identity_create/basic_structure/v0/mod.rs | 54 ++ .../identity_and_signatures/v0/mod.rs | 31 - .../state_transitions/identity_create/mod.rs | 118 ++- .../identity_create/state/v0/mod.rs | 229 +++-- .../identity_create/structure/v0/mod.rs | 37 - .../identity_credit_transfer/mod.rs | 2 +- .../structure/v0/mod.rs | 4 +- .../identity_credit_withdrawal/mod.rs | 2 +- .../structure/v0/mod.rs | 4 +- .../state_transitions/identity_top_up/mod.rs | 75 +- .../identity_top_up/state/v0/mod.rs | 143 ---- .../identity_top_up/structure/v0/mod.rs | 6 +- .../transform_into_action/mod.rs | 1 + .../transform_into_action/v0/mod.rs | 188 +++++ .../identity_update/basic_structure/v0/mod.rs | 4 +- .../state_transitions/identity_update/mod.rs | 2 +- .../state_transition/state_transitions/mod.rs | 5 +- .../state_transition/transformer/mod.rs | 37 +- .../event_execution_result/mod.rs | 8 +- .../mod.rs | 6 +- .../platform_types/validator_set/v0/mod.rs | 5 +- .../verify_state_transitions.rs | 11 +- .../add_asset_lock_outpoint_operations/mod.rs | 3 + .../v0/mod.rs | 13 +- .../mod.rs | 29 +- .../v0/mod.rs | 42 +- packages/rs-drive/src/drive/asset_lock/mod.rs | 2 +- .../src/drive/batch/drive_op_batch/system.rs | 8 +- .../identity/identity_create_transition.rs | 17 +- .../identity/identity_top_up_transition.rs | 13 +- .../src/drive/batch/transitions/mod.rs | 4 + .../src/drive/batch/transitions/system/mod.rs | 1 + .../system/partially_use_asset_lock.rs | 42 + .../v0/mod.rs | 2 - packages/rs-drive/src/drive/mod.rs | 14 +- .../identity/identity_create/mod.rs | 33 +- .../identity/identity_create/transformer.rs | 25 +- .../identity/identity_create/v0/mod.rs | 48 +- .../identity_create/v0/transformer.rs | 31 +- .../identity/identity_topup/mod.rs | 12 +- .../identity/identity_topup/transformer.rs | 10 +- .../identity/identity_topup/v0/mod.rs | 9 +- .../identity/identity_topup/v0/transformer.rs | 24 +- .../src/state_transition_action/mod.rs | 9 + .../src/state_transition_action/system/mod.rs | 3 + .../partially_use_asset_lock_action/mod.rs | 61 ++ .../transformer.rs | 162 ++++ .../partially_use_asset_lock_action/v0/mod.rs | 40 + .../v0/transformer.rs | 289 +++++++ .../src/version/dpp_versions.rs | 11 +- .../src/version/drive_abci_versions.rs | 11 + .../src/version/drive_versions.rs | 2 +- .../src/version/mocks/v2_test.rs | 45 +- .../src/version/mocks/v3_test.rs | 45 +- .../rs-platform-version/src/version/v1.rs | 45 +- ...nsaction_out_point_already_exists_error.rs | 8 +- .../invalid_asset_lock_proof_value_error.rs | 39 - ...tion_out_point_not_enough_balance_error.rs | 61 ++ .../errors/consensus/basic/identity/mod.rs | 4 +- .../src/errors/consensus/consensus_error.rs | 14 +- 130 files changed, 3832 insertions(+), 1878 deletions(-) create mode 100644 packages/rs-dpp/src/asset_lock/mod.rs create mode 100644 packages/rs-dpp/src/asset_lock/reduced_asset_lock_value/mod.rs create mode 100644 packages/rs-dpp/src/asset_lock/reduced_asset_lock_value/v0/mod.rs rename packages/rs-dpp/src/errors/consensus/basic/identity/{identity_asset_lock_transaction_out_point_already_exists_error.rs => identity_asset_lock_transaction_out_point_already_consumed_error.rs} (73%) create mode 100644 packages/rs-dpp/src/errors/consensus/basic/identity/identity_asset_lock_transaction_out_point_not_enough_balance_error.rs delete mode 100644 packages/rs-dpp/src/errors/consensus/state/identity/invalid_asset_lock_proof_value.rs rename packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/{validate_base_structure => validate_basic_structure}/mod.rs (90%) rename packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/{validate_base_structure => validate_basic_structure}/v0/mod.rs (100%) delete mode 100644 packages/rs-dpp/src/validation/block_time_window/mod.rs delete mode 100644 packages/rs-dpp/src/validation/block_time_window/validate_time_in_block_time_window/mod.rs delete mode 100644 packages/rs-dpp/src/validation/block_time_window/validate_time_in_block_time_window/v0/mod.rs delete mode 100644 packages/rs-dpp/src/validation/block_time_window/validation_result.rs create mode 100644 packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/decode_raw_state_transitions/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/decode_raw_state_transitions/v0/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/types/state_transition_container/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/types/state_transition_container/v0/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/verify_is_not_spent/v0/mod.rs rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/{structure => advanced_structure}/mod.rs (100%) create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/advanced_structure/v0/mod.rs rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{identity_top_up/state => identity_create/basic_structure}/mod.rs (100%) create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/basic_structure/v0/mod.rs delete mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/structure/v0/mod.rs delete mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/state/v0/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/transform_into_action/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/transform_into_action/v0/mod.rs rename packages/rs-drive/src/drive/asset_lock/{has_asset_lock_outpoint => fetch_asset_lock_outpoint_info}/mod.rs (74%) rename packages/rs-drive/src/drive/asset_lock/{has_asset_lock_outpoint => fetch_asset_lock_outpoint_info}/v0/mod.rs (67%) create mode 100644 packages/rs-drive/src/drive/batch/transitions/system/partially_use_asset_lock.rs create mode 100644 packages/rs-drive/src/state_transition_action/system/partially_use_asset_lock_action/mod.rs create mode 100644 packages/rs-drive/src/state_transition_action/system/partially_use_asset_lock_action/transformer.rs create mode 100644 packages/rs-drive/src/state_transition_action/system/partially_use_asset_lock_action/v0/mod.rs create mode 100644 packages/rs-drive/src/state_transition_action/system/partially_use_asset_lock_action/v0/transformer.rs delete mode 100644 packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_asset_lock_proof_value_error.rs create mode 100644 packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_asset_transaction_out_point_not_enough_balance_error.rs diff --git a/Cargo.lock b/Cargo.lock index c28a3d3857..bbdee15104 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -19,33 +19,34 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "ahash" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a824f2aa7e75a0c98c5a504fceb80649e9c35265d44525b5f94de4771a395cd" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" dependencies = [ "getrandom", "once_cell", - "serde", "version_check", ] [[package]] name = "ahash" -version = "0.8.7" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77c3a9648d43b9cd48db467b3f87fdd6e146bcc88ab0180006cef2179fe11d01" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", + "getrandom", "once_cell", + "serde", "version_check", "zerocopy", ] [[package]] name = "aho-corasick" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] @@ -73,9 +74,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.11" +version = "0.6.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e2e1ebcb11de5c03c67de28a7df593d32191b44939c482e97702baaaa6ab6a5" +checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb" dependencies = [ "anstyle", "anstyle-parse", @@ -87,9 +88,9 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.4" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" +checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" [[package]] name = "anstyle-parse" @@ -121,15 +122,15 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.79" +version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" +checksum = "0952808a6c2afd1aa8947271f3a60f1a6763c7b912d210184c5149b5cf147247" [[package]] name = "arc-swap" -version = "1.7.0" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b3d0060af21e8d11a926981cc00c6c1541aa91dd64b9f881985c3da1094425f" +checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" [[package]] name = "arrayref" @@ -191,18 +192,18 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.55", ] [[package]] name = "async-trait" -version = "0.1.77" +version = "0.1.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" +checksum = "a507401cad91ec6a857ed5513a2073c82a9b9048762b885bb98655b306964681" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.55", ] [[package]] @@ -218,9 +219,9 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" [[package]] name = "axum" @@ -269,11 +270,11 @@ dependencies = [ [[package]] name = "backon" -version = "0.4.1" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c1a6197b2120bb2185a267f6515038558b019e92b832bb0320e96d66268dcf9" +checksum = "c491fa80d69c03084223a4e73c378dd9f9a1e612eb54051213f88b2d5249b458" dependencies = [ - "fastrand 1.9.0", + "fastrand 2.0.2", "futures-core", "pin-project", "tokio", @@ -281,9 +282,9 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.69" +version = "0.3.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" dependencies = [ "addr2line", "cc", @@ -312,6 +313,12 @@ version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +[[package]] +name = "base64" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9475866fec1451be56a3c2400fd081ff546538961565ccb5b7142cbd22bc7a51" + [[package]] name = "base64ct" version = "1.6.0" @@ -365,13 +372,13 @@ dependencies = [ "lazycell", "log", "peeking_take_while", - "prettyplease 0.2.16", + "prettyplease 0.2.17", "proc-macro2", "quote", "regex", "rustc-hash", "shlex", - "syn 2.0.48", + "syn 2.0.55", "which", ] @@ -423,9 +430,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.2" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" [[package]] name = "bitvec" @@ -441,9 +448,9 @@ dependencies = [ [[package]] name = "blake3" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0231f06152bf547e9c2b5194f247cd97aacf6dcd8b15d8e5ec0663f64580da87" +checksum = "30cca6d3674597c30ddf2c587bf8d9d65c9a84d2326d941cc79c9842dfe0ef52" dependencies = [ "arrayref", "arrayvec", @@ -484,9 +491,9 @@ dependencies = [ [[package]] name = "borsh" -version = "1.3.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f58b559fd6448c6e2fd0adb5720cd98a2506594cafa4737ff98c396f3e82f667" +checksum = "0901fc8eb0aca4c83be0106d6f2db17d86a08dfc2c25f0e84464bf381158add6" dependencies = [ "borsh-derive", "cfg_aliases", @@ -494,15 +501,15 @@ dependencies = [ [[package]] name = "borsh-derive" -version = "1.3.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aadb5b6ccbd078890f6d7003694e33816e6b784358f18e15e7e6d9f065a57cd" +checksum = "51670c3aa053938b0ee3bd67c3817e471e626151131b934038e83c5bf8de48f5" dependencies = [ "once_cell", "proc-macro-crate 3.1.0", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.55", "syn_derive", ] @@ -514,24 +521,24 @@ checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" [[package]] name = "bs58" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5353f36341f7451062466f0b755b96ac3a9547e4d7f6b70d603fc721a7d7896" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" dependencies = [ "tinyvec", ] [[package]] name = "bumpalo" -version = "3.14.0" +version = "3.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" +checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa" [[package]] name = "bytecheck" -version = "0.6.11" +version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6372023ac861f6e6dc89c8344a8f398fb42aaba2b5dbc649ca0c0e9dbcb627" +checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" dependencies = [ "bytecheck_derive", "ptr_meta", @@ -540,9 +547,9 @@ dependencies = [ [[package]] name = "bytecheck_derive" -version = "0.6.11" +version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7ec4c6f261935ad534c0c22dbef2201b45918860eb1c574b972bd213a76af61" +checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" dependencies = [ "proc-macro2", "quote", @@ -563,9 +570,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.5.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" dependencies = [ "serde", ] @@ -592,9 +599,9 @@ dependencies = [ [[package]] name = "cargo-platform" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ceed8ef69d8518a5dda55c07425450b58a4e1946f4951eab6d7191ee86c2443d" +checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc" dependencies = [ "serde", ] @@ -620,9 +627,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.0.83" +version = "1.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +checksum = "8cd6604a82acf3039f1144f54b8eb34e91ffba622051189e71b781822d5ee1f5" dependencies = [ "jobserver", "libc", @@ -661,7 +668,7 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-targets 0.52.0", + "windows-targets 0.52.4", ] [[package]] @@ -712,9 +719,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.4.18" +version = "4.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e578d6ec4194633722ccf9544794b71b1385c3c027efe0c55db226fc880865c" +checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0" dependencies = [ "clap_builder", "clap_derive", @@ -722,33 +729,33 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.18" +version = "4.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4df4df40ec50c46000231c914968278b1eb05098cf8f1b3a518a95030e71d1c7" +checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" dependencies = [ "anstream", "anstyle", "clap_lex", - "strsim", + "strsim 0.11.0", ] [[package]] name = "clap_derive" -version = "4.4.7" +version = "4.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" +checksum = "528131438037fd55894f62d6e9f068b8f45ac57ffa77517819645d10aed04f64" dependencies = [ - "heck", + "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.55", ] [[package]] name = "clap_lex" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" +checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" [[package]] name = "colorchoice" @@ -857,9 +864,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.3.2" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" dependencies = [ "cfg-if", ] @@ -902,9 +909,9 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.11" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "176dc175b78f56c0f321911d9c8eb2b77a78a4860b9c19db83835fea1a46649b" +checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95" dependencies = [ "crossbeam-utils", ] @@ -967,9 +974,9 @@ dependencies = [ [[package]] name = "curve25519-dalek" -version = "4.1.1" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89b8c6a2e4b1f45971ad09761aafb85514a84744b67a95e32c3cc1352d1f65c" +checksum = "0a677b8922c94e01bdbb12126b0bc852f00447528dee1782229af9c720c3f348" dependencies = [ "cfg-if", "cpufeatures", @@ -990,7 +997,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.55", ] [[package]] @@ -1014,16 +1021,16 @@ name = "dapi-grpc-macros" version = "1.0.0-dev.9" dependencies = [ "dapi-grpc", - "heck", + "heck 0.4.1", "quote", - "syn 2.0.48", + "syn 2.0.55", ] [[package]] name = "darling" -version = "0.20.3" +version = "0.20.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" +checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" dependencies = [ "darling_core", "darling_macro", @@ -1031,33 +1038,33 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.3" +version = "0.20.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" +checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", - "strsim", - "syn 2.0.48", + "strsim 0.10.0", + "syn 2.0.55", ] [[package]] name = "darling_macro" -version = "0.20.3" +version = "0.20.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" +checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" dependencies = [ "darling_core", "quote", - "syn 2.0.48", + "syn 2.0.55", ] [[package]] name = "dashcore" version = "0.30.0" -source = "git+https://github.com/dashpay/rust-dashcore?branch=master#25053c8e31e57d26f5876eff50bfc06ad9ee8b72" +source = "git+https://github.com/dashpay/rust-dashcore?branch=master#a29315dbe56729be1be963fb6f7b60a22288663f" dependencies = [ "anyhow", "bech32", @@ -1073,7 +1080,7 @@ dependencies = [ [[package]] name = "dashcore-private" version = "0.1.0" -source = "git+https://github.com/dashpay/rust-dashcore?branch=master#25053c8e31e57d26f5876eff50bfc06ad9ee8b72" +source = "git+https://github.com/dashpay/rust-dashcore?branch=master#a29315dbe56729be1be963fb6f7b60a22288663f" [[package]] name = "dashcore-rpc" @@ -1107,7 +1114,7 @@ dependencies = [ [[package]] name = "dashcore_hashes" version = "0.12.0" -source = "git+https://github.com/dashpay/rust-dashcore?branch=master#25053c8e31e57d26f5876eff50bfc06ad9ee8b72" +source = "git+https://github.com/dashpay/rust-dashcore?branch=master#a29315dbe56729be1be963fb6f7b60a22288663f" dependencies = [ "dashcore-private", "rs-x11-hash", @@ -1249,7 +1256,7 @@ dependencies = [ "env_logger 0.9.3", "getrandom", "hex", - "indexmap 2.1.0", + "indexmap 2.2.6", "integer-encoding 4.0.0", "itertools 0.10.5", "json-patch", @@ -1286,7 +1293,7 @@ dependencies = [ "anyhow", "arc-swap", "base64 0.21.7", - "bs58 0.5.0", + "bs58 0.5.1", "byteorder", "chrono", "ciborium", @@ -1299,7 +1306,7 @@ dependencies = [ "grovedb-path", "grovedb-storage", "hex", - "indexmap 2.1.0", + "indexmap 2.2.6", "integer-encoding 4.0.0", "intmap", "itertools 0.11.0", @@ -1327,7 +1334,7 @@ dependencies = [ "bincode 2.0.0-rc.3", "chrono", "ciborium", - "clap 4.4.18", + "clap 4.5.4", "console-subscriber", "dapi-grpc", "dashcore-rpc", @@ -1356,7 +1363,7 @@ dependencies = [ "rust_decimal_macros", "serde", "serde_json", - "serde_with 3.5.0", + "serde_with 3.7.0", "sha2", "simple-signer", "strategy-tests", @@ -1419,9 +1426,9 @@ dependencies = [ [[package]] name = "ed25519-dalek" -version = "2.1.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f628eaec48bfd21b865dc2950cfa014450c01d2fa2b69a86c2fd5844ec523c0" +checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" dependencies = [ "curve25519-dalek", "ed25519", @@ -1434,9 +1441,9 @@ dependencies = [ [[package]] name = "either" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" [[package]] name = "enum-map" @@ -1455,7 +1462,7 @@ checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.55", ] [[package]] @@ -1548,12 +1555,13 @@ dependencies = [ [[package]] name = "fancy-regex" -version = "0.7.1" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d6b8560a05112eb52f04b00e5d3790c0dd75d9d980eb8a122fb23b92a623ccf" +checksum = "531e46835a22af56d1e3b66f04844bed63158bc094a628bec1d321d9b4c44bf2" dependencies = [ "bit-set", - "regex", + "regex-automata 0.4.6", + "regex-syntax 0.8.3", ] [[package]] @@ -1567,9 +1575,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.0.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" +checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984" [[package]] name = "feature-flags-contract" @@ -1583,9 +1591,9 @@ dependencies = [ [[package]] name = "fiat-crypto" -version = "0.2.5" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27573eac26f4dd11e2b1916c3fe1baa56407c83c71a773a8ba17ec0bca03b6b7" +checksum = "c007b1ae3abe1cb6f85a16305acd418b7ca6343b953633fee2b76d8f108b830f" [[package]] name = "file-rotate" @@ -1648,9 +1656,9 @@ dependencies = [ [[package]] name = "fraction" -version = "0.9.0" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aba3510011eee8825018be07f08d9643421de007eaf62a3bde58d89b058abfa7" +checksum = "b486ab61634f05b11b591c38c71fb25139cb55e22be4fb6ecf649cc3736c074a" dependencies = [ "lazy_static", "num", @@ -1745,7 +1753,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.55", ] [[package]] @@ -1903,9 +1911,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.24" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9" +checksum = "4fbd2820c5e49886948654ab546d0688ff24530286bdcf8fca3cefb16d4618eb" dependencies = [ "bytes", "fnv", @@ -1913,7 +1921,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap 2.1.0", + "indexmap 2.2.6", "slab", "tokio", "tokio-util", @@ -1922,9 +1930,9 @@ dependencies = [ [[package]] name = "half" -version = "1.8.2" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" +checksum = "1b43ede17f21864e81be2fa654110bf1e793774238d86ef8555c37e6519c0403" [[package]] name = "hashbrown" @@ -1932,7 +1940,7 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ - "ahash 0.7.7", + "ahash 0.7.8", ] [[package]] @@ -1941,7 +1949,7 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ff8ae62cd3a9102e5637afc8452c55acf3844001bd5374e0b0bd7b6616c038" dependencies = [ - "ahash 0.8.7", + "ahash 0.8.11", ] [[package]] @@ -1950,7 +1958,7 @@ version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" dependencies = [ - "ahash 0.8.7", + "ahash 0.8.11", "allocator-api2", ] @@ -1973,6 +1981,12 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + [[package]] name = "hermit-abi" version = "0.1.19" @@ -1984,9 +1998,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.3.4" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d3d0e0f38255e7fa3cf31335b3a56f05febd18025f4db5ef7a0cfb4f8da651f" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] name = "hex" @@ -2014,9 +2028,9 @@ dependencies = [ [[package]] name = "http" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" dependencies = [ "bytes", "fnv", @@ -2069,7 +2083,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.4.10", + "socket2 0.5.6", "tokio", "tower-service", "tracing", @@ -2090,9 +2104,9 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.59" +version = "0.1.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6a67363e2aa4443928ce15e57ebae94fd8949958fd1223c4cfc0cd473ad7539" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -2140,9 +2154,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.1.0" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" dependencies = [ "equivalent", "hashbrown 0.14.3", @@ -2185,7 +2199,7 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" dependencies = [ - "hermit-abi 0.3.4", + "hermit-abi 0.3.9", "libc", "windows-sys 0.48.0", ] @@ -2198,20 +2212,20 @@ checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" [[package]] name = "is-terminal" -version = "0.4.10" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bad00257d07be169d870ab665980b06cdb366d792ad690bf2e76876dc503455" +checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" dependencies = [ - "hermit-abi 0.3.4", - "rustix 0.38.30", + "hermit-abi 0.3.9", + "libc", "windows-sys 0.52.0", ] [[package]] name = "iso8601" -version = "0.4.2" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5b94fbeb759754d87e1daea745bc8efd3037cd16980331fe1d1524c9a79ce96" +checksum = "924e5d73ea28f59011fec52a0d12185d496a9b075d360657aed2a5707f701153" dependencies = [ "nom", ] @@ -2236,15 +2250,15 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "jobserver" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" +checksum = "ab46a6e9526ddef3ae7f787c06f0f2600639ba80ea3eade3d8e670a2230f51d6" dependencies = [ "libc", ] @@ -2295,11 +2309,11 @@ dependencies = [ [[package]] name = "jsonschema" version = "0.15.0" -source = "git+https://github.com/fominok/jsonschema-rs?branch=feat-unevaluated-properties#18f61ab46b4a06fb313fadadffd669058bddeafd" +source = "git+https://github.com/fominok/jsonschema-rs?branch=feat-unevaluated-properties#bb4800c8bb00803e088ac6ca724116d4fda12efe" dependencies = [ - "ahash 0.7.7", + "ahash 0.8.11", "anyhow", - "base64 0.13.1", + "base64 0.22.0", "bytecount", "fancy-regex", "fraction", @@ -2315,7 +2329,7 @@ dependencies = [ "serde_json", "time", "url", - "uuid 0.8.2", + "uuid", ] [[package]] @@ -2338,18 +2352,18 @@ checksum = "744a4c881f502e98c2241d2e5f50040ac73b30194d64452bb6260393b53f0dc9" [[package]] name = "libc" -version = "0.2.152" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "libloading" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c571b676ddfc9a8c12f1f3d3085a7b163966a8fd8098a90640953ce5f6170161" +checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" dependencies = [ "cfg-if", - "windows-sys 0.48.0", + "windows-targets 0.52.4", ] [[package]] @@ -2370,9 +2384,9 @@ dependencies = [ [[package]] name = "libz-sys" -version = "1.1.14" +version = "1.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "295c17e837573c8c821dbaeb3cceb3d745ad082f7572191409e69cbc1b3fd050" +checksum = "5e143b5e666b2695d28f6bca6497720813f699c9602dd7f5cac91008b8ada7f9" dependencies = [ "cc", "pkg-config", @@ -2403,15 +2417,15 @@ dependencies = [ [[package]] name = "log" -version = "0.4.20" +version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" [[package]] name = "lru" -version = "0.12.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2c024b41519440580066ba82aab04092b333e09066a5eb86c7c4890df31f22" +checksum = "d3262e75e648fce39813cb56ac41f3c3e3f65217ebf3844d818d1f9398cfb0dc" dependencies = [ "hashbrown 0.14.3", ] @@ -2472,7 +2486,7 @@ version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fde3af1a009ed76a778cb84fdef9e7dbbdf5775ae3e4cc1f434a6a307f6f76c5" dependencies = [ - "ahash 0.8.7", + "ahash 0.8.11", "metrics-macros", "portable-atomic", ] @@ -2503,7 +2517,7 @@ checksum = "38b4faf00617defe497754acde3024865bc143d44a86799b24e191ecff91354f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.55", ] [[package]] @@ -2535,18 +2549,18 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" dependencies = [ "adler", ] [[package]] name = "mio" -version = "0.8.10" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", "wasi", @@ -2602,7 +2616,7 @@ dependencies = [ "tagptr", "thiserror", "triomphe", - "uuid 1.7.0", + "uuid", ] [[package]] @@ -2651,9 +2665,9 @@ dependencies = [ [[package]] name = "num" -version = "0.2.1" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8536030f9fea7127f841b45bb6243b27255787fb4eb83958aa1ef9d2fdc0c36" +checksum = "b05180d69e3da0e530ba2a1dae5110317e49e3b7f3d41be227dc5f92e49ee7af" dependencies = [ "num-bigint", "num-complex", @@ -2665,9 +2679,9 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.2.6" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" dependencies = [ "autocfg", "num-integer", @@ -2682,40 +2696,44 @@ checksum = "63335b2e2c34fae2fb0aa2cecfd9f0832a1e24b3b32ecec612c3426d46dc8aaa" [[package]] name = "num-complex" -version = "0.2.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6b19411a9719e753aff12e5187b74d60d3dc449ec3f4dc21e3989c3f554bc95" +checksum = "23c6602fda94a57c990fe0df199a035d83576b496aa29f4e634a8ac6004e68a6" dependencies = [ - "autocfg", "num-traits", ] +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + [[package]] name = "num-derive" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfb77679af88f8b125209d354a202862602672222e7f2313fdd6dc349bad4712" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.55", ] [[package]] name = "num-integer" -version = "0.1.45" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ - "autocfg", "num-traits", ] [[package]] name = "num-iter" -version = "0.1.43" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" +checksum = "d869c01cc0c455284163fd0092f1f93835385ccab5a98a0dcc497b2f8bf055a9" dependencies = [ "autocfg", "num-integer", @@ -2724,9 +2742,9 @@ dependencies = [ [[package]] name = "num-rational" -version = "0.2.4" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c000134b5dbf44adc5cb772486d335293351644b801551abe8f75c84cfa4aef" +checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" dependencies = [ "autocfg", "num-bigint", @@ -2736,9 +2754,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.17" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" dependencies = [ "autocfg", ] @@ -2749,7 +2767,7 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.3.4", + "hermit-abi 0.3.9", "libc", ] @@ -2861,27 +2879,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" dependencies = [ "fixedbitset", - "indexmap 2.1.0", + "indexmap 2.2.6", ] [[package]] name = "pin-project" -version = "1.1.3" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.3" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.55", ] [[package]] @@ -2908,9 +2926,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2900ede94e305130c13ddd391e0ab7cbaeb783945ae07a279c268cb05109c6cb" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "platform-serialization" @@ -2926,7 +2944,7 @@ version = "1.0.0-dev.9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.55", "virtue 0.0.14", ] @@ -2939,7 +2957,7 @@ dependencies = [ "bs58 0.4.0", "ciborium", "hex", - "indexmap 2.1.0", + "indexmap 2.2.6", "lazy_static", "platform-serialization", "platform-version", @@ -2948,7 +2966,7 @@ dependencies = [ "serde", "serde_json", "thiserror", - "treediff 4.0.2", + "treediff 4.0.3", ] [[package]] @@ -2956,7 +2974,7 @@ name = "platform-value-convertible" version = "1.0.0-dev.9" dependencies = [ "quote", - "syn 2.0.48", + "syn 2.0.55", ] [[package]] @@ -2972,14 +2990,14 @@ version = "1.0.0-dev.9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.55", ] [[package]] name = "platforms" -version = "3.3.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "626dec3cac7cc0e1577a2ec3fc496277ec2baa084bebad95bb6fdbfae235f84c" +checksum = "db23d408679286588f4d4644f965003d056e3dd5abcaaa938116871d7ce2fee7" [[package]] name = "plotters" @@ -3095,12 +3113,12 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a41cf62165e97c7f814d2221421dbb9afcbcdb0a88068e5ea206e19951c2cbb5" +checksum = "8d3928fb5db768cb86f891ff014f0144589297e3c6a1aba6ed7cecfdace270c7" dependencies = [ "proc-macro2", - "syn 2.0.48", + "syn 2.0.55", ] [[package]] @@ -3119,7 +3137,7 @@ version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" dependencies = [ - "toml_edit 0.21.0", + "toml_edit 0.21.1", ] [[package]] @@ -3148,9 +3166,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.78" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" dependencies = [ "unicode-ident", ] @@ -3182,7 +3200,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "119533552c9a7ffacc21e099c24a0ac8bb19c2a2a3f363de84cd9b844feab270" dependencies = [ "bytes", - "heck", + "heck 0.4.1", "itertools 0.10.5", "lazy_static", "log", @@ -3204,17 +3222,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c55e02e35260070b6f716a2423c2ff1c3bb1642ddca6f99e1f26d06268a0e2d2" dependencies = [ "bytes", - "heck", - "itertools 0.10.5", + "heck 0.4.1", + "itertools 0.11.0", "log", "multimap", "once_cell", "petgraph", - "prettyplease 0.2.16", + "prettyplease 0.2.17", "prost 0.12.3", "prost-types 0.12.3", "regex", - "syn 2.0.48", + "syn 2.0.55", "tempfile", "which", ] @@ -3239,10 +3257,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "efb6c9a1dd1def8e2124d17e83a20af56f1570d6c2d2bd9e266ccb768df3840e" dependencies = [ "anyhow", - "itertools 0.10.5", + "itertools 0.11.0", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.55", ] [[package]] @@ -3285,11 +3303,11 @@ dependencies = [ [[package]] name = "pulldown-cmark" -version = "0.9.3" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a1a2f1f0a7ecff9c31abbe177637be0e97a0aef46cf8738ece09327985d998" +checksum = "57206b407293d2bcd3af849ce869d52068623f19e1b5ff8e8778e3309439682b" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.5.0", "memchr", "unicase", ] @@ -3366,9 +3384,9 @@ dependencies = [ [[package]] name = "rayon" -version = "1.8.1" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7237101a77a10773db45d62004a272517633fbcc3df19d96455ede1122e051" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" dependencies = [ "either", "rayon-core", @@ -3395,14 +3413,14 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.3" +version = "1.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" +checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.4", - "regex-syntax 0.8.2", + "regex-automata 0.4.6", + "regex-syntax 0.8.3", ] [[package]] @@ -3416,13 +3434,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.4" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b7fa1134405e2ec9353fd416b17f8dacd46c473d7d3fd1cf202706a14eb792a" +checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.2", + "regex-syntax 0.8.3", ] [[package]] @@ -3433,15 +3451,15 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" [[package]] name = "rend" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2571463863a6bd50c32f94402933f03457a3fbaf697a707c5be741e459f08fd" +checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" dependencies = [ "bytecheck", ] @@ -3457,23 +3475,24 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.7" +version = "0.17.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", + "cfg-if", "getrandom", "libc", "spin", "untrusted", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "rkyv" -version = "0.7.43" +version = "0.7.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "527a97cdfef66f65998b5f3b637c26f5a5ec09cc52a3f9932313ac645f4190f5" +checksum = "5cba464629b3394fc4dbc6f940ff8f5b4ff5c7aef40f29166fd4ad12acbc99c0" dependencies = [ "bitvec", "bytecheck", @@ -3484,14 +3503,14 @@ dependencies = [ "rkyv_derive", "seahash", "tinyvec", - "uuid 1.7.0", + "uuid", ] [[package]] name = "rkyv_derive" -version = "0.7.43" +version = "0.7.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5c462a1328c8e67e4d6dbad1eb0355dd43e8ab432c6e227a43657f16ade5033" +checksum = "a7dddfff8de25e6f62b9d64e6e432bf1c6736c57d20323e15ee10435fbda7c65" dependencies = [ "proc-macro2", "quote", @@ -3534,7 +3553,7 @@ dependencies = [ "bincode 2.0.0-rc.3", "bip37-bloom-filter", "ciborium", - "clap 4.4.18", + "clap 4.5.4", "dapi-grpc", "dapi-grpc-macros", "dashcore-rpc", @@ -3574,9 +3593,9 @@ dependencies = [ [[package]] name = "rust_decimal" -version = "1.33.1" +version = "1.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06676aec5ccb8fc1da723cc8c0f9a46549f21ebb8753d3915c6c41db1e7f1dc4" +checksum = "1790d1c4c0ca81211399e0e0af16333276f375209e71a37b67698a373db5b47a" dependencies = [ "arrayvec", "borsh", @@ -3590,9 +3609,9 @@ dependencies = [ [[package]] name = "rust_decimal_macros" -version = "1.33.1" +version = "1.34.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e43721f4ef7060ebc2c3ede757733209564ca8207f47674181bcd425dd76945" +checksum = "e418701588729bef95e7a655f2b483ad64bb97c46e8e79fde83efd92aaab6d82" dependencies = [ "quote", "rust_decimal", @@ -3635,11 +3654,11 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.30" +version = "0.38.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "322394588aaf33c24007e8bb3238ee3e4c5c09c084ab32bc73890b99ff326bca" +checksum = "65e04861e65f21776e67888bfbea442b3642beaa0138fdb1dd7a84a52dffdb89" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.5.0", "errno", "libc", "linux-raw-sys 0.4.13", @@ -3648,26 +3667,14 @@ dependencies = [ [[package]] name = "rustls" -version = "0.21.10" +version = "0.22.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" -dependencies = [ - "log", - "ring", - "rustls-webpki 0.101.7", - "sct", -] - -[[package]] -name = "rustls" -version = "0.22.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e87c9956bd9807afa1f77e0f7594af32566e830e088a5576d27c5b6f30f49d41" +checksum = "99008d7ad0bbbea527ec27bddbc0e432c5b87d8175178cee68d2eec9c4a1813c" dependencies = [ "log", "ring", "rustls-pki-types", - "rustls-webpki 0.102.2", + "rustls-webpki", "subtle", "zeroize", ] @@ -3687,9 +3694,9 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35e4980fa29e4c4b212ffb3db068a564cbf560e51d3944b7c88bd8bf5bec64f4" +checksum = "f48172685e6ff52a556baa527774f61fcaa884f59daf3375c62a3f1cd2549dab" dependencies = [ "base64 0.21.7", "rustls-pki-types", @@ -3697,19 +3704,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.2.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a716eb65e3158e90e17cd93d855216e27bde02745ab842f2cab4a39dba1bacf" - -[[package]] -name = "rustls-webpki" -version = "0.101.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" -dependencies = [ - "ring", - "untrusted", -] +checksum = "868e20fada228fefaf6b652e00cc73623d54f8171e7352c18bb281571f2d92da" [[package]] name = "rustls-webpki" @@ -3730,9 +3727,9 @@ checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" [[package]] name = "ryu" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" [[package]] name = "same-file" @@ -3777,16 +3774,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" -[[package]] -name = "sct" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" -dependencies = [ - "ring", - "untrusted", -] - [[package]] name = "seahash" version = "4.1.0" @@ -3839,18 +3826,18 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.21" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" +checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" dependencies = [ "serde", ] [[package]] name = "serde" -version = "1.0.195" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63261df402c67811e9ac6def069e4786148c4563f4b50fd4bf30aa370d626b02" +checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" dependencies = [ "serde_derive", ] @@ -3886,22 +3873,22 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.195" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46fe8f8603d81ba86327b23a2e9cdf49e1255fb94a4c5f297f6ee0547178ea2c" +checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.55", ] [[package]] name = "serde_json" -version = "1.0.111" +version = "1.0.115" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "176e46fa42316f18edd598015a5166857fc835ec732f5215eac6b7bdbf0a84f4" +checksum = "12dc5c46daa8e9fdf4f5e71b6cf9a53f2487da0e86e55808e2d35539666497dd" dependencies = [ - "indexmap 2.1.0", + "indexmap 2.2.6", "itoa", "ryu", "serde", @@ -3915,7 +3902,7 @@ checksum = "0b2e6b945e9d3df726b65d6ee24060aff8e3533d431f677a9695db04eff9dfdb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.55", ] [[package]] @@ -3936,16 +3923,17 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.5.0" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f58c3a1b3e418f61c25b2aeb43fc6c95eaa252b8cecdda67f401943e9e08d33f" +checksum = "ee80b0e361bbf88fd2f6e242ccd19cfda072cb0faa6ae694ecee08199938569a" dependencies = [ "base64 0.21.7", "chrono", "hex", "serde", + "serde_derive", "serde_json", - "serde_with_macros 3.5.0", + "serde_with_macros 3.7.0", "time", ] @@ -3958,19 +3946,19 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.55", ] [[package]] name = "serde_with_macros" -version = "3.5.0" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2068b437a31fc68f25dd7edc296b078f04b45145c199d8eed9866e45f1ff274" +checksum = "6561dc161a9224638a31d876ccdfefbc1df91d3f3a8342eddb35f055d48c7655" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.55", ] [[package]] @@ -4050,9 +4038,9 @@ dependencies = [ [[package]] name = "sketches-ddsketch" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68a406c1882ed7f29cd5e248c9848a80e7cb6ae0fea82346d2746f2f941c07e1" +checksum = "85636c14b73d81f541e525f585c0a2109e6744e1565b5c1668e31c70c10ed65c" [[package]] name = "slab" @@ -4065,9 +4053,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.13.1" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "socket2" @@ -4081,12 +4069,12 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.5" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" dependencies = [ "libc", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -4137,6 +4125,12 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +[[package]] +name = "strsim" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01" + [[package]] name = "strum" version = "0.24.1" @@ -4161,7 +4155,7 @@ version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" dependencies = [ - "heck", + "heck 0.4.1", "proc-macro2", "quote", "rustversion", @@ -4174,11 +4168,11 @@ version = "0.25.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" dependencies = [ - "heck", + "heck 0.4.1", "proc-macro2", "quote", "rustversion", - "syn 2.0.48", + "syn 2.0.55", ] [[package]] @@ -4209,9 +4203,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.48" +version = "2.0.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" +checksum = "002a1b3dbf967edfafc32655d0f377ab0bb7b994aa1d32c8cc7e9b8bf3ebb8f0" dependencies = [ "proc-macro2", "quote", @@ -4227,7 +4221,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.55", ] [[package]] @@ -4262,21 +4256,20 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tempfile" -version = "3.9.0" +version = "3.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01ce4141aa927a6d1bd34a041795abd0db1cccba5d5f24b009f694bdf3a1f3fa" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" dependencies = [ "cfg-if", - "fastrand 2.0.1", - "redox_syscall", - "rustix 0.38.30", + "fastrand 2.0.2", + "rustix 0.38.32", "windows-sys 0.52.0", ] [[package]] name = "tenderdash-abci" -version = "0.14.0-dev.9" -source = "git+https://github.com/dashpay/rs-tenderdash-abci#af64c65d94ef233053be8616e4c92f571fb5aae0" +version = "0.14.0-dev.10" +source = "git+https://github.com/dashpay/rs-tenderdash-abci#883d1f5d3ecb26a97dab7a08400fede53059ea62" dependencies = [ "bytes", "futures", @@ -4284,6 +4277,7 @@ dependencies = [ "lhash", "prost 0.12.3", "semver", + "serde_json", "tenderdash-proto", "thiserror", "tokio", @@ -4291,13 +4285,13 @@ dependencies = [ "tracing", "tracing-subscriber", "url", - "uuid 1.7.0", + "uuid", ] [[package]] name = "tenderdash-proto" -version = "0.14.0-dev.9" -source = "git+https://github.com/dashpay/rs-tenderdash-abci#af64c65d94ef233053be8616e4c92f571fb5aae0" +version = "0.14.0-dev.10" +source = "git+https://github.com/dashpay/rs-tenderdash-abci#883d1f5d3ecb26a97dab7a08400fede53059ea62" dependencies = [ "bytes", "chrono", @@ -4316,8 +4310,8 @@ dependencies = [ [[package]] name = "tenderdash-proto-compiler" -version = "0.14.0-dev.9" -source = "git+https://github.com/dashpay/rs-tenderdash-abci#af64c65d94ef233053be8616e4c92f571fb5aae0" +version = "0.14.0-dev.10" +source = "git+https://github.com/dashpay/rs-tenderdash-abci#883d1f5d3ecb26a97dab7a08400fede53059ea62" dependencies = [ "fs_extra", "prost-build 0.12.3", @@ -4377,29 +4371,29 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.56" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad" +checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.56" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471" +checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.55", ] [[package]] name = "thread_local" -version = "1.1.7" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" dependencies = [ "cfg-if", "once_cell", @@ -4407,12 +4401,13 @@ dependencies = [ [[package]] name = "time" -version = "0.3.31" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f657ba42c3f86e7680e53c8cd3af8abbe56b5491790b46e22e19c0d57463583e" +checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749" dependencies = [ "deranged", "itoa", + "num-conv", "powerfmt", "serde", "time-core", @@ -4427,10 +4422,11 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26197e33420244aeb70c3e8c78376ca46571bc4e701e4791c2cd9f57dcb3a43f" +checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774" dependencies = [ + "num-conv", "time-core", ] @@ -4473,7 +4469,7 @@ dependencies = [ "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.5", + "socket2 0.5.6", "tokio-macros", "tracing", "windows-sys 0.48.0", @@ -4497,7 +4493,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.55", ] [[package]] @@ -4506,16 +4502,16 @@ version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" dependencies = [ - "rustls 0.22.2", + "rustls", "rustls-pki-types", "tokio", ] [[package]] name = "tokio-stream" -version = "0.1.14" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" +checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" dependencies = [ "futures-core", "pin-project-lite", @@ -4524,9 +4520,9 @@ dependencies = [ [[package]] name = "tokio-test" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89b3cbabd3ae862100094ae433e1def582cf86451b4e9bf83aa7ac1d8a7d719" +checksum = "2468baabc3311435b55dd935f702f42cd1b8abb7e754fb7dfb16bd36aa88f9f7" dependencies = [ "async-stream", "bytes", @@ -4561,18 +4557,18 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.1.0", + "indexmap 2.2.6", "toml_datetime", "winnow", ] [[package]] name = "toml_edit" -version = "0.21.0" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03" +checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" dependencies = [ - "indexmap 2.1.0", + "indexmap 2.2.6", "toml_datetime", "winnow", ] @@ -4654,11 +4650,11 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be4ef6dd70a610078cb4e338a0f79d06bc759ff1b22d2120c2ff02ae264ba9c2" dependencies = [ - "prettyplease 0.2.16", + "prettyplease 0.2.17", "proc-macro2", "prost-build 0.12.3", "quote", - "syn 2.0.48", + "syn 2.0.55", ] [[package]] @@ -4712,7 +4708,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.55", ] [[package]] @@ -4778,9 +4774,9 @@ dependencies = [ [[package]] name = "treediff" -version = "4.0.2" +version = "4.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52984d277bdf2a751072b5df30ec0377febdb02f7696d64c2d7d54630bac4303" +checksum = "4d127780145176e2b5d16611cc25a900150e86e9fd79d3bde6ff3a37359c9cb5" [[package]] name = "triomphe" @@ -4823,9 +4819,9 @@ checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-normalization" -version = "0.1.22" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" dependencies = [ "tinyvec", ] @@ -4862,16 +4858,17 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "ureq" -version = "2.9.1" +version = "2.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8cdd25c339e200129fe4de81451814e5228c9b771d57378817d6117cc2b3f97" +checksum = "11f214ce18d8b2cbe84ed3aa6486ed3f5b285cf8d8fbdbce9f3f767a724adc35" dependencies = [ "base64 0.21.7", "flate2", "log", "once_cell", - "rustls 0.21.10", - "rustls-webpki 0.101.7", + "rustls", + "rustls-pki-types", + "rustls-webpki", "url", "webpki-roots", ] @@ -4895,15 +4892,9 @@ checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" [[package]] name = "uuid" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" - -[[package]] -name = "uuid" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f00cc9702ca12d3c81455259621e676d0f7251cec66a21e98fe2e9a37db93b2a" +checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" dependencies = [ "getrandom", "rand", @@ -4947,9 +4938,9 @@ checksum = "f3c4517f54858c779bbcbf228f4fca63d121bf85fbecb2dc578cdf4a39395690" [[package]] name = "walkdir" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" dependencies = [ "same-file", "winapi-util", @@ -4991,7 +4982,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.55", "wasm-bindgen-shared", ] @@ -5025,7 +5016,7 @@ checksum = "e128beba882dd1eb6200e1dc92ae6c5dbaa4311aa7bb211ca035779e5efc39f8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.55", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5081,9 +5072,12 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.25.3" +version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1778a42e8b3b90bff8d0f5032bf22250792889a5cdc752aa0020c84abe3aaf10" +checksum = "b3de34ae270483955a94f4b21bdaaeb83d508bb84a01435f393818edb0012009" +dependencies = [ + "rustls-pki-types", +] [[package]] name = "which" @@ -5094,7 +5088,7 @@ dependencies = [ "either", "home", "once_cell", - "rustix 0.38.30", + "rustix 0.38.32", ] [[package]] @@ -5134,7 +5128,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.4", ] [[package]] @@ -5152,7 +5146,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.4", ] [[package]] @@ -5172,17 +5166,17 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" dependencies = [ - "windows_aarch64_gnullvm 0.52.0", - "windows_aarch64_msvc 0.52.0", - "windows_i686_gnu 0.52.0", - "windows_i686_msvc 0.52.0", - "windows_x86_64_gnu 0.52.0", - "windows_x86_64_gnullvm 0.52.0", - "windows_x86_64_msvc 0.52.0", + "windows_aarch64_gnullvm 0.52.4", + "windows_aarch64_msvc 0.52.4", + "windows_i686_gnu 0.52.4", + "windows_i686_msvc 0.52.4", + "windows_x86_64_gnu 0.52.4", + "windows_x86_64_gnullvm 0.52.4", + "windows_x86_64_msvc 0.52.4", ] [[package]] @@ -5193,9 +5187,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" +checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" [[package]] name = "windows_aarch64_msvc" @@ -5205,9 +5199,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" +checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" [[package]] name = "windows_i686_gnu" @@ -5217,9 +5211,9 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" +checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" [[package]] name = "windows_i686_msvc" @@ -5229,9 +5223,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" +checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" [[package]] name = "windows_x86_64_gnu" @@ -5241,9 +5235,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" +checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" [[package]] name = "windows_x86_64_gnullvm" @@ -5253,9 +5247,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" +checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" [[package]] name = "windows_x86_64_msvc" @@ -5265,15 +5259,15 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" +checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" [[package]] name = "winnow" -version = "0.5.34" +version = "0.5.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7cf47b659b318dccbd69cc4797a39ae128f533dce7902a1096044d1967b9c16" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" dependencies = [ "memchr", ] @@ -5323,7 +5317,7 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.55", ] [[package]] diff --git a/packages/dashmate/templates/platform/drive/tenderdash/config.toml.dot b/packages/dashmate/templates/platform/drive/tenderdash/config.toml.dot index 8dbf0527fb..5320cd0e93 100644 --- a/packages/dashmate/templates/platform/drive/tenderdash/config.toml.dot +++ b/packages/dashmate/templates/platform/drive/tenderdash/config.toml.dot @@ -362,7 +362,7 @@ tx-recv-rate-punish-peer = false # Maximum size of a single transaction. # NOTE: the max size of a tx transmitted over the network is {max-tx-bytes}. -max-tx-bytes = 1048576 +max-tx-bytes = 50000 # Maximum size of a batch of transactions to send to a peer # Including space needed by encoding (one varint per transaction). diff --git a/packages/js-dash-sdk/src/SDK/Client/Client.spec.ts b/packages/js-dash-sdk/src/SDK/Client/Client.spec.ts index a752c1df44..b44f7cd02f 100644 --- a/packages/js-dash-sdk/src/SDK/Client/Client.spec.ts +++ b/packages/js-dash-sdk/src/SDK/Client/Client.spec.ts @@ -181,9 +181,9 @@ describe('Dash - Client', function suite() { describe('#platform.identities.topUp', async () => { it('should top up an identity', async () => { // Registering an identity we're going to top up - const identity = await client.platform.identities.register(1000); + const identity = await client.platform.identities.register(200000); // Topping up the identity - await client.platform.identities.topUp(identity.getId(), 1000); + await client.platform.identities.topUp(identity.getId(), 60000); expect(identity).to.be.not.null; @@ -206,7 +206,7 @@ describe('Dash - Client', function suite() { it('should throw TransitionBroadcastError when transport resolves error', async () => { // Registering an identity we're going to top up - const identity = await client.platform.identities.register(10000); + const identity = await client.platform.identities.register(200000); const errorResponse = { error: { @@ -234,7 +234,7 @@ describe('Dash - Client', function suite() { describe('#platform.identities.update', async () => { it('should update an identity', async () => { - const identity = await client.platform.identities.register(1000); + const identity = await client.platform.identities.register(200000); const privateKey = new PrivateKey(privateKeyFixture); @@ -271,7 +271,7 @@ describe('Dash - Client', function suite() { it('should throw TransitionBroadcastError when transport resolves error', async () => { // Registering an identity we're going to top up - const identity = await client.platform.identities.register(10000); + const identity = await client.platform.identities.register(200000); const errorResponse = { error: { diff --git a/packages/platform-test-suite/test/e2e/dpns.spec.js b/packages/platform-test-suite/test/e2e/dpns.spec.js index 0f592c07e6..af1f275284 100644 --- a/packages/platform-test-suite/test/e2e/dpns.spec.js +++ b/packages/platform-test-suite/test/e2e/dpns.spec.js @@ -59,7 +59,7 @@ describe('DPNS', () => { before(async () => { ownerClient = await createClientWithFundedWallet( - 10000, + 200000, process.env.DPNS_OWNER_PRIVATE_KEY, ); @@ -67,7 +67,7 @@ describe('DPNS', () => { identity = await ownerClient.platform.identities.get(dpnsOwnerId); expect(identity).to.exist(); - await ownerClient.platform.identities.topUp(dpnsOwnerId, 1000); + await ownerClient.platform.identities.topUp(dpnsOwnerId, 60000); }); after(async () => { diff --git a/packages/platform-test-suite/test/functional/platform/Identity.spec.js b/packages/platform-test-suite/test/functional/platform/Identity.spec.js index 4d39d67755..2499e16cd2 100644 --- a/packages/platform-test-suite/test/functional/platform/Identity.spec.js +++ b/packages/platform-test-suite/test/functional/platform/Identity.spec.js @@ -22,8 +22,8 @@ const { Identifier, IdentityPublicKey, InvalidInstantAssetLockProofSignatureError, - InvalidAssetLockProofValueError, IdentityAssetLockTransactionOutPointAlreadyExistsError, + IdentityAssetLockTransactionOutPointNotEnoughBalanceError, BasicECDSAError, IdentityPublicKeyWithWitness, IdentityInsufficientBalanceError, @@ -60,15 +60,15 @@ describe('Platform', () => { let broadcastError; try { - await client.platform.identities.register(117000); + await client.platform.identities.register(197000); } catch (e) { broadcastError = e; } expect(broadcastError).to.be.an.instanceOf(StateTransitionBroadcastError); - expect(broadcastError.getCause().getCode()).to.equal(40212); + expect(broadcastError.getCause().getCode()).to.equal(10530); expect(broadcastError.getCause()).to.be.an.instanceOf( - InvalidAssetLockProofValueError, + IdentityAssetLockTransactionOutPointNotEnoughBalanceError, ); }); @@ -79,7 +79,7 @@ describe('Platform', () => { transaction, privateKey, outputIndex, - } = await client.platform.identities.utils.createAssetLockTransaction(1); + } = await client.platform.identities.utils.createAssetLockTransaction(200000); const invalidInstantLock = createFakeInstantLock(transaction.hash); const assetLockProof = await client.platform.dpp.identity.createInstantAssetLockProof( @@ -118,7 +118,7 @@ describe('Platform', () => { transaction, privateKey, outputIndex, - } = await client.platform.identities.utils.createAssetLockTransaction(150000); + } = await client.platform.identities.utils.createAssetLockTransaction(200000); const account = await client.getWalletAccount(); @@ -169,7 +169,7 @@ describe('Platform', () => { transaction, privateKey, outputIndex, - } = await client.platform.identities.utils.createAssetLockTransaction(15); + } = await client.platform.identities.utils.createAssetLockTransaction(210000); const account = await client.getWalletAccount(); @@ -262,7 +262,7 @@ describe('Platform', () => { transaction, privateKey, outputIndex, - } = await client.platform.identities.utils.createAssetLockTransaction(150000); + } = await client.platform.identities.utils.createAssetLockTransaction(200000); const account = await client.getWalletAccount(); @@ -342,7 +342,7 @@ describe('Platform', () => { }); it('should fail to create more documents if there are no more credits', async () => { - const lowBalanceIdentity = await client.platform.identities.register(150000); + const lowBalanceIdentity = await client.platform.identities.register(200000); // Additional wait time to mitigate testnet latency await waitForSTPropagated(); @@ -377,7 +377,7 @@ describe('Platform', () => { transaction, privateKey, outputIndex, - } = await client.platform.identities.utils.createAssetLockTransaction(15); + } = await client.platform.identities.utils.createAssetLockTransaction(200000); const instantLock = createFakeInstantLock(transaction.hash); const assetLockProof = await client.platform.dpp.identity @@ -459,7 +459,7 @@ describe('Platform', () => { transaction, privateKey, outputIndex, - } = await client.platform.identities.utils.createAssetLockTransaction(1000); + } = await client.platform.identities.utils.createAssetLockTransaction(200000); const account = await client.getWalletAccount(); @@ -476,7 +476,7 @@ describe('Platform', () => { // Creating ST that tries to spend the same output - const anotherIdentity = await client.platform.identities.register(150000); + const anotherIdentity = await client.platform.identities.register(200000); // Additional wait time to mitigate testnet latency await waitForSTPropagated(); diff --git a/packages/platform-test-suite/test/functional/platform/proofs.spec.js b/packages/platform-test-suite/test/functional/platform/proofs.spec.js index 1ce7b4c69e..14c43c04f8 100644 --- a/packages/platform-test-suite/test/functional/platform/proofs.spec.js +++ b/packages/platform-test-suite/test/functional/platform/proofs.spec.js @@ -32,7 +32,7 @@ describe('Platform', () => { let contractId; before(async () => { - dashClient = await createClientWithFundedWallet(500000); + dashClient = await createClientWithFundedWallet(1000000); await dashClient.platform.initialize(); @@ -134,11 +134,11 @@ describe('Platform', () => { let identity8PublicKeyHash; before(async () => { - identityAtKey5 = await dashClient.platform.identities.register(150000); + identityAtKey5 = await dashClient.platform.identities.register(200000); - identityAtKey6 = await dashClient.platform.identities.register(150000); + identityAtKey6 = await dashClient.platform.identities.register(200000); - identityAtKey8 = await dashClient.platform.identities.register(150000); + identityAtKey8 = await dashClient.platform.identities.register(200000); // await waitForBalanceToChange(walletAccount); diff --git a/packages/rs-dpp/src/asset_lock/mod.rs b/packages/rs-dpp/src/asset_lock/mod.rs new file mode 100644 index 0000000000..6d1e738cf8 --- /dev/null +++ b/packages/rs-dpp/src/asset_lock/mod.rs @@ -0,0 +1,14 @@ +use crate::asset_lock::reduced_asset_lock_value::AssetLockValue; + +pub mod reduced_asset_lock_value; + +/// An enumeration of the possible states when querying platform to get the stored state of an outpoint +/// representing if the asset lock was already used or not. +pub enum StoredAssetLockInfo { + /// The asset lock was fully consumed in the past + FullyConsumed, + /// The asset lock was partially consumed, and we stored the asset lock value in the state + PartiallyConsumed(AssetLockValue), + /// The asset lock is not yet known to Platform + NotPresent, +} diff --git a/packages/rs-dpp/src/asset_lock/reduced_asset_lock_value/mod.rs b/packages/rs-dpp/src/asset_lock/reduced_asset_lock_value/mod.rs new file mode 100644 index 0000000000..f7a93b4507 --- /dev/null +++ b/packages/rs-dpp/src/asset_lock/reduced_asset_lock_value/mod.rs @@ -0,0 +1,90 @@ +use crate::asset_lock::reduced_asset_lock_value::v0::AssetLockValueV0; +use crate::fee::Credits; +use crate::ProtocolError; +use bincode::{Decode, Encode}; +use derive_more::From; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use platform_version::version::PlatformVersion; + +mod v0; + +pub use v0::{AssetLockValueGettersV0, AssetLockValueSettersV0}; + +#[derive(Debug, Clone, Encode, Decode, PlatformSerialize, PlatformDeserialize, From, PartialEq)] +#[platform_serialize(unversioned)] +pub enum AssetLockValue { + V0(AssetLockValueV0), +} + +impl AssetLockValue { + pub fn new( + initial_credit_value: Credits, + tx_out_script: Vec, + remaining_credit_value: Credits, + platform_version: &PlatformVersion, + ) -> Result { + match platform_version + .dpp + .asset_lock_versions + .reduced_asset_lock_value + .default_current_version + { + 0 => Ok(AssetLockValue::V0(AssetLockValueV0 { + initial_credit_value, + tx_out_script, + remaining_credit_value, + })), + version => Err(ProtocolError::UnknownVersionMismatch { + method: "ReducedAssetLockValue::new".to_string(), + known_versions: vec![0], + received: version, + }), + } + } +} + +impl AssetLockValueGettersV0 for AssetLockValue { + fn initial_credit_value(&self) -> Credits { + match self { + AssetLockValue::V0(v0) => v0.initial_credit_value, + } + } + + fn tx_out_script(&self) -> &Vec { + match self { + AssetLockValue::V0(v0) => &v0.tx_out_script, + } + } + + fn tx_out_script_owned(self) -> Vec { + match self { + AssetLockValue::V0(v0) => v0.tx_out_script, + } + } + + fn remaining_credit_value(&self) -> Credits { + match self { + AssetLockValue::V0(v0) => v0.remaining_credit_value, + } + } +} + +impl AssetLockValueSettersV0 for AssetLockValue { + fn set_initial_credit_value(&mut self, value: Credits) { + match self { + AssetLockValue::V0(v0) => v0.initial_credit_value = value, + } + } + + fn set_tx_out_script(&mut self, value: Vec) { + match self { + AssetLockValue::V0(v0) => v0.tx_out_script = value, + } + } + + fn set_remaining_credit_value(&mut self, value: Credits) { + match self { + AssetLockValue::V0(v0) => v0.remaining_credit_value = value, + } + } +} diff --git a/packages/rs-dpp/src/asset_lock/reduced_asset_lock_value/v0/mod.rs b/packages/rs-dpp/src/asset_lock/reduced_asset_lock_value/v0/mod.rs new file mode 100644 index 0000000000..e3c1f4a588 --- /dev/null +++ b/packages/rs-dpp/src/asset_lock/reduced_asset_lock_value/v0/mod.rs @@ -0,0 +1,23 @@ +use crate::fee::Credits; +use bincode::{Decode, Encode}; + +#[derive(Debug, Clone, Encode, Decode, PartialEq)] +pub struct AssetLockValueV0 { + pub(super) initial_credit_value: Credits, + pub(super) tx_out_script: Vec, + pub(super) remaining_credit_value: Credits, +} + +pub trait AssetLockValueGettersV0 { + fn initial_credit_value(&self) -> Credits; + fn tx_out_script(&self) -> &Vec; + + fn tx_out_script_owned(self) -> Vec; + fn remaining_credit_value(&self) -> Credits; +} + +pub trait AssetLockValueSettersV0 { + fn set_initial_credit_value(&mut self, value: Credits); + fn set_tx_out_script(&mut self, value: Vec); + fn set_remaining_credit_value(&mut self, value: Credits); +} diff --git a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs index d41549f643..f862e25343 100644 --- a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs @@ -753,7 +753,7 @@ mod tests { "additionalProperties": false }); - let result = DocumentTypeV0::try_from_schema_v0( + let _result = DocumentTypeV0::try_from_schema_v0( Identifier::new([1; 32]), "valid_name-a-b-123", schema, diff --git a/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs b/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs index b69c9e1719..1005ccce31 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs @@ -32,7 +32,8 @@ use crate::consensus::basic::identity::{ DuplicatedIdentityPublicKeyBasicError, DuplicatedIdentityPublicKeyIdBasicError, IdentityAssetLockProofLockedTransactionMismatchError, IdentityAssetLockTransactionIsNotFoundError, - IdentityAssetLockTransactionOutPointAlreadyExistsError, + IdentityAssetLockTransactionOutPointAlreadyConsumedError, + IdentityAssetLockTransactionOutPointNotEnoughBalanceError, IdentityAssetLockTransactionOutputNotFoundError, IdentityCreditTransferToSelfError, InvalidAssetLockProofCoreChainHeightError, InvalidAssetLockProofTransactionHeightError, InvalidAssetLockTransactionOutputReturnSizeError, @@ -235,8 +236,13 @@ pub enum BasicError { IdentityAssetLockTransactionIsNotFoundError(IdentityAssetLockTransactionIsNotFoundError), #[error(transparent)] - IdentityAssetLockTransactionOutPointAlreadyExistsError( - IdentityAssetLockTransactionOutPointAlreadyExistsError, + IdentityAssetLockTransactionOutPointAlreadyConsumedError( + IdentityAssetLockTransactionOutPointAlreadyConsumedError, + ), + + #[error(transparent)] + IdentityAssetLockTransactionOutPointNotEnoughBalanceError( + IdentityAssetLockTransactionOutPointNotEnoughBalanceError, ), #[error(transparent)] diff --git a/packages/rs-dpp/src/errors/consensus/basic/document/identity_contract_nonce_out_of_bounds_error.rs b/packages/rs-dpp/src/errors/consensus/basic/document/identity_contract_nonce_out_of_bounds_error.rs index 6785b03e5e..54eee70ff2 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/document/identity_contract_nonce_out_of_bounds_error.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/document/identity_contract_nonce_out_of_bounds_error.rs @@ -22,7 +22,7 @@ pub struct NonceOutOfBoundsError { impl NonceOutOfBoundsError { pub fn new(nonce: IdentityNonce) -> Self { - Self { nonce: nonce } + Self { nonce } } pub fn identity_contract_nonce(&self) -> IdentityNonce { diff --git a/packages/rs-dpp/src/errors/consensus/basic/identity/identity_asset_lock_transaction_out_point_already_exists_error.rs b/packages/rs-dpp/src/errors/consensus/basic/identity/identity_asset_lock_transaction_out_point_already_consumed_error.rs similarity index 73% rename from packages/rs-dpp/src/errors/consensus/basic/identity/identity_asset_lock_transaction_out_point_already_exists_error.rs rename to packages/rs-dpp/src/errors/consensus/basic/identity/identity_asset_lock_transaction_out_point_already_consumed_error.rs index 31b149e0e1..250d2fc72c 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/identity/identity_asset_lock_transaction_out_point_already_exists_error.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/identity/identity_asset_lock_transaction_out_point_already_consumed_error.rs @@ -9,9 +9,9 @@ use thiserror::Error; #[derive( Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, )] -#[error("Asset lock transaction {transaction_id} output {output_index} already used")] +#[error("Asset lock transaction {transaction_id} output {output_index} already completely used")] #[platform_serialize(unversioned)] -pub struct IdentityAssetLockTransactionOutPointAlreadyExistsError { +pub struct IdentityAssetLockTransactionOutPointAlreadyConsumedError { /* DO NOT CHANGE ORDER OF FIELDS WITHOUT INTRODUCING OF NEW VERSION @@ -23,7 +23,7 @@ pub struct IdentityAssetLockTransactionOutPointAlreadyExistsError { output_index: usize, } -impl IdentityAssetLockTransactionOutPointAlreadyExistsError { +impl IdentityAssetLockTransactionOutPointAlreadyConsumedError { pub fn new(transaction_id: Txid, output_index: usize) -> Self { Self { transaction_id, @@ -40,8 +40,8 @@ impl IdentityAssetLockTransactionOutPointAlreadyExistsError { } } -impl From for ConsensusError { - fn from(err: IdentityAssetLockTransactionOutPointAlreadyExistsError) -> Self { - Self::BasicError(BasicError::IdentityAssetLockTransactionOutPointAlreadyExistsError(err)) +impl From for ConsensusError { + fn from(err: IdentityAssetLockTransactionOutPointAlreadyConsumedError) -> Self { + Self::BasicError(BasicError::IdentityAssetLockTransactionOutPointAlreadyConsumedError(err)) } } diff --git a/packages/rs-dpp/src/errors/consensus/basic/identity/identity_asset_lock_transaction_out_point_not_enough_balance_error.rs b/packages/rs-dpp/src/errors/consensus/basic/identity/identity_asset_lock_transaction_out_point_not_enough_balance_error.rs new file mode 100644 index 0000000000..98db7c7053 --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/basic/identity/identity_asset_lock_transaction_out_point_not_enough_balance_error.rs @@ -0,0 +1,72 @@ +use crate::consensus::basic::BasicError; +use crate::consensus::ConsensusError; +use crate::errors::ProtocolError; +use crate::fee::Credits; +use bincode::{Decode, Encode}; +use dashcore::Txid; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error("Asset lock transaction {transaction_id} output {output_index} only has {credits_left} credits left out of {initial_asset_lock_credits} initial credits on the asset lock but needs {credits_required} credits to start processing")] +#[platform_serialize(unversioned)] +pub struct IdentityAssetLockTransactionOutPointNotEnoughBalanceError { + /* + + DO NOT CHANGE ORDER OF FIELDS WITHOUT INTRODUCING OF NEW VERSION + + */ + #[platform_serialize(with_serde)] + #[bincode(with_serde)] + transaction_id: Txid, + output_index: usize, + initial_asset_lock_credits: Credits, + credits_left: Credits, + credits_required: Credits, +} + +impl IdentityAssetLockTransactionOutPointNotEnoughBalanceError { + pub fn new( + transaction_id: Txid, + output_index: usize, + initial_asset_lock_credits: Credits, + credits_left: Credits, + credits_required: Credits, + ) -> Self { + Self { + transaction_id, + output_index, + initial_asset_lock_credits, + credits_left, + credits_required, + } + } + + pub fn output_index(&self) -> usize { + self.output_index + } + + pub fn transaction_id(&self) -> Txid { + self.transaction_id + } + + pub fn initial_asset_lock_credits(&self) -> Credits { + self.initial_asset_lock_credits + } + + pub fn credits_left(&self) -> Credits { + self.credits_left + } + + pub fn credits_required(&self) -> Credits { + self.credits_required + } +} + +impl From for ConsensusError { + fn from(err: IdentityAssetLockTransactionOutPointNotEnoughBalanceError) -> Self { + Self::BasicError(BasicError::IdentityAssetLockTransactionOutPointNotEnoughBalanceError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/basic/identity/mod.rs b/packages/rs-dpp/src/errors/consensus/basic/identity/mod.rs index 6a62261e5d..4b5ec01a34 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/identity/mod.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/identity/mod.rs @@ -4,7 +4,8 @@ pub use duplicated_identity_public_key_basic_error::*; pub use duplicated_identity_public_key_id_basic_error::*; pub use identity_asset_lock_proof_locked_transaction_mismatch_error::*; pub use identity_asset_lock_transaction_is_not_found_error::*; -pub use identity_asset_lock_transaction_out_point_already_exists_error::*; +pub use identity_asset_lock_transaction_out_point_already_consumed_error::*; +pub use identity_asset_lock_transaction_out_point_not_enough_balance_error::*; pub use identity_asset_lock_transaction_output_not_found_error::*; pub use identity_credit_transfer_to_self_error::*; pub use invalid_asset_lock_proof_core_chain_height_error::*; @@ -34,7 +35,9 @@ mod duplicated_identity_public_key_basic_error; mod duplicated_identity_public_key_id_basic_error; mod identity_asset_lock_proof_locked_transaction_mismatch_error; mod identity_asset_lock_transaction_is_not_found_error; -mod identity_asset_lock_transaction_out_point_already_exists_error; +mod identity_asset_lock_transaction_out_point_already_consumed_error; + +mod identity_asset_lock_transaction_out_point_not_enough_balance_error; mod identity_asset_lock_transaction_output_not_found_error; mod identity_credit_transfer_to_self_error; mod invalid_asset_lock_proof_core_chain_height_error; diff --git a/packages/rs-dpp/src/errors/consensus/codes.rs b/packages/rs-dpp/src/errors/consensus/codes.rs index f30affcf39..5d597a6c5e 100644 --- a/packages/rs-dpp/src/errors/consensus/codes.rs +++ b/packages/rs-dpp/src/errors/consensus/codes.rs @@ -111,7 +111,7 @@ impl ErrorWithCode for BasicError { Self::DuplicatedIdentityPublicKeyIdBasicError(_) => 10501, Self::IdentityAssetLockProofLockedTransactionMismatchError(_) => 10502, Self::IdentityAssetLockTransactionIsNotFoundError(_) => 10503, - Self::IdentityAssetLockTransactionOutPointAlreadyExistsError(_) => 10504, + Self::IdentityAssetLockTransactionOutPointAlreadyConsumedError(_) => 10504, Self::IdentityAssetLockTransactionOutputNotFoundError(_) => 10505, Self::InvalidAssetLockProofCoreChainHeightError(_) => 10506, Self::InvalidAssetLockProofTransactionHeightError(_) => 10507, @@ -137,6 +137,7 @@ impl ErrorWithCode for BasicError { Self::InvalidIdentityUpdateTransitionDisableKeysError(_) => 10527, Self::IdentityCreditTransferToSelfError(_) => 10528, Self::MasterPublicKeyUpdateError(_) => 10529, + Self::IdentityAssetLockTransactionOutPointNotEnoughBalanceError(_) => 10530, // State Transition Errors: 10600-10699 Self::InvalidStateTransitionTypeError { .. } => 10600, @@ -204,8 +205,7 @@ impl ErrorWithCode for StateError { Self::MissingIdentityPublicKeyIdsError { .. } => 40209, Self::IdentityInsufficientBalanceError(_) => 40210, Self::IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError(_) => 40211, - Self::InvalidAssetLockProofValueError(_) => 40212, - Self::DocumentTypeUpdateError(_) => 40213, + Self::DocumentTypeUpdateError(_) => 40212, // Data trigger errors: 40500-40799 #[cfg(feature = "state-transition-validation")] diff --git a/packages/rs-dpp/src/errors/consensus/state/identity/invalid_asset_lock_proof_value.rs b/packages/rs-dpp/src/errors/consensus/state/identity/invalid_asset_lock_proof_value.rs deleted file mode 100644 index 9e4326620b..0000000000 --- a/packages/rs-dpp/src/errors/consensus/state/identity/invalid_asset_lock_proof_value.rs +++ /dev/null @@ -1,43 +0,0 @@ -use crate::errors::ProtocolError; -use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; -use thiserror::Error; - -use crate::consensus::ConsensusError; - -use crate::consensus::state::state_error::StateError; -use bincode::{Decode, Encode}; - -#[derive( - Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, -)] -#[error("Asset lock value {value:?} must be higher than minimal value of {min_value:?}")] -#[platform_serialize(unversioned)] -pub struct InvalidAssetLockProofValueError { - /* - - DO NOT CHANGE ORDER OF FIELDS WITHOUT INTRODUCING OF NEW VERSION - - */ - value: u64, - min_value: u64, -} - -impl InvalidAssetLockProofValueError { - pub fn new(value: u64, min_value: u64) -> Self { - Self { value, min_value } - } - - pub fn value(&self) -> u64 { - self.value - } - - pub fn min_value(&self) -> u64 { - self.min_value - } -} - -impl From for ConsensusError { - fn from(err: InvalidAssetLockProofValueError) -> Self { - Self::StateError(StateError::InvalidAssetLockProofValueError(err)) - } -} diff --git a/packages/rs-dpp/src/errors/consensus/state/identity/mod.rs b/packages/rs-dpp/src/errors/consensus/state/identity/mod.rs index 71209abf21..53a60d0ed4 100644 --- a/packages/rs-dpp/src/errors/consensus/state/identity/mod.rs +++ b/packages/rs-dpp/src/errors/consensus/state/identity/mod.rs @@ -8,7 +8,6 @@ mod identity_insufficient_balance_error; pub mod identity_public_key_already_exists_for_unique_contract_bounds_error; pub mod identity_public_key_is_disabled_error; pub mod identity_public_key_is_read_only_error; -pub mod invalid_asset_lock_proof_value; pub mod invalid_identity_contract_nonce_error; pub mod invalid_identity_public_key_id_error; pub mod invalid_identity_revision_error; diff --git a/packages/rs-dpp/src/errors/consensus/state/state_error.rs b/packages/rs-dpp/src/errors/consensus/state/state_error.rs index a4e689a0d0..a8379044b9 100644 --- a/packages/rs-dpp/src/errors/consensus/state/state_error.rs +++ b/packages/rs-dpp/src/errors/consensus/state/state_error.rs @@ -29,7 +29,6 @@ use crate::consensus::state::identity::{ use crate::consensus::ConsensusError; use crate::consensus::state::data_contract::document_type_update_error::DocumentTypeUpdateError; use crate::consensus::state::identity::identity_public_key_already_exists_for_unique_contract_bounds_error::IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError; -use crate::consensus::state::identity::invalid_asset_lock_proof_value::InvalidAssetLockProofValueError; use crate::consensus::state::identity::invalid_identity_contract_nonce_error::InvalidIdentityNonceError; use super::document::document_timestamps_are_equal_error::DocumentTimestampsAreEqualError; @@ -82,9 +81,6 @@ pub enum StateError { #[error(transparent)] IdentityPublicKeyIsReadOnlyError(IdentityPublicKeyIsReadOnlyError), - #[error(transparent)] - InvalidAssetLockProofValueError(InvalidAssetLockProofValueError), - #[error(transparent)] MissingIdentityPublicKeyIdsError(MissingIdentityPublicKeyIdsError), diff --git a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/validate_asset_lock_transaction_structure/mod.rs b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/validate_asset_lock_transaction_structure/mod.rs index 64e8cdcd7c..42255735b9 100644 --- a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/validate_asset_lock_transaction_structure/mod.rs +++ b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/validate_asset_lock_transaction_structure/mod.rs @@ -1,6 +1,6 @@ -use crate::validation::SimpleConsensusValidationResult; +use crate::validation::ConsensusValidationResult; use crate::ProtocolError; -use dashcore::Transaction; +use dashcore::{Transaction, TxOut}; use platform_version::version::PlatformVersion; mod v0; @@ -10,7 +10,7 @@ pub fn validate_asset_lock_transaction_structure( transaction: &Transaction, output_index: u32, platform_version: &PlatformVersion, -) -> Result { +) -> Result, ProtocolError> { match platform_version .dpp .state_transitions @@ -18,7 +18,10 @@ pub fn validate_asset_lock_transaction_structure( .asset_locks .validate_asset_lock_transaction_structure { - 0 => v0::validate_asset_lock_transaction_structure_v0(transaction, output_index), + 0 => Ok(v0::validate_asset_lock_transaction_structure_v0( + transaction, + output_index, + )), version => Err(ProtocolError::UnknownVersionMismatch { method: "validate_asset_lock_transaction_structure".to_string(), known_versions: vec![0], diff --git a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/validate_asset_lock_transaction_structure/v0/mod.rs b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/validate_asset_lock_transaction_structure/v0/mod.rs index 40ff3c1949..e55d94cc4b 100644 --- a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/validate_asset_lock_transaction_structure/v0/mod.rs +++ b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/validate_asset_lock_transaction_structure/v0/mod.rs @@ -2,50 +2,42 @@ use crate::consensus::basic::identity::{ IdentityAssetLockTransactionOutputNotFoundError, InvalidIdentityAssetLockTransactionError, InvalidIdentityAssetLockTransactionOutputError, }; -use crate::validation::SimpleConsensusValidationResult; -use crate::ProtocolError; +use crate::validation::ConsensusValidationResult; use dashcore::transaction::special_transaction::TransactionPayload; -use dashcore::Transaction; +use dashcore::{Transaction, TxOut}; /// Validates asset lock transaction structure #[inline(always)] pub(super) fn validate_asset_lock_transaction_structure_v0( transaction: &Transaction, output_index: u32, -) -> Result { - let mut result = SimpleConsensusValidationResult::default(); - +) -> ConsensusValidationResult { // It must be an Asset Lock Special Transaction let Some(TransactionPayload::AssetLockPayloadType(ref payload)) = transaction.special_transaction_payload else { - return Ok(SimpleConsensusValidationResult::new_with_error( + return ConsensusValidationResult::new_with_error( InvalidIdentityAssetLockTransactionError::new( "Funding transaction must have an Asset Lock Special Transaction Payload", ) .into(), - )); + ); }; // Output index should point to existing funding output in payload let Some(output) = payload.credit_outputs.get(output_index as usize) else { - result.add_error(IdentityAssetLockTransactionOutputNotFoundError::new( - output_index as usize, - )); - - return Ok(result); + return ConsensusValidationResult::new_with_error( + IdentityAssetLockTransactionOutputNotFoundError::new(output_index as usize).into(), + ); }; // Output should be P2PKH if !output.script_pubkey.is_p2pkh() { - result.add_error(InvalidIdentityAssetLockTransactionOutputError::new( - output_index as usize, - )); - - return Ok(result); + //Todo: better error + ConsensusValidationResult::new_with_error( + InvalidIdentityAssetLockTransactionOutputError::new(output_index as usize).into(), + ) + } else { + ConsensusValidationResult::new_with_data(output.clone()) } - - // TODO: Do we need to perform whole validation what Core supposed to do? - - Ok(result) } diff --git a/packages/rs-dpp/src/lib.rs b/packages/rs-dpp/src/lib.rs index b2e8d074b7..16c3afbfee 100644 --- a/packages/rs-dpp/src/lib.rs +++ b/packages/rs-dpp/src/lib.rs @@ -35,6 +35,7 @@ mod bls; #[cfg(feature = "fixtures-and-mocks")] pub mod tests; +pub mod asset_lock; pub mod balances; pub mod block; pub mod fee; diff --git a/packages/rs-dpp/src/state_transition/mod.rs b/packages/rs-dpp/src/state_transition/mod.rs index 0ca096ab50..8f927e020a 100644 --- a/packages/rs-dpp/src/state_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/mod.rs @@ -14,6 +14,7 @@ use bincode::{Decode, Encode}; ))] use dashcore::signer; use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize, PlatformSignable}; +use platform_version::version::PlatformVersion; mod abstract_state_transition; #[cfg(any( @@ -49,6 +50,8 @@ use crate::consensus::signature::{ use crate::consensus::ConsensusError; pub use traits::*; +use crate::balances::credits::CREDITS_PER_DUFF; +use crate::fee::Credits; #[cfg(any( feature = "state-transition-signing", feature = "state-transition-validation" @@ -285,6 +288,33 @@ impl StateTransition { ) } + pub fn required_asset_lock_balance_for_processing_start( + &self, + platform_version: &PlatformVersion, + ) -> Credits { + match self { + StateTransition::IdentityCreate(_) => { + platform_version + .dpp + .state_transitions + .identities + .asset_locks + .required_asset_lock_duff_balance_for_processing_start_for_identity_create + * CREDITS_PER_DUFF + } + StateTransition::IdentityTopUp(_) => { + platform_version + .dpp + .state_transitions + .identities + .asset_locks + .required_asset_lock_duff_balance_for_processing_start_for_identity_top_up + * CREDITS_PER_DUFF + } + _ => 0, + } + } + fn hash(&self, skip_signature: bool) -> Result, ProtocolError> { if skip_signature { Ok(hash_double_to_vec(self.signable_bytes()?)) diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/mod.rs index 9dbc8c2b9a..ada331ac03 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/mod.rs @@ -1,2 +1,2 @@ mod find_duplicates_by_id; -pub mod validate_base_structure; +pub mod validate_basic_structure; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/validate_base_structure/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/validate_basic_structure/mod.rs similarity index 90% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/validate_base_structure/mod.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/validate_basic_structure/mod.rs index 129236c3fb..6989178211 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/validate_base_structure/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/validate_basic_structure/mod.rs @@ -20,7 +20,7 @@ impl DocumentsBatchTransition { { 0 => self.validate_base_structure_v0(platform_version), version => Err(ProtocolError::UnknownVersionMismatch { - method: "DocumentsBatchTransition::validate".to_string(), + method: "DocumentsBatchTransition::validate_base_structure".to_string(), known_versions: vec![0], received: version, }), diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/validate_base_structure/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/validate_basic_structure/v0/mod.rs similarity index 100% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/validate_base_structure/v0/mod.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/validate_basic_structure/v0/mod.rs diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/accessors/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/accessors/mod.rs index 9a932ad308..64ea5ff381 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/accessors/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/accessors/mod.rs @@ -13,6 +13,12 @@ impl IdentityCreateTransitionAccessorsV0 for IdentityCreateTransition { } } + fn public_keys_mut(&mut self) -> &mut Vec { + match self { + IdentityCreateTransition::V0(transition) => transition.public_keys_mut(), + } + } + fn set_public_keys(&mut self, public_keys: Vec) { match self { IdentityCreateTransition::V0(transition) => transition.set_public_keys(public_keys), diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/accessors/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/accessors/v0/mod.rs index 6ed97a53fc..04de1f7e3a 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/accessors/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/accessors/v0/mod.rs @@ -4,6 +4,10 @@ use platform_value::Identifier; pub trait IdentityCreateTransitionAccessorsV0 { /// Get identity public keys fn public_keys(&self) -> &[IdentityPublicKeyInCreation]; + + /// Get identity public keys as a mutable vec + fn public_keys_mut(&mut self) -> &mut Vec; + /// Replaces existing set of public keys with a new one fn set_public_keys(&mut self, public_keys: Vec); /// Adds public keys to the existing public keys array diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/mod.rs index d4f4a6cd4a..0691ae0828 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/mod.rs @@ -69,23 +69,6 @@ impl IdentityCreateTransition { }), } } - - pub fn get_minimal_asset_lock_value( - platform_version: &PlatformVersion, - ) -> Result { - match platform_version - .dpp - .state_transitions - .identities - .asset_locks - .minimal_asset_lock_value - { - 0 => Ok(MinimalAssetLockValue::V0 as u64), - v => Err(ProtocolError::UnknownVersionError(format!( - "Unknown IdentityCreateTransition version for minimal_asset_lock_value {v}" - ))), - } - } } impl StateTransitionFieldTypes for IdentityCreateTransition { @@ -101,8 +84,3 @@ impl StateTransitionFieldTypes for IdentityCreateTransition { vec![] } } - -#[repr(u64)] -pub enum MinimalAssetLockValue { - V0 = 120000, -} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/v0_methods.rs index 1388daece9..af4a4e612a 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/v0_methods.rs @@ -88,6 +88,11 @@ impl IdentityCreateTransitionAccessorsV0 for IdentityCreateTransitionV0 { &self.public_keys } + /// Get identity public keys + fn public_keys_mut(&mut self) -> &mut Vec { + &mut self.public_keys + } + /// Replaces existing set of public keys with a new one fn set_public_keys(&mut self, public_keys: Vec) { self.public_keys = public_keys; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/mod.rs index 58fe27b587..d336359e84 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/mod.rs @@ -68,23 +68,6 @@ impl IdentityTopUpTransition { }), } } - - pub fn get_minimal_asset_lock_value( - platform_version: &PlatformVersion, - ) -> Result { - match platform_version - .dpp - .state_transitions - .identities - .asset_locks - .minimal_asset_lock_value - { - 0 => Ok(MinimalAssetLockValue::V0 as u64), - v => Err(ProtocolError::UnknownVersionError(format!( - "Unknown IdentityTopUpTransition version for minimal_asset_lock_value {v}" - ))), - } - } } impl StateTransitionFieldTypes for IdentityTopUpTransition { @@ -100,8 +83,3 @@ impl StateTransitionFieldTypes for IdentityTopUpTransition { vec![] } } - -#[repr(u64)] -enum MinimalAssetLockValue { - V0 = 1000, -} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/validate_identity_public_keys_structure/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/validate_identity_public_keys_structure/v0/mod.rs index 4cb4f89584..81b489092b 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/validate_identity_public_keys_structure/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/validate_identity_public_keys_structure/v0/mod.rs @@ -18,8 +18,6 @@ use crate::validation::SimpleConsensusValidationResult; use crate::ProtocolError; use platform_version::version::PlatformVersion; -const MAX_PUBLIC_KEYS: usize = 6; - lazy_static! { static ref ALLOWED_SECURITY_LEVELS: HashMap> = { let mut m = HashMap::new(); @@ -48,10 +46,22 @@ impl IdentityPublicKeyInCreation { in_create_identity: bool, platform_version: &PlatformVersion, ) -> Result { - if identity_public_keys_with_witness.len() > MAX_PUBLIC_KEYS { + if identity_public_keys_with_witness.len() + > platform_version + .dpp + .state_transitions + .identities + .max_public_keys_in_creation as usize + { return Ok(SimpleConsensusValidationResult::new_with_error( StateError::MaxIdentityPublicKeyLimitReachedError( - MaxIdentityPublicKeyLimitReachedError::new(MAX_PUBLIC_KEYS), + MaxIdentityPublicKeyLimitReachedError::new( + platform_version + .dpp + .state_transitions + .identities + .max_public_keys_in_creation as usize, + ), ) .into(), )); diff --git a/packages/rs-dpp/src/validation/block_time_window/mod.rs b/packages/rs-dpp/src/validation/block_time_window/mod.rs deleted file mode 100644 index a73df453ff..0000000000 --- a/packages/rs-dpp/src/validation/block_time_window/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub mod validate_time_in_block_time_window; -pub mod validation_result; diff --git a/packages/rs-dpp/src/validation/block_time_window/validate_time_in_block_time_window/mod.rs b/packages/rs-dpp/src/validation/block_time_window/validate_time_in_block_time_window/mod.rs deleted file mode 100644 index b47bd9fdc9..0000000000 --- a/packages/rs-dpp/src/validation/block_time_window/validate_time_in_block_time_window/mod.rs +++ /dev/null @@ -1,31 +0,0 @@ -use crate::identity::TimestampMillis; -use crate::validation::block_time_window::validate_time_in_block_time_window::v0::validate_time_in_block_time_window_v0; -use crate::validation::block_time_window::validation_result::TimeWindowValidationResult; -use crate::version::PlatformVersion; -use crate::NonConsensusError; - -pub mod v0; - -pub fn validate_time_in_block_time_window( - last_block_header_time_millis: TimestampMillis, - time_to_check_millis: TimestampMillis, - average_block_spacing_ms: u64, //in the event of very long blocks we need to add this - platform_version: &PlatformVersion, -) -> Result { - match platform_version - .dpp - .validation - .validate_time_in_block_time_window - { - 0 => validate_time_in_block_time_window_v0( - last_block_header_time_millis, - time_to_check_millis, - average_block_spacing_ms, - ), - version => Err(NonConsensusError::UnknownVersionMismatch { - method: "validate_time_in_block_time_window".to_string(), - known_versions: vec![0], - received: version, - }), - } -} diff --git a/packages/rs-dpp/src/validation/block_time_window/validate_time_in_block_time_window/v0/mod.rs b/packages/rs-dpp/src/validation/block_time_window/validate_time_in_block_time_window/v0/mod.rs deleted file mode 100644 index 06ccebc28e..0000000000 --- a/packages/rs-dpp/src/validation/block_time_window/validate_time_in_block_time_window/v0/mod.rs +++ /dev/null @@ -1,53 +0,0 @@ -use crate::validation::block_time_window::validation_result::TimeWindowValidationResult; -use crate::{prelude::TimestampMillis, NonConsensusError}; - -pub const BLOCK_TIME_WINDOW_MINUTES: u64 = 5; -pub const BLOCK_TIME_WINDOW_MILLIS: u64 = BLOCK_TIME_WINDOW_MINUTES * 60 * 1000; - -/// Validates whether the provided timestamp (`time_to_check_millis`) falls within a calculated -/// time window based on the timestamp of the last block header (`last_block_header_time_millis`). -/// The window is calculated as `BLOCK_TIME_WINDOW_MILLIS` before and after -/// the `last_block_header_time_millis`, plus the `average_block_spacing_ms` to the end window. -/// -/// Returns a `TimeWindowValidationResult` with information about the calculated time window -/// and a validity flag indicating whether the time_to_check falls within this window. -/// -/// # Arguments -/// -/// * `last_block_header_time_millis` - The timestamp in milliseconds of the last block header. -/// * `time_to_check_millis` - The timestamp in milliseconds that needs to be checked against the time window. -/// * `average_block_spacing_ms` - The average spacing in milliseconds between blocks, added to the end of the time window. -/// -/// # Errors -/// -/// If any arithmetic operation (subtraction or addition) overflows, an `NonConsensusError::Overflow` error is returned. -#[inline(always)] -pub(super) fn validate_time_in_block_time_window_v0( - last_block_header_time_millis: TimestampMillis, - time_to_check_millis: TimestampMillis, - average_block_spacing_ms: u64, //in the event of very long blocks we need to add this -) -> Result { - let time_window_start = last_block_header_time_millis - .checked_sub(BLOCK_TIME_WINDOW_MILLIS) - .ok_or(NonConsensusError::Overflow( - "calculation of start window failed", - ))?; - let time_window_end = last_block_header_time_millis - .checked_add(BLOCK_TIME_WINDOW_MILLIS) - .ok_or(NonConsensusError::Overflow( - "calculation of end window failed: block time window overflow", - ))? - .checked_add(average_block_spacing_ms) - .ok_or(NonConsensusError::Overflow( - "calculation of end window failed: average block spacing overflow", - ))?; - - let valid = - time_to_check_millis >= time_window_start && time_to_check_millis <= time_window_end; - - Ok(TimeWindowValidationResult { - time_window_start, - time_window_end, - valid, - }) -} diff --git a/packages/rs-dpp/src/validation/block_time_window/validation_result.rs b/packages/rs-dpp/src/validation/block_time_window/validation_result.rs deleted file mode 100644 index a75d4a6000..0000000000 --- a/packages/rs-dpp/src/validation/block_time_window/validation_result.rs +++ /dev/null @@ -1,14 +0,0 @@ -// We can safely assume that this will not need to ever be updated -// @immutable -/// Holds the result of a time window validation. -/// -/// This includes whether the validation was successful (`valid`) as well as -/// the start and end timestamps of the time window that was validated. -pub struct TimeWindowValidationResult { - /// Indicates whether the validation was successful. - pub valid: bool, - /// The start timestamp of the time window that was validated. - pub time_window_start: u64, - /// The end timestamp of the time window that was validated. - pub time_window_end: u64, -} diff --git a/packages/rs-dpp/src/validation/mod.rs b/packages/rs-dpp/src/validation/mod.rs index cb3abb6f20..f4b5879b81 100644 --- a/packages/rs-dpp/src/validation/mod.rs +++ b/packages/rs-dpp/src/validation/mod.rs @@ -10,9 +10,6 @@ pub use validation_result::{ use crate::version::PlatformVersion; #[cfg(feature = "validation")] use crate::ProtocolError; - -#[cfg(feature = "validation")] -pub mod block_time_window; #[cfg(feature = "validation")] pub(crate) mod byte_array_meta; #[cfg(feature = "validation")] diff --git a/packages/rs-dpp/src/validation/validation_result.rs b/packages/rs-dpp/src/validation/validation_result.rs index 1102360896..a711e5c62f 100644 --- a/packages/rs-dpp/src/validation/validation_result.rs +++ b/packages/rs-dpp/src/validation/validation_result.rs @@ -237,6 +237,17 @@ impl ValidationResult { ))) } + pub fn into_data_and_errors(self) -> Result<(TData, Vec), ProtocolError> { + Ok(( + self.data + .ok_or(ProtocolError::CorruptedCodeExecution(format!( + "trying to push validation result into data (errors are {:?})", + self.errors + )))?, + self.errors, + )) + } + pub fn data_as_borrowed(&self) -> Result<&TData, ProtocolError> { self.data .as_ref() diff --git a/packages/rs-drive-abci/src/abci/app/execution_result.rs b/packages/rs-drive-abci/src/abci/app/execution_result.rs index 7f06475c21..a6b9cfbace 100644 --- a/packages/rs-drive-abci/src/abci/app/execution_result.rs +++ b/packages/rs-drive-abci/src/abci/app/execution_result.rs @@ -34,7 +34,7 @@ impl TryIntoPlatformVersioned for StateTransitionExecutionResult { ..Default::default() } } - StateTransitionExecutionResult::DriveAbciError(message) => ExecTxResult { + StateTransitionExecutionResult::InternalError(message) => ExecTxResult { code: HandlerError::Internal(message).code(), // TODO: That would be nice to provide more information about the error for debugging info: String::default(), diff --git a/packages/rs-drive-abci/src/abci/handler/prepare_proposal.rs b/packages/rs-drive-abci/src/abci/handler/prepare_proposal.rs index e05a33ffca..bcbacada55 100644 --- a/packages/rs-drive-abci/src/abci/handler/prepare_proposal.rs +++ b/packages/rs-drive-abci/src/abci/handler/prepare_proposal.rs @@ -152,7 +152,7 @@ where StateTransitionExecutionResult::UnpaidConsensusError(..) => TxAction::Removed, // We shouldn't include in the block any state transitions that produced an internal error // during execution - StateTransitionExecutionResult::DriveAbciError(..) => TxAction::Removed, + StateTransitionExecutionResult::InternalError(..) => TxAction::Removed, }; let tx_result: ExecTxResult = diff --git a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs index 241eaa7726..04969a78f3 100644 --- a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs @@ -5,7 +5,7 @@ use crate::execution::validation::state_transition::check_tx_verification::state #[cfg(test)] use crate::platform_types::event_execution_result::EventExecutionResult; #[cfg(test)] -use crate::platform_types::event_execution_result::EventExecutionResult::ConsensusExecutionError; +use crate::platform_types::event_execution_result::EventExecutionResult::UnpaidConsensusExecutionError; use crate::platform_types::platform::{Platform, PlatformRef}; use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::rpc::core::CoreRPCLike; @@ -20,8 +20,6 @@ use crate::execution::validation::state_transition::processor::process_state_tra use crate::platform_types::platform_state::PlatformState; use dpp::serialization::PlatformDeserializable; use dpp::state_transition::StateTransition; -#[cfg(test)] -use dpp::validation::SimpleConsensusValidationResult; use dpp::validation::ValidationResult; use dpp::version::PlatformVersion; #[cfg(test)] @@ -56,19 +54,19 @@ where Some(transaction), )?; - if state_transition_execution_event.is_valid() { - let execution_event = state_transition_execution_event.into_data()?; + if state_transition_execution_event.has_data() { + let (execution_event, errors) = + state_transition_execution_event.into_data_and_errors()?; self.execute_event( execution_event, + errors, state_read_guard.last_block_info(), transaction, platform_ref.state.current_platform_version()?, ) } else { - Ok(ConsensusExecutionError( - SimpleConsensusValidationResult::new_with_errors( - state_transition_execution_event.errors, - ), + Ok(UnpaidConsensusExecutionError( + state_transition_execution_event.errors, )) } } @@ -180,7 +178,9 @@ where #[cfg(test)] mod tests { use crate::config::PlatformConfig; - use crate::platform_types::event_execution_result::EventExecutionResult::SuccessfulPaidExecution; + use crate::platform_types::event_execution_result::EventExecutionResult::{ + SuccessfulPaidExecution, UnsuccessfulPaidExecution, + }; use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::platform_types::system_identity_public_keys::v0::SystemIdentityPublicKeysV0; use crate::test::helpers::setup::TestPlatformBuilder; @@ -235,6 +235,8 @@ mod tests { use dpp::identity::contract_bounds::ContractBounds::SingleContractDocumentType; use dpp::platform_value::Bytes32; use dpp::state_transition::data_contract_update_transition::DataContractUpdateTransition; + use dpp::state_transition::identity_create_transition::accessors::IdentityCreateTransitionAccessorsV0; + use dpp::state_transition::public_key_in_creation::accessors::IdentityPublicKeyInCreationV0Setters; use dpp::system_data_contracts::dashpay_contract; use dpp::system_data_contracts::SystemDataContract::Dashpay; use platform_version::{TryFromPlatformVersioned, TryIntoPlatformVersioned}; @@ -1824,7 +1826,7 @@ mod tests { assert!(matches!( validation_result.errors.first().expect("expected an error"), ConsensusError::BasicError( - BasicError::IdentityAssetLockTransactionOutPointAlreadyExistsError(_) + BasicError::IdentityAssetLockTransactionOutPointAlreadyConsumedError(_) ) )); @@ -1840,7 +1842,7 @@ mod tests { assert!(matches!( validation_result.errors.first().expect("expected an error"), ConsensusError::BasicError( - BasicError::IdentityAssetLockTransactionOutPointAlreadyExistsError(_) + BasicError::IdentityAssetLockTransactionOutPointAlreadyConsumedError(_) ) )); } @@ -2130,7 +2132,258 @@ mod tests { assert!(matches!( validation_result.errors.first().expect("expected an error"), ConsensusError::BasicError( - BasicError::IdentityAssetLockTransactionOutPointAlreadyExistsError(_) + BasicError::IdentityAssetLockTransactionOutPointAlreadyConsumedError(_) + ) + )); + + let validation_result = platform + .check_tx( + identity_create_serialized_transition.as_slice(), + Recheck, + &platform_state, + platform_version, + ) + .expect("expected to check tx"); + + assert!(matches!( + validation_result.errors.first().expect("expected an error"), + ConsensusError::BasicError( + BasicError::IdentityAssetLockTransactionOutPointAlreadyConsumedError(_) + ) + )); + } + + #[test] + fn identity_can_create_with_semi_used_outpoint() { + let mut platform = TestPlatformBuilder::new() + .with_config(PlatformConfig::default()) + .build_with_mock_rpc(); + + platform + .core_rpc + .expect_verify_instant_lock() + .returning(|_, _| Ok(true)); + + let platform_state = platform.state.load(); + let platform_version = platform_state.current_platform_version().unwrap(); + + let mut signer = SimpleSigner::default(); + + let mut rng = StdRng::seed_from_u64(567); + + let (master_key, master_private_key) = + IdentityPublicKey::random_ecdsa_master_authentication_key(0, Some(3), platform_version) + .expect("expected to get key pair"); + + signer.add_key(master_key.clone(), master_private_key.clone()); + + let (key, private_key) = IdentityPublicKey::random_ecdsa_critical_level_authentication_key( + 1, + Some(19), + platform_version, + ) + .expect("expected to get key pair"); + + signer.add_key(key.clone(), private_key.clone()); + + let (_, pk) = ECDSA_SECP256K1 + .random_public_and_private_key_data(&mut rng, platform_version) + .unwrap(); + + let asset_lock_proof = instant_asset_lock_proof_fixture(Some( + PrivateKey::from_slice(pk.as_slice(), Network::Testnet).unwrap(), + )); + + let identifier = asset_lock_proof + .create_identifier() + .expect("expected an identifier"); + + let identity: Identity = IdentityV0 { + id: identifier, + public_keys: BTreeMap::from([(0, master_key.clone()), (1, key.clone())]), + balance: 1000000000, + revision: 0, + } + .into(); + + let mut identity_create_transition: StateTransition = + IdentityCreateTransition::try_from_identity_with_signer( + &identity, + asset_lock_proof, + pk.as_slice(), + &signer, + &NativeBlsModule, + platform_version, + ) + .expect("expected an identity create transition"); + + let valid_identity_create_transition = identity_create_transition.clone(); + + // let's add an error so this fails on state validation + + if let StateTransition::IdentityCreate(identity_create_transition_inner) = + &mut identity_create_transition + { + // let's create a new key that isn't signed + let master_key = identity_create_transition_inner + .public_keys_mut() + .get_mut(0) + .expect("expected master key"); + master_key.set_signature(vec![].into()); + }; + + let identity_create_serialized_transition = identity_create_transition + .serialize_to_bytes() + .expect("serialized state transition"); + + platform + .drive + .create_initial_state_structure(None, platform_version) + .expect("expected to create state structure"); + + let transaction = platform.drive.grove.start_transaction(); + + let validation_result = platform + .execute_tx(identity_create_serialized_transition, &transaction) + .expect("expected to execute identity_create tx"); + assert!(matches!(validation_result, UnsuccessfulPaidExecution(..))); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + // now lets try to recreate the valid identity + + // This one will use the balance on the outpoint that was already saved + + let valid_identity_create_serialized_transition = valid_identity_create_transition + .serialize_to_bytes() + .expect("serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let validation_result = platform + .execute_tx(valid_identity_create_serialized_transition, &transaction) + .expect("expected to execute identity_create tx"); + assert!(matches!(validation_result, SuccessfulPaidExecution(..))); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let (_, pk) = ECDSA_SECP256K1 + .random_public_and_private_key_data(&mut rng, platform_version) + .unwrap(); + + let asset_lock_proof_top_up = instant_asset_lock_proof_fixture(Some( + PrivateKey::from_slice(pk.as_slice(), Network::Testnet).unwrap(), + )); + + let identity_top_up_transition: StateTransition = + IdentityTopUpTransition::try_from_identity( + &identity, + asset_lock_proof_top_up.clone(), + pk.as_slice(), + 0, + platform_version, + None, + ) + .expect("expected an identity create transition"); + + let identity_top_up_serialized_transition = identity_top_up_transition + .serialize_to_bytes() + .expect("serialized state transition"); + + let validation_result = platform + .check_tx( + identity_top_up_serialized_transition.as_slice(), + FirstTimeCheck, + &platform_state, + platform_version, + ) + .expect("expected to check tx"); + + assert!(validation_result.errors.is_empty()); + + let transaction = platform.drive.grove.start_transaction(); + + let validation_result = platform + .execute_tx(identity_top_up_serialized_transition.clone(), &transaction) + .expect("expected to execute identity top up tx"); + assert!(matches!(validation_result, SuccessfulPaidExecution(..))); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + // At this point we try creating a new identity with a used asset lock + + let mut signer = SimpleSigner::default(); + + let (master_key, master_private_key) = + IdentityPublicKey::random_ecdsa_master_authentication_key(0, Some(4), platform_version) + .expect("expected to get key pair"); + + signer.add_key(master_key.clone(), master_private_key.clone()); + + let (key, private_key) = IdentityPublicKey::random_ecdsa_critical_level_authentication_key( + 1, + Some(50), + platform_version, + ) + .expect("expected to get key pair"); + + signer.add_key(key.clone(), private_key.clone()); + + let identifier = asset_lock_proof_top_up + .create_identifier() + .expect("expected an identifier"); + + let identity: Identity = IdentityV0 { + id: identifier, + public_keys: BTreeMap::from([(0, master_key.clone()), (1, key.clone())]), + balance: 1000000000, + revision: 0, + } + .into(); + + let identity_create_transition: StateTransition = + IdentityCreateTransition::try_from_identity_with_signer( + &identity, + asset_lock_proof_top_up, + pk.as_slice(), + &signer, + &NativeBlsModule, + platform_version, + ) + .expect("expected an identity create transition"); + + let identity_create_serialized_transition = identity_create_transition + .serialize_to_bytes() + .expect("serialized state transition"); + + let validation_result = platform + .check_tx( + identity_create_serialized_transition.as_slice(), + FirstTimeCheck, + &platform_state, + platform_version, + ) + .expect("expected to check tx"); + + assert!(matches!( + validation_result.errors.first().expect("expected an error"), + ConsensusError::BasicError( + BasicError::IdentityAssetLockTransactionOutPointAlreadyConsumedError(_) ) )); @@ -2146,7 +2399,7 @@ mod tests { assert!(matches!( validation_result.errors.first().expect("expected an error"), ConsensusError::BasicError( - BasicError::IdentityAssetLockTransactionOutPointAlreadyExistsError(_) + BasicError::IdentityAssetLockTransactionOutPointAlreadyConsumedError(_) ) )); } diff --git a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/decode_raw_state_transitions/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/decode_raw_state_transitions/mod.rs new file mode 100644 index 0000000000..c1d496b124 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/decode_raw_state_transitions/mod.rs @@ -0,0 +1,53 @@ +mod v0; + +use crate::error::execution::ExecutionError; +use crate::error::Error; +use crate::execution::types::state_transition_container::StateTransitionContainer; +use crate::platform_types::platform::Platform; +use crate::rpc::core::CoreRPCLike; +use dpp::version::PlatformVersion; + +impl Platform +where + C: CoreRPCLike, +{ + /// Processes the given raw state transitions based on the `block_info` and `transaction`. + /// + /// # Arguments + /// + /// * `raw_state_transitions` - A reference to a vector of raw state transitions. + /// * `platform_version` - A `PlatformVersion` reference that dictates which version of + /// the method to call. + /// + /// # Returns + /// + /// * `Result<(FeeResult, Vec), Error>` - If the processing is successful, it returns + /// a tuple consisting of a `FeeResult` and a vector of `ExecTxResult`. If the processing fails, + /// it returns an `Error`. + /// + /// # Errors + /// + /// This function may return an `Error` variant if there is a problem with deserializing the raw + /// state transitions, processing state transitions, or executing events. + pub(in crate::execution) fn decode_raw_state_transitions<'a>( + &self, + raw_state_transitions: &'a Vec>, + platform_version: &PlatformVersion, + ) -> Result, Error> { + match platform_version + .drive_abci + .methods + .state_transition_processing + .decode_raw_state_transitions + { + 0 => Ok(self + .decode_raw_state_transitions_v0(raw_state_transitions, platform_version) + .into()), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "decode_raw_state_transitions".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/decode_raw_state_transitions/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/decode_raw_state_transitions/v0/mod.rs new file mode 100644 index 0000000000..ad09ff09f0 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/decode_raw_state_transitions/v0/mod.rs @@ -0,0 +1,129 @@ +use crate::execution::types::state_transition_container::v0::StateTransitionContainerV0; +use crate::platform_types::platform::Platform; +use crate::rpc::core::CoreRPCLike; +use dpp::consensus::basic::decode::SerializedObjectParsingError; +use dpp::consensus::basic::state_transition::StateTransitionMaxSizeExceededError; +use dpp::consensus::basic::BasicError; +use dpp::consensus::ConsensusError; +use dpp::dashcore::hashes::Hash; +use dpp::serialization::PlatformDeserializable; +use dpp::state_transition::StateTransition; +use dpp::version::PlatformVersion; +use dpp::{dashcore, ProtocolError}; + +impl Platform +where + C: CoreRPCLike, +{ + /// Decodes and processes raw state transitions for version 0. + /// + /// This method deserializes each raw state transition from the provided vector, attempting to process + /// and categorize them into valid or invalid state transitions based on the deserialization outcome + /// and specific validation rules. It encapsulates the results in a `StateTransitionContainerV0`, + /// which separately tracks valid and invalid state transitions along with any associated errors. + /// + /// ## Arguments + /// + /// - `raw_state_transitions`: A reference to a vector of raw state transitions, where each state transition + /// is represented as a vector of bytes. + /// + /// ## Returns + /// + /// - `StateTransitionContainerV0`: A container holding the processed state transitions, including + /// both successfully deserialized transitions and those that failed validation with their corresponding errors. + /// + /// ## Errors + /// + /// Errors can arise from issues in deserializing the raw state transitions or if the processing of state transitions + /// encounters a scenario that warrants halting further execution. Specific errors include deserialization failures, + /// exceeding the maximum encoded bytes limit for a state transition. Protocol level errors should never occur, but + /// are also included in the result container. + /// + pub(super) fn decode_raw_state_transitions_v0<'a>( + &self, + raw_state_transitions: &'a Vec>, + platform_version: &PlatformVersion, + ) -> StateTransitionContainerV0<'a> { + // Todo: might be better to have StateTransitionContainerV0 be a decoder instead and have + // the method decode_raw_state_transitions + let mut container = StateTransitionContainerV0::default(); + for raw_state_transition in raw_state_transitions { + if raw_state_transition.len() as u64 + > platform_version + .dpp + .state_transitions + .max_state_transition_size + { + // The state transition is too big + let consensus_error = + ConsensusError::BasicError(BasicError::StateTransitionMaxSizeExceededError( + StateTransitionMaxSizeExceededError::new( + raw_state_transition.len() as u64, + platform_version + .dpp + .state_transitions + .max_state_transition_size, + ), + )); + tracing::debug!(?consensus_error, "State transition too big"); + + container.push_invalid_raw_state_transition(raw_state_transition, consensus_error); + continue; + } + + match StateTransition::deserialize_from_bytes(raw_state_transition) { + Ok(state_transition) => { + container.push_valid_state_transition(raw_state_transition, state_transition); + } + Err(error) => match error { + ProtocolError::PlatformDeserializationError(message) => { + let consensus_error = + SerializedObjectParsingError::new(message.clone()).into(); + let errors = vec![&consensus_error]; + + tracing::debug!( + ?errors, + "Invalid unknown state transition ({}): {}", + hex::encode( + dashcore::hashes::sha256::Hash::hash(raw_state_transition) + .to_byte_array(), + ), + message + ); + container.push_invalid_raw_state_transition( + raw_state_transition, + consensus_error, + ); + } + ProtocolError::MaxEncodedBytesReachedError { .. } => { + let message = error.to_string(); + let consensus_error = + SerializedObjectParsingError::new(message.clone()).into(); + let errors = vec![&consensus_error]; + + tracing::debug!( + ?errors, + "State transition beyond max encoded bytes limit ({}): {}", + hex::encode( + dashcore::hashes::sha256::Hash::hash(raw_state_transition) + .to_byte_array(), + ), + message + ); + + container.push_invalid_raw_state_transition( + raw_state_transition, + consensus_error, + ); + } + e => container.push_invalid_raw_state_transition_with_protocol_error( + raw_state_transition, + e, + ), + }, + } + } + + container + } +} diff --git a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/execute_event/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/execute_event/mod.rs index 9ee195adcb..99952972dd 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/execute_event/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/execute_event/mod.rs @@ -7,6 +7,7 @@ use crate::platform_types::event_execution_result::EventExecutionResult; use crate::platform_types::platform::Platform; use crate::rpc::core::CoreRPCLike; use dpp::block::block_info::BlockInfo; +use dpp::consensus::ConsensusError; use dpp::version::PlatformVersion; use drive::grovedb::Transaction; @@ -37,6 +38,7 @@ where pub(in crate::execution) fn execute_event( &self, event: ExecutionEvent, + consensus_errors: Vec, block_info: &BlockInfo, transaction: &Transaction, platform_version: &PlatformVersion, @@ -47,7 +49,13 @@ where .state_transition_processing .execute_event { - 0 => self.execute_event_v0(event, block_info, transaction, platform_version), + 0 => self.execute_event_v0( + event, + consensus_errors, + block_info, + transaction, + platform_version, + ), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "execute_event".to_string(), known_versions: vec![0], diff --git a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/execute_event/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/execute_event/v0/mod.rs index 5918335414..c30c6b6479 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/execute_event/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/execute_event/v0/mod.rs @@ -3,12 +3,14 @@ use crate::execution::types::execution_event::ExecutionEvent; use crate::execution::types::execution_operation::ValidationOperation; use crate::platform_types::event_execution_result::EventExecutionResult; use crate::platform_types::event_execution_result::EventExecutionResult::{ - ConsensusExecutionError, SuccessfulFreeExecution, SuccessfulPaidExecution, + SuccessfulFreeExecution, SuccessfulPaidExecution, UnpaidConsensusExecutionError, + UnsuccessfulPaidExecution, }; use crate::platform_types::platform::Platform; use crate::rpc::core::CoreRPCLike; use dpp::block::block_info::BlockInfo; -use dpp::validation::SimpleConsensusValidationResult; +use dpp::consensus::ConsensusError; +use dpp::fee::fee_result::FeeResult; use dpp::version::PlatformVersion; use drive::drive::identity::update::apply_balance_change_outcome::ApplyBalanceChangeOutcomeV0Methods; use drive::grovedb::Transaction; @@ -42,14 +44,23 @@ where pub(super) fn execute_event_v0( &self, event: ExecutionEvent, + mut consensus_errors: Vec, block_info: &BlockInfo, transaction: &Transaction, platform_version: &PlatformVersion, ) -> Result { - //todo: we need to split out errors - // between failed execution and internal errors - let fee_validation_result = - self.validate_fees_of_event(&event, block_info, Some(transaction), platform_version)?; + let maybe_fee_validation_result = match event { + ExecutionEvent::PaidFromAssetLock { .. } | ExecutionEvent::Paid { .. } => { + Some(self.validate_fees_of_event( + &event, + block_info, + Some(transaction), + platform_version, + )?) + } + ExecutionEvent::PaidFromAssetLockWithoutIdentity { .. } + | ExecutionEvent::Free { .. } => None, + }; match event { ExecutionEvent::PaidFromAssetLock { @@ -66,6 +77,8 @@ where user_fee_increase, .. } => { + // We can unwrap here because we have the match right above + let mut fee_validation_result = maybe_fee_validation_result.unwrap(); if fee_validation_result.is_valid_with_data() { //todo: make this into an atomic event with partial batches let mut individual_fee_result = self @@ -96,15 +109,47 @@ where platform_version, )?; + if consensus_errors.is_empty() { + Ok(SuccessfulPaidExecution( + Some(fee_validation_result.into_data()?), + outcome.actual_fee_paid_owned(), + )) + } else { + Ok(UnsuccessfulPaidExecution( + Some(fee_validation_result.into_data()?), + outcome.actual_fee_paid_owned(), + consensus_errors, + )) + } + } else { + consensus_errors.append(&mut fee_validation_result.errors); + Ok(UnpaidConsensusExecutionError(consensus_errors)) + } + } + ExecutionEvent::PaidFromAssetLockWithoutIdentity { + processing_fees, + operations, + } => { + self.drive + .apply_drive_operations( + operations, + true, + block_info, + Some(transaction), + platform_version, + ) + .map_err(Error::Drive)?; + + if consensus_errors.is_empty() { Ok(SuccessfulPaidExecution( - fee_validation_result.into_data()?, - outcome.actual_fee_paid_owned(), + None, + FeeResult::default_with_fees(0, processing_fees), )) } else { - Ok(ConsensusExecutionError( - SimpleConsensusValidationResult::new_with_errors( - fee_validation_result.errors, - ), + Ok(UnsuccessfulPaidExecution( + None, + FeeResult::default_with_fees(0, processing_fees), + consensus_errors, )) } } diff --git a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/mod.rs index 56add58ac0..b8e08aad2a 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/mod.rs @@ -1,3 +1,4 @@ +mod decode_raw_state_transitions; mod execute_event; mod process_raw_state_transitions; mod validate_fees_of_event; diff --git a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_raw_state_transitions/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_raw_state_transitions/v0/mod.rs index 42f5e6cb5d..1b04c8f64a 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_raw_state_transitions/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/process_raw_state_transitions/v0/mod.rs @@ -1,20 +1,16 @@ use crate::error::Error; -use crate::execution::validation::state_transition::processor::process_state_transition; use crate::platform_types::platform::{Platform, PlatformRef}; use crate::platform_types::platform_state::PlatformState; use crate::rpc::core::CoreRPCLike; use dpp::block::block_info::BlockInfo; -use dpp::consensus::basic::decode::SerializedObjectParsingError; -use dpp::consensus::basic::state_transition::StateTransitionMaxSizeExceededError; -use dpp::consensus::basic::BasicError; -use dpp::consensus::ConsensusError; +use dpp::dashcore; use dpp::dashcore::hashes::Hash; use dpp::fee::fee_result::FeeResult; -use dpp::identity::state_transition::OptionallyAssetLockProved; -use dpp::serialization::PlatformDeserializable; -use dpp::state_transition::StateTransition; -use dpp::{dashcore, ProtocolError}; +use dpp::validation::ConsensusValidationResult; +use crate::execution::types::execution_event::ExecutionEvent; +use crate::execution::types::state_transition_container::v0::StateTransitionContainerGettersV0; +use crate::execution::validation::state_transition::processor::process_state_transition; use crate::platform_types::event_execution_result::EventExecutionResult; use crate::platform_types::state_transitions_processing_result::{ StateTransitionExecutionResult, StateTransitionsProcessingResult, @@ -69,18 +65,39 @@ where core_rpc: &self.core_rpc, }; + let state_transition_container = + self.decode_raw_state_transitions(raw_state_transitions, platform_version)?; + + let ( + valid_state_transitions, + invalid_state_transitions, + invalid_execution_abci_state_transitions, + ) = state_transition_container.destructure(); + let mut processing_result = StateTransitionsProcessingResult::default(); - for raw_state_transition in raw_state_transitions { - let execution_result = self - .process_raw_state_transition( + for (raw_state_transition, state_transition) in valid_state_transitions { + tracing::trace!(?state_transition, "Processing state transition"); + + let state_transition_name = state_transition.name(); + + // Validate state transition and produce an execution event + let execution_result = process_state_transition( + &platform_ref, + block_info, + state_transition, + Some(transaction), + ) + .map(|validation_result| { + self.process_validation_result_v0( raw_state_transition, + state_transition_name, + validation_result, block_info, - &platform_ref, transaction, platform_version, ) - .unwrap_or_else(|st_error| { + .unwrap_or_else(|execution_error| { let mut st_hash = String::new(); if tracing::enabled!(tracing::Level::ERROR) { st_hash = hex::encode( @@ -90,133 +107,83 @@ where } tracing::error!( - error = ?st_error.error, - raw_state_transition = ?st_error.raw_state_transition, - "Error processing state transition ({}) : {}", + error = ?execution_error.error, + raw_state_transition = ?execution_error.raw_state_transition, + "Internal Error processing state transition ({}) : {}", st_hash, - st_error.error, + execution_error.error, ); - StateTransitionExecutionResult::DriveAbciError(st_error.error.to_string()) - }); + StateTransitionExecutionResult::InternalError(execution_error.error.to_string()) + }) + }) + .unwrap_or_else(|processing_error| { + let mut st_hash = String::new(); + if tracing::enabled!(tracing::Level::ERROR) { + st_hash = hex::encode( + dashcore::hashes::sha256::Hash::hash(raw_state_transition).to_byte_array(), + ); + } + + tracing::error!( + error = ?processing_error, + raw_state_transition = ?raw_state_transition, + "Internal Error processing state transition ({}) : {}", + st_hash, + processing_error, + ); + + StateTransitionExecutionResult::InternalError(processing_error.to_string()) + }); processing_result.add(execution_result)?; } + for (_, consensus_error) in invalid_state_transitions { + // we have already traced error messages, no need to create new ones + processing_result.add(StateTransitionExecutionResult::UnpaidConsensusError( + consensus_error, + ))?; + } + + for (_, protocol_error) in invalid_execution_abci_state_transitions { + // we have already traced error messages, no need to create new ones + processing_result.add(StateTransitionExecutionResult::InternalError(format!( + "{}", + protocol_error + )))?; + } + Ok(processing_result) } - fn process_raw_state_transition( + fn process_validation_result_v0( &self, - raw_state_transition: &[u8], + raw_state_transition: &[u8], //used for errors + state_transition_name: &str, + mut validation_result: ConsensusValidationResult, block_info: &BlockInfo, - platform_ref: &PlatformRef, transaction: &Transaction, platform_version: &PlatformVersion, ) -> Result { - if raw_state_transition.len() as u64 - > platform_version - .dpp - .state_transitions - .max_state_transition_size - { - // The state transition is too big - let consensus_error = - ConsensusError::BasicError(BasicError::StateTransitionMaxSizeExceededError( - StateTransitionMaxSizeExceededError::new( - raw_state_transition.len() as u64, - platform_version - .dpp - .state_transitions - .max_state_transition_size, - ), - )); - tracing::debug!(?consensus_error, "State transition too big",); - - return Ok(StateTransitionExecutionResult::UnpaidConsensusError( - consensus_error, - )); - } - // Tenderdash hex-encoded ST hash let mut st_hash = String::new(); - if tracing::enabled!(tracing::Level::DEBUG) { - st_hash = hex::encode( - dashcore::hashes::sha256::Hash::hash(raw_state_transition).to_byte_array(), - ); - } - - let state_transition = match StateTransition::deserialize_from_bytes(raw_state_transition) { - Ok(state_transition) => state_transition, - Err(error) => { - return match error { - ProtocolError::PlatformDeserializationError(message) => { - let consensus_error = - SerializedObjectParsingError::new(message.clone()).into(); - let errors = vec![&consensus_error]; - - tracing::debug!( - ?errors, - "Invalid unknown state transition ({}): {}", - st_hash, - message - ); - - Ok(StateTransitionExecutionResult::UnpaidConsensusError( - consensus_error, - )) - } - ProtocolError::MaxEncodedBytesReachedError { .. } => { - let message = error.to_string(); - let consensus_error = - SerializedObjectParsingError::new(message.clone()).into(); - let errors = vec![&consensus_error]; - - tracing::debug!( - ?errors, - "State transition beyond max encoded bytes limit ({}): {}", - st_hash, - message - ); - - Ok(StateTransitionExecutionResult::UnpaidConsensusError( - consensus_error, - )) - } - _ => Err(StateTransitionAwareError { - error: error.into(), - raw_state_transition: raw_state_transition.into(), - }), - }; - } - }; - - tracing::trace!(?state_transition, "Processing state transition"); - - let state_transition_name = state_transition.name(); - let is_st_asset_lock_funded = state_transition.optional_asset_lock_proof().is_some(); - - // Validate state transition and produce an execution event - let mut st_validation_result = process_state_transition( - platform_ref, - block_info, - state_transition, - Some(transaction), - ) - .map_err(|error| StateTransitionAwareError { - error, - raw_state_transition: raw_state_transition.into(), - })?; // State Transition is invalid - if !st_validation_result.is_valid() { - let first_consensus_error = st_validation_result + if !validation_result.is_valid() { + let first_consensus_error = validation_result .errors // the first error must be present for an invalid result .remove(0); + if tracing::enabled!(tracing::Level::DEBUG) { + st_hash = hex::encode( + dashcore::hashes::sha256::Hash::hash(raw_state_transition).to_byte_array(), + ); + } + tracing::debug!( - errors = ?st_validation_result.errors, + errors = ?validation_result.errors, "Invalid {} state transition ({}): {}", state_transition_name, st_hash, @@ -229,21 +196,28 @@ where // placed on the payment blockchain and they can't be partially spent. // 2. We can't prove that the state transition is associated with the identity // 3. The revision given by the state transition isn't allowed based on the state - let state_transition_execution_result = if is_st_asset_lock_funded { - StateTransitionExecutionResult::UnpaidConsensusError(first_consensus_error) - } else if let Ok(execution_event) = st_validation_result.into_data() { + let state_transition_execution_result = if let Ok((execution_event, errors)) = + validation_result.into_data_and_errors() + { // In this case the execution event will be to pay for the state transition processing // This ONLY pays for what is needed to prevent attacks on the system let event_execution_result = self - .execute_event(execution_event, block_info, transaction, platform_version) + .execute_event( + execution_event, + errors, + block_info, + transaction, + platform_version, + ) .map_err(|error| StateTransitionAwareError { error, - raw_state_transition: raw_state_transition.into(), + raw_state_transition: raw_state_transition.to_vec(), })?; match event_execution_result { - EventExecutionResult::SuccessfulPaidExecution(_, actual_fees) => { + EventExecutionResult::SuccessfulPaidExecution(_, actual_fees) + | EventExecutionResult::UnsuccessfulPaidExecution(_, actual_fees, _) => { tracing::debug!( "{} state transition ({}) not processed, but paid for processing", state_transition_name, @@ -264,9 +238,8 @@ where StateTransitionExecutionResult::UnpaidConsensusError(first_consensus_error) } - EventExecutionResult::ConsensusExecutionError(mut validation_result) => { - let payment_consensus_error = validation_result - .errors + EventExecutionResult::UnpaidConsensusExecutionError(mut errors) => { + let payment_consensus_error = errors // the first error must be present for an invalid result .remove(0); @@ -278,7 +251,7 @@ where st_hash, ); - StateTransitionExecutionResult::DriveAbciError(format!( + StateTransitionExecutionResult::InternalError(format!( "{} {}", first_consensus_error, payment_consensus_error )) @@ -291,19 +264,25 @@ where return Ok(state_transition_execution_result); } - let execution_event = - st_validation_result - .into_data() - .map_err(|error| StateTransitionAwareError { + let (execution_event, errors) = + validation_result.into_data_and_errors().map_err(|error| { + StateTransitionAwareError { error: error.into(), - raw_state_transition: raw_state_transition.into(), - })?; + raw_state_transition: raw_state_transition.to_vec(), + } + })?; let event_execution_result = self - .execute_event(execution_event, block_info, transaction, platform_version) + .execute_event( + execution_event, + errors, + block_info, + transaction, + platform_version, + ) .map_err(|error| StateTransitionAwareError { error, - raw_state_transition: raw_state_transition.into(), + raw_state_transition: raw_state_transition.to_vec(), })?; let state_transition_execution_result = match event_execution_result { @@ -316,6 +295,22 @@ where StateTransitionExecutionResult::SuccessfulExecution(estimated_fees, actual_fees) } + EventExecutionResult::UnsuccessfulPaidExecution(_, actual_fees, mut errors) => { + tracing::debug!( + "{} state transition ({}) not successfully processed", + state_transition_name, + st_hash, + ); + + let payment_consensus_error = errors + // the first error must be present for an invalid result + .remove(0); + + StateTransitionExecutionResult::PaidConsensusError( + payment_consensus_error, + actual_fees, + ) + } EventExecutionResult::SuccessfulFreeExecution => { tracing::debug!( "Free {} state transition ({}) successfully processed", @@ -323,18 +318,14 @@ where st_hash, ); - StateTransitionExecutionResult::SuccessfulExecution( - FeeResult::default(), - FeeResult::default(), - ) + StateTransitionExecutionResult::SuccessfulExecution(None, FeeResult::default()) } - EventExecutionResult::ConsensusExecutionError(mut validation_result) => { + EventExecutionResult::UnpaidConsensusExecutionError(mut errors) => { // TODO: In case of balance is not enough, we need to reduce balance only for processing fees // and return paid consensus error. // Unpaid consensus error should be only if balance not enough even // to cover processing fees - let first_consensus_error = validation_result - .errors + let first_consensus_error = errors // the first error must be present for an invalid result .remove(0); diff --git a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/validate_fees_of_event/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/validate_fees_of_event/v0/mod.rs index 363fc75838..73c931d990 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/validate_fees_of_event/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/validate_fees_of_event/v0/mod.rs @@ -146,9 +146,10 @@ where )) } } - ExecutionEvent::Free { .. } => Ok(ConsensusValidationResult::new_with_data( - FeeResult::default(), - )), + ExecutionEvent::Free { .. } + | ExecutionEvent::PaidFromAssetLockWithoutIdentity { .. } => Ok( + ConsensusValidationResult::new_with_data(FeeResult::default()), + ), } } } diff --git a/packages/rs-drive-abci/src/execution/types/execution_event/mod.rs b/packages/rs-drive-abci/src/execution/types/execution_event/mod.rs index 48078a0be9..4caa4413db 100644 --- a/packages/rs-drive-abci/src/execution/types/execution_event/mod.rs +++ b/packages/rs-drive-abci/src/execution/types/execution_event/mod.rs @@ -2,6 +2,7 @@ mod v0; use crate::error::execution::ExecutionError; use crate::error::Error; +use dpp::asset_lock::reduced_asset_lock_value::AssetLockValueGettersV0; use dpp::block::epoch::Epoch; use dpp::fee::Credits; @@ -17,6 +18,7 @@ use crate::execution::types::state_transition_execution_context::{ }; use drive::drive::batch::transitions::DriveHighLevelOperationConverter; use drive::drive::batch::DriveOperation; +use drive::state_transition_action::system::partially_use_asset_lock_action::PartiallyUseAssetLockActionAccessorsV0; /// An execution event #[derive(Clone)] @@ -47,6 +49,13 @@ pub(in crate::execution) enum ExecutionEvent<'a> { /// the fee multiplier that the user agreed to, 0 means 100% of the base fee, 1 means 101% user_fee_increase: UserFeeIncrease, }, + /// A drive event that is paid from an asset lock + PaidFromAssetLockWithoutIdentity { + /// The processing fees that should be distributed to validators + processing_fees: Credits, + /// the operations that should be performed + operations: Vec>, + }, /// A drive event that is free #[allow(dead_code)] // TODO investigate why `variant `Free` is never constructed` Free { @@ -79,7 +88,9 @@ impl<'a> ExecutionEvent<'a> { } StateTransitionAction::IdentityTopUpAction(identity_top_up_action) => { let user_fee_increase = identity_top_up_action.user_fee_increase(); - let added_balance = identity_top_up_action.top_up_balance_amount(); + let added_balance = identity_top_up_action + .top_up_asset_lock_value() + .remaining_credit_value(); let operations = action.into_high_level_drive_operations(epoch, platform_version)?; if let Some(identity) = identity { @@ -92,10 +103,20 @@ impl<'a> ExecutionEvent<'a> { }) } else { Err(Error::Execution(ExecutionError::CorruptedCodeExecution( - "partial identity should be present", + "partial identity should be present for identity top up action", ))) } } + StateTransitionAction::PartiallyUseAssetLockAction(partially_used_asset_lock) => { + let used_credits = partially_used_asset_lock.used_credits(); + let operations = + action.into_high_level_drive_operations(epoch, platform_version)?; + // We mark it as a free operation because the event itself is paying for itself + Ok(ExecutionEvent::PaidFromAssetLockWithoutIdentity { + processing_fees: used_credits, + operations, + }) + } StateTransitionAction::IdentityCreditWithdrawalAction(identity_credit_withdrawal) => { let user_fee_increase = identity_credit_withdrawal.user_fee_increase(); let removed_balance = identity_credit_withdrawal.amount(); @@ -111,7 +132,7 @@ impl<'a> ExecutionEvent<'a> { }) } else { Err(Error::Execution(ExecutionError::CorruptedCodeExecution( - "partial identity should be present", + "partial identity should be present for identity credit withdrawal action", ))) } } @@ -130,7 +151,7 @@ impl<'a> ExecutionEvent<'a> { }) } else { Err(Error::Execution(ExecutionError::CorruptedCodeExecution( - "partial identity should be present", + "partial identity should be present for identity credit transfer action", ))) } } @@ -148,7 +169,7 @@ impl<'a> ExecutionEvent<'a> { }) } else { Err(Error::Execution(ExecutionError::CorruptedCodeExecution( - "partial identity should be present", + "partial identity should be present for other state transitions", ))) } } diff --git a/packages/rs-drive-abci/src/execution/types/mod.rs b/packages/rs-drive-abci/src/execution/types/mod.rs index 01865f961c..ba0208c174 100644 --- a/packages/rs-drive-abci/src/execution/types/mod.rs +++ b/packages/rs-drive-abci/src/execution/types/mod.rs @@ -22,3 +22,6 @@ pub(in crate::execution) mod storage_fee_distribution_outcome; pub(in crate::execution) mod unpaid_epoch; /// A structure representing the outcome of updating a masternode list in the state pub(in crate::execution) mod update_state_masternode_list_outcome; + +/// A container for the state transitions +pub(in crate::execution) mod state_transition_container; diff --git a/packages/rs-drive-abci/src/execution/types/state_transition_container/mod.rs b/packages/rs-drive-abci/src/execution/types/state_transition_container/mod.rs new file mode 100644 index 0000000000..5768ce30f6 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/types/state_transition_container/mod.rs @@ -0,0 +1,54 @@ +use crate::execution::types::state_transition_container::v0::{ + StateTransitionContainerGettersV0, StateTransitionContainerV0, +}; +use derive_more::From; +use dpp::consensus::ConsensusError; +use dpp::state_transition::StateTransition; +use dpp::ProtocolError; + +pub(crate) mod v0; + +#[derive(Debug, From)] +pub enum StateTransitionContainer<'a> { + V0(StateTransitionContainerV0<'a>), +} +impl<'a> StateTransitionContainerGettersV0<'a> for StateTransitionContainer<'a> { + fn valid_state_transitions(&'a self) -> &'a [(&'a Vec, StateTransition)] { + match self { + StateTransitionContainer::V0(container) => &container.valid_state_transitions, + } + } + + fn invalid_state_transitions(&'a self) -> &'a [(&'a Vec, ConsensusError)] { + match self { + StateTransitionContainer::V0(container) => &container.invalid_state_transitions, + } + } + + fn invalid_state_transitions_with_protocol_error( + &'a self, + ) -> &'a [(&'a Vec, ProtocolError)] { + match self { + StateTransitionContainer::V0(container) => { + &container.invalid_state_transitions_with_protocol_error + } + } + } + + // The destructure method's signature and return type need to be adjusted to match the trait. + fn destructure( + self, + ) -> ( + Vec<(&'a Vec, StateTransition)>, + Vec<(&'a Vec, ConsensusError)>, + Vec<(&'a Vec, ProtocolError)>, + ) { + match self { + StateTransitionContainer::V0(container) => ( + container.valid_state_transitions, + container.invalid_state_transitions, + container.invalid_state_transitions_with_protocol_error, + ), + } + } +} diff --git a/packages/rs-drive-abci/src/execution/types/state_transition_container/v0/mod.rs b/packages/rs-drive-abci/src/execution/types/state_transition_container/v0/mod.rs new file mode 100644 index 0000000000..022804674b --- /dev/null +++ b/packages/rs-drive-abci/src/execution/types/state_transition_container/v0/mod.rs @@ -0,0 +1,60 @@ +use dpp::consensus::ConsensusError; +use dpp::state_transition::StateTransition; +use dpp::ProtocolError; + +/// This is a container that holds state transitions + +#[derive(Debug, Default)] +pub struct StateTransitionContainerV0<'a> { + /// The asset lock state transitions + pub(super) valid_state_transitions: Vec<(&'a Vec, StateTransition)>, + /// Deserialization errors + pub(super) invalid_state_transitions: Vec<(&'a Vec, ConsensusError)>, + /// Deserialization errors that broke platform, these should not exist, but are still handled + pub(super) invalid_state_transitions_with_protocol_error: Vec<(&'a Vec, ProtocolError)>, +} + +pub trait StateTransitionContainerGettersV0<'a> { + fn valid_state_transitions(&'a self) -> &'a [(&'a Vec, StateTransition)]; + fn invalid_state_transitions(&'a self) -> &'a [(&'a Vec, ConsensusError)]; + fn invalid_state_transitions_with_protocol_error( + &'a self, + ) -> &'a [(&'a Vec, ProtocolError)]; + + fn destructure( + self, + ) -> ( + Vec<(&'a Vec, StateTransition)>, + Vec<(&'a Vec, ConsensusError)>, + Vec<(&'a Vec, ProtocolError)>, + ); +} + +impl<'a> StateTransitionContainerV0<'a> { + pub fn push_valid_state_transition( + &mut self, + raw_state_transition: &'a Vec, + valid_state_transition: StateTransition, + ) { + self.valid_state_transitions + .push((raw_state_transition, valid_state_transition)) + } + + pub fn push_invalid_raw_state_transition( + &mut self, + invalid_raw_state_transition: &'a Vec, + error: ConsensusError, + ) { + self.invalid_state_transitions + .push((invalid_raw_state_transition, error)) + } + + pub fn push_invalid_raw_state_transition_with_protocol_error( + &mut self, + invalid_raw_state_transition: &'a Vec, + error: ProtocolError, + ) { + self.invalid_state_transitions_with_protocol_error + .push((invalid_raw_state_transition, error)) + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs index 8f97dad370..8e49fc99cd 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs @@ -6,33 +6,16 @@ use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::rpc::core::CoreRPCLike; use dpp::identity::state_transition::OptionallyAssetLockProved; use dpp::prelude::ConsensusValidationResult; -use dpp::ProtocolError; -use dpp::state_transition::{StateTransition}; +use dpp::state_transition::StateTransition; use dpp::version::{DefaultForPlatformVersion, PlatformVersion}; use crate::error::execution::ExecutionError; use crate::execution::check_tx::CheckTxLevel; use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; use crate::execution::validation::state_transition::common::asset_lock::proof::verify_is_not_spent::AssetLockProofVerifyIsNotSpent; -use crate::execution::validation::state_transition::processor::process_state_transition; -use crate::execution::validation::state_transition::processor::v0::{StateTransitionBalanceValidationV0, StateTransitionBasicStructureValidationV0, StateTransitionNonceValidationV0, StateTransitionSignatureValidationV0, StateTransitionStructureKnownInStateValidationV0}; +use crate::execution::validation::state_transition::processor::v0::{StateTransitionBalanceValidationV0, StateTransitionBasicStructureValidationV0, StateTransitionNonceValidationV0, StateTransitionIdentityBasedSignatureValidationV0, StateTransitionStructureKnownInStateValidationV0}; use crate::execution::validation::state_transition::ValidationMode; -/// A trait for validating state transitions within a blockchain. -pub(crate) trait StateTransitionCheckTxValidationV0 { - /// This means we should do the full validation on check_tx - fn requires_check_tx_full_validation(&self) -> bool; -} - -impl StateTransitionCheckTxValidationV0 for StateTransition { - fn requires_check_tx_full_validation(&self) -> bool { - matches!( - self, - StateTransition::IdentityCreate(_) | StateTransition::IdentityTopUp(_) - ) - } -} - pub(super) fn state_transition_to_execution_event_for_check_tx_v0<'a, C: CoreRPCLike>( platform: &'a PlatformRef, state_transition: StateTransition, @@ -41,59 +24,16 @@ pub(super) fn state_transition_to_execution_event_for_check_tx_v0<'a, C: CoreRPC ) -> Result>>, Error> { match check_tx_level { CheckTxLevel::FirstTimeCheck => { - if state_transition.requires_check_tx_full_validation() { - // it's okay to pass last_block_info here - // last block info is being used for the block time so we insert created at - // and updated at - Ok(process_state_transition( - platform, - platform.state.last_block_info(), - state_transition, - None, - )? - .map(Some)) - } else { - // we need to validate the structure, the fees, and the signature - let mut state_transition_execution_context = - StateTransitionExecutionContext::default_for_platform_version( - platform_version, - )?; + // we need to validate the structure, the fees, and the signature + let mut state_transition_execution_context = + StateTransitionExecutionContext::default_for_platform_version(platform_version)?; - if state_transition.has_nonces_validation() { - let result = state_transition.validate_nonces( - &platform.into(), - platform.state.last_block_info(), - None, - platform_version, - )?; - - if !result.is_valid() { - return Ok( - ConsensusValidationResult::>::new_with_errors( - result.errors, - ), - ); - } - } - - if state_transition.has_basic_structure_validation() { - // First we validate the basic structure - let result = state_transition.validate_basic_structure(platform_version)?; - - if !result.is_valid() { - return Ok( - ConsensusValidationResult::>::new_with_errors( - result.errors, - ), - ); - } - } - - // Validating signatures - let result = state_transition.validate_identity_and_signatures( - platform.drive, + // Only identity top up and identity create do not have nonces validation + if state_transition.has_nonces_validation() { + let result = state_transition.validate_nonces( + &platform.into(), + platform.state.last_block_info(), None, - &mut state_transition_execution_context, platform_version, )?; @@ -104,112 +44,164 @@ pub(super) fn state_transition_to_execution_event_for_check_tx_v0<'a, C: CoreRPC ), ); } + } - let mut maybe_identity = result.into_data()?; - - let action = if state_transition.has_advanced_structure_validation_with_state() { - let state_transition_action_result = state_transition.transform_into_action( - platform, - platform.state.last_block_info(), - ValidationMode::CheckTx, - &mut state_transition_execution_context, - None, - )?; - if !state_transition_action_result.is_valid_with_data() { - return Ok( - ConsensusValidationResult::>::new_with_errors( - state_transition_action_result.errors, - ), - ); - } - let action = state_transition_action_result.into_data()?; + // Only Data contract update does not have basic structure validation + if state_transition.has_basic_structure_validation() { + // First we validate the basic structure + let result = state_transition.validate_basic_structure(platform_version)?; - let identity = - maybe_identity - .as_ref() - .ok_or(ProtocolError::CorruptedCodeExecution( - "the identity should always be known on advanced structure validation" - .to_string(), - ))?; + if !result.is_valid() { + return Ok( + ConsensusValidationResult::>::new_with_errors( + result.errors, + ), + ); + } + } - // Validating structure - let result = state_transition.validate_advanced_structure_from_state( - &platform.into(), - &action, - identity, + // Only identity create does not use identity in state validation, because it doesn't yet have the identity in state + let mut maybe_identity = if state_transition.uses_identity_in_state() { + // Validating signature for identity based state transitions (all those except identity create and identity top up) + // As we already have removed identity create above, it just splits between identity top up (below - false) and + // all other state transitions (above - true) + let result = if state_transition.validates_signature_based_on_identity_info() { + state_transition.validate_identity_signed_state_transition( + platform.drive, + None, + &mut state_transition_execution_context, platform_version, - )?; - - if !result.is_valid() { - return Ok( - ConsensusValidationResult::>::new_with_errors( - result.errors, - ), - ); - } - Some(action) + ) } else { - None - }; - - if state_transition.has_balance_validation() { - let result = state_transition.validate_balance( - maybe_identity.as_mut(), - &platform.into(), - platform.state.last_block_info(), + state_transition.retrieve_identity_info( + platform.drive, None, + &mut state_transition_execution_context, platform_version, - )?; + ) + }?; + if !result.is_valid() { + // If the signature is not valid or if we could not retrieve identity info + // we do not have the user pay for the state transition. + // Since it is most likely not from them + // Proposers should remove such transactions from the block + // Other validators should reject blocks with such transactions + return Ok( + ConsensusValidationResult::>::new_with_errors( + result.errors, + ), + ); + } + Some(result.into_data()?) + } else { + None + }; - if !result.is_valid() { - return Ok( - ConsensusValidationResult::>::new_with_errors( - result.errors, - ), - ); - } + let action = if state_transition + .requires_advanced_structure_validation_with_state_on_check_tx() + { + let state_transition_action_result = state_transition.transform_into_action( + platform, + platform.state.last_block_info(), + ValidationMode::CheckTx, + &mut state_transition_execution_context, + None, + )?; + if !state_transition_action_result.is_valid_with_data() { + return Ok( + ConsensusValidationResult::>::new_with_errors( + state_transition_action_result.errors, + ), + ); } + let action = state_transition_action_result.into_data()?; - let action = if let Some(action) = action { - action - } else { - let state_transition_action_result = state_transition.transform_into_action( - platform, - platform.state.last_block_info(), - ValidationMode::CheckTx, - &mut state_transition_execution_context, - None, - )?; - if !state_transition_action_result.is_valid_with_data() { - return Ok( - ConsensusValidationResult::>::new_with_errors( - state_transition_action_result.errors, - ), - ); - } - state_transition_action_result.into_data()? - }; + // Validating structure + let result = state_transition.validate_advanced_structure_from_state( + &action, + maybe_identity.as_ref(), + &mut state_transition_execution_context, + platform_version, + )?; - let execution_event = ExecutionEvent::create_from_state_transition_action( - action, - maybe_identity, - platform.state.last_committed_block_epoch_ref(), - state_transition_execution_context, + if !result.is_valid() { + return Ok( + ConsensusValidationResult::>::new_with_errors( + result.errors, + ), + ); + } + Some(action) + } else { + None + }; + + // This is for identity credit withdrawal and identity credit transfers + if state_transition.has_balance_validation() { + // Validating that we have sufficient balance for a transfer or withdrawal, + // this must happen after validating the signature + let result = state_transition.validate_balance( + maybe_identity.as_mut(), + &platform.into(), + platform.state.last_block_info(), + None, platform_version, )?; - Ok( - ConsensusValidationResult::>::new_with_data(Some( - execution_event, - )), - ) + if !result.is_valid() { + return Ok( + ConsensusValidationResult::>::new_with_errors( + result.errors, + ), + ); + } } + + let action = if let Some(action) = action { + action + } else { + let state_transition_action_result = state_transition.transform_into_action( + platform, + platform.state.last_block_info(), + ValidationMode::CheckTx, + &mut state_transition_execution_context, + None, + )?; + if !state_transition_action_result.is_valid_with_data() { + return Ok( + ConsensusValidationResult::>::new_with_errors( + state_transition_action_result.errors, + ), + ); + } + state_transition_action_result.into_data()? + }; + + let execution_event = ExecutionEvent::create_from_state_transition_action( + action, + maybe_identity, + platform.state.last_committed_block_epoch_ref(), + state_transition_execution_context, + platform_version, + )?; + + Ok( + ConsensusValidationResult::>::new_with_data(Some( + execution_event, + )), + ) } CheckTxLevel::Recheck => { if let Some(asset_lock_proof) = state_transition.optional_asset_lock_proof() { // we should check that the asset lock is still valid - let validation_result = - asset_lock_proof.verify_is_not_spent(platform, None, platform_version)?; + let validation_result = asset_lock_proof + .verify_is_not_spent_and_has_enough_balance( + platform, + state_transition + .required_asset_lock_balance_for_processing_start(platform_version), + None, + platform_version, + )?; if validation_result.is_valid() { Ok(ConsensusValidationResult::>::new_with_data(None)) diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/validate/chain/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/validate/chain/mod.rs index 1ab5b225e1..ee48d3da18 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/validate/chain/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/validate/chain/mod.rs @@ -1,15 +1,18 @@ +use dpp::asset_lock::reduced_asset_lock_value::AssetLockValue; use crate::error::Error; use crate::platform_types::platform::PlatformRef; use crate::rpc::core::CoreRPCLike; use dpp::consensus::basic::identity::{ InvalidAssetLockProofCoreChainHeightError, }; +use dpp::fee::Credits; use dpp::identity::state_transition::asset_lock_proof::chain::ChainAssetLockProof; -use dpp::validation::SimpleConsensusValidationResult; +use dpp::validation::ConsensusValidationResult; use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; use crate::execution::validation::state_transition::common::asset_lock::proof::validate::AssetLockProofValidation; use crate::execution::validation::state_transition::common::asset_lock::proof::verify_is_not_spent::AssetLockProofVerifyIsNotSpent; +use crate::execution::validation::state_transition::ValidationMode; use crate::platform_types::platform_state::v0::PlatformStateV0Methods; // TODO: Versioning @@ -17,20 +20,28 @@ impl AssetLockProofValidation for ChainAssetLockProof { fn validate( &self, platform_ref: &PlatformRef, + required_balance: Credits, + validation_mode: ValidationMode, transaction: TransactionArg, platform_version: &PlatformVersion, - ) -> Result { - let mut result = SimpleConsensusValidationResult::default(); - - if platform_ref.state.last_committed_core_height() < self.core_chain_locked_height { - result.add_error(InvalidAssetLockProofCoreChainHeightError::new( - self.core_chain_locked_height, - platform_ref.state.last_committed_core_height(), + ) -> Result, Error> { + if validation_mode != ValidationMode::RecheckTx + && platform_ref.state.last_committed_core_height() < self.core_chain_locked_height + { + return Ok(ConsensusValidationResult::new_with_error( + InvalidAssetLockProofCoreChainHeightError::new( + self.core_chain_locked_height, + platform_ref.state.last_committed_core_height(), + ) + .into(), )); - - return Ok(result); } - self.verify_is_not_spent(platform_ref, transaction, platform_version) + self.verify_is_not_spent_and_has_enough_balance( + platform_ref, + required_balance, + transaction, + platform_version, + ) } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/validate/instant/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/validate/instant/mod.rs index cade050df5..9181804a86 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/validate/instant/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/validate/instant/mod.rs @@ -2,14 +2,17 @@ use crate::error::Error; use crate::platform_types::platform::PlatformRef; use crate::rpc::core::CoreRPCLike; use crate::rpc::signature::CoreSignatureVerification; +use dpp::asset_lock::reduced_asset_lock_value::AssetLockValue; use dpp::consensus::basic::identity::InvalidInstantAssetLockProofSignatureError; +use dpp::fee::Credits; use dpp::identity::state_transition::asset_lock_proof::InstantAssetLockProof; -use dpp::validation::SimpleConsensusValidationResult; +use dpp::validation::ConsensusValidationResult; use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; use crate::execution::validation::state_transition::common::asset_lock::proof::validate::AssetLockProofValidation; use crate::execution::validation::state_transition::common::asset_lock::proof::verify_is_not_spent::AssetLockProofVerifyIsNotSpent; +use crate::execution::validation::state_transition::ValidationMode; use crate::platform_types::platform_state::v0::PlatformStateV0Methods; // TODO: Versioning @@ -17,24 +20,40 @@ impl AssetLockProofValidation for InstantAssetLockProof { fn validate( &self, platform_ref: &PlatformRef, + required_balance: Credits, + validation_mode: ValidationMode, transaction: TransactionArg, platform_version: &PlatformVersion, - ) -> Result { - let mut result = SimpleConsensusValidationResult::default(); - + ) -> Result, Error> { // Verify instant lock signature with Core - let is_instant_lock_signature_valid = self.instant_lock().verify_signature( - platform_ref.core_rpc, - platform_ref.state.last_committed_core_height(), + let validation_result = self.verify_is_not_spent_and_has_enough_balance( + platform_ref, + required_balance, + transaction, + platform_version, )?; - if !is_instant_lock_signature_valid { - result.add_error(InvalidInstantAssetLockProofSignatureError::new()); + if !validation_result.is_valid() { + return Ok(validation_result); + } + + // If we have a partially spent asset lock then we do not need to verify the signature of the instant lock + // As we know this outpoint was already considered final and locked. + + if validation_mode != ValidationMode::RecheckTx && !validation_result.has_data() { + let is_instant_lock_signature_valid = self.instant_lock().verify_signature( + platform_ref.core_rpc, + platform_ref.state.last_committed_core_height(), + )?; - return Ok(result); + if !is_instant_lock_signature_valid { + return Ok(ConsensusValidationResult::new_with_error( + InvalidInstantAssetLockProofSignatureError::new().into(), + )); + } } - self.verify_is_not_spent(platform_ref, transaction, platform_version) + Ok(validation_result) } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/validate/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/validate/mod.rs index 596657facc..02ec7ec464 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/validate/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/validate/mod.rs @@ -2,10 +2,13 @@ mod chain; mod instant; use crate::error::Error; +use crate::execution::validation::state_transition::ValidationMode; use crate::platform_types::platform::PlatformRef; use crate::rpc::core::CoreRPCLike; +use dpp::asset_lock::reduced_asset_lock_value::AssetLockValue; +use dpp::fee::Credits; use dpp::prelude::AssetLockProof; -use dpp::validation::SimpleConsensusValidationResult; +use dpp::validation::ConsensusValidationResult; use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; @@ -28,25 +31,37 @@ pub trait AssetLockProofValidation { fn validate( &self, platform_ref: &PlatformRef, + required_balance: Credits, + validation_mode: ValidationMode, transaction: TransactionArg, platform_version: &PlatformVersion, - ) -> Result; + ) -> Result, Error>; } impl AssetLockProofValidation for AssetLockProof { fn validate( &self, platform_ref: &PlatformRef, + required_balance: Credits, + validation_mode: ValidationMode, transaction: TransactionArg, platform_version: &PlatformVersion, - ) -> Result { + ) -> Result, Error> { match self { - AssetLockProof::Instant(proof) => { - proof.validate(platform_ref, transaction, platform_version) - } - AssetLockProof::Chain(proof) => { - proof.validate(platform_ref, transaction, platform_version) - } + AssetLockProof::Instant(proof) => proof.validate( + platform_ref, + required_balance, + validation_mode, + transaction, + platform_version, + ), + AssetLockProof::Chain(proof) => proof.validate( + platform_ref, + required_balance, + validation_mode, + transaction, + platform_version, + ), } } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/verify_is_not_spent/chain/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/verify_is_not_spent/chain/mod.rs index ee988de172..ef6bf3de31 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/verify_is_not_spent/chain/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/verify_is_not_spent/chain/mod.rs @@ -1,47 +1,30 @@ -use crate::error::execution::ExecutionError; +use dpp::asset_lock::reduced_asset_lock_value::AssetLockValue; use crate::error::Error; use crate::platform_types::platform::PlatformRef; -use dpp::consensus::basic::identity::{ - IdentityAssetLockTransactionOutPointAlreadyExistsError, -}; +use dpp::fee::Credits; use dpp::identity::state_transition::asset_lock_proof::chain::ChainAssetLockProof; -use dpp::platform_value::Bytes36; -use dpp::validation::SimpleConsensusValidationResult; +use dpp::validation::ConsensusValidationResult; use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; use crate::execution::validation::state_transition::common::asset_lock::proof::verify_is_not_spent::AssetLockProofVerifyIsNotSpent; +use super::verify_asset_lock_is_not_spent_and_has_enough_balance; + // TODO: Versioning impl AssetLockProofVerifyIsNotSpent for ChainAssetLockProof { - fn verify_is_not_spent( + fn verify_is_not_spent_and_has_enough_balance( &self, platform_ref: &PlatformRef, + required_balance: Credits, transaction: TransactionArg, platform_version: &PlatformVersion, - ) -> Result { - let mut result = SimpleConsensusValidationResult::default(); - - // Make sure that asset lock isn't spent yet - - let outpoint_bytes = self.out_point.try_into().map_err(|_e| { - Error::Execution(ExecutionError::Conversion(String::from( - "can't convert output to bytes", - ))) - })?; - - let is_already_spent = platform_ref.drive.has_asset_lock_outpoint( - &Bytes36::new(outpoint_bytes), + ) -> Result, Error> { + verify_asset_lock_is_not_spent_and_has_enough_balance( + platform_ref, + self.out_point, + required_balance, transaction, - &platform_version.drive, - )?; - - if is_already_spent { - result.add_error(IdentityAssetLockTransactionOutPointAlreadyExistsError::new( - self.out_point.txid, - self.out_point.vout as usize, - )) - } - - Ok(result) + platform_version, + ) } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/verify_is_not_spent/instant/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/verify_is_not_spent/instant/mod.rs index 3896860342..43e7acd1bc 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/verify_is_not_spent/instant/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/verify_is_not_spent/instant/mod.rs @@ -1,27 +1,26 @@ use crate::error::execution::ExecutionError; use crate::error::Error; use crate::platform_types::platform::PlatformRef; +use dpp::asset_lock::reduced_asset_lock_value::AssetLockValue; -use dpp::consensus::basic::identity::{ - IdentityAssetLockTransactionOutPointAlreadyExistsError, -}; +use dpp::fee::Credits; use dpp::identity::state_transition::asset_lock_proof::InstantAssetLockProof; -use dpp::platform_value::Bytes36; -use dpp::validation::SimpleConsensusValidationResult; +use dpp::validation::ConsensusValidationResult; use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; use crate::execution::validation::state_transition::common::asset_lock::proof::verify_is_not_spent::AssetLockProofVerifyIsNotSpent; +use super::verify_asset_lock_is_not_spent_and_has_enough_balance; + // TODO: Versioning impl AssetLockProofVerifyIsNotSpent for InstantAssetLockProof { - fn verify_is_not_spent( + fn verify_is_not_spent_and_has_enough_balance( &self, platform_ref: &PlatformRef, + required_balance: Credits, transaction: TransactionArg, platform_version: &PlatformVersion, - ) -> Result { - let mut result = SimpleConsensusValidationResult::default(); - + ) -> Result, Error> { // Make sure that asset lock isn't spent yet let Some(asset_lock_outpoint) = self.out_point() else { @@ -30,25 +29,12 @@ impl AssetLockProofVerifyIsNotSpent for InstantAssetLockProof { ))); }; - let outpoint_bytes = asset_lock_outpoint.try_into().map_err(|e| { - Error::Execution(ExecutionError::Conversion(format!( - "can't convert output to bytes: {e}", - ))) - })?; - - let is_already_spent = platform_ref.drive.has_asset_lock_outpoint( - &Bytes36::new(outpoint_bytes), + verify_asset_lock_is_not_spent_and_has_enough_balance( + platform_ref, + asset_lock_outpoint, + required_balance, transaction, - &platform_version.drive, - )?; - - if is_already_spent { - result.add_error(IdentityAssetLockTransactionOutPointAlreadyExistsError::new( - asset_lock_outpoint.txid, - asset_lock_outpoint.vout as usize, - )) - } - - Ok(result) + platform_version, + ) } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/verify_is_not_spent/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/verify_is_not_spent/mod.rs index b3bb74b03d..0785227d2d 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/verify_is_not_spent/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/verify_is_not_spent/mod.rs @@ -1,13 +1,19 @@ mod chain; mod instant; +mod v0; use crate::error::Error; use crate::platform_types::platform::PlatformRef; +use dpp::asset_lock::reduced_asset_lock_value::AssetLockValue; +use dpp::dashcore::OutPoint; +use dpp::fee::Credits; use dpp::prelude::AssetLockProof; -use dpp::validation::SimpleConsensusValidationResult; +use dpp::validation::ConsensusValidationResult; use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; +use crate::error::execution::ExecutionError; +use crate::execution::validation::state_transition::common::asset_lock::proof::verify_is_not_spent::v0::verify_asset_lock_is_not_spent_and_has_enough_balance_v0; /// A trait for validating that an asset lock is not spent pub trait AssetLockProofVerifyIsNotSpent { @@ -26,28 +32,67 @@ pub trait AssetLockProofVerifyIsNotSpent { /// # Returns /// /// * `Result` - A result with either a SimpleConsensusValidationResult or an Error. - fn verify_is_not_spent( + fn verify_is_not_spent_and_has_enough_balance( &self, platform_ref: &PlatformRef, + required_balance: Credits, transaction: TransactionArg, platform_version: &PlatformVersion, - ) -> Result; + ) -> Result, Error>; } impl AssetLockProofVerifyIsNotSpent for AssetLockProof { - fn verify_is_not_spent( + fn verify_is_not_spent_and_has_enough_balance( &self, platform_ref: &PlatformRef, + required_balance: Credits, transaction: TransactionArg, platform_version: &PlatformVersion, - ) -> Result { + ) -> Result, Error> { match self { - AssetLockProof::Instant(proof) => { - proof.verify_is_not_spent(platform_ref, transaction, platform_version) - } - AssetLockProof::Chain(proof) => { - proof.verify_is_not_spent(platform_ref, transaction, platform_version) - } + AssetLockProof::Instant(proof) => proof.verify_is_not_spent_and_has_enough_balance( + platform_ref, + required_balance, + transaction, + platform_version, + ), + AssetLockProof::Chain(proof) => proof.verify_is_not_spent_and_has_enough_balance( + platform_ref, + required_balance, + transaction, + platform_version, + ), } } } + +#[inline(always)] +fn verify_asset_lock_is_not_spent_and_has_enough_balance( + platform_ref: &PlatformRef, + out_point: OutPoint, + required_balance: Credits, + transaction: TransactionArg, + platform_version: &PlatformVersion, +) -> Result, Error> { + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .common_validation_methods + .asset_locks + .verify_asset_lock_is_not_spent_and_has_enough_balance + { + 0 => verify_asset_lock_is_not_spent_and_has_enough_balance_v0( + platform_ref, + out_point, + required_balance, + transaction, + platform_version, + ), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "verify_asset_lock_is_not_spent_and_has_enough_balance".to_string(), + known_versions: vec![0], + received: version, + })), + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/verify_is_not_spent/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/verify_is_not_spent/v0/mod.rs new file mode 100644 index 0000000000..f127d22921 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/verify_is_not_spent/v0/mod.rs @@ -0,0 +1,72 @@ +use crate::error::Error; +use crate::platform_types::platform::PlatformRef; +use dpp::asset_lock::reduced_asset_lock_value::{AssetLockValue, AssetLockValueGettersV0}; +use dpp::asset_lock::StoredAssetLockInfo; +use dpp::consensus::basic::identity::{ + IdentityAssetLockTransactionOutPointAlreadyConsumedError, + IdentityAssetLockTransactionOutPointNotEnoughBalanceError, +}; +use dpp::dashcore::OutPoint; +use dpp::fee::Credits; +use dpp::platform_value::Bytes36; +use dpp::prelude::ConsensusValidationResult; +use dpp::version::PlatformVersion; +use drive::grovedb::TransactionArg; + +/// Both proofs share the same verification logic +#[inline(always)] +pub(super) fn verify_asset_lock_is_not_spent_and_has_enough_balance_v0( + platform_ref: &PlatformRef, + out_point: OutPoint, + required_balance: Credits, + transaction: TransactionArg, + platform_version: &PlatformVersion, +) -> Result, Error> { + // Make sure that asset lock isn't spent yet + + let stored_asset_lock_info = platform_ref.drive.fetch_asset_lock_outpoint_info( + &Bytes36::new(out_point.into()), + transaction, + &platform_version.drive, + )?; + + match stored_asset_lock_info { + StoredAssetLockInfo::FullyConsumed => { + // It was already entirely spent + Ok(ConsensusValidationResult::new_with_error( + IdentityAssetLockTransactionOutPointAlreadyConsumedError::new( + out_point.txid, + out_point.vout as usize, + ) + .into(), + )) + } + StoredAssetLockInfo::PartiallyConsumed(reduced_asset_lock_value) => { + if reduced_asset_lock_value.remaining_credit_value() == 0 { + Ok(ConsensusValidationResult::new_with_error( + IdentityAssetLockTransactionOutPointAlreadyConsumedError::new( + out_point.txid, + out_point.vout as usize, + ) + .into(), + )) + } else if reduced_asset_lock_value.remaining_credit_value() < required_balance { + Ok(ConsensusValidationResult::new_with_error( + IdentityAssetLockTransactionOutPointNotEnoughBalanceError::new( + out_point.txid, + out_point.vout as usize, + reduced_asset_lock_value.initial_credit_value(), + reduced_asset_lock_value.remaining_credit_value(), + required_balance, + ) + .into(), + )) + } else { + Ok(ConsensusValidationResult::new_with_data( + reduced_asset_lock_value, + )) + } + } + StoredAssetLockInfo::NotPresent => Ok(ConsensusValidationResult::new()), + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/transaction/fetch_asset_lock_transaction_output_sync/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/transaction/fetch_asset_lock_transaction_output_sync/v0/mod.rs index 2e3e1de1f1..6347c9515c 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/transaction/fetch_asset_lock_transaction_output_sync/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/transaction/fetch_asset_lock_transaction_output_sync/v0/mod.rs @@ -6,7 +6,6 @@ use dpp::consensus::basic::identity::{ InvalidAssetLockProofTransactionHeightError, }; use dpp::dashcore::secp256k1::ThirtyTwoByteHash; -use dpp::dashcore::transaction::special_transaction::TransactionPayload; use dpp::dashcore::TxOut; use dpp::identity::state_transition::asset_lock_proof::validate_asset_lock_transaction_structure::validate_asset_lock_transaction_structure; use dpp::prelude::{AssetLockProof, ConsensusValidationResult}; @@ -41,6 +40,8 @@ pub fn fetch_asset_lock_transaction_output_sync_v0( let maybe_transaction_info = core_rpc .get_optional_transaction_extended_info(&transaction_hash) .map_err(|e| { + //todo multiple errors are possible from core, some that + // would lead to consensus errors, other execution errors Error::Execution(ExecutionError::DashCoreBadResponseError(format!( "can't fetch asset transaction for chain asset lock proof: {e}", ))) @@ -95,32 +96,13 @@ pub fn fetch_asset_lock_transaction_output_sync_v0( // Validate asset lock transaction - let validate_asset_lock_transaction_result = validate_asset_lock_transaction_structure( - &transaction, - output_index, - platform_version, - )?; - - if !validate_asset_lock_transaction_result.is_valid() { - return Ok(ConsensusValidationResult::new_with_errors( - validate_asset_lock_transaction_result.errors, - )); - } - - // Extract outpoint from the payload - if let Some(TransactionPayload::AssetLockPayloadType(mut payload)) = - transaction.special_transaction_payload - { - // We are dealing with old Rust edition so we can't use optional remove - if payload.credit_outputs.get(output_index as usize).is_some() { - let output = payload.credit_outputs.remove(output_index as usize); - return Ok(ValidationResult::new_with_data(output)); - } - } - - Err(Error::Execution(ExecutionError::CorruptedCodeExecution( - "transaction should have outpoint", - ))) + // While we don't need this validation for recheck, we still need to get the tx_out + // To get the Tx_out we need some sanity checks, then this checks that we are p2pkh. + // The check for p2pkh is only marginally more expensive than the check to see if we are + // on a recheck, so there's no point making the code more complicated and stripping + // out a very cheap check on recheck tx + validate_asset_lock_transaction_structure(&transaction, output_index, platform_version) + .map_err(Error::Protocol) } } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/processor/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/processor/mod.rs index 339e5d1b1f..9771c5e5d6 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/processor/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/processor/mod.rs @@ -11,8 +11,12 @@ use dpp::state_transition::StateTransition; use drive::grovedb::TransactionArg; -/// There are 3 stages in a state transition processing: -/// Structure, Signature and State validation, +/// There are multiple stages in a state transition processing: +/// Basic Structure +/// Signature +/// Balance +/// Advanced Structure +/// State /// /// The structure validation verifies that the form of the state transition is good, for example /// that a contract is well formed, or that a document is valid against the contract. diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs index 1344ad2100..1bb7bfd741 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs @@ -20,12 +20,12 @@ use drive::state_transition_action::StateTransitionAction; use crate::execution::types::state_transition_execution_context::{StateTransitionExecutionContext}; use crate::execution::validation::state_transition::common::validate_state_transition_identity_signed::{ValidateStateTransitionIdentitySignature}; +use crate::execution::validation::state_transition::identity_create::{StateTransitionStateValidationForIdentityCreateTransitionV0, StateTransitionStructureKnownInStateValidationForIdentityCreateTransitionV0}; +use crate::execution::validation::state_transition::identity_top_up::StateTransitionIdentityTopUpTransitionActionTransformer; use crate::execution::validation::state_transition::state_transitions::identity_update::advanced_structure::v0::IdentityUpdateStateTransitionIdentityAndSignaturesValidationV0; -use crate::execution::validation::state_transition::state_transitions::identity_create::identity_and_signatures::v0::IdentityCreateStateTransitionIdentityAndSignaturesValidationV0; use crate::execution::validation::state_transition::state_transitions::identity_top_up::identity_retrieval::v0::IdentityTopUpStateTransitionIdentityRetrievalV0; use crate::execution::validation::state_transition::ValidationMode; - -pub(in crate::execution) fn process_state_transition_v0<'a, C: CoreRPCLike>( +pub(super) fn process_state_transition_v0<'a, C: CoreRPCLike>( platform: &'a PlatformRef, block_info: &BlockInfo, state_transition: StateTransition, @@ -35,24 +35,42 @@ pub(in crate::execution) fn process_state_transition_v0<'a, C: CoreRPCLike>( let mut state_transition_execution_context = StateTransitionExecutionContext::default_for_platform_version(platform_version)?; - // Validating signatures - let result = state_transition.validate_identity_and_signatures( - platform.drive, - transaction, - &mut state_transition_execution_context, - platform_version, - )?; - - if !result.is_valid() { - // If the signature is not valid we do not have the user pay for the state transition - // Since it is most likely not from them - // Proposers should remove such transactions from the block - // Other validators should reject blocks with such transactions - return Ok(ConsensusValidationResult::::new_with_errors(result.errors)); - } - - let mut maybe_identity = result.into_data()?; + // Only identity create does not use identity in state validation, because it doesn't yet have the identity in state + let mut maybe_identity = if state_transition.uses_identity_in_state() { + // Validating signature for identity based state transitions (all those except identity create and identity top up) + // As we already have removed identity create above, it just splits between identity top up (below - false) and + // all other state transitions (above - true) + let result = if state_transition.validates_signature_based_on_identity_info() { + state_transition.validate_identity_signed_state_transition( + platform.drive, + transaction, + &mut state_transition_execution_context, + platform_version, + ) + } else { + // Currently only identity top up + state_transition.retrieve_identity_info( + platform.drive, + transaction, + &mut state_transition_execution_context, + platform_version, + ) + }?; + if !result.is_valid() { + // If the signature is not valid or if we could not retrieve identity info + // we do not have the user pay for the state transition. + // Since it is most likely not from them + // Proposers should remove such transactions from the block + // Other validators should reject blocks with such transactions + return Ok(ConsensusValidationResult::::new_with_errors(result.errors)); + } + Some(result.into_data()?) + } else { + // Currently only identity create + None + }; + // Only identity top up and identity create do not have nonces validation if state_transition.has_nonces_validation() { // Validating identity contract nonce, this must happen after validating the signature let result = state_transition.validate_nonces( @@ -71,6 +89,7 @@ pub(in crate::execution) fn process_state_transition_v0<'a, C: CoreRPCLike>( } } + // Only Data contract update does not have basic structure validation if state_transition.has_basic_structure_validation() { // We validate basic structure validation after verifying the identity, // this is structure validation that does not require state and is already checked on check_tx @@ -90,7 +109,9 @@ pub(in crate::execution) fn process_state_transition_v0<'a, C: CoreRPCLike>( } } + // Only identity update has advanced structure validation without state if state_transition.has_advanced_structure_validation_without_state() { + // Currently only used for Identity Update // Next we have advanced structure validation, this is structure validation that does not require // state but isn't checked on check_tx. If advanced structure fails identity nonces or identity // contract nonces will be bumped @@ -118,7 +139,9 @@ pub(in crate::execution) fn process_state_transition_v0<'a, C: CoreRPCLike>( } } + // Identity create and documents batch both have advanced structure validation with state let action = if state_transition.has_advanced_structure_validation_with_state() { + // Currently used for identity create and documents batch let state_transition_action_result = state_transition.transform_into_action( platform, block_info, @@ -139,17 +162,11 @@ pub(in crate::execution) fn process_state_transition_v0<'a, C: CoreRPCLike>( } let action = state_transition_action_result.into_data()?; - let identity_ref = maybe_identity.as_ref().ok_or(Error::Execution( - ExecutionError::CorruptedCodeExecution( - "The identity must be known on advanced structure validation", - ), - ))?; - // Validating structure let result = state_transition.validate_advanced_structure_from_state( - &platform.into(), &action, - identity_ref, + maybe_identity.as_ref(), + &mut state_transition_execution_context, platform_version, )?; if !result.is_valid() { @@ -169,6 +186,7 @@ pub(in crate::execution) fn process_state_transition_v0<'a, C: CoreRPCLike>( None }; + // This is for identity credit withdrawal and identity credit transfers if state_transition.has_balance_validation() { // Validating that we have sufficient balance for a transfer or withdrawal, // this must happen after validating the signature @@ -186,6 +204,7 @@ pub(in crate::execution) fn process_state_transition_v0<'a, C: CoreRPCLike>( } // Validating state + // Only identity Top up does not validate state and instead just returns the action for topping up let result = state_transition.validate_state( action, platform, @@ -206,7 +225,7 @@ pub(in crate::execution) fn process_state_transition_v0<'a, C: CoreRPCLike>( } /// A trait for validating state transitions within a blockchain. -pub(crate) trait StateTransitionSignatureValidationV0 { +pub(crate) trait StateTransitionIdentityBasedSignatureValidationV0 { /// Validates the identity and signatures of a transaction to ensure its authenticity. /// /// # Arguments @@ -222,13 +241,28 @@ pub(crate) trait StateTransitionSignatureValidationV0 { /// - `Ok(ConsensusValidationResult>)`: Indicates that the transaction has passed authentication, and the result contains an optional `PartialIdentity`. /// - `Err(Error)`: Indicates that the transaction failed authentication, and the result contains an `Error` indicating the reason for failure. /// - fn validate_identity_and_signatures( + fn validate_identity_signed_state_transition( &self, drive: &Drive, tx: TransactionArg, execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion, - ) -> Result>, Error>; + ) -> Result, Error>; + + /// fetches identity info + fn retrieve_identity_info( + &self, + drive: &Drive, + tx: TransactionArg, + execution_context: &mut StateTransitionExecutionContext, + platform_version: &PlatformVersion, + ) -> Result, Error>; + + /// Is the state transition supposed to have an identity in the state to succeed + fn uses_identity_in_state(&self) -> bool; + + /// Do we validate the signature based on identity info? + fn validates_signature_based_on_identity_info(&self) -> bool; } /// A trait for validating state transitions within a blockchain. @@ -313,7 +347,6 @@ pub(crate) trait StateTransitionStructureKnownInStateValidationV0 { /// /// # Arguments /// - /// * `platform` - A reference to the platform state ref. /// * `action` - An optional reference to the state transition action. /// * `platform_version` - The platform version. /// @@ -322,16 +355,17 @@ pub(crate) trait StateTransitionStructureKnownInStateValidationV0 { /// * `Result` - A result with either a SimpleConsensusValidationResult or an Error. fn validate_advanced_structure_from_state( &self, - platform: &PlatformStateRef, action: &StateTransitionAction, - identity: &PartialIdentity, + maybe_identity: Option<&PartialIdentity>, + execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion, ) -> Result, Error>; /// This means we should transform into the action before validation of the structure - fn has_advanced_structure_validation_with_state(&self) -> bool { - false - } + fn has_advanced_structure_validation_with_state(&self) -> bool; + /// This means we should transform into the action before validation of the advanced structure, + /// and that we must even do this on check_tx + fn requires_advanced_structure_validation_with_state_on_check_tx(&self) -> bool; } /// A trait for validating state transitions within a blockchain. @@ -549,36 +583,60 @@ impl StateTransitionAdvancedStructureValidationV0 for StateTransition { impl StateTransitionStructureKnownInStateValidationV0 for StateTransition { fn validate_advanced_structure_from_state( &self, - platform: &PlatformStateRef, action: &StateTransitionAction, - identity: &PartialIdentity, + maybe_identity: Option<&PartialIdentity>, + execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion, ) -> Result, Error> { match self { StateTransition::DocumentsBatch(st) => st.validate_advanced_structure_from_state( - platform, action, - identity, + maybe_identity, + execution_context, platform_version, ), + StateTransition::IdentityCreate(st) => { + let signable_bytes = self.signable_bytes()?; + let StateTransitionAction::IdentityCreateAction(identity_create_action) = action + else { + return Err(Error::Execution(ExecutionError::CorruptedCodeExecution( + "action must be a identity create transition action", + ))); + }; + st.validate_advanced_structure_from_state_for_identity_create_transition( + identity_create_action, + signable_bytes, + execution_context, + platform_version, + ) + } _ => Ok(ConsensusValidationResult::new()), } } - /// This means we should transform into the action before validation of the structure + /// This means we should transform into the action before validation of the advanced structure fn has_advanced_structure_validation_with_state(&self) -> bool { + matches!( + self, + StateTransition::DocumentsBatch(_) | StateTransition::IdentityCreate(_) + ) + } + + /// This means we should transform into the action before validation of the advanced structure, + /// and that we must even do this on check_tx + fn requires_advanced_structure_validation_with_state_on_check_tx(&self) -> bool { matches!(self, StateTransition::DocumentsBatch(_)) } } -impl StateTransitionSignatureValidationV0 for StateTransition { - fn validate_identity_and_signatures( +impl StateTransitionIdentityBasedSignatureValidationV0 for StateTransition { + fn validate_identity_signed_state_transition( &self, drive: &Drive, tx: TransactionArg, execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion, - ) -> Result>, Error> { + ) -> Result, Error> { match self { StateTransition::DataContractCreate(_) | StateTransition::DataContractUpdate(_) @@ -586,96 +644,56 @@ impl StateTransitionSignatureValidationV0 for StateTransition { | StateTransition::IdentityCreditTransfer(_) | StateTransition::DocumentsBatch(_) => { //Basic signature verification - Ok(self - .validate_state_transition_identity_signed( - drive, - false, - tx, - execution_context, - platform_version, - )? - .map(Some)) + Ok(self.validate_state_transition_identity_signed( + drive, + false, + tx, + execution_context, + platform_version, + )?) } StateTransition::IdentityUpdate(_) => { //Basic signature verification - Ok(self - .validate_state_transition_identity_signed( - drive, - true, - tx, - execution_context, - platform_version, - )? - .map(Some)) + Ok(self.validate_state_transition_identity_signed( + drive, + true, + tx, + execution_context, + platform_version, + )?) } - StateTransition::IdentityCreate(st) => { - match platform_version - .drive_abci - .validation_and_processing - .state_transitions - .identity_create_state_transition - .identity_signatures - { - Some(0) => { - let mut validation_result = - ConsensusValidationResult::>::default(); - - let signable_bytes: Vec = self.signable_bytes()?; - - let result = st.validate_identity_create_state_transition_signatures_v0( - signable_bytes, - execution_context, - ); - - validation_result.merge(result); - validation_result.set_data(None); + StateTransition::IdentityCreate(_) => Ok(ConsensusValidationResult::new()), + StateTransition::IdentityTopUp(_) => Ok(ConsensusValidationResult::new()), + } + } - Ok(validation_result) - } - None => Err(Error::Execution(ExecutionError::VersionNotActive { - method: "identity create transition: validate_identity_and_signatures" - .to_string(), - known_versions: vec![0], - })), - Some(version) => { - Err(Error::Execution(ExecutionError::UnknownVersionMismatch { - method: "identity create transition: validate_identity_and_signatures" - .to_string(), - known_versions: vec![0], - received: version, - })) - } - } - } + fn retrieve_identity_info( + &self, + drive: &Drive, + tx: TransactionArg, + _execution_context: &mut StateTransitionExecutionContext, + platform_version: &PlatformVersion, + ) -> Result, Error> { + match self { StateTransition::IdentityTopUp(st) => { - match platform_version - .drive_abci - .validation_and_processing - .state_transitions - .identity_top_up_state_transition - .identity_signatures - { - // The validation of the signature happens on the state level - Some(0) => Ok(st - .retrieve_topped_up_identity(drive, tx, platform_version)? - .map(Some)), - None => Err(Error::Execution(ExecutionError::VersionNotActive { - method: "identity top up transition: validate_identity_and_signatures" - .to_string(), - known_versions: vec![0], - })), - Some(version) => { - Err(Error::Execution(ExecutionError::UnknownVersionMismatch { - method: "identity top up transition: validate_identity_and_signatures" - .to_string(), - known_versions: vec![0], - received: version, - })) - } - } + Ok(st.retrieve_topped_up_identity(drive, tx, platform_version)?) } + _ => Ok(ConsensusValidationResult::new()), } } + + /// Is the state transition supposed to have an identity in the state to succeed + fn uses_identity_in_state(&self) -> bool { + !matches!(self, StateTransition::IdentityCreate(_)) + } + + /// Do we validate the signature based on identity info? + fn validates_signature_based_on_identity_info(&self) -> bool { + !matches!( + self, + StateTransition::IdentityCreate(_) | StateTransition::IdentityTopUp(_) + ) + } } impl StateTransitionStateValidationV0 for StateTransition { @@ -697,13 +715,39 @@ impl StateTransitionStateValidationV0 for StateTransition { st.validate_state(action, platform, validation_mode, execution_context, tx) } StateTransition::IdentityCreate(st) => { - st.validate_state(action, platform, validation_mode, execution_context, tx) + let action = + action.ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( + "identity create validation should always an action", + )))?; + let StateTransitionAction::IdentityCreateAction(action) = action else { + return Err(Error::Execution(ExecutionError::CorruptedCodeExecution( + "action must be a identity create transition action", + ))); + }; + st.validate_state_for_identity_create_transition( + action, + platform, + execution_context, + tx, + ) } StateTransition::IdentityUpdate(st) => { st.validate_state(action, platform, validation_mode, execution_context, tx) } StateTransition::IdentityTopUp(st) => { - st.validate_state(action, platform, validation_mode, execution_context, tx) + // Nothing to validate from state + if let Some(action) = action { + Ok(ConsensusValidationResult::new_with_data(action)) + } else { + let signable_bytes = self.signable_bytes()?; + st.transform_into_action_for_identity_top_up_transition( + platform, + signable_bytes, + validation_mode, + execution_context, + tx, + ) + } } StateTransition::IdentityCreditWithdrawal(st) => { st.validate_state(action, platform, validation_mode, execution_context, tx) diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/basic_structure/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/basic_structure/v0/mod.rs index 51772a0043..4f3cde6428 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/basic_structure/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/basic_structure/v0/mod.rs @@ -8,11 +8,11 @@ use dpp::validation::SimpleConsensusValidationResult; use dpp::version::PlatformVersion; pub(in crate::execution::validation::state_transition::state_transitions::data_contract_create) trait DataContractCreatedStateTransitionBasicStructureValidationV0 { - fn validate_base_structure_v0(&self, platform_version: &PlatformVersion) -> Result; + fn validate_basic_structure_v0(&self, platform_version: &PlatformVersion) -> Result; } impl DataContractCreatedStateTransitionBasicStructureValidationV0 for DataContractCreateTransition { - fn validate_base_structure_v0( + fn validate_basic_structure_v0( &self, _platform_version: &PlatformVersion, ) -> Result { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs index c4e8a24799..9282e36f36 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs @@ -33,6 +33,7 @@ impl ValidationMode { ValidationMode::CheckTx => false, ValidationMode::RecheckTx => false, ValidationMode::Validator => true, + ValidationMode::NoValidation => false, } } } @@ -77,7 +78,7 @@ impl StateTransitionBasicStructureValidationV0 for DataContractCreateTransition .contract_create_state_transition .basic_structure { - Some(0) => self.validate_base_structure_v0(platform_version), + Some(0) => self.validate_basic_structure_v0(platform_version), Some(version) => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "data contract create transition: validate_basic_structure".to_string(), known_versions: vec![0], diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/v0/mod.rs index d0618f96a0..a30ad8750a 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/v0/mod.rs @@ -26,6 +26,7 @@ use dpp::state_transition::documents_batch_transition::document_create_transitio use drive::state_transition_action::StateTransitionAction; use drive::state_transition_action::system::bump_identity_data_contract_nonce_action::BumpIdentityDataContractNonceAction; use crate::error::execution::ExecutionError; +use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; pub(in crate::execution::validation::state_transition::state_transitions::documents_batch) trait DocumentsBatchStateTransitionStructureValidationV0 { @@ -33,6 +34,7 @@ pub(in crate::execution::validation::state_transition::state_transitions::docume &self, action: &DocumentsBatchTransitionAction, identity: &PartialIdentity, + execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion, ) -> Result, Error>; } @@ -42,6 +44,7 @@ impl DocumentsBatchStateTransitionStructureValidationV0 for DocumentsBatchTransi &self, action: &DocumentsBatchTransitionAction, identity: &PartialIdentity, + _execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion, ) -> Result, Error> { let security_levels = action.contract_based_security_level_requirement()?; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs index 1095dd9206..b4c531e148 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs @@ -40,6 +40,7 @@ impl ValidationMode { ValidationMode::CheckTx => false, ValidationMode::RecheckTx => false, ValidationMode::Validator => true, + ValidationMode::NoValidation => false, } } } @@ -129,9 +130,9 @@ impl StateTransitionNonceValidationV0 for DocumentsBatchTransition { impl StateTransitionStructureKnownInStateValidationV0 for DocumentsBatchTransition { fn validate_advanced_structure_from_state( &self, - _platform: &PlatformStateRef, action: &StateTransitionAction, - identity: &PartialIdentity, + identity: Option<&PartialIdentity>, + execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion, ) -> Result, Error> { match platform_version @@ -142,6 +143,10 @@ impl StateTransitionStructureKnownInStateValidationV0 for DocumentsBatchTransiti .advanced_structure { 0 => { + let identity = + identity.ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( + "The identity must be known on advanced structure validation", + )))?; let StateTransitionAction::DocumentsBatchAction(documents_batch_transition_action) = action else { @@ -152,6 +157,7 @@ impl StateTransitionStructureKnownInStateValidationV0 for DocumentsBatchTransiti self.validate_advanced_structure_from_state_v0( documents_batch_transition_action, identity, + execution_context, platform_version, ) } @@ -166,6 +172,10 @@ impl StateTransitionStructureKnownInStateValidationV0 for DocumentsBatchTransiti fn has_advanced_structure_validation_with_state(&self) -> bool { true } + + fn requires_advanced_structure_validation_with_state_on_check_tx(&self) -> bool { + true + } } impl StateTransitionStateValidationV0 for DocumentsBatchTransition { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/structure/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/advanced_structure/mod.rs similarity index 100% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/structure/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/advanced_structure/mod.rs diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/advanced_structure/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/advanced_structure/v0/mod.rs new file mode 100644 index 0000000000..1834848b02 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/advanced_structure/v0/mod.rs @@ -0,0 +1,132 @@ +use crate::error::Error; +use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; +use crate::execution::validation::state_transition::identity_create::identity_and_signatures::v0::IdentityCreateStateTransitionIdentityAndSignaturesValidationV0; +use dpp::consensus::basic::invalid_identifier_error::InvalidIdentifierError; +use dpp::consensus::basic::BasicError; +use dpp::consensus::ConsensusError; +use dpp::identity::state_transition::AssetLockProved; +use dpp::state_transition::identity_create_transition::accessors::IdentityCreateTransitionAccessorsV0; +use dpp::state_transition::identity_create_transition::IdentityCreateTransition; +use dpp::state_transition::public_key_in_creation::IdentityPublicKeyInCreation; +use dpp::validation::ConsensusValidationResult; +use dpp::version::PlatformVersion; +use drive::state_transition_action::identity::identity_create::IdentityCreateTransitionAction; +use drive::state_transition_action::system::partially_use_asset_lock_action::PartiallyUseAssetLockAction; +use drive::state_transition_action::StateTransitionAction; + +pub(in crate::execution::validation::state_transition::state_transitions::identity_create) trait IdentityCreateStateTransitionAdvancedStructureValidationV0 +{ + fn validate_advanced_structure_from_state_v0( + &self, + action: &IdentityCreateTransitionAction, + signable_bytes: Vec, + execution_context: &mut StateTransitionExecutionContext, + platform_version: &PlatformVersion, + ) -> Result, Error>; +} + +impl IdentityCreateStateTransitionAdvancedStructureValidationV0 for IdentityCreateTransition { + fn validate_advanced_structure_from_state_v0( + &self, + action: &IdentityCreateTransitionAction, + signable_bytes: Vec, + execution_context: &mut StateTransitionExecutionContext, + platform_version: &PlatformVersion, + ) -> Result, Error> { + // We should validate that the identity id is created from the asset lock proof + + // We don't need to return a consensus error here because the outpoint will already have been checked in the transformation into an action + let identifier_from_outpoint = self.asset_lock_proof().create_identifier()?; + + if identifier_from_outpoint != self.identity_id() { + let penalty = platform_version + .drive_abci + .validation_and_processing + .penalties + .identity_id_not_correct; + + // todo: pay for processing + let used_credits = penalty; // + processing + + // Most probably an attempted attack + let bump_action = StateTransitionAction::PartiallyUseAssetLockAction( + PartiallyUseAssetLockAction::from_borrowed_identity_create_transition_action( + action, + used_credits, + ), + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + vec![ConsensusError::BasicError( + BasicError::InvalidIdentifierError(InvalidIdentifierError::new( + "identity_id".to_string(), + "does not match created identifier from asset lock".to_string(), + )), + )], + )); + } + + let validation_result = + IdentityPublicKeyInCreation::validate_identity_public_keys_structure( + self.public_keys(), + true, + platform_version, + ) + .map_err(Error::Protocol)?; + + if !validation_result.is_valid() { + let penalty = platform_version + .drive_abci + .validation_and_processing + .penalties + .validation_of_added_keys_structure_failure; + + // todo: pay for processing + let used_credits = penalty; // + processing + + let bump_action = StateTransitionAction::PartiallyUseAssetLockAction( + PartiallyUseAssetLockAction::from_borrowed_identity_create_transition_action( + action, + used_credits, + ), + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + validation_result.errors, + )); + } + + // Now we should validate proof of possession + let validation_result = self.validate_identity_create_state_transition_signatures_v0( + signable_bytes, + execution_context, + ); + + if !validation_result.is_valid() { + let penalty = platform_version + .drive_abci + .validation_and_processing + .penalties + .validation_of_added_keys_proof_of_possession_failure; + + // todo: pay for processing + let used_credits = penalty; // + processing + + let bump_action = StateTransitionAction::PartiallyUseAssetLockAction( + PartiallyUseAssetLockAction::from_borrowed_identity_create_transition_action( + action, + used_credits, + ), + ); + + Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + validation_result.errors, + )) + } else { + Ok(ConsensusValidationResult::new()) + } + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/state/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/basic_structure/mod.rs similarity index 100% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/state/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/basic_structure/mod.rs diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/basic_structure/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/basic_structure/v0/mod.rs new file mode 100644 index 0000000000..9ac1626684 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/basic_structure/v0/mod.rs @@ -0,0 +1,54 @@ +use crate::error::Error; +use dpp::consensus::state::identity::max_identity_public_key_limit_reached_error::MaxIdentityPublicKeyLimitReachedError; +use dpp::consensus::state::state_error::StateError; +use dpp::identity::state_transition::AssetLockProved; +use dpp::state_transition::identity_create_transition::accessors::IdentityCreateTransitionAccessorsV0; +use dpp::state_transition::identity_create_transition::IdentityCreateTransition; +use dpp::validation::SimpleConsensusValidationResult; +use dpp::version::PlatformVersion; + +pub(in crate::execution::validation::state_transition::state_transitions::identity_create) trait IdentityCreateStateTransitionBasicStructureValidationV0 +{ + fn validate_basic_structure_v0( + &self, + platform_version: &PlatformVersion, + ) -> Result; +} + +impl IdentityCreateStateTransitionBasicStructureValidationV0 for IdentityCreateTransition { + fn validate_basic_structure_v0( + &self, + platform_version: &PlatformVersion, + ) -> Result { + let result = self + .asset_lock_proof() + .validate_structure(platform_version)?; + + if !result.is_valid() { + return Ok(result); + } + + if self.public_keys().len() + > platform_version + .dpp + .state_transitions + .identities + .max_public_keys_in_creation as usize + { + Ok(SimpleConsensusValidationResult::new_with_error( + StateError::MaxIdentityPublicKeyLimitReachedError( + MaxIdentityPublicKeyLimitReachedError::new( + platform_version + .dpp + .state_transitions + .identities + .max_public_keys_in_creation as usize, + ), + ) + .into(), + )) + } else { + Ok(SimpleConsensusValidationResult::new()) + } + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/identity_and_signatures/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/identity_and_signatures/v0/mod.rs index 6c76374166..5d09fedb7e 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/identity_and_signatures/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/identity_and_signatures/v0/mod.rs @@ -1,15 +1,8 @@ -use dpp::consensus::basic::identity::IdentityAssetLockTransactionOutputNotFoundError; -use dpp::consensus::basic::invalid_identifier_error::InvalidIdentifierError; -use dpp::consensus::basic::BasicError; -use dpp::consensus::ConsensusError; -use dpp::identity::state_transition::AssetLockProved; - use crate::execution::types::execution_operation::signature_verification_operation::SignatureVerificationOperation; use crate::execution::types::execution_operation::ValidationOperation; use crate::execution::types::state_transition_execution_context::{ StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0, }; -use dpp::prelude::ConsensusValidationResult; use dpp::serialization::PlatformMessageSignable; use dpp::state_transition::identity_create_transition::accessors::IdentityCreateTransitionAccessorsV0; use dpp::state_transition::identity_create_transition::IdentityCreateTransition; @@ -44,30 +37,6 @@ impl IdentityCreateStateTransitionIdentityAndSignaturesValidationV0 for Identity } } - // We should validate that the identity id is created from the asset lock proof - - let identifier_from_outpoint = match self.asset_lock_proof().create_identifier() { - Ok(identifier) => identifier, - Err(_) => { - return ConsensusValidationResult::new_with_error(ConsensusError::BasicError( - BasicError::IdentityAssetLockTransactionOutputNotFoundError( - IdentityAssetLockTransactionOutputNotFoundError::new( - self.asset_lock_proof().output_index() as usize, - ), - ), - )) - } - }; - - if identifier_from_outpoint != self.identity_id() { - return ConsensusValidationResult::new_with_error(ConsensusError::BasicError( - BasicError::InvalidIdentifierError(InvalidIdentifierError::new( - "identity_id".to_string(), - "does not match created identifier from asset lock".to_string(), - )), - )); - } - SimpleConsensusValidationResult::new() } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/mod.rs index c9464414b6..293eb51521 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/mod.rs @@ -1,18 +1,15 @@ +mod advanced_structure; +mod basic_structure; pub(crate) mod identity_and_signatures; mod state; -mod structure; use crate::error::Error; -use dpp::block::block_info::BlockInfo; use crate::error::execution::ExecutionError; +use crate::execution::validation::state_transition::identity_create::basic_structure::v0::IdentityCreateStateTransitionBasicStructureValidationV0; use crate::execution::validation::state_transition::identity_create::state::v0::IdentityCreateStateTransitionStateValidationV0; -use crate::execution::validation::state_transition::identity_create::structure::v0::IdentityCreateStateTransitionStructureValidationV0; -use crate::execution::validation::state_transition::processor::v0::{ - StateTransitionBasicStructureValidationV0, StateTransitionStateValidationV0, -}; -use crate::execution::validation::state_transition::transformer::StateTransitionActionTransformerV0; +use crate::execution::validation::state_transition::processor::v0::StateTransitionBasicStructureValidationV0; use crate::platform_types::platform::PlatformRef; use crate::rpc::core::CoreRPCLike; @@ -24,18 +21,33 @@ use dpp::validation::SimpleConsensusValidationResult; use dpp::version::PlatformVersion; use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; +use crate::execution::validation::state_transition::identity_create::advanced_structure::v0::IdentityCreateStateTransitionAdvancedStructureValidationV0; use crate::execution::validation::state_transition::ValidationMode; use drive::grovedb::TransactionArg; +use drive::state_transition_action::identity::identity_create::IdentityCreateTransitionAction; use drive::state_transition_action::StateTransitionAction; -impl StateTransitionActionTransformerV0 for IdentityCreateTransition { - fn transform_into_action( +/// A trait for transforming into an action for the identity create transition +pub trait StateTransitionActionTransformerForIdentityCreateTransitionV0 { + /// Transforming into the action + fn transform_into_action_for_identity_create_transition( &self, platform: &PlatformRef, - _block_info: &BlockInfo, - _validation_mode: ValidationMode, + signable_bytes: Vec, + validation_mode: ValidationMode, execution_context: &mut StateTransitionExecutionContext, - _tx: TransactionArg, + tx: TransactionArg, + ) -> Result, Error>; +} + +impl StateTransitionActionTransformerForIdentityCreateTransitionV0 for IdentityCreateTransition { + fn transform_into_action_for_identity_create_transition( + &self, + platform: &PlatformRef, + signable_bytes: Vec, + validation_mode: ValidationMode, + execution_context: &mut StateTransitionExecutionContext, + tx: TransactionArg, ) -> Result, Error> { let platform_version = platform.state.current_platform_version()?; match platform_version @@ -45,7 +57,14 @@ impl StateTransitionActionTransformerV0 for IdentityCreateTransition { .identity_create_state_transition .transform_into_action { - 0 => self.transform_into_action_v0(platform, execution_context, platform_version), + 0 => self.transform_into_action_v0( + platform, + signable_bytes, + validation_mode, + execution_context, + tx, + platform_version, + ), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "identity create transition: transform_into_action".to_string(), known_versions: vec![0], @@ -67,7 +86,7 @@ impl StateTransitionBasicStructureValidationV0 for IdentityCreateTransition { .identity_create_state_transition .basic_structure { - Some(0) => self.validate_base_structure_v0(platform_version), + Some(0) => self.validate_basic_structure_v0(platform_version), Some(version) => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "identity create transition: validate_basic_structure".to_string(), known_versions: vec![0], @@ -81,12 +100,73 @@ impl StateTransitionBasicStructureValidationV0 for IdentityCreateTransition { } } -impl StateTransitionStateValidationV0 for IdentityCreateTransition { - fn validate_state( +/// A trait for advanced structure validation after transforming into an action +pub trait StateTransitionStructureKnownInStateValidationForIdentityCreateTransitionV0 { + /// Validation of the advanced structure + fn validate_advanced_structure_from_state_for_identity_create_transition( + &self, + action: &IdentityCreateTransitionAction, + signable_bytes: Vec, + execution_context: &mut StateTransitionExecutionContext, + platform_version: &PlatformVersion, + ) -> Result, Error>; +} + +impl StateTransitionStructureKnownInStateValidationForIdentityCreateTransitionV0 + for IdentityCreateTransition +{ + fn validate_advanced_structure_from_state_for_identity_create_transition( + &self, + action: &IdentityCreateTransitionAction, + signable_bytes: Vec, + execution_context: &mut StateTransitionExecutionContext, + platform_version: &PlatformVersion, + ) -> Result, Error> { + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .identity_create_state_transition + .advanced_structure + { + Some(0) => self.validate_advanced_structure_from_state_v0( + action, + signable_bytes, + execution_context, + platform_version, + ), + Some(version) => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "identity create transition: validate_advanced_structure_from_state" + .to_string(), + known_versions: vec![0], + received: version, + })), + None => Err(Error::Execution(ExecutionError::VersionNotActive { + method: "identity create transition: validate_advanced_structure_from_state" + .to_string(), + known_versions: vec![0], + })), + } + } +} + +/// A trait for state validation for the identity create transition +pub trait StateTransitionStateValidationForIdentityCreateTransitionV0 { + /// Validate state + fn validate_state_for_identity_create_transition( + &self, + action: IdentityCreateTransitionAction, + platform: &PlatformRef, + execution_context: &mut StateTransitionExecutionContext, + tx: TransactionArg, + ) -> Result, Error>; +} + +impl StateTransitionStateValidationForIdentityCreateTransitionV0 for IdentityCreateTransition { + fn validate_state_for_identity_create_transition( &self, - _action: Option, + action: IdentityCreateTransitionAction, platform: &PlatformRef, - _validation_mode: ValidationMode, execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, ) -> Result, Error> { @@ -98,7 +178,7 @@ impl StateTransitionStateValidationV0 for IdentityCreateTransition { .identity_create_state_transition .state { - 0 => self.validate_state_v0(platform, execution_context, tx, platform_version), + 0 => self.validate_state_v0(platform, action, execution_context, tx, platform_version), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "identity create transition: validate_state".to_string(), known_versions: vec![0], diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/state/v0/mod.rs index d48fc7d1ac..eb803d82bd 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/state/v0/mod.rs @@ -1,22 +1,23 @@ use crate::error::Error; use crate::platform_types::platform::PlatformRef; use crate::rpc::core::CoreRPCLike; +use dpp::asset_lock::reduced_asset_lock_value::{AssetLockValue, AssetLockValueGettersV0}; use dpp::balances::credits::CREDITS_PER_DUFF; +use dpp::consensus::basic::identity::IdentityAssetLockTransactionOutPointNotEnoughBalanceError; use dpp::consensus::signature::{BasicECDSAError, SignatureError}; -use dpp::consensus::state::identity::invalid_asset_lock_proof_value::InvalidAssetLockProofValueError; use dpp::consensus::state::identity::IdentityAlreadyExistsError; -use dpp::dashcore::signer; +use dpp::dashcore::hashes::Hash; use dpp::dashcore::signer::double_sha; +use dpp::dashcore::{signer, ScriptBuf, Txid}; use dpp::identity::KeyType; use dpp::identity::state_transition::AssetLockProved; use dpp::prelude::ConsensusValidationResult; -use dpp::serialization::Signable; use dpp::state_transition::identity_create_transition::accessors::IdentityCreateTransitionAccessorsV0; use dpp::state_transition::identity_create_transition::IdentityCreateTransition; -use dpp::state_transition::{StateTransition, StateTransitionLike}; +use dpp::state_transition::StateTransitionLike; use dpp::version::PlatformVersion; use drive::state_transition_action::identity::identity_create::IdentityCreateTransitionAction; @@ -29,26 +30,31 @@ use crate::execution::types::state_transition_execution_context::{ StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0, }; use crate::execution::validation::state_transition::common::asset_lock::proof::validate::AssetLockProofValidation; -use dpp::version::DefaultForPlatformVersion; use drive::grovedb::TransactionArg; +use drive::state_transition_action::system::partially_use_asset_lock_action::PartiallyUseAssetLockAction; use crate::execution::validation::state_transition::common::asset_lock::transaction::fetch_asset_lock_transaction_output_sync::fetch_asset_lock_transaction_output_sync; use crate::execution::validation::state_transition::common::validate_unique_identity_public_key_hashes_in_state::validate_unique_identity_public_key_hashes_not_in_state; +use crate::execution::validation::state_transition::ValidationMode; pub(in crate::execution::validation::state_transition::state_transitions::identity_create) trait IdentityCreateStateTransitionStateValidationV0 { fn validate_state_v0( &self, platform: &PlatformRef, + action: IdentityCreateTransitionAction, execution_context: &mut StateTransitionExecutionContext, - tx: TransactionArg, + transaction: TransactionArg, platform_version: &PlatformVersion, ) -> Result, Error>; fn transform_into_action_v0( &self, platform: &PlatformRef, + signable_bytes: Vec, + validation_mode: ValidationMode, execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, platform_version: &PlatformVersion, ) -> Result, Error>; } @@ -57,124 +63,191 @@ impl IdentityCreateStateTransitionStateValidationV0 for IdentityCreateTransition fn validate_state_v0( &self, platform: &PlatformRef, + action: IdentityCreateTransitionAction, execution_context: &mut StateTransitionExecutionContext, - tx: TransactionArg, + transaction: TransactionArg, platform_version: &PlatformVersion, ) -> Result, Error> { let drive = platform.drive; - let mut state_transition_execution_context = - StateTransitionExecutionContext::default_for_platform_version(platform_version)?; - let mut validation_result = ConsensusValidationResult::::default(); let identity_id = self.identity_id(); let balance = - drive.fetch_identity_balance(identity_id.to_buffer(), tx, platform_version)?; + drive.fetch_identity_balance(identity_id.to_buffer(), transaction, platform_version)?; // Balance is here to check if the identity does already exist if balance.is_some() { + // Since the id comes from the state transition this should never be reachable return Ok(ConsensusValidationResult::new_with_error( IdentityAlreadyExistsError::new(identity_id.to_owned()).into(), )); } - // Validate asset lock proof state - validation_result.merge(self.asset_lock_proof().validate( - platform, - tx, - platform_version, - )?); - - if !validation_result.is_valid() { - return Ok(validation_result); - } - // Now we should check the state of added keys to make sure there aren't any that already exist - validation_result.add_errors( + let unique_public_key_validation_result = validate_unique_identity_public_key_hashes_not_in_state( self.public_keys(), drive, - &mut state_transition_execution_context, - tx, + execution_context, + transaction, platform_version, - )? - .errors, - ); - - if !validation_result.is_valid() { - return Ok(validation_result); + )?; + + if unique_public_key_validation_result.is_valid() { + // We just pass the action that was given to us + Ok(ConsensusValidationResult::new_with_data( + StateTransitionAction::IdentityCreateAction(action), + )) + } else { + // It's not valid, we need to give back the action that partially uses the asset lock + + let used_credits = 1000; //todo: figure this out + + let bump_action = PartiallyUseAssetLockAction::from_identity_create_transition_action( + action, + used_credits, + ); + Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action.into(), + unique_public_key_validation_result.errors, + )) } - - self.transform_into_action_v0(platform, execution_context, platform_version) } fn transform_into_action_v0( &self, platform: &PlatformRef, + signable_bytes: Vec, + validation_mode: ValidationMode, execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, platform_version: &PlatformVersion, ) -> Result, Error> { - let mut validation_result = ConsensusValidationResult::::default(); + // Todo: we might want a lowered required balance + let required_balance = platform_version + .dpp + .state_transitions + .identities + .asset_locks + .required_asset_lock_duff_balance_for_processing_start_for_identity_create + * CREDITS_PER_DUFF; - let tx_out_validation = fetch_asset_lock_transaction_output_sync( - platform.core_rpc, - self.asset_lock_proof(), - platform_version, - )?; + // Validate asset lock proof state + // The required balance is in credits because we verify the asset lock value (which is in credits) + let asset_lock_proof_validation = if validation_mode != ValidationMode::NoValidation { + self.asset_lock_proof().validate( + platform, + required_balance, + validation_mode, + transaction, + platform_version, + )? + } else { + ConsensusValidationResult::new() + }; - if !tx_out_validation.is_valid() { + if !asset_lock_proof_validation.is_valid() { return Ok(ConsensusValidationResult::new_with_errors( - tx_out_validation.errors, + asset_lock_proof_validation.errors, )); } - let tx_out = tx_out_validation.into_data()?; - let min_value = IdentityCreateTransition::get_minimal_asset_lock_value(platform_version)?; - if tx_out.value < min_value { - return Ok(ConsensusValidationResult::new_with_error( - InvalidAssetLockProofValueError::new(tx_out.value, min_value).into(), - )); - } + let mut needs_signature_verification = true; + + let asset_lock_value_to_be_consumed = if asset_lock_proof_validation.has_data() { + let asset_lock_value = asset_lock_proof_validation.into_data()?; + + if validation_mode == ValidationMode::RecheckTx { + needs_signature_verification = false; + } + asset_lock_value + } else { + let tx_out_validation = fetch_asset_lock_transaction_output_sync( + platform.core_rpc, + self.asset_lock_proof(), + platform_version, + )?; - // Verify one time signature + if !tx_out_validation.is_valid() { + return Ok(ConsensusValidationResult::new_with_errors( + tx_out_validation.errors, + )); + } - let signable_bytes = StateTransition::IdentityCreate(self.clone()).signable_bytes()?; + let tx_out = tx_out_validation.into_data()?; + + let min_value = platform_version + .dpp + .state_transitions + .identities + .asset_locks + .required_asset_lock_duff_balance_for_processing_start_for_identity_create; + if tx_out.value < min_value { + return Ok(ConsensusValidationResult::new_with_error( + IdentityAssetLockTransactionOutPointNotEnoughBalanceError::new( + self.asset_lock_proof() + .out_point() + .map(|outpoint| outpoint.txid) + .unwrap_or(Txid::all_zeros()), + self.asset_lock_proof().output_index() as usize, + tx_out.value, + tx_out.value, + min_value, + ) + .into(), + )); + } - let public_key_hash = tx_out - .script_pubkey - .p2pkh_public_key_hash_bytes() - .ok_or_else(|| { - Error::Execution(ExecutionError::CorruptedCodeExecution( - "output must be a valid p2pkh already", - )) - })?; + // Verify one time signature - execution_context.add_operation(ValidationOperation::DoubleSha256); - execution_context.add_operation(ValidationOperation::SignatureVerification( - SignatureVerificationOperation::new(KeyType::ECDSA_HASH160), - )); + if validation_mode == ValidationMode::RecheckTx { + needs_signature_verification = false; + } - if let Err(e) = signer::verify_hash_signature( - &double_sha(signable_bytes), - self.signature().as_slice(), - public_key_hash, - ) { - return Ok(ConsensusValidationResult::new_with_error( - SignatureError::BasicECDSAError(BasicECDSAError::new(e.to_string())).into(), + let initial_balance_amount = tx_out.value * CREDITS_PER_DUFF; + AssetLockValue::new( + initial_balance_amount, + tx_out.script_pubkey.0, + initial_balance_amount, + platform_version, + )? + }; + + if needs_signature_verification { + let tx_out_script_pubkey = + ScriptBuf(asset_lock_value_to_be_consumed.tx_out_script().clone()); + + // Verify one time signature + + let public_key_hash = tx_out_script_pubkey + .p2pkh_public_key_hash_bytes() + .ok_or_else(|| { + Error::Execution(ExecutionError::CorruptedCachedState( + "the script inside the state must be a p2pkh".to_string(), + )) + })?; + + execution_context.add_operation(ValidationOperation::DoubleSha256); + execution_context.add_operation(ValidationOperation::SignatureVerification( + SignatureVerificationOperation::new(KeyType::ECDSA_HASH160), )); + + if let Err(e) = signer::verify_hash_signature( + &double_sha(signable_bytes), + self.signature().as_slice(), + public_key_hash, + ) { + return Ok(ConsensusValidationResult::new_with_error( + SignatureError::BasicECDSAError(BasicECDSAError::new(e.to_string())).into(), + )); + } } match IdentityCreateTransitionAction::try_from_borrowed( self, - tx_out.value * CREDITS_PER_DUFF, + asset_lock_value_to_be_consumed, ) { - Ok(action) => { - validation_result.set_data(action.into()); - } - Err(error) => { - validation_result.add_error(error); - } + Ok(action) => Ok(ConsensusValidationResult::new_with_data(action.into())), + Err(error) => Ok(ConsensusValidationResult::new_with_error(error)), } - - Ok(validation_result) } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/structure/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/structure/v0/mod.rs deleted file mode 100644 index 43ede0b10e..0000000000 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/structure/v0/mod.rs +++ /dev/null @@ -1,37 +0,0 @@ -use crate::error::Error; -use dpp::identity::state_transition::AssetLockProved; -use dpp::state_transition::identity_create_transition::accessors::IdentityCreateTransitionAccessorsV0; -use dpp::state_transition::identity_create_transition::IdentityCreateTransition; -use dpp::state_transition::public_key_in_creation::IdentityPublicKeyInCreation; -use dpp::validation::SimpleConsensusValidationResult; -use dpp::version::PlatformVersion; - -pub(in crate::execution::validation::state_transition::state_transitions::identity_create) trait IdentityCreateStateTransitionStructureValidationV0 -{ - fn validate_base_structure_v0( - &self, - platform_version: &PlatformVersion, - ) -> Result; -} - -impl IdentityCreateStateTransitionStructureValidationV0 for IdentityCreateTransition { - fn validate_base_structure_v0( - &self, - platform_version: &PlatformVersion, - ) -> Result { - let result = self - .asset_lock_proof() - .validate_structure(platform_version)?; - - if !result.is_valid() { - return Ok(result); - } - - IdentityPublicKeyInCreation::validate_identity_public_keys_structure( - self.public_keys(), - true, - platform_version, - ) - .map_err(Error::Protocol) - } -} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/mod.rs index 71e641336d..292d3488cc 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/mod.rs @@ -65,7 +65,7 @@ impl StateTransitionBasicStructureValidationV0 for IdentityCreditTransferTransit .identity_credit_transfer_state_transition .basic_structure { - Some(0) => self.validate_base_structure_v0(), + Some(0) => self.validate_basic_structure_v0(), Some(version) => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "identity credit transfer transition: validate_basic_structure".to_string(), known_versions: vec![0], diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/structure/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/structure/v0/mod.rs index 7d0784624b..2d19799dcc 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/structure/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/structure/v0/mod.rs @@ -11,13 +11,13 @@ use dpp::validation::SimpleConsensusValidationResult; const MIN_TRANSFER_AMOUNT: u64 = 100000; pub(in crate::execution::validation::state_transition::state_transitions::identity_credit_transfer) trait IdentityCreditTransferStateTransitionStructureValidationV0 { - fn validate_base_structure_v0(&self) -> Result; + fn validate_basic_structure_v0(&self) -> Result; } impl IdentityCreditTransferStateTransitionStructureValidationV0 for IdentityCreditTransferTransition { - fn validate_base_structure_v0(&self) -> Result { + fn validate_basic_structure_v0(&self) -> Result { let result = SimpleConsensusValidationResult::new(); if self.identity_id() == self.recipient_id() { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs index 8f2cc9ed67..838a07801c 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs @@ -66,7 +66,7 @@ impl StateTransitionBasicStructureValidationV0 for IdentityCreditWithdrawalTrans .identity_credit_withdrawal_state_transition .basic_structure { - Some(0) => self.validate_base_structure_v0(), + Some(0) => self.validate_basic_structure_v0(), Some(version) => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "identity credit withdrawal transition: validate_basic_structure" .to_string(), diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/structure/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/structure/v0/mod.rs index f5b98f59a0..e06dbfd828 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/structure/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/structure/v0/mod.rs @@ -17,13 +17,13 @@ use dpp::validation::SimpleConsensusValidationResult; use dpp::withdrawal::Pooling; pub(in crate::execution::validation::state_transition::state_transitions::identity_credit_withdrawal) trait IdentityCreditWithdrawalStateTransitionStructureValidationV0 { - fn validate_base_structure_v0(&self) -> Result; + fn validate_basic_structure_v0(&self) -> Result; } impl IdentityCreditWithdrawalStateTransitionStructureValidationV0 for IdentityCreditWithdrawalTransition { - fn validate_base_structure_v0(&self) -> Result { + fn validate_basic_structure_v0(&self) -> Result { let mut result = SimpleConsensusValidationResult::default(); if self.amount() < MIN_WITHDRAWAL_AMOUNT { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/mod.rs index 62d7e80cd5..be7b829d7e 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/mod.rs @@ -1,8 +1,6 @@ pub(crate) mod identity_retrieval; -mod state; mod structure; - -use dpp::block::block_info::BlockInfo; +mod transform_into_action; use dpp::state_transition::identity_topup_transition::IdentityTopUpTransition; use dpp::validation::{ConsensusValidationResult, SimpleConsensusValidationResult}; use dpp::version::PlatformVersion; @@ -17,23 +15,33 @@ use crate::execution::types::state_transition_execution_context::StateTransition use crate::platform_types::platform::PlatformRef; use crate::rpc::core::CoreRPCLike; -use crate::execution::validation::state_transition::identity_top_up::state::v0::IdentityTopUpStateTransitionStateValidationV0; use crate::execution::validation::state_transition::identity_top_up::structure::v0::IdentityTopUpStateTransitionStructureValidationV0; -use crate::execution::validation::state_transition::processor::v0::{ - StateTransitionBasicStructureValidationV0, StateTransitionStateValidationV0, -}; +use crate::execution::validation::state_transition::identity_top_up::transform_into_action::v0::IdentityTopUpStateTransitionStateValidationV0; +use crate::execution::validation::state_transition::processor::v0::StateTransitionBasicStructureValidationV0; -use crate::execution::validation::state_transition::transformer::StateTransitionActionTransformerV0; use crate::execution::validation::state_transition::ValidationMode; -impl StateTransitionActionTransformerV0 for IdentityTopUpTransition { - fn transform_into_action( +/// A trait to transform into a top up action +pub trait StateTransitionIdentityTopUpTransitionActionTransformer { + /// Transform into a top up action + fn transform_into_action_for_identity_top_up_transition( + &self, + platform: &PlatformRef, + signable_bytes: Vec, + validation_mode: ValidationMode, + execution_context: &mut StateTransitionExecutionContext, + tx: TransactionArg, + ) -> Result, Error>; +} + +impl StateTransitionIdentityTopUpTransitionActionTransformer for IdentityTopUpTransition { + fn transform_into_action_for_identity_top_up_transition( &self, platform: &PlatformRef, - _block_info: &BlockInfo, - _validation_mode: ValidationMode, + signable_bytes: Vec, + validation_mode: ValidationMode, execution_context: &mut StateTransitionExecutionContext, - _tx: TransactionArg, + tx: TransactionArg, ) -> Result, Error> { let platform_version = platform.state.current_platform_version()?; @@ -44,9 +52,16 @@ impl StateTransitionActionTransformerV0 for IdentityTopUpTransition { .identity_top_up_state_transition .transform_into_action { - 0 => self.transform_into_action_v0(platform, execution_context, platform_version), + 0 => self.transform_into_action_v0( + platform, + signable_bytes, + validation_mode, + execution_context, + tx, + platform_version, + ), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { - method: "identity top up transition: transform_into_action".to_string(), + method: "identity top up transition: transform_top_up_into_action".to_string(), known_versions: vec![0], received: version, })), @@ -66,7 +81,7 @@ impl StateTransitionBasicStructureValidationV0 for IdentityTopUpTransition { .identity_top_up_state_transition .basic_structure { - Some(0) => self.validate_base_structure_v0(platform_version), + Some(0) => self.validate_basic_structure_v0(platform_version), Some(version) => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "identity top up transition: validate_basic_structure".to_string(), known_versions: vec![0], @@ -79,31 +94,3 @@ impl StateTransitionBasicStructureValidationV0 for IdentityTopUpTransition { } } } - -impl StateTransitionStateValidationV0 for IdentityTopUpTransition { - fn validate_state( - &self, - _action: Option, - platform: &PlatformRef, - _validation_mode: ValidationMode, - execution_context: &mut StateTransitionExecutionContext, - tx: TransactionArg, - ) -> Result, Error> { - let platform_version = platform.state.current_platform_version()?; - - match platform_version - .drive_abci - .validation_and_processing - .state_transitions - .identity_top_up_state_transition - .state - { - 0 => self.validate_state_v0(platform, execution_context, tx, platform_version), - version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { - method: "identity top up transition: validate_state".to_string(), - known_versions: vec![0], - received: version, - })), - } - } -} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/state/v0/mod.rs deleted file mode 100644 index b1fd68de7b..0000000000 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/state/v0/mod.rs +++ /dev/null @@ -1,143 +0,0 @@ -use crate::error::Error; -use crate::platform_types::platform::PlatformRef; -use crate::rpc::core::CoreRPCLike; -use dpp::balances::credits::CREDITS_PER_DUFF; - -use dpp::consensus::signature::{BasicECDSAError, SignatureError}; -use dpp::consensus::state::identity::invalid_asset_lock_proof_value::InvalidAssetLockProofValueError; -use dpp::dashcore::signer; -use dpp::dashcore::signer::double_sha; -use dpp::identity::state_transition::AssetLockProved; -use dpp::identity::KeyType; - -use dpp::prelude::ConsensusValidationResult; -use dpp::serialization::Signable; - -use dpp::state_transition::identity_topup_transition::IdentityTopUpTransition; -use dpp::state_transition::{StateTransition, StateTransitionLike}; - -use dpp::version::PlatformVersion; -use drive::state_transition_action::identity::identity_topup::IdentityTopUpTransitionAction; -use drive::state_transition_action::StateTransitionAction; - -use crate::error::execution::ExecutionError; -use drive::grovedb::TransactionArg; - -use crate::execution::types::execution_operation::ValidationOperation; -use crate::execution::types::execution_operation::signature_verification_operation::SignatureVerificationOperation; -use crate::execution::types::state_transition_execution_context::{StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0}; -use crate::execution::validation::state_transition::common::asset_lock::proof::validate::AssetLockProofValidation; -use crate::execution::validation::state_transition::common::asset_lock::transaction::fetch_asset_lock_transaction_output_sync::fetch_asset_lock_transaction_output_sync; - -pub(in crate::execution::validation::state_transition::state_transitions::identity_top_up) trait IdentityTopUpStateTransitionStateValidationV0 -{ - fn validate_state_v0( - &self, - platform: &PlatformRef, - execution_context: &mut StateTransitionExecutionContext, - tx: TransactionArg, - platform_version: &PlatformVersion, - ) -> Result, Error>; - - fn transform_into_action_v0( - &self, - platform: &PlatformRef, - execution_context: &mut StateTransitionExecutionContext, - platform_version: &PlatformVersion, - ) -> Result, Error>; -} - -impl IdentityTopUpStateTransitionStateValidationV0 for IdentityTopUpTransition { - fn validate_state_v0( - &self, - platform: &PlatformRef, - execution_context: &mut StateTransitionExecutionContext, - tx: TransactionArg, - platform_version: &PlatformVersion, - ) -> Result, Error> { - let mut validation_result = ConsensusValidationResult::::default(); - - validation_result.merge(self.asset_lock_proof().validate( - platform, - tx, - platform_version, - )?); - - if !validation_result.is_valid() { - return Ok(validation_result); - } - - self.transform_into_action_v0(platform, execution_context, platform_version) - } - - fn transform_into_action_v0( - &self, - platform: &PlatformRef, - execution_context: &mut StateTransitionExecutionContext, - platform_version: &PlatformVersion, - ) -> Result, Error> { - let mut validation_result = ConsensusValidationResult::::default(); - - let tx_out_validation = fetch_asset_lock_transaction_output_sync( - platform.core_rpc, - self.asset_lock_proof(), - platform_version, - )?; - - if !tx_out_validation.is_valid() { - return Ok(ConsensusValidationResult::new_with_errors( - tx_out_validation.errors, - )); - } - - let tx_out = tx_out_validation.into_data()?; - let min_value = IdentityTopUpTransition::get_minimal_asset_lock_value(platform_version)?; - if tx_out.value < min_value { - return Ok(ConsensusValidationResult::new_with_error( - InvalidAssetLockProofValueError::new(tx_out.value, min_value).into(), - )); - } - - // Verify one time signature - - let signable_bytes = StateTransition::IdentityTopUp(self.clone()).signable_bytes()?; - - let public_key_hash = tx_out - .script_pubkey - .p2pkh_public_key_hash_bytes() - .ok_or_else(|| { - Error::Execution(ExecutionError::CorruptedCodeExecution( - "output must be a valid p2pkh already", - )) - })?; - - execution_context.add_operation(ValidationOperation::DoubleSha256); - execution_context.add_operation(ValidationOperation::SignatureVerification( - SignatureVerificationOperation::new(KeyType::ECDSA_HASH160), - )); - - if let Err(e) = signer::verify_hash_signature( - &double_sha(signable_bytes), - self.signature().as_slice(), - public_key_hash, - ) { - return Ok(ConsensusValidationResult::new_with_error( - SignatureError::BasicECDSAError(BasicECDSAError::new(e.to_string())).into(), - )); - } - - match IdentityTopUpTransitionAction::try_from_borrowed( - self, - tx_out.value * CREDITS_PER_DUFF, - ) { - Ok(action) => { - validation_result.set_data(action.into()); - } - Err(error) => { - validation_result.add_error(error); - } - } - - Ok(validation_result) - } -} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/structure/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/structure/v0/mod.rs index 28bdf9425d..6a8be703cf 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/structure/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/structure/v0/mod.rs @@ -7,19 +7,17 @@ use dpp::version::PlatformVersion; pub(in crate::execution::validation::state_transition::state_transitions::identity_top_up) trait IdentityTopUpStateTransitionStructureValidationV0 { - fn validate_base_structure_v0( + fn validate_basic_structure_v0( &self, platform_version: &PlatformVersion, ) -> Result; } impl IdentityTopUpStateTransitionStructureValidationV0 for IdentityTopUpTransition { - fn validate_base_structure_v0( + fn validate_basic_structure_v0( &self, platform_version: &PlatformVersion, ) -> Result { - // TODO: Add validation for the structure of the IdentityTopUpTransition - self.asset_lock_proof() .validate_structure(platform_version) .map_err(Error::Protocol) diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/transform_into_action/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/transform_into_action/mod.rs new file mode 100644 index 0000000000..9a1925de7f --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/transform_into_action/mod.rs @@ -0,0 +1 @@ +pub(crate) mod v0; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/transform_into_action/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/transform_into_action/v0/mod.rs new file mode 100644 index 0000000000..6b911ad6f0 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/transform_into_action/v0/mod.rs @@ -0,0 +1,188 @@ +use crate::error::Error; +use crate::platform_types::platform::PlatformRef; +use crate::rpc::core::CoreRPCLike; +use dpp::asset_lock::reduced_asset_lock_value::{AssetLockValue, AssetLockValueGettersV0}; +use dpp::balances::credits::CREDITS_PER_DUFF; +use dpp::consensus::basic::identity::IdentityAssetLockTransactionOutPointNotEnoughBalanceError; + +use dpp::consensus::signature::{BasicECDSAError, SignatureError}; +use dpp::dashcore::hashes::Hash; +use dpp::dashcore::signer::double_sha; +use dpp::dashcore::{signer, ScriptBuf, Txid}; +use dpp::identity::state_transition::AssetLockProved; +use dpp::identity::KeyType; + +use dpp::prelude::ConsensusValidationResult; + +use dpp::state_transition::identity_topup_transition::IdentityTopUpTransition; +use dpp::state_transition::StateTransitionLike; + +use dpp::version::PlatformVersion; +use drive::state_transition_action::identity::identity_topup::IdentityTopUpTransitionAction; +use drive::state_transition_action::StateTransitionAction; + +use crate::error::execution::ExecutionError; +use drive::grovedb::TransactionArg; + +use crate::execution::types::execution_operation::ValidationOperation; +use crate::execution::types::execution_operation::signature_verification_operation::SignatureVerificationOperation; +use crate::execution::types::state_transition_execution_context::{StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0}; +use crate::execution::validation::state_transition::common::asset_lock::proof::validate::AssetLockProofValidation; +use crate::execution::validation::state_transition::common::asset_lock::transaction::fetch_asset_lock_transaction_output_sync::fetch_asset_lock_transaction_output_sync; +use crate::execution::validation::state_transition::ValidationMode; + +pub(in crate::execution::validation::state_transition::state_transitions::identity_top_up) trait IdentityTopUpStateTransitionStateValidationV0 +{ + fn transform_into_action_v0( + &self, + platform: &PlatformRef, + signable_bytes: Vec, + validation_mode: ValidationMode, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result, Error>; +} + +impl IdentityTopUpStateTransitionStateValidationV0 for IdentityTopUpTransition { + fn transform_into_action_v0( + &self, + platform: &PlatformRef, + signable_bytes: Vec, + validation_mode: ValidationMode, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result, Error> { + // Todo: we might want a lowered required balance + let required_balance = platform_version + .dpp + .state_transitions + .identities + .asset_locks + .required_asset_lock_duff_balance_for_processing_start_for_identity_top_up; + + // Validate asset lock proof state + let asset_lock_proof_validation = if validation_mode != ValidationMode::NoValidation { + self.asset_lock_proof().validate( + platform, + required_balance, + validation_mode, + transaction, + platform_version, + )? + } else { + ConsensusValidationResult::new() + }; + + if !asset_lock_proof_validation.is_valid() { + return Ok(ConsensusValidationResult::new_with_errors( + asset_lock_proof_validation.errors, + )); + } + + let mut needs_signature_verification = true; + + let asset_lock_value_to_be_consumed = if asset_lock_proof_validation.has_data() { + let asset_lock_value = asset_lock_proof_validation.into_data()?; + // There is no needed to recheck signatures on recheck tx + if validation_mode == ValidationMode::RecheckTx { + needs_signature_verification = false; + } + asset_lock_value + } else { + let tx_out_validation = fetch_asset_lock_transaction_output_sync( + platform.core_rpc, + self.asset_lock_proof(), + platform_version, + )?; + + if !tx_out_validation.is_valid() { + return Ok(ConsensusValidationResult::new_with_errors( + tx_out_validation.errors, + )); + } + + let tx_out = tx_out_validation.into_data()?; + + // We should always check that the balance is enough as it's very cheap and we could have + // had a version change that would have changed the minimum duff balance for processing + // start + + let min_value = platform_version + .dpp + .state_transitions + .identities + .asset_locks + .required_asset_lock_duff_balance_for_processing_start_for_identity_top_up; + if tx_out.value < min_value { + return Ok(ConsensusValidationResult::new_with_error( + IdentityAssetLockTransactionOutPointNotEnoughBalanceError::new( + self.asset_lock_proof() + .out_point() + .map(|outpoint| outpoint.txid) + .unwrap_or(Txid::all_zeros()), + self.asset_lock_proof().output_index() as usize, + tx_out.value, + tx_out.value, + min_value, + ) + .into(), + )); + } + + // Verify one time signature + // This is not necessary on recheck + + if validation_mode == ValidationMode::RecheckTx { + needs_signature_verification = false; + } + + let initial_balance_amount = tx_out.value * CREDITS_PER_DUFF; + AssetLockValue::new( + initial_balance_amount, + tx_out.script_pubkey.0, + initial_balance_amount, + platform_version, + )? + }; + + if needs_signature_verification { + let tx_out_script_pubkey = + ScriptBuf(asset_lock_value_to_be_consumed.tx_out_script().clone()); + + // Verify one time signature + + let public_key_hash = tx_out_script_pubkey + .p2pkh_public_key_hash_bytes() + .ok_or_else(|| { + Error::Execution(ExecutionError::CorruptedCachedState( + "the script inside the state must be a p2pkh".to_string(), + )) + })?; + + execution_context.add_operation(ValidationOperation::DoubleSha256); + execution_context.add_operation(ValidationOperation::SignatureVerification( + SignatureVerificationOperation::new(KeyType::ECDSA_HASH160), + )); + + if let Err(e) = signer::verify_hash_signature( + &double_sha(signable_bytes), + self.signature().as_slice(), + public_key_hash, + ) { + return Ok(ConsensusValidationResult::new_with_error( + SignatureError::BasicECDSAError(BasicECDSAError::new(e.to_string())).into(), + )); + } + } + + match IdentityTopUpTransitionAction::try_from_borrowed( + self, + asset_lock_value_to_be_consumed, + ) { + Ok(action) => Ok(ConsensusValidationResult::new_with_data(action.into())), + Err(error) => Ok(ConsensusValidationResult::new_with_error(error)), + } + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/basic_structure/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/basic_structure/v0/mod.rs index b8f750804a..2252d0192c 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/basic_structure/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/basic_structure/v0/mod.rs @@ -17,14 +17,14 @@ const MAX_KEYS_TO_DISABLE: usize = 10; pub(in crate::execution::validation::state_transition::state_transitions::identity_update) trait IdentityUpdateStateTransitionStructureValidationV0 { - fn validate_base_structure_v0( + fn validate_basic_structure_v0( &self, platform_version: &PlatformVersion, ) -> Result; } impl IdentityUpdateStateTransitionStructureValidationV0 for IdentityUpdateTransition { - fn validate_base_structure_v0( + fn validate_basic_structure_v0( &self, platform_version: &PlatformVersion, ) -> Result { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/mod.rs index 17729bb336..5a58bb5140 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/mod.rs @@ -67,7 +67,7 @@ impl StateTransitionBasicStructureValidationV0 for IdentityUpdateTransition { .identity_update_state_transition .basic_structure { - Some(0) => self.validate_base_structure_v0(platform_version), + Some(0) => self.validate_basic_structure_v0(platform_version), Some(version) => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "identity update transition: validate_basic_structure".to_string(), known_versions: vec![0], diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/mod.rs index b3c2ec8804..bcd04075a3 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/mod.rs @@ -23,7 +23,7 @@ pub mod data_contract_create; pub mod data_contract_update; /// The validation mode we are using -#[derive(Clone, Copy, Debug)] +#[derive(Clone, Copy, Debug, Eq, PartialEq)] pub enum ValidationMode { /// The basic checktx before the state transition is put into mempool CheckTx, @@ -31,6 +31,8 @@ pub enum ValidationMode { RecheckTx, /// The validation of the validator Validator, + /// A validation mode used to get the action with no validation + NoValidation, } impl ValidationMode { @@ -40,6 +42,7 @@ impl ValidationMode { ValidationMode::CheckTx => false, ValidationMode::RecheckTx => false, ValidationMode::Validator => true, + ValidationMode::NoValidation => false, } } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/transformer/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/transformer/mod.rs index 616836d4b4..c02a228d5d 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/transformer/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/transformer/mod.rs @@ -1,10 +1,13 @@ use crate::error::Error; use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; +use crate::execution::validation::state_transition::identity_create::StateTransitionActionTransformerForIdentityCreateTransitionV0; +use crate::execution::validation::state_transition::identity_top_up::StateTransitionIdentityTopUpTransitionActionTransformer; use crate::execution::validation::state_transition::ValidationMode; use crate::platform_types::platform::PlatformRef; use crate::rpc::core::CoreRPCLike; use dpp::block::block_info::BlockInfo; use dpp::prelude::ConsensusValidationResult; +use dpp::serialization::Signable; use dpp::state_transition::StateTransition; use drive::grovedb::TransactionArg; use drive::state_transition_action::StateTransitionAction; @@ -61,13 +64,16 @@ impl StateTransitionActionTransformerV0 for StateTransition { execution_context, tx, ), - StateTransition::IdentityCreate(st) => st.transform_into_action( - platform, - block_info, - validation_mode, - execution_context, - tx, - ), + StateTransition::IdentityCreate(st) => { + let signable_bytes = self.signable_bytes()?; + st.transform_into_action_for_identity_create_transition( + platform, + signable_bytes, + validation_mode, + execution_context, + tx, + ) + } StateTransition::IdentityUpdate(st) => st.transform_into_action( platform, block_info, @@ -75,13 +81,16 @@ impl StateTransitionActionTransformerV0 for StateTransition { execution_context, tx, ), - StateTransition::IdentityTopUp(st) => st.transform_into_action( - platform, - block_info, - validation_mode, - execution_context, - tx, - ), + StateTransition::IdentityTopUp(st) => { + let signable_bytes = self.signable_bytes()?; + st.transform_into_action_for_identity_top_up_transition( + platform, + signable_bytes, + validation_mode, + execution_context, + tx, + ) + } StateTransition::IdentityCreditWithdrawal(st) => st.transform_into_action( platform, block_info, diff --git a/packages/rs-drive-abci/src/platform_types/event_execution_result/mod.rs b/packages/rs-drive-abci/src/platform_types/event_execution_result/mod.rs index 4ade8fa4de..bf821deaba 100644 --- a/packages/rs-drive-abci/src/platform_types/event_execution_result/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/event_execution_result/mod.rs @@ -1,4 +1,4 @@ -use dpp::validation::SimpleConsensusValidationResult; +use dpp::consensus::ConsensusError; use dpp::fee::fee_result::FeeResult; @@ -9,9 +9,11 @@ pub type EstimatedFeeResult = FeeResult; #[derive(Debug, Clone)] pub enum EventExecutionResult { /// Successfully executed a paid event - SuccessfulPaidExecution(EstimatedFeeResult, FeeResult), + SuccessfulPaidExecution(Option, FeeResult), + /// Unsuccessfully executed a paid event + UnsuccessfulPaidExecution(Option, FeeResult, Vec), /// Successfully executed a free event SuccessfulFreeExecution, /// There were consensus errors when trying to execute an event - ConsensusExecutionError(SimpleConsensusValidationResult), + UnpaidConsensusExecutionError(Vec), } diff --git a/packages/rs-drive-abci/src/platform_types/state_transitions_processing_result/mod.rs b/packages/rs-drive-abci/src/platform_types/state_transitions_processing_result/mod.rs index da46dff56c..4c05c32666 100644 --- a/packages/rs-drive-abci/src/platform_types/state_transitions_processing_result/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/state_transitions_processing_result/mod.rs @@ -18,9 +18,9 @@ pub enum StateTransitionExecutionResult { /// proposal. UnpaidConsensusError(ConsensusError), /// State Transition execution failed due to the internal drive-abci error - DriveAbciError(String), + InternalError(String), /// State Transition was successfully executed - SuccessfulExecution(EstimatedFeeResult, FeeResult), + SuccessfulExecution(Option, FeeResult), } /// State Transitions Processing Result produced by [process_raw_state_transitions] and represents @@ -40,7 +40,7 @@ impl StateTransitionsProcessingResult { /// Add a new execution result pub fn add(&mut self, execution_result: StateTransitionExecutionResult) -> Result<(), Error> { match &execution_result { - StateTransitionExecutionResult::DriveAbciError(_) => { + StateTransitionExecutionResult::InternalError(_) => { self.failed_count += 1; } StateTransitionExecutionResult::PaidConsensusError(_, actual_fees) => { diff --git a/packages/rs-drive-abci/src/platform_types/validator_set/v0/mod.rs b/packages/rs-drive-abci/src/platform_types/validator_set/v0/mod.rs index 50b37afdc8..3adf9559b0 100644 --- a/packages/rs-drive-abci/src/platform_types/validator_set/v0/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/validator_set/v0/mod.rs @@ -59,8 +59,7 @@ impl ValidatorSetV0 { return Err(Error::Execution(ExecutionError::CorruptedCachedState( format!( "updating validator set doesn't match quorum hash ours: {} theirs: {}", - self.quorum_hash.to_string(), - rhs.quorum_hash.to_string() + self.quorum_hash, rhs.quorum_hash ), ))); } @@ -93,7 +92,7 @@ impl ValidatorSetV0 { Some(Err(Error::Execution(ExecutionError::CorruptedCachedState( format!( "validator set does not contain all same members, missing {}", - pro_tx_hash.to_string() + pro_tx_hash ), )))) }, diff --git a/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs b/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs index 749e1ce0d0..bb900789d0 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs @@ -6,6 +6,7 @@ use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::document::Document; use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; +use dpp::asset_lock::reduced_asset_lock_value::AssetLockValueGettersV0; use dpp::state_transition::StateTransition; use dpp::version::PlatformVersion; use drive::drive::identity::key::fetch::IdentityKeysRequest; @@ -61,7 +62,7 @@ pub(crate) fn verify_state_transitions_were_or_were_not_executed( let consensus_validation_result = match state_transition.transform_into_action( &platform, abci_app.platform.state.load().last_block_info(), - ValidationMode::CheckTx, //using check_tx so we don't validate state + ValidationMode::NoValidation, //using check_tx so we don't validate state &mut execution_context, None, ) { @@ -469,7 +470,12 @@ pub(crate) fn verify_state_transitions_were_or_were_not_executed( if *was_executed { //while this isn't 100% sure to be true (in the case of debt, // for the tests we have we can use it - assert!(identity_top_up_transition.top_up_balance_amount() <= balance); + assert!( + identity_top_up_transition + .top_up_asset_lock_value() + .remaining_credit_value() + <= balance + ); } } StateTransitionAction::IdentityCreditWithdrawalAction( @@ -650,6 +656,7 @@ pub(crate) fn verify_state_transitions_were_or_were_not_executed( } StateTransitionAction::BumpIdentityNonceAction(_) => {} StateTransitionAction::BumpIdentityDataContractNonceAction(_) => {} + StateTransitionAction::PartiallyUseAssetLockAction(_) => {} } } else { // if we don't have an action this means there was a problem in the validation of the state transition diff --git a/packages/rs-drive/src/drive/asset_lock/add_asset_lock_outpoint_operations/mod.rs b/packages/rs-drive/src/drive/asset_lock/add_asset_lock_outpoint_operations/mod.rs index d99e1cdaf7..02c12d85ea 100644 --- a/packages/rs-drive/src/drive/asset_lock/add_asset_lock_outpoint_operations/mod.rs +++ b/packages/rs-drive/src/drive/asset_lock/add_asset_lock_outpoint_operations/mod.rs @@ -11,6 +11,7 @@ use dpp::platform_value::Bytes36; use dpp::version::PlatformVersion; use grovedb::batch::KeyInfoPath; +use dpp::asset_lock::reduced_asset_lock_value::AssetLockValue; use grovedb::EstimatedLayerInformation; use std::collections::HashMap; @@ -28,6 +29,7 @@ impl Drive { pub fn add_asset_lock_outpoint_operations( &self, outpoint: &Bytes36, + asset_lock_value: AssetLockValue, estimated_costs_only_with_layer_info: &mut Option< HashMap, >, @@ -41,6 +43,7 @@ impl Drive { { 0 => self.add_asset_lock_outpoint_operations_v0( outpoint, + asset_lock_value, estimated_costs_only_with_layer_info, platform_version, ), diff --git a/packages/rs-drive/src/drive/asset_lock/add_asset_lock_outpoint_operations/v0/mod.rs b/packages/rs-drive/src/drive/asset_lock/add_asset_lock_outpoint_operations/v0/mod.rs index 43dbc1f8d8..f6c7957f1f 100644 --- a/packages/rs-drive/src/drive/asset_lock/add_asset_lock_outpoint_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/asset_lock/add_asset_lock_outpoint_operations/v0/mod.rs @@ -7,7 +7,9 @@ use crate::drive::Drive; use crate::error::Error; use crate::fee::op::LowLevelDriveOperation; +use dpp::asset_lock::reduced_asset_lock_value::{AssetLockValue, AssetLockValueGettersV0}; use dpp::platform_value::Bytes36; +use dpp::serialization::PlatformSerializable; use dpp::version::PlatformVersion; use grovedb::batch::KeyInfoPath; use grovedb::Element::Item; @@ -29,6 +31,7 @@ impl Drive { pub(super) fn add_asset_lock_outpoint_operations_v0( &self, outpoint: &Bytes36, + asset_lock_value: AssetLockValue, estimated_costs_only_with_layer_info: &mut Option< HashMap, >, @@ -42,11 +45,19 @@ impl Drive { )?; } + let item_bytes = if asset_lock_value.remaining_credit_value() > 0 { + asset_lock_value.serialize_to_bytes()? + } else { + // If there is no credit value we don't actually put any system credits, + // This is to save space, since the information can be retrieved from the core chain. + vec![] + }; + self.batch_insert( PathFixedSizeKeyRefElement(( asset_lock_storage_path(), outpoint.as_slice(), - Item(vec![], None), + Item(item_bytes, None), )), &mut drive_operations, &platform_version.drive, diff --git a/packages/rs-drive/src/drive/asset_lock/has_asset_lock_outpoint/mod.rs b/packages/rs-drive/src/drive/asset_lock/fetch_asset_lock_outpoint_info/mod.rs similarity index 74% rename from packages/rs-drive/src/drive/asset_lock/has_asset_lock_outpoint/mod.rs rename to packages/rs-drive/src/drive/asset_lock/fetch_asset_lock_outpoint_info/mod.rs index ad7cdbd867..647f983a6e 100644 --- a/packages/rs-drive/src/drive/asset_lock/has_asset_lock_outpoint/mod.rs +++ b/packages/rs-drive/src/drive/asset_lock/fetch_asset_lock_outpoint_info/mod.rs @@ -9,6 +9,7 @@ use crate::fee::op::LowLevelDriveOperation; use dpp::platform_value::Bytes36; use dpp::version::drive_versions::DriveVersion; +use dpp::asset_lock::StoredAssetLockInfo; use grovedb::TransactionArg; impl Drive { @@ -22,16 +23,20 @@ impl Drive { /// # Returns /// /// Returns a `Result` which is `Ok` if the outpoint exists in the transaction or an `Error` otherwise. - pub fn has_asset_lock_outpoint( + pub fn fetch_asset_lock_outpoint_info( &self, outpoint: &Bytes36, transaction: TransactionArg, drive_version: &DriveVersion, - ) -> Result { - match drive_version.methods.asset_lock.has_asset_lock_outpoint { - 0 => self.has_asset_lock_outpoint_v0(outpoint, transaction, drive_version), + ) -> Result { + match drive_version + .methods + .asset_lock + .fetch_asset_lock_outpoint_info + { + 0 => self.fetch_asset_lock_outpoint_info_v0(outpoint, transaction, drive_version), version => Err(Error::Drive(DriveError::UnknownVersionMismatch { - method: "has_asset_lock_outpoint".to_string(), + method: "fetch_asset_lock_outpoint_info".to_string(), known_versions: vec![0], received: version, })), @@ -50,16 +55,20 @@ impl Drive { /// # Returns /// /// Returns a `Result` which is `Ok` if the outpoint exists in the transaction or an `Error` otherwise. - pub(crate) fn has_asset_lock_outpoint_add_operations( + pub(crate) fn fetch_asset_lock_outpoint_info_add_operations( &self, apply: bool, drive_operations: &mut Vec, outpoint: &Bytes36, transaction: TransactionArg, drive_version: &DriveVersion, - ) -> Result { - match drive_version.methods.asset_lock.has_asset_lock_outpoint { - 0 => self.has_asset_lock_outpoint_add_operations_v0( + ) -> Result { + match drive_version + .methods + .asset_lock + .fetch_asset_lock_outpoint_info + { + 0 => self.fetch_asset_lock_outpoint_info_add_operations_v0( apply, drive_operations, outpoint, @@ -67,7 +76,7 @@ impl Drive { drive_version, ), version => Err(Error::Drive(DriveError::UnknownVersionMismatch { - method: "has_asset_lock_outpoint_add_operations".to_string(), + method: "fetch_asset_lock_outpoint_info_add_operations".to_string(), known_versions: vec![0], received: version, })), diff --git a/packages/rs-drive/src/drive/asset_lock/has_asset_lock_outpoint/v0/mod.rs b/packages/rs-drive/src/drive/asset_lock/fetch_asset_lock_outpoint_info/v0/mod.rs similarity index 67% rename from packages/rs-drive/src/drive/asset_lock/has_asset_lock_outpoint/v0/mod.rs rename to packages/rs-drive/src/drive/asset_lock/fetch_asset_lock_outpoint_info/v0/mod.rs index 0257abe529..2a2aaacd73 100644 --- a/packages/rs-drive/src/drive/asset_lock/has_asset_lock_outpoint/v0/mod.rs +++ b/packages/rs-drive/src/drive/asset_lock/fetch_asset_lock_outpoint_info/v0/mod.rs @@ -9,7 +9,10 @@ use crate::error::Error; use crate::fee::op::LowLevelDriveOperation; use dpp::version::drive_versions::DriveVersion; +use dpp::asset_lock::reduced_asset_lock_value::AssetLockValue; +use dpp::asset_lock::StoredAssetLockInfo; use dpp::platform_value::Bytes36; +use dpp::serialization::PlatformDeserializable; use grovedb::TransactionArg; impl Drive { @@ -24,13 +27,13 @@ impl Drive { /// # Returns /// /// Returns a `Result` which is `Ok` if the outpoint exists in the transaction or an `Error` otherwise. - pub(super) fn has_asset_lock_outpoint_v0( + pub(super) fn fetch_asset_lock_outpoint_info_v0( &self, outpoint: &Bytes36, transaction: TransactionArg, drive_version: &DriveVersion, - ) -> Result { - self.has_asset_lock_outpoint_add_operations( + ) -> Result { + self.fetch_asset_lock_outpoint_info_add_operations( true, &mut vec![], outpoint, @@ -52,14 +55,14 @@ impl Drive { /// # Returns /// /// Returns a `Result` which is `Ok` if the outpoint exists in the transaction or an `Error` otherwise. - pub(super) fn has_asset_lock_outpoint_add_operations_v0( + pub(super) fn fetch_asset_lock_outpoint_info_add_operations_v0( &self, apply: bool, drive_operations: &mut Vec, outpoint: &Bytes36, transaction: TransactionArg, drive_version: &DriveVersion, - ) -> Result { + ) -> Result { let asset_lock_storage_path = asset_lock_storage_path(); let query_type = if apply { StatefulDirectQuery @@ -70,13 +73,26 @@ impl Drive { } }; - self.grove_has_raw( - (&asset_lock_storage_path).into(), - outpoint.as_slice(), - query_type, - transaction, - drive_operations, - drive_version, - ) + Ok(self + .grove_get_raw_optional( + (&asset_lock_storage_path).into(), + outpoint.as_slice(), + query_type, + transaction, + drive_operations, + drive_version, + )? + .map(|element| { + let item_bytes = element.as_item_bytes()?; + if item_bytes.is_empty() { + Ok::(StoredAssetLockInfo::FullyConsumed) + } else { + Ok(StoredAssetLockInfo::PartiallyConsumed( + AssetLockValue::deserialize_from_bytes(item_bytes)?, + )) + } + }) + .transpose()? + .unwrap_or(StoredAssetLockInfo::NotPresent)) } } diff --git a/packages/rs-drive/src/drive/asset_lock/mod.rs b/packages/rs-drive/src/drive/asset_lock/mod.rs index 0a27fd9bd4..1ed0a75d87 100644 --- a/packages/rs-drive/src/drive/asset_lock/mod.rs +++ b/packages/rs-drive/src/drive/asset_lock/mod.rs @@ -4,7 +4,7 @@ use crate::drive::RootTree; mod add_asset_lock_outpoint_operations; mod estimation_costs; -mod has_asset_lock_outpoint; +mod fetch_asset_lock_outpoint_info; /// The asset lock root storage path pub(crate) fn asset_lock_storage_path() -> [&'static [u8]; 1] { diff --git a/packages/rs-drive/src/drive/batch/drive_op_batch/system.rs b/packages/rs-drive/src/drive/batch/drive_op_batch/system.rs index c38e36ca06..ef0d61f204 100644 --- a/packages/rs-drive/src/drive/batch/drive_op_batch/system.rs +++ b/packages/rs-drive/src/drive/batch/drive_op_batch/system.rs @@ -6,6 +6,7 @@ use dpp::block::block_info::BlockInfo; use dpp::fee::Credits; use dpp::platform_value::Bytes36; +use dpp::asset_lock::reduced_asset_lock_value::AssetLockValue; use dpp::version::PlatformVersion; use grovedb::batch::KeyInfoPath; use grovedb::{EstimatedLayerInformation, TransactionArg}; @@ -24,10 +25,13 @@ pub enum SystemOperationType { /// The amount of credits we are seeking to remove amount: Credits, }, - /// Adding a used asset lock + /// Adding a used asset lock, if it is only partially used the asset_lock_value + /// will have a non 0 remaining_credit_value AddUsedAssetLock { /// The asset lock outpoint that should be added asset_lock_outpoint: Bytes36, + /// The asset lock value, both initial and remaining + asset_lock_value: AssetLockValue, }, } @@ -59,8 +63,10 @@ impl DriveLowLevelOperationConverter for SystemOperationType { ), SystemOperationType::AddUsedAssetLock { asset_lock_outpoint, + asset_lock_value, } => drive.add_asset_lock_outpoint_operations( &asset_lock_outpoint, + asset_lock_value, estimated_costs_only_with_layer_info, platform_version, ), diff --git a/packages/rs-drive/src/drive/batch/transitions/identity/identity_create_transition.rs b/packages/rs-drive/src/drive/batch/transitions/identity/identity_create_transition.rs index 47c315ec2f..0cfa8d7a81 100644 --- a/packages/rs-drive/src/drive/batch/transitions/identity/identity_create_transition.rs +++ b/packages/rs-drive/src/drive/batch/transitions/identity/identity_create_transition.rs @@ -1,6 +1,7 @@ use crate::drive::batch::transitions::DriveHighLevelOperationConverter; use crate::drive::batch::DriveOperation::{IdentityOperation, SystemOperation}; use crate::drive::batch::{DriveOperation, IdentityOperationType, SystemOperationType}; +use dpp::asset_lock::reduced_asset_lock_value::{AssetLockValueGettersV0, AssetLockValueSettersV0}; use crate::error::Error; use crate::state_transition_action::identity::identity_create::{ @@ -16,10 +17,17 @@ impl DriveHighLevelOperationConverter for IdentityCreateTransitionAction { _epoch: &Epoch, platform_version: &PlatformVersion, ) -> Result>, Error> { - let initial_balance_amount = self.initial_balance_amount(); let asset_lock_outpoint = self.asset_lock_outpoint(); - let identity = - Identity::try_from_identity_create_transition_action(self, platform_version)?; + + let (identity, mut asset_lock_value) = + Identity::try_from_identity_create_transition_action_returning_asset_lock_value( + self, + platform_version, + )?; + + let initial_balance = asset_lock_value.remaining_credit_value(); + + asset_lock_value.set_remaining_credit_value(0); // We are using the entire value let drive_operations = vec![ IdentityOperation(IdentityOperationType::AddNewIdentity { @@ -27,10 +35,11 @@ impl DriveHighLevelOperationConverter for IdentityCreateTransitionAction { is_masternode_identity: false, }), SystemOperation(SystemOperationType::AddToSystemCredits { - amount: initial_balance_amount, + amount: initial_balance, }), SystemOperation(SystemOperationType::AddUsedAssetLock { asset_lock_outpoint, + asset_lock_value, }), ]; Ok(drive_operations) diff --git a/packages/rs-drive/src/drive/batch/transitions/identity/identity_top_up_transition.rs b/packages/rs-drive/src/drive/batch/transitions/identity/identity_top_up_transition.rs index 7142661f46..0c5bfc8091 100644 --- a/packages/rs-drive/src/drive/batch/transitions/identity/identity_top_up_transition.rs +++ b/packages/rs-drive/src/drive/batch/transitions/identity/identity_top_up_transition.rs @@ -1,6 +1,7 @@ use crate::drive::batch::transitions::DriveHighLevelOperationConverter; use crate::drive::batch::DriveOperation::{IdentityOperation, SystemOperation}; use crate::drive::batch::{DriveOperation, IdentityOperationType, SystemOperationType}; +use dpp::asset_lock::reduced_asset_lock_value::{AssetLockValueGettersV0, AssetLockValueSettersV0}; use crate::error::Error; use crate::state_transition_action::identity::identity_topup::IdentityTopUpTransitionAction; @@ -13,20 +14,26 @@ impl DriveHighLevelOperationConverter for IdentityTopUpTransitionAction { _epoch: &Epoch, _platform_version: &PlatformVersion, ) -> Result>, Error> { - let top_up_balance_amount = self.top_up_balance_amount(); let identity_id = self.identity_id(); let asset_lock_outpoint = self.asset_lock_outpoint(); + let mut asset_lock_value = self.top_up_asset_lock_value_consume(); + + let added_balance = asset_lock_value.remaining_credit_value(); + + asset_lock_value.set_remaining_credit_value(0); + let drive_operations = vec![ IdentityOperation(IdentityOperationType::AddToIdentityBalance { identity_id: identity_id.to_buffer(), - added_balance: top_up_balance_amount, + added_balance, }), SystemOperation(SystemOperationType::AddToSystemCredits { - amount: top_up_balance_amount, + amount: added_balance, }), SystemOperation(SystemOperationType::AddUsedAssetLock { asset_lock_outpoint, + asset_lock_value, }), ]; Ok(drive_operations) diff --git a/packages/rs-drive/src/drive/batch/transitions/mod.rs b/packages/rs-drive/src/drive/batch/transitions/mod.rs index d5a8dade2b..c1f4228c98 100644 --- a/packages/rs-drive/src/drive/batch/transitions/mod.rs +++ b/packages/rs-drive/src/drive/batch/transitions/mod.rs @@ -67,6 +67,10 @@ impl DriveHighLevelOperationConverter for StateTransitionAction { bump_identity_data_contract_nonce_transition, ) => bump_identity_data_contract_nonce_transition .into_high_level_drive_operations(epoch, platform_version), + StateTransitionAction::PartiallyUseAssetLockAction( + partially_used_asset_lock_action, + ) => partially_used_asset_lock_action + .into_high_level_drive_operations(epoch, platform_version), } } } diff --git a/packages/rs-drive/src/drive/batch/transitions/system/mod.rs b/packages/rs-drive/src/drive/batch/transitions/system/mod.rs index 3c4bca029a..57160f7639 100644 --- a/packages/rs-drive/src/drive/batch/transitions/system/mod.rs +++ b/packages/rs-drive/src/drive/batch/transitions/system/mod.rs @@ -1,2 +1,3 @@ mod bump_identity_data_contract_nonce; mod bump_identity_nonce; +mod partially_use_asset_lock; diff --git a/packages/rs-drive/src/drive/batch/transitions/system/partially_use_asset_lock.rs b/packages/rs-drive/src/drive/batch/transitions/system/partially_use_asset_lock.rs new file mode 100644 index 0000000000..1e095610c2 --- /dev/null +++ b/packages/rs-drive/src/drive/batch/transitions/system/partially_use_asset_lock.rs @@ -0,0 +1,42 @@ +use crate::drive::batch::transitions::DriveHighLevelOperationConverter; +use crate::drive::batch::DriveOperation::SystemOperation; +use crate::drive::batch::{DriveOperation, SystemOperationType}; +use crate::error::Error; +use crate::state_transition_action::system::partially_use_asset_lock_action::{ + PartiallyUseAssetLockAction, PartiallyUseAssetLockActionAccessorsV0, +}; +use dpp::asset_lock::reduced_asset_lock_value::AssetLockValue; +use dpp::block::epoch::Epoch; +use dpp::version::PlatformVersion; + +impl DriveHighLevelOperationConverter for PartiallyUseAssetLockAction { + fn into_high_level_drive_operations<'b>( + self, + _epoch: &Epoch, + platform_version: &PlatformVersion, + ) -> Result>, Error> { + let initial_credit_value = self.initial_credit_value(); + // The remaining credit value is already computed here + let remaining_credit_value = self.remaining_credit_value(); + let used_credits = self.used_credits(); + let asset_lock_outpoint = self.asset_lock_outpoint(); + + let tx_out_script = self.asset_lock_script_owned(); + + let drive_operations = vec![ + SystemOperation(SystemOperationType::AddToSystemCredits { + amount: used_credits, + }), + SystemOperation(SystemOperationType::AddUsedAssetLock { + asset_lock_outpoint, + asset_lock_value: AssetLockValue::new( + initial_credit_value, + tx_out_script, + remaining_credit_value, + platform_version, + )?, + }), + ]; + Ok(drive_operations) + } +} diff --git a/packages/rs-drive/src/drive/identity/update/methods/apply_balance_change_from_fee_to_identity/v0/mod.rs b/packages/rs-drive/src/drive/identity/update/methods/apply_balance_change_from_fee_to_identity/v0/mod.rs index 0b93587c32..8d91ba441e 100644 --- a/packages/rs-drive/src/drive/identity/update/methods/apply_balance_change_from_fee_to_identity/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/update/methods/apply_balance_change_from_fee_to_identity/v0/mod.rs @@ -57,8 +57,6 @@ impl Drive { ) -> Result<(Vec, FeeResult), Error> { let mut drive_operations = vec![]; - let _drive_version = &platform_version.drive; - if matches!(balance_change.change(), BalanceChange::NoBalanceChange) { return Ok((drive_operations, balance_change.into_fee_result())); } diff --git a/packages/rs-drive/src/drive/mod.rs b/packages/rs-drive/src/drive/mod.rs index 307b295716..e8d7fe3065 100644 --- a/packages/rs-drive/src/drive/mod.rs +++ b/packages/rs-drive/src/drive/mod.rs @@ -117,13 +117,13 @@ pub struct Drive { // is at the top of the tree in order to reduce proof size // the most import tree is theDataContract Documents tree -// DataContract_Documents 64 -// / \ -// Identities 32 Balances 96 -// / \ / \ -// Token_Balances 16 Pools 48 WithdrawalTransactions 80 Misc 112 -// / \ / \ -// NUPKH->I 8 UPKH->I 24 SpentAssetLockTransactions 72 Versions 120 +// DataContract_Documents 64 +// / \ +// Identities 32 Balances 96 +// / \ / \ +// Token_Balances 16 Pools 48 WithdrawalTransactions 80 Misc 112 +// / \ / \ +// NUPKH->I 8 UPKH->I 24 SpentAssetLockTransactions 72 Versions 120 /// Keys for the root tree. #[cfg(any(feature = "full", feature = "verify"))] diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_create/mod.rs b/packages/rs-drive/src/state_transition_action/identity/identity_create/mod.rs index c2c978ca99..dbc8104d5c 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_create/mod.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_create/mod.rs @@ -7,6 +7,7 @@ use crate::state_transition_action::identity::identity_create::v0::{ IdentityCreateTransitionActionV0, IdentityFromIdentityCreateTransitionActionV0, }; use derive_more::From; +use dpp::asset_lock::reduced_asset_lock_value::AssetLockValue; use dpp::identity::{Identity, IdentityPublicKey, PartialIdentity}; use dpp::platform_value::{Bytes36, Identifier}; use dpp::prelude::UserFeeIncrease; @@ -29,10 +30,23 @@ impl IdentityCreateTransitionAction { } } - /// Initial Balance Amount - pub fn initial_balance_amount(&self) -> u64 { + /// Asset lock value to be consumed + /// The initial balance is equal to the remaining credit value in the asset lock value + pub fn asset_lock_value_to_be_consumed(&self) -> &AssetLockValue { match self { - IdentityCreateTransitionAction::V0(transition) => transition.initial_balance_amount, + IdentityCreateTransitionAction::V0(transition) => { + &transition.asset_lock_value_to_be_consumed + } + } + } + + /// Asset lock value to be consumed + /// The initial balance is equal to the remaining credit value in the asset lock value + pub fn asset_lock_value_to_be_consumed_owned(self) -> AssetLockValue { + match self { + IdentityCreateTransitionAction::V0(transition) => { + transition.asset_lock_value_to_be_consumed + } } } @@ -77,10 +91,10 @@ impl From<&IdentityCreateTransitionAction> for PartialIdentity { /// action pub trait IdentityFromIdentityCreateTransitionAction { /// try from - fn try_from_identity_create_transition_action( + fn try_from_identity_create_transition_action_returning_asset_lock_value( value: IdentityCreateTransitionAction, platform_version: &PlatformVersion, - ) -> Result + ) -> Result<(Self, AssetLockValue), ProtocolError> where Self: Sized; /// try from borrowed @@ -93,13 +107,16 @@ pub trait IdentityFromIdentityCreateTransitionAction { } impl IdentityFromIdentityCreateTransitionAction for Identity { - fn try_from_identity_create_transition_action( + fn try_from_identity_create_transition_action_returning_asset_lock_value( value: IdentityCreateTransitionAction, platform_version: &PlatformVersion, - ) -> Result { + ) -> Result<(Self, AssetLockValue), ProtocolError> { match value { IdentityCreateTransitionAction::V0(v0) => { - Identity::try_from_identity_create_transition_action_v0(v0, platform_version) + Identity::try_from_identity_create_transition_action_returning_asset_lock_value_v0( + v0, + platform_version, + ) } } } diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_create/transformer.rs b/packages/rs-drive/src/state_transition_action/identity/identity_create/transformer.rs index 5ba3476ebb..a9704a1b9d 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_create/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_create/transformer.rs @@ -1,32 +1,37 @@ use crate::state_transition_action::identity::identity_create::v0::IdentityCreateTransitionActionV0; use crate::state_transition_action::identity::identity_create::IdentityCreateTransitionAction; +use dpp::asset_lock::reduced_asset_lock_value::AssetLockValue; use dpp::consensus::ConsensusError; -use dpp::fee::Credits; use dpp::state_transition::identity_create_transition::IdentityCreateTransition; impl IdentityCreateTransitionAction { /// try from pub fn try_from( value: IdentityCreateTransition, - initial_balance_amount: Credits, + asset_lock_value_to_be_consumed: AssetLockValue, ) -> Result { match value { - IdentityCreateTransition::V0(v0) => { - Ok(IdentityCreateTransitionActionV0::try_from(v0, initial_balance_amount)?.into()) - } + IdentityCreateTransition::V0(v0) => Ok(IdentityCreateTransitionActionV0::try_from( + v0, + asset_lock_value_to_be_consumed, + )? + .into()), } } /// try from borrowed pub fn try_from_borrowed( value: &IdentityCreateTransition, - initial_balance_amount: Credits, + asset_lock_value_to_be_consumed: AssetLockValue, ) -> Result { match value { - IdentityCreateTransition::V0(v0) => Ok( - IdentityCreateTransitionActionV0::try_from_borrowed(v0, initial_balance_amount)? - .into(), - ), + IdentityCreateTransition::V0(v0) => { + Ok(IdentityCreateTransitionActionV0::try_from_borrowed( + v0, + asset_lock_value_to_be_consumed, + )? + .into()) + } } } } diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_create/v0/mod.rs b/packages/rs-drive/src/state_transition_action/identity/identity_create/v0/mod.rs index 4abd643ff9..e8b36edda5 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_create/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_create/v0/mod.rs @@ -4,22 +4,21 @@ pub mod transformer; use dpp::identifier::Identifier; use dpp::identity::{IdentityPublicKey, IdentityV0, PartialIdentity}; +use dpp::asset_lock::reduced_asset_lock_value::{AssetLockValue, AssetLockValueGettersV0}; use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; use dpp::identity::Identity; use dpp::platform_value::Bytes36; use dpp::prelude::UserFeeIncrease; use dpp::version::PlatformVersion; use dpp::ProtocolError; -use serde::{Deserialize, Serialize}; /// action v0 -#[derive(Default, Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] +#[derive(Debug, Clone)] pub struct IdentityCreateTransitionActionV0 { /// public keys pub public_keys: Vec, - /// initial balance amount - pub initial_balance_amount: u64, + /// the initial balance amount is equal to the remaining asset lock value + pub asset_lock_value_to_be_consumed: AssetLockValue, /// identity id pub identity_id: Identifier, /// asset lock outpoint @@ -31,14 +30,14 @@ pub struct IdentityCreateTransitionActionV0 { impl From for PartialIdentity { fn from(value: IdentityCreateTransitionActionV0) -> Self { let IdentityCreateTransitionActionV0 { - initial_balance_amount, + asset_lock_value_to_be_consumed, identity_id, .. } = value; PartialIdentity { id: identity_id, loaded_public_keys: Default::default(), //no need to load public keys - balance: Some(initial_balance_amount), + balance: Some(asset_lock_value_to_be_consumed.remaining_credit_value()), revision: None, not_found_public_keys: Default::default(), @@ -49,14 +48,14 @@ impl From for PartialIdentity { impl From<&IdentityCreateTransitionActionV0> for PartialIdentity { fn from(value: &IdentityCreateTransitionActionV0) -> Self { let IdentityCreateTransitionActionV0 { - initial_balance_amount, + asset_lock_value_to_be_consumed, identity_id, .. } = value; PartialIdentity { id: *identity_id, loaded_public_keys: Default::default(), //no need to load public keys - balance: Some(*initial_balance_amount), + balance: Some(asset_lock_value_to_be_consumed.remaining_credit_value()), revision: None, not_found_public_keys: Default::default(), @@ -67,10 +66,10 @@ impl From<&IdentityCreateTransitionActionV0> for PartialIdentity { /// action v0 pub trait IdentityFromIdentityCreateTransitionActionV0 { /// try from - fn try_from_identity_create_transition_action_v0( + fn try_from_identity_create_transition_action_returning_asset_lock_value_v0( value: IdentityCreateTransitionActionV0, platform_version: &PlatformVersion, - ) -> Result + ) -> Result<(Self, AssetLockValue), ProtocolError> where Self: Sized; /// try from borrowed @@ -83,12 +82,12 @@ pub trait IdentityFromIdentityCreateTransitionActionV0 { } impl IdentityFromIdentityCreateTransitionActionV0 for Identity { - fn try_from_identity_create_transition_action_v0( + fn try_from_identity_create_transition_action_returning_asset_lock_value_v0( value: IdentityCreateTransitionActionV0, platform_version: &PlatformVersion, - ) -> Result { + ) -> Result<(Self, AssetLockValue), ProtocolError> { let IdentityCreateTransitionActionV0 { - initial_balance_amount, + asset_lock_value_to_be_consumed, identity_id, public_keys, .. @@ -98,13 +97,16 @@ impl IdentityFromIdentityCreateTransitionActionV0 for Identity { .identity_versions .identity_structure_version { - 0 => Ok(IdentityV0 { - id: identity_id, - public_keys: public_keys.into_iter().map(|key| (key.id(), key)).collect(), - balance: initial_balance_amount, - revision: 0, - } - .into()), + 0 => Ok(( + IdentityV0 { + id: identity_id, + public_keys: public_keys.into_iter().map(|key| (key.id(), key)).collect(), + balance: asset_lock_value_to_be_consumed.remaining_credit_value(), + revision: 0, + } + .into(), + asset_lock_value_to_be_consumed, + )), version => Err(ProtocolError::UnknownVersionMismatch { method: "Identity::try_from_identity_create_transition_action_v0".to_string(), known_versions: vec![0], @@ -117,7 +119,7 @@ impl IdentityFromIdentityCreateTransitionActionV0 for Identity { platform_version: &PlatformVersion, ) -> Result { let IdentityCreateTransitionActionV0 { - initial_balance_amount, + asset_lock_value_to_be_consumed, identity_id, public_keys, .. @@ -133,7 +135,7 @@ impl IdentityFromIdentityCreateTransitionActionV0 for Identity { .iter() .map(|key| (key.id(), key.clone())) .collect(), - balance: *initial_balance_amount, + balance: asset_lock_value_to_be_consumed.remaining_credit_value(), revision: 0, } .into()), diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_create/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/identity/identity_create/v0/transformer.rs index 5a7880a477..e103af7fde 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_create/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_create/v0/transformer.rs @@ -1,10 +1,8 @@ use crate::state_transition_action::identity::identity_create::v0::IdentityCreateTransitionActionV0; -use dpp::consensus::basic::decode::SerializedObjectParsingError; +use dpp::asset_lock::reduced_asset_lock_value::AssetLockValue; use dpp::consensus::basic::identity::IdentityAssetLockTransactionOutputNotFoundError; use dpp::consensus::ConsensusError; -use dpp::fee::Credits; use dpp::platform_value::Bytes36; -use std::io; use dpp::state_transition::state_transitions::identity::identity_create_transition::v0::IdentityCreateTransitionV0; @@ -12,12 +10,13 @@ impl IdentityCreateTransitionActionV0 { /// try from pub fn try_from( value: IdentityCreateTransitionV0, - initial_balance_amount: Credits, + asset_lock_value_to_be_consumed: AssetLockValue, ) -> Result { let IdentityCreateTransitionV0 { public_keys, identity_id, asset_lock_proof, + user_fee_increase, .. } = value; @@ -27,47 +26,41 @@ impl IdentityCreateTransitionActionV0 { ) })?; - let outpoint_bytes = asset_lock_outpoint - .try_into() - .map_err(|e: io::Error| SerializedObjectParsingError::new(e.to_string()))?; - Ok(IdentityCreateTransitionActionV0 { public_keys: public_keys.into_iter().map(|a| a.into()).collect(), - initial_balance_amount, + asset_lock_value_to_be_consumed, identity_id, - asset_lock_outpoint: Bytes36::new(outpoint_bytes), - user_fee_increase: value.user_fee_increase, + asset_lock_outpoint: Bytes36::new(asset_lock_outpoint.into()), + user_fee_increase, }) } /// try from borrowed pub fn try_from_borrowed( value: &IdentityCreateTransitionV0, - initial_balance_amount: Credits, + asset_lock_value_to_be_consumed: AssetLockValue, ) -> Result { let IdentityCreateTransitionV0 { public_keys, identity_id, asset_lock_proof, + user_fee_increase, .. } = value; + // This should already be checked in validate basic let asset_lock_outpoint = asset_lock_proof.out_point().ok_or_else(|| { IdentityAssetLockTransactionOutputNotFoundError::new( asset_lock_proof.output_index() as usize ) })?; - let outpoint_bytes = asset_lock_outpoint - .try_into() - .map_err(|e: io::Error| SerializedObjectParsingError::new(e.to_string()))?; - Ok(IdentityCreateTransitionActionV0 { public_keys: public_keys.iter().map(|key| key.into()).collect(), - initial_balance_amount, + asset_lock_value_to_be_consumed, identity_id: *identity_id, - asset_lock_outpoint: Bytes36::new(outpoint_bytes), - user_fee_increase: value.user_fee_increase, + asset_lock_outpoint: Bytes36::new(asset_lock_outpoint.into()), + user_fee_increase: *user_fee_increase, }) } } diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_topup/mod.rs b/packages/rs-drive/src/state_transition_action/identity/identity_topup/mod.rs index b9900811c4..09185aae5a 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_topup/mod.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_topup/mod.rs @@ -5,6 +5,7 @@ pub mod v0; use crate::state_transition_action::identity::identity_topup::v0::IdentityTopUpTransitionActionV0; use derive_more::From; +use dpp::asset_lock::reduced_asset_lock_value::AssetLockValue; use dpp::platform_value::{Bytes36, Identifier}; use dpp::prelude::UserFeeIncrease; @@ -18,9 +19,16 @@ pub enum IdentityTopUpTransitionAction { impl IdentityTopUpTransitionAction { /// The balance being topped up - pub fn top_up_balance_amount(&self) -> u64 { + pub fn top_up_asset_lock_value(&self) -> &AssetLockValue { match self { - IdentityTopUpTransitionAction::V0(transition) => transition.top_up_balance_amount, + IdentityTopUpTransitionAction::V0(transition) => &transition.top_up_asset_lock_value, + } + } + + /// The balance being topped up + pub fn top_up_asset_lock_value_consume(self) -> AssetLockValue { + match self { + IdentityTopUpTransitionAction::V0(transition) => transition.top_up_asset_lock_value, } } diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_topup/transformer.rs b/packages/rs-drive/src/state_transition_action/identity/identity_topup/transformer.rs index 71195bda6f..9237137e0a 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_topup/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_topup/transformer.rs @@ -1,18 +1,18 @@ use crate::state_transition_action::identity::identity_topup::v0::IdentityTopUpTransitionActionV0; use crate::state_transition_action::identity::identity_topup::IdentityTopUpTransitionAction; +use dpp::asset_lock::reduced_asset_lock_value::AssetLockValue; use dpp::consensus::ConsensusError; -use dpp::fee::Credits; use dpp::state_transition::identity_topup_transition::IdentityTopUpTransition; impl IdentityTopUpTransitionAction { /// try from pub fn try_from( value: IdentityTopUpTransition, - top_up_balance_amount: Credits, + top_up_asset_lock_value: AssetLockValue, ) -> Result { match value { IdentityTopUpTransition::V0(v0) => { - Ok(IdentityTopUpTransitionActionV0::try_from(v0, top_up_balance_amount)?.into()) + Ok(IdentityTopUpTransitionActionV0::try_from(v0, top_up_asset_lock_value)?.into()) } } } @@ -20,11 +20,11 @@ impl IdentityTopUpTransitionAction { /// try from borrowed pub fn try_from_borrowed( value: &IdentityTopUpTransition, - top_up_balance_amount: Credits, + top_up_asset_lock_value: AssetLockValue, ) -> Result { match value { IdentityTopUpTransition::V0(v0) => Ok( - IdentityTopUpTransitionActionV0::try_from_borrowed(v0, top_up_balance_amount)? + IdentityTopUpTransitionActionV0::try_from_borrowed(v0, top_up_asset_lock_value)? .into(), ), } diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_topup/v0/mod.rs b/packages/rs-drive/src/state_transition_action/identity/identity_topup/v0/mod.rs index 98d6b5ad7d..1d30375c0f 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_topup/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_topup/v0/mod.rs @@ -2,16 +2,15 @@ mod transformer; use dpp::identifier::Identifier; +use dpp::asset_lock::reduced_asset_lock_value::AssetLockValue; use dpp::platform_value::Bytes36; use dpp::prelude::UserFeeIncrease; -use serde::{Deserialize, Serialize}; /// action v0 -#[derive(Default, Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] +#[derive(Debug, Clone)] pub struct IdentityTopUpTransitionActionV0 { - /// top up balance amount - pub top_up_balance_amount: u64, + /// we top up the remaining amount of the asset lock value + pub top_up_asset_lock_value: AssetLockValue, /// identity id pub identity_id: Identifier, /// asset lock outpoint diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_topup/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/identity/identity_topup/v0/transformer.rs index 75516f4fd6..64a034586f 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_topup/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_topup/v0/transformer.rs @@ -1,18 +1,16 @@ use crate::state_transition_action::identity::identity_topup::v0::IdentityTopUpTransitionActionV0; -use dpp::consensus::basic::decode::SerializedObjectParsingError; use dpp::consensus::basic::identity::IdentityAssetLockTransactionOutputNotFoundError; +use dpp::asset_lock::reduced_asset_lock_value::AssetLockValue; use dpp::consensus::ConsensusError; -use dpp::fee::Credits; use dpp::platform_value::Bytes36; use dpp::state_transition::state_transitions::identity::identity_topup_transition::v0::IdentityTopUpTransitionV0; -use std::io; impl IdentityTopUpTransitionActionV0 { /// try from pub fn try_from( value: IdentityTopUpTransitionV0, - top_up_balance_amount: Credits, + top_up_asset_lock_value: AssetLockValue, ) -> Result { let IdentityTopUpTransitionV0 { identity_id, @@ -27,14 +25,10 @@ impl IdentityTopUpTransitionActionV0 { ) })?; - let outpoint_bytes = asset_lock_outpoint - .try_into() - .map_err(|e: io::Error| SerializedObjectParsingError::new(e.to_string()))?; - Ok(IdentityTopUpTransitionActionV0 { - top_up_balance_amount, + top_up_asset_lock_value, identity_id, - asset_lock_outpoint: Bytes36::new(outpoint_bytes), + asset_lock_outpoint: Bytes36::new(asset_lock_outpoint.into()), user_fee_increase, }) } @@ -42,7 +36,7 @@ impl IdentityTopUpTransitionActionV0 { /// try from borrowed pub fn try_from_borrowed( value: &IdentityTopUpTransitionV0, - top_up_balance_amount: Credits, + top_up_asset_lock_value: AssetLockValue, ) -> Result { let IdentityTopUpTransitionV0 { identity_id, @@ -57,14 +51,10 @@ impl IdentityTopUpTransitionActionV0 { ) })?; - let outpoint_bytes = asset_lock_outpoint - .try_into() - .map_err(|e: io::Error| SerializedObjectParsingError::new(e.to_string()))?; - Ok(IdentityTopUpTransitionActionV0 { - top_up_balance_amount, + top_up_asset_lock_value, identity_id: *identity_id, - asset_lock_outpoint: Bytes36::new(outpoint_bytes), + asset_lock_outpoint: Bytes36::new(asset_lock_outpoint.into()), user_fee_increase: *user_fee_increase, }) } diff --git a/packages/rs-drive/src/state_transition_action/mod.rs b/packages/rs-drive/src/state_transition_action/mod.rs index f3f90a1c6a..585a51c603 100644 --- a/packages/rs-drive/src/state_transition_action/mod.rs +++ b/packages/rs-drive/src/state_transition_action/mod.rs @@ -22,6 +22,9 @@ use crate::state_transition_action::system::bump_identity_data_contract_nonce_ac use crate::state_transition_action::system::bump_identity_nonce_action::{ BumpIdentityNonceAction, BumpIdentityNonceActionAccessorsV0, }; +use crate::state_transition_action::system::partially_use_asset_lock_action::{ + PartiallyUseAssetLockAction, PartiallyUseAssetLockActionAccessorsV0, +}; use derive_more::From; use dpp::prelude::UserFeeIncrease; @@ -52,6 +55,9 @@ pub enum StateTransitionAction { /// this can only come in this form from the document contract update state transition /// it will also only happen if the state validation fails BumpIdentityDataContractNonceAction(BumpIdentityDataContractNonceAction), + /// partially use the asset lock for funding invalid asset lock transactions like + /// identity top up and identity create + PartiallyUseAssetLockAction(PartiallyUseAssetLockAction), } impl StateTransitionAction { @@ -74,6 +80,9 @@ impl StateTransitionAction { StateTransitionAction::BumpIdentityDataContractNonceAction(action) => { action.user_fee_increase() } + StateTransitionAction::PartiallyUseAssetLockAction(action) => { + action.user_fee_increase() + } } } } diff --git a/packages/rs-drive/src/state_transition_action/system/mod.rs b/packages/rs-drive/src/state_transition_action/system/mod.rs index dfd99aff2e..38dededd71 100644 --- a/packages/rs-drive/src/state_transition_action/system/mod.rs +++ b/packages/rs-drive/src/state_transition_action/system/mod.rs @@ -3,3 +3,6 @@ pub mod bump_identity_data_contract_nonce_action; /// bump identity nonce action pub mod bump_identity_nonce_action; + +/// Partially use an asset lock +pub mod partially_use_asset_lock_action; diff --git a/packages/rs-drive/src/state_transition_action/system/partially_use_asset_lock_action/mod.rs b/packages/rs-drive/src/state_transition_action/system/partially_use_asset_lock_action/mod.rs new file mode 100644 index 0000000000..539aa0b187 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/system/partially_use_asset_lock_action/mod.rs @@ -0,0 +1,61 @@ +use crate::state_transition_action::system::partially_use_asset_lock_action::v0::PartiallyUseAssetLockActionV0; +use derive_more::From; +use dpp::fee::Credits; +use dpp::platform_value::Bytes36; +use dpp::prelude::UserFeeIncrease; + +mod transformer; +mod v0; + +pub use v0::PartiallyUseAssetLockActionAccessorsV0; + +#[derive(Debug, Clone, From)] +/// An action expressing that an asset lock should be partially used +pub enum PartiallyUseAssetLockAction { + /// v0 + V0(PartiallyUseAssetLockActionV0), +} + +impl PartiallyUseAssetLockActionAccessorsV0 for PartiallyUseAssetLockAction { + fn asset_lock_outpoint(&self) -> Bytes36 { + match self { + PartiallyUseAssetLockAction::V0(transition) => transition.asset_lock_outpoint, + } + } + + fn initial_credit_value(&self) -> Credits { + match self { + PartiallyUseAssetLockAction::V0(transition) => transition.initial_credit_value, + } + } + + fn asset_lock_script(&self) -> &Vec { + match self { + PartiallyUseAssetLockAction::V0(transition) => &transition.asset_lock_script, + } + } + + fn asset_lock_script_owned(self) -> Vec { + match self { + PartiallyUseAssetLockAction::V0(transition) => transition.asset_lock_script, + } + } + + fn remaining_credit_value(&self) -> Credits { + match self { + PartiallyUseAssetLockAction::V0(transition) => transition.remaining_credit_value, + } + } + + fn used_credits(&self) -> Credits { + match self { + PartiallyUseAssetLockAction::V0(transition) => transition.used_credits, + } + } + + fn user_fee_increase(&self) -> UserFeeIncrease { + match self { + PartiallyUseAssetLockAction::V0(transition) => transition.user_fee_increase, + } + } +} diff --git a/packages/rs-drive/src/state_transition_action/system/partially_use_asset_lock_action/transformer.rs b/packages/rs-drive/src/state_transition_action/system/partially_use_asset_lock_action/transformer.rs new file mode 100644 index 0000000000..89848e8ccd --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/system/partially_use_asset_lock_action/transformer.rs @@ -0,0 +1,162 @@ +use crate::state_transition_action::identity::identity_create::IdentityCreateTransitionAction; +use crate::state_transition_action::identity::identity_topup::IdentityTopUpTransitionAction; +use crate::state_transition_action::system::partially_use_asset_lock_action::v0::PartiallyUseAssetLockActionV0; +use crate::state_transition_action::system::partially_use_asset_lock_action::PartiallyUseAssetLockAction; +use dpp::consensus::ConsensusError; +use dpp::fee::Credits; +use dpp::state_transition::identity_create_transition::IdentityCreateTransition; +use dpp::state_transition::identity_topup_transition::IdentityTopUpTransition; + +impl PartiallyUseAssetLockAction { + /// try from identity create transition + pub fn try_from_identity_create_transition( + value: IdentityCreateTransition, + asset_lock_initial_balance_amount: Credits, + asset_lock_output_script: Vec, + asset_lock_remaining_balance_amount: Credits, + used_credits: Credits, + ) -> Result { + match value { + IdentityCreateTransition::V0(v0) => Ok( + PartiallyUseAssetLockActionV0::try_from_identity_create_transition( + v0, + asset_lock_initial_balance_amount, + asset_lock_output_script, + asset_lock_remaining_balance_amount, + used_credits, + )? + .into(), + ), + } + } + + /// try from borrowed identity create transition + pub fn try_from_borrowed_identity_create_transition( + value: &IdentityCreateTransition, + asset_lock_initial_balance_amount: Credits, + asset_lock_output_script: Vec, + asset_lock_remaining_balance_amount: Credits, + used_credits: Credits, + ) -> Result { + match value { + IdentityCreateTransition::V0(v0) => Ok( + PartiallyUseAssetLockActionV0::try_from_borrowed_identity_create_transition( + v0, + asset_lock_initial_balance_amount, + asset_lock_output_script, + asset_lock_remaining_balance_amount, + used_credits, + )? + .into(), + ), + } + } + + /// from identity create transition action + pub fn from_identity_create_transition_action( + value: IdentityCreateTransitionAction, + used_credits: Credits, + ) -> Self { + match value { + IdentityCreateTransitionAction::V0(v0) => { + PartiallyUseAssetLockActionV0::from_identity_create_transition_action( + v0, + used_credits, + ) + .into() + } + } + } + + /// from borrowed identity create transition action + pub fn from_borrowed_identity_create_transition_action( + value: &IdentityCreateTransitionAction, + used_credits: Credits, + ) -> Self { + match value { + IdentityCreateTransitionAction::V0(v0) => { + PartiallyUseAssetLockActionV0::from_borrowed_identity_create_transition_action( + v0, + used_credits, + ) + .into() + } + } + } + + /// try from identity top up transition + pub fn try_from_identity_top_up_transition( + value: IdentityTopUpTransition, + asset_lock_initial_balance_amount: Credits, + asset_lock_output_script: Vec, + asset_lock_remaining_balance_amount: Credits, + used_credits: Credits, + ) -> Result { + match value { + IdentityTopUpTransition::V0(v0) => Ok( + PartiallyUseAssetLockActionV0::try_from_identity_top_up_transition( + v0, + asset_lock_initial_balance_amount, + asset_lock_output_script, + asset_lock_remaining_balance_amount, + used_credits, + )? + .into(), + ), + } + } + + /// try from borrowed identity top up transition + pub fn try_from_borrowed_identity_top_up_transition( + value: &IdentityTopUpTransition, + asset_lock_initial_balance_amount: Credits, + asset_lock_output_script: Vec, + asset_lock_remaining_balance_amount: Credits, + used_credits: Credits, + ) -> Result { + match value { + IdentityTopUpTransition::V0(v0) => Ok( + PartiallyUseAssetLockActionV0::try_from_borrowed_identity_top_up_transition( + v0, + asset_lock_initial_balance_amount, + asset_lock_output_script, + asset_lock_remaining_balance_amount, + used_credits, + )? + .into(), + ), + } + } + + /// from identity top up transition action + pub fn from_identity_top_up_transition_action( + value: IdentityTopUpTransitionAction, + used_credits: Credits, + ) -> Self { + match value { + IdentityTopUpTransitionAction::V0(v0) => { + PartiallyUseAssetLockActionV0::from_identity_top_up_transition_action( + v0, + used_credits, + ) + .into() + } + } + } + + /// from borrowed identity top up transition action + pub fn from_borrowed_identity_top_up_transition_action( + value: &IdentityTopUpTransitionAction, + used_credits: Credits, + ) -> Self { + match value { + IdentityTopUpTransitionAction::V0(v0) => { + PartiallyUseAssetLockActionV0::from_borrowed_identity_top_up_transition_action( + v0, + used_credits, + ) + .into() + } + } + } +} diff --git a/packages/rs-drive/src/state_transition_action/system/partially_use_asset_lock_action/v0/mod.rs b/packages/rs-drive/src/state_transition_action/system/partially_use_asset_lock_action/v0/mod.rs new file mode 100644 index 0000000000..b1744c1a95 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/system/partially_use_asset_lock_action/v0/mod.rs @@ -0,0 +1,40 @@ +use dpp::fee::Credits; +use dpp::platform_value::Bytes36; +use dpp::prelude::UserFeeIncrease; +use serde::{Deserialize, Serialize}; +mod transformer; +#[derive(Default, Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct PartiallyUseAssetLockActionV0 { + /// asset lock outpoint + pub asset_lock_outpoint: Bytes36, + /// initial credit value + pub initial_credit_value: Credits, + /// asset lock script + pub asset_lock_script: Vec, + /// remaining credit value AFTER used credits are deducted + pub remaining_credit_value: Credits, + /// the used credits for processing, this is what will go to Evonodes for processing + /// this is after applying the user fee increase + pub used_credits: Credits, + /// fee multiplier + pub user_fee_increase: UserFeeIncrease, +} + +/// document base transition action accessors v0 +pub trait PartiallyUseAssetLockActionAccessorsV0 { + /// asset lock outpoint + fn asset_lock_outpoint(&self) -> Bytes36; + /// initial credit value + fn initial_credit_value(&self) -> Credits; + /// asset lock script used to very that the asset lock can be used + fn asset_lock_script(&self) -> &Vec; + /// asset lock script used to very that the asset lock can be used, this consumes the action + fn asset_lock_script_owned(self) -> Vec; + /// remaining credit value AFTER used credits are deducted + fn remaining_credit_value(&self) -> Credits; + /// the used credits for processing, this is what will go to Evonodes for processing + fn used_credits(&self) -> Credits; + /// fee multiplier + fn user_fee_increase(&self) -> UserFeeIncrease; +} diff --git a/packages/rs-drive/src/state_transition_action/system/partially_use_asset_lock_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/system/partially_use_asset_lock_action/v0/transformer.rs new file mode 100644 index 0000000000..859f8e0a93 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/system/partially_use_asset_lock_action/v0/transformer.rs @@ -0,0 +1,289 @@ +use crate::state_transition_action::identity::identity_create::v0::IdentityCreateTransitionActionV0; +use crate::state_transition_action::identity::identity_topup::v0::IdentityTopUpTransitionActionV0; +use crate::state_transition_action::system::partially_use_asset_lock_action::v0::PartiallyUseAssetLockActionV0; +use dpp::asset_lock::reduced_asset_lock_value::AssetLockValueGettersV0; +use dpp::consensus::basic::identity::IdentityAssetLockTransactionOutputNotFoundError; +use dpp::consensus::ConsensusError; +use dpp::fee::Credits; +use dpp::platform_value::Bytes36; +use dpp::state_transition::identity_create_transition::v0::IdentityCreateTransitionV0; +use dpp::state_transition::identity_topup_transition::v0::IdentityTopUpTransitionV0; + +impl PartiallyUseAssetLockActionV0 { + /// try from identity create transition + pub fn try_from_identity_create_transition( + value: IdentityCreateTransitionV0, + asset_lock_initial_balance_amount: Credits, + asset_lock_output_script: Vec, + asset_lock_remaining_balance_amount: Credits, + desired_used_credits: Credits, + ) -> Result { + let IdentityCreateTransitionV0 { + asset_lock_proof, + user_fee_increase, + .. + } = value; + + let asset_lock_outpoint = asset_lock_proof.out_point().ok_or_else(|| { + IdentityAssetLockTransactionOutputNotFoundError::new( + asset_lock_proof.output_index() as usize + ) + })?; + + let remaining_balance_after_used_credits_are_deducted = + asset_lock_remaining_balance_amount.saturating_sub(desired_used_credits); + + // In the case that we want to pay for processing on a partially used asset lock, and we have already done that + // processing, and also that the processing was more than the balance on the asset lock it's better just to take + // the remaining balance. + let used_credits = std::cmp::min(asset_lock_remaining_balance_amount, desired_used_credits); + + Ok(PartiallyUseAssetLockActionV0 { + asset_lock_outpoint: Bytes36::new(asset_lock_outpoint.into()), + initial_credit_value: asset_lock_initial_balance_amount, + asset_lock_script: asset_lock_output_script, + remaining_credit_value: remaining_balance_after_used_credits_are_deducted, + used_credits, + user_fee_increase, + }) + } + + /// try from borrowed identity create transition + pub fn try_from_borrowed_identity_create_transition( + value: &IdentityCreateTransitionV0, + asset_lock_initial_balance_amount: Credits, + asset_lock_output_script: Vec, + asset_lock_remaining_balance_amount: Credits, + desired_used_credits: Credits, + ) -> Result { + let IdentityCreateTransitionV0 { + asset_lock_proof, + user_fee_increase, + .. + } = value; + + let asset_lock_outpoint = asset_lock_proof.out_point().ok_or_else(|| { + IdentityAssetLockTransactionOutputNotFoundError::new( + asset_lock_proof.output_index() as usize + ) + })?; + + // Saturating because we can only have 0 left + let remaining_balance_after_used_credits_are_deducted = + asset_lock_remaining_balance_amount.saturating_sub(desired_used_credits); + + // In the case that we want to pay for processing on a partially used asset lock, and we have already done that + // processing, and also that the processing was more than the balance on the asset lock it's better just to take + // the remaining balance. + let used_credits = std::cmp::min(asset_lock_remaining_balance_amount, desired_used_credits); + + Ok(PartiallyUseAssetLockActionV0 { + asset_lock_outpoint: Bytes36::new(asset_lock_outpoint.into()), + initial_credit_value: asset_lock_initial_balance_amount, + asset_lock_script: asset_lock_output_script, + remaining_credit_value: remaining_balance_after_used_credits_are_deducted, + used_credits, + user_fee_increase: *user_fee_increase, + }) + } + + /// from identity create transition action + pub fn from_identity_create_transition_action( + value: IdentityCreateTransitionActionV0, + desired_used_credits: Credits, + ) -> Self { + let IdentityCreateTransitionActionV0 { + asset_lock_outpoint, + asset_lock_value_to_be_consumed, + user_fee_increase, + .. + } = value; + + let remaining_balance_after_used_credits_are_deducted = asset_lock_value_to_be_consumed + .remaining_credit_value() + .saturating_sub(desired_used_credits); + + let used_credits = std::cmp::min( + asset_lock_value_to_be_consumed.remaining_credit_value(), + desired_used_credits, + ); + + PartiallyUseAssetLockActionV0 { + asset_lock_outpoint, + initial_credit_value: asset_lock_value_to_be_consumed.initial_credit_value(), + asset_lock_script: asset_lock_value_to_be_consumed.tx_out_script_owned(), + remaining_credit_value: remaining_balance_after_used_credits_are_deducted, + used_credits, + user_fee_increase, + } + } + + /// from borrowed identity create transition action + pub fn from_borrowed_identity_create_transition_action( + value: &IdentityCreateTransitionActionV0, + desired_used_credits: Credits, + ) -> Self { + let IdentityCreateTransitionActionV0 { + asset_lock_outpoint, + asset_lock_value_to_be_consumed, + user_fee_increase, + .. + } = value; + + let remaining_balance_after_used_credits_are_deducted = asset_lock_value_to_be_consumed + .remaining_credit_value() + .saturating_sub(desired_used_credits); + + let used_credits = std::cmp::min( + asset_lock_value_to_be_consumed.remaining_credit_value(), + desired_used_credits, + ); + + PartiallyUseAssetLockActionV0 { + asset_lock_outpoint: *asset_lock_outpoint, + initial_credit_value: asset_lock_value_to_be_consumed.initial_credit_value(), + asset_lock_script: asset_lock_value_to_be_consumed.tx_out_script().clone(), + remaining_credit_value: remaining_balance_after_used_credits_are_deducted, + used_credits, + user_fee_increase: *user_fee_increase, + } + } + + /// try from identity top up transition + pub fn try_from_identity_top_up_transition( + value: IdentityTopUpTransitionV0, + asset_lock_initial_balance_amount: Credits, + asset_lock_output_script: Vec, + asset_lock_remaining_balance_amount: Credits, + desired_used_credits: Credits, + ) -> Result { + let IdentityTopUpTransitionV0 { + asset_lock_proof, + user_fee_increase, + .. + } = value; + + let asset_lock_outpoint = asset_lock_proof.out_point().ok_or_else(|| { + IdentityAssetLockTransactionOutputNotFoundError::new( + asset_lock_proof.output_index() as usize + ) + })?; + + let remaining_balance_after_used_credits_are_deducted = + asset_lock_remaining_balance_amount.saturating_sub(desired_used_credits); + + // In the case that we want to pay for processing on a partially used asset lock, and we have already done that + // processing, and also that the processing was more than the balance on the asset lock it's better just to take + // the remaining balance. + let used_credits = std::cmp::min(asset_lock_remaining_balance_amount, desired_used_credits); + + Ok(PartiallyUseAssetLockActionV0 { + asset_lock_outpoint: Bytes36::new(asset_lock_outpoint.into()), + initial_credit_value: asset_lock_initial_balance_amount, + asset_lock_script: asset_lock_output_script, + remaining_credit_value: remaining_balance_after_used_credits_are_deducted, + used_credits, + user_fee_increase, + }) + } + + /// try from borrowed identity top up transition + pub fn try_from_borrowed_identity_top_up_transition( + value: &IdentityTopUpTransitionV0, + asset_lock_initial_balance_amount: Credits, + asset_lock_output_script: Vec, + asset_lock_remaining_balance_amount: Credits, + desired_used_credits: Credits, + ) -> Result { + let IdentityTopUpTransitionV0 { + asset_lock_proof, + user_fee_increase, + .. + } = value; + + let asset_lock_outpoint = asset_lock_proof.out_point().ok_or_else(|| { + IdentityAssetLockTransactionOutputNotFoundError::new( + asset_lock_proof.output_index() as usize + ) + })?; + + let remaining_balance_after_used_credits_are_deducted = + asset_lock_remaining_balance_amount.saturating_sub(desired_used_credits); + + // In the case that we want to pay for processing on a partially used asset lock, and we have already done that + // processing, and also that the processing was more than the balance on the asset lock it's better just to take + // the remaining balance. + let used_credits = std::cmp::min(asset_lock_remaining_balance_amount, desired_used_credits); + + Ok(PartiallyUseAssetLockActionV0 { + asset_lock_outpoint: Bytes36::new(asset_lock_outpoint.into()), + initial_credit_value: asset_lock_initial_balance_amount, + asset_lock_script: asset_lock_output_script, + remaining_credit_value: remaining_balance_after_used_credits_are_deducted, + used_credits, + user_fee_increase: *user_fee_increase, + }) + } + + /// from identity top up transition action + pub fn from_identity_top_up_transition_action( + value: IdentityTopUpTransitionActionV0, + desired_used_credits: Credits, + ) -> Self { + let IdentityTopUpTransitionActionV0 { + asset_lock_outpoint, + top_up_asset_lock_value, + user_fee_increase, + .. + } = value; + + let remaining_balance_after_used_credits_are_deducted = top_up_asset_lock_value + .remaining_credit_value() + .saturating_sub(desired_used_credits); + + let used_credits = std::cmp::min( + top_up_asset_lock_value.remaining_credit_value(), + desired_used_credits, + ); + + PartiallyUseAssetLockActionV0 { + asset_lock_outpoint, + initial_credit_value: top_up_asset_lock_value.initial_credit_value(), + asset_lock_script: top_up_asset_lock_value.tx_out_script_owned(), + remaining_credit_value: remaining_balance_after_used_credits_are_deducted, + used_credits, + user_fee_increase, + } + } + + /// from borrowed identity top up transition + pub fn from_borrowed_identity_top_up_transition_action( + value: &IdentityTopUpTransitionActionV0, + desired_used_credits: Credits, + ) -> Self { + let IdentityTopUpTransitionActionV0 { + asset_lock_outpoint, + top_up_asset_lock_value, + user_fee_increase, + .. + } = value; + + let remaining_balance_after_used_credits_are_deducted = top_up_asset_lock_value + .remaining_credit_value() + .saturating_sub(desired_used_credits); + + let used_credits = std::cmp::min( + top_up_asset_lock_value.remaining_credit_value(), + desired_used_credits, + ); + + PartiallyUseAssetLockActionV0 { + asset_lock_outpoint: *asset_lock_outpoint, + initial_credit_value: top_up_asset_lock_value.initial_credit_value(), + asset_lock_script: top_up_asset_lock_value.tx_out_script().clone(), + remaining_credit_value: remaining_balance_after_used_credits_are_deducted, + used_credits, + user_fee_increase: *user_fee_increase, + } + } +} diff --git a/packages/rs-platform-version/src/version/dpp_versions.rs b/packages/rs-platform-version/src/version/dpp_versions.rs index 5d2875703c..459ef8f230 100644 --- a/packages/rs-platform-version/src/version/dpp_versions.rs +++ b/packages/rs-platform-version/src/version/dpp_versions.rs @@ -12,6 +12,7 @@ pub struct DPPVersion { pub contract_versions: ContractVersions, pub document_versions: DocumentVersions, pub identity_versions: IdentityVersions, + pub asset_lock_versions: AssetLockVersions, } #[derive(Clone, Debug, Default)] @@ -24,14 +25,16 @@ pub struct StateTransitionVersions { #[derive(Clone, Debug, Default)] pub struct IdentityTransitionVersions { + pub max_public_keys_in_creation: u16, pub asset_locks: IdentityTransitionAssetLockVersions, } #[derive(Clone, Debug, Default)] pub struct IdentityTransitionAssetLockVersions { + pub required_asset_lock_duff_balance_for_processing_start_for_identity_create: u64, + pub required_asset_lock_duff_balance_for_processing_start_for_identity_top_up: u64, pub validate_asset_lock_transaction_structure: FeatureVersion, pub validate_instant_asset_lock_proof_structure: FeatureVersion, - pub minimal_asset_lock_value: FeatureVersion, } #[derive(Clone, Debug, Default)] @@ -57,7 +60,6 @@ pub struct CostVersions { #[derive(Clone, Debug, Default)] pub struct DPPValidationVersions { - pub validate_time_in_block_time_window: FeatureVersion, pub json_schema_validator: JsonSchemaValidatorVersions, pub data_contract: DataContractValidationVersions, pub document_type: DocumentTypeValidationVersions, @@ -200,6 +202,11 @@ pub struct RecursiveSchemaValidatorVersions { pub pattern_is_valid_regex_validator: FeatureVersion, } +#[derive(Clone, Debug, Default)] +pub struct AssetLockVersions { + pub reduced_asset_lock_value: FeatureVersionBounds, +} + #[derive(Clone, Debug, Default)] pub struct IdentityVersions { /// This is the structure of the Identity as it is defined for code paths diff --git a/packages/rs-platform-version/src/version/drive_abci_versions.rs b/packages/rs-platform-version/src/version/drive_abci_versions.rs index 0ab6c90c52..e173085bca 100644 --- a/packages/rs-platform-version/src/version/drive_abci_versions.rs +++ b/packages/rs-platform-version/src/version/drive_abci_versions.rs @@ -78,6 +78,15 @@ pub struct DriveAbciValidationVersions { pub state_transitions: DriveAbciStateTransitionValidationVersions, pub process_state_transition: FeatureVersion, pub state_transition_to_execution_event_for_check_tx: FeatureVersion, + pub penalties: PenaltyAmounts, +} + +/// All of these penalty amounts are in credits +#[derive(Clone, Debug, Default)] +pub struct PenaltyAmounts { + pub identity_id_not_correct: u64, + pub validation_of_added_keys_structure_failure: u64, + pub validation_of_added_keys_proof_of_possession_failure: u64, } #[derive(Clone, Debug, Default)] @@ -157,6 +166,7 @@ pub struct DriveAbciStateTransitionCommonValidationVersions { #[derive(Clone, Copy, Debug, Default)] pub struct DriveAbciAssetLockValidationVersions { pub fetch_asset_lock_transaction_output_sync: FeatureVersion, + pub verify_asset_lock_is_not_spent_and_has_enough_balance: FeatureVersion, } #[derive(Clone, Copy, Debug, Default)] @@ -271,5 +281,6 @@ pub struct DriveAbciProtocolUpgradeMethodVersions { pub struct DriveAbciStateTransitionProcessingMethodVersions { pub execute_event: FeatureVersion, pub process_raw_state_transitions: FeatureVersion, + pub decode_raw_state_transitions: FeatureVersion, pub validate_fees_of_event: FeatureVersion, } diff --git a/packages/rs-platform-version/src/version/drive_versions.rs b/packages/rs-platform-version/src/version/drive_versions.rs index e523ebbe60..4b8f2ef2ee 100644 --- a/packages/rs-platform-version/src/version/drive_versions.rs +++ b/packages/rs-platform-version/src/version/drive_versions.rs @@ -137,7 +137,7 @@ pub struct DriveBalancesMethodVersions { pub struct DriveAssetLockMethodVersions { pub add_asset_lock_outpoint: FeatureVersion, pub add_estimation_costs_for_adding_asset_lock: FeatureVersion, - pub has_asset_lock_outpoint: FeatureVersion, + pub fetch_asset_lock_outpoint_info: FeatureVersion, } #[derive(Clone, Debug, Default)] diff --git a/packages/rs-platform-version/src/version/mocks/v2_test.rs b/packages/rs-platform-version/src/version/mocks/v2_test.rs index 8f547ae34f..712c73491f 100644 --- a/packages/rs-platform-version/src/version/mocks/v2_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v2_test.rs @@ -1,13 +1,13 @@ use crate::version::contracts::SystemDataContractVersions; use crate::version::dpp_versions::{ - ContractVersions, CostVersions, DPPValidationVersions, DPPVersion, DataContractMethodVersions, - DataContractValidationVersions, DocumentFeatureVersionBounds, DocumentMethodVersions, - DocumentTransitionVersions, DocumentTypeClassMethodVersions, DocumentTypeIndexVersions, - DocumentTypeMethodVersions, DocumentTypeSchemaVersions, DocumentTypeValidationVersions, - DocumentTypeVersions, DocumentVersions, DocumentsBatchTransitionValidationVersions, - DocumentsBatchTransitionVersions, IdentityKeyTypeMethodVersions, - IdentityTransitionAssetLockVersions, IdentityTransitionVersions, IdentityVersions, - JsonSchemaValidatorVersions, PublicKeyInCreationMethodVersions, + AssetLockVersions, ContractVersions, CostVersions, DPPValidationVersions, DPPVersion, + DataContractMethodVersions, DataContractValidationVersions, DocumentFeatureVersionBounds, + DocumentMethodVersions, DocumentTransitionVersions, DocumentTypeClassMethodVersions, + DocumentTypeIndexVersions, DocumentTypeMethodVersions, DocumentTypeSchemaVersions, + DocumentTypeValidationVersions, DocumentTypeVersions, DocumentVersions, + DocumentsBatchTransitionValidationVersions, DocumentsBatchTransitionVersions, + IdentityKeyTypeMethodVersions, IdentityTransitionAssetLockVersions, IdentityTransitionVersions, + IdentityVersions, JsonSchemaValidatorVersions, PublicKeyInCreationMethodVersions, RecursiveSchemaValidatorVersions, StateTransitionConversionVersions, StateTransitionMethodVersions, StateTransitionSerializationVersions, StateTransitionVersions, }; @@ -28,7 +28,7 @@ use crate::version::drive_abci_versions::{ DriveAbciStateTransitionProcessingMethodVersions, DriveAbciStateTransitionValidationVersion, DriveAbciStateTransitionValidationVersions, DriveAbciStructureVersions, DriveAbciValidationDataTriggerAndBindingVersions, DriveAbciValidationDataTriggerVersions, - DriveAbciValidationVersions, DriveAbciVersion, + DriveAbciValidationVersions, DriveAbciVersion, PenaltyAmounts, }; use crate::version::drive_versions::{ DriveAssetLockMethodVersions, DriveBalancesMethodVersions, DriveBatchOperationsMethodVersion, @@ -235,7 +235,7 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { asset_lock: DriveAssetLockMethodVersions { add_asset_lock_outpoint: 0, add_estimation_costs_for_adding_asset_lock: 0, - has_asset_lock_outpoint: 0, + fetch_asset_lock_outpoint_info: 0, }, verify: DriveVerifyMethodVersions { contract: DriveVerifyContractMethodVersions { @@ -567,6 +567,7 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { state_transition_processing: DriveAbciStateTransitionProcessingMethodVersions { execute_event: 0, process_raw_state_transitions: 0, + decode_raw_state_transitions: 0, validate_fees_of_event: 0, }, epoch: DriveAbciEpochMethodVersions { @@ -591,6 +592,7 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { common_validation_methods: DriveAbciStateTransitionCommonValidationVersions { asset_locks: DriveAbciAssetLockValidationVersions { fetch_asset_lock_transaction_output_sync: 0, + verify_asset_lock_is_not_spent_and_has_enough_balance: 0, }, validate_identity_public_key_contract_bounds: 0, validate_identity_public_key_ids_dont_exist_in_state: 0, @@ -601,7 +603,7 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { }, identity_create_state_transition: DriveAbciStateTransitionValidationVersion { basic_structure: Some(0), - advanced_structure: None, + advanced_structure: Some(0), identity_signatures: Some(0), balance: None, nonce: None, @@ -620,7 +622,7 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { identity_top_up_state_transition: DriveAbciStateTransitionValidationVersion { basic_structure: Some(0), advanced_structure: None, - identity_signatures: Some(0), + identity_signatures: None, balance: None, nonce: None, state: 0, @@ -693,6 +695,11 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { }, process_state_transition: 0, state_transition_to_execution_event_for_check_tx: 0, + penalties: PenaltyAmounts { + identity_id_not_correct: 5000000, + validation_of_added_keys_structure_failure: 1000000, + validation_of_added_keys_proof_of_possession_failure: 5000000, + }, }, query: DriveAbciQueryVersions { response_metadata: 0, @@ -794,7 +801,6 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { signature_verify: 0, }, validation: DPPValidationVersions { - validate_time_in_block_time_window: 0, json_schema_validator: JsonSchemaValidatorVersions { new: 0, validate: 0, @@ -912,10 +918,14 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { }, }, identities: IdentityTransitionVersions { + max_public_keys_in_creation: 6, asset_locks: IdentityTransitionAssetLockVersions { + required_asset_lock_duff_balance_for_processing_start_for_identity_create: + 200000, + required_asset_lock_duff_balance_for_processing_start_for_identity_top_up: + 50000, validate_asset_lock_transaction_structure: 0, validate_instant_asset_lock_proof_structure: 0, - minimal_asset_lock_value: 0, }, }, }, @@ -996,6 +1006,13 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { random_public_and_private_key_data: 0, }, }, + asset_lock_versions: AssetLockVersions { + reduced_asset_lock_value: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + }, }, system_data_contracts: SystemDataContractVersions { withdrawals: 1, diff --git a/packages/rs-platform-version/src/version/mocks/v3_test.rs b/packages/rs-platform-version/src/version/mocks/v3_test.rs index 1e77c40597..8b919b35bb 100644 --- a/packages/rs-platform-version/src/version/mocks/v3_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v3_test.rs @@ -1,13 +1,13 @@ use crate::version::contracts::SystemDataContractVersions; use crate::version::dpp_versions::{ - ContractVersions, CostVersions, DPPValidationVersions, DPPVersion, DataContractMethodVersions, - DataContractValidationVersions, DocumentFeatureVersionBounds, DocumentMethodVersions, - DocumentTransitionVersions, DocumentTypeClassMethodVersions, DocumentTypeIndexVersions, - DocumentTypeMethodVersions, DocumentTypeSchemaVersions, DocumentTypeValidationVersions, - DocumentTypeVersions, DocumentVersions, DocumentsBatchTransitionValidationVersions, - DocumentsBatchTransitionVersions, IdentityKeyTypeMethodVersions, - IdentityTransitionAssetLockVersions, IdentityTransitionVersions, IdentityVersions, - JsonSchemaValidatorVersions, PublicKeyInCreationMethodVersions, + AssetLockVersions, ContractVersions, CostVersions, DPPValidationVersions, DPPVersion, + DataContractMethodVersions, DataContractValidationVersions, DocumentFeatureVersionBounds, + DocumentMethodVersions, DocumentTransitionVersions, DocumentTypeClassMethodVersions, + DocumentTypeIndexVersions, DocumentTypeMethodVersions, DocumentTypeSchemaVersions, + DocumentTypeValidationVersions, DocumentTypeVersions, DocumentVersions, + DocumentsBatchTransitionValidationVersions, DocumentsBatchTransitionVersions, + IdentityKeyTypeMethodVersions, IdentityTransitionAssetLockVersions, IdentityTransitionVersions, + IdentityVersions, JsonSchemaValidatorVersions, PublicKeyInCreationMethodVersions, RecursiveSchemaValidatorVersions, StateTransitionConversionVersions, StateTransitionMethodVersions, StateTransitionSerializationVersions, StateTransitionVersions, }; @@ -28,7 +28,7 @@ use crate::version::drive_abci_versions::{ DriveAbciStateTransitionProcessingMethodVersions, DriveAbciStateTransitionValidationVersion, DriveAbciStateTransitionValidationVersions, DriveAbciStructureVersions, DriveAbciValidationDataTriggerAndBindingVersions, DriveAbciValidationDataTriggerVersions, - DriveAbciValidationVersions, DriveAbciVersion, + DriveAbciValidationVersions, DriveAbciVersion, PenaltyAmounts, }; use crate::version::drive_versions::{ DriveAssetLockMethodVersions, DriveBalancesMethodVersions, DriveBatchOperationsMethodVersion, @@ -243,7 +243,7 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { asset_lock: DriveAssetLockMethodVersions { add_asset_lock_outpoint: 0, add_estimation_costs_for_adding_asset_lock: 0, - has_asset_lock_outpoint: 0, + fetch_asset_lock_outpoint_info: 0, }, verify: DriveVerifyMethodVersions { contract: DriveVerifyContractMethodVersions { @@ -567,6 +567,7 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { state_transition_processing: DriveAbciStateTransitionProcessingMethodVersions { execute_event: 0, process_raw_state_transitions: 0, + decode_raw_state_transitions: 0, validate_fees_of_event: 0, }, epoch: DriveAbciEpochMethodVersions { @@ -591,6 +592,7 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { common_validation_methods: DriveAbciStateTransitionCommonValidationVersions { asset_locks: DriveAbciAssetLockValidationVersions { fetch_asset_lock_transaction_output_sync: 0, + verify_asset_lock_is_not_spent_and_has_enough_balance: 0, }, validate_identity_public_key_contract_bounds: 0, validate_identity_public_key_ids_dont_exist_in_state: 0, @@ -601,7 +603,7 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { }, identity_create_state_transition: DriveAbciStateTransitionValidationVersion { basic_structure: Some(0), - advanced_structure: None, + advanced_structure: Some(0), identity_signatures: Some(0), balance: None, nonce: None, @@ -620,7 +622,7 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { identity_top_up_state_transition: DriveAbciStateTransitionValidationVersion { basic_structure: Some(0), advanced_structure: None, - identity_signatures: Some(0), + identity_signatures: None, balance: None, nonce: None, state: 0, @@ -693,6 +695,11 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { }, process_state_transition: 0, state_transition_to_execution_event_for_check_tx: 0, + penalties: PenaltyAmounts { + identity_id_not_correct: 5000000, + validation_of_added_keys_structure_failure: 1000000, + validation_of_added_keys_proof_of_possession_failure: 5000000, + }, }, query: DriveAbciQueryVersions { response_metadata: 0, @@ -794,7 +801,6 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { signature_verify: 0, }, validation: DPPValidationVersions { - validate_time_in_block_time_window: 0, json_schema_validator: JsonSchemaValidatorVersions { new: 0, validate: 0, @@ -912,10 +918,14 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { }, }, identities: IdentityTransitionVersions { + max_public_keys_in_creation: 6, asset_locks: IdentityTransitionAssetLockVersions { + required_asset_lock_duff_balance_for_processing_start_for_identity_create: + 200000, + required_asset_lock_duff_balance_for_processing_start_for_identity_top_up: + 50000, validate_asset_lock_transaction_structure: 0, validate_instant_asset_lock_proof_structure: 0, - minimal_asset_lock_value: 0, }, }, }, @@ -996,6 +1006,13 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { random_public_and_private_key_data: 0, }, }, + asset_lock_versions: AssetLockVersions { + reduced_asset_lock_value: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + }, }, system_data_contracts: SystemDataContractVersions { withdrawals: 1, diff --git a/packages/rs-platform-version/src/version/v1.rs b/packages/rs-platform-version/src/version/v1.rs index d448ee6a05..bba91b6d80 100644 --- a/packages/rs-platform-version/src/version/v1.rs +++ b/packages/rs-platform-version/src/version/v1.rs @@ -1,13 +1,13 @@ use crate::version::contracts::SystemDataContractVersions; use crate::version::dpp_versions::{ - ContractVersions, CostVersions, DPPValidationVersions, DPPVersion, DataContractMethodVersions, - DataContractValidationVersions, DocumentFeatureVersionBounds, DocumentMethodVersions, - DocumentTransitionVersions, DocumentTypeClassMethodVersions, DocumentTypeIndexVersions, - DocumentTypeMethodVersions, DocumentTypeSchemaVersions, DocumentTypeValidationVersions, - DocumentTypeVersions, DocumentVersions, DocumentsBatchTransitionValidationVersions, - DocumentsBatchTransitionVersions, IdentityKeyTypeMethodVersions, - IdentityTransitionAssetLockVersions, IdentityTransitionVersions, IdentityVersions, - JsonSchemaValidatorVersions, PublicKeyInCreationMethodVersions, + AssetLockVersions, ContractVersions, CostVersions, DPPValidationVersions, DPPVersion, + DataContractMethodVersions, DataContractValidationVersions, DocumentFeatureVersionBounds, + DocumentMethodVersions, DocumentTransitionVersions, DocumentTypeClassMethodVersions, + DocumentTypeIndexVersions, DocumentTypeMethodVersions, DocumentTypeSchemaVersions, + DocumentTypeValidationVersions, DocumentTypeVersions, DocumentVersions, + DocumentsBatchTransitionValidationVersions, DocumentsBatchTransitionVersions, + IdentityKeyTypeMethodVersions, IdentityTransitionAssetLockVersions, IdentityTransitionVersions, + IdentityVersions, JsonSchemaValidatorVersions, PublicKeyInCreationMethodVersions, RecursiveSchemaValidatorVersions, StateTransitionConversionVersions, StateTransitionMethodVersions, StateTransitionSerializationVersions, StateTransitionVersions, }; @@ -28,7 +28,7 @@ use crate::version::drive_abci_versions::{ DriveAbciStateTransitionProcessingMethodVersions, DriveAbciStateTransitionValidationVersion, DriveAbciStateTransitionValidationVersions, DriveAbciStructureVersions, DriveAbciValidationDataTriggerAndBindingVersions, DriveAbciValidationDataTriggerVersions, - DriveAbciValidationVersions, DriveAbciVersion, + DriveAbciValidationVersions, DriveAbciVersion, PenaltyAmounts, }; use crate::version::drive_versions::{ DriveAssetLockMethodVersions, DriveBalancesMethodVersions, DriveBatchOperationsMethodVersion, @@ -232,7 +232,7 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { asset_lock: DriveAssetLockMethodVersions { add_asset_lock_outpoint: 0, add_estimation_costs_for_adding_asset_lock: 0, - has_asset_lock_outpoint: 0, + fetch_asset_lock_outpoint_info: 0, }, verify: DriveVerifyMethodVersions { contract: DriveVerifyContractMethodVersions { @@ -564,6 +564,7 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { state_transition_processing: DriveAbciStateTransitionProcessingMethodVersions { execute_event: 0, process_raw_state_transitions: 0, + decode_raw_state_transitions: 0, validate_fees_of_event: 0, }, epoch: DriveAbciEpochMethodVersions { @@ -588,6 +589,7 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { common_validation_methods: DriveAbciStateTransitionCommonValidationVersions { asset_locks: DriveAbciAssetLockValidationVersions { fetch_asset_lock_transaction_output_sync: 0, + verify_asset_lock_is_not_spent_and_has_enough_balance: 0, }, validate_identity_public_key_contract_bounds: 0, validate_identity_public_key_ids_dont_exist_in_state: 0, @@ -598,7 +600,7 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { }, identity_create_state_transition: DriveAbciStateTransitionValidationVersion { basic_structure: Some(0), - advanced_structure: None, + advanced_structure: Some(0), identity_signatures: Some(0), balance: None, nonce: None, @@ -617,7 +619,7 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { identity_top_up_state_transition: DriveAbciStateTransitionValidationVersion { basic_structure: Some(0), advanced_structure: None, - identity_signatures: Some(0), + identity_signatures: None, balance: None, nonce: None, state: 0, @@ -690,6 +692,11 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { }, process_state_transition: 0, state_transition_to_execution_event_for_check_tx: 0, + penalties: PenaltyAmounts { + identity_id_not_correct: 5000000, + validation_of_added_keys_structure_failure: 1000000, + validation_of_added_keys_proof_of_possession_failure: 5000000, + }, }, query: DriveAbciQueryVersions { response_metadata: 0, @@ -791,7 +798,6 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { signature_verify: 0, }, validation: DPPValidationVersions { - validate_time_in_block_time_window: 0, json_schema_validator: JsonSchemaValidatorVersions { new: 0, validate: 0, @@ -909,10 +915,14 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { }, }, identities: IdentityTransitionVersions { + max_public_keys_in_creation: 6, asset_locks: IdentityTransitionAssetLockVersions { + required_asset_lock_duff_balance_for_processing_start_for_identity_create: + 200000, + required_asset_lock_duff_balance_for_processing_start_for_identity_top_up: + 50000, validate_asset_lock_transaction_structure: 0, validate_instant_asset_lock_proof_structure: 0, - minimal_asset_lock_value: 0, }, }, }, @@ -993,6 +1003,13 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { random_public_and_private_key_data: 0, }, }, + asset_lock_versions: AssetLockVersions { + reduced_asset_lock_value: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + }, }, system_data_contracts: SystemDataContractVersions { withdrawals: 1, diff --git a/packages/wasm-dpp/src/errors/consensus/basic/identity/identity_asset_lock_transaction_out_point_already_exists_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/identity/identity_asset_lock_transaction_out_point_already_exists_error.rs index bf3e685414..39a5262f92 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/identity/identity_asset_lock_transaction_out_point_already_exists_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/identity/identity_asset_lock_transaction_out_point_already_exists_error.rs @@ -1,4 +1,4 @@ -use dpp::consensus::basic::identity::IdentityAssetLockTransactionOutPointAlreadyExistsError; +use dpp::consensus::basic::identity::IdentityAssetLockTransactionOutPointAlreadyConsumedError; use dpp::consensus::codes::ErrorWithCode; use dpp::consensus::ConsensusError; use dpp::dashcore::hashes::Hash; @@ -9,13 +9,13 @@ use crate::buffer::Buffer; #[wasm_bindgen(js_name=IdentityAssetLockTransactionOutPointAlreadyExistsError)] pub struct IdentityAssetLockTransactionOutPointAlreadyExistsErrorWasm { - inner: IdentityAssetLockTransactionOutPointAlreadyExistsError, + inner: IdentityAssetLockTransactionOutPointAlreadyConsumedError, } -impl From<&IdentityAssetLockTransactionOutPointAlreadyExistsError> +impl From<&IdentityAssetLockTransactionOutPointAlreadyConsumedError> for IdentityAssetLockTransactionOutPointAlreadyExistsErrorWasm { - fn from(e: &IdentityAssetLockTransactionOutPointAlreadyExistsError) -> Self { + fn from(e: &IdentityAssetLockTransactionOutPointAlreadyConsumedError) -> Self { Self { inner: e.clone() } } } diff --git a/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_asset_lock_proof_value_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_asset_lock_proof_value_error.rs deleted file mode 100644 index 18fbfb1436..0000000000 --- a/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_asset_lock_proof_value_error.rs +++ /dev/null @@ -1,39 +0,0 @@ -use dpp::consensus::codes::ErrorWithCode; -use dpp::consensus::ConsensusError; - -use dpp::consensus::state::identity::invalid_asset_lock_proof_value::InvalidAssetLockProofValueError; -use wasm_bindgen::prelude::*; - -#[wasm_bindgen(js_name=InvalidAssetLockProofValueError)] -pub struct InvalidAssetLockProofValueErrorWasm { - inner: InvalidAssetLockProofValueError, -} - -impl From<&InvalidAssetLockProofValueError> for InvalidAssetLockProofValueErrorWasm { - fn from(e: &InvalidAssetLockProofValueError) -> Self { - Self { inner: e.clone() } - } -} - -#[wasm_bindgen(js_class=InvalidAssetLockProofValueError)] -impl InvalidAssetLockProofValueErrorWasm { - #[wasm_bindgen(js_name=getValue)] - pub fn value(&self) -> u64 { - self.inner.value() - } - - #[wasm_bindgen(js_name=getMinValue)] - pub fn min_value(&self) -> u64 { - self.inner.min_value() - } - - #[wasm_bindgen(js_name=getCode)] - pub fn get_code(&self) -> u32 { - ConsensusError::from(self.inner.clone()).code() - } - - #[wasm_bindgen(getter)] - pub fn message(&self) -> String { - self.inner.to_string() - } -} diff --git a/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_asset_transaction_out_point_not_enough_balance_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_asset_transaction_out_point_not_enough_balance_error.rs new file mode 100644 index 0000000000..61728ed533 --- /dev/null +++ b/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_asset_transaction_out_point_not_enough_balance_error.rs @@ -0,0 +1,61 @@ +use dpp::consensus::codes::ErrorWithCode; +use dpp::consensus::ConsensusError; + +use crate::buffer::Buffer; +use dpp::consensus::basic::identity::IdentityAssetLockTransactionOutPointNotEnoughBalanceError; +use dpp::dashcore::hashes::Hash; +use wasm_bindgen::prelude::*; + +#[wasm_bindgen(js_name=IdentityAssetLockTransactionOutPointNotEnoughBalanceError)] +pub struct IdentityAssetLockTransactionOutPointNotEnoughBalanceErrorWasm { + inner: IdentityAssetLockTransactionOutPointNotEnoughBalanceError, +} + +impl From<&IdentityAssetLockTransactionOutPointNotEnoughBalanceError> + for IdentityAssetLockTransactionOutPointNotEnoughBalanceErrorWasm +{ + fn from(e: &IdentityAssetLockTransactionOutPointNotEnoughBalanceError) -> Self { + Self { inner: e.clone() } + } +} + +#[wasm_bindgen(js_class=IdentityAssetLockTransactionOutPointNotEnoughBalanceError)] +impl IdentityAssetLockTransactionOutPointNotEnoughBalanceErrorWasm { + #[wasm_bindgen(js_name=getTransactionId)] + pub fn transaction_id(&self) -> Buffer { + let tx_id = self.inner.transaction_id(); + let mut tx_id_bytes = tx_id.to_byte_array(); + tx_id_bytes.reverse(); + Buffer::from_bytes(&tx_id_bytes) + } + + #[wasm_bindgen(js_name=getOutputIndex)] + pub fn output_index(&self) -> usize { + self.inner.output_index() + } + + #[wasm_bindgen(js_name=getInitialAssetLockCredits)] + pub fn initial_asset_lock_credits(&self) -> u64 { + self.inner.initial_asset_lock_credits() + } + + #[wasm_bindgen(js_name=getCreditsLeft)] + pub fn credits_left(&self) -> u64 { + self.inner.credits_left() + } + + #[wasm_bindgen(js_name=getCreditsRequired)] + pub fn credits_required(&self) -> u64 { + self.inner.credits_required() + } + + #[wasm_bindgen(js_name=getCode)] + pub fn get_code(&self) -> u32 { + ConsensusError::from(self.inner.clone()).code() + } + + #[wasm_bindgen(getter)] + pub fn message(&self) -> String { + self.inner.to_string() + } +} diff --git a/packages/wasm-dpp/src/errors/consensus/basic/identity/mod.rs b/packages/wasm-dpp/src/errors/consensus/basic/identity/mod.rs index 907b08e999..f3e7b517cf 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/identity/mod.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/identity/mod.rs @@ -8,8 +8,8 @@ mod identity_credit_transfer_to_self_error; mod identity_insufficient_balance_error; mod invalid_asset_lock_proof_core_chain_height_error; mod invalid_asset_lock_proof_transaction_height_error; -mod invalid_asset_lock_proof_value_error; mod invalid_asset_lock_transaction_output_return_size_error; +mod invalid_asset_transaction_out_point_not_enough_balance_error; mod invalid_identity_asset_lock_proof_chain_lock_validation_error; mod invalid_identity_asset_lock_transaction_error; mod invalid_identity_asset_lock_transaction_output_error; @@ -36,8 +36,8 @@ pub use identity_credit_transfer_to_self_error::*; pub use identity_insufficient_balance_error::*; pub use invalid_asset_lock_proof_core_chain_height_error::*; pub use invalid_asset_lock_proof_transaction_height_error::*; -pub use invalid_asset_lock_proof_value_error::*; pub use invalid_asset_lock_transaction_output_return_size_error::*; +pub use invalid_asset_transaction_out_point_not_enough_balance_error::*; pub use invalid_identity_asset_lock_proof_chain_lock_validation_error::*; pub use invalid_identity_asset_lock_transaction_error::*; pub use invalid_identity_asset_lock_transaction_output_error::*; diff --git a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs index 61d7e3868e..8c82991b4c 100644 --- a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs @@ -10,9 +10,10 @@ use crate::errors::consensus::basic::identity::{ IdentityAssetLockProofLockedTransactionMismatchErrorWasm, IdentityAssetLockTransactionIsNotFoundErrorWasm, IdentityAssetLockTransactionOutPointAlreadyExistsErrorWasm, + IdentityAssetLockTransactionOutPointNotEnoughBalanceErrorWasm, IdentityAssetLockTransactionOutputNotFoundErrorWasm, IdentityCreditTransferToSelfErrorWasm, IdentityInsufficientBalanceErrorWasm, InvalidAssetLockProofCoreChainHeightErrorWasm, - InvalidAssetLockProofTransactionHeightErrorWasm, InvalidAssetLockProofValueErrorWasm, + InvalidAssetLockProofTransactionHeightErrorWasm, InvalidAssetLockTransactionOutputReturnSizeErrorWasm, InvalidIdentityAssetLockProofChainLockValidationErrorWasm, InvalidIdentityAssetLockTransactionErrorWasm, @@ -35,7 +36,8 @@ use dpp::consensus::basic::BasicError::{ DuplicatedIdentityPublicKeyBasicError, DuplicatedIdentityPublicKeyIdBasicError, IdentityAssetLockProofLockedTransactionMismatchError, IdentityAssetLockTransactionIsNotFoundError, - IdentityAssetLockTransactionOutPointAlreadyExistsError, + IdentityAssetLockTransactionOutPointAlreadyConsumedError, + IdentityAssetLockTransactionOutPointNotEnoughBalanceError, IdentityAssetLockTransactionOutputNotFoundError, IncompatibleProtocolVersionError, IncompatibleRe2PatternError, InvalidAssetLockProofCoreChainHeightError, InvalidAssetLockProofTransactionHeightError, InvalidAssetLockTransactionOutputReturnSizeError, @@ -210,9 +212,6 @@ pub fn from_state_error(state_error: &StateError) -> JsValue { StateError::DataContractConfigUpdateError(e) => { DataContractConfigUpdateErrorWasm::from(e).into() } - StateError::InvalidAssetLockProofValueError(e) => { - InvalidAssetLockProofValueErrorWasm::from(e).into() - } StateError::InvalidIdentityNonceError(e) => InvalidIdentityNonceErrorWasm::from(e).into(), // TODO(versioning): restore _ => todo!(), @@ -346,7 +345,7 @@ fn from_basic_error(basic_error: &BasicError) -> JsValue { DuplicatedIdentityPublicKeyErrorWasm::from(e).into() } MissingMasterPublicKeyError(e) => MissingMasterPublicKeyErrorWasm::from(e).into(), - IdentityAssetLockTransactionOutPointAlreadyExistsError(e) => { + IdentityAssetLockTransactionOutPointAlreadyConsumedError(e) => { IdentityAssetLockTransactionOutPointAlreadyExistsErrorWasm::from(e).into() } InvalidIdentityAssetLockTransactionOutputError(e) => { @@ -394,6 +393,9 @@ fn from_basic_error(basic_error: &BasicError) -> JsValue { NotImplementedIdentityCreditWithdrawalTransitionPoolingError(e) => { NotImplementedIdentityCreditWithdrawalTransitionPoolingErrorWasm::from(e).into() } + IdentityAssetLockTransactionOutPointNotEnoughBalanceError(e) => { + IdentityAssetLockTransactionOutPointNotEnoughBalanceErrorWasm::from(e).into() + } IncompatibleRe2PatternError(err) => IncompatibleRe2PatternErrorWasm::from(err).into(), // TODO(versioning): cover other errors _ => todo!(), From 3be578ab290d69a291649f22ca59a0cba73a3071 Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Tue, 2 Apr 2024 06:07:32 +0700 Subject: [PATCH 116/191] feat(drive-abci)!: better processing costs of state transitions (no schema processing improvements) (#1800) --- packages/rs-dpp/src/balances/credits.rs | 4 - .../identity/identity_public_key/key_type.rs | 34 ++-- .../chain/chain_asset_lock_proof.rs | 12 +- .../instant/instant_asset_lock_proof.rs | 7 +- .../state_transition/asset_lock_proof/mod.rs | 2 +- .../src/execution/check_tx/v0/mod.rs | 14 +- .../execute_event/v0/mod.rs | 3 +- .../validate_fees_of_event/v0/mod.rs | 2 - .../types/execution_operation/mod.rs | 127 ++++++++++-- .../signature_verification_operation.rs | 9 +- .../state_transition_execution_context/mod.rs | 18 ++ .../check_tx_verification/v0/mod.rs | 41 ++-- .../validation/state_transition/common/mod.rs | 1 + .../validate_simple_pre_check_balance/mod.rs | 39 ++++ .../v0/mod.rs | 78 ++++++++ .../v0/mod.rs | 10 +- .../state_transition/processor/v0/mod.rs | 180 +++++++++++------- .../mod.rs | 0 .../advanced_structure/v0/mod.rs | 54 ++++++ .../basic_structure/v0/mod.rs | 37 ---- .../identity_nonce/mod.rs | 10 +- .../identity_nonce/v0/mod.rs | 10 +- .../data_contract_create/mod.rs | 22 ++- .../identity_contract_nonce/mod.rs | 12 +- .../identity_contract_nonce/v0/mod.rs | 25 ++- .../advanced_structure/v0/mod.rs | 8 +- .../identity_contract_nonce/v0/mod.rs | 25 ++- .../state_transitions/documents_batch/mod.rs | 10 +- .../advanced_structure/v0/mod.rs | 26 ++- .../state_transitions/identity_create/mod.rs | 5 +- .../identity_create/state/v0/mod.rs | 6 +- .../identity_credit_transfer/balance/mod.rs | 14 +- .../balance/v0/mod.rs | 65 ++----- .../identity_credit_transfer/mod.rs | 5 +- .../identity_credit_transfer/nonce/mod.rs | 10 +- .../identity_credit_transfer/nonce/v0/mod.rs | 12 +- .../identity_credit_withdrawal/balance/mod.rs | 14 +- .../balance/v0/mod.rs | 66 ++----- .../identity_credit_withdrawal/mod.rs | 5 +- .../identity_credit_withdrawal/nonce/mod.rs | 10 +- .../nonce/v0/mod.rs | 12 +- .../identity_retrieval/v0/mod.rs | 10 + .../state_transitions/identity_top_up/mod.rs | 5 +- .../transform_into_action/v0/mod.rs | 6 +- .../identity_update/nonce/mod.rs | 10 +- .../identity_update/nonce/v0/mod.rs | 12 +- .../tests/strategy_tests/main.rs | 8 +- .../validate_uniqueness_of_data/mod.rs | 2 +- .../src/version/drive_abci_versions.rs | 3 +- .../src/version/fee/hashing/mod.rs | 9 + .../src/version/fee/hashing/v1.rs | 8 + .../src/version/fee/mod.rs | 21 ++ .../src/version/fee/processing/mod.rs | 11 ++ .../src/version/fee/processing/v1.rs | 10 + .../src/version/fee/signature/mod.rs | 10 + .../src/version/fee/signature/v1.rs | 9 + .../fee/state_transition_min_fees/mod.rs | 10 + .../fee/state_transition_min_fees/v1.rs | 10 + .../src/version/fee/storage/mod.rs | 10 + .../src/version/fee/storage/v1.rs | 9 + .../rs-platform-version/src/version/fee/v1.rs | 14 ++ .../src/version/mocks/v2_test.rs | 17 +- .../src/version/mocks/v3_test.rs | 17 +- .../rs-platform-version/src/version/mod.rs | 1 + .../src/version/protocol_version.rs | 2 + .../rs-platform-version/src/version/v1.rs | 17 +- .../chain/chain_asset_lock_proof.rs | 10 +- .../state_transition/asset_lock_proof/mod.rs | 4 +- 68 files changed, 894 insertions(+), 405 deletions(-) create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_simple_pre_check_balance/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_simple_pre_check_balance/v0/mod.rs rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/{basic_structure => advanced_structure}/mod.rs (100%) create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/advanced_structure/v0/mod.rs delete mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/basic_structure/v0/mod.rs create mode 100644 packages/rs-platform-version/src/version/fee/hashing/mod.rs create mode 100644 packages/rs-platform-version/src/version/fee/hashing/v1.rs create mode 100644 packages/rs-platform-version/src/version/fee/mod.rs create mode 100644 packages/rs-platform-version/src/version/fee/processing/mod.rs create mode 100644 packages/rs-platform-version/src/version/fee/processing/v1.rs create mode 100644 packages/rs-platform-version/src/version/fee/signature/mod.rs create mode 100644 packages/rs-platform-version/src/version/fee/signature/v1.rs create mode 100644 packages/rs-platform-version/src/version/fee/state_transition_min_fees/mod.rs create mode 100644 packages/rs-platform-version/src/version/fee/state_transition_min_fees/v1.rs create mode 100644 packages/rs-platform-version/src/version/fee/storage/mod.rs create mode 100644 packages/rs-platform-version/src/version/fee/storage/v1.rs create mode 100644 packages/rs-platform-version/src/version/fee/v1.rs diff --git a/packages/rs-dpp/src/balances/credits.rs b/packages/rs-dpp/src/balances/credits.rs index a7f98245ba..e9568bec74 100644 --- a/packages/rs-dpp/src/balances/credits.rs +++ b/packages/rs-dpp/src/balances/credits.rs @@ -27,10 +27,6 @@ pub const MAX_CREDITS: Credits = 9223372036854775807 as Credits; //i64 Max pub const CREDITS_PER_DUFF: Credits = 1000; -/// This is the amount of credits we need to have left over in the identity to be able to do a -/// withdrawal or a credit transfer -pub const MIN_LEFTOVER_CREDITS_BEFORE_PROCESSING: Credits = 100000; - /// Trait for signed and unsigned credits pub trait Creditable { diff --git a/packages/rs-dpp/src/identity/identity_public_key/key_type.rs b/packages/rs-dpp/src/identity/identity_public_key/key_type.rs index b9eacd487f..8f4ad7bb5a 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/key_type.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/key_type.rs @@ -15,12 +15,6 @@ use dashcore::Network; use itertools::Itertools; use lazy_static::lazy_static; -use crate::block::epoch::Epoch; -use crate::fee::default_costs::EpochCosts; -use crate::fee::default_costs::KnownCostItem::{ - VerifySignatureBLS12_381, VerifySignatureBip13ScriptHash, VerifySignatureEcdsaHash160, - VerifySignatureEcdsaSecp256k1, VerifySignatureEddsa25519Hash160, -}; use crate::fee::Credits; use crate::version::PlatformVersion; use crate::ProtocolError; @@ -108,22 +102,38 @@ impl KeyType { pub fn signature_verify_cost( &self, platform_version: &PlatformVersion, - epoch: &Epoch, ) -> Result { match platform_version.dpp.costs.signature_verify { 0 => Ok(match self { KeyType::ECDSA_SECP256K1 => { - epoch.cost_for_known_cost_item(VerifySignatureEcdsaSecp256k1) + platform_version + .fee_version + .signature + .verify_signature_ecdsa_secp256k1 + } + KeyType::BLS12_381 => { + platform_version + .fee_version + .signature + .verify_signature_bls12_381 } - KeyType::BLS12_381 => epoch.cost_for_known_cost_item(VerifySignatureBLS12_381), KeyType::ECDSA_HASH160 => { - epoch.cost_for_known_cost_item(VerifySignatureEcdsaHash160) + platform_version + .fee_version + .signature + .verify_signature_ecdsa_hash160 } KeyType::BIP13_SCRIPT_HASH => { - epoch.cost_for_known_cost_item(VerifySignatureBip13ScriptHash) + platform_version + .fee_version + .signature + .verify_signature_bip13_script_hash } KeyType::EDDSA_25519_HASH160 => { - epoch.cost_for_known_cost_item(VerifySignatureEddsa25519Hash160) + platform_version + .fee_version + .signature + .verify_signature_eddsa25519_hash160 } }), version => Err(ProtocolError::UnknownVersionMismatch { diff --git a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs index 3116b104ef..0a7b020cc1 100644 --- a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs +++ b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs @@ -1,7 +1,6 @@ use ::serde::{Deserialize, Serialize}; use platform_value::Value; use std::convert::TryFrom; -use std::io; use crate::util::hash::hash_double; use crate::{identifier::Identifier, ProtocolError}; @@ -44,14 +43,11 @@ impl ChainAssetLockProof { } /// Create identifier - pub fn create_identifier(&self) -> Result { - let output_vec: Vec = self - .out_point - .try_into() - .map_err(|e: io::Error| ProtocolError::EncodingError(e.to_string()))?; + pub fn create_identifier(&self) -> Identifier { + let outpoint_bytes: [u8; 36] = self.out_point.into(); - let hash = hash_double(output_vec); + let hash = hash_double(outpoint_bytes.as_slice()); - Ok(Identifier::new(hash)) + Identifier::new(hash) } } diff --git a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs index 7020604fb1..a86b732fe9 100644 --- a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs +++ b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs @@ -1,5 +1,4 @@ use std::convert::{TryFrom, TryInto}; -use std::io; use dashcore::consensus::{deserialize, Encodable}; use dashcore::transaction::special_transaction::TransactionPayload; @@ -132,11 +131,9 @@ impl InstantAssetLockProof { ProtocolError::IdentifierError(String::from("No output at a given index")) })?; - let output_vec: Vec = outpoint - .try_into() - .map_err(|e: io::Error| ProtocolError::EncodingError(e.to_string()))?; + let outpoint_bytes: [u8; 36] = outpoint.into(); - let hash = hash_double(output_vec); + let hash = hash_double(outpoint_bytes.as_slice()); Ok(Identifier::new(hash)) } diff --git a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/mod.rs b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/mod.rs index e5b45b3503..2e97ad7480 100644 --- a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/mod.rs +++ b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/mod.rs @@ -175,7 +175,7 @@ impl AssetLockProof { pub fn create_identifier(&self) -> Result { match self { AssetLockProof::Instant(instant_proof) => instant_proof.create_identifier(), - AssetLockProof::Chain(chain_proof) => chain_proof.create_identifier(), + AssetLockProof::Chain(chain_proof) => Ok(chain_proof.create_identifier()), } } diff --git a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs index 04969a78f3..d4ebc6e67f 100644 --- a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs @@ -434,7 +434,7 @@ mod tests { ) .expect("expected to process state transition"); - assert_eq!(processing_result.aggregated_fees().processing_fee, 2796590); + assert_eq!(processing_result.aggregated_fees().processing_fee, 2961150); let check_result = platform .check_tx( @@ -625,7 +625,7 @@ mod tests { // We have one invalid paid for state transition assert_eq!(processing_result.invalid_paid_count(), 1); - assert_eq!(processing_result.aggregated_fees().processing_fee, 736520); + assert_eq!(processing_result.aggregated_fees().processing_fee, 901080); let check_result = platform .check_tx( @@ -767,7 +767,7 @@ mod tests { // since a fee multiplier of 100 means 100% more of 1 (gives 2) assert_eq!( processing_result.aggregated_fees().processing_fee, - 2796590 * 2 + 2961150 * 2 ); let check_result = platform @@ -1005,7 +1005,7 @@ mod tests { ) .expect("expected to process state transition"); - assert_eq!(processing_result.aggregated_fees().processing_fee, 2796590); + assert_eq!(processing_result.aggregated_fees().processing_fee, 2961150); platform .drive @@ -1089,7 +1089,7 @@ mod tests { assert_eq!( update_processing_result.aggregated_fees().processing_fee, - 5704920 + 5804610 ); let check_result = platform @@ -1201,7 +1201,7 @@ mod tests { ) .expect("expected to process state transition"); - assert_eq!(processing_result.aggregated_fees().processing_fee, 2796590); + assert_eq!(processing_result.aggregated_fees().processing_fee, 2961150); platform .drive @@ -1320,7 +1320,7 @@ mod tests { // We have one invalid paid for state transition assert_eq!(processing_result.invalid_paid_count(), 1); - assert_eq!(processing_result.aggregated_fees().processing_fee, 1127060); + assert_eq!(processing_result.aggregated_fees().processing_fee, 1226750); let check_result = platform .check_tx( diff --git a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/execute_event/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/execute_event/v0/mod.rs index c30c6b6479..e7f03575d9 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/execute_event/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/execute_event/v0/mod.rs @@ -95,7 +95,6 @@ where ValidationOperation::add_many_to_fee_result( &execution_operations, &mut individual_fee_result, - &block_info.epoch, platform_version, )?; @@ -126,6 +125,8 @@ where Ok(UnpaidConsensusExecutionError(consensus_errors)) } } + // This is for Partially used Asset Locks + // NOT used for identity create or identity top up ExecutionEvent::PaidFromAssetLockWithoutIdentity { processing_fees, operations, diff --git a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/validate_fees_of_event/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/validate_fees_of_event/v0/mod.rs index 73c931d990..86b6dd890b 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/validate_fees_of_event/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/state_transition_processing/validate_fees_of_event/v0/mod.rs @@ -68,7 +68,6 @@ where ValidationOperation::add_many_to_fee_result( execution_operations, &mut estimated_fee_result, - &block_info.epoch, platform_version, )?; @@ -120,7 +119,6 @@ where ValidationOperation::add_many_to_fee_result( execution_operations, &mut estimated_fee_result, - &block_info.epoch, platform_version, )?; diff --git a/packages/rs-drive-abci/src/execution/types/execution_operation/mod.rs b/packages/rs-drive-abci/src/execution/types/execution_operation/mod.rs index 19467c5aa8..f32d3a7f8f 100644 --- a/packages/rs-drive-abci/src/execution/types/execution_operation/mod.rs +++ b/packages/rs-drive-abci/src/execution/types/execution_operation/mod.rs @@ -1,28 +1,61 @@ use crate::error::execution::ExecutionError; use crate::error::Error; use crate::execution::types::execution_operation::signature_verification_operation::SignatureVerificationOperation; -use dpp::block::epoch::Epoch; -use dpp::fee::default_costs::EpochCosts; -use dpp::fee::default_costs::KnownCostItem::DoubleSHA256; use dpp::fee::fee_result::FeeResult; use dpp::fee::Credits; +use dpp::identity::KeyCount; use dpp::version::PlatformVersion; pub mod signature_verification_operation; +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct RetrieveIdentityInfo { + query_by_key_id_key_count: u16, + request_balance: bool, + request_revision: bool, +} + +impl RetrieveIdentityInfo { + pub fn only_balance() -> Self { + RetrieveIdentityInfo { + query_by_key_id_key_count: 0, + request_balance: true, + request_revision: false, + } + } + + pub fn one_key_and_balance_and_revision() -> Self { + RetrieveIdentityInfo { + query_by_key_id_key_count: 1, + request_balance: true, + request_revision: true, + } + } + + pub fn one_key_and_balance() -> Self { + RetrieveIdentityInfo { + query_by_key_id_key_count: 1, + request_balance: true, + request_revision: false, + } + } +} + +pub type HashBlockCount = u16; + +pub const SHA256_BLOCK_SIZE: u16 = 64; + #[derive(Debug, Clone, PartialEq, Eq)] pub enum ValidationOperation { - DoubleSha256, + RetrieveIdentity(RetrieveIdentityInfo), + DoubleSha256(HashBlockCount), + ValidateKeyStructure(KeyCount), // This is extremely cheap SignatureVerification(SignatureVerificationOperation), PrecalculatedOperation(FeeResult), } pub trait OperationLike { - fn processing_cost( - &self, - epoch: &Epoch, - platform_version: &PlatformVersion, - ) -> Result; + fn processing_cost(&self, platform_version: &PlatformVersion) -> Result; fn storage_cost(&self, platform_version: &PlatformVersion) -> Result; } @@ -31,7 +64,6 @@ impl ValidationOperation { pub fn add_many_to_fee_result( execution_operations: &[ValidationOperation], fee_result: &mut FeeResult, - epoch: &Epoch, platform_version: &PlatformVersion, ) -> Result<(), Error> { for execution_operation in execution_operations { @@ -40,8 +72,7 @@ impl ValidationOperation { fee_result.processing_fee = fee_result .processing_fee .checked_add( - signature_verification_operation - .processing_cost(epoch, platform_version)?, + signature_verification_operation.processing_cost(platform_version)?, ) .ok_or(ExecutionError::Overflow( "execution processing fee overflow error", @@ -50,10 +81,78 @@ impl ValidationOperation { ValidationOperation::PrecalculatedOperation(precalculated_operation) => { fee_result.checked_add_assign(precalculated_operation.clone())?; } - ValidationOperation::DoubleSha256 => { + ValidationOperation::DoubleSha256(block_count) => { + fee_result.processing_fee = fee_result + .processing_fee + .checked_add( + platform_version.fee_version.hashing.double_sha256_base + + platform_version.fee_version.hashing.double_sha256_per_block + * (*block_count as u64), + ) + .ok_or(ExecutionError::Overflow( + "execution processing fee overflow error", + ))?; + } + ValidationOperation::RetrieveIdentity(RetrieveIdentityInfo { + query_by_key_id_key_count, + request_balance, + request_revision, + }) => { + let base_cost = match (request_balance, request_revision) { + (true, true) => { + platform_version + .fee_version + .processing + .fetch_identity_balance_and_revision_processing_cost + } + (true, false) => { + platform_version + .fee_version + .processing + .fetch_identity_revision_processing_cost + } + (false, true) => { + platform_version + .fee_version + .processing + .fetch_identity_balance_processing_cost + } + (false, false) => 0, + }; + + let key_cost = platform_version + .fee_version + .processing + .fetch_identity_cost_per_look_up_key_by_id + .checked_mul(*query_by_key_id_key_count as u64) + .ok_or(ExecutionError::Overflow( + "execution processing fee overflow error", + ))?; + + let operation_cost = + base_cost + .checked_add(key_cost) + .ok_or(ExecutionError::Overflow( + "execution processing fee overflow error", + ))?; + fee_result.processing_fee = fee_result .processing_fee - .checked_add(epoch.cost_for_known_cost_item(DoubleSHA256)) + .checked_add(operation_cost) + .ok_or(ExecutionError::Overflow( + "execution processing fee overflow error", + ))?; + } + ValidationOperation::ValidateKeyStructure(key_count) => { + fee_result.processing_fee = fee_result + .processing_fee + .checked_add( + platform_version + .fee_version + .processing + .validate_key_structure + * (*key_count as u64), + ) .ok_or(ExecutionError::Overflow( "execution processing fee overflow error", ))?; diff --git a/packages/rs-drive-abci/src/execution/types/execution_operation/signature_verification_operation.rs b/packages/rs-drive-abci/src/execution/types/execution_operation/signature_verification_operation.rs index 77bf8aeff7..f290dbd312 100644 --- a/packages/rs-drive-abci/src/execution/types/execution_operation/signature_verification_operation.rs +++ b/packages/rs-drive-abci/src/execution/types/execution_operation/signature_verification_operation.rs @@ -1,6 +1,5 @@ use crate::error::Error; use crate::execution::types::execution_operation::OperationLike; -use dpp::block::epoch::Epoch; use dpp::fee::Credits; use dpp::identity::KeyType; use dpp::version::PlatformVersion; @@ -17,14 +16,10 @@ impl SignatureVerificationOperation { } impl OperationLike for SignatureVerificationOperation { - fn processing_cost( - &self, - epoch: &Epoch, - platform_version: &PlatformVersion, - ) -> Result { + fn processing_cost(&self, platform_version: &PlatformVersion) -> Result { Ok(self .signature_type - .signature_verify_cost(platform_version, epoch)?) + .signature_verify_cost(platform_version)?) } fn storage_cost(&self, _platform_version: &PlatformVersion) -> Result { diff --git a/packages/rs-drive-abci/src/execution/types/state_transition_execution_context/mod.rs b/packages/rs-drive-abci/src/execution/types/state_transition_execution_context/mod.rs index 4c01207555..3b46a63ac2 100644 --- a/packages/rs-drive-abci/src/execution/types/state_transition_execution_context/mod.rs +++ b/packages/rs-drive-abci/src/execution/types/state_transition_execution_context/mod.rs @@ -1,8 +1,10 @@ use crate::error::execution::ExecutionError; +use crate::error::Error; use crate::execution::types::execution_operation::ValidationOperation; use crate::execution::types::state_transition_execution_context::v0::StateTransitionExecutionContextV0; use derive_more::From; +use dpp::fee::fee_result::FeeResult; use dpp::version::{DefaultForPlatformVersion, PlatformVersion}; /// V0 module @@ -32,6 +34,9 @@ pub trait StateTransitionExecutionContextMethodsV0 { fn enable_dry_run(&mut self); /// Set us not to be in a dry run fn disable_dry_run(&mut self); + + /// Get the fee costs of all operations in the execution context + fn fee_cost(&self, platform_version: &PlatformVersion) -> Result; } impl StateTransitionExecutionContextMethodsV0 for StateTransitionExecutionContext { @@ -76,6 +81,19 @@ impl StateTransitionExecutionContextMethodsV0 for StateTransitionExecutionContex StateTransitionExecutionContext::V0(v0) => v0.dry_run = false, } } + fn fee_cost(&self, platform_version: &PlatformVersion) -> Result { + match self { + StateTransitionExecutionContext::V0(v0) => { + let mut fee_result = FeeResult::default(); + ValidationOperation::add_many_to_fee_result( + v0.operations.as_slice(), + &mut fee_result, + platform_version, + )?; + Ok(fee_result) + } + } + } } impl DefaultForPlatformVersion for StateTransitionExecutionContext { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs index 8e49fc99cd..46eaf968c6 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs @@ -6,6 +6,7 @@ use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::rpc::core::CoreRPCLike; use dpp::identity::state_transition::OptionallyAssetLockProved; use dpp::prelude::ConsensusValidationResult; +use dpp::ProtocolError; use dpp::state_transition::StateTransition; use dpp::version::{DefaultForPlatformVersion, PlatformVersion}; @@ -22,18 +23,19 @@ pub(super) fn state_transition_to_execution_event_for_check_tx_v0<'a, C: CoreRPC check_tx_level: CheckTxLevel, platform_version: &PlatformVersion, ) -> Result>>, Error> { + // we need to validate the structure, the fees, and the signature + let mut state_transition_execution_context = + StateTransitionExecutionContext::default_for_platform_version(platform_version)?; + match check_tx_level { CheckTxLevel::FirstTimeCheck => { - // we need to validate the structure, the fees, and the signature - let mut state_transition_execution_context = - StateTransitionExecutionContext::default_for_platform_version(platform_version)?; - // Only identity top up and identity create do not have nonces validation if state_transition.has_nonces_validation() { let result = state_transition.validate_nonces( &platform.into(), platform.state.last_block_info(), None, + &mut state_transition_execution_context, platform_version, )?; @@ -136,17 +138,22 @@ pub(super) fn state_transition_to_execution_event_for_check_tx_v0<'a, C: CoreRPC None }; - // This is for identity credit withdrawal and identity credit transfers - if state_transition.has_balance_validation() { + // For identity credit withdrawal and identity credit transfers we have a balance pre check that includes a + // processing amount and the transfer amount. + // For other state transitions we only check a min balance for an amount set per version. + // This is not done for identity create and identity top up who don't have this check here + if state_transition.has_balance_pre_check_validation() { // Validating that we have sufficient balance for a transfer or withdrawal, // this must happen after validating the signature - let result = state_transition.validate_balance( - maybe_identity.as_mut(), - &platform.into(), - platform.state.last_block_info(), - None, - platform_version, - )?; + let identity = + maybe_identity + .as_mut() + .ok_or(ProtocolError::CorruptedCodeExecution( + "identity must be known to validate the balance".to_string(), + ))?; + + let result = state_transition + .validate_minimum_balance_pre_check(identity, platform_version)?; if !result.is_valid() { return Ok( @@ -218,6 +225,7 @@ pub(super) fn state_transition_to_execution_event_for_check_tx_v0<'a, C: CoreRPC &platform.into(), platform.state.last_block_info(), None, + &mut state_transition_execution_context, platform_version, )?; @@ -230,13 +238,6 @@ pub(super) fn state_transition_to_execution_event_for_check_tx_v0<'a, C: CoreRPC } } - // TODO: We aren't calculating processing fees atm. We probably should reconsider this - - let mut state_transition_execution_context = - StateTransitionExecutionContext::default_for_platform_version( - platform_version, - )?; - let state_transition_action_result = state_transition.transform_into_action( platform, platform.state.last_block_info(), diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/mod.rs index bbd758939b..8e42589060 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/common/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/mod.rs @@ -4,5 +4,6 @@ pub mod validate_identity_public_key_contract_bounds; pub mod validate_identity_public_key_ids_dont_exist_in_state; pub mod validate_identity_public_key_ids_exist_in_state; pub mod validate_not_disabling_last_master_key; +pub mod validate_simple_pre_check_balance; pub mod validate_state_transition_identity_signed; pub mod validate_unique_identity_public_key_hashes_in_state; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_simple_pre_check_balance/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_simple_pre_check_balance/mod.rs new file mode 100644 index 0000000000..38ad05a89f --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_simple_pre_check_balance/mod.rs @@ -0,0 +1,39 @@ +use crate::error::execution::ExecutionError; +use crate::error::Error; +use crate::execution::validation::state_transition::common::validate_simple_pre_check_balance::v0::ValidateSimplePreCheckBalanceV0; +use dpp::identity::PartialIdentity; +use dpp::state_transition::StateTransition; +use dpp::validation::SimpleConsensusValidationResult; +use dpp::version::PlatformVersion; +pub mod v0; + +pub trait ValidateSimplePreCheckBalance { + fn validate_simple_pre_check_minimum_balance( + &self, + identity: &PartialIdentity, + platform_version: &PlatformVersion, + ) -> Result; +} + +impl ValidateSimplePreCheckBalance for StateTransition { + fn validate_simple_pre_check_minimum_balance( + &self, + identity: &PartialIdentity, + platform_version: &PlatformVersion, + ) -> Result { + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .common_validation_methods + .validate_simple_pre_check_balance + { + 0 => self.validate_simple_pre_check_minimum_balance_v0(identity, platform_version), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "StateTransition::validate_simple_pre_check_balance".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_simple_pre_check_balance/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_simple_pre_check_balance/v0/mod.rs new file mode 100644 index 0000000000..99ad4d4795 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_simple_pre_check_balance/v0/mod.rs @@ -0,0 +1,78 @@ +use crate::error::execution::ExecutionError; +use crate::error::Error; +use dpp::consensus::state::identity::IdentityInsufficientBalanceError; +use dpp::identity::PartialIdentity; +use dpp::state_transition::StateTransition; +use dpp::validation::SimpleConsensusValidationResult; +use dpp::version::PlatformVersion; + +pub trait ValidateSimplePreCheckBalanceV0 { + fn validate_simple_pre_check_minimum_balance_v0( + &self, + identity: &PartialIdentity, + platform_version: &PlatformVersion, + ) -> Result; +} + +impl ValidateSimplePreCheckBalanceV0 for StateTransition { + fn validate_simple_pre_check_minimum_balance_v0( + &self, + identity: &PartialIdentity, + platform_version: &PlatformVersion, + ) -> Result { + let amount = match self { + StateTransition::DataContractCreate(_) => { + platform_version + .fee_version + .state_transition_min_fees + .contract_create + } + StateTransition::DataContractUpdate(_) => { + platform_version + .fee_version + .state_transition_min_fees + .contract_update + } + StateTransition::DocumentsBatch(_) => { + platform_version + .fee_version + .state_transition_min_fees + .document_batch_transition + } + StateTransition::IdentityCreate(_) | StateTransition::IdentityTopUp(_) => 0, + StateTransition::IdentityCreditWithdrawal(_) => { + platform_version + .fee_version + .state_transition_min_fees + .credit_withdrawal + } + StateTransition::IdentityUpdate(_) => { + platform_version + .fee_version + .state_transition_min_fees + .identity_update + } + StateTransition::IdentityCreditTransfer(_) => { + platform_version + .fee_version + .state_transition_min_fees + .credit_transfer + } + }; + + let balance = + identity + .balance + .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( + "expected to have a balance on identity for identity based operations", + )))?; + + if balance < amount { + return Ok(SimpleConsensusValidationResult::new_with_error( + IdentityInsufficientBalanceError::new(identity.id, balance, amount).into(), + )); + } + + Ok(SimpleConsensusValidationResult::new()) + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_state_transition_identity_signed/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_state_transition_identity_signed/v0/mod.rs index 6f47ec2eed..5453e31883 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_state_transition_identity_signed/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_state_transition_identity_signed/v0/mod.rs @@ -9,7 +9,7 @@ use dpp::consensus::signature::{ use dpp::identity::PartialIdentity; use crate::execution::types::execution_operation::signature_verification_operation::SignatureVerificationOperation; -use crate::execution::types::execution_operation::ValidationOperation; +use crate::execution::types::execution_operation::{RetrieveIdentityInfo, ValidationOperation}; use crate::execution::types::state_transition_execution_context::{ StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0, }; @@ -89,12 +89,18 @@ impl<'a> ValidateStateTransitionIdentitySignatureV0<'a> for StateTransition { let key_request = IdentityKeysRequest::new_specific_key_query(owner_id.as_bytes(), key_id); let maybe_partial_identity = if request_identity_revision { + execution_context.add_operation(ValidationOperation::RetrieveIdentity( + RetrieveIdentityInfo::one_key_and_balance_and_revision(), + )); drive.fetch_identity_balance_with_keys_and_revision( key_request, transaction, platform_version, )? } else { + execution_context.add_operation(ValidationOperation::RetrieveIdentity( + RetrieveIdentityInfo::one_key_and_balance(), + )); drive.fetch_identity_balance_with_keys(key_request, transaction, platform_version)? }; @@ -116,6 +122,7 @@ impl<'a> ValidateStateTransitionIdentitySignatureV0<'a> for StateTransition { return Ok(validation_result); } + // This is very cheap because there will only be 1 key let Some(public_key) = partial_identity.loaded_public_keys.get(&key_id) else { validation_result.add_error(SignatureError::MissingPublicKeyError( MissingPublicKeyError::new(key_id), @@ -123,6 +130,7 @@ impl<'a> ValidateStateTransitionIdentitySignatureV0<'a> for StateTransition { return Ok(validation_result); }; + // Todo: is this needed? if !SUPPORTED_KEY_TYPES.contains(&public_key.key_type()) { validation_result.add_error(SignatureError::InvalidIdentityPublicKeyTypeError( InvalidIdentityPublicKeyTypeError::new(public_key.key_type()), diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs index 1bb7bfd741..e19b7d3011 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs @@ -19,6 +19,7 @@ use drive::grovedb::TransactionArg; use drive::state_transition_action::StateTransitionAction; use crate::execution::types::state_transition_execution_context::{StateTransitionExecutionContext}; +use crate::execution::validation::state_transition::common::validate_simple_pre_check_balance::ValidateSimplePreCheckBalance; use crate::execution::validation::state_transition::common::validate_state_transition_identity_signed::{ValidateStateTransitionIdentitySignature}; use crate::execution::validation::state_transition::identity_create::{StateTransitionStateValidationForIdentityCreateTransitionV0, StateTransitionStructureKnownInStateValidationForIdentityCreateTransitionV0}; use crate::execution::validation::state_transition::identity_top_up::StateTransitionIdentityTopUpTransitionActionTransformer; @@ -48,7 +49,8 @@ pub(super) fn process_state_transition_v0<'a, C: CoreRPCLike>( platform_version, ) } else { - // Currently only identity top up + // Currently only identity top up uses this, + // We will add the cost for a balance retrieval state_transition.retrieve_identity_info( platform.drive, transaction, @@ -77,6 +79,7 @@ pub(super) fn process_state_transition_v0<'a, C: CoreRPCLike>( &platform.into(), platform.state.last_block_info(), transaction, + &mut state_transition_execution_context, platform_version, )?; @@ -89,7 +92,7 @@ pub(super) fn process_state_transition_v0<'a, C: CoreRPCLike>( } } - // Only Data contract update does not have basic structure validation + // Only Data contract state transitions do not have basic structure validation if state_transition.has_basic_structure_validation() { // We validate basic structure validation after verifying the identity, // this is structure validation that does not require state and is already checked on check_tx @@ -109,7 +112,28 @@ pub(super) fn process_state_transition_v0<'a, C: CoreRPCLike>( } } - // Only identity update has advanced structure validation without state + // For identity credit withdrawal and identity credit transfers we have a balance pre check that includes a + // processing amount and the transfer amount. + // For other state transitions we only check a min balance for an amount set per version. + // This is not done for identity create and identity top up who don't have this check here + if state_transition.has_balance_pre_check_validation() { + // Validating that we have sufficient balance for a transfer or withdrawal, + // this must happen after validating the signature + + let identity = maybe_identity + .as_mut() + .ok_or(ProtocolError::CorruptedCodeExecution( + "identity must be known to validate the balance".to_string(), + ))?; + let result = + state_transition.validate_minimum_balance_pre_check(identity, platform_version)?; + + if !result.is_valid() { + return Ok(ConsensusValidationResult::::new_with_errors(result.errors)); + } + } + + // Only identity update and data contract create have advanced structure validation without state if state_transition.has_advanced_structure_validation_without_state() { // Currently only used for Identity Update // Next we have advanced structure validation, this is structure validation that does not require @@ -186,23 +210,6 @@ pub(super) fn process_state_transition_v0<'a, C: CoreRPCLike>( None }; - // This is for identity credit withdrawal and identity credit transfers - if state_transition.has_balance_validation() { - // Validating that we have sufficient balance for a transfer or withdrawal, - // this must happen after validating the signature - let result = state_transition.validate_balance( - maybe_identity.as_mut(), - &platform.into(), - platform.state.last_block_info(), - transaction, - platform_version, - )?; - - if !result.is_valid() { - return Ok(ConsensusValidationResult::::new_with_errors(result.errors)); - } - } - // Validating state // Only identity Top up does not validate state and instead just returns the action for topping up let result = state_transition.validate_state( @@ -331,6 +338,7 @@ pub(crate) trait StateTransitionNonceValidationV0 { platform: &PlatformStateRef, block_info: &BlockInfo, tx: TransactionArg, + execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion, ) -> Result; @@ -384,19 +392,16 @@ pub(crate) trait StateTransitionBalanceValidationV0 { /// # Returns /// /// * `Result, Error>` - A result with either a ConsensusValidationResult containing a StateTransitionAction or an Error. - fn validate_balance( + fn validate_minimum_balance_pre_check( &self, - identity: Option<&mut PartialIdentity>, - platform: &PlatformStateRef, - block_info: &BlockInfo, - tx: TransactionArg, + identity: &PartialIdentity, platform_version: &PlatformVersion, ) -> Result; /// True if the state transition has a balance validation. /// This balance validation is not for the operations of the state transition, but more as a /// quick early verification that the user has the balance they want to transfer or withdraw. - fn has_balance_validation(&self) -> bool { + fn has_balance_pre_check_validation(&self) -> bool { true } } @@ -435,10 +440,7 @@ impl StateTransitionBasicStructureValidationV0 for StateTransition { platform_version: &PlatformVersion, ) -> Result { match self { - StateTransition::DataContractCreate(st) => { - st.validate_basic_structure(platform_version) - } - StateTransition::DataContractUpdate(_) => { + StateTransition::DataContractCreate(_) | StateTransition::DataContractUpdate(_) => { // no basic structure validation Ok(SimpleConsensusValidationResult::new()) } @@ -455,7 +457,10 @@ impl StateTransitionBasicStructureValidationV0 for StateTransition { } } fn has_basic_structure_validation(&self) -> bool { - !matches!(self, StateTransition::DataContractUpdate(_)) + !matches!( + self, + StateTransition::DataContractCreate(_) | StateTransition::DataContractUpdate(_) + ) } } @@ -465,27 +470,52 @@ impl StateTransitionNonceValidationV0 for StateTransition { platform: &PlatformStateRef, block_info: &BlockInfo, tx: TransactionArg, + execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion, ) -> Result { match self { - StateTransition::DocumentsBatch(st) => { - st.validate_nonces(platform, block_info, tx, platform_version) - } - StateTransition::DataContractCreate(st) => { - st.validate_nonces(platform, block_info, tx, platform_version) - } - StateTransition::DataContractUpdate(st) => { - st.validate_nonces(platform, block_info, tx, platform_version) - } - StateTransition::IdentityUpdate(st) => { - st.validate_nonces(platform, block_info, tx, platform_version) - } - StateTransition::IdentityCreditTransfer(st) => { - st.validate_nonces(platform, block_info, tx, platform_version) - } - StateTransition::IdentityCreditWithdrawal(st) => { - st.validate_nonces(platform, block_info, tx, platform_version) - } + StateTransition::DocumentsBatch(st) => st.validate_nonces( + platform, + block_info, + tx, + execution_context, + platform_version, + ), + StateTransition::DataContractCreate(st) => st.validate_nonces( + platform, + block_info, + tx, + execution_context, + platform_version, + ), + StateTransition::DataContractUpdate(st) => st.validate_nonces( + platform, + block_info, + tx, + execution_context, + platform_version, + ), + StateTransition::IdentityUpdate(st) => st.validate_nonces( + platform, + block_info, + tx, + execution_context, + platform_version, + ), + StateTransition::IdentityCreditTransfer(st) => st.validate_nonces( + platform, + block_info, + tx, + execution_context, + platform_version, + ), + StateTransition::IdentityCreditWithdrawal(st) => st.validate_nonces( + platform, + block_info, + tx, + execution_context, + platform_version, + ), _ => Ok(SimpleConsensusValidationResult::new()), } } @@ -504,39 +534,44 @@ impl StateTransitionNonceValidationV0 for StateTransition { } impl StateTransitionBalanceValidationV0 for StateTransition { - fn validate_balance( + fn validate_minimum_balance_pre_check( &self, - identity: Option<&mut PartialIdentity>, - platform: &PlatformStateRef, - block_info: &BlockInfo, - tx: TransactionArg, + identity: &PartialIdentity, platform_version: &PlatformVersion, ) -> Result { match self { StateTransition::IdentityCreditTransfer(st) => { - st.validate_balance(identity, platform, block_info, tx, platform_version) + st.validate_minimum_balance_pre_check(identity, platform_version) } StateTransition::IdentityCreditWithdrawal(st) => { - st.validate_balance(identity, platform, block_info, tx, platform_version) + st.validate_minimum_balance_pre_check(identity, platform_version) + } + StateTransition::DataContractCreate(_) + | StateTransition::DataContractUpdate(_) + | StateTransition::DocumentsBatch(_) + | StateTransition::IdentityUpdate(_) => { + self.validate_simple_pre_check_minimum_balance(identity, platform_version) + } + StateTransition::IdentityCreate(_) | StateTransition::IdentityTopUp(_) => { + Ok(SimpleConsensusValidationResult::new()) } - _ => Ok(SimpleConsensusValidationResult::new()), } } - fn has_balance_validation(&self) -> bool { + fn has_balance_pre_check_validation(&self) -> bool { matches!( self, StateTransition::IdentityCreditTransfer(_) | StateTransition::IdentityCreditWithdrawal(_) + | StateTransition::DataContractCreate(_) + | StateTransition::DataContractUpdate(_) + | StateTransition::DocumentsBatch(_) + | StateTransition::IdentityUpdate(_) ) } } impl StateTransitionAdvancedStructureValidationV0 for StateTransition { - fn has_advanced_structure_validation_without_state(&self) -> bool { - matches!(self, StateTransition::IdentityUpdate(_)) - } - fn validate_advanced_structure( &self, identity: &PartialIdentity, @@ -575,9 +610,19 @@ impl StateTransitionAdvancedStructureValidationV0 for StateTransition { })), } } + StateTransition::DataContractCreate(st) => { + st.validate_advanced_structure(identity, execution_context, platform_version) + } _ => Ok(ConsensusValidationResult::::new()), } } + + fn has_advanced_structure_validation_without_state(&self) -> bool { + matches!( + self, + StateTransition::IdentityUpdate(_) | StateTransition::DataContractCreate(_) + ) + } } impl StateTransitionStructureKnownInStateValidationV0 for StateTransition { @@ -671,13 +716,16 @@ impl StateTransitionIdentityBasedSignatureValidationV0 for StateTransition { &self, drive: &Drive, tx: TransactionArg, - _execution_context: &mut StateTransitionExecutionContext, + execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion, ) -> Result, Error> { match self { - StateTransition::IdentityTopUp(st) => { - Ok(st.retrieve_topped_up_identity(drive, tx, platform_version)?) - } + StateTransition::IdentityTopUp(st) => Ok(st.retrieve_topped_up_identity( + drive, + tx, + execution_context, + platform_version, + )?), _ => Ok(ConsensusValidationResult::new()), } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/basic_structure/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/advanced_structure/mod.rs similarity index 100% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/basic_structure/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/advanced_structure/mod.rs diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/advanced_structure/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/advanced_structure/v0/mod.rs new file mode 100644 index 0000000000..f986fe7275 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/advanced_structure/v0/mod.rs @@ -0,0 +1,54 @@ +use crate::error::Error; +use crate::execution::types::execution_operation::ValidationOperation; +use crate::execution::types::state_transition_execution_context::{ + StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0, +}; +use dpp::consensus::basic::data_contract::InvalidDataContractIdError; +use dpp::consensus::basic::BasicError; +use dpp::prelude::DataContract; +use dpp::state_transition::data_contract_create_transition::accessors::DataContractCreateTransitionAccessorsV0; +use dpp::state_transition::data_contract_create_transition::DataContractCreateTransition; +use dpp::validation::ConsensusValidationResult; +use drive::state_transition_action::system::bump_identity_nonce_action::BumpIdentityNonceAction; +use drive::state_transition_action::StateTransitionAction; + +pub(in crate::execution::validation::state_transition::state_transitions::data_contract_create) trait DataContractCreatedStateTransitionAdvancedStructureValidationV0 { + fn validate_advanced_structure_v0(&self, execution_context: &mut StateTransitionExecutionContext) -> Result, Error>; +} + +impl DataContractCreatedStateTransitionAdvancedStructureValidationV0 + for DataContractCreateTransition +{ + fn validate_advanced_structure_v0( + &self, + execution_context: &mut StateTransitionExecutionContext, + ) -> Result, Error> { + // Validate data contract id + let generated_id = DataContract::generate_data_contract_id_v0( + self.data_contract().owner_id(), + self.identity_nonce(), + ); + + // This hash will only take 1 block (64 bytes) + execution_context.add_operation(ValidationOperation::DoubleSha256(1)); + + if generated_id != self.data_contract().id() { + let bump_action = StateTransitionAction::BumpIdentityNonceAction( + BumpIdentityNonceAction::from_borrowed_data_contract_create_transition(self), + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + vec![ + BasicError::InvalidDataContractIdError(InvalidDataContractIdError::new( + generated_id.to_vec(), + self.data_contract().id().to_vec(), + )) + .into(), + ], + )); + } + + Ok(ConsensusValidationResult::default()) + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/basic_structure/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/basic_structure/v0/mod.rs deleted file mode 100644 index 4f3cde6428..0000000000 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/basic_structure/v0/mod.rs +++ /dev/null @@ -1,37 +0,0 @@ -use crate::error::Error; -use dpp::consensus::basic::data_contract::InvalidDataContractIdError; -use dpp::consensus::basic::BasicError; -use dpp::prelude::DataContract; -use dpp::state_transition::data_contract_create_transition::accessors::DataContractCreateTransitionAccessorsV0; -use dpp::state_transition::data_contract_create_transition::DataContractCreateTransition; -use dpp::validation::SimpleConsensusValidationResult; -use dpp::version::PlatformVersion; - -pub(in crate::execution::validation::state_transition::state_transitions::data_contract_create) trait DataContractCreatedStateTransitionBasicStructureValidationV0 { - fn validate_basic_structure_v0(&self, platform_version: &PlatformVersion) -> Result; -} - -impl DataContractCreatedStateTransitionBasicStructureValidationV0 for DataContractCreateTransition { - fn validate_basic_structure_v0( - &self, - _platform_version: &PlatformVersion, - ) -> Result { - // Validate data contract id - let generated_id = DataContract::generate_data_contract_id_v0( - self.data_contract().owner_id(), - self.identity_nonce(), - ); - - if generated_id != self.data_contract().id() { - return Ok(SimpleConsensusValidationResult::new_with_error( - BasicError::InvalidDataContractIdError(InvalidDataContractIdError::new( - generated_id.to_vec(), - self.data_contract().id().to_vec(), - )) - .into(), - )); - } - - Ok(SimpleConsensusValidationResult::default()) - } -} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/identity_nonce/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/identity_nonce/mod.rs index 28a7bbe9a4..a220f2d16f 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/identity_nonce/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/identity_nonce/mod.rs @@ -1,5 +1,6 @@ use crate::error::execution::ExecutionError; use crate::error::Error; +use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; use crate::execution::validation::state_transition::data_contract_create::identity_nonce::v0::DataContractCreateTransitionIdentityNonceV0; use crate::execution::validation::state_transition::processor::v0::StateTransitionNonceValidationV0; use crate::platform_types::platform::PlatformStateRef; @@ -16,6 +17,7 @@ impl StateTransitionNonceValidationV0 for DataContractCreateTransition { platform: &PlatformStateRef, block_info: &BlockInfo, tx: TransactionArg, + execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion, ) -> Result { match platform_version @@ -25,7 +27,13 @@ impl StateTransitionNonceValidationV0 for DataContractCreateTransition { .contract_create_state_transition .nonce { - Some(0) => self.validate_nonce_v0(platform, block_info, tx, platform_version), + Some(0) => self.validate_nonce_v0( + platform, + block_info, + tx, + execution_context, + platform_version, + ), Some(version) => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "data contract create transition: validate_nonces".to_string(), known_versions: vec![0], diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/identity_nonce/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/identity_nonce/v0/mod.rs index 580496810a..e3d69ac084 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/identity_nonce/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/identity_nonce/v0/mod.rs @@ -10,6 +10,10 @@ use dpp::state_transition::data_contract_create_transition::DataContractCreateTr use dpp::validation::SimpleConsensusValidationResult; +use crate::execution::types::execution_operation::ValidationOperation; +use crate::execution::types::state_transition_execution_context::{ + StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0, +}; use crate::platform_types::platform::PlatformStateRef; use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; @@ -21,6 +25,7 @@ pub(in crate::execution::validation::state_transition::state_transitions) trait platform: &PlatformStateRef, block_info: &BlockInfo, tx: TransactionArg, + execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion, ) -> Result; } @@ -31,6 +36,7 @@ impl DataContractCreateTransitionIdentityNonceV0 for DataContractCreateTransitio platform: &PlatformStateRef, block_info: &BlockInfo, tx: TransactionArg, + execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion, ) -> Result { let revision_nonce = self.identity_nonce(); @@ -44,7 +50,7 @@ impl DataContractCreateTransitionIdentityNonceV0 for DataContractCreateTransitio let identity_id = self.data_contract().owner_id(); //todo: use fees - let (existing_nonce, _unused_fees) = platform.drive.fetch_identity_nonce_with_fees( + let (existing_nonce, fee) = platform.drive.fetch_identity_nonce_with_fees( identity_id.to_buffer(), block_info, true, @@ -52,6 +58,8 @@ impl DataContractCreateTransitionIdentityNonceV0 for DataContractCreateTransitio platform_version, )?; + execution_context.add_operation(ValidationOperation::PrecalculatedOperation(fee)); + let result = if let Some(existing_nonce) = existing_nonce { validate_identity_nonce_update(existing_nonce, revision_nonce, identity_id) } else { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs index 9282e36f36..4110e97549 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs @@ -1,11 +1,11 @@ -mod basic_structure; +mod advanced_structure; mod identity_nonce; mod state; use dpp::block::block_info::BlockInfo; +use dpp::identity::PartialIdentity; use dpp::prelude::ConsensusValidationResult; use dpp::state_transition::data_contract_create_transition::DataContractCreateTransition; -use dpp::validation::SimpleConsensusValidationResult; use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; @@ -15,13 +15,13 @@ use crate::error::execution::ExecutionError; use crate::error::Error; use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; -use crate::execution::validation::state_transition::data_contract_create::basic_structure::v0::DataContractCreatedStateTransitionBasicStructureValidationV0; +use crate::execution::validation::state_transition::data_contract_create::advanced_structure::v0::DataContractCreatedStateTransitionAdvancedStructureValidationV0; use crate::execution::validation::state_transition::data_contract_create::state::v0::DataContractCreateStateTransitionStateValidationV0; use crate::platform_types::platform::PlatformRef; use crate::rpc::core::CoreRPCLike; use crate::execution::validation::state_transition::processor::v0::{ - StateTransitionBasicStructureValidationV0, StateTransitionStateValidationV0, + StateTransitionAdvancedStructureValidationV0, StateTransitionStateValidationV0, }; use crate::execution::validation::state_transition::transformer::StateTransitionActionTransformerV0; use crate::execution::validation::state_transition::ValidationMode; @@ -66,11 +66,13 @@ impl StateTransitionActionTransformerV0 for DataContractCreateTransition { } } -impl StateTransitionBasicStructureValidationV0 for DataContractCreateTransition { - fn validate_basic_structure( +impl StateTransitionAdvancedStructureValidationV0 for DataContractCreateTransition { + fn validate_advanced_structure( &self, + _identity: &PartialIdentity, + execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion, - ) -> Result { + ) -> Result, Error> { match platform_version .drive_abci .validation_and_processing @@ -78,7 +80,7 @@ impl StateTransitionBasicStructureValidationV0 for DataContractCreateTransition .contract_create_state_transition .basic_structure { - Some(0) => self.validate_basic_structure_v0(platform_version), + Some(0) => self.validate_advanced_structure_v0(execution_context), Some(version) => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "data contract create transition: validate_basic_structure".to_string(), known_versions: vec![0], @@ -90,6 +92,10 @@ impl StateTransitionBasicStructureValidationV0 for DataContractCreateTransition })), } } + + fn has_advanced_structure_validation_without_state(&self) -> bool { + true + } } impl StateTransitionStateValidationV0 for DataContractCreateTransition { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/identity_contract_nonce/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/identity_contract_nonce/mod.rs index ebf8d8267a..6b977fccd6 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/identity_contract_nonce/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/identity_contract_nonce/mod.rs @@ -5,6 +5,7 @@ use drive::grovedb::TransactionArg; use dpp::version::PlatformVersion; use crate::error::Error; use crate::error::execution::ExecutionError; +use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; use crate::execution::validation::state_transition::data_contract_update::identity_contract_nonce::v0::DataContractUpdateStateTransitionIdentityContractNonceV0; use crate::execution::validation::state_transition::processor::v0::{StateTransitionNonceValidationV0}; use crate::platform_types::platform::{PlatformStateRef}; @@ -17,6 +18,7 @@ impl StateTransitionNonceValidationV0 for DataContractUpdateTransition { platform: &PlatformStateRef, block_info: &BlockInfo, tx: TransactionArg, + execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion, ) -> Result { match platform_version @@ -26,9 +28,13 @@ impl StateTransitionNonceValidationV0 for DataContractUpdateTransition { .contract_update_state_transition .nonce { - Some(0) => { - self.validate_identity_contract_nonce_v0(platform, block_info, tx, platform_version) - } + Some(0) => self.validate_identity_contract_nonce_v0( + platform, + block_info, + tx, + execution_context, + platform_version, + ), Some(version) => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "data contract update transition: validate_identity_contract_nonce" .to_string(), diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/identity_contract_nonce/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/identity_contract_nonce/v0/mod.rs index f5e4f22594..2f012f5a0c 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/identity_contract_nonce/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/identity_contract_nonce/v0/mod.rs @@ -10,6 +10,10 @@ use dpp::state_transition::data_contract_update_transition::DataContractUpdateTr use dpp::validation::SimpleConsensusValidationResult; +use crate::execution::types::execution_operation::ValidationOperation; +use crate::execution::types::state_transition_execution_context::{ + StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0, +}; use crate::platform_types::platform::PlatformStateRef; use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; @@ -21,6 +25,7 @@ pub(in crate::execution::validation::state_transition::state_transitions) trait platform: &PlatformStateRef, block_info: &BlockInfo, tx: TransactionArg, + execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion, ) -> Result; } @@ -31,6 +36,7 @@ impl DataContractUpdateStateTransitionIdentityContractNonceV0 for DataContractUp platform: &PlatformStateRef, block_info: &BlockInfo, tx: TransactionArg, + execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion, ) -> Result { let revision_nonce = self.identity_contract_nonce(); @@ -44,15 +50,16 @@ impl DataContractUpdateStateTransitionIdentityContractNonceV0 for DataContractUp let identity_id = self.data_contract().owner_id(); let contract_id = self.data_contract().id(); - let (existing_nonce, _unused_fees) = - platform.drive.fetch_identity_contract_nonce_with_fees( - identity_id.to_buffer(), - contract_id.to_buffer(), - block_info, - true, - tx, - platform_version, - )?; + let (existing_nonce, fee) = platform.drive.fetch_identity_contract_nonce_with_fees( + identity_id.to_buffer(), + contract_id.to_buffer(), + block_info, + true, + tx, + platform_version, + )?; + + execution_context.add_operation(ValidationOperation::PrecalculatedOperation(fee)); let result = if let Some(existing_nonce) = existing_nonce { validate_identity_nonce_update(existing_nonce, revision_nonce, identity_id) diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/v0/mod.rs index a30ad8750a..94bb7a799b 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/v0/mod.rs @@ -26,7 +26,8 @@ use dpp::state_transition::documents_batch_transition::document_create_transitio use drive::state_transition_action::StateTransitionAction; use drive::state_transition_action::system::bump_identity_data_contract_nonce_action::BumpIdentityDataContractNonceAction; use crate::error::execution::ExecutionError; -use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; +use crate::execution::types::execution_operation::ValidationOperation; +use crate::execution::types::state_transition_execution_context::{StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0}; pub(in crate::execution::validation::state_transition::state_transitions::documents_batch) trait DocumentsBatchStateTransitionStructureValidationV0 { @@ -44,7 +45,7 @@ impl DocumentsBatchStateTransitionStructureValidationV0 for DocumentsBatchTransi &self, action: &DocumentsBatchTransitionAction, identity: &PartialIdentity, - _execution_context: &mut StateTransitionExecutionContext, + execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion, ) -> Result, Error> { let security_levels = action.contract_based_security_level_requirement()?; @@ -88,6 +89,9 @@ impl DocumentsBatchStateTransitionStructureValidationV0 for DocumentsBatchTransi &create_transition.entropy(), ); + // This hash will take 2 blocks (128 bytes) + execution_context.add_operation(ValidationOperation::DoubleSha256(2)); + let id = create_transition.base().id(); if generated_document_id != id { let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/identity_contract_nonce/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/identity_contract_nonce/v0/mod.rs index 3240e4a875..1487567a4b 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/identity_contract_nonce/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/identity_contract_nonce/v0/mod.rs @@ -9,6 +9,10 @@ use dpp::state_transition::StateTransitionLike; use dpp::validation::SimpleConsensusValidationResult; +use crate::execution::types::execution_operation::ValidationOperation; +use crate::execution::types::state_transition_execution_context::{ + StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0, +}; use crate::platform_types::platform::PlatformStateRef; use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; @@ -20,6 +24,7 @@ pub(in crate::execution::validation::state_transition::state_transitions::docume platform: &PlatformStateRef, block_info: &BlockInfo, tx: TransactionArg, + execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion, ) -> Result; } @@ -30,21 +35,23 @@ impl DocumentsBatchStateTransitionIdentityContractNonceV0 for DocumentsBatchTran platform: &PlatformStateRef, block_info: &BlockInfo, tx: TransactionArg, + execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion, ) -> Result { // We should validate that all newly created documents have valid ids for transition in self.transitions() { let revision_nonce = transition.identity_contract_nonce(); let identity_id = self.owner_id(); - let (existing_nonce, _unused_fees) = - platform.drive.fetch_identity_contract_nonce_with_fees( - identity_id.to_buffer(), - transition.data_contract_id().to_buffer(), - block_info, - true, - tx, - platform_version, - )?; + let (existing_nonce, fee) = platform.drive.fetch_identity_contract_nonce_with_fees( + identity_id.to_buffer(), + transition.data_contract_id().to_buffer(), + block_info, + true, + tx, + platform_version, + )?; + + execution_context.add_operation(ValidationOperation::PrecalculatedOperation(fee)); let result = if let Some(existing_nonce) = existing_nonce { validate_identity_nonce_update(existing_nonce, revision_nonce, identity_id) diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs index b4c531e148..f7a661a625 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs @@ -85,9 +85,11 @@ impl StateTransitionBasicStructureValidationV0 for DocumentsBatchTransition { .documents_batch_state_transition .basic_structure { - 0 => self - .validate_base_structure(platform_version) - .map_err(Error::Protocol), + 0 => { + // There is nothing expensive here + self.validate_base_structure(platform_version) + .map_err(Error::Protocol) + } version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "documents batch transition: base structure".to_string(), known_versions: vec![0], @@ -103,6 +105,7 @@ impl StateTransitionNonceValidationV0 for DocumentsBatchTransition { platform: &PlatformStateRef, block_info: &BlockInfo, tx: TransactionArg, + execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion, ) -> Result { match platform_version @@ -116,6 +119,7 @@ impl StateTransitionNonceValidationV0 for DocumentsBatchTransition { platform, block_info, tx, + execution_context, platform_version, ), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/advanced_structure/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/advanced_structure/v0/mod.rs index 1834848b02..10ccad492b 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/advanced_structure/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/advanced_structure/v0/mod.rs @@ -1,5 +1,8 @@ use crate::error::Error; -use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; +use crate::execution::types::execution_operation::ValidationOperation; +use crate::execution::types::state_transition_execution_context::{ + StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0, +}; use crate::execution::validation::state_transition::identity_create::identity_and_signatures::v0::IdentityCreateStateTransitionIdentityAndSignaturesValidationV0; use dpp::consensus::basic::invalid_identifier_error::InvalidIdentifierError; use dpp::consensus::basic::BasicError; @@ -10,6 +13,7 @@ use dpp::state_transition::identity_create_transition::IdentityCreateTransition; use dpp::state_transition::public_key_in_creation::IdentityPublicKeyInCreation; use dpp::validation::ConsensusValidationResult; use dpp::version::PlatformVersion; +use dpp::ProtocolError; use drive::state_transition_action::identity::identity_create::IdentityCreateTransitionAction; use drive::state_transition_action::system::partially_use_asset_lock_action::PartiallyUseAssetLockAction; use drive::state_transition_action::StateTransitionAction; @@ -38,6 +42,11 @@ impl IdentityCreateStateTransitionAdvancedStructureValidationV0 for IdentityCrea // We don't need to return a consensus error here because the outpoint will already have been checked in the transformation into an action let identifier_from_outpoint = self.asset_lock_proof().create_identifier()?; + // Creating an identifier costs 1 block hash (64 bytes) + // The cost should come here after, as the protocol error is just if no outpoint exists + + execution_context.add_operation(ValidationOperation::DoubleSha256(1)); + if identifier_from_outpoint != self.identity_id() { let penalty = platform_version .drive_abci @@ -45,8 +54,9 @@ impl IdentityCreateStateTransitionAdvancedStructureValidationV0 for IdentityCrea .penalties .identity_id_not_correct; - // todo: pay for processing - let used_credits = penalty; // + processing + let used_credits = penalty + .checked_add(execution_context.fee_cost(platform_version)?.processing_fee) + .ok_or(ProtocolError::Overflow("processing fee overflow error"))?; // Most probably an attempted attack let bump_action = StateTransitionAction::PartiallyUseAssetLockAction( @@ -82,8 +92,9 @@ impl IdentityCreateStateTransitionAdvancedStructureValidationV0 for IdentityCrea .penalties .validation_of_added_keys_structure_failure; - // todo: pay for processing - let used_credits = penalty; // + processing + let used_credits = penalty + .checked_add(execution_context.fee_cost(platform_version)?.processing_fee) + .ok_or(ProtocolError::Overflow("processing fee overflow error"))?; let bump_action = StateTransitionAction::PartiallyUseAssetLockAction( PartiallyUseAssetLockAction::from_borrowed_identity_create_transition_action( @@ -111,8 +122,9 @@ impl IdentityCreateStateTransitionAdvancedStructureValidationV0 for IdentityCrea .penalties .validation_of_added_keys_proof_of_possession_failure; - // todo: pay for processing - let used_credits = penalty; // + processing + let used_credits = penalty + .checked_add(execution_context.fee_cost(platform_version)?.processing_fee) + .ok_or(ProtocolError::Overflow("processing fee overflow error"))?; let bump_action = StateTransitionAction::PartiallyUseAssetLockAction( PartiallyUseAssetLockAction::from_borrowed_identity_create_transition_action( diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/mod.rs index 293eb51521..63bc921b80 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/mod.rs @@ -86,7 +86,10 @@ impl StateTransitionBasicStructureValidationV0 for IdentityCreateTransition { .identity_create_state_transition .basic_structure { - Some(0) => self.validate_basic_structure_v0(platform_version), + Some(0) => { + // There is nothing expensive to add as validation methods to the execution context + self.validate_basic_structure_v0(platform_version) + } Some(version) => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "identity create transition: validate_basic_structure".to_string(), known_versions: vec![0], diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/state/v0/mod.rs index eb803d82bd..3a552c8b84 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/state/v0/mod.rs @@ -25,7 +25,7 @@ use drive::state_transition_action::StateTransitionAction; use crate::error::execution::ExecutionError; use crate::execution::types::execution_operation::signature_verification_operation::SignatureVerificationOperation; -use crate::execution::types::execution_operation::ValidationOperation; +use crate::execution::types::execution_operation::{ValidationOperation, SHA256_BLOCK_SIZE}; use crate::execution::types::state_transition_execution_context::{ StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0, }; @@ -226,7 +226,9 @@ impl IdentityCreateStateTransitionStateValidationV0 for IdentityCreateTransition )) })?; - execution_context.add_operation(ValidationOperation::DoubleSha256); + let block_count = signable_bytes.len() as u16 / SHA256_BLOCK_SIZE; + + execution_context.add_operation(ValidationOperation::DoubleSha256(block_count)); execution_context.add_operation(ValidationOperation::SignatureVerification( SignatureVerificationOperation::new(KeyType::ECDSA_HASH160), )); diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/balance/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/balance/mod.rs index 175b9c8a52..da04bb187b 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/balance/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/balance/mod.rs @@ -2,22 +2,16 @@ use crate::error::execution::ExecutionError; use crate::error::Error; use crate::execution::validation::state_transition::identity_credit_transfer::balance::v0::IdentityCreditTransferTransitionBalanceValidationV0; use crate::execution::validation::state_transition::processor::v0::StateTransitionBalanceValidationV0; -use crate::platform_types::platform::PlatformStateRef; -use dpp::block::block_info::BlockInfo; use dpp::identity::PartialIdentity; use dpp::state_transition::identity_credit_transfer_transition::IdentityCreditTransferTransition; use dpp::validation::SimpleConsensusValidationResult; use dpp::version::PlatformVersion; -use drive::grovedb::TransactionArg; pub(crate) mod v0; impl StateTransitionBalanceValidationV0 for IdentityCreditTransferTransition { - fn validate_balance( + fn validate_minimum_balance_pre_check( &self, - identity: Option<&mut PartialIdentity>, - platform: &PlatformStateRef, - block_info: &BlockInfo, - tx: TransactionArg, + identity: &PartialIdentity, platform_version: &PlatformVersion, ) -> Result { match platform_version @@ -25,10 +19,10 @@ impl StateTransitionBalanceValidationV0 for IdentityCreditTransferTransition { .validation_and_processing .state_transitions .identity_credit_transfer_state_transition - .balance + .advanced_minimum_balance_pre_check { Some(0) => { - self.validate_balance_v0(identity, platform, block_info, tx, platform_version) + self.validate_advanced_minimum_balance_pre_check_v0(identity, platform_version) } Some(version) => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "identity credit transfer transition: validate_balance".to_string(), diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/balance/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/balance/v0/mod.rs index 9a75dc331e..6ea45ee35e 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/balance/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/balance/v0/mod.rs @@ -1,7 +1,4 @@ use crate::error::Error; -use dpp::balances::credits::MIN_LEFTOVER_CREDITS_BEFORE_PROCESSING; -use dpp::block::block_info::BlockInfo; -use dpp::consensus::signature::IdentityNotFoundError; use dpp::consensus::state::identity::IdentityInsufficientBalanceError; use dpp::identity::PartialIdentity; use dpp::state_transition::identity_credit_transfer_transition::accessors::IdentityCreditTransferTransitionAccessorsV0; @@ -9,68 +6,32 @@ use dpp::state_transition::identity_credit_transfer_transition::IdentityCreditTr use dpp::validation::SimpleConsensusValidationResult; -use crate::platform_types::platform::PlatformStateRef; +use crate::error::execution::ExecutionError; use dpp::version::PlatformVersion; -use drive::grovedb::TransactionArg; pub(in crate::execution::validation::state_transition::state_transitions) trait IdentityCreditTransferTransitionBalanceValidationV0 { - fn validate_balance_v0( + fn validate_advanced_minimum_balance_pre_check_v0( &self, - identity: Option<&mut PartialIdentity>, - platform: &PlatformStateRef, - block_info: &BlockInfo, - tx: TransactionArg, + identity: &PartialIdentity, platform_version: &PlatformVersion, ) -> Result; } impl IdentityCreditTransferTransitionBalanceValidationV0 for IdentityCreditTransferTransition { - fn validate_balance_v0( + fn validate_advanced_minimum_balance_pre_check_v0( &self, - identity: Option<&mut PartialIdentity>, - platform: &PlatformStateRef, - _unused_block_info: &BlockInfo, - tx: TransactionArg, + identity: &PartialIdentity, platform_version: &PlatformVersion, ) -> Result { - let balance = if let Some(identity) = identity { - if let Some(balance) = identity.balance { - balance - } else { - let maybe_existing_identity_balance = platform.drive.fetch_identity_balance( - self.identity_id().to_buffer(), - tx, - platform_version, - )?; - - let Some(existing_identity_balance) = maybe_existing_identity_balance else { - return Ok(SimpleConsensusValidationResult::new_with_error( - IdentityNotFoundError::new(self.identity_id()).into(), - )); - }; - - identity.balance = Some(existing_identity_balance); - - existing_identity_balance - } - } else { - let maybe_existing_identity_balance = platform.drive.fetch_identity_balance( - self.identity_id().to_buffer(), - tx, - platform_version, - )?; - - let Some(existing_identity_balance) = maybe_existing_identity_balance else { - return Ok(SimpleConsensusValidationResult::new_with_error( - IdentityNotFoundError::new(self.identity_id()).into(), - )); - }; - - existing_identity_balance - }; - - if balance < self.amount() + MIN_LEFTOVER_CREDITS_BEFORE_PROCESSING { + let balance = + identity + .balance + .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( + "expected to have a balance on identity for credit transfer transition", + )))?; + + if balance < self.amount().checked_add(platform_version.fee_version.state_transition_min_fees.credit_transfer).ok_or(Error::Execution(ExecutionError::Overflow("overflow when adding amount and min_leftover_credits_before_processing in identity credit transfer")))? { return Ok(SimpleConsensusValidationResult::new_with_error( IdentityInsufficientBalanceError::new(self.identity_id(), balance, self.amount()) .into(), diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/mod.rs index 292d3488cc..771af49746 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/mod.rs @@ -65,7 +65,10 @@ impl StateTransitionBasicStructureValidationV0 for IdentityCreditTransferTransit .identity_credit_transfer_state_transition .basic_structure { - Some(0) => self.validate_basic_structure_v0(), + Some(0) => { + // There is nothing expensive here + self.validate_basic_structure_v0() + } Some(version) => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "identity credit transfer transition: validate_basic_structure".to_string(), known_versions: vec![0], diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/nonce/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/nonce/mod.rs index eecbddc5d4..b6a24435f9 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/nonce/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/nonce/mod.rs @@ -1,5 +1,6 @@ use crate::error::execution::ExecutionError; use crate::error::Error; +use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; use crate::execution::validation::state_transition::identity_credit_transfer::nonce::v0::IdentityCreditTransferTransitionIdentityNonceV0; use crate::execution::validation::state_transition::processor::v0::StateTransitionNonceValidationV0; use crate::platform_types::platform::PlatformStateRef; @@ -16,6 +17,7 @@ impl StateTransitionNonceValidationV0 for IdentityCreditTransferTransition { platform: &PlatformStateRef, block_info: &BlockInfo, tx: TransactionArg, + execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion, ) -> Result { match platform_version @@ -25,7 +27,13 @@ impl StateTransitionNonceValidationV0 for IdentityCreditTransferTransition { .identity_credit_transfer_state_transition .nonce { - Some(0) => self.validate_nonce_v0(platform, block_info, tx, platform_version), + Some(0) => self.validate_nonce_v0( + platform, + block_info, + tx, + execution_context, + platform_version, + ), Some(version) => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "identity credit transfer transition: validate_nonces".to_string(), known_versions: vec![0], diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/nonce/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/nonce/v0/mod.rs index d39bd3b5a6..290f8a3317 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/nonce/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/nonce/v0/mod.rs @@ -10,6 +10,10 @@ use dpp::state_transition::identity_credit_transfer_transition::IdentityCreditTr use dpp::validation::SimpleConsensusValidationResult; +use crate::execution::types::execution_operation::ValidationOperation; +use crate::execution::types::state_transition_execution_context::{ + StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0, +}; use crate::platform_types::platform::PlatformStateRef; use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; @@ -21,6 +25,7 @@ pub(in crate::execution::validation::state_transition::state_transitions) trait platform: &PlatformStateRef, block_info: &BlockInfo, tx: TransactionArg, + execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion, ) -> Result; } @@ -31,6 +36,7 @@ impl IdentityCreditTransferTransitionIdentityNonceV0 for IdentityCreditTransferT platform: &PlatformStateRef, block_info: &BlockInfo, tx: TransactionArg, + execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion, ) -> Result { let revision_nonce = self.nonce(); @@ -43,8 +49,8 @@ impl IdentityCreditTransferTransitionIdentityNonceV0 for IdentityCreditTransferT } let identity_id = self.identity_id(); - //todo: use fees - let (existing_nonce, _unused_fees) = platform.drive.fetch_identity_nonce_with_fees( + + let (existing_nonce, fee) = platform.drive.fetch_identity_nonce_with_fees( identity_id.to_buffer(), block_info, true, @@ -52,6 +58,8 @@ impl IdentityCreditTransferTransitionIdentityNonceV0 for IdentityCreditTransferT platform_version, )?; + execution_context.add_operation(ValidationOperation::PrecalculatedOperation(fee)); + let result = if let Some(existing_nonce) = existing_nonce { validate_identity_nonce_update(existing_nonce, revision_nonce, identity_id) } else { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/balance/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/balance/mod.rs index 291d5b0f72..60eeb8047b 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/balance/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/balance/mod.rs @@ -2,22 +2,16 @@ use crate::error::execution::ExecutionError; use crate::error::Error; use crate::execution::validation::state_transition::identity_credit_withdrawal::balance::v0::IdentityCreditTransferTransitionBalanceValidationV0; use crate::execution::validation::state_transition::processor::v0::StateTransitionBalanceValidationV0; -use crate::platform_types::platform::PlatformStateRef; -use dpp::block::block_info::BlockInfo; use dpp::identity::PartialIdentity; use dpp::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition; use dpp::validation::SimpleConsensusValidationResult; use dpp::version::PlatformVersion; -use drive::grovedb::TransactionArg; pub(crate) mod v0; impl StateTransitionBalanceValidationV0 for IdentityCreditWithdrawalTransition { - fn validate_balance( + fn validate_minimum_balance_pre_check( &self, - identity: Option<&mut PartialIdentity>, - platform: &PlatformStateRef, - block_info: &BlockInfo, - tx: TransactionArg, + identity: &PartialIdentity, platform_version: &PlatformVersion, ) -> Result { match platform_version @@ -25,10 +19,10 @@ impl StateTransitionBalanceValidationV0 for IdentityCreditWithdrawalTransition { .validation_and_processing .state_transitions .identity_credit_withdrawal_state_transition - .balance + .advanced_minimum_balance_pre_check { Some(0) => { - self.validate_balance_v0(identity, platform, block_info, tx, platform_version) + self.validate_advanced_minimum_balance_pre_check_v0(identity, platform_version) } Some(version) => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "identity credit withdrawal transition: validate_balance".to_string(), diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/balance/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/balance/v0/mod.rs index 07c976d3ed..0c1b879b0f 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/balance/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/balance/v0/mod.rs @@ -1,76 +1,36 @@ use crate::error::Error; -use dpp::balances::credits::MIN_LEFTOVER_CREDITS_BEFORE_PROCESSING; -use dpp::block::block_info::BlockInfo; -use dpp::consensus::signature::IdentityNotFoundError; use dpp::consensus::state::identity::IdentityInsufficientBalanceError; use dpp::identity::PartialIdentity; use dpp::state_transition::identity_credit_withdrawal_transition::accessors::IdentityCreditWithdrawalTransitionAccessorsV0; use dpp::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition; +use crate::error::execution::ExecutionError; use dpp::validation::SimpleConsensusValidationResult; - -use crate::platform_types::platform::PlatformStateRef; use dpp::version::PlatformVersion; -use drive::grovedb::TransactionArg; pub(in crate::execution::validation::state_transition::state_transitions) trait IdentityCreditTransferTransitionBalanceValidationV0 { - fn validate_balance_v0( + fn validate_advanced_minimum_balance_pre_check_v0( &self, - identity: Option<&mut PartialIdentity>, - platform: &PlatformStateRef, - block_info: &BlockInfo, - tx: TransactionArg, + identity: &PartialIdentity, platform_version: &PlatformVersion, ) -> Result; } impl IdentityCreditTransferTransitionBalanceValidationV0 for IdentityCreditWithdrawalTransition { - fn validate_balance_v0( + fn validate_advanced_minimum_balance_pre_check_v0( &self, - identity: Option<&mut PartialIdentity>, - platform: &PlatformStateRef, - _unused_block_info: &BlockInfo, - tx: TransactionArg, + identity: &PartialIdentity, platform_version: &PlatformVersion, ) -> Result { - let balance = if let Some(identity) = identity { - if let Some(balance) = identity.balance { - balance - } else { - let maybe_existing_identity_balance = platform.drive.fetch_identity_balance( - self.identity_id().to_buffer(), - tx, - platform_version, - )?; - - let Some(existing_identity_balance) = maybe_existing_identity_balance else { - return Ok(SimpleConsensusValidationResult::new_with_error( - IdentityNotFoundError::new(self.identity_id()).into(), - )); - }; - - identity.balance = Some(existing_identity_balance); - - existing_identity_balance - } - } else { - let maybe_existing_identity_balance = platform.drive.fetch_identity_balance( - self.identity_id().to_buffer(), - tx, - platform_version, - )?; - - let Some(existing_identity_balance) = maybe_existing_identity_balance else { - return Ok(SimpleConsensusValidationResult::new_with_error( - IdentityNotFoundError::new(self.identity_id()).into(), - )); - }; - - existing_identity_balance - }; - - if balance < self.amount() + MIN_LEFTOVER_CREDITS_BEFORE_PROCESSING { + let balance = + identity + .balance + .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( + "expected to have a balance on identity for credit withdrawal transition", + )))?; + + if balance < self.amount().checked_add(platform_version.fee_version.state_transition_min_fees.credit_withdrawal).ok_or(Error::Execution(ExecutionError::Overflow("overflow when adding amount and min_leftover_credits_before_processing in identity credit withdrawal")))? { return Ok(SimpleConsensusValidationResult::new_with_error( IdentityInsufficientBalanceError::new(self.identity_id(), balance, self.amount()) .into(), diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs index 838a07801c..a97675f5d6 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs @@ -66,7 +66,10 @@ impl StateTransitionBasicStructureValidationV0 for IdentityCreditWithdrawalTrans .identity_credit_withdrawal_state_transition .basic_structure { - Some(0) => self.validate_basic_structure_v0(), + Some(0) => { + // There is nothing expensive here + self.validate_basic_structure_v0() + } Some(version) => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "identity credit withdrawal transition: validate_basic_structure" .to_string(), diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/nonce/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/nonce/mod.rs index f8304182e2..8676f0eb75 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/nonce/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/nonce/mod.rs @@ -1,5 +1,6 @@ use crate::error::execution::ExecutionError; use crate::error::Error; +use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; use crate::execution::validation::state_transition::identity_credit_withdrawal::nonce::v0::IdentityCreditWithdrawalTransitionIdentityContractNonceV0; use crate::execution::validation::state_transition::processor::v0::StateTransitionNonceValidationV0; use crate::platform_types::platform::PlatformStateRef; @@ -16,6 +17,7 @@ impl StateTransitionNonceValidationV0 for IdentityCreditWithdrawalTransition { platform: &PlatformStateRef, block_info: &BlockInfo, tx: TransactionArg, + execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion, ) -> Result { match platform_version @@ -25,7 +27,13 @@ impl StateTransitionNonceValidationV0 for IdentityCreditWithdrawalTransition { .identity_credit_withdrawal_state_transition .nonce { - Some(0) => self.validate_nonce_v0(platform, block_info, tx, platform_version), + Some(0) => self.validate_nonce_v0( + platform, + block_info, + tx, + execution_context, + platform_version, + ), Some(version) => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "identity credit withdrawal transition: validate_nonces".to_string(), known_versions: vec![0], diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/nonce/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/nonce/v0/mod.rs index 3d72880089..f99d11d9a8 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/nonce/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/nonce/v0/mod.rs @@ -10,6 +10,10 @@ use dpp::state_transition::identity_credit_withdrawal_transition::IdentityCredit use dpp::validation::SimpleConsensusValidationResult; +use crate::execution::types::execution_operation::ValidationOperation; +use crate::execution::types::state_transition_execution_context::{ + StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0, +}; use crate::platform_types::platform::PlatformStateRef; use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; @@ -21,6 +25,7 @@ pub(in crate::execution::validation::state_transition::state_transitions) trait platform: &PlatformStateRef, block_info: &BlockInfo, tx: TransactionArg, + execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion, ) -> Result; } @@ -33,6 +38,7 @@ impl IdentityCreditWithdrawalTransitionIdentityContractNonceV0 platform: &PlatformStateRef, block_info: &BlockInfo, tx: TransactionArg, + execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion, ) -> Result { let revision_nonce = self.nonce(); @@ -45,8 +51,8 @@ impl IdentityCreditWithdrawalTransitionIdentityContractNonceV0 } let identity_id = self.identity_id(); - //todo: use fees - let (existing_nonce, _unused_fees) = platform.drive.fetch_identity_nonce_with_fees( + + let (existing_nonce, fee) = platform.drive.fetch_identity_nonce_with_fees( identity_id.to_buffer(), block_info, true, @@ -54,6 +60,8 @@ impl IdentityCreditWithdrawalTransitionIdentityContractNonceV0 platform_version, )?; + execution_context.add_operation(ValidationOperation::PrecalculatedOperation(fee)); + let result = if let Some(existing_nonce) = existing_nonce { validate_identity_nonce_update(existing_nonce, revision_nonce, identity_id) } else { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/identity_retrieval/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/identity_retrieval/v0/mod.rs index 6c90b2a9cb..2b49d301aa 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/identity_retrieval/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/identity_retrieval/v0/mod.rs @@ -8,6 +8,10 @@ use dpp::state_transition::identity_topup_transition::accessors::IdentityTopUpTr use dpp::state_transition::identity_topup_transition::IdentityTopUpTransition; use dpp::version::PlatformVersion; +use crate::execution::types::execution_operation::{RetrieveIdentityInfo, ValidationOperation}; +use crate::execution::types::state_transition_execution_context::{ + StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0, +}; use drive::drive::Drive; use drive::grovedb::TransactionArg; @@ -17,6 +21,7 @@ pub(in crate::execution::validation::state_transition) trait IdentityTopUpStateT &self, drive: &Drive, tx: TransactionArg, + execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion, ) -> Result, Error>; } @@ -26,10 +31,15 @@ impl IdentityTopUpStateTransitionIdentityRetrievalV0 for IdentityTopUpTransition &self, drive: &Drive, tx: TransactionArg, + execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion, ) -> Result, Error> { let mut validation_result = ConsensusValidationResult::::default(); + execution_context.add_operation(ValidationOperation::RetrieveIdentity( + RetrieveIdentityInfo::only_balance(), + )); + let maybe_partial_identity = drive.fetch_identity_with_balance( self.identity_id().to_buffer(), tx, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/mod.rs index be7b829d7e..ff5a576737 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/mod.rs @@ -81,7 +81,10 @@ impl StateTransitionBasicStructureValidationV0 for IdentityTopUpTransition { .identity_top_up_state_transition .basic_structure { - Some(0) => self.validate_basic_structure_v0(platform_version), + Some(0) => { + // There is nothing expensive here, so need to ask users to pay for anything + self.validate_basic_structure_v0(platform_version) + } Some(version) => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "identity top up transition: validate_basic_structure".to_string(), known_versions: vec![0], diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/transform_into_action/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/transform_into_action/v0/mod.rs index 6b911ad6f0..4d56135158 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/transform_into_action/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/transform_into_action/v0/mod.rs @@ -24,7 +24,7 @@ use drive::state_transition_action::StateTransitionAction; use crate::error::execution::ExecutionError; use drive::grovedb::TransactionArg; -use crate::execution::types::execution_operation::ValidationOperation; +use crate::execution::types::execution_operation::{SHA256_BLOCK_SIZE, ValidationOperation}; use crate::execution::types::execution_operation::signature_verification_operation::SignatureVerificationOperation; use crate::execution::types::state_transition_execution_context::{StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0}; use crate::execution::validation::state_transition::common::asset_lock::proof::validate::AssetLockProofValidation; @@ -161,7 +161,9 @@ impl IdentityTopUpStateTransitionStateValidationV0 for IdentityTopUpTransition { )) })?; - execution_context.add_operation(ValidationOperation::DoubleSha256); + let block_count = signable_bytes.len() as u16 / SHA256_BLOCK_SIZE; + + execution_context.add_operation(ValidationOperation::DoubleSha256(block_count)); execution_context.add_operation(ValidationOperation::SignatureVerification( SignatureVerificationOperation::new(KeyType::ECDSA_HASH160), )); diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/nonce/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/nonce/mod.rs index e6898f1cfa..30f81ef999 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/nonce/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/nonce/mod.rs @@ -1,5 +1,6 @@ use crate::error::execution::ExecutionError; use crate::error::Error; +use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; use crate::execution::validation::state_transition::identity_update::nonce::v0::IdentityUpdateTransitionIdentityContractNonceV0; use crate::execution::validation::state_transition::processor::v0::StateTransitionNonceValidationV0; use crate::platform_types::platform::PlatformStateRef; @@ -16,6 +17,7 @@ impl StateTransitionNonceValidationV0 for IdentityUpdateTransition { platform: &PlatformStateRef, block_info: &BlockInfo, tx: TransactionArg, + execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion, ) -> Result { match platform_version @@ -25,7 +27,13 @@ impl StateTransitionNonceValidationV0 for IdentityUpdateTransition { .identity_update_state_transition .nonce { - Some(0) => self.validate_nonce_v0(platform, block_info, tx, platform_version), + Some(0) => self.validate_nonce_v0( + platform, + block_info, + tx, + execution_context, + platform_version, + ), Some(version) => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "identity update transition: validate_nonces".to_string(), known_versions: vec![0], diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/nonce/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/nonce/v0/mod.rs index 86ae885214..fc51a636c5 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/nonce/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/nonce/v0/mod.rs @@ -10,6 +10,10 @@ use dpp::state_transition::identity_update_transition::IdentityUpdateTransition; use dpp::validation::SimpleConsensusValidationResult; +use crate::execution::types::execution_operation::ValidationOperation; +use crate::execution::types::state_transition_execution_context::{ + StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0, +}; use crate::platform_types::platform::PlatformStateRef; use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; @@ -21,6 +25,7 @@ pub(in crate::execution::validation::state_transition::state_transitions) trait platform: &PlatformStateRef, block_info: &BlockInfo, tx: TransactionArg, + execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion, ) -> Result; } @@ -31,6 +36,7 @@ impl IdentityUpdateTransitionIdentityContractNonceV0 for IdentityUpdateTransitio platform: &PlatformStateRef, block_info: &BlockInfo, tx: TransactionArg, + execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion, ) -> Result { let revision_nonce = self.nonce(); @@ -43,8 +49,8 @@ impl IdentityUpdateTransitionIdentityContractNonceV0 for IdentityUpdateTransitio } let identity_id = self.identity_id(); - //todo: use fees - let (existing_nonce, _unused_fees) = platform.drive.fetch_identity_nonce_with_fees( + + let (existing_nonce, fee) = platform.drive.fetch_identity_nonce_with_fees( identity_id.to_buffer(), block_info, true, @@ -52,6 +58,8 @@ impl IdentityUpdateTransitionIdentityContractNonceV0 for IdentityUpdateTransitio platform_version, )?; + execution_context.add_operation(ValidationOperation::PrecalculatedOperation(fee)); + let result = if let Some(existing_nonce) = existing_nonce { validate_identity_nonce_update(existing_nonce, revision_nonce, identity_id) } else { diff --git a/packages/rs-drive-abci/tests/strategy_tests/main.rs b/packages/rs-drive-abci/tests/strategy_tests/main.rs index 973770313a..894b5cd36f 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/main.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/main.rs @@ -554,7 +554,7 @@ mod tests { .expect("expected to fetch balances") .expect("expected to have an identity to get balance from"); - assert_eq!(balance, 99864800180) + assert_eq!(balance, 99864796380) } #[test] @@ -1144,7 +1144,7 @@ mod tests { .unwrap() .unwrap() ), - "8e1e8d1ae51b3fc8a9e4acd0d312c9494943f2b7a5b957cc1379ab246ebd678d".to_string() + "e955d7935da01eb2ee8b1935a49ceb4b7021ffce1dec5bb401ce1de5cdf330b5".to_string() ) } @@ -1833,7 +1833,7 @@ mod tests { .unwrap() .unwrap() ), - "665ec5018021b0a14a25b7ac6de780edc943a73adb3dc7e2eb623959a08056c3".to_string() + "0d2ccf74932904c3463764528d34cc220dcb66cbbe8ea1a031367056aeda77c0".to_string() ) } @@ -1958,7 +1958,7 @@ mod tests { .unwrap() .unwrap() ), - "3f1cfdfd2e1019e941434cc841282fbc156ee19062569e393a51af621447c7a7".to_string() + "bc0eee6f0d40ae9a2c8f2ae9f95874d403056349b99f96c11d4562be12fc5015".to_string() ) } diff --git a/packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/mod.rs b/packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/mod.rs index 9e964740ae..081fc25772 100644 --- a/packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/mod.rs +++ b/packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/mod.rs @@ -10,8 +10,8 @@ use dpp::data_contract::DataContract; use dpp::identifier::Identifier; use dpp::platform_value::Value; use dpp::prelude::{BlockHeight, CoreBlockHeight, TimestampMillis}; -use dpp::validation::SimpleConsensusValidationResult; +use dpp::validation::SimpleConsensusValidationResult; use dpp::version::PlatformVersion; use grovedb::TransactionArg; use std::collections::BTreeMap; diff --git a/packages/rs-platform-version/src/version/drive_abci_versions.rs b/packages/rs-platform-version/src/version/drive_abci_versions.rs index e173085bca..40f337d836 100644 --- a/packages/rs-platform-version/src/version/drive_abci_versions.rs +++ b/packages/rs-platform-version/src/version/drive_abci_versions.rs @@ -133,7 +133,7 @@ pub struct DriveAbciStateTransitionValidationVersion { pub basic_structure: OptionalFeatureVersion, pub advanced_structure: OptionalFeatureVersion, pub identity_signatures: OptionalFeatureVersion, - pub balance: OptionalFeatureVersion, + pub advanced_minimum_balance_pre_check: OptionalFeatureVersion, pub nonce: OptionalFeatureVersion, pub state: FeatureVersion, pub transform_into_action: FeatureVersion, @@ -161,6 +161,7 @@ pub struct DriveAbciStateTransitionCommonValidationVersions { pub validate_state_transition_identity_signed: FeatureVersion, pub validate_unique_identity_public_key_hashes_in_state: FeatureVersion, pub validate_master_key_uniqueness: FeatureVersion, + pub validate_simple_pre_check_balance: FeatureVersion, } #[derive(Clone, Copy, Debug, Default)] diff --git a/packages/rs-platform-version/src/version/fee/hashing/mod.rs b/packages/rs-platform-version/src/version/fee/hashing/mod.rs new file mode 100644 index 0000000000..c5b51a4e4f --- /dev/null +++ b/packages/rs-platform-version/src/version/fee/hashing/mod.rs @@ -0,0 +1,9 @@ +pub mod v1; + +#[derive(Clone, Debug, Default)] +pub struct FeeHashingVersion { + pub double_sha256_base: u64, + pub double_sha256_per_block: u64, + pub single_sha256_base: u64, + pub single_sha256_per_block: u64, +} diff --git a/packages/rs-platform-version/src/version/fee/hashing/v1.rs b/packages/rs-platform-version/src/version/fee/hashing/v1.rs new file mode 100644 index 0000000000..a29d60858e --- /dev/null +++ b/packages/rs-platform-version/src/version/fee/hashing/v1.rs @@ -0,0 +1,8 @@ +use crate::version::fee::hashing::FeeHashingVersion; + +pub const FEE_HASHING_VERSION1: FeeHashingVersion = FeeHashingVersion { + double_sha256_base: 500, + double_sha256_per_block: 400, + single_sha256_base: 100, + single_sha256_per_block: 400, +}; diff --git a/packages/rs-platform-version/src/version/fee/mod.rs b/packages/rs-platform-version/src/version/fee/mod.rs new file mode 100644 index 0000000000..e1b3121d7b --- /dev/null +++ b/packages/rs-platform-version/src/version/fee/mod.rs @@ -0,0 +1,21 @@ +use crate::version::fee::hashing::FeeHashingVersion; +use crate::version::fee::processing::FeeProcessingVersion; +use crate::version::fee::signature::FeeSignatureVersion; +use crate::version::fee::state_transition_min_fees::StateTransitionMinFees; +use crate::version::fee::storage::FeeStorageVersion; + +mod hashing; +mod processing; +pub mod signature; +pub mod state_transition_min_fees; +pub mod storage; +pub mod v1; + +#[derive(Clone, Debug, Default)] +pub struct FeeVersion { + pub storage: FeeStorageVersion, + pub signature: FeeSignatureVersion, + pub hashing: FeeHashingVersion, + pub processing: FeeProcessingVersion, + pub state_transition_min_fees: StateTransitionMinFees, +} diff --git a/packages/rs-platform-version/src/version/fee/processing/mod.rs b/packages/rs-platform-version/src/version/fee/processing/mod.rs new file mode 100644 index 0000000000..484048f624 --- /dev/null +++ b/packages/rs-platform-version/src/version/fee/processing/mod.rs @@ -0,0 +1,11 @@ +pub mod v1; + +#[derive(Clone, Debug, Default)] +pub struct FeeProcessingVersion { + pub fetch_identity_balance_processing_cost: u64, + pub fetch_identity_revision_processing_cost: u64, + pub fetch_identity_balance_and_revision_processing_cost: u64, + pub fetch_identity_cost_per_look_up_key_by_id: u64, + pub fetch_single_identity_key_processing_cost: u64, + pub validate_key_structure: u64, +} diff --git a/packages/rs-platform-version/src/version/fee/processing/v1.rs b/packages/rs-platform-version/src/version/fee/processing/v1.rs new file mode 100644 index 0000000000..da0721383c --- /dev/null +++ b/packages/rs-platform-version/src/version/fee/processing/v1.rs @@ -0,0 +1,10 @@ +use crate::version::fee::processing::FeeProcessingVersion; + +pub const FEE_PROCESSING_VERSION1: FeeProcessingVersion = FeeProcessingVersion { + fetch_identity_balance_processing_cost: 10000, + fetch_identity_revision_processing_cost: 9000, + fetch_identity_balance_and_revision_processing_cost: 15000, + fetch_identity_cost_per_look_up_key_by_id: 9000, + fetch_single_identity_key_processing_cost: 10000, + validate_key_structure: 50, +}; diff --git a/packages/rs-platform-version/src/version/fee/signature/mod.rs b/packages/rs-platform-version/src/version/fee/signature/mod.rs new file mode 100644 index 0000000000..ebfbd22984 --- /dev/null +++ b/packages/rs-platform-version/src/version/fee/signature/mod.rs @@ -0,0 +1,10 @@ +pub mod v1; + +#[derive(Clone, Debug, Default)] +pub struct FeeSignatureVersion { + pub verify_signature_ecdsa_secp256k1: u64, + pub verify_signature_bls12_381: u64, + pub verify_signature_ecdsa_hash160: u64, + pub verify_signature_bip13_script_hash: u64, + pub verify_signature_eddsa25519_hash160: u64, +} diff --git a/packages/rs-platform-version/src/version/fee/signature/v1.rs b/packages/rs-platform-version/src/version/fee/signature/v1.rs new file mode 100644 index 0000000000..09c84354dd --- /dev/null +++ b/packages/rs-platform-version/src/version/fee/signature/v1.rs @@ -0,0 +1,9 @@ +use crate::version::fee::signature::FeeSignatureVersion; + +pub const FEE_SIGNATURE_VERSION1: FeeSignatureVersion = FeeSignatureVersion { + verify_signature_ecdsa_secp256k1: 3000, + verify_signature_bls12_381: 6000, + verify_signature_ecdsa_hash160: 4000, + verify_signature_bip13_script_hash: 6000, + verify_signature_eddsa25519_hash160: 3000, +}; diff --git a/packages/rs-platform-version/src/version/fee/state_transition_min_fees/mod.rs b/packages/rs-platform-version/src/version/fee/state_transition_min_fees/mod.rs new file mode 100644 index 0000000000..dea98a5a2b --- /dev/null +++ b/packages/rs-platform-version/src/version/fee/state_transition_min_fees/mod.rs @@ -0,0 +1,10 @@ +pub mod v1; +#[derive(Clone, Debug, Default)] +pub struct StateTransitionMinFees { + pub credit_transfer: u64, + pub credit_withdrawal: u64, + pub identity_update: u64, + pub document_batch_transition: u64, + pub contract_create: u64, + pub contract_update: u64, +} diff --git a/packages/rs-platform-version/src/version/fee/state_transition_min_fees/v1.rs b/packages/rs-platform-version/src/version/fee/state_transition_min_fees/v1.rs new file mode 100644 index 0000000000..c01f6f1130 --- /dev/null +++ b/packages/rs-platform-version/src/version/fee/state_transition_min_fees/v1.rs @@ -0,0 +1,10 @@ +use crate::version::fee::state_transition_min_fees::StateTransitionMinFees; + +pub const STATE_TRANSITION_MIN_FEES_VERSION1: StateTransitionMinFees = StateTransitionMinFees { + credit_transfer: 100000, + credit_withdrawal: 100000, + identity_update: 100000, + document_batch_transition: 100000, + contract_create: 100000, + contract_update: 100000, +}; diff --git a/packages/rs-platform-version/src/version/fee/storage/mod.rs b/packages/rs-platform-version/src/version/fee/storage/mod.rs new file mode 100644 index 0000000000..765bee47b9 --- /dev/null +++ b/packages/rs-platform-version/src/version/fee/storage/mod.rs @@ -0,0 +1,10 @@ +pub mod v1; + +#[derive(Clone, Debug, Default)] +pub struct FeeStorageVersion { + pub storage_disk_usage_credit_per_byte: u64, + pub storage_processing_credit_per_byte: u64, + pub storage_load_credit_per_byte: u64, + pub non_storage_load_credit_per_byte: u64, + pub storage_seek_cost: u64, +} diff --git a/packages/rs-platform-version/src/version/fee/storage/v1.rs b/packages/rs-platform-version/src/version/fee/storage/v1.rs new file mode 100644 index 0000000000..b9e52989e8 --- /dev/null +++ b/packages/rs-platform-version/src/version/fee/storage/v1.rs @@ -0,0 +1,9 @@ +use crate::version::fee::storage::FeeStorageVersion; + +pub const FEE_STORAGE_VERSION1: FeeStorageVersion = FeeStorageVersion { + storage_disk_usage_credit_per_byte: 27000, + storage_processing_credit_per_byte: 400, + storage_load_credit_per_byte: 400, + non_storage_load_credit_per_byte: 30, + storage_seek_cost: 4000, +}; diff --git a/packages/rs-platform-version/src/version/fee/v1.rs b/packages/rs-platform-version/src/version/fee/v1.rs new file mode 100644 index 0000000000..fd7062b5e8 --- /dev/null +++ b/packages/rs-platform-version/src/version/fee/v1.rs @@ -0,0 +1,14 @@ +use crate::version::fee::hashing::v1::FEE_HASHING_VERSION1; +use crate::version::fee::processing::v1::FEE_PROCESSING_VERSION1; +use crate::version::fee::signature::v1::FEE_SIGNATURE_VERSION1; +use crate::version::fee::state_transition_min_fees::v1::STATE_TRANSITION_MIN_FEES_VERSION1; +use crate::version::fee::storage::v1::FEE_STORAGE_VERSION1; +use crate::version::fee::FeeVersion; + +pub const FEE_VERSION1: FeeVersion = FeeVersion { + storage: FEE_STORAGE_VERSION1, + signature: FEE_SIGNATURE_VERSION1, + hashing: FEE_HASHING_VERSION1, + processing: FEE_PROCESSING_VERSION1, + state_transition_min_fees: STATE_TRANSITION_MIN_FEES_VERSION1, +}; diff --git a/packages/rs-platform-version/src/version/mocks/v2_test.rs b/packages/rs-platform-version/src/version/mocks/v2_test.rs index 712c73491f..0842055649 100644 --- a/packages/rs-platform-version/src/version/mocks/v2_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v2_test.rs @@ -66,6 +66,7 @@ use crate::version::drive_versions::{ DriveVerifyMethodVersions, DriveVerifySingleDocumentMethodVersions, DriveVerifyStateTransitionMethodVersions, DriveVerifySystemMethodVersions, DriveVersion, }; +use crate::version::fee::v1::FEE_VERSION1; use crate::version::mocks::TEST_BYTES; use crate::version::protocol_version::{FeatureVersionBounds, PlatformVersion}; use crate::version::{AbciStructureVersion, PlatformArchitectureVersion}; @@ -600,12 +601,13 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { validate_state_transition_identity_signed: 0, validate_unique_identity_public_key_hashes_in_state: 0, validate_master_key_uniqueness: 0, + validate_simple_pre_check_balance: 0, }, identity_create_state_transition: DriveAbciStateTransitionValidationVersion { basic_structure: Some(0), advanced_structure: Some(0), identity_signatures: Some(0), - balance: None, + advanced_minimum_balance_pre_check: None, nonce: None, state: 0, transform_into_action: 0, @@ -614,7 +616,7 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { basic_structure: Some(0), advanced_structure: Some(0), identity_signatures: Some(0), - balance: None, + advanced_minimum_balance_pre_check: None, nonce: Some(0), state: 0, transform_into_action: 0, @@ -623,7 +625,7 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { basic_structure: Some(0), advanced_structure: None, identity_signatures: None, - balance: None, + advanced_minimum_balance_pre_check: None, nonce: None, state: 0, transform_into_action: 0, @@ -633,7 +635,7 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { basic_structure: Some(0), advanced_structure: None, identity_signatures: None, - balance: Some(0), + advanced_minimum_balance_pre_check: Some(0), nonce: Some(0), state: 0, transform_into_action: 0, @@ -643,7 +645,7 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { basic_structure: Some(0), advanced_structure: None, identity_signatures: None, - balance: Some(0), + advanced_minimum_balance_pre_check: Some(0), nonce: Some(0), state: 0, transform_into_action: 0, @@ -652,7 +654,7 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { basic_structure: Some(0), advanced_structure: None, identity_signatures: None, - balance: None, + advanced_minimum_balance_pre_check: None, nonce: Some(0), state: 0, transform_into_action: 0, @@ -661,7 +663,7 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { basic_structure: None, advanced_structure: None, identity_signatures: None, - balance: None, + advanced_minimum_balance_pre_check: None, nonce: Some(0), state: 0, transform_into_action: 0, @@ -1021,4 +1023,5 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { masternode_reward_shares: 1, feature_flags: 1, }, + fee_version: FEE_VERSION1, }; diff --git a/packages/rs-platform-version/src/version/mocks/v3_test.rs b/packages/rs-platform-version/src/version/mocks/v3_test.rs index 8b919b35bb..11369689ff 100644 --- a/packages/rs-platform-version/src/version/mocks/v3_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v3_test.rs @@ -66,6 +66,7 @@ use crate::version::drive_versions::{ DriveVerifyMethodVersions, DriveVerifySingleDocumentMethodVersions, DriveVerifyStateTransitionMethodVersions, DriveVerifySystemMethodVersions, DriveVersion, }; +use crate::version::fee::v1::FEE_VERSION1; use crate::version::mocks::TEST_BYTES; use crate::version::protocol_version::{FeatureVersionBounds, PlatformVersion}; use crate::version::{AbciStructureVersion, PlatformArchitectureVersion}; @@ -600,12 +601,13 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { validate_state_transition_identity_signed: 0, validate_unique_identity_public_key_hashes_in_state: 0, validate_master_key_uniqueness: 0, + validate_simple_pre_check_balance: 0, }, identity_create_state_transition: DriveAbciStateTransitionValidationVersion { basic_structure: Some(0), advanced_structure: Some(0), identity_signatures: Some(0), - balance: None, + advanced_minimum_balance_pre_check: None, nonce: None, state: 0, transform_into_action: 0, @@ -614,7 +616,7 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { basic_structure: Some(0), advanced_structure: Some(0), identity_signatures: Some(0), - balance: None, + advanced_minimum_balance_pre_check: None, nonce: Some(0), state: 0, transform_into_action: 0, @@ -623,7 +625,7 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { basic_structure: Some(0), advanced_structure: None, identity_signatures: None, - balance: None, + advanced_minimum_balance_pre_check: None, nonce: None, state: 0, transform_into_action: 0, @@ -633,7 +635,7 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { basic_structure: Some(0), advanced_structure: None, identity_signatures: None, - balance: Some(0), + advanced_minimum_balance_pre_check: Some(0), nonce: Some(0), state: 0, transform_into_action: 0, @@ -643,7 +645,7 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { basic_structure: Some(0), advanced_structure: None, identity_signatures: None, - balance: Some(0), + advanced_minimum_balance_pre_check: Some(0), nonce: Some(0), state: 0, transform_into_action: 0, @@ -652,7 +654,7 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { basic_structure: Some(0), advanced_structure: None, identity_signatures: None, - balance: None, + advanced_minimum_balance_pre_check: None, nonce: Some(0), state: 0, transform_into_action: 0, @@ -661,7 +663,7 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { basic_structure: None, advanced_structure: None, identity_signatures: None, - balance: None, + advanced_minimum_balance_pre_check: None, nonce: Some(0), state: 0, transform_into_action: 0, @@ -1021,4 +1023,5 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { masternode_reward_shares: 1, feature_flags: 1, }, + fee_version: FEE_VERSION1, }; diff --git a/packages/rs-platform-version/src/version/mod.rs b/packages/rs-platform-version/src/version/mod.rs index 486f8db5ff..05864c0c9e 100644 --- a/packages/rs-platform-version/src/version/mod.rs +++ b/packages/rs-platform-version/src/version/mod.rs @@ -4,6 +4,7 @@ pub mod contracts; pub mod dpp_versions; pub mod drive_abci_versions; pub mod drive_versions; +pub mod fee; #[cfg(feature = "mock-versions")] pub mod mocks; mod v1; diff --git a/packages/rs-platform-version/src/version/protocol_version.rs b/packages/rs-platform-version/src/version/protocol_version.rs index 2b6763aee6..527964f17a 100644 --- a/packages/rs-platform-version/src/version/protocol_version.rs +++ b/packages/rs-platform-version/src/version/protocol_version.rs @@ -3,6 +3,7 @@ use crate::version::contracts::SystemDataContractVersions; use crate::version::dpp_versions::DPPVersion; use crate::version::drive_abci_versions::DriveAbciVersion; use crate::version::drive_versions::DriveVersion; +use crate::version::fee::FeeVersion; #[cfg(feature = "mock-versions")] use crate::version::mocks::v2_test::TEST_PLATFORM_V2; #[cfg(feature = "mock-versions")] @@ -47,6 +48,7 @@ pub struct PlatformVersion { pub dpp: DPPVersion, pub drive: DriveVersion, pub drive_abci: DriveAbciVersion, + pub fee_version: FeeVersion, pub abci_structure: AbciStructureVersion, pub platform_architecture: PlatformArchitectureVersion, pub system_data_contracts: SystemDataContractVersions, diff --git a/packages/rs-platform-version/src/version/v1.rs b/packages/rs-platform-version/src/version/v1.rs index bba91b6d80..6bde941c06 100644 --- a/packages/rs-platform-version/src/version/v1.rs +++ b/packages/rs-platform-version/src/version/v1.rs @@ -66,6 +66,7 @@ use crate::version::drive_versions::{ DriveVerifyMethodVersions, DriveVerifySingleDocumentMethodVersions, DriveVerifyStateTransitionMethodVersions, DriveVerifySystemMethodVersions, DriveVersion, }; +use crate::version::fee::v1::FEE_VERSION1; use crate::version::protocol_version::{FeatureVersionBounds, PlatformVersion}; use crate::version::{AbciStructureVersion, PlatformArchitectureVersion}; @@ -597,12 +598,13 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { validate_state_transition_identity_signed: 0, validate_unique_identity_public_key_hashes_in_state: 0, validate_master_key_uniqueness: 0, + validate_simple_pre_check_balance: 0, }, identity_create_state_transition: DriveAbciStateTransitionValidationVersion { basic_structure: Some(0), advanced_structure: Some(0), identity_signatures: Some(0), - balance: None, + advanced_minimum_balance_pre_check: None, nonce: None, state: 0, transform_into_action: 0, @@ -611,7 +613,7 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { basic_structure: Some(0), advanced_structure: Some(0), identity_signatures: Some(0), - balance: None, + advanced_minimum_balance_pre_check: None, nonce: Some(0), state: 0, transform_into_action: 0, @@ -620,7 +622,7 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { basic_structure: Some(0), advanced_structure: None, identity_signatures: None, - balance: None, + advanced_minimum_balance_pre_check: None, nonce: None, state: 0, transform_into_action: 0, @@ -630,7 +632,7 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { basic_structure: Some(0), advanced_structure: None, identity_signatures: None, - balance: Some(0), + advanced_minimum_balance_pre_check: Some(0), nonce: Some(0), state: 0, transform_into_action: 0, @@ -640,7 +642,7 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { basic_structure: Some(0), advanced_structure: None, identity_signatures: None, - balance: Some(0), + advanced_minimum_balance_pre_check: Some(0), nonce: Some(0), state: 0, transform_into_action: 0, @@ -649,7 +651,7 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { basic_structure: Some(0), advanced_structure: None, identity_signatures: None, - balance: None, + advanced_minimum_balance_pre_check: None, nonce: Some(0), state: 0, transform_into_action: 0, @@ -658,7 +660,7 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { basic_structure: None, advanced_structure: None, identity_signatures: None, - balance: None, + advanced_minimum_balance_pre_check: None, nonce: Some(0), state: 0, transform_into_action: 0, @@ -1018,4 +1020,5 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { masternode_reward_shares: 1, feature_flags: 1, }, + fee_version: FEE_VERSION1, }; diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs index 15fa4003aa..4176b09af5 100644 --- a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs @@ -7,10 +7,7 @@ use wasm_bindgen::prelude::*; use crate::utils::WithJsError; use crate::{ - buffer::Buffer, - errors::{from_dpp_err, RustConversionError}, - identifier::IdentifierWrapper, - with_js_error, + buffer::Buffer, errors::RustConversionError, identifier::IdentifierWrapper, with_js_error, }; use dpp::identity::state_transition::asset_lock_proof::chain::ChainAssetLockProof; use dpp::platform_value::string_encoding; @@ -137,8 +134,7 @@ impl ChainAssetLockProofWasm { } #[wasm_bindgen(js_name=createIdentifier)] - pub fn create_identifier(&self) -> Result { - let identifier = self.0.create_identifier().map_err(from_dpp_err)?; - Ok(identifier.into()) + pub fn create_identifier(&self) -> IdentifierWrapper { + self.0.create_identifier().into() } } diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs index 629c42f456..861188d0ca 100644 --- a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs @@ -73,7 +73,9 @@ impl AssetLockProofWasm { InstantAssetLockProofWasm::from(instant.to_owned()).create_identifier() } AssetLockProof::Chain(chain) => { - ChainAssetLockProofWasm::from(chain.to_owned()).create_identifier() + let identifier = + ChainAssetLockProofWasm::from(chain.to_owned()).create_identifier(); + Ok(identifier) } } } From 642ff914fc7ea8f9e95a356ae7aefcd17ae83b7d Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Wed, 3 Apr 2024 08:17:42 +0700 Subject: [PATCH 117/191] chore(sdk): export various libraries in rs-sdk (#1802) --- packages/rs-sdk/src/lib.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/rs-sdk/src/lib.rs b/packages/rs-sdk/src/lib.rs index 56575e63a1..887cffbc14 100644 --- a/packages/rs-sdk/src/lib.rs +++ b/packages/rs-sdk/src/lib.rs @@ -72,5 +72,8 @@ pub mod sdk; pub use error::Error; pub use sdk::{RequestSettings, Sdk, SdkBuilder}; +pub use dpp; +pub use rs_dapi_client as dapi_client; + /// Version of the SDK pub const VERSION: &str = env!("CARGO_PKG_VERSION"); From 4bb24fbd7724b8eb386832331fd0801097d7a4ff Mon Sep 17 00:00:00 2001 From: Igor Markin Date: Wed, 3 Apr 2024 13:06:11 +0100 Subject: [PATCH 118/191] fix(sdk): not bumping nonce on contract creation (#1801) --- .../src/SDK/Client/Platform/methods/contracts/create.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/contracts/create.ts b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/contracts/create.ts index b6ca74c9bc..8b40c79b14 100644 --- a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/contracts/create.ts +++ b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/contracts/create.ts @@ -17,7 +17,7 @@ export async function create( await this.initialize(); - const identityNonce = await this.nonceManager.getIdentityNonce(identity.getId()) + 1; + const identityNonce = await this.nonceManager.bumpIdentityNonce(identity.getId()); const dataContract = this.dpp.dataContract.create( identity.getId(), BigInt(identityNonce), From 2fdd94994d3a550179046fad701bf78229d36834 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Thu, 4 Apr 2024 15:38:53 +0700 Subject: [PATCH 119/191] fix(drive)!: versioning issues on epoch change (#1769) --- Cargo.lock | 12 +- packages/dapi-grpc/Cargo.toml | 2 +- .../configs/defaults/getBaseConfigFactory.js | 2 +- .../configs/getConfigFileMigrationsFactory.js | 8 + packages/dashmate/docker-compose.yml | 1 - packages/rs-drive-abci/Cargo.toml | 2 +- .../src/abci/handler/finalize_block.rs | 10 +- .../rs-drive-abci/src/abci/handler/info.rs | 6 +- .../src/abci/handler/prepare_proposal.rs | 2 +- .../src/abci/handler/process_proposal.rs | 3 + packages/rs-drive-abci/src/config.rs | 10 +- .../engine/finalize_block_proposal/v0/mod.rs | 14 +- .../engine/run_block_proposal/mod.rs | 38 ++- .../engine/run_block_proposal/v0/mod.rs | 97 ++++--- .../block_end/update_drive_cache/mod.rs | 9 +- .../block_end/update_drive_cache/v0/mod.rs | 16 +- .../block_end/update_state_cache/v0/mod.rs | 7 +- .../clear_drive_block_cache/v0/mod.rs | 5 +- .../epoch/gather_epoch_info/mod.rs | 27 +- .../check_for_desired_protocol_upgrade/mod.rs | 16 +- .../v0/mod.rs | 48 ++-- .../platform_events/protocol_upgrade/mod.rs | 1 + .../upgrade_protocol_version/mod.rs | 58 ++++ .../upgrade_protocol_version/v0/mod.rs | 139 ++++++++++ packages/rs-drive-abci/src/mimic/mod.rs | 13 +- .../src/platform_types/epoch_info/mod.rs | 11 + .../system/version_upgrade_state/v0/mod.rs | 2 + .../version_upgrade_vote_status/v0/mod.rs | 2 + .../tests/strategy_tests/execution.rs | 18 +- .../tests/strategy_tests/main.rs | 8 +- .../strategy_tests/upgrade_fork_tests.rs | 249 +++++++++++++++--- packages/rs-drive-proof-verifier/Cargo.toml | 2 +- .../src/drive/cache/protocol_version.rs | 52 ++-- packages/rs-drive/src/drive/open/mod.rs | 2 + .../v0/mod.rs | 1 + .../v0/mod.rs | 15 +- .../v0/mod.rs | 29 +- .../mod.rs | 1 + packages/rs-drive/src/error/cache.rs | 7 + packages/rs-drive/src/error/mod.rs | 6 + .../src/version/drive_abci_versions.rs | 2 + .../src/version/mocks/mod.rs | 2 +- .../src/version/mocks/v2_test.rs | 8 +- .../src/version/mocks/v3_test.rs | 8 +- .../rs-platform-version/src/version/mod.rs | 6 +- .../src/version/protocol_version.rs | 39 ++- .../rs-platform-version/src/version/v1.rs | 6 +- 47 files changed, 770 insertions(+), 252 deletions(-) create mode 100644 packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/upgrade_protocol_version/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/upgrade_protocol_version/v0/mod.rs create mode 100644 packages/rs-drive/src/error/cache.rs diff --git a/Cargo.lock b/Cargo.lock index bbdee15104..b25bc5ba4f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4268,8 +4268,8 @@ dependencies = [ [[package]] name = "tenderdash-abci" -version = "0.14.0-dev.10" -source = "git+https://github.com/dashpay/rs-tenderdash-abci#883d1f5d3ecb26a97dab7a08400fede53059ea62" +version = "0.14.0-dev.11" +source = "git+https://github.com/dashpay/rs-tenderdash-abci#52a0b7cd37d7adcffea7b35eaf9ee10c7a6c8135" dependencies = [ "bytes", "futures", @@ -4290,8 +4290,8 @@ dependencies = [ [[package]] name = "tenderdash-proto" -version = "0.14.0-dev.10" -source = "git+https://github.com/dashpay/rs-tenderdash-abci#883d1f5d3ecb26a97dab7a08400fede53059ea62" +version = "0.14.0-dev.11" +source = "git+https://github.com/dashpay/rs-tenderdash-abci#52a0b7cd37d7adcffea7b35eaf9ee10c7a6c8135" dependencies = [ "bytes", "chrono", @@ -4310,8 +4310,8 @@ dependencies = [ [[package]] name = "tenderdash-proto-compiler" -version = "0.14.0-dev.10" -source = "git+https://github.com/dashpay/rs-tenderdash-abci#883d1f5d3ecb26a97dab7a08400fede53059ea62" +version = "0.14.0-dev.11" +source = "git+https://github.com/dashpay/rs-tenderdash-abci#52a0b7cd37d7adcffea7b35eaf9ee10c7a6c8135" dependencies = [ "fs_extra", "prost-build 0.12.3", diff --git a/packages/dapi-grpc/Cargo.toml b/packages/dapi-grpc/Cargo.toml index 55cf60954a..c4525aa878 100644 --- a/packages/dapi-grpc/Cargo.toml +++ b/packages/dapi-grpc/Cargo.toml @@ -37,7 +37,7 @@ tonic = { version = "0.11", features = [ serde = { version = "1.0.171", optional = true, features = ["derive"] } serde_bytes = { version = "0.11.12", optional = true } serde_json = { version = "1.0", optional = true } -tenderdash-proto = { git = "https://github.com/dashpay/rs-tenderdash-abci", version = "0.14.0-dev.9", features = [ +tenderdash-proto = { git = "https://github.com/dashpay/rs-tenderdash-abci", version = "0.14.0-dev.11", features = [ "grpc", ] } dapi-grpc-macros = { path = "../rs-dapi-grpc-macros" } diff --git a/packages/dashmate/configs/defaults/getBaseConfigFactory.js b/packages/dashmate/configs/defaults/getBaseConfigFactory.js index 9521b0d715..a358496b0e 100644 --- a/packages/dashmate/configs/defaults/getBaseConfigFactory.js +++ b/packages/dashmate/configs/defaults/getBaseConfigFactory.js @@ -206,7 +206,7 @@ export default function getBaseConfigFactory(homeDir) { tenderdash: { mode: 'full', docker: { - image: 'dashpay/tenderdash:0.14.0-dev.4', + image: 'dashpay/tenderdash:0.14.0-dev.5', }, p2p: { host: '0.0.0.0', diff --git a/packages/dashmate/configs/getConfigFileMigrationsFactory.js b/packages/dashmate/configs/getConfigFileMigrationsFactory.js index 1a6676ec91..fec6ab4d0f 100644 --- a/packages/dashmate/configs/getConfigFileMigrationsFactory.js +++ b/packages/dashmate/configs/getConfigFileMigrationsFactory.js @@ -513,6 +513,14 @@ export default function getConfigFileMigrationsFactory(homeDir, defaultConfigs) return configFile; }, + '1.0.0-dev.10': (configFile) => { + Object.entries(configFile.configs) + .forEach(([, options]) => { + options.platform.drive.tenderdash.docker.image = base.get('platform.drive.tenderdash.docker.image'); + }); + + return configFile; + }, }; } diff --git a/packages/dashmate/docker-compose.yml b/packages/dashmate/docker-compose.yml index 95dc1a46f4..9ee4f0c008 100644 --- a/packages/dashmate/docker-compose.yml +++ b/packages/dashmate/docker-compose.yml @@ -201,7 +201,6 @@ services: volumes: core_data: drive_abci_data: - drive_abci_logs: drive_tenderdash: networks: diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index 484a85c004..4ade269ccb 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -55,7 +55,7 @@ tracing-subscriber = { version = "0.3.16", default-features = false, features = "tracing-log", ], optional = false } atty = { version = "0.2.14", optional = false } -tenderdash-abci = { git = "https://github.com/dashpay/rs-tenderdash-abci", version = "0.14.0-dev.9", features = [ +tenderdash-abci = { git = "https://github.com/dashpay/rs-tenderdash-abci", version = "0.14.0-dev.11", features = [ "grpc", ] } lazy_static = "1.4.0" diff --git a/packages/rs-drive-abci/src/abci/handler/finalize_block.rs b/packages/rs-drive-abci/src/abci/handler/finalize_block.rs index 7166e80768..177a97f0c0 100644 --- a/packages/rs-drive-abci/src/abci/handler/finalize_block.rs +++ b/packages/rs-drive-abci/src/abci/handler/finalize_block.rs @@ -1,6 +1,7 @@ use crate::abci::app::{BlockExecutionApplication, PlatformApplication, TransactionalApplication}; use crate::error::execution::ExecutionError; use crate::error::Error; +use crate::execution::types::block_execution_context::v0::BlockExecutionContextV0Getters; use crate::platform_types::cleaned_abci_messages::finalized_block_cleaned_request::v0::FinalizeBlockCleanedRequest; use crate::rpc::core::CoreRPCLike; use std::sync::atomic::Ordering; @@ -34,7 +35,9 @@ where "block execution context must be set in block begin handler for finalize block", )))?; - let platform_version = app.platform().state.load().current_platform_version()?; + let platform_version = block_execution_context + .block_platform_state() + .current_platform_version()?; let request_finalize_block: FinalizeBlockCleanedRequest = request.try_into()?; @@ -68,8 +71,5 @@ where .committed_block_height_guard .store(block_height, Ordering::Relaxed); - Ok(proto::ResponseFinalizeBlock { - events: vec![], - retain_height: 0, - }) + Ok(proto::ResponseFinalizeBlock { retain_height: 0 }) } diff --git a/packages/rs-drive-abci/src/abci/handler/info.rs b/packages/rs-drive-abci/src/abci/handler/info.rs index 5ec0bdf74c..af8145ae5c 100644 --- a/packages/rs-drive-abci/src/abci/handler/info.rs +++ b/packages/rs-drive-abci/src/abci/handler/info.rs @@ -26,18 +26,18 @@ where .map(|app_hash| app_hash.to_vec()) .unwrap_or_default(); - let latest_platform_version = PlatformVersion::latest(); + let latest_supported_protocol_version = PlatformVersion::latest().protocol_version; let response = proto::ResponseInfo { data: "".to_string(), - app_version: latest_platform_version.protocol_version as u64, + app_version: latest_supported_protocol_version as u64, last_block_height: platform_state.last_committed_block_height() as i64, version: env!("CARGO_PKG_VERSION").to_string(), last_block_app_hash: state_app_hash.clone(), }; tracing::debug!( - protocol_version = latest_platform_version.protocol_version, + latest_supported_protocol_version, software_version = env!("CARGO_PKG_VERSION"), block_version = request.block_version, p2p_version = request.p2p_version, diff --git a/packages/rs-drive-abci/src/abci/handler/prepare_proposal.rs b/packages/rs-drive-abci/src/abci/handler/prepare_proposal.rs index bcbacada55..ce4c6b8e10 100644 --- a/packages/rs-drive-abci/src/abci/handler/prepare_proposal.rs +++ b/packages/rs-drive-abci/src/abci/handler/prepare_proposal.rs @@ -121,7 +121,6 @@ where mut block_execution_context, } = run_result.into_data().map_err(Error::Protocol)?; - // TODO: This is current protocol version and can be read from the state let platform_version = PlatformVersion::get(protocol_version) .expect("must be set in run block proposal from existing protocol version"); @@ -190,6 +189,7 @@ where validator_set_update, // TODO: implement consensus param updates consensus_param_updates: None, + app_version: protocol_version as u64, }; block_execution_context.set_proposer_results(Some(response.clone())); diff --git a/packages/rs-drive-abci/src/abci/handler/process_proposal.rs b/packages/rs-drive-abci/src/abci/handler/process_proposal.rs index 9a60a8a1e4..bde2cdc9e7 100644 --- a/packages/rs-drive-abci/src/abci/handler/process_proposal.rs +++ b/packages/rs-drive-abci/src/abci/handler/process_proposal.rs @@ -51,6 +51,7 @@ where tx_results: proposal_info.tx_results.clone(), consensus_param_updates: proposal_info.consensus_param_updates.clone(), validator_set_update: proposal_info.validator_set_update.clone(), + events: Vec::new(), }); } @@ -131,6 +132,7 @@ where tx_results, consensus_param_updates, validator_set_update, + events: Vec::new(), }); } else { tracing::warn!( @@ -239,6 +241,7 @@ where validator_set_update, // TODO: Implement consensus param updates consensus_param_updates: None, + events: Vec::new(), }; let elapsed_time_ms = timer.elapsed().as_millis(); diff --git a/packages/rs-drive-abci/src/config.rs b/packages/rs-drive-abci/src/config.rs index 29e862e916..209b980965 100644 --- a/packages/rs-drive-abci/src/config.rs +++ b/packages/rs-drive-abci/src/config.rs @@ -31,6 +31,7 @@ use std::path::PathBuf; use dpp::util::deserializer::ProtocolVersion; use drive::drive::config::DriveConfig; +use drive::drive::defaults::INITIAL_PROTOCOL_VERSION; use serde::{de::DeserializeOwned, Deserialize, Serialize}; use crate::logging::LogConfigs; @@ -238,8 +239,7 @@ impl ExecutionConfig { impl PlatformConfig { fn default_initial_protocol_version() -> ProtocolVersion { - //todo: versioning - 1 + INITIAL_PROTOCOL_VERSION } fn default_tokio_console_address() -> String { @@ -346,7 +346,7 @@ impl PlatformConfig { tokio_console_enabled: false, tokio_console_address: PlatformConfig::default_tokio_console_address(), tokio_console_retention_secs: PlatformConfig::default_tokio_console_retention_secs(), - initial_protocol_version: 1, + initial_protocol_version: Self::default_initial_protocol_version(), prometheus_bind_address: None, grpc_bind_address: "0.0.0.0:26670".to_string(), } @@ -366,7 +366,7 @@ impl PlatformConfig { execution: Default::default(), db_path: PathBuf::from("/var/lib/dash-platform/data"), testing_configs: PlatformTestConfig::default(), - initial_protocol_version: 1, + initial_protocol_version: Self::default_initial_protocol_version(), prometheus_bind_address: None, grpc_bind_address: "0.0.0.0:26670".to_string(), tokio_console_enabled: false, @@ -389,7 +389,7 @@ impl PlatformConfig { execution: Default::default(), db_path: PathBuf::from("/var/lib/dash-platform/data"), testing_configs: PlatformTestConfig::default(), - initial_protocol_version: 1, + initial_protocol_version: Self::default_initial_protocol_version(), prometheus_bind_address: None, grpc_bind_address: "0.0.0.0:26670".to_string(), tokio_console_enabled: false, diff --git a/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/v0/mod.rs b/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/v0/mod.rs index 53eb058e6a..3eccc5a02d 100644 --- a/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/v0/mod.rs @@ -64,7 +64,7 @@ where request_finalize_block: FinalizeBlockCleanedRequest, mut block_execution_context: BlockExecutionContext, transaction: &Transaction, - _last_committed_platform_version: &PlatformVersion, + platform_version: &PlatformVersion, ) -> Result { let mut validation_result = SimpleValidationResult::::new_with_errors(vec![]); @@ -72,14 +72,6 @@ where let epoch_info = block_execution_context.epoch_info(); let block_platform_state = block_execution_context.block_platform_state(); - // TODO: The block was processed with last committed platform version, it's wrong to call all functions - // here with new version. Except probably state storage version. - // Another problem that block was processed wit last committed version but we storing state with new version. - // It means when we load the state we would expect this block to be processed with the new version. - let current_protocol_version = block_platform_state.current_protocol_version_in_consensus(); - - let platform_version = PlatformVersion::get(current_protocol_version)?; - // Let's decompose the request let FinalizeBlockCleanedRequest { commit: mut commit_info, @@ -247,6 +239,8 @@ where } .into(); + self.update_drive_cache(&block_execution_context, platform_version)?; + let block_platform_state = block_execution_context.block_platform_state_owned(); self.update_state_cache( @@ -256,8 +250,6 @@ where platform_version, )?; - self.update_drive_cache(platform_version)?; - // Gather some metrics crate::metrics::abci_last_block_time(block_header.time.seconds as u64); crate::metrics::abci_last_platform_height(height); diff --git a/packages/rs-drive-abci/src/execution/engine/run_block_proposal/mod.rs b/packages/rs-drive-abci/src/execution/engine/run_block_proposal/mod.rs index 7904104c4a..7a766b14f6 100644 --- a/packages/rs-drive-abci/src/execution/engine/run_block_proposal/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/run_block_proposal/mod.rs @@ -1,10 +1,13 @@ use crate::error::execution::ExecutionError; use crate::error::Error; +use crate::platform_types::epoch_info::v0::EpochInfoV0Methods; use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::platform_types::platform_state::PlatformState; use crate::platform_types::{block_execution_outcome, block_proposal}; use crate::rpc::core::CoreRPCLike; use dpp::validation::ValidationResult; +use dpp::version::PlatformVersion; use drive::grovedb::Transaction; mod v0; @@ -45,15 +48,44 @@ where transaction: &Transaction, ) -> Result, Error> { - let platform_version = platform_state.current_platform_version()?; + // Epoch information is always calculated with the last committed platform version + // even if we are switching to a new version in this block. + let last_committed_platform_version = platform_state.current_platform_version()?; + // !!!! This EpochInfo is based on the last committed platform version + // !!!! and will be used for the first block of the epoch. let epoch_info = self.gather_epoch_info( &block_proposal, transaction, platform_state, - platform_version, + last_committed_platform_version, )?; + // Determine a protocol version for this block + let platform_version = if epoch_info.is_epoch_change_but_not_genesis() { + // Switch to next proposed platform version if we are on the first block of the new epoch + // This version must be set to the state as current one during block processing + let next_protocol_version = platform_state.next_epoch_protocol_version(); + + // We should panic if this node is not supported a new protocol version + let Ok(next_platform_version) = PlatformVersion::get(next_protocol_version) else { + panic!( + r#"Failed to upgrade the network protocol version {next_protocol_version}. + +Please update your software to the latest version: https://docs.dash.org/platform-protocol-upgrade + +Your software version: {}, latest supported protocol version: {}."#, + env!("CARGO_PKG_VERSION"), + PlatformVersion::latest().protocol_version + ); + }; + + next_platform_version + } else { + // Stay on the last committed platform version + last_committed_platform_version + }; + match platform_version .drive_abci .methods @@ -63,7 +95,7 @@ where 0 => self.run_block_proposal_v0( block_proposal, known_from_us, - epoch_info.into(), + epoch_info, transaction, platform_state, platform_version, diff --git a/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs b/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs index d030918065..39d96f1530 100644 --- a/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs @@ -77,13 +77,30 @@ where block_proposal.round, ); + // Run block proposal determines version by itself based on the previous + // state and block time. + // It should provide correct version on prepare proposal to block header + // and validate it on process proposal. + // If version set to 0 (default number value) it means we are on prepare proposal, + // so there is no need for validation. + if !known_from_us + && block_proposal.consensus_versions.app != platform_version.protocol_version as u64 + { + return Ok(ValidationResult::new_with_error( + AbciError::BadRequest(format!( + "received a block proposal with protocol version {}, expected: {}", + block_proposal.consensus_versions.app, platform_version.protocol_version + )) + .into(), + )); + } + let last_block_time_ms = last_committed_platform_state.last_committed_block_time_ms(); let last_block_height = last_committed_platform_state.last_committed_known_block_height_or( self.config.abci.genesis_height.saturating_sub(1), ); let last_block_core_height = last_committed_platform_state .last_committed_known_core_height_or(self.config.abci.genesis_core_height); - let hpmn_list_len = last_committed_platform_state.hpmn_list_len() as u32; // Create a bock state from previous committed state let mut block_platform_state = last_committed_platform_state.clone(); @@ -122,6 +139,29 @@ where .expect("current epoch index should be in range"), ); + if epoch_info.is_epoch_change_but_not_genesis() { + tracing::info!( + epoch_index = epoch_info.current_epoch_index(), + "epoch change occurring from epoch {} to epoch {}", + epoch_info + .previous_epoch_index() + .expect("must be set since we aren't on genesis"), + epoch_info.current_epoch_index(), + ); + } + + // Update block platform state with current and next epoch protocol versions + // if it was proposed + // This is happening only on epoch change + self.upgrade_protocol_version_on_epoch_change( + &block_info, + &epoch_info, + last_committed_platform_state, + &mut block_platform_state, + transaction, + platform_version, + )?; + // If there is a core chain lock update, we should start by verifying it if let Some(core_chain_lock_update) = core_chain_lock_update.as_ref() { if !known_from_us { @@ -218,6 +258,7 @@ where )?; // Update the validator proposed app version + // It should be called after protocol version upgrade self.drive .update_validator_proposed_app_version( proposer_pro_tx_hash, @@ -229,55 +270,6 @@ where Error::Execution(ExecutionError::UpdateValidatorProposedAppVersionError(e)) })?; // This is a system error - // Determine a new protocol version if enough proposers voted - if epoch_info.is_epoch_change_but_not_genesis() { - tracing::info!( - epoch_index = epoch_info.current_epoch_index(), - "epoch change occurring from epoch {} to epoch {}", - epoch_info - .previous_epoch_index() - .expect("must be set since we aren't on genesis"), - epoch_info.current_epoch_index(), - ); - - if block_platform_state.current_protocol_version_in_consensus() - == block_platform_state.next_epoch_protocol_version() - { - tracing::trace!( - epoch_index = epoch_info.current_epoch_index(), - "protocol version remains the same {}", - block_platform_state.current_protocol_version_in_consensus(), - ); - } else { - tracing::info!( - epoch_index = epoch_info.current_epoch_index(), - "protocol version changed from {} to {}", - block_platform_state.current_protocol_version_in_consensus(), - block_platform_state.next_epoch_protocol_version(), - ); - } - - // Set current protocol version to the version from upcoming epoch - block_platform_state.set_current_protocol_version_in_consensus( - block_platform_state.next_epoch_protocol_version(), - ); - - // Determine new protocol version based on votes for the next epoch - let maybe_new_protocol_version = self.check_for_desired_protocol_upgrade( - hpmn_list_len, - block_platform_state.current_protocol_version_in_consensus(), - transaction, - )?; - - if let Some(new_protocol_version) = maybe_new_protocol_version { - block_platform_state.set_next_epoch_protocol_version(new_protocol_version); - } else { - block_platform_state.set_next_epoch_protocol_version( - block_platform_state.current_protocol_version_in_consensus(), - ); - } - } - // Mark all previously broadcasted and chainlocked withdrawals as complete // only when we are on a new core height if block_state_info.core_chain_locked_height() != last_block_core_height { @@ -327,7 +319,9 @@ where block_execution_context::v0::BlockExecutionContextV0 { block_state_info: block_state_info.into(), epoch_info: epoch_info.clone(), - hpmn_count: hpmn_list_len, + // TODO: It doesn't seem correct to use previous block count of hpmns. + // We currently not using this field in the codebase. We probably should just remove it. + hpmn_count: last_committed_platform_state.hpmn_list_len() as u32, unsigned_withdrawal_transactions: unsigned_withdrawal_transaction_bytes, block_platform_state, proposer_results: None, @@ -380,7 +374,6 @@ where app_hash: root_hash, state_transitions_result, validator_set_update, - // TODO: We already know the version outside sine we have state and platform version what pass here protocol_version: platform_version.protocol_version, block_execution_context, }, diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_end/update_drive_cache/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_end/update_drive_cache/mod.rs index cc0692e8f3..0342fe4559 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/block_end/update_drive_cache/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/block_end/update_drive_cache/mod.rs @@ -7,6 +7,7 @@ use crate::platform_types::platform::Platform; use crate::rpc::core::CoreRPCLike; +use crate::execution::types::block_execution_context::BlockExecutionContext; use dpp::version::PlatformVersion; impl Platform @@ -29,7 +30,11 @@ where /// * `Result<(), Error>` - If the state cache and quorums are successfully updated, it returns `Ok(())`. /// If there is a problem with the update, it returns an `Error`. /// - pub fn update_drive_cache(&self, platform_version: &PlatformVersion) -> Result<(), Error> { + pub fn update_drive_cache( + &self, + block_execution_context: &BlockExecutionContext, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { match platform_version .drive_abci .methods @@ -37,7 +42,7 @@ where .update_drive_cache { 0 => { - self.update_drive_cache_v0(); + self.update_drive_cache_v0(block_execution_context); Ok(()) } version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_end/update_drive_cache/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_end/update_drive_cache/v0/mod.rs index 386a335268..35852a05d9 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/block_end/update_drive_cache/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/block_end/update_drive_cache/v0/mod.rs @@ -1,3 +1,6 @@ +use crate::execution::types::block_execution_context::v0::BlockExecutionContextV0Getters; +use crate::execution::types::block_execution_context::BlockExecutionContext; +use crate::platform_types::epoch_info::v0::EpochInfoV0Methods; use crate::platform_types::platform::Platform; use crate::rpc::core::CoreRPCLike; @@ -9,7 +12,7 @@ where /// the data contract cache and the platform versions cache. /// #[inline(always)] - pub(super) fn update_drive_cache_v0(&self) { + pub(super) fn update_drive_cache_v0(&self, block_execution_context: &BlockExecutionContext) { // Update global cache with updated contracts self.drive .cache @@ -18,6 +21,17 @@ where let mut protocol_versions_counter = self.drive.cache.protocol_versions_counter.write(); + // Clear previously proposed versions since we started a new epoch + // For more information read comments in `upgrade_protocol_version_v0` function + if block_execution_context + .epoch_info() + .is_epoch_change_but_not_genesis() + { + protocol_versions_counter.clear_global_cache(); + protocol_versions_counter.unblock_global_cache(); + } + + // Update proposed versions with new proposal from the current block protocol_versions_counter.merge_block_cache() } } diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_end/update_state_cache/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_end/update_state_cache/v0/mod.rs index 98ba2cab03..e9c15fe0e0 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/block_end/update_state_cache/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/block_end/update_state_cache/v0/mod.rs @@ -4,7 +4,7 @@ use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::platform_types::platform_state::PlatformState; use crate::rpc::core::CoreRPCLike; use dpp::block::extended_block_info::ExtendedBlockInfo; -use dpp::version::{PlatformVersion, PlatformVersionCurrentVersion}; +use dpp::version::PlatformVersion; use drive::grovedb::Transaction; use std::sync::Arc; @@ -55,11 +55,6 @@ where block_platform_state.set_genesis_block_info(None); - //todo: verify this with an update - let version = PlatformVersion::get(platform_version.protocol_version)?; - - PlatformVersion::set_current(version); - // Persist block state self.store_platform_state(&block_platform_state, Some(transaction), platform_version)?; diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_start/clear_drive_block_cache/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_start/clear_drive_block_cache/v0/mod.rs index 3f64aec8b9..ecf723fa2a 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/block_start/clear_drive_block_cache/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/block_start/clear_drive_block_cache/v0/mod.rs @@ -14,6 +14,9 @@ where let mut protocol_versions_counter = self.drive.cache.protocol_versions_counter.write(); - protocol_versions_counter.clear_block_cache() + protocol_versions_counter.clear_block_cache(); + // Getter is disabled in case of epoch change so we need to enable it back + // For more information read comments in `upgrade_protocol_version_v0` function + protocol_versions_counter.unblock_global_cache(); } } diff --git a/packages/rs-drive-abci/src/execution/platform_events/epoch/gather_epoch_info/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/epoch/gather_epoch_info/mod.rs index 835af9653b..57aff29475 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/epoch/gather_epoch_info/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/epoch/gather_epoch_info/mod.rs @@ -4,7 +4,7 @@ use crate::error::execution::ExecutionError; use crate::error::Error; use crate::platform_types::block_proposal; -use crate::platform_types::epoch_info::v0::EpochInfoV0; +use crate::platform_types::epoch_info::EpochInfo; use crate::platform_types::platform::Platform; use crate::platform_types::platform_state::PlatformState; use dpp::version::PlatformVersion; @@ -31,14 +31,25 @@ impl Platform { transaction: &Transaction, platform_state: &PlatformState, platform_version: &PlatformVersion, - ) -> Result { + ) -> Result { + // !! BE AWARE BEFORE YOU MODIFY THIS CODE !!! + // Please be aware epoch information is gathered with previous platform version + // on epoch change (1st block of the epoch), despite we are switching to a new version + // in this block. Thus, the previous version of EpochInfo might also be used for the first block. + // A new version of this method will be called for the rest of epoch blocks + // and first block of the next epoch. + // This means that if we ever want to update EpochInfo, we will need to do so on a release + // where the new fields of epoch info are not being used. Then make another version once + // that one is activated. match platform_version.drive_abci.methods.epoch.gather_epoch_info { - 0 => self.gather_epoch_info_v0( - block_proposal, - transaction, - platform_state, - platform_version, - ), + 0 => self + .gather_epoch_info_v0( + block_proposal, + transaction, + platform_state, + platform_version, + ) + .map(|v0| v0.into()), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "gather_epoch_info".to_string(), known_versions: vec![0], diff --git a/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/check_for_desired_protocol_upgrade/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/check_for_desired_protocol_upgrade/mod.rs index c2d15fa430..33805f3125 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/check_for_desired_protocol_upgrade/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/check_for_desired_protocol_upgrade/mod.rs @@ -3,20 +3,16 @@ use crate::error::Error; use crate::platform_types::platform::Platform; use dpp::util::deserializer::ProtocolVersion; use dpp::version::PlatformVersion; -use drive::grovedb::Transaction; mod v0; impl Platform { /// Checks for a network upgrade and resets activation window. /// This method should only be called when a new epoch starts. - /// It alters the underlying state but does not change the drive cache. /// /// # Arguments /// /// * `total_hpmns` - The total number of high priority masternodes. - /// * `current_protocol_version_in_consensus` - The current protocol version in consensus. - /// * `transaction` - A transaction argument to interact with the underlying storage. /// /// # Returns /// @@ -34,21 +30,15 @@ impl Platform { pub fn check_for_desired_protocol_upgrade( &self, total_hpmns: u32, - current_protocol_version_in_consensus: ProtocolVersion, - transaction: &Transaction, + platform_version: &PlatformVersion, ) -> Result, Error> { - let current_platform_version = PlatformVersion::get(current_protocol_version_in_consensus)?; - match current_platform_version + match platform_version .drive_abci .methods .protocol_upgrade .check_for_desired_protocol_upgrade { - 0 => self.check_for_desired_protocol_upgrade_v0( - total_hpmns, - current_protocol_version_in_consensus, - transaction, - ), + 0 => self.check_for_desired_protocol_upgrade_v0(total_hpmns, platform_version), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "check_for_desired_protocol_upgrade".to_string(), known_versions: vec![0], diff --git a/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/check_for_desired_protocol_upgrade/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/check_for_desired_protocol_upgrade/v0/mod.rs index 2d7073d9b7..107a55bb87 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/check_for_desired_protocol_upgrade/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/check_for_desired_protocol_upgrade/v0/mod.rs @@ -1,28 +1,27 @@ use crate::error::execution::ExecutionError; use crate::error::Error; use crate::platform_types::platform::Platform; -use dpp::version::PlatformVersion; +use dpp::version::PlatformVersion; use drive::dpp::util::deserializer::ProtocolVersion; -use drive::grovedb::Transaction; - -/// The percentage needed of HPMNs to upgrade the protocol -/// It always needs to be higher than the rounded amount after applying the percentage -const PROTOCOL_VERSION_UPGRADE_PERCENTAGE_NEEDED: u64 = 75; impl Platform { /// checks for a network upgrade and resets activation window /// this should only be called on epoch change - /// this will change backing state, but does not change drive cache pub(super) fn check_for_desired_protocol_upgrade_v0( &self, total_hpmns: u32, - current_protocol_version_in_consensus: ProtocolVersion, - transaction: &Transaction, + platform_version: &PlatformVersion, ) -> Result, Error> { - let required_upgraded_hpns = 1 + let upgrade_percentage_needed = platform_version + .drive_abci + .methods + .protocol_upgrade + .protocol_version_upgrade_percentage_needed; + + let required_upgraded_hpmns = 1 + (total_hpmns as u64) - .checked_mul(PROTOCOL_VERSION_UPGRADE_PERCENTAGE_NEEDED) + .checked_mul(upgrade_percentage_needed) .and_then(|product| product.checked_div(100)) .ok_or(Error::Execution(ExecutionError::Overflow( "overflow for required block count", @@ -30,9 +29,9 @@ impl Platform { // if we are at an epoch change, check to see if over 75% of blocks of previous epoch // were on the future version - let mut protocol_versions_counter = self.drive.cache.protocol_versions_counter.write(); + let protocol_versions_counter = self.drive.cache.protocol_versions_counter.read(); let mut versions_passing_threshold = - protocol_versions_counter.versions_passing_threshold(required_upgraded_hpns); + protocol_versions_counter.versions_passing_threshold(required_upgraded_hpmns); drop(protocol_versions_counter); if versions_passing_threshold.len() > 1 { @@ -45,26 +44,13 @@ impl Platform { if !versions_passing_threshold.is_empty() { // same as equals 1 - let new_version = versions_passing_threshold.remove(0); - // Persist current and next epoch protocol versions - // we also drop all protocol version votes information - self.drive - .change_to_new_version_and_clear_version_information( - current_protocol_version_in_consensus, - new_version, - Some(transaction), - ) - .map_err(Error::Drive)?; + let next_version = versions_passing_threshold.remove(0); - Ok(Some(new_version)) - } else { - // we need to drop all version information - let current_platform_version = - PlatformVersion::get(current_protocol_version_in_consensus)?; - self.drive - .clear_version_information(Some(transaction), ¤t_platform_version.drive) - .map_err(Error::Drive)?; + // TODO: We stored next version here previously. + // It was never used so we can temporary remove it from here and move it to Epoch trees in upcoming PR + Ok(Some(next_version)) + } else { Ok(None) } } diff --git a/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/mod.rs index a69fee99bb..b2e1e826d4 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/mod.rs @@ -1 +1,2 @@ mod check_for_desired_protocol_upgrade; +mod upgrade_protocol_version; diff --git a/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/upgrade_protocol_version/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/upgrade_protocol_version/mod.rs new file mode 100644 index 0000000000..18fff0fb65 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/upgrade_protocol_version/mod.rs @@ -0,0 +1,58 @@ +mod v0; + +use crate::error::execution::ExecutionError; +use crate::error::Error; +use crate::platform_types::epoch_info::EpochInfo; +use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; +use dpp::block::block_info::BlockInfo; +use dpp::version::PlatformVersion; +use drive::grovedb::Transaction; + +impl Platform { + /// Sets current protocol version and next epoch protocol version to block platform state + /// + /// This function should be called on very top of bock production before we add new proposed version for the next epoch + /// + /// It takes five parameters: + /// * `block_info`: Information about the current block. + /// * `epoch_info`: Information about the current epoch. + /// * `last_committed_platform_state`: The last committed state of the platform. + /// * `block_platform_state`: The current state of the platform. + /// * `transaction`: The current transaction. + /// * `platform_version`: The current version of the platform. + /// + /// # Errors + /// + /// This function will return an error if the previous block protocol version does not match the current block protocol version not on epoch change + pub fn upgrade_protocol_version_on_epoch_change( + &self, + block_info: &BlockInfo, + epoch_info: &EpochInfo, + last_committed_platform_state: &PlatformState, + block_platform_state: &mut PlatformState, + transaction: &Transaction, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + match platform_version + .drive_abci + .methods + .protocol_upgrade + .upgrade_protocol_version_on_epoch_change + { + 0 => self.upgrade_protocol_version_on_epoch_change_v0( + block_info, + epoch_info, + last_committed_platform_state, + block_platform_state, + transaction, + platform_version, + ), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "upgrade_protocol_version_on_epoch_change".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/upgrade_protocol_version/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/upgrade_protocol_version/v0/mod.rs new file mode 100644 index 0000000000..5cce6dd324 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/upgrade_protocol_version/v0/mod.rs @@ -0,0 +1,139 @@ +use crate::error::execution::ExecutionError; +use crate::error::Error; +use crate::platform_types::epoch_info::v0::{EpochInfoV0Getters, EpochInfoV0Methods}; +use crate::platform_types::epoch_info::EpochInfo; +use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::v0::PlatformStateV0Methods; +use crate::platform_types::platform_state::PlatformState; +use chrono::{TimeZone, Utc}; +use dpp::block::block_info::BlockInfo; +use dpp::version::PlatformVersion; +use drive::grovedb::Transaction; + +impl Platform { + /// Sets current protocol version and next epoch protocol version to block platform state + /// + /// It takes five parameters: + /// * `epoch_info`: Information about the current epoch. + /// * `last_committed_platform_state`: The last committed state of the platform. + /// * `block_platform_state`: The current state of the platform. + /// * `transaction`: The current transaction. + /// * `platform_version`: The current version of the platform. + /// + /// # Errors + /// + /// This function will return an error if the previous block protocol version does not match the current block protocol version not on epoch change + pub(super) fn upgrade_protocol_version_on_epoch_change_v0( + &self, + block_info: &BlockInfo, + epoch_info: &EpochInfo, + last_committed_platform_state: &PlatformState, + block_platform_state: &mut PlatformState, + transaction: &Transaction, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + let previous_block_protocol_version = last_committed_platform_state + .current_platform_version()? + .protocol_version; + let current_block_protocol_version = platform_version.protocol_version; + + // Protocol version can be changed only on epoch change + if epoch_info.is_epoch_change_but_not_genesis() { + if current_block_protocol_version == previous_block_protocol_version { + tracing::info!( + epoch_index = epoch_info.current_epoch_index(), + "protocol version remains the same {}", + current_block_protocol_version, + ); + } else { + tracing::info!( + epoch_index = epoch_info.current_epoch_index(), + "protocol version changed from {} to {}", + previous_block_protocol_version, + current_block_protocol_version, + ); + + block_platform_state + .set_current_protocol_version_in_consensus(current_block_protocol_version); + + // Store current protocol version in drive state + // TODO: This will be removed in #1778 + self.drive.store_current_protocol_version( + platform_version.protocol_version, + Some(transaction), + &platform_version.drive, + )?; + }; + + // Determine a new protocol version for the next epoch if enough proposers voted + // otherwise keep the current one + + let hpmn_list_len = last_committed_platform_state.hpmn_list_len() as u32; + + let next_epoch_protocol_version = + self.check_for_desired_protocol_upgrade(hpmn_list_len, platform_version)?; + + if let Some(protocol_version) = next_epoch_protocol_version { + block_platform_state.set_next_epoch_protocol_version(protocol_version); + } + + // Since we are starting a new epoch we need to drop previously + // proposed versions + + // Remove previously proposed versions from Drive state + self.drive + .clear_version_information(Some(transaction), &platform_version.drive) + .map_err(Error::Drive)?; + + // We clean voting counter cache only on finalize block because: + // 1. The voting counter global cache uses for querying of voting information in Drive queries + // 2. There might be multiple rounds so on the next round we will lose all previous epoch votes + // + // Instead of clearing cache, the further block processing logic is using `get_if_enabled` + // to get a version counter from the global cache. We disable this getter here to prevent + // reading previous voting information for the new epoch. + // The getter must be enabled back on finalize block in [update_drive_cache] and at the very beginning + // of the block processing in [clear_drive_block_cache]. + + let mut protocol_versions_counter = self.drive.cache.protocol_versions_counter.write(); + protocol_versions_counter.block_global_cache(); + drop(protocol_versions_counter); + } else if current_block_protocol_version != previous_block_protocol_version { + return Err(Error::Execution(ExecutionError::CorruptedCodeExecution( + "unexpected protocol upgrade: it should happen only on epoch change", + ))); + } + + // Warn user to update software if the next protocol version is not supported + let latest_supported_protocol_version = PlatformVersion::latest().protocol_version; + let next_epoch_protocol_version = block_platform_state.next_epoch_protocol_version(); + if block_platform_state.next_epoch_protocol_version() > latest_supported_protocol_version { + let genesis_time_ms = self.get_genesis_time( + block_info.height, + block_info.time_ms, + transaction, + platform_version, + )?; + + let next_epoch_activation_datetime_ms = genesis_time_ms + + (epoch_info.current_epoch_index() as u64 + * self.config.execution.epoch_time_length_s + * 1000); + + let next_epoch_activation_datetime = Utc + .timestamp_millis_opt(next_epoch_activation_datetime_ms as i64) + .single() + .expect("next_epoch_activation_date must always be in the range"); + + tracing::warn!( + next_epoch_protocol_version, + latest_supported_protocol_version, + "The node doesn't support new protocol version {} that will be activated starting from {}. Please update your software, otherwise the node won't be able to participate in the network. https://docs.dash.org/platform-protocol-upgrade", + next_epoch_protocol_version, + next_epoch_activation_datetime.to_rfc2822(), + ); + } + + Ok(()) + } +} diff --git a/packages/rs-drive-abci/src/mimic/mod.rs b/packages/rs-drive-abci/src/mimic/mod.rs index d043556adf..d548590106 100644 --- a/packages/rs-drive-abci/src/mimic/mod.rs +++ b/packages/rs-drive-abci/src/mimic/mod.rs @@ -117,7 +117,7 @@ impl<'a, C: CoreRPCLike> FullAbciApplication<'a, C> { .unwrap() }); - const APP_VERSION: u64 = 0; + const DEFAULT_APP_VERSION: u64 = 0; let mut rng = StdRng::seed_from_u64(block_info.height); @@ -153,7 +153,7 @@ impl<'a, C: CoreRPCLike> FullAbciApplication<'a, C> { proposed_app_version: proposed_version as u64, version: Some(Consensus { block: 0, - app: APP_VERSION, + app: DEFAULT_APP_VERSION, // TODO: Prepare proposal should get 0 always }), quorum_hash: current_quorum.quorum_hash.to_byte_array().to_vec(), }; @@ -173,6 +173,7 @@ impl<'a, C: CoreRPCLike> FullAbciApplication<'a, C> { consensus_param_updates: _, core_chain_lock_update, validator_set_update, + app_version, } = response_prepare_proposal; if let Some(core_chain_lock_update) = core_chain_lock_update.as_ref() { @@ -231,7 +232,7 @@ impl<'a, C: CoreRPCLike> FullAbciApplication<'a, C> { let state_id = StateId { app_hash: app_hash.clone(), - app_version: APP_VERSION, + app_version, core_chain_locked_height: core_height, height, time: time.to_milis(), @@ -271,7 +272,7 @@ impl<'a, C: CoreRPCLike> FullAbciApplication<'a, C> { proposed_app_version: proposed_version as u64, version: Some(Consensus { block: 0, - app: APP_VERSION, + app: app_version, }), quorum_hash: current_quorum.quorum_hash.to_byte_array().to_vec(), }; @@ -519,7 +520,7 @@ impl<'a, C: CoreRPCLike> FullAbciApplication<'a, C> { header: Some(Header { version: Some(Consensus { block: 0, //todo - app: APP_VERSION, + app: app_version, }), chain_id: CHAIN_ID.to_string(), height: height as i64, @@ -590,7 +591,7 @@ impl<'a, C: CoreRPCLike> FullAbciApplication<'a, C> { Ok(MimicExecuteBlockOutcome { state_transaction_results, - app_version: APP_VERSION, + app_version, withdrawal_transactions, validator_set_update, next_validator_set_hash, diff --git a/packages/rs-drive-abci/src/platform_types/epoch_info/mod.rs b/packages/rs-drive-abci/src/platform_types/epoch_info/mod.rs index 78dac32a8c..3fb8512a78 100644 --- a/packages/rs-drive-abci/src/platform_types/epoch_info/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/epoch_info/mod.rs @@ -15,6 +15,17 @@ use serde::{Deserialize, Serialize}; pub mod v0; /// Info pertinent to the current epoch. +/// +/// BE AWARE BEFORE YOU MODIFY THIS CODE +/// +/// Please be aware epoch information is gathered with previous platform version +/// on epoch change (1st block of the epoch), despite we are switching to a new version +/// in this block. Thus, the previous version of EpochInfo might also be used for the first block. +/// A new version of EpochInfo will be used for the rest of epoch blocks +/// and first block of the next epoch. +/// This means that if we ever want to update EpochInfo, we will need to do so on a release +/// where the new fields of epoch info are not being used. Then make another version once +/// that one is activated. #[derive(Clone, Serialize, Deserialize, Debug, From, Eq, PartialEq)] #[serde(rename_all = "camelCase")] pub enum EpochInfo { diff --git a/packages/rs-drive-abci/src/query/system/version_upgrade_state/v0/mod.rs b/packages/rs-drive-abci/src/query/system/version_upgrade_state/v0/mod.rs index 6736a589a3..e840dd2dff 100644 --- a/packages/rs-drive-abci/src/query/system/version_upgrade_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/system/version_upgrade_state/v0/mod.rs @@ -133,6 +133,7 @@ mod tests { let mut version_count = version_counter .get(&version.protocol_version) + .expect("expected to get version count") .cloned() .unwrap_or_default(); @@ -255,6 +256,7 @@ mod tests { let mut version_count = version_counter .get(&version.protocol_version) + .expect("expected to get version count") .cloned() .unwrap_or_default(); diff --git a/packages/rs-drive-abci/src/query/system/version_upgrade_vote_status/v0/mod.rs b/packages/rs-drive-abci/src/query/system/version_upgrade_vote_status/v0/mod.rs index 52dd78ef9e..ea550ccf7c 100644 --- a/packages/rs-drive-abci/src/query/system/version_upgrade_vote_status/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/system/version_upgrade_vote_status/v0/mod.rs @@ -175,6 +175,7 @@ mod tests { let mut version_count = version_counter .get(&version.protocol_version) + .expect("expected to get version count") .cloned() .unwrap_or_default(); @@ -311,6 +312,7 @@ mod tests { let mut version_count = version_counter .get(&version.protocol_version) + .expect("expected to get version count") .cloned() .unwrap_or_default(); diff --git a/packages/rs-drive-abci/tests/strategy_tests/execution.rs b/packages/rs-drive-abci/tests/strategy_tests/execution.rs index 66ba2f947e..3db5a245fa 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/execution.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/execution.rs @@ -577,9 +577,9 @@ pub(crate) fn run_chain_for_strategy( } }; - let block_hash = *core_blocks - .get(&block_height) - .unwrap_or_else(|| panic!("expected a block hash to be known for {}", core_height)); + let Some(block_hash) = core_blocks.get(&block_height) else { + panic!("expected a block hash to be known for {}", block_height); + }; let chain_lock = if sign_chain_locks { // From DIP 8: https://github.com/dashpay/dips/blob/master/dip-0008.md#finalization-of-signed-blocks @@ -594,7 +594,7 @@ pub(crate) fn run_chain_for_strategy( .expect("expected to encode the prefix"); engine.input("clsig".as_bytes()); - engine.input(core_height.to_le_bytes().as_slice()); + engine.input(block_height.to_le_bytes().as_slice()); let request_id = QuorumSigningRequestId::from_engine(engine); @@ -617,7 +617,7 @@ pub(crate) fn run_chain_for_strategy( engine.input(&[chain_lock_quorum_type as u8]); engine.input(quorum_hash.as_slice()); engine.input(request_id.as_byte_array()); - engine.input(&block_hash); + engine.input(block_hash); let message_digest = sha256d::Hash::from_engine(engine); @@ -626,16 +626,16 @@ pub(crate) fn run_chain_for_strategy( .expect("expected to have a valid private key"); let signature = quorum_private_key.sign(message_digest.as_byte_array()); let chain_lock = ChainLock { - block_height: core_height, - block_hash: BlockHash::from_byte_array(block_hash), + block_height, + block_hash: BlockHash::from_byte_array(*block_hash), signature: (*signature.to_bytes()).into(), }; Ok(chain_lock) } else { let chain_lock = ChainLock { - block_height: core_height, - block_hash: BlockHash::from_byte_array(block_hash), + block_height, + block_hash: BlockHash::from_byte_array(*block_hash), signature: [2; 96].into(), }; diff --git a/packages/rs-drive-abci/tests/strategy_tests/main.rs b/packages/rs-drive-abci/tests/strategy_tests/main.rs index 894b5cd36f..0d66e5c0fb 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/main.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/main.rs @@ -792,7 +792,7 @@ mod tests { .index, 0 ); - assert!(counter.get(&1).unwrap() > &240); + assert!(counter.get(&1).unwrap().unwrap() > &240); } #[test] @@ -1144,7 +1144,7 @@ mod tests { .unwrap() .unwrap() ), - "e955d7935da01eb2ee8b1935a49ceb4b7021ffce1dec5bb401ce1de5cdf330b5".to_string() + "bb11d456206e85b3225ffbd35d915ab1c92e1a64057057b272fb3931325caa22".to_string() ) } @@ -1833,7 +1833,7 @@ mod tests { .unwrap() .unwrap() ), - "0d2ccf74932904c3463764528d34cc220dcb66cbbe8ea1a031367056aeda77c0".to_string() + "de45b3f20c8e9492ec82b236f856d2073d122b4b73be52d03b4439d5465fc035".to_string() ) } @@ -1958,7 +1958,7 @@ mod tests { .unwrap() .unwrap() ), - "bc0eee6f0d40ae9a2c8f2ae9f95874d403056349b99f96c11d4562be12fc5015".to_string() + "0a4caafbfbde56a4a98c067126c75c577e4ebd636085e5b74521ac1baed7bccb".to_string() ) } diff --git a/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs b/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs index 6a6598a7c6..b2d4e51214 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs @@ -1,5 +1,6 @@ #[cfg(test)] mod tests { + use dpp::block::block_info::BlockInfo; use dpp::block::extended_block_info::v0::ExtendedBlockInfoV0Getters; use dpp::dashcore::hashes::Hash; use dpp::dashcore::{BlockHash, ChainLock}; @@ -8,14 +9,19 @@ mod tests { use crate::execution::{continue_chain_for_strategy, run_chain_for_strategy}; use crate::strategy::{ - ChainExecutionOutcome, ChainExecutionParameters, NetworkStrategy, StrategyRandomness, - UpgradingInfo, + ChainExecutionOutcome, ChainExecutionParameters, CoreHeightIncrease, + MasternodeListChangesStrategy, NetworkStrategy, StrategyRandomness, UpgradingInfo, }; use drive_abci::config::{ExecutionConfig, PlatformConfig, PlatformTestConfig}; + use drive_abci::mimic::MimicExecuteBlockOptions; use drive_abci::platform_types::platform_state::v0::PlatformStateV0Methods; use drive_abci::test::helpers::setup::TestPlatformBuilder; - use platform_version::version::mocks::v2_test::TEST_PROTOCOL_VERSION_2; - use platform_version::version::mocks::v3_test::TEST_PROTOCOL_VERSION_3; + use platform_version::version::mocks::v2_test::{TEST_PLATFORM_V2, TEST_PROTOCOL_VERSION_2}; + use platform_version::version::mocks::v3_test::{TEST_PLATFORM_V3, TEST_PROTOCOL_VERSION_3}; + use platform_version::version::mocks::TEST_PROTOCOL_VERSION_SHIFT_BYTES; + use platform_version::version::v1::{PLATFORM_V1, PROTOCOL_VERSION_1}; + use platform_version::version::PLATFORM_TEST_VERSIONS; + use strategy_tests::frequency::Frequency; use strategy_tests::{IdentityInsertInfo, StartIdentities, Strategy}; #[test] @@ -49,7 +55,6 @@ mod tests { proposed_protocol_versions_with_weight: vec![(TEST_PROTOCOL_VERSION_2, 1)], upgrade_three_quarters_life: 0.1, }), - proposer_strategy: Default::default(), rotate_quorums: false, failure_testing: None, @@ -130,7 +135,10 @@ mod tests { ); assert_eq!(state.current_protocol_version_in_consensus(), 1); assert_eq!( - (counter.get(&1), counter.get(&TEST_PROTOCOL_VERSION_2)), + ( + counter.get(&1).unwrap(), + counter.get(&TEST_PROTOCOL_VERSION_2).unwrap() + ), (Some(&17), Some(&414)) ); //most nodes were hit (63 were not) @@ -195,8 +203,8 @@ mod tests { ); assert_eq!(state.current_protocol_version_in_consensus(), 1); assert_eq!(state.next_epoch_protocol_version(), TEST_PROTOCOL_VERSION_2); - assert_eq!(counter.get(&1), None); //no one has proposed 1 yet - assert_eq!(counter.get(&TEST_PROTOCOL_VERSION_2), Some(&154)); + assert_eq!(counter.get(&1).unwrap(), None); //no one has proposed 1 yet + assert_eq!(counter.get(&TEST_PROTOCOL_VERSION_2).unwrap(), Some(&154)); } // we locked in @@ -249,8 +257,8 @@ mod tests { TEST_PROTOCOL_VERSION_2 ); assert_eq!(state.next_epoch_protocol_version(), TEST_PROTOCOL_VERSION_2); - assert_eq!(counter.get(&1), None); //no one has proposed 1 yet - assert_eq!(counter.get(&TEST_PROTOCOL_VERSION_2), Some(&122)); + assert_eq!(counter.get(&1).unwrap(), None); //no one has proposed 1 yet + assert_eq!(counter.get(&TEST_PROTOCOL_VERSION_2).unwrap(), Some(&123)); } }) .expect("Failed to create thread with custom stack size"); @@ -277,7 +285,6 @@ mod tests { operations: vec![], start_identities: StartIdentities::default(), identities_inserts: IdentityInsertInfo::default(), - identity_contract_nonce_gaps: None, signer: None, }, @@ -290,7 +297,6 @@ mod tests { proposed_protocol_versions_with_weight: vec![(TEST_PROTOCOL_VERSION_2, 1)], upgrade_three_quarters_life: 0.2, }), - proposer_strategy: Default::default(), rotate_quorums: false, failure_testing: None, @@ -366,10 +372,14 @@ mod tests { .index, 0 ); + assert_eq!(state.last_committed_block_epoch().index, 0); assert_eq!(state.current_protocol_version_in_consensus(), 1); assert_eq!(state.next_epoch_protocol_version(), 1); assert_eq!( - (counter.get(&1), counter.get(&TEST_PROTOCOL_VERSION_2)), + ( + counter.get(&1).unwrap(), + counter.get(&TEST_PROTOCOL_VERSION_2).unwrap() + ), (Some(&6), Some(&44)) ); //most nodes were hit (63 were not) @@ -399,7 +409,7 @@ mod tests { ChainExecutionParameters { block_start, core_height_start: 1, - block_count: 2, + block_count: 1, proposers, quorums, current_quorum_hash, @@ -427,10 +437,11 @@ mod tests { .index, 1 ); + assert_eq!(state.last_committed_block_epoch().index, 1); assert_eq!(state.current_protocol_version_in_consensus(), 1); assert_eq!(state.next_epoch_protocol_version(), TEST_PROTOCOL_VERSION_2); - assert_eq!(counter.get(&1), None); //no one has proposed 1 yet - assert_eq!(counter.get(&TEST_PROTOCOL_VERSION_2), Some(&1)); + assert_eq!(counter.get(&1).unwrap(), None); //no one has proposed 1 yet + assert_eq!(counter.get(&TEST_PROTOCOL_VERSION_2).unwrap(), Some(&1)); } // we locked in @@ -479,9 +490,10 @@ mod tests { state.current_protocol_version_in_consensus(), TEST_PROTOCOL_VERSION_2 ); + assert_eq!(state.last_committed_block_epoch().index, 2); assert_eq!(state.next_epoch_protocol_version(), TEST_PROTOCOL_VERSION_2); - assert_eq!(counter.get(&1), None); //no one has proposed 1 yet - assert_eq!(counter.get(&TEST_PROTOCOL_VERSION_2), Some(&1)); + assert_eq!(counter.get(&1).unwrap(), None); //no one has proposed 1 yet + assert_eq!(counter.get(&TEST_PROTOCOL_VERSION_2).unwrap(), Some(&1)); } }) .expect("Failed to create thread with custom stack size"); @@ -490,6 +502,166 @@ mod tests { handler.join().expect("Thread has panicked"); } + #[test] + fn run_chain_on_epoch_change_with_new_version_and_removing_votes() { + // Add a new version to upgrade to new protocol version only with one vote + const TEST_PROTOCOL_VERSION_4_WITH_1_HPMN_UPGRADE: u32 = + (1 << TEST_PROTOCOL_VERSION_SHIFT_BYTES) + 4; + + let mut test_platform_v4 = PLATFORM_V1.clone(); + test_platform_v4 + .drive_abci + .methods + .protocol_upgrade + .protocol_version_upgrade_percentage_needed = 1; + + PlatformVersion::replace_test_versions(vec![ + TEST_PLATFORM_V2, + TEST_PLATFORM_V3, + test_platform_v4, + ]); + + let strategy = NetworkStrategy { + total_hpmns: 50, + upgrading_info: Some(UpgradingInfo { + current_protocol_version: TEST_PROTOCOL_VERSION_4_WITH_1_HPMN_UPGRADE, + proposed_protocol_versions_with_weight: vec![(TEST_PROTOCOL_VERSION_2, 1)], + upgrade_three_quarters_life: 0.0, + }), + core_height_increase: CoreHeightIncrease::KnownCoreHeightIncreases(vec![1, 2, 3, 4, 5]), + // Remove HPMNs to trigger remove_validators_proposed_app_versions + proposer_strategy: MasternodeListChangesStrategy { + removed_hpmns: Frequency { + times_per_block_range: 1..2, + chance_per_block: None, + }, + ..Default::default() + }, + ..Default::default() + }; + + // 1 block is 1 epoch + let epoch_time_length_s = 60; + + let config = PlatformConfig { + validator_set_quorum_size: 30, + execution: ExecutionConfig { + epoch_time_length_s, + ..Default::default() + }, + initial_protocol_version: TEST_PROTOCOL_VERSION_4_WITH_1_HPMN_UPGRADE, + block_spacing_ms: epoch_time_length_s * 1000, + testing_configs: PlatformTestConfig::default_with_no_block_signing(), + ..Default::default() + }; + + let mut platform = TestPlatformBuilder::new() + .with_config(config.clone()) + .build_with_mock_rpc(); + + let ChainExecutionOutcome { + abci_app, + proposers, + quorums, + current_quorum_hash, + end_time_ms, + .. + } = run_chain_for_strategy(&mut platform, 1, strategy.clone(), config.clone(), 13); + + let platform = abci_app.platform; + + let state = platform.state.load(); + let counter = platform.drive.cache.protocol_versions_counter.read(); + + assert_eq!(state.last_committed_block_epoch().index, 0); + assert_eq!( + state.current_protocol_version_in_consensus(), + TEST_PROTOCOL_VERSION_4_WITH_1_HPMN_UPGRADE + ); + assert_eq!( + state.next_epoch_protocol_version(), + TEST_PROTOCOL_VERSION_4_WITH_1_HPMN_UPGRADE + ); + assert_eq!(state.last_committed_core_height(), 2); + assert_eq!(counter.get(&1).unwrap(), None); + assert_eq!(counter.get(&TEST_PROTOCOL_VERSION_2).unwrap(), Some(&1)); + assert_eq!(counter.get(&TEST_PROTOCOL_VERSION_3).unwrap(), None); + assert_eq!( + counter + .get(&TEST_PROTOCOL_VERSION_4_WITH_1_HPMN_UPGRADE) + .unwrap(), + None + ); + + drop(counter); + + // Next bock is epoch change. We want to test our protocol + // upgrade logic. We will propose a new version and remove HPMN + // to make sure all protocol version count functions are called during block execution. + + let last_committed_block_info = state + .last_committed_block_info() + .as_ref() + .unwrap() + .basic_info(); + + let proposer_pro_tx_hash = proposers + .first() + .expect("we should have proposers") + .masternode + .pro_tx_hash; + + let current_quorum_with_test_info = + quorums.get(¤t_quorum_hash).expect("expected quorum"); + + // We want to add proposal for a new version + let proposed_version = TEST_PROTOCOL_VERSION_3; + + let block_info = BlockInfo { + time_ms: end_time_ms + epoch_time_length_s + 1, + height: last_committed_block_info.height + 1, + core_height: last_committed_block_info.core_height, + epoch: Default::default(), + }; + + abci_app + .mimic_execute_block( + proposer_pro_tx_hash.into(), + current_quorum_with_test_info, + proposed_version, + block_info, + 0, + &[], + false, + Vec::new(), + MimicExecuteBlockOptions { + dont_finalize_block: strategy.dont_finalize_block(), + rounds_before_finalization: strategy + .failure_testing + .as_ref() + .and_then(|failure_testing| failure_testing.rounds_before_successful_block), + max_tx_bytes_per_block: strategy.max_tx_bytes_per_block, + independent_process_proposal_verification: strategy + .independent_process_proposal_verification, + }, + ) + .expect("expected to execute a block"); + + let state = platform.state.load(); + let counter = platform.drive.cache.protocol_versions_counter.read(); + + assert_eq!(state.last_committed_block_epoch().index, 1); + assert_eq!( + state.current_protocol_version_in_consensus(), + TEST_PROTOCOL_VERSION_4_WITH_1_HPMN_UPGRADE + ); + assert_eq!(state.next_epoch_protocol_version(), TEST_PROTOCOL_VERSION_2); + assert_eq!(counter.get(&1).unwrap(), None); + assert_eq!(counter.get(&TEST_PROTOCOL_VERSION_2).unwrap(), None); + assert_eq!(counter.get(&TEST_PROTOCOL_VERSION_3).unwrap(), Some(&1)); + assert_eq!(state.last_committed_core_height(), 3); + } + #[test] fn run_chain_version_upgrade_slow_upgrade() { // Define the desired stack size @@ -595,7 +767,10 @@ mod tests { assert_eq!(state.next_epoch_protocol_version(), 1); let counter = &platform.drive.cache.protocol_versions_counter.read(); assert_eq!( - (counter.get(&1), counter.get(&TEST_PROTOCOL_VERSION_2)), + ( + counter.get(&1).unwrap(), + counter.get(&TEST_PROTOCOL_VERSION_2).unwrap() + ), (Some(&35), Some(&64)) ); } @@ -657,7 +832,10 @@ mod tests { assert_eq!(state.next_epoch_protocol_version(), TEST_PROTOCOL_VERSION_2); // the counter is for the current voting during that window assert_eq!( - (counter.get(&1), counter.get(&TEST_PROTOCOL_VERSION_2)), + ( + counter.get(&1).unwrap(), + counter.get(&TEST_PROTOCOL_VERSION_2).unwrap() + ), (Some(&8), Some(&79)) ); } @@ -877,8 +1055,11 @@ mod tests { assert_eq!(state.current_protocol_version_in_consensus(), 1); assert_eq!(state.next_epoch_protocol_version(), TEST_PROTOCOL_VERSION_2); assert_eq!( - (counter.get(&1), counter.get(&TEST_PROTOCOL_VERSION_2)), - (Some(&18), Some(&111)) + ( + counter.get(&1).unwrap(), + counter.get(&TEST_PROTOCOL_VERSION_2).unwrap() + ), + (Some(&18), Some(&112)) ); //not all nodes have upgraded } @@ -958,7 +1139,10 @@ mod tests { { let counter = &platform.drive.cache.protocol_versions_counter.read(); assert_eq!( - (counter.get(&1), counter.get(&TEST_PROTOCOL_VERSION_2)), + ( + counter.get(&1).unwrap(), + counter.get(&TEST_PROTOCOL_VERSION_2).unwrap() + ), (Some(&172), Some(&24)) ); //a lot nodes reverted to previous version, however this won't impact things @@ -1010,8 +1194,11 @@ mod tests { { let counter = &platform.drive.cache.protocol_versions_counter.read(); assert_eq!( - (counter.get(&1), counter.get(&TEST_PROTOCOL_VERSION_2)), - (Some(&23), Some(&2)) + ( + counter.get(&1).unwrap(), + counter.get(&TEST_PROTOCOL_VERSION_2).unwrap() + ), + (Some(&24), Some(&2)) ); assert_eq!( state @@ -1136,9 +1323,9 @@ mod tests { assert_eq!(state.next_epoch_protocol_version(), TEST_PROTOCOL_VERSION_2); assert_eq!( ( - counter.get(&1), - counter.get(&TEST_PROTOCOL_VERSION_2), - counter.get(&TEST_PROTOCOL_VERSION_3) + counter.get(&1).unwrap(), + counter.get(&TEST_PROTOCOL_VERSION_2).unwrap(), + counter.get(&TEST_PROTOCOL_VERSION_3).unwrap() ), (Some(&2), Some(&68), Some(&3)) ); //some nodes reverted to previous version @@ -1224,9 +1411,9 @@ mod tests { assert_eq!(state.next_epoch_protocol_version(), TEST_PROTOCOL_VERSION_3); assert_eq!( ( - counter.get(&1), - counter.get(&TEST_PROTOCOL_VERSION_2), - counter.get(&TEST_PROTOCOL_VERSION_3) + counter.get(&1).unwrap(), + counter.get(&TEST_PROTOCOL_VERSION_2).unwrap(), + counter.get(&TEST_PROTOCOL_VERSION_3).unwrap() ), (None, Some(&3), Some(&143)) ); diff --git a/packages/rs-drive-proof-verifier/Cargo.toml b/packages/rs-drive-proof-verifier/Cargo.toml index 62c3deb0b7..9ab9811b1f 100644 --- a/packages/rs-drive-proof-verifier/Cargo.toml +++ b/packages/rs-drive-proof-verifier/Cargo.toml @@ -20,7 +20,7 @@ drive = { path = "../rs-drive", default-features = false, features = [ "verify", ] } dpp = { path = "../rs-dpp" } -tenderdash-abci = { git = "https://github.com/dashpay/rs-tenderdash-abci", version = "0.14.0-dev.9", features = [ +tenderdash-abci = { git = "https://github.com/dashpay/rs-tenderdash-abci", version = "0.14.0-dev.11", features = [ "grpc", ] } tracing = { version = "0.1.37" } diff --git a/packages/rs-drive/src/drive/cache/protocol_version.rs b/packages/rs-drive/src/drive/cache/protocol_version.rs index cb1622da39..5ca50cc68d 100644 --- a/packages/rs-drive/src/drive/cache/protocol_version.rs +++ b/packages/rs-drive/src/drive/cache/protocol_version.rs @@ -1,4 +1,5 @@ use crate::drive::Drive; +use crate::error::cache::CacheError; use crate::error::Error; use dpp::util::deserializer::ProtocolVersion; use grovedb::TransactionArg; @@ -14,7 +15,7 @@ pub struct ProtocolVersionsCache { pub global_cache: IntMap, block_cache: IntMap, loaded: bool, - needs_wipe: bool, + is_global_cache_blocked: bool, } #[cfg(feature = "full")] @@ -46,23 +47,40 @@ impl ProtocolVersionsCache { /// Tries to get a version from block cache if present /// if block cache doesn't have the version set /// then it tries get the version from global cache - pub fn get(&self, version: &ProtocolVersion) -> Option<&u64> { - if let Some(count) = self.block_cache.get(version) { + pub fn get(&self, version: &ProtocolVersion) -> Result, Error> { + if self.is_global_cache_blocked { + return Err(Error::Cache(CacheError::GlobalCacheIsBlocked)); + } + + let counter = if let Some(count) = self.block_cache.get(version) { Some(count) } else { self.global_cache.get(version) - } + }; + + Ok(counter) + } + + /// Disable the global cache to do not allow get counters + /// If global cache is blocked then [get] will return an error + pub fn block_global_cache(&mut self) { + self.is_global_cache_blocked = true; + } + + /// Unblock the global cache + /// This function enables the normal behaviour of [get] function + pub fn unblock_global_cache(&mut self) { + self.is_global_cache_blocked = false; } /// Merge block cache to global cache pub fn merge_block_cache(&mut self) { - if self.needs_wipe { - self.global_cache.clear(); - self.block_cache.clear(); - self.needs_wipe = false; - } else { - self.global_cache.extend(self.block_cache.drain()); - } + self.global_cache.extend(self.block_cache.drain()); + } + + /// Clears the global cache + pub fn clear_global_cache(&mut self) { + self.global_cache.clear(); } /// Clear block cache @@ -70,19 +88,15 @@ impl ProtocolVersionsCache { self.block_cache.clear() } - /// Versions passing threshold - pub fn versions_passing_threshold( - &mut self, - required_upgraded_hpns: u64, - ) -> Vec { - self.needs_wipe = true; + /// Collect versions passing threshold + pub fn versions_passing_threshold(&self, required_upgraded_hpmns: u64) -> Vec { let mut cache = self.global_cache.clone(); - cache.extend(self.block_cache.drain()); + cache.extend(self.block_cache.iter()); cache .into_iter() .filter_map(|(protocol_version, count)| { - if count >= required_upgraded_hpns { + if count >= required_upgraded_hpmns { Some(protocol_version) } else { None diff --git a/packages/rs-drive/src/drive/open/mod.rs b/packages/rs-drive/src/drive/open/mod.rs index 5f3d00f1d2..8dca4f3fc0 100644 --- a/packages/rs-drive/src/drive/open/mod.rs +++ b/packages/rs-drive/src/drive/open/mod.rs @@ -39,6 +39,8 @@ impl Drive { let protocol_version = Drive::fetch_current_protocol_version_with_grovedb(&grove, None)?; + // At this point we don't know the version what we need to process next block or initialize the chain + // so version related data should be updated on init chain or on block execution let platform_version = PlatformVersion::get(protocol_version.unwrap_or(INITIAL_PROTOCOL_VERSION)) .map_err(ProtocolError::PlatformVersionError)?; diff --git a/packages/rs-drive/src/drive/protocol_upgrade/change_to_new_version_and_clear_version_information/v0/mod.rs b/packages/rs-drive/src/drive/protocol_upgrade/change_to_new_version_and_clear_version_information/v0/mod.rs index fd37f923f7..b30a6e2db5 100644 --- a/packages/rs-drive/src/drive/protocol_upgrade/change_to_new_version_and_clear_version_information/v0/mod.rs +++ b/packages/rs-drive/src/drive/protocol_upgrade/change_to_new_version_and_clear_version_information/v0/mod.rs @@ -13,6 +13,7 @@ use dpp::ProtocolError; use grovedb::TransactionArg; impl Drive { + /// TODO: Should work with Epoch trees. Will be reworked in upcoming PR /// Clear all version information from the backing store, this is done on epoch change in /// execution logic pub(super) fn change_to_new_version_and_clear_version_information_v0( diff --git a/packages/rs-drive/src/drive/protocol_upgrade/remove_validators_proposed_app_versions/v0/mod.rs b/packages/rs-drive/src/drive/protocol_upgrade/remove_validators_proposed_app_versions/v0/mod.rs index 35fc19539e..1814f605d1 100644 --- a/packages/rs-drive/src/drive/protocol_upgrade/remove_validators_proposed_app_versions/v0/mod.rs +++ b/packages/rs-drive/src/drive/protocol_upgrade/remove_validators_proposed_app_versions/v0/mod.rs @@ -107,7 +107,7 @@ impl Drive { where I: IntoIterator, { - let version_counter = &mut self.cache.protocol_versions_counter.write(); + let mut version_counter = self.cache.protocol_versions_counter.write(); version_counter.load_if_needed(self, transaction, drive_version)?; @@ -146,12 +146,17 @@ impl Drive { } for (previous_version, change) in previous_versions_removals { - let previous_count = *version_counter.get(&previous_version).ok_or(Error::Drive( - DriveError::CorruptedCacheState( + let previous_count = version_counter + .get(&previous_version) + .map_err(|error| { + DriveError::CorruptedCacheState(format!( + "{error}. we should never face with blocked global cache when we get previous count because version counter trees must be empty at this point" + )) + })? + .ok_or(Error::Drive(DriveError::CorruptedCacheState( "trying to lower the count of a version from cache that is not found" .to_string(), - ), - ))?; + )))?; let removed_count = previous_count.checked_sub(change).ok_or(Error::Drive(DriveError::CorruptedDriveState( "trying to lower the count of a version from cache that would result in a negative value" .to_string(), diff --git a/packages/rs-drive/src/drive/protocol_upgrade/update_validator_proposed_app_version/v0/mod.rs b/packages/rs-drive/src/drive/protocol_upgrade/update_validator_proposed_app_version/v0/mod.rs index bd473f6f91..07b3cab2da 100644 --- a/packages/rs-drive/src/drive/protocol_upgrade/update_validator_proposed_app_version/v0/mod.rs +++ b/packages/rs-drive/src/drive/protocol_upgrade/update_validator_proposed_app_version/v0/mod.rs @@ -12,6 +12,7 @@ use crate::fee::op::LowLevelDriveOperation; use dpp::util::deserializer::ProtocolVersion; use dpp::version::drive_versions::DriveVersion; +use crate::error::cache::CacheError; use grovedb::{Element, TransactionArg}; use integer_encoding::VarInt; @@ -90,12 +91,21 @@ impl Drive { ))) .map(|(value, _)| value)?; //we should remove 1 from the previous version - let previous_count = version_counter.get(&previous_version).ok_or(Error::Drive( - DriveError::CorruptedCacheState( - "trying to lower the count of a version from cache that is not found" - .to_string(), - ), - ))?; + let previous_count = + version_counter + .get(&previous_version) + .map_err(|error| { + match error { + Error::Cache(CacheError::GlobalCacheIsBlocked) => Error::Drive(DriveError::CorruptedCacheState( + "global cache is blocked. we should never get into it when we get previous count because version counter trees must be empty at this point".to_string(), + )), + _ => error + } + })? + .ok_or(Error::Drive(DriveError::CorruptedCacheState( + "trying to lower the count of a version from cache that is not found" + .to_string(), + )))?; if previous_count == &0 { return Err(Error::Drive(DriveError::CorruptedCacheState( "trying to lower the count of a version from cache that is already at 0" @@ -115,7 +125,12 @@ impl Drive { )?; } - let mut version_count = version_counter.get(&version).cloned().unwrap_or_default(); + let mut version_count = match version_counter.get(&version) { + Ok(count) => count.copied().unwrap_or_default(), + // if global cache is blocked then it means we are starting from scratch + Err(Error::Cache(CacheError::GlobalCacheIsBlocked)) => 0, + Err(other_error) => return Err(other_error), + }; version_count += 1; diff --git a/packages/rs-drive/src/drive/system/protocol_version/set_next_protocol_version_operations/mod.rs b/packages/rs-drive/src/drive/system/protocol_version/set_next_protocol_version_operations/mod.rs index 06dd6e5b04..b2c8cd31a9 100644 --- a/packages/rs-drive/src/drive/system/protocol_version/set_next_protocol_version_operations/mod.rs +++ b/packages/rs-drive/src/drive/system/protocol_version/set_next_protocol_version_operations/mod.rs @@ -25,6 +25,7 @@ impl Drive { /// # Errors /// /// This function will return an error if the version of the Drive is unknown. + // TODO: We should store it for epoch. Will be changed in upcoming PR pub fn set_next_protocol_version_operations( &self, protocol_version: ProtocolVersion, diff --git a/packages/rs-drive/src/error/cache.rs b/packages/rs-drive/src/error/cache.rs new file mode 100644 index 0000000000..d4aed54d05 --- /dev/null +++ b/packages/rs-drive/src/error/cache.rs @@ -0,0 +1,7 @@ +/// Cache errors +#[derive(Debug, thiserror::Error)] +pub enum CacheError { + /// Overflow error + #[error("global cache is blocked for block execution")] + GlobalCacheIsBlocked, +} diff --git a/packages/rs-drive/src/error/mod.rs b/packages/rs-drive/src/error/mod.rs index 5dc1f759eb..456e759d0c 100644 --- a/packages/rs-drive/src/error/mod.rs +++ b/packages/rs-drive/src/error/mod.rs @@ -1,4 +1,5 @@ use self::drive::DriveError; +use crate::error::cache::CacheError; use crate::error::contract::DataContractError; use crate::error::proof::ProofError; use crate::error::storage_flags::StorageFlagsError; @@ -10,6 +11,8 @@ use fee::FeeError; use identity::IdentityError; use query::QuerySyntaxError; +/// Cache errors +pub mod cache; ///DataContract errors pub mod contract; /// Document module @@ -63,6 +66,9 @@ pub enum Error { ///DataContract error #[error("contract: {0}")] DataContract(#[from] DataContractError), + ///Cache error + #[error("contract: {0}")] + Cache(#[from] CacheError), } impl From for Error { diff --git a/packages/rs-platform-version/src/version/drive_abci_versions.rs b/packages/rs-platform-version/src/version/drive_abci_versions.rs index 40f337d836..b077c3e70b 100644 --- a/packages/rs-platform-version/src/version/drive_abci_versions.rs +++ b/packages/rs-platform-version/src/version/drive_abci_versions.rs @@ -276,6 +276,8 @@ pub struct DriveAbciIdentityCreditWithdrawalMethodVersions { #[derive(Clone, Debug, Default)] pub struct DriveAbciProtocolUpgradeMethodVersions { pub check_for_desired_protocol_upgrade: FeatureVersion, + pub upgrade_protocol_version_on_epoch_change: FeatureVersion, + pub protocol_version_upgrade_percentage_needed: u64, } #[derive(Clone, Debug, Default)] diff --git a/packages/rs-platform-version/src/version/mocks/mod.rs b/packages/rs-platform-version/src/version/mocks/mod.rs index dd77c1a8ef..aef47dea3d 100644 --- a/packages/rs-platform-version/src/version/mocks/mod.rs +++ b/packages/rs-platform-version/src/version/mocks/mod.rs @@ -1,4 +1,4 @@ pub mod v2_test; pub mod v3_test; -pub(crate) const TEST_BYTES: u32 = 28; +pub const TEST_PROTOCOL_VERSION_SHIFT_BYTES: u32 = 28; diff --git a/packages/rs-platform-version/src/version/mocks/v2_test.rs b/packages/rs-platform-version/src/version/mocks/v2_test.rs index 0842055649..4160215e6c 100644 --- a/packages/rs-platform-version/src/version/mocks/v2_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v2_test.rs @@ -67,13 +67,13 @@ use crate::version::drive_versions::{ DriveVerifyStateTransitionMethodVersions, DriveVerifySystemMethodVersions, DriveVersion, }; use crate::version::fee::v1::FEE_VERSION1; -use crate::version::mocks::TEST_BYTES; +use crate::version::mocks::TEST_PROTOCOL_VERSION_SHIFT_BYTES; use crate::version::protocol_version::{FeatureVersionBounds, PlatformVersion}; use crate::version::{AbciStructureVersion, PlatformArchitectureVersion}; -pub const TEST_PROTOCOL_VERSION_2: u32 = (1 << TEST_BYTES) + 2; +pub const TEST_PROTOCOL_VERSION_2: u32 = (1 << TEST_PROTOCOL_VERSION_SHIFT_BYTES) + 2; -pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { +pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { protocol_version: TEST_PROTOCOL_VERSION_2, identity: FeatureVersionBounds { min_version: 0, @@ -531,6 +531,8 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { }, protocol_upgrade: DriveAbciProtocolUpgradeMethodVersions { check_for_desired_protocol_upgrade: 0, + upgrade_protocol_version_on_epoch_change: 0, + protocol_version_upgrade_percentage_needed: 75, }, block_fee_processing: DriveAbciBlockFeeProcessingMethodVersions { add_process_epoch_change_operations: 0, diff --git a/packages/rs-platform-version/src/version/mocks/v3_test.rs b/packages/rs-platform-version/src/version/mocks/v3_test.rs index 11369689ff..2209766085 100644 --- a/packages/rs-platform-version/src/version/mocks/v3_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v3_test.rs @@ -67,13 +67,13 @@ use crate::version::drive_versions::{ DriveVerifyStateTransitionMethodVersions, DriveVerifySystemMethodVersions, DriveVersion, }; use crate::version::fee::v1::FEE_VERSION1; -use crate::version::mocks::TEST_BYTES; +use crate::version::mocks::TEST_PROTOCOL_VERSION_SHIFT_BYTES; use crate::version::protocol_version::{FeatureVersionBounds, PlatformVersion}; use crate::version::{AbciStructureVersion, PlatformArchitectureVersion}; -pub const TEST_PROTOCOL_VERSION_3: u32 = (1 << TEST_BYTES) + 3; +pub const TEST_PROTOCOL_VERSION_3: u32 = (1 << TEST_PROTOCOL_VERSION_SHIFT_BYTES) + 3; -pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { +pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { protocol_version: TEST_PROTOCOL_VERSION_3, identity: FeatureVersionBounds { min_version: 0, @@ -531,6 +531,8 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { }, protocol_upgrade: DriveAbciProtocolUpgradeMethodVersions { check_for_desired_protocol_upgrade: 0, + upgrade_protocol_version_on_epoch_change: 0, + protocol_version_upgrade_percentage_needed: 75, }, block_fee_processing: DriveAbciBlockFeeProcessingMethodVersions { add_process_epoch_change_operations: 0, diff --git a/packages/rs-platform-version/src/version/mod.rs b/packages/rs-platform-version/src/version/mod.rs index 05864c0c9e..b09b4a7277 100644 --- a/packages/rs-platform-version/src/version/mod.rs +++ b/packages/rs-platform-version/src/version/mod.rs @@ -1,5 +1,7 @@ mod protocol_version; +use crate::version::v1::PROTOCOL_VERSION_1; pub use protocol_version::*; + pub mod contracts; pub mod dpp_versions; pub mod drive_abci_versions; @@ -7,6 +9,6 @@ pub mod drive_versions; pub mod fee; #[cfg(feature = "mock-versions")] pub mod mocks; -mod v1; +pub mod v1; -pub const LATEST_VERSION: u32 = 1; +pub const LATEST_VERSION: u32 = PROTOCOL_VERSION_1; diff --git a/packages/rs-platform-version/src/version/protocol_version.rs b/packages/rs-platform-version/src/version/protocol_version.rs index 527964f17a..a7b3b1f097 100644 --- a/packages/rs-platform-version/src/version/protocol_version.rs +++ b/packages/rs-platform-version/src/version/protocol_version.rs @@ -9,8 +9,10 @@ use crate::version::mocks::v2_test::TEST_PLATFORM_V2; #[cfg(feature = "mock-versions")] use crate::version::mocks::v3_test::TEST_PLATFORM_V3; #[cfg(feature = "mock-versions")] -use crate::version::mocks::TEST_BYTES; +use crate::version::mocks::TEST_PROTOCOL_VERSION_SHIFT_BYTES; use crate::version::v1::PLATFORM_V1; +#[cfg(feature = "mock-versions")] +use std::sync::OnceLock; pub type FeatureVersion = u16; pub type OptionalFeatureVersion = Option; //This is a feature that didn't always exist @@ -57,7 +59,10 @@ pub struct PlatformVersion { pub const PLATFORM_VERSIONS: &[PlatformVersion] = &[PLATFORM_V1]; #[cfg(feature = "mock-versions")] -pub const PLATFORM_TEST_VERSIONS: &[PlatformVersion] = &[TEST_PLATFORM_V2, TEST_PLATFORM_V3]; //this starts at 2 +// We use OnceLock to be able to modify the version mocks +pub static PLATFORM_TEST_VERSIONS: OnceLock> = OnceLock::new(); +#[cfg(feature = "mock-versions")] +const DEFAULT_PLATFORM_TEST_VERSIONS: &[PlatformVersion] = &[TEST_PLATFORM_V2, TEST_PLATFORM_V3]; pub const LATEST_PLATFORM_VERSION: &PlatformVersion = &PLATFORM_V1; @@ -66,9 +71,14 @@ impl PlatformVersion { if version > 0 { #[cfg(feature = "mock-versions")] { - if version >> TEST_BYTES > 0 { - let test_version = version - (1 << TEST_BYTES); - return PLATFORM_TEST_VERSIONS.get(test_version as usize - 2).ok_or( + if version >> TEST_PROTOCOL_VERSION_SHIFT_BYTES > 0 { + let test_version = version - (1 << TEST_PROTOCOL_VERSION_SHIFT_BYTES); + + // Init default set of test versions + let versions = PLATFORM_TEST_VERSIONS + .get_or_init(|| vec![TEST_PLATFORM_V2, TEST_PLATFORM_V3]); + + return versions.get(test_version as usize - 2).ok_or( PlatformVersionError::UnknownVersionError(format!( "no test platform version {test_version}" )), @@ -92,9 +102,14 @@ impl PlatformVersion { if version > 0 { #[cfg(feature = "mock-versions")] { - if version >> TEST_BYTES > 0 { - let test_version = version - (1 << TEST_BYTES); - return PLATFORM_TEST_VERSIONS.get(test_version as usize - 2).ok_or( + if version >> TEST_PROTOCOL_VERSION_SHIFT_BYTES > 0 { + let test_version = version - (1 << TEST_PROTOCOL_VERSION_SHIFT_BYTES); + + // Init default set of test versions + let versions = PLATFORM_TEST_VERSIONS + .get_or_init(|| Vec::from(DEFAULT_PLATFORM_TEST_VERSIONS)); + + return versions.get(test_version as usize - 2).ok_or( PlatformVersionError::UnknownVersionError(format!( "no test platform version {test_version}" )), @@ -127,4 +142,12 @@ impl PlatformVersion { .last() .expect("expected to have a platform version") } + + #[cfg(feature = "mock-versions")] + /// Set mock versions for testing + pub fn replace_test_versions(versions: Vec) { + PLATFORM_TEST_VERSIONS + .set(versions) + .expect("failed to set test versions") + } } diff --git a/packages/rs-platform-version/src/version/v1.rs b/packages/rs-platform-version/src/version/v1.rs index 6bde941c06..2cc0a44f0c 100644 --- a/packages/rs-platform-version/src/version/v1.rs +++ b/packages/rs-platform-version/src/version/v1.rs @@ -70,7 +70,9 @@ use crate::version::fee::v1::FEE_VERSION1; use crate::version::protocol_version::{FeatureVersionBounds, PlatformVersion}; use crate::version::{AbciStructureVersion, PlatformArchitectureVersion}; -pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { +pub const PROTOCOL_VERSION_1: u32 = 1; + +pub const PLATFORM_V1: PlatformVersion = PlatformVersion { protocol_version: 1, identity: FeatureVersionBounds { min_version: 0, @@ -528,6 +530,8 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { }, protocol_upgrade: DriveAbciProtocolUpgradeMethodVersions { check_for_desired_protocol_upgrade: 0, + upgrade_protocol_version_on_epoch_change: 0, + protocol_version_upgrade_percentage_needed: 75, }, block_fee_processing: DriveAbciBlockFeeProcessingMethodVersions { add_process_epoch_change_operations: 0, From 3578f87364a39b6286d28999aa8c96df0f3a2d03 Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Thu, 4 Apr 2024 19:29:53 +0700 Subject: [PATCH 120/191] fix(drive): no longer build full grovedb when using verify feature (#1804) --- Cargo.lock | 12 ++++++------ packages/rs-drive/Cargo.toml | 9 +++++---- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b25bc5ba4f..0a5187cd69 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1824,7 +1824,7 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "grovedb" version = "1.0.0-rc.2" -source = "git+https://github.com/dashpay/grovedb?rev=d007bed7544bf837bdf155e696a530b90d5f82e5#d007bed7544bf837bdf155e696a530b90d5f82e5" +source = "git+https://github.com/dashpay/grovedb?rev=9eae5457f18d307d673767c8d772630a9d0ad66d#9eae5457f18d307d673767c8d772630a9d0ad66d" dependencies = [ "bincode 1.3.3", "grovedb-costs", @@ -1846,7 +1846,7 @@ dependencies = [ [[package]] name = "grovedb-costs" version = "1.0.0-rc.2" -source = "git+https://github.com/dashpay/grovedb?rev=d007bed7544bf837bdf155e696a530b90d5f82e5#d007bed7544bf837bdf155e696a530b90d5f82e5" +source = "git+https://github.com/dashpay/grovedb?rev=9eae5457f18d307d673767c8d772630a9d0ad66d#9eae5457f18d307d673767c8d772630a9d0ad66d" dependencies = [ "integer-encoding 3.0.4", "intmap", @@ -1856,7 +1856,7 @@ dependencies = [ [[package]] name = "grovedb-merk" version = "1.0.0-rc.2" -source = "git+https://github.com/dashpay/grovedb?rev=d007bed7544bf837bdf155e696a530b90d5f82e5#d007bed7544bf837bdf155e696a530b90d5f82e5" +source = "git+https://github.com/dashpay/grovedb?rev=9eae5457f18d307d673767c8d772630a9d0ad66d#9eae5457f18d307d673767c8d772630a9d0ad66d" dependencies = [ "blake3", "byteorder", @@ -1879,12 +1879,12 @@ dependencies = [ [[package]] name = "grovedb-path" version = "1.0.0-rc.2" -source = "git+https://github.com/dashpay/grovedb?rev=d007bed7544bf837bdf155e696a530b90d5f82e5#d007bed7544bf837bdf155e696a530b90d5f82e5" +source = "git+https://github.com/dashpay/grovedb?rev=9eae5457f18d307d673767c8d772630a9d0ad66d#9eae5457f18d307d673767c8d772630a9d0ad66d" [[package]] name = "grovedb-storage" version = "1.0.0-rc.2" -source = "git+https://github.com/dashpay/grovedb?rev=d007bed7544bf837bdf155e696a530b90d5f82e5#d007bed7544bf837bdf155e696a530b90d5f82e5" +source = "git+https://github.com/dashpay/grovedb?rev=9eae5457f18d307d673767c8d772630a9d0ad66d#9eae5457f18d307d673767c8d772630a9d0ad66d" dependencies = [ "blake3", "grovedb-costs", @@ -1903,7 +1903,7 @@ dependencies = [ [[package]] name = "grovedb-visualize" version = "1.0.0-rc.2" -source = "git+https://github.com/dashpay/grovedb?rev=d007bed7544bf837bdf155e696a530b90d5f82e5#d007bed7544bf837bdf155e696a530b90d5f82e5" +source = "git+https://github.com/dashpay/grovedb?rev=9eae5457f18d307d673767c8d772630a9d0ad66d#9eae5457f18d307d673767c8d772630a9d0ad66d" dependencies = [ "hex", "itertools 0.10.5", diff --git a/packages/rs-drive/Cargo.toml b/packages/rs-drive/Cargo.toml index 242a33581b..8f10f1bfa6 100644 --- a/packages/rs-drive/Cargo.toml +++ b/packages/rs-drive/Cargo.toml @@ -40,10 +40,10 @@ enum-map = { version = "2.0.3", optional = true } intmap = { version = "2.0.0", features = ["serde"], optional = true } chrono = { version = "0.4.35", optional = true } itertools = { version = "0.11.0", optional = true } -grovedb = { git = "https://github.com/dashpay/grovedb", rev = "d007bed7544bf837bdf155e696a530b90d5f82e5", optional = true } -grovedb-costs = { git = "https://github.com/dashpay/grovedb", rev = "d007bed7544bf837bdf155e696a530b90d5f82e5", optional = true } -grovedb-path = { git = "https://github.com/dashpay/grovedb", rev = "d007bed7544bf837bdf155e696a530b90d5f82e5" } -grovedb-storage = { git = "https://github.com/dashpay/grovedb", rev = "d007bed7544bf837bdf155e696a530b90d5f82e5", optional = true } +grovedb = { git = "https://github.com/dashpay/grovedb", rev = "9eae5457f18d307d673767c8d772630a9d0ad66d", optional = true, default-features = false } +grovedb-costs = { git = "https://github.com/dashpay/grovedb", rev = "9eae5457f18d307d673767c8d772630a9d0ad66d", optional = true } +grovedb-path = { git = "https://github.com/dashpay/grovedb", rev = "9eae5457f18d307d673767c8d772630a9d0ad66d" } +grovedb-storage = { git = "https://github.com/dashpay/grovedb", rev = "9eae5457f18d307d673767c8d772630a9d0ad66d", optional = true } [dev-dependencies] anyhow = { version = "1.0.75" } @@ -71,6 +71,7 @@ harness = false default = ["full", "verify", "fixtures-and-mocks"] fixtures-and-mocks = ["full", "dpp/fixtures-and-mocks", "verify"] full = [ + "grovedb/full", "grovedb/estimated_costs", "grovedb-storage", "grovedb-costs", From 7cb35e8b5779c9943127cd4790ede80e8655feb6 Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Thu, 4 Apr 2024 20:18:41 +0700 Subject: [PATCH 121/191] feat(platform)!: improved state processing fees (#1805) --- .../src/data_contract/conversion/serde/mod.rs | 9 +- .../created_data_contract/mod.rs | 1 + .../mod.rs | 4 + .../v0/mod.rs | 3 + .../class_methods/try_from_schema/mod.rs | 3 + .../class_methods/try_from_schema/v0/mod.rs | 58 +++++-- .../schema/validate_max_depth/mod.rs | 12 +- .../schema/validate_max_depth/v0/mod.rs | 163 +++++++++++------- .../src/data_contract/factory/v0/mod.rs | 3 +- .../src/data_contract/methods/schema/mod.rs | 28 ++- .../data_contract/methods/schema/v0/mod.rs | 4 + packages/rs-dpp/src/data_contract/mod.rs | 3 + .../data_contract/serialized_version/mod.rs | 3 + .../src/data_contract/v0/conversion/value.rs | 1 + .../src/data_contract/v0/methods/schema.rs | 20 ++- .../src/data_contract/v0/serialization/mod.rs | 14 +- .../data_contract_max_depth_exceed_error.rs | 12 +- .../data_contract_create_transition/mod.rs | 1 + packages/rs-dpp/src/util/json_schema.rs | 1 + packages/rs-dpp/src/validation/mod.rs | 1 + packages/rs-dpp/src/validation/operations.rs | 60 +++++++ .../src/execution/check_tx/v0/mod.rs | 14 +- .../types/execution_operation/mod.rs | 10 ++ .../state_transition_execution_context/mod.rs | 13 +- .../state_transition/processor/v0/mod.rs | 70 ++++++-- .../data_contract_create/mod.rs | 21 ++- .../data_contract_create/state/v0/mod.rs | 68 ++++++-- .../data_contract_update/mod.rs | 27 ++- .../data_contract_update/state/mod.rs | 13 +- .../data_contract_update/state/v0/mod.rs | 48 ++++-- .../document_create_transition_action/mod.rs | 15 +- .../state_v0/mod.rs | 6 + .../document_delete_transition_action/mod.rs | 15 +- .../state_v0/mod.rs | 6 + .../document_replace_transition_action/mod.rs | 15 +- .../state_v0/mod.rs | 6 + .../state_transitions/documents_batch/mod.rs | 6 +- .../documents_batch/state/v0/mod.rs | 32 +++- .../identity_credit_transfer/mod.rs | 2 + .../identity_credit_withdrawal/mod.rs | 2 + .../state_transitions/identity_update/mod.rs | 2 + .../data_contract_history/v0/mod.rs | 1 + .../tests/strategy_tests/main.rs | 30 +--- .../fetch_contract_with_history/mod.rs | 1 + packages/rs-drive/src/drive/contract/mod.rs | 2 +- packages/rs-drive/src/query/test_index.rs | 1 + .../data_contract_create/transformer.rs | 5 + .../data_contract_create/v0/transformer.rs | 5 + .../data_contract_update/transformer.rs | 5 + .../data_contract_update/v0/transformer.rs | 5 + .../src/version/dpp_versions.rs | 1 + .../src/version/fee/data_contract/mod.rs | 12 ++ .../src/version/fee/data_contract/v1.rs | 12 ++ .../src/version/fee/mod.rs | 3 + .../rs-platform-version/src/version/fee/v1.rs | 2 + .../src/version/mocks/v2_test.rs | 1 + .../src/version/mocks/v3_test.rs | 1 + .../rs-platform-version/src/version/v1.rs | 1 + packages/rs-sdk/tests/fetch/common.rs | 1 + packages/strategy-tests/src/operations.rs | 10 +- .../src/data_contract/data_contract.rs | 18 +- .../data_contract_max_depth_exceed_error.rs | 5 - 62 files changed, 698 insertions(+), 219 deletions(-) create mode 100644 packages/rs-dpp/src/validation/operations.rs create mode 100644 packages/rs-platform-version/src/version/fee/data_contract/mod.rs create mode 100644 packages/rs-platform-version/src/version/fee/data_contract/v1.rs diff --git a/packages/rs-dpp/src/data_contract/conversion/serde/mod.rs b/packages/rs-dpp/src/data_contract/conversion/serde/mod.rs index 7cc5c22c77..43e558b17a 100644 --- a/packages/rs-dpp/src/data_contract/conversion/serde/mod.rs +++ b/packages/rs-dpp/src/data_contract/conversion/serde/mod.rs @@ -29,7 +29,12 @@ impl<'de> Deserialize<'de> for DataContract { let current_version = PlatformVersion::get_current().map_err(|e| serde::de::Error::custom(e.to_string()))?; // when deserializing from json/platform_value/cbor we always want to validate (as this is not coming from the state) - DataContract::try_from_platform_versioned(serialization_format, true, current_version) - .map_err(serde::de::Error::custom) + DataContract::try_from_platform_versioned( + serialization_format, + true, + &mut vec![], + current_version, + ) + .map_err(serde::de::Error::custom) } } diff --git a/packages/rs-dpp/src/data_contract/created_data_contract/mod.rs b/packages/rs-dpp/src/data_contract/created_data_contract/mod.rs index 043f133a72..666725651c 100644 --- a/packages/rs-dpp/src/data_contract/created_data_contract/mod.rs +++ b/packages/rs-dpp/src/data_contract/created_data_contract/mod.rs @@ -104,6 +104,7 @@ impl PlatformDeserializableWithPotentialValidationFromVersionedStructure for Cre let data_contract = DataContract::try_from_platform_versioned( data_contract_in_serialization_format, validate, + &mut vec![], platform_version, )?; match platform_version diff --git a/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/mod.rs b/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/mod.rs index c12066f6c5..a2d6e2fe63 100644 --- a/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/mod.rs @@ -3,6 +3,7 @@ mod v0; use crate::data_contract::document_type::v0::DocumentTypeV0; use crate::data_contract::document_type::DocumentType; use crate::data_contract::DocumentName; +use crate::validation::operations::ProtocolValidationOperation; use crate::version::PlatformVersion; use crate::ProtocolError; use platform_value::{Identifier, Value}; @@ -39,6 +40,7 @@ impl DocumentType { documents_keep_history_contract_default: bool, documents_mutable_contract_default: bool, validate: bool, + validation_operations: &mut Vec, platform_version: &PlatformVersion, ) -> Result, ProtocolError> { match platform_version @@ -55,6 +57,7 @@ impl DocumentType { documents_keep_history_contract_default, documents_mutable_contract_default, validate, + validation_operations, platform_version, ), version => Err(ProtocolError::UnknownVersionMismatch { @@ -82,6 +85,7 @@ mod test { false, false, false, + &mut vec![], crate::version::PlatformVersion::latest(), ); diff --git a/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/v0/mod.rs index ea55c12581..12177daec6 100644 --- a/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/v0/mod.rs @@ -2,6 +2,7 @@ use crate::consensus::basic::data_contract::DataContractEmptySchemaError; use crate::data_contract::document_type::v0::DocumentTypeV0; use crate::data_contract::document_type::DocumentType; use crate::data_contract::DocumentName; +use crate::validation::operations::ProtocolValidationOperation; use crate::version::PlatformVersion; use crate::ProtocolError; use platform_value::{Identifier, Value}; @@ -15,6 +16,7 @@ impl DocumentTypeV0 { documents_keep_history_contract_default: bool, documents_mutable_contract_default: bool, validate: bool, + validation_operations: &mut Vec, platform_version: &PlatformVersion, ) -> Result, ProtocolError> { let mut contract_document_types: BTreeMap = BTreeMap::new(); @@ -40,6 +42,7 @@ impl DocumentTypeV0 { documents_keep_history_contract_default, documents_mutable_contract_default, validate, + validation_operations, platform_version, )?, version => { diff --git a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/mod.rs b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/mod.rs index c893544256..023291dc5b 100644 --- a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/mod.rs @@ -1,5 +1,6 @@ use crate::data_contract::document_type::v0::DocumentTypeV0; use crate::data_contract::document_type::DocumentType; +use crate::validation::operations::ProtocolValidationOperation; use crate::ProtocolError; use platform_value::{Identifier, Value}; use platform_version::version::PlatformVersion; @@ -16,6 +17,7 @@ impl DocumentType { default_keeps_history: bool, default_mutability: bool, validate: bool, + validation_operations: &mut Vec, platform_version: &PlatformVersion, ) -> Result { match platform_version @@ -33,6 +35,7 @@ impl DocumentType { default_keeps_history, default_mutability, validate, + validation_operations, platform_version, ) .map(|document_type| document_type.into()), diff --git a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs index f862e25343..cb5c38ee89 100644 --- a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs @@ -39,6 +39,7 @@ use crate::identity::SecurityLevel; use crate::util::json_schema::resolve_uri; #[cfg(feature = "validation")] use crate::validation::meta_validators::DOCUMENT_META_SCHEMA_V0; +use crate::validation::operations::ProtocolValidationOperation; use crate::version::PlatformVersion; use crate::ProtocolError; use platform_value::btreemap_extensions::BTreeValueMapHelper; @@ -93,6 +94,7 @@ impl DocumentTypeV0 { default_keeps_history: bool, default_mutability: bool, validate: bool, // we don't need to validate if loaded from state + validation_operations: &mut Vec, platform_version: &PlatformVersion, ) -> Result { // Create a full root JSON Schema from shorten contract document type schema @@ -128,6 +130,27 @@ impl DocumentTypeV0 { ))); } + // Validate document schema depth + let mut result = validate_max_depth(&root_schema, platform_version)?; + + if !result.is_valid() { + let error = result.errors.remove(0); + + let schema_size = result.into_data()?.size; + + validation_operations.push( + ProtocolValidationOperation::DocumentTypeSchemaValidationForSize(schema_size), + ); + + return Err(ProtocolError::ConsensusError(Box::new(error))); + } + + let schema_size = result.into_data()?.size; + + validation_operations.push( + ProtocolValidationOperation::DocumentTypeSchemaValidationForSize(schema_size), + ); + // Make sure JSON Schema is compilable let root_json_schema = root_schema.try_to_validating_json().map_err(|e| { ProtocolError::ConsensusError( @@ -146,29 +169,20 @@ impl DocumentTypeV0 { })?) .map_err(|mut errs| ConsensusError::from(errs.next().unwrap()))?; - // Validate document schema depth - let mut result = validate_max_depth(&root_schema, platform_version)?; - - if !result.is_valid() { - let error = result.errors.remove(0); - - return Err(ProtocolError::ConsensusError(Box::new(error))); - } - // TODO: Are we still aiming to use RE2 with linear time complexity to protect from ReDoS attacks? // If not we can remove this validation // Validate reg exp compatibility with RE2 and byteArray usage - result.merge(traversal_validator( + let mut traversal_validator_result = traversal_validator( &root_schema, &[ pattern_is_valid_regex_validator, byte_array_has_no_items_as_parent_validator, ], platform_version, - )?); + )?; - if !result.is_valid() { - let error = result.errors.remove(0); + if !traversal_validator_result.is_valid() { + let error = traversal_validator_result.errors.remove(0); return Err(ProtocolError::ConsensusError(Box::new(error))); } @@ -205,6 +219,12 @@ impl DocumentTypeV0 { #[cfg(feature = "validation")] if validate { + validation_operations.push( + ProtocolValidationOperation::DocumentTypeSchemaPropertyValidation( + property_values.values().len() as u64, + ), + ); + // We should validate that the positions are continuous for (pos, value) in property_values.values().enumerate() { if value.get_integer::(property_names::POSITION)? != pos as u32 { @@ -281,6 +301,13 @@ impl DocumentTypeV0 { #[cfg(feature = "validation")] if validate { + validation_operations.push( + ProtocolValidationOperation::DocumentTypeSchemaIndexValidation( + index.properties.len() as u64, + index.unique, + ), + ); + // Unique indices produces significant load on the system during state validation // so we need to limit their number to prevent of spikes and DoS attacks if index.unique { @@ -761,6 +788,7 @@ mod tests { false, false, true, + &mut vec![], platform_version, ) .expect("should be valid"); @@ -789,6 +817,7 @@ mod tests { false, false, true, + &mut vec![], platform_version, ); @@ -826,6 +855,7 @@ mod tests { false, false, true, + &mut vec![], platform_version, ); @@ -863,6 +893,7 @@ mod tests { false, false, true, + &mut vec![], platform_version, ); @@ -884,6 +915,7 @@ mod tests { false, false, true, + &mut vec![], platform_version, ); diff --git a/packages/rs-dpp/src/data_contract/document_type/schema/validate_max_depth/mod.rs b/packages/rs-dpp/src/data_contract/document_type/schema/validate_max_depth/mod.rs index b407987498..df6ef724d8 100644 --- a/packages/rs-dpp/src/data_contract/document_type/schema/validate_max_depth/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/schema/validate_max_depth/mod.rs @@ -1,14 +1,20 @@ -use crate::validation::SimpleConsensusValidationResult; +use crate::validation::ConsensusValidationResult; use crate::ProtocolError; use platform_value::Value; use platform_version::version::PlatformVersion; mod v0; +#[derive(Debug, Copy, Clone, PartialEq)] +pub struct MaxDepthValidationResult { + pub depth: u16, + pub size: u64, +} + pub fn validate_max_depth( value: &Value, platform_version: &PlatformVersion, -) -> Result { +) -> Result, ProtocolError> { match platform_version .dpp .contract_versions @@ -16,7 +22,7 @@ pub fn validate_max_depth( .schema .validate_max_depth { - 0 => Ok(v0::validate_max_depth_v0(value)), + 0 => Ok(v0::validate_max_depth_v0(value, platform_version)), version => Err(ProtocolError::UnknownVersionMismatch { method: "validate_max_depth".to_string(), known_versions: vec![0], diff --git a/packages/rs-dpp/src/data_contract/document_type/schema/validate_max_depth/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/schema/validate_max_depth/v0/mod.rs index 014cf6a896..990f5cf15c 100644 --- a/packages/rs-dpp/src/data_contract/document_type/schema/validate_max_depth/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/schema/validate_max_depth/v0/mod.rs @@ -1,66 +1,86 @@ use platform_value::Value; +use platform_version::version::PlatformVersion; use std::collections::BTreeSet; use crate::consensus::basic::data_contract::data_contract_max_depth_exceed_error::DataContractMaxDepthExceedError; use crate::consensus::basic::data_contract::InvalidJsonSchemaRefError; use crate::consensus::basic::BasicError; +use crate::data_contract::document_type::schema::MaxDepthValidationResult; use crate::util::json_schema::resolve_uri; -use crate::validation::SimpleConsensusValidationResult; - -const MAX_DEPTH: usize = 500; +use crate::validation::ConsensusValidationResult; #[inline(always)] -pub(super) fn validate_max_depth_v0(value: &Value) -> SimpleConsensusValidationResult { - let mut result = SimpleConsensusValidationResult::default(); - let schema_depth = match calculate_max_depth(value) { - Ok(depth) => depth, - Err(err) => { - result.add_error(err); - return result; - } - }; - - if schema_depth > MAX_DEPTH { - result.add_error(BasicError::DataContractMaxDepthExceedError( - DataContractMaxDepthExceedError::new(schema_depth, MAX_DEPTH), - )); - } - result -} - -fn calculate_max_depth(platform_value: &Value) -> Result { +pub(super) fn validate_max_depth_v0( + platform_value: &Value, + platform_version: &PlatformVersion, +) -> ConsensusValidationResult { + let max_allowed_depth = platform_version + .dpp + .contract_versions + .document_type_versions + .schema + .max_depth as usize; let mut values_depth_queue: Vec<(&Value, usize)> = vec![(platform_value, 0)]; - let mut max_depth: usize = 0; + let mut max_reached_depth: usize = 0; let mut visited: BTreeSet<*const Value> = BTreeSet::new(); let ref_value = Value::Text("$ref".to_string()); + let mut size: u64 = 1; // we start at 1, because we are a value + while let Some((value, depth)) = values_depth_queue.pop() { match value { Value::Map(map) => { let new_depth = depth + 1; - if max_depth < new_depth { - max_depth = new_depth + if new_depth > max_allowed_depth { + return ConsensusValidationResult::new_with_error( + BasicError::DataContractMaxDepthExceedError( + DataContractMaxDepthExceedError::new(max_allowed_depth), + ) + .into(), + ); + } + if max_reached_depth < new_depth { + max_reached_depth = new_depth } for (property_name, v) in map { + size += 1; // handling the internal references if property_name == &ref_value { if let Some(uri) = v.as_str() { - let resolved = resolve_uri(platform_value, uri).map_err(|e| { + let resolved = match resolve_uri(platform_value, uri).map_err(|e| { BasicError::InvalidJsonSchemaRefError( InvalidJsonSchemaRefError::new(format!( "invalid ref for max depth '{}': {}", uri, e )), ) - })?; + }) { + Ok(resolved) => resolved, + Err(e) => { + return ConsensusValidationResult::new_with_data_and_errors( + MaxDepthValidationResult { + depth: max_reached_depth as u16, // Not possible this is bigger than u16 max + size, + }, + vec![e.into()], + ); + } + }; if visited.contains(&(resolved as *const Value)) { - return Err(BasicError::InvalidJsonSchemaRefError( - InvalidJsonSchemaRefError::new(format!( - "the ref '{}' contains cycles", - uri - )), - )); + return ConsensusValidationResult::new_with_data_and_errors( + MaxDepthValidationResult { + depth: max_reached_depth as u16, // Not possible this is bigger than u16 max + size, + }, + vec![BasicError::InvalidJsonSchemaRefError( + InvalidJsonSchemaRefError::new(format!( + "the ref '{}' contains cycles", + uri + )), + ) + .into()], + ); } visited.insert(resolved as *const Value); @@ -76,10 +96,11 @@ fn calculate_max_depth(platform_value: &Value) -> Result { } Value::Array(array) => { let new_depth = depth + 1; - if max_depth < new_depth { - max_depth = new_depth + if max_reached_depth < new_depth { + max_reached_depth = new_depth } for v in array { + size += 1; if v.is_map() || v.is_array() { values_depth_queue.push((v, new_depth)) } @@ -89,7 +110,10 @@ fn calculate_max_depth(platform_value: &Value) -> Result { } } - Ok(max_depth) + ConsensusValidationResult::new_with_data(MaxDepthValidationResult { + depth: max_reached_depth as u16, // Not possible this is bigger than u16 max + size, + }) } #[cfg(test)] @@ -126,12 +150,13 @@ mod test { } ) .into(); - let result = calculate_max_depth(&schema); - let err = get_ref_error(result); + let result = validate_max_depth_v0(&schema, PlatformVersion::first()); + + let err = result.errors.first().expect("expected an error"); assert_eq!( - err.message(), - "the ref '#/$defs/object' contains cycles".to_string() + err.to_string(), + "Invalid JSON Schema $ref: the ref '#/$defs/object' contains cycles".to_string() ); } @@ -162,8 +187,10 @@ mod test { } ) .into(); - let result = calculate_max_depth(&schema); - assert!(matches!(result, Ok(5))); + let result = validate_max_depth_v0(&schema, PlatformVersion::first()) + .data + .expect("expected data"); + assert_eq!(result, MaxDepthValidationResult { depth: 5, size: 19 }); } #[test] @@ -186,12 +213,12 @@ mod test { } ) .into(); - let result = calculate_max_depth(&schema); + let result = validate_max_depth_v0(&schema, PlatformVersion::first()); - let err = get_ref_error(result); + let err = result.errors.first().expect("expected an error"); assert_eq!( - err.message(), - "invalid ref for max depth '#/$defs/object': value decoding error: StructureError(\"unable to get property $defs in $defs.object\")" + err.to_string(), + "Invalid JSON Schema $ref: invalid ref for max depth '#/$defs/object': value decoding error: StructureError(\"unable to get property $defs in $defs.object\")" .to_string() ); } @@ -216,12 +243,12 @@ mod test { } ) .into(); - let result = calculate_max_depth(&schema); + let result = validate_max_depth_v0(&schema, PlatformVersion::first()); - let err = get_ref_error(result); + let err = result.errors.first().expect("expected an error"); assert_eq!( - err.message(), - "invalid ref for max depth 'https://json-schema.org/some': invalid uri error: only local uri references are allowed" + err.to_string(), + "Invalid JSON Schema $ref: invalid ref for max depth 'https://json-schema.org/some': invalid uri error: only local uri references are allowed" .to_string() ); } @@ -246,12 +273,12 @@ mod test { } ) .into(); - let result = calculate_max_depth(&schema); + let result = validate_max_depth_v0(&schema, PlatformVersion::first()); - let err = get_ref_error(result); + let err = result.errors.first().expect("expected an error"); assert_eq!( - err.message(), - "invalid ref for max depth '': invalid uri error: only local uri references are allowed" + err.to_string(), + "Invalid JSON Schema $ref: invalid ref for max depth '': invalid uri error: only local uri references are allowed" .to_string() ); } @@ -273,13 +300,21 @@ mod test { } ) .into(); - assert!(matches!(calculate_max_depth(&schema), Ok(3))); + let found_depth = validate_max_depth_v0(&schema, PlatformVersion::first()) + .data + .expect("expected data") + .depth; + assert_eq!(found_depth, 3); } #[test] fn should_calculate_valid_depth_for_empty_json() { let schema: Value = json!({}).into(); - assert!(matches!(calculate_max_depth(&schema), Ok(1))); + let found_depth = validate_max_depth_v0(&schema, PlatformVersion::first()) + .data + .expect("expected data") + .depth; + assert_eq!(found_depth, 1); } #[test] @@ -297,16 +332,12 @@ mod test { }) .into(); - assert!(matches!(calculate_max_depth(&schema), Ok(4))); - } - pub fn get_ref_error(result: Result) -> InvalidJsonSchemaRefError { - match result { - Ok(_) => panic!("expected to have validation error"), - Err(e) => match e { - BasicError::InvalidJsonSchemaRefError(err) => err, - _ => panic!("expected error to be a InvalidJsonSchemaRefError"), - }, - } + let found_depth = validate_max_depth_v0(&schema, PlatformVersion::first()) + .data + .expect("expected data") + .depth; + + assert_eq!(found_depth, 4); } } diff --git a/packages/rs-dpp/src/data_contract/factory/v0/mod.rs b/packages/rs-dpp/src/data_contract/factory/v0/mod.rs index 70acb1d979..094965e36d 100644 --- a/packages/rs-dpp/src/data_contract/factory/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/factory/v0/mod.rs @@ -88,7 +88,7 @@ impl DataContractFactoryV0 { }); let data_contract = - DataContract::try_from_platform_versioned(format, true, platform_version)?; + DataContract::try_from_platform_versioned(format, true, &mut vec![], platform_version)?; CreatedDataContract::from_contract_and_identity_nonce( data_contract, @@ -344,6 +344,7 @@ mod tests { let contract_value = DataContract::try_from_platform_versioned( result.data_contract().to_owned(), false, + &mut vec![], platform_version, ) .unwrap() diff --git a/packages/rs-dpp/src/data_contract/methods/schema/mod.rs b/packages/rs-dpp/src/data_contract/methods/schema/mod.rs index c8ee5c7afa..29e8644be2 100644 --- a/packages/rs-dpp/src/data_contract/methods/schema/mod.rs +++ b/packages/rs-dpp/src/data_contract/methods/schema/mod.rs @@ -3,6 +3,7 @@ pub use v0::*; use crate::data_contract::{DefinitionName, DocumentName}; use crate::prelude::DataContract; +use crate::validation::operations::ProtocolValidationOperation; use crate::ProtocolError; use platform_value::Value; use platform_version::version::PlatformVersion; @@ -14,12 +15,17 @@ impl DataContractSchemaMethodsV0 for DataContract { schemas: BTreeMap, defs: Option>, validate: bool, + validation_operations: &mut Vec, platform_version: &PlatformVersion, ) -> Result<(), ProtocolError> { match self { - DataContract::V0(v0) => { - v0.set_document_schemas(schemas, defs, validate, platform_version) - } + DataContract::V0(v0) => v0.set_document_schemas( + schemas, + defs, + validate, + validation_operations, + platform_version, + ), } } @@ -28,12 +34,17 @@ impl DataContractSchemaMethodsV0 for DataContract { name: &str, schema: Value, validate: bool, + validation_operations: &mut Vec, platform_version: &PlatformVersion, ) -> Result<(), ProtocolError> { match self { - DataContract::V0(v0) => { - v0.set_document_schema(name, schema, validate, platform_version) - } + DataContract::V0(v0) => v0.set_document_schema( + name, + schema, + validate, + validation_operations, + platform_version, + ), } } @@ -53,10 +64,13 @@ impl DataContractSchemaMethodsV0 for DataContract { &mut self, defs: Option>, validate: bool, + validation_operations: &mut Vec, platform_version: &PlatformVersion, ) -> Result<(), ProtocolError> { match self { - DataContract::V0(v0) => v0.set_schema_defs(defs, validate, platform_version), + DataContract::V0(v0) => { + v0.set_schema_defs(defs, validate, validation_operations, platform_version) + } } } } diff --git a/packages/rs-dpp/src/data_contract/methods/schema/v0/mod.rs b/packages/rs-dpp/src/data_contract/methods/schema/v0/mod.rs index a509d90d7e..1440d4d1db 100644 --- a/packages/rs-dpp/src/data_contract/methods/schema/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/methods/schema/v0/mod.rs @@ -1,4 +1,5 @@ use crate::data_contract::{DefinitionName, DocumentName}; +use crate::validation::operations::ProtocolValidationOperation; use crate::ProtocolError; use platform_value::Value; use platform_version::version::PlatformVersion; @@ -10,6 +11,7 @@ pub trait DataContractSchemaMethodsV0 { schemas: BTreeMap, defs: Option>, validate: bool, + validation_operations: &mut Vec, platform_version: &PlatformVersion, ) -> Result<(), ProtocolError>; @@ -18,6 +20,7 @@ pub trait DataContractSchemaMethodsV0 { name: &str, schema: Value, validate: bool, + validation_operations: &mut Vec, platform_version: &PlatformVersion, ) -> Result<(), ProtocolError>; @@ -27,6 +30,7 @@ pub trait DataContractSchemaMethodsV0 { &mut self, defs: Option>, validate: bool, + validation_operations: &mut Vec, platform_version: &PlatformVersion, ) -> Result<(), ProtocolError>; } diff --git a/packages/rs-dpp/src/data_contract/mod.rs b/packages/rs-dpp/src/data_contract/mod.rs index 3cc7cccbe2..beffa0b289 100644 --- a/packages/rs-dpp/src/data_contract/mod.rs +++ b/packages/rs-dpp/src/data_contract/mod.rs @@ -141,6 +141,7 @@ impl PlatformDeserializableWithPotentialValidationFromVersionedStructure for Dat DataContract::try_from_platform_versioned( data_contract_in_serialization_format, validate, + &mut vec![], platform_version, ) } @@ -169,6 +170,7 @@ impl PlatformDeserializableWithBytesLenFromVersionedStructure for DataContract { DataContract::try_from_platform_versioned( data_contract_in_serialization_format, validate, + &mut vec![], platform_version, )?, len, @@ -200,6 +202,7 @@ impl PlatformLimitDeserializableFromVersionedStructure for DataContract { DataContract::try_from_platform_versioned( data_contract_in_serialization_format, true, + &mut vec![], platform_version, ) } diff --git a/packages/rs-dpp/src/data_contract/serialized_version/mod.rs b/packages/rs-dpp/src/data_contract/serialized_version/mod.rs index bf25d0accb..eaf86bdd68 100644 --- a/packages/rs-dpp/src/data_contract/serialized_version/mod.rs +++ b/packages/rs-dpp/src/data_contract/serialized_version/mod.rs @@ -4,6 +4,7 @@ use crate::data_contract::{DataContract, DefinitionName, DocumentName}; use crate::version::PlatformVersion; use std::collections::BTreeMap; +use crate::validation::operations::ProtocolValidationOperation; use crate::ProtocolError; use bincode::{Decode, Encode}; use derive_more::From; @@ -164,6 +165,7 @@ impl DataContract { pub fn try_from_platform_versioned( value: DataContractInSerializationFormat, validate: bool, + validation_operations: &mut Vec, platform_version: &PlatformVersion, ) -> Result { match value { @@ -177,6 +179,7 @@ impl DataContract { let data_contract = DataContractV0::try_from_platform_versioned_v0( serialization_format_v0, validate, + validation_operations, platform_version, )?; Ok(data_contract.into()) diff --git a/packages/rs-dpp/src/data_contract/v0/conversion/value.rs b/packages/rs-dpp/src/data_contract/v0/conversion/value.rs index 7f103c96d1..f0f4a16366 100644 --- a/packages/rs-dpp/src/data_contract/v0/conversion/value.rs +++ b/packages/rs-dpp/src/data_contract/v0/conversion/value.rs @@ -31,6 +31,7 @@ impl DataContractValueConversionMethodsV0 for DataContractV0 { DataContractV0::try_from_platform_versioned( data_contract_data.into(), validate, + &mut vec![], // this is not used in consensus code platform_version, ) } diff --git a/packages/rs-dpp/src/data_contract/v0/methods/schema.rs b/packages/rs-dpp/src/data_contract/v0/methods/schema.rs index a488dc3a28..03bf8f8f5b 100644 --- a/packages/rs-dpp/src/data_contract/v0/methods/schema.rs +++ b/packages/rs-dpp/src/data_contract/v0/methods/schema.rs @@ -4,6 +4,7 @@ use crate::data_contract::document_type::DocumentType; use crate::data_contract::schema::DataContractSchemaMethodsV0; use crate::data_contract::v0::DataContractV0; use crate::data_contract::{DefinitionName, DocumentName}; +use crate::validation::operations::ProtocolValidationOperation; use crate::ProtocolError; use platform_value::Value; use platform_version::version::PlatformVersion; @@ -15,6 +16,7 @@ impl DataContractSchemaMethodsV0 for DataContractV0 { schemas: BTreeMap, defs: Option>, validate: bool, + validation_operations: &mut Vec, platform_version: &PlatformVersion, ) -> Result<(), ProtocolError> { self.document_types = DocumentType::create_document_types_from_document_schemas( @@ -24,6 +26,7 @@ impl DataContractSchemaMethodsV0 for DataContractV0 { self.config.documents_keep_history_contract_default(), self.config.documents_mutable_contract_default(), validate, + validation_operations, platform_version, )?; @@ -35,6 +38,7 @@ impl DataContractSchemaMethodsV0 for DataContractV0 { name: &str, schema: Value, validate: bool, + validation_operations: &mut Vec, platform_version: &PlatformVersion, ) -> Result<(), ProtocolError> { let document_type = DocumentType::try_from_schema( @@ -45,6 +49,7 @@ impl DataContractSchemaMethodsV0 for DataContractV0 { self.config.documents_keep_history_contract_default(), self.config.documents_mutable_contract_default(), validate, + validation_operations, platform_version, )?; @@ -69,6 +74,7 @@ impl DataContractSchemaMethodsV0 for DataContractV0 { &mut self, defs: Option>, validate: bool, + validation_operations: &mut Vec, platform_version: &PlatformVersion, ) -> Result<(), ProtocolError> { let document_schemas = self @@ -77,7 +83,13 @@ impl DataContractSchemaMethodsV0 for DataContractV0 { .map(|(name, document_type)| (name.to_owned(), document_type.schema().to_owned())) .collect(); - self.set_document_schemas(document_schemas, defs.clone(), validate, platform_version)?; + self.set_document_schemas( + document_schemas, + defs.clone(), + validate, + validation_operations, + platform_version, + )?; self.schema_defs = defs; @@ -124,6 +136,7 @@ mod test { let mut data_contract = DataContractV0::try_from_platform_versioned( serialization_format.into(), true, + &mut vec![], platform_version, ) .expect("should create a contract from serialization format"); @@ -137,7 +150,7 @@ mod test { let defs_map = Some(defs.into_btree_string_map().expect("should convert to map")); data_contract - .set_schema_defs(defs_map.clone(), true, platform_version) + .set_schema_defs(defs_map.clone(), true, &mut vec![], platform_version) .expect("should set defs"); assert_eq!(defs_map.as_ref(), data_contract.schema_defs()) @@ -169,12 +182,13 @@ mod test { let mut data_contract = DataContractV0::try_from_platform_versioned( serialization_format.into(), true, + &mut vec![], platform_version, ) .expect("should create a contract from serialization format"); data_contract - .set_schema_defs(None, true, platform_version) + .set_schema_defs(None, true, &mut vec![], platform_version) .expect("should set defs"); assert_eq!(None, data_contract.schema_defs()) diff --git a/packages/rs-dpp/src/data_contract/v0/serialization/mod.rs b/packages/rs-dpp/src/data_contract/v0/serialization/mod.rs index 0606d72221..b1992eba7b 100644 --- a/packages/rs-dpp/src/data_contract/v0/serialization/mod.rs +++ b/packages/rs-dpp/src/data_contract/v0/serialization/mod.rs @@ -7,6 +7,7 @@ use crate::data_contract::DataContract; use crate::version::{PlatformVersion, PlatformVersionCurrentVersion}; use crate::ProtocolError; +use crate::validation::operations::ProtocolValidationOperation; use serde::{Deserialize, Deserializer, Serialize, Serializer}; pub mod bincode; @@ -31,8 +32,13 @@ impl<'de> Deserialize<'de> for DataContractV0 { let current_version = PlatformVersion::get_current().map_err(|e| serde::de::Error::custom(e.to_string()))?; // when deserializing from json/platform_value/cbor we always want to validate (as this is not coming from the state) - DataContractV0::try_from_platform_versioned_v0(serialization_format, true, current_version) - .map_err(serde::de::Error::custom) + DataContractV0::try_from_platform_versioned_v0( + serialization_format, + true, + &mut vec![], + current_version, + ) + .map_err(serde::de::Error::custom) } } @@ -40,6 +46,7 @@ impl DataContractV0 { pub(in crate::data_contract) fn try_from_platform_versioned( value: DataContractInSerializationFormat, validate: bool, + validation_operations: &mut Vec, platform_version: &PlatformVersion, ) -> Result { match value { @@ -53,6 +60,7 @@ impl DataContractV0 { let data_contract = DataContractV0::try_from_platform_versioned_v0( serialization_format_v0, validate, + validation_operations, platform_version, )?; @@ -71,6 +79,7 @@ impl DataContractV0 { pub(in crate::data_contract) fn try_from_platform_versioned_v0( data_contract_data: DataContractInSerializationFormatV0, validate: bool, + validation_operations: &mut Vec, platform_version: &PlatformVersion, ) -> Result { let DataContractInSerializationFormatV0 { @@ -89,6 +98,7 @@ impl DataContractV0 { config.documents_keep_history_contract_default(), config.documents_mutable_contract_default(), validate, + validation_operations, platform_version, )?; diff --git a/packages/rs-dpp/src/errors/consensus/basic/data_contract/data_contract_max_depth_exceed_error.rs b/packages/rs-dpp/src/errors/consensus/basic/data_contract/data_contract_max_depth_exceed_error.rs index f30ca920e6..dd539edc46 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/data_contract/data_contract_max_depth_exceed_error.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/data_contract/data_contract_max_depth_exceed_error.rs @@ -16,24 +16,16 @@ pub struct DataContractMaxDepthExceedError { DO NOT CHANGE ORDER OF FIELDS WITHOUT INTRODUCING OF NEW VERSION */ - schema_depth: usize, max_depth: usize, } impl DataContractMaxDepthExceedError { - pub fn new(schema_depth: usize, max_depth: usize) -> Self { - Self { - schema_depth, - max_depth, - } + pub fn new(max_depth: usize) -> Self { + Self { max_depth } } - pub fn max_depth(&self) -> usize { self.max_depth } - pub fn schema_depth(&self) -> usize { - self.schema_depth - } } impl From for ConsensusError { diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/mod.rs index efbac4ea41..566dc56ea4 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/mod.rs @@ -238,6 +238,7 @@ mod test { let data_contract = DataContract::try_from_platform_versioned( data.state_transition.data_contract().clone(), false, + &mut vec![], LATEST_PLATFORM_VERSION, ) .expect("to get data contract"); diff --git a/packages/rs-dpp/src/util/json_schema.rs b/packages/rs-dpp/src/util/json_schema.rs index 41e390c7f6..24ba0b584b 100644 --- a/packages/rs-dpp/src/util/json_schema.rs +++ b/packages/rs-dpp/src/util/json_schema.rs @@ -213,6 +213,7 @@ mod test { false, false, false, + &mut vec![], LATEST_PLATFORM_VERSION, ) .unwrap(); diff --git a/packages/rs-dpp/src/validation/mod.rs b/packages/rs-dpp/src/validation/mod.rs index f4b5879b81..daa1045c8e 100644 --- a/packages/rs-dpp/src/validation/mod.rs +++ b/packages/rs-dpp/src/validation/mod.rs @@ -16,6 +16,7 @@ pub(crate) mod byte_array_meta; mod json_schema_validator; #[cfg(feature = "validation")] pub(crate) mod meta_validators; +pub mod operations; mod validation_result; #[cfg(feature = "validation")] diff --git a/packages/rs-dpp/src/validation/operations.rs b/packages/rs-dpp/src/validation/operations.rs new file mode 100644 index 0000000000..477f1eb06a --- /dev/null +++ b/packages/rs-dpp/src/validation/operations.rs @@ -0,0 +1,60 @@ +use crate::fee::Credits; +use platform_version::version::PlatformVersion; + +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum ProtocolValidationOperation { + DocumentTypeSchemaValidationForSize(u64), + DocumentTypeSchemaPropertyValidation(u64), + DocumentTypeSchemaIndexValidation(u64, bool), +} + +impl ProtocolValidationOperation { + pub fn processing_cost(&self, platform_version: &PlatformVersion) -> Credits { + match self { + ProtocolValidationOperation::DocumentTypeSchemaValidationForSize(size) => { + platform_version + .fee_version + .data_contract + .document_type_base_fee + + *size + * platform_version + .fee_version + .data_contract + .document_type_size_fee + } + ProtocolValidationOperation::DocumentTypeSchemaPropertyValidation(properties_count) => { + *properties_count + * platform_version + .fee_version + .data_contract + .document_type_per_property_fee + } + ProtocolValidationOperation::DocumentTypeSchemaIndexValidation( + index_properties_count, + is_unique, + ) => { + if *is_unique { + *index_properties_count + * platform_version + .fee_version + .data_contract + .document_type_unique_index_per_property_fee + + platform_version + .fee_version + .data_contract + .document_type_base_unique_index_fee + } else { + *index_properties_count + * platform_version + .fee_version + .data_contract + .document_type_non_unique_index_per_property_fee + + platform_version + .fee_version + .data_contract + .document_type_base_non_unique_index_fee + } + } + } + } +} diff --git a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs index d4ebc6e67f..9ca13e8a7a 100644 --- a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs @@ -434,7 +434,7 @@ mod tests { ) .expect("expected to process state transition"); - assert_eq!(processing_result.aggregated_fees().processing_fee, 2961150); + assert_eq!(processing_result.aggregated_fees().processing_fee, 2970480); let check_result = platform .check_tx( @@ -625,7 +625,7 @@ mod tests { // We have one invalid paid for state transition assert_eq!(processing_result.invalid_paid_count(), 1); - assert_eq!(processing_result.aggregated_fees().processing_fee, 901080); + assert_eq!(processing_result.aggregated_fees().processing_fee, 909500); let check_result = platform .check_tx( @@ -767,7 +767,7 @@ mod tests { // since a fee multiplier of 100 means 100% more of 1 (gives 2) assert_eq!( processing_result.aggregated_fees().processing_fee, - 2961150 * 2 + 2970480 * 2 ); let check_result = platform @@ -1005,7 +1005,7 @@ mod tests { ) .expect("expected to process state transition"); - assert_eq!(processing_result.aggregated_fees().processing_fee, 2961150); + assert_eq!(processing_result.aggregated_fees().processing_fee, 2970480); platform .drive @@ -1089,7 +1089,7 @@ mod tests { assert_eq!( update_processing_result.aggregated_fees().processing_fee, - 5804610 + 7066460 ); let check_result = platform @@ -1201,7 +1201,7 @@ mod tests { ) .expect("expected to process state transition"); - assert_eq!(processing_result.aggregated_fees().processing_fee, 2961150); + assert_eq!(processing_result.aggregated_fees().processing_fee, 2970480); platform .drive @@ -1320,7 +1320,7 @@ mod tests { // We have one invalid paid for state transition assert_eq!(processing_result.invalid_paid_count(), 1); - assert_eq!(processing_result.aggregated_fees().processing_fee, 1226750); + assert_eq!(processing_result.aggregated_fees().processing_fee, 1231110); let check_result = platform .check_tx( diff --git a/packages/rs-drive-abci/src/execution/types/execution_operation/mod.rs b/packages/rs-drive-abci/src/execution/types/execution_operation/mod.rs index f32d3a7f8f..a3c116c04c 100644 --- a/packages/rs-drive-abci/src/execution/types/execution_operation/mod.rs +++ b/packages/rs-drive-abci/src/execution/types/execution_operation/mod.rs @@ -4,6 +4,7 @@ use crate::execution::types::execution_operation::signature_verification_operati use dpp::fee::fee_result::FeeResult; use dpp::fee::Credits; use dpp::identity::KeyCount; +use dpp::validation::operations::ProtocolValidationOperation; use dpp::version::PlatformVersion; pub mod signature_verification_operation; @@ -47,6 +48,7 @@ pub const SHA256_BLOCK_SIZE: u16 = 64; #[derive(Debug, Clone, PartialEq, Eq)] pub enum ValidationOperation { + Protocol(ProtocolValidationOperation), RetrieveIdentity(RetrieveIdentityInfo), DoubleSha256(HashBlockCount), ValidateKeyStructure(KeyCount), // This is extremely cheap @@ -157,6 +159,14 @@ impl ValidationOperation { "execution processing fee overflow error", ))?; } + ValidationOperation::Protocol(dpp_validation_operation) => { + fee_result.processing_fee = fee_result + .processing_fee + .checked_add(dpp_validation_operation.processing_cost(platform_version)) + .ok_or(ExecutionError::Overflow( + "execution processing fee overflow error", + ))?; + } } } Ok(()) diff --git a/packages/rs-drive-abci/src/execution/types/state_transition_execution_context/mod.rs b/packages/rs-drive-abci/src/execution/types/state_transition_execution_context/mod.rs index 3b46a63ac2..4d9ede1066 100644 --- a/packages/rs-drive-abci/src/execution/types/state_transition_execution_context/mod.rs +++ b/packages/rs-drive-abci/src/execution/types/state_transition_execution_context/mod.rs @@ -5,6 +5,7 @@ use crate::execution::types::execution_operation::ValidationOperation; use crate::execution::types::state_transition_execution_context::v0::StateTransitionExecutionContextV0; use derive_more::From; use dpp::fee::fee_result::FeeResult; +use dpp::validation::operations::ProtocolValidationOperation; use dpp::version::{DefaultForPlatformVersion, PlatformVersion}; /// V0 module @@ -21,8 +22,10 @@ pub enum StateTransitionExecutionContext { pub trait StateTransitionExecutionContextMethodsV0 { /// Add an operation to the state transition execution context fn add_operation(&mut self, operation: ValidationOperation); - /// Add a operations to the state transition execution context + /// Add operations to the state transition execution context fn add_operations(&mut self, operations: Vec); + /// Add dpp operations to the state transition execution context + fn add_dpp_operations(&mut self, operations: Vec); /// Consume the operations of the context fn operations_consume(self) -> Vec; /// Returns a slice of operations, does not consume the context @@ -52,6 +55,14 @@ impl StateTransitionExecutionContextMethodsV0 for StateTransitionExecutionContex } } + fn add_dpp_operations(&mut self, operations: Vec) { + match self { + StateTransitionExecutionContext::V0(v0) => v0 + .operations + .extend(operations.into_iter().map(ValidationOperation::Protocol)), + } + } + fn operations_consume(self) -> Vec { match self { StateTransitionExecutionContext::V0(v0) => v0.operations, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs index e19b7d3011..3a6acb90d0 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs @@ -5,6 +5,7 @@ use crate::platform_types::platform::{PlatformRef, PlatformStateRef}; use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::rpc::core::CoreRPCLike; use dpp::block::block_info::BlockInfo; +use dpp::block::epoch::Epoch; use dpp::identity::PartialIdentity; use dpp::prelude::ConsensusValidationResult; use dpp::ProtocolError; @@ -216,6 +217,7 @@ pub(super) fn process_state_transition_v0<'a, C: CoreRPCLike>( action, platform, ValidationMode::Validator, + &block_info.epoch, &mut state_transition_execution_context, transaction, )?; @@ -429,6 +431,7 @@ pub(crate) trait StateTransitionStateValidationV0: action: Option, platform: &PlatformRef, validation_mode: ValidationMode, + epoch: &Epoch, execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, ) -> Result, Error>; @@ -750,18 +753,29 @@ impl StateTransitionStateValidationV0 for StateTransition { action: Option, platform: &PlatformRef, validation_mode: ValidationMode, + epoch: &Epoch, execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, ) -> Result, Error> { match self { // The replay attack is prevented by checking if a data contract exists with this id first - StateTransition::DataContractCreate(st) => { - st.validate_state(action, platform, validation_mode, execution_context, tx) - } + StateTransition::DataContractCreate(st) => st.validate_state( + action, + platform, + validation_mode, + epoch, + execution_context, + tx, + ), // The replay attack is prevented by identity data contract nonce - StateTransition::DataContractUpdate(st) => { - st.validate_state(action, platform, validation_mode, execution_context, tx) - } + StateTransition::DataContractUpdate(st) => st.validate_state( + action, + platform, + validation_mode, + epoch, + execution_context, + tx, + ), StateTransition::IdentityCreate(st) => { let action = action.ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( @@ -779,9 +793,14 @@ impl StateTransitionStateValidationV0 for StateTransition { tx, ) } - StateTransition::IdentityUpdate(st) => { - st.validate_state(action, platform, validation_mode, execution_context, tx) - } + StateTransition::IdentityUpdate(st) => st.validate_state( + action, + platform, + validation_mode, + epoch, + execution_context, + tx, + ), StateTransition::IdentityTopUp(st) => { // Nothing to validate from state if let Some(action) = action { @@ -797,16 +816,31 @@ impl StateTransitionStateValidationV0 for StateTransition { ) } } - StateTransition::IdentityCreditWithdrawal(st) => { - st.validate_state(action, platform, validation_mode, execution_context, tx) - } + StateTransition::IdentityCreditWithdrawal(st) => st.validate_state( + action, + platform, + validation_mode, + epoch, + execution_context, + tx, + ), // The replay attack is prevented by identity data contract nonce - StateTransition::DocumentsBatch(st) => { - st.validate_state(action, platform, validation_mode, execution_context, tx) - } - StateTransition::IdentityCreditTransfer(st) => { - st.validate_state(action, platform, validation_mode, execution_context, tx) - } + StateTransition::DocumentsBatch(st) => st.validate_state( + action, + platform, + validation_mode, + epoch, + execution_context, + tx, + ), + StateTransition::IdentityCreditTransfer(st) => st.validate_state( + action, + platform, + validation_mode, + epoch, + execution_context, + tx, + ), } } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs index 4110e97549..a07f32f023 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs @@ -3,6 +3,7 @@ mod identity_nonce; mod state; use dpp::block::block_info::BlockInfo; +use dpp::block::epoch::Epoch; use dpp::identity::PartialIdentity; use dpp::prelude::ConsensusValidationResult; use dpp::state_transition::data_contract_create_transition::DataContractCreateTransition; @@ -44,7 +45,7 @@ impl StateTransitionActionTransformerV0 for DataContractCreateTransition { platform: &PlatformRef, _block_info: &BlockInfo, validation_mode: ValidationMode, - _execution_context: &mut StateTransitionExecutionContext, + execution_context: &mut StateTransitionExecutionContext, _tx: TransactionArg, ) -> Result, Error> { let platform_version = platform.state.current_platform_version()?; @@ -56,7 +57,11 @@ impl StateTransitionActionTransformerV0 for DataContractCreateTransition { .contract_create_state_transition .transform_into_action { - 0 => self.transform_into_action_v0::(validation_mode, platform_version), + 0 => self.transform_into_action_v0::( + validation_mode, + execution_context, + platform_version, + ), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "data contract create transition: transform_into_action".to_string(), known_versions: vec![0], @@ -104,7 +109,8 @@ impl StateTransitionStateValidationV0 for DataContractCreateTransition { _action: Option, platform: &PlatformRef, validation_mode: ValidationMode, - _execution_context: &mut StateTransitionExecutionContext, + epoch: &Epoch, + execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, ) -> Result, Error> { let platform_version = platform.state.current_platform_version()?; @@ -116,7 +122,14 @@ impl StateTransitionStateValidationV0 for DataContractCreateTransition { .contract_create_state_transition .state { - 0 => self.validate_state_v0(platform, validation_mode, tx, platform_version), + 0 => self.validate_state_v0( + platform, + validation_mode, + epoch, + tx, + execution_context, + platform_version, + ), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "data contract create transition: validate_state".to_string(), known_versions: vec![0], diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/state/v0/mod.rs index 5f81fc02ad..9e0496555d 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/state/v0/mod.rs @@ -1,6 +1,7 @@ use crate::error::Error; use crate::platform_types::platform::PlatformRef; use crate::rpc::core::CoreRPCLike; +use dpp::block::epoch::Epoch; use dpp::consensus::state::data_contract::data_contract_already_present_error::DataContractAlreadyPresentError; use dpp::consensus::state::state_error::StateError; @@ -9,6 +10,11 @@ use dpp::state_transition::data_contract_create_transition::accessors::DataContr use dpp::state_transition::data_contract_create_transition::DataContractCreateTransition; use dpp::ProtocolError; +use crate::error::execution::ExecutionError; +use crate::execution::types::execution_operation::ValidationOperation; +use crate::execution::types::state_transition_execution_context::{ + StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0, +}; use crate::execution::validation::state_transition::ValidationMode; use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; @@ -21,13 +27,16 @@ pub(in crate::execution::validation::state_transition::state_transitions::data_c &self, platform: &PlatformRef, validation_mode: ValidationMode, + epoch: &Epoch, tx: TransactionArg, + execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion, ) -> Result, Error>; fn transform_into_action_v0( &self, validation_mode: ValidationMode, + execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion, ) -> Result, Error>; } @@ -37,44 +46,65 @@ impl DataContractCreateStateTransitionStateValidationV0 for DataContractCreateTr &self, platform: &PlatformRef, validation_mode: ValidationMode, + epoch: &Epoch, tx: TransactionArg, + execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion, ) -> Result, Error> { - let drive = platform.drive; + let contract_fetch_info = platform.drive.get_contract_with_fetch_info_and_fee( + self.data_contract().id().to_buffer(), + Some(epoch), + false, + tx, + platform_version, + )?; + + let fee = contract_fetch_info.0.ok_or(Error::Execution( + ExecutionError::CorruptedCodeExecution( + "fee must exist in validate state for data contract create transition", + ), + ))?; + + // We add the cost for fetching the contract even if the contract doesn't exist or was in cache + execution_context.add_operation(ValidationOperation::PrecalculatedOperation(fee)); + // Data contract shouldn't exist - if drive - .get_contract_with_fetch_info_and_fee( - self.data_contract().id().to_buffer(), - None, - false, - tx, - platform_version, - )? - .1 - .is_some() - { - Ok(ConsensusValidationResult::new_with_errors(vec![ - StateError::DataContractAlreadyPresentError(DataContractAlreadyPresentError::new( - self.data_contract().id().to_owned(), - )) - .into(), - ])) + if contract_fetch_info.1.is_some() { + let bump_action = StateTransitionAction::BumpIdentityNonceAction( + BumpIdentityNonceAction::from_borrowed_data_contract_create_transition(self), + ); + + Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + vec![StateError::DataContractAlreadyPresentError( + DataContractAlreadyPresentError::new(self.data_contract().id().to_owned()), + ) + .into()], + )) } else { - self.transform_into_action_v0::(validation_mode, platform_version) + self.transform_into_action_v0::(validation_mode, execution_context, platform_version) } } fn transform_into_action_v0( &self, validation_mode: ValidationMode, + execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion, ) -> Result, Error> { + let mut validation_operations = vec![]; + + // The transformation of the state transition into the state transition action will transform + // The contract in serialized form into it's execution form let result = DataContractCreateTransitionAction::try_from_borrowed_transition( self, validation_mode.should_validate_contract_on_transform_into_action(), + &mut validation_operations, platform_version, ); + execution_context.add_dpp_operations(validation_operations); + // Return validation result if any consensus errors happened // during data contract validation match result { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs index 4b058bc7d3..ae9be56b21 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs @@ -26,7 +26,7 @@ impl StateTransitionActionTransformerV0 for DataContractUpdateTransition { platform: &PlatformRef, _block_info: &BlockInfo, validation_mode: ValidationMode, - _execution_context: &mut StateTransitionExecutionContext, + execution_context: &mut StateTransitionExecutionContext, _tx: TransactionArg, ) -> Result, Error> { let platform_version = platform.state.current_platform_version()?; @@ -38,7 +38,9 @@ impl StateTransitionActionTransformerV0 for DataContractUpdateTransition { .contract_update_state_transition .transform_into_action { - 0 => self.transform_into_action_v0(validation_mode, platform_version), + 0 => { + self.transform_into_action_v0(validation_mode, execution_context, platform_version) + } version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "data contract update transition: transform_into_action".to_string(), known_versions: vec![0], @@ -124,6 +126,7 @@ mod tests { use crate::execution::validation::state_transition::processor::v0::StateTransitionStateValidationV0; use dpp::block::block_info::BlockInfo; + use dpp::block::epoch::Epoch; use dpp::data_contract::accessors::v0::{DataContractV0Getters, DataContractV0Setters}; use dpp::data_contract::config::v0::DataContractConfigSettersV0; @@ -171,7 +174,13 @@ mod tests { data_contract.increment_version(); data_contract - .set_document_schema("niceDocument", updated_document, true, platform_version) + .set_document_schema( + "niceDocument", + updated_document, + true, + &mut vec![], + platform_version, + ) .expect("to be able to set document schema"); let state_transition = DataContractUpdateTransitionV0 { @@ -204,6 +213,7 @@ mod tests { None, &platform_ref, ValidationMode::Validator, + &Epoch::new(0).unwrap(), &mut execution_context, None, ) @@ -257,7 +267,13 @@ mod tests { data_contract.increment_version(); data_contract - .set_document_schema("niceDocument", updated_document, true, platform_version) + .set_document_schema( + "niceDocument", + updated_document, + true, + &mut vec![], + platform_version, + ) .expect("to be able to set document schema"); // TODO: add a data contract stop transition @@ -291,6 +307,7 @@ mod tests { None, &platform_ref, ValidationMode::Validator, + &Epoch::new(0).unwrap(), &mut execution_context, None, ) @@ -416,6 +433,7 @@ mod tests { "niceDocument", updated_document_type.into(), true, + &mut vec![], LATEST_PLATFORM_VERSION, ) .expect("to be able to set document schema"); @@ -447,6 +465,7 @@ mod tests { None, &platform_ref, ValidationMode::Validator, + &Epoch::new(0).unwrap(), &mut execution_context, None, ) diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/mod.rs index 00f9612d93..39e007b6b4 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/mod.rs @@ -6,6 +6,7 @@ use crate::execution::validation::state_transition::processor::v0::StateTransiti use crate::execution::validation::state_transition::ValidationMode; use crate::platform_types::platform::PlatformRef; use crate::rpc::core::CoreRPCLike; +use dpp::block::epoch::Epoch; use dpp::state_transition::data_contract_update_transition::DataContractUpdateTransition; use dpp::validation::ConsensusValidationResult; use drive::grovedb::TransactionArg; @@ -19,7 +20,8 @@ impl StateTransitionStateValidationV0 for DataContractUpdateTransition { action: Option, platform: &PlatformRef, validation_mode: ValidationMode, - _execution_context: &mut StateTransitionExecutionContext, + epoch: &Epoch, + execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, ) -> Result, Error> { let platform_version = platform.state.current_platform_version()?; @@ -35,7 +37,14 @@ impl StateTransitionStateValidationV0 for DataContractUpdateTransition { if action.is_some() { return Err(Error::Execution(ExecutionError::CorruptedCodeExecution("data contract update is calling validate state, and the action is already known. It should not be known at this point"))); } - self.validate_state_v0(platform, validation_mode, tx, platform_version) + self.validate_state_v0( + platform, + validation_mode, + epoch, + execution_context, + tx, + platform_version, + ) } version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "data contract update transition: validate_state".to_string(), diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/v0/mod.rs index 0a818d94b1..ca94bd2f23 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/v0/mod.rs @@ -1,6 +1,7 @@ use crate::error::Error; use crate::platform_types::platform::PlatformRef; use crate::rpc::core::CoreRPCLike; +use dpp::block::epoch::Epoch; use dpp::consensus::basic::data_contract::{ DataContractInvalidIndexDefinitionUpdateError, IncompatibleDataContractSchemaError, @@ -35,6 +36,10 @@ use drive::grovedb::TransactionArg; use drive::state_transition_action::contract::data_contract_update::DataContractUpdateTransitionAction; use drive::state_transition_action::system::bump_identity_data_contract_nonce_action::BumpIdentityDataContractNonceAction; +use crate::execution::types::execution_operation::ValidationOperation; +use crate::execution::types::state_transition_execution_context::{ + StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0, +}; use drive::state_transition_action::StateTransitionAction; pub(in crate::execution::validation::state_transition::state_transitions::data_contract_update) trait DataContractUpdateStateTransitionStateValidationV0 { @@ -42,6 +47,8 @@ pub(in crate::execution::validation::state_transition::state_transitions::data_c &self, platform: &PlatformRef, validation_mode: ValidationMode, + epoch: &Epoch, + execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, platform_version: &PlatformVersion, ) -> Result, Error>; @@ -49,6 +56,7 @@ pub(in crate::execution::validation::state_transition::state_transitions::data_c fn transform_into_action_v0( &self, validation_mode: ValidationMode, + execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion ) -> Result, Error>; } @@ -58,10 +66,13 @@ impl DataContractUpdateStateTransitionStateValidationV0 for DataContractUpdateTr &self, platform: &PlatformRef, validation_mode: ValidationMode, + epoch: &Epoch, + execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, platform_version: &PlatformVersion, ) -> Result, Error> { - let action = self.transform_into_action_v0(validation_mode, platform_version)?; + let action = + self.transform_into_action_v0(validation_mode, execution_context, platform_version)?; if !action.is_valid() { return Ok(action); @@ -92,17 +103,26 @@ impl DataContractUpdateStateTransitionStateValidationV0 for DataContractUpdateTr // Data contract should exist let add_to_cache_if_pulled = validation_mode.can_alter_cache(); + + let data_contract_fetch_info = drive.get_contract_with_fetch_info_and_fee( + new_data_contract.id().to_buffer(), + Some(epoch), + add_to_cache_if_pulled, + tx, + platform_version, + )?; + + let fee = data_contract_fetch_info.0.ok_or(Error::Execution( + ExecutionError::CorruptedCodeExecution( + "fee must exist in validate state for data contract update transition", + ), + ))?; + + // We add the cost for fetching the contract even if the contract doesn't exist or was in cache + execution_context.add_operation(ValidationOperation::PrecalculatedOperation(fee)); + // Data contract should exist - let Some(contract_fetch_info) = drive - .get_contract_with_fetch_info_and_fee( - new_data_contract.id().to_buffer(), - None, - add_to_cache_if_pulled, - tx, - platform_version, - )? - .1 - else { + let Some(contract_fetch_info) = data_contract_fetch_info.1 else { let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( BumpIdentityDataContractNonceAction::from_borrowed_data_contract_update_transition( self, @@ -421,14 +441,20 @@ impl DataContractUpdateStateTransitionStateValidationV0 for DataContractUpdateTr fn transform_into_action_v0( &self, validation_mode: ValidationMode, + execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion, ) -> Result, Error> { + let mut validation_operations = vec![]; + let result = DataContractUpdateTransitionAction::try_from_borrowed_transition( self, validation_mode.should_validate_contract_on_transform_into_action(), + &mut validation_operations, platform_version, ); + execution_context.add_dpp_operations(validation_operations); + // Return validation result if any consensus errors happened // during data contract validation match result { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/mod.rs index 78cc9ccc27..713d82c129 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/mod.rs @@ -1,3 +1,4 @@ +use dpp::block::epoch::Epoch; use dpp::identifier::Identifier; use dpp::validation::SimpleConsensusValidationResult; use drive::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::DocumentCreateTransitionAction; @@ -5,6 +6,7 @@ use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; use crate::error::Error; use crate::error::execution::ExecutionError; +use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; use crate::execution::validation::state_transition::documents_batch::action_validation::document_create_transition_action::state_v0::DocumentCreateTransitionActionStateValidationV0; use crate::execution::validation::state_transition::documents_batch::action_validation::document_create_transition_action::structure_v0::DocumentCreateTransitionActionStructureValidationV0; use crate::platform_types::platform::PlatformStateRef; @@ -22,6 +24,8 @@ pub trait DocumentCreateTransitionActionValidation { &self, platform: &PlatformStateRef, owner_id: Identifier, + epoch: &Epoch, + execution_context: &mut StateTransitionExecutionContext, transaction: TransactionArg, platform_version: &PlatformVersion, ) -> Result; @@ -52,6 +56,8 @@ impl DocumentCreateTransitionActionValidation for DocumentCreateTransitionAction &self, platform: &PlatformStateRef, owner_id: Identifier, + epoch: &Epoch, + execution_context: &mut StateTransitionExecutionContext, transaction: TransactionArg, platform_version: &PlatformVersion, ) -> Result { @@ -62,7 +68,14 @@ impl DocumentCreateTransitionActionValidation for DocumentCreateTransitionAction .documents_batch_state_transition .document_create_transition_state_validation { - 0 => self.validate_state_v0(platform, owner_id, transaction, platform_version), + 0 => self.validate_state_v0( + platform, + owner_id, + epoch, + execution_context, + transaction, + platform_version, + ), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "DocumentCreateTransitionAction::validate_state".to_string(), known_versions: vec![0], diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/state_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/state_v0/mod.rs index 0bad59c56c..f266d18c76 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/state_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/state_v0/mod.rs @@ -1,3 +1,4 @@ +use dpp::block::epoch::Epoch; use dpp::consensus::basic::document::InvalidDocumentTypeError; use dpp::consensus::ConsensusError; use dpp::consensus::state::document::document_already_present_error::DocumentAlreadyPresentError; @@ -10,6 +11,7 @@ use drive::state_transition_action::document::documents_batch::document_transiti use dpp::version::PlatformVersion; use drive::query::TransactionArg; use crate::error::Error; +use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; use crate::execution::validation::state_transition::documents_batch::state::v0::fetch_documents::fetch_document_with_id; use crate::platform_types::platform::PlatformStateRef; @@ -18,6 +20,8 @@ pub(super) trait DocumentCreateTransitionActionStateValidationV0 { &self, platform: &PlatformStateRef, owner_id: Identifier, + epoch: &Epoch, + execution_context: &mut StateTransitionExecutionContext, transaction: TransactionArg, platform_version: &PlatformVersion, ) -> Result; @@ -27,6 +31,8 @@ impl DocumentCreateTransitionActionStateValidationV0 for DocumentCreateTransitio &self, platform: &PlatformStateRef, owner_id: Identifier, + _epoch: &Epoch, + _execution_context: &mut StateTransitionExecutionContext, transaction: TransactionArg, platform_version: &PlatformVersion, ) -> Result { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_delete_transition_action/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_delete_transition_action/mod.rs index 3257028d79..79f55e4fcf 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_delete_transition_action/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_delete_transition_action/mod.rs @@ -1,3 +1,4 @@ +use dpp::block::epoch::Epoch; use dpp::identifier::Identifier; use dpp::validation::SimpleConsensusValidationResult; use drive::state_transition_action::document::documents_batch::document_transition::document_delete_transition_action::DocumentDeleteTransitionAction; @@ -5,6 +6,7 @@ use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; use crate::error::Error; use crate::error::execution::ExecutionError; +use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; use crate::execution::validation::state_transition::documents_batch::action_validation::document_delete_transition_action::state_v0::DocumentDeleteTransitionActionStateValidationV0; use crate::execution::validation::state_transition::documents_batch::action_validation::document_delete_transition_action::structure_v0::DocumentDeleteTransitionActionStructureValidationV0; use crate::platform_types::platform::PlatformStateRef; @@ -22,6 +24,8 @@ pub trait DocumentDeleteTransitionActionValidation { &self, platform: &PlatformStateRef, owner_id: Identifier, + epoch: &Epoch, + execution_context: &mut StateTransitionExecutionContext, transaction: TransactionArg, platform_version: &PlatformVersion, ) -> Result; @@ -52,6 +56,8 @@ impl DocumentDeleteTransitionActionValidation for DocumentDeleteTransitionAction &self, platform: &PlatformStateRef, owner_id: Identifier, + epoch: &Epoch, + execution_context: &mut StateTransitionExecutionContext, transaction: TransactionArg, platform_version: &PlatformVersion, ) -> Result { @@ -62,7 +68,14 @@ impl DocumentDeleteTransitionActionValidation for DocumentDeleteTransitionAction .documents_batch_state_transition .document_delete_transition_state_validation { - 0 => self.validate_state_v0(platform, owner_id, transaction, platform_version), + 0 => self.validate_state_v0( + platform, + owner_id, + epoch, + execution_context, + transaction, + platform_version, + ), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "DocumentDeleteTransitionAction::validate_state".to_string(), known_versions: vec![0], diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_delete_transition_action/state_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_delete_transition_action/state_v0/mod.rs index be9d279253..b598a2fd0a 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_delete_transition_action/state_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_delete_transition_action/state_v0/mod.rs @@ -1,3 +1,4 @@ +use dpp::block::epoch::Epoch; use dpp::consensus::basic::document::InvalidDocumentTypeError; use dpp::consensus::ConsensusError; use dpp::consensus::state::document::document_not_found_error::DocumentNotFoundError; @@ -14,6 +15,7 @@ use drive::grovedb::TransactionArg; use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; use drive::state_transition_action::document::documents_batch::document_transition::document_delete_transition_action::v0::DocumentDeleteTransitionActionAccessorsV0; use crate::error::Error; +use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; use crate::execution::validation::state_transition::documents_batch::state::v0::fetch_documents::fetch_document_with_id; use crate::platform_types::platform::PlatformStateRef; @@ -22,6 +24,8 @@ pub(super) trait DocumentDeleteTransitionActionStateValidationV0 { &self, platform: &PlatformStateRef, owner_id: Identifier, + epoch: &Epoch, + execution_context: &mut StateTransitionExecutionContext, transaction: TransactionArg, platform_version: &PlatformVersion, ) -> Result; @@ -31,6 +35,8 @@ impl DocumentDeleteTransitionActionStateValidationV0 for DocumentDeleteTransitio &self, platform: &PlatformStateRef, owner_id: Identifier, + _epoch: &Epoch, + _execution_context: &mut StateTransitionExecutionContext, transaction: TransactionArg, platform_version: &PlatformVersion, ) -> Result { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/mod.rs index 42b5ea4c7c..f745e690f2 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/mod.rs @@ -1,3 +1,4 @@ +use dpp::block::epoch::Epoch; use dpp::identifier::Identifier; use dpp::validation::SimpleConsensusValidationResult; @@ -6,6 +7,7 @@ use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; use crate::error::Error; use crate::error::execution::ExecutionError; +use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; use crate::execution::validation::state_transition::documents_batch::action_validation::document_replace_transition_action::state_v0::DocumentReplaceTransitionActionStateValidationV0; use crate::execution::validation::state_transition::documents_batch::action_validation::document_replace_transition_action::structure_v0::DocumentReplaceTransitionActionStructureValidationV0; use crate::platform_types::platform::PlatformStateRef; @@ -23,6 +25,8 @@ pub trait DocumentReplaceTransitionActionValidation { &self, platform: &PlatformStateRef, owner_id: Identifier, + epoch: &Epoch, + execution_context: &mut StateTransitionExecutionContext, transaction: TransactionArg, platform_version: &PlatformVersion, ) -> Result; @@ -53,6 +57,8 @@ impl DocumentReplaceTransitionActionValidation for DocumentReplaceTransitionActi &self, platform: &PlatformStateRef, owner_id: Identifier, + epoch: &Epoch, + execution_context: &mut StateTransitionExecutionContext, transaction: TransactionArg, platform_version: &PlatformVersion, ) -> Result { @@ -63,7 +69,14 @@ impl DocumentReplaceTransitionActionValidation for DocumentReplaceTransitionActi .documents_batch_state_transition .document_replace_transition_state_validation { - 0 => self.validate_state_v0(platform, owner_id, transaction, platform_version), + 0 => self.validate_state_v0( + platform, + owner_id, + epoch, + execution_context, + transaction, + platform_version, + ), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "DocumentReplaceTransitionAction::validate_state".to_string(), known_versions: vec![0], diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/state_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/state_v0/mod.rs index 7021001aff..1329b35eae 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/state_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/state_v0/mod.rs @@ -1,3 +1,4 @@ +use dpp::block::epoch::Epoch; use dpp::consensus::basic::document::InvalidDocumentTypeError; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::identifier::Identifier; @@ -7,6 +8,7 @@ use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; use crate::error::Error; +use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; use crate::platform_types::platform::PlatformStateRef; pub(super) trait DocumentReplaceTransitionActionStateValidationV0 { @@ -14,6 +16,8 @@ pub(super) trait DocumentReplaceTransitionActionStateValidationV0 { &self, platform: &PlatformStateRef, owner_id: Identifier, + epoch: &Epoch, + execution_context: &mut StateTransitionExecutionContext, transaction: TransactionArg, platform_version: &PlatformVersion, ) -> Result; @@ -23,6 +27,8 @@ impl DocumentReplaceTransitionActionStateValidationV0 for DocumentReplaceTransit &self, platform: &PlatformStateRef, owner_id: Identifier, + _epoch: &Epoch, + _execution_context: &mut StateTransitionExecutionContext, transaction: TransactionArg, platform_version: &PlatformVersion, ) -> Result { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs index f7a661a625..d09cd9e175 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs @@ -6,6 +6,7 @@ mod state; mod transformer; use dpp::block::block_info::BlockInfo; +use dpp::block::epoch::Epoch; use dpp::identity::PartialIdentity; use dpp::prelude::*; use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; @@ -188,7 +189,8 @@ impl StateTransitionStateValidationV0 for DocumentsBatchTransition { action: Option, platform: &PlatformRef, _validation_mode: ValidationMode, - _execution_context: &mut StateTransitionExecutionContext, + epoch: &Epoch, + execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, ) -> Result, Error> { let platform_version = platform.state.current_platform_version()?; @@ -215,6 +217,8 @@ impl StateTransitionStateValidationV0 for DocumentsBatchTransition { self.validate_state_v0( documents_batch_transition_action, &platform.into(), + epoch, + execution_context, tx, platform_version, ) diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs index 91cc4c5b02..bb08be2e98 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs @@ -1,4 +1,5 @@ use dpp::block::block_info::BlockInfo; +use dpp::block::epoch::Epoch; use dpp::consensus::ConsensusError; use dpp::consensus::state::state_error::StateError; use dpp::prelude::ConsensusValidationResult; @@ -30,6 +31,8 @@ pub(in crate::execution::validation::state_transition::state_transitions::docume &self, action: DocumentsBatchTransitionAction, platform: &PlatformStateRef, + epoch: &Epoch, + execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, platform_version: &PlatformVersion, ) -> Result, Error>; @@ -48,6 +51,8 @@ impl DocumentsBatchStateTransitionStateValidationV0 for DocumentsBatchTransition &self, mut state_transition_action: DocumentsBatchTransitionAction, platform: &PlatformStateRef, + epoch: &Epoch, + execution_context: &mut StateTransitionExecutionContext, transaction: TransactionArg, platform_version: &PlatformVersion, ) -> Result, Error> { @@ -70,11 +75,32 @@ impl DocumentsBatchStateTransitionStateValidationV0 for DocumentsBatchTransition for transition in state_transition_action.transitions_take() { let transition_validation_result = match &transition { DocumentTransitionAction::CreateAction(create_action) => create_action - .validate_state(platform, owner_id, transaction, platform_version)?, + .validate_state( + platform, + owner_id, + epoch, + execution_context, + transaction, + platform_version, + )?, DocumentTransitionAction::ReplaceAction(replace_action) => replace_action - .validate_state(platform, owner_id, transaction, platform_version)?, + .validate_state( + platform, + owner_id, + epoch, + execution_context, + transaction, + platform_version, + )?, DocumentTransitionAction::DeleteAction(delete_action) => delete_action - .validate_state(platform, owner_id, transaction, platform_version)?, + .validate_state( + platform, + owner_id, + epoch, + execution_context, + transaction, + platform_version, + )?, DocumentTransitionAction::BumpIdentityDataContractNonce(..) => { return Err(Error::Execution(ExecutionError::CorruptedCodeExecution( "we should never start with a bump identity data contract nonce", diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/mod.rs index 771af49746..d13319d128 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_transfer/mod.rs @@ -4,6 +4,7 @@ mod state; mod structure; use dpp::block::block_info::BlockInfo; +use dpp::block::epoch::Epoch; use dpp::state_transition::identity_credit_transfer_transition::IdentityCreditTransferTransition; use dpp::validation::{ConsensusValidationResult, SimpleConsensusValidationResult}; use dpp::version::PlatformVersion; @@ -88,6 +89,7 @@ impl StateTransitionStateValidationV0 for IdentityCreditTransferTransition { _action: Option, platform: &PlatformRef, _validation_mode: ValidationMode, + _epoch: &Epoch, _execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, ) -> Result, Error> { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs index a97675f5d6..e83a4f37e7 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_credit_withdrawal/mod.rs @@ -4,6 +4,7 @@ mod state; mod structure; use dpp::block::block_info::BlockInfo; +use dpp::block::epoch::Epoch; use dpp::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition; use dpp::validation::{ConsensusValidationResult, SimpleConsensusValidationResult}; use dpp::version::PlatformVersion; @@ -91,6 +92,7 @@ impl StateTransitionStateValidationV0 for IdentityCreditWithdrawalTransition { _action: Option, platform: &PlatformRef, _validation_mode: ValidationMode, + _epoch: &Epoch, _execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, ) -> Result, Error> { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/mod.rs index 5a58bb5140..073bbeab2d 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/mod.rs @@ -4,6 +4,7 @@ mod nonce; mod state; use dpp::block::block_info::BlockInfo; +use dpp::block::epoch::Epoch; use dpp::state_transition::identity_update_transition::IdentityUpdateTransition; use dpp::validation::{ConsensusValidationResult, SimpleConsensusValidationResult}; use dpp::version::PlatformVersion; @@ -87,6 +88,7 @@ impl StateTransitionStateValidationV0 for IdentityUpdateTransition { _action: Option, platform: &PlatformRef, _validation_mode: ValidationMode, + _epoch: &Epoch, _execution_context: &mut StateTransitionExecutionContext, tx: TransactionArg, ) -> Result, Error> { diff --git a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/v0/mod.rs b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/v0/mod.rs index 2f5fc6e922..10e6811483 100644 --- a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/v0/mod.rs @@ -189,6 +189,7 @@ mod tests { "niceDocument", updated_document_schema, true, + &mut vec![], platform_version, ) .expect("to be able to set document schema"); diff --git a/packages/rs-drive-abci/tests/strategy_tests/main.rs b/packages/rs-drive-abci/tests/strategy_tests/main.rs index 0d66e5c0fb..d6784daedb 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/main.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/main.rs @@ -118,32 +118,6 @@ mod tests { use dpp::state_transition::StateTransition; use tenderdash_abci::Application; - #[allow(dead_code)] - #[deprecated(note = "This function is marked as unused.")] - #[allow(deprecated)] - pub fn generate_quorums_extended_info(n: u32) -> QuorumListExtendedInfo { - let mut quorums = QuorumListExtendedInfo::new(); - - for i in 0..n { - let i_bytes = [i as u8; 32]; - - let hash = QuorumHash::from_byte_array(i_bytes); - - let details = ExtendedQuorumDetails { - creation_height: i, - health_ratio: (i as f32) / (n as f32), - mined_block_hash: BlockHash::from_slice(&i_bytes).unwrap(), - num_valid_members: i, - quorum_index: Some(i), - }; - - if let Some(v) = quorums.insert(hash, details) { - panic!("duplicate record {:?}={:?}", hash, v) - } - } - quorums - } - #[test] fn run_chain_nothing_happening() { let strategy = NetworkStrategy { @@ -1833,7 +1807,7 @@ mod tests { .unwrap() .unwrap() ), - "de45b3f20c8e9492ec82b236f856d2073d122b4b73be52d03b4439d5465fc035".to_string() + "3ed0fbb75dbb645d9972f16fc6be7c0e2e3c1ed4b7a035b8a12935a871c7106e".to_string() ) } @@ -1958,7 +1932,7 @@ mod tests { .unwrap() .unwrap() ), - "0a4caafbfbde56a4a98c067126c75c577e4ebd636085e5b74521ac1baed7bccb".to_string() + "608b5592cdb3822899cd90fecb542dd90c377fc26b2e995ed083c9760955703f".to_string() ) } diff --git a/packages/rs-drive/src/drive/contract/get_fetch/fetch_contract_with_history/mod.rs b/packages/rs-drive/src/drive/contract/get_fetch/fetch_contract_with_history/mod.rs index 38d4a790fd..de2ee0df93 100644 --- a/packages/rs-drive/src/drive/contract/get_fetch/fetch_contract_with_history/mod.rs +++ b/packages/rs-drive/src/drive/contract/get_fetch/fetch_contract_with_history/mod.rs @@ -160,6 +160,7 @@ mod tests { "niceDocument", updated_document.clone(), true, + &mut vec![], platform_version, ) .expect("to be able to set document schema"); diff --git a/packages/rs-drive/src/drive/contract/mod.rs b/packages/rs-drive/src/drive/contract/mod.rs index 704e462aea..a47ebc20c8 100644 --- a/packages/rs-drive/src/drive/contract/mod.rs +++ b/packages/rs-drive/src/drive/contract/mod.rs @@ -232,7 +232,7 @@ mod tests { }); contract - .set_document_schema("note2", note2_schema, true, platform_version) + .set_document_schema("note2", note2_schema, true, &mut vec![], platform_version) .expect("should set a document schema"); drive diff --git a/packages/rs-drive/src/query/test_index.rs b/packages/rs-drive/src/query/test_index.rs index cb635cf7f1..3c31e1b8ee 100644 --- a/packages/rs-drive/src/query/test_index.rs +++ b/packages/rs-drive/src/query/test_index.rs @@ -85,6 +85,7 @@ mod tests { false, false, true, + &mut vec![], platform_version, ) .expect("expected to create a document type") diff --git a/packages/rs-drive/src/state_transition_action/contract/data_contract_create/transformer.rs b/packages/rs-drive/src/state_transition_action/contract/data_contract_create/transformer.rs index c94355e6ef..1945248784 100644 --- a/packages/rs-drive/src/state_transition_action/contract/data_contract_create/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/contract/data_contract_create/transformer.rs @@ -1,6 +1,7 @@ use crate::state_transition_action::contract::data_contract_create::v0::DataContractCreateTransitionActionV0; use crate::state_transition_action::contract::data_contract_create::DataContractCreateTransitionAction; use dpp::state_transition::data_contract_create_transition::DataContractCreateTransition; +use dpp::validation::operations::ProtocolValidationOperation; use dpp::ProtocolError; use platform_version::version::PlatformVersion; @@ -11,6 +12,7 @@ impl DataContractCreateTransitionAction { pub fn try_from_transition( value: DataContractCreateTransition, validate: bool, + validation_operations: &mut Vec, platform_version: &PlatformVersion, ) -> Result { match value { @@ -18,6 +20,7 @@ impl DataContractCreateTransitionAction { Ok(DataContractCreateTransitionActionV0::try_from_transition( v0, validate, + validation_operations, platform_version, )? .into()) @@ -32,6 +35,7 @@ impl DataContractCreateTransitionAction { pub fn try_from_borrowed_transition( value: &DataContractCreateTransition, validate: bool, + validation_operations: &mut Vec, platform_version: &PlatformVersion, ) -> Result { match value { @@ -39,6 +43,7 @@ impl DataContractCreateTransitionAction { DataContractCreateTransitionActionV0::try_from_borrowed_transition( v0, validate, + validation_operations, platform_version, )? .into(), diff --git a/packages/rs-drive/src/state_transition_action/contract/data_contract_create/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/contract/data_contract_create/v0/transformer.rs index d43fcdf434..c98a7fb903 100644 --- a/packages/rs-drive/src/state_transition_action/contract/data_contract_create/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/contract/data_contract_create/v0/transformer.rs @@ -1,6 +1,7 @@ use crate::state_transition_action::contract::data_contract_create::v0::DataContractCreateTransitionActionV0; use dpp::prelude::DataContract; use dpp::state_transition::data_contract_create_transition::DataContractCreateTransitionV0; +use dpp::validation::operations::ProtocolValidationOperation; use dpp::ProtocolError; use platform_version::version::PlatformVersion; @@ -8,12 +9,14 @@ impl DataContractCreateTransitionActionV0 { pub(in crate::state_transition_action::contract::data_contract_create) fn try_from_transition( value: DataContractCreateTransitionV0, validate: bool, + validation_operations: &mut Vec, platform_version: &PlatformVersion, ) -> Result { Ok(DataContractCreateTransitionActionV0 { data_contract: DataContract::try_from_platform_versioned( value.data_contract, validate, + validation_operations, platform_version, )?, identity_nonce: value.identity_nonce, @@ -24,12 +27,14 @@ impl DataContractCreateTransitionActionV0 { pub(in crate::state_transition_action::contract::data_contract_create) fn try_from_borrowed_transition( value: &DataContractCreateTransitionV0, validate: bool, + validation_operations: &mut Vec, platform_version: &PlatformVersion, ) -> Result { Ok(DataContractCreateTransitionActionV0 { data_contract: DataContract::try_from_platform_versioned( value.data_contract.clone(), validate, + validation_operations, platform_version, )?, identity_nonce: value.identity_nonce, diff --git a/packages/rs-drive/src/state_transition_action/contract/data_contract_update/transformer.rs b/packages/rs-drive/src/state_transition_action/contract/data_contract_update/transformer.rs index 51cac39e6d..5c4f8b4d66 100644 --- a/packages/rs-drive/src/state_transition_action/contract/data_contract_update/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/contract/data_contract_update/transformer.rs @@ -1,6 +1,7 @@ use crate::state_transition_action::contract::data_contract_update::v0::DataContractUpdateTransitionActionV0; use crate::state_transition_action::contract::data_contract_update::DataContractUpdateTransitionAction; use dpp::state_transition::data_contract_update_transition::DataContractUpdateTransition; +use dpp::validation::operations::ProtocolValidationOperation; use dpp::ProtocolError; use platform_version::version::PlatformVersion; @@ -11,6 +12,7 @@ impl DataContractUpdateTransitionAction { pub fn try_from_transition( value: DataContractUpdateTransition, validate: bool, + validation_operations: &mut Vec, platform_version: &PlatformVersion, ) -> Result { match value { @@ -18,6 +20,7 @@ impl DataContractUpdateTransitionAction { Ok(DataContractUpdateTransitionActionV0::try_from_transition( v0, validate, + validation_operations, platform_version, )? .into()) @@ -32,6 +35,7 @@ impl DataContractUpdateTransitionAction { pub fn try_from_borrowed_transition( value: &DataContractUpdateTransition, validate: bool, + validation_operations: &mut Vec, platform_version: &PlatformVersion, ) -> Result { match value { @@ -39,6 +43,7 @@ impl DataContractUpdateTransitionAction { DataContractUpdateTransitionActionV0::try_from_borrowed_transition( v0, validate, + validation_operations, platform_version, )? .into(), diff --git a/packages/rs-drive/src/state_transition_action/contract/data_contract_update/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/contract/data_contract_update/v0/transformer.rs index 7a13b3823c..4eea30bcfa 100644 --- a/packages/rs-drive/src/state_transition_action/contract/data_contract_update/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/contract/data_contract_update/v0/transformer.rs @@ -1,6 +1,7 @@ use crate::state_transition_action::contract::data_contract_update::v0::DataContractUpdateTransitionActionV0; use dpp::data_contract::DataContract; use dpp::state_transition::data_contract_update_transition::DataContractUpdateTransitionV0; +use dpp::validation::operations::ProtocolValidationOperation; use dpp::ProtocolError; use platform_version::version::PlatformVersion; @@ -8,12 +9,14 @@ impl DataContractUpdateTransitionActionV0 { pub(in crate::state_transition_action::contract::data_contract_update) fn try_from_transition( value: DataContractUpdateTransitionV0, validate: bool, + validation_operations: &mut Vec, platform_version: &PlatformVersion, ) -> Result { Ok(DataContractUpdateTransitionActionV0 { data_contract: DataContract::try_from_platform_versioned( value.data_contract, validate, + validation_operations, platform_version, )?, identity_contract_nonce: value.identity_contract_nonce, @@ -24,12 +27,14 @@ impl DataContractUpdateTransitionActionV0 { pub(in crate::state_transition_action::contract::data_contract_update) fn try_from_borrowed_transition( value: &DataContractUpdateTransitionV0, validate: bool, + validation_operations: &mut Vec, platform_version: &PlatformVersion, ) -> Result { Ok(DataContractUpdateTransitionActionV0 { data_contract: DataContract::try_from_platform_versioned( value.data_contract.clone(), validate, + validation_operations, platform_version, )?, identity_contract_nonce: value.identity_contract_nonce, diff --git a/packages/rs-platform-version/src/version/dpp_versions.rs b/packages/rs-platform-version/src/version/dpp_versions.rs index 459ef8f230..4cc28cf36c 100644 --- a/packages/rs-platform-version/src/version/dpp_versions.rs +++ b/packages/rs-platform-version/src/version/dpp_versions.rs @@ -191,6 +191,7 @@ pub struct DocumentTypeSchemaVersions { pub enrich_with_base_schema: FeatureVersion, pub find_identifier_and_binary_paths: FeatureVersion, pub validate_max_depth: FeatureVersion, + pub max_depth: u16, pub recursive_schema_validator_versions: RecursiveSchemaValidatorVersions, pub validate_schema_compatibility: FeatureVersion, } diff --git a/packages/rs-platform-version/src/version/fee/data_contract/mod.rs b/packages/rs-platform-version/src/version/fee/data_contract/mod.rs new file mode 100644 index 0000000000..4c8f3eb240 --- /dev/null +++ b/packages/rs-platform-version/src/version/fee/data_contract/mod.rs @@ -0,0 +1,12 @@ +pub mod v1; + +#[derive(Clone, Debug, Default)] +pub struct FeeDataContractValidationVersion { + pub document_type_base_fee: u64, + pub document_type_size_fee: u64, + pub document_type_per_property_fee: u64, + pub document_type_base_non_unique_index_fee: u64, + pub document_type_non_unique_index_per_property_fee: u64, + pub document_type_base_unique_index_fee: u64, + pub document_type_unique_index_per_property_fee: u64, +} diff --git a/packages/rs-platform-version/src/version/fee/data_contract/v1.rs b/packages/rs-platform-version/src/version/fee/data_contract/v1.rs new file mode 100644 index 0000000000..516da472cf --- /dev/null +++ b/packages/rs-platform-version/src/version/fee/data_contract/v1.rs @@ -0,0 +1,12 @@ +use crate::version::fee::data_contract::FeeDataContractValidationVersion; + +pub const FEE_DATA_CONTRACT_VALIDATION_VERSION1: FeeDataContractValidationVersion = + FeeDataContractValidationVersion { + document_type_base_fee: 500, + document_type_size_fee: 10, + document_type_per_property_fee: 40, + document_type_base_non_unique_index_fee: 50, + document_type_non_unique_index_per_property_fee: 30, + document_type_base_unique_index_fee: 100, + document_type_unique_index_per_property_fee: 60, + }; diff --git a/packages/rs-platform-version/src/version/fee/mod.rs b/packages/rs-platform-version/src/version/fee/mod.rs index e1b3121d7b..0810bc85c8 100644 --- a/packages/rs-platform-version/src/version/fee/mod.rs +++ b/packages/rs-platform-version/src/version/fee/mod.rs @@ -1,9 +1,11 @@ +use crate::version::fee::data_contract::FeeDataContractValidationVersion; use crate::version::fee::hashing::FeeHashingVersion; use crate::version::fee::processing::FeeProcessingVersion; use crate::version::fee::signature::FeeSignatureVersion; use crate::version::fee::state_transition_min_fees::StateTransitionMinFees; use crate::version::fee::storage::FeeStorageVersion; +mod data_contract; mod hashing; mod processing; pub mod signature; @@ -17,5 +19,6 @@ pub struct FeeVersion { pub signature: FeeSignatureVersion, pub hashing: FeeHashingVersion, pub processing: FeeProcessingVersion, + pub data_contract: FeeDataContractValidationVersion, pub state_transition_min_fees: StateTransitionMinFees, } diff --git a/packages/rs-platform-version/src/version/fee/v1.rs b/packages/rs-platform-version/src/version/fee/v1.rs index fd7062b5e8..2f394bbd05 100644 --- a/packages/rs-platform-version/src/version/fee/v1.rs +++ b/packages/rs-platform-version/src/version/fee/v1.rs @@ -1,3 +1,4 @@ +use crate::version::fee::data_contract::v1::FEE_DATA_CONTRACT_VALIDATION_VERSION1; use crate::version::fee::hashing::v1::FEE_HASHING_VERSION1; use crate::version::fee::processing::v1::FEE_PROCESSING_VERSION1; use crate::version::fee::signature::v1::FEE_SIGNATURE_VERSION1; @@ -10,5 +11,6 @@ pub const FEE_VERSION1: FeeVersion = FeeVersion { signature: FEE_SIGNATURE_VERSION1, hashing: FEE_HASHING_VERSION1, processing: FEE_PROCESSING_VERSION1, + data_contract: FEE_DATA_CONTRACT_VALIDATION_VERSION1, state_transition_min_fees: STATE_TRANSITION_MIN_FEES_VERSION1, }; diff --git a/packages/rs-platform-version/src/version/mocks/v2_test.rs b/packages/rs-platform-version/src/version/mocks/v2_test.rs index 4160215e6c..9b53f611a3 100644 --- a/packages/rs-platform-version/src/version/mocks/v2_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v2_test.rs @@ -960,6 +960,7 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { enrich_with_base_schema: 0, find_identifier_and_binary_paths: 0, validate_max_depth: 0, + max_depth: 256, recursive_schema_validator_versions: RecursiveSchemaValidatorVersions { traversal_validator: 0, byte_array_has_no_items_as_parent_validator: 0, diff --git a/packages/rs-platform-version/src/version/mocks/v3_test.rs b/packages/rs-platform-version/src/version/mocks/v3_test.rs index 2209766085..cc2c059fae 100644 --- a/packages/rs-platform-version/src/version/mocks/v3_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v3_test.rs @@ -960,6 +960,7 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { enrich_with_base_schema: 0, find_identifier_and_binary_paths: 0, validate_max_depth: 0, + max_depth: 256, recursive_schema_validator_versions: RecursiveSchemaValidatorVersions { traversal_validator: 0, byte_array_has_no_items_as_parent_validator: 0, diff --git a/packages/rs-platform-version/src/version/v1.rs b/packages/rs-platform-version/src/version/v1.rs index 2cc0a44f0c..bd7082b08e 100644 --- a/packages/rs-platform-version/src/version/v1.rs +++ b/packages/rs-platform-version/src/version/v1.rs @@ -959,6 +959,7 @@ pub const PLATFORM_V1: PlatformVersion = PlatformVersion { enrich_with_base_schema: 0, find_identifier_and_binary_paths: 0, validate_max_depth: 0, + max_depth: 256, recursive_schema_validator_versions: RecursiveSchemaValidatorVersions { traversal_validator: 0, byte_array_has_no_items_as_parent_validator: 0, diff --git a/packages/rs-sdk/tests/fetch/common.rs b/packages/rs-sdk/tests/fetch/common.rs index 77e956034c..8e943b2c33 100644 --- a/packages/rs-sdk/tests/fetch/common.rs +++ b/packages/rs-sdk/tests/fetch/common.rs @@ -30,6 +30,7 @@ pub fn mock_document_type() -> dpp::data_contract::document_type::DocumentType { false, false, true, + &mut vec![], platform_version, ) .expect("expected to create a document type") diff --git a/packages/strategy-tests/src/operations.rs b/packages/strategy-tests/src/operations.rs index 933fe417ea..854f3d8089 100644 --- a/packages/strategy-tests/src/operations.rs +++ b/packages/strategy-tests/src/operations.rs @@ -113,8 +113,12 @@ impl PlatformDeserializableWithPotentialValidationFromVersionedStructure for Doc document_type_name, action, } = document_op_in_serialization_format; - let data_contract = - DataContract::try_from_platform_versioned(contract, validate, platform_version)?; + let data_contract = DataContract::try_from_platform_versioned( + contract, + validate, + &mut vec![], + platform_version, + )?; let document_type = data_contract.document_type_cloned_for_name(document_type_name.as_str())?; Ok(DocumentOp { @@ -295,6 +299,7 @@ impl PlatformDeserializableWithPotentialValidationFromVersionedStructure for Dat let contract = DataContract::try_from_platform_versioned( deserialized.contract, validate, + &mut vec![], platform_version, )?; @@ -318,6 +323,7 @@ impl PlatformDeserializableWithPotentialValidationFromVersionedStructure for Dat true, true, validate, + &mut vec![], platform_version, ) .expect("Failed to reconstruct DocumentType from schema") diff --git a/packages/wasm-dpp/src/data_contract/data_contract.rs b/packages/wasm-dpp/src/data_contract/data_contract.rs index fc272a5c5c..ccd0eee6d2 100644 --- a/packages/wasm-dpp/src/data_contract/data_contract.rs +++ b/packages/wasm-dpp/src/data_contract/data_contract.rs @@ -206,6 +206,7 @@ impl DataContractWasm { document_schemas_map, defs, !skip_validation, + &mut vec![], platform_version, ) .with_js_error() @@ -229,7 +230,13 @@ impl DataContractWasm { let platform_version = PlatformVersion::first(); self.inner - .set_document_schema(name, schema_value, !skip_validation, platform_version) + .set_document_schema( + name, + schema_value, + !skip_validation, + &mut vec![], + platform_version, + ) .with_js_error() } @@ -289,7 +296,12 @@ impl DataContractWasm { .transpose()?; self.inner - .set_schema_defs(maybe_schema_defs, !skip_validation, platform_version) + .set_schema_defs( + maybe_schema_defs, + !skip_validation, + &mut vec![], + platform_version, + ) .with_js_error()?; Ok(()) @@ -427,7 +439,7 @@ impl DataContractWasm { ) -> Result { let platform_version = PlatformVersion::first(); - DataContract::try_from_platform_versioned(value, validate, platform_version) + DataContract::try_from_platform_versioned(value, validate, &mut vec![], platform_version) .with_js_error() .map(Into::into) } diff --git a/packages/wasm-dpp/src/errors/consensus/basic/data_contract/data_contract_max_depth_exceed_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/data_contract_max_depth_exceed_error.rs index 52c0a6addf..97cb522ed1 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/data_contract/data_contract_max_depth_exceed_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/data_contract_max_depth_exceed_error.rs @@ -22,11 +22,6 @@ impl DataContractMaxDepthExceedErrorWasm { self.inner.max_depth() } - #[wasm_bindgen(js_name=getSchemaDepth)] - pub fn get_schema_depth(&self) -> usize { - self.inner.schema_depth() - } - #[wasm_bindgen(js_name=getCode)] pub fn get_code(&self) -> u32 { ConsensusError::from(self.inner.clone()).code() From a12abe641322e503b1cce4195b34783750a77938 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Thu, 4 Apr 2024 21:45:29 +0700 Subject: [PATCH 122/191] feat(drive)!: provide protocol version in epoch info query (#1778) --- .../platform/v0/nodejs/platform_pbjs.js | 22 ++++++ .../platform/v0/nodejs/platform_protoc.js | 32 +++++++- .../platform/v0/objective-c/Platform.pbobjc.h | 3 + .../platform/v0/objective-c/Platform.pbobjc.m | 11 +++ .../platform/v0/python/platform_pb2.py | 19 +++-- .../clients/platform/v0/web/platform_pb.d.ts | 4 + .../clients/platform/v0/web/platform_pb.js | 32 +++++++- .../protos/platform/v0/platform.proto | 1 + .../proto/org.dash.platform.dapi.v0.rs | 2 + .../src/block/extended_epoch_info/mod.rs | 7 ++ .../src/block/extended_epoch_info/v0/mod.rs | 6 ++ .../initialization/init_chain/v0/mod.rs | 6 -- .../engine/run_block_proposal/v0/mod.rs | 3 +- .../mod.rs | 7 +- .../v0/mod.rs | 39 +++++++++- .../process_block_fees/mod.rs | 7 +- .../process_block_fees/v0/mod.rs | 36 ++++++--- .../create_genesis_state/v0/mod.rs | 4 +- .../upgrade_protocol_version/v0/mod.rs | 8 -- .../storage/store_platform_state/v0/mod.rs | 8 +- .../src/query/system/epoch_infos/v0/mod.rs | 1 + .../tests/strategy_tests/main.rs | 8 +- .../strategy_tests/upgrade_fork_tests.rs | 33 ++++++++ .../epochs/get_epochs_infos/v0/mod.rs | 28 ++++++- .../epochs/prove_epochs_infos/v0/mod.rs | 7 +- .../src/drive/initialization/v0/mod.rs | 6 +- .../mod.rs | 41 ---------- .../v0/mod.rs | 56 -------------- .../src/drive/protocol_upgrade/mod.rs | 3 - .../src/drive/system/misc_tree_constants.rs | 5 -- packages/rs-drive/src/drive/system/mod.rs | 2 - .../fetch_current_protocol_version.rs | 22 ++---- .../fetch_next_protocol_version/mod.rs | 44 ----------- .../fetch_next_protocol_version/v0/mod.rs | 42 ---------- .../src/drive/system/protocol_version/mod.rs | 5 +- .../mod.rs | 55 ------------- .../v0/mod.rs | 36 --------- .../store_current_protocol_version.rs | 72 +++--------------- .../system/verify_epoch_infos/v0/mod.rs | 29 ++++++- .../fee_pools/epochs/epoch_key_constants.rs | 2 + .../fee_pools/epochs/operations_factory.rs | 14 +++- packages/rs-drive/src/fee_pools/mod.rs | 7 ++ .../src/version/drive_versions.rs | 8 -- .../src/version/mocks/v2_test.rs | 13 +--- .../src/version/mocks/v3_test.rs | 13 +--- .../rs-platform-version/src/version/v1.rs | 13 +--- ...776113debe4287515ae60d0645da450a80a1.json} | Bin 21965 -> 21988 bytes ...caf3663c40a12d3b03827006d66058e439ac.json} | Bin 1466417 -> 1466607 bytes ...bc8321622c21e4a2874ab7e481c6267201326.json | 1 + ...db039bd8eba37530edf9202046cf912eb8efd.json | 1 - ...776113debe4287515ae60d0645da450a80a1.json} | Bin 21965 -> 21988 bytes ...7089535588985622579e77969e0ffd68afc7.json} | Bin 21003 -> 21192 bytes ...bc8321622c21e4a2874ab7e481c6267201326.json | 1 + ...db039bd8eba37530edf9202046cf912eb8efd.json | 1 - ...776113debe4287515ae60d0645da450a80a1.json} | Bin 21965 -> 21988 bytes ...dd01a7428085ffdcf1e11cccf19c48c5f7a1.json} | Bin 2668627 -> 2668623 bytes ...bc8321622c21e4a2874ab7e481c6267201326.json | 1 + ...db039bd8eba37530edf9202046cf912eb8efd.json | 1 - 58 files changed, 369 insertions(+), 459 deletions(-) delete mode 100644 packages/rs-drive/src/drive/protocol_upgrade/change_to_new_version_and_clear_version_information/mod.rs delete mode 100644 packages/rs-drive/src/drive/protocol_upgrade/change_to_new_version_and_clear_version_information/v0/mod.rs delete mode 100644 packages/rs-drive/src/drive/system/misc_tree_constants.rs delete mode 100644 packages/rs-drive/src/drive/system/protocol_version/fetch_next_protocol_version/mod.rs delete mode 100644 packages/rs-drive/src/drive/system/protocol_version/fetch_next_protocol_version/v0/mod.rs delete mode 100644 packages/rs-drive/src/drive/system/protocol_version/set_next_protocol_version_operations/mod.rs delete mode 100644 packages/rs-drive/src/drive/system/protocol_version/set_next_protocol_version_operations/v0/mod.rs rename packages/rs-sdk/tests/vectors/test_epoch_fetch/{msg_2024-03-18T17:30:02.266794754Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json => msg_2024-04-04T11:53:53.893159000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json} (78%) rename packages/rs-sdk/tests/vectors/test_epoch_fetch/{msg_2024-03-18T17:30:02.329977013Z_GetEpochsInfoRequest_b2b426ac4a52cb4cb08904c63386caf3663c40a12d3b03827006d66058e439ac.json => msg_2024-04-04T11:53:53.980843000Z_GetEpochsInfoRequest_b2b426ac4a52cb4cb08904c63386caf3663c40a12d3b03827006d66058e439ac.json} (99%) create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-2ca9a9abc345b3e592538a9ceb7bc8321622c21e4a2874ab7e481c6267201326.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json rename packages/rs-sdk/tests/vectors/test_epoch_fetch_current/{msg_2024-03-18T17:30:02.275436110Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json => msg_2024-04-04T11:53:53.893143000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json} (78%) rename packages/rs-sdk/tests/vectors/test_epoch_fetch_current/{msg_2024-03-18T17:30:02.282004524Z_GetEpochsInfoRequest_1b87e649557ccb609adb9e2904c67089535588985622579e77969e0ffd68afc7.json => msg_2024-04-04T11:53:53.901498000Z_GetEpochsInfoRequest_1b87e649557ccb609adb9e2904c67089535588985622579e77969e0ffd68afc7.json} (85%) create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-2ca9a9abc345b3e592538a9ceb7bc8321622c21e4a2874ab7e481c6267201326.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json rename packages/rs-sdk/tests/vectors/test_epoch_fetch_future/{msg_2024-03-18T17:30:02.315343769Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json => msg_2024-04-04T11:53:53.893142000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json} (78%) rename packages/rs-sdk/tests/vectors/test_epoch_fetch_future/{msg_2024-03-18T17:30:02.797274401Z_GetEpochsInfoRequest_6a828350e795a088dbc835260a1add01a7428085ffdcf1e11cccf19c48c5f7a1.json => msg_2024-04-04T11:53:54.194677000Z_GetEpochsInfoRequest_6a828350e795a088dbc835260a1add01a7428085ffdcf1e11cccf19c48c5f7a1.json} (99%) create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-2ca9a9abc345b3e592538a9ceb7bc8321622c21e4a2874ab7e481c6267201326.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json diff --git a/packages/dapi-grpc/clients/platform/v0/nodejs/platform_pbjs.js b/packages/dapi-grpc/clients/platform/v0/nodejs/platform_pbjs.js index ade9877c11..f14e6503e2 100644 --- a/packages/dapi-grpc/clients/platform/v0/nodejs/platform_pbjs.js +++ b/packages/dapi-grpc/clients/platform/v0/nodejs/platform_pbjs.js @@ -25767,6 +25767,7 @@ $root.org = (function() { * @property {number|null} [firstCoreBlockHeight] EpochInfo firstCoreBlockHeight * @property {number|Long|null} [startTime] EpochInfo startTime * @property {number|null} [feeMultiplier] EpochInfo feeMultiplier + * @property {number|null} [protocolVersion] EpochInfo protocolVersion */ /** @@ -25824,6 +25825,14 @@ $root.org = (function() { */ EpochInfo.prototype.feeMultiplier = 0; + /** + * EpochInfo protocolVersion. + * @member {number} protocolVersion + * @memberof org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo + * @instance + */ + EpochInfo.prototype.protocolVersion = 0; + /** * Creates a new EpochInfo instance using the specified properties. * @function create @@ -25858,6 +25867,8 @@ $root.org = (function() { writer.uint32(/* id 4, wireType 0 =*/32).uint64(message.startTime); if (message.feeMultiplier != null && Object.hasOwnProperty.call(message, "feeMultiplier")) writer.uint32(/* id 5, wireType 1 =*/41).double(message.feeMultiplier); + if (message.protocolVersion != null && Object.hasOwnProperty.call(message, "protocolVersion")) + writer.uint32(/* id 6, wireType 0 =*/48).uint32(message.protocolVersion); return writer; }; @@ -25907,6 +25918,9 @@ $root.org = (function() { case 5: message.feeMultiplier = reader.double(); break; + case 6: + message.protocolVersion = reader.uint32(); + break; default: reader.skipType(tag & 7); break; @@ -25957,6 +25971,9 @@ $root.org = (function() { if (message.feeMultiplier != null && message.hasOwnProperty("feeMultiplier")) if (typeof message.feeMultiplier !== "number") return "feeMultiplier: number expected"; + if (message.protocolVersion != null && message.hasOwnProperty("protocolVersion")) + if (!$util.isInteger(message.protocolVersion)) + return "protocolVersion: integer expected"; return null; }; @@ -25996,6 +26013,8 @@ $root.org = (function() { message.startTime = new $util.LongBits(object.startTime.low >>> 0, object.startTime.high >>> 0).toNumber(true); if (object.feeMultiplier != null) message.feeMultiplier = Number(object.feeMultiplier); + if (object.protocolVersion != null) + message.protocolVersion = object.protocolVersion >>> 0; return message; }; @@ -26026,6 +26045,7 @@ $root.org = (function() { } else object.startTime = options.longs === String ? "0" : 0; object.feeMultiplier = 0; + object.protocolVersion = 0; } if (message.number != null && message.hasOwnProperty("number")) object.number = message.number; @@ -26043,6 +26063,8 @@ $root.org = (function() { object.startTime = options.longs === String ? $util.Long.prototype.toString.call(message.startTime) : options.longs === Number ? new $util.LongBits(message.startTime.low >>> 0, message.startTime.high >>> 0).toNumber(true) : message.startTime; if (message.feeMultiplier != null && message.hasOwnProperty("feeMultiplier")) object.feeMultiplier = options.json && !isFinite(message.feeMultiplier) ? String(message.feeMultiplier) : message.feeMultiplier; + if (message.protocolVersion != null && message.hasOwnProperty("protocolVersion")) + object.protocolVersion = message.protocolVersion; return object; }; diff --git a/packages/dapi-grpc/clients/platform/v0/nodejs/platform_protoc.js b/packages/dapi-grpc/clients/platform/v0/nodejs/platform_protoc.js index 13ebdab355..e7495b46c1 100644 --- a/packages/dapi-grpc/clients/platform/v0/nodejs/platform_protoc.js +++ b/packages/dapi-grpc/clients/platform/v0/nodejs/platform_protoc.js @@ -24494,7 +24494,8 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.Ep firstBlockHeight: jspb.Message.getFieldWithDefault(msg, 2, 0), firstCoreBlockHeight: jspb.Message.getFieldWithDefault(msg, 3, 0), startTime: jspb.Message.getFieldWithDefault(msg, 4, 0), - feeMultiplier: jspb.Message.getFloatingPointFieldWithDefault(msg, 5, 0.0) + feeMultiplier: jspb.Message.getFloatingPointFieldWithDefault(msg, 5, 0.0), + protocolVersion: jspb.Message.getFieldWithDefault(msg, 6, 0) }; if (includeInstance) { @@ -24551,6 +24552,10 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.Ep var value = /** @type {number} */ (reader.readDouble()); msg.setFeeMultiplier(value); break; + case 6: + var value = /** @type {number} */ (reader.readUint32()); + msg.setProtocolVersion(value); + break; default: reader.skipField(); break; @@ -24615,6 +24620,13 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.Ep f ); } + f = message.getProtocolVersion(); + if (f !== 0) { + writer.writeUint32( + 6, + f + ); + } }; @@ -24708,6 +24720,24 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.Ep }; +/** + * optional uint32 protocol_version = 6; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.getProtocolVersion = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 6, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo} returns this + */ +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.setProtocolVersion = function(value) { + return jspb.Message.setProto3IntField(this, 6, value); +}; + + /** * optional EpochInfos epochs = 1; * @return {?proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos} diff --git a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.h b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.h index ad06a695c5..b4c0745c8b 100644 --- a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.h +++ b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.h @@ -2575,6 +2575,7 @@ typedef GPB_ENUM(GetEpochsInfoResponse_GetEpochsInfoResponseV0_EpochInfo_FieldNu GetEpochsInfoResponse_GetEpochsInfoResponseV0_EpochInfo_FieldNumber_FirstCoreBlockHeight = 3, GetEpochsInfoResponse_GetEpochsInfoResponseV0_EpochInfo_FieldNumber_StartTime = 4, GetEpochsInfoResponse_GetEpochsInfoResponseV0_EpochInfo_FieldNumber_FeeMultiplier = 5, + GetEpochsInfoResponse_GetEpochsInfoResponseV0_EpochInfo_FieldNumber_ProtocolVersion = 6, }; GPB_FINAL @interface GetEpochsInfoResponse_GetEpochsInfoResponseV0_EpochInfo : GPBMessage @@ -2589,6 +2590,8 @@ GPB_FINAL @interface GetEpochsInfoResponse_GetEpochsInfoResponseV0_EpochInfo : G @property(nonatomic, readwrite) double feeMultiplier; +@property(nonatomic, readwrite) uint32_t protocolVersion; + @end NS_ASSUME_NONNULL_END diff --git a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.m b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.m index efdb83c359..35feedfec3 100644 --- a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.m +++ b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.m @@ -6926,11 +6926,13 @@ @implementation GetEpochsInfoResponse_GetEpochsInfoResponseV0_EpochInfo @dynamic firstCoreBlockHeight; @dynamic startTime; @dynamic feeMultiplier; +@dynamic protocolVersion; typedef struct GetEpochsInfoResponse_GetEpochsInfoResponseV0_EpochInfo__storage_ { uint32_t _has_storage_[1]; uint32_t number; uint32_t firstCoreBlockHeight; + uint32_t protocolVersion; uint64_t firstBlockHeight; uint64_t startTime; double feeMultiplier; @@ -6987,6 +6989,15 @@ + (GPBDescriptor *)descriptor { .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), .dataType = GPBDataTypeDouble, }, + { + .name = "protocolVersion", + .dataTypeSpecific.clazz = Nil, + .number = GetEpochsInfoResponse_GetEpochsInfoResponseV0_EpochInfo_FieldNumber_ProtocolVersion, + .hasIndex = 5, + .offset = (uint32_t)offsetof(GetEpochsInfoResponse_GetEpochsInfoResponseV0_EpochInfo__storage_, protocolVersion), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeUInt32, + }, }; GPBDescriptor *localDescriptor = [GPBDescriptor allocDescriptorForClass:[GetEpochsInfoResponse_GetEpochsInfoResponseV0_EpochInfo class] diff --git a/packages/dapi-grpc/clients/platform/v0/python/platform_pb2.py b/packages/dapi-grpc/clients/platform/v0/python/platform_pb2.py index 01c84f252e..8348a045e7 100644 --- a/packages/dapi-grpc/clients/platform/v0/python/platform_pb2.py +++ b/packages/dapi-grpc/clients/platform/v0/python/platform_pb2.py @@ -22,7 +22,7 @@ syntax='proto3', serialized_options=None, create_key=_descriptor._internal_create_key, - serialized_pb=b'\n\x0eplatform.proto\x12\x19org.dash.platform.dapi.v0\x1a\x1egoogle/protobuf/wrappers.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"\x81\x01\n\x05Proof\x12\x15\n\rgrovedb_proof\x18\x01 \x01(\x0c\x12\x13\n\x0bquorum_hash\x18\x02 \x01(\x0c\x12\x11\n\tsignature\x18\x03 \x01(\x0c\x12\r\n\x05round\x18\x04 \x01(\r\x12\x15\n\rblock_id_hash\x18\x05 \x01(\x0c\x12\x13\n\x0bquorum_type\x18\x06 \x01(\r\"\x90\x01\n\x10ResponseMetadata\x12\x0e\n\x06height\x18\x01 \x01(\x04\x12 \n\x18\x63ore_chain_locked_height\x18\x02 \x01(\r\x12\r\n\x05\x65poch\x18\x03 \x01(\r\x12\x0f\n\x07time_ms\x18\x04 \x01(\x04\x12\x18\n\x10protocol_version\x18\x05 \x01(\r\x12\x10\n\x08\x63hain_id\x18\x06 \x01(\t\"L\n\x1dStateTransitionBroadcastError\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\x0f\n\x07message\x18\x02 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x03 \x01(\x0c\";\n\x1f\x42roadcastStateTransitionRequest\x12\x18\n\x10state_transition\x18\x01 \x01(\x0c\"\"\n BroadcastStateTransitionResponse\"\xa4\x01\n\x12GetIdentityRequest\x12P\n\x02v0\x18\x01 \x01(\x0b\x32\x42.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0H\x00\x1a\x31\n\x14GetIdentityRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xc1\x01\n\x17GetIdentityNonceRequest\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0H\x00\x1a?\n\x19GetIdentityNonceRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xf6\x01\n\x1fGetIdentityContractNonceRequest\x12j\n\x02v0\x18\x01 \x01(\x0b\x32\\.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0H\x00\x1a\\\n!GetIdentityContractNonceRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12\x13\n\x0b\x63ontract_id\x18\x02 \x01(\x0c\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\xc0\x01\n\x19GetIdentityBalanceRequest\x12^\n\x02v0\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0H\x00\x1a\x38\n\x1bGetIdentityBalanceRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xec\x01\n$GetIdentityBalanceAndRevisionRequest\x12t\n\x02v0\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0H\x00\x1a\x43\n&GetIdentityBalanceAndRevisionRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x9e\x02\n\x13GetIdentityResponse\x12R\n\x02v0\x18\x01 \x01(\x0b\x32\x44.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0H\x00\x1a\xa7\x01\n\x15GetIdentityResponseV0\x12\x12\n\x08identity\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xad\x01\n\x14GetIdentitiesRequest\x12T\n\x02v0\x18\x01 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0H\x00\x1a\x34\n\x16GetIdentitiesRequestV0\x12\x0b\n\x03ids\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xda\x04\n\x15GetIdentitiesResponse\x12V\n\x02v0\x18\x01 \x01(\x0b\x32H.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0H\x00\x1a\x1e\n\rIdentityValue\x12\r\n\x05value\x18\x01 \x01(\x0c\x1ak\n\rIdentityEntry\x12\x0b\n\x03key\x18\x01 \x01(\x0c\x12M\n\x05value\x18\x02 \x01(\x0b\x32>.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue\x1a\x66\n\nIdentities\x12X\n\x10identity_entries\x18\x01 \x03(\x0b\x32>.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry\x1a\xe8\x01\n\x17GetIdentitiesResponseV0\x12Q\n\nidentities\x18\x01 \x01(\x0b\x32;.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentitiesH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb8\x02\n\x18GetIdentityNonceResponse\x12\\\n\x02v0\x18\x01 \x01(\x0b\x32N.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0H\x00\x1a\xb2\x01\n\x1aGetIdentityNonceResponseV0\x12\x18\n\x0eidentity_nonce\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xe1\x02\n GetIdentityContractNonceResponse\x12l\n\x02v0\x18\x01 \x01(\x0b\x32^.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0H\x00\x1a\xc3\x01\n\"GetIdentityContractNonceResponseV0\x12!\n\x17identity_contract_nonce\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb9\x02\n\x1aGetIdentityBalanceResponse\x12`\n\x02v0\x18\x01 \x01(\x0b\x32R.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0H\x00\x1a\xad\x01\n\x1cGetIdentityBalanceResponseV0\x12\x11\n\x07\x62\x61lance\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xa9\x04\n%GetIdentityBalanceAndRevisionResponse\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0H\x00\x1a\xfc\x02\n\'GetIdentityBalanceAndRevisionResponseV0\x12\x9b\x01\n\x14\x62\x61lance_and_revision\x18\x01 \x01(\x0b\x32{.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevisionH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x37\n\x12\x42\x61lanceAndRevision\x12\x0f\n\x07\x62\x61lance\x18\x01 \x01(\x04\x12\x10\n\x08revision\x18\x02 \x01(\x04\x42\x08\n\x06resultB\t\n\x07version\"\xd1\x01\n\x0eKeyRequestType\x12\x36\n\x08\x61ll_keys\x18\x01 \x01(\x0b\x32\".org.dash.platform.dapi.v0.AllKeysH\x00\x12@\n\rspecific_keys\x18\x02 \x01(\x0b\x32\'.org.dash.platform.dapi.v0.SpecificKeysH\x00\x12:\n\nsearch_key\x18\x03 \x01(\x0b\x32$.org.dash.platform.dapi.v0.SearchKeyH\x00\x42\t\n\x07request\"\t\n\x07\x41llKeys\"\x1f\n\x0cSpecificKeys\x12\x0f\n\x07key_ids\x18\x01 \x03(\r\"\xb6\x01\n\tSearchKey\x12I\n\x0bpurpose_map\x18\x01 \x03(\x0b\x32\x34.org.dash.platform.dapi.v0.SearchKey.PurposeMapEntry\x1a^\n\x0fPurposeMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12:\n\x05value\x18\x02 \x01(\x0b\x32+.org.dash.platform.dapi.v0.SecurityLevelMap:\x02\x38\x01\"\xbf\x02\n\x10SecurityLevelMap\x12]\n\x12security_level_map\x18\x01 \x03(\x0b\x32\x41.org.dash.platform.dapi.v0.SecurityLevelMap.SecurityLevelMapEntry\x1aw\n\x15SecurityLevelMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12M\n\x05value\x18\x02 \x01(\x0e\x32>.org.dash.platform.dapi.v0.SecurityLevelMap.KeyKindRequestType:\x02\x38\x01\"S\n\x12KeyKindRequestType\x12\x1f\n\x1b\x43URRENT_KEY_OF_KIND_REQUEST\x10\x00\x12\x1c\n\x18\x41LL_KEYS_OF_KIND_REQUEST\x10\x01\"\xda\x02\n\x16GetIdentityKeysRequest\x12X\n\x02v0\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0H\x00\x1a\xda\x01\n\x18GetIdentityKeysRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12?\n\x0crequest_type\x18\x02 \x01(\x0b\x32).org.dash.platform.dapi.v0.KeyRequestType\x12+\n\x05limit\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12,\n\x06offset\x18\x04 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\t\n\x07version\"\x99\x03\n\x17GetIdentityKeysResponse\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0H\x00\x1a\x96\x02\n\x19GetIdentityKeysResponseV0\x12\x61\n\x04keys\x18\x01 \x01(\x0b\x32Q.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.KeysH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x1a\n\x04Keys\x12\x12\n\nkeys_bytes\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version\"\xa1\x06\n\x10GetProofsRequest\x12L\n\x02v0\x18\x01 \x01(\x0b\x32>.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0H\x00\x1a\xb3\x05\n\x12GetProofsRequestV0\x12\x62\n\nidentities\x18\x01 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest\x12\x61\n\tcontracts\x18\x02 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest\x12\x61\n\tdocuments\x18\x03 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest\x1aw\n\x0f\x44ocumentRequest\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x15\n\rdocument_type\x18\x02 \x01(\t\x12#\n\x1b\x64ocument_type_keeps_history\x18\x03 \x01(\x08\x12\x13\n\x0b\x64ocument_id\x18\x04 \x01(\x0c\x1a\xd1\x01\n\x0fIdentityRequest\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12i\n\x0crequest_type\x18\x02 \x01(\x0e\x32S.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type\">\n\x04Type\x12\x11\n\rFULL_IDENTITY\x10\x00\x12\x0b\n\x07\x42\x41LANCE\x10\x01\x12\x08\n\x04KEYS\x10\x02\x12\x0c\n\x08REVISION\x10\x03\x1a&\n\x0f\x43ontractRequest\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x42\t\n\x07version\"\x82\x02\n\x11GetProofsResponse\x12N\n\x02v0\x18\x01 \x01(\x0b\x32@.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0H\x00\x1a\x91\x01\n\x13GetProofsResponseV0\x12\x31\n\x05proof\x18\x01 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x02 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb4\x01\n\x16GetDataContractRequest\x12X\n\x02v0\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0H\x00\x1a\x35\n\x18GetDataContractRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xb3\x02\n\x17GetDataContractResponse\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0H\x00\x1a\xb0\x01\n\x19GetDataContractResponseV0\x12\x17\n\rdata_contract\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb9\x01\n\x17GetDataContractsRequest\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0H\x00\x1a\x37\n\x19GetDataContractsRequestV0\x12\x0b\n\x03ids\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xcf\x04\n\x18GetDataContractsResponse\x12\\\n\x02v0\x18\x01 \x01(\x0b\x32N.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0H\x00\x1a[\n\x11\x44\x61taContractEntry\x12\x12\n\nidentifier\x18\x01 \x01(\x0c\x12\x32\n\rdata_contract\x18\x02 \x01(\x0b\x32\x1b.google.protobuf.BytesValue\x1au\n\rDataContracts\x12\x64\n\x15\x64\x61ta_contract_entries\x18\x01 \x03(\x0b\x32\x45.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry\x1a\xf5\x01\n\x1aGetDataContractsResponseV0\x12[\n\x0e\x64\x61ta_contracts\x18\x01 \x01(\x0b\x32\x41.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xc1\x02\n\x1dGetDataContractHistoryRequest\x12\x66\n\x02v0\x18\x01 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0H\x00\x1a\xac\x01\n\x1fGetDataContractHistoryRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12+\n\x05limit\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12,\n\x06offset\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\x13\n\x0bstart_at_ms\x18\x04 \x01(\x04\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\t\n\x07version\"\xae\x05\n\x1eGetDataContractHistoryResponse\x12h\n\x02v0\x18\x01 \x01(\x0b\x32Z.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0H\x00\x1a\x96\x04\n GetDataContractHistoryResponseV0\x12\x8f\x01\n\x15\x64\x61ta_contract_history\x18\x01 \x01(\x0b\x32n.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x37\n\x18\x44\x61taContractHistoryEntry\x12\x0c\n\x04\x64\x61te\x18\x01 \x01(\x04\x12\r\n\x05value\x18\x02 \x01(\x0c\x1a\xaa\x01\n\x13\x44\x61taContractHistory\x12\x92\x01\n\x15\x64\x61ta_contract_entries\x18\x01 \x03(\x0b\x32s.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntryB\x08\n\x06resultB\t\n\x07version\"\xb2\x02\n\x13GetDocumentsRequest\x12R\n\x02v0\x18\x01 \x01(\x0b\x32\x44.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0H\x00\x1a\xbb\x01\n\x15GetDocumentsRequestV0\x12\x18\n\x10\x64\x61ta_contract_id\x18\x01 \x01(\x0c\x12\x15\n\rdocument_type\x18\x02 \x01(\t\x12\r\n\x05where\x18\x03 \x01(\x0c\x12\x10\n\x08order_by\x18\x04 \x01(\x0c\x12\r\n\x05limit\x18\x05 \x01(\r\x12\x15\n\x0bstart_after\x18\x06 \x01(\x0cH\x00\x12\x12\n\x08start_at\x18\x07 \x01(\x0cH\x00\x12\r\n\x05prove\x18\x08 \x01(\x08\x42\x07\n\x05startB\t\n\x07version\"\x95\x03\n\x14GetDocumentsResponse\x12T\n\x02v0\x18\x01 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0H\x00\x1a\x9b\x02\n\x16GetDocumentsResponseV0\x12\x65\n\tdocuments\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.DocumentsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x1e\n\tDocuments\x12\x11\n\tdocuments\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version\"\xff\x01\n%GetIdentitiesByPublicKeyHashesRequest\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0H\x00\x1aS\n\'GetIdentitiesByPublicKeyHashesRequestV0\x12\x19\n\x11public_key_hashes\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xc6\x05\n&GetIdentitiesByPublicKeyHashesResponse\x12x\n\x02v0\x18\x01 \x01(\x0b\x32j.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0H\x00\x1a\x61\n\x1aPublicKeyHashIdentityEntry\x12\x17\n\x0fpublic_key_hash\x18\x01 \x01(\x0c\x12*\n\x05value\x18\x02 \x01(\x0b\x32\x1b.google.protobuf.BytesValue\x1a\x95\x01\n\x1bIdentitiesByPublicKeyHashes\x12v\n\x10identity_entries\x18\x01 \x03(\x0b\x32\\.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry\x1a\x9b\x02\n(GetIdentitiesByPublicKeyHashesResponseV0\x12s\n\nidentities\x18\x01 \x01(\x0b\x32].org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashesH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xed\x01\n!GetIdentityByPublicKeyHashRequest\x12n\n\x02v0\x18\x01 \x01(\x0b\x32`.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0H\x00\x1aM\n#GetIdentityByPublicKeyHashRequestV0\x12\x17\n\x0fpublic_key_hash\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xda\x02\n\"GetIdentityByPublicKeyHashResponse\x12p\n\x02v0\x18\x01 \x01(\x0b\x32\x62.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0H\x00\x1a\xb6\x01\n$GetIdentityByPublicKeyHashResponseV0\x12\x12\n\x08identity\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xfb\x01\n#WaitForStateTransitionResultRequest\x12r\n\x02v0\x18\x01 \x01(\x0b\x32\x64.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0H\x00\x1aU\n%WaitForStateTransitionResultRequestV0\x12\x1d\n\x15state_transition_hash\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x99\x03\n$WaitForStateTransitionResultResponse\x12t\n\x02v0\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0H\x00\x1a\xef\x01\n&WaitForStateTransitionResultResponseV0\x12I\n\x05\x65rror\x18\x01 \x01(\x0b\x32\x38.org.dash.platform.dapi.v0.StateTransitionBroadcastErrorH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xc4\x01\n\x19GetConsensusParamsRequest\x12^\n\x02v0\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0H\x00\x1a<\n\x1bGetConsensusParamsRequestV0\x12\x0e\n\x06height\x18\x01 \x01(\x05\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x9c\x04\n\x1aGetConsensusParamsResponse\x12`\n\x02v0\x18\x01 \x01(\x0b\x32R.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0H\x00\x1aP\n\x14\x43onsensusParamsBlock\x12\x11\n\tmax_bytes\x18\x01 \x01(\t\x12\x0f\n\x07max_gas\x18\x02 \x01(\t\x12\x14\n\x0ctime_iota_ms\x18\x03 \x01(\t\x1a\x62\n\x17\x43onsensusParamsEvidence\x12\x1a\n\x12max_age_num_blocks\x18\x01 \x01(\t\x12\x18\n\x10max_age_duration\x18\x02 \x01(\t\x12\x11\n\tmax_bytes\x18\x03 \x01(\t\x1a\xda\x01\n\x1cGetConsensusParamsResponseV0\x12Y\n\x05\x62lock\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock\x12_\n\x08\x65vidence\x18\x02 \x01(\x0b\x32M.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidenceB\t\n\x07version\"\xe4\x01\n%GetProtocolVersionUpgradeStateRequest\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0H\x00\x1a\x38\n\'GetProtocolVersionUpgradeStateRequestV0\x12\r\n\x05prove\x18\x01 \x01(\x08\x42\t\n\x07version\"\xb5\x05\n&GetProtocolVersionUpgradeStateResponse\x12x\n\x02v0\x18\x01 \x01(\x0b\x32j.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0H\x00\x1a\x85\x04\n(GetProtocolVersionUpgradeStateResponseV0\x12\x87\x01\n\x08versions\x18\x01 \x01(\x0b\x32s.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x96\x01\n\x08Versions\x12\x89\x01\n\x08versions\x18\x01 \x03(\x0b\x32w.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry\x1a:\n\x0cVersionEntry\x12\x16\n\x0eversion_number\x18\x01 \x01(\r\x12\x12\n\nvote_count\x18\x02 \x01(\rB\x08\n\x06resultB\t\n\x07version\"\xa3\x02\n*GetProtocolVersionUpgradeVoteStatusRequest\x12\x80\x01\n\x02v0\x18\x01 \x01(\x0b\x32r.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0H\x00\x1ag\n,GetProtocolVersionUpgradeVoteStatusRequestV0\x12\x19\n\x11start_pro_tx_hash\x18\x01 \x01(\x0c\x12\r\n\x05\x63ount\x18\x02 \x01(\r\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\xef\x05\n+GetProtocolVersionUpgradeVoteStatusResponse\x12\x82\x01\n\x02v0\x18\x01 \x01(\x0b\x32t.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0H\x00\x1a\xaf\x04\n-GetProtocolVersionUpgradeVoteStatusResponseV0\x12\x98\x01\n\x08versions\x18\x01 \x01(\x0b\x32\x83\x01.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignalsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\xaf\x01\n\x0eVersionSignals\x12\x9c\x01\n\x0fversion_signals\x18\x01 \x03(\x0b\x32\x82\x01.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal\x1a\x35\n\rVersionSignal\x12\x13\n\x0bpro_tx_hash\x18\x01 \x01(\x0c\x12\x0f\n\x07version\x18\x02 \x01(\rB\x08\n\x06resultB\t\n\x07version\"\xf5\x01\n\x14GetEpochsInfoRequest\x12T\n\x02v0\x18\x01 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0H\x00\x1a|\n\x16GetEpochsInfoRequestV0\x12\x31\n\x0bstart_epoch\x18\x01 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\r\n\x05\x63ount\x18\x02 \x01(\r\x12\x11\n\tascending\x18\x03 \x01(\x08\x12\r\n\x05prove\x18\x04 \x01(\x08\x42\t\n\x07version\"\xf7\x04\n\x15GetEpochsInfoResponse\x12V\n\x02v0\x18\x01 \x01(\x0b\x32H.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0H\x00\x1a\xfa\x03\n\x17GetEpochsInfoResponseV0\x12\x65\n\x06\x65pochs\x18\x01 \x01(\x0b\x32S.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfosH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1au\n\nEpochInfos\x12g\n\x0b\x65poch_infos\x18\x01 \x03(\x0b\x32R.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo\x1a\x84\x01\n\tEpochInfo\x12\x0e\n\x06number\x18\x01 \x01(\r\x12\x1a\n\x12\x66irst_block_height\x18\x02 \x01(\x04\x12\x1f\n\x17\x66irst_core_block_height\x18\x03 \x01(\r\x12\x12\n\nstart_time\x18\x04 \x01(\x04\x12\x16\n\x0e\x66\x65\x65_multiplier\x18\x05 \x01(\x01\x42\x08\n\x06resultB\t\n\x07version2\xd5\x15\n\x08Platform\x12\x93\x01\n\x18\x62roadcastStateTransition\x12:.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest\x1a;.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse\x12l\n\x0bgetIdentity\x12-.org.dash.platform.dapi.v0.GetIdentityRequest\x1a..org.dash.platform.dapi.v0.GetIdentityResponse\x12r\n\rgetIdentities\x12/.org.dash.platform.dapi.v0.GetIdentitiesRequest\x1a\x30.org.dash.platform.dapi.v0.GetIdentitiesResponse\x12x\n\x0fgetIdentityKeys\x12\x31.org.dash.platform.dapi.v0.GetIdentityKeysRequest\x1a\x32.org.dash.platform.dapi.v0.GetIdentityKeysResponse\x12{\n\x10getIdentityNonce\x12\x32.org.dash.platform.dapi.v0.GetIdentityNonceRequest\x1a\x33.org.dash.platform.dapi.v0.GetIdentityNonceResponse\x12\x93\x01\n\x18getIdentityContractNonce\x12:.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest\x1a;.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse\x12\x81\x01\n\x12getIdentityBalance\x12\x34.org.dash.platform.dapi.v0.GetIdentityBalanceRequest\x1a\x35.org.dash.platform.dapi.v0.GetIdentityBalanceResponse\x12\xa2\x01\n\x1dgetIdentityBalanceAndRevision\x12?.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest\x1a@.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse\x12\x66\n\tgetProofs\x12+.org.dash.platform.dapi.v0.GetProofsRequest\x1a,.org.dash.platform.dapi.v0.GetProofsResponse\x12x\n\x0fgetDataContract\x12\x31.org.dash.platform.dapi.v0.GetDataContractRequest\x1a\x32.org.dash.platform.dapi.v0.GetDataContractResponse\x12\x8d\x01\n\x16getDataContractHistory\x12\x38.org.dash.platform.dapi.v0.GetDataContractHistoryRequest\x1a\x39.org.dash.platform.dapi.v0.GetDataContractHistoryResponse\x12{\n\x10getDataContracts\x12\x32.org.dash.platform.dapi.v0.GetDataContractsRequest\x1a\x33.org.dash.platform.dapi.v0.GetDataContractsResponse\x12o\n\x0cgetDocuments\x12..org.dash.platform.dapi.v0.GetDocumentsRequest\x1a/.org.dash.platform.dapi.v0.GetDocumentsResponse\x12\xa5\x01\n\x1egetIdentitiesByPublicKeyHashes\x12@.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest\x1a\x41.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse\x12\x99\x01\n\x1agetIdentityByPublicKeyHash\x12<.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest\x1a=.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse\x12\x9f\x01\n\x1cwaitForStateTransitionResult\x12>.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest\x1a?.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse\x12\x81\x01\n\x12getConsensusParams\x12\x34.org.dash.platform.dapi.v0.GetConsensusParamsRequest\x1a\x35.org.dash.platform.dapi.v0.GetConsensusParamsResponse\x12\xa5\x01\n\x1egetProtocolVersionUpgradeState\x12@.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest\x1a\x41.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse\x12\xb4\x01\n#getProtocolVersionUpgradeVoteStatus\x12\x45.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest\x1a\x46.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse\x12r\n\rgetEpochsInfo\x12/.org.dash.platform.dapi.v0.GetEpochsInfoRequest\x1a\x30.org.dash.platform.dapi.v0.GetEpochsInfoResponseb\x06proto3' + serialized_pb=b'\n\x0eplatform.proto\x12\x19org.dash.platform.dapi.v0\x1a\x1egoogle/protobuf/wrappers.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"\x81\x01\n\x05Proof\x12\x15\n\rgrovedb_proof\x18\x01 \x01(\x0c\x12\x13\n\x0bquorum_hash\x18\x02 \x01(\x0c\x12\x11\n\tsignature\x18\x03 \x01(\x0c\x12\r\n\x05round\x18\x04 \x01(\r\x12\x15\n\rblock_id_hash\x18\x05 \x01(\x0c\x12\x13\n\x0bquorum_type\x18\x06 \x01(\r\"\x90\x01\n\x10ResponseMetadata\x12\x0e\n\x06height\x18\x01 \x01(\x04\x12 \n\x18\x63ore_chain_locked_height\x18\x02 \x01(\r\x12\r\n\x05\x65poch\x18\x03 \x01(\r\x12\x0f\n\x07time_ms\x18\x04 \x01(\x04\x12\x18\n\x10protocol_version\x18\x05 \x01(\r\x12\x10\n\x08\x63hain_id\x18\x06 \x01(\t\"L\n\x1dStateTransitionBroadcastError\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\x0f\n\x07message\x18\x02 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x03 \x01(\x0c\";\n\x1f\x42roadcastStateTransitionRequest\x12\x18\n\x10state_transition\x18\x01 \x01(\x0c\"\"\n BroadcastStateTransitionResponse\"\xa4\x01\n\x12GetIdentityRequest\x12P\n\x02v0\x18\x01 \x01(\x0b\x32\x42.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0H\x00\x1a\x31\n\x14GetIdentityRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xc1\x01\n\x17GetIdentityNonceRequest\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0H\x00\x1a?\n\x19GetIdentityNonceRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xf6\x01\n\x1fGetIdentityContractNonceRequest\x12j\n\x02v0\x18\x01 \x01(\x0b\x32\\.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0H\x00\x1a\\\n!GetIdentityContractNonceRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12\x13\n\x0b\x63ontract_id\x18\x02 \x01(\x0c\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\xc0\x01\n\x19GetIdentityBalanceRequest\x12^\n\x02v0\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0H\x00\x1a\x38\n\x1bGetIdentityBalanceRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xec\x01\n$GetIdentityBalanceAndRevisionRequest\x12t\n\x02v0\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0H\x00\x1a\x43\n&GetIdentityBalanceAndRevisionRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x9e\x02\n\x13GetIdentityResponse\x12R\n\x02v0\x18\x01 \x01(\x0b\x32\x44.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0H\x00\x1a\xa7\x01\n\x15GetIdentityResponseV0\x12\x12\n\x08identity\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xad\x01\n\x14GetIdentitiesRequest\x12T\n\x02v0\x18\x01 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0H\x00\x1a\x34\n\x16GetIdentitiesRequestV0\x12\x0b\n\x03ids\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xda\x04\n\x15GetIdentitiesResponse\x12V\n\x02v0\x18\x01 \x01(\x0b\x32H.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0H\x00\x1a\x1e\n\rIdentityValue\x12\r\n\x05value\x18\x01 \x01(\x0c\x1ak\n\rIdentityEntry\x12\x0b\n\x03key\x18\x01 \x01(\x0c\x12M\n\x05value\x18\x02 \x01(\x0b\x32>.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue\x1a\x66\n\nIdentities\x12X\n\x10identity_entries\x18\x01 \x03(\x0b\x32>.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry\x1a\xe8\x01\n\x17GetIdentitiesResponseV0\x12Q\n\nidentities\x18\x01 \x01(\x0b\x32;.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentitiesH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb8\x02\n\x18GetIdentityNonceResponse\x12\\\n\x02v0\x18\x01 \x01(\x0b\x32N.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0H\x00\x1a\xb2\x01\n\x1aGetIdentityNonceResponseV0\x12\x18\n\x0eidentity_nonce\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xe1\x02\n GetIdentityContractNonceResponse\x12l\n\x02v0\x18\x01 \x01(\x0b\x32^.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0H\x00\x1a\xc3\x01\n\"GetIdentityContractNonceResponseV0\x12!\n\x17identity_contract_nonce\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb9\x02\n\x1aGetIdentityBalanceResponse\x12`\n\x02v0\x18\x01 \x01(\x0b\x32R.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0H\x00\x1a\xad\x01\n\x1cGetIdentityBalanceResponseV0\x12\x11\n\x07\x62\x61lance\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xa9\x04\n%GetIdentityBalanceAndRevisionResponse\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0H\x00\x1a\xfc\x02\n\'GetIdentityBalanceAndRevisionResponseV0\x12\x9b\x01\n\x14\x62\x61lance_and_revision\x18\x01 \x01(\x0b\x32{.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevisionH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x37\n\x12\x42\x61lanceAndRevision\x12\x0f\n\x07\x62\x61lance\x18\x01 \x01(\x04\x12\x10\n\x08revision\x18\x02 \x01(\x04\x42\x08\n\x06resultB\t\n\x07version\"\xd1\x01\n\x0eKeyRequestType\x12\x36\n\x08\x61ll_keys\x18\x01 \x01(\x0b\x32\".org.dash.platform.dapi.v0.AllKeysH\x00\x12@\n\rspecific_keys\x18\x02 \x01(\x0b\x32\'.org.dash.platform.dapi.v0.SpecificKeysH\x00\x12:\n\nsearch_key\x18\x03 \x01(\x0b\x32$.org.dash.platform.dapi.v0.SearchKeyH\x00\x42\t\n\x07request\"\t\n\x07\x41llKeys\"\x1f\n\x0cSpecificKeys\x12\x0f\n\x07key_ids\x18\x01 \x03(\r\"\xb6\x01\n\tSearchKey\x12I\n\x0bpurpose_map\x18\x01 \x03(\x0b\x32\x34.org.dash.platform.dapi.v0.SearchKey.PurposeMapEntry\x1a^\n\x0fPurposeMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12:\n\x05value\x18\x02 \x01(\x0b\x32+.org.dash.platform.dapi.v0.SecurityLevelMap:\x02\x38\x01\"\xbf\x02\n\x10SecurityLevelMap\x12]\n\x12security_level_map\x18\x01 \x03(\x0b\x32\x41.org.dash.platform.dapi.v0.SecurityLevelMap.SecurityLevelMapEntry\x1aw\n\x15SecurityLevelMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12M\n\x05value\x18\x02 \x01(\x0e\x32>.org.dash.platform.dapi.v0.SecurityLevelMap.KeyKindRequestType:\x02\x38\x01\"S\n\x12KeyKindRequestType\x12\x1f\n\x1b\x43URRENT_KEY_OF_KIND_REQUEST\x10\x00\x12\x1c\n\x18\x41LL_KEYS_OF_KIND_REQUEST\x10\x01\"\xda\x02\n\x16GetIdentityKeysRequest\x12X\n\x02v0\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0H\x00\x1a\xda\x01\n\x18GetIdentityKeysRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12?\n\x0crequest_type\x18\x02 \x01(\x0b\x32).org.dash.platform.dapi.v0.KeyRequestType\x12+\n\x05limit\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12,\n\x06offset\x18\x04 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\t\n\x07version\"\x99\x03\n\x17GetIdentityKeysResponse\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0H\x00\x1a\x96\x02\n\x19GetIdentityKeysResponseV0\x12\x61\n\x04keys\x18\x01 \x01(\x0b\x32Q.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.KeysH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x1a\n\x04Keys\x12\x12\n\nkeys_bytes\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version\"\xa1\x06\n\x10GetProofsRequest\x12L\n\x02v0\x18\x01 \x01(\x0b\x32>.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0H\x00\x1a\xb3\x05\n\x12GetProofsRequestV0\x12\x62\n\nidentities\x18\x01 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest\x12\x61\n\tcontracts\x18\x02 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest\x12\x61\n\tdocuments\x18\x03 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest\x1aw\n\x0f\x44ocumentRequest\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x15\n\rdocument_type\x18\x02 \x01(\t\x12#\n\x1b\x64ocument_type_keeps_history\x18\x03 \x01(\x08\x12\x13\n\x0b\x64ocument_id\x18\x04 \x01(\x0c\x1a\xd1\x01\n\x0fIdentityRequest\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12i\n\x0crequest_type\x18\x02 \x01(\x0e\x32S.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type\">\n\x04Type\x12\x11\n\rFULL_IDENTITY\x10\x00\x12\x0b\n\x07\x42\x41LANCE\x10\x01\x12\x08\n\x04KEYS\x10\x02\x12\x0c\n\x08REVISION\x10\x03\x1a&\n\x0f\x43ontractRequest\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x42\t\n\x07version\"\x82\x02\n\x11GetProofsResponse\x12N\n\x02v0\x18\x01 \x01(\x0b\x32@.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0H\x00\x1a\x91\x01\n\x13GetProofsResponseV0\x12\x31\n\x05proof\x18\x01 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x02 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb4\x01\n\x16GetDataContractRequest\x12X\n\x02v0\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0H\x00\x1a\x35\n\x18GetDataContractRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xb3\x02\n\x17GetDataContractResponse\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0H\x00\x1a\xb0\x01\n\x19GetDataContractResponseV0\x12\x17\n\rdata_contract\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb9\x01\n\x17GetDataContractsRequest\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0H\x00\x1a\x37\n\x19GetDataContractsRequestV0\x12\x0b\n\x03ids\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xcf\x04\n\x18GetDataContractsResponse\x12\\\n\x02v0\x18\x01 \x01(\x0b\x32N.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0H\x00\x1a[\n\x11\x44\x61taContractEntry\x12\x12\n\nidentifier\x18\x01 \x01(\x0c\x12\x32\n\rdata_contract\x18\x02 \x01(\x0b\x32\x1b.google.protobuf.BytesValue\x1au\n\rDataContracts\x12\x64\n\x15\x64\x61ta_contract_entries\x18\x01 \x03(\x0b\x32\x45.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry\x1a\xf5\x01\n\x1aGetDataContractsResponseV0\x12[\n\x0e\x64\x61ta_contracts\x18\x01 \x01(\x0b\x32\x41.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xc1\x02\n\x1dGetDataContractHistoryRequest\x12\x66\n\x02v0\x18\x01 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0H\x00\x1a\xac\x01\n\x1fGetDataContractHistoryRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12+\n\x05limit\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12,\n\x06offset\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\x13\n\x0bstart_at_ms\x18\x04 \x01(\x04\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\t\n\x07version\"\xae\x05\n\x1eGetDataContractHistoryResponse\x12h\n\x02v0\x18\x01 \x01(\x0b\x32Z.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0H\x00\x1a\x96\x04\n GetDataContractHistoryResponseV0\x12\x8f\x01\n\x15\x64\x61ta_contract_history\x18\x01 \x01(\x0b\x32n.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x37\n\x18\x44\x61taContractHistoryEntry\x12\x0c\n\x04\x64\x61te\x18\x01 \x01(\x04\x12\r\n\x05value\x18\x02 \x01(\x0c\x1a\xaa\x01\n\x13\x44\x61taContractHistory\x12\x92\x01\n\x15\x64\x61ta_contract_entries\x18\x01 \x03(\x0b\x32s.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntryB\x08\n\x06resultB\t\n\x07version\"\xb2\x02\n\x13GetDocumentsRequest\x12R\n\x02v0\x18\x01 \x01(\x0b\x32\x44.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0H\x00\x1a\xbb\x01\n\x15GetDocumentsRequestV0\x12\x18\n\x10\x64\x61ta_contract_id\x18\x01 \x01(\x0c\x12\x15\n\rdocument_type\x18\x02 \x01(\t\x12\r\n\x05where\x18\x03 \x01(\x0c\x12\x10\n\x08order_by\x18\x04 \x01(\x0c\x12\r\n\x05limit\x18\x05 \x01(\r\x12\x15\n\x0bstart_after\x18\x06 \x01(\x0cH\x00\x12\x12\n\x08start_at\x18\x07 \x01(\x0cH\x00\x12\r\n\x05prove\x18\x08 \x01(\x08\x42\x07\n\x05startB\t\n\x07version\"\x95\x03\n\x14GetDocumentsResponse\x12T\n\x02v0\x18\x01 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0H\x00\x1a\x9b\x02\n\x16GetDocumentsResponseV0\x12\x65\n\tdocuments\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.DocumentsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x1e\n\tDocuments\x12\x11\n\tdocuments\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version\"\xff\x01\n%GetIdentitiesByPublicKeyHashesRequest\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0H\x00\x1aS\n\'GetIdentitiesByPublicKeyHashesRequestV0\x12\x19\n\x11public_key_hashes\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xc6\x05\n&GetIdentitiesByPublicKeyHashesResponse\x12x\n\x02v0\x18\x01 \x01(\x0b\x32j.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0H\x00\x1a\x61\n\x1aPublicKeyHashIdentityEntry\x12\x17\n\x0fpublic_key_hash\x18\x01 \x01(\x0c\x12*\n\x05value\x18\x02 \x01(\x0b\x32\x1b.google.protobuf.BytesValue\x1a\x95\x01\n\x1bIdentitiesByPublicKeyHashes\x12v\n\x10identity_entries\x18\x01 \x03(\x0b\x32\\.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry\x1a\x9b\x02\n(GetIdentitiesByPublicKeyHashesResponseV0\x12s\n\nidentities\x18\x01 \x01(\x0b\x32].org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashesH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xed\x01\n!GetIdentityByPublicKeyHashRequest\x12n\n\x02v0\x18\x01 \x01(\x0b\x32`.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0H\x00\x1aM\n#GetIdentityByPublicKeyHashRequestV0\x12\x17\n\x0fpublic_key_hash\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xda\x02\n\"GetIdentityByPublicKeyHashResponse\x12p\n\x02v0\x18\x01 \x01(\x0b\x32\x62.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0H\x00\x1a\xb6\x01\n$GetIdentityByPublicKeyHashResponseV0\x12\x12\n\x08identity\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xfb\x01\n#WaitForStateTransitionResultRequest\x12r\n\x02v0\x18\x01 \x01(\x0b\x32\x64.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0H\x00\x1aU\n%WaitForStateTransitionResultRequestV0\x12\x1d\n\x15state_transition_hash\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x99\x03\n$WaitForStateTransitionResultResponse\x12t\n\x02v0\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0H\x00\x1a\xef\x01\n&WaitForStateTransitionResultResponseV0\x12I\n\x05\x65rror\x18\x01 \x01(\x0b\x32\x38.org.dash.platform.dapi.v0.StateTransitionBroadcastErrorH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xc4\x01\n\x19GetConsensusParamsRequest\x12^\n\x02v0\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0H\x00\x1a<\n\x1bGetConsensusParamsRequestV0\x12\x0e\n\x06height\x18\x01 \x01(\x05\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x9c\x04\n\x1aGetConsensusParamsResponse\x12`\n\x02v0\x18\x01 \x01(\x0b\x32R.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0H\x00\x1aP\n\x14\x43onsensusParamsBlock\x12\x11\n\tmax_bytes\x18\x01 \x01(\t\x12\x0f\n\x07max_gas\x18\x02 \x01(\t\x12\x14\n\x0ctime_iota_ms\x18\x03 \x01(\t\x1a\x62\n\x17\x43onsensusParamsEvidence\x12\x1a\n\x12max_age_num_blocks\x18\x01 \x01(\t\x12\x18\n\x10max_age_duration\x18\x02 \x01(\t\x12\x11\n\tmax_bytes\x18\x03 \x01(\t\x1a\xda\x01\n\x1cGetConsensusParamsResponseV0\x12Y\n\x05\x62lock\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock\x12_\n\x08\x65vidence\x18\x02 \x01(\x0b\x32M.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidenceB\t\n\x07version\"\xe4\x01\n%GetProtocolVersionUpgradeStateRequest\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0H\x00\x1a\x38\n\'GetProtocolVersionUpgradeStateRequestV0\x12\r\n\x05prove\x18\x01 \x01(\x08\x42\t\n\x07version\"\xb5\x05\n&GetProtocolVersionUpgradeStateResponse\x12x\n\x02v0\x18\x01 \x01(\x0b\x32j.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0H\x00\x1a\x85\x04\n(GetProtocolVersionUpgradeStateResponseV0\x12\x87\x01\n\x08versions\x18\x01 \x01(\x0b\x32s.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x96\x01\n\x08Versions\x12\x89\x01\n\x08versions\x18\x01 \x03(\x0b\x32w.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry\x1a:\n\x0cVersionEntry\x12\x16\n\x0eversion_number\x18\x01 \x01(\r\x12\x12\n\nvote_count\x18\x02 \x01(\rB\x08\n\x06resultB\t\n\x07version\"\xa3\x02\n*GetProtocolVersionUpgradeVoteStatusRequest\x12\x80\x01\n\x02v0\x18\x01 \x01(\x0b\x32r.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0H\x00\x1ag\n,GetProtocolVersionUpgradeVoteStatusRequestV0\x12\x19\n\x11start_pro_tx_hash\x18\x01 \x01(\x0c\x12\r\n\x05\x63ount\x18\x02 \x01(\r\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\xef\x05\n+GetProtocolVersionUpgradeVoteStatusResponse\x12\x82\x01\n\x02v0\x18\x01 \x01(\x0b\x32t.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0H\x00\x1a\xaf\x04\n-GetProtocolVersionUpgradeVoteStatusResponseV0\x12\x98\x01\n\x08versions\x18\x01 \x01(\x0b\x32\x83\x01.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignalsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\xaf\x01\n\x0eVersionSignals\x12\x9c\x01\n\x0fversion_signals\x18\x01 \x03(\x0b\x32\x82\x01.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal\x1a\x35\n\rVersionSignal\x12\x13\n\x0bpro_tx_hash\x18\x01 \x01(\x0c\x12\x0f\n\x07version\x18\x02 \x01(\rB\x08\n\x06resultB\t\n\x07version\"\xf5\x01\n\x14GetEpochsInfoRequest\x12T\n\x02v0\x18\x01 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0H\x00\x1a|\n\x16GetEpochsInfoRequestV0\x12\x31\n\x0bstart_epoch\x18\x01 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\r\n\x05\x63ount\x18\x02 \x01(\r\x12\x11\n\tascending\x18\x03 \x01(\x08\x12\r\n\x05prove\x18\x04 \x01(\x08\x42\t\n\x07version\"\x91\x05\n\x15GetEpochsInfoResponse\x12V\n\x02v0\x18\x01 \x01(\x0b\x32H.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0H\x00\x1a\x94\x04\n\x17GetEpochsInfoResponseV0\x12\x65\n\x06\x65pochs\x18\x01 \x01(\x0b\x32S.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfosH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1au\n\nEpochInfos\x12g\n\x0b\x65poch_infos\x18\x01 \x03(\x0b\x32R.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo\x1a\x9e\x01\n\tEpochInfo\x12\x0e\n\x06number\x18\x01 \x01(\r\x12\x1a\n\x12\x66irst_block_height\x18\x02 \x01(\x04\x12\x1f\n\x17\x66irst_core_block_height\x18\x03 \x01(\r\x12\x12\n\nstart_time\x18\x04 \x01(\x04\x12\x16\n\x0e\x66\x65\x65_multiplier\x18\x05 \x01(\x01\x12\x18\n\x10protocol_version\x18\x06 \x01(\rB\x08\n\x06resultB\t\n\x07version2\xd5\x15\n\x08Platform\x12\x93\x01\n\x18\x62roadcastStateTransition\x12:.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest\x1a;.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse\x12l\n\x0bgetIdentity\x12-.org.dash.platform.dapi.v0.GetIdentityRequest\x1a..org.dash.platform.dapi.v0.GetIdentityResponse\x12r\n\rgetIdentities\x12/.org.dash.platform.dapi.v0.GetIdentitiesRequest\x1a\x30.org.dash.platform.dapi.v0.GetIdentitiesResponse\x12x\n\x0fgetIdentityKeys\x12\x31.org.dash.platform.dapi.v0.GetIdentityKeysRequest\x1a\x32.org.dash.platform.dapi.v0.GetIdentityKeysResponse\x12{\n\x10getIdentityNonce\x12\x32.org.dash.platform.dapi.v0.GetIdentityNonceRequest\x1a\x33.org.dash.platform.dapi.v0.GetIdentityNonceResponse\x12\x93\x01\n\x18getIdentityContractNonce\x12:.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest\x1a;.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse\x12\x81\x01\n\x12getIdentityBalance\x12\x34.org.dash.platform.dapi.v0.GetIdentityBalanceRequest\x1a\x35.org.dash.platform.dapi.v0.GetIdentityBalanceResponse\x12\xa2\x01\n\x1dgetIdentityBalanceAndRevision\x12?.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest\x1a@.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse\x12\x66\n\tgetProofs\x12+.org.dash.platform.dapi.v0.GetProofsRequest\x1a,.org.dash.platform.dapi.v0.GetProofsResponse\x12x\n\x0fgetDataContract\x12\x31.org.dash.platform.dapi.v0.GetDataContractRequest\x1a\x32.org.dash.platform.dapi.v0.GetDataContractResponse\x12\x8d\x01\n\x16getDataContractHistory\x12\x38.org.dash.platform.dapi.v0.GetDataContractHistoryRequest\x1a\x39.org.dash.platform.dapi.v0.GetDataContractHistoryResponse\x12{\n\x10getDataContracts\x12\x32.org.dash.platform.dapi.v0.GetDataContractsRequest\x1a\x33.org.dash.platform.dapi.v0.GetDataContractsResponse\x12o\n\x0cgetDocuments\x12..org.dash.platform.dapi.v0.GetDocumentsRequest\x1a/.org.dash.platform.dapi.v0.GetDocumentsResponse\x12\xa5\x01\n\x1egetIdentitiesByPublicKeyHashes\x12@.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest\x1a\x41.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse\x12\x99\x01\n\x1agetIdentityByPublicKeyHash\x12<.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest\x1a=.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse\x12\x9f\x01\n\x1cwaitForStateTransitionResult\x12>.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest\x1a?.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse\x12\x81\x01\n\x12getConsensusParams\x12\x34.org.dash.platform.dapi.v0.GetConsensusParamsRequest\x1a\x35.org.dash.platform.dapi.v0.GetConsensusParamsResponse\x12\xa5\x01\n\x1egetProtocolVersionUpgradeState\x12@.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest\x1a\x41.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse\x12\xb4\x01\n#getProtocolVersionUpgradeVoteStatus\x12\x45.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest\x1a\x46.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse\x12r\n\rgetEpochsInfo\x12/.org.dash.platform.dapi.v0.GetEpochsInfoRequest\x1a\x30.org.dash.platform.dapi.v0.GetEpochsInfoResponseb\x06proto3' , dependencies=[google_dot_protobuf_dot_wrappers__pb2.DESCRIPTOR,google_dot_protobuf_dot_struct__pb2.DESCRIPTOR,google_dot_protobuf_dot_timestamp__pb2.DESCRIPTOR,]) @@ -4495,6 +4495,13 @@ message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='protocol_version', full_name='org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.protocol_version', index=5, + number=6, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], @@ -4508,7 +4515,7 @@ oneofs=[ ], serialized_start=15517, - serialized_end=15649, + serialized_end=15675, ) _GETEPOCHSINFORESPONSE_GETEPOCHSINFORESPONSEV0 = _descriptor.Descriptor( @@ -4558,7 +4565,7 @@ fields=[]), ], serialized_start=15153, - serialized_end=15659, + serialized_end=15685, ) _GETEPOCHSINFORESPONSE = _descriptor.Descriptor( @@ -4594,7 +4601,7 @@ fields=[]), ], serialized_start=15039, - serialized_end=15670, + serialized_end=15696, ) _GETIDENTITYREQUEST_GETIDENTITYREQUESTV0.containing_type = _GETIDENTITYREQUEST @@ -5911,8 +5918,8 @@ index=0, serialized_options=None, create_key=_descriptor._internal_create_key, - serialized_start=15673, - serialized_end=18446, + serialized_start=15699, + serialized_end=18472, methods=[ _descriptor.MethodDescriptor( name='broadcastStateTransition', diff --git a/packages/dapi-grpc/clients/platform/v0/web/platform_pb.d.ts b/packages/dapi-grpc/clients/platform/v0/web/platform_pb.d.ts index 18b2d9fb69..199db1f45e 100644 --- a/packages/dapi-grpc/clients/platform/v0/web/platform_pb.d.ts +++ b/packages/dapi-grpc/clients/platform/v0/web/platform_pb.d.ts @@ -3271,6 +3271,9 @@ export namespace GetEpochsInfoResponse { getFeeMultiplier(): number; setFeeMultiplier(value: number): void; + getProtocolVersion(): number; + setProtocolVersion(value: number): void; + serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): EpochInfo.AsObject; static toObject(includeInstance: boolean, msg: EpochInfo): EpochInfo.AsObject; @@ -3288,6 +3291,7 @@ export namespace GetEpochsInfoResponse { firstCoreBlockHeight: number, startTime: number, feeMultiplier: number, + protocolVersion: number, } } diff --git a/packages/dapi-grpc/clients/platform/v0/web/platform_pb.js b/packages/dapi-grpc/clients/platform/v0/web/platform_pb.js index 13ebdab355..e7495b46c1 100644 --- a/packages/dapi-grpc/clients/platform/v0/web/platform_pb.js +++ b/packages/dapi-grpc/clients/platform/v0/web/platform_pb.js @@ -24494,7 +24494,8 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.Ep firstBlockHeight: jspb.Message.getFieldWithDefault(msg, 2, 0), firstCoreBlockHeight: jspb.Message.getFieldWithDefault(msg, 3, 0), startTime: jspb.Message.getFieldWithDefault(msg, 4, 0), - feeMultiplier: jspb.Message.getFloatingPointFieldWithDefault(msg, 5, 0.0) + feeMultiplier: jspb.Message.getFloatingPointFieldWithDefault(msg, 5, 0.0), + protocolVersion: jspb.Message.getFieldWithDefault(msg, 6, 0) }; if (includeInstance) { @@ -24551,6 +24552,10 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.Ep var value = /** @type {number} */ (reader.readDouble()); msg.setFeeMultiplier(value); break; + case 6: + var value = /** @type {number} */ (reader.readUint32()); + msg.setProtocolVersion(value); + break; default: reader.skipField(); break; @@ -24615,6 +24620,13 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.Ep f ); } + f = message.getProtocolVersion(); + if (f !== 0) { + writer.writeUint32( + 6, + f + ); + } }; @@ -24708,6 +24720,24 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.Ep }; +/** + * optional uint32 protocol_version = 6; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.getProtocolVersion = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 6, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo} returns this + */ +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.setProtocolVersion = function(value) { + return jspb.Message.setProto3IntField(this, 6, value); +}; + + /** * optional EpochInfos epochs = 1; * @return {?proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos} diff --git a/packages/dapi-grpc/protos/platform/v0/platform.proto b/packages/dapi-grpc/protos/platform/v0/platform.proto index f39ef8cc16..f364577ad7 100644 --- a/packages/dapi-grpc/protos/platform/v0/platform.proto +++ b/packages/dapi-grpc/protos/platform/v0/platform.proto @@ -606,6 +606,7 @@ message GetEpochsInfoResponse { uint32 first_core_block_height = 3; uint64 start_time = 4; double fee_multiplier = 5; + uint32 protocol_version = 6; } oneof result { diff --git a/packages/dapi-grpc/src/platform/proto/org.dash.platform.dapi.v0.rs b/packages/dapi-grpc/src/platform/proto/org.dash.platform.dapi.v0.rs index 34e7d78313..0f6446f156 100644 --- a/packages/dapi-grpc/src/platform/proto/org.dash.platform.dapi.v0.rs +++ b/packages/dapi-grpc/src/platform/proto/org.dash.platform.dapi.v0.rs @@ -2111,6 +2111,8 @@ pub mod get_epochs_info_response { pub start_time: u64, #[prost(double, tag = "5")] pub fee_multiplier: f64, + #[prost(uint32, tag = "6")] + pub protocol_version: u32, } #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] diff --git a/packages/rs-dpp/src/block/extended_epoch_info/mod.rs b/packages/rs-dpp/src/block/extended_epoch_info/mod.rs index 8562a73bd9..48e9057ea3 100644 --- a/packages/rs-dpp/src/block/extended_epoch_info/mod.rs +++ b/packages/rs-dpp/src/block/extended_epoch_info/mod.rs @@ -3,6 +3,7 @@ pub mod v0; use crate::block::epoch::EpochIndex; use crate::block::extended_epoch_info::v0::{ExtendedEpochInfoV0, ExtendedEpochInfoV0Getters}; use crate::protocol_error::ProtocolError; +use crate::util::deserializer::ProtocolVersion; use bincode::{Decode, Encode}; use derive_more::From; use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; @@ -56,4 +57,10 @@ impl ExtendedEpochInfoV0Getters for ExtendedEpochInfo { ExtendedEpochInfo::V0(v0) => v0.fee_multiplier, } } + + fn protocol_version(&self) -> ProtocolVersion { + match self { + ExtendedEpochInfo::V0(v0) => v0.protocol_version, + } + } } diff --git a/packages/rs-dpp/src/block/extended_epoch_info/v0/mod.rs b/packages/rs-dpp/src/block/extended_epoch_info/v0/mod.rs index e99b8e1132..a5e6987b36 100644 --- a/packages/rs-dpp/src/block/extended_epoch_info/v0/mod.rs +++ b/packages/rs-dpp/src/block/extended_epoch_info/v0/mod.rs @@ -1,4 +1,5 @@ use crate::block::epoch::EpochIndex; +use crate::util::deserializer::ProtocolVersion; use bincode::{Decode, Encode}; use serde::{Deserialize, Serialize}; @@ -15,6 +16,8 @@ pub struct ExtendedEpochInfoV0 { pub first_core_block_height: u32, /// Fee multiplier pub fee_multiplier: f64, + /// Protocol version + pub protocol_version: u32, } /// Trait defining getters for `ExtendedEpochInfoV0`. @@ -33,4 +36,7 @@ pub trait ExtendedEpochInfoV0Getters { /// Returns the fee multiplier. fn fee_multiplier(&self) -> f64; + + /// Protocol version + fn protocol_version(&self) -> ProtocolVersion; } diff --git a/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/v0/mod.rs b/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/v0/mod.rs index bff63f2aba..e43a641363 100644 --- a/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/v0/mod.rs @@ -89,12 +89,6 @@ where initial_platform_state .set_current_protocol_version_in_consensus(request.initial_protocol_version); - self.drive.store_current_protocol_version( - request.initial_protocol_version, - Some(transaction), - &platform_version.drive, - )?; - if tracing::enabled!(tracing::Level::TRACE) { tracing::trace!( platform_state_fingerprint = hex::encode(initial_platform_state.fingerprint()), diff --git a/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs b/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs index 39d96f1530..38939ca2a7 100644 --- a/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs @@ -333,8 +333,7 @@ where // Process fees let processed_block_fees = self.process_block_fees( - block_execution_context.block_state_info(), - &epoch_info, + &block_execution_context, block_fees_v0.into(), transaction, platform_version, diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/add_process_epoch_change_operations/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/add_process_epoch_change_operations/mod.rs index 1d281cb1d1..9722463566 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/add_process_epoch_change_operations/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/add_process_epoch_change_operations/mod.rs @@ -12,6 +12,7 @@ use crate::execution::types::block_state_info::BlockStateInfo; use crate::execution::types::storage_fee_distribution_outcome; use crate::error::execution::ExecutionError; +use crate::execution::types::block_execution_context::BlockExecutionContext; use crate::platform_types::epoch_info::EpochInfo; use crate::platform_types::platform::Platform; @@ -41,8 +42,7 @@ impl Platform { /// pub fn add_process_epoch_change_operations( &self, - block_info: &BlockStateInfo, - epoch_info: &EpochInfo, + block_execution_context: &BlockExecutionContext, block_fees: &BlockFees, transaction: &Transaction, batch: &mut Vec, @@ -56,8 +56,7 @@ impl Platform { .add_process_epoch_change_operations { 0 => self.add_process_epoch_change_operations_v0( - block_info, - epoch_info, + block_execution_context, block_fees, transaction, batch, diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/add_process_epoch_change_operations/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/add_process_epoch_change_operations/v0/mod.rs index b2e0f041d0..52f7f35e69 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/add_process_epoch_change_operations/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/add_process_epoch_change_operations/v0/mod.rs @@ -50,9 +50,12 @@ use crate::execution::types::block_state_info::v0::BlockStateInfoV0Getters; use crate::execution::types::block_state_info::BlockStateInfo; use crate::execution::types::storage_fee_distribution_outcome; +use crate::execution::types::block_execution_context::v0::BlockExecutionContextV0Getters; +use crate::execution::types::block_execution_context::BlockExecutionContext; use crate::platform_types::epoch_info::v0::EpochInfoV0Getters; use crate::platform_types::epoch_info::EpochInfo; use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use drive::fee_pools::epochs::operations_factory::EpochOperations; /// From the Dash Improvement Proposal: @@ -77,8 +80,7 @@ impl Platform { #[inline(always)] pub(super) fn add_process_epoch_change_operations_v0( &self, - block_info: &BlockStateInfo, - epoch_info: &EpochInfo, + block_execution_context: &BlockExecutionContext, block_fees: &BlockFees, transaction: &Transaction, batch: &mut Vec, @@ -87,6 +89,9 @@ impl Platform { { let mut inner_batch = GroveDbOpBatch::new(); + let epoch_info = block_execution_context.epoch_info(); + let block_info = block_execution_context.block_state_info(); + // init next thousandth empty epochs since last initiated let last_initiated_epoch_index = epoch_info .previous_epoch_index() @@ -111,6 +116,16 @@ impl Platform { &mut inner_batch, ); + // Update next epoch protocol version + let next_epoch = Epoch::new(epoch_info.current_epoch_index() + 1)?; + inner_batch.push( + next_epoch.update_protocol_version_operation( + block_execution_context + .block_platform_state() + .next_epoch_protocol_version(), + ), + ); + // Nothing to distribute on genesis epoch start if current_epoch.index == GENESIS_EPOCH_INDEX { batch.push(DriveOperation::GroveDBOpBatch(inner_batch)); @@ -151,11 +166,14 @@ mod tests { mod helpers { use super::*; + use crate::execution::types::block_execution_context::v0::BlockExecutionContextV0; use crate::execution::types::block_fees::v0::{BlockFeesV0, BlockFeesV0Methods}; use crate::execution::types::block_state_info::v0::BlockStateInfoV0; use crate::platform_types::epoch_info::v0::EpochInfoV0; + use crate::platform_types::platform_state::PlatformState; use dpp::block::block_info::BlockInfo; use dpp::fee::epoch::CreditsPerEpoch; + use drive::drive::defaults::INITIAL_PROTOCOL_VERSION; /// Process and validate an epoch change pub fn process_and_validate_epoch_change( @@ -233,12 +251,25 @@ mod tests { } .into(); + let block_platform_state = PlatformState::default_with_protocol_versions( + INITIAL_PROTOCOL_VERSION, + INITIAL_PROTOCOL_VERSION, + ); + + let block_execution_context = BlockExecutionContextV0 { + block_state_info: block_info.clone().into(), + epoch_info, + hpmn_count: 0, + unsigned_withdrawal_transactions: Default::default(), + block_platform_state, + proposer_results: None, + }; + let mut batch = vec![]; let storage_fee_distribution_outcome = platform .add_process_epoch_change_operations_v0( - &block_info.clone().into(), - &epoch_info, + &block_execution_context.into(), &block_fees, transaction, &mut batch, diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/process_block_fees/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/process_block_fees/mod.rs index b82ac36f12..e8cafae10b 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/process_block_fees/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/process_block_fees/mod.rs @@ -6,6 +6,7 @@ use drive::grovedb::Transaction; use crate::error::execution::ExecutionError; use crate::error::Error; +use crate::execution::types::block_execution_context::BlockExecutionContext; use crate::execution::types::block_fees::BlockFees; @@ -37,8 +38,7 @@ impl Platform { /// pub fn process_block_fees( &self, - block_info: &BlockStateInfo, - epoch_info: &EpochInfo, + block_execution_context: &BlockExecutionContext, block_fees: BlockFees, transaction: &Transaction, platform_version: &PlatformVersion, @@ -50,8 +50,7 @@ impl Platform { .process_block_fees { 0 => self.process_block_fees_v0( - block_info, - epoch_info, + block_execution_context, block_fees, transaction, platform_version, diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/process_block_fees/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/process_block_fees/v0/mod.rs index 40e3e9d158..2c83e3e1ea 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/process_block_fees/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/process_block_fees/v0/mod.rs @@ -43,15 +43,15 @@ use drive::grovedb::Transaction; use crate::error::execution::ExecutionError; use crate::error::Error; +use crate::execution::types::block_execution_context::v0::BlockExecutionContextV0Getters; +use crate::execution::types::block_execution_context::BlockExecutionContext; use crate::execution::types::block_fees::v0::BlockFeesV0Getters; use crate::execution::types::block_fees::BlockFees; use crate::execution::types::block_state_info::v0::{ BlockStateInfoV0Getters, BlockStateInfoV0Methods, }; -use crate::execution::types::block_state_info::BlockStateInfo; use crate::execution::types::processed_block_fees_outcome; use crate::platform_types::epoch_info::v0::EpochInfoV0Getters; -use crate::platform_types::epoch_info::EpochInfo; use crate::platform_types::platform::Platform; use drive::fee_pools::epochs::operations_factory::EpochOperations; @@ -76,20 +76,21 @@ impl Platform { #[inline(always)] pub(super) fn process_block_fees_v0( &self, - block_info: &BlockStateInfo, - epoch_info: &EpochInfo, + block_execution_context: &BlockExecutionContext, block_fees: BlockFees, transaction: &Transaction, platform_version: &PlatformVersion, ) -> Result { + let epoch_info = block_execution_context.epoch_info(); + let block_info = block_execution_context.block_state_info(); + let current_epoch = Epoch::new(epoch_info.current_epoch_index())?; let mut batch = vec![]; let storage_fee_distribution_outcome = if epoch_info.is_epoch_change() { self.add_process_epoch_change_operations( - block_info, - epoch_info, + block_execution_context, &block_fees, transaction, &mut batch, @@ -227,10 +228,14 @@ mod tests { mod helpers { use super::*; + use crate::execution::types::block_execution_context::v0::BlockExecutionContextV0; use crate::execution::types::block_fees::v0::BlockFeesV0; use crate::execution::types::block_state_info::v0::BlockStateInfoV0; use crate::platform_types::epoch_info::v0::EpochInfoV0; + use crate::platform_types::epoch_info::EpochInfo; + use crate::platform_types::platform_state::PlatformState; use dpp::fee::epoch::{perpetual_storage_epochs, CreditsPerEpoch, GENESIS_EPOCH_INDEX}; + use drive::drive::defaults::INITIAL_PROTOCOL_VERSION; /// Process and validate block fees pub fn process_and_validate_block_fees( @@ -260,7 +265,7 @@ mod tests { app_hash: None, }; - let epoch_info = EpochInfoV0::from_genesis_time_and_block_info( + let epoch_info: EpochInfo = EpochInfoV0::from_genesis_time_and_block_info( genesis_time_ms, &block_info, platform.config.execution.epoch_time_length_s, @@ -275,10 +280,23 @@ mod tests { } .into(); + let block_platform_state = PlatformState::default_with_protocol_versions( + INITIAL_PROTOCOL_VERSION, + INITIAL_PROTOCOL_VERSION, + ); + + let block_execution_context = BlockExecutionContextV0 { + block_state_info: block_info.clone().into(), + epoch_info: epoch_info.clone(), + hpmn_count: 0, + unsigned_withdrawal_transactions: Default::default(), + block_platform_state, + proposer_results: None, + }; + let storage_fee_distribution_outcome = platform .process_block_fees_v0( - &block_info.clone().into(), - &epoch_info, + &block_execution_context.into(), block_fees.clone(), transaction, platform_version, diff --git a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs index 61998bac9c..694a02036d 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs @@ -314,8 +314,8 @@ mod tests { assert_eq!( root_hash, [ - 234, 164, 235, 118, 224, 151, 97, 37, 216, 180, 69, 227, 187, 186, 178, 82, - 251, 35, 184, 238, 104, 188, 106, 117, 182, 210, 91, 97, 218, 177, 130, 64 + 144, 123, 124, 62, 37, 243, 19, 45, 226, 49, 97, 251, 141, 197, 94, 69, 117, + 126, 182, 44, 148, 143, 41, 113, 245, 86, 229, 207, 100, 56, 17, 177 ] ) } diff --git a/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/upgrade_protocol_version/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/upgrade_protocol_version/v0/mod.rs index 5cce6dd324..46b793e4ff 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/upgrade_protocol_version/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/upgrade_protocol_version/v0/mod.rs @@ -55,14 +55,6 @@ impl Platform { block_platform_state .set_current_protocol_version_in_consensus(current_block_protocol_version); - - // Store current protocol version in drive state - // TODO: This will be removed in #1778 - self.drive.store_current_protocol_version( - platform_version.protocol_version, - Some(transaction), - &platform_version.drive, - )?; }; // Determine a new protocol version for the next epoch if enough proposers voted diff --git a/packages/rs-drive-abci/src/execution/storage/store_platform_state/v0/mod.rs b/packages/rs-drive-abci/src/execution/storage/store_platform_state/v0/mod.rs index b41100eb47..68893fbb0e 100644 --- a/packages/rs-drive-abci/src/execution/storage/store_platform_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/storage/store_platform_state/v0/mod.rs @@ -14,6 +14,12 @@ impl Platform { ) -> Result<(), Error> { self.drive .store_platform_state_bytes(&state.serialize_to_bytes()?, transaction, platform_version) - .map_err(Error::Drive) + .map_err(Error::Drive)?; + + // We need to persist new protocol version as well be able to read block state + self.drive + .store_current_protocol_version(platform_version.protocol_version, transaction)?; + + Ok(()) } } diff --git a/packages/rs-drive-abci/src/query/system/epoch_infos/v0/mod.rs b/packages/rs-drive-abci/src/query/system/epoch_infos/v0/mod.rs index 8b9b04d855..afce159664 100644 --- a/packages/rs-drive-abci/src/query/system/epoch_infos/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/system/epoch_infos/v0/mod.rs @@ -82,6 +82,7 @@ impl Platform { first_core_block_height: epoch_info.first_core_block_height(), start_time: epoch_info.first_block_time(), fee_multiplier: epoch_info.fee_multiplier(), + protocol_version: epoch_info.protocol_version(), }) .collect(); diff --git a/packages/rs-drive-abci/tests/strategy_tests/main.rs b/packages/rs-drive-abci/tests/strategy_tests/main.rs index d6784daedb..be33e96e18 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/main.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/main.rs @@ -528,7 +528,7 @@ mod tests { .expect("expected to fetch balances") .expect("expected to have an identity to get balance from"); - assert_eq!(balance, 99864796380) + assert_eq!(balance, 99864825980) } #[test] @@ -1118,7 +1118,7 @@ mod tests { .unwrap() .unwrap() ), - "bb11d456206e85b3225ffbd35d915ab1c92e1a64057057b272fb3931325caa22".to_string() + "2d950355e6d8ddc3a726b211d68f79cc2d5c77a3c190b640c4ac08a00920a9b3".to_string() ) } @@ -1807,7 +1807,7 @@ mod tests { .unwrap() .unwrap() ), - "3ed0fbb75dbb645d9972f16fc6be7c0e2e3c1ed4b7a035b8a12935a871c7106e".to_string() + "292700696d04d77de86c835b925d139c0bb606dc71c071c84e40303ea51d4986".to_string() ) } @@ -1932,7 +1932,7 @@ mod tests { .unwrap() .unwrap() ), - "608b5592cdb3822899cd90fecb542dd90c377fc26b2e995ed083c9760955703f".to_string() + "03fdb219334b7786040ed2d55bdddef35a337426fa69f83d5671ddf400824309".to_string() ) } diff --git a/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs b/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs index b2d4e51214..c1ca805bf1 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs @@ -2,6 +2,7 @@ mod tests { use dpp::block::block_info::BlockInfo; use dpp::block::extended_block_info::v0::ExtendedBlockInfoV0Getters; + use dpp::block::extended_epoch_info::v0::ExtendedEpochInfoV0Getters; use dpp::dashcore::hashes::Hash; use dpp::dashcore::{BlockHash, ChainLock}; use dpp::version::PlatformVersion; @@ -1329,6 +1330,22 @@ mod tests { ), (Some(&2), Some(&68), Some(&3)) ); //some nodes reverted to previous version + + let epochs = platform + .drive + .get_epochs_infos( + 2, + 1, + true, + None, + state + .current_platform_version() + .expect("should have version"), + ) + .expect("should return epochs"); + + assert_eq!(epochs.len(), 1); + assert_eq!(epochs[0].protocol_version(), 1); } let strategy = NetworkStrategy { @@ -1417,6 +1434,22 @@ mod tests { ), (None, Some(&3), Some(&143)) ); + + let epochs = platform + .drive + .get_epochs_infos( + 4, + 1, + true, + None, + state + .current_platform_version() + .expect("should have version"), + ) + .expect("should return epochs"); + + assert_eq!(epochs.len(), 1); + assert_eq!(epochs[0].protocol_version(), TEST_PROTOCOL_VERSION_2); } }) .expect("Failed to create thread with custom stack size"); diff --git a/packages/rs-drive/src/drive/credit_pools/epochs/get_epochs_infos/v0/mod.rs b/packages/rs-drive/src/drive/credit_pools/epochs/get_epochs_infos/v0/mod.rs index 3619900d40..3fa8a0c9e7 100644 --- a/packages/rs-drive/src/drive/credit_pools/epochs/get_epochs_infos/v0/mod.rs +++ b/packages/rs-drive/src/drive/credit_pools/epochs/get_epochs_infos/v0/mod.rs @@ -13,7 +13,8 @@ use std::u64; use crate::drive::credit_pools::pools_vec_path; use crate::error::query::QuerySyntaxError; use crate::fee_pools::epochs::epoch_key_constants::{ - KEY_FEE_MULTIPLIER, KEY_START_BLOCK_CORE_HEIGHT, KEY_START_BLOCK_HEIGHT, KEY_START_TIME, + KEY_FEE_MULTIPLIER, KEY_PROTOCOL_VERSION, KEY_START_BLOCK_CORE_HEIGHT, KEY_START_BLOCK_HEIGHT, + KEY_START_TIME, }; use crate::query::QueryItem; use dpp::version::PlatformVersion; @@ -42,6 +43,7 @@ impl Drive { KEY_START_BLOCK_HEIGHT.to_vec(), KEY_START_BLOCK_CORE_HEIGHT.to_vec(), KEY_FEE_MULTIPLIER.to_vec(), + KEY_PROTOCOL_VERSION.to_vec(), ]); let mut query = if ascending { Query::new_single_query_item(QueryItem::RangeFrom( @@ -56,7 +58,8 @@ impl Drive { query.set_subquery(subquery); let path_query = PathQuery::new( pools_vec_path(), - SizedQuery::new(query, Some(count * 4), None), + // The multiplier must be equal to requested keys count + SizedQuery::new(query, Some(count * 5), None), ); let results = self @@ -202,6 +205,26 @@ impl Drive { let fee_multiplier = f64::from_be_bytes(fee_multiplier_bytes); + let protocol_version_element = inner_map.get(&KEY_PROTOCOL_VERSION.to_vec())?; + + let Element::Item(encoded_protocol_version, _) = protocol_version_element else { + return Some(Err(Error::Drive(DriveError::UnexpectedElementType( + "protocol version must be an item", + )))); + }; + + let protocol_version_bytes: [u8; 4] = + match encoded_protocol_version.as_slice().try_into().map_err(|_| { + Error::Drive(DriveError::CorruptedSerialization( + "protocol version must be 4 bytes for a u32".to_string(), + )) + }) { + Ok(value) => value, + Err(e) => return Some(Err(e)), + }; + + let protocol_version = u32::from_be_bytes(protocol_version_bytes); + // Construct the ExtendedEpochInfo Some(Ok(ExtendedEpochInfoV0 { index: epoch_index, @@ -209,6 +232,7 @@ impl Drive { first_block_height, first_core_block_height, fee_multiplier, + protocol_version, } .into())) }) diff --git a/packages/rs-drive/src/drive/credit_pools/epochs/prove_epochs_infos/v0/mod.rs b/packages/rs-drive/src/drive/credit_pools/epochs/prove_epochs_infos/v0/mod.rs index 8115361dd2..0417318cb1 100644 --- a/packages/rs-drive/src/drive/credit_pools/epochs/prove_epochs_infos/v0/mod.rs +++ b/packages/rs-drive/src/drive/credit_pools/epochs/prove_epochs_infos/v0/mod.rs @@ -10,7 +10,8 @@ use grovedb::{PathQuery, Query, SizedQuery, TransactionArg}; use crate::drive::credit_pools::pools_vec_path; use crate::error::query::QuerySyntaxError; use crate::fee_pools::epochs::epoch_key_constants::{ - KEY_FEE_MULTIPLIER, KEY_START_BLOCK_CORE_HEIGHT, KEY_START_BLOCK_HEIGHT, KEY_START_TIME, + KEY_FEE_MULTIPLIER, KEY_PROTOCOL_VERSION, KEY_START_BLOCK_CORE_HEIGHT, KEY_START_BLOCK_HEIGHT, + KEY_START_TIME, }; use crate::query::QueryItem; use dpp::version::PlatformVersion; @@ -39,6 +40,7 @@ impl Drive { KEY_START_BLOCK_HEIGHT.to_vec(), KEY_START_BLOCK_CORE_HEIGHT.to_vec(), KEY_FEE_MULTIPLIER.to_vec(), + KEY_PROTOCOL_VERSION.to_vec(), ]); let mut query = if ascending { Query::new_single_query_item(QueryItem::RangeFrom( @@ -53,7 +55,8 @@ impl Drive { query.set_subquery(subquery); let path_query = PathQuery::new( pools_vec_path(), - SizedQuery::new(query, Some(count * 4), None), + // The multiplier must be equal to requested keys count + SizedQuery::new(query, Some(count * 5), None), ); self.grove_get_proved_path_query( diff --git a/packages/rs-drive/src/drive/initialization/v0/mod.rs b/packages/rs-drive/src/drive/initialization/v0/mod.rs index b15fd0a345..34319e837e 100644 --- a/packages/rs-drive/src/drive/initialization/v0/mod.rs +++ b/packages/rs-drive/src/drive/initialization/v0/mod.rs @@ -177,7 +177,11 @@ impl Drive { ); // In Pools: initialize the pools with epochs - add_create_fee_pool_trees_operations(&mut batch, self.config.epochs_per_era)?; + add_create_fee_pool_trees_operations( + &mut batch, + self.config.epochs_per_era, + platform_version.protocol_version, + )?; // In Withdrawals add_initial_withdrawal_state_structure_operations(&mut batch); diff --git a/packages/rs-drive/src/drive/protocol_upgrade/change_to_new_version_and_clear_version_information/mod.rs b/packages/rs-drive/src/drive/protocol_upgrade/change_to_new_version_and_clear_version_information/mod.rs deleted file mode 100644 index 41b91c71c7..0000000000 --- a/packages/rs-drive/src/drive/protocol_upgrade/change_to_new_version_and_clear_version_information/mod.rs +++ /dev/null @@ -1,41 +0,0 @@ -use crate::drive::Drive; -use crate::error::drive::DriveError; -use crate::error::Error; -use dpp::util::deserializer::ProtocolVersion; - -use dpp::version::PlatformVersion; -use dpp::ProtocolError; -use grovedb::TransactionArg; - -mod v0; - -impl Drive { - /// Clear all version information from the backing store, this is done on epoch change in - /// execution logic - pub fn change_to_new_version_and_clear_version_information( - &self, - current_version: ProtocolVersion, - next_version: ProtocolVersion, - transaction: TransactionArg, - ) -> Result<(), Error> { - let platform_version = - PlatformVersion::get(current_version).map_err(ProtocolError::PlatformVersionError)?; - match platform_version - .drive - .methods - .protocol_upgrade - .change_to_new_version_and_clear_version_information - { - 0 => self.change_to_new_version_and_clear_version_information_v0( - current_version, - next_version, - transaction, - ), - version => Err(Error::Drive(DriveError::UnknownVersionMismatch { - method: "change_to_new_version_and_clear_version_information".to_string(), - known_versions: vec![0], - received: version, - })), - } - } -} diff --git a/packages/rs-drive/src/drive/protocol_upgrade/change_to_new_version_and_clear_version_information/v0/mod.rs b/packages/rs-drive/src/drive/protocol_upgrade/change_to_new_version_and_clear_version_information/v0/mod.rs deleted file mode 100644 index b30a6e2db5..0000000000 --- a/packages/rs-drive/src/drive/protocol_upgrade/change_to_new_version_and_clear_version_information/v0/mod.rs +++ /dev/null @@ -1,56 +0,0 @@ -use crate::drive::batch::grovedb_op_batch::GroveDbOpBatchV0Methods; -use crate::drive::Drive; - -use crate::error::Error; - -use crate::fee::op::LowLevelDriveOperation; - -use dpp::util::deserializer::ProtocolVersion; - -use dpp::version::PlatformVersion; -use dpp::ProtocolError; - -use grovedb::TransactionArg; - -impl Drive { - /// TODO: Should work with Epoch trees. Will be reworked in upcoming PR - /// Clear all version information from the backing store, this is done on epoch change in - /// execution logic - pub(super) fn change_to_new_version_and_clear_version_information_v0( - &self, - current_version: ProtocolVersion, - next_version: ProtocolVersion, - transaction: TransactionArg, - ) -> Result<(), Error> { - let platform_version = - PlatformVersion::get(current_version).map_err(ProtocolError::PlatformVersionError)?; - let mut batch_operations: Vec = vec![]; - - self.set_current_protocol_version_operations( - current_version, - &mut batch_operations, - &platform_version.drive, - )?; - self.set_next_protocol_version_operations( - next_version, - transaction, - &mut batch_operations, - &platform_version.drive, - )?; - let grove_db_operations = - LowLevelDriveOperation::grovedb_operations_batch(&batch_operations); - if !grove_db_operations.is_empty() { - self.apply_batch_grovedb_operations( - None, - transaction, - grove_db_operations, - &mut vec![], - &platform_version.drive, - )?; - } - - self.clear_version_information(transaction, &platform_version.drive)?; - - Ok(()) - } -} diff --git a/packages/rs-drive/src/drive/protocol_upgrade/mod.rs b/packages/rs-drive/src/drive/protocol_upgrade/mod.rs index 75bc6ed984..fb72dfa060 100644 --- a/packages/rs-drive/src/drive/protocol_upgrade/mod.rs +++ b/packages/rs-drive/src/drive/protocol_upgrade/mod.rs @@ -5,8 +5,6 @@ use crate::drive::batch::GroveDbOpBatch; #[cfg(any(feature = "full", feature = "verify"))] use crate::drive::RootTree; -#[cfg(feature = "full")] -mod change_to_new_version_and_clear_version_information; #[cfg(feature = "full")] mod clear_version_information; #[cfg(feature = "full")] @@ -21,7 +19,6 @@ mod fetch_versions_with_counter; mod remove_validators_proposed_app_versions; #[cfg(feature = "full")] mod update_validator_proposed_app_version; - #[cfg(any(feature = "full", feature = "verify"))] /// constant id for various versions counter pub const VERSIONS_COUNTER: [u8; 1] = [0]; diff --git a/packages/rs-drive/src/drive/system/misc_tree_constants.rs b/packages/rs-drive/src/drive/system/misc_tree_constants.rs deleted file mode 100644 index 44a9fa2c23..0000000000 --- a/packages/rs-drive/src/drive/system/misc_tree_constants.rs +++ /dev/null @@ -1,5 +0,0 @@ -/// Protocol Version Storage key -pub const PROTOCOL_VERSION_STORAGE_KEY: &[u8; 1] = b"v"; - -/// Next Epoch Protocol Version Storage key -pub const NEXT_PROTOCOL_VERSION_STORAGE_KEY: &[u8; 1] = b"n"; diff --git a/packages/rs-drive/src/drive/system/mod.rs b/packages/rs-drive/src/drive/system/mod.rs index 7eaf69a562..7493702adf 100644 --- a/packages/rs-drive/src/drive/system/mod.rs +++ b/packages/rs-drive/src/drive/system/mod.rs @@ -2,8 +2,6 @@ mod estimation_costs; /// Genesis time module #[cfg(feature = "full")] pub mod genesis_time; -/// Constants for the misc tree -pub mod misc_tree_constants; /// Protocol version module pub mod protocol_version; diff --git a/packages/rs-drive/src/drive/system/protocol_version/fetch_current_protocol_version.rs b/packages/rs-drive/src/drive/system/protocol_version/fetch_current_protocol_version.rs index fbd2e81b45..5f971c7cdb 100644 --- a/packages/rs-drive/src/drive/system/protocol_version/fetch_current_protocol_version.rs +++ b/packages/rs-drive/src/drive/system/protocol_version/fetch_current_protocol_version.rs @@ -2,15 +2,14 @@ use crate::drive::Drive; use crate::error::drive::DriveError; use crate::error::Error; -use crate::drive::system::misc_path; -use crate::drive::system::misc_tree_constants::PROTOCOL_VERSION_STORAGE_KEY; +use crate::drive::system::protocol_version::PROTOCOL_VERSION_AUX_KEY; use dpp::util::deserializer::ProtocolVersion; use grovedb::{GroveDb, TransactionArg}; use integer_encoding::VarInt; /// impl Drive { - /// Gets the current protocol version from the backing store + /// Gets the current protocol version from aux storage /// /// !!!DON'T CHANGE!!!! /// @@ -41,20 +40,15 @@ impl Drive { grove: &GroveDb, transaction: TransactionArg, ) -> Result, Error> { - let misc_path = misc_path(); grove - .get_raw_optional( - (&misc_path).into(), - PROTOCOL_VERSION_STORAGE_KEY, - transaction, - ) + .get_aux(PROTOCOL_VERSION_AUX_KEY, transaction) .unwrap() .map_err(Error::GroveDB) - .map(|maybe_element| { - maybe_element - .map(|e| { - let bytes = e.as_item_bytes()?; - let Some((protocol_version, _)) = ProtocolVersion::decode_var(bytes) else { + .map(|bytes| { + bytes + .map(|bytes| { + let Some((protocol_version, _)) = ProtocolVersion::decode_var(&bytes) + else { return Err(Error::Drive(DriveError::CorruptedSerialization( String::from("protocol version incorrectly serialized"), ))); diff --git a/packages/rs-drive/src/drive/system/protocol_version/fetch_next_protocol_version/mod.rs b/packages/rs-drive/src/drive/system/protocol_version/fetch_next_protocol_version/mod.rs deleted file mode 100644 index 854f35d259..0000000000 --- a/packages/rs-drive/src/drive/system/protocol_version/fetch_next_protocol_version/mod.rs +++ /dev/null @@ -1,44 +0,0 @@ -mod v0; - -use crate::drive::Drive; -use crate::error::drive::DriveError; -use crate::error::Error; - -use dpp::util::deserializer::ProtocolVersion; -use dpp::version::drive_versions::DriveVersion; -use grovedb::TransactionArg; - -impl Drive { - /// Gets the next protocol version from the backing store - /// - /// # Arguments - /// - /// * `transaction` - A `TransactionArg` object representing the transaction. - /// - /// # Returns - /// - /// * `Result, Error>` - If successful, returns an `Ok(Option)`. If an error occurs during the operation, returns an `Error`. - /// - /// # Errors - /// - /// This function will return an error if the Drive version is unknown. - pub fn fetch_next_protocol_version( - &self, - transaction: TransactionArg, - drive_version: &DriveVersion, - ) -> Result, Error> { - match drive_version - .methods - .platform_system - .protocol_version - .fetch_next_protocol_version - { - 0 => self.fetch_next_protocol_version_v0(transaction), - version => Err(Error::Drive(DriveError::UnknownVersionMismatch { - method: "fetch_next_protocol_version".to_string(), - known_versions: vec![0], - received: version, - })), - } - } -} diff --git a/packages/rs-drive/src/drive/system/protocol_version/fetch_next_protocol_version/v0/mod.rs b/packages/rs-drive/src/drive/system/protocol_version/fetch_next_protocol_version/v0/mod.rs deleted file mode 100644 index dcca2a014f..0000000000 --- a/packages/rs-drive/src/drive/system/protocol_version/fetch_next_protocol_version/v0/mod.rs +++ /dev/null @@ -1,42 +0,0 @@ -use crate::drive::system::misc_path; -use crate::drive::system::misc_tree_constants::NEXT_PROTOCOL_VERSION_STORAGE_KEY; -use crate::drive::Drive; -use crate::error::drive::DriveError; -use crate::error::Error; - -use dpp::util::deserializer::ProtocolVersion; - -use grovedb::TransactionArg; -use integer_encoding::VarInt; - -impl Drive { - /// Gets the next protocol version from the backing store - #[inline(always)] - pub(super) fn fetch_next_protocol_version_v0( - &self, - transaction: TransactionArg, - ) -> Result, Error> { - let misc_path = misc_path(); - self.grove - .get_raw_optional( - (&misc_path).into(), - NEXT_PROTOCOL_VERSION_STORAGE_KEY, - transaction, - ) - .unwrap() - .map_err(Error::GroveDB) - .map(|maybe_element| { - maybe_element - .map(|e| { - let bytes = e.as_item_bytes()?; - let Some((protocol_version, _)) = ProtocolVersion::decode_var(bytes) else { - return Err(Error::Drive(DriveError::CorruptedSerialization( - String::from("protocol version incorrectly serialized"), - ))); - }; - Ok(protocol_version) - }) - .transpose() - })? - } -} diff --git a/packages/rs-drive/src/drive/system/protocol_version/mod.rs b/packages/rs-drive/src/drive/system/protocol_version/mod.rs index 82b984d14b..779deab343 100644 --- a/packages/rs-drive/src/drive/system/protocol_version/mod.rs +++ b/packages/rs-drive/src/drive/system/protocol_version/mod.rs @@ -1,7 +1,6 @@ mod fetch_current_protocol_version; -mod fetch_next_protocol_version; - mod store_current_protocol_version; -mod set_next_protocol_version_operations; +/// Protocol Version Storage key +const PROTOCOL_VERSION_AUX_KEY: &[u8; 16] = b"protocol_version"; diff --git a/packages/rs-drive/src/drive/system/protocol_version/set_next_protocol_version_operations/mod.rs b/packages/rs-drive/src/drive/system/protocol_version/set_next_protocol_version_operations/mod.rs deleted file mode 100644 index b2c8cd31a9..0000000000 --- a/packages/rs-drive/src/drive/system/protocol_version/set_next_protocol_version_operations/mod.rs +++ /dev/null @@ -1,55 +0,0 @@ -mod v0; - -use crate::drive::Drive; -use crate::error::drive::DriveError; -use crate::error::Error; -use crate::fee::op::LowLevelDriveOperation; -use dpp::util::deserializer::ProtocolVersion; -use dpp::version::drive_versions::DriveVersion; -use grovedb::TransactionArg; - -impl Drive { - /// Sets the next protocol version - /// - /// # Arguments - /// - /// * `protocol_version` - A `ProtocolVersion` object representing the next protocol version. - /// * `transaction` - A `TransactionArg` object representing the transaction. - /// * `drive_operations` - A mutable reference to a vector of `LowLevelDriveOperation` objects. - /// * `drive_version` - A `DriveVersion` object representing the version of the Drive. - /// - /// # Returns - /// - /// * `Result<(), Error>` - If successful, returns an `Ok(())`. If an error occurs during the operation, returns an `Error`. - /// - /// # Errors - /// - /// This function will return an error if the version of the Drive is unknown. - // TODO: We should store it for epoch. Will be changed in upcoming PR - pub fn set_next_protocol_version_operations( - &self, - protocol_version: ProtocolVersion, - transaction: TransactionArg, - drive_operations: &mut Vec, - drive_version: &DriveVersion, - ) -> Result<(), Error> { - match drive_version - .methods - .platform_system - .protocol_version - .set_next_protocol_version_operations - { - 0 => self.set_next_protocol_version_operations_v0( - protocol_version, - transaction, - drive_operations, - drive_version, - ), - version => Err(Error::Drive(DriveError::UnknownVersionMismatch { - method: "set_next_protocol_version_operations".to_string(), - known_versions: vec![0], - received: version, - })), - } - } -} diff --git a/packages/rs-drive/src/drive/system/protocol_version/set_next_protocol_version_operations/v0/mod.rs b/packages/rs-drive/src/drive/system/protocol_version/set_next_protocol_version_operations/v0/mod.rs deleted file mode 100644 index 5bcd133eb5..0000000000 --- a/packages/rs-drive/src/drive/system/protocol_version/set_next_protocol_version_operations/v0/mod.rs +++ /dev/null @@ -1,36 +0,0 @@ -use crate::drive::grove_operations::BatchInsertApplyType; -use crate::drive::object_size_info::PathKeyElementInfo; -use crate::drive::system::misc_path; -use crate::drive::system::misc_tree_constants::NEXT_PROTOCOL_VERSION_STORAGE_KEY; -use crate::drive::Drive; -use crate::error::Error; -use crate::fee::op::LowLevelDriveOperation; -use dpp::util::deserializer::ProtocolVersion; -use dpp::version::drive_versions::DriveVersion; -use grovedb::{Element, TransactionArg}; -use integer_encoding::VarInt; - -impl Drive { - /// Sets the next protocol version - #[inline(always)] - pub(super) fn set_next_protocol_version_operations_v0( - &self, - protocol_version: ProtocolVersion, - transaction: TransactionArg, - drive_operations: &mut Vec, - drive_version: &DriveVersion, - ) -> Result<(), Error> { - self.batch_insert_if_changed_value( - PathKeyElementInfo::PathFixedSizeKeyRefElement(( - misc_path(), - NEXT_PROTOCOL_VERSION_STORAGE_KEY, - Element::new_item(protocol_version.encode_var_vec()), - )), - BatchInsertApplyType::StatefulBatchInsert, - transaction, - drive_operations, - drive_version, - )?; - Ok(()) - } -} diff --git a/packages/rs-drive/src/drive/system/protocol_version/store_current_protocol_version.rs b/packages/rs-drive/src/drive/system/protocol_version/store_current_protocol_version.rs index dd4b537a5a..c63987cd9b 100644 --- a/packages/rs-drive/src/drive/system/protocol_version/store_current_protocol_version.rs +++ b/packages/rs-drive/src/drive/system/protocol_version/store_current_protocol_version.rs @@ -1,16 +1,12 @@ -use crate::drive::object_size_info::PathKeyElementInfo; -use crate::drive::system::misc_path; -use crate::drive::system::misc_tree_constants::PROTOCOL_VERSION_STORAGE_KEY; +use crate::drive::system::protocol_version::PROTOCOL_VERSION_AUX_KEY; use crate::drive::Drive; use crate::error::Error; -use crate::fee::op::LowLevelDriveOperation; use dpp::util::deserializer::ProtocolVersion; -use dpp::version::drive_versions::DriveVersion; -use grovedb::{Element, TransactionArg}; +use grovedb::TransactionArg; use integer_encoding::VarInt; impl Drive { - /// Store the current protocol version in grovedb storage + /// Store the current protocol version in aux storage /// /// !!!DON'T CHANGE!!!! /// This function should never be changed !!! since it must always be compatible @@ -19,59 +15,15 @@ impl Drive { &self, protocol_version: ProtocolVersion, transaction: TransactionArg, - drive_version: &DriveVersion, ) -> Result<(), Error> { - let mut batch_operations = vec![]; - - self.set_current_protocol_version_operations( - protocol_version, - &mut batch_operations, - drive_version, - )?; - - self.apply_batch_low_level_drive_operations( - None, - transaction, - batch_operations, - &mut vec![], - drive_version, - ) - } - - /// Sets the current protocol version operations to batch - /// - /// !!!DON'T CHANGE!!!! - /// This function should never be changed !!! since it must always be compatible - /// with fetch_current_protocol_version which is should never be changed. - /// - /// # Arguments - /// - /// * `protocol_version` - A `ProtocolVersion` object representing the current protocol version. - /// * `transaction` - A `TransactionArg` object representing the transaction. - /// * `drive_operations` - A mutable reference to a vector of `LowLevelDriveOperation` objects. - /// * `drive_version` - A `DriveVersion` object representing the version of the Drive. - /// - /// # Returns - /// - /// * `Result<(), Error>` - If successful, returns an `Ok(())`. If an error occurs during the operation, returns an `Error`. - /// - /// # Errors - /// - /// This function will return an error if the version of the Drive is unknown. - pub fn set_current_protocol_version_operations( - &self, - protocol_version: ProtocolVersion, - drive_operations: &mut Vec, - drive_version: &DriveVersion, - ) -> Result<(), Error> { - self.batch_insert( - PathKeyElementInfo::PathFixedSizeKeyRefElement(( - misc_path(), - PROTOCOL_VERSION_STORAGE_KEY, - Element::new_item(protocol_version.encode_var_vec()), - )), - drive_operations, - drive_version, - ) + self.grove + .put_aux( + PROTOCOL_VERSION_AUX_KEY, + &protocol_version.encode_var_vec(), + None, + transaction, + ) + .unwrap() + .map_err(Error::GroveDB) } } diff --git a/packages/rs-drive/src/drive/verify/system/verify_epoch_infos/v0/mod.rs b/packages/rs-drive/src/drive/verify/system/verify_epoch_infos/v0/mod.rs index beaaf3f69e..23ff53e6f4 100644 --- a/packages/rs-drive/src/drive/verify/system/verify_epoch_infos/v0/mod.rs +++ b/packages/rs-drive/src/drive/verify/system/verify_epoch_infos/v0/mod.rs @@ -5,7 +5,8 @@ use crate::error::drive::DriveError; use crate::error::proof::ProofError; use crate::error::Error; use crate::fee_pools::epochs::epoch_key_constants::{ - KEY_FEE_MULTIPLIER, KEY_START_BLOCK_CORE_HEIGHT, KEY_START_BLOCK_HEIGHT, KEY_START_TIME, + KEY_FEE_MULTIPLIER, KEY_PROTOCOL_VERSION, KEY_START_BLOCK_CORE_HEIGHT, KEY_START_BLOCK_HEIGHT, + KEY_START_TIME, }; use crate::query::{Query, QueryItem}; use dpp::block::epoch::{EpochIndex, EPOCH_KEY_OFFSET}; @@ -62,6 +63,7 @@ impl Drive { KEY_START_BLOCK_HEIGHT.to_vec(), KEY_START_BLOCK_CORE_HEIGHT.to_vec(), KEY_FEE_MULTIPLIER.to_vec(), + KEY_PROTOCOL_VERSION.to_vec(), ]); let mut query = if ascending { Query::new_single_query_item(QueryItem::RangeFrom( @@ -76,7 +78,8 @@ impl Drive { query.set_subquery(subquery); let path_query = PathQuery::new( pools_vec_path(), - SizedQuery::new(query, Some(count * 4), None), + // The multiplier must be equal to requested keys count + SizedQuery::new(query, Some(count * 5), None), ); let (root_hash, elements) = GroveDb::verify_query(proof, &path_query)?; @@ -213,6 +216,27 @@ impl Drive { let fee_multiplier = f64::from_be_bytes(fee_multiplier_bytes); + let protocol_version_element = inner_map.get(&KEY_PROTOCOL_VERSION.to_vec())?; + + let Some(Element::Item(encoded_protocol_version, _)) = protocol_version_element + else { + return Some(Err(Error::Drive(DriveError::UnexpectedElementType( + "protocol version must be an item", + )))); + }; + + let protocol_version_bytes: [u8; 4] = + match encoded_protocol_version.as_slice().try_into().map_err(|_| { + Error::Drive(DriveError::CorruptedSerialization( + "protocol version must be 4 bytes for a u32".to_string(), + )) + }) { + Ok(value) => value, + Err(e) => return Some(Err(e)), + }; + + let protocol_version = u32::from_be_bytes(protocol_version_bytes); + // Construct the ExtendedEpochInfo Some(Ok(ExtendedEpochInfoV0 { index: epoch_index, @@ -220,6 +244,7 @@ impl Drive { first_block_height, first_core_block_height, fee_multiplier, + protocol_version, } .into())) }) diff --git a/packages/rs-drive/src/fee_pools/epochs/epoch_key_constants.rs b/packages/rs-drive/src/fee_pools/epochs/epoch_key_constants.rs index 208239c1d9..da7dfab733 100644 --- a/packages/rs-drive/src/fee_pools/epochs/epoch_key_constants.rs +++ b/packages/rs-drive/src/fee_pools/epochs/epoch_key_constants.rs @@ -4,6 +4,8 @@ pub const KEY_POOL_PROCESSING_FEES: &[u8; 1] = b"p"; pub const KEY_POOL_STORAGE_FEES: &[u8; 1] = b"s"; /// Start time key pub const KEY_START_TIME: &[u8; 1] = b"t"; +/// Epoch's protocol version key +pub const KEY_PROTOCOL_VERSION: &[u8; 1] = b"v"; /// Start block height key pub const KEY_START_BLOCK_HEIGHT: &[u8; 1] = b"h"; /// Start block core chain locked height key diff --git a/packages/rs-drive/src/fee_pools/epochs/operations_factory.rs b/packages/rs-drive/src/fee_pools/epochs/operations_factory.rs index a3b504b4cb..852bb58338 100644 --- a/packages/rs-drive/src/fee_pools/epochs/operations_factory.rs +++ b/packages/rs-drive/src/fee_pools/epochs/operations_factory.rs @@ -40,12 +40,13 @@ use crate::error::Error; use crate::drive::batch::grovedb_op_batch::GroveDbOpBatchV0Methods; use crate::fee_pools::epochs::epoch_key_constants::{ KEY_FEE_MULTIPLIER, KEY_POOL_PROCESSING_FEES, KEY_POOL_STORAGE_FEES, KEY_PROPOSERS, - KEY_START_BLOCK_CORE_HEIGHT, KEY_START_BLOCK_HEIGHT, KEY_START_TIME, + KEY_PROTOCOL_VERSION, KEY_START_BLOCK_CORE_HEIGHT, KEY_START_BLOCK_HEIGHT, KEY_START_TIME, }; use crate::fee_pools::epochs::paths::EpochProposers; use dpp::balances::credits::Creditable; use dpp::block::epoch::Epoch; use dpp::fee::Credits; +use dpp::util::deserializer::ProtocolVersion; use dpp::version::PlatformVersion; use grovedb::batch::GroveDbOp; use grovedb::{Element, TransactionArg}; @@ -77,6 +78,8 @@ pub trait EpochOperations { ); /// Adds to the groveDB op batch operations signifying that the epoch distribution fees were paid out. fn add_mark_as_paid_operations(&self, batch: &mut GroveDbOpBatch); + /// Update Epoch's protocol version + fn update_protocol_version_operation(&self, protocol_version: ProtocolVersion) -> GroveDbOp; /// Returns a groveDB op which updates the epoch start time. fn update_start_time_operation(&self, time_ms: u64) -> GroveDbOp; /// Returns a groveDB op which updates the epoch start block height. @@ -192,6 +195,15 @@ impl EpochOperations for Epoch { batch.push(self.delete_processing_credits_for_distribution_operation()); } + /// Returns a groveDB op which updates the epoch start time. + fn update_protocol_version_operation(&self, protocol_version: ProtocolVersion) -> GroveDbOp { + GroveDbOp::insert_op( + self.get_path_vec(), + KEY_PROTOCOL_VERSION.to_vec(), + Element::Item(protocol_version.to_be_bytes().to_vec(), None), + ) + } + /// Returns a groveDB op which updates the epoch start time. fn update_start_time_operation(&self, time_ms: u64) -> GroveDbOp { GroveDbOp::insert_op( diff --git a/packages/rs-drive/src/fee_pools/mod.rs b/packages/rs-drive/src/fee_pools/mod.rs index e6e74ccb33..438368c4fb 100644 --- a/packages/rs-drive/src/fee_pools/mod.rs +++ b/packages/rs-drive/src/fee_pools/mod.rs @@ -49,6 +49,7 @@ use dpp::block::epoch::{Epoch, EpochIndex}; use dpp::fee::epoch::{perpetual_storage_epochs, GENESIS_EPOCH_INDEX}; #[cfg(feature = "full")] use dpp::fee::Credits; +use dpp::util::deserializer::ProtocolVersion; #[cfg(feature = "full")] use grovedb::batch::GroveDbOp; #[cfg(feature = "full")] @@ -67,6 +68,7 @@ pub mod epochs_root_tree_key_constants; pub fn add_create_fee_pool_trees_operations( batch: &mut GroveDbOpBatch, epochs_per_era: u16, + protocol_version: ProtocolVersion, ) -> Result<(), Error> { // Init storage credit pool batch.push(update_storage_fee_distribution_pool_operation(0)?); @@ -84,6 +86,11 @@ pub fn add_create_fee_pool_trees_operations( epoch.add_init_empty_operations(batch)?; } + let genesis_epoch = Epoch::new(GENESIS_EPOCH_INDEX)?; + + // Initial protocol version for genesis epoch + batch.push(genesis_epoch.update_protocol_version_operation(protocol_version)); + Ok(()) } diff --git a/packages/rs-platform-version/src/version/drive_versions.rs b/packages/rs-platform-version/src/version/drive_versions.rs index 4b8f2ef2ee..cc98f61f58 100644 --- a/packages/rs-platform-version/src/version/drive_versions.rs +++ b/packages/rs-platform-version/src/version/drive_versions.rs @@ -203,7 +203,6 @@ pub struct DriveContractCostsMethodVersions { #[derive(Clone, Debug, Default)] pub struct DrivePlatformSystemMethodVersions { - pub protocol_version: DriveSystemProtocolVersionMethodVersions, pub estimation_costs: DriveSystemEstimationCostsMethodVersions, } @@ -224,12 +223,6 @@ pub struct DriveBatchOperationsMethodVersion { pub apply_drive_operations: FeatureVersion, } -#[derive(Clone, Debug, Default)] -pub struct DriveSystemProtocolVersionMethodVersions { - pub fetch_next_protocol_version: FeatureVersion, - pub set_next_protocol_version_operations: FeatureVersion, -} - #[derive(Clone, Debug, Default)] pub struct DriveSystemEstimationCostsMethodVersions { pub for_total_system_credits_update: FeatureVersion, @@ -404,7 +397,6 @@ pub struct DriveCreditPoolStorageFeeDistributionPoolMethodVersions { #[derive(Clone, Debug, Default)] pub struct DriveProtocolUpgradeVersions { pub clear_version_information: FeatureVersion, - pub change_to_new_version_and_clear_version_information: FeatureVersion, pub fetch_versions_with_counter: FeatureVersion, pub fetch_proved_versions_with_counter: FeatureVersion, pub fetch_validator_version_votes: FeatureVersion, diff --git a/packages/rs-platform-version/src/version/mocks/v2_test.rs b/packages/rs-platform-version/src/version/mocks/v2_test.rs index 9b53f611a3..5183a86507 100644 --- a/packages/rs-platform-version/src/version/mocks/v2_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v2_test.rs @@ -61,10 +61,10 @@ use crate::version::drive_versions::{ DrivePlatformSystemMethodVersions, DriveProtocolUpgradeVersions, DriveProveMethodVersions, DriveStateTransitionMethodVersions, DriveStateTransitionOperationMethodVersions, DriveStructureVersion, DriveSystemEstimationCostsMethodVersions, - DriveSystemProtocolVersionMethodVersions, DriveVerifyContractMethodVersions, - DriveVerifyDocumentMethodVersions, DriveVerifyIdentityMethodVersions, - DriveVerifyMethodVersions, DriveVerifySingleDocumentMethodVersions, - DriveVerifyStateTransitionMethodVersions, DriveVerifySystemMethodVersions, DriveVersion, + DriveVerifyContractMethodVersions, DriveVerifyDocumentMethodVersions, + DriveVerifyIdentityMethodVersions, DriveVerifyMethodVersions, + DriveVerifySingleDocumentMethodVersions, DriveVerifyStateTransitionMethodVersions, + DriveVerifySystemMethodVersions, DriveVersion, }; use crate::version::fee::v1::FEE_VERSION1; use crate::version::mocks::TEST_PROTOCOL_VERSION_SHIFT_BYTES; @@ -141,7 +141,6 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { }, protocol_upgrade: DriveProtocolUpgradeVersions { clear_version_information: 0, - change_to_new_version_and_clear_version_information: 0, fetch_versions_with_counter: 0, fetch_proved_versions_with_counter: 0, fetch_validator_version_votes: 0, @@ -400,10 +399,6 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { }, }, platform_system: DrivePlatformSystemMethodVersions { - protocol_version: DriveSystemProtocolVersionMethodVersions { - fetch_next_protocol_version: 0, - set_next_protocol_version_operations: 0, - }, estimation_costs: DriveSystemEstimationCostsMethodVersions { for_total_system_credits_update: 0, }, diff --git a/packages/rs-platform-version/src/version/mocks/v3_test.rs b/packages/rs-platform-version/src/version/mocks/v3_test.rs index cc2c059fae..df1885242a 100644 --- a/packages/rs-platform-version/src/version/mocks/v3_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v3_test.rs @@ -61,10 +61,10 @@ use crate::version::drive_versions::{ DrivePlatformSystemMethodVersions, DriveProtocolUpgradeVersions, DriveProveMethodVersions, DriveStateTransitionMethodVersions, DriveStateTransitionOperationMethodVersions, DriveStructureVersion, DriveSystemEstimationCostsMethodVersions, - DriveSystemProtocolVersionMethodVersions, DriveVerifyContractMethodVersions, - DriveVerifyDocumentMethodVersions, DriveVerifyIdentityMethodVersions, - DriveVerifyMethodVersions, DriveVerifySingleDocumentMethodVersions, - DriveVerifyStateTransitionMethodVersions, DriveVerifySystemMethodVersions, DriveVersion, + DriveVerifyContractMethodVersions, DriveVerifyDocumentMethodVersions, + DriveVerifyIdentityMethodVersions, DriveVerifyMethodVersions, + DriveVerifySingleDocumentMethodVersions, DriveVerifyStateTransitionMethodVersions, + DriveVerifySystemMethodVersions, DriveVersion, }; use crate::version::fee::v1::FEE_VERSION1; use crate::version::mocks::TEST_PROTOCOL_VERSION_SHIFT_BYTES; @@ -141,7 +141,6 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { }, protocol_upgrade: DriveProtocolUpgradeVersions { clear_version_information: 0, - change_to_new_version_and_clear_version_information: 0, fetch_versions_with_counter: 0, fetch_proved_versions_with_counter: 0, fetch_validator_version_votes: 0, @@ -408,10 +407,6 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { }, }, platform_system: DrivePlatformSystemMethodVersions { - protocol_version: DriveSystemProtocolVersionMethodVersions { - fetch_next_protocol_version: 0, - set_next_protocol_version_operations: 0, - }, estimation_costs: DriveSystemEstimationCostsMethodVersions { for_total_system_credits_update: 0, }, diff --git a/packages/rs-platform-version/src/version/v1.rs b/packages/rs-platform-version/src/version/v1.rs index bd7082b08e..037424b976 100644 --- a/packages/rs-platform-version/src/version/v1.rs +++ b/packages/rs-platform-version/src/version/v1.rs @@ -61,10 +61,10 @@ use crate::version::drive_versions::{ DrivePlatformSystemMethodVersions, DriveProtocolUpgradeVersions, DriveProveMethodVersions, DriveStateTransitionMethodVersions, DriveStateTransitionOperationMethodVersions, DriveStructureVersion, DriveSystemEstimationCostsMethodVersions, - DriveSystemProtocolVersionMethodVersions, DriveVerifyContractMethodVersions, - DriveVerifyDocumentMethodVersions, DriveVerifyIdentityMethodVersions, - DriveVerifyMethodVersions, DriveVerifySingleDocumentMethodVersions, - DriveVerifyStateTransitionMethodVersions, DriveVerifySystemMethodVersions, DriveVersion, + DriveVerifyContractMethodVersions, DriveVerifyDocumentMethodVersions, + DriveVerifyIdentityMethodVersions, DriveVerifyMethodVersions, + DriveVerifySingleDocumentMethodVersions, DriveVerifyStateTransitionMethodVersions, + DriveVerifySystemMethodVersions, DriveVersion, }; use crate::version::fee::v1::FEE_VERSION1; use crate::version::protocol_version::{FeatureVersionBounds, PlatformVersion}; @@ -140,7 +140,6 @@ pub const PLATFORM_V1: PlatformVersion = PlatformVersion { }, protocol_upgrade: DriveProtocolUpgradeVersions { clear_version_information: 0, - change_to_new_version_and_clear_version_information: 0, fetch_versions_with_counter: 0, fetch_proved_versions_with_counter: 0, fetch_validator_version_votes: 0, @@ -399,10 +398,6 @@ pub const PLATFORM_V1: PlatformVersion = PlatformVersion { }, }, platform_system: DrivePlatformSystemMethodVersions { - protocol_version: DriveSystemProtocolVersionMethodVersions { - fetch_next_protocol_version: 0, - set_next_protocol_version_operations: 0, - }, estimation_costs: DriveSystemEstimationCostsMethodVersions { for_total_system_credits_update: 0, }, diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_2024-03-18T17:30:02.266794754Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_2024-04-04T11:53:53.893159000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json similarity index 78% rename from packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_2024-03-18T17:30:02.266794754Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json rename to packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_2024-04-04T11:53:53.893159000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json index 0a8e8600ca09a700408f8f9ba5b813e02fd3a1c0..6bf02b5db604f4523f6e312c977079d471fce36f 100644 GIT binary patch literal 21988 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 literal 21965 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 Qca44KImI6aWAK delta 2350 zcmZ8jT}%{L6wa~>y9(@`JBwpd>kiViK@t#@3KX+LDQzvLuCd}DcDG3rnpnG7UaXA* z2~C?e2GAQgwGRs~M58Itn2NEMm6((!71s8lAwIAqK4}`3w3@aiW&52wrZIguo4Gsp zo}cf0-?@{WIrPoVLxVr~YHI3h&i+{LZK$m~`$y&4>bm-^4S23=P!*onJ+)W5Jk=g$ zT-ZWl%x}>AX;aefV*yFgSEWI#9azRrV;NlUmns#M)ZN894qGOr&if6ul81MTeo4+s z&`=W(3>rUy?E_6khD!NN%1oLDC6D3Ecn5YZ7lvG4)cr7EC~-lukv)oF<1^U6PipiN zL)m{Le0@NwoLNc7H+#iY?xOcvo~lj?mE9?>t|@u4h&Dg|`C$35 z0+=5bfUSY8g%!ezV08Z5S2YSeKQmGcP|Z8py32dSsrw8?o+ z3hLcy?NHSgzkvmw>=4wsP++U}O}0u`2sN1zbhF+H|Mz3ViAtX|sLAmOO8=E-3^@UV zCN>H*Viu6Cz5yr`_Y0(6sz#rr)I)U1{8Q|dJ+ z)dd`rXh2UH4pd1vs%pRi_NE-$9B#mw(IV`OpGM3kbX(nAGANdVhw(~mfAA4nJ21zM ziDKzEJ}w^nB^-7p3d59XwIm5AWaxHN_;d7jz7j#=@2)Xux+Ns1`d_h*dT8k@a3j0Z zpj-#o5DnmMRRK1O1>_v;!wC_CtCdFNB-X=yqR-?kL9{MZikFC3hP~MjijcrA;IkU_ z%cgZ@V25l*`96@Tc@}iJ_`D2(`5Ne@zIhJI0d^AWeBL zU(m=Th@JC=Db|9*IZ3r;KWO_1jflJq=BMwYjG%)G?hX~np$K*@w;<8w5v1K&B-I_{ z!TlMEp*9U9cx^*nA*nLQQQsoYX6sRw?p@}fCDoBlg2o>sM0Y!0?w-ZT>3jI;K89ud zO@wW_VY)P-)Itbi3z+0wM%j@$xSa$y#m^>9Jj?w)44kr!z-3^}gb<9 z0OEF+!FBvs^gmLD^ke;4rVbVuD!PFMjWmv4N7G9E=DCjr4O~HWi~Tqpxr`q>1ouf@ zw$?Lm?>qwkAaYohg8zvxY}#@LoSOV{BRN+BVM>mLN&&SPI#mK)a5JaRBWBee_~T@T z+kippC%4fmwS@U{50%*af*`#l%vph^D~@5o`*#!iyFJPYY^lStr#5XsT%y zo&~q(`=OESMU*<%5 zpwCbfqpexaJ)lGu+Y$@Rj6R%lqq0nOFJkvmf0mWVO8^I#BY1Ge@DGUL(&?FcbS$yW zU-}gE6}O5dU2C)IR8mR06GZmQ-vJFyQb%V}4DSM3P0fNxKC>)Jf$o zfkYb5$a=ic49wmIM>s3oS0U;x^9xt8P^MH%m+qWI@1TaHDZGE1qD*Nmw_f) zhU?_srCTkGJs>`D0*Gi{X&GeqS!EP1*Iq!vSS#Xi)p|hd2OeqqQ-Qw{+%Jdt5zFvy zt*xWCV%BcT&cLniiYt1)iFg>gV@_WKxKRXY9&u;+-qDj%&&S(w)Y-cqY`K9mdJgGf zJiUM{_(MVK^oNZzju%z AjsO4v diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-2ca9a9abc345b3e592538a9ceb7bc8321622c21e4a2874ab7e481c6267201326.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-2ca9a9abc345b3e592538a9ceb7bc8321622c21e4a2874ab7e481c6267201326.json new file mode 100644 index 0000000000..fb09519887 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-2ca9a9abc345b3e592538a9ceb7bc8321622c21e4a2874ab7e481c6267201326.json @@ -0,0 +1 @@ +[185,34,149,202,37,202,240,51,209,243,187,197,33,87,122,32,22,127,83,1,88,217,241,161,169,150,46,177,216,239,225,34,200,117,206,68,9,199,159,124,0,183,99,59,149,195,154,31] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json deleted file mode 100644 index febf179550..0000000000 --- a/packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json +++ /dev/null @@ -1 +0,0 @@ -[140,166,219,3,87,141,69,160,158,153,22,179,34,58,44,164,191,240,111,196,114,27,180,199,89,247,126,103,234,93,92,229,246,192,127,27,164,78,63,100,86,79,205,231,251,65,175,178] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_2024-03-18T17:30:02.275436110Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_2024-04-04T11:53:53.893143000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json similarity index 78% rename from packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_2024-03-18T17:30:02.275436110Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json rename to packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_2024-04-04T11:53:53.893143000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json index 0a8e8600ca09a700408f8f9ba5b813e02fd3a1c0..6bf02b5db604f4523f6e312c977079d471fce36f 100644 GIT binary patch literal 21988 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 literal 21965 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 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-2ca9a9abc345b3e592538a9ceb7bc8321622c21e4a2874ab7e481c6267201326.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-2ca9a9abc345b3e592538a9ceb7bc8321622c21e4a2874ab7e481c6267201326.json new file mode 100644 index 0000000000..fb09519887 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-2ca9a9abc345b3e592538a9ceb7bc8321622c21e4a2874ab7e481c6267201326.json @@ -0,0 +1 @@ +[185,34,149,202,37,202,240,51,209,243,187,197,33,87,122,32,22,127,83,1,88,217,241,161,169,150,46,177,216,239,225,34,200,117,206,68,9,199,159,124,0,183,99,59,149,195,154,31] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json deleted file mode 100644 index febf179550..0000000000 --- a/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json +++ /dev/null @@ -1 +0,0 @@ -[140,166,219,3,87,141,69,160,158,153,22,179,34,58,44,164,191,240,111,196,114,27,180,199,89,247,126,103,234,93,92,229,246,192,127,27,164,78,63,100,86,79,205,231,251,65,175,178] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_2024-03-18T17:30:02.315343769Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_2024-04-04T11:53:53.893142000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json similarity index 78% rename from packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_2024-03-18T17:30:02.315343769Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json rename to packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_2024-04-04T11:53:53.893142000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json index 0a8e8600ca09a700408f8f9ba5b813e02fd3a1c0..6bf02b5db604f4523f6e312c977079d471fce36f 100644 GIT binary patch literal 21988 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 literal 21965 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 Date: Thu, 4 Apr 2024 22:45:27 +0700 Subject: [PATCH 123/191] chore(release): update changelog and bump version to 1.0.0-dev.10 (#1806) --- CHANGELOG.md | 50 +++++++++++++++++++ Cargo.lock | 46 ++++++++--------- package.json | 2 +- packages/bench-suite/package.json | 2 +- packages/dapi-grpc/Cargo.toml | 2 +- packages/dapi-grpc/package.json | 2 +- packages/dapi/package.json | 2 +- packages/dash-spv/package.json | 2 +- packages/dashmate/package.json | 2 +- packages/dashpay-contract/Cargo.toml | 2 +- packages/dashpay-contract/package.json | 2 +- packages/data-contracts/Cargo.toml | 2 +- packages/dpns-contract/Cargo.toml | 2 +- packages/dpns-contract/package.json | 2 +- packages/feature-flags-contract/Cargo.toml | 2 +- packages/feature-flags-contract/package.json | 2 +- packages/js-dapi-client/package.json | 2 +- packages/js-dash-sdk/package.json | 2 +- packages/js-grpc-common/package.json | 2 +- .../Cargo.toml | 2 +- .../package.json | 2 +- packages/platform-test-suite/package.json | 2 +- packages/rs-dapi-client/Cargo.toml | 2 +- packages/rs-dapi-grpc-macros/Cargo.toml | 2 +- packages/rs-dpp/Cargo.toml | 2 +- packages/rs-drive-abci/Cargo.toml | 2 +- packages/rs-drive-proof-verifier/Cargo.toml | 2 +- packages/rs-drive/Cargo.toml | 2 +- .../Cargo.toml | 2 +- packages/rs-platform-serialization/Cargo.toml | 2 +- .../rs-platform-value-convertible/Cargo.toml | 2 +- packages/rs-platform-value/Cargo.toml | 2 +- packages/rs-platform-version/Cargo.toml | 2 +- packages/rs-platform-versioning/Cargo.toml | 2 +- packages/rs-sdk/Cargo.toml | 2 +- packages/simple-signer/Cargo.toml | 2 +- packages/strategy-tests/Cargo.toml | 2 +- packages/wallet-lib/package.json | 2 +- packages/wasm-dpp/Cargo.toml | 2 +- packages/wasm-dpp/package.json | 2 +- packages/withdrawals-contract/Cargo.toml | 2 +- packages/withdrawals-contract/package.json | 2 +- 42 files changed, 113 insertions(+), 63 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ab366eab7e..e1e18ecbda 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,53 @@ +## [1.0.0-dev.10](https://github.com/dashpay/platform/compare/v1.0.0-dev.9...v1.0.0-dev.10) (2024-04-04) + + +### ⚠ BREAKING CHANGES + +There are multiple breaking changes that make previously created state invalid: +* **drive:** addition key-value in epoch trees (#1778) +* **platform:** processing costs were updated for some state transitions (#1805, #1800) +* **drive:** now we count and persist a version proposal vote on the epoch change (#1769) +* **drive:** protocol version for the first block of an epoch might be different (#1769) +* **platform:** ST validation was changed, as well as some constants (#1796, #1795) +* **dpp:** document type name must be 1 to 64 alphanumeric chars and "_", or "-" (#1798) +* **platform:** max state transition is 20 kB (#1792) + +### Features + +* **dpp:** validate document type name ([#1798](https://github.com/dashpay/platform/issues/1798)) +* **drive-abci:** better processing costs of state transitions (no schema processing improvements) ([#1800](https://github.com/dashpay/platform/issues/1800)) +* **drive:** provide protocol version in epoch info query ([#1778](https://github.com/dashpay/platform/issues/1778)) +* pass asset lock vector rather than callback in strategies +* **platform:** improved state processing fees ([#1805](https://github.com/dashpay/platform/issues/1805)) +* **platform:** mitigate issues of asset lock based transitions ([#1796](https://github.com/dashpay/platform/issues/1796)) +* **platform:** various document validation improvements ([#1795](https://github.com/dashpay/platform/issues/1795)) +* **strategy-tests:** add extra_keys field for StartIdentities and use random identities for transfers ([#1794](https://github.com/dashpay/platform/issues/1794)) + + +### Bug Fixes + +* **drive:** no longer build full grovedb when using verify feature ([#1804](https://github.com/dashpay/platform/issues/1804)) +* **drive:** versioning issues on epoch change ([#1769](https://github.com/dashpay/platform/issues/1769)) +* **platform:** max state transition size ([#1792](https://github.com/dashpay/platform/issues/1792)) +* **sdk:** not bumping nonce on contract creation ([#1801](https://github.com/dashpay/platform/issues/1801)) +* state transition already in chain error on low credit transfer amount ([#1797](https://github.com/dashpay/platform/issues/1797)) +* **strategy-tests:** default identity nonce and document op contract id ([#1777](https://github.com/dashpay/platform/issues/1777)) + + +### Performance Improvements + +* **platform:** use inline on versioned functions ([#1793](https://github.com/dashpay/platform/issues/1793)) + + +### Tests + +* added a test registering many random contracts in strategy tests ([#1791](https://github.com/dashpay/platform/issues/1791)) + + +### Miscellaneous Chores + +* **sdk:** export various libraries in rs-sdk ([#1802](https://github.com/dashpay/platform/issues/1802)) + ## [1.0.0-dev.9](https://github.com/dashpay/platform/compare/v1.0.0-dev.8...v1.0.0-dev.9) (2024-03-19) diff --git a/Cargo.lock b/Cargo.lock index 0a5187cd69..339360ad00 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1002,7 +1002,7 @@ dependencies = [ [[package]] name = "dapi-grpc" -version = "1.0.0-dev.9" +version = "1.0.0-dev.10" dependencies = [ "dapi-grpc-macros", "futures-core", @@ -1018,7 +1018,7 @@ dependencies = [ [[package]] name = "dapi-grpc-macros" -version = "1.0.0-dev.9" +version = "1.0.0-dev.10" dependencies = [ "dapi-grpc", "heck 0.4.1", @@ -1124,7 +1124,7 @@ dependencies = [ [[package]] name = "dashpay-contract" -version = "1.0.0-dev.9" +version = "1.0.0-dev.10" dependencies = [ "platform-value", "platform-version", @@ -1134,7 +1134,7 @@ dependencies = [ [[package]] name = "data-contracts" -version = "1.0.0-dev.9" +version = "1.0.0-dev.10" dependencies = [ "dashpay-contract", "dpns-contract", @@ -1227,7 +1227,7 @@ checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" [[package]] name = "dpns-contract" -version = "1.0.0-dev.9" +version = "1.0.0-dev.10" dependencies = [ "platform-value", "platform-version", @@ -1237,7 +1237,7 @@ dependencies = [ [[package]] name = "dpp" -version = "1.0.0-dev.9" +version = "1.0.0-dev.10" dependencies = [ "anyhow", "async-trait", @@ -1288,7 +1288,7 @@ dependencies = [ [[package]] name = "drive" -version = "1.0.0-dev.9" +version = "1.0.0-dev.10" dependencies = [ "anyhow", "arc-swap", @@ -1325,7 +1325,7 @@ dependencies = [ [[package]] name = "drive-abci" -version = "1.0.0-dev.9" +version = "1.0.0-dev.10" dependencies = [ "arc-swap", "async-trait", @@ -1380,7 +1380,7 @@ dependencies = [ [[package]] name = "drive-proof-verifier" -version = "1.0.0-dev.9" +version = "1.0.0-dev.10" dependencies = [ "dapi-grpc", "dpp", @@ -1581,7 +1581,7 @@ checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984" [[package]] name = "feature-flags-contract" -version = "1.0.0-dev.9" +version = "1.0.0-dev.10" dependencies = [ "platform-value", "platform-version", @@ -2451,7 +2451,7 @@ dependencies = [ [[package]] name = "masternode-reward-shares-contract" -version = "1.0.0-dev.9" +version = "1.0.0-dev.10" dependencies = [ "platform-value", "platform-version", @@ -2932,7 +2932,7 @@ checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "platform-serialization" -version = "1.0.0-dev.9" +version = "1.0.0-dev.10" dependencies = [ "bincode 2.0.0-rc.3", "platform-version", @@ -2940,7 +2940,7 @@ dependencies = [ [[package]] name = "platform-serialization-derive" -version = "1.0.0-dev.9" +version = "1.0.0-dev.10" dependencies = [ "proc-macro2", "quote", @@ -2950,7 +2950,7 @@ dependencies = [ [[package]] name = "platform-value" -version = "1.0.0-dev.9" +version = "1.0.0-dev.10" dependencies = [ "base64 0.13.1", "bincode 2.0.0-rc.3", @@ -2971,7 +2971,7 @@ dependencies = [ [[package]] name = "platform-value-convertible" -version = "1.0.0-dev.9" +version = "1.0.0-dev.10" dependencies = [ "quote", "syn 2.0.55", @@ -2979,14 +2979,14 @@ dependencies = [ [[package]] name = "platform-version" -version = "1.0.0-dev.9" +version = "1.0.0-dev.10" dependencies = [ "thiserror", ] [[package]] name = "platform-versioning" -version = "1.0.0-dev.9" +version = "1.0.0-dev.10" dependencies = [ "proc-macro2", "quote", @@ -3529,7 +3529,7 @@ dependencies = [ [[package]] name = "rs-dapi-client" -version = "1.0.0-dev.9" +version = "1.0.0-dev.10" dependencies = [ "backon", "chrono", @@ -3546,7 +3546,7 @@ dependencies = [ [[package]] name = "rs-sdk" -version = "1.0.0-dev.9" +version = "1.0.0-dev.10" dependencies = [ "async-trait", "base64 0.21.7", @@ -4013,7 +4013,7 @@ checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" [[package]] name = "simple-signer" -version = "1.0.0-dev.9" +version = "1.0.0-dev.10" dependencies = [ "anyhow", "bincode 2.0.0-rc.3", @@ -4104,7 +4104,7 @@ dependencies = [ [[package]] name = "strategy-tests" -version = "1.0.0-dev.9" +version = "1.0.0-dev.10" dependencies = [ "bincode 2.0.0-rc.3", "dpp", @@ -5029,7 +5029,7 @@ checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93" [[package]] name = "wasm-dpp" -version = "1.0.0-dev.9" +version = "1.0.0-dev.10" dependencies = [ "anyhow", "async-trait", @@ -5274,7 +5274,7 @@ dependencies = [ [[package]] name = "withdrawals-contract" -version = "1.0.0-dev.9" +version = "1.0.0-dev.10" dependencies = [ "num_enum", "platform-value", diff --git a/package.json b/package.json index 6fd706d8b3..5df279e3cf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/platform", - "version": "1.0.0-dev.9", + "version": "1.0.0-dev.10", "private": true, "scripts": { "setup": "yarn install && yarn run build && yarn run configure", diff --git a/packages/bench-suite/package.json b/packages/bench-suite/package.json index f1bbe641b0..07449ac092 100644 --- a/packages/bench-suite/package.json +++ b/packages/bench-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/bench-suite", "private": true, - "version": "1.0.0-dev.9", + "version": "1.0.0-dev.10", "description": "Dash Platform benchmark tool", "scripts": { "bench": "node ./bin/bench.js", diff --git a/packages/dapi-grpc/Cargo.toml b/packages/dapi-grpc/Cargo.toml index c4525aa878..69a7be546e 100644 --- a/packages/dapi-grpc/Cargo.toml +++ b/packages/dapi-grpc/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc" description = "GRPC client for Dash Platform" -version = "1.0.0-dev.9" +version = "1.0.0-dev.10" authors = [ "Samuel Westrich ", "Igor Markin ", diff --git a/packages/dapi-grpc/package.json b/packages/dapi-grpc/package.json index 7939dcfc11..c89b7925c0 100644 --- a/packages/dapi-grpc/package.json +++ b/packages/dapi-grpc/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-grpc", - "version": "1.0.0-dev.9", + "version": "1.0.0-dev.10", "description": "DAPI GRPC definition file and generated clients", "browser": "browser.js", "main": "node.js", diff --git a/packages/dapi/package.json b/packages/dapi/package.json index e9160ab270..efb07f65da 100644 --- a/packages/dapi/package.json +++ b/packages/dapi/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/dapi", "private": true, - "version": "1.0.0-dev.9", + "version": "1.0.0-dev.10", "description": "A decentralized API for the Dash network", "scripts": { "api": "node scripts/api.js", diff --git a/packages/dash-spv/package.json b/packages/dash-spv/package.json index db6eedd1bb..ed58858c1d 100644 --- a/packages/dash-spv/package.json +++ b/packages/dash-spv/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dash-spv", - "version": "1.0.0-dev.9", + "version": "1.0.0-dev.10", "description": "Repository containing SPV functions used by @dashevo", "main": "index.js", "scripts": { diff --git a/packages/dashmate/package.json b/packages/dashmate/package.json index 61f78ebe4e..e3d8676ab4 100644 --- a/packages/dashmate/package.json +++ b/packages/dashmate/package.json @@ -1,6 +1,6 @@ { "name": "dashmate", - "version": "1.0.0-dev.9", + "version": "1.0.0-dev.10", "description": "Distribution package for Dash node installation", "scripts": { "lint": "eslint .", diff --git a/packages/dashpay-contract/Cargo.toml b/packages/dashpay-contract/Cargo.toml index eb89220ff8..3c3b62dadf 100644 --- a/packages/dashpay-contract/Cargo.toml +++ b/packages/dashpay-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dashpay-contract" description = "DashPay data contract schema and tools" -version = "1.0.0-dev.9" +version = "1.0.0-dev.10" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/dashpay-contract/package.json b/packages/dashpay-contract/package.json index e62aaed962..1cd706da43 100644 --- a/packages/dashpay-contract/package.json +++ b/packages/dashpay-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dashpay-contract", - "version": "1.0.0-dev.9", + "version": "1.0.0-dev.10", "description": "Reference contract of the DashPay DPA on Dash Evolution", "scripts": { "lint": "eslint .", diff --git a/packages/data-contracts/Cargo.toml b/packages/data-contracts/Cargo.toml index 3700ad2106..f38971e1ef 100644 --- a/packages/data-contracts/Cargo.toml +++ b/packages/data-contracts/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "data-contracts" description = "Dash Platform system data contracts" -version = "1.0.0-dev.9" +version = "1.0.0-dev.10" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/dpns-contract/Cargo.toml b/packages/dpns-contract/Cargo.toml index 0bffd15bf6..fd8165cc96 100644 --- a/packages/dpns-contract/Cargo.toml +++ b/packages/dpns-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dpns-contract" description = "DPNS data contract schema and tools" -version = "1.0.0-dev.9" +version = "1.0.0-dev.10" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/dpns-contract/package.json b/packages/dpns-contract/package.json index 0d6f0ed447..fa6f3fa33d 100644 --- a/packages/dpns-contract/package.json +++ b/packages/dpns-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dpns-contract", - "version": "1.0.0-dev.9", + "version": "1.0.0-dev.10", "description": "A contract and helper scripts for DPNS DApp", "scripts": { "lint": "eslint .", diff --git a/packages/feature-flags-contract/Cargo.toml b/packages/feature-flags-contract/Cargo.toml index 42d57d0d73..5210dca911 100644 --- a/packages/feature-flags-contract/Cargo.toml +++ b/packages/feature-flags-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "feature-flags-contract" description = "Feature flags data contract schema and tools" -version = "1.0.0-dev.9" +version = "1.0.0-dev.10" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/feature-flags-contract/package.json b/packages/feature-flags-contract/package.json index 47185c3efe..d70ed4a183 100644 --- a/packages/feature-flags-contract/package.json +++ b/packages/feature-flags-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/feature-flags-contract", - "version": "1.0.0-dev.9", + "version": "1.0.0-dev.10", "description": "Data Contract to store Dash Platform feature flags", "scripts": { "build": "", diff --git a/packages/js-dapi-client/package.json b/packages/js-dapi-client/package.json index 99e020dfa0..fc51168f13 100644 --- a/packages/js-dapi-client/package.json +++ b/packages/js-dapi-client/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-client", - "version": "1.0.0-dev.9", + "version": "1.0.0-dev.10", "description": "Client library used to access Dash DAPI endpoints", "main": "lib/index.js", "contributors": [ diff --git a/packages/js-dash-sdk/package.json b/packages/js-dash-sdk/package.json index 66bc8cd68c..e2784022d0 100644 --- a/packages/js-dash-sdk/package.json +++ b/packages/js-dash-sdk/package.json @@ -1,6 +1,6 @@ { "name": "dash", - "version": "4.0.0-dev.9", + "version": "4.0.0-dev.10", "description": "Dash library for JavaScript/TypeScript ecosystem (Wallet, DAPI, Primitives, BLS, ...)", "main": "build/index.js", "unpkg": "dist/dash.min.js", diff --git a/packages/js-grpc-common/package.json b/packages/js-grpc-common/package.json index 5de2ae9d67..d53bbd34e7 100644 --- a/packages/js-grpc-common/package.json +++ b/packages/js-grpc-common/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/grpc-common", - "version": "1.0.0-dev.9", + "version": "1.0.0-dev.10", "description": "Common GRPC library", "main": "index.js", "scripts": { diff --git a/packages/masternode-reward-shares-contract/Cargo.toml b/packages/masternode-reward-shares-contract/Cargo.toml index 42564d0e64..8a677c4a4b 100644 --- a/packages/masternode-reward-shares-contract/Cargo.toml +++ b/packages/masternode-reward-shares-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "masternode-reward-shares-contract" description = "Masternode reward shares data contract schema and tools" -version = "1.0.0-dev.9" +version = "1.0.0-dev.10" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/masternode-reward-shares-contract/package.json b/packages/masternode-reward-shares-contract/package.json index cd0ecd6451..0afc952c7d 100644 --- a/packages/masternode-reward-shares-contract/package.json +++ b/packages/masternode-reward-shares-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/masternode-reward-shares-contract", - "version": "1.0.0-dev.9", + "version": "1.0.0-dev.10", "description": "A contract and helper scripts for reward sharing", "scripts": { "lint": "eslint .", diff --git a/packages/platform-test-suite/package.json b/packages/platform-test-suite/package.json index 65f634b49f..4096854996 100644 --- a/packages/platform-test-suite/package.json +++ b/packages/platform-test-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/platform-test-suite", "private": true, - "version": "1.0.0-dev.9", + "version": "1.0.0-dev.10", "description": "Dash Network end-to-end tests", "scripts": { "test": "yarn exec bin/test.sh", diff --git a/packages/rs-dapi-client/Cargo.toml b/packages/rs-dapi-client/Cargo.toml index 45195c7789..32e87c7ce6 100644 --- a/packages/rs-dapi-client/Cargo.toml +++ b/packages/rs-dapi-client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rs-dapi-client" -version = "1.0.0-dev.9" +version = "1.0.0-dev.10" edition = "2021" [features] diff --git a/packages/rs-dapi-grpc-macros/Cargo.toml b/packages/rs-dapi-grpc-macros/Cargo.toml index 791e6043bf..e3e951bbaa 100644 --- a/packages/rs-dapi-grpc-macros/Cargo.toml +++ b/packages/rs-dapi-grpc-macros/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc-macros" -version = "1.0.0-dev.9" +version = "1.0.0-dev.10" edition = "2021" description = "Macros used by dapi-grpc. Internal use only." diff --git a/packages/rs-dpp/Cargo.toml b/packages/rs-dpp/Cargo.toml index 059fa07925..13346a6106 100644 --- a/packages/rs-dpp/Cargo.toml +++ b/packages/rs-dpp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dpp" -version = "1.0.0-dev.9" +version = "1.0.0-dev.10" edition = "2021" rust-version = "1.76" authors = [ diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index 4ade269ccb..97a96e79b0 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drive-abci" -version = "1.0.0-dev.9" +version = "1.0.0-dev.10" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/rs-drive-proof-verifier/Cargo.toml b/packages/rs-drive-proof-verifier/Cargo.toml index 9ab9811b1f..90e0997d8a 100644 --- a/packages/rs-drive-proof-verifier/Cargo.toml +++ b/packages/rs-drive-proof-verifier/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drive-proof-verifier" -version = "1.0.0-dev.9" +version = "1.0.0-dev.10" edition = "2021" rust-version = "1.76" diff --git a/packages/rs-drive/Cargo.toml b/packages/rs-drive/Cargo.toml index 8f10f1bfa6..379502f76d 100644 --- a/packages/rs-drive/Cargo.toml +++ b/packages/rs-drive/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "drive" description = "Dash drive built on top of GroveDB" -version = "1.0.0-dev.9" +version = "1.0.0-dev.10" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/rs-platform-serialization-derive/Cargo.toml b/packages/rs-platform-serialization-derive/Cargo.toml index 1c0c9c6639..84e8092b36 100644 --- a/packages/rs-platform-serialization-derive/Cargo.toml +++ b/packages/rs-platform-serialization-derive/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization-derive" authors = ["Samuel Westrich "] description = "Bincode serialization and deserialization derivations" -version = "1.0.0-dev.9" +version = "1.0.0-dev.10" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/rs-platform-serialization/Cargo.toml b/packages/rs-platform-serialization/Cargo.toml index e35dd5685b..c709a48f8e 100644 --- a/packages/rs-platform-serialization/Cargo.toml +++ b/packages/rs-platform-serialization/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization" authors = ["Samuel Westrich "] description = "Bincode based serialization and deserialization" -version = "1.0.0-dev.9" +version = "1.0.0-dev.10" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/rs-platform-value-convertible/Cargo.toml b/packages/rs-platform-value-convertible/Cargo.toml index ab8b546dd7..c6d0b0d346 100644 --- a/packages/rs-platform-value-convertible/Cargo.toml +++ b/packages/rs-platform-value-convertible/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-value-convertible" authors = ["Samuel Westrich "] description = "Convertion to and from platform values" -version = "1.0.0-dev.9" +version = "1.0.0-dev.10" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/rs-platform-value/Cargo.toml b/packages/rs-platform-value/Cargo.toml index ef70f0f1bc..d5f9b6a223 100644 --- a/packages/rs-platform-value/Cargo.toml +++ b/packages/rs-platform-value/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-value" authors = ["Samuel Westrich "] description = "A simple value module" -version = "1.0.0-dev.9" +version = "1.0.0-dev.10" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/rs-platform-version/Cargo.toml b/packages/rs-platform-version/Cargo.toml index 5f28e6d3e5..862cdc2046 100644 --- a/packages/rs-platform-version/Cargo.toml +++ b/packages/rs-platform-version/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-version" authors = ["Samuel Westrich "] description = "Bincode based serialization and deserialization" -version = "1.0.0-dev.9" +version = "1.0.0-dev.10" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/rs-platform-versioning/Cargo.toml b/packages/rs-platform-versioning/Cargo.toml index 81c36d1a70..1cd3e53720 100644 --- a/packages/rs-platform-versioning/Cargo.toml +++ b/packages/rs-platform-versioning/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-versioning" authors = ["Samuel Westrich "] description = "Version derivation" -version = "1.0.0-dev.9" +version = "1.0.0-dev.10" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/rs-sdk/Cargo.toml b/packages/rs-sdk/Cargo.toml index 1a0acf7325..4002dcc724 100644 --- a/packages/rs-sdk/Cargo.toml +++ b/packages/rs-sdk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rs-sdk" -version = "1.0.0-dev.9" +version = "1.0.0-dev.10" edition = "2021" [dependencies] diff --git a/packages/simple-signer/Cargo.toml b/packages/simple-signer/Cargo.toml index 302cae39b6..8e700e849d 100644 --- a/packages/simple-signer/Cargo.toml +++ b/packages/simple-signer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "simple-signer" -version = "1.0.0-dev.9" +version = "1.0.0-dev.10" edition = "2021" rust-version = "1.76" diff --git a/packages/strategy-tests/Cargo.toml b/packages/strategy-tests/Cargo.toml index 4b6edc67f7..06cd7a9e8e 100644 --- a/packages/strategy-tests/Cargo.toml +++ b/packages/strategy-tests/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "strategy-tests" -version = "1.0.0-dev.9" +version = "1.0.0-dev.10" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/wallet-lib/package.json b/packages/wallet-lib/package.json index 7724eaeda6..8f167a11d9 100644 --- a/packages/wallet-lib/package.json +++ b/packages/wallet-lib/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wallet-lib", - "version": "8.0.0-dev.9", + "version": "8.0.0-dev.10", "description": "Light wallet library for Dash", "main": "src/index.js", "unpkg": "dist/wallet-lib.min.js", diff --git a/packages/wasm-dpp/Cargo.toml b/packages/wasm-dpp/Cargo.toml index cadcde0d0f..79a00c15a1 100644 --- a/packages/wasm-dpp/Cargo.toml +++ b/packages/wasm-dpp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasm-dpp" -version = "1.0.0-dev.9" +version = "1.0.0-dev.10" edition = "2021" rust-version = "1.76" authors = ["Anton Suprunchuk "] diff --git a/packages/wasm-dpp/package.json b/packages/wasm-dpp/package.json index b85ba5fde5..745da0ca59 100644 --- a/packages/wasm-dpp/package.json +++ b/packages/wasm-dpp/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wasm-dpp", - "version": "1.0.0-dev.9", + "version": "1.0.0-dev.10", "description": "The JavaScript implementation of the Dash Platform Protocol", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/withdrawals-contract/Cargo.toml b/packages/withdrawals-contract/Cargo.toml index adc04eb28a..f9b5787530 100644 --- a/packages/withdrawals-contract/Cargo.toml +++ b/packages/withdrawals-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "withdrawals-contract" description = "Witdrawals data contract schema and tools" -version = "1.0.0-dev.9" +version = "1.0.0-dev.10" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/withdrawals-contract/package.json b/packages/withdrawals-contract/package.json index 4456e402ed..0392536c0c 100644 --- a/packages/withdrawals-contract/package.json +++ b/packages/withdrawals-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/withdrawals-contract", - "version": "1.0.0-dev.9", + "version": "1.0.0-dev.10", "description": "Data Contract to manipulate and track withdrawals", "scripts": { "build": "", From 5819113f02dc659e6bafea1c82b0e1bf3a574bee Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Mon, 8 Apr 2024 10:48:03 +0700 Subject: [PATCH 124/191] refactor(platform)!: reduce dependencies, and get verify feature to be more lightweight (#1807) --- Cargo.lock | 211 ++++++++----- Cargo.toml | 1 + packages/check-features/Cargo.toml | 9 + packages/check-features/src/main.rs | 136 ++++++++ packages/rs-dpp/Cargo.toml | 77 +++-- packages/rs-dpp/src/bls/mod.rs | 16 + .../rs-dpp/src/{bls.rs => bls/native_bls.rs} | 21 +- .../created_data_contract/mod.rs | 1 + .../created_data_contract/v0/mod.rs | 20 +- .../class_methods/try_from_schema/v0/mod.rs | 1 + .../document_type/property/mod.rs | 5 +- .../document_type/v0/random_document_type.rs | 6 +- .../src/data_contract/factory/v0/mod.rs | 1 + .../data_contract/serialized_version/mod.rs | 1 + .../src/document/document_factory/v0/mod.rs | 8 +- .../src/document/extended_document/mod.rs | 6 +- .../deserialize/v0/mod.rs | 1 + .../serialize/v0/mod.rs | 1 + .../specialized_document_factory/v0/mod.rs | 8 +- packages/rs-dpp/src/document/v0/mod.rs | 1 + .../src/errors/consensus/basic/basic_error.rs | 17 +- .../consensus/basic/data_contract/mod.rs | 2 + .../rs-dpp/src/errors/consensus/basic/mod.rs | 2 + packages/rs-dpp/src/errors/consensus/codes.rs | 3 + .../wrong_public_key_purpose_error.rs | 5 +- packages/rs-dpp/src/errors/dpp_init_error.rs | 20 -- packages/rs-dpp/src/errors/protocol_error.rs | 33 +- packages/rs-dpp/src/lib.rs | 5 + .../abstract_state_transition.rs | 3 + .../rs-dpp/src/state_transition/errors/mod.rs | 24 +- .../src/state_transition/serialization.rs | 3 +- .../v0/state_transition_like.rs | 6 +- .../documents_batch_transition/mod.rs | 4 +- .../v0/state_transition_like.rs | 6 +- .../v0/state_transition_like.rs | 4 +- .../v0/state_transition_like.rs | 4 +- .../mod.rs | 1 - .../v0/state_transition_like.rs | 4 +- .../v0/state_transition_like.rs | 4 +- .../v0/state_transition_like.rs | 4 +- .../rs-dpp/src/tests/utils/error_helpers.rs | 110 ------- packages/rs-dpp/src/tests/utils/mod.rs | 3 - .../rs-dpp/src/util/cbor_value/convert.rs | 11 +- packages/rs-dpp/src/util/deserializer.rs | 7 +- packages/rs-drive-abci/Cargo.toml | 4 +- .../src/execution/check_tx/v0/mod.rs | 2 +- .../process_block_fees/v0/mod.rs | 2 +- .../v0/mod.rs | 2 +- .../v0/mod.rs | 2 +- .../create_genesis_state/v0/mod.rs | 4 +- .../v0/mod.rs | 12 +- .../identity_contract_nonce/v0/mod.rs | 2 +- .../identity_nonce/v0/mod.rs | 2 +- .../src/test/helpers/fee_pools.rs | 2 +- .../tests/strategy_tests/main.rs | 7 +- .../strategy_tests/upgrade_fork_tests.rs | 3 +- packages/rs-drive-proof-verifier/Cargo.toml | 11 +- .../rs-drive-proof-verifier/src/provider.rs | 1 + packages/rs-drive/Cargo.toml | 74 +++-- packages/rs-drive/src/common/mod.rs | 59 +--- .../src/common/{ => test_utils}/identities.rs | 29 -- .../rs-drive/src/common/test_utils/mod.rs | 1 + packages/rs-drive/src/drive/balances/mod.rs | 22 +- .../src/drive/batch/drive_op_batch/mod.rs | 2 +- .../rs-drive/src/drive/cache/data_contract.rs | 2 - .../src/drive/cache/protocol_version.rs | 2 +- .../src/drive/cache/system_contracts.rs | 1 - packages/rs-drive/src/drive/config.rs | 91 +++--- .../src/drive/contract/contract_fetch_info.rs | 2 - .../fetch_contract_with_history/mod.rs | 2 +- .../get_contract_with_fetch_info/mod.rs | 2 +- packages/rs-drive/src/drive/contract/mod.rs | 51 +-- .../src/drive/credit_pools/epochs/mod.rs | 2 +- .../credit_pools/epochs/start_block/mod.rs | 2 +- .../start_time/get_epoch_start_time/v0/mod.rs | 2 +- .../rs-drive/src/drive/credit_pools/mod.rs | 46 +-- .../v0/mod.rs | 2 +- .../get_unpaid_epoch_index/v0/mod.rs | 2 +- .../rs-drive/src/drive/document/delete/mod.rs | 2 +- packages/rs-drive/src/drive/document/mod.rs | 52 +-- .../rs-drive/src/drive/document/query/mod.rs | 18 +- .../rs-drive/src/drive/document/update/mod.rs | 6 +- packages/rs-drive/src/drive/flags.rs | 38 +-- .../batch_insert_if_changed_value/v0/mod.rs | 2 +- .../batch_insert_if_not_exists/v0/mod.rs | 2 +- .../src/drive/identity/balance/mod.rs | 4 +- .../src/drive/identity/balance/update.rs | 2 +- .../merge_identity_contract_nonce/v0/mod.rs | 2 +- .../identity_contract_nonce/mod.rs | 4 +- .../src/drive/identity/contract_info/mod.rs | 4 +- .../fetch/fetch_by_public_key_hashes/mod.rs | 2 +- .../drive/identity/fetch/full_identity/mod.rs | 2 +- .../rs-drive/src/drive/identity/fetch/mod.rs | 48 +-- .../src/drive/identity/key/fetch/mod.rs | 231 +++++++------- .../rs-drive/src/drive/identity/key/mod.rs | 10 +- packages/rs-drive/src/drive/identity/mod.rs | 78 ++--- .../merge_identity_nonce_operations/v0/mod.rs | 2 +- .../src/drive/initialization/v0/mod.rs | 2 +- packages/rs-drive/src/drive/mod.rs | 84 +++-- .../src/drive/protocol_upgrade/mod.rs | 34 +- .../src/drive/system/genesis_time/mod.rs | 2 +- packages/rs-drive/src/drive/system/mod.rs | 2 +- packages/rs-drive/src/drive/test_utils.rs | 27 -- packages/rs-drive/src/fee_pools/epochs/mod.rs | 6 +- packages/rs-drive/src/fee_pools/mod.rs | 36 +-- packages/rs-drive/src/lib.rs | 26 +- packages/rs-drive/src/query/conditions.rs | 8 +- packages/rs-drive/src/query/mod.rs | 295 +++++++----------- packages/rs-drive/src/query/ordering.rs | 3 +- packages/rs-drive/src/query/test_index.rs | 2 +- .../identity_credit_transfer/v0/mod.rs | 4 +- .../identity_credit_withdrawal/v0/mod.rs | 5 +- .../identity/identity_update/v0/mod.rs | 4 +- .../partially_use_asset_lock_action/v0/mod.rs | 4 +- .../rs-drive/tests/deterministic_root_hash.rs | 40 +-- packages/rs-drive/tests/query_tests.rs | 196 ++++++------ .../rs-drive/tests/query_tests_history.rs | 64 ++-- packages/rs-platform-value/Cargo.toml | 16 +- .../btreemap_field_replacement.rs | 10 +- .../btreemap_path_extensions.rs | 9 +- .../src/btreemap_extensions/mod.rs | 9 +- .../rs-platform-value/src/converter/mod.rs | 2 + .../src/converter/serde_json.rs | 10 +- packages/rs-platform-value/src/display.rs | 26 +- .../rs-platform-value/src/string_encoding.rs | 11 +- .../rs-platform-value/src/system_bytes.rs | 60 ++-- .../src/types/binary_data.rs | 8 +- .../rs-platform-value/src/types/bytes_20.rs | 8 +- .../rs-platform-value/src/types/bytes_32.rs | 8 +- .../rs-platform-value/src/types/bytes_36.rs | 8 +- .../rs-platform-value/src/types/identifier.rs | 2 + .../src/value_serialization/de.rs | 10 +- .../src/value_serialization/ser.rs | 10 +- packages/rs-sdk/Cargo.toml | 41 ++- .../rs-sdk/scripts/generate_test_vectors.sh | 4 - packages/rs-sdk/src/error.rs | 5 - .../platform/transition/broadcast_identity.rs | 2 +- ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 74129 -> 0 bytes ...1733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json} | Bin 74149 -> 74127 bytes ...93d92d2c84b425f8393ffa9599b06a3a77be.json} | Bin 24205 -> 24208 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 + ...db039bd8eba37530edf9202046cf912eb8efd.json | 1 - ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 74129 -> 0 bytes ...1733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json} | Bin 74149 -> 74127 bytes ...25892e0011f1264c65e1474532f59456ff51.json} | Bin 24205 -> 24208 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 + ...db039bd8eba37530edf9202046cf912eb8efd.json | 1 - ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 74129 -> 0 bytes ...1733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json} | Bin 74149 -> 74127 bytes ...93d92d2c84b425f8393ffa9599b06a3a77be.json} | Bin 24205 -> 24208 bytes ...f38ff6415d9cabab87315b9d9d736194597f.json} | Bin 24331 -> 24334 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 + ...db039bd8eba37530edf9202046cf912eb8efd.json | 1 - ...01c1ba166a2dd8f6efb31b0289dc011da983.json} | Bin 8842 -> 8822 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 + ...db039bd8eba37530edf9202046cf912eb8efd.json | 1 - ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 74129 -> 0 bytes ...1733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json} | Bin 74149 -> 74127 bytes ...cf0df7bf150009b1ced887a6f051ab86085b.json} | Bin 22305 -> 22308 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 + ...db039bd8eba37530edf9202046cf912eb8efd.json | 1 - ...48c03122daf7ab2e77108f4bf44af1ad15eae.json | Bin 8862 -> 0 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 74149 -> 0 bytes ...501c1ba166a2dd8f6efb31b0289dc011da983.json | Bin 8862 -> 0 bytes ...abbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json | Bin 8715 -> 0 bytes ...067bd9ccc29eca3092a5664a5a9ba3bb7e967.json | Bin 75622 -> 0 bytes ...67089535588985622579e77969e0ffd68afc7.json | Bin 21008 -> 0 bytes ...6caf3663c40a12d3b03827006d66058e439ac.json | Bin 1466420 -> 0 bytes ...093d92d2c84b425f8393ffa9599b06a3a77be.json | Bin 24209 -> 0 bytes ...7776113debe4287515ae60d0645da450a80a1.json | Bin 21964 -> 0 bytes ...7776113debe4287515ae60d0645da450a80a1.json | Bin 21964 -> 0 bytes ...625892e0011f1264c65e1474532f59456ff51.json | Bin 24209 -> 0 bytes ...af38ff6415d9cabab87315b9d9d736194597f.json | Bin 24335 -> 0 bytes ...7776113debe4287515ae60d0645da450a80a1.json | Bin 11759 -> 0 bytes ...fcf0df7bf150009b1ced887a6f051ab86085b.json | Bin 22309 -> 0 bytes ...7776113debe4287515ae60d0645da450a80a1.json | Bin 21964 -> 0 bytes ...093d92d2c84b425f8393ffa9599b06a3a77be.json | Bin 24209 -> 0 bytes ...4a459dc7a67570ea6df3f8858d3fae7820ffe.json | Bin 15482 -> 0 bytes ...8fa69b4749b19cc1f5ef0abf37fa0c04ab2ef.json | Bin 14552 -> 0 bytes ...c53464633a072722c5a04b15ee01f3a45de99.json | Bin 24692 -> 0 bytes ...c53464633a072722c5a04b15ee01f3a45de99.json | Bin 24692 -> 0 bytes ...9550f0ea4a6af6f68037e7d50ff4e4de74509.json | Bin 8210 -> 0 bytes ...bf1acc3394d29ac72f662d38e81344496631e.json | Bin 10634 -> 0 bytes ...9b1a05862cb8d40c088b193b59ca3564210bc.json | Bin 11307 -> 0 bytes ...22dfc69cc7b123be24b7ad993281979b2a3a2.json | Bin 10992 -> 0 bytes ...3efbcc93fdbc66e012e606d530c327265c52d.json | Bin 30798 -> 0 bytes ...d592c8fe7361bed628d9a36747664c9789bf1.json | Bin 2437728 -> 0 bytes ...b0b93d9d2e841a5e3d60755f8e7be3b93315b.json | Bin 2425354 -> 0 bytes ...add01a7428085ffdcf1e11cccf19c48c5f7a1.json | Bin 2668628 -> 0 bytes ...21dcf2753e9d37578afcce21a36925ab5248a.json | 1 - ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 74129 -> 0 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 0 -> 74127 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 + ...db039bd8eba37530edf9202046cf912eb8efd.json | 1 - ...8c03122daf7ab2e77108f4bf44af1ad15eae.json} | Bin 8842 -> 8822 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 + ...db039bd8eba37530edf9202046cf912eb8efd.json | 1 - ...67bd9ccc29eca3092a5664a5a9ba3bb7e967.json} | Bin 75602 -> 75593 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 + ...db039bd8eba37530edf9202046cf912eb8efd.json | 1 - ...bbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json} | Bin 8695 -> 8675 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 + ...db039bd8eba37530edf9202046cf912eb8efd.json | 1 - ...7776113debe4287515ae60d0645da450a80a1.json | Bin 21988 -> 0 bytes ...776113debe4287515ae60d0645da450a80a1.json} | Bin 20816 -> 19680 bytes ...caf3663c40a12d3b03827006d66058e439ac.json} | Bin 1466607 -> 1466578 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 + ...bc8321622c21e4a2874ab7e481c6267201326.json | 1 - ...7776113debe4287515ae60d0645da450a80a1.json | Bin 21988 -> 0 bytes ...776113debe4287515ae60d0645da450a80a1.json} | Bin 21981 -> 19680 bytes ...7089535588985622579e77969e0ffd68afc7.json} | Bin 21192 -> 21163 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 + ...bc8321622c21e4a2874ab7e481c6267201326.json | 1 - ...7776113debe4287515ae60d0645da450a80a1.json | Bin 21988 -> 0 bytes ...776113debe4287515ae60d0645da450a80a1.json} | Bin 21981 -> 19680 bytes ...dd01a7428085ffdcf1e11cccf19c48c5f7a1.json} | Bin 2668623 -> 2668591 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 + ...bc8321622c21e4a2874ab7e481c6267201326.json | 1 - ...7776113debe4287515ae60d0645da450a80a1.json | Bin 21965 -> 0 bytes ...776113debe4287515ae60d0645da450a80a1.json} | Bin 20815 -> 19680 bytes ...592c8fe7361bed628d9a36747664c9789bf1.json} | Bin 2437719 -> 2437697 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 + ...db039bd8eba37530edf9202046cf912eb8efd.json | 1 - ...7776113debe4287515ae60d0645da450a80a1.json | Bin 21965 -> 0 bytes ...7776113debe4287515ae60d0645da450a80a1.json | Bin 0 -> 19680 bytes ...0b93d9d2e841a5e3d60755f8e7be3b93315b.json} | Bin 2425345 -> 2425323 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 + ...db039bd8eba37530edf9202046cf912eb8efd.json | 1 - ...776113debe4287515ae60d0645da450a80a1.json} | Bin 11755 -> 10626 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 + ...db039bd8eba37530edf9202046cf912eb8efd.json | 1 - ...7776113debe4287515ae60d0645da450a80a1.json | Bin 0 -> 18538 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 + ...db039bd8eba37530edf9202046cf912eb8efd.json | 1 - ...fa69b4749b19cc1f5ef0abf37fa0c04ab2ef.json} | Bin 14553 -> 13401 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 + ...db039bd8eba37530edf9202046cf912eb8efd.json | 1 - ...a459dc7a67570ea6df3f8858d3fae7820ffe.json} | Bin 15483 -> 14324 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 + ...db039bd8eba37530edf9202046cf912eb8efd.json | 1 - ...53464633a072722c5a04b15ee01f3a45de99.json} | Bin 24693 -> 22136 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 + ...db039bd8eba37530edf9202046cf912eb8efd.json | 1 - ...53464633a072722c5a04b15ee01f3a45de99.json} | Bin 24693 -> 22136 bytes ...26bac5c6f9a7e376330066e2e0642706877c.json} | Bin 30799 -> 28239 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 + ...db039bd8eba37530edf9202046cf912eb8efd.json | 1 - ...550f0ea4a6af6f68037e7d50ff4e4de74509.json} | Bin 8206 -> 8203 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 + ...db039bd8eba37530edf9202046cf912eb8efd.json | 1 - ...106e5eda740be44679cc960ea35f2134af628.json | Bin 10881 -> 0 bytes ...06e5eda740be44679cc960ea35f2134af628.json} | Bin 10885 -> 10871 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 + ...db039bd8eba37530edf9202046cf912eb8efd.json | 1 - ...f1acc3394d29ac72f662d38e81344496631e.json} | Bin 10630 -> 10621 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 + ...db039bd8eba37530edf9202046cf912eb8efd.json | 1 - ...b1a05862cb8d40c088b193b59ca3564210bc.json} | Bin 11303 -> 11302 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 + ...db039bd8eba37530edf9202046cf912eb8efd.json | 1 - ...2dfc69cc7b123be24b7ad993281979b2a3a2.json} | Bin 10988 -> 10979 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 + ...db039bd8eba37530edf9202046cf912eb8efd.json | 1 - packages/simple-signer/Cargo.toml | 1 - packages/simple-signer/src/signer.rs | 11 +- packages/strategy-tests/Cargo.toml | 3 +- packages/strategy-tests/src/transitions.rs | 2 +- packages/wasm-dpp/src/errors/from.rs | 1 - 268 files changed, 1502 insertions(+), 1447 deletions(-) create mode 100644 packages/check-features/Cargo.toml create mode 100644 packages/check-features/src/main.rs create mode 100644 packages/rs-dpp/src/bls/mod.rs rename packages/rs-dpp/src/{bls.rs => bls/native_bls.rs} (73%) delete mode 100644 packages/rs-dpp/src/tests/utils/error_helpers.rs rename packages/rs-drive/src/common/{ => test_utils}/identities.rs (84%) create mode 100644 packages/rs-drive/src/common/test_utils/mod.rs delete mode 100644 packages/rs-drive/src/drive/test_utils.rs delete mode 100644 packages/rs-sdk/tests/vectors/document_list_document_query/msg_2024-03-18T17:30:02.264054333Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json rename packages/rs-sdk/tests/vectors/{msg_2024-03-18T14:19:45.630123500Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json => document_list_document_query/msg_2024-04-05T09:03:09.937284721Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json} (96%) rename packages/rs-sdk/tests/vectors/document_list_document_query/{msg_2024-03-18T17:30:02.342323339Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json => msg_2024-04-05T09:03:10.038807458Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json} (88%) create mode 100644 packages/rs-sdk/tests/vectors/document_list_document_query/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json delete mode 100644 packages/rs-sdk/tests/vectors/document_list_document_query/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json delete mode 100644 packages/rs-sdk/tests/vectors/document_list_drive_query/msg_2024-03-18T17:30:02.267948117Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json rename packages/rs-sdk/tests/vectors/{msg_2024-03-18T14:19:45.630652428Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json => document_list_drive_query/msg_2024-04-05T09:03:09.939170860Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json} (96%) rename packages/rs-sdk/tests/vectors/document_list_drive_query/{msg_2024-03-18T17:30:02.342760372Z_DocumentQuery_c104c67292061fe0b8e2f959cd2625892e0011f1264c65e1474532f59456ff51.json => msg_2024-04-05T09:03:10.043689986Z_DocumentQuery_c104c67292061fe0b8e2f959cd2625892e0011f1264c65e1474532f59456ff51.json} (88%) create mode 100644 packages/rs-sdk/tests/vectors/document_list_drive_query/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json delete mode 100644 packages/rs-sdk/tests/vectors/document_list_drive_query/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json delete mode 100644 packages/rs-sdk/tests/vectors/document_read/msg_2024-03-18T17:30:02.267493110Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json rename packages/rs-sdk/tests/vectors/{msg_2024-03-18T14:19:45.632256765Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json => document_read/msg_2024-04-05T09:03:09.943356025Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json} (96%) rename packages/rs-sdk/tests/vectors/document_read/{msg_2024-03-18T17:30:02.345966821Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json => msg_2024-04-05T09:03:10.044569852Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json} (88%) rename packages/rs-sdk/tests/vectors/document_read/{msg_2024-03-18T17:30:02.533877193Z_DocumentQuery_90af5a08200f1b0e42dbd3ad7a6af38ff6415d9cabab87315b9d9d736194597f.json => msg_2024-04-05T09:03:10.111047895Z_DocumentQuery_90af5a08200f1b0e42dbd3ad7a6af38ff6415d9cabab87315b9d9d736194597f.json} (88%) create mode 100644 packages/rs-sdk/tests/vectors/document_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json delete mode 100644 packages/rs-sdk/tests/vectors/document_read/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json rename packages/rs-sdk/tests/vectors/document_read_no_contract/{msg_2024-03-18T17:30:02.266644051Z_GetDataContractRequest_e4cf74168e03a40bd159451456b501c1ba166a2dd8f6efb31b0289dc011da983.json => msg_2024-04-05T09:03:09.940963863Z_GetDataContractRequest_e4cf74168e03a40bd159451456b501c1ba166a2dd8f6efb31b0289dc011da983.json} (67%) create mode 100644 packages/rs-sdk/tests/vectors/document_read_no_contract/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json delete mode 100644 packages/rs-sdk/tests/vectors/document_read_no_contract/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json delete mode 100644 packages/rs-sdk/tests/vectors/document_read_no_document/msg_2024-03-18T17:30:02.270343589Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json rename packages/rs-sdk/tests/vectors/{msg_2024-03-18T14:19:45.633007782Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json => document_read_no_document/msg_2024-04-05T09:03:09.937048727Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json} (96%) rename packages/rs-sdk/tests/vectors/document_read_no_document/{msg_2024-03-18T17:30:02.350206947Z_DocumentQuery_fb3b25c8fa37750a6c1b18d9085fcf0df7bf150009b1ced887a6f051ab86085b.json => msg_2024-04-05T09:03:10.039734793Z_DocumentQuery_fb3b25c8fa37750a6c1b18d9085fcf0df7bf150009b1ced887a6f051ab86085b.json} (87%) create mode 100644 packages/rs-sdk/tests/vectors/document_read_no_document/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json delete mode 100644 packages/rs-sdk/tests/vectors/document_read_no_document/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.630642159Z_GetDataContractRequest_1d1e53ab5e04d9ec5dce4ff9ac048c03122daf7ab2e77108f4bf44af1ad15eae.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.634383016Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.637905030Z_GetDataContractRequest_e4cf74168e03a40bd159451456b501c1ba166a2dd8f6efb31b0289dc011da983.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.637905411Z_GetDataContractsRequest_93bdf343bce1bafb96fd873236cabbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.639022859Z_GetDataContractsRequest_f229a0e58a5c4fb050f57c087bf067bd9ccc29eca3092a5664a5a9ba3bb7e967.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.642649491Z_GetEpochsInfoRequest_1b87e649557ccb609adb9e2904c67089535588985622579e77969e0ffd68afc7.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.719566753Z_GetEpochsInfoRequest_b2b426ac4a52cb4cb08904c63386caf3663c40a12d3b03827006d66058e439ac.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.787102609Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.791025249Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.813846802Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.815461989Z_DocumentQuery_c104c67292061fe0b8e2f959cd2625892e0011f1264c65e1474532f59456ff51.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.815625277Z_DocumentQuery_90af5a08200f1b0e42dbd3ad7a6af38ff6415d9cabab87315b9d9d736194597f.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.815887401Z_GetIdentityBalanceRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.818184304Z_DocumentQuery_fb3b25c8fa37750a6c1b18d9085fcf0df7bf150009b1ced887a6f051ab86085b.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.818401023Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.819407923Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.824051072Z_GetIdentityKeysRequest_b4ecff7acf52818aef9ed37a98d4a459dc7a67570ea6df3f8858d3fae7820ffe.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.837728485Z_GetIdentityContractNonceRequest_b7c02dae0c3c762ece1f70a36f88fa69b4749b19cc1f5ef0abf37fa0c04ab2ef.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.838169256Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.841927325Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.866849731Z_GetProtocolVersionUpgradeStateRequest_bb149e1933b9dc561bbfacfb6d09550f0ea4a6af6f68037e7d50ff4e4de74509.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.873512881Z_GetProtocolVersionUpgradeVoteStatusRequest_983670ac95678b1166deab32209bf1acc3394d29ac72f662d38e81344496631e.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.895002050Z_GetProtocolVersionUpgradeVoteStatusRequest_8534be7e0b4dd648520dc3a67209b1a05862cb8d40c088b193b59ca3564210bc.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.896617067Z_GetProtocolVersionUpgradeVoteStatusRequest_92a45a0fe4f69d355022d2f2f7622dfc69cc7b123be24b7ad993281979b2a3a2.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.913049807Z_IdentityRequest_8fb3b1a4ef0db316161d4ed79b93efbcc93fdbc66e012e606d530c327265c52d.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:46.146063724Z_GetEpochsInfoRequest_734f6594c67fe6a9ab170191031d592c8fe7361bed628d9a36747664c9789bf1.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:46.188023131Z_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json delete mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:46.205942235Z_GetEpochsInfoRequest_6a828350e795a088dbc835260a1add01a7428085ffdcf1e11cccf19c48c5f7a1.json delete mode 100644 packages/rs-sdk/tests/vectors/quorum_pubkey-106-2e7d8ac39b3d5ce5c585b18badd21dcf2753e9d37578afcce21a36925ab5248a.json delete mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_read/msg_2024-03-18T17:30:02.264404663Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json create mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_read/msg_2024-04-05T09:03:09.931783018Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json create mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json delete mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_read/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json rename packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/{msg_2024-03-18T17:30:02.254826261Z_GetDataContractRequest_1d1e53ab5e04d9ec5dce4ff9ac048c03122daf7ab2e77108f4bf44af1ad15eae.json => msg_2024-04-05T09:03:09.921319859Z_GetDataContractRequest_1d1e53ab5e04d9ec5dce4ff9ac048c03122daf7ab2e77108f4bf44af1ad15eae.json} (67%) create mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json delete mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json rename packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/{msg_2024-03-18T17:30:02.262237140Z_GetDataContractsRequest_f229a0e58a5c4fb050f57c087bf067bd9ccc29eca3092a5664a5a9ba3bb7e967.json => msg_2024-04-05T09:03:09.929228702Z_GetDataContractsRequest_f229a0e58a5c4fb050f57c087bf067bd9ccc29eca3092a5664a5a9ba3bb7e967.json} (96%) create mode 100644 packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json delete mode 100644 packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json rename packages/rs-sdk/tests/vectors/test_data_contracts_2_nx/{msg_2024-03-18T17:30:02.261742919Z_GetDataContractsRequest_93bdf343bce1bafb96fd873236cabbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json => msg_2024-04-05T09:03:09.921211735Z_GetDataContractsRequest_93bdf343bce1bafb96fd873236cabbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json} (67%) create mode 100644 packages/rs-sdk/tests/vectors/test_data_contracts_2_nx/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json delete mode 100644 packages/rs-sdk/tests/vectors/test_data_contracts_2_nx/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_2024-04-04T11:53:53.893159000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json rename packages/rs-sdk/tests/vectors/{test_identity_balance_revision_read/msg_2024-03-18T17:30:02.345340351Z_GetIdentityBalanceAndRevisionRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json => test_epoch_fetch/msg_2024-04-05T09:03:09.939849246Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json} (75%) rename packages/rs-sdk/tests/vectors/test_epoch_fetch/{msg_2024-04-04T11:53:53.980843000Z_GetEpochsInfoRequest_b2b426ac4a52cb4cb08904c63386caf3663c40a12d3b03827006d66058e439ac.json => msg_2024-04-05T09:03:10.028576958Z_GetEpochsInfoRequest_b2b426ac4a52cb4cb08904c63386caf3663c40a12d3b03827006d66058e439ac.json} (99%) create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-2ca9a9abc345b3e592538a9ceb7bc8321622c21e4a2874ab7e481c6267201326.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_2024-04-04T11:53:53.893143000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json rename packages/rs-sdk/tests/vectors/{msg_2024-03-18T14:19:45.632500304Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json => test_epoch_fetch_current/msg_2024-04-05T09:03:09.942621472Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json} (75%) rename packages/rs-sdk/tests/vectors/test_epoch_fetch_current/{msg_2024-04-04T11:53:53.901498000Z_GetEpochsInfoRequest_1b87e649557ccb609adb9e2904c67089535588985622579e77969e0ffd68afc7.json => msg_2024-04-05T09:03:09.952452382Z_GetEpochsInfoRequest_1b87e649557ccb609adb9e2904c67089535588985622579e77969e0ffd68afc7.json} (85%) create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-2ca9a9abc345b3e592538a9ceb7bc8321622c21e4a2874ab7e481c6267201326.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_2024-04-04T11:53:53.893142000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json rename packages/rs-sdk/tests/vectors/{msg_2024-03-18T14:19:45.629451923Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json => test_epoch_fetch_future/msg_2024-04-05T09:03:09.987325755Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json} (75%) rename packages/rs-sdk/tests/vectors/test_epoch_fetch_future/{msg_2024-04-04T11:53:54.194677000Z_GetEpochsInfoRequest_6a828350e795a088dbc835260a1add01a7428085ffdcf1e11cccf19c48c5f7a1.json => msg_2024-04-05T09:03:10.414391623Z_GetEpochsInfoRequest_6a828350e795a088dbc835260a1add01a7428085ffdcf1e11cccf19c48c5f7a1.json} (99%) create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-2ca9a9abc345b3e592538a9ceb7bc8321622c21e4a2874ab7e481c6267201326.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list/msg_2024-03-18T17:30:02.333739890Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json rename packages/rs-sdk/tests/vectors/{msg_2024-03-18T14:19:45.823315675Z_GetIdentityBalanceAndRevisionRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json => test_epoch_list/msg_2024-04-05T09:03:09.988799909Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json} (75%) rename packages/rs-sdk/tests/vectors/test_epoch_list/{msg_2024-03-18T17:30:02.769567913Z_GetEpochsInfoRequest_734f6594c67fe6a9ab170191031d592c8fe7361bed628d9a36747664c9789bf1.json => msg_2024-04-05T09:03:10.383446704Z_GetEpochsInfoRequest_734f6594c67fe6a9ab170191031d592c8fe7361bed628d9a36747664c9789bf1.json} (99%) create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_2024-03-18T17:30:02.341524594Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_2024-04-05T09:03:10.026404741Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json rename packages/rs-sdk/tests/vectors/test_epoch_list_limit/{msg_2024-03-18T17:30:02.764646694Z_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json => msg_2024-04-05T09:03:10.414834086Z_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json} (99%) create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list_limit/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list_limit/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json rename packages/rs-sdk/tests/vectors/test_identity_balance_read/{msg_2024-03-18T17:30:02.341682532Z_GetIdentityBalanceRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json => msg_2024-04-05T09:03:10.038335770Z_GetIdentityBalanceRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json} (68%) create mode 100644 packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/msg_2024-04-05T09:03:10.102307738Z_GetIdentityBalanceAndRevisionRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json rename packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/{msg_2024-03-18T17:30:02.540146201Z_GetIdentityContractNonceRequest_b7c02dae0c3c762ece1f70a36f88fa69b4749b19cc1f5ef0abf37fa0c04ab2ef.json => msg_2024-04-05T09:03:10.106807957Z_GetIdentityContractNonceRequest_b7c02dae0c3c762ece1f70a36f88fa69b4749b19cc1f5ef0abf37fa0c04ab2ef.json} (69%) create mode 100644 packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json rename packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/{msg_2024-03-18T17:30:02.532347572Z_GetIdentityKeysRequest_b4ecff7acf52818aef9ed37a98d4a459dc7a67570ea6df3f8858d3fae7820ffe.json => msg_2024-04-05T09:03:10.110827591Z_GetIdentityKeysRequest_b4ecff7acf52818aef9ed37a98d4a459dc7a67570ea6df3f8858d3fae7820ffe.json} (70%) create mode 100644 packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json rename packages/rs-sdk/tests/vectors/{test_identity_read_by_key/msg_2024-03-18T17:30:02.533475216Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json => test_identity_read/msg_2024-04-05T09:03:10.108039494Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json} (74%) create mode 100644 packages/rs-sdk/tests/vectors/test_identity_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_read/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json rename packages/rs-sdk/tests/vectors/{test_identity_read/msg_2024-03-18T17:30:02.541907348Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json => test_identity_read_by_key/msg_2024-04-05T09:03:10.108285016Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json} (74%) rename packages/rs-sdk/tests/vectors/test_identity_read_by_key/{msg_2024-03-18T17:30:02.579369080Z_IdentityRequest_8fb3b1a4ef0db316161d4ed79b93efbcc93fdbc66e012e606d530c327265c52d.json => msg_2024-04-05T09:03:10.226228133Z_IdentityRequest_f5a59abf6d775a8b9e8100fa4c3326bac5c6f9a7e376330066e2e0642706877c.json} (76%) create mode 100644 packages/rs-sdk/tests/vectors/test_identity_read_by_key/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_read_by_key/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json rename packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/{msg_2024-03-18T17:30:02.555246935Z_GetProtocolVersionUpgradeStateRequest_bb149e1933b9dc561bbfacfb6d09550f0ea4a6af6f68037e7d50ff4e4de74509.json => msg_2024-04-05T09:03:10.133854190Z_GetProtocolVersionUpgradeStateRequest_bb149e1933b9dc561bbfacfb6d09550f0ea4a6af6f68037e7d50ff4e4de74509.json} (66%) create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json delete mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json delete mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/msg_2024-03-18T17:30:02.564325075Z_GetProtocolVersionUpgradeVoteStatusRequest_ec9dca65a964669b3bc8195d5ff106e5eda740be44679cc960ea35f2134af628.json rename packages/rs-sdk/tests/vectors/{msg_2024-03-18T14:19:45.866866313Z_GetProtocolVersionUpgradeVoteStatusRequest_ec9dca65a964669b3bc8195d5ff106e5eda740be44679cc960ea35f2134af628.json => test_protocol_version_votes_limit_2/msg_2024-04-05T09:03:10.136835219Z_GetProtocolVersionUpgradeVoteStatusRequest_ec9dca65a964669b3bc8195d5ff106e5eda740be44679cc960ea35f2134af628.json} (69%) create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json delete mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json rename packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/{msg_2024-03-18T17:30:02.568021928Z_GetProtocolVersionUpgradeVoteStatusRequest_983670ac95678b1166deab32209bf1acc3394d29ac72f662d38e81344496631e.json => msg_2024-04-05T09:03:10.142375013Z_GetProtocolVersionUpgradeVoteStatusRequest_983670ac95678b1166deab32209bf1acc3394d29ac72f662d38e81344496631e.json} (68%) create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json delete mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json rename packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/{msg_2024-03-18T17:30:02.581804568Z_GetProtocolVersionUpgradeVoteStatusRequest_8534be7e0b4dd648520dc3a67209b1a05862cb8d40c088b193b59ca3564210bc.json => msg_2024-04-05T09:03:10.207288934Z_GetProtocolVersionUpgradeVoteStatusRequest_8534be7e0b4dd648520dc3a67209b1a05862cb8d40c088b193b59ca3564210bc.json} (72%) create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json delete mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json rename packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/{msg_2024-03-18T17:30:02.590618781Z_GetProtocolVersionUpgradeVoteStatusRequest_92a45a0fe4f69d355022d2f2f7622dfc69cc7b123be24b7ad993281979b2a3a2.json => msg_2024-04-05T09:03:10.218889202Z_GetProtocolVersionUpgradeVoteStatusRequest_92a45a0fe4f69d355022d2f2f7622dfc69cc7b123be24b7ad993281979b2a3a2.json} (69%) create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json delete mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json diff --git a/Cargo.lock b/Cargo.lock index 339360ad00..73a31c6254 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -331,15 +331,6 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" -[[package]] -name = "bincode" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" -dependencies = [ - "serde", -] - [[package]] name = "bincode" version = "2.0.0-rc.3" @@ -382,6 +373,26 @@ dependencies = [ "which", ] +[[package]] +name = "bindgen" +version = "0.69.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" +dependencies = [ + "bitflags 2.5.0", + "cexpr", + "clang-sys", + "itertools 0.12.1", + "lazy_static", + "lazycell", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "syn 2.0.55", +] + [[package]] name = "bip37-bloom-filter" version = "0.1.0" @@ -473,7 +484,7 @@ name = "bls-dash-sys" version = "1.2.5" source = "git+https://github.com/dashpay/bls-signatures?tag=v1.3.1#1c2fc79c19dc8041610c005e68d58bfb4bc32721" dependencies = [ - "bindgen", + "bindgen 0.65.1", "cc", "glob", ] @@ -656,6 +667,13 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" +[[package]] +name = "check-features" +version = "0.1.0" +dependencies = [ + "toml", +] + [[package]] name = "chrono" version = "0.4.35" @@ -1102,7 +1120,7 @@ name = "dashcore-rpc-json" version = "0.15.1" source = "git+https://github.com/dashpay/rust-dashcore-rpc?tag=v0.15.2#9e596142f589d32a7347872b8f5c2b3b2ed54257" dependencies = [ - "bincode 2.0.0-rc.3", + "bincode", "dashcore", "hex", "serde", @@ -1241,8 +1259,8 @@ version = "1.0.0-dev.10" dependencies = [ "anyhow", "async-trait", - "base64 0.20.0", - "bincode 2.0.0-rc.3", + "base64 0.22.0", + "bincode", "bls-signatures", "bs58 0.4.0", "byteorder", @@ -1257,8 +1275,8 @@ dependencies = [ "getrandom", "hex", "indexmap 2.2.6", - "integer-encoding 4.0.0", - "itertools 0.10.5", + "integer-encoding", + "itertools 0.12.1", "json-patch", "jsonptr", "jsonschema", @@ -1290,7 +1308,6 @@ dependencies = [ name = "drive" version = "1.0.0-dev.10" dependencies = [ - "anyhow", "arc-swap", "base64 0.21.7", "bs58 0.5.1", @@ -1307,7 +1324,7 @@ dependencies = [ "grovedb-storage", "hex", "indexmap 2.2.6", - "integer-encoding 4.0.0", + "integer-encoding", "intmap", "itertools 0.11.0", "moka", @@ -1331,7 +1348,7 @@ dependencies = [ "async-trait", "atty", "base64 0.20.0", - "bincode 2.0.0-rc.3", + "bincode", "chrono", "ciborium", "clap 4.5.4", @@ -1347,7 +1364,7 @@ dependencies = [ "file-rotate", "hex", "indexmap 1.9.3", - "integer-encoding 4.0.0", + "integer-encoding", "itertools 0.10.5", "lazy_static", "metrics", @@ -1824,21 +1841,20 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "grovedb" version = "1.0.0-rc.2" -source = "git+https://github.com/dashpay/grovedb?rev=9eae5457f18d307d673767c8d772630a9d0ad66d#9eae5457f18d307d673767c8d772630a9d0ad66d" +source = "git+https://github.com/dashpay/grovedb?rev=f5a3382c5537de7417e983cdf2132792aa9fdc9d#f5a3382c5537de7417e983cdf2132792aa9fdc9d" dependencies = [ - "bincode 1.3.3", + "bincode", "grovedb-costs", "grovedb-merk", "grovedb-path", "grovedb-storage", "grovedb-visualize", "hex", - "indexmap 1.9.3", - "integer-encoding 3.0.4", + "indexmap 2.2.6", + "integer-encoding", "intmap", - "itertools 0.10.5", + "itertools 0.12.1", "nohash-hasher", - "serde", "tempfile", "thiserror", ] @@ -1846,9 +1862,9 @@ dependencies = [ [[package]] name = "grovedb-costs" version = "1.0.0-rc.2" -source = "git+https://github.com/dashpay/grovedb?rev=9eae5457f18d307d673767c8d772630a9d0ad66d#9eae5457f18d307d673767c8d772630a9d0ad66d" +source = "git+https://github.com/dashpay/grovedb?rev=f5a3382c5537de7417e983cdf2132792aa9fdc9d#f5a3382c5537de7417e983cdf2132792aa9fdc9d" dependencies = [ - "integer-encoding 3.0.4", + "integer-encoding", "intmap", "thiserror", ] @@ -1856,7 +1872,7 @@ dependencies = [ [[package]] name = "grovedb-merk" version = "1.0.0-rc.2" -source = "git+https://github.com/dashpay/grovedb?rev=9eae5457f18d307d673767c8d772630a9d0ad66d#9eae5457f18d307d673767c8d772630a9d0ad66d" +source = "git+https://github.com/dashpay/grovedb?rev=f5a3382c5537de7417e983cdf2132792aa9fdc9d#f5a3382c5537de7417e983cdf2132792aa9fdc9d" dependencies = [ "blake3", "byteorder", @@ -1868,8 +1884,8 @@ dependencies = [ "grovedb-storage", "grovedb-visualize", "hex", - "indexmap 1.9.3", - "integer-encoding 3.0.4", + "indexmap 2.2.6", + "integer-encoding", "num_cpus", "rand", "thiserror", @@ -1879,23 +1895,23 @@ dependencies = [ [[package]] name = "grovedb-path" version = "1.0.0-rc.2" -source = "git+https://github.com/dashpay/grovedb?rev=9eae5457f18d307d673767c8d772630a9d0ad66d#9eae5457f18d307d673767c8d772630a9d0ad66d" +source = "git+https://github.com/dashpay/grovedb?rev=f5a3382c5537de7417e983cdf2132792aa9fdc9d#f5a3382c5537de7417e983cdf2132792aa9fdc9d" [[package]] name = "grovedb-storage" version = "1.0.0-rc.2" -source = "git+https://github.com/dashpay/grovedb?rev=9eae5457f18d307d673767c8d772630a9d0ad66d#9eae5457f18d307d673767c8d772630a9d0ad66d" +source = "git+https://github.com/dashpay/grovedb?rev=f5a3382c5537de7417e983cdf2132792aa9fdc9d#f5a3382c5537de7417e983cdf2132792aa9fdc9d" dependencies = [ "blake3", "grovedb-costs", "grovedb-path", "grovedb-visualize", "hex", - "integer-encoding 3.0.4", + "integer-encoding", "lazy_static", "num_cpus", "rocksdb", - "strum 0.24.1", + "strum 0.26.2", "tempfile", "thiserror", ] @@ -1903,10 +1919,10 @@ dependencies = [ [[package]] name = "grovedb-visualize" version = "1.0.0-rc.2" -source = "git+https://github.com/dashpay/grovedb?rev=9eae5457f18d307d673767c8d772630a9d0ad66d#9eae5457f18d307d673767c8d772630a9d0ad66d" +source = "git+https://github.com/dashpay/grovedb?rev=f5a3382c5537de7417e983cdf2132792aa9fdc9d#f5a3382c5537de7417e983cdf2132792aa9fdc9d" dependencies = [ "hex", - "itertools 0.10.5", + "itertools 0.12.1", ] [[package]] @@ -2160,7 +2176,6 @@ checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" dependencies = [ "equivalent", "hashbrown 0.14.3", - "serde", ] [[package]] @@ -2172,12 +2187,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "integer-encoding" -version = "3.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bb03732005da905c88227371639bf1ad885cc712789c011c31c5fb3ab3ccf02" - [[package]] name = "integer-encoding" version = "4.0.0" @@ -2248,6 +2257,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.11" @@ -2368,11 +2386,11 @@ dependencies = [ [[package]] name = "librocksdb-sys" -version = "0.11.0+8.1.1" +version = "0.16.0+8.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3386f101bcb4bd252d8e9d2fb41ec3b0862a15a62b478c355b2982efa469e3e" +checksum = "ce3d60bc059831dc1c83903fb45c103f75db65c5a7bf22272764d9cc683e348c" dependencies = [ - "bindgen", + "bindgen 0.69.4", "bzip2-sys", "cc", "glob", @@ -2934,7 +2952,7 @@ checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" name = "platform-serialization" version = "1.0.0-dev.10" dependencies = [ - "bincode 2.0.0-rc.3", + "bincode", "platform-version", ] @@ -2952,9 +2970,9 @@ dependencies = [ name = "platform-value" version = "1.0.0-dev.10" dependencies = [ - "base64 0.13.1", - "bincode 2.0.0-rc.3", - "bs58 0.4.0", + "base64 0.22.0", + "bincode", + "bs58 0.5.1", "ciborium", "hex", "indexmap 2.2.6", @@ -2966,7 +2984,7 @@ dependencies = [ "serde", "serde_json", "thiserror", - "treediff 4.0.3", + "treediff 5.0.0", ] [[package]] @@ -3519,9 +3537,9 @@ dependencies = [ [[package]] name = "rocksdb" -version = "0.21.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb6f170a4041d50a0ce04b0d2e14916d6ca863ea2e422689a5b694395d299ffe" +checksum = "6bd13e55d6d7b8cd0ea569161127567cd587676c99f4472f779a0279aa60a7a7" dependencies = [ "libc", "librocksdb-sys", @@ -3549,8 +3567,8 @@ name = "rs-sdk" version = "1.0.0-dev.10" dependencies = [ "async-trait", - "base64 0.21.7", - "bincode 2.0.0-rc.3", + "base64 0.22.0", + "bincode", "bip37-bloom-filter", "ciborium", "clap 4.5.4", @@ -3586,7 +3604,7 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94ea852806513d6f5fd7750423300375bc8481a18ed033756c1a836257893a30" dependencies = [ - "bindgen", + "bindgen 0.65.1", "cc", "libc", ] @@ -3905,6 +3923,15 @@ dependencies = [ "syn 2.0.55", ] +[[package]] +name = "serde_spanned" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" +dependencies = [ + "serde", +] + [[package]] name = "serde_with" version = "2.3.3" @@ -4015,8 +4042,7 @@ checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" name = "simple-signer" version = "1.0.0-dev.10" dependencies = [ - "anyhow", - "bincode 2.0.0-rc.3", + "bincode", "dashcore-rpc", "dpp", ] @@ -4106,7 +4132,7 @@ dependencies = [ name = "strategy-tests" version = "1.0.0-dev.10" dependencies = [ - "bincode 2.0.0-rc.3", + "bincode", "dpp", "drive", "futures", @@ -4133,40 +4159,40 @@ checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01" [[package]] name = "strum" -version = "0.24.1" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" +checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" dependencies = [ - "strum_macros 0.24.3", + "strum_macros 0.25.3", ] [[package]] name = "strum" -version = "0.25.0" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" +checksum = "5d8cec3501a5194c432b2b7976db6b7d10ec95c253208b45f83f7136aa985e29" dependencies = [ - "strum_macros 0.25.3", + "strum_macros 0.26.2", ] [[package]] name = "strum_macros" -version = "0.24.3" +version = "0.25.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" +checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" dependencies = [ "heck 0.4.1", "proc-macro2", "quote", "rustversion", - "syn 1.0.109", + "syn 2.0.55", ] [[package]] name = "strum_macros" -version = "0.25.3" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" +checksum = "c6cf59daf282c0a494ba14fd21610a0325f9f90ec9d1231dea26bcb1d696c946" dependencies = [ "heck 0.4.1", "proc-macro2", @@ -4545,11 +4571,26 @@ dependencies = [ "tracing", ] +[[package]] +name = "toml" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9dd1545e8208b4a5af1aa9bbd0b4cf7e9ea08fabc5d0a5c67fcaafa17433aa3" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.22.9", +] + [[package]] name = "toml_datetime" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +dependencies = [ + "serde", +] [[package]] name = "toml_edit" @@ -4559,7 +4600,7 @@ checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ "indexmap 2.2.6", "toml_datetime", - "winnow", + "winnow 0.5.40", ] [[package]] @@ -4570,7 +4611,20 @@ checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" dependencies = [ "indexmap 2.2.6", "toml_datetime", - "winnow", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.22.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e40bb779c5187258fd7aad0eb68cb8706a0a81fa712fbea808ab43c4b8374c4" +dependencies = [ + "indexmap 2.2.6", + "serde", + "serde_spanned", + "toml_datetime", + "winnow 0.6.5", ] [[package]] @@ -4774,9 +4828,9 @@ dependencies = [ [[package]] name = "treediff" -version = "4.0.3" +version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d127780145176e2b5d16611cc25a900150e86e9fd79d3bde6ff3a37359c9cb5" +checksum = "e2ce481b2b7c2534fe7b5242cccebf37f9084392665c6a3783c414a1bada5432" [[package]] name = "triomphe" @@ -5272,6 +5326,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "winnow" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dffa400e67ed5a4dd237983829e66475f0a4a26938c4b04c21baede6262215b8" +dependencies = [ + "memchr", +] + [[package]] name = "withdrawals-contract" version = "1.0.0-dev.10" diff --git a/Cargo.toml b/Cargo.toml index 516d32e420..d4075d5d60 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,4 +26,5 @@ members = [ "packages/rs-sdk", "packages/strategy-tests", "packages/simple-signer", + "packages/check-features", ] diff --git a/packages/check-features/Cargo.toml b/packages/check-features/Cargo.toml new file mode 100644 index 0000000000..9a7085c755 --- /dev/null +++ b/packages/check-features/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "check-features" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +toml = "0.8.12" \ No newline at end of file diff --git a/packages/check-features/src/main.rs b/packages/check-features/src/main.rs new file mode 100644 index 0000000000..12f068c393 --- /dev/null +++ b/packages/check-features/src/main.rs @@ -0,0 +1,136 @@ +use std::fs; +use std::process::Command; +use toml::Value; + +fn main() { + let crates = [ + "rs-sdk", + "rs-drive-abci", + "rs-dpp", + "rs-drive", + "rs-drive-proof-verifier", + ]; + + for specific_crate in crates { + check_crate(specific_crate) + } +} + +fn check_crate(crate_name: &str) { + // Construct the path to the Cargo.toml file for each crate + let cargo_toml_path = format!("packages/{}/Cargo.toml", crate_name); + + // Read and parse the Cargo.toml file + let cargo_toml_content = fs::read_to_string(&cargo_toml_path) + .unwrap_or_else(|_| panic!("Failed to read Cargo.toml for {}", crate_name)); + + let cargo_toml: Value = cargo_toml_content + .parse() + .expect("Failed to parse Cargo.toml"); + + let features = cargo_toml + .get("features") + .expect("No features in Cargo.toml"); + + let name = cargo_toml + .get("package") + .expect("No package in Cargo.toml") + .get("name") + .expect("expected name in Cargo.toml"); + + println!("Checking crate {} with default features", crate_name); + + // Change directory to the crate's directory and run cargo check for the specific feature + let status = Command::new("cargo") + .current_dir(format!("packages/{}", crate_name)) // Set the current directory to the crate's directory + .arg("check") + .status() + .expect("Failed to execute cargo check"); + + if !status.success() { + println!( + "Feature check failed in crate {} with default features", + crate_name + ); + println!("cargo check -p {}", name); + std::process::exit(1); + } + + println!("Checking crate {} with no default features", crate_name); + + // Change directory to the crate's directory and run cargo check for the specific feature + let status = Command::new("cargo") + .current_dir(format!("packages/{}", crate_name)) // Set the current directory to the crate's directory + .arg("check") + .arg("--no-default-features") + .status() + .expect("Failed to execute cargo check"); + + if !status.success() { + println!( + "Check failed in crate {} with no default features", + crate_name + ); + println!("cargo check -p {} --no-default-features", name); + std::process::exit(1); + } + + for (feature, _) in features.as_table().unwrap().iter() { + // Skip special feature groups + if feature == "default" || feature.ends_with("features") { + continue; + } + + println!( + "Checking feature: {} in crate {} with default features", + feature, crate_name + ); + + // Change directory to the crate's directory and run cargo check for the specific feature + let status = Command::new("cargo") + .current_dir(format!("packages/{}", crate_name)) // Set the current directory to the crate's directory + .arg("check") + .arg("--features") + .arg(feature) + .status() + .expect("Failed to execute cargo check"); + + if !status.success() { + println!( + "Feature check failed for feature: {} in crate {} with default features", + feature, crate_name + ); + println!("cargo check -p {} --features {}", name, feature); + std::process::exit(1); + } + + println!( + "Checking feature: {} in crate {} with no default features", + feature, crate_name + ); + + // Change directory to the crate's directory and run cargo check for the specific feature + let status = Command::new("cargo") + .current_dir(format!("packages/{}", crate_name)) // Set the current directory to the crate's directory + .arg("check") + .arg("--features") + .arg(feature) + .arg("--no-default-features") + .status() + .expect("Failed to execute cargo check"); + + if !status.success() { + println!( + "Feature check failed for feature: {} in crate {} with no default features", + feature, crate_name + ); + println!( + "cargo check -p {} --features {} --no-default-features", + name, feature + ); + std::process::exit(1); + } + } + + println!("All features checked successfully on {}", crate_name); +} diff --git a/packages/rs-dpp/Cargo.toml b/packages/rs-dpp/Cargo.toml index 13346a6106..370c6780b0 100644 --- a/packages/rs-dpp/Cargo.toml +++ b/packages/rs-dpp/Cargo.toml @@ -12,10 +12,10 @@ authors = [ ] [dependencies] -anyhow = { version = "1.0.75" } -async-trait = { version = "0.1.68" } -base64 = "0.20.0" -bls-signatures = { git = "https://github.com/dashpay/bls-signatures", tag = "v1.3.1" } +anyhow = { version = "1.0.81" } +async-trait = { version = "0.1.79" } +base64 = "0.22.0" +bls-signatures = { git = "https://github.com/dashpay/bls-signatures", tag = "v1.3.1", optional = true } bs58 = "0.4.0" byteorder = { version = "1.4" } chrono = { version = "0.4.35", default-features = false, features = [ @@ -34,12 +34,12 @@ env_logger = { version = "0.9" } getrandom = { version = "0.2", features = ["js"] } hex = { version = "0.4" } integer-encoding = { version = "4.0.0" } -itertools = { version = "0.10" } +itertools = { version = "0.12.1" } json-patch = "0.2.6" jsonptr = "0.1.5" jsonschema = { git = "https://github.com/fominok/jsonschema-rs", branch = "feat-unevaluated-properties", default-features = false, features = [ "draft202012", -] } +], optional = true } lazy_static = { version = "1.4" } log = { version = "0.4.6" } num_enum = "0.5.7" @@ -51,18 +51,18 @@ serde_json = { version = "1.0", features = ["preserve_order"] } serde_repr = { version = "0.1.7" } sha2 = { version = "0.10" } thiserror = { version = "1.0" } -data-contracts = { path = "../data-contracts" } +data-contracts = { path = "../data-contracts", optional = true } platform-value = { path = "../rs-platform-value" } platform-version = { path = "../rs-platform-version" } platform-versioning = { path = "../rs-platform-versioning" } platform-serialization = { path = "../rs-platform-serialization" } platform-serialization-derive = { path = "../rs-platform-serialization-derive" } derive_more = "0.99.17" -ed25519-dalek = { version = "2.0.0-rc.2", features = ["rand_core"] } +ed25519-dalek = { version = "2.0.0-rc.2", features = ["rand_core"], optional = true } nohash-hasher = "0.2.0" rust_decimal = "1.29.1" rust_decimal_macros = "1.29.1" -indexmap = { version = "2.0.2", features = ["serde"] } +indexmap = { version = "2.0.2"} strum = { version = "0.25.0", features = ["derive"] } [dev-dependencies] @@ -73,11 +73,8 @@ dpp = { path = ".", features = ["all_features_without_client"] } [features] default = [ - "json-object", "platform-value", - "system_contracts", "state-transitions", - "extended-document", ] all_features = [ "json-object", @@ -85,6 +82,7 @@ all_features = [ "system_contracts", "state-transitions", "extended-document", + "bls-signatures", "cbor", "validation", "identity-hashing", @@ -117,6 +115,28 @@ all_features = [ "fee-distribution", "client", ] + +rs-sdk-features = [ + "json-object", + "platform-value", + "system_contracts", + "state-transitions", + "validation", + "identity-hashing", + "identity-serialization", + "document-value-conversion", + "data-contract-value-conversion", + "identity-value-conversion", + "state-transition-serde-conversion", + "state-transition-value-conversion", + "state-transition-json-conversion", + "state-transition-validation", + "state-transition-signing", + "state-transitions", + "fee-distribution", + "client", + "platform-value-cbor" +] all_features_without_client = [ "json-object", "platform-value", @@ -154,38 +174,43 @@ all_features_without_client = [ "random-document-types", "fee-distribution", ] -drive = ["state-transitions", "fee-distribution", "system_contracts"] abci = [ "state-transitions", "state-transition-validation", "validation", "random-public-keys", "identity-serialization", + "platform-value-cbor", ] cbor = ["ciborium"] validation = [ + "json-schema-validation", "platform-value", "document-value-conversion", "state-transition-serde-conversion", + "ed25519-dalek" ] -json-object = ["platform-value"] +platform-value-json = ["platform-value/json"] +platform-value-cbor = ["platform-value/cbor"] +json-schema-validation = ["jsonschema", "platform-value-json"] +json-object = ["platform-value", "platform-value-json"] platform-value = [] identity-hashing = ["identity-serialization"] message-signing = [] -message-signature-verification = [] +message-signature-verification = ["bls-signatures"] document-serde-conversion = [] document-value-conversion = ["document-serde-conversion"] -document-json-conversion = ["document-value-conversion"] -document-cbor-conversion = ["document-value-conversion", "cbor"] +document-json-conversion = ["document-value-conversion", "platform-value-json"] +document-cbor-conversion = ["document-value-conversion", "cbor", "platform-value-cbor"] data-contract-serde-conversion = [] data-contract-value-conversion = ["data-contract-serde-conversion"] -data-contract-json-conversion = ["data-contract-value-conversion"] -data-contract-cbor-conversion = ["data-contract-value-conversion", "cbor"] +data-contract-json-conversion = ["data-contract-value-conversion", "platform-value-json"] +data-contract-cbor-conversion = ["data-contract-value-conversion", "cbor", "platform-value-cbor"] identity-serialization = [] identity-serde-conversion = [] identity-value-conversion = ["identity-serde-conversion"] -identity-json-conversion = ["identity-value-conversion"] -identity-cbor-conversion = ["identity-value-conversion", "cbor"] +identity-json-conversion = ["identity-value-conversion", "platform-value-json"] +identity-cbor-conversion = ["identity-value-conversion", "cbor", "platform-value-cbor"] state-transition-serde-conversion = ["data-contract-serde-conversion"] state-transition-value-conversion = [ "platform-value", @@ -194,17 +219,19 @@ state-transition-value-conversion = [ ] state-transition-json-conversion = [ "json-object", + "state-transition-value-conversion", "data-contract-json-conversion", + "platform-value-json", ] state-transition-validation = ["state-transitions", "message-signature-verification"] state-transition-signing = ["state-transitions", "message-signing", "state-transition-validation"] state-transitions = [] -system_contracts = ["factories"] -fixtures-and-mocks = ["system_contracts"] -random-public-keys = [] +system_contracts = ["factories", "data-contracts", "platform-value-json"] +fixtures-and-mocks = ["system_contracts", "platform-value/json"] +random-public-keys = ["bls-signatures", "ed25519-dalek"] random-identities = ["random-public-keys"] random-documents = [] -random-document-types = [] +random-document-types = ["platform-value-json"] fee-distribution = [] extended-document = [ "document-serde-conversion", diff --git a/packages/rs-dpp/src/bls/mod.rs b/packages/rs-dpp/src/bls/mod.rs new file mode 100644 index 0000000000..8b825531c0 --- /dev/null +++ b/packages/rs-dpp/src/bls/mod.rs @@ -0,0 +1,16 @@ +#[cfg(all(not(target_arch = "wasm32"), feature = "bls-signatures"))] +pub mod native_bls; + +use crate::{ProtocolError, PublicKeyValidationError}; + +pub trait BlsModule { + fn validate_public_key(&self, pk: &[u8]) -> Result<(), PublicKeyValidationError>; + fn verify_signature( + &self, + signature: &[u8], + data: &[u8], + public_key: &[u8], + ) -> Result; + fn private_key_to_public_key(&self, private_key: &[u8]) -> Result, ProtocolError>; + fn sign(&self, data: &[u8], private_key: &[u8]) -> Result, ProtocolError>; +} diff --git a/packages/rs-dpp/src/bls.rs b/packages/rs-dpp/src/bls/native_bls.rs similarity index 73% rename from packages/rs-dpp/src/bls.rs rename to packages/rs-dpp/src/bls/native_bls.rs index a91deb9dc3..f613284266 100644 --- a/packages/rs-dpp/src/bls.rs +++ b/packages/rs-dpp/src/bls/native_bls.rs @@ -1,28 +1,9 @@ -use crate::{ProtocolError, PublicKeyValidationError}; -#[cfg(not(target_arch = "wasm32"))] +use crate::{BlsModule, ProtocolError, PublicKeyValidationError}; use anyhow::anyhow; use bls_signatures::{PrivateKey, PublicKey}; -use std::convert::TryInto; - -pub trait BlsModule { - fn validate_public_key(&self, pk: &[u8]) -> Result<(), PublicKeyValidationError>; - fn verify_signature( - &self, - signature: &[u8], - data: &[u8], - public_key: &[u8], - ) -> Result; - fn private_key_to_public_key(&self, private_key: &[u8]) -> Result, ProtocolError>; - fn sign(&self, data: &[u8], private_key: &[u8]) -> Result, ProtocolError>; -} - -// TODO: write tests for the native BLS module #[derive(Default)] -#[cfg(not(target_arch = "wasm32"))] pub struct NativeBlsModule; - -#[cfg(not(target_arch = "wasm32"))] impl BlsModule for NativeBlsModule { fn validate_public_key(&self, pk: &[u8]) -> Result<(), PublicKeyValidationError> { match PublicKey::from_bytes(pk) { diff --git a/packages/rs-dpp/src/data_contract/created_data_contract/mod.rs b/packages/rs-dpp/src/data_contract/created_data_contract/mod.rs index 666725651c..f988047574 100644 --- a/packages/rs-dpp/src/data_contract/created_data_contract/mod.rs +++ b/packages/rs-dpp/src/data_contract/created_data_contract/mod.rs @@ -16,6 +16,7 @@ use crate::serialization::{ PlatformSerializableWithPlatformVersion, }; use crate::ProtocolError::{PlatformDeserializationError, PlatformSerializationError}; +#[cfg(feature = "data-contract-value-conversion")] use platform_value::Value; use platform_version::TryIntoPlatformVersioned; diff --git a/packages/rs-dpp/src/data_contract/created_data_contract/v0/mod.rs b/packages/rs-dpp/src/data_contract/created_data_contract/v0/mod.rs index dd99aecddf..5f37b3e5ce 100644 --- a/packages/rs-dpp/src/data_contract/created_data_contract/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/created_data_contract/v0/mod.rs @@ -1,17 +1,19 @@ use crate::data_contract::DataContract; use bincode::{Decode, Encode}; -#[cfg(feature = "data-contract-value-conversion")] -use crate::data_contract::conversion::value::v0::DataContractValueConversionMethodsV0; -use crate::data_contract::created_data_contract::fields::property_names::{ - DATA_CONTRACT, IDENTITY_NONCE, -}; use crate::data_contract::serialized_version::DataContractInSerializationFormat; use crate::prelude::IdentityNonce; -use crate::version::PlatformVersion; -use crate::ProtocolError; -use platform_value::btreemap_extensions::BTreeValueRemoveFromMapHelper; -use platform_value::{Error, Value}; +#[cfg(feature = "data-contract-value-conversion")] +use crate::{ + data_contract::{ + conversion::value::v0::DataContractValueConversionMethodsV0, + created_data_contract::fields::property_names::{DATA_CONTRACT, IDENTITY_NONCE}, + }, + version::PlatformVersion, + ProtocolError, +}; +#[cfg(feature = "data-contract-value-conversion")] +use platform_value::{btreemap_extensions::BTreeValueRemoveFromMapHelper, Error, Value}; // TODO: Decide on what we need ExtendedDataContract with metadata or CreatedDataContract or both. #[derive(Clone, Debug, PartialEq)] diff --git a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs index cb5c38ee89..59b7404656 100644 --- a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs @@ -86,6 +86,7 @@ fn consensus_or_protocol_value_error(platform_value_error: platform_value::Error impl DocumentTypeV0 { // TODO: Split into multiple functions + #[allow(unused_variables)] pub(crate) fn try_from_schema_v0( data_contract_id: Identifier, name: &str, diff --git a/packages/rs-dpp/src/data_contract/document_type/property/mod.rs b/packages/rs-dpp/src/data_contract/document_type/property/mod.rs index 9910d4af4e..cfe1b52e40 100644 --- a/packages/rs-dpp/src/data_contract/document_type/property/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/property/mod.rs @@ -15,21 +15,20 @@ use platform_value::Value; use rand::distributions::{Alphanumeric, Standard}; use rand::rngs::StdRng; use rand::Rng; -use serde::{Deserialize, Serialize}; pub mod array; // This struct will be changed in future to support more validation logic and serialization // It will become versioned and it will be introduced by a new document type version // @append_only -#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)] +#[derive(Debug, PartialEq, Clone)] pub struct DocumentProperty { pub property_type: DocumentPropertyType, pub required: bool, } // @append_only -#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)] +#[derive(Debug, PartialEq, Clone)] pub enum DocumentPropertyType { ///Todo decompose integer Integer, diff --git a/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs b/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs index 0f3068574d..8b1c1841ad 100644 --- a/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs +++ b/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs @@ -110,7 +110,7 @@ use crate::ProtocolError; use bincode::{Decode, Encode}; use indexmap::IndexMap; use itertools::Itertools; -use platform_value::Identifier; +use platform_value::{platform_value, Identifier}; use rand::rngs::StdRng; use rand::seq::SliceRandom; use rand::Rng; @@ -568,14 +568,14 @@ impl DocumentTypeV0 { )?; // Combine everything into the final schema - let schema = json!({ + let schema = platform_value!({ "invalid": "yo", }); // TODO: It might not work properly Ok(DocumentTypeV0 { name, - schema: schema.into(), + schema, indices, index_structure, flattened_properties: properties.clone(), diff --git a/packages/rs-dpp/src/data_contract/factory/v0/mod.rs b/packages/rs-dpp/src/data_contract/factory/v0/mod.rs index 094965e36d..793945792a 100644 --- a/packages/rs-dpp/src/data_contract/factory/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/factory/v0/mod.rs @@ -9,6 +9,7 @@ use crate::data_contract::config::DataContractConfig; #[cfg(feature = "data-contract-value-conversion")] use crate::data_contract::conversion::value::v0::DataContractValueConversionMethodsV0; use crate::data_contract::created_data_contract::CreatedDataContract; +#[cfg(feature = "data-contract-value-conversion")] use crate::data_contract::data_contract::DataContractV0; use crate::data_contract::serialized_version::v0::DataContractInSerializationFormatV0; use crate::data_contract::serialized_version::DataContractInSerializationFormat; diff --git a/packages/rs-dpp/src/data_contract/serialized_version/mod.rs b/packages/rs-dpp/src/data_contract/serialized_version/mod.rs index eaf86bdd68..79879a9754 100644 --- a/packages/rs-dpp/src/data_contract/serialized_version/mod.rs +++ b/packages/rs-dpp/src/data_contract/serialized_version/mod.rs @@ -11,6 +11,7 @@ use derive_more::From; use platform_value::{Identifier, Value}; use platform_version::TryFromPlatformVersioned; use platform_versioning::PlatformVersioned; +#[cfg(feature = "data-contract-serde-conversion")] use serde::{Deserialize, Serialize}; pub(in crate::data_contract) mod v0; diff --git a/packages/rs-dpp/src/document/document_factory/v0/mod.rs b/packages/rs-dpp/src/document/document_factory/v0/mod.rs index d90199dc88..957d129f3c 100644 --- a/packages/rs-dpp/src/document/document_factory/v0/mod.rs +++ b/packages/rs-dpp/src/document/document_factory/v0/mod.rs @@ -18,10 +18,10 @@ use platform_value::{Bytes32, Identifier, Value}; use crate::data_contract::document_type::methods::DocumentTypeV0Methods; use crate::document::document_methods::DocumentMethodsV0; #[cfg(feature = "extended-document")] -use crate::document::extended_document::v0::ExtendedDocumentV0; -use crate::document::serialization_traits::DocumentPlatformConversionMethodsV0; -#[cfg(feature = "extended-document")] -use crate::document::ExtendedDocument; +use crate::document::{ + extended_document::v0::ExtendedDocumentV0, + serialization_traits::DocumentPlatformConversionMethodsV0, ExtendedDocument, +}; use crate::prelude::{BlockHeight, CoreBlockHeight, TimestampMillis}; #[cfg(feature = "state-transitions")] use crate::state_transition::documents_batch_transition::{ diff --git a/packages/rs-dpp/src/document/extended_document/mod.rs b/packages/rs-dpp/src/document/extended_document/mod.rs index a7fefc20bd..17ba5312bb 100644 --- a/packages/rs-dpp/src/document/extended_document/mod.rs +++ b/packages/rs-dpp/src/document/extended_document/mod.rs @@ -338,6 +338,8 @@ mod test { use crate::data_contract::document_type::random_document::CreateRandomDocument; use crate::document::serialization_traits::ExtendedDocumentPlatformConversionMethodsV0; use crate::tests::fixtures::get_dashpay_contract_fixture; + use base64::prelude::BASE64_STANDARD; + use base64::Engine; fn init() { let _ = env_logger::builder() @@ -611,11 +613,11 @@ mod test { ); assert_eq!( json_document["alphaBinary"], - JsonValue::String(base64::encode(&alpha_value)) + JsonValue::String(BASE64_STANDARD.encode(&alpha_value)) ); assert_eq!( json_document["alphaIdentifier"], - JsonValue::String(base64::encode(&alpha_value)) + JsonValue::String(BASE64_STANDARD.encode(&alpha_value)) ); } diff --git a/packages/rs-dpp/src/document/serialization_traits/platform_serialization_conversion/deserialize/v0/mod.rs b/packages/rs-dpp/src/document/serialization_traits/platform_serialization_conversion/deserialize/v0/mod.rs index fdf1fa37e9..ac52261c8e 100644 --- a/packages/rs-dpp/src/document/serialization_traits/platform_serialization_conversion/deserialize/v0/mod.rs +++ b/packages/rs-dpp/src/document/serialization_traits/platform_serialization_conversion/deserialize/v0/mod.rs @@ -1,5 +1,6 @@ use crate::data_contract::document_type::DocumentTypeRef; use crate::data_contract::errors::DataContractError; +#[cfg(feature = "extended-document")] use crate::ProtocolError; use platform_version::version::PlatformVersion; diff --git a/packages/rs-dpp/src/document/serialization_traits/platform_serialization_conversion/serialize/v0/mod.rs b/packages/rs-dpp/src/document/serialization_traits/platform_serialization_conversion/serialize/v0/mod.rs index a313841237..3e62bf50e1 100644 --- a/packages/rs-dpp/src/document/serialization_traits/platform_serialization_conversion/serialize/v0/mod.rs +++ b/packages/rs-dpp/src/document/serialization_traits/platform_serialization_conversion/serialize/v0/mod.rs @@ -1,5 +1,6 @@ use crate::data_contract::document_type::DocumentTypeRef; use crate::ProtocolError; +#[cfg(feature = "extended-document")] use platform_version::version::PlatformVersion; pub(in crate::document) trait DocumentPlatformSerializationMethodsV0 { diff --git a/packages/rs-dpp/src/document/specialized_document_factory/v0/mod.rs b/packages/rs-dpp/src/document/specialized_document_factory/v0/mod.rs index 525e93618d..e7b4c3c221 100644 --- a/packages/rs-dpp/src/document/specialized_document_factory/v0/mod.rs +++ b/packages/rs-dpp/src/document/specialized_document_factory/v0/mod.rs @@ -17,10 +17,10 @@ use platform_value::{Bytes32, Identifier, Value}; use crate::data_contract::document_type::methods::DocumentTypeV0Methods; #[cfg(feature = "extended-document")] -use crate::document::extended_document::v0::ExtendedDocumentV0; -use crate::document::serialization_traits::DocumentPlatformConversionMethodsV0; -#[cfg(feature = "extended-document")] -use crate::document::ExtendedDocument; +use crate::document::{ + extended_document::v0::ExtendedDocumentV0, + serialization_traits::DocumentPlatformConversionMethodsV0, ExtendedDocument, +}; use crate::prelude::{BlockHeight, CoreBlockHeight, TimestampMillis}; #[cfg(feature = "state-transitions")] use crate::state_transition::documents_batch_transition::{ diff --git a/packages/rs-dpp/src/document/v0/mod.rs b/packages/rs-dpp/src/document/v0/mod.rs index c67f2cf676..32d3957780 100644 --- a/packages/rs-dpp/src/document/v0/mod.rs +++ b/packages/rs-dpp/src/document/v0/mod.rs @@ -17,6 +17,7 @@ use std::collections::BTreeMap; use std::fmt; use platform_value::Value; +#[cfg(feature = "document-serde-conversion")] use serde::{Deserialize, Serialize}; use crate::document::document_methods::{ diff --git a/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs b/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs index 1005ccce31..13acb07129 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs @@ -4,6 +4,8 @@ use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; use thiserror::Error; use crate::consensus::basic::data_contract::data_contract_max_depth_exceed_error::DataContractMaxDepthExceedError; +#[cfg(feature = "json-schema-validation")] +use crate::consensus::basic::data_contract::InvalidJsonSchemaRefError; use crate::consensus::basic::data_contract::{ DataContractEmptySchemaError, DataContractHaveNewUniqueIndexError, DataContractImmutablePropertiesUpdateError, DataContractInvalidIndexDefinitionUpdateError, @@ -11,9 +13,9 @@ use crate::consensus::basic::data_contract::{ IncompatibleDataContractSchemaError, IncompatibleRe2PatternError, InvalidCompoundIndexError, InvalidDataContractIdError, InvalidDataContractVersionError, InvalidDocumentTypeNameError, InvalidDocumentTypeRequiredSecurityLevelError, InvalidIndexPropertyTypeError, - InvalidIndexedPropertyConstraintError, InvalidJsonSchemaRefError, - SystemPropertyIndexAlreadyPresentError, UndefinedIndexPropertyError, - UniqueIndicesLimitReachedError, UnknownSecurityLevelError, UnknownStorageKeyRequirementsError, + InvalidIndexedPropertyConstraintError, SystemPropertyIndexAlreadyPresentError, + UndefinedIndexPropertyError, UniqueIndicesLimitReachedError, UnknownSecurityLevelError, + UnknownStorageKeyRequirementsError, }; use crate::consensus::basic::decode::{ ProtocolVersionParsingError, SerializedObjectParsingError, VersionError, @@ -56,10 +58,12 @@ use crate::consensus::basic::state_transition::{ use crate::consensus::basic::{IncompatibleProtocolVersionError, UnsupportedProtocolVersionError}; use crate::consensus::ConsensusError; -use crate::consensus::basic::json_schema_compilation_error::JsonSchemaCompilationError; -use crate::consensus::basic::json_schema_error::JsonSchemaError; use crate::consensus::basic::unsupported_version_error::UnsupportedVersionError; use crate::consensus::basic::value_error::ValueError; +#[cfg(feature = "json-schema-validation")] +use crate::consensus::basic::{ + json_schema_compilation_error::JsonSchemaCompilationError, json_schema_error::JsonSchemaError, +}; use crate::consensus::state::identity::master_public_key_update_error::MasterPublicKeyUpdateError; use crate::data_contract::errors::DataContractError; @@ -98,10 +102,12 @@ pub enum BasicError { #[error(transparent)] IncompatibleProtocolVersionError(IncompatibleProtocolVersionError), + #[cfg(feature = "json-schema-validation")] // Structure error #[error(transparent)] JsonSchemaCompilationError(JsonSchemaCompilationError), + #[cfg(feature = "json-schema-validation")] #[error(transparent)] JsonSchemaError(JsonSchemaError), @@ -133,6 +139,7 @@ pub enum BasicError { #[error(transparent)] InvalidIndexPropertyTypeError(InvalidIndexPropertyTypeError), + #[cfg(feature = "json-schema-validation")] #[error(transparent)] InvalidJsonSchemaRefError(InvalidJsonSchemaRefError), diff --git a/packages/rs-dpp/src/errors/consensus/basic/data_contract/mod.rs b/packages/rs-dpp/src/errors/consensus/basic/data_contract/mod.rs index 5a5fdb4457..e82ffc305e 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/data_contract/mod.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/data_contract/mod.rs @@ -15,6 +15,7 @@ mod invalid_document_type_name_error; mod invalid_document_type_required_security_level; mod invalid_index_property_type_error; mod invalid_indexed_property_constraint_error; +#[cfg(feature = "json-schema-validation")] mod invalid_json_schema_ref_error; mod system_property_index_already_present_error; mod undefined_index_property_error; @@ -37,6 +38,7 @@ pub use invalid_data_contract_version_error::*; pub use invalid_document_type_required_security_level::*; pub use invalid_index_property_type_error::*; pub use invalid_indexed_property_constraint_error::*; +#[cfg(feature = "json-schema-validation")] pub use invalid_json_schema_ref_error::*; pub use system_property_index_already_present_error::*; diff --git a/packages/rs-dpp/src/errors/consensus/basic/mod.rs b/packages/rs-dpp/src/errors/consensus/basic/mod.rs index 1c417e2ee8..d38bbe0938 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/mod.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/mod.rs @@ -12,7 +12,9 @@ pub mod unsupported_protocol_version_error; pub mod basic_error; pub mod invalid_identifier_error; +#[cfg(feature = "json-schema-validation")] pub mod json_schema_compilation_error; +#[cfg(feature = "json-schema-validation")] pub mod json_schema_error; pub mod state_transition; pub mod unsupported_version_error; diff --git a/packages/rs-dpp/src/errors/consensus/codes.rs b/packages/rs-dpp/src/errors/consensus/codes.rs index 5d597a6c5e..92a6187aa7 100644 --- a/packages/rs-dpp/src/errors/consensus/codes.rs +++ b/packages/rs-dpp/src/errors/consensus/codes.rs @@ -38,7 +38,9 @@ impl ErrorWithCode for BasicError { Self::VersionError(_) => 10005, // Structure Errors: 10100-10199 + #[cfg(feature = "json-schema-validation")] Self::JsonSchemaCompilationError(..) => 10100, + #[cfg(feature = "json-schema-validation")] Self::JsonSchemaError(_) => 10101, Self::InvalidIdentifierError { .. } => 10102, Self::ValueError(_) => 10103, @@ -51,6 +53,7 @@ impl ErrorWithCode for BasicError { Self::InvalidDataContractIdError { .. } => 10204, Self::InvalidIndexedPropertyConstraintError { .. } => 10205, Self::InvalidIndexPropertyTypeError { .. } => 10206, + #[cfg(feature = "json-schema-validation")] Self::InvalidJsonSchemaRefError { .. } => 10207, Self::SystemPropertyIndexAlreadyPresentError { .. } => 10208, Self::UndefinedIndexPropertyError { .. } => 10209, diff --git a/packages/rs-dpp/src/errors/consensus/signature/wrong_public_key_purpose_error.rs b/packages/rs-dpp/src/errors/consensus/signature/wrong_public_key_purpose_error.rs index 6b4c4ddb28..501cf0d64b 100644 --- a/packages/rs-dpp/src/errors/consensus/signature/wrong_public_key_purpose_error.rs +++ b/packages/rs-dpp/src/errors/consensus/signature/wrong_public_key_purpose_error.rs @@ -46,7 +46,10 @@ impl From for ConsensusError { } } -#[cfg(all(feature = "state-transitions", feature = "validation"))] +#[cfg(any( + all(feature = "state-transitions", feature = "validation"), + feature = "state-transition-validation" +))] // This is a separate error of the same name, but from ProtocolError impl From for ConsensusError { fn from(value: crate::state_transition::errors::WrongPublicKeyPurposeError) -> Self { diff --git a/packages/rs-dpp/src/errors/dpp_init_error.rs b/packages/rs-dpp/src/errors/dpp_init_error.rs index 9fa82c3f6f..baf41047c2 100644 --- a/packages/rs-dpp/src/errors/dpp_init_error.rs +++ b/packages/rs-dpp/src/errors/dpp_init_error.rs @@ -1,15 +1,10 @@ -use std::borrow::Cow; - use crate::version::FeatureVersion; -use jsonschema::ValidationError; use thiserror::Error; #[derive(Error, Debug)] pub enum DashPlatformProtocolInitError { #[error(transparent)] SchemaDeserializationError(serde_json::Error), - #[error(transparent)] - ValidationError(ValidationError<'static>), #[error("Loaded Schema is invalid: {0}")] InvalidSchemaError(&'static str), #[error("platform init unknown version on {method}, received: {received}")] @@ -23,23 +18,8 @@ pub enum DashPlatformProtocolInitError { }, } -fn into_owned(err: ValidationError) -> ValidationError<'static> { - ValidationError { - instance_path: err.instance_path.clone(), - instance: Cow::Owned(err.instance.into_owned()), - kind: err.kind, - schema_path: err.schema_path, - } -} - impl From for DashPlatformProtocolInitError { fn from(error: serde_json::Error) -> Self { Self::SchemaDeserializationError(error) } } - -impl<'a> From> for DashPlatformProtocolInitError { - fn from(err: ValidationError<'a>) -> Self { - Self::ValidationError(into_owned(err)) - } -} diff --git a/packages/rs-dpp/src/errors/protocol_error.rs b/packages/rs-dpp/src/errors/protocol_error.rs index 4f8b4dec40..13e5c005e8 100644 --- a/packages/rs-dpp/src/errors/protocol_error.rs +++ b/packages/rs-dpp/src/errors/protocol_error.rs @@ -7,11 +7,31 @@ use crate::consensus::signature::{ use crate::consensus::ConsensusError; use crate::data_contract::errors::*; use crate::document::errors::*; + +#[cfg(any( + feature = "state-transition-validation", + feature = "state-transition-signing" +))] +use crate::state_transition::errors::InvalidIdentityPublicKeyTypeError; + +#[cfg(any( + all(feature = "state-transitions", feature = "validation"), + feature = "state-transition-validation" +))] +use crate::state_transition::errors::StateTransitionError; + +#[cfg(any( + all(feature = "state-transitions", feature = "validation"), + feature = "state-transition-validation", + feature = "state-transition-signing", + feature = "state-transition-validation" +))] +use crate::state_transition::errors::WrongPublicKeyPurposeError; + #[cfg(feature = "state-transition-validation")] use crate::state_transition::errors::{ - InvalidIdentityPublicKeyTypeError, InvalidSignaturePublicKeyError, PublicKeyMismatchError, - PublicKeySecurityLevelNotMetError, StateTransitionError, StateTransitionIsNotSignedError, - WrongPublicKeyPurposeError, + InvalidSignaturePublicKeyError, PublicKeyMismatchError, PublicKeySecurityLevelNotMetError, + StateTransitionIsNotSignedError, }; use crate::{ CompatibleProtocolVersionIsNotDefinedError, DashPlatformProtocolInitError, @@ -128,7 +148,12 @@ pub enum ProtocolError { #[cfg(feature = "state-transition-validation")] #[error(transparent)] PublicKeySecurityLevelNotMetError(PublicKeySecurityLevelNotMetError), - #[cfg(feature = "state-transition-validation")] + #[cfg(any( + all(feature = "state-transitions", feature = "validation"), + feature = "state-transition-validation", + feature = "state-transition-signing", + feature = "state-transition-validation" + ))] #[error(transparent)] WrongPublicKeyPurposeError(WrongPublicKeyPurposeError), #[cfg(feature = "state-transition-validation")] diff --git a/packages/rs-dpp/src/lib.rs b/packages/rs-dpp/src/lib.rs index 16c3afbfee..cef2d9f3e7 100644 --- a/packages/rs-dpp/src/lib.rs +++ b/packages/rs-dpp/src/lib.rs @@ -50,6 +50,7 @@ pub mod system_data_contracts; pub mod withdrawal; pub use async_trait; + pub use bls::*; pub mod prelude { @@ -77,9 +78,13 @@ pub mod prelude { } pub use bincode; +#[cfg(all(not(target_arch = "wasm32"), feature = "bls-signatures"))] pub use bls_signatures; +#[cfg(feature = "system_contracts")] pub use data_contracts; +#[cfg(feature = "ed25519-dalek")] pub use ed25519_dalek; +#[cfg(feature = "jsonschema")] pub use jsonschema; pub use platform_serialization; pub use platform_value; diff --git a/packages/rs-dpp/src/state_transition/abstract_state_transition.rs b/packages/rs-dpp/src/state_transition/abstract_state_transition.rs index 47ab047381..7bd8e8f9f1 100644 --- a/packages/rs-dpp/src/state_transition/abstract_state_transition.rs +++ b/packages/rs-dpp/src/state_transition/abstract_state_transition.rs @@ -1,12 +1,15 @@ use serde::Serialize; +#[cfg(feature = "state-transition-json-conversion")] use serde_json::Value as JsonValue; pub mod state_transition_helpers { use super::*; use crate::ProtocolError; use platform_value::Value; + #[cfg(feature = "state-transition-json-conversion")] use std::convert::TryInto; + #[cfg(feature = "state-transition-json-conversion")] pub fn to_json<'a, I: IntoIterator>( serializable: impl Serialize, skip_signature_paths: I, diff --git a/packages/rs-dpp/src/state_transition/errors/mod.rs b/packages/rs-dpp/src/state_transition/errors/mod.rs index 2acefb9df1..aa6cd9e5ed 100644 --- a/packages/rs-dpp/src/state_transition/errors/mod.rs +++ b/packages/rs-dpp/src/state_transition/errors/mod.rs @@ -1,7 +1,6 @@ #[cfg(any( feature = "state-transition-validation", - feature = "state-transition-signing", - feature = "message-signing", + feature = "state-transition-signing" ))] mod invalid_identity_public_key_type_error; #[cfg(any( @@ -13,13 +12,18 @@ mod invalid_signature_public_key_error; mod public_key_mismatch_error; #[cfg(feature = "state-transition-validation")] mod public_key_security_level_not_met_error; -#[cfg(feature = "state-transition-validation")] +#[cfg(any( + all(feature = "state-transitions", feature = "validation"), + feature = "state-transition-validation" +))] mod state_transition_error; #[cfg(feature = "state-transition-validation")] mod state_transition_is_not_signed_error; #[cfg(any( + all(feature = "state-transitions", feature = "validation"), feature = "state-transition-validation", - feature = "state-transition-signing" + feature = "state-transition-signing", + feature = "state-transition-validation" ))] mod wrong_public_key_purpose_error; @@ -37,9 +41,17 @@ pub use invalid_signature_public_key_error::*; pub use public_key_mismatch_error::*; #[cfg(feature = "state-transition-validation")] pub use public_key_security_level_not_met_error::*; -#[cfg(feature = "state-transition-validation")] +#[cfg(any( + all(feature = "state-transitions", feature = "validation"), + feature = "state-transition-validation" +))] pub use state_transition_error::*; #[cfg(feature = "state-transition-validation")] pub use state_transition_is_not_signed_error::*; -#[cfg(feature = "state-transition-validation")] +#[cfg(any( + all(feature = "state-transitions", feature = "validation"), + feature = "state-transition-validation", + feature = "state-transition-signing", + feature = "state-transition-validation" +))] pub use wrong_public_key_purpose_error::*; diff --git a/packages/rs-dpp/src/state_transition/serialization.rs b/packages/rs-dpp/src/state_transition/serialization.rs index 1c1722c5ab..219de5401c 100644 --- a/packages/rs-dpp/src/state_transition/serialization.rs +++ b/packages/rs-dpp/src/state_transition/serialization.rs @@ -13,6 +13,7 @@ impl StateTransition { #[cfg(test)] mod tests { + use crate::bls::native_bls::NativeBlsModule; use crate::data_contract::accessors::v0::DataContractV0Getters; use crate::identity::accessors::IdentityGettersV0; use crate::identity::core_script::CoreScript; @@ -44,7 +45,7 @@ mod tests { }; use crate::version::PlatformVersion; use crate::withdrawal::Pooling; - use crate::{NativeBlsModule, ProtocolError}; + use crate::ProtocolError; use platform_version::version::LATEST_PLATFORM_VERSION; use platform_version::TryIntoPlatformVersioned; use rand::rngs::StdRng; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/v0/state_transition_like.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/v0/state_transition_like.rs index 5ada17858d..94936be6a1 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/v0/state_transition_like.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_update_transition/v0/state_transition_like.rs @@ -1,3 +1,5 @@ +use base64::prelude::BASE64_STANDARD; +use base64::Engine; use platform_value::BinaryData; use crate::prelude::UserFeeIncrease; @@ -45,8 +47,8 @@ impl StateTransitionLike for DataContractUpdateTransitionV0 { fn unique_identifiers(&self) -> Vec { vec![format!( "{}-{}-{:x}", - base64::encode(self.data_contract.owner_id()), - base64::encode(self.data_contract.id()), + BASE64_STANDARD.encode(self.data_contract.owner_id()), + BASE64_STANDARD.encode(self.data_contract.id()), self.identity_contract_nonce )] } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/mod.rs index 046e6eee7b..f62e971fb7 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/mod.rs @@ -96,7 +96,7 @@ pub enum DocumentsBatchTransition { // let maybe_signature = json_value.get_string(property_names::SIGNATURE).ok(); // let signature = if let Some(signature) = maybe_signature { // Some(BinaryData( -// base64::decode(signature).context("signature exists but isn't valid base64")?, +// BASE64_STANDARD.decode(signature).context("signature exists but isn't valid base64")?, // )) // } else { // None @@ -561,7 +561,7 @@ pub fn get_security_level_requirement(v: &Value, default: SecurityLevel) -> Secu // let data_contract_id = // Identifier::from_string(data_contract_id_base58, Encoding::Base58).unwrap(); // let owner_id = Identifier::from_string(owner_id_base58, Encoding::Base58).unwrap(); -// let entropy_bytes: [u8; 32] = base64::decode(entropy_base64).unwrap().try_into().unwrap(); +// let entropy_bytes: [u8; 32] = BASE64_STANDARD.decode(entropy_base64).unwrap().try_into().unwrap(); // // let mut data_contract = get_data_contract_fixture(Some(owner_id)).data_contract; // data_contract.id = data_contract_id; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/state_transition_like.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/state_transition_like.rs index 4e7f896ef7..3ce7628de1 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/state_transition_like.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/state_transition_like.rs @@ -7,6 +7,8 @@ use crate::state_transition::documents_batch_transition::{ use crate::state_transition::StateTransitionType::DocumentsBatch; use crate::state_transition::{StateTransition, StateTransitionLike, StateTransitionType}; use crate::version::FeatureVersion; +use base64::prelude::BASE64_STANDARD; +use base64::Engine; use platform_value::{BinaryData, Identifier}; impl From for StateTransition { @@ -54,8 +56,8 @@ impl StateTransitionLike for DocumentsBatchTransitionV0 { .map(|transition| { format!( "{}-{}-{:x}", - base64::encode(self.owner_id), - base64::encode(transition.data_contract_id()), + BASE64_STANDARD.encode(self.owner_id), + BASE64_STANDARD.encode(transition.data_contract_id()), transition.identity_contract_nonce() ) }) diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/state_transition_like.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/state_transition_like.rs index 9aa5ee38a6..1d20954a38 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/state_transition_like.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/state_transition_like.rs @@ -1,3 +1,5 @@ +use base64::prelude::BASE64_STANDARD; +use base64::Engine; use platform_value::BinaryData; use crate::prelude::UserFeeIncrease; @@ -53,7 +55,7 @@ impl StateTransitionLike for IdentityCreateTransitionV0 { /// this is based on the asset lock fn unique_identifiers(&self) -> Vec { - vec![base64::encode(self.identity_id)] + vec![BASE64_STANDARD.encode(self.identity_id)] } fn user_fee_increase(&self) -> UserFeeIncrease { diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/v0/state_transition_like.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/v0/state_transition_like.rs index 95133643c2..f8bde2b527 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/v0/state_transition_like.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/v0/state_transition_like.rs @@ -1,3 +1,5 @@ +use base64::prelude::BASE64_STANDARD; +use base64::Engine; use platform_value::BinaryData; use crate::prelude::UserFeeIncrease; @@ -55,7 +57,7 @@ impl StateTransitionLike for IdentityCreditTransferTransitionV0 { fn unique_identifiers(&self) -> Vec { vec![format!( "{}-{:x}", - base64::encode(self.identity_id), + BASE64_STANDARD.encode(self.identity_id), self.nonce )] } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/mod.rs index dc0b3af805..f773296936 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/mod.rs @@ -18,7 +18,6 @@ use crate::state_transition::StateTransitionFieldTypes; use crate::identity::state_transition::OptionallyAssetLockProved; use crate::ProtocolError; use bincode::{Decode, Encode}; -use data_contracts::withdrawals_contract::v1::document_types::withdrawal::properties::OUTPUT_SCRIPT; use derive_more::From; use fields::*; use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize, PlatformSignable}; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/state_transition_like.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/state_transition_like.rs index 15c9358967..b433e7f78b 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/state_transition_like.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/state_transition_like.rs @@ -1,3 +1,5 @@ +use base64::prelude::BASE64_STANDARD; +use base64::Engine; use platform_value::BinaryData; use crate::prelude::UserFeeIncrease; @@ -56,7 +58,7 @@ impl StateTransitionLike for IdentityCreditWithdrawalTransitionV0 { fn unique_identifiers(&self) -> Vec { vec![format!( "{}-{:x}", - base64::encode(self.identity_id), + BASE64_STANDARD.encode(self.identity_id), self.nonce )] } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/v0/state_transition_like.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/v0/state_transition_like.rs index a04e462f90..c0e84b249e 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/v0/state_transition_like.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_topup_transition/v0/state_transition_like.rs @@ -1,3 +1,5 @@ +use base64::prelude::BASE64_STANDARD; +use base64::Engine; use platform_value::BinaryData; use crate::prelude::UserFeeIncrease; @@ -57,7 +59,7 @@ impl StateTransitionLike for IdentityTopUpTransitionV0 { let identifier = self.asset_lock_proof.create_identifier(); match identifier { Ok(identifier) => { - vec![base64::encode(identifier)] + vec![BASE64_STANDARD.encode(identifier)] } Err(_) => { // no unique identifier, this won't actually occur on Platform diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/state_transition_like.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/state_transition_like.rs index 8145e1d385..0b5f409080 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/state_transition_like.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_update_transition/v0/state_transition_like.rs @@ -1,3 +1,5 @@ +use base64::prelude::BASE64_STANDARD; +use base64::Engine; use platform_value::BinaryData; use crate::prelude::UserFeeIncrease; @@ -55,7 +57,7 @@ impl StateTransitionLike for IdentityUpdateTransitionV0 { fn unique_identifiers(&self) -> Vec { vec![format!( "{}-{:x}", - base64::encode(self.identity_id), + BASE64_STANDARD.encode(self.identity_id), self.nonce )] } diff --git a/packages/rs-dpp/src/tests/utils/error_helpers.rs b/packages/rs-dpp/src/tests/utils/error_helpers.rs deleted file mode 100644 index fe53c3bb7a..0000000000 --- a/packages/rs-dpp/src/tests/utils/error_helpers.rs +++ /dev/null @@ -1,110 +0,0 @@ -use crate::consensus::basic::json_schema_error::JsonSchemaError; -use crate::consensus::basic::value_error::ValueError; -use crate::consensus::basic::BasicError; -use crate::consensus::fee::fee_error::FeeError; -use crate::consensus::signature::SignatureError; -use crate::consensus::state::state_error::StateError; -use crate::consensus::ConsensusError; -use crate::validation::{ConsensusValidationResult, SimpleConsensusValidationResult}; - -pub fn get_schema_error( - result: &SimpleConsensusValidationResult, - number: usize, -) -> &JsonSchemaError { - json_schema_error( - result - .errors - .get(number) - .expect("the error should be returned in validation result"), - ) -} - -pub fn get_basic_error(consensus_error: &ConsensusError) -> &BasicError { - match consensus_error { - ConsensusError::BasicError(basic_error) => basic_error, - _ => panic!("error '{:?}' isn't a basic error", consensus_error), - } -} - -// TODO: Not sure it should be here. Looks more like a test helper -pub fn json_schema_error(consensus_error: &ConsensusError) -> &JsonSchemaError { - match consensus_error { - ConsensusError::BasicError(BasicError::JsonSchemaError(err)) => err, - _ => panic!("error '{:?}' isn't a json schema error", consensus_error), - } -} - -pub fn value_error(consensus_error: &ConsensusError) -> &ValueError { - match consensus_error { - ConsensusError::BasicError(BasicError::ValueError(err)) => err, - _ => panic!("error '{:?}' isn't a value error", consensus_error), - } -} - -pub fn get_state_error_from_result( - result: &ConsensusValidationResult, - error_number: usize, -) -> &StateError { - match result - .errors - .get(error_number) - .expect("error should be found") - { - ConsensusError::StateError(state_error) => state_error, - _ => panic!( - "error '{:?}' isn't a state error", - result.errors[error_number] - ), - } -} - -pub fn get_basic_error_from_result( - result: &SimpleConsensusValidationResult, - error_number: usize, -) -> &BasicError { - match result - .errors - .get(error_number) - .expect("basic error should be found") - { - ConsensusError::BasicError(basic_error) => basic_error, - _ => panic!( - "error '{:?}' isn't a Basic error", - result.errors[error_number] - ), - } -} - -pub fn get_signature_error_from_result( - result: &ConsensusValidationResult, - error_number: usize, -) -> &SignatureError { - match result - .errors - .get(error_number) - .expect("error should be found") - { - ConsensusError::SignatureError(signature_error) => signature_error, - _ => panic!( - "error '{:?}' isn't a Signature error", - result.errors[error_number] - ), - } -} - -pub fn get_fee_error_from_result( - result: &ConsensusValidationResult, - error_number: usize, -) -> &FeeError { - match result - .errors - .get(error_number) - .expect("error should be found") - { - ConsensusError::FeeError(signature_error) => signature_error, - _ => panic!( - "error '{:?}' isn't a Fee error", - result.errors[error_number] - ), - } -} diff --git a/packages/rs-dpp/src/tests/utils/mod.rs b/packages/rs-dpp/src/tests/utils/mod.rs index ad4055a61b..0fc0b6d0e9 100644 --- a/packages/rs-dpp/src/tests/utils/mod.rs +++ b/packages/rs-dpp/src/tests/utils/mod.rs @@ -1,5 +1,2 @@ -pub use error_helpers::*; pub use utils::*; - -mod error_helpers; mod utils; diff --git a/packages/rs-dpp/src/util/cbor_value/convert.rs b/packages/rs-dpp/src/util/cbor_value/convert.rs index 18e8af258c..fc1698e766 100644 --- a/packages/rs-dpp/src/util/cbor_value/convert.rs +++ b/packages/rs-dpp/src/util/cbor_value/convert.rs @@ -1,3 +1,5 @@ +use base64::prelude::BASE64_STANDARD; +use base64::Engine; use std::convert::TryInto; use ciborium::value::Value as CborValue; @@ -40,7 +42,7 @@ pub(super) fn convert_to( FieldType::StringBase64 => { let text = cbor_value.as_text()?; - base64::decode(text).ok()? + BASE64_STANDARD.decode(text).ok()? } }; @@ -56,7 +58,7 @@ pub(super) fn convert_to( } FieldType::StringBase64 => { - let encoded = base64::encode(data_bytes); + let encoded = BASE64_STANDARD.encode(data_bytes); CborValue::Text(encoded) } }; @@ -96,6 +98,9 @@ mod tests { let result = convert_to(&cbor_value, FieldType::ArrayInt, FieldType::StringBase64) .expect("no error"); - assert_eq!(CborValue::Text(base64::encode(vec![0_u8; 32])), result); + assert_eq!( + CborValue::Text(BASE64_STANDARD.encode(vec![0_u8; 32])), + result + ); } } diff --git a/packages/rs-dpp/src/util/deserializer.rs b/packages/rs-dpp/src/util/deserializer.rs index b9dc94db20..301bdf24d2 100644 --- a/packages/rs-dpp/src/util/deserializer.rs +++ b/packages/rs-dpp/src/util/deserializer.rs @@ -69,13 +69,16 @@ pub fn split_cbor_feature_version( } pub mod serde_entropy { + use base64::prelude::BASE64_STANDARD; + use base64::Engine; use std::convert::TryInto; use serde::{Deserialize, Deserializer, Serializer}; pub fn deserialize<'de, D: Deserializer<'de>>(d: D) -> Result<[u8; 32], D::Error> { let data: String = Deserialize::deserialize(d)?; - base64::decode(&data) + BASE64_STANDARD + .decode(&data) .map_err(|e| { serde::de::Error::custom(format!("Unable to decode {}' with base64 - {}", data, e)) })? @@ -92,6 +95,6 @@ pub mod serde_entropy { where S: Serializer, { - serializer.serialize_str(&base64::encode(buffer)) + serializer.serialize_str(&BASE64_STANDARD.encode(buffer)) } } diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index 97a96e79b0..92429a80be 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -24,7 +24,7 @@ serde_with = { version = "3.1.0", features = [ "macros", ], default-features = false } drive = { path = "../rs-drive", default-features = false, features = [ - "full", + "server", "grovedb_operations_logging", ] } thiserror = "1.0.30" @@ -100,7 +100,7 @@ drive = { path = "../rs-drive" } strategy-tests = { path = "../strategy-tests" } # For tests of grovedb verify -rocksdb = { version = "0.21.0" } +rocksdb = { version = "0.22.0" } integer-encoding = { version = "4.0.0" } [features] diff --git a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs index 9ca13e8a7a..888e66f324 100644 --- a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs @@ -207,6 +207,7 @@ mod tests { use dpp::prelude::{Identifier, IdentityPublicKey}; use dpp::serialization::{PlatformSerializable, Signable}; + use dpp::native_bls::NativeBlsModule; use dpp::state_transition::documents_batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; use dpp::state_transition::identity_create_transition::methods::IdentityCreateTransitionMethodsV0; @@ -223,7 +224,6 @@ mod tests { instant_asset_lock_proof_fixture, }; use dpp::version::PlatformVersion; - use dpp::NativeBlsModule; use crate::execution::check_tx::CheckTxLevel::{FirstTimeCheck, Recheck}; use dpp::consensus::state::state_error::StateError; diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/process_block_fees/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/process_block_fees/v0/mod.rs index 2c83e3e1ea..0b92b87f24 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/process_block_fees/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/process_block_fees/v0/mod.rs @@ -224,7 +224,7 @@ mod tests { use crate::config::ExecutionConfig; use crate::{config::PlatformConfig, test::helpers::setup::TestPlatformBuilder}; - use drive::common::identities::create_test_masternode_identities; + use drive::common::test_utils::identities::create_test_masternode_identities; mod helpers { use super::*; diff --git a/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/add_distribute_fees_from_oldest_unpaid_epoch_pool_to_proposers_operations/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/add_distribute_fees_from_oldest_unpaid_epoch_pool_to_proposers_operations/v0/mod.rs index fc6fc8bf64..d56373613f 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/add_distribute_fees_from_oldest_unpaid_epoch_pool_to_proposers_operations/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/add_distribute_fees_from_oldest_unpaid_epoch_pool_to_proposers_operations/v0/mod.rs @@ -92,7 +92,7 @@ mod tests { use super::*; use dpp::block::block_info::BlockInfo; - use drive::common::identities::create_test_masternode_identities_and_add_them_as_epoch_block_proposers; + use drive::common::test_utils::identities::create_test_masternode_identities_and_add_them_as_epoch_block_proposers; use crate::test::helpers::setup::TestPlatformBuilder; diff --git a/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/add_epoch_pool_to_proposers_payout_operations/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/add_epoch_pool_to_proposers_payout_operations/v0/mod.rs index d5a5d1705e..670f7dc1fe 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/add_epoch_pool_to_proposers_payout_operations/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/fee_pool_outwards_distribution/add_epoch_pool_to_proposers_payout_operations/v0/mod.rs @@ -174,7 +174,7 @@ mod tests { use dpp::block::block_info::BlockInfo; use dpp::identity::accessors::IdentityGettersV0; use dpp::platform_value::btreemap_extensions::BTreeValueMapHelper; - use drive::common::identities::create_test_masternode_identities_and_add_them_as_epoch_block_proposers; + use drive::common::test_utils::identities::create_test_masternode_identities_and_add_them_as_epoch_block_proposers; use drive::drive::batch::grovedb_op_batch::GroveDbOpBatchV0Methods; use drive::drive::batch::GroveDbOpBatch; use drive::fee_pools::epochs::operations_factory::EpochOperations; diff --git a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs index 694a02036d..0bbbd8ace8 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs @@ -314,8 +314,8 @@ mod tests { assert_eq!( root_hash, [ - 144, 123, 124, 62, 37, 243, 19, 45, 226, 49, 97, 251, 141, 197, 94, 69, 117, - 126, 182, 44, 148, 143, 41, 113, 245, 86, 229, 207, 100, 56, 17, 177 + 145, 134, 225, 227, 181, 246, 225, 73, 216, 216, 249, 73, 21, 213, 116, 110, + 85, 106, 80, 222, 95, 167, 97, 242, 69, 142, 176, 211, 89, 182, 162, 67 ] ) } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_state_transition_identity_signed/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_state_transition_identity_signed/v0/mod.rs index 5453e31883..00bc6ef682 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_state_transition_identity_signed/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_state_transition_identity_signed/v0/mod.rs @@ -15,18 +15,16 @@ use crate::execution::types::state_transition_execution_context::{ }; use dpp::consensus::ConsensusError; +use dpp::consensus::signature::{ + InvalidIdentityPublicKeyTypeError, MissingPublicKeyError, PublicKeyIsDisabledError, + SignatureError, +}; use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; +use dpp::native_bls::NativeBlsModule; use dpp::state_transition::StateTransition; use dpp::validation::ConsensusValidationResult; use dpp::version::PlatformVersion; use dpp::ProtocolError; -use dpp::{ - consensus::signature::{ - InvalidIdentityPublicKeyTypeError, MissingPublicKeyError, PublicKeyIsDisabledError, - SignatureError, - }, - NativeBlsModule, -}; use drive::dpp::identity::KeyType; use drive::drive::identity::key::fetch::IdentityKeysRequest; use drive::drive::Drive; diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identity_contract_nonce/v0/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identity_contract_nonce/v0/mod.rs index a25d95c98c..ff62101fcd 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/identity_contract_nonce/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identity_contract_nonce/v0/mod.rs @@ -85,7 +85,7 @@ mod tests { use dpp::identity::identity_nonce::{ IDENTITY_NONCE_VALUE_FILTER, IDENTITY_NONCE_VALUE_FILTER_MAX_BYTES, }; - use drive::common::identities::create_test_identity_with_rng; + use drive::common::test_utils::identities::create_test_identity_with_rng; use rand::rngs::StdRng; use rand::{Rng, SeedableRng}; diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identity_nonce/v0/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identity_nonce/v0/mod.rs index d64ca871d7..b98b3f07fd 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/identity_nonce/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identity_nonce/v0/mod.rs @@ -65,7 +65,7 @@ mod tests { use dpp::identity::identity_nonce::{ IDENTITY_NONCE_VALUE_FILTER, IDENTITY_NONCE_VALUE_FILTER_MAX_BYTES, }; - use drive::common::identities::create_test_identity_with_rng; + use drive::common::test_utils::identities::create_test_identity_with_rng; use rand::prelude::StdRng; use rand::{Rng, SeedableRng}; diff --git a/packages/rs-drive-abci/src/test/helpers/fee_pools.rs b/packages/rs-drive-abci/src/test/helpers/fee_pools.rs index 3d1373377a..01148aae50 100644 --- a/packages/rs-drive-abci/src/test/helpers/fee_pools.rs +++ b/packages/rs-drive-abci/src/test/helpers/fee_pools.rs @@ -49,7 +49,7 @@ use dpp::document::{DocumentV0, INITIAL_REVISION}; use dpp::identity::accessors::IdentityGettersV0; use dpp::system_data_contracts::masternode_reward_shares_contract::v1::document_types; use dpp::version::PlatformVersion; -use drive::common::identities::create_test_identity_with_rng; +use drive::common::test_utils::identities::create_test_identity_with_rng; use drive::dpp::document::Document; use drive::drive::flags::StorageFlags; use drive::drive::object_size_info::DocumentInfo::DocumentRefInfo; diff --git a/packages/rs-drive-abci/tests/strategy_tests/main.rs b/packages/rs-drive-abci/tests/strategy_tests/main.rs index be33e96e18..b98b88de9d 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/main.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/main.rs @@ -107,7 +107,6 @@ mod tests { use drive_abci::logging::LogLevel; use drive_abci::platform_types::platform_state::v0::PlatformStateV0Methods; - use drive_abci::rpc::core::QuorumListExtendedInfo; use itertools::Itertools; use tenderdash_abci::proto::abci::{RequestInfo, ResponseInfo}; @@ -1118,7 +1117,7 @@ mod tests { .unwrap() .unwrap() ), - "2d950355e6d8ddc3a726b211d68f79cc2d5c77a3c190b640c4ac08a00920a9b3".to_string() + "5dda9668d6efe6a481ec1d7ce3a1a77785aace12a853bea7eedcf37e9c5f8374".to_string() ) } @@ -1807,7 +1806,7 @@ mod tests { .unwrap() .unwrap() ), - "292700696d04d77de86c835b925d139c0bb606dc71c071c84e40303ea51d4986".to_string() + "909c3c0655fcb31a992899a1d2af59a8847f72126db56140ca91ac9591561ebe".to_string() ) } @@ -1932,7 +1931,7 @@ mod tests { .unwrap() .unwrap() ), - "03fdb219334b7786040ed2d55bdddef35a337426fa69f83d5671ddf400824309".to_string() + "58b6ae6a0468cb62d1947362cf92915ae046027a0501d808caa7bdcd2a23a10c".to_string() ) } diff --git a/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs b/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs index c1ca805bf1..353d098a8b 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs @@ -20,8 +20,7 @@ mod tests { use platform_version::version::mocks::v2_test::{TEST_PLATFORM_V2, TEST_PROTOCOL_VERSION_2}; use platform_version::version::mocks::v3_test::{TEST_PLATFORM_V3, TEST_PROTOCOL_VERSION_3}; use platform_version::version::mocks::TEST_PROTOCOL_VERSION_SHIFT_BYTES; - use platform_version::version::v1::{PLATFORM_V1, PROTOCOL_VERSION_1}; - use platform_version::version::PLATFORM_TEST_VERSIONS; + use platform_version::version::v1::PLATFORM_V1; use strategy_tests::frequency::Frequency; use strategy_tests::{IdentityInsertInfo, StartIdentities, Strategy}; diff --git a/packages/rs-drive-proof-verifier/Cargo.toml b/packages/rs-drive-proof-verifier/Cargo.toml index 90e0997d8a..a4a90314be 100644 --- a/packages/rs-drive-proof-verifier/Cargo.toml +++ b/packages/rs-drive-proof-verifier/Cargo.toml @@ -7,11 +7,10 @@ rust-version = "1.76" crate-type = ["cdylib"] [features] -default = ["mocks", "json"] -mocks = ["dep:serde"] +default = ["mocks"] +mocks = ["dep:serde", "json"] json = ["dep:serde_json"] - [dependencies] thiserror = { version = "1.0.39" } @@ -19,10 +18,10 @@ dapi-grpc = { path = "../dapi-grpc" } drive = { path = "../rs-drive", default-features = false, features = [ "verify", ] } -dpp = { path = "../rs-dpp" } +dpp = { path = "../rs-dpp", features = ["bls-signatures"], default-features = false } tenderdash-abci = { git = "https://github.com/dashpay/rs-tenderdash-abci", version = "0.14.0-dev.11", features = [ - "grpc", -] } + "grpc", "crypto" +], default-features = false } tracing = { version = "0.1.37" } serde = { version = "1.0.171", default-features = false, optional = true } serde_json = { version = "1.0.103", features = [ diff --git a/packages/rs-drive-proof-verifier/src/provider.rs b/packages/rs-drive-proof-verifier/src/provider.rs index eb8858c5f1..56c8290c91 100644 --- a/packages/rs-drive-proof-verifier/src/provider.rs +++ b/packages/rs-drive-proof-verifier/src/provider.rs @@ -128,6 +128,7 @@ impl MockContextProvider { } } +#[cfg(feature = "mocks")] impl Default for MockContextProvider { fn default() -> Self { Self::new() diff --git a/packages/rs-drive/Cargo.toml b/packages/rs-drive/Cargo.toml index 379502f76d..ae6303de5c 100644 --- a/packages/rs-drive/Cargo.toml +++ b/packages/rs-drive/Cargo.toml @@ -11,48 +11,53 @@ authors = [ edition = "2021" rust-version = "1.76" license = "MIT" +resolver = "2" [dependencies] -parking_lot = "0.12.1" -arc-swap = "1.7.0" -serde = { version = "1.0.152", features = ["derive"] } platform-version = { path = "../rs-platform-version" } -ciborium = { git = "https://github.com/qrayven/ciborium", branch = "feat-ser-null-as-undefined" } +# used to convert integers to bytes, needed in verifier integer-encoding = { version = "4.0.0" } -rand = { version = "0.8.4", features = ["small_rng"] } +# used for encoding, needed in verifier byteorder = { version = "1.4.3" } +# used for query order by, needed in verifier indexmap = { version = "2.0.2" } +# used for creating queries from sql, can be used in verifier sqlparser = { version = "0.38.0" } -thiserror = { version = "1.0.30" } -moka = { version = "0.11.1", features = ["future", "futures-util"] } +# used for int maps and needed in the verifier nohash-hasher = { version = "0.2.0" } -dpp = { path = "../rs-dpp", features = ["drive", "cbor", "random-public-keys"] } -derive_more = "0.99.17" +dpp = { path = "../rs-dpp", features = ["state-transitions"], default-features = false, optional = true } +thiserror = { version = "1.0.30" } tracing = { version = "0.1.37", default-features = false, features = [] } +derive_more = { version = "0.99.17", optional = true} # optional dependencies +parking_lot = { version = "0.12.1", optional = true } +ciborium = { git = "https://github.com/qrayven/ciborium", branch = "feat-ser-null-as-undefined", optional = true } +arc-swap = { version = "1.7.0", optional = true } +serde = { version = "1.0.152", features = ["derive"], optional = true } +rand = { version = "0.8.4", features = ["small_rng"], optional = true } +moka = { version = "0.11.1", features = ["future", "futures-util"], optional = true } bs58 = { version = "0.5.0", optional = true } base64 = { version = "0.21.0", optional = true } hex = { version = "0.4.3", optional = true } tempfile = { version = "3", optional = true } -serde_json = { version = "1.0", features = ["preserve_order"], optional = true } enum-map = { version = "2.0.3", optional = true } intmap = { version = "2.0.0", features = ["serde"], optional = true } chrono = { version = "0.4.35", optional = true } itertools = { version = "0.11.0", optional = true } -grovedb = { git = "https://github.com/dashpay/grovedb", rev = "9eae5457f18d307d673767c8d772630a9d0ad66d", optional = true, default-features = false } -grovedb-costs = { git = "https://github.com/dashpay/grovedb", rev = "9eae5457f18d307d673767c8d772630a9d0ad66d", optional = true } -grovedb-path = { git = "https://github.com/dashpay/grovedb", rev = "9eae5457f18d307d673767c8d772630a9d0ad66d" } -grovedb-storage = { git = "https://github.com/dashpay/grovedb", rev = "9eae5457f18d307d673767c8d772630a9d0ad66d", optional = true } +grovedb = { git = "https://github.com/dashpay/grovedb", rev = "f5a3382c5537de7417e983cdf2132792aa9fdc9d", optional = true, default-features = false } +grovedb-costs = { git = "https://github.com/dashpay/grovedb", rev = "f5a3382c5537de7417e983cdf2132792aa9fdc9d", optional = true } +grovedb-path = { git = "https://github.com/dashpay/grovedb", rev = "f5a3382c5537de7417e983cdf2132792aa9fdc9d" } +grovedb-storage = { git = "https://github.com/dashpay/grovedb", rev = "f5a3382c5537de7417e983cdf2132792aa9fdc9d", optional = true } [dev-dependencies] -anyhow = { version = "1.0.75" } criterion = "0.3.5" platform-version = { path = "../rs-platform-version", features = [ "mock-versions", ] } dpp = { path = "../rs-dpp", features = [ - "drive", + "state-transitions", + "fee-distribution", "document-cbor-conversion", "random-documents", "random-identities", @@ -61,29 +66,46 @@ dpp = { path = "../rs-dpp", features = [ "system_contracts", "factories", "data-contract-json-conversion", -] } +], default-features = false } +serde_json = { version = "1.0", features = ["preserve_order"] } [[bench]] name = "benchmarks" harness = false [features] -default = ["full", "verify", "fixtures-and-mocks"] -fixtures-and-mocks = ["full", "dpp/fixtures-and-mocks", "verify"] -full = [ +default = ["full", "verify", "fixtures-and-mocks", "cbor_query"] +fee-distribution = ["dpp/fee-distribution"] +fixtures-and-mocks = ["full", "dpp/fixtures-and-mocks", "verify", "dpp/data-contract-json-conversion", "dpp/random-public-keys"] +server = [ + "serde", + "parking_lot", + "arc-swap", + "moka", + "dpp/platform-value-json", + "dpp/system_contracts", + "dpp/state-transitions", + "fee-distribution", "grovedb/full", "grovedb/estimated_costs", "grovedb-storage", "grovedb-costs", - "bs58", - "base64", + "itertools", + "rand", #todo: this should be removed eventually "hex", - "tempfile", - "serde_json", + "derive_more", "enum-map", "intmap", +] +full = [ + "server", + "ciborium", + "serde", + "bs58", + "tempfile", + "base64", "chrono", - "itertools", ] +cbor_query = ["ciborium", "dpp/platform-value-cbor", "dpp/cbor"] grovedb_operations_logging = [] -verify = ["grovedb/verify", "grovedb-costs"] +verify = ["grovedb/verify", "grovedb-costs", "dpp/state-transitions"] diff --git a/packages/rs-drive/src/common/mod.rs b/packages/rs-drive/src/common/mod.rs index 6ea5c70dae..1e915cddc0 100644 --- a/packages/rs-drive/src/common/mod.rs +++ b/packages/rs-drive/src/common/mod.rs @@ -1,64 +1,37 @@ -// MIT LICENSE -// -// Copyright (c) 2021 Dash Core Group -// -// Permission is hereby granted, free of charge, to any -// person obtaining a copy of this software and associated -// documentation files (the "Software"), to deal in the -// Software without restriction, including without -// limitation the rights to use, copy, modify, merge, -// publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software -// is furnished to do so, subject to the following -// conditions: -// -// The above copyright notice and this permission notice -// shall be included in all copies or substantial portions -// of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -// ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -// TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -// SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -// IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -// DEALINGS IN THE SOFTWARE. -// - //! Common functions //! //! This module defines general, commonly used functions in Drive. //! -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] pub mod decode; -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] pub mod encode; -#[cfg(feature = "full")] -pub mod identities; -#[cfg(feature = "full")] +#[cfg(any(test, feature = "fixtures-and-mocks"))] +/// test utils +pub mod test_utils; + +#[cfg(feature = "server")] use std::fs::File; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use std::io; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use std::io::BufRead; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use std::option::Option::None; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use std::path::Path; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use grovedb::TransactionArg; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use crate::drive::Drive; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use dpp::data_contract::DataContract; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use dpp::block::block_info::BlockInfo; #[cfg(feature = "fixtures-and-mocks")] use dpp::prelude::Identifier; @@ -108,7 +81,7 @@ pub fn cbor_from_hex(hex_string: String) -> Vec { hex::decode(hex_string).expect("Decoding failed") } -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// Takes a file and returns the lines as a list of strings. pub fn text_file_strings(path: impl AsRef) -> Vec { let file = File::open(path).expect("file not found"); diff --git a/packages/rs-drive/src/common/identities.rs b/packages/rs-drive/src/common/test_utils/identities.rs similarity index 84% rename from packages/rs-drive/src/common/identities.rs rename to packages/rs-drive/src/common/test_utils/identities.rs index 27f3bcc2b8..1628550424 100644 --- a/packages/rs-drive/src/common/identities.rs +++ b/packages/rs-drive/src/common/test_utils/identities.rs @@ -1,32 +1,3 @@ -// MIT LICENSE -// -// Copyright (c) 2021 Dash Core Group -// -// Permission is hereby granted, free of charge, to any -// person obtaining a copy of this software and associated -// documentation files (the "Software"), to deal in the -// Software without restriction, including without -// limitation the rights to use, copy, modify, merge, -// publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software -// is furnished to do so, subject to the following -// conditions: -// -// The above copyright notice and this permission notice -// shall be included in all copies or substantial portions -// of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -// ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -// TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -// SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -// IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -// DEALINGS IN THE SOFTWARE. -// - //! Drive Identity Helpers. //! //! This module defines helper functions pertinent to identities in Drive. diff --git a/packages/rs-drive/src/common/test_utils/mod.rs b/packages/rs-drive/src/common/test_utils/mod.rs new file mode 100644 index 0000000000..c37264c43a --- /dev/null +++ b/packages/rs-drive/src/common/test_utils/mod.rs @@ -0,0 +1 @@ +pub mod identities; diff --git a/packages/rs-drive/src/drive/balances/mod.rs b/packages/rs-drive/src/drive/balances/mod.rs index 75c1d02e24..f8aecd48d4 100644 --- a/packages/rs-drive/src/drive/balances/mod.rs +++ b/packages/rs-drive/src/drive/balances/mod.rs @@ -2,30 +2,30 @@ //! Functions include inserting verifying balances between various trees. //! -#[cfg(feature = "full")] +#[cfg(feature = "server")] mod add_to_system_credits; -#[cfg(feature = "full")] +#[cfg(feature = "server")] mod add_to_system_credits_operations; -#[cfg(feature = "full")] +#[cfg(feature = "server")] mod remove_from_system_credits; -#[cfg(feature = "full")] +#[cfg(feature = "server")] mod remove_from_system_credits_operations; -#[cfg(feature = "full")] +#[cfg(feature = "server")] mod calculate_total_credits_balance; -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] use crate::drive::RootTree; /// Storage fee pool key -#[cfg(feature = "full")] +#[cfg(feature = "server")] pub const TOTAL_SYSTEM_CREDITS_STORAGE_KEY: &[u8; 1] = b"D"; /// The path for all the credits in the system -#[cfg(feature = "full")] +#[cfg(feature = "server")] pub fn total_credits_path() -> [&'static [u8]; 2] { [ Into::<&[u8; 1]>::into(RootTree::Misc), @@ -34,18 +34,18 @@ pub fn total_credits_path() -> [&'static [u8]; 2] { } /// The path for the balances tree -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] pub(crate) fn balance_path() -> [&'static [u8]; 1] { [Into::<&[u8; 1]>::into(RootTree::Balances)] } /// The path for the balances tree -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] pub(crate) fn balance_path_vec() -> Vec> { vec![Into::<&[u8; 1]>::into(RootTree::Balances).to_vec()] } -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[cfg(test)] mod tests { use crate::drive::Drive; diff --git a/packages/rs-drive/src/drive/batch/drive_op_batch/mod.rs b/packages/rs-drive/src/drive/batch/drive_op_batch/mod.rs index 52ac785026..7354d38359 100644 --- a/packages/rs-drive/src/drive/batch/drive_op_batch/mod.rs +++ b/packages/rs-drive/src/drive/batch/drive_op_batch/mod.rs @@ -176,7 +176,7 @@ impl DriveOperation<'_> { } } -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[cfg(test)] mod tests { use grovedb::Element; diff --git a/packages/rs-drive/src/drive/cache/data_contract.rs b/packages/rs-drive/src/drive/cache/data_contract.rs index bb55dae364..cdedae6b39 100644 --- a/packages/rs-drive/src/drive/cache/data_contract.rs +++ b/packages/rs-drive/src/drive/cache/data_contract.rs @@ -4,13 +4,11 @@ use moka::sync::Cache; use std::sync::Arc; /// DataContract cache that handles both global and block data -#[cfg(feature = "full")] pub struct DataContractCache { global_cache: Cache<[u8; 32], Arc>, block_cache: Cache<[u8; 32], Arc>, } -#[cfg(feature = "full")] impl DataContractCache { /// Create a new DataContract cache instance pub fn new(global_cache_max_capacity: u64, block_cache_max_capacity: u64) -> Self { diff --git a/packages/rs-drive/src/drive/cache/protocol_version.rs b/packages/rs-drive/src/drive/cache/protocol_version.rs index 5ca50cc68d..7aa549c579 100644 --- a/packages/rs-drive/src/drive/cache/protocol_version.rs +++ b/packages/rs-drive/src/drive/cache/protocol_version.rs @@ -18,7 +18,7 @@ pub struct ProtocolVersionsCache { is_global_cache_blocked: bool, } -#[cfg(feature = "full")] +#[cfg(feature = "server")] impl ProtocolVersionsCache { /// Create a new ProtocolVersionsCache instance pub fn new() -> Self { diff --git a/packages/rs-drive/src/drive/cache/system_contracts.rs b/packages/rs-drive/src/drive/cache/system_contracts.rs index b301d63cac..c1a2785c3c 100644 --- a/packages/rs-drive/src/drive/cache/system_contracts.rs +++ b/packages/rs-drive/src/drive/cache/system_contracts.rs @@ -5,7 +5,6 @@ use dpp::system_data_contracts::{load_system_data_contract, SystemDataContract}; use platform_version::version::PlatformVersion; use std::sync::Arc; -// TODO: Use ArcSwap /// System contracts pub struct SystemDataContracts { /// Withdrawal contract diff --git a/packages/rs-drive/src/drive/config.rs b/packages/rs-drive/src/drive/config.rs index 3a7f2adcb4..9694cda2a7 100644 --- a/packages/rs-drive/src/drive/config.rs +++ b/packages/rs-drive/src/drive/config.rs @@ -1,36 +1,8 @@ -// MIT LICENSE -// -// Copyright (c) 2021 Dash Core Group -// -// Permission is hereby granted, free of charge, to any -// person obtaining a copy of this software and associated -// documentation files (the "Software"), to deal in the -// Software without restriction, including without -// limitation the rights to use, copy, modify, merge, -// publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software -// is furnished to do so, subject to the following -// conditions: -// -// The above copyright notice and this permission notice -// shall be included in all copies or substantial portions -// of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -// ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -// TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -// SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -// IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -// DEALINGS IN THE SOFTWARE. -// - //! Drive Configuration File //! use dpp::fee::epoch::DEFAULT_EPOCHS_PER_ERA; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; /// Boolean if GroveDB batching consistency verification is enabled by default @@ -44,7 +16,8 @@ pub const DEFAULT_MAX_QUERY_LIMIT: u16 = 100; /// Default maximum number of contracts in cache pub const DEFAULT_DATA_CONTRACTS_CACHE_SIZE: u64 = 500; -#[derive(Clone, Debug, Serialize, Deserialize)] +#[derive(Clone, Debug)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] /// Encoding for Drive pub enum DriveEncoding { /// Drive CBOR @@ -53,57 +26,77 @@ pub enum DriveEncoding { DriveProtobuf, } -#[derive(Clone, Debug, Serialize, Deserialize)] +#[derive(Clone, Debug)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] /// Drive configuration struct pub struct DriveConfig { /// Boolean if batching consistency verification is enabled - #[serde(default = "default_batching_consistency_verification")] + #[cfg_attr( + feature = "serde", + serde(default = "default_batching_consistency_verification") + )] pub batching_consistency_verification: bool, /// Boolean if has_raw is enabled - #[serde(default = "default_has_raw_enabled")] + #[cfg_attr(feature = "serde", serde(default = "default_has_raw_enabled"))] pub has_raw_enabled: bool, /// The default returned count if no limit is set - #[serde( - default = "default_default_query_limit", - deserialize_with = "from_str_or_number" + #[cfg_attr( + feature = "serde", + serde( + default = "default_default_query_limit", + deserialize_with = "from_str_or_number" + ) )] pub default_query_limit: u16, /// The default returned count if no limit is set - #[serde( - default = "default_epochs_per_era", - deserialize_with = "from_str_or_number" + #[cfg_attr( + feature = "serde", + serde( + default = "default_epochs_per_era", + deserialize_with = "from_str_or_number" + ) )] pub epochs_per_era: u16, /// The limit for user defined queries - #[serde( - default = "default_max_query_limit", - deserialize_with = "from_str_or_number" + #[cfg_attr( + feature = "serde", + serde( + default = "default_max_query_limit", + deserialize_with = "from_str_or_number" + ) )] pub max_query_limit: u16, /// Default genesis time - #[serde(default)] + #[cfg_attr(feature = "serde", serde(default))] pub default_genesis_time: Option, /// Maximum number of contracts in global cache - #[serde( - default = "default_data_contracts_cache_size", - deserialize_with = "from_str_or_number" + #[cfg_attr( + feature = "serde", + serde( + default = "default_data_contracts_cache_size", + deserialize_with = "from_str_or_number" + ) )] pub data_contracts_global_cache_size: u64, /// Maximum number of contracts in block candidate cache - #[serde( - default = "default_data_contracts_cache_size", - deserialize_with = "from_str_or_number" + #[cfg_attr( + feature = "serde", + serde( + default = "default_data_contracts_cache_size", + deserialize_with = "from_str_or_number" + ) )] pub data_contracts_block_cache_size: u64, } +#[cfg(feature = "serde")] fn from_str_or_number<'de, D, T>(deserializer: D) -> Result where D: serde::Deserializer<'de>, diff --git a/packages/rs-drive/src/drive/contract/contract_fetch_info.rs b/packages/rs-drive/src/drive/contract/contract_fetch_info.rs index 7a10f3214b..034f5545c6 100644 --- a/packages/rs-drive/src/drive/contract/contract_fetch_info.rs +++ b/packages/rs-drive/src/drive/contract/contract_fetch_info.rs @@ -14,8 +14,6 @@ use dpp::tests::fixtures::get_masternode_reward_shares_data_contract_fixture; use grovedb_costs::OperationCost; #[cfg(feature = "fixtures-and-mocks")] use platform_version::version::PlatformVersion; - -#[cfg(any(feature = "full", feature = "verify"))] /// DataContract and fetch information #[derive(PartialEq, Debug, Clone)] pub struct DataContractFetchInfo { diff --git a/packages/rs-drive/src/drive/contract/get_fetch/fetch_contract_with_history/mod.rs b/packages/rs-drive/src/drive/contract/get_fetch/fetch_contract_with_history/mod.rs index de2ee0df93..28aa19d985 100644 --- a/packages/rs-drive/src/drive/contract/get_fetch/fetch_contract_with_history/mod.rs +++ b/packages/rs-drive/src/drive/contract/get_fetch/fetch_contract_with_history/mod.rs @@ -79,7 +79,7 @@ impl Drive { } } -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[cfg(test)] mod tests { diff --git a/packages/rs-drive/src/drive/contract/get_fetch/get_contract_with_fetch_info/mod.rs b/packages/rs-drive/src/drive/contract/get_fetch/get_contract_with_fetch_info/mod.rs index 7bb32ba00f..7bf0855d80 100644 --- a/packages/rs-drive/src/drive/contract/get_fetch/get_contract_with_fetch_info/mod.rs +++ b/packages/rs-drive/src/drive/contract/get_fetch/get_contract_with_fetch_info/mod.rs @@ -181,7 +181,7 @@ impl Drive { } } -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[cfg(test)] mod tests { use crate::drive::contract::tests::setup_reference_contract; diff --git a/packages/rs-drive/src/drive/contract/mod.rs b/packages/rs-drive/src/drive/contract/mod.rs index a47ebc20c8..b0f73db3ff 100644 --- a/packages/rs-drive/src/drive/contract/mod.rs +++ b/packages/rs-drive/src/drive/contract/mod.rs @@ -1,67 +1,38 @@ -// MIT LICENSE -// -// Copyright (c) 2021 Dash Core Group -// -// Permission is hereby granted, free of charge, to any -// person obtaining a copy of this software and associated -// documentation files (the "Software"), to deal in the -// Software without restriction, including without -// limitation the rights to use, copy, modify, merge, -// publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software -// is furnished to do so, subject to the following -// conditions: -// -// The above copyright notice and this permission notice -// shall be included in all copies or substantial portions -// of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -// ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -// TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -// SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -// IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -// DEALINGS IN THE SOFTWARE. -// - //! DriveDataContracts. //! //! This module defines functions pertinent toDataContracts stored in Drive. //! -#[cfg(feature = "full")] +#[cfg(feature = "server")] mod apply; -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(feature = "server")] mod contract_fetch_info; -#[cfg(feature = "full")] +#[cfg(feature = "server")] mod estimation_costs; -#[cfg(feature = "full")] +#[cfg(feature = "server")] mod get_fetch; -#[cfg(feature = "full")] +#[cfg(feature = "server")] mod insert; /// Various paths for contract operations -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] pub mod paths; -#[cfg(feature = "full")] +#[cfg(feature = "server")] pub(crate) mod prove; -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] pub(crate) mod queries; #[cfg(feature = "fixtures-and-mocks")] /// Test helpers and utility methods pub mod test_helpers; -#[cfg(feature = "full")] +#[cfg(feature = "server")] mod update; -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(feature = "server")] pub use contract_fetch_info::*; /// How many contracts to fetch at once. This is an arbitrary number and is needed to prevent /// the server from being overloaded with requests. pub const MAX_CONTRACT_HISTORY_FETCH_LIMIT: u16 = 10; -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[cfg(test)] mod tests { use dpp::block::block_info::BlockInfo; diff --git a/packages/rs-drive/src/drive/credit_pools/epochs/mod.rs b/packages/rs-drive/src/drive/credit_pools/epochs/mod.rs index 6168093348..d7bcdb6d26 100644 --- a/packages/rs-drive/src/drive/credit_pools/epochs/mod.rs +++ b/packages/rs-drive/src/drive/credit_pools/epochs/mod.rs @@ -58,7 +58,7 @@ impl Drive { } } -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[cfg(test)] mod tests { use super::*; diff --git a/packages/rs-drive/src/drive/credit_pools/epochs/start_block/mod.rs b/packages/rs-drive/src/drive/credit_pools/epochs/start_block/mod.rs index a2857939b9..b44d8f1250 100644 --- a/packages/rs-drive/src/drive/credit_pools/epochs/start_block/mod.rs +++ b/packages/rs-drive/src/drive/credit_pools/epochs/start_block/mod.rs @@ -51,7 +51,7 @@ pub struct StartBlockInfo { pub start_block_core_height: u32, } -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[cfg(test)] mod tests { use super::*; diff --git a/packages/rs-drive/src/drive/credit_pools/epochs/start_time/get_epoch_start_time/v0/mod.rs b/packages/rs-drive/src/drive/credit_pools/epochs/start_time/get_epoch_start_time/v0/mod.rs index 3239bda5a1..001fed71be 100644 --- a/packages/rs-drive/src/drive/credit_pools/epochs/start_time/get_epoch_start_time/v0/mod.rs +++ b/packages/rs-drive/src/drive/credit_pools/epochs/start_time/get_epoch_start_time/v0/mod.rs @@ -41,7 +41,7 @@ impl Drive { } } -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[cfg(test)] mod tests { use crate::tests::helpers::setup::setup_drive_with_initial_state_structure; diff --git a/packages/rs-drive/src/drive/credit_pools/mod.rs b/packages/rs-drive/src/drive/credit_pools/mod.rs index adaa871110..8144fade30 100644 --- a/packages/rs-drive/src/drive/credit_pools/mod.rs +++ b/packages/rs-drive/src/drive/credit_pools/mod.rs @@ -27,60 +27,60 @@ // DEALINGS IN THE SOFTWARE. // -#[cfg(feature = "full")] +#[cfg(feature = "server")] use crate::drive::batch::GroveDbOpBatch; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use crate::drive::Drive; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use crate::error::drive::DriveError; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use crate::error::Error; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use crate::fee_pools::epochs::epoch_key_constants::KEY_POOL_STORAGE_FEES; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use crate::fee_pools::epochs::paths::encode_epoch_index_key; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use crate::fee_pools::epochs::paths::EpochProposers; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use dpp::block::epoch::{Epoch, EpochIndex}; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use dpp::fee::epoch::SignedCreditsPerEpoch; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use dpp::fee::SignedCredits; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use grovedb::query_result_type::QueryResultType; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use grovedb::{Element, PathQuery, Query, TransactionArg}; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use itertools::Itertools; -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// Epochs module pub mod epochs; -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] pub(crate) mod paths; -#[cfg(feature = "full")] +#[cfg(feature = "server")] pub mod pending_epoch_refunds; -#[cfg(feature = "full")] +#[cfg(feature = "server")] pub mod storage_fee_distribution_pool; -#[cfg(feature = "full")] +#[cfg(feature = "server")] pub mod unpaid_epoch; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use crate::drive::batch::grovedb_op_batch::GroveDbOpBatchV0Methods; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use crate::drive::fee::get_overflow_error; -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] pub use paths::*; -#[cfg(feature = "full")] +#[cfg(feature = "server")] impl Drive { /// Adds GroveDB operations to update epoch storage fee pools with specified map of credits to epochs /// This method optimized to update sequence of epoch pools without gaps @@ -189,7 +189,7 @@ impl Drive { } } -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[cfg(test)] mod tests { use super::*; diff --git a/packages/rs-drive/src/drive/credit_pools/storage_fee_distribution_pool/get_storage_fees_from_distribution_pool/v0/mod.rs b/packages/rs-drive/src/drive/credit_pools/storage_fee_distribution_pool/get_storage_fees_from_distribution_pool/v0/mod.rs index 54733a18fc..21cdd5bd37 100644 --- a/packages/rs-drive/src/drive/credit_pools/storage_fee_distribution_pool/get_storage_fees_from_distribution_pool/v0/mod.rs +++ b/packages/rs-drive/src/drive/credit_pools/storage_fee_distribution_pool/get_storage_fees_from_distribution_pool/v0/mod.rs @@ -30,7 +30,7 @@ impl Drive { } } -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[cfg(test)] mod tests { use super::*; diff --git a/packages/rs-drive/src/drive/credit_pools/unpaid_epoch/get_unpaid_epoch_index/v0/mod.rs b/packages/rs-drive/src/drive/credit_pools/unpaid_epoch/get_unpaid_epoch_index/v0/mod.rs index 9415228b29..26f19ac7de 100644 --- a/packages/rs-drive/src/drive/credit_pools/unpaid_epoch/get_unpaid_epoch_index/v0/mod.rs +++ b/packages/rs-drive/src/drive/credit_pools/unpaid_epoch/get_unpaid_epoch_index/v0/mod.rs @@ -37,7 +37,7 @@ impl Drive { } } -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[cfg(test)] mod tests { use super::*; diff --git a/packages/rs-drive/src/drive/document/delete/mod.rs b/packages/rs-drive/src/drive/document/delete/mod.rs index 7e224f4970..04b30f9c9c 100644 --- a/packages/rs-drive/src/drive/document/delete/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/mod.rs @@ -74,7 +74,7 @@ mod delete_document_for_contract_operations; mod internal; -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[cfg(test)] mod tests { use dpp::balances::credits::Creditable; diff --git a/packages/rs-drive/src/drive/document/mod.rs b/packages/rs-drive/src/drive/document/mod.rs index baeeaf70ef..3ec1f37714 100644 --- a/packages/rs-drive/src/drive/document/mod.rs +++ b/packages/rs-drive/src/drive/document/mod.rs @@ -33,42 +33,42 @@ //! Namely functions to return the paths to certain objects and the path sizes. //! -#[cfg(feature = "full")] +#[cfg(feature = "server")] use crate::drive::defaults::DEFAULT_HASH_SIZE_U8; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use crate::drive::flags::StorageFlags; -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] use crate::drive::{defaults, RootTree}; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::data_contract::document_type::methods::DocumentTypeV0Methods; -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] use dpp::data_contract::document_type::DocumentTypeRef; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use dpp::document::Document; use dpp::document::DocumentV0Getters; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use grovedb::batch::key_info::KeyInfo; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use grovedb::batch::KeyInfoPath; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use grovedb::reference_path::ReferencePathType::UpstreamRootHeightReference; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use grovedb::Element; -#[cfg(feature = "full")] +#[cfg(feature = "server")] mod delete; -#[cfg(feature = "full")] +#[cfg(feature = "server")] mod estimation_costs; -#[cfg(feature = "full")] +#[cfg(feature = "server")] mod index_uniqueness; -#[cfg(any(feature = "full", feature = "fixtures-and-mocks"))] +#[cfg(any(feature = "server", feature = "fixtures-and-mocks"))] mod insert; -#[cfg(any(feature = "full", feature = "fixtures-and-mocks"))] +#[cfg(any(feature = "server", feature = "fixtures-and-mocks"))] pub mod query; -#[cfg(any(feature = "full", feature = "fixtures-and-mocks"))] +#[cfg(any(feature = "server", feature = "fixtures-and-mocks"))] mod update; -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] /// Returns the path to a contract document type. pub(crate) fn contract_document_type_path<'a>( contract_id: &'a [u8; 32], @@ -82,7 +82,7 @@ pub(crate) fn contract_document_type_path<'a>( ] } -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(feature = "server")] /// Returns the path to a contract document type. pub(crate) fn contract_document_type_path_vec( contract_id: &[u8], @@ -96,7 +96,7 @@ pub(crate) fn contract_document_type_path_vec( ] } -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(feature = "server")] /// Returns the path to the primary keys of a contract document type. pub(crate) fn contract_documents_primary_key_path<'a>( contract_id: &'a [u8], @@ -111,7 +111,7 @@ pub(crate) fn contract_documents_primary_key_path<'a>( ] } -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(feature = "server")] /// Returns the path to a contract document. fn contract_documents_keeping_history_primary_key_path_for_document_id<'a>( contract_id: &'a [u8], @@ -128,7 +128,7 @@ fn contract_documents_keeping_history_primary_key_path_for_document_id<'a>( ] } -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// Returns the path to a contract document when the document id isn't known. fn contract_documents_keeping_history_primary_key_path_for_unknown_document_id( contract_id: &[u8], @@ -145,7 +145,7 @@ fn contract_documents_keeping_history_primary_key_path_for_unknown_document_id( key_info_path } -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] #[allow(dead_code)] #[deprecated(note = "This function is marked as unused.")] #[allow(deprecated)] @@ -157,7 +157,7 @@ fn contract_documents_keeping_history_primary_key_path_for_document_id_size( + document_type_name_len } -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(feature = "server")] /// Returns the size of the path to the time at which a document type was stored. fn contract_documents_keeping_history_storage_time_reference_path_size( document_type_name_len: u32, @@ -166,7 +166,7 @@ fn contract_documents_keeping_history_storage_time_reference_path_size( + document_type_name_len } -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// Creates a reference to a document. fn make_document_reference( document: &Document, @@ -201,7 +201,7 @@ fn make_document_reference( ) } -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// size of a document reference. fn document_reference_size(document_type: DocumentTypeRef) -> u32 { // we need to construct the reference from the split height of the contract document @@ -226,13 +226,13 @@ fn document_reference_size(document_type: DocumentTypeRef) -> u32 { 6 + reference_path_size } -#[cfg(feature = "full")] +#[cfg(feature = "server")] fn unique_event_id() -> [u8; 32] { rand::random::<[u8; 32]>() } /// Tests module -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[cfg(test)] pub(crate) mod tests { use std::option::Option::None; diff --git a/packages/rs-drive/src/drive/document/query/mod.rs b/packages/rs-drive/src/drive/document/query/mod.rs index 5daa25ed23..421c2c03ca 100644 --- a/packages/rs-drive/src/drive/document/query/mod.rs +++ b/packages/rs-drive/src/drive/document/query/mod.rs @@ -133,7 +133,7 @@ impl Drive { // }) // } - #[cfg(feature = "fixtures-and-mocks")] + #[cfg(all(feature = "fixtures-and-mocks", feature = "cbor_query"))] /// Performs and returns the result of the specified query along with skipped items and the cost. pub fn query_raw_documents_from_contract_cbor_using_cbor_encoded_query_with_cost( &self, @@ -172,7 +172,7 @@ impl Drive { Ok((items, skipped, cost)) } - #[cfg(feature = "fixtures-and-mocks")] + #[cfg(all(feature = "fixtures-and-mocks", feature = "cbor_query"))] /// Performs and returns the result of the specified query along with the fee. /// Proof is generated. pub fn query_proof_of_documents_using_contract_id_using_cbor_encoded_query_with_cost( @@ -225,7 +225,7 @@ impl Drive { Ok((items, cost)) } - #[cfg(feature = "fixtures-and-mocks")] + #[cfg(all(feature = "fixtures-and-mocks", feature = "cbor_query"))] /// Performs and returns the result of the specified query along with the fee. /// Proof is generated. pub fn query_proof_of_documents_using_cbor_encoded_query_with_cost( @@ -263,7 +263,7 @@ impl Drive { Ok((items, cost)) } - #[cfg(feature = "fixtures-and-mocks")] + #[cfg(all(feature = "fixtures-and-mocks", feature = "cbor_query"))] /// Performs and returns the result of the specified internal query. /// Proof is generated. pub(crate) fn query_proof_of_documents_using_cbor_encoded_query( @@ -281,7 +281,7 @@ impl Drive { query.execute_with_proof_internal(self, transaction, drive_operations, platform_version) } - #[cfg(feature = "fixtures-and-mocks")] + #[cfg(all(feature = "fixtures-and-mocks", feature = "cbor_query"))] /// Performs the specified internal query and returns the root hash, values, and fee. pub fn query_proof_of_documents_using_cbor_encoded_query_only_get_elements( &self, @@ -320,7 +320,7 @@ impl Drive { } /// Performs the specified internal query and returns the root hash and values. - #[cfg(feature = "fixtures-and-mocks")] + #[cfg(all(feature = "fixtures-and-mocks", feature = "cbor_query"))] pub(crate) fn query_proof_of_documents_using_cbor_encoded_query_only_get_elements_internal( &self, contract: &DataContract, @@ -342,7 +342,7 @@ impl Drive { } /// Performs and returns the result of the specified query along with skipped items and the cost. - #[cfg(feature = "fixtures-and-mocks")] + #[cfg(all(feature = "fixtures-and-mocks", feature = "cbor_query"))] pub fn query_documents_cbor_from_contract( &self, contract: &DataContract, @@ -377,7 +377,7 @@ impl Drive { Ok((items, skipped, cost)) } - #[cfg(feature = "fixtures-and-mocks")] + #[cfg(all(feature = "fixtures-and-mocks", feature = "cbor_query"))] /// Performs and returns the result of the specified query along with skipped items and the cost. pub fn query_documents_cbor_with_document_type_lookup( &self, @@ -412,7 +412,7 @@ impl Drive { self.query_serialized_documents(query, epoch, transaction, platform_version) } - #[cfg(feature = "fixtures-and-mocks")] + #[cfg(all(feature = "fixtures-and-mocks", feature = "cbor_query"))] /// Performs and returns the result of the specified query along with skipped items. pub fn query_documents_for_cbor_query_internal( &self, diff --git a/packages/rs-drive/src/drive/document/update/mod.rs b/packages/rs-drive/src/drive/document/update/mod.rs index da170ee4b9..ff5c43a0e8 100644 --- a/packages/rs-drive/src/drive/document/update/mod.rs +++ b/packages/rs-drive/src/drive/document/update/mod.rs @@ -34,17 +34,17 @@ // Module: add_update_multiple_documents_operations // This module contains functionality for adding operations to update multiple documents -#[cfg(feature = "full")] +#[cfg(feature = "server")] mod add_update_multiple_documents_operations; // Module: update_document_for_contract // This module contains functionality for updating a document for a given contract -#[cfg(feature = "full")] +#[cfg(feature = "server")] mod update_document_for_contract; // Module: update_document_for_contract_id // This module contains functionality for updating a document associated with a given contract id -#[cfg(feature = "full")] +#[cfg(feature = "server")] mod update_document_for_contract_id; // Module: update_document_with_serialization_for_contract diff --git a/packages/rs-drive/src/drive/flags.rs b/packages/rs-drive/src/drive/flags.rs index 7d1846de43..dcae6e3a7e 100644 --- a/packages/rs-drive/src/drive/flags.rs +++ b/packages/rs-drive/src/drive/flags.rs @@ -30,53 +30,53 @@ //! Flags //! -#[cfg(feature = "full")] +#[cfg(feature = "server")] use crate::drive::defaults::DEFAULT_HASH_SIZE; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use crate::drive::flags::StorageFlags::{ MultiEpoch, MultiEpochOwned, SingleEpoch, SingleEpochOwned, }; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use grovedb::ElementFlags; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use grovedb_costs::storage_cost::removal::StorageRemovedBytes::SectionedStorageRemoval; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use grovedb_costs::storage_cost::removal::{ StorageRemovalPerEpochByIdentifier, StorageRemovedBytes, }; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use integer_encoding::VarInt; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use intmap::IntMap; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use std::borrow::Cow; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use std::cmp::Ordering; -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] use std::collections::BTreeMap; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use crate::error::storage_flags::StorageFlagsError; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use crate::error::Error; -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] type EpochIndex = u16; -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] type BaseEpoch = EpochIndex; -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] type BytesAddedInEpoch = u32; -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] type OwnerId = [u8; 32]; -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// The size of single epoch flags pub const SINGLE_EPOCH_FLAGS_SIZE: u32 = 3; -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] /// Storage flags #[derive(Clone, Debug, PartialEq, Eq)] pub enum StorageFlags { @@ -97,7 +97,7 @@ pub enum StorageFlags { MultiEpochOwned(BaseEpoch, BTreeMap, OwnerId), } -#[cfg(feature = "full")] +#[cfg(feature = "server")] impl StorageFlags { /// Create new single epoch storage flags pub fn new_single_epoch(epoch: BaseEpoch, maybe_owner_id: Option) -> Self { diff --git a/packages/rs-drive/src/drive/grove_operations/batch_insert_if_changed_value/v0/mod.rs b/packages/rs-drive/src/drive/grove_operations/batch_insert_if_changed_value/v0/mod.rs index 8272322478..62e31536aa 100644 --- a/packages/rs-drive/src/drive/grove_operations/batch_insert_if_changed_value/v0/mod.rs +++ b/packages/rs-drive/src/drive/grove_operations/batch_insert_if_changed_value/v0/mod.rs @@ -106,7 +106,7 @@ impl Drive { GroveDb::average_case_for_get_raw( &key_info_path, &key_info, - element.serialized_size() as u32, + element.serialized_size()? as u32, in_tree_using_sums, ), )); diff --git a/packages/rs-drive/src/drive/grove_operations/batch_insert_if_not_exists/v0/mod.rs b/packages/rs-drive/src/drive/grove_operations/batch_insert_if_not_exists/v0/mod.rs index 8407b05a84..1f72d5969a 100644 --- a/packages/rs-drive/src/drive/grove_operations/batch_insert_if_not_exists/v0/mod.rs +++ b/packages/rs-drive/src/drive/grove_operations/batch_insert_if_not_exists/v0/mod.rs @@ -94,7 +94,7 @@ impl Drive { GroveDb::average_case_for_has_raw( &key_info_path, &key_info, - element.serialized_size() as u32, + element.serialized_size()? as u32, in_tree_using_sums, ), )); diff --git a/packages/rs-drive/src/drive/identity/balance/mod.rs b/packages/rs-drive/src/drive/identity/balance/mod.rs index fecdbebd4e..efe584ce63 100644 --- a/packages/rs-drive/src/drive/identity/balance/mod.rs +++ b/packages/rs-drive/src/drive/identity/balance/mod.rs @@ -1,4 +1,4 @@ -#[cfg(feature = "full")] +#[cfg(feature = "server")] mod prove; -#[cfg(feature = "full")] +#[cfg(feature = "server")] mod update; diff --git a/packages/rs-drive/src/drive/identity/balance/update.rs b/packages/rs-drive/src/drive/identity/balance/update.rs index 0edf686f52..03174ebb4b 100644 --- a/packages/rs-drive/src/drive/identity/balance/update.rs +++ b/packages/rs-drive/src/drive/identity/balance/update.rs @@ -3,7 +3,7 @@ mod tests { use dpp::prelude::*; - use crate::common::identities::create_test_identity; + use crate::common::test_utils::identities::create_test_identity; use crate::error::drive::DriveError; use crate::error::Error; use crate::tests::helpers::setup::setup_drive_with_initial_state_structure; diff --git a/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/merge_identity_contract_nonce/v0/mod.rs b/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/merge_identity_contract_nonce/v0/mod.rs index dd201da45e..8c44c19b08 100644 --- a/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/merge_identity_contract_nonce/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/merge_identity_contract_nonce/v0/mod.rs @@ -274,7 +274,7 @@ impl Drive { } } -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[cfg(test)] mod tests { use crate::drive::Drive; diff --git a/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/mod.rs b/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/mod.rs index 21a5dca54f..a874e27e83 100644 --- a/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/mod.rs +++ b/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/mod.rs @@ -1,5 +1,5 @@ -#[cfg(feature = "full")] +#[cfg(feature = "server")] mod fetch_identity_contract_nonce; pub(crate) mod merge_identity_contract_nonce; -#[cfg(feature = "full")] +#[cfg(feature = "server")] mod prove_identity_contract_nonce; diff --git a/packages/rs-drive/src/drive/identity/contract_info/mod.rs b/packages/rs-drive/src/drive/identity/contract_info/mod.rs index b6e4758f5b..1f0e79b8bb 100644 --- a/packages/rs-drive/src/drive/identity/contract_info/mod.rs +++ b/packages/rs-drive/src/drive/identity/contract_info/mod.rs @@ -1,6 +1,6 @@ -#[cfg(feature = "full")] +#[cfg(feature = "server")] pub(crate) mod identity_contract_nonce; -#[cfg(feature = "full")] +#[cfg(feature = "server")] pub mod keys; /// The sub elements in the contract space for each identity. diff --git a/packages/rs-drive/src/drive/identity/fetch/fetch_by_public_key_hashes/mod.rs b/packages/rs-drive/src/drive/identity/fetch/fetch_by_public_key_hashes/mod.rs index 8c3f7af159..04a935c753 100644 --- a/packages/rs-drive/src/drive/identity/fetch/fetch_by_public_key_hashes/mod.rs +++ b/packages/rs-drive/src/drive/identity/fetch/fetch_by_public_key_hashes/mod.rs @@ -8,7 +8,7 @@ mod has_non_unique_public_key_hash; mod has_non_unique_public_key_hash_already_for_identity; mod has_unique_public_key_hash; -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[cfg(test)] mod tests { use crate::tests::helpers::setup::setup_drive; diff --git a/packages/rs-drive/src/drive/identity/fetch/full_identity/mod.rs b/packages/rs-drive/src/drive/identity/fetch/full_identity/mod.rs index 1726990c31..59e25f54db 100644 --- a/packages/rs-drive/src/drive/identity/fetch/full_identity/mod.rs +++ b/packages/rs-drive/src/drive/identity/fetch/full_identity/mod.rs @@ -1,7 +1,7 @@ mod fetch_full_identities; mod fetch_full_identity; -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[cfg(test)] mod tests { diff --git a/packages/rs-drive/src/drive/identity/fetch/mod.rs b/packages/rs-drive/src/drive/identity/fetch/mod.rs index 66d4e232f1..e3231f04ac 100644 --- a/packages/rs-drive/src/drive/identity/fetch/mod.rs +++ b/packages/rs-drive/src/drive/identity/fetch/mod.rs @@ -1,56 +1,56 @@ -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] use crate::drive::identity::identity_path_vec; -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] use crate::drive::identity::IdentityRootStructure::IdentityTreeRevision; -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] use crate::drive::Drive; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use crate::drive::RootTree; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use crate::error::drive::DriveError; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use crate::error::Error; -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] use crate::query::Query; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use crate::query::QueryItem; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use grovedb::query_result_type::QueryResultType::{ QueryElementResultType, QueryKeyElementPairResultType, }; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use grovedb::Element::SumItem; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use grovedb::TransactionArg; -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] use grovedb::{PathQuery, SizedQuery}; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use std::collections::BTreeMap; -#[cfg(feature = "full")] +#[cfg(feature = "server")] mod balance; -#[cfg(feature = "full")] +#[cfg(feature = "server")] mod fetch_by_public_key_hashes; -#[cfg(feature = "full")] +#[cfg(feature = "server")] mod full_identity; -#[cfg(feature = "full")] +#[cfg(feature = "server")] mod nonce; -#[cfg(feature = "full")] +#[cfg(feature = "server")] mod partial_identity; -#[cfg(feature = "full")] +#[cfg(feature = "server")] mod prove; -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] pub(crate) mod queries; -#[cfg(feature = "full")] +#[cfg(feature = "server")] mod revision; impl Drive { - #[cfg(any(feature = "full", feature = "verify"))] + #[cfg(any(feature = "server", feature = "verify"))] /// The query for the identity revision pub fn identity_revision_query(identity_id: &[u8; 32]) -> PathQuery { let identity_path = identity_path_vec(identity_id.as_slice()); @@ -66,7 +66,7 @@ impl Drive { } } - #[cfg(feature = "full")] + #[cfg(feature = "server")] /// Given a vector of identities, fetches the identities from storage. pub fn verify_all_identities_exist( &self, @@ -94,7 +94,7 @@ impl Drive { Ok(result_items.len() == ids.len()) } - #[cfg(feature = "full")] + #[cfg(feature = "server")] /// Given a vector of identities, fetches the identities from storage. pub fn fetch_identities_balances( &self, diff --git a/packages/rs-drive/src/drive/identity/key/fetch/mod.rs b/packages/rs-drive/src/drive/identity/key/fetch/mod.rs index 38fdd96e42..f8c9772650 100644 --- a/packages/rs-drive/src/drive/identity/key/fetch/mod.rs +++ b/packages/rs-drive/src/drive/identity/key/fetch/mod.rs @@ -1,74 +1,65 @@ -#[cfg(feature = "full")] +// Grouping std imports +use std::{ + collections::{BTreeMap, HashSet}, + ops::RangeFull, +}; + +// Conditional imports for the features "server" or "verify" +#[cfg(any(feature = "server", feature = "verify"))] +use { + crate::{ + drive::identity::{ + identity_contract_info_group_path_key_purpose_vec, identity_key_tree_path_vec, + identity_query_keys_tree_path_vec, + key::fetch::KeyKindRequestType::{AllKeysOfKindRequest, CurrentKeyOfKindRequest}, + key::fetch::KeyRequestType::{ + AllKeys, ContractBoundKey, ContractDocumentTypeBoundKey, SearchKey, SpecificKeys, + }, + }, + query::{Query, QueryItem}, + }, + dpp::{ + identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0, + identity::{KeyID, Purpose}, + }, + grovedb::{PathQuery, SizedQuery}, + integer_encoding::VarInt, +}; + +// Conditional imports for the feature "server" +#[cfg(feature = "server")] +use { + crate::error::{drive::DriveError, fee::FeeError, identity::IdentityError, Error}, + dpp::{ + block::epoch::Epoch, + fee::{ + default_costs::{EpochCosts, KnownCostItem::FetchSingleIdentityKeyProcessingCost}, + Credits, + }, + identity::{IdentityPublicKey, SecurityLevel}, + serialization::PlatformDeserializable, + version::PlatformVersion, + }, + grovedb::{ + query_result_type::{ + Key, Path, PathKeyOptionalElementTrio, QueryResultElement, QueryResultElements, + }, + Element, + Element::Item, + }, +}; + +// Modules conditionally compiled for the feature "server" +#[cfg(feature = "server")] mod fetch_all_current_identity_keys; -#[cfg(feature = "full")] +#[cfg(feature = "server")] mod fetch_all_identity_keys; -#[cfg(feature = "full")] +#[cfg(feature = "server")] mod fetch_identities_all_keys; -#[cfg(feature = "full")] +#[cfg(feature = "server")] mod fetch_identity_keys; -#[cfg(any(feature = "full", feature = "verify"))] -use crate::drive::identity::{identity_key_tree_path_vec, identity_query_keys_tree_path_vec}; - -#[cfg(any(feature = "full", feature = "verify"))] -use crate::drive::identity::key::fetch::KeyKindRequestType::{ - AllKeysOfKindRequest, CurrentKeyOfKindRequest, -}; -#[cfg(any(feature = "full", feature = "verify"))] -use crate::drive::identity::key::fetch::KeyRequestType::{AllKeys, SearchKey, SpecificKeys}; - -#[cfg(feature = "full")] -use crate::error::drive::DriveError; -#[cfg(feature = "full")] -use crate::error::fee::FeeError; -#[cfg(feature = "full")] -use crate::error::identity::IdentityError; -#[cfg(feature = "full")] -use crate::error::Error; - -#[cfg(any(feature = "full", feature = "verify"))] -use crate::query::{Query, QueryItem}; -#[cfg(feature = "full")] -use dpp::block::epoch::Epoch; -#[cfg(feature = "full")] -use dpp::fee::default_costs::EpochCosts; -#[cfg(feature = "full")] -use dpp::fee::default_costs::KnownCostItem::FetchSingleIdentityKeyProcessingCost; -#[cfg(feature = "full")] -use dpp::fee::Credits; -use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; -#[cfg(any(feature = "full", feature = "verify"))] -use dpp::identity::KeyID; - -#[cfg(any(feature = "full", feature = "verify"))] -use dpp::identity::{Purpose, SecurityLevel}; -#[cfg(feature = "full")] -use dpp::prelude::IdentityPublicKey; -use dpp::serialization::PlatformDeserializable; -use dpp::version::PlatformVersion; - -use crate::drive::identity::identity_contract_info_group_path_key_purpose_vec; -use crate::drive::identity::key::fetch::KeyRequestType::{ - ContractBoundKey, ContractDocumentTypeBoundKey, -}; -#[cfg(feature = "full")] -use grovedb::query_result_type::{ - Key, Path, PathKeyOptionalElementTrio, QueryResultElement, QueryResultElements, -}; -#[cfg(feature = "full")] -use grovedb::Element; -#[cfg(feature = "full")] -use grovedb::Element::Item; -#[cfg(any(feature = "full", feature = "verify"))] -use grovedb::{PathQuery, SizedQuery}; -#[cfg(any(feature = "full", feature = "verify"))] -use integer_encoding::VarInt; -#[cfg(any(feature = "full", feature = "verify"))] -use std::collections::BTreeMap; -use std::collections::HashSet; -use std::ops::RangeFull; - -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] /// The kind of keys you are requesting /// A kind is a purpose/security level pair /// Do you want to get all keys in that pair @@ -81,7 +72,7 @@ pub enum KeyKindRequestType { AllKeysOfKindRequest, } -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] /// The type of key request #[derive(Clone)] pub enum KeyRequestType { @@ -97,63 +88,63 @@ pub enum KeyRequestType { ContractDocumentTypeBoundKey([u8; 32], String, Purpose, KeyKindRequestType), } -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] /// The key purpose as u8. pub type PurposeU8 = u8; -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] /// The key security level as u8. pub type SecurityLevelU8 = u8; -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// Type alias for a hashset of IdentityPublicKey Ids as the outcome of the query. pub type KeyIDHashSet = HashSet; -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// Type alias for a vec of IdentityPublicKey Ids as the outcome of the query. pub type KeyIDVec = Vec; -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// Type alias for a vec of IdentityPublicKeys as the outcome of the query. pub type KeyVec = Vec; -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// Type alias for a vec of serialized IdentityPublicKeys as the outcome of the query. pub type SerializedKeyVec = Vec>; -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// Type alias for a single IdentityPublicKey as the outcome of the query. pub type SingleIdentityPublicKeyOutcome = IdentityPublicKey; -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// Type alias for an optional single IdentityPublicKey as the outcome of the query. pub type OptionalSingleIdentityPublicKeyOutcome = Option; -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// Type alias for a Vector for key id to identity public key pair common pattern. pub type KeyIDIdentityPublicKeyPairVec = Vec<(KeyID, IdentityPublicKey)>; -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// Type alias for a Vector for key id to optional identity public key pair common pattern. pub type KeyIDOptionalIdentityPublicKeyPairVec = Vec<(KeyID, Option)>; -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// Type alias for a Vector for query key path to optional identity public key pair common pattern. pub type QueryKeyPathOptionalIdentityPublicKeyTrioVec = Vec<(Path, Key, Option)>; -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// Type alias for a bTreemap for a key id to identity public key pair common pattern. pub type KeyIDIdentityPublicKeyPairBTreeMap = BTreeMap; -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// Type alias for a bTreemap for a key id to optional identity public key pair common pattern. pub type KeyIDOptionalIdentityPublicKeyPairBTreeMap = BTreeMap>; -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// Type alias for a bTreemap for a query key path to optional identity public key pair common pattern. pub type QueryKeyPathOptionalIdentityPublicKeyTrioBTreeMap = BTreeMap<(Path, Key), Option>; -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// A trait to get typed results from raw results from Drive pub trait IdentityPublicKeyResult { /// Get a typed result from a trio of path key elements @@ -172,7 +163,7 @@ pub trait IdentityPublicKeyResult { Self: Sized; } -#[cfg(feature = "full")] +#[cfg(feature = "server")] fn element_to_serialized_identity_public_key(element: Element) -> Result, Error> { let Item(value, _) = element else { return Err(Error::Drive(DriveError::CorruptedElementType( @@ -183,7 +174,7 @@ fn element_to_serialized_identity_public_key(element: Element) -> Result Ok(value) } -#[cfg(feature = "full")] +#[cfg(feature = "server")] fn element_to_identity_public_key(element: Element) -> Result { let Item(value, _) = element else { return Err(Error::Drive(DriveError::CorruptedElementType( @@ -194,14 +185,14 @@ fn element_to_identity_public_key(element: Element) -> Result Result { let public_key = element_to_identity_public_key(element)?; Ok(public_key.id()) } -#[cfg(feature = "full")] +#[cfg(feature = "server")] fn element_to_identity_public_key_id_and_object_pair( element: Element, ) -> Result<(KeyID, IdentityPublicKey), Error> { @@ -210,7 +201,7 @@ fn element_to_identity_public_key_id_and_object_pair( Ok((public_key.id(), public_key)) } -#[cfg(feature = "full")] +#[cfg(feature = "server")] fn key_and_optional_element_to_identity_public_key_id_and_object_pair( (_path, key, maybe_element): (Path, Key, Option), ) -> Result<(KeyID, Option), Error> { @@ -229,7 +220,7 @@ fn key_and_optional_element_to_identity_public_key_id_and_object_pair( Ok((key_id, None)) } -#[cfg(feature = "full")] +#[cfg(feature = "server")] fn supported_query_result_element_to_identity_public_key( query_result_element: QueryResultElement, ) -> Result { @@ -242,7 +233,7 @@ fn supported_query_result_element_to_identity_public_key( } } -#[cfg(feature = "full")] +#[cfg(feature = "server")] fn supported_query_result_element_to_serialized_identity_public_key( query_result_element: QueryResultElement, ) -> Result, Error> { @@ -255,7 +246,7 @@ fn supported_query_result_element_to_serialized_identity_public_key( } } -#[cfg(feature = "full")] +#[cfg(feature = "server")] fn supported_query_result_element_to_identity_public_key_id( query_result_element: QueryResultElement, ) -> Result { @@ -268,7 +259,7 @@ fn supported_query_result_element_to_identity_public_key_id( } } -#[cfg(feature = "full")] +#[cfg(feature = "server")] fn supported_query_result_element_to_identity_public_key_id_and_object_pair( query_result_element: QueryResultElement, ) -> Result<(KeyID, IdentityPublicKey), Error> { @@ -281,7 +272,7 @@ fn supported_query_result_element_to_identity_public_key_id_and_object_pair( } } -#[cfg(feature = "full")] +#[cfg(feature = "server")] impl IdentityPublicKeyResult for SingleIdentityPublicKeyOutcome { fn try_from_path_key_optional( value: Vec, @@ -335,7 +326,7 @@ impl IdentityPublicKeyResult for SingleIdentityPublicKeyOutcome { } } -#[cfg(feature = "full")] +#[cfg(feature = "server")] impl IdentityPublicKeyResult for OptionalSingleIdentityPublicKeyOutcome { fn try_from_path_key_optional( value: Vec, @@ -385,7 +376,7 @@ impl IdentityPublicKeyResult for OptionalSingleIdentityPublicKeyOutcome { } } -#[cfg(feature = "full")] +#[cfg(feature = "server")] impl IdentityPublicKeyResult for KeyIDHashSet { fn try_from_path_key_optional( value: Vec, @@ -411,7 +402,7 @@ impl IdentityPublicKeyResult for KeyIDHashSet { } } -#[cfg(feature = "full")] +#[cfg(feature = "server")] impl IdentityPublicKeyResult for KeyIDVec { fn try_from_path_key_optional( value: Vec, @@ -437,7 +428,7 @@ impl IdentityPublicKeyResult for KeyIDVec { } } -#[cfg(feature = "full")] +#[cfg(feature = "server")] impl IdentityPublicKeyResult for KeyVec { fn try_from_path_key_optional( value: Vec, @@ -463,7 +454,7 @@ impl IdentityPublicKeyResult for KeyVec { } } -#[cfg(feature = "full")] +#[cfg(feature = "server")] impl IdentityPublicKeyResult for SerializedKeyVec { fn try_from_path_key_optional( value: Vec, @@ -489,7 +480,7 @@ impl IdentityPublicKeyResult for SerializedKeyVec { } } -#[cfg(feature = "full")] +#[cfg(feature = "server")] impl IdentityPublicKeyResult for KeyIDIdentityPublicKeyPairVec { fn try_from_path_key_optional( value: Vec, @@ -515,7 +506,7 @@ impl IdentityPublicKeyResult for KeyIDIdentityPublicKeyPairVec { } } -#[cfg(feature = "full")] +#[cfg(feature = "server")] impl IdentityPublicKeyResult for KeyIDOptionalIdentityPublicKeyPairVec { fn try_from_path_key_optional( value: Vec, @@ -537,7 +528,7 @@ impl IdentityPublicKeyResult for KeyIDOptionalIdentityPublicKeyPairVec { } } -#[cfg(feature = "full")] +#[cfg(feature = "server")] impl IdentityPublicKeyResult for QueryKeyPathOptionalIdentityPublicKeyTrioVec { fn try_from_path_key_optional( value: Vec, @@ -567,7 +558,7 @@ impl IdentityPublicKeyResult for QueryKeyPathOptionalIdentityPublicKeyTrioVec { } } -#[cfg(feature = "full")] +#[cfg(feature = "server")] impl IdentityPublicKeyResult for KeyIDIdentityPublicKeyPairBTreeMap { fn try_from_path_key_optional( value: Vec, @@ -593,7 +584,7 @@ impl IdentityPublicKeyResult for KeyIDIdentityPublicKeyPairBTreeMap { } } -#[cfg(feature = "full")] +#[cfg(feature = "server")] impl IdentityPublicKeyResult for KeyIDOptionalIdentityPublicKeyPairBTreeMap { fn try_from_path_key_optional( value: Vec, @@ -615,7 +606,7 @@ impl IdentityPublicKeyResult for KeyIDOptionalIdentityPublicKeyPairBTreeMap { } } -#[cfg(feature = "full")] +#[cfg(feature = "server")] impl IdentityPublicKeyResult for QueryKeyPathOptionalIdentityPublicKeyTrioBTreeMap { fn try_from_path_key_optional( value: Vec, @@ -645,7 +636,7 @@ impl IdentityPublicKeyResult for QueryKeyPathOptionalIdentityPublicKeyTrioBTreeM } } -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] /// A request to get Keys from an Identity #[derive(Clone)] pub struct IdentityKeysRequest { @@ -660,7 +651,7 @@ pub struct IdentityKeysRequest { } impl IdentityKeysRequest { - #[cfg(feature = "full")] + #[cfg(feature = "server")] /// Gets the processing cost of an identity keys request pub fn processing_cost(&self, epoch: &Epoch) -> Result { match &self.request_type { @@ -683,7 +674,7 @@ impl IdentityKeysRequest { } } - #[cfg(feature = "full")] + #[cfg(feature = "server")] /// Make a request for all current keys for the identity pub fn new_all_current_keys_query(identity_id: [u8; 32]) -> Self { let mut sec_btree_map = BTreeMap::new(); @@ -702,7 +693,7 @@ impl IdentityKeysRequest { } } - #[cfg(feature = "full")] + #[cfg(feature = "server")] /// Make a request for an encryption key for a specific contract pub fn new_contract_encryption_keys_query( identity_id: [u8; 32], @@ -720,7 +711,7 @@ impl IdentityKeysRequest { } } - #[cfg(feature = "full")] + #[cfg(feature = "server")] /// Make a request for an decryption key for a specific contract pub fn new_contract_decryption_keys_query( identity_id: [u8; 32], @@ -738,7 +729,7 @@ impl IdentityKeysRequest { } } - #[cfg(feature = "full")] + #[cfg(feature = "server")] /// Make a request for an encryption key for a specific contract document type pub fn new_document_type_encryption_keys_query( identity_id: [u8; 32], @@ -758,7 +749,7 @@ impl IdentityKeysRequest { } } - #[cfg(feature = "full")] + #[cfg(feature = "server")] /// Make a request for an decryption key for a specific contract document type pub fn new_document_type_decryption_keys_query( identity_id: [u8; 32], @@ -778,7 +769,7 @@ impl IdentityKeysRequest { } } - #[cfg(any(feature = "full", feature = "verify"))] + #[cfg(any(feature = "server", feature = "verify"))] /// Make a request for all current keys for the identity pub fn new_all_keys_query(identity_id: &[u8; 32], limit: Option) -> Self { IdentityKeysRequest { @@ -789,7 +780,7 @@ impl IdentityKeysRequest { } } - #[cfg(any(feature = "full", feature = "verify"))] + #[cfg(any(feature = "server", feature = "verify"))] /// Make a request for specific keys for the identity pub fn new_specific_keys_query(identity_id: &[u8; 32], key_ids: Vec) -> Self { let limit = key_ids.len() as u16; @@ -801,7 +792,7 @@ impl IdentityKeysRequest { } } - #[cfg(any(feature = "full", feature = "verify"))] + #[cfg(any(feature = "server", feature = "verify"))] /// Make a request for specific keys for the identity pub fn new_specific_keys_query_without_limit( identity_id: &[u8; 32], @@ -815,7 +806,7 @@ impl IdentityKeysRequest { } } - #[cfg(any(feature = "full", feature = "verify"))] + #[cfg(any(feature = "server", feature = "verify"))] /// Make a request for a specific key for the identity without a limit /// Not have a limit is needed if you want to merge path queries pub fn new_specific_key_query_without_limit(identity_id: &[u8; 32], key_id: KeyID) -> Self { @@ -827,7 +818,7 @@ impl IdentityKeysRequest { } } - #[cfg(any(feature = "full", feature = "verify"))] + #[cfg(any(feature = "server", feature = "verify"))] /// Make a request for a specific key for the identity pub fn new_specific_key_query(identity_id: &[u8; 32], key_id: KeyID) -> Self { IdentityKeysRequest { @@ -838,7 +829,7 @@ impl IdentityKeysRequest { } } - #[cfg(any(feature = "full", feature = "verify"))] + #[cfg(any(feature = "server", feature = "verify"))] /// Create the path query for the request pub fn into_path_query(self) -> PathQuery { let IdentityKeysRequest { @@ -940,7 +931,7 @@ impl IdentityKeysRequest { } } - #[cfg(any(feature = "full", feature = "verify"))] + #[cfg(any(feature = "server", feature = "verify"))] /// All keys fn all_keys_query() -> Query { let mut query = Query::new(); @@ -948,7 +939,7 @@ impl IdentityKeysRequest { query } - #[cfg(any(feature = "full", feature = "verify"))] + #[cfg(any(feature = "server", feature = "verify"))] /// Fetch a specific key knowing the id fn specific_keys_query(key_ids: Vec) -> Query { let mut query = Query::new(); @@ -958,7 +949,7 @@ impl IdentityKeysRequest { query } - #[cfg(any(feature = "full", feature = "verify"))] + #[cfg(any(feature = "server", feature = "verify"))] /// Construct the query for the request fn construct_search_query( key_requests: BTreeMap>, @@ -1002,7 +993,7 @@ impl IdentityKeysRequest { } } -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[cfg(test)] mod tests { use crate::tests::helpers::setup::setup_drive; diff --git a/packages/rs-drive/src/drive/identity/key/mod.rs b/packages/rs-drive/src/drive/identity/key/mod.rs index 255fff2d69..b20ba03fdf 100644 --- a/packages/rs-drive/src/drive/identity/key/mod.rs +++ b/packages/rs-drive/src/drive/identity/key/mod.rs @@ -1,13 +1,13 @@ -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] /// Fetching of Identity Keys pub mod fetch; -#[cfg(feature = "full")] +#[cfg(feature = "server")] pub(crate) mod insert; -#[cfg(feature = "full")] +#[cfg(feature = "server")] pub(crate) mod insert_key_hash_identity_reference; -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// Prove module pub mod prove; -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] /// Queries module pub mod queries; diff --git a/packages/rs-drive/src/drive/identity/mod.rs b/packages/rs-drive/src/drive/identity/mod.rs index d57226350f..32597a8a13 100644 --- a/packages/rs-drive/src/drive/identity/mod.rs +++ b/packages/rs-drive/src/drive/identity/mod.rs @@ -32,57 +32,57 @@ //! fetching identities from the subtree. //! -#[cfg(feature = "full")] +#[cfg(feature = "server")] use crate::drive::object_size_info::DriveKeyInfo; -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] use crate::drive::RootTree; -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] use dpp::identity::Purpose; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use dpp::identity::{KeyID, SecurityLevel}; -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// Everything related to withdrawals pub mod withdrawals; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use dpp::identity::Purpose::AUTHENTICATION; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use integer_encoding::VarInt; -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] mod balance; -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] pub(crate) mod contract_info; -#[cfg(feature = "full")] +#[cfg(feature = "server")] mod estimation_costs; -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] mod fetch; -#[cfg(feature = "full")] +#[cfg(feature = "server")] mod insert; -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] /// Module related to Identity Keys pub mod key; /// Module related to updating of identity -#[cfg(feature = "full")] +#[cfg(feature = "server")] pub mod update; -#[cfg(feature = "full")] +#[cfg(feature = "server")] pub use withdrawals::paths::add_initial_withdrawal_state_structure_operations; use crate::drive::identity::contract_info::ContractInfoStructure; -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] pub use fetch::queries::*; /// Identity path -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] pub(crate) fn identity_path(identity_id: &[u8]) -> [&[u8]; 2] { [Into::<&[u8; 1]>::into(RootTree::Identities), identity_id] } /// Identity path vector -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] pub(crate) fn identity_path_vec(identity_id: &[u8]) -> Vec> { vec![ Into::<&[u8; 1]>::into(RootTree::Identities).to_vec(), @@ -90,7 +90,7 @@ pub(crate) fn identity_path_vec(identity_id: &[u8]) -> Vec> { ] } -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// The path for the contract info for an identity pub fn identity_contract_info_root_path(identity_id: &[u8; 32]) -> [&[u8]; 3] { [ @@ -100,7 +100,7 @@ pub fn identity_contract_info_root_path(identity_id: &[u8; 32]) -> [&[u8]; 3] { ] } -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// The path for the contract info for an identity as a vec pub fn identity_contract_info_root_path_vec(identity_id: &[u8; 32]) -> Vec> { vec![ @@ -151,7 +151,7 @@ pub fn identity_contract_info_group_keys_path_vec( } /// The group is either a contract id or on a family of contracts owned by the same identity -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] pub fn identity_contract_info_group_path_key_purpose_vec( identity_id: &[u8; 32], group_id: &[u8], @@ -167,7 +167,7 @@ pub fn identity_contract_info_group_path_key_purpose_vec( ] } -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// The path for a specific contract info for an identity pub fn identity_contract_info_path<'a>( identity_id: &'a [u8], @@ -181,7 +181,7 @@ pub fn identity_contract_info_path<'a>( ] } -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// The path for a specific contract info for an identity as a vec pub fn identity_contract_info_path_vec(identity_id: &[u8], contract_id: &[u8]) -> Vec> { vec![ @@ -193,7 +193,7 @@ pub fn identity_contract_info_path_vec(identity_id: &[u8], contract_id: &[u8]) - } /// identity key tree path -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] /// Identity key tree path pub(crate) fn identity_key_tree_path(identity_id: &[u8]) -> [&[u8]; 3] { [ @@ -203,7 +203,7 @@ pub(crate) fn identity_key_tree_path(identity_id: &[u8]) -> [&[u8]; 3] { ] } -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] /// The path for all identity keys as a vec pub fn identity_key_tree_path_vec(identity_id: &[u8]) -> Vec> { vec![ @@ -213,7 +213,7 @@ pub fn identity_key_tree_path_vec(identity_id: &[u8]) -> Vec> { ] } -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// The path for a specific key as a vec pub fn identity_key_path_vec(identity_id: &[u8], key_id: KeyID) -> Vec> { vec![ @@ -225,7 +225,7 @@ pub fn identity_key_path_vec(identity_id: &[u8], key_id: KeyID) -> Vec> } /// identity key location within identity vec -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// Identity key location within identity vector pub(crate) fn identity_key_location_within_identity_vec(encoded_key_id: &[u8]) -> Vec> { vec![ @@ -235,7 +235,7 @@ pub(crate) fn identity_key_location_within_identity_vec(encoded_key_id: &[u8]) - } /// identity query keys tree path -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// Identity query keys tree path pub(crate) fn identity_query_keys_tree_path(identity_id: &[u8]) -> [&[u8]; 3] { [ @@ -246,7 +246,7 @@ pub(crate) fn identity_query_keys_tree_path(identity_id: &[u8]) -> [&[u8]; 3] { } /// identity query keys tree path vec -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] /// Identity query keys tree path vector pub(crate) fn identity_query_keys_tree_path_vec(identity_id: [u8; 32]) -> Vec> { vec![ @@ -257,7 +257,7 @@ pub(crate) fn identity_query_keys_tree_path_vec(identity_id: [u8; 32]) -> Vec( identity_id: &'a [u8], @@ -272,7 +272,7 @@ pub(crate) fn identity_query_keys_purpose_tree_path<'a>( } /// identity query keys purpose tree path vec -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// Identity query keys purpose tree path vec pub(crate) fn identity_query_keys_purpose_tree_path_vec( identity_id: &[u8], @@ -287,7 +287,7 @@ pub(crate) fn identity_query_keys_purpose_tree_path_vec( } /// identity query keys security level tree path vec -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// Identity query keys security level tree path vec pub(crate) fn identity_query_keys_security_level_tree_path_vec( identity_id: &[u8], @@ -303,7 +303,7 @@ pub(crate) fn identity_query_keys_security_level_tree_path_vec( } /// identity query keys full tree path -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// Identity query keys full tree path pub(crate) fn identity_query_keys_for_transfer_full_tree_path(identity_id: &[u8]) -> [&[u8]; 4] { [ @@ -315,7 +315,7 @@ pub(crate) fn identity_query_keys_for_transfer_full_tree_path(identity_id: &[u8] } /// identity query keys full tree path -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// Identity query keys full tree path pub(crate) fn identity_query_keys_for_authentication_full_tree_path<'a>( identity_id: &'a [u8], @@ -331,7 +331,7 @@ pub(crate) fn identity_query_keys_for_authentication_full_tree_path<'a>( } /// The root structure of identities -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] #[repr(u8)] #[derive(Copy, Clone)] pub enum IdentityRootStructure { @@ -349,28 +349,28 @@ pub enum IdentityRootStructure { IdentityContractInfo = 32, } -#[cfg(feature = "full")] +#[cfg(feature = "server")] impl IdentityRootStructure { fn to_drive_key_info<'a>(self) -> DriveKeyInfo<'a> { DriveKeyInfo::Key(vec![self as u8]) } } -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] impl From for u8 { fn from(root_tree: IdentityRootStructure) -> Self { root_tree as u8 } } -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] impl From for [u8; 1] { fn from(root_tree: IdentityRootStructure) -> Self { [root_tree as u8] } } -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] impl From for &'static [u8; 1] { fn from(identity_tree: IdentityRootStructure) -> Self { match identity_tree { diff --git a/packages/rs-drive/src/drive/identity/update/operations/merge_identity_nonce_operations/v0/mod.rs b/packages/rs-drive/src/drive/identity/update/operations/merge_identity_nonce_operations/v0/mod.rs index f27d412a5b..6a4d383e31 100644 --- a/packages/rs-drive/src/drive/identity/update/operations/merge_identity_nonce_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/update/operations/merge_identity_nonce_operations/v0/mod.rs @@ -165,7 +165,7 @@ impl Drive { } } -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[cfg(test)] mod tests { use crate::drive::Drive; diff --git a/packages/rs-drive/src/drive/initialization/v0/mod.rs b/packages/rs-drive/src/drive/initialization/v0/mod.rs index 34319e837e..1e19b1c940 100644 --- a/packages/rs-drive/src/drive/initialization/v0/mod.rs +++ b/packages/rs-drive/src/drive/initialization/v0/mod.rs @@ -195,7 +195,7 @@ impl Drive { } } -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[cfg(test)] mod tests { use crate::drive::RootTree; diff --git a/packages/rs-drive/src/drive/mod.rs b/packages/rs-drive/src/drive/mod.rs index e8d7fe3065..bcd46bce32 100644 --- a/packages/rs-drive/src/drive/mod.rs +++ b/packages/rs-drive/src/drive/mod.rs @@ -27,88 +27,86 @@ // DEALINGS IN THE SOFTWARE. // -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] use grovedb::GroveDb; -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] use crate::drive::config::DriveConfig; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use crate::fee::op::LowLevelDriveOperation; -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] pub mod balances; /// Batch module -#[cfg(feature = "full")] +#[cfg(feature = "server")] pub mod batch; /// Drive Cache -#[cfg(feature = "full")] +#[cfg(feature = "server")] pub mod cache; -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] pub mod config; ///DataContract module -#[cfg(any(feature = "full", feature = "verify", feature = "fixtures-and-mocks"))] +#[cfg(any(feature = "server", feature = "verify", feature = "fixtures-and-mocks"))] pub mod contract; /// Fee pools module -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] pub mod credit_pools; -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] pub mod defaults; /// Document module -#[cfg(any(feature = "full", feature = "verify", feature = "fixtures-and-mocks"))] +#[cfg(any(feature = "server", feature = "verify", feature = "fixtures-and-mocks"))] pub mod document; -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] pub mod flags; /// Low level GroveDB operations -#[cfg(feature = "full")] +#[cfg(feature = "server")] pub mod grove_operations; /// Identity module -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] pub mod identity; -#[cfg(feature = "full")] +#[cfg(feature = "server")] pub mod initialization; -#[cfg(feature = "full")] +#[cfg(feature = "server")] pub mod object_size_info; /// Protocol upgrade module -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] pub mod protocol_upgrade; -#[cfg(feature = "full")] +#[cfg(feature = "server")] mod shared_estimation_costs; -#[cfg(feature = "full")] +#[cfg(feature = "server")] mod system; -#[cfg(test)] -mod test_utils; -#[cfg(feature = "full")] +#[cfg(feature = "server")] mod asset_lock; -#[cfg(feature = "full")] +#[cfg(feature = "server")] pub(crate) mod fee; -#[cfg(feature = "full")] +#[cfg(feature = "server")] mod open; -#[cfg(feature = "full")] +#[cfg(feature = "server")] mod operations; -#[cfg(feature = "full")] +#[cfg(feature = "server")] mod platform_state; -#[cfg(feature = "full")] +#[cfg(feature = "server")] mod prove; /// Contains a set of useful grovedb proof verification functions #[cfg(feature = "verify")] pub mod verify; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use crate::drive::cache::DriveCache; /// Drive struct -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] pub struct Drive { /// GroveDB pub grove: GroveDb, /// Drive config pub config: DriveConfig, /// Drive Cache - #[cfg(feature = "full")] + #[cfg(feature = "server")] pub cache: DriveCache, } @@ -126,7 +124,7 @@ pub struct Drive { // NUPKH->I 8 UPKH->I 24 SpentAssetLockTransactions 72 Versions 120 /// Keys for the root tree. -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] #[repr(u8)] pub enum RootTree { // Input data errors @@ -155,24 +153,24 @@ pub enum RootTree { } /// Storage cost -#[cfg(feature = "full")] +#[cfg(feature = "server")] pub const STORAGE_COST: i32 = 50; -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] impl From for u8 { fn from(root_tree: RootTree) -> Self { root_tree as u8 } } -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] impl From for [u8; 1] { fn from(root_tree: RootTree) -> Self { [root_tree as u8] } } -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] impl From for &'static [u8; 1] { fn from(root_tree: RootTree) -> Self { match root_tree { @@ -192,13 +190,13 @@ impl From for &'static [u8; 1] { } /// Returns the path to the identities -#[cfg(feature = "full")] +#[cfg(feature = "server")] pub(crate) fn identity_tree_path() -> [&'static [u8]; 1] { [Into::<&[u8; 1]>::into(RootTree::Identities)] } /// Returns the path to the key hashes. -#[cfg(feature = "full")] +#[cfg(feature = "server")] pub(crate) fn unique_key_hashes_tree_path() -> [&'static [u8]; 1] { [Into::<&[u8; 1]>::into( RootTree::UniquePublicKeyHashesToIdentities, @@ -206,13 +204,13 @@ pub(crate) fn unique_key_hashes_tree_path() -> [&'static [u8]; 1] { } /// Returns the path to the key hashes. -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] pub(crate) fn unique_key_hashes_tree_path_vec() -> Vec> { vec![vec![RootTree::UniquePublicKeyHashesToIdentities as u8]] } /// Returns the path to the masternode key hashes. -#[cfg(feature = "full")] +#[cfg(feature = "server")] pub(crate) fn non_unique_key_hashes_tree_path() -> [&'static [u8]; 1] { [Into::<&[u8; 1]>::into( RootTree::NonUniquePublicKeyKeyHashesToIdentities, @@ -220,7 +218,7 @@ pub(crate) fn non_unique_key_hashes_tree_path() -> [&'static [u8]; 1] { } /// Returns the path to the masternode key hashes. -#[cfg(feature = "full")] +#[cfg(feature = "server")] pub(crate) fn non_unique_key_hashes_tree_path_vec() -> Vec> { vec![vec![ RootTree::NonUniquePublicKeyKeyHashesToIdentities as u8, @@ -228,7 +226,7 @@ pub(crate) fn non_unique_key_hashes_tree_path_vec() -> Vec> { } /// Returns the path to the masternode key hashes sub tree. -#[cfg(feature = "full")] +#[cfg(feature = "server")] pub(crate) fn non_unique_key_hashes_sub_tree_path(public_key_hash: &[u8]) -> [&[u8]; 2] { [ Into::<&[u8; 1]>::into(RootTree::NonUniquePublicKeyKeyHashesToIdentities), @@ -237,7 +235,7 @@ pub(crate) fn non_unique_key_hashes_sub_tree_path(public_key_hash: &[u8]) -> [&[ } /// Returns the path to the masternode key hashes sub tree. -#[cfg(feature = "full")] +#[cfg(feature = "server")] pub(crate) fn non_unique_key_hashes_sub_tree_path_vec(public_key_hash: [u8; 20]) -> Vec> { vec![ vec![RootTree::NonUniquePublicKeyKeyHashesToIdentities as u8], @@ -246,7 +244,7 @@ pub(crate) fn non_unique_key_hashes_sub_tree_path_vec(public_key_hash: [u8; 20]) } /// Returns the path to a contract's document types. -#[cfg(feature = "full")] +#[cfg(feature = "server")] fn contract_documents_path(contract_id: &[u8]) -> [&[u8]; 3] { [ Into::<&[u8; 1]>::into(RootTree::DataContractDocuments), diff --git a/packages/rs-drive/src/drive/protocol_upgrade/mod.rs b/packages/rs-drive/src/drive/protocol_upgrade/mod.rs index fb72dfa060..1837570556 100644 --- a/packages/rs-drive/src/drive/protocol_upgrade/mod.rs +++ b/packages/rs-drive/src/drive/protocol_upgrade/mod.rs @@ -1,33 +1,33 @@ -#[cfg(feature = "full")] +#[cfg(feature = "server")] use crate::drive::batch::grovedb_op_batch::GroveDbOpBatchV0Methods; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use crate::drive::batch::GroveDbOpBatch; -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] use crate::drive::RootTree; -#[cfg(feature = "full")] +#[cfg(feature = "server")] mod clear_version_information; -#[cfg(feature = "full")] +#[cfg(feature = "server")] mod fetch_proved_validator_version_votes; -#[cfg(feature = "full")] +#[cfg(feature = "server")] mod fetch_proved_versions_with_counter; -#[cfg(feature = "full")] +#[cfg(feature = "server")] mod fetch_validator_version_votes; -#[cfg(feature = "full")] +#[cfg(feature = "server")] mod fetch_versions_with_counter; -#[cfg(feature = "full")] +#[cfg(feature = "server")] mod remove_validators_proposed_app_versions; -#[cfg(feature = "full")] +#[cfg(feature = "server")] mod update_validator_proposed_app_version; -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] /// constant id for various versions counter pub const VERSIONS_COUNTER: [u8; 1] = [0]; -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] /// constant id for subtree containing the desired versions for each validator pub const VALIDATOR_DESIRED_VERSIONS: [u8; 1] = [1]; -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// Add operations for creating initial versioning state structure pub fn add_initial_fork_update_structure_operations(batch: &mut GroveDbOpBatch) { batch.add_insert_empty_tree( @@ -41,7 +41,7 @@ pub fn add_initial_fork_update_structure_operations(batch: &mut GroveDbOpBatch) ); } -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] /// versions counter path pub fn versions_counter_path() -> [&'static [u8]; 2] { [ @@ -50,13 +50,13 @@ pub fn versions_counter_path() -> [&'static [u8]; 2] { ] } -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] /// versions counter path pub fn versions_counter_path_vec() -> Vec> { vec![vec![RootTree::Versions as u8], VERSIONS_COUNTER.to_vec()] } -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] /// desired version for validators path pub fn desired_version_for_validators_path() -> [&'static [u8]; 2] { [ @@ -65,7 +65,7 @@ pub fn desired_version_for_validators_path() -> [&'static [u8]; 2] { ] } -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] /// desired version for validators path pub fn desired_version_for_validators_path_vec() -> Vec> { vec![ diff --git a/packages/rs-drive/src/drive/system/genesis_time/mod.rs b/packages/rs-drive/src/drive/system/genesis_time/mod.rs index 62a7508b34..48e72ddebf 100644 --- a/packages/rs-drive/src/drive/system/genesis_time/mod.rs +++ b/packages/rs-drive/src/drive/system/genesis_time/mod.rs @@ -77,7 +77,7 @@ impl Drive { } } -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[cfg(test)] mod tests { use super::*; diff --git a/packages/rs-drive/src/drive/system/mod.rs b/packages/rs-drive/src/drive/system/mod.rs index 7493702adf..134ef7d68b 100644 --- a/packages/rs-drive/src/drive/system/mod.rs +++ b/packages/rs-drive/src/drive/system/mod.rs @@ -1,6 +1,6 @@ mod estimation_costs; /// Genesis time module -#[cfg(feature = "full")] +#[cfg(feature = "server")] pub mod genesis_time; /// Protocol version module pub mod protocol_version; diff --git a/packages/rs-drive/src/drive/test_utils.rs b/packages/rs-drive/src/drive/test_utils.rs deleted file mode 100644 index f48d00d75b..0000000000 --- a/packages/rs-drive/src/drive/test_utils.rs +++ /dev/null @@ -1,27 +0,0 @@ -use std::cell::RefCell; - -use dpp::util::entropy_generator::EntropyGenerator; -use rand::{rngs::SmallRng, Rng, SeedableRng}; - -/// test entropy generator -pub(crate) struct TestEntropyGenerator { - rng: RefCell, -} - -impl TestEntropyGenerator { - /// new test entropy generator - #[allow(dead_code)] - #[deprecated(note = "This function is marked as unused.")] - #[allow(deprecated)] - pub(crate) fn new() -> Self { - Self { - rng: RefCell::new(SmallRng::seed_from_u64(1337)), - } - } -} - -impl EntropyGenerator for TestEntropyGenerator { - fn generate(&self) -> anyhow::Result<[u8; 32]> { - Ok(self.rng.borrow_mut().gen()) - } -} diff --git a/packages/rs-drive/src/fee_pools/epochs/mod.rs b/packages/rs-drive/src/fee_pools/epochs/mod.rs index 35e18051e9..abc78649d4 100644 --- a/packages/rs-drive/src/fee_pools/epochs/mod.rs +++ b/packages/rs-drive/src/fee_pools/epochs/mod.rs @@ -30,11 +30,11 @@ //! Epoch pools //! -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] /// Epoch key constants module pub mod epoch_key_constants; -#[cfg(feature = "full")] +#[cfg(feature = "server")] pub mod operations_factory; -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] pub mod paths; diff --git a/packages/rs-drive/src/fee_pools/mod.rs b/packages/rs-drive/src/fee_pools/mod.rs index 438368c4fb..a9989e1134 100644 --- a/packages/rs-drive/src/fee_pools/mod.rs +++ b/packages/rs-drive/src/fee_pools/mod.rs @@ -27,43 +27,43 @@ // DEALINGS IN THE SOFTWARE. // -#[cfg(feature = "full")] +#[cfg(feature = "server")] use crate::drive::batch::grovedb_op_batch::GroveDbOpBatchV0Methods; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use crate::drive::batch::GroveDbOpBatch; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use crate::drive::credit_pools::paths::pools_vec_path; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use crate::error::Error; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use crate::fee_pools::epochs::operations_factory::EpochOperations; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use crate::fee_pools::epochs_root_tree_key_constants::{ KEY_PENDING_EPOCH_REFUNDS, KEY_STORAGE_FEE_POOL, KEY_UNPAID_EPOCH_INDEX, }; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use dpp::balances::credits::Creditable; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use dpp::block::epoch::{Epoch, EpochIndex}; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use dpp::fee::epoch::{perpetual_storage_epochs, GENESIS_EPOCH_INDEX}; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use dpp::fee::Credits; use dpp::util::deserializer::ProtocolVersion; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use grovedb::batch::GroveDbOp; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use grovedb::Element; -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] /// Epochs module pub mod epochs; -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] /// Epochs root tree key constants module pub mod epochs_root_tree_key_constants; -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// Adds the operations to groveDB op batch to create the fee pool trees pub fn add_create_fee_pool_trees_operations( batch: &mut GroveDbOpBatch, @@ -94,13 +94,13 @@ pub fn add_create_fee_pool_trees_operations( Ok(()) } -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// Adds operations to batch to create pending pool updates tree pub fn add_create_pending_epoch_refunds_tree_operations(batch: &mut GroveDbOpBatch) { batch.add_insert_empty_sum_tree(pools_vec_path(), KEY_PENDING_EPOCH_REFUNDS.to_vec()); } -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// Updates the storage fee distribution pool with a new storage fee pub fn update_storage_fee_distribution_pool_operation( storage_fee: Credits, @@ -112,7 +112,7 @@ pub fn update_storage_fee_distribution_pool_operation( )) } -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// Updates the unpaid epoch index pub fn update_unpaid_epoch_index_operation(epoch_index: EpochIndex) -> GroveDbOp { GroveDbOp::insert_op( diff --git a/packages/rs-drive/src/lib.rs b/packages/rs-drive/src/lib.rs index 29e8a40568..2cc1863c52 100644 --- a/packages/rs-drive/src/lib.rs +++ b/packages/rs-drive/src/lib.rs @@ -8,43 +8,43 @@ #![forbid(unsafe_code)] #![deny(missing_docs)] -#[cfg(feature = "full")] +#[cfg(feature = "server")] extern crate core; -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] pub mod common; /// Drive module -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] pub mod drive; /// Error module -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] pub mod error; /// Fee pools module -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] pub mod fee_pools; /// Query module -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] pub mod query; /// DPP module -#[cfg(feature = "full")] +#[cfg(feature = "server")] pub use dpp; /// GroveDB module -#[cfg(feature = "full")] +#[cfg(feature = "server")] pub use grovedb; -#[cfg(feature = "full")] +#[cfg(feature = "server")] pub use grovedb_path; -#[cfg(feature = "full")] +#[cfg(feature = "server")] pub use grovedb_costs; -#[cfg(feature = "full")] +#[cfg(feature = "server")] pub use grovedb_storage; -#[cfg(feature = "full")] +#[cfg(feature = "server")] mod fee; /// State transition action module -#[cfg(feature = "full")] +#[cfg(feature = "server")] pub mod state_transition_action; /// Test helpers #[cfg(feature = "fixtures-and-mocks")] diff --git a/packages/rs-drive/src/query/conditions.rs b/packages/rs-drive/src/query/conditions.rs index 8f43aa88d0..95c94b5189 100644 --- a/packages/rs-drive/src/query/conditions.rs +++ b/packages/rs-drive/src/query/conditions.rs @@ -75,7 +75,8 @@ fn sql_value_to_platform_value(sql_value: ast::Value) -> Option { } /// Where operator arguments -#[derive(Copy, Clone, Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize)] +#[derive(Copy, Clone, Debug, PartialEq, Eq)] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub enum WhereOperator { /// Equal Equal, @@ -228,7 +229,8 @@ impl From for Value { } /// Where clause struct -#[derive(Clone, Debug, PartialEq, serde::Serialize, serde::Deserialize)] +#[derive(Clone, Debug, PartialEq)] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub struct WhereClause { /// Field pub field: String, @@ -1289,7 +1291,7 @@ impl From for Value { } } -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[cfg(test)] mod tests { use crate::query::conditions::WhereClause; diff --git a/packages/rs-drive/src/query/mod.rs b/packages/rs-drive/src/query/mod.rs index 1feb4fa168..154f01449c 100644 --- a/packages/rs-drive/src/query/mod.rs +++ b/packages/rs-drive/src/query/mod.rs @@ -1,139 +1,78 @@ -// MIT LICENSE -// -// Copyright (c) 2021 Dash Core Group -// -// Permission is hereby granted, free of charge, to any -// person obtaining a copy of this software and associated -// documentation files (the "Software"), to deal in the -// Software without restriction, including without -// limitation the rights to use, copy, modify, merge, -// publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software -// is furnished to do so, subject to the following -// conditions: -// -// The above copyright notice and this permission notice -// shall be included in all copies or substantial portions -// of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -// ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -// TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -// SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -// IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -// DEALINGS IN THE SOFTWARE. -// - -#[cfg(any(feature = "full", feature = "verify"))] -use std::collections::BTreeMap; -#[cfg(any(feature = "full", feature = "verify"))] -use std::ops::BitXor; - -#[cfg(feature = "full")] -use grovedb::query_result_type::{QueryResultElements, QueryResultType}; -/// Import grovedb -#[cfg(feature = "full")] -pub use grovedb::{Element, Error as GroveError, GroveDb, TransactionArg}; -#[cfg(any(feature = "full", feature = "verify"))] -pub use grovedb::{PathQuery, Query, QueryItem, SizedQuery}; - -#[cfg(any(feature = "full", feature = "verify"))] -use indexmap::IndexMap; - -#[cfg(any(feature = "full", feature = "verify"))] -use sqlparser::ast; -#[cfg(any(feature = "full", feature = "verify"))] -use sqlparser::ast::TableFactor::Table; -#[cfg(any(feature = "full", feature = "verify"))] -use sqlparser::ast::Value::Number; -#[cfg(any(feature = "full", feature = "verify"))] -use sqlparser::ast::{OrderByExpr, Select, Statement}; -#[cfg(any(feature = "full", feature = "verify"))] -use sqlparser::dialect::MySqlDialect; -#[cfg(any(feature = "full", feature = "verify"))] -use sqlparser::parser::Parser; - -#[cfg(any(feature = "full", feature = "verify"))] -pub use conditions::WhereClause; -/// Import conditions -#[cfg(any(feature = "full", feature = "verify"))] -pub use conditions::WhereOperator; -#[cfg(feature = "full")] -use dpp::block::block_info::BlockInfo; -use dpp::data_contract::accessors::v0::DataContractV0Getters; - -#[cfg(any(feature = "full", feature = "verify"))] -use dpp::data_contract::document_type::DocumentTypeRef; -#[cfg(any(feature = "full", feature = "verify"))] -use dpp::data_contract::document_type::{Index, IndexProperty}; -#[cfg(any(feature = "full", feature = "verify"))] - -/// Import ordering -#[cfg(any(feature = "full", feature = "verify"))] -pub use ordering::OrderClause; - -#[cfg(feature = "full")] -#[cfg(feature = "full")] -use crate::drive::grove_operations::QueryType::StatefulQuery; -#[cfg(feature = "full")] -use crate::drive::Drive; -#[cfg(any(feature = "full", feature = "verify"))] -use crate::error::drive::DriveError; -#[cfg(any(feature = "full", feature = "verify"))] -use crate::error::query::QuerySyntaxError; -#[cfg(any(feature = "full", feature = "verify"))] -use crate::error::Error; -#[cfg(feature = "full")] -use crate::fee::op::LowLevelDriveOperation; -#[cfg(any(feature = "full", feature = "verify"))] -use dpp::data_contract::DataContract; - -#[cfg(any(feature = "full", feature = "verify"))] -use crate::drive::contract::paths::DataContractPaths; - -use dpp::document::document_methods::DocumentMethodsV0; -use dpp::document::serialization_traits::DocumentPlatformConversionMethodsV0; -#[cfg(any(feature = "full", feature = "verify"))] -use dpp::document::Document; - -#[cfg(any(feature = "full", feature = "verify"))] -use dpp::platform_value::btreemap_extensions::BTreeValueRemoveFromMapHelper; -use dpp::platform_value::platform_value; -#[cfg(any(feature = "full", feature = "verify"))] -use dpp::platform_value::Value; - -use crate::common::encode::encode_u64; -use crate::drive::config::DriveConfig; -use crate::error::Error::GroveDB; - -use dpp::version::PlatformVersion; -#[cfg(any(feature = "full", feature = "verify"))] -use dpp::ProtocolError; - -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] +pub use { + conditions::{WhereClause, WhereOperator}, + grovedb::{PathQuery, Query, QueryItem, SizedQuery}, + ordering::OrderClause, + single_document_drive_query::SingleDocumentDriveQuery, +}; +// Imports available when either "server" or "verify" features are enabled +#[cfg(any(feature = "server", feature = "verify"))] +use { + crate::{ + drive::contract::paths::DataContractPaths, + error::{drive::DriveError, query::QuerySyntaxError, Error}, + }, + dpp::{ + data_contract::{ + accessors::v0::DataContractV0Getters, + document_type::{accessors::DocumentTypeV0Getters, methods::DocumentTypeV0Methods}, + document_type::{DocumentTypeRef, Index, IndexProperty}, + DataContract, + }, + document::{ + document_methods::DocumentMethodsV0, + serialization_traits::DocumentPlatformConversionMethodsV0, Document, DocumentV0Getters, + }, + platform_value::{btreemap_extensions::BTreeValueRemoveFromMapHelper, Value}, + version::PlatformVersion, + ProtocolError, + }, + indexmap::IndexMap, + sqlparser::{ + ast::{self, OrderByExpr, Select, Statement, TableFactor::Table, Value::Number}, + dialect::MySqlDialect, + parser::Parser, + }, + std::{collections::BTreeMap, ops::BitXor}, +}; + +#[cfg(feature = "verify")] +use crate::drive::verify::RootHash; + +#[cfg(feature = "server")] +pub use grovedb::{ + query_result_type::{QueryResultElements, QueryResultType}, + Element, Error as GroveError, TransactionArg, +}; + +#[cfg(feature = "server")] +use { + crate::{ + drive::{grove_operations::QueryType::StatefulQuery, Drive}, + error::Error::GroveDB, + fee::op::LowLevelDriveOperation, + }, + dpp::block::block_info::BlockInfo, +}; + +// Crate-local unconditional imports +use crate::{common::encode::encode_u64, drive::config::DriveConfig}; + +// Module declarations that are conditional on either "server" or "verify" features +#[cfg(any(feature = "server", feature = "verify"))] pub mod conditions; -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] mod defaults; -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] pub mod ordering; -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] mod single_document_drive_query; -#[cfg(feature = "full")] -mod test_index; -#[cfg(any(feature = "full", feature = "verify"))] -pub use single_document_drive_query::SingleDocumentDriveQuery; - -#[cfg(all(feature = "full", feature = "verify"))] -use crate::drive::verify::RootHash; -use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; -use dpp::data_contract::document_type::methods::DocumentTypeV0Methods; -use dpp::document::DocumentV0Getters; +// Module declarations exclusively for "server" feature +#[cfg(feature = "server")] +mod test_index; -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] /// Internal clauses struct #[derive(Clone, Debug, PartialEq, Default)] pub struct InternalClauses { @@ -150,7 +89,7 @@ pub struct InternalClauses { } impl InternalClauses { - #[cfg(any(feature = "full", feature = "verify"))] + #[cfg(any(feature = "server", feature = "verify"))] /// Returns true if the clause is a valid format. pub fn verify(&self) -> bool { // There can only be 1 primary key clause, or many other clauses @@ -168,13 +107,13 @@ impl InternalClauses { } } - #[cfg(any(feature = "full", feature = "verify"))] + #[cfg(any(feature = "server", feature = "verify"))] /// Returns true if the query clause is for primary keys. pub fn is_for_primary_key(&self) -> bool { self.primary_key_in_clause.is_some() || self.primary_key_equal_clause.is_some() } - #[cfg(any(feature = "full", feature = "verify"))] + #[cfg(any(feature = "server", feature = "verify"))] /// Returns true if self is empty. pub fn is_empty(&self) -> bool { self.in_clause.is_none() @@ -184,7 +123,7 @@ impl InternalClauses { && self.primary_key_equal_clause.is_none() } - #[cfg(any(feature = "full", feature = "verify"))] + #[cfg(any(feature = "server", feature = "verify"))] /// Extracts the `WhereClause`s and returns them as type `InternalClauses`. pub fn extract_from_clauses(all_where_clauses: Vec) -> Result { let primary_key_equal_clauses_array = all_where_clauses @@ -280,22 +219,24 @@ impl From for Vec { } } -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] /// The encoding returned by queries #[derive(Debug, PartialEq)] pub enum QueryResultEncoding { /// Cbor encoding + #[cfg(feature = "ciborium")] CborEncodedQueryResult, /// Platform base encoding PlatformEncodedQueryResult, } -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] impl QueryResultEncoding { /// Encode the value based on the encoding desired pub fn encode_value(&self, value: &Value) -> Result, Error> { let mut buffer = vec![]; match self { + #[cfg(feature = "ciborium")] QueryResultEncoding::CborEncodedQueryResult => { ciborium::ser::into_writer(value, &mut buffer) .map_err(|e| ProtocolError::EncodingError(e.to_string()))?; @@ -306,7 +247,7 @@ impl QueryResultEncoding { } } -#[cfg(any(feature = "full", feature = "verify"))] +#[cfg(any(feature = "server", feature = "verify"))] /// Drive query struct #[derive(Debug, PartialEq, Clone)] pub struct DriveQuery<'a> { @@ -333,7 +274,7 @@ pub struct DriveQuery<'a> { // TODO: expose this also // also figure out main export impl<'a> DriveQuery<'a> { - #[cfg(feature = "full")] + #[cfg(feature = "server")] /// Returns any item pub fn any_item_query(contract: &'a DataContract, document_type: DocumentTypeRef<'a>) -> Self { DriveQuery { @@ -349,7 +290,7 @@ impl<'a> DriveQuery<'a> { } } - #[cfg(any(feature = "full", feature = "verify"))] + #[cfg(any(feature = "server", feature = "verify"))] /// Returns true if the query clause if for primary keys. pub fn is_for_primary_key(&self) -> bool { self.internal_clauses.is_for_primary_key() @@ -366,7 +307,7 @@ impl<'a> DriveQuery<'a> { == "$id"))) } - #[cfg(any(feature = "full", feature = "verify"))] + #[cfg(feature = "cbor_query")] /// Converts a query CBOR to a `DriveQuery`. pub fn from_cbor( query_cbor: &[u8], @@ -382,7 +323,7 @@ impl<'a> DriveQuery<'a> { Self::from_value(query_document_value, contract, document_type, config) } - #[cfg(any(feature = "full", feature = "verify"))] + #[cfg(any(feature = "server", feature = "verify"))] /// Converts a query Value to a `DriveQuery`. pub fn from_value( query_value: Value, @@ -394,7 +335,7 @@ impl<'a> DriveQuery<'a> { Self::from_btree_map_value(query_document, contract, document_type, config) } - #[cfg(any(feature = "full", feature = "verify"))] + #[cfg(any(feature = "server", feature = "verify"))] /// Converts a query Value to a `DriveQuery`. pub fn from_btree_map_value( mut query_document: BTreeMap, @@ -559,7 +500,7 @@ impl<'a> DriveQuery<'a> { }) } - #[cfg(any(feature = "full", feature = "verify"))] + #[cfg(any(feature = "server", feature = "verify"))] /// Converts a query Value to a `DriveQuery`. pub fn from_decomposed_values( where_clause: Value, @@ -640,7 +581,7 @@ impl<'a> DriveQuery<'a> { }) } - #[cfg(any(feature = "full", feature = "verify"))] + #[cfg(any(feature = "server", feature = "verify"))] /// Converts a SQL expression to a `DriveQuery`. pub fn from_sql_expr( sql_string: &str, @@ -806,7 +747,7 @@ impl<'a> DriveQuery<'a> { /// /// FIXME: The data contract is only refered as ID, and document type as its name. /// This can change in the future to include full data contract and document type. - #[cfg(any(feature = "full", feature = "verify"))] + #[cfg(feature = "cbor_query")] pub fn to_cbor(&self) -> Result, Error> { let data: BTreeMap = self.into(); let cbor: BTreeMap = Value::convert_to_cbor_map(data)?; @@ -817,7 +758,7 @@ impl<'a> DriveQuery<'a> { Ok(output) } - #[cfg(any(feature = "full", feature = "verify"))] + #[cfg(any(feature = "server", feature = "verify"))] /// Operations to construct a path query. pub fn start_at_document_path_and_key(&self, starts_at: &[u8; 32]) -> (Vec>, Vec) { if self.document_type.documents_keep_history() { @@ -846,7 +787,7 @@ impl<'a> DriveQuery<'a> { } } - #[cfg(feature = "full")] + #[cfg(feature = "server")] /// Operations to construct a path query. pub fn construct_path_query_operations( &self, @@ -945,7 +886,7 @@ impl<'a> DriveQuery<'a> { } } - #[cfg(any(feature = "full", feature = "verify"))] + #[cfg(any(feature = "server", feature = "verify"))] /// Operations to construct a path query. pub fn construct_path_query( &self, @@ -976,7 +917,7 @@ impl<'a> DriveQuery<'a> { } } - #[cfg(any(feature = "full", feature = "verify"))] + #[cfg(any(feature = "server", feature = "verify"))] /// Returns a path query given a document type path and starting document. pub fn get_primary_key_path_query( &self, @@ -1144,7 +1085,7 @@ impl<'a> DriveQuery<'a> { } } - #[cfg(any(feature = "full", feature = "verify"))] + #[cfg(any(feature = "server", feature = "verify"))] /// Finds the best index for the query. pub fn find_best_index(&self, platform_version: &PlatformVersion) -> Result<&Index, Error> { let equal_fields = self @@ -1205,7 +1146,7 @@ impl<'a> DriveQuery<'a> { Ok(index) } - #[cfg(any(feature = "full", feature = "verify"))] + #[cfg(any(feature = "server", feature = "verify"))] /// Returns a `QueryItem` given a start key and query direction. pub fn query_item_for_starts_at_key(starts_at_key: Vec, left_to_right: bool) -> QueryItem { if left_to_right { @@ -1215,7 +1156,7 @@ impl<'a> DriveQuery<'a> { } } - #[cfg(any(feature = "full", feature = "verify"))] + #[cfg(any(feature = "server", feature = "verify"))] /// Returns a `Query` that either starts at or after the given document ID if given. fn inner_query_from_starts_at_for_id( starts_at_document: &Option<(Document, DocumentTypeRef, &IndexProperty, bool)>, @@ -1238,7 +1179,7 @@ impl<'a> DriveQuery<'a> { inner_query } - #[cfg(any(feature = "full", feature = "verify"))] + #[cfg(any(feature = "server", feature = "verify"))] /// Returns a `Query` that either starts at or after the given key. fn inner_query_starts_from_key( start_at_key: Vec, @@ -1261,7 +1202,7 @@ impl<'a> DriveQuery<'a> { inner_query } - #[cfg(any(feature = "full", feature = "verify"))] + #[cfg(any(feature = "server", feature = "verify"))] /// Returns a `Query` that either starts at or after the given document if given. // We are passing in starts_at_document 4 parameters // The document @@ -1307,7 +1248,7 @@ impl<'a> DriveQuery<'a> { Ok(inner_query) } - #[cfg(any(feature = "full", feature = "verify"))] + #[cfg(any(feature = "server", feature = "verify"))] /// Recursively queries as long as there are leftover index properties. fn recursive_insert_on_query( query: Option<&mut Query>, @@ -1445,7 +1386,7 @@ impl<'a> DriveQuery<'a> { } } - #[cfg(any(feature = "full", feature = "verify"))] + #[cfg(any(feature = "server", feature = "verify"))] /// Returns a path query for non-primary keys given a document type path and starting document. pub fn get_non_primary_key_path_query( &self, @@ -1653,7 +1594,7 @@ impl<'a> DriveQuery<'a> { )) } - #[cfg(feature = "full")] + #[cfg(feature = "server")] /// Executes a query with proof and returns the items and fee. pub fn execute_with_proof( self, @@ -1684,7 +1625,7 @@ impl<'a> DriveQuery<'a> { Ok((items, cost)) } - #[cfg(feature = "full")] + #[cfg(feature = "server")] /// Executes an internal query with proof and returns the items. pub(crate) fn execute_with_proof_internal( self, @@ -1709,7 +1650,7 @@ impl<'a> DriveQuery<'a> { ) } - #[cfg(all(feature = "full", feature = "verify"))] + #[cfg(all(feature = "server", feature = "verify"))] /// Executes a query with proof and returns the root hash, items, and fee. pub fn execute_with_proof_only_get_elements( self, @@ -1740,7 +1681,7 @@ impl<'a> DriveQuery<'a> { Ok((root_hash, items, cost)) } - #[cfg(all(feature = "full", feature = "verify"))] + #[cfg(all(feature = "server", feature = "verify"))] /// Executes an internal query with proof and returns the root hash and values. pub(crate) fn execute_with_proof_only_get_elements_internal( self, @@ -1767,32 +1708,7 @@ impl<'a> DriveQuery<'a> { self.verify_proof_keep_serialized(proof.as_slice(), platform_version) } - #[cfg(feature = "full")] - /// Executes a query with no proof and returns the items encoded in a map. - pub fn execute_serialized_as_result_no_proof( - &self, - drive: &Drive, - _block_info: Option, - query_result_encoding: QueryResultEncoding, - transaction: TransactionArg, - platform_version: &PlatformVersion, - ) -> Result, Error> { - let mut drive_operations = vec![]; - let (items, _) = self.execute_no_proof_internal( - drive, - QueryResultType::QueryKeyElementPairResultType, - transaction, - &mut drive_operations, - platform_version, - )?; - //todo: we could probably give better results depending on the query - let result = platform_value!({ - "documents": items.to_key_elements() - }); - query_result_encoding.encode_value(&result) - } - - #[cfg(feature = "full")] + #[cfg(feature = "server")] /// Executes a query with no proof and returns the items, skipped items, and fee. pub fn execute_raw_results_no_proof( &self, @@ -1823,7 +1739,7 @@ impl<'a> DriveQuery<'a> { Ok((items, skipped, cost)) } - #[cfg(feature = "full")] + #[cfg(feature = "server")] /// Executes an internal query with no proof and returns the values and skipped items. pub(crate) fn execute_raw_results_no_proof_internal( &self, @@ -1858,7 +1774,8 @@ impl<'a> DriveQuery<'a> { } } - #[cfg(feature = "full")] + #[cfg(feature = "server")] + #[allow(unused)] /// Executes an internal query with no proof and returns the values and skipped items. pub(crate) fn execute_no_proof_internal( &self, @@ -1959,7 +1876,7 @@ impl<'a> From<&DriveQuery<'a>> for BTreeMap { } } -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[cfg(test)] mod tests { diff --git a/packages/rs-drive/src/query/ordering.rs b/packages/rs-drive/src/query/ordering.rs index d671e909ed..b8a893f6d6 100644 --- a/packages/rs-drive/src/query/ordering.rs +++ b/packages/rs-drive/src/query/ordering.rs @@ -34,7 +34,8 @@ use dpp::platform_value::Value; use grovedb::Error; /// Order clause struct -#[derive(Clone, Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize)] +#[derive(Clone, Debug, PartialEq, Eq)] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub struct OrderClause { /// Field pub field: String, diff --git a/packages/rs-drive/src/query/test_index.rs b/packages/rs-drive/src/query/test_index.rs index 3c31e1b8ee..f486f0128f 100644 --- a/packages/rs-drive/src/query/test_index.rs +++ b/packages/rs-drive/src/query/test_index.rs @@ -1,4 +1,4 @@ -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[cfg(test)] mod tests { use dpp::data_contract::document_type::DocumentType; diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_credit_transfer/v0/mod.rs b/packages/rs-drive/src/state_transition_action/identity/identity_credit_transfer/v0/mod.rs index 9ee87543cb..887f05fb19 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_credit_transfer/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_credit_transfer/v0/mod.rs @@ -3,11 +3,9 @@ mod transformer; use dpp::fee::Credits; use dpp::platform_value::Identifier; use dpp::prelude::{IdentityNonce, UserFeeIncrease}; -use serde::{Deserialize, Serialize}; /// action v0 -#[derive(Default, Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] +#[derive(Default, Debug, Clone)] pub struct IdentityCreditTransferTransitionActionV0 { /// transfer amount pub transfer_amount: Credits, diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/mod.rs b/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/mod.rs index 0e1be9120c..7462445a2c 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/mod.rs @@ -4,11 +4,8 @@ use dpp::document::Document; use dpp::identifier::Identifier; use dpp::prelude::{IdentityNonce, UserFeeIncrease}; -use serde::{Deserialize, Serialize}; - /// action v0 -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] +#[derive(Debug, Clone)] pub struct IdentityCreditWithdrawalTransitionActionV0 { /// identity id pub identity_id: Identifier, diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_update/v0/mod.rs b/packages/rs-drive/src/state_transition_action/identity/identity_update/v0/mod.rs index b09c5052e1..0400d538ea 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_update/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_update/v0/mod.rs @@ -3,11 +3,9 @@ mod transformer; use dpp::identifier::Identifier; use dpp::identity::{IdentityPublicKey, KeyID}; use dpp::prelude::{IdentityNonce, Revision, UserFeeIncrease}; -use serde::{Deserialize, Serialize}; /// action v0 -#[derive(Default, Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] +#[derive(Default, Debug, Clone)] pub struct IdentityUpdateTransitionActionV0 { /// add public keys pub add_public_keys: Vec, diff --git a/packages/rs-drive/src/state_transition_action/system/partially_use_asset_lock_action/v0/mod.rs b/packages/rs-drive/src/state_transition_action/system/partially_use_asset_lock_action/v0/mod.rs index b1744c1a95..d6dac97468 100644 --- a/packages/rs-drive/src/state_transition_action/system/partially_use_asset_lock_action/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/system/partially_use_asset_lock_action/v0/mod.rs @@ -1,10 +1,8 @@ use dpp::fee::Credits; use dpp::platform_value::Bytes36; use dpp::prelude::UserFeeIncrease; -use serde::{Deserialize, Serialize}; mod transformer; -#[derive(Default, Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] +#[derive(Default, Debug, Clone)] pub struct PartiallyUseAssetLockActionV0 { /// asset lock outpoint pub asset_lock_outpoint: Bytes36, diff --git a/packages/rs-drive/tests/deterministic_root_hash.rs b/packages/rs-drive/tests/deterministic_root_hash.rs index 0eb4c39d5f..e038574573 100644 --- a/packages/rs-drive/tests/deterministic_root_hash.rs +++ b/packages/rs-drive/tests/deterministic_root_hash.rs @@ -31,36 +31,36 @@ use grovedb_path::SubtreePath; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use std::borrow::Cow; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use std::option::Option::None; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use dpp::document::Document; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use dpp::util::cbor_serializer; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use drive::common; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use grovedb::{Element, Transaction, TransactionArg}; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use rand::seq::SliceRandom; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use rand::{Rng, SeedableRng}; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use serde::{Deserialize, Serialize}; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use drive::drive::flags::StorageFlags; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use drive::drive::object_size_info::{DocumentAndContractInfo, OwnedDocumentInfo}; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use drive::drive::{Drive, RootTree}; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use dpp::block::block_info::BlockInfo; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::DataContract; @@ -71,7 +71,7 @@ use dpp::version::PlatformVersion; use drive::drive::object_size_info::DocumentInfo::DocumentRefInfo; use drive::tests::helpers::setup::setup_drive; -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// Contains the unique ID for a Dash identity. #[derive(Serialize, Deserialize)] #[serde(rename_all = "camelCase")] @@ -79,7 +79,7 @@ struct Records { dash_unique_identity_id: Vec, } -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// Info about a DPNS name. // In the real dpns label is required, we make it optional here for a test #[derive(Serialize, Deserialize)] @@ -97,7 +97,7 @@ struct Domain { subdomain_rules: bool, } -#[cfg(feature = "full")] +#[cfg(feature = "server")] impl Domain { /// Creates domains with random data for a given normalized parent domain name. fn random_domains_in_parent( @@ -130,7 +130,7 @@ impl Domain { } } -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// Creates and adds to a contract domains with random data. pub fn add_domains_to_contract( drive: &Drive, @@ -173,7 +173,7 @@ pub fn add_domains_to_contract( } } -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// Tests that the root hash is being calculated correctly after inserting empty subtrees into /// the root tree and the DPNS contract. fn test_root_hash_with_batches(drive: &Drive, db_transaction: &Transaction) { @@ -446,12 +446,12 @@ fn test_root_hash_with_batches(drive: &Drive, db_transaction: &Transaction) { .unwrap() .expect("should return app hash"); - let expected_app_hash = "6b8bbf1f069858abf57573f43a62e27d60e6139c4d23e1fe572fa3fe34057973"; + let expected_app_hash = "8880c628746348b09621b00589ccf856f75634388436a105473eb4506bb7e85e"; assert_eq!(hex::encode(app_hash), expected_app_hash); } -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// Runs `test_root_hash_with_batches` 10 times. #[test] fn test_deterministic_root_hash_with_batches() { diff --git a/packages/rs-drive/tests/query_tests.rs b/packages/rs-drive/tests/query_tests.rs index 5bf55d9786..41d95be2a6 100644 --- a/packages/rs-drive/tests/query_tests.rs +++ b/packages/rs-drive/tests/query_tests.rs @@ -31,62 +31,62 @@ //! use ciborium::cbor; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use dpp::data_contract::DataContractFactory; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use drive::common; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use drive::common::setup_contract; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use drive::drive::batch::GroveDbOpBatch; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use drive::drive::config::DriveConfig; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use drive::drive::flags::StorageFlags; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use drive::drive::object_size_info::{DocumentAndContractInfo, OwnedDocumentInfo}; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use drive::drive::Drive; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use drive::error::{query::QuerySyntaxError, Error}; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use drive::query::DriveQuery; -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[cfg(test)] use drive::tests::helpers::setup::setup_drive; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use grovedb::TransactionArg; use rand::random; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use rand::seq::SliceRandom; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use rand::{Rng, SeedableRng}; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use serde::{Deserialize, Serialize}; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use serde_json::json; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use std::borrow::Cow; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use std::collections::HashMap; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use std::fs::File; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use std::io::{self, BufRead}; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use std::option::Option::None; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use std::sync::Arc; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use dpp::document::Document; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use dpp::platform_value::Value; use dpp::platform_value::{platform_value, Bytes32, Identifier}; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use base64::Engine; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use dpp::block::block_info::BlockInfo; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::conversion::value::v0::DataContractValueConversionMethodsV0; @@ -98,21 +98,21 @@ use dpp::document::{DocumentV0Getters, DocumentV0Setters}; use dpp::identity::TimestampMillis; use dpp::platform_value; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use dpp::prelude::DataContract; use dpp::tests::json_document::json_document_to_contract; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use dpp::util::cbor_serializer; use dpp::version::PlatformVersion; use drive::drive::batch::grovedb_op_batch::GroveDbOpBatchV0Methods; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use drive::drive::contract::test_helpers::add_init_contracts_structure_operations; use drive::drive::document::query::QueryDocumentsOutcomeV0Methods; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use drive::drive::document::query::QuerySerializedDocumentsOutcome; use drive::drive::object_size_info::DocumentInfo; use drive::drive::object_size_info::DocumentInfo::DocumentRefInfo; @@ -120,7 +120,7 @@ use drive::drive::object_size_info::DocumentInfo::DocumentRefInfo; use drive::query::{WhereClause, WhereOperator}; use drive::tests::helpers::setup::setup_drive_with_initial_state_structure; -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[derive(Serialize, Deserialize)] #[serde(rename_all = "camelCase")] struct Person { @@ -134,7 +134,7 @@ struct Person { age: u8, } -#[cfg(feature = "full")] +#[cfg(feature = "server")] impl Person { fn random_people(count: u32, seed: u64) -> Vec { let first_names = @@ -161,7 +161,7 @@ impl Person { } } -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[derive(Serialize, Deserialize)] #[serde(rename_all = "camelCase")] struct PersonWithOptionalValues { @@ -175,7 +175,7 @@ struct PersonWithOptionalValues { age: u8, } -#[cfg(feature = "full")] +#[cfg(feature = "server")] impl PersonWithOptionalValues { fn random_people(count: u32, seed: u64) -> Vec { let first_names = @@ -215,7 +215,7 @@ impl PersonWithOptionalValues { } } -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// Inserts the test "family" contract and adds `count` documents containing randomly named people to it. pub fn setup_family_tests(count: u32, seed: u64) -> (Drive, DataContract) { let drive_config = DriveConfig::default(); @@ -284,7 +284,7 @@ pub fn setup_family_tests(count: u32, seed: u64) -> (Drive, DataContract) { (drive, contract) } -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// Same as `setup_family_tests` but with null values in the documents. pub fn setup_family_tests_with_nulls(count: u32, seed: u64) -> (Drive, DataContract) { let drive_config = DriveConfig::default(); @@ -352,7 +352,7 @@ pub fn setup_family_tests_with_nulls(count: u32, seed: u64) -> (Drive, DataContr (drive, contract) } -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// Inserts the test "family" contract and adds `count` documents containing randomly named people to it. pub fn setup_family_tests_only_first_name_index(count: u32, seed: u64) -> (Drive, DataContract) { let drive_config = DriveConfig::default(); @@ -421,21 +421,21 @@ pub fn setup_family_tests_only_first_name_index(count: u32, seed: u64) -> (Drive (drive, contract) } -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[derive(Serialize, Deserialize)] #[serde(rename_all = "camelCase")] struct Records { dash_unique_identity_id: Identifier, } -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[derive(Serialize, Deserialize)] #[serde(rename_all = "camelCase")] struct SubdomainRules { allow_subdomains: bool, } -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// DPNS domain info // In the real dpns, label is required. We make it optional here for a test. #[derive(Serialize, Deserialize)] @@ -453,7 +453,7 @@ struct Domain { subdomain_rules: SubdomainRules, } -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[test] fn test_serialization_and_deserialization() { let platform_version = PlatformVersion::latest(); @@ -486,7 +486,7 @@ fn test_serialization_and_deserialization() { } } -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[test] fn test_serialization_and_deserialization_with_null_values_should_fail_if_required() { let platform_version = PlatformVersion::latest(); @@ -532,7 +532,7 @@ fn test_serialization_and_deserialization_with_null_values_should_fail_if_requir .expect_err("expected to not be able to serialize domain document"); } -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[test] fn test_serialization_and_deserialization_with_null_values() { let platform_version = PlatformVersion::latest(); @@ -582,7 +582,7 @@ fn test_serialization_and_deserialization_with_null_values() { .expect("expected to deserialize domain document"); } -#[cfg(feature = "full")] +#[cfg(feature = "server")] impl Domain { /// Creates `count` random names as domain names for the given parent domain fn random_domains_in_parent( @@ -617,7 +617,7 @@ impl Domain { } } -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// Adds `count` random domain names to the given contract pub fn add_domains_to_contract( drive: &Drive, @@ -658,7 +658,7 @@ pub fn add_domains_to_contract( } } -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// Sets up and inserts random domain name data to the DPNS contract to test queries on. pub fn setup_dpns_tests_with_batches(count: u32, seed: u64) -> (Drive, DataContract) { let drive = setup_drive(Some(DriveConfig::default())); @@ -694,7 +694,7 @@ pub fn setup_dpns_tests_with_batches(count: u32, seed: u64) -> (Drive, DataContr (drive, contract) } -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// Sets up the References contract to test queries on. pub fn setup_references_tests(_count: u32, _seed: u64) -> (Drive, DataContract) { let drive = setup_drive(Some(DriveConfig::default())); @@ -729,7 +729,7 @@ pub fn setup_references_tests(_count: u32, _seed: u64) -> (Drive, DataContract) (drive, contract) } -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// Sets up and inserts random domain name data to the DPNS contract to test queries on. pub fn setup_dpns_tests_label_not_required(count: u32, seed: u64) -> (Drive, DataContract) { let drive = setup_drive(Some(DriveConfig::default())); @@ -765,7 +765,7 @@ pub fn setup_dpns_tests_label_not_required(count: u32, seed: u64) -> (Drive, Dat (drive, contract) } -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// Sets up the DPNS contract and inserts data from the given path to test queries on. pub fn setup_dpns_test_with_data(path: &str) -> (Drive, DataContract) { let drive = setup_drive(None); @@ -835,7 +835,7 @@ pub fn setup_dpns_test_with_data(path: &str) -> (Drive, DataContract) { (drive, contract) } -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[test] #[ignore] fn test_query_many() { @@ -882,7 +882,7 @@ fn test_query_many() { .expect("transaction should be committed"); } -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[test] fn test_reference_proof_single_index() { let (drive, contract) = setup_family_tests_only_first_name_index(1, 73509); @@ -930,7 +930,7 @@ fn test_reference_proof_single_index() { assert_eq!(results, proof_results); } -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[test] fn test_non_existence_reference_proof_single_index() { let (drive, contract) = setup_family_tests_only_first_name_index(0, 73509); @@ -978,7 +978,7 @@ fn test_non_existence_reference_proof_single_index() { assert_eq!(results, proof_results); } -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[test] fn test_family_basic_queries() { let (drive, contract) = setup_family_tests(10, 73509); @@ -993,8 +993,8 @@ fn test_family_basic_queries() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 66, 138, 16, 202, 64, 147, 26, 115, 247, 29, 235, 148, 80, 154, 249, 204, 148, 59, 248, 83, - 118, 140, 196, 38, 24, 59, 190, 48, 212, 130, 220, 215, + 163, 56, 30, 144, 201, 147, 186, 46, 12, 101, 223, 105, 199, 6, 242, 76, 137, 232, 95, 87, + 56, 167, 65, 114, 254, 221, 132, 182, 221, 89, 197, 125, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -2305,13 +2305,13 @@ fn test_family_basic_queries() { assert_eq!( root_hash.as_slice(), vec![ - 183, 156, 84, 144, 94, 45, 111, 118, 255, 200, 166, 248, 252, 127, 216, 105, 83, 124, - 126, 241, 19, 191, 32, 188, 112, 101, 249, 194, 188, 224, 188, 162 + 173, 209, 205, 148, 17, 96, 43, 47, 195, 124, 81, 242, 237, 221, 130, 189, 203, 158, + 19, 6, 217, 19, 231, 186, 70, 66, 1, 105, 7, 78, 245, 63, ], ); } -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[test] fn test_family_person_update() { let (drive, contract) = setup_family_tests(10, 73509); @@ -2436,7 +2436,7 @@ fn test_family_person_update() { assert_eq!(documents.len(), 1); } -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[test] fn test_family_starts_at_queries() { let (drive, contract) = setup_family_tests(10, 73509); @@ -2452,8 +2452,8 @@ fn test_family_starts_at_queries() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 66, 138, 16, 202, 64, 147, 26, 115, 247, 29, 235, 148, 80, 154, 249, 204, 148, 59, 248, 83, - 118, 140, 196, 38, 24, 59, 190, 48, 212, 130, 220, 215, + 163, 56, 30, 144, 201, 147, 186, 46, 12, 101, 223, 105, 199, 6, 242, 76, 137, 232, 95, 87, + 56, 167, 65, 114, 254, 221, 132, 182, 221, 89, 197, 125, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -2699,7 +2699,7 @@ fn test_family_starts_at_queries() { assert_eq!(results, proof_results); } -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[test] fn test_family_sql_query() { // These helpers confirm that sql statements produce the same drive query @@ -2878,7 +2878,7 @@ fn test_family_sql_query() { assert_eq!(query1, query2); } -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[test] fn test_family_with_nulls_query() { let (drive, contract) = setup_family_tests_with_nulls(10, 30004); @@ -2894,8 +2894,8 @@ fn test_family_with_nulls_query() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 120, 51, 207, 201, 227, 63, 44, 130, 175, 117, 220, 200, 56, 145, 137, 7, 203, 88, 178, 88, - 211, 192, 197, 201, 253, 79, 18, 50, 43, 156, 204, 153, + 181, 187, 251, 87, 13, 132, 222, 134, 83, 231, 5, 226, 79, 212, 220, 50, 123, 224, 81, 128, + 27, 149, 15, 194, 46, 48, 208, 157, 77, 175, 92, 246, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -3000,7 +3000,7 @@ fn test_family_with_nulls_query() { .expect("unable to commit transaction"); } -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[test] fn test_query_with_cached_contract() { let (drive, contract) = setup_family_tests(10, 73509); @@ -3017,8 +3017,8 @@ fn test_query_with_cached_contract() { // Make sure the state is deterministic let expected_app_hash = vec![ - 66, 138, 16, 202, 64, 147, 26, 115, 247, 29, 235, 148, 80, 154, 249, 204, 148, 59, 248, 83, - 118, 140, 196, 38, 24, 59, 190, 48, 212, 130, 220, 215, + 163, 56, 30, 144, 201, 147, 186, 46, 12, 101, 223, 105, 199, 6, 242, 76, 137, 232, 95, 87, + 56, 167, 65, 114, 254, 221, 132, 182, 221, 89, 197, 125, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -3073,7 +3073,7 @@ fn test_query_with_cached_contract() { assert_eq!(Arc::strong_count(&contract_ref), 2); } -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[test] fn test_dpns_query_contract_verification() { let (drive, contract) = setup_dpns_tests_with_batches(10, 11456); @@ -3150,7 +3150,7 @@ fn test_contract_keeps_history_fetch_and_verification() { ); } -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[test] fn test_dpns_query() { let (drive, contract) = setup_dpns_tests_with_batches(10, 11456); @@ -3166,8 +3166,8 @@ fn test_dpns_query() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 104, 127, 253, 216, 170, 92, 9, 250, 226, 44, 134, 38, 89, 10, 135, 4, 121, 65, 255, 136, - 149, 217, 217, 169, 108, 37, 241, 86, 57, 214, 131, 96, + 88, 19, 180, 210, 138, 212, 101, 137, 172, 158, 42, 123, 153, 162, 58, 30, 36, 3, 55, 17, + 211, 254, 39, 224, 94, 181, 43, 18, 198, 24, 197, 20, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -3589,7 +3589,7 @@ fn test_dpns_query() { assert_eq!(results, proof_results); } -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[test] fn test_dpns_insertion_no_aliases() { // using ascending order with rangeTo operators @@ -3645,7 +3645,7 @@ fn test_dpns_insertion_no_aliases() { assert_eq!(result.0, proof_results); } -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[test] fn test_dpns_insertion_with_aliases() { // using ascending order with rangeTo operators @@ -3701,7 +3701,7 @@ fn test_dpns_insertion_with_aliases() { assert_eq!(result.0, proof_results); } -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[test] fn test_dpns_query_start_at() { // The point of this test is to test the situation where we have a start at a certain value for the DPNS query. @@ -3718,8 +3718,8 @@ fn test_dpns_query_start_at() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 104, 127, 253, 216, 170, 92, 9, 250, 226, 44, 134, 38, 89, 10, 135, 4, 121, 65, 255, 136, - 149, 217, 217, 169, 108, 37, 241, 86, 57, 214, 131, 96, + 88, 19, 180, 210, 138, 212, 101, 137, 172, 158, 42, 123, 153, 162, 58, 30, 36, 3, 55, 17, + 211, 254, 39, 224, 94, 181, 43, 18, 198, 24, 197, 20, ]; assert_eq!(root_hash.as_slice(), expected_app_hash,); @@ -3795,7 +3795,7 @@ fn test_dpns_query_start_at() { assert_eq!(results, proof_results); } -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[test] fn test_dpns_query_start_after() { // The point of this test is to test the situation where we have a start at a certain value for the DPNS query. @@ -3812,8 +3812,8 @@ fn test_dpns_query_start_after() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 104, 127, 253, 216, 170, 92, 9, 250, 226, 44, 134, 38, 89, 10, 135, 4, 121, 65, 255, 136, - 149, 217, 217, 169, 108, 37, 241, 86, 57, 214, 131, 96, + 88, 19, 180, 210, 138, 212, 101, 137, 172, 158, 42, 123, 153, 162, 58, 30, 36, 3, 55, 17, + 211, 254, 39, 224, 94, 181, 43, 18, 198, 24, 197, 20, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -3889,7 +3889,7 @@ fn test_dpns_query_start_after() { assert_eq!(results, proof_results); } -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[test] fn test_dpns_query_start_at_desc() { // The point of this test is to test the situation where we have a start at a certain value for the DPNS query. @@ -3906,8 +3906,8 @@ fn test_dpns_query_start_at_desc() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 104, 127, 253, 216, 170, 92, 9, 250, 226, 44, 134, 38, 89, 10, 135, 4, 121, 65, 255, 136, - 149, 217, 217, 169, 108, 37, 241, 86, 57, 214, 131, 96, + 88, 19, 180, 210, 138, 212, 101, 137, 172, 158, 42, 123, 153, 162, 58, 30, 36, 3, 55, 17, + 211, 254, 39, 224, 94, 181, 43, 18, 198, 24, 197, 20, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -3983,7 +3983,7 @@ fn test_dpns_query_start_at_desc() { assert_eq!(results, proof_results); } -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[test] fn test_dpns_query_start_after_desc() { // The point of this test is to test the situation where we have a start at a certain value for the DPNS query. @@ -4000,8 +4000,8 @@ fn test_dpns_query_start_after_desc() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 104, 127, 253, 216, 170, 92, 9, 250, 226, 44, 134, 38, 89, 10, 135, 4, 121, 65, 255, 136, - 149, 217, 217, 169, 108, 37, 241, 86, 57, 214, 131, 96, + 88, 19, 180, 210, 138, 212, 101, 137, 172, 158, 42, 123, 153, 162, 58, 30, 36, 3, 55, 17, + 211, 254, 39, 224, 94, 181, 43, 18, 198, 24, 197, 20, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -4077,7 +4077,7 @@ fn test_dpns_query_start_after_desc() { assert_eq!(results, proof_results); } -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[test] fn test_dpns_query_start_at_with_null_id() { // The point of this test is to test the situation where we have a start at inside an index with a null value @@ -4192,8 +4192,8 @@ fn test_dpns_query_start_at_with_null_id() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 11, 19, 155, 212, 245, 198, 124, 117, 180, 86, 195, 68, 236, 38, 209, 25, 16, 186, 122, 12, - 9, 73, 22, 156, 179, 16, 190, 94, 19, 60, 210, 82, + 16, 77, 89, 81, 202, 42, 156, 156, 114, 212, 3, 107, 144, 120, 108, 241, 67, 12, 234, 138, + 245, 81, 48, 252, 72, 87, 16, 96, 118, 181, 12, 169, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -4275,7 +4275,7 @@ fn test_dpns_query_start_at_with_null_id() { assert_eq!(results, proof_results); } -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[test] fn test_dpns_query_start_after_with_null_id() { // The point of this test is to test the situation where we have a start at inside an index with a null value @@ -4393,8 +4393,8 @@ fn test_dpns_query_start_after_with_null_id() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 11, 19, 155, 212, 245, 198, 124, 117, 180, 86, 195, 68, 236, 38, 209, 25, 16, 186, 122, 12, - 9, 73, 22, 156, 179, 16, 190, 94, 19, 60, 210, 82, + 16, 77, 89, 81, 202, 42, 156, 156, 114, 212, 3, 107, 144, 120, 108, 241, 67, 12, 234, 138, + 245, 81, 48, 252, 72, 87, 16, 96, 118, 181, 12, 169, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -4480,7 +4480,7 @@ fn test_dpns_query_start_after_with_null_id() { assert_eq!(results, proof_results); } -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[test] fn test_dpns_query_start_after_with_null_id_desc() { // The point of this test is to test the situation where we have a start at inside an index with a null value @@ -4598,8 +4598,8 @@ fn test_dpns_query_start_after_with_null_id_desc() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 11, 19, 155, 212, 245, 198, 124, 117, 180, 86, 195, 68, 236, 38, 209, 25, 16, 186, 122, 12, - 9, 73, 22, 156, 179, 16, 190, 94, 19, 60, 210, 82, + 16, 77, 89, 81, 202, 42, 156, 156, 114, 212, 3, 107, 144, 120, 108, 241, 67, 12, 234, 138, + 245, 81, 48, 252, 72, 87, 16, 96, 118, 181, 12, 169, ]; assert_eq!(root_hash.as_slice(), expected_app_hash,); @@ -4794,7 +4794,7 @@ fn test_dpns_query_start_after_with_null_id_desc() { assert_eq!(results, proof_results); } -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[test] fn test_query_a_b_c_d_e_contract() { let drive: Drive = setup_drive_with_initial_state_structure(); @@ -4909,7 +4909,7 @@ fn test_query_a_b_c_d_e_contract() { .expect("should perform query"); } -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[test] fn test_query_documents_by_created_at() { let drive = setup_drive_with_initial_state_structure(); @@ -5056,7 +5056,7 @@ fn test_query_documents_by_created_at() { assert_eq!(query_result.documents().len(), 1); } -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[test] #[ignore] fn pwd() { diff --git a/packages/rs-drive/tests/query_tests_history.rs b/packages/rs-drive/tests/query_tests_history.rs index 4f863200f9..97e427d4e3 100644 --- a/packages/rs-drive/tests/query_tests_history.rs +++ b/packages/rs-drive/tests/query_tests_history.rs @@ -30,52 +30,52 @@ //! Query Tests History //! -#[cfg(feature = "full")] +#[cfg(feature = "server")] use std::borrow::Cow; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use std::collections::{BTreeMap, HashMap}; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use std::fmt::{Debug, Formatter}; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use std::option::Option::None; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use dpp::document::Document; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use dpp::util::cbor_serializer; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use rand::seq::SliceRandom; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use rand::{Rng, SeedableRng}; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use serde::{Deserialize, Serialize}; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use serde_json::json; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use drive::common; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use drive::tests::helpers::setup::setup_drive; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use drive::drive::batch::GroveDbOpBatch; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use drive::drive::config::DriveConfig; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use drive::drive::contract::test_helpers::add_init_contracts_structure_operations; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use drive::drive::flags::StorageFlags; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use drive::drive::object_size_info::{DocumentAndContractInfo, OwnedDocumentInfo}; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use drive::drive::Drive; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use drive::error::{query::QuerySyntaxError, Error}; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use drive::query::DriveQuery; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use dpp::block::block_info::BlockInfo; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::DataContract; @@ -86,10 +86,10 @@ use dpp::document::DocumentV0Getters; use dpp::tests::json_document::json_document_to_contract; use dpp::version::PlatformVersion; use drive::drive::batch::grovedb_op_batch::GroveDbOpBatchV0Methods; -#[cfg(feature = "full")] +#[cfg(feature = "server")] use drive::drive::object_size_info::DocumentInfo::DocumentRefInfo; -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[derive(Serialize, Deserialize)] #[serde(rename_all = "camelCase")] struct Person { @@ -104,7 +104,7 @@ struct Person { age: u8, } -#[cfg(feature = "full")] +#[cfg(feature = "server")] impl Debug for Person { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { f.debug_struct("Person") @@ -119,7 +119,7 @@ impl Debug for Person { } } -#[cfg(feature = "full")] +#[cfg(feature = "server")] impl Person { fn random_people_for_block_times( count: usize, @@ -180,7 +180,7 @@ impl Person { } } -#[cfg(feature = "full")] +#[cfg(feature = "server")] /// Sets up the `family-contract-with-history` contract to test queries on. pub fn setup( count: usize, @@ -267,14 +267,14 @@ pub fn setup( (drive, contract) } -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[test] fn test_setup() { let range_inserts = vec![0, 2]; setup(10, Some(range_inserts), 73509); } -#[cfg(feature = "full")] +#[cfg(feature = "server")] #[test] fn test_query_historical() { let (drive, contract) = setup(10, None, 73509); @@ -291,8 +291,8 @@ fn test_query_historical() { assert_eq!( root_hash.as_slice(), vec![ - 183, 18, 172, 146, 135, 191, 55, 236, 73, 61, 68, 217, 55, 134, 87, 148, 210, 99, 196, - 151, 94, 207, 218, 133, 70, 221, 228, 57, 197, 93, 12, 45, + 181, 185, 108, 50, 217, 141, 128, 232, 165, 226, 95, 0, 177, 127, 230, 52, 238, 131, + 107, 59, 237, 63, 184, 244, 2, 66, 114, 195, 97, 175, 252, 209, ] ); @@ -1655,8 +1655,8 @@ fn test_query_historical() { assert_eq!( root_hash.as_slice(), vec![ - 225, 224, 171, 0, 235, 104, 240, 209, 248, 74, 159, 9, 246, 185, 174, 114, 53, 133, - 235, 206, 36, 151, 226, 124, 108, 205, 152, 122, 6, 202, 177, 210 + 25, 175, 56, 55, 43, 121, 224, 243, 179, 106, 24, 41, 94, 74, 167, 144, 67, 125, 213, + 119, 247, 9, 237, 191, 50, 90, 22, 115, 131, 152, 246, 102 ] ); } diff --git a/packages/rs-platform-value/Cargo.toml b/packages/rs-platform-value/Cargo.toml index d5f9b6a223..0dedda70a3 100644 --- a/packages/rs-platform-value/Cargo.toml +++ b/packages/rs-platform-value/Cargo.toml @@ -9,15 +9,15 @@ license = "MIT" [dependencies] bincode = { version = "2.0.0-rc.3", features = ["serde"] } -ciborium = { git = "https://github.com/qrayven/ciborium", branch = "feat-ser-null-as-undefined" } -thiserror = "1.0.30" -bs58 = "0.4.0" -base64 = "0.13.0" +ciborium = { git = "https://github.com/qrayven/ciborium", branch = "feat-ser-null-as-undefined", optional = true } +thiserror = "1.0.58" +bs58 = "0.5.1" +base64 = "0.22.0" hex = "0.4.3" -serde = { version = "1.0.152", features = ["derive"] } -serde_json = { version = "1.0", features = ["preserve_order"] } +serde = { version = "1.0.197", features = ["derive"] } +serde_json = { version = "1.0", features = ["preserve_order"], optional = true } rand = { version = "0.8.4", features = ["small_rng"] } -treediff = "4.0.2" +treediff = "5.0.0" regex = "1.7.1" lazy_static = "1.4.0" platform-serialization = { path = "../rs-platform-serialization" } @@ -28,5 +28,7 @@ indexmap = "2.0.2" [features] default = ["std"] +cbor = ["ciborium"] +json = ["serde_json"] std = ["serde/std"] diff --git a/packages/rs-platform-value/src/btreemap_extensions/btreemap_field_replacement.rs b/packages/rs-platform-value/src/btreemap_extensions/btreemap_field_replacement.rs index 8424b50f7c..c4e1f2fc1d 100644 --- a/packages/rs-platform-value/src/btreemap_extensions/btreemap_field_replacement.rs +++ b/packages/rs-platform-value/src/btreemap_extensions/btreemap_field_replacement.rs @@ -2,6 +2,8 @@ use crate::value_map::ValueMapHelper; use crate::{Error, Value}; use std::collections::BTreeMap; +use base64::prelude::BASE64_STANDARD; +use base64::Engine; use std::iter::Peekable; use std::vec::IntoIter; @@ -56,7 +58,7 @@ impl ReplacementType { } ReplacementType::BinaryBytes => Ok(Value::Bytes(bytes)), ReplacementType::TextBase58 => Ok(Value::Text(bs58::encode(bytes).into_string())), - ReplacementType::TextBase64 => Ok(Value::Text(base64::encode(bytes))), + ReplacementType::TextBase64 => Ok(Value::Text(BASE64_STANDARD.encode(bytes))), } } @@ -64,7 +66,7 @@ impl ReplacementType { match self { ReplacementType::BinaryBytes => Ok(Value::Bytes20(bytes)), ReplacementType::TextBase58 => Ok(Value::Text(bs58::encode(bytes).into_string())), - ReplacementType::TextBase64 => Ok(Value::Text(base64::encode(bytes))), + ReplacementType::TextBase64 => Ok(Value::Text(BASE64_STANDARD.encode(bytes))), _ => Err(Error::ByteLengthNot36BytesError( "trying to replace 36 bytes into an identifier".to_string(), )), @@ -76,7 +78,7 @@ impl ReplacementType { ReplacementType::Identifier => Ok(Value::Identifier(bytes)), ReplacementType::BinaryBytes => Ok(Value::Bytes32(bytes)), ReplacementType::TextBase58 => Ok(Value::Text(bs58::encode(bytes).into_string())), - ReplacementType::TextBase64 => Ok(Value::Text(base64::encode(bytes))), + ReplacementType::TextBase64 => Ok(Value::Text(BASE64_STANDARD.encode(bytes))), } } @@ -84,7 +86,7 @@ impl ReplacementType { match self { ReplacementType::BinaryBytes => Ok(Value::Bytes36(bytes)), ReplacementType::TextBase58 => Ok(Value::Text(bs58::encode(bytes).into_string())), - ReplacementType::TextBase64 => Ok(Value::Text(base64::encode(bytes))), + ReplacementType::TextBase64 => Ok(Value::Text(BASE64_STANDARD.encode(bytes))), _ => Err(Error::ByteLengthNot36BytesError( "trying to replace 36 bytes into an identifier".to_string(), )), diff --git a/packages/rs-platform-value/src/btreemap_extensions/btreemap_path_extensions.rs b/packages/rs-platform-value/src/btreemap_extensions/btreemap_path_extensions.rs index 12890d38b6..e104e15e6c 100644 --- a/packages/rs-platform-value/src/btreemap_extensions/btreemap_path_extensions.rs +++ b/packages/rs-platform-value/src/btreemap_extensions/btreemap_path_extensions.rs @@ -1,9 +1,12 @@ +#[cfg(feature = "json")] use serde_json::Value as JsonValue; use std::borrow::Borrow; use std::convert::TryFrom; use std::iter::FromIterator; -use std::{collections::BTreeMap, convert::TryInto}; +use std::collections::BTreeMap; +#[cfg(feature = "json")] +use std::convert::TryInto; use crate::value_map::ValueMapHelper; use crate::{Error, Identifier, Value}; @@ -73,10 +76,12 @@ pub trait BTreeValueMapPathHelper { &'a self, path: &str, ) -> Result; + #[cfg(feature = "json")] fn get_optional_inner_str_json_value_map_at_path>( &self, path: &str, ) -> Result, Error>; + #[cfg(feature = "json")] fn get_inner_str_json_value_map_at_path>( &self, path: &str, @@ -418,6 +423,7 @@ where }) } + #[cfg(feature = "json")] fn get_optional_inner_str_json_value_map_at_path>( &self, path: &str, @@ -437,6 +443,7 @@ where .transpose() } + #[cfg(feature = "json")] fn get_inner_str_json_value_map_at_path>( &self, path: &str, diff --git a/packages/rs-platform-value/src/btreemap_extensions/mod.rs b/packages/rs-platform-value/src/btreemap_extensions/mod.rs index 8660ca9939..4ec94ce7a7 100644 --- a/packages/rs-platform-value/src/btreemap_extensions/mod.rs +++ b/packages/rs-platform-value/src/btreemap_extensions/mod.rs @@ -1,8 +1,11 @@ +#[cfg(feature = "json")] use serde_json::Value as JsonValue; use std::borrow::Borrow; +use std::collections::BTreeMap; use std::convert::TryFrom; +#[cfg(feature = "json")] +use std::convert::TryInto; use std::iter::FromIterator; -use std::{collections::BTreeMap, convert::TryInto}; use crate::{BinaryData, Error, Identifier, Value, ValueMap}; @@ -89,10 +92,12 @@ pub trait BTreeValueMapHelper { &'a self, key: &str, ) -> Result; + #[cfg(feature = "json")] fn get_optional_inner_str_json_value_map>( &self, key: &str, ) -> Result, Error>; + #[cfg(feature = "json")] fn get_inner_str_json_value_map>( &self, key: &str, @@ -356,6 +361,7 @@ where }) } + #[cfg(feature = "json")] fn get_optional_inner_str_json_value_map>( &self, key: &str, @@ -377,6 +383,7 @@ where .transpose() } + #[cfg(feature = "json")] fn get_inner_str_json_value_map>( &self, key: &str, diff --git a/packages/rs-platform-value/src/converter/mod.rs b/packages/rs-platform-value/src/converter/mod.rs index 02cf95f907..10734da70f 100644 --- a/packages/rs-platform-value/src/converter/mod.rs +++ b/packages/rs-platform-value/src/converter/mod.rs @@ -1,2 +1,4 @@ +#[cfg(feature = "cbor")] pub mod ciborium; +#[cfg(feature = "json")] pub mod serde_json; diff --git a/packages/rs-platform-value/src/converter/serde_json.rs b/packages/rs-platform-value/src/converter/serde_json.rs index f4be4635ab..43f90ea875 100644 --- a/packages/rs-platform-value/src/converter/serde_json.rs +++ b/packages/rs-platform-value/src/converter/serde_json.rs @@ -1,5 +1,7 @@ use crate::value_map::ValueMap; use crate::{Error, Value}; +use base64::prelude::BASE64_STANDARD; +use base64::Engine; use serde_json::{Map, Number, Value as JsonValue}; use std::collections::BTreeMap; @@ -310,10 +312,10 @@ impl TryInto for Value { Value::I16(i) => JsonValue::Number(i.into()), Value::U8(i) => JsonValue::Number(i.into()), Value::I8(i) => JsonValue::Number(i.into()), - Value::Bytes(bytes) => JsonValue::String(base64::encode(bytes.as_slice())), - Value::Bytes20(bytes) => JsonValue::String(base64::encode(bytes.as_slice())), - Value::Bytes32(bytes) => JsonValue::String(base64::encode(bytes.as_slice())), - Value::Bytes36(bytes) => JsonValue::String(base64::encode(bytes.as_slice())), + Value::Bytes(bytes) => JsonValue::String(BASE64_STANDARD.encode(bytes.as_slice())), + Value::Bytes20(bytes) => JsonValue::String(BASE64_STANDARD.encode(bytes.as_slice())), + Value::Bytes32(bytes) => JsonValue::String(BASE64_STANDARD.encode(bytes.as_slice())), + Value::Bytes36(bytes) => JsonValue::String(BASE64_STANDARD.encode(bytes.as_slice())), Value::Float(float) => JsonValue::Number(Number::from_f64(float).unwrap_or(0.into())), Value::Text(string) => JsonValue::String(string), Value::Bool(value) => JsonValue::Bool(value), diff --git a/packages/rs-platform-value/src/display.rs b/packages/rs-platform-value/src/display.rs index 973fcf0a4c..e7807fbdf6 100644 --- a/packages/rs-platform-value/src/display.rs +++ b/packages/rs-platform-value/src/display.rs @@ -1,4 +1,6 @@ use crate::Value; +use base64::prelude::BASE64_STANDARD; +use base64::Engine; use std::fmt::{Display, Formatter}; impl Display for Value { @@ -45,9 +47,15 @@ impl Value { Value::I16(i) => format!("{}", i), Value::U8(i) => format!("{}", i), Value::I8(i) => format!("{}", i), - Value::Bytes20(bytes20) => format!("bytes20 {}", base64::encode(bytes20.as_slice())), - Value::Bytes32(bytes32) => format!("bytes32 {}", base64::encode(bytes32.as_slice())), - Value::Bytes36(bytes36) => format!("bytes36 {}", base64::encode(bytes36.as_slice())), + Value::Bytes20(bytes20) => { + format!("bytes20 {}", BASE64_STANDARD.encode(bytes20.as_slice())) + } + Value::Bytes32(bytes32) => { + format!("bytes32 {}", BASE64_STANDARD.encode(bytes32.as_slice())) + } + Value::Bytes36(bytes36) => { + format!("bytes36 {}", BASE64_STANDARD.encode(bytes36.as_slice())) + } Value::Identifier(identifier) => format!( "identifier {}", bs58::encode(identifier.as_slice()).into_string() @@ -102,9 +110,15 @@ impl Value { Value::I16(i) => format!("(i16){}", i), Value::U8(i) => format!("(u8){}", i), Value::I8(i) => format!("(i8){}", i), - Value::Bytes20(bytes20) => format!("bytes20 {}", base64::encode(bytes20.as_slice())), - Value::Bytes32(bytes32) => format!("bytes32 {}", base64::encode(bytes32.as_slice())), - Value::Bytes36(bytes36) => format!("bytes36 {}", base64::encode(bytes36.as_slice())), + Value::Bytes20(bytes20) => { + format!("bytes20 {}", BASE64_STANDARD.encode(bytes20.as_slice())) + } + Value::Bytes32(bytes32) => { + format!("bytes32 {}", BASE64_STANDARD.encode(bytes32.as_slice())) + } + Value::Bytes36(bytes36) => { + format!("bytes36 {}", BASE64_STANDARD.encode(bytes36.as_slice())) + } Value::Identifier(identifier) => format!( "identifier {}", bs58::encode(identifier.as_slice()).into_string() diff --git a/packages/rs-platform-value/src/string_encoding.rs b/packages/rs-platform-value/src/string_encoding.rs index f411e2b375..c31d172839 100644 --- a/packages/rs-platform-value/src/string_encoding.rs +++ b/packages/rs-platform-value/src/string_encoding.rs @@ -1,5 +1,7 @@ use crate::Error; use base64; +use base64::prelude::BASE64_STANDARD; +use base64::Engine; use bs58; pub enum Encoding { @@ -13,10 +15,9 @@ pub fn decode(encoded_value: &str, encoding: Encoding) -> Result, Error> Encoding::Base58 => Ok(bs58::decode(encoded_value) .into_vec() .map_err(|e| Error::StringDecodingError(e.to_string()))?), - Encoding::Base64 => { - Ok(base64::decode(encoded_value) - .map_err(|e| Error::StringDecodingError(e.to_string()))?) - } + Encoding::Base64 => Ok(BASE64_STANDARD + .decode(encoded_value) + .map_err(|e| Error::StringDecodingError(e.to_string()))?), Encoding::Hex => Ok( hex::decode(encoded_value).map_err(|e| Error::StringDecodingError(e.to_string()))? ), @@ -26,7 +27,7 @@ pub fn decode(encoded_value: &str, encoding: Encoding) -> Result, Error> pub fn encode(value: &[u8], encoding: Encoding) -> String { match encoding { Encoding::Base58 => bs58::encode(value).into_string(), - Encoding::Base64 => base64::encode(value), + Encoding::Base64 => BASE64_STANDARD.encode(value), Encoding::Hex => hex::encode(value), } } diff --git a/packages/rs-platform-value/src/system_bytes.rs b/packages/rs-platform-value/src/system_bytes.rs index 0ffdd7d76c..d8c95ec345 100644 --- a/packages/rs-platform-value/src/system_bytes.rs +++ b/packages/rs-platform-value/src/system_bytes.rs @@ -1,5 +1,12 @@ +use base64::engine::{DecodePaddingMode, GeneralPurpose, GeneralPurposeConfig}; +use base64::{alphabet, Engine}; + use crate::{BinaryData, Bytes20, Bytes32, Bytes36, Error, Identifier, Value}; +pub const PADDING_INDIFFERENT: GeneralPurposeConfig = GeneralPurposeConfig::new() + .with_encode_padding(false) + .with_decode_padding_mode(DecodePaddingMode::Indifferent); + impl Value { /// If the `Value` is a `Bytes`, a `Text` using base 58 or Vector of `U8`, returns the /// associated `Vec` data as `Ok`. @@ -117,9 +124,9 @@ impl Value { /// ``` pub fn into_binary_bytes(self) -> Result, Error> { match self { - Value::Text(text) => base64::decode(text).map_err(|_| { + Value::Text(text) => GeneralPurpose::new(&alphabet::STANDARD, PADDING_INDIFFERENT).decode(text).map_err(|e| { Error::StructureError( - "value was a string, but could not be decoded from base 64".to_string(), + format!("value was a string, but could not be decoded from base 64 into binary bytes, error: {}", e), ) }), Value::Array(array) => array @@ -189,11 +196,14 @@ impl Value { /// ``` pub fn to_binary_bytes(&self) -> Result, Error> { match self { - Value::Text(text) => base64::decode(text).map_err(|_| { - Error::StructureError( - "value was a string, but could not be decoded from base 64".to_string(), - ) - }), + Value::Text(text) => GeneralPurpose::new(&alphabet::STANDARD, PADDING_INDIFFERENT) + .decode(text) + .map_err(|e| { + Error::StructureError(format!( + "value was a string, but could not be decoded from base 64, error: {}", + e + )) + }), Value::Array(array) => array .iter() .map(|byte| match byte { @@ -344,7 +354,7 @@ impl Value { /// assert_eq!(value.into_bytes_20(), Err(Error::ByteLengthNot20BytesError("buffer was not 20 bytes long".to_string()))); /// /// let value = Value::Text("a811Ii".to_string()); - /// assert_eq!(value.into_bytes_20(), Err(Error::StructureError("value was a string, but could not be decoded from base 64".to_string()))); + /// assert_eq!(value.into_bytes_20(), Err(Error::StructureError("value was a string, but could not be decoded from base 64 into bytes 20, error: Invalid last symbol 105, offset 5.".to_string()))); /// /// let value = Value::Array(vec![Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104),Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104)]); /// assert_eq!(value.into_bytes_20(), Ok(Bytes20([104, 101, 108, 104, 101, 108, 104, 101, 108, 104, 104, 101, 108, 104, 101, 108, 104, 101, 108, 104]))); @@ -354,9 +364,9 @@ impl Value { /// ``` pub fn into_bytes_20(self) -> Result { match self { - Value::Text(text) => Bytes20::from_vec(base64::decode(text).map_err(|_| { + Value::Text(text) => Bytes20::from_vec(GeneralPurpose::new(&alphabet::STANDARD, PADDING_INDIFFERENT).decode(text).map_err(|e| { Error::StructureError( - "value was a string, but could not be decoded from base 64".to_string(), + format!("value was a string, but could not be decoded from base 64 into bytes 20, error: {}", e), ) })?), Value::Array(array) => Bytes20::from_vec( @@ -392,7 +402,7 @@ impl Value { /// assert_eq!(value.to_bytes_20(), Err(Error::ByteLengthNot20BytesError("buffer was not 20 bytes long".to_string()))); /// /// let value = Value::Text("a811Ii".to_string()); - /// assert_eq!(value.to_bytes_20(), Err(Error::StructureError("value was a string, but could not be decoded from base 64".to_string()))); + /// assert_eq!(value.to_bytes_20(), Err(Error::StructureError("value was a string, but could not be decoded from base 64 to bytes 20, error: Invalid last symbol 105, offset 5.".to_string()))); /// /// let value = Value::Array(vec![Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104),Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104)]); /// assert_eq!(value.to_bytes_20(), Ok(Bytes20([104, 101, 108, 104, 101, 108, 104, 101, 108, 104, 104, 101, 108, 104, 101, 108, 104, 101, 108, 104]))); @@ -402,9 +412,9 @@ impl Value { /// ``` pub fn to_bytes_20(&self) -> Result { match self { - Value::Text(text) => Bytes20::from_vec(base64::decode(text).map_err(|_| { + Value::Text(text) => Bytes20::from_vec(GeneralPurpose::new(&alphabet::STANDARD, PADDING_INDIFFERENT).decode(text).map_err(|e| { Error::StructureError( - "value was a string, but could not be decoded from base 64".to_string(), + format!("value was a string, but could not be decoded from base 64 to bytes 20, error: {}", e), ) })?), Value::Array(array) => Bytes20::from_vec( @@ -440,7 +450,7 @@ impl Value { /// assert_eq!(value.into_bytes_32(), Err(Error::ByteLengthNot32BytesError("buffer was not 32 bytes long".to_string()))); /// /// let value = Value::Text("a811Ii".to_string()); - /// assert_eq!(value.into_bytes_32(), Err(Error::StructureError("value was a string, but could not be decoded from base 64".to_string()))); + /// assert_eq!(value.into_bytes_32(), Err(Error::StructureError("value was a string, but could not be decoded from base 64 into bytes 32, error: Invalid last symbol 105, offset 5.".to_string()))); /// /// let value = Value::Array(vec![Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104), Value::U8(101)]); /// assert_eq!(value.into_bytes_32(), Ok(Bytes32([104, 101, 108, 104, 101, 108, 104, 101, 108, 104, 101, 108, 104, 101, 108, 104, 101, 108, 104, 101, 108, 104, 101, 108, 104, 101, 108, 104, 101, 108, 104, 101]))); @@ -453,9 +463,9 @@ impl Value { /// ``` pub fn into_bytes_32(self) -> Result { match self { - Value::Text(text) => Bytes32::from_vec(base64::decode(text).map_err(|_| { + Value::Text(text) => Bytes32::from_vec(GeneralPurpose::new(&alphabet::STANDARD, PADDING_INDIFFERENT).decode(text).map_err(|e| { Error::StructureError( - "value was a string, but could not be decoded from base 64".to_string(), + format!("value was a string, but could not be decoded from base 64 into bytes 32, error: {}", e), ) })?), Value::Array(array) => Bytes32::from_vec( @@ -491,7 +501,7 @@ impl Value { /// assert_eq!(value.to_bytes_32(), Err(Error::ByteLengthNot32BytesError("buffer was not 32 bytes long".to_string()))); /// /// let value = Value::Text("a811Ii".to_string()); - /// assert_eq!(value.to_bytes_32(), Err(Error::StructureError("value was a string, but could not be decoded from base 64".to_string()))); + /// assert_eq!(value.to_bytes_32(), Err(Error::StructureError("value was a string, but could not be decoded from base 64 to bytes 32, error: Invalid last symbol 105, offset 5.".to_string()))); /// /// let value = Value::Array(vec![Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104), Value::U8(101)]); /// assert_eq!(value.to_bytes_32(), Ok(Bytes32::new([104, 101, 108, 104, 101, 108, 104, 101, 108, 104, 101, 108, 104, 101, 108, 104, 101, 108, 104, 101, 108, 104, 101, 108, 104, 101, 108, 104, 101, 108, 104, 101]))); @@ -504,9 +514,9 @@ impl Value { /// ``` pub fn to_bytes_32(&self) -> Result { match self { - Value::Text(text) => Bytes32::from_vec(base64::decode(text).map_err(|_| { + Value::Text(text) => Bytes32::from_vec(GeneralPurpose::new(&alphabet::STANDARD, PADDING_INDIFFERENT).decode(text).map_err(|e| { Error::StructureError( - "value was a string, but could not be decoded from base 64".to_string(), + format!("value was a string, but could not be decoded from base 64 to bytes 32, error: {}", e), ) })?), Value::Array(array) => Bytes32::from_vec( @@ -543,7 +553,7 @@ impl Value { /// assert_eq!(value.into_bytes_36(), Err(Error::ByteLengthNot36BytesError("buffer was not 36 bytes long".to_string()))); /// /// let value = Value::Text("a811Ii".to_string()); - /// assert_eq!(value.into_bytes_36(), Err(Error::StructureError("value was a string, but could not be decoded from base 64".to_string()))); + /// assert_eq!(value.into_bytes_36(), Err(Error::StructureError("value was a string, but could not be decoded from base 64 into bytes 36, error: Invalid last symbol 105, offset 5.".to_string()))); /// /// let value = Value::Array(vec![Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104), Value::U8(101), Value::U8(101), Value::U8(101), Value::U8(101), Value::U8(101)]); /// assert_eq!(value.into_bytes_36(), Ok(Bytes36([104, 101, 108, 104, 101, 108, 104, 101, 108, 104, 101, 108, 104, 101, 108, 104, 101, 108, 104, 101, 108, 104, 101, 108, 104, 101, 108, 104, 101, 108, 104, 101, 101, 101, 101, 101]))); @@ -553,9 +563,9 @@ impl Value { /// ``` pub fn into_bytes_36(self) -> Result { match self { - Value::Text(text) => Bytes36::from_vec(base64::decode(text).map_err(|_| { + Value::Text(text) => Bytes36::from_vec(GeneralPurpose::new(&alphabet::STANDARD, PADDING_INDIFFERENT).decode(text).map_err(|e| { Error::StructureError( - "value was a string, but could not be decoded from base 64".to_string(), + format!("value was a string, but could not be decoded from base 64 into bytes 36, error: {}", e), ) })?), Value::Array(array) => Bytes36::from_vec( @@ -591,7 +601,7 @@ impl Value { /// assert_eq!(value.to_bytes_36(), Err(Error::ByteLengthNot36BytesError("buffer was not 36 bytes long".to_string()))); /// /// let value = Value::Text("a811Ii".to_string()); - /// assert_eq!(value.to_bytes_36(), Err(Error::StructureError("value was a string, but could not be decoded from base 64".to_string()))); + /// assert_eq!(value.to_bytes_36(), Err(Error::StructureError("value was a string, but could not be decoded from base 64 to bytes 36, error: Invalid last symbol 105, offset 5.".to_string()))); /// /// let value = Value::Array(vec![Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104), Value::U8(101), Value::U8(108),Value::U8(104), Value::U8(101), Value::U8(101), Value::U8(101), Value::U8(101), Value::U8(101)]); /// assert_eq!(value.to_bytes_36(), Ok(Bytes36([104, 101, 108, 104, 101, 108, 104, 101, 108, 104, 101, 108, 104, 101, 108, 104, 101, 108, 104, 101, 108, 104, 101, 108, 104, 101, 108, 104, 101, 108, 104, 101, 101, 101, 101, 101]))); @@ -601,9 +611,9 @@ impl Value { /// ``` pub fn to_bytes_36(&self) -> Result { match self { - Value::Text(text) => Bytes36::from_vec(base64::decode(text).map_err(|_| { + Value::Text(text) => Bytes36::from_vec(GeneralPurpose::new(&alphabet::STANDARD, PADDING_INDIFFERENT).decode(text).map_err(|e| { Error::StructureError( - "value was a string, but could not be decoded from base 64".to_string(), + format!("value was a string, but could not be decoded from base 64 to bytes 36, error: {}", e), ) })?), Value::Array(array) => Bytes36::from_vec( diff --git a/packages/rs-platform-value/src/types/binary_data.rs b/packages/rs-platform-value/src/types/binary_data.rs index cd42cd415c..8eeb0fdc38 100644 --- a/packages/rs-platform-value/src/types/binary_data.rs +++ b/packages/rs-platform-value/src/types/binary_data.rs @@ -1,6 +1,8 @@ use crate::string_encoding::Encoding; use crate::types::encoding_string_to_encoding; use crate::{string_encoding, Error, Value}; +use base64::prelude::BASE64_STANDARD; +use base64::Engine; use bincode::{Decode, Encode}; use serde::de::Visitor; use serde::{Deserialize, Serialize}; @@ -15,7 +17,7 @@ impl Serialize for BinaryData { S: serde::Serializer, { if serializer.is_human_readable() { - serializer.serialize_str(&base64::encode(self.0.as_slice())) + serializer.serialize_str(&BASE64_STANDARD.encode(self.0.as_slice())) } else { serializer.serialize_bytes(&self.0) } @@ -41,7 +43,9 @@ impl<'de> Deserialize<'de> for BinaryData { where E: serde::de::Error, { - let bytes = base64::decode(v).map_err(|e| E::custom(format!("{}", e)))?; + let bytes = BASE64_STANDARD + .decode(v) + .map_err(|e| E::custom(format!("{}", e)))?; Ok(BinaryData(bytes)) } } diff --git a/packages/rs-platform-value/src/types/bytes_20.rs b/packages/rs-platform-value/src/types/bytes_20.rs index 16c9af731d..abb156173a 100644 --- a/packages/rs-platform-value/src/types/bytes_20.rs +++ b/packages/rs-platform-value/src/types/bytes_20.rs @@ -1,6 +1,8 @@ use crate::string_encoding::Encoding; use crate::types::encoding_string_to_encoding; use crate::{string_encoding, Error, Value}; +use base64::prelude::BASE64_STANDARD; +use base64::Engine; use bincode::{Decode, Encode}; use serde::de::Visitor; use serde::{Deserialize, Serialize}; @@ -75,7 +77,7 @@ impl Serialize for Bytes20 { S: serde::Serializer, { if serializer.is_human_readable() { - serializer.serialize_str(&base64::encode(self.0)) + serializer.serialize_str(&BASE64_STANDARD.encode(self.0)) } else { serializer.serialize_bytes(&self.0) } @@ -101,7 +103,9 @@ impl<'de> Deserialize<'de> for Bytes20 { where E: serde::de::Error, { - let bytes = base64::decode(v).map_err(|e| E::custom(format!("{}", e)))?; + let bytes = BASE64_STANDARD + .decode(v) + .map_err(|e| E::custom(format!("{}", e)))?; if bytes.len() != 20 { return Err(E::invalid_length(bytes.len(), &self)); } diff --git a/packages/rs-platform-value/src/types/bytes_32.rs b/packages/rs-platform-value/src/types/bytes_32.rs index 077e98ef67..c8139157df 100644 --- a/packages/rs-platform-value/src/types/bytes_32.rs +++ b/packages/rs-platform-value/src/types/bytes_32.rs @@ -1,6 +1,8 @@ use crate::string_encoding::Encoding; use crate::types::encoding_string_to_encoding; use crate::{string_encoding, Error, Value}; +use base64::prelude::BASE64_STANDARD; +use base64::Engine; use bincode::{Decode, Encode}; use rand::rngs::StdRng; use rand::Rng; @@ -77,7 +79,7 @@ impl Serialize for Bytes32 { S: serde::Serializer, { if serializer.is_human_readable() { - serializer.serialize_str(&base64::encode(self.0)) + serializer.serialize_str(&BASE64_STANDARD.encode(self.0)) } else { serializer.serialize_bytes(&self.0) } @@ -103,7 +105,9 @@ impl<'de> Deserialize<'de> for Bytes32 { where E: serde::de::Error, { - let bytes = base64::decode(v).map_err(|e| E::custom(format!("{}", e)))?; + let bytes = BASE64_STANDARD + .decode(v) + .map_err(|e| E::custom(format!("{}", e)))?; if bytes.len() != 32 { return Err(E::invalid_length(bytes.len(), &self)); } diff --git a/packages/rs-platform-value/src/types/bytes_36.rs b/packages/rs-platform-value/src/types/bytes_36.rs index 57cdc91fe1..abf220bec2 100644 --- a/packages/rs-platform-value/src/types/bytes_36.rs +++ b/packages/rs-platform-value/src/types/bytes_36.rs @@ -1,6 +1,8 @@ use crate::string_encoding::Encoding; use crate::types::encoding_string_to_encoding; use crate::{string_encoding, Error, Value}; +use base64::prelude::BASE64_STANDARD; +use base64::Engine; use bincode::{Decode, Encode}; use serde::de::Visitor; use serde::{Deserialize, Serialize}; @@ -71,7 +73,7 @@ impl Serialize for Bytes36 { S: serde::Serializer, { if serializer.is_human_readable() { - serializer.serialize_str(&base64::encode(self.0)) + serializer.serialize_str(&BASE64_STANDARD.encode(self.0)) } else { serializer.serialize_bytes(&self.0) } @@ -97,7 +99,9 @@ impl<'de> Deserialize<'de> for Bytes36 { where E: serde::de::Error, { - let bytes = base64::decode(v).map_err(|e| E::custom(format!("{}", e)))?; + let bytes = BASE64_STANDARD + .decode(v) + .map_err(|e| E::custom(format!("{}", e)))?; if bytes.len() != 36 { return Err(E::invalid_length(bytes.len(), &self)); } diff --git a/packages/rs-platform-value/src/types/identifier.rs b/packages/rs-platform-value/src/types/identifier.rs index da1ad105ec..4529310c84 100644 --- a/packages/rs-platform-value/src/types/identifier.rs +++ b/packages/rs-platform-value/src/types/identifier.rs @@ -8,6 +8,7 @@ use std::fmt; use serde::de::Visitor; use serde::{Deserialize, Serialize}; +#[cfg(feature = "json")] use serde_json::Value as JsonValue; use crate::string_encoding::Encoding; @@ -191,6 +192,7 @@ impl Identifier { Ok(Identifier::new(vec.try_into().unwrap())) } + #[cfg(feature = "json")] pub fn to_json_value_vec(&self) -> Vec { self.to_buffer() .iter() diff --git a/packages/rs-platform-value/src/value_serialization/de.rs b/packages/rs-platform-value/src/value_serialization/de.rs index 2f064926bd..9028fa8de5 100644 --- a/packages/rs-platform-value/src/value_serialization/de.rs +++ b/packages/rs-platform-value/src/value_serialization/de.rs @@ -1,3 +1,5 @@ +use base64::prelude::BASE64_STANDARD; +use base64::Engine; use core::{fmt, slice}; use std::iter::Peekable; @@ -177,7 +179,7 @@ impl<'de> de::Deserializer<'de> for Deserializer { match self.0 { Value::Bytes(x) => { if human_readable { - visitor.visit_str(base64::encode(x).as_str()) + visitor.visit_str(BASE64_STANDARD.encode(x).as_str()) } else { visitor.visit_bytes(&x) } @@ -200,21 +202,21 @@ impl<'de> de::Deserializer<'de> for Deserializer { Value::I8(x) => visitor.visit_i8(x), Value::Bytes20(x) => { if human_readable { - visitor.visit_str(base64::encode(x).as_str()) + visitor.visit_str(BASE64_STANDARD.encode(x).as_str()) } else { visitor.visit_bytes(&x) } } Value::Bytes32(x) => { if human_readable { - visitor.visit_str(base64::encode(x).as_str()) + visitor.visit_str(BASE64_STANDARD.encode(x).as_str()) } else { visitor.visit_bytes(&x) } } Value::Bytes36(x) => { if human_readable { - visitor.visit_str(base64::encode(x).as_str()) + visitor.visit_str(BASE64_STANDARD.encode(x).as_str()) } else { visitor.visit_bytes(&x) } diff --git a/packages/rs-platform-value/src/value_serialization/ser.rs b/packages/rs-platform-value/src/value_serialization/ser.rs index 00d022223c..525d60300c 100644 --- a/packages/rs-platform-value/src/value_serialization/ser.rs +++ b/packages/rs-platform-value/src/value_serialization/ser.rs @@ -1,6 +1,8 @@ use crate::error::Error; use crate::value_map::ValueMap; use crate::{to_value, Value}; +use base64::prelude::BASE64_STANDARD; +use base64::Engine; use serde::ser::{Impossible, Serialize}; use std::fmt::Display; @@ -45,28 +47,28 @@ impl Serialize for Value { Value::I8(i) => serializer.serialize_i8(*i), Value::Bytes(bytes) => { if serializer.is_human_readable() { - serializer.serialize_str(base64::encode(bytes).as_str()) + serializer.serialize_str(BASE64_STANDARD.encode(bytes).as_str()) } else { serializer.serialize_bytes(bytes) } } Value::Bytes20(bytes) => { if serializer.is_human_readable() { - serializer.serialize_str(base64::encode(bytes).as_str()) + serializer.serialize_str(BASE64_STANDARD.encode(bytes).as_str()) } else { serializer.serialize_bytes(bytes) } } Value::Bytes32(bytes) => { if serializer.is_human_readable() { - serializer.serialize_str(base64::encode(bytes).as_str()) + serializer.serialize_str(BASE64_STANDARD.encode(bytes).as_str()) } else { serializer.serialize_bytes(bytes) } } Value::Bytes36(bytes) => { if serializer.is_human_readable() { - serializer.serialize_str(base64::encode(bytes).as_str()) + serializer.serialize_str(BASE64_STANDARD.encode(bytes).as_str()) } else { serializer.serialize_bytes(bytes) } diff --git a/packages/rs-sdk/Cargo.toml b/packages/rs-sdk/Cargo.toml index 4002dcc724..3ba71da29f 100644 --- a/packages/rs-sdk/Cargo.toml +++ b/packages/rs-sdk/Cargo.toml @@ -4,51 +4,54 @@ version = "1.0.0-dev.10" edition = "2021" [dependencies] -dpp = { path = "../rs-dpp", features = ["all_features"] } -dapi-grpc = { path = "../dapi-grpc" } +dpp = { path = "../rs-dpp", default-features = false, features = ["rs-sdk-features"] } +dapi-grpc = { path = "../dapi-grpc", default-features = false, features = ["client"] } rs-dapi-client = { path = "../rs-dapi-client", default-features = false } drive = { path = "../rs-drive", default-features = false, features = [ "verify", -] } + "serde", +]} drive-proof-verifier = { path = "../rs-drive-proof-verifier" } dapi-grpc-macros = { path = "../rs-dapi-grpc-macros" } bincode = { version = "2.0.0-rc.3", features = ["serde"], optional = true } -thiserror = "1.0.47" -tokio = { version = "1.32.0", features = ["macros"] } -tokio-util = { version = "0.7.8" } -async-trait = { version = "0.1.73" } -http = { version = "0.2.9" } +thiserror = "1.0.58" +tokio = { version = "1.36.0", features = ["macros"] } +tokio-util = { version = "0.7.10"} +async-trait = { version = "0.1.79" } +http = { version = "0.2.12" } ciborium = { git = "https://github.com/qrayven/ciborium", branch = "feat-ser-null-as-undefined" } -serde = { version = "1.0.152", default-features = false, features = ["rc"] } +serde = { version = "1.0.197", default-features = false, features = ["rc"] } serde_json = { version = "1.0", features = ["preserve_order"], optional = true } -tracing = { version = "0.1.37" } +tracing = { version = "0.1.40" } hex = { version = "0.4.3", optional = true } dotenvy = { version = "0.15.7", optional = true } envy = { version = "0.4.2", optional = true } -futures = { version = "0.3.28" } -derive_more = { version = "0.99.16" } +futures = { version = "0.3.30" } +derive_more = { version = "0.99.17" } # dashcore-rpc is only needed for core rpc; TODO remove once we have correct core rpc impl dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.2" } -lru = { version = "0.12.2", optional = true } +lru = { version = "0.12.3", optional = true } bip37-bloom-filter = { git = "https://github.com/dashpay/rs-bip37-bloom-filter", branch = "develop" } [dev-dependencies] +tokio = { version = "1.36.0", features = ["macros", "rt-multi-thread"] } rs-dapi-client = { path = "../rs-dapi-client", features = ["mocks"] } -base64 = { version = "0.21.0" } -tracing-subscriber = { version = "0.3.16" } +base64 = { version = "0.22.0" } +tracing-subscriber = { version = "0.3.18", features = ["env-filter"] } dpp = { path = "../rs-dpp", features = [ "client", "validation", "random-documents", ] } data-contracts = { path = "../data-contracts" } -tokio-test = { version = "0.4.3" } -clap = { version = "4.4.18", features = ["derive"] } +tokio-test = { version = "0.4.4" } +clap = { version = "4.5.4", features = ["derive"] } sanitize-filename = { version = "0.5.0" } [features] default = ["mocks", "offline-testing"] + mocks = [ "dep:serde_json", "rs-dapi-client/mocks", @@ -87,6 +90,10 @@ network-testing = ["mocks"] # so that they can be used later for `offline-testing`. generate-test-vectors = ["network-testing"] +# Have the system data contracts inside the dpp crate + +system-data-contracts = ["dpp/data-contracts"] + [[example]] diff --git a/packages/rs-sdk/scripts/generate_test_vectors.sh b/packages/rs-sdk/scripts/generate_test_vectors.sh index 240b1a8e4a..5510bfe964 100755 --- a/packages/rs-sdk/scripts/generate_test_vectors.sh +++ b/packages/rs-sdk/scripts/generate_test_vectors.sh @@ -20,10 +20,6 @@ CARGO_DIR="$(realpath "$(dirname "$0")/..")" pushd "$CARGO_DIR" -if [ -z "$1" ]; then - rm -f "${CARGO_DIR}"/tests/vectors/* -fi - cargo test -p rs-sdk \ --no-default-features \ --features generate-test-vectors \ diff --git a/packages/rs-sdk/src/error.rs b/packages/rs-sdk/src/error.rs index 96f8e0db92..2e9ca0b591 100644 --- a/packages/rs-sdk/src/error.rs +++ b/packages/rs-sdk/src/error.rs @@ -2,7 +2,6 @@ use std::fmt::Debug; use std::time::Duration; -use dpp::bls_signatures::BlsError; use dpp::version::PlatformVersionError; use dpp::ProtocolError; use rs_dapi_client::DapiClientError; @@ -57,10 +56,6 @@ pub enum Error { #[error("SDK error: {0}")] Generic(String), - /// Cryptographic error - #[error("Cryptographic error: {0}")] - CryptoError(#[from] BlsError), - /// Context provider error #[error("Context provider error: {0}")] ContextProviderError(#[from] ContextProviderError), diff --git a/packages/rs-sdk/src/platform/transition/broadcast_identity.rs b/packages/rs-sdk/src/platform/transition/broadcast_identity.rs index b44d3589e7..5e08d33bbd 100644 --- a/packages/rs-sdk/src/platform/transition/broadcast_identity.rs +++ b/packages/rs-sdk/src/platform/transition/broadcast_identity.rs @@ -10,12 +10,12 @@ use std::fmt::Debug; use dapi_grpc::platform::v0::{self as proto, BroadcastStateTransitionRequest}; use dpp::dashcore::PrivateKey; use dpp::identity::signer::Signer; +use dpp::native_bls::NativeBlsModule; use dpp::prelude::{AssetLockProof, Identity}; use dpp::state_transition::identity_create_transition::methods::IdentityCreateTransitionMethodsV0; use dpp::state_transition::identity_create_transition::IdentityCreateTransition; use dpp::state_transition::StateTransition; use dpp::version::PlatformVersion; -use dpp::NativeBlsModule; use rs_dapi_client::transport::TransportRequest; use super::broadcast_request::BroadcastRequestForStateTransition; diff --git a/packages/rs-sdk/tests/vectors/document_list_document_query/msg_2024-03-18T17:30:02.264054333Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/document_list_document_query/msg_2024-03-18T17:30:02.264054333Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json deleted file mode 100644 index 9bb19f7c1aac11fed896a3fc418f1fc234d37051..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74129 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 delta 1804 zcmZ8iTWB0r80O4Qy1UtI=A7Bwx=D9tH4SY|$`e zm$Wk`X)Z1K_C}%j(RO@%-HtPxvpBOlE~(v9Mo{4KxNxZ6w2flOPD;4EDkUV{j4M%~ z*AfnoW`#1mkfswks--Rd%)t=*ETxCA`9)nEACgZt;ak@FXMh_k6d!32D(01{yt6?# zBBWZ6Ym|IyiMxCfJ@``-m5x2Ecv1;zl&f^SHy87RkT!3~@oXIB9>LUfFroNo1HI06 z;8JfZUTwT6Y5hKnw%8UeOv)4Wren~SMT=|o;sKtj6Ef!e1>Ty%YHnHb-6>oe>xyn? zXgjv}xCLjt(4(B`aEJc6Z$|Q%tJ~B8*Uq@&KNLpzzD-EslN!l$zr^zaEJd|Wn+8lt zALLP_81Q}VA}x-{vLt$25o*T@7`OGTme6=um4TUk7wrf))+jE9q27eHmrCCIB>rWd=BCa9Ze`IOsLbqWJcHpfBC58Do-{Ehj%m!tt)!@yBy86TWG07 zmCIP!C{?L{$l+~C2xhudYIcmGMAUdhXD8W zxw@UA3r&_N@y;yl(2~Kt#8vrEb7)HF?_pK7n#=PqeeXA#BLZkaf$7IUF4Xjm_T^Qb7xQUJ-@20Tu<(Ff;Ae0F^eUrR;kVmFz&~k6 z-#=q%>GE#v>dzf)y34dVsVz5^6v__0<%^ce{B)gg>6aHQ>S?p07JD!yUji?@9g`v3 z_=mK}FDd(0#zxvu{w^ou7ykzu-k)m9@oDY1R?Pf*lj6&I_OUs|Ycf$OsvXHii4nQx zIY@{H;V=WKn)V#ttMOdWCc86<4;`F(S;R?|HpT#%SLE&_*uMUk)TwvMjBxb%R{`j6 z#wEY21E+#!ODWpnL0w&nyDhvKgYJ!>!V@deb~b9zfmJc9q{%OrW~A|JN*j*%>X>*- zN8(42QWR+3#T;ifqX}Ho97VCX-$At}HD)E4OLI?y4}!3FYfaTi#8p)CNt&gauN7Jz*ibzlD)_uK9t5qq%}5x0ClGO KK5xp4zP|zg8RfG8 diff --git a/packages/rs-sdk/tests/vectors/document_list_document_query/msg_2024-03-18T17:30:02.342323339Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json b/packages/rs-sdk/tests/vectors/document_list_document_query/msg_2024-04-05T09:03:10.038807458Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json similarity index 88% rename from packages/rs-sdk/tests/vectors/document_list_document_query/msg_2024-03-18T17:30:02.342323339Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json rename to packages/rs-sdk/tests/vectors/document_list_document_query/msg_2024-04-05T09:03:10.038807458Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json index f3bc72032ed5fd64732833e218c16db7f3106486..87582b1e2c724f2211b4951ee80540c2927e4315 100644 GIT binary patch delta 1713 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 delta 1804 zcmZ8iTWB0r80O4Qy1UtI=A7Bwx=D9tH4SY|$`e zm$Wk`X)Z1K_C}%j(RO@%-HtPxvpBOlE~(v9Mo{4KxNxZ6w2flOPD;4EDkUV{j4M%~ z*AfnoW`#1mkfswks--Rd%)t=*ETxCA`9)nEACgZt;ak@FXMh_k6d!32D(01{yt6?# zBBWZ6Ym|IyiMxCfJ@``-m5x2Ecv1;zl&f^SHy87RkT!3~@oXIB9>LUfFroNo1HI06 z;8JfZUTwT6Y5hKnw%8UeOv)4Wren~SMT=|o;sKtj6Ef!e1>Ty%YHnHb-6>oe>xyn? zXgjv}xCLjt(4(B`aEJc6Z$|Q%tJ~B8*Uq@&KNLpzzD-EslN!l$zr^zaEJd|Wn+8lt zALLP_81Q}VA}x-{vLt$25o*T@7`OGTme6=um4TUk7wrf))+jE9q27eHmrCCIB>rWd=BCa9Ze`IOsLbqWJcHpfBC58Do-{Ehj%m!tt)!@yBy86TWG07 zmCIP!C{?L{$l+~C2xhudYIcmGMAUdhXD8W zxw@UA3r&_N@y;yl(2~Kt#8vrEb7)HF?_pK7n#=PqeeXA#BLZkaf$7IUF4Xjm_T^Qb7xQUJ-@20Tu<(Ff;Ae0F^eUrR;kVmFz&~k6 z-#=q%>GE#v>dzf)y34dVsVz5^6v__0<%^ce{B)gg>6aHQ>S?p07JD!yUji?@9g`v3 z_=mK}FDd(0#zxvu{w^ou7ykzu-k)m9@oDY1R?Pf*lj6&I_OUs|Ycf$OsvXHii4nQx zIY@{H;V=WKn)V#ttMOdWCc86<4;`F(S;R?|HpT#%SLE&_*uMUk)TwvMjBxb%R{`j6 z#wEY21E+#!ODWpnL0w&nyDhvKgYJ!>!V@deb~b9zfmJc9q{%OrW~A|JN*j*%>X>*- zN8(42QWR+3#T;ifqX}Ho97VCX-$At}HD)E4OLI?y4}!3FYfaTi#8p)CNt&gauN7Jz*ibzlD)_uK9t5qq%}5x0ClGO KK5xp4zP|zg8RfG8 diff --git a/packages/rs-sdk/tests/vectors/document_list_drive_query/msg_2024-03-18T17:30:02.342760372Z_DocumentQuery_c104c67292061fe0b8e2f959cd2625892e0011f1264c65e1474532f59456ff51.json b/packages/rs-sdk/tests/vectors/document_list_drive_query/msg_2024-04-05T09:03:10.043689986Z_DocumentQuery_c104c67292061fe0b8e2f959cd2625892e0011f1264c65e1474532f59456ff51.json similarity index 88% rename from packages/rs-sdk/tests/vectors/document_list_drive_query/msg_2024-03-18T17:30:02.342760372Z_DocumentQuery_c104c67292061fe0b8e2f959cd2625892e0011f1264c65e1474532f59456ff51.json rename to packages/rs-sdk/tests/vectors/document_list_drive_query/msg_2024-04-05T09:03:10.043689986Z_DocumentQuery_c104c67292061fe0b8e2f959cd2625892e0011f1264c65e1474532f59456ff51.json index 682a346c8167ea932bc318f7668702e898fcd39c..38bcd780ce0ba9e792ac4dc8de726573e2c8d6d9 100644 GIT binary patch delta 1713 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 delta 1804 zcmZ8iTWB0r80O4Qy1UtI=A7Bwx=D9tH4SY|$`e zm$Wk`X)Z1K_C}%j(RO@%-HtPxvpBOlE~(v9Mo{4KxNxZ6w2flOPD;4EDkUV{j4M%~ z*AfnoW`#1mkfswks--Rd%)t=*ETxCA`9)nEACgZt;ak@FXMh_k6d!32D(01{yt6?# zBBWZ6Ym|IyiMxCfJ@``-m5x2Ecv1;zl&f^SHy87RkT!3~@oXIB9>LUfFroNo1HI06 z;8JfZUTwT6Y5hKnw%8UeOv)4Wren~SMT=|o;sKtj6Ef!e1>Ty%YHnHb-6>oe>xyn? zXgjv}xCLjt(4(B`aEJc6Z$|Q%tJ~B8*Uq@&KNLpzzD-EslN!l$zr^zaEJd|Wn+8lt zALLP_81Q}VA}x-{vLt$25o*T@7`OGTme6=um4TUk7wrf))+jE9q27eHmrCCIB>rWd=BCa9Ze`IOsLbqWJcHpfBC58Do-{Ehj%m!tt)!@yBy86TWG07 zmCIP!C{?L{$l+~C2xhudYIcmGMAUdhXD8W zxw@UA3r&_N@y;yl(2~Kt#8vrEb7)HF?_pK7n#=PqeeXA#BLZkaf$7IUF4Xjm_T^Qb7xQUJ-@20Tu<(Ff;Ae0F^eUrR;kVmFz&~k6 z-#=q%>GE#v>dzf)y34dVsVz5^6v__0<%^ce{B)gg>6aHQ>S?p07JD!yUji?@9g`v3 z_=mK}FDd(0#zxvu{w^ou7ykzu-k)m9@oDY1R?Pf*lj6&I_OUs|Ycf$OsvXHii4nQx zIY@{H;V=WKn)V#ttMOdWCc86<4;`F(S;R?|HpT#%SLE&_*uMUk)TwvMjBxb%R{`j6 z#wEY21E+#!ODWpnL0w&nyDhvKgYJ!>!V@deb~b9zfmJc9q{%OrW~A|JN*j*%>X>*- zN8(42QWR+3#T;ifqX}Ho97VCX-$At}HD)E4OLI?y4}!3FYfaTi#8p)CNt&gauN7Jz*ibzlD)_uK9t5qq%}5x0ClGO KK5xp4zP|zg8RfG8 diff --git a/packages/rs-sdk/tests/vectors/document_read/msg_2024-03-18T17:30:02.345966821Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json b/packages/rs-sdk/tests/vectors/document_read/msg_2024-04-05T09:03:10.044569852Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json similarity index 88% rename from packages/rs-sdk/tests/vectors/document_read/msg_2024-03-18T17:30:02.345966821Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json rename to packages/rs-sdk/tests/vectors/document_read/msg_2024-04-05T09:03:10.044569852Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json index f3bc72032ed5fd64732833e218c16db7f3106486..87582b1e2c724f2211b4951ee80540c2927e4315 100644 GIT binary patch delta 1713 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 delta 1760 zcmY*ZOH5p47|jgCL=3(Ef2nEI;occqNwExbXXei17KUM3D9^@0>HY z5|~{HEH;L!UeWa_&-0_!<~{<6?YxH6tSujaRY0_ zHHwo8%^t5gBk0CqbX#%?_Zu{>996+=8rEbOElGv(0gc!pg;G-#`J{n-kA-}{v9#E} z7sOznLV46gi3bOU6rx=UFB0<{OYcl++$8ReqQdQriRWE~JI56A;|4B`5m6j}CnH#K zG`5-*-e>FAT#Xx^La0llYoZQT!N4lZ7%`302Q?Nw1NMl9UD9~erhP0sY!%AYAw+tN zP7|tA!R3Tk2P!QOG@AI!R=Auram`U2Pop-i@FXEUO}M0Y&(`?1r0{Z4qbZ{BI7N6a zKFo$uOc0$JD?)k|-m*dIj9 zQkcn^*y>SO?Is;u%sW%0t6<`6O2Oj?t78?)IBPKBU}rjv_Tz?6%V1JtdW^Jigd6f1 zOKr3MqfXM*qHyb!#%8ldHE}*}Qy3(DtBqP%#{CI}c5bQIq;RniLzML1YV7ML`$Hz?Snfi%flZ?CXjOQ~($`rgcU)oLpoz~S z2G;8<)3I&9#e2ChUg2A*Qqj;p*d*<`ZBU7n0<{z+*befuUNmu@qP0g%e?QS2hhX)Y ze!aAJ@>(F^;F~Gi2limtM18^6wXY`G#XJEn7nR_D#puhLmd^wfs$==drKJQjR|P;~2}6J$puB zKY_~@9Ex&~!`U3BNW+{YEkD(3Sfpm&(>nWq-=@;gCDKC~K1U!T>4)5>%qHF)iq&D; zG4SiFB)w0gOz=NMNgw53vP}Fkl13lF-ysqK-bPf#LmH`JT9rB!&91XM7sgCTX z4Bv0F?CZ>(iAcrRM$E)jW{?ET7AGpxcnmW?DaEnp=nl!;d0y{P?%Pv_zemX|vB3vq z`vq=HMq}3bqn;VFP-Z{r`HI2Rn?fO1k1K>NkWX_PQb?$jDBk2^r;lqqVeV})q9v;5xGj-xJ3}W*>g9ev0myi3 X%qnrx4)4XY8`G*P?NwluXPkclq@_ft diff --git a/packages/rs-sdk/tests/vectors/document_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json b/packages/rs-sdk/tests/vectors/document_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json new file mode 100644 index 0000000000..6eaf11a788 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/document_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json @@ -0,0 +1 @@ +[173,50,8,34,25,140,227,142,53,135,194,216,242,27,172,247,219,172,219,175,172,23,135,155,49,211,157,167,27,158,0,180,152,206,45,235,171,83,75,48,116,32,125,175,252,120,93,39] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/document_read/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json b/packages/rs-sdk/tests/vectors/document_read/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json deleted file mode 100644 index febf179550..0000000000 --- a/packages/rs-sdk/tests/vectors/document_read/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json +++ /dev/null @@ -1 +0,0 @@ -[140,166,219,3,87,141,69,160,158,153,22,179,34,58,44,164,191,240,111,196,114,27,180,199,89,247,126,103,234,93,92,229,246,192,127,27,164,78,63,100,86,79,205,231,251,65,175,178] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/document_read_no_contract/msg_2024-03-18T17:30:02.266644051Z_GetDataContractRequest_e4cf74168e03a40bd159451456b501c1ba166a2dd8f6efb31b0289dc011da983.json b/packages/rs-sdk/tests/vectors/document_read_no_contract/msg_2024-04-05T09:03:09.940963863Z_GetDataContractRequest_e4cf74168e03a40bd159451456b501c1ba166a2dd8f6efb31b0289dc011da983.json similarity index 67% rename from packages/rs-sdk/tests/vectors/document_read_no_contract/msg_2024-03-18T17:30:02.266644051Z_GetDataContractRequest_e4cf74168e03a40bd159451456b501c1ba166a2dd8f6efb31b0289dc011da983.json rename to packages/rs-sdk/tests/vectors/document_read_no_contract/msg_2024-04-05T09:03:09.940963863Z_GetDataContractRequest_e4cf74168e03a40bd159451456b501c1ba166a2dd8f6efb31b0289dc011da983.json index 5272c47d83ede5e2309b1ca1751f1a7d8a80253c..06f054a87593acc42f78bf2f208b14917cc4aec9 100644 GIT binary patch literal 8822 zcmeI2%Wm695JhM0uQ0gIg17k2uM7r+A~BW_%k)T8fI;AY58IX;@mxFJWI0(l=A*mo zajWW9(LZi(Z?o^i;kX+gvd_0a=F4;=fBk*F+HK~mzn`C^r}?MuyX}*`0ZJAxpnjfsk z!_cp{tKCC?Kd!$GoBs7xHFx{_^k_j?R;a*@qQQ!Q)RFTBw}`+V?G?0=r5b2j<9S@;GcBm_LbsGLDySJHZm5LN zYG6xPP8FUPcmXN^IdnbbFCY!h!e#{@*LDLdM2nlc5|%^(qY`}vN1~BH5xp3u2(VYd zs5PFefs8GHCVGhhp&Tn}x)mY>t_9CIumUow0~Q;AAqu!c4fVD#Zt;d~3AG}yz~Wvt zrC^Nl45m8+NYEP**uxTV0NEiZq8bhqlTGA2q=nBKXjauyUFImXMLTbNL+7Sp|T2R;MfsxFG{8 z=Z>WT5H~Dg1U;SO2J@N$lvZZSmkGsW$`=Sn<}llle(4aoLDr@QrX)1NWTKiS&JZcB z{0$~+QaMV+014ypMsb0Nj{YwogN1EPy;`yYyuck*!M0Y`h`Asj8b~cm)+Ci8w_z^P zN3kA)We6fc?;wNgU??^$&Im}*;5=Ccf{4cOtRyj7BZy^cF>*XWY6xu!!9YqTYnjtv&O&UhAxuv*(M~dUjlcq25Hwuf;&>xr*6Xru z;OEo82wToM9JjJyvkuXv~>Z>9^|(zpV9(o&<-YI%Yo3U zMx+`U?g&8UKt@u~(%67`opqf}nm1+5c}$sRP_KjBbdmjg8V{#^znur0^MGVgtJvgB9x!`HQhI@^n}_OeWge zra5GvtkX=1Gv|62GRNKB!)iJm(l>x5V8meLJb{$OCK7<0Ow$|?uoS|0XQ>otuxvEN z?9XB0Kf9Dz1yAmesT$ z7pu*3`?PqRR^P|<;;pZSy1VH)K2NJnn&Jir#c{hE7rVoG;!b7P$B+hf!|e)bL&s?~ zJuZI1O*hlNu6@Q@v0ffFyXA4rrYs*9Q5P5Yyj%wq`|)sk%sY97Yz|0v+4ODpD!qKj zeq4WDTpND@Igh!qAU`(O`SXLdsz&!u9wX+{b?9H!^Y-?}rFr@G#_eZwD!wSI`3%v| zpH;$yW|()V(XJLVLvYk z4pHfuKNZ5vuqP^;L%GF(nl|HEh@5J^2-v6r&@!x62!%TMMNBaD=z(wtX`-c3bZwXs z%%uSk4brVj1gpiO+ymP~m>^ZcIULlZM+AaHqR@bSSy2gcje4w# zjf4YALe?O-(a=OQsiuvV2c5YVsAcXAFmpieTIw0fS?esCtgj6m z6(p1>VYF(*--bwVp68mO?pB~>r4Zz;4u*;)1!fY)RuDWl;B5rMgaz6WY@>eo#O+}c za6&qOlqdR7lwTH0b5e;-5e=66$QzOC-6)DJTFt7!prUo{N z?qtQVYL5ydN-aMWQ0Ev(Xru=al!F2En*vLaGED8IL-O2lOcs%+O!dl21k1aLaUKJW z?HR2I^FG)vYNU^qz8=024`o3hGs5B&!DAXhWm4B7q@dm0DLZ&Jv1T)eff}Sz2q04l z`spK#6!1HGLv8lGGs*0}rEiG4)Sd%(X-QA8i$hpSf~DMD z&xE5+C()3*M49g1H?w(!l1*x2j?S~|h!ET>yJ+by_m)|czg_L-hvJ{pv_I_@n{?Be zZY*&r8Q`3O3voLHyt$Nx%kWBgni3@wFeAcKYF;}#Y|3lg< z2`KU2QH8XDdC9|ui3(eT{`BiHmLO9u#@9=HD@IG5;zA@L6J7?f`}Rnltw>+ zRP9rW$cenjrGlfVFxAd02)ii~gKI^NO4M#esmZZR3OwFd}eDx+vV^zt35%sBGVQ=D%df|6c#U{9VI;f3e-b diff --git a/packages/rs-sdk/tests/vectors/document_read_no_contract/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json b/packages/rs-sdk/tests/vectors/document_read_no_contract/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json new file mode 100644 index 0000000000..6eaf11a788 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/document_read_no_contract/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json @@ -0,0 +1 @@ +[173,50,8,34,25,140,227,142,53,135,194,216,242,27,172,247,219,172,219,175,172,23,135,155,49,211,157,167,27,158,0,180,152,206,45,235,171,83,75,48,116,32,125,175,252,120,93,39] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/document_read_no_contract/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json b/packages/rs-sdk/tests/vectors/document_read_no_contract/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json deleted file mode 100644 index febf179550..0000000000 --- a/packages/rs-sdk/tests/vectors/document_read_no_contract/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json +++ /dev/null @@ -1 +0,0 @@ -[140,166,219,3,87,141,69,160,158,153,22,179,34,58,44,164,191,240,111,196,114,27,180,199,89,247,126,103,234,93,92,229,246,192,127,27,164,78,63,100,86,79,205,231,251,65,175,178] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/document_read_no_document/msg_2024-03-18T17:30:02.270343589Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/document_read_no_document/msg_2024-03-18T17:30:02.270343589Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json deleted file mode 100644 index 9bb19f7c1aac11fed896a3fc418f1fc234d37051..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74129 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 delta 1804 zcmZ8iTWB0r80O4Qy1UtI=A7Bwx=D9tH4SY|$`e zm$Wk`X)Z1K_C}%j(RO@%-HtPxvpBOlE~(v9Mo{4KxNxZ6w2flOPD;4EDkUV{j4M%~ z*AfnoW`#1mkfswks--Rd%)t=*ETxCA`9)nEACgZt;ak@FXMh_k6d!32D(01{yt6?# zBBWZ6Ym|IyiMxCfJ@``-m5x2Ecv1;zl&f^SHy87RkT!3~@oXIB9>LUfFroNo1HI06 z;8JfZUTwT6Y5hKnw%8UeOv)4Wren~SMT=|o;sKtj6Ef!e1>Ty%YHnHb-6>oe>xyn? zXgjv}xCLjt(4(B`aEJc6Z$|Q%tJ~B8*Uq@&KNLpzzD-EslN!l$zr^zaEJd|Wn+8lt zALLP_81Q}VA}x-{vLt$25o*T@7`OGTme6=um4TUk7wrf))+jE9q27eHmrCCIB>rWd=BCa9Ze`IOsLbqWJcHpfBC58Do-{Ehj%m!tt)!@yBy86TWG07 zmCIP!C{?L{$l+~C2xhudYIcmGMAUdhXD8W zxw@UA3r&_N@y;yl(2~Kt#8vrEb7)HF?_pK7n#=PqeeXA#BLZkaf$7IUF4Xjm_T^Qb7xQUJ-@20Tu<(Ff;Ae0F^eUrR;kVmFz&~k6 z-#=q%>GE#v>dzf)y34dVsVz5^6v__0<%^ce{B)gg>6aHQ>S?p07JD!yUji?@9g`v3 z_=mK}FDd(0#zxvu{w^ou7ykzu-k)m9@oDY1R?Pf*lj6&I_OUs|Ycf$OsvXHii4nQx zIY@{H;V=WKn)V#ttMOdWCc86<4;`F(S;R?|HpT#%SLE&_*uMUk)TwvMjBxb%R{`j6 z#wEY21E+#!ODWpnL0w&nyDhvKgYJ!>!V@deb~b9zfmJc9q{%OrW~A|JN*j*%>X>*- zN8(42QWR+3#T;ifqX}Ho97VCX-$At}HD)E4OLI?y4}!3FYfaTi#8p)CNt&gauN7Jz*ibzlD)_uK9t5qq%}5x0ClGO KK5xp4zP|zg8RfG8 diff --git a/packages/rs-sdk/tests/vectors/document_read_no_document/msg_2024-03-18T17:30:02.350206947Z_DocumentQuery_fb3b25c8fa37750a6c1b18d9085fcf0df7bf150009b1ced887a6f051ab86085b.json b/packages/rs-sdk/tests/vectors/document_read_no_document/msg_2024-04-05T09:03:10.039734793Z_DocumentQuery_fb3b25c8fa37750a6c1b18d9085fcf0df7bf150009b1ced887a6f051ab86085b.json similarity index 87% rename from packages/rs-sdk/tests/vectors/document_read_no_document/msg_2024-03-18T17:30:02.350206947Z_DocumentQuery_fb3b25c8fa37750a6c1b18d9085fcf0df7bf150009b1ced887a6f051ab86085b.json rename to packages/rs-sdk/tests/vectors/document_read_no_document/msg_2024-04-05T09:03:10.039734793Z_DocumentQuery_fb3b25c8fa37750a6c1b18d9085fcf0df7bf150009b1ced887a6f051ab86085b.json index 1357d145f05de0e81bfd063f3cb60f580e2af1ee..dfc7bbef9a7c6c5fc3f948cb1539f40249a2ecc5 100644 GIT binary patch delta 1684 zcmY*ZU2IcT98Yh_B!Jv=4h9y}_Ox?jE0ndjz1?kDx9)?%J~}!(+X!KM5hd}1VKC~0 zI$lT=LP-22CPo2C_MkBg%#4N^CJ#P{$apn@#hIuN0+}y9%rNnHZeMiC9`5bA|MUC& zUz`oh%m%JJ849{N7m-j~&`Y@(3hmmE&ZImq=j0s+CqjFzY{%U9q2t@oo|l%F!&)VR zLc&I7Oyb^NfuvTb?G&(^1-?xwOm|BwpT#dxjTibPs$G1YmiTo*qE?hBhi%k`CGKP- zLaxA6lR&OtV6j(WJwI<5=E%InV=W@+q;ojbqTk;m@XEN2a8vz%IcCqD?C131KF}H$_-b@q;N^tCk#>RGJU*Nj=-DHEXvaz#ANC1sCa%UPX_jrD(%Y`W?t+ao zy!BYs#&T8R9B)5IG{wBaX(GDjNkpjJ3RS#Y5tugeP{rbiz>S%;YxJT)x$A?7d?U1of0dwrMOFBv|C_=zju%Lm>CFMENC?H-o>cG zfmRz=`$WLQJE<5J_+-ePFDT6SjpBZnji2bd8D_*=%Ltr&+Gcbl@=@u>Cd9$>^x-8w zKO(zL6uPZf;@A+gQIObLpeG)q5b^PwxSVICCg{x@MH`=XDHMk!9TvDmoy+9-T2^3| zuc|?(AeX?P_xmn_P zR#{F5zNl(^?b!aPeGHcgXdxl2jDu*W#$O|zZ$X(YiTB!=puZcbhbo6v}-9&WN8_2@t{41>rDDeD<|{{##7=!#11;HhwEjHx7dyo zG?Ol@b2_pcP+qqU1N%ehObIOTgLf;wil_S`_-0Ju$2c2AWFL|H0=eB96WCW#jM$VL zp|-BSUOs1(l6p%ZgKP1q#j9d0?ExOYPfxjq{L0g7DdLke3oBxBUqUf9_-bAW2;>fJ*?K<-Sw)4sK3ikR(C4QGW1l97=<6? zt2{ej;rV2}-KNnu>75DD68R+=z{#eVzdP>@a#z*uzfsiw9(u?KG+0Y?^Ij^q#%rhN` z5L$_*?jy`uhI5g+xnysOVv5y}R(?Nk(eNl&`)>^QCsc({@g~o09G8I{V&MqFe6!dh q4O+ZDXj+2^0<@5r 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 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.634383016Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.634383016Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json deleted file mode 100644 index 9b8dfdcc0bbc085ddde9cf11afe896dd5083b411..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74149 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 I|M33*0pP_86#xJL diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.637905030Z_GetDataContractRequest_e4cf74168e03a40bd159451456b501c1ba166a2dd8f6efb31b0289dc011da983.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.637905030Z_GetDataContractRequest_e4cf74168e03a40bd159451456b501c1ba166a2dd8f6efb31b0289dc011da983.json deleted file mode 100644 index 571cb9f6636ffb79dce2356ed5407213e273ff70..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8862 zcmeI2%WmUF5Jj{0R~TGp!CQRiSAu}hNQ@=KG95hz2nPQ5blZ|Go;!v&S!Naau($AN>m%Cr?vX#Cv+I~8%HmlR>#*k^zcG^8`Pid^^Ra}os%XSW_&!rj+uqEap6B&8ZE%Bv;xh^OU)A9V6@9_rMY>uq3`On2r8hprF z+%h9a6s445)M=uEXhEq!l*R0F)-T+dK$5s20d7_Wh% zf&s-@xW*Q?M1u0%*9>(vt{PEfXqmFHRuq(pBx6vGqIF^q=E#A}-K)0O2j z08mB;-dh%vN+N*P5eXzLWidJ@3Hh-lMg4wDQ*>cC8-o)%yR3{n3 z*d7!mrdmP&v^>W^LLuFNbkOB3sW%0VFp(HF#bSoeBE~7pdQ%O(l*+8vB4}8hX3?J3 z3d=fsI~49?)W?EI9V{9IGA(R1RaDS7L1hpy3n?f!q_PR_P2_C)FkuFBS;bo-5w!pr z1gZ@f85$@=@CFIn379@A=AMk1Vo_&lTL%k94SQIKWOOqd6M4orWDjaWhISTZVX@zm z%Zm3PO5i{Q4SklSsO2XzAsITvyr0FWmE2+gBcnCAC3DY#w=}0G*u^EJk|344>gjOI z(-~-pIcpTiv~OawgpzG)$sCmzG*}4gl{H$rOZzfcoA3SI{80RTo)72!xJ?bu)VN&s zCaq9m(kIKwh!tz1k!9#rVRmw}AQ;HnZ0rfi;s;g6Q>}2}mgFfTnP5=!o+U{|42U2Kjj|5BT$WY63EeSHVGRE_$z!Vmgm_7w8 zS=5psV;U^LhNfPIYXx&b>|k-py2{pKw?f>5Mrp-7#9)}A+}7N)u06W}=GoT$mS=wu z6OTsX{(XWVv3SFh!%}BY{*cO%*4fph2L)?H>(N`v$|D*m!mMQlAiD;}0c;wGt$n(N zC+{pe7)r!}AU_0&-WZY>`?}d-3`&&Abi=ZghlV+=8vy=GS1)VM7ZvX%Q diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.637905411Z_GetDataContractsRequest_93bdf343bce1bafb96fd873236cabbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.637905411Z_GetDataContractsRequest_93bdf343bce1bafb96fd873236cabbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json deleted file mode 100644 index c55d94b259c7c60d0ee89d8a95cc901520189a1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8715 zcma)?OK;;w5QKB~uMl|7fz^C3u!jwhACPkp5L$_`gjlAd#{$8^|2;$5@`_*iu?F@* zayZk|U0q$%^!J;^BKtP%58LrR`?UC;E~gv$%m35Wc6~^ff1V$mAAkAzpU>H^SMUAt z`)^-U(S$b(R zY;QNmbT4alZR%>=5B+Mh+}`(h4FcB}f^G$>%djz&?{j+Y0;|@Jk@}Di{J#K6=B}DMKNcMc&deO)L_ma zkQrf{A_~lDz99rGLJHaqt89R0Qy_-SVdetDC1N6n>x>|cY3zm-Lj#2f-Y6JS0TyD8 zs)ql`nG&F9Ow?e8C=m~%NV1!yIgw}ehSh_fkfFVXC&IWt5Hl6r2T=lV6Etv~D&ms* zL}nzZL!|YN+bXyV5*RC5goX$4yo7pX2 zu}Q;13g-m_7QzVC+!}W_=N7(R(uDbNKBZWsW(r}`##Ai<#bk8QVn?Qlt$L~9B35O& z5gF&U0B*1_8$Gg!S^~3(n%=PVqsnUF3mJr1RGGk>(JDLg(<96Q?;?gG4fwMP^X_EK z1_!?hn-&YoNRkC9=rKwN(_2)Hq(~zVOKU=lB%|`tSzoMSt41>m`SV^V!5F&&H0QD_=c?uQ*|a+%_I`0=K(cw z@WjE~>rjTNUM%$t<&-bMXi|&X5t4-BRhUXI_=<%1dcqs(sLX?voSh-Dq>vHdODhPT z8_jdycxr3B^p2;C?BCP4KkfQWYNn>9=)CV~L17zBBmx;pQ!uc+Ia5&h5GvvUStco1 z|70gJicm7W1&LEqq}Z`NSe0F$F==FJ<)BCQlU`VM#Ta$~lUksO;7c)n6Fi6Q?fvq2 z+D{)K=FkxjQMOlWE3r`(rf2<}g(AWzrq2v>b~H{fGQcmZP8tD?Z<#-6mw%wKwJyGdrlu)e@}aS6Xc{l*Q3{LdG}L3D%6H78Z2_8zoe5 z%%EVowDX8H0l7p4M_9DXF%*S%s^(`H@fgF@@OCIAJ*mXFC0HMV0k@71H}>)8BML4< znSG-&U~)>E|xsTVdY zwdA6tTFrXbU%IXoz<=E>-7D(-=+`HuL&2E>2_o$S6SnO1c|y}9|X-!cDS&N zWPVZ5iqf9|VQsNMu$FU|M6nfV_9=}lE!n8st=_pVvKnkOLiiZ0$EGwyqxc`;3EL?E diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.639022859Z_GetDataContractsRequest_f229a0e58a5c4fb050f57c087bf067bd9ccc29eca3092a5664a5a9ba3bb7e967.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.639022859Z_GetDataContractsRequest_f229a0e58a5c4fb050f57c087bf067bd9ccc29eca3092a5664a5a9ba3bb7e967.json deleted file mode 100644 index f75ea287ad3314d29dafd3d7976d258129028f1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75622 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 M@6&(2zVrJ30nO6h;Q#;t diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.642649491Z_GetEpochsInfoRequest_1b87e649557ccb609adb9e2904c67089535588985622579e77969e0ffd68afc7.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.642649491Z_GetEpochsInfoRequest_1b87e649557ccb609adb9e2904c67089535588985622579e77969e0ffd68afc7.json deleted file mode 100644 index d590a2f596c3c69281b2ae62163eea29c6055298..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21008 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 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.719566753Z_GetEpochsInfoRequest_b2b426ac4a52cb4cb08904c63386caf3663c40a12d3b03827006d66058e439ac.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.719566753Z_GetEpochsInfoRequest_b2b426ac4a52cb4cb08904c63386caf3663c40a12d3b03827006d66058e439ac.json deleted file mode 100644 index 911577272976e31ee29384f9356dbeb841abbe16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1466420 zcmeIb-ICCefBfaAzkl~%KK;+yZ2xfi_y5<{KYsb) z=U=}6@jrk1wJ?|%OAAOHMo`#XN~x7DBU)Bp4CpXz!4qxIsS{@eG< zi~qHss`bXF|8*Ju_s!e1{J{SD8~)+;{`KqoCJz41pW9CNZzz5}H=6hNr^1&_doQG zpIM%K#~a>p;}5;?9asKgGfwfq551vtC$!&i!igs=Pjt*Q`_C_F=9@6UY4 z#D7?!``{l^a7AxuuSRXT0}8%@qk)KU2y@U=CLX-5w7z(Swb-@8;n?3gO zdyMfaI(+-gQeEc}bYPL{HoblYsztU9ikXjK`EBv z925`vYGxT?E!Ih}h8YftbwPF_)?%Fm>k%i-U_q?KItSJ%=6$z4- zF)xilpgOD0mFx^y!%MSB%{D;Z4jgyxuG{uI@ab&soEsyoc<0_Ssd(pJ?TIlp2e@Dj zuVTcIAEWUEfRX4XL$bc5g@pYdh);=@(;7NrfzfDcP3L9jpx%UmE)Be_TTL z&d7i@1UIJEri@};pL#%nECbdfYCXYqpt*f&y|jun> z@ahce#agVBU=1%lRHvR`s>EE(lVHAWfFaK?ArmZ&Sc`QItO4c@#y+=LuiCO%(Ca;M zcyA49SDjVoigpI9;jLq8jW>(6SSP_6f*ZryRB>@2b*~BOosmGTV;Gwvit+hU#2GFF z&28aF)r3uNG;JfsJMvmDe8ERV!Va@ez1I$@`wVs+272#GZ32@rbiXw}=~Jx5ItSJ< zbv9*eb7xFo#IOL^o zU{S2~(v`vlrejR4Q4bVrvCe^YXi3N~i4tQm&VlimI%5!swOA*?8l~kiZ|x_h)~mW~ zRziAD9Nt@_)}eZ<-WBZxSi@Fe4Twqyzr|6E#W)AXW8T^nad8}Vuj%NWkwBftytJvJ zSfB3`Q#mX(A)1gn&WXhX&bG{u!#fW6;O||$!&{5780Wy4UYaH(+QvBBUSi(yvctk* zk#ktYu=ZI;y?9D59>W+%tIn$P8PwU-QFTtK&h*;QUzlYqDetC^Vx1FfkQu`oH=Jlf zG$A=mNDO0BN7ea+>WnhG>a05FP-l8+wnOUu0M}@4`y2RlHhs3SO$tIpY_QNpH<|OwCOl#XcwY@EI|z zO&!HLCDtK~pD@>GZjTW7b~a5F+XyjLY`yTosp1nXinU9~N@0cqAG~%`)1v`cSHiUj;S+_R-IMnigE&shwcG+nkp{RT=%MT9(872nr-Ou zjtPN-QN2~~GpIM#n_?~2Ik1kYvngVqciT=A(mUhu-r5vVtW&0lLtgp~E(1+CZA=6x z4zg*g_?iK@DldFKv=mfT`8`#I;#uxk>Ei^2U$1$Ex14ZcXPkgP@Ed$$>QE)*4J?Ya zUb+s(1Xx2tw<{fQcv+0aI0wdK>WtY&ti?JB*6>O6)_d)ky5nevfx{rlFu?Kvpu&~F zYrkP_BGzJ^1M3*Z7z1J~#yKz^^WJbcVlCE5um+hiwKjFES8>@)9eYnCDEN)3wW;I6 zblr<}9;`#^TrRK~Xu@ja+*n_-Y0TKD@ZrVQ3m^ROVz~fDxzh|paxUjdIN$aT;1+USE+&y}+U%SDx_3kZ{SN9g4p*Pm=gM*dj)%%0q%XJd2w>>ZCQF6V#mfJozyf~ZQr`qOh?^A8P5ceSv+&zv# zs`{)xSL`zQ4v-n-8m>jIzrJ}5y!ZmVLZ^>J~tPg=94v6 z^SQ7l6ywj+1UUwaa;%@O7$&H1kNIiF#BwdyNw|ieW_>%T-{zBT+U%S8WbcUM>ow+{wU`s%pY$s zB51;WW6W?7>hp|s3h;TxCKMn2JmU>4%CY{sVwk~)Y-{LFUGIk1R#W{J0pR<2RSxxl;acTjU0&j4t+-*=)~dywJbCA zFx&Uw-BI9{Yq?Is^^l*wqfRK-a-D-~%n;xda$N2{�e1qo2kwP@mQ39Qyoq>(zJj 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 Co@CSj diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.787102609Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.787102609Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json deleted file mode 100644 index 20ab77901cf923979a5cf56db6f7f175ce1e15da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24209 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 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.791025249Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.791025249Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json deleted file mode 100644 index 1ab8cc19086101e35fb5fc43b5d310e4b51a56e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21964 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 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.813846802Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.813846802Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json deleted file mode 100644 index 1ab8cc19086101e35fb5fc43b5d310e4b51a56e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21964 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 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.815461989Z_DocumentQuery_c104c67292061fe0b8e2f959cd2625892e0011f1264c65e1474532f59456ff51.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.815461989Z_DocumentQuery_c104c67292061fe0b8e2f959cd2625892e0011f1264c65e1474532f59456ff51.json deleted file mode 100644 index 9ccba2df2b42155c805edd3546823c5a832227f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24209 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 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.815625277Z_DocumentQuery_90af5a08200f1b0e42dbd3ad7a6af38ff6415d9cabab87315b9d9d736194597f.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.815625277Z_DocumentQuery_90af5a08200f1b0e42dbd3ad7a6af38ff6415d9cabab87315b9d9d736194597f.json deleted file mode 100644 index ad4ad78c551a2a8a16d06f34d4bac12eb4778ad2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24335 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 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.815887401Z_GetIdentityBalanceRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.815887401Z_GetIdentityBalanceRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json deleted file mode 100644 index d66fbb0245040408a8bb04eab9d504b3ea6b2d90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11759 zcma)?*=`$05JmH>uMqg02Uc;JVSXhD2wGw+A(H4&l!3s|zh`>1u;v^&iXUY5EZx<$ z-CNc3W7UjljRR?(< z=9iR5&&FA6o^TqSU zFBi?IpV|0+f7)H|PP=0F;ia4X?bn;raBbG->}{#x`qkmM-(KD9ZXdRHhpWH#*W33e zV^uXX+kZP;-3$|yt;|lh_xtVrW1BX*n0H;Q`c-y)U18YH>2P(p+n#;1D0cR;_UM?i z>)qqc{qD4HqU`RrxtzT!=lMV5)bl3Lr;@_i>4=Wu0oLm|<_O)s8`pfq1=Gp7p zJ4J#vEM79+T^5)4=>D5H?cU{Oag8?2YWj9zSsZVCV2arJpr=qJn#X-DAmkDcco$Pe#s({7V#df4ZsWGF#G*uSyWc}E9p2wy zTtj%A|FZ?7Cc*XwB<6w%0X>F9u_+PvA`&ba8(1z9TFC{TsL6MnvnHkSLQPrY1#YCn zluJkj5kk(ef~JPtF?9zhqQe3cXn2ts6D%-8^iX~TFRUpxeR_ffZPl#EIf_AL!vzCl zh`%&iGQIH%Sn z6C)_+Fl6c#Md8$J@^Us3+#GP&$>=8O2*wkf$3^O({vr9$Kc36FSR5b?uq3tK8agW;B}1YF*3XdWi{VC^YEr=gH^ zbXyemN!8qpHm6r+qB$IQ((Gy`jh?|IWzn?_<2@aRxhRC0+8dK7|fPM#wsk74~Zmk5T?&oTw}o7y2JGhPj!#G9hD9 z>j92Q#ARBArbts*xB_1ox@yZPr?QWX2~{f5;fRSM3`zzv9n1OXpfoqTX$XQjp&YwP zI$SbqvKn`=b4fLWV96lER1fxpz6SPzAy!~iL5r+E{(CZNI9M0N9LuYIp{t1SG6xUm zL(@DF?wmquRzwT{Ri|vrIOno934#j?RQ2CUZ{=>WU}hn=Q4A!hB)JVCQMoBuE%-t` zeQoTNWJ8r6TnxjYD#fQ%C=$0BsH*E&G?NRfW=f%xNFb%+oC47fUJ0h)h6G(Iv;_CX z@RRXem=WsLYg0y=MjsP~>QOqe<|8xs1ng9!X+=^|aT7PZ=#!F(St!}V<{O}KEPT{# zR(FwQidtR@oKW<`#d!9n%*jfFM`=vvL}~3(VMGYkxu*|9rvA2uVilL&>tTOOP48br zw88A}r^E5-etR=~9xxp9Pfzky^RW{UX7=cD23yLcWn@7~YOfZg3OjX43=(2zDPC-w;|~#=IQ`h zOfK0TC3|t%Aa+Q{W1YaB6|<-tm#nAs#frKF3}U*nPJE$BI*jSUsfAULf44O$sssOR9e3eV*UC7GZ0SpCU12RNv7K!X5F%B!LcAor-KR1t(iV zyPIXurH{uLNGxB(R(YN((&dy-Mnd(enJV>>Eh>?UEmFON!w*n<{Zm{y9-bcB=d=^o zpM7axQEqRC&nQ14EAFZdog5G?@vkY>7Q?nsSMEb?s@I|-}dk2|JSd9 F{{`(rXHWnD diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.818184304Z_DocumentQuery_fb3b25c8fa37750a6c1b18d9085fcf0df7bf150009b1ced887a6f051ab86085b.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.818184304Z_DocumentQuery_fb3b25c8fa37750a6c1b18d9085fcf0df7bf150009b1ced887a6f051ab86085b.json deleted file mode 100644 index 761ee46c827a120fb3f75f5f29d4ce0f94646c1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22309 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 HKltSzD?X{Q diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.818401023Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.818401023Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json deleted file mode 100644 index 1ab8cc19086101e35fb5fc43b5d310e4b51a56e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21964 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 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.819407923Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.819407923Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json deleted file mode 100644 index 20ab77901cf923979a5cf56db6f7f175ce1e15da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24209 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 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.824051072Z_GetIdentityKeysRequest_b4ecff7acf52818aef9ed37a98d4a459dc7a67570ea6df3f8858d3fae7820ffe.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.824051072Z_GetIdentityKeysRequest_b4ecff7acf52818aef9ed37a98d4a459dc7a67570ea6df3f8858d3fae7820ffe.json deleted file mode 100644 index 2b6f6eecbeda40ded8ea1d0fe11b274c2d3002ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15482 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 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.837728485Z_GetIdentityContractNonceRequest_b7c02dae0c3c762ece1f70a36f88fa69b4749b19cc1f5ef0abf37fa0c04ab2ef.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.837728485Z_GetIdentityContractNonceRequest_b7c02dae0c3c762ece1f70a36f88fa69b4749b19cc1f5ef0abf37fa0c04ab2ef.json deleted file mode 100644 index c37c61754c915d3e820749af381041734ba0b1cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14552 zcmeI3%W~UB5Jj`rSE#tog57+8%&(+UELvhLRxHt>C|9{$`uAX<2OH-w)+Wn%Arl}l znCZTK`*sibf4h4)?N8q~``iBX@53eSvia)Q z_s>y3uV>|p#iAbM`5ms5YWW77OeD%N|ZHhr9;ket}+->&{n=gl(zjn8q_bX#jfjQZIJ>1;&0~91p zPW$`a=Kiq_8(mDhE*7grcB}e?emSSZ&Ed=D%n=3Glb2@?yfC@lKHlALPrEji?Uzl? zC$GkNew*>+xO;s1($?|9GtCE+{t1UaN2mIepPLnLKW*N=Jd;klr_7)o7B^n_Hm8L( zE_{!{a#mu#UB2S*i(KPxS$YWJ6>R!OU{|A3=EJ{nsS99V~rCTh05C` z=5!#J&F|j;-EQs|4Wq$GHO;llaWxjm!D2y+OmT-Dj|q&@Tbsd3L(+x>M$BM>8KPo| zRgF?|dnSV^fghF%}GpAVD8s-;bX_~AmqOHRx zs<3HSh#naIm?R9-;W$Z1T!Y*jQw>4P$Z`ytC8G?-RcN(E2L~{QIPVT96e93Qu?_LT zWmnzS=9mPjLWv;d6KIvJO0PX)g-Baq1Uh#lG}{1VNZ^%Nh&hZDfje+WI*ldJ*kQ)O zhzPm-jHze}k&;A(BC=M{%^xd5sFu8g!(a+nN~Wu2YrEg>;W}f^ zg(gps|C7k4vSR{aq9xylvip=Y!r&qf35lfbvo#j$YSVN8fJ~223fhH{M0_x}N<%^ikrZh%+K?D0-vw=^ zxT8>~Dh4$$Lz05!_1fbeY)tj25E5U3Ppv)xBz0Q|Z-rbawbXw2z?oEPw3C_#Bz0D| zB5}klLk^BmIWy{=zgQY}5kUfctgwROQ(Y>>G+f1a1Ofc~kga;30)~vU+1%MlcDcZuK%5;+m#v$e<)reYb@3q|^*8 z#s~X*u7xQfLQYG7CPYT?s`z&dSl%!}x|AImZ3K+nuN;7{8EQ-_2#R3jk+3gR zFR+;y8+Z>}mOidy2#1uv_(q<2+?v;U<{!%#y75=FJD z4FTiRwkoN)6%b6BECAGQ4yH`S_eWI;J7#KU5#?f9PFlgLT268hOsf3y^Y7s(+^u~9 z1YNKVCd5n7i#h~1?py|4eW6i|Ww3CA4TyNVh3iDdl&n{$id>Q6Y3<@*lHS}VUiDBW zSp|)9pa?}hc-|5;9#WdxB}&ZXIHn)eKO}ZqHdthf14X-hqJ%GT&kYtfP{bT&Lx_h?(;BdsctB?MBhh`;D;phY>D^?^cDITndSn=9J)U;+&F6xps- z9V9J5OKO`*i~*FZb3l>y;l?EmBl+sLqF8&Nb>l$ddkxy4PZnPm?tG{_3()?^No?>2 z_k5)s*&m@YaG;15rJ-pm*C$*BIYSazHBhj*!OlXGoGD0Deo#FqUvmTo3nh-4(V{gy z0=ZSZr&oX!pJc}9Uf-r{mB#zqzU^T0_tW9{bicXl-@okNqa42~sbQGff+{qW%m@so z7IqV~gC*L&u6zSkRIi6YTz@su z$W8roSdswJ+fpP}=f^9jqhN(S5pke;? zx^)HLeqhz1^9hv6ZarZ+TLuL~j)-`dKjj)iLFoRsCXYQ1g%qG5huq|D!b g&eo{^qR2gc|JsyFpL*Vr*M4Bt{=NMF`g5y)0D->Y?EnA( diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.838169256Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.838169256Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json deleted file mode 100644 index d8710cd5009db23bfdc3f08e540c629c88574224..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24692 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 X{|~8CnM%*w$@CpR{dxZP<*WW5B{+tB diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.873512881Z_GetProtocolVersionUpgradeVoteStatusRequest_983670ac95678b1166deab32209bf1acc3394d29ac72f662d38e81344496631e.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.873512881Z_GetProtocolVersionUpgradeVoteStatusRequest_983670ac95678b1166deab32209bf1acc3394d29ac72f662d38e81344496631e.json deleted file mode 100644 index 87cd079c64ca3292fe3d38e50642ca7170db92c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10634 zcmeI2&2rmD5QKBqQ?Pi>0X_K7tGH4unnEO2BvBzjmt8Ksdv+;_0={O%$~p1DHi+HX zoxh&mS^T_NESBGf{b9R%TK=~9nI7{G#rgl~=`gPM&@=?G^U?a6zAX4;BQ0vZQLJ+)3}%P_sh-8%`Z23iEAr94&(ZEJ+3FaNR#e|?cIG| zY1zf{eW}w1_QPs(zurEr9(J2QhuhV8r0S-fj2xbKo4ot;M$_zZ`#7u~4_T~Q6>Y1! ztE26vDVM5C zgl$VvCIfe27)umj1!QW7in895tbg#QH*k9h=vo$DV}b`I9JE4WT7U6+Hr>*Gy-+nBB+7l zGTb(VH2c$K)HDq0p{QG%{xC{8H*T1F=I;?Pw5tf|R(hpB1E3DlQL4!*;i+XyA{iO7T!G0;m8{&FCymuH5v?4R3~4)|Tm79!3*$L>%<|JS z<0A@g0=^-mqoGAQ94w^78%u32p&BeM=&jW7np=XFV?j#&G)zEzM1cX8Cw|!IA%kR9 zJkyFX;^!5fQN@a2#}mfL6$HB0fkD(Vb*+RMM70Pg2((ik(S)>1RLH=>dQi!kZBBzMN&qQS*h9Pvj8Gu+7hTGRQqaEma$-2biodAZZHDjO*bT* zLBm>zTl^tlAPgUj>W|-`bf^BZQ*dxf zz5qAk7NVBBfM-r1+ceS~Mn713#kRIco6ODR{&r!*Q#8B3mYal4a((0JR_74iBy!dQ zXNN6#;IgI=XE^O4M0p?ryz;6tyn8d@Jr@WEe X@yBy!Dk?rAFMkY~|GfVD_G#qbp7zp> diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.895002050Z_GetProtocolVersionUpgradeVoteStatusRequest_8534be7e0b4dd648520dc3a67209b1a05862cb8d40c088b193b59ca3564210bc.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.895002050Z_GetProtocolVersionUpgradeVoteStatusRequest_8534be7e0b4dd648520dc3a67209b1a05862cb8d40c088b193b59ca3564210bc.json deleted file mode 100644 index ed765df053c096529892f4b986215bc14e53fd83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11307 zcmeI2%W@k>3`MinSE#tog1|iKUrD7{G{s1)NTNaxT}iq0@0pe;nRAY0ZnKCNwrAMW z-2g6t3v_?Ky1t%$+w2e9-Q(=b_4o0yyqLfLe|$O&tNpNi+V7Ub-^;tz;coo#x0ius za5l}a|3CcKba1lB?{B7=t#`-AVKiL6zZnhsZ8N?Z_Q%c3@aOUG=d0(dU#?tb|L&2cux>)P9!GRMt`;fK|*DO*|H zFSDMV)b;%K!EC=d9Pf)9uO9K@72^uKKPIn6!ETEdZ@w1yc=_>%W0Y^sc2FMQm0upl zU#t3U!PASMJ|;(3i|P2Bw|Kz?vg)TJ7Mzna%+HWrHd&q7syqkx5cnVyBib{|mKi$E z*kiysJjw?d5F!IoWCg`XPq`{?laqP?wiOLF-oU()+`DMF&%_)Zwiyj}f$@n6a}MoC zP36t2DI}mNO4;IjA}Tmva70pu3QH0~QA4WevFGR^<^p=@@jS^|1ytBV)|fDev7l*^ z#>|?qgfTm;k#tvCJCcIee9=MDfMnQ1#o-H#4=g~xkQ#yr<(_lS5j8f^Vog2=KS<)9 z5DTeAf}iu4f(UO5plc_cnj<_V4Z@U8zyy(=Ay(q>#3d zvN2_n(L{&zfEgNMDz5YOr?q~O38=Iw}*42o2=2{IEYXFG$ zTq<%7lGR`gQ#&H4t6&)|magKG7`YIET4=7vGf+#{RSHvx>X@OXidT)!XhPZ*6iC5< z?M-EuAgc^+Qifm!%tQb+sl->$My)AA)=eFn29^reYaj43+Ja<|V$c;CCdK1GnNs+r z>gl;mN5Kj_)v4+Lo7ky>RH0iHqrKLsl%`{}Qk**hl*Vp0p1qbj>dDae)``=H>%fsxi<8FU^@MVYcBm0QX0OtF^gj|Ybjb1OpuakriXe`BNv97*J zlA;lc$+j-1B>7ReQ%^Ny6?&Kt+IUEjq{e(!ZlMj8TS&>2ORD};@Eo?ckE`LhFPAHD z9Y7Ez#bG7E4_u=ozUW{xn0nPX)R}_JOakDe5b#eW70SV|Nv{HlgP2xnWCF) z!Ko?4FI-G8L>Y+F{G}cZ6I7_gQD{~pieRS`6Uy0ulR%T?4=T!8{hgu zQN}^;S7+(c2P}9<{uKJAmJ}RGtC*~OB1SOKuyh$!eYArwT5yWwxsM2|Jo|&TG9!*K z%M&Z=(v4<1lKOc&CEhp+=FA-)6qG(M+h{`zm{7gczcG;XiuTg$c>UG(0^oKk}%#} zQHN6y5o6M2CmuzB1#?eoc}QyBm0>}`{JK) diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.896617067Z_GetProtocolVersionUpgradeVoteStatusRequest_92a45a0fe4f69d355022d2f2f7622dfc69cc7b123be24b7ad993281979b2a3a2.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.896617067Z_GetProtocolVersionUpgradeVoteStatusRequest_92a45a0fe4f69d355022d2f2f7622dfc69cc7b123be24b7ad993281979b2a3a2.json deleted file mode 100644 index 9d6639943456d25f2d62c73fcf21100aa3efda5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10992 zcmeI2&2HmH5QKB~Qy4nuz-s>IRf2_}l^9EiWjYeI*kIvz4@Z_|@hjOvfZVcs*jY65h+}+>LzID6(rhl6KcK>6%Oh07j|BqMuVX+(L&%1s;e4nou`}KJ9_v3@< z;q2F+|NZa%aPsMwH|Nfl{o!dC9k1-{@YxuWZ{7IYusd|e0WagBrxf{jQrY*Ne^5{IOsD*{$a1CskJU#gpB0zf2f8 zFLWF|Y_{EeyH93SE30djO&N7_Im5V}pHQqHRZj1>cwY5|(~c9=7!grTP1F~zKaR-pK+7!@?bJfq;2H+R0TL{z#Sku1RWY3- z0+Z4tEvkS8apUk@aN9W^5T7Wys|qF>T&qTSqd>IWQw1W9MPZY;%lW51#lx7$px9#Z z4S^Ie7_i6ylrU(hP=+U>jt%xa7lFIVN^w;(2iZTw@$5EFcKoc(0;~Ge=%8 z0FnxG@>(1aMkiQ=v4w2oB{zme$vCXRBtfV)%%2u0z@=D{8YF|UBvTf_tFQ-Nk^+={ zj=azB0*JVTvzQQgdXyH1sg@PB z7BP^O`vR^K%bu+MmmEUcwiIPDa23X}WC2z{riQpt)_bZo`sGvj!0(i8$P;+SsDpbk zaQ>|3uS|b0Qsn=knv;1{fj1%t!bEuyCMd}K)bMISUq*-`%1t2}Pavmwx)E`%hFQr% zO$xQ+4mD^5>a-!K!p3F1Z47DtXUMqIFsjE!-P??ZNy@2n!@@JY55&-~BBfjDvC2Y* zRt_0PiZ(~*aDu1>#UWI76f6~pIw(iEO;!m{Et?X_NXT*qCNH;S<<=r;s*Z_h#j1Fw6*1!H6`oPWieSeRV&nz`-Ri&qwM<MOe5^nouQD!al;<~3ww4@x1O&V1Rm*Co+6+#sQ-}+|K<{wedQEEENWtN z*^XV5@xk4h$qE~U`{eg?5{(=J8b=peY(l>sOTM$aK&nBDMhhHZDfL9 zJk4E^vD`in>)xiIL?aY~ZC#qA_%XV(o~kS=%rMzI3bwiJ#V)0?WdvhrwS|(*YDwOF z2%i1s;b}1(cIo>9yb(8uTJD0LIe==@M01$@VCfax+M;Z-FjM>63mcxI+5NTLByCdb zn@+bn2Xs@&Sqq#Uw%~!wnnE1mvWFDqKm^G_4fy*3JK`8MTO*2KXA%?2QDPPFBmrcH zavp!f-WE{%n@REpU2SW$;GmpXXX(}e9(XAJjQXaLG&mw}tyuXRF*fWNSf;+6`WOeR zJ3$k{_dX_AEwlZ@1LDm)Dtu!_UwWgNiDZ33)cTuEIq$eryo>I$7OT0B?Mx$5>MCDjDQU)&Ns|akHYhnxaNBQJdnnf|=~d-^o;AIzKo>i_@% diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.913049807Z_IdentityRequest_8fb3b1a4ef0db316161d4ed79b93efbcc93fdbc66e012e606d530c327265c52d.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.913049807Z_IdentityRequest_8fb3b1a4ef0db316161d4ed79b93efbcc93fdbc66e012e606d530c327265c52d.json deleted file mode 100644 index 8ef1f44147525ce08f8a26a61bf2937fcb562e9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30798 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 BgJl2! diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:46.188023131Z_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:46.188023131Z_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json deleted file mode 100644 index 9e1c943fb3afa5ed3276e4581abf810be81c4ad3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2425354 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

    nHTqZ*~z?=ND9G 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 z zA{g|El|i2f2lIsk!F*wlM6Q+Q3**D{o7eRTOrJQmn4kC@8~cw#LZ7G(`b1pNC(duf z_3+RqMh^26D~CR@9Q28D&?kaHpI906iEz*-27*4(Bav&RJ`o@Ei3(x=F&OMWmV)`h zo(c1XIT82e$^K*I7&P`D_50(3et$riFANC%zB=glaY4VY4D-NzzH90CBZq#!a_INV zLBB5t{XQ7<`<3B-1=T0YMW4_oD#F@e|M7Lj)F(cE*neCS`b0SB6Sd+0N1wP}dcXeg z!}Bfp{@*|Ux8Fa0KmUb4+#f7|zW;i!$H4dXq4(>TU!Q-?uix%};fLRz|Blzk;-9a- zt*@W%KgTck-{_CmU-Rp?`>*kJ{f&NqU;mE#>tFc(y8fnKUtI1#_C@7A*YV^1Uva-xe*bj+ zZGK-MzHbA*Zi`-juKSYy)Ah&tx;xnS53m2y%b8!VKk3(x*FW(;T>pH&zpsD8*Dn`} zpI`rp>tFb~|E^x&yKcJoqxH8-lJD>9kM({3@sj2L{@1$xnO*&NMW`x5o_k@P+dx9j)c^l$f{>ay|j?WXemeI1?G-RCv*@p{_bC;Z+~xzF#*pVwpj z{x$u6Jy5Sd<=4;Gzwr9i|GIB8_do3WH~;HK_1jJA{we&r5AWCO7yABdynJ~5LGR!2 zulvgLb^ly`-Dl~(Q+?l$v->f9{iwXq-S>p|Kc4%~`SsHU@9XyN>(}e7y&hKg*}5Mj z_ciT)GJUe>pG&}_pj;KeXD)nPwwB> zU+-VC`zm++ZQg(Im$~0x*FT=GU;k!b8S{VshrfPa{{Dad`Hz44^MC)_fB3t9{)gZH zyWjo$zxwz6?su<$DEIH(`|zvSzS-~D&>{k~w|f1CGH@_nq{(qFFJzYafNr{wGYXZYJC)7SkhzU7;L z#(yQnQ=WhR$N%zAfA=qc{?mVcsq=MTWxl?zKmGmVdH)A~y#FNk58wB#*4OX}di~1Wm+;pk{r+>@>b)K_uV=*lu)F>i?+fl9?w_Rl)$w&-d;dP%KlrbE z<}deu$t~XfzrPOL>tgbHH~D(~ciwN8U-y6KeTZ+BU+>5l$y=b;J>-7ke}CUn-WQeE zU-JIlc>Tk9J)iF%@9V(6-mzc*G_U`_eF^>bqVW3Z`|Ib!WawMR>!0-3J$(OqfB5>o zWVrvq-bdzj-?;xdyq-JX_g~`u+Ih#N*UA3+;rf%ku3oRV{I5F<+$_IdKk@fLx{Jx{ zrT)Hg+;`0H_fP)yh<&|rf4}O~jqjJsq1O-TtEt?0@5kZ4a^L>t-+Zq8>5qT@r@x

    Z$K!QPyRYl7m%5iCU-x6{mAvkY@Ab=g|2@5)a<4!2>o$HJ$NTwk opOl}z|4pCHCHG(c*Z;^(Wgb2M=im94^Z(laJOAfj{^l?L8!})KZ~y=R diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:46.205942235Z_GetEpochsInfoRequest_6a828350e795a088dbc835260a1add01a7428085ffdcf1e11cccf19c48c5f7a1.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:46.205942235Z_GetEpochsInfoRequest_6a828350e795a088dbc835260a1add01a7428085ffdcf1e11cccf19c48c5f7a1.json deleted file mode 100644 index c3f4a7dcbebe569dd6b98a2bd8e275e2b866972e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2668628 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json b/packages/rs-sdk/tests/vectors/test_data_contract_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json new file mode 100644 index 0000000000..6eaf11a788 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_data_contract_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json @@ -0,0 +1 @@ +[173,50,8,34,25,140,227,142,53,135,194,216,242,27,172,247,219,172,219,175,172,23,135,155,49,211,157,167,27,158,0,180,152,206,45,235,171,83,75,48,116,32,125,175,252,120,93,39] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_read/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json b/packages/rs-sdk/tests/vectors/test_data_contract_read/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json deleted file mode 100644 index febf179550..0000000000 --- a/packages/rs-sdk/tests/vectors/test_data_contract_read/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json +++ /dev/null @@ -1 +0,0 @@ -[140,166,219,3,87,141,69,160,158,153,22,179,34,58,44,164,191,240,111,196,114,27,180,199,89,247,126,103,234,93,92,229,246,192,127,27,164,78,63,100,86,79,205,231,251,65,175,178] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/msg_2024-03-18T17:30:02.254826261Z_GetDataContractRequest_1d1e53ab5e04d9ec5dce4ff9ac048c03122daf7ab2e77108f4bf44af1ad15eae.json b/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/msg_2024-04-05T09:03:09.921319859Z_GetDataContractRequest_1d1e53ab5e04d9ec5dce4ff9ac048c03122daf7ab2e77108f4bf44af1ad15eae.json similarity index 67% rename from packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/msg_2024-03-18T17:30:02.254826261Z_GetDataContractRequest_1d1e53ab5e04d9ec5dce4ff9ac048c03122daf7ab2e77108f4bf44af1ad15eae.json rename to packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/msg_2024-04-05T09:03:09.921319859Z_GetDataContractRequest_1d1e53ab5e04d9ec5dce4ff9ac048c03122daf7ab2e77108f4bf44af1ad15eae.json index 06fe5b9c9376405549337ce3d00322b3b021df2b..49547581439eca3349b1340469e182008f395811 100644 GIT binary patch literal 8822 zcmeI2%Wm695JhM0uQ0gIg17jdUl|MtMPe)=mg$kG0E58)K5SWX#B*(UljUULn2+wR z$E~VcMgP3Jzt4UQhvRO1%Kp6nIbWt5`P=XF)owFi{dInlp6bj0zy5wZTx|OH)wtR7 zVf-=7hMx|n;r#Gr{`qqEa`(qw^3rEc+Yi%fvzk^nj+_^5huy<=n(t+0TV~g@<_GKX zF!bx~YWLJXj_dEkrhj`?OIhCdDFD&q}vl_eWr0e zKK8%Rc7vqs_3Sg$vd!wa-LIx0iL!d^t2(<_=jD24b{LMQ$E3(BVv|3T#l~-oTl39_ zWX8?c{`&A2j^V>}SzY%}7Yn4HFUuQ&-+R7XT`w<-8zY_<2TrT`0yb!u`;~Y-?0_T88ih$IS^9Hwwz#i=lw34M7XjrlDga1yJ>)MS4bH-51s~UT11m&}o4OK~L;<4`eFjIOkw6i>7^VoY zSHY+?o~wb3Er2F^i28-O7SxIzu}wlHq-hHVM8BCx>X zUNxm)jPVSnI|E428xhz;OuzwThoFdRI8aPBk@JuiK5L+9i8B}p=8hU3RSU7jEjoyx z3NomI5Mkj|*r_x{OXyK^L+{eZmNhK^bDY3{bXbW(`kv6-JlYYvbUEvX+*CNjDuxJ6 zPk-hyI^D7nYmAsOt;&cVVyR?+D2Hau3=onSvfRVUW&T@2M&{1tb4X_u0ODDlvM}I= z46K|xmIgrFu!IrxbdDR$YX(qSnJHf;6q6}mARL*)Y)AT~L*xcon;Mvs&YL+-d zq_pxkn5;?VC=~-FSVCkJ7l`QS{{k{t*w)mmB`d%S+))*5Yh{g?3j(5n)UsqvQYms9 z<`R7t>mgW%AQJQrGPn+gV#DH$fCLTBlT{#yXbjIv5~DSOI5vzCQY{if2O%Oy$*N!| z5;`+1+c3tSD1s9s#{;B>(3TJkq-3&|ISuA4#MT=qbz^GI&VvSieg<->|MX9z4O%vcQVU?R30 z2(4;Fs*&N20AvniBn2&v4Vc$i*V&|bQ`TI@lxYU_HpopE**~Z8aN76Vd9XPTD3>!x z#5Wl$?82svnLa*EG1gTWb3>Z*j6>E;1d396!U5_nZrCa|u!}KRvHp<17z-m$ho!@0 zqOEP3L-xr!&6GHEt`8w|+&w(4rqdyP16Tq^3`WiqNLg$m0m#WT%>e;RA&hsHN^u6u zMpMlGET$qk6s<{iXyYL#y{4DD6uHupDLW1^7z`CQ*fM`G{i+4p;SPJB<=ZB@mfV&V zAr5&n<}hpr)37 qQOK;5A!Pae&El$TKO`#`emnj9oal=3`t8m1R}1Oi>;IR(VfYV~J=x*_ literal 8842 zcmeI2&2HOB5QKB~Qy4t&fz|xat1K3RB5^HYEz{9YfFSU@XGWGB@hcm->@hhwCWoBq z>8`G>Y5K?A{eAIm+#j~nQ}Ox!N4m^6%D3Os)pnh({yvZ7QT_Gj*Z}2rhA3dtGF(fMpn~) zT&y@##RtKH{fjq!-NIK5p1J= z_{8mD5^zE~fRrctP?TR5OLJ0*O%V;2`^X!S>)j}dEn3a0%T%=)$G&Bi)$eB9kQGk8Lr_4q5yQq;qR{DDQMm&@Sfy@YtQv{D`1eHl$i;#kLbEka3vxzmEISkYw zl|lfSN+=g2$RJSdh806kX@WOcu)P2?M@8*P&J+)ICfhoo!f<31Np`as6M0r|SUuU0tfxl5Gk?tL?xM=05(Cg$ioYe$6OURk51yYwxyCVy+~=8NL%Y1*H5 zi%sfurj8|=k^#;cxDdBPz?(~1xD2m^rzue~0W%^zrRKG>!=_9}HhjR2rPO2U0bo`} zmLwj8gOb4dGXN{gPYHn#CS3Udb5z_^Vy_QTbJ#vSEsv*t{xAT{ka*4Aeyn66W8%qh z2ihZOH~}TzJF1X2FfV!7Fi~M^(4XEOV+k_lV(e`s#$G}YdGd4slo}vIMy2du8MnG% zwMl7)jI`J)up^8YT%$(1LrgSN(m{%5P=cvtd?9wt#T>9=HD@IG5;zA@L6J7CK|~D( zN~51Zs`e>GEFB#8 zP7aY{`oQ$J9sNv}1lvKLt}OKS1i!M#WQrYP!KftE)SdaTyzHmbQ~uaLlN-gC{6ToJ zO<#oH6)V&pc1AEZwSb3Uw0*GP85nu$+`vkOM5JHIo2+~$jIC?W#+*|i5BfYnlN?yE xMQLp>*ip%V4>zz;Wa5O$&)jW?55aU%xX16$S*@sS-=55W$&mlO{(t$qhM%>4-QWNK diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json b/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json new file mode 100644 index 0000000000..6eaf11a788 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json @@ -0,0 +1 @@ +[173,50,8,34,25,140,227,142,53,135,194,216,242,27,172,247,219,172,219,175,172,23,135,155,49,211,157,167,27,158,0,180,152,206,45,235,171,83,75,48,116,32,125,175,252,120,93,39] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json b/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json deleted file mode 100644 index febf179550..0000000000 --- a/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json +++ /dev/null @@ -1 +0,0 @@ -[140,166,219,3,87,141,69,160,158,153,22,179,34,58,44,164,191,240,111,196,114,27,180,199,89,247,126,103,234,93,92,229,246,192,127,27,164,78,63,100,86,79,205,231,251,65,175,178] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/msg_2024-03-18T17:30:02.262237140Z_GetDataContractsRequest_f229a0e58a5c4fb050f57c087bf067bd9ccc29eca3092a5664a5a9ba3bb7e967.json b/packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/msg_2024-04-05T09:03:09.929228702Z_GetDataContractsRequest_f229a0e58a5c4fb050f57c087bf067bd9ccc29eca3092a5664a5a9ba3bb7e967.json similarity index 96% rename from packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/msg_2024-03-18T17:30:02.262237140Z_GetDataContractsRequest_f229a0e58a5c4fb050f57c087bf067bd9ccc29eca3092a5664a5a9ba3bb7e967.json rename to packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/msg_2024-04-05T09:03:09.929228702Z_GetDataContractsRequest_f229a0e58a5c4fb050f57c087bf067bd9ccc29eca3092a5664a5a9ba3bb7e967.json index 6aaa19f53e32034f8c230268df426149a3ed6b82..296425f4a80b663656a9f43a28d216b1b71346ca 100644 GIT binary patch delta 1858 zcmZWqU2GIp6wb_+(rsbyJ+u9x-Lf;=rTiF4yE{|5fc!*)0V54DAt5B&?gNc6QNY9~ zV5BwCfEsA&As#g}@Y;y9qz@v|G&~sv3Nc1w(zNiPkf3dS(psQ?cLo!GHreFP-aF@> z^Zo6&<7HoumyJ|fv7iue!de|`Zw+|8wYDHXtV$np6-X@1`(xt_GNeBwO5WvX1uQ(085 zsnfhEMl#=IITEbI_Ck%a{Q{rv_V|2-<_>IL!!$|X|99yYS2agqkIk~|q#T>S=tRmG=@Ivjg2<3{sM$7wXKuiMZ? z1P;(fW3J7+YoMp-JG#5(-b3~vu)YckZ{1}_qns1PH#Nyl@F*V}3_DU--LC}*&*AK` zZ6upa@B7L@WReW-+#PppaMk}~T4o^`dC@4LNH}%s7o0k)_(UDa!FtR20EEb-i=BfP zHBZ)P`5{z9QFE)E;9VdC{qoo=&@)(WvDIfIHI{En7rF?UG?$CN5*2#0S}q!e%~m<` ztYazZOkvN+SvqkS_h%JP#2wxoLpO~$2&M5KU|=WuW4EOF@4bva3EwFM@9eyQA*{mW2u4vsrJPhqzY?r9k|b!RjgLL$EmpK)ZQ5f}8kN$E0+ z(lnWc3UP_$d|#HaCfm|whXO^FXEBy3M7)fu1z}A7LxA; z;4qEvPz1CJG+*c3_F~LER6f%36gFzv`OFIkF8~JnmMVMp@rEFBzW5hL# z{6jj$@*-{R*p%TW)0x z1te2QRs$!=PbTM#Esc}6A%S)vspX*uo_07o{2wtrg>4_JpuZy@ZSPgwS_}BzBfe6m k2MF<;Z1=bD!%H?tdG(MJX3m^dbrF7PiPDsB z)AU`5p~s`f2^y%UCAl!ngb$P@|Mm-mCd%#iWgcISE04>KGEQSi{eua*wOjL-3o&@0 z2HQQ^sA*S3^YH{;#wt9gA;b3)D#7kT3~X`?e<0ItI)+9n3>^$KKUJ#?rGGJeYAL?t z16Q`BskoupPQ%lc7@WLe=(n|oyHiSYi--9Sx<*blPE){1qkP(YR#VQy{3QtGvYc@w zW_Z&wJe-VrG&SGwl{j9`#SEQ_YW@`|*yKklJi6MhY5XYmUyd1gh=+~;k{}4FFyq_k z@-waz2GqYZNe^1#JbD5f<`*d&l1Cf%Yr0-x_^oQ?(M{LT^ja-q8=9)t@&D|cZJ>iO zA6235mL#37&^Bsrl>iTvXsgChm*Mgh241K#{FOn9&x=?SQA6jeH65FADL>{?-w91^ zrG{>Ic>}IKvqN7|l&^59@TN=MM=@tcQxE3$%*3c0<0I{w_eqq^F-@b-YC1m0*b+`a zvUHu6su`YqdfX1OL2K`L^6DqziQ^o?D3}3nch0uXuEN zK1$hQ1cTY6N~tvUb@_Cq9bflo{tOl2i51x1ANKzl`96no<%Z6Eji?dn|79iPfBh3@ zx+^Z;qXG`g2DG~^;WVY`+sXu=T#9IW)@vthrmdg*Jm1HmIbc;R*=A9*Lx8F8FaqYl zBbtVR@K7zLwAUb!y`-u29Zg+#p+l#@3TlO{<8wToh%1+-f5h@Ne^kz{$&ZQDF(417 z5vV^}WE=F*)FCslSMyvb&nJ^OWz}+o2sq9{yh-JxLteWKJtIib%W)$q7)rchXgCog z-_iUj!s1y`PqLx)`wfl9ZOLr;_5d4nq9u?AlQ`ziQbhS8*sot>fCdlyf704pY6D{* zrKVB#2DZD!O?PMmuq-fwfZ<+8xe;^*_xLFJwiOuKT!p|v8DRk)rFJ*b*3C zPidU#sb)GnFTvXdw1*+=hjFaLn-EgWZ(8zuro=?Tbe5(9pYBA9s_lvxu18ZAGf6I1 zO?;>ht5?Gas8DLS;NYQmz2Tlkm~{+qwojxyhTe`KUU*k)sZU+VWc9m-Iv|Z;f3XIt zi1k>r;GH6)05_BZY;!$st-^qq(H0bPbe)cbnH+uJ>2qf_&e(^AkfMQ8i&YIjolv#n ziE@HRebsKU39MCa5lbmNichsRAev||dZ4ti5tE{;FhOfa^2vroRrr)I^=JgfV)L(+ zdfAx7CMvD82>vp#oy+8#A1gJ7;)M)3z#fe}=)& zBK~-pYNSh`K<)==ykZ~0(-4E`DmRH3W;;Za!u?PQsyAw@wFOU{!O#Nq%`jS|)%SQF tn83}V=^EUjzSN}?SliogE)NcVi&}3waEy`?b@QV|Aa}@H;?zQStx) diff --git a/packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json b/packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json new file mode 100644 index 0000000000..6eaf11a788 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json @@ -0,0 +1 @@ +[173,50,8,34,25,140,227,142,53,135,194,216,242,27,172,247,219,172,219,175,172,23,135,155,49,211,157,167,27,158,0,180,152,206,45,235,171,83,75,48,116,32,125,175,252,120,93,39] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json b/packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json deleted file mode 100644 index febf179550..0000000000 --- a/packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json +++ /dev/null @@ -1 +0,0 @@ -[140,166,219,3,87,141,69,160,158,153,22,179,34,58,44,164,191,240,111,196,114,27,180,199,89,247,126,103,234,93,92,229,246,192,127,27,164,78,63,100,86,79,205,231,251,65,175,178] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_data_contracts_2_nx/msg_2024-03-18T17:30:02.261742919Z_GetDataContractsRequest_93bdf343bce1bafb96fd873236cabbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json b/packages/rs-sdk/tests/vectors/test_data_contracts_2_nx/msg_2024-04-05T09:03:09.921211735Z_GetDataContractsRequest_93bdf343bce1bafb96fd873236cabbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json similarity index 67% rename from packages/rs-sdk/tests/vectors/test_data_contracts_2_nx/msg_2024-03-18T17:30:02.261742919Z_GetDataContractsRequest_93bdf343bce1bafb96fd873236cabbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json rename to packages/rs-sdk/tests/vectors/test_data_contracts_2_nx/msg_2024-04-05T09:03:09.921211735Z_GetDataContractsRequest_93bdf343bce1bafb96fd873236cabbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json index a69cccbdebc18d1217b71a85f9cac8f62c88e5ad..95b1bc2dbf532ab958f903f63d56529a98b9de6e 100644 GIT binary patch literal 8675 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 diff --git a/packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/msg_2024-03-18T17:30:02.345340351Z_GetIdentityBalanceAndRevisionRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_2024-04-05T09:03:09.939849246Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json similarity index 75% rename from packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/msg_2024-03-18T17:30:02.345340351Z_GetIdentityBalanceAndRevisionRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json rename to packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_2024-04-05T09:03:09.939849246Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json index f0ffccb180b02c7075a3bab60b6964c872394eb4..cbec48463037b91a0c7906b15c82bffd07c2dfcb 100644 GIT binary patch literal 19680 zcmeI)*=`)k5d}~`>nntQ_CrVZ?q4wsf+Mv>!lEd18Ne9m-(A_*W_JJf;p4}}ug9C)%j<88KYjddy6hh;pZ}h&Ev0k_T(t4++O@|O_{-BE7T<5K ze?3m?ba!)qJl*^;{rAU*A0Phkp)cxtYkYOQJO6xscRsB9^wP!g^2^2D^x0y)UoW2e znr?i$zB!(Kx;Vf5cJ}r9)8CGt&z>Kx-Ey$U;`sgg)5X-nFqg&M<<;@*>bAFAyK1ZD zZnv*P)!4%{pS$Z%*I&E?^u_jiU7ymomQCfV-~ZuH9I+rhI=x5o%L zec=0}L!2I1F`(7pR{eqP;D4tVmP05#v_KyRT5OF6V$^ML-&2!5v9r&0^nu+DywSAG zZV0|ppFR*{dh&$+^t3P|hV>6>49NZgBWfcg^!u&F5Eyig=+s{s5wTx8%OPs|ZH%;H z9T?yUs{L)Aey6e8#Nc@&3>3aNf@vSYKAO~GWAf;4)Cv=XJ2R_U0ywom18s!KI~)OF~q`6jj0+_c5k4xbO2nfSuO3<3d6M(Z`8Q^!z^p!)mRHd@_fLS{?IgZYuKswv{@ULH(X}L z1H?%rC;f#EZLYRDxq(@xuZWwGKX(TVI~?$ym}JGUM8=Ws_ddeo!ei&|!7N+DF2w^Q z>{NZB7g&>v&5^~Sw-BJMoU{^R797NOrOy@y4bhr9HrOtTV0R(Rv#+*^sj=oURyGU$WR!(8iMLL%5i|7Fr zF7A%N3IG&B8)ge))RvKl_#pVdLP3Rmu>?J4B3}3NNOmQ=FR4qA0x6-%ficAT&qUNd zsKU5Wuggha@B0psn0=Q zk|!AD6-jyAi0Um)n^AKdVW~(wJPhb~X#jH{^U?F$m(ILQ3#klQbTYLHQ6&&p{UJbJ z0P=;{xllON@2z~*Dw%^G7d{`LYxGO|O5)gLSQ=a}*a*?oEJGyMHW%!%%zat*pHh>TaKP0y;&Bxliv`yG%IJL&R?%zA(etHGzK>afv=Gah3PWs!7^F@jTqi_pEt@#bVn>Y<+EExLg>5WV zdrT3T-}DoSKe7ov85}s&qu^J;;l}d`rwnF!W+784=8;<>69@7W>#VRn>VwgKlZb{# zxb5!dTM3ckv`#52Or1^vC=`8Woe0QkyT_F;WM~07p_HUM=*7aWEY49y7xIA6Qp6w^ zGb+0|B2^qd;J(#qoDPsbx4;Y4nlyd9qTNCfimf%1aOlq!!vMybi&G{k-P|0RO1>>L zHwR3+v7MqNDi&0p=e6vi`JO>vXffS(r9_yqo8APXqbbVOOr8KLE(3FM3Xau~zBfXE9(CRG~ zQV-&S5W|il zD7Gi3?^w(oS-305>Fu#uz$wRPk*u-3tv_NF1ppsacz;zqmgeoD_d8@jn!14-&_I zf+;|BkYtugK}3&39wC;Mic6eVj8O*YOV;B|j_O9mZaMm>fcy%?;}DQQ>AYJGzi&8p z8MFUW4Uvxph*I0>ax6s3kV>cj0~?NHa4rEdF4eSRw@cxyB8s(0)NKK^mh7R-23gIW z8D?3QRi;-puFzaud6Q5Rfg|T+O*~IQLUMe|E9y_rEQwvAnum%e21nH$U+yr|fmHGu z^=R*#W<}c+ztk?wJq%yTla(^qlYkF|*Gr|ClU z3qd-Iq)=VhUr1?}>=)Ds$cgU>hEAi~t1hb?Vc2lFSP8*H7EyXo9CV2d2@_Gs)n=xU zuhr;ckfg3SG8DpcZ8d#q1Si%*1-B#@B*1t+s6YtSw4kqtEiHed4v6nE#Hj$4Y&mjx zosjE-hh7#0*!Xf8Sh^F(tk4O>~i|epw~!BQbqMe10!WnaWTHW zCtfkF1gTC3b0)F9Am>T}Zq9+DXqJt}k=!`l8oz84TN(ksx-gYlM2+Q1Wa#z&r)1@k b-`@S>d#5W?_4WK@|G}&N@8SQCKY#U4qBMn! literal 20816 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 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_2024-04-04T11:53:53.980843000Z_GetEpochsInfoRequest_b2b426ac4a52cb4cb08904c63386caf3663c40a12d3b03827006d66058e439ac.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_2024-04-05T09:03:10.028576958Z_GetEpochsInfoRequest_b2b426ac4a52cb4cb08904c63386caf3663c40a12d3b03827006d66058e439ac.json similarity index 99% rename from packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_2024-04-04T11:53:53.980843000Z_GetEpochsInfoRequest_b2b426ac4a52cb4cb08904c63386caf3663c40a12d3b03827006d66058e439ac.json rename to packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_2024-04-05T09:03:10.028576958Z_GetEpochsInfoRequest_b2b426ac4a52cb4cb08904c63386caf3663c40a12d3b03827006d66058e439ac.json index e95d5354bead7cca8b681316da154a76c945a837..b7fc5cddcfcf48226c6983ee733f50114cb83130 100644 GIT binary patch delta 2258 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 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.632500304Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_2024-04-05T09:03:09.942621472Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json similarity index 75% rename from packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.632500304Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json rename to packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_2024-04-05T09:03:09.942621472Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json index 3d60f5d3616acc3492c9a7b212bc8dc0d34f8727..cbec48463037b91a0c7906b15c82bffd07c2dfcb 100644 GIT binary patch literal 19680 zcmeI)*=`)k5d}~`>nntQ_CrVZ?q4wsf+Mv>!lEd18Ne9m-(A_*W_JJf;p4}}ug9C)%j<88KYjddy6hh;pZ}h&Ev0k_T(t4++O@|O_{-BE7T<5K ze?3m?ba!)qJl*^;{rAU*A0Phkp)cxtYkYOQJO6xscRsB9^wP!g^2^2D^x0y)UoW2e znr?i$zB!(Kx;Vf5cJ}r9)8CGt&z>Kx-Ey$U;`sgg)5X-nFqg&M<<;@*>bAFAyK1ZD zZnv*P)!4%{pS$Z%*I&E?^u_jiU7ymomQCfV-~ZuH9I+rhI=x5o%L zec=0}L!2I1F`(7pR{eqP;D4tVmP05#v_KyRT5OF6V$^ML-&2!5v9r&0^nu+DywSAG zZV0|ppFR*{dh&$+^t3P|hV>6>49NZgBWfcg^!u&F5Eyig=+s{s5wTx8%OPs|ZH%;H z9T?yUs{L)Aey6e8#Nc@&3>3aNf@vSYKAO~GWAf;4)Cv=XJ2R_U0ywom18s!KI~)OF~q`6jj0+_c5k4xbO2nfSuO3<3d6M(Z`8Q^!z^p!)mRHd@_fLS{?IgZYuKswv{@ULH(X}L z1H?%rC;f#EZLYRDxq(@xuZWwGKX(TVI~?$ym}JGUM8=Ws_ddeo!ei&|!7N+DF2w^Q z>{NZB7g&>v&5^~Sw-BJMoU{^R797NOrOy@y4bhr9HrOtTV0R(Rv#+*^sj=oURyGU$WR!(8iMLL%5i|7Fr zF7A%N3IG&B8)ge))RvKl_#pVdLP3Rmu>?J4B3}3NNOmQ=FR4qA0x6-%ficAT&qUNd zsKU5Wuggha@B0psn0=Q zk|!AD6-jyAi0Um)n^AKdVW~(wJPhb~X#jH{^U?F$m(ILQ3#klQbTYLHQ6&&p{UJbJ z0P=;{xllON@2z~*Dw%^G7d{`LYxGO|O5)gLSQ=a}*a*?oEJGyMHW%!%%zat*pHh>TaKP0y;&Bxliv`yG%IJL&R?%zA(etHGzK>afv=Gah3PWs!7^F@jTqi_pEt@#bVn>Y<+EExLg>5WV zdrT3T-}DoSKe7ov85}s&qu^J;;l}d`rwnF!W+784=8;<>69@7W>#VRn>VwgKlZb{# zxb5!dTM3ckv`#52Or1^vC=`8Woe0QkyT_F;WM~07p_HUM=*7aWEY49y7xIA6Qp6w^ zGb+0|B2^qd;J(#qoDPsbx4;Y4nlyd9qTNCfimf%1aOlq!!vMybi&G{k-P|0RO1>>L zHwR3+v7MqNDi&0p=e6vi`JO>vXffS(r9_yqo8APXqbbVOOr8KLE(3FM3Xau~zBfXE9(CRG~ zQV-&S5W|il zD7Gi3?^w(oS-305>Fu#uz$wRPk*u-3tv_NF1ppsacz;zqmgeoD_d8@jn!14-&_I zf+;|BkYtugK}3&39wC;Mic6eVj8O*YOV;B|j_O9mZaMm>fcy%?;}DQQ>AYJGzi&8p z8MFUW4Uvxph*I0>ax6s3kV>cj0~?NHa4rEdF4eSRw@cxyB8s(0)NKK^mh7R-23gIW z8D?3QRi;-puFzaud6Q5Rfg|T+O*~IQLUMe|E9y_rEQwvAnum%e21nH$U+yr|fmHGu z^=R*#W<}c+ztk?wJq%yTla(^qlYkF|*Gr|ClU z3qd-Iq)=VhUr1?}>=)Ds$cgU>hEAi~t1hb?Vc2lFSP8*H7EyXo9CV2d2@_Gs)n=xU zuhr;ckfg3SG8DpcZ8d#q1Si%*1-B#@B*1t+s6YtSw4kqtEiHed4v6nE#Hj$4Y&mjx zosjE-hh7#0*!Xf8Sh^F(tk4O>~i|epw~!BQbqMe10!WnaWTHW zCtfkF1gTC3b0)F9Am>T}Zq9+DXqJt}k=!`l8oz84TN(ksx-gYlM2+Q1Wa#z&r)1@k b-`@S>d#5W?_4WK@|G}&N@8SQCKY#U4qBMn! literal 21981 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 delta 1860 zcma)7OK?+F7@j1B;Zb`3a{x0;Xl_curuLCEF=kFQ-R_PZd9l{T|i~V5nRCF_ut@*nCx;=tFHyS+KEtsei)N_0=X>qAb@O+C!IaGcA$%sMwO2K^E;54`TpY|>zx@*iO+@&w)Sc3)|W&} zt&77$4zAQ1yu;nHL?F`bc%5vob?}`raK{a1+8n&;7rgK}yaZ1+3fwV4g`Jf`7C*ki zZh8z(gbaH6?X{z+jv5sCGCNp>?wlbUgz()O2fc(%^uF1_A~((sRR8byIhg6tdl$d> z>bycqJ#x0oMUG6wx_Z#(%F8KXPODzJZG60XX`Ra8bQ|aK{_d#3mAGIXQMh3o?8_T$ zCJUQ43Cd~l#qsOL7*-Rz+y+4|WPKUT<{I!>M7*B9$qUPM(B5hx4FVnCA28_cCc{xd zSFI3Hi~MS0q5X63{XxNEUmYrJ^I_N^+-PuWM6hJZz)FL|Y`0V+xUo}khT}YIyJ{VO zDvlSgy5w2KWNxKZA1piG*wt4ddmaWW?I)o{`E_w5@;BAF-DXo_f#uXo1SQvKnJZH=P~7G zQki8(w89D6wL;XEDEm{i>;wr6yB6~l`vki`Pa&wlRd4rci;q)+drbzn*v&FUqy*iH zQLno=H(1AWIHs1L(so56u_Lq|`F_>3E2MQ>T4y21?!1hF+Nfd{7i~(t8&;`FJnrhua_8>iI19P zN59n+``$)ynV>9jTA9mA>_Yv~y^1uk`Ny1kkb-}{f~iZ<<+8?WXErK$#J2LxqFMUB zL^^6|5Cuztyx6q`Dn?B^U8f10Z?t%@*Z3*4lOfl$uujz=91a+qBd!{lij=bYf-0#U zqMBId_NeQzT4cnXr@fbk#S`p-tcwRDULKz;xS9rhoJ1_>dik$3|G~IUWl$W5c<$BD zM~U1xjSSGe77qjZnGrufN>UhGpN{`W=5$QIKkVUgh{YXcJ`*}T-KJtO_<~=YN(Xa@ zMpw6JHqQkuK4j1OAEtyK(6ox5I!kHLC_YVbjqM?xv`!Dd5I0!L62C~xD;zRxabSG( EZ>)Y;l>h($ diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json new file mode 100644 index 0000000000..6eaf11a788 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json @@ -0,0 +1 @@ +[173,50,8,34,25,140,227,142,53,135,194,216,242,27,172,247,219,172,219,175,172,23,135,155,49,211,157,167,27,158,0,180,152,206,45,235,171,83,75,48,116,32,125,175,252,120,93,39] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-2ca9a9abc345b3e592538a9ceb7bc8321622c21e4a2874ab7e481c6267201326.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-2ca9a9abc345b3e592538a9ceb7bc8321622c21e4a2874ab7e481c6267201326.json deleted file mode 100644 index fb09519887..0000000000 --- a/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-2ca9a9abc345b3e592538a9ceb7bc8321622c21e4a2874ab7e481c6267201326.json +++ /dev/null @@ -1 +0,0 @@ -[185,34,149,202,37,202,240,51,209,243,187,197,33,87,122,32,22,127,83,1,88,217,241,161,169,150,46,177,216,239,225,34,200,117,206,68,9,199,159,124,0,183,99,59,149,195,154,31] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_2024-04-04T11:53:53.893142000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_2024-04-04T11:53:53.893142000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json deleted file mode 100644 index 6bf02b5db604f4523f6e312c977079d471fce36f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21988 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 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.629451923Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_2024-04-05T09:03:09.987325755Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json similarity index 75% rename from packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.629451923Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json rename to packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_2024-04-05T09:03:09.987325755Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json index 3d60f5d3616acc3492c9a7b212bc8dc0d34f8727..cbec48463037b91a0c7906b15c82bffd07c2dfcb 100644 GIT binary patch literal 19680 zcmeI)*=`)k5d}~`>nntQ_CrVZ?q4wsf+Mv>!lEd18Ne9m-(A_*W_JJf;p4}}ug9C)%j<88KYjddy6hh;pZ}h&Ev0k_T(t4++O@|O_{-BE7T<5K ze?3m?ba!)qJl*^;{rAU*A0Phkp)cxtYkYOQJO6xscRsB9^wP!g^2^2D^x0y)UoW2e znr?i$zB!(Kx;Vf5cJ}r9)8CGt&z>Kx-Ey$U;`sgg)5X-nFqg&M<<;@*>bAFAyK1ZD zZnv*P)!4%{pS$Z%*I&E?^u_jiU7ymomQCfV-~ZuH9I+rhI=x5o%L zec=0}L!2I1F`(7pR{eqP;D4tVmP05#v_KyRT5OF6V$^ML-&2!5v9r&0^nu+DywSAG zZV0|ppFR*{dh&$+^t3P|hV>6>49NZgBWfcg^!u&F5Eyig=+s{s5wTx8%OPs|ZH%;H z9T?yUs{L)Aey6e8#Nc@&3>3aNf@vSYKAO~GWAf;4)Cv=XJ2R_U0ywom18s!KI~)OF~q`6jj0+_c5k4xbO2nfSuO3<3d6M(Z`8Q^!z^p!)mRHd@_fLS{?IgZYuKswv{@ULH(X}L z1H?%rC;f#EZLYRDxq(@xuZWwGKX(TVI~?$ym}JGUM8=Ws_ddeo!ei&|!7N+DF2w^Q z>{NZB7g&>v&5^~Sw-BJMoU{^R797NOrOy@y4bhr9HrOtTV0R(Rv#+*^sj=oURyGU$WR!(8iMLL%5i|7Fr zF7A%N3IG&B8)ge))RvKl_#pVdLP3Rmu>?J4B3}3NNOmQ=FR4qA0x6-%ficAT&qUNd zsKU5Wuggha@B0psn0=Q zk|!AD6-jyAi0Um)n^AKdVW~(wJPhb~X#jH{^U?F$m(ILQ3#klQbTYLHQ6&&p{UJbJ z0P=;{xllON@2z~*Dw%^G7d{`LYxGO|O5)gLSQ=a}*a*?oEJGyMHW%!%%zat*pHh>TaKP0y;&Bxliv`yG%IJL&R?%zA(etHGzK>afv=Gah3PWs!7^F@jTqi_pEt@#bVn>Y<+EExLg>5WV zdrT3T-}DoSKe7ov85}s&qu^J;;l}d`rwnF!W+784=8;<>69@7W>#VRn>VwgKlZb{# zxb5!dTM3ckv`#52Or1^vC=`8Woe0QkyT_F;WM~07p_HUM=*7aWEY49y7xIA6Qp6w^ zGb+0|B2^qd;J(#qoDPsbx4;Y4nlyd9qTNCfimf%1aOlq!!vMybi&G{k-P|0RO1>>L zHwR3+v7MqNDi&0p=e6vi`JO>vXffS(r9_yqo8APXqbbVOOr8KLE(3FM3Xau~zBfXE9(CRG~ zQV-&S5W|il zD7Gi3?^w(oS-305>Fu#uz$wRPk*u-3tv_NF1ppsacz;zqmgeoD_d8@jn!14-&_I zf+;|BkYtugK}3&39wC;Mic6eVj8O*YOV;B|j_O9mZaMm>fcy%?;}DQQ>AYJGzi&8p z8MFUW4Uvxph*I0>ax6s3kV>cj0~?NHa4rEdF4eSRw@cxyB8s(0)NKK^mh7R-23gIW z8D?3QRi;-puFzaud6Q5Rfg|T+O*~IQLUMe|E9y_rEQwvAnum%e21nH$U+yr|fmHGu z^=R*#W<}c+ztk?wJq%yTla(^qlYkF|*Gr|ClU z3qd-Iq)=VhUr1?}>=)Ds$cgU>hEAi~t1hb?Vc2lFSP8*H7EyXo9CV2d2@_Gs)n=xU zuhr;ckfg3SG8DpcZ8d#q1Si%*1-B#@B*1t+s6YtSw4kqtEiHed4v6nE#Hj$4Y&mjx zosjE-hh7#0*!Xf8Sh^F(tk4O>~i|epw~!BQbqMe10!WnaWTHW zCtfkF1gTC3b0)F9Am>T}Zq9+DXqJt}k=!`l8oz84TN(ksx-gYlM2+Q1Wa#z&r)1@k b-`@S>d#5W?_4WK@|G}&N@8SQCKY#U4qBMn! literal 21981 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 dev|MX{`}NfOP?XUSzdeFXZ!c{|1avXOws-vyG* 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 b-`@S>d#5W?_4WK@|G}&N@8SQCKY#U4qBMn! literal 20815 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 COe0|c diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list/msg_2024-03-18T17:30:02.769567913Z_GetEpochsInfoRequest_734f6594c67fe6a9ab170191031d592c8fe7361bed628d9a36747664c9789bf1.json b/packages/rs-sdk/tests/vectors/test_epoch_list/msg_2024-04-05T09:03:10.383446704Z_GetEpochsInfoRequest_734f6594c67fe6a9ab170191031d592c8fe7361bed628d9a36747664c9789bf1.json similarity index 99% rename from packages/rs-sdk/tests/vectors/test_epoch_list/msg_2024-03-18T17:30:02.769567913Z_GetEpochsInfoRequest_734f6594c67fe6a9ab170191031d592c8fe7361bed628d9a36747664c9789bf1.json rename to packages/rs-sdk/tests/vectors/test_epoch_list/msg_2024-04-05T09:03:10.383446704Z_GetEpochsInfoRequest_734f6594c67fe6a9ab170191031d592c8fe7361bed628d9a36747664c9789bf1.json index 603ad6b1ea3de3247b7139f27a6873f22a7a2a5c..a399d8254b8f080867d339cc89ceabb4912f8892 100644 GIT binary patch delta 2001 zcmXX{TTEP46wRF(puFasGo2Q(?aWv^727z&V_KjZFw{1tDuW+wj7@+hTBAY6)M!X6 zkE9%CI#&uQZL#7&F+FYba4`8ETAaLoF^G&5l{xez8DP-zV5g4dC(0 zZ$2zn@K$#Ok93$XY~XG77muO8f5?TkCM>(sSc>sO_Y2|cj4_m5%GLG~_9HVm7U+OO z?;CjZ?1iuBdXA>#G(zf1{s+yJk0fLtIC*aGAO z1wbKC1QY{aKmi&sfDhOT_Cfn7iV2m&GCF<>|FII!nd(i8q? zJ4H)DQR6qr`e92ElGq>iQFpJ_G}ocDU7v60{uP{vM40b!kG408jdMw=B5V#H#fi)) zY&4c3>;8z=b`a+iZ{}^CtfbrwB$!r-7XkP{N&d3*^fTNhw{vp;Y3|4LTH|W)4#41V6P8vZ6RDpr4iQf zVcb#;ejiOtqf%YH*b@akY$y&onmId(?Ay;Hd=?I+?s*K<1Cb0MhH2 z%WD)p^PVqA^_LO!+Bs_%#m934GcX8hm}Ncui8kp6m)*Tc|G#2I zEnf6;29~6{bzR(KwJvREw<)TxfPc2+lv4y&SI@3bp>*;gRI=4La*)Yz<2aUcVFVy` zZr$QSomXJfTZC(8Ujo&sQ7kj3v6Rr_dm#0ZePOsgoufH@TIBoO;G#y+lv;3ysHaye z3iRT{{wKoK)cBoS*~+CTdmLsH3%E4Qvn1Vy{8k6x<@4WBHJ>M@BPD2fnqQq6c7qqfVT8rZr&q2FqS&=A&XC#f?#N(?I z=!f()@(OhzFXjY;!$A8A4iG6!TzG@s#S;lD-T2v>tAqhyHiebh3u zDH73=#3fboHsRLT*SIB>mjNXdW~M-NJ&M5k#y`PF@fb*w6r}Z43|{WsL$8XoWiNUS zjBr;W4>Q!@S9E*c(pC*kMZ-?*b|N`01jd~nIt0nDjTAwODa64^x?(k~ Hxaa=|s$8_c delta 2102 zcmX|CU2Icj7*5yijP9r3cg{Lt6WS`A_%m3ySvsamyMW3R9p`n>NJFP^6D`F@`F zd7k$@UoU;+`4PBqySlS;U+2YdpZE4eyD$E|r>>)WUsn&lclVe*p4Y3oqGr@{-Gu(t zbRp)^RD5h{%8gq#g&G?*y?Cfr)A8F%Q~tGprqBNIYKp95UHl}LtekGplzG$Rn6)KE z;V)`!N4E>KpO- zseBg9$~!$uYWaAoR?+%naGAY@TS9+&c#}DGPlW|yDNTHsYCt&&W1Eo#63Rb_2xD?JISrITO-vA+4 zjU4O;jYB8kCfgM0snayL9ek!@7C0WobrM~6*rb$0nf+SR@)DP_?g^RFHbsRMUx+F@ zP}AC7OUYlAyH=Qv3|K)E4k$W2jlU~Rw#jo2ks)E!J_nNJNS)?KbZrb|M1(STL_ULB zMAWfwpm@9&MA!)q9^^$k(BSW=A$RXV{QabKuQNm`SMQKZbqzUMK`5HkV2Liydwg-JG_OYYXSkJisB5e(Xq$f~YjR z{|fd>J5>BQxKQFml$Z>=q0#|IuFfylXft1r?YE$0yo62Z^H?gBlMm3wss-B@2%CXz=i(zZjSu#ABRjKOaWFTi_)1B_Q|ZR`HmE54-<^YY z;%;sL+ZMkB0r@%0HcTAEI++cUHwmeKk}Dw{{@=)8D^_iN&h0iyB&QxRG@%A9BxO1v zXJ&N?BLs~?y}uxb^L{KrWF<^&lX#o;fx%!i=!zH%)8Hb*YOD%jtbC4jGB}5~VB7@T zT<22B+ClMtru;rA$OIMgyw%&a_a!>~f*U1u49>_6Qj`v%GHx&vX|QQF3IPT`LG0)K zXtKYMv57m-NqQn%1S2UpIe-h~sn7~4JPBFinTfaCjf#9eFwBXm3}vo84@oV#M7`_A4f>3gI%-hjCnyxmZGoQrq|X%m%FKjC&6 kG4gXIhWpqWbpjRMFX3adl|yNGVxiTmVm%uioh~=>AMy8~#{d8T diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json b/packages/rs-sdk/tests/vectors/test_epoch_list/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json new file mode 100644 index 0000000000..6eaf11a788 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_epoch_list/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json @@ -0,0 +1 @@ +[173,50,8,34,25,140,227,142,53,135,194,216,242,27,172,247,219,172,219,175,172,23,135,155,49,211,157,167,27,158,0,180,152,206,45,235,171,83,75,48,116,32,125,175,252,120,93,39] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json b/packages/rs-sdk/tests/vectors/test_epoch_list/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json deleted file mode 100644 index febf179550..0000000000 --- a/packages/rs-sdk/tests/vectors/test_epoch_list/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json +++ /dev/null @@ -1 +0,0 @@ -[140,166,219,3,87,141,69,160,158,153,22,179,34,58,44,164,191,240,111,196,114,27,180,199,89,247,126,103,234,93,92,229,246,192,127,27,164,78,63,100,86,79,205,231,251,65,175,178] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_2024-03-18T17:30:02.341524594Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_2024-03-18T17:30:02.341524594Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json deleted file mode 100644 index 0a8e8600ca09a700408f8f9ba5b813e02fd3a1c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21965 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 b-`@S>d#5W?_4WK@|G}&N@8SQCKY#U4qBMn! literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_2024-03-18T17:30:02.764646694Z_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json b/packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_2024-04-05T09:03:10.414834086Z_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json similarity index 99% rename from packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_2024-03-18T17:30:02.764646694Z_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json rename to packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_2024-04-05T09:03:10.414834086Z_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json index f19c4ddd52f879c7d52cc16a8dfdadf40f06c2fb..f33e39011c8e04ab11102b16aeb4e8cc76be530a 100644 GIT binary patch delta 1992 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 ZZ?!my*hcR)fR{z-dLdF*+qCs;$A1e(&6WTF diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list_limit/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json b/packages/rs-sdk/tests/vectors/test_epoch_list_limit/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json new file mode 100644 index 0000000000..6eaf11a788 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_epoch_list_limit/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json @@ -0,0 +1 @@ +[173,50,8,34,25,140,227,142,53,135,194,216,242,27,172,247,219,172,219,175,172,23,135,155,49,211,157,167,27,158,0,180,152,206,45,235,171,83,75,48,116,32,125,175,252,120,93,39] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list_limit/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json b/packages/rs-sdk/tests/vectors/test_epoch_list_limit/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json deleted file mode 100644 index febf179550..0000000000 --- a/packages/rs-sdk/tests/vectors/test_epoch_list_limit/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json +++ /dev/null @@ -1 +0,0 @@ -[140,166,219,3,87,141,69,160,158,153,22,179,34,58,44,164,191,240,111,196,114,27,180,199,89,247,126,103,234,93,92,229,246,192,127,27,164,78,63,100,86,79,205,231,251,65,175,178] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_balance_read/msg_2024-03-18T17:30:02.341682532Z_GetIdentityBalanceRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/test_identity_balance_read/msg_2024-04-05T09:03:10.038335770Z_GetIdentityBalanceRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json similarity index 68% rename from packages/rs-sdk/tests/vectors/test_identity_balance_read/msg_2024-03-18T17:30:02.341682532Z_GetIdentityBalanceRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json rename to packages/rs-sdk/tests/vectors/test_identity_balance_read/msg_2024-04-05T09:03:10.038335770Z_GetIdentityBalanceRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json index 64b029e19e0c378b52e54eddfcb11ad29a4edf11..0b46cf49d2f672a809fd6e71a0aa3bfdf664606e 100644 GIT binary patch literal 10626 zcmb7~%Wfk#5Jj{0R~Ws{qO1CyUkL(1V|Oeew&lpu0Kvfj9+G~jc&?p6vY3c$HXp@X zw{BJY$JO<9^L;%&?+=g7Z`VIkGk3Hfzf)^}n_9n@C;4eV|N8OU;_syk4~8K&{L=7l zyfoU&&%rLgZ3&3UfQkuyWJ`EHT~Q-?`x$8H;3c8x!G;^kDL3$&0p*7=3}T$ZLmkP zJ{@j$X@+o?=CprUHxJKwUYpFjcA92e%;E~^Jg39W;eK-gXRvJZx^_WkbGv=sJ#0^F z-pclVGmOofbza_g+#J{E^L;+ZE5HlL(+Y<_tFCmgyKKhWZ=3gr7ue@_!VYpXz@#+W zfQj6J;cPAe*Jb#C3FiQxGN27m$sJ3ubQuu9n%mJ0%Jb+-xg)@^JRh;8fhTIQ#R%Tl z889F^UmnnN%M+H2j#XxyF(9G;{a*9)WM;>l{?lDfybBt}I;^_D^k$p_rs6KW!vJqF z15VN5n2~qOvALtjzhyw=;MWdJS#fb55xg`vBPZu}#ml*);^y2D`MC^;9GyEX@^tAS zNS%-|aRb0Sa(A9G@^@}W?#%7T zWl!`VCj+~@B3@XNm7txrbq7{v9E#lKv_ePAibFYhz-Sn{91ejklG(5;Ps$F9d}NU_>e;mj!q)qIalfTs$b2U&_5O9+6&*PUCcB z=M+wso53e^O!AG>FNs*VsYqWZDH_$Lq=dLTV`j~eNN`FlzyM|p!u$$eiLq2Hno8Gz z6|ZELOEM8NIYBwYqb6LfphH-mhUOtuT5wI{F{qFc*qwI68C-+`_UQDQg)@k_fvbaf zs7#o35IblKb&A3xL1O|FCc!llIRZ|GCAoLurc~vt(Wy~{1W&h@d#xvQ#xY?~0>u{I z6PJ`s9ye*kj)~W5Qi^k+i50j-Sdo1F-;>e8Hh@ZvB_?BGLJ}|L?NWVXK4NqyW27V5 zQsh*1{1V1+Y)Sl0(n0c$luj2|nu=E7CKW)F@Jk<%x+Ce5B=r0tW=V{B-Y{J zXo|?7VHh)vH4(mGgbeRSEX(Ljr;{{lWGVsiB~(E!p=J>Rq+dA9W(s0P5$YzsqZ*ZB zU>D=TB^@E(&2&);1ze{vur5hnnSg9!O!MjCOUOL$?;f|O^D%$mt^p%FJVPAwyB)Q( zs28z5i9$*+R9y^TMxtPOT&k&LFQd;Jtw~vG5|zmUQqBD2N)bz>a>Ng7;tZOCl3L_G z=%P{xM(mgIQnqEmf<8^Gi!JG}F1*g*VRSgkPYPH;9ko3#JpI)~oiB-&q>J-dD!WN5 zEZmSSiDS`{^aP3~`Ru7RcafiRZq{N%BuSB7qL=7N@g7PP(UB7xOHs6a(r^{^qa6$nkJ~%zxfi zIaBj3|54LspZ==pGm)ZYeSYf@a4^3RUNpjk;gK;!WV^ygUSU{qh7|=EPvZPaFVf>D z)i3$L$@14Hs7FYbinJ(kpz>% literal 11755 zcma)?*=`$05JmH>uMqg02Uc+zPJSf_2wGw+A(H4&l!3s|zh`>1u;v^&iXUY5EZx;r zw{9&xKQ1mWXW#e7$J@ih?6=Dw!?0bLzyBUax7Wky_wi10Zzx{f18m`S^*x2lCvEk0u;ke&k-Ry23ws(iCzxLPL z_h+MD7TwJD-wszd!xUvRv(xSUetZ8oPTa-3+hjky)b(|RVMC|G)!}Y?MrTp&>}Bl{ znzQTO& zcEOAVJx#*=I0ejG!+pC?OxLjA?$^-Y#xTSr1!(tW`bjF#o~Y@-IEJkl8G>FmNe|i# zLy9ovNSF!~jUgV!kkTZPDI6@RqM8^rakHjkqx>r@Dvw)0<{;n&493$SiPzk%3Bhnq ztxG0)P|jh<)GPABso8{f>NXQgY=CakAH#Pr^o3FYM$-&%ILE+VklCmwa#x5>B{lOH z*(yN$TvM?v$OC#JgBznY6gjL*1`5VE>Vla_P!;4*r6SC~axNJ_nM&az;f~@+piV?C zMPNx-i!uk*KmlS6KIpK3(rcwZ%uKXt`TrVPvEJxh$-IrO!6}2WA!+Xr=z79*$|=#q z{uW!=>x!?4pF2De%F{LwOFLOWol3hvJDg9sLTwNFO9^ydg&dlH zD3)OyM#99VqjoCVrUWVSnCO>M!E=HMkMh1?#1F$3wv>Mc-7Q%OxV-IY9+G^p_LQJg zZ6|?li^4vsnw#EcdL32&u4 z#2)v>k~9(+pv6-xz%_}YU^dEh1}moGz!X$?JV+wU$Y>Y(66+25vnm|sgh9lS&P5qa zB61Ethy@`^S4z@|3*M>Ty3dwi8;B(UYaR(ee0LxzMI=@TWKQ}A;V&)0^H-z>!d*p- zvUAlKLMM2DG6!=l_2USqRA|Q%p`IWU<)9OMn$J^JN@8f-AUsqPD-rr1ISf(Hi0^ES zjJ6@@1XF+le8L=sRVyGyr%_Kvgvur|CRCk7z%d{yTacg1bgborp6X6F4Z%nbav>=v zgJF`ES&9cC8(dPIAXrk7K@Hdsni|*#hFF0j0(vYy{(CZNI2c7@j^$On5GsmXN_=$Y z;V1&BSq{+wRGP9UW6ot^5)6;5PSt#8ZY#JcQaF{R4ZUi9}T7vtc`^k8& z${6a^Xd^Acp-C7jMj0M8A2S0M5Li$JnpR}COgx6WUBskhA`2xO*n9&Kn^liG&1x;O zMp3^@j-#BOhoC%o8;uP6PDn%+N# zXoK0`Plw~v{q|<~Hefj8$1y&eDmp7=>xu0~(IDMdT{?O%*<5ujJtIY(NX*zHP_a(b zy3IiP7Yx}&S5kyvoa|Ps*v2OCe&_^+{c@r@8UK~94u@qwMa|>w*N5Hd>DWG{0cPkf zQa4Wrk|nbHtim09j-Vk(OdF`g(gh{hj~$(4*`zfD5*7@KDn4>o3BbU?o=g&XB1C=k zAwFXeS0*T)AHGeR5|TbPkQh3f{a_9@z0?(ECE+7vCaq$3wIP`ex^X}#gi^Q7c> zczS4G(@qdD`_ew4+};k~P=1)KF!ylnKsJ@Z_2G@`6`q9APs9!I3pS~#SCTO!AL}KZ z27OQo0EMB>*eB$`fE`Tp$tI!JmVl2XnZPPJq4U#s*Zog(mDddS^v}1Jtqke;`;+b4 N-}dk2|JN^p{{^C-X2Spg diff --git a/packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json b/packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json new file mode 100644 index 0000000000..6eaf11a788 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json @@ -0,0 +1 @@ +[173,50,8,34,25,140,227,142,53,135,194,216,242,27,172,247,219,172,219,175,172,23,135,155,49,211,157,167,27,158,0,180,152,206,45,235,171,83,75,48,116,32,125,175,252,120,93,39] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json b/packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json deleted file mode 100644 index febf179550..0000000000 --- a/packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json +++ /dev/null @@ -1 +0,0 @@ -[140,166,219,3,87,141,69,160,158,153,22,179,34,58,44,164,191,240,111,196,114,27,180,199,89,247,126,103,234,93,92,229,246,192,127,27,164,78,63,100,86,79,205,231,251,65,175,178] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/msg_2024-04-05T09:03:10.102307738Z_GetIdentityBalanceAndRevisionRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/msg_2024-04-05T09:03:10.102307738Z_GetIdentityBalanceAndRevisionRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json new file mode 100644 index 0000000000000000000000000000000000000000..1d0d0d95446450f2ca0c26dea2686eb7727da475 GIT binary patch literal 18538 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 literal 14553 zcmeI3%Wfk_3`Mi{R~TAnAyUuIuLOahv6Zn9+nUJo0E2=5JzedG*yq^sCd*_oQNQZJ zy1cw(m49AbUQWL6jt~38{p7dHpZ#UKF@5{pU+u4V_ow~o$7X-s-~N4grM)&^|N8bj z>hEq=9xN91BF`5&Tb?hb=bwu>|Bh8@Dx*6;Sr9k*8} zu2$*j|DO%MmzV#69c2D*$HVts?o6u*PBy+ZxTJOCa-JVKe;*_cblu5?f!mqd${^*cfEOgH@bO&=4AKnaCOr+QLr>Q z?eBJ*yN99SRZLgw?D~&ZUG1Tt(CKh>xZRvtq9A+n-1oo?lk4rn&E592YeU)IZgM_( zG0)TMh$qM0!{cq6$urZmRhaZW9R3{L>TiB+cD(+wd3|`Mo%T%`LAxvq`Oedv7T$R0 zIU37Z@%r}qn$0hY4TtukIR0=Wiz^Q|DoYGEy0SLI4GuD=Xk&q4#T)~VN+v^_Gfuo? z8Qy+11d(JLLd^NmKsIXlxFwG^$%vlB+$SF;^Mw8LuMn)m?Hi$VF zkkjV#S3tLq`$@xSFj5V4?RC7339_+R&>~ZO;f2QlMggvkV67%;LjogaFu@F7vBa!K zLAmuwC&?O)hZklXc8!SbjWw1&I($Kw$V!3FeQ@T4LafkcPBF6%<`-gVnyfmajlwso zv}tdM9_alTBn-2{b&`-c2Q6<*)x@Wkqth(uWw@?Vt4%uCfHA~zuYf`!0$qx2hz954Ui#$*G#Nr$~6=4ibNY#k`7(2NU>T= z%u0cRUK6x5;X-y;qKB*rN*iQq79=grv#RaZgvP{(Do@KfAegdDfMD2Z(%NJkg}{!^ z8^BOV!{7xDi46)vVsqY*py8}IMmkC`u1l$r<&vz)E`q+L#fcS=Ptz*GEMTgR-bRXv z84%K^bz^-IY-5EsLlYG(Nmj_;Y8KtFz6J?oO?%r5pYV)KCtPdPoM+5AQQ|Hb0g~KB zZO0J8P)o)SdRt6MG~^ZHkdR2)K5NlpFs-7e?@Wd^xHiHM=R4t*}M<>%oSEGc9HU@b z%VPtcM5fG%f_=WjDd<&;OKy~YW2e&A3cxW#U=r!j{9HZ)fP}%+JVnQ}U2?rl*kp9- z`^2nBIwp7!Az7}25Uz#O0RS?+To)}!6k-JQ3+fyiiKK{ik`0M*@?Fqo@;iw&;1|eX zgd_!XLQ(77gNpT}Tj=O=xlm}SHSwWMDmA%St&cy?Ys^>7 zZ$;uTJY5b8p@e2sKYtzo983fWMrDo_6rZY736EGRcmo!i&Na4I&=>GJCWoH?{gPzm zfJcxiM6N+jp^!)VN>+!GkP*`}VU&9(`G|!X!6X>ERn4S}YnU#jQ4-}0&{|^gEbizI zqaC0IXIA*6VuBJPv}g&?gvbc1O2pzZ>D`0IyhA>g^lR$mV2UA%6|STwiA|LiRk6_< zmOiZE$Rilf2?FLVFm|d?35E>iTHGH9<~3-6dFcx4%fba$6V354U5!D7@6+>0*zaU7 zu$dSe6AFo75M{r?HKt*@o%~dpx}1#bNcKgKiq5cdvIAvk)On#V;B=xm=DR^;$YCrY zXliD4SUQb?t1q}qT4~RN@gv1|^Z@#3au$j>qyg=tNS{&JkSCNnumC06=5j)Js5F#} z%_4FJ3Ic+bWx$g%q8&qArMeDq54Mox#nT=7kd$H+7GBjUgRGo} z!c#jz+T9F(5;Pt{n(EF9%*>)0evn46{6@9UJE%#X3DFjPGWoJ_XQ#ptA%mDiJ7~vN z%8~UEDg!%;be1$UO{HwZF^X9iE78hJDoM^1BuYQ19u%+H0-c2tN5yE-nz}&T zdnZVNBvkV!Gsf!WJY}mHy`A`N7n8pq568#5%}sv-vp-3R!;+_1d>(q#zzS9zNIU9VJ@Y8&Sz6XlkD_Qfe(*GtkQ! zB~qxaRfuJ2hlJXnDf%$H91oB8?N7!=ig5C!{h><#*GV6U6>1M@Z|A*SaBY(7BqOGR{8?Y+nen#tlEFi|9|;=tA7B4VB$Lf diff --git a/packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json b/packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json new file mode 100644 index 0000000000..6eaf11a788 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json @@ -0,0 +1 @@ +[173,50,8,34,25,140,227,142,53,135,194,216,242,27,172,247,219,172,219,175,172,23,135,155,49,211,157,167,27,158,0,180,152,206,45,235,171,83,75,48,116,32,125,175,252,120,93,39] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json b/packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json deleted file mode 100644 index febf179550..0000000000 --- a/packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json +++ /dev/null @@ -1 +0,0 @@ -[140,166,219,3,87,141,69,160,158,153,22,179,34,58,44,164,191,240,111,196,114,27,180,199,89,247,126,103,234,93,92,229,246,192,127,27,164,78,63,100,86,79,205,231,251,65,175,178] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/msg_2024-03-18T17:30:02.532347572Z_GetIdentityKeysRequest_b4ecff7acf52818aef9ed37a98d4a459dc7a67570ea6df3f8858d3fae7820ffe.json b/packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/msg_2024-04-05T09:03:10.110827591Z_GetIdentityKeysRequest_b4ecff7acf52818aef9ed37a98d4a459dc7a67570ea6df3f8858d3fae7820ffe.json similarity index 70% rename from packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/msg_2024-03-18T17:30:02.532347572Z_GetIdentityKeysRequest_b4ecff7acf52818aef9ed37a98d4a459dc7a67570ea6df3f8858d3fae7820ffe.json rename to packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/msg_2024-04-05T09:03:10.110827591Z_GetIdentityKeysRequest_b4ecff7acf52818aef9ed37a98d4a459dc7a67570ea6df3f8858d3fae7820ffe.json index 263f1193e0191771ea235d43f36a7473cdc5dc97..64dea58e4a03f1388732f346320f253032861aaa 100644 GIT binary patch literal 14324 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 diff --git a/packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json b/packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json new file mode 100644 index 0000000000..6eaf11a788 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json @@ -0,0 +1 @@ +[173,50,8,34,25,140,227,142,53,135,194,216,242,27,172,247,219,172,219,175,172,23,135,155,49,211,157,167,27,158,0,180,152,206,45,235,171,83,75,48,116,32,125,175,252,120,93,39] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json b/packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json deleted file mode 100644 index febf179550..0000000000 --- a/packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json +++ /dev/null @@ -1 +0,0 @@ -[140,166,219,3,87,141,69,160,158,153,22,179,34,58,44,164,191,240,111,196,114,27,180,199,89,247,126,103,234,93,92,229,246,192,127,27,164,78,63,100,86,79,205,231,251,65,175,178] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_2024-03-18T17:30:02.533475216Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json b/packages/rs-sdk/tests/vectors/test_identity_read/msg_2024-04-05T09:03:10.108039494Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json similarity index 74% rename from packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_2024-03-18T17:30:02.533475216Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json rename to packages/rs-sdk/tests/vectors/test_identity_read/msg_2024-04-05T09:03:10.108039494Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json index e0816d799b39ab64d398fc66bc9ca2f679af83b7..fbf1b494d3042f8808421e61df026cbc409fb875 100644 GIT binary patch literal 22136 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 CpuhtF literal 24693 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 CpuhtF literal 24693 zcmeI)&2AmX5r*Ncbrk~FS+JY`xq%?p5CjA*F%}U?bSTPzVffy2=E#=V=XqlaK@eo2 zjpfsv>FKVYufD44nV(<0e0lWe+sD7WzJ33A_xRJ%pI-jF8`=&2c>D0-?*9GffoE$1v{2J@8tCQuAXJ_lr`Sj;JIe+@|`00giw4PM`jo$LlkXmwCtKI@9TT@v@+Cyj(k$OHY@roGn+*Wt#Jgr^{Q`Ixd%O&eP?_ zvCewFJpX)=`{}yLvHYCtJmX@1*5BX0EbZurhx;FIce;Lj_;~y41;6b7-TwQ_i(g*+ z;l*Y(|FI#xyM4TQee-y;nAdK;H@A1+zj@q^9*vzmj=rpD_qSK~54YE^-rU^1zkYlF z>L0hSuRmWsu1*)h9^L+M|LV+i0A`}0$W+wNRe(*sw_#*|rtvhI5T*`-@K8 z%o;wnt1dB|A)@GVb4B4#&r>d%(zsw%^O!wfp{(!%g*VsmysfH+Rvxik74RhTuy90o z!N?RI-CG#OIF6~lO1?Vgx&F+^%5pZ53@0i}bT=2+bXXJ%2;9@B6v|4SwslXQ9Cj_OY~mfdK>?4-MBl?~YzRF=K}}N@ zHq6spHimoxT0TFm+W3~AY*rG%Rt6wZ3pV*JKiS+4V`U&j9(3a}fPm0rT$8Isf_;hq z%!vn8tc@V;I-Nae!UfNh_sa8!ra9tqmJ}>SL`pi&)s+Ni1QA46pqh|1q~215Kwepq zk&VaCX+G%l-G5LND~2N!6|0onM11f*c^alOuGrmF;A?wi^VJc!7I+wy5sWqRZEH_5 zaT9J-7e$CGC19RY^$ZJp2YrrBDhT|Xk-z~U#f?Oo1-UyMIOtPt>x*n#G^xVL2}=^Z zGY2!amC`42x`KXZHhyO9ZD{$W2{I6 zvzVhGqq5+7P`BP=NoXk9@bL&1U?o^>CSvB~R!4-dwZp&naOD^X3eAb=q57k}rsITr zkM$J5ewn7L)jL6!(FYQ9tPe!sVQSqQ#YMgN;MBk;72wJN;1G!5P?j~Kc^O!Odhs?~ zg2?EAzQ#3doRvI3Ab?gV*I zf=ettQo><-WS(H8)&i%s$TCtrFfuaZ#E?XdQ1ry`MnEIMQ{8Zha2kYJW2}tG47(_e zRoe&!mj8l!MK&848;!cSswknkQ}~-4MiV-H9-d~@mO$_k6M1>jZ z!NeeDIJKeCyYzBH%#`@X(;~*O)e*^sIO<6kU0fK5>~@4ZtAFDJ>kcl0My3y|wjT9` zSfmaf&>LqQw5@Q;B2lWvyc~>+HEBEHN8)Hb8i zVuLi&+2H|9jV`JVB`8#-79whUl4VEguB3(`FS-F%x1`V`G8sd9)Etqfx;ylPVKNP&f^rbbwPv1kIKWe+QE|L{ zhLEH5WtbIChbpuyQpj9~H4b+dB||Z&Y~7U)(OL!+O{T!pVTg_-GLok#<%U6`(nvmw zw?Ku5RpD?-v$ZIvI`^TfLdCWL!X=H5(GHqXanvcb#1W<#Buu?%oYkq0bJ&O_sFEpK z)Yy&x(!i+k*hv(2WX8g2V6N6w081E`xOB{;M88 zj91vCk2j^P5!EeNMkK7<*K&B|(NW@z=8>Qisgbc>%7rRN7*o+CvH=7YIdru6?DCo| z4U^v}*2MYbcoiiMu0+2hs$D>VKuD?`u8Q0gz_$}myHh5?8m#M^Iq54l$L)ckxHyIq zh7;8+TZ&?u{HwUTJBdaS(HWM=0JkvU`lhyCXFn99Esbcy*4tT5B_qxkuYe&rL)2`{ z*6acV=DJELW4v=3d0F}VVZatWt3hLhUE(J+n*`P|`rxcGhANtqF%zEyah0WbTA&|$ zk=ccQ2dSMah=?7XpSWs9D^DMa*jFF)mQ3TOg zY9U@5ugz!%Q9zr%Y+PA%a9XqB*r7$2Ag9m6U3F?asSz(V3g)(R#AE_h2uZ+*&}oXa z`y?9bj6=hSBwhmy)0E*wpm3eAo;cW59ZPvmoF>g7pQvL;<+F+v9xj-MrV&sIa1qd= ztXGzRM(g_kc9kj!u%E$Q5Xd^@7mF=Wh{ix_k0{$L;6QKR@0-e0+EPX7>fd-8TsN$e^c{ zqQWA`8kD0zEq9UML}ZKi5|p1xuBtLbS1XR9vem-qsRi+jMwA@ZJi^0ZQNawwvpIlc z*dmAuy)}?1X~%YVZ(RJY<$bvO{{7A4$A|3;qu8B%F;pXKkFI=im9SyZ*kXYWuS*7; z#k;dXKEuVAcA5T@py8w|)#2fl?taHTl62z$P zLZJ3JkMc~y4rmBCLg|nu>i>PcHgoX8Jk^5c-tW?tr zt(fD8*U`$s|7F~PB%Thdo|k43{Vm%hLEg>BkwDZ=;?yA9jT)D7b0fr*$nb*9)Z1K9 z*$kPemT~MNJT6pDExC!S;*g8&+sI%%pcWfE{e5!waR2fB_ObPYD)7;F+o!Lu?{?q5 z{x`Hu{uLo7O4f0}w9e4$KW4uAp&`!9$@0JQ7uSvFzKrs*@R|-3##rf6mvbJCIg~y+M*m&D6343z&r;o#LX~l2D&ScD}}p(q1_;s2iLk!`X2d0}#4 z1O}pw{OB*&_kVkJ{qFwe{?ng7{o~^|Z*E@x{rb~iUwn9d z^rz=P?4Q^_^ZoVRhnw4XzcegO#}7X3Kfgcpy!!6?)79(GegApryYzqle4L&9@!`kQ zi-#ZQIDh!@d_Md%&MzN+yjVRtE{`Anaku*8ZvD>9uxG0&oIM<7oSv>e&edN}RvqW@ zdbVTr?3}B~kCWBM-T5zj@~9By7M& zI%nt$S}q-XE!T(FU9$GE7KOu8EA=?EIMkUBt(AA_ce2vE!$_wq;W#v1td#Z8w6p1$ zj;CzYT$`}NP}3z3caOp6VD2$>o*9=+Dw^ULT=Dc|9GnS+_-qXDvMU^3Y~01l4lcb; z={DEKa(QTDPM4-}qHtc&bjkb1g)ekd;wdNUk&m@gI86NvF*rq3hPn`guU*Vx6Ik%x zq;8des6+GEr<7@RVeHsXghhEeqtn{&FDr2&+ht51!GQV*v*R!(qg>c&jW!PRMJ3O% z32~@#swa#z&ROd8bk33EVK#qM#f(!$<5->8A$QY`A)ISueAt)^#azkTgRiZQjacC^PtDLX zUKkQI%VftsATbwAVVrZSr*2=2yy95 zg2FM_`|z`BMtK<2C(Kj%R2Os3q(bDwM6>6!)LbD^RrbNn_CPoB-=cPxyifx*+`Ji* z8%=|W>S@OrO2EV!W*7?0V@@x`PBW@dPn(7oQqwos%Ybq^#R6cHJsBb}_i{!Ubs}sE z-+98^ecxEK35)oYhBDF+({rFA+!$I9J5~Paf@cBDt#UYR1v)lvO}`ve3h^EG!-j_; zRi37YQelQM#W=(FgxCq|SV|xhWsb!;Z~*);1VaE7y1C}gmLrILy2K#I28@`fcKZ^I z3h7mxI01A#K#I|~C}KpAWwa9DCIT=0mLpv{abw6ZeImoD_6W4gj{#ovV{0OGk&5Bs zQhPY4kQ9k0gg&eeBTo&z_#%wllT5!Shfto=5-@ygDMe19fs>KL4IoHEn`?Nc{0*0? zd!ENgP1u)!O)>GI89KvOhD2<)GSFQ_917bA=FABU57Sdo0?Sfph(mW-FmH3(?3yO{ z@nJoUuYt*8@FH5)2I}B~C=KZKH86>c$t6L^bnEnb!!&~3hLG6P+@$Rmzh{6Y%NNkY z5Uap8%Bfh$H-&N5%*%2HXbhTvPTcG;>I&8Y_ zB(j;u5J-Zrh>1LR*dtfBDM9#tX~gTyuY!m-C2Px+ zhRP7uNA(Emt0*0-Gh7}rpx^WnY>08Ppm|6j27(JZG(a6w3S8^KO%pR=Rdl&SsFTK&4YEE*6_+6;NC{>nfPJW;z*8$=u4qJb<4T5M5yy+bg~<^nU^*(juM>$` z3yVT@XJ~;(5SewwE9w`ddINAcQpm2BiI#E~81N|02)LmksA>k4b%Y*Dc!l_~m_WXT zSBYyt$HKW`q-?w!vKqmF;ya?roFdbXs4B?SQUyWg5H`rc2S1@Lh?uw1PTB%ANHR4% zt5M@nHscfm_90I~O35GN-|&7$a<*)#bA&QASuLv|u?$go_>ZsD!9opuw? z1QrZ!SBMp}Ab$|2G9o02G4+rK(3EBh@^)c>yQ>3X0ciJi29H44pAs1 zAk!S$Eg-M~t>(#qT0W7rX&k2!SU3o6Pq=R>xGB{0m?E5vXd=SGC{%I_rm=aHEdmIU z+5%p9+n{F*U5ZhaV+cw$WEZ!wzjd}nKL$Y{CXFFsV9;DjjzTfRvu`IjPLWdsg3LN# zN|ch|FH}?ZtP(FOrKc8UQkC-K05G*t5mYp|HL98g7bmtTQ|TFqZmXi&enI@l)=4ps zFuQR>z$hW$UC5z;7IliiEs9_Qg$C-4Ygp3IW;sXIFySGCrHaja+|2oY9ag++O3H@w z^?H@^8!UrmSDEiPI zDg==j-dcZ+kznI%ptB@C)L!qwd?m(lr6Y=bwn8{eC`(@l!92qyTEkS9AUcZgih~sO zif5x%G)OwNYAQZMOee?|VpesoBTY+x#jjCP?M{ubGzMR`2+!*Zljc6c0U$GILi236 zjAzG!E8s};qYb3hScW2sXhgNv zbvVlq_Aoos8HiJ(xF*mu{vx2ONLi5_k`Gpe4((+)tgT?y?Hja2gy3cLfZ*UGYiZ+b z4Qh*173ruM(!Rq3&?3bR_SjmCjS^_Y9y;e4Wf~K;H=h&0Ju2&i)^H0nobIJmJm-xd zMJN@9a4Vxc!rt@5@1?=h)lELZorFn{*n52YAKw*~k3LdWJo3M35CypdCg0*3kq-r+ z(*$sC=%`ULeT>MfAkrLul=T^bOE&9os{~6^7N9U3mqt0@1Hv(a6ezu6dn1^y3h}Ku ziOL2YycZdnHw}v4_SG0f#`tX%@bUK`h|J{ihNmcC@FoG2td0o!H8>bVqUbD^s^<#! zERvC$+^AC;@}mOEh)3OmNT@|6t*;AEJ*{sjO_7??rpQmmVj_&q0v}{dQ#>?T^rAuY zfe@e~9zYfBKdRBgOC6Ez*W?Xrmfd_AWp7bLuz;FGp|Pw+h5aC}Dx>0c;{N!eFP&A~ zp^LK1D3OZqPKkVV_%!3JxS}UFJ1m?M=ILY7e<7D(aig)XeC_fz5{R8vAPSKr+yuDc z3kdBMUkuzu`*75a872}$@ z3+$;Ew*_Qb$l7ZGK@O@?rdiYsjv&N0P7V_u`(3sC?ptK{bgCh9`q{|oXlP^NIODi{ z75SCnUBYbgjfSxC%@HHM!^S*aT{;)$Kf%`dh$>uHMy-mecy()8r$vL-R9W()t+z!# zQen1m+Q3WxZTPw<*h}od@|0hVUws{scxw!G6fZ>2HFG^ zM_OA#*u++p1jMBl)jul2xUY=dQ7p3)<+=f<#NJrUCcy^<3 zFQ?xgG&C0)&kcGV#{i)c16gG1md2m@vlBGNS_kH=%{0i zfTaZ06-Lf2T%KH?I9wJfF2a;PIg~MXWc|WTs20S|p_hh;fkjR)eigR;6fN9;dcOd- WeQf;T>CeAHwus@+|F`;Gvi|~JllHs- literal 30799 zcmeI*O>Z2>5ytVH^(h3Nb6_`Lmdr7iB*-QAARuUIV-c1_g`x}yhQE7uDBI%9?;leK zBk(~N%iEmk>F%m}>ZzC6{o&d3=SP3p-~a99{_XwE{l`Cl{KtoHUf;a<`~Kr!uiw8q z`qT3t4p$tm`F?-*{^s`WF9XZa@uN?N&+i`Yy!vkc@#@v5d;j@x?{fe1=ks{{@zKZg z%g3L_*>3gm;`H&yIW8W594F_GKd$~ZPu3G1uRmU_?mSz4nkTCz&9VM?cKrCEV?O>g z&sOUlr>lv_$@;J7t9!@A*)PZPug{Yny}P^pet$UN`@0YOpDy_E;os%IKR)~M*&m)Q zqWP_a_hx^8{qp+$dL`1s^sn|e-@dv(j2?|~F^)bj@bI@6w|D!i7q6~w-d?@FeevD? z<<&1&kIU25$sg_C-M(1VX?2Q6_cw3$S8v`wOurk)yNh{wxNe$L@2?r&e*zP|db zgezS-`m~0dm&-ga532X(`hLGG>H786JU#m9^bV)?dG$wk`}ZGSFZ=qW-=B1JIrQ6q zZw3z={dSSX%WtlJ{_|tKUhZ72W*Jz?e;HV9dl}#suQ*$2_Hxt7=M5|$W0u`Y)gCSx zD?uznb8QvN&^c3IFmmbKb7dpTMB|dZk7I8$S%(YhHWn`XlE@Qgo!Bv;6YOX=#;dxx-HRBS2#!!gC9Zx0W~?p7SnZ$f#Vo~A4m?We9Y{D0GC{Jf%a~g@q>JQoIo`vlkc27AW!rhJG5?|fK+Sd zy{vPr1A>Pkkpl4r-O$a6FLEN_g#9aUR--kmfm`W2?Qq{iYBJ6_RkeGF?E2hL$phEl zt}{HWa@FGJvCHJFXQ_V8vv ze+;eT(q*Ay*f>M+SU7eXmMbo}w@{3s3z@-b;(Vn?MkYa+)G;S2O>{Rqr&6QvwT5cv z;BFjBxGdE^3|6)GX`b6WMF*tF>qN|=U8=<)5db=%OeS4vC2zuAbkDQqU!7nMP0&FGGbq_H^bGbj~?qB z+@hRb#D?V>rHSEz9Gbz@uql_MDMmsf2&L#d#dROINv1Bx6yh8*JcST`(&IF$p5p(A z0A+`)hI2(+5r+^U8N^DTJESKOZ5Rv(rQAZ|IjALUasXQX4rfz{5$LyF&yY)Ktm4IR ztIDkeF4P5ksx+K})9yu9jxtEzTxa4J%P`FuAw>a?!bIL90??pA9@IQ#e+=+6truuo z7e|)uKRvC|_!^%a4z4JH3_zk5nbNQE$)brUD+6)lK{qPx288O@`*7grj06q{DG;~qfS5BBr021nMn1S{v{-~6JCC%D8lv53>#^wI zu|`2rMUW*+>>_xQ4^|mLoG>8J_YVVrVot%hqwwwi!b(u3Ll?$Y=tC8p772}khCI+M zBVx-$VU-oHnvpQcY4R?7nh+a7Kon|+s5=ZFXK*(o$|*ML{R>l_YQ&}u%=jwr1 zSA>OuY2a)UZ_~WCoXe(x?O{l$top76L6l4@@)Cf=7+L%qK~w@trDjtn$C834h{>Ct z!R6dUz^X%NibET&Dj9|l6+ii^o?kW-E)EFMyOd!J?g?Lf8 zh|{A@M%HabCBP!0#z=&z&a&Q6-C?IdoYT<5Mn774YjP?yn)p@dFI+}{NW>q}31^WZ z%uojuO)^o@9wJXbrouw&Bwa(evO{AESK%STpAQ*EAV~0Y0LzY$s(%WP5E^qU($&xv z+YI95^mS^Ob|>MG!kg4k5NvAG$x4+)Kx%8ugLf{S~;{Fn6&jQzeX!0E<(RG zZoKMt0MF=vw#GFqj+Hz;5H2cQxkEt#s$#_g#spL&;}@}9_$af{0W4;^tIxr3q;h6~ zNC03gy-22Qd($}06m@jJMNAgdFDixliAouTpiM}RNaQGItbj{&OSKgYVMOl1Y-UlK zNL~`qMa3zoS5#R8V+A-`+4xMimW#*gey}Bx*;*d!Om}WK|9(5Sh ziHTJdBM=jL-X(=FMu>1HAjC*gJRA{Rh@-x!qKQXBAzJ^!oRz28yPvz`QI|J?3kRw;D{Y0(Otpq%n z(-=XcL3_NUPBQdR6$qdU2-7wrQ^`phwhXc9YgN$T=XY5ZjL;D!jNT(HE?PjNiZvqg ziKs0?kMgc~sc2=e-=S(Bu`H}AkZ#BV#CD-43LP<1yz^k&OSJKLQqcev-E*c-qyNFe zRTXx1FPx^b+j`t#wni}8-UL@vo42=c1y7Nuhe<>kGrG3}EA`jWMi-eyOAbXp*i7W4 z4SP!0Mfo8e(DOtGP`H`kfRUw$=sao#1~Ep6k=-a_Osq95KZa474v2icbEBDx*paB! zOTePuI3pU$N%)HXnovcs~ea6 ze+J}2o}?kWfmt*r$GbM>*Q6nl1{`X9_|brcU{!&G#$BEY3KxwD5l5rCvTLXaKLTJl25spVHK8l=Q6k$mRWMznQgfbPABBCx zptUlF%Dod*qsf7|GIa5@KtJ{(M-BO!N^=F_v7>+#SJlgH+EDnuI`c2_+Mbo1ESiqw zA3@6GsWUnjth)#0jVMpPBMFRFtT-rrHa4aA^_W~xyq580l~dzvSy~)PV2`g6)#=L2 zqeN&->*Uemo82_fz)IbV@FYZ zDU@JtRY*+6QN@e-0!Fw_L!|nS54oGoXw^>S?55AdQMgW6Pc$G_;ZvRyUC%k>6E*Be zj#je59)+oE8etz#!(C+lN)u3*`hG=I_2mRuQ@rL7b@-?iC!UO0~Dg_>19-Jm2C&AyX>uLvBB#G;>TN_=e2h<8>Zn22vU zjP~OZ(@PMec$;$}`}k3x$dyD!v$CUMW5#T{sYqW0UX5U?+Luwd(U*7;FM#WWh4rYS z`~DDl2~{to0-{E%t0A%+PR1QbVv||bykv1v--^n=EF`+1w&7ajPNMk`xQiT@e$I{H zQzF6(G83u5sKHhcpjhG;1moM>%BUmmvBA@}n__VBf+CO`soT?ECueuJAKos%Te-;s zAAPg@qUP1j;U_iyDb)wsCjSbTQ_VZ7N;K@nHxC>6YKOWwtPKn+3ljTI;Q#;t diff --git a/packages/rs-sdk/tests/vectors/test_identity_read_by_key/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json b/packages/rs-sdk/tests/vectors/test_identity_read_by_key/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json new file mode 100644 index 0000000000..6eaf11a788 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_identity_read_by_key/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json @@ -0,0 +1 @@ +[173,50,8,34,25,140,227,142,53,135,194,216,242,27,172,247,219,172,219,175,172,23,135,155,49,211,157,167,27,158,0,180,152,206,45,235,171,83,75,48,116,32,125,175,252,120,93,39] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_read_by_key/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json b/packages/rs-sdk/tests/vectors/test_identity_read_by_key/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json deleted file mode 100644 index febf179550..0000000000 --- a/packages/rs-sdk/tests/vectors/test_identity_read_by_key/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json +++ /dev/null @@ -1 +0,0 @@ -[140,166,219,3,87,141,69,160,158,153,22,179,34,58,44,164,191,240,111,196,114,27,180,199,89,247,126,103,234,93,92,229,246,192,127,27,164,78,63,100,86,79,205,231,251,65,175,178] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/msg_2024-03-18T17:30:02.555246935Z_GetProtocolVersionUpgradeStateRequest_bb149e1933b9dc561bbfacfb6d09550f0ea4a6af6f68037e7d50ff4e4de74509.json b/packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/msg_2024-04-05T09:03:10.133854190Z_GetProtocolVersionUpgradeStateRequest_bb149e1933b9dc561bbfacfb6d09550f0ea4a6af6f68037e7d50ff4e4de74509.json similarity index 66% rename from packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/msg_2024-03-18T17:30:02.555246935Z_GetProtocolVersionUpgradeStateRequest_bb149e1933b9dc561bbfacfb6d09550f0ea4a6af6f68037e7d50ff4e4de74509.json rename to packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/msg_2024-04-05T09:03:10.133854190Z_GetProtocolVersionUpgradeStateRequest_bb149e1933b9dc561bbfacfb6d09550f0ea4a6af6f68037e7d50ff4e4de74509.json index 4141ad29c3e6b380cea7145832a7e746746908fb..d62434f6baadb9846364c73e9adecc40ce2acf4a 100644 GIT binary patch literal 8203 zcmai(TW`}q5QTZ}uZZ%@gU|TRUqQ$UiD@F5x+G2|g!=}pcaMS&>TQd<)XCHP+#%^=oA2(y4RN35gWwm}* z^x@@&^{GE!ZjvESzI(J`I$`*+*qSW9PHxfFF z2Jo92JkUa^oB}hv5J9bLx~PP|bDR+w%u)-(X;x&k8|x6Y;u!@VfYJ?As_?i1Mlm$v z0W}>b9BCqPB;jFhi$Ji<3z0*n_=*@TRe((7&^w1=En@)zf|i6sj^N8cT;houYZcfi z5Udb%!t;!kcp{xbzY;!b;1u{E;6vrmSPha!5C{Pldi;(hgxTqVm{(K}0^m>cza7AA zu@JVXGuw@Cy13p|I*)01UybX(>V2U?kv#3TrkP2ovjS4SU0wkz@~nR(FLk5;>wlUT2wL zEH6|0zwFCICB*{4w70k}1qR!TAcGPpVi^{XwB8SqlXZ5MwRD8#6oL~>5rdz((g2Zx zA;r$lL@>#$)^I*h!81y1l<-x-HDIhDLI`{X7_UU$@ptP{xIvu^ltvC-Q(M|Wq&Lu7 z79Oh}95I-G#0-OB^$zJd&DKmFl3s=*Yg)L!(Um;l>d&xRM&aht6 z=+%eskF5_+dA`7E7|br);OHaHP9!E{Hp0xfkj2faCtXKiI_r>^kSjjs*3^>I0wwST zHhb1LfzMUXuGzlLp|<{Y8BUjDx1a9#rn|c3bsW?HpiOC5MNbEL&MLGOOOE^OK!bR& zo|e4iL?pr%$!0Z$!C*4l&6&+89NZdH0r`(``jkXp+XTWI!jZ*??DAd6oDbKxoAGi= z*WpXRi22xn^?2E4*$2qkJ(V)+65uPgPsViYO_{!8HkAOrCp5juUR6exHd&ip9#R-; z{Sr&6C4-^D?$<0HY@*e`83>0x-xAxr#b8bo>*h-)tQ9*|&{0e{wuRos%{g-VF2RwC z0k=L-yy&1CXqI(UcCo?R9I_>GY`0j<1SYFkuw}vHJ%;Ex@q#AUc8PUEyaup}YuQ5( ziniOJ%@LLeFpjpN*9J8!U*d(GF^S0Z6`EAK!n-Vf6ESGo^Z+Q6g2i!y0@x6-6E~m& z>b#C_-fu=u!{s)8a$J<)_4o7%v^z}SK;LRoWCIra3&069xRWnA;FsA@Ud4| zR)U{H9ALC0a?r08jsIMU1wW8*5_|*oDCs_0&{Csc6f#b$^rgsrmRCjdZnN^--;TfU VQoEw8dVMl|z)ydk{(b(O{}*g=g*yNM literal 8206 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 QG&6snnE$-~`}VcszavBOxBvhE diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.866866313Z_GetProtocolVersionUpgradeVoteStatusRequest_ec9dca65a964669b3bc8195d5ff106e5eda740be44679cc960ea35f2134af628.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/msg_2024-04-05T09:03:10.136835219Z_GetProtocolVersionUpgradeVoteStatusRequest_ec9dca65a964669b3bc8195d5ff106e5eda740be44679cc960ea35f2134af628.json similarity index 69% rename from packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.866866313Z_GetProtocolVersionUpgradeVoteStatusRequest_ec9dca65a964669b3bc8195d5ff106e5eda740be44679cc960ea35f2134af628.json rename to packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/msg_2024-04-05T09:03:10.136835219Z_GetProtocolVersionUpgradeVoteStatusRequest_ec9dca65a964669b3bc8195d5ff106e5eda740be44679cc960ea35f2134af628.json index 09304945dc358ec461618e2d0afade611eb9122e..4ccecf96b034cd01f6daf3bed5fb1960dc1f1d60 100644 GIT binary patch literal 10871 zcmeI&%W~UB5Czbz^%W|vvtSP&AoDA!6pNM^OBG3UD9V+TOaC4~FB9k5aTZxh3rPS5 zGd;2v2m-8?E<#1#A_J4nMf7~99n@@-R=J?m^Ce?Oi*p8a$-nDIwe zz1NB{l)%f^A(PDGVSx)*O$W_mpuq? zx5wQe%JycnSWaH__4xY21vyfzLz?!pmt=L*?pmfQKp(}MU!yId5DnU49z>EQH&Js0e332Hrm#C?x zOdy16!IELpp4P^yU9m=o9@_#-){Hguj7tAUY(1f=`|vh|Mo~Of;PHkXjBLIf%rJGt z${A&+YRDV>qY-L~6>18&D!>IA!)~pRQ%eWnXFx-{uh7JT@oTre#%XKLHbYUWvMrcX zH(w%C(@Sg3n$Drvrgo>n@-oEtKrQUnMMi#kfc+KqNd(4jjpEuO~K=3S|irI_nI z&<=^zxe9*|v`=d3e}S$tGIgj<2G3Y$n28aQqXeCquCEkAmI$Yi?)1R2Unn_`rC$cdBAY{xnBFHwkDa{z@1-_+Gvo+PG1bP{O zE!4^ziV#b(fQ}Y>Y^EBTN?U$|4`4>;sxhMs{Ga zRB;e7mawJEt1f$wP49{u3q4$tuoD!_Cd{-^8QdazO1A=JzE+&6I><%o!vzvbOg&d9V665fgL%m zyp%*#!WL(Xn4&Rs#(-GVC>CzEHlizlIkQSq*HM8OLo8Xc$X!*IsW zp|t*JU)DZ+cps39zEK|9nu?e{1=E?E>b|8ndA?TR&}!3$!hh&-$B|Q-l%Np#k|8ym zAyCmQ$HN}FXdFA}k&r~$7B9OPR^wtlbg9Eeu&bp)=y0ZmaXKI;SW;>5$OGfR)EV7Y zWKTVJtM4h>1VtQK;pF6POU0i3d=Dy5B3TzMqU7`ftgG z@2Ey0c=BQRu4{AMf7st1S4_vGSD{^)_HBHnvcUsaffy`>v_#4a@el=fxH(7bfZ;yX}8q$^iW16>- P!&iyJ&-34xZxsIl1TF79 literal 10885 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 X(~z$8pY5Dx4&Ofxe_sE6`x^2ecG=I< literal 10630 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 J_vMq&e*u+1Fv9=< literal 11303 zcmeI&%WfM-5Czbz^%Vx!S+JUq;pA6>fS@JD5+aEXMHvYU{d;C;Ng>abBV?CFys+KF zp6;%yTeluPUoSpFfW8(ZgZ0Kde9Rck9C+>+8+K_3-1* z$BE>szs=}*JoPZv)YKU|D3 zcn=kK+r#E+bJ(09Wq9d&d-Lgf+-Fj?s>#b{!!MV+{dRqMy}7wx-|jAd+g`0-=T<-O zPG)XD?=DA-O;4U3Ztk}0yNBb#T}``H>xY-R{&a^ypu_HRcf0-@&vmlIx4mz!#x<@6 z6yI$Q+wmxy+jW~yo)z}=^1@`leR#YbCHdwPN52?$*!_C;Xb|kvsK=|1qk|lO{M$9g zcTP?)4qw$j4u)T6^Op^uAN=F6IeXTh&u`Nu58R;5R_8N%*K~#H3AV>W&Q5GKj>|I? zFSN#t<%wm-6*^a3F=5GsRtV7wDcTIh*Gjo&9@9m00>`Qa=UQOikUUSZ@SKe`I*wTj zPQm=ff^CZSYp(L9vvWwGDWzQUzKAN{ zHfO;SW2I@D#%yz8i7`9&Xu4}yyPAT}eb6CkAsJ_wIlX6ov4MUOYA6xvncLJEa}Kd& zPsim8P23By3blmbrY)sV)g!pDUVxaAo-y7M861Y1 zra(4ARGTW3{9Zy*H(0PjI8N!UGt^Rgr+TXuFt5g@#;wv;O&$x3q3aAfb7$m|8pMz; zV9H=vD={RF10&5K)8-&MJv1oUUC(34kfZV7d>DrgDh$w|OVg{_Lht*sU5d#irNEs-O}=* z1=9LZHcK`$n(7D-tgsMUg%t0+u2z-=;UsIhcooTH0ig;^MaaXadK{y~ zd9Bo(X_gdfTn^N>rZq*7^+ob_R0C1%EijpqwxD_hO>JwB0O7fETbSqk_fS37?3iF> zU=bZ@fsPhsS)fDwm}?qCN=vm&9z}In-@p@58{h0OREa<{UQih(M8S;{kB zTf9ggAp%ek%+Xe8k!AQGlXfUlM)b^?9UDc3Q$z;0i1taA0Xl(U)N-p-RS*86K~};e z>qOTuQ!NQBdJ(0r${IRS^r$QYrZ60Iv1Ghr48(Mrh+p!4b%rPCEyx1EnRAtV8h)x@ zMrbKLH4Yhuu>6HwvQ8p#h=xt{rG#vDbTkc?Di85SQl>4;1hID06|Em+G!x<$_*M0K zZn&A{cMBhB=sL_R#3BT$`#6NH(2`KhH0&am@vNfw4kpD>h;P9rKoX^>gHrL)@DIr9 zcz~teb^V02lo{!l1zSaaY>>1nC;=p6#uoY&1p00bClH^DIK#ggvT~l>B*>svks?QqkGh)D#ga<|ME#WpM4wjN zS;L#sh#?k?{$Sh)8OrS|$Z=7B2gj6Iy8T77{4BT3NXoV|YN*%(y%_VVd%p7>`}D6D z<>O%T`{Qo^c$eQgj6arPDTv9Mc>xJTr_3@cxe!npY`vj*!$3HTIfdj`c80tJ%p5l& zk+D){ic|^UHoI)u2soz;-Vem&m7aN1q%{iF7PIf7=Hcek{pRqvA3v(#BYD1>gAb+L`Q= zkK@O5>zm%wUrO zqhE$^OAZF?vgHylSjt7UDBiq`i{wP-*LRowcfs_W;U50{JZ393UB1p7zXBcqeEawL Ho6x@i2p2IU diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json new file mode 100644 index 0000000000..6eaf11a788 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json @@ -0,0 +1 @@ +[173,50,8,34,25,140,227,142,53,135,194,216,242,27,172,247,219,172,219,175,172,23,135,155,49,211,157,167,27,158,0,180,152,206,45,235,171,83,75,48,116,32,125,175,252,120,93,39] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json deleted file mode 100644 index febf179550..0000000000 --- a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json +++ /dev/null @@ -1 +0,0 @@ -[140,166,219,3,87,141,69,160,158,153,22,179,34,58,44,164,191,240,111,196,114,27,180,199,89,247,126,103,234,93,92,229,246,192,127,27,164,78,63,100,86,79,205,231,251,65,175,178] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/msg_2024-03-18T17:30:02.590618781Z_GetProtocolVersionUpgradeVoteStatusRequest_92a45a0fe4f69d355022d2f2f7622dfc69cc7b123be24b7ad993281979b2a3a2.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/msg_2024-04-05T09:03:10.218889202Z_GetProtocolVersionUpgradeVoteStatusRequest_92a45a0fe4f69d355022d2f2f7622dfc69cc7b123be24b7ad993281979b2a3a2.json similarity index 69% rename from packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/msg_2024-03-18T17:30:02.590618781Z_GetProtocolVersionUpgradeVoteStatusRequest_92a45a0fe4f69d355022d2f2f7622dfc69cc7b123be24b7ad993281979b2a3a2.json rename to packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/msg_2024-04-05T09:03:10.218889202Z_GetProtocolVersionUpgradeVoteStatusRequest_92a45a0fe4f69d355022d2f2f7622dfc69cc7b123be24b7ad993281979b2a3a2.json index 4d9c8c4b4f057d90f7e9199c539e6847ea5eaba1..396272fa1a1883de3ee586149451ec124a5798cd 100644 GIT binary patch literal 10979 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 diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json new file mode 100644 index 0000000000..6eaf11a788 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json @@ -0,0 +1 @@ +[173,50,8,34,25,140,227,142,53,135,194,216,242,27,172,247,219,172,219,175,172,23,135,155,49,211,157,167,27,158,0,180,152,206,45,235,171,83,75,48,116,32,125,175,252,120,93,39] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json deleted file mode 100644 index febf179550..0000000000 --- a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json +++ /dev/null @@ -1 +0,0 @@ -[140,166,219,3,87,141,69,160,158,153,22,179,34,58,44,164,191,240,111,196,114,27,180,199,89,247,126,103,234,93,92,229,246,192,127,27,164,78,63,100,86,79,205,231,251,65,175,178] \ No newline at end of file diff --git a/packages/simple-signer/Cargo.toml b/packages/simple-signer/Cargo.toml index 8e700e849d..fa28477b11 100644 --- a/packages/simple-signer/Cargo.toml +++ b/packages/simple-signer/Cargo.toml @@ -7,7 +7,6 @@ rust-version = "1.76" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -anyhow = { version = "1.0.75" } bincode = { version = "2.0.0-rc.3", features = ["serde"] } dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.2" } dpp = { path = "../rs-dpp", features = ["abci"] } diff --git a/packages/simple-signer/src/signer.rs b/packages/simple-signer/src/signer.rs index 6f35621b65..84221419e0 100644 --- a/packages/simple-signer/src/signer.rs +++ b/packages/simple-signer/src/signer.rs @@ -1,4 +1,3 @@ -use anyhow::anyhow; use dashcore_rpc::dashcore::signer; use dpp::bincode::{Decode, Encode}; use dpp::ed25519_dalek::Signer as BlsSigner; @@ -60,16 +59,18 @@ impl Signer for SimpleSigner { KeyType::BLS12_381 => { let pk = bls_signatures::PrivateKey::from_bytes(private_key, false).map_err(|_e| { - ProtocolError::Error(anyhow!("bls private key from bytes isn't correct")) + ProtocolError::Generic( + "bls private key from bytes isn't correct".to_string(), + ) })?; Ok(pk.sign(data).to_bytes().to_vec().into()) } KeyType::EDDSA_25519_HASH160 => { let key: [u8; 32] = private_key.clone().try_into().expect("expected 32 bytes"); let pk = ed25519_dalek::SigningKey::try_from(&key).map_err(|_e| { - ProtocolError::Error(anyhow!( - "eddsa 25519 private key from bytes isn't correct" - )) + ProtocolError::Generic( + "eddsa 25519 private key from bytes isn't correct".to_string(), + ) })?; Ok(pk.sign(data).to_vec().into()) } diff --git a/packages/strategy-tests/Cargo.toml b/packages/strategy-tests/Cargo.toml index 06cd7a9e8e..3cd8b8fc73 100644 --- a/packages/strategy-tests/Cargo.toml +++ b/packages/strategy-tests/Cargo.toml @@ -22,6 +22,7 @@ hex = "0.4.3" serde_json = "1.0" dpp = { path = "../rs-dpp", features = [ "abci", + "bls-signatures", "client", "random-documents", "state-transitions", @@ -43,4 +44,4 @@ platform-version = { path = "../rs-platform-version", features = [ ] } # For tests of grovedb verify -rocksdb = { version = "0.21.0" } +rocksdb = { version = "0.22.0" } diff --git a/packages/strategy-tests/src/transitions.rs b/packages/strategy-tests/src/transitions.rs index d025169c84..1eb97d3b81 100644 --- a/packages/strategy-tests/src/transitions.rs +++ b/packages/strategy-tests/src/transitions.rs @@ -26,6 +26,7 @@ use dpp::state_transition::identity_credit_withdrawal_transition::v0::{ IdentityCreditWithdrawalTransitionV0, MIN_CORE_FEE_PER_BYTE, }; +use dpp::native_bls::NativeBlsModule; use dpp::state_transition::identity_topup_transition::methods::IdentityTopUpTransitionMethodsV0; use dpp::state_transition::identity_topup_transition::IdentityTopUpTransition; use dpp::state_transition::identity_update_transition::methods::IdentityUpdateTransitionMethodsV0; @@ -33,7 +34,6 @@ use dpp::state_transition::identity_update_transition::IdentityUpdateTransition; use dpp::state_transition::{GetDataContractSecurityLevelRequirementFn, StateTransition}; use dpp::version::PlatformVersion; use dpp::withdrawal::Pooling; -use dpp::NativeBlsModule; use rand::prelude::{IteratorRandom, StdRng}; use simple_signer::signer::SimpleSigner; diff --git a/packages/wasm-dpp/src/errors/from.rs b/packages/wasm-dpp/src/errors/from.rs index b53dfeccbe..6806d6e2dd 100644 --- a/packages/wasm-dpp/src/errors/from.rs +++ b/packages/wasm-dpp/src/errors/from.rs @@ -38,7 +38,6 @@ pub fn from_dpp_err(pe: ProtocolError) -> JsValue { pub fn from_dpp_init_error(e: DashPlatformProtocolInitError) -> JsValue { match e { DashPlatformProtocolInitError::SchemaDeserializationError(e) => e.to_string().into(), - DashPlatformProtocolInitError::ValidationError(e) => e.to_string().into(), DashPlatformProtocolInitError::InvalidSchemaError(e) => e.to_string().into(), // TODO(versioning): add rest erros _ => JsValue::from_str(&format!("Error conversion not implemented: {e:#}",)), From 8d9fd15b8b9d38f208c9160e3ba7d410f9755be1 Mon Sep 17 00:00:00 2001 From: Igor Markin Date: Tue, 9 Apr 2024 17:49:19 +0100 Subject: [PATCH 125/191] refactor(dpp): generic wasm error (#1803) --- Cargo.lock | 1 + .../src/data_contract/errors/contract.rs | 8 ++ packages/wasm-dpp/Cargo.toml | 2 +- .../data_contract/data_contract_error.rs | 29 ++++++ .../consensus/basic/data_contract/mod.rs | 2 + .../src/errors/consensus/consensus_error.rs | 94 +++++++++++++++---- .../src/errors/generic_consensus_error.rs | 54 +++++++++++ packages/wasm-dpp/src/errors/mod.rs | 1 + 8 files changed, 170 insertions(+), 21 deletions(-) create mode 100644 packages/wasm-dpp/src/errors/consensus/basic/data_contract/data_contract_error.rs create mode 100644 packages/wasm-dpp/src/errors/generic_consensus_error.rs diff --git a/Cargo.lock b/Cargo.lock index 73a31c6254..a6d276d07d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5093,6 +5093,7 @@ dependencies = [ "js-sys", "log", "num_enum", + "paste", "serde", "serde-wasm-bindgen", "serde_json", diff --git a/packages/rs-dpp/src/data_contract/errors/contract.rs b/packages/rs-dpp/src/data_contract/errors/contract.rs index 82df4397c1..a9d13520b1 100644 --- a/packages/rs-dpp/src/data_contract/errors/contract.rs +++ b/packages/rs-dpp/src/data_contract/errors/contract.rs @@ -1,9 +1,11 @@ use crate::consensus::basic::decode::DecodingError; +use crate::consensus::basic::BasicError; use bincode::{Decode, Encode}; use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; use thiserror::Error; use crate::consensus::basic::document::InvalidDocumentTypeError; +use crate::consensus::ConsensusError; use crate::data_contract::errors::json_schema_error::JsonSchemaError; use crate::ProtocolError; @@ -87,3 +89,9 @@ impl From<(platform_value::Error, &str)> for DataContractError { DataContractError::ValueDecodingError(format!("{}: {:?}", value.1, value.0)) } } + +impl From for ConsensusError { + fn from(e: DataContractError) -> Self { + ConsensusError::BasicError(BasicError::ContractError(e)) + } +} diff --git a/packages/wasm-dpp/Cargo.toml b/packages/wasm-dpp/Cargo.toml index 79a00c15a1..70556299a7 100644 --- a/packages/wasm-dpp/Cargo.toml +++ b/packages/wasm-dpp/Cargo.toml @@ -46,7 +46,7 @@ log = { version = "0.4.6" } wasm-logger = { version = "0.2.0" } num_enum = "0.5.7" hex = { version = "0.4" } - +paste = "1.0.14" anyhow = { version = "1.0.75" } # required, cargo-machete false positive wasm-bindgen-futures = "0.4.33" diff --git a/packages/wasm-dpp/src/errors/consensus/basic/data_contract/data_contract_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/data_contract_error.rs new file mode 100644 index 0000000000..fe2b0e356f --- /dev/null +++ b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/data_contract_error.rs @@ -0,0 +1,29 @@ +use dpp::consensus::codes::ErrorWithCode; +use dpp::consensus::ConsensusError; + +use dpp::data_contract::errors::DataContractError; +use wasm_bindgen::prelude::*; + +#[wasm_bindgen(js_name=DataContractError)] +pub struct DataContractErrorWasm { + inner: DataContractError, +} + +impl From<&DataContractError> for DataContractErrorWasm { + fn from(e: &DataContractError) -> Self { + Self { inner: e.clone() } + } +} + +#[wasm_bindgen(js_class=DataContractError)] +impl DataContractErrorWasm { + #[wasm_bindgen(js_name=getCode)] + pub fn get_code(&self) -> u32 { + ConsensusError::from(self.inner.clone()).code() + } + + #[wasm_bindgen(getter)] + pub fn message(&self) -> String { + self.inner.to_string() + } +} diff --git a/packages/wasm-dpp/src/errors/consensus/basic/data_contract/mod.rs b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/mod.rs index b0ba34b228..b69596f735 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/data_contract/mod.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/data_contract/mod.rs @@ -1,4 +1,5 @@ mod data_contract_empty_schema_error; +mod data_contract_error; mod data_contract_have_new_unique_index_error; mod data_contract_immutable_properties_update_error; mod data_contract_invalid_index_definition_update_error; @@ -14,6 +15,7 @@ mod invalid_document_type_name_error; mod invalid_json_schema_ref_error; pub use data_contract_empty_schema_error::*; +pub use data_contract_error::*; pub use data_contract_have_new_unique_index_error::*; pub use data_contract_immutable_properties_update_error::*; pub use data_contract_invalid_index_definition_update_error::*; diff --git a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs index 8c82991b4c..bee5b8b088 100644 --- a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs @@ -31,6 +31,7 @@ use crate::errors::consensus::state::identity::{ DuplicatedIdentityPublicKeyIdStateErrorWasm, DuplicatedIdentityPublicKeyStateErrorWasm, InvalidIdentityNonceErrorWasm, MissingIdentityPublicKeyIdsErrorWasm, }; +use dpp::consensus::basic::decode::VersionError; use dpp::consensus::basic::BasicError; use dpp::consensus::basic::BasicError::{ DuplicatedIdentityPublicKeyBasicError, DuplicatedIdentityPublicKeyIdBasicError, @@ -47,34 +48,37 @@ use dpp::consensus::basic::BasicError::{ InvalidIdentityCreditWithdrawalTransitionCoreFeeError, InvalidIdentityCreditWithdrawalTransitionOutputScriptError, InvalidIdentityPublicKeyDataError, InvalidIdentityPublicKeySecurityLevelError, InvalidInstantAssetLockProofError, - InvalidInstantAssetLockProofSignatureError, JsonSchemaError, MissingMasterPublicKeyError, + InvalidInstantAssetLockProofSignatureError, MissingMasterPublicKeyError, NotImplementedIdentityCreditWithdrawalTransitionPoolingError, ProtocolVersionParsingError, - SerializedObjectParsingError, UnsupportedProtocolVersionError, UnsupportedVersionError, + UnsupportedProtocolVersionError, UnsupportedVersionError, }; use dpp::consensus::fee::fee_error::FeeError; use dpp::consensus::signature::SignatureError; - -// TODO(versioning): remove -// use dpp::consensus::state::data_trigger::data_trigger_error::DataTriggerError; use dpp::consensus::state::state_error::StateError; use dpp::consensus::state::data_trigger::DataTriggerError::{ DataTriggerConditionError, DataTriggerExecutionError, DataTriggerInvalidResultError, }; use wasm_bindgen::{JsError, JsValue}; +use dpp::consensus::basic::data_contract::{InvalidDocumentTypeRequiredSecurityLevelError, UnknownSecurityLevelError, UnknownStorageKeyRequirementsError}; +use dpp::consensus::basic::document::{MaxDocumentsTransitionsExceededError, MissingPositionsInDocumentTypePropertiesError}; +use dpp::consensus::basic::identity::{DataContractBoundsNotPresentError, DisablingKeyIdAlsoBeingAddedInSameTransitionError, InvalidIdentityCreditWithdrawalTransitionAmountError, InvalidIdentityUpdateTransitionDisableKeysError, InvalidIdentityUpdateTransitionEmptyError, TooManyMasterPublicKeyError}; +use dpp::consensus::state::data_contract::document_type_update_error::DocumentTypeUpdateError; +use dpp::consensus::state::identity::identity_public_key_already_exists_for_unique_contract_bounds_error::IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError; +use dpp::consensus::state::identity::master_public_key_update_error::MasterPublicKeyUpdateError; use crate::errors::consensus::basic::data_contract::{ - DataContractEmptySchemaErrorWasm, DataContractHaveNewUniqueIndexErrorWasm, - DataContractImmutablePropertiesUpdateErrorWasm, + DataContractEmptySchemaErrorWasm, DataContractErrorWasm, + DataContractHaveNewUniqueIndexErrorWasm, DataContractImmutablePropertiesUpdateErrorWasm, DataContractInvalidIndexDefinitionUpdateErrorWasm, DataContractUniqueIndicesChangedErrorWasm, IncompatibleDataContractSchemaErrorWasm, InvalidDataContractIdErrorWasm, InvalidDocumentTypeNameErrorWasm, }; use crate::errors::consensus::basic::document::{ - DuplicateDocumentTransitionsWithIdsErrorWasm, DuplicateDocumentTransitionsWithIndicesErrorWasm, - IdentityContractNonceOutOfBoundsErrorWasm, InvalidDocumentTransitionActionErrorWasm, - InvalidDocumentTransitionIdErrorWasm, MissingDataContractIdErrorWasm, - MissingDocumentTypeErrorWasm, + DocumentTransitionsAreAbsentErrorWasm, DuplicateDocumentTransitionsWithIdsErrorWasm, + DuplicateDocumentTransitionsWithIndicesErrorWasm, IdentityContractNonceOutOfBoundsErrorWasm, + InvalidDocumentTransitionActionErrorWasm, InvalidDocumentTransitionIdErrorWasm, + MissingDataContractIdErrorWasm, MissingDocumentTypeErrorWasm, }; use crate::errors::consensus::basic::state_transition::{ InvalidStateTransitionTypeErrorWasm, MissingStateTransitionTypeErrorWasm, @@ -129,6 +133,7 @@ use crate::errors::consensus::basic::{ use crate::errors::consensus::fee::BalanceIsNotEnoughErrorWasm; use crate::errors::consensus::value_error::ValueErrorWasm; +use crate::generic_consensus_error; use super::state::document::DocumentTimestampsAreEqualErrorWasm; @@ -213,8 +218,16 @@ pub fn from_state_error(state_error: &StateError) -> JsValue { DataContractConfigUpdateErrorWasm::from(e).into() } StateError::InvalidIdentityNonceError(e) => InvalidIdentityNonceErrorWasm::from(e).into(), - // TODO(versioning): restore - _ => todo!(), + StateError::IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError(e) => { + generic_consensus_error!( + IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError, + e + ) + .into() + } + StateError::DocumentTypeUpdateError(e) => { + generic_consensus_error!(DocumentTypeUpdateError, e).into() + } } } @@ -327,8 +340,10 @@ fn from_basic_error(basic_error: &BasicError) -> JsValue { InvalidDocumentTypeNameErrorWasm::from(err).into() } ProtocolVersionParsingError(e) => ProtocolVersionParsingErrorWasm::from(e).into(), - SerializedObjectParsingError(e) => SerializedObjectParsingErrorWasm::from(e).into(), - JsonSchemaError(e) => JsonSchemaErrorWasm::from(e).into(), + BasicError::SerializedObjectParsingError(e) => { + SerializedObjectParsingErrorWasm::from(e).into() + } + BasicError::JsonSchemaError(e) => JsonSchemaErrorWasm::from(e).into(), UnsupportedProtocolVersionError(e) => UnsupportedProtocolVersionErrorWasm::from(e).into(), UnsupportedVersionError(e) => UnsupportedVersionErrorWasm::from(e).into(), IncompatibleProtocolVersionError(e) => IncompatibleProtocolVersionErrorWasm::from(e).into(), @@ -348,6 +363,9 @@ fn from_basic_error(basic_error: &BasicError) -> JsValue { IdentityAssetLockTransactionOutPointAlreadyConsumedError(e) => { IdentityAssetLockTransactionOutPointAlreadyExistsErrorWasm::from(e).into() } + IdentityAssetLockTransactionOutPointNotEnoughBalanceError(e) => { + IdentityAssetLockTransactionOutPointNotEnoughBalanceErrorWasm::from(e).into() + } InvalidIdentityAssetLockTransactionOutputError(e) => { InvalidIdentityAssetLockTransactionOutputErrorWasm::from(e).into() } @@ -393,12 +411,48 @@ fn from_basic_error(basic_error: &BasicError) -> JsValue { NotImplementedIdentityCreditWithdrawalTransitionPoolingError(e) => { NotImplementedIdentityCreditWithdrawalTransitionPoolingErrorWasm::from(e).into() } - IdentityAssetLockTransactionOutPointNotEnoughBalanceError(e) => { - IdentityAssetLockTransactionOutPointNotEnoughBalanceErrorWasm::from(e).into() - } IncompatibleRe2PatternError(err) => IncompatibleRe2PatternErrorWasm::from(err).into(), - // TODO(versioning): cover other errors - _ => todo!(), + BasicError::VersionError(err) => generic_consensus_error!(VersionError, err).into(), + BasicError::ContractError(e) => DataContractErrorWasm::from(e).into(), + BasicError::UnknownSecurityLevelError(e) => { + generic_consensus_error!(UnknownSecurityLevelError, e).into() + } + BasicError::UnknownStorageKeyRequirementsError(e) => { + generic_consensus_error!(UnknownStorageKeyRequirementsError, e).into() + } + BasicError::DataContractBoundsNotPresentError(e) => { + generic_consensus_error!(DataContractBoundsNotPresentError, e).into() + } + BasicError::MissingPositionsInDocumentTypePropertiesError(e) => { + generic_consensus_error!(MissingPositionsInDocumentTypePropertiesError, e).into() + } + BasicError::MaxDocumentsTransitionsExceededError(e) => { + generic_consensus_error!(MaxDocumentsTransitionsExceededError, e).into() + } + BasicError::DisablingKeyIdAlsoBeingAddedInSameTransitionError(e) => { + generic_consensus_error!(DisablingKeyIdAlsoBeingAddedInSameTransitionError, e).into() + } + BasicError::TooManyMasterPublicKeyError(e) => { + generic_consensus_error!(TooManyMasterPublicKeyError, e).into() + } + BasicError::MasterPublicKeyUpdateError(e) => { + generic_consensus_error!(MasterPublicKeyUpdateError, e).into() + } + BasicError::InvalidDocumentTypeRequiredSecurityLevelError(e) => { + generic_consensus_error!(InvalidDocumentTypeRequiredSecurityLevelError, e).into() + } + BasicError::InvalidIdentityCreditWithdrawalTransitionAmountError(e) => { + generic_consensus_error!(InvalidIdentityCreditWithdrawalTransitionAmountError, e).into() + } + BasicError::InvalidIdentityUpdateTransitionEmptyError(e) => { + generic_consensus_error!(InvalidIdentityUpdateTransitionEmptyError, e).into() + } + BasicError::InvalidIdentityUpdateTransitionDisableKeysError(e) => { + generic_consensus_error!(InvalidIdentityUpdateTransitionDisableKeysError, e).into() + } + BasicError::DocumentTransitionsAreAbsentError(e) => { + DocumentTransitionsAreAbsentErrorWasm::from(e).into() + } } } diff --git a/packages/wasm-dpp/src/errors/generic_consensus_error.rs b/packages/wasm-dpp/src/errors/generic_consensus_error.rs new file mode 100644 index 0000000000..57e8f43bb2 --- /dev/null +++ b/packages/wasm-dpp/src/errors/generic_consensus_error.rs @@ -0,0 +1,54 @@ +#[macro_export] +macro_rules! generic_consensus_error { + ($error_type:ident, $error_instance:expr) => {{ + use { + dpp::{ + consensus::{codes::ErrorWithCode, ConsensusError}, + serialization::PlatformSerializableWithPlatformVersion, + version::PlatformVersion, + }, + paste::paste, + wasm_bindgen::prelude::wasm_bindgen, + $crate::buffer::Buffer, + }; + + paste! { + #[derive(Debug)] + #[wasm_bindgen(js_name=$error_type)] + pub struct [<$error_type Wasm>] { + inner: $error_type + } + + impl From<&$error_type> for [<$error_type Wasm>] { + fn from(e: &$error_type) -> Self { + Self { + inner: e.clone() + } + } + } + + #[wasm_bindgen(js_class=$error_type)] + impl [<$error_type Wasm>] { + #[wasm_bindgen(js_name=getCode)] + pub fn get_code(&self) -> u32 { + ConsensusError::from(self.inner.clone()).code() + } + + #[wasm_bindgen(getter)] + pub fn message(&self) -> String { + self.inner.to_string() + } + + pub fn serialize(&self) -> Result { + let bytes = ConsensusError::from(self.inner.clone()) + .serialize_to_bytes_with_platform_version(PlatformVersion::first()) + .map_err(JsError::from)?; + + Ok(Buffer::from_bytes(bytes.as_slice())) + } + } + + [<$error_type Wasm>]::from($error_instance) + } + }}; +} diff --git a/packages/wasm-dpp/src/errors/mod.rs b/packages/wasm-dpp/src/errors/mod.rs index af1360fcf2..23f13a24c2 100644 --- a/packages/wasm-dpp/src/errors/mod.rs +++ b/packages/wasm-dpp/src/errors/mod.rs @@ -13,5 +13,6 @@ pub mod protocol_error; // mod compatible_protocol_version_is_not_defined_error; pub mod data_contract_not_present_error; // pub mod dpp_error; +mod generic_consensus_error; pub mod value_error; // pub use compatible_protocol_version_is_not_defined_error::*; From acfe3c60381b59ed2500bac68c2ab83fe1f9c4fd Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Wed, 10 Apr 2024 17:05:59 +0700 Subject: [PATCH 126/191] refactor: reduce dependencies and update ring sub dependency (#1809) --- Cargo.lock | 106 +- packages/dapi-grpc/Cargo.toml | 12 +- .../core/proto/org.dash.platform.dapi.v0.rs | 522 ------- .../proto/org.dash.platform.dapi.v0.rs | 1212 ----------------- packages/dashpay-contract/Cargo.toml | 2 +- packages/data-contracts/Cargo.toml | 2 +- packages/dpns-contract/Cargo.toml | 2 +- packages/feature-flags-contract/Cargo.toml | 2 +- .../Cargo.toml | 2 +- packages/rs-dapi-client/Cargo.toml | 4 +- packages/rs-dapi-grpc-macros/Cargo.toml | 4 +- packages/rs-dpp/Cargo.toml | 2 +- packages/rs-drive-abci/Cargo.toml | 8 +- packages/rs-drive-proof-verifier/Cargo.toml | 10 +- packages/rs-drive/Cargo.toml | 4 +- packages/rs-drive/src/query/mod.rs | 7 +- packages/rs-platform-version/Cargo.toml | 2 +- packages/rs-sdk/Cargo.toml | 1 - packages/wasm-dpp/Cargo.toml | 4 +- packages/withdrawals-contract/Cargo.toml | 4 +- 20 files changed, 45 insertions(+), 1867 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a6d276d07d..2a586eb259 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -855,16 +855,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "core-foundation-sys" version = "0.8.6" @@ -1039,7 +1029,7 @@ name = "dapi-grpc-macros" version = "1.0.0-dev.10" dependencies = [ "dapi-grpc", - "heck 0.4.1", + "heck 0.5.0", "quote", "syn 2.0.55", ] @@ -2381,7 +2371,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" dependencies = [ "cfg-if", - "windows-targets 0.52.4", + "windows-targets 0.48.5", ] [[package]] @@ -2831,12 +2821,6 @@ version = "11.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" -[[package]] -name = "openssl-probe" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" - [[package]] name = "overload" version = "0.1.1" @@ -3241,7 +3225,7 @@ checksum = "c55e02e35260070b6f716a2423c2ff1c3bb1642ddca6f99e1f26d06268a0e2d2" dependencies = [ "bytes", "heck 0.4.1", - "itertools 0.11.0", + "itertools 0.10.5", "log", "multimap", "once_cell", @@ -3275,7 +3259,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "efb6c9a1dd1def8e2124d17e83a20af56f1570d6c2d2bd9e266ccb768df3840e" dependencies = [ "anyhow", - "itertools 0.11.0", + "itertools 0.10.5", "proc-macro2", "quote", "syn 2.0.55", @@ -3697,29 +3681,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "rustls-native-certs" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792" -dependencies = [ - "openssl-probe", - "rustls-pemfile", - "rustls-pki-types", - "schannel", - "security-framework", -] - -[[package]] -name = "rustls-pemfile" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f48172685e6ff52a556baa527774f61fcaa884f59daf3375c62a3f1cd2549dab" -dependencies = [ - "base64 0.21.7", - "rustls-pki-types", -] - [[package]] name = "rustls-pki-types" version = "1.4.0" @@ -3768,15 +3729,6 @@ dependencies = [ "regex", ] -[[package]] -name = "schannel" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" -dependencies = [ - "windows-sys 0.52.0", -] - [[package]] name = "scheduled-thread-pool" version = "0.2.7" @@ -3819,29 +3771,6 @@ dependencies = [ "cc", ] -[[package]] -name = "security-framework" -version = "2.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "semver" version = "1.0.22" @@ -4294,8 +4223,8 @@ dependencies = [ [[package]] name = "tenderdash-abci" -version = "0.14.0-dev.11" -source = "git+https://github.com/dashpay/rs-tenderdash-abci#52a0b7cd37d7adcffea7b35eaf9ee10c7a6c8135" +version = "0.14.0-dev.12" +source = "git+https://github.com/dashpay/rs-tenderdash-abci#17e57f509c2bb7015042d69976bd1f056fef923d" dependencies = [ "bytes", "futures", @@ -4316,8 +4245,8 @@ dependencies = [ [[package]] name = "tenderdash-proto" -version = "0.14.0-dev.11" -source = "git+https://github.com/dashpay/rs-tenderdash-abci#52a0b7cd37d7adcffea7b35eaf9ee10c7a6c8135" +version = "0.14.0-dev.12" +source = "git+https://github.com/dashpay/rs-tenderdash-abci#17e57f509c2bb7015042d69976bd1f056fef923d" dependencies = [ "bytes", "chrono", @@ -4336,8 +4265,8 @@ dependencies = [ [[package]] name = "tenderdash-proto-compiler" -version = "0.14.0-dev.11" -source = "git+https://github.com/dashpay/rs-tenderdash-abci#52a0b7cd37d7adcffea7b35eaf9ee10c7a6c8135" +version = "0.14.0-dev.12" +source = "git+https://github.com/dashpay/rs-tenderdash-abci#17e57f509c2bb7015042d69976bd1f056fef923d" dependencies = [ "fs_extra", "prost-build 0.12.3", @@ -4522,17 +4451,6 @@ dependencies = [ "syn 2.0.55", ] -[[package]] -name = "tokio-rustls" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" -dependencies = [ - "rustls", - "rustls-pki-types", - "tokio", -] - [[package]] name = "tokio-stream" version = "0.1.15" @@ -4673,11 +4591,7 @@ dependencies = [ "percent-encoding", "pin-project", "prost 0.12.3", - "rustls-native-certs", - "rustls-pemfile", - "rustls-pki-types", "tokio", - "tokio-rustls", "tokio-stream", "tower", "tower-layer", diff --git a/packages/dapi-grpc/Cargo.toml b/packages/dapi-grpc/Cargo.toml index 69a7be546e..080a337a18 100644 --- a/packages/dapi-grpc/Cargo.toml +++ b/packages/dapi-grpc/Cargo.toml @@ -22,8 +22,8 @@ core = [] platform = [] # Re-export Dash Platform protobuf types as `dapi_grpc::platform::proto` tenderdash-proto = [] -client = ["tonic/channel", "tonic/tls", "tonic/tls-roots", "platform"] -server = ["tonic/channel", "tonic/tls", "tonic/tls-roots", "platform"] +client = ["tonic/channel", "tonic/transport", "platform"] +server = ["tonic/channel", "tonic/transport", "platform"] serde = ["dep:serde", "dep:serde_bytes"] mocks = ["dep:serde_json"] @@ -34,12 +34,10 @@ tonic = { version = "0.11", features = [ "codegen", "prost", ], default-features = false } -serde = { version = "1.0.171", optional = true, features = ["derive"] } +serde = { version = "1.0.197", optional = true, features = ["derive"] } serde_bytes = { version = "0.11.12", optional = true } serde_json = { version = "1.0", optional = true } -tenderdash-proto = { git = "https://github.com/dashpay/rs-tenderdash-abci", version = "0.14.0-dev.11", features = [ - "grpc", -] } +tenderdash-proto = { git = "https://github.com/dashpay/rs-tenderdash-abci", version = "0.14.0-dev.12", default-features = false } dapi-grpc-macros = { path = "../rs-dapi-grpc-macros" } platform-version = { path = "../rs-platform-version" } @@ -58,4 +56,4 @@ name = "platform_example" path = "clients/platform/v0/rust/platform_example.rs" [package.metadata.cargo-machete] -ignored = ["platform-version", "serde_bytes"] +ignored = ["platform-version", "serde_bytes", "futures-core"] diff --git a/packages/dapi-grpc/src/core/proto/org.dash.platform.dapi.v0.rs b/packages/dapi-grpc/src/core/proto/org.dash.platform.dapi.v0.rs index 05b6d41005..b8fb055c6c 100644 --- a/packages/dapi-grpc/src/core/proto/org.dash.platform.dapi.v0.rs +++ b/packages/dapi-grpc/src/core/proto/org.dash.platform.dapi.v0.rs @@ -719,525 +719,3 @@ pub mod core_client { } } } -/// Generated server implementations. -pub mod core_server { - #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] - use tonic::codegen::*; - /// Generated trait containing gRPC methods that should be implemented for use with CoreServer. - #[async_trait] - pub trait Core: Send + Sync + 'static { - async fn get_status( - &self, - request: tonic::Request, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - >; - async fn get_block( - &self, - request: tonic::Request, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - >; - async fn broadcast_transaction( - &self, - request: tonic::Request, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - >; - async fn get_transaction( - &self, - request: tonic::Request, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - >; - async fn get_estimated_transaction_fee( - &self, - request: tonic::Request, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - >; - /// Server streaming response type for the subscribeToBlockHeadersWithChainLocks method. - type subscribeToBlockHeadersWithChainLocksStream: futures_core::Stream< - Item = std::result::Result< - super::BlockHeadersWithChainLocksResponse, - tonic::Status, - >, - > - + Send - + 'static; - async fn subscribe_to_block_headers_with_chain_locks( - &self, - request: tonic::Request, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - >; - /// Server streaming response type for the subscribeToTransactionsWithProofs method. - type subscribeToTransactionsWithProofsStream: futures_core::Stream< - Item = std::result::Result< - super::TransactionsWithProofsResponse, - tonic::Status, - >, - > - + Send - + 'static; - async fn subscribe_to_transactions_with_proofs( - &self, - request: tonic::Request, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - >; - } - #[derive(Debug)] - pub struct CoreServer { - inner: _Inner, - accept_compression_encodings: EnabledCompressionEncodings, - send_compression_encodings: EnabledCompressionEncodings, - max_decoding_message_size: Option, - max_encoding_message_size: Option, - } - struct _Inner(Arc); - impl CoreServer { - pub fn new(inner: T) -> Self { - Self::from_arc(Arc::new(inner)) - } - pub fn from_arc(inner: Arc) -> Self { - let inner = _Inner(inner); - Self { - inner, - accept_compression_encodings: Default::default(), - send_compression_encodings: Default::default(), - max_decoding_message_size: None, - max_encoding_message_size: None, - } - } - pub fn with_interceptor( - inner: T, - interceptor: F, - ) -> InterceptedService - where - F: tonic::service::Interceptor, - { - InterceptedService::new(Self::new(inner), interceptor) - } - /// Enable decompressing requests with the given encoding. - #[must_use] - pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { - self.accept_compression_encodings.enable(encoding); - self - } - /// Compress responses with the given encoding, if the client supports it. - #[must_use] - pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { - self.send_compression_encodings.enable(encoding); - self - } - /// Limits the maximum size of a decoded message. - /// - /// Default: `4MB` - #[must_use] - pub fn max_decoding_message_size(mut self, limit: usize) -> Self { - self.max_decoding_message_size = Some(limit); - self - } - /// Limits the maximum size of an encoded message. - /// - /// Default: `usize::MAX` - #[must_use] - pub fn max_encoding_message_size(mut self, limit: usize) -> Self { - self.max_encoding_message_size = Some(limit); - self - } - } - impl tonic::codegen::Service> for CoreServer - where - T: Core, - B: Body + Send + 'static, - B::Error: Into + Send + 'static, - { - type Response = http::Response; - type Error = std::convert::Infallible; - type Future = BoxFuture; - fn poll_ready( - &mut self, - _cx: &mut Context<'_>, - ) -> Poll> { - Poll::Ready(Ok(())) - } - fn call(&mut self, req: http::Request) -> Self::Future { - let inner = self.inner.clone(); - match req.uri().path() { - "/org.dash.platform.dapi.v0.Core/getStatus" => { - #[allow(non_camel_case_types)] - struct getStatusSvc(pub Arc); - impl tonic::server::UnaryService - for getStatusSvc { - type Response = super::GetStatusResponse; - type Future = BoxFuture< - tonic::Response, - tonic::Status, - >; - fn call( - &mut self, - request: tonic::Request, - ) -> Self::Future { - let inner = Arc::clone(&self.0); - let fut = async move { (*inner).get_status(request).await }; - Box::pin(fut) - } - } - let accept_compression_encodings = self.accept_compression_encodings; - let send_compression_encodings = self.send_compression_encodings; - let max_decoding_message_size = self.max_decoding_message_size; - let max_encoding_message_size = self.max_encoding_message_size; - let inner = self.inner.clone(); - let fut = async move { - let inner = inner.0; - let method = getStatusSvc(inner); - let codec = tonic::codec::ProstCodec::default(); - let mut grpc = tonic::server::Grpc::new(codec) - .apply_compression_config( - accept_compression_encodings, - send_compression_encodings, - ) - .apply_max_message_size_config( - max_decoding_message_size, - max_encoding_message_size, - ); - let res = grpc.unary(method, req).await; - Ok(res) - }; - Box::pin(fut) - } - "/org.dash.platform.dapi.v0.Core/getBlock" => { - #[allow(non_camel_case_types)] - struct getBlockSvc(pub Arc); - impl tonic::server::UnaryService - for getBlockSvc { - type Response = super::GetBlockResponse; - type Future = BoxFuture< - tonic::Response, - tonic::Status, - >; - fn call( - &mut self, - request: tonic::Request, - ) -> Self::Future { - let inner = Arc::clone(&self.0); - let fut = async move { (*inner).get_block(request).await }; - Box::pin(fut) - } - } - let accept_compression_encodings = self.accept_compression_encodings; - let send_compression_encodings = self.send_compression_encodings; - let max_decoding_message_size = self.max_decoding_message_size; - let max_encoding_message_size = self.max_encoding_message_size; - let inner = self.inner.clone(); - let fut = async move { - let inner = inner.0; - let method = getBlockSvc(inner); - let codec = tonic::codec::ProstCodec::default(); - let mut grpc = tonic::server::Grpc::new(codec) - .apply_compression_config( - accept_compression_encodings, - send_compression_encodings, - ) - .apply_max_message_size_config( - max_decoding_message_size, - max_encoding_message_size, - ); - let res = grpc.unary(method, req).await; - Ok(res) - }; - Box::pin(fut) - } - "/org.dash.platform.dapi.v0.Core/broadcastTransaction" => { - #[allow(non_camel_case_types)] - struct broadcastTransactionSvc(pub Arc); - impl< - T: Core, - > tonic::server::UnaryService - for broadcastTransactionSvc { - type Response = super::BroadcastTransactionResponse; - type Future = BoxFuture< - tonic::Response, - tonic::Status, - >; - fn call( - &mut self, - request: tonic::Request, - ) -> Self::Future { - let inner = Arc::clone(&self.0); - let fut = async move { - (*inner).broadcast_transaction(request).await - }; - Box::pin(fut) - } - } - let accept_compression_encodings = self.accept_compression_encodings; - let send_compression_encodings = self.send_compression_encodings; - let max_decoding_message_size = self.max_decoding_message_size; - let max_encoding_message_size = self.max_encoding_message_size; - let inner = self.inner.clone(); - let fut = async move { - let inner = inner.0; - let method = broadcastTransactionSvc(inner); - let codec = tonic::codec::ProstCodec::default(); - let mut grpc = tonic::server::Grpc::new(codec) - .apply_compression_config( - accept_compression_encodings, - send_compression_encodings, - ) - .apply_max_message_size_config( - max_decoding_message_size, - max_encoding_message_size, - ); - let res = grpc.unary(method, req).await; - Ok(res) - }; - Box::pin(fut) - } - "/org.dash.platform.dapi.v0.Core/getTransaction" => { - #[allow(non_camel_case_types)] - struct getTransactionSvc(pub Arc); - impl< - T: Core, - > tonic::server::UnaryService - for getTransactionSvc { - type Response = super::GetTransactionResponse; - type Future = BoxFuture< - tonic::Response, - tonic::Status, - >; - fn call( - &mut self, - request: tonic::Request, - ) -> Self::Future { - let inner = Arc::clone(&self.0); - let fut = async move { - (*inner).get_transaction(request).await - }; - Box::pin(fut) - } - } - let accept_compression_encodings = self.accept_compression_encodings; - let send_compression_encodings = self.send_compression_encodings; - let max_decoding_message_size = self.max_decoding_message_size; - let max_encoding_message_size = self.max_encoding_message_size; - let inner = self.inner.clone(); - let fut = async move { - let inner = inner.0; - let method = getTransactionSvc(inner); - let codec = tonic::codec::ProstCodec::default(); - let mut grpc = tonic::server::Grpc::new(codec) - .apply_compression_config( - accept_compression_encodings, - send_compression_encodings, - ) - .apply_max_message_size_config( - max_decoding_message_size, - max_encoding_message_size, - ); - let res = grpc.unary(method, req).await; - Ok(res) - }; - Box::pin(fut) - } - "/org.dash.platform.dapi.v0.Core/getEstimatedTransactionFee" => { - #[allow(non_camel_case_types)] - struct getEstimatedTransactionFeeSvc(pub Arc); - impl< - T: Core, - > tonic::server::UnaryService< - super::GetEstimatedTransactionFeeRequest, - > for getEstimatedTransactionFeeSvc { - type Response = super::GetEstimatedTransactionFeeResponse; - type Future = BoxFuture< - tonic::Response, - tonic::Status, - >; - fn call( - &mut self, - request: tonic::Request< - super::GetEstimatedTransactionFeeRequest, - >, - ) -> Self::Future { - let inner = Arc::clone(&self.0); - let fut = async move { - (*inner).get_estimated_transaction_fee(request).await - }; - Box::pin(fut) - } - } - let accept_compression_encodings = self.accept_compression_encodings; - let send_compression_encodings = self.send_compression_encodings; - let max_decoding_message_size = self.max_decoding_message_size; - let max_encoding_message_size = self.max_encoding_message_size; - let inner = self.inner.clone(); - let fut = async move { - let inner = inner.0; - let method = getEstimatedTransactionFeeSvc(inner); - let codec = tonic::codec::ProstCodec::default(); - let mut grpc = tonic::server::Grpc::new(codec) - .apply_compression_config( - accept_compression_encodings, - send_compression_encodings, - ) - .apply_max_message_size_config( - max_decoding_message_size, - max_encoding_message_size, - ); - let res = grpc.unary(method, req).await; - Ok(res) - }; - Box::pin(fut) - } - "/org.dash.platform.dapi.v0.Core/subscribeToBlockHeadersWithChainLocks" => { - #[allow(non_camel_case_types)] - struct subscribeToBlockHeadersWithChainLocksSvc(pub Arc); - impl< - T: Core, - > tonic::server::ServerStreamingService< - super::BlockHeadersWithChainLocksRequest, - > for subscribeToBlockHeadersWithChainLocksSvc { - type Response = super::BlockHeadersWithChainLocksResponse; - type ResponseStream = T::subscribeToBlockHeadersWithChainLocksStream; - type Future = BoxFuture< - tonic::Response, - tonic::Status, - >; - fn call( - &mut self, - request: tonic::Request< - super::BlockHeadersWithChainLocksRequest, - >, - ) -> Self::Future { - let inner = Arc::clone(&self.0); - let fut = async move { - (*inner) - .subscribe_to_block_headers_with_chain_locks(request) - .await - }; - Box::pin(fut) - } - } - let accept_compression_encodings = self.accept_compression_encodings; - let send_compression_encodings = self.send_compression_encodings; - let max_decoding_message_size = self.max_decoding_message_size; - let max_encoding_message_size = self.max_encoding_message_size; - let inner = self.inner.clone(); - let fut = async move { - let inner = inner.0; - let method = subscribeToBlockHeadersWithChainLocksSvc(inner); - let codec = tonic::codec::ProstCodec::default(); - let mut grpc = tonic::server::Grpc::new(codec) - .apply_compression_config( - accept_compression_encodings, - send_compression_encodings, - ) - .apply_max_message_size_config( - max_decoding_message_size, - max_encoding_message_size, - ); - let res = grpc.server_streaming(method, req).await; - Ok(res) - }; - Box::pin(fut) - } - "/org.dash.platform.dapi.v0.Core/subscribeToTransactionsWithProofs" => { - #[allow(non_camel_case_types)] - struct subscribeToTransactionsWithProofsSvc(pub Arc); - impl< - T: Core, - > tonic::server::ServerStreamingService< - super::TransactionsWithProofsRequest, - > for subscribeToTransactionsWithProofsSvc { - type Response = super::TransactionsWithProofsResponse; - type ResponseStream = T::subscribeToTransactionsWithProofsStream; - type Future = BoxFuture< - tonic::Response, - tonic::Status, - >; - fn call( - &mut self, - request: tonic::Request, - ) -> Self::Future { - let inner = Arc::clone(&self.0); - let fut = async move { - (*inner) - .subscribe_to_transactions_with_proofs(request) - .await - }; - Box::pin(fut) - } - } - let accept_compression_encodings = self.accept_compression_encodings; - let send_compression_encodings = self.send_compression_encodings; - let max_decoding_message_size = self.max_decoding_message_size; - let max_encoding_message_size = self.max_encoding_message_size; - let inner = self.inner.clone(); - let fut = async move { - let inner = inner.0; - let method = subscribeToTransactionsWithProofsSvc(inner); - let codec = tonic::codec::ProstCodec::default(); - let mut grpc = tonic::server::Grpc::new(codec) - .apply_compression_config( - accept_compression_encodings, - send_compression_encodings, - ) - .apply_max_message_size_config( - max_decoding_message_size, - max_encoding_message_size, - ); - let res = grpc.server_streaming(method, req).await; - Ok(res) - }; - Box::pin(fut) - } - _ => { - Box::pin(async move { - Ok( - http::Response::builder() - .status(200) - .header("grpc-status", "12") - .header("content-type", "application/grpc") - .body(empty_body()) - .unwrap(), - ) - }) - } - } - } - } - impl Clone for CoreServer { - fn clone(&self) -> Self { - let inner = self.inner.clone(); - Self { - inner, - accept_compression_encodings: self.accept_compression_encodings, - send_compression_encodings: self.send_compression_encodings, - max_decoding_message_size: self.max_decoding_message_size, - max_encoding_message_size: self.max_encoding_message_size, - } - } - } - impl Clone for _Inner { - fn clone(&self) -> Self { - Self(Arc::clone(&self.0)) - } - } - impl std::fmt::Debug for _Inner { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{:?}", self.0) - } - } - impl tonic::server::NamedService for CoreServer { - const NAME: &'static str = "org.dash.platform.dapi.v0.Core"; - } -} diff --git a/packages/dapi-grpc/src/platform/proto/org.dash.platform.dapi.v0.rs b/packages/dapi-grpc/src/platform/proto/org.dash.platform.dapi.v0.rs index 0f6446f156..97dd080723 100644 --- a/packages/dapi-grpc/src/platform/proto/org.dash.platform.dapi.v0.rs +++ b/packages/dapi-grpc/src/platform/proto/org.dash.platform.dapi.v0.rs @@ -2818,1215 +2818,3 @@ pub mod platform_client { } } } -/// Generated server implementations. -pub mod platform_server { - #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] - use tonic::codegen::*; - /// Generated trait containing gRPC methods that should be implemented for use with PlatformServer. - #[async_trait] - pub trait Platform: Send + Sync + 'static { - async fn broadcast_state_transition( - &self, - request: tonic::Request, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - >; - async fn get_identity( - &self, - request: tonic::Request, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - >; - async fn get_identities( - &self, - request: tonic::Request, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - >; - async fn get_identity_keys( - &self, - request: tonic::Request, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - >; - async fn get_identity_nonce( - &self, - request: tonic::Request, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - >; - async fn get_identity_contract_nonce( - &self, - request: tonic::Request, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - >; - async fn get_identity_balance( - &self, - request: tonic::Request, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - >; - async fn get_identity_balance_and_revision( - &self, - request: tonic::Request, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - >; - async fn get_proofs( - &self, - request: tonic::Request, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - >; - async fn get_data_contract( - &self, - request: tonic::Request, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - >; - async fn get_data_contract_history( - &self, - request: tonic::Request, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - >; - async fn get_data_contracts( - &self, - request: tonic::Request, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - >; - async fn get_documents( - &self, - request: tonic::Request, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - >; - async fn get_identities_by_public_key_hashes( - &self, - request: tonic::Request, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - >; - async fn get_identity_by_public_key_hash( - &self, - request: tonic::Request, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - >; - async fn wait_for_state_transition_result( - &self, - request: tonic::Request, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - >; - async fn get_consensus_params( - &self, - request: tonic::Request, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - >; - async fn get_protocol_version_upgrade_state( - &self, - request: tonic::Request, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - >; - async fn get_protocol_version_upgrade_vote_status( - &self, - request: tonic::Request, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - >; - async fn get_epochs_info( - &self, - request: tonic::Request, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - >; - } - #[derive(Debug)] - pub struct PlatformServer { - inner: _Inner, - accept_compression_encodings: EnabledCompressionEncodings, - send_compression_encodings: EnabledCompressionEncodings, - max_decoding_message_size: Option, - max_encoding_message_size: Option, - } - struct _Inner(Arc); - impl PlatformServer { - pub fn new(inner: T) -> Self { - Self::from_arc(Arc::new(inner)) - } - pub fn from_arc(inner: Arc) -> Self { - let inner = _Inner(inner); - Self { - inner, - accept_compression_encodings: Default::default(), - send_compression_encodings: Default::default(), - max_decoding_message_size: None, - max_encoding_message_size: None, - } - } - pub fn with_interceptor( - inner: T, - interceptor: F, - ) -> InterceptedService - where - F: tonic::service::Interceptor, - { - InterceptedService::new(Self::new(inner), interceptor) - } - /// Enable decompressing requests with the given encoding. - #[must_use] - pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { - self.accept_compression_encodings.enable(encoding); - self - } - /// Compress responses with the given encoding, if the client supports it. - #[must_use] - pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { - self.send_compression_encodings.enable(encoding); - self - } - /// Limits the maximum size of a decoded message. - /// - /// Default: `4MB` - #[must_use] - pub fn max_decoding_message_size(mut self, limit: usize) -> Self { - self.max_decoding_message_size = Some(limit); - self - } - /// Limits the maximum size of an encoded message. - /// - /// Default: `usize::MAX` - #[must_use] - pub fn max_encoding_message_size(mut self, limit: usize) -> Self { - self.max_encoding_message_size = Some(limit); - self - } - } - impl tonic::codegen::Service> for PlatformServer - where - T: Platform, - B: Body + Send + 'static, - B::Error: Into + Send + 'static, - { - type Response = http::Response; - type Error = std::convert::Infallible; - type Future = BoxFuture; - fn poll_ready( - &mut self, - _cx: &mut Context<'_>, - ) -> Poll> { - Poll::Ready(Ok(())) - } - fn call(&mut self, req: http::Request) -> Self::Future { - let inner = self.inner.clone(); - match req.uri().path() { - "/org.dash.platform.dapi.v0.Platform/broadcastStateTransition" => { - #[allow(non_camel_case_types)] - struct broadcastStateTransitionSvc(pub Arc); - impl< - T: Platform, - > tonic::server::UnaryService - for broadcastStateTransitionSvc { - type Response = super::BroadcastStateTransitionResponse; - type Future = BoxFuture< - tonic::Response, - tonic::Status, - >; - fn call( - &mut self, - request: tonic::Request< - super::BroadcastStateTransitionRequest, - >, - ) -> Self::Future { - let inner = Arc::clone(&self.0); - let fut = async move { - (*inner).broadcast_state_transition(request).await - }; - Box::pin(fut) - } - } - let accept_compression_encodings = self.accept_compression_encodings; - let send_compression_encodings = self.send_compression_encodings; - let max_decoding_message_size = self.max_decoding_message_size; - let max_encoding_message_size = self.max_encoding_message_size; - let inner = self.inner.clone(); - let fut = async move { - let inner = inner.0; - let method = broadcastStateTransitionSvc(inner); - let codec = tonic::codec::ProstCodec::default(); - let mut grpc = tonic::server::Grpc::new(codec) - .apply_compression_config( - accept_compression_encodings, - send_compression_encodings, - ) - .apply_max_message_size_config( - max_decoding_message_size, - max_encoding_message_size, - ); - let res = grpc.unary(method, req).await; - Ok(res) - }; - Box::pin(fut) - } - "/org.dash.platform.dapi.v0.Platform/getIdentity" => { - #[allow(non_camel_case_types)] - struct getIdentitySvc(pub Arc); - impl< - T: Platform, - > tonic::server::UnaryService - for getIdentitySvc { - type Response = super::GetIdentityResponse; - type Future = BoxFuture< - tonic::Response, - tonic::Status, - >; - fn call( - &mut self, - request: tonic::Request, - ) -> Self::Future { - let inner = Arc::clone(&self.0); - let fut = async move { - (*inner).get_identity(request).await - }; - Box::pin(fut) - } - } - let accept_compression_encodings = self.accept_compression_encodings; - let send_compression_encodings = self.send_compression_encodings; - let max_decoding_message_size = self.max_decoding_message_size; - let max_encoding_message_size = self.max_encoding_message_size; - let inner = self.inner.clone(); - let fut = async move { - let inner = inner.0; - let method = getIdentitySvc(inner); - let codec = tonic::codec::ProstCodec::default(); - let mut grpc = tonic::server::Grpc::new(codec) - .apply_compression_config( - accept_compression_encodings, - send_compression_encodings, - ) - .apply_max_message_size_config( - max_decoding_message_size, - max_encoding_message_size, - ); - let res = grpc.unary(method, req).await; - Ok(res) - }; - Box::pin(fut) - } - "/org.dash.platform.dapi.v0.Platform/getIdentities" => { - #[allow(non_camel_case_types)] - struct getIdentitiesSvc(pub Arc); - impl< - T: Platform, - > tonic::server::UnaryService - for getIdentitiesSvc { - type Response = super::GetIdentitiesResponse; - type Future = BoxFuture< - tonic::Response, - tonic::Status, - >; - fn call( - &mut self, - request: tonic::Request, - ) -> Self::Future { - let inner = Arc::clone(&self.0); - let fut = async move { - (*inner).get_identities(request).await - }; - Box::pin(fut) - } - } - let accept_compression_encodings = self.accept_compression_encodings; - let send_compression_encodings = self.send_compression_encodings; - let max_decoding_message_size = self.max_decoding_message_size; - let max_encoding_message_size = self.max_encoding_message_size; - let inner = self.inner.clone(); - let fut = async move { - let inner = inner.0; - let method = getIdentitiesSvc(inner); - let codec = tonic::codec::ProstCodec::default(); - let mut grpc = tonic::server::Grpc::new(codec) - .apply_compression_config( - accept_compression_encodings, - send_compression_encodings, - ) - .apply_max_message_size_config( - max_decoding_message_size, - max_encoding_message_size, - ); - let res = grpc.unary(method, req).await; - Ok(res) - }; - Box::pin(fut) - } - "/org.dash.platform.dapi.v0.Platform/getIdentityKeys" => { - #[allow(non_camel_case_types)] - struct getIdentityKeysSvc(pub Arc); - impl< - T: Platform, - > tonic::server::UnaryService - for getIdentityKeysSvc { - type Response = super::GetIdentityKeysResponse; - type Future = BoxFuture< - tonic::Response, - tonic::Status, - >; - fn call( - &mut self, - request: tonic::Request, - ) -> Self::Future { - let inner = Arc::clone(&self.0); - let fut = async move { - (*inner).get_identity_keys(request).await - }; - Box::pin(fut) - } - } - let accept_compression_encodings = self.accept_compression_encodings; - let send_compression_encodings = self.send_compression_encodings; - let max_decoding_message_size = self.max_decoding_message_size; - let max_encoding_message_size = self.max_encoding_message_size; - let inner = self.inner.clone(); - let fut = async move { - let inner = inner.0; - let method = getIdentityKeysSvc(inner); - let codec = tonic::codec::ProstCodec::default(); - let mut grpc = tonic::server::Grpc::new(codec) - .apply_compression_config( - accept_compression_encodings, - send_compression_encodings, - ) - .apply_max_message_size_config( - max_decoding_message_size, - max_encoding_message_size, - ); - let res = grpc.unary(method, req).await; - Ok(res) - }; - Box::pin(fut) - } - "/org.dash.platform.dapi.v0.Platform/getIdentityNonce" => { - #[allow(non_camel_case_types)] - struct getIdentityNonceSvc(pub Arc); - impl< - T: Platform, - > tonic::server::UnaryService - for getIdentityNonceSvc { - type Response = super::GetIdentityNonceResponse; - type Future = BoxFuture< - tonic::Response, - tonic::Status, - >; - fn call( - &mut self, - request: tonic::Request, - ) -> Self::Future { - let inner = Arc::clone(&self.0); - let fut = async move { - (*inner).get_identity_nonce(request).await - }; - Box::pin(fut) - } - } - let accept_compression_encodings = self.accept_compression_encodings; - let send_compression_encodings = self.send_compression_encodings; - let max_decoding_message_size = self.max_decoding_message_size; - let max_encoding_message_size = self.max_encoding_message_size; - let inner = self.inner.clone(); - let fut = async move { - let inner = inner.0; - let method = getIdentityNonceSvc(inner); - let codec = tonic::codec::ProstCodec::default(); - let mut grpc = tonic::server::Grpc::new(codec) - .apply_compression_config( - accept_compression_encodings, - send_compression_encodings, - ) - .apply_max_message_size_config( - max_decoding_message_size, - max_encoding_message_size, - ); - let res = grpc.unary(method, req).await; - Ok(res) - }; - Box::pin(fut) - } - "/org.dash.platform.dapi.v0.Platform/getIdentityContractNonce" => { - #[allow(non_camel_case_types)] - struct getIdentityContractNonceSvc(pub Arc); - impl< - T: Platform, - > tonic::server::UnaryService - for getIdentityContractNonceSvc { - type Response = super::GetIdentityContractNonceResponse; - type Future = BoxFuture< - tonic::Response, - tonic::Status, - >; - fn call( - &mut self, - request: tonic::Request< - super::GetIdentityContractNonceRequest, - >, - ) -> Self::Future { - let inner = Arc::clone(&self.0); - let fut = async move { - (*inner).get_identity_contract_nonce(request).await - }; - Box::pin(fut) - } - } - let accept_compression_encodings = self.accept_compression_encodings; - let send_compression_encodings = self.send_compression_encodings; - let max_decoding_message_size = self.max_decoding_message_size; - let max_encoding_message_size = self.max_encoding_message_size; - let inner = self.inner.clone(); - let fut = async move { - let inner = inner.0; - let method = getIdentityContractNonceSvc(inner); - let codec = tonic::codec::ProstCodec::default(); - let mut grpc = tonic::server::Grpc::new(codec) - .apply_compression_config( - accept_compression_encodings, - send_compression_encodings, - ) - .apply_max_message_size_config( - max_decoding_message_size, - max_encoding_message_size, - ); - let res = grpc.unary(method, req).await; - Ok(res) - }; - Box::pin(fut) - } - "/org.dash.platform.dapi.v0.Platform/getIdentityBalance" => { - #[allow(non_camel_case_types)] - struct getIdentityBalanceSvc(pub Arc); - impl< - T: Platform, - > tonic::server::UnaryService - for getIdentityBalanceSvc { - type Response = super::GetIdentityBalanceResponse; - type Future = BoxFuture< - tonic::Response, - tonic::Status, - >; - fn call( - &mut self, - request: tonic::Request, - ) -> Self::Future { - let inner = Arc::clone(&self.0); - let fut = async move { - (*inner).get_identity_balance(request).await - }; - Box::pin(fut) - } - } - let accept_compression_encodings = self.accept_compression_encodings; - let send_compression_encodings = self.send_compression_encodings; - let max_decoding_message_size = self.max_decoding_message_size; - let max_encoding_message_size = self.max_encoding_message_size; - let inner = self.inner.clone(); - let fut = async move { - let inner = inner.0; - let method = getIdentityBalanceSvc(inner); - let codec = tonic::codec::ProstCodec::default(); - let mut grpc = tonic::server::Grpc::new(codec) - .apply_compression_config( - accept_compression_encodings, - send_compression_encodings, - ) - .apply_max_message_size_config( - max_decoding_message_size, - max_encoding_message_size, - ); - let res = grpc.unary(method, req).await; - Ok(res) - }; - Box::pin(fut) - } - "/org.dash.platform.dapi.v0.Platform/getIdentityBalanceAndRevision" => { - #[allow(non_camel_case_types)] - struct getIdentityBalanceAndRevisionSvc(pub Arc); - impl< - T: Platform, - > tonic::server::UnaryService< - super::GetIdentityBalanceAndRevisionRequest, - > for getIdentityBalanceAndRevisionSvc { - type Response = super::GetIdentityBalanceAndRevisionResponse; - type Future = BoxFuture< - tonic::Response, - tonic::Status, - >; - fn call( - &mut self, - request: tonic::Request< - super::GetIdentityBalanceAndRevisionRequest, - >, - ) -> Self::Future { - let inner = Arc::clone(&self.0); - let fut = async move { - (*inner).get_identity_balance_and_revision(request).await - }; - Box::pin(fut) - } - } - let accept_compression_encodings = self.accept_compression_encodings; - let send_compression_encodings = self.send_compression_encodings; - let max_decoding_message_size = self.max_decoding_message_size; - let max_encoding_message_size = self.max_encoding_message_size; - let inner = self.inner.clone(); - let fut = async move { - let inner = inner.0; - let method = getIdentityBalanceAndRevisionSvc(inner); - let codec = tonic::codec::ProstCodec::default(); - let mut grpc = tonic::server::Grpc::new(codec) - .apply_compression_config( - accept_compression_encodings, - send_compression_encodings, - ) - .apply_max_message_size_config( - max_decoding_message_size, - max_encoding_message_size, - ); - let res = grpc.unary(method, req).await; - Ok(res) - }; - Box::pin(fut) - } - "/org.dash.platform.dapi.v0.Platform/getProofs" => { - #[allow(non_camel_case_types)] - struct getProofsSvc(pub Arc); - impl< - T: Platform, - > tonic::server::UnaryService - for getProofsSvc { - type Response = super::GetProofsResponse; - type Future = BoxFuture< - tonic::Response, - tonic::Status, - >; - fn call( - &mut self, - request: tonic::Request, - ) -> Self::Future { - let inner = Arc::clone(&self.0); - let fut = async move { (*inner).get_proofs(request).await }; - Box::pin(fut) - } - } - let accept_compression_encodings = self.accept_compression_encodings; - let send_compression_encodings = self.send_compression_encodings; - let max_decoding_message_size = self.max_decoding_message_size; - let max_encoding_message_size = self.max_encoding_message_size; - let inner = self.inner.clone(); - let fut = async move { - let inner = inner.0; - let method = getProofsSvc(inner); - let codec = tonic::codec::ProstCodec::default(); - let mut grpc = tonic::server::Grpc::new(codec) - .apply_compression_config( - accept_compression_encodings, - send_compression_encodings, - ) - .apply_max_message_size_config( - max_decoding_message_size, - max_encoding_message_size, - ); - let res = grpc.unary(method, req).await; - Ok(res) - }; - Box::pin(fut) - } - "/org.dash.platform.dapi.v0.Platform/getDataContract" => { - #[allow(non_camel_case_types)] - struct getDataContractSvc(pub Arc); - impl< - T: Platform, - > tonic::server::UnaryService - for getDataContractSvc { - type Response = super::GetDataContractResponse; - type Future = BoxFuture< - tonic::Response, - tonic::Status, - >; - fn call( - &mut self, - request: tonic::Request, - ) -> Self::Future { - let inner = Arc::clone(&self.0); - let fut = async move { - (*inner).get_data_contract(request).await - }; - Box::pin(fut) - } - } - let accept_compression_encodings = self.accept_compression_encodings; - let send_compression_encodings = self.send_compression_encodings; - let max_decoding_message_size = self.max_decoding_message_size; - let max_encoding_message_size = self.max_encoding_message_size; - let inner = self.inner.clone(); - let fut = async move { - let inner = inner.0; - let method = getDataContractSvc(inner); - let codec = tonic::codec::ProstCodec::default(); - let mut grpc = tonic::server::Grpc::new(codec) - .apply_compression_config( - accept_compression_encodings, - send_compression_encodings, - ) - .apply_max_message_size_config( - max_decoding_message_size, - max_encoding_message_size, - ); - let res = grpc.unary(method, req).await; - Ok(res) - }; - Box::pin(fut) - } - "/org.dash.platform.dapi.v0.Platform/getDataContractHistory" => { - #[allow(non_camel_case_types)] - struct getDataContractHistorySvc(pub Arc); - impl< - T: Platform, - > tonic::server::UnaryService - for getDataContractHistorySvc { - type Response = super::GetDataContractHistoryResponse; - type Future = BoxFuture< - tonic::Response, - tonic::Status, - >; - fn call( - &mut self, - request: tonic::Request, - ) -> Self::Future { - let inner = Arc::clone(&self.0); - let fut = async move { - (*inner).get_data_contract_history(request).await - }; - Box::pin(fut) - } - } - let accept_compression_encodings = self.accept_compression_encodings; - let send_compression_encodings = self.send_compression_encodings; - let max_decoding_message_size = self.max_decoding_message_size; - let max_encoding_message_size = self.max_encoding_message_size; - let inner = self.inner.clone(); - let fut = async move { - let inner = inner.0; - let method = getDataContractHistorySvc(inner); - let codec = tonic::codec::ProstCodec::default(); - let mut grpc = tonic::server::Grpc::new(codec) - .apply_compression_config( - accept_compression_encodings, - send_compression_encodings, - ) - .apply_max_message_size_config( - max_decoding_message_size, - max_encoding_message_size, - ); - let res = grpc.unary(method, req).await; - Ok(res) - }; - Box::pin(fut) - } - "/org.dash.platform.dapi.v0.Platform/getDataContracts" => { - #[allow(non_camel_case_types)] - struct getDataContractsSvc(pub Arc); - impl< - T: Platform, - > tonic::server::UnaryService - for getDataContractsSvc { - type Response = super::GetDataContractsResponse; - type Future = BoxFuture< - tonic::Response, - tonic::Status, - >; - fn call( - &mut self, - request: tonic::Request, - ) -> Self::Future { - let inner = Arc::clone(&self.0); - let fut = async move { - (*inner).get_data_contracts(request).await - }; - Box::pin(fut) - } - } - let accept_compression_encodings = self.accept_compression_encodings; - let send_compression_encodings = self.send_compression_encodings; - let max_decoding_message_size = self.max_decoding_message_size; - let max_encoding_message_size = self.max_encoding_message_size; - let inner = self.inner.clone(); - let fut = async move { - let inner = inner.0; - let method = getDataContractsSvc(inner); - let codec = tonic::codec::ProstCodec::default(); - let mut grpc = tonic::server::Grpc::new(codec) - .apply_compression_config( - accept_compression_encodings, - send_compression_encodings, - ) - .apply_max_message_size_config( - max_decoding_message_size, - max_encoding_message_size, - ); - let res = grpc.unary(method, req).await; - Ok(res) - }; - Box::pin(fut) - } - "/org.dash.platform.dapi.v0.Platform/getDocuments" => { - #[allow(non_camel_case_types)] - struct getDocumentsSvc(pub Arc); - impl< - T: Platform, - > tonic::server::UnaryService - for getDocumentsSvc { - type Response = super::GetDocumentsResponse; - type Future = BoxFuture< - tonic::Response, - tonic::Status, - >; - fn call( - &mut self, - request: tonic::Request, - ) -> Self::Future { - let inner = Arc::clone(&self.0); - let fut = async move { - (*inner).get_documents(request).await - }; - Box::pin(fut) - } - } - let accept_compression_encodings = self.accept_compression_encodings; - let send_compression_encodings = self.send_compression_encodings; - let max_decoding_message_size = self.max_decoding_message_size; - let max_encoding_message_size = self.max_encoding_message_size; - let inner = self.inner.clone(); - let fut = async move { - let inner = inner.0; - let method = getDocumentsSvc(inner); - let codec = tonic::codec::ProstCodec::default(); - let mut grpc = tonic::server::Grpc::new(codec) - .apply_compression_config( - accept_compression_encodings, - send_compression_encodings, - ) - .apply_max_message_size_config( - max_decoding_message_size, - max_encoding_message_size, - ); - let res = grpc.unary(method, req).await; - Ok(res) - }; - Box::pin(fut) - } - "/org.dash.platform.dapi.v0.Platform/getIdentitiesByPublicKeyHashes" => { - #[allow(non_camel_case_types)] - struct getIdentitiesByPublicKeyHashesSvc(pub Arc); - impl< - T: Platform, - > tonic::server::UnaryService< - super::GetIdentitiesByPublicKeyHashesRequest, - > for getIdentitiesByPublicKeyHashesSvc { - type Response = super::GetIdentitiesByPublicKeyHashesResponse; - type Future = BoxFuture< - tonic::Response, - tonic::Status, - >; - fn call( - &mut self, - request: tonic::Request< - super::GetIdentitiesByPublicKeyHashesRequest, - >, - ) -> Self::Future { - let inner = Arc::clone(&self.0); - let fut = async move { - (*inner).get_identities_by_public_key_hashes(request).await - }; - Box::pin(fut) - } - } - let accept_compression_encodings = self.accept_compression_encodings; - let send_compression_encodings = self.send_compression_encodings; - let max_decoding_message_size = self.max_decoding_message_size; - let max_encoding_message_size = self.max_encoding_message_size; - let inner = self.inner.clone(); - let fut = async move { - let inner = inner.0; - let method = getIdentitiesByPublicKeyHashesSvc(inner); - let codec = tonic::codec::ProstCodec::default(); - let mut grpc = tonic::server::Grpc::new(codec) - .apply_compression_config( - accept_compression_encodings, - send_compression_encodings, - ) - .apply_max_message_size_config( - max_decoding_message_size, - max_encoding_message_size, - ); - let res = grpc.unary(method, req).await; - Ok(res) - }; - Box::pin(fut) - } - "/org.dash.platform.dapi.v0.Platform/getIdentityByPublicKeyHash" => { - #[allow(non_camel_case_types)] - struct getIdentityByPublicKeyHashSvc(pub Arc); - impl< - T: Platform, - > tonic::server::UnaryService< - super::GetIdentityByPublicKeyHashRequest, - > for getIdentityByPublicKeyHashSvc { - type Response = super::GetIdentityByPublicKeyHashResponse; - type Future = BoxFuture< - tonic::Response, - tonic::Status, - >; - fn call( - &mut self, - request: tonic::Request< - super::GetIdentityByPublicKeyHashRequest, - >, - ) -> Self::Future { - let inner = Arc::clone(&self.0); - let fut = async move { - (*inner).get_identity_by_public_key_hash(request).await - }; - Box::pin(fut) - } - } - let accept_compression_encodings = self.accept_compression_encodings; - let send_compression_encodings = self.send_compression_encodings; - let max_decoding_message_size = self.max_decoding_message_size; - let max_encoding_message_size = self.max_encoding_message_size; - let inner = self.inner.clone(); - let fut = async move { - let inner = inner.0; - let method = getIdentityByPublicKeyHashSvc(inner); - let codec = tonic::codec::ProstCodec::default(); - let mut grpc = tonic::server::Grpc::new(codec) - .apply_compression_config( - accept_compression_encodings, - send_compression_encodings, - ) - .apply_max_message_size_config( - max_decoding_message_size, - max_encoding_message_size, - ); - let res = grpc.unary(method, req).await; - Ok(res) - }; - Box::pin(fut) - } - "/org.dash.platform.dapi.v0.Platform/waitForStateTransitionResult" => { - #[allow(non_camel_case_types)] - struct waitForStateTransitionResultSvc(pub Arc); - impl< - T: Platform, - > tonic::server::UnaryService< - super::WaitForStateTransitionResultRequest, - > for waitForStateTransitionResultSvc { - type Response = super::WaitForStateTransitionResultResponse; - type Future = BoxFuture< - tonic::Response, - tonic::Status, - >; - fn call( - &mut self, - request: tonic::Request< - super::WaitForStateTransitionResultRequest, - >, - ) -> Self::Future { - let inner = Arc::clone(&self.0); - let fut = async move { - (*inner).wait_for_state_transition_result(request).await - }; - Box::pin(fut) - } - } - let accept_compression_encodings = self.accept_compression_encodings; - let send_compression_encodings = self.send_compression_encodings; - let max_decoding_message_size = self.max_decoding_message_size; - let max_encoding_message_size = self.max_encoding_message_size; - let inner = self.inner.clone(); - let fut = async move { - let inner = inner.0; - let method = waitForStateTransitionResultSvc(inner); - let codec = tonic::codec::ProstCodec::default(); - let mut grpc = tonic::server::Grpc::new(codec) - .apply_compression_config( - accept_compression_encodings, - send_compression_encodings, - ) - .apply_max_message_size_config( - max_decoding_message_size, - max_encoding_message_size, - ); - let res = grpc.unary(method, req).await; - Ok(res) - }; - Box::pin(fut) - } - "/org.dash.platform.dapi.v0.Platform/getConsensusParams" => { - #[allow(non_camel_case_types)] - struct getConsensusParamsSvc(pub Arc); - impl< - T: Platform, - > tonic::server::UnaryService - for getConsensusParamsSvc { - type Response = super::GetConsensusParamsResponse; - type Future = BoxFuture< - tonic::Response, - tonic::Status, - >; - fn call( - &mut self, - request: tonic::Request, - ) -> Self::Future { - let inner = Arc::clone(&self.0); - let fut = async move { - (*inner).get_consensus_params(request).await - }; - Box::pin(fut) - } - } - let accept_compression_encodings = self.accept_compression_encodings; - let send_compression_encodings = self.send_compression_encodings; - let max_decoding_message_size = self.max_decoding_message_size; - let max_encoding_message_size = self.max_encoding_message_size; - let inner = self.inner.clone(); - let fut = async move { - let inner = inner.0; - let method = getConsensusParamsSvc(inner); - let codec = tonic::codec::ProstCodec::default(); - let mut grpc = tonic::server::Grpc::new(codec) - .apply_compression_config( - accept_compression_encodings, - send_compression_encodings, - ) - .apply_max_message_size_config( - max_decoding_message_size, - max_encoding_message_size, - ); - let res = grpc.unary(method, req).await; - Ok(res) - }; - Box::pin(fut) - } - "/org.dash.platform.dapi.v0.Platform/getProtocolVersionUpgradeState" => { - #[allow(non_camel_case_types)] - struct getProtocolVersionUpgradeStateSvc(pub Arc); - impl< - T: Platform, - > tonic::server::UnaryService< - super::GetProtocolVersionUpgradeStateRequest, - > for getProtocolVersionUpgradeStateSvc { - type Response = super::GetProtocolVersionUpgradeStateResponse; - type Future = BoxFuture< - tonic::Response, - tonic::Status, - >; - fn call( - &mut self, - request: tonic::Request< - super::GetProtocolVersionUpgradeStateRequest, - >, - ) -> Self::Future { - let inner = Arc::clone(&self.0); - let fut = async move { - (*inner).get_protocol_version_upgrade_state(request).await - }; - Box::pin(fut) - } - } - let accept_compression_encodings = self.accept_compression_encodings; - let send_compression_encodings = self.send_compression_encodings; - let max_decoding_message_size = self.max_decoding_message_size; - let max_encoding_message_size = self.max_encoding_message_size; - let inner = self.inner.clone(); - let fut = async move { - let inner = inner.0; - let method = getProtocolVersionUpgradeStateSvc(inner); - let codec = tonic::codec::ProstCodec::default(); - let mut grpc = tonic::server::Grpc::new(codec) - .apply_compression_config( - accept_compression_encodings, - send_compression_encodings, - ) - .apply_max_message_size_config( - max_decoding_message_size, - max_encoding_message_size, - ); - let res = grpc.unary(method, req).await; - Ok(res) - }; - Box::pin(fut) - } - "/org.dash.platform.dapi.v0.Platform/getProtocolVersionUpgradeVoteStatus" => { - #[allow(non_camel_case_types)] - struct getProtocolVersionUpgradeVoteStatusSvc( - pub Arc, - ); - impl< - T: Platform, - > tonic::server::UnaryService< - super::GetProtocolVersionUpgradeVoteStatusRequest, - > for getProtocolVersionUpgradeVoteStatusSvc { - type Response = super::GetProtocolVersionUpgradeVoteStatusResponse; - type Future = BoxFuture< - tonic::Response, - tonic::Status, - >; - fn call( - &mut self, - request: tonic::Request< - super::GetProtocolVersionUpgradeVoteStatusRequest, - >, - ) -> Self::Future { - let inner = Arc::clone(&self.0); - let fut = async move { - (*inner) - .get_protocol_version_upgrade_vote_status(request) - .await - }; - Box::pin(fut) - } - } - let accept_compression_encodings = self.accept_compression_encodings; - let send_compression_encodings = self.send_compression_encodings; - let max_decoding_message_size = self.max_decoding_message_size; - let max_encoding_message_size = self.max_encoding_message_size; - let inner = self.inner.clone(); - let fut = async move { - let inner = inner.0; - let method = getProtocolVersionUpgradeVoteStatusSvc(inner); - let codec = tonic::codec::ProstCodec::default(); - let mut grpc = tonic::server::Grpc::new(codec) - .apply_compression_config( - accept_compression_encodings, - send_compression_encodings, - ) - .apply_max_message_size_config( - max_decoding_message_size, - max_encoding_message_size, - ); - let res = grpc.unary(method, req).await; - Ok(res) - }; - Box::pin(fut) - } - "/org.dash.platform.dapi.v0.Platform/getEpochsInfo" => { - #[allow(non_camel_case_types)] - struct getEpochsInfoSvc(pub Arc); - impl< - T: Platform, - > tonic::server::UnaryService - for getEpochsInfoSvc { - type Response = super::GetEpochsInfoResponse; - type Future = BoxFuture< - tonic::Response, - tonic::Status, - >; - fn call( - &mut self, - request: tonic::Request, - ) -> Self::Future { - let inner = Arc::clone(&self.0); - let fut = async move { - (*inner).get_epochs_info(request).await - }; - Box::pin(fut) - } - } - let accept_compression_encodings = self.accept_compression_encodings; - let send_compression_encodings = self.send_compression_encodings; - let max_decoding_message_size = self.max_decoding_message_size; - let max_encoding_message_size = self.max_encoding_message_size; - let inner = self.inner.clone(); - let fut = async move { - let inner = inner.0; - let method = getEpochsInfoSvc(inner); - let codec = tonic::codec::ProstCodec::default(); - let mut grpc = tonic::server::Grpc::new(codec) - .apply_compression_config( - accept_compression_encodings, - send_compression_encodings, - ) - .apply_max_message_size_config( - max_decoding_message_size, - max_encoding_message_size, - ); - let res = grpc.unary(method, req).await; - Ok(res) - }; - Box::pin(fut) - } - _ => { - Box::pin(async move { - Ok( - http::Response::builder() - .status(200) - .header("grpc-status", "12") - .header("content-type", "application/grpc") - .body(empty_body()) - .unwrap(), - ) - }) - } - } - } - } - impl Clone for PlatformServer { - fn clone(&self) -> Self { - let inner = self.inner.clone(); - Self { - inner, - accept_compression_encodings: self.accept_compression_encodings, - send_compression_encodings: self.send_compression_encodings, - max_decoding_message_size: self.max_decoding_message_size, - max_encoding_message_size: self.max_encoding_message_size, - } - } - } - impl Clone for _Inner { - fn clone(&self) -> Self { - Self(Arc::clone(&self.0)) - } - } - impl std::fmt::Debug for _Inner { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{:?}", self.0) - } - } - impl tonic::server::NamedService for PlatformServer { - const NAME: &'static str = "org.dash.platform.dapi.v0.Platform"; - } -} diff --git a/packages/dashpay-contract/Cargo.toml b/packages/dashpay-contract/Cargo.toml index 3c3b62dadf..2a1858eb9a 100644 --- a/packages/dashpay-contract/Cargo.toml +++ b/packages/dashpay-contract/Cargo.toml @@ -8,6 +8,6 @@ license = "MIT" [dependencies] platform-version = { path = "../rs-platform-version" } -thiserror = "1.0.56" +thiserror = "1.0.58" serde_json = { version = "1.0" } platform-value = { path = "../rs-platform-value" } diff --git a/packages/data-contracts/Cargo.toml b/packages/data-contracts/Cargo.toml index f38971e1ef..8aae0ea3b5 100644 --- a/packages/data-contracts/Cargo.toml +++ b/packages/data-contracts/Cargo.toml @@ -7,7 +7,7 @@ rust-version = "1.76" license = "MIT" [dependencies] -thiserror = "1.0.56" +thiserror = "1.0.58" platform-version = { path = "../rs-platform-version" } serde_json = { version = "1.0" } withdrawals-contract = { path = "../withdrawals-contract" } diff --git a/packages/dpns-contract/Cargo.toml b/packages/dpns-contract/Cargo.toml index fd8165cc96..f614484666 100644 --- a/packages/dpns-contract/Cargo.toml +++ b/packages/dpns-contract/Cargo.toml @@ -7,7 +7,7 @@ rust-version = "1.76" license = "MIT" [dependencies] -thiserror = "1.0.56" +thiserror = "1.0.58" platform-version = { path = "../rs-platform-version" } serde_json = { version = "1.0" } platform-value = { path = "../rs-platform-value" } diff --git a/packages/feature-flags-contract/Cargo.toml b/packages/feature-flags-contract/Cargo.toml index 5210dca911..d7410db8d0 100644 --- a/packages/feature-flags-contract/Cargo.toml +++ b/packages/feature-flags-contract/Cargo.toml @@ -7,7 +7,7 @@ rust-version = "1.76" license = "MIT" [dependencies] -thiserror = "1.0.56" +thiserror = "1.0.58" platform-version = { path = "../rs-platform-version" } serde_json = { version = "1.0" } platform-value = { path = "../rs-platform-value" } diff --git a/packages/masternode-reward-shares-contract/Cargo.toml b/packages/masternode-reward-shares-contract/Cargo.toml index 8a677c4a4b..935ae371cf 100644 --- a/packages/masternode-reward-shares-contract/Cargo.toml +++ b/packages/masternode-reward-shares-contract/Cargo.toml @@ -7,7 +7,7 @@ rust-version = "1.76" license = "MIT" [dependencies] -thiserror = "1.0.56" +thiserror = "1.0.58" platform-version = { path = "../rs-platform-version" } serde_json = { version = "1.0" } platform-value = { path = "../rs-platform-value" } diff --git a/packages/rs-dapi-client/Cargo.toml b/packages/rs-dapi-client/Cargo.toml index 32e87c7ce6..d9e1cf4e13 100644 --- a/packages/rs-dapi-client/Cargo.toml +++ b/packages/rs-dapi-client/Cargo.toml @@ -14,11 +14,11 @@ offline-testing = [] [dependencies] backon = "0.4.1" -dapi-grpc = { path = "../dapi-grpc" } +dapi-grpc = { path = "../dapi-grpc" , features = ["core", "client", "serde"], default-features = false} futures = "0.3.28" http = "0.2.9" rand = { version = "0.8.5", features = ["small_rng"] } -thiserror = "1.0.41" +thiserror = "1.0.58" tracing = "0.1.40" tokio = { version = "1.32.0", default-features = false } sha2 = { version = "0.10", optional = true } diff --git a/packages/rs-dapi-grpc-macros/Cargo.toml b/packages/rs-dapi-grpc-macros/Cargo.toml index e3e951bbaa..c51e4dd603 100644 --- a/packages/rs-dapi-grpc-macros/Cargo.toml +++ b/packages/rs-dapi-grpc-macros/Cargo.toml @@ -11,8 +11,8 @@ proc-macro = true [dependencies] quote = "1.0.33" syn = "2.0.38" -heck = "0.4.1" +heck = "0.5.0" [dev-dependencies] -dapi-grpc = { path = "../dapi-grpc" } +dapi-grpc = { path = "../dapi-grpc" , features = ["client", "serde"], default-features = false} diff --git a/packages/rs-dpp/Cargo.toml b/packages/rs-dpp/Cargo.toml index 370c6780b0..6537e54a2b 100644 --- a/packages/rs-dpp/Cargo.toml +++ b/packages/rs-dpp/Cargo.toml @@ -46,7 +46,7 @@ num_enum = "0.5.7" bincode = { version = "2.0.0-rc.3", features = ["serde"] } rand = { version = "0.8.4", features = ["small_rng"] } regex = { version = "1.5" } -serde = { version = "1.0.152", features = ["derive"] } +serde = { version = "1.0.197", features = ["derive"] } serde_json = { version = "1.0", features = ["preserve_order"] } serde_repr = { version = "0.1.7" } sha2 = { version = "0.10" } diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index 92429a80be..b87100d7fb 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -17,7 +17,7 @@ arc-swap = "1.7.0" bincode = { version = "2.0.0-rc.3", features = ["serde"] } ciborium = { git = "https://github.com/qrayven/ciborium", branch = "feat-ser-null-as-undefined" } chrono = "0.4.35" -serde = { version = "1.0.152", features = ["derive"] } +serde = { version = "1.0.197", features = ["derive"] } serde_json = { version = "1.0", features = ["preserve_order"] } serde_with = { version = "3.1.0", features = [ "hex", @@ -27,7 +27,7 @@ drive = { path = "../rs-drive", default-features = false, features = [ "server", "grovedb_operations_logging", ] } -thiserror = "1.0.30" +thiserror = "1.0.58" rand = "0.8.5" tempfile = "3.3.0" hex = "0.4.3" @@ -44,7 +44,7 @@ tracing = { version = "0.1.37", default-features = false, features = [] } clap = { version = "4.4.10", features = ["derive"] } envy = { version = "0.4.2" } dotenvy = { version = "0.15.7" } -dapi-grpc = { path = "../dapi-grpc" } +dapi-grpc = { path = "../dapi-grpc", features = ["server"], default-features = false } tracing-subscriber = { version = "0.3.16", default-features = false, features = [ "env-filter", "ansi", @@ -55,7 +55,7 @@ tracing-subscriber = { version = "0.3.16", default-features = false, features = "tracing-log", ], optional = false } atty = { version = "0.2.14", optional = false } -tenderdash-abci = { git = "https://github.com/dashpay/rs-tenderdash-abci", version = "0.14.0-dev.11", features = [ +tenderdash-abci = { git = "https://github.com/dashpay/rs-tenderdash-abci", version = "0.14.0-dev.12", features = [ "grpc", ] } lazy_static = "1.4.0" diff --git a/packages/rs-drive-proof-verifier/Cargo.toml b/packages/rs-drive-proof-verifier/Cargo.toml index a4a90314be..cc6bdb181c 100644 --- a/packages/rs-drive-proof-verifier/Cargo.toml +++ b/packages/rs-drive-proof-verifier/Cargo.toml @@ -13,17 +13,17 @@ json = ["dep:serde_json"] [dependencies] -thiserror = { version = "1.0.39" } -dapi-grpc = { path = "../dapi-grpc" } +thiserror = { version = "1.0.58" } +dapi-grpc = { path = "../dapi-grpc", features = ["core", "client", "serde"], default-features = false } drive = { path = "../rs-drive", default-features = false, features = [ "verify", ] } dpp = { path = "../rs-dpp", features = ["bls-signatures"], default-features = false } -tenderdash-abci = { git = "https://github.com/dashpay/rs-tenderdash-abci", version = "0.14.0-dev.11", features = [ - "grpc", "crypto" +tenderdash-abci = { git = "https://github.com/dashpay/rs-tenderdash-abci", version = "0.14.0-dev.12", features = [ + "crypto" ], default-features = false } tracing = { version = "0.1.37" } -serde = { version = "1.0.171", default-features = false, optional = true } +serde = { version = "1.0.197", default-features = false, optional = true } serde_json = { version = "1.0.103", features = [ "preserve_order", ], optional = true } diff --git a/packages/rs-drive/Cargo.toml b/packages/rs-drive/Cargo.toml index ae6303de5c..39b28db56b 100644 --- a/packages/rs-drive/Cargo.toml +++ b/packages/rs-drive/Cargo.toml @@ -26,7 +26,7 @@ sqlparser = { version = "0.38.0" } # used for int maps and needed in the verifier nohash-hasher = { version = "0.2.0" } dpp = { path = "../rs-dpp", features = ["state-transitions"], default-features = false, optional = true } -thiserror = { version = "1.0.30" } +thiserror = { version = "1.0.58" } tracing = { version = "0.1.37", default-features = false, features = [] } derive_more = { version = "0.99.17", optional = true} @@ -34,7 +34,7 @@ derive_more = { version = "0.99.17", optional = true} parking_lot = { version = "0.12.1", optional = true } ciborium = { git = "https://github.com/qrayven/ciborium", branch = "feat-ser-null-as-undefined", optional = true } arc-swap = { version = "1.7.0", optional = true } -serde = { version = "1.0.152", features = ["derive"], optional = true } +serde = { version = "1.0.197", features = ["derive"], optional = true } rand = { version = "0.8.4", features = ["small_rng"], optional = true } moka = { version = "0.11.1", features = ["future", "futures-util"], optional = true } bs58 = { version = "0.5.0", optional = true } diff --git a/packages/rs-drive/src/query/mod.rs b/packages/rs-drive/src/query/mod.rs index 154f01449c..5db17e742c 100644 --- a/packages/rs-drive/src/query/mod.rs +++ b/packages/rs-drive/src/query/mod.rs @@ -230,20 +230,21 @@ pub enum QueryResultEncoding { PlatformEncodedQueryResult, } +//todo: this needs to be fixed #[cfg(any(feature = "server", feature = "verify"))] impl QueryResultEncoding { /// Encode the value based on the encoding desired pub fn encode_value(&self, value: &Value) -> Result, Error> { - let mut buffer = vec![]; match self { #[cfg(feature = "ciborium")] QueryResultEncoding::CborEncodedQueryResult => { + let mut buffer = vec![]; ciborium::ser::into_writer(value, &mut buffer) .map_err(|e| ProtocolError::EncodingError(e.to_string()))?; + Ok(buffer) } - QueryResultEncoding::PlatformEncodedQueryResult => {} + QueryResultEncoding::PlatformEncodedQueryResult => Ok(vec![]), } - Ok(buffer) } } diff --git a/packages/rs-platform-version/Cargo.toml b/packages/rs-platform-version/Cargo.toml index 862cdc2046..950cb475ea 100644 --- a/packages/rs-platform-version/Cargo.toml +++ b/packages/rs-platform-version/Cargo.toml @@ -8,7 +8,7 @@ rust-version = "1.76" license = "MIT" [dependencies] -thiserror = { version = "1.0" } +thiserror = { version = "1.0.58" } [features] mock-versions = [] diff --git a/packages/rs-sdk/Cargo.toml b/packages/rs-sdk/Cargo.toml index 3ba71da29f..8019654323 100644 --- a/packages/rs-sdk/Cargo.toml +++ b/packages/rs-sdk/Cargo.toml @@ -94,7 +94,6 @@ generate-test-vectors = ["network-testing"] system-data-contracts = ["dpp/data-contracts"] - [[example]] name = "read_contract" diff --git a/packages/wasm-dpp/Cargo.toml b/packages/wasm-dpp/Cargo.toml index 70556299a7..84af02b8de 100644 --- a/packages/wasm-dpp/Cargo.toml +++ b/packages/wasm-dpp/Cargo.toml @@ -9,7 +9,7 @@ authors = ["Anton Suprunchuk "] crate-type = ["cdylib"] [dependencies] -serde = { version = "1.0.152", features = ["derive"] } +serde = { version = "1.0.197", features = ["derive"] } serde_json = { version = "1.0", features = ["preserve_order"] } # TODO: Build wasm with build.rs # Meantime if you want to update wasm-bindgen you also need to update version in: @@ -18,7 +18,7 @@ serde_json = { version = "1.0", features = ["preserve_order"] } wasm-bindgen = { version = "=0.2.86" } js-sys = "0.3.53" web-sys = { version = "0.3.6", features = ["console"] } -thiserror = { version = "1.0" } +thiserror = { version = "1.0.58" } serde-wasm-bindgen = { git = "https://github.com/QuantumExplorer/serde-wasm-bindgen", branch = "feat/not_human_readable" } dpp = { path = "../rs-dpp", default-features = false, features = [ "state-transition-serde-conversion", diff --git a/packages/withdrawals-contract/Cargo.toml b/packages/withdrawals-contract/Cargo.toml index f9b5787530..3fdef290b5 100644 --- a/packages/withdrawals-contract/Cargo.toml +++ b/packages/withdrawals-contract/Cargo.toml @@ -7,12 +7,12 @@ rust-version = "1.76" license = "MIT" [dependencies] -thiserror = "1.0.56" +thiserror = "1.0.58" platform-version = { path = "../rs-platform-version" } platform-value = { path = "../rs-platform-value" } num_enum = "0.5.7" # serde is required, `cargo machete` false positive -serde = { version = "1.0.152", features = ["derive"] } +serde = { version = "1.0.197", features = ["derive"] } serde_json = "1.0" serde_repr = "0.1.7" From c48f21695869e5c5e0fa8dbbe55b6bda781482ca Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Thu, 11 Apr 2024 03:25:10 +0700 Subject: [PATCH 127/191] chore(sdk): patch tower sub dependency to use new index_map version (#1810) --- Cargo.lock | 233 +++++++++++++++--------------- Cargo.toml | 5 + packages/dapi-grpc/Cargo.toml | 2 +- packages/rs-drive-abci/Cargo.toml | 2 +- 4 files changed, 125 insertions(+), 117 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2a586eb259..e200937462 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -122,9 +122,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.81" +version = "1.0.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0952808a6c2afd1aa8947271f3a60f1a6763c7b912d210184c5149b5cf147247" +checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519" [[package]] name = "arc-swap" @@ -192,7 +192,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.58", ] [[package]] @@ -203,7 +203,7 @@ checksum = "a507401cad91ec6a857ed5513a2073c82a9b9048762b885bb98655b306964681" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.58", ] [[package]] @@ -270,9 +270,9 @@ dependencies = [ [[package]] name = "backon" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c491fa80d69c03084223a4e73c378dd9f9a1e612eb54051213f88b2d5249b458" +checksum = "d67782c3f868daa71d3533538e98a8e13713231969def7536e8039606fc46bf0" dependencies = [ "fastrand 2.0.2", "futures-core", @@ -369,7 +369,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.55", + "syn 2.0.58", "which", ] @@ -390,7 +390,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.55", + "syn 2.0.58", ] [[package]] @@ -520,7 +520,7 @@ dependencies = [ "proc-macro-crate 3.1.0", "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.58", "syn_derive", ] @@ -541,9 +541,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.15.4" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytecheck" @@ -638,9 +638,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.0.90" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cd6604a82acf3039f1144f54b8eb34e91ffba622051189e71b781822d5ee1f5" +checksum = "2678b2e3449475e95b0aa6f9b506a28e61b3dc8996592b983695e8ebb58a8b41" dependencies = [ "jobserver", "libc", @@ -676,9 +676,9 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.35" +version = "0.4.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaf5903dcbc0a39312feb77df2ff4c76387d591b9fc7b04a238dcf8bb62639a" +checksum = "8a0d04d43504c61aa6c7531f1871dd0d418d91130162063b789da00fd7057a5e" dependencies = [ "android-tzdata", "iana-time-zone", @@ -754,7 +754,7 @@ dependencies = [ "anstream", "anstyle", "clap_lex", - "strsim 0.11.0", + "strsim 0.11.1", ] [[package]] @@ -766,7 +766,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.58", ] [[package]] @@ -807,8 +807,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd326812b3fd01da5bb1af7d340d0d555fd3d4b641e7f1dfcf5962a902952787" dependencies = [ "futures-core", - "prost 0.12.3", - "prost-types 0.12.3", + "prost 0.12.4", + "prost-types 0.12.4", "tonic 0.10.2", "tracing-core", ] @@ -825,7 +825,7 @@ dependencies = [ "futures-task", "hdrhistogram", "humantime", - "prost-types 0.12.3", + "prost-types 0.12.4", "serde", "serde_json", "thread_local", @@ -1005,7 +1005,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.58", ] [[package]] @@ -1015,7 +1015,7 @@ dependencies = [ "dapi-grpc-macros", "futures-core", "platform-version", - "prost 0.12.3", + "prost 0.12.4", "serde", "serde_bytes", "serde_json", @@ -1031,7 +1031,7 @@ dependencies = [ "dapi-grpc", "heck 0.5.0", "quote", - "syn 2.0.55", + "syn 2.0.58", ] [[package]] @@ -1055,7 +1055,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.10.0", - "syn 2.0.55", + "syn 2.0.58", ] [[package]] @@ -1066,7 +1066,7 @@ checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" dependencies = [ "darling_core", "quote", - "syn 2.0.55", + "syn 2.0.58", ] [[package]] @@ -1168,9 +1168,9 @@ dependencies = [ [[package]] name = "der" -version = "0.7.8" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" dependencies = [ "const-oid", "zeroize", @@ -1353,7 +1353,7 @@ dependencies = [ "envy", "file-rotate", "hex", - "indexmap 1.9.3", + "indexmap 2.2.6", "integer-encoding", "itertools 0.10.5", "lazy_static", @@ -1361,7 +1361,7 @@ dependencies = [ "metrics-exporter-prometheus", "mockall", "platform-version", - "prost 0.12.3", + "prost 0.12.4", "rand", "regex", "reopen", @@ -1469,7 +1469,7 @@ checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.58", ] [[package]] @@ -1760,7 +1760,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.58", ] [[package]] @@ -1805,9 +1805,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.12" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" +checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" dependencies = [ "cfg-if", "js-sys", @@ -1917,9 +1917,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.25" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fbd2820c5e49886948654ab546d0688ff24530286bdcf8fca3cefb16d4618eb" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" dependencies = [ "bytes", "fnv", @@ -2166,6 +2166,7 @@ checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" dependencies = [ "equivalent", "hashbrown 0.14.3", + "serde", ] [[package]] @@ -2371,7 +2372,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" dependencies = [ "cfg-if", - "windows-targets 0.48.5", + "windows-targets 0.52.4", ] [[package]] @@ -2484,9 +2485,9 @@ checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" [[package]] name = "memchr" -version = "2.7.1" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" +checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" [[package]] name = "metrics" @@ -2525,7 +2526,7 @@ checksum = "38b4faf00617defe497754acde3024865bc143d44a86799b24e191ecff91354f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.58", ] [[package]] @@ -2633,6 +2634,12 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" +[[package]] +name = "multimap" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" + [[package]] name = "murmur3" version = "0.5.2" @@ -2725,7 +2732,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.58", ] [[package]] @@ -2901,14 +2908,14 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.58", ] [[package]] name = "pin-project-lite" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" [[package]] name = "pin-utils" @@ -2946,7 +2953,7 @@ version = "1.0.0-dev.10" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.58", "virtue 0.0.14", ] @@ -2976,7 +2983,7 @@ name = "platform-value-convertible" version = "1.0.0-dev.10" dependencies = [ "quote", - "syn 2.0.55", + "syn 2.0.58", ] [[package]] @@ -2992,7 +2999,7 @@ version = "1.0.0-dev.10" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.58", ] [[package]] @@ -3120,7 +3127,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d3928fb5db768cb86f891ff014f0144589297e3c6a1aba6ed7cecfdace270c7" dependencies = [ "proc-macro2", - "syn 2.0.55", + "syn 2.0.58", ] [[package]] @@ -3187,12 +3194,12 @@ dependencies = [ [[package]] name = "prost" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "146c289cda302b98a28d40c8b3b90498d6e526dd24ac2ecea73e4e491685b94a" +checksum = "d0f5d036824e4761737860779c906171497f6d55681139d8312388f8fe398922" dependencies = [ "bytes", - "prost-derive 0.12.3", + "prost-derive 0.12.4", ] [[package]] @@ -3206,7 +3213,7 @@ dependencies = [ "itertools 0.10.5", "lazy_static", "log", - "multimap", + "multimap 0.8.3", "petgraph", "prettyplease 0.1.25", "prost 0.11.9", @@ -3219,24 +3226,23 @@ dependencies = [ [[package]] name = "prost-build" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c55e02e35260070b6f716a2423c2ff1c3bb1642ddca6f99e1f26d06268a0e2d2" +checksum = "80b776a1b2dc779f5ee0641f8ade0125bc1298dd41a9a0c16d8bd57b42d222b1" dependencies = [ "bytes", - "heck 0.4.1", - "itertools 0.10.5", + "heck 0.5.0", + "itertools 0.12.1", "log", - "multimap", + "multimap 0.10.0", "once_cell", "petgraph", "prettyplease 0.2.17", - "prost 0.12.3", - "prost-types 0.12.3", + "prost 0.12.4", + "prost-types 0.12.4", "regex", - "syn 2.0.55", + "syn 2.0.58", "tempfile", - "which", ] [[package]] @@ -3254,15 +3260,15 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efb6c9a1dd1def8e2124d17e83a20af56f1570d6c2d2bd9e266ccb768df3840e" +checksum = "19de2de2a00075bf566bee3bd4db014b11587e84184d3f7a791bc17f1a8e9e48" dependencies = [ "anyhow", - "itertools 0.10.5", + "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.58", ] [[package]] @@ -3276,11 +3282,11 @@ dependencies = [ [[package]] name = "prost-types" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "193898f59edcf43c26227dcd4c8427f00d99d61e95dcde58dabd49fa291d470e" +checksum = "3235c33eb02c1f1e212abdbe34c78b264b038fb58ca612664343271e36e55ffe" dependencies = [ - "prost 0.12.3", + "prost 0.12.4", ] [[package]] @@ -3332,9 +3338,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.35" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ "proc-macro2", ] @@ -3683,9 +3689,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "868e20fada228fefaf6b652e00cc73623d54f8171e7352c18bb281571f2d92da" +checksum = "ecd36cc4259e3e4514335c4a138c6b43171a8d61d8f5c9348f9fc7529416f247" [[package]] name = "rustls-webpki" @@ -3700,9 +3706,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" +checksum = "80af6f9131f277a45a3fba6ce8e2258037bb0477a67e610d3c1fe046ab31de47" [[package]] name = "ryu" @@ -3826,7 +3832,7 @@ checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.58", ] [[package]] @@ -3843,13 +3849,13 @@ dependencies = [ [[package]] name = "serde_repr" -version = "0.1.18" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b2e6b945e9d3df726b65d6ee24060aff8e3533d431f677a9695db04eff9dfdb" +checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.58", ] [[package]] @@ -3902,7 +3908,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.58", ] [[package]] @@ -3914,7 +3920,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.58", ] [[package]] @@ -4082,9 +4088,9 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "strsim" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "strum" @@ -4114,7 +4120,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.55", + "syn 2.0.58", ] [[package]] @@ -4127,7 +4133,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.55", + "syn 2.0.58", ] [[package]] @@ -4158,9 +4164,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.55" +version = "2.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "002a1b3dbf967edfafc32655d0f377ab0bb7b994aa1d32c8cc7e9b8bf3ebb8f0" +checksum = "44cfb93f38070beee36b3fef7d4f5a16f27751d94b187b666a5cc5e9b0d30687" dependencies = [ "proc-macro2", "quote", @@ -4176,7 +4182,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.58", ] [[package]] @@ -4230,7 +4236,7 @@ dependencies = [ "futures", "hex", "lhash", - "prost 0.12.3", + "prost 0.12.4", "semver", "serde_json", "tenderdash-proto", @@ -4254,8 +4260,8 @@ dependencies = [ "flex-error", "num-derive", "num-traits", - "prost 0.12.3", - "prost-types 0.12.3", + "prost 0.12.4", + "prost-types 0.12.4", "serde", "subtle-encoding", "tenderdash-proto-compiler", @@ -4269,7 +4275,7 @@ version = "0.14.0-dev.12" source = "git+https://github.com/dashpay/rs-tenderdash-abci#17e57f509c2bb7015042d69976bd1f056fef923d" dependencies = [ "fs_extra", - "prost-build 0.12.3", + "prost-build 0.12.4", "regex", "tempfile", "tonic-build 0.11.0", @@ -4341,7 +4347,7 @@ checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.58", ] [[package]] @@ -4356,9 +4362,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.34" +version = "0.3.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749" +checksum = "ef89ece63debf11bc32d1ed8d078ac870cbeb44da02afb02a9ff135ae7ca0582" dependencies = [ "deranged", "itoa", @@ -4377,9 +4383,9 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.17" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" dependencies = [ "num-conv", "time-core", @@ -4412,9 +4418,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.36.0" +version = "1.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" +checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" dependencies = [ "backtrace", "bytes", @@ -4448,7 +4454,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.58", ] [[package]] @@ -4563,7 +4569,7 @@ dependencies = [ "hyper-timeout", "percent-encoding", "pin-project", - "prost 0.12.3", + "prost 0.12.4", "tokio", "tokio-stream", "tower", @@ -4590,7 +4596,7 @@ dependencies = [ "hyper-timeout", "percent-encoding", "pin-project", - "prost 0.12.3", + "prost 0.12.4", "tokio", "tokio-stream", "tower", @@ -4620,20 +4626,19 @@ checksum = "be4ef6dd70a610078cb4e338a0f79d06bc759ff1b22d2120c2ff02ae264ba9c2" dependencies = [ "prettyplease 0.2.17", "proc-macro2", - "prost-build 0.12.3", + "prost-build 0.12.4", "quote", - "syn 2.0.55", + "syn 2.0.58", ] [[package]] name = "tower" version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +source = "git+https://github.com/QuantumExplorer/tower?branch=fix/indexMap2OnV0413#5286f8c605d10f48d51254f2434c5ab3fc5d7779" dependencies = [ "futures-core", "futures-util", - "indexmap 1.9.3", + "indexmap 2.2.6", "pin-project", "pin-project-lite", "rand", @@ -4648,14 +4653,12 @@ dependencies = [ [[package]] name = "tower-layer" version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" +source = "git+https://github.com/QuantumExplorer/tower?branch=fix/indexMap2OnV0413#5286f8c605d10f48d51254f2434c5ab3fc5d7779" [[package]] name = "tower-service" version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +source = "git+https://github.com/QuantumExplorer/tower?branch=fix/indexMap2OnV0413#5286f8c605d10f48d51254f2434c5ab3fc5d7779" [[package]] name = "tracing" @@ -4676,7 +4679,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.58", ] [[package]] @@ -4950,7 +4953,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.58", "wasm-bindgen-shared", ] @@ -4984,7 +4987,7 @@ checksum = "e128beba882dd1eb6200e1dc92ae6c5dbaa4311aa7bb211ca035779e5efc39f8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.58", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5295,7 +5298,7 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.58", ] [[package]] @@ -5318,9 +5321,9 @@ dependencies = [ [[package]] name = "zstd-sys" -version = "2.0.9+zstd.1.5.5" +version = "2.0.10+zstd.1.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e16efa8a874a0481a574084d34cc26fdb3b99627480f785888deb6386506656" +checksum = "c253a4914af5bafc8fa8c86ee400827e83cf6ec01195ec1f1ed8441bf00d65aa" dependencies = [ "cc", "pkg-config", diff --git a/Cargo.toml b/Cargo.toml index d4075d5d60..98fb0b914a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -28,3 +28,8 @@ members = [ "packages/simple-signer", "packages/check-features", ] + +[patch.crates-io] +tower-service = { git = "https://github.com/QuantumExplorer/tower", branch = "fix/indexMap2OnV0413" } +tower-layer = { git = "https://github.com/QuantumExplorer/tower", branch = "fix/indexMap2OnV0413" } +tower = { git = "https://github.com/QuantumExplorer/tower", branch = "fix/indexMap2OnV0413" } \ No newline at end of file diff --git a/packages/dapi-grpc/Cargo.toml b/packages/dapi-grpc/Cargo.toml index 080a337a18..bbdc747f4d 100644 --- a/packages/dapi-grpc/Cargo.toml +++ b/packages/dapi-grpc/Cargo.toml @@ -56,4 +56,4 @@ name = "platform_example" path = "clients/platform/v0/rust/platform_example.rs" [package.metadata.cargo-machete] -ignored = ["platform-version", "serde_bytes", "futures-core"] +ignored = ["platform-version", "serde_bytes", "futures-core"] \ No newline at end of file diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index b87100d7fb..a3e1ee400b 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -31,7 +31,7 @@ thiserror = "1.0.58" rand = "0.8.5" tempfile = "3.3.0" hex = "0.4.3" -indexmap = { version = "1.9.3", features = ["serde"] } +indexmap = { version = "2.2.6", features = ["serde"] } sha2 = "0.10.6" dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.2" } dpp = { path = "../rs-dpp", features = ["abci"] } From b322c81cdeb98412bce154d6389c3fb156d2a7ba Mon Sep 17 00:00:00 2001 From: Igor Markin Date: Thu, 11 Apr 2024 14:38:16 +0100 Subject: [PATCH 128/191] chore: fix node-tar security vulnerability (#1813) --- .pnp.cjs | 25 +++++++----------- ...nipass-npm-4.2.8-f05abfe254-e148eb6dcb.zip | Bin 22429 -> 0 bytes .../tar-npm-6.1.13-3234e72781-add2c3c6d0.zip | Bin 51649 -> 0 bytes .../tar-npm-6.2.1-237800bb20-bfbfbb2861.zip | Bin 0 -> 52576 bytes package.json | 2 ++ yarn.lock | 17 ++++-------- 6 files changed, 16 insertions(+), 28 deletions(-) delete mode 100644 .yarn/cache/minipass-npm-4.2.8-f05abfe254-e148eb6dcb.zip delete mode 100644 .yarn/cache/tar-npm-6.1.13-3234e72781-add2c3c6d0.zip create mode 100644 .yarn/cache/tar-npm-6.2.1-237800bb20-bfbfbb2861.zip diff --git a/.pnp.cjs b/.pnp.cjs index 899c2bff35..93a8e6f3ef 100755 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -5558,7 +5558,7 @@ const RAW_RUNTIME_STATE = ["p-limit", "npm:2.3.0"],\ ["semver", "npm:7.5.3"],\ ["strip-ansi", "npm:6.0.1"],\ - ["tar", "npm:6.1.13"],\ + ["tar", "npm:6.2.1"],\ ["tinylogic", "npm:2.0.0"],\ ["treeify", "npm:1.1.0"],\ ["tslib", "npm:2.6.2"],\ @@ -6990,7 +6990,7 @@ const RAW_RUNTIME_STATE = ["minipass-pipeline", "npm:1.2.4"],\ ["p-map", "npm:4.0.0"],\ ["ssri", "npm:10.0.5"],\ - ["tar", "npm:6.1.13"],\ + ["tar", "npm:6.2.1"],\ ["unique-filename", "npm:3.0.0"]\ ],\ "linkType": "HARD"\ @@ -13845,13 +13845,6 @@ const RAW_RUNTIME_STATE = ],\ "linkType": "HARD"\ }],\ - ["npm:4.2.8", {\ - "packageLocation": "./.yarn/cache/minipass-npm-4.2.8-f05abfe254-e148eb6dcb.zip/node_modules/minipass/",\ - "packageDependencies": [\ - ["minipass", "npm:4.2.8"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:5.0.0", {\ "packageLocation": "./.yarn/cache/minipass-npm-5.0.0-c64fb63c92-61682162d2.zip/node_modules/minipass/",\ "packageDependencies": [\ @@ -14366,7 +14359,7 @@ const RAW_RUNTIME_STATE = ["nopt", "npm:7.2.0"],\ ["proc-log", "npm:3.0.0"],\ ["semver", "npm:7.5.3"],\ - ["tar", "npm:6.1.13"],\ + ["tar", "npm:6.2.1"],\ ["which", "npm:4.0.0"]\ ],\ "linkType": "HARD"\ @@ -15218,7 +15211,7 @@ const RAW_RUNTIME_STATE = ["read-package-json-fast", "npm:2.0.3"],\ ["rimraf", "npm:3.0.2"],\ ["ssri", "npm:8.0.1"],\ - ["tar", "npm:6.1.13"]\ + ["tar", "npm:6.2.1"]\ ],\ "linkType": "HARD"\ }],\ @@ -15243,7 +15236,7 @@ const RAW_RUNTIME_STATE = ["read-package-json-fast", "npm:3.0.2"],\ ["sigstore", "npm:1.9.0"],\ ["ssri", "npm:10.0.5"],\ - ["tar", "npm:6.1.13"]\ + ["tar", "npm:6.2.1"]\ ],\ "linkType": "HARD"\ }]\ @@ -17808,13 +17801,13 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["tar", [\ - ["npm:6.1.13", {\ - "packageLocation": "./.yarn/cache/tar-npm-6.1.13-3234e72781-add2c3c6d0.zip/node_modules/tar/",\ + ["npm:6.2.1", {\ + "packageLocation": "./.yarn/cache/tar-npm-6.2.1-237800bb20-bfbfbb2861.zip/node_modules/tar/",\ "packageDependencies": [\ - ["tar", "npm:6.1.13"],\ + ["tar", "npm:6.2.1"],\ ["chownr", "npm:2.0.0"],\ ["fs-minipass", "npm:2.1.0"],\ - ["minipass", "npm:4.2.8"],\ + ["minipass", "npm:5.0.0"],\ ["minizlib", "npm:2.1.2"],\ ["mkdirp", "npm:1.0.4"],\ ["yallist", "npm:4.0.0"]\ diff --git a/.yarn/cache/minipass-npm-4.2.8-f05abfe254-e148eb6dcb.zip b/.yarn/cache/minipass-npm-4.2.8-f05abfe254-e148eb6dcb.zip deleted file mode 100644 index 7ce99cd2f4798b1626a3aff99ed04eccc65ee7da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22429 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 Z3ew;oB}#vMu@eGSe*DLO@A{+ne*ky#oi+df diff --git a/.yarn/cache/tar-npm-6.2.1-237800bb20-bfbfbb2861.zip b/.yarn/cache/tar-npm-6.2.1-237800bb20-bfbfbb2861.zip new file mode 100644 index 0000000000000000000000000000000000000000..066f404767f0c7e797bed0c7f44b8f8e03e1eb70 GIT binary patch literal 52576 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

    SKC3?Qzs=m@Aqu>BIgy!% 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 literal 0 HcmV?d00001 diff --git a/package.json b/package.json index 5df279e3cf..c68617047c 100644 --- a/package.json +++ b/package.json @@ -71,6 +71,7 @@ "bn.js": "4.12.0", "ejs": "^3.1.7", "fast-json-patch": "^3.1.1", + "node-tar": "^6.2.1", "oclif@3.4.2": "patch:oclif@npm:3.4.2#.yarn/patches/oclif-npm-3.4.2-a655d32eed.patch", "qs": "^6.7.3", "engine.io": "^6.4.2", @@ -84,6 +85,7 @@ "browserify-sign": "4.2.2", "istanbul-lib-processinfo": "2.0.3", "@babel/core": "7.23.3", + "tar": "^6.2.1", "tsconfig-paths": "4.2.0", "ansi-regex": "5.0.1", "cacache": "18.0.0", diff --git a/yarn.lock b/yarn.lock index 59d895d024..0c9f1d5de1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10859,13 +10859,6 @@ __metadata: languageName: node linkType: hard -"minipass@npm:^4.0.0": - version: 4.2.8 - resolution: "minipass@npm:4.2.8" - checksum: e148eb6dcb85c980234cad889139ef8ddf9d5bdac534f4f0268446c8792dd4c74f4502479be48de3c1cce2f6450f6da4d0d4a86405a8a12be04c1c36b339569a - languageName: node - linkType: hard - "minipass@npm:^5.0.0": version: 5.0.0 resolution: "minipass@npm:5.0.0" @@ -14406,17 +14399,17 @@ __metadata: languageName: node linkType: hard -"tar@npm:^6.0.5, tar@npm:^6.1.0, tar@npm:^6.1.11, tar@npm:^6.1.2": - version: 6.1.13 - resolution: "tar@npm:6.1.13" +"tar@npm:^6.2.1": + version: 6.2.1 + resolution: "tar@npm:6.2.1" dependencies: chownr: "npm:^2.0.0" fs-minipass: "npm:^2.0.0" - minipass: "npm:^4.0.0" + minipass: "npm:^5.0.0" minizlib: "npm:^2.1.1" mkdirp: "npm:^1.0.3" yallist: "npm:^4.0.0" - checksum: add2c3c6d0d71192186ec118d265b92d94be5cd57a0b8fdf0d29ee46dc846574925a5fc57170eefffd78201eda4c45d7604070b5a4b0648e4d6e1d65918b5a82 + checksum: bfbfbb2861888077fc1130b84029cdc2721efb93d1d1fb80f22a7ac3a98ec6f8972f29e564103bbebf5e97be67ebc356d37fa48dbc4960600a1eb7230fbd1ea0 languageName: node linkType: hard From 96589cc7e2f5b663a29210fb78aca81cb5fc69e5 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Fri, 12 Apr 2024 14:44:23 +0700 Subject: [PATCH 129/191] fix(dpp)!: incorrect json schema compatibility validation (#1814) --- .github/package-filters/rs-packages.yml | 5 + Cargo.lock | 39 +- Cargo.toml | 3 +- .../core/proto/org.dash.platform.dapi.v0.rs | 522 +++++++ .../proto/org.dash.platform.dapi.v0.rs | 1212 +++++++++++++++ packages/rs-dpp/Cargo.toml | 3 +- .../validate_schema_compatibility/mod.rs | 26 +- .../validate_schema_compatibility/v0/mod.rs | 417 +---- .../data_contract/errors/json_schema_error.rs | 3 + ...incompatible_data_contract_schema_error.rs | 19 +- .../data_contract_update/state/v0/mod.rs | 105 +- .../Cargo.toml | 21 + .../src/change.rs | 70 + .../src/error.rs | 106 ++ .../src/lib.rs | 9 + .../src/rules/compatibility_rules.rs | 120 ++ .../src/rules/mod.rs | 8 + .../src/rules/rule_set.rs | 1378 +++++++++++++++++ .../src/rules/value.rs | 75 + .../src/validate.rs | 204 +++ .../tests/reorder.rs | 170 ++ .../tests/rules.rs | 49 + 22 files changed, 4058 insertions(+), 506 deletions(-) create mode 100644 packages/rs-json-schema-compatibility-validator/Cargo.toml create mode 100644 packages/rs-json-schema-compatibility-validator/src/change.rs create mode 100644 packages/rs-json-schema-compatibility-validator/src/error.rs create mode 100644 packages/rs-json-schema-compatibility-validator/src/lib.rs create mode 100644 packages/rs-json-schema-compatibility-validator/src/rules/compatibility_rules.rs create mode 100644 packages/rs-json-schema-compatibility-validator/src/rules/mod.rs create mode 100644 packages/rs-json-schema-compatibility-validator/src/rules/rule_set.rs create mode 100644 packages/rs-json-schema-compatibility-validator/src/rules/value.rs create mode 100644 packages/rs-json-schema-compatibility-validator/src/validate.rs create mode 100644 packages/rs-json-schema-compatibility-validator/tests/reorder.rs create mode 100644 packages/rs-json-schema-compatibility-validator/tests/rules.rs diff --git a/.github/package-filters/rs-packages.yml b/.github/package-filters/rs-packages.yml index f23238f9af..efccab2973 100644 --- a/.github/package-filters/rs-packages.yml +++ b/.github/package-filters/rs-packages.yml @@ -14,6 +14,10 @@ dpns-contract: &dpns-contract - .github/workflows/tests* - packages/dpns-contract/** +json-schema-compatibility-validator: &json-schema-compatibility-validator + - .github/workflows/tests* + - packages/rs-json-schema-compatibility-validator/** + dpp: &dpp - .github/workflows/tests* - packages/rs-dpp/** @@ -21,6 +25,7 @@ dpp: &dpp - *masternode-reward-shares-contract - *dpns-contract - *withdrawals-contract + - *json-schema-compatibility-validator - packages/rs-platform-serialization/** - packages/rs-platform-serialization-derive/** - packages/rs-platform-value/** diff --git a/Cargo.lock b/Cargo.lock index e200937462..a8482a4d78 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1267,8 +1267,7 @@ dependencies = [ "indexmap 2.2.6", "integer-encoding", "itertools 0.12.1", - "json-patch", - "jsonptr", + "json-schema-compatibility-validator", "jsonschema", "lazy_static", "log", @@ -2283,25 +2282,25 @@ dependencies = [ [[package]] name = "json-patch" -version = "0.2.7" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb3fa5a61630976fc4c353c70297f2e93f1930e3ccee574d59d618ccbd5154ce" +checksum = "55ff1e1486799e3f64129f8ccad108b38290df9cd7015cd31bed17239f0789d6" dependencies = [ "serde", "serde_json", - "treediff 3.0.2", + "thiserror", + "treediff 4.0.3", ] [[package]] -name = "jsonptr" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04e7a1ae7fc3e87c05f7a3de7e51083f62cdafcd9fed52cffebca22819a8f799" +name = "json-schema-compatibility-validator" +version = "0.25.16-rc.3" dependencies = [ - "serde", + "json-patch", + "json-schema-compatibility-validator", + "once_cell", "serde_json", - "uniresid", - "url", + "thiserror", ] [[package]] @@ -4736,9 +4735,9 @@ dependencies = [ [[package]] name = "treediff" -version = "3.0.2" +version = "4.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "761e8d5ad7ce14bb82b7e61ccc0ca961005a275a060b9644a2431aa11553c2ff" +checksum = "4d127780145176e2b5d16611cc25a900150e86e9fd79d3bde6ff3a37359c9cb5" dependencies = [ "serde_json", ] @@ -4809,18 +4808,6 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" -[[package]] -name = "uniresid" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "995a4007fbec4f43386ea1b1d81d42d986a0c9616378e9aa4a96f45ea661e1b0" -dependencies = [ - "once_cell", - "serde", - "thiserror", - "url", -] - [[package]] name = "untrusted" version = "0.9.0" diff --git a/Cargo.toml b/Cargo.toml index 98fb0b914a..bdf98a874f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,10 +26,11 @@ members = [ "packages/rs-sdk", "packages/strategy-tests", "packages/simple-signer", + "packages/rs-json-schema-compatibility-validator", "packages/check-features", ] [patch.crates-io] tower-service = { git = "https://github.com/QuantumExplorer/tower", branch = "fix/indexMap2OnV0413" } tower-layer = { git = "https://github.com/QuantumExplorer/tower", branch = "fix/indexMap2OnV0413" } -tower = { git = "https://github.com/QuantumExplorer/tower", branch = "fix/indexMap2OnV0413" } \ No newline at end of file +tower = { git = "https://github.com/QuantumExplorer/tower", branch = "fix/indexMap2OnV0413" } diff --git a/packages/dapi-grpc/src/core/proto/org.dash.platform.dapi.v0.rs b/packages/dapi-grpc/src/core/proto/org.dash.platform.dapi.v0.rs index b8fb055c6c..05b6d41005 100644 --- a/packages/dapi-grpc/src/core/proto/org.dash.platform.dapi.v0.rs +++ b/packages/dapi-grpc/src/core/proto/org.dash.platform.dapi.v0.rs @@ -719,3 +719,525 @@ pub mod core_client { } } } +/// Generated server implementations. +pub mod core_server { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + /// Generated trait containing gRPC methods that should be implemented for use with CoreServer. + #[async_trait] + pub trait Core: Send + Sync + 'static { + async fn get_status( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_block( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn broadcast_transaction( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_transaction( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_estimated_transaction_fee( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /// Server streaming response type for the subscribeToBlockHeadersWithChainLocks method. + type subscribeToBlockHeadersWithChainLocksStream: futures_core::Stream< + Item = std::result::Result< + super::BlockHeadersWithChainLocksResponse, + tonic::Status, + >, + > + + Send + + 'static; + async fn subscribe_to_block_headers_with_chain_locks( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /// Server streaming response type for the subscribeToTransactionsWithProofs method. + type subscribeToTransactionsWithProofsStream: futures_core::Stream< + Item = std::result::Result< + super::TransactionsWithProofsResponse, + tonic::Status, + >, + > + + Send + + 'static; + async fn subscribe_to_transactions_with_proofs( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + } + #[derive(Debug)] + pub struct CoreServer { + inner: _Inner, + accept_compression_encodings: EnabledCompressionEncodings, + send_compression_encodings: EnabledCompressionEncodings, + max_decoding_message_size: Option, + max_encoding_message_size: Option, + } + struct _Inner(Arc); + impl CoreServer { + pub fn new(inner: T) -> Self { + Self::from_arc(Arc::new(inner)) + } + pub fn from_arc(inner: Arc) -> Self { + let inner = _Inner(inner); + Self { + inner, + accept_compression_encodings: Default::default(), + send_compression_encodings: Default::default(), + max_decoding_message_size: None, + max_encoding_message_size: None, + } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> InterceptedService + where + F: tonic::service::Interceptor, + { + InterceptedService::new(Self::new(inner), interceptor) + } + /// Enable decompressing requests with the given encoding. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.accept_compression_encodings.enable(encoding); + self + } + /// Compress responses with the given encoding, if the client supports it. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.send_compression_encodings.enable(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.max_decoding_message_size = Some(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.max_encoding_message_size = Some(limit); + self + } + } + impl tonic::codegen::Service> for CoreServer + where + T: Core, + B: Body + Send + 'static, + B::Error: Into + Send + 'static, + { + type Response = http::Response; + type Error = std::convert::Infallible; + type Future = BoxFuture; + fn poll_ready( + &mut self, + _cx: &mut Context<'_>, + ) -> Poll> { + Poll::Ready(Ok(())) + } + fn call(&mut self, req: http::Request) -> Self::Future { + let inner = self.inner.clone(); + match req.uri().path() { + "/org.dash.platform.dapi.v0.Core/getStatus" => { + #[allow(non_camel_case_types)] + struct getStatusSvc(pub Arc); + impl tonic::server::UnaryService + for getStatusSvc { + type Response = super::GetStatusResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { (*inner).get_status(request).await }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = getStatusSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/org.dash.platform.dapi.v0.Core/getBlock" => { + #[allow(non_camel_case_types)] + struct getBlockSvc(pub Arc); + impl tonic::server::UnaryService + for getBlockSvc { + type Response = super::GetBlockResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { (*inner).get_block(request).await }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = getBlockSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/org.dash.platform.dapi.v0.Core/broadcastTransaction" => { + #[allow(non_camel_case_types)] + struct broadcastTransactionSvc(pub Arc); + impl< + T: Core, + > tonic::server::UnaryService + for broadcastTransactionSvc { + type Response = super::BroadcastTransactionResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner).broadcast_transaction(request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = broadcastTransactionSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/org.dash.platform.dapi.v0.Core/getTransaction" => { + #[allow(non_camel_case_types)] + struct getTransactionSvc(pub Arc); + impl< + T: Core, + > tonic::server::UnaryService + for getTransactionSvc { + type Response = super::GetTransactionResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner).get_transaction(request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = getTransactionSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/org.dash.platform.dapi.v0.Core/getEstimatedTransactionFee" => { + #[allow(non_camel_case_types)] + struct getEstimatedTransactionFeeSvc(pub Arc); + impl< + T: Core, + > tonic::server::UnaryService< + super::GetEstimatedTransactionFeeRequest, + > for getEstimatedTransactionFeeSvc { + type Response = super::GetEstimatedTransactionFeeResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::GetEstimatedTransactionFeeRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner).get_estimated_transaction_fee(request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = getEstimatedTransactionFeeSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/org.dash.platform.dapi.v0.Core/subscribeToBlockHeadersWithChainLocks" => { + #[allow(non_camel_case_types)] + struct subscribeToBlockHeadersWithChainLocksSvc(pub Arc); + impl< + T: Core, + > tonic::server::ServerStreamingService< + super::BlockHeadersWithChainLocksRequest, + > for subscribeToBlockHeadersWithChainLocksSvc { + type Response = super::BlockHeadersWithChainLocksResponse; + type ResponseStream = T::subscribeToBlockHeadersWithChainLocksStream; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::BlockHeadersWithChainLocksRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner) + .subscribe_to_block_headers_with_chain_locks(request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = subscribeToBlockHeadersWithChainLocksSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.server_streaming(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/org.dash.platform.dapi.v0.Core/subscribeToTransactionsWithProofs" => { + #[allow(non_camel_case_types)] + struct subscribeToTransactionsWithProofsSvc(pub Arc); + impl< + T: Core, + > tonic::server::ServerStreamingService< + super::TransactionsWithProofsRequest, + > for subscribeToTransactionsWithProofsSvc { + type Response = super::TransactionsWithProofsResponse; + type ResponseStream = T::subscribeToTransactionsWithProofsStream; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner) + .subscribe_to_transactions_with_proofs(request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = subscribeToTransactionsWithProofsSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.server_streaming(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + _ => { + Box::pin(async move { + Ok( + http::Response::builder() + .status(200) + .header("grpc-status", "12") + .header("content-type", "application/grpc") + .body(empty_body()) + .unwrap(), + ) + }) + } + } + } + } + impl Clone for CoreServer { + fn clone(&self) -> Self { + let inner = self.inner.clone(); + Self { + inner, + accept_compression_encodings: self.accept_compression_encodings, + send_compression_encodings: self.send_compression_encodings, + max_decoding_message_size: self.max_decoding_message_size, + max_encoding_message_size: self.max_encoding_message_size, + } + } + } + impl Clone for _Inner { + fn clone(&self) -> Self { + Self(Arc::clone(&self.0)) + } + } + impl std::fmt::Debug for _Inner { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{:?}", self.0) + } + } + impl tonic::server::NamedService for CoreServer { + const NAME: &'static str = "org.dash.platform.dapi.v0.Core"; + } +} diff --git a/packages/dapi-grpc/src/platform/proto/org.dash.platform.dapi.v0.rs b/packages/dapi-grpc/src/platform/proto/org.dash.platform.dapi.v0.rs index 97dd080723..0f6446f156 100644 --- a/packages/dapi-grpc/src/platform/proto/org.dash.platform.dapi.v0.rs +++ b/packages/dapi-grpc/src/platform/proto/org.dash.platform.dapi.v0.rs @@ -2818,3 +2818,1215 @@ pub mod platform_client { } } } +/// Generated server implementations. +pub mod platform_server { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + /// Generated trait containing gRPC methods that should be implemented for use with PlatformServer. + #[async_trait] + pub trait Platform: Send + Sync + 'static { + async fn broadcast_state_transition( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_identity( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_identities( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_identity_keys( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_identity_nonce( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_identity_contract_nonce( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_identity_balance( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_identity_balance_and_revision( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_proofs( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_data_contract( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_data_contract_history( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_data_contracts( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_documents( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_identities_by_public_key_hashes( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_identity_by_public_key_hash( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn wait_for_state_transition_result( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_consensus_params( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_protocol_version_upgrade_state( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_protocol_version_upgrade_vote_status( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn get_epochs_info( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + } + #[derive(Debug)] + pub struct PlatformServer { + inner: _Inner, + accept_compression_encodings: EnabledCompressionEncodings, + send_compression_encodings: EnabledCompressionEncodings, + max_decoding_message_size: Option, + max_encoding_message_size: Option, + } + struct _Inner(Arc); + impl PlatformServer { + pub fn new(inner: T) -> Self { + Self::from_arc(Arc::new(inner)) + } + pub fn from_arc(inner: Arc) -> Self { + let inner = _Inner(inner); + Self { + inner, + accept_compression_encodings: Default::default(), + send_compression_encodings: Default::default(), + max_decoding_message_size: None, + max_encoding_message_size: None, + } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> InterceptedService + where + F: tonic::service::Interceptor, + { + InterceptedService::new(Self::new(inner), interceptor) + } + /// Enable decompressing requests with the given encoding. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.accept_compression_encodings.enable(encoding); + self + } + /// Compress responses with the given encoding, if the client supports it. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.send_compression_encodings.enable(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.max_decoding_message_size = Some(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.max_encoding_message_size = Some(limit); + self + } + } + impl tonic::codegen::Service> for PlatformServer + where + T: Platform, + B: Body + Send + 'static, + B::Error: Into + Send + 'static, + { + type Response = http::Response; + type Error = std::convert::Infallible; + type Future = BoxFuture; + fn poll_ready( + &mut self, + _cx: &mut Context<'_>, + ) -> Poll> { + Poll::Ready(Ok(())) + } + fn call(&mut self, req: http::Request) -> Self::Future { + let inner = self.inner.clone(); + match req.uri().path() { + "/org.dash.platform.dapi.v0.Platform/broadcastStateTransition" => { + #[allow(non_camel_case_types)] + struct broadcastStateTransitionSvc(pub Arc); + impl< + T: Platform, + > tonic::server::UnaryService + for broadcastStateTransitionSvc { + type Response = super::BroadcastStateTransitionResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::BroadcastStateTransitionRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner).broadcast_state_transition(request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = broadcastStateTransitionSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/org.dash.platform.dapi.v0.Platform/getIdentity" => { + #[allow(non_camel_case_types)] + struct getIdentitySvc(pub Arc); + impl< + T: Platform, + > tonic::server::UnaryService + for getIdentitySvc { + type Response = super::GetIdentityResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner).get_identity(request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = getIdentitySvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/org.dash.platform.dapi.v0.Platform/getIdentities" => { + #[allow(non_camel_case_types)] + struct getIdentitiesSvc(pub Arc); + impl< + T: Platform, + > tonic::server::UnaryService + for getIdentitiesSvc { + type Response = super::GetIdentitiesResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner).get_identities(request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = getIdentitiesSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/org.dash.platform.dapi.v0.Platform/getIdentityKeys" => { + #[allow(non_camel_case_types)] + struct getIdentityKeysSvc(pub Arc); + impl< + T: Platform, + > tonic::server::UnaryService + for getIdentityKeysSvc { + type Response = super::GetIdentityKeysResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner).get_identity_keys(request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = getIdentityKeysSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/org.dash.platform.dapi.v0.Platform/getIdentityNonce" => { + #[allow(non_camel_case_types)] + struct getIdentityNonceSvc(pub Arc); + impl< + T: Platform, + > tonic::server::UnaryService + for getIdentityNonceSvc { + type Response = super::GetIdentityNonceResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner).get_identity_nonce(request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = getIdentityNonceSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/org.dash.platform.dapi.v0.Platform/getIdentityContractNonce" => { + #[allow(non_camel_case_types)] + struct getIdentityContractNonceSvc(pub Arc); + impl< + T: Platform, + > tonic::server::UnaryService + for getIdentityContractNonceSvc { + type Response = super::GetIdentityContractNonceResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::GetIdentityContractNonceRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner).get_identity_contract_nonce(request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = getIdentityContractNonceSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/org.dash.platform.dapi.v0.Platform/getIdentityBalance" => { + #[allow(non_camel_case_types)] + struct getIdentityBalanceSvc(pub Arc); + impl< + T: Platform, + > tonic::server::UnaryService + for getIdentityBalanceSvc { + type Response = super::GetIdentityBalanceResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner).get_identity_balance(request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = getIdentityBalanceSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/org.dash.platform.dapi.v0.Platform/getIdentityBalanceAndRevision" => { + #[allow(non_camel_case_types)] + struct getIdentityBalanceAndRevisionSvc(pub Arc); + impl< + T: Platform, + > tonic::server::UnaryService< + super::GetIdentityBalanceAndRevisionRequest, + > for getIdentityBalanceAndRevisionSvc { + type Response = super::GetIdentityBalanceAndRevisionResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::GetIdentityBalanceAndRevisionRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner).get_identity_balance_and_revision(request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = getIdentityBalanceAndRevisionSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/org.dash.platform.dapi.v0.Platform/getProofs" => { + #[allow(non_camel_case_types)] + struct getProofsSvc(pub Arc); + impl< + T: Platform, + > tonic::server::UnaryService + for getProofsSvc { + type Response = super::GetProofsResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { (*inner).get_proofs(request).await }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = getProofsSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/org.dash.platform.dapi.v0.Platform/getDataContract" => { + #[allow(non_camel_case_types)] + struct getDataContractSvc(pub Arc); + impl< + T: Platform, + > tonic::server::UnaryService + for getDataContractSvc { + type Response = super::GetDataContractResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner).get_data_contract(request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = getDataContractSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/org.dash.platform.dapi.v0.Platform/getDataContractHistory" => { + #[allow(non_camel_case_types)] + struct getDataContractHistorySvc(pub Arc); + impl< + T: Platform, + > tonic::server::UnaryService + for getDataContractHistorySvc { + type Response = super::GetDataContractHistoryResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner).get_data_contract_history(request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = getDataContractHistorySvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/org.dash.platform.dapi.v0.Platform/getDataContracts" => { + #[allow(non_camel_case_types)] + struct getDataContractsSvc(pub Arc); + impl< + T: Platform, + > tonic::server::UnaryService + for getDataContractsSvc { + type Response = super::GetDataContractsResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner).get_data_contracts(request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = getDataContractsSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/org.dash.platform.dapi.v0.Platform/getDocuments" => { + #[allow(non_camel_case_types)] + struct getDocumentsSvc(pub Arc); + impl< + T: Platform, + > tonic::server::UnaryService + for getDocumentsSvc { + type Response = super::GetDocumentsResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner).get_documents(request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = getDocumentsSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/org.dash.platform.dapi.v0.Platform/getIdentitiesByPublicKeyHashes" => { + #[allow(non_camel_case_types)] + struct getIdentitiesByPublicKeyHashesSvc(pub Arc); + impl< + T: Platform, + > tonic::server::UnaryService< + super::GetIdentitiesByPublicKeyHashesRequest, + > for getIdentitiesByPublicKeyHashesSvc { + type Response = super::GetIdentitiesByPublicKeyHashesResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::GetIdentitiesByPublicKeyHashesRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner).get_identities_by_public_key_hashes(request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = getIdentitiesByPublicKeyHashesSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/org.dash.platform.dapi.v0.Platform/getIdentityByPublicKeyHash" => { + #[allow(non_camel_case_types)] + struct getIdentityByPublicKeyHashSvc(pub Arc); + impl< + T: Platform, + > tonic::server::UnaryService< + super::GetIdentityByPublicKeyHashRequest, + > for getIdentityByPublicKeyHashSvc { + type Response = super::GetIdentityByPublicKeyHashResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::GetIdentityByPublicKeyHashRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner).get_identity_by_public_key_hash(request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = getIdentityByPublicKeyHashSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/org.dash.platform.dapi.v0.Platform/waitForStateTransitionResult" => { + #[allow(non_camel_case_types)] + struct waitForStateTransitionResultSvc(pub Arc); + impl< + T: Platform, + > tonic::server::UnaryService< + super::WaitForStateTransitionResultRequest, + > for waitForStateTransitionResultSvc { + type Response = super::WaitForStateTransitionResultResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::WaitForStateTransitionResultRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner).wait_for_state_transition_result(request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = waitForStateTransitionResultSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/org.dash.platform.dapi.v0.Platform/getConsensusParams" => { + #[allow(non_camel_case_types)] + struct getConsensusParamsSvc(pub Arc); + impl< + T: Platform, + > tonic::server::UnaryService + for getConsensusParamsSvc { + type Response = super::GetConsensusParamsResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner).get_consensus_params(request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = getConsensusParamsSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/org.dash.platform.dapi.v0.Platform/getProtocolVersionUpgradeState" => { + #[allow(non_camel_case_types)] + struct getProtocolVersionUpgradeStateSvc(pub Arc); + impl< + T: Platform, + > tonic::server::UnaryService< + super::GetProtocolVersionUpgradeStateRequest, + > for getProtocolVersionUpgradeStateSvc { + type Response = super::GetProtocolVersionUpgradeStateResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::GetProtocolVersionUpgradeStateRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner).get_protocol_version_upgrade_state(request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = getProtocolVersionUpgradeStateSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/org.dash.platform.dapi.v0.Platform/getProtocolVersionUpgradeVoteStatus" => { + #[allow(non_camel_case_types)] + struct getProtocolVersionUpgradeVoteStatusSvc( + pub Arc, + ); + impl< + T: Platform, + > tonic::server::UnaryService< + super::GetProtocolVersionUpgradeVoteStatusRequest, + > for getProtocolVersionUpgradeVoteStatusSvc { + type Response = super::GetProtocolVersionUpgradeVoteStatusResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request< + super::GetProtocolVersionUpgradeVoteStatusRequest, + >, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner) + .get_protocol_version_upgrade_vote_status(request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = getProtocolVersionUpgradeVoteStatusSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/org.dash.platform.dapi.v0.Platform/getEpochsInfo" => { + #[allow(non_camel_case_types)] + struct getEpochsInfoSvc(pub Arc); + impl< + T: Platform, + > tonic::server::UnaryService + for getEpochsInfoSvc { + type Response = super::GetEpochsInfoResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner).get_epochs_info(request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = getEpochsInfoSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + _ => { + Box::pin(async move { + Ok( + http::Response::builder() + .status(200) + .header("grpc-status", "12") + .header("content-type", "application/grpc") + .body(empty_body()) + .unwrap(), + ) + }) + } + } + } + } + impl Clone for PlatformServer { + fn clone(&self) -> Self { + let inner = self.inner.clone(); + Self { + inner, + accept_compression_encodings: self.accept_compression_encodings, + send_compression_encodings: self.send_compression_encodings, + max_decoding_message_size: self.max_decoding_message_size, + max_encoding_message_size: self.max_encoding_message_size, + } + } + } + impl Clone for _Inner { + fn clone(&self) -> Self { + Self(Arc::clone(&self.0)) + } + } + impl std::fmt::Debug for _Inner { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{:?}", self.0) + } + } + impl tonic::server::NamedService for PlatformServer { + const NAME: &'static str = "org.dash.platform.dapi.v0.Platform"; + } +} diff --git a/packages/rs-dpp/Cargo.toml b/packages/rs-dpp/Cargo.toml index 6537e54a2b..7c39d54dea 100644 --- a/packages/rs-dpp/Cargo.toml +++ b/packages/rs-dpp/Cargo.toml @@ -35,8 +35,6 @@ getrandom = { version = "0.2", features = ["js"] } hex = { version = "0.4" } integer-encoding = { version = "4.0.0" } itertools = { version = "0.12.1" } -json-patch = "0.2.6" -jsonptr = "0.1.5" jsonschema = { git = "https://github.com/fominok/jsonschema-rs", branch = "feat-unevaluated-properties", default-features = false, features = [ "draft202012", ], optional = true } @@ -64,6 +62,7 @@ rust_decimal = "1.29.1" rust_decimal_macros = "1.29.1" indexmap = { version = "2.0.2"} strum = { version = "0.25.0", features = ["derive"] } +json-schema-compatibility-validator = { path = '../rs-json-schema-compatibility-validator' } [dev-dependencies] test-case = { version = "2.0" } diff --git a/packages/rs-dpp/src/data_contract/document_type/schema/validate_schema_compatibility/mod.rs b/packages/rs-dpp/src/data_contract/document_type/schema/validate_schema_compatibility/mod.rs index 41ddc7b3d6..182f808258 100644 --- a/packages/rs-dpp/src/data_contract/document_type/schema/validate_schema_compatibility/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/schema/validate_schema_compatibility/mod.rs @@ -4,14 +4,19 @@ use platform_version::version::PlatformVersion; mod v0; -use crate::data_contract::document_type::schema::validate_schema_compatibility::v0::IncompatibleOperations; -pub use v0::EMPTY_JSON; +use crate::validation::SimpleValidationResult; + +#[derive(Debug, Clone)] +pub struct IncompatibleJsonSchemaOperation { + pub name: String, + pub path: String, +} pub fn validate_schema_compatibility( original_schema: &JsonValue, new_schema: &JsonValue, platform_version: &PlatformVersion, -) -> Result { +) -> Result, ProtocolError> { match platform_version .dpp .contract_versions @@ -19,7 +24,7 @@ pub fn validate_schema_compatibility( .schema .validate_schema_compatibility { - 0 => v0::validate_schema_compatibility(original_schema, new_schema), + 0 => v0::validate_schema_compatibility_v0(original_schema, new_schema), version => Err(ProtocolError::UnknownVersionMismatch { method: "validate_schema_compatibility".to_string(), known_versions: vec![0], @@ -27,16 +32,3 @@ pub fn validate_schema_compatibility( }), } } - -pub fn get_operation_and_property_name_json( - p: &json_patch::PatchOperation, -) -> (&'static str, &str) { - match &p { - json_patch::PatchOperation::Add(ref o) => ("add json", o.path.as_str()), - json_patch::PatchOperation::Copy(ref o) => ("copy json", o.path.as_str()), - json_patch::PatchOperation::Remove(ref o) => ("remove json", o.path.as_str()), - json_patch::PatchOperation::Replace(ref o) => ("replace json", o.path.as_str()), - json_patch::PatchOperation::Move(ref o) => ("move json", o.path.as_str()), - json_patch::PatchOperation::Test(ref o) => ("test json", o.path.as_str()), - } -} diff --git a/packages/rs-dpp/src/data_contract/document_type/schema/validate_schema_compatibility/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/schema/validate_schema_compatibility/v0/mod.rs index 5373fad695..fd583b0b54 100644 --- a/packages/rs-dpp/src/data_contract/document_type/schema/validate_schema_compatibility/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/schema/validate_schema_compatibility/v0/mod.rs @@ -1,397 +1,30 @@ -use std::collections::BTreeMap; -/// The Schema compatibility validator is a port of a JavaScript version -/// https://bitbucket.org/atlassian/json-schema-diff-validator/src/master/ -/// -/// The functionality has been ported 'as is' without any logic improvements and optimizations -use std::convert::TryFrom; - -use crate::data_contract::DocumentName; +use crate::data_contract::document_type::schema::IncompatibleJsonSchemaOperation; +use crate::data_contract::errors::{DataContractError, JsonSchemaError}; +use crate::data_contract::JsonValue; +use crate::validation::SimpleValidationResult; use crate::ProtocolError; -use anyhow::Context; -use itertools::Itertools; -use json_patch::PatchOperation; -use jsonptr::{Pointer, Resolve}; -use lazy_static::lazy_static; -use serde_json::{json, Value as JsonValue}; - -lazy_static! { - pub static ref EMPTY_JSON: JsonValue = json!({}); -} - -mod property_names { - pub const REQUIRED: &str = "required"; - pub const DEFINITIONS: &str = "definitions"; - pub const PROPERTIES: &str = "properties"; - pub const REF: &str = "$ref"; - pub const MIN_ITEMS: &str = "minItems"; -} - -#[derive(Default, Debug, Clone)] -pub struct ValidationOptions { - pub allow_new_one_of: bool, - pub allow_new_enum_value: bool, - pub allow_reorder: bool, - pub deprecated_items: Vec, -} - -struct RemovedItem { - name: String, - operation: PatchOperation, -} - -pub type IncompatibleOperations = Vec; - -pub fn any_schema_changes( - old_schema: &BTreeMap, - new_schema: &JsonValue, -) -> bool { - let changes = old_schema - .iter() - .filter(|(document_type, original_schema)| { - let new_document_schema = new_schema.get(document_type).unwrap_or(&EMPTY_JSON); - let diff = json_patch::diff(original_schema, new_document_schema); - !diff.0.is_empty() - }) - .count(); - - changes > 0 -} - -pub fn validate_schema_compatibility( - original_schema: &JsonValue, - new_schema: &JsonValue, -) -> Result { - validate_schema_compatibility_with_options( - original_schema, - new_schema, - ValidationOptions::default(), - ) -} +use json_schema_compatibility_validator::validate_schemas_compatibility; -pub fn validate_schema_compatibility_with_options( +pub(super) fn validate_schema_compatibility_v0( original_schema: &JsonValue, new_schema: &JsonValue, - opts: ValidationOptions, -) -> Result { - let patch = json_patch::diff(original_schema, new_schema); - let mut diffs: Vec = vec![]; - let mut removed: Vec = vec![]; - let mut inserted: Vec = vec![]; - - for operation in patch.0.into_iter() { - match operation { - PatchOperation::Move(ref op_move) => { - if is_operation_move_remove_compatible( - op_move.path.as_str(), - original_schema, - &opts, - )? { - continue; - } - diffs.push(operation); - } - - PatchOperation::Remove(ref op_remove) => { - if is_operation_move_remove_compatible( - op_remove.path.as_str(), - original_schema, - &opts, - )? { - continue; - } - diffs.push(operation); - } - - PatchOperation::Replace(ref op_replace) => { - let is_min_items = is_min_items(&op_replace.path); - let json_pointer = - Pointer::try_from(op_replace.path.as_str()).with_context(|| { - format!("unable to create a json pointer from '{}'", op_replace.path) - })?; - let old_value = original_schema.resolve(&json_pointer).with_context(|| { - format!("cannot find the '{}' in original schema", op_replace.path) - })?; - - if is_min_items && old_value.as_i64() > op_replace.value.as_i64() { - continue; - } - - if !opts.allow_reorder { - diffs.push(operation) - } else { - inserted.push(op_replace.value.to_string()); - removed.push(RemovedItem { - name: old_value.to_string(), - operation, - }); - } - } - PatchOperation::Add(ref op_add) => { - let is_new_any_of_item = is_anyof_path(&op_add.path); - let is_new_enum_value = is_enum_path(&op_add.path); - let path_two_last_levels = - get_second_last_sub_path(&op_add.path).with_context(|| { - format!("the second subpath doesn't exist in '{}'", op_add.path) - })?; - - if path_two_last_levels == property_names::REQUIRED { - diffs.push(operation); - continue; - } - if [property_names::PROPERTIES, property_names::DEFINITIONS] - .contains(&path_two_last_levels) - { - continue; - } - - if is_new_any_of_item && opts.allow_reorder { - inserted.push( - op_add - .value - .get(property_names::REF) - .with_context(|| { - format!("the property '{}' doesn't exist", property_names::REF) - })? - .to_string(), - ) - } else if (is_new_any_of_item && opts.allow_new_one_of) - || (is_new_enum_value && opts.allow_new_enum_value) - { - continue; - } else { - diffs.push(operation) - } - } - _ => continue, - } - } - - if opts.allow_reorder { - // When reordering is allowed, we want ot make sure that any item that - // was replaces is also inserted somewhere else - let filtered_removed = removed.into_iter().filter_map(|node| { - if inserted.contains(&node.name) { - Some(node.operation) - } else { - None - } - }); - - diffs.extend(filtered_removed); - } - - Ok(diffs) -} - -// checks if operation `move` or `remove` is backward compatible -fn is_operation_move_remove_compatible( - path: &str, - original_schema: &JsonValue, - opts: &ValidationOptions, -) -> Result { - let is_min_items = path.ends_with(property_names::MIN_ITEMS); - if get_second_last_sub_path(path) == Some(property_names::REQUIRED) || is_min_items { - return Ok(true); - } - - // Check if the removed node is deprecated - let is_any_of_item = is_anyof_path(path); - if is_any_of_item { - let json_pointer: Pointer = Pointer::try_from(path) - .with_context(|| format!("Unable to crate a Json Pointer from '{}'", path))?; - let value = original_schema - .resolve(&json_pointer) - .with_context(|| format!("Cannot find the '{}' in the original schema", path))?; - - if let Some(ref_value) = value.get("$ref") { - let ref_value_string = ref_value.to_string(); - let last_subpath = get_last_sub_path(&ref_value_string).with_context(|| { - format!("The last subpath doesn't exist in '{}'", ref_value_string) - })?; - - if opts.deprecated_items.iter().any(|i| i == last_subpath) { - return Ok(true); - } - } - } else { - let last_subpath = get_last_sub_path(path).unwrap(); - if opts.deprecated_items.iter().any(|i| i == last_subpath) { - return Ok(true); - } - } - - Ok(false) -} - -fn is_min_items(path: &str) -> bool { - path.ends_with(property_names::MIN_ITEMS) -} - -// checks if property path has form: '.../anyOf/[usize]' -fn is_anyof_path(path: &str) -> bool { - is_path_of_type(path, "anyOf") -} - -// checks if property path has form: '.../enum/[usize]' -fn is_enum_path(path: &str) -> bool { - is_path_of_type(path, "enum") -} - -// checks if property path has form: '.../[name]/[usize]' -fn is_path_of_type(path: &str, path_type: &str) -> bool { - let arr = path.split('/').collect_vec(); - if arr.len() < 2 { - return false; - } - if arr[arr.len() - 1].parse::().is_err() { - return false; - } - if arr[arr.len() - 2] != path_type { - return false; - } - true -} - -fn get_second_last_sub_path(path: &str) -> Option<&str> { - let arr = path.split('/').collect_vec(); - if arr.len() > 1 { - Some(arr[arr.len() - 2]) - } else { - None - } -} - -fn get_last_sub_path(path: &str) -> Option<&str> { - let arr = path.split('/').collect_vec(); - if !arr.is_empty() { - Some(arr[arr.len() - 1]) - } else { - None - } -} - -#[cfg(test)] -mod test { - - use super::*; - use lazy_static::lazy_static; - use serde_json::json; - - lazy_static! { - static ref DATA_SCHEMA: JsonValue = serde_json::from_str(include_str!( - "./../../../../../tests/payloads/schema/data.json" - )) - .unwrap(); - static ref DATA_SCHEMA_V2: JsonValue = serde_json::from_str(include_str!( - "./../../../../../tests/payloads/schema/data_v2.json" - )) - .unwrap(); - } - - #[test] - fn test_is_any_of_item() { - let any_of_item = "/anyOf/0"; - assert!(is_path_of_type(any_of_item, "anyOf")); - - let any_of_item = "/alpha/anyOf/0"; - assert!(is_path_of_type(any_of_item, "anyOf")); - - let is_not_any_of_item = ""; - assert!(!is_path_of_type(is_not_any_of_item, "anyOf")); - - let is_not_any_of_item = "/anyOf/o"; - assert!(!is_path_of_type(is_not_any_of_item, "anyOf")); - - let is_not_any_of_item = "/alpha/anyOf/o"; - assert!(!is_path_of_type(is_not_any_of_item, "anyOf")); - - let is_not_any_of_item = "/alpha/anyof/1"; - assert!(!is_path_of_type(is_not_any_of_item, "anyOf")); - } - - #[test] - fn should_return_ok_if_data_is_the_same() { - let result = validate_schema_compatibility_with_options( - &DATA_SCHEMA.clone(), - &DATA_SCHEMA.clone(), - ValidationOptions::default(), - ); - assert!(matches!(result, Ok(operations) if operations.is_empty())); - } - - #[test] - fn should_return_err_on_remove() { - let result = validate_schema_compatibility_with_options( - &DATA_SCHEMA.clone(), - &DATA_SCHEMA_V2.clone(), - ValidationOptions::default(), - ); - assert!(matches!( - result, - Ok(operations) if operations.len() == 1 - )); - } - - #[test] - fn should_return_ok_if_new_field_is_added_but_not_required() { - let mut new_data_schema = DATA_SCHEMA.clone(); - new_data_schema["definitions"]["mntent"]["properties"]["field"] = - json!({"type" : "number"}); - - let result = validate_schema_compatibility_with_options( - &DATA_SCHEMA.clone(), - &new_data_schema, - ValidationOptions::default(), - ); - - assert!(matches!(result, Ok(operations) if operations.is_empty())); - } - - #[test] - fn should_return_ok_if_field_becomes_optional() { - let mut new_data_schema = DATA_SCHEMA.clone(); - new_data_schema[property_names::REQUIRED] = json!(["/"]); - - let result = validate_schema_compatibility_with_options( - &DATA_SCHEMA.clone(), - &new_data_schema, - ValidationOptions::default(), - ); - - assert!(matches!(result, Ok(operations) if operations.is_empty())); - } - - #[test] - fn should_return_err_if_field_becomes_required() { - let mut old_data_schema = DATA_SCHEMA.clone(); - old_data_schema[property_names::REQUIRED] = json!(["/"]); - - let result = validate_schema_compatibility_with_options( - &old_data_schema, - &DATA_SCHEMA.clone(), - ValidationOptions::default(), - ); - - assert!(matches!( - result, - Ok(operations) if operations.len() == 1 - )); - } - - #[test] - fn should_return_err_if_field_changes_its_type() { - let mut new_data_schema = DATA_SCHEMA.clone(); - new_data_schema["definitions"]["mntent"] = json!({"type" : "number"}); - - let result = validate_schema_compatibility_with_options( - &DATA_SCHEMA.clone(), - &new_data_schema, - ValidationOptions::default(), - ); - - assert!(matches!( - result, - Ok(operations) if !operations.is_empty() - )); - } +) -> Result, ProtocolError> { + validate_schemas_compatibility(original_schema, new_schema) + .map(|result| { + let errors = result + .into_changes() + .into_iter() + .map(|change| IncompatibleJsonSchemaOperation { + name: change.name().to_string(), + path: change.path().to_string(), + }) + .collect::>(); + + SimpleValidationResult::new_with_errors(errors) + }) + .map_err(|error| { + ProtocolError::DataContractError(DataContractError::JsonSchema( + JsonSchemaError::SchemaCompatibilityValidationError(error.to_string()), + )) + }) } diff --git a/packages/rs-dpp/src/data_contract/errors/json_schema_error.rs b/packages/rs-dpp/src/data_contract/errors/json_schema_error.rs index 30c63fde5a..2d37615797 100644 --- a/packages/rs-dpp/src/data_contract/errors/json_schema_error.rs +++ b/packages/rs-dpp/src/data_contract/errors/json_schema_error.rs @@ -8,4 +8,7 @@ use thiserror::Error; pub enum JsonSchemaError { #[error("can't create json schema: {0}")] CreateSchemaError(String), + + #[error("schema compatibility validation failed: {0}")] + SchemaCompatibilityValidationError(String), } diff --git a/packages/rs-dpp/src/errors/consensus/basic/data_contract/incompatible_data_contract_schema_error.rs b/packages/rs-dpp/src/errors/consensus/basic/data_contract/incompatible_data_contract_schema_error.rs index 10666a545a..444662dfd8 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/data_contract/incompatible_data_contract_schema_error.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/data_contract/incompatible_data_contract_schema_error.rs @@ -7,7 +7,6 @@ use crate::consensus::ConsensusError; use crate::prelude::Identifier; use bincode::{Decode, Encode}; -use platform_value::Value; #[derive( Error, Debug, Clone, PartialEq, Encode, Decode, PlatformSerialize, PlatformDeserialize, @@ -19,24 +18,14 @@ pub struct IncompatibleDataContractSchemaError { data_contract_id: Identifier, operation: String, field_path: String, - old_schema: Value, - new_schema: Value, } impl IncompatibleDataContractSchemaError { - pub fn new( - data_contract_id: Identifier, - operation: String, - field_path: String, - old_schema: Value, - new_schema: Value, - ) -> Self { + pub fn new(data_contract_id: Identifier, operation: String, field_path: String) -> Self { Self { data_contract_id, operation, field_path, - old_schema, - new_schema, } } @@ -49,12 +38,6 @@ impl IncompatibleDataContractSchemaError { pub fn field_path(&self) -> String { self.field_path.clone() } - pub fn old_schema(&self) -> Value { - self.old_schema.clone() - } - pub fn new_schema(&self) -> Value { - self.new_schema.clone() - } } impl From for ConsensusError { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/v0/mod.rs index ca94bd2f23..bd26720263 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/v0/mod.rs @@ -2,6 +2,7 @@ use crate::error::Error; use crate::platform_types::platform::PlatformRef; use crate::rpc::core::CoreRPCLike; use dpp::block::epoch::Epoch; +use serde_json::json; use dpp::consensus::basic::data_contract::{ DataContractInvalidIndexDefinitionUpdateError, IncompatibleDataContractSchemaError, @@ -15,11 +16,11 @@ use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::data_contract::document_type::schema::{ - get_operation_and_property_name_json, validate_schema_compatibility, + validate_schema_compatibility, IncompatibleJsonSchemaOperation, }; use dpp::data_contract::errors::DataContractError; use dpp::data_contract::schema::DataContractSchemaMethodsV0; -use dpp::data_contract::JsonValue; +use dpp::data_contract::{DataContract, JsonValue}; use dpp::platform_value::converter::serde_json::BTreeValueJsonConverter; use dpp::platform_value::{Value, ValueMap}; @@ -28,6 +29,7 @@ use dpp::state_transition::data_contract_update_transition::accessors::DataContr use dpp::ProtocolError; use dpp::state_transition::data_contract_update_transition::DataContractUpdateTransition; +use dpp::validation::SimpleValidationResult; use dpp::version::PlatformVersion; use crate::error::execution::ExecutionError; @@ -293,9 +295,9 @@ impl DataContractUpdateStateTransitionStateValidationV0 for DataContractUpdateTr if let Some(old_defs) = old_data_contract.schema_defs() { let Some(new_defs) = self.data_contract().schema_defs() else { let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( - BumpIdentityDataContractNonceAction::from_borrowed_data_contract_update_transition( - self, - ), + BumpIdentityDataContractNonceAction::from_borrowed_data_contract_update_transition( + self, + ), ); return Ok(ConsensusValidationResult::new_with_data_and_errors( @@ -304,9 +306,7 @@ impl DataContractUpdateStateTransitionStateValidationV0 for DataContractUpdateTr IncompatibleDataContractSchemaError::new( self.data_contract().id(), "remove".to_string(), - "$defs".to_string(), - old_defs.into(), - Value::Null, + "/$defs".to_string(), ), ) .into()], @@ -339,32 +339,27 @@ impl DataContractUpdateStateTransitionStateValidationV0 for DataContractUpdateTr } }; - let diffs = - validate_schema_compatibility(&old_defs_json, &new_defs_json, platform_version)?; + let old_defs_schema = json!({ + "$defs": old_defs_json + }); - if !diffs.is_empty() { - let (operation_name, property_name) = - get_operation_and_property_name_json(&diffs[0]); + let new_defs_schema = json!({ + "$defs": new_defs_json + }); - let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( - BumpIdentityDataContractNonceAction::from_borrowed_data_contract_update_transition( + let compatibility_validation_result = validate_schema_compatibility( + &old_defs_schema, + &new_defs_schema, + platform_version, + )?; + + if !compatibility_validation_result.is_valid() { + let validation_result = convert_compatibility_to_consensus_validation_result( self, - ), + compatibility_validation_result, ); - return Ok(ConsensusValidationResult::new_with_data_and_errors( - bump_action, - vec![BasicError::IncompatibleDataContractSchemaError( - IncompatibleDataContractSchemaError::new( - self.data_contract().id(), - operation_name.to_owned(), - property_name.to_owned(), - old_defs_json.into(), - new_defs_json.into(), - ), - ) - .into()], - )); + return Ok(validation_result); } } @@ -403,35 +398,19 @@ impl DataContractUpdateStateTransitionStateValidationV0 for DataContractUpdateTr } }; - let diffs = validate_schema_compatibility( + let compatibility_validation_result = validate_schema_compatibility( &old_document_schema_json, &new_document_schema_json, platform_version, )?; - if !diffs.is_empty() { - let (operation_name, property_name) = - get_operation_and_property_name_json(&diffs[0]); - - let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( - BumpIdentityDataContractNonceAction::from_borrowed_data_contract_update_transition( + if !compatibility_validation_result.is_valid() { + let validation_result = convert_compatibility_to_consensus_validation_result( self, - ), + compatibility_validation_result, ); - return Ok(ConsensusValidationResult::new_with_data_and_errors( - bump_action, - vec![BasicError::IncompatibleDataContractSchemaError( - IncompatibleDataContractSchemaError::new( - self.data_contract().id(), - operation_name.to_owned(), - property_name.to_owned(), - old_document_schema.clone(), - new_document_schema, - ), - ) - .into()], - )); + return Ok(validation_result); } } @@ -476,3 +455,29 @@ impl DataContractUpdateStateTransitionStateValidationV0 for DataContractUpdateTr } } } + +fn convert_compatibility_to_consensus_validation_result( + state_transition: &DataContractUpdateTransition, + validation_result: SimpleValidationResult, +) -> ConsensusValidationResult { + let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( + BumpIdentityDataContractNonceAction::from_borrowed_data_contract_update_transition( + state_transition, + ), + ); + + let errors = validation_result + .errors + .into_iter() + .map(|operation| { + IncompatibleDataContractSchemaError::new( + state_transition.data_contract().id(), + operation.name, + operation.path, + ) + .into() + }) + .collect(); + + return ConsensusValidationResult::new_with_data_and_errors(bump_action, errors); +} diff --git a/packages/rs-json-schema-compatibility-validator/Cargo.toml b/packages/rs-json-schema-compatibility-validator/Cargo.toml new file mode 100644 index 0000000000..67f1155b7b --- /dev/null +++ b/packages/rs-json-schema-compatibility-validator/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "json-schema-compatibility-validator" +version = "0.25.16-rc.3" +edition = "2021" +rust-version = "1.76" +authors = [ + "Ivan Shumkov ", +] + +[dependencies] +json-patch = "1.2.0" +serde_json = "1.0.115" +thiserror = "1.0.58" +once_cell = "1.19.0" + +[dev-dependencies] +# enable "examples" for integration tests +json-schema-compatibility-validator = { path = ".", features = ["examples"] } + +[features] +examples = [] diff --git a/packages/rs-json-schema-compatibility-validator/src/change.rs b/packages/rs-json-schema-compatibility-validator/src/change.rs new file mode 100644 index 0000000000..8c70063a7c --- /dev/null +++ b/packages/rs-json-schema-compatibility-validator/src/change.rs @@ -0,0 +1,70 @@ +use crate::error::{Error, UnexpectedPatchOperationError}; +use json_patch::{AddOperation, PatchOperation, RemoveOperation, ReplaceOperation}; + +/// This structure represents a change in a JSON schema +/// It contains corresponding [PatchOperation] +#[derive(Debug, PartialEq, Clone)] +pub enum JsonSchemaChange { + /// Addition of JSON Schema element + Add(AddOperation), + /// Removal of JSON Schema element + Remove(RemoveOperation), + /// Replacement of JSON Schema element + Replace(ReplaceOperation), +} + +impl JsonSchemaChange { + /// Returns the name of the operation + pub fn name(&self) -> &str { + match self { + JsonSchemaChange::Add(_) => "add", + JsonSchemaChange::Remove(_) => "remove", + JsonSchemaChange::Replace(_) => "replace", + } + } + + /// Returns the json path where the operation is applied + pub fn path(&self) -> &str { + match self { + JsonSchemaChange::Add(op) => &op.path, + JsonSchemaChange::Remove(op) => &op.path, + JsonSchemaChange::Replace(op) => &op.path, + } + } +} + +/// Converts a [PatchOperation] into a [JsonSchemaChange] +/// Since [PatchOperation] goes from the [json_patch::diff] function, +/// we don't expect [PatchOperation::Move], [PatchOperation::Copy] and [PatchOperation::Test] operations. +impl TryFrom for JsonSchemaChange { + type Error = Error; + + fn try_from(value: PatchOperation) -> Result { + match value { + PatchOperation::Add(o) => Ok(Self::Add(o)), + PatchOperation::Remove(o) => Ok(Self::Remove(o)), + PatchOperation::Replace(o) => Ok(Self::Replace(o)), + PatchOperation::Move(_) | PatchOperation::Copy(_) | PatchOperation::Test(_) => Err( + Error::UnexpectedJsonPatchOperation(UnexpectedPatchOperationError(value)), + ), + } + } +} + +/// The trait that provides a method to get the path of the [PatchOperation] +pub(crate) trait PatchOperationPath { + fn path(&self) -> &str; +} + +impl PatchOperationPath for PatchOperation { + fn path(&self) -> &str { + match self { + PatchOperation::Add(op) => &op.path, + PatchOperation::Remove(op) => &op.path, + PatchOperation::Replace(op) => &op.path, + PatchOperation::Move(op) => &op.path, + PatchOperation::Copy(op) => &op.path, + PatchOperation::Test(op) => &op.path, + } + } +} diff --git a/packages/rs-json-schema-compatibility-validator/src/error.rs b/packages/rs-json-schema-compatibility-validator/src/error.rs new file mode 100644 index 0000000000..e5c2f91169 --- /dev/null +++ b/packages/rs-json-schema-compatibility-validator/src/error.rs @@ -0,0 +1,106 @@ +use crate::CompatibilityRules; +use json_patch::PatchOperation; +use serde_json::Value; + +/// Compatibility validation errors. +#[derive(thiserror::Error, Debug, Clone)] +pub enum Error { + /// An unexpected patch operation was encountered. + #[error(transparent)] + UnexpectedJsonPatchOperation(UnexpectedPatchOperationError), + /// The JSON Pointer path doesn't exist in the JSON value. + #[error(transparent)] + JsonPointerPathNotFound(JsonPointerPathNotFoundError), + /// There is no compatibility rules are defined for the encountered schema keyword + #[error(transparent)] + UnsupportedSchemaKeyword(UnsupportedSchemaKeywordError), + /// The JSON patch operation path is too small and doesn't contain keywords. + #[error(transparent)] + InvalidJsonPatchOperationPath(InvalidJsonPatchOperationPathError), + /// The [IsReplacementAllowedCallback] is not defined for the encountered keyword and [ReplaceOperation]. + #[error(transparent)] + UndefinedReplaceCallback(UndefinedReplacementAllowedCallbackError), + /// The JSON value type is not as expected. + #[error(transparent)] + UnexpectedJsonValueType(UnexpectedJsonValueTypeError), +} + +/// An unexpected patch operation was encountered. +#[derive(thiserror::Error, Debug, Clone)] +#[error("unexpected patch operation: {0}")] +pub struct UnexpectedPatchOperationError(pub PatchOperation); + +impl From for Error { + fn from(e: UnexpectedPatchOperationError) -> Self { + Error::UnexpectedJsonPatchOperation(e) + } +} + +/// The JSON Pointer path doesn't exist in the JSON value. +#[derive(thiserror::Error, Debug, Clone)] +#[error("JSON Pointer path '{path}' doesn't exist in JSON value")] +pub struct JsonPointerPathNotFoundError { + pub path: String, + pub value: Value, +} + +impl From for Error { + fn from(e: JsonPointerPathNotFoundError) -> Self { + Error::JsonPointerPathNotFound(e) + } +} + +/// There is no compatibility rules are defined for the encountered schema keyword +#[derive(thiserror::Error, Debug, Clone)] +#[error("schema keyword '{keyword}' at path '{path}' is not supported")] +pub struct UnsupportedSchemaKeywordError { + pub keyword: String, + pub path: String, +} + +impl From for Error { + fn from(e: UnsupportedSchemaKeywordError) -> Self { + Error::UnsupportedSchemaKeyword(e) + } +} + +/// The JSON patch operation path is too small and doesn't contain keywords. +#[derive(thiserror::Error, Debug, Clone)] +#[error("json patch operation path '{path}' is too small and doesn't contain keywords")] +pub struct InvalidJsonPatchOperationPathError { + pub path: String, +} + +impl From for Error { + fn from(e: InvalidJsonPatchOperationPathError) -> Self { + Error::InvalidJsonPatchOperationPath(e) + } +} + +/// The [IsReplacementAllowedCallback] is not defined for the encountered keyword and [ReplaceOperation]. +#[derive(thiserror::Error, Debug, Clone)] +#[error("undefined allow replacement callback for path '{path}'")] +pub struct UndefinedReplacementAllowedCallbackError { + pub path: String, + pub rules: CompatibilityRules, +} + +impl From for Error { + fn from(e: UndefinedReplacementAllowedCallbackError) -> Self { + Error::UndefinedReplaceCallback(e) + } +} + +/// The JSON value type is not as expected. +#[derive(thiserror::Error, Debug, Clone)] +#[error("expected JSON value type '{expected_type}', but got '{value}'")] +pub struct UnexpectedJsonValueTypeError { + pub expected_type: String, + pub value: Value, +} + +impl From for Error { + fn from(e: UnexpectedJsonValueTypeError) -> Self { + Error::UnexpectedJsonValueType(e) + } +} diff --git a/packages/rs-json-schema-compatibility-validator/src/lib.rs b/packages/rs-json-schema-compatibility-validator/src/lib.rs new file mode 100644 index 0000000000..4f3beee86f --- /dev/null +++ b/packages/rs-json-schema-compatibility-validator/src/lib.rs @@ -0,0 +1,9 @@ +mod change; +pub mod error; +mod rules; +mod validate; + +pub use crate::change::*; +pub use crate::rules::*; +pub use json_patch::{AddOperation, RemoveOperation, ReplaceOperation}; +pub use validate::{validate_schemas_compatibility, CompatibilityValidationResult}; diff --git a/packages/rs-json-schema-compatibility-validator/src/rules/compatibility_rules.rs b/packages/rs-json-schema-compatibility-validator/src/rules/compatibility_rules.rs new file mode 100644 index 0000000000..c5d627dc56 --- /dev/null +++ b/packages/rs-json-schema-compatibility-validator/src/rules/compatibility_rules.rs @@ -0,0 +1,120 @@ +#[cfg(any(test, feature = "examples"))] +use crate::change::JsonSchemaChange; +use crate::error::Error; +use json_patch::ReplaceOperation; +use serde_json::Value; +use std::fmt; +use std::fmt::{Debug, Formatter}; +use std::sync::Arc; + +/// Type alias for an optional callback function that is called when [ReplaceOperation] is applied to a schema. +/// It takes the original schema as a reference to a [Value] and a [ReplaceOperation], +/// and returns a `Result`. `True` means that the operation is compatible, +/// `False` means that the operation is incompatible. +// This function is wrapped in an `Arc` for lazy evaluation. +pub type IsReplacementAllowedCallback = + Option Result + Send + Sync>>; + +/// Struct representing a compatibility rules in a JSON schema, such as allowing +/// adding, removing, and replacing of the schema elements. It also optionally contains inner structure rule, +/// and a list of examples. +#[derive(Clone)] +pub struct CompatibilityRules { + /// Boolean indicating whether adding is allowed. + pub allow_addition: bool, + /// Boolean indicating whether removing is allowed. + pub allow_removal: bool, + /// Compatibility for replacing is often based on the previous state and new value, + /// so [IsReplacementAllowedCallback] is used to define this dynamic logic. + /// The callback is optional because replacing is impossible for some schema elements + /// due to inner structure. + pub allow_replacement_callback: IsReplacementAllowedCallback, + /// Optional number of levels to an inner subschema in case if the element + /// contains a subschema inside. + /// When the next subschema is reached, the new next compatibility rules will be applied + /// based the rule finding algorithm. + pub subschema_levels_depth: Option, + /// Compatibility rules for inner structure (until the next subschema defined in `levels_to_subschema`). + pub inner: Option>, + /// Examples (vector of [CompatibilityRuleExample]) of the compatibility rules. + /// Only available when testing or when the `examples` feature is enabled. + #[cfg(any(test, feature = "examples"))] + pub examples: Vec, +} + +impl Debug for CompatibilityRules { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + let mut debug = f.debug_struct("CompatibilityRules"); + + let replace_callback = if self.allow_replacement_callback.is_some() { + Some("ReplaceCallback") + } else { + None + }; + + debug + .field("allow_adding", &self.allow_addition) + .field("allow_removing", &self.allow_removal) + .field("allow_replacing", &replace_callback) + .field("subschema_levels_depth", &self.subschema_levels_depth) + .field("inner", &self.inner); + + #[cfg(any(test, feature = "examples"))] + let debug = debug.field("examples", &self.examples); + + debug.finish() + } +} + +impl PartialEq for CompatibilityRules { + fn eq(&self, other: &Self) -> bool { + #[allow(unused_mut, unused_assignments)] + let mut examples = true; + + #[cfg(any(test, feature = "examples"))] + { + examples = self.examples == other.examples; + } + + self.allow_addition == other.allow_addition + && self.allow_removal == other.allow_removal + && self.allow_replacement_callback.is_some() + == other.allow_replacement_callback.is_some() + && self.inner == other.inner + && self.subschema_levels_depth == other.subschema_levels_depth + && examples + } +} + +/// Struct representing an example of a compatibility rule. +/// Only available when testing or when the "examples" feature is enabled. +#[cfg(any(test, feature = "examples"))] +#[derive(Debug, PartialEq, Clone)] +pub struct CompatibilityRuleExample { + /// The original JSON schema. + pub original_schema: Value, + /// The new JSON schema. + pub new_schema: Value, + /// Incompatible [JsonSchemaChange] in the JSON schema if it has a place. + /// `None` if the change is compatible. + pub incompatible_change: Option, +} + +/// Implementation of the [From] trait for [CompatibilityRuleExample]. Allows for creating a [CompatibilityRuleExample] +/// from a tuple of values, and an optional [JsonSchemaChange] in case if we expect an incompatible change. +#[cfg(any(test, feature = "examples"))] +impl From<(Value, Value, Option)> for CompatibilityRuleExample { + fn from( + (original_schema, new_schema, incompatible_change): ( + Value, + Value, + Option, + ), + ) -> Self { + Self { + original_schema, + new_schema, + incompatible_change, + } + } +} diff --git a/packages/rs-json-schema-compatibility-validator/src/rules/mod.rs b/packages/rs-json-schema-compatibility-validator/src/rules/mod.rs new file mode 100644 index 0000000000..4fab346faf --- /dev/null +++ b/packages/rs-json-schema-compatibility-validator/src/rules/mod.rs @@ -0,0 +1,8 @@ +mod compatibility_rules; +mod rule_set; +mod value; + +#[cfg(any(test, feature = "examples"))] +pub use compatibility_rules::CompatibilityRuleExample; +pub use compatibility_rules::{CompatibilityRules, IsReplacementAllowedCallback}; +pub use rule_set::KEYWORD_COMPATIBILITY_RULES; diff --git a/packages/rs-json-schema-compatibility-validator/src/rules/rule_set.rs b/packages/rs-json-schema-compatibility-validator/src/rules/rule_set.rs new file mode 100644 index 0000000000..f04f513e27 --- /dev/null +++ b/packages/rs-json-schema-compatibility-validator/src/rules/rule_set.rs @@ -0,0 +1,1378 @@ +use super::compatibility_rules::CompatibilityRules; +use super::value::ValueTryMethods; +use super::IsReplacementAllowedCallback; +#[cfg(any(test, feature = "examples"))] +use crate::change::JsonSchemaChange; +use crate::error::{Error, InvalidJsonPatchOperationPathError, UnexpectedJsonValueTypeError}; +#[cfg(any(test, feature = "examples"))] +use json_patch::{AddOperation, RemoveOperation, ReplaceOperation}; +use once_cell::sync::Lazy; +#[cfg(any(test, feature = "examples"))] +use serde_json::json; +use std::collections::HashMap; +use std::path::PathBuf; +use std::sync::Arc; + +/// Replacement is never allowed +static FALSE_CALLBACK: Lazy = + Lazy::new(|| Some(Arc::new(|_, _| Ok(false)))); + +/// Replacement is always allowed +static TRUE_CALLBACK: Lazy = + Lazy::new(|| Some(Arc::new(|_, _| Ok(true)))); + +/// Replacement is allowed if a new u64 value is bigger than original +static U64_BIGGER_CALLBACK: Lazy = Lazy::new(|| { + Some(Arc::new(|schema, op| { + let original_value = schema.try_pointer(&op.path)?.try_to_u64()?; + let new_value = op.value.try_to_u64()?; + + Ok(original_value < new_value) + })) +}); + +/// Replacement is allowed if a new u64 value is smaller than original +static U64_SMALLER_CALLBACK: Lazy = Lazy::new(|| { + Some(Arc::new(|schema, op| { + let original_value = schema.try_pointer(&op.path)?.try_to_u64()?; + let new_value = op.value.try_to_u64()?; + + Ok(original_value > new_value) + })) +}); + +/// Replacement is allowed if a new f64 value is bigger than original +static F64_BIGGER_CALLBACK: Lazy = Lazy::new(|| { + Some(Arc::new(|schema, op| { + let original_value = schema.try_pointer(&op.path)?.try_to_f64()?; + let new_value = op.value.try_to_f64()?; + + Ok(original_value < new_value) + })) +}); + +/// Replacement is allowed if a new f64 value is smaller than original +static F64_SMALLER_CALLBACK: Lazy = Lazy::new(|| { + Some(Arc::new(|schema, op| { + let original_value = schema.try_pointer(&op.path)?.try_to_f64()?; + let new_value = op.value.try_to_f64()?; + + Ok(original_value > new_value) + })) +}); + +/// Replacement is allowed if a new value is an existing element in the original array +static EXISTING_ELEMENT_CALLBACK: Lazy = Lazy::new(|| { + Some(Arc::new(|schema, op| { + // One segment back to required array + let path = PathBuf::from(&op.path); + let required_path = path.parent().and_then(|p| p.to_str()).ok_or_else(|| { + InvalidJsonPatchOperationPathError { + path: op.path.clone(), + } + })?; + + let original_required_value = schema.try_pointer(required_path)?; + + let original_required_array_of_values = + original_required_value.as_array().ok_or_else(|| { + Error::UnexpectedJsonValueType(UnexpectedJsonValueTypeError { + expected_type: "array".to_string(), + value: original_required_value.clone(), + }) + })?; + + Ok(original_required_array_of_values.contains(&op.value)) + })) +}); + +/// The rules define, which change in JSON Schema for a keyword and its inner structure is compatible or not. +/// Important note: Not all keywords are supported, and some rules are +/// implemented based on Data Contract schema validation requirements +pub static KEYWORD_COMPATIBILITY_RULES: Lazy> = + Lazy::new(|| { + HashMap::from_iter([ + ( + "$id", + CompatibilityRules { + allow_addition: true, + allow_removal: false, + allow_replacement_callback: FALSE_CALLBACK.clone(), + subschema_levels_depth: None, + inner: None, + #[cfg(any(test, feature = "examples"))] + examples: vec![ + (json!({}), json!({ "$id": "foo" }), None).into(), + ( + json!({ "$id": "foo" }), + json!({}), + Some(JsonSchemaChange::Remove(RemoveOperation { + path: "/$id".to_string(), + })), + ) + .into(), + ( + json!({ "$id": "foo" }), + json!({ "$id": "bar" }), + Some(JsonSchemaChange::Replace(ReplaceOperation { + path: "/$id".to_string(), + value: json!("bar"), + })), + ) + .into(), + ], + }, + ), + ( + "$ref", + CompatibilityRules { + allow_addition: false, + allow_removal: false, + allow_replacement_callback: FALSE_CALLBACK.clone(), + subschema_levels_depth: None, + inner: None, + #[cfg(any(test, feature = "examples"))] + examples: vec![ + ( + json!({}), + json!({ "$ref": "/foo" }), + Some(JsonSchemaChange::Add(AddOperation { + path: "/$ref".to_string(), + value: json!("/foo"), + })), + ) + .into(), + ( + json!({ "$ref": "/foo" }), + json!({}), + Some(JsonSchemaChange::Remove(RemoveOperation { + path: "/$ref".to_string(), + })), + ) + .into(), + ( + json!({ "$ref": "/foo" }), + json!({ "$ref": "/bar" }), + Some(JsonSchemaChange::Replace(ReplaceOperation { + path: "/$ref".to_string(), + value: json!("/bar"), + })), + ) + .into(), + ], + }, + ), + ( + "$comment", + CompatibilityRules { + allow_addition: true, + allow_removal: true, + allow_replacement_callback: TRUE_CALLBACK.clone(), + subschema_levels_depth: None, + inner: None, + #[cfg(any(test, feature = "examples"))] + examples: vec![ + (json!({}), json!({ "$comment": "foo" }), None).into(), + (json!({ "$comment": "foo" }), json!({}), None).into(), + ( + json!({ "$comment": "foo" }), + json!({ "$comment": "bar" }), + None, + ) + .into(), + ], + }, + ), + ( + "description", + CompatibilityRules { + allow_addition: true, + allow_removal: true, + allow_replacement_callback: TRUE_CALLBACK.clone(), + subschema_levels_depth: None, + inner: None, + #[cfg(any(test, feature = "examples"))] + examples: vec![ + (json!({}), json!({ "description": "foo" }), None).into(), + (json!({ "description": "foo" }), json!({}), None).into(), + ( + json!({ "description": "foo" }), + json!({ "description": "bar" }), + None, + ) + .into(), + ], + }, + ), + ( + "examples", + CompatibilityRules { + allow_addition: true, + allow_removal: true, + allow_replacement_callback: TRUE_CALLBACK.clone(), + subschema_levels_depth: None, + inner: None, + #[cfg(any(test, feature = "examples"))] + examples: vec![ + (json!({}), json!({ "examples": ["foo"] }), None).into(), + (json!({ "examples": ["foo"] }), json!({}), None).into(), + ( + json!({ "examples": ["foo"] }), + json!({ "examples": ["foo","bar"] }), + None, + ) + .into(), + ( + json!({ "examples": ["foo","bar"] }), + json!({ "examples": ["foo"] }), + None, + ) + .into(), + ( + json!({ "examples": ["foo"] }), + json!({ "examples": ["bar"] }), + None, + ) + .into(), + ], + }, + ), + ( + "multipleOf", + CompatibilityRules { + allow_addition: false, + allow_removal: false, + allow_replacement_callback: FALSE_CALLBACK.clone(), + subschema_levels_depth: None, + inner: None, + #[cfg(any(test, feature = "examples"))] + examples: vec![ + ( + json!({}), + json!({ "multipleOf": 1.0 }), + Some(JsonSchemaChange::Add(AddOperation { + path: "/multipleOf".to_string(), + value: json!(1.0), + })), + ) + .into(), + ( + json!({ "multipleOf": 1.0 }), + json!({}), + Some(JsonSchemaChange::Remove(RemoveOperation { + path: "/multipleOf".to_string(), + })), + ) + .into(), + ( + json!({ "multipleOf": 1.0 }), + json!({ "multipleOf": 2.0 }), + Some(JsonSchemaChange::Replace(ReplaceOperation { + path: "/multipleOf".to_string(), + value: json!(2.0), + })), + ) + .into(), + ], + }, + ), + ( + "maximum", + CompatibilityRules { + allow_addition: false, + allow_removal: true, + allow_replacement_callback: F64_BIGGER_CALLBACK.clone(), + subschema_levels_depth: None, + inner: None, + #[cfg(any(test, feature = "examples"))] + examples: vec![ + ( + json!({}), + json!({ "maximum": 1 }), + Some(JsonSchemaChange::Add(AddOperation { + path: "/maximum".to_string(), + value: json!(1), + })), + ) + .into(), + (json!({ "maximum": 1 }), json!({}), None).into(), + (json!({ "maximum": 1 }), json!({ "maximum": 2 }), None).into(), + ( + json!({ "maximum": 2 }), + json!({ "maximum": 1 }), + Some(JsonSchemaChange::Replace(ReplaceOperation { + path: "/maximum".to_string(), + value: json!(1), + })), + ) + .into(), + ], + }, + ), + ( + "exclusiveMaximum", + CompatibilityRules { + allow_addition: false, + allow_removal: true, + allow_replacement_callback: F64_BIGGER_CALLBACK.clone(), + subschema_levels_depth: None, + inner: None, + #[cfg(any(test, feature = "examples"))] + examples: vec![ + ( + json!({}), + json!({ "exclusiveMaximum": 1 }), + Some(JsonSchemaChange::Add(AddOperation { + path: "/exclusiveMaximum".to_string(), + value: json!(1), + })), + ) + .into(), + (json!({ "exclusiveMaximum": 1 }), json!({}), None).into(), + ( + json!({ "exclusiveMaximum": 1 }), + json!({ "exclusiveMaximum": 2 }), + None, + ) + .into(), + ( + json!({ "exclusiveMaximum": 2 }), + json!({ "exclusiveMaximum": 1 }), + Some(JsonSchemaChange::Replace(ReplaceOperation { + path: "/exclusiveMaximum".to_string(), + value: json!(1), + })), + ) + .into(), + ], + }, + ), + ( + "minimum", + CompatibilityRules { + allow_addition: false, + allow_removal: true, + allow_replacement_callback: F64_SMALLER_CALLBACK.clone(), + subschema_levels_depth: None, + inner: None, + #[cfg(any(test, feature = "examples"))] + examples: vec![ + ( + json!({}), + json!({ "minimum": 1 }), + Some(JsonSchemaChange::Add(AddOperation { + path: "/minimum".to_string(), + value: json!(1), + })), + ) + .into(), + (json!({ "minimum": 1 }), json!({}), None).into(), + ( + json!({ "minimum": 1 }), + json!({ "minimum": 2 }), + Some(JsonSchemaChange::Replace(ReplaceOperation { + path: "/minimum".to_string(), + value: json!(2), + })), + ) + .into(), + (json!({ "minimum": 2 }), json!({ "minimum": 1 }), None).into(), + ], + }, + ), + ( + "exclusiveMinimum", + CompatibilityRules { + allow_addition: false, + allow_removal: true, + allow_replacement_callback: F64_SMALLER_CALLBACK.clone(), + subschema_levels_depth: None, + inner: None, + #[cfg(any(test, feature = "examples"))] + examples: vec![ + ( + json!({}), + json!({ "exclusiveMinimum": 1 }), + Some(JsonSchemaChange::Add(AddOperation { + path: "/exclusiveMinimum".to_string(), + value: json!(1), + })), + ) + .into(), + (json!({ "exclusiveMinimum": 1 }), json!({}), None).into(), + ( + json!({ "exclusiveMinimum": 1 }), + json!({ "exclusiveMinimum": 2 }), + Some(JsonSchemaChange::Replace(ReplaceOperation { + path: "/exclusiveMinimum".to_string(), + value: json!(2), + })), + ) + .into(), + ( + json!({ "exclusiveMinimum": 2 }), + json!({ "exclusiveMinimum": 1 }), + None, + ) + .into(), + ], + }, + ), + ( + "maxLength", + CompatibilityRules { + allow_addition: false, + allow_removal: true, + allow_replacement_callback: U64_BIGGER_CALLBACK.clone(), + subschema_levels_depth: None, + inner: None, + #[cfg(any(test, feature = "examples"))] + examples: vec![ + ( + json!({}), + json!({ "maxLength": 1 }), + Some(JsonSchemaChange::Add(AddOperation { + path: "/maxLength".to_string(), + value: json!(1), + })), + ) + .into(), + (json!({ "maxLength": 1 }), json!({}), None).into(), + (json!({ "maxLength": 1 }), json!({ "maxLength": 2 }), None).into(), + ( + json!({ "maxLength": 2 }), + json!({ "maxLength": 1 }), + Some(JsonSchemaChange::Replace(ReplaceOperation { + path: "/maxLength".to_string(), + value: json!(1), + })), + ) + .into(), + ], + }, + ), + ( + "minLength", + CompatibilityRules { + allow_addition: false, + allow_removal: true, + allow_replacement_callback: U64_SMALLER_CALLBACK.clone(), + subschema_levels_depth: None, + inner: None, + #[cfg(any(test, feature = "examples"))] + examples: vec![ + ( + json!({}), + json!({ "minLength": 1 }), + Some(JsonSchemaChange::Add(AddOperation { + path: "/minLength".to_string(), + value: json!(1), + })), + ) + .into(), + (json!({ "minLength": 1 }), json!({}), None).into(), + ( + json!({ "minLength": 1 }), + json!({ "minLength": 2 }), + Some(JsonSchemaChange::Replace(ReplaceOperation { + path: "/minLength".to_string(), + value: json!(2), + })), + ) + .into(), + (json!({ "minLength": 2 }), json!({ "minLength": 1 }), None).into(), + ], + }, + ), + ( + "pattern", + CompatibilityRules { + allow_addition: false, + allow_removal: true, + allow_replacement_callback: FALSE_CALLBACK.clone(), + subschema_levels_depth: None, + inner: None, + #[cfg(any(test, feature = "examples"))] + examples: vec![ + ( + json!({}), + json!({ "pattern": "[a-z]" }), + Some(JsonSchemaChange::Add(AddOperation { + path: "/pattern".to_string(), + value: json!("[a-z]"), + })), + ) + .into(), + (json!({ "pattern": "[a-z]" }), json!({}), None).into(), + ( + json!({ "pattern": "[a-z]" }), + json!({ "pattern": "[0-9]" }), + Some(JsonSchemaChange::Replace(ReplaceOperation { + path: "/pattern".to_string(), + value: json!("[0-9]"), + })), + ) + .into(), + ], + }, + ), + ( + "maxItems", + CompatibilityRules { + allow_addition: false, + allow_removal: true, + allow_replacement_callback: U64_BIGGER_CALLBACK.clone(), + subschema_levels_depth: None, + inner: None, + #[cfg(any(test, feature = "examples"))] + examples: vec![ + ( + json!({}), + json!({ "maxItems": 1 }), + Some(JsonSchemaChange::Add(AddOperation { + path: "/maxItems".to_string(), + value: json!(1), + })), + ) + .into(), + (json!({ "maxItems": 1 }), json!({}), None).into(), + (json!({ "maxItems": 1 }), json!({ "maxItems": 2 }), None).into(), + ( + json!({ "maxItems": 2 }), + json!({ "maxItems": 1 }), + Some(JsonSchemaChange::Replace(ReplaceOperation { + path: "/maxItems".to_string(), + value: json!(1), + })), + ) + .into(), + ], + }, + ), + ( + "minItems", + CompatibilityRules { + allow_addition: false, + allow_removal: true, + allow_replacement_callback: U64_SMALLER_CALLBACK.clone(), + subschema_levels_depth: None, + inner: None, + #[cfg(any(test, feature = "examples"))] + examples: vec![ + ( + json!({}), + json!({ "minItems": 1 }), + Some(JsonSchemaChange::Add(AddOperation { + path: "/minItems".to_string(), + value: json!(1), + })), + ) + .into(), + (json!({ "minItems": 1 }), json!({}), None).into(), + ( + json!({ "minItems": 1 }), + json!({ "minItems": 2 }), + Some(JsonSchemaChange::Replace(ReplaceOperation { + path: "/minItems".to_string(), + value: json!(2), + })), + ) + .into(), + (json!({ "minItems": 2 }), json!({ "minItems": 1 }), None).into(), + ], + }, + ), + ( + "uniqueItems", + CompatibilityRules { + allow_addition: false, + allow_removal: true, + allow_replacement_callback: Some(Arc::new(|schema, op| { + let original_value = schema.try_pointer(&op.path)?.try_to_bool()?; + let new_value = op.value.try_to_bool()?; + + Ok(original_value && !new_value) + })), + subschema_levels_depth: None, + inner: None, + #[cfg(any(test, feature = "examples"))] + examples: vec![ + ( + json!({}), + json!({ "uniqueItems": true }), + Some(JsonSchemaChange::Add(AddOperation { + path: "/uniqueItems".to_string(), + value: json!(true), + })), + ) + .into(), + (json!({ "uniqueItems": true }), json!({}), None).into(), + (json!({ "uniqueItems": false }), json!({}), None).into(), + ( + json!({ "uniqueItems": false }), + json!({ "uniqueItems": true }), + Some(JsonSchemaChange::Replace(ReplaceOperation { + path: "/uniqueItems".to_string(), + value: json!(true), + })), + ) + .into(), + ( + json!({ "uniqueItems": true }), + json!({ "uniqueItems": false }), + None, + ) + .into(), + ], + }, + ), + ( + "required", + CompatibilityRules { + allow_addition: false, + allow_removal: true, + allow_replacement_callback: None, + subschema_levels_depth: None, + inner: Some(Box::new(CompatibilityRules { + allow_addition: false, + allow_removal: true, + allow_replacement_callback: EXISTING_ELEMENT_CALLBACK.clone(), + subschema_levels_depth: None, + inner: None, + #[cfg(any(test, feature = "examples"))] + examples: vec![ + ( + json!({ "required": ["foo"] }), + json!({ "required": ["foo", "bar"] }), + Some(JsonSchemaChange::Add(AddOperation { + path: "/required/1".to_string(), + value: json!("bar"), + })), + ) + .into(), + ( + json!({ "required": ["foo", "bar"] }), + json!({ "required": ["foo"] }), + None, + ) + .into(), + ( + json!({ "required": ["foo", "bar"] }), + json!({ "required": ["bar"] }), + None, + ) + .into(), + ( + json!({ "required": ["foo"] }), + json!({ "required": ["bar"] }), + Some(JsonSchemaChange::Replace(ReplaceOperation { + path: "/required/0".to_string(), + value: json!("bar"), + })), + ) + .into(), + ( + json!({ "required": ["foo", "bar"] }), + json!({ "required": ["bar", "foo"] }), + None, + ) + .into(), + ], + })), + #[cfg(any(test, feature = "examples"))] + examples: vec![ + ( + json!({}), + json!({ "required": ["foo"] }), + Some(JsonSchemaChange::Add(AddOperation { + path: "/required".to_string(), + value: json!(["foo"]), + })), + ) + .into(), + (json!({ "required": ["foo"] }), json!({}), None).into(), + ], + }, + ), + ( + "properties", + CompatibilityRules { + allow_addition: false, + allow_removal: false, + allow_replacement_callback: None, + subschema_levels_depth: Some(2), + inner: Some(Box::new(CompatibilityRules { + allow_addition: true, + allow_removal: false, + allow_replacement_callback: None, + subschema_levels_depth: None, + inner: None, + #[cfg(any(test, feature = "examples"))] + examples: vec![ + ( + json!({ "properties": {"foo": {}} }), + json!({ "properties": {"foo": {}, "bar": {}} }), + None, + ) + .into(), + ( + json!({ "properties": {"foo": {}, "bar": {}} }), + json!({ "properties": {"foo": {}} }), + Some(JsonSchemaChange::Remove(RemoveOperation { + path: "/properties/bar".to_string(), + })), + ) + .into(), + ( + json!({ "properties": {"foo": {}} }), + json!({ "properties": {"foo": {}, "type": {}} }), + None, + ) + .into(), + ], + })), + #[cfg(any(test, feature = "examples"))] + examples: vec![ + ( + json!({}), + json!({ "properties": {"foo": {}} }), + Some(JsonSchemaChange::Add(AddOperation { + path: "/properties".to_string(), + value: json!({"foo": {}} ), + })), + ) + .into(), + ( + json!({ "properties": {"foo": {}} }), + json!({}), + Some(JsonSchemaChange::Remove(RemoveOperation { + path: "/properties".to_string(), + })), + ) + .into(), + ], + }, + ), + ( + "additionalProperties", + CompatibilityRules { + allow_addition: false, + allow_removal: false, + allow_replacement_callback: FALSE_CALLBACK.clone(), + subschema_levels_depth: None, + inner: None, + #[cfg(any(test, feature = "examples"))] + examples: vec![ + ( + json!({}), + json!({ "additionalProperties": false }), + Some(JsonSchemaChange::Add(AddOperation { + path: "/additionalProperties".to_string(), + value: json!(false), + })), + ) + .into(), + ( + json!({ "additionalProperties": false }), + json!({}), + Some(JsonSchemaChange::Remove(RemoveOperation { + path: "/additionalProperties".to_string(), + })), + ) + .into(), + ( + json!({ "additionalProperties": false }), + json!({ "additionalProperties": true }), + Some(JsonSchemaChange::Replace(ReplaceOperation { + path: "/additionalProperties".to_string(), + value: json!(true), + })), + ) + .into(), + ], + }, + ), + ( + "dependentRequired", + CompatibilityRules { + allow_addition: false, + allow_removal: true, + allow_replacement_callback: None, + subschema_levels_depth: None, + inner: Some(Box::new(CompatibilityRules { + allow_addition: false, + allow_removal: true, + allow_replacement_callback: EXISTING_ELEMENT_CALLBACK.clone(), + subschema_levels_depth: None, + inner: None, + #[cfg(any(test, feature = "examples"))] + examples: vec![ + ( + json!({ "dependentRequired": {"foo": []} }), + json!({ "dependentRequired": {"foo": [], "bar": []} }), + Some(JsonSchemaChange::Add(AddOperation { + path: "/dependentRequired/bar".to_string(), + value: json!([]), + })), + ) + .into(), + ( + json!({ "dependentRequired": {"foo": [], "bar": []} }), + json!({ "dependentRequired": {"foo": []} }), + None, + ) + .into(), + ( + json!({ "dependentRequired": {"foo": ["bar"]} }), + json!({ "dependentRequired": {"foo": ["bar", "baz"]} }), + Some(JsonSchemaChange::Add(AddOperation { + path: "/dependentRequired/foo/1".to_string(), + value: json!("baz"), + })), + ) + .into(), + ( + json!({ "dependentRequired": {"foo": ["bar", "baz"]} }), + json!({ "dependentRequired": {"foo": ["bar"]} }), + None, + ) + .into(), + ( + json!({ "dependentRequired": {"foo": ["bar", "baz"]} }), + json!({ "dependentRequired": {"foo": ["baz"]} }), + None, + ) + .into(), + ( + json!({ "dependentRequired": {"foo": ["bar"]} }), + json!({ "dependentRequired": {"foo": ["baz"]} }), + Some(JsonSchemaChange::Replace(ReplaceOperation { + path: "/dependentRequired/foo/0".to_string(), + value: json!("baz"), + })), + ) + .into(), + ], + })), + #[cfg(any(test, feature = "examples"))] + examples: vec![ + ( + json!({}), + json!({ "dependentRequired": {"foo": ["bar"]} }), + Some(JsonSchemaChange::Add(AddOperation { + path: "/dependentRequired".to_string(), + value: json!({"foo": ["bar"]}), + })), + ) + .into(), + ( + json!({ "dependentRequired": {"foo": ["bar"]} }), + json!({}), + None, + ) + .into(), + ], + }, + ), + ( + "const", + CompatibilityRules { + allow_addition: false, + allow_removal: true, + allow_replacement_callback: FALSE_CALLBACK.clone(), + subschema_levels_depth: None, + inner: Some(Box::new(CompatibilityRules { + allow_addition: false, + allow_removal: false, + allow_replacement_callback: FALSE_CALLBACK.clone(), + subschema_levels_depth: None, + inner: None, + #[cfg(any(test, feature = "examples"))] + examples: vec![ + ( + json!({ "const": { "property": { "inner": true } }}), + json!({ "const": { "property": { "inner": true, "second": true } }}), + Some(JsonSchemaChange::Add(AddOperation { + path: "/const/property/second".to_string(), + value: json!(true), + })), + ) + .into(), + (json!({ "const": "foo" }), json!({}), None).into(), + ( + json!({ "const": { "property": { "inner": true, "second": true } }}), + json!({ "const": { "property": { "inner": true } }}), + Some(JsonSchemaChange::Remove(RemoveOperation { + path: "/const/property/second".to_string(), + })), + ) + .into(), + ( + json!({ "const": [ "item1" ]}), + json!({ "const": [ "item1", "item2" ]}), + Some(JsonSchemaChange::Add(AddOperation { + path: "/const/1".to_string(), + value: json!("item2"), + })), + ) + .into(), + ( + json!({ "const": [ "item1", "item2" ]}), + json!({ "const": [ "item1" ]}), + Some(JsonSchemaChange::Remove(RemoveOperation { + path: "/const/1".to_string(), + })), + ) + .into(), + ( + json!({ "const": [ "item1" ]}), + json!({ "const": [ "item2" ]}), + Some(JsonSchemaChange::Replace(ReplaceOperation { + path: "/const/0".to_string(), + value: json!("item2"), + })), + ) + .into(), + ], + })), + #[cfg(any(test, feature = "examples"))] + examples: vec![ + ( + json!({}), + json!({ "const": "foo" }), + Some(JsonSchemaChange::Add(AddOperation { + path: "/const".to_string(), + value: json!("foo"), + })), + ) + .into(), + (json!({ "const": "foo" }), json!({}), None).into(), + ( + json!({ "const": "foo" }), + json!({ "const": "bar" }), + Some(JsonSchemaChange::Replace(ReplaceOperation { + path: "/const".to_string(), + value: json!("bar"), + })), + ) + .into(), + ], + }, + ), + ( + "enum", + CompatibilityRules { + allow_addition: false, + allow_removal: true, + allow_replacement_callback: None, + subschema_levels_depth: None, + inner: Some(Box::new(CompatibilityRules { + allow_addition: true, + allow_removal: false, + allow_replacement_callback: EXISTING_ELEMENT_CALLBACK.clone(), + subschema_levels_depth: None, + inner: Some(Box::new(CompatibilityRules { + allow_addition: false, + allow_removal: false, + allow_replacement_callback: FALSE_CALLBACK.clone(), + subschema_levels_depth: None, + inner: None, + #[cfg(any(test, feature = "examples"))] + examples: vec![ + ( + json!({ "enum": [{ "property": ["foo"]}] }), + json!({ "enum": [{ "property": ["foo", "bar"]}] }), + Some(JsonSchemaChange::Add(AddOperation { + path: "/enum/0/property/1".to_string(), + value: json!("bar"), + })), + ) + .into(), + ( + json!({ "enum": [{ "property": ["foo", "bar"]}] }), + json!({ "enum": [{ "property": ["foo"]}] }), + Some(JsonSchemaChange::Remove(RemoveOperation { + path: "/enum/0/property/bar".to_string(), + })), + ) + .into(), + ( + json!({ "enum": [{ "property": ["foo"]}] }), + json!({ "enum": [{ "property": ["bar"]}] }), + Some(JsonSchemaChange::Replace(ReplaceOperation { + path: "/enum/0/property/0".to_string(), + value: json!("bar"), + })), + ) + .into(), + ], + })), + #[cfg(any(test, feature = "examples"))] + examples: vec![ + ( + json!({ "enum": ["foo"] }), + json!({ "enum": ["foo", "bar"] }), + None, + ) + .into(), + ( + json!({ "enum": ["foo", "bar"] }), + json!({ "enum": ["foo"] }), + Some(JsonSchemaChange::Remove(RemoveOperation { + path: "/enum/1".to_string(), + })), + ) + .into(), + ( + json!({ "enum": ["foo"] }), + json!({ "enum": ["bar"] }), + Some(JsonSchemaChange::Replace(ReplaceOperation { + path: "/enum/0".to_string(), + value: json!("bar"), + })), + ) + .into(), + ], + })), + #[cfg(any(test, feature = "examples"))] + examples: vec![ + ( + json!({}), + json!({ "enum": ["foo"] }), + Some(JsonSchemaChange::Add(AddOperation { + path: "/enum".to_string(), + value: json!(["foo"]), + })), + ) + .into(), + (json!({ "enum": ["foo"] }), json!({}), None).into(), + ], + }, + ), + ( + "type", + CompatibilityRules { + allow_addition: false, + allow_removal: false, + allow_replacement_callback: FALSE_CALLBACK.clone(), + subschema_levels_depth: None, + inner: None, + #[cfg(any(test, feature = "examples"))] + examples: vec![ + ( + json!({}), + json!({ "type": "string" }), + Some(JsonSchemaChange::Add(AddOperation { + path: "/type".to_string(), + value: json!("string"), + })), + ) + .into(), + ( + json!({ "type": "string" }), + json!({}), + Some(JsonSchemaChange::Remove(RemoveOperation { + path: "/type".to_string(), + })), + ) + .into(), + ( + json!({ "type": "string" }), + json!({ "type": "object" }), + Some(JsonSchemaChange::Replace(ReplaceOperation { + path: "/type".to_string(), + value: json!("object"), + })), + ) + .into(), + ], + }, + ), + ( + "format", + CompatibilityRules { + allow_addition: false, + allow_removal: true, + allow_replacement_callback: FALSE_CALLBACK.clone(), + subschema_levels_depth: None, + inner: None, + #[cfg(any(test, feature = "examples"))] + examples: vec![ + ( + json!({}), + json!({ "format": "date" }), + Some(JsonSchemaChange::Add(AddOperation { + path: "/format".to_string(), + value: json!("date"), + })), + ) + .into(), + (json!({ "format": "date" }), json!({}), None).into(), + ( + json!({ "format": "date" }), + json!({ "format": "time" }), + Some(JsonSchemaChange::Replace(ReplaceOperation { + path: "/format".to_string(), + value: json!("time"), + })), + ) + .into(), + ], + }, + ), + ( + "contentMediaType", + CompatibilityRules { + allow_addition: false, + allow_removal: false, + allow_replacement_callback: FALSE_CALLBACK.clone(), + subschema_levels_depth: None, + inner: None, + #[cfg(any(test, feature = "examples"))] + examples: vec![ + ( + json!({}), + json!({ "contentMediaType": "application/x.dash.dpp.identifier" }), + Some(JsonSchemaChange::Add(AddOperation { + path: "/contentMediaType".to_string(), + value: json!("application/x.dash.dpp.identifier"), + })), + ) + .into(), + ( + json!({ "contentMediaType": "application/x.dash.dpp.identifier" }), + json!({}), + Some(JsonSchemaChange::Remove(RemoveOperation { + path: "/contentMediaType".to_string(), + })), + ) + .into(), + ( + json!({ "contentMediaType": "application/x.dash.dpp.identifier" }), + json!({ "contentMediaType": "application/unknown" }), + Some(JsonSchemaChange::Replace(ReplaceOperation { + path: "/contentMediaType".to_string(), + value: json!("application/unknown"), + })), + ) + .into(), + ], + }, + ), + ( + "byteArray", + CompatibilityRules { + allow_addition: false, + allow_removal: false, + allow_replacement_callback: FALSE_CALLBACK.clone(), + subschema_levels_depth: None, + inner: None, + #[cfg(any(test, feature = "examples"))] + examples: vec![ + ( + json!({}), + json!({ "byteArray": true }), + Some(JsonSchemaChange::Add(AddOperation { + path: "/byteArray".to_string(), + value: json!(true), + })), + ) + .into(), + ( + json!({ "byteArray": true }), + json!({}), + Some(JsonSchemaChange::Remove(RemoveOperation { + path: "/byteArray".to_string(), + })), + ) + .into(), + ( + json!({ "byteArray": true }), + json!({ "byteArray": false }), + Some(JsonSchemaChange::Replace(ReplaceOperation { + path: "/byteArray".to_string(), + value: json!(false), + })), + ) + .into(), + ], + }, + ), + ( + "prefixItems", + CompatibilityRules { + allow_addition: false, + allow_removal: false, + allow_replacement_callback: None, + subschema_levels_depth: Some(2), + inner: Some(Box::new(CompatibilityRules { + allow_addition: true, + allow_removal: false, + allow_replacement_callback: None, + subschema_levels_depth: None, + inner: None, + #[cfg(any(test, feature = "examples"))] + examples: vec![ + ( + json!({ "prefixItems": [{ "type": "string" }] }), + json!({ "prefixItems": [{ "type": "string" }, { "type": "number"}] }), + None, + ) + .into(), + ( + json!({ "prefixItems": [{ "type": "string" }, { "type": "number"}] }), + json!({ "prefixItems": [{ "type": "string" }] }), + Some(JsonSchemaChange::Remove(RemoveOperation { + path: "/prefixItems/1".to_string(), + })), + ) + .into(), + ], + })), + #[cfg(any(test, feature = "examples"))] + examples: vec![ + ( + json!({}), + json!({ "prefixItems": [{ "type": "string" }] }), + Some(JsonSchemaChange::Add(AddOperation { + path: "/prefixItems".to_string(), + value: json!([{ "type": "string" }]), + })), + ) + .into(), + ( + json!({ "prefixItems": [{ "type": "string" }] }), + json!({}), + Some(JsonSchemaChange::Remove(RemoveOperation { + path: "/prefixItems".to_string(), + })), + ) + .into(), + ], + }, + ), + ( + "items", + CompatibilityRules { + allow_addition: false, + allow_removal: false, + allow_replacement_callback: FALSE_CALLBACK.clone(), + subschema_levels_depth: Some(1), + inner: None, + #[cfg(any(test, feature = "examples"))] + examples: vec![ + ( + json!({}), + json!({ "items": { "type": "string" } }), + Some(JsonSchemaChange::Add(AddOperation { + path: "/items".to_string(), + value: json!({ "type": "string" }), + })), + ) + .into(), + ( + json!({ "items": { "type": "string" } }), + json!({}), + Some(JsonSchemaChange::Remove(RemoveOperation { + path: "/items".to_string(), + })), + ) + .into(), + ( + json!({ "items": { "type": "string" } }), + json!({ "items": false }), + Some(JsonSchemaChange::Replace(ReplaceOperation { + path: "/items".to_string(), + value: json!(false), + })), + ) + .into(), + ], + }, + ), + ( + "position", + CompatibilityRules { + allow_addition: false, + allow_removal: false, + allow_replacement_callback: FALSE_CALLBACK.clone(), + subschema_levels_depth: None, + inner: None, + #[cfg(any(test, feature = "examples"))] + examples: vec![ + ( + json!({}), + json!({ "position": 0 }), + Some(JsonSchemaChange::Add(AddOperation { + path: "/position".to_string(), + value: json!(0), + })), + ) + .into(), + ( + json!({ "position": 0 }), + json!({}), + Some(JsonSchemaChange::Remove(RemoveOperation { + path: "/position".to_string(), + })), + ) + .into(), + ( + json!({ "position": 0 }), + json!({ "position": 1 }), + Some(JsonSchemaChange::Replace(ReplaceOperation { + path: "/position".to_string(), + value: json!(1), + })), + ) + .into(), + ], + }, + ), + ( + "$defs", + CompatibilityRules { + allow_addition: true, + allow_removal: false, + allow_replacement_callback: None, + subschema_levels_depth: Some(2), + inner: Some(Box::new(CompatibilityRules { + allow_addition: true, + allow_removal: false, + allow_replacement_callback: None, + subschema_levels_depth: None, + inner: None, + #[cfg(any(test, feature = "examples"))] + examples: vec![ + ( + json!({ "$defs": {"definition1": {}} }), + json!({ "$defs": {"definition1": {}, "definition2": {}} }), + None, + ) + .into(), + ( + json!({ "$defs": {"definition1": {}, "definition2": {}} }), + json!({ "$defs": {"definition1": {}} }), + Some(JsonSchemaChange::Remove(RemoveOperation { + path: "/$defs/definition2".to_string(), + })), + ) + .into(), + ], + })), + #[cfg(any(test, feature = "examples"))] + examples: vec![ + (json!({}), json!({ "$defs": {"definition": {}} }), None).into(), + ( + json!({ "$defs": {"definition": {}} }), + json!({}), + Some(JsonSchemaChange::Remove(RemoveOperation { + path: "/$defs".to_string(), + })), + ) + .into(), + ], + }, + ), + ]) + }); diff --git a/packages/rs-json-schema-compatibility-validator/src/rules/value.rs b/packages/rs-json-schema-compatibility-validator/src/rules/value.rs new file mode 100644 index 0000000000..6b173c3463 --- /dev/null +++ b/packages/rs-json-schema-compatibility-validator/src/rules/value.rs @@ -0,0 +1,75 @@ +use crate::error::{Error, JsonPointerPathNotFoundError, UnexpectedJsonValueTypeError}; +use serde_json::Value; + +/// Trait that provides methods for trying to convert a `Value` into different types. +pub trait ValueTryMethods { + /// Tries to get a reference to a `Value` at a given JSON Pointer path. + /// + /// # Arguments + /// + /// * `path` - A JSON Pointer path as a string. + /// + /// # Returns + /// + /// * `Result<&Self, Error>` - A result that contains a reference to the `Value` at the given path, or an error if the path does not exist. + fn try_pointer(&self, path: &str) -> Result<&Self, Error>; + + /// Tries to convert the `Value` into a `f64`. + /// + /// # Returns + /// + /// * `Result` - A result that contains the `Value` as a `f64`, or an error if the `Value` is not a `f64`. + fn try_to_f64(&self) -> Result; + + /// Tries to convert the `Value` into a `u64`. + /// + /// # Returns + /// + /// * `Result` - A result that contains the `Value` as a `u64`, or an error if the `Value` is not a `u64`. + fn try_to_u64(&self) -> Result; + + /// Tries to convert the `Value` into a `bool`. + /// + /// # Returns + /// + /// * `Result` - A result that contains the `Value` as a `bool`, or an error if the `Value` is not a `bool`. + fn try_to_bool(&self) -> Result; +} + +impl ValueTryMethods for Value { + fn try_pointer(&self, path: &str) -> Result<&Self, Error> { + self.pointer(path).ok_or_else(|| { + Error::JsonPointerPathNotFound(JsonPointerPathNotFoundError { + path: path.to_string(), + value: self.clone(), + }) + }) + } + + fn try_to_f64(&self) -> Result { + self.as_f64().ok_or_else(|| { + Error::UnexpectedJsonValueType(UnexpectedJsonValueTypeError { + expected_type: "f64".to_string(), + value: self.clone(), + }) + }) + } + + fn try_to_u64(&self) -> Result { + self.as_u64().ok_or_else(|| { + Error::UnexpectedJsonValueType(UnexpectedJsonValueTypeError { + expected_type: "u64".to_string(), + value: self.clone(), + }) + }) + } + + fn try_to_bool(&self) -> Result { + self.as_bool().ok_or_else(|| { + Error::UnexpectedJsonValueType(UnexpectedJsonValueTypeError { + expected_type: "bool".to_string(), + value: self.clone(), + }) + }) + } +} diff --git a/packages/rs-json-schema-compatibility-validator/src/validate.rs b/packages/rs-json-schema-compatibility-validator/src/validate.rs new file mode 100644 index 0000000000..a3d0e92661 --- /dev/null +++ b/packages/rs-json-schema-compatibility-validator/src/validate.rs @@ -0,0 +1,204 @@ +use crate::change::PatchOperationPath; +use crate::error::{ + Error, InvalidJsonPatchOperationPathError, UndefinedReplacementAllowedCallbackError, + UnsupportedSchemaKeywordError, +}; +use crate::{CompatibilityRules, JsonSchemaChange, KEYWORD_COMPATIBILITY_RULES}; +use json_patch::PatchOperation; +use serde_json::Value; + +/// The result of JSON Schema compatibility validation between two schemas. +/// Returned by [validate_schemas_compatibility] function. +pub struct CompatibilityValidationResult { + incompatible_changes: Vec, +} + +impl CompatibilityValidationResult { + /// Returns `true` if the schemas are compatible. + pub fn is_compatible(&self) -> bool { + self.incompatible_changes.is_empty() + } + + /// Returns a list of incompatible changes between the schemas. + pub fn incompatible_changes(&self) -> &[JsonSchemaChange] { + &self.incompatible_changes + } + + /// Consumes the result and returns a list of incompatible changes between the schemas. + pub fn into_changes(self) -> Vec { + self.incompatible_changes + } +} + +/// Validates the backward compatibility of two JSON schemas and returns +/// the [CompatibilityValidationResult]. If two schemas are compatible, +/// it means that data that valid for the original schema is also valid +/// for the new schema. +/// +/// ``` +/// use serde_json::json; +/// use json_schema_compatibility_validator::validate_schemas_compatibility; +/// +/// let original_schema = json!({ +/// "type": "object", +/// "properties": { +/// "name": { "type": "string" }, +/// "age": { "type": "integer" } +/// }, +/// "required": ["name"] +/// }); +/// +/// let new_schema = json!({ +/// "type": "object", +/// "properties": { +/// "name": { "type": "string" }, +/// "age": { "type": "integer" }, +/// "email": { "type": "string" } +/// }, +/// "required": ["name"] +/// }); +/// +/// let result = validate_schemas_compatibility(&original_schema, &new_schema) +/// .expect("compatibility validation failed"); +/// +/// assert!(result.is_compatible()); +/// ``` +/// +pub fn validate_schemas_compatibility( + original_schema: &Value, + new_schema: &Value, +) -> Result { + let patch = json_patch::diff(original_schema, new_schema); + + let mut incompatible_changes: Vec = Vec::new(); + + for operation in patch.0.into_iter() { + let path = operation.path(); + + let Some(rules) = find_compatibility_rules(path)? else { + return Err(Error::InvalidJsonPatchOperationPath( + InvalidJsonPatchOperationPathError { + path: path.to_string(), + }, + )); + }; + + if !is_compatible_operation(original_schema, &operation, rules)? { + incompatible_changes.push(operation.try_into()?); + } + } + + Ok(CompatibilityValidationResult { + incompatible_changes, + }) +} + +/// Returns `true` if the operation is compatible with the schema +/// according to provided compatibility rules, otherwise `false`. +fn is_compatible_operation( + original_schema: &Value, + operation: &PatchOperation, + rules: &CompatibilityRules, +) -> Result { + match &operation { + PatchOperation::Add(_) => Ok(rules.allow_addition), + PatchOperation::Remove(_) => Ok(rules.allow_removal), + PatchOperation::Replace(op) => { + let callback = rules.allow_replacement_callback.as_ref().ok_or_else(|| { + UndefinedReplacementAllowedCallbackError { + path: op.path.clone(), + rules: rules.clone(), + } + })?; + + callback(original_schema, op) + } + PatchOperation::Test(_) | PatchOperation::Copy(_) | PatchOperation::Move(_) => { + unreachable!("json_patch diff doesn't return decorative operations test, copy, move") + } + } +} + +/// Travers through the JSON Pointer path and find corresponding compatibility rules +fn find_compatibility_rules(path: &str) -> Result, Error> { + let mut path_segments = path.split('/'); + + // Remove the first empty segment + path_segments.next(); + + let mut latest_keyword_compatibility_rules: Option<&CompatibilityRules> = None; + let mut levels_to_subschema: Option = None; + for segment in path_segments { + // On the second iteration we look at the inner levels under the keyword. + // Switch to inner structure rules if they are present + if let Some(rule) = latest_keyword_compatibility_rules { + if let Some(inner_rule) = &rule.inner { + latest_keyword_compatibility_rules = Some(inner_rule); + } + } + + // Skip some levels to a next keyword if we expect an inner subschema + if let Some(levels) = levels_to_subschema { + if levels - 1 > 0 { + levels_to_subschema = levels.checked_sub(1); + + continue; + } + } else if latest_keyword_compatibility_rules.is_some() { + // Continue if we don't expect an inner subschema + continue; + } + + // The first segment is always a keyword + let rules = KEYWORD_COMPATIBILITY_RULES.get(segment).ok_or_else(|| { + UnsupportedSchemaKeywordError { + keyword: segment.to_string(), + path: path.to_string(), + } + })?; + + levels_to_subschema = rules.subschema_levels_depth; + + latest_keyword_compatibility_rules = Some(rules); + } + + Ok(latest_keyword_compatibility_rules) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_find_compatibility_rules() { + let result = find_compatibility_rules("/properties/prop1") + .expect("should find keyword without failure"); + + assert_eq!( + result, + Some( + KEYWORD_COMPATIBILITY_RULES + .get("properties") + .unwrap() + .inner + .as_deref() + .unwrap() + ) + ); + + let result = find_compatibility_rules("/properties/prop1/properties/type") + .expect("failed to find a keyword rule"); + + assert_eq!( + result, + Some( + KEYWORD_COMPATIBILITY_RULES + .get("properties") + .unwrap() + .inner + .as_deref() + .unwrap() + ) + ); + } +} diff --git a/packages/rs-json-schema-compatibility-validator/tests/reorder.rs b/packages/rs-json-schema-compatibility-validator/tests/reorder.rs new file mode 100644 index 0000000000..6f1aa3652c --- /dev/null +++ b/packages/rs-json-schema-compatibility-validator/tests/reorder.rs @@ -0,0 +1,170 @@ +use json_schema_compatibility_validator::validate_schemas_compatibility; +use serde_json::json; + +#[test] +fn test_properties_reordering() { + let original_schema = json!({ + "properties": { + "prop1": { + "type": "string" + }, + "prop2": { + "type": "string" + }, + "prop3": { + "type": "number" + } + } + }); + + let new_schema = json!({ + "properties": { + "prop2": { + "type": "string" + }, + "prop1": { + "type": "string" + }, + "prop3": { + "type": "number" + }, + } + }); + + let result = validate_schemas_compatibility(&original_schema, &new_schema) + .expect("schema compatibility validation error"); + + assert!( + result.is_compatible(), + "assertion failed: incompatible changes: {:?}", + result.incompatible_changes() + ); +} + +#[test] +fn test_reordering_from_string() { + let original_schema_string = r#"{ + "properties": { + "prop1": { + "type": "string" + }, + "prop2": { + "type": "string" + }, + "prop3": { + "type": "number" + } + } + }"#; + + let original_schema = serde_json::from_str(original_schema_string) + .expect("failed to decode from string to json value"); + + let new_schema_string = r#"{ + "properties": { + "prop2": { + "type": "string" + }, + "prop1": { + "type": "string" + }, + "prop3": { + "type": "number" + } + } + }"#; + + let new_schema = serde_json::from_str(new_schema_string) + .expect("failed to decode from string to json value"); + + let result = validate_schemas_compatibility(&original_schema, &new_schema) + .expect("schema compatibility validation error"); + + assert!( + result.is_compatible(), + "assertion failed: incompatible changes: {:?}", + result.incompatible_changes() + ); +} + +#[test] +fn test_keywords_reordering() { + let original_schema = json!({ + "type": "array", + "items": false, + "prefixItems": [ + { + "type": "string", + }, + { + "type": "number" + } + ] + }); + + let new_schema = json!({ + "type": "array", + "prefixItems": [ + { + "type": "string", + }, + { + "type": "number" + } + ], + "items": false, + }); + + let result = validate_schemas_compatibility(&original_schema, &new_schema) + .expect("schema compatibility validation error"); + + assert!( + result.is_compatible(), + "assertion failed: incompatible changes: {:?}", + result.incompatible_changes() + ); +} + +#[test] +fn test_inner_keywords_reordering() { + let original_schema = json!({ + "type": "array", + "items": false, + "prefixItems": [ + { + "type": "string", + "minLength": 1, + "maxLength": 20, + "pattern": "^[a-z]$", + }, + { + "type": "number" + } + ] + }); + + let new_schema = json!({ + "type": "array", + "items": false, + "prefixItems": [ + { + "type": "string", + "maxLength": 20, + "minLength": 1, + "pattern": "^[a-z]$", + }, + { + "type": "number" + } + ] + }); + + let result = validate_schemas_compatibility(&original_schema, &new_schema) + .expect("schema compatibility validation error"); + + assert!( + result.is_compatible(), + "assertion failed: incompatible changes: {:?}", + result.incompatible_changes() + ); +} diff --git a/packages/rs-json-schema-compatibility-validator/tests/rules.rs b/packages/rs-json-schema-compatibility-validator/tests/rules.rs new file mode 100644 index 0000000000..86ca77fda5 --- /dev/null +++ b/packages/rs-json-schema-compatibility-validator/tests/rules.rs @@ -0,0 +1,49 @@ +use json_schema_compatibility_validator::{ + validate_schemas_compatibility, CompatibilityRuleExample, KEYWORD_COMPATIBILITY_RULES, +}; + +#[test] +fn test_schema_keyword_rules() { + for (keyword, rule) in KEYWORD_COMPATIBILITY_RULES.iter() { + println!("Testing `{}` keyword", keyword); + + assert_examples(keyword, &rule.examples); + + if let Some(inner_rule) = &rule.inner { + assert_examples(keyword, &inner_rule.examples); + } + } +} + +fn assert_examples(keyword: &str, examples: &[CompatibilityRuleExample]) { + for example in examples { + let result = validate_schemas_compatibility(&example.original_schema, &example.new_schema) + .expect("should not fail"); + + if let Some(change) = &example.incompatible_change { + let expected_change = vec![change.clone()]; + + assert_eq!( + result.incompatible_changes(), + &expected_change, + r"assertion failed: expected incompatible change of '{}' + +From: {:?} +To: {:?}", + keyword, + &example.original_schema, + &example.new_schema + ); + } else { + assert!( + result.is_compatible(), + r"assertion failed: '{keyword}' modification is not compatible: {:?} +From: {:?} +To: {:?}", + result.incompatible_changes(), + &example.original_schema, + &example.new_schema + ); + } + } +} From 60ac47d94219d694a001a3519090a1aa0f941a71 Mon Sep 17 00:00:00 2001 From: Paul DeLucia <69597248+pauldelucia@users.noreply.github.com> Date: Sat, 13 Apr 2024 09:37:13 +0700 Subject: [PATCH 130/191] feat: register init contracts on second block of strategy (#1808) --- Cargo.lock | 91 ++++++----- packages/rs-dpp/Cargo.toml | 2 +- .../document_type/property/mod.rs | 5 +- .../v0/v0_methods.rs | 27 ++-- .../tests/strategy_tests/chain_lock_update.rs | 4 +- .../tests/strategy_tests/core_update_tests.rs | 12 +- .../tests/strategy_tests/failures.rs | 13 +- .../tests/strategy_tests/main.rs | 146 +++++++++--------- .../tests/strategy_tests/query.rs | 12 +- .../tests/strategy_tests/strategy.rs | 14 +- .../strategy_tests/upgrade_fork_tests.rs | 28 ++-- packages/strategy-tests/src/lib.rs | 91 ++++++----- packages/strategy-tests/src/transitions.rs | 2 +- 13 files changed, 240 insertions(+), 207 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a8482a4d78..2d3cbc966e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -53,9 +53,9 @@ dependencies = [ [[package]] name = "allocator-api2" -version = "0.2.16" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" +checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" [[package]] name = "android-tzdata" @@ -197,9 +197,9 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.79" +version = "0.1.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507401cad91ec6a857ed5513a2073c82a9b9048762b885bb98655b306964681" +checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" dependencies = [ "proc-macro2", "quote", @@ -686,7 +686,7 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-targets 0.52.4", + "windows-targets 0.52.5", ] [[package]] @@ -1447,9 +1447,9 @@ dependencies = [ [[package]] name = "either" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" +checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" [[package]] name = "enum-map" @@ -2264,9 +2264,9 @@ checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "jobserver" -version = "0.1.28" +version = "0.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab46a6e9526ddef3ae7f787c06f0f2600639ba80ea3eade3d8e670a2230f51d6" +checksum = "685a7d121ee3f65ae4fddd72b25a04bb36b6af81bc0828f7d5434c0fe60fa3a2" dependencies = [ "libc", ] @@ -2371,7 +2371,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" dependencies = [ "cfg-if", - "windows-targets 0.52.4", + "windows-targets 0.52.5", ] [[package]] @@ -2679,9 +2679,9 @@ dependencies = [ [[package]] name = "num" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05180d69e3da0e530ba2a1dae5110317e49e3b7f3d41be227dc5f92e49ee7af" +checksum = "3135b08af27d103b0a51f2ae0f8632117b7b185ccf931445affa8df530576a41" dependencies = [ "num-bigint", "num-complex", @@ -4361,9 +4361,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.35" +version = "0.3.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef89ece63debf11bc32d1ed8d078ac870cbeb44da02afb02a9ff135ae7ca0582" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" dependencies = [ "deranged", "itoa", @@ -4547,7 +4547,7 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "winnow 0.6.5", + "winnow 0.6.6", ] [[package]] @@ -5087,7 +5087,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.4", + "windows-targets 0.52.5", ] [[package]] @@ -5105,7 +5105,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.4", + "windows-targets 0.52.5", ] [[package]] @@ -5125,17 +5125,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" +checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" dependencies = [ - "windows_aarch64_gnullvm 0.52.4", - "windows_aarch64_msvc 0.52.4", - "windows_i686_gnu 0.52.4", - "windows_i686_msvc 0.52.4", - "windows_x86_64_gnu 0.52.4", - "windows_x86_64_gnullvm 0.52.4", - "windows_x86_64_msvc 0.52.4", + "windows_aarch64_gnullvm 0.52.5", + "windows_aarch64_msvc 0.52.5", + "windows_i686_gnu 0.52.5", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.5", + "windows_x86_64_gnu 0.52.5", + "windows_x86_64_gnullvm 0.52.5", + "windows_x86_64_msvc 0.52.5", ] [[package]] @@ -5146,9 +5147,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" +checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" [[package]] name = "windows_aarch64_msvc" @@ -5158,9 +5159,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" +checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" [[package]] name = "windows_i686_gnu" @@ -5170,9 +5171,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" +checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" [[package]] name = "windows_i686_msvc" @@ -5182,9 +5189,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" +checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" [[package]] name = "windows_x86_64_gnu" @@ -5194,9 +5201,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" +checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" [[package]] name = "windows_x86_64_gnullvm" @@ -5206,9 +5213,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" +checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" [[package]] name = "windows_x86_64_msvc" @@ -5218,9 +5225,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" +checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" [[package]] name = "winnow" @@ -5233,9 +5240,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.6.5" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dffa400e67ed5a4dd237983829e66475f0a4a26938c4b04c21baede6262215b8" +checksum = "f0c976aaaa0e1f90dbb21e9587cdaf1d9679a1cde8875c0d6bd83ab96a208352" dependencies = [ "memchr", ] diff --git a/packages/rs-dpp/Cargo.toml b/packages/rs-dpp/Cargo.toml index 7c39d54dea..71b5809e39 100644 --- a/packages/rs-dpp/Cargo.toml +++ b/packages/rs-dpp/Cargo.toml @@ -60,7 +60,7 @@ ed25519-dalek = { version = "2.0.0-rc.2", features = ["rand_core"], optional = t nohash-hasher = "0.2.0" rust_decimal = "1.29.1" rust_decimal_macros = "1.29.1" -indexmap = { version = "2.0.2"} +indexmap = { version = "2.0.2", features = ["serde"] } strum = { version = "0.25.0", features = ["derive"] } json-schema-compatibility-validator = { path = '../rs-json-schema-compatibility-validator' } diff --git a/packages/rs-dpp/src/data_contract/document_type/property/mod.rs b/packages/rs-dpp/src/data_contract/document_type/property/mod.rs index cfe1b52e40..c544bfd62b 100644 --- a/packages/rs-dpp/src/data_contract/document_type/property/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/property/mod.rs @@ -15,20 +15,21 @@ use platform_value::Value; use rand::distributions::{Alphanumeric, Standard}; use rand::rngs::StdRng; use rand::Rng; +use serde::Serialize; pub mod array; // This struct will be changed in future to support more validation logic and serialization // It will become versioned and it will be introduced by a new document type version // @append_only -#[derive(Debug, PartialEq, Clone)] +#[derive(Debug, PartialEq, Clone, Serialize)] pub struct DocumentProperty { pub property_type: DocumentPropertyType, pub required: bool, } // @append_only -#[derive(Debug, PartialEq, Clone)] +#[derive(Debug, PartialEq, Clone, Serialize)] pub enum DocumentPropertyType { ///Todo decompose integer Integer, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/v0_methods.rs index ddf987f5a5..ca6fe4e148 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/v0_methods.rs @@ -46,15 +46,24 @@ impl DataContractCreateTransitionMethodsV0 for DataContractCreateTransitionV0 { let mut state_transition: StateTransition = transition.into(); let value = state_transition.signable_bytes()?; - let public_key = - identity - .loaded_public_keys - .get(&key_id) - .ok_or(ProtocolError::NonConsensusError( - NonConsensusError::StateTransitionCreationError( - "public key did not exist".to_string(), - ), - ))?; + // The public key ids don't always match the keys in the map, so we need to do this. + let matching_key = identity + .loaded_public_keys + .iter() + .find_map(|(&key, public_key)| { + if public_key.id() == key_id { + Some(key) + } else { + None + } + }) + .expect("No matching public key id found in the map"); + + let public_key = identity.loaded_public_keys.get(&matching_key).ok_or( + ProtocolError::NonConsensusError(NonConsensusError::StateTransitionCreationError( + "public key did not exist".to_string(), + )), + )?; let security_level_requirements = state_transition.security_level_requirement().ok_or( ProtocolError::CorruptedCodeExecution( diff --git a/packages/rs-drive-abci/tests/strategy_tests/chain_lock_update.rs b/packages/rs-drive-abci/tests/strategy_tests/chain_lock_update.rs index 56c1c8df75..f80ec3645d 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/chain_lock_update.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/chain_lock_update.rs @@ -16,10 +16,10 @@ mod tests { // simple case where quorums do not change let strategy = NetworkStrategy { strategy: Strategy { - contracts_with_updates: vec![], + start_contracts: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: IdentityInsertInfo::default(), + identity_inserts: IdentityInsertInfo::default(), identity_contract_nonce_gaps: None, signer: None, diff --git a/packages/rs-drive-abci/tests/strategy_tests/core_update_tests.rs b/packages/rs-drive-abci/tests/strategy_tests/core_update_tests.rs index 88a439f29f..4c89267312 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/core_update_tests.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/core_update_tests.rs @@ -15,10 +15,10 @@ mod tests { fn run_chain_random_bans() { let strategy = NetworkStrategy { strategy: Strategy { - contracts_with_updates: vec![], + start_contracts: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: IdentityInsertInfo::default(), + identity_inserts: IdentityInsertInfo::default(), identity_contract_nonce_gaps: None, signer: None, @@ -113,10 +113,10 @@ mod tests { fn run_chain_random_removals() { let strategy = NetworkStrategy { strategy: Strategy { - contracts_with_updates: vec![], + start_contracts: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: IdentityInsertInfo::default(), + identity_inserts: IdentityInsertInfo::default(), identity_contract_nonce_gaps: None, signer: None, @@ -197,10 +197,10 @@ mod tests { fn run_chain_random_bans_and_unbans() { let strategy = NetworkStrategy { strategy: Strategy { - contracts_with_updates: vec![], + start_contracts: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: IdentityInsertInfo::default(), + identity_inserts: IdentityInsertInfo::default(), identity_contract_nonce_gaps: None, signer: None, diff --git a/packages/rs-drive-abci/tests/strategy_tests/failures.rs b/packages/rs-drive-abci/tests/strategy_tests/failures.rs index d7d7eb9ccc..c1fe815095 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/failures.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/failures.rs @@ -41,13 +41,10 @@ mod tests { let strategy = NetworkStrategy { strategy: Strategy { - contracts_with_updates: vec![( - contract, - Some(BTreeMap::from([(3, contract_update_1)])), - )], + start_contracts: vec![(contract, Some(BTreeMap::from([(3, contract_update_1)])))], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: IdentityInsertInfo { + identity_inserts: IdentityInsertInfo { frequency: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -104,7 +101,7 @@ mod tests { outcome .strategy .strategy - .contracts_with_updates + .start_contracts .first() .unwrap() .0 @@ -125,10 +122,10 @@ mod tests { fn run_chain_block_failure_on_genesis_block_correctly_fixes_itself() { let mut strategy = NetworkStrategy { strategy: Strategy { - contracts_with_updates: vec![], + start_contracts: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: IdentityInsertInfo::default(), + identity_inserts: IdentityInsertInfo::default(), identity_contract_nonce_gaps: None, signer: None, diff --git a/packages/rs-drive-abci/tests/strategy_tests/main.rs b/packages/rs-drive-abci/tests/strategy_tests/main.rs index b98b88de9d..3ca8b0768e 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/main.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/main.rs @@ -121,10 +121,10 @@ mod tests { fn run_chain_nothing_happening() { let strategy = NetworkStrategy { strategy: Strategy { - contracts_with_updates: vec![], + start_contracts: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: IdentityInsertInfo::default(), + identity_inserts: IdentityInsertInfo::default(), identity_contract_nonce_gaps: None, signer: None, @@ -165,10 +165,10 @@ mod tests { fn run_chain_block_signing() { let strategy = NetworkStrategy { strategy: Strategy { - contracts_with_updates: vec![], + start_contracts: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: IdentityInsertInfo::default(), + identity_inserts: IdentityInsertInfo::default(), identity_contract_nonce_gaps: None, signer: None, @@ -210,10 +210,10 @@ mod tests { fn run_chain_stop_and_restart() { let strategy = NetworkStrategy { strategy: Strategy { - contracts_with_updates: vec![], + start_contracts: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: IdentityInsertInfo::default(), + identity_inserts: IdentityInsertInfo::default(), identity_contract_nonce_gaps: None, signer: None, @@ -336,10 +336,10 @@ mod tests { fn run_chain_stop_and_restart_multiround() { let strategy = NetworkStrategy { strategy: Strategy { - contracts_with_updates: vec![], + start_contracts: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: IdentityInsertInfo::default(), + identity_inserts: IdentityInsertInfo::default(), identity_contract_nonce_gaps: None, signer: None, @@ -469,10 +469,10 @@ mod tests { let platform_version = PlatformVersion::latest(); let strategy = NetworkStrategy { strategy: Strategy { - contracts_with_updates: vec![], + start_contracts: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: IdentityInsertInfo { + identity_inserts: IdentityInsertInfo { frequency: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -534,10 +534,10 @@ mod tests { fn run_chain_core_height_randomly_increasing() { let strategy = NetworkStrategy { strategy: Strategy { - contracts_with_updates: vec![], + start_contracts: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: IdentityInsertInfo::default(), + identity_inserts: IdentityInsertInfo::default(), identity_contract_nonce_gaps: None, signer: None, @@ -582,10 +582,10 @@ mod tests { fn run_chain_core_height_randomly_increasing_with_epoch_change() { let strategy = NetworkStrategy { strategy: Strategy { - contracts_with_updates: vec![], + start_contracts: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: IdentityInsertInfo::default(), + identity_inserts: IdentityInsertInfo::default(), identity_contract_nonce_gaps: None, signer: None, @@ -638,10 +638,10 @@ mod tests { fn run_chain_core_height_randomly_increasing_with_quick_epoch_change() { let strategy = NetworkStrategy { strategy: Strategy { - contracts_with_updates: vec![], + start_contracts: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: IdentityInsertInfo::default(), + identity_inserts: IdentityInsertInfo::default(), identity_contract_nonce_gaps: None, signer: None, @@ -699,10 +699,10 @@ mod tests { let platform_version = PlatformVersion::latest(); let strategy = NetworkStrategy { strategy: Strategy { - contracts_with_updates: vec![], + start_contracts: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: IdentityInsertInfo::default(), + identity_inserts: IdentityInsertInfo::default(), identity_contract_nonce_gaps: None, signer: None, }, @@ -772,10 +772,10 @@ mod tests { fn run_chain_core_height_randomly_increasing_with_quorum_updates_new_proposers() { let strategy = NetworkStrategy { strategy: Strategy { - contracts_with_updates: vec![], + start_contracts: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: IdentityInsertInfo::default(), + identity_inserts: IdentityInsertInfo::default(), identity_contract_nonce_gaps: None, signer: None, @@ -835,10 +835,10 @@ mod tests { fn run_chain_core_height_randomly_increasing_with_quorum_updates_changing_proposers() { let strategy = NetworkStrategy { strategy: Strategy { - contracts_with_updates: vec![], + start_contracts: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: IdentityInsertInfo::default(), + identity_inserts: IdentityInsertInfo::default(), identity_contract_nonce_gaps: None, signer: None, @@ -901,10 +901,10 @@ mod tests { fn run_chain_core_height_randomly_increasing_with_quorum_updates_updating_proposers() { let strategy = NetworkStrategy { strategy: Strategy { - contracts_with_updates: vec![], + start_contracts: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: IdentityInsertInfo::default(), + identity_inserts: IdentityInsertInfo::default(), identity_contract_nonce_gaps: None, signer: None, @@ -994,10 +994,10 @@ mod tests { // drive_abci::logging::Loggers::default().try_install().ok(); let strategy = NetworkStrategy { strategy: Strategy { - contracts_with_updates: vec![], + start_contracts: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: IdentityInsertInfo { + identity_inserts: IdentityInsertInfo { frequency: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -1052,10 +1052,10 @@ mod tests { fn run_chain_insert_one_new_identity_per_block_with_epoch_change() { let strategy = NetworkStrategy { strategy: Strategy { - contracts_with_updates: vec![], + start_contracts: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: IdentityInsertInfo { + identity_inserts: IdentityInsertInfo { frequency: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -1134,10 +1134,10 @@ mod tests { let strategy = NetworkStrategy { strategy: Strategy { - contracts_with_updates: vec![(contract, None)], + start_contracts: vec![(contract, None)], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: IdentityInsertInfo { + identity_inserts: IdentityInsertInfo { frequency: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -1188,7 +1188,7 @@ mod tests { outcome .strategy .strategy - .contracts_with_updates + .start_contracts .first() .unwrap() .0 @@ -1209,7 +1209,7 @@ mod tests { fn run_chain_insert_one_new_identity_and_many_big_contracts() { let strategy = NetworkStrategy { strategy: Strategy { - contracts_with_updates: vec![], + start_contracts: vec![], operations: vec![Operation { op_type: OperationType::ContractCreate( RandomDocumentTypeParameters { @@ -1255,7 +1255,7 @@ mod tests { }, }], start_identities: StartIdentities::default(), - identities_inserts: IdentityInsertInfo { + identity_inserts: IdentityInsertInfo { frequency: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -1333,7 +1333,7 @@ mod tests { let strategy = NetworkStrategy { strategy: Strategy { - contracts_with_updates: vec![( + start_contracts: vec![( contract, Some(BTreeMap::from([ (3, contract_update_1), @@ -1342,7 +1342,7 @@ mod tests { )], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: IdentityInsertInfo { + identity_inserts: IdentityInsertInfo { frequency: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -1393,7 +1393,7 @@ mod tests { outcome .strategy .strategy - .contracts_with_updates + .start_contracts .first() .unwrap() .0 @@ -1437,7 +1437,7 @@ mod tests { let strategy = NetworkStrategy { strategy: Strategy { - contracts_with_updates: vec![(created_contract, None)], + start_contracts: vec![(created_contract, None)], operations: vec![Operation { op_type: OperationType::Document(document_op), frequency: Frequency { @@ -1446,7 +1446,7 @@ mod tests { }, }], start_identities: StartIdentities::default(), - identities_inserts: IdentityInsertInfo { + identity_inserts: IdentityInsertInfo { frequency: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -1517,7 +1517,7 @@ mod tests { let strategy = NetworkStrategy { strategy: Strategy { - contracts_with_updates: vec![(created_contract, None)], + start_contracts: vec![(created_contract, None)], operations: vec![Operation { op_type: OperationType::Document(document_op), frequency: Frequency { @@ -1526,7 +1526,7 @@ mod tests { }, }], start_identities: StartIdentities::default(), - identities_inserts: IdentityInsertInfo { + identity_inserts: IdentityInsertInfo { frequency: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -1616,7 +1616,7 @@ mod tests { let strategy = NetworkStrategy { strategy: Strategy { - contracts_with_updates: vec![(created_contract, None)], + start_contracts: vec![(created_contract, None)], operations: vec![ Operation { op_type: OperationType::Document(document_insertion_op), @@ -1634,7 +1634,7 @@ mod tests { }, ], start_identities: StartIdentities::default(), - identities_inserts: IdentityInsertInfo { + identity_inserts: IdentityInsertInfo { frequency: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -1724,7 +1724,7 @@ mod tests { let strategy = NetworkStrategy { strategy: Strategy { - contracts_with_updates: vec![(created_contract, None)], + start_contracts: vec![(created_contract, None)], operations: vec![ Operation { op_type: OperationType::Document(document_insertion_op), @@ -1742,7 +1742,7 @@ mod tests { }, ], start_identities: StartIdentities::default(), - identities_inserts: IdentityInsertInfo { + identity_inserts: IdentityInsertInfo { frequency: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -1847,7 +1847,7 @@ mod tests { let strategy = NetworkStrategy { strategy: Strategy { - contracts_with_updates: vec![(created_contract, None)], + start_contracts: vec![(created_contract, None)], operations: vec![ Operation { op_type: OperationType::Document(document_insertion_op), @@ -1865,7 +1865,7 @@ mod tests { }, ], start_identities: StartIdentities::default(), - identities_inserts: IdentityInsertInfo { + identity_inserts: IdentityInsertInfo { frequency: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -1972,7 +1972,7 @@ mod tests { let strategy = NetworkStrategy { strategy: Strategy { - contracts_with_updates: vec![(created_contract, None)], + start_contracts: vec![(created_contract, None)], operations: vec![ Operation { op_type: OperationType::Document(document_insertion_op), @@ -1990,7 +1990,7 @@ mod tests { }, ], start_identities: StartIdentities::default(), - identities_inserts: IdentityInsertInfo { + identity_inserts: IdentityInsertInfo { frequency: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -2086,7 +2086,7 @@ mod tests { let strategy = NetworkStrategy { strategy: Strategy { - contracts_with_updates: vec![(created_contract, None)], + start_contracts: vec![(created_contract, None)], operations: vec![ Operation { op_type: OperationType::Document(document_insertion_op), @@ -2104,7 +2104,7 @@ mod tests { }, ], start_identities: StartIdentities::default(), - identities_inserts: IdentityInsertInfo { + identity_inserts: IdentityInsertInfo { frequency: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -2200,7 +2200,7 @@ mod tests { let strategy = NetworkStrategy { strategy: Strategy { - contracts_with_updates: vec![(created_contract, None)], + start_contracts: vec![(created_contract, None)], operations: vec![ Operation { op_type: OperationType::Document(document_insertion_op), @@ -2218,7 +2218,7 @@ mod tests { }, ], start_identities: StartIdentities::default(), - identities_inserts: IdentityInsertInfo { + identity_inserts: IdentityInsertInfo { frequency: Frequency { times_per_block_range: 1..30, chance_per_block: None, @@ -2322,7 +2322,7 @@ mod tests { let strategy = NetworkStrategy { strategy: Strategy { - contracts_with_updates: vec![(created_contract, None)], + start_contracts: vec![(created_contract, None)], operations: vec![ Operation { op_type: OperationType::Document(document_insertion_op), @@ -2347,7 +2347,7 @@ mod tests { }, ], start_identities: StartIdentities::default(), - identities_inserts: IdentityInsertInfo { + identity_inserts: IdentityInsertInfo { frequency: Frequency { times_per_block_range: 1..6, chance_per_block: None, @@ -2411,7 +2411,7 @@ mod tests { let strategy = NetworkStrategy { strategy: Strategy { - contracts_with_updates: vec![], + start_contracts: vec![], operations: vec![Operation { op_type: OperationType::IdentityTopUp, frequency: Frequency { @@ -2420,7 +2420,7 @@ mod tests { }, }], start_identities: StartIdentities::default(), - identities_inserts: IdentityInsertInfo { + identity_inserts: IdentityInsertInfo { frequency: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -2487,7 +2487,7 @@ mod tests { fn run_chain_update_identities_add_keys() { let strategy = NetworkStrategy { strategy: Strategy { - contracts_with_updates: vec![], + start_contracts: vec![], operations: vec![Operation { op_type: OperationType::IdentityUpdate( IdentityUpdateOp::IdentityUpdateAddKeys(3), @@ -2498,7 +2498,7 @@ mod tests { }, }], start_identities: StartIdentities::default(), - identities_inserts: IdentityInsertInfo { + identity_inserts: IdentityInsertInfo { frequency: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -2572,7 +2572,7 @@ mod tests { let platform_version = PlatformVersion::latest(); let strategy = NetworkStrategy { strategy: Strategy { - contracts_with_updates: vec![], + start_contracts: vec![], operations: vec![Operation { op_type: OperationType::IdentityUpdate( IdentityUpdateOp::IdentityUpdateDisableKey(3), @@ -2583,7 +2583,7 @@ mod tests { }, }], start_identities: StartIdentities::default(), - identities_inserts: IdentityInsertInfo { + identity_inserts: IdentityInsertInfo { frequency: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -2658,7 +2658,7 @@ mod tests { let platform_version = PlatformVersion::latest(); let strategy = NetworkStrategy { strategy: Strategy { - contracts_with_updates: vec![], + start_contracts: vec![], operations: vec![ Operation { op_type: OperationType::IdentityTopUp, @@ -2676,7 +2676,7 @@ mod tests { }, ], start_identities: StartIdentities::default(), - identities_inserts: IdentityInsertInfo { + identity_inserts: IdentityInsertInfo { frequency: Frequency { times_per_block_range: 1..2, chance_per_block: None, @@ -3237,10 +3237,10 @@ mod tests { fn run_chain_rotation_is_deterministic_1_block() { let strategy = NetworkStrategy { strategy: Strategy { - contracts_with_updates: vec![], + start_contracts: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: IdentityInsertInfo { + identity_inserts: IdentityInsertInfo { //we do this to create some paying transactions frequency: Frequency { times_per_block_range: 1..2, @@ -3402,10 +3402,10 @@ mod tests { fn run_chain_heavy_rotation_deterministic_before_payout() { let strategy = NetworkStrategy { strategy: Strategy { - contracts_with_updates: vec![], + start_contracts: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: IdentityInsertInfo { + identity_inserts: IdentityInsertInfo { //we do this to create some paying transactions frequency: Frequency { times_per_block_range: 1..2, @@ -3538,10 +3538,10 @@ mod tests { ) { let strategy = NetworkStrategy { strategy: Strategy { - contracts_with_updates: vec![], + start_contracts: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: IdentityInsertInfo { + identity_inserts: IdentityInsertInfo { //we do this to create some paying transactions frequency: Frequency { times_per_block_range: 1..2, @@ -3675,10 +3675,10 @@ mod tests { let strategy = NetworkStrategy { strategy: Strategy { - contracts_with_updates: vec![], + start_contracts: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: IdentityInsertInfo::default(), + identity_inserts: IdentityInsertInfo::default(), identity_contract_nonce_gaps: None, signer: None, @@ -3800,7 +3800,7 @@ mod tests { fn run_chain_transfer_between_identities() { let strategy = NetworkStrategy { strategy: Strategy { - contracts_with_updates: vec![], + start_contracts: vec![], operations: vec![Operation { op_type: OperationType::IdentityTransfer, frequency: Frequency { @@ -3809,7 +3809,7 @@ mod tests { }, }], start_identities: StartIdentities::default(), - identities_inserts: IdentityInsertInfo { + identity_inserts: IdentityInsertInfo { //we do this to create some paying transactions frequency: Frequency { times_per_block_range: 6..10, @@ -3882,7 +3882,7 @@ mod tests { fn run_transactions_exceeding_max_block_size() { let strategy = NetworkStrategy { strategy: Strategy { - identities_inserts: IdentityInsertInfo { + identity_inserts: IdentityInsertInfo { frequency: Frequency { times_per_block_range: 5..6, chance_per_block: None, diff --git a/packages/rs-drive-abci/tests/strategy_tests/query.rs b/packages/rs-drive-abci/tests/strategy_tests/query.rs index bd68dfbbf2..b25ac5ad02 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/query.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/query.rs @@ -369,10 +369,10 @@ mod tests { fn run_chain_query_epoch_info() { let strategy = NetworkStrategy { strategy: Strategy { - contracts_with_updates: vec![], + start_contracts: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: IdentityInsertInfo::default(), + identity_inserts: IdentityInsertInfo::default(), identity_contract_nonce_gaps: None, signer: None, @@ -467,10 +467,10 @@ mod tests { fn run_chain_query_epoch_info_latest() { let strategy = NetworkStrategy { strategy: Strategy { - contracts_with_updates: vec![], + start_contracts: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: IdentityInsertInfo::default(), + identity_inserts: IdentityInsertInfo::default(), identity_contract_nonce_gaps: None, signer: None, @@ -566,10 +566,10 @@ mod tests { fn run_chain_prove_epoch_info() { let strategy = NetworkStrategy { strategy: Strategy { - contracts_with_updates: vec![], + start_contracts: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: IdentityInsertInfo::default(), + identity_inserts: IdentityInsertInfo::default(), identity_contract_nonce_gaps: None, signer: None, diff --git a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs index 8359379df3..cd9ccdd195 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs @@ -370,21 +370,21 @@ impl NetworkStrategy { if block_info.height == 1 && self.strategy.start_identities.number_of_identities > 0 { let mut new_transitions = NetworkStrategy::create_identities_state_transitions( self.strategy.start_identities.number_of_identities.into(), - self.strategy.identities_inserts.start_keys as KeyID, - &self.strategy.identities_inserts.extra_keys, + self.strategy.identity_inserts.start_keys as KeyID, + &self.strategy.identity_inserts.extra_keys, signer, rng, platform_version, ); state_transitions.append(&mut new_transitions); } - let frequency = &self.strategy.identities_inserts.frequency; + let frequency = &self.strategy.identity_inserts.frequency; if frequency.check_hit(rng) { let count = frequency.events(rng); let mut new_transitions = NetworkStrategy::create_identities_state_transitions( count, - self.strategy.identities_inserts.start_keys as KeyID, - &self.strategy.identities_inserts.extra_keys, + self.strategy.identity_inserts.start_keys as KeyID, + &self.strategy.identity_inserts.extra_keys, signer, rng, platform_version, @@ -403,7 +403,7 @@ impl NetworkStrategy { platform_version: &PlatformVersion, ) -> Vec { self.strategy - .contracts_with_updates + .start_contracts .iter_mut() .map(|(created_contract, contract_updates)| { let identity_num = rng.gen_range(0..current_identities.len()); @@ -474,7 +474,7 @@ impl NetworkStrategy { platform_version: &PlatformVersion, ) -> Vec { self.strategy - .contracts_with_updates + .start_contracts .iter_mut() .filter_map(|(_, contract_updates)| { let Some(contract_updates) = contract_updates else { diff --git a/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs b/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs index 353d098a8b..7b58873451 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs @@ -38,10 +38,10 @@ mod tests { let platform_version = PlatformVersion::first(); let strategy = NetworkStrategy { strategy: Strategy { - contracts_with_updates: vec![], + start_contracts: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: IdentityInsertInfo::default(), + identity_inserts: IdentityInsertInfo::default(), identity_contract_nonce_gaps: None, signer: None, @@ -281,10 +281,10 @@ mod tests { let platform_version = PlatformVersion::first(); let strategy = NetworkStrategy { strategy: Strategy { - contracts_with_updates: vec![], + start_contracts: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: IdentityInsertInfo::default(), + identity_inserts: IdentityInsertInfo::default(), identity_contract_nonce_gaps: None, signer: None, }, @@ -675,10 +675,10 @@ mod tests { .spawn(|| { let strategy = NetworkStrategy { strategy: Strategy { - contracts_with_updates: vec![], + start_contracts: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: IdentityInsertInfo::default(), + identity_inserts: IdentityInsertInfo::default(), identity_contract_nonce_gaps: None, signer: None, @@ -908,10 +908,10 @@ mod tests { .spawn(|| { let strategy = NetworkStrategy { strategy: Strategy { - contracts_with_updates: vec![], + start_contracts: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: IdentityInsertInfo::default(), + identity_inserts: IdentityInsertInfo::default(), identity_contract_nonce_gaps: None, signer: None, @@ -1069,10 +1069,10 @@ mod tests { let strategy = NetworkStrategy { strategy: Strategy { - contracts_with_updates: vec![], + start_contracts: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: IdentityInsertInfo::default(), + identity_inserts: IdentityInsertInfo::default(), identity_contract_nonce_gaps: None, signer: None, @@ -1233,10 +1233,10 @@ mod tests { .spawn(|| { let strategy = NetworkStrategy { strategy: Strategy { - contracts_with_updates: vec![], + start_contracts: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: IdentityInsertInfo::default(), + identity_inserts: IdentityInsertInfo::default(), identity_contract_nonce_gaps: None, signer: None, @@ -1349,10 +1349,10 @@ mod tests { let strategy = NetworkStrategy { strategy: Strategy { - contracts_with_updates: vec![], + start_contracts: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: IdentityInsertInfo::default(), + identity_inserts: IdentityInsertInfo::default(), identity_contract_nonce_gaps: None, signer: None, diff --git a/packages/strategy-tests/src/lib.rs b/packages/strategy-tests/src/lib.rs index b2de4ca353..10057af099 100644 --- a/packages/strategy-tests/src/lib.rs +++ b/packages/strategy-tests/src/lib.rs @@ -23,6 +23,7 @@ use dpp::data_contract::document_type::v0::DocumentTypeV0; use dpp::data_contract::{DataContract, DataContractFactory}; use dpp::document::{Document, DocumentV0Getters}; +use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; use dpp::identity::state_transition::asset_lock_proof::AssetLockProof; use dpp::identity::{Identity, KeyID, KeyType, PartialIdentity, Purpose, SecurityLevel}; use dpp::platform_value::string_encoding::Encoding; @@ -73,13 +74,13 @@ pub type KeyMaps = BTreeMap>>; /// The strategy allows for the specification of initial conditions, such as contracts to be created and identities to be registered, as well as dynamic actions that unfold over the simulation's lifespan, including contract updates and identity transactions. This versatile structure supports a broad spectrum of blockchain-related activities, from simple transfer operations to complex contract lifecycle management. /// /// # Fields -/// - `contracts_with_updates`: Maps each created data contract to potential updates, enabling the simulation of contract evolution. Each tuple consists of a `CreatedDataContract` and an optional mapping of block heights to subsequent contract versions, facilitating time-sensitive contract transformations. +/// - `start_identities`: Specifies identities to be established at the simulation's outset, including their initial attributes and balances. This setup allows for immediate participation of these identities in the blockchain's simulated activities. +/// +/// - `start_contracts`: Maps each created data contract to potential updates, enabling the simulation of contract evolution. Each tuple consists of a `CreatedDataContract` and an optional mapping of block heights to subsequent contract versions, facilitating time-sensitive contract transformations. /// /// - `operations`: Enumerates discrete operations to be executed within the strategy. These operations represent individual actions or sequences of actions, such as document manipulations, identity updates, or contract interactions, each contributing to the overarching simulation narrative. /// -/// - `start_identities`: Specifies identities to be established at the simulation's outset, including their initial attributes and balances. This setup allows for immediate participation of these identities in the blockchain's simulated activities. -/// -/// - `identities_inserts`: Controls the stochastic introduction of new identities into the simulation, based on a defined frequency distribution. This field allows the strategy to dynamically expand the set of participants, reflecting organic growth or specific testing requirements. +/// - `identity_inserts`: Controls the stochastic introduction of new identities into the simulation, based on a defined frequency distribution. This field allows the strategy to dynamically expand the set of participants, reflecting organic growth or specific testing requirements. /// /// - `identity_contract_nonce_gaps`: Optionally defines intervals at which nonce values for identities and contracts may be artificially incremented, introducing realistic entropy or testing specific edge cases. /// @@ -101,13 +102,13 @@ pub type KeyMaps = BTreeMap>>; /// It's imperative to maintain coherence among the specified operations, identities, and contracts within the `Strategy` to ensure the simulated scenarios accurately reflect intended behaviors or test conditions. Discrepancies or inconsistencies may result in unexpected outcomes or hinder the simulation's effectiveness in achieving its objectives. #[derive(Clone, Debug, PartialEq, Default)] pub struct Strategy { - pub contracts_with_updates: Vec<( + pub start_identities: StartIdentities, + pub start_contracts: Vec<( CreatedDataContract, Option>, )>, pub operations: Vec, - pub start_identities: StartIdentities, - pub identities_inserts: IdentityInsertInfo, + pub identity_inserts: IdentityInsertInfo, pub identity_contract_nonce_gaps: Option, pub signer: Option, } @@ -183,10 +184,10 @@ impl PlatformSerializableWithPlatformVersion for Strategy { platform_version: &PlatformVersion, ) -> Result, ProtocolError> { let Strategy { - contracts_with_updates, + start_contracts: contracts_with_updates, operations, start_identities, - identities_inserts, + identity_inserts: identities_inserts, identity_contract_nonce_gaps, signer, } = self; @@ -307,10 +308,10 @@ impl PlatformDeserializableWithPotentialValidationFromVersionedStructure for Str .collect::, ProtocolError>>()?; Ok(Strategy { - contracts_with_updates, + start_contracts: contracts_with_updates, operations, start_identities, - identities_inserts, + identity_inserts: identities_inserts, identity_contract_nonce_gaps, signer, }) @@ -399,6 +400,7 @@ impl Strategy { let mut finalize_block_operations = vec![]; // Get identity state transitions + // Start identities are done on the 1st block, identity inserts are done on 3rd+ blocks let identity_state_transitions = match self.identity_state_transitions_for_block( block_info, self.start_identities.starting_balances, @@ -419,8 +421,8 @@ impl Strategy { let (identities, mut state_transitions): (Vec, Vec) = identity_state_transitions.into_iter().unzip(); - // Add initial contracts for contracts_with_updates on first block of strategy - if block_info.height == config.start_block_height { + // Add initial contracts for contracts_with_updates on 2nd block of strategy + if block_info.height == config.start_block_height + 1 { let mut contract_state_transitions = self.initial_contract_state_transitions( current_identities, identity_nonce_counter, @@ -429,8 +431,8 @@ impl Strategy { platform_version, ); state_transitions.append(&mut contract_state_transitions); - } else { - // Do operations and contract updates after the first block + } else if block_info.height > config.start_block_height + 1 { + // Do operations and contract updates after the first two blocks let (mut operations_state_transitions, mut add_to_finalize_block_operations) = self .operations_based_transitions( document_query_callback, @@ -1191,7 +1193,7 @@ impl Strategy { let public_key = identity .get_first_public_key_matching( Purpose::AUTHENTICATION, - HashSet::from([SecurityLevel::CRITICAL]), + HashSet::from([SecurityLevel::HIGH, SecurityLevel::CRITICAL]), HashSet::from([KeyType::ECDSA_SECP256K1]), ) .expect("Expected to get identity public key in ContractCreate"); @@ -1355,16 +1357,16 @@ impl Strategy { } // Add identities_inserts - // Don't do this on first block because we need to skip utxo refresh - if block_info.height > config.start_block_height { - let frequency = &self.identities_inserts.frequency; + // Don't do this on first two blocks (per design but also we need to skip utxo refresh) + if block_info.height > config.start_block_height + 1 { + let frequency = &self.identity_inserts.frequency; if frequency.check_hit(rng) { let count = frequency.events(rng); // number of identities to create let mut new_transitions = crate::transitions::create_identities_state_transitions( count, - self.identities_inserts.start_keys as KeyID, - &self.identities_inserts.extra_keys, + self.identity_inserts.start_keys as KeyID, + &self.identity_inserts.extra_keys, 200000, // 0.002 dash signer, rng, @@ -1423,28 +1425,40 @@ impl Strategy { ) -> Vec { let mut id_mapping = HashMap::new(); // Maps old IDs to new IDs - self.contracts_with_updates + self.start_contracts .iter_mut() .map(|(created_contract, contract_updates)| { // Select a random identity from current_identities to be the contract owner let identity_num = rng.gen_range(0..current_identities.len()); + let identity = current_identities .get(identity_num) - .unwrap() - .clone() - .into_partial_identity_info(); + .expect("Expected to find the identity in the current_identities"); + + let identity_public_key = identity.get_first_public_key_matching( + Purpose::AUTHENTICATION, + HashSet::from([SecurityLevel::HIGH, SecurityLevel::CRITICAL]), + HashSet::from([KeyType::ECDSA_SECP256K1]), + ) + .expect("Expected to get identity public key in initial_contract_state_transitions"); + let key_id = identity_public_key.id(); + + let partial_identity = identity.clone().into_partial_identity_info(); + let partial_identity_public_key = partial_identity.loaded_public_keys.values() + .find(|&public_key| public_key.id() == key_id) + .expect("No public key with matching id found"); let contract = created_contract.data_contract_mut(); // Get and bump the identity nonce - let identity_nonce = identity_nonce_counter.entry(identity.id).or_default(); + let identity_nonce = identity_nonce_counter.entry(partial_identity.id).or_default(); *identity_nonce += 1; // Set the contract ID and owner ID with the random identity - contract.set_owner_id(identity.id); + contract.set_owner_id(partial_identity.id); let old_id = contract.id(); let new_id = - DataContract::generate_data_contract_id_v0(identity.id, *identity_nonce); + DataContract::generate_data_contract_id_v0(partial_identity.id, *identity_nonce); contract.set_id(new_id); id_mapping.insert(old_id, new_id); // Store the mapping @@ -1473,16 +1487,21 @@ impl Strategy { } } - DataContractCreateTransition::new_from_data_contract( + match DataContractCreateTransition::new_from_data_contract( contract.clone(), *identity_nonce, - &identity, - 2, + &partial_identity, + partial_identity_public_key.id(), signer, platform_version, None, - ) - .expect("expected to create a create state transition from a data contract") + ) { + Ok(transition) => transition, + Err(e) => { + tracing::error!("Error creating DataContractCreateTransition: {e}"); + panic!(); + } + } }) .collect() } @@ -1533,7 +1552,7 @@ impl Strategy { ) -> Vec { // Collect updates let updates: Vec<_> = self - .contracts_with_updates + .start_contracts .iter() .flat_map(|(_, contract_updates_option)| { contract_updates_option @@ -1721,7 +1740,7 @@ mod tests { }; let strategy = Strategy { - contracts_with_updates: vec![], + start_contracts: vec![], operations: vec![ Operation { op_type: OperationType::Document(document_op_1), @@ -1744,7 +1763,7 @@ mod tests { starting_balances: 100_000_000, extra_keys: BTreeMap::new(), }, - identities_inserts: Default::default(), + identity_inserts: Default::default(), identity_contract_nonce_gaps: None, signer: Some(simple_signer), }; diff --git a/packages/strategy-tests/src/transitions.rs b/packages/strategy-tests/src/transitions.rs index 1eb97d3b81..94c36f5cbe 100644 --- a/packages/strategy-tests/src/transitions.rs +++ b/packages/strategy-tests/src/transitions.rs @@ -634,7 +634,7 @@ pub fn create_identities_state_transitions( count: u16, key_count: KeyID, extra_keys: &KeyMaps, - balance: u64, + _balance: u64, signer: &mut SimpleSigner, rng: &mut StdRng, asset_lock_proofs: &mut Vec<(AssetLockProof, PrivateKey)>, From e17ecfea957eee282cf5072dba2d0f79352eebd8 Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Sat, 13 Apr 2024 16:22:05 +0700 Subject: [PATCH 131/191] chore: update tenderdash-abci --- Cargo.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2d3cbc966e..875cdfcdb0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4229,7 +4229,7 @@ dependencies = [ [[package]] name = "tenderdash-abci" version = "0.14.0-dev.12" -source = "git+https://github.com/dashpay/rs-tenderdash-abci#17e57f509c2bb7015042d69976bd1f056fef923d" +source = "git+https://github.com/dashpay/rs-tenderdash-abci#a848ad6d67b1c1d8f053c9ca97b89e5e4c929d96" dependencies = [ "bytes", "futures", @@ -4251,7 +4251,7 @@ dependencies = [ [[package]] name = "tenderdash-proto" version = "0.14.0-dev.12" -source = "git+https://github.com/dashpay/rs-tenderdash-abci#17e57f509c2bb7015042d69976bd1f056fef923d" +source = "git+https://github.com/dashpay/rs-tenderdash-abci#a848ad6d67b1c1d8f053c9ca97b89e5e4c929d96" dependencies = [ "bytes", "chrono", @@ -4271,7 +4271,7 @@ dependencies = [ [[package]] name = "tenderdash-proto-compiler" version = "0.14.0-dev.12" -source = "git+https://github.com/dashpay/rs-tenderdash-abci#17e57f509c2bb7015042d69976bd1f056fef923d" +source = "git+https://github.com/dashpay/rs-tenderdash-abci#a848ad6d67b1c1d8f053c9ca97b89e5e4c929d96" dependencies = [ "fs_extra", "prost-build 0.12.4", From 8a61c85fa0a5f39b1e7fa8ba8d2304950e796175 Mon Sep 17 00:00:00 2001 From: lklimek <842586+lklimek@users.noreply.github.com> Date: Sat, 13 Apr 2024 14:18:17 +0200 Subject: [PATCH 132/191] feat(sdk): reuse dapi connections (#1815) --- Cargo.lock | 1 + packages/rs-dapi-client/Cargo.toml | 1 + packages/rs-dapi-client/src/address_list.rs | 28 ++++- .../rs-dapi-client/src/connection_pool.rs | 110 ++++++++++++++++++ packages/rs-dapi-client/src/dapi_client.rs | 14 ++- packages/rs-dapi-client/src/lib.rs | 1 + packages/rs-dapi-client/src/transport.rs | 9 +- packages/rs-dapi-client/src/transport/grpc.rs | 49 +++++--- 8 files changed, 192 insertions(+), 21 deletions(-) create mode 100644 packages/rs-dapi-client/src/connection_pool.rs diff --git a/Cargo.lock b/Cargo.lock index 875cdfcdb0..14c37a4b0e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3544,6 +3544,7 @@ dependencies = [ "futures", "hex", "http", + "lru", "rand", "sha2", "thiserror", diff --git a/packages/rs-dapi-client/Cargo.toml b/packages/rs-dapi-client/Cargo.toml index d9e1cf4e13..0763a35651 100644 --- a/packages/rs-dapi-client/Cargo.toml +++ b/packages/rs-dapi-client/Cargo.toml @@ -24,6 +24,7 @@ tokio = { version = "1.32.0", default-features = false } sha2 = { version = "0.10", optional = true } chrono = { version = "0.4.31", optional = true } hex = { version = "0.4.3", optional = true } +lru = { version = "0.12.3" } [dev-dependencies] tokio = { version = "1.32.0", features = ["macros"] } diff --git a/packages/rs-dapi-client/src/address_list.rs b/packages/rs-dapi-client/src/address_list.rs index 6f1d2e8cf9..a56820af2d 100644 --- a/packages/rs-dapi-client/src/address_list.rs +++ b/packages/rs-dapi-client/src/address_list.rs @@ -160,9 +160,15 @@ impl AddressList { /// Randomly select a not banned address. pub fn get_live_address(&self) -> Option<&Address> { - let now = time::Instant::now(); let mut rng = SmallRng::from_entropy(); + self.unbanned().into_iter().choose(&mut rng) + } + + /// Get all addresses that are not banned. + fn unbanned(&self) -> Vec<&Address> { + let now = time::Instant::now(); + self.addresses .iter() .filter(|addr| { @@ -170,7 +176,25 @@ impl AddressList { .map(|banned_until| banned_until < now) .unwrap_or(true) }) - .choose(&mut rng) + .collect() + } + + /// Get number of available, not banned addresses. + pub fn available(&self) -> usize { + self.unbanned().len() + } + + /// Get number of all addresses, both banned and not banned. + pub fn len(&self) -> usize { + self.addresses.len() + } + + /// Check if the list is empty. + /// Returns true if there are no addresses in the list. + /// Returns false if there is at least one address in the list. + /// Banned addresses are also counted. + pub fn is_empty(&self) -> bool { + self.addresses.is_empty() } } diff --git a/packages/rs-dapi-client/src/connection_pool.rs b/packages/rs-dapi-client/src/connection_pool.rs new file mode 100644 index 0000000000..49216e3865 --- /dev/null +++ b/packages/rs-dapi-client/src/connection_pool.rs @@ -0,0 +1,110 @@ +use std::sync::{Arc, Mutex}; + +use http::Uri; +use lru::LruCache; + +use crate::{ + request_settings::AppliedRequestSettings, + transport::{CoreGrpcClient, PlatformGrpcClient}, +}; + +/// ConnectionPool represents pool of connections to DAPI nodes. +/// +/// It can be cloned and shared between threads. +/// Cloning the pool will create a new reference to the same pool. +#[derive(Debug, Clone)] +pub struct ConnectionPool { + inner: Arc>>, +} + +impl ConnectionPool { + /// Create a new pool with a given capacity. + /// The pool will evict the least recently used item when the capacity is reached. + /// + /// # Panics + /// + /// Panics if the capacity is zero. + pub fn new(capacity: usize) -> Self { + Self { + inner: Arc::new(Mutex::new(LruCache::new( + capacity.try_into().expect("must be non-zero"), + ))), + } + } +} + +impl Default for ConnectionPool { + fn default() -> Self { + Self::new(50) + } +} + +impl ConnectionPool { + /// Get item from the pool for the given uri and settings. + pub fn get(&self, uri: &Uri, settings: Option<&AppliedRequestSettings>) -> Option { + let key = format!("{}{:?}", uri, settings); + self.inner.lock().expect("must lock").get(&key).cloned() + } + + /// Get value from cache or create it using provided closure. + /// If value is already in the cache, it will be returned. + /// If value is not in the cache, it will be created by calling `create()` and stored in the cache. + pub fn get_or_create( + &self, + uri: &Uri, + settings: Option<&AppliedRequestSettings>, + create: impl FnOnce() -> PoolItem, + ) -> PoolItem { + if let Some(cli) = self.get(uri, settings) { + return cli; + } + + let cli = create(); + self.put(uri, settings, cli.clone()); + cli + } + + /// Put item into the pool for the given uri and settings. + pub fn put(&self, uri: &Uri, settings: Option<&AppliedRequestSettings>, value: PoolItem) { + let key = format!("{}{:?}", uri, settings); + self.inner.lock().expect("must lock").put(key, value); + } +} + +/// Item stored in the pool. +/// +/// We use an enum as we need to represent two different types of clients. +#[derive(Clone, Debug)] +pub enum PoolItem { + Core(CoreGrpcClient), + Platform(PlatformGrpcClient), +} + +impl From for PoolItem { + fn from(client: PlatformGrpcClient) -> Self { + Self::Platform(client) + } +} +impl From for PoolItem { + fn from(client: CoreGrpcClient) -> Self { + Self::Core(client) + } +} + +impl From for PlatformGrpcClient { + fn from(client: PoolItem) -> Self { + match client { + PoolItem::Platform(client) => client, + _ => panic!("ClientType is not Platform: {:?}", client), + } + } +} + +impl From for CoreGrpcClient { + fn from(client: PoolItem) -> Self { + match client { + PoolItem::Core(client) => client, + _ => panic!("ClientType is not Core: {:?}", client), + } + } +} diff --git a/packages/rs-dapi-client/src/dapi_client.rs b/packages/rs-dapi-client/src/dapi_client.rs index 7486b8f5a9..f698050304 100644 --- a/packages/rs-dapi-client/src/dapi_client.rs +++ b/packages/rs-dapi-client/src/dapi_client.rs @@ -8,6 +8,7 @@ use std::time::Duration; use tracing::Instrument; use crate::address_list::AddressListError; +use crate::connection_pool::ConnectionPool; use crate::{ transport::{TransportClient, TransportRequest}, Address, AddressList, CanRetry, RequestSettings, @@ -64,6 +65,7 @@ pub trait DapiRequestExecutor { pub struct DapiClient { address_list: RwLock, settings: RequestSettings, + pool: ConnectionPool, #[cfg(feature = "dump")] pub(crate) dump_dir: Option, } @@ -71,9 +73,13 @@ pub struct DapiClient { impl DapiClient { /// Initialize new [DapiClient] and optionally override default settings. pub fn new(address_list: AddressList, settings: RequestSettings) -> Self { + // multiply by 3 as we need to store core and platform addresses, and we want some spare capacity just in case + let address_count = 3 * address_list.len(); + Self { address_list: RwLock::new(address_list), settings, + pool: ConnectionPool::new(address_count), #[cfg(feature = "dump")] dump_dir: None, } @@ -153,9 +159,13 @@ impl DapiRequestExecutor for DapiClient { // It stays wrapped in `Result` since we want to return // `impl Future`, not a `Result` itself. let address = address_result?; + let pool = self.pool.clone(); - let mut transport_client = - R::Client::with_uri_and_settings(address.uri().clone(), &applied_settings); + let mut transport_client = R::Client::with_uri_and_settings( + address.uri().clone(), + &applied_settings, + &pool, + ); let response = transport_request .execute_transport(&mut transport_client, &applied_settings) diff --git a/packages/rs-dapi-client/src/lib.rs b/packages/rs-dapi-client/src/lib.rs index 597bc28acc..6fe633b214 100644 --- a/packages/rs-dapi-client/src/lib.rs +++ b/packages/rs-dapi-client/src/lib.rs @@ -3,6 +3,7 @@ #![deny(missing_docs)] mod address_list; +mod connection_pool; mod dapi_client; #[cfg(feature = "dump")] pub mod dump; diff --git a/packages/rs-dapi-client/src/transport.rs b/packages/rs-dapi-client/src/transport.rs index 81f343c777..bf514bf3cc 100644 --- a/packages/rs-dapi-client/src/transport.rs +++ b/packages/rs-dapi-client/src/transport.rs @@ -2,6 +2,7 @@ pub(crate) mod grpc; +use crate::connection_pool::ConnectionPool; pub use crate::request_settings::AppliedRequestSettings; use crate::{CanRetry, RequestSettings}; use dapi_grpc::mock::Mockable; @@ -50,8 +51,12 @@ pub trait TransportClient: Send + Sized { type Error: CanRetry + Send + Debug; /// Build client using node's url. - fn with_uri(uri: Uri) -> Self; + fn with_uri(uri: Uri, pool: &ConnectionPool) -> Self; /// Build client using node's url and [AppliedRequestSettings]. - fn with_uri_and_settings(uri: Uri, settings: &AppliedRequestSettings) -> Self; + fn with_uri_and_settings( + uri: Uri, + settings: &AppliedRequestSettings, + pool: &ConnectionPool, + ) -> Self; } diff --git a/packages/rs-dapi-client/src/transport/grpc.rs b/packages/rs-dapi-client/src/transport/grpc.rs index ea0d894634..eb685303a4 100644 --- a/packages/rs-dapi-client/src/transport/grpc.rs +++ b/packages/rs-dapi-client/src/transport/grpc.rs @@ -3,6 +3,7 @@ use std::time::Duration; use super::{CanRetry, TransportClient, TransportRequest}; +use crate::connection_pool::ConnectionPool; use crate::{request_settings::AppliedRequestSettings, RequestSettings}; use dapi_grpc::core::v0::core_client::CoreClient; use dapi_grpc::core::v0::{self as core_proto}; @@ -17,15 +18,13 @@ pub type PlatformGrpcClient = PlatformClient; /// Core Client using gRPC transport. pub type CoreGrpcClient = CoreClient; -fn channel_with_uri(uri: Uri) -> Channel { - Channel::builder(uri).connect_lazy() -} - -fn channel_with_uri_and_settings(uri: Uri, settings: &AppliedRequestSettings) -> Channel { +fn create_channel(uri: Uri, settings: Option<&AppliedRequestSettings>) -> Channel { let mut builder = Channel::builder(uri); - if let Some(timeout) = settings.connect_timeout { - builder = builder.connect_timeout(timeout); + if let Some(settings) = settings { + if let Some(timeout) = settings.connect_timeout { + builder = builder.connect_timeout(timeout); + } } builder.connect_lazy() @@ -34,24 +33,44 @@ fn channel_with_uri_and_settings(uri: Uri, settings: &AppliedRequestSettings) -> impl TransportClient for PlatformGrpcClient { type Error = dapi_grpc::tonic::Status; - fn with_uri(uri: Uri) -> Self { - Self::new(channel_with_uri(uri)) + fn with_uri(uri: Uri, pool: &ConnectionPool) -> Self { + pool.get_or_create(&uri, None, || { + Self::new(create_channel(uri.clone(), None)).into() + }) + .into() } - fn with_uri_and_settings(uri: Uri, settings: &AppliedRequestSettings) -> Self { - Self::new(channel_with_uri_and_settings(uri, settings)) + fn with_uri_and_settings( + uri: Uri, + settings: &AppliedRequestSettings, + pool: &ConnectionPool, + ) -> Self { + pool.get_or_create(&uri, Some(settings), || { + Self::new(create_channel(uri.clone(), Some(settings))).into() + }) + .into() } } impl TransportClient for CoreGrpcClient { type Error = dapi_grpc::tonic::Status; - fn with_uri(uri: Uri) -> Self { - Self::new(channel_with_uri(uri)) + fn with_uri(uri: Uri, pool: &ConnectionPool) -> Self { + pool.get_or_create(&uri, None, || { + Self::new(create_channel(uri.clone(), None)).into() + }) + .into() } - fn with_uri_and_settings(uri: Uri, settings: &AppliedRequestSettings) -> Self { - Self::new(channel_with_uri_and_settings(uri, settings)) + fn with_uri_and_settings( + uri: Uri, + settings: &AppliedRequestSettings, + pool: &ConnectionPool, + ) -> Self { + pool.get_or_create(&uri, Some(settings), || { + Self::new(create_channel(uri.clone(), Some(settings))).into() + }) + .into() } } From aca3ab5c6f4917cc2188b7687ba7d7c5769f7ac4 Mon Sep 17 00:00:00 2001 From: lklimek <842586+lklimek@users.noreply.github.com> Date: Sat, 13 Apr 2024 14:43:05 +0200 Subject: [PATCH 133/191] refactor(sdk)!: rename crate rs-sdk to dash-sdk (#1811) --- .github/package-filters/rs-packages.yml | 2 +- .github/workflows/tests.yml | 4 +- Cargo.lock | 72 +++++++++---------- packages/check-features/src/main.rs | 4 +- packages/rs-dpp/Cargo.toml | 49 +++++++++---- .../rs-drive-proof-verifier/src/provider.rs | 6 +- packages/rs-drive-proof-verifier/src/types.rs | 2 +- packages/rs-sdk/Cargo.toml | 14 ++-- packages/rs-sdk/README.md | 2 +- packages/rs-sdk/examples/read_contract.rs | 2 +- .../rs-sdk/scripts/generate_test_vectors.sh | 2 +- packages/rs-sdk/src/mock.rs | 6 +- packages/rs-sdk/src/mock/sdk.rs | 2 +- packages/rs-sdk/src/platform/fetch.rs | 2 +- packages/rs-sdk/src/platform/fetch_many.rs | 4 +- packages/rs-sdk/src/platform/query.rs | 4 +- .../platform/transition/broadcast_identity.rs | 2 +- .../platform/transition/broadcast_request.rs | 2 +- packages/rs-sdk/tests/.env.example | 12 ++-- packages/rs-sdk/tests/fetch/broadcast.rs | 2 +- packages/rs-sdk/tests/fetch/common.rs | 2 +- packages/rs-sdk/tests/fetch/config.rs | 14 ++-- packages/rs-sdk/tests/fetch/data_contract.rs | 2 +- packages/rs-sdk/tests/fetch/document.rs | 4 +- packages/rs-sdk/tests/fetch/epoch.rs | 10 +-- packages/rs-sdk/tests/fetch/identity.rs | 4 +- .../tests/fetch/identity_contract_nonce.rs | 2 +- packages/rs-sdk/tests/fetch/mock_fetch.rs | 8 +-- .../rs-sdk/tests/fetch/mock_fetch_many.rs | 8 +-- .../fetch/protocol_version_vote_count.rs | 2 +- .../tests/fetch/protocol_version_votes.rs | 2 +- scripts/configure_dotenv.sh | 18 ++--- 32 files changed, 148 insertions(+), 123 deletions(-) diff --git a/.github/package-filters/rs-packages.yml b/.github/package-filters/rs-packages.yml index efccab2973..f50dea216d 100644 --- a/.github/package-filters/rs-packages.yml +++ b/.github/package-filters/rs-packages.yml @@ -59,7 +59,7 @@ rs-dapi-client: &dapi_client - packages/rs-dapi-client/** - *dapi_grpc -rs-sdk: +dash-sdk: - .github/workflows/tests* - packages/rs-drive-proof-verifier/** - packages/rs-sdk/** diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 1cbcc6a271..806a45cbf6 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -3,7 +3,7 @@ name: Tests on: workflow_dispatch: pull_request: - types: [ opened, synchronize, reopened, ready_for_review ] + types: [opened, synchronize, reopened, ready_for_review] branches: - master - 'v[0-9]+\.[0-9]+-dev' @@ -88,7 +88,7 @@ jobs: lint-runner: '[ "self-hosted", "linux", "arm64", "ubuntu-platform" ]' # Run drive tests on self-hosted 4x test-runner: ${{ contains(fromJSON('["drive-abci"]'), matrix.rs-package) && '[ "self-hosted", "linux", "arm64", "ubuntu-platform-4x" ]' || '[ "self-hosted", "linux", "arm64", "ubuntu-platform" ]' }} - check-each-feature: ${{ contains(fromJSON('["rs-sdk","rs-dapi-client","dapi-grpc","dpp","drive-abci"]'), matrix.rs-package) }} + check-each-feature: ${{ contains(fromJSON('["dash-sdk","rs-dapi-client","dapi-grpc","dpp","drive-abci"]'), matrix.rs-package) }} rs-crates-security: name: Rust crates security audit diff --git a/Cargo.lock b/Cargo.lock index 14c37a4b0e..ec6310bd24 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1069,6 +1069,42 @@ dependencies = [ "syn 2.0.58", ] +[[package]] +name = "dash-sdk" +version = "1.0.0-dev.10" +dependencies = [ + "async-trait", + "base64 0.22.0", + "bincode", + "bip37-bloom-filter", + "ciborium", + "clap 4.5.4", + "dapi-grpc", + "dapi-grpc-macros", + "dashcore-rpc", + "data-contracts", + "derive_more", + "dotenvy", + "dpp", + "drive", + "drive-proof-verifier", + "envy", + "futures", + "hex", + "http", + "lru", + "rs-dapi-client", + "sanitize-filename", + "serde", + "serde_json", + "thiserror", + "tokio", + "tokio-test", + "tokio-util", + "tracing", + "tracing-subscriber", +] + [[package]] name = "dashcore" version = "0.30.0" @@ -3552,42 +3588,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "rs-sdk" -version = "1.0.0-dev.10" -dependencies = [ - "async-trait", - "base64 0.22.0", - "bincode", - "bip37-bloom-filter", - "ciborium", - "clap 4.5.4", - "dapi-grpc", - "dapi-grpc-macros", - "dashcore-rpc", - "data-contracts", - "derive_more", - "dotenvy", - "dpp", - "drive", - "drive-proof-verifier", - "envy", - "futures", - "hex", - "http", - "lru", - "rs-dapi-client", - "sanitize-filename", - "serde", - "serde_json", - "thiserror", - "tokio", - "tokio-test", - "tokio-util", - "tracing", - "tracing-subscriber", -] - [[package]] name = "rs-x11-hash" version = "0.1.8" diff --git a/packages/check-features/src/main.rs b/packages/check-features/src/main.rs index 12f068c393..35b023e201 100644 --- a/packages/check-features/src/main.rs +++ b/packages/check-features/src/main.rs @@ -4,7 +4,7 @@ use toml::Value; fn main() { let crates = [ - "rs-sdk", + "dash-sdk", "rs-drive-abci", "rs-dpp", "rs-drive", @@ -21,7 +21,7 @@ fn check_crate(crate_name: &str) { let cargo_toml_path = format!("packages/{}/Cargo.toml", crate_name); // Read and parse the Cargo.toml file - let cargo_toml_content = fs::read_to_string(&cargo_toml_path) + let cargo_toml_content = fs::read_to_string(cargo_toml_path) .unwrap_or_else(|_| panic!("Failed to read Cargo.toml for {}", crate_name)); let cargo_toml: Value = cargo_toml_content diff --git a/packages/rs-dpp/Cargo.toml b/packages/rs-dpp/Cargo.toml index 71b5809e39..61ad7e94d1 100644 --- a/packages/rs-dpp/Cargo.toml +++ b/packages/rs-dpp/Cargo.toml @@ -56,7 +56,9 @@ platform-versioning = { path = "../rs-platform-versioning" } platform-serialization = { path = "../rs-platform-serialization" } platform-serialization-derive = { path = "../rs-platform-serialization-derive" } derive_more = "0.99.17" -ed25519-dalek = { version = "2.0.0-rc.2", features = ["rand_core"], optional = true } +ed25519-dalek = { version = "2.0.0-rc.2", features = [ + "rand_core", +], optional = true } nohash-hasher = "0.2.0" rust_decimal = "1.29.1" rust_decimal_macros = "1.29.1" @@ -71,10 +73,7 @@ pretty_assertions = { version = "1.3.0" } dpp = { path = ".", features = ["all_features_without_client"] } [features] -default = [ - "platform-value", - "state-transitions", -] +default = ["platform-value", "state-transitions"] all_features = [ "json-object", "platform-value", @@ -115,7 +114,7 @@ all_features = [ "client", ] -rs-sdk-features = [ +dash-sdk-features = [ "json-object", "platform-value", "system_contracts", @@ -134,7 +133,7 @@ rs-sdk-features = [ "state-transitions", "fee-distribution", "client", - "platform-value-cbor" + "platform-value-cbor", ] all_features_without_client = [ "json-object", @@ -187,7 +186,7 @@ validation = [ "platform-value", "document-value-conversion", "state-transition-serde-conversion", - "ed25519-dalek" + "ed25519-dalek", ] platform-value-json = ["platform-value/json"] platform-value-cbor = ["platform-value/cbor"] @@ -200,16 +199,31 @@ message-signature-verification = ["bls-signatures"] document-serde-conversion = [] document-value-conversion = ["document-serde-conversion"] document-json-conversion = ["document-value-conversion", "platform-value-json"] -document-cbor-conversion = ["document-value-conversion", "cbor", "platform-value-cbor"] +document-cbor-conversion = [ + "document-value-conversion", + "cbor", + "platform-value-cbor", +] data-contract-serde-conversion = [] data-contract-value-conversion = ["data-contract-serde-conversion"] -data-contract-json-conversion = ["data-contract-value-conversion", "platform-value-json"] -data-contract-cbor-conversion = ["data-contract-value-conversion", "cbor", "platform-value-cbor"] +data-contract-json-conversion = [ + "data-contract-value-conversion", + "platform-value-json", +] +data-contract-cbor-conversion = [ + "data-contract-value-conversion", + "cbor", + "platform-value-cbor", +] identity-serialization = [] identity-serde-conversion = [] identity-value-conversion = ["identity-serde-conversion"] identity-json-conversion = ["identity-value-conversion", "platform-value-json"] -identity-cbor-conversion = ["identity-value-conversion", "cbor", "platform-value-cbor"] +identity-cbor-conversion = [ + "identity-value-conversion", + "cbor", + "platform-value-cbor", +] state-transition-serde-conversion = ["data-contract-serde-conversion"] state-transition-value-conversion = [ "platform-value", @@ -222,8 +236,15 @@ state-transition-json-conversion = [ "data-contract-json-conversion", "platform-value-json", ] -state-transition-validation = ["state-transitions", "message-signature-verification"] -state-transition-signing = ["state-transitions", "message-signing", "state-transition-validation"] +state-transition-validation = [ + "state-transitions", + "message-signature-verification", +] +state-transition-signing = [ + "state-transitions", + "message-signing", + "state-transition-validation", +] state-transitions = [] system_contracts = ["factories", "data-contracts", "platform-value-json"] fixtures-and-mocks = ["system_contracts", "platform-value/json"] diff --git a/packages/rs-drive-proof-verifier/src/provider.rs b/packages/rs-drive-proof-verifier/src/provider.rs index 56c8290c91..d5e8b45b72 100644 --- a/packages/rs-drive-proof-verifier/src/provider.rs +++ b/packages/rs-drive-proof-verifier/src/provider.rs @@ -97,7 +97,7 @@ where /// Mock ContextProvider that can read quorum keys from files. /// -/// Use `rs_sdk::SdkBuilder::with_dump_dir()` to generate quorum keys files. +/// Use [dash_sdk::SdkBuilder::with_dump_dir()] to generate quorum keys files. #[cfg(feature = "mocks")] #[derive(Debug)] pub struct MockContextProvider { @@ -122,7 +122,7 @@ impl MockContextProvider { /// Set the directory where quorum keys are stored. /// - /// This directory should contain quorum keys files generated using `rs_sdk::SdkBuilder::with_dump_dir()`. + /// This directory should contain quorum keys files generated using [dash_sdk::SdkBuilder::with_dump_dir()]. pub fn quorum_keys_dir(&mut self, quorum_keys_dir: Option) { self.quorum_keys_dir = quorum_keys_dir; } @@ -139,7 +139,7 @@ impl Default for MockContextProvider { impl ContextProvider for MockContextProvider { /// Mock implementation of [ContextProvider] that returns keys from files saved on disk. /// - /// Use `rs_sdk::SdkBuilder::with_dump_dir()` to generate quorum keys files. + /// Use [dash_sdk::SdkBuilder::with_dump_dir()] to generate quorum keys files. fn get_quorum_public_key( &self, quorum_type: u32, diff --git a/packages/rs-drive-proof-verifier/src/types.rs b/packages/rs-drive-proof-verifier/src/types.rs index f59e487eb9..bc34c46d13 100644 --- a/packages/rs-drive-proof-verifier/src/types.rs +++ b/packages/rs-drive-proof-verifier/src/types.rs @@ -21,7 +21,7 @@ use dpp::{ /// A data structure that holds a set of objects of a generic type `O`, indexed by a key of type `K`. /// /// This type is typically returned by functions that operate on multiple objects, such as fetching multiple objects -/// from a server using [`FetchMany`](rs_sdk::platform::FetchMany) or parsing a proof that contains multiple objects +/// from a server using [`FetchMany`](dash_sdk::platform::FetchMany) or parsing a proof that contains multiple objects /// using [`FromProof`](crate::FromProof). /// /// Each key in the `RetrievedObjects` corresponds to an object of generic type `O`. diff --git a/packages/rs-sdk/Cargo.toml b/packages/rs-sdk/Cargo.toml index 8019654323..a53f04d30e 100644 --- a/packages/rs-sdk/Cargo.toml +++ b/packages/rs-sdk/Cargo.toml @@ -1,22 +1,26 @@ [package] -name = "rs-sdk" +name = "dash-sdk" version = "1.0.0-dev.10" edition = "2021" [dependencies] -dpp = { path = "../rs-dpp", default-features = false, features = ["rs-sdk-features"] } -dapi-grpc = { path = "../dapi-grpc", default-features = false, features = ["client"] } +dpp = { path = "../rs-dpp", default-features = false, features = [ + "dash-sdk-features", +] } +dapi-grpc = { path = "../dapi-grpc", default-features = false, features = [ + "client", +] } rs-dapi-client = { path = "../rs-dapi-client", default-features = false } drive = { path = "../rs-drive", default-features = false, features = [ "verify", "serde", -]} +] } drive-proof-verifier = { path = "../rs-drive-proof-verifier" } dapi-grpc-macros = { path = "../rs-dapi-grpc-macros" } bincode = { version = "2.0.0-rc.3", features = ["serde"], optional = true } thiserror = "1.0.58" tokio = { version = "1.36.0", features = ["macros"] } -tokio-util = { version = "0.7.10"} +tokio-util = { version = "0.7.10" } async-trait = { version = "0.1.79" } http = { version = "0.2.12" } ciborium = { git = "https://github.com/qrayven/ciborium", branch = "feat-ser-null-as-undefined" } diff --git a/packages/rs-sdk/README.md b/packages/rs-sdk/README.md index 31945bd0a2..2f7c583cff 100644 --- a/packages/rs-sdk/README.md +++ b/packages/rs-sdk/README.md @@ -68,7 +68,7 @@ Follow these steps to conduct network testing: ```bash cd packages/rs-sdk -cargo test -p rs-sdk --no-default-features --features network-testing +cargo test -p dash-sdk --no-default-features --features network-testing ``` ## Offline Testing diff --git a/packages/rs-sdk/examples/read_contract.rs b/packages/rs-sdk/examples/read_contract.rs index 5178858fc7..f0a2bf2b75 100644 --- a/packages/rs-sdk/examples/read_contract.rs +++ b/packages/rs-sdk/examples/read_contract.rs @@ -1,9 +1,9 @@ use std::{num::NonZeroUsize, str::FromStr, sync::Arc}; use clap::Parser; +use dash_sdk::{mock::provider::GrpcContextProvider, platform::Fetch, Sdk, SdkBuilder}; use dpp::prelude::{DataContract, Identifier}; use rs_dapi_client::AddressList; -use rs_sdk::{mock::provider::GrpcContextProvider, platform::Fetch, Sdk, SdkBuilder}; #[derive(clap::Parser, Debug)] #[command(version)] diff --git a/packages/rs-sdk/scripts/generate_test_vectors.sh b/packages/rs-sdk/scripts/generate_test_vectors.sh index 5510bfe964..d02f193687 100755 --- a/packages/rs-sdk/scripts/generate_test_vectors.sh +++ b/packages/rs-sdk/scripts/generate_test_vectors.sh @@ -20,7 +20,7 @@ CARGO_DIR="$(realpath "$(dirname "$0")/..")" pushd "$CARGO_DIR" -cargo test -p rs-sdk \ +cargo test -p dash-sdk \ --no-default-features \ --features generate-test-vectors \ "$1" diff --git a/packages/rs-sdk/src/mock.rs b/packages/rs-sdk/src/mock.rs index 2e6d35da99..7e5208cd4f 100644 --- a/packages/rs-sdk/src/mock.rs +++ b/packages/rs-sdk/src/mock.rs @@ -12,9 +12,9 @@ //! ## Example //! //! ```no_run -//! let sdk = rs_sdk::Sdk::new_mock(); -//! let query = rs_sdk::platform::Identifier::random(); -//! sdk.mock().expect_fetch(query, None as Option); +//! let sdk = dash_sdk::Sdk::new_mock(); +//! let query = dash_sdk::platform::Identifier::random(); +//! sdk.mock().expect_fetch(query, None as Option); //! ``` //! //! See tests/mock_*.rs for more detailed examples. diff --git a/packages/rs-sdk/src/mock/sdk.rs b/packages/rs-sdk/src/mock/sdk.rs index 65053e6dcc..82c5c65ecb 100644 --- a/packages/rs-sdk/src/mock/sdk.rs +++ b/packages/rs-sdk/src/mock/sdk.rs @@ -209,7 +209,7 @@ impl MockDashPlatformSdk { /// # let r = tokio::runtime::Runtime::new().unwrap(); /// # /// # r.block_on(async { - /// use rs_sdk::{Sdk, platform::{Identity, Fetch, dpp::identity::accessors::IdentityGettersV0}}; + /// use dash_sdk::{Sdk, platform::{Identity, Fetch, dpp::identity::accessors::IdentityGettersV0}}; /// /// let mut api = Sdk::new_mock(); /// // Define expected response diff --git a/packages/rs-sdk/src/platform/fetch.rs b/packages/rs-sdk/src/platform/fetch.rs index 2bd0ff19be..dc8c12a38a 100644 --- a/packages/rs-sdk/src/platform/fetch.rs +++ b/packages/rs-sdk/src/platform/fetch.rs @@ -34,7 +34,7 @@ use super::DocumentQuery; /// * call [Identity::fetch()] with the query and an instance of [Sdk]. /// /// ```rust -/// use rs_sdk::{Sdk, platform::{Query, Identifier, Fetch, Identity}}; +/// use dash_sdk::{Sdk, platform::{Query, Identifier, Fetch, Identity}}; /// /// # const SOME_IDENTIFIER : [u8; 32] = [0; 32]; /// let sdk = Sdk::new_mock(); diff --git a/packages/rs-sdk/src/platform/fetch_many.rs b/packages/rs-sdk/src/platform/fetch_many.rs index 81277d9f33..d98bd86267 100644 --- a/packages/rs-sdk/src/platform/fetch_many.rs +++ b/packages/rs-sdk/src/platform/fetch_many.rs @@ -54,7 +54,7 @@ use super::LimitQuery; /// * call [DataContract::fetch_many()](FetchMany::fetch_many()) with the query and an instance of [Sdk]. /// /// ```rust -/// use rs_sdk::{Sdk, platform::{Query, Identifier, FetchMany, DataContract}}; +/// use dash_sdk::{Sdk, platform::{Query, Identifier, FetchMany, DataContract}}; /// /// # const SOME_IDENTIFIER_1 : [u8; 32] = [1; 32]; /// # const SOME_IDENTIFIER_2 : [u8; 32] = [2; 32]; @@ -272,7 +272,7 @@ impl FetchMany for ExtendedEpochInfo { /// ## Example /// /// ```rust -/// use rs_sdk::{Sdk, platform::FetchMany}; +/// use dash_sdk::{Sdk, platform::FetchMany}; /// use drive_proof_verifier::types::ProtocolVersionVoteCount; /// /// # tokio_test::block_on(async { diff --git a/packages/rs-sdk/src/platform/query.rs b/packages/rs-sdk/src/platform/query.rs index 90e1821dfa..a1c80abf10 100644 --- a/packages/rs-sdk/src/platform/query.rs +++ b/packages/rs-sdk/src/platform/query.rs @@ -43,7 +43,7 @@ pub const DEFAULT_NODES_VOTING_LIMIT: u32 = 100; /// or [FetchMany](crate::platform::FetchMany) trait: /// /// ```rust -/// use rs_sdk::{Sdk, platform::{Query, Identifier, Fetch, Identity}}; +/// use dash_sdk::{Sdk, platform::{Query, Identifier, Fetch, Identity}}; /// /// # const SOME_IDENTIFIER : [u8; 32] = [0; 32]; /// let sdk = Sdk::new_mock(); @@ -155,7 +155,7 @@ impl<'a> Query for DriveQuery<'a> { /// ## Example /// /// ```rust -/// use rs_sdk::{Sdk, platform::{Query, LimitQuery, Identifier, FetchMany, Identity}}; +/// use dash_sdk::{Sdk, platform::{Query, LimitQuery, Identifier, FetchMany, Identity}}; /// use drive_proof_verifier::types::ExtendedEpochInfos; /// use dpp::block::extended_epoch_info::ExtendedEpochInfo; /// diff --git a/packages/rs-sdk/src/platform/transition/broadcast_identity.rs b/packages/rs-sdk/src/platform/transition/broadcast_identity.rs index 5e08d33bbd..bcb806e874 100644 --- a/packages/rs-sdk/src/platform/transition/broadcast_identity.rs +++ b/packages/rs-sdk/src/platform/transition/broadcast_identity.rs @@ -37,7 +37,7 @@ use crate::error::Error; /// /// ```rust, ignore /// -/// use rs_sdk::{Sdk, platform::{BroadcastNewIdentity, IdentityCreateTransition}}; +/// use dash_sdk::{Sdk, platform::{BroadcastNewIdentity, IdentityCreateTransition}}; /// use dpp::identity::signer::Signer; /// use dpp::prelude::{AssetLockProof, PrivateKey}; /// use dpp::version::PlatformVersion; diff --git a/packages/rs-sdk/src/platform/transition/broadcast_request.rs b/packages/rs-sdk/src/platform/transition/broadcast_request.rs index 9d8ab69861..af48112686 100644 --- a/packages/rs-sdk/src/platform/transition/broadcast_request.rs +++ b/packages/rs-sdk/src/platform/transition/broadcast_request.rs @@ -36,7 +36,7 @@ use crate::error::Error; /// /// ```rust, ignore /// -/// use rs_sdk::{Sdk, platform::{BroadcastNewIdentity, IdentityCreateTransition}}; +/// use dash_sdk::{Sdk, platform::{BroadcastNewIdentity, IdentityCreateTransition}}; /// use dpp::identity::signer::Signer; /// use dpp::prelude::{AssetLockProof, PrivateKey}; /// use dpp::version::PlatformVersion; diff --git a/packages/rs-sdk/tests/.env.example b/packages/rs-sdk/tests/.env.example index 9915c8d1df..23b48e84df 100644 --- a/packages/rs-sdk/tests/.env.example +++ b/packages/rs-sdk/tests/.env.example @@ -1,9 +1,9 @@ # Configuration of tests and examples -RS_SDK_PLATFORM_HOST="127.0.0.1" -RS_SDK_PLATFORM_PORT=2443 -RS_SDK_PLATFORM_SSL=false +DASH_SDK_PLATFORM_HOST="127.0.0.1" +DASH_SDK_PLATFORM_PORT=2443 +DASH_SDK_PLATFORM_SSL=false -RS_SDK_CORE_PORT=20002 -RS_SDK_CORE_USER="someuser" -RS_SDK_CORE_PASSWORD="verysecretpassword" +DASH_SDK_CORE_PORT=20002 +DASH_SDK_CORE_USER="someuser" +DASH_SDK_CORE_PASSWORD="verysecretpassword" diff --git a/packages/rs-sdk/tests/fetch/broadcast.rs b/packages/rs-sdk/tests/fetch/broadcast.rs index dbc5a280a6..ff8b821ab8 100644 --- a/packages/rs-sdk/tests/fetch/broadcast.rs +++ b/packages/rs-sdk/tests/fetch/broadcast.rs @@ -6,8 +6,8 @@ mod online { wait_for_state_transition_result_request::WaitForStateTransitionResultRequestV0, WaitForStateTransitionResultRequest, }; + use dash_sdk::Sdk; use rs_dapi_client::{DapiRequest, RequestSettings}; - use rs_sdk::Sdk; use std::time::Duration; /// Send streaming request to the server and time out after 1 second (because we don't expect to receive anything) diff --git a/packages/rs-sdk/tests/fetch/common.rs b/packages/rs-sdk/tests/fetch/common.rs index 8e943b2c33..2ad8df272f 100644 --- a/packages/rs-sdk/tests/fetch/common.rs +++ b/packages/rs-sdk/tests/fetch/common.rs @@ -71,7 +71,7 @@ pub fn mock_data_contract( pub fn setup_logs() { tracing_subscriber::fmt::fmt() .with_env_filter(tracing_subscriber::EnvFilter::new( - "info,rs_sdk=trace,h2=info", + "info,dash_sdk=trace,h2=info", )) .pretty() .with_ansi(true) diff --git a/packages/rs-sdk/tests/fetch/config.rs b/packages/rs-sdk/tests/fetch/config.rs index ff2eb4c824..d4b0c5132f 100644 --- a/packages/rs-sdk/tests/fetch/config.rs +++ b/packages/rs-sdk/tests/fetch/config.rs @@ -22,8 +22,8 @@ const DPNS_DASH_TLD_DOCUMENT_ID: [u8; 32] = [ /// /// Content of this configuration is loaded from environment variables or `${CARGO_MANIFEST_DIR}/.env` file /// when the [Config::new()] is called. -/// Variable names in the enviroment and `.env` file must be prefixed with [RS_SDK_](Config::CONFIG_PREFIX) -/// and written as SCREAMING_SNAKE_CASE (e.g. `RS_SDK_PLATFORM_HOST`). +/// Variable names in the enviroment and `.env` file must be prefixed with [DASH_SDK_](Config::CONFIG_PREFIX) +/// and written as SCREAMING_SNAKE_CASE (e.g. `DASH_SDK_PLATFORM_HOST`). pub struct Config { /// Hostname of the Dash Platform node to connect to #[serde(default)] @@ -72,12 +72,12 @@ pub struct Config { impl Config { /// Prefix of configuration options in the environment variables and `.env` file. - pub const CONFIG_PREFIX: &'static str = "RS_SDK_"; + pub const CONFIG_PREFIX: &'static str = "DASH_SDK_"; /// Load configuration from operating system environment variables and `.env` file. /// /// Create new [Config] with data from environment variables and `${CARGO_MANIFEST_DIR}/tests/.env` file. /// Variable names in the environment and `.env` file must be converted to SCREAMING_SNAKE_CASE and - /// prefixed with [RS_SDK_](Config::CONFIG_PREFIX). + /// prefixed with [DASH_SDK_](Config::CONFIG_PREFIX). pub fn new() -> Self { // load config from .env file, ignore errors @@ -144,7 +144,7 @@ impl Config { /// expectations from different tests. /// /// When empty string is provided, expectations are stored in the root of the dump directory. - pub async fn setup_api(&self, namespace: &str) -> Arc { + pub async fn setup_api(&self, namespace: &str) -> Arc { let dump_dir = match namespace.is_empty() { true => self.dump_dir.clone(), false => self.dump_dir.join(sanitize_filename::sanitize(namespace)), @@ -165,7 +165,7 @@ impl Config { #[cfg(all(feature = "network-testing", not(feature = "offline-testing")))] let sdk = { // Dump all traffic to disk - let builder = rs_sdk::SdkBuilder::new(self.address_list()).with_core( + let builder = dash_sdk::SdkBuilder::new(self.address_list()).with_core( &self.platform_host, self.core_port, &self.core_user, @@ -194,7 +194,7 @@ impl Config { // offline testing takes precedence over network testing #[cfg(feature = "offline-testing")] let sdk = { - let mock_sdk = rs_sdk::SdkBuilder::new_mock() + let mock_sdk = dash_sdk::SdkBuilder::new_mock() .build() .expect("initialize api"); diff --git a/packages/rs-sdk/tests/fetch/data_contract.rs b/packages/rs-sdk/tests/fetch/data_contract.rs index 44fbbfb288..d6a6134159 100644 --- a/packages/rs-sdk/tests/fetch/data_contract.rs +++ b/packages/rs-sdk/tests/fetch/data_contract.rs @@ -1,6 +1,6 @@ use super::config::Config; +use dash_sdk::platform::{Fetch, FetchMany}; use dpp::prelude::{DataContract, Identifier}; -use rs_sdk::platform::{Fetch, FetchMany}; /// Given some dummy data contract ID, when I fetch data contract, I get None because it doesn't exist. #[tokio::test(flavor = "multi_thread", worker_threads = 1)] diff --git a/packages/rs-sdk/tests/fetch/document.rs b/packages/rs-sdk/tests/fetch/document.rs index 7308048ab7..8893814374 100644 --- a/packages/rs-sdk/tests/fetch/document.rs +++ b/packages/rs-sdk/tests/fetch/document.rs @@ -3,12 +3,12 @@ use std::sync::Arc; use super::{common::setup_logs, config::Config}; +use dash_sdk::platform::{DocumentQuery, Fetch, FetchMany}; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::document::{Document, DocumentV0Getters}; use dpp::platform_value::string_encoding::Encoding; use dpp::prelude::{DataContract, Identifier}; use drive::query::DriveQuery; -use rs_sdk::platform::{DocumentQuery, Fetch, FetchMany}; /// Given some data contract ID, document type and document ID, when I fetch it, then I get it. #[tokio::test(flavor = "multi_thread", worker_threads = 1)] @@ -71,7 +71,7 @@ async fn document_read_no_contract() { assert!(matches!( query, - Err(rs_sdk::error::Error::MissingDependency(_, _)) + Err(dash_sdk::error::Error::MissingDependency(_, _)) )); } diff --git a/packages/rs-sdk/tests/fetch/epoch.rs b/packages/rs-sdk/tests/fetch/epoch.rs index dda9aa6cd3..411592995b 100644 --- a/packages/rs-sdk/tests/fetch/epoch.rs +++ b/packages/rs-sdk/tests/fetch/epoch.rs @@ -5,16 +5,16 @@ use dapi_grpc::platform::{ v0::{get_identity_request::GetIdentityRequestV0, GetIdentityRequest}, VersionedGrpcResponse, }; -use dpp::block::epoch::EpochIndex; -use dpp::block::extended_epoch_info::v0::ExtendedEpochInfoV0Getters; -use dpp::block::extended_epoch_info::ExtendedEpochInfo; -use rs_dapi_client::{DapiRequestExecutor, RequestSettings}; -use rs_sdk::{ +use dash_sdk::{ platform::{ types::epoch::ExtendedEpochInfoEx, Fetch, FetchMany, LimitQuery, DEFAULT_EPOCH_QUERY_LIMIT, }, Sdk, }; +use dpp::block::epoch::EpochIndex; +use dpp::block::extended_epoch_info::v0::ExtendedEpochInfoV0Getters; +use dpp::block::extended_epoch_info::ExtendedEpochInfo; +use rs_dapi_client::{DapiRequestExecutor, RequestSettings}; /// Get current epoch index from DAPI response metadata async fn get_current_epoch(sdk: &Sdk, cfg: &Config) -> EpochIndex { diff --git a/packages/rs-sdk/tests/fetch/identity.rs b/packages/rs-sdk/tests/fetch/identity.rs index 13656a933e..56af35020e 100644 --- a/packages/rs-sdk/tests/fetch/identity.rs +++ b/packages/rs-sdk/tests/fetch/identity.rs @@ -1,10 +1,10 @@ +use dash_sdk::platform::types::identity::PublicKeyHash; +use dash_sdk::platform::{Fetch, FetchMany}; use dpp::identity::accessors::IdentityGettersV0; use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; use dpp::prelude::IdentityPublicKey; use dpp::{identity::hash::IdentityPublicKeyHashMethodsV0, prelude::Identity}; use drive_proof_verifier::types::{IdentityBalance, IdentityBalanceAndRevision}; -use rs_sdk::platform::types::identity::PublicKeyHash; -use rs_sdk::platform::{Fetch, FetchMany}; use super::{common::setup_logs, config::Config}; diff --git a/packages/rs-sdk/tests/fetch/identity_contract_nonce.rs b/packages/rs-sdk/tests/fetch/identity_contract_nonce.rs index 83e0808abd..26978a733f 100644 --- a/packages/rs-sdk/tests/fetch/identity_contract_nonce.rs +++ b/packages/rs-sdk/tests/fetch/identity_contract_nonce.rs @@ -1,6 +1,6 @@ +use dash_sdk::platform::Fetch; use dpp::prelude::Identifier; use drive_proof_verifier::types::IdentityContractNonceFetcher; -use rs_sdk::platform::Fetch; use super::{common::setup_logs, config::Config}; diff --git a/packages/rs-sdk/tests/fetch/mock_fetch.rs b/packages/rs-sdk/tests/fetch/mock_fetch.rs index db18bd51fd..1f735e5e54 100644 --- a/packages/rs-sdk/tests/fetch/mock_fetch.rs +++ b/packages/rs-sdk/tests/fetch/mock_fetch.rs @@ -2,6 +2,10 @@ //! use super::common::{mock_data_contract, mock_document_type}; +use dash_sdk::{ + platform::{DocumentQuery, Fetch}, + Sdk, +}; use dpp::{ data_contract::{ accessors::v0::DataContractV0Getters, @@ -14,10 +18,6 @@ use dpp::{ prelude::{DataContract, Identifier, Identity}, version::PlatformVersion, }; -use rs_sdk::{ - platform::{DocumentQuery, Fetch}, - Sdk, -}; #[tokio::test] /// Given some identity, when I fetch it using mock API, then I get the same identity diff --git a/packages/rs-sdk/tests/fetch/mock_fetch_many.rs b/packages/rs-sdk/tests/fetch/mock_fetch_many.rs index d0db46810d..1663ad8aa5 100644 --- a/packages/rs-sdk/tests/fetch/mock_fetch_many.rs +++ b/packages/rs-sdk/tests/fetch/mock_fetch_many.rs @@ -1,6 +1,10 @@ use std::collections::BTreeMap; use super::common::{mock_data_contract, mock_document_type}; +use dash_sdk::{ + platform::{DocumentQuery, FetchMany}, + Sdk, +}; use dpp::{ data_contract::{ accessors::v0::DataContractV0Getters, @@ -10,10 +14,6 @@ use dpp::{ }, document::{Document, DocumentV0Getters}, }; -use rs_sdk::{ - platform::{DocumentQuery, FetchMany}, - Sdk, -}; /// Given some data contract, document type and 1 document of this type, when I request multiple documents, I get that /// document. diff --git a/packages/rs-sdk/tests/fetch/protocol_version_vote_count.rs b/packages/rs-sdk/tests/fetch/protocol_version_vote_count.rs index 2b0023226f..2c31ca7c2f 100644 --- a/packages/rs-sdk/tests/fetch/protocol_version_vote_count.rs +++ b/packages/rs-sdk/tests/fetch/protocol_version_vote_count.rs @@ -1,6 +1,6 @@ use super::{common::setup_logs, config::Config}; +use dash_sdk::platform::FetchMany; use dpp::version::ProtocolVersionVoteCount; -use rs_sdk::platform::FetchMany; /// Given some existing identity ID, when I fetch the identity keys, I get some of them indexed by key ID. #[tokio::test(flavor = "multi_thread", worker_threads = 1)] diff --git a/packages/rs-sdk/tests/fetch/protocol_version_votes.rs b/packages/rs-sdk/tests/fetch/protocol_version_votes.rs index 62b1ae6a64..558534ebbd 100644 --- a/packages/rs-sdk/tests/fetch/protocol_version_votes.rs +++ b/packages/rs-sdk/tests/fetch/protocol_version_votes.rs @@ -1,7 +1,7 @@ use super::{common::setup_logs, config::Config}; +use dash_sdk::platform::{types::version_votes::MasternodeProtocolVoteEx, FetchMany}; use dashcore_rpc::dashcore::{hashes::Hash, ProTxHash}; use drive_proof_verifier::types::MasternodeProtocolVote; -use rs_sdk::platform::{types::version_votes::MasternodeProtocolVoteEx, FetchMany}; /// Given protxhash with only zeros, when I fetch protocol version votes for nodes, I can retrieve them. #[tokio::test(flavor = "multi_thread", worker_threads = 1)] diff --git a/scripts/configure_dotenv.sh b/scripts/configure_dotenv.sh index b79578c6bd..d63727ee5b 100755 --- a/scripts/configure_dotenv.sh +++ b/scripts/configure_dotenv.sh @@ -12,7 +12,7 @@ CONFIG=local_seed DAPI_PATH="${PACKAGES_PATH}"/dapi DRIVE_PATH="${PACKAGES_PATH}"/rs-drive-abci SDK_PATH="${PACKAGES_PATH}"/js-dash-sdk -RS_SDK_PATH="${PACKAGES_PATH}"/rs-sdk +DASH_SDK_PATH="${PACKAGES_PATH}"/rs-sdk WALLET_LIB_PATH="${PACKAGES_PATH}"/wallet-lib # Get configuration option from dashmate config for 1st node @@ -63,22 +63,22 @@ FAUCET_PRIVATE_KEY=${FAUCET_PRIVATE_KEY} NETWORK=regtest" >>"${WALLET_LIB_ENV_FILE_PATH}" #EOF -# RS_SDK tests config +# DASH_SDK tests config CORE_RPC_PORT=$(get_config core.rpc.port) CORE_RPC_USER=$(get_config core.rpc.user) CORE_RPC_PASSWORD=$(get_config core.rpc.password) PLATFORM_RPC_PORT=$(get_config platform.dapi.envoy.http.port) -cat <"${RS_SDK_PATH}"/tests/.env -# Configuration of rs-sdk network tests +cat <"${DASH_SDK_PATH}"/tests/.env +# Configuration of dash-sdk network tests # Generated by configure_dotenv.sh -RS_SDK_PLATFORM_HOST="127.0.0.1" -RS_SDK_PLATFORM_PORT="$PLATFORM_RPC_PORT" +DASH_SDK_PLATFORM_HOST="127.0.0.1" +DASH_SDK_PLATFORM_PORT="$PLATFORM_RPC_PORT" -RS_SDK_CORE_PORT="$CORE_RPC_PORT" -RS_SDK_CORE_USER="$CORE_RPC_USER" -RS_SDK_CORE_PASSWORD="$CORE_RPC_PASSWORD" +DASH_SDK_CORE_PORT="$CORE_RPC_PORT" +DASH_SDK_CORE_USER=$CORE_RPC_USER +DASH_SDK_CORE_PASSWORD=$CORE_RPC_PASSWORD EOF From f553b70523567bf663626adc5e602acc7649d52b Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Mon, 15 Apr 2024 19:11:26 +0700 Subject: [PATCH 134/191] feat(platform): query any element in Platform state (#1816) --- packages/dapi-grpc/build.rs | 6 +- .../protos/platform/v0/platform.proto | 32 ++++ .../proto/org.dash.platform.dapi.v0.rs | 176 ++++++++++++++++++ packages/rs-dapi-client/Cargo.toml | 2 +- packages/rs-dapi-grpc-macros/Cargo.toml | 2 +- packages/rs-drive-abci/Cargo.toml | 2 +- .../rs-drive-abci/src/query/proofs/v0/mod.rs | 2 +- packages/rs-drive-abci/src/query/service.rs | 20 +- .../rs-drive-abci/src/query/system/mod.rs | 1 + .../src/query/system/path_elements/mod.rs | 54 ++++++ .../src/query/system/path_elements/v0/mod.rs | 129 +++++++++++++ packages/rs-drive-proof-verifier/Cargo.toml | 2 +- packages/rs-drive-proof-verifier/src/proof.rs | 41 +++- packages/rs-drive-proof-verifier/src/types.rs | 7 + packages/rs-drive/src/drive/balances/mod.rs | 13 +- packages/rs-drive/src/drive/prove/mod.rs | 3 +- .../src/drive/prove/prove_elements/mod.rs | 41 ++++ .../src/drive/prove/prove_elements/v0/mod.rs | 46 +++++ .../mod.rs | 15 +- .../v0/mod.rs | 4 +- .../src/drive/system/fetch_elements/mod.rs | 41 ++++ .../src/drive/system/fetch_elements/v0/mod.rs | 49 +++++ packages/rs-drive/src/drive/system/mod.rs | 1 + .../rs-drive/src/drive/verify/system/mod.rs | 1 + .../verify/system/verify_elements/mod.rs | 47 +++++ .../verify/system/verify_elements/v0/mod.rs | 49 +++++ packages/rs-drive/src/lib.rs | 2 +- .../src/version/drive_abci_versions.rs | 2 + .../src/version/drive_versions.rs | 10 +- .../src/version/mocks/v2_test.rs | 17 +- .../src/version/mocks/v3_test.rs | 17 +- .../rs-platform-version/src/version/v1.rs | 17 +- packages/rs-sdk/Cargo.toml | 4 +- packages/strategy-tests/src/lib.rs | 4 +- 34 files changed, 821 insertions(+), 38 deletions(-) create mode 100644 packages/rs-drive-abci/src/query/system/path_elements/mod.rs create mode 100644 packages/rs-drive-abci/src/query/system/path_elements/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/prove/prove_elements/mod.rs create mode 100644 packages/rs-drive/src/drive/prove/prove_elements/v0/mod.rs rename packages/rs-drive/src/drive/prove/{prove_multiple => prove_multiple_state_transition_results}/mod.rs (81%) rename packages/rs-drive/src/drive/prove/{prove_multiple => prove_multiple_state_transition_results}/v0/mod.rs (96%) create mode 100644 packages/rs-drive/src/drive/system/fetch_elements/mod.rs create mode 100644 packages/rs-drive/src/drive/system/fetch_elements/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/verify/system/verify_elements/mod.rs create mode 100644 packages/rs-drive/src/drive/verify/system/verify_elements/v0/mod.rs diff --git a/packages/dapi-grpc/build.rs b/packages/dapi-grpc/build.rs index 6101c49bbd..20af478ffb 100644 --- a/packages/dapi-grpc/build.rs +++ b/packages/dapi-grpc/build.rs @@ -39,7 +39,7 @@ fn configure_platform(mut platform: MappingConfig) -> MappingConfig { // Derive features for versioned messages // // "GetConsensusParamsRequest" is excluded as this message does not support proofs - const VERSIONED_REQUESTS: [&str; 17] = [ + const VERSIONED_REQUESTS: [&str; 18] = [ "GetDataContractHistoryRequest", "GetDataContractRequest", "GetDataContractsRequest", @@ -57,10 +57,11 @@ fn configure_platform(mut platform: MappingConfig) -> MappingConfig { "WaitForStateTransitionResultRequest", "GetProtocolVersionUpgradeStateRequest", "GetProtocolVersionUpgradeVoteStatusRequest", + "GetPathElementsRequest", ]; // "GetConsensusParamsResponse" is excluded as this message does not support proofs - const VERSIONED_RESPONSES: [&str; 18] = [ + const VERSIONED_RESPONSES: [&str; 19] = [ "GetDataContractHistoryResponse", "GetDataContractResponse", "GetDataContractsResponse", @@ -79,6 +80,7 @@ fn configure_platform(mut platform: MappingConfig) -> MappingConfig { "GetEpochsInfoResponse", "GetProtocolVersionUpgradeStateResponse", "GetProtocolVersionUpgradeVoteStatusResponse", + "GetPathElementsResponse", ]; // Derive VersionedGrpcMessage on requests diff --git a/packages/dapi-grpc/protos/platform/v0/platform.proto b/packages/dapi-grpc/protos/platform/v0/platform.proto index f364577ad7..78a6809d1a 100644 --- a/packages/dapi-grpc/protos/platform/v0/platform.proto +++ b/packages/dapi-grpc/protos/platform/v0/platform.proto @@ -36,6 +36,7 @@ service Platform { rpc getProtocolVersionUpgradeState(GetProtocolVersionUpgradeStateRequest) returns (GetProtocolVersionUpgradeStateResponse); rpc getProtocolVersionUpgradeVoteStatus(GetProtocolVersionUpgradeVoteStatusRequest) returns (GetProtocolVersionUpgradeVoteStatusResponse); rpc getEpochsInfo(GetEpochsInfoRequest) returns (GetEpochsInfoResponse); + rpc getPathElements(GetPathElementsRequest) returns (GetPathElementsResponse); } message Proof { @@ -620,3 +621,34 @@ message GetEpochsInfoResponse { GetEpochsInfoResponseV0 v0 = 1; } } + +message GetPathElementsRequest { + message GetPathElementsRequestV0 { + repeated bytes path = 1; + repeated bytes keys = 2; + bool prove = 3; + } + + oneof version { + GetPathElementsRequestV0 v0 = 1; + } +} + +message GetPathElementsResponse { + message GetPathElementsResponseV0 { + message Elements { + repeated bytes elements = 1; + } + + oneof result { + Elements elements = 1; + Proof proof = 2; + } + ResponseMetadata metadata = 3; + } + + oneof version { + GetPathElementsResponseV0 v0 = 1; + } +} + diff --git a/packages/dapi-grpc/src/platform/proto/org.dash.platform.dapi.v0.rs b/packages/dapi-grpc/src/platform/proto/org.dash.platform.dapi.v0.rs index 0f6446f156..048982c8df 100644 --- a/packages/dapi-grpc/src/platform/proto/org.dash.platform.dapi.v0.rs +++ b/packages/dapi-grpc/src/platform/proto/org.dash.platform.dapi.v0.rs @@ -2134,6 +2134,99 @@ pub mod get_epochs_info_response { V0(GetEpochsInfoResponseV0), } } +#[derive(::serde::Serialize, ::serde::Deserialize)] +#[serde(rename_all = "snake_case")] +#[derive(::dapi_grpc_macros::VersionedGrpcMessage)] +#[grpc_versions(0)] +#[derive(::dapi_grpc_macros::Mockable)] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct GetPathElementsRequest { + #[prost(oneof = "get_path_elements_request::Version", tags = "1")] + pub version: ::core::option::Option, +} +/// Nested message and enum types in `GetPathElementsRequest`. +pub mod get_path_elements_request { + #[derive(::serde::Serialize, ::serde::Deserialize)] + #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct GetPathElementsRequestV0 { + #[prost(bytes = "vec", repeated, tag = "1")] + pub path: ::prost::alloc::vec::Vec<::prost::alloc::vec::Vec>, + #[prost(bytes = "vec", repeated, tag = "2")] + pub keys: ::prost::alloc::vec::Vec<::prost::alloc::vec::Vec>, + #[prost(bool, tag = "3")] + pub prove: bool, + } + #[derive(::serde::Serialize, ::serde::Deserialize)] + #[serde(rename_all = "snake_case")] + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Version { + #[prost(message, tag = "1")] + V0(GetPathElementsRequestV0), + } +} +#[derive(::serde::Serialize, ::serde::Deserialize)] +#[serde(rename_all = "snake_case")] +#[derive( + ::dapi_grpc_macros::VersionedGrpcMessage, + ::dapi_grpc_macros::VersionedGrpcResponse +)] +#[grpc_versions(0)] +#[derive(::dapi_grpc_macros::Mockable)] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct GetPathElementsResponse { + #[prost(oneof = "get_path_elements_response::Version", tags = "1")] + pub version: ::core::option::Option, +} +/// Nested message and enum types in `GetPathElementsResponse`. +pub mod get_path_elements_response { + #[derive(::serde::Serialize, ::serde::Deserialize)] + #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct GetPathElementsResponseV0 { + #[prost(message, optional, tag = "3")] + pub metadata: ::core::option::Option, + #[prost(oneof = "get_path_elements_response_v0::Result", tags = "1, 2")] + pub result: ::core::option::Option, + } + /// Nested message and enum types in `GetPathElementsResponseV0`. + pub mod get_path_elements_response_v0 { + #[derive(::serde::Serialize, ::serde::Deserialize)] + #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Elements { + #[prost(bytes = "vec", repeated, tag = "1")] + pub elements: ::prost::alloc::vec::Vec<::prost::alloc::vec::Vec>, + } + #[derive(::serde::Serialize, ::serde::Deserialize)] + #[serde(rename_all = "snake_case")] + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Result { + #[prost(message, tag = "1")] + Elements(Elements), + #[prost(message, tag = "2")] + Proof(super::super::Proof), + } + } + #[derive(::serde::Serialize, ::serde::Deserialize)] + #[serde(rename_all = "snake_case")] + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Version { + #[prost(message, tag = "1")] + V0(GetPathElementsResponseV0), + } +} /// Generated client implementations. pub mod platform_client { #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] @@ -2816,6 +2909,36 @@ pub mod platform_client { ); self.inner.unary(req, path, codec).await } + pub async fn get_path_elements( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/org.dash.platform.dapi.v0.Platform/getPathElements", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "org.dash.platform.dapi.v0.Platform", + "getPathElements", + ), + ); + self.inner.unary(req, path, codec).await + } } } /// Generated server implementations. @@ -2965,6 +3088,13 @@ pub mod platform_server { tonic::Response, tonic::Status, >; + async fn get_path_elements( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; } #[derive(Debug)] pub struct PlatformServer { @@ -3989,6 +4119,52 @@ pub mod platform_server { }; Box::pin(fut) } + "/org.dash.platform.dapi.v0.Platform/getPathElements" => { + #[allow(non_camel_case_types)] + struct getPathElementsSvc(pub Arc); + impl< + T: Platform, + > tonic::server::UnaryService + for getPathElementsSvc { + type Response = super::GetPathElementsResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner).get_path_elements(request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = getPathElementsSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } _ => { Box::pin(async move { Ok( diff --git a/packages/rs-dapi-client/Cargo.toml b/packages/rs-dapi-client/Cargo.toml index 0763a35651..9c8ba47939 100644 --- a/packages/rs-dapi-client/Cargo.toml +++ b/packages/rs-dapi-client/Cargo.toml @@ -14,7 +14,7 @@ offline-testing = [] [dependencies] backon = "0.4.1" -dapi-grpc = { path = "../dapi-grpc" , features = ["core", "client", "serde"], default-features = false} +dapi-grpc = { path = "../dapi-grpc" } futures = "0.3.28" http = "0.2.9" rand = { version = "0.8.5", features = ["small_rng"] } diff --git a/packages/rs-dapi-grpc-macros/Cargo.toml b/packages/rs-dapi-grpc-macros/Cargo.toml index c51e4dd603..18d30ae983 100644 --- a/packages/rs-dapi-grpc-macros/Cargo.toml +++ b/packages/rs-dapi-grpc-macros/Cargo.toml @@ -15,4 +15,4 @@ heck = "0.5.0" [dev-dependencies] -dapi-grpc = { path = "../dapi-grpc" , features = ["client", "serde"], default-features = false} +dapi-grpc = { path = "../dapi-grpc" } diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index a3e1ee400b..613339d953 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -44,7 +44,7 @@ tracing = { version = "0.1.37", default-features = false, features = [] } clap = { version = "4.4.10", features = ["derive"] } envy = { version = "0.4.2" } dotenvy = { version = "0.15.7" } -dapi-grpc = { path = "../dapi-grpc", features = ["server"], default-features = false } +dapi-grpc = { path = "../dapi-grpc" } tracing-subscriber = { version = "0.3.16", default-features = false, features = [ "env-filter", "ansi", diff --git a/packages/rs-drive-abci/src/query/proofs/v0/mod.rs b/packages/rs-drive-abci/src/query/proofs/v0/mod.rs index 5e3ab97726..e1a2409e35 100644 --- a/packages/rs-drive-abci/src/query/proofs/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/proofs/v0/mod.rs @@ -90,7 +90,7 @@ impl Platform { }) .collect::, QueryError>>()); - let proof = self.drive.prove_multiple( + let proof = self.drive.prove_multiple_state_transition_results( &identity_requests, &contract_ids, &document_queries, diff --git a/packages/rs-drive-abci/src/query/service.rs b/packages/rs-drive-abci/src/query/service.rs index c4d47ed30c..15060e5fcf 100644 --- a/packages/rs-drive-abci/src/query/service.rs +++ b/packages/rs-drive-abci/src/query/service.rs @@ -20,10 +20,10 @@ use dapi_grpc::platform::v0::{ GetIdentityByPublicKeyHashResponse, GetIdentityContractNonceRequest, GetIdentityContractNonceResponse, GetIdentityKeysRequest, GetIdentityKeysResponse, GetIdentityNonceRequest, GetIdentityNonceResponse, GetIdentityRequest, GetIdentityResponse, - GetProofsRequest, GetProofsResponse, GetProtocolVersionUpgradeStateRequest, - GetProtocolVersionUpgradeStateResponse, GetProtocolVersionUpgradeVoteStatusRequest, - GetProtocolVersionUpgradeVoteStatusResponse, WaitForStateTransitionResultRequest, - WaitForStateTransitionResultResponse, + GetPathElementsRequest, GetPathElementsResponse, GetProofsRequest, GetProofsResponse, + GetProtocolVersionUpgradeStateRequest, GetProtocolVersionUpgradeStateResponse, + GetProtocolVersionUpgradeVoteStatusRequest, GetProtocolVersionUpgradeVoteStatusResponse, + WaitForStateTransitionResultRequest, WaitForStateTransitionResultResponse, }; use dapi_grpc::tonic::{Request, Response, Status}; use dpp::version::PlatformVersion; @@ -388,6 +388,18 @@ impl PlatformService for QueryService { ) .await } + + async fn get_path_elements( + &self, + request: Request, + ) -> Result, Status> { + self.handle_blocking_query( + request, + Platform::::query_path_elements, + "get_path_elements", + ) + .await + } } fn query_error_into_status(error: QueryError) -> Status { diff --git a/packages/rs-drive-abci/src/query/system/mod.rs b/packages/rs-drive-abci/src/query/system/mod.rs index 620d66c187..939d80f519 100644 --- a/packages/rs-drive-abci/src/query/system/mod.rs +++ b/packages/rs-drive-abci/src/query/system/mod.rs @@ -1,3 +1,4 @@ mod epoch_infos; +mod path_elements; mod version_upgrade_state; mod version_upgrade_vote_status; diff --git a/packages/rs-drive-abci/src/query/system/path_elements/mod.rs b/packages/rs-drive-abci/src/query/system/path_elements/mod.rs new file mode 100644 index 0000000000..1a91523602 --- /dev/null +++ b/packages/rs-drive-abci/src/query/system/path_elements/mod.rs @@ -0,0 +1,54 @@ +mod v0; + +use crate::error::query::QueryError; +use crate::error::Error; +use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; +use crate::query::QueryValidationResult; +use dapi_grpc::platform::v0::get_path_elements_request::Version as RequestVersion; +use dapi_grpc::platform::v0::get_path_elements_response::Version as ResponseVersion; +use dapi_grpc::platform::v0::{GetPathElementsRequest, GetPathElementsResponse}; +use dpp::version::PlatformVersion; + +impl Platform { + /// Querying of version upgrade state + pub fn query_path_elements( + &self, + GetPathElementsRequest { version }: GetPathElementsRequest, + platform_state: &PlatformState, + platform_version: &PlatformVersion, + ) -> Result, Error> { + let Some(version) = version else { + return Ok(QueryValidationResult::new_with_error( + QueryError::DecodingError("could not decode epoch info request".to_string()), + )); + }; + + let feature_version_bounds = &platform_version.drive_abci.query.system.path_elements; + + let feature_version = match &version { + RequestVersion::V0(_) => 0, + }; + if !feature_version_bounds.check_version(feature_version) { + return Ok(QueryValidationResult::new_with_error( + QueryError::UnsupportedQueryVersion( + "path_elements".to_string(), + feature_version_bounds.min_version, + feature_version_bounds.max_version, + platform_version.protocol_version, + feature_version, + ), + )); + } + match version { + RequestVersion::V0(request_v0) => { + let result = + self.query_path_elements_v0(request_v0, platform_state, platform_version)?; + + Ok(result.map(|response_v0| GetPathElementsResponse { + version: Some(ResponseVersion::V0(response_v0)), + })) + } + } + } +} diff --git a/packages/rs-drive-abci/src/query/system/path_elements/v0/mod.rs b/packages/rs-drive-abci/src/query/system/path_elements/v0/mod.rs new file mode 100644 index 0000000000..b917c3fc5c --- /dev/null +++ b/packages/rs-drive-abci/src/query/system/path_elements/v0/mod.rs @@ -0,0 +1,129 @@ +use crate::error::Error; +use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::v0::PlatformStateV0Methods; +use crate::query::QueryValidationResult; +use dapi_grpc::platform::v0::get_path_elements_request::GetPathElementsRequestV0; +use dapi_grpc::platform::v0::get_path_elements_response::get_path_elements_response_v0::Elements; +use dapi_grpc::platform::v0::get_path_elements_response::{ + get_path_elements_response_v0, GetPathElementsResponseV0, +}; +use dpp::block::extended_epoch_info::v0::ExtendedEpochInfoV0Getters; +use dpp::check_validation_result_with_data; + +use crate::error::query::QueryError; +use crate::platform_types::platform_state::PlatformState; +use dpp::validation::ValidationResult; +use dpp::version::PlatformVersion; +use drive::error::query::QuerySyntaxError; + +impl Platform { + pub(super) fn query_path_elements_v0( + &self, + GetPathElementsRequestV0 { path, keys, prove }: GetPathElementsRequestV0, + platform_state: &PlatformState, + platform_version: &PlatformVersion, + ) -> Result, Error> { + if keys.len() > platform_version.drive_abci.query.max_returned_elements as usize { + return Ok(QueryValidationResult::new_with_error(QueryError::Query( + QuerySyntaxError::InvalidLimit(format!( + "trying to get {} values, maximum is {}", + keys.len(), + platform_version.drive_abci.query.max_returned_elements + )), + ))); + } + let response = if prove { + let proof = check_validation_result_with_data!(self.drive.prove_elements( + path, + keys, + None, + platform_version + )); + + GetPathElementsResponseV0 { + result: Some(get_path_elements_response_v0::Result::Proof( + self.response_proof_v0(platform_state, proof), + )), + metadata: Some(self.response_metadata_v0(platform_state)), + } + } else { + let result = check_validation_result_with_data!(self.drive.fetch_elements( + path, + keys, + None, + platform_version + )); + + let serialized = result + .into_iter() + .map(|element| { + element + .serialize() + .map_err(|e| Error::Drive(drive::error::Error::GroveDB(e))) + }) + .collect::>, Error>>()?; + + GetPathElementsResponseV0 { + result: Some(get_path_elements_response_v0::Result::Elements(Elements { + elements: serialized, + })), + metadata: Some(self.response_metadata_v0(platform_state)), + } + }; + + Ok(QueryValidationResult::new_with_data(response)) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::query::tests::setup_platform; + use drive::drive::balances::TOTAL_SYSTEM_CREDITS_STORAGE_KEY; + use drive::drive::RootTree; + use drive::grovedb::Element; + use integer_encoding::VarInt; + + #[test] + fn test_query_total_system_credits_from_path_elements_query() { + let (platform, state, version) = setup_platform(); + + let platform_version = PlatformVersion::latest(); + + platform + .drive + .add_to_system_credits(100, None, platform_version) + .expect("expected to insert identity"); + + let request = GetPathElementsRequestV0 { + path: vec![vec![RootTree::Misc as u8]], + keys: vec![TOTAL_SYSTEM_CREDITS_STORAGE_KEY.to_vec()], + prove: false, + }; + + let response = platform + .query_path_elements_v0(request, &state, version) + .expect("expected query to succeed"); + + let response_data = response.into_data().expect("expected data"); + + let get_path_elements_response_v0::Result::Elements(mut elements) = + response_data.result.expect("expected a result") + else { + panic!("expected elements") + }; + + assert_eq!(elements.elements.len(), 1); + + let element = Element::deserialize(elements.elements.remove(0).as_slice()) + .expect("expected to deserialize element"); + + let Element::Item(value, _) = element else { + panic!("expected item") + }; + + let (amount, _) = u64::decode_var(value.as_slice()).expect("expected amount"); + + assert_eq!(amount, 100); + } +} diff --git a/packages/rs-drive-proof-verifier/Cargo.toml b/packages/rs-drive-proof-verifier/Cargo.toml index cc6bdb181c..e002887cc5 100644 --- a/packages/rs-drive-proof-verifier/Cargo.toml +++ b/packages/rs-drive-proof-verifier/Cargo.toml @@ -14,7 +14,7 @@ json = ["dep:serde_json"] [dependencies] thiserror = { version = "1.0.58" } -dapi-grpc = { path = "../dapi-grpc", features = ["core", "client", "serde"], default-features = false } +dapi-grpc = { path = "../dapi-grpc" } drive = { path = "../rs-drive", default-features = false, features = [ "verify", ] } diff --git a/packages/rs-drive-proof-verifier/src/proof.rs b/packages/rs-drive-proof-verifier/src/proof.rs index ee085aca69..4fc62fd12b 100644 --- a/packages/rs-drive-proof-verifier/src/proof.rs +++ b/packages/rs-drive-proof-verifier/src/proof.rs @@ -8,7 +8,8 @@ use dapi_grpc::platform::v0::{ get_epochs_info_request, get_identity_balance_and_revision_request, get_identity_balance_request, get_identity_by_public_key_hash_request, get_identity_contract_nonce_request, get_identity_keys_request, get_identity_nonce_request, - get_identity_request, GetProtocolVersionUpgradeStateRequest, + get_identity_request, get_path_elements_request, GetPathElementsRequest, + GetPathElementsResponse, GetProtocolVersionUpgradeStateRequest, GetProtocolVersionUpgradeStateResponse, GetProtocolVersionUpgradeVoteStatusRequest, GetProtocolVersionUpgradeVoteStatusResponse, ResponseMetadata, }; @@ -30,6 +31,7 @@ use drive::drive::identity::key::fetch::{ IdentityKeysRequest, KeyKindRequestType, KeyRequestType, PurposeU8, SecurityLevelU8, }; +use dapi_grpc::platform::v0::get_path_elements_request::GetPathElementsRequestV0; use dpp::block::block_info::BlockInfo; use drive::drive::Drive; use drive::error::proof::ProofError; @@ -1051,6 +1053,43 @@ impl FromProof for MasternodeProtoco Ok((Some(votes), mtd.clone())) } } + +impl FromProof for Elements { + type Request = GetPathElementsRequest; + type Response = GetPathElementsResponse; + + fn maybe_from_proof_with_metadata<'a, I: Into, O: Into>( + request: I, + response: O, + platform_version: &PlatformVersion, + provider: &'a dyn ContextProvider, + ) -> Result<(Option, ResponseMetadata), Error> + where + Self: Sized + 'a, + { + let request = request.into(); + let response: Self::Response = response.into(); + // Parse response to read proof and metadata + let proof = response.proof().or(Err(Error::NoProofInResult))?; + let mtd = response.metadata().or(Err(Error::EmptyResponseMetadata))?; + + let request_v0: GetPathElementsRequestV0 = match request.version { + Some(get_path_elements_request::Version::V0(v0)) => v0, + None => return Err(Error::EmptyVersion), + }; + + let path = request_v0.path; + let keys = request_v0.keys; + + let (root_hash, objects) = + Drive::verify_elements(&proof.grovedb_proof, path, keys, platform_version)?; + + verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + + Ok((Some(objects), mtd.clone())) + } +} + // #[cfg_attr(feature = "mocks", mockall::automock)] impl<'dq, Q> FromProof for Documents where diff --git a/packages/rs-drive-proof-verifier/src/types.rs b/packages/rs-drive-proof-verifier/src/types.rs index bc34c46d13..42b6f531c8 100644 --- a/packages/rs-drive-proof-verifier/src/types.rs +++ b/packages/rs-drive-proof-verifier/src/types.rs @@ -17,6 +17,7 @@ use dpp::{ prelude::{DataContract, Identifier, IdentityPublicKey, Revision}, util::deserializer::ProtocolVersion, }; +use drive::grovedb::Element; /// A data structure that holds a set of objects of a generic type `O`, indexed by a key of type `K`. /// @@ -44,6 +45,12 @@ pub type DataContractHistory = BTreeMap; /// If data contract is not found, it is represented as `None`. pub type DataContracts = RetrievedObjects; +/// Multiple grovedb elements. +/// +/// Mapping between the key id and associated elements. +/// If element is not found, it is represented as `None`. +pub type Elements = RetrievedObjects, Element>; + /// Identity balance. pub type IdentityBalance = u64; /// Identity balance and revision of the identity. diff --git a/packages/rs-drive/src/drive/balances/mod.rs b/packages/rs-drive/src/drive/balances/mod.rs index f8aecd48d4..0af010751e 100644 --- a/packages/rs-drive/src/drive/balances/mod.rs +++ b/packages/rs-drive/src/drive/balances/mod.rs @@ -21,11 +21,11 @@ mod calculate_total_credits_balance; use crate::drive::RootTree; /// Storage fee pool key -#[cfg(feature = "server")] +#[cfg(any(feature = "server", feature = "verify"))] pub const TOTAL_SYSTEM_CREDITS_STORAGE_KEY: &[u8; 1] = b"D"; /// The path for all the credits in the system -#[cfg(feature = "server")] +#[cfg(any(feature = "server", feature = "verify"))] pub fn total_credits_path() -> [&'static [u8]; 2] { [ Into::<&[u8; 1]>::into(RootTree::Misc), @@ -33,6 +33,15 @@ pub fn total_credits_path() -> [&'static [u8]; 2] { ] } +/// The path as a vec for all the credits in the system +#[cfg(any(feature = "server", feature = "verify"))] +pub fn total_credits_path_vec() -> Vec> { + vec![ + vec![RootTree::Misc as u8], + TOTAL_SYSTEM_CREDITS_STORAGE_KEY.to_vec(), + ] +} + /// The path for the balances tree #[cfg(any(feature = "server", feature = "verify"))] pub(crate) fn balance_path() -> [&'static [u8]; 1] { diff --git a/packages/rs-drive/src/drive/prove/mod.rs b/packages/rs-drive/src/drive/prove/mod.rs index 41d5a4b2ba..9ef8e6737b 100644 --- a/packages/rs-drive/src/drive/prove/mod.rs +++ b/packages/rs-drive/src/drive/prove/mod.rs @@ -1 +1,2 @@ -mod prove_multiple; +mod prove_elements; +mod prove_multiple_state_transition_results; diff --git a/packages/rs-drive/src/drive/prove/prove_elements/mod.rs b/packages/rs-drive/src/drive/prove/prove_elements/mod.rs new file mode 100644 index 0000000000..61897db0f3 --- /dev/null +++ b/packages/rs-drive/src/drive/prove/prove_elements/mod.rs @@ -0,0 +1,41 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; + +use dpp::version::PlatformVersion; +use grovedb::TransactionArg; + +impl Drive { + /// This function calls the versioned `prove_elements` + /// function based on the version provided in the `PlatformVersion` parameter. It panics if the + /// version doesn't match any existing versioned functions. + /// + /// # Parameters + /// - `path`: The path at which we want to prove the elements + /// - `keys`: The keys that we want to prove + /// - `transaction`: An optional grovedb transaction + /// - `platform_version`: A reference to the [PlatformVersion] object that specifies the version of + /// the function to call. + /// + /// # Returns + /// Returns a `Result` with a `Vec` containing the proof data if the function succeeds, + /// or an `Error` if the function fails. + pub fn prove_elements( + &self, + path: Vec>, + keys: Vec>, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result, Error> { + match platform_version.drive.methods.prove.prove_elements { + 0 => self.prove_elements_v0(path, keys, transaction, platform_version), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "prove_elements".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/prove/prove_elements/v0/mod.rs b/packages/rs-drive/src/drive/prove/prove_elements/v0/mod.rs new file mode 100644 index 0000000000..7f5bf1a7c4 --- /dev/null +++ b/packages/rs-drive/src/drive/prove/prove_elements/v0/mod.rs @@ -0,0 +1,46 @@ +use crate::drive::Drive; +use crate::error::Error; + +use dpp::version::PlatformVersion; +use grovedb::{PathQuery, Query, SizedQuery, TransactionArg}; + +impl Drive { + /// This function query requested identities, documents and contracts and provide cryptographic proofs + /// + /// # Parameters + /// - `path`: The path at which we want to prove the elements + /// - `keys`: The keys that we want to prove + /// - `transaction`: An optional grovedb transaction + /// - `platform_version`: A reference to the [PlatformVersion] object that specifies the version of + /// the function to call. + /// + /// # Returns + /// Returns a `Result` with a `Vec` containing the proof data if the function succeeds, + /// or an `Error` if the function fails. + #[inline(always)] + pub(super) fn prove_elements_v0( + &self, + path: Vec>, + keys: Vec>, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result, Error> { + let mut query = Query::default(); + query.insert_keys(keys); + let path_query = PathQuery { + path, + query: SizedQuery { + query, + limit: None, + offset: None, + }, + }; + self.grove_get_proved_path_query( + &path_query, + false, + transaction, + &mut vec![], + &platform_version.drive, + ) + } +} diff --git a/packages/rs-drive/src/drive/prove/prove_multiple/mod.rs b/packages/rs-drive/src/drive/prove/prove_multiple_state_transition_results/mod.rs similarity index 81% rename from packages/rs-drive/src/drive/prove/prove_multiple/mod.rs rename to packages/rs-drive/src/drive/prove/prove_multiple_state_transition_results/mod.rs index d814d4be8b..0840b1199e 100644 --- a/packages/rs-drive/src/drive/prove/prove_multiple/mod.rs +++ b/packages/rs-drive/src/drive/prove/prove_multiple_state_transition_results/mod.rs @@ -10,7 +10,7 @@ use grovedb::TransactionArg; mod v0; impl Drive { - /// This function calls the versioned `prove_multiple` + /// This function calls the versioned `prove_multiple_state_transition_results` /// function based on the version provided in the `DriveVersion` parameter. It panics if the /// version doesn't match any existing versioned functions. /// @@ -28,7 +28,7 @@ impl Drive { /// # Returns /// Returns a `Result` with a `Vec` containing the proof data if the function succeeds, /// or an `Error` if the function fails. - pub fn prove_multiple( + pub fn prove_multiple_state_transition_results( &self, identity_queries: &[IdentityDriveQuery], contract_ids: &[([u8; 32], Option)], //bool represents if it is historical @@ -36,8 +36,13 @@ impl Drive { transaction: TransactionArg, platform_version: &PlatformVersion, ) -> Result, Error> { - match platform_version.drive.methods.prove.prove_multiple { - 0 => self.prove_multiple_v0( + match platform_version + .drive + .methods + .prove + .prove_multiple_state_transition_results + { + 0 => self.prove_multiple_state_transition_results_v0( identity_queries, contract_ids, document_queries, @@ -45,7 +50,7 @@ impl Drive { platform_version, ), version => Err(Error::Drive(DriveError::UnknownVersionMismatch { - method: "prove_multiple".to_string(), + method: "prove_multiple_state_transition_results".to_string(), known_versions: vec![0], received: version, })), diff --git a/packages/rs-drive/src/drive/prove/prove_multiple/v0/mod.rs b/packages/rs-drive/src/drive/prove/prove_multiple_state_transition_results/v0/mod.rs similarity index 96% rename from packages/rs-drive/src/drive/prove/prove_multiple/v0/mod.rs rename to packages/rs-drive/src/drive/prove/prove_multiple_state_transition_results/v0/mod.rs index 21a2aae90c..f4267de0ea 100644 --- a/packages/rs-drive/src/drive/prove/prove_multiple/v0/mod.rs +++ b/packages/rs-drive/src/drive/prove/prove_multiple_state_transition_results/v0/mod.rs @@ -18,14 +18,14 @@ impl Drive { /// - `document_queries`: A list of [SingleDocumentDriveQuery]. These specify the documents /// to be proven. /// - `transaction`: An optional grovedb transaction - /// - `drive_version`: A reference to the [DriveVersion] object that specifies the version of + /// - `platform_version`: A reference to the [PlatformVersion] object that specifies the version of /// the function to call. /// /// # Returns /// Returns a `Result` with a `Vec` containing the proof data if the function succeeds, /// or an `Error` if the function fails. #[inline(always)] - pub(super) fn prove_multiple_v0( + pub(super) fn prove_multiple_state_transition_results_v0( &self, identity_queries: &[IdentityDriveQuery], contract_ids: &[([u8; 32], Option)], //bool is history diff --git a/packages/rs-drive/src/drive/system/fetch_elements/mod.rs b/packages/rs-drive/src/drive/system/fetch_elements/mod.rs new file mode 100644 index 0000000000..14969b2ea2 --- /dev/null +++ b/packages/rs-drive/src/drive/system/fetch_elements/mod.rs @@ -0,0 +1,41 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; + +use dpp::version::PlatformVersion; +use grovedb::{Element, TransactionArg}; + +impl Drive { + /// This function calls the versioned `fetch_elements` + /// function based on the version provided in the `PlatformVersion` parameter. It panics if the + /// version doesn't match any existing versioned functions. + /// + /// # Parameters + /// - `path`: The path at which we want to prove the elements + /// - `keys`: The keys that we want to prove + /// - `transaction`: An optional grovedb transaction + /// - `platform_version`: A reference to the [PlatformVersion] object that specifies the version of + /// the function to call. + /// + /// # Returns + /// Returns a `Result` with a `Vec` containing the proof data if the function succeeds, + /// or an `Error` if the function fails. + pub fn fetch_elements( + &self, + path: Vec>, + keys: Vec>, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result, Error> { + match platform_version.drive.methods.fetch.fetch_elements { + 0 => self.fetch_elements_v0(path, keys, transaction, platform_version), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "fetch_elements".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/system/fetch_elements/v0/mod.rs b/packages/rs-drive/src/drive/system/fetch_elements/v0/mod.rs new file mode 100644 index 0000000000..25ad7d4bba --- /dev/null +++ b/packages/rs-drive/src/drive/system/fetch_elements/v0/mod.rs @@ -0,0 +1,49 @@ +use crate::drive::Drive; +use crate::error::Error; + +use dpp::version::PlatformVersion; +use grovedb::query_result_type::QueryResultType::QueryElementResultType; +use grovedb::{Element, PathQuery, Query, SizedQuery, TransactionArg}; + +impl Drive { + /// This function fetches elements at keys at a specific path + /// + /// # Parameters + /// - `path`: The path at which we want to prove the elements + /// - `keys`: The keys that we want to prove + /// - `transaction`: An optional grovedb transaction + /// - `platform_version`: A reference to the [PlatformVersion] object that specifies the version of + /// the function to call. + /// + /// # Returns + /// Returns a `Result` with a `Vec` containing the proof data if the function succeeds, + /// or an `Error` if the function fails. + #[inline(always)] + pub(super) fn fetch_elements_v0( + &self, + path: Vec>, + keys: Vec>, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result, Error> { + let mut query = Query::default(); + query.insert_keys(keys); + let path_query = PathQuery { + path, + query: SizedQuery { + query, + limit: None, + offset: None, + }, + }; + let (result, _) = self.grove_get_path_query( + &path_query, + transaction, + QueryElementResultType, + &mut vec![], + &platform_version.drive, + )?; + + Ok(result.to_elements()) + } +} diff --git a/packages/rs-drive/src/drive/system/mod.rs b/packages/rs-drive/src/drive/system/mod.rs index 134ef7d68b..34b56c324d 100644 --- a/packages/rs-drive/src/drive/system/mod.rs +++ b/packages/rs-drive/src/drive/system/mod.rs @@ -1,4 +1,5 @@ mod estimation_costs; +mod fetch_elements; /// Genesis time module #[cfg(feature = "server")] pub mod genesis_time; diff --git a/packages/rs-drive/src/drive/verify/system/mod.rs b/packages/rs-drive/src/drive/verify/system/mod.rs index f9b5d16245..69dceb54a8 100644 --- a/packages/rs-drive/src/drive/verify/system/mod.rs +++ b/packages/rs-drive/src/drive/verify/system/mod.rs @@ -1,3 +1,4 @@ +mod verify_elements; mod verify_epoch_infos; mod verify_upgrade_state; mod verify_upgrade_vote_status; diff --git a/packages/rs-drive/src/drive/verify/system/verify_elements/mod.rs b/packages/rs-drive/src/drive/verify/system/verify_elements/mod.rs new file mode 100644 index 0000000000..71da98a59d --- /dev/null +++ b/packages/rs-drive/src/drive/verify/system/verify_elements/mod.rs @@ -0,0 +1,47 @@ +use crate::drive::verify::RootHash; +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use dpp::version::PlatformVersion; +use grovedb::Element; +use std::collections::BTreeMap; + +mod v0; + +impl Drive { + /// Verifies a proof containing potentially multiple epoch infos. + /// + /// # Parameters + /// + /// - `proof`: A byte slice representing the proof to be verified. + /// - `path`: The path where elements should be. + /// - `keys`: The requested keyes. + /// - `platform_version`: the platform version, + /// + /// # Returns + /// + /// Returns a `Result` with a tuple of `RootHash` and `Vec`. The `BTreeMap, Option>` + /// is the map of elements we get back. + /// + /// # Errors + /// + /// Returns an `Error` if: + /// + /// - The proof is corrupted. + /// - The GroveDb query fails. + pub fn verify_elements( + proof: &[u8], + path: Vec>, + keys: Vec>, + platform_version: &PlatformVersion, + ) -> Result<(RootHash, BTreeMap, Option>), Error> { + match platform_version.drive.methods.verify.system.verify_elements { + 0 => Drive::verify_elements_v0(proof, path, keys), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "verify_elements".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/verify/system/verify_elements/v0/mod.rs b/packages/rs-drive/src/drive/verify/system/verify_elements/v0/mod.rs new file mode 100644 index 0000000000..ed5a7e9030 --- /dev/null +++ b/packages/rs-drive/src/drive/verify/system/verify_elements/v0/mod.rs @@ -0,0 +1,49 @@ +use crate::drive::verify::RootHash; +use crate::drive::Drive; +use crate::error::Error; +use crate::query::Query; +use grovedb::query_result_type::PathKeyOptionalElementTrio; +use grovedb::{Element, GroveDb, PathQuery, SizedQuery}; +use std::collections::BTreeMap; + +impl Drive { + /// Verifies that the contract is included in the proof. + /// + /// # Parameters + /// + /// - `proof`: A byte slice representing the proof to be verified. + /// - `path`: The path where elements should be. + /// - `keys`: The requested keys. + /// + /// # Returns + /// + /// Returns a `Result` with a tuple of `RootHash` and `BTreeMap, Option>`. The `BTreeMap, Option>` + /// represent the elements we were trying to fetch. + /// + /// # Errors + /// + /// Returns an `Error` if: + /// + /// - The proof is corrupted. + /// - The GroveDb query fails. + #[inline(always)] + pub(super) fn verify_elements_v0( + proof: &[u8], + path: Vec>, + keys: Vec>, + ) -> Result<(RootHash, BTreeMap, Option>), Error> { + let mut query = Query::new(); + query.insert_keys(keys); + let path_query = PathQuery::new(path, SizedQuery::new(query, None, None)); + + let (root_hash, proved_path_key_values) = GroveDb::verify_query_raw(proof, &path_query)?; + let path_key_optional_elements = proved_path_key_values + .into_iter() + .map(|pkv| { + let key_element_pair: PathKeyOptionalElementTrio = pkv.try_into()?; + Ok((key_element_pair.1, key_element_pair.2)) + }) + .collect::, Option>, grovedb::Error>>()?; + Ok((root_hash, path_key_optional_elements)) + } +} diff --git a/packages/rs-drive/src/lib.rs b/packages/rs-drive/src/lib.rs index 2cc1863c52..3c40236a9a 100644 --- a/packages/rs-drive/src/lib.rs +++ b/packages/rs-drive/src/lib.rs @@ -30,7 +30,7 @@ pub mod query; #[cfg(feature = "server")] pub use dpp; /// GroveDB module -#[cfg(feature = "server")] +#[cfg(any(feature = "server", feature = "verify"))] pub use grovedb; #[cfg(feature = "server")] diff --git a/packages/rs-platform-version/src/version/drive_abci_versions.rs b/packages/rs-platform-version/src/version/drive_abci_versions.rs index b077c3e70b..a397a20c66 100644 --- a/packages/rs-platform-version/src/version/drive_abci_versions.rs +++ b/packages/rs-platform-version/src/version/drive_abci_versions.rs @@ -10,6 +10,7 @@ pub struct DriveAbciVersion { #[derive(Clone, Debug, Default)] pub struct DriveAbciQueryVersions { + pub max_returned_elements: u16, pub response_metadata: FeatureVersion, pub proofs_query: FeatureVersionBounds, pub document_query: FeatureVersionBounds, @@ -43,6 +44,7 @@ pub struct DriveAbciQuerySystemVersions { pub version_upgrade_state: FeatureVersionBounds, pub version_upgrade_vote_status: FeatureVersionBounds, pub epoch_infos: FeatureVersionBounds, + pub path_elements: FeatureVersionBounds, } #[derive(Clone, Debug, Default)] diff --git a/packages/rs-platform-version/src/version/drive_versions.rs b/packages/rs-platform-version/src/version/drive_versions.rs index cc98f61f58..bc985e87ef 100644 --- a/packages/rs-platform-version/src/version/drive_versions.rs +++ b/packages/rs-platform-version/src/version/drive_versions.rs @@ -29,6 +29,7 @@ pub struct DriveMethodVersions { pub platform_system: DrivePlatformSystemMethodVersions, pub operations: DriveOperationsMethodVersion, pub batch_operations: DriveBatchOperationsMethodVersion, + pub fetch: DriveFetchMethodVersions, pub prove: DriveProveMethodVersions, pub state_transitions: DriveStateTransitionMethodVersions, pub platform_state: DrivePlatformStateMethodVersions, @@ -56,9 +57,15 @@ pub struct DriveDataContractOperationMethodVersions { pub finalization_tasks: FeatureVersion, } +#[derive(Clone, Debug, Default)] +pub struct DriveFetchMethodVersions { + pub fetch_elements: FeatureVersion, +} + #[derive(Clone, Debug, Default)] pub struct DriveProveMethodVersions { - pub prove_multiple: FeatureVersion, + pub prove_elements: FeatureVersion, + pub prove_multiple_state_transition_results: FeatureVersion, } #[derive(Clone, Debug, Default)] @@ -101,6 +108,7 @@ pub struct DriveVerifyIdentityMethodVersions { #[derive(Clone, Debug, Default)] pub struct DriveVerifySystemMethodVersions { pub verify_epoch_infos: FeatureVersion, + pub verify_elements: FeatureVersion, pub verify_upgrade_state: FeatureVersion, pub verify_upgrade_vote_status: FeatureVersion, } diff --git a/packages/rs-platform-version/src/version/mocks/v2_test.rs b/packages/rs-platform-version/src/version/mocks/v2_test.rs index 5183a86507..18e6315f6e 100644 --- a/packages/rs-platform-version/src/version/mocks/v2_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v2_test.rs @@ -43,8 +43,8 @@ use crate::version::drive_versions::{ DriveDocumentIndexUniquenessMethodVersions, DriveDocumentInsertMethodVersions, DriveDocumentMethodVersions, DriveDocumentQueryMethodVersions, DriveDocumentUpdateMethodVersions, DriveEstimatedCostsMethodVersions, DriveFeesMethodVersions, - DriveGroveApplyMethodVersions, DriveGroveBasicMethodVersions, DriveGroveBatchMethodVersions, - DriveGroveCostMethodVersions, DriveGroveMethodVersions, + DriveFetchMethodVersions, DriveGroveApplyMethodVersions, DriveGroveBasicMethodVersions, + DriveGroveBatchMethodVersions, DriveGroveCostMethodVersions, DriveGroveMethodVersions, DriveIdentityContractInfoMethodVersions, DriveIdentityCostEstimationMethodVersions, DriveIdentityFetchAttributesMethodVersions, DriveIdentityFetchFullIdentityMethodVersions, DriveIdentityFetchMethodVersions, DriveIdentityFetchPartialIdentityMethodVersions, @@ -148,7 +148,10 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { remove_validators_proposed_app_versions: 0, update_validator_proposed_app_version: 0, }, - prove: DriveProveMethodVersions { prove_multiple: 0 }, + prove: DriveProveMethodVersions { + prove_elements: 0, + prove_multiple_state_transition_results: 0, + }, balances: DriveBalancesMethodVersions { add_to_system_credits: 0, add_to_system_credits_operations: 0, @@ -265,6 +268,7 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { }, system: DriveVerifySystemMethodVersions { verify_epoch_infos: 0, + verify_elements: 0, verify_upgrade_state: 0, verify_upgrade_vote_status: 0, }, @@ -428,6 +432,7 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { fetch_platform_state_bytes: 0, store_platform_state_bytes: 0, }, + fetch: DriveFetchMethodVersions { fetch_elements: 0 }, }, grove_methods: DriveGroveMethodVersions { basic: DriveGroveBasicMethodVersions { @@ -701,6 +706,7 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { }, }, query: DriveAbciQueryVersions { + max_returned_elements: 100, response_metadata: 0, proofs_query: FeatureVersionBounds { min_version: 0, @@ -792,6 +798,11 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { max_version: 0, default_current_version: 0, }, + path_elements: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, }, }, }, diff --git a/packages/rs-platform-version/src/version/mocks/v3_test.rs b/packages/rs-platform-version/src/version/mocks/v3_test.rs index df1885242a..f5e31dfb19 100644 --- a/packages/rs-platform-version/src/version/mocks/v3_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v3_test.rs @@ -43,8 +43,8 @@ use crate::version::drive_versions::{ DriveDocumentIndexUniquenessMethodVersions, DriveDocumentInsertMethodVersions, DriveDocumentMethodVersions, DriveDocumentQueryMethodVersions, DriveDocumentUpdateMethodVersions, DriveEstimatedCostsMethodVersions, DriveFeesMethodVersions, - DriveGroveApplyMethodVersions, DriveGroveBasicMethodVersions, DriveGroveBatchMethodVersions, - DriveGroveCostMethodVersions, DriveGroveMethodVersions, + DriveFetchMethodVersions, DriveGroveApplyMethodVersions, DriveGroveBasicMethodVersions, + DriveGroveBatchMethodVersions, DriveGroveCostMethodVersions, DriveGroveMethodVersions, DriveIdentityContractInfoMethodVersions, DriveIdentityCostEstimationMethodVersions, DriveIdentityFetchAttributesMethodVersions, DriveIdentityFetchFullIdentityMethodVersions, DriveIdentityFetchMethodVersions, DriveIdentityFetchPartialIdentityMethodVersions, @@ -148,7 +148,10 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { remove_validators_proposed_app_versions: 0, update_validator_proposed_app_version: 0, }, - prove: DriveProveMethodVersions { prove_multiple: 0 }, + prove: DriveProveMethodVersions { + prove_elements: 0, + prove_multiple_state_transition_results: 0, + }, balances: DriveBalancesMethodVersions { add_to_system_credits: 0, add_to_system_credits_operations: 0, @@ -273,6 +276,7 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { }, system: DriveVerifySystemMethodVersions { verify_epoch_infos: 0, + verify_elements: 0, verify_upgrade_state: 0, verify_upgrade_vote_status: 0, }, @@ -428,6 +432,7 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { fetch_platform_state_bytes: 0, store_platform_state_bytes: 0, }, + fetch: DriveFetchMethodVersions { fetch_elements: 0 }, }, grove_methods: DriveGroveMethodVersions { basic: DriveGroveBasicMethodVersions { @@ -701,6 +706,7 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { }, }, query: DriveAbciQueryVersions { + max_returned_elements: 100, response_metadata: 0, proofs_query: FeatureVersionBounds { min_version: 0, @@ -792,6 +798,11 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { max_version: 0, default_current_version: 0, }, + path_elements: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, }, }, }, diff --git a/packages/rs-platform-version/src/version/v1.rs b/packages/rs-platform-version/src/version/v1.rs index 037424b976..9f3f64a369 100644 --- a/packages/rs-platform-version/src/version/v1.rs +++ b/packages/rs-platform-version/src/version/v1.rs @@ -43,8 +43,8 @@ use crate::version::drive_versions::{ DriveDocumentIndexUniquenessMethodVersions, DriveDocumentInsertMethodVersions, DriveDocumentMethodVersions, DriveDocumentQueryMethodVersions, DriveDocumentUpdateMethodVersions, DriveEstimatedCostsMethodVersions, DriveFeesMethodVersions, - DriveGroveApplyMethodVersions, DriveGroveBasicMethodVersions, DriveGroveBatchMethodVersions, - DriveGroveCostMethodVersions, DriveGroveMethodVersions, + DriveFetchMethodVersions, DriveGroveApplyMethodVersions, DriveGroveBasicMethodVersions, + DriveGroveBatchMethodVersions, DriveGroveCostMethodVersions, DriveGroveMethodVersions, DriveIdentityContractInfoMethodVersions, DriveIdentityCostEstimationMethodVersions, DriveIdentityFetchAttributesMethodVersions, DriveIdentityFetchFullIdentityMethodVersions, DriveIdentityFetchMethodVersions, DriveIdentityFetchPartialIdentityMethodVersions, @@ -147,7 +147,10 @@ pub const PLATFORM_V1: PlatformVersion = PlatformVersion { remove_validators_proposed_app_versions: 0, update_validator_proposed_app_version: 0, }, - prove: DriveProveMethodVersions { prove_multiple: 0 }, + prove: DriveProveMethodVersions { + prove_elements: 0, + prove_multiple_state_transition_results: 0, + }, balances: DriveBalancesMethodVersions { add_to_system_credits: 0, add_to_system_credits_operations: 0, @@ -264,6 +267,7 @@ pub const PLATFORM_V1: PlatformVersion = PlatformVersion { }, system: DriveVerifySystemMethodVersions { verify_epoch_infos: 0, + verify_elements: 0, verify_upgrade_state: 0, verify_upgrade_vote_status: 0, }, @@ -427,6 +431,7 @@ pub const PLATFORM_V1: PlatformVersion = PlatformVersion { fetch_platform_state_bytes: 0, store_platform_state_bytes: 0, }, + fetch: DriveFetchMethodVersions { fetch_elements: 0 }, }, grove_methods: DriveGroveMethodVersions { basic: DriveGroveBasicMethodVersions { @@ -700,6 +705,7 @@ pub const PLATFORM_V1: PlatformVersion = PlatformVersion { }, }, query: DriveAbciQueryVersions { + max_returned_elements: 100, response_metadata: 0, proofs_query: FeatureVersionBounds { min_version: 0, @@ -791,6 +797,11 @@ pub const PLATFORM_V1: PlatformVersion = PlatformVersion { max_version: 0, default_current_version: 0, }, + path_elements: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, }, }, }, diff --git a/packages/rs-sdk/Cargo.toml b/packages/rs-sdk/Cargo.toml index a53f04d30e..a689df0578 100644 --- a/packages/rs-sdk/Cargo.toml +++ b/packages/rs-sdk/Cargo.toml @@ -7,9 +7,7 @@ edition = "2021" dpp = { path = "../rs-dpp", default-features = false, features = [ "dash-sdk-features", ] } -dapi-grpc = { path = "../dapi-grpc", default-features = false, features = [ - "client", -] } +dapi-grpc = { path = "../dapi-grpc" } rs-dapi-client = { path = "../rs-dapi-client", default-features = false } drive = { path = "../rs-drive", default-features = false, features = [ "verify", diff --git a/packages/strategy-tests/src/lib.rs b/packages/strategy-tests/src/lib.rs index 10057af099..d52dc2c304 100644 --- a/packages/strategy-tests/src/lib.rs +++ b/packages/strategy-tests/src/lib.rs @@ -75,7 +75,7 @@ pub type KeyMaps = BTreeMap>>; /// /// # Fields /// - `start_identities`: Specifies identities to be established at the simulation's outset, including their initial attributes and balances. This setup allows for immediate participation of these identities in the blockchain's simulated activities. -/// +/// /// - `start_contracts`: Maps each created data contract to potential updates, enabling the simulation of contract evolution. Each tuple consists of a `CreatedDataContract` and an optional mapping of block heights to subsequent contract versions, facilitating time-sensitive contract transformations. /// /// - `operations`: Enumerates discrete operations to be executed within the strategy. These operations represent individual actions or sequences of actions, such as document manipulations, identity updates, or contract interactions, each contributing to the overarching simulation narrative. @@ -1442,7 +1442,7 @@ impl Strategy { ) .expect("Expected to get identity public key in initial_contract_state_transitions"); let key_id = identity_public_key.id(); - + let partial_identity = identity.clone().into_partial_identity_info(); let partial_identity_public_key = partial_identity.loaded_public_keys.values() .find(|&public_key| public_key.id() == key_id) From 56a4d88d94a2990f685dd90dbd54626c8457fa44 Mon Sep 17 00:00:00 2001 From: lklimek <842586+lklimek@users.noreply.github.com> Date: Tue, 16 Apr 2024 09:11:56 +0200 Subject: [PATCH 135/191] fix(sdk): dapi client pool should separate platform and core clients (#1818) --- Cargo.lock | 86 +++++++++++++++++++ packages/dapi-grpc/Cargo.toml | 11 ++- .../rs-dapi-client/src/connection_pool.rs | 76 ++++++++++++++-- packages/rs-dapi-client/src/transport/grpc.rs | 10 +-- 4 files changed, 169 insertions(+), 14 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ec6310bd24..38fe682e6d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -855,6 +855,16 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.6" @@ -2863,6 +2873,12 @@ version = "11.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + [[package]] name = "overload" version = "0.1.1" @@ -3687,6 +3703,29 @@ dependencies = [ "zeroize", ] +[[package]] +name = "rustls-native-certs" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792" +dependencies = [ + "openssl-probe", + "rustls-pemfile", + "rustls-pki-types", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" +dependencies = [ + "base64 0.22.0", + "rustls-pki-types", +] + [[package]] name = "rustls-pki-types" version = "1.4.1" @@ -3735,6 +3774,15 @@ dependencies = [ "regex", ] +[[package]] +name = "schannel" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +dependencies = [ + "windows-sys 0.52.0", +] + [[package]] name = "scheduled-thread-pool" version = "0.2.7" @@ -3777,6 +3825,29 @@ dependencies = [ "cc", ] +[[package]] +name = "security-framework" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "770452e37cad93e0a50d5abc3990d2bc351c36d0328f86cefec2f2fb206eaef6" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f3cc463c0ef97e11c3461a9d3787412d30e8e7eb907c79180c4a57bf7c04ef" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "semver" version = "1.0.22" @@ -4457,6 +4528,17 @@ dependencies = [ "syn 2.0.58", ] +[[package]] +name = "tokio-rustls" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" +dependencies = [ + "rustls", + "rustls-pki-types", + "tokio", +] + [[package]] name = "tokio-stream" version = "0.1.15" @@ -4597,7 +4679,11 @@ dependencies = [ "percent-encoding", "pin-project", "prost 0.12.4", + "rustls-native-certs", + "rustls-pemfile", + "rustls-pki-types", "tokio", + "tokio-rustls", "tokio-stream", "tower", "tower-layer", diff --git a/packages/dapi-grpc/Cargo.toml b/packages/dapi-grpc/Cargo.toml index bbdc747f4d..7b2eb61182 100644 --- a/packages/dapi-grpc/Cargo.toml +++ b/packages/dapi-grpc/Cargo.toml @@ -21,8 +21,15 @@ default = ["core", "platform", "client", "serde", "server"] core = [] platform = [] # Re-export Dash Platform protobuf types as `dapi_grpc::platform::proto` +# Note: client needs tls and tls-roots to connect to testnet which uses TLS. tenderdash-proto = [] -client = ["tonic/channel", "tonic/transport", "platform"] +client = [ + "tonic/channel", + "tonic/transport", + "tonic/tls", + "tonic/tls-roots", + "platform", +] server = ["tonic/channel", "tonic/transport", "platform"] serde = ["dep:serde", "dep:serde_bytes"] mocks = ["dep:serde_json"] @@ -56,4 +63,4 @@ name = "platform_example" path = "clients/platform/v0/rust/platform_example.rs" [package.metadata.cargo-machete] -ignored = ["platform-version", "serde_bytes", "futures-core"] \ No newline at end of file +ignored = ["platform-version", "serde_bytes", "futures-core"] diff --git a/packages/rs-dapi-client/src/connection_pool.rs b/packages/rs-dapi-client/src/connection_pool.rs index 49216e3865..5bd5549be5 100644 --- a/packages/rs-dapi-client/src/connection_pool.rs +++ b/packages/rs-dapi-client/src/connection_pool.rs @@ -1,4 +1,7 @@ -use std::sync::{Arc, Mutex}; +use std::{ + fmt::Display, + sync::{Arc, Mutex}, +}; use http::Uri; use lru::LruCache; @@ -41,21 +44,37 @@ impl Default for ConnectionPool { impl ConnectionPool { /// Get item from the pool for the given uri and settings. - pub fn get(&self, uri: &Uri, settings: Option<&AppliedRequestSettings>) -> Option { - let key = format!("{}{:?}", uri, settings); + /// + /// # Arguments + /// * `prefix` - Prefix for the item in the pool. Used to distinguish between Core and Platform clients. + /// * `uri` - URI of the node. + /// * `settings` - Applied request settings. + pub fn get( + &self, + prefix: PoolPrefix, + uri: &Uri, + settings: Option<&AppliedRequestSettings>, + ) -> Option { + let key = Self::key(prefix, uri, settings); self.inner.lock().expect("must lock").get(&key).cloned() } /// Get value from cache or create it using provided closure. /// If value is already in the cache, it will be returned. /// If value is not in the cache, it will be created by calling `create()` and stored in the cache. + /// + /// # Arguments + /// * `prefix` - Prefix for the item in the pool. Used to distinguish between Core and Platform clients. + /// * `uri` - URI of the node. + /// * `settings` - Applied request settings. pub fn get_or_create( &self, + prefix: PoolPrefix, uri: &Uri, settings: Option<&AppliedRequestSettings>, create: impl FnOnce() -> PoolItem, ) -> PoolItem { - if let Some(cli) = self.get(uri, settings) { + if let Some(cli) = self.get(prefix, uri, settings) { return cli; } @@ -66,9 +85,18 @@ impl ConnectionPool { /// Put item into the pool for the given uri and settings. pub fn put(&self, uri: &Uri, settings: Option<&AppliedRequestSettings>, value: PoolItem) { - let key = format!("{}{:?}", uri, settings); + let key = Self::key(&value, uri, settings); self.inner.lock().expect("must lock").put(key, value); } + + fn key>( + class: C, + uri: &Uri, + settings: Option<&AppliedRequestSettings>, + ) -> String { + let prefix: PoolPrefix = class.into(); + format!("{}:{}{:?}", prefix, uri, settings) + } } /// Item stored in the pool. @@ -95,7 +123,13 @@ impl From for PlatformGrpcClient { fn from(client: PoolItem) -> Self { match client { PoolItem::Platform(client) => client, - _ => panic!("ClientType is not Platform: {:?}", client), + _ => { + tracing::error!( + ?client, + "invalid connection fetched from pool: expected platform client" + ); + panic!("ClientType is not Platform: {:?}", client) + } } } } @@ -104,7 +138,35 @@ impl From for CoreGrpcClient { fn from(client: PoolItem) -> Self { match client { PoolItem::Core(client) => client, - _ => panic!("ClientType is not Core: {:?}", client), + _ => { + tracing::error!( + ?client, + "invalid connection fetched from pool: expected core client" + ); + panic!("ClientType is not Core: {:?}", client) + } + } + } +} + +/// Prefix for the item in the pool. Used to distinguish between Core and Platform clients. +pub enum PoolPrefix { + Core, + Platform, +} +impl Display for PoolPrefix { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + PoolPrefix::Core => write!(f, "Core"), + PoolPrefix::Platform => write!(f, "Platform"), + } + } +} +impl From<&PoolItem> for PoolPrefix { + fn from(item: &PoolItem) -> Self { + match item { + PoolItem::Core(_) => PoolPrefix::Core, + PoolItem::Platform(_) => PoolPrefix::Platform, } } } diff --git a/packages/rs-dapi-client/src/transport/grpc.rs b/packages/rs-dapi-client/src/transport/grpc.rs index eb685303a4..76ee80eac0 100644 --- a/packages/rs-dapi-client/src/transport/grpc.rs +++ b/packages/rs-dapi-client/src/transport/grpc.rs @@ -3,7 +3,7 @@ use std::time::Duration; use super::{CanRetry, TransportClient, TransportRequest}; -use crate::connection_pool::ConnectionPool; +use crate::connection_pool::{ConnectionPool, PoolPrefix}; use crate::{request_settings::AppliedRequestSettings, RequestSettings}; use dapi_grpc::core::v0::core_client::CoreClient; use dapi_grpc::core::v0::{self as core_proto}; @@ -34,7 +34,7 @@ impl TransportClient for PlatformGrpcClient { type Error = dapi_grpc::tonic::Status; fn with_uri(uri: Uri, pool: &ConnectionPool) -> Self { - pool.get_or_create(&uri, None, || { + pool.get_or_create(PoolPrefix::Platform, &uri, None, || { Self::new(create_channel(uri.clone(), None)).into() }) .into() @@ -45,7 +45,7 @@ impl TransportClient for PlatformGrpcClient { settings: &AppliedRequestSettings, pool: &ConnectionPool, ) -> Self { - pool.get_or_create(&uri, Some(settings), || { + pool.get_or_create(PoolPrefix::Platform, &uri, Some(settings), || { Self::new(create_channel(uri.clone(), Some(settings))).into() }) .into() @@ -56,7 +56,7 @@ impl TransportClient for CoreGrpcClient { type Error = dapi_grpc::tonic::Status; fn with_uri(uri: Uri, pool: &ConnectionPool) -> Self { - pool.get_or_create(&uri, None, || { + pool.get_or_create(PoolPrefix::Core, &uri, None, || { Self::new(create_channel(uri.clone(), None)).into() }) .into() @@ -67,7 +67,7 @@ impl TransportClient for CoreGrpcClient { settings: &AppliedRequestSettings, pool: &ConnectionPool, ) -> Self { - pool.get_or_create(&uri, Some(settings), || { + pool.get_or_create(PoolPrefix::Core, &uri, Some(settings), || { Self::new(create_channel(uri.clone(), Some(settings))).into() }) .into() From fa72ffeea8c247eabbc08f581716fe15c61d06de Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Tue, 16 Apr 2024 17:05:59 +0700 Subject: [PATCH 136/191] feat(platform)!: identity create replay protection (#1819) --- packages/rs-dpp/src/asset_lock/mod.rs | 2 + .../reduced_asset_lock_value/mod.rs | 21 + .../reduced_asset_lock_value/v0/mod.rs | 10 + packages/rs-dpp/src/balances/credits.rs | 3 + .../src/errors/consensus/basic/basic_error.rs | 5 +- ...sset_lock_state_transition_replay_error.rs | 56 + .../errors/consensus/basic/identity/mod.rs | 2 + .../src/errors/consensus/basic/value_error.rs | 4 + packages/rs-dpp/src/errors/consensus/codes.rs | 1 + .../src/state_transition/serialization.rs | 4 +- .../identity_create_transition/methods/mod.rs | 4 + .../methods/v0/mod.rs | 3 + .../v0/v0_methods.rs | 8 +- .../state_transition/state_transitions/mod.rs | 1 + .../signable_bytes_hasher.rs | 48 + .../identity_create_transition_fixture.rs | 2 +- .../identity_topup_transition_fixture.rs | 2 +- .../instant_asset_lock_proof_fixture.rs | 12 +- .../src/execution/check_tx/v0/mod.rs | 125 +- .../mod.rs | 2 - .../v0/mod.rs | 2 - .../process_block_fees/mod.rs | 2 - .../check_tx_verification/v0/mod.rs | 5 + .../asset_lock/proof/validate/chain/mod.rs | 3 + .../asset_lock/proof/validate/instant/mod.rs | 3 + .../common/asset_lock/proof/validate/mod.rs | 5 + .../proof/verify_is_not_spent/chain/mod.rs | 3 + .../proof/verify_is_not_spent/instant/mod.rs | 3 + .../proof/verify_is_not_spent/mod.rs | 7 + .../proof/verify_is_not_spent/v0/mod.rs | 16 + .../data_contract_update/state/v0/mod.rs | 4 +- .../state_transitions/identity_create/mod.rs | 1021 +++++++++++++++++ .../identity_create/state/v0/mod.rs | 23 +- .../state_transitions/identity_top_up/mod.rs | 145 +++ .../transform_into_action/v0/mod.rs | 13 +- .../tests/strategy_tests/main.rs | 4 +- .../system/partially_use_asset_lock.rs | 19 +- .../identity/identity_create/transformer.rs | 5 + .../identity/identity_create/v0/mod.rs | 3 + .../identity_create/v0/transformer.rs | 5 + .../identity/identity_topup/transformer.rs | 24 +- .../identity/identity_topup/v0/mod.rs | 3 + .../identity/identity_topup/v0/transformer.rs | 5 + .../partially_use_asset_lock_action/mod.rs | 8 +- .../transformer.rs | 38 + .../partially_use_asset_lock_action/v0/mod.rs | 7 +- .../v0/transformer.rs | 52 +- .../src/version/drive_abci_versions.rs | 2 + .../src/version/mocks/v2_test.rs | 8 +- .../src/version/mocks/v3_test.rs | 8 +- .../rs-platform-version/src/version/v1.rs | 8 +- .../platform/transition/broadcast_identity.rs | 1 + packages/strategy-tests/src/transitions.rs | 2 + ...sset_lock_state_transition_replay_error.rs | 47 + .../errors/consensus/basic/identity/mod.rs | 2 + .../src/errors/consensus/consensus_error.rs | 6 +- 56 files changed, 1743 insertions(+), 84 deletions(-) create mode 100644 packages/rs-dpp/src/errors/consensus/basic/identity/identity_asset_lock_state_transition_replay_error.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/signable_bytes_hasher.rs create mode 100644 packages/wasm-dpp/src/errors/consensus/basic/identity/identity_asset_lock_state_transition_replay_error.rs diff --git a/packages/rs-dpp/src/asset_lock/mod.rs b/packages/rs-dpp/src/asset_lock/mod.rs index 6d1e738cf8..5133348df5 100644 --- a/packages/rs-dpp/src/asset_lock/mod.rs +++ b/packages/rs-dpp/src/asset_lock/mod.rs @@ -2,6 +2,8 @@ use crate::asset_lock::reduced_asset_lock_value::AssetLockValue; pub mod reduced_asset_lock_value; +pub type PastAssetLockStateTransitionHashes = Vec>; + /// An enumeration of the possible states when querying platform to get the stored state of an outpoint /// representing if the asset lock was already used or not. pub enum StoredAssetLockInfo { diff --git a/packages/rs-dpp/src/asset_lock/reduced_asset_lock_value/mod.rs b/packages/rs-dpp/src/asset_lock/reduced_asset_lock_value/mod.rs index f7a93b4507..5b18311013 100644 --- a/packages/rs-dpp/src/asset_lock/reduced_asset_lock_value/mod.rs +++ b/packages/rs-dpp/src/asset_lock/reduced_asset_lock_value/mod.rs @@ -4,6 +4,7 @@ use crate::ProtocolError; use bincode::{Decode, Encode}; use derive_more::From; use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use platform_value::Bytes32; use platform_version::version::PlatformVersion; mod v0; @@ -21,6 +22,7 @@ impl AssetLockValue { initial_credit_value: Credits, tx_out_script: Vec, remaining_credit_value: Credits, + used_tags: Vec, platform_version: &PlatformVersion, ) -> Result { match platform_version @@ -33,6 +35,7 @@ impl AssetLockValue { initial_credit_value, tx_out_script, remaining_credit_value, + used_tags, })), version => Err(ProtocolError::UnknownVersionMismatch { method: "ReducedAssetLockValue::new".to_string(), @@ -67,6 +70,12 @@ impl AssetLockValueGettersV0 for AssetLockValue { AssetLockValue::V0(v0) => v0.remaining_credit_value, } } + + fn used_tags_ref(&self) -> &Vec { + match self { + AssetLockValue::V0(v0) => &v0.used_tags, + } + } } impl AssetLockValueSettersV0 for AssetLockValue { @@ -87,4 +96,16 @@ impl AssetLockValueSettersV0 for AssetLockValue { AssetLockValue::V0(v0) => v0.remaining_credit_value = value, } } + + fn set_used_tags(&mut self, tags: Vec) { + match self { + AssetLockValue::V0(v0) => v0.used_tags = tags, + } + } + + fn add_used_tag(&mut self, tag: Bytes32) { + match self { + AssetLockValue::V0(v0) => v0.used_tags.push(tag), + } + } } diff --git a/packages/rs-dpp/src/asset_lock/reduced_asset_lock_value/v0/mod.rs b/packages/rs-dpp/src/asset_lock/reduced_asset_lock_value/v0/mod.rs index e3c1f4a588..bc733e03f4 100644 --- a/packages/rs-dpp/src/asset_lock/reduced_asset_lock_value/v0/mod.rs +++ b/packages/rs-dpp/src/asset_lock/reduced_asset_lock_value/v0/mod.rs @@ -1,11 +1,16 @@ use crate::fee::Credits; use bincode::{Decode, Encode}; +use platform_value::Bytes32; #[derive(Debug, Clone, Encode, Decode, PartialEq)] pub struct AssetLockValueV0 { pub(super) initial_credit_value: Credits, pub(super) tx_out_script: Vec, pub(super) remaining_credit_value: Credits, + /// The used tags can represent any token of that we want to say has been used + /// In practice for Platform this means that we are storing the asset lock transactions + /// to prevent replay attacks. + pub(super) used_tags: Vec, } pub trait AssetLockValueGettersV0 { @@ -14,10 +19,15 @@ pub trait AssetLockValueGettersV0 { fn tx_out_script_owned(self) -> Vec; fn remaining_credit_value(&self) -> Credits; + + fn used_tags_ref(&self) -> &Vec; } pub trait AssetLockValueSettersV0 { fn set_initial_credit_value(&mut self, value: Credits); fn set_tx_out_script(&mut self, value: Vec); fn set_remaining_credit_value(&mut self, value: Credits); + + fn set_used_tags(&mut self, tags: Vec); + fn add_used_tag(&mut self, tag: Bytes32); } diff --git a/packages/rs-dpp/src/balances/credits.rs b/packages/rs-dpp/src/balances/credits.rs index e9568bec74..d0f9e2805b 100644 --- a/packages/rs-dpp/src/balances/credits.rs +++ b/packages/rs-dpp/src/balances/credits.rs @@ -12,6 +12,9 @@ use crate::ProtocolError; use integer_encoding::VarInt; use std::convert::TryFrom; +/// Duffs type +pub type Duffs = u64; + /// Credits type pub type Credits = u64; diff --git a/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs b/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs index 13acb07129..18eed15035 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs @@ -33,7 +33,7 @@ use crate::consensus::basic::identity::{ DataContractBoundsNotPresentError, DisablingKeyIdAlsoBeingAddedInSameTransitionError, DuplicatedIdentityPublicKeyBasicError, DuplicatedIdentityPublicKeyIdBasicError, IdentityAssetLockProofLockedTransactionMismatchError, - IdentityAssetLockTransactionIsNotFoundError, + IdentityAssetLockStateTransitionReplayError, IdentityAssetLockTransactionIsNotFoundError, IdentityAssetLockTransactionOutPointAlreadyConsumedError, IdentityAssetLockTransactionOutPointNotEnoughBalanceError, IdentityAssetLockTransactionOutputNotFoundError, IdentityCreditTransferToSelfError, @@ -252,6 +252,9 @@ pub enum BasicError { IdentityAssetLockTransactionOutPointNotEnoughBalanceError, ), + #[error(transparent)] + IdentityAssetLockStateTransitionReplayError(IdentityAssetLockStateTransitionReplayError), + #[error(transparent)] IdentityAssetLockTransactionOutputNotFoundError( IdentityAssetLockTransactionOutputNotFoundError, diff --git a/packages/rs-dpp/src/errors/consensus/basic/identity/identity_asset_lock_state_transition_replay_error.rs b/packages/rs-dpp/src/errors/consensus/basic/identity/identity_asset_lock_state_transition_replay_error.rs new file mode 100644 index 0000000000..8c1e8ab940 --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/basic/identity/identity_asset_lock_state_transition_replay_error.rs @@ -0,0 +1,56 @@ +use crate::consensus::basic::BasicError; +use crate::consensus::ConsensusError; +use crate::errors::ProtocolError; +use bincode::{Decode, Encode}; +use dashcore::Txid; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use platform_value::Bytes32; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error("Asset lock transaction {transaction_id} is trying to be replayed and will be discarded")] +#[platform_serialize(unversioned)] +pub struct IdentityAssetLockStateTransitionReplayError { + /* + + DO NOT CHANGE ORDER OF FIELDS WITHOUT INTRODUCING OF NEW VERSION + + */ + #[platform_serialize(with_serde)] + #[bincode(with_serde)] + transaction_id: Txid, + + output_index: usize, + + state_transition_id: Bytes32, +} + +impl IdentityAssetLockStateTransitionReplayError { + pub fn new(transaction_id: Txid, output_index: usize, state_transition_id: Bytes32) -> Self { + Self { + transaction_id, + output_index, + state_transition_id, + } + } + + pub fn transaction_id(&self) -> Txid { + self.transaction_id + } + + pub fn state_transition_id(&self) -> Bytes32 { + self.state_transition_id + } + + pub fn output_index(&self) -> usize { + self.output_index + } +} + +impl From for ConsensusError { + fn from(err: IdentityAssetLockStateTransitionReplayError) -> Self { + Self::BasicError(BasicError::IdentityAssetLockStateTransitionReplayError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/basic/identity/mod.rs b/packages/rs-dpp/src/errors/consensus/basic/identity/mod.rs index 4b5ec01a34..aafc111b85 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/identity/mod.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/identity/mod.rs @@ -3,6 +3,7 @@ pub use disabling_key_id_also_being_added_in_same_transition_error::*; pub use duplicated_identity_public_key_basic_error::*; pub use duplicated_identity_public_key_id_basic_error::*; pub use identity_asset_lock_proof_locked_transaction_mismatch_error::*; +pub use identity_asset_lock_state_transition_replay_error::*; pub use identity_asset_lock_transaction_is_not_found_error::*; pub use identity_asset_lock_transaction_out_point_already_consumed_error::*; pub use identity_asset_lock_transaction_out_point_not_enough_balance_error::*; @@ -37,6 +38,7 @@ mod identity_asset_lock_proof_locked_transaction_mismatch_error; mod identity_asset_lock_transaction_is_not_found_error; mod identity_asset_lock_transaction_out_point_already_consumed_error; +mod identity_asset_lock_state_transition_replay_error; mod identity_asset_lock_transaction_out_point_not_enough_balance_error; mod identity_asset_lock_transaction_output_not_found_error; mod identity_credit_transfer_to_self_error; diff --git a/packages/rs-dpp/src/errors/consensus/basic/value_error.rs b/packages/rs-dpp/src/errors/consensus/basic/value_error.rs index 3c7c6550fa..83f1b85cdb 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/value_error.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/value_error.rs @@ -27,6 +27,10 @@ impl ValueError { } } + pub fn new_from_string(value_error: String) -> Self { + Self { value_error } + } + pub fn value_error(&self) -> &str { &self.value_error } diff --git a/packages/rs-dpp/src/errors/consensus/codes.rs b/packages/rs-dpp/src/errors/consensus/codes.rs index 92a6187aa7..f585a5ecdd 100644 --- a/packages/rs-dpp/src/errors/consensus/codes.rs +++ b/packages/rs-dpp/src/errors/consensus/codes.rs @@ -141,6 +141,7 @@ impl ErrorWithCode for BasicError { Self::IdentityCreditTransferToSelfError(_) => 10528, Self::MasterPublicKeyUpdateError(_) => 10529, Self::IdentityAssetLockTransactionOutPointNotEnoughBalanceError(_) => 10530, + Self::IdentityAssetLockStateTransitionReplayError(_) => 10531, // State Transition Errors: 10600-10699 Self::InvalidStateTransitionTypeError { .. } => 10600, diff --git a/packages/rs-dpp/src/state_transition/serialization.rs b/packages/rs-dpp/src/state_transition/serialization.rs index 219de5401c..c36ae53db4 100644 --- a/packages/rs-dpp/src/state_transition/serialization.rs +++ b/packages/rs-dpp/src/state_transition/serialization.rs @@ -58,7 +58,7 @@ mod tests { let platform_version = LATEST_PLATFORM_VERSION; let identity = Identity::random_identity(5, Some(5), platform_version) .expect("expected a random identity"); - let asset_lock_proof = raw_instant_asset_lock_proof_fixture(None); + let asset_lock_proof = raw_instant_asset_lock_proof_fixture(None, None); let identity_create_transition = IdentityCreateTransition::V0( IdentityCreateTransitionV0::try_from_identity( @@ -84,7 +84,7 @@ mod tests { let platform_version = PlatformVersion::latest(); let identity = Identity::random_identity(5, Some(5), platform_version) .expect("expected a random identity"); - let asset_lock_proof = raw_instant_asset_lock_proof_fixture(None); + let asset_lock_proof = raw_instant_asset_lock_proof_fixture(None, None); let identity_topup_transition = IdentityTopUpTransitionV0 { asset_lock_proof: AssetLockProof::Instant(asset_lock_proof), diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/methods/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/methods/mod.rs index ef49e752e3..83f90d6dad 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/methods/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/methods/mod.rs @@ -9,6 +9,8 @@ use crate::identity::Identity; #[cfg(feature = "state-transition-signing")] use crate::prelude::AssetLockProof; #[cfg(feature = "state-transition-signing")] +use crate::prelude::UserFeeIncrease; +#[cfg(feature = "state-transition-signing")] use crate::state_transition::identity_create_transition::v0::IdentityCreateTransitionV0; use crate::state_transition::identity_create_transition::IdentityCreateTransition; #[cfg(feature = "state-transition-signing")] @@ -27,6 +29,7 @@ impl IdentityCreateTransitionMethodsV0 for IdentityCreateTransition { asset_lock_proof_private_key: &[u8], signer: &S, bls: &impl BlsModule, + user_fee_increase: UserFeeIncrease, platform_version: &PlatformVersion, ) -> Result { match platform_version @@ -40,6 +43,7 @@ impl IdentityCreateTransitionMethodsV0 for IdentityCreateTransition { asset_lock_proof_private_key, signer, bls, + user_fee_increase, platform_version, )?), v => Err(ProtocolError::UnknownVersionError(format!( diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/methods/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/methods/v0/mod.rs index d171b73c25..9fdc3f989f 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/methods/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/methods/v0/mod.rs @@ -5,6 +5,8 @@ use crate::identity::Identity; #[cfg(feature = "state-transition-signing")] use crate::prelude::AssetLockProof; #[cfg(feature = "state-transition-signing")] +use crate::prelude::UserFeeIncrease; +#[cfg(feature = "state-transition-signing")] use crate::state_transition::StateTransition; use crate::state_transition::StateTransitionType; #[cfg(feature = "state-transition-signing")] @@ -20,6 +22,7 @@ pub trait IdentityCreateTransitionMethodsV0 { asset_lock_proof_private_key: &[u8], signer: &S, bls: &impl BlsModule, + user_fee_increase: UserFeeIncrease, platform_version: &PlatformVersion, ) -> Result; /// Get State Transition type diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/v0_methods.rs index af4a4e612a..da69511b19 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_create_transition/v0/v0_methods.rs @@ -17,6 +17,8 @@ use crate::identity::KeyType::ECDSA_HASH160; #[cfg(feature = "state-transition-signing")] use crate::prelude::AssetLockProof; #[cfg(feature = "state-transition-signing")] +use crate::prelude::UserFeeIncrease; +#[cfg(feature = "state-transition-signing")] use crate::serialization::Signable; use crate::state_transition::identity_create_transition::accessors::IdentityCreateTransitionAccessorsV0; use crate::state_transition::identity_create_transition::methods::IdentityCreateTransitionMethodsV0; @@ -38,9 +40,13 @@ impl IdentityCreateTransitionMethodsV0 for IdentityCreateTransitionV0 { asset_lock_proof_private_key: &[u8], signer: &S, bls: &impl BlsModule, + user_fee_increase: UserFeeIncrease, _platform_version: &PlatformVersion, ) -> Result { - let mut identity_create_transition = IdentityCreateTransitionV0::default(); + let mut identity_create_transition = IdentityCreateTransitionV0 { + user_fee_increase, + ..Default::default() + }; let public_keys = identity .public_keys() .iter() diff --git a/packages/rs-dpp/src/state_transition/state_transitions/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/mod.rs index 92b259f495..7de5b5a368 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/mod.rs @@ -2,6 +2,7 @@ mod common_fields; mod contract; pub(crate) mod document; pub mod identity; +pub mod signable_bytes_hasher; pub use contract::*; pub use document::*; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/signable_bytes_hasher.rs b/packages/rs-dpp/src/state_transition/state_transitions/signable_bytes_hasher.rs new file mode 100644 index 0000000000..d644279e58 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/signable_bytes_hasher.rs @@ -0,0 +1,48 @@ +use crate::util::hash::hash_double; +use platform_value::Bytes32; + +/// This is a structure to hash signable bytes when we are not sure if we will need the hashing +#[derive(Debug, Clone)] +pub enum SignableBytesHasher { + Bytes(Vec), + PreHashed(Bytes32), +} + +impl SignableBytesHasher { + pub fn into_hashed_bytes(self) -> Bytes32 { + match self { + SignableBytesHasher::Bytes(signable_bytes) => hash_double(signable_bytes).into(), + SignableBytesHasher::PreHashed(pre_hashed) => pre_hashed, + } + } + + pub fn to_hashed_bytes(&self) -> Bytes32 { + match self { + SignableBytesHasher::Bytes(signable_bytes) => hash_double(signable_bytes).into(), + SignableBytesHasher::PreHashed(pre_hashed) => *pre_hashed, + } + } + + pub fn hash_bytes(&mut self) -> Bytes32 { + match self { + SignableBytesHasher::Bytes(signable_bytes) => { + let bytes_32: Bytes32 = hash_double(signable_bytes).into(); + *self = SignableBytesHasher::PreHashed(bytes_32); + bytes_32 + } + SignableBytesHasher::PreHashed(pre_hashed) => *pre_hashed, + } + } + + pub fn hash_bytes_and_check_if_vec_contains(&mut self, vec: &[Bytes32]) -> bool { + match self { + SignableBytesHasher::Bytes(signable_bytes) => { + let bytes_32: Bytes32 = hash_double(signable_bytes).into(); + let contains = vec.contains(&bytes_32); + *self = SignableBytesHasher::PreHashed(bytes_32); + contains + } + SignableBytesHasher::PreHashed(pre_hashed) => vec.contains(pre_hashed), + } + } +} diff --git a/packages/rs-dpp/src/tests/fixtures/identity_create_transition_fixture.rs b/packages/rs-dpp/src/tests/fixtures/identity_create_transition_fixture.rs index 0e4c03dbeb..e46fe4009c 100644 --- a/packages/rs-dpp/src/tests/fixtures/identity_create_transition_fixture.rs +++ b/packages/rs-dpp/src/tests/fixtures/identity_create_transition_fixture.rs @@ -11,7 +11,7 @@ use platform_value::string_encoding::{decode, Encoding}; //[198, 23, 40, 120, 58, 93, 0, 165, 27, 49, 4, 117, 107, 204, 67, 46, 164, 216, 230, 135, 201, 92, 31, 155, 62, 131, 211, 177, 139, 175, 163, 237] pub fn identity_create_transition_fixture(one_time_private_key: Option) -> Value { - let asset_lock_proof = raw_instant_asset_lock_proof_fixture(one_time_private_key); + let asset_lock_proof = raw_instant_asset_lock_proof_fixture(one_time_private_key, None); platform_value!({ "protocolVersion": version::LATEST_VERSION, diff --git a/packages/rs-dpp/src/tests/fixtures/identity_topup_transition_fixture.rs b/packages/rs-dpp/src/tests/fixtures/identity_topup_transition_fixture.rs index 5d88046a63..6573cd74d0 100644 --- a/packages/rs-dpp/src/tests/fixtures/identity_topup_transition_fixture.rs +++ b/packages/rs-dpp/src/tests/fixtures/identity_topup_transition_fixture.rs @@ -9,7 +9,7 @@ use crate::version; //[198, 23, 40, 120, 58, 93, 0, 165, 27, 49, 4, 117, 107, 204, 67, 46, 164, 216, 230, 135, 201, 92, 31, 155, 62, 131, 211, 177, 139, 175, 163, 237] pub fn identity_topup_transition_fixture(one_time_private_key: Option) -> Value { - let asset_lock_proof = raw_instant_asset_lock_proof_fixture(one_time_private_key); + let asset_lock_proof = raw_instant_asset_lock_proof_fixture(one_time_private_key, None); platform_value!({ "protocolVersion": version::LATEST_VERSION, "type": StateTransitionType::IdentityTopUp as u8, diff --git a/packages/rs-dpp/src/tests/fixtures/instant_asset_lock_proof_fixture.rs b/packages/rs-dpp/src/tests/fixtures/instant_asset_lock_proof_fixture.rs index f1c9385101..f00af679ed 100644 --- a/packages/rs-dpp/src/tests/fixtures/instant_asset_lock_proof_fixture.rs +++ b/packages/rs-dpp/src/tests/fixtures/instant_asset_lock_proof_fixture.rs @@ -3,6 +3,7 @@ use std::str::FromStr; use dashcore::bls_sig_utils::BLSSignature; use dashcore::hash_types::CycleHash; +use crate::balances::credits::Duffs; use dashcore::secp256k1::rand::thread_rng; use dashcore::secp256k1::Secp256k1; use dashcore::transaction::special_transaction::asset_lock::AssetLockPayload; @@ -19,8 +20,9 @@ use crate::identity::state_transition::asset_lock_proof::{AssetLockProof, Instan pub fn raw_instant_asset_lock_proof_fixture( one_time_private_key: Option, + amount: Option, ) -> InstantAssetLockProof { - let transaction = instant_asset_lock_proof_transaction_fixture(one_time_private_key); + let transaction = instant_asset_lock_proof_transaction_fixture(one_time_private_key, amount); let instant_lock = instant_asset_lock_is_lock_fixture(transaction.txid()); @@ -29,8 +31,9 @@ pub fn raw_instant_asset_lock_proof_fixture( pub fn instant_asset_lock_proof_fixture( one_time_private_key: Option, + amount: Option, ) -> AssetLockProof { - let transaction = instant_asset_lock_proof_transaction_fixture(one_time_private_key); + let transaction = instant_asset_lock_proof_transaction_fixture(one_time_private_key, amount); let instant_lock = instant_asset_lock_is_lock_fixture(transaction.txid()); @@ -41,6 +44,7 @@ pub fn instant_asset_lock_proof_fixture( pub fn instant_asset_lock_proof_transaction_fixture( one_time_private_key: Option, + amount: Option, ) -> Transaction { let mut rng = thread_rng(); let secp = Secp256k1::new(); @@ -74,12 +78,12 @@ pub fn instant_asset_lock_proof_transaction_fixture( let one_time_key_hash = one_time_public_key.pubkey_hash(); let funding_output = TxOut { - value: 100000000, // 1 Dash + value: amount.unwrap_or(100000000), // 1 Dash script_pubkey: ScriptBuf::new_p2pkh(&one_time_key_hash), }; let burn_output = TxOut { - value: 100000000, // 1 Dash + value: amount.unwrap_or(100000000), // 1 Dash script_pubkey: ScriptBuf::new_op_return(&[]), }; diff --git a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs index 888e66f324..abc802ffef 100644 --- a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs @@ -179,7 +179,7 @@ where mod tests { use crate::config::PlatformConfig; use crate::platform_types::event_execution_result::EventExecutionResult::{ - SuccessfulPaidExecution, UnsuccessfulPaidExecution, + SuccessfulPaidExecution, UnpaidConsensusExecutionError, UnsuccessfulPaidExecution, }; use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::platform_types::system_identity_public_keys::v0::SystemIdentityPublicKeysV0; @@ -1395,9 +1395,10 @@ mod tests { .random_public_and_private_key_data(&mut rng, platform_version) .unwrap(); - let asset_lock_proof = instant_asset_lock_proof_fixture(Some( - PrivateKey::from_slice(pk.as_slice(), Network::Testnet).unwrap(), - )); + let asset_lock_proof = instant_asset_lock_proof_fixture( + Some(PrivateKey::from_slice(pk.as_slice(), Network::Testnet).unwrap()), + None, + ); let identifier = asset_lock_proof .create_identifier() @@ -1418,6 +1419,7 @@ mod tests { pk.as_slice(), &signer, &NativeBlsModule, + 0, platform_version, ) .expect("expected an identity create transition"); @@ -1580,9 +1582,10 @@ mod tests { .random_public_and_private_key_data(&mut rng, platform_version) .unwrap(); - let asset_lock_proof = instant_asset_lock_proof_fixture(Some( - PrivateKey::from_slice(pk.as_slice(), Network::Testnet).unwrap(), - )); + let asset_lock_proof = instant_asset_lock_proof_fixture( + Some(PrivateKey::from_slice(pk.as_slice(), Network::Testnet).unwrap()), + None, + ); let identifier = asset_lock_proof .create_identifier() @@ -1603,6 +1606,7 @@ mod tests { pk.as_slice(), &signer, &NativeBlsModule, + 0, platform_version, ) .expect("expected an identity create transition"); @@ -1634,9 +1638,10 @@ mod tests { .random_public_and_private_key_data(&mut rng, platform_version) .unwrap(); - let asset_lock_proof_top_up = instant_asset_lock_proof_fixture(Some( - PrivateKey::from_slice(pk.as_slice(), Network::Testnet).unwrap(), - )); + let asset_lock_proof_top_up = instant_asset_lock_proof_fixture( + Some(PrivateKey::from_slice(pk.as_slice(), Network::Testnet).unwrap()), + None, + ); let identity_top_up_transition: StateTransition = IdentityTopUpTransition::try_from_identity( @@ -1716,9 +1721,10 @@ mod tests { .random_public_and_private_key_data(&mut rng, platform_version) .unwrap(); - let asset_lock_proof = instant_asset_lock_proof_fixture(Some( - PrivateKey::from_slice(pk.as_slice(), Network::Testnet).unwrap(), - )); + let asset_lock_proof = instant_asset_lock_proof_fixture( + Some(PrivateKey::from_slice(pk.as_slice(), Network::Testnet).unwrap()), + None, + ); let identifier = asset_lock_proof .create_identifier() @@ -1739,6 +1745,7 @@ mod tests { pk.as_slice(), &signer, &NativeBlsModule, + 0, platform_version, ) .expect("expected an identity create transition"); @@ -1770,9 +1777,10 @@ mod tests { .random_public_and_private_key_data(&mut rng, platform_version) .unwrap(); - let asset_lock_proof_top_up = instant_asset_lock_proof_fixture(Some( - PrivateKey::from_slice(pk.as_slice(), Network::Testnet).unwrap(), - )); + let asset_lock_proof_top_up = instant_asset_lock_proof_fixture( + Some(PrivateKey::from_slice(pk.as_slice(), Network::Testnet).unwrap()), + None, + ); let identity_top_up_transition: StateTransition = IdentityTopUpTransition::try_from_identity( @@ -1878,9 +1886,10 @@ mod tests { .random_public_and_private_key_data(&mut rng, platform_version) .unwrap(); - let asset_lock_proof = instant_asset_lock_proof_fixture(Some( - PrivateKey::from_slice(pk.as_slice(), Network::Testnet).unwrap(), - )); + let asset_lock_proof = instant_asset_lock_proof_fixture( + Some(PrivateKey::from_slice(pk.as_slice(), Network::Testnet).unwrap()), + None, + ); let identifier = asset_lock_proof .create_identifier() @@ -1903,9 +1912,10 @@ mod tests { .random_public_and_private_key_data(&mut rng, platform_version) .unwrap(); - let asset_lock_proof_top_up = instant_asset_lock_proof_fixture(Some( - PrivateKey::from_slice(pk.as_slice(), Network::Testnet).unwrap(), - )); + let asset_lock_proof_top_up = instant_asset_lock_proof_fixture( + Some(PrivateKey::from_slice(pk.as_slice(), Network::Testnet).unwrap()), + None, + ); let identity_top_up_transition: StateTransition = IdentityTopUpTransition::try_from_identity( @@ -1976,9 +1986,10 @@ mod tests { .random_public_and_private_key_data(&mut rng, platform_version) .unwrap(); - let asset_lock_proof = instant_asset_lock_proof_fixture(Some( - PrivateKey::from_slice(pk.as_slice(), Network::Testnet).unwrap(), - )); + let asset_lock_proof = instant_asset_lock_proof_fixture( + Some(PrivateKey::from_slice(pk.as_slice(), Network::Testnet).unwrap()), + None, + ); let identifier = asset_lock_proof .create_identifier() @@ -1999,6 +2010,7 @@ mod tests { pk.as_slice(), &signer, &NativeBlsModule, + 0, platform_version, ) .expect("expected an identity create transition"); @@ -2030,9 +2042,10 @@ mod tests { .random_public_and_private_key_data(&mut rng, platform_version) .unwrap(); - let asset_lock_proof_top_up = instant_asset_lock_proof_fixture(Some( - PrivateKey::from_slice(pk.as_slice(), Network::Testnet).unwrap(), - )); + let asset_lock_proof_top_up = instant_asset_lock_proof_fixture( + Some(PrivateKey::from_slice(pk.as_slice(), Network::Testnet).unwrap()), + None, + ); let identity_top_up_transition: StateTransition = IdentityTopUpTransition::try_from_identity( @@ -2112,6 +2125,7 @@ mod tests { pk.as_slice(), &signer, &NativeBlsModule, + 0, platform_version, ) .expect("expected an identity create transition"); @@ -2190,9 +2204,10 @@ mod tests { .random_public_and_private_key_data(&mut rng, platform_version) .unwrap(); - let asset_lock_proof = instant_asset_lock_proof_fixture(Some( - PrivateKey::from_slice(pk.as_slice(), Network::Testnet).unwrap(), - )); + let asset_lock_proof = instant_asset_lock_proof_fixture( + Some(PrivateKey::from_slice(pk.as_slice(), Network::Testnet).unwrap()), + None, + ); let identifier = asset_lock_proof .create_identifier() @@ -2209,10 +2224,11 @@ mod tests { let mut identity_create_transition: StateTransition = IdentityCreateTransition::try_from_identity_with_signer( &identity, - asset_lock_proof, + asset_lock_proof.clone(), pk.as_slice(), &signer, &NativeBlsModule, + 0, platform_version, ) .expect("expected an identity create transition"); @@ -2268,6 +2284,43 @@ mod tests { let validation_result = platform .execute_tx(valid_identity_create_serialized_transition, &transaction) .expect("expected to execute identity_create tx"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + // this is unpaid because it will look like a replay attack + assert!(matches!( + validation_result, + UnpaidConsensusExecutionError(..) + )); + + let valid_identity_create_transition: StateTransition = + IdentityCreateTransition::try_from_identity_with_signer( + &identity, + asset_lock_proof, + pk.as_slice(), + &signer, + &NativeBlsModule, + 1, + platform_version, + ) + .expect("expected an identity create transition"); + + let valid_identity_create_serialized_transition = valid_identity_create_transition + .serialize_to_bytes() + .expect("serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let validation_result = platform + .execute_tx(valid_identity_create_serialized_transition, &transaction) + .expect("expected to execute identity_create tx"); + + // the user fee increase changed, so this is now passing assert!(matches!(validation_result, SuccessfulPaidExecution(..))); platform @@ -2281,9 +2334,10 @@ mod tests { .random_public_and_private_key_data(&mut rng, platform_version) .unwrap(); - let asset_lock_proof_top_up = instant_asset_lock_proof_fixture(Some( - PrivateKey::from_slice(pk.as_slice(), Network::Testnet).unwrap(), - )); + let asset_lock_proof_top_up = instant_asset_lock_proof_fixture( + Some(PrivateKey::from_slice(pk.as_slice(), Network::Testnet).unwrap()), + None, + ); let identity_top_up_transition: StateTransition = IdentityTopUpTransition::try_from_identity( @@ -2363,6 +2417,7 @@ mod tests { pk.as_slice(), &signer, &NativeBlsModule, + 0, platform_version, ) .expect("expected an identity create transition"); diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/add_process_epoch_change_operations/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/add_process_epoch_change_operations/mod.rs index 9722463566..ba12736587 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/add_process_epoch_change_operations/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/add_process_epoch_change_operations/mod.rs @@ -8,13 +8,11 @@ use crate::error::Error; use crate::execution::types::block_fees::BlockFees; -use crate::execution::types::block_state_info::BlockStateInfo; use crate::execution::types::storage_fee_distribution_outcome; use crate::error::execution::ExecutionError; use crate::execution::types::block_execution_context::BlockExecutionContext; -use crate::platform_types::epoch_info::EpochInfo; use crate::platform_types::platform::Platform; impl Platform { diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/add_process_epoch_change_operations/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/add_process_epoch_change_operations/v0/mod.rs index 52f7f35e69..e705b047ba 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/add_process_epoch_change_operations/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/add_process_epoch_change_operations/v0/mod.rs @@ -47,13 +47,11 @@ use crate::error::Error; use crate::execution::types::block_fees::v0::BlockFeesV0Getters; use crate::execution::types::block_fees::BlockFees; use crate::execution::types::block_state_info::v0::BlockStateInfoV0Getters; -use crate::execution::types::block_state_info::BlockStateInfo; use crate::execution::types::storage_fee_distribution_outcome; use crate::execution::types::block_execution_context::v0::BlockExecutionContextV0Getters; use crate::execution::types::block_execution_context::BlockExecutionContext; use crate::platform_types::epoch_info::v0::EpochInfoV0Getters; -use crate::platform_types::epoch_info::EpochInfo; use crate::platform_types::platform::Platform; use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use drive::fee_pools::epochs::operations_factory::EpochOperations; diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/process_block_fees/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/process_block_fees/mod.rs index e8cafae10b..7ab4cbe08d 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/process_block_fees/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/process_block_fees/mod.rs @@ -10,10 +10,8 @@ use crate::execution::types::block_execution_context::BlockExecutionContext; use crate::execution::types::block_fees::BlockFees; -use crate::execution::types::block_state_info::BlockStateInfo; use crate::execution::types::processed_block_fees_outcome; -use crate::platform_types::epoch_info::EpochInfo; use crate::platform_types::platform::Platform; impl Platform { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs index 46eaf968c6..3846ebad99 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs @@ -6,6 +6,8 @@ use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::rpc::core::CoreRPCLike; use dpp::identity::state_transition::OptionallyAssetLockProved; use dpp::prelude::ConsensusValidationResult; +use dpp::serialization::Signable; +use dpp::state_transition::signable_bytes_hasher::SignableBytesHasher; use dpp::ProtocolError; use dpp::state_transition::StateTransition; @@ -200,10 +202,13 @@ pub(super) fn state_transition_to_execution_event_for_check_tx_v0<'a, C: CoreRPC } CheckTxLevel::Recheck => { if let Some(asset_lock_proof) = state_transition.optional_asset_lock_proof() { + let mut signable_bytes_hasher = + SignableBytesHasher::Bytes(state_transition.signable_bytes()?); // we should check that the asset lock is still valid let validation_result = asset_lock_proof .verify_is_not_spent_and_has_enough_balance( platform, + &mut signable_bytes_hasher, state_transition .required_asset_lock_balance_for_processing_start(platform_version), None, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/validate/chain/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/validate/chain/mod.rs index ee48d3da18..f0ff6ac4c8 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/validate/chain/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/validate/chain/mod.rs @@ -7,6 +7,7 @@ use dpp::consensus::basic::identity::{ }; use dpp::fee::Credits; use dpp::identity::state_transition::asset_lock_proof::chain::ChainAssetLockProof; +use dpp::state_transition::signable_bytes_hasher::SignableBytesHasher; use dpp::validation::ConsensusValidationResult; use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; @@ -20,6 +21,7 @@ impl AssetLockProofValidation for ChainAssetLockProof { fn validate( &self, platform_ref: &PlatformRef, + signable_bytes_hasher: &mut SignableBytesHasher, required_balance: Credits, validation_mode: ValidationMode, transaction: TransactionArg, @@ -39,6 +41,7 @@ impl AssetLockProofValidation for ChainAssetLockProof { self.verify_is_not_spent_and_has_enough_balance( platform_ref, + signable_bytes_hasher, required_balance, transaction, platform_version, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/validate/instant/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/validate/instant/mod.rs index 9181804a86..e9fb84b8f8 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/validate/instant/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/validate/instant/mod.rs @@ -6,6 +6,7 @@ use dpp::asset_lock::reduced_asset_lock_value::AssetLockValue; use dpp::consensus::basic::identity::InvalidInstantAssetLockProofSignatureError; use dpp::fee::Credits; use dpp::identity::state_transition::asset_lock_proof::InstantAssetLockProof; +use dpp::state_transition::signable_bytes_hasher::SignableBytesHasher; use dpp::validation::ConsensusValidationResult; use dpp::version::PlatformVersion; @@ -20,6 +21,7 @@ impl AssetLockProofValidation for InstantAssetLockProof { fn validate( &self, platform_ref: &PlatformRef, + signable_bytes_hasher: &mut SignableBytesHasher, required_balance: Credits, validation_mode: ValidationMode, transaction: TransactionArg, @@ -29,6 +31,7 @@ impl AssetLockProofValidation for InstantAssetLockProof { let validation_result = self.verify_is_not_spent_and_has_enough_balance( platform_ref, + signable_bytes_hasher, required_balance, transaction, platform_version, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/validate/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/validate/mod.rs index 02ec7ec464..ee7e2652e0 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/validate/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/validate/mod.rs @@ -8,6 +8,7 @@ use crate::rpc::core::CoreRPCLike; use dpp::asset_lock::reduced_asset_lock_value::AssetLockValue; use dpp::fee::Credits; use dpp::prelude::AssetLockProof; +use dpp::state_transition::signable_bytes_hasher::SignableBytesHasher; use dpp::validation::ConsensusValidationResult; use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; @@ -31,6 +32,7 @@ pub trait AssetLockProofValidation { fn validate( &self, platform_ref: &PlatformRef, + signable_bytes_hasher: &mut SignableBytesHasher, required_balance: Credits, validation_mode: ValidationMode, transaction: TransactionArg, @@ -42,6 +44,7 @@ impl AssetLockProofValidation for AssetLockProof { fn validate( &self, platform_ref: &PlatformRef, + signable_bytes_hasher: &mut SignableBytesHasher, required_balance: Credits, validation_mode: ValidationMode, transaction: TransactionArg, @@ -50,6 +53,7 @@ impl AssetLockProofValidation for AssetLockProof { match self { AssetLockProof::Instant(proof) => proof.validate( platform_ref, + signable_bytes_hasher, required_balance, validation_mode, transaction, @@ -57,6 +61,7 @@ impl AssetLockProofValidation for AssetLockProof { ), AssetLockProof::Chain(proof) => proof.validate( platform_ref, + signable_bytes_hasher, required_balance, validation_mode, transaction, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/verify_is_not_spent/chain/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/verify_is_not_spent/chain/mod.rs index ef6bf3de31..3eb45e3b8d 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/verify_is_not_spent/chain/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/verify_is_not_spent/chain/mod.rs @@ -3,6 +3,7 @@ use crate::error::Error; use crate::platform_types::platform::PlatformRef; use dpp::fee::Credits; use dpp::identity::state_transition::asset_lock_proof::chain::ChainAssetLockProof; +use dpp::state_transition::signable_bytes_hasher::SignableBytesHasher; use dpp::validation::ConsensusValidationResult; use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; @@ -15,12 +16,14 @@ impl AssetLockProofVerifyIsNotSpent for ChainAssetLockProof { fn verify_is_not_spent_and_has_enough_balance( &self, platform_ref: &PlatformRef, + signable_bytes_hasher: &mut SignableBytesHasher, required_balance: Credits, transaction: TransactionArg, platform_version: &PlatformVersion, ) -> Result, Error> { verify_asset_lock_is_not_spent_and_has_enough_balance( platform_ref, + signable_bytes_hasher, self.out_point, required_balance, transaction, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/verify_is_not_spent/instant/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/verify_is_not_spent/instant/mod.rs index 43e7acd1bc..f6ad4a3a79 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/verify_is_not_spent/instant/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/verify_is_not_spent/instant/mod.rs @@ -5,6 +5,7 @@ use dpp::asset_lock::reduced_asset_lock_value::AssetLockValue; use dpp::fee::Credits; use dpp::identity::state_transition::asset_lock_proof::InstantAssetLockProof; +use dpp::state_transition::signable_bytes_hasher::SignableBytesHasher; use dpp::validation::ConsensusValidationResult; use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; @@ -17,6 +18,7 @@ impl AssetLockProofVerifyIsNotSpent for InstantAssetLockProof { fn verify_is_not_spent_and_has_enough_balance( &self, platform_ref: &PlatformRef, + signable_bytes_hasher: &mut SignableBytesHasher, required_balance: Credits, transaction: TransactionArg, platform_version: &PlatformVersion, @@ -31,6 +33,7 @@ impl AssetLockProofVerifyIsNotSpent for InstantAssetLockProof { verify_asset_lock_is_not_spent_and_has_enough_balance( platform_ref, + signable_bytes_hasher, asset_lock_outpoint, required_balance, transaction, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/verify_is_not_spent/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/verify_is_not_spent/mod.rs index 0785227d2d..a38cf9a509 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/verify_is_not_spent/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/verify_is_not_spent/mod.rs @@ -9,6 +9,7 @@ use dpp::dashcore::OutPoint; use dpp::fee::Credits; use dpp::prelude::AssetLockProof; +use dpp::state_transition::signable_bytes_hasher::SignableBytesHasher; use dpp::validation::ConsensusValidationResult; use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; @@ -35,6 +36,7 @@ pub trait AssetLockProofVerifyIsNotSpent { fn verify_is_not_spent_and_has_enough_balance( &self, platform_ref: &PlatformRef, + signable_bytes_hasher: &mut SignableBytesHasher, required_balance: Credits, transaction: TransactionArg, platform_version: &PlatformVersion, @@ -45,6 +47,7 @@ impl AssetLockProofVerifyIsNotSpent for AssetLockProof { fn verify_is_not_spent_and_has_enough_balance( &self, platform_ref: &PlatformRef, + signable_bytes_hasher: &mut SignableBytesHasher, required_balance: Credits, transaction: TransactionArg, platform_version: &PlatformVersion, @@ -52,12 +55,14 @@ impl AssetLockProofVerifyIsNotSpent for AssetLockProof { match self { AssetLockProof::Instant(proof) => proof.verify_is_not_spent_and_has_enough_balance( platform_ref, + signable_bytes_hasher, required_balance, transaction, platform_version, ), AssetLockProof::Chain(proof) => proof.verify_is_not_spent_and_has_enough_balance( platform_ref, + signable_bytes_hasher, required_balance, transaction, platform_version, @@ -69,6 +74,7 @@ impl AssetLockProofVerifyIsNotSpent for AssetLockProof { #[inline(always)] fn verify_asset_lock_is_not_spent_and_has_enough_balance( platform_ref: &PlatformRef, + signable_bytes_hasher: &mut SignableBytesHasher, out_point: OutPoint, required_balance: Credits, transaction: TransactionArg, @@ -84,6 +90,7 @@ fn verify_asset_lock_is_not_spent_and_has_enough_balance( { 0 => verify_asset_lock_is_not_spent_and_has_enough_balance_v0( platform_ref, + signable_bytes_hasher, out_point, required_balance, transaction, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/verify_is_not_spent/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/verify_is_not_spent/v0/mod.rs index f127d22921..1ca28e3ff8 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/verify_is_not_spent/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/proof/verify_is_not_spent/v0/mod.rs @@ -3,6 +3,7 @@ use crate::platform_types::platform::PlatformRef; use dpp::asset_lock::reduced_asset_lock_value::{AssetLockValue, AssetLockValueGettersV0}; use dpp::asset_lock::StoredAssetLockInfo; use dpp::consensus::basic::identity::{ + IdentityAssetLockStateTransitionReplayError, IdentityAssetLockTransactionOutPointAlreadyConsumedError, IdentityAssetLockTransactionOutPointNotEnoughBalanceError, }; @@ -10,6 +11,7 @@ use dpp::dashcore::OutPoint; use dpp::fee::Credits; use dpp::platform_value::Bytes36; use dpp::prelude::ConsensusValidationResult; +use dpp::state_transition::signable_bytes_hasher::SignableBytesHasher; use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; @@ -17,6 +19,7 @@ use drive::grovedb::TransactionArg; #[inline(always)] pub(super) fn verify_asset_lock_is_not_spent_and_has_enough_balance_v0( platform_ref: &PlatformRef, + signable_bytes_hasher: &mut SignableBytesHasher, out_point: OutPoint, required_balance: Credits, transaction: TransactionArg, @@ -61,6 +64,19 @@ pub(super) fn verify_asset_lock_is_not_spent_and_has_enough_balance_v0( ) .into(), )) + } else if signable_bytes_hasher + .hash_bytes_and_check_if_vec_contains(reduced_asset_lock_value.used_tags_ref()) + { + // Here we check that the transaction was not already tried to be execution + // This is the replay attack prevention + Ok(ConsensusValidationResult::new_with_error( + IdentityAssetLockStateTransitionReplayError::new( + out_point.txid, + out_point.vout as usize, + signable_bytes_hasher.to_hashed_bytes(), + ) + .into(), + )) } else { Ok(ConsensusValidationResult::new_with_data( reduced_asset_lock_value, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/v0/mod.rs index bd26720263..eacae1bdd3 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/v0/mod.rs @@ -20,9 +20,9 @@ use dpp::data_contract::document_type::schema::{ }; use dpp::data_contract::errors::DataContractError; use dpp::data_contract::schema::DataContractSchemaMethodsV0; -use dpp::data_contract::{DataContract, JsonValue}; +use dpp::data_contract::JsonValue; use dpp::platform_value::converter::serde_json::BTreeValueJsonConverter; -use dpp::platform_value::{Value, ValueMap}; +use dpp::platform_value::ValueMap; use dpp::prelude::ConsensusValidationResult; use dpp::state_transition::data_contract_update_transition::accessors::DataContractUpdateTransitionAccessorsV0; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/mod.rs index 63bc921b80..f68781b6b1 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/mod.rs @@ -190,3 +190,1024 @@ impl StateTransitionStateValidationForIdentityCreateTransitionV0 for IdentityCre } } } + +#[cfg(test)] +mod tests { + use crate::test::helpers::setup::TestPlatformBuilder; + use dpp::block::block_info::BlockInfo; + use dpp::dashcore::{Network, PrivateKey}; + use dpp::identity::accessors::{IdentityGettersV0, IdentitySettersV0}; + use dpp::identity::KeyType::ECDSA_SECP256K1; + use dpp::identity::{Identity, IdentityPublicKey, IdentityV0}; + use dpp::native_bls::NativeBlsModule; + use dpp::prelude::Identifier; + use dpp::serialization::PlatformSerializable; + use dpp::state_transition::identity_create_transition::methods::IdentityCreateTransitionMethodsV0; + use dpp::state_transition::identity_create_transition::IdentityCreateTransition; + use dpp::state_transition::StateTransition; + use dpp::tests::fixtures::instant_asset_lock_proof_fixture; + use platform_version::version::PlatformVersion; + use rand::prelude::StdRng; + use rand::SeedableRng; + use simple_signer::signer::SimpleSigner; + use std::collections::BTreeMap; + + #[test] + fn test_identity_create_validation() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure(); + + platform + .core_rpc + .expect_verify_instant_lock() + .returning(|_, _| Ok(true)); + + let platform_state = platform.state.load(); + + let mut signer = SimpleSigner::default(); + + let mut rng = StdRng::seed_from_u64(567); + + let (master_key, master_private_key) = + IdentityPublicKey::random_ecdsa_master_authentication_key( + 0, + Some(58), + platform_version, + ) + .expect("expected to get key pair"); + + signer.add_key(master_key.clone(), master_private_key.clone()); + + let (key, private_key) = IdentityPublicKey::random_ecdsa_critical_level_authentication_key( + 1, + Some(999), + platform_version, + ) + .expect("expected to get key pair"); + + signer.add_key(key.clone(), private_key.clone()); + + let (_, pk) = ECDSA_SECP256K1 + .random_public_and_private_key_data(&mut rng, platform_version) + .unwrap(); + + let asset_lock_proof = instant_asset_lock_proof_fixture( + Some(PrivateKey::from_slice(pk.as_slice(), Network::Testnet).unwrap()), + None, + ); + + let identifier = asset_lock_proof + .create_identifier() + .expect("expected an identifier"); + + let identity: Identity = IdentityV0 { + id: identifier, + public_keys: BTreeMap::from([(0, master_key.clone()), (1, key.clone())]), + balance: 1000000000, + revision: 0, + } + .into(); + + let identity_create_transition: StateTransition = + IdentityCreateTransition::try_from_identity_with_signer( + &identity, + asset_lock_proof, + pk.as_slice(), + &signer, + &NativeBlsModule, + 0, + platform_version, + ) + .expect("expected an identity create transition"); + + let identity_create_serialized_transition = identity_create_transition + .serialize_to_bytes() + .expect("serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![identity_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.valid_count(), 1); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 2566730); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit"); + + let identity_balance = platform + .drive + .fetch_identity_balance(identity.id().into_buffer(), None, platform_version) + .expect("expected to get identity balance") + .expect("expected there to be an identity balance for this identity"); + + assert_eq!(identity_balance, 99916163270); + } + + #[test] + fn test_identity_create_asset_lock_reuse_after_issue() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure(); + + platform + .core_rpc + .expect_verify_instant_lock() + .returning(|_, _| Ok(true)); + + let platform_state = platform.state.load(); + + let mut signer = SimpleSigner::default(); + + let mut rng = StdRng::seed_from_u64(567); + + let (master_key, master_private_key) = + IdentityPublicKey::random_ecdsa_master_authentication_key( + 0, + Some(58), + platform_version, + ) + .expect("expected to get key pair"); + + signer.add_key(master_key.clone(), master_private_key.clone()); + + let (critical_public_key_that_is_already_in_system, private_key) = + IdentityPublicKey::random_ecdsa_critical_level_authentication_key( + 1, + Some(999), + platform_version, + ) + .expect("expected to get key pair"); + + // Let's start by adding this critical key to another identity + + let (another_master_key, _) = IdentityPublicKey::random_ecdsa_master_authentication_key( + 0, + Some(53), + platform_version, + ) + .expect("expected to get key pair"); + + let identity_already_in_system: Identity = IdentityV0 { + id: Identifier::random_with_rng(&mut rng), + public_keys: BTreeMap::from([ + (0, another_master_key.clone()), + (1, critical_public_key_that_is_already_in_system.clone()), + ]), + balance: 100000, + revision: 0, + } + .into(); + + // We just add this identity to the system first + + platform + .drive + .add_new_identity( + identity_already_in_system, + false, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to add a new identity"); + + signer.add_key( + critical_public_key_that_is_already_in_system.clone(), + private_key.clone(), + ); + + let (_, pk) = ECDSA_SECP256K1 + .random_public_and_private_key_data(&mut rng, platform_version) + .unwrap(); + + let asset_lock_proof = instant_asset_lock_proof_fixture( + Some(PrivateKey::from_slice(pk.as_slice(), Network::Testnet).unwrap()), + None, + ); + + let identifier = asset_lock_proof + .create_identifier() + .expect("expected an identifier"); + + let mut identity: Identity = IdentityV0 { + id: identifier, + public_keys: BTreeMap::from([ + (0, master_key.clone()), + (1, critical_public_key_that_is_already_in_system.clone()), + ]), + balance: 1000000000, + revision: 0, + } + .into(); + + let identity_create_transition: StateTransition = + IdentityCreateTransition::try_from_identity_with_signer( + &identity, + asset_lock_proof.clone(), + pk.as_slice(), + &signer, + &NativeBlsModule, + 0, + platform_version, + ) + .expect("expected an identity create transition"); + + let identity_create_serialized_transition = identity_create_transition + .serialize_to_bytes() + .expect("serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![identity_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.invalid_paid_count(), 1); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 0); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 10013800); // 10000000 penalty + 13800 processing + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit"); + + // Okay now let us try to reuse the asset lock + + let (new_public_key, new_private_key) = + IdentityPublicKey::random_ecdsa_critical_level_authentication_key( + 1, + Some(13), + platform_version, + ) + .expect("expected to get key pair"); + + signer.add_key(new_public_key.clone(), new_private_key.clone()); + + // let's set the new key to the identity (replacing the one that was causing the issue + identity.set_public_keys(BTreeMap::from([ + (0, master_key.clone()), + (1, new_public_key.clone()), + ])); + + let identity_create_transition: StateTransition = + IdentityCreateTransition::try_from_identity_with_signer( + &identity, + asset_lock_proof, + pk.as_slice(), + &signer, + &NativeBlsModule, + 0, + platform_version, + ) + .expect("expected an identity create transition"); + + let identity_create_serialized_transition = identity_create_transition + .serialize_to_bytes() + .expect("serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![identity_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.invalid_paid_count(), 0); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 1); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 3170170); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit"); + + let identity_balance = platform + .drive + .fetch_identity_balance(identity.id().into_buffer(), None, platform_version) + .expect("expected to get identity balance") + .expect("expected there to be an identity balance for this identity"); + + assert_eq!(identity_balance, 99911297030); // The identity balance is smaller than if there hadn't been any issue + } + + #[test] + fn test_identity_create_asset_lock_reuse_after_max_issues() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure(); + + platform + .core_rpc + .expect_verify_instant_lock() + .returning(|_, _| Ok(true)); + + let platform_state = platform.state.load(); + + let mut signer = SimpleSigner::default(); + + let mut rng = StdRng::seed_from_u64(567); + + let (master_key, master_private_key) = + IdentityPublicKey::random_ecdsa_master_authentication_key( + 0, + Some(58), + platform_version, + ) + .expect("expected to get key pair"); + + signer.add_key(master_key.clone(), master_private_key.clone()); + + let (critical_public_key_that_is_already_in_system, private_key) = + IdentityPublicKey::random_ecdsa_critical_level_authentication_key( + 1, + Some(999), + platform_version, + ) + .expect("expected to get key pair"); + + // Let's start by adding this critical key to another identity + + let (another_master_key, _) = IdentityPublicKey::random_ecdsa_master_authentication_key( + 0, + Some(53), + platform_version, + ) + .expect("expected to get key pair"); + + let identity_already_in_system: Identity = IdentityV0 { + id: Identifier::random_with_rng(&mut rng), + public_keys: BTreeMap::from([ + (0, another_master_key.clone()), + (1, critical_public_key_that_is_already_in_system.clone()), + ]), + balance: 100000, + revision: 0, + } + .into(); + + // We just add this identity to the system first + + platform + .drive + .add_new_identity( + identity_already_in_system, + false, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to add a new identity"); + + signer.add_key( + critical_public_key_that_is_already_in_system.clone(), + private_key.clone(), + ); + + let (_, pk) = ECDSA_SECP256K1 + .random_public_and_private_key_data(&mut rng, platform_version) + .unwrap(); + + let asset_lock_proof = instant_asset_lock_proof_fixture( + Some(PrivateKey::from_slice(pk.as_slice(), Network::Testnet).unwrap()), + None, + ); + + let identifier = asset_lock_proof + .create_identifier() + .expect("expected an identifier"); + + for i in 0..16 { + let (new_master_key, new_master_private_key) = + IdentityPublicKey::random_ecdsa_master_authentication_key( + 0, + Some(58 + i), + platform_version, + ) + .expect("expected to get key pair"); + + signer.add_key(new_master_key.clone(), new_master_private_key.clone()); + + let identity: Identity = IdentityV0 { + id: identifier, + public_keys: BTreeMap::from([ + (0, new_master_key.clone()), + (1, critical_public_key_that_is_already_in_system.clone()), + ]), + balance: 1000000000, + revision: 0, + } + .into(); + + let identity_create_transition: StateTransition = + IdentityCreateTransition::try_from_identity_with_signer( + &identity, + asset_lock_proof.clone(), + pk.as_slice(), + &signer, + &NativeBlsModule, + 0, + platform_version, + ) + .expect("expected an identity create transition"); + + let identity_create_serialized_transition = identity_create_transition + .serialize_to_bytes() + .expect("serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![identity_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.invalid_paid_count(), 1); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 0); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 10013800); // 10000000 penalty + 13800 processing + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit"); + } + + // Okay now let us try to reuse the asset lock, there should be no balance + + let (new_public_key, new_private_key) = + IdentityPublicKey::random_ecdsa_critical_level_authentication_key( + 1, + Some(13), + platform_version, + ) + .expect("expected to get key pair"); + + signer.add_key(new_public_key.clone(), new_private_key.clone()); + + let identity: Identity = IdentityV0 { + id: identifier, + public_keys: BTreeMap::from([(0, master_key.clone()), (1, new_public_key.clone())]), + balance: 1000000000, + revision: 0, + } + .into(); + + let identity_create_transition: StateTransition = + IdentityCreateTransition::try_from_identity_with_signer( + &identity, + asset_lock_proof, + pk.as_slice(), + &signer, + &NativeBlsModule, + 0, + platform_version, + ) + .expect("expected an identity create transition"); + + let identity_create_serialized_transition = identity_create_transition + .serialize_to_bytes() + .expect("serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![identity_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.invalid_paid_count(), 0); + + assert_eq!(processing_result.invalid_unpaid_count(), 1); + + assert_eq!(processing_result.valid_count(), 0); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 0); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit"); + } + + #[test] + fn test_identity_create_asset_lock_use_all_funds() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure(); + + platform + .core_rpc + .expect_verify_instant_lock() + .returning(|_, _| Ok(true)); + + let platform_state = platform.state.load(); + + let mut signer = SimpleSigner::default(); + + let mut rng = StdRng::seed_from_u64(567); + + let (master_key, master_private_key) = + IdentityPublicKey::random_ecdsa_master_authentication_key( + 0, + Some(58), + platform_version, + ) + .expect("expected to get key pair"); + + signer.add_key(master_key.clone(), master_private_key.clone()); + + let (critical_public_key_that_is_already_in_system, private_key) = + IdentityPublicKey::random_ecdsa_critical_level_authentication_key( + 1, + Some(999), + platform_version, + ) + .expect("expected to get key pair"); + + // Let's start by adding this critical key to another identity + + let (another_master_key, _) = IdentityPublicKey::random_ecdsa_master_authentication_key( + 0, + Some(53), + platform_version, + ) + .expect("expected to get key pair"); + + let identity_already_in_system: Identity = IdentityV0 { + id: Identifier::random_with_rng(&mut rng), + public_keys: BTreeMap::from([ + (0, another_master_key.clone()), + (1, critical_public_key_that_is_already_in_system.clone()), + ]), + balance: 100000, + revision: 0, + } + .into(); + + // We just add this identity to the system first + + platform + .drive + .add_new_identity( + identity_already_in_system, + false, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to add a new identity"); + + signer.add_key( + critical_public_key_that_is_already_in_system.clone(), + private_key.clone(), + ); + + let (_, pk) = ECDSA_SECP256K1 + .random_public_and_private_key_data(&mut rng, platform_version) + .unwrap(); + + let asset_lock_proof = instant_asset_lock_proof_fixture( + Some(PrivateKey::from_slice(pk.as_slice(), Network::Testnet).unwrap()), + Some(220000), + ); + + let identifier = asset_lock_proof + .create_identifier() + .expect("expected an identifier"); + + // this should work for 2 times only + for i in 0..2 { + let (new_master_key, new_master_private_key) = + IdentityPublicKey::random_ecdsa_master_authentication_key( + 0, + Some(58 + i), + platform_version, + ) + .expect("expected to get key pair"); + + signer.add_key(new_master_key.clone(), new_master_private_key.clone()); + + let identity: Identity = IdentityV0 { + id: identifier, + public_keys: BTreeMap::from([ + (0, new_master_key.clone()), + (1, critical_public_key_that_is_already_in_system.clone()), + ]), + balance: 1000000000, + revision: 0, + } + .into(); + + let identity_create_transition: StateTransition = + IdentityCreateTransition::try_from_identity_with_signer( + &identity, + asset_lock_proof.clone(), + pk.as_slice(), + &signer, + &NativeBlsModule, + 0, + platform_version, + ) + .expect("expected an identity create transition"); + + let identity_create_serialized_transition = identity_create_transition + .serialize_to_bytes() + .expect("serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![identity_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.invalid_paid_count(), 1); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 0); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 10013800); // 10000000 penalty + 13800 processing + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit"); + } + + // Okay now let us try to reuse the asset lock, there should be no balance + + let (new_public_key, new_private_key) = + IdentityPublicKey::random_ecdsa_critical_level_authentication_key( + 1, + Some(13), + platform_version, + ) + .expect("expected to get key pair"); + + signer.add_key(new_public_key.clone(), new_private_key.clone()); + + let identity: Identity = IdentityV0 { + id: identifier, + public_keys: BTreeMap::from([(0, master_key.clone()), (1, new_public_key.clone())]), + balance: 1000000000, + revision: 0, + } + .into(); + + let identity_create_transition: StateTransition = + IdentityCreateTransition::try_from_identity_with_signer( + &identity, + asset_lock_proof, + pk.as_slice(), + &signer, + &NativeBlsModule, + 0, + platform_version, + ) + .expect("expected an identity create transition"); + + let identity_create_serialized_transition = identity_create_transition + .serialize_to_bytes() + .expect("serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![identity_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.invalid_paid_count(), 0); + + assert_eq!(processing_result.invalid_unpaid_count(), 1); + + assert_eq!(processing_result.valid_count(), 0); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 0); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit"); + } + + #[test] + fn test_identity_create_asset_lock_replay_attack() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure(); + + platform + .core_rpc + .expect_verify_instant_lock() + .returning(|_, _| Ok(true)); + + let platform_state = platform.state.load(); + + let mut signer = SimpleSigner::default(); + + let mut rng = StdRng::seed_from_u64(567); + + let (master_key, master_private_key) = + IdentityPublicKey::random_ecdsa_master_authentication_key( + 0, + Some(58), + platform_version, + ) + .expect("expected to get key pair"); + + signer.add_key(master_key.clone(), master_private_key.clone()); + + let (critical_public_key_that_is_already_in_system, private_key) = + IdentityPublicKey::random_ecdsa_critical_level_authentication_key( + 1, + Some(999), + platform_version, + ) + .expect("expected to get key pair"); + + // Let's start by adding this critical key to another identity + + let (another_master_key, _) = IdentityPublicKey::random_ecdsa_master_authentication_key( + 0, + Some(53), + platform_version, + ) + .expect("expected to get key pair"); + + let identity_already_in_system: Identity = IdentityV0 { + id: Identifier::random_with_rng(&mut rng), + public_keys: BTreeMap::from([ + (0, another_master_key.clone()), + (1, critical_public_key_that_is_already_in_system.clone()), + ]), + balance: 100000, + revision: 0, + } + .into(); + + // We just add this identity to the system first + + platform + .drive + .add_new_identity( + identity_already_in_system, + false, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to add a new identity"); + + signer.add_key( + critical_public_key_that_is_already_in_system.clone(), + private_key.clone(), + ); + + let (_, pk) = ECDSA_SECP256K1 + .random_public_and_private_key_data(&mut rng, platform_version) + .unwrap(); + + let asset_lock_proof = instant_asset_lock_proof_fixture( + Some(PrivateKey::from_slice(pk.as_slice(), Network::Testnet).unwrap()), + None, + ); + + let identifier = asset_lock_proof + .create_identifier() + .expect("expected an identifier"); + + let mut identity: Identity = IdentityV0 { + id: identifier, + public_keys: BTreeMap::from([ + (0, master_key.clone()), + (1, critical_public_key_that_is_already_in_system.clone()), + ]), + balance: 1000000000, + revision: 0, + } + .into(); + + let identity_create_transition: StateTransition = + IdentityCreateTransition::try_from_identity_with_signer( + &identity, + asset_lock_proof.clone(), + pk.as_slice(), + &signer, + &NativeBlsModule, + 0, + platform_version, + ) + .expect("expected an identity create transition"); + + let identity_create_serialized_transition = identity_create_transition + .serialize_to_bytes() + .expect("serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![identity_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.invalid_paid_count(), 1); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 0); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 10013800); // 10000000 penalty + 13800 processing + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit"); + + // let's try to replay the bad transaction + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![identity_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.invalid_paid_count(), 0); + + assert_eq!(processing_result.invalid_unpaid_count(), 1); + + assert_eq!(processing_result.valid_count(), 0); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 0); + + // Okay now let us try to reuse the asset lock + + let (new_public_key, new_private_key) = + IdentityPublicKey::random_ecdsa_critical_level_authentication_key( + 1, + Some(13), + platform_version, + ) + .expect("expected to get key pair"); + + signer.add_key(new_public_key.clone(), new_private_key.clone()); + + // let's set the new key to the identity (replacing the one that was causing the issue + identity.set_public_keys(BTreeMap::from([ + (0, master_key.clone()), + (1, new_public_key.clone()), + ])); + + let identity_create_transition: StateTransition = + IdentityCreateTransition::try_from_identity_with_signer( + &identity, + asset_lock_proof, + pk.as_slice(), + &signer, + &NativeBlsModule, + 0, + platform_version, + ) + .expect("expected an identity create transition"); + + let identity_create_serialized_transition = identity_create_transition + .serialize_to_bytes() + .expect("serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![identity_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.invalid_paid_count(), 0); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 1); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 3170170); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit"); + + let identity_balance = platform + .drive + .fetch_identity_balance(identity.id().into_buffer(), None, platform_version) + .expect("expected to get identity balance") + .expect("expected there to be an identity balance for this identity"); + + assert_eq!(identity_balance, 99911297030); // The identity balance is smaller than if there hadn't been any issue + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/state/v0/mod.rs index 3a552c8b84..bea657b54e 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/state/v0/mod.rs @@ -8,15 +8,16 @@ use dpp::consensus::signature::{BasicECDSAError, SignatureError}; use dpp::consensus::state::identity::IdentityAlreadyExistsError; use dpp::dashcore::hashes::Hash; -use dpp::dashcore::signer::double_sha; use dpp::dashcore::{signer, ScriptBuf, Txid}; use dpp::identity::KeyType; use dpp::identity::state_transition::AssetLockProved; use dpp::prelude::ConsensusValidationResult; use dpp::state_transition::identity_create_transition::accessors::IdentityCreateTransitionAccessorsV0; +use dpp::ProtocolError; use dpp::state_transition::identity_create_transition::IdentityCreateTransition; +use dpp::state_transition::signable_bytes_hasher::SignableBytesHasher; use dpp::state_transition::StateTransitionLike; use dpp::version::PlatformVersion; @@ -100,7 +101,15 @@ impl IdentityCreateStateTransitionStateValidationV0 for IdentityCreateTransition } else { // It's not valid, we need to give back the action that partially uses the asset lock - let used_credits = 1000; //todo: figure this out + let penalty = platform_version + .drive_abci + .validation_and_processing + .penalties + .unique_key_already_present; + + let used_credits = penalty + .checked_add(execution_context.fee_cost(platform_version)?.processing_fee) + .ok_or(ProtocolError::Overflow("processing fee overflow error"))?; let bump_action = PartiallyUseAssetLockAction::from_identity_create_transition_action( action, @@ -131,11 +140,15 @@ impl IdentityCreateStateTransitionStateValidationV0 for IdentityCreateTransition .required_asset_lock_duff_balance_for_processing_start_for_identity_create * CREDITS_PER_DUFF; + let signable_bytes_len = signable_bytes.len(); + + let mut signable_bytes_hasher = SignableBytesHasher::Bytes(signable_bytes); // Validate asset lock proof state // The required balance is in credits because we verify the asset lock value (which is in credits) let asset_lock_proof_validation = if validation_mode != ValidationMode::NoValidation { self.asset_lock_proof().validate( platform, + &mut signable_bytes_hasher, required_balance, validation_mode, transaction, @@ -208,6 +221,7 @@ impl IdentityCreateStateTransitionStateValidationV0 for IdentityCreateTransition initial_balance_amount, tx_out.script_pubkey.0, initial_balance_amount, + vec![], platform_version, )? }; @@ -226,7 +240,7 @@ impl IdentityCreateStateTransitionStateValidationV0 for IdentityCreateTransition )) })?; - let block_count = signable_bytes.len() as u16 / SHA256_BLOCK_SIZE; + let block_count = signable_bytes_len as u16 / SHA256_BLOCK_SIZE; execution_context.add_operation(ValidationOperation::DoubleSha256(block_count)); execution_context.add_operation(ValidationOperation::SignatureVerification( @@ -234,7 +248,7 @@ impl IdentityCreateStateTransitionStateValidationV0 for IdentityCreateTransition )); if let Err(e) = signer::verify_hash_signature( - &double_sha(signable_bytes), + &signable_bytes_hasher.hash_bytes().as_slice(), self.signature().as_slice(), public_key_hash, ) { @@ -246,6 +260,7 @@ impl IdentityCreateStateTransitionStateValidationV0 for IdentityCreateTransition match IdentityCreateTransitionAction::try_from_borrowed( self, + signable_bytes_hasher, asset_lock_value_to_be_consumed, ) { Ok(action) => Ok(ConsensusValidationResult::new_with_data(action.into())), diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/mod.rs index ff5a576737..670a1ac80c 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/mod.rs @@ -97,3 +97,148 @@ impl StateTransitionBasicStructureValidationV0 for IdentityTopUpTransition { } } } + +#[cfg(test)] +mod tests { + use crate::test::helpers::setup::TestPlatformBuilder; + use dpp::block::block_info::BlockInfo; + use dpp::dashcore::{Network, PrivateKey}; + use dpp::identity::accessors::IdentityGettersV0; + use dpp::identity::KeyType::ECDSA_SECP256K1; + use dpp::identity::{Identity, IdentityPublicKey, IdentityV0}; + use dpp::prelude::Identifier; + use dpp::serialization::PlatformSerializable; + use dpp::state_transition::identity_topup_transition::methods::IdentityTopUpTransitionMethodsV0; + use dpp::state_transition::identity_topup_transition::IdentityTopUpTransition; + use dpp::state_transition::StateTransition; + use dpp::tests::fixtures::instant_asset_lock_proof_fixture; + use platform_version::version::PlatformVersion; + use rand::prelude::StdRng; + use rand::SeedableRng; + use simple_signer::signer::SimpleSigner; + use std::collections::BTreeMap; + + #[test] + fn test_identity_top_up_validation() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure(); + + platform + .core_rpc + .expect_verify_instant_lock() + .returning(|_, _| Ok(true)); + + let platform_state = platform.state.load(); + + let mut signer = SimpleSigner::default(); + + let mut rng = StdRng::seed_from_u64(567); + + let (master_key, master_private_key) = + IdentityPublicKey::random_ecdsa_master_authentication_key( + 0, + Some(58), + platform_version, + ) + .expect("expected to get key pair"); + + signer.add_key(master_key.clone(), master_private_key.clone()); + + let (critical_public_key, private_key) = + IdentityPublicKey::random_ecdsa_critical_level_authentication_key( + 1, + Some(999), + platform_version, + ) + .expect("expected to get key pair"); + + let identity_already_in_system: Identity = IdentityV0 { + id: Identifier::random_with_rng(&mut rng), + public_keys: BTreeMap::from([ + (0, master_key.clone()), + (1, critical_public_key.clone()), + ]), + balance: 50000000000, + revision: 0, + } + .into(); + + // We just add this identity to the system first + + platform + .drive + .add_new_identity( + identity_already_in_system.clone(), + false, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to add a new identity"); + + signer.add_key(critical_public_key.clone(), private_key.clone()); + + let (_, pk) = ECDSA_SECP256K1 + .random_public_and_private_key_data(&mut rng, platform_version) + .unwrap(); + + let asset_lock_proof = instant_asset_lock_proof_fixture( + Some(PrivateKey::from_slice(pk.as_slice(), Network::Testnet).unwrap()), + None, + ); + + let identity_top_up_transition: StateTransition = + IdentityTopUpTransition::try_from_identity( + &identity_already_in_system, + asset_lock_proof, + pk.as_slice(), + 0, + platform_version, + None, + ) + .expect("expected an identity create transition"); + + let identity_top_up_serialized_transition = identity_top_up_transition + .serialize_to_bytes() + .expect("serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![identity_top_up_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.valid_count(), 1); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 1146640); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit"); + + let identity_balance = platform + .drive + .fetch_identity_balance( + identity_already_in_system.id().into_buffer(), + None, + platform_version, + ) + .expect("expected to get identity balance") + .expect("expected there to be an identity balance for this identity"); + + assert_eq!(identity_balance, 149993048360); // about 0.5 Dash starting balance + 1 Dash asset lock top up + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/transform_into_action/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/transform_into_action/v0/mod.rs index 4d56135158..003b05567d 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/transform_into_action/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/transform_into_action/v0/mod.rs @@ -7,7 +7,6 @@ use dpp::consensus::basic::identity::IdentityAssetLockTransactionOutPointNotEnou use dpp::consensus::signature::{BasicECDSAError, SignatureError}; use dpp::dashcore::hashes::Hash; -use dpp::dashcore::signer::double_sha; use dpp::dashcore::{signer, ScriptBuf, Txid}; use dpp::identity::state_transition::AssetLockProved; use dpp::identity::KeyType; @@ -15,6 +14,7 @@ use dpp::identity::KeyType; use dpp::prelude::ConsensusValidationResult; use dpp::state_transition::identity_topup_transition::IdentityTopUpTransition; +use dpp::state_transition::signable_bytes_hasher::SignableBytesHasher; use dpp::state_transition::StateTransitionLike; use dpp::version::PlatformVersion; @@ -62,10 +62,15 @@ impl IdentityTopUpStateTransitionStateValidationV0 for IdentityTopUpTransition { .asset_locks .required_asset_lock_duff_balance_for_processing_start_for_identity_top_up; + let signable_bytes_len = signable_bytes.len(); + + let mut signable_bytes_hasher = SignableBytesHasher::Bytes(signable_bytes); + // Validate asset lock proof state let asset_lock_proof_validation = if validation_mode != ValidationMode::NoValidation { self.asset_lock_proof().validate( platform, + &mut signable_bytes_hasher, required_balance, validation_mode, transaction, @@ -143,6 +148,7 @@ impl IdentityTopUpStateTransitionStateValidationV0 for IdentityTopUpTransition { initial_balance_amount, tx_out.script_pubkey.0, initial_balance_amount, + vec![], platform_version, )? }; @@ -161,7 +167,7 @@ impl IdentityTopUpStateTransitionStateValidationV0 for IdentityTopUpTransition { )) })?; - let block_count = signable_bytes.len() as u16 / SHA256_BLOCK_SIZE; + let block_count = signable_bytes_len as u16 / SHA256_BLOCK_SIZE; execution_context.add_operation(ValidationOperation::DoubleSha256(block_count)); execution_context.add_operation(ValidationOperation::SignatureVerification( @@ -169,7 +175,7 @@ impl IdentityTopUpStateTransitionStateValidationV0 for IdentityTopUpTransition { )); if let Err(e) = signer::verify_hash_signature( - &double_sha(signable_bytes), + &signable_bytes_hasher.hash_bytes().as_slice(), self.signature().as_slice(), public_key_hash, ) { @@ -181,6 +187,7 @@ impl IdentityTopUpStateTransitionStateValidationV0 for IdentityTopUpTransition { match IdentityTopUpTransitionAction::try_from_borrowed( self, + signable_bytes_hasher, asset_lock_value_to_be_consumed, ) { Ok(action) => Ok(ConsensusValidationResult::new_with_data(action.into())), diff --git a/packages/rs-drive-abci/tests/strategy_tests/main.rs b/packages/rs-drive-abci/tests/strategy_tests/main.rs index 3ca8b0768e..1b47dab90d 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/main.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/main.rs @@ -32,8 +32,6 @@ extern crate core; -use dashcore_rpc::dashcore::QuorumHash; - use dpp::bls_signatures::PrivateKey as BlsPrivateKey; use drive_abci::test::helpers::setup::TestPlatformBuilder; @@ -77,7 +75,7 @@ mod tests { use crate::strategy::{FailureStrategy, MasternodeListChangesStrategy}; use dashcore_rpc::dashcore::hashes::Hash; use dashcore_rpc::dashcore::BlockHash; - use dashcore_rpc::dashcore_rpc_json::{AssetUnlockStatus, ExtendedQuorumDetails}; + use dashcore_rpc::dashcore_rpc_json::AssetUnlockStatus; use dashcore_rpc::json::AssetUnlockStatusResult; use dpp::block::extended_block_info::v0::ExtendedBlockInfoV0Getters; use std::sync::{Arc, Mutex}; diff --git a/packages/rs-drive/src/drive/batch/transitions/system/partially_use_asset_lock.rs b/packages/rs-drive/src/drive/batch/transitions/system/partially_use_asset_lock.rs index 1e095610c2..cd6942e76a 100644 --- a/packages/rs-drive/src/drive/batch/transitions/system/partially_use_asset_lock.rs +++ b/packages/rs-drive/src/drive/batch/transitions/system/partially_use_asset_lock.rs @@ -17,10 +17,26 @@ impl DriveHighLevelOperationConverter for PartiallyUseAssetLockAction { ) -> Result>, Error> { let initial_credit_value = self.initial_credit_value(); // The remaining credit value is already computed here - let remaining_credit_value = self.remaining_credit_value(); + let mut remaining_credit_value = self.remaining_credit_value(); let used_credits = self.used_credits(); let asset_lock_outpoint = self.asset_lock_outpoint(); + let previous_transaction_hashes = if self.previous_transaction_hashes_ref().len() as u16 + >= platform_version + .drive_abci + .validation_and_processing + .state_transitions + .max_asset_lock_usage_attempts + { + // There have been 16 failed attempts at using the asset lock + // In this case the remaining credit value is burned and there is no need to keep around previous + // transaction hashes + remaining_credit_value = 0; + vec![] + } else { + self.previous_transaction_hashes_ref().clone() + }; + let tx_out_script = self.asset_lock_script_owned(); let drive_operations = vec![ @@ -33,6 +49,7 @@ impl DriveHighLevelOperationConverter for PartiallyUseAssetLockAction { initial_credit_value, tx_out_script, remaining_credit_value, + previous_transaction_hashes, platform_version, )?, }), diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_create/transformer.rs b/packages/rs-drive/src/state_transition_action/identity/identity_create/transformer.rs index a9704a1b9d..dc69bfea03 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_create/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_create/transformer.rs @@ -3,16 +3,19 @@ use crate::state_transition_action::identity::identity_create::IdentityCreateTra use dpp::asset_lock::reduced_asset_lock_value::AssetLockValue; use dpp::consensus::ConsensusError; use dpp::state_transition::identity_create_transition::IdentityCreateTransition; +use dpp::state_transition::signable_bytes_hasher::SignableBytesHasher; impl IdentityCreateTransitionAction { /// try from pub fn try_from( value: IdentityCreateTransition, + signable_bytes_hasher: SignableBytesHasher, asset_lock_value_to_be_consumed: AssetLockValue, ) -> Result { match value { IdentityCreateTransition::V0(v0) => Ok(IdentityCreateTransitionActionV0::try_from( v0, + signable_bytes_hasher, asset_lock_value_to_be_consumed, )? .into()), @@ -22,12 +25,14 @@ impl IdentityCreateTransitionAction { /// try from borrowed pub fn try_from_borrowed( value: &IdentityCreateTransition, + signable_bytes_hasher: SignableBytesHasher, asset_lock_value_to_be_consumed: AssetLockValue, ) -> Result { match value { IdentityCreateTransition::V0(v0) => { Ok(IdentityCreateTransitionActionV0::try_from_borrowed( v0, + signable_bytes_hasher, asset_lock_value_to_be_consumed, )? .into()) diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_create/v0/mod.rs b/packages/rs-drive/src/state_transition_action/identity/identity_create/v0/mod.rs index e8b36edda5..d8dda5fe29 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_create/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_create/v0/mod.rs @@ -9,12 +9,15 @@ use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV use dpp::identity::Identity; use dpp::platform_value::Bytes36; use dpp::prelude::UserFeeIncrease; +use dpp::state_transition::signable_bytes_hasher::SignableBytesHasher; use dpp::version::PlatformVersion; use dpp::ProtocolError; /// action v0 #[derive(Debug, Clone)] pub struct IdentityCreateTransitionActionV0 { + /// The state transition signable bytes hash + pub signable_bytes_hasher: SignableBytesHasher, /// public keys pub public_keys: Vec, /// the initial balance amount is equal to the remaining asset lock value diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_create/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/identity/identity_create/v0/transformer.rs index e103af7fde..aa2e379681 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_create/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_create/v0/transformer.rs @@ -3,6 +3,7 @@ use dpp::asset_lock::reduced_asset_lock_value::AssetLockValue; use dpp::consensus::basic::identity::IdentityAssetLockTransactionOutputNotFoundError; use dpp::consensus::ConsensusError; use dpp::platform_value::Bytes36; +use dpp::state_transition::signable_bytes_hasher::SignableBytesHasher; use dpp::state_transition::state_transitions::identity::identity_create_transition::v0::IdentityCreateTransitionV0; @@ -10,6 +11,7 @@ impl IdentityCreateTransitionActionV0 { /// try from pub fn try_from( value: IdentityCreateTransitionV0, + signable_bytes_hasher: SignableBytesHasher, asset_lock_value_to_be_consumed: AssetLockValue, ) -> Result { let IdentityCreateTransitionV0 { @@ -27,6 +29,7 @@ impl IdentityCreateTransitionActionV0 { })?; Ok(IdentityCreateTransitionActionV0 { + signable_bytes_hasher, public_keys: public_keys.into_iter().map(|a| a.into()).collect(), asset_lock_value_to_be_consumed, identity_id, @@ -38,6 +41,7 @@ impl IdentityCreateTransitionActionV0 { /// try from borrowed pub fn try_from_borrowed( value: &IdentityCreateTransitionV0, + signable_bytes_hasher: SignableBytesHasher, asset_lock_value_to_be_consumed: AssetLockValue, ) -> Result { let IdentityCreateTransitionV0 { @@ -56,6 +60,7 @@ impl IdentityCreateTransitionActionV0 { })?; Ok(IdentityCreateTransitionActionV0 { + signable_bytes_hasher, public_keys: public_keys.iter().map(|key| key.into()).collect(), asset_lock_value_to_be_consumed, identity_id: *identity_id, diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_topup/transformer.rs b/packages/rs-drive/src/state_transition_action/identity/identity_topup/transformer.rs index 9237137e0a..fb5083963b 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_topup/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_topup/transformer.rs @@ -3,30 +3,40 @@ use crate::state_transition_action::identity::identity_topup::IdentityTopUpTrans use dpp::asset_lock::reduced_asset_lock_value::AssetLockValue; use dpp::consensus::ConsensusError; use dpp::state_transition::identity_topup_transition::IdentityTopUpTransition; +use dpp::state_transition::signable_bytes_hasher::SignableBytesHasher; impl IdentityTopUpTransitionAction { /// try from pub fn try_from( value: IdentityTopUpTransition, + signable_bytes_hasher: SignableBytesHasher, top_up_asset_lock_value: AssetLockValue, ) -> Result { match value { - IdentityTopUpTransition::V0(v0) => { - Ok(IdentityTopUpTransitionActionV0::try_from(v0, top_up_asset_lock_value)?.into()) - } + IdentityTopUpTransition::V0(v0) => Ok(IdentityTopUpTransitionActionV0::try_from( + v0, + signable_bytes_hasher, + top_up_asset_lock_value, + )? + .into()), } } /// try from borrowed pub fn try_from_borrowed( value: &IdentityTopUpTransition, + signable_bytes_hasher: SignableBytesHasher, top_up_asset_lock_value: AssetLockValue, ) -> Result { match value { - IdentityTopUpTransition::V0(v0) => Ok( - IdentityTopUpTransitionActionV0::try_from_borrowed(v0, top_up_asset_lock_value)? - .into(), - ), + IdentityTopUpTransition::V0(v0) => { + Ok(IdentityTopUpTransitionActionV0::try_from_borrowed( + v0, + signable_bytes_hasher, + top_up_asset_lock_value, + )? + .into()) + } } } } diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_topup/v0/mod.rs b/packages/rs-drive/src/state_transition_action/identity/identity_topup/v0/mod.rs index 1d30375c0f..6d76476587 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_topup/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_topup/v0/mod.rs @@ -5,10 +5,13 @@ use dpp::identifier::Identifier; use dpp::asset_lock::reduced_asset_lock_value::AssetLockValue; use dpp::platform_value::Bytes36; use dpp::prelude::UserFeeIncrease; +use dpp::state_transition::signable_bytes_hasher::SignableBytesHasher; /// action v0 #[derive(Debug, Clone)] pub struct IdentityTopUpTransitionActionV0 { + /// The state transition signable bytes hash + pub signable_bytes_hasher: SignableBytesHasher, /// we top up the remaining amount of the asset lock value pub top_up_asset_lock_value: AssetLockValue, /// identity id diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_topup/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/identity/identity_topup/v0/transformer.rs index 64a034586f..fb6cd13b9b 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_topup/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_topup/v0/transformer.rs @@ -4,12 +4,14 @@ use dpp::consensus::basic::identity::IdentityAssetLockTransactionOutputNotFoundE use dpp::asset_lock::reduced_asset_lock_value::AssetLockValue; use dpp::consensus::ConsensusError; use dpp::platform_value::Bytes36; +use dpp::state_transition::signable_bytes_hasher::SignableBytesHasher; use dpp::state_transition::state_transitions::identity::identity_topup_transition::v0::IdentityTopUpTransitionV0; impl IdentityTopUpTransitionActionV0 { /// try from pub fn try_from( value: IdentityTopUpTransitionV0, + signable_bytes_hasher: SignableBytesHasher, top_up_asset_lock_value: AssetLockValue, ) -> Result { let IdentityTopUpTransitionV0 { @@ -26,6 +28,7 @@ impl IdentityTopUpTransitionActionV0 { })?; Ok(IdentityTopUpTransitionActionV0 { + signable_bytes_hasher, top_up_asset_lock_value, identity_id, asset_lock_outpoint: Bytes36::new(asset_lock_outpoint.into()), @@ -36,6 +39,7 @@ impl IdentityTopUpTransitionActionV0 { /// try from borrowed pub fn try_from_borrowed( value: &IdentityTopUpTransitionV0, + signable_bytes_hasher: SignableBytesHasher, top_up_asset_lock_value: AssetLockValue, ) -> Result { let IdentityTopUpTransitionV0 { @@ -52,6 +56,7 @@ impl IdentityTopUpTransitionActionV0 { })?; Ok(IdentityTopUpTransitionActionV0 { + signable_bytes_hasher, top_up_asset_lock_value, identity_id: *identity_id, asset_lock_outpoint: Bytes36::new(asset_lock_outpoint.into()), diff --git a/packages/rs-drive/src/state_transition_action/system/partially_use_asset_lock_action/mod.rs b/packages/rs-drive/src/state_transition_action/system/partially_use_asset_lock_action/mod.rs index 539aa0b187..bd7ad59334 100644 --- a/packages/rs-drive/src/state_transition_action/system/partially_use_asset_lock_action/mod.rs +++ b/packages/rs-drive/src/state_transition_action/system/partially_use_asset_lock_action/mod.rs @@ -1,7 +1,7 @@ use crate::state_transition_action::system::partially_use_asset_lock_action::v0::PartiallyUseAssetLockActionV0; use derive_more::From; use dpp::fee::Credits; -use dpp::platform_value::Bytes36; +use dpp::platform_value::{Bytes32, Bytes36}; use dpp::prelude::UserFeeIncrease; mod transformer; @@ -58,4 +58,10 @@ impl PartiallyUseAssetLockActionAccessorsV0 for PartiallyUseAssetLockAction { PartiallyUseAssetLockAction::V0(transition) => transition.user_fee_increase, } } + + fn previous_transaction_hashes_ref(&self) -> &Vec { + match self { + PartiallyUseAssetLockAction::V0(transition) => &transition.previous_transaction_hashes, + } + } } diff --git a/packages/rs-drive/src/state_transition_action/system/partially_use_asset_lock_action/transformer.rs b/packages/rs-drive/src/state_transition_action/system/partially_use_asset_lock_action/transformer.rs index 89848e8ccd..973683ed02 100644 --- a/packages/rs-drive/src/state_transition_action/system/partially_use_asset_lock_action/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/system/partially_use_asset_lock_action/transformer.rs @@ -2,8 +2,12 @@ use crate::state_transition_action::identity::identity_create::IdentityCreateTra use crate::state_transition_action::identity::identity_topup::IdentityTopUpTransitionAction; use crate::state_transition_action::system::partially_use_asset_lock_action::v0::PartiallyUseAssetLockActionV0; use crate::state_transition_action::system::partially_use_asset_lock_action::PartiallyUseAssetLockAction; +use dpp::consensus::basic::value_error::ValueError; +use dpp::consensus::basic::BasicError; use dpp::consensus::ConsensusError; use dpp::fee::Credits; +use dpp::platform_value::Bytes32; +use dpp::serialization::Signable; use dpp::state_transition::identity_create_transition::IdentityCreateTransition; use dpp::state_transition::identity_topup_transition::IdentityTopUpTransition; @@ -14,15 +18,23 @@ impl PartiallyUseAssetLockAction { asset_lock_initial_balance_amount: Credits, asset_lock_output_script: Vec, asset_lock_remaining_balance_amount: Credits, + previous_transaction_hashes: Vec, used_credits: Credits, ) -> Result { + let signable_bytes = value.signable_bytes().map_err(|e| { + ConsensusError::BasicError(BasicError::ValueError(ValueError::new_from_string( + e.to_string(), + ))) + })?; match value { IdentityCreateTransition::V0(v0) => Ok( PartiallyUseAssetLockActionV0::try_from_identity_create_transition( v0, + signable_bytes, asset_lock_initial_balance_amount, asset_lock_output_script, asset_lock_remaining_balance_amount, + previous_transaction_hashes, used_credits, )? .into(), @@ -36,15 +48,23 @@ impl PartiallyUseAssetLockAction { asset_lock_initial_balance_amount: Credits, asset_lock_output_script: Vec, asset_lock_remaining_balance_amount: Credits, + previous_transaction_hashes: Vec, used_credits: Credits, ) -> Result { + let signable_bytes = value.signable_bytes().map_err(|e| { + ConsensusError::BasicError(BasicError::ValueError(ValueError::new_from_string( + e.to_string(), + ))) + })?; match value { IdentityCreateTransition::V0(v0) => Ok( PartiallyUseAssetLockActionV0::try_from_borrowed_identity_create_transition( v0, + signable_bytes, asset_lock_initial_balance_amount, asset_lock_output_script, asset_lock_remaining_balance_amount, + previous_transaction_hashes, used_credits, )? .into(), @@ -90,15 +110,24 @@ impl PartiallyUseAssetLockAction { asset_lock_initial_balance_amount: Credits, asset_lock_output_script: Vec, asset_lock_remaining_balance_amount: Credits, + previous_transaction_hashes: Vec, used_credits: Credits, ) -> Result { + let signable_bytes = value.signable_bytes().map_err(|e| { + ConsensusError::BasicError(BasicError::ValueError(ValueError::new_from_string( + e.to_string(), + ))) + })?; + match value { IdentityTopUpTransition::V0(v0) => Ok( PartiallyUseAssetLockActionV0::try_from_identity_top_up_transition( v0, + signable_bytes, asset_lock_initial_balance_amount, asset_lock_output_script, asset_lock_remaining_balance_amount, + previous_transaction_hashes, used_credits, )? .into(), @@ -112,15 +141,24 @@ impl PartiallyUseAssetLockAction { asset_lock_initial_balance_amount: Credits, asset_lock_output_script: Vec, asset_lock_remaining_balance_amount: Credits, + previous_transaction_hashes: Vec, used_credits: Credits, ) -> Result { + let signable_bytes = value.signable_bytes().map_err(|e| { + ConsensusError::BasicError(BasicError::ValueError(ValueError::new_from_string( + e.to_string(), + ))) + })?; + match value { IdentityTopUpTransition::V0(v0) => Ok( PartiallyUseAssetLockActionV0::try_from_borrowed_identity_top_up_transition( v0, + signable_bytes, asset_lock_initial_balance_amount, asset_lock_output_script, asset_lock_remaining_balance_amount, + previous_transaction_hashes, used_credits, )? .into(), diff --git a/packages/rs-drive/src/state_transition_action/system/partially_use_asset_lock_action/v0/mod.rs b/packages/rs-drive/src/state_transition_action/system/partially_use_asset_lock_action/v0/mod.rs index d6dac97468..56ff3f5047 100644 --- a/packages/rs-drive/src/state_transition_action/system/partially_use_asset_lock_action/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/system/partially_use_asset_lock_action/v0/mod.rs @@ -1,5 +1,5 @@ use dpp::fee::Credits; -use dpp::platform_value::Bytes36; +use dpp::platform_value::{Bytes32, Bytes36}; use dpp::prelude::UserFeeIncrease; mod transformer; #[derive(Default, Debug, Clone)] @@ -8,6 +8,8 @@ pub struct PartiallyUseAssetLockActionV0 { pub asset_lock_outpoint: Bytes36, /// initial credit value pub initial_credit_value: Credits, + /// the previous transaction signable bytes hashes that tried to used this asset lock, but failed + pub previous_transaction_hashes: Vec, /// asset lock script pub asset_lock_script: Vec, /// remaining credit value AFTER used credits are deducted @@ -35,4 +37,7 @@ pub trait PartiallyUseAssetLockActionAccessorsV0 { fn used_credits(&self) -> Credits; /// fee multiplier fn user_fee_increase(&self) -> UserFeeIncrease; + + /// the previous transaction signable bytes hashes that tried to used this asset lock, but failed + fn previous_transaction_hashes_ref(&self) -> &Vec; } diff --git a/packages/rs-drive/src/state_transition_action/system/partially_use_asset_lock_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/system/partially_use_asset_lock_action/v0/transformer.rs index 859f8e0a93..ced93e1e26 100644 --- a/packages/rs-drive/src/state_transition_action/system/partially_use_asset_lock_action/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/system/partially_use_asset_lock_action/v0/transformer.rs @@ -5,19 +5,25 @@ use dpp::asset_lock::reduced_asset_lock_value::AssetLockValueGettersV0; use dpp::consensus::basic::identity::IdentityAssetLockTransactionOutputNotFoundError; use dpp::consensus::ConsensusError; use dpp::fee::Credits; -use dpp::platform_value::Bytes36; +use dpp::platform_value::{Bytes32, Bytes36}; use dpp::state_transition::identity_create_transition::v0::IdentityCreateTransitionV0; use dpp::state_transition::identity_topup_transition::v0::IdentityTopUpTransitionV0; +use dpp::util::hash::hash_double; impl PartiallyUseAssetLockActionV0 { /// try from identity create transition pub fn try_from_identity_create_transition( value: IdentityCreateTransitionV0, + signable_bytes: Vec, asset_lock_initial_balance_amount: Credits, asset_lock_output_script: Vec, asset_lock_remaining_balance_amount: Credits, + mut previous_transaction_hashes: Vec, desired_used_credits: Credits, ) -> Result { + let signable_bytes_hash = hash_double(signable_bytes); + previous_transaction_hashes.push(signable_bytes_hash.into()); + let IdentityCreateTransitionV0 { asset_lock_proof, user_fee_increase, @@ -41,6 +47,7 @@ impl PartiallyUseAssetLockActionV0 { Ok(PartiallyUseAssetLockActionV0 { asset_lock_outpoint: Bytes36::new(asset_lock_outpoint.into()), initial_credit_value: asset_lock_initial_balance_amount, + previous_transaction_hashes, asset_lock_script: asset_lock_output_script, remaining_credit_value: remaining_balance_after_used_credits_are_deducted, used_credits, @@ -51,11 +58,16 @@ impl PartiallyUseAssetLockActionV0 { /// try from borrowed identity create transition pub fn try_from_borrowed_identity_create_transition( value: &IdentityCreateTransitionV0, + signable_bytes: Vec, asset_lock_initial_balance_amount: Credits, asset_lock_output_script: Vec, asset_lock_remaining_balance_amount: Credits, + mut previous_transaction_hashes: Vec, desired_used_credits: Credits, ) -> Result { + let signable_bytes_hash = hash_double(signable_bytes); + previous_transaction_hashes.push(signable_bytes_hash.into()); + let IdentityCreateTransitionV0 { asset_lock_proof, user_fee_increase, @@ -80,6 +92,7 @@ impl PartiallyUseAssetLockActionV0 { Ok(PartiallyUseAssetLockActionV0 { asset_lock_outpoint: Bytes36::new(asset_lock_outpoint.into()), initial_credit_value: asset_lock_initial_balance_amount, + previous_transaction_hashes, asset_lock_script: asset_lock_output_script, remaining_credit_value: remaining_balance_after_used_credits_are_deducted, used_credits, @@ -93,6 +106,7 @@ impl PartiallyUseAssetLockActionV0 { desired_used_credits: Credits, ) -> Self { let IdentityCreateTransitionActionV0 { + signable_bytes_hasher, asset_lock_outpoint, asset_lock_value_to_be_consumed, user_fee_increase, @@ -108,9 +122,15 @@ impl PartiallyUseAssetLockActionV0 { desired_used_credits, ); + //todo: remove clone + let mut used_tags = asset_lock_value_to_be_consumed.used_tags_ref().clone(); + + used_tags.push(signable_bytes_hasher.into_hashed_bytes()); + PartiallyUseAssetLockActionV0 { asset_lock_outpoint, initial_credit_value: asset_lock_value_to_be_consumed.initial_credit_value(), + previous_transaction_hashes: used_tags, asset_lock_script: asset_lock_value_to_be_consumed.tx_out_script_owned(), remaining_credit_value: remaining_balance_after_used_credits_are_deducted, used_credits, @@ -124,6 +144,7 @@ impl PartiallyUseAssetLockActionV0 { desired_used_credits: Credits, ) -> Self { let IdentityCreateTransitionActionV0 { + signable_bytes_hasher, asset_lock_outpoint, asset_lock_value_to_be_consumed, user_fee_increase, @@ -139,9 +160,14 @@ impl PartiallyUseAssetLockActionV0 { desired_used_credits, ); + let mut used_tags = asset_lock_value_to_be_consumed.used_tags_ref().clone(); + + used_tags.push(signable_bytes_hasher.to_hashed_bytes()); + PartiallyUseAssetLockActionV0 { asset_lock_outpoint: *asset_lock_outpoint, initial_credit_value: asset_lock_value_to_be_consumed.initial_credit_value(), + previous_transaction_hashes: used_tags, asset_lock_script: asset_lock_value_to_be_consumed.tx_out_script().clone(), remaining_credit_value: remaining_balance_after_used_credits_are_deducted, used_credits, @@ -152,11 +178,16 @@ impl PartiallyUseAssetLockActionV0 { /// try from identity top up transition pub fn try_from_identity_top_up_transition( value: IdentityTopUpTransitionV0, + signable_bytes: Vec, asset_lock_initial_balance_amount: Credits, asset_lock_output_script: Vec, asset_lock_remaining_balance_amount: Credits, + mut previous_transaction_hashes: Vec, desired_used_credits: Credits, ) -> Result { + let signable_bytes_hash = hash_double(signable_bytes); + previous_transaction_hashes.push(signable_bytes_hash.into()); + let IdentityTopUpTransitionV0 { asset_lock_proof, user_fee_increase, @@ -180,6 +211,7 @@ impl PartiallyUseAssetLockActionV0 { Ok(PartiallyUseAssetLockActionV0 { asset_lock_outpoint: Bytes36::new(asset_lock_outpoint.into()), initial_credit_value: asset_lock_initial_balance_amount, + previous_transaction_hashes, asset_lock_script: asset_lock_output_script, remaining_credit_value: remaining_balance_after_used_credits_are_deducted, used_credits, @@ -190,11 +222,16 @@ impl PartiallyUseAssetLockActionV0 { /// try from borrowed identity top up transition pub fn try_from_borrowed_identity_top_up_transition( value: &IdentityTopUpTransitionV0, + signable_bytes: Vec, asset_lock_initial_balance_amount: Credits, asset_lock_output_script: Vec, asset_lock_remaining_balance_amount: Credits, + mut previous_transaction_hashes: Vec, desired_used_credits: Credits, ) -> Result { + let signable_bytes_hash = hash_double(signable_bytes); + previous_transaction_hashes.push(signable_bytes_hash.into()); + let IdentityTopUpTransitionV0 { asset_lock_proof, user_fee_increase, @@ -218,6 +255,7 @@ impl PartiallyUseAssetLockActionV0 { Ok(PartiallyUseAssetLockActionV0 { asset_lock_outpoint: Bytes36::new(asset_lock_outpoint.into()), initial_credit_value: asset_lock_initial_balance_amount, + previous_transaction_hashes, asset_lock_script: asset_lock_output_script, remaining_credit_value: remaining_balance_after_used_credits_are_deducted, used_credits, @@ -231,6 +269,7 @@ impl PartiallyUseAssetLockActionV0 { desired_used_credits: Credits, ) -> Self { let IdentityTopUpTransitionActionV0 { + signable_bytes_hasher, asset_lock_outpoint, top_up_asset_lock_value, user_fee_increase, @@ -246,9 +285,14 @@ impl PartiallyUseAssetLockActionV0 { desired_used_credits, ); + let mut used_tags = top_up_asset_lock_value.used_tags_ref().clone(); + + used_tags.push(signable_bytes_hasher.into_hashed_bytes()); + PartiallyUseAssetLockActionV0 { asset_lock_outpoint, initial_credit_value: top_up_asset_lock_value.initial_credit_value(), + previous_transaction_hashes: used_tags, asset_lock_script: top_up_asset_lock_value.tx_out_script_owned(), remaining_credit_value: remaining_balance_after_used_credits_are_deducted, used_credits, @@ -262,6 +306,7 @@ impl PartiallyUseAssetLockActionV0 { desired_used_credits: Credits, ) -> Self { let IdentityTopUpTransitionActionV0 { + signable_bytes_hasher, asset_lock_outpoint, top_up_asset_lock_value, user_fee_increase, @@ -277,9 +322,14 @@ impl PartiallyUseAssetLockActionV0 { desired_used_credits, ); + let mut used_tags = top_up_asset_lock_value.used_tags_ref().clone(); + + used_tags.push(signable_bytes_hasher.to_hashed_bytes()); + PartiallyUseAssetLockActionV0 { asset_lock_outpoint: *asset_lock_outpoint, initial_credit_value: top_up_asset_lock_value.initial_credit_value(), + previous_transaction_hashes: used_tags, asset_lock_script: top_up_asset_lock_value.tx_out_script().clone(), remaining_credit_value: remaining_balance_after_used_credits_are_deducted, used_credits, diff --git a/packages/rs-platform-version/src/version/drive_abci_versions.rs b/packages/rs-platform-version/src/version/drive_abci_versions.rs index a397a20c66..525fab2783 100644 --- a/packages/rs-platform-version/src/version/drive_abci_versions.rs +++ b/packages/rs-platform-version/src/version/drive_abci_versions.rs @@ -87,6 +87,7 @@ pub struct DriveAbciValidationVersions { #[derive(Clone, Debug, Default)] pub struct PenaltyAmounts { pub identity_id_not_correct: u64, + pub unique_key_already_present: u64, pub validation_of_added_keys_structure_failure: u64, pub validation_of_added_keys_proof_of_possession_failure: u64, } @@ -144,6 +145,7 @@ pub struct DriveAbciStateTransitionValidationVersion { #[derive(Clone, Debug, Default)] pub struct DriveAbciStateTransitionValidationVersions { pub common_validation_methods: DriveAbciStateTransitionCommonValidationVersions, + pub max_asset_lock_usage_attempts: u16, pub identity_create_state_transition: DriveAbciStateTransitionValidationVersion, pub identity_update_state_transition: DriveAbciStateTransitionValidationVersion, pub identity_top_up_state_transition: DriveAbciStateTransitionValidationVersion, diff --git a/packages/rs-platform-version/src/version/mocks/v2_test.rs b/packages/rs-platform-version/src/version/mocks/v2_test.rs index 18e6315f6e..6d6e27f9f9 100644 --- a/packages/rs-platform-version/src/version/mocks/v2_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v2_test.rs @@ -605,6 +605,7 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { validate_master_key_uniqueness: 0, validate_simple_pre_check_balance: 0, }, + max_asset_lock_usage_attempts: 16, identity_create_state_transition: DriveAbciStateTransitionValidationVersion { basic_structure: Some(0), advanced_structure: Some(0), @@ -700,9 +701,10 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { process_state_transition: 0, state_transition_to_execution_event_for_check_tx: 0, penalties: PenaltyAmounts { - identity_id_not_correct: 5000000, - validation_of_added_keys_structure_failure: 1000000, - validation_of_added_keys_proof_of_possession_failure: 5000000, + identity_id_not_correct: 50000000, + unique_key_already_present: 10000000, + validation_of_added_keys_structure_failure: 10000000, + validation_of_added_keys_proof_of_possession_failure: 50000000, }, }, query: DriveAbciQueryVersions { diff --git a/packages/rs-platform-version/src/version/mocks/v3_test.rs b/packages/rs-platform-version/src/version/mocks/v3_test.rs index f5e31dfb19..5ae94aac34 100644 --- a/packages/rs-platform-version/src/version/mocks/v3_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v3_test.rs @@ -605,6 +605,7 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { validate_master_key_uniqueness: 0, validate_simple_pre_check_balance: 0, }, + max_asset_lock_usage_attempts: 16, identity_create_state_transition: DriveAbciStateTransitionValidationVersion { basic_structure: Some(0), advanced_structure: Some(0), @@ -700,9 +701,10 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { process_state_transition: 0, state_transition_to_execution_event_for_check_tx: 0, penalties: PenaltyAmounts { - identity_id_not_correct: 5000000, - validation_of_added_keys_structure_failure: 1000000, - validation_of_added_keys_proof_of_possession_failure: 5000000, + identity_id_not_correct: 50000000, + unique_key_already_present: 10000000, + validation_of_added_keys_structure_failure: 10000000, + validation_of_added_keys_proof_of_possession_failure: 50000000, }, }, query: DriveAbciQueryVersions { diff --git a/packages/rs-platform-version/src/version/v1.rs b/packages/rs-platform-version/src/version/v1.rs index 9f3f64a369..bde06330eb 100644 --- a/packages/rs-platform-version/src/version/v1.rs +++ b/packages/rs-platform-version/src/version/v1.rs @@ -604,6 +604,7 @@ pub const PLATFORM_V1: PlatformVersion = PlatformVersion { validate_master_key_uniqueness: 0, validate_simple_pre_check_balance: 0, }, + max_asset_lock_usage_attempts: 16, identity_create_state_transition: DriveAbciStateTransitionValidationVersion { basic_structure: Some(0), advanced_structure: Some(0), @@ -699,9 +700,10 @@ pub const PLATFORM_V1: PlatformVersion = PlatformVersion { process_state_transition: 0, state_transition_to_execution_event_for_check_tx: 0, penalties: PenaltyAmounts { - identity_id_not_correct: 5000000, - validation_of_added_keys_structure_failure: 1000000, - validation_of_added_keys_proof_of_possession_failure: 5000000, + identity_id_not_correct: 50000000, + unique_key_already_present: 10000000, + validation_of_added_keys_structure_failure: 10000000, + validation_of_added_keys_proof_of_possession_failure: 50000000, }, }, query: DriveAbciQueryVersions { diff --git a/packages/rs-sdk/src/platform/transition/broadcast_identity.rs b/packages/rs-sdk/src/platform/transition/broadcast_identity.rs index bcb806e874..744bd158c4 100644 --- a/packages/rs-sdk/src/platform/transition/broadcast_identity.rs +++ b/packages/rs-sdk/src/platform/transition/broadcast_identity.rs @@ -110,6 +110,7 @@ impl BroadcastRequestForNewIdentity { @@ -788,6 +789,7 @@ pub fn create_state_transitions_for_identities( pk.as_slice(), signer, &NativeBlsModule, + 0, platform_version, ) .expect("expected to transform identity into identity create transition"); diff --git a/packages/wasm-dpp/src/errors/consensus/basic/identity/identity_asset_lock_state_transition_replay_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/identity/identity_asset_lock_state_transition_replay_error.rs new file mode 100644 index 0000000000..997414b434 --- /dev/null +++ b/packages/wasm-dpp/src/errors/consensus/basic/identity/identity_asset_lock_state_transition_replay_error.rs @@ -0,0 +1,47 @@ +use dpp::consensus::basic::identity::IdentityAssetLockStateTransitionReplayError; +use dpp::consensus::codes::ErrorWithCode; +use dpp::consensus::ConsensusError; + +use dpp::dashcore::hashes::Hash; +use wasm_bindgen::prelude::*; + +use crate::buffer::Buffer; + +#[wasm_bindgen(js_name=IdentityAssetLockTransactionReplayError)] +pub struct IdentityAssetLockStateTransitionReplayErrorWasm { + inner: IdentityAssetLockStateTransitionReplayError, +} + +impl From<&IdentityAssetLockStateTransitionReplayError> + for IdentityAssetLockStateTransitionReplayErrorWasm +{ + fn from(e: &IdentityAssetLockStateTransitionReplayError) -> Self { + Self { inner: e.clone() } + } +} + +#[wasm_bindgen(js_class=IdentityAssetLockTransactionReplayError)] +impl IdentityAssetLockStateTransitionReplayErrorWasm { + #[wasm_bindgen(js_name=getTransactionId)] + pub fn transaction_id(&self) -> Buffer { + let tx_id = self.inner.transaction_id(); + let mut tx_id_bytes = tx_id.to_byte_array(); + tx_id_bytes.reverse(); + Buffer::from_bytes(&tx_id_bytes) + } + + #[wasm_bindgen(js_name=getCode)] + pub fn code(&self) -> u32 { + ConsensusError::from(self.inner.clone()).code() + } + #[wasm_bindgen(js_name=getStateTransitionId)] + pub fn state_transition_id(&self) -> Buffer { + let state_transition_id = self.inner.state_transition_id(); + let state_transition_id_bytes = state_transition_id.to_buffer(); + Buffer::from_bytes(&state_transition_id_bytes) + } + #[wasm_bindgen(js_name=getOutputIndex)] + pub fn output_index(&self) -> usize { + self.inner.output_index() + } +} diff --git a/packages/wasm-dpp/src/errors/consensus/basic/identity/mod.rs b/packages/wasm-dpp/src/errors/consensus/basic/identity/mod.rs index f3e7b517cf..7508eccc97 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/identity/mod.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/identity/mod.rs @@ -1,6 +1,7 @@ mod duplicated_identity_public_key_error; mod duplicated_identity_public_key_id_error; mod identity_asset_lock_proof_locked_transaction_mismatch_error; +mod identity_asset_lock_state_transition_replay_error; mod identity_asset_lock_transaction_is_not_found_error; mod identity_asset_lock_transaction_out_point_already_exists_error; mod identity_asset_lock_transaction_output_not_found_error; @@ -29,6 +30,7 @@ mod missing_public_key_error; pub use duplicated_identity_public_key_error::*; pub use duplicated_identity_public_key_id_error::*; pub use identity_asset_lock_proof_locked_transaction_mismatch_error::*; +pub use identity_asset_lock_state_transition_replay_error::*; pub use identity_asset_lock_transaction_is_not_found_error::*; pub use identity_asset_lock_transaction_out_point_already_exists_error::*; pub use identity_asset_lock_transaction_output_not_found_error::*; diff --git a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs index bee5b8b088..43fa867425 100644 --- a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs @@ -8,6 +8,7 @@ use dpp::consensus::ConsensusError as DPPConsensusError; use crate::errors::consensus::basic::identity::{ DuplicatedIdentityPublicKeyErrorWasm, DuplicatedIdentityPublicKeyIdErrorWasm, IdentityAssetLockProofLockedTransactionMismatchErrorWasm, + IdentityAssetLockStateTransitionReplayErrorWasm, IdentityAssetLockTransactionIsNotFoundErrorWasm, IdentityAssetLockTransactionOutPointAlreadyExistsErrorWasm, IdentityAssetLockTransactionOutPointNotEnoughBalanceErrorWasm, @@ -36,7 +37,7 @@ use dpp::consensus::basic::BasicError; use dpp::consensus::basic::BasicError::{ DuplicatedIdentityPublicKeyBasicError, DuplicatedIdentityPublicKeyIdBasicError, IdentityAssetLockProofLockedTransactionMismatchError, - IdentityAssetLockTransactionIsNotFoundError, + IdentityAssetLockStateTransitionReplayError, IdentityAssetLockTransactionIsNotFoundError, IdentityAssetLockTransactionOutPointAlreadyConsumedError, IdentityAssetLockTransactionOutPointNotEnoughBalanceError, IdentityAssetLockTransactionOutputNotFoundError, IncompatibleProtocolVersionError, @@ -369,6 +370,9 @@ fn from_basic_error(basic_error: &BasicError) -> JsValue { InvalidIdentityAssetLockTransactionOutputError(e) => { InvalidIdentityAssetLockTransactionOutputErrorWasm::from(e).into() } + IdentityAssetLockStateTransitionReplayError(e) => { + IdentityAssetLockStateTransitionReplayErrorWasm::from(e).into() + } InvalidAssetLockTransactionOutputReturnSizeError(e) => { InvalidAssetLockTransactionOutputReturnSizeErrorWasm::from(e).into() } From 36a7dcc4a646bd0305e4462727ca65d9dcbf91af Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Thu, 18 Apr 2024 21:36:54 +0700 Subject: [PATCH 137/191] fix(platform)!: a withdrawal failure from core should never cause platform to stop (#1821) --- packages/rs-drive-abci/src/error/execution.rs | 4 ++ .../engine/finalize_block_proposal/v0/mod.rs | 46 ++++++++++--------- .../v0/mod.rs | 46 +++++++++++++++++-- 3 files changed, 69 insertions(+), 27 deletions(-) diff --git a/packages/rs-drive-abci/src/error/execution.rs b/packages/rs-drive-abci/src/error/execution.rs index 165bbe4f75..dfa77b882c 100644 --- a/packages/rs-drive-abci/src/error/execution.rs +++ b/packages/rs-drive-abci/src/error/execution.rs @@ -121,4 +121,8 @@ pub enum ExecutionError { /// General Bls Error #[error("bls error: {0}")] BlsErrorGeneral(#[from] BlsError), + + /// General IO Error + #[error("io error: {0}")] + IOError(#[from] std::io::Error), } diff --git a/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/v0/mod.rs b/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/v0/mod.rs index 3eccc5a02d..ae78f60361 100644 --- a/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/v0/mod.rs @@ -204,28 +204,30 @@ where .unsigned_withdrawal_transactions_mut() .drain(); - // Drain signatures instead of cloning - let signatures = commit_info - .threshold_vote_extensions - .drain(..) - .map(|vote_extension| { - let signature_bytes: [u8; 96] = - vote_extension.signature.try_into().map_err(|e| { - AbciError::BadRequestDataSize(format!( - "invalid vote extension signature size: {}", - hex::encode(e) - )) - })?; - - Ok(BLSSignature::from(signature_bytes)) - }) - .collect::>()?; - - self.append_signatures_and_broadcast_withdrawal_transactions( - unsigned_withdrawal_transactions, - signatures, - platform_version, - )?; + if !unsigned_withdrawal_transactions.is_empty() { + // Drain signatures instead of cloning + let signatures = commit_info + .threshold_vote_extensions + .drain(..) + .map(|vote_extension| { + let signature_bytes: [u8; 96] = + vote_extension.signature.try_into().map_err(|e| { + AbciError::BadRequestDataSize(format!( + "invalid vote extension signature size: {}", + hex::encode(e) + )) + })?; + + Ok(BLSSignature::from(signature_bytes)) + }) + .collect::>()?; + + self.append_signatures_and_broadcast_withdrawal_transactions( + unsigned_withdrawal_transactions, + signatures, + platform_version, + )?; + } // Update platform (drive abci) state diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/append_signatures_and_broadcast_withdrawal_transactions/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/append_signatures_and_broadcast_withdrawal_transactions/v0/mod.rs index 035bc11a79..30b429c6b6 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/append_signatures_and_broadcast_withdrawal_transactions/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/append_signatures_and_broadcast_withdrawal_transactions/v0/mod.rs @@ -9,8 +9,12 @@ use crate::rpc::core::{ use dashcore_rpc::jsonrpc; use dashcore_rpc::Error as CoreRPCError; use dpp::dashcore::bls_sig_utils::BLSSignature; -use dpp::dashcore::consensus; use dpp::dashcore::transaction::special_transaction::TransactionPayload::AssetUnlockPayloadType; +use dpp::dashcore::{consensus, Txid}; + +use std::fs::{self, File}; +use std::io::Write; +use std::time::{SystemTime, UNIX_EPOCH}; impl Platform where @@ -36,6 +40,8 @@ where unsigned_withdrawal_transactions.len(), ); + let mut transaction_submission_failures = vec![]; + for (mut transaction, signature) in unsigned_withdrawal_transactions.into_iter().zip(signatures) { @@ -65,12 +71,15 @@ where index ); } - // Ignore errors that can happen during blockchain catching. + // Ignore errors that can happen during blockchain synchronization. // They will be logged with dashcore_rpc Err(CoreRPCError::JsonRpc(jsonrpc::error::Error::Rpc(e))) if e.code == CORE_RPC_TX_ALREADY_IN_CHAIN || e.message == CORE_RPC_ERROR_ASSET_UNLOCK_NO_ACTIVE_QUORUM - || e.message == CORE_RPC_ERROR_ASSET_UNLOCK_EXPIRED => {} + || e.message == CORE_RPC_ERROR_ASSET_UNLOCK_EXPIRED => + { + // These will never work again + } // Errors that can happen if we created invalid tx or Core isn't responding Err(e) => { tracing::error!( @@ -80,12 +89,39 @@ where index, e ); - - return Err(e.into()); + // These errors might allow the state transition to be broadcast in the future + transaction_submission_failures.push((transaction.txid(), tx_bytes)); } } } + store_transaction_failures(transaction_submission_failures) + .map_err(|e| Error::Execution(e.into()))?; + Ok(()) } } + +// Function to handle the storage of transaction submission failures +fn store_transaction_failures(failures: Vec<(Txid, Vec)>) -> std::io::Result<()> { + // Ensure the directory exists + let dir_path = "transaction_submission_failures"; + fs::create_dir_all(dir_path)?; + + // Get the current timestamp + let timestamp = SystemTime::now() + .duration_since(UNIX_EPOCH) + .expect("expected system time to be after unix epoch time") + .as_secs(); + + for (tx_id, transaction) in failures { + // Create the file name + let file_name = format!("{}/tx_{}_{}.dat", dir_path, timestamp, tx_id); + + // Write the bytes to the file + let mut file = File::create(file_name)?; + file.write_all(&transaction)?; + } + + Ok(()) +} From 5d51032ca5781a1324d1f5c3c4a7b4001a3547df Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Thu, 18 Apr 2024 22:29:00 +0700 Subject: [PATCH 138/191] chore: bump to dev.11 (#1822) --- Cargo.lock | 46 +++++++++---------- package.json | 2 +- packages/bench-suite/package.json | 2 +- packages/dapi-grpc/Cargo.toml | 2 +- packages/dapi-grpc/package.json | 2 +- packages/dapi/package.json | 2 +- packages/dash-spv/package.json | 2 +- packages/dashmate/package.json | 2 +- packages/dashpay-contract/Cargo.toml | 2 +- packages/dashpay-contract/package.json | 2 +- packages/data-contracts/Cargo.toml | 2 +- packages/dpns-contract/Cargo.toml | 2 +- packages/dpns-contract/package.json | 2 +- packages/feature-flags-contract/Cargo.toml | 2 +- packages/feature-flags-contract/package.json | 2 +- packages/js-dapi-client/package.json | 2 +- packages/js-dash-sdk/package.json | 2 +- packages/js-grpc-common/package.json | 2 +- .../Cargo.toml | 2 +- .../package.json | 2 +- packages/platform-test-suite/package.json | 2 +- packages/rs-dapi-client/Cargo.toml | 2 +- packages/rs-dapi-grpc-macros/Cargo.toml | 2 +- packages/rs-dpp/Cargo.toml | 2 +- packages/rs-drive-abci/Cargo.toml | 2 +- packages/rs-drive-proof-verifier/Cargo.toml | 2 +- packages/rs-drive/Cargo.toml | 2 +- .../Cargo.toml | 2 +- packages/rs-platform-serialization/Cargo.toml | 2 +- .../rs-platform-value-convertible/Cargo.toml | 2 +- packages/rs-platform-value/Cargo.toml | 2 +- packages/rs-platform-version/Cargo.toml | 2 +- packages/rs-platform-versioning/Cargo.toml | 2 +- packages/rs-sdk/Cargo.toml | 2 +- packages/simple-signer/Cargo.toml | 2 +- packages/strategy-tests/Cargo.toml | 2 +- packages/wallet-lib/package.json | 2 +- packages/wasm-dpp/Cargo.toml | 2 +- packages/wasm-dpp/package.json | 2 +- packages/withdrawals-contract/Cargo.toml | 2 +- packages/withdrawals-contract/package.json | 2 +- 41 files changed, 63 insertions(+), 63 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 38fe682e6d..60afac71ea 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1020,7 +1020,7 @@ dependencies = [ [[package]] name = "dapi-grpc" -version = "1.0.0-dev.10" +version = "1.0.0-dev.11" dependencies = [ "dapi-grpc-macros", "futures-core", @@ -1036,7 +1036,7 @@ dependencies = [ [[package]] name = "dapi-grpc-macros" -version = "1.0.0-dev.10" +version = "1.0.0-dev.11" dependencies = [ "dapi-grpc", "heck 0.5.0", @@ -1081,7 +1081,7 @@ dependencies = [ [[package]] name = "dash-sdk" -version = "1.0.0-dev.10" +version = "1.0.0-dev.11" dependencies = [ "async-trait", "base64 0.22.0", @@ -1178,7 +1178,7 @@ dependencies = [ [[package]] name = "dashpay-contract" -version = "1.0.0-dev.10" +version = "1.0.0-dev.11" dependencies = [ "platform-value", "platform-version", @@ -1188,7 +1188,7 @@ dependencies = [ [[package]] name = "data-contracts" -version = "1.0.0-dev.10" +version = "1.0.0-dev.11" dependencies = [ "dashpay-contract", "dpns-contract", @@ -1281,7 +1281,7 @@ checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" [[package]] name = "dpns-contract" -version = "1.0.0-dev.10" +version = "1.0.0-dev.11" dependencies = [ "platform-value", "platform-version", @@ -1291,7 +1291,7 @@ dependencies = [ [[package]] name = "dpp" -version = "1.0.0-dev.10" +version = "1.0.0-dev.11" dependencies = [ "anyhow", "async-trait", @@ -1341,7 +1341,7 @@ dependencies = [ [[package]] name = "drive" -version = "1.0.0-dev.10" +version = "1.0.0-dev.11" dependencies = [ "arc-swap", "base64 0.21.7", @@ -1377,7 +1377,7 @@ dependencies = [ [[package]] name = "drive-abci" -version = "1.0.0-dev.10" +version = "1.0.0-dev.11" dependencies = [ "arc-swap", "async-trait", @@ -1432,7 +1432,7 @@ dependencies = [ [[package]] name = "drive-proof-verifier" -version = "1.0.0-dev.10" +version = "1.0.0-dev.11" dependencies = [ "dapi-grpc", "dpp", @@ -1633,7 +1633,7 @@ checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984" [[package]] name = "feature-flags-contract" -version = "1.0.0-dev.10" +version = "1.0.0-dev.11" dependencies = [ "platform-value", "platform-version", @@ -2505,7 +2505,7 @@ dependencies = [ [[package]] name = "masternode-reward-shares-contract" -version = "1.0.0-dev.10" +version = "1.0.0-dev.11" dependencies = [ "platform-value", "platform-version", @@ -2992,7 +2992,7 @@ checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "platform-serialization" -version = "1.0.0-dev.10" +version = "1.0.0-dev.11" dependencies = [ "bincode", "platform-version", @@ -3000,7 +3000,7 @@ dependencies = [ [[package]] name = "platform-serialization-derive" -version = "1.0.0-dev.10" +version = "1.0.0-dev.11" dependencies = [ "proc-macro2", "quote", @@ -3010,7 +3010,7 @@ dependencies = [ [[package]] name = "platform-value" -version = "1.0.0-dev.10" +version = "1.0.0-dev.11" dependencies = [ "base64 0.22.0", "bincode", @@ -3031,7 +3031,7 @@ dependencies = [ [[package]] name = "platform-value-convertible" -version = "1.0.0-dev.10" +version = "1.0.0-dev.11" dependencies = [ "quote", "syn 2.0.58", @@ -3039,14 +3039,14 @@ dependencies = [ [[package]] name = "platform-version" -version = "1.0.0-dev.10" +version = "1.0.0-dev.11" dependencies = [ "thiserror", ] [[package]] name = "platform-versioning" -version = "1.0.0-dev.10" +version = "1.0.0-dev.11" dependencies = [ "proc-macro2", "quote", @@ -3588,7 +3588,7 @@ dependencies = [ [[package]] name = "rs-dapi-client" -version = "1.0.0-dev.10" +version = "1.0.0-dev.11" dependencies = [ "backon", "chrono", @@ -4046,7 +4046,7 @@ checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" [[package]] name = "simple-signer" -version = "1.0.0-dev.10" +version = "1.0.0-dev.11" dependencies = [ "bincode", "dashcore-rpc", @@ -4136,7 +4136,7 @@ dependencies = [ [[package]] name = "strategy-tests" -version = "1.0.0-dev.10" +version = "1.0.0-dev.11" dependencies = [ "bincode", "dpp", @@ -5074,7 +5074,7 @@ checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93" [[package]] name = "wasm-dpp" -version = "1.0.0-dev.10" +version = "1.0.0-dev.11" dependencies = [ "anyhow", "async-trait", @@ -5336,7 +5336,7 @@ dependencies = [ [[package]] name = "withdrawals-contract" -version = "1.0.0-dev.10" +version = "1.0.0-dev.11" dependencies = [ "num_enum", "platform-value", diff --git a/package.json b/package.json index c68617047c..d63439323a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/platform", - "version": "1.0.0-dev.10", + "version": "1.0.0-dev.11", "private": true, "scripts": { "setup": "yarn install && yarn run build && yarn run configure", diff --git a/packages/bench-suite/package.json b/packages/bench-suite/package.json index 07449ac092..66b4231642 100644 --- a/packages/bench-suite/package.json +++ b/packages/bench-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/bench-suite", "private": true, - "version": "1.0.0-dev.10", + "version": "1.0.0-dev.11", "description": "Dash Platform benchmark tool", "scripts": { "bench": "node ./bin/bench.js", diff --git a/packages/dapi-grpc/Cargo.toml b/packages/dapi-grpc/Cargo.toml index 7b2eb61182..67f52a5d92 100644 --- a/packages/dapi-grpc/Cargo.toml +++ b/packages/dapi-grpc/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc" description = "GRPC client for Dash Platform" -version = "1.0.0-dev.10" +version = "1.0.0-dev.11" authors = [ "Samuel Westrich ", "Igor Markin ", diff --git a/packages/dapi-grpc/package.json b/packages/dapi-grpc/package.json index c89b7925c0..13cc51f1a8 100644 --- a/packages/dapi-grpc/package.json +++ b/packages/dapi-grpc/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-grpc", - "version": "1.0.0-dev.10", + "version": "1.0.0-dev.11", "description": "DAPI GRPC definition file and generated clients", "browser": "browser.js", "main": "node.js", diff --git a/packages/dapi/package.json b/packages/dapi/package.json index efb07f65da..5b79214188 100644 --- a/packages/dapi/package.json +++ b/packages/dapi/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/dapi", "private": true, - "version": "1.0.0-dev.10", + "version": "1.0.0-dev.11", "description": "A decentralized API for the Dash network", "scripts": { "api": "node scripts/api.js", diff --git a/packages/dash-spv/package.json b/packages/dash-spv/package.json index ed58858c1d..61b2bfebb1 100644 --- a/packages/dash-spv/package.json +++ b/packages/dash-spv/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dash-spv", - "version": "1.0.0-dev.10", + "version": "1.0.0-dev.11", "description": "Repository containing SPV functions used by @dashevo", "main": "index.js", "scripts": { diff --git a/packages/dashmate/package.json b/packages/dashmate/package.json index e3d8676ab4..4840248452 100644 --- a/packages/dashmate/package.json +++ b/packages/dashmate/package.json @@ -1,6 +1,6 @@ { "name": "dashmate", - "version": "1.0.0-dev.10", + "version": "1.0.0-dev.11", "description": "Distribution package for Dash node installation", "scripts": { "lint": "eslint .", diff --git a/packages/dashpay-contract/Cargo.toml b/packages/dashpay-contract/Cargo.toml index 2a1858eb9a..b05b1d032f 100644 --- a/packages/dashpay-contract/Cargo.toml +++ b/packages/dashpay-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dashpay-contract" description = "DashPay data contract schema and tools" -version = "1.0.0-dev.10" +version = "1.0.0-dev.11" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/dashpay-contract/package.json b/packages/dashpay-contract/package.json index 1cd706da43..f0bf04f5ff 100644 --- a/packages/dashpay-contract/package.json +++ b/packages/dashpay-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dashpay-contract", - "version": "1.0.0-dev.10", + "version": "1.0.0-dev.11", "description": "Reference contract of the DashPay DPA on Dash Evolution", "scripts": { "lint": "eslint .", diff --git a/packages/data-contracts/Cargo.toml b/packages/data-contracts/Cargo.toml index 8aae0ea3b5..cd20360074 100644 --- a/packages/data-contracts/Cargo.toml +++ b/packages/data-contracts/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "data-contracts" description = "Dash Platform system data contracts" -version = "1.0.0-dev.10" +version = "1.0.0-dev.11" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/dpns-contract/Cargo.toml b/packages/dpns-contract/Cargo.toml index f614484666..88635c7170 100644 --- a/packages/dpns-contract/Cargo.toml +++ b/packages/dpns-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dpns-contract" description = "DPNS data contract schema and tools" -version = "1.0.0-dev.10" +version = "1.0.0-dev.11" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/dpns-contract/package.json b/packages/dpns-contract/package.json index fa6f3fa33d..1be0a9e467 100644 --- a/packages/dpns-contract/package.json +++ b/packages/dpns-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dpns-contract", - "version": "1.0.0-dev.10", + "version": "1.0.0-dev.11", "description": "A contract and helper scripts for DPNS DApp", "scripts": { "lint": "eslint .", diff --git a/packages/feature-flags-contract/Cargo.toml b/packages/feature-flags-contract/Cargo.toml index d7410db8d0..ef8f169e67 100644 --- a/packages/feature-flags-contract/Cargo.toml +++ b/packages/feature-flags-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "feature-flags-contract" description = "Feature flags data contract schema and tools" -version = "1.0.0-dev.10" +version = "1.0.0-dev.11" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/feature-flags-contract/package.json b/packages/feature-flags-contract/package.json index d70ed4a183..c6bd6cfd61 100644 --- a/packages/feature-flags-contract/package.json +++ b/packages/feature-flags-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/feature-flags-contract", - "version": "1.0.0-dev.10", + "version": "1.0.0-dev.11", "description": "Data Contract to store Dash Platform feature flags", "scripts": { "build": "", diff --git a/packages/js-dapi-client/package.json b/packages/js-dapi-client/package.json index fc51168f13..a18b0fa27a 100644 --- a/packages/js-dapi-client/package.json +++ b/packages/js-dapi-client/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-client", - "version": "1.0.0-dev.10", + "version": "1.0.0-dev.11", "description": "Client library used to access Dash DAPI endpoints", "main": "lib/index.js", "contributors": [ diff --git a/packages/js-dash-sdk/package.json b/packages/js-dash-sdk/package.json index e2784022d0..d4f9b0e87a 100644 --- a/packages/js-dash-sdk/package.json +++ b/packages/js-dash-sdk/package.json @@ -1,6 +1,6 @@ { "name": "dash", - "version": "4.0.0-dev.10", + "version": "4.0.0-dev.11", "description": "Dash library for JavaScript/TypeScript ecosystem (Wallet, DAPI, Primitives, BLS, ...)", "main": "build/index.js", "unpkg": "dist/dash.min.js", diff --git a/packages/js-grpc-common/package.json b/packages/js-grpc-common/package.json index d53bbd34e7..4b4e4f5cc6 100644 --- a/packages/js-grpc-common/package.json +++ b/packages/js-grpc-common/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/grpc-common", - "version": "1.0.0-dev.10", + "version": "1.0.0-dev.11", "description": "Common GRPC library", "main": "index.js", "scripts": { diff --git a/packages/masternode-reward-shares-contract/Cargo.toml b/packages/masternode-reward-shares-contract/Cargo.toml index 935ae371cf..6614dcd9a7 100644 --- a/packages/masternode-reward-shares-contract/Cargo.toml +++ b/packages/masternode-reward-shares-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "masternode-reward-shares-contract" description = "Masternode reward shares data contract schema and tools" -version = "1.0.0-dev.10" +version = "1.0.0-dev.11" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/masternode-reward-shares-contract/package.json b/packages/masternode-reward-shares-contract/package.json index 0afc952c7d..4a08a070b7 100644 --- a/packages/masternode-reward-shares-contract/package.json +++ b/packages/masternode-reward-shares-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/masternode-reward-shares-contract", - "version": "1.0.0-dev.10", + "version": "1.0.0-dev.11", "description": "A contract and helper scripts for reward sharing", "scripts": { "lint": "eslint .", diff --git a/packages/platform-test-suite/package.json b/packages/platform-test-suite/package.json index 4096854996..60cd7ec22c 100644 --- a/packages/platform-test-suite/package.json +++ b/packages/platform-test-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/platform-test-suite", "private": true, - "version": "1.0.0-dev.10", + "version": "1.0.0-dev.11", "description": "Dash Network end-to-end tests", "scripts": { "test": "yarn exec bin/test.sh", diff --git a/packages/rs-dapi-client/Cargo.toml b/packages/rs-dapi-client/Cargo.toml index 9c8ba47939..335369e1df 100644 --- a/packages/rs-dapi-client/Cargo.toml +++ b/packages/rs-dapi-client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rs-dapi-client" -version = "1.0.0-dev.10" +version = "1.0.0-dev.11" edition = "2021" [features] diff --git a/packages/rs-dapi-grpc-macros/Cargo.toml b/packages/rs-dapi-grpc-macros/Cargo.toml index 18d30ae983..acc05db0cc 100644 --- a/packages/rs-dapi-grpc-macros/Cargo.toml +++ b/packages/rs-dapi-grpc-macros/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc-macros" -version = "1.0.0-dev.10" +version = "1.0.0-dev.11" edition = "2021" description = "Macros used by dapi-grpc. Internal use only." diff --git a/packages/rs-dpp/Cargo.toml b/packages/rs-dpp/Cargo.toml index 61ad7e94d1..8d71a08206 100644 --- a/packages/rs-dpp/Cargo.toml +++ b/packages/rs-dpp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dpp" -version = "1.0.0-dev.10" +version = "1.0.0-dev.11" edition = "2021" rust-version = "1.76" authors = [ diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index 613339d953..98dcc85595 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drive-abci" -version = "1.0.0-dev.10" +version = "1.0.0-dev.11" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/rs-drive-proof-verifier/Cargo.toml b/packages/rs-drive-proof-verifier/Cargo.toml index e002887cc5..28d9a19f72 100644 --- a/packages/rs-drive-proof-verifier/Cargo.toml +++ b/packages/rs-drive-proof-verifier/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drive-proof-verifier" -version = "1.0.0-dev.10" +version = "1.0.0-dev.11" edition = "2021" rust-version = "1.76" diff --git a/packages/rs-drive/Cargo.toml b/packages/rs-drive/Cargo.toml index 39b28db56b..a29d414f17 100644 --- a/packages/rs-drive/Cargo.toml +++ b/packages/rs-drive/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "drive" description = "Dash drive built on top of GroveDB" -version = "1.0.0-dev.10" +version = "1.0.0-dev.11" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/rs-platform-serialization-derive/Cargo.toml b/packages/rs-platform-serialization-derive/Cargo.toml index 84e8092b36..006590d310 100644 --- a/packages/rs-platform-serialization-derive/Cargo.toml +++ b/packages/rs-platform-serialization-derive/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization-derive" authors = ["Samuel Westrich "] description = "Bincode serialization and deserialization derivations" -version = "1.0.0-dev.10" +version = "1.0.0-dev.11" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/rs-platform-serialization/Cargo.toml b/packages/rs-platform-serialization/Cargo.toml index c709a48f8e..2fcd4d91b9 100644 --- a/packages/rs-platform-serialization/Cargo.toml +++ b/packages/rs-platform-serialization/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization" authors = ["Samuel Westrich "] description = "Bincode based serialization and deserialization" -version = "1.0.0-dev.10" +version = "1.0.0-dev.11" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/rs-platform-value-convertible/Cargo.toml b/packages/rs-platform-value-convertible/Cargo.toml index c6d0b0d346..26792a1c4d 100644 --- a/packages/rs-platform-value-convertible/Cargo.toml +++ b/packages/rs-platform-value-convertible/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-value-convertible" authors = ["Samuel Westrich "] description = "Convertion to and from platform values" -version = "1.0.0-dev.10" +version = "1.0.0-dev.11" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/rs-platform-value/Cargo.toml b/packages/rs-platform-value/Cargo.toml index 0dedda70a3..b98f4fea86 100644 --- a/packages/rs-platform-value/Cargo.toml +++ b/packages/rs-platform-value/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-value" authors = ["Samuel Westrich "] description = "A simple value module" -version = "1.0.0-dev.10" +version = "1.0.0-dev.11" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/rs-platform-version/Cargo.toml b/packages/rs-platform-version/Cargo.toml index 950cb475ea..6f51c343aa 100644 --- a/packages/rs-platform-version/Cargo.toml +++ b/packages/rs-platform-version/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-version" authors = ["Samuel Westrich "] description = "Bincode based serialization and deserialization" -version = "1.0.0-dev.10" +version = "1.0.0-dev.11" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/rs-platform-versioning/Cargo.toml b/packages/rs-platform-versioning/Cargo.toml index 1cd3e53720..e91be96f7c 100644 --- a/packages/rs-platform-versioning/Cargo.toml +++ b/packages/rs-platform-versioning/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-versioning" authors = ["Samuel Westrich "] description = "Version derivation" -version = "1.0.0-dev.10" +version = "1.0.0-dev.11" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/rs-sdk/Cargo.toml b/packages/rs-sdk/Cargo.toml index a689df0578..94d42b7bb4 100644 --- a/packages/rs-sdk/Cargo.toml +++ b/packages/rs-sdk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dash-sdk" -version = "1.0.0-dev.10" +version = "1.0.0-dev.11" edition = "2021" [dependencies] diff --git a/packages/simple-signer/Cargo.toml b/packages/simple-signer/Cargo.toml index fa28477b11..0c2464be40 100644 --- a/packages/simple-signer/Cargo.toml +++ b/packages/simple-signer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "simple-signer" -version = "1.0.0-dev.10" +version = "1.0.0-dev.11" edition = "2021" rust-version = "1.76" diff --git a/packages/strategy-tests/Cargo.toml b/packages/strategy-tests/Cargo.toml index 3cd8b8fc73..2432c02267 100644 --- a/packages/strategy-tests/Cargo.toml +++ b/packages/strategy-tests/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "strategy-tests" -version = "1.0.0-dev.10" +version = "1.0.0-dev.11" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/wallet-lib/package.json b/packages/wallet-lib/package.json index 8f167a11d9..17bcb3b929 100644 --- a/packages/wallet-lib/package.json +++ b/packages/wallet-lib/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wallet-lib", - "version": "8.0.0-dev.10", + "version": "8.0.0-dev.11", "description": "Light wallet library for Dash", "main": "src/index.js", "unpkg": "dist/wallet-lib.min.js", diff --git a/packages/wasm-dpp/Cargo.toml b/packages/wasm-dpp/Cargo.toml index 84af02b8de..5bec0550a4 100644 --- a/packages/wasm-dpp/Cargo.toml +++ b/packages/wasm-dpp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasm-dpp" -version = "1.0.0-dev.10" +version = "1.0.0-dev.11" edition = "2021" rust-version = "1.76" authors = ["Anton Suprunchuk "] diff --git a/packages/wasm-dpp/package.json b/packages/wasm-dpp/package.json index 745da0ca59..96b06dc78a 100644 --- a/packages/wasm-dpp/package.json +++ b/packages/wasm-dpp/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wasm-dpp", - "version": "1.0.0-dev.10", + "version": "1.0.0-dev.11", "description": "The JavaScript implementation of the Dash Platform Protocol", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/withdrawals-contract/Cargo.toml b/packages/withdrawals-contract/Cargo.toml index 3fdef290b5..069166f850 100644 --- a/packages/withdrawals-contract/Cargo.toml +++ b/packages/withdrawals-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "withdrawals-contract" description = "Witdrawals data contract schema and tools" -version = "1.0.0-dev.10" +version = "1.0.0-dev.11" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/withdrawals-contract/package.json b/packages/withdrawals-contract/package.json index 0392536c0c..ddac67d23d 100644 --- a/packages/withdrawals-contract/package.json +++ b/packages/withdrawals-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/withdrawals-contract", - "version": "1.0.0-dev.10", + "version": "1.0.0-dev.11", "description": "Data Contract to manipulate and track withdrawals", "scripts": { "build": "", From dde03fcd0873ee20ba70c70c0dade8926c2eaaf9 Mon Sep 17 00:00:00 2001 From: lklimek <842586+lklimek@users.noreply.github.com> Date: Fri, 19 Apr 2024 15:49:02 +0200 Subject: [PATCH 139/191] feat(drive-abci): configure dir to store rejected txs (#1823) --- Dockerfile | 4 +- packages/rs-drive-abci/.env.local | 1 + packages/rs-drive-abci/.env.mainnet | 1 + packages/rs-drive-abci/.env.testnet | 1 + packages/rs-drive-abci/src/config.rs | 11 +++++ .../v0/mod.rs | 40 +++++++++++++++---- 6 files changed, 49 insertions(+), 9 deletions(-) diff --git a/Dockerfile b/Dockerfile index 918aeba05b..7cafb4713d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -232,9 +232,11 @@ LABEL description="Drive ABCI Rust" RUN apk add --no-cache libgcc libstdc++ ENV DB_PATH=/var/lib/dash/rs-drive-abci/db +ENV REJECTIONS_PATH=/var/log/dash/rejected RUN mkdir -p /var/log/dash \ - /var/lib/dash/rs-drive-abci/db + /var/lib/dash/rs-drive-abci/db \ + ${REJECTIONS_PATH} COPY --from=build-drive-abci /artifacts/drive-abci /usr/bin/drive-abci COPY --from=build-drive-abci /platform/packages/rs-drive-abci/.env.mainnet /var/lib/dash/rs-drive-abci/.env diff --git a/packages/rs-drive-abci/.env.local b/packages/rs-drive-abci/.env.local index c8a1b0afc0..2fe951bad2 100644 --- a/packages/rs-drive-abci/.env.local +++ b/packages/rs-drive-abci/.env.local @@ -10,6 +10,7 @@ ABCI_LOG_STDOUT_FORMAT=pretty ABCI_LOG_STDOUT_COLOR=true DB_PATH=/tmp/db +REJECTIONS_PATH=/tmp/rejected # Cache size for Data Contracts DATA_CONTRACTS_GLOBAL_CACHE_SIZE=500 diff --git a/packages/rs-drive-abci/.env.mainnet b/packages/rs-drive-abci/.env.mainnet index d6c50901a6..ecdae2605a 100644 --- a/packages/rs-drive-abci/.env.mainnet +++ b/packages/rs-drive-abci/.env.mainnet @@ -10,6 +10,7 @@ ABCI_LOG_STDOUT_FORMAT=pretty ABCI_LOG_STDOUT_COLOR=true DB_PATH=/tmp/db +REJECTIONS_PATH=/tmp/rejected # Cache size for Data Contracts DATA_CONTRACTS_GLOBAL_CACHE_SIZE=500 diff --git a/packages/rs-drive-abci/.env.testnet b/packages/rs-drive-abci/.env.testnet index 4882b58c95..9cc6c3385e 100644 --- a/packages/rs-drive-abci/.env.testnet +++ b/packages/rs-drive-abci/.env.testnet @@ -10,6 +10,7 @@ ABCI_LOG_STDOUT_FORMAT=pretty ABCI_LOG_STDOUT_COLOR=true DB_PATH=/tmp/db +REJECTIONS_PATH=/tmp/rejected # Cache size for Data Contracts DATA_CONTRACTS_GLOBAL_CACHE_SIZE=500 diff --git a/packages/rs-drive-abci/src/config.rs b/packages/rs-drive-abci/src/config.rs index 209b980965..e3d043d479 100644 --- a/packages/rs-drive-abci/src/config.rs +++ b/packages/rs-drive-abci/src/config.rs @@ -202,6 +202,13 @@ pub struct PlatformConfig { /// Path to data storage pub db_path: PathBuf, + /// Path to store rejected / invalid items (like transactions). + /// Used mainly for debuggig. + /// + /// If not set, rejected and invalid items will not be stored. + #[serde(default)] + pub rejections_path: Option, + // todo: put this in tests like #[cfg(test)] /// This should be None, except in the case of Testing platform #[serde(skip)] @@ -342,6 +349,7 @@ impl PlatformConfig { core: Default::default(), execution: Default::default(), db_path: PathBuf::from("/var/lib/dash-platform/data"), + rejections_path: Some(PathBuf::from("/var/log/dash/rejected")), testing_configs: PlatformTestConfig::default(), tokio_console_enabled: false, tokio_console_address: PlatformConfig::default_tokio_console_address(), @@ -365,6 +373,7 @@ impl PlatformConfig { core: Default::default(), execution: Default::default(), db_path: PathBuf::from("/var/lib/dash-platform/data"), + rejections_path: Some(PathBuf::from("/var/log/dash/rejected")), testing_configs: PlatformTestConfig::default(), initial_protocol_version: Self::default_initial_protocol_version(), prometheus_bind_address: None, @@ -388,6 +397,7 @@ impl PlatformConfig { core: Default::default(), execution: Default::default(), db_path: PathBuf::from("/var/lib/dash-platform/data"), + rejections_path: Some(PathBuf::from("/var/log/dash/rejected")), testing_configs: PlatformTestConfig::default(), initial_protocol_version: Self::default_initial_protocol_version(), prometheus_bind_address: None, @@ -454,6 +464,7 @@ mod tests { dotenvy::from_path(envfile.as_path()).expect("cannot load .env file"); assert_eq!("/tmp/db", env::var("DB_PATH").unwrap()); + assert_eq!("/tmp/rejected", env::var("REJECTIONS_PATH").unwrap()); let config = super::PlatformConfig::from_env().expect("expected config from env"); assert!(config.execution.verify_sum_trees); diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/append_signatures_and_broadcast_withdrawal_transactions/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/append_signatures_and_broadcast_withdrawal_transactions/v0/mod.rs index 30b429c6b6..e0a14a88c7 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/append_signatures_and_broadcast_withdrawal_transactions/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/append_signatures_and_broadcast_withdrawal_transactions/v0/mod.rs @@ -14,6 +14,7 @@ use dpp::dashcore::{consensus, Txid}; use std::fs::{self, File}; use std::io::Write; +use std::path::Path; use std::time::{SystemTime, UNIX_EPOCH}; impl Platform @@ -95,18 +96,31 @@ where } } - store_transaction_failures(transaction_submission_failures) - .map_err(|e| Error::Execution(e.into()))?; + if let Some(ref rejections_path) = self.config.rejections_path { + store_transaction_failures(transaction_submission_failures, rejections_path) + .map_err(|e| Error::Execution(e.into()))?; + } Ok(()) } } // Function to handle the storage of transaction submission failures -fn store_transaction_failures(failures: Vec<(Txid, Vec)>) -> std::io::Result<()> { +fn store_transaction_failures( + failures: Vec<(Txid, Vec)>, + dir_path: &Path, +) -> std::io::Result<()> { + if failures.is_empty() { + return Ok(()); + } + // Ensure the directory exists - let dir_path = "transaction_submission_failures"; - fs::create_dir_all(dir_path)?; + fs::create_dir_all(dir_path).map_err(|e| { + std::io::Error::new( + e.kind(), + format!("cannot create dir {}: {}", dir_path.display(), e), + ) + })?; // Get the current timestamp let timestamp = SystemTime::now() @@ -116,11 +130,21 @@ fn store_transaction_failures(failures: Vec<(Txid, Vec)>) -> std::io::Result for (tx_id, transaction) in failures { // Create the file name - let file_name = format!("{}/tx_{}_{}.dat", dir_path, timestamp, tx_id); + let file_name = dir_path.join(format!("tx_{}_{}.dat", timestamp, tx_id)); // Write the bytes to the file - let mut file = File::create(file_name)?; - file.write_all(&transaction)?; + let mut file = File::create(&file_name).map_err(|e| { + std::io::Error::new( + e.kind(), + format!("cannot create file {}: {}", file_name.display(), e), + ) + })?; + file.write_all(&transaction).map_err(|e| { + std::io::Error::new( + e.kind(), + format!("cannot write to file {}: {}", file_name.display(), e), + ) + })?; } Ok(()) From 2a5aac36845110c96bf044b77bc51520106bfda3 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Mon, 22 Apr 2024 17:46:22 +0700 Subject: [PATCH 140/191] chore(dapi): update autogenerated clients (#1827) --- .../dash/platform/dapi/v0/PlatformGrpc.java | 74 + .../platform/v0/nodejs/platform_pbjs.js | 1205 ++++++++++++++++ .../platform/v0/nodejs/platform_protoc.js | 1207 +++++++++++++++++ .../platform/v0/objective-c/Platform.pbobjc.h | 120 ++ .../platform/v0/objective-c/Platform.pbobjc.m | 312 +++++ .../platform/v0/objective-c/Platform.pbrpc.h | 13 + .../platform/v0/objective-c/Platform.pbrpc.m | 20 + .../platform/v0/python/platform_pb2.py | 276 +++- .../platform/v0/python/platform_pb2_grpc.py | 33 + .../clients/platform/v0/web/platform_pb.d.ts | 314 +++++ .../clients/platform/v0/web/platform_pb.js | 1207 +++++++++++++++++ .../platform/v0/web/platform_pb_service.d.ts | 19 + .../platform/v0/web/platform_pb_service.js | 40 + 13 files changed, 4837 insertions(+), 3 deletions(-) diff --git a/packages/dapi-grpc/clients/platform/v0/java/org/dash/platform/dapi/v0/PlatformGrpc.java b/packages/dapi-grpc/clients/platform/v0/java/org/dash/platform/dapi/v0/PlatformGrpc.java index 282c9fa0db..2b3a2bfdd1 100644 --- a/packages/dapi-grpc/clients/platform/v0/java/org/dash/platform/dapi/v0/PlatformGrpc.java +++ b/packages/dapi-grpc/clients/platform/v0/java/org/dash/platform/dapi/v0/PlatformGrpc.java @@ -635,6 +635,37 @@ org.dash.platform.dapi.v0.PlatformOuterClass.GetEpochsInfoResponse> getGetEpochs return getGetEpochsInfoMethod; } + private static volatile io.grpc.MethodDescriptor getGetPathElementsMethod; + + @io.grpc.stub.annotations.RpcMethod( + fullMethodName = SERVICE_NAME + '/' + "getPathElements", + requestType = org.dash.platform.dapi.v0.PlatformOuterClass.GetPathElementsRequest.class, + responseType = org.dash.platform.dapi.v0.PlatformOuterClass.GetPathElementsResponse.class, + methodType = io.grpc.MethodDescriptor.MethodType.UNARY) + public static io.grpc.MethodDescriptor getGetPathElementsMethod() { + io.grpc.MethodDescriptor getGetPathElementsMethod; + if ((getGetPathElementsMethod = PlatformGrpc.getGetPathElementsMethod) == null) { + synchronized (PlatformGrpc.class) { + if ((getGetPathElementsMethod = PlatformGrpc.getGetPathElementsMethod) == null) { + PlatformGrpc.getGetPathElementsMethod = getGetPathElementsMethod = + io.grpc.MethodDescriptor.newBuilder() + .setType(io.grpc.MethodDescriptor.MethodType.UNARY) + .setFullMethodName(generateFullMethodName(SERVICE_NAME, "getPathElements")) + .setSampledToLocalTracing(true) + .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + org.dash.platform.dapi.v0.PlatformOuterClass.GetPathElementsRequest.getDefaultInstance())) + .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + org.dash.platform.dapi.v0.PlatformOuterClass.GetPathElementsResponse.getDefaultInstance())) + .setSchemaDescriptor(new PlatformMethodDescriptorSupplier("getPathElements")) + .build(); + } + } + } + return getGetPathElementsMethod; + } + /** * Creates a new async stub that supports all call types for the service */ @@ -823,6 +854,13 @@ public void getEpochsInfo(org.dash.platform.dapi.v0.PlatformOuterClass.GetEpochs io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetEpochsInfoMethod(), responseObserver); } + /** + */ + public void getPathElements(org.dash.platform.dapi.v0.PlatformOuterClass.GetPathElementsRequest request, + io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetPathElementsMethod(), responseObserver); + } + @java.lang.Override public final io.grpc.ServerServiceDefinition bindService() { return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor()) .addMethod( @@ -965,6 +1003,13 @@ public void getEpochsInfo(org.dash.platform.dapi.v0.PlatformOuterClass.GetEpochs org.dash.platform.dapi.v0.PlatformOuterClass.GetEpochsInfoRequest, org.dash.platform.dapi.v0.PlatformOuterClass.GetEpochsInfoResponse>( this, METHODID_GET_EPOCHS_INFO))) + .addMethod( + getGetPathElementsMethod(), + io.grpc.stub.ServerCalls.asyncUnaryCall( + new MethodHandlers< + org.dash.platform.dapi.v0.PlatformOuterClass.GetPathElementsRequest, + org.dash.platform.dapi.v0.PlatformOuterClass.GetPathElementsResponse>( + this, METHODID_GET_PATH_ELEMENTS))) .build(); } } @@ -1142,6 +1187,14 @@ public void getEpochsInfo(org.dash.platform.dapi.v0.PlatformOuterClass.GetEpochs io.grpc.stub.ClientCalls.asyncUnaryCall( getChannel().newCall(getGetEpochsInfoMethod(), getCallOptions()), request, responseObserver); } + + /** + */ + public void getPathElements(org.dash.platform.dapi.v0.PlatformOuterClass.GetPathElementsRequest request, + io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ClientCalls.asyncUnaryCall( + getChannel().newCall(getGetPathElementsMethod(), getCallOptions()), request, responseObserver); + } } /** @@ -1297,6 +1350,13 @@ public org.dash.platform.dapi.v0.PlatformOuterClass.GetEpochsInfoResponse getEpo return io.grpc.stub.ClientCalls.blockingUnaryCall( getChannel(), getGetEpochsInfoMethod(), getCallOptions(), request); } + + /** + */ + public org.dash.platform.dapi.v0.PlatformOuterClass.GetPathElementsResponse getPathElements(org.dash.platform.dapi.v0.PlatformOuterClass.GetPathElementsRequest request) { + return io.grpc.stub.ClientCalls.blockingUnaryCall( + getChannel(), getGetPathElementsMethod(), getCallOptions(), request); + } } /** @@ -1472,6 +1532,14 @@ public com.google.common.util.concurrent.ListenableFuture getPathElements( + org.dash.platform.dapi.v0.PlatformOuterClass.GetPathElementsRequest request) { + return io.grpc.stub.ClientCalls.futureUnaryCall( + getChannel().newCall(getGetPathElementsMethod(), getCallOptions()), request); + } } private static final int METHODID_BROADCAST_STATE_TRANSITION = 0; @@ -1494,6 +1562,7 @@ public com.google.common.util.concurrent.ListenableFuture implements io.grpc.stub.ServerCalls.UnaryMethod, @@ -1592,6 +1661,10 @@ public void invoke(Req request, io.grpc.stub.StreamObserver responseObserv serviceImpl.getEpochsInfo((org.dash.platform.dapi.v0.PlatformOuterClass.GetEpochsInfoRequest) request, (io.grpc.stub.StreamObserver) responseObserver); break; + case METHODID_GET_PATH_ELEMENTS: + serviceImpl.getPathElements((org.dash.platform.dapi.v0.PlatformOuterClass.GetPathElementsRequest) request, + (io.grpc.stub.StreamObserver) responseObserver); + break; default: throw new AssertionError(); } @@ -1673,6 +1746,7 @@ public static io.grpc.ServiceDescriptor getServiceDescriptor() { .addMethod(getGetProtocolVersionUpgradeStateMethod()) .addMethod(getGetProtocolVersionUpgradeVoteStatusMethod()) .addMethod(getGetEpochsInfoMethod()) + .addMethod(getGetPathElementsMethod()) .build(); } } diff --git a/packages/dapi-grpc/clients/platform/v0/nodejs/platform_pbjs.js b/packages/dapi-grpc/clients/platform/v0/nodejs/platform_pbjs.js index f14e6503e2..1b45c95481 100644 --- a/packages/dapi-grpc/clients/platform/v0/nodejs/platform_pbjs.js +++ b/packages/dapi-grpc/clients/platform/v0/nodejs/platform_pbjs.js @@ -746,6 +746,39 @@ $root.org = (function() { * @variation 2 */ + /** + * Callback as used by {@link org.dash.platform.dapi.v0.Platform#getPathElements}. + * @memberof org.dash.platform.dapi.v0.Platform + * @typedef getPathElementsCallback + * @type {function} + * @param {Error|null} error Error, if any + * @param {org.dash.platform.dapi.v0.GetPathElementsResponse} [response] GetPathElementsResponse + */ + + /** + * Calls getPathElements. + * @function getPathElements + * @memberof org.dash.platform.dapi.v0.Platform + * @instance + * @param {org.dash.platform.dapi.v0.IGetPathElementsRequest} request GetPathElementsRequest message or plain object + * @param {org.dash.platform.dapi.v0.Platform.getPathElementsCallback} callback Node-style callback called with the error, if any, and GetPathElementsResponse + * @returns {undefined} + * @variation 1 + */ + Object.defineProperty(Platform.prototype.getPathElements = function getPathElements(request, callback) { + return this.rpcCall(getPathElements, $root.org.dash.platform.dapi.v0.GetPathElementsRequest, $root.org.dash.platform.dapi.v0.GetPathElementsResponse, request, callback); + }, "name", { value: "getPathElements" }); + + /** + * Calls getPathElements. + * @function getPathElements + * @memberof org.dash.platform.dapi.v0.Platform + * @instance + * @param {org.dash.platform.dapi.v0.IGetPathElementsRequest} request GetPathElementsRequest message or plain object + * @returns {Promise} Promise + * @variation 2 + */ + return Platform; })(); @@ -26088,6 +26121,1178 @@ $root.org = (function() { return GetEpochsInfoResponse; })(); + v0.GetPathElementsRequest = (function() { + + /** + * Properties of a GetPathElementsRequest. + * @memberof org.dash.platform.dapi.v0 + * @interface IGetPathElementsRequest + * @property {org.dash.platform.dapi.v0.GetPathElementsRequest.IGetPathElementsRequestV0|null} [v0] GetPathElementsRequest v0 + */ + + /** + * Constructs a new GetPathElementsRequest. + * @memberof org.dash.platform.dapi.v0 + * @classdesc Represents a GetPathElementsRequest. + * @implements IGetPathElementsRequest + * @constructor + * @param {org.dash.platform.dapi.v0.IGetPathElementsRequest=} [properties] Properties to set + */ + function GetPathElementsRequest(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetPathElementsRequest v0. + * @member {org.dash.platform.dapi.v0.GetPathElementsRequest.IGetPathElementsRequestV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetPathElementsRequest + * @instance + */ + GetPathElementsRequest.prototype.v0 = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetPathElementsRequest version. + * @member {"v0"|undefined} version + * @memberof org.dash.platform.dapi.v0.GetPathElementsRequest + * @instance + */ + Object.defineProperty(GetPathElementsRequest.prototype, "version", { + get: $util.oneOfGetter($oneOfFields = ["v0"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetPathElementsRequest instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetPathElementsRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetPathElementsRequest=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetPathElementsRequest} GetPathElementsRequest instance + */ + GetPathElementsRequest.create = function create(properties) { + return new GetPathElementsRequest(properties); + }; + + /** + * Encodes the specified GetPathElementsRequest message. Does not implicitly {@link org.dash.platform.dapi.v0.GetPathElementsRequest.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetPathElementsRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetPathElementsRequest} message GetPathElementsRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetPathElementsRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) + $root.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetPathElementsRequest message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetPathElementsRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetPathElementsRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetPathElementsRequest} message GetPathElementsRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetPathElementsRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetPathElementsRequest message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetPathElementsRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetPathElementsRequest} GetPathElementsRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetPathElementsRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetPathElementsRequest(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.v0 = $root.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetPathElementsRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetPathElementsRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetPathElementsRequest} GetPathElementsRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetPathElementsRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetPathElementsRequest message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetPathElementsRequest + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetPathElementsRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + properties.version = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.verify(message.v0); + if (error) + return "v0." + error; + } + } + return null; + }; + + /** + * Creates a GetPathElementsRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetPathElementsRequest + * @static + * @param {Object.} object Plain object + * @returns {org.dash.platform.dapi.v0.GetPathElementsRequest} GetPathElementsRequest + */ + GetPathElementsRequest.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetPathElementsRequest) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetPathElementsRequest(); + if (object.v0 != null) { + if (typeof object.v0 !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetPathElementsRequest.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.fromObject(object.v0); + } + return message; + }; + + /** + * Creates a plain object from a GetPathElementsRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetPathElementsRequest + * @static + * @param {org.dash.platform.dapi.v0.GetPathElementsRequest} message GetPathElementsRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + GetPathElementsRequest.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + object.v0 = $root.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.toObject(message.v0, options); + if (options.oneofs) + object.version = "v0"; + } + return object; + }; + + /** + * Converts this GetPathElementsRequest to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetPathElementsRequest + * @instance + * @returns {Object.} JSON object + */ + GetPathElementsRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + GetPathElementsRequest.GetPathElementsRequestV0 = (function() { + + /** + * Properties of a GetPathElementsRequestV0. + * @memberof org.dash.platform.dapi.v0.GetPathElementsRequest + * @interface IGetPathElementsRequestV0 + * @property {Array.|null} [path] GetPathElementsRequestV0 path + * @property {Array.|null} [keys] GetPathElementsRequestV0 keys + * @property {boolean|null} [prove] GetPathElementsRequestV0 prove + */ + + /** + * Constructs a new GetPathElementsRequestV0. + * @memberof org.dash.platform.dapi.v0.GetPathElementsRequest + * @classdesc Represents a GetPathElementsRequestV0. + * @implements IGetPathElementsRequestV0 + * @constructor + * @param {org.dash.platform.dapi.v0.GetPathElementsRequest.IGetPathElementsRequestV0=} [properties] Properties to set + */ + function GetPathElementsRequestV0(properties) { + this.path = []; + this.keys = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetPathElementsRequestV0 path. + * @member {Array.} path + * @memberof org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0 + * @instance + */ + GetPathElementsRequestV0.prototype.path = $util.emptyArray; + + /** + * GetPathElementsRequestV0 keys. + * @member {Array.} keys + * @memberof org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0 + * @instance + */ + GetPathElementsRequestV0.prototype.keys = $util.emptyArray; + + /** + * GetPathElementsRequestV0 prove. + * @member {boolean} prove + * @memberof org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0 + * @instance + */ + GetPathElementsRequestV0.prototype.prove = false; + + /** + * Creates a new GetPathElementsRequestV0 instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetPathElementsRequest.IGetPathElementsRequestV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} GetPathElementsRequestV0 instance + */ + GetPathElementsRequestV0.create = function create(properties) { + return new GetPathElementsRequestV0(properties); + }; + + /** + * Encodes the specified GetPathElementsRequestV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetPathElementsRequest.IGetPathElementsRequestV0} message GetPathElementsRequestV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetPathElementsRequestV0.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.path != null && message.path.length) + for (var i = 0; i < message.path.length; ++i) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.path[i]); + if (message.keys != null && message.keys.length) + for (var i = 0; i < message.keys.length; ++i) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.keys[i]); + if (message.prove != null && Object.hasOwnProperty.call(message, "prove")) + writer.uint32(/* id 3, wireType 0 =*/24).bool(message.prove); + return writer; + }; + + /** + * Encodes the specified GetPathElementsRequestV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetPathElementsRequest.IGetPathElementsRequestV0} message GetPathElementsRequestV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetPathElementsRequestV0.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetPathElementsRequestV0 message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} GetPathElementsRequestV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetPathElementsRequestV0.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (!(message.path && message.path.length)) + message.path = []; + message.path.push(reader.bytes()); + break; + case 2: + if (!(message.keys && message.keys.length)) + message.keys = []; + message.keys.push(reader.bytes()); + break; + case 3: + message.prove = reader.bool(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetPathElementsRequestV0 message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} GetPathElementsRequestV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetPathElementsRequestV0.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetPathElementsRequestV0 message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0 + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetPathElementsRequestV0.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.path != null && message.hasOwnProperty("path")) { + if (!Array.isArray(message.path)) + return "path: array expected"; + for (var i = 0; i < message.path.length; ++i) + if (!(message.path[i] && typeof message.path[i].length === "number" || $util.isString(message.path[i]))) + return "path: buffer[] expected"; + } + if (message.keys != null && message.hasOwnProperty("keys")) { + if (!Array.isArray(message.keys)) + return "keys: array expected"; + for (var i = 0; i < message.keys.length; ++i) + if (!(message.keys[i] && typeof message.keys[i].length === "number" || $util.isString(message.keys[i]))) + return "keys: buffer[] expected"; + } + if (message.prove != null && message.hasOwnProperty("prove")) + if (typeof message.prove !== "boolean") + return "prove: boolean expected"; + return null; + }; + + /** + * Creates a GetPathElementsRequestV0 message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0 + * @static + * @param {Object.} object Plain object + * @returns {org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} GetPathElementsRequestV0 + */ + GetPathElementsRequestV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0(); + if (object.path) { + if (!Array.isArray(object.path)) + throw TypeError(".org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.path: array expected"); + message.path = []; + for (var i = 0; i < object.path.length; ++i) + if (typeof object.path[i] === "string") + $util.base64.decode(object.path[i], message.path[i] = $util.newBuffer($util.base64.length(object.path[i])), 0); + else if (object.path[i].length >= 0) + message.path[i] = object.path[i]; + } + if (object.keys) { + if (!Array.isArray(object.keys)) + throw TypeError(".org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.keys: array expected"); + message.keys = []; + for (var i = 0; i < object.keys.length; ++i) + if (typeof object.keys[i] === "string") + $util.base64.decode(object.keys[i], message.keys[i] = $util.newBuffer($util.base64.length(object.keys[i])), 0); + else if (object.keys[i].length >= 0) + message.keys[i] = object.keys[i]; + } + if (object.prove != null) + message.prove = Boolean(object.prove); + return message; + }; + + /** + * Creates a plain object from a GetPathElementsRequestV0 message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} message GetPathElementsRequestV0 + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + GetPathElementsRequestV0.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) { + object.path = []; + object.keys = []; + } + if (options.defaults) + object.prove = false; + if (message.path && message.path.length) { + object.path = []; + for (var j = 0; j < message.path.length; ++j) + object.path[j] = options.bytes === String ? $util.base64.encode(message.path[j], 0, message.path[j].length) : options.bytes === Array ? Array.prototype.slice.call(message.path[j]) : message.path[j]; + } + if (message.keys && message.keys.length) { + object.keys = []; + for (var j = 0; j < message.keys.length; ++j) + object.keys[j] = options.bytes === String ? $util.base64.encode(message.keys[j], 0, message.keys[j].length) : options.bytes === Array ? Array.prototype.slice.call(message.keys[j]) : message.keys[j]; + } + if (message.prove != null && message.hasOwnProperty("prove")) + object.prove = message.prove; + return object; + }; + + /** + * Converts this GetPathElementsRequestV0 to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0 + * @instance + * @returns {Object.} JSON object + */ + GetPathElementsRequestV0.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return GetPathElementsRequestV0; + })(); + + return GetPathElementsRequest; + })(); + + v0.GetPathElementsResponse = (function() { + + /** + * Properties of a GetPathElementsResponse. + * @memberof org.dash.platform.dapi.v0 + * @interface IGetPathElementsResponse + * @property {org.dash.platform.dapi.v0.GetPathElementsResponse.IGetPathElementsResponseV0|null} [v0] GetPathElementsResponse v0 + */ + + /** + * Constructs a new GetPathElementsResponse. + * @memberof org.dash.platform.dapi.v0 + * @classdesc Represents a GetPathElementsResponse. + * @implements IGetPathElementsResponse + * @constructor + * @param {org.dash.platform.dapi.v0.IGetPathElementsResponse=} [properties] Properties to set + */ + function GetPathElementsResponse(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetPathElementsResponse v0. + * @member {org.dash.platform.dapi.v0.GetPathElementsResponse.IGetPathElementsResponseV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse + * @instance + */ + GetPathElementsResponse.prototype.v0 = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetPathElementsResponse version. + * @member {"v0"|undefined} version + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse + * @instance + */ + Object.defineProperty(GetPathElementsResponse.prototype, "version", { + get: $util.oneOfGetter($oneOfFields = ["v0"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetPathElementsResponse instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetPathElementsResponse=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetPathElementsResponse} GetPathElementsResponse instance + */ + GetPathElementsResponse.create = function create(properties) { + return new GetPathElementsResponse(properties); + }; + + /** + * Encodes the specified GetPathElementsResponse message. Does not implicitly {@link org.dash.platform.dapi.v0.GetPathElementsResponse.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetPathElementsResponse} message GetPathElementsResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetPathElementsResponse.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) + $root.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetPathElementsResponse message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetPathElementsResponse.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetPathElementsResponse} message GetPathElementsResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetPathElementsResponse.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetPathElementsResponse message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetPathElementsResponse} GetPathElementsResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetPathElementsResponse.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetPathElementsResponse(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.v0 = $root.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetPathElementsResponse message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetPathElementsResponse} GetPathElementsResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetPathElementsResponse.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetPathElementsResponse message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetPathElementsResponse.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + properties.version = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.verify(message.v0); + if (error) + return "v0." + error; + } + } + return null; + }; + + /** + * Creates a GetPathElementsResponse message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse + * @static + * @param {Object.} object Plain object + * @returns {org.dash.platform.dapi.v0.GetPathElementsResponse} GetPathElementsResponse + */ + GetPathElementsResponse.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetPathElementsResponse) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetPathElementsResponse(); + if (object.v0 != null) { + if (typeof object.v0 !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetPathElementsResponse.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.fromObject(object.v0); + } + return message; + }; + + /** + * Creates a plain object from a GetPathElementsResponse message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse + * @static + * @param {org.dash.platform.dapi.v0.GetPathElementsResponse} message GetPathElementsResponse + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + GetPathElementsResponse.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + object.v0 = $root.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.toObject(message.v0, options); + if (options.oneofs) + object.version = "v0"; + } + return object; + }; + + /** + * Converts this GetPathElementsResponse to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse + * @instance + * @returns {Object.} JSON object + */ + GetPathElementsResponse.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + GetPathElementsResponse.GetPathElementsResponseV0 = (function() { + + /** + * Properties of a GetPathElementsResponseV0. + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse + * @interface IGetPathElementsResponseV0 + * @property {org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.IElements|null} [elements] GetPathElementsResponseV0 elements + * @property {org.dash.platform.dapi.v0.IProof|null} [proof] GetPathElementsResponseV0 proof + * @property {org.dash.platform.dapi.v0.IResponseMetadata|null} [metadata] GetPathElementsResponseV0 metadata + */ + + /** + * Constructs a new GetPathElementsResponseV0. + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse + * @classdesc Represents a GetPathElementsResponseV0. + * @implements IGetPathElementsResponseV0 + * @constructor + * @param {org.dash.platform.dapi.v0.GetPathElementsResponse.IGetPathElementsResponseV0=} [properties] Properties to set + */ + function GetPathElementsResponseV0(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetPathElementsResponseV0 elements. + * @member {org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.IElements|null|undefined} elements + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0 + * @instance + */ + GetPathElementsResponseV0.prototype.elements = null; + + /** + * GetPathElementsResponseV0 proof. + * @member {org.dash.platform.dapi.v0.IProof|null|undefined} proof + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0 + * @instance + */ + GetPathElementsResponseV0.prototype.proof = null; + + /** + * GetPathElementsResponseV0 metadata. + * @member {org.dash.platform.dapi.v0.IResponseMetadata|null|undefined} metadata + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0 + * @instance + */ + GetPathElementsResponseV0.prototype.metadata = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetPathElementsResponseV0 result. + * @member {"elements"|"proof"|undefined} result + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0 + * @instance + */ + Object.defineProperty(GetPathElementsResponseV0.prototype, "result", { + get: $util.oneOfGetter($oneOfFields = ["elements", "proof"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetPathElementsResponseV0 instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetPathElementsResponse.IGetPathElementsResponseV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} GetPathElementsResponseV0 instance + */ + GetPathElementsResponseV0.create = function create(properties) { + return new GetPathElementsResponseV0(properties); + }; + + /** + * Encodes the specified GetPathElementsResponseV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetPathElementsResponse.IGetPathElementsResponseV0} message GetPathElementsResponseV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetPathElementsResponseV0.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.elements != null && Object.hasOwnProperty.call(message, "elements")) + $root.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.encode(message.elements, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.proof != null && Object.hasOwnProperty.call(message, "proof")) + $root.org.dash.platform.dapi.v0.Proof.encode(message.proof, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.metadata != null && Object.hasOwnProperty.call(message, "metadata")) + $root.org.dash.platform.dapi.v0.ResponseMetadata.encode(message.metadata, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetPathElementsResponseV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetPathElementsResponse.IGetPathElementsResponseV0} message GetPathElementsResponseV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetPathElementsResponseV0.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetPathElementsResponseV0 message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} GetPathElementsResponseV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetPathElementsResponseV0.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.elements = $root.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.decode(reader, reader.uint32()); + break; + case 2: + message.proof = $root.org.dash.platform.dapi.v0.Proof.decode(reader, reader.uint32()); + break; + case 3: + message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetPathElementsResponseV0 message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} GetPathElementsResponseV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetPathElementsResponseV0.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetPathElementsResponseV0 message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0 + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetPathElementsResponseV0.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.elements != null && message.hasOwnProperty("elements")) { + properties.result = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.verify(message.elements); + if (error) + return "elements." + error; + } + } + if (message.proof != null && message.hasOwnProperty("proof")) { + if (properties.result === 1) + return "result: multiple values"; + properties.result = 1; + { + var error = $root.org.dash.platform.dapi.v0.Proof.verify(message.proof); + if (error) + return "proof." + error; + } + } + if (message.metadata != null && message.hasOwnProperty("metadata")) { + var error = $root.org.dash.platform.dapi.v0.ResponseMetadata.verify(message.metadata); + if (error) + return "metadata." + error; + } + return null; + }; + + /** + * Creates a GetPathElementsResponseV0 message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0 + * @static + * @param {Object.} object Plain object + * @returns {org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} GetPathElementsResponseV0 + */ + GetPathElementsResponseV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0(); + if (object.elements != null) { + if (typeof object.elements !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.elements: object expected"); + message.elements = $root.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.fromObject(object.elements); + } + if (object.proof != null) { + if (typeof object.proof !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.proof: object expected"); + message.proof = $root.org.dash.platform.dapi.v0.Proof.fromObject(object.proof); + } + if (object.metadata != null) { + if (typeof object.metadata !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.metadata: object expected"); + message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.fromObject(object.metadata); + } + return message; + }; + + /** + * Creates a plain object from a GetPathElementsResponseV0 message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} message GetPathElementsResponseV0 + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + GetPathElementsResponseV0.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.metadata = null; + if (message.elements != null && message.hasOwnProperty("elements")) { + object.elements = $root.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.toObject(message.elements, options); + if (options.oneofs) + object.result = "elements"; + } + if (message.proof != null && message.hasOwnProperty("proof")) { + object.proof = $root.org.dash.platform.dapi.v0.Proof.toObject(message.proof, options); + if (options.oneofs) + object.result = "proof"; + } + if (message.metadata != null && message.hasOwnProperty("metadata")) + object.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.toObject(message.metadata, options); + return object; + }; + + /** + * Converts this GetPathElementsResponseV0 to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0 + * @instance + * @returns {Object.} JSON object + */ + GetPathElementsResponseV0.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + GetPathElementsResponseV0.Elements = (function() { + + /** + * Properties of an Elements. + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0 + * @interface IElements + * @property {Array.|null} [elements] Elements elements + */ + + /** + * Constructs a new Elements. + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0 + * @classdesc Represents an Elements. + * @implements IElements + * @constructor + * @param {org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.IElements=} [properties] Properties to set + */ + function Elements(properties) { + this.elements = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Elements elements. + * @member {Array.} elements + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements + * @instance + */ + Elements.prototype.elements = $util.emptyArray; + + /** + * Creates a new Elements instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements + * @static + * @param {org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.IElements=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} Elements instance + */ + Elements.create = function create(properties) { + return new Elements(properties); + }; + + /** + * Encodes the specified Elements message. Does not implicitly {@link org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements + * @static + * @param {org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.IElements} message Elements message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Elements.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.elements != null && message.elements.length) + for (var i = 0; i < message.elements.length; ++i) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.elements[i]); + return writer; + }; + + /** + * Encodes the specified Elements message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements + * @static + * @param {org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.IElements} message Elements message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Elements.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an Elements message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} Elements + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Elements.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (!(message.elements && message.elements.length)) + message.elements = []; + message.elements.push(reader.bytes()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an Elements message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} Elements + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Elements.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an Elements message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + Elements.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.elements != null && message.hasOwnProperty("elements")) { + if (!Array.isArray(message.elements)) + return "elements: array expected"; + for (var i = 0; i < message.elements.length; ++i) + if (!(message.elements[i] && typeof message.elements[i].length === "number" || $util.isString(message.elements[i]))) + return "elements: buffer[] expected"; + } + return null; + }; + + /** + * Creates an Elements message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements + * @static + * @param {Object.} object Plain object + * @returns {org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} Elements + */ + Elements.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements(); + if (object.elements) { + if (!Array.isArray(object.elements)) + throw TypeError(".org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.elements: array expected"); + message.elements = []; + for (var i = 0; i < object.elements.length; ++i) + if (typeof object.elements[i] === "string") + $util.base64.decode(object.elements[i], message.elements[i] = $util.newBuffer($util.base64.length(object.elements[i])), 0); + else if (object.elements[i].length >= 0) + message.elements[i] = object.elements[i]; + } + return message; + }; + + /** + * Creates a plain object from an Elements message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements + * @static + * @param {org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} message Elements + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + Elements.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.elements = []; + if (message.elements && message.elements.length) { + object.elements = []; + for (var j = 0; j < message.elements.length; ++j) + object.elements[j] = options.bytes === String ? $util.base64.encode(message.elements[j], 0, message.elements[j].length) : options.bytes === Array ? Array.prototype.slice.call(message.elements[j]) : message.elements[j]; + } + return object; + }; + + /** + * Converts this Elements to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements + * @instance + * @returns {Object.} JSON object + */ + Elements.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return Elements; + })(); + + return GetPathElementsResponseV0; + })(); + + return GetPathElementsResponse; + })(); + return v0; })(); diff --git a/packages/dapi-grpc/clients/platform/v0/nodejs/platform_protoc.js b/packages/dapi-grpc/clients/platform/v0/nodejs/platform_protoc.js index e7495b46c1..b30f67af84 100644 --- a/packages/dapi-grpc/clients/platform/v0/nodejs/platform_protoc.js +++ b/packages/dapi-grpc/clients/platform/v0/nodejs/platform_protoc.js @@ -145,6 +145,14 @@ goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityResponse', null, { goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.ResultCase', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityResponse.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetPathElementsRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetPathElementsRequest.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetPathElementsResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.ResultCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetPathElementsResponse.VersionCase', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetProofsRequest', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest', null, { proto }); @@ -2479,6 +2487,111 @@ if (goog.DEBUG && !COMPILED) { */ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.displayName = 'proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo'; } +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetPathElementsRequest.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetPathElementsRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetPathElementsRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetPathElementsRequest'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.repeatedFields_, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.displayName = 'proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetPathElementsResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetPathElementsResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetPathElementsResponse'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.repeatedFields_, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.displayName = 'proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements'; +} @@ -24886,4 +24999,1098 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.prototype.hasV0 = function }; + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetPathElementsRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetPathElementsRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetPathElementsRequest.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetPathElementsRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetPathElementsRequest; + return proto.org.dash.platform.dapi.v0.GetPathElementsRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetPathElementsRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.serializeBinaryToWriter + ); + } +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array} + * @const + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.repeatedFields_ = [1,2]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.toObject = function(includeInstance, msg) { + var f, obj = { + pathList: msg.getPathList_asB64(), + keysList: msg.getKeysList_asB64(), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0; + return proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addPath(value); + break; + case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addKeys(value); + break; + case 3: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getPathList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 1, + f + ); + } + f = message.getKeysList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 2, + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 3, + f + ); + } +}; + + +/** + * repeated bytes path = 1; + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getPathList = function() { + return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 1)); +}; + + +/** + * repeated bytes path = 1; + * This is a type-conversion wrapper around `getPathList()` + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getPathList_asB64 = function() { + return /** @type {!Array} */ (jspb.Message.bytesListAsB64( + this.getPathList())); +}; + + +/** + * repeated bytes path = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getPathList()` + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getPathList_asU8 = function() { + return /** @type {!Array} */ (jspb.Message.bytesListAsU8( + this.getPathList())); +}; + + +/** + * @param {!(Array|Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.setPathList = function(value) { + return jspb.Message.setField(this, 1, value || []); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.addPath = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.clearPathList = function() { + return this.setPathList([]); +}; + + +/** + * repeated bytes keys = 2; + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getKeysList = function() { + return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 2)); +}; + + +/** + * repeated bytes keys = 2; + * This is a type-conversion wrapper around `getKeysList()` + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getKeysList_asB64 = function() { + return /** @type {!Array} */ (jspb.Message.bytesListAsB64( + this.getKeysList())); +}; + + +/** + * repeated bytes keys = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getKeysList()` + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getKeysList_asU8 = function() { + return /** @type {!Array} */ (jspb.Message.bytesListAsU8( + this.getKeysList())); +}; + + +/** + * @param {!(Array|Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.setKeysList = function(value) { + return jspb.Message.setField(this, 2, value || []); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.addKeys = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 2, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.clearKeysList = function() { + return this.setKeysList([]); +}; + + +/** + * optional bool prove = 3; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 3, value); +}; + + +/** + * optional GetPathElementsRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetPathElementsRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetPathElementsResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetPathElementsResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetPathElementsResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetPathElementsResponse; + return proto.org.dash.platform.dapi.v0.GetPathElementsResponse.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetPathElementsResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.serializeBinaryToWriter + ); + } +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + ELEMENTS: 1, + PROOF: 2 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.toObject = function(includeInstance, msg) { + var f, obj = { + elements: (f = msg.getElements()) && proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.toObject(includeInstance, f), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0; + return proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.deserializeBinaryFromReader); + msg.setElements(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getElements(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.serializeBinaryToWriter + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); + } +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array} + * @const + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.repeatedFields_ = [1]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.toObject = function(includeInstance, msg) { + var f, obj = { + elementsList: msg.getElementsList_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements; + return proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addElements(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getElementsList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 1, + f + ); + } +}; + + +/** + * repeated bytes elements = 1; + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.getElementsList = function() { + return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 1)); +}; + + +/** + * repeated bytes elements = 1; + * This is a type-conversion wrapper around `getElementsList()` + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.getElementsList_asB64 = function() { + return /** @type {!Array} */ (jspb.Message.bytesListAsB64( + this.getElementsList())); +}; + + +/** + * repeated bytes elements = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getElementsList()` + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.getElementsList_asU8 = function() { + return /** @type {!Array} */ (jspb.Message.bytesListAsU8( + this.getElementsList())); +}; + + +/** + * @param {!(Array|Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.setElementsList = function(value) { + return jspb.Message.setField(this, 1, value || []); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.addElements = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.clearElementsList = function() { + return this.setElementsList([]); +}; + + +/** + * optional Elements elements = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.getElements = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.setElements = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.clearElements = function() { + return this.setElements(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.hasElements = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional GetPathElementsResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + goog.object.extend(exports, proto.org.dash.platform.dapi.v0); diff --git a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.h b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.h index b4c0745c8b..40fdb0a6eb 100644 --- a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.h +++ b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.h @@ -76,6 +76,9 @@ CF_EXTERN_C_BEGIN @class GetIdentityNonceResponse_GetIdentityNonceResponseV0; @class GetIdentityRequest_GetIdentityRequestV0; @class GetIdentityResponse_GetIdentityResponseV0; +@class GetPathElementsRequest_GetPathElementsRequestV0; +@class GetPathElementsResponse_GetPathElementsResponseV0; +@class GetPathElementsResponse_GetPathElementsResponseV0_Elements; @class GetProofsRequest_GetProofsRequestV0; @class GetProofsRequest_GetProofsRequestV0_ContractRequest; @class GetProofsRequest_GetProofsRequestV0_DocumentRequest; @@ -2594,6 +2597,123 @@ GPB_FINAL @interface GetEpochsInfoResponse_GetEpochsInfoResponseV0_EpochInfo : G @end +#pragma mark - GetPathElementsRequest + +typedef GPB_ENUM(GetPathElementsRequest_FieldNumber) { + GetPathElementsRequest_FieldNumber_V0 = 1, +}; + +typedef GPB_ENUM(GetPathElementsRequest_Version_OneOfCase) { + GetPathElementsRequest_Version_OneOfCase_GPBUnsetOneOfCase = 0, + GetPathElementsRequest_Version_OneOfCase_V0 = 1, +}; + +GPB_FINAL @interface GetPathElementsRequest : GPBMessage + +@property(nonatomic, readonly) GetPathElementsRequest_Version_OneOfCase versionOneOfCase; + +@property(nonatomic, readwrite, strong, null_resettable) GetPathElementsRequest_GetPathElementsRequestV0 *v0; + +@end + +/** + * Clears whatever value was set for the oneof 'version'. + **/ +void GetPathElementsRequest_ClearVersionOneOfCase(GetPathElementsRequest *message); + +#pragma mark - GetPathElementsRequest_GetPathElementsRequestV0 + +typedef GPB_ENUM(GetPathElementsRequest_GetPathElementsRequestV0_FieldNumber) { + GetPathElementsRequest_GetPathElementsRequestV0_FieldNumber_PathArray = 1, + GetPathElementsRequest_GetPathElementsRequestV0_FieldNumber_KeysArray = 2, + GetPathElementsRequest_GetPathElementsRequestV0_FieldNumber_Prove = 3, +}; + +GPB_FINAL @interface GetPathElementsRequest_GetPathElementsRequestV0 : GPBMessage + +@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray *pathArray; +/** The number of items in @c pathArray without causing the array to be created. */ +@property(nonatomic, readonly) NSUInteger pathArray_Count; + +@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray *keysArray; +/** The number of items in @c keysArray without causing the array to be created. */ +@property(nonatomic, readonly) NSUInteger keysArray_Count; + +@property(nonatomic, readwrite) BOOL prove; + +@end + +#pragma mark - GetPathElementsResponse + +typedef GPB_ENUM(GetPathElementsResponse_FieldNumber) { + GetPathElementsResponse_FieldNumber_V0 = 1, +}; + +typedef GPB_ENUM(GetPathElementsResponse_Version_OneOfCase) { + GetPathElementsResponse_Version_OneOfCase_GPBUnsetOneOfCase = 0, + GetPathElementsResponse_Version_OneOfCase_V0 = 1, +}; + +GPB_FINAL @interface GetPathElementsResponse : GPBMessage + +@property(nonatomic, readonly) GetPathElementsResponse_Version_OneOfCase versionOneOfCase; + +@property(nonatomic, readwrite, strong, null_resettable) GetPathElementsResponse_GetPathElementsResponseV0 *v0; + +@end + +/** + * Clears whatever value was set for the oneof 'version'. + **/ +void GetPathElementsResponse_ClearVersionOneOfCase(GetPathElementsResponse *message); + +#pragma mark - GetPathElementsResponse_GetPathElementsResponseV0 + +typedef GPB_ENUM(GetPathElementsResponse_GetPathElementsResponseV0_FieldNumber) { + GetPathElementsResponse_GetPathElementsResponseV0_FieldNumber_Elements = 1, + GetPathElementsResponse_GetPathElementsResponseV0_FieldNumber_Proof = 2, + GetPathElementsResponse_GetPathElementsResponseV0_FieldNumber_Metadata = 3, +}; + +typedef GPB_ENUM(GetPathElementsResponse_GetPathElementsResponseV0_Result_OneOfCase) { + GetPathElementsResponse_GetPathElementsResponseV0_Result_OneOfCase_GPBUnsetOneOfCase = 0, + GetPathElementsResponse_GetPathElementsResponseV0_Result_OneOfCase_Elements = 1, + GetPathElementsResponse_GetPathElementsResponseV0_Result_OneOfCase_Proof = 2, +}; + +GPB_FINAL @interface GetPathElementsResponse_GetPathElementsResponseV0 : GPBMessage + +@property(nonatomic, readonly) GetPathElementsResponse_GetPathElementsResponseV0_Result_OneOfCase resultOneOfCase; + +@property(nonatomic, readwrite, strong, null_resettable) GetPathElementsResponse_GetPathElementsResponseV0_Elements *elements; + +@property(nonatomic, readwrite, strong, null_resettable) Proof *proof; + +@property(nonatomic, readwrite, strong, null_resettable) ResponseMetadata *metadata; +/** Test to see if @c metadata has been set. */ +@property(nonatomic, readwrite) BOOL hasMetadata; + +@end + +/** + * Clears whatever value was set for the oneof 'result'. + **/ +void GetPathElementsResponse_GetPathElementsResponseV0_ClearResultOneOfCase(GetPathElementsResponse_GetPathElementsResponseV0 *message); + +#pragma mark - GetPathElementsResponse_GetPathElementsResponseV0_Elements + +typedef GPB_ENUM(GetPathElementsResponse_GetPathElementsResponseV0_Elements_FieldNumber) { + GetPathElementsResponse_GetPathElementsResponseV0_Elements_FieldNumber_ElementsArray = 1, +}; + +GPB_FINAL @interface GetPathElementsResponse_GetPathElementsResponseV0_Elements : GPBMessage + +@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray *elementsArray; +/** The number of items in @c elementsArray without causing the array to be created. */ +@property(nonatomic, readonly) NSUInteger elementsArray_Count; + +@end + NS_ASSUME_NONNULL_END CF_EXTERN_C_END diff --git a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.m b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.m index 35feedfec3..f78cda6408 100644 --- a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.m +++ b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.m @@ -106,6 +106,11 @@ GPBObjCClassDeclaration(GetIdentityRequest_GetIdentityRequestV0); GPBObjCClassDeclaration(GetIdentityResponse); GPBObjCClassDeclaration(GetIdentityResponse_GetIdentityResponseV0); +GPBObjCClassDeclaration(GetPathElementsRequest); +GPBObjCClassDeclaration(GetPathElementsRequest_GetPathElementsRequestV0); +GPBObjCClassDeclaration(GetPathElementsResponse); +GPBObjCClassDeclaration(GetPathElementsResponse_GetPathElementsResponseV0); +GPBObjCClassDeclaration(GetPathElementsResponse_GetPathElementsResponseV0_Elements); GPBObjCClassDeclaration(GetProofsRequest); GPBObjCClassDeclaration(GetProofsRequest_GetProofsRequestV0); GPBObjCClassDeclaration(GetProofsRequest_GetProofsRequestV0_ContractRequest); @@ -7018,6 +7023,313 @@ + (GPBDescriptor *)descriptor { @end +#pragma mark - GetPathElementsRequest + +@implementation GetPathElementsRequest + +@dynamic versionOneOfCase; +@dynamic v0; + +typedef struct GetPathElementsRequest__storage_ { + uint32_t _has_storage_[2]; + GetPathElementsRequest_GetPathElementsRequestV0 *v0; +} GetPathElementsRequest__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "v0", + .dataTypeSpecific.clazz = GPBObjCClass(GetPathElementsRequest_GetPathElementsRequestV0), + .number = GetPathElementsRequest_FieldNumber_V0, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetPathElementsRequest__storage_, v0), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetPathElementsRequest class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetPathElementsRequest__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "version", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetPathElementsRequest_ClearVersionOneOfCase(GetPathElementsRequest *message) { + GPBDescriptor *descriptor = [GetPathElementsRequest descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetPathElementsRequest_GetPathElementsRequestV0 + +@implementation GetPathElementsRequest_GetPathElementsRequestV0 + +@dynamic pathArray, pathArray_Count; +@dynamic keysArray, keysArray_Count; +@dynamic prove; + +typedef struct GetPathElementsRequest_GetPathElementsRequestV0__storage_ { + uint32_t _has_storage_[1]; + NSMutableArray *pathArray; + NSMutableArray *keysArray; +} GetPathElementsRequest_GetPathElementsRequestV0__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "pathArray", + .dataTypeSpecific.clazz = Nil, + .number = GetPathElementsRequest_GetPathElementsRequestV0_FieldNumber_PathArray, + .hasIndex = GPBNoHasBit, + .offset = (uint32_t)offsetof(GetPathElementsRequest_GetPathElementsRequestV0__storage_, pathArray), + .flags = GPBFieldRepeated, + .dataType = GPBDataTypeBytes, + }, + { + .name = "keysArray", + .dataTypeSpecific.clazz = Nil, + .number = GetPathElementsRequest_GetPathElementsRequestV0_FieldNumber_KeysArray, + .hasIndex = GPBNoHasBit, + .offset = (uint32_t)offsetof(GetPathElementsRequest_GetPathElementsRequestV0__storage_, keysArray), + .flags = GPBFieldRepeated, + .dataType = GPBDataTypeBytes, + }, + { + .name = "prove", + .dataTypeSpecific.clazz = Nil, + .number = GetPathElementsRequest_GetPathElementsRequestV0_FieldNumber_Prove, + .hasIndex = 0, + .offset = 1, // Stored in _has_storage_ to save space. + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBool, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetPathElementsRequest_GetPathElementsRequestV0 class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetPathElementsRequest_GetPathElementsRequestV0__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetPathElementsRequest)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetPathElementsResponse + +@implementation GetPathElementsResponse + +@dynamic versionOneOfCase; +@dynamic v0; + +typedef struct GetPathElementsResponse__storage_ { + uint32_t _has_storage_[2]; + GetPathElementsResponse_GetPathElementsResponseV0 *v0; +} GetPathElementsResponse__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "v0", + .dataTypeSpecific.clazz = GPBObjCClass(GetPathElementsResponse_GetPathElementsResponseV0), + .number = GetPathElementsResponse_FieldNumber_V0, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetPathElementsResponse__storage_, v0), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetPathElementsResponse class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetPathElementsResponse__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "version", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetPathElementsResponse_ClearVersionOneOfCase(GetPathElementsResponse *message) { + GPBDescriptor *descriptor = [GetPathElementsResponse descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetPathElementsResponse_GetPathElementsResponseV0 + +@implementation GetPathElementsResponse_GetPathElementsResponseV0 + +@dynamic resultOneOfCase; +@dynamic elements; +@dynamic proof; +@dynamic hasMetadata, metadata; + +typedef struct GetPathElementsResponse_GetPathElementsResponseV0__storage_ { + uint32_t _has_storage_[2]; + GetPathElementsResponse_GetPathElementsResponseV0_Elements *elements; + Proof *proof; + ResponseMetadata *metadata; +} GetPathElementsResponse_GetPathElementsResponseV0__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "elements", + .dataTypeSpecific.clazz = GPBObjCClass(GetPathElementsResponse_GetPathElementsResponseV0_Elements), + .number = GetPathElementsResponse_GetPathElementsResponseV0_FieldNumber_Elements, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetPathElementsResponse_GetPathElementsResponseV0__storage_, elements), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + { + .name = "proof", + .dataTypeSpecific.clazz = GPBObjCClass(Proof), + .number = GetPathElementsResponse_GetPathElementsResponseV0_FieldNumber_Proof, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetPathElementsResponse_GetPathElementsResponseV0__storage_, proof), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + { + .name = "metadata", + .dataTypeSpecific.clazz = GPBObjCClass(ResponseMetadata), + .number = GetPathElementsResponse_GetPathElementsResponseV0_FieldNumber_Metadata, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetPathElementsResponse_GetPathElementsResponseV0__storage_, metadata), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetPathElementsResponse_GetPathElementsResponseV0 class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetPathElementsResponse_GetPathElementsResponseV0__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "result", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetPathElementsResponse)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetPathElementsResponse_GetPathElementsResponseV0_ClearResultOneOfCase(GetPathElementsResponse_GetPathElementsResponseV0 *message) { + GPBDescriptor *descriptor = [GetPathElementsResponse_GetPathElementsResponseV0 descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetPathElementsResponse_GetPathElementsResponseV0_Elements + +@implementation GetPathElementsResponse_GetPathElementsResponseV0_Elements + +@dynamic elementsArray, elementsArray_Count; + +typedef struct GetPathElementsResponse_GetPathElementsResponseV0_Elements__storage_ { + uint32_t _has_storage_[1]; + NSMutableArray *elementsArray; +} GetPathElementsResponse_GetPathElementsResponseV0_Elements__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "elementsArray", + .dataTypeSpecific.clazz = Nil, + .number = GetPathElementsResponse_GetPathElementsResponseV0_Elements_FieldNumber_ElementsArray, + .hasIndex = GPBNoHasBit, + .offset = (uint32_t)offsetof(GetPathElementsResponse_GetPathElementsResponseV0_Elements__storage_, elementsArray), + .flags = GPBFieldRepeated, + .dataType = GPBDataTypeBytes, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetPathElementsResponse_GetPathElementsResponseV0_Elements class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetPathElementsResponse_GetPathElementsResponseV0_Elements__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetPathElementsResponse_GetPathElementsResponseV0)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + #pragma clang diagnostic pop diff --git a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbrpc.h b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbrpc.h index f3db6c60f3..1554fa906e 100644 --- a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbrpc.h +++ b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbrpc.h @@ -46,6 +46,8 @@ @class GetIdentityNonceResponse; @class GetIdentityRequest; @class GetIdentityResponse; +@class GetPathElementsRequest; +@class GetPathElementsResponse; @class GetProofsRequest; @class GetProofsResponse; @class GetProtocolVersionUpgradeStateRequest; @@ -164,6 +166,10 @@ NS_ASSUME_NONNULL_BEGIN - (GRPCUnaryProtoCall *)getEpochsInfoWithMessage:(GetEpochsInfoRequest *)message responseHandler:(id)handler callOptions:(GRPCCallOptions *_Nullable)callOptions; +#pragma mark getPathElements(GetPathElementsRequest) returns (GetPathElementsResponse) + +- (GRPCUnaryProtoCall *)getPathElementsWithMessage:(GetPathElementsRequest *)message responseHandler:(id)handler callOptions:(GRPCCallOptions *_Nullable)callOptions; + @end /** @@ -312,6 +318,13 @@ NS_ASSUME_NONNULL_BEGIN - (GRPCProtoCall *)RPCTogetEpochsInfoWithRequest:(GetEpochsInfoRequest *)request handler:(void(^)(GetEpochsInfoResponse *_Nullable response, NSError *_Nullable error))handler; +#pragma mark getPathElements(GetPathElementsRequest) returns (GetPathElementsResponse) + +- (void)getPathElementsWithRequest:(GetPathElementsRequest *)request handler:(void(^)(GetPathElementsResponse *_Nullable response, NSError *_Nullable error))handler; + +- (GRPCProtoCall *)RPCTogetPathElementsWithRequest:(GetPathElementsRequest *)request handler:(void(^)(GetPathElementsResponse *_Nullable response, NSError *_Nullable error))handler; + + @end diff --git a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbrpc.m b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbrpc.m index e4fe44abba..72f06e7631 100644 --- a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbrpc.m +++ b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbrpc.m @@ -470,5 +470,25 @@ - (GRPCUnaryProtoCall *)getEpochsInfoWithMessage:(GetEpochsInfoRequest *)message responseClass:[GetEpochsInfoResponse class]]; } +#pragma mark getPathElements(GetPathElementsRequest) returns (GetPathElementsResponse) + +- (void)getPathElementsWithRequest:(GetPathElementsRequest *)request handler:(void(^)(GetPathElementsResponse *_Nullable response, NSError *_Nullable error))handler{ + [[self RPCTogetPathElementsWithRequest:request handler:handler] start]; +} +// Returns a not-yet-started RPC object. +- (GRPCProtoCall *)RPCTogetPathElementsWithRequest:(GetPathElementsRequest *)request handler:(void(^)(GetPathElementsResponse *_Nullable response, NSError *_Nullable error))handler{ + return [self RPCToMethod:@"getPathElements" + requestsWriter:[GRXWriter writerWithValue:request] + responseClass:[GetPathElementsResponse class] + responsesWriteable:[GRXWriteable writeableWithSingleHandler:handler]]; +} +- (GRPCUnaryProtoCall *)getPathElementsWithMessage:(GetPathElementsRequest *)message responseHandler:(id)handler callOptions:(GRPCCallOptions *_Nullable)callOptions { + return [self RPCToMethod:@"getPathElements" + message:message + responseHandler:handler + callOptions:callOptions + responseClass:[GetPathElementsResponse class]]; +} + @end #endif diff --git a/packages/dapi-grpc/clients/platform/v0/python/platform_pb2.py b/packages/dapi-grpc/clients/platform/v0/python/platform_pb2.py index 8348a045e7..b4602e02e9 100644 --- a/packages/dapi-grpc/clients/platform/v0/python/platform_pb2.py +++ b/packages/dapi-grpc/clients/platform/v0/python/platform_pb2.py @@ -22,7 +22,7 @@ syntax='proto3', serialized_options=None, create_key=_descriptor._internal_create_key, - serialized_pb=b'\n\x0eplatform.proto\x12\x19org.dash.platform.dapi.v0\x1a\x1egoogle/protobuf/wrappers.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"\x81\x01\n\x05Proof\x12\x15\n\rgrovedb_proof\x18\x01 \x01(\x0c\x12\x13\n\x0bquorum_hash\x18\x02 \x01(\x0c\x12\x11\n\tsignature\x18\x03 \x01(\x0c\x12\r\n\x05round\x18\x04 \x01(\r\x12\x15\n\rblock_id_hash\x18\x05 \x01(\x0c\x12\x13\n\x0bquorum_type\x18\x06 \x01(\r\"\x90\x01\n\x10ResponseMetadata\x12\x0e\n\x06height\x18\x01 \x01(\x04\x12 \n\x18\x63ore_chain_locked_height\x18\x02 \x01(\r\x12\r\n\x05\x65poch\x18\x03 \x01(\r\x12\x0f\n\x07time_ms\x18\x04 \x01(\x04\x12\x18\n\x10protocol_version\x18\x05 \x01(\r\x12\x10\n\x08\x63hain_id\x18\x06 \x01(\t\"L\n\x1dStateTransitionBroadcastError\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\x0f\n\x07message\x18\x02 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x03 \x01(\x0c\";\n\x1f\x42roadcastStateTransitionRequest\x12\x18\n\x10state_transition\x18\x01 \x01(\x0c\"\"\n BroadcastStateTransitionResponse\"\xa4\x01\n\x12GetIdentityRequest\x12P\n\x02v0\x18\x01 \x01(\x0b\x32\x42.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0H\x00\x1a\x31\n\x14GetIdentityRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xc1\x01\n\x17GetIdentityNonceRequest\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0H\x00\x1a?\n\x19GetIdentityNonceRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xf6\x01\n\x1fGetIdentityContractNonceRequest\x12j\n\x02v0\x18\x01 \x01(\x0b\x32\\.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0H\x00\x1a\\\n!GetIdentityContractNonceRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12\x13\n\x0b\x63ontract_id\x18\x02 \x01(\x0c\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\xc0\x01\n\x19GetIdentityBalanceRequest\x12^\n\x02v0\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0H\x00\x1a\x38\n\x1bGetIdentityBalanceRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xec\x01\n$GetIdentityBalanceAndRevisionRequest\x12t\n\x02v0\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0H\x00\x1a\x43\n&GetIdentityBalanceAndRevisionRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x9e\x02\n\x13GetIdentityResponse\x12R\n\x02v0\x18\x01 \x01(\x0b\x32\x44.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0H\x00\x1a\xa7\x01\n\x15GetIdentityResponseV0\x12\x12\n\x08identity\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xad\x01\n\x14GetIdentitiesRequest\x12T\n\x02v0\x18\x01 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0H\x00\x1a\x34\n\x16GetIdentitiesRequestV0\x12\x0b\n\x03ids\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xda\x04\n\x15GetIdentitiesResponse\x12V\n\x02v0\x18\x01 \x01(\x0b\x32H.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0H\x00\x1a\x1e\n\rIdentityValue\x12\r\n\x05value\x18\x01 \x01(\x0c\x1ak\n\rIdentityEntry\x12\x0b\n\x03key\x18\x01 \x01(\x0c\x12M\n\x05value\x18\x02 \x01(\x0b\x32>.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue\x1a\x66\n\nIdentities\x12X\n\x10identity_entries\x18\x01 \x03(\x0b\x32>.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry\x1a\xe8\x01\n\x17GetIdentitiesResponseV0\x12Q\n\nidentities\x18\x01 \x01(\x0b\x32;.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentitiesH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb8\x02\n\x18GetIdentityNonceResponse\x12\\\n\x02v0\x18\x01 \x01(\x0b\x32N.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0H\x00\x1a\xb2\x01\n\x1aGetIdentityNonceResponseV0\x12\x18\n\x0eidentity_nonce\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xe1\x02\n GetIdentityContractNonceResponse\x12l\n\x02v0\x18\x01 \x01(\x0b\x32^.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0H\x00\x1a\xc3\x01\n\"GetIdentityContractNonceResponseV0\x12!\n\x17identity_contract_nonce\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb9\x02\n\x1aGetIdentityBalanceResponse\x12`\n\x02v0\x18\x01 \x01(\x0b\x32R.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0H\x00\x1a\xad\x01\n\x1cGetIdentityBalanceResponseV0\x12\x11\n\x07\x62\x61lance\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xa9\x04\n%GetIdentityBalanceAndRevisionResponse\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0H\x00\x1a\xfc\x02\n\'GetIdentityBalanceAndRevisionResponseV0\x12\x9b\x01\n\x14\x62\x61lance_and_revision\x18\x01 \x01(\x0b\x32{.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevisionH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x37\n\x12\x42\x61lanceAndRevision\x12\x0f\n\x07\x62\x61lance\x18\x01 \x01(\x04\x12\x10\n\x08revision\x18\x02 \x01(\x04\x42\x08\n\x06resultB\t\n\x07version\"\xd1\x01\n\x0eKeyRequestType\x12\x36\n\x08\x61ll_keys\x18\x01 \x01(\x0b\x32\".org.dash.platform.dapi.v0.AllKeysH\x00\x12@\n\rspecific_keys\x18\x02 \x01(\x0b\x32\'.org.dash.platform.dapi.v0.SpecificKeysH\x00\x12:\n\nsearch_key\x18\x03 \x01(\x0b\x32$.org.dash.platform.dapi.v0.SearchKeyH\x00\x42\t\n\x07request\"\t\n\x07\x41llKeys\"\x1f\n\x0cSpecificKeys\x12\x0f\n\x07key_ids\x18\x01 \x03(\r\"\xb6\x01\n\tSearchKey\x12I\n\x0bpurpose_map\x18\x01 \x03(\x0b\x32\x34.org.dash.platform.dapi.v0.SearchKey.PurposeMapEntry\x1a^\n\x0fPurposeMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12:\n\x05value\x18\x02 \x01(\x0b\x32+.org.dash.platform.dapi.v0.SecurityLevelMap:\x02\x38\x01\"\xbf\x02\n\x10SecurityLevelMap\x12]\n\x12security_level_map\x18\x01 \x03(\x0b\x32\x41.org.dash.platform.dapi.v0.SecurityLevelMap.SecurityLevelMapEntry\x1aw\n\x15SecurityLevelMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12M\n\x05value\x18\x02 \x01(\x0e\x32>.org.dash.platform.dapi.v0.SecurityLevelMap.KeyKindRequestType:\x02\x38\x01\"S\n\x12KeyKindRequestType\x12\x1f\n\x1b\x43URRENT_KEY_OF_KIND_REQUEST\x10\x00\x12\x1c\n\x18\x41LL_KEYS_OF_KIND_REQUEST\x10\x01\"\xda\x02\n\x16GetIdentityKeysRequest\x12X\n\x02v0\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0H\x00\x1a\xda\x01\n\x18GetIdentityKeysRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12?\n\x0crequest_type\x18\x02 \x01(\x0b\x32).org.dash.platform.dapi.v0.KeyRequestType\x12+\n\x05limit\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12,\n\x06offset\x18\x04 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\t\n\x07version\"\x99\x03\n\x17GetIdentityKeysResponse\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0H\x00\x1a\x96\x02\n\x19GetIdentityKeysResponseV0\x12\x61\n\x04keys\x18\x01 \x01(\x0b\x32Q.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.KeysH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x1a\n\x04Keys\x12\x12\n\nkeys_bytes\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version\"\xa1\x06\n\x10GetProofsRequest\x12L\n\x02v0\x18\x01 \x01(\x0b\x32>.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0H\x00\x1a\xb3\x05\n\x12GetProofsRequestV0\x12\x62\n\nidentities\x18\x01 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest\x12\x61\n\tcontracts\x18\x02 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest\x12\x61\n\tdocuments\x18\x03 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest\x1aw\n\x0f\x44ocumentRequest\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x15\n\rdocument_type\x18\x02 \x01(\t\x12#\n\x1b\x64ocument_type_keeps_history\x18\x03 \x01(\x08\x12\x13\n\x0b\x64ocument_id\x18\x04 \x01(\x0c\x1a\xd1\x01\n\x0fIdentityRequest\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12i\n\x0crequest_type\x18\x02 \x01(\x0e\x32S.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type\">\n\x04Type\x12\x11\n\rFULL_IDENTITY\x10\x00\x12\x0b\n\x07\x42\x41LANCE\x10\x01\x12\x08\n\x04KEYS\x10\x02\x12\x0c\n\x08REVISION\x10\x03\x1a&\n\x0f\x43ontractRequest\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x42\t\n\x07version\"\x82\x02\n\x11GetProofsResponse\x12N\n\x02v0\x18\x01 \x01(\x0b\x32@.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0H\x00\x1a\x91\x01\n\x13GetProofsResponseV0\x12\x31\n\x05proof\x18\x01 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x02 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb4\x01\n\x16GetDataContractRequest\x12X\n\x02v0\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0H\x00\x1a\x35\n\x18GetDataContractRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xb3\x02\n\x17GetDataContractResponse\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0H\x00\x1a\xb0\x01\n\x19GetDataContractResponseV0\x12\x17\n\rdata_contract\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb9\x01\n\x17GetDataContractsRequest\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0H\x00\x1a\x37\n\x19GetDataContractsRequestV0\x12\x0b\n\x03ids\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xcf\x04\n\x18GetDataContractsResponse\x12\\\n\x02v0\x18\x01 \x01(\x0b\x32N.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0H\x00\x1a[\n\x11\x44\x61taContractEntry\x12\x12\n\nidentifier\x18\x01 \x01(\x0c\x12\x32\n\rdata_contract\x18\x02 \x01(\x0b\x32\x1b.google.protobuf.BytesValue\x1au\n\rDataContracts\x12\x64\n\x15\x64\x61ta_contract_entries\x18\x01 \x03(\x0b\x32\x45.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry\x1a\xf5\x01\n\x1aGetDataContractsResponseV0\x12[\n\x0e\x64\x61ta_contracts\x18\x01 \x01(\x0b\x32\x41.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xc1\x02\n\x1dGetDataContractHistoryRequest\x12\x66\n\x02v0\x18\x01 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0H\x00\x1a\xac\x01\n\x1fGetDataContractHistoryRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12+\n\x05limit\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12,\n\x06offset\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\x13\n\x0bstart_at_ms\x18\x04 \x01(\x04\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\t\n\x07version\"\xae\x05\n\x1eGetDataContractHistoryResponse\x12h\n\x02v0\x18\x01 \x01(\x0b\x32Z.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0H\x00\x1a\x96\x04\n GetDataContractHistoryResponseV0\x12\x8f\x01\n\x15\x64\x61ta_contract_history\x18\x01 \x01(\x0b\x32n.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x37\n\x18\x44\x61taContractHistoryEntry\x12\x0c\n\x04\x64\x61te\x18\x01 \x01(\x04\x12\r\n\x05value\x18\x02 \x01(\x0c\x1a\xaa\x01\n\x13\x44\x61taContractHistory\x12\x92\x01\n\x15\x64\x61ta_contract_entries\x18\x01 \x03(\x0b\x32s.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntryB\x08\n\x06resultB\t\n\x07version\"\xb2\x02\n\x13GetDocumentsRequest\x12R\n\x02v0\x18\x01 \x01(\x0b\x32\x44.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0H\x00\x1a\xbb\x01\n\x15GetDocumentsRequestV0\x12\x18\n\x10\x64\x61ta_contract_id\x18\x01 \x01(\x0c\x12\x15\n\rdocument_type\x18\x02 \x01(\t\x12\r\n\x05where\x18\x03 \x01(\x0c\x12\x10\n\x08order_by\x18\x04 \x01(\x0c\x12\r\n\x05limit\x18\x05 \x01(\r\x12\x15\n\x0bstart_after\x18\x06 \x01(\x0cH\x00\x12\x12\n\x08start_at\x18\x07 \x01(\x0cH\x00\x12\r\n\x05prove\x18\x08 \x01(\x08\x42\x07\n\x05startB\t\n\x07version\"\x95\x03\n\x14GetDocumentsResponse\x12T\n\x02v0\x18\x01 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0H\x00\x1a\x9b\x02\n\x16GetDocumentsResponseV0\x12\x65\n\tdocuments\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.DocumentsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x1e\n\tDocuments\x12\x11\n\tdocuments\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version\"\xff\x01\n%GetIdentitiesByPublicKeyHashesRequest\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0H\x00\x1aS\n\'GetIdentitiesByPublicKeyHashesRequestV0\x12\x19\n\x11public_key_hashes\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xc6\x05\n&GetIdentitiesByPublicKeyHashesResponse\x12x\n\x02v0\x18\x01 \x01(\x0b\x32j.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0H\x00\x1a\x61\n\x1aPublicKeyHashIdentityEntry\x12\x17\n\x0fpublic_key_hash\x18\x01 \x01(\x0c\x12*\n\x05value\x18\x02 \x01(\x0b\x32\x1b.google.protobuf.BytesValue\x1a\x95\x01\n\x1bIdentitiesByPublicKeyHashes\x12v\n\x10identity_entries\x18\x01 \x03(\x0b\x32\\.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry\x1a\x9b\x02\n(GetIdentitiesByPublicKeyHashesResponseV0\x12s\n\nidentities\x18\x01 \x01(\x0b\x32].org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashesH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xed\x01\n!GetIdentityByPublicKeyHashRequest\x12n\n\x02v0\x18\x01 \x01(\x0b\x32`.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0H\x00\x1aM\n#GetIdentityByPublicKeyHashRequestV0\x12\x17\n\x0fpublic_key_hash\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xda\x02\n\"GetIdentityByPublicKeyHashResponse\x12p\n\x02v0\x18\x01 \x01(\x0b\x32\x62.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0H\x00\x1a\xb6\x01\n$GetIdentityByPublicKeyHashResponseV0\x12\x12\n\x08identity\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xfb\x01\n#WaitForStateTransitionResultRequest\x12r\n\x02v0\x18\x01 \x01(\x0b\x32\x64.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0H\x00\x1aU\n%WaitForStateTransitionResultRequestV0\x12\x1d\n\x15state_transition_hash\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x99\x03\n$WaitForStateTransitionResultResponse\x12t\n\x02v0\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0H\x00\x1a\xef\x01\n&WaitForStateTransitionResultResponseV0\x12I\n\x05\x65rror\x18\x01 \x01(\x0b\x32\x38.org.dash.platform.dapi.v0.StateTransitionBroadcastErrorH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xc4\x01\n\x19GetConsensusParamsRequest\x12^\n\x02v0\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0H\x00\x1a<\n\x1bGetConsensusParamsRequestV0\x12\x0e\n\x06height\x18\x01 \x01(\x05\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x9c\x04\n\x1aGetConsensusParamsResponse\x12`\n\x02v0\x18\x01 \x01(\x0b\x32R.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0H\x00\x1aP\n\x14\x43onsensusParamsBlock\x12\x11\n\tmax_bytes\x18\x01 \x01(\t\x12\x0f\n\x07max_gas\x18\x02 \x01(\t\x12\x14\n\x0ctime_iota_ms\x18\x03 \x01(\t\x1a\x62\n\x17\x43onsensusParamsEvidence\x12\x1a\n\x12max_age_num_blocks\x18\x01 \x01(\t\x12\x18\n\x10max_age_duration\x18\x02 \x01(\t\x12\x11\n\tmax_bytes\x18\x03 \x01(\t\x1a\xda\x01\n\x1cGetConsensusParamsResponseV0\x12Y\n\x05\x62lock\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock\x12_\n\x08\x65vidence\x18\x02 \x01(\x0b\x32M.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidenceB\t\n\x07version\"\xe4\x01\n%GetProtocolVersionUpgradeStateRequest\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0H\x00\x1a\x38\n\'GetProtocolVersionUpgradeStateRequestV0\x12\r\n\x05prove\x18\x01 \x01(\x08\x42\t\n\x07version\"\xb5\x05\n&GetProtocolVersionUpgradeStateResponse\x12x\n\x02v0\x18\x01 \x01(\x0b\x32j.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0H\x00\x1a\x85\x04\n(GetProtocolVersionUpgradeStateResponseV0\x12\x87\x01\n\x08versions\x18\x01 \x01(\x0b\x32s.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x96\x01\n\x08Versions\x12\x89\x01\n\x08versions\x18\x01 \x03(\x0b\x32w.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry\x1a:\n\x0cVersionEntry\x12\x16\n\x0eversion_number\x18\x01 \x01(\r\x12\x12\n\nvote_count\x18\x02 \x01(\rB\x08\n\x06resultB\t\n\x07version\"\xa3\x02\n*GetProtocolVersionUpgradeVoteStatusRequest\x12\x80\x01\n\x02v0\x18\x01 \x01(\x0b\x32r.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0H\x00\x1ag\n,GetProtocolVersionUpgradeVoteStatusRequestV0\x12\x19\n\x11start_pro_tx_hash\x18\x01 \x01(\x0c\x12\r\n\x05\x63ount\x18\x02 \x01(\r\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\xef\x05\n+GetProtocolVersionUpgradeVoteStatusResponse\x12\x82\x01\n\x02v0\x18\x01 \x01(\x0b\x32t.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0H\x00\x1a\xaf\x04\n-GetProtocolVersionUpgradeVoteStatusResponseV0\x12\x98\x01\n\x08versions\x18\x01 \x01(\x0b\x32\x83\x01.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignalsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\xaf\x01\n\x0eVersionSignals\x12\x9c\x01\n\x0fversion_signals\x18\x01 \x03(\x0b\x32\x82\x01.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal\x1a\x35\n\rVersionSignal\x12\x13\n\x0bpro_tx_hash\x18\x01 \x01(\x0c\x12\x0f\n\x07version\x18\x02 \x01(\rB\x08\n\x06resultB\t\n\x07version\"\xf5\x01\n\x14GetEpochsInfoRequest\x12T\n\x02v0\x18\x01 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0H\x00\x1a|\n\x16GetEpochsInfoRequestV0\x12\x31\n\x0bstart_epoch\x18\x01 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\r\n\x05\x63ount\x18\x02 \x01(\r\x12\x11\n\tascending\x18\x03 \x01(\x08\x12\r\n\x05prove\x18\x04 \x01(\x08\x42\t\n\x07version\"\x91\x05\n\x15GetEpochsInfoResponse\x12V\n\x02v0\x18\x01 \x01(\x0b\x32H.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0H\x00\x1a\x94\x04\n\x17GetEpochsInfoResponseV0\x12\x65\n\x06\x65pochs\x18\x01 \x01(\x0b\x32S.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfosH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1au\n\nEpochInfos\x12g\n\x0b\x65poch_infos\x18\x01 \x03(\x0b\x32R.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo\x1a\x9e\x01\n\tEpochInfo\x12\x0e\n\x06number\x18\x01 \x01(\r\x12\x1a\n\x12\x66irst_block_height\x18\x02 \x01(\x04\x12\x1f\n\x17\x66irst_core_block_height\x18\x03 \x01(\r\x12\x12\n\nstart_time\x18\x04 \x01(\x04\x12\x16\n\x0e\x66\x65\x65_multiplier\x18\x05 \x01(\x01\x12\x18\n\x10protocol_version\x18\x06 \x01(\rB\x08\n\x06resultB\t\n\x07version2\xd5\x15\n\x08Platform\x12\x93\x01\n\x18\x62roadcastStateTransition\x12:.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest\x1a;.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse\x12l\n\x0bgetIdentity\x12-.org.dash.platform.dapi.v0.GetIdentityRequest\x1a..org.dash.platform.dapi.v0.GetIdentityResponse\x12r\n\rgetIdentities\x12/.org.dash.platform.dapi.v0.GetIdentitiesRequest\x1a\x30.org.dash.platform.dapi.v0.GetIdentitiesResponse\x12x\n\x0fgetIdentityKeys\x12\x31.org.dash.platform.dapi.v0.GetIdentityKeysRequest\x1a\x32.org.dash.platform.dapi.v0.GetIdentityKeysResponse\x12{\n\x10getIdentityNonce\x12\x32.org.dash.platform.dapi.v0.GetIdentityNonceRequest\x1a\x33.org.dash.platform.dapi.v0.GetIdentityNonceResponse\x12\x93\x01\n\x18getIdentityContractNonce\x12:.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest\x1a;.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse\x12\x81\x01\n\x12getIdentityBalance\x12\x34.org.dash.platform.dapi.v0.GetIdentityBalanceRequest\x1a\x35.org.dash.platform.dapi.v0.GetIdentityBalanceResponse\x12\xa2\x01\n\x1dgetIdentityBalanceAndRevision\x12?.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest\x1a@.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse\x12\x66\n\tgetProofs\x12+.org.dash.platform.dapi.v0.GetProofsRequest\x1a,.org.dash.platform.dapi.v0.GetProofsResponse\x12x\n\x0fgetDataContract\x12\x31.org.dash.platform.dapi.v0.GetDataContractRequest\x1a\x32.org.dash.platform.dapi.v0.GetDataContractResponse\x12\x8d\x01\n\x16getDataContractHistory\x12\x38.org.dash.platform.dapi.v0.GetDataContractHistoryRequest\x1a\x39.org.dash.platform.dapi.v0.GetDataContractHistoryResponse\x12{\n\x10getDataContracts\x12\x32.org.dash.platform.dapi.v0.GetDataContractsRequest\x1a\x33.org.dash.platform.dapi.v0.GetDataContractsResponse\x12o\n\x0cgetDocuments\x12..org.dash.platform.dapi.v0.GetDocumentsRequest\x1a/.org.dash.platform.dapi.v0.GetDocumentsResponse\x12\xa5\x01\n\x1egetIdentitiesByPublicKeyHashes\x12@.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest\x1a\x41.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse\x12\x99\x01\n\x1agetIdentityByPublicKeyHash\x12<.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest\x1a=.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse\x12\x9f\x01\n\x1cwaitForStateTransitionResult\x12>.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest\x1a?.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse\x12\x81\x01\n\x12getConsensusParams\x12\x34.org.dash.platform.dapi.v0.GetConsensusParamsRequest\x1a\x35.org.dash.platform.dapi.v0.GetConsensusParamsResponse\x12\xa5\x01\n\x1egetProtocolVersionUpgradeState\x12@.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest\x1a\x41.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse\x12\xb4\x01\n#getProtocolVersionUpgradeVoteStatus\x12\x45.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest\x1a\x46.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse\x12r\n\rgetEpochsInfo\x12/.org.dash.platform.dapi.v0.GetEpochsInfoRequest\x1a\x30.org.dash.platform.dapi.v0.GetEpochsInfoResponseb\x06proto3' + serialized_pb=b'\n\x0eplatform.proto\x12\x19org.dash.platform.dapi.v0\x1a\x1egoogle/protobuf/wrappers.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"\x81\x01\n\x05Proof\x12\x15\n\rgrovedb_proof\x18\x01 \x01(\x0c\x12\x13\n\x0bquorum_hash\x18\x02 \x01(\x0c\x12\x11\n\tsignature\x18\x03 \x01(\x0c\x12\r\n\x05round\x18\x04 \x01(\r\x12\x15\n\rblock_id_hash\x18\x05 \x01(\x0c\x12\x13\n\x0bquorum_type\x18\x06 \x01(\r\"\x90\x01\n\x10ResponseMetadata\x12\x0e\n\x06height\x18\x01 \x01(\x04\x12 \n\x18\x63ore_chain_locked_height\x18\x02 \x01(\r\x12\r\n\x05\x65poch\x18\x03 \x01(\r\x12\x0f\n\x07time_ms\x18\x04 \x01(\x04\x12\x18\n\x10protocol_version\x18\x05 \x01(\r\x12\x10\n\x08\x63hain_id\x18\x06 \x01(\t\"L\n\x1dStateTransitionBroadcastError\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\x0f\n\x07message\x18\x02 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x03 \x01(\x0c\";\n\x1f\x42roadcastStateTransitionRequest\x12\x18\n\x10state_transition\x18\x01 \x01(\x0c\"\"\n BroadcastStateTransitionResponse\"\xa4\x01\n\x12GetIdentityRequest\x12P\n\x02v0\x18\x01 \x01(\x0b\x32\x42.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0H\x00\x1a\x31\n\x14GetIdentityRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xc1\x01\n\x17GetIdentityNonceRequest\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0H\x00\x1a?\n\x19GetIdentityNonceRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xf6\x01\n\x1fGetIdentityContractNonceRequest\x12j\n\x02v0\x18\x01 \x01(\x0b\x32\\.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0H\x00\x1a\\\n!GetIdentityContractNonceRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12\x13\n\x0b\x63ontract_id\x18\x02 \x01(\x0c\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\xc0\x01\n\x19GetIdentityBalanceRequest\x12^\n\x02v0\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0H\x00\x1a\x38\n\x1bGetIdentityBalanceRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xec\x01\n$GetIdentityBalanceAndRevisionRequest\x12t\n\x02v0\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0H\x00\x1a\x43\n&GetIdentityBalanceAndRevisionRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x9e\x02\n\x13GetIdentityResponse\x12R\n\x02v0\x18\x01 \x01(\x0b\x32\x44.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0H\x00\x1a\xa7\x01\n\x15GetIdentityResponseV0\x12\x12\n\x08identity\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xad\x01\n\x14GetIdentitiesRequest\x12T\n\x02v0\x18\x01 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0H\x00\x1a\x34\n\x16GetIdentitiesRequestV0\x12\x0b\n\x03ids\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xda\x04\n\x15GetIdentitiesResponse\x12V\n\x02v0\x18\x01 \x01(\x0b\x32H.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0H\x00\x1a\x1e\n\rIdentityValue\x12\r\n\x05value\x18\x01 \x01(\x0c\x1ak\n\rIdentityEntry\x12\x0b\n\x03key\x18\x01 \x01(\x0c\x12M\n\x05value\x18\x02 \x01(\x0b\x32>.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue\x1a\x66\n\nIdentities\x12X\n\x10identity_entries\x18\x01 \x03(\x0b\x32>.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry\x1a\xe8\x01\n\x17GetIdentitiesResponseV0\x12Q\n\nidentities\x18\x01 \x01(\x0b\x32;.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentitiesH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb8\x02\n\x18GetIdentityNonceResponse\x12\\\n\x02v0\x18\x01 \x01(\x0b\x32N.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0H\x00\x1a\xb2\x01\n\x1aGetIdentityNonceResponseV0\x12\x18\n\x0eidentity_nonce\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xe1\x02\n GetIdentityContractNonceResponse\x12l\n\x02v0\x18\x01 \x01(\x0b\x32^.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0H\x00\x1a\xc3\x01\n\"GetIdentityContractNonceResponseV0\x12!\n\x17identity_contract_nonce\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb9\x02\n\x1aGetIdentityBalanceResponse\x12`\n\x02v0\x18\x01 \x01(\x0b\x32R.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0H\x00\x1a\xad\x01\n\x1cGetIdentityBalanceResponseV0\x12\x11\n\x07\x62\x61lance\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xa9\x04\n%GetIdentityBalanceAndRevisionResponse\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0H\x00\x1a\xfc\x02\n\'GetIdentityBalanceAndRevisionResponseV0\x12\x9b\x01\n\x14\x62\x61lance_and_revision\x18\x01 \x01(\x0b\x32{.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevisionH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x37\n\x12\x42\x61lanceAndRevision\x12\x0f\n\x07\x62\x61lance\x18\x01 \x01(\x04\x12\x10\n\x08revision\x18\x02 \x01(\x04\x42\x08\n\x06resultB\t\n\x07version\"\xd1\x01\n\x0eKeyRequestType\x12\x36\n\x08\x61ll_keys\x18\x01 \x01(\x0b\x32\".org.dash.platform.dapi.v0.AllKeysH\x00\x12@\n\rspecific_keys\x18\x02 \x01(\x0b\x32\'.org.dash.platform.dapi.v0.SpecificKeysH\x00\x12:\n\nsearch_key\x18\x03 \x01(\x0b\x32$.org.dash.platform.dapi.v0.SearchKeyH\x00\x42\t\n\x07request\"\t\n\x07\x41llKeys\"\x1f\n\x0cSpecificKeys\x12\x0f\n\x07key_ids\x18\x01 \x03(\r\"\xb6\x01\n\tSearchKey\x12I\n\x0bpurpose_map\x18\x01 \x03(\x0b\x32\x34.org.dash.platform.dapi.v0.SearchKey.PurposeMapEntry\x1a^\n\x0fPurposeMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12:\n\x05value\x18\x02 \x01(\x0b\x32+.org.dash.platform.dapi.v0.SecurityLevelMap:\x02\x38\x01\"\xbf\x02\n\x10SecurityLevelMap\x12]\n\x12security_level_map\x18\x01 \x03(\x0b\x32\x41.org.dash.platform.dapi.v0.SecurityLevelMap.SecurityLevelMapEntry\x1aw\n\x15SecurityLevelMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12M\n\x05value\x18\x02 \x01(\x0e\x32>.org.dash.platform.dapi.v0.SecurityLevelMap.KeyKindRequestType:\x02\x38\x01\"S\n\x12KeyKindRequestType\x12\x1f\n\x1b\x43URRENT_KEY_OF_KIND_REQUEST\x10\x00\x12\x1c\n\x18\x41LL_KEYS_OF_KIND_REQUEST\x10\x01\"\xda\x02\n\x16GetIdentityKeysRequest\x12X\n\x02v0\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0H\x00\x1a\xda\x01\n\x18GetIdentityKeysRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12?\n\x0crequest_type\x18\x02 \x01(\x0b\x32).org.dash.platform.dapi.v0.KeyRequestType\x12+\n\x05limit\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12,\n\x06offset\x18\x04 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\t\n\x07version\"\x99\x03\n\x17GetIdentityKeysResponse\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0H\x00\x1a\x96\x02\n\x19GetIdentityKeysResponseV0\x12\x61\n\x04keys\x18\x01 \x01(\x0b\x32Q.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.KeysH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x1a\n\x04Keys\x12\x12\n\nkeys_bytes\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version\"\xa1\x06\n\x10GetProofsRequest\x12L\n\x02v0\x18\x01 \x01(\x0b\x32>.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0H\x00\x1a\xb3\x05\n\x12GetProofsRequestV0\x12\x62\n\nidentities\x18\x01 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest\x12\x61\n\tcontracts\x18\x02 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest\x12\x61\n\tdocuments\x18\x03 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest\x1aw\n\x0f\x44ocumentRequest\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x15\n\rdocument_type\x18\x02 \x01(\t\x12#\n\x1b\x64ocument_type_keeps_history\x18\x03 \x01(\x08\x12\x13\n\x0b\x64ocument_id\x18\x04 \x01(\x0c\x1a\xd1\x01\n\x0fIdentityRequest\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12i\n\x0crequest_type\x18\x02 \x01(\x0e\x32S.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type\">\n\x04Type\x12\x11\n\rFULL_IDENTITY\x10\x00\x12\x0b\n\x07\x42\x41LANCE\x10\x01\x12\x08\n\x04KEYS\x10\x02\x12\x0c\n\x08REVISION\x10\x03\x1a&\n\x0f\x43ontractRequest\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x42\t\n\x07version\"\x82\x02\n\x11GetProofsResponse\x12N\n\x02v0\x18\x01 \x01(\x0b\x32@.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0H\x00\x1a\x91\x01\n\x13GetProofsResponseV0\x12\x31\n\x05proof\x18\x01 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x02 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb4\x01\n\x16GetDataContractRequest\x12X\n\x02v0\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0H\x00\x1a\x35\n\x18GetDataContractRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xb3\x02\n\x17GetDataContractResponse\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0H\x00\x1a\xb0\x01\n\x19GetDataContractResponseV0\x12\x17\n\rdata_contract\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb9\x01\n\x17GetDataContractsRequest\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0H\x00\x1a\x37\n\x19GetDataContractsRequestV0\x12\x0b\n\x03ids\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xcf\x04\n\x18GetDataContractsResponse\x12\\\n\x02v0\x18\x01 \x01(\x0b\x32N.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0H\x00\x1a[\n\x11\x44\x61taContractEntry\x12\x12\n\nidentifier\x18\x01 \x01(\x0c\x12\x32\n\rdata_contract\x18\x02 \x01(\x0b\x32\x1b.google.protobuf.BytesValue\x1au\n\rDataContracts\x12\x64\n\x15\x64\x61ta_contract_entries\x18\x01 \x03(\x0b\x32\x45.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry\x1a\xf5\x01\n\x1aGetDataContractsResponseV0\x12[\n\x0e\x64\x61ta_contracts\x18\x01 \x01(\x0b\x32\x41.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xc1\x02\n\x1dGetDataContractHistoryRequest\x12\x66\n\x02v0\x18\x01 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0H\x00\x1a\xac\x01\n\x1fGetDataContractHistoryRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12+\n\x05limit\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12,\n\x06offset\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\x13\n\x0bstart_at_ms\x18\x04 \x01(\x04\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\t\n\x07version\"\xae\x05\n\x1eGetDataContractHistoryResponse\x12h\n\x02v0\x18\x01 \x01(\x0b\x32Z.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0H\x00\x1a\x96\x04\n GetDataContractHistoryResponseV0\x12\x8f\x01\n\x15\x64\x61ta_contract_history\x18\x01 \x01(\x0b\x32n.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x37\n\x18\x44\x61taContractHistoryEntry\x12\x0c\n\x04\x64\x61te\x18\x01 \x01(\x04\x12\r\n\x05value\x18\x02 \x01(\x0c\x1a\xaa\x01\n\x13\x44\x61taContractHistory\x12\x92\x01\n\x15\x64\x61ta_contract_entries\x18\x01 \x03(\x0b\x32s.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntryB\x08\n\x06resultB\t\n\x07version\"\xb2\x02\n\x13GetDocumentsRequest\x12R\n\x02v0\x18\x01 \x01(\x0b\x32\x44.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0H\x00\x1a\xbb\x01\n\x15GetDocumentsRequestV0\x12\x18\n\x10\x64\x61ta_contract_id\x18\x01 \x01(\x0c\x12\x15\n\rdocument_type\x18\x02 \x01(\t\x12\r\n\x05where\x18\x03 \x01(\x0c\x12\x10\n\x08order_by\x18\x04 \x01(\x0c\x12\r\n\x05limit\x18\x05 \x01(\r\x12\x15\n\x0bstart_after\x18\x06 \x01(\x0cH\x00\x12\x12\n\x08start_at\x18\x07 \x01(\x0cH\x00\x12\r\n\x05prove\x18\x08 \x01(\x08\x42\x07\n\x05startB\t\n\x07version\"\x95\x03\n\x14GetDocumentsResponse\x12T\n\x02v0\x18\x01 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0H\x00\x1a\x9b\x02\n\x16GetDocumentsResponseV0\x12\x65\n\tdocuments\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.DocumentsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x1e\n\tDocuments\x12\x11\n\tdocuments\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version\"\xff\x01\n%GetIdentitiesByPublicKeyHashesRequest\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0H\x00\x1aS\n\'GetIdentitiesByPublicKeyHashesRequestV0\x12\x19\n\x11public_key_hashes\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xc6\x05\n&GetIdentitiesByPublicKeyHashesResponse\x12x\n\x02v0\x18\x01 \x01(\x0b\x32j.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0H\x00\x1a\x61\n\x1aPublicKeyHashIdentityEntry\x12\x17\n\x0fpublic_key_hash\x18\x01 \x01(\x0c\x12*\n\x05value\x18\x02 \x01(\x0b\x32\x1b.google.protobuf.BytesValue\x1a\x95\x01\n\x1bIdentitiesByPublicKeyHashes\x12v\n\x10identity_entries\x18\x01 \x03(\x0b\x32\\.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry\x1a\x9b\x02\n(GetIdentitiesByPublicKeyHashesResponseV0\x12s\n\nidentities\x18\x01 \x01(\x0b\x32].org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashesH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xed\x01\n!GetIdentityByPublicKeyHashRequest\x12n\n\x02v0\x18\x01 \x01(\x0b\x32`.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0H\x00\x1aM\n#GetIdentityByPublicKeyHashRequestV0\x12\x17\n\x0fpublic_key_hash\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xda\x02\n\"GetIdentityByPublicKeyHashResponse\x12p\n\x02v0\x18\x01 \x01(\x0b\x32\x62.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0H\x00\x1a\xb6\x01\n$GetIdentityByPublicKeyHashResponseV0\x12\x12\n\x08identity\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xfb\x01\n#WaitForStateTransitionResultRequest\x12r\n\x02v0\x18\x01 \x01(\x0b\x32\x64.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0H\x00\x1aU\n%WaitForStateTransitionResultRequestV0\x12\x1d\n\x15state_transition_hash\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x99\x03\n$WaitForStateTransitionResultResponse\x12t\n\x02v0\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0H\x00\x1a\xef\x01\n&WaitForStateTransitionResultResponseV0\x12I\n\x05\x65rror\x18\x01 \x01(\x0b\x32\x38.org.dash.platform.dapi.v0.StateTransitionBroadcastErrorH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xc4\x01\n\x19GetConsensusParamsRequest\x12^\n\x02v0\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0H\x00\x1a<\n\x1bGetConsensusParamsRequestV0\x12\x0e\n\x06height\x18\x01 \x01(\x05\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x9c\x04\n\x1aGetConsensusParamsResponse\x12`\n\x02v0\x18\x01 \x01(\x0b\x32R.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0H\x00\x1aP\n\x14\x43onsensusParamsBlock\x12\x11\n\tmax_bytes\x18\x01 \x01(\t\x12\x0f\n\x07max_gas\x18\x02 \x01(\t\x12\x14\n\x0ctime_iota_ms\x18\x03 \x01(\t\x1a\x62\n\x17\x43onsensusParamsEvidence\x12\x1a\n\x12max_age_num_blocks\x18\x01 \x01(\t\x12\x18\n\x10max_age_duration\x18\x02 \x01(\t\x12\x11\n\tmax_bytes\x18\x03 \x01(\t\x1a\xda\x01\n\x1cGetConsensusParamsResponseV0\x12Y\n\x05\x62lock\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock\x12_\n\x08\x65vidence\x18\x02 \x01(\x0b\x32M.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidenceB\t\n\x07version\"\xe4\x01\n%GetProtocolVersionUpgradeStateRequest\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0H\x00\x1a\x38\n\'GetProtocolVersionUpgradeStateRequestV0\x12\r\n\x05prove\x18\x01 \x01(\x08\x42\t\n\x07version\"\xb5\x05\n&GetProtocolVersionUpgradeStateResponse\x12x\n\x02v0\x18\x01 \x01(\x0b\x32j.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0H\x00\x1a\x85\x04\n(GetProtocolVersionUpgradeStateResponseV0\x12\x87\x01\n\x08versions\x18\x01 \x01(\x0b\x32s.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x96\x01\n\x08Versions\x12\x89\x01\n\x08versions\x18\x01 \x03(\x0b\x32w.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry\x1a:\n\x0cVersionEntry\x12\x16\n\x0eversion_number\x18\x01 \x01(\r\x12\x12\n\nvote_count\x18\x02 \x01(\rB\x08\n\x06resultB\t\n\x07version\"\xa3\x02\n*GetProtocolVersionUpgradeVoteStatusRequest\x12\x80\x01\n\x02v0\x18\x01 \x01(\x0b\x32r.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0H\x00\x1ag\n,GetProtocolVersionUpgradeVoteStatusRequestV0\x12\x19\n\x11start_pro_tx_hash\x18\x01 \x01(\x0c\x12\r\n\x05\x63ount\x18\x02 \x01(\r\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\xef\x05\n+GetProtocolVersionUpgradeVoteStatusResponse\x12\x82\x01\n\x02v0\x18\x01 \x01(\x0b\x32t.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0H\x00\x1a\xaf\x04\n-GetProtocolVersionUpgradeVoteStatusResponseV0\x12\x98\x01\n\x08versions\x18\x01 \x01(\x0b\x32\x83\x01.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignalsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\xaf\x01\n\x0eVersionSignals\x12\x9c\x01\n\x0fversion_signals\x18\x01 \x03(\x0b\x32\x82\x01.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal\x1a\x35\n\rVersionSignal\x12\x13\n\x0bpro_tx_hash\x18\x01 \x01(\x0c\x12\x0f\n\x07version\x18\x02 \x01(\rB\x08\n\x06resultB\t\n\x07version\"\xf5\x01\n\x14GetEpochsInfoRequest\x12T\n\x02v0\x18\x01 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0H\x00\x1a|\n\x16GetEpochsInfoRequestV0\x12\x31\n\x0bstart_epoch\x18\x01 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\r\n\x05\x63ount\x18\x02 \x01(\r\x12\x11\n\tascending\x18\x03 \x01(\x08\x12\r\n\x05prove\x18\x04 \x01(\x08\x42\t\n\x07version\"\x91\x05\n\x15GetEpochsInfoResponse\x12V\n\x02v0\x18\x01 \x01(\x0b\x32H.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0H\x00\x1a\x94\x04\n\x17GetEpochsInfoResponseV0\x12\x65\n\x06\x65pochs\x18\x01 \x01(\x0b\x32S.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfosH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1au\n\nEpochInfos\x12g\n\x0b\x65poch_infos\x18\x01 \x03(\x0b\x32R.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo\x1a\x9e\x01\n\tEpochInfo\x12\x0e\n\x06number\x18\x01 \x01(\r\x12\x1a\n\x12\x66irst_block_height\x18\x02 \x01(\x04\x12\x1f\n\x17\x66irst_core_block_height\x18\x03 \x01(\r\x12\x12\n\nstart_time\x18\x04 \x01(\x04\x12\x16\n\x0e\x66\x65\x65_multiplier\x18\x05 \x01(\x01\x12\x18\n\x10protocol_version\x18\x06 \x01(\rB\x08\n\x06resultB\t\n\x07version\"\xc4\x01\n\x16GetPathElementsRequest\x12X\n\x02v0\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0H\x00\x1a\x45\n\x18GetPathElementsRequestV0\x12\x0c\n\x04path\x18\x01 \x03(\x0c\x12\x0c\n\x04keys\x18\x02 \x03(\x0c\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\xa3\x03\n\x17GetPathElementsResponse\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0H\x00\x1a\xa0\x02\n\x19GetPathElementsResponseV0\x12i\n\x08\x65lements\x18\x01 \x01(\x0b\x32U.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.ElementsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x1c\n\x08\x45lements\x12\x10\n\x08\x65lements\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version2\xcf\x16\n\x08Platform\x12\x93\x01\n\x18\x62roadcastStateTransition\x12:.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest\x1a;.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse\x12l\n\x0bgetIdentity\x12-.org.dash.platform.dapi.v0.GetIdentityRequest\x1a..org.dash.platform.dapi.v0.GetIdentityResponse\x12r\n\rgetIdentities\x12/.org.dash.platform.dapi.v0.GetIdentitiesRequest\x1a\x30.org.dash.platform.dapi.v0.GetIdentitiesResponse\x12x\n\x0fgetIdentityKeys\x12\x31.org.dash.platform.dapi.v0.GetIdentityKeysRequest\x1a\x32.org.dash.platform.dapi.v0.GetIdentityKeysResponse\x12{\n\x10getIdentityNonce\x12\x32.org.dash.platform.dapi.v0.GetIdentityNonceRequest\x1a\x33.org.dash.platform.dapi.v0.GetIdentityNonceResponse\x12\x93\x01\n\x18getIdentityContractNonce\x12:.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest\x1a;.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse\x12\x81\x01\n\x12getIdentityBalance\x12\x34.org.dash.platform.dapi.v0.GetIdentityBalanceRequest\x1a\x35.org.dash.platform.dapi.v0.GetIdentityBalanceResponse\x12\xa2\x01\n\x1dgetIdentityBalanceAndRevision\x12?.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest\x1a@.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse\x12\x66\n\tgetProofs\x12+.org.dash.platform.dapi.v0.GetProofsRequest\x1a,.org.dash.platform.dapi.v0.GetProofsResponse\x12x\n\x0fgetDataContract\x12\x31.org.dash.platform.dapi.v0.GetDataContractRequest\x1a\x32.org.dash.platform.dapi.v0.GetDataContractResponse\x12\x8d\x01\n\x16getDataContractHistory\x12\x38.org.dash.platform.dapi.v0.GetDataContractHistoryRequest\x1a\x39.org.dash.platform.dapi.v0.GetDataContractHistoryResponse\x12{\n\x10getDataContracts\x12\x32.org.dash.platform.dapi.v0.GetDataContractsRequest\x1a\x33.org.dash.platform.dapi.v0.GetDataContractsResponse\x12o\n\x0cgetDocuments\x12..org.dash.platform.dapi.v0.GetDocumentsRequest\x1a/.org.dash.platform.dapi.v0.GetDocumentsResponse\x12\xa5\x01\n\x1egetIdentitiesByPublicKeyHashes\x12@.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest\x1a\x41.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse\x12\x99\x01\n\x1agetIdentityByPublicKeyHash\x12<.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest\x1a=.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse\x12\x9f\x01\n\x1cwaitForStateTransitionResult\x12>.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest\x1a?.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse\x12\x81\x01\n\x12getConsensusParams\x12\x34.org.dash.platform.dapi.v0.GetConsensusParamsRequest\x1a\x35.org.dash.platform.dapi.v0.GetConsensusParamsResponse\x12\xa5\x01\n\x1egetProtocolVersionUpgradeState\x12@.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest\x1a\x41.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse\x12\xb4\x01\n#getProtocolVersionUpgradeVoteStatus\x12\x45.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest\x1a\x46.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse\x12r\n\rgetEpochsInfo\x12/.org.dash.platform.dapi.v0.GetEpochsInfoRequest\x1a\x30.org.dash.platform.dapi.v0.GetEpochsInfoResponse\x12x\n\x0fgetPathElements\x12\x31.org.dash.platform.dapi.v0.GetPathElementsRequest\x1a\x32.org.dash.platform.dapi.v0.GetPathElementsResponseb\x06proto3' , dependencies=[google_dot_protobuf_dot_wrappers__pb2.DESCRIPTOR,google_dot_protobuf_dot_struct__pb2.DESCRIPTOR,google_dot_protobuf_dot_timestamp__pb2.DESCRIPTOR,]) @@ -4604,6 +4604,206 @@ serialized_end=15696, ) + +_GETPATHELEMENTSREQUEST_GETPATHELEMENTSREQUESTV0 = _descriptor.Descriptor( + name='GetPathElementsRequestV0', + full_name='org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='path', full_name='org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.path', index=0, + number=1, type=12, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='keys', full_name='org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.keys', index=1, + number=2, type=12, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='prove', full_name='org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prove', index=2, + number=3, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=15815, + serialized_end=15884, +) + +_GETPATHELEMENTSREQUEST = _descriptor.Descriptor( + name='GetPathElementsRequest', + full_name='org.dash.platform.dapi.v0.GetPathElementsRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='v0', full_name='org.dash.platform.dapi.v0.GetPathElementsRequest.v0', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_GETPATHELEMENTSREQUEST_GETPATHELEMENTSREQUESTV0, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='version', full_name='org.dash.platform.dapi.v0.GetPathElementsRequest.version', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=15699, + serialized_end=15895, +) + + +_GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0_ELEMENTS = _descriptor.Descriptor( + name='Elements', + full_name='org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='elements', full_name='org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.elements', index=0, + number=1, type=12, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=16268, + serialized_end=16296, +) + +_GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0 = _descriptor.Descriptor( + name='GetPathElementsResponseV0', + full_name='org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='elements', full_name='org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.elements', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='proof', full_name='org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.proof', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='metadata', full_name='org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.metadata', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0_ELEMENTS, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='result', full_name='org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.result', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=16018, + serialized_end=16306, +) + +_GETPATHELEMENTSRESPONSE = _descriptor.Descriptor( + name='GetPathElementsResponse', + full_name='org.dash.platform.dapi.v0.GetPathElementsResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='v0', full_name='org.dash.platform.dapi.v0.GetPathElementsResponse.v0', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='version', full_name='org.dash.platform.dapi.v0.GetPathElementsResponse.version', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=15898, + serialized_end=16317, +) + _GETIDENTITYREQUEST_GETIDENTITYREQUESTV0.containing_type = _GETIDENTITYREQUEST _GETIDENTITYREQUEST.fields_by_name['v0'].message_type = _GETIDENTITYREQUEST_GETIDENTITYREQUESTV0 _GETIDENTITYREQUEST.oneofs_by_name['version'].fields.append( @@ -5017,6 +5217,26 @@ _GETEPOCHSINFORESPONSE.oneofs_by_name['version'].fields.append( _GETEPOCHSINFORESPONSE.fields_by_name['v0']) _GETEPOCHSINFORESPONSE.fields_by_name['v0'].containing_oneof = _GETEPOCHSINFORESPONSE.oneofs_by_name['version'] +_GETPATHELEMENTSREQUEST_GETPATHELEMENTSREQUESTV0.containing_type = _GETPATHELEMENTSREQUEST +_GETPATHELEMENTSREQUEST.fields_by_name['v0'].message_type = _GETPATHELEMENTSREQUEST_GETPATHELEMENTSREQUESTV0 +_GETPATHELEMENTSREQUEST.oneofs_by_name['version'].fields.append( + _GETPATHELEMENTSREQUEST.fields_by_name['v0']) +_GETPATHELEMENTSREQUEST.fields_by_name['v0'].containing_oneof = _GETPATHELEMENTSREQUEST.oneofs_by_name['version'] +_GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0_ELEMENTS.containing_type = _GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0 +_GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0.fields_by_name['elements'].message_type = _GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0_ELEMENTS +_GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0.fields_by_name['proof'].message_type = _PROOF +_GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0.fields_by_name['metadata'].message_type = _RESPONSEMETADATA +_GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0.containing_type = _GETPATHELEMENTSRESPONSE +_GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0.oneofs_by_name['result'].fields.append( + _GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0.fields_by_name['elements']) +_GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0.fields_by_name['elements'].containing_oneof = _GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0.oneofs_by_name['result'] +_GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0.oneofs_by_name['result'].fields.append( + _GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0.fields_by_name['proof']) +_GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0.fields_by_name['proof'].containing_oneof = _GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0.oneofs_by_name['result'] +_GETPATHELEMENTSRESPONSE.fields_by_name['v0'].message_type = _GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0 +_GETPATHELEMENTSRESPONSE.oneofs_by_name['version'].fields.append( + _GETPATHELEMENTSRESPONSE.fields_by_name['v0']) +_GETPATHELEMENTSRESPONSE.fields_by_name['v0'].containing_oneof = _GETPATHELEMENTSRESPONSE.oneofs_by_name['version'] DESCRIPTOR.message_types_by_name['Proof'] = _PROOF DESCRIPTOR.message_types_by_name['ResponseMetadata'] = _RESPONSEMETADATA DESCRIPTOR.message_types_by_name['StateTransitionBroadcastError'] = _STATETRANSITIONBROADCASTERROR @@ -5065,6 +5285,8 @@ DESCRIPTOR.message_types_by_name['GetProtocolVersionUpgradeVoteStatusResponse'] = _GETPROTOCOLVERSIONUPGRADEVOTESTATUSRESPONSE DESCRIPTOR.message_types_by_name['GetEpochsInfoRequest'] = _GETEPOCHSINFOREQUEST DESCRIPTOR.message_types_by_name['GetEpochsInfoResponse'] = _GETEPOCHSINFORESPONSE +DESCRIPTOR.message_types_by_name['GetPathElementsRequest'] = _GETPATHELEMENTSREQUEST +DESCRIPTOR.message_types_by_name['GetPathElementsResponse'] = _GETPATHELEMENTSRESPONSE _sym_db.RegisterFileDescriptor(DESCRIPTOR) Proof = _reflection.GeneratedProtocolMessageType('Proof', (_message.Message,), { @@ -5907,6 +6129,44 @@ _sym_db.RegisterMessage(GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos) _sym_db.RegisterMessage(GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo) +GetPathElementsRequest = _reflection.GeneratedProtocolMessageType('GetPathElementsRequest', (_message.Message,), { + + 'GetPathElementsRequestV0' : _reflection.GeneratedProtocolMessageType('GetPathElementsRequestV0', (_message.Message,), { + 'DESCRIPTOR' : _GETPATHELEMENTSREQUEST_GETPATHELEMENTSREQUESTV0, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0) + }) + , + 'DESCRIPTOR' : _GETPATHELEMENTSREQUEST, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetPathElementsRequest) + }) +_sym_db.RegisterMessage(GetPathElementsRequest) +_sym_db.RegisterMessage(GetPathElementsRequest.GetPathElementsRequestV0) + +GetPathElementsResponse = _reflection.GeneratedProtocolMessageType('GetPathElementsResponse', (_message.Message,), { + + 'GetPathElementsResponseV0' : _reflection.GeneratedProtocolMessageType('GetPathElementsResponseV0', (_message.Message,), { + + 'Elements' : _reflection.GeneratedProtocolMessageType('Elements', (_message.Message,), { + 'DESCRIPTOR' : _GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0_ELEMENTS, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements) + }) + , + 'DESCRIPTOR' : _GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0) + }) + , + 'DESCRIPTOR' : _GETPATHELEMENTSRESPONSE, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetPathElementsResponse) + }) +_sym_db.RegisterMessage(GetPathElementsResponse) +_sym_db.RegisterMessage(GetPathElementsResponse.GetPathElementsResponseV0) +_sym_db.RegisterMessage(GetPathElementsResponse.GetPathElementsResponseV0.Elements) + _SEARCHKEY_PURPOSEMAPENTRY._options = None _SECURITYLEVELMAP_SECURITYLEVELMAPENTRY._options = None @@ -5918,8 +6178,8 @@ index=0, serialized_options=None, create_key=_descriptor._internal_create_key, - serialized_start=15699, - serialized_end=18472, + serialized_start=16320, + serialized_end=19215, methods=[ _descriptor.MethodDescriptor( name='broadcastStateTransition', @@ -6121,6 +6381,16 @@ serialized_options=None, create_key=_descriptor._internal_create_key, ), + _descriptor.MethodDescriptor( + name='getPathElements', + full_name='org.dash.platform.dapi.v0.Platform.getPathElements', + index=20, + containing_service=None, + input_type=_GETPATHELEMENTSREQUEST, + output_type=_GETPATHELEMENTSRESPONSE, + serialized_options=None, + create_key=_descriptor._internal_create_key, + ), ]) _sym_db.RegisterServiceDescriptor(_PLATFORM) diff --git a/packages/dapi-grpc/clients/platform/v0/python/platform_pb2_grpc.py b/packages/dapi-grpc/clients/platform/v0/python/platform_pb2_grpc.py index 987135cb67..e164f15e68 100644 --- a/packages/dapi-grpc/clients/platform/v0/python/platform_pb2_grpc.py +++ b/packages/dapi-grpc/clients/platform/v0/python/platform_pb2_grpc.py @@ -114,6 +114,11 @@ def __init__(self, channel): request_serializer=platform__pb2.GetEpochsInfoRequest.SerializeToString, response_deserializer=platform__pb2.GetEpochsInfoResponse.FromString, ) + self.getPathElements = channel.unary_unary( + '/org.dash.platform.dapi.v0.Platform/getPathElements', + request_serializer=platform__pb2.GetPathElementsRequest.SerializeToString, + response_deserializer=platform__pb2.GetPathElementsResponse.FromString, + ) class PlatformServicer(object): @@ -239,6 +244,12 @@ def getEpochsInfo(self, request, context): context.set_details('Method not implemented!') raise NotImplementedError('Method not implemented!') + def getPathElements(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + def add_PlatformServicer_to_server(servicer, server): rpc_method_handlers = { @@ -342,6 +353,11 @@ def add_PlatformServicer_to_server(servicer, server): request_deserializer=platform__pb2.GetEpochsInfoRequest.FromString, response_serializer=platform__pb2.GetEpochsInfoResponse.SerializeToString, ), + 'getPathElements': grpc.unary_unary_rpc_method_handler( + servicer.getPathElements, + request_deserializer=platform__pb2.GetPathElementsRequest.FromString, + response_serializer=platform__pb2.GetPathElementsResponse.SerializeToString, + ), } generic_handler = grpc.method_handlers_generic_handler( 'org.dash.platform.dapi.v0.Platform', rpc_method_handlers) @@ -691,3 +707,20 @@ def getEpochsInfo(request, platform__pb2.GetEpochsInfoResponse.FromString, options, channel_credentials, insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def getPathElements(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/org.dash.platform.dapi.v0.Platform/getPathElements', + platform__pb2.GetPathElementsRequest.SerializeToString, + platform__pb2.GetPathElementsResponse.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) diff --git a/packages/dapi-grpc/clients/platform/v0/web/platform_pb.d.ts b/packages/dapi-grpc/clients/platform/v0/web/platform_pb.d.ts index 199db1f45e..131564125b 100644 --- a/packages/dapi-grpc/clients/platform/v0/web/platform_pb.d.ts +++ b/packages/dapi-grpc/clients/platform/v0/web/platform_pb.d.ts @@ -3308,3 +3308,317 @@ export namespace GetEpochsInfoResponse { } } +export class GetPathElementsRequest extends jspb.Message { + hasV0(): boolean; + clearV0(): void; + getV0(): GetPathElementsRequest.GetPathElementsRequestV0 | undefined; + setV0(value?: GetPathElementsRequest.GetPathElementsRequestV0): void; + + getVersionCase(): GetPathElementsRequest.VersionCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetPathElementsRequest.AsObject; + static toObject(includeInstance: boolean, msg: GetPathElementsRequest): GetPathElementsRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: GetPathElementsRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetPathElementsRequest; + static deserializeBinaryFromReader(message: GetPathElementsRequest, reader: jspb.BinaryReader): GetPathElementsRequest; +} + +export namespace GetPathElementsRequest { + export type AsObject = { + v0?: GetPathElementsRequest.GetPathElementsRequestV0.AsObject, + } + + export class GetPathElementsRequestV0 extends jspb.Message { + clearPathList(): void; + getPathList(): Array; + getPathList_asU8(): Array; + getPathList_asB64(): Array; + setPathList(value: Array): void; + addPath(value: Uint8Array | string, index?: number): Uint8Array | string; + + clearKeysList(): void; + getKeysList(): Array; + getKeysList_asU8(): Array; + getKeysList_asB64(): Array; + setKeysList(value: Array): void; + addKeys(value: Uint8Array | string, index?: number): Uint8Array | string; + + getProve(): boolean; + setProve(value: boolean): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetPathElementsRequestV0.AsObject; + static toObject(includeInstance: boolean, msg: GetPathElementsRequestV0): GetPathElementsRequestV0.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: GetPathElementsRequestV0, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetPathElementsRequestV0; + static deserializeBinaryFromReader(message: GetPathElementsRequestV0, reader: jspb.BinaryReader): GetPathElementsRequestV0; + } + + export namespace GetPathElementsRequestV0 { + export type AsObject = { + pathList: Array, + keysList: Array, + prove: boolean, + } + } + + export enum VersionCase { + VERSION_NOT_SET = 0, + V0 = 1, + } +} + +export class GetPathElementsResponse extends jspb.Message { + hasV0(): boolean; + clearV0(): void; + getV0(): GetPathElementsResponse.GetPathElementsResponseV0 | undefined; + setV0(value?: GetPathElementsResponse.GetPathElementsResponseV0): void; + + getVersionCase(): GetPathElementsResponse.VersionCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetPathElementsResponse.AsObject; + static toObject(includeInstance: boolean, msg: GetPathElementsResponse): GetPathElementsResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: GetPathElementsResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetPathElementsResponse; + static deserializeBinaryFromReader(message: GetPathElementsResponse, reader: jspb.BinaryReader): GetPathElementsResponse; +} + +export namespace GetPathElementsResponse { + export type AsObject = { + v0?: GetPathElementsResponse.GetPathElementsResponseV0.AsObject, + } + + export class GetPathElementsResponseV0 extends jspb.Message { + hasElements(): boolean; + clearElements(): void; + getElements(): GetPathElementsResponse.GetPathElementsResponseV0.Elements | undefined; + setElements(value?: GetPathElementsResponse.GetPathElementsResponseV0.Elements): void; + + hasProof(): boolean; + clearProof(): void; + getProof(): Proof | undefined; + setProof(value?: Proof): void; + + hasMetadata(): boolean; + clearMetadata(): void; + getMetadata(): ResponseMetadata | undefined; + setMetadata(value?: ResponseMetadata): void; + + getResultCase(): GetPathElementsResponseV0.ResultCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetPathElementsResponseV0.AsObject; + static toObject(includeInstance: boolean, msg: GetPathElementsResponseV0): GetPathElementsResponseV0.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: GetPathElementsResponseV0, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetPathElementsResponseV0; + static deserializeBinaryFromReader(message: GetPathElementsResponseV0, reader: jspb.BinaryReader): GetPathElementsResponseV0; + } + + export namespace GetPathElementsResponseV0 { + export type AsObject = { + elements?: GetPathElementsResponse.GetPathElementsResponseV0.Elements.AsObject, + proof?: Proof.AsObject, + metadata?: ResponseMetadata.AsObject, + } + + export class Elements extends jspb.Message { + clearElementsList(): void; + getElementsList(): Array; + getElementsList_asU8(): Array; + getElementsList_asB64(): Array; + setElementsList(value: Array): void; + addElements(value: Uint8Array | string, index?: number): Uint8Array | string; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Elements.AsObject; + static toObject(includeInstance: boolean, msg: Elements): Elements.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: Elements, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Elements; + static deserializeBinaryFromReader(message: Elements, reader: jspb.BinaryReader): Elements; + } + + export namespace Elements { + export type AsObject = { + elementsList: Array, + } + } + + export enum ResultCase { + RESULT_NOT_SET = 0, + ELEMENTS = 1, + PROOF = 2, + } + } + + export enum VersionCase { + VERSION_NOT_SET = 0, + V0 = 1, + } +} + +export class GetPathElementsRequest extends jspb.Message { + hasV0(): boolean; + clearV0(): void; + getV0(): GetPathElementsRequest.GetPathElementsRequestV0 | undefined; + setV0(value?: GetPathElementsRequest.GetPathElementsRequestV0): void; + + getVersionCase(): GetPathElementsRequest.VersionCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetPathElementsRequest.AsObject; + static toObject(includeInstance: boolean, msg: GetPathElementsRequest): GetPathElementsRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: GetPathElementsRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetPathElementsRequest; + static deserializeBinaryFromReader(message: GetPathElementsRequest, reader: jspb.BinaryReader): GetPathElementsRequest; +} + +export namespace GetPathElementsRequest { + export type AsObject = { + v0?: GetPathElementsRequest.GetPathElementsRequestV0.AsObject, + } + + export class GetPathElementsRequestV0 extends jspb.Message { + clearPathList(): void; + getPathList(): Array; + getPathList_asU8(): Array; + getPathList_asB64(): Array; + setPathList(value: Array): void; + addPath(value: Uint8Array | string, index?: number): Uint8Array | string; + + clearKeysList(): void; + getKeysList(): Array; + getKeysList_asU8(): Array; + getKeysList_asB64(): Array; + setKeysList(value: Array): void; + addKeys(value: Uint8Array | string, index?: number): Uint8Array | string; + + getProve(): boolean; + setProve(value: boolean): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetPathElementsRequestV0.AsObject; + static toObject(includeInstance: boolean, msg: GetPathElementsRequestV0): GetPathElementsRequestV0.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: GetPathElementsRequestV0, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetPathElementsRequestV0; + static deserializeBinaryFromReader(message: GetPathElementsRequestV0, reader: jspb.BinaryReader): GetPathElementsRequestV0; + } + + export namespace GetPathElementsRequestV0 { + export type AsObject = { + pathList: Array, + keysList: Array, + prove: boolean, + } + } + + export enum VersionCase { + VERSION_NOT_SET = 0, + V0 = 1, + } +} + +export class GetPathElementsResponse extends jspb.Message { + hasV0(): boolean; + clearV0(): void; + getV0(): GetPathElementsResponse.GetPathElementsResponseV0 | undefined; + setV0(value?: GetPathElementsResponse.GetPathElementsResponseV0): void; + + getVersionCase(): GetPathElementsResponse.VersionCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetPathElementsResponse.AsObject; + static toObject(includeInstance: boolean, msg: GetPathElementsResponse): GetPathElementsResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: GetPathElementsResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetPathElementsResponse; + static deserializeBinaryFromReader(message: GetPathElementsResponse, reader: jspb.BinaryReader): GetPathElementsResponse; +} + +export namespace GetPathElementsResponse { + export type AsObject = { + v0?: GetPathElementsResponse.GetPathElementsResponseV0.AsObject, + } + + export class GetPathElementsResponseV0 extends jspb.Message { + hasElements(): boolean; + clearElements(): void; + getElements(): GetPathElementsResponse.GetPathElementsResponseV0.Elements | undefined; + setElements(value?: GetPathElementsResponse.GetPathElementsResponseV0.Elements): void; + + hasProof(): boolean; + clearProof(): void; + getProof(): Proof | undefined; + setProof(value?: Proof): void; + + hasMetadata(): boolean; + clearMetadata(): void; + getMetadata(): ResponseMetadata | undefined; + setMetadata(value?: ResponseMetadata): void; + + getResultCase(): GetPathElementsResponseV0.ResultCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetPathElementsResponseV0.AsObject; + static toObject(includeInstance: boolean, msg: GetPathElementsResponseV0): GetPathElementsResponseV0.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: GetPathElementsResponseV0, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetPathElementsResponseV0; + static deserializeBinaryFromReader(message: GetPathElementsResponseV0, reader: jspb.BinaryReader): GetPathElementsResponseV0; + } + + export namespace GetPathElementsResponseV0 { + export type AsObject = { + elements?: GetPathElementsResponse.GetPathElementsResponseV0.Elements.AsObject, + proof?: Proof.AsObject, + metadata?: ResponseMetadata.AsObject, + } + + export class Elements extends jspb.Message { + clearElementsList(): void; + getElementsList(): Array; + getElementsList_asU8(): Array; + getElementsList_asB64(): Array; + setElementsList(value: Array): void; + addElements(value: Uint8Array | string, index?: number): Uint8Array | string; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Elements.AsObject; + static toObject(includeInstance: boolean, msg: Elements): Elements.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: Elements, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Elements; + static deserializeBinaryFromReader(message: Elements, reader: jspb.BinaryReader): Elements; + } + + export namespace Elements { + export type AsObject = { + elementsList: Array, + } + } + + export enum ResultCase { + RESULT_NOT_SET = 0, + ELEMENTS = 1, + PROOF = 2, + } + } + + export enum VersionCase { + VERSION_NOT_SET = 0, + V0 = 1, + } +} + diff --git a/packages/dapi-grpc/clients/platform/v0/web/platform_pb.js b/packages/dapi-grpc/clients/platform/v0/web/platform_pb.js index e7495b46c1..b30f67af84 100644 --- a/packages/dapi-grpc/clients/platform/v0/web/platform_pb.js +++ b/packages/dapi-grpc/clients/platform/v0/web/platform_pb.js @@ -145,6 +145,14 @@ goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityResponse', null, { goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.ResultCase', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityResponse.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetPathElementsRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetPathElementsRequest.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetPathElementsResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.ResultCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetPathElementsResponse.VersionCase', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetProofsRequest', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest', null, { proto }); @@ -2479,6 +2487,111 @@ if (goog.DEBUG && !COMPILED) { */ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.displayName = 'proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo'; } +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetPathElementsRequest.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetPathElementsRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetPathElementsRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetPathElementsRequest'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.repeatedFields_, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.displayName = 'proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetPathElementsResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetPathElementsResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetPathElementsResponse'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.repeatedFields_, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.displayName = 'proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements'; +} @@ -24886,4 +24999,1098 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.prototype.hasV0 = function }; + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetPathElementsRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetPathElementsRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetPathElementsRequest.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetPathElementsRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetPathElementsRequest; + return proto.org.dash.platform.dapi.v0.GetPathElementsRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetPathElementsRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.serializeBinaryToWriter + ); + } +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array} + * @const + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.repeatedFields_ = [1,2]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.toObject = function(includeInstance, msg) { + var f, obj = { + pathList: msg.getPathList_asB64(), + keysList: msg.getKeysList_asB64(), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0; + return proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addPath(value); + break; + case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addKeys(value); + break; + case 3: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getPathList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 1, + f + ); + } + f = message.getKeysList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 2, + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 3, + f + ); + } +}; + + +/** + * repeated bytes path = 1; + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getPathList = function() { + return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 1)); +}; + + +/** + * repeated bytes path = 1; + * This is a type-conversion wrapper around `getPathList()` + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getPathList_asB64 = function() { + return /** @type {!Array} */ (jspb.Message.bytesListAsB64( + this.getPathList())); +}; + + +/** + * repeated bytes path = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getPathList()` + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getPathList_asU8 = function() { + return /** @type {!Array} */ (jspb.Message.bytesListAsU8( + this.getPathList())); +}; + + +/** + * @param {!(Array|Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.setPathList = function(value) { + return jspb.Message.setField(this, 1, value || []); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.addPath = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.clearPathList = function() { + return this.setPathList([]); +}; + + +/** + * repeated bytes keys = 2; + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getKeysList = function() { + return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 2)); +}; + + +/** + * repeated bytes keys = 2; + * This is a type-conversion wrapper around `getKeysList()` + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getKeysList_asB64 = function() { + return /** @type {!Array} */ (jspb.Message.bytesListAsB64( + this.getKeysList())); +}; + + +/** + * repeated bytes keys = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getKeysList()` + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getKeysList_asU8 = function() { + return /** @type {!Array} */ (jspb.Message.bytesListAsU8( + this.getKeysList())); +}; + + +/** + * @param {!(Array|Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.setKeysList = function(value) { + return jspb.Message.setField(this, 2, value || []); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.addKeys = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 2, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.clearKeysList = function() { + return this.setKeysList([]); +}; + + +/** + * optional bool prove = 3; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 3, value); +}; + + +/** + * optional GetPathElementsRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetPathElementsRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetPathElementsResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetPathElementsResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetPathElementsResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetPathElementsResponse; + return proto.org.dash.platform.dapi.v0.GetPathElementsResponse.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetPathElementsResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.serializeBinaryToWriter + ); + } +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + ELEMENTS: 1, + PROOF: 2 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.toObject = function(includeInstance, msg) { + var f, obj = { + elements: (f = msg.getElements()) && proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.toObject(includeInstance, f), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0; + return proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.deserializeBinaryFromReader); + msg.setElements(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getElements(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.serializeBinaryToWriter + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); + } +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array} + * @const + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.repeatedFields_ = [1]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.toObject = function(includeInstance, msg) { + var f, obj = { + elementsList: msg.getElementsList_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements; + return proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addElements(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getElementsList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 1, + f + ); + } +}; + + +/** + * repeated bytes elements = 1; + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.getElementsList = function() { + return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 1)); +}; + + +/** + * repeated bytes elements = 1; + * This is a type-conversion wrapper around `getElementsList()` + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.getElementsList_asB64 = function() { + return /** @type {!Array} */ (jspb.Message.bytesListAsB64( + this.getElementsList())); +}; + + +/** + * repeated bytes elements = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getElementsList()` + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.getElementsList_asU8 = function() { + return /** @type {!Array} */ (jspb.Message.bytesListAsU8( + this.getElementsList())); +}; + + +/** + * @param {!(Array|Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.setElementsList = function(value) { + return jspb.Message.setField(this, 1, value || []); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.addElements = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.clearElementsList = function() { + return this.setElementsList([]); +}; + + +/** + * optional Elements elements = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.getElements = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.setElements = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.clearElements = function() { + return this.setElements(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.hasElements = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional GetPathElementsResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + goog.object.extend(exports, proto.org.dash.platform.dapi.v0); diff --git a/packages/dapi-grpc/clients/platform/v0/web/platform_pb_service.d.ts b/packages/dapi-grpc/clients/platform/v0/web/platform_pb_service.d.ts index 5af3ea8e8f..798657ea3e 100644 --- a/packages/dapi-grpc/clients/platform/v0/web/platform_pb_service.d.ts +++ b/packages/dapi-grpc/clients/platform/v0/web/platform_pb_service.d.ts @@ -184,6 +184,15 @@ type PlatformgetEpochsInfo = { readonly responseType: typeof platform_pb.GetEpochsInfoResponse; }; +type PlatformgetPathElements = { + readonly methodName: string; + readonly service: typeof Platform; + readonly requestStream: false; + readonly responseStream: false; + readonly requestType: typeof platform_pb.GetPathElementsRequest; + readonly responseType: typeof platform_pb.GetPathElementsResponse; +}; + export class Platform { static readonly serviceName: string; static readonly broadcastStateTransition: PlatformbroadcastStateTransition; @@ -206,6 +215,7 @@ export class Platform { static readonly getProtocolVersionUpgradeState: PlatformgetProtocolVersionUpgradeState; static readonly getProtocolVersionUpgradeVoteStatus: PlatformgetProtocolVersionUpgradeVoteStatus; static readonly getEpochsInfo: PlatformgetEpochsInfo; + static readonly getPathElements: PlatformgetPathElements; } export type ServiceError = { message: string, code: number; metadata: grpc.Metadata } @@ -420,5 +430,14 @@ export class PlatformClient { requestMessage: platform_pb.GetEpochsInfoRequest, callback: (error: ServiceError|null, responseMessage: platform_pb.GetEpochsInfoResponse|null) => void ): UnaryResponse; + getPathElements( + requestMessage: platform_pb.GetPathElementsRequest, + metadata: grpc.Metadata, + callback: (error: ServiceError|null, responseMessage: platform_pb.GetPathElementsResponse|null) => void + ): UnaryResponse; + getPathElements( + requestMessage: platform_pb.GetPathElementsRequest, + callback: (error: ServiceError|null, responseMessage: platform_pb.GetPathElementsResponse|null) => void + ): UnaryResponse; } diff --git a/packages/dapi-grpc/clients/platform/v0/web/platform_pb_service.js b/packages/dapi-grpc/clients/platform/v0/web/platform_pb_service.js index 1d5d8278dc..f6dc929969 100644 --- a/packages/dapi-grpc/clients/platform/v0/web/platform_pb_service.js +++ b/packages/dapi-grpc/clients/platform/v0/web/platform_pb_service.js @@ -190,6 +190,15 @@ Platform.getEpochsInfo = { responseType: platform_pb.GetEpochsInfoResponse }; +Platform.getPathElements = { + methodName: "getPathElements", + service: Platform, + requestStream: false, + responseStream: false, + requestType: platform_pb.GetPathElementsRequest, + responseType: platform_pb.GetPathElementsResponse +}; + exports.Platform = Platform; function PlatformClient(serviceHost, options) { @@ -817,5 +826,36 @@ PlatformClient.prototype.getEpochsInfo = function getEpochsInfo(requestMessage, }; }; +PlatformClient.prototype.getPathElements = function getPathElements(requestMessage, metadata, callback) { + if (arguments.length === 2) { + callback = arguments[1]; + } + var client = grpc.unary(Platform.getPathElements, { + request: requestMessage, + host: this.serviceHost, + metadata: metadata, + transport: this.options.transport, + debug: this.options.debug, + onEnd: function (response) { + if (callback) { + if (response.status !== grpc.Code.OK) { + var err = new Error(response.statusMessage); + err.code = response.status; + err.metadata = response.trailers; + callback(err, null); + } else { + callback(null, response.message); + } + } + } + }); + return { + cancel: function () { + callback = null; + client.close(); + } + }; +}; + exports.PlatformClient = PlatformClient; From e71f92c230024eff5f7b68ecc064b59e5fc9018c Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Mon, 22 Apr 2024 21:25:24 +0700 Subject: [PATCH 141/191] feat(platform)!: ability to transfer documents (#1826) --- .../clients/platform/v0/web/platform_pb.d.ts | 157 -- .../schema/v1/dashpay.schema.json | 1 + .../document/v0/document-meta.json | 26 +- packages/rs-dpp/src/block/block_info/mod.rs | 2 +- .../document_type/accessors/mod.rs | 19 + .../document_type/accessors/v0/mod.rs | 4 + .../class_methods/try_from_schema/v0/mod.rs | 23 +- .../create_document_from_data/v0/mod.rs | 46 +- .../v0/mod.rs | 64 +- .../document_type/methods/mod.rs | 5 +- .../methods/serialize_value_for_key/v0/mod.rs | 16 +- .../src/data_contract/document_type/mod.rs | 1 + .../document_type/property/mod.rs | 43 +- .../schema/enrich_with_base_schema/v0/mod.rs | 17 +- .../document_type/v0/accessors.rs | 5 + .../src/data_contract/document_type/v0/mod.rs | 3 + .../document_type/v0/random_document.rs | 15 +- .../document_type/v0/random_document_type.rs | 3 + packages/rs-dpp/src/document/accessors/mod.rs | 41 + .../rs-dpp/src/document/accessors/v0/mod.rs | 11 + .../get_raw_for_document_type/v0/mod.rs | 39 +- .../src/document/extended_document/fields.rs | 7 + .../src/document/extended_document/mod.rs | 2 +- packages/rs-dpp/src/document/fields.rs | 3 + packages/rs-dpp/src/document/mod.rs | 1 + packages/rs-dpp/src/document/transfer.rs | 41 + packages/rs-dpp/src/document/v0/accessors.rs | 42 + .../rs-dpp/src/document/v0/cbor_conversion.rs | 21 + packages/rs-dpp/src/document/v0/mod.rs | 18 + packages/rs-dpp/src/document/v0/serialize.rs | 158 +- .../src/errors/consensus/basic/basic_error.rs | 5 +- .../consensus/basic/data_contract/mod.rs | 2 + .../unknown_transferable_type_error.rs | 47 + packages/rs-dpp/src/errors/consensus/codes.rs | 1 + .../src/schema/document/v0/documentBase.json | 28 + .../document_transition/action_type.rs | 3 + .../document_create_transition/v0/mod.rs | 6 + .../document_delete_transition/v0/mod.rs | 89 - .../document_replace_transition/mod.rs | 18 + .../document_replace_transition/v0/mod.rs | 222 +- .../from_document.rs | 43 + .../document_transfer_transition/mod.rs | 19 + .../v0/from_document.rs | 36 + .../document_transfer_transition/v0/mod.rs | 46 + .../v0/v0_methods.rs | 66 + .../v0_methods.rs | 55 + .../document_transition/mod.rs | 124 +- .../documents_batch_transition/methods/mod.rs | 91 + .../methods/v0/mod.rs | 29 + .../v0/v0_methods.rs | 92 +- packages/rs-dpp/src/tests/json_document.rs | 4 + .../src/execution/check_tx/v0/mod.rs | 14 +- .../create_genesis_state/v0/mod.rs | 7 +- .../structure_v0/mod.rs | 30 +- .../structure_v0/mod.rs | 19 +- .../mod.rs | 87 + .../state_v0/mod.rs | 66 + .../structure_v0/mod.rs | 46 + .../documents_batch/action_validation/mod.rs | 1 + .../advanced_structure/v0/mod.rs | 18 +- .../state_transitions/documents_batch/mod.rs | 1782 +++++++++++++++++ .../documents_batch/state/v0/mod.rs | 10 + .../documents_batch/transformer/v0/mod.rs | 151 +- .../src/query/system/path_elements/v0/mod.rs | 2 - .../src/test/helpers/fee_pools.rs | 3 + .../rs-drive-abci/src/test/helpers/setup.rs | 36 + .../tests/strategy_tests/main.rs | 186 +- .../tests/strategy_tests/strategy.rs | 142 +- .../verify_state_transitions.rs | 23 +- .../crypto-card-game-all-transferable.json | 132 ++ .../crypto-card-game-not-transferable.json | 132 ++ ...tion.rs => document_replace_transition.rs} | 0 .../document/document_transfer_transition.rs | 52 + .../document/document_transition.rs | 7 + .../drive/batch/transitions/document/mod.rs | 3 +- packages/rs-drive/src/drive/defaults.rs | 15 + .../rs-drive/src/drive/document/delete/mod.rs | 10 +- .../validate_uniqueness_of_data/mod.rs | 6 + .../validate_uniqueness_of_data/v0/mod.rs | 29 +- .../drive/document/index_uniqueness/mod.rs | 1 + .../v0/mod.rs | 77 +- .../v0/mod.rs | 4 + .../mod.rs | 70 + .../v0/mod.rs | 64 + .../validate_document_uniqueness/v0/mod.rs | 3 + .../add_document_to_primary_storage/v0/mod.rs | 2 +- .../rs-drive/src/drive/document/insert/mod.rs | 24 +- .../rs-drive/src/drive/document/query/mod.rs | 12 +- .../v0/mod.rs | 11 +- .../rs-drive/src/drive/document/update/mod.rs | 24 +- .../drive/object_size_info/document_info.rs | 33 +- .../v0/mod.rs | 17 + .../document_transition/action_type.rs | 1 + .../document_create_transition_action/mod.rs | 19 +- .../v0/mod.rs | 177 +- .../v0/transformer.rs | 51 +- .../document_replace_transition_action/mod.rs | 20 +- .../transformer.rs | 6 + .../v0/mod.rs | 28 + .../v0/transformer.rs | 6 + .../mod.rs | 85 + .../transformer.rs | 31 + .../v0/mod.rs | 26 + .../v0/transformer.rs | 52 + .../document_transition/mod.rs | 7 + .../v0/transformer.rs | 3 + packages/rs-drive/tests/query_tests.rs | 52 +- .../rs-drive/tests/query_tests_history.rs | 8 +- .../src/version/dpp_versions.rs | 1 + .../src/version/drive_abci_versions.rs | 2 + .../src/version/drive_versions.rs | 1 + .../src/version/mocks/v2_test.rs | 10 + .../src/version/mocks/v3_test.rs | 10 + .../rs-platform-version/src/version/v1.rs | 10 + packages/rs-sdk/src/platform/transition.rs | 1 + .../platform/transition/transfer_document.rs | 174 ++ ...1733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json} | Bin 74127 -> 74128 bytes ...93d92d2c84b425f8393ffa9599b06a3a77be.json} | Bin 24208 -> 24209 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 - ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 + ...1733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json} | Bin 74127 -> 74128 bytes ...25892e0011f1264c65e1474532f59456ff51.json} | Bin 24208 -> 24209 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 - ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 + ...1733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json} | Bin 74127 -> 74128 bytes ...93d92d2c84b425f8393ffa9599b06a3a77be.json} | Bin 24208 -> 24209 bytes ...f38ff6415d9cabab87315b9d9d736194597f.json} | Bin 24334 -> 24335 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 - ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 + ...01c1ba166a2dd8f6efb31b0289dc011da983.json} | Bin 8822 -> 8837 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 - ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 + ...1733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json} | Bin 74127 -> 74128 bytes ...cf0df7bf150009b1ced887a6f051ab86085b.json} | Bin 22308 -> 22299 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 - ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 + ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 74127 -> 0 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 0 -> 74128 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 - ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 + ...8c03122daf7ab2e77108f4bf44af1ad15eae.json} | Bin 8822 -> 8837 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 - ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 + ...67bd9ccc29eca3092a5664a5a9ba3bb7e967.json} | Bin 75593 -> 75594 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 - ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 + ...bbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json} | Bin 8675 -> 8690 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 - ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 + ...776113debe4287515ae60d0645da450a80a1.json} | Bin 19680 -> 19700 bytes ...caf3663c40a12d3b03827006d66058e439ac.json} | Bin 1466578 -> 1466620 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 - ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 + ...776113debe4287515ae60d0645da450a80a1.json} | Bin 19680 -> 19700 bytes ...7089535588985622579e77969e0ffd68afc7.json} | Bin 21163 -> 21205 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 - ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 + ...776113debe4287515ae60d0645da450a80a1.json} | Bin 19680 -> 19700 bytes ...dd01a7428085ffdcf1e11cccf19c48c5f7a1.json} | Bin 2668591 -> 2668626 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 - ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 + ...776113debe4287515ae60d0645da450a80a1.json} | Bin 19680 -> 19700 bytes ...592c8fe7361bed628d9a36747664c9789bf1.json} | Bin 2437697 -> 2437729 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 - ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 + ...7776113debe4287515ae60d0645da450a80a1.json | Bin 19680 -> 0 bytes ...7776113debe4287515ae60d0645da450a80a1.json | Bin 0 -> 19700 bytes ...0b93d9d2e841a5e3d60755f8e7be3b93315b.json} | Bin 2425323 -> 2425355 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 - ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 + ...776113debe4287515ae60d0645da450a80a1.json} | Bin 10626 -> 10644 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 - ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 + ...776113debe4287515ae60d0645da450a80a1.json} | Bin 18538 -> 18554 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 - ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 + ...fa69b4749b19cc1f5ef0abf37fa0c04ab2ef.json} | Bin 13401 -> 13407 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 - ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 + ...a459dc7a67570ea6df3f8858d3fae7820ffe.json} | Bin 14324 -> 14334 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 - ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 + ...53464633a072722c5a04b15ee01f3a45de99.json} | Bin 22136 -> 22156 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 - ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 + ...53464633a072722c5a04b15ee01f3a45de99.json} | Bin 22136 -> 22156 bytes ...dc46e3cf0d7d4ce093bba24086e17410ed7d.json} | Bin 28239 -> 28889 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 - ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 + ...550f0ea4a6af6f68037e7d50ff4e4de74509.json} | Bin 8203 -> 8229 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 - ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 + ...06e5eda740be44679cc960ea35f2134af628.json} | Bin 10871 -> 10897 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 - ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 + ...f1acc3394d29ac72f662d38e81344496631e.json} | Bin 10621 -> 10645 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 - ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 + ...b1a05862cb8d40c088b193b59ca3564210bc.json} | Bin 11302 -> 11313 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 - ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 + ...2dfc69cc7b123be24b7ad993281979b2a3a2.json} | Bin 10979 -> 11003 bytes ...d720a18b34b93734a546507e093924c6340a5.json | 1 - ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 + packages/strategy-tests/src/lib.rs | 137 +- packages/strategy-tests/src/operations.rs | 3 +- .../src/errors/consensus/consensus_error.rs | 5 +- .../integration/document/Document.spec.js | 3 + .../test/unit/document/Document.spec.js | 11 +- 209 files changed, 5242 insertions(+), 959 deletions(-) create mode 100644 packages/rs-dpp/src/document/transfer.rs create mode 100644 packages/rs-dpp/src/errors/consensus/basic/data_contract/unknown_transferable_type_error.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/from_document.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/mod.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0/from_document.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0/mod.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0/v0_methods.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0_methods.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/state_v0/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/structure_v0/mod.rs create mode 100644 packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-all-transferable.json create mode 100644 packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-not-transferable.json rename packages/rs-drive/src/drive/batch/transitions/document/{document_update_transition.rs => document_replace_transition.rs} (100%) create mode 100644 packages/rs-drive/src/drive/batch/transitions/document/document_transfer_transition.rs create mode 100644 packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/mod.rs create mode 100644 packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/v0/mod.rs create mode 100644 packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/mod.rs create mode 100644 packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/transformer.rs create mode 100644 packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/v0/mod.rs create mode 100644 packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/v0/transformer.rs create mode 100644 packages/rs-sdk/src/platform/transition/transfer_document.rs rename packages/rs-sdk/tests/vectors/document_list_document_query/{msg_2024-04-05T09:03:09.937284721Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json => msg_2024-04-20T17:32:57.729547000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json} (96%) rename packages/rs-sdk/tests/vectors/document_list_document_query/{msg_2024-04-05T09:03:10.038807458Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json => msg_2024-04-20T17:32:57.791831000Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json} (86%) delete mode 100644 packages/rs-sdk/tests/vectors/document_list_document_query/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json create mode 100644 packages/rs-sdk/tests/vectors/document_list_document_query/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json rename packages/rs-sdk/tests/vectors/{document_read/msg_2024-04-05T09:03:09.943356025Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json => document_list_drive_query/msg_2024-04-20T17:32:57.734304000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json} (96%) rename packages/rs-sdk/tests/vectors/document_list_drive_query/{msg_2024-04-05T09:03:10.043689986Z_DocumentQuery_c104c67292061fe0b8e2f959cd2625892e0011f1264c65e1474532f59456ff51.json => msg_2024-04-20T17:32:57.791314000Z_DocumentQuery_c104c67292061fe0b8e2f959cd2625892e0011f1264c65e1474532f59456ff51.json} (86%) delete mode 100644 packages/rs-sdk/tests/vectors/document_list_drive_query/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json create mode 100644 packages/rs-sdk/tests/vectors/document_list_drive_query/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json rename packages/rs-sdk/tests/vectors/{document_read_no_document/msg_2024-04-05T09:03:09.937048727Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json => document_read/msg_2024-04-20T17:32:57.732862000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json} (96%) rename packages/rs-sdk/tests/vectors/document_read/{msg_2024-04-05T09:03:10.044569852Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json => msg_2024-04-20T17:32:57.792844000Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json} (86%) rename packages/rs-sdk/tests/vectors/document_read/{msg_2024-04-05T09:03:10.111047895Z_DocumentQuery_90af5a08200f1b0e42dbd3ad7a6af38ff6415d9cabab87315b9d9d736194597f.json => msg_2024-04-20T17:32:57.805474000Z_DocumentQuery_90af5a08200f1b0e42dbd3ad7a6af38ff6415d9cabab87315b9d9d736194597f.json} (86%) delete mode 100644 packages/rs-sdk/tests/vectors/document_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json create mode 100644 packages/rs-sdk/tests/vectors/document_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json rename packages/rs-sdk/tests/vectors/document_read_no_contract/{msg_2024-04-05T09:03:09.940963863Z_GetDataContractRequest_e4cf74168e03a40bd159451456b501c1ba166a2dd8f6efb31b0289dc011da983.json => msg_2024-04-20T17:32:57.733023000Z_GetDataContractRequest_e4cf74168e03a40bd159451456b501c1ba166a2dd8f6efb31b0289dc011da983.json} (70%) delete mode 100644 packages/rs-sdk/tests/vectors/document_read_no_contract/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json create mode 100644 packages/rs-sdk/tests/vectors/document_read_no_contract/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json rename packages/rs-sdk/tests/vectors/{document_list_drive_query/msg_2024-04-05T09:03:09.939170860Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json => document_read_no_document/msg_2024-04-20T17:32:57.729722000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json} (96%) rename packages/rs-sdk/tests/vectors/document_read_no_document/{msg_2024-04-05T09:03:10.039734793Z_DocumentQuery_fb3b25c8fa37750a6c1b18d9085fcf0df7bf150009b1ced887a6f051ab86085b.json => msg_2024-04-20T17:32:57.792219000Z_DocumentQuery_fb3b25c8fa37750a6c1b18d9085fcf0df7bf150009b1ced887a6f051ab86085b.json} (84%) delete mode 100644 packages/rs-sdk/tests/vectors/document_read_no_document/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json create mode 100644 packages/rs-sdk/tests/vectors/document_read_no_document/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json delete mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_read/msg_2024-04-05T09:03:09.931783018Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json create mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_read/msg_2024-04-20T17:32:57.729789000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json delete mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json create mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json rename packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/{msg_2024-04-05T09:03:09.921319859Z_GetDataContractRequest_1d1e53ab5e04d9ec5dce4ff9ac048c03122daf7ab2e77108f4bf44af1ad15eae.json => msg_2024-04-20T17:32:57.732964000Z_GetDataContractRequest_1d1e53ab5e04d9ec5dce4ff9ac048c03122daf7ab2e77108f4bf44af1ad15eae.json} (70%) delete mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json create mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json rename packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/{msg_2024-04-05T09:03:09.929228702Z_GetDataContractsRequest_f229a0e58a5c4fb050f57c087bf067bd9ccc29eca3092a5664a5a9ba3bb7e967.json => msg_2024-04-20T17:32:57.730152000Z_GetDataContractsRequest_f229a0e58a5c4fb050f57c087bf067bd9ccc29eca3092a5664a5a9ba3bb7e967.json} (96%) delete mode 100644 packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json create mode 100644 packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json rename packages/rs-sdk/tests/vectors/test_data_contracts_2_nx/{msg_2024-04-05T09:03:09.921211735Z_GetDataContractsRequest_93bdf343bce1bafb96fd873236cabbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json => msg_2024-04-20T17:32:57.729112000Z_GetDataContractsRequest_93bdf343bce1bafb96fd873236cabbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json} (69%) delete mode 100644 packages/rs-sdk/tests/vectors/test_data_contracts_2_nx/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json create mode 100644 packages/rs-sdk/tests/vectors/test_data_contracts_2_nx/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json rename packages/rs-sdk/tests/vectors/{test_epoch_fetch_current/msg_2024-04-05T09:03:09.942621472Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json => test_epoch_fetch/msg_2024-04-20T17:32:57.792584000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json} (76%) rename packages/rs-sdk/tests/vectors/test_epoch_fetch/{msg_2024-04-05T09:03:10.028576958Z_GetEpochsInfoRequest_b2b426ac4a52cb4cb08904c63386caf3663c40a12d3b03827006d66058e439ac.json => msg_2024-04-20T17:32:57.933588000Z_GetEpochsInfoRequest_b2b426ac4a52cb4cb08904c63386caf3663c40a12d3b03827006d66058e439ac.json} (99%) delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json rename packages/rs-sdk/tests/vectors/{test_epoch_list/msg_2024-04-05T09:03:09.988799909Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json => test_epoch_fetch_current/msg_2024-04-20T17:32:57.791668000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json} (76%) rename packages/rs-sdk/tests/vectors/test_epoch_fetch_current/{msg_2024-04-05T09:03:09.952452382Z_GetEpochsInfoRequest_1b87e649557ccb609adb9e2904c67089535588985622579e77969e0ffd68afc7.json => msg_2024-04-20T17:32:57.795519000Z_GetEpochsInfoRequest_1b87e649557ccb609adb9e2904c67089535588985622579e77969e0ffd68afc7.json} (85%) delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json rename packages/rs-sdk/tests/vectors/test_epoch_fetch_future/{msg_2024-04-05T09:03:09.987325755Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json => msg_2024-04-20T17:32:57.792846000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json} (76%) rename packages/rs-sdk/tests/vectors/test_epoch_fetch_future/{msg_2024-04-05T09:03:10.414391623Z_GetEpochsInfoRequest_6a828350e795a088dbc835260a1add01a7428085ffdcf1e11cccf19c48c5f7a1.json => msg_2024-04-20T17:32:58.239918000Z_GetEpochsInfoRequest_6a828350e795a088dbc835260a1add01a7428085ffdcf1e11cccf19c48c5f7a1.json} (99%) delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json rename packages/rs-sdk/tests/vectors/{test_epoch_fetch/msg_2024-04-05T09:03:09.939849246Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json => test_epoch_list/msg_2024-04-20T17:32:57.792457000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json} (76%) rename packages/rs-sdk/tests/vectors/test_epoch_list/{msg_2024-04-05T09:03:10.383446704Z_GetEpochsInfoRequest_734f6594c67fe6a9ab170191031d592c8fe7361bed628d9a36747664c9789bf1.json => msg_2024-04-20T17:32:58.219154000Z_GetEpochsInfoRequest_734f6594c67fe6a9ab170191031d592c8fe7361bed628d9a36747664c9789bf1.json} (99%) delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_2024-04-05T09:03:10.026404741Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_2024-04-20T17:32:57.794148000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json rename packages/rs-sdk/tests/vectors/test_epoch_list_limit/{msg_2024-04-05T09:03:10.414834086Z_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json => msg_2024-04-20T17:32:58.215202000Z_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json} (99%) delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list_limit/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list_limit/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json rename packages/rs-sdk/tests/vectors/test_identity_balance_read/{msg_2024-04-05T09:03:10.038335770Z_GetIdentityBalanceRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json => msg_2024-04-20T17:32:57.805378000Z_GetIdentityBalanceRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json} (69%) delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json rename packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/{msg_2024-04-05T09:03:10.102307738Z_GetIdentityBalanceAndRevisionRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json => msg_2024-04-20T17:32:57.807110000Z_GetIdentityBalanceAndRevisionRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json} (76%) delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json rename packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/{msg_2024-04-05T09:03:10.106807957Z_GetIdentityContractNonceRequest_b7c02dae0c3c762ece1f70a36f88fa69b4749b19cc1f5ef0abf37fa0c04ab2ef.json => msg_2024-04-20T17:32:57.825471000Z_GetIdentityContractNonceRequest_b7c02dae0c3c762ece1f70a36f88fa69b4749b19cc1f5ef0abf37fa0c04ab2ef.json} (72%) delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json rename packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/{msg_2024-04-05T09:03:10.110827591Z_GetIdentityKeysRequest_b4ecff7acf52818aef9ed37a98d4a459dc7a67570ea6df3f8858d3fae7820ffe.json => msg_2024-04-20T17:32:57.805215000Z_GetIdentityKeysRequest_b4ecff7acf52818aef9ed37a98d4a459dc7a67570ea6df3f8858d3fae7820ffe.json} (74%) delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json rename packages/rs-sdk/tests/vectors/test_identity_read/{msg_2024-04-05T09:03:10.108039494Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json => msg_2024-04-20T17:32:57.819765000Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json} (77%) delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json rename packages/rs-sdk/tests/vectors/test_identity_read_by_key/{msg_2024-04-05T09:03:10.108285016Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json => msg_2024-04-20T17:32:57.822981000Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json} (77%) rename packages/rs-sdk/tests/vectors/test_identity_read_by_key/{msg_2024-04-05T09:03:10.226228133Z_IdentityRequest_f5a59abf6d775a8b9e8100fa4c3326bac5c6f9a7e376330066e2e0642706877c.json => msg_2024-04-20T17:32:57.846960000Z_IdentityRequest_3107337faa1f180a1071b78a90dcdc46e3cf0d7d4ce093bba24086e17410ed7d.json} (77%) delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_read_by_key/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json create mode 100644 packages/rs-sdk/tests/vectors/test_identity_read_by_key/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json rename packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/{msg_2024-04-05T09:03:10.133854190Z_GetProtocolVersionUpgradeStateRequest_bb149e1933b9dc561bbfacfb6d09550f0ea4a6af6f68037e7d50ff4e4de74509.json => msg_2024-04-20T17:32:57.844598000Z_GetProtocolVersionUpgradeStateRequest_bb149e1933b9dc561bbfacfb6d09550f0ea4a6af6f68037e7d50ff4e4de74509.json} (67%) delete mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json rename packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/{msg_2024-04-05T09:03:10.136835219Z_GetProtocolVersionUpgradeVoteStatusRequest_ec9dca65a964669b3bc8195d5ff106e5eda740be44679cc960ea35f2134af628.json => msg_2024-04-20T17:32:57.847045000Z_GetProtocolVersionUpgradeVoteStatusRequest_ec9dca65a964669b3bc8195d5ff106e5eda740be44679cc960ea35f2134af628.json} (68%) delete mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json rename packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/{msg_2024-04-05T09:03:10.142375013Z_GetProtocolVersionUpgradeVoteStatusRequest_983670ac95678b1166deab32209bf1acc3394d29ac72f662d38e81344496631e.json => msg_2024-04-20T17:32:57.846269000Z_GetProtocolVersionUpgradeVoteStatusRequest_983670ac95678b1166deab32209bf1acc3394d29ac72f662d38e81344496631e.json} (68%) delete mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json rename packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/{msg_2024-04-05T09:03:10.207288934Z_GetProtocolVersionUpgradeVoteStatusRequest_8534be7e0b4dd648520dc3a67209b1a05862cb8d40c088b193b59ca3564210bc.json => msg_2024-04-20T17:32:57.853232000Z_GetProtocolVersionUpgradeVoteStatusRequest_8534be7e0b4dd648520dc3a67209b1a05862cb8d40c088b193b59ca3564210bc.json} (70%) delete mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json rename packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/{msg_2024-04-05T09:03:10.218889202Z_GetProtocolVersionUpgradeVoteStatusRequest_92a45a0fe4f69d355022d2f2f7622dfc69cc7b123be24b7ad993281979b2a3a2.json => msg_2024-04-20T17:32:57.858773000Z_GetProtocolVersionUpgradeVoteStatusRequest_92a45a0fe4f69d355022d2f2f7622dfc69cc7b123be24b7ad993281979b2a3a2.json} (69%) delete mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json diff --git a/packages/dapi-grpc/clients/platform/v0/web/platform_pb.d.ts b/packages/dapi-grpc/clients/platform/v0/web/platform_pb.d.ts index 131564125b..8e30e8127a 100644 --- a/packages/dapi-grpc/clients/platform/v0/web/platform_pb.d.ts +++ b/packages/dapi-grpc/clients/platform/v0/web/platform_pb.d.ts @@ -3465,160 +3465,3 @@ export namespace GetPathElementsResponse { } } -export class GetPathElementsRequest extends jspb.Message { - hasV0(): boolean; - clearV0(): void; - getV0(): GetPathElementsRequest.GetPathElementsRequestV0 | undefined; - setV0(value?: GetPathElementsRequest.GetPathElementsRequestV0): void; - - getVersionCase(): GetPathElementsRequest.VersionCase; - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): GetPathElementsRequest.AsObject; - static toObject(includeInstance: boolean, msg: GetPathElementsRequest): GetPathElementsRequest.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; - static serializeBinaryToWriter(message: GetPathElementsRequest, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): GetPathElementsRequest; - static deserializeBinaryFromReader(message: GetPathElementsRequest, reader: jspb.BinaryReader): GetPathElementsRequest; -} - -export namespace GetPathElementsRequest { - export type AsObject = { - v0?: GetPathElementsRequest.GetPathElementsRequestV0.AsObject, - } - - export class GetPathElementsRequestV0 extends jspb.Message { - clearPathList(): void; - getPathList(): Array; - getPathList_asU8(): Array; - getPathList_asB64(): Array; - setPathList(value: Array): void; - addPath(value: Uint8Array | string, index?: number): Uint8Array | string; - - clearKeysList(): void; - getKeysList(): Array; - getKeysList_asU8(): Array; - getKeysList_asB64(): Array; - setKeysList(value: Array): void; - addKeys(value: Uint8Array | string, index?: number): Uint8Array | string; - - getProve(): boolean; - setProve(value: boolean): void; - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): GetPathElementsRequestV0.AsObject; - static toObject(includeInstance: boolean, msg: GetPathElementsRequestV0): GetPathElementsRequestV0.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; - static serializeBinaryToWriter(message: GetPathElementsRequestV0, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): GetPathElementsRequestV0; - static deserializeBinaryFromReader(message: GetPathElementsRequestV0, reader: jspb.BinaryReader): GetPathElementsRequestV0; - } - - export namespace GetPathElementsRequestV0 { - export type AsObject = { - pathList: Array, - keysList: Array, - prove: boolean, - } - } - - export enum VersionCase { - VERSION_NOT_SET = 0, - V0 = 1, - } -} - -export class GetPathElementsResponse extends jspb.Message { - hasV0(): boolean; - clearV0(): void; - getV0(): GetPathElementsResponse.GetPathElementsResponseV0 | undefined; - setV0(value?: GetPathElementsResponse.GetPathElementsResponseV0): void; - - getVersionCase(): GetPathElementsResponse.VersionCase; - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): GetPathElementsResponse.AsObject; - static toObject(includeInstance: boolean, msg: GetPathElementsResponse): GetPathElementsResponse.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; - static serializeBinaryToWriter(message: GetPathElementsResponse, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): GetPathElementsResponse; - static deserializeBinaryFromReader(message: GetPathElementsResponse, reader: jspb.BinaryReader): GetPathElementsResponse; -} - -export namespace GetPathElementsResponse { - export type AsObject = { - v0?: GetPathElementsResponse.GetPathElementsResponseV0.AsObject, - } - - export class GetPathElementsResponseV0 extends jspb.Message { - hasElements(): boolean; - clearElements(): void; - getElements(): GetPathElementsResponse.GetPathElementsResponseV0.Elements | undefined; - setElements(value?: GetPathElementsResponse.GetPathElementsResponseV0.Elements): void; - - hasProof(): boolean; - clearProof(): void; - getProof(): Proof | undefined; - setProof(value?: Proof): void; - - hasMetadata(): boolean; - clearMetadata(): void; - getMetadata(): ResponseMetadata | undefined; - setMetadata(value?: ResponseMetadata): void; - - getResultCase(): GetPathElementsResponseV0.ResultCase; - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): GetPathElementsResponseV0.AsObject; - static toObject(includeInstance: boolean, msg: GetPathElementsResponseV0): GetPathElementsResponseV0.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; - static serializeBinaryToWriter(message: GetPathElementsResponseV0, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): GetPathElementsResponseV0; - static deserializeBinaryFromReader(message: GetPathElementsResponseV0, reader: jspb.BinaryReader): GetPathElementsResponseV0; - } - - export namespace GetPathElementsResponseV0 { - export type AsObject = { - elements?: GetPathElementsResponse.GetPathElementsResponseV0.Elements.AsObject, - proof?: Proof.AsObject, - metadata?: ResponseMetadata.AsObject, - } - - export class Elements extends jspb.Message { - clearElementsList(): void; - getElementsList(): Array; - getElementsList_asU8(): Array; - getElementsList_asB64(): Array; - setElementsList(value: Array): void; - addElements(value: Uint8Array | string, index?: number): Uint8Array | string; - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): Elements.AsObject; - static toObject(includeInstance: boolean, msg: Elements): Elements.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; - static serializeBinaryToWriter(message: Elements, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): Elements; - static deserializeBinaryFromReader(message: Elements, reader: jspb.BinaryReader): Elements; - } - - export namespace Elements { - export type AsObject = { - elementsList: Array, - } - } - - export enum ResultCase { - RESULT_NOT_SET = 0, - ELEMENTS = 1, - PROOF = 2, - } - } - - export enum VersionCase { - VERSION_NOT_SET = 0, - V0 = 1, - } -} - diff --git a/packages/dashpay-contract/schema/v1/dashpay.schema.json b/packages/dashpay-contract/schema/v1/dashpay.schema.json index c51ee225f0..d4281468ed 100644 --- a/packages/dashpay-contract/schema/v1/dashpay.schema.json +++ b/packages/dashpay-contract/schema/v1/dashpay.schema.json @@ -131,6 +131,7 @@ "additionalProperties": false }, "contactRequest": { + "documentsMutable": false, "requiresIdentityEncryptionBoundedKey": 2, "requiresIdentityDecryptionBoundedKey": 2, "type": "object", diff --git a/packages/rs-dpp/schema/meta_schemas/document/v0/document-meta.json b/packages/rs-dpp/schema/meta_schemas/document/v0/document-meta.json index e802b7825a..c5067f16e1 100644 --- a/packages/rs-dpp/schema/meta_schemas/document/v0/document-meta.json +++ b/packages/rs-dpp/schema/meta_schemas/document/v0/document-meta.json @@ -481,6 +481,14 @@ ], "description": "Public key security level. 0 - Master, 1 - Critical, 2 - High, 3 - Medium. If none specified, High level is used" }, + "transferable": { + "type": "integer", + "enum": [ + 0, + 1 + ], + "description": "Transferable without a marketplace sell. 0 - Never, 1 - Always" + }, "requiresIdentityEncryptionBoundedKey": { "type": "integer", "enum": [ @@ -515,7 +523,14 @@ "$ownerId": true, "$revision": true, "$createdAt": true, - "$updatedAt": true + "$updatedAt": true, + "$transferredAt": true, + "$createdAtBlockHeight": true, + "$updatedAtBlockHeight": true, + "$transferredAtBlockHeight": true, + "$createdAtCoreBlockHeight": true, + "$updatedAtCoreBlockHeight": true, + "$transferredAtCoreBlockHeight": true }, "propertyNames": { "oneOf": [ @@ -530,7 +545,14 @@ "$ownerId", "$revision", "$createdAt", - "$updatedAt" + "$updatedAt", + "$transferredAt", + "$createdAtBlockHeight", + "$updatedAtBlockHeight", + "$transferredAtBlockHeight", + "$createdAtCoreBlockHeight", + "$updatedAtCoreBlockHeight", + "$transferredAtCoreBlockHeight" ] } ] diff --git a/packages/rs-dpp/src/block/block_info/mod.rs b/packages/rs-dpp/src/block/block_info/mod.rs index edd9b54395..6f43eefc1b 100644 --- a/packages/rs-dpp/src/block/block_info/mod.rs +++ b/packages/rs-dpp/src/block/block_info/mod.rs @@ -14,7 +14,7 @@ pub const DEFAULT_BLOCK_INFO: BlockInfo = BlockInfo { // Extended block info however is not immutable // @immutable /// Block information -#[derive(Clone, Default, Debug, PartialEq, Eq, Encode, Decode, Serialize, Deserialize)] +#[derive(Clone, Copy, Default, Debug, PartialEq, Eq, Encode, Decode, Serialize, Deserialize)] pub struct BlockInfo { /// Block time in milliseconds pub time_ms: TimestampMillis, diff --git a/packages/rs-dpp/src/data_contract/document_type/accessors/mod.rs b/packages/rs-dpp/src/data_contract/document_type/accessors/mod.rs index fff3756248..3b4aef6b3c 100644 --- a/packages/rs-dpp/src/data_contract/document_type/accessors/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/accessors/mod.rs @@ -8,6 +8,7 @@ use crate::data_contract::document_type::{DocumentType, DocumentTypeMutRef, Docu use platform_value::{Identifier, Value}; use crate::data_contract::storage_requirements::keys_for_document_type::StorageKeyRequirements; +use crate::document::transfer::Transferable; use crate::identity::SecurityLevel; use indexmap::IndexMap; use std::collections::BTreeSet; @@ -86,6 +87,12 @@ impl DocumentTypeV0Getters for DocumentType { } } + fn documents_transferable(&self) -> Transferable { + match self { + DocumentType::V0(v0) => v0.documents_transferable(), + } + } + fn data_contract_id(&self) -> Identifier { match self { DocumentType::V0(v0) => v0.data_contract_id(), @@ -184,6 +191,12 @@ impl<'a> DocumentTypeV0Getters for DocumentTypeRef<'a> { } } + fn documents_transferable(&self) -> Transferable { + match self { + DocumentTypeRef::V0(v0) => v0.documents_transferable(), + } + } + fn data_contract_id(&self) -> Identifier { match self { DocumentTypeRef::V0(v0) => v0.data_contract_id(), @@ -282,6 +295,12 @@ impl<'a> DocumentTypeV0Getters for DocumentTypeMutRef<'a> { } } + fn documents_transferable(&self) -> Transferable { + match self { + DocumentTypeMutRef::V0(v0) => v0.documents_transferable(), + } + } + fn data_contract_id(&self) -> Identifier { match self { DocumentTypeMutRef::V0(v0) => v0.data_contract_id(), diff --git a/packages/rs-dpp/src/data_contract/document_type/accessors/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/accessors/v0/mod.rs index d18abdfc91..b297b3dd9b 100644 --- a/packages/rs-dpp/src/data_contract/document_type/accessors/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/accessors/v0/mod.rs @@ -5,6 +5,7 @@ use crate::data_contract::document_type::property::DocumentProperty; use platform_value::{Identifier, Value}; use crate::data_contract::storage_requirements::keys_for_document_type::StorageKeyRequirements; +use crate::document::transfer::Transferable; use crate::identity::SecurityLevel; use indexmap::IndexMap; use std::collections::BTreeSet; @@ -44,6 +45,9 @@ pub trait DocumentTypeV0Getters { /// Returns the documents mutable flag of the document type. fn documents_mutable(&self) -> bool; + /// Returns the documents transferable flag of the document type. + fn documents_transferable(&self) -> Transferable; + /// Returns the data contract id of the document type. fn data_contract_id(&self) -> Identifier; diff --git a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs index 59b7404656..2571ff0cf6 100644 --- a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs @@ -48,7 +48,19 @@ use platform_value::{Identifier, Value}; const UNIQUE_INDEX_LIMIT_V0: usize = 16; const NOT_ALLOWED_SYSTEM_PROPERTIES: [&str; 1] = ["$id"]; -const SYSTEM_PROPERTIES: [&str; 4] = ["$id", "$ownerId", "$createdAt", "$updatedAt"]; +const SYSTEM_PROPERTIES: [&str; 11] = [ + "$id", + "$ownerId", + "$createdAt", + "$updatedAt", + "$transferredAt", + "$createdAtBlockHeight", + "$updatedAtBlockHeight", + "$transferredAtBlockHeight", + "$createdAtCoreBlockHeight", + "$updatedAtCoreBlockHeight", + "$transferredAtCoreBlockHeight", +]; const MAX_INDEXED_STRING_PROPERTY_LENGTH: u16 = 63; const MAX_INDEXED_BYTE_ARRAY_PROPERTY_LENGTH: u16 = 255; @@ -209,6 +221,14 @@ impl DocumentTypeV0 { .map_err(consensus_or_protocol_value_error)? .unwrap_or(default_mutability); + // Are documents of this type transferable? (Overrides contract value) + let documents_transferable_u8: u8 = + Value::inner_optional_integer_value(schema_map, "transferable") + .map_err(consensus_or_protocol_value_error)? + .unwrap_or_default(); + + let documents_transferable = documents_transferable_u8.try_into()?; + // Extract the properties let property_values = Value::inner_optional_index_map::( schema_map, @@ -491,6 +511,7 @@ impl DocumentTypeV0 { required_fields, documents_keep_history, documents_mutable, + documents_transferable, data_contract_id, requires_identity_encryption_bounded_key, requires_identity_decryption_bounded_key, diff --git a/packages/rs-dpp/src/data_contract/document_type/methods/create_document_from_data/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/methods/create_document_from_data/v0/mod.rs index 447d9c8806..3242e1db19 100644 --- a/packages/rs-dpp/src/data_contract/document_type/methods/create_document_from_data/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/methods/create_document_from_data/v0/mod.rs @@ -1,9 +1,10 @@ use crate::data_contract::document_type::accessors::DocumentTypeV0Getters; -use crate::data_contract::document_type::property_names::{CREATED_AT, UPDATED_AT}; +use crate::data_contract::document_type::methods::DocumentTypeV0Methods; use crate::data_contract::document_type::v0::DocumentTypeV0; use crate::document::property_names::{ - CREATED_AT_BLOCK_HEIGHT, CREATED_AT_CORE_BLOCK_HEIGHT, UPDATED_AT_BLOCK_HEIGHT, - UPDATED_AT_CORE_BLOCK_HEIGHT, + CREATED_AT, CREATED_AT_BLOCK_HEIGHT, CREATED_AT_CORE_BLOCK_HEIGHT, TRANSFERRED_AT, + TRANSFERRED_AT_BLOCK_HEIGHT, TRANSFERRED_AT_CORE_BLOCK_HEIGHT, UPDATED_AT, + UPDATED_AT_BLOCK_HEIGHT, UPDATED_AT_CORE_BLOCK_HEIGHT, }; use crate::document::{Document, DocumentV0, INITIAL_REVISION}; use crate::identity::TimestampMillis; @@ -31,7 +32,7 @@ impl DocumentTypeV0 { &document_entropy, ); - let revision = if self.documents_mutable() { + let revision = if self.requires_revision() { Some(INITIAL_REVISION) } else { None @@ -47,6 +48,10 @@ impl DocumentTypeV0 { .get_optional_integer(UPDATED_AT) .map_err(ProtocolError::ValueError)?; + let mut transferred_at: Option = data + .get_optional_integer(TRANSFERRED_AT) + .map_err(ProtocolError::ValueError)?; + let mut created_at_block_height: Option = data .get_optional_integer(CREATED_AT_BLOCK_HEIGHT) .map_err(ProtocolError::ValueError)?; @@ -55,6 +60,10 @@ impl DocumentTypeV0 { .get_optional_integer(UPDATED_AT_BLOCK_HEIGHT) .map_err(ProtocolError::ValueError)?; + let mut transferred_at_block_height: Option = data + .get_optional_integer(TRANSFERRED_AT_BLOCK_HEIGHT) + .map_err(ProtocolError::ValueError)?; + let mut created_at_core_block_height: Option = data .get_optional_integer(CREATED_AT_CORE_BLOCK_HEIGHT) .map_err(ProtocolError::ValueError)?; @@ -63,13 +72,20 @@ impl DocumentTypeV0 { .get_optional_integer(UPDATED_AT_CORE_BLOCK_HEIGHT) .map_err(ProtocolError::ValueError)?; + let mut transferred_at_core_block_height: Option = data + .get_optional_integer(TRANSFERRED_AT_CORE_BLOCK_HEIGHT) + .map_err(ProtocolError::ValueError)?; + let is_created_at_required = self.required_fields().contains(CREATED_AT); let is_updated_at_required = self.required_fields().contains(UPDATED_AT); + let is_transferred_at_required = self.required_fields().contains(TRANSFERRED_AT); let is_created_at_block_height_required = self.required_fields().contains(CREATED_AT_BLOCK_HEIGHT); let is_updated_at_block_height_required = self.required_fields().contains(UPDATED_AT_BLOCK_HEIGHT); + let is_transferred_at_block_height_required = + self.required_fields().contains(TRANSFERRED_AT_BLOCK_HEIGHT); let is_created_at_core_block_height_required = self .required_fields() @@ -77,9 +93,13 @@ impl DocumentTypeV0 { let is_updated_at_core_block_height_required = self .required_fields() .contains(UPDATED_AT_CORE_BLOCK_HEIGHT); + let is_transferred_at_core_block_height_required = self + .required_fields() + .contains(TRANSFERRED_AT_CORE_BLOCK_HEIGHT); if (is_created_at_required && created_at.is_none()) - || (is_updated_at_required && updated_at.is_none()) + || (is_updated_at_required && updated_at.is_none() + || (is_transferred_at_required && transferred_at.is_none())) { //we want only one call to get current time let now = Utc::now().timestamp_millis() as TimestampMillis; @@ -91,6 +111,10 @@ impl DocumentTypeV0 { if is_updated_at_required { updated_at = updated_at.or(Some(now)); }; + + if is_transferred_at_required { + transferred_at = transferred_at.or(Some(now)); + }; }; if is_created_at_block_height_required { @@ -101,6 +125,10 @@ impl DocumentTypeV0 { updated_at_block_height = updated_at_block_height.or(Some(block_height)); }; + if is_transferred_at_block_height_required { + transferred_at_block_height = transferred_at_block_height.or(Some(block_height)); + }; + if is_created_at_core_block_height_required { created_at_core_block_height = created_at_core_block_height.or(Some(core_block_height)); }; @@ -109,6 +137,11 @@ impl DocumentTypeV0 { updated_at_core_block_height = updated_at_core_block_height.or(Some(core_block_height)); }; + if is_transferred_at_core_block_height_required { + transferred_at_core_block_height = + transferred_at_core_block_height.or(Some(core_block_height)); + }; + match platform_version .dpp .document_versions @@ -124,10 +157,13 @@ impl DocumentTypeV0 { revision, created_at, updated_at, + transferred_at, created_at_block_height, updated_at_block_height, + transferred_at_block_height, created_at_core_block_height, updated_at_core_block_height, + transferred_at_core_block_height, }; document diff --git a/packages/rs-dpp/src/data_contract/document_type/methods/create_document_with_prevalidated_properties/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/methods/create_document_with_prevalidated_properties/v0/mod.rs index d9286ff6c1..d0ab0243e1 100644 --- a/packages/rs-dpp/src/data_contract/document_type/methods/create_document_with_prevalidated_properties/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/methods/create_document_with_prevalidated_properties/v0/mod.rs @@ -1,14 +1,15 @@ -use crate::data_contract::document_type::property_names::{CREATED_AT, UPDATED_AT}; use crate::document::{Document, DocumentV0}; -use crate::prelude::{BlockHeight, CoreBlockHeight, TimestampMillis}; +use crate::prelude::{BlockHeight, CoreBlockHeight}; use crate::ProtocolError; use chrono::Utc; use platform_value::Value; use crate::data_contract::document_type::accessors::DocumentTypeV0Getters; +use crate::data_contract::document_type::methods::DocumentTypeV0Methods; use crate::data_contract::document_type::v0::DocumentTypeV0; use crate::document::property_names::{ - CREATED_AT_BLOCK_HEIGHT, CREATED_AT_CORE_BLOCK_HEIGHT, UPDATED_AT_BLOCK_HEIGHT, + CREATED_AT_BLOCK_HEIGHT, CREATED_AT_CORE_BLOCK_HEIGHT, TRANSFERRED_AT, + TRANSFERRED_AT_BLOCK_HEIGHT, TRANSFERRED_AT_CORE_BLOCK_HEIGHT, UPDATED_AT_BLOCK_HEIGHT, UPDATED_AT_CORE_BLOCK_HEIGHT, }; use crate::document::INITIAL_REVISION; @@ -30,12 +31,16 @@ impl DocumentTypeV0 { platform_version: &PlatformVersion, ) -> Result { // Set timestamps if they are required and not exist - let mut created_at: Option = properties - .get_optional_integer(CREATED_AT) + let mut created_at: Option = properties + .get_optional_integer(crate::document::property_names::CREATED_AT) .map_err(ProtocolError::ValueError)?; - let mut updated_at: Option = properties - .get_optional_integer(UPDATED_AT) + let mut updated_at: Option = properties + .get_optional_integer(crate::document::property_names::UPDATED_AT) + .map_err(ProtocolError::ValueError)?; + + let mut transferred_at: Option = properties + .get_optional_integer(TRANSFERRED_AT) .map_err(ProtocolError::ValueError)?; let mut created_at_block_height: Option = properties @@ -46,6 +51,10 @@ impl DocumentTypeV0 { .get_optional_integer(UPDATED_AT_BLOCK_HEIGHT) .map_err(ProtocolError::ValueError)?; + let mut transferred_at_block_height: Option = properties + .get_optional_integer(TRANSFERRED_AT_BLOCK_HEIGHT) + .map_err(ProtocolError::ValueError)?; + let mut created_at_core_block_height: Option = properties .get_optional_integer(CREATED_AT_CORE_BLOCK_HEIGHT) .map_err(ProtocolError::ValueError)?; @@ -54,13 +63,24 @@ impl DocumentTypeV0 { .get_optional_integer(UPDATED_AT_CORE_BLOCK_HEIGHT) .map_err(ProtocolError::ValueError)?; - let is_created_at_required = self.required_fields().contains(CREATED_AT); - let is_updated_at_required = self.required_fields().contains(UPDATED_AT); + let mut transferred_at_core_block_height: Option = properties + .get_optional_integer(TRANSFERRED_AT_CORE_BLOCK_HEIGHT) + .map_err(ProtocolError::ValueError)?; + + let is_created_at_required = self + .required_fields() + .contains(crate::document::property_names::CREATED_AT); + let is_updated_at_required = self + .required_fields() + .contains(crate::document::property_names::UPDATED_AT); + let is_transferred_at_required = self.required_fields().contains(TRANSFERRED_AT); let is_created_at_block_height_required = self.required_fields().contains(CREATED_AT_BLOCK_HEIGHT); let is_updated_at_block_height_required = self.required_fields().contains(UPDATED_AT_BLOCK_HEIGHT); + let is_transferred_at_block_height_required = + self.required_fields().contains(TRANSFERRED_AT_BLOCK_HEIGHT); let is_created_at_core_block_height_required = self .required_fields() @@ -68,12 +88,16 @@ impl DocumentTypeV0 { let is_updated_at_core_block_height_required = self .required_fields() .contains(UPDATED_AT_CORE_BLOCK_HEIGHT); + let is_transferred_at_core_block_height_required = self + .required_fields() + .contains(TRANSFERRED_AT_CORE_BLOCK_HEIGHT); if (is_created_at_required && created_at.is_none()) - || (is_updated_at_required && updated_at.is_none()) + || (is_updated_at_required && updated_at.is_none() + || (is_transferred_at_required && transferred_at.is_none())) { //we want only one call to get current time - let now = Utc::now().timestamp_millis() as TimestampMillis; + let now = Utc::now().timestamp_millis() as crate::identity::TimestampMillis; if is_created_at_required { created_at = created_at.or(Some(now)); @@ -82,6 +106,10 @@ impl DocumentTypeV0 { if is_updated_at_required { updated_at = updated_at.or(Some(now)); }; + + if is_transferred_at_required { + transferred_at = transferred_at.or(Some(now)); + }; }; if is_created_at_block_height_required { @@ -92,6 +120,10 @@ impl DocumentTypeV0 { updated_at_block_height = updated_at_block_height.or(Some(block_height)); }; + if is_transferred_at_block_height_required { + transferred_at_block_height = transferred_at_block_height.or(Some(block_height)); + }; + if is_created_at_core_block_height_required { created_at_core_block_height = created_at_core_block_height.or(Some(core_block_height)); }; @@ -100,7 +132,12 @@ impl DocumentTypeV0 { updated_at_core_block_height = updated_at_core_block_height.or(Some(core_block_height)); }; - let revision = if self.documents_mutable { + if is_transferred_at_core_block_height_required { + transferred_at_core_block_height = + transferred_at_core_block_height.or(Some(core_block_height)); + }; + + let revision = if self.requires_revision() { Some(INITIAL_REVISION) } else { None @@ -118,10 +155,13 @@ impl DocumentTypeV0 { revision, created_at, updated_at, + transferred_at, created_at_block_height, updated_at_block_height, + transferred_at_block_height, created_at_core_block_height, updated_at_core_block_height, + transferred_at_core_block_height, } .into()), version => Err(ProtocolError::UnknownVersionMismatch { diff --git a/packages/rs-dpp/src/data_contract/document_type/methods/mod.rs b/packages/rs-dpp/src/data_contract/document_type/methods/mod.rs index 394e1d3b14..240e1d9668 100644 --- a/packages/rs-dpp/src/data_contract/document_type/methods/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/methods/mod.rs @@ -18,6 +18,7 @@ use crate::prelude::{BlockHeight, CoreBlockHeight, Revision}; use crate::version::PlatformVersion; use crate::ProtocolError; +use crate::document::transfer::Transferable; use platform_value::{Identifier, Value}; // TODO: Some of those methods are only for tests. Hide under feature @@ -207,7 +208,7 @@ impl DocumentTypeV0Methods for DocumentTypeV0 { } fn initial_revision(&self) -> Option { - if self.documents_mutable { + if self.requires_revision() { Some(INITIAL_REVISION) } else { None @@ -215,7 +216,7 @@ impl DocumentTypeV0Methods for DocumentTypeV0 { } fn requires_revision(&self) -> bool { - self.documents_mutable + self.documents_mutable || self.documents_transferable != Transferable::Never } fn top_level_indices(&self) -> Vec<&IndexProperty> { diff --git a/packages/rs-dpp/src/data_contract/document_type/methods/serialize_value_for_key/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/methods/serialize_value_for_key/v0/mod.rs index 00a384fce1..92890cb647 100644 --- a/packages/rs-dpp/src/data_contract/document_type/methods/serialize_value_for_key/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/methods/serialize_value_for_key/v0/mod.rs @@ -28,9 +28,21 @@ impl DocumentTypeV0 { Ok(bytes) } } - "$createdAt" | "$updatedAt" => DocumentPropertyType::encode_date_timestamp( + "$createdAt" | "$updatedAt" | "$transferredAt" => { + Ok(DocumentPropertyType::encode_date_timestamp( + value.to_integer().map_err(ProtocolError::ValueError)?, + )) + } + "$createdAtBlockHeight" | "$updatedAtBlockHeight" | "$transferredAtBlockHeight" => { + Ok(DocumentPropertyType::encode_u64( + value.to_integer().map_err(ProtocolError::ValueError)?, + )) + } + "$createdAtCoreBlockHeight" + | "$updatedAtCoreBlockHeight" + | "$transferredAtCoreBlockHeight" => Ok(DocumentPropertyType::encode_u32( value.to_integer().map_err(ProtocolError::ValueError)?, - ), + )), _ => { let property = self.flattened_properties.get(key).ok_or_else(|| { DataContractError::DocumentTypeFieldNotFound(format!("expected contract to have field: {key}, contract fields are {} on document type {}", self.flattened_properties.keys().join(" | "), self.name)) diff --git a/packages/rs-dpp/src/data_contract/document_type/mod.rs b/packages/rs-dpp/src/data_contract/document_type/mod.rs index 8822ad75c0..eed70afb85 100644 --- a/packages/rs-dpp/src/data_contract/document_type/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/mod.rs @@ -39,6 +39,7 @@ mod property_names { pub const REF: &str = "$ref"; pub const CREATED_AT: &str = "$createdAt"; pub const UPDATED_AT: &str = "$updatedAt"; + pub const TRANSFERRED_AT: &str = "$transferredAt"; pub const MIN_ITEMS: &str = "minItems"; pub const MAX_ITEMS: &str = "maxItems"; pub const MIN_LENGTH: &str = "minLength"; diff --git a/packages/rs-dpp/src/data_contract/document_type/property/mod.rs b/packages/rs-dpp/src/data_contract/document_type/property/mod.rs index c544bfd62b..e3a4003239 100644 --- a/packages/rs-dpp/src/data_contract/document_type/property/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/property/mod.rs @@ -796,13 +796,13 @@ impl DocumentPropertyType { Ok(vec) } } - DocumentPropertyType::Date => DocumentPropertyType::encode_date_timestamp( + DocumentPropertyType::Date => Ok(DocumentPropertyType::encode_date_timestamp( value.to_integer().map_err(ProtocolError::ValueError)?, - ), + )), DocumentPropertyType::Integer => { let value_as_i64 = value.to_integer().map_err(ProtocolError::ValueError)?; - DocumentPropertyType::encode_signed_integer(value_as_i64) + Ok(DocumentPropertyType::encode_i64(value_as_i64)) } DocumentPropertyType::Number => Ok(Self::encode_float( value.to_float().map_err(ProtocolError::ValueError)?, @@ -915,11 +915,11 @@ impl DocumentPropertyType { } } - pub fn encode_date_timestamp(val: TimestampMillis) -> Result, ProtocolError> { - Self::encode_unsigned_integer(val) + pub fn encode_date_timestamp(val: TimestampMillis) -> Vec { + Self::encode_u64(val) } - pub fn encode_unsigned_integer(val: u64) -> Result, ProtocolError> { + pub fn encode_u64(val: u64) -> Vec { // Positive integers are represented in binary with the signed bit set to 0 // Negative integers are represented in 2's complement form @@ -941,10 +941,35 @@ impl DocumentPropertyType { // change was uniform across all elements wtr[0] ^= 0b1000_0000; - Ok(wtr) + wtr + } + + pub fn encode_u32(val: u32) -> Vec { + // Positive integers are represented in binary with the signed bit set to 0 + // Negative integers are represented in 2's complement form + + // Encode the integer in big endian form + // This ensures that most significant bits are compared first + // a bigger positive number would be greater than a smaller one + // and a bigger negative number would be greater than a smaller one + // maintains sort order for each domain + let mut wtr = vec![]; + wtr.write_u32::(val).unwrap(); + + // Flip the sign bit + // to deal with interaction between the domains + // 2's complement values have the sign bit set to 1 + // this makes them greater than the positive domain in terms of sort order + // to fix this, we just flip the sign bit + // so positive integers have the high bit and negative integers have the low bit + // the relative order of elements in each domain is still maintained, as the + // change was uniform across all elements + wtr[0] ^= 0b1000_0000; + + wtr } - pub fn encode_signed_integer(val: i64) -> Result, ProtocolError> { + pub fn encode_i64(val: i64) -> Vec { // Positive integers are represented in binary with the signed bit set to 0 // Negative integers are represented in 2's complement form @@ -966,7 +991,7 @@ impl DocumentPropertyType { // change was uniform across all elements wtr[0] ^= 0b1000_0000; - Ok(wtr) + wtr } pub fn encode_float(val: f64) -> Vec { diff --git a/packages/rs-dpp/src/data_contract/document_type/schema/enrich_with_base_schema/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/schema/enrich_with_base_schema/v0/mod.rs index ea4066ebbd..71ebe9771e 100644 --- a/packages/rs-dpp/src/data_contract/document_type/schema/enrich_with_base_schema/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/schema/enrich_with_base_schema/v0/mod.rs @@ -8,7 +8,17 @@ pub const DATA_CONTRACT_SCHEMA_URI_V0: &str = pub const PROPERTY_SCHEMA: &str = "$schema"; -const TIMESTAMPS: [&str; 2] = ["$createdAt", "$updatedAt"]; +const SYSTEM_GENERATED_FIELDS: [&str; 9] = [ + "$createdAt", + "$updatedAt", + "$transferredAt", + "$createdAtBlockHeight", + "$updatedAtBlockHeight", + "$transferredAtBlockHeight", + "$createdAtCoreBlockHeight", + "$updatedAtCoreBlockHeight", + "$transferredAtCoreBlockHeight", +]; #[inline(always)] pub(super) fn enrich_with_base_schema_v0( @@ -43,13 +53,14 @@ pub(super) fn enrich_with_base_schema_v0( )); } - // Remove $createdAt and $updatedAt from JSON Schema since they aren't part of + // Remove $createdAt, $updatedAt and $transferredAt and their height and core height variants + // from JSON Schema since they aren't part of // dynamic (user defined) document data which is validating against the schema if let Some(required) = schema_map.get_optional_key_mut(property_names::REQUIRED) { if let Some(required_array) = required.as_array_mut() { required_array.retain(|field_value| { if let Some(field) = field_value.as_text() { - !TIMESTAMPS.contains(&field) + !SYSTEM_GENERATED_FIELDS.contains(&field) } else { true } diff --git a/packages/rs-dpp/src/data_contract/document_type/v0/accessors.rs b/packages/rs-dpp/src/data_contract/document_type/v0/accessors.rs index 015c50a8e8..b3b875ba57 100644 --- a/packages/rs-dpp/src/data_contract/document_type/v0/accessors.rs +++ b/packages/rs-dpp/src/data_contract/document_type/v0/accessors.rs @@ -7,6 +7,7 @@ use crate::data_contract::document_type::v0::DocumentTypeV0; use platform_value::{Identifier, Value}; use crate::data_contract::storage_requirements::keys_for_document_type::StorageKeyRequirements; +use crate::document::transfer::Transferable; use crate::identity::SecurityLevel; use indexmap::IndexMap; use std::collections::BTreeSet; @@ -60,6 +61,10 @@ impl DocumentTypeV0Getters for DocumentTypeV0 { self.documents_mutable } + fn documents_transferable(&self) -> Transferable { + self.documents_transferable + } + fn data_contract_id(&self) -> Identifier { self.data_contract_id } diff --git a/packages/rs-dpp/src/data_contract/document_type/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/v0/mod.rs index af892015cc..7d8c6f990b 100644 --- a/packages/rs-dpp/src/data_contract/document_type/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/v0/mod.rs @@ -9,6 +9,7 @@ use crate::data_contract::storage_requirements::keys_for_document_type::StorageK #[cfg(feature = "validation")] pub(in crate::data_contract) use validator::StatelessJsonSchemaLazyValidator; +use crate::document::transfer::Transferable; use crate::identity::SecurityLevel; use platform_value::{Identifier, Value}; @@ -53,6 +54,8 @@ pub struct DocumentTypeV0 { pub(in crate::data_contract) documents_keep_history: bool, /// Are documents mutable? pub(in crate::data_contract) documents_mutable: bool, + /// Are documents transferable? + pub(in crate::data_contract) documents_transferable: Transferable, pub(in crate::data_contract) data_contract_id: Identifier, /// Encryption key storage requirements pub(in crate::data_contract) requires_identity_encryption_bounded_key: diff --git a/packages/rs-dpp/src/data_contract/document_type/v0/random_document.rs b/packages/rs-dpp/src/data_contract/document_type/v0/random_document.rs index 68964bd464..2496f032be 100644 --- a/packages/rs-dpp/src/data_contract/document_type/v0/random_document.rs +++ b/packages/rs-dpp/src/data_contract/document_type/v0/random_document.rs @@ -4,18 +4,18 @@ //! create various types of random documents. //! -use crate::data_contract::document_type::property_names::{CREATED_AT, UPDATED_AT}; use crate::data_contract::document_type::random_document::{ CreateRandomDocument, DocumentFieldFillSize, DocumentFieldFillType, }; use crate::data_contract::document_type::v0::DocumentTypeV0; use std::time::{SystemTime, UNIX_EPOCH}; +use crate::data_contract::document_type::methods::DocumentTypeV0Methods; use crate::document::property_names::{ - CREATED_AT_BLOCK_HEIGHT, CREATED_AT_CORE_BLOCK_HEIGHT, UPDATED_AT_BLOCK_HEIGHT, - UPDATED_AT_CORE_BLOCK_HEIGHT, + CREATED_AT, CREATED_AT_BLOCK_HEIGHT, CREATED_AT_CORE_BLOCK_HEIGHT, UPDATED_AT, + UPDATED_AT_BLOCK_HEIGHT, UPDATED_AT_CORE_BLOCK_HEIGHT, }; -use crate::document::{Document, DocumentV0}; +use crate::document::{Document, DocumentV0, INITIAL_REVISION}; use crate::identity::accessors::IdentityGettersV0; use crate::identity::Identity; use crate::prelude::{BlockHeight, CoreBlockHeight, TimestampMillis}; @@ -157,8 +157,8 @@ impl CreateRandomDocument for DocumentTypeV0 { }) .collect(); - let revision = if self.documents_mutable { - Some(1) + let revision = if self.requires_revision() { + Some(INITIAL_REVISION) } else { None }; @@ -247,10 +247,13 @@ impl CreateRandomDocument for DocumentTypeV0 { revision, created_at, updated_at, + transferred_at: None, created_at_block_height, updated_at_block_height, + transferred_at_block_height: None, created_at_core_block_height, updated_at_core_block_height, + transferred_at_core_block_height: None, } .into()), version => Err(ProtocolError::UnknownVersionMismatch { diff --git a/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs b/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs index 8b1c1841ad..5a977161c4 100644 --- a/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs +++ b/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs @@ -104,6 +104,7 @@ use crate::data_contract::document_type::v0::StatelessJsonSchemaLazyValidator; use crate::data_contract::document_type::{ v0::DocumentTypeV0, DocumentProperty, DocumentPropertyType, DocumentType, Index, }; +use crate::document::transfer::Transferable; use crate::identity::SecurityLevel; use crate::version::PlatformVersion; use crate::ProtocolError; @@ -422,6 +423,7 @@ impl DocumentTypeV0 { required_fields, documents_keep_history, documents_mutable, + documents_transferable: Transferable::Never, data_contract_id, requires_identity_encryption_bounded_key: None, requires_identity_decryption_bounded_key: None, @@ -585,6 +587,7 @@ impl DocumentTypeV0 { required_fields, documents_keep_history, documents_mutable, + documents_transferable: Transferable::Never, data_contract_id, requires_identity_encryption_bounded_key: None, requires_identity_decryption_bounded_key: None, diff --git a/packages/rs-dpp/src/document/accessors/mod.rs b/packages/rs-dpp/src/document/accessors/mod.rs index 363f0c1696..ce005efd62 100644 --- a/packages/rs-dpp/src/document/accessors/mod.rs +++ b/packages/rs-dpp/src/document/accessors/mod.rs @@ -69,6 +69,12 @@ impl DocumentV0Getters for Document { } } + fn transferred_at(&self) -> Option { + match self { + Document::V0(v0) => v0.transferred_at, + } + } + fn created_at_block_height(&self) -> Option { match self { Document::V0(v0) => v0.created_at_block_height, @@ -81,6 +87,12 @@ impl DocumentV0Getters for Document { } } + fn transferred_at_block_height(&self) -> Option { + match self { + Document::V0(v0) => v0.transferred_at_block_height, + } + } + fn created_at_core_block_height(&self) -> Option { match self { Document::V0(v0) => v0.created_at_core_block_height, @@ -92,6 +104,12 @@ impl DocumentV0Getters for Document { Document::V0(v0) => v0.updated_at_core_block_height, } } + + fn transferred_at_core_block_height(&self) -> Option { + match self { + Document::V0(v0) => v0.transferred_at_core_block_height, + } + } } impl DocumentV0Setters for Document { @@ -131,6 +149,12 @@ impl DocumentV0Setters for Document { } } + fn set_transferred_at(&mut self, transferred_at: Option) { + match self { + Document::V0(v0) => v0.transferred_at = transferred_at, + } + } + fn set_created_at_block_height(&mut self, created_at_block_height: Option) { match self { Document::V0(v0) => v0.created_at_block_height = created_at_block_height, @@ -143,6 +167,12 @@ impl DocumentV0Setters for Document { } } + fn set_transferred_at_block_height(&mut self, transferred_at_block_height: Option) { + match self { + Document::V0(v0) => v0.transferred_at_block_height = transferred_at_block_height, + } + } + fn set_created_at_core_block_height(&mut self, created_at_core_block_height: Option) { match self { Document::V0(v0) => v0.created_at_core_block_height = created_at_core_block_height, @@ -154,4 +184,15 @@ impl DocumentV0Setters for Document { Document::V0(v0) => v0.updated_at_core_block_height = updated_at_core_block_height, } } + + fn set_transferred_at_core_block_height( + &mut self, + transferred_at_core_block_height: Option, + ) { + match self { + Document::V0(v0) => { + v0.transferred_at_core_block_height = transferred_at_core_block_height + } + } + } } diff --git a/packages/rs-dpp/src/document/accessors/v0/mod.rs b/packages/rs-dpp/src/document/accessors/v0/mod.rs index 08f8260723..7717ee02f5 100644 --- a/packages/rs-dpp/src/document/accessors/v0/mod.rs +++ b/packages/rs-dpp/src/document/accessors/v0/mod.rs @@ -30,6 +30,9 @@ pub trait DocumentV0Getters { /// Returns the time in milliseconds that the document was last updated. fn updated_at(&self) -> Option; + /// Returns the time in milliseconds that the document was last transferred. + fn transferred_at(&self) -> Option; + /// Retrieves the field specified by the path. /// Returns `None` if the path is empty or if the field is not present. fn get(&self, path: &str) -> Option<&Value> { @@ -40,8 +43,10 @@ pub trait DocumentV0Getters { fn properties_consumed(self) -> BTreeMap; fn created_at_block_height(&self) -> Option; fn updated_at_block_height(&self) -> Option; + fn transferred_at_block_height(&self) -> Option; fn created_at_core_block_height(&self) -> Option; fn updated_at_core_block_height(&self) -> Option; + fn transferred_at_core_block_height(&self) -> Option; } pub trait DocumentV0Setters: DocumentV0Getters { @@ -131,4 +136,10 @@ pub trait DocumentV0Setters: DocumentV0Getters { fn set_updated_at_block_height(&mut self, updated_at_block_height: Option); fn set_created_at_core_block_height(&mut self, created_at_core_block_height: Option); fn set_updated_at_core_block_height(&mut self, updated_at_core_block_height: Option); + fn set_transferred_at_core_block_height( + &mut self, + transferred_at_core_block_height: Option, + ); + fn set_transferred_at_block_height(&mut self, transferred_at_block_height: Option); + fn set_transferred_at(&mut self, transferred_at: Option); } diff --git a/packages/rs-dpp/src/document/document_methods/get_raw_for_document_type/v0/mod.rs b/packages/rs-dpp/src/document/document_methods/get_raw_for_document_type/v0/mod.rs index 419d5ee683..2bcaa11c27 100644 --- a/packages/rs-dpp/src/document/document_methods/get_raw_for_document_type/v0/mod.rs +++ b/packages/rs-dpp/src/document/document_methods/get_raw_for_document_type/v0/mod.rs @@ -31,12 +31,47 @@ pub trait DocumentGetRawForDocumentTypeV0: DocumentV0Getters { "$createdAt" => { return Ok(self .created_at() - .map(|time| DocumentPropertyType::encode_date_timestamp(time).unwrap())) + .map(DocumentPropertyType::encode_date_timestamp)) + } + "$createdAtBlockHeight" => { + return Ok(self + .created_at_block_height() + .map(DocumentPropertyType::encode_u64)) + } + "$createdAtCoreBlockHeight" => { + return Ok(self + .created_at_core_block_height() + .map(DocumentPropertyType::encode_u32)) } "$updatedAt" => { return Ok(self .updated_at() - .map(|time| DocumentPropertyType::encode_date_timestamp(time).unwrap())) + .map(DocumentPropertyType::encode_date_timestamp)) + } + "$updatedAtBlockHeight" => { + return Ok(self + .updated_at_block_height() + .map(DocumentPropertyType::encode_u64)) + } + "$updatedAtCoreBlockHeight" => { + return Ok(self + .updated_at_core_block_height() + .map(DocumentPropertyType::encode_u32)) + } + "$transferredAt" => { + return Ok(self + .transferred_at() + .map(DocumentPropertyType::encode_date_timestamp)) + } + "$transferredAtBlockHeight" => { + return Ok(self + .transferred_at_block_height() + .map(DocumentPropertyType::encode_u64)) + } + "$transferredAtCoreBlockHeight" => { + return Ok(self + .transferred_at_core_block_height() + .map(DocumentPropertyType::encode_u32)) } _ => {} } diff --git a/packages/rs-dpp/src/document/extended_document/fields.rs b/packages/rs-dpp/src/document/extended_document/fields.rs index 0466c759b0..09400b60ed 100644 --- a/packages/rs-dpp/src/document/extended_document/fields.rs +++ b/packages/rs-dpp/src/document/extended_document/fields.rs @@ -8,6 +8,13 @@ pub mod property_names { pub const OWNER_ID: &str = "$ownerId"; pub const CREATED_AT: &str = "$createdAt"; pub const UPDATED_AT: &str = "$updatedAt"; + pub const TRANSFERRED_AT: &str = "$transferredAt"; + pub const CREATED_AT_BLOCK_HEIGHT: &str = "$createdAtBlockHeight"; + pub const UPDATED_AT_BLOCK_HEIGHT: &str = "$updatedAtBlockHeight"; + pub const TRANSFERRED_AT_BLOCK_HEIGHT: &str = "$transferredAtBlockHeight"; + pub const CREATED_AT_CORE_BLOCK_HEIGHT: &str = "$createdAtCoreBlockHeight"; + pub const UPDATED_AT_CORE_BLOCK_HEIGHT: &str = "$updatedAtCoreBlockHeight"; + pub const TRANSFERRED_AT_CORE_BLOCK_HEIGHT: &str = "$transferredAtCoreBlockHeight"; } pub const IDENTIFIER_FIELDS: [&str; 3] = [ diff --git a/packages/rs-dpp/src/document/extended_document/mod.rs b/packages/rs-dpp/src/document/extended_document/mod.rs index 17ba5312bb..ae9e23e606 100644 --- a/packages/rs-dpp/src/document/extended_document/mod.rs +++ b/packages/rs-dpp/src/document/extended_document/mod.rs @@ -549,7 +549,7 @@ mod test { let string = serde_json::to_string(&document)?; assert_eq!( - "{\"version\":0,\"$type\":\"domain\",\"$dataContractId\":\"566vcJkmebVCAb2Dkj2yVMSgGFcsshupnQqtsz1RFbcy\",\"document\":{\"$version\":\"0\",\"$id\":\"4veLBZPHDkaCPF9LfZ8fX3JZiS5q5iUVGhdBbaa9ga5E\",\"$ownerId\":\"HBNMY5QWuBVKNFLhgBTC1VmpEnscrmqKPMXpnYSHwhfn\",\"$dataContractId\":\"566vcJkmebVCAb2Dkj2yVMSgGFcsshupnQqtsz1RFbcy\",\"$protocolVersion\":0,\"$type\":\"domain\",\"label\":\"user-9999\",\"normalizedLabel\":\"user-9999\",\"normalizedParentDomainName\":\"dash\",\"preorderSalt\":\"BzQi567XVqc8wYiVHS887sJtL6MDbxLHNnp+UpTFSB0=\",\"records\":{\"dashUniqueIdentityId\":\"HBNMY5QWuBVKNFLhgBTC1VmpEnscrmqKPMXpnYSHwhfn\"},\"subdomainRules\":{\"allowSubdomains\":false},\"$revision\":1,\"$createdAt\":null,\"$updatedAt\":null,\"$createdAtBlockHeight\":null,\"$updatedAtBlockHeight\":null,\"$createdAtCoreBlockHeight\":null,\"$updatedAtCoreBlockHeight\":null}}", + "{\"version\":0,\"$type\":\"domain\",\"$dataContractId\":\"566vcJkmebVCAb2Dkj2yVMSgGFcsshupnQqtsz1RFbcy\",\"document\":{\"$version\":\"0\",\"$id\":\"4veLBZPHDkaCPF9LfZ8fX3JZiS5q5iUVGhdBbaa9ga5E\",\"$ownerId\":\"HBNMY5QWuBVKNFLhgBTC1VmpEnscrmqKPMXpnYSHwhfn\",\"$dataContractId\":\"566vcJkmebVCAb2Dkj2yVMSgGFcsshupnQqtsz1RFbcy\",\"$protocolVersion\":0,\"$type\":\"domain\",\"label\":\"user-9999\",\"normalizedLabel\":\"user-9999\",\"normalizedParentDomainName\":\"dash\",\"preorderSalt\":\"BzQi567XVqc8wYiVHS887sJtL6MDbxLHNnp+UpTFSB0=\",\"records\":{\"dashUniqueIdentityId\":\"HBNMY5QWuBVKNFLhgBTC1VmpEnscrmqKPMXpnYSHwhfn\"},\"subdomainRules\":{\"allowSubdomains\":false},\"$revision\":1,\"$createdAt\":null,\"$updatedAt\":null,\"$transferredAt\":null,\"$createdAtBlockHeight\":null,\"$updatedAtBlockHeight\":null,\"$transferredAtBlockHeight\":null,\"$createdAtCoreBlockHeight\":null,\"$updatedAtCoreBlockHeight\":null,\"$transferredAtCoreBlockHeight\":null}}", string ); diff --git a/packages/rs-dpp/src/document/fields.rs b/packages/rs-dpp/src/document/fields.rs index 3933bfeb10..f4d7afee69 100644 --- a/packages/rs-dpp/src/document/fields.rs +++ b/packages/rs-dpp/src/document/fields.rs @@ -7,10 +7,13 @@ pub mod property_names { pub const OWNER_ID: &str = "$ownerId"; pub const CREATED_AT: &str = "$createdAt"; pub const UPDATED_AT: &str = "$updatedAt"; + pub const TRANSFERRED_AT: &str = "$transferredAt"; pub const CREATED_AT_BLOCK_HEIGHT: &str = "$createdAtBlockHeight"; pub const UPDATED_AT_BLOCK_HEIGHT: &str = "$updatedAtBlockHeight"; + pub const TRANSFERRED_AT_BLOCK_HEIGHT: &str = "$transferredAtBlockHeight"; pub const CREATED_AT_CORE_BLOCK_HEIGHT: &str = "$createdAtCoreBlockHeight"; pub const UPDATED_AT_CORE_BLOCK_HEIGHT: &str = "$updatedAtCoreBlockHeight"; + pub const TRANSFERRED_AT_CORE_BLOCK_HEIGHT: &str = "$transferredAtCoreBlockHeight"; } pub const IDENTIFIER_FIELDS: [&str; 3] = [ diff --git a/packages/rs-dpp/src/document/mod.rs b/packages/rs-dpp/src/document/mod.rs index ad51973e5b..1fe74ad8ae 100644 --- a/packages/rs-dpp/src/document/mod.rs +++ b/packages/rs-dpp/src/document/mod.rs @@ -15,6 +15,7 @@ pub mod generate_document_id; pub mod serialization_traits; #[cfg(feature = "factories")] pub mod specialized_document_factory; +pub mod transfer; mod v0; pub use accessors::*; diff --git a/packages/rs-dpp/src/document/transfer.rs b/packages/rs-dpp/src/document/transfer.rs new file mode 100644 index 0000000000..d0d561eab1 --- /dev/null +++ b/packages/rs-dpp/src/document/transfer.rs @@ -0,0 +1,41 @@ +use crate::consensus::basic::data_contract::UnknownTransferableTypeError; +use crate::consensus::basic::BasicError; +use crate::consensus::ConsensusError; +use crate::ProtocolError; + +/// We made this enum because in the future we might have a case where documents are sometimes +/// transferable + +#[derive(Clone, Copy, Debug, PartialEq, Default)] +#[repr(u8)] +pub enum Transferable { + #[default] + Never = 0, + Always = 1, +} + +impl Transferable { + pub fn is_transferable(&self) -> bool { + match self { + Transferable::Never => false, + Transferable::Always => true, + } + } +} + +impl TryFrom for Transferable { + type Error = ProtocolError; + + fn try_from(value: u8) -> Result { + match value { + 0 => Ok(Self::Never), + 1 => Ok(Self::Always), + value => Err(ProtocolError::ConsensusError( + ConsensusError::BasicError(BasicError::UnknownTransferableTypeError( + UnknownTransferableTypeError::new(vec![0, 1], value), + )) + .into(), + )), + } + } +} diff --git a/packages/rs-dpp/src/document/v0/accessors.rs b/packages/rs-dpp/src/document/v0/accessors.rs index fb924bf364..4a14bea18a 100644 --- a/packages/rs-dpp/src/document/v0/accessors.rs +++ b/packages/rs-dpp/src/document/v0/accessors.rs @@ -65,6 +65,15 @@ impl DocumentV0Getters for DocumentV0 { self.updated_at } + /// Returns the timestamp of the last time the document was transferred, if it is part + /// of the document. The document will have this field if it's schema has it set as required. + /// + /// # Returns + /// An `Option` representing the transferred at time in milliseconds, or `None` if not available. + fn transferred_at(&self) -> Option { + self.transferred_at + } + /// Provides a reference to the document's unique identifier. /// /// # Returns @@ -107,6 +116,15 @@ impl DocumentV0Getters for DocumentV0 { self.updated_at_block_height } + /// Returns the block height of the last time the document was transferred, if it is part + /// of the document. The document will have this field if it's schema has it set as required. + /// + /// # Returns + /// An `Option` representing the transfer block height, or `None` if not available. + fn transferred_at_block_height(&self) -> Option { + self.transferred_at_block_height + } + /// Returns the core network block height at which the document was created, if it is part /// of the document. The document will have this field if it's schema has it set as required. /// @@ -124,6 +142,15 @@ impl DocumentV0Getters for DocumentV0 { fn updated_at_core_block_height(&self) -> Option { self.updated_at_core_block_height } + + /// Returns the core network block height of the last time the document was transferred, if it is part + /// of the document. The document will have this field if it's schema has it set as required. + /// + /// # Returns + /// An `Option` representing the transfer core block height, or `None` if not available. + fn transferred_at_core_block_height(&self) -> Option { + self.transferred_at_core_block_height + } } impl DocumentV0Setters for DocumentV0 { @@ -181,6 +208,10 @@ impl DocumentV0Setters for DocumentV0 { self.updated_at = updated_at; } + fn set_transferred_at(&mut self, transferred_at: Option) { + self.transferred_at = transferred_at; + } + /// Sets the block height at which the document was created. This is applicable if the document's /// schema requires this information. /// @@ -201,6 +232,10 @@ impl DocumentV0Setters for DocumentV0 { self.updated_at_block_height = updated_at_block_height; } + fn set_transferred_at_block_height(&mut self, transferred_at_block_height: Option) { + self.transferred_at_block_height = transferred_at_block_height; + } + /// Sets the core network block height at which the document was created. This is applicable if the /// document's schema requires this information. /// @@ -220,4 +255,11 @@ impl DocumentV0Setters for DocumentV0 { fn set_updated_at_core_block_height(&mut self, updated_at_core_block_height: Option) { self.updated_at_core_block_height = updated_at_core_block_height; } + + fn set_transferred_at_core_block_height( + &mut self, + transferred_at_core_block_height: Option, + ) { + self.transferred_at_core_block_height = transferred_at_core_block_height; + } } diff --git a/packages/rs-dpp/src/document/v0/cbor_conversion.rs b/packages/rs-dpp/src/document/v0/cbor_conversion.rs index 2791de5e32..8fe0732ea2 100644 --- a/packages/rs-dpp/src/document/v0/cbor_conversion.rs +++ b/packages/rs-dpp/src/document/v0/cbor_conversion.rs @@ -41,16 +41,22 @@ pub struct DocumentForCbor { pub created_at: Option, #[serde(rename = "$updatedAt")] pub updated_at: Option, + #[serde(rename = "$transferredAt")] + pub transferred_at: Option, #[serde(rename = "$createdAtBlockHeight")] pub created_at_block_height: Option, #[serde(rename = "$updatedAtBlockHeight")] pub updated_at_block_height: Option, + #[serde(rename = "$transferredAtBlockHeight")] + pub transferred_at_block_height: Option, #[serde(rename = "$createdAtCoreBlockHeight")] pub created_at_core_block_height: Option, #[serde(rename = "$updatedAtCoreBlockHeight")] pub updated_at_core_block_height: Option, + #[serde(rename = "$transferredAtCoreBlockHeight")] + pub transferred_at_core_block_height: Option, } #[cfg(feature = "cbor")] @@ -65,10 +71,13 @@ impl TryFrom for DocumentForCbor { revision, created_at, updated_at, + transferred_at, created_at_block_height, updated_at_block_height, + transferred_at_block_height, created_at_core_block_height, updated_at_core_block_height, + transferred_at_core_block_height, } = value; Ok(DocumentForCbor { id: id.to_buffer(), @@ -78,10 +87,13 @@ impl TryFrom for DocumentForCbor { revision, created_at, updated_at, + transferred_at, created_at_block_height, updated_at_block_height, + transferred_at_block_height, created_at_core_block_height, updated_at_core_block_height, + transferred_at_core_block_height, }) } } @@ -112,14 +124,20 @@ impl DocumentV0 { let created_at = document_map.remove_optional_integer(property_names::CREATED_AT)?; let updated_at = document_map.remove_optional_integer(property_names::UPDATED_AT)?; + let transferred_at = + document_map.remove_optional_integer(property_names::TRANSFERRED_AT)?; let created_at_block_height = document_map.remove_optional_integer(property_names::CREATED_AT_BLOCK_HEIGHT)?; let updated_at_block_height = document_map.remove_optional_integer(property_names::UPDATED_AT_BLOCK_HEIGHT)?; + let transferred_at_block_height = + document_map.remove_optional_integer(property_names::TRANSFERRED_AT_BLOCK_HEIGHT)?; let created_at_core_block_height = document_map.remove_optional_integer(property_names::CREATED_AT_CORE_BLOCK_HEIGHT)?; let updated_at_core_block_height = document_map.remove_optional_integer(property_names::UPDATED_AT_CORE_BLOCK_HEIGHT)?; + let transferred_at_core_block_height = document_map + .remove_optional_integer(property_names::TRANSFERRED_AT_CORE_BLOCK_HEIGHT)?; // dev-note: properties is everything other than the id and owner id Ok(DocumentV0 { @@ -129,10 +147,13 @@ impl DocumentV0 { revision, created_at, updated_at, + transferred_at, created_at_block_height, updated_at_block_height, + transferred_at_block_height, created_at_core_block_height, updated_at_core_block_height, + transferred_at_core_block_height, }) } } diff --git a/packages/rs-dpp/src/document/v0/mod.rs b/packages/rs-dpp/src/document/v0/mod.rs index 32d3957780..c68c01a42a 100644 --- a/packages/rs-dpp/src/document/v0/mod.rs +++ b/packages/rs-dpp/src/document/v0/mod.rs @@ -60,6 +60,12 @@ pub struct DocumentV0 { serde(rename = "$updatedAt", default) )] pub updated_at: Option, + /// The time in milliseconds that the document was last transferred, if it is set as required by the document type schema. + #[cfg_attr( + feature = "document-serde-conversion", + serde(rename = "$transferredAt", default) + )] + pub transferred_at: Option, /// The block that the document was created, if it is set as required by the document type schema. #[cfg_attr( feature = "document-serde-conversion", @@ -72,6 +78,12 @@ pub struct DocumentV0 { serde(rename = "$updatedAtBlockHeight", default) )] pub updated_at_block_height: Option, + /// The block that the document was last transferred to a new identity, if it is set as required by the document type schema. + #[cfg_attr( + feature = "document-serde-conversion", + serde(rename = "$transferredAtBlockHeight", default) + )] + pub transferred_at_block_height: Option, /// The core block that the document was created, if it is set as required by the document type schema. #[cfg_attr( feature = "document-serde-conversion", @@ -84,6 +96,12 @@ pub struct DocumentV0 { serde(rename = "$updatedAtCoreBlockHeight", default) )] pub updated_at_core_block_height: Option, + /// The core block that the document was last transferred to a new identity, if it is set as required by the document type schema. + #[cfg_attr( + feature = "document-serde-conversion", + serde(rename = "$transferredAtCoreBlockHeight", default) + )] + pub transferred_at_core_block_height: Option, } impl DocumentGetRawForContractV0 for DocumentV0 { diff --git a/packages/rs-dpp/src/document/v0/serialize.rs b/packages/rs-dpp/src/document/v0/serialize.rs index b13ec9e46f..259258fa4d 100644 --- a/packages/rs-dpp/src/document/v0/serialize.rs +++ b/packages/rs-dpp/src/document/v0/serialize.rs @@ -2,7 +2,8 @@ use crate::data_contract::document_type::DocumentTypeRef; use crate::data_contract::errors::DataContractError; use crate::document::property_names::{ - CREATED_AT, CREATED_AT_BLOCK_HEIGHT, CREATED_AT_CORE_BLOCK_HEIGHT, UPDATED_AT, + CREATED_AT, CREATED_AT_BLOCK_HEIGHT, CREATED_AT_CORE_BLOCK_HEIGHT, TRANSFERRED_AT, + TRANSFERRED_AT_BLOCK_HEIGHT, TRANSFERRED_AT_CORE_BLOCK_HEIGHT, UPDATED_AT, UPDATED_AT_BLOCK_HEIGHT, UPDATED_AT_CORE_BLOCK_HEIGHT, }; @@ -56,7 +57,7 @@ impl DocumentPlatformSerializationMethodsV0 for DocumentV0 { buffer.extend((1 as Revision).encode_var_vec()) } - let mut bitwise_exists_flag: u8 = 0; + let mut bitwise_exists_flag: u16 = 0; let mut time_fields_data_buffer = vec![]; @@ -86,9 +87,22 @@ impl DocumentPlatformSerializationMethodsV0 for DocumentV0 { )); } + // $transferredAt + if let Some(transferred_at) = &self.transferred_at { + bitwise_exists_flag |= 4; + // dbg!("we pushed transferred at {}", hex::encode(transferred_at.to_be_bytes())); + time_fields_data_buffer.extend(transferred_at.to_be_bytes()); + } else if document_type.required_fields().contains(TRANSFERRED_AT) { + return Err(ProtocolError::DataContractError( + DataContractError::MissingRequiredKey( + "transferred at field is not present".to_string(), + ), + )); + } + // $createdAtBlockHeight if let Some(created_at_block_height) = &self.created_at_block_height { - bitwise_exists_flag |= 4; + bitwise_exists_flag |= 8; time_fields_data_buffer.extend(created_at_block_height.to_be_bytes()); } else if document_type .required_fields() @@ -103,7 +117,7 @@ impl DocumentPlatformSerializationMethodsV0 for DocumentV0 { // $updatedAtBlockHeight if let Some(updated_at_block_height) = &self.updated_at_block_height { - bitwise_exists_flag |= 8; + bitwise_exists_flag |= 16; time_fields_data_buffer.extend(updated_at_block_height.to_be_bytes()); } else if document_type .required_fields() @@ -116,9 +130,24 @@ impl DocumentPlatformSerializationMethodsV0 for DocumentV0 { )); } + // $transferredAtBlockHeight + if let Some(transferred_at_block_height) = &self.transferred_at_block_height { + bitwise_exists_flag |= 32; + time_fields_data_buffer.extend(transferred_at_block_height.to_be_bytes()); + } else if document_type + .required_fields() + .contains(TRANSFERRED_AT_BLOCK_HEIGHT) + { + return Err(ProtocolError::DataContractError( + DataContractError::MissingRequiredKey( + "transferred_at_block_height field is not present".to_string(), + ), + )); + } + // $createdAtCoreBlockHeight if let Some(created_at_core_block_height) = &self.created_at_core_block_height { - bitwise_exists_flag |= 16; + bitwise_exists_flag |= 64; time_fields_data_buffer.extend(created_at_core_block_height.to_be_bytes()); } else if document_type .required_fields() @@ -133,7 +162,7 @@ impl DocumentPlatformSerializationMethodsV0 for DocumentV0 { // $updatedAtCoreBlockHeight if let Some(updated_at_core_block_height) = &self.updated_at_core_block_height { - bitwise_exists_flag |= 32; + bitwise_exists_flag |= 128; time_fields_data_buffer.extend(updated_at_core_block_height.to_be_bytes()); } else if document_type .required_fields() @@ -146,7 +175,22 @@ impl DocumentPlatformSerializationMethodsV0 for DocumentV0 { )); } - buffer.push(bitwise_exists_flag); + // $transferredAtCoreBlockHeight + if let Some(transferred_at_core_block_height) = &self.transferred_at_core_block_height { + bitwise_exists_flag |= 256; + time_fields_data_buffer.extend(transferred_at_core_block_height.to_be_bytes()); + } else if document_type + .required_fields() + .contains(TRANSFERRED_AT_CORE_BLOCK_HEIGHT) + { + return Err(ProtocolError::DataContractError( + DataContractError::MissingRequiredKey( + "transferred_at_core_block_height field is not present".to_string(), + ), + )); + } + + buffer.extend(bitwise_exists_flag.to_be_bytes().as_slice()); buffer.append(&mut time_fields_data_buffer); // User defined properties @@ -217,7 +261,7 @@ impl DocumentPlatformSerializationMethodsV0 for DocumentV0 { if let Some(revision) = self.revision { buffer.extend(revision.to_be_bytes()) } - let mut bitwise_exists_flag: u8 = 0; + let mut bitwise_exists_flag: u16 = 0; let mut time_fields_data_buffer = vec![]; @@ -247,9 +291,22 @@ impl DocumentPlatformSerializationMethodsV0 for DocumentV0 { )); } + // $transferredAt + if let Some(transferred_at) = &self.transferred_at { + bitwise_exists_flag |= 4; + // dbg!("we pushed transferred at {}", hex::encode(transferred_at.to_be_bytes())); + time_fields_data_buffer.extend(transferred_at.to_be_bytes()); + } else if document_type.required_fields().contains(TRANSFERRED_AT) { + return Err(ProtocolError::DataContractError( + DataContractError::MissingRequiredKey( + "transferred at field is not present".to_string(), + ), + )); + } + // $createdAtBlockHeight if let Some(created_at_block_height) = &self.created_at_block_height { - bitwise_exists_flag |= 4; + bitwise_exists_flag |= 8; time_fields_data_buffer.extend(created_at_block_height.to_be_bytes()); } else if document_type .required_fields() @@ -264,7 +321,7 @@ impl DocumentPlatformSerializationMethodsV0 for DocumentV0 { // $updatedAtBlockHeight if let Some(updated_at_block_height) = &self.updated_at_block_height { - bitwise_exists_flag |= 8; + bitwise_exists_flag |= 16; time_fields_data_buffer.extend(updated_at_block_height.to_be_bytes()); } else if document_type .required_fields() @@ -277,9 +334,24 @@ impl DocumentPlatformSerializationMethodsV0 for DocumentV0 { )); } + // $transferredAtBlockHeight + if let Some(transferred_at_block_height) = &self.transferred_at_block_height { + bitwise_exists_flag |= 32; + time_fields_data_buffer.extend(transferred_at_block_height.to_be_bytes()); + } else if document_type + .required_fields() + .contains(TRANSFERRED_AT_BLOCK_HEIGHT) + { + return Err(ProtocolError::DataContractError( + DataContractError::MissingRequiredKey( + "transferred_at_block_height field is not present".to_string(), + ), + )); + } + // $createdAtCoreBlockHeight if let Some(created_at_core_block_height) = &self.created_at_core_block_height { - bitwise_exists_flag |= 16; + bitwise_exists_flag |= 64; time_fields_data_buffer.extend(created_at_core_block_height.to_be_bytes()); } else if document_type .required_fields() @@ -294,7 +366,7 @@ impl DocumentPlatformSerializationMethodsV0 for DocumentV0 { // $updatedAtCoreBlockHeight if let Some(updated_at_core_block_height) = &self.updated_at_core_block_height { - bitwise_exists_flag |= 32; + bitwise_exists_flag |= 128; time_fields_data_buffer.extend(updated_at_core_block_height.to_be_bytes()); } else if document_type .required_fields() @@ -307,7 +379,22 @@ impl DocumentPlatformSerializationMethodsV0 for DocumentV0 { )); } - buffer.push(bitwise_exists_flag); + // $transferredAtCoreBlockHeight + if let Some(transferred_at_core_block_height) = &self.transferred_at_core_block_height { + bitwise_exists_flag |= 256; + time_fields_data_buffer.extend(transferred_at_core_block_height.to_be_bytes()); + } else if document_type + .required_fields() + .contains(TRANSFERRED_AT_CORE_BLOCK_HEIGHT) + { + return Err(ProtocolError::DataContractError( + DataContractError::MissingRequiredKey( + "transferred_at_core_block_height field is not present".to_string(), + ), + )); + } + + buffer.extend(bitwise_exists_flag.to_be_bytes().as_slice()); buffer.append(&mut time_fields_data_buffer); // User defined properties @@ -404,7 +491,7 @@ impl DocumentPlatformDeserializationMethodsV0 for DocumentV0 { None }; - let timestamp_flags = buf.read_u8().map_err(|_| { + let timestamp_flags = buf.read_u16::().map_err(|_| { DataContractError::CorruptedSerialization( "error reading timestamp flags from serialized document".to_string(), ) @@ -430,7 +517,17 @@ impl DocumentPlatformDeserializationMethodsV0 for DocumentV0 { None }; - let created_at_block_height = if timestamp_flags & 4 > 0 { + let transferred_at = if timestamp_flags & 4 > 0 { + Some(buf.read_u64::().map_err(|_| { + DataContractError::CorruptedSerialization( + "error reading transferred_at timestamp from serialized document".to_string(), + ) + })?) + } else { + None + }; + + let created_at_block_height = if timestamp_flags & 8 > 0 { Some(buf.read_u64::().map_err(|_| { DataContractError::CorruptedSerialization( "error reading created_at_block_height from serialized document".to_string(), @@ -440,7 +537,7 @@ impl DocumentPlatformDeserializationMethodsV0 for DocumentV0 { None }; - let updated_at_block_height = if timestamp_flags & 8 > 0 { + let updated_at_block_height = if timestamp_flags & 16 > 0 { Some(buf.read_u64::().map_err(|_| { DataContractError::CorruptedSerialization( "error reading updated_at_block_height from serialized document".to_string(), @@ -450,7 +547,18 @@ impl DocumentPlatformDeserializationMethodsV0 for DocumentV0 { None }; - let created_at_core_block_height = if timestamp_flags & 16 > 0 { + let transferred_at_block_height = if timestamp_flags & 32 > 0 { + Some(buf.read_u64::().map_err(|_| { + DataContractError::CorruptedSerialization( + "error reading transferred_at_block_height from serialized document" + .to_string(), + ) + })?) + } else { + None + }; + + let created_at_core_block_height = if timestamp_flags & 64 > 0 { Some(buf.read_u32::().map_err(|_| { DataContractError::CorruptedSerialization( "error reading created_at_core_block_height from serialized document" @@ -461,7 +569,18 @@ impl DocumentPlatformDeserializationMethodsV0 for DocumentV0 { None }; - let updated_at_core_block_height = if timestamp_flags & 32 > 0 { + let updated_at_core_block_height = if timestamp_flags & 128 > 0 { + Some(buf.read_u32::().map_err(|_| { + DataContractError::CorruptedSerialization( + "error reading updated_at_core_block_height from serialized document" + .to_string(), + ) + })?) + } else { + None + }; + + let transferred_at_core_block_height = if timestamp_flags & 256 > 0 { Some(buf.read_u32::().map_err(|_| { DataContractError::CorruptedSerialization( "error reading updated_at_core_block_height from serialized document" @@ -508,10 +627,13 @@ impl DocumentPlatformDeserializationMethodsV0 for DocumentV0 { revision, created_at, updated_at, + transferred_at, created_at_block_height, updated_at_block_height, + transferred_at_block_height, created_at_core_block_height, updated_at_core_block_height, + transferred_at_core_block_height, }) } } diff --git a/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs b/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs index 18eed15035..65ad96ade7 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs @@ -15,7 +15,7 @@ use crate::consensus::basic::data_contract::{ InvalidDocumentTypeRequiredSecurityLevelError, InvalidIndexPropertyTypeError, InvalidIndexedPropertyConstraintError, SystemPropertyIndexAlreadyPresentError, UndefinedIndexPropertyError, UniqueIndicesLimitReachedError, UnknownSecurityLevelError, - UnknownStorageKeyRequirementsError, + UnknownStorageKeyRequirementsError, UnknownTransferableTypeError, }; use crate::consensus::basic::decode::{ ProtocolVersionParsingError, SerializedObjectParsingError, VersionError, @@ -90,6 +90,9 @@ pub enum BasicError { #[error(transparent)] UnknownStorageKeyRequirementsError(UnknownStorageKeyRequirementsError), + #[error(transparent)] + UnknownTransferableTypeError(UnknownTransferableTypeError), + #[error(transparent)] SerializedObjectParsingError(SerializedObjectParsingError), diff --git a/packages/rs-dpp/src/errors/consensus/basic/data_contract/mod.rs b/packages/rs-dpp/src/errors/consensus/basic/data_contract/mod.rs index e82ffc305e..30fa795b1f 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/data_contract/mod.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/data_contract/mod.rs @@ -22,6 +22,7 @@ mod undefined_index_property_error; mod unique_indices_limit_reached_error; mod unknown_security_level_error; mod unknown_storage_key_requirements_error; +mod unknown_transferable_type_error; pub use data_contract_empty_schema_error::*; pub use data_contract_have_new_unique_index_error::*; @@ -48,3 +49,4 @@ pub use unique_indices_limit_reached_error::*; pub use invalid_document_type_name_error::*; pub use unknown_security_level_error::*; pub use unknown_storage_key_requirements_error::*; +pub use unknown_transferable_type_error::*; diff --git a/packages/rs-dpp/src/errors/consensus/basic/data_contract/unknown_transferable_type_error.rs b/packages/rs-dpp/src/errors/consensus/basic/data_contract/unknown_transferable_type_error.rs new file mode 100644 index 0000000000..0ed1a89d4c --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/basic/data_contract/unknown_transferable_type_error.rs @@ -0,0 +1,47 @@ +use crate::consensus::basic::BasicError; +use crate::consensus::ConsensusError; +use crate::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error( + "Unrecognized transferable type: allowed {:?}, got {}", + allowed_values, + received +)] +#[platform_serialize(unversioned)] +pub struct UnknownTransferableTypeError { + /* + + DO NOT CHANGE ORDER OF FIELDS WITHOUT INTRODUCING OF NEW VERSION + + */ + allowed_values: Vec, + received: u8, +} + +impl UnknownTransferableTypeError { + pub fn new(allowed_values: Vec, received: u8) -> Self { + Self { + allowed_values, + received, + } + } + + pub fn allowed_values(&self) -> Vec { + self.allowed_values.clone() + } + pub fn received(&self) -> u8 { + self.received + } +} + +impl From for ConsensusError { + fn from(err: UnknownTransferableTypeError) -> Self { + Self::BasicError(BasicError::UnknownTransferableTypeError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/codes.rs b/packages/rs-dpp/src/errors/consensus/codes.rs index f585a5ecdd..07f19201fa 100644 --- a/packages/rs-dpp/src/errors/consensus/codes.rs +++ b/packages/rs-dpp/src/errors/consensus/codes.rs @@ -90,6 +90,7 @@ impl ErrorWithCode for BasicError { Self::ContractError(DataContractError::InvalidURI(_)) => 10240, Self::ContractError(DataContractError::KeyWrongBounds(_)) => 10241, Self::ContractError(DataContractError::KeyValueMustExist(_)) => 10242, + Self::UnknownTransferableTypeError { .. } => 10243, // Document Errors: 10400-10499 Self::DataContractNotPresentError { .. } => 10400, diff --git a/packages/rs-dpp/src/schema/document/v0/documentBase.json b/packages/rs-dpp/src/schema/document/v0/documentBase.json index d745088cd1..a8ee99ae9c 100644 --- a/packages/rs-dpp/src/schema/document/v0/documentBase.json +++ b/packages/rs-dpp/src/schema/document/v0/documentBase.json @@ -41,6 +41,34 @@ "$updatedAt": { "type": "integer", "minimum": 0 + }, + "$transferredAt": { + "type": "integer", + "minimum": 0 + }, + "$createdAtBlockHeight": { + "type": "integer", + "minimum": 0 + }, + "$updatedAtBlockHeight": { + "type": "integer", + "minimum": 0 + }, + "$transferredAtBlockHeight": { + "type": "integer", + "minimum": 0 + }, + "$createdAtCoreBlockHeight": { + "type": "integer", + "minimum": 0 + }, + "$updatedAtCoreBlockHeight": { + "type": "integer", + "minimum": 0 + }, + "$transferredAtCoreBlockHeight": { + "type": "integer", + "minimum": 0 } }, "required": [ diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/action_type.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/action_type.rs index c07846f37b..9052109dca 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/action_type.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/action_type.rs @@ -7,6 +7,7 @@ pub enum DocumentTransitionActionType { Create, //the entropy used Replace, Delete, + Transfer, IgnoreWhileBumpingRevision, } @@ -20,6 +21,7 @@ impl TransitionActionTypeGetter for DocumentTransition { DocumentTransition::Create(_) => DocumentTransitionActionType::Create, DocumentTransition::Delete(_) => DocumentTransitionActionType::Delete, DocumentTransition::Replace(_) => DocumentTransitionActionType::Replace, + DocumentTransition::Transfer(_) => DocumentTransitionActionType::Transfer, } } } @@ -32,6 +34,7 @@ impl TryFrom<&str> for DocumentTransitionActionType { "create" => Ok(DocumentTransitionActionType::Create), "replace" => Ok(DocumentTransitionActionType::Replace), "delete" => Ok(DocumentTransitionActionType::Delete), + "transfer" => Ok(DocumentTransitionActionType::Transfer), action_type => Err(ProtocolError::Generic(format!( "unknown action type {action_type}" ))), diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/mod.rs index 52cc32c665..63e03389fa 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/mod.rs @@ -290,10 +290,13 @@ impl DocumentFromCreateTransitionV0 for Document { revision: document_type.initial_revision(), created_at, updated_at, + transferred_at: None, created_at_block_height, updated_at_block_height, + transferred_at_block_height: None, created_at_core_block_height, updated_at_core_block_height, + transferred_at_core_block_height: None, } .into()), version => Err(ProtocolError::UnknownVersionMismatch { @@ -388,10 +391,13 @@ impl DocumentFromCreateTransitionV0 for Document { revision: document_type.initial_revision(), created_at, updated_at, + transferred_at: None, created_at_block_height, updated_at_block_height, + transferred_at_block_height: None, created_at_core_block_height, updated_at_core_block_height, + transferred_at_core_block_height: None, } .into()), version => Err(ProtocolError::UnknownVersionMismatch { diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/v0/mod.rs index 83c1b4b49b..813ea0b2dd 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/v0/mod.rs @@ -22,92 +22,3 @@ pub struct DocumentDeleteTransitionV0 { #[cfg_attr(feature = "state-transition-serde-conversion", serde(flatten))] pub base: DocumentBaseTransition, } -// -// impl DocumentTransitionObjectLike for DocumentDeleteTransitionV0 { -// #[cfg(feature = "state-transition-json-conversion")] -// fn from_json_object( -// json_value: JsonValue, -// data_contract: DataContract, -// ) -> Result { -// let mut document: DocumentDeleteTransitionV0 = serde_json::from_value(json_value)?; -// document.base.data_contract = data_contract; -// -// Ok(document) -// } -// -// #[cfg(feature = "state-transition-value-conversion")] -// fn from_object( -// raw_transition: Value, -// data_contract: DataContract, -// ) -> Result { -// let base = DocumentBaseTransition::from_object(raw_transition, data_contract)?; -// -// Ok(DocumentDeleteTransitionV0 { base }) -// } -// -// #[cfg(feature = "state-transition-value-conversion")] -// fn from_value_map( -// mut map: BTreeMap, -// data_contract: DataContract, -// ) -> Result -// where -// Self: Sized, -// { -// let base = DocumentBaseTransition::from_value_map_consume(&mut map, data_contract)?; -// -// Ok(DocumentDeleteTransitionV0 { base }) -// } -// -// #[cfg(feature = "state-transition-value-conversion")] -// fn to_object(&self) -> Result { -// self.base.to_object() -// } -// -// #[cfg(feature = "state-transition-value-conversion")] -// fn to_value_map(&self) -> Result, ProtocolError> { -// self.base.to_value_map() -// } -// -// #[cfg(feature = "state-transition-json-conversion")] -// fn to_json(&self) -> Result { -// self.base.to_json() -// } -// -// #[cfg(feature = "state-transition-value-conversion")] -// fn to_cleaned_object(&self) -> Result { -// self.base.to_cleaned_object() -// } -// } -// -// #[cfg(test)] -// mod test { -// use crate::state_transition::documents_batch_transition::document_base_transition::v0::DocumentBaseTransitionV0Methods; -// use super::*; -// -// fn init() { -// let _ = env_logger::builder() -// .filter_level(log::LevelFilter::Debug) -// .try_init(); -// } -// -// #[test] -// fn test_deserialize_serialize_to_json() { -// init(); -// let transition_json = r#"{ -// "$action": 3, -// "$dataContractId": "5wpZAEWndYcTeuwZpkmSa8s49cHXU5q2DhdibesxFSu8", -// "$id": "6oCKUeLVgjr7VZCyn1LdGbrepqKLmoabaff5WQqyTKYP", -// "$type": "note" -// }"#; -// -// let cdt: DocumentDeleteTransitionV0 = -// serde_json::from_str(transition_json).expect("no error"); -// -// assert_eq!(cdt.base.document_type_name(), "note"); -// -// let mut json_no_whitespace = transition_json.to_string(); -// json_no_whitespace.retain(|v| !v.is_whitespace()); -// -// assert_eq!(cdt.to_json().unwrap().to_string(), json_no_whitespace); -// } -// } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/mod.rs index ddfebec72a..8e805318b5 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/mod.rs @@ -55,6 +55,9 @@ pub trait DocumentFromReplaceTransition { created_at: Option, created_at_block_height: Option, created_at_core_block_height: Option, + transferred_at: Option, + transferred_at_block_height: Option, + transferred_at_core_block_height: Option, block_info: &BlockInfo, document_type: &DocumentTypeRef, platform_version: &PlatformVersion, @@ -90,6 +93,9 @@ pub trait DocumentFromReplaceTransition { created_at: Option, created_at_block_height: Option, created_at_core_block_height: Option, + transferred_at: Option, + transferred_at_block_height: Option, + transferred_at_core_block_height: Option, block_info: &BlockInfo, document_type: &DocumentTypeRef, platform_version: &PlatformVersion, @@ -105,6 +111,9 @@ impl DocumentFromReplaceTransition for Document { created_at: Option, created_at_block_height: Option, created_at_core_block_height: Option, + transferred_at: Option, + transferred_at_block_height: Option, + transferred_at_core_block_height: Option, block_info: &BlockInfo, document_type: &DocumentTypeRef, platform_version: &PlatformVersion, @@ -116,6 +125,9 @@ impl DocumentFromReplaceTransition for Document { created_at, created_at_block_height, created_at_core_block_height, + transferred_at, + transferred_at_block_height, + transferred_at_core_block_height, block_info, document_type, platform_version, @@ -129,6 +141,9 @@ impl DocumentFromReplaceTransition for Document { created_at: Option, created_at_block_height: Option, created_at_core_block_height: Option, + transferred_at: Option, + transferred_at_block_height: Option, + transferred_at_core_block_height: Option, block_info: &BlockInfo, document_type: &DocumentTypeRef, platform_version: &PlatformVersion, @@ -140,6 +155,9 @@ impl DocumentFromReplaceTransition for Document { created_at, created_at_block_height, created_at_core_block_height, + transferred_at, + transferred_at_block_height, + transferred_at_core_block_height, block_info, document_type, platform_version, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/mod.rs index 0af9315b29..2c7f96e8e4 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/mod.rs @@ -43,210 +43,6 @@ pub struct DocumentReplaceTransitionV0 { #[cfg_attr(feature = "state-transition-serde-conversion", serde(flatten))] pub data: BTreeMap, } -// -// impl DocumentReplaceTransitionV0 { -// pub(crate) fn to_document_for_dry_run( -// &self, -// owner_id: Identifier, -// ) -> Result { -// let properties = self.data.clone().unwrap_or_default(); -// Ok(Document { -// id: self.base.id, -// owner_id, -// properties, -// created_at: self.updated_at, // we can use the same time, as it can't be worse -// updated_at: self.updated_at, -// revision: Some(self.revision), -// }) -// } -// -// pub(crate) fn to_extended_document_for_dry_run( -// &self, -// owner_id: Identifier, -// platform_version -// ) -> Result { -// Ok(ExtendedDocument { -// feature_version: LATEST_PLATFORM_VERSION -// .extended_document -// .default_current_version, -// document_type_name: self.base.document_type_name.clone(), -// data_contract_id: self.base.data_contract_id, -// document: self.to_document_for_dry_run(owner_id)?, -// data_contract: self.base.data_contract.clone(), -// metadata: None, -// entropy: Bytes32::default(), -// }) -// } -// -// pub(crate) fn replace_document(&self, document: &mut Document) -> Result<(), ProtocolError> { -// let properties = self.data.clone().unwrap_or_default(); -// document.revision = Some(self.revision); -// document.updated_at = self.updated_at; -// document.properties = properties; -// Ok(()) -// } -// -// pub(crate) fn replace_extended_document( -// &self, -// document: &mut ExtendedDocument, -// ) -> Result<(), ProtocolError> { -// let properties = self.data.clone().unwrap_or_default(); -// document.document.revision = Some(self.revision); -// document.document.updated_at = self.updated_at; -// document.document.properties = properties; -// Ok(()) -// } -// -// pub(crate) fn patch_document(self, document: &mut Document) -> Result<(), ProtocolError> { -// let properties = self.data.clone().unwrap_or_default(); -// document.revision = Some(self.revision); -// document.updated_at = self.updated_at; -// document.properties.extend(properties); -// Ok(()) -// } -// -// pub(crate) fn patch_extended_document( -// self, -// document: &mut ExtendedDocument, -// ) -> Result<(), ProtocolError> { -// let properties = self.data.clone().unwrap_or_default(); -// document.document.revision = Some(self.revision); -// document.document.updated_at = self.updated_at; -// document.document.properties.extend(properties); -// Ok(()) -// } -// } -// -// impl DocumentTransitionObjectLike for DocumentReplaceTransitionV0 { -// #[cfg(feature = "state-transition-json-conversion")] -// fn from_json_object( -// json_value: JsonValue, -// data_contract: DataContract, -// ) -> Result { -// let value: Value = json_value.into(); -// let mut map = value -// .into_btree_string_map() -// .map_err(ProtocolError::ValueError)?; -// -// let document_type = map.get_str("$type")?; -// -// let (identifiers_paths, binary_paths): (Vec<_>, Vec<_>) = -// data_contract.get_identifiers_and_binary_paths_owned(document_type)?; -// -// map.replace_at_paths(binary_paths.into_iter(), ReplacementType::BinaryBytes)?; -// -// map.replace_at_paths( -// identifiers_paths -// .into_iter() -// .chain(IDENTIFIER_FIELDS.iter().map(|a| a.to_string())), -// ReplacementType::Identifier, -// )?; -// let document = Self::from_value_map(map, data_contract)?; -// -// Ok(document) -// } -// -// fn from_object( -// raw_transition: Value, -// data_contract: DataContract, -// ) -> Result { -// let map = raw_transition -// .into_btree_string_map() -// .map_err(ProtocolError::ValueError)?; -// Self::from_value_map(map, data_contract) -// } -// -// fn from_value_map( -// mut map: BTreeMap, -// data_contract: DataContract, -// ) -> Result -// where -// Self: Sized, -// { -// Ok(DocumentReplaceTransitionV0 { -// base: DocumentBaseTransition::from_value_map_consume(&mut map, data_contract)?, -// revision: map -// .remove_integer(property_names::REVISION) -// .map_err(ProtocolError::ValueError)?, -// updated_at: map -// .remove_optional_integer(property_names::UPDATED_AT) -// .map_err(ProtocolError::ValueError)?, -// data: Some(map), -// }) -// } -// -// fn to_object(&self) -> Result { -// Ok(self.to_value_map()?.into()) -// } -// -// fn to_value_map(&self) -> Result, ProtocolError> { -// let mut transition_base_map = self.base.to_value_map()?; -// transition_base_map.insert( -// property_names::REVISION.to_string(), -// Value::U64(self.revision), -// ); -// if let Some(updated_at) = self.updated_at { -// transition_base_map.insert( -// property_names::UPDATED_AT.to_string(), -// Value::U64(updated_at), -// ); -// } -// if let Some(properties) = self.data.clone() { -// transition_base_map.extend(properties) -// } -// Ok(transition_base_map) -// } -// -// fn to_json(&self) -> Result { -// self.to_cleaned_object()? -// .try_into() -// .map_err(ProtocolError::ValueError) -// } -// -// fn to_cleaned_object(&self) -> Result { -// Ok(self.to_value_map()?.into()) -// } -// } -// -// #[cfg(test)] -// mod test { -// use crate::state_transition::documents_batch_transition::document_base_transition::v0::DocumentBaseTransitionV0Methods; -// use super::*; -// -// fn init() { -// let _ = env_logger::builder() -// .filter_level(log::LevelFilter::Debug) -// .try_init(); -// } -// -// #[test] -// fn test_deserialize_serialize_to_json() { -// init(); -// let transition_json = r#"{ -// "$action": 1, -// "$dataContractId": "5wpZAEWndYcTeuwZpkmSa8s49cHXU5q2DhdibesxFSu8", -// "$id": "6oCKUeLVgjr7VZCyn1LdGbrepqKLmoabaff5WQqyTKYP", -// "$revision" : 1, -// "$type": "note", -// "message": "example_message_replace" -// }"#; -// -// let cdt: DocumentReplaceTransitionV0 = -// serde_json::from_str(transition_json).expect("no error"); -// -// assert_eq!(cdt.base.document_type_name(), "note"); -// assert_eq!(cdt.revision, 1); -// assert_eq!( -// cdt.data.as_ref().unwrap().get_str("message").unwrap(), -// "example_message_replace" -// ); -// -// let mut json_no_whitespace = transition_json.to_string(); -// json_no_whitespace.retain(|v| !v.is_whitespace()); -// -// assert_eq!(cdt.to_json().unwrap().to_string(), json_no_whitespace); -// } -// } /// document from replace transition v0 pub trait DocumentFromReplaceTransitionV0 { @@ -276,6 +72,9 @@ pub trait DocumentFromReplaceTransitionV0 { created_at: Option, created_at_block_height: Option, created_at_core_block_height: Option, + transferred_at: Option, + transferred_at_block_height: Option, + transferred_at_core_block_height: Option, block_info: &BlockInfo, document_type: &DocumentTypeRef, platform_version: &PlatformVersion, @@ -308,6 +107,9 @@ pub trait DocumentFromReplaceTransitionV0 { created_at: Option, created_at_block_height: Option, created_at_core_block_height: Option, + transferred_at: Option, + transferred_at_block_height: Option, + transferred_at_core_block_height: Option, block_info: &BlockInfo, document_type: &DocumentTypeRef, platform_version: &PlatformVersion, @@ -323,6 +125,9 @@ impl DocumentFromReplaceTransitionV0 for Document { created_at: Option, created_at_block_height: Option, created_at_core_block_height: Option, + transferred_at: Option, + transferred_at_block_height: Option, + transferred_at_core_block_height: Option, block_info: &BlockInfo, document_type: &DocumentTypeRef, platform_version: &PlatformVersion, @@ -377,10 +182,13 @@ impl DocumentFromReplaceTransitionV0 for Document { revision: Some(*revision), created_at, updated_at, + transferred_at, created_at_block_height, updated_at_block_height, + transferred_at_block_height, created_at_core_block_height, updated_at_core_block_height, + transferred_at_core_block_height, } .into()), version => Err(ProtocolError::UnknownVersionMismatch { @@ -397,6 +205,9 @@ impl DocumentFromReplaceTransitionV0 for Document { created_at: Option, created_at_block_height: Option, created_at_core_block_height: Option, + transferred_at: Option, + transferred_at_block_height: Option, + transferred_at_core_block_height: Option, block_info: &BlockInfo, document_type: &DocumentTypeRef, platform_version: &PlatformVersion, @@ -450,10 +261,13 @@ impl DocumentFromReplaceTransitionV0 for Document { revision: Some(revision), created_at, updated_at, + transferred_at, created_at_block_height, updated_at_block_height, + transferred_at_block_height, created_at_core_block_height, updated_at_core_block_height, + transferred_at_core_block_height, } .into()), version => Err(ProtocolError::UnknownVersionMismatch { diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/from_document.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/from_document.rs new file mode 100644 index 0000000000..abfbf806df --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/from_document.rs @@ -0,0 +1,43 @@ +use platform_value::Identifier; +use platform_version::version::{FeatureVersion, PlatformVersion}; +use crate::data_contract::document_type::{DocumentTypeRef}; +use crate::document::{Document}; +use crate::prelude::IdentityNonce; +use crate::ProtocolError; +use crate::state_transition::documents_batch_transition::document_transition::document_transfer_transition::{DocumentTransferTransition, DocumentTransferTransitionV0}; + +impl DocumentTransferTransition { + pub fn from_document( + document: Document, + document_type: DocumentTypeRef, + identity_contract_nonce: IdentityNonce, + recipient_owner_id: Identifier, + platform_version: &PlatformVersion, + feature_version: Option, + base_feature_version: Option, + ) -> Result { + match feature_version.unwrap_or( + platform_version + .dpp + .state_transition_serialization_versions + .document_transfer_state_transition + .bounds + .default_current_version, + ) { + 0 => Ok(DocumentTransferTransitionV0::from_document( + document, + document_type, + identity_contract_nonce, + recipient_owner_id, + platform_version, + base_feature_version, + )? + .into()), + version => Err(ProtocolError::UnknownVersionMismatch { + method: "DocumentTransferTransition::from_document".to_string(), + known_versions: vec![0], + received: version, + }), + } + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/mod.rs new file mode 100644 index 0000000000..e2185f76b0 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/mod.rs @@ -0,0 +1,19 @@ +mod from_document; +pub mod v0; +pub mod v0_methods; + +use bincode::{Decode, Encode}; +use derive_more::{Display, From}; +#[cfg(feature = "state-transition-serde-conversion")] +use serde::{Deserialize, Serialize}; +pub use v0::*; + +#[derive(Debug, Clone, Encode, Decode, PartialEq, Display, From)] +#[cfg_attr( + feature = "state-transition-serde-conversion", + derive(Serialize, Deserialize) +)] +pub enum DocumentTransferTransition { + #[display(fmt = "V0({})", "_0")] + V0(DocumentTransferTransitionV0), +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0/from_document.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0/from_document.rs new file mode 100644 index 0000000000..77a4d59c6d --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0/from_document.rs @@ -0,0 +1,36 @@ +use platform_value::Identifier; +use platform_version::version::{FeatureVersion, PlatformVersion}; +use crate::data_contract::document_type::{DocumentTypeRef}; +use crate::document::{Document, DocumentV0Getters}; +use crate::document::errors::DocumentError; +use crate::prelude::IdentityNonce; +use crate::ProtocolError; +use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; +use crate::state_transition::documents_batch_transition::document_transition::document_transfer_transition::DocumentTransferTransitionV0; + +impl DocumentTransferTransitionV0 { + pub(crate) fn from_document( + document: Document, + document_type: DocumentTypeRef, + identity_contract_nonce: IdentityNonce, + recipient_owner_id: Identifier, + platform_version: &PlatformVersion, + base_feature_version: Option, + ) -> Result { + Ok(DocumentTransferTransitionV0 { + base: DocumentBaseTransition::from_document( + &document, + document_type, + identity_contract_nonce, + platform_version, + base_feature_version, + )?, + revision: document.revision().ok_or_else(|| { + ProtocolError::Document(Box::new(DocumentError::DocumentNoRevisionError { + document: Box::new(document.clone()), + })) + })?, + recipient_owner_id, + }) + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0/mod.rs new file mode 100644 index 0000000000..c51f80cdb7 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0/mod.rs @@ -0,0 +1,46 @@ +mod from_document; +pub mod v0_methods; + +use crate::prelude::Revision; +use bincode::{Decode, Encode}; +use derive_more::Display; + +use platform_value::Identifier; +#[cfg(feature = "state-transition-serde-conversion")] +use serde::{Deserialize, Serialize}; + +pub use super::super::document_base_transition::IDENTIFIER_FIELDS; +use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; + +mod property_names { + pub const REVISION: &str = "$revision"; + + pub const RECIPIENT_OWNER_ID: &str = "recipientOwnerId"; +} + +#[derive(Debug, Clone, Default, Encode, Decode, PartialEq, Display)] +#[cfg_attr( + feature = "state-transition-serde-conversion", + derive(Serialize, Deserialize), + serde(rename_all = "camelCase") +)] +#[display( + fmt = "Base: {}, Revision: {}, Recipient: {:?}", + "base", + "revision", + "recipient_owner_id" +)] +pub struct DocumentTransferTransitionV0 { + #[cfg_attr(feature = "state-transition-serde-conversion", serde(flatten))] + pub base: DocumentBaseTransition, + #[cfg_attr( + feature = "state-transition-serde-conversion", + serde(rename = "$revision") + )] + pub revision: Revision, + #[cfg_attr( + feature = "state-transition-serde-conversion", + serde(rename = "recipientOwnerId") + )] + pub recipient_owner_id: Identifier, +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0/v0_methods.rs new file mode 100644 index 0000000000..6e4b833115 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0/v0_methods.rs @@ -0,0 +1,66 @@ +use platform_value::Identifier; + +use crate::prelude::Revision; + +use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; + +use crate::state_transition::documents_batch_transition::document_transition::document_transfer_transition::DocumentTransferTransitionV0; + +pub trait DocumentTransferTransitionV0Methods { + /// Returns a reference to the `base` field of the `DocumentReplaceTransitionV0`. + fn base(&self) -> &DocumentBaseTransition; + /// Returns a mut reference to the `base` field of the `DocumentReplaceTransitionV0`. + fn base_mut(&mut self) -> &mut DocumentBaseTransition; + + /// Sets the value of the `base` field in the `DocumentReplaceTransitionV0`. + fn set_base(&mut self, base: DocumentBaseTransition); + + /// Returns a reference to the `revision` field of the `DocumentReplaceTransitionV0`. + fn revision(&self) -> Revision; + + /// Sets the value of the `revision` field in the `DocumentReplaceTransitionV0`. + fn set_revision(&mut self, revision: Revision); + + /// Returns the `recipient_owner_id` field of the `DocumentReplaceTransitionV0`. + fn recipient_owner_id(&self) -> Identifier; + + /// Returns a reference to the `recipient_owner_id` field of the `DocumentReplaceTransitionV0`. + fn recipient_owner_id_ref(&self) -> &Identifier; + + /// Sets the value of the `recipient_owner_id` field in the `DocumentReplaceTransitionV0`. + fn set_recipient_owner_id(&mut self, recipient_owner_id: Identifier); +} + +impl DocumentTransferTransitionV0Methods for DocumentTransferTransitionV0 { + fn base(&self) -> &DocumentBaseTransition { + &self.base + } + + fn base_mut(&mut self) -> &mut DocumentBaseTransition { + &mut self.base + } + + fn set_base(&mut self, base: DocumentBaseTransition) { + self.base = base; + } + + fn revision(&self) -> Revision { + self.revision + } + + fn set_revision(&mut self, revision: Revision) { + self.revision = revision; + } + + fn recipient_owner_id(&self) -> Identifier { + self.recipient_owner_id + } + + fn recipient_owner_id_ref(&self) -> &Identifier { + &self.recipient_owner_id + } + + fn set_recipient_owner_id(&mut self, recipient_owner_id: Identifier) { + self.recipient_owner_id = recipient_owner_id; + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0_methods.rs new file mode 100644 index 0000000000..adeff540c0 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0_methods.rs @@ -0,0 +1,55 @@ +use platform_value::Identifier; +use crate::prelude::Revision; +use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; +use crate::state_transition::documents_batch_transition::document_transition::document_transfer_transition::v0::v0_methods::DocumentTransferTransitionV0Methods; +use crate::state_transition::documents_batch_transition::document_transition::DocumentTransferTransition; + +impl DocumentTransferTransitionV0Methods for DocumentTransferTransition { + fn base(&self) -> &DocumentBaseTransition { + match self { + DocumentTransferTransition::V0(v0) => &v0.base, + } + } + + fn base_mut(&mut self) -> &mut DocumentBaseTransition { + match self { + DocumentTransferTransition::V0(v0) => &mut v0.base, + } + } + + fn set_base(&mut self, base: DocumentBaseTransition) { + match self { + DocumentTransferTransition::V0(v0) => v0.base = base, + } + } + + fn revision(&self) -> Revision { + match self { + DocumentTransferTransition::V0(v0) => v0.revision, + } + } + + fn set_revision(&mut self, revision: Revision) { + match self { + DocumentTransferTransition::V0(v0) => v0.revision = revision, + } + } + + fn recipient_owner_id(&self) -> Identifier { + match self { + DocumentTransferTransition::V0(v0) => v0.recipient_owner_id, + } + } + + fn recipient_owner_id_ref(&self) -> &Identifier { + match self { + DocumentTransferTransition::V0(v0) => &v0.recipient_owner_id, + } + } + + fn set_recipient_owner_id(&mut self, recipient_owner_id: Identifier) { + match self { + DocumentTransferTransition::V0(v0) => v0.recipient_owner_id = recipient_owner_id, + } + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/mod.rs index 8eb647444d..9ff8246a8e 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/mod.rs @@ -13,6 +13,7 @@ pub mod document_base_transition; pub mod document_create_transition; pub mod document_delete_transition; pub mod document_replace_transition; +pub mod document_transfer_transition; use crate::prelude::Revision; use crate::state_transition::documents_batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; @@ -20,11 +21,13 @@ use derive_more::Display; pub use document_create_transition::DocumentCreateTransition; pub use document_delete_transition::DocumentDeleteTransition; pub use document_replace_transition::DocumentReplaceTransition; +pub use document_transfer_transition::DocumentTransferTransition; use platform_value::Value; use crate::state_transition::state_transitions::document::documents_batch_transition::document_transition::document_create_transition::v0::v0_methods::DocumentCreateTransitionV0Methods; use crate::state_transition::state_transitions::document::documents_batch_transition::document_transition::document_replace_transition::v0::v0_methods::DocumentReplaceTransitionV0Methods; use crate::state_transition::state_transitions::document::documents_batch_transition::document_transition::document_delete_transition::v0::v0_methods::DocumentDeleteTransitionV0Methods; +use crate::state_transition::state_transitions::document::documents_batch_transition::document_transition::document_transfer_transition::v0::v0_methods::DocumentTransferTransitionV0Methods; pub const PROPERTY_ACTION: &str = "$action"; @@ -75,115 +78,10 @@ pub enum DocumentTransition { #[display(fmt = "DeleteDocumentTransition({})", "_0")] Delete(DocumentDeleteTransition), -} -// -// impl AsRef for DocumentTransition { -// fn as_ref(&self) -> &Self { -// self -// } -// } -// -// macro_rules! call_method { -// ($state_transition:expr, $method:ident, $args:tt ) => { -// match $state_transition { -// DocumentTransition::Create(st) => st.$method($args), -// DocumentTransition::Replace(st) => st.$method($args), -// DocumentTransition::Delete(st) => st.$method($args), -// } -// }; -// ($state_transition:expr, $method:ident ) => { -// match $state_transition { -// DocumentTransition::Create(st) => st.$method(), -// DocumentTransition::Replace(st) => st.$method(), -// DocumentTransition::Delete(st) => st.$method(), -// } -// }; -// } -// -// impl DocumentTransitionObjectLike for DocumentTransition { -// #[cfg(feature = "state-transition-json-conversion")] -// fn from_json_object( -// json_value: JsonValue, -// data_contract: DataContract, -// ) -> Result -// where -// Self: Sized, -// { -// let action: Action = TryFrom::try_from(json_value.get_u64(PROPERTY_ACTION)? as u8) -// .context("invalid document transition action")?; -// -// Ok(match action { -// Action::Create => DocumentTransition::Create( -// DocumentCreateTransition::from_json_object(json_value, data_contract)?, -// ), -// Action::Replace => DocumentTransition::Replace( -// DocumentReplaceTransitionV0::from_json_object(json_value, data_contract)?, -// ), -// Action::Delete => DocumentTransition::Delete( -// DocumentDeleteTransition::from_json_object(json_value, data_contract)?, -// ), -// }) -// } -// -// #[cfg(feature = "state-transition-value-conversion")] -// fn from_object( -// raw_transition: Value, -// data_contract: DataContract, -// ) -> Result -// where -// Self: Sized, -// { -// let map = raw_transition -// .into_btree_string_map() -// .map_err(ProtocolError::ValueError)?; -// Self::from_value_map(map, data_contract) -// } -// -// #[cfg(feature = "state-transition-json-conversion")] -// fn to_json(&self) -> Result { -// call_method!(self, to_json) -// } -// -// #[cfg(feature = "state-transition-value-conversion")] -// fn to_value_map(&self) -> Result, ProtocolError> { -// call_method!(self, to_value_map) -// } -// -// #[cfg(feature = "state-transition-value-conversion")] -// fn to_object(&self) -> Result { -// call_method!(self, to_object) -// } -// -// #[cfg(feature = "state-transition-value-conversion")] -// fn to_cleaned_object(&self) -> Result { -// call_method!(self, to_cleaned_object) -// } -// -// #[cfg(feature = "state-transition-value-conversion")] -// fn from_value_map( -// map: BTreeMap, -// data_contract: DataContract, -// ) -> Result -// where -// Self: Sized, -// { -// let action: Action = map.get_integer::(PROPERTY_ACTION)?.try_into()?; -// Ok(match action { -// Action::Create => DocumentTransition::Create(DocumentCreateTransition::from_value_map( -// map, -// data_contract, -// )?), -// Action::Replace => DocumentTransition::Replace( -// DocumentReplaceTransitionV0::from_value_map(map, data_contract)?, -// ), -// Action::Delete => DocumentTransition::Delete(DocumentDeleteTransition::from_value_map( -// map, -// data_contract, -// )?), -// }) -// } -// } + #[display(fmt = "TransferDocumentTransition({})", "_0")] + Transfer(DocumentTransferTransition), +} impl DocumentTransition { pub fn as_transition_create(&self) -> Option<&DocumentCreateTransition> { @@ -216,6 +114,7 @@ impl DocumentTransitionV0Methods for DocumentTransition { DocumentTransition::Create(t) => t.base(), DocumentTransition::Replace(t) => t.base(), DocumentTransition::Delete(t) => t.base(), + DocumentTransition::Transfer(t) => t.base(), } } @@ -224,6 +123,7 @@ impl DocumentTransitionV0Methods for DocumentTransition { DocumentTransition::Create(t) => t.data().get(path), DocumentTransition::Replace(t) => t.data().get(path), DocumentTransition::Delete(_) => None, + DocumentTransition::Transfer(_) => None, } } @@ -244,6 +144,7 @@ impl DocumentTransitionV0Methods for DocumentTransition { DocumentTransition::Create(t) => Some(t.data()), DocumentTransition::Replace(t) => Some(t.data()), DocumentTransition::Delete(_) => None, + DocumentTransition::Transfer(_) => None, } } @@ -252,6 +153,7 @@ impl DocumentTransitionV0Methods for DocumentTransition { DocumentTransition::Create(_) => Some(1), DocumentTransition::Replace(t) => Some(t.revision()), DocumentTransition::Delete(_) => None, + DocumentTransition::Transfer(t) => Some(t.revision()), } } @@ -260,6 +162,7 @@ impl DocumentTransitionV0Methods for DocumentTransition { DocumentTransition::Create(t) => t.base().identity_contract_nonce(), DocumentTransition::Replace(t) => t.base().identity_contract_nonce(), DocumentTransition::Delete(t) => t.base().identity_contract_nonce(), + DocumentTransition::Transfer(t) => t.base().identity_contract_nonce(), } } @@ -277,6 +180,7 @@ impl DocumentTransitionV0Methods for DocumentTransition { .insert(property_name, value); } DocumentTransition::Delete(_) => {} + DocumentTransition::Transfer(_) => {} } } @@ -289,6 +193,7 @@ impl DocumentTransitionV0Methods for DocumentTransition { DocumentTransition::Create(t) => t.base_mut(), DocumentTransition::Replace(t) => t.base_mut(), DocumentTransition::Delete(t) => t.base_mut(), + DocumentTransition::Transfer(t) => t.base_mut(), } } @@ -297,6 +202,7 @@ impl DocumentTransitionV0Methods for DocumentTransition { DocumentTransition::Create(t) => Some(t.data_mut()), DocumentTransition::Replace(t) => Some(t.data_mut()), DocumentTransition::Delete(_) => None, + DocumentTransition::Transfer(_) => None, } } @@ -305,6 +211,7 @@ impl DocumentTransitionV0Methods for DocumentTransition { DocumentTransition::Create(_) => {} DocumentTransition::Replace(ref mut t) => t.set_revision(revision), DocumentTransition::Delete(_) => {} + DocumentTransition::Transfer(_) => {} } } @@ -313,6 +220,7 @@ impl DocumentTransitionV0Methods for DocumentTransition { DocumentTransition::Create(t) => t.base_mut().set_identity_contract_nonce(nonce), DocumentTransition::Replace(t) => t.base_mut().set_identity_contract_nonce(nonce), DocumentTransition::Delete(t) => t.base_mut().set_identity_contract_nonce(nonce), + DocumentTransition::Transfer(t) => t.base_mut().set_identity_contract_nonce(nonce), } } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs index 9871d087af..27ae53c2a0 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs @@ -19,6 +19,8 @@ use crate::state_transition::StateTransition; #[cfg(feature = "state-transition-signing")] use crate::ProtocolError; #[cfg(feature = "state-transition-signing")] +use platform_value::Identifier; +#[cfg(feature = "state-transition-signing")] use platform_version::version::{FeatureVersion, PlatformVersion}; pub mod v0; @@ -125,4 +127,93 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransition { }), } } + + #[cfg(feature = "state-transition-signing")] + fn new_document_transfer_transition_from_document( + document: Document, + document_type: DocumentTypeRef, + recipient_owner_id: Identifier, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + batch_feature_version: Option, + update_feature_version: Option, + base_feature_version: Option, + ) -> Result { + match batch_feature_version.unwrap_or( + platform_version + .dpp + .state_transition_serialization_versions + .documents_batch_state_transition + .default_current_version, + ) { + 0 => Ok( + DocumentsBatchTransitionV0::new_document_transfer_transition_from_document( + document, + document_type, + recipient_owner_id, + identity_public_key, + identity_contract_nonce, + user_fee_increase, + signer, + platform_version, + batch_feature_version, + update_feature_version, + base_feature_version, + )?, + ), + version => Err(ProtocolError::UnknownVersionMismatch { + method: + "DocumentsBatchTransition::new_document_replacement_transition_from_document" + .to_string(), + known_versions: vec![0], + received: version, + }), + } + } + + #[cfg(feature = "state-transition-signing")] + fn new_document_deletion_transition_from_document( + document: Document, + document_type: DocumentTypeRef, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + batch_feature_version: Option, + delete_feature_version: Option, + base_feature_version: Option, + ) -> Result { + match batch_feature_version.unwrap_or( + platform_version + .dpp + .state_transition_serialization_versions + .documents_batch_state_transition + .default_current_version, + ) { + 0 => Ok( + DocumentsBatchTransitionV0::new_document_deletion_transition_from_document( + document, + document_type, + identity_public_key, + identity_contract_nonce, + user_fee_increase, + signer, + platform_version, + batch_feature_version, + delete_feature_version, + base_feature_version, + )?, + ), + version => Err(ProtocolError::UnknownVersionMismatch { + method: "DocumentsBatchTransition::new_document_deletion_transition_from_document" + .to_string(), + known_versions: vec![0], + received: version, + }), + } + } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/v0/mod.rs index dd366eb112..8c48bce89c 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/v0/mod.rs @@ -53,6 +53,35 @@ pub trait DocumentsBatchTransitionMethodsV0: DocumentsBatchTransitionAccessorsV0 base_feature_version: Option, ) -> Result; + #[cfg(feature = "state-transition-signing")] + fn new_document_deletion_transition_from_document( + document: Document, + document_type: DocumentTypeRef, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + _batch_feature_version: Option, + delete_feature_version: Option, + base_feature_version: Option, + ) -> Result; + + #[cfg(feature = "state-transition-signing")] + fn new_document_transfer_transition_from_document( + document: Document, + document_type: DocumentTypeRef, + recipient_owner_id: Identifier, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + _batch_feature_version: Option, + delete_feature_version: Option, + base_feature_version: Option, + ) -> Result; + fn contract_based_security_level_requirement( &self, get_data_contract_security_level_requirement: impl Fn( diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs index e561f10c81..3029f033e4 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs @@ -15,19 +15,25 @@ use crate::state_transition::documents_batch_transition::accessors::DocumentsBat #[cfg(feature = "state-transition-signing")] use crate::state_transition::documents_batch_transition::document_create_transition::DocumentCreateTransition; #[cfg(feature = "state-transition-signing")] -use crate::state_transition::documents_batch_transition::document_transition::DocumentReplaceTransition; +use crate::state_transition::documents_batch_transition::document_transition::{ + DocumentReplaceTransition, DocumentTransferTransition, +}; use crate::state_transition::documents_batch_transition::document_transition::{ DocumentTransition, DocumentTransitionV0Methods, }; use crate::state_transition::documents_batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; -#[cfg(feature = "state-transition-signing")] -use crate::state_transition::documents_batch_transition::DocumentsBatchTransition; use crate::state_transition::documents_batch_transition::DocumentsBatchTransitionV0; #[cfg(feature = "state-transition-signing")] +use crate::state_transition::documents_batch_transition::{ + DocumentDeleteTransition, DocumentsBatchTransition, +}; +#[cfg(feature = "state-transition-signing")] use crate::state_transition::StateTransition; #[cfg(feature = "state-transition-signing")] use crate::ProtocolError; #[cfg(feature = "state-transition-signing")] +use platform_value::Identifier; +#[cfg(feature = "state-transition-signing")] use platform_version::version::{FeatureVersion, PlatformVersion}; impl DocumentsBatchTransitionAccessorsV0 for DocumentsBatchTransitionV0 { @@ -121,6 +127,86 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransitionV0 { Ok(state_transition) } + #[cfg(feature = "state-transition-signing")] + fn new_document_transfer_transition_from_document( + document: Document, + document_type: DocumentTypeRef, + recipient_owner_id: Identifier, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + _batch_feature_version: Option, + delete_feature_version: Option, + base_feature_version: Option, + ) -> Result { + let owner_id = document.owner_id(); + let transfer_transition = DocumentTransferTransition::from_document( + document, + document_type, + identity_contract_nonce, + recipient_owner_id, + platform_version, + delete_feature_version, + base_feature_version, + )?; + let documents_batch_transition: DocumentsBatchTransition = DocumentsBatchTransitionV0 { + owner_id, + transitions: vec![transfer_transition.into()], + user_fee_increase, + signature_public_key_id: 0, + signature: Default::default(), + } + .into(); + let mut state_transition: StateTransition = documents_batch_transition.into(); + state_transition.sign_external( + identity_public_key, + signer, + Some(|_, _| Ok(SecurityLevel::HIGH)), + )?; + Ok(state_transition) + } + + #[cfg(feature = "state-transition-signing")] + fn new_document_deletion_transition_from_document( + document: Document, + document_type: DocumentTypeRef, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + _batch_feature_version: Option, + delete_feature_version: Option, + base_feature_version: Option, + ) -> Result { + let owner_id = document.owner_id(); + let delete_transition = DocumentDeleteTransition::from_document( + document, + document_type, + identity_contract_nonce, + platform_version, + delete_feature_version, + base_feature_version, + )?; + let documents_batch_transition: DocumentsBatchTransition = DocumentsBatchTransitionV0 { + owner_id, + transitions: vec![delete_transition.into()], + user_fee_increase, + signature_public_key_id: 0, + signature: Default::default(), + } + .into(); + let mut state_transition: StateTransition = documents_batch_transition.into(); + state_transition.sign_external( + identity_public_key, + signer, + Some(|_, _| Ok(SecurityLevel::HIGH)), + )?; + Ok(state_transition) + } + fn set_transitions(&mut self, transitions: Vec) { self.transitions = transitions; } diff --git a/packages/rs-dpp/src/tests/json_document.rs b/packages/rs-dpp/src/tests/json_document.rs index 75addad411..3f6fb11a30 100644 --- a/packages/rs-dpp/src/tests/json_document.rs +++ b/packages/rs-dpp/src/tests/json_document.rs @@ -140,10 +140,14 @@ pub fn json_document_to_document( revision: data.remove_optional_integer("$revision")?, created_at: data.remove_optional_integer("$createdAt")?, updated_at: data.remove_optional_integer("$updatedAt")?, + transferred_at: data.remove_optional_integer("$transferredAt")?, created_at_block_height: data.remove_optional_integer("$createdAtBlockHeight")?, updated_at_block_height: data.remove_optional_integer("$updatedAtBlockHeight")?, + transferred_at_block_height: data.remove_optional_integer("$transferredAtBlockHeight")?, created_at_core_block_height: data.remove_optional_integer("$createdAtCoreBlockHeight")?, updated_at_core_block_height: data.remove_optional_integer("$updatedAtCoreBlockHeight")?, + transferred_at_core_block_height: data + .remove_optional_integer("$transferredAtCoreBlockHeight")?, }; data.replace_at_paths( diff --git a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs index abc802ffef..1bd5aff521 100644 --- a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs @@ -434,7 +434,7 @@ mod tests { ) .expect("expected to process state transition"); - assert_eq!(processing_result.aggregated_fees().processing_fee, 2970480); + assert_eq!(processing_result.aggregated_fees().processing_fee, 2978520); let check_result = platform .check_tx( @@ -625,7 +625,7 @@ mod tests { // We have one invalid paid for state transition assert_eq!(processing_result.invalid_paid_count(), 1); - assert_eq!(processing_result.aggregated_fees().processing_fee, 909500); + assert_eq!(processing_result.aggregated_fees().processing_fee, 909510); let check_result = platform .check_tx( @@ -767,7 +767,7 @@ mod tests { // since a fee multiplier of 100 means 100% more of 1 (gives 2) assert_eq!( processing_result.aggregated_fees().processing_fee, - 2970480 * 2 + 2978520 * 2 ); let check_result = platform @@ -1005,7 +1005,7 @@ mod tests { ) .expect("expected to process state transition"); - assert_eq!(processing_result.aggregated_fees().processing_fee, 2970480); + assert_eq!(processing_result.aggregated_fees().processing_fee, 2978520); platform .drive @@ -1089,7 +1089,7 @@ mod tests { assert_eq!( update_processing_result.aggregated_fees().processing_fee, - 7066460 + 7098500 ); let check_result = platform @@ -1201,7 +1201,7 @@ mod tests { ) .expect("expected to process state transition"); - assert_eq!(processing_result.aggregated_fees().processing_fee, 2970480); + assert_eq!(processing_result.aggregated_fees().processing_fee, 2978520); platform .drive @@ -1320,7 +1320,7 @@ mod tests { // We have one invalid paid for state transition assert_eq!(processing_result.invalid_paid_count(), 1); - assert_eq!(processing_result.aggregated_fees().processing_fee, 1231110); + assert_eq!(processing_result.aggregated_fees().processing_fee, 1231120); let check_result = platform .check_tx( diff --git a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs index 0bbbd8ace8..20a540e4f3 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs @@ -256,10 +256,13 @@ impl Platform { revision: None, created_at: None, updated_at: None, + transferred_at: None, created_at_block_height: None, updated_at_block_height: None, + transferred_at_block_height: None, created_at_core_block_height: None, updated_at_core_block_height: None, + transferred_at_core_block_height: None, } .into(); @@ -314,8 +317,8 @@ mod tests { assert_eq!( root_hash, [ - 145, 134, 225, 227, 181, 246, 225, 73, 216, 216, 249, 73, 21, 213, 116, 110, - 85, 106, 80, 222, 95, 167, 97, 242, 69, 142, 176, 211, 89, 182, 162, 67 + 123, 106, 97, 8, 95, 223, 24, 44, 147, 229, 106, 103, 31, 32, 29, 97, 198, 204, + 237, 215, 138, 194, 34, 107, 129, 234, 97, 250, 155, 104, 75, 210 ] ) } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_delete_transition_action/structure_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_delete_transition_action/structure_v0/mod.rs index ed3222d459..d0891ffe9b 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_delete_transition_action/structure_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_delete_transition_action/structure_v0/mod.rs @@ -1,5 +1,10 @@ +use dpp::consensus::basic::document::{InvalidDocumentTransitionActionError, InvalidDocumentTypeError}; +use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::validation::SimpleConsensusValidationResult; +use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; use drive::state_transition_action::document::documents_batch::document_transition::document_delete_transition_action::DocumentDeleteTransitionAction; +use drive::state_transition_action::document::documents_batch::document_transition::document_delete_transition_action::v0::DocumentDeleteTransitionActionAccessorsV0; use crate::error::Error; @@ -8,6 +13,29 @@ pub(super) trait DocumentDeleteTransitionActionStructureValidationV0 { } impl DocumentDeleteTransitionActionStructureValidationV0 for DocumentDeleteTransitionAction { fn validate_structure_v0(&self) -> Result { - Ok(SimpleConsensusValidationResult::new()) + let contract_fetch_info = self.base().data_contract_fetch_info(); + let data_contract = &contract_fetch_info.contract; + let document_type_name = self.base().document_type_name(); + + // Make sure that the document type is defined in the contract + let Some(document_type) = data_contract.document_type_optional_for_name(document_type_name) + else { + return Ok(SimpleConsensusValidationResult::new_with_error( + InvalidDocumentTypeError::new(document_type_name.clone(), data_contract.id()) + .into(), + )); + }; + + if !document_type.documents_mutable() { + Ok(SimpleConsensusValidationResult::new_with_error( + InvalidDocumentTransitionActionError::new(format!( + "{} is not mutable and can not be deleted", + document_type_name + )) + .into(), + )) + } else { + Ok(SimpleConsensusValidationResult::new()) + } } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/structure_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/structure_v0/mod.rs index 92807f5bdc..06555e8d89 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/structure_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/structure_v0/mod.rs @@ -1,5 +1,6 @@ -use dpp::consensus::basic::document::InvalidDocumentTypeError; +use dpp::consensus::basic::document::{InvalidDocumentTransitionActionError, InvalidDocumentTypeError}; use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::data_contract::validation::DataContractValidationMethodsV0; use dpp::validation::SimpleConsensusValidationResult; use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; @@ -23,14 +24,22 @@ impl DocumentReplaceTransitionActionStructureValidationV0 for DocumentReplaceTra let document_type_name = self.base().document_type_name(); // Make sure that the document type is defined in the contract - if data_contract - .document_type_optional_for_name(document_type_name) - .is_none() - { + let Some(document_type) = data_contract.document_type_optional_for_name(document_type_name) + else { return Ok(SimpleConsensusValidationResult::new_with_error( InvalidDocumentTypeError::new(document_type_name.clone(), data_contract.id()) .into(), )); + }; + + if !document_type.documents_mutable() { + return Ok(SimpleConsensusValidationResult::new_with_error( + InvalidDocumentTransitionActionError::new(format!( + "{} is not mutable and can not be replaced", + document_type_name + )) + .into(), + )); } // Validate user defined properties diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/mod.rs new file mode 100644 index 0000000000..376932cb42 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/mod.rs @@ -0,0 +1,87 @@ +use dpp::block::epoch::Epoch; +use dpp::identifier::Identifier; + +use dpp::validation::SimpleConsensusValidationResult; +use drive::state_transition_action::document::documents_batch::document_transition::document_transfer_transition_action::DocumentTransferTransitionAction; +use dpp::version::PlatformVersion; +use drive::grovedb::TransactionArg; +use crate::error::Error; +use crate::error::execution::ExecutionError; +use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; +use crate::execution::validation::state_transition::documents_batch::action_validation::document_transfer_transition_action::state_v0::DocumentTransferTransitionActionStateValidationV0; +use crate::execution::validation::state_transition::documents_batch::action_validation::document_transfer_transition_action::structure_v0::DocumentTransferTransitionActionStructureValidationV0; +use crate::platform_types::platform::PlatformStateRef; + +mod state_v0; +mod structure_v0; + +pub trait DocumentTransferTransitionActionValidation { + fn validate_structure( + &self, + platform_version: &PlatformVersion, + ) -> Result; + + fn validate_state( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + epoch: &Epoch, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result; +} + +impl DocumentTransferTransitionActionValidation for DocumentTransferTransitionAction { + fn validate_structure( + &self, + platform_version: &PlatformVersion, + ) -> Result { + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .documents_batch_state_transition + .document_transfer_transition_structure_validation + { + 0 => self.validate_structure_v0(platform_version), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "DocumentTransferTransitionAction::validate_structure".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + fn validate_state( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + epoch: &Epoch, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result { + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .documents_batch_state_transition + .document_transfer_transition_state_validation + { + 0 => self.validate_state_v0( + platform, + owner_id, + epoch, + execution_context, + transaction, + platform_version, + ), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "DocumentTransferTransitionAction::validate_state".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/state_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/state_v0/mod.rs new file mode 100644 index 0000000000..2eaada0c4f --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/state_v0/mod.rs @@ -0,0 +1,66 @@ +use dpp::block::epoch::Epoch; +use dpp::consensus::basic::document::InvalidDocumentTypeError; +use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::identifier::Identifier; +use dpp::validation::SimpleConsensusValidationResult; +use drive::state_transition_action::document::documents_batch::document_transition::document_transfer_transition_action::{DocumentTransferTransitionAction, DocumentTransferTransitionActionAccessorsV0}; +use dpp::version::PlatformVersion; +use drive::grovedb::TransactionArg; +use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use crate::error::Error; +use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; +use crate::platform_types::platform::PlatformStateRef; + +pub(super) trait DocumentTransferTransitionActionStateValidationV0 { + fn validate_state_v0( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + epoch: &Epoch, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result; +} +impl DocumentTransferTransitionActionStateValidationV0 for DocumentTransferTransitionAction { + fn validate_state_v0( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + _epoch: &Epoch, + _execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result { + let contract_fetch_info = self.base().data_contract_fetch_info(); + + let contract = &contract_fetch_info.contract; + + let document_type_name = self.base().document_type_name(); + + let Some(document_type) = contract.document_type_optional_for_name(document_type_name) + else { + return Ok(SimpleConsensusValidationResult::new_with_error( + InvalidDocumentTypeError::new(document_type_name.clone(), contract.id()).into(), + )); + }; + + // There is no need to verify that the document already existed, since this is done when + // transforming into an action + + // The rest of state validation is actually happening in documents batch transition transformer + // TODO: Think more about this architecture + + platform + .drive + .validate_document_transfer_transition_action_uniqueness( + contract, + document_type, + self, + owner_id, + transaction, + platform_version, + ) + .map_err(Error::Drive) + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/structure_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/structure_v0/mod.rs new file mode 100644 index 0000000000..3910574a61 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/structure_v0/mod.rs @@ -0,0 +1,46 @@ +use dpp::consensus::basic::document::{InvalidDocumentTransitionActionError, InvalidDocumentTypeError}; +use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; +use dpp::validation::SimpleConsensusValidationResult; +use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use drive::state_transition_action::document::documents_batch::document_transition::document_transfer_transition_action::{DocumentTransferTransitionAction, DocumentTransferTransitionActionAccessorsV0}; +use dpp::version::PlatformVersion; +use crate::error::Error; + +pub(super) trait DocumentTransferTransitionActionStructureValidationV0 { + fn validate_structure_v0( + &self, + platform_version: &PlatformVersion, + ) -> Result; +} +impl DocumentTransferTransitionActionStructureValidationV0 for DocumentTransferTransitionAction { + fn validate_structure_v0( + &self, + _platform_version: &PlatformVersion, + ) -> Result { + let contract_fetch_info = self.base().data_contract_fetch_info(); + let data_contract = &contract_fetch_info.contract; + let document_type_name = self.base().document_type_name(); + + // Make sure that the document type is defined in the contract + let Some(document_type) = data_contract.document_type_optional_for_name(document_type_name) + else { + return Ok(SimpleConsensusValidationResult::new_with_error( + InvalidDocumentTypeError::new(document_type_name.clone(), data_contract.id()) + .into(), + )); + }; + + if !document_type.documents_transferable().is_transferable() { + Ok(SimpleConsensusValidationResult::new_with_error( + InvalidDocumentTransitionActionError::new(format!( + "{} is not a transferable document type", + document_type_name + )) + .into(), + )) + } else { + Ok(SimpleConsensusValidationResult::default()) + } + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/mod.rs index 5689698caa..152a761298 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/mod.rs @@ -1,3 +1,4 @@ pub(crate) mod document_create_transition_action; pub(crate) mod document_delete_transition_action; pub(crate) mod document_replace_transition_action; +pub(crate) mod document_transfer_transition_action; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/v0/mod.rs index 94bb7a799b..1e0163bfd4 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/v0/mod.rs @@ -28,6 +28,7 @@ use drive::state_transition_action::system::bump_identity_data_contract_nonce_ac use crate::error::execution::ExecutionError; use crate::execution::types::execution_operation::ValidationOperation; use crate::execution::types::state_transition_execution_context::{StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0}; +use crate::execution::validation::state_transition::documents_batch::action_validation::document_transfer_transition_action::DocumentTransferTransitionActionValidation; pub(in crate::execution::validation::state_transition::state_transitions::documents_batch) trait DocumentsBatchStateTransitionStructureValidationV0 { @@ -132,7 +133,7 @@ impl DocumentsBatchStateTransitionStructureValidationV0 for DocumentsBatchTransi let result = replace_action.validate_structure(platform_version)?; if !result.is_valid() { let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( - BumpIdentityDataContractNonceAction::from_borrowed_document_base_transition_action(transition.base().expect("there is always a base for the create action"), self.owner_id(), self.user_fee_increase()), + BumpIdentityDataContractNonceAction::from_borrowed_document_base_transition_action(transition.base().expect("there is always a base for the replace action"), self.owner_id(), self.user_fee_increase()), ); return Ok(ConsensusValidationResult::new_with_data_and_errors( @@ -145,7 +146,20 @@ impl DocumentsBatchStateTransitionStructureValidationV0 for DocumentsBatchTransi let result = delete_action.validate_structure(platform_version)?; if !result.is_valid() { let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( - BumpIdentityDataContractNonceAction::from_borrowed_document_base_transition_action(transition.base().expect("there is always a base for the create action"), self.owner_id(), self.user_fee_increase()), + BumpIdentityDataContractNonceAction::from_borrowed_document_base_transition_action(transition.base().expect("there is always a base for the delete action"), self.owner_id(), self.user_fee_increase()), + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + result.errors, + )); + } + } + DocumentTransitionAction::TransferAction(transfer_action) => { + let result = transfer_action.validate_structure(platform_version)?; + if !result.is_valid() { + let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( + BumpIdentityDataContractNonceAction::from_borrowed_document_base_transition_action(transition.base().expect("there is always a base for the transfer action"), self.owner_id(), self.user_fee_increase()), ); return Ok(ConsensusValidationResult::new_with_data_and_errors( diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs index d09cd9e175..ca11a668b6 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs @@ -231,3 +231,1785 @@ impl StateTransitionStateValidationV0 for DocumentsBatchTransition { } } } + +#[cfg(test)] +mod tests { + use crate::rpc::core::MockCoreRPCLike; + use crate::test::helpers::setup::{TempPlatform, TestPlatformBuilder}; + use dpp::block::block_info::BlockInfo; + use dpp::data_contract::accessors::v0::DataContractV0Getters; + use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; + use dpp::data_contract::document_type::random_document::{ + CreateRandomDocument, DocumentFieldFillSize, DocumentFieldFillType, + }; + use dpp::document::document_methods::DocumentMethodsV0; + use dpp::document::transfer::Transferable; + use dpp::document::DocumentV0Setters; + use dpp::identity::accessors::IdentityGettersV0; + use dpp::identity::{Identity, IdentityPublicKey, IdentityV0}; + use dpp::platform_value::{Bytes32, Value}; + use dpp::prelude::Identifier; + use dpp::serialization::PlatformSerializable; + use dpp::state_transition::documents_batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; + use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; + use drive::drive::document::query::QueryDocumentsOutcomeV0Methods; + use drive::query::DriveQuery; + use platform_version::version::PlatformVersion; + use rand::prelude::StdRng; + use rand::SeedableRng; + use simple_signer::signer::SimpleSigner; + use std::collections::BTreeMap; + + fn setup_identity( + platform: &mut TempPlatform, + seed: u64, + ) -> (Identity, SimpleSigner, IdentityPublicKey) { + let platform_version = PlatformVersion::latest(); + let mut signer = SimpleSigner::default(); + + let mut rng = StdRng::seed_from_u64(seed); + + let (master_key, master_private_key) = + IdentityPublicKey::random_ecdsa_master_authentication_key_with_rng( + 0, + &mut rng, + platform_version, + ) + .expect("expected to get key pair"); + + signer.add_key(master_key.clone(), master_private_key.clone()); + + let (critical_public_key, private_key) = + IdentityPublicKey::random_ecdsa_critical_level_authentication_key_with_rng( + 1, + &mut rng, + platform_version, + ) + .expect("expected to get key pair"); + + signer.add_key(critical_public_key.clone(), private_key.clone()); + + let identity: Identity = IdentityV0 { + id: Identifier::random_with_rng(&mut rng), + public_keys: BTreeMap::from([ + (0, master_key.clone()), + (1, critical_public_key.clone()), + ]), + balance: 10000000000, + revision: 0, + } + .into(); + + // We just add this identity to the system first + + platform + .drive + .add_new_identity( + identity.clone(), + false, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to add a new identity"); + + (identity, signer, critical_public_key) + } + + #[test] + fn test_document_replace_on_document_type_that_is_mutable() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(433); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = setup_identity(&mut platform, 958); + + let dashpay = platform.drive.cache.system_data_contracts.load_dashpay(); + let dashpay_contract = dashpay.clone(); + + let profile = dashpay_contract + .document_type_for_name("profile") + .expect("expected a profile document type"); + + assert!(profile.documents_mutable()); + + let entropy = Bytes32::random_with_rng(&mut rng); + + let mut document = profile + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set("avatarUrl", "http://test.com/bob.jpg".into()); + + let mut altered_document = document.clone(); + + altered_document.increment_revision().unwrap(); + altered_document.set("displayName", "Samuel".into()); + altered_document.set("avatarUrl", "http://test.com/cat.jpg".into()); + + let documents_batch_create_transition = + DocumentsBatchTransition::new_document_creation_transition_from_document( + document, + profile, + entropy.0, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition = documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.valid_count(), 1); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let documents_batch_update_transition = + DocumentsBatchTransition::new_document_replacement_transition_from_document( + altered_document, + profile, + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_update_serialized_transition = documents_batch_update_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_update_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.invalid_paid_count(), 0); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 1); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 5074230); + } + + #[test] + fn test_document_replace_on_document_type_that_is_not_mutable() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(437); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = setup_identity(&mut platform, 958); + + let (other_identity, ..) = setup_identity(&mut platform, 495); + + let dashpay = platform.drive.cache.system_data_contracts.load_dashpay(); + let dashpay_contract = dashpay.clone(); + + let contact_request_document_type = dashpay_contract + .document_type_for_name("contactRequest") + .expect("expected a profile document type"); + + assert!(!contact_request_document_type.documents_mutable()); + + let entropy = Bytes32::random_with_rng(&mut rng); + + let mut document = contact_request_document_type + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set( + "toUserId", + Value::Identifier(other_identity.id().to_buffer()), + ); + document.set("recipientKeyIndex", Value::U32(1)); + document.set("senderKeyIndex", Value::U32(1)); + document.set("accountReference", Value::U32(0)); + document.set("coreHeightCreatedAt", Value::U32(5)); + + let mut altered_document = document.clone(); + + altered_document.set_revision(Some(1)); + altered_document.set("senderKeyIndex", Value::U32(2)); + + let documents_batch_create_transition = + DocumentsBatchTransition::new_document_creation_transition_from_document( + document, + contact_request_document_type, + entropy.0, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition = documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.valid_count(), 1); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let documents_batch_update_transition = + DocumentsBatchTransition::new_document_replacement_transition_from_document( + altered_document, + contact_request_document_type, + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_update_serialized_transition = documents_batch_update_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_update_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.invalid_paid_count(), 1); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 0); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 102690); + } + + #[test] + fn test_document_replace_on_document_type_that_is_not_mutable_but_is_transferable() { + let platform_version = PlatformVersion::latest(); + let (mut platform, contract) = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure() + .with_crypto_card_game(Transferable::Always); + + let mut rng = StdRng::seed_from_u64(435); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = setup_identity(&mut platform, 958); + + let (receiver, _, _) = setup_identity(&mut platform, 452); + + let card_document_type = contract + .document_type_for_name("card") + .expect("expected a profile document type"); + + let entropy = Bytes32::random_with_rng(&mut rng); + + let mut document = card_document_type + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::DoNotFillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set("attack", 4.into()); + document.set("defense", 7.into()); + + let documents_batch_create_transition = + DocumentsBatchTransition::new_document_creation_transition_from_document( + document.clone(), + card_document_type, + entropy.0, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition = documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.valid_count(), 1); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let sender_documents_sql_string = + format!("select * from card where $ownerId == '{}'", identity.id()); + + let query_sender_identity_documents = DriveQuery::from_sql_expr( + sender_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); + + let receiver_documents_sql_string = + format!("select * from card where $ownerId == '{}'", receiver.id()); + + let query_receiver_identity_documents = DriveQuery::from_sql_expr( + receiver_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); + + let query_sender_results = platform + .drive + .query_documents( + query_sender_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + let query_receiver_results = platform + .drive + .query_documents( + query_receiver_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + // We expect the sender to have 1 document, and the receiver to have none + assert_eq!(query_sender_results.documents().len(), 1); + + assert_eq!(query_receiver_results.documents().len(), 0); + + document.set_revision(Some(2)); + + document.set("attack", 6.into()); + document.set("defense", 0.into()); + + let documents_batch_transfer_transition = + DocumentsBatchTransition::new_document_replacement_transition_from_document( + document, + card_document_type, + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition for transfer"); + + let documents_batch_transfer_serialized_transition = documents_batch_transfer_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_transfer_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.invalid_paid_count(), 1); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 0); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 1253950); + + let query_sender_results = platform + .drive + .query_documents(query_sender_identity_documents, None, false, None, None) + .expect("expected query result"); + + let query_receiver_results = platform + .drive + .query_documents(query_receiver_identity_documents, None, false, None, None) + .expect("expected query result"); + + // We expect the sender to still have their document, and the receiver to have none + assert_eq!(query_sender_results.documents().len(), 1); + + assert_eq!(query_receiver_results.documents().len(), 0); + } + + #[test] + fn test_document_replace_that_does_not_yet_exist() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(433); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = setup_identity(&mut platform, 958); + + let dashpay = platform.drive.cache.system_data_contracts.load_dashpay(); + let dashpay_contract = dashpay.clone(); + + let profile = dashpay_contract + .document_type_for_name("profile") + .expect("expected a profile document type"); + + let entropy = Bytes32::random_with_rng(&mut rng); + + let mut document = profile + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set("avatarUrl", "http://test.com/bob.jpg".into()); + + let mut altered_document = document.clone(); + + altered_document.increment_revision().unwrap(); + altered_document.set("displayName", "Samuel".into()); + altered_document.set("avatarUrl", "http://test.com/cat.jpg".into()); + + let documents_batch_update_transition = + DocumentsBatchTransition::new_document_replacement_transition_from_document( + altered_document, + profile, + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_update_serialized_transition = documents_batch_update_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_update_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.invalid_paid_count(), 1); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 0); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 1244470); + } + + #[test] + fn test_document_delete_on_document_type_that_is_mutable() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(433); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = setup_identity(&mut platform, 958); + + let dashpay = platform.drive.cache.system_data_contracts.load_dashpay(); + let dashpay_contract = dashpay.clone(); + + let profile = dashpay_contract + .document_type_for_name("profile") + .expect("expected a profile document type"); + + assert!(profile.documents_mutable()); + + let entropy = Bytes32::random_with_rng(&mut rng); + + let mut document = profile + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set("avatarUrl", "http://test.com/bob.jpg".into()); + + let mut altered_document = document.clone(); + + altered_document.increment_revision().unwrap(); + altered_document.set("displayName", "Samuel".into()); + altered_document.set("avatarUrl", "http://test.com/cat.jpg".into()); + + let documents_batch_create_transition = + DocumentsBatchTransition::new_document_creation_transition_from_document( + document, + profile, + entropy.0, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition = documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.valid_count(), 1); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let documents_batch_deletion_transition = + DocumentsBatchTransition::new_document_deletion_transition_from_document( + altered_document, + profile, + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_update_serialized_transition = documents_batch_deletion_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_update_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.invalid_paid_count(), 0); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 1); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 5588830); + } + + #[test] + fn test_document_delete_on_document_type_that_is_not_mutable() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(437); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = setup_identity(&mut platform, 958); + + let (other_identity, ..) = setup_identity(&mut platform, 495); + + let dashpay = platform.drive.cache.system_data_contracts.load_dashpay(); + let dashpay_contract = dashpay.clone(); + + let contact_request_document_type = dashpay_contract + .document_type_for_name("contactRequest") + .expect("expected a profile document type"); + + assert!(!contact_request_document_type.documents_mutable()); + + let entropy = Bytes32::random_with_rng(&mut rng); + + let mut document = contact_request_document_type + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set( + "toUserId", + Value::Identifier(other_identity.id().to_buffer()), + ); + document.set("recipientKeyIndex", Value::U32(1)); + document.set("senderKeyIndex", Value::U32(1)); + document.set("accountReference", Value::U32(0)); + document.set("coreHeightCreatedAt", Value::U32(5)); + + let mut altered_document = document.clone(); + + altered_document.set_revision(Some(1)); + altered_document.set("senderKeyIndex", Value::U32(2)); + + let documents_batch_create_transition = + DocumentsBatchTransition::new_document_creation_transition_from_document( + document, + contact_request_document_type, + entropy.0, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition = documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.valid_count(), 1); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let documents_batch_deletion_transition = + DocumentsBatchTransition::new_document_deletion_transition_from_document( + altered_document, + contact_request_document_type, + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_deletion_serialized_transition = documents_batch_deletion_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_deletion_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.invalid_paid_count(), 1); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 0); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 1507670); + } + + #[test] + fn test_document_delete_that_does_not_yet_exist() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(433); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = setup_identity(&mut platform, 958); + + let dashpay = platform.drive.cache.system_data_contracts.load_dashpay(); + let dashpay_contract = dashpay.clone(); + + let profile = dashpay_contract + .document_type_for_name("profile") + .expect("expected a profile document type"); + + let entropy = Bytes32::random_with_rng(&mut rng); + + let mut document = profile + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set("avatarUrl", "http://test.com/bob.jpg".into()); + + let mut altered_document = document.clone(); + + altered_document.increment_revision().unwrap(); + altered_document.set("displayName", "Samuel".into()); + altered_document.set("avatarUrl", "http://test.com/cat.jpg".into()); + + let documents_batch_delete_transition = + DocumentsBatchTransition::new_document_deletion_transition_from_document( + altered_document, + profile, + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_delete_serialized_transition = documents_batch_delete_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_delete_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.invalid_paid_count(), 1); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 0); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 1244470); + } + + #[test] + fn test_document_transfer_on_document_type_that_is_transferable() { + let platform_version = PlatformVersion::latest(); + let (mut platform, contract) = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure() + .with_crypto_card_game(Transferable::Always); + + let mut rng = StdRng::seed_from_u64(433); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = setup_identity(&mut platform, 958); + + let (receiver, _, _) = setup_identity(&mut platform, 450); + + let card_document_type = contract + .document_type_for_name("card") + .expect("expected a profile document type"); + + assert!(!card_document_type.documents_mutable()); + + let entropy = Bytes32::random_with_rng(&mut rng); + + let mut document = card_document_type + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::DoNotFillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set("attack", 4.into()); + document.set("defense", 7.into()); + + let documents_batch_create_transition = + DocumentsBatchTransition::new_document_creation_transition_from_document( + document.clone(), + card_document_type, + entropy.0, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition = documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.valid_count(), 1); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let sender_documents_sql_string = + format!("select * from card where $ownerId == '{}'", identity.id()); + + let query_sender_identity_documents = DriveQuery::from_sql_expr( + sender_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); + + let receiver_documents_sql_string = + format!("select * from card where $ownerId == '{}'", receiver.id()); + + let query_receiver_identity_documents = DriveQuery::from_sql_expr( + receiver_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); + + let query_sender_results = platform + .drive + .query_documents( + query_sender_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + let query_receiver_results = platform + .drive + .query_documents( + query_receiver_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + // We expect the sender to have 1 document, and the receiver to have none + assert_eq!(query_sender_results.documents().len(), 1); + + assert_eq!(query_receiver_results.documents().len(), 0); + + document.set_revision(Some(2)); + + let documents_batch_transfer_transition = + DocumentsBatchTransition::new_document_transfer_transition_from_document( + document, + card_document_type, + receiver.id(), + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition for transfer"); + + let documents_batch_transfer_serialized_transition = documents_batch_transfer_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_transfer_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.invalid_paid_count(), 0); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 1); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 9350380); + + let query_sender_results = platform + .drive + .query_documents(query_sender_identity_documents, None, false, None, None) + .expect("expected query result"); + + let query_receiver_results = platform + .drive + .query_documents(query_receiver_identity_documents, None, false, None, None) + .expect("expected query result"); + + // We expect the sender to have no documents, and the receiver to have 1 + assert_eq!(query_sender_results.documents().len(), 0); + + assert_eq!(query_receiver_results.documents().len(), 1); + } + + #[test] + fn test_document_transfer_on_document_type_that_is_not_transferable() { + let platform_version = PlatformVersion::latest(); + let (mut platform, contract) = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure() + .with_crypto_card_game(Transferable::Never); + + let mut rng = StdRng::seed_from_u64(435); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = setup_identity(&mut platform, 958); + + let (receiver, _, _) = setup_identity(&mut platform, 452); + + let card_document_type = contract + .document_type_for_name("card") + .expect("expected a profile document type"); + + let entropy = Bytes32::random_with_rng(&mut rng); + + let mut document = card_document_type + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::DoNotFillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set("attack", 4.into()); + document.set("defense", 7.into()); + + let documents_batch_create_transition = + DocumentsBatchTransition::new_document_creation_transition_from_document( + document.clone(), + card_document_type, + entropy.0, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition = documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.valid_count(), 1); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let sender_documents_sql_string = + format!("select * from card where $ownerId == '{}'", identity.id()); + + let query_sender_identity_documents = DriveQuery::from_sql_expr( + sender_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); + + let receiver_documents_sql_string = + format!("select * from card where $ownerId == '{}'", receiver.id()); + + let query_receiver_identity_documents = DriveQuery::from_sql_expr( + receiver_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); + + let query_sender_results = platform + .drive + .query_documents( + query_sender_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + let query_receiver_results = platform + .drive + .query_documents( + query_receiver_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + // We expect the sender to have 1 document, and the receiver to have none + assert_eq!(query_sender_results.documents().len(), 1); + + assert_eq!(query_receiver_results.documents().len(), 0); + + document.set_revision(Some(2)); + + let documents_batch_transfer_transition = + DocumentsBatchTransition::new_document_transfer_transition_from_document( + document, + card_document_type, + receiver.id(), + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition for transfer"); + + let documents_batch_transfer_serialized_transition = documents_batch_transfer_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_transfer_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.invalid_paid_count(), 1); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 0); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 1253950); + + let query_sender_results = platform + .drive + .query_documents(query_sender_identity_documents, None, false, None, None) + .expect("expected query result"); + + let query_receiver_results = platform + .drive + .query_documents(query_receiver_identity_documents, None, false, None, None) + .expect("expected query result"); + + // We expect the sender to still have their document, and the receiver to have none + assert_eq!(query_sender_results.documents().len(), 1); + + assert_eq!(query_receiver_results.documents().len(), 0); + } + + #[test] + fn test_document_transfer_that_does_not_yet_exist() { + let platform_version = PlatformVersion::latest(); + let (mut platform, contract) = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure() + .with_crypto_card_game(Transferable::Never); + + let mut rng = StdRng::seed_from_u64(435); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = setup_identity(&mut platform, 958); + + let (receiver, _, _) = setup_identity(&mut platform, 452); + + let card_document_type = contract + .document_type_for_name("card") + .expect("expected a profile document type"); + + let entropy = Bytes32::random_with_rng(&mut rng); + + let mut document = card_document_type + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::DoNotFillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set("attack", 4.into()); + document.set("defense", 7.into()); + + let sender_documents_sql_string = + format!("select * from card where $ownerId == '{}'", identity.id()); + + let query_sender_identity_documents = DriveQuery::from_sql_expr( + sender_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); + + let receiver_documents_sql_string = + format!("select * from card where $ownerId == '{}'", receiver.id()); + + let query_receiver_identity_documents = DriveQuery::from_sql_expr( + receiver_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); + + let query_sender_results = platform + .drive + .query_documents( + query_sender_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + let query_receiver_results = platform + .drive + .query_documents( + query_receiver_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + // We expect the sender to have 0 documents, and the receiver to also have none + assert_eq!(query_sender_results.documents().len(), 0); + + assert_eq!(query_receiver_results.documents().len(), 0); + + document.set_revision(Some(2)); + + let documents_batch_transfer_transition = + DocumentsBatchTransition::new_document_transfer_transition_from_document( + document, + card_document_type, + receiver.id(), + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition for transfer"); + + let documents_batch_transfer_serialized_transition = documents_batch_transfer_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_transfer_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.invalid_paid_count(), 1); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 0); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 25090); + + let query_sender_results = platform + .drive + .query_documents(query_sender_identity_documents, None, false, None, None) + .expect("expected query result"); + + let query_receiver_results = platform + .drive + .query_documents(query_receiver_identity_documents, None, false, None, None) + .expect("expected query result"); + + // We expect the sender to still have no document, and the receiver to have none as well + assert_eq!(query_sender_results.documents().len(), 0); + + assert_eq!(query_receiver_results.documents().len(), 0); + } + + #[test] + fn test_document_delete_after_transfer() { + let platform_version = PlatformVersion::latest(); + let (mut platform, contract) = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure() + .with_crypto_card_game(Transferable::Always); + + let mut rng = StdRng::seed_from_u64(433); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = setup_identity(&mut platform, 958); + + let (receiver, recipient_signer, recipient_key) = setup_identity(&mut platform, 450); + + let card_document_type = contract + .document_type_for_name("card") + .expect("expected a profile document type"); + + assert!(!card_document_type.documents_mutable()); + + let entropy = Bytes32::random_with_rng(&mut rng); + + let mut document = card_document_type + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::DoNotFillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set("attack", 4.into()); + document.set("defense", 7.into()); + + let documents_batch_create_transition = + DocumentsBatchTransition::new_document_creation_transition_from_document( + document.clone(), + card_document_type, + entropy.0, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition = documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.valid_count(), 1); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let sender_documents_sql_string = + format!("select * from card where $ownerId == '{}'", identity.id()); + + let query_sender_identity_documents = DriveQuery::from_sql_expr( + sender_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); + + let receiver_documents_sql_string = + format!("select * from card where $ownerId == '{}'", receiver.id()); + + let query_receiver_identity_documents = DriveQuery::from_sql_expr( + receiver_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); + + let query_sender_results = platform + .drive + .query_documents( + query_sender_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + let query_receiver_results = platform + .drive + .query_documents( + query_receiver_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + // We expect the sender to have 1 document, and the receiver to have none + assert_eq!(query_sender_results.documents().len(), 1); + + assert_eq!(query_receiver_results.documents().len(), 0); + + document.set_revision(Some(2)); + + let documents_batch_transfer_transition = + DocumentsBatchTransition::new_document_transfer_transition_from_document( + document.clone(), + card_document_type, + receiver.id(), + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition for transfer"); + + let documents_batch_transfer_serialized_transition = documents_batch_transfer_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_transfer_serialized_transition.clone()], + &platform_state, + &BlockInfo::default_with_time(50000000), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.invalid_paid_count(), 0); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 1); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 10277100); + + let query_sender_results = platform + .drive + .query_documents(query_sender_identity_documents, None, false, None, None) + .expect("expected query result"); + + let query_receiver_results = platform + .drive + .query_documents(query_receiver_identity_documents, None, false, None, None) + .expect("expected query result"); + + // We expect the sender to have no documents, and the receiver to have 1 + assert_eq!(query_sender_results.documents().len(), 0); + + assert_eq!(query_receiver_results.documents().len(), 1); + + // Now let's try to delete the transferred document + + document.set_owner_id(receiver.id()); + + let documents_batch_deletion_transition = + DocumentsBatchTransition::new_document_deletion_transition_from_document( + document, + card_document_type, + &recipient_key, + 2, + 0, + &recipient_signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_deletion_serialized_transition = documents_batch_deletion_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_deletion_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.invalid_paid_count(), 1); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 0); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 1107610); + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs index bb08be2e98..d65b089289 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs @@ -17,6 +17,7 @@ use crate::execution::types::state_transition_execution_context::StateTransition use crate::execution::validation::state_transition::documents_batch::action_validation::document_create_transition_action::DocumentCreateTransitionActionValidation; use crate::execution::validation::state_transition::documents_batch::action_validation::document_delete_transition_action::DocumentDeleteTransitionActionValidation; use crate::execution::validation::state_transition::documents_batch::action_validation::document_replace_transition_action::DocumentReplaceTransitionActionValidation; +use crate::execution::validation::state_transition::documents_batch::action_validation::document_transfer_transition_action::DocumentTransferTransitionActionValidation; use crate::execution::validation::state_transition::documents_batch::data_triggers::{data_trigger_bindings_list, DataTriggerExecutionContext, DataTriggerExecutor}; use crate::platform_types::platform::{PlatformStateRef}; use crate::execution::validation::state_transition::state_transitions::documents_batch::transformer::v0::DocumentsBatchTransitionTransformerV0; @@ -92,6 +93,15 @@ impl DocumentsBatchStateTransitionStateValidationV0 for DocumentsBatchTransition transaction, platform_version, )?, + DocumentTransitionAction::TransferAction(transfer_action) => transfer_action + .validate_state( + platform, + owner_id, + epoch, + execution_context, + transaction, + platform_version, + )?, DocumentTransitionAction::DeleteAction(delete_action) => delete_action .validate_state( platform, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs index 64f5d94939..07ae9b5e7e 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs @@ -16,13 +16,14 @@ use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::block::block_info::BlockInfo; use dpp::document::{Document, DocumentV0Getters}; +use dpp::prelude::Revision; use dpp::validation::SimpleConsensusValidationResult; use dpp::{consensus::ConsensusError, prelude::Identifier, validation::ConsensusValidationResult}; use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; use dpp::state_transition::documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; use dpp::state_transition::documents_batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; -use dpp::state_transition::documents_batch_transition::document_transition::{DocumentTransition, DocumentReplaceTransition, DocumentTransitionV0Methods}; +use dpp::state_transition::documents_batch_transition::document_transition::{DocumentTransition, DocumentTransitionV0Methods}; use dpp::state_transition::StateTransitionLike; use drive::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::DocumentCreateTransitionAction; use drive::state_transition_action::document::documents_batch::document_transition::document_delete_transition_action::DocumentDeleteTransitionAction; @@ -36,7 +37,10 @@ use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; use dpp::state_transition::documents_batch_transition::document_transition::document_replace_transition::v0::v0_methods::DocumentReplaceTransitionV0Methods; +use dpp::state_transition::documents_batch_transition::document_transition::document_transfer_transition::v0::v0_methods::DocumentTransferTransitionV0Methods; use drive::drive::contract::DataContractFetchInfo; +use drive::state_transition_action::document::documents_batch::document_transition::document_transfer_transition_action::DocumentTransferTransitionAction; +use drive::state_transition_action::system::bump_identity_data_contract_nonce_action::BumpIdentityDataContractNonceAction; use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; pub(in crate::execution::validation::state_transition::state_transitions::documents_batch) trait DocumentsBatchTransitionTransformerV0 @@ -89,12 +93,13 @@ trait DocumentsBatchTransitionInternalTransformerV0 { fetched_documents: &'a [Document], ) -> ConsensusValidationResult<&'a Document>; fn check_ownership_of_old_replaced_document_v0( - document_transition: &DocumentReplaceTransition, + document_id: Identifier, fetched_document: &Document, owner_id: &Identifier, ) -> SimpleConsensusValidationResult; fn check_revision_is_bumped_by_one_during_replace_v0( - document_transition: &DocumentReplaceTransition, + transition_revision: Revision, + document_id: Identifier, original_document: &Document, ) -> SimpleConsensusValidationResult; } @@ -159,15 +164,17 @@ impl DocumentsBatchTransitionTransformerV0 for DocumentsBatchTransition { .collect::>>, Error>>()?; let validation_result = ConsensusValidationResult::flatten(validation_result); - if validation_result.is_valid() { + if validation_result.has_data() { + let (transitions, errors) = validation_result.into_data_and_errors()?; let batch_transition_action = DocumentsBatchTransitionActionV0 { owner_id, - transitions: validation_result.into_data()?, + transitions, user_fee_increase, } .into(); - Ok(ConsensusValidationResult::new_with_data( + Ok(ConsensusValidationResult::new_with_data_and_errors( batch_transition_action, + errors, )) } else { Ok(ConsensusValidationResult::new_with_errors( @@ -261,15 +268,20 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition )); }; - let replace_transitions = document_transitions + let replace_and_transfer_transitions = document_transitions .iter() - .filter(|transition| matches!(transition, DocumentTransition::Replace(_))) + .filter(|transition| { + matches!( + transition, + DocumentTransition::Replace(_) | DocumentTransition::Transfer(_) + ) + }) .copied() .collect::>(); - // We fetch documents only for replace transitions + // We fetch documents only for replace and transfer transitions // since we need them to create transition actions - // Below we also perform state validation for replace transitions only + // Below we also perform state validation for replace and transfer transitions only // other transitions are validated in their validate_state functions // TODO: Think more about this architecture let fetched_documents_validation_result = @@ -277,7 +289,7 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition platform.drive, data_contract, document_type, - replace_transitions.as_slice(), + replace_and_transfer_transitions.as_slice(), transaction, platform_version, )?; @@ -290,7 +302,7 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition let replaced_documents = fetched_documents_validation_result.into_data()?; - let document_transition_actions_result = if !dry_run { + Ok(if !dry_run { let document_transition_actions_validation_result = document_transitions .iter() .map(|transition| { @@ -317,17 +329,7 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition result } else { ConsensusValidationResult::default() - }; - - if !document_transition_actions_result.is_valid() { - return Ok(document_transition_actions_result); - } - - let document_transition_actions = document_transition_actions_result.into_data()?; - - Ok(ConsensusValidationResult::new_with_data( - document_transition_actions, - )) + }) } /// The data contract can be of multiple difference versions @@ -360,8 +362,18 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition Self::find_replaced_document_v0(transition, replaced_documents); if !validation_result.is_valid_with_data() { - result.merge(validation_result); - return Ok(result); + // We can set the user fee increase to 0 here because it is decided by the Documents Batch instead + let bump_action = + BumpIdentityDataContractNonceAction::from_borrowed_document_base_transition( + document_replace_transition.base(), + owner_id, + 0, + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action.into(), + validation_result.errors, + )); } let original_document = validation_result.into_data()?; @@ -376,8 +388,16 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition let original_document_created_at_core_block_height = original_document.created_at_core_block_height(); + let original_document_transferred_at = original_document.transferred_at(); + + let original_document_transferred_at_block_height = + original_document.transferred_at_block_height(); + + let original_document_transferred_at_core_block_height = + original_document.transferred_at_core_block_height(); + let validation_result = Self::check_ownership_of_old_replaced_document_v0( - document_replace_transition, + document_replace_transition.base().id(), original_document, &owner_id, ); @@ -392,7 +412,8 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition // for example when we already applied the state transition action // and we are just validating it happened let validation_result = Self::check_revision_is_bumped_by_one_during_replace_v0( - document_replace_transition, + document_replace_transition.revision(), + document_replace_transition.base().id(), original_document, ); @@ -408,6 +429,9 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition original_document_created_at, original_document_created_at_block_height, original_document_created_at_core_block_height, + original_document_transferred_at, + original_document_transferred_at_block_height, + original_document_transferred_at_core_block_height, block_info, |_identifier| Ok(data_contract_fetch_info.clone()), )?; @@ -424,6 +448,60 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition })?; Ok(DocumentTransitionAction::DeleteAction(action).into()) } + DocumentTransition::Transfer(document_transfer_transition) => { + let mut result = ConsensusValidationResult::::new(); + + let validation_result = + Self::find_replaced_document_v0(transition, replaced_documents); + + if !validation_result.is_valid_with_data() { + result.merge(validation_result); + return Ok(result); + } + + let original_document = validation_result.into_data()?; + + let validation_result = Self::check_ownership_of_old_replaced_document_v0( + document_transfer_transition.base().id(), + original_document, + &owner_id, + ); + + if !validation_result.is_valid() { + result.merge(validation_result); + return Ok(result); + } + + if validate_against_state { + //there are situations where we don't want to validate this against the state + // for example when we already applied the state transition action + // and we are just validating it happened + let validation_result = Self::check_revision_is_bumped_by_one_during_replace_v0( + document_transfer_transition.revision(), + document_transfer_transition.base().id(), + original_document, + ); + + if !validation_result.is_valid() { + result.merge(validation_result); + return Ok(result); + } + } + + let document_transfer_action = + DocumentTransferTransitionAction::try_from_borrowed_document_transfer_transition( + document_transfer_transition, + original_document.clone(), //todo: remove clone + block_info, + |_identifier| Ok(data_contract_fetch_info.clone()), + )?; + + if result.is_valid() { + Ok(DocumentTransitionAction::TransferAction(document_transfer_action).into()) + } else { + Ok(result) + } + } } } @@ -447,7 +525,7 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition } fn check_ownership_of_old_replaced_document_v0( - document_transition: &DocumentReplaceTransition, + document_id: Identifier, fetched_document: &Document, owner_id: &Identifier, ) -> SimpleConsensusValidationResult { @@ -455,7 +533,7 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition if fetched_document.owner_id() != owner_id { result.add_error(ConsensusError::StateError( StateError::DocumentOwnerIdMismatchError(DocumentOwnerIdMismatchError::new( - document_transition.base().id(), + document_id, owner_id.to_owned(), fetched_document.owner_id(), )), @@ -464,33 +542,32 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition result } fn check_revision_is_bumped_by_one_during_replace_v0( - document_transition: &DocumentReplaceTransition, + transition_revision: Revision, + document_id: Identifier, original_document: &Document, ) -> SimpleConsensusValidationResult { let mut result = SimpleConsensusValidationResult::default(); - let revision = document_transition.revision(); - // If there was no previous revision this means that the document_type is not update-able // However this should have been caught earlier let Some(previous_revision) = original_document.revision() else { result.add_error(ConsensusError::StateError( StateError::InvalidDocumentRevisionError(InvalidDocumentRevisionError::new( - document_transition.base().id(), + document_id, None, - revision, + transition_revision, )), )); return result; }; // no need to check bounds here, because it would be impossible to hit the end on a u64 let expected_revision = previous_revision + 1; - if revision != expected_revision { + if transition_revision != expected_revision { result.add_error(ConsensusError::StateError( StateError::InvalidDocumentRevisionError(InvalidDocumentRevisionError::new( - document_transition.base().id(), + document_id, Some(previous_revision), - revision, + transition_revision, )), )) } diff --git a/packages/rs-drive-abci/src/query/system/path_elements/v0/mod.rs b/packages/rs-drive-abci/src/query/system/path_elements/v0/mod.rs index b917c3fc5c..705375640b 100644 --- a/packages/rs-drive-abci/src/query/system/path_elements/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/system/path_elements/v0/mod.rs @@ -1,13 +1,11 @@ use crate::error::Error; use crate::platform_types::platform::Platform; -use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_path_elements_request::GetPathElementsRequestV0; use dapi_grpc::platform::v0::get_path_elements_response::get_path_elements_response_v0::Elements; use dapi_grpc::platform::v0::get_path_elements_response::{ get_path_elements_response_v0, GetPathElementsResponseV0, }; -use dpp::block::extended_epoch_info::v0::ExtendedEpochInfoV0Getters; use dpp::check_validation_result_with_data; use crate::error::query::QueryError; diff --git a/packages/rs-drive-abci/src/test/helpers/fee_pools.rs b/packages/rs-drive-abci/src/test/helpers/fee_pools.rs index 01148aae50..5b5fb7aebe 100644 --- a/packages/rs-drive-abci/src/test/helpers/fee_pools.rs +++ b/packages/rs-drive-abci/src/test/helpers/fee_pools.rs @@ -84,10 +84,13 @@ fn create_test_mn_share_document( revision: Some(INITIAL_REVISION), created_at: None, updated_at: None, + transferred_at: None, created_at_block_height: None, updated_at_block_height: None, + transferred_at_block_height: None, created_at_core_block_height: None, updated_at_core_block_height: None, + transferred_at_core_block_height: None, } .into(); diff --git a/packages/rs-drive-abci/src/test/helpers/setup.rs b/packages/rs-drive-abci/src/test/helpers/setup.rs index b3f7e70eea..a3971dc066 100644 --- a/packages/rs-drive-abci/src/test/helpers/setup.rs +++ b/packages/rs-drive-abci/src/test/helpers/setup.rs @@ -39,7 +39,12 @@ use crate::platform_types::platform::Platform; use crate::rpc::core::MockCoreRPCLike; use crate::test::fixture::abci::static_system_identity_public_keys_v0; use crate::{config::PlatformConfig, rpc::core::DefaultCoreRPC}; +use dpp::block::block_info::BlockInfo; +use dpp::document::transfer::Transferable; +use dpp::prelude::DataContract; +use dpp::tests::json_document::json_document_to_contract; use dpp::version::PlatformVersion; +use drive::drive::flags::StorageFlags; use tempfile::TempDir; /// A test platform builder. @@ -119,6 +124,37 @@ impl TempPlatform { self } + /// A function which adds the crypto card game to the state and returns it. + pub fn with_crypto_card_game(self, transferable: Transferable) -> (Self, DataContract) { + let card_game_path = match transferable { + Transferable::Never => "tests/supporting_files/contract/crypto-card-game/crypto-card-game-not-transferable.json", + Transferable::Always => "tests/supporting_files/contract/crypto-card-game/crypto-card-game-all-transferable.json", + }; + + let platform_version = self + .platform + .state + .load() + .current_platform_version() + .expect("expected to get current platform version"); + + // let's construct the grovedb structure for the card game data contract + let card_game_contract = json_document_to_contract(card_game_path, true, platform_version) + .expect("expected to get data contract"); + self.drive + .apply_contract( + &card_game_contract, + BlockInfo::default(), + true, + StorageFlags::optional_default_as_cow(), + None, + platform_version, + ) + .expect("expected to apply contract successfully"); + + (self, card_game_contract) + } + /// Sets Platform to genesis state. pub fn set_genesis_state(self) -> Self { self.platform diff --git a/packages/rs-drive-abci/tests/strategy_tests/main.rs b/packages/rs-drive-abci/tests/strategy_tests/main.rs index 1b47dab90d..1f0d30beb4 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/main.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/main.rs @@ -1,32 +1,3 @@ -// MIT LICENSE -// -// Copyright (c) 2021 Dash Core Group -// -// Permission is hereby granted, free of charge, to any -// person obtaining a copy of this software and associated -// documentation files (the "Software"), to deal in the -// Software without restriction, including without -// limitation the rights to use, copy, modify, merge, -// publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software -// is furnished to do so, subject to the following -// conditions: -// -// The above copyright notice and this permission notice -// shall be included in all copies or substantial portions -// of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -// ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -// TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -// SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -// IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -// DEALINGS IN THE SOFTWARE. -// - //! Execution Tests //! @@ -79,7 +50,9 @@ mod tests { use dashcore_rpc::json::AssetUnlockStatusResult; use dpp::block::extended_block_info::v0::ExtendedBlockInfoV0Getters; use std::sync::{Arc, Mutex}; - use strategy_tests::operations::DocumentAction::DocumentActionReplace; + use strategy_tests::operations::DocumentAction::{ + DocumentActionReplaceRandom, DocumentActionTransferRandom, + }; use strategy_tests::operations::{ DocumentAction, DocumentOp, IdentityUpdateOp, Operation, OperationType, }; @@ -1115,7 +1088,7 @@ mod tests { .unwrap() .unwrap() ), - "5dda9668d6efe6a481ec1d7ce3a1a77785aace12a853bea7eedcf37e9c5f8374".to_string() + "547963a6f85f531173493bc145bdec8796bfd4d61240ef108c3a2644175939eb".to_string() ) } @@ -1804,7 +1777,7 @@ mod tests { .unwrap() .unwrap() ), - "909c3c0655fcb31a992899a1d2af59a8847f72126db56140ca91ac9591561ebe".to_string() + "2609439c79ea50f6f6a2d4e4f357f710097fa2fab8a196e35c176689b2f2687a".to_string() ) } @@ -1929,7 +1902,7 @@ mod tests { .unwrap() .unwrap() ), - "58b6ae6a0468cb62d1947362cf92915ae046027a0501d808caa7bdcd2a23a10c".to_string() + "58b927769fb1782259883aa91a91a60c6d451cc5f95d3e0d905abcd9ff61f434".to_string() ) } @@ -2302,7 +2275,7 @@ mod tests { let document_replace_op = DocumentOp { contract: contract.clone(), - action: DocumentActionReplace, + action: DocumentActionReplaceRandom, document_type: contract .document_type_for_name("contactRequest") .expect("expected a profile document type") @@ -2403,6 +2376,151 @@ mod tests { assert_eq!(balance_count, 19); // 1 epoch worth of proposers } + #[test] + fn run_chain_insert_many_new_identity_per_block_many_document_insertions_updates_transfers_and_deletions_with_epoch_change( + ) { + let platform_version = PlatformVersion::latest(); + let created_contract = json_document_to_created_contract( + "tests/supporting_files/contract/dashpay/dashpay-contract-all-mutable.json", + 1, + true, + platform_version, + ) + .expect("expected to get contract from a json document"); + + let contract = created_contract.data_contract(); + + let document_insertion_op = DocumentOp { + contract: contract.clone(), + action: DocumentAction::DocumentActionInsertRandom( + DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + ), + document_type: contract + .document_type_for_name("contactRequest") + .expect("expected a profile document type") + .to_owned_document_type(), + }; + + let document_replace_op = DocumentOp { + contract: contract.clone(), + action: DocumentActionReplaceRandom, + document_type: contract + .document_type_for_name("contactRequest") + .expect("expected a profile document type") + .to_owned_document_type(), + }; + + let document_transfer_op = DocumentOp { + contract: contract.clone(), + action: DocumentActionTransferRandom, + document_type: contract + .document_type_for_name("contactRequest") + .expect("expected a profile document type") + .to_owned_document_type(), + }; + + let document_deletion_op = DocumentOp { + contract: contract.clone(), + action: DocumentAction::DocumentActionDelete, + document_type: contract + .document_type_for_name("contactRequest") + .expect("expected a profile document type") + .to_owned_document_type(), + }; + + let strategy = NetworkStrategy { + strategy: Strategy { + start_contracts: vec![(created_contract, None)], + operations: vec![ + Operation { + op_type: OperationType::Document(document_insertion_op), + frequency: Frequency { + times_per_block_range: 1..40, + chance_per_block: None, + }, + }, + Operation { + op_type: OperationType::Document(document_replace_op), + frequency: Frequency { + times_per_block_range: 1..5, + chance_per_block: None, + }, + }, + Operation { + op_type: OperationType::Document(document_transfer_op), + frequency: Frequency { + times_per_block_range: 1..5, + chance_per_block: None, + }, + }, + Operation { + op_type: OperationType::Document(document_deletion_op), + frequency: Frequency { + times_per_block_range: 1..5, + chance_per_block: None, + }, + }, + ], + start_identities: StartIdentities::default(), + identity_inserts: IdentityInsertInfo { + frequency: Frequency { + times_per_block_range: 1..6, + chance_per_block: None, + }, + start_keys: 5, + extra_keys: Default::default(), + }, + + identity_contract_nonce_gaps: None, + signer: None, + }, + total_hpmns: 100, + extra_normal_mns: 0, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, + upgrading_info: None, + + proposer_strategy: Default::default(), + rotate_quorums: false, + failure_testing: None, + query_testing: None, + verify_state_transition_results: true, + ..Default::default() + }; + + let day_in_ms = 1000 * 60 * 60 * 24; + + let config = PlatformConfig { + validator_set_quorum_size: 100, + validator_set_quorum_type: "llmq_100_67".to_string(), + chain_lock_quorum_type: "llmq_100_67".to_string(), + execution: ExecutionConfig { + verify_sum_trees: true, + validator_set_rotation_block_count: 100, + epoch_time_length_s: 1576800, + ..Default::default() + }, + block_spacing_ms: day_in_ms, + testing_configs: PlatformTestConfig::default_with_no_block_signing(), + ..Default::default() + }; + let block_count = 30; + let mut platform = TestPlatformBuilder::new() + .with_config(config.clone()) + .build_with_mock_rpc(); + + let outcome = run_chain_for_strategy(&mut platform, block_count, strategy, config, 15); + assert_eq!(outcome.identities.len() as u64, 97); + assert_eq!(outcome.masternode_identity_balances.len(), 100); + let balance_count = outcome + .masternode_identity_balances + .into_iter() + .filter(|(_, balance)| *balance != 0) + .count(); + assert_eq!(balance_count, 19); // 1 epoch worth of proposers + } + #[test] fn run_chain_top_up_identities() { drive_abci::logging::init_for_tests(LogLevel::Silent); diff --git a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs index cd9ccdd195..a52c42ac3d 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs @@ -55,9 +55,10 @@ use dpp::state_transition::documents_batch_transition::document_create_transitio use dpp::state_transition::documents_batch_transition::document_transition::document_delete_transition::DocumentDeleteTransitionV0; use dpp::state_transition::documents_batch_transition::document_transition::document_replace_transition::DocumentReplaceTransitionV0; use dpp::state_transition::documents_batch_transition::{DocumentsBatchTransition, DocumentsBatchTransitionV0}; -use dpp::state_transition::documents_batch_transition::document_transition::{DocumentDeleteTransition, DocumentReplaceTransition}; +use dpp::state_transition::documents_batch_transition::document_transition::{DocumentDeleteTransition, DocumentReplaceTransition, DocumentTransferTransition}; use drive::drive::document::query::QueryDocumentsOutcomeV0Methods; use dpp::state_transition::data_contract_create_transition::methods::v0::DataContractCreateTransitionMethodsV0; +use dpp::state_transition::documents_batch_transition::document_transition::document_transfer_transition::DocumentTransferTransitionV0; use drive_abci::abci::app::FullAbciApplication; use drive_abci::platform_types::withdrawal::unsigned_withdrawal_txs::v0::UnsignedWithdrawalTxs; @@ -527,6 +528,7 @@ impl NetworkStrategy { let mut operations = vec![]; let mut finalize_block_operations = vec![]; let mut replaced = vec![]; + let mut transferred = vec![]; let mut deleted = vec![]; for op in &self.strategy.operations { if op.frequency.check_hit(rng) { @@ -751,6 +753,8 @@ impl NetworkStrategy { items.retain(|item| !replaced.contains(&item.id())); + items.retain(|item| !transferred.contains(&item.id())); + if !items.is_empty() { let document = items.remove(0); @@ -821,7 +825,7 @@ impl NetworkStrategy { } } OperationType::Document(DocumentOp { - action: DocumentAction::DocumentActionReplace, + action: DocumentAction::DocumentActionReplaceRandom, document_type, contract, }) => { @@ -843,6 +847,8 @@ impl NetworkStrategy { items.retain(|item| !replaced.contains(&item.id())); + items.retain(|item| !transferred.contains(&item.id())); + if !items.is_empty() { let document = items.remove(0); @@ -920,6 +926,117 @@ impl NetworkStrategy { operations.push(document_batch_transition); } } + OperationType::Document(DocumentOp { + action: DocumentAction::DocumentActionTransferRandom, + document_type, + contract, + }) => { + let any_item_query = + DriveQuery::any_item_query(contract, document_type.as_ref()); + let mut items = platform + .drive + .query_documents( + any_item_query, + Some(&block_info.epoch), + false, + None, + Some(platform_version.protocol_version), + ) + .expect("expect to execute query") + .documents_owned(); + + items.retain(|item| !deleted.contains(&item.id())); + + items.retain(|item| !replaced.contains(&item.id())); + + items.retain(|item| !transferred.contains(&item.id())); + + if !items.is_empty() { + let document = items.remove(0); + + transferred.push(document.id()); + + let random_index = rng.gen_range(0..current_identities.len()); + let mut random_identity_id = current_identities[random_index].id(); + + if random_identity_id == document.owner_id() { + if current_identities.len() == 1 { + continue; + } + if random_index == current_identities.len() - 1 { + // we are at the end + random_identity_id = current_identities[random_index - 1].id(); + } else { + random_identity_id = current_identities[random_index + 1].id(); + } + } + + let request = IdentityKeysRequest { + identity_id: document.owner_id().to_buffer(), + request_type: KeyRequestType::SpecificKeys(vec![1]), + limit: Some(1), + offset: None, + }; + let identity = platform + .drive + .fetch_identity_balance_with_keys(request, None, platform_version) + .expect("expected to be able to get identity") + .expect("expected to get an identity"); + let identity_contract_nonce = contract_nonce_counter + .get_mut(&(identity.id, contract.id())) + .expect( + "the identity should already have a nonce for that contract", + ); + *identity_contract_nonce += 1; + let document_transfer_transition: DocumentTransferTransition = + DocumentTransferTransitionV0 { + base: DocumentBaseTransitionV0 { + id: document.id(), + identity_contract_nonce: *identity_contract_nonce, + document_type_name: document_type.name().clone(), + data_contract_id: contract.id(), + } + .into(), + revision: document + .revision() + .expect("expected to unwrap revision") + + 1, + recipient_owner_id: random_identity_id, + } + .into(); + + let document_batch_transition: DocumentsBatchTransition = + DocumentsBatchTransitionV0 { + owner_id: identity.id, + transitions: vec![document_transfer_transition.into()], + user_fee_increase: 0, + signature_public_key_id: 0, + signature: BinaryData::default(), + } + .into(); + + let mut document_batch_transition: StateTransition = + document_batch_transition.into(); + + let identity_public_key = identity + .loaded_public_keys + .values() + .next() + .expect("expected a key"); + + document_batch_transition + .sign_external( + identity_public_key, + signer, + Some(|_data_contract_id, _document_type_name| { + Ok(SecurityLevel::HIGH) + }), + ) + .expect("expected to sign"); + + operations.push(document_batch_transition); + } + } OperationType::IdentityTopUp if !current_identities.is_empty() => { let indices: Vec = (0..current_identities.len()).choose_multiple(rng, count as usize); @@ -1044,11 +1161,11 @@ impl NetworkStrategy { ); // Create `doc_type_count` doc types - let doc_types = - Value::Map( - doc_type_range - .clone() - .filter_map(|_| match DocumentTypeV0::random_document_type( + let doc_types = Value::Map( + doc_type_range + .clone() + .map(|_| { + match DocumentTypeV0::random_document_type( params.clone(), contract_id, rng, @@ -1058,10 +1175,10 @@ impl NetworkStrategy { let doc_type_clone = new_document_type.schema().clone(); - Some(( + ( Value::Text(new_document_type.name().clone()), doc_type_clone, - )) + ) } Err(e) => { panic!( @@ -1069,9 +1186,10 @@ impl NetworkStrategy { e ); } - }) - .collect(), - ); + } + }) + .collect(), + ); let created_data_contract = match contract_factory.create( owner_id, diff --git a/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs b/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs index bb900789d0..13910492ef 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs @@ -3,7 +3,7 @@ use dapi_grpc::platform::v0::{get_proofs_request, GetProofsRequest}; use dapi_grpc::platform::VersionedGrpcResponse; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; -use dpp::document::Document; +use dpp::document::{Document, DocumentV0Getters}; use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; use dpp::asset_lock::reduced_asset_lock_value::AssetLockValueGettersV0; @@ -23,6 +23,7 @@ use dpp::state_transition::documents_batch_transition::accessors::DocumentsBatch use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; use drive::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::DocumentFromCreateTransitionAction; use drive::state_transition_action::document::documents_batch::document_transition::document_replace_transition_action::DocumentFromReplaceTransitionAction; +use drive::state_transition_action::document::documents_batch::document_transition::document_transfer_transition_action::DocumentTransferTransitionActionAccessorsV0; use drive_abci::abci::app::FullAbciApplication; use drive_abci::execution::types::state_transition_execution_context::StateTransitionExecutionContext; use drive_abci::execution::validation::state_transition::ValidationMode; @@ -383,6 +384,26 @@ pub(crate) fn verify_state_transitions_were_or_were_not_executed( DocumentTransitionAction::BumpIdentityDataContractNonce(_) => { panic!("we should not have a bump identity data contract nonce"); } + DocumentTransitionAction::TransferAction(transfer_action) => { + if *was_executed { + // it's also possible we deleted something we replaced + if let Some(document) = document { + assert_eq!( + document.owner_id(), + transfer_action.document().owner_id() + ); + } + } else { + //there is the possibility that the state transition was not executed and the state is equal to the previous + // state, aka there would have been no change anyways, we can discount that for now + if let Some(document) = document { + assert_ne!( + document.owner_id(), + transfer_action.document().owner_id() + ); + } + } + } } } } diff --git a/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-all-transferable.json b/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-all-transferable.json new file mode 100644 index 0000000000..b14e8fe5ad --- /dev/null +++ b/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-all-transferable.json @@ -0,0 +1,132 @@ +{ + "$format_version": "0", + "id": "86LHvdC1Tqx5P97LQUSibGFqf2vnKFpB6VkqQ7oso86e", + "ownerId": "2QjL594djCH2NyDsn45vd6yQjEDHupMKo7CEGVTHtQxU", + "version": 1, + "documentSchemas": { + "card": { + "type": "object", + "documentsMutable": false, + "transferable": 1, + "properties": { + "name": { + "type": "string", + "description": "Name of the card", + "maxLength": 63, + "position": 0 + }, + "description": { + "type": "string", + "description": "Description of the card", + "maxLength": 256, + "position": 1 + }, + "imageUrl": { + "type": "string", + "description": "URL of the image associated with the card", + "maxLength": 2048, + "format": "uri", + "position": 2 + }, + "imageHash": { + "type": "array", + "description": "SHA256 hash of the bytes of the image specified by imageUrl", + "byteArray": true, + "minItems": 32, + "maxItems": 32, + "position": 3 + }, + "imageFingerprint": { + "type": "array", + "description": "dHash of the image specified by imageUrl", + "byteArray": true, + "minItems": 8, + "maxItems": 8, + "position": 4 + }, + "attack": { + "type": "integer", + "description": "Attack power of the card", + "minimum": 0, + "position": 5 + }, + "defense": { + "type": "integer", + "description": "Defense level of the card", + "minimum": 0, + "position": 6 + } + }, + "indices": [ + { + "name": "owner", + "properties": [ + { + "$ownerId": "asc" + } + ] + }, + { + "name": "attack", + "properties": [ + { + "attack": "asc" + } + ] + }, + { + "name": "defense", + "properties": [ + { + "defense": "asc" + } + ] + }, + { + "name": "transferredAt", + "properties": [ + { + "$transferredAt": "asc" + } + ] + }, + { + "name": "ownerTransferredAt", + "properties": [ + { + "$ownerId": "asc" + }, + { + "$transferredAt": "asc" + } + ] + }, + { + "name": "transferredAtBlockHeight", + "properties": [ + { + "$transferredAtBlockHeight": "asc" + } + ] + }, + { + "name": "transferredAtCoreBlockHeight", + "properties": [ + { + "$transferredAtCoreBlockHeight": "asc" + } + ] + } + ], + "required": [ + "name", + "$transferredAt", + "$transferredAtBlockHeight", + "$transferredAtCoreBlockHeight", + "attack", + "defense" + ], + "additionalProperties": false + } + } +} \ No newline at end of file diff --git a/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-not-transferable.json b/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-not-transferable.json new file mode 100644 index 0000000000..3032f982cd --- /dev/null +++ b/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-not-transferable.json @@ -0,0 +1,132 @@ +{ + "$format_version": "0", + "id": "86LHvdC1Tqx5P97LQUSibGFqf2vnKFpB6VkqQ7oso86e", + "ownerId": "2QjL594djCH2NyDsn45vd6yQjEDHupMKo7CEGVTHtQxU", + "version": 1, + "documentSchemas": { + "card": { + "type": "object", + "documentsMutable": true, + "transferable": 0, + "properties": { + "name": { + "type": "string", + "description": "Name of the card", + "maxLength": 63, + "position": 0 + }, + "description": { + "type": "string", + "description": "Description of the card", + "maxLength": 256, + "position": 1 + }, + "imageUrl": { + "type": "string", + "description": "URL of the image associated with the card", + "maxLength": 2048, + "format": "uri", + "position": 2 + }, + "imageHash": { + "type": "array", + "description": "SHA256 hash of the bytes of the image specified by imageUrl", + "byteArray": true, + "minItems": 32, + "maxItems": 32, + "position": 3 + }, + "imageFingerprint": { + "type": "array", + "description": "dHash of the image specified by imageUrl", + "byteArray": true, + "minItems": 8, + "maxItems": 8, + "position": 4 + }, + "attack": { + "type": "integer", + "description": "Attack power of the card", + "minimum": 0, + "position": 5 + }, + "defense": { + "type": "integer", + "description": "Defense level of the card", + "minimum": 0, + "position": 6 + } + }, + "indices": [ + { + "name": "owner", + "properties": [ + { + "$ownerId": "asc" + } + ] + }, + { + "name": "attack", + "properties": [ + { + "attack": "asc" + } + ] + }, + { + "name": "defense", + "properties": [ + { + "defense": "asc" + } + ] + }, + { + "name": "transferredAt", + "properties": [ + { + "$transferredAt": "asc" + } + ] + }, + { + "name": "ownerTransferredAt", + "properties": [ + { + "$ownerId": "asc" + }, + { + "$transferredAt": "asc" + } + ] + }, + { + "name": "transferredAtBlockHeight", + "properties": [ + { + "$transferredAtBlockHeight": "asc" + } + ] + }, + { + "name": "transferredAtCoreBlockHeight", + "properties": [ + { + "$transferredAtCoreBlockHeight": "asc" + } + ] + } + ], + "required": [ + "name", + "$transferredAt", + "$transferredAtBlockHeight", + "$transferredAtCoreBlockHeight", + "attack", + "defense" + ], + "additionalProperties": false + } + } +} \ No newline at end of file diff --git a/packages/rs-drive/src/drive/batch/transitions/document/document_update_transition.rs b/packages/rs-drive/src/drive/batch/transitions/document/document_replace_transition.rs similarity index 100% rename from packages/rs-drive/src/drive/batch/transitions/document/document_update_transition.rs rename to packages/rs-drive/src/drive/batch/transitions/document/document_replace_transition.rs diff --git a/packages/rs-drive/src/drive/batch/transitions/document/document_transfer_transition.rs b/packages/rs-drive/src/drive/batch/transitions/document/document_transfer_transition.rs new file mode 100644 index 0000000000..e16715f4db --- /dev/null +++ b/packages/rs-drive/src/drive/batch/transitions/document/document_transfer_transition.rs @@ -0,0 +1,52 @@ +use crate::drive::batch::transitions::document::DriveHighLevelDocumentOperationConverter; +use crate::drive::batch::DriveOperation::{DocumentOperation, IdentityOperation}; +use crate::drive::batch::{DocumentOperationType, DriveOperation, IdentityOperationType}; +use crate::drive::flags::StorageFlags; +use crate::drive::object_size_info::DocumentInfo::DocumentOwnedInfo; +use crate::drive::object_size_info::OwnedDocumentInfo; +use crate::error::Error; +use dpp::block::epoch::Epoch; + +use dpp::document::DocumentV0Getters; +use dpp::prelude::Identifier; +use std::borrow::Cow; +use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use crate::state_transition_action::document::documents_batch::document_transition::document_transfer_transition_action::{DocumentTransferTransitionAction, DocumentTransferTransitionActionAccessorsV0}; +use dpp::version::PlatformVersion; + +impl DriveHighLevelDocumentOperationConverter for DocumentTransferTransitionAction { + fn into_high_level_document_drive_operations<'b>( + self, + epoch: &Epoch, + owner_id: Identifier, + _platform_version: &PlatformVersion, + ) -> Result>, Error> { + let data_contract_id = self.base().data_contract_id(); + let document_type_name = self.base().document_type_name().clone(); + let identity_contract_nonce = self.base().identity_contract_nonce(); + let document = self.document_owned(); + + // we are transferring the document so the new storage flags should be on the new owner + + let new_document_owner_id = document.owner_id(); + + let storage_flags = + StorageFlags::new_single_epoch(epoch.index, Some(new_document_owner_id.to_buffer())); + + Ok(vec![ + IdentityOperation(IdentityOperationType::UpdateIdentityContractNonce { + identity_id: owner_id.into_buffer(), + contract_id: data_contract_id.into_buffer(), + nonce: identity_contract_nonce, + }), + DocumentOperation(DocumentOperationType::UpdateDocument { + owned_document_info: OwnedDocumentInfo { + document_info: DocumentOwnedInfo((document, Some(Cow::Owned(storage_flags)))), + owner_id: Some(new_document_owner_id.into_buffer()), + }, + contract_id: data_contract_id, + document_type_name: Cow::Owned(document_type_name), + }), + ]) + } +} diff --git a/packages/rs-drive/src/drive/batch/transitions/document/document_transition.rs b/packages/rs-drive/src/drive/batch/transitions/document/document_transition.rs index bb37226d10..c141cae6c4 100644 --- a/packages/rs-drive/src/drive/batch/transitions/document/document_transition.rs +++ b/packages/rs-drive/src/drive/batch/transitions/document/document_transition.rs @@ -36,6 +36,13 @@ impl DriveHighLevelDocumentOperationConverter for DocumentTransitionAction { platform_version, ) } + DocumentTransitionAction::TransferAction(document_transfer_transition) => { + document_transfer_transition.into_high_level_document_drive_operations( + epoch, + owner_id, + platform_version, + ) + } DocumentTransitionAction::BumpIdentityDataContractNonce( bump_identity_contract_nonce_action, ) => bump_identity_contract_nonce_action diff --git a/packages/rs-drive/src/drive/batch/transitions/document/mod.rs b/packages/rs-drive/src/drive/batch/transitions/document/mod.rs index 6e865020e1..b7df757580 100644 --- a/packages/rs-drive/src/drive/batch/transitions/document/mod.rs +++ b/packages/rs-drive/src/drive/batch/transitions/document/mod.rs @@ -6,8 +6,9 @@ use dpp::version::PlatformVersion; mod document_create_transition; mod document_delete_transition; +mod document_replace_transition; +mod document_transfer_transition; mod document_transition; -mod document_update_transition; mod documents_batch_transition; /// A converter that will get High Level Drive Operations from State transitions diff --git a/packages/rs-drive/src/drive/defaults.rs b/packages/rs-drive/src/drive/defaults.rs index 8dc5e8385b..19bad96478 100644 --- a/packages/rs-drive/src/drive/defaults.rs +++ b/packages/rs-drive/src/drive/defaults.rs @@ -62,6 +62,21 @@ pub const DEFAULT_HASH_SIZE_U32: u32 = 32; pub const OPTIMIZED_DOCUMENT_REFERENCE: u16 = 34; // 1 + hops + DEFAULT_HASH_SIZE /// Default float size pub const DEFAULT_FLOAT_SIZE: u32 = 8; +/// u64 size +pub const U64_SIZE: u32 = 8; +/// u64 size +pub const U64_SIZE_U16: u16 = 8; +/// u64 size +pub const U64_SIZE_U8: u8 = 8; + +/// u32 size +pub const U32_SIZE: u32 = 4; + +/// u32 size +pub const U32_SIZE_U16: u16 = 4; + +/// u32 size +pub const U32_SIZE_U8: u8 = 4; /// Default float size as u16 pub const DEFAULT_FLOAT_SIZE_U16: u16 = 8; /// Default float size as u8 diff --git a/packages/rs-drive/src/drive/document/delete/mod.rs b/packages/rs-drive/src/drive/document/delete/mod.rs index 04b30f9c9c..6fe049c5ff 100644 --- a/packages/rs-drive/src/drive/document/delete/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/mod.rs @@ -836,8 +836,8 @@ mod tests { / Epoch::new(0) .unwrap() .cost_for_known_cost_item(StorageDiskUsageCreditPerByte); - // We added 1558 bytes - assert_eq!(added_bytes, 1558); + // We added 1559 bytes + assert_eq!(added_bytes, 1559); let document_id = bs58::decode("AM47xnyLfTAC9f61ZQPGfMK5Datk2FeYZwgYvcAnzqFY") .into_vec() @@ -866,14 +866,14 @@ mod tests { .get(&0) .unwrap(); - assert_eq!(*removed_credits, 41854792); + assert_eq!(*removed_credits, 41881536); let refund_equivalent_bytes = removed_credits.to_unsigned() / Epoch::new(0) .unwrap() .cost_for_known_cost_item(StorageDiskUsageCreditPerByte); assert!(added_bytes > refund_equivalent_bytes); - assert_eq!(refund_equivalent_bytes, 1550); // we refunded 1550 instead of 1558 + assert_eq!(refund_equivalent_bytes, 1551); // we refunded 1551 instead of 1559 } #[test] @@ -933,7 +933,7 @@ mod tests { .unwrap() .cost_for_known_cost_item(StorageDiskUsageCreditPerByte); // We added 1558 bytes - assert_eq!(added_bytes, 1558); + assert_eq!(added_bytes, 1559); let document_id = bs58::decode("AM47xnyLfTAC9f61ZQPGfMK5Datk2FeYZwgYvcAnzqFY") .into_vec() diff --git a/packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/mod.rs b/packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/mod.rs index 081fc25772..32823a82e9 100644 --- a/packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/mod.rs +++ b/packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/mod.rs @@ -40,14 +40,20 @@ pub(in crate::drive::document::index_uniqueness) struct UniquenessOfDataRequest< pub created_at: Option, /// Optional timestamp indicating the last time the document was updated. pub updated_at: Option, + /// Optional timestamp indicating the last time the document was transferred. + pub transferred_at: Option, /// Optional timestamp indicating the block height at which the document was created. pub created_at_block_height: Option, /// Optional timestamp indicating the last block height the document was updated. pub updated_at_block_height: Option, + /// Optional timestamp indicating the last block height the document was transferred. + pub transferred_at_block_height: Option, /// Optional timestamp indicating the core height at which the document was created. pub created_at_core_block_height: Option, /// Optional timestamp indicating the last core block height the document was updated. pub updated_at_core_block_height: Option, + /// Optional timestamp indicating the last core block height the document was transferred. + pub transferred_at_core_block_height: Option, /// The actual data to be checked for uniqueness, represented as a mapping. pub data: &'a BTreeMap, } diff --git a/packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v0/mod.rs b/packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v0/mod.rs index 8a3b7c1479..228d1d06d2 100644 --- a/packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/index_uniqueness/internal/validate_uniqueness_of_data/v0/mod.rs @@ -49,10 +49,13 @@ impl Drive { allow_original, created_at, updated_at, + transferred_at, created_at_block_height, updated_at_block_height, + transferred_at_block_height, created_at_core_block_height, updated_at_core_block_height, + transferred_at_core_block_height, data, } = request; @@ -86,6 +89,13 @@ impl Drive { return None; } } + property_names::TRANSFERRED_AT => { + if let Some(transferred_at) = transferred_at { + platform_value!(transferred_at) + } else { + return None; + } + } property_names::CREATED_AT_BLOCK_HEIGHT => { if let Some(created_at_block_height) = created_at_block_height { platform_value!(created_at_block_height) @@ -100,6 +110,15 @@ impl Drive { return None; } } + property_names::TRANSFERRED_AT_BLOCK_HEIGHT => { + if let Some(transferred_at_block_height) = + transferred_at_block_height + { + platform_value!(transferred_at_block_height) + } else { + return None; + } + } property_names::CREATED_AT_CORE_BLOCK_HEIGHT => { if let Some(created_at_core_block_height) = created_at_core_block_height @@ -118,7 +137,15 @@ impl Drive { return None; } } - + property_names::TRANSFERRED_AT_CORE_BLOCK_HEIGHT => { + if let Some(transferred_at_core_block_height) = + transferred_at_core_block_height + { + platform_value!(transferred_at_core_block_height) + } else { + return None; + } + } _ => { if let Some(value) = data.get(property.name.as_str()) { value.clone() diff --git a/packages/rs-drive/src/drive/document/index_uniqueness/mod.rs b/packages/rs-drive/src/drive/document/index_uniqueness/mod.rs index 1e84677b01..ffeeab47df 100644 --- a/packages/rs-drive/src/drive/document/index_uniqueness/mod.rs +++ b/packages/rs-drive/src/drive/document/index_uniqueness/mod.rs @@ -39,4 +39,5 @@ mod validate_document_create_transition_action_uniqueness; mod validate_document_replace_transition_action_uniqueness; +mod validate_document_transfer_transition_action_uniqueness; mod validate_document_uniqueness; diff --git a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/v0/mod.rs b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/v0/mod.rs index 6475414400..5f9c96d1ab 100644 --- a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/v0/mod.rs @@ -11,6 +11,12 @@ use dpp::identifier::Identifier; use dpp::validation::SimpleConsensusValidationResult; +use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; +use dpp::document::property_names::{ + CREATED_AT, CREATED_AT_BLOCK_HEIGHT, CREATED_AT_CORE_BLOCK_HEIGHT, TRANSFERRED_AT, + TRANSFERRED_AT_BLOCK_HEIGHT, TRANSFERRED_AT_CORE_BLOCK_HEIGHT, UPDATED_AT, + UPDATED_AT_BLOCK_HEIGHT, UPDATED_AT_CORE_BLOCK_HEIGHT, +}; use grovedb::TransactionArg; use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; @@ -29,18 +35,77 @@ impl Drive { transaction: TransactionArg, platform_version: &PlatformVersion, ) -> Result { + let required_fields = document_type.required_fields(); + + let is_created_at_required = required_fields.contains(CREATED_AT); + let is_updated_at_required = required_fields.contains(UPDATED_AT); + let is_transferred_at_required = required_fields.contains(TRANSFERRED_AT); + + let is_created_at_block_height_required = required_fields.contains(CREATED_AT_BLOCK_HEIGHT); + let is_updated_at_block_height_required = required_fields.contains(UPDATED_AT_BLOCK_HEIGHT); + let is_transferred_at_block_height_required = + required_fields.contains(TRANSFERRED_AT_BLOCK_HEIGHT); + + let is_created_at_core_block_height_required = + required_fields.contains(CREATED_AT_CORE_BLOCK_HEIGHT); + let is_updated_at_core_block_height_required = + required_fields.contains(UPDATED_AT_CORE_BLOCK_HEIGHT); + let is_transferred_at_core_block_height_required = + required_fields.contains(TRANSFERRED_AT_CORE_BLOCK_HEIGHT); + + let block_info = document_create_transition.block_info(); + let request = UniquenessOfDataRequest { contract, document_type, owner_id, document_id: document_create_transition.base().id(), allow_original: false, - created_at: document_create_transition.created_at(), - updated_at: document_create_transition.created_at(), - created_at_block_height: document_create_transition.created_at_block_height(), - updated_at_block_height: document_create_transition.created_at_block_height(), - created_at_core_block_height: document_create_transition.created_at_core_block_height(), - updated_at_core_block_height: document_create_transition.created_at_core_block_height(), + created_at: if is_created_at_required { + Some(block_info.time_ms) + } else { + None + }, + updated_at: if is_updated_at_required { + Some(block_info.time_ms) + } else { + None + }, + transferred_at: if is_transferred_at_required { + Some(block_info.time_ms) + } else { + None + }, + created_at_block_height: if is_created_at_block_height_required { + Some(block_info.height) + } else { + None + }, + updated_at_block_height: if is_updated_at_block_height_required { + Some(block_info.height) + } else { + None + }, + transferred_at_block_height: if is_transferred_at_block_height_required { + Some(block_info.height) + } else { + None + }, + created_at_core_block_height: if is_created_at_core_block_height_required { + Some(block_info.core_height) + } else { + None + }, + updated_at_core_block_height: if is_updated_at_core_block_height_required { + Some(block_info.core_height) + } else { + None + }, + transferred_at_core_block_height: if is_transferred_at_core_block_height_required { + Some(block_info.core_height) + } else { + None + }, data: document_create_transition.data(), }; self.validate_uniqueness_of_data(request, transaction, platform_version) diff --git a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/v0/mod.rs b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/v0/mod.rs index 76682ed3c7..8930e78be5 100644 --- a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/v0/mod.rs @@ -37,12 +37,16 @@ impl Drive { allow_original: true, created_at: document_replace_transition.created_at(), updated_at: document_replace_transition.updated_at(), + transferred_at: document_replace_transition.transferred_at(), created_at_block_height: document_replace_transition.created_at_block_height(), updated_at_block_height: document_replace_transition.updated_at_block_height(), + transferred_at_block_height: document_replace_transition.transferred_at_block_height(), created_at_core_block_height: document_replace_transition .created_at_core_block_height(), updated_at_core_block_height: document_replace_transition .updated_at_core_block_height(), + transferred_at_core_block_height: document_replace_transition + .transferred_at_core_block_height(), data: document_replace_transition.data(), }; self.validate_uniqueness_of_data(request, transaction, platform_version) diff --git a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/mod.rs b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/mod.rs new file mode 100644 index 0000000000..b72f8d55ae --- /dev/null +++ b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/mod.rs @@ -0,0 +1,70 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; + +use dpp::data_contract::document_type::DocumentTypeRef; +use dpp::data_contract::DataContract; + +use dpp::identifier::Identifier; + +use dpp::validation::SimpleConsensusValidationResult; + +use grovedb::TransactionArg; + +use crate::state_transition_action::document::documents_batch::document_transition::document_transfer_transition_action::DocumentTransferTransitionAction; +use dpp::version::PlatformVersion; + +impl Drive { + /// Validate that a document transfer transition action would be unique in the state. + /// + /// # Arguments + /// + /// * `contract` - A `DataContract` object representing the contract. + /// * `document_type` - A `DocumentType` object representing the type of the document. + /// * `document_transfer_transition` - A `DocumentTransferTransitionAction` object representing the document transfer transition action. + /// * `owner_id` - An `Identifier` object representing the owner's ID. + /// * `transaction` - A `TransactionArg` object representing the transaction. + /// * `drive_version` - A `DriveVersion` object representing the version of the Drive. + /// + /// # Returns + /// + /// * `Result` - If successful, returns a `SimpleConsensusValidationResult` object representing the result of the validation. + /// If an error occurs during the operation, returns an `Error`. + /// + /// # Errors + /// + /// This function will return an error if the version of the Drive is unknown. + pub fn validate_document_transfer_transition_action_uniqueness( + &self, + contract: &DataContract, + document_type: DocumentTypeRef, + document_transfer_transition: &DocumentTransferTransitionAction, + owner_id: Identifier, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result { + match platform_version + .drive + .methods + .document + .index_uniqueness + .validate_document_transfer_transition_action_uniqueness + { + 0 => self.validate_document_transfer_transition_action_uniqueness_v0( + contract, + document_type, + document_transfer_transition, + owner_id, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "validate_document_transfer_transition_action_uniqueness".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/v0/mod.rs b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/v0/mod.rs new file mode 100644 index 0000000000..a4a2551716 --- /dev/null +++ b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/v0/mod.rs @@ -0,0 +1,64 @@ +use dpp::data_contract::DataContract; + +use crate::drive::Drive; + +use crate::drive::document::index_uniqueness::internal::validate_uniqueness_of_data::UniquenessOfDataRequest; +use crate::error::Error; + +use dpp::data_contract::document_type::DocumentTypeRef; + +use dpp::identifier::Identifier; + +use dpp::validation::SimpleConsensusValidationResult; + +use dpp::document::DocumentV0Getters; +use grovedb::TransactionArg; + +use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use crate::state_transition_action::document::documents_batch::document_transition::document_transfer_transition_action::{DocumentTransferTransitionAction, DocumentTransferTransitionActionAccessorsV0}; +use dpp::version::PlatformVersion; + +impl Drive { + /// Validate that a document transfer transition action would be unique in the state + #[inline(always)] + pub(super) fn validate_document_transfer_transition_action_uniqueness_v0( + &self, + contract: &DataContract, + document_type: DocumentTypeRef, + document_transfer_transition: &DocumentTransferTransitionAction, + owner_id: Identifier, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result { + let request = UniquenessOfDataRequest { + contract, + document_type, + owner_id, + document_id: document_transfer_transition.base().id(), + allow_original: true, + created_at: document_transfer_transition.document().created_at(), + updated_at: document_transfer_transition.document().updated_at(), + transferred_at: document_transfer_transition.document().transferred_at(), + created_at_block_height: document_transfer_transition + .document() + .created_at_block_height(), + updated_at_block_height: document_transfer_transition + .document() + .updated_at_block_height(), + transferred_at_block_height: document_transfer_transition + .document() + .transferred_at_block_height(), + created_at_core_block_height: document_transfer_transition + .document() + .created_at_core_block_height(), + updated_at_core_block_height: document_transfer_transition + .document() + .updated_at_core_block_height(), + transferred_at_core_block_height: document_transfer_transition + .document() + .transferred_at_core_block_height(), + data: document_transfer_transition.document().properties(), + }; + self.validate_uniqueness_of_data(request, transaction, platform_version) + } +} diff --git a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_uniqueness/v0/mod.rs b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_uniqueness/v0/mod.rs index 8fdf2b5a39..b4e6e8a8f3 100644 --- a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_uniqueness/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_uniqueness/v0/mod.rs @@ -35,10 +35,13 @@ impl Drive { allow_original, created_at: document.created_at(), updated_at: document.updated_at(), + transferred_at: document.transferred_at(), created_at_block_height: document.created_at_block_height(), updated_at_block_height: document.updated_at_block_height(), + transferred_at_block_height: document.transferred_at_block_height(), created_at_core_block_height: document.created_at_core_block_height(), updated_at_core_block_height: document.updated_at_core_block_height(), + transferred_at_core_block_height: document.transferred_at_core_block_height(), data: document.properties(), }; self.validate_uniqueness_of_data(request, transaction, platform_version) diff --git a/packages/rs-drive/src/drive/document/insert/add_document_to_primary_storage/v0/mod.rs b/packages/rs-drive/src/drive/document/insert/add_document_to_primary_storage/v0/mod.rs index 0cfc8f2c30..4958e68be6 100644 --- a/packages/rs-drive/src/drive/document/insert/add_document_to_primary_storage/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/insert/add_document_to_primary_storage/v0/mod.rs @@ -142,7 +142,7 @@ impl Drive { drive_operations, drive_version, )?; - let encoded_time = DocumentPropertyType::encode_unsigned_integer(block_info.time_ms)?; + let encoded_time = DocumentPropertyType::encode_date_timestamp(block_info.time_ms); let path_key_element_info = match &document_and_contract_info .owned_document_info .document_info diff --git a/packages/rs-drive/src/drive/document/insert/mod.rs b/packages/rs-drive/src/drive/document/insert/mod.rs index f25f5aa302..03e8979c84 100644 --- a/packages/rs-drive/src/drive/document/insert/mod.rs +++ b/packages/rs-drive/src/drive/document/insert/mod.rs @@ -76,7 +76,7 @@ mod tests { use std::option::Option::None; use dpp::block::block_info::BlockInfo; - use rand::Rng; + use rand::{random, Rng}; use crate::common::setup_contract; use crate::drive::document::tests::setup_dashpay; @@ -201,7 +201,7 @@ mod tests { .document_type_for_name("contactRequest") .expect("expected to get document type"); - let random_owner_id = rand::thread_rng().gen::<[u8; 32]>(); + let random_owner_id = random::<[u8; 32]>(); let dashpay_cr_document = json_document_to_document( "tests/supporting_files/contract/dashpay/contact-request0.json", @@ -328,11 +328,11 @@ mod tests { assert_eq!( fee_result, FeeResult { - storage_fee: 3057 + storage_fee: 3058 * Epoch::new(0) .unwrap() .cost_for_known_cost_item(StorageDiskUsageCreditPerByte), - processing_fee: 2316870, + processing_fee: 2317270, ..Default::default() } ); @@ -391,11 +391,11 @@ mod tests { assert_eq!( fee_result, FeeResult { - storage_fee: 1304 + storage_fee: 1305 * Epoch::new(0) .unwrap() .cost_for_known_cost_item(StorageDiskUsageCreditPerByte), - processing_fee: 1481610, + processing_fee: 1482010, ..Default::default() } ); @@ -460,8 +460,8 @@ mod tests { / Epoch::new(0) .unwrap() .cost_for_known_cost_item(StorageDiskUsageCreditPerByte); - assert_eq!(1304, added_bytes); - assert_eq!(142936400, processing_fee); + assert_eq!(1305, added_bytes); + assert_eq!(142936800, processing_fee); } #[test] @@ -479,7 +479,7 @@ mod tests { Some(&db_transaction), ); - let random_owner_id = rand::thread_rng().gen::<[u8; 32]>(); + let random_owner_id = random::<[u8; 32]>(); let document_type = contract .document_type_for_name("contactRequest") @@ -553,7 +553,7 @@ mod tests { Some(&db_transaction), ); - let random_owner_id = rand::thread_rng().gen::<[u8; 32]>(); + let random_owner_id = random::<[u8; 32]>(); let document_type = contract .document_type_for_name("contactRequest") @@ -683,11 +683,11 @@ mod tests { assert_eq!( fee_result, FeeResult { - storage_fee: 1760 + storage_fee: 1761 * Epoch::new(0) .unwrap() .cost_for_known_cost_item(StorageDiskUsageCreditPerByte), - processing_fee: 2068990, + processing_fee: 2069390, ..Default::default() } ); diff --git a/packages/rs-drive/src/drive/document/query/mod.rs b/packages/rs-drive/src/drive/document/query/mod.rs index 421c2c03ca..136092c5d6 100644 --- a/packages/rs-drive/src/drive/document/query/mod.rs +++ b/packages/rs-drive/src/drive/document/query/mod.rs @@ -35,10 +35,11 @@ mod query_documents; pub use query_documents::*; -#[cfg(feature = "fixtures-and-mocks")] +#[cfg(all(feature = "fixtures-and-mocks", feature = "cbor_query"))] use dpp::block::block_info::BlockInfo; #[cfg(feature = "fixtures-and-mocks")] use dpp::block::epoch::Epoch; +#[cfg(all(feature = "fixtures-and-mocks", feature = "cbor_query"))] use dpp::data_contract::accessors::v0::DataContractV0Getters; #[cfg(feature = "fixtures-and-mocks")] #[cfg(feature = "fixtures-and-mocks")] @@ -46,9 +47,9 @@ use grovedb::TransactionArg; use crate::drive::Drive; -#[cfg(feature = "fixtures-and-mocks")] +#[cfg(all(feature = "fixtures-and-mocks", feature = "cbor_query"))] use crate::drive::verify::RootHash; -#[cfg(feature = "fixtures-and-mocks")] +#[cfg(all(feature = "fixtures-and-mocks", feature = "cbor_query"))] use crate::error::query::QuerySyntaxError; #[cfg(feature = "fixtures-and-mocks")] use crate::error::Error; @@ -61,12 +62,13 @@ use crate::query::DriveQuery; feature = "data-contract-cbor-conversion" ))] use dpp::data_contract::conversion::cbor::DataContractCborConversionMethodsV0; -#[cfg(feature = "fixtures-and-mocks")] +#[cfg(all(feature = "fixtures-and-mocks", feature = "cbor_query"))] use dpp::data_contract::document_type::DocumentTypeRef; -#[cfg(feature = "fixtures-and-mocks")] +#[cfg(all(feature = "fixtures-and-mocks", feature = "cbor_query"))] use dpp::data_contract::DataContract; #[cfg(feature = "fixtures-and-mocks")] use dpp::version::PlatformVersion; +#[cfg(all(feature = "fixtures-and-mocks", feature = "cbor_query"))] use dpp::version::PlatformVersionCurrentVersion; // TODO: Not using diff --git a/packages/rs-drive/src/drive/document/update/internal/update_document_for_contract_operations/v0/mod.rs b/packages/rs-drive/src/drive/document/update/internal/update_document_for_contract_operations/v0/mod.rs index f6decc23b6..a39199206f 100644 --- a/packages/rs-drive/src/drive/document/update/internal/update_document_for_contract_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/update/internal/update_document_for_contract_operations/v0/mod.rs @@ -51,7 +51,12 @@ impl Drive { ) -> Result, Error> { let drive_version = &platform_version.drive; let mut batch_operations: Vec = vec![]; - if !document_and_contract_info.document_type.documents_mutable() { + if !document_and_contract_info.document_type.documents_mutable() + && !document_and_contract_info + .document_type + .documents_transferable() + .is_transferable() + { return Err(Error::Drive(DriveError::UpdatingReadOnlyImmutableDocument( "documents for this contract are not mutable", ))); @@ -195,7 +200,7 @@ impl Drive { .get_raw_for_document_type( &top_index_property.name, document_type, - owner_id, + None, // We want to use the old owner id None, platform_version, )? @@ -266,7 +271,7 @@ impl Drive { .get_raw_for_document_type( &index_property.name, document_type, - owner_id, + None, // We want to use the old owner_id None, platform_version, )? diff --git a/packages/rs-drive/src/drive/document/update/mod.rs b/packages/rs-drive/src/drive/document/update/mod.rs index ff5c43a0e8..f8090d3b03 100644 --- a/packages/rs-drive/src/drive/document/update/mod.rs +++ b/packages/rs-drive/src/drive/document/update/mod.rs @@ -906,7 +906,7 @@ mod tests { .serialize_consume(document_type, platform_version) .expect("expected to serialize document"); - assert_eq!(document_serialized.len(), 119); + assert_eq!(document_serialized.len(), 120); let original_fees = apply_person( &drive, &contract, @@ -924,7 +924,7 @@ mod tests { //Explanation for 1237 //todo - 1237 + 1238 } else { //Explanation for 959 @@ -1059,7 +1059,7 @@ mod tests { //// 359 + 179 + 145 + 278 - 961 + 962 }; assert_eq!(original_bytes, expected_added_bytes); @@ -1082,14 +1082,14 @@ mod tests { .get(&0) .unwrap(); - assert_eq!(*removed_credits, 25913567); + assert_eq!(*removed_credits, 25940733); let refund_equivalent_bytes = removed_credits.to_unsigned() / Epoch::new(0) .unwrap() .cost_for_known_cost_item(StorageDiskUsageCreditPerByte); assert!(expected_added_bytes > refund_equivalent_bytes); - assert_eq!(refund_equivalent_bytes, 959); // we refunded 959 instead of 962 + assert_eq!(refund_equivalent_bytes, 960); // we refunded 960 instead of 963 // let's re-add it again let original_fees = apply_person( @@ -1127,7 +1127,7 @@ mod tests { .unwrap() .cost_for_known_cost_item(StorageDiskUsageCreditPerByte); - let expected_added_bytes = if using_history { 312 } else { 1 }; + let expected_added_bytes = if using_history { 313 } else { 1 }; assert_eq!(added_bytes, expected_added_bytes); } @@ -1197,7 +1197,7 @@ mod tests { / Epoch::new(0) .unwrap() .cost_for_known_cost_item(StorageDiskUsageCreditPerByte); - let expected_added_bytes = if using_history { 1237 } else { 961 }; + let expected_added_bytes = if using_history { 1238 } else { 962 }; assert_eq!(original_bytes, expected_added_bytes); if !using_history { // let's delete it, just to make sure everything is working. @@ -1217,14 +1217,14 @@ mod tests { .get(&0) .unwrap(); - assert_eq!(*removed_credits, 25913567); + assert_eq!(*removed_credits, 25940733); let refund_equivalent_bytes = removed_credits.to_unsigned() / Epoch::new(0) .unwrap() .cost_for_known_cost_item(StorageDiskUsageCreditPerByte); assert!(expected_added_bytes > refund_equivalent_bytes); - assert_eq!(refund_equivalent_bytes, 959); // we refunded 959 instead of 1011 + assert_eq!(refund_equivalent_bytes, 960); // we refunded 960 instead of 1012 // let's re-add it again let original_fees = apply_person( @@ -1395,7 +1395,7 @@ mod tests { //Explanation for 1237 //todo - 1237 + 1238 } else { //Explanation for 959 @@ -1530,7 +1530,7 @@ mod tests { // 360 + 179 + 145 + 278 = 960 - 961 + 962 }; assert_eq!(original_bytes, expected_added_bytes); @@ -1551,7 +1551,7 @@ mod tests { .unwrap() .cost_for_known_cost_item(StorageDiskUsageCreditPerByte); - let expected_added_bytes = if using_history { 1238 } else { 962 }; + let expected_added_bytes = if using_history { 1239 } else { 963 }; assert_eq!(added_bytes, expected_added_bytes); } diff --git a/packages/rs-drive/src/drive/object_size_info/document_info.rs b/packages/rs-drive/src/drive/object_size_info/document_info.rs index 6e7eb209b2..1901f0eb97 100644 --- a/packages/rs-drive/src/drive/object_size_info/document_info.rs +++ b/packages/rs-drive/src/drive/object_size_info/document_info.rs @@ -1,5 +1,6 @@ use crate::drive::defaults::{ - DEFAULT_FLOAT_SIZE, DEFAULT_FLOAT_SIZE_U16, DEFAULT_HASH_SIZE_U16, DEFAULT_HASH_SIZE_U8, + DEFAULT_HASH_SIZE_U16, DEFAULT_HASH_SIZE_U8, U32_SIZE_U16, U32_SIZE_U8, U64_SIZE_U16, + U64_SIZE_U8, }; use crate::drive::flags::StorageFlags; use crate::drive::object_size_info::DriveKeyInfo::{Key, KeySize}; @@ -113,7 +114,13 @@ impl<'a> DocumentInfoV0Methods for DocumentInfo<'a> { ) -> Result { match key_path { "$ownerId" | "$id" => Ok(DEFAULT_HASH_SIZE_U16), - "$createdAt" | "$updatedAt" => Ok(DEFAULT_FLOAT_SIZE_U16), + "$createdAt" | "$updatedAt" | "$transferredAt" => Ok(U64_SIZE_U16), + "$createdAtBlockHeight" | "$updatedAtBlockHeight" | "$transferredAtBlockHeight" => { + Ok(U64_SIZE_U16) + } + "$createdAtCoreBlockHeight" + | "$updatedAtCoreBlockHeight" + | "$transferredAtCoreBlockHeight" => Ok(U32_SIZE_U16), _ => { let property = document_type.flattened_properties().get(key_path).ok_or({ Error::Fee(FeeError::DocumentTypeFieldNotFoundForEstimation( @@ -177,11 +184,29 @@ impl<'a> DocumentInfoV0Methods for DocumentInfo<'a> { .to_vec(), max_size: DEFAULT_HASH_SIZE_U8, }))), - "$createdAt" | "$updatedAt" => Ok(Some(KeySize(KeyInfo::MaxKeySize { + "$createdAt" | "$updatedAt" | "$transferredAt" => { + Ok(Some(KeySize(KeyInfo::MaxKeySize { + unique_id: document_type + .unique_id_for_document_field(index_level, base_event) + .to_vec(), + max_size: U64_SIZE_U8, + }))) + } + "$createdAtBlockHeight" + | "$updatedAtBlockHeight" + | "$transferredAtBlockHeight" => Ok(Some(KeySize(KeyInfo::MaxKeySize { + unique_id: document_type + .unique_id_for_document_field(index_level, base_event) + .to_vec(), + max_size: U64_SIZE_U8, + }))), + "$createdAtCoreBlockHeight" + | "$updatedAtCoreBlockHeight" + | "$transferredAtCoreBlockHeight" => Ok(Some(KeySize(KeyInfo::MaxKeySize { unique_id: document_type .unique_id_for_document_field(index_level, base_event) .to_vec(), - max_size: DEFAULT_FLOAT_SIZE as u8, + max_size: U32_SIZE_U8, }))), _ => { let property = diff --git a/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs b/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs index f0eb680a00..d4d4e148e4 100644 --- a/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs +++ b/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs @@ -24,6 +24,7 @@ use dpp::state_transition::documents_batch_transition::document_create_transitio use dpp::state_transition::documents_batch_transition::document_delete_transition::v0::v0_methods::DocumentDeleteTransitionV0Methods; use dpp::state_transition::documents_batch_transition::document_replace_transition::DocumentFromReplaceTransition; use dpp::state_transition::documents_batch_transition::document_replace_transition::v0::v0_methods::DocumentReplaceTransitionV0Methods; +use dpp::state_transition::documents_batch_transition::document_transition::document_transfer_transition::v0::v0_methods::DocumentTransferTransitionV0Methods; use dpp::state_transition::proof_result::StateTransitionProofResult; use dpp::state_transition::proof_result::StateTransitionProofResult::{VerifiedBalanceTransfer, VerifiedDataContract, VerifiedDocuments, VerifiedIdentity, VerifiedPartialIdentity}; use platform_version::TryIntoPlatformVersioned; @@ -152,6 +153,9 @@ impl Drive { document.created_at(), //we can trust the created at (as we don't care) document.created_at_block_height(), //we can trust the created at block height (as we don't care) document.created_at_core_block_height(), //we can trust the created at core block height (as we don't care) + document.created_at(), //we can trust the created at (as we don't care) + document.created_at_block_height(), //we can trust the created at block height (as we don't care) + document.created_at_core_block_height(), //we can trust the created at core block height (as we don't care) block_info, &document_type, platform_version, @@ -169,6 +173,19 @@ impl Drive { VerifiedDocuments(BTreeMap::from([(document.id(), Some(document))])), )) } + DocumentTransition::Transfer(transfer_transition) => { + let document = document.ok_or(Error::Proof(ProofError::IncorrectProof(format!("proof did not contain document with id {} expected to exist because of state transition (transfer)", transfer_transition.base().id()))))?; + let recipient_owner_id = transfer_transition.recipient_owner_id(); + + if document.owner_id() != recipient_owner_id { + return Err(Error::Proof(ProofError::IncorrectProof(format!("proof of state transition execution did not have the transfer executed after expected transfer with id {}", transfer_transition.base().id())))); + } + + Ok(( + root_hash, + VerifiedDocuments(BTreeMap::from([(document.id(), Some(document))])), + )) + } DocumentTransition::Delete(delete_transition) => { if document.is_some() { return Err(Error::Proof(ProofError::IncorrectProof(format!("proof of state transition execution contained document after delete with id {}", delete_transition.base().id())))); diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/action_type.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/action_type.rs index e213385cb9..f2dda79525 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/action_type.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/action_type.rs @@ -9,6 +9,7 @@ impl TransitionActionTypeGetter for DocumentTransitionAction { DocumentTransitionAction::CreateAction(_) => DocumentTransitionActionType::Create, DocumentTransitionAction::DeleteAction(_) => DocumentTransitionActionType::Delete, DocumentTransitionAction::ReplaceAction(_) => DocumentTransitionActionType::Replace, + DocumentTransitionAction::TransferAction(_) => DocumentTransitionActionType::Transfer, DocumentTransitionAction::BumpIdentityDataContractNonce(_) => { DocumentTransitionActionType::IgnoreWhileBumpingRevision } diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/mod.rs index ec14a24a3a..f8f9c0380c 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/mod.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/mod.rs @@ -4,12 +4,11 @@ mod v0; use derive_more::From; -use dpp::identity::TimestampMillis; +use dpp::block::block_info::BlockInfo; use dpp::platform_value::{Identifier, Value}; use std::collections::BTreeMap; use dpp::document::Document; -use dpp::prelude::{BlockHeight, CoreBlockHeight}; use dpp::ProtocolError; @@ -37,21 +36,9 @@ impl DocumentCreateTransitionActionAccessorsV0 for DocumentCreateTransitionActio } } - fn created_at(&self) -> Option { + fn block_info(&self) -> BlockInfo { match self { - DocumentCreateTransitionAction::V0(v0) => v0.created_at, - } - } - - fn created_at_block_height(&self) -> Option { - match self { - DocumentCreateTransitionAction::V0(v0) => v0.created_at_block_height, - } - } - - fn created_at_core_block_height(&self) -> Option { - match self { - DocumentCreateTransitionAction::V0(v0) => v0.created_at_core_block_height, + DocumentCreateTransitionAction::V0(v0) => v0.block_info, } } diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/mod.rs index 92ab780a11..6a8ff00498 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/mod.rs @@ -1,15 +1,20 @@ pub mod transformer; +use dpp::block::block_info::BlockInfo; use dpp::document::{Document, DocumentV0}; -use dpp::identity::TimestampMillis; use dpp::platform_value::{Identifier, Value}; use std::collections::BTreeMap; use dpp::ProtocolError; use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::data_contract::document_type::methods::DocumentTypeV0Methods; -use dpp::prelude::{BlockHeight, CoreBlockHeight}; +use dpp::document::property_names::{ + CREATED_AT, CREATED_AT_BLOCK_HEIGHT, CREATED_AT_CORE_BLOCK_HEIGHT, TRANSFERRED_AT, + TRANSFERRED_AT_BLOCK_HEIGHT, TRANSFERRED_AT_CORE_BLOCK_HEIGHT, UPDATED_AT, + UPDATED_AT_BLOCK_HEIGHT, UPDATED_AT_CORE_BLOCK_HEIGHT, +}; use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::{DocumentBaseTransitionAction, DocumentBaseTransitionActionV0}; @@ -20,12 +25,8 @@ use dpp::version::PlatformVersion; pub struct DocumentCreateTransitionActionV0 { /// Document Base Transition pub base: DocumentBaseTransitionAction, - /// The creation time of the document - pub created_at: Option, - /// The creation block height of the document - pub created_at_block_height: Option, - /// The creation core block height of the document - pub created_at_core_block_height: Option, + /// The block_info at the time of creation + pub block_info: BlockInfo, /// Document properties pub data: BTreeMap, } @@ -36,12 +37,8 @@ pub trait DocumentCreateTransitionActionAccessorsV0 { fn base(&self) -> &DocumentBaseTransitionAction; /// base owned fn base_owned(self) -> DocumentBaseTransitionAction; - /// created at time - fn created_at(&self) -> Option; - /// created at block height - fn created_at_block_height(&self) -> Option; - /// created at core block height - fn created_at_core_block_height(&self) -> Option; + /// block info + fn block_info(&self) -> BlockInfo; /// data fn data(&self) -> &BTreeMap; /// data mut @@ -96,9 +93,7 @@ impl DocumentFromCreateTransitionActionV0 for Document { ) -> Result { let DocumentCreateTransitionActionV0 { base, - created_at, - created_at_block_height, - created_at_core_block_height, + block_info, data, } = v0; @@ -115,6 +110,26 @@ impl DocumentFromCreateTransitionActionV0 for Document { .contract .document_type_for_name(document_type_name.as_str())?; + let required_fields = document_type.required_fields(); + + let is_created_at_required = required_fields.contains(CREATED_AT); + let is_updated_at_required = required_fields.contains(UPDATED_AT); + let is_transferred_at_required = required_fields.contains(TRANSFERRED_AT); + + let is_created_at_block_height_required = + required_fields.contains(CREATED_AT_BLOCK_HEIGHT); + let is_updated_at_block_height_required = + required_fields.contains(UPDATED_AT_BLOCK_HEIGHT); + let is_transferred_at_block_height_required = + required_fields.contains(TRANSFERRED_AT_BLOCK_HEIGHT); + + let is_created_at_core_block_height_required = + required_fields.contains(CREATED_AT_CORE_BLOCK_HEIGHT); + let is_updated_at_core_block_height_required = + required_fields.contains(UPDATED_AT_CORE_BLOCK_HEIGHT); + let is_transferred_at_core_block_height_required = + required_fields.contains(TRANSFERRED_AT_CORE_BLOCK_HEIGHT); + match platform_version .dpp .document_versions @@ -125,12 +140,52 @@ impl DocumentFromCreateTransitionActionV0 for Document { owner_id, properties: data.clone(), revision: document_type.initial_revision(), - created_at: *created_at, - updated_at: *created_at, - created_at_block_height: *created_at_block_height, - updated_at_block_height: *created_at_block_height, - created_at_core_block_height: *created_at_core_block_height, - updated_at_core_block_height: *created_at_core_block_height, + created_at: if is_created_at_required { + Some(block_info.time_ms) + } else { + None + }, + updated_at: if is_updated_at_required { + Some(block_info.time_ms) + } else { + None + }, + transferred_at: if is_transferred_at_required { + Some(block_info.time_ms) + } else { + None + }, + created_at_block_height: if is_created_at_block_height_required { + Some(block_info.height) + } else { + None + }, + updated_at_block_height: if is_updated_at_block_height_required { + Some(block_info.height) + } else { + None + }, + transferred_at_block_height: if is_transferred_at_block_height_required { + Some(block_info.height) + } else { + None + }, + created_at_core_block_height: if is_created_at_core_block_height_required { + Some(block_info.core_height) + } else { + None + }, + updated_at_core_block_height: if is_updated_at_core_block_height_required { + Some(block_info.core_height) + } else { + None + }, + transferred_at_core_block_height: + if is_transferred_at_core_block_height_required { + Some(block_info.core_height) + } else { + None + }, } .into()), version => Err(ProtocolError::UnknownVersionMismatch { @@ -150,9 +205,7 @@ impl DocumentFromCreateTransitionActionV0 for Document { ) -> Result { let DocumentCreateTransitionActionV0 { base, - created_at, - created_at_block_height, - created_at_core_block_height, + block_info, data, } = v0; @@ -169,6 +222,26 @@ impl DocumentFromCreateTransitionActionV0 for Document { .contract .document_type_for_name(document_type_name.as_str())?; + let required_fields = document_type.required_fields(); + + let is_created_at_required = required_fields.contains(CREATED_AT); + let is_updated_at_required = required_fields.contains(UPDATED_AT); + let is_transferred_at_required = required_fields.contains(TRANSFERRED_AT); + + let is_created_at_block_height_required = + required_fields.contains(CREATED_AT_BLOCK_HEIGHT); + let is_updated_at_block_height_required = + required_fields.contains(UPDATED_AT_BLOCK_HEIGHT); + let is_transferred_at_block_height_required = + required_fields.contains(TRANSFERRED_AT_BLOCK_HEIGHT); + + let is_created_at_core_block_height_required = + required_fields.contains(CREATED_AT_CORE_BLOCK_HEIGHT); + let is_updated_at_core_block_height_required = + required_fields.contains(UPDATED_AT_CORE_BLOCK_HEIGHT); + let is_transferred_at_core_block_height_required = + required_fields.contains(TRANSFERRED_AT_CORE_BLOCK_HEIGHT); + match platform_version .dpp .document_versions @@ -179,12 +252,52 @@ impl DocumentFromCreateTransitionActionV0 for Document { owner_id, properties: data, revision: document_type.initial_revision(), - created_at, - updated_at: created_at, - created_at_block_height, - updated_at_block_height: created_at_block_height, - created_at_core_block_height, - updated_at_core_block_height: created_at_core_block_height, + created_at: if is_created_at_required { + Some(block_info.time_ms) + } else { + None + }, + updated_at: if is_updated_at_required { + Some(block_info.time_ms) + } else { + None + }, + transferred_at: if is_transferred_at_required { + Some(block_info.time_ms) + } else { + None + }, + created_at_block_height: if is_created_at_block_height_required { + Some(block_info.height) + } else { + None + }, + updated_at_block_height: if is_updated_at_block_height_required { + Some(block_info.height) + } else { + None + }, + transferred_at_block_height: if is_transferred_at_block_height_required { + Some(block_info.height) + } else { + None + }, + created_at_core_block_height: if is_created_at_core_block_height_required { + Some(block_info.core_height) + } else { + None + }, + updated_at_core_block_height: if is_updated_at_core_block_height_required { + Some(block_info.core_height) + } else { + None + }, + transferred_at_core_block_height: + if is_transferred_at_core_block_height_required { + Some(block_info.core_height) + } else { + None + }, } .into()), version => Err(ProtocolError::UnknownVersionMismatch { diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/transformer.rs index caec3badee..5b3286ba22 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/transformer.rs @@ -1,12 +1,11 @@ use dpp::block::block_info::BlockInfo; -use dpp::document::property_names; use dpp::platform_value::Identifier; use std::sync::Arc; use dpp::ProtocolError; use dpp::state_transition::documents_batch_transition::document_create_transition::v0::DocumentCreateTransitionV0; use crate::drive::contract::DataContractFetchInfo; -use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::{DocumentBaseTransitionAction, DocumentBaseTransitionActionAccessorsV0}; +use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionAction; use crate::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::DocumentCreateTransitionActionV0; impl DocumentCreateTransitionActionV0 { @@ -21,32 +20,10 @@ impl DocumentCreateTransitionActionV0 { base, get_data_contract, )?; - let created_at = if base.document_type_field_is_required(property_names::CREATED_AT)? { - Some(block_info.time_ms) - } else { - None - }; - - let created_at_block_height = - if base.document_type_field_is_required(property_names::CREATED_AT_BLOCK_HEIGHT)? { - Some(block_info.height) - } else { - None - }; - - let created_at_core_block_height = if base - .document_type_field_is_required(property_names::CREATED_AT_CORE_BLOCK_HEIGHT)? - { - Some(block_info.core_height) - } else { - None - }; Ok(DocumentCreateTransitionActionV0 { base, - created_at, - created_at_block_height, - created_at_core_block_height, + block_info: *block_info, data, }) } @@ -63,32 +40,10 @@ impl DocumentCreateTransitionActionV0 { base, get_data_contract, )?; - let created_at = if base.document_type_field_is_required(property_names::CREATED_AT)? { - Some(block_info.time_ms) - } else { - None - }; - - let created_at_block_height = - if base.document_type_field_is_required(property_names::CREATED_AT_BLOCK_HEIGHT)? { - Some(block_info.height) - } else { - None - }; - - let created_at_core_block_height = if base - .document_type_field_is_required(property_names::CREATED_AT_CORE_BLOCK_HEIGHT)? - { - Some(block_info.core_height) - } else { - None - }; Ok(DocumentCreateTransitionActionV0 { base, - created_at, - created_at_block_height, - created_at_core_block_height, + block_info: *block_info, //todo: get rid of clone data: data.clone(), }) diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/mod.rs index 5f9ac7d1c4..f2dfc222e3 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/mod.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/mod.rs @@ -14,7 +14,7 @@ pub use v0::*; use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionAction; use dpp::version::PlatformVersion; -/// tranformer +/// transformer pub mod transformer; /// action @@ -55,6 +55,12 @@ impl DocumentReplaceTransitionActionAccessorsV0 for DocumentReplaceTransitionAct } } + fn transferred_at(&self) -> Option { + match self { + DocumentReplaceTransitionAction::V0(v0) => v0.transferred_at, + } + } + /// Returns the block height at which the document was created. fn created_at_block_height(&self) -> Option { match self { @@ -69,6 +75,12 @@ impl DocumentReplaceTransitionActionAccessorsV0 for DocumentReplaceTransitionAct } } + fn transferred_at_block_height(&self) -> Option { + match self { + DocumentReplaceTransitionAction::V0(v0) => v0.transferred_at_block_height, + } + } + /// Returns the core block height at which the document was created. fn created_at_core_block_height(&self) -> Option { match self { @@ -83,6 +95,12 @@ impl DocumentReplaceTransitionActionAccessorsV0 for DocumentReplaceTransitionAct } } + fn transferred_at_core_block_height(&self) -> Option { + match self { + DocumentReplaceTransitionAction::V0(v0) => v0.transferred_at_core_block_height, + } + } + fn data(&self) -> &BTreeMap { match self { DocumentReplaceTransitionAction::V0(v0) => &v0.data, diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/transformer.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/transformer.rs index 25eea91099..4c5cfa6316 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/transformer.rs @@ -16,6 +16,9 @@ impl DocumentReplaceTransitionAction { originally_created_at: Option, originally_created_at_block_height: Option, originally_created_at_core_block_height: Option, + originally_transferred_at: Option, + originally_transferred_at_block_height: Option, + originally_transferred_at_core_block_height: Option, block_info: &BlockInfo, get_data_contract: impl Fn(Identifier) -> Result, ProtocolError>, ) -> Result { @@ -26,6 +29,9 @@ impl DocumentReplaceTransitionAction { originally_created_at, originally_created_at_block_height, originally_created_at_core_block_height, + originally_transferred_at, + originally_transferred_at_block_height, + originally_transferred_at_core_block_height, block_info, get_data_contract, )? diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/v0/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/v0/mod.rs index c28811dd63..299d71136f 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/v0/mod.rs @@ -22,14 +22,20 @@ pub struct DocumentReplaceTransitionActionV0 { pub created_at: Option, /// The time the document was last updated pub updated_at: Option, + /// The time the document was last transferred + pub transferred_at: Option, /// The block height at which the document was created pub created_at_block_height: Option, /// The block height at which the document was last updated pub updated_at_block_height: Option, + /// The block height at which the document was last transferred + pub transferred_at_block_height: Option, /// The core block height at which the document was created pub created_at_core_block_height: Option, /// The core block height at which the document was last updated pub updated_at_core_block_height: Option, + /// The core block height at which the document was last transferred + pub transferred_at_core_block_height: Option, /// Document properties pub data: BTreeMap, } @@ -46,16 +52,26 @@ pub trait DocumentReplaceTransitionActionAccessorsV0 { fn created_at(&self) -> Option; /// updated at fn updated_at(&self) -> Option; + /// transferred at + fn transferred_at(&self) -> Option; /// Returns the block height at which the document was created. fn created_at_block_height(&self) -> Option; /// Returns the block height at which the document was last updated. fn updated_at_block_height(&self) -> Option; + + /// Returns the block height at which the document was last transferred. + fn transferred_at_block_height(&self) -> Option; + /// Returns the core block height at which the document was created. fn created_at_core_block_height(&self) -> Option; /// Returns the core block height at which the document was last updated. fn updated_at_core_block_height(&self) -> Option; + + /// Returns the core block height at which the document was last transferred. + fn transferred_at_core_block_height(&self) -> Option; + /// data fn data(&self) -> &BTreeMap; /// data owned @@ -111,10 +127,13 @@ impl DocumentFromReplaceTransitionActionV0 for Document { revision, created_at, updated_at, + transferred_at, created_at_block_height, updated_at_block_height, + transferred_at_block_height, created_at_core_block_height, updated_at_core_block_height, + transferred_at_core_block_height, data, } = value; @@ -132,10 +151,13 @@ impl DocumentFromReplaceTransitionActionV0 for Document { revision: Some(*revision), created_at: *created_at, updated_at: *updated_at, + transferred_at: *transferred_at, created_at_block_height: *created_at_block_height, updated_at_block_height: *updated_at_block_height, + transferred_at_block_height: *transferred_at_block_height, created_at_core_block_height: *created_at_core_block_height, updated_at_core_block_height: *updated_at_core_block_height, + transferred_at_core_block_height: *transferred_at_core_block_height, } .into()), version => Err(ProtocolError::UnknownVersionMismatch { @@ -156,10 +178,13 @@ impl DocumentFromReplaceTransitionActionV0 for Document { revision, created_at, updated_at, + transferred_at, created_at_block_height, updated_at_block_height, + transferred_at_block_height, created_at_core_block_height, updated_at_core_block_height, + transferred_at_core_block_height, data, } = value; @@ -177,10 +202,13 @@ impl DocumentFromReplaceTransitionActionV0 for Document { revision: Some(revision), created_at, updated_at, + transferred_at, created_at_block_height, updated_at_block_height, + transferred_at_block_height, created_at_core_block_height, updated_at_core_block_height, + transferred_at_core_block_height, } .into()), version => Err(ProtocolError::UnknownVersionMismatch { diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/v0/transformer.rs index a092683ada..8127c39532 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/v0/transformer.rs @@ -18,6 +18,9 @@ impl DocumentReplaceTransitionActionV0 { originally_created_at: Option, originally_created_at_block_height: Option, originally_created_at_core_block_height: Option, + originally_transferred_at: Option, + originally_transferred_at_block_height: Option, + originally_transferred_at_core_block_height: Option, block_info: &BlockInfo, get_data_contract: impl Fn(Identifier) -> Result, ProtocolError>, ) -> Result { @@ -58,10 +61,13 @@ impl DocumentReplaceTransitionActionV0 { revision: *revision, created_at: originally_created_at, updated_at, + transferred_at: originally_transferred_at, created_at_block_height: originally_created_at_block_height, updated_at_block_height, + transferred_at_block_height: originally_transferred_at_block_height, created_at_core_block_height: originally_created_at_core_block_height, updated_at_core_block_height, + transferred_at_core_block_height: originally_transferred_at_core_block_height, data: data.clone(), }) } diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/mod.rs new file mode 100644 index 0000000000..d9a38534ca --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/mod.rs @@ -0,0 +1,85 @@ +mod v0; + +use derive_more::From; +use dpp::document::Document; + +use dpp::platform_value::Identifier; +use dpp::ProtocolError; +pub use v0::*; + +use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionAction; +use dpp::version::PlatformVersion; + +/// transformer +pub mod transformer; + +/// action +#[derive(Debug, Clone, From)] +pub enum DocumentTransferTransitionAction { + /// v0 + V0(DocumentTransferTransitionActionV0), +} + +impl DocumentTransferTransitionActionAccessorsV0 for DocumentTransferTransitionAction { + fn base(&self) -> &DocumentBaseTransitionAction { + match self { + DocumentTransferTransitionAction::V0(v0) => &v0.base, + } + } + + fn base_owned(self) -> DocumentBaseTransitionAction { + match self { + DocumentTransferTransitionAction::V0(v0) => v0.base, + } + } + + fn document(&self) -> &Document { + match self { + DocumentTransferTransitionAction::V0(v0) => &v0.document, + } + } + + fn document_owned(self) -> Document { + match self { + DocumentTransferTransitionAction::V0(v0) => v0.document, + } + } +} + +/// document from transfer transition +pub trait DocumentFromTransferTransitionAction { + /// Attempts to create a new `Document` from the given `DocumentTransferTransitionAction` reference and `owner_id`. + /// + /// # Arguments + /// + /// * `value` - A reference to the `DocumentTransferTransitionAction` containing information about the document being transferd. + /// * `owner_id` - The `Identifier` of the document's owner. + /// + /// # Returns + /// + /// * `Result` - A new `Document` object if successful, otherwise a `ProtocolError`. + fn try_from_transfer_transition_action( + document_transfer_transition_action: &DocumentTransferTransitionAction, + owner_id: Identifier, + platform_version: &PlatformVersion, + ) -> Result + where + Self: Sized; + /// Attempts to create a new `Document` from the given `DocumentTransferTransitionAction` instance and `owner_id`. + /// + /// # Arguments + /// + /// * `value` - A `DocumentTransferTransitionAction` instance containing information about the document being transferd. + /// * `owner_id` - The `Identifier` of the document's owner. + /// + /// # Returns + /// + /// * `Result` - A new `Document` object if successful, otherwise a `ProtocolError`. + fn try_from_owned_transfer_transition_action( + document_transfer_transition_action: DocumentTransferTransitionAction, + owner_id: Identifier, + platform_version: &PlatformVersion, + ) -> Result + where + Self: Sized; +} diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/transformer.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/transformer.rs new file mode 100644 index 0000000000..16bbaa4822 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/transformer.rs @@ -0,0 +1,31 @@ +use dpp::block::block_info::BlockInfo; +use dpp::document::Document; +use dpp::platform_value::Identifier; +use std::sync::Arc; + +use dpp::ProtocolError; +use dpp::state_transition::documents_batch_transition::document_transition::DocumentTransferTransition; +use crate::drive::contract::DataContractFetchInfo; +use crate::state_transition_action::document::documents_batch::document_transition::document_transfer_transition_action::{DocumentTransferTransitionAction, DocumentTransferTransitionActionV0}; + +impl DocumentTransferTransitionAction { + /// try from borrowed + pub fn try_from_borrowed_document_transfer_transition( + document_transfer_transition: &DocumentTransferTransition, + original_document: Document, + block_info: &BlockInfo, + get_data_contract: impl Fn(Identifier) -> Result, ProtocolError>, + ) -> Result { + match document_transfer_transition { + DocumentTransferTransition::V0(v0) => Ok( + DocumentTransferTransitionActionV0::try_from_borrowed_document_transfer_transition( + v0, + original_document, + block_info, + get_data_contract, + )? + .into(), + ), + } + } +} diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/v0/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/v0/mod.rs new file mode 100644 index 0000000000..d23667dd29 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/v0/mod.rs @@ -0,0 +1,26 @@ +pub mod transformer; + +use dpp::document::Document; + +use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionAction; + +/// document transfer transition action v0 +#[derive(Debug, Clone)] +pub struct DocumentTransferTransitionActionV0 { + /// Document Base Transition + pub base: DocumentBaseTransitionAction, + /// The new document to be inserted + pub document: Document, +} + +/// document transfer transition action accessors v0 +pub trait DocumentTransferTransitionActionAccessorsV0 { + /// base + fn base(&self) -> &DocumentBaseTransitionAction; + /// base owned + fn base_owned(self) -> DocumentBaseTransitionAction; + /// the document to be inserted as a ref + fn document(&self) -> &Document; + /// the document to be inserted as owned + fn document_owned(self) -> Document; +} diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/v0/transformer.rs new file mode 100644 index 0000000000..aec0832019 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/v0/transformer.rs @@ -0,0 +1,52 @@ +use dpp::block::block_info::BlockInfo; +use dpp::document::{property_names, Document, DocumentV0Setters}; +use dpp::platform_value::Identifier; +use std::sync::Arc; + +use dpp::ProtocolError; +use dpp::state_transition::documents_batch_transition::document_transition::document_transfer_transition::DocumentTransferTransitionV0; +use crate::drive::contract::DataContractFetchInfo; +use crate::state_transition_action::document::documents_batch::document_transition::document_transfer_transition_action::v0::DocumentTransferTransitionActionV0; +use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::{DocumentBaseTransitionAction, DocumentBaseTransitionActionAccessorsV0}; + +impl DocumentTransferTransitionActionV0 { + /// try from borrowed + pub fn try_from_borrowed_document_transfer_transition( + document_transfer_transition: &DocumentTransferTransitionV0, + original_document: Document, + block_info: &BlockInfo, + get_data_contract: impl Fn(Identifier) -> Result, ProtocolError>, + ) -> Result { + let DocumentTransferTransitionV0 { + base, + recipient_owner_id, + .. + } = document_transfer_transition; + let base = + DocumentBaseTransitionAction::from_borrowed_base_transition_with_contract_lookup( + base, + get_data_contract, + )?; + + let mut modified_document = original_document; + + modified_document.set_owner_id(*recipient_owner_id); + + if base.document_type_field_is_required(property_names::TRANSFERRED_AT)? { + modified_document.set_transferred_at(Some(block_info.time_ms)); + } + + if base.document_type_field_is_required(property_names::TRANSFERRED_AT_BLOCK_HEIGHT)? { + modified_document.set_transferred_at_block_height(Some(block_info.height)); + } + + if base.document_type_field_is_required(property_names::TRANSFERRED_AT_CORE_BLOCK_HEIGHT)? { + modified_document.set_transferred_at_core_block_height(Some(block_info.core_height)); + } + + Ok(DocumentTransferTransitionActionV0 { + base, + document: modified_document, + }) + } +} diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/mod.rs index a6fabb8d4e..d5df86cb32 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/mod.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/mod.rs @@ -7,6 +7,8 @@ pub mod document_create_transition_action; pub mod document_delete_transition_action; /// document_replace_transition_action pub mod document_replace_transition_action; +/// document_transfer_transition_action +pub mod document_transfer_transition_action; pub use dpp::state_transition::documents_batch_transition::document_transition::action_type::DocumentTransitionActionType; @@ -17,6 +19,7 @@ use crate::state_transition_action::document::documents_batch::document_transiti use crate::state_transition_action::document::documents_batch::document_transition::document_delete_transition_action::DocumentDeleteTransitionAction; use crate::state_transition_action::document::documents_batch::document_transition::document_replace_transition_action::{DocumentReplaceTransitionAction, DocumentReplaceTransitionActionAccessorsV0}; use crate::state_transition_action::document::documents_batch::document_transition::document_delete_transition_action::v0::DocumentDeleteTransitionActionAccessorsV0; +use crate::state_transition_action::document::documents_batch::document_transition::document_transfer_transition_action::{DocumentTransferTransitionAction, DocumentTransferTransitionActionAccessorsV0}; use crate::state_transition_action::system::bump_identity_data_contract_nonce_action::BumpIdentityDataContractNonceAction; /// version @@ -31,6 +34,8 @@ pub enum DocumentTransitionAction { ReplaceAction(DocumentReplaceTransitionAction), /// delete DeleteAction(DocumentDeleteTransitionAction), + /// transfer + TransferAction(DocumentTransferTransitionAction), /// bump identity data contract nonce BumpIdentityDataContractNonce(BumpIdentityDataContractNonceAction), } @@ -42,6 +47,7 @@ impl DocumentTransitionAction { DocumentTransitionAction::CreateAction(d) => Some(d.base()), DocumentTransitionAction::DeleteAction(d) => Some(d.base()), DocumentTransitionAction::ReplaceAction(d) => Some(d.base()), + DocumentTransitionAction::TransferAction(d) => Some(d.base()), DocumentTransitionAction::BumpIdentityDataContractNonce(_) => None, } } @@ -52,6 +58,7 @@ impl DocumentTransitionAction { DocumentTransitionAction::CreateAction(d) => Some(d.base_owned()), DocumentTransitionAction::DeleteAction(d) => Some(d.base_owned()), DocumentTransitionAction::ReplaceAction(d) => Some(d.base_owned()), + DocumentTransitionAction::TransferAction(d) => Some(d.base_owned()), DocumentTransitionAction::BumpIdentityDataContractNonce(_) => None, } } diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs index f4137d1393..742476740c 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs @@ -39,10 +39,13 @@ impl IdentityCreditWithdrawalTransitionActionV0 { revision: Some(1), created_at: Some(creation_time_ms), updated_at: Some(creation_time_ms), + transferred_at: None, created_at_block_height: None, updated_at_block_height: None, + transferred_at_block_height: None, created_at_core_block_height: None, updated_at_core_block_height: None, + transferred_at_core_block_height: None, } .into(); diff --git a/packages/rs-drive/tests/query_tests.rs b/packages/rs-drive/tests/query_tests.rs index 41d95be2a6..a696c6df34 100644 --- a/packages/rs-drive/tests/query_tests.rs +++ b/packages/rs-drive/tests/query_tests.rs @@ -993,8 +993,8 @@ fn test_family_basic_queries() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 163, 56, 30, 144, 201, 147, 186, 46, 12, 101, 223, 105, 199, 6, 242, 76, 137, 232, 95, 87, - 56, 167, 65, 114, 254, 221, 132, 182, 221, 89, 197, 125, + 90, 210, 2, 14, 207, 220, 54, 103, 243, 153, 202, 228, 38, 19, 30, 201, 119, 135, 210, 26, + 216, 14, 17, 94, 98, 181, 133, 247, 36, 139, 235, 67, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -2305,8 +2305,8 @@ fn test_family_basic_queries() { assert_eq!( root_hash.as_slice(), vec![ - 173, 209, 205, 148, 17, 96, 43, 47, 195, 124, 81, 242, 237, 221, 130, 189, 203, 158, - 19, 6, 217, 19, 231, 186, 70, 66, 1, 105, 7, 78, 245, 63, + 60, 109, 98, 63, 192, 76, 21, 51, 95, 13, 145, 173, 155, 30, 5, 194, 221, 33, 152, 195, + 108, 127, 146, 37, 82, 5, 166, 38, 67, 162, 1, 83, ], ); } @@ -2452,8 +2452,8 @@ fn test_family_starts_at_queries() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 163, 56, 30, 144, 201, 147, 186, 46, 12, 101, 223, 105, 199, 6, 242, 76, 137, 232, 95, 87, - 56, 167, 65, 114, 254, 221, 132, 182, 221, 89, 197, 125, + 90, 210, 2, 14, 207, 220, 54, 103, 243, 153, 202, 228, 38, 19, 30, 201, 119, 135, 210, 26, + 216, 14, 17, 94, 98, 181, 133, 247, 36, 139, 235, 67, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -2894,8 +2894,8 @@ fn test_family_with_nulls_query() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 181, 187, 251, 87, 13, 132, 222, 134, 83, 231, 5, 226, 79, 212, 220, 50, 123, 224, 81, 128, - 27, 149, 15, 194, 46, 48, 208, 157, 77, 175, 92, 246, + 124, 137, 76, 15, 82, 78, 62, 179, 206, 204, 2, 84, 187, 107, 28, 121, 186, 221, 98, 66, + 187, 78, 66, 70, 54, 10, 193, 108, 39, 59, 195, 209, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -3017,8 +3017,8 @@ fn test_query_with_cached_contract() { // Make sure the state is deterministic let expected_app_hash = vec![ - 163, 56, 30, 144, 201, 147, 186, 46, 12, 101, 223, 105, 199, 6, 242, 76, 137, 232, 95, 87, - 56, 167, 65, 114, 254, 221, 132, 182, 221, 89, 197, 125, + 90, 210, 2, 14, 207, 220, 54, 103, 243, 153, 202, 228, 38, 19, 30, 201, 119, 135, 210, 26, + 216, 14, 17, 94, 98, 181, 133, 247, 36, 139, 235, 67, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -3166,8 +3166,8 @@ fn test_dpns_query() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 88, 19, 180, 210, 138, 212, 101, 137, 172, 158, 42, 123, 153, 162, 58, 30, 36, 3, 55, 17, - 211, 254, 39, 224, 94, 181, 43, 18, 198, 24, 197, 20, + 175, 37, 171, 184, 32, 136, 247, 111, 230, 81, 39, 88, 130, 203, 38, 44, 228, 121, 233, + 118, 123, 8, 192, 213, 216, 249, 146, 44, 95, 0, 130, 52, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -3718,8 +3718,8 @@ fn test_dpns_query_start_at() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 88, 19, 180, 210, 138, 212, 101, 137, 172, 158, 42, 123, 153, 162, 58, 30, 36, 3, 55, 17, - 211, 254, 39, 224, 94, 181, 43, 18, 198, 24, 197, 20, + 175, 37, 171, 184, 32, 136, 247, 111, 230, 81, 39, 88, 130, 203, 38, 44, 228, 121, 233, + 118, 123, 8, 192, 213, 216, 249, 146, 44, 95, 0, 130, 52, ]; assert_eq!(root_hash.as_slice(), expected_app_hash,); @@ -3812,8 +3812,8 @@ fn test_dpns_query_start_after() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 88, 19, 180, 210, 138, 212, 101, 137, 172, 158, 42, 123, 153, 162, 58, 30, 36, 3, 55, 17, - 211, 254, 39, 224, 94, 181, 43, 18, 198, 24, 197, 20, + 175, 37, 171, 184, 32, 136, 247, 111, 230, 81, 39, 88, 130, 203, 38, 44, 228, 121, 233, + 118, 123, 8, 192, 213, 216, 249, 146, 44, 95, 0, 130, 52, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -3906,8 +3906,8 @@ fn test_dpns_query_start_at_desc() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 88, 19, 180, 210, 138, 212, 101, 137, 172, 158, 42, 123, 153, 162, 58, 30, 36, 3, 55, 17, - 211, 254, 39, 224, 94, 181, 43, 18, 198, 24, 197, 20, + 175, 37, 171, 184, 32, 136, 247, 111, 230, 81, 39, 88, 130, 203, 38, 44, 228, 121, 233, + 118, 123, 8, 192, 213, 216, 249, 146, 44, 95, 0, 130, 52, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -4000,8 +4000,8 @@ fn test_dpns_query_start_after_desc() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 88, 19, 180, 210, 138, 212, 101, 137, 172, 158, 42, 123, 153, 162, 58, 30, 36, 3, 55, 17, - 211, 254, 39, 224, 94, 181, 43, 18, 198, 24, 197, 20, + 175, 37, 171, 184, 32, 136, 247, 111, 230, 81, 39, 88, 130, 203, 38, 44, 228, 121, 233, + 118, 123, 8, 192, 213, 216, 249, 146, 44, 95, 0, 130, 52, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -4192,8 +4192,8 @@ fn test_dpns_query_start_at_with_null_id() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 16, 77, 89, 81, 202, 42, 156, 156, 114, 212, 3, 107, 144, 120, 108, 241, 67, 12, 234, 138, - 245, 81, 48, 252, 72, 87, 16, 96, 118, 181, 12, 169, + 1, 56, 101, 133, 212, 109, 114, 252, 181, 180, 21, 151, 38, 31, 9, 88, 2, 61, 230, 165, + 228, 57, 90, 132, 94, 38, 166, 89, 44, 13, 49, 115, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -4393,8 +4393,8 @@ fn test_dpns_query_start_after_with_null_id() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 16, 77, 89, 81, 202, 42, 156, 156, 114, 212, 3, 107, 144, 120, 108, 241, 67, 12, 234, 138, - 245, 81, 48, 252, 72, 87, 16, 96, 118, 181, 12, 169, + 1, 56, 101, 133, 212, 109, 114, 252, 181, 180, 21, 151, 38, 31, 9, 88, 2, 61, 230, 165, + 228, 57, 90, 132, 94, 38, 166, 89, 44, 13, 49, 115, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -4598,8 +4598,8 @@ fn test_dpns_query_start_after_with_null_id_desc() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 16, 77, 89, 81, 202, 42, 156, 156, 114, 212, 3, 107, 144, 120, 108, 241, 67, 12, 234, 138, - 245, 81, 48, 252, 72, 87, 16, 96, 118, 181, 12, 169, + 1, 56, 101, 133, 212, 109, 114, 252, 181, 180, 21, 151, 38, 31, 9, 88, 2, 61, 230, 165, + 228, 57, 90, 132, 94, 38, 166, 89, 44, 13, 49, 115, ]; assert_eq!(root_hash.as_slice(), expected_app_hash,); diff --git a/packages/rs-drive/tests/query_tests_history.rs b/packages/rs-drive/tests/query_tests_history.rs index 97e427d4e3..ef1e5528fe 100644 --- a/packages/rs-drive/tests/query_tests_history.rs +++ b/packages/rs-drive/tests/query_tests_history.rs @@ -291,8 +291,8 @@ fn test_query_historical() { assert_eq!( root_hash.as_slice(), vec![ - 181, 185, 108, 50, 217, 141, 128, 232, 165, 226, 95, 0, 177, 127, 230, 52, 238, 131, - 107, 59, 237, 63, 184, 244, 2, 66, 114, 195, 97, 175, 252, 209, + 54, 217, 155, 152, 174, 237, 193, 15, 240, 181, 31, 17, 238, 127, 246, 92, 20, 222, 37, + 39, 104, 146, 240, 98, 159, 130, 29, 227, 5, 94, 69, 207, ] ); @@ -1655,8 +1655,8 @@ fn test_query_historical() { assert_eq!( root_hash.as_slice(), vec![ - 25, 175, 56, 55, 43, 121, 224, 243, 179, 106, 24, 41, 94, 74, 167, 144, 67, 125, 213, - 119, 247, 9, 237, 191, 50, 90, 22, 115, 131, 152, 246, 102 + 117, 239, 44, 103, 118, 107, 30, 109, 225, 15, 234, 90, 59, 0, 22, 79, 32, 4, 94, 225, + 241, 206, 146, 22, 138, 217, 87, 208, 96, 176, 216, 114 ] ); } diff --git a/packages/rs-platform-version/src/version/dpp_versions.rs b/packages/rs-platform-version/src/version/dpp_versions.rs index 4cc28cf36c..5ad6d411ba 100644 --- a/packages/rs-platform-version/src/version/dpp_versions.rs +++ b/packages/rs-platform-version/src/version/dpp_versions.rs @@ -126,6 +126,7 @@ pub struct StateTransitionSerializationVersions { pub document_create_state_transition: DocumentFeatureVersionBounds, pub document_replace_state_transition: DocumentFeatureVersionBounds, pub document_delete_state_transition: DocumentFeatureVersionBounds, + pub document_transfer_state_transition: DocumentFeatureVersionBounds, } #[derive(Clone, Debug, Default)] diff --git a/packages/rs-platform-version/src/version/drive_abci_versions.rs b/packages/rs-platform-version/src/version/drive_abci_versions.rs index 525fab2783..85f045288e 100644 --- a/packages/rs-platform-version/src/version/drive_abci_versions.rs +++ b/packages/rs-platform-version/src/version/drive_abci_versions.rs @@ -109,9 +109,11 @@ pub struct DriveAbciDocumentsStateTransitionValidationVersions { pub document_create_transition_structure_validation: FeatureVersion, pub document_delete_transition_structure_validation: FeatureVersion, pub document_replace_transition_structure_validation: FeatureVersion, + pub document_transfer_transition_structure_validation: FeatureVersion, pub document_create_transition_state_validation: FeatureVersion, pub document_delete_transition_state_validation: FeatureVersion, pub document_replace_transition_state_validation: FeatureVersion, + pub document_transfer_transition_state_validation: FeatureVersion, } #[derive(Clone, Debug, Default)] diff --git a/packages/rs-platform-version/src/version/drive_versions.rs b/packages/rs-platform-version/src/version/drive_versions.rs index bc985e87ef..3b60847394 100644 --- a/packages/rs-platform-version/src/version/drive_versions.rs +++ b/packages/rs-platform-version/src/version/drive_versions.rs @@ -300,6 +300,7 @@ pub struct DriveDocumentIndexUniquenessMethodVersions { pub validate_document_uniqueness: FeatureVersion, pub validate_document_create_transition_action_uniqueness: FeatureVersion, pub validate_document_replace_transition_action_uniqueness: FeatureVersion, + pub validate_document_transfer_transition_action_uniqueness: FeatureVersion, pub validate_uniqueness_of_data: FeatureVersion, } diff --git a/packages/rs-platform-version/src/version/mocks/v2_test.rs b/packages/rs-platform-version/src/version/mocks/v2_test.rs index 6d6e27f9f9..0fc8a1d44b 100644 --- a/packages/rs-platform-version/src/version/mocks/v2_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v2_test.rs @@ -201,6 +201,7 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { validate_document_uniqueness: 0, validate_document_create_transition_action_uniqueness: 0, validate_document_replace_transition_action_uniqueness: 0, + validate_document_transfer_transition_action_uniqueness: 0, validate_uniqueness_of_data: 0, }, }, @@ -693,9 +694,11 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { document_create_transition_structure_validation: 0, document_delete_transition_structure_validation: 0, document_replace_transition_structure_validation: 0, + document_transfer_transition_structure_validation: 0, document_create_transition_state_validation: 0, document_delete_transition_state_validation: 0, document_replace_transition_state_validation: 0, + document_transfer_transition_state_validation: 0, }, }, process_state_transition: 0, @@ -901,6 +904,13 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { default_current_version: 0, }, }, + document_transfer_state_transition: DocumentFeatureVersionBounds { + bounds: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + }, }, state_transition_conversion_versions: StateTransitionConversionVersions { identity_to_identity_create_transition: 0, diff --git a/packages/rs-platform-version/src/version/mocks/v3_test.rs b/packages/rs-platform-version/src/version/mocks/v3_test.rs index 5ae94aac34..895c831cfd 100644 --- a/packages/rs-platform-version/src/version/mocks/v3_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v3_test.rs @@ -209,6 +209,7 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { validate_document_uniqueness: 0, validate_document_create_transition_action_uniqueness: 0, validate_document_replace_transition_action_uniqueness: 0, + validate_document_transfer_transition_action_uniqueness: 0, validate_uniqueness_of_data: 0, }, }, @@ -693,9 +694,11 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { document_create_transition_structure_validation: 0, document_delete_transition_structure_validation: 0, document_replace_transition_structure_validation: 0, + document_transfer_transition_structure_validation: 0, document_create_transition_state_validation: 0, document_delete_transition_state_validation: 0, document_replace_transition_state_validation: 0, + document_transfer_transition_state_validation: 0, }, }, process_state_transition: 0, @@ -901,6 +904,13 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { default_current_version: 0, }, }, + document_transfer_state_transition: DocumentFeatureVersionBounds { + bounds: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + }, }, state_transition_conversion_versions: StateTransitionConversionVersions { identity_to_identity_create_transition: 0, diff --git a/packages/rs-platform-version/src/version/v1.rs b/packages/rs-platform-version/src/version/v1.rs index bde06330eb..28ec40451d 100644 --- a/packages/rs-platform-version/src/version/v1.rs +++ b/packages/rs-platform-version/src/version/v1.rs @@ -200,6 +200,7 @@ pub const PLATFORM_V1: PlatformVersion = PlatformVersion { validate_document_uniqueness: 0, validate_document_create_transition_action_uniqueness: 0, validate_document_replace_transition_action_uniqueness: 0, + validate_document_transfer_transition_action_uniqueness: 0, validate_uniqueness_of_data: 0, }, }, @@ -692,9 +693,11 @@ pub const PLATFORM_V1: PlatformVersion = PlatformVersion { document_create_transition_structure_validation: 0, document_delete_transition_structure_validation: 0, document_replace_transition_structure_validation: 0, + document_transfer_transition_structure_validation: 0, document_create_transition_state_validation: 0, document_delete_transition_state_validation: 0, document_replace_transition_state_validation: 0, + document_transfer_transition_state_validation: 0, }, }, process_state_transition: 0, @@ -900,6 +903,13 @@ pub const PLATFORM_V1: PlatformVersion = PlatformVersion { default_current_version: 0, }, }, + document_transfer_state_transition: DocumentFeatureVersionBounds { + bounds: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + }, }, state_transition_conversion_versions: StateTransitionConversionVersions { identity_to_identity_create_transition: 0, diff --git a/packages/rs-sdk/src/platform/transition.rs b/packages/rs-sdk/src/platform/transition.rs index 6b9f8ac2e7..8fc11eba4e 100644 --- a/packages/rs-sdk/src/platform/transition.rs +++ b/packages/rs-sdk/src/platform/transition.rs @@ -8,6 +8,7 @@ pub mod put_document; pub mod put_identity; pub mod put_settings; pub mod top_up_identity; +mod transfer_document; mod txid; pub mod withdraw_from_identity; diff --git a/packages/rs-sdk/src/platform/transition/transfer_document.rs b/packages/rs-sdk/src/platform/transition/transfer_document.rs new file mode 100644 index 0000000000..140a6e3166 --- /dev/null +++ b/packages/rs-sdk/src/platform/transition/transfer_document.rs @@ -0,0 +1,174 @@ +use crate::platform::transition::broadcast_request::BroadcastRequestForStateTransition; +use std::sync::Arc; + +use crate::{Error, Sdk}; + +use crate::platform::block_info_from_metadata::block_info_from_metadata; +use crate::platform::transition::put_settings::PutSettings; +use crate::platform::Identifier; +use dapi_grpc::platform::VersionedGrpcResponse; +use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; +use dpp::data_contract::document_type::DocumentType; +use dpp::data_contract::DataContract; +use dpp::document::{Document, DocumentV0Getters}; +use dpp::identity::signer::Signer; +use dpp::identity::IdentityPublicKey; +use dpp::state_transition::documents_batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; +use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; +use dpp::state_transition::proof_result::StateTransitionProofResult; +use dpp::state_transition::StateTransition; +use drive::drive::Drive; +use rs_dapi_client::{DapiRequest, RequestSettings}; + +#[async_trait::async_trait] +/// A trait for transferring a document on Platform +pub trait TransferDocument { + /// Transfers a document on platform + /// Setting settings to `None` sets default connection behavior + async fn transfer_document_to_identity( + &self, + recipient_id: Identifier, + sdk: &Sdk, + document_type: DocumentType, + identity_public_key: IdentityPublicKey, + signer: &S, + settings: Option, + ) -> Result; + + /// Waits for the response of a state transition after it has been broadcast + async fn wait_for_response( + &self, + sdk: &Sdk, + state_transition: StateTransition, + data_contract: Arc, + ) -> Result; + + /// Transfers a document on platform and waits for the response + async fn transfer_document_to_identity_and_wait_for_response( + &self, + recipient_id: Identifier, + sdk: &Sdk, + document_type: DocumentType, + identity_public_key: IdentityPublicKey, + data_contract: Arc, + signer: &S, + ) -> Result; +} + +#[async_trait::async_trait] +impl TransferDocument for Document { + async fn transfer_document_to_identity( + &self, + recipient_id: Identifier, + sdk: &Sdk, + document_type: DocumentType, + identity_public_key: IdentityPublicKey, + signer: &S, + settings: Option, + ) -> Result { + let new_identity_contract_nonce = sdk + .get_identity_contract_nonce( + self.owner_id(), + document_type.data_contract_id(), + true, + settings, + ) + .await?; + + let settings = settings.unwrap_or_default(); + + let transition = DocumentsBatchTransition::new_document_transfer_transition_from_document( + self.clone(), + document_type.as_ref(), + recipient_id, + &identity_public_key, + new_identity_contract_nonce, + settings.user_fee_increase.unwrap_or_default(), + signer, + sdk.version(), + None, + None, + None, + )?; + + let request = transition.broadcast_request_for_state_transition()?; + + request + .clone() + .execute(sdk, settings.request_settings) + .await?; + + // response is empty for a broadcast, result comes from the stream wait for state transition result + + Ok(transition) + } + + async fn wait_for_response( + &self, + sdk: &Sdk, + state_transition: StateTransition, + data_contract: Arc, + ) -> Result { + let request = state_transition.wait_for_state_transition_result_request()?; + + let response = request.execute(sdk, RequestSettings::default()).await?; + + let block_info = block_info_from_metadata(response.metadata()?)?; + + let proof = response.proof_owned()?; + + let (_, result) = Drive::verify_state_transition_was_executed_with_proof( + &state_transition, + &block_info, + proof.grovedb_proof.as_slice(), + &|_| Ok(Some(data_contract.clone())), + sdk.version(), + )?; + + match result { + StateTransitionProofResult::VerifiedDocuments(mut documents) => { + let document = documents + .remove(self.id_ref()) + .ok_or(Error::InvalidProvedResponse( + "did not prove the sent document".to_string(), + ))? + .ok_or(Error::InvalidProvedResponse( + "expected there to actually be a document".to_string(), + ))?; + Ok(document) + } + _ => Err(Error::DapiClientError("proved a non document".to_string())), + } + } + + async fn transfer_document_to_identity_and_wait_for_response( + &self, + recipient_id: Identifier, + sdk: &Sdk, + document_type: DocumentType, + identity_public_key: IdentityPublicKey, + data_contract: Arc, + signer: &S, + ) -> Result { + let state_transition = self + .transfer_document_to_identity( + recipient_id, + sdk, + document_type, + identity_public_key, + signer, + None, + ) + .await?; + + let document = >::wait_for_response( + self, + sdk, + state_transition, + data_contract, + ) + .await?; + + Ok(document) + } +} diff --git a/packages/rs-sdk/tests/vectors/document_list_document_query/msg_2024-04-05T09:03:09.937284721Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/document_list_document_query/msg_2024-04-20T17:32:57.729547000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json similarity index 96% rename from packages/rs-sdk/tests/vectors/document_list_document_query/msg_2024-04-05T09:03:09.937284721Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json rename to packages/rs-sdk/tests/vectors/document_list_document_query/msg_2024-04-20T17:32:57.729547000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json index 98922ba3d4296d8ef41369823a16b2eae2884878..0528f564cf7e762ed8d49371c89b999bbd16f7ed 100644 GIT binary patch delta 1936 zcmZWqO>9(E6wZA!(@uxB@7^~9Q`_l#Z_rE-N_ao>(;A{KDuE~kjfMpYg*0xYFf3S7 zC@U9esX2*;`9XrHk)6_&$dSn&hTqbXyD5d@cS8IS(rjordB!Xh6{ z2qzPGm4TG|pMQbp^Mejy)5A7JJ8w#^w+of=!JG=8ynLi zpi9YqU0NBXGB4zWLj#i$477Y+UQWdwL!-d8lz7nyJi63nQ>snUQ|%VjlHIg-yG5V5 zlI~S4s@^trSAb*DBy)@8BPOnS79EpUMq}%-G@F!Ee@*dWG)LoO$`~r~avDr*NMkkU zOS)K)e4zsezXQZPs!z|pqIjlV$XF0o=yAg4`A$srKXhqsSkebc)x`HBeRB1<%mn^m z3$&PH;Vp-{wN zCbscz3rtVpsGf$rkJZ)PQrr;q=$@ntJ0;)M0(*Ni@bE&)586i2r$fVbR7@Ad?S@~X zcV2S!BcIS%|LiJmbP1F13K*#3^ISsMe89!h^$cml<4ruS@cq=#J~!Rx2HN z8Ud{Drf^ji;Q?lc_&EzGG+;9ARWPdP{&A_*t@6bdAd2DI`F*XNJbjyqj3Ar&IRXfI z)J46K1LrRf#qXk79i{ZUi~ zwDg3ngF^9EI2NKA;zL>C>OrW!&7%8NGm6z_@Bl@NYn{S;63SiMaj^x_!7|@!LnA=L z;(pYQxYI7!Kh^|GPryCB0VH@+`2>I;Ycj zoTkmMV-lkj@IzaSXh$w|;=@&+QFIU=A*}%&+&XAZ;akTmdTt#wntn;{Cn|CcLdc2c zrFuabMUNjKO`{Li-i^9|iu@J$WjYjh4X;A}V!zJ1Ss{=cgM1nUXong>$UE|4*FTd8 B_rU-F delta 1745 zcmZuxU2GIp7|os8?zYHw?wxLzW!vt|5;P#y?##|^caZ=l^(UmJeGp?%X-$0KL7*li zDi0Qk0b_zizL?L%rpSZF1d1i7B*Z{TjcFiKOf*1@v^5FOHhso@{ zbH97O^PO`JP9;XB5)-Q}JE}#r##&`}mm+%3dSpphE_HX;f_f0p0qaStQa$;Tb@v~> zQBa0Qnv_d#qzpfAE6vY#VChUo=}Z`eolE@x{DNwU?z9!`5JgYy^LZwxGz}IE4>u`8 z{uP&o(wY-XQDr2Jm6>U6hvhPj9rt)cT4@#X%UTurW;3q%!@}X0Y)um%8#?xZq0v!? zMtU{(G%EMhoUL|PG~eg&QIw;(?=+2G(pFgF)G}41Te}<@P8fO}s9yo#m0?(0gtfdF ze3?%?pnU4|-yjfGJs`;3$j2)CiekzAkn^NHC zZW7f8T)fF9?*M^z7zTVUr9A3#ac-}seGQtsS}~lze24n-E_EhAXjrCVyHCw)fH99M zLo!1d7;j18Z6tw*p9YQrM{{-=j`ttcR=LXOT;e?!_@#;iumiS zD$t`jhYmCvzS4$L`whSxZqzYNY=d#`@?#41se_I>VDU-NocW(w)>yaV(#do)zXueU zeT$0t(jki;Y*2wp3) z5tZ_mtm-BimZ*(ClkV0fGc*@Npq(i7f8`b+Z7AT#C7&JFoiGlyEsKZNvMV%A&zI4Q8ed4drx9bv&xr zDRJ=aen-=6muuA{I(@{mf-*19LcR|-y1X-iLccZ`8h_eI55}rh_&RcdhMNpbiG#R* zFb^A)7n2dy>9vGs2T+)(u2<%^Rq8oV%g+s9=az9*nU6K2+Rb+BfEzZIK(gDgg(N4&+x4ZXJE z%{kS=+f&fttsGR1us3@>%ER#+MYxp|borLCqB?Js#FV5E2fMU00f|6qaF&)((log* Q7J?PkL{C0%E2>rh0@2#u8vp=xp>U`y=sFJ4vl+( zGEwZ)@HrL=dlkOwQdlY0I2qPh4V##$Q}9O=hI#RqEeh>%jZvN(AJB;tIqtLG7YDL6 zV*DNEm+you%<+IcxUn|_7duQ0cP78PAJQ0Oq16VBe*Uf(E1WC0@E)7~u|(rigF-{4 z#*=z&ghMdh0922OKMHwgE&J(KI1}LG{XR1#iW_-;JmgR(ax^|^*Erje?4gwd&$0hUr5e|p zi8#R(ph}vOJ>TNlu?A&CVpuCJVfzaEIP!j1d-zn>XbctcB9>V9Ys@#8xD(L$d;D|k zU!b~OO_&HnLSDBkjQA9;^Zi=4iMXwCxJu(-MB{C8A#)1PgRb)0_>^tOi!99Y`%>4B zCDzf*LO_?o484a#UzgUxBe>qQH(|+bE5X%4zkI~FZXLq5bb8ZpJw}_R$;e4{1h@T z2&9~#CT{<&TH~$l%7c5A(zUl)7^9=kvW77C#V+NEQ)ZgW%Yd(dt+Vb)s^XVU(@Tn5 z?G{83;?8N-yvFChrpZt8?ggHmr#cQ$#mn6)G1fX|c(Pk9C+|G;LZwJFgpYUnt#Gg? zE%1*Y(iE@oV}LS{T8lN7m$vfS=aBJ|WaLaRYL3v=3%qxbsvqU-%`83CW_mWHiwxJn zVoAUV#!%Sd_w-Rk#KhAQT2w4TBk2$GC{kY=Vr+K z1aqX4Ivb-`C1xioGSt6EV8FKULIyb(hW3Hz= zSn@OYLfBCh5VxhcXzfk zyNIh=re5hwo|7y&L*b72EHnqr)F7Ms$+0oX*t$dydfS!e$ZWMR!05PHqW`DK@+fp} zK*o^-k?OKrkMl;ER64xEMVeP@5m) znjZ3X9LmUYyRekj3sKo%WN630i8M5Q^=-p^Z%@q-aX^rX+~jqf^3|D-L*j qYJz;ola+g@D#rGMdaiw&#^Ri^7UW-+NM$nXuF){%$tH&OJAVSKP9P!x delta 2246 zcmYjTU2Icj7!EB00`7d@sY=4Sp3_a{Si1FhYs=Pdz&6L)tqexy*0I5zaWJ^yLLD1= zX&6JE3ojgO7etJ}Fe!;q*+xu^7Z^bk6OG387TM4{(eUH*o)Y4craeF3`#taT^M3na zVa?fvHJ^P_?v5p5__Vyn9S_CuQ+eISNHi3WC&I~a7@NHvu7*bRdEYvhGq7C4Pm_V; zIaL_5UUI>*G`{s4{8l)aQiTz#cWq&*YU>893~H3|X*#DdUZ-)gjc?@@R@`uWDZ^u*iHSM` zUxc}HM7iQgj3;dvof=

    6Shdm)bR!S`|*Qmz({{MXK&+EiAHn^{|$9Sjj+BT3$0y zzTLz-T)NC9f?}#oBS&&x?$KBzNQ1xgd=_nywd}u%CBvBMu`m+X1gufpuW*!Y)^qtk zubY^v)R-GkWYNS)GPyZWYHB8R7!91-ZFqzBdEGUWMwvDLyEfl{q8-J~$u zr|?U&!ZmU>H=yx2W#BQP-L5t9N4q>TP?pztGp6{y#@BHhp?xHW7%Bo(lr_WvN7-(W zYTh8BGbHnQV)k|r|4?b|JlpQvqYI<4A6@L*#HvmCso_N0L^fsOW-k?LRCt*6V4~7+ z8k7PTYK3+W#)F0{8NubSg{`#6Z@V;X;?7kmwD7ZjKj|bF$GS>Au%~lfq=C1-8zSrc zzLF`up6fJNRXZ-aK}hc>UwaNK#JR3VIMtZvmdDxKbcMzV$}$$xSoLWvlfM@eB@K@6 zdM=!X=3j%1f5B(b`pydY1l>6G2MO($XS@+a}0V7|m>GTw6ZkFk%%*~Dpz zBbj_ePfLbIST7?0IVqVRcbG$L!E0lcYm2QuWC+yeK0O`IfD$N0>TK<%%}A?kb%EFN zT}y2xf_W}ks4?*>ttwnfve=(f+TU$E97?~#9CR7Bay4T(HkOgHx3kQV_bOv2zRK^9 zJNyermso3nyx(^8E72ekkawpY=@a<1-E!KxIlaIzK09n+8MlUmI?0*ofTPEx3Nb>kRc4awZK6mqluDw4Zzu#3bk7 zLkcYU?4b@b1iDNj=0eIHZir!Jn}r;`9Q1qeH}#O2w#v+kb{7wFJ#&Azy#(Mo$-OBa zrwN73X7CAVy41uSirVtPhB@nU<9-$+eGE zb#o+2yccQL1B1$)h?k_$LycH!Fma69g|eiuTT?gYiR&b@>sfPwGI*;!C??sEk4I0d z2V=~h95?rN@LkIHu+nt=wuMs2$v(swJUpve74c_hhUOz-m_mJ*J` H!=e8G;A;B9 diff --git a/packages/rs-sdk/tests/vectors/document_list_document_query/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json b/packages/rs-sdk/tests/vectors/document_list_document_query/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json deleted file mode 100644 index 6eaf11a788..0000000000 --- a/packages/rs-sdk/tests/vectors/document_list_document_query/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json +++ /dev/null @@ -1 +0,0 @@ -[173,50,8,34,25,140,227,142,53,135,194,216,242,27,172,247,219,172,219,175,172,23,135,155,49,211,157,167,27,158,0,180,152,206,45,235,171,83,75,48,116,32,125,175,252,120,93,39] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/document_list_document_query/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/document_list_document_query/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json new file mode 100644 index 0000000000..7f0850a40d --- /dev/null +++ b/packages/rs-sdk/tests/vectors/document_list_document_query/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json @@ -0,0 +1 @@ +[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/document_read/msg_2024-04-05T09:03:09.943356025Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/document_list_drive_query/msg_2024-04-20T17:32:57.734304000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json similarity index 96% rename from packages/rs-sdk/tests/vectors/document_read/msg_2024-04-05T09:03:09.943356025Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json rename to packages/rs-sdk/tests/vectors/document_list_drive_query/msg_2024-04-20T17:32:57.734304000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json index 98922ba3d4296d8ef41369823a16b2eae2884878..0528f564cf7e762ed8d49371c89b999bbd16f7ed 100644 GIT binary patch delta 1936 zcmZWqO>9(E6wZA!(@uxB@7^~9Q`_l#Z_rE-N_ao>(;A{KDuE~kjfMpYg*0xYFf3S7 zC@U9esX2*;`9XrHk)6_&$dSn&hTqbXyD5d@cS8IS(rjordB!Xh6{ z2qzPGm4TG|pMQbp^Mejy)5A7JJ8w#^w+of=!JG=8ynLi zpi9YqU0NBXGB4zWLj#i$477Y+UQWdwL!-d8lz7nyJi63nQ>snUQ|%VjlHIg-yG5V5 zlI~S4s@^trSAb*DBy)@8BPOnS79EpUMq}%-G@F!Ee@*dWG)LoO$`~r~avDr*NMkkU zOS)K)e4zsezXQZPs!z|pqIjlV$XF0o=yAg4`A$srKXhqsSkebc)x`HBeRB1<%mn^m z3$&PH;Vp-{wN zCbscz3rtVpsGf$rkJZ)PQrr;q=$@ntJ0;)M0(*Ni@bE&)586i2r$fVbR7@Ad?S@~X zcV2S!BcIS%|LiJmbP1F13K*#3^ISsMe89!h^$cml<4ruS@cq=#J~!Rx2HN z8Ud{Drf^ji;Q?lc_&EzGG+;9ARWPdP{&A_*t@6bdAd2DI`F*XNJbjyqj3Ar&IRXfI z)J46K1LrRf#qXk79i{ZUi~ zwDg3ngF^9EI2NKA;zL>C>OrW!&7%8NGm6z_@Bl@NYn{S;63SiMaj^x_!7|@!LnA=L z;(pYQxYI7!Kh^|GPryCB0VH@+`2>I;Ycj zoTkmMV-lkj@IzaSXh$w|;=@&+QFIU=A*}%&+&XAZ;akTmdTt#wntn;{Cn|CcLdc2c zrFuabMUNjKO`{Li-i^9|iu@J$WjYjh4X;A}V!zJ1Ss{=cgM1nUXong>$UE|4*FTd8 B_rU-F delta 1745 zcmZuxU2GIp7|os8?zYHw?wxLzW!vt|5;P#y?##|^caZ=l^(UmJeGp?%X-$0KL7*li zDi0Qk0b_zizL?L%rpSZF1d1i7B*Z{TjcFiKOf*1@v^5FOHhso@{ zbH97O^PO`JP9;XB5)-Q}JE}#r##&`}mm+%3dSpphE_HX;f_f0p0qaStQa$;Tb@v~> zQBa0Qnv_d#qzpfAE6vY#VChUo=}Z`eolE@x{DNwU?z9!`5JgYy^LZwxGz}IE4>u`8 z{uP&o(wY-XQDr2Jm6>U6hvhPj9rt)cT4@#X%UTurW;3q%!@}X0Y)um%8#?xZq0v!? zMtU{(G%EMhoUL|PG~eg&QIw;(?=+2G(pFgF)G}41Te}<@P8fO}s9yo#m0?(0gtfdF ze3?%?pnU4|-yjfGJs`;3$j2)CiekzAkn^NHC zZW7f8T)fF9?*M^z7zTVUr9A3#ac-}seGQtsS}~lze24n-E_EhAXjrCVyHCw)fH99M zLo!1d7;j18Z6tw*p9YQrM{{-=j`ttcR=LXOT;e?!_@#;iumiS zD$t`jhYmCvzS4$L`whSxZqzYNY=d#`@?#41se_I>VDU-NocW(w)>yaV(#do)zXueU zeT$0t(jki;Y*2wp3) z5tZ_mtm-BimZ*(ClkV0fGc*@Npq(i7f8`b+Z7AT#C7&JFoiGlyEsKZNvMV%A&zI4Q8ed4drx9bv&xr zDRJ=aen-=6muuA{I(@{mf-*19LcR|-y1X-iLccZ`8h_eI55}rh_&RcdhMNpbiG#R* zFb^A)7n2dy>9vGs2T+)(u2<%^Rq8oV%g+s9=az9*nU6K2+Rb+BfEzZIK(gDgg(N4&+x4ZXJE z%{kS=+f&fttsGR1us3@>%ER#+MYxp|borLCqB?Js#FV5E2fMU00f|6qaF&)((log* Q7J?PkL{C0%E2>rh0@2#u8vp=xp>U`y=sFJ4vl+( zGEwZ)@HrL=dlkOwQdlY0I2qPh4V##$Q}9O=hI#RqEeh>%jZvN(AJB;tIqtLG7YDL6 zV*DNEm+you%<+IcxUn|_7duQ0cP78PAJQ0Oq16VBe*Uf(E1WC0@E)7~u|(rigF-{4 z#*=z&ghMdh0922OKMHwgE&J(KI1}LG{XR1#iW_-;JmgR(ax^|^*Erje?4gwd&$0hUr5e|p zi8#R(ph}vOJ>TNlu?A&CVpuCJVfzaEIP!j1d-zn>XbctcB9>V9Ys@#8xD(L$d;D|k zU!b~OO_&HnLSDBkjQA9;^Zi=4iMXwCxJu(-MB{C8A#)1PgRb)0_>^tOi!99Y`%>4B zCDzf*LO_?o484a#UzgUxBe>qQH(|+bE5X%4zkI~FZXLq5bb8ZpJw}_R$;e4{1h@T z2&9~#CT{<&TH~$l%7c5A(zUl)7^9=kvW77C#V+NEQ)ZgW%Yd(dt+Vb)s^XVU(@Tn5 z?G{83;?8N-yvFChrpZt8?ggHmr#cQ$#mn6)G1fX|c(Pk9C+|G;LZwJFgpYUnt#Gg? zE%1*Y(iE@oV}LS{T8lN7m$vfS=aBJ|WaLaRYL3v=3%qxbsvqU-%`83CW_mWHiwxJn zVoAUV#!%Sd_w-Rk#KhAQT2w4TBk2$GC{kY=Vr+K z1aqX4Ivb-`C1xioGSt6EV8FKULIyb(hW3Hz= zSn@OYLfBCh5VxhcXzfk zyNIh=re5hwo|7y&L*b72EHnqr)F7Ms$+0oX*t$dydfS!e$ZWMR!05PHqW`DK@+fp} zK*o^-k?OKrkMl;ER64xEMVeP@5m) znjZ3X9LmUYyRekj3sKo%WN630i8M5Q^=-p^Z%@q-aX^rX+~jqf^3|D-L*j qYJz;ola+g@D#rGMdaiw&#^Ri^7UW-+NM$nXuF){%$tH&OJAVSKP9P!x delta 2246 zcmYjTU2Icj7!EB00`7d@sY=4Sp3_a{Si1FhYs=Pdz&6L)tqexy*0I5zaWJ^yLLD1= zX&6JE3ojgO7etJ}Fe!;q*+xu^7Z^bk6OG387TM4{(eUH*o)Y4craeF3`#taT^M3na zVa?fvHJ^P_?v5p5__Vyn9S_CuQ+eISNHi3WC&I~a7@NHvu7*bRdEYvhGq7C4Pm_V; zIaL_5UUI>*G`{s4{8l)aQiTz#cWq&*YU>893~H3|X*#DdUZ-)gjc?@@R@`uWDZ^u*iHSM` zUxc}HM7iQgj3;dvof=

    6Shdm)bR!S`|*Qmz({{MXK&+EiAHn^{|$9Sjj+BT3$0y zzTLz-T)NC9f?}#oBS&&x?$KBzNQ1xgd=_nywd}u%CBvBMu`m+X1gufpuW*!Y)^qtk zubY^v)R-GkWYNS)GPyZWYHB8R7!91-ZFqzBdEGUWMwvDLyEfl{q8-J~$u zr|?U&!ZmU>H=yx2W#BQP-L5t9N4q>TP?pztGp6{y#@BHhp?xHW7%Bo(lr_WvN7-(W zYTh8BGbHnQV)k|r|4?b|JlpQvqYI<4A6@L*#HvmCso_N0L^fsOW-k?LRCt*6V4~7+ z8k7PTYK3+W#)F0{8NubSg{`#6Z@V;X;?7kmwD7ZjKj|bF$GS>Au%~lfq=C1-8zSrc zzLF`up6fJNRXZ-aK}hc>UwaNK#JR3VIMtZvmdDxKbcMzV$}$$xSoLWvlfM@eB@K@6 zdM=!X=3j%1f5B(b`pydY1l>6G2MO($XS@+a}0V7|m>GTw6ZkFk%%*~Dpz zBbj_ePfLbIST7?0IVqVRcbG$L!E0lcYm2QuWC+yeK0O`IfD$N0>TK<%%}A?kb%EFN zT}y2xf_W}ks4?*>ttwnfve=(f+TU$E97?~#9CR7Bay4T(HkOgHx3kQV_bOv2zRK^9 zJNyermso3nyx(^8E72ekkawpY=@a<1-E!KxIlaIzK09n+8MlUmI?0*ofTPEx3Nb>kRc4awZK6mqluDw4Zzu#3bk7 zLkcYU?4b@b1iDNj=0eIHZir!Jn}r;`9Q1qeH}#O2w#v+kb{7wFJ#&Azy#(Mo$-OBa zrwN73X7CAVy41uSirVtPhB@nU<9-$+eGE zb#o+2yccQL1B1$)h?k_$LycH!Fma69g|eiuTT?gYiR&b@>sfPwGI*;!C??sEk4I0d z2V=~h95?rN@LkIHu+nt=wuMs2$v(swJUpve74c_hhUOz-m_mJ*J` H!=e8G;A;B9 diff --git a/packages/rs-sdk/tests/vectors/document_list_drive_query/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json b/packages/rs-sdk/tests/vectors/document_list_drive_query/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json deleted file mode 100644 index 6eaf11a788..0000000000 --- a/packages/rs-sdk/tests/vectors/document_list_drive_query/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json +++ /dev/null @@ -1 +0,0 @@ -[173,50,8,34,25,140,227,142,53,135,194,216,242,27,172,247,219,172,219,175,172,23,135,155,49,211,157,167,27,158,0,180,152,206,45,235,171,83,75,48,116,32,125,175,252,120,93,39] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/document_list_drive_query/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/document_list_drive_query/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json new file mode 100644 index 0000000000..7f0850a40d --- /dev/null +++ b/packages/rs-sdk/tests/vectors/document_list_drive_query/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json @@ -0,0 +1 @@ +[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/document_read_no_document/msg_2024-04-05T09:03:09.937048727Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/document_read/msg_2024-04-20T17:32:57.732862000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json similarity index 96% rename from packages/rs-sdk/tests/vectors/document_read_no_document/msg_2024-04-05T09:03:09.937048727Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json rename to packages/rs-sdk/tests/vectors/document_read/msg_2024-04-20T17:32:57.732862000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json index 98922ba3d4296d8ef41369823a16b2eae2884878..0528f564cf7e762ed8d49371c89b999bbd16f7ed 100644 GIT binary patch delta 1936 zcmZWqO>9(E6wZA!(@uxB@7^~9Q`_l#Z_rE-N_ao>(;A{KDuE~kjfMpYg*0xYFf3S7 zC@U9esX2*;`9XrHk)6_&$dSn&hTqbXyD5d@cS8IS(rjordB!Xh6{ z2qzPGm4TG|pMQbp^Mejy)5A7JJ8w#^w+of=!JG=8ynLi zpi9YqU0NBXGB4zWLj#i$477Y+UQWdwL!-d8lz7nyJi63nQ>snUQ|%VjlHIg-yG5V5 zlI~S4s@^trSAb*DBy)@8BPOnS79EpUMq}%-G@F!Ee@*dWG)LoO$`~r~avDr*NMkkU zOS)K)e4zsezXQZPs!z|pqIjlV$XF0o=yAg4`A$srKXhqsSkebc)x`HBeRB1<%mn^m z3$&PH;Vp-{wN zCbscz3rtVpsGf$rkJZ)PQrr;q=$@ntJ0;)M0(*Ni@bE&)586i2r$fVbR7@Ad?S@~X zcV2S!BcIS%|LiJmbP1F13K*#3^ISsMe89!h^$cml<4ruS@cq=#J~!Rx2HN z8Ud{Drf^ji;Q?lc_&EzGG+;9ARWPdP{&A_*t@6bdAd2DI`F*XNJbjyqj3Ar&IRXfI z)J46K1LrRf#qXk79i{ZUi~ zwDg3ngF^9EI2NKA;zL>C>OrW!&7%8NGm6z_@Bl@NYn{S;63SiMaj^x_!7|@!LnA=L z;(pYQxYI7!Kh^|GPryCB0VH@+`2>I;Ycj zoTkmMV-lkj@IzaSXh$w|;=@&+QFIU=A*}%&+&XAZ;akTmdTt#wntn;{Cn|CcLdc2c zrFuabMUNjKO`{Li-i^9|iu@J$WjYjh4X;A}V!zJ1Ss{=cgM1nUXong>$UE|4*FTd8 B_rU-F delta 1745 zcmZuxU2GIp7|os8?zYHw?wxLzW!vt|5;P#y?##|^caZ=l^(UmJeGp?%X-$0KL7*li zDi0Qk0b_zizL?L%rpSZF1d1i7B*Z{TjcFiKOf*1@v^5FOHhso@{ zbH97O^PO`JP9;XB5)-Q}JE}#r##&`}mm+%3dSpphE_HX;f_f0p0qaStQa$;Tb@v~> zQBa0Qnv_d#qzpfAE6vY#VChUo=}Z`eolE@x{DNwU?z9!`5JgYy^LZwxGz}IE4>u`8 z{uP&o(wY-XQDr2Jm6>U6hvhPj9rt)cT4@#X%UTurW;3q%!@}X0Y)um%8#?xZq0v!? zMtU{(G%EMhoUL|PG~eg&QIw;(?=+2G(pFgF)G}41Te}<@P8fO}s9yo#m0?(0gtfdF ze3?%?pnU4|-yjfGJs`;3$j2)CiekzAkn^NHC zZW7f8T)fF9?*M^z7zTVUr9A3#ac-}seGQtsS}~lze24n-E_EhAXjrCVyHCw)fH99M zLo!1d7;j18Z6tw*p9YQrM{{-=j`ttcR=LXOT;e?!_@#;iumiS zD$t`jhYmCvzS4$L`whSxZqzYNY=d#`@?#41se_I>VDU-NocW(w)>yaV(#do)zXueU zeT$0t(jki;Y*2wp3) z5tZ_mtm-BimZ*(ClkV0fGc*@Npq(i7f8`b+Z7AT#C7&JFoiGlyEsKZNvMV%A&zI4Q8ed4drx9bv&xr zDRJ=aen-=6muuA{I(@{mf-*19LcR|-y1X-iLccZ`8h_eI55}rh_&RcdhMNpbiG#R* zFb^A)7n2dy>9vGs2T+)(u2<%^Rq8oV%g+s9=az9*nU6K2+Rb+BfEzZIK(gDgg(N4&+x4ZXJE z%{kS=+f&fttsGR1us3@>%ER#+MYxp|borLCqB?Js#FV5E2fMU00f|6qaF&)((log* Q7J?PkL{C0%E2>rh0@2#u8vp=xp>U`y=sFJ4vl+( zGEwZ)@HrL=dlkOwQdlY0I2qPh4V##$Q}9O=hI#RqEeh>%jZvN(AJB;tIqtLG7YDL6 zV*DNEm+you%<+IcxUn|_7duQ0cP78PAJQ0Oq16VBe*Uf(E1WC0@E)7~u|(rigF-{4 z#*=z&ghMdh0922OKMHwgE&J(KI1}LG{XR1#iW_-;JmgR(ax^|^*Erje?4gwd&$0hUr5e|p zi8#R(ph}vOJ>TNlu?A&CVpuCJVfzaEIP!j1d-zn>XbctcB9>V9Ys@#8xD(L$d;D|k zU!b~OO_&HnLSDBkjQA9;^Zi=4iMXwCxJu(-MB{C8A#)1PgRb)0_>^tOi!99Y`%>4B zCDzf*LO_?o484a#UzgUxBe>qQH(|+bE5X%4zkI~FZXLq5bb8ZpJw}_R$;e4{1h@T z2&9~#CT{<&TH~$l%7c5A(zUl)7^9=kvW77C#V+NEQ)ZgW%Yd(dt+Vb)s^XVU(@Tn5 z?G{83;?8N-yvFChrpZt8?ggHmr#cQ$#mn6)G1fX|c(Pk9C+|G;LZwJFgpYUnt#Gg? zE%1*Y(iE@oV}LS{T8lN7m$vfS=aBJ|WaLaRYL3v=3%qxbsvqU-%`83CW_mWHiwxJn zVoAUV#!%Sd_w-Rk#KhAQT2w4TBk2$GC{kY=Vr+K z1aqX4Ivb-`C1xioGSt6EV8FKULIyb(hW3Hz= zSn@OYLfBCh5VxhcXzfk zyNIh=re5hwo|7y&L*b72EHnqr)F7Ms$+0oX*t$dydfS!e$ZWMR!05PHqW`DK@+fp} zK*o^-k?OKrkMl;ER64xEMVeP@5m) znjZ3X9LmUYyRekj3sKo%WN630i8M5Q^=-p^Z%@q-aX^rX+~jqf^3|D-L*j qYJz;ola+g@D#rGMdaiw&#^Ri^7UW-+NM$nXuF){%$tH&OJAVSKP9P!x delta 2246 zcmYjTU2Icj7!EB00`7d@sY=4Sp3_a{Si1FhYs=Pdz&6L)tqexy*0I5zaWJ^yLLD1= zX&6JE3ojgO7etJ}Fe!;q*+xu^7Z^bk6OG387TM4{(eUH*o)Y4craeF3`#taT^M3na zVa?fvHJ^P_?v5p5__Vyn9S_CuQ+eISNHi3WC&I~a7@NHvu7*bRdEYvhGq7C4Pm_V; zIaL_5UUI>*G`{s4{8l)aQiTz#cWq&*YU>893~H3|X*#DdUZ-)gjc?@@R@`uWDZ^u*iHSM` zUxc}HM7iQgj3;dvof=

    6Shdm)bR!S`|*Qmz({{MXK&+EiAHn^{|$9Sjj+BT3$0y zzTLz-T)NC9f?}#oBS&&x?$KBzNQ1xgd=_nywd}u%CBvBMu`m+X1gufpuW*!Y)^qtk zubY^v)R-GkWYNS)GPyZWYHB8R7!91-ZFqzBdEGUWMwvDLyEfl{q8-J~$u zr|?U&!ZmU>H=yx2W#BQP-L5t9N4q>TP?pztGp6{y#@BHhp?xHW7%Bo(lr_WvN7-(W zYTh8BGbHnQV)k|r|4?b|JlpQvqYI<4A6@L*#HvmCso_N0L^fsOW-k?LRCt*6V4~7+ z8k7PTYK3+W#)F0{8NubSg{`#6Z@V;X;?7kmwD7ZjKj|bF$GS>Au%~lfq=C1-8zSrc zzLF`up6fJNRXZ-aK}hc>UwaNK#JR3VIMtZvmdDxKbcMzV$}$$xSoLWvlfM@eB@K@6 zdM=!X=3j%1f5B(b`pydY1l>6G2MO($XS@+a}0V7|m>GTw6ZkFk%%*~Dpz zBbj_ePfLbIST7?0IVqVRcbG$L!E0lcYm2QuWC+yeK0O`IfD$N0>TK<%%}A?kb%EFN zT}y2xf_W}ks4?*>ttwnfve=(f+TU$E97?~#9CR7Bay4T(HkOgHx3kQV_bOv2zRK^9 zJNyermso3nyx(^8E72ekkawpY=@a<1-E!KxIlaIzK09n+8MlUmI?0*ofTPEx3Nb>kRc4awZK6mqluDw4Zzu#3bk7 zLkcYU?4b@b1iDNj=0eIHZir!Jn}r;`9Q1qeH}#O2w#v+kb{7wFJ#&Azy#(Mo$-OBa zrwN73X7CAVy41uSirVtPhB@nU<9-$+eGE zb#o+2yccQL1B1$)h?k_$LycH!Fma69g|eiuTT?gYiR&b@>sfPwGI*;!C??sEk4I0d z2V=~h95?rN@LkIHu+nt=wuMs2$v(swJUpve74c_hhUOz-m_mJ*J` H!=e8G;A;B9 diff --git a/packages/rs-sdk/tests/vectors/document_read/msg_2024-04-05T09:03:10.111047895Z_DocumentQuery_90af5a08200f1b0e42dbd3ad7a6af38ff6415d9cabab87315b9d9d736194597f.json b/packages/rs-sdk/tests/vectors/document_read/msg_2024-04-20T17:32:57.805474000Z_DocumentQuery_90af5a08200f1b0e42dbd3ad7a6af38ff6415d9cabab87315b9d9d736194597f.json similarity index 86% rename from packages/rs-sdk/tests/vectors/document_read/msg_2024-04-05T09:03:10.111047895Z_DocumentQuery_90af5a08200f1b0e42dbd3ad7a6af38ff6415d9cabab87315b9d9d736194597f.json rename to packages/rs-sdk/tests/vectors/document_read/msg_2024-04-20T17:32:57.805474000Z_DocumentQuery_90af5a08200f1b0e42dbd3ad7a6af38ff6415d9cabab87315b9d9d736194597f.json index 85a09fad751bfc8a6bbc5f73c7a3884fd82df76a..1325a37dbf1ae244fe10f739c30802fef6748e81 100644 GIT binary patch delta 2351 zcmZWqOKenS7)_@&F<5&4|5if4nR}-X8>(&RJ!Se}`k>D#oj!)r2c1?8iAIrb#JE6k z1%XhE#|00IEDS763Z@G}gtj|FrAXq!2VvTUF_A~wb*0qv-3dhFB$IpZ%zyv?eCIpo ze3P>|XJ&J*mAPG^5X#*lRm zRJQQm(lgKOJQpt78p{=ibDj1ZGa0)#j}OL-uXOv%m@ZLxSgdiK-^WRf+^~ttVFgdK z!ttR()b$#8+?W0DKv-jz>kqbR_|h5|+Y~BdCdNw@-u9V@*DD;V*Erm&UEvVCgEmeN zC>TDC$(Y7L-j^5gb>3UG3YoZx`B(wYb!iNhnegz{)pjMXDe#bvF=GFz zTH%R@So!?nfB}mX{avRqJz`=l%)MgXPdMu z62;L03%8pzzG7qTghs=g3TuQ|kXBeBv>1Qi)@9>Bjfv!-#{D`2?vTc>q+5;~;kMm` z$8vImfeBqY2c?}R#(1?!%`!{1iDy@cm`K^#nqo&ivYuz*2wNy({HR#Dc1G}4y^U$I`R86? zNa0+Kf%Tw9eTe}CG{PNfW-fN(C8vf*9SYymd2q(UC)x#)C5IVxG^@n7+sRbKZ~MJL-$yjDf1euZ1@8tHlyOT7LVF-Wb( zM5lqjc=aXJ%tYh3%XtuIWVnfkTwZPTprO)~+WD;jc9uC7x(f(*1^ETVPNySv$83nXtPF zoxzEIcAD*4;cpqf^8=sVEn37XNBTQ0Q4WqZ z`cTOw-hSl}C!V+19TBTAeUQ~p717s(m0=0ewMd_G#95oNuu@Wp4Nuks+o+05gnf^l zyUS8U4B}6BqbOFPrdMMd;fe6XqYr76Q9=}dNebGejv0sh6k@#Hq6ldquDiornGo^z zo7fzsIO*Ftb|;-+TJE`!BT8jJQ7$~-%UXhGy;QIn4peON{_DdoFVXb!1&|Y za({uHK24QLX63iBUgD}J<_FBKwcSD=%|$bbf$2b3(2tbQi>svNdJpNKzP@d>Uqph$ z-v+l6RO^KQgn~N2lr~t-Qk97h=(A*fHt2*J>6Vn~p{ep|h8z1dp4N#mNPD|B1F`>B z!lb_4V_}`>tZozUFh0t7#4GHcq*wQ_W_8+0?mzmg87n3pFy-Vo$=);>6wyqw$}0^_ z?A<1{p0$PuMN)E|tV|K=DUvzLGTb2(SJ~Mirmakc1j&}v7ja7oxBUE{bcjd4=6Ye5 z9?lDf0-KP`+ls(|8=JXM7I!oAWQ2%u=UA`MeWk}MCi-r`cIa?ZeUjjUC(L11KqGCZ zfg~Pfm@TsQqwL5T;t-sR#GGVoi9uvq*;Mf(nq$6*@fpHgg%?Ib)E6lt*z*bYoFw2wUJg%xhJvUR1BPdsOYt@j6UGh(5f>OV%6R+6XB ziAk{KN2#!o;S6dq@VPENcN$;R=>KVRXB78hHmhMLsIe8!AMxcDo+yx3qLCHxkS?;?({qo^hQ_S(&hz5)cFqmbg WWNd{?+>-25^C~yAGYcb=_WuKAZyUS- delta 2332 zcmY*bT~JhI7#L{XIMY=>vOVuP7Zo!*?3|zX=lT0~{A$kF z)tpPEMY)x+N^C9Kni~yPqPwUfKO6~0qp?s;D1>*4nq5`Z_@U@94)q#HmKn&z4XmUT zQf@u>*vfOkDlyQsS=;~bCN#1o3Te0E%}^f3OS^T##k9Jv0y2@->K~~kDBalT;VA0rz{+c8?IOg!)0D9MGdqDH5$0U zZ()To?*B%=iS@-AZe9}{<&*Vk8_St?g}?iGk4w4J%AQ6jd#<(+w<uPsBfdhQ# zc&DS0igG%Et!3ojIo&d;y6x4-_)S+Zg#G;<4E;M50z@UnjRnne)?Z=WMY3^(&bZ)n zP#5IWoXxXa<%T0wNS9l=;cyH~EkvHBg~2Or!MO{KUKge#28$9hLQ37b!ata{IypswMC4I~RkJA^kB>B@pMBYAzIYIG(i}|p5i&7 z!%=Prf~^LgVWNmPH+48Z+{PF<%I6<-Xw1Y-oa|OOO}$*_EL5;76v1f3VhFKyuo_=B zSQsNN?s{df@L59RbS>o+Pz*ASN5uw4dxp`7nHXIlGsS7EvH6AV|Tiv)T3cz zG!{{|UOH^*90bG~@+?!^mVSS;WiKTQ1e25tZS++$1CF-NGB6HM3fHL1bA4)}(u5~z z*itRn!hPwi;C6-H8fI3tA?)Xcs;lym%6k^!-XbI!l&hR^Xpe*AT8oKgO7NXR^s{)tt%kO39-VHT*Fx%J6nW>2gF{vj8B0<42 z!+mc@w5!sGhF-UQK#9FB^H7o%#d?yj^A!pk2~kyp!e!>MxG2Bcv74M8VnZoWWb#K2jfX`?#C^Ldr0*ICw+QuE=U3H4GygebQbDUPw z*ZmyTOP+O%JOj$QCy7ka$QjD$HVC{>+uTM?2c@(>D%m9y7`c; zxc<7hKKupayyixNeA!(0&lmPoHD3SZGH%Rv-mb%qh+%$U1h>R>sOO3sKb#M-Ey{Mj zM1eg9ywK4MEf$2T`IbHPXz)Tp#e79n-TX$+GhnM0N2tRBHBe)q8a%Sb0yPklG6^y@ z&>?OEB|D?Xf_knqj%)E4o~ zWQ+)gG5W0m=}#d$XD;%41C?mz2)qytbP(fO;v2M^N^FWtW(Y5)h?g$_?fo=NoY7fDniZG8pk&O!UZaj9u<%C9D8r5p%|?9i$csC3Rm_R zN2ytt3TFhFnjoUy!K}+dfCLrHcw$Kg=cxq7EVQ_R2=oEKk06c>V@zSJ1O^}|N}OT! z430FzvQ%K~i6R)Sy@LnP7=)&sWFTd}G3I2aCZ@>L!{=!;-JV5~;XJ=tJd`4FsWjOQ3yB40DygZ?y*L1>A^p0y&u)VQN`7%NB{$DNiC4f^~>U0+yKQav5_W+<-$14?`|wB+_NX z#T!8iFki3<5;=l>e)zNkbj#dG)(EnIdMGOEo4U)WGLL`WX1V#I_~$h3PrJn?4L8$} z5_3p;#Bspfzy`{4B%Q?U};)Mqe#S>*t>94W4#N9kK*K;DckA_8+03-ZH8bBLBL!31iHN|pdR$5%zKtR z!Gs)nT6maRR#+NW4yFeR2gZlxEmqt%=VIe%xCV1riD1nSy~QrjLRM_@Oh}TGmBUoi zCe|YC441~-sC_JxF+-c>tdwDFu%RX)r~$^_(Sise3ESjT0~DiFGSt}{EYxkbW!))~ zK4*AgKt}y!dDOGJ&!Z45Hlri^$v*Hf={50Ta@kL(r~HwBCV25Re+ph~)3@MvYZfv( z=dJWVYhA;f_X%DN&m>HrXjwOs$-HE<`q^d!RD{7|m6UZa{Kmx2U+e=+b!(!nLL^69 viwfAXqk<)aLl-e=poU86^+P;eYTe_%&$(Pt*}lD*|A-;~d;S0NCk_7rAVA#0 literal 8822 zcmeI2%Wm695JhM0uQ0gIg17k2uM7r+A~BW_%k)T8fI;AY58IX;@mxFJWI0(l=A*mo zajWW9(LZi(Z?o^i;kX+gvd_0a=F4;=fBk*F+HK~mzn`C^r}?MuyX}*`0ZJAxpnjfsk z!_cp{tKCC?Kd!$GoBs7xHFx{_^k_j?R;a*@qQQ!Q)RFTBw}`+V?G?0=r5b2j<9S@;GcBm_LbsGLDySJHZm5LN zYG6xPP8FUPcmXN^IdnbbFCY!h!e#{@*LDLdM2nlc5|%^(qY`}vN1~BH5xp3u2(VYd zs5PFefs8GHCVGhhp&Tn}x)mY>t_9CIumUow0~Q;AAqu!c4fVD#Zt;d~3AG}yz~Wvt zrC^Nl45m8+NYEP**uxTV0NEiZq8bhqlTGA2q=nBKXjauyUFImXMLTbNL+7Sp|T2R;MfsxFG{8 z=Z>WT5H~Dg1U;SO2J@N$lvZZSmkGsW$`=Sn<}llle(4aoLDr@QrX)1NWTKiS&JZcB z{0$~+QaMV+014ypMsb0Nj{YwogN1EPy;`yYyuck*!M0Y`h`Asj8b~cm)+Ci8w_z^P zN3kA)We6fc?;wNgU??^$&Im}*;5=Ccf{4cOtRyj7BZy^cF>*XWY6xu!!9YqTYnjtv&O&UhAxuv*(M~dUjlcq25Hwuf;&>xr*6Xru z;OEo82wToM9JjJyvkuXv~>Z>9^|(zpV9(o&<-YI%Yo3U zMx+`U?g&8UKt@u~(%67`opqf}nm1+5c}$sRP_KjBbdmjg8V{#^znur0^MGVgtJvgB9x!`HQhI@^n}_OeWge zra5GvtkX=1Gv|62GRNKB!)iJm(l>x5V8meLJb{$OCK7<0Ow$|?uoS|0XQ>otuxvEN z?9XB9(E6wZA!(@uxB@7^~9Q`_l#Z_rE-N_ao>(;A{KDuE~kjfMpYg*0xYFf3S7 zC@U9esX2*;`9XrHk)6_&$dSn&hTqbXyD5d@cS8IS(rjordB!Xh6{ z2qzPGm4TG|pMQbp^Mejy)5A7JJ8w#^w+of=!JG=8ynLi zpi9YqU0NBXGB4zWLj#i$477Y+UQWdwL!-d8lz7nyJi63nQ>snUQ|%VjlHIg-yG5V5 zlI~S4s@^trSAb*DBy)@8BPOnS79EpUMq}%-G@F!Ee@*dWG)LoO$`~r~avDr*NMkkU zOS)K)e4zsezXQZPs!z|pqIjlV$XF0o=yAg4`A$srKXhqsSkebc)x`HBeRB1<%mn^m z3$&PH;Vp-{wN zCbscz3rtVpsGf$rkJZ)PQrr;q=$@ntJ0;)M0(*Ni@bE&)586i2r$fVbR7@Ad?S@~X zcV2S!BcIS%|LiJmbP1F13K*#3^ISsMe89!h^$cml<4ruS@cq=#J~!Rx2HN z8Ud{Drf^ji;Q?lc_&EzGG+;9ARWPdP{&A_*t@6bdAd2DI`F*XNJbjyqj3Ar&IRXfI z)J46K1LrRf#qXk79i{ZUi~ zwDg3ngF^9EI2NKA;zL>C>OrW!&7%8NGm6z_@Bl@NYn{S;63SiMaj^x_!7|@!LnA=L z;(pYQxYI7!Kh^|GPryCB0VH@+`2>I;Ycj zoTkmMV-lkj@IzaSXh$w|;=@&+QFIU=A*}%&+&XAZ;akTmdTt#wntn;{Cn|CcLdc2c zrFuabMUNjKO`{Li-i^9|iu@J$WjYjh4X;A}V!zJ1Ss{=cgM1nUXong>$UE|4*FTd8 B_rU-F delta 1745 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 delta 2425 zcmYjTTWC~Q6vaEX*i^me+<}(LWbQOEXpS9Os zYn?eUz3Q9kRTnn|eDP!)fk2thjl|Iw2p2f9i0dY!b=qsotN*3R4g$_bIOo&H26*kl>%=c)FW_WF>@;PKbm$A`aM|i~= zO}4_?Dh;W<kV~LjzmasSSbe`YJNYkwr)(t2eY1IUo|C=c1J~lMY%4>LLXXFKtN3Mwy$B&EU z>v6xt!g4H#wQNL4df24!Hycc|?n-68<^<0k?ABBieQ>tKWwtl6|wPs zhxRahyV1h2n8Hxp#4X~x(yOr8u2D#WQ*zfvh5mjys}Uq-5tY;t!3epTgo#G#@cni< zZy}T=?rM^n(@1u3=FR5p<*+tLp@sQk6SvuD11}mA>Ih<#LfPF%Q4z#Z67Y1RMj5Af zw$qQ7%S@xr!Dz_FUe>GRJ?zbhNAO;&ZN!uKqA-Y2qMVGdLn88&MR^P2N*1Q%W%t=s zA!}++aIKp-wjMoO;v`>4;QPn<+VV>vmXENrivP=pb8Ti0V5{LS<;fFL0ru ziK-#-LPna(S)@P3S%F54+mSr^GJpvZSH;q4uJ0|@K8FT=&>TWFYs(kRQZ8YvhVE|u(eB8jSk(Et9?CE?8>OwyVA>OCVFj)QxpAv`CwOT`u%St3Ii zB4W|Q4+#r*`1t|bm$e}V!jmlL%-GpZtt?5r5b8L!mPshwt+8;3kd|ZScj;pWZgQr= z63v4V&fz@gu`Z)hk~-BT-N$e_5yB%*V}uYt z<9a*yNM3CqTQfZ-w#M`Rtgj1t?ffTQk({u$tGSSpGjWp>I79}@Tc{eUr?$+*1=?q& zg_5_m5shOaXG=mNKnF^Y9;ZW?NInvZ8%f)X#R_(NKBsW0R^y~Yg>$HqYLD5?sU9-P z=#Zop7fp%+d(`Z!EvJ~+jrnQbA??{Jv4jb+@kGjxXDt*YsgUdq6SHKm^ti|nnP=Z( zaS@+Hfs2^HRNq4{4KJ{ zy&RFOi3R1ZVV;-IOSO4p+$R~2H(Q1i!S$w~XShkGu|%w-vP7Z$znU!xF9Lmm)0bqL z;V303Tt>4f>3+ubXcunCt&yxlCLZ+C^+?M0e32yOOm0v2x8kH>&=BuNL+5%)(zm9Zw03T5V%Uje` zMV`kjD?Z8kv3|hBy+Vx-%M>EySVDW8niG!bEMK%Xjz>gww@q$knjs!2mN z1Md}L4D|Vtq70fi(GIqMk){zAhd8lcNktdqM@+;%J-}!9z4RyMl7P*z&Pu;BVi8

    Z*lh+ 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 diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_read/msg_2024-04-20T17:32:57.729789000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/test_data_contract_read/msg_2024-04-20T17:32:57.729789000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json new file mode 100644 index 0000000000000000000000000000000000000000..0528f564cf7e762ed8d49371c89b999bbd16f7ed GIT binary patch literal 74128 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 x$~2xZ*S&5V#xnq|G)f6!+%w5+~NQL literal 8822 zcmeI2%Wm695JhM0uQ0gIg17jdUl|MtMPe)=mg$kG0E58)K5SWX#B*(UljUULn2+wR z$E~VcMgP3Jzt4UQhvRO1%Kp6nIbWt5`P=XF)owFi{dInlp6bj0zy5wZTx|OH)wtR7 zVf-=7hMx|n;r#Gr{`qqEa`(qw^3rEc+Yi%fvzk^nj+_^5huy<=n(t+0TV~g@<_GKX zF!bx~YWLJXj_dEkrhj`?OIhCdDFD&q}vl_eWr0e zKK8%Rc7vqs_3Sg$vd!wa-LIx0iL!d^t2(<_=jD24b{LMQ$E3(BVv|3T#l~-oTl39_ zWX8?c{`&A2j^V>}SzY%}7Yn4HFUuQ&-+R7XT`w<-8zY_<2TrT`0yb!u`;~Y-?0_T88ih$IS^9Hwwz#i=lw34M7XjrlDga1yJ>)MS4bH-51s~UT11m&}o4OK~L;<4`eFjIOkw6i>7^VoY zSHY+?o~wb3Er2F^i28-O7SxIzu}wlHq-hHVM8BCx>X zUNxm)jPVSnI|E428xhz;OuzwThoFdRI8aPBk@JuiK5L+9i8B}p=8hU3RSU7jEjoyx z3NomI5Mkj|*r_x{OXyK^L+{eZmNhK^bDY3{bXbW(`kv6-JlYYvbUEvX+*CNjDuxJ6 zPk-hyI^D7nYmAsOt;&cVVyR?+D2Hau3=onSvfRVUW&T@2M&{1tb4X_u0ODDlvM}I= z46K|xmIgrFu!IrxbdDR$YX(qSnJHf;6q6}mARL*)Y)AT~L*xcon;Mvs&YL+-d zq_pxkn5;?VC=~-FSVCkJ7l`QS{{k{t*w)mmB`d%S+))*5Yh{g?3j(5n)UsqvQYms9 z<`R7t>mgW%AQJQrGPn+gV#DH$fCLTBlT{#yXbjIv5~DSOI5vzCQY{if2O%Oy$*N!| z5;`+1+c3tSD1s9s#{;B>(3TJkq-3&|ISuA4#MT=qbz^GI&VvSieg<->|MX9z4O%vcQVU?R30 z2(4;Fs*&N20AvniBn2&v4Vc$i*V&|bQ`TI@lxYU_HpopE**~Z8aN76Vd9XPTD3>!x z#5Wl$?82svnLa*EG1gTWb3>Z*j6>E;1d396!U5_nZrCa|u!}KRvHp<17z-m$ho!@0 zqOEP3L-xr!&6GHEt`8w|+&w(4rqdyP16Tq^3`WiqNLg$m0m#WT%>e;RA&hsHN^u6u zMpMlGET$qk6s<{iXyYL#y{4DD6uHupDLW1^7z`CQ*fM`G{i+4p;SPJB<=ZB@mfV&V zAr5&n<}hpr)37 qQOK;5A!Pae&El$TKO`#`emnj9oal=3`t8m1R}1Oi>;IR(VfYV~J=x*_ diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json b/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json deleted file mode 100644 index 6eaf11a788..0000000000 --- a/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json +++ /dev/null @@ -1 +0,0 @@ -[173,50,8,34,25,140,227,142,53,135,194,216,242,27,172,247,219,172,219,175,172,23,135,155,49,211,157,167,27,158,0,180,152,206,45,235,171,83,75,48,116,32,125,175,252,120,93,39] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json new file mode 100644 index 0000000000..7f0850a40d --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json @@ -0,0 +1 @@ +[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/msg_2024-04-05T09:03:09.929228702Z_GetDataContractsRequest_f229a0e58a5c4fb050f57c087bf067bd9ccc29eca3092a5664a5a9ba3bb7e967.json b/packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/msg_2024-04-20T17:32:57.730152000Z_GetDataContractsRequest_f229a0e58a5c4fb050f57c087bf067bd9ccc29eca3092a5664a5a9ba3bb7e967.json similarity index 96% rename from packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/msg_2024-04-05T09:03:09.929228702Z_GetDataContractsRequest_f229a0e58a5c4fb050f57c087bf067bd9ccc29eca3092a5664a5a9ba3bb7e967.json rename to packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/msg_2024-04-20T17:32:57.730152000Z_GetDataContractsRequest_f229a0e58a5c4fb050f57c087bf067bd9ccc29eca3092a5664a5a9ba3bb7e967.json index 296425f4a80b663656a9f43a28d216b1b71346ca..e5b544d05db47d1f97c8c0be3c10b8439fc631b5 100644 GIT binary patch delta 1796 zcmZ8iTWl0%6wW`}+8gbhf0mY(wmVa(T%y?S>~6Ph0@g^>CRBKUgh1og2OvRo3yB)V z*e1pY4W(sI;z2|fo|GVI6CO&`UU<=1r7VfTfHz)9pi0#TW3Wj5{+XB{o9yMk%(;A* zvtP{?&CC{!l`AWe;7YY7l1lm9uGW<&+7ih`I_|f&a#lTM`Tn_ab)ZD9Xr+0sTu1!Y zH244IT5WB-r^uBZwb*YtO?;?IN8+h8udVXrgB6OnqFD22hUA}mrR7BMQH$+7Y5p)y zJimb=@pQY)d&-kS2~H4!&sI3xvd!Fz%Dx(9bKiEd5cS$I?Z{)uB9sX%6 z@s?f01D!gk*R_aS|HL{%eDopI-{o+jnq=L>%HioD;xVLbIjyaZ6dx<~_*vYWy`lN> zZjyReQN)iM1YFK`YOx#4Mk38mjJqLuwV)hjAGw$S;A;LzRKh&4sshZVyQbs**DvA_N2%YH7TrMqO078sf*+hs|cXiJw6y`7W}OaXyuav5ACt znD&U83}Q7DrcF1;;J}-jySi;@H{lAu8f*KUulD3~Ak3o?Cv@B# zFb^1T8&Fzs|H{u$FF*N|JpPj<+iWy<4x1~_$T5ChDi^o_QbeMXD(H!<82N%pq6%9n|#azobzf~#9) z@&d=TmBhDfhyYAOB3y`u91KQ1xw6#M1Gnz2fkvy~PooOr>Eq}c1FAT@I~?(tLfl9kO)SQ&H|O*7AvmzCSM2q0PTHy^L%(+Qr;%=lziwPp{TI18zPw u&JP9`!3PMSp>i{U+xS9-XW?&3Ta9MO1ooF}9zvPF77RVhPrSEUb^i+$OeoR- delta 1723 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 literal 19680 zcmeI)*=`)k5d}~`>nntQ_CrVZ?q4wsf+Mv>!lEd18Ne9m-(A_*W_JJf;p4}}ug9C)%j<88KYjddy6hh;pZ}h&Ev0k_T(t4++O@|O_{-BE7T<5K ze?3m?ba!)qJl*^;{rAU*A0Phkp)cxtYkYOQJO6xscRsB9^wP!g^2^2D^x0y)UoW2e znr?i$zB!(Kx;Vf5cJ}r9)8CGt&z>Kx-Ey$U;`sgg)5X-nFqg&M<<;@*>bAFAyK1ZD zZnv*P)!4%{pS$Z%*I&E?^u_jiU7ymomQCfV-~ZuH9I+rhI=x5o%L zec=0}L!2I1F`(7pR{eqP;D4tVmP05#v_KyRT5OF6V$^ML-&2!5v9r&0^nu+DywSAG zZV0|ppFR*{dh&$+^t3P|hV>6>49NZgBWfcg^!u&F5Eyig=+s{s5wTx8%OPs|ZH%;H z9T?yUs{L)Aey6e8#Nc@&3>3aNf@vSYKAO~GWAf;4)Cv=XJ2R_U0ywom18s!KI~)OF~q`6jj0+_c5k4xbO2nfSuO3<3d6M(Z`8Q^!z^p!)mRHd@_fLS{?IgZYuKswv{@ULH(X}L z1H?%rC;f#EZLYRDxq(@xuZWwGKX(TVI~?$ym}JGUM8=Ws_ddeo!ei&|!7N+DF2w^Q z>{NZB7g&>v&5^~Sw-BJMoU{^R797NOrOy@y4bhr9HrOtTV0R(Rv#+*^sj=oURyGU$WR!(8iMLL%5i|7Fr zF7A%N3IG&B8)ge))RvKl_#pVdLP3Rmu>?J4B3}3NNOmQ=FR4qA0x6-%ficAT&qUNd zsKU5Wuggha@B0psn0=Q zk|!AD6-jyAi0Um)n^AKdVW~(wJPhb~X#jH{^U?F$m(ILQ3#klQbTYLHQ6&&p{UJbJ z0P=;{xllON@2z~*Dw%^G7d{`LYxGO|O5)gLSQ=a}*a*?oEJGyMHW%!%%zat*pHh>TaKP0y;&Bxliv`yG%IJL&R?%zA(etHGzK>afv=Gah3PWs!7^F@jTqi_pEt@#bVn>Y<+EExLg>5WV zdrT3T-}DoSKe7ov85}s&qu^J;;l}d`rwnF!W+784=8;<>69@7W>#VRn>VwgKlZb{# zxb5!dTM3ckv`#52Or1^vC=`8Woe0QkyT_F;WM~07p_HUM=*7aWEY49y7xIA6Qp6w^ zGb+0|B2^qd;J(#qoDPsbx4;Y4nlyd9qTNCfimf%1aOlq!!vMybi&G{k-P|0RO1>>L zHwR3+v7MqNDi&0p=e6vi`JO>vXffS(r9_yqo8APXqbbVOOr8KLE(3FM3Xau~zBfXE9(CRG~ zQV-&S5W|il zD7Gi3?^w(oS-305>Fu#uz$wRPk*u-3tv_NF1ppsacz;zqmgeoD_d8@jn!14-&_I zf+;|BkYtugK}3&39wC;Mic6eVj8O*YOV;B|j_O9mZaMm>fcy%?;}DQQ>AYJGzi&8p z8MFUW4Uvxph*I0>ax6s3kV>cj0~?NHa4rEdF4eSRw@cxyB8s(0)NKK^mh7R-23gIW z8D?3QRi;-puFzaud6Q5Rfg|T+O*~IQLUMe|E9y_rEQwvAnum%e21nH$U+yr|fmHGu z^=R*#W<}c+ztk?wJq%yTla(^qlYkF|*Gr|ClU z3qd-Iq)=VhUr1?}>=)Ds$cgU>hEAi~t1hb?Vc2lFSP8*H7EyXo9CV2d2@_Gs)n=xU zuhr;ckfg3SG8DpcZ8d#q1Si%*1-B#@B*1t+s6YtSw4kqtEiHed4v6nE#Hj$4Y&mjx zosjE-hh7#0*!Xf8Sh^F(tk4O>~i|epw~!BQbqMe10!WnaWTHW zCtfkF1gTC3b0)F9Am>T}Zq9+DXqJt}k=!`l8oz84TN(ksx-gYlM2+Q1Wa#z&r)1@k b-`@S>d#5W?_4WK@|G}&N@8SQCKY#U4qBMn! diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_2024-04-05T09:03:10.028576958Z_GetEpochsInfoRequest_b2b426ac4a52cb4cb08904c63386caf3663c40a12d3b03827006d66058e439ac.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_2024-04-20T17:32:57.933588000Z_GetEpochsInfoRequest_b2b426ac4a52cb4cb08904c63386caf3663c40a12d3b03827006d66058e439ac.json similarity index 99% rename from packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_2024-04-05T09:03:10.028576958Z_GetEpochsInfoRequest_b2b426ac4a52cb4cb08904c63386caf3663c40a12d3b03827006d66058e439ac.json rename to packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_2024-04-20T17:32:57.933588000Z_GetEpochsInfoRequest_b2b426ac4a52cb4cb08904c63386caf3663c40a12d3b03827006d66058e439ac.json index b7fc5cddcfcf48226c6983ee733f50114cb83130..b0522e468fbb350016966f27936a4859939ef3c2 100644 GIT binary patch delta 2328 zcmX|DUrgIo6b=+hS+V#2TGqu(TZS4p=Qc*ihErRz;j*Dp9z=sAExwSLU_mtgUm;mC z|HPDSS8|Mrlw=Z@p|obvnQduDvW)0}5|<;V-?AcjgS7)}C94M`?Kl55iw1l!% zHf2H^HHE%+Y7;NBXrjBqGFg{J3Cm+qa0bIji`ydCSOsS77*;lUEs8#^G$r?Y-85KZ zQxv<4KV}c}z73cyP2!mEs@pQ55sh{HdiP13@-4%8UR#vyx3J#nb({2}qR@&<%g)#` zJYtIe;73?0E z3#MQiX2IMr53Cxt{_M2fn`ty%4=QtGi!$MT`b4>+-g&#aW)cG;%s^Jl!8)L4b4)kDZG(()gILrqoMBvB{Vb}X&F%6QgU)O*XW zY3K}w;0BLnq7gUcZXx|&rvb*b;VO%&P5|-9EdUe?V341&dAmh*r`K7u-Evr_>l;+= zJUjv(hS#JPaikNIfhR1ZzeEW_Whf17piEP5%;}S2kt>8)I5P5mh}rBm_!ug4)5T_w zI-A(<-CstL!*Ij=s<~N->)Jdu?49v3U5$FUtHMX22P}1V@SyifiOKhADm)ItNWi_d z)taI|0~Y_c<>1F{#DB3KQMX)ouF)bkgYxJ8DPN0V$%!yBwHP8%P*fcOkjz3;c-f-m zR{&w#m_^f3M7(?r2#xgM_)?dIt*P%fKqXX?1$z_}J1W z{ptM_I^*!s$QV$c(~8F1kl?^(@Ix~4AH`vz7&pH(F9JfQ3GDD)#g)=sTxDhgg?n(f zfW1(T0Q???@h)7Zs%)rCtw$B($?Zi2CD4@@*MqUY!xJ~AXbh#Upq7%AZw71rQG^QJ z5z-0914n>YauH~U`|XPQoa@0%lugcv%m}fUo82{(7=zYi4+5NS99n6?#qkB;62Fb= z3a}$nh~Do<%1KN@er#otYU=@1+)q+Dq1JnUf^OVK#bSh?M=J&|VQp>+S**2y0un{d zlJpl6*go;5!y1kNK^8U&jRU>JV+bPqC;$pws#ely3*3bU}zDgq5W0l&ZcB5<1 z53G;jrvT@Utq?+P1rbnb*7Rl2KED_4lkF9JWR0GzwUj!IAWyY>_t3;$ASz-ifBg75 zXH<(0973k7`IPwpaV~TtYQc%SoWc&MEGI!r&0vI7e)c9jEv2!KC4z$6fip9DmQ|`Q z2|!{=c*@+wAeu6pKqRd%VJI}R;!mLf5(ICt)dzOc^%uOmD47O_iCZ#|*Y}SOynVCnxL#gPan9;2 z@3Uxz2o%2ubfbW(L>UUchu;D-3dv?jB%72yvOBUZMMM=XzTzDZI z8tL$QX!JX`Vv160KUmrH5QsPB)};;gT+e%{E#hsU&>gonqj`;I4$lKWN%A3(nMd43 zPpo7j>5W4GApC_>mj)V((Vgt_?)VpJggfQ{ delta 2356 zcmZuyUuaWT7$-^7Hnqt)C)PU$GdCa`+RY|)v8`2`44gU(X$RV>(?*JK!$j8YK^W;k z*_hj!l!N_-y0&{za7v9=^-D_n!0p z`F+3dcb?xo_{+_M*;}qiTV!}{dNs78WeiB!z1^KQz6-7r@NlJD))yRNQdTd7OP@SZwey^fpsb0~S zZjYpL8moNLBem>+oA(+d`9cmw^W%7oMI34*;1G1~BPD5Y05Q^jcnb`q}+NF z=q)%(4&d93i>@a9$z?&^H7-Hfm?chy-JgZs4ww_>f>puHw`y1otQO{h)xlQ5>S11( z4<=v|reJ>9YFGno%|zI3^|kA+prF`wx1i8&%cjIehfU|3l&zyJLU(TwI&1x(Nqw!( zXR>RezO~3doI=%2y};$hKPWMN7T@mPR#N9*leD6uyD{1~Pb`&P?=s1lXSs^5y z7#E6${sM+quT{gzbNn6M=u>p(h^0tOI{@cN2hgupjGw;qhE1^^{7ZGhZ>ZO6)6ymr zetN|(FqD)(4m5-Pfd1h~tswE?DnYkjpb3F2_N9gqYkm%^VtS<$g|m1q^dK>=WM~qv zORu}6&NL#|9hRWvReUn7<_dLa`?3$Si@Khx4N!^!FQhdOvCPsH!+gw!a#4$UK z*trP2BSg@U$@mOX_+3YUqJAaxl2_=cTj;6&70CaC*{-zb=bq*EP~siy8Hr;kBJPFr zz4sCOp#qKjW`X3`GlXfIaV<6#6vjCP%xcM%G7nTURD~w z^fc~421T;f<)gw+PNjuk=~$zn+;s!hWBm6a@X(ohrKjMT9oSVsWTAwfGpgbOFf;vS zEI}}-OHU*fFCqTu03N<8ILTBxT<`#*Ib`?B`^aRz9e**Fipq1SjEARm1x4|+-2KX9 zR|YWCYr#Pg8HwHCMm~aSnUzBea1ipqJwF%*5X9E^yeNT`O=E;~V(xX6Dbxl)MQ@N< zZ>XEY_*N*9E@8!bkUIq04aQI!bDgs^`HsAeQOR7EwD(o8G5r|X8hzjiTWmpgpkRRV zF|1BhftKi*4WN--u86$|Zdd4@Za1wlBgA~;vB(^@)W}+3I-Yj&QHV*P9&q+zS10x} z=W>(iLDRIPSOZchZO3?JUve+^l=Ub%VOm`6mu9>w+E!r(k5JzN2Cb`ZxhIA7@VnTF zCWupjZ($B48=_WNlsJfNlE)3;rn!SVfVvqxov#x*^f8(NXT;rPh6T>x^~?)QG5=t? zn88|Vv6Rj>N<9{YmZHbn1{!@KC_u3XN7}!Jpv;#5)BJV3GFx&_uo^mx2Y)jF=sb=y z^2T$8PhF3IaAFn(l<#Bjt^HOj1^x!~EC!3?aGd`Q@}CMK^$AqRTp53W;o&j*;#;iB zpQA*EV*4K8In^zdj-!gqVy&d-TLGd`H7y=s;lRRl#z7a5nv+?cvAA=T}I{+-1DW>ma5fOxuxfFjPE1CO2)GT8<#PZx$IbCyg@d zBwCyT%hUbH-3Y7>qv0%fgEe3;i@VWdD$JM?p;!<(Q1+rr;J#VL*wpHbw9(9dTt2f$ HtquPIR#XOu diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json deleted file mode 100644 index 6eaf11a788..0000000000 --- a/packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json +++ /dev/null @@ -1 +0,0 @@ -[173,50,8,34,25,140,227,142,53,135,194,216,242,27,172,247,219,172,219,175,172,23,135,155,49,211,157,167,27,158,0,180,152,206,45,235,171,83,75,48,116,32,125,175,252,120,93,39] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json new file mode 100644 index 0000000000..7f0850a40d --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json @@ -0,0 +1 @@ +[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list/msg_2024-04-05T09:03:09.988799909Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_2024-04-20T17:32:57.791668000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json similarity index 76% rename from packages/rs-sdk/tests/vectors/test_epoch_list/msg_2024-04-05T09:03:09.988799909Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json rename to packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_2024-04-20T17:32:57.791668000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json index cbec48463037b91a0c7906b15c82bffd07c2dfcb..348f1953ea70832d271ea0c5f015878ece72bb76 100644 GIT binary patch literal 19700 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 literal 19680 zcmeI)*=`)k5d}~`>nntQ_CrVZ?q4wsf+Mv>!lEd18Ne9m-(A_*W_JJf;p4}}ug9C)%j<88KYjddy6hh;pZ}h&Ev0k_T(t4++O@|O_{-BE7T<5K ze?3m?ba!)qJl*^;{rAU*A0Phkp)cxtYkYOQJO6xscRsB9^wP!g^2^2D^x0y)UoW2e znr?i$zB!(Kx;Vf5cJ}r9)8CGt&z>Kx-Ey$U;`sgg)5X-nFqg&M<<;@*>bAFAyK1ZD zZnv*P)!4%{pS$Z%*I&E?^u_jiU7ymomQCfV-~ZuH9I+rhI=x5o%L zec=0}L!2I1F`(7pR{eqP;D4tVmP05#v_KyRT5OF6V$^ML-&2!5v9r&0^nu+DywSAG zZV0|ppFR*{dh&$+^t3P|hV>6>49NZgBWfcg^!u&F5Eyig=+s{s5wTx8%OPs|ZH%;H z9T?yUs{L)Aey6e8#Nc@&3>3aNf@vSYKAO~GWAf;4)Cv=XJ2R_U0ywom18s!KI~)OF~q`6jj0+_c5k4xbO2nfSuO3<3d6M(Z`8Q^!z^p!)mRHd@_fLS{?IgZYuKswv{@ULH(X}L z1H?%rC;f#EZLYRDxq(@xuZWwGKX(TVI~?$ym}JGUM8=Ws_ddeo!ei&|!7N+DF2w^Q z>{NZB7g&>v&5^~Sw-BJMoU{^R797NOrOy@y4bhr9HrOtTV0R(Rv#+*^sj=oURyGU$WR!(8iMLL%5i|7Fr zF7A%N3IG&B8)ge))RvKl_#pVdLP3Rmu>?J4B3}3NNOmQ=FR4qA0x6-%ficAT&qUNd zsKU5Wuggha@B0psn0=Q zk|!AD6-jyAi0Um)n^AKdVW~(wJPhb~X#jH{^U?F$m(ILQ3#klQbTYLHQ6&&p{UJbJ z0P=;{xllON@2z~*Dw%^G7d{`LYxGO|O5)gLSQ=a}*a*?oEJGyMHW%!%%zat*pHh>TaKP0y;&Bxliv`yG%IJL&R?%zA(etHGzK>afv=Gah3PWs!7^F@jTqi_pEt@#bVn>Y<+EExLg>5WV zdrT3T-}DoSKe7ov85}s&qu^J;;l}d`rwnF!W+784=8;<>69@7W>#VRn>VwgKlZb{# zxb5!dTM3ckv`#52Or1^vC=`8Woe0QkyT_F;WM~07p_HUM=*7aWEY49y7xIA6Qp6w^ zGb+0|B2^qd;J(#qoDPsbx4;Y4nlyd9qTNCfimf%1aOlq!!vMybi&G{k-P|0RO1>>L zHwR3+v7MqNDi&0p=e6vi`JO>vXffS(r9_yqo8APXqbbVOOr8KLE(3FM3Xau~zBfXE9(CRG~ zQV-&S5W|il zD7Gi3?^w(oS-305>Fu#uz$wRPk*u-3tv_NF1ppsacz;zqmgeoD_d8@jn!14-&_I zf+;|BkYtugK}3&39wC;Mic6eVj8O*YOV;B|j_O9mZaMm>fcy%?;}DQQ>AYJGzi&8p z8MFUW4Uvxph*I0>ax6s3kV>cj0~?NHa4rEdF4eSRw@cxyB8s(0)NKK^mh7R-23gIW z8D?3QRi;-puFzaud6Q5Rfg|T+O*~IQLUMe|E9y_rEQwvAnum%e21nH$U+yr|fmHGu z^=R*#W<}c+ztk?wJq%yTla(^qlYkF|*Gr|ClU z3qd-Iq)=VhUr1?}>=)Ds$cgU>hEAi~t1hb?Vc2lFSP8*H7EyXo9CV2d2@_Gs)n=xU zuhr;ckfg3SG8DpcZ8d#q1Si%*1-B#@B*1t+s6YtSw4kqtEiHed4v6nE#Hj$4Y&mjx zosjE-hh7#0*!Xf8Sh^F(tk4O>~i|epw~!BQbqMe10!WnaWTHW zCtfkF1gTC3b0)F9Am>T}Zq9+DXqJt}k=!`l8oz84TN(ksx-gYlM2+Q1Wa#z&r)1@k b-`@S>d#5W?_4WK@|G}&N@8SQCKY#U4qBMn! diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_2024-04-05T09:03:09.952452382Z_GetEpochsInfoRequest_1b87e649557ccb609adb9e2904c67089535588985622579e77969e0ffd68afc7.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_2024-04-20T17:32:57.795519000Z_GetEpochsInfoRequest_1b87e649557ccb609adb9e2904c67089535588985622579e77969e0ffd68afc7.json similarity index 85% rename from packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_2024-04-05T09:03:09.952452382Z_GetEpochsInfoRequest_1b87e649557ccb609adb9e2904c67089535588985622579e77969e0ffd68afc7.json rename to packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_2024-04-20T17:32:57.795519000Z_GetEpochsInfoRequest_1b87e649557ccb609adb9e2904c67089535588985622579e77969e0ffd68afc7.json index ecd0a4b4edca39f3607643a964f3dcc5b38820dd..ac77510963d614ba5c340eb14d253ea0dfa7a6d5 100644 GIT binary patch delta 1909 zcmai#OKenS6vs1zPSWq?+voyTQ{j-BaD2Pg&mn0Di;7TpRIS19t( zl|%}Z{+A|{4J)KHArTGbu_ofMVWYN?xY8&kQHhDI_&@gs!`kD;V-3n_B8p~CM_%4NSQi^*t?ka^pHfl`vGwS~?3*S~Oe38C^CH^jCcy>f# zp^Il3x&IMoUCC18K$G^eEbY;lpJg8Kg!FN1=vZQgUO{3Irt{=;#!=Y?0i?LuFr)`B_m{6*qa3t&(sN}lS zLY)VftN!l`0qR{29tWa`_gXk#QnLjI!%@Z8OQ<;1h8oqo?0=UWn;!R<+nx;Oa>^^Dh zV=twzHwz|^Mt#h|={F5-^ig4U@ZENU=|S%5Rgg~2vkNcpwooFU(~6zpudv-bWP;S# zqQjHFI3(`j6(G>`Da@RF~f-k>icyl zyTirYpbeYC^u9zO*jRhS10s~k<)OCN_<_Qv2*BcQ!o{9-|>0KJFuJ4G0J^u66Z916Eq0$t`xjhDzYSaVz zIGfN$bIntZ?xewLktSrFn|4e7IgD;_@ELPDNRi8YzBVj|(I_|h&7UApu_R%olpUGVCKlF7S&Xq{bqlellh-)#;mTS{dBsJ~4y5C*~5+&a!onSWb;GE=IKn%N!w* zLGd@GYMIe8M1lnu^#%tk3E_s^a{COoezJEbY#w=sp%x;PHH}){@hm2d zk8LM{ss(FB%d=`T$H5dUDKbOp*fJx0#C22~*hFt>Ok+LY>D;Dg>E<+DBuU$j!6bFR z_qvAKOP6zN%AtU62CCMI`o1>LO|th~#0TS+c5s;PnV>k`+<)UWg%d1R?nQ($NfK@(9u+isCnNt)&5$_FG2?%hgcEVLI8)JB^5L6jMdrI3P0>nP8P}Zf7gQng}K;u zWUCcam*QPJS>~%2#!NU##FI26KM&S0fN@zU3xCcmhvjHeR_^@ebqTozLX3tK|Z zk-f9g4eE>MxG!kyp2PVM{jNIgoK01^PzAkcbi5~0>dIlRQ&TpBM_aP^oGjc6SuC$% zs7?djtTDxNGJyGrsf;JOa6S-3gz)9vlXZOO6@%uKrrZ{dJIP$kr6A8z?=#H|aZd~> z#9r`YY}75`3fYadGDfw*KH^?t4*4!WsBw0?!8qd;3HJmk6?#Rum9R#2Kh?+@ao*RY z^=5?bqHVrxXBmAoC`(qmX(8^ZW`mdO4gT8XGStjehekAJso*3czB+c>~mx*%Dk0(*t4~k(>CIs>{;4$CA`F3=t);Wb&#rp&X$YU!}MhN@-_dPvdGHjOCR zo@!#vtWnf0x3Gy<(UII=q{`yVCdOFJZ|MY4T+IEkYGpX>h$upN$^0bm-_X>0H^m?H zmne)_@NH)QWV^*YHI>Xic`f=oG;Z)Yzm99}3v>Ge&SY5{XmMOF7Tm;$<>54~ByFMa zCP^r=rBp#Xop^JI=k;7STP#TL`&?kYAr7jX!dXtH@>Y#;f|2gs$LFIYMJAG@UFN-o zvqHfC9yZRI5GdU(WU^Z-H`H--5e`jpf@flaE7stH z)w&`>j>68^oUO8sv1Po-Y}`xt^+hcvNsO#NtF!oSt)e6rKU31zf+U8>4(|~j4G#9n zurQ?oTk2J~^>4kq*mlz!q~+Z9TGXy_ZolZ@bz1h9SP(~8&+Jx1p%tDnv$T?oq#N8P zchXW5RYBY_2ABA0xzm;g3_kQ}c99>&VTIciFHehl*__h+QnS>x$O^=cBCs^9usU9A z@f+0bBS|R{va2X@gy@eK^Rx}wEqJnep0jm diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json deleted file mode 100644 index 6eaf11a788..0000000000 --- a/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json +++ /dev/null @@ -1 +0,0 @@ -[173,50,8,34,25,140,227,142,53,135,194,216,242,27,172,247,219,172,219,175,172,23,135,155,49,211,157,167,27,158,0,180,152,206,45,235,171,83,75,48,116,32,125,175,252,120,93,39] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json new file mode 100644 index 0000000000..7f0850a40d --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json @@ -0,0 +1 @@ +[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_2024-04-05T09:03:09.987325755Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_2024-04-20T17:32:57.792846000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json similarity index 76% rename from packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_2024-04-05T09:03:09.987325755Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json rename to packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_2024-04-20T17:32:57.792846000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json index cbec48463037b91a0c7906b15c82bffd07c2dfcb..348f1953ea70832d271ea0c5f015878ece72bb76 100644 GIT binary patch literal 19700 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 literal 19680 zcmeI)*=`)k5d}~`>nntQ_CrVZ?q4wsf+Mv>!lEd18Ne9m-(A_*W_JJf;p4}}ug9C)%j<88KYjddy6hh;pZ}h&Ev0k_T(t4++O@|O_{-BE7T<5K ze?3m?ba!)qJl*^;{rAU*A0Phkp)cxtYkYOQJO6xscRsB9^wP!g^2^2D^x0y)UoW2e znr?i$zB!(Kx;Vf5cJ}r9)8CGt&z>Kx-Ey$U;`sgg)5X-nFqg&M<<;@*>bAFAyK1ZD zZnv*P)!4%{pS$Z%*I&E?^u_jiU7ymomQCfV-~ZuH9I+rhI=x5o%L zec=0}L!2I1F`(7pR{eqP;D4tVmP05#v_KyRT5OF6V$^ML-&2!5v9r&0^nu+DywSAG zZV0|ppFR*{dh&$+^t3P|hV>6>49NZgBWfcg^!u&F5Eyig=+s{s5wTx8%OPs|ZH%;H z9T?yUs{L)Aey6e8#Nc@&3>3aNf@vSYKAO~GWAf;4)Cv=XJ2R_U0ywom18s!KI~)OF~q`6jj0+_c5k4xbO2nfSuO3<3d6M(Z`8Q^!z^p!)mRHd@_fLS{?IgZYuKswv{@ULH(X}L z1H?%rC;f#EZLYRDxq(@xuZWwGKX(TVI~?$ym}JGUM8=Ws_ddeo!ei&|!7N+DF2w^Q z>{NZB7g&>v&5^~Sw-BJMoU{^R797NOrOy@y4bhr9HrOtTV0R(Rv#+*^sj=oURyGU$WR!(8iMLL%5i|7Fr zF7A%N3IG&B8)ge))RvKl_#pVdLP3Rmu>?J4B3}3NNOmQ=FR4qA0x6-%ficAT&qUNd zsKU5Wuggha@B0psn0=Q zk|!AD6-jyAi0Um)n^AKdVW~(wJPhb~X#jH{^U?F$m(ILQ3#klQbTYLHQ6&&p{UJbJ z0P=;{xllON@2z~*Dw%^G7d{`LYxGO|O5)gLSQ=a}*a*?oEJGyMHW%!%%zat*pHh>TaKP0y;&Bxliv`yG%IJL&R?%zA(etHGzK>afv=Gah3PWs!7^F@jTqi_pEt@#bVn>Y<+EExLg>5WV zdrT3T-}DoSKe7ov85}s&qu^J;;l}d`rwnF!W+784=8;<>69@7W>#VRn>VwgKlZb{# zxb5!dTM3ckv`#52Or1^vC=`8Woe0QkyT_F;WM~07p_HUM=*7aWEY49y7xIA6Qp6w^ zGb+0|B2^qd;J(#qoDPsbx4;Y4nlyd9qTNCfimf%1aOlq!!vMybi&G{k-P|0RO1>>L zHwR3+v7MqNDi&0p=e6vi`JO>vXffS(r9_yqo8APXqbbVOOr8KLE(3FM3Xau~zBfXE9(CRG~ zQV-&S5W|il zD7Gi3?^w(oS-305>Fu#uz$wRPk*u-3tv_NF1ppsacz;zqmgeoD_d8@jn!14-&_I zf+;|BkYtugK}3&39wC;Mic6eVj8O*YOV;B|j_O9mZaMm>fcy%?;}DQQ>AYJGzi&8p z8MFUW4Uvxph*I0>ax6s3kV>cj0~?NHa4rEdF4eSRw@cxyB8s(0)NKK^mh7R-23gIW z8D?3QRi;-puFzaud6Q5Rfg|T+O*~IQLUMe|E9y_rEQwvAnum%e21nH$U+yr|fmHGu z^=R*#W<}c+ztk?wJq%yTla(^qlYkF|*Gr|ClU z3qd-Iq)=VhUr1?}>=)Ds$cgU>hEAi~t1hb?Vc2lFSP8*H7EyXo9CV2d2@_Gs)n=xU zuhr;ckfg3SG8DpcZ8d#q1Si%*1-B#@B*1t+s6YtSw4kqtEiHed4v6nE#Hj$4Y&mjx zosjE-hh7#0*!Xf8Sh^F(tk4O>~i|epw~!BQbqMe10!WnaWTHW zCtfkF1gTC3b0)F9Am>T}Zq9+DXqJt}k=!`l8oz84TN(ksx-gYlM2+Q1Wa#z&r)1@k b-`@S>d#5W?_4WK@|G}&N@8SQCKY#U4qBMn! diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_2024-04-05T09:03:10.414391623Z_GetEpochsInfoRequest_6a828350e795a088dbc835260a1add01a7428085ffdcf1e11cccf19c48c5f7a1.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_2024-04-20T17:32:58.239918000Z_GetEpochsInfoRequest_6a828350e795a088dbc835260a1add01a7428085ffdcf1e11cccf19c48c5f7a1.json similarity index 99% rename from packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_2024-04-05T09:03:10.414391623Z_GetEpochsInfoRequest_6a828350e795a088dbc835260a1add01a7428085ffdcf1e11cccf19c48c5f7a1.json rename to packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_2024-04-20T17:32:58.239918000Z_GetEpochsInfoRequest_6a828350e795a088dbc835260a1add01a7428085ffdcf1e11cccf19c48c5f7a1.json index ee149e7bd3d6f5170097bd17697256b843f62ec7..47a7cc84c41a9d724c1b9f4115a1c6e89c9c100c 100644 GIT binary patch delta 2014 zcmXw4U2GIp6i&BYXm`uZz0>Z>Pu-zK>4>F;-6BY0+aNLFfo@;W1Wnr)HIbwXi3TIF zCEQ$ zq~zg{q}E_SD!b95yz5A{zEM!qL_kue7K3@YRFL`V3PBMEOFM2Ff)2clK~xt>nj6BB z8VFGU_4AdIau=4PN{Mno9sf!}xy6t?cDLmC z-I5}}2NVPP-4Cn)Rsy9!84v)1Ksm4qFaQ$}fCMa{0;mK+Kp1!mSPiTJ)&lE*D&T1# z0@%QMpc<$FHUQ56&jK5P+Tpt;&d510+o`!SN!`J)qQlB~?S2RPl`#{jm#7 zG2Q0_;IUwX$BwjvVjM#5UA-7u7coRW2Py6MP`6aMB=`Gbq0X~6yc?Hx#j!2(i=e5_C9)~IOPZ<$wV59c33_tPvFM|eK+PpK=|jEf zjd^S^9^(GFLwHKwz|)|MLk-|0tk^gD6w}Ii2z(Hf3GM zr2GV~*}s6Vxi4|oQAmRh&V)>w{Tg%i55Yzk_P1`v1=I7dX1^y zQ`u6RdV)b)b=I16;F{KH5_;jRSb%qqgTk?1Tsl@8aM|2nIHy~(IR^Q6q=jLZCbk?=WrKyHG#~L#}$Hf zA}aAfz)%pIC6xQsl8bcgg_wD@7Op1~7Fhcyc-2nCCX|RH+1w6HahLlCo$c%{_P*u$ z^iNRn&NG6=O&ORL&8Jb6{!whw4ADpph|w0q@xPG*qjNh@tT{iD7z^WRoz7%jArscK zVL`YoxBgpti64dL?7A1ho^cyP`kGTg8Chv~!RaN%(b!hn={k*`pm{^rjNT8ush&DX zI|pHGd7syB<9`}LJr8fgghzxfxb9buHJJqiDa2vVK?b@;XX=qg4>;@qvAVy!EST(^ zi*OeF=ozjSd-BOk@MQK&<~pNuY?wrjTh4(ob_s0-i6$`FdKkw=29Q`z;fV>qBBB5L z*O%=>H~;J|2$9>TEe$9CbXW*gI4Tu9lcuvMzZgRAnp3(b^m=wIHaPA`wk>uBq@W_W z?MmJ+Jm*MEqGekO=uvKwNDO7sX2IUXKLSpfTTQdA+}H7oS_}zIi5GQ$SaXsF<2rto zsDr=;5$2`~_>t*9$juW7pCu95houeLN}GrA5$dGYKBSwiu_(SdAbi`R)Hmd`Qei*X ziEKhIG)o+u4T54OAlZZf`Iy`UKCqQ*PAPK_ue#}3zigqL8!L0V6V$MAvpH)=&5Inbw_#_`|3TcrOaK4? delta 1950 zcmXX{U2Kz87|z$f80NZ7LosAoxzWWCIx=otG@XfFj3sU)>J4h=bKY|CeCgM7-v8%$ zzxfB3D<*)`v-Xazjx#@o?48k$Gk>+Ywrq`dc6PPzXm8i86))JfZP)Kr+@PByN}f+v zD=NNPt@Ijx>^q_)%?&B3Q=dyp#yyHIJy$D9ZmLsMn#Jo%Gp=Q};t{zVQZzTM1P$D) zlC-$rA$6kGqDb5+De{h6^8Y$%v*_qlNK#=MZbg+v10$BC-e>HRF23ZDbZdOQ&`0-4 z9oQmhMmZJbZ`&m02R)KfVO;PHTZ(3KA&dI1!cRDkE2~}WkZ3^2lZDDp3zZds4X^{| zy$WyuPM{iC2e^P5pcZ%xa03F6fC4PQ1FQ!&0Chk;&;T?78-XUE8Snx=zz+m~$AKWQ z33vi{64(qpb)!%j`sE_UrqHX{RXn^)HbKcT6q8p@d43V~eHcY8rFjR697LsS|6v9* zgXlF|B@Uxo*?yyUFp75{!Qn&>rYnaqh`I6glG1x|W3^4`(_g#k__P_^j9qCN z6qFvrTRMoF-EYAXNklrb+HM*cB%c zp?68r(fb=f2IR|>>Hi9Ols>>&YzCuytYYZ^kry#^rqRHk z;72-)Q}HEcYFMRLtEB-qK&KA+&$@*<{Y0mP9l=5#Q zO!NwvnN?^_Hi#QwD-P=g`FilzaI8kq;#Q=2;(NQeP{P&bC7Yj$hj4YJ29H>-+DF-G zgqo~Dx$a@~FmoSOn&#a4LzGFHI0hF1LefnC*fsQc4{X>)=^;vH)~60i(*;TXFEIGY zoC6dX!L{&|nUfLN!)5fty$7#6ewL4W!BTqoX1Vi}^ui!^3MJ+-7JofrP7HbiBwj&1 z$-}TTv!k#Bqf9IdjJ{9M-62$F{FLWq7?eE;uNjwzp6! zqXBfiAKub&SnP5sW=U!cbTm|;<2PLoy~yWTDDe=EBS!+-e>V zby9D^iKTHB43x!c!7|qV21WkA!9ZRxyd9W9qfgg8+8SO2zW6cNn9iB#JqWi5#w=D! znta!VKHi0Hx_b-}uaz@t*@ezB@nXl&DRahs*E@eGlV6``koNZN+sHQ_YNYokLQQ(D z?GfiQJB6go%ZS(gx?7qxrlUiW4xEIO$Q7(INLS}S;VRKjRhE=*3PrBW;|}xM$W^a7 z%BCEj1)TU9GvhrL-VD9)LhRmwRtH*Y<@pS3A_1j;Z58D`S_)#i;eX&c{w>5ZFzpFk zs0S%o{YK_wGy!Hx+SvsCnwIb?;T@4Y1#7n#Dakj$`tT_H7(weuqtsbYl$-q^55w5M zk_pFqnU~aB5CkurGbTpLM(0$_!6Az(VKy3XDG_!`ByG{E@?eu!8N!qoN&Fi4at;>7 z=V8l2H#Ez*EJ``xoVOoSH@z1f;Bj&Ctm&RG2KVfK6w9yXd!Xaj5vma)9;%bHuR+L) zF7l3tHqyQ8p>34UA*YF-aL?>2CMjzzQ}0pQzXdG&2785NV$w1rqyvM9oV|l2nSCn? zzsxrdtVHr=%kU>@t_B_E&Be9wj^@4EltoN4gR@X^-?9kk3Cw)dC2SpChFbw@`7RXt EAMF&TQ2+n{ diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json deleted file mode 100644 index 6eaf11a788..0000000000 --- a/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json +++ /dev/null @@ -1 +0,0 @@ -[173,50,8,34,25,140,227,142,53,135,194,216,242,27,172,247,219,172,219,175,172,23,135,155,49,211,157,167,27,158,0,180,152,206,45,235,171,83,75,48,116,32,125,175,252,120,93,39] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json new file mode 100644 index 0000000000..7f0850a40d --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json @@ -0,0 +1 @@ +[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_2024-04-05T09:03:09.939849246Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/test_epoch_list/msg_2024-04-20T17:32:57.792457000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json similarity index 76% rename from packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_2024-04-05T09:03:09.939849246Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json rename to packages/rs-sdk/tests/vectors/test_epoch_list/msg_2024-04-20T17:32:57.792457000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json index cbec48463037b91a0c7906b15c82bffd07c2dfcb..348f1953ea70832d271ea0c5f015878ece72bb76 100644 GIT binary patch literal 19700 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 literal 19680 zcmeI)*=`)k5d}~`>nntQ_CrVZ?q4wsf+Mv>!lEd18Ne9m-(A_*W_JJf;p4}}ug9C)%j<88KYjddy6hh;pZ}h&Ev0k_T(t4++O@|O_{-BE7T<5K ze?3m?ba!)qJl*^;{rAU*A0Phkp)cxtYkYOQJO6xscRsB9^wP!g^2^2D^x0y)UoW2e znr?i$zB!(Kx;Vf5cJ}r9)8CGt&z>Kx-Ey$U;`sgg)5X-nFqg&M<<;@*>bAFAyK1ZD zZnv*P)!4%{pS$Z%*I&E?^u_jiU7ymomQCfV-~ZuH9I+rhI=x5o%L zec=0}L!2I1F`(7pR{eqP;D4tVmP05#v_KyRT5OF6V$^ML-&2!5v9r&0^nu+DywSAG zZV0|ppFR*{dh&$+^t3P|hV>6>49NZgBWfcg^!u&F5Eyig=+s{s5wTx8%OPs|ZH%;H z9T?yUs{L)Aey6e8#Nc@&3>3aNf@vSYKAO~GWAf;4)Cv=XJ2R_U0ywom18s!KI~)OF~q`6jj0+_c5k4xbO2nfSuO3<3d6M(Z`8Q^!z^p!)mRHd@_fLS{?IgZYuKswv{@ULH(X}L z1H?%rC;f#EZLYRDxq(@xuZWwGKX(TVI~?$ym}JGUM8=Ws_ddeo!ei&|!7N+DF2w^Q z>{NZB7g&>v&5^~Sw-BJMoU{^R797NOrOy@y4bhr9HrOtTV0R(Rv#+*^sj=oURyGU$WR!(8iMLL%5i|7Fr zF7A%N3IG&B8)ge))RvKl_#pVdLP3Rmu>?J4B3}3NNOmQ=FR4qA0x6-%ficAT&qUNd zsKU5Wuggha@B0psn0=Q zk|!AD6-jyAi0Um)n^AKdVW~(wJPhb~X#jH{^U?F$m(ILQ3#klQbTYLHQ6&&p{UJbJ z0P=;{xllON@2z~*Dw%^G7d{`LYxGO|O5)gLSQ=a}*a*?oEJGyMHW%!%%zat*pHh>TaKP0y;&Bxliv`yG%IJL&R?%zA(etHGzK>afv=Gah3PWs!7^F@jTqi_pEt@#bVn>Y<+EExLg>5WV zdrT3T-}DoSKe7ov85}s&qu^J;;l}d`rwnF!W+784=8;<>69@7W>#VRn>VwgKlZb{# zxb5!dTM3ckv`#52Or1^vC=`8Woe0QkyT_F;WM~07p_HUM=*7aWEY49y7xIA6Qp6w^ zGb+0|B2^qd;J(#qoDPsbx4;Y4nlyd9qTNCfimf%1aOlq!!vMybi&G{k-P|0RO1>>L zHwR3+v7MqNDi&0p=e6vi`JO>vXffS(r9_yqo8APXqbbVOOr8KLE(3FM3Xau~zBfXE9(CRG~ zQV-&S5W|il zD7Gi3?^w(oS-305>Fu#uz$wRPk*u-3tv_NF1ppsacz;zqmgeoD_d8@jn!14-&_I zf+;|BkYtugK}3&39wC;Mic6eVj8O*YOV;B|j_O9mZaMm>fcy%?;}DQQ>AYJGzi&8p z8MFUW4Uvxph*I0>ax6s3kV>cj0~?NHa4rEdF4eSRw@cxyB8s(0)NKK^mh7R-23gIW z8D?3QRi;-puFzaud6Q5Rfg|T+O*~IQLUMe|E9y_rEQwvAnum%e21nH$U+yr|fmHGu z^=R*#W<}c+ztk?wJq%yTla(^qlYkF|*Gr|ClU z3qd-Iq)=VhUr1?}>=)Ds$cgU>hEAi~t1hb?Vc2lFSP8*H7EyXo9CV2d2@_Gs)n=xU zuhr;ckfg3SG8DpcZ8d#q1Si%*1-B#@B*1t+s6YtSw4kqtEiHed4v6nE#Hj$4Y&mjx zosjE-hh7#0*!Xf8Sh^F(tk4O>~i|epw~!BQbqMe10!WnaWTHW zCtfkF1gTC3b0)F9Am>T}Zq9+DXqJt}k=!`l8oz84TN(ksx-gYlM2+Q1Wa#z&r)1@k b-`@S>d#5W?_4WK@|G}&N@8SQCKY#U4qBMn! diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list/msg_2024-04-05T09:03:10.383446704Z_GetEpochsInfoRequest_734f6594c67fe6a9ab170191031d592c8fe7361bed628d9a36747664c9789bf1.json b/packages/rs-sdk/tests/vectors/test_epoch_list/msg_2024-04-20T17:32:58.219154000Z_GetEpochsInfoRequest_734f6594c67fe6a9ab170191031d592c8fe7361bed628d9a36747664c9789bf1.json similarity index 99% rename from packages/rs-sdk/tests/vectors/test_epoch_list/msg_2024-04-05T09:03:10.383446704Z_GetEpochsInfoRequest_734f6594c67fe6a9ab170191031d592c8fe7361bed628d9a36747664c9789bf1.json rename to packages/rs-sdk/tests/vectors/test_epoch_list/msg_2024-04-20T17:32:58.219154000Z_GetEpochsInfoRequest_734f6594c67fe6a9ab170191031d592c8fe7361bed628d9a36747664c9789bf1.json index a399d8254b8f080867d339cc89ceabb4912f8892..8d42780da1314ffcf203b41405e3efcfd78878b8 100644 GIT binary patch delta 2144 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 b-`@S>d#5W?_4WK@|G}&N@8SQCKY#U4qBMn! diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_2024-04-20T17:32:57.794148000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_2024-04-20T17:32:57.794148000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json new file mode 100644 index 0000000000000000000000000000000000000000..348f1953ea70832d271ea0c5f015878ece72bb76 GIT binary patch literal 19700 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_2024-04-05T09:03:10.414834086Z_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json b/packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_2024-04-20T17:32:58.215202000Z_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json similarity index 99% rename from packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_2024-04-05T09:03:10.414834086Z_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json rename to packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_2024-04-20T17:32:58.215202000Z_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json index f33e39011c8e04ab11102b16aeb4e8cc76be530a..e6f8492c798806035acbed63ffa818f1e9acb958 100644 GIT binary patch delta 1981 zcmXw4Uuc_E6z5CQWZjbQyEm)d*4dVq5Y7|Mpw zR!C7{m~PyT!-h-dgA695__B?yw9W?==h8AO6p^H|p*U+=$5z^*jlXl^9)6+Uz4!e4 zo!>eAGd*sd8XdPzf9HwE&)nMOZEtTov$A_*{KfbS@qK&ST3gL->s3!%n|aT=O1YSEl=p zrs!+F|IJ&U4La$h@1vy80z7~h;O`p14+MY>KrOHl*aQTD5MToipa2bofz3c2@DxxF zYyq|c+kggOJMc8n2t;QINP5NSWzf*Stb@rY|?%Btv^NZ11MK>Oz?6F5a zuu$Vg?cG+G#x4Y%DviTMJdQeGb@)80jWpt?5a+)x;wLcpE8vNP1F4z5VZuO^~bo3WWbx9#Ea6$h#ztt+w|R0RJnm? zg&lZS*zMJ4yKq-^%QYm5c;9F>YZ{K#ZKmaZ+adQs4DH;naJJvprs-FR;14v+-HPnj zPr&}vQItA73Bio4C_1thQ>G7X&1Z0zxec4?+AxjGBW|$|M^m38y`ST-7Lm>LMCtTe zz+tsSY0&FLs-KmDKSG5oc9Z$aam?$Wbb3GZBPDectg}5RLbNA}Lq3`+IXn>oiM$d? zJgEe5F*bzoLil>USDRzVPvn@piHc|As8ceU`U`P}=W#YsM%e?8n9dq}avZbg8!c6t zY;9G#CO3zow#>j;CRt{E@GVd}asXk(K-9}R5rvgsL4JJ+tOOW^sqz@H7H&XN zv&%6>H&}rj zH{OK&VTyhYR%hO<3)7&BP^@V4GV2~&ja;s~@(`a=-+B&b!^iQ{H4Z-x97+o74?Wu3 z7T-(BN^BcBYq9M#aT7+DZ#|KS$ZqT))OG!Bq}%J~?0M{XgPI=@SdN4b>A#Gwq@2&8 zhr9*d6wIY*Elb>S9F?Xp;5=(pAq(}{9k>knp}K!T$1i2=R9C93V`06VKwo4D+bnM0 z8I)WFZDOBaj)iHa6Df7MPdIM+8@Jap=ooJk=~LzcOt~ym(%4=Hz11Du^a)BHJd6d+ zq)^Lkw2Bvp%oDFX8BbYalDAYa)dNa-jZ?WFA)V1Du6bUvMI4D>g|L=1+=?m2uG$7Jr@;!28^&h^5AD$u8fIL|oBBbJ7P+RzxI}WANK-yAf zb{RCxhm@zijr-a~DL<6LV&~mu9DGPulh4(O6O#(!zZ!3LAvDX`rFPb7>R^|$OQo=P z*3cFw$r9r&p2W^H7w6Cc_>pNb5y-N`YDUL-pSr7HBS}_-N{etgmPTiI?jX3As)C!e Hn)mz%w@{t} delta 1963 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 literal 10626 zcmb7~%Wfk#5Jj{0R~Ws{qO1CyUkL(1V|Oeew&lpu0Kvfj9+G~jc&?p6vY3c$HXp@X zw{BJY$JO<9^L;%&?+=g7Z`VIkGk3Hfzf)^}n_9n@C;4eV|N8OU;_syk4~8K&{L=7l zyfoU&&%rLgZ3&3UfQkuyWJ`EHT~Q-?`x$8H;3c8x!G;^kDL3$&0p*7=3}T$ZLmkP zJ{@j$X@+o?=CprUHxJKwUYpFjcA92e%;E~^Jg39W;eK-gXRvJZx^_WkbGv=sJ#0^F z-pclVGmOofbza_g+#J{E^L;+ZE5HlL(+Y<_tFCmgyKKhWZ=3gr7ue@_!VYpXz@#+W zfQj6J;cPAe*Jb#C3FiQxGN27m$sJ3ubQuu9n%mJ0%Jb+-xg)@^JRh;8fhTIQ#R%Tl z889F^UmnnN%M+H2j#XxyF(9G;{a*9)WM;>l{?lDfybBt}I;^_D^k$p_rs6KW!vJqF z15VN5n2~qOvALtjzhyw=;MWdJS#fb55xg`vBPZu}#ml*);^y2D`MC^;9GyEX@^tAS zNS%-|aRb0Sa(A9G@^@}W?#%7T zWl!`VCj+~@B3@XNm7txrbq7{v9E#lKv_ePAibFYhz-Sn{91ejklG(5;Ps$F9d}NU_>e;mj!q)qIalfTs$b2U&_5O9+6&*PUCcB z=M+wso53e^O!AG>FNs*VsYqWZDH_$Lq=dLTV`j~eNN`FlzyM|p!u$$eiLq2Hno8Gz z6|ZELOEM8NIYBwYqb6LfphH-mhUOtuT5wI{F{qFc*qwI68C-+`_UQDQg)@k_fvbaf zs7#o35IblKb&A3xL1O|FCc!llIRZ|GCAoLurc~vt(Wy~{1W&h@d#xvQ#xY?~0>u{I z6PJ`s9ye*kj)~W5Qi^k+i50j-Sdo1F-;>e8Hh@ZvB_?BGLJ}|L?NWVXK4NqyW27V5 zQsh*1{1V1+Y)Sl0(n0c$luj2|nu=E7CKW)F@Jk<%x+Ce5B=r0tW=V{B-Y{J zXo|?7VHh)vH4(mGgbeRSEX(Ljr;{{lWGVsiB~(E!p=J>Rq+dA9W(s0P5$YzsqZ*ZB zU>D=TB^@E(&2&);1ze{vur5hnnSg9!O!MjCOUOL$?;f|O^D%$mt^p%FJVPAwyB)Q( zs28z5i9$*+R9y^TMxtPOT&k&LFQd;Jtw~vG5|zmUQqBD2N)bz>a>Ng7;tZOCl3L_G z=%P{xM(mgIQnqEmf<8^Gi!JG}F1*g*VRSgkPYPH;9ko3#JpI)~oiB-&q>J-dD!WN5 zEZmSSiDS`{^aP3~`Ru7RcafiRZq{N%BuSB7qL=7N@g7PP(UB7xOHs6a(r^{^qa6$nkJ~%zxfi zIaBj3|54LspZ==pGm)ZYeSYf@a4^3RUNpjk;gK;!WV^ygUSU{qh7|=EPvZPaFVf>D z)i3$L$@14Hs7FYbinJ(kpz>% diff --git a/packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json b/packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json deleted file mode 100644 index 6eaf11a788..0000000000 --- a/packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json +++ /dev/null @@ -1 +0,0 @@ -[173,50,8,34,25,140,227,142,53,135,194,216,242,27,172,247,219,172,219,175,172,23,135,155,49,211,157,167,27,158,0,180,152,206,45,235,171,83,75,48,116,32,125,175,252,120,93,39] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json new file mode 100644 index 0000000000..7f0850a40d --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json @@ -0,0 +1 @@ +[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/msg_2024-04-05T09:03:10.102307738Z_GetIdentityBalanceAndRevisionRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/msg_2024-04-20T17:32:57.807110000Z_GetIdentityBalanceAndRevisionRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json similarity index 76% rename from packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/msg_2024-04-05T09:03:10.102307738Z_GetIdentityBalanceAndRevisionRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json rename to packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/msg_2024-04-20T17:32:57.807110000Z_GetIdentityBalanceAndRevisionRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json index 1d0d0d95446450f2ca0c26dea2686eb7727da475..4f098886a58ef4403b75cd388367a6e254062963 100644 GIT binary patch literal 18554 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 literal 13401 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 diff --git a/packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json b/packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json deleted file mode 100644 index 6eaf11a788..0000000000 --- a/packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json +++ /dev/null @@ -1 +0,0 @@ -[173,50,8,34,25,140,227,142,53,135,194,216,242,27,172,247,219,172,219,175,172,23,135,155,49,211,157,167,27,158,0,180,152,206,45,235,171,83,75,48,116,32,125,175,252,120,93,39] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json new file mode 100644 index 0000000000..7f0850a40d --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json @@ -0,0 +1 @@ +[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/msg_2024-04-05T09:03:10.110827591Z_GetIdentityKeysRequest_b4ecff7acf52818aef9ed37a98d4a459dc7a67570ea6df3f8858d3fae7820ffe.json b/packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/msg_2024-04-20T17:32:57.805215000Z_GetIdentityKeysRequest_b4ecff7acf52818aef9ed37a98d4a459dc7a67570ea6df3f8858d3fae7820ffe.json similarity index 74% rename from packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/msg_2024-04-05T09:03:10.110827591Z_GetIdentityKeysRequest_b4ecff7acf52818aef9ed37a98d4a459dc7a67570ea6df3f8858d3fae7820ffe.json rename to packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/msg_2024-04-20T17:32:57.805215000Z_GetIdentityKeysRequest_b4ecff7acf52818aef9ed37a98d4a459dc7a67570ea6df3f8858d3fae7820ffe.json index 64dea58e4a03f1388732f346320f253032861aaa..73d7c1d6c87db55a28d8e21dfbaf385468a1fac3 100644 GIT binary patch literal 14334 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 literal 22136 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 CpuhtF diff --git a/packages/rs-sdk/tests/vectors/test_identity_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json b/packages/rs-sdk/tests/vectors/test_identity_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json deleted file mode 100644 index 6eaf11a788..0000000000 --- a/packages/rs-sdk/tests/vectors/test_identity_read/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json +++ /dev/null @@ -1 +0,0 @@ -[173,50,8,34,25,140,227,142,53,135,194,216,242,27,172,247,219,172,219,175,172,23,135,155,49,211,157,167,27,158,0,180,152,206,45,235,171,83,75,48,116,32,125,175,252,120,93,39] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/test_identity_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json new file mode 100644 index 0000000000..7f0850a40d --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_identity_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json @@ -0,0 +1 @@ +[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_2024-04-05T09:03:10.108285016Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json b/packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_2024-04-20T17:32:57.822981000Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json similarity index 77% rename from packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_2024-04-05T09:03:10.108285016Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json rename to packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_2024-04-20T17:32:57.822981000Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json index fbf1b494d3042f8808421e61df026cbc409fb875..26ea2400cf8930fe6a3e1b4a085a611984d8bfda 100644 GIT binary patch literal 22156 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 literal 22136 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 CpuhtF diff --git a/packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_2024-04-05T09:03:10.226228133Z_IdentityRequest_f5a59abf6d775a8b9e8100fa4c3326bac5c6f9a7e376330066e2e0642706877c.json b/packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_2024-04-20T17:32:57.846960000Z_IdentityRequest_3107337faa1f180a1071b78a90dcdc46e3cf0d7d4ce093bba24086e17410ed7d.json similarity index 77% rename from packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_2024-04-05T09:03:10.226228133Z_IdentityRequest_f5a59abf6d775a8b9e8100fa4c3326bac5c6f9a7e376330066e2e0642706877c.json rename to packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_2024-04-20T17:32:57.846960000Z_IdentityRequest_3107337faa1f180a1071b78a90dcdc46e3cf0d7d4ce093bba24086e17410ed7d.json index 3f60c21b6351d2dde2d58b3a5858cb6ba8bdffeb..12a843e9bc7048161bd561991d2aea4aafa26770 100644 GIT binary patch literal 28889 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 WeQf;T>CeAHwus@+|F`;Gvi|~JllHs- diff --git a/packages/rs-sdk/tests/vectors/test_identity_read_by_key/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json b/packages/rs-sdk/tests/vectors/test_identity_read_by_key/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json deleted file mode 100644 index 6eaf11a788..0000000000 --- a/packages/rs-sdk/tests/vectors/test_identity_read_by_key/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json +++ /dev/null @@ -1 +0,0 @@ -[173,50,8,34,25,140,227,142,53,135,194,216,242,27,172,247,219,172,219,175,172,23,135,155,49,211,157,167,27,158,0,180,152,206,45,235,171,83,75,48,116,32,125,175,252,120,93,39] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_read_by_key/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/test_identity_read_by_key/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json new file mode 100644 index 0000000000..7f0850a40d --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_identity_read_by_key/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json @@ -0,0 +1 @@ +[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/msg_2024-04-05T09:03:10.133854190Z_GetProtocolVersionUpgradeStateRequest_bb149e1933b9dc561bbfacfb6d09550f0ea4a6af6f68037e7d50ff4e4de74509.json b/packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/msg_2024-04-20T17:32:57.844598000Z_GetProtocolVersionUpgradeStateRequest_bb149e1933b9dc561bbfacfb6d09550f0ea4a6af6f68037e7d50ff4e4de74509.json similarity index 67% rename from packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/msg_2024-04-05T09:03:10.133854190Z_GetProtocolVersionUpgradeStateRequest_bb149e1933b9dc561bbfacfb6d09550f0ea4a6af6f68037e7d50ff4e4de74509.json rename to packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/msg_2024-04-20T17:32:57.844598000Z_GetProtocolVersionUpgradeStateRequest_bb149e1933b9dc561bbfacfb6d09550f0ea4a6af6f68037e7d50ff4e4de74509.json index d62434f6baadb9846364c73e9adecc40ce2acf4a..78c519bd07900af1c5d8111345a3769fac95e709 100644 GIT binary patch literal 8229 zcmai(*^b*r5JmGmUm@r@54^=azY+w5EHNV?qv1rN3>e1zySrx#d2Yt`gYBl+wb!kM z-|se??bq>gJx!0>KQ`afF+V6i{+~`ym+9-69?X~9`11R6`uq9r`R=#7{Qj@5pT~K3 z*v-2I$#m&Bp6-uxdbTag?e8ySUs&&_%Q)t55vcss_R(1IX+GMV#S(UA#D3%w{okRTrydgf#Q&MqG|n{s`` zT^twY$#<*uUHpo>VD$5s+h$D~oIo11aIDv)U=EP_`4N=Wl9;+RGga;SK?F4G;SW&) z*i9W?=pj@|f(0%_Q0kT@s$uUEJfeVF>Y+H*ih_FM9HLa@QQ-v$-9e-VuPdMwT_ZAR zX*hwUkp#=AK%s_=C9Fp0M+IlnxeW*^5H4iU;&&C$DFk1)I7da#nHB-HEnK1mS5v%z zvuYT^604=A!5a;vDsh&%mr}YO^iOTZA`=)7KYJFe;RCPBQ<))1GX$MurYD9)Kq(ms zCbt6K=%F?dM-4875U3s888u!=HF|BUD3Kf;dB9c;Sjb|kh8jJ?m@Jtqsv#t0A_@{Q zV%fIj8r(q%9_cImPP?n1Sv%-x5{M;D1q=y4*zc;q)U>uBwZLycf}j)?5G5)o)*;Np z03x6Wj)sitVeKgF0iG!gJjN2~I56@3|O8`UDSaWu4oBXNWR2sIKzOstQf zY>6ad63=4OCDB8czCyf}1|q&b~YV;JHUB49?*jaGJot-Ko0us%DeiAl~E2&n8z z$x?)-l33Ow+N|C>0+Xfye|}zU-TqpJ*!JJsbh({}V_Ny8)g88TgcA{=#9^0}-zKt_ zq5@#7Vg*rBh8V0+Y?p&l8E$eomf;?ogAm*%UtU2~tG$+a#38GLmIIvoExj$m+3%SP zjcJ-LJ`JDi>Hcvy-!6Gkj^N>tVzP6f49-@;E|8t54btp9IB2uEF#_CL*#Jn97;C;B zU^!wH=U8O8#)h2x2CK2w&4{CttphFKnPirQW=iToZ_2z!h$nt?XJP4KYH<#u62Fq+j*m$$ivu`JCq^*v6b+`G_ z>LiJ>9r7`pMX!!ei_2xYJ?0ORt1fu^C4V3tPU#Ej|Mo0|d@gb5e@?R&b76D6bwMn3 zVv|QC^AVYw0MW9x=wY(hRKvDN{O)99H#e%LI!6N=#%z?b4-qJbT(7TuoxTX$0*pn& gTKw+QczWw~=WkEBT~X0|yqQ1k=RdFizJ2Kb0c&}RIsgCw literal 8203 zcmai(TW`}q5QTZ}uZZ%@gU|TRUqQ$UiD@F5x+G2|g!=}pcaMS&>TQd<)XCHP+#%^=oA2(y4RN35gWwm}* z^x@@&^{GE!ZjvESzI(J`I$`*+*qSW9PHxfFF z2Jo92JkUa^oB}hv5J9bLx~PP|bDR+w%u)-(X;x&k8|x6Y;u!@VfYJ?As_?i1Mlm$v z0W}>b9BCqPB;jFhi$Ji<3z0*n_=*@TRe((7&^w1=En@)zf|i6sj^N8cT;houYZcfi z5Udb%!t;!kcp{xbzY;!b;1u{E;6vrmSPha!5C{Pldi;(hgxTqVm{(K}0^m>cza7AA zu@JVXGuw@Cy13p|I*)01UybX(>V2U?kv#3TrkP2ovjS4SU0wkz@~nR(FLk5;>wlUT2wL zEH6|0zwFCICB*{4w70k}1qR!TAcGPpVi^{XwB8SqlXZ5MwRD8#6oL~>5rdz((g2Zx zA;r$lL@>#$)^I*h!81y1l<-x-HDIhDLI`{X7_UU$@ptP{xIvu^ltvC-Q(M|Wq&Lu7 z79Oh}95I-G#0-OB^$zJd&DKmFl3s=*Yg)L!(Um;l>d&xRM&aht6 z=+%eskF5_+dA`7E7|br);OHaHP9!E{Hp0xfkj2faCtXKiI_r>^kSjjs*3^>I0wwST zHhb1LfzMUXuGzlLp|<{Y8BUjDx1a9#rn|c3bsW?HpiOC5MNbEL&MLGOOOE^OK!bR& zo|e4iL?pr%$!0Z$!C*4l&6&+89NZdH0r`(``jkXp+XTWI!jZ*??DAd6oDbKxoAGi= z*WpXRi22xn^?2E4*$2qkJ(V)+65uPgPsViYO_{!8HkAOrCp5juUR6exHd&ip9#R-; z{Sr&6C4-^D?$<0HY@*e`83>0x-xAxr#b8bo>*h-)tQ9*|&{0e{wuRos%{g-VF2RwC z0k=L-yy&1CXqI(UcCo?R9I_>GY`0j<1SYFkuw}vHJ%;Ex@q#AUc8PUEyaup}YuQ5( ziniOJ%@LLeFpjpN*9J8!U*d(GF^S0Z6`EAK!n-Vf6ESGo^Z+Q6g2i!y0@x6-6E~m& z>b#C_-fu=u!{s)8a$J<)_4o7%v^z}SK;LRoWCIra3&069xRWnA;FsA@Ud4| zR)U{H9ALC0a?r08jsIMU1wW8*5_|*oDCs_0&{Csc6f#b$^rgsrmRCjdZnN^--;TfU VQoEw8dVMl|z)ydk{(b(O{}*g=g*yNM diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json b/packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json deleted file mode 100644 index 6eaf11a788..0000000000 --- a/packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json +++ /dev/null @@ -1 +0,0 @@ -[173,50,8,34,25,140,227,142,53,135,194,216,242,27,172,247,219,172,219,175,172,23,135,155,49,211,157,167,27,158,0,180,152,206,45,235,171,83,75,48,116,32,125,175,252,120,93,39] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json new file mode 100644 index 0000000000..7f0850a40d --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json @@ -0,0 +1 @@ +[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/msg_2024-04-05T09:03:10.136835219Z_GetProtocolVersionUpgradeVoteStatusRequest_ec9dca65a964669b3bc8195d5ff106e5eda740be44679cc960ea35f2134af628.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/msg_2024-04-20T17:32:57.847045000Z_GetProtocolVersionUpgradeVoteStatusRequest_ec9dca65a964669b3bc8195d5ff106e5eda740be44679cc960ea35f2134af628.json similarity index 68% rename from packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/msg_2024-04-05T09:03:10.136835219Z_GetProtocolVersionUpgradeVoteStatusRequest_ec9dca65a964669b3bc8195d5ff106e5eda740be44679cc960ea35f2134af628.json rename to packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/msg_2024-04-20T17:32:57.847045000Z_GetProtocolVersionUpgradeVoteStatusRequest_ec9dca65a964669b3bc8195d5ff106e5eda740be44679cc960ea35f2134af628.json index 4ccecf96b034cd01f6daf3bed5fb1960dc1f1d60..21c535cabdd031820be105632d426dc5d4cd07d0 100644 GIT binary patch literal 10897 zcmeI&%WfM-5Czbz^%VlwS+IKe%&!CiK}(E9L=qK>G7=d2_sqzW%sJPFH(A;X+dVV= zsMoDq)%<*Mc{%yCJ3j6Y_mkf)Klj7o!SwzA{pj(uJ)SlX$HV6I&*o)9yeW5bb$Gfz^@?xrPkMuV+VxLP$EV%P=g@(@Q$=g=_^Q*&gx4F96?(a9ZhpWGK*PHh*Yd(KJRR87f z;czv0$eCYEPW!vv=I(J=wwBc`x>>iZHl3dD(2H|ATpeyVU%j!;5Ad@0{(4yBy7$4m z?P)h0WqZ46ZStzF=eG%ye4c97$XM-K*?^gA5>96jnEejK!T{b6wLmzQ51dzf=} zf?;?j=gZrgzil`SFE2ZWem|X!KWI~CEE%sB;|bMRvSY<1C$7br9fl*;Y&l-Cb?&j| zLB|qp#-=mWP~D0>8gjMr!IUX$jydB{wLntltB9pStj9;J5CS1<#gP@EG+vvt=ZY~y zHsmehGUQ{9+Tk^Q?2V;wb7s`c2Mr^m?^>hK6(8ym|WkkjwPE;Q-08KsD_T4 z5!^b&Y&xErn!DtbJ!{F5amvPwv_^QZst8@JvG9UJEZLLK5sJ5{nV}zJXTEMJ{n$6x zc$$v5#JLx^QJ-hV3nm24+=3;FEm$xDy%y-NgtKaBWzCEQM=JfS=B%({g=$FQcq7nB!)x(3LQ2gbD(9OHC1q_bXrP=aIZrqYJE%s7keo5G`b4i53XpnkX&( zNi~-K6Ao50RP_yrSF*WNRs=$u@gTSYPAUMG%wWxe5jYBJ_zRV|uo8`-0liC&I2&vI z%(4T)?Eh%wpIP>cUPi_8@Mu92u4V+9wo7telFEp4z(-zI5}F@xDW;0qrj42ds*x$#9q0j{!(UK&!qj0tajdu z86YMy_Bi1+ZAFSx?`6lL1{!lp)(VhOa(8Y~Dm zaz!awlASh1{Y^+RP@*d#%afpm&qiCrSRFe|v|WrUK1ZPFk?4Qr0a>6F$O1#1mXI0{ z80cgBpvtUSe5^mx_quN#iVhpn02$5)q}` zR<(k#fEid()~L}Bz~L=nh~hFvV}n|-q8*F`QF%g}QHhjpZlPUrljw5jL3W7BV}h6w zNS0<%>l=AEN1MThA{(N|rfCAB!?w}sEK`LJWn0ojQD)etm;#JEQw%gUMO(8?;St6@ zdMwFMa(rwXJvH1fWQ;7YskCL##%L}9c;uBZBqu~exSETBgySJAMq0(+2l5<^|#gIXb&8UJQy)x`y#?SJY2pPCX7w{>f*cZ^SJ+b zzdb!2hueSdt1VLE>=u;Gi@xXx7#aNy{#b)D58q2}Vu9$FTL4N-^|cZZyj^K#@u(t9 zsS@(I?G?0w&BP6L*%u9mmkG#KqQMZ=kk+iQo)9m7+p~yfo)utbkw`piJSN=V_>e-y zH9=I$S-u1LAV(A;nYWk`_#eUQCm;WJR7Ad{k5AcBc4idB0K z0zyT9H>J=+Lb{kupKDRqhn`GzCCL-XvP6zw z2B_I+^cXBQ!z&7RZ=|E_wxb%NTN*?$78EA#KB&%Yua9g!+}~+0lLj2BPp{wgr&q3f Z`uAa=D>Yrbe>wbKarpD)-`8I+{s$Qn^tAv0 literal 10871 zcmeI&%W~UB5Czbz^%W|vvtSP&AoDA!6pNM^OBG3UD9V+TOaC4~FB9k5aTZxh3rPS5 zGd;2v2m-8?E<#1#A_J4nMf7~99n@@-R=J?m^Ce?Oi*p8a$-nDIwe zz1NB{l)%f^A(PDGVSx)*O$W_mpuq? zx5wQe%JycnSWaH__4xY21vyfzLz?!pmt=L*?pmfQKp(}MU!yId5DnU49z>EQH&Js0e332Hrm#C?x zOdy16!IELpp4P^yU9m=o9@_#-){Hguj7tAUY(1f=`|vh|Mo~Of;PHkXjBLIf%rJGt z${A&+YRDV>qY-L~6>18&D!>IA!)~pRQ%eWnXFx-{uh7JT@oTre#%XKLHbYUWvMrcX zH(w%C(@Sg3n$Drvrgo>n@-oEtKrQUnMMi#kfc+KqNd(4jjpEuO~K=3S|irI_nI z&<=^zxe9*|v`=d3e}S$tGIgj<2G3Y$n28aQqXeCquCEkAmI$Yi?)1R2Unn_`rC$cdBAY{xnBFHwkDa{z@1-_+Gvo+PG1bP{O zE!4^ziV#b(fQ}Y>Y^EBTN?U$|4`4>;sxhMs{Ga zRB;e7mawJEt1f$wP49{u3q4$tuoD!_Cd{-^8QdazO1A=JzE+&6I><%o!vzvbOg&d9V665fgL%m zyp%*#!WL(Xn4&Rs#(-GVC>CzEHlizlIkQSq*HM8OLo8Xc$X!*IsW zp|t*JU)DZ+cps39zEK|9nu?e{1=E?E>b|8ndA?TR&}!3$!hh&-$B|Q-l%Np#k|8ym zAyCmQ$HN}FXdFA}k&r~$7B9OPR^wtlbg9Eeu&bp)=y0ZmaXKI;SW;>5$OGfR)EV7Y zWKTVJtM4h>1VtQK;pF6POU0i3d=Dy5B3TzMqU7`ftgG z@2Ey0c=BQRu4{AMf7st1S4_vGSD{^)_HBHnvcUsaffy`>v_#4a@el=fxH(7bfZ;yX}8q$^iW16>- P!&iyJ&-34xZxsIl1TF79 diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json deleted file mode 100644 index 6eaf11a788..0000000000 --- a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json +++ /dev/null @@ -1 +0,0 @@ -[173,50,8,34,25,140,227,142,53,135,194,216,242,27,172,247,219,172,219,175,172,23,135,155,49,211,157,167,27,158,0,180,152,206,45,235,171,83,75,48,116,32,125,175,252,120,93,39] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json new file mode 100644 index 0000000000..7f0850a40d --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json @@ -0,0 +1 @@ +[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/msg_2024-04-05T09:03:10.142375013Z_GetProtocolVersionUpgradeVoteStatusRequest_983670ac95678b1166deab32209bf1acc3394d29ac72f662d38e81344496631e.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/msg_2024-04-20T17:32:57.846269000Z_GetProtocolVersionUpgradeVoteStatusRequest_983670ac95678b1166deab32209bf1acc3394d29ac72f662d38e81344496631e.json similarity index 68% rename from packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/msg_2024-04-05T09:03:10.142375013Z_GetProtocolVersionUpgradeVoteStatusRequest_983670ac95678b1166deab32209bf1acc3394d29ac72f662d38e81344496631e.json rename to packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/msg_2024-04-20T17:32:57.846269000Z_GetProtocolVersionUpgradeVoteStatusRequest_983670ac95678b1166deab32209bf1acc3394d29ac72f662d38e81344496631e.json index 92152079f156cba97998975b5dea517e86430198..59b15a0b6086638b6215c1cbad9aa6f28542787c 100644 GIT binary patch literal 10645 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 X(~z$8pY5Dx4&Ofxe_sE6`x^2ecG=I< diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json deleted file mode 100644 index 6eaf11a788..0000000000 --- a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json +++ /dev/null @@ -1 +0,0 @@ -[173,50,8,34,25,140,227,142,53,135,194,216,242,27,172,247,219,172,219,175,172,23,135,155,49,211,157,167,27,158,0,180,152,206,45,235,171,83,75,48,116,32,125,175,252,120,93,39] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json new file mode 100644 index 0000000000..7f0850a40d --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json @@ -0,0 +1 @@ +[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/msg_2024-04-05T09:03:10.207288934Z_GetProtocolVersionUpgradeVoteStatusRequest_8534be7e0b4dd648520dc3a67209b1a05862cb8d40c088b193b59ca3564210bc.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/msg_2024-04-20T17:32:57.853232000Z_GetProtocolVersionUpgradeVoteStatusRequest_8534be7e0b4dd648520dc3a67209b1a05862cb8d40c088b193b59ca3564210bc.json similarity index 70% rename from packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/msg_2024-04-05T09:03:10.207288934Z_GetProtocolVersionUpgradeVoteStatusRequest_8534be7e0b4dd648520dc3a67209b1a05862cb8d40c088b193b59ca3564210bc.json rename to packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/msg_2024-04-20T17:32:57.853232000Z_GetProtocolVersionUpgradeVoteStatusRequest_8534be7e0b4dd648520dc3a67209b1a05862cb8d40c088b193b59ca3564210bc.json index 610f314274a8ea11b43e2762021ebc113cf60396..2c38e44216627ae8649e9a10b3b54d3f7d0c9f9d 100644 GIT binary patch literal 11313 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 J_vMq&e*u+1Fv9=< diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json deleted file mode 100644 index 6eaf11a788..0000000000 --- a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/quorum_pubkey-106-080525592fd3e12a8317e46660bd720a18b34b93734a546507e093924c6340a5.json +++ /dev/null @@ -1 +0,0 @@ -[173,50,8,34,25,140,227,142,53,135,194,216,242,27,172,247,219,172,219,175,172,23,135,155,49,211,157,167,27,158,0,180,152,206,45,235,171,83,75,48,116,32,125,175,252,120,93,39] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json new file mode 100644 index 0000000000..7f0850a40d --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json @@ -0,0 +1 @@ +[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/msg_2024-04-05T09:03:10.218889202Z_GetProtocolVersionUpgradeVoteStatusRequest_92a45a0fe4f69d355022d2f2f7622dfc69cc7b123be24b7ad993281979b2a3a2.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/msg_2024-04-20T17:32:57.858773000Z_GetProtocolVersionUpgradeVoteStatusRequest_92a45a0fe4f69d355022d2f2f7622dfc69cc7b123be24b7ad993281979b2a3a2.json similarity index 69% rename from packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/msg_2024-04-05T09:03:10.218889202Z_GetProtocolVersionUpgradeVoteStatusRequest_92a45a0fe4f69d355022d2f2f7622dfc69cc7b123be24b7ad993281979b2a3a2.json rename to packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/msg_2024-04-20T17:32:57.858773000Z_GetProtocolVersionUpgradeVoteStatusRequest_92a45a0fe4f69d355022d2f2f7622dfc69cc7b123be24b7ad993281979b2a3a2.json index 396272fa1a1883de3ee586149451ec124a5798cd..392990daf17ae8ac5ab2e9cb1310181779eb9c1f 100644 GIT binary patch literal 11003 zcmeI&$!;505Czbz^%VlwS+HJn%&!CiK}(E9L=qi}G7=d2_jJpW%sw}^H(3St!ghDR zsis@E>haUX<>ln#?)b1j+)sYF{M0`VFQ#w*@1Gt{+v92T;dt1b{@UDZA8z`OzdjEf z22X$f@!$Vm4=+0X?NzyxtHa~{saJeW-xNOSP4aQqzdIctch3`^`oEtpo-Tg67!3J6 zyWZ_i+w1LVduHo?(#>xF{$|)|(sh&9?fdsvhvRN@b+g^yZ*C7)f9$R|ZzF3yZ)YQS z9}ZW8kGvhUpMBcj?KXE0!?LxkZqd!UWwq(_e1~3~)8XoHyZPdeb++v1z4zC{8rQuS z-fd62;V9eNO>2`Eg+0Aam>hQxkGF#ypM82T(V(!y@1s}!%lCs8uip(0{`~QaYY%hI zPB1*4$@%=X@uGX(fB1TN+3~riv+;m7WyX@{)nYuMVnl?#=;8@v1Ct%BNSgzGmj3&&N!C78CX#b zS8G~T*{Ynu3DHIF&~U{-%|3gL@uQt5!2xJzfPWg5Lm6OwrW|jf--OLgFAf^=t~B&#`EMGrJzeD7)xr7*d0Hj zcPSWKp&b$PU$DqPP7~m5TI5GIA27UU{Qrw=z9890!mEIGi-3~6Mx5(Wcx_3XzQ3iI zDnVQtb8|pdGB?-FEvKTss)SHBZILNFrh-QqSkAEQn`=K)fyreR6F7B&ml&(nw;_n( zsW#EF1;=f!!E@xQCgrMFVyaY9N4+|z`2r7#LRHNst&_I34zFCf2fB`ET{59G_nO!% zx71%E<9a6TZ)64Cjf_1`cuiX=vm)9VDfv;HAeo5RjUCGGQS^q?fd&B}3sP^iLTsKi zNwYxPto6$31i4yRTe8!psJ~e{7%0*GkmX6x!e^s>VyuoGCfYl~1H%z0dNKN6c|aB@ z1u8h3IxQhJATZErrqjzQz*yUf6NFog(tXW+3CSjnH}K^%1`+n*+ivZ2%zQ-G0Y zih-u4XrHzz#y0lRV@ZaR<6~QUTmoLm7+GFZY0IFEWtBjn2U-ykJfb07&BewM&sSEC zKq@iG=aO_)X`u+;01<88Y-qb=7~K^DLo!3?2hrOqU9U;yqht-99g@V!6;(jB8px6r z(C+Z}=pr?nwu!*PoyB23zubNf{ff6MQ!zATcF&n;hJv*58T~{NhmLL7}W{UqpC^hs*cE zgt2K~U3}Gj9`^6=x2MPB@GArE#Vu0e>=u+wz7!n+BO~rVWF8jUlABn-d!r}-C8qjX z2?#d7n^`=n2ysn99=FPZR+l9yL}92>IkaYl^@Mow+nz;)hZSIEkw`pi zqBPv!_>e-yH9=I$S-u1LAV(A;nYWk`_#eiOW?mno_Y_E@O-CwTR_bHPG j9I8*RU-hRKu6z3X!$4PRx_BEo{4R3%^ZDPGUrGK0$v^@W literal 10979 zcmeI&-BKGz5Cz~|^As*!=R!UD&#RbkPm@ zJ-goRPrIw#X?JGp;ic>S&AaQq(qz7#Pd=|dJh(g@_uI?s-Oc;$?cwr|{nhq$XsxF6 zvyuA`hszFTaX1vBU49Tf@zFU5!_7JHnqHe!+Hs z=S+fr**?$TFNUX$8?*8A8IQ~9X6x|_%^T~*ctAPh>`e7tB(FDTX6Vn`W;~(SwP6pd z@%UPfuNAlypr%Y%OGK_vOG8gCT1%u@pq4eyXH3}65!=;Lb4JY3Td|8Jdf8wo1Zs`< znI4t!6xq0BFbj!6AzO3St~Fb04U{ffF?6LaW|(7xb_!6|lmRmav^h)EoF&Ain_Qx% znlgb9ss&4iNe5aR`^K6zR_L)Uuw>0xL(i!6f5g@knz|2fLueGmQw1Jx*ult#Iz(pa zQ)^e-aHDDUQo~IwFAyTs(J+B*)n?3)R$MDZ(9aC9wDX1;YK1CWQY0gWs5~~#3d`0K zZ3@pNPPag)rkBp$l~Sv^Dr9WZEYH~jPuUNb4p!K)wrcwC&n3xPp{*vbE-;YuN2nLf z!EsGmEU??eRdY_2BHAm6c7qM7v9AcFHOFJhfKow(YXU%2LD z3G^=)1W)5j^e#!W6iAjhe}wd>6z)ez?`r5jpsOMg0jqPEy~2Bp4KX6Jp`bGhgSA57 zpcPIb-RXg4F=Jv1Q_0woeSN96pY%PX76=uK=P1rhGs?JF)(?@fMZmFuh+4jB=rx8mL$l6` zs&&Bx!op;?MI?>{+9*dxQPvmw43Vn^lQ6)XzszAuc!ZY^{iHEImmtU)4E>SF>R*|8 z2};vJsi}#MC}mW%n`n|-)ag+*>-G?CP&OG*Gp{fgjBHYBYsHjWLMGwb0#NL5y#fbW zBpJq-Ajw(>^947g`-I&~Zi+gs6tc|sbo;RD*d3a6Sum(TsSTW7E?Jre%SC52y;em; z!Gx}xaU|dustiC(VaTlVbX*-fVvRL!&0S-`4U3&tYk_z)g^st?+|Dl+sF(Tdp^yuM5r?Ht7rgwxmUW`X7`bF*2Np{eM;>DdTe`gJif*0W74BxsuuQxqreHQ6`097 z@)EvM3l(GUudEiF!52*SB5#7vYxQ#A+3V8RW8!`>`Sam$e7MV#`u-3x09^=;?$va5 z7md&nEVB^~2*pF>wDM9CQE45VEnC8=a-_n~r$xDY;o93$j zp~oG^-f2>Tf+z1~NDXHQR5Z)+u!k;M_UTAIW4vwgvWsCgF4jYrI&1{HTEbMN!42PINu|Lf4~(N(XLMVUQAK0JfGk^zb&K1QjzIF!vZSK~%>I3wal zsv!u=y+;?wCZGrij*g-?3biOO%Z6PrNy+qnm=Yb4*t(%1s(p`P@u!l4qjl*7CPZf9 z0aT#wml5l4CnLw-1_Bk!+I*fVL24MSi-~b zXbg$YRl+A;F|0K6!~~c-iH{2+XxMk53Tb{yV { @@ -868,23 +861,13 @@ impl Strategy { document_type, }), ); - // let any_item_query = - // DriveQuery::any_item_query(contract, document_type.as_ref()); - // let mut items = drive - // .query_documents( - // any_item_query, - // Some(&block_info.epoch), - // false, - // None, - // Some(platform_version.protocol_version), - // ) - // .expect("expect to execute query") - // .documents_owned(); items.retain(|item| !deleted.contains(&item.id())); items.retain(|item| !replaced.contains(&item.id())); + items.retain(|item| !transferred.contains(&item.id())); + if !items.is_empty() { let document = items.remove(0); @@ -961,6 +944,110 @@ impl Strategy { } } + // Generate state transition for document transfer operation + OperationType::Document(DocumentOp { + action: DocumentAction::DocumentActionTransferRandom, + document_type, + contract, + }) => { + let mut items = document_query_callback( + LocalDocumentQuery::RandomDocumentQuery(RandomDocumentQuery { + data_contract: contract, + document_type, + }), + ); + + items.retain(|item| !deleted.contains(&item.id())); + + items.retain(|item| !replaced.contains(&item.id())); + + items.retain(|item| !transferred.contains(&item.id())); + + if !items.is_empty() { + let document = items.remove(0); + + let random_index = rng.gen_range(0..current_identities.len()); + let mut random_identity_id = current_identities[random_index].id(); + + if random_identity_id == document.owner_id() { + if current_identities.len() == 1 { + continue; + } + if random_index == current_identities.len() - 1 { + // we are at the end + random_identity_id = current_identities[random_index - 1].id(); + } else { + random_identity_id = current_identities[random_index + 1].id(); + } + } + + transferred.push(document.id()); + + let request = IdentityKeysRequest { + identity_id: document.owner_id().to_buffer(), + request_type: KeyRequestType::SpecificKeys(vec![1]), + limit: Some(1), + offset: None, + }; + let identity = + identity_fetch_callback(request.identity_id.into(), Some(request)); + let identity_contract_nonce = contract_nonce_counter + .get_mut(&(identity.id, contract.id())) + .expect( + "the identity should already have a nonce for that contract", + ); + *identity_contract_nonce += 1; + + let document_transfer_transition: DocumentTransferTransition = + DocumentTransferTransitionV0 { + base: DocumentBaseTransitionV0 { + id: document.id(), + identity_contract_nonce: *identity_contract_nonce, + document_type_name: document_type.name().clone(), + data_contract_id: contract.id(), + } + .into(), + revision: document + .revision() + .expect("expected to unwrap revision") + + 1, + recipient_owner_id: random_identity_id, + } + .into(); + + let document_batch_transition: DocumentsBatchTransition = + DocumentsBatchTransitionV0 { + owner_id: identity.id, + transitions: vec![document_transfer_transition.into()], + user_fee_increase: 0, + signature_public_key_id: 1, + signature: BinaryData::default(), + } + .into(); + + let mut document_batch_transition: StateTransition = + document_batch_transition.into(); + + let identity_public_key = identity + .loaded_public_keys + .values() + .next() + .expect("expected a key"); + + document_batch_transition + .sign_external( + identity_public_key, + signer, + Some(|_data_contract_id, _document_type_name| { + Ok(SecurityLevel::HIGH) + }), + ) + .expect("expected to sign"); + + operations.push(document_batch_transition); + } + } + // Generate state transition for identity top-up operation OperationType::IdentityTopUp if !current_identities.is_empty() => { // Use a cyclic iterator over the identities to ensure we can create 'count' transitions diff --git a/packages/strategy-tests/src/operations.rs b/packages/strategy-tests/src/operations.rs index 854f3d8089..2affeddf50 100644 --- a/packages/strategy-tests/src/operations.rs +++ b/packages/strategy-tests/src/operations.rs @@ -37,7 +37,8 @@ pub enum DocumentAction { DocumentFieldFillSize, ), DocumentActionDelete, - DocumentActionReplace, + DocumentActionReplaceRandom, + DocumentActionTransferRandom, } #[derive(Clone, Debug, PartialEq)] diff --git a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs index 43fa867425..c124b9f0ac 100644 --- a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs @@ -61,7 +61,7 @@ use dpp::consensus::state::data_trigger::DataTriggerError::{ DataTriggerConditionError, DataTriggerExecutionError, DataTriggerInvalidResultError, }; use wasm_bindgen::{JsError, JsValue}; -use dpp::consensus::basic::data_contract::{InvalidDocumentTypeRequiredSecurityLevelError, UnknownSecurityLevelError, UnknownStorageKeyRequirementsError}; +use dpp::consensus::basic::data_contract::{InvalidDocumentTypeRequiredSecurityLevelError, UnknownSecurityLevelError, UnknownStorageKeyRequirementsError, UnknownTransferableTypeError}; use dpp::consensus::basic::document::{MaxDocumentsTransitionsExceededError, MissingPositionsInDocumentTypePropertiesError}; use dpp::consensus::basic::identity::{DataContractBoundsNotPresentError, DisablingKeyIdAlsoBeingAddedInSameTransitionError, InvalidIdentityCreditWithdrawalTransitionAmountError, InvalidIdentityUpdateTransitionDisableKeysError, InvalidIdentityUpdateTransitionEmptyError, TooManyMasterPublicKeyError}; use dpp::consensus::state::data_contract::document_type_update_error::DocumentTypeUpdateError; @@ -457,6 +457,9 @@ fn from_basic_error(basic_error: &BasicError) -> JsValue { BasicError::DocumentTransitionsAreAbsentError(e) => { DocumentTransitionsAreAbsentErrorWasm::from(e).into() } + BasicError::UnknownTransferableTypeError(e) => { + generic_consensus_error!(UnknownTransferableTypeError, e).into() + } } } diff --git a/packages/wasm-dpp/test/integration/document/Document.spec.js b/packages/wasm-dpp/test/integration/document/Document.spec.js index bd8dc73ec9..f3f4b8f2e5 100644 --- a/packages/wasm-dpp/test/integration/document/Document.spec.js +++ b/packages/wasm-dpp/test/integration/document/Document.spec.js @@ -60,6 +60,9 @@ describe('ExtendedDocument', () => { $updatedAt: null, $updatedAtBlockHeight: null, $updatedAtCoreBlockHeight: null, + $transferredAt: null, + $transferredAtBlockHeight: null, + $transferredAtCoreBlockHeight: null, $dataContractId: dataContract.getId().toBuffer(), $id: document.getId().toBuffer(), $ownerId: document.getOwnerId().toBuffer(), diff --git a/packages/wasm-dpp/test/unit/document/Document.spec.js b/packages/wasm-dpp/test/unit/document/Document.spec.js index a6680c01a6..8e7f80d90b 100644 --- a/packages/wasm-dpp/test/unit/document/Document.spec.js +++ b/packages/wasm-dpp/test/unit/document/Document.spec.js @@ -90,6 +90,9 @@ describe('Document', () => { $updatedAt: now, $updatedAtBlockHeight: 1, $updatedAtCoreBlockHeight: 1, + $transferredAt: null, + $transferredAtBlockHeight: null, + $transferredAtCoreBlockHeight: null, }; rawDocumentWithBuffers = { @@ -105,6 +108,9 @@ describe('Document', () => { $updatedAt: now, $updatedAtBlockHeight: 1, $updatedAtCoreBlockHeight: 1, + $transferredAt: null, + $transferredAtBlockHeight: null, + $transferredAtCoreBlockHeight: null, }; document = new ExtendedDocument(rawDocument, dataContract); @@ -291,6 +297,9 @@ describe('Document', () => { $ownerId: await generateRandomIdentifierAsync(), $id: await generateRandomIdentifierAsync(), $updatedAt: updatedAt, + $transferredAt: null, + $transferredAtBlockHeight: null, + $transferredAtCoreBlockHeight: null, $type: 'test', ...data, }; @@ -415,7 +424,7 @@ describe('Document', () => { it('should return serialized Document', () => { const buffer = document.toBuffer(); expect(buffer).to.be.instanceOf(Buffer); - expect(buffer.length).to.equal(647); + expect(buffer.length).to.equal(648); }); // TODO: remove or replace? From 1c9c66901314184d96ba8bc7fc51972e9ddd4e32 Mon Sep 17 00:00:00 2001 From: HashEngineering Date: Tue, 23 Apr 2024 03:37:08 -0700 Subject: [PATCH 142/191] fix: add tls-webpki-roots to support tls on mobile (Android, iOS) (#1828) --- Cargo.lock | 1 + packages/dapi-grpc/Cargo.toml | 1 + 2 files changed, 2 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index 60afac71ea..020768c914 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4689,6 +4689,7 @@ dependencies = [ "tower-layer", "tower-service", "tracing", + "webpki-roots", ] [[package]] diff --git a/packages/dapi-grpc/Cargo.toml b/packages/dapi-grpc/Cargo.toml index 67f52a5d92..ebe7e89fba 100644 --- a/packages/dapi-grpc/Cargo.toml +++ b/packages/dapi-grpc/Cargo.toml @@ -28,6 +28,7 @@ client = [ "tonic/transport", "tonic/tls", "tonic/tls-roots", + "tonic/tls-webpki-roots", "platform", ] server = ["tonic/channel", "tonic/transport", "platform"] From 540467960f338f49f53657acd8ca0b841226876a Mon Sep 17 00:00:00 2001 From: Igor Markin Date: Wed, 24 Apr 2024 09:14:36 +0100 Subject: [PATCH 143/191] feat(dapi)!: split getStatus into two endpoints (#1812) --- .../org/dash/platform/dapi/v0/CoreGrpc.java | 160 +- .../core/v0/nodejs/CorePromiseClient.js | 64 +- .../clients/core/v0/nodejs/core_pbjs.js | 1572 +++++++++-------- .../clients/core/v0/nodejs/core_protoc.js | 1290 +++++++------- .../clients/core/v0/objective-c/Core.pbobjc.h | 240 +-- .../clients/core/v0/objective-c/Core.pbobjc.m | 571 +++--- .../clients/core/v0/objective-c/Core.pbrpc.h | 27 +- .../clients/core/v0/objective-c/Core.pbrpc.m | 38 +- .../clients/core/v0/python/core_pb2.py | 521 +++--- .../clients/core/v0/python/core_pb2_grpc.py | 59 +- .../clients/core/v0/web/CorePromiseClient.js | 24 +- .../clients/core/v0/web/core_pb.d.ts | 188 +- .../dapi-grpc/clients/core/v0/web/core_pb.js | 1290 +++++++------- .../clients/core/v0/web/core_pb_service.d.ts | 39 +- .../clients/core/v0/web/core_pb_service.js | 52 +- packages/dapi-grpc/protos/core/v0/core.proto | 50 +- .../core/proto/org.dash.platform.dapi.v0.rs | 297 ++-- .../core/v0/nodejs/CorePromiseClient.spec.js | 33 +- .../test/unit/getCoreDefinition.spec.js | 7 +- .../handlers/core/coreHandlersFactory.js | 46 +- .../core/getBlockchainStatusHandlerFactory.js | 75 + .../core/getMasternodeStatusHandlerFactory.js | 67 + .../handlers/core/getStatusHandlerFactory.js | 118 -- ...getBlockchainStatusHandlerFactory.spec.js} | 64 +- .../getMasternodeStatusHandlerFactory.spec.js | 84 + .../lib/methods/core/CoreMethodsFacade.js | 6 +- .../core/getBlockchainStatusFactory.js | 59 + .../core/getMasternodeStatusFactory.js | 45 + .../lib/methods/core/getStatusFactory.js | 68 - .../methods/core/CoreMethodsFacade.spec.js | 26 +- ....js => getBlockchainStatusFactory.spec.js} | 33 +- .../core/getMasternodeStatusFactory.spec.js | 54 + .../platform-test-suite/lib/waitForBlocks.js | 4 +- .../test/functional/core/getBlock.spec.js | 2 +- .../test/functional/core/getBlockHash.spec.js | 2 +- ...us.spec.js => getBlockchainStatus.spec.js} | 12 +- .../core/getMasternodeStatus.spec.js | 35 + packages/rs-dapi-client/src/transport/grpc.rs | 6 +- .../src/plugins/Plugins/ChainPlugin.js | 3 +- .../src/test/mocks/TransportMock.js | 4 +- .../DAPIClientTransport.js | 2 +- .../methods/getBestBlockHeight.js | 2 +- .../methods/getBestBlockHeight.spec.js | 6 +- .../methods/getBlockchainStatus.js | 7 + ...us.spec.js => getBlockchainStatus.spec.js} | 6 +- .../DAPIClientTransport/methods/getStatus.js | 7 - .../FixtureTransport/FixtureTransport.js | 2 +- .../{getStatus.js => getBlockchainStatus.js} | 2 +- .../wallet-lib/src/transport/Transport.d.ts | 2 +- .../src/types/Account/methods/fetchStatus.js | 2 +- .../tests/integration/types/Wallet.spec.js | 2 +- 51 files changed, 4164 insertions(+), 3211 deletions(-) create mode 100644 packages/dapi/lib/grpcServer/handlers/core/getBlockchainStatusHandlerFactory.js create mode 100644 packages/dapi/lib/grpcServer/handlers/core/getMasternodeStatusHandlerFactory.js delete mode 100644 packages/dapi/lib/grpcServer/handlers/core/getStatusHandlerFactory.js rename packages/dapi/test/unit/grpcServer/handlers/core/{getStatusHandlerFactory.spec.js => getBlockchainStatusHandlerFactory.spec.js} (56%) create mode 100644 packages/dapi/test/unit/grpcServer/handlers/core/getMasternodeStatusHandlerFactory.spec.js create mode 100644 packages/js-dapi-client/lib/methods/core/getBlockchainStatusFactory.js create mode 100644 packages/js-dapi-client/lib/methods/core/getMasternodeStatusFactory.js delete mode 100644 packages/js-dapi-client/lib/methods/core/getStatusFactory.js rename packages/js-dapi-client/test/unit/methods/core/{getStatusFactory.spec.js => getBlockchainStatusFactory.spec.js} (53%) create mode 100644 packages/js-dapi-client/test/unit/methods/core/getMasternodeStatusFactory.spec.js rename packages/platform-test-suite/test/functional/core/{getStatus.spec.js => getBlockchainStatus.spec.js} (75%) create mode 100644 packages/platform-test-suite/test/functional/core/getMasternodeStatus.spec.js create mode 100644 packages/wallet-lib/src/transport/DAPIClientTransport/methods/getBlockchainStatus.js rename packages/wallet-lib/src/transport/DAPIClientTransport/methods/{getStatus.spec.js => getBlockchainStatus.spec.js} (77%) delete mode 100644 packages/wallet-lib/src/transport/DAPIClientTransport/methods/getStatus.js rename packages/wallet-lib/src/transport/FixtureTransport/methods/{getStatus.js => getBlockchainStatus.js} (94%) diff --git a/packages/dapi-grpc/clients/core/v0/java/org/dash/platform/dapi/v0/CoreGrpc.java b/packages/dapi-grpc/clients/core/v0/java/org/dash/platform/dapi/v0/CoreGrpc.java index 1321019557..2ccbe022d9 100644 --- a/packages/dapi-grpc/clients/core/v0/java/org/dash/platform/dapi/v0/CoreGrpc.java +++ b/packages/dapi-grpc/clients/core/v0/java/org/dash/platform/dapi/v0/CoreGrpc.java @@ -15,35 +15,66 @@ private CoreGrpc() {} public static final String SERVICE_NAME = "org.dash.platform.dapi.v0.Core"; // Static method descriptors that strictly reflect the proto. - private static volatile io.grpc.MethodDescriptor getGetStatusMethod; + private static volatile io.grpc.MethodDescriptor getGetBlockchainStatusMethod; @io.grpc.stub.annotations.RpcMethod( - fullMethodName = SERVICE_NAME + '/' + "getStatus", - requestType = org.dash.platform.dapi.v0.CoreOuterClass.GetStatusRequest.class, - responseType = org.dash.platform.dapi.v0.CoreOuterClass.GetStatusResponse.class, + fullMethodName = SERVICE_NAME + '/' + "getBlockchainStatus", + requestType = org.dash.platform.dapi.v0.CoreOuterClass.GetBlockchainStatusRequest.class, + responseType = org.dash.platform.dapi.v0.CoreOuterClass.GetBlockchainStatusResponse.class, methodType = io.grpc.MethodDescriptor.MethodType.UNARY) - public static io.grpc.MethodDescriptor getGetStatusMethod() { - io.grpc.MethodDescriptor getGetStatusMethod; - if ((getGetStatusMethod = CoreGrpc.getGetStatusMethod) == null) { + public static io.grpc.MethodDescriptor getGetBlockchainStatusMethod() { + io.grpc.MethodDescriptor getGetBlockchainStatusMethod; + if ((getGetBlockchainStatusMethod = CoreGrpc.getGetBlockchainStatusMethod) == null) { synchronized (CoreGrpc.class) { - if ((getGetStatusMethod = CoreGrpc.getGetStatusMethod) == null) { - CoreGrpc.getGetStatusMethod = getGetStatusMethod = - io.grpc.MethodDescriptor.newBuilder() + if ((getGetBlockchainStatusMethod = CoreGrpc.getGetBlockchainStatusMethod) == null) { + CoreGrpc.getGetBlockchainStatusMethod = getGetBlockchainStatusMethod = + io.grpc.MethodDescriptor.newBuilder() .setType(io.grpc.MethodDescriptor.MethodType.UNARY) - .setFullMethodName(generateFullMethodName(SERVICE_NAME, "getStatus")) + .setFullMethodName(generateFullMethodName(SERVICE_NAME, "getBlockchainStatus")) .setSampledToLocalTracing(true) .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( - org.dash.platform.dapi.v0.CoreOuterClass.GetStatusRequest.getDefaultInstance())) + org.dash.platform.dapi.v0.CoreOuterClass.GetBlockchainStatusRequest.getDefaultInstance())) .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( - org.dash.platform.dapi.v0.CoreOuterClass.GetStatusResponse.getDefaultInstance())) - .setSchemaDescriptor(new CoreMethodDescriptorSupplier("getStatus")) + org.dash.platform.dapi.v0.CoreOuterClass.GetBlockchainStatusResponse.getDefaultInstance())) + .setSchemaDescriptor(new CoreMethodDescriptorSupplier("getBlockchainStatus")) .build(); } } } - return getGetStatusMethod; + return getGetBlockchainStatusMethod; + } + + private static volatile io.grpc.MethodDescriptor getGetMasternodeStatusMethod; + + @io.grpc.stub.annotations.RpcMethod( + fullMethodName = SERVICE_NAME + '/' + "getMasternodeStatus", + requestType = org.dash.platform.dapi.v0.CoreOuterClass.GetMasternodeStatusRequest.class, + responseType = org.dash.platform.dapi.v0.CoreOuterClass.GetMasternodeStatusResponse.class, + methodType = io.grpc.MethodDescriptor.MethodType.UNARY) + public static io.grpc.MethodDescriptor getGetMasternodeStatusMethod() { + io.grpc.MethodDescriptor getGetMasternodeStatusMethod; + if ((getGetMasternodeStatusMethod = CoreGrpc.getGetMasternodeStatusMethod) == null) { + synchronized (CoreGrpc.class) { + if ((getGetMasternodeStatusMethod = CoreGrpc.getGetMasternodeStatusMethod) == null) { + CoreGrpc.getGetMasternodeStatusMethod = getGetMasternodeStatusMethod = + io.grpc.MethodDescriptor.newBuilder() + .setType(io.grpc.MethodDescriptor.MethodType.UNARY) + .setFullMethodName(generateFullMethodName(SERVICE_NAME, "getMasternodeStatus")) + .setSampledToLocalTracing(true) + .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + org.dash.platform.dapi.v0.CoreOuterClass.GetMasternodeStatusRequest.getDefaultInstance())) + .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + org.dash.platform.dapi.v0.CoreOuterClass.GetMasternodeStatusResponse.getDefaultInstance())) + .setSchemaDescriptor(new CoreMethodDescriptorSupplier("getMasternodeStatus")) + .build(); + } + } + } + return getGetMasternodeStatusMethod; } private static volatile io.grpc.MethodDescriptor responseObserver) { - io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetStatusMethod(), responseObserver); + public void getBlockchainStatus(org.dash.platform.dapi.v0.CoreOuterClass.GetBlockchainStatusRequest request, + io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetBlockchainStatusMethod(), responseObserver); + } + + /** + */ + public void getMasternodeStatus(org.dash.platform.dapi.v0.CoreOuterClass.GetMasternodeStatusRequest request, + io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetMasternodeStatusMethod(), responseObserver); } /** @@ -332,12 +370,19 @@ public void subscribeToTransactionsWithProofs(org.dash.platform.dapi.v0.CoreOute @java.lang.Override public final io.grpc.ServerServiceDefinition bindService() { return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor()) .addMethod( - getGetStatusMethod(), + getGetBlockchainStatusMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall( new MethodHandlers< - org.dash.platform.dapi.v0.CoreOuterClass.GetStatusRequest, - org.dash.platform.dapi.v0.CoreOuterClass.GetStatusResponse>( - this, METHODID_GET_STATUS))) + org.dash.platform.dapi.v0.CoreOuterClass.GetBlockchainStatusRequest, + org.dash.platform.dapi.v0.CoreOuterClass.GetBlockchainStatusResponse>( + this, METHODID_GET_BLOCKCHAIN_STATUS))) + .addMethod( + getGetMasternodeStatusMethod(), + io.grpc.stub.ServerCalls.asyncUnaryCall( + new MethodHandlers< + org.dash.platform.dapi.v0.CoreOuterClass.GetMasternodeStatusRequest, + org.dash.platform.dapi.v0.CoreOuterClass.GetMasternodeStatusResponse>( + this, METHODID_GET_MASTERNODE_STATUS))) .addMethod( getGetBlockMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall( @@ -400,10 +445,18 @@ protected CoreStub build( /** */ - public void getStatus(org.dash.platform.dapi.v0.CoreOuterClass.GetStatusRequest request, - io.grpc.stub.StreamObserver responseObserver) { + public void getBlockchainStatus(org.dash.platform.dapi.v0.CoreOuterClass.GetBlockchainStatusRequest request, + io.grpc.stub.StreamObserver responseObserver) { io.grpc.stub.ClientCalls.asyncUnaryCall( - getChannel().newCall(getGetStatusMethod(), getCallOptions()), request, responseObserver); + getChannel().newCall(getGetBlockchainStatusMethod(), getCallOptions()), request, responseObserver); + } + + /** + */ + public void getMasternodeStatus(org.dash.platform.dapi.v0.CoreOuterClass.GetMasternodeStatusRequest request, + io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ClientCalls.asyncUnaryCall( + getChannel().newCall(getGetMasternodeStatusMethod(), getCallOptions()), request, responseObserver); } /** @@ -471,9 +524,16 @@ protected CoreBlockingStub build( /** */ - public org.dash.platform.dapi.v0.CoreOuterClass.GetStatusResponse getStatus(org.dash.platform.dapi.v0.CoreOuterClass.GetStatusRequest request) { + public org.dash.platform.dapi.v0.CoreOuterClass.GetBlockchainStatusResponse getBlockchainStatus(org.dash.platform.dapi.v0.CoreOuterClass.GetBlockchainStatusRequest request) { + return io.grpc.stub.ClientCalls.blockingUnaryCall( + getChannel(), getGetBlockchainStatusMethod(), getCallOptions(), request); + } + + /** + */ + public org.dash.platform.dapi.v0.CoreOuterClass.GetMasternodeStatusResponse getMasternodeStatus(org.dash.platform.dapi.v0.CoreOuterClass.GetMasternodeStatusRequest request) { return io.grpc.stub.ClientCalls.blockingUnaryCall( - getChannel(), getGetStatusMethod(), getCallOptions(), request); + getChannel(), getGetMasternodeStatusMethod(), getCallOptions(), request); } /** @@ -537,10 +597,18 @@ protected CoreFutureStub build( /** */ - public com.google.common.util.concurrent.ListenableFuture getStatus( - org.dash.platform.dapi.v0.CoreOuterClass.GetStatusRequest request) { + public com.google.common.util.concurrent.ListenableFuture getBlockchainStatus( + org.dash.platform.dapi.v0.CoreOuterClass.GetBlockchainStatusRequest request) { return io.grpc.stub.ClientCalls.futureUnaryCall( - getChannel().newCall(getGetStatusMethod(), getCallOptions()), request); + getChannel().newCall(getGetBlockchainStatusMethod(), getCallOptions()), request); + } + + /** + */ + public com.google.common.util.concurrent.ListenableFuture getMasternodeStatus( + org.dash.platform.dapi.v0.CoreOuterClass.GetMasternodeStatusRequest request) { + return io.grpc.stub.ClientCalls.futureUnaryCall( + getChannel().newCall(getGetMasternodeStatusMethod(), getCallOptions()), request); } /** @@ -576,13 +644,14 @@ public com.google.common.util.concurrent.ListenableFuture implements io.grpc.stub.ServerCalls.UnaryMethod, @@ -601,9 +670,13 @@ private static final class MethodHandlers implements @java.lang.SuppressWarnings("unchecked") public void invoke(Req request, io.grpc.stub.StreamObserver responseObserver) { switch (methodId) { - case METHODID_GET_STATUS: - serviceImpl.getStatus((org.dash.platform.dapi.v0.CoreOuterClass.GetStatusRequest) request, - (io.grpc.stub.StreamObserver) responseObserver); + case METHODID_GET_BLOCKCHAIN_STATUS: + serviceImpl.getBlockchainStatus((org.dash.platform.dapi.v0.CoreOuterClass.GetBlockchainStatusRequest) request, + (io.grpc.stub.StreamObserver) responseObserver); + break; + case METHODID_GET_MASTERNODE_STATUS: + serviceImpl.getMasternodeStatus((org.dash.platform.dapi.v0.CoreOuterClass.GetMasternodeStatusRequest) request, + (io.grpc.stub.StreamObserver) responseObserver); break; case METHODID_GET_BLOCK: serviceImpl.getBlock((org.dash.platform.dapi.v0.CoreOuterClass.GetBlockRequest) request, @@ -690,7 +763,8 @@ public static io.grpc.ServiceDescriptor getServiceDescriptor() { if (result == null) { serviceDescriptor = result = io.grpc.ServiceDescriptor.newBuilder(SERVICE_NAME) .setSchemaDescriptor(new CoreFileDescriptorSupplier()) - .addMethod(getGetStatusMethod()) + .addMethod(getGetBlockchainStatusMethod()) + .addMethod(getGetMasternodeStatusMethod()) .addMethod(getGetBlockMethod()) .addMethod(getBroadcastTransactionMethod()) .addMethod(getGetTransactionMethod()) diff --git a/packages/dapi-grpc/clients/core/v0/nodejs/CorePromiseClient.js b/packages/dapi-grpc/clients/core/v0/nodejs/CorePromiseClient.js index 8cdd7f3086..2d17937f0a 100644 --- a/packages/dapi-grpc/clients/core/v0/nodejs/CorePromiseClient.js +++ b/packages/dapi-grpc/clients/core/v0/nodejs/CorePromiseClient.js @@ -24,8 +24,10 @@ const { platform: { dapi: { v0: { - GetStatusRequest: PBJSGetStatusRequest, - GetStatusResponse: PBJSGetStatusResponse, + GetBlockchainStatusRequest: PBJSGetBlockchainStatusRequest, + GetBlockchainStatusResponse: PBJSGetBlockchainStatusResponse, + GetMasternodeStatusRequest: PBJSGetMasternodeStatusRequest, + GetMasternodeStatusResponse: PBJSGetMasternodeStatusResponse, GetBlockRequest: PBJSGetBlockRequest, GetBlockResponse: PBJSGetBlockResponse, BroadcastTransactionRequest: PBJSBroadcastTransactionRequest, @@ -46,7 +48,8 @@ const { } = require('./core_pbjs'); const { - GetStatusResponse: ProtocGetStatusResponse, + GetBlockchainStatusResponse: ProtocGetBlockchainStatusResponse, + GetMasternodeStatusResponse: ProtocGetMasternodeStatusResponse, GetBlockResponse: ProtocGetBlockResponse, BroadcastTransactionResponse: ProtocBroadcastTransactionResponse, GetTransactionResponse: ProtocGetTransactionResponse, @@ -79,8 +82,12 @@ class CorePromiseClient { this.client = new CoreNodeJSClient(strippedHostname, credentials, options); - this.client.getStatus = promisify( - this.client.getStatus.bind(this.client), + this.client.getBlockchainStatus = promisify( + this.client.getBlockchainStatus.bind(this.client), + ); + + this.client.getMasternodeStatus = promisify( + this.client.getMasternodeStatus.bind(this.client), ); this.client.getBlock = promisify( @@ -101,28 +108,28 @@ class CorePromiseClient { } /** - * @param {!GetStatusRequest} getStatusRequest + * @param {!GetBlockchainStatusRequest} getBlockchainStatusRequest * @param {?Object} metadata * @param {CallOptions} [options={}] - * @return {Promise} + * @return {Promise} */ - getStatus(getStatusRequest, metadata = {}, options = {}) { + getBlockchainStatus(getBlockchainStatusRequest, metadata = {}, options = {}) { if (!isObject(metadata)) { throw new Error('metadata must be an object'); } - return this.client.getStatus( - getStatusRequest, + return this.client.getBlockchainStatus( + getBlockchainStatusRequest, convertObjectToMetadata(metadata), { interceptors: [ jsonToProtobufInterceptorFactory( jsonToProtobufFactory( - ProtocGetStatusResponse, - PBJSGetStatusResponse, + ProtocGetBlockchainStatusResponse, + PBJSGetBlockchainStatusResponse, ), protobufToJsonFactory( - PBJSGetStatusRequest, + PBJSGetBlockchainStatusRequest, ), ), ], @@ -162,6 +169,37 @@ class CorePromiseClient { ); } + /** + * @param {!GetMasternodeStatusRequest} getMasternodeStatusRequest + * @param {?Object} metadata + * @param {CallOptions} [options={}] + * @return {Promise} + */ + getMasternodeStatus(getMasternodeStatusRequest, metadata = {}, options = {}) { + if (!isObject(metadata)) { + throw new Error('metadata must be an object'); + } + + return this.client.getMasternodeStatus( + getMasternodeStatusRequest, + convertObjectToMetadata(metadata), + { + interceptors: [ + jsonToProtobufInterceptorFactory( + jsonToProtobufFactory( + ProtocGetMasternodeStatusResponse, + PBJSGetMasternodeStatusResponse, + ), + protobufToJsonFactory( + PBJSGetMasternodeStatusRequest, + ), + ), + ], + ...options, + }, + ); + } + /** * @param {!BroadcastTransactionRequest} broadcastTransactionRequest * @param {?Object} metadata diff --git a/packages/dapi-grpc/clients/core/v0/nodejs/core_pbjs.js b/packages/dapi-grpc/clients/core/v0/nodejs/core_pbjs.js index cd62cc98c1..dfdc7b4a9a 100644 --- a/packages/dapi-grpc/clients/core/v0/nodejs/core_pbjs.js +++ b/packages/dapi-grpc/clients/core/v0/nodejs/core_pbjs.js @@ -87,35 +87,68 @@ $root.org = (function() { }; /** - * Callback as used by {@link org.dash.platform.dapi.v0.Core#getStatus}. + * Callback as used by {@link org.dash.platform.dapi.v0.Core#getBlockchainStatus}. * @memberof org.dash.platform.dapi.v0.Core - * @typedef getStatusCallback + * @typedef getBlockchainStatusCallback * @type {function} * @param {Error|null} error Error, if any - * @param {org.dash.platform.dapi.v0.GetStatusResponse} [response] GetStatusResponse + * @param {org.dash.platform.dapi.v0.GetBlockchainStatusResponse} [response] GetBlockchainStatusResponse */ /** - * Calls getStatus. - * @function getStatus + * Calls getBlockchainStatus. + * @function getBlockchainStatus * @memberof org.dash.platform.dapi.v0.Core * @instance - * @param {org.dash.platform.dapi.v0.IGetStatusRequest} request GetStatusRequest message or plain object - * @param {org.dash.platform.dapi.v0.Core.getStatusCallback} callback Node-style callback called with the error, if any, and GetStatusResponse + * @param {org.dash.platform.dapi.v0.IGetBlockchainStatusRequest} request GetBlockchainStatusRequest message or plain object + * @param {org.dash.platform.dapi.v0.Core.getBlockchainStatusCallback} callback Node-style callback called with the error, if any, and GetBlockchainStatusResponse * @returns {undefined} * @variation 1 */ - Object.defineProperty(Core.prototype.getStatus = function getStatus(request, callback) { - return this.rpcCall(getStatus, $root.org.dash.platform.dapi.v0.GetStatusRequest, $root.org.dash.platform.dapi.v0.GetStatusResponse, request, callback); - }, "name", { value: "getStatus" }); + Object.defineProperty(Core.prototype.getBlockchainStatus = function getBlockchainStatus(request, callback) { + return this.rpcCall(getBlockchainStatus, $root.org.dash.platform.dapi.v0.GetBlockchainStatusRequest, $root.org.dash.platform.dapi.v0.GetBlockchainStatusResponse, request, callback); + }, "name", { value: "getBlockchainStatus" }); /** - * Calls getStatus. - * @function getStatus + * Calls getBlockchainStatus. + * @function getBlockchainStatus * @memberof org.dash.platform.dapi.v0.Core * @instance - * @param {org.dash.platform.dapi.v0.IGetStatusRequest} request GetStatusRequest message or plain object - * @returns {Promise} Promise + * @param {org.dash.platform.dapi.v0.IGetBlockchainStatusRequest} request GetBlockchainStatusRequest message or plain object + * @returns {Promise} Promise + * @variation 2 + */ + + /** + * Callback as used by {@link org.dash.platform.dapi.v0.Core#getMasternodeStatus}. + * @memberof org.dash.platform.dapi.v0.Core + * @typedef getMasternodeStatusCallback + * @type {function} + * @param {Error|null} error Error, if any + * @param {org.dash.platform.dapi.v0.GetMasternodeStatusResponse} [response] GetMasternodeStatusResponse + */ + + /** + * Calls getMasternodeStatus. + * @function getMasternodeStatus + * @memberof org.dash.platform.dapi.v0.Core + * @instance + * @param {org.dash.platform.dapi.v0.IGetMasternodeStatusRequest} request GetMasternodeStatusRequest message or plain object + * @param {org.dash.platform.dapi.v0.Core.getMasternodeStatusCallback} callback Node-style callback called with the error, if any, and GetMasternodeStatusResponse + * @returns {undefined} + * @variation 1 + */ + Object.defineProperty(Core.prototype.getMasternodeStatus = function getMasternodeStatus(request, callback) { + return this.rpcCall(getMasternodeStatus, $root.org.dash.platform.dapi.v0.GetMasternodeStatusRequest, $root.org.dash.platform.dapi.v0.GetMasternodeStatusResponse, request, callback); + }, "name", { value: "getMasternodeStatus" }); + + /** + * Calls getMasternodeStatus. + * @function getMasternodeStatus + * @memberof org.dash.platform.dapi.v0.Core + * @instance + * @param {org.dash.platform.dapi.v0.IGetMasternodeStatusRequest} request GetMasternodeStatusRequest message or plain object + * @returns {Promise} Promise * @variation 2 */ @@ -320,23 +353,23 @@ $root.org = (function() { return Core; })(); - v0.GetStatusRequest = (function() { + v0.GetBlockchainStatusRequest = (function() { /** - * Properties of a GetStatusRequest. + * Properties of a GetBlockchainStatusRequest. * @memberof org.dash.platform.dapi.v0 - * @interface IGetStatusRequest + * @interface IGetBlockchainStatusRequest */ /** - * Constructs a new GetStatusRequest. + * Constructs a new GetBlockchainStatusRequest. * @memberof org.dash.platform.dapi.v0 - * @classdesc Represents a GetStatusRequest. - * @implements IGetStatusRequest + * @classdesc Represents a GetBlockchainStatusRequest. + * @implements IGetBlockchainStatusRequest * @constructor - * @param {org.dash.platform.dapi.v0.IGetStatusRequest=} [properties] Properties to set + * @param {org.dash.platform.dapi.v0.IGetBlockchainStatusRequest=} [properties] Properties to set */ - function GetStatusRequest(properties) { + function GetBlockchainStatusRequest(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -344,60 +377,60 @@ $root.org = (function() { } /** - * Creates a new GetStatusRequest instance using the specified properties. + * Creates a new GetBlockchainStatusRequest instance using the specified properties. * @function create - * @memberof org.dash.platform.dapi.v0.GetStatusRequest + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusRequest * @static - * @param {org.dash.platform.dapi.v0.IGetStatusRequest=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetStatusRequest} GetStatusRequest instance + * @param {org.dash.platform.dapi.v0.IGetBlockchainStatusRequest=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetBlockchainStatusRequest} GetBlockchainStatusRequest instance */ - GetStatusRequest.create = function create(properties) { - return new GetStatusRequest(properties); + GetBlockchainStatusRequest.create = function create(properties) { + return new GetBlockchainStatusRequest(properties); }; /** - * Encodes the specified GetStatusRequest message. Does not implicitly {@link org.dash.platform.dapi.v0.GetStatusRequest.verify|verify} messages. + * Encodes the specified GetBlockchainStatusRequest message. Does not implicitly {@link org.dash.platform.dapi.v0.GetBlockchainStatusRequest.verify|verify} messages. * @function encode - * @memberof org.dash.platform.dapi.v0.GetStatusRequest + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusRequest * @static - * @param {org.dash.platform.dapi.v0.IGetStatusRequest} message GetStatusRequest message or plain object to encode + * @param {org.dash.platform.dapi.v0.IGetBlockchainStatusRequest} message GetBlockchainStatusRequest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetStatusRequest.encode = function encode(message, writer) { + GetBlockchainStatusRequest.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); return writer; }; /** - * Encodes the specified GetStatusRequest message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetStatusRequest.verify|verify} messages. + * Encodes the specified GetBlockchainStatusRequest message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetBlockchainStatusRequest.verify|verify} messages. * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetStatusRequest + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusRequest * @static - * @param {org.dash.platform.dapi.v0.IGetStatusRequest} message GetStatusRequest message or plain object to encode + * @param {org.dash.platform.dapi.v0.IGetBlockchainStatusRequest} message GetBlockchainStatusRequest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetStatusRequest.encodeDelimited = function encodeDelimited(message, writer) { + GetBlockchainStatusRequest.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a GetStatusRequest message from the specified reader or buffer. + * Decodes a GetBlockchainStatusRequest message from the specified reader or buffer. * @function decode - * @memberof org.dash.platform.dapi.v0.GetStatusRequest + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusRequest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetStatusRequest} GetStatusRequest + * @returns {org.dash.platform.dapi.v0.GetBlockchainStatusRequest} GetBlockchainStatusRequest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetStatusRequest.decode = function decode(reader, length) { + GetBlockchainStatusRequest.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetStatusRequest(); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetBlockchainStatusRequest(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { @@ -410,100 +443,99 @@ $root.org = (function() { }; /** - * Decodes a GetStatusRequest message from the specified reader or buffer, length delimited. + * Decodes a GetBlockchainStatusRequest message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetStatusRequest + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusRequest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetStatusRequest} GetStatusRequest + * @returns {org.dash.platform.dapi.v0.GetBlockchainStatusRequest} GetBlockchainStatusRequest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetStatusRequest.decodeDelimited = function decodeDelimited(reader) { + GetBlockchainStatusRequest.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a GetStatusRequest message. + * Verifies a GetBlockchainStatusRequest message. * @function verify - * @memberof org.dash.platform.dapi.v0.GetStatusRequest + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusRequest * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - GetStatusRequest.verify = function verify(message) { + GetBlockchainStatusRequest.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; return null; }; /** - * Creates a GetStatusRequest message from a plain object. Also converts values to their respective internal types. + * Creates a GetBlockchainStatusRequest message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetStatusRequest + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusRequest * @static * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetStatusRequest} GetStatusRequest + * @returns {org.dash.platform.dapi.v0.GetBlockchainStatusRequest} GetBlockchainStatusRequest */ - GetStatusRequest.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetStatusRequest) + GetBlockchainStatusRequest.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetBlockchainStatusRequest) return object; - return new $root.org.dash.platform.dapi.v0.GetStatusRequest(); + return new $root.org.dash.platform.dapi.v0.GetBlockchainStatusRequest(); }; /** - * Creates a plain object from a GetStatusRequest message. Also converts values to other types if specified. + * Creates a plain object from a GetBlockchainStatusRequest message. Also converts values to other types if specified. * @function toObject - * @memberof org.dash.platform.dapi.v0.GetStatusRequest + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusRequest * @static - * @param {org.dash.platform.dapi.v0.GetStatusRequest} message GetStatusRequest + * @param {org.dash.platform.dapi.v0.GetBlockchainStatusRequest} message GetBlockchainStatusRequest * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - GetStatusRequest.toObject = function toObject() { + GetBlockchainStatusRequest.toObject = function toObject() { return {}; }; /** - * Converts this GetStatusRequest to JSON. + * Converts this GetBlockchainStatusRequest to JSON. * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetStatusRequest + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusRequest * @instance * @returns {Object.} JSON object */ - GetStatusRequest.prototype.toJSON = function toJSON() { + GetBlockchainStatusRequest.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - return GetStatusRequest; + return GetBlockchainStatusRequest; })(); - v0.GetStatusResponse = (function() { + v0.GetBlockchainStatusResponse = (function() { /** - * Properties of a GetStatusResponse. + * Properties of a GetBlockchainStatusResponse. * @memberof org.dash.platform.dapi.v0 - * @interface IGetStatusResponse - * @property {org.dash.platform.dapi.v0.GetStatusResponse.IVersion|null} [version] GetStatusResponse version - * @property {org.dash.platform.dapi.v0.GetStatusResponse.ITime|null} [time] GetStatusResponse time - * @property {org.dash.platform.dapi.v0.GetStatusResponse.Status|null} [status] GetStatusResponse status - * @property {number|null} [syncProgress] GetStatusResponse syncProgress - * @property {org.dash.platform.dapi.v0.GetStatusResponse.IChain|null} [chain] GetStatusResponse chain - * @property {org.dash.platform.dapi.v0.GetStatusResponse.IMasternode|null} [masternode] GetStatusResponse masternode - * @property {org.dash.platform.dapi.v0.GetStatusResponse.INetwork|null} [network] GetStatusResponse network + * @interface IGetBlockchainStatusResponse + * @property {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.IVersion|null} [version] GetBlockchainStatusResponse version + * @property {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.ITime|null} [time] GetBlockchainStatusResponse time + * @property {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Status|null} [status] GetBlockchainStatusResponse status + * @property {number|null} [syncProgress] GetBlockchainStatusResponse syncProgress + * @property {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.IChain|null} [chain] GetBlockchainStatusResponse chain + * @property {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.INetwork|null} [network] GetBlockchainStatusResponse network */ /** - * Constructs a new GetStatusResponse. + * Constructs a new GetBlockchainStatusResponse. * @memberof org.dash.platform.dapi.v0 - * @classdesc Represents a GetStatusResponse. - * @implements IGetStatusResponse + * @classdesc Represents a GetBlockchainStatusResponse. + * @implements IGetBlockchainStatusResponse * @constructor - * @param {org.dash.platform.dapi.v0.IGetStatusResponse=} [properties] Properties to set + * @param {org.dash.platform.dapi.v0.IGetBlockchainStatusResponse=} [properties] Properties to set */ - function GetStatusResponse(properties) { + function GetBlockchainStatusResponse(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -511,138 +543,128 @@ $root.org = (function() { } /** - * GetStatusResponse version. - * @member {org.dash.platform.dapi.v0.GetStatusResponse.IVersion|null|undefined} version - * @memberof org.dash.platform.dapi.v0.GetStatusResponse + * GetBlockchainStatusResponse version. + * @member {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.IVersion|null|undefined} version + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse * @instance */ - GetStatusResponse.prototype.version = null; + GetBlockchainStatusResponse.prototype.version = null; /** - * GetStatusResponse time. - * @member {org.dash.platform.dapi.v0.GetStatusResponse.ITime|null|undefined} time - * @memberof org.dash.platform.dapi.v0.GetStatusResponse + * GetBlockchainStatusResponse time. + * @member {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.ITime|null|undefined} time + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse * @instance */ - GetStatusResponse.prototype.time = null; + GetBlockchainStatusResponse.prototype.time = null; /** - * GetStatusResponse status. - * @member {org.dash.platform.dapi.v0.GetStatusResponse.Status} status - * @memberof org.dash.platform.dapi.v0.GetStatusResponse + * GetBlockchainStatusResponse status. + * @member {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Status} status + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse * @instance */ - GetStatusResponse.prototype.status = 0; + GetBlockchainStatusResponse.prototype.status = 0; /** - * GetStatusResponse syncProgress. + * GetBlockchainStatusResponse syncProgress. * @member {number} syncProgress - * @memberof org.dash.platform.dapi.v0.GetStatusResponse - * @instance - */ - GetStatusResponse.prototype.syncProgress = 0; - - /** - * GetStatusResponse chain. - * @member {org.dash.platform.dapi.v0.GetStatusResponse.IChain|null|undefined} chain - * @memberof org.dash.platform.dapi.v0.GetStatusResponse + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse * @instance */ - GetStatusResponse.prototype.chain = null; + GetBlockchainStatusResponse.prototype.syncProgress = 0; /** - * GetStatusResponse masternode. - * @member {org.dash.platform.dapi.v0.GetStatusResponse.IMasternode|null|undefined} masternode - * @memberof org.dash.platform.dapi.v0.GetStatusResponse + * GetBlockchainStatusResponse chain. + * @member {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.IChain|null|undefined} chain + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse * @instance */ - GetStatusResponse.prototype.masternode = null; + GetBlockchainStatusResponse.prototype.chain = null; /** - * GetStatusResponse network. - * @member {org.dash.platform.dapi.v0.GetStatusResponse.INetwork|null|undefined} network - * @memberof org.dash.platform.dapi.v0.GetStatusResponse + * GetBlockchainStatusResponse network. + * @member {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.INetwork|null|undefined} network + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse * @instance */ - GetStatusResponse.prototype.network = null; + GetBlockchainStatusResponse.prototype.network = null; /** - * Creates a new GetStatusResponse instance using the specified properties. + * Creates a new GetBlockchainStatusResponse instance using the specified properties. * @function create - * @memberof org.dash.platform.dapi.v0.GetStatusResponse + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse * @static - * @param {org.dash.platform.dapi.v0.IGetStatusResponse=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetStatusResponse} GetStatusResponse instance + * @param {org.dash.platform.dapi.v0.IGetBlockchainStatusResponse=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetBlockchainStatusResponse} GetBlockchainStatusResponse instance */ - GetStatusResponse.create = function create(properties) { - return new GetStatusResponse(properties); + GetBlockchainStatusResponse.create = function create(properties) { + return new GetBlockchainStatusResponse(properties); }; /** - * Encodes the specified GetStatusResponse message. Does not implicitly {@link org.dash.platform.dapi.v0.GetStatusResponse.verify|verify} messages. + * Encodes the specified GetBlockchainStatusResponse message. Does not implicitly {@link org.dash.platform.dapi.v0.GetBlockchainStatusResponse.verify|verify} messages. * @function encode - * @memberof org.dash.platform.dapi.v0.GetStatusResponse + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse * @static - * @param {org.dash.platform.dapi.v0.IGetStatusResponse} message GetStatusResponse message or plain object to encode + * @param {org.dash.platform.dapi.v0.IGetBlockchainStatusResponse} message GetBlockchainStatusResponse message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetStatusResponse.encode = function encode(message, writer) { + GetBlockchainStatusResponse.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); if (message.version != null && Object.hasOwnProperty.call(message, "version")) - $root.org.dash.platform.dapi.v0.GetStatusResponse.Version.encode(message.version, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + $root.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version.encode(message.version, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); if (message.time != null && Object.hasOwnProperty.call(message, "time")) - $root.org.dash.platform.dapi.v0.GetStatusResponse.Time.encode(message.time, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + $root.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time.encode(message.time, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); if (message.status != null && Object.hasOwnProperty.call(message, "status")) writer.uint32(/* id 3, wireType 0 =*/24).int32(message.status); if (message.syncProgress != null && Object.hasOwnProperty.call(message, "syncProgress")) writer.uint32(/* id 4, wireType 1 =*/33).double(message.syncProgress); if (message.chain != null && Object.hasOwnProperty.call(message, "chain")) - $root.org.dash.platform.dapi.v0.GetStatusResponse.Chain.encode(message.chain, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim(); - if (message.masternode != null && Object.hasOwnProperty.call(message, "masternode")) - $root.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.encode(message.masternode, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim(); + $root.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.encode(message.chain, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim(); if (message.network != null && Object.hasOwnProperty.call(message, "network")) - $root.org.dash.platform.dapi.v0.GetStatusResponse.Network.encode(message.network, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim(); + $root.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network.encode(message.network, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim(); return writer; }; /** - * Encodes the specified GetStatusResponse message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetStatusResponse.verify|verify} messages. + * Encodes the specified GetBlockchainStatusResponse message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetBlockchainStatusResponse.verify|verify} messages. * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetStatusResponse + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse * @static - * @param {org.dash.platform.dapi.v0.IGetStatusResponse} message GetStatusResponse message or plain object to encode + * @param {org.dash.platform.dapi.v0.IGetBlockchainStatusResponse} message GetBlockchainStatusResponse message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetStatusResponse.encodeDelimited = function encodeDelimited(message, writer) { + GetBlockchainStatusResponse.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a GetStatusResponse message from the specified reader or buffer. + * Decodes a GetBlockchainStatusResponse message from the specified reader or buffer. * @function decode - * @memberof org.dash.platform.dapi.v0.GetStatusResponse + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetStatusResponse} GetStatusResponse + * @returns {org.dash.platform.dapi.v0.GetBlockchainStatusResponse} GetBlockchainStatusResponse * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetStatusResponse.decode = function decode(reader, length) { + GetBlockchainStatusResponse.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetStatusResponse(); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetBlockchainStatusResponse(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { case 1: - message.version = $root.org.dash.platform.dapi.v0.GetStatusResponse.Version.decode(reader, reader.uint32()); + message.version = $root.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version.decode(reader, reader.uint32()); break; case 2: - message.time = $root.org.dash.platform.dapi.v0.GetStatusResponse.Time.decode(reader, reader.uint32()); + message.time = $root.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time.decode(reader, reader.uint32()); break; case 3: message.status = reader.int32(); @@ -651,13 +673,10 @@ $root.org = (function() { message.syncProgress = reader.double(); break; case 5: - message.chain = $root.org.dash.platform.dapi.v0.GetStatusResponse.Chain.decode(reader, reader.uint32()); - break; - case 6: - message.masternode = $root.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.decode(reader, reader.uint32()); + message.chain = $root.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.decode(reader, reader.uint32()); break; case 7: - message.network = $root.org.dash.platform.dapi.v0.GetStatusResponse.Network.decode(reader, reader.uint32()); + message.network = $root.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network.decode(reader, reader.uint32()); break; default: reader.skipType(tag & 7); @@ -668,39 +687,39 @@ $root.org = (function() { }; /** - * Decodes a GetStatusResponse message from the specified reader or buffer, length delimited. + * Decodes a GetBlockchainStatusResponse message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetStatusResponse + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetStatusResponse} GetStatusResponse + * @returns {org.dash.platform.dapi.v0.GetBlockchainStatusResponse} GetBlockchainStatusResponse * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetStatusResponse.decodeDelimited = function decodeDelimited(reader) { + GetBlockchainStatusResponse.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a GetStatusResponse message. + * Verifies a GetBlockchainStatusResponse message. * @function verify - * @memberof org.dash.platform.dapi.v0.GetStatusResponse + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - GetStatusResponse.verify = function verify(message) { + GetBlockchainStatusResponse.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; if (message.version != null && message.hasOwnProperty("version")) { - var error = $root.org.dash.platform.dapi.v0.GetStatusResponse.Version.verify(message.version); + var error = $root.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version.verify(message.version); if (error) return "version." + error; } if (message.time != null && message.hasOwnProperty("time")) { - var error = $root.org.dash.platform.dapi.v0.GetStatusResponse.Time.verify(message.time); + var error = $root.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time.verify(message.time); if (error) return "time." + error; } @@ -718,17 +737,12 @@ $root.org = (function() { if (typeof message.syncProgress !== "number") return "syncProgress: number expected"; if (message.chain != null && message.hasOwnProperty("chain")) { - var error = $root.org.dash.platform.dapi.v0.GetStatusResponse.Chain.verify(message.chain); + var error = $root.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.verify(message.chain); if (error) return "chain." + error; } - if (message.masternode != null && message.hasOwnProperty("masternode")) { - var error = $root.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.verify(message.masternode); - if (error) - return "masternode." + error; - } if (message.network != null && message.hasOwnProperty("network")) { - var error = $root.org.dash.platform.dapi.v0.GetStatusResponse.Network.verify(message.network); + var error = $root.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network.verify(message.network); if (error) return "network." + error; } @@ -736,26 +750,26 @@ $root.org = (function() { }; /** - * Creates a GetStatusResponse message from a plain object. Also converts values to their respective internal types. + * Creates a GetBlockchainStatusResponse message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetStatusResponse + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse * @static * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetStatusResponse} GetStatusResponse + * @returns {org.dash.platform.dapi.v0.GetBlockchainStatusResponse} GetBlockchainStatusResponse */ - GetStatusResponse.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetStatusResponse) + GetBlockchainStatusResponse.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetBlockchainStatusResponse) return object; - var message = new $root.org.dash.platform.dapi.v0.GetStatusResponse(); + var message = new $root.org.dash.platform.dapi.v0.GetBlockchainStatusResponse(); if (object.version != null) { if (typeof object.version !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetStatusResponse.version: object expected"); - message.version = $root.org.dash.platform.dapi.v0.GetStatusResponse.Version.fromObject(object.version); + throw TypeError(".org.dash.platform.dapi.v0.GetBlockchainStatusResponse.version: object expected"); + message.version = $root.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version.fromObject(object.version); } if (object.time != null) { if (typeof object.time !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetStatusResponse.time: object expected"); - message.time = $root.org.dash.platform.dapi.v0.GetStatusResponse.Time.fromObject(object.time); + throw TypeError(".org.dash.platform.dapi.v0.GetBlockchainStatusResponse.time: object expected"); + message.time = $root.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time.fromObject(object.time); } switch (object.status) { case "NOT_STARTED": @@ -779,32 +793,27 @@ $root.org = (function() { message.syncProgress = Number(object.syncProgress); if (object.chain != null) { if (typeof object.chain !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetStatusResponse.chain: object expected"); - message.chain = $root.org.dash.platform.dapi.v0.GetStatusResponse.Chain.fromObject(object.chain); - } - if (object.masternode != null) { - if (typeof object.masternode !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetStatusResponse.masternode: object expected"); - message.masternode = $root.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.fromObject(object.masternode); + throw TypeError(".org.dash.platform.dapi.v0.GetBlockchainStatusResponse.chain: object expected"); + message.chain = $root.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.fromObject(object.chain); } if (object.network != null) { if (typeof object.network !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetStatusResponse.network: object expected"); - message.network = $root.org.dash.platform.dapi.v0.GetStatusResponse.Network.fromObject(object.network); + throw TypeError(".org.dash.platform.dapi.v0.GetBlockchainStatusResponse.network: object expected"); + message.network = $root.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network.fromObject(object.network); } return message; }; /** - * Creates a plain object from a GetStatusResponse message. Also converts values to other types if specified. + * Creates a plain object from a GetBlockchainStatusResponse message. Also converts values to other types if specified. * @function toObject - * @memberof org.dash.platform.dapi.v0.GetStatusResponse + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse * @static - * @param {org.dash.platform.dapi.v0.GetStatusResponse} message GetStatusResponse + * @param {org.dash.platform.dapi.v0.GetBlockchainStatusResponse} message GetBlockchainStatusResponse * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - GetStatusResponse.toObject = function toObject(message, options) { + GetBlockchainStatusResponse.toObject = function toObject(message, options) { if (!options) options = {}; var object = {}; @@ -814,42 +823,39 @@ $root.org = (function() { object.status = options.enums === String ? "NOT_STARTED" : 0; object.syncProgress = 0; object.chain = null; - object.masternode = null; object.network = null; } if (message.version != null && message.hasOwnProperty("version")) - object.version = $root.org.dash.platform.dapi.v0.GetStatusResponse.Version.toObject(message.version, options); + object.version = $root.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version.toObject(message.version, options); if (message.time != null && message.hasOwnProperty("time")) - object.time = $root.org.dash.platform.dapi.v0.GetStatusResponse.Time.toObject(message.time, options); + object.time = $root.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time.toObject(message.time, options); if (message.status != null && message.hasOwnProperty("status")) - object.status = options.enums === String ? $root.org.dash.platform.dapi.v0.GetStatusResponse.Status[message.status] : message.status; + object.status = options.enums === String ? $root.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Status[message.status] : message.status; if (message.syncProgress != null && message.hasOwnProperty("syncProgress")) object.syncProgress = options.json && !isFinite(message.syncProgress) ? String(message.syncProgress) : message.syncProgress; if (message.chain != null && message.hasOwnProperty("chain")) - object.chain = $root.org.dash.platform.dapi.v0.GetStatusResponse.Chain.toObject(message.chain, options); - if (message.masternode != null && message.hasOwnProperty("masternode")) - object.masternode = $root.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.toObject(message.masternode, options); + object.chain = $root.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.toObject(message.chain, options); if (message.network != null && message.hasOwnProperty("network")) - object.network = $root.org.dash.platform.dapi.v0.GetStatusResponse.Network.toObject(message.network, options); + object.network = $root.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network.toObject(message.network, options); return object; }; /** - * Converts this GetStatusResponse to JSON. + * Converts this GetBlockchainStatusResponse to JSON. * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetStatusResponse + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse * @instance * @returns {Object.} JSON object */ - GetStatusResponse.prototype.toJSON = function toJSON() { + GetBlockchainStatusResponse.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - GetStatusResponse.Version = (function() { + GetBlockchainStatusResponse.Version = (function() { /** * Properties of a Version. - * @memberof org.dash.platform.dapi.v0.GetStatusResponse + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse * @interface IVersion * @property {number|null} [protocol] Version protocol * @property {number|null} [software] Version software @@ -858,11 +864,11 @@ $root.org = (function() { /** * Constructs a new Version. - * @memberof org.dash.platform.dapi.v0.GetStatusResponse + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse * @classdesc Represents a Version. * @implements IVersion * @constructor - * @param {org.dash.platform.dapi.v0.GetStatusResponse.IVersion=} [properties] Properties to set + * @param {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.IVersion=} [properties] Properties to set */ function Version(properties) { if (properties) @@ -874,7 +880,7 @@ $root.org = (function() { /** * Version protocol. * @member {number} protocol - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Version + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version * @instance */ Version.prototype.protocol = 0; @@ -882,7 +888,7 @@ $root.org = (function() { /** * Version software. * @member {number} software - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Version + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version * @instance */ Version.prototype.software = 0; @@ -890,7 +896,7 @@ $root.org = (function() { /** * Version agent. * @member {string} agent - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Version + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version * @instance */ Version.prototype.agent = ""; @@ -898,21 +904,21 @@ $root.org = (function() { /** * Creates a new Version instance using the specified properties. * @function create - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Version + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version * @static - * @param {org.dash.platform.dapi.v0.GetStatusResponse.IVersion=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetStatusResponse.Version} Version instance + * @param {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.IVersion=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version} Version instance */ Version.create = function create(properties) { return new Version(properties); }; /** - * Encodes the specified Version message. Does not implicitly {@link org.dash.platform.dapi.v0.GetStatusResponse.Version.verify|verify} messages. + * Encodes the specified Version message. Does not implicitly {@link org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version.verify|verify} messages. * @function encode - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Version + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version * @static - * @param {org.dash.platform.dapi.v0.GetStatusResponse.IVersion} message Version message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.IVersion} message Version message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ @@ -929,11 +935,11 @@ $root.org = (function() { }; /** - * Encodes the specified Version message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetStatusResponse.Version.verify|verify} messages. + * Encodes the specified Version message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version.verify|verify} messages. * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Version + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version * @static - * @param {org.dash.platform.dapi.v0.GetStatusResponse.IVersion} message Version message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.IVersion} message Version message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ @@ -944,18 +950,18 @@ $root.org = (function() { /** * Decodes a Version message from the specified reader or buffer. * @function decode - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Version + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetStatusResponse.Version} Version + * @returns {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version} Version * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Version.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetStatusResponse.Version(); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { @@ -979,10 +985,10 @@ $root.org = (function() { /** * Decodes a Version message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Version + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetStatusResponse.Version} Version + * @returns {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version} Version * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ @@ -995,7 +1001,7 @@ $root.org = (function() { /** * Verifies a Version message. * @function verify - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Version + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not @@ -1018,15 +1024,15 @@ $root.org = (function() { /** * Creates a Version message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Version + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version * @static * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetStatusResponse.Version} Version + * @returns {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version} Version */ Version.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetStatusResponse.Version) + if (object instanceof $root.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version) return object; - var message = new $root.org.dash.platform.dapi.v0.GetStatusResponse.Version(); + var message = new $root.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version(); if (object.protocol != null) message.protocol = object.protocol >>> 0; if (object.software != null) @@ -1039,9 +1045,9 @@ $root.org = (function() { /** * Creates a plain object from a Version message. Also converts values to other types if specified. * @function toObject - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Version + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version * @static - * @param {org.dash.platform.dapi.v0.GetStatusResponse.Version} message Version + * @param {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version} message Version * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ @@ -1066,7 +1072,7 @@ $root.org = (function() { /** * Converts this Version to JSON. * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Version + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version * @instance * @returns {Object.} JSON object */ @@ -1077,11 +1083,11 @@ $root.org = (function() { return Version; })(); - GetStatusResponse.Time = (function() { + GetBlockchainStatusResponse.Time = (function() { /** * Properties of a Time. - * @memberof org.dash.platform.dapi.v0.GetStatusResponse + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse * @interface ITime * @property {number|null} [now] Time now * @property {number|null} [offset] Time offset @@ -1090,11 +1096,11 @@ $root.org = (function() { /** * Constructs a new Time. - * @memberof org.dash.platform.dapi.v0.GetStatusResponse + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse * @classdesc Represents a Time. * @implements ITime * @constructor - * @param {org.dash.platform.dapi.v0.GetStatusResponse.ITime=} [properties] Properties to set + * @param {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.ITime=} [properties] Properties to set */ function Time(properties) { if (properties) @@ -1106,7 +1112,7 @@ $root.org = (function() { /** * Time now. * @member {number} now - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Time + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time * @instance */ Time.prototype.now = 0; @@ -1114,7 +1120,7 @@ $root.org = (function() { /** * Time offset. * @member {number} offset - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Time + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time * @instance */ Time.prototype.offset = 0; @@ -1122,7 +1128,7 @@ $root.org = (function() { /** * Time median. * @member {number} median - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Time + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time * @instance */ Time.prototype.median = 0; @@ -1130,21 +1136,21 @@ $root.org = (function() { /** * Creates a new Time instance using the specified properties. * @function create - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Time + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time * @static - * @param {org.dash.platform.dapi.v0.GetStatusResponse.ITime=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetStatusResponse.Time} Time instance + * @param {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.ITime=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time} Time instance */ Time.create = function create(properties) { return new Time(properties); }; /** - * Encodes the specified Time message. Does not implicitly {@link org.dash.platform.dapi.v0.GetStatusResponse.Time.verify|verify} messages. + * Encodes the specified Time message. Does not implicitly {@link org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time.verify|verify} messages. * @function encode - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Time + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time * @static - * @param {org.dash.platform.dapi.v0.GetStatusResponse.ITime} message Time message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.ITime} message Time message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ @@ -1161,11 +1167,11 @@ $root.org = (function() { }; /** - * Encodes the specified Time message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetStatusResponse.Time.verify|verify} messages. + * Encodes the specified Time message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time.verify|verify} messages. * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Time + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time * @static - * @param {org.dash.platform.dapi.v0.GetStatusResponse.ITime} message Time message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.ITime} message Time message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ @@ -1176,18 +1182,18 @@ $root.org = (function() { /** * Decodes a Time message from the specified reader or buffer. * @function decode - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Time + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetStatusResponse.Time} Time + * @returns {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time} Time * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Time.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetStatusResponse.Time(); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { @@ -1211,10 +1217,10 @@ $root.org = (function() { /** * Decodes a Time message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Time + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetStatusResponse.Time} Time + * @returns {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time} Time * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ @@ -1227,7 +1233,7 @@ $root.org = (function() { /** * Verifies a Time message. * @function verify - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Time + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not @@ -1250,15 +1256,15 @@ $root.org = (function() { /** * Creates a Time message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Time + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time * @static * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetStatusResponse.Time} Time + * @returns {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time} Time */ Time.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetStatusResponse.Time) + if (object instanceof $root.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time) return object; - var message = new $root.org.dash.platform.dapi.v0.GetStatusResponse.Time(); + var message = new $root.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time(); if (object.now != null) message.now = object.now >>> 0; if (object.offset != null) @@ -1271,9 +1277,9 @@ $root.org = (function() { /** * Creates a plain object from a Time message. Also converts values to other types if specified. * @function toObject - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Time + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time * @static - * @param {org.dash.platform.dapi.v0.GetStatusResponse.Time} message Time + * @param {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time} message Time * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ @@ -1298,7 +1304,7 @@ $root.org = (function() { /** * Converts this Time to JSON. * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Time + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time * @instance * @returns {Object.} JSON object */ @@ -1311,14 +1317,14 @@ $root.org = (function() { /** * Status enum. - * @name org.dash.platform.dapi.v0.GetStatusResponse.Status + * @name org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Status * @enum {number} * @property {number} NOT_STARTED=0 NOT_STARTED value * @property {number} SYNCING=1 SYNCING value * @property {number} READY=2 READY value * @property {number} ERROR=3 ERROR value */ - GetStatusResponse.Status = (function() { + GetBlockchainStatusResponse.Status = (function() { var valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "NOT_STARTED"] = 0; values[valuesById[1] = "SYNCING"] = 1; @@ -1327,11 +1333,11 @@ $root.org = (function() { return values; })(); - GetStatusResponse.Chain = (function() { + GetBlockchainStatusResponse.Chain = (function() { /** * Properties of a Chain. - * @memberof org.dash.platform.dapi.v0.GetStatusResponse + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse * @interface IChain * @property {string|null} [name] Chain name * @property {number|null} [headersCount] Chain headersCount @@ -1345,11 +1351,11 @@ $root.org = (function() { /** * Constructs a new Chain. - * @memberof org.dash.platform.dapi.v0.GetStatusResponse + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse * @classdesc Represents a Chain. * @implements IChain * @constructor - * @param {org.dash.platform.dapi.v0.GetStatusResponse.IChain=} [properties] Properties to set + * @param {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.IChain=} [properties] Properties to set */ function Chain(properties) { if (properties) @@ -1361,7 +1367,7 @@ $root.org = (function() { /** * Chain name. * @member {string} name - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Chain + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain * @instance */ Chain.prototype.name = ""; @@ -1369,7 +1375,7 @@ $root.org = (function() { /** * Chain headersCount. * @member {number} headersCount - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Chain + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain * @instance */ Chain.prototype.headersCount = 0; @@ -1377,7 +1383,7 @@ $root.org = (function() { /** * Chain blocksCount. * @member {number} blocksCount - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Chain + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain * @instance */ Chain.prototype.blocksCount = 0; @@ -1385,7 +1391,7 @@ $root.org = (function() { /** * Chain bestBlockHash. * @member {Uint8Array} bestBlockHash - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Chain + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain * @instance */ Chain.prototype.bestBlockHash = $util.newBuffer([]); @@ -1393,7 +1399,7 @@ $root.org = (function() { /** * Chain difficulty. * @member {number} difficulty - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Chain + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain * @instance */ Chain.prototype.difficulty = 0; @@ -1401,7 +1407,7 @@ $root.org = (function() { /** * Chain chainWork. * @member {Uint8Array} chainWork - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Chain + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain * @instance */ Chain.prototype.chainWork = $util.newBuffer([]); @@ -1409,7 +1415,7 @@ $root.org = (function() { /** * Chain isSynced. * @member {boolean} isSynced - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Chain + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain * @instance */ Chain.prototype.isSynced = false; @@ -1417,7 +1423,7 @@ $root.org = (function() { /** * Chain syncProgress. * @member {number} syncProgress - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Chain + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain * @instance */ Chain.prototype.syncProgress = 0; @@ -1425,21 +1431,21 @@ $root.org = (function() { /** * Creates a new Chain instance using the specified properties. * @function create - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Chain + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain * @static - * @param {org.dash.platform.dapi.v0.GetStatusResponse.IChain=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetStatusResponse.Chain} Chain instance + * @param {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.IChain=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain} Chain instance */ Chain.create = function create(properties) { return new Chain(properties); }; /** - * Encodes the specified Chain message. Does not implicitly {@link org.dash.platform.dapi.v0.GetStatusResponse.Chain.verify|verify} messages. + * Encodes the specified Chain message. Does not implicitly {@link org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.verify|verify} messages. * @function encode - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Chain + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain * @static - * @param {org.dash.platform.dapi.v0.GetStatusResponse.IChain} message Chain message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.IChain} message Chain message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ @@ -1466,11 +1472,11 @@ $root.org = (function() { }; /** - * Encodes the specified Chain message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetStatusResponse.Chain.verify|verify} messages. + * Encodes the specified Chain message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.verify|verify} messages. * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Chain + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain * @static - * @param {org.dash.platform.dapi.v0.GetStatusResponse.IChain} message Chain message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.IChain} message Chain message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ @@ -1481,18 +1487,18 @@ $root.org = (function() { /** * Decodes a Chain message from the specified reader or buffer. * @function decode - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Chain + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetStatusResponse.Chain} Chain + * @returns {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain} Chain * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Chain.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetStatusResponse.Chain(); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { @@ -1531,10 +1537,10 @@ $root.org = (function() { /** * Decodes a Chain message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Chain + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetStatusResponse.Chain} Chain + * @returns {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain} Chain * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ @@ -1547,7 +1553,7 @@ $root.org = (function() { /** * Verifies a Chain message. * @function verify - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Chain + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not @@ -1585,15 +1591,15 @@ $root.org = (function() { /** * Creates a Chain message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Chain + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain * @static * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetStatusResponse.Chain} Chain + * @returns {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain} Chain */ Chain.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetStatusResponse.Chain) + if (object instanceof $root.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain) return object; - var message = new $root.org.dash.platform.dapi.v0.GetStatusResponse.Chain(); + var message = new $root.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain(); if (object.name != null) message.name = String(object.name); if (object.headersCount != null) @@ -1622,9 +1628,9 @@ $root.org = (function() { /** * Creates a plain object from a Chain message. Also converts values to other types if specified. * @function toObject - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Chain + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain * @static - * @param {org.dash.platform.dapi.v0.GetStatusResponse.Chain} message Chain + * @param {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain} message Chain * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ @@ -1676,7 +1682,7 @@ $root.org = (function() { /** * Converts this Chain to JSON. * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Chain + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain * @instance * @returns {Object.} JSON object */ @@ -1687,365 +1693,11 @@ $root.org = (function() { return Chain; })(); - GetStatusResponse.Masternode = (function() { - - /** - * Properties of a Masternode. - * @memberof org.dash.platform.dapi.v0.GetStatusResponse - * @interface IMasternode - * @property {org.dash.platform.dapi.v0.GetStatusResponse.Masternode.Status|null} [status] Masternode status - * @property {Uint8Array|null} [proTxHash] Masternode proTxHash - * @property {number|null} [posePenalty] Masternode posePenalty - * @property {boolean|null} [isSynced] Masternode isSynced - * @property {number|null} [syncProgress] Masternode syncProgress - */ - - /** - * Constructs a new Masternode. - * @memberof org.dash.platform.dapi.v0.GetStatusResponse - * @classdesc Represents a Masternode. - * @implements IMasternode - * @constructor - * @param {org.dash.platform.dapi.v0.GetStatusResponse.IMasternode=} [properties] Properties to set - */ - function Masternode(properties) { - if (properties) - for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) - if (properties[keys[i]] != null) - this[keys[i]] = properties[keys[i]]; - } - - /** - * Masternode status. - * @member {org.dash.platform.dapi.v0.GetStatusResponse.Masternode.Status} status - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Masternode - * @instance - */ - Masternode.prototype.status = 0; - - /** - * Masternode proTxHash. - * @member {Uint8Array} proTxHash - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Masternode - * @instance - */ - Masternode.prototype.proTxHash = $util.newBuffer([]); - - /** - * Masternode posePenalty. - * @member {number} posePenalty - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Masternode - * @instance - */ - Masternode.prototype.posePenalty = 0; - - /** - * Masternode isSynced. - * @member {boolean} isSynced - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Masternode - * @instance - */ - Masternode.prototype.isSynced = false; - - /** - * Masternode syncProgress. - * @member {number} syncProgress - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Masternode - * @instance - */ - Masternode.prototype.syncProgress = 0; - - /** - * Creates a new Masternode instance using the specified properties. - * @function create - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Masternode - * @static - * @param {org.dash.platform.dapi.v0.GetStatusResponse.IMasternode=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetStatusResponse.Masternode} Masternode instance - */ - Masternode.create = function create(properties) { - return new Masternode(properties); - }; - - /** - * Encodes the specified Masternode message. Does not implicitly {@link org.dash.platform.dapi.v0.GetStatusResponse.Masternode.verify|verify} messages. - * @function encode - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Masternode - * @static - * @param {org.dash.platform.dapi.v0.GetStatusResponse.IMasternode} message Masternode message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - Masternode.encode = function encode(message, writer) { - if (!writer) - writer = $Writer.create(); - if (message.status != null && Object.hasOwnProperty.call(message, "status")) - writer.uint32(/* id 1, wireType 0 =*/8).int32(message.status); - if (message.proTxHash != null && Object.hasOwnProperty.call(message, "proTxHash")) - writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.proTxHash); - if (message.posePenalty != null && Object.hasOwnProperty.call(message, "posePenalty")) - writer.uint32(/* id 3, wireType 0 =*/24).uint32(message.posePenalty); - if (message.isSynced != null && Object.hasOwnProperty.call(message, "isSynced")) - writer.uint32(/* id 4, wireType 0 =*/32).bool(message.isSynced); - if (message.syncProgress != null && Object.hasOwnProperty.call(message, "syncProgress")) - writer.uint32(/* id 5, wireType 1 =*/41).double(message.syncProgress); - return writer; - }; - - /** - * Encodes the specified Masternode message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetStatusResponse.Masternode.verify|verify} messages. - * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Masternode - * @static - * @param {org.dash.platform.dapi.v0.GetStatusResponse.IMasternode} message Masternode message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - Masternode.encodeDelimited = function encodeDelimited(message, writer) { - return this.encode(message, writer).ldelim(); - }; - - /** - * Decodes a Masternode message from the specified reader or buffer. - * @function decode - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Masternode - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetStatusResponse.Masternode} Masternode - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - Masternode.decode = function decode(reader, length) { - if (!(reader instanceof $Reader)) - reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetStatusResponse.Masternode(); - while (reader.pos < end) { - var tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - message.status = reader.int32(); - break; - case 2: - message.proTxHash = reader.bytes(); - break; - case 3: - message.posePenalty = reader.uint32(); - break; - case 4: - message.isSynced = reader.bool(); - break; - case 5: - message.syncProgress = reader.double(); - break; - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }; - - /** - * Decodes a Masternode message from the specified reader or buffer, length delimited. - * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Masternode - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetStatusResponse.Masternode} Masternode - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - Masternode.decodeDelimited = function decodeDelimited(reader) { - if (!(reader instanceof $Reader)) - reader = new $Reader(reader); - return this.decode(reader, reader.uint32()); - }; - - /** - * Verifies a Masternode message. - * @function verify - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Masternode - * @static - * @param {Object.} message Plain object to verify - * @returns {string|null} `null` if valid, otherwise the reason why it is not - */ - Masternode.verify = function verify(message) { - if (typeof message !== "object" || message === null) - return "object expected"; - if (message.status != null && message.hasOwnProperty("status")) - switch (message.status) { - default: - return "status: enum value expected"; - case 0: - case 1: - case 2: - case 3: - case 4: - case 5: - case 6: - case 7: - break; - } - if (message.proTxHash != null && message.hasOwnProperty("proTxHash")) - if (!(message.proTxHash && typeof message.proTxHash.length === "number" || $util.isString(message.proTxHash))) - return "proTxHash: buffer expected"; - if (message.posePenalty != null && message.hasOwnProperty("posePenalty")) - if (!$util.isInteger(message.posePenalty)) - return "posePenalty: integer expected"; - if (message.isSynced != null && message.hasOwnProperty("isSynced")) - if (typeof message.isSynced !== "boolean") - return "isSynced: boolean expected"; - if (message.syncProgress != null && message.hasOwnProperty("syncProgress")) - if (typeof message.syncProgress !== "number") - return "syncProgress: number expected"; - return null; - }; - - /** - * Creates a Masternode message from a plain object. Also converts values to their respective internal types. - * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Masternode - * @static - * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetStatusResponse.Masternode} Masternode - */ - Masternode.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetStatusResponse.Masternode) - return object; - var message = new $root.org.dash.platform.dapi.v0.GetStatusResponse.Masternode(); - switch (object.status) { - case "UNKNOWN": - case 0: - message.status = 0; - break; - case "WAITING_FOR_PROTX": - case 1: - message.status = 1; - break; - case "POSE_BANNED": - case 2: - message.status = 2; - break; - case "REMOVED": - case 3: - message.status = 3; - break; - case "OPERATOR_KEY_CHANGED": - case 4: - message.status = 4; - break; - case "PROTX_IP_CHANGED": - case 5: - message.status = 5; - break; - case "READY": - case 6: - message.status = 6; - break; - case "ERROR": - case 7: - message.status = 7; - break; - } - if (object.proTxHash != null) - if (typeof object.proTxHash === "string") - $util.base64.decode(object.proTxHash, message.proTxHash = $util.newBuffer($util.base64.length(object.proTxHash)), 0); - else if (object.proTxHash.length >= 0) - message.proTxHash = object.proTxHash; - if (object.posePenalty != null) - message.posePenalty = object.posePenalty >>> 0; - if (object.isSynced != null) - message.isSynced = Boolean(object.isSynced); - if (object.syncProgress != null) - message.syncProgress = Number(object.syncProgress); - return message; - }; - - /** - * Creates a plain object from a Masternode message. Also converts values to other types if specified. - * @function toObject - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Masternode - * @static - * @param {org.dash.platform.dapi.v0.GetStatusResponse.Masternode} message Masternode - * @param {$protobuf.IConversionOptions} [options] Conversion options - * @returns {Object.} Plain object - */ - Masternode.toObject = function toObject(message, options) { - if (!options) - options = {}; - var object = {}; - if (options.defaults) { - object.status = options.enums === String ? "UNKNOWN" : 0; - if (options.bytes === String) - object.proTxHash = ""; - else { - object.proTxHash = []; - if (options.bytes !== Array) - object.proTxHash = $util.newBuffer(object.proTxHash); - } - object.posePenalty = 0; - object.isSynced = false; - object.syncProgress = 0; - } - if (message.status != null && message.hasOwnProperty("status")) - object.status = options.enums === String ? $root.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.Status[message.status] : message.status; - if (message.proTxHash != null && message.hasOwnProperty("proTxHash")) - object.proTxHash = options.bytes === String ? $util.base64.encode(message.proTxHash, 0, message.proTxHash.length) : options.bytes === Array ? Array.prototype.slice.call(message.proTxHash) : message.proTxHash; - if (message.posePenalty != null && message.hasOwnProperty("posePenalty")) - object.posePenalty = message.posePenalty; - if (message.isSynced != null && message.hasOwnProperty("isSynced")) - object.isSynced = message.isSynced; - if (message.syncProgress != null && message.hasOwnProperty("syncProgress")) - object.syncProgress = options.json && !isFinite(message.syncProgress) ? String(message.syncProgress) : message.syncProgress; - return object; - }; - - /** - * Converts this Masternode to JSON. - * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Masternode - * @instance - * @returns {Object.} JSON object - */ - Masternode.prototype.toJSON = function toJSON() { - return this.constructor.toObject(this, $protobuf.util.toJSONOptions); - }; - - /** - * Status enum. - * @name org.dash.platform.dapi.v0.GetStatusResponse.Masternode.Status - * @enum {number} - * @property {number} UNKNOWN=0 UNKNOWN value - * @property {number} WAITING_FOR_PROTX=1 WAITING_FOR_PROTX value - * @property {number} POSE_BANNED=2 POSE_BANNED value - * @property {number} REMOVED=3 REMOVED value - * @property {number} OPERATOR_KEY_CHANGED=4 OPERATOR_KEY_CHANGED value - * @property {number} PROTX_IP_CHANGED=5 PROTX_IP_CHANGED value - * @property {number} READY=6 READY value - * @property {number} ERROR=7 ERROR value - */ - Masternode.Status = (function() { - var valuesById = {}, values = Object.create(valuesById); - values[valuesById[0] = "UNKNOWN"] = 0; - values[valuesById[1] = "WAITING_FOR_PROTX"] = 1; - values[valuesById[2] = "POSE_BANNED"] = 2; - values[valuesById[3] = "REMOVED"] = 3; - values[valuesById[4] = "OPERATOR_KEY_CHANGED"] = 4; - values[valuesById[5] = "PROTX_IP_CHANGED"] = 5; - values[valuesById[6] = "READY"] = 6; - values[valuesById[7] = "ERROR"] = 7; - return values; - })(); - - return Masternode; - })(); - - GetStatusResponse.NetworkFee = (function() { + GetBlockchainStatusResponse.NetworkFee = (function() { /** * Properties of a NetworkFee. - * @memberof org.dash.platform.dapi.v0.GetStatusResponse + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse * @interface INetworkFee * @property {number|null} [relay] NetworkFee relay * @property {number|null} [incremental] NetworkFee incremental @@ -2053,11 +1705,11 @@ $root.org = (function() { /** * Constructs a new NetworkFee. - * @memberof org.dash.platform.dapi.v0.GetStatusResponse + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse * @classdesc Represents a NetworkFee. * @implements INetworkFee * @constructor - * @param {org.dash.platform.dapi.v0.GetStatusResponse.INetworkFee=} [properties] Properties to set + * @param {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.INetworkFee=} [properties] Properties to set */ function NetworkFee(properties) { if (properties) @@ -2069,7 +1721,7 @@ $root.org = (function() { /** * NetworkFee relay. * @member {number} relay - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee * @instance */ NetworkFee.prototype.relay = 0; @@ -2077,7 +1729,7 @@ $root.org = (function() { /** * NetworkFee incremental. * @member {number} incremental - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee * @instance */ NetworkFee.prototype.incremental = 0; @@ -2085,21 +1737,21 @@ $root.org = (function() { /** * Creates a new NetworkFee instance using the specified properties. * @function create - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee * @static - * @param {org.dash.platform.dapi.v0.GetStatusResponse.INetworkFee=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee} NetworkFee instance + * @param {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.INetworkFee=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee} NetworkFee instance */ NetworkFee.create = function create(properties) { return new NetworkFee(properties); }; /** - * Encodes the specified NetworkFee message. Does not implicitly {@link org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.verify|verify} messages. + * Encodes the specified NetworkFee message. Does not implicitly {@link org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee.verify|verify} messages. * @function encode - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee * @static - * @param {org.dash.platform.dapi.v0.GetStatusResponse.INetworkFee} message NetworkFee message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.INetworkFee} message NetworkFee message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ @@ -2114,11 +1766,11 @@ $root.org = (function() { }; /** - * Encodes the specified NetworkFee message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.verify|verify} messages. + * Encodes the specified NetworkFee message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee.verify|verify} messages. * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee * @static - * @param {org.dash.platform.dapi.v0.GetStatusResponse.INetworkFee} message NetworkFee message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.INetworkFee} message NetworkFee message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ @@ -2129,18 +1781,18 @@ $root.org = (function() { /** * Decodes a NetworkFee message from the specified reader or buffer. * @function decode - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee} NetworkFee + * @returns {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee} NetworkFee * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ NetworkFee.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee(); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { @@ -2161,10 +1813,10 @@ $root.org = (function() { /** * Decodes a NetworkFee message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee} NetworkFee + * @returns {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee} NetworkFee * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ @@ -2177,7 +1829,7 @@ $root.org = (function() { /** * Verifies a NetworkFee message. * @function verify - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not @@ -2197,15 +1849,15 @@ $root.org = (function() { /** * Creates a NetworkFee message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee * @static * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee} NetworkFee + * @returns {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee} NetworkFee */ NetworkFee.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee) + if (object instanceof $root.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee) return object; - var message = new $root.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee(); + var message = new $root.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee(); if (object.relay != null) message.relay = Number(object.relay); if (object.incremental != null) @@ -2216,9 +1868,9 @@ $root.org = (function() { /** * Creates a plain object from a NetworkFee message. Also converts values to other types if specified. * @function toObject - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee * @static - * @param {org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee} message NetworkFee + * @param {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee} message NetworkFee * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ @@ -2240,7 +1892,7 @@ $root.org = (function() { /** * Converts this NetworkFee to JSON. * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee * @instance * @returns {Object.} JSON object */ @@ -2251,23 +1903,23 @@ $root.org = (function() { return NetworkFee; })(); - GetStatusResponse.Network = (function() { + GetBlockchainStatusResponse.Network = (function() { /** * Properties of a Network. - * @memberof org.dash.platform.dapi.v0.GetStatusResponse + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse * @interface INetwork * @property {number|null} [peersCount] Network peersCount - * @property {org.dash.platform.dapi.v0.GetStatusResponse.INetworkFee|null} [fee] Network fee + * @property {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.INetworkFee|null} [fee] Network fee */ /** * Constructs a new Network. - * @memberof org.dash.platform.dapi.v0.GetStatusResponse + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse * @classdesc Represents a Network. * @implements INetwork * @constructor - * @param {org.dash.platform.dapi.v0.GetStatusResponse.INetwork=} [properties] Properties to set + * @param {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.INetwork=} [properties] Properties to set */ function Network(properties) { if (properties) @@ -2279,15 +1931,15 @@ $root.org = (function() { /** * Network peersCount. * @member {number} peersCount - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Network + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network * @instance */ Network.prototype.peersCount = 0; /** * Network fee. - * @member {org.dash.platform.dapi.v0.GetStatusResponse.INetworkFee|null|undefined} fee - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Network + * @member {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.INetworkFee|null|undefined} fee + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network * @instance */ Network.prototype.fee = null; @@ -2295,21 +1947,21 @@ $root.org = (function() { /** * Creates a new Network instance using the specified properties. * @function create - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Network + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network * @static - * @param {org.dash.platform.dapi.v0.GetStatusResponse.INetwork=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetStatusResponse.Network} Network instance + * @param {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.INetwork=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network} Network instance */ Network.create = function create(properties) { return new Network(properties); }; /** - * Encodes the specified Network message. Does not implicitly {@link org.dash.platform.dapi.v0.GetStatusResponse.Network.verify|verify} messages. + * Encodes the specified Network message. Does not implicitly {@link org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network.verify|verify} messages. * @function encode - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Network + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network * @static - * @param {org.dash.platform.dapi.v0.GetStatusResponse.INetwork} message Network message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.INetwork} message Network message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ @@ -2319,16 +1971,16 @@ $root.org = (function() { if (message.peersCount != null && Object.hasOwnProperty.call(message, "peersCount")) writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.peersCount); if (message.fee != null && Object.hasOwnProperty.call(message, "fee")) - $root.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.encode(message.fee, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + $root.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee.encode(message.fee, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); return writer; }; /** - * Encodes the specified Network message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetStatusResponse.Network.verify|verify} messages. + * Encodes the specified Network message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network.verify|verify} messages. * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Network + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network * @static - * @param {org.dash.platform.dapi.v0.GetStatusResponse.INetwork} message Network message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.INetwork} message Network message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ @@ -2339,18 +1991,18 @@ $root.org = (function() { /** * Decodes a Network message from the specified reader or buffer. * @function decode - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Network + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetStatusResponse.Network} Network + * @returns {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network} Network * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ Network.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetStatusResponse.Network(); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { @@ -2358,7 +2010,7 @@ $root.org = (function() { message.peersCount = reader.uint32(); break; case 2: - message.fee = $root.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.decode(reader, reader.uint32()); + message.fee = $root.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee.decode(reader, reader.uint32()); break; default: reader.skipType(tag & 7); @@ -2371,10 +2023,10 @@ $root.org = (function() { /** * Decodes a Network message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Network + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetStatusResponse.Network} Network + * @returns {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network} Network * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ @@ -2387,7 +2039,7 @@ $root.org = (function() { /** * Verifies a Network message. * @function verify - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Network + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not @@ -2399,7 +2051,7 @@ $root.org = (function() { if (!$util.isInteger(message.peersCount)) return "peersCount: integer expected"; if (message.fee != null && message.hasOwnProperty("fee")) { - var error = $root.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.verify(message.fee); + var error = $root.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee.verify(message.fee); if (error) return "fee." + error; } @@ -2409,21 +2061,21 @@ $root.org = (function() { /** * Creates a Network message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Network + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network * @static * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetStatusResponse.Network} Network + * @returns {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network} Network */ Network.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetStatusResponse.Network) + if (object instanceof $root.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network) return object; - var message = new $root.org.dash.platform.dapi.v0.GetStatusResponse.Network(); + var message = new $root.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network(); if (object.peersCount != null) message.peersCount = object.peersCount >>> 0; if (object.fee != null) { if (typeof object.fee !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetStatusResponse.Network.fee: object expected"); - message.fee = $root.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.fromObject(object.fee); + throw TypeError(".org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network.fee: object expected"); + message.fee = $root.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee.fromObject(object.fee); } return message; }; @@ -2431,9 +2083,9 @@ $root.org = (function() { /** * Creates a plain object from a Network message. Also converts values to other types if specified. * @function toObject - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Network + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network * @static - * @param {org.dash.platform.dapi.v0.GetStatusResponse.Network} message Network + * @param {org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network} message Network * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ @@ -2448,14 +2100,14 @@ $root.org = (function() { if (message.peersCount != null && message.hasOwnProperty("peersCount")) object.peersCount = message.peersCount; if (message.fee != null && message.hasOwnProperty("fee")) - object.fee = $root.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.toObject(message.fee, options); + object.fee = $root.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee.toObject(message.fee, options); return object; }; /** * Converts this Network to JSON. * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetStatusResponse.Network + * @memberof org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network * @instance * @returns {Object.} JSON object */ @@ -2466,7 +2118,521 @@ $root.org = (function() { return Network; })(); - return GetStatusResponse; + return GetBlockchainStatusResponse; + })(); + + v0.GetMasternodeStatusRequest = (function() { + + /** + * Properties of a GetMasternodeStatusRequest. + * @memberof org.dash.platform.dapi.v0 + * @interface IGetMasternodeStatusRequest + */ + + /** + * Constructs a new GetMasternodeStatusRequest. + * @memberof org.dash.platform.dapi.v0 + * @classdesc Represents a GetMasternodeStatusRequest. + * @implements IGetMasternodeStatusRequest + * @constructor + * @param {org.dash.platform.dapi.v0.IGetMasternodeStatusRequest=} [properties] Properties to set + */ + function GetMasternodeStatusRequest(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Creates a new GetMasternodeStatusRequest instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetMasternodeStatusRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetMasternodeStatusRequest=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetMasternodeStatusRequest} GetMasternodeStatusRequest instance + */ + GetMasternodeStatusRequest.create = function create(properties) { + return new GetMasternodeStatusRequest(properties); + }; + + /** + * Encodes the specified GetMasternodeStatusRequest message. Does not implicitly {@link org.dash.platform.dapi.v0.GetMasternodeStatusRequest.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetMasternodeStatusRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetMasternodeStatusRequest} message GetMasternodeStatusRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetMasternodeStatusRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + return writer; + }; + + /** + * Encodes the specified GetMasternodeStatusRequest message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetMasternodeStatusRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetMasternodeStatusRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetMasternodeStatusRequest} message GetMasternodeStatusRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetMasternodeStatusRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetMasternodeStatusRequest message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetMasternodeStatusRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetMasternodeStatusRequest} GetMasternodeStatusRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetMasternodeStatusRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetMasternodeStatusRequest(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetMasternodeStatusRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetMasternodeStatusRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetMasternodeStatusRequest} GetMasternodeStatusRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetMasternodeStatusRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetMasternodeStatusRequest message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetMasternodeStatusRequest + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetMasternodeStatusRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + return null; + }; + + /** + * Creates a GetMasternodeStatusRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetMasternodeStatusRequest + * @static + * @param {Object.} object Plain object + * @returns {org.dash.platform.dapi.v0.GetMasternodeStatusRequest} GetMasternodeStatusRequest + */ + GetMasternodeStatusRequest.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetMasternodeStatusRequest) + return object; + return new $root.org.dash.platform.dapi.v0.GetMasternodeStatusRequest(); + }; + + /** + * Creates a plain object from a GetMasternodeStatusRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetMasternodeStatusRequest + * @static + * @param {org.dash.platform.dapi.v0.GetMasternodeStatusRequest} message GetMasternodeStatusRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + GetMasternodeStatusRequest.toObject = function toObject() { + return {}; + }; + + /** + * Converts this GetMasternodeStatusRequest to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetMasternodeStatusRequest + * @instance + * @returns {Object.} JSON object + */ + GetMasternodeStatusRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return GetMasternodeStatusRequest; + })(); + + v0.GetMasternodeStatusResponse = (function() { + + /** + * Properties of a GetMasternodeStatusResponse. + * @memberof org.dash.platform.dapi.v0 + * @interface IGetMasternodeStatusResponse + * @property {org.dash.platform.dapi.v0.GetMasternodeStatusResponse.Status|null} [status] GetMasternodeStatusResponse status + * @property {Uint8Array|null} [proTxHash] GetMasternodeStatusResponse proTxHash + * @property {number|null} [posePenalty] GetMasternodeStatusResponse posePenalty + * @property {boolean|null} [isSynced] GetMasternodeStatusResponse isSynced + * @property {number|null} [syncProgress] GetMasternodeStatusResponse syncProgress + */ + + /** + * Constructs a new GetMasternodeStatusResponse. + * @memberof org.dash.platform.dapi.v0 + * @classdesc Represents a GetMasternodeStatusResponse. + * @implements IGetMasternodeStatusResponse + * @constructor + * @param {org.dash.platform.dapi.v0.IGetMasternodeStatusResponse=} [properties] Properties to set + */ + function GetMasternodeStatusResponse(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetMasternodeStatusResponse status. + * @member {org.dash.platform.dapi.v0.GetMasternodeStatusResponse.Status} status + * @memberof org.dash.platform.dapi.v0.GetMasternodeStatusResponse + * @instance + */ + GetMasternodeStatusResponse.prototype.status = 0; + + /** + * GetMasternodeStatusResponse proTxHash. + * @member {Uint8Array} proTxHash + * @memberof org.dash.platform.dapi.v0.GetMasternodeStatusResponse + * @instance + */ + GetMasternodeStatusResponse.prototype.proTxHash = $util.newBuffer([]); + + /** + * GetMasternodeStatusResponse posePenalty. + * @member {number} posePenalty + * @memberof org.dash.platform.dapi.v0.GetMasternodeStatusResponse + * @instance + */ + GetMasternodeStatusResponse.prototype.posePenalty = 0; + + /** + * GetMasternodeStatusResponse isSynced. + * @member {boolean} isSynced + * @memberof org.dash.platform.dapi.v0.GetMasternodeStatusResponse + * @instance + */ + GetMasternodeStatusResponse.prototype.isSynced = false; + + /** + * GetMasternodeStatusResponse syncProgress. + * @member {number} syncProgress + * @memberof org.dash.platform.dapi.v0.GetMasternodeStatusResponse + * @instance + */ + GetMasternodeStatusResponse.prototype.syncProgress = 0; + + /** + * Creates a new GetMasternodeStatusResponse instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetMasternodeStatusResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetMasternodeStatusResponse=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetMasternodeStatusResponse} GetMasternodeStatusResponse instance + */ + GetMasternodeStatusResponse.create = function create(properties) { + return new GetMasternodeStatusResponse(properties); + }; + + /** + * Encodes the specified GetMasternodeStatusResponse message. Does not implicitly {@link org.dash.platform.dapi.v0.GetMasternodeStatusResponse.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetMasternodeStatusResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetMasternodeStatusResponse} message GetMasternodeStatusResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetMasternodeStatusResponse.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.status != null && Object.hasOwnProperty.call(message, "status")) + writer.uint32(/* id 1, wireType 0 =*/8).int32(message.status); + if (message.proTxHash != null && Object.hasOwnProperty.call(message, "proTxHash")) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.proTxHash); + if (message.posePenalty != null && Object.hasOwnProperty.call(message, "posePenalty")) + writer.uint32(/* id 3, wireType 0 =*/24).uint32(message.posePenalty); + if (message.isSynced != null && Object.hasOwnProperty.call(message, "isSynced")) + writer.uint32(/* id 4, wireType 0 =*/32).bool(message.isSynced); + if (message.syncProgress != null && Object.hasOwnProperty.call(message, "syncProgress")) + writer.uint32(/* id 5, wireType 1 =*/41).double(message.syncProgress); + return writer; + }; + + /** + * Encodes the specified GetMasternodeStatusResponse message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetMasternodeStatusResponse.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetMasternodeStatusResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetMasternodeStatusResponse} message GetMasternodeStatusResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetMasternodeStatusResponse.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetMasternodeStatusResponse message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetMasternodeStatusResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetMasternodeStatusResponse} GetMasternodeStatusResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetMasternodeStatusResponse.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetMasternodeStatusResponse(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.status = reader.int32(); + break; + case 2: + message.proTxHash = reader.bytes(); + break; + case 3: + message.posePenalty = reader.uint32(); + break; + case 4: + message.isSynced = reader.bool(); + break; + case 5: + message.syncProgress = reader.double(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetMasternodeStatusResponse message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetMasternodeStatusResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetMasternodeStatusResponse} GetMasternodeStatusResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetMasternodeStatusResponse.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetMasternodeStatusResponse message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetMasternodeStatusResponse + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetMasternodeStatusResponse.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.status != null && message.hasOwnProperty("status")) + switch (message.status) { + default: + return "status: enum value expected"; + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + break; + } + if (message.proTxHash != null && message.hasOwnProperty("proTxHash")) + if (!(message.proTxHash && typeof message.proTxHash.length === "number" || $util.isString(message.proTxHash))) + return "proTxHash: buffer expected"; + if (message.posePenalty != null && message.hasOwnProperty("posePenalty")) + if (!$util.isInteger(message.posePenalty)) + return "posePenalty: integer expected"; + if (message.isSynced != null && message.hasOwnProperty("isSynced")) + if (typeof message.isSynced !== "boolean") + return "isSynced: boolean expected"; + if (message.syncProgress != null && message.hasOwnProperty("syncProgress")) + if (typeof message.syncProgress !== "number") + return "syncProgress: number expected"; + return null; + }; + + /** + * Creates a GetMasternodeStatusResponse message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetMasternodeStatusResponse + * @static + * @param {Object.} object Plain object + * @returns {org.dash.platform.dapi.v0.GetMasternodeStatusResponse} GetMasternodeStatusResponse + */ + GetMasternodeStatusResponse.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetMasternodeStatusResponse) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetMasternodeStatusResponse(); + switch (object.status) { + case "UNKNOWN": + case 0: + message.status = 0; + break; + case "WAITING_FOR_PROTX": + case 1: + message.status = 1; + break; + case "POSE_BANNED": + case 2: + message.status = 2; + break; + case "REMOVED": + case 3: + message.status = 3; + break; + case "OPERATOR_KEY_CHANGED": + case 4: + message.status = 4; + break; + case "PROTX_IP_CHANGED": + case 5: + message.status = 5; + break; + case "READY": + case 6: + message.status = 6; + break; + case "ERROR": + case 7: + message.status = 7; + break; + } + if (object.proTxHash != null) + if (typeof object.proTxHash === "string") + $util.base64.decode(object.proTxHash, message.proTxHash = $util.newBuffer($util.base64.length(object.proTxHash)), 0); + else if (object.proTxHash.length >= 0) + message.proTxHash = object.proTxHash; + if (object.posePenalty != null) + message.posePenalty = object.posePenalty >>> 0; + if (object.isSynced != null) + message.isSynced = Boolean(object.isSynced); + if (object.syncProgress != null) + message.syncProgress = Number(object.syncProgress); + return message; + }; + + /** + * Creates a plain object from a GetMasternodeStatusResponse message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetMasternodeStatusResponse + * @static + * @param {org.dash.platform.dapi.v0.GetMasternodeStatusResponse} message GetMasternodeStatusResponse + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + GetMasternodeStatusResponse.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.status = options.enums === String ? "UNKNOWN" : 0; + if (options.bytes === String) + object.proTxHash = ""; + else { + object.proTxHash = []; + if (options.bytes !== Array) + object.proTxHash = $util.newBuffer(object.proTxHash); + } + object.posePenalty = 0; + object.isSynced = false; + object.syncProgress = 0; + } + if (message.status != null && message.hasOwnProperty("status")) + object.status = options.enums === String ? $root.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.Status[message.status] : message.status; + if (message.proTxHash != null && message.hasOwnProperty("proTxHash")) + object.proTxHash = options.bytes === String ? $util.base64.encode(message.proTxHash, 0, message.proTxHash.length) : options.bytes === Array ? Array.prototype.slice.call(message.proTxHash) : message.proTxHash; + if (message.posePenalty != null && message.hasOwnProperty("posePenalty")) + object.posePenalty = message.posePenalty; + if (message.isSynced != null && message.hasOwnProperty("isSynced")) + object.isSynced = message.isSynced; + if (message.syncProgress != null && message.hasOwnProperty("syncProgress")) + object.syncProgress = options.json && !isFinite(message.syncProgress) ? String(message.syncProgress) : message.syncProgress; + return object; + }; + + /** + * Converts this GetMasternodeStatusResponse to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetMasternodeStatusResponse + * @instance + * @returns {Object.} JSON object + */ + GetMasternodeStatusResponse.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Status enum. + * @name org.dash.platform.dapi.v0.GetMasternodeStatusResponse.Status + * @enum {number} + * @property {number} UNKNOWN=0 UNKNOWN value + * @property {number} WAITING_FOR_PROTX=1 WAITING_FOR_PROTX value + * @property {number} POSE_BANNED=2 POSE_BANNED value + * @property {number} REMOVED=3 REMOVED value + * @property {number} OPERATOR_KEY_CHANGED=4 OPERATOR_KEY_CHANGED value + * @property {number} PROTX_IP_CHANGED=5 PROTX_IP_CHANGED value + * @property {number} READY=6 READY value + * @property {number} ERROR=7 ERROR value + */ + GetMasternodeStatusResponse.Status = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "UNKNOWN"] = 0; + values[valuesById[1] = "WAITING_FOR_PROTX"] = 1; + values[valuesById[2] = "POSE_BANNED"] = 2; + values[valuesById[3] = "REMOVED"] = 3; + values[valuesById[4] = "OPERATOR_KEY_CHANGED"] = 4; + values[valuesById[5] = "PROTX_IP_CHANGED"] = 5; + values[valuesById[6] = "READY"] = 6; + values[valuesById[7] = "ERROR"] = 7; + return values; + })(); + + return GetMasternodeStatusResponse; })(); v0.GetBlockRequest = (function() { diff --git a/packages/dapi-grpc/clients/core/v0/nodejs/core_protoc.js b/packages/dapi-grpc/clients/core/v0/nodejs/core_protoc.js index ae974b2f81..05e280fbf3 100644 --- a/packages/dapi-grpc/clients/core/v0/nodejs/core_protoc.js +++ b/packages/dapi-grpc/clients/core/v0/nodejs/core_protoc.js @@ -26,18 +26,19 @@ goog.exportSymbol('proto.org.dash.platform.dapi.v0.BroadcastTransactionResponse' goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetBlockRequest', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetBlockRequest.BlockCase', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetBlockResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetBlockchainStatusRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Status', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetEstimatedTransactionFeeRequest', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetEstimatedTransactionFeeResponse', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusRequest', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.Status', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Network', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Status', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Time', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Version', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetMasternodeStatusRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.Status', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTransactionRequest', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTransactionResponse', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.InstantSendLockMessages', null, { proto }); @@ -56,16 +57,16 @@ goog.exportSymbol('proto.org.dash.platform.dapi.v0.TransactionsWithProofsRespons * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetStatusRequest = function(opt_data) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusRequest = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetStatusRequest, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetBlockchainStatusRequest, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetStatusRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetStatusRequest'; + proto.org.dash.platform.dapi.v0.GetBlockchainStatusRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetBlockchainStatusRequest'; } /** * Generated by JsPbCodeGenerator. @@ -77,16 +78,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetStatusResponse = function(opt_data) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetStatusResponse, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetStatusResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetStatusResponse'; + proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse'; } /** * Generated by JsPbCodeGenerator. @@ -98,16 +99,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Version = function(opt_data) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetStatusResponse.Version, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.displayName = 'proto.org.dash.platform.dapi.v0.GetStatusResponse.Version'; + proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version.displayName = 'proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version'; } /** * Generated by JsPbCodeGenerator. @@ -119,16 +120,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Time = function(opt_data) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetStatusResponse.Time, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.displayName = 'proto.org.dash.platform.dapi.v0.GetStatusResponse.Time'; + proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time.displayName = 'proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time'; } /** * Generated by JsPbCodeGenerator. @@ -140,16 +141,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain = function(opt_data) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.displayName = 'proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain'; + proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.displayName = 'proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain'; } /** * Generated by JsPbCodeGenerator. @@ -161,16 +162,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode = function(opt_data) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.displayName = 'proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode'; + proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee.displayName = 'proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee'; } /** * Generated by JsPbCodeGenerator. @@ -182,16 +183,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee = function(opt_data) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.displayName = 'proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee'; + proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network.displayName = 'proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network'; } /** * Generated by JsPbCodeGenerator. @@ -203,16 +204,37 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Network = function(opt_data) { +proto.org.dash.platform.dapi.v0.GetMasternodeStatusRequest = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetStatusResponse.Network, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetMasternodeStatusRequest, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetStatusResponse.Network.displayName = 'proto.org.dash.platform.dapi.v0.GetStatusResponse.Network'; + proto.org.dash.platform.dapi.v0.GetMasternodeStatusRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetMasternodeStatusRequest'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse'; } /** * Generated by JsPbCodeGenerator. @@ -566,8 +588,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetStatusRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetBlockchainStatusRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetBlockchainStatusRequest.toObject(opt_includeInstance, this); }; @@ -576,11 +598,11 @@ proto.org.dash.platform.dapi.v0.GetStatusRequest.prototype.toObject = function(o * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetStatusRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusRequest.toObject = function(includeInstance, msg) { var f, obj = { }; @@ -596,23 +618,23 @@ proto.org.dash.platform.dapi.v0.GetStatusRequest.toObject = function(includeInst /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusRequest} */ -proto.org.dash.platform.dapi.v0.GetStatusRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetStatusRequest; - return proto.org.dash.platform.dapi.v0.GetStatusRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetBlockchainStatusRequest; + return proto.org.dash.platform.dapi.v0.GetBlockchainStatusRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusRequest} */ -proto.org.dash.platform.dapi.v0.GetStatusRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -632,9 +654,9 @@ proto.org.dash.platform.dapi.v0.GetStatusRequest.deserializeBinaryFromReader = f * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetStatusRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetBlockchainStatusRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -642,11 +664,11 @@ proto.org.dash.platform.dapi.v0.GetStatusRequest.prototype.serializeBinary = fun /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; }; @@ -667,8 +689,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetStatusResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.toObject(opt_includeInstance, this); }; @@ -677,19 +699,18 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.toObject = function( * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.toObject = function(includeInstance, msg) { var f, obj = { - version: (f = msg.getVersion()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.toObject(includeInstance, f), - time: (f = msg.getTime()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.toObject(includeInstance, f), + version: (f = msg.getVersion()) && proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version.toObject(includeInstance, f), + time: (f = msg.getTime()) && proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time.toObject(includeInstance, f), status: jspb.Message.getFieldWithDefault(msg, 3, 0), syncProgress: jspb.Message.getFloatingPointFieldWithDefault(msg, 4, 0.0), - chain: (f = msg.getChain()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.toObject(includeInstance, f), - masternode: (f = msg.getMasternode()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.toObject(includeInstance, f), - network: (f = msg.getNetwork()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.Network.toObject(includeInstance, f) + chain: (f = msg.getChain()) && proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.toObject(includeInstance, f), + network: (f = msg.getNetwork()) && proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network.toObject(includeInstance, f) }; if (includeInstance) { @@ -703,23 +724,23 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.toObject = function(includeIns /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse; - return proto.org.dash.platform.dapi.v0.GetStatusResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse; + return proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -727,17 +748,17 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.deserializeBinaryFromReader = var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.Version; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version.deserializeBinaryFromReader); msg.setVersion(value); break; case 2: - var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.Time; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time.deserializeBinaryFromReader); msg.setTime(value); break; case 3: - var value = /** @type {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Status} */ (reader.readEnum()); + var value = /** @type {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Status} */ (reader.readEnum()); msg.setStatus(value); break; case 4: @@ -745,18 +766,13 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.deserializeBinaryFromReader = msg.setSyncProgress(value); break; case 5: - var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.deserializeBinaryFromReader); msg.setChain(value); break; - case 6: - var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.deserializeBinaryFromReader); - msg.setMasternode(value); - break; case 7: - var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.Network; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.Network.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network.deserializeBinaryFromReader); msg.setNetwork(value); break; default: @@ -772,9 +788,9 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.deserializeBinaryFromReader = * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetStatusResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -782,18 +798,18 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.serializeBinary = fu /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getVersion(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version.serializeBinaryToWriter ); } f = message.getTime(); @@ -801,7 +817,7 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.serializeBinaryToWriter = func writer.writeMessage( 2, f, - proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time.serializeBinaryToWriter ); } f = message.getStatus(); @@ -823,15 +839,7 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.serializeBinaryToWriter = func writer.writeMessage( 5, f, - proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.serializeBinaryToWriter - ); - } - f = message.getMasternode(); - if (f != null) { - writer.writeMessage( - 6, - f, - proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.serializeBinaryToWriter ); } f = message.getNetwork(); @@ -839,7 +847,7 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.serializeBinaryToWriter = func writer.writeMessage( 7, f, - proto.org.dash.platform.dapi.v0.GetStatusResponse.Network.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network.serializeBinaryToWriter ); } }; @@ -848,7 +856,7 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.serializeBinaryToWriter = func /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Status = { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Status = { NOT_STARTED: 0, SYNCING: 1, READY: 2, @@ -871,8 +879,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version.toObject(opt_includeInstance, this); }; @@ -881,11 +889,11 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.prototype.toObject = f * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Version} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version.toObject = function(includeInstance, msg) { var f, obj = { protocol: jspb.Message.getFieldWithDefault(msg, 1, 0), software: jspb.Message.getFieldWithDefault(msg, 2, 0), @@ -903,23 +911,23 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.toObject = function(in /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Version} + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.Version; - return proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version; + return proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Version} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Version} + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -951,9 +959,9 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.deserializeBinaryFromR * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -961,11 +969,11 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.prototype.serializeBin /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Version} message + * @param {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getProtocol(); if (f !== 0) { @@ -995,16 +1003,16 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.serializeBinaryToWrite * optional uint32 protocol = 1; * @return {number} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.prototype.getProtocol = function() { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version.prototype.getProtocol = function() { return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); }; /** * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Version} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.prototype.setProtocol = function(value) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version.prototype.setProtocol = function(value) { return jspb.Message.setProto3IntField(this, 1, value); }; @@ -1013,16 +1021,16 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.prototype.setProtocol * optional uint32 software = 2; * @return {number} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.prototype.getSoftware = function() { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version.prototype.getSoftware = function() { return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); }; /** * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Version} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.prototype.setSoftware = function(value) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version.prototype.setSoftware = function(value) { return jspb.Message.setProto3IntField(this, 2, value); }; @@ -1031,16 +1039,16 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.prototype.setSoftware * optional string agent = 3; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.prototype.getAgent = function() { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version.prototype.getAgent = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); }; /** * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Version} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.prototype.setAgent = function(value) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version.prototype.setAgent = function(value) { return jspb.Message.setProto3StringField(this, 3, value); }; @@ -1061,8 +1069,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time.toObject(opt_includeInstance, this); }; @@ -1071,11 +1079,11 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.prototype.toObject = func * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Time} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time.toObject = function(includeInstance, msg) { var f, obj = { now: jspb.Message.getFieldWithDefault(msg, 1, 0), offset: jspb.Message.getFieldWithDefault(msg, 2, 0), @@ -1093,23 +1101,23 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.toObject = function(inclu /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Time} + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.Time; - return proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time; + return proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Time} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Time} + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -1141,9 +1149,9 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.deserializeBinaryFromRead * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -1151,11 +1159,11 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.prototype.serializeBinary /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Time} message + * @param {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getNow(); if (f !== 0) { @@ -1185,16 +1193,16 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.serializeBinaryToWriter = * optional uint32 now = 1; * @return {number} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.prototype.getNow = function() { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time.prototype.getNow = function() { return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); }; /** * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Time} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.prototype.setNow = function(value) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time.prototype.setNow = function(value) { return jspb.Message.setProto3IntField(this, 1, value); }; @@ -1203,16 +1211,16 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.prototype.setNow = functi * optional int32 offset = 2; * @return {number} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.prototype.getOffset = function() { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time.prototype.getOffset = function() { return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); }; /** * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Time} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.prototype.setOffset = function(value) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time.prototype.setOffset = function(value) { return jspb.Message.setProto3IntField(this, 2, value); }; @@ -1221,16 +1229,16 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.prototype.setOffset = fun * optional uint32 median = 3; * @return {number} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.prototype.getMedian = function() { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time.prototype.getMedian = function() { return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); }; /** * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Time} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.prototype.setMedian = function(value) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time.prototype.setMedian = function(value) { return jspb.Message.setProto3IntField(this, 3, value); }; @@ -1251,8 +1259,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.toObject(opt_includeInstance, this); }; @@ -1261,11 +1269,11 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.toObject = fun * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.toObject = function(includeInstance, msg) { var f, obj = { name: jspb.Message.getFieldWithDefault(msg, 1, ""), headersCount: jspb.Message.getFieldWithDefault(msg, 2, 0), @@ -1288,23 +1296,23 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.toObject = function(incl /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain} + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain; - return proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain; + return proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain} + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -1356,9 +1364,9 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.deserializeBinaryFromRea * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -1366,11 +1374,11 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.serializeBinar /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain} message + * @param {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getName(); if (f.length > 0) { @@ -1435,16 +1443,16 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.serializeBinaryToWriter * optional string name = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.getName = function() { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.prototype.getName = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.setName = function(value) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.prototype.setName = function(value) { return jspb.Message.setProto3StringField(this, 1, value); }; @@ -1453,16 +1461,16 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.setName = func * optional uint32 headers_count = 2; * @return {number} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.getHeadersCount = function() { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.prototype.getHeadersCount = function() { return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); }; /** * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.setHeadersCount = function(value) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.prototype.setHeadersCount = function(value) { return jspb.Message.setProto3IntField(this, 2, value); }; @@ -1471,16 +1479,16 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.setHeadersCoun * optional uint32 blocks_count = 3; * @return {number} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.getBlocksCount = function() { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.prototype.getBlocksCount = function() { return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); }; /** * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.setBlocksCount = function(value) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.prototype.setBlocksCount = function(value) { return jspb.Message.setProto3IntField(this, 3, value); }; @@ -1489,7 +1497,7 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.setBlocksCount * optional bytes best_block_hash = 4; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.getBestBlockHash = function() { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.prototype.getBestBlockHash = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); }; @@ -1499,7 +1507,7 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.getBestBlockHa * This is a type-conversion wrapper around `getBestBlockHash()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.getBestBlockHash_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.prototype.getBestBlockHash_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( this.getBestBlockHash())); }; @@ -1512,7 +1520,7 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.getBestBlockHa * This is a type-conversion wrapper around `getBestBlockHash()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.getBestBlockHash_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.prototype.getBestBlockHash_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( this.getBestBlockHash())); }; @@ -1520,9 +1528,9 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.getBestBlockHa /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.setBestBlockHash = function(value) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.prototype.setBestBlockHash = function(value) { return jspb.Message.setProto3BytesField(this, 4, value); }; @@ -1531,16 +1539,16 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.setBestBlockHa * optional double difficulty = 5; * @return {number} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.getDifficulty = function() { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.prototype.getDifficulty = function() { return /** @type {number} */ (jspb.Message.getFloatingPointFieldWithDefault(this, 5, 0.0)); }; /** * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.setDifficulty = function(value) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.prototype.setDifficulty = function(value) { return jspb.Message.setProto3FloatField(this, 5, value); }; @@ -1549,7 +1557,7 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.setDifficulty * optional bytes chain_work = 6; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.getChainWork = function() { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.prototype.getChainWork = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 6, "")); }; @@ -1559,7 +1567,7 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.getChainWork = * This is a type-conversion wrapper around `getChainWork()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.getChainWork_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.prototype.getChainWork_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( this.getChainWork())); }; @@ -1572,7 +1580,7 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.getChainWork_a * This is a type-conversion wrapper around `getChainWork()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.getChainWork_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.prototype.getChainWork_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( this.getChainWork())); }; @@ -1580,9 +1588,9 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.getChainWork_a /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.setChainWork = function(value) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.prototype.setChainWork = function(value) { return jspb.Message.setProto3BytesField(this, 6, value); }; @@ -1591,16 +1599,16 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.setChainWork = * optional bool is_synced = 7; * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.getIsSynced = function() { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.prototype.getIsSynced = function() { return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 7, false)); }; /** * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.setIsSynced = function(value) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.prototype.setIsSynced = function(value) { return jspb.Message.setProto3BooleanField(this, 7, value); }; @@ -1609,16 +1617,16 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.setIsSynced = * optional double sync_progress = 8; * @return {number} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.getSyncProgress = function() { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.prototype.getSyncProgress = function() { return /** @type {number} */ (jspb.Message.getFloatingPointFieldWithDefault(this, 8, 0.0)); }; /** * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.setSyncProgress = function(value) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.prototype.setSyncProgress = function(value) { return jspb.Message.setProto3FloatField(this, 8, value); }; @@ -1639,8 +1647,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee.toObject(opt_includeInstance, this); }; @@ -1649,17 +1657,14 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.prototype.toObject * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee.toObject = function(includeInstance, msg) { var f, obj = { - status: jspb.Message.getFieldWithDefault(msg, 1, 0), - proTxHash: msg.getProTxHash_asB64(), - posePenalty: jspb.Message.getFieldWithDefault(msg, 3, 0), - isSynced: jspb.Message.getBooleanFieldWithDefault(msg, 4, false), - syncProgress: jspb.Message.getFloatingPointFieldWithDefault(msg, 5, 0.0) + relay: jspb.Message.getFloatingPointFieldWithDefault(msg, 1, 0.0), + incremental: jspb.Message.getFloatingPointFieldWithDefault(msg, 2, 0.0) }; if (includeInstance) { @@ -1673,23 +1678,23 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.toObject = function /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode} + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode; - return proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee; + return proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode} + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -1697,24 +1702,12 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.deserializeBinaryFr var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.Status} */ (reader.readEnum()); - msg.setStatus(value); + var value = /** @type {number} */ (reader.readDouble()); + msg.setRelay(value); break; case 2: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setProTxHash(value); - break; - case 3: - var value = /** @type {number} */ (reader.readUint32()); - msg.setPosePenalty(value); - break; - case 4: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setIsSynced(value); - break; - case 5: var value = /** @type {number} */ (reader.readDouble()); - msg.setSyncProgress(value); + msg.setIncremental(value); break; default: reader.skipField(); @@ -1729,9 +1722,9 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.deserializeBinaryFr * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -1739,44 +1732,23 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.prototype.serialize /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode} message + * @param {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getStatus(); + f = message.getRelay(); if (f !== 0.0) { - writer.writeEnum( + writer.writeDouble( 1, f ); } - f = message.getProTxHash_asU8(); - if (f.length > 0) { - writer.writeBytes( - 2, - f - ); - } - f = message.getPosePenalty(); - if (f !== 0) { - writer.writeUint32( - 3, - f - ); - } - f = message.getIsSynced(); - if (f) { - writer.writeBool( - 4, - f - ); - } - f = message.getSyncProgress(); + f = message.getIncremental(); if (f !== 0.0) { writer.writeDouble( - 5, + 2, f ); } @@ -1784,130 +1756,38 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.serializeBinaryToWr /** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.Status = { - UNKNOWN: 0, - WAITING_FOR_PROTX: 1, - POSE_BANNED: 2, - REMOVED: 3, - OPERATOR_KEY_CHANGED: 4, - PROTX_IP_CHANGED: 5, - READY: 6, - ERROR: 7 -}; - -/** - * optional Status status = 1; - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.Status} - */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.prototype.getStatus = function() { - return /** @type {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.Status} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); -}; - - -/** - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.Status} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode} returns this - */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.prototype.setStatus = function(value) { - return jspb.Message.setProto3EnumField(this, 1, value); -}; - - -/** - * optional bytes pro_tx_hash = 2; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.prototype.getProTxHash = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); -}; - - -/** - * optional bytes pro_tx_hash = 2; - * This is a type-conversion wrapper around `getProTxHash()` - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.prototype.getProTxHash_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getProTxHash())); -}; - - -/** - * optional bytes pro_tx_hash = 2; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getProTxHash()` - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.prototype.getProTxHash_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getProTxHash())); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode} returns this - */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.prototype.setProTxHash = function(value) { - return jspb.Message.setProto3BytesField(this, 2, value); -}; - - -/** - * optional uint32 pose_penalty = 3; + * optional double relay = 1; * @return {number} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.prototype.getPosePenalty = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee.prototype.getRelay = function() { + return /** @type {number} */ (jspb.Message.getFloatingPointFieldWithDefault(this, 1, 0.0)); }; /** * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode} returns this - */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.prototype.setPosePenalty = function(value) { - return jspb.Message.setProto3IntField(this, 3, value); -}; - - -/** - * optional bool is_synced = 4; - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.prototype.getIsSynced = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 4, false)); -}; - - -/** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.prototype.setIsSynced = function(value) { - return jspb.Message.setProto3BooleanField(this, 4, value); +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee.prototype.setRelay = function(value) { + return jspb.Message.setProto3FloatField(this, 1, value); }; /** - * optional double sync_progress = 5; + * optional double incremental = 2; * @return {number} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.prototype.getSyncProgress = function() { - return /** @type {number} */ (jspb.Message.getFloatingPointFieldWithDefault(this, 5, 0.0)); +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee.prototype.getIncremental = function() { + return /** @type {number} */ (jspb.Message.getFloatingPointFieldWithDefault(this, 2, 0.0)); }; /** * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.prototype.setSyncProgress = function(value) { - return jspb.Message.setProto3FloatField(this, 5, value); +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee.prototype.setIncremental = function(value) { + return jspb.Message.setProto3FloatField(this, 2, value); }; @@ -1927,8 +1807,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network.toObject(opt_includeInstance, this); }; @@ -1937,14 +1817,14 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.prototype.toObject * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network.toObject = function(includeInstance, msg) { var f, obj = { - relay: jspb.Message.getFloatingPointFieldWithDefault(msg, 1, 0.0), - incremental: jspb.Message.getFloatingPointFieldWithDefault(msg, 2, 0.0) + peersCount: jspb.Message.getFieldWithDefault(msg, 1, 0), + fee: (f = msg.getFee()) && proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee.toObject(includeInstance, f) }; if (includeInstance) { @@ -1958,23 +1838,23 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.toObject = function /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee} + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee; - return proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network; + return proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee} + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -1982,12 +1862,13 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.deserializeBinaryFr var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {number} */ (reader.readDouble()); - msg.setRelay(value); + var value = /** @type {number} */ (reader.readUint32()); + msg.setPeersCount(value); break; case 2: - var value = /** @type {number} */ (reader.readDouble()); - msg.setIncremental(value); + var value = new proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee.deserializeBinaryFromReader); + msg.setFee(value); break; default: reader.skipField(); @@ -2002,9 +1883,9 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.deserializeBinaryFr * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -2012,234 +1893,220 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.prototype.serialize /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee} message + * @param {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getRelay(); - if (f !== 0.0) { - writer.writeDouble( + f = message.getPeersCount(); + if (f !== 0) { + writer.writeUint32( 1, f ); } - f = message.getIncremental(); - if (f !== 0.0) { - writer.writeDouble( + f = message.getFee(); + if (f != null) { + writer.writeMessage( 2, - f + f, + proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee.serializeBinaryToWriter ); } }; /** - * optional double relay = 1; + * optional uint32 peers_count = 1; * @return {number} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.prototype.getRelay = function() { - return /** @type {number} */ (jspb.Message.getFloatingPointFieldWithDefault(this, 1, 0.0)); +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network.prototype.getPeersCount = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); }; /** * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.prototype.setRelay = function(value) { - return jspb.Message.setProto3FloatField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network.prototype.setPeersCount = function(value) { + return jspb.Message.setProto3IntField(this, 1, value); }; /** - * optional double incremental = 2; - * @return {number} + * optional NetworkFee fee = 2; + * @return {?proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.prototype.getIncremental = function() { - return /** @type {number} */ (jspb.Message.getFloatingPointFieldWithDefault(this, 2, 0.0)); +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network.prototype.getFee = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee, 2)); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee} returns this - */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.prototype.setIncremental = function(value) { - return jspb.Message.setProto3FloatField(this, 2, value); + * @param {?proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network} returns this +*/ +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network.prototype.setFee = function(value) { + return jspb.Message.setWrapperField(this, 2, value); }; +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network} returns this + */ +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network.prototype.clearFee = function() { + return this.setFee(undefined); +}; - -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Network.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetStatusResponse.Network.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network.prototype.hasFee = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Network} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * optional Version version = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Network.toObject = function(includeInstance, msg) { - var f, obj = { - peersCount: jspb.Message.getFieldWithDefault(msg, 1, 0), - fee: (f = msg.getFee()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.toObject(includeInstance, f) - }; +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.prototype.getVersion = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version, 1)); +}; - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.prototype.setVersion = function(value) { + return jspb.Message.setWrapperField(this, 1, value); }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Network} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Network.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.Network; - return proto.org.dash.platform.dapi.v0.GetStatusResponse.Network.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.prototype.clearVersion = function() { + return this.setVersion(undefined); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Network} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Network} - */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Network.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {number} */ (reader.readUint32()); - msg.setPeersCount(value); - break; - case 2: - var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.deserializeBinaryFromReader); - msg.setFee(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.prototype.hasVersion = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} + * optional Time time = 2; + * @return {?proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Network.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetStatusResponse.Network.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.prototype.getTime = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time, 2)); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Network} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * @param {?proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.prototype.setTime = function(value) { + return jspb.Message.setWrapperField(this, 2, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Network.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getPeersCount(); - if (f !== 0) { - writer.writeUint32( - 1, - f - ); - } - f = message.getFee(); - if (f != null) { - writer.writeMessage( - 2, - f, - proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.serializeBinaryToWriter - ); - } +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.prototype.clearTime = function() { + return this.setTime(undefined); }; /** - * optional uint32 peers_count = 1; + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.prototype.hasTime = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional Status status = 3; + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Status} + */ +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.prototype.getStatus = function() { + return /** @type {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Status} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Status} value + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.prototype.setStatus = function(value) { + return jspb.Message.setProto3EnumField(this, 3, value); +}; + + +/** + * optional double sync_progress = 4; * @return {number} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Network.prototype.getPeersCount = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.prototype.getSyncProgress = function() { + return /** @type {number} */ (jspb.Message.getFloatingPointFieldWithDefault(this, 4, 0.0)); }; /** * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Network} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Network.prototype.setPeersCount = function(value) { - return jspb.Message.setProto3IntField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.prototype.setSyncProgress = function(value) { + return jspb.Message.setProto3FloatField(this, 4, value); }; /** - * optional NetworkFee fee = 2; - * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee} + * optional Chain chain = 5; + * @return {?proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Network.prototype.getFee = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee, 2)); +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.prototype.getChain = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain, 5)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Network} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Network.prototype.setFee = function(value) { - return jspb.Message.setWrapperField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.prototype.setChain = function(value) { + return jspb.Message.setWrapperField(this, 5, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Network} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Network.prototype.clearFee = function() { - return this.setFee(undefined); +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.prototype.clearChain = function() { + return this.setChain(undefined); }; @@ -2247,36 +2114,36 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Network.prototype.clearFee = f * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Network.prototype.hasFee = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.prototype.hasChain = function() { + return jspb.Message.getField(this, 5) != null; }; /** - * optional Version version = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.Version} + * optional Network network = 7; + * @return {?proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.getVersion = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.Version} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.Version, 1)); +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.prototype.getNetwork = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network, 7)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.Version|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.setVersion = function(value) { - return jspb.Message.setWrapperField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.prototype.setNetwork = function(value) { + return jspb.Message.setWrapperField(this, 7, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.clearVersion = function() { - return this.setVersion(undefined); +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.prototype.clearNetwork = function() { + return this.setNetwork(undefined); }; @@ -2284,192 +2151,397 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.clearVersion = funct * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.hasVersion = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.prototype.hasNetwork = function() { + return jspb.Message.getField(this, 7) != null; }; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * optional Time time = 2; - * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.Time} + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.getTime = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.Time} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.Time, 2)); +proto.org.dash.platform.dapi.v0.GetMasternodeStatusRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetMasternodeStatusRequest.toObject(opt_includeInstance, this); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.Time|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse} returns this -*/ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.setTime = function(value) { - return jspb.Message.setWrapperField(this, 2, value); + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetMasternodeStatusRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetMasternodeStatusRequest.toObject = function(includeInstance, msg) { + var f, obj = { + + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse} returns this + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetMasternodeStatusRequest} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.clearTime = function() { - return this.setTime(undefined); +proto.org.dash.platform.dapi.v0.GetMasternodeStatusRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetMasternodeStatusRequest; + return proto.org.dash.platform.dapi.v0.GetMasternodeStatusRequest.deserializeBinaryFromReader(msg, reader); }; /** - * Returns whether this field is set. - * @return {boolean} + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetMasternodeStatusRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetMasternodeStatusRequest} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.hasTime = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetMasternodeStatusRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * optional Status status = 3; - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Status} + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.getStatus = function() { - return /** @type {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Status} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); +proto.org.dash.platform.dapi.v0.GetMasternodeStatusRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetMasternodeStatusRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Status} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse} returns this + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetMasternodeStatusRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.setStatus = function(value) { - return jspb.Message.setProto3EnumField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetMasternodeStatusRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; }; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * optional double sync_progress = 4; - * @return {number} + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.getSyncProgress = function() { - return /** @type {number} */ (jspb.Message.getFloatingPointFieldWithDefault(this, 4, 0.0)); +proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.toObject(opt_includeInstance, this); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse} returns this + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.setSyncProgress = function(value) { - return jspb.Message.setProto3FloatField(this, 4, value); +proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.toObject = function(includeInstance, msg) { + var f, obj = { + status: jspb.Message.getFieldWithDefault(msg, 1, 0), + proTxHash: msg.getProTxHash_asB64(), + posePenalty: jspb.Message.getFieldWithDefault(msg, 3, 0), + isSynced: jspb.Message.getBooleanFieldWithDefault(msg, 4, false), + syncProgress: jspb.Message.getFloatingPointFieldWithDefault(msg, 5, 0.0) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * optional Chain chain = 5; - * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain} + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.getChain = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain, 5)); +proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse; + return proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.deserializeBinaryFromReader(msg, reader); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse} returns this -*/ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.setChain = function(value) { - return jspb.Message.setWrapperField(this, 5, value); + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse} + */ +proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.Status} */ (reader.readEnum()); + msg.setStatus(value); + break; + case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setProTxHash(value); + break; + case 3: + var value = /** @type {number} */ (reader.readUint32()); + msg.setPosePenalty(value); + break; + case 4: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setIsSynced(value); + break; + case 5: + var value = /** @type {number} */ (reader.readDouble()); + msg.setSyncProgress(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse} returns this + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.clearChain = function() { - return this.setChain(undefined); +proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * Returns whether this field is set. - * @return {boolean} + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.hasChain = function() { - return jspb.Message.getField(this, 5) != null; +proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getStatus(); + if (f !== 0.0) { + writer.writeEnum( + 1, + f + ); + } + f = message.getProTxHash_asU8(); + if (f.length > 0) { + writer.writeBytes( + 2, + f + ); + } + f = message.getPosePenalty(); + if (f !== 0) { + writer.writeUint32( + 3, + f + ); + } + f = message.getIsSynced(); + if (f) { + writer.writeBool( + 4, + f + ); + } + f = message.getSyncProgress(); + if (f !== 0.0) { + writer.writeDouble( + 5, + f + ); + } }; /** - * optional Masternode masternode = 6; - * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode} + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.Status = { + UNKNOWN: 0, + WAITING_FOR_PROTX: 1, + POSE_BANNED: 2, + REMOVED: 3, + OPERATOR_KEY_CHANGED: 4, + PROTX_IP_CHANGED: 5, + READY: 6, + ERROR: 7 +}; + +/** + * optional Status status = 1; + * @return {!proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.Status} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.getMasternode = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode, 6)); +proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.prototype.getStatus = function() { + return /** @type {!proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.Status} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse} returns this -*/ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.setMasternode = function(value) { - return jspb.Message.setWrapperField(this, 6, value); + * @param {!proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.Status} value + * @return {!proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.prototype.setStatus = function(value) { + return jspb.Message.setProto3EnumField(this, 1, value); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse} returns this + * optional bytes pro_tx_hash = 2; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.clearMasternode = function() { - return this.setMasternode(undefined); +proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.prototype.getProTxHash = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** - * Returns whether this field is set. - * @return {boolean} + * optional bytes pro_tx_hash = 2; + * This is a type-conversion wrapper around `getProTxHash()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.hasMasternode = function() { - return jspb.Message.getField(this, 6) != null; +proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.prototype.getProTxHash_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getProTxHash())); }; /** - * optional Network network = 7; - * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.Network} + * optional bytes pro_tx_hash = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getProTxHash()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.getNetwork = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.Network} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.Network, 7)); +proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.prototype.getProTxHash_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getProTxHash())); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.Network|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse} returns this -*/ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.setNetwork = function(value) { - return jspb.Message.setWrapperField(this, 7, value); + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.prototype.setProTxHash = function(value) { + return jspb.Message.setProto3BytesField(this, 2, value); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse} returns this + * optional uint32 pose_penalty = 3; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.clearNetwork = function() { - return this.setNetwork(undefined); +proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.prototype.getPosePenalty = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); }; /** - * Returns whether this field is set. + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.prototype.setPosePenalty = function(value) { + return jspb.Message.setProto3IntField(this, 3, value); +}; + + +/** + * optional bool is_synced = 4; * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.hasNetwork = function() { - return jspb.Message.getField(this, 7) != null; +proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.prototype.getIsSynced = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 4, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.prototype.setIsSynced = function(value) { + return jspb.Message.setProto3BooleanField(this, 4, value); +}; + + +/** + * optional double sync_progress = 5; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.prototype.getSyncProgress = function() { + return /** @type {number} */ (jspb.Message.getFloatingPointFieldWithDefault(this, 5, 0.0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.prototype.setSyncProgress = function(value) { + return jspb.Message.setProto3FloatField(this, 5, value); }; diff --git a/packages/dapi-grpc/clients/core/v0/objective-c/Core.pbobjc.h b/packages/dapi-grpc/clients/core/v0/objective-c/Core.pbobjc.h index 7a4dec55e5..b174de2c9f 100644 --- a/packages/dapi-grpc/clients/core/v0/objective-c/Core.pbobjc.h +++ b/packages/dapi-grpc/clients/core/v0/objective-c/Core.pbobjc.h @@ -29,66 +29,65 @@ CF_EXTERN_C_BEGIN @class BlockHeaders; @class BloomFilter; -@class GetStatusResponse_Chain; -@class GetStatusResponse_Masternode; -@class GetStatusResponse_Network; -@class GetStatusResponse_NetworkFee; -@class GetStatusResponse_Time; -@class GetStatusResponse_Version; +@class GetBlockchainStatusResponse_Chain; +@class GetBlockchainStatusResponse_Network; +@class GetBlockchainStatusResponse_NetworkFee; +@class GetBlockchainStatusResponse_Time; +@class GetBlockchainStatusResponse_Version; @class InstantSendLockMessages; @class RawTransactions; NS_ASSUME_NONNULL_BEGIN -#pragma mark - Enum GetStatusResponse_Status +#pragma mark - Enum GetBlockchainStatusResponse_Status -typedef GPB_ENUM(GetStatusResponse_Status) { +typedef GPB_ENUM(GetBlockchainStatusResponse_Status) { /** * Value used if any message's field encounters a value that is not defined * by this enum. The message will also have C functions to get/set the rawValue * of the field. **/ - GetStatusResponse_Status_GPBUnrecognizedEnumeratorValue = kGPBUnrecognizedEnumeratorValue, - GetStatusResponse_Status_NotStarted = 0, - GetStatusResponse_Status_Syncing = 1, - GetStatusResponse_Status_Ready = 2, - GetStatusResponse_Status_Error = 3, + GetBlockchainStatusResponse_Status_GPBUnrecognizedEnumeratorValue = kGPBUnrecognizedEnumeratorValue, + GetBlockchainStatusResponse_Status_NotStarted = 0, + GetBlockchainStatusResponse_Status_Syncing = 1, + GetBlockchainStatusResponse_Status_Ready = 2, + GetBlockchainStatusResponse_Status_Error = 3, }; -GPBEnumDescriptor *GetStatusResponse_Status_EnumDescriptor(void); +GPBEnumDescriptor *GetBlockchainStatusResponse_Status_EnumDescriptor(void); /** * Checks to see if the given value is defined by the enum or was not known at * the time this source was generated. **/ -BOOL GetStatusResponse_Status_IsValidValue(int32_t value); +BOOL GetBlockchainStatusResponse_Status_IsValidValue(int32_t value); -#pragma mark - Enum GetStatusResponse_Masternode_Status +#pragma mark - Enum GetMasternodeStatusResponse_Status -typedef GPB_ENUM(GetStatusResponse_Masternode_Status) { +typedef GPB_ENUM(GetMasternodeStatusResponse_Status) { /** * Value used if any message's field encounters a value that is not defined * by this enum. The message will also have C functions to get/set the rawValue * of the field. **/ - GetStatusResponse_Masternode_Status_GPBUnrecognizedEnumeratorValue = kGPBUnrecognizedEnumeratorValue, - GetStatusResponse_Masternode_Status_Unknown = 0, - GetStatusResponse_Masternode_Status_WaitingForProtx = 1, - GetStatusResponse_Masternode_Status_PoseBanned = 2, - GetStatusResponse_Masternode_Status_Removed = 3, - GetStatusResponse_Masternode_Status_OperatorKeyChanged = 4, - GetStatusResponse_Masternode_Status_ProtxIpChanged = 5, - GetStatusResponse_Masternode_Status_Ready = 6, - GetStatusResponse_Masternode_Status_Error = 7, + GetMasternodeStatusResponse_Status_GPBUnrecognizedEnumeratorValue = kGPBUnrecognizedEnumeratorValue, + GetMasternodeStatusResponse_Status_Unknown = 0, + GetMasternodeStatusResponse_Status_WaitingForProtx = 1, + GetMasternodeStatusResponse_Status_PoseBanned = 2, + GetMasternodeStatusResponse_Status_Removed = 3, + GetMasternodeStatusResponse_Status_OperatorKeyChanged = 4, + GetMasternodeStatusResponse_Status_ProtxIpChanged = 5, + GetMasternodeStatusResponse_Status_Ready = 6, + GetMasternodeStatusResponse_Status_Error = 7, }; -GPBEnumDescriptor *GetStatusResponse_Masternode_Status_EnumDescriptor(void); +GPBEnumDescriptor *GetMasternodeStatusResponse_Status_EnumDescriptor(void); /** * Checks to see if the given value is defined by the enum or was not known at * the time this source was generated. **/ -BOOL GetStatusResponse_Masternode_Status_IsValidValue(int32_t value); +BOOL GetMasternodeStatusResponse_Status_IsValidValue(int32_t value); #pragma mark - CoreRoot @@ -105,73 +104,68 @@ BOOL GetStatusResponse_Masternode_Status_IsValidValue(int32_t value); GPB_FINAL @interface CoreRoot : GPBRootObject @end -#pragma mark - GetStatusRequest +#pragma mark - GetBlockchainStatusRequest -GPB_FINAL @interface GetStatusRequest : GPBMessage +GPB_FINAL @interface GetBlockchainStatusRequest : GPBMessage @end -#pragma mark - GetStatusResponse +#pragma mark - GetBlockchainStatusResponse -typedef GPB_ENUM(GetStatusResponse_FieldNumber) { - GetStatusResponse_FieldNumber_Version = 1, - GetStatusResponse_FieldNumber_Time = 2, - GetStatusResponse_FieldNumber_Status = 3, - GetStatusResponse_FieldNumber_SyncProgress = 4, - GetStatusResponse_FieldNumber_Chain = 5, - GetStatusResponse_FieldNumber_Masternode = 6, - GetStatusResponse_FieldNumber_Network = 7, +typedef GPB_ENUM(GetBlockchainStatusResponse_FieldNumber) { + GetBlockchainStatusResponse_FieldNumber_Version = 1, + GetBlockchainStatusResponse_FieldNumber_Time = 2, + GetBlockchainStatusResponse_FieldNumber_Status = 3, + GetBlockchainStatusResponse_FieldNumber_SyncProgress = 4, + GetBlockchainStatusResponse_FieldNumber_Chain = 5, + GetBlockchainStatusResponse_FieldNumber_Network = 7, }; -GPB_FINAL @interface GetStatusResponse : GPBMessage +GPB_FINAL @interface GetBlockchainStatusResponse : GPBMessage -@property(nonatomic, readwrite, strong, null_resettable) GetStatusResponse_Version *version; +@property(nonatomic, readwrite, strong, null_resettable) GetBlockchainStatusResponse_Version *version; /** Test to see if @c version has been set. */ @property(nonatomic, readwrite) BOOL hasVersion; -@property(nonatomic, readwrite, strong, null_resettable) GetStatusResponse_Time *time; +@property(nonatomic, readwrite, strong, null_resettable) GetBlockchainStatusResponse_Time *time; /** Test to see if @c time has been set. */ @property(nonatomic, readwrite) BOOL hasTime; -@property(nonatomic, readwrite) GetStatusResponse_Status status; +@property(nonatomic, readwrite) GetBlockchainStatusResponse_Status status; @property(nonatomic, readwrite) double syncProgress; -@property(nonatomic, readwrite, strong, null_resettable) GetStatusResponse_Chain *chain; +@property(nonatomic, readwrite, strong, null_resettable) GetBlockchainStatusResponse_Chain *chain; /** Test to see if @c chain has been set. */ @property(nonatomic, readwrite) BOOL hasChain; -@property(nonatomic, readwrite, strong, null_resettable) GetStatusResponse_Masternode *masternode; -/** Test to see if @c masternode has been set. */ -@property(nonatomic, readwrite) BOOL hasMasternode; - -@property(nonatomic, readwrite, strong, null_resettable) GetStatusResponse_Network *network; +@property(nonatomic, readwrite, strong, null_resettable) GetBlockchainStatusResponse_Network *network; /** Test to see if @c network has been set. */ @property(nonatomic, readwrite) BOOL hasNetwork; @end /** - * Fetches the raw value of a @c GetStatusResponse's @c status property, even + * Fetches the raw value of a @c GetBlockchainStatusResponse's @c status property, even * if the value was not defined by the enum at the time the code was generated. **/ -int32_t GetStatusResponse_Status_RawValue(GetStatusResponse *message); +int32_t GetBlockchainStatusResponse_Status_RawValue(GetBlockchainStatusResponse *message); /** - * Sets the raw value of an @c GetStatusResponse's @c status property, allowing + * Sets the raw value of an @c GetBlockchainStatusResponse's @c status property, allowing * it to be set to a value that was not defined by the enum at the time the code * was generated. **/ -void SetGetStatusResponse_Status_RawValue(GetStatusResponse *message, int32_t value); +void SetGetBlockchainStatusResponse_Status_RawValue(GetBlockchainStatusResponse *message, int32_t value); -#pragma mark - GetStatusResponse_Version +#pragma mark - GetBlockchainStatusResponse_Version -typedef GPB_ENUM(GetStatusResponse_Version_FieldNumber) { - GetStatusResponse_Version_FieldNumber_Protocol = 1, - GetStatusResponse_Version_FieldNumber_Software = 2, - GetStatusResponse_Version_FieldNumber_Agent = 3, +typedef GPB_ENUM(GetBlockchainStatusResponse_Version_FieldNumber) { + GetBlockchainStatusResponse_Version_FieldNumber_Protocol = 1, + GetBlockchainStatusResponse_Version_FieldNumber_Software = 2, + GetBlockchainStatusResponse_Version_FieldNumber_Agent = 3, }; -GPB_FINAL @interface GetStatusResponse_Version : GPBMessage +GPB_FINAL @interface GetBlockchainStatusResponse_Version : GPBMessage @property(nonatomic, readwrite) uint32_t protocol; @@ -181,15 +175,15 @@ GPB_FINAL @interface GetStatusResponse_Version : GPBMessage @end -#pragma mark - GetStatusResponse_Time +#pragma mark - GetBlockchainStatusResponse_Time -typedef GPB_ENUM(GetStatusResponse_Time_FieldNumber) { - GetStatusResponse_Time_FieldNumber_Now = 1, - GetStatusResponse_Time_FieldNumber_Offset = 2, - GetStatusResponse_Time_FieldNumber_Median = 3, +typedef GPB_ENUM(GetBlockchainStatusResponse_Time_FieldNumber) { + GetBlockchainStatusResponse_Time_FieldNumber_Now = 1, + GetBlockchainStatusResponse_Time_FieldNumber_Offset = 2, + GetBlockchainStatusResponse_Time_FieldNumber_Median = 3, }; -GPB_FINAL @interface GetStatusResponse_Time : GPBMessage +GPB_FINAL @interface GetBlockchainStatusResponse_Time : GPBMessage @property(nonatomic, readwrite) uint32_t now; @@ -199,20 +193,20 @@ GPB_FINAL @interface GetStatusResponse_Time : GPBMessage @end -#pragma mark - GetStatusResponse_Chain - -typedef GPB_ENUM(GetStatusResponse_Chain_FieldNumber) { - GetStatusResponse_Chain_FieldNumber_Name = 1, - GetStatusResponse_Chain_FieldNumber_HeadersCount = 2, - GetStatusResponse_Chain_FieldNumber_BlocksCount = 3, - GetStatusResponse_Chain_FieldNumber_BestBlockHash = 4, - GetStatusResponse_Chain_FieldNumber_Difficulty = 5, - GetStatusResponse_Chain_FieldNumber_ChainWork = 6, - GetStatusResponse_Chain_FieldNumber_IsSynced = 7, - GetStatusResponse_Chain_FieldNumber_SyncProgress = 8, +#pragma mark - GetBlockchainStatusResponse_Chain + +typedef GPB_ENUM(GetBlockchainStatusResponse_Chain_FieldNumber) { + GetBlockchainStatusResponse_Chain_FieldNumber_Name = 1, + GetBlockchainStatusResponse_Chain_FieldNumber_HeadersCount = 2, + GetBlockchainStatusResponse_Chain_FieldNumber_BlocksCount = 3, + GetBlockchainStatusResponse_Chain_FieldNumber_BestBlockHash = 4, + GetBlockchainStatusResponse_Chain_FieldNumber_Difficulty = 5, + GetBlockchainStatusResponse_Chain_FieldNumber_ChainWork = 6, + GetBlockchainStatusResponse_Chain_FieldNumber_IsSynced = 7, + GetBlockchainStatusResponse_Chain_FieldNumber_SyncProgress = 8, }; -GPB_FINAL @interface GetStatusResponse_Chain : GPBMessage +GPB_FINAL @interface GetBlockchainStatusResponse_Chain : GPBMessage @property(nonatomic, readwrite, copy, null_resettable) NSString *name; @@ -232,74 +226,80 @@ GPB_FINAL @interface GetStatusResponse_Chain : GPBMessage @end -#pragma mark - GetStatusResponse_Masternode +#pragma mark - GetBlockchainStatusResponse_NetworkFee -typedef GPB_ENUM(GetStatusResponse_Masternode_FieldNumber) { - GetStatusResponse_Masternode_FieldNumber_Status = 1, - GetStatusResponse_Masternode_FieldNumber_ProTxHash = 2, - GetStatusResponse_Masternode_FieldNumber_PosePenalty = 3, - GetStatusResponse_Masternode_FieldNumber_IsSynced = 4, - GetStatusResponse_Masternode_FieldNumber_SyncProgress = 5, +typedef GPB_ENUM(GetBlockchainStatusResponse_NetworkFee_FieldNumber) { + GetBlockchainStatusResponse_NetworkFee_FieldNumber_Relay = 1, + GetBlockchainStatusResponse_NetworkFee_FieldNumber_Incremental = 2, }; -GPB_FINAL @interface GetStatusResponse_Masternode : GPBMessage - -@property(nonatomic, readwrite) GetStatusResponse_Masternode_Status status; +GPB_FINAL @interface GetBlockchainStatusResponse_NetworkFee : GPBMessage -@property(nonatomic, readwrite, copy, null_resettable) NSData *proTxHash; +@property(nonatomic, readwrite) double relay; -@property(nonatomic, readwrite) uint32_t posePenalty; +@property(nonatomic, readwrite) double incremental; -@property(nonatomic, readwrite) BOOL isSynced; +@end -@property(nonatomic, readwrite) double syncProgress; +#pragma mark - GetBlockchainStatusResponse_Network -@end +typedef GPB_ENUM(GetBlockchainStatusResponse_Network_FieldNumber) { + GetBlockchainStatusResponse_Network_FieldNumber_PeersCount = 1, + GetBlockchainStatusResponse_Network_FieldNumber_Fee = 2, +}; -/** - * Fetches the raw value of a @c GetStatusResponse_Masternode's @c status property, even - * if the value was not defined by the enum at the time the code was generated. - **/ -int32_t GetStatusResponse_Masternode_Status_RawValue(GetStatusResponse_Masternode *message); -/** - * Sets the raw value of an @c GetStatusResponse_Masternode's @c status property, allowing - * it to be set to a value that was not defined by the enum at the time the code - * was generated. - **/ -void SetGetStatusResponse_Masternode_Status_RawValue(GetStatusResponse_Masternode *message, int32_t value); +GPB_FINAL @interface GetBlockchainStatusResponse_Network : GPBMessage -#pragma mark - GetStatusResponse_NetworkFee +@property(nonatomic, readwrite) uint32_t peersCount; -typedef GPB_ENUM(GetStatusResponse_NetworkFee_FieldNumber) { - GetStatusResponse_NetworkFee_FieldNumber_Relay = 1, - GetStatusResponse_NetworkFee_FieldNumber_Incremental = 2, -}; +@property(nonatomic, readwrite, strong, null_resettable) GetBlockchainStatusResponse_NetworkFee *fee; +/** Test to see if @c fee has been set. */ +@property(nonatomic, readwrite) BOOL hasFee; -GPB_FINAL @interface GetStatusResponse_NetworkFee : GPBMessage +@end -@property(nonatomic, readwrite) double relay; +#pragma mark - GetMasternodeStatusRequest -@property(nonatomic, readwrite) double incremental; +GPB_FINAL @interface GetMasternodeStatusRequest : GPBMessage @end -#pragma mark - GetStatusResponse_Network +#pragma mark - GetMasternodeStatusResponse -typedef GPB_ENUM(GetStatusResponse_Network_FieldNumber) { - GetStatusResponse_Network_FieldNumber_PeersCount = 1, - GetStatusResponse_Network_FieldNumber_Fee = 2, +typedef GPB_ENUM(GetMasternodeStatusResponse_FieldNumber) { + GetMasternodeStatusResponse_FieldNumber_Status = 1, + GetMasternodeStatusResponse_FieldNumber_ProTxHash = 2, + GetMasternodeStatusResponse_FieldNumber_PosePenalty = 3, + GetMasternodeStatusResponse_FieldNumber_IsSynced = 4, + GetMasternodeStatusResponse_FieldNumber_SyncProgress = 5, }; -GPB_FINAL @interface GetStatusResponse_Network : GPBMessage +GPB_FINAL @interface GetMasternodeStatusResponse : GPBMessage -@property(nonatomic, readwrite) uint32_t peersCount; +@property(nonatomic, readwrite) GetMasternodeStatusResponse_Status status; -@property(nonatomic, readwrite, strong, null_resettable) GetStatusResponse_NetworkFee *fee; -/** Test to see if @c fee has been set. */ -@property(nonatomic, readwrite) BOOL hasFee; +@property(nonatomic, readwrite, copy, null_resettable) NSData *proTxHash; + +@property(nonatomic, readwrite) uint32_t posePenalty; + +@property(nonatomic, readwrite) BOOL isSynced; + +@property(nonatomic, readwrite) double syncProgress; @end +/** + * Fetches the raw value of a @c GetMasternodeStatusResponse's @c status property, even + * if the value was not defined by the enum at the time the code was generated. + **/ +int32_t GetMasternodeStatusResponse_Status_RawValue(GetMasternodeStatusResponse *message); +/** + * Sets the raw value of an @c GetMasternodeStatusResponse's @c status property, allowing + * it to be set to a value that was not defined by the enum at the time the code + * was generated. + **/ +void SetGetMasternodeStatusResponse_Status_RawValue(GetMasternodeStatusResponse *message, int32_t value); + #pragma mark - GetBlockRequest typedef GPB_ENUM(GetBlockRequest_FieldNumber) { diff --git a/packages/dapi-grpc/clients/core/v0/objective-c/Core.pbobjc.m b/packages/dapi-grpc/clients/core/v0/objective-c/Core.pbobjc.m index 86ff51575a..95ad78b8c7 100644 --- a/packages/dapi-grpc/clients/core/v0/objective-c/Core.pbobjc.m +++ b/packages/dapi-grpc/clients/core/v0/objective-c/Core.pbobjc.m @@ -29,13 +29,12 @@ // We don't use [Foo class] because it is not a static value. GPBObjCClassDeclaration(BlockHeaders); GPBObjCClassDeclaration(BloomFilter); -GPBObjCClassDeclaration(GetStatusResponse); -GPBObjCClassDeclaration(GetStatusResponse_Chain); -GPBObjCClassDeclaration(GetStatusResponse_Masternode); -GPBObjCClassDeclaration(GetStatusResponse_Network); -GPBObjCClassDeclaration(GetStatusResponse_NetworkFee); -GPBObjCClassDeclaration(GetStatusResponse_Time); -GPBObjCClassDeclaration(GetStatusResponse_Version); +GPBObjCClassDeclaration(GetBlockchainStatusResponse); +GPBObjCClassDeclaration(GetBlockchainStatusResponse_Chain); +GPBObjCClassDeclaration(GetBlockchainStatusResponse_Network); +GPBObjCClassDeclaration(GetBlockchainStatusResponse_NetworkFee); +GPBObjCClassDeclaration(GetBlockchainStatusResponse_Time); +GPBObjCClassDeclaration(GetBlockchainStatusResponse_Version); GPBObjCClassDeclaration(InstantSendLockMessages); GPBObjCClassDeclaration(RawTransactions); @@ -62,14 +61,14 @@ @implementation CoreRoot return descriptor; } -#pragma mark - GetStatusRequest +#pragma mark - GetBlockchainStatusRequest -@implementation GetStatusRequest +@implementation GetBlockchainStatusRequest -typedef struct GetStatusRequest__storage_ { +typedef struct GetBlockchainStatusRequest__storage_ { uint32_t _has_storage_[1]; -} GetStatusRequest__storage_; +} GetBlockchainStatusRequest__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. @@ -77,12 +76,12 @@ + (GPBDescriptor *)descriptor { static GPBDescriptor *descriptor = nil; if (!descriptor) { GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetStatusRequest class] + [GPBDescriptor allocDescriptorForClass:[GetBlockchainStatusRequest class] rootClass:[CoreRoot class] file:CoreRoot_FileDescriptor() fields:NULL fieldCount:0 - storageSize:sizeof(GetStatusRequest__storage_) + storageSize:sizeof(GetBlockchainStatusRequest__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; #if defined(DEBUG) && DEBUG NSAssert(descriptor == nil, @"Startup recursed!"); @@ -94,28 +93,26 @@ + (GPBDescriptor *)descriptor { @end -#pragma mark - GetStatusResponse +#pragma mark - GetBlockchainStatusResponse -@implementation GetStatusResponse +@implementation GetBlockchainStatusResponse @dynamic hasVersion, version; @dynamic hasTime, time; @dynamic status; @dynamic syncProgress; @dynamic hasChain, chain; -@dynamic hasMasternode, masternode; @dynamic hasNetwork, network; -typedef struct GetStatusResponse__storage_ { +typedef struct GetBlockchainStatusResponse__storage_ { uint32_t _has_storage_[1]; - GetStatusResponse_Status status; - GetStatusResponse_Version *version; - GetStatusResponse_Time *time; - GetStatusResponse_Chain *chain; - GetStatusResponse_Masternode *masternode; - GetStatusResponse_Network *network; + GetBlockchainStatusResponse_Status status; + GetBlockchainStatusResponse_Version *version; + GetBlockchainStatusResponse_Time *time; + GetBlockchainStatusResponse_Chain *chain; + GetBlockchainStatusResponse_Network *network; double syncProgress; -} GetStatusResponse__storage_; +} GetBlockchainStatusResponse__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. @@ -125,75 +122,66 @@ + (GPBDescriptor *)descriptor { static GPBMessageFieldDescription fields[] = { { .name = "version", - .dataTypeSpecific.clazz = GPBObjCClass(GetStatusResponse_Version), - .number = GetStatusResponse_FieldNumber_Version, + .dataTypeSpecific.clazz = GPBObjCClass(GetBlockchainStatusResponse_Version), + .number = GetBlockchainStatusResponse_FieldNumber_Version, .hasIndex = 0, - .offset = (uint32_t)offsetof(GetStatusResponse__storage_, version), + .offset = (uint32_t)offsetof(GetBlockchainStatusResponse__storage_, version), .flags = GPBFieldOptional, .dataType = GPBDataTypeMessage, }, { .name = "time", - .dataTypeSpecific.clazz = GPBObjCClass(GetStatusResponse_Time), - .number = GetStatusResponse_FieldNumber_Time, + .dataTypeSpecific.clazz = GPBObjCClass(GetBlockchainStatusResponse_Time), + .number = GetBlockchainStatusResponse_FieldNumber_Time, .hasIndex = 1, - .offset = (uint32_t)offsetof(GetStatusResponse__storage_, time), + .offset = (uint32_t)offsetof(GetBlockchainStatusResponse__storage_, time), .flags = GPBFieldOptional, .dataType = GPBDataTypeMessage, }, { .name = "status", - .dataTypeSpecific.enumDescFunc = GetStatusResponse_Status_EnumDescriptor, - .number = GetStatusResponse_FieldNumber_Status, + .dataTypeSpecific.enumDescFunc = GetBlockchainStatusResponse_Status_EnumDescriptor, + .number = GetBlockchainStatusResponse_FieldNumber_Status, .hasIndex = 2, - .offset = (uint32_t)offsetof(GetStatusResponse__storage_, status), + .offset = (uint32_t)offsetof(GetBlockchainStatusResponse__storage_, status), .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldHasEnumDescriptor | GPBFieldClearHasIvarOnZero), .dataType = GPBDataTypeEnum, }, { .name = "syncProgress", .dataTypeSpecific.clazz = Nil, - .number = GetStatusResponse_FieldNumber_SyncProgress, + .number = GetBlockchainStatusResponse_FieldNumber_SyncProgress, .hasIndex = 3, - .offset = (uint32_t)offsetof(GetStatusResponse__storage_, syncProgress), + .offset = (uint32_t)offsetof(GetBlockchainStatusResponse__storage_, syncProgress), .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), .dataType = GPBDataTypeDouble, }, { .name = "chain", - .dataTypeSpecific.clazz = GPBObjCClass(GetStatusResponse_Chain), - .number = GetStatusResponse_FieldNumber_Chain, + .dataTypeSpecific.clazz = GPBObjCClass(GetBlockchainStatusResponse_Chain), + .number = GetBlockchainStatusResponse_FieldNumber_Chain, .hasIndex = 4, - .offset = (uint32_t)offsetof(GetStatusResponse__storage_, chain), - .flags = GPBFieldOptional, - .dataType = GPBDataTypeMessage, - }, - { - .name = "masternode", - .dataTypeSpecific.clazz = GPBObjCClass(GetStatusResponse_Masternode), - .number = GetStatusResponse_FieldNumber_Masternode, - .hasIndex = 5, - .offset = (uint32_t)offsetof(GetStatusResponse__storage_, masternode), + .offset = (uint32_t)offsetof(GetBlockchainStatusResponse__storage_, chain), .flags = GPBFieldOptional, .dataType = GPBDataTypeMessage, }, { .name = "network", - .dataTypeSpecific.clazz = GPBObjCClass(GetStatusResponse_Network), - .number = GetStatusResponse_FieldNumber_Network, - .hasIndex = 6, - .offset = (uint32_t)offsetof(GetStatusResponse__storage_, network), + .dataTypeSpecific.clazz = GPBObjCClass(GetBlockchainStatusResponse_Network), + .number = GetBlockchainStatusResponse_FieldNumber_Network, + .hasIndex = 5, + .offset = (uint32_t)offsetof(GetBlockchainStatusResponse__storage_, network), .flags = GPBFieldOptional, .dataType = GPBDataTypeMessage, }, }; GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetStatusResponse class] + [GPBDescriptor allocDescriptorForClass:[GetBlockchainStatusResponse class] rootClass:[CoreRoot class] file:CoreRoot_FileDescriptor() fields:fields fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetStatusResponse__storage_) + storageSize:sizeof(GetBlockchainStatusResponse__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; #if defined(DEBUG) && DEBUG NSAssert(descriptor == nil, @"Startup recursed!"); @@ -205,37 +193,37 @@ + (GPBDescriptor *)descriptor { @end -int32_t GetStatusResponse_Status_RawValue(GetStatusResponse *message) { - GPBDescriptor *descriptor = [GetStatusResponse descriptor]; - GPBFieldDescriptor *field = [descriptor fieldWithNumber:GetStatusResponse_FieldNumber_Status]; +int32_t GetBlockchainStatusResponse_Status_RawValue(GetBlockchainStatusResponse *message) { + GPBDescriptor *descriptor = [GetBlockchainStatusResponse descriptor]; + GPBFieldDescriptor *field = [descriptor fieldWithNumber:GetBlockchainStatusResponse_FieldNumber_Status]; return GPBGetMessageRawEnumField(message, field); } -void SetGetStatusResponse_Status_RawValue(GetStatusResponse *message, int32_t value) { - GPBDescriptor *descriptor = [GetStatusResponse descriptor]; - GPBFieldDescriptor *field = [descriptor fieldWithNumber:GetStatusResponse_FieldNumber_Status]; +void SetGetBlockchainStatusResponse_Status_RawValue(GetBlockchainStatusResponse *message, int32_t value) { + GPBDescriptor *descriptor = [GetBlockchainStatusResponse descriptor]; + GPBFieldDescriptor *field = [descriptor fieldWithNumber:GetBlockchainStatusResponse_FieldNumber_Status]; GPBSetMessageRawEnumField(message, field, value); } -#pragma mark - Enum GetStatusResponse_Status +#pragma mark - Enum GetBlockchainStatusResponse_Status -GPBEnumDescriptor *GetStatusResponse_Status_EnumDescriptor(void) { +GPBEnumDescriptor *GetBlockchainStatusResponse_Status_EnumDescriptor(void) { static _Atomic(GPBEnumDescriptor*) descriptor = nil; if (!descriptor) { static const char *valueNames = "NotStarted\000Syncing\000Ready\000Error\000"; static const int32_t values[] = { - GetStatusResponse_Status_NotStarted, - GetStatusResponse_Status_Syncing, - GetStatusResponse_Status_Ready, - GetStatusResponse_Status_Error, + GetBlockchainStatusResponse_Status_NotStarted, + GetBlockchainStatusResponse_Status_Syncing, + GetBlockchainStatusResponse_Status_Ready, + GetBlockchainStatusResponse_Status_Error, }; GPBEnumDescriptor *worker = - [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol(GetStatusResponse_Status) + [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol(GetBlockchainStatusResponse_Status) valueNames:valueNames values:values count:(uint32_t)(sizeof(values) / sizeof(int32_t)) - enumVerifier:GetStatusResponse_Status_IsValidValue]; + enumVerifier:GetBlockchainStatusResponse_Status_IsValidValue]; GPBEnumDescriptor *expected = nil; if (!atomic_compare_exchange_strong(&descriptor, &expected, worker)) { [worker release]; @@ -244,32 +232,32 @@ void SetGetStatusResponse_Status_RawValue(GetStatusResponse *message, int32_t va return descriptor; } -BOOL GetStatusResponse_Status_IsValidValue(int32_t value__) { +BOOL GetBlockchainStatusResponse_Status_IsValidValue(int32_t value__) { switch (value__) { - case GetStatusResponse_Status_NotStarted: - case GetStatusResponse_Status_Syncing: - case GetStatusResponse_Status_Ready: - case GetStatusResponse_Status_Error: + case GetBlockchainStatusResponse_Status_NotStarted: + case GetBlockchainStatusResponse_Status_Syncing: + case GetBlockchainStatusResponse_Status_Ready: + case GetBlockchainStatusResponse_Status_Error: return YES; default: return NO; } } -#pragma mark - GetStatusResponse_Version +#pragma mark - GetBlockchainStatusResponse_Version -@implementation GetStatusResponse_Version +@implementation GetBlockchainStatusResponse_Version @dynamic protocol; @dynamic software; @dynamic agent; -typedef struct GetStatusResponse_Version__storage_ { +typedef struct GetBlockchainStatusResponse_Version__storage_ { uint32_t _has_storage_[1]; uint32_t protocol; uint32_t software; NSString *agent; -} GetStatusResponse_Version__storage_; +} GetBlockchainStatusResponse_Version__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. @@ -280,40 +268,40 @@ + (GPBDescriptor *)descriptor { { .name = "protocol", .dataTypeSpecific.clazz = Nil, - .number = GetStatusResponse_Version_FieldNumber_Protocol, + .number = GetBlockchainStatusResponse_Version_FieldNumber_Protocol, .hasIndex = 0, - .offset = (uint32_t)offsetof(GetStatusResponse_Version__storage_, protocol), + .offset = (uint32_t)offsetof(GetBlockchainStatusResponse_Version__storage_, protocol), .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), .dataType = GPBDataTypeUInt32, }, { .name = "software", .dataTypeSpecific.clazz = Nil, - .number = GetStatusResponse_Version_FieldNumber_Software, + .number = GetBlockchainStatusResponse_Version_FieldNumber_Software, .hasIndex = 1, - .offset = (uint32_t)offsetof(GetStatusResponse_Version__storage_, software), + .offset = (uint32_t)offsetof(GetBlockchainStatusResponse_Version__storage_, software), .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), .dataType = GPBDataTypeUInt32, }, { .name = "agent", .dataTypeSpecific.clazz = Nil, - .number = GetStatusResponse_Version_FieldNumber_Agent, + .number = GetBlockchainStatusResponse_Version_FieldNumber_Agent, .hasIndex = 2, - .offset = (uint32_t)offsetof(GetStatusResponse_Version__storage_, agent), + .offset = (uint32_t)offsetof(GetBlockchainStatusResponse_Version__storage_, agent), .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), .dataType = GPBDataTypeString, }, }; GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetStatusResponse_Version class] + [GPBDescriptor allocDescriptorForClass:[GetBlockchainStatusResponse_Version class] rootClass:[CoreRoot class] file:CoreRoot_FileDescriptor() fields:fields fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetStatusResponse_Version__storage_) + storageSize:sizeof(GetBlockchainStatusResponse_Version__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; - [localDescriptor setupContainingMessageClass:GPBObjCClass(GetStatusResponse)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetBlockchainStatusResponse)]; #if defined(DEBUG) && DEBUG NSAssert(descriptor == nil, @"Startup recursed!"); #endif // DEBUG @@ -324,20 +312,20 @@ + (GPBDescriptor *)descriptor { @end -#pragma mark - GetStatusResponse_Time +#pragma mark - GetBlockchainStatusResponse_Time -@implementation GetStatusResponse_Time +@implementation GetBlockchainStatusResponse_Time @dynamic now; @dynamic offset; @dynamic median; -typedef struct GetStatusResponse_Time__storage_ { +typedef struct GetBlockchainStatusResponse_Time__storage_ { uint32_t _has_storage_[1]; uint32_t now; int32_t offset; uint32_t median; -} GetStatusResponse_Time__storage_; +} GetBlockchainStatusResponse_Time__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. @@ -348,40 +336,40 @@ + (GPBDescriptor *)descriptor { { .name = "now", .dataTypeSpecific.clazz = Nil, - .number = GetStatusResponse_Time_FieldNumber_Now, + .number = GetBlockchainStatusResponse_Time_FieldNumber_Now, .hasIndex = 0, - .offset = (uint32_t)offsetof(GetStatusResponse_Time__storage_, now), + .offset = (uint32_t)offsetof(GetBlockchainStatusResponse_Time__storage_, now), .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), .dataType = GPBDataTypeUInt32, }, { .name = "offset", .dataTypeSpecific.clazz = Nil, - .number = GetStatusResponse_Time_FieldNumber_Offset, + .number = GetBlockchainStatusResponse_Time_FieldNumber_Offset, .hasIndex = 1, - .offset = (uint32_t)offsetof(GetStatusResponse_Time__storage_, offset), + .offset = (uint32_t)offsetof(GetBlockchainStatusResponse_Time__storage_, offset), .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), .dataType = GPBDataTypeInt32, }, { .name = "median", .dataTypeSpecific.clazz = Nil, - .number = GetStatusResponse_Time_FieldNumber_Median, + .number = GetBlockchainStatusResponse_Time_FieldNumber_Median, .hasIndex = 2, - .offset = (uint32_t)offsetof(GetStatusResponse_Time__storage_, median), + .offset = (uint32_t)offsetof(GetBlockchainStatusResponse_Time__storage_, median), .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), .dataType = GPBDataTypeUInt32, }, }; GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetStatusResponse_Time class] + [GPBDescriptor allocDescriptorForClass:[GetBlockchainStatusResponse_Time class] rootClass:[CoreRoot class] file:CoreRoot_FileDescriptor() fields:fields fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetStatusResponse_Time__storage_) + storageSize:sizeof(GetBlockchainStatusResponse_Time__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; - [localDescriptor setupContainingMessageClass:GPBObjCClass(GetStatusResponse)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetBlockchainStatusResponse)]; #if defined(DEBUG) && DEBUG NSAssert(descriptor == nil, @"Startup recursed!"); #endif // DEBUG @@ -392,9 +380,9 @@ + (GPBDescriptor *)descriptor { @end -#pragma mark - GetStatusResponse_Chain +#pragma mark - GetBlockchainStatusResponse_Chain -@implementation GetStatusResponse_Chain +@implementation GetBlockchainStatusResponse_Chain @dynamic name; @dynamic headersCount; @@ -405,7 +393,7 @@ @implementation GetStatusResponse_Chain @dynamic isSynced; @dynamic syncProgress; -typedef struct GetStatusResponse_Chain__storage_ { +typedef struct GetBlockchainStatusResponse_Chain__storage_ { uint32_t _has_storage_[1]; uint32_t headersCount; uint32_t blocksCount; @@ -414,7 +402,7 @@ @implementation GetStatusResponse_Chain NSData *chainWork; double difficulty; double syncProgress; -} GetStatusResponse_Chain__storage_; +} GetBlockchainStatusResponse_Chain__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. @@ -425,61 +413,61 @@ + (GPBDescriptor *)descriptor { { .name = "name", .dataTypeSpecific.clazz = Nil, - .number = GetStatusResponse_Chain_FieldNumber_Name, + .number = GetBlockchainStatusResponse_Chain_FieldNumber_Name, .hasIndex = 0, - .offset = (uint32_t)offsetof(GetStatusResponse_Chain__storage_, name), + .offset = (uint32_t)offsetof(GetBlockchainStatusResponse_Chain__storage_, name), .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), .dataType = GPBDataTypeString, }, { .name = "headersCount", .dataTypeSpecific.clazz = Nil, - .number = GetStatusResponse_Chain_FieldNumber_HeadersCount, + .number = GetBlockchainStatusResponse_Chain_FieldNumber_HeadersCount, .hasIndex = 1, - .offset = (uint32_t)offsetof(GetStatusResponse_Chain__storage_, headersCount), + .offset = (uint32_t)offsetof(GetBlockchainStatusResponse_Chain__storage_, headersCount), .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), .dataType = GPBDataTypeUInt32, }, { .name = "blocksCount", .dataTypeSpecific.clazz = Nil, - .number = GetStatusResponse_Chain_FieldNumber_BlocksCount, + .number = GetBlockchainStatusResponse_Chain_FieldNumber_BlocksCount, .hasIndex = 2, - .offset = (uint32_t)offsetof(GetStatusResponse_Chain__storage_, blocksCount), + .offset = (uint32_t)offsetof(GetBlockchainStatusResponse_Chain__storage_, blocksCount), .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), .dataType = GPBDataTypeUInt32, }, { .name = "bestBlockHash", .dataTypeSpecific.clazz = Nil, - .number = GetStatusResponse_Chain_FieldNumber_BestBlockHash, + .number = GetBlockchainStatusResponse_Chain_FieldNumber_BestBlockHash, .hasIndex = 3, - .offset = (uint32_t)offsetof(GetStatusResponse_Chain__storage_, bestBlockHash), + .offset = (uint32_t)offsetof(GetBlockchainStatusResponse_Chain__storage_, bestBlockHash), .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), .dataType = GPBDataTypeBytes, }, { .name = "difficulty", .dataTypeSpecific.clazz = Nil, - .number = GetStatusResponse_Chain_FieldNumber_Difficulty, + .number = GetBlockchainStatusResponse_Chain_FieldNumber_Difficulty, .hasIndex = 4, - .offset = (uint32_t)offsetof(GetStatusResponse_Chain__storage_, difficulty), + .offset = (uint32_t)offsetof(GetBlockchainStatusResponse_Chain__storage_, difficulty), .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), .dataType = GPBDataTypeDouble, }, { .name = "chainWork", .dataTypeSpecific.clazz = Nil, - .number = GetStatusResponse_Chain_FieldNumber_ChainWork, + .number = GetBlockchainStatusResponse_Chain_FieldNumber_ChainWork, .hasIndex = 5, - .offset = (uint32_t)offsetof(GetStatusResponse_Chain__storage_, chainWork), + .offset = (uint32_t)offsetof(GetBlockchainStatusResponse_Chain__storage_, chainWork), .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), .dataType = GPBDataTypeBytes, }, { .name = "isSynced", .dataTypeSpecific.clazz = Nil, - .number = GetStatusResponse_Chain_FieldNumber_IsSynced, + .number = GetBlockchainStatusResponse_Chain_FieldNumber_IsSynced, .hasIndex = 6, .offset = 7, // Stored in _has_storage_ to save space. .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), @@ -488,22 +476,22 @@ + (GPBDescriptor *)descriptor { { .name = "syncProgress", .dataTypeSpecific.clazz = Nil, - .number = GetStatusResponse_Chain_FieldNumber_SyncProgress, + .number = GetBlockchainStatusResponse_Chain_FieldNumber_SyncProgress, .hasIndex = 8, - .offset = (uint32_t)offsetof(GetStatusResponse_Chain__storage_, syncProgress), + .offset = (uint32_t)offsetof(GetBlockchainStatusResponse_Chain__storage_, syncProgress), .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), .dataType = GPBDataTypeDouble, }, }; GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetStatusResponse_Chain class] + [GPBDescriptor allocDescriptorForClass:[GetBlockchainStatusResponse_Chain class] rootClass:[CoreRoot class] file:CoreRoot_FileDescriptor() fields:fields fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetStatusResponse_Chain__storage_) + storageSize:sizeof(GetBlockchainStatusResponse_Chain__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; - [localDescriptor setupContainingMessageClass:GPBObjCClass(GetStatusResponse)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetBlockchainStatusResponse)]; #if defined(DEBUG) && DEBUG NSAssert(descriptor == nil, @"Startup recursed!"); #endif // DEBUG @@ -514,23 +502,18 @@ + (GPBDescriptor *)descriptor { @end -#pragma mark - GetStatusResponse_Masternode +#pragma mark - GetBlockchainStatusResponse_NetworkFee -@implementation GetStatusResponse_Masternode +@implementation GetBlockchainStatusResponse_NetworkFee -@dynamic status; -@dynamic proTxHash; -@dynamic posePenalty; -@dynamic isSynced; -@dynamic syncProgress; +@dynamic relay; +@dynamic incremental; -typedef struct GetStatusResponse_Masternode__storage_ { +typedef struct GetBlockchainStatusResponse_NetworkFee__storage_ { uint32_t _has_storage_[1]; - GetStatusResponse_Masternode_Status status; - uint32_t posePenalty; - NSData *proTxHash; - double syncProgress; -} GetStatusResponse_Masternode__storage_; + double relay; + double incremental; +} GetBlockchainStatusResponse_NetworkFee__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. @@ -539,60 +522,33 @@ + (GPBDescriptor *)descriptor { if (!descriptor) { static GPBMessageFieldDescription fields[] = { { - .name = "status", - .dataTypeSpecific.enumDescFunc = GetStatusResponse_Masternode_Status_EnumDescriptor, - .number = GetStatusResponse_Masternode_FieldNumber_Status, - .hasIndex = 0, - .offset = (uint32_t)offsetof(GetStatusResponse_Masternode__storage_, status), - .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldHasEnumDescriptor | GPBFieldClearHasIvarOnZero), - .dataType = GPBDataTypeEnum, - }, - { - .name = "proTxHash", - .dataTypeSpecific.clazz = Nil, - .number = GetStatusResponse_Masternode_FieldNumber_ProTxHash, - .hasIndex = 1, - .offset = (uint32_t)offsetof(GetStatusResponse_Masternode__storage_, proTxHash), - .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), - .dataType = GPBDataTypeBytes, - }, - { - .name = "posePenalty", - .dataTypeSpecific.clazz = Nil, - .number = GetStatusResponse_Masternode_FieldNumber_PosePenalty, - .hasIndex = 2, - .offset = (uint32_t)offsetof(GetStatusResponse_Masternode__storage_, posePenalty), - .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), - .dataType = GPBDataTypeUInt32, - }, - { - .name = "isSynced", + .name = "relay", .dataTypeSpecific.clazz = Nil, - .number = GetStatusResponse_Masternode_FieldNumber_IsSynced, - .hasIndex = 3, - .offset = 4, // Stored in _has_storage_ to save space. + .number = GetBlockchainStatusResponse_NetworkFee_FieldNumber_Relay, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetBlockchainStatusResponse_NetworkFee__storage_, relay), .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), - .dataType = GPBDataTypeBool, + .dataType = GPBDataTypeDouble, }, { - .name = "syncProgress", + .name = "incremental", .dataTypeSpecific.clazz = Nil, - .number = GetStatusResponse_Masternode_FieldNumber_SyncProgress, - .hasIndex = 5, - .offset = (uint32_t)offsetof(GetStatusResponse_Masternode__storage_, syncProgress), + .number = GetBlockchainStatusResponse_NetworkFee_FieldNumber_Incremental, + .hasIndex = 1, + .offset = (uint32_t)offsetof(GetBlockchainStatusResponse_NetworkFee__storage_, incremental), .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), .dataType = GPBDataTypeDouble, }, }; GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetStatusResponse_Masternode class] + [GPBDescriptor allocDescriptorForClass:[GetBlockchainStatusResponse_NetworkFee class] rootClass:[CoreRoot class] file:CoreRoot_FileDescriptor() fields:fields fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetStatusResponse_Masternode__storage_) + storageSize:sizeof(GetBlockchainStatusResponse_NetworkFee__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; - [localDescriptor setupContainingMessageClass:GPBObjCClass(GetStatusResponse)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetBlockchainStatusResponse)]; #if defined(DEBUG) && DEBUG NSAssert(descriptor == nil, @"Startup recursed!"); #endif // DEBUG @@ -603,79 +559,18 @@ + (GPBDescriptor *)descriptor { @end -int32_t GetStatusResponse_Masternode_Status_RawValue(GetStatusResponse_Masternode *message) { - GPBDescriptor *descriptor = [GetStatusResponse_Masternode descriptor]; - GPBFieldDescriptor *field = [descriptor fieldWithNumber:GetStatusResponse_Masternode_FieldNumber_Status]; - return GPBGetMessageRawEnumField(message, field); -} - -void SetGetStatusResponse_Masternode_Status_RawValue(GetStatusResponse_Masternode *message, int32_t value) { - GPBDescriptor *descriptor = [GetStatusResponse_Masternode descriptor]; - GPBFieldDescriptor *field = [descriptor fieldWithNumber:GetStatusResponse_Masternode_FieldNumber_Status]; - GPBSetMessageRawEnumField(message, field, value); -} - -#pragma mark - Enum GetStatusResponse_Masternode_Status - -GPBEnumDescriptor *GetStatusResponse_Masternode_Status_EnumDescriptor(void) { - static _Atomic(GPBEnumDescriptor*) descriptor = nil; - if (!descriptor) { - static const char *valueNames = - "Unknown\000WaitingForProtx\000PoseBanned\000Remov" - "ed\000OperatorKeyChanged\000ProtxIpChanged\000Rea" - "dy\000Error\000"; - static const int32_t values[] = { - GetStatusResponse_Masternode_Status_Unknown, - GetStatusResponse_Masternode_Status_WaitingForProtx, - GetStatusResponse_Masternode_Status_PoseBanned, - GetStatusResponse_Masternode_Status_Removed, - GetStatusResponse_Masternode_Status_OperatorKeyChanged, - GetStatusResponse_Masternode_Status_ProtxIpChanged, - GetStatusResponse_Masternode_Status_Ready, - GetStatusResponse_Masternode_Status_Error, - }; - GPBEnumDescriptor *worker = - [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol(GetStatusResponse_Masternode_Status) - valueNames:valueNames - values:values - count:(uint32_t)(sizeof(values) / sizeof(int32_t)) - enumVerifier:GetStatusResponse_Masternode_Status_IsValidValue]; - GPBEnumDescriptor *expected = nil; - if (!atomic_compare_exchange_strong(&descriptor, &expected, worker)) { - [worker release]; - } - } - return descriptor; -} - -BOOL GetStatusResponse_Masternode_Status_IsValidValue(int32_t value__) { - switch (value__) { - case GetStatusResponse_Masternode_Status_Unknown: - case GetStatusResponse_Masternode_Status_WaitingForProtx: - case GetStatusResponse_Masternode_Status_PoseBanned: - case GetStatusResponse_Masternode_Status_Removed: - case GetStatusResponse_Masternode_Status_OperatorKeyChanged: - case GetStatusResponse_Masternode_Status_ProtxIpChanged: - case GetStatusResponse_Masternode_Status_Ready: - case GetStatusResponse_Masternode_Status_Error: - return YES; - default: - return NO; - } -} - -#pragma mark - GetStatusResponse_NetworkFee +#pragma mark - GetBlockchainStatusResponse_Network -@implementation GetStatusResponse_NetworkFee +@implementation GetBlockchainStatusResponse_Network -@dynamic relay; -@dynamic incremental; +@dynamic peersCount; +@dynamic hasFee, fee; -typedef struct GetStatusResponse_NetworkFee__storage_ { +typedef struct GetBlockchainStatusResponse_Network__storage_ { uint32_t _has_storage_[1]; - double relay; - double incremental; -} GetStatusResponse_NetworkFee__storage_; + uint32_t peersCount; + GetBlockchainStatusResponse_NetworkFee *fee; +} GetBlockchainStatusResponse_Network__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. @@ -684,33 +579,33 @@ + (GPBDescriptor *)descriptor { if (!descriptor) { static GPBMessageFieldDescription fields[] = { { - .name = "relay", + .name = "peersCount", .dataTypeSpecific.clazz = Nil, - .number = GetStatusResponse_NetworkFee_FieldNumber_Relay, + .number = GetBlockchainStatusResponse_Network_FieldNumber_PeersCount, .hasIndex = 0, - .offset = (uint32_t)offsetof(GetStatusResponse_NetworkFee__storage_, relay), + .offset = (uint32_t)offsetof(GetBlockchainStatusResponse_Network__storage_, peersCount), .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), - .dataType = GPBDataTypeDouble, + .dataType = GPBDataTypeUInt32, }, { - .name = "incremental", - .dataTypeSpecific.clazz = Nil, - .number = GetStatusResponse_NetworkFee_FieldNumber_Incremental, + .name = "fee", + .dataTypeSpecific.clazz = GPBObjCClass(GetBlockchainStatusResponse_NetworkFee), + .number = GetBlockchainStatusResponse_Network_FieldNumber_Fee, .hasIndex = 1, - .offset = (uint32_t)offsetof(GetStatusResponse_NetworkFee__storage_, incremental), - .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), - .dataType = GPBDataTypeDouble, + .offset = (uint32_t)offsetof(GetBlockchainStatusResponse_Network__storage_, fee), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, }, }; GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetStatusResponse_NetworkFee class] + [GPBDescriptor allocDescriptorForClass:[GetBlockchainStatusResponse_Network class] rootClass:[CoreRoot class] file:CoreRoot_FileDescriptor() fields:fields fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetStatusResponse_NetworkFee__storage_) + storageSize:sizeof(GetBlockchainStatusResponse_Network__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; - [localDescriptor setupContainingMessageClass:GPBObjCClass(GetStatusResponse)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetBlockchainStatusResponse)]; #if defined(DEBUG) && DEBUG NSAssert(descriptor == nil, @"Startup recursed!"); #endif // DEBUG @@ -721,18 +616,55 @@ + (GPBDescriptor *)descriptor { @end -#pragma mark - GetStatusResponse_Network +#pragma mark - GetMasternodeStatusRequest -@implementation GetStatusResponse_Network +@implementation GetMasternodeStatusRequest -@dynamic peersCount; -@dynamic hasFee, fee; -typedef struct GetStatusResponse_Network__storage_ { +typedef struct GetMasternodeStatusRequest__storage_ { uint32_t _has_storage_[1]; - uint32_t peersCount; - GetStatusResponse_NetworkFee *fee; -} GetStatusResponse_Network__storage_; +} GetMasternodeStatusRequest__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetMasternodeStatusRequest class] + rootClass:[CoreRoot class] + file:CoreRoot_FileDescriptor() + fields:NULL + fieldCount:0 + storageSize:sizeof(GetMasternodeStatusRequest__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetMasternodeStatusResponse + +@implementation GetMasternodeStatusResponse + +@dynamic status; +@dynamic proTxHash; +@dynamic posePenalty; +@dynamic isSynced; +@dynamic syncProgress; + +typedef struct GetMasternodeStatusResponse__storage_ { + uint32_t _has_storage_[1]; + GetMasternodeStatusResponse_Status status; + uint32_t posePenalty; + NSData *proTxHash; + double syncProgress; +} GetMasternodeStatusResponse__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. @@ -741,33 +673,59 @@ + (GPBDescriptor *)descriptor { if (!descriptor) { static GPBMessageFieldDescription fields[] = { { - .name = "peersCount", - .dataTypeSpecific.clazz = Nil, - .number = GetStatusResponse_Network_FieldNumber_PeersCount, + .name = "status", + .dataTypeSpecific.enumDescFunc = GetMasternodeStatusResponse_Status_EnumDescriptor, + .number = GetMasternodeStatusResponse_FieldNumber_Status, .hasIndex = 0, - .offset = (uint32_t)offsetof(GetStatusResponse_Network__storage_, peersCount), + .offset = (uint32_t)offsetof(GetMasternodeStatusResponse__storage_, status), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldHasEnumDescriptor | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeEnum, + }, + { + .name = "proTxHash", + .dataTypeSpecific.clazz = Nil, + .number = GetMasternodeStatusResponse_FieldNumber_ProTxHash, + .hasIndex = 1, + .offset = (uint32_t)offsetof(GetMasternodeStatusResponse__storage_, proTxHash), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, + }, + { + .name = "posePenalty", + .dataTypeSpecific.clazz = Nil, + .number = GetMasternodeStatusResponse_FieldNumber_PosePenalty, + .hasIndex = 2, + .offset = (uint32_t)offsetof(GetMasternodeStatusResponse__storage_, posePenalty), .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), .dataType = GPBDataTypeUInt32, }, { - .name = "fee", - .dataTypeSpecific.clazz = GPBObjCClass(GetStatusResponse_NetworkFee), - .number = GetStatusResponse_Network_FieldNumber_Fee, - .hasIndex = 1, - .offset = (uint32_t)offsetof(GetStatusResponse_Network__storage_, fee), - .flags = GPBFieldOptional, - .dataType = GPBDataTypeMessage, + .name = "isSynced", + .dataTypeSpecific.clazz = Nil, + .number = GetMasternodeStatusResponse_FieldNumber_IsSynced, + .hasIndex = 3, + .offset = 4, // Stored in _has_storage_ to save space. + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBool, + }, + { + .name = "syncProgress", + .dataTypeSpecific.clazz = Nil, + .number = GetMasternodeStatusResponse_FieldNumber_SyncProgress, + .hasIndex = 5, + .offset = (uint32_t)offsetof(GetMasternodeStatusResponse__storage_, syncProgress), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeDouble, }, }; GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetStatusResponse_Network class] + [GPBDescriptor allocDescriptorForClass:[GetMasternodeStatusResponse class] rootClass:[CoreRoot class] file:CoreRoot_FileDescriptor() fields:fields fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetStatusResponse_Network__storage_) + storageSize:sizeof(GetMasternodeStatusResponse__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; - [localDescriptor setupContainingMessageClass:GPBObjCClass(GetStatusResponse)]; #if defined(DEBUG) && DEBUG NSAssert(descriptor == nil, @"Startup recursed!"); #endif // DEBUG @@ -778,6 +736,67 @@ + (GPBDescriptor *)descriptor { @end +int32_t GetMasternodeStatusResponse_Status_RawValue(GetMasternodeStatusResponse *message) { + GPBDescriptor *descriptor = [GetMasternodeStatusResponse descriptor]; + GPBFieldDescriptor *field = [descriptor fieldWithNumber:GetMasternodeStatusResponse_FieldNumber_Status]; + return GPBGetMessageRawEnumField(message, field); +} + +void SetGetMasternodeStatusResponse_Status_RawValue(GetMasternodeStatusResponse *message, int32_t value) { + GPBDescriptor *descriptor = [GetMasternodeStatusResponse descriptor]; + GPBFieldDescriptor *field = [descriptor fieldWithNumber:GetMasternodeStatusResponse_FieldNumber_Status]; + GPBSetMessageRawEnumField(message, field, value); +} + +#pragma mark - Enum GetMasternodeStatusResponse_Status + +GPBEnumDescriptor *GetMasternodeStatusResponse_Status_EnumDescriptor(void) { + static _Atomic(GPBEnumDescriptor*) descriptor = nil; + if (!descriptor) { + static const char *valueNames = + "Unknown\000WaitingForProtx\000PoseBanned\000Remov" + "ed\000OperatorKeyChanged\000ProtxIpChanged\000Rea" + "dy\000Error\000"; + static const int32_t values[] = { + GetMasternodeStatusResponse_Status_Unknown, + GetMasternodeStatusResponse_Status_WaitingForProtx, + GetMasternodeStatusResponse_Status_PoseBanned, + GetMasternodeStatusResponse_Status_Removed, + GetMasternodeStatusResponse_Status_OperatorKeyChanged, + GetMasternodeStatusResponse_Status_ProtxIpChanged, + GetMasternodeStatusResponse_Status_Ready, + GetMasternodeStatusResponse_Status_Error, + }; + GPBEnumDescriptor *worker = + [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol(GetMasternodeStatusResponse_Status) + valueNames:valueNames + values:values + count:(uint32_t)(sizeof(values) / sizeof(int32_t)) + enumVerifier:GetMasternodeStatusResponse_Status_IsValidValue]; + GPBEnumDescriptor *expected = nil; + if (!atomic_compare_exchange_strong(&descriptor, &expected, worker)) { + [worker release]; + } + } + return descriptor; +} + +BOOL GetMasternodeStatusResponse_Status_IsValidValue(int32_t value__) { + switch (value__) { + case GetMasternodeStatusResponse_Status_Unknown: + case GetMasternodeStatusResponse_Status_WaitingForProtx: + case GetMasternodeStatusResponse_Status_PoseBanned: + case GetMasternodeStatusResponse_Status_Removed: + case GetMasternodeStatusResponse_Status_OperatorKeyChanged: + case GetMasternodeStatusResponse_Status_ProtxIpChanged: + case GetMasternodeStatusResponse_Status_Ready: + case GetMasternodeStatusResponse_Status_Error: + return YES; + default: + return NO; + } +} + #pragma mark - GetBlockRequest @implementation GetBlockRequest diff --git a/packages/dapi-grpc/clients/core/v0/objective-c/Core.pbrpc.h b/packages/dapi-grpc/clients/core/v0/objective-c/Core.pbrpc.h index a5016dbd65..7a5f9a0976 100644 --- a/packages/dapi-grpc/clients/core/v0/objective-c/Core.pbrpc.h +++ b/packages/dapi-grpc/clients/core/v0/objective-c/Core.pbrpc.h @@ -20,10 +20,12 @@ @class BroadcastTransactionResponse; @class GetBlockRequest; @class GetBlockResponse; +@class GetBlockchainStatusRequest; +@class GetBlockchainStatusResponse; @class GetEstimatedTransactionFeeRequest; @class GetEstimatedTransactionFeeResponse; -@class GetStatusRequest; -@class GetStatusResponse; +@class GetMasternodeStatusRequest; +@class GetMasternodeStatusResponse; @class GetTransactionRequest; @class GetTransactionResponse; @class TransactionsWithProofsRequest; @@ -43,9 +45,13 @@ NS_ASSUME_NONNULL_BEGIN @protocol Core2 -#pragma mark getStatus(GetStatusRequest) returns (GetStatusResponse) +#pragma mark getBlockchainStatus(GetBlockchainStatusRequest) returns (GetBlockchainStatusResponse) -- (GRPCUnaryProtoCall *)getStatusWithMessage:(GetStatusRequest *)message responseHandler:(id)handler callOptions:(GRPCCallOptions *_Nullable)callOptions; +- (GRPCUnaryProtoCall *)getBlockchainStatusWithMessage:(GetBlockchainStatusRequest *)message responseHandler:(id)handler callOptions:(GRPCCallOptions *_Nullable)callOptions; + +#pragma mark getMasternodeStatus(GetMasternodeStatusRequest) returns (GetMasternodeStatusResponse) + +- (GRPCUnaryProtoCall *)getMasternodeStatusWithMessage:(GetMasternodeStatusRequest *)message responseHandler:(id)handler callOptions:(GRPCCallOptions *_Nullable)callOptions; #pragma mark getBlock(GetBlockRequest) returns (GetBlockResponse) @@ -79,11 +85,18 @@ NS_ASSUME_NONNULL_BEGIN */ @protocol Core -#pragma mark getStatus(GetStatusRequest) returns (GetStatusResponse) +#pragma mark getBlockchainStatus(GetBlockchainStatusRequest) returns (GetBlockchainStatusResponse) + +- (void)getBlockchainStatusWithRequest:(GetBlockchainStatusRequest *)request handler:(void(^)(GetBlockchainStatusResponse *_Nullable response, NSError *_Nullable error))handler; + +- (GRPCProtoCall *)RPCTogetBlockchainStatusWithRequest:(GetBlockchainStatusRequest *)request handler:(void(^)(GetBlockchainStatusResponse *_Nullable response, NSError *_Nullable error))handler; + + +#pragma mark getMasternodeStatus(GetMasternodeStatusRequest) returns (GetMasternodeStatusResponse) -- (void)getStatusWithRequest:(GetStatusRequest *)request handler:(void(^)(GetStatusResponse *_Nullable response, NSError *_Nullable error))handler; +- (void)getMasternodeStatusWithRequest:(GetMasternodeStatusRequest *)request handler:(void(^)(GetMasternodeStatusResponse *_Nullable response, NSError *_Nullable error))handler; -- (GRPCProtoCall *)RPCTogetStatusWithRequest:(GetStatusRequest *)request handler:(void(^)(GetStatusResponse *_Nullable response, NSError *_Nullable error))handler; +- (GRPCProtoCall *)RPCTogetMasternodeStatusWithRequest:(GetMasternodeStatusRequest *)request handler:(void(^)(GetMasternodeStatusResponse *_Nullable response, NSError *_Nullable error))handler; #pragma mark getBlock(GetBlockRequest) returns (GetBlockResponse) diff --git a/packages/dapi-grpc/clients/core/v0/objective-c/Core.pbrpc.m b/packages/dapi-grpc/clients/core/v0/objective-c/Core.pbrpc.m index 2c16c550ac..6e1cedcd07 100644 --- a/packages/dapi-grpc/clients/core/v0/objective-c/Core.pbrpc.m +++ b/packages/dapi-grpc/clients/core/v0/objective-c/Core.pbrpc.m @@ -55,24 +55,44 @@ + (instancetype)serviceWithHost:(NSString *)host callOptions:(GRPCCallOptions *_ #pragma mark - Method Implementations -#pragma mark getStatus(GetStatusRequest) returns (GetStatusResponse) +#pragma mark getBlockchainStatus(GetBlockchainStatusRequest) returns (GetBlockchainStatusResponse) -- (void)getStatusWithRequest:(GetStatusRequest *)request handler:(void(^)(GetStatusResponse *_Nullable response, NSError *_Nullable error))handler{ - [[self RPCTogetStatusWithRequest:request handler:handler] start]; +- (void)getBlockchainStatusWithRequest:(GetBlockchainStatusRequest *)request handler:(void(^)(GetBlockchainStatusResponse *_Nullable response, NSError *_Nullable error))handler{ + [[self RPCTogetBlockchainStatusWithRequest:request handler:handler] start]; } // Returns a not-yet-started RPC object. -- (GRPCProtoCall *)RPCTogetStatusWithRequest:(GetStatusRequest *)request handler:(void(^)(GetStatusResponse *_Nullable response, NSError *_Nullable error))handler{ - return [self RPCToMethod:@"getStatus" +- (GRPCProtoCall *)RPCTogetBlockchainStatusWithRequest:(GetBlockchainStatusRequest *)request handler:(void(^)(GetBlockchainStatusResponse *_Nullable response, NSError *_Nullable error))handler{ + return [self RPCToMethod:@"getBlockchainStatus" requestsWriter:[GRXWriter writerWithValue:request] - responseClass:[GetStatusResponse class] + responseClass:[GetBlockchainStatusResponse class] responsesWriteable:[GRXWriteable writeableWithSingleHandler:handler]]; } -- (GRPCUnaryProtoCall *)getStatusWithMessage:(GetStatusRequest *)message responseHandler:(id)handler callOptions:(GRPCCallOptions *_Nullable)callOptions { - return [self RPCToMethod:@"getStatus" +- (GRPCUnaryProtoCall *)getBlockchainStatusWithMessage:(GetBlockchainStatusRequest *)message responseHandler:(id)handler callOptions:(GRPCCallOptions *_Nullable)callOptions { + return [self RPCToMethod:@"getBlockchainStatus" message:message responseHandler:handler callOptions:callOptions - responseClass:[GetStatusResponse class]]; + responseClass:[GetBlockchainStatusResponse class]]; +} + +#pragma mark getMasternodeStatus(GetMasternodeStatusRequest) returns (GetMasternodeStatusResponse) + +- (void)getMasternodeStatusWithRequest:(GetMasternodeStatusRequest *)request handler:(void(^)(GetMasternodeStatusResponse *_Nullable response, NSError *_Nullable error))handler{ + [[self RPCTogetMasternodeStatusWithRequest:request handler:handler] start]; +} +// Returns a not-yet-started RPC object. +- (GRPCProtoCall *)RPCTogetMasternodeStatusWithRequest:(GetMasternodeStatusRequest *)request handler:(void(^)(GetMasternodeStatusResponse *_Nullable response, NSError *_Nullable error))handler{ + return [self RPCToMethod:@"getMasternodeStatus" + requestsWriter:[GRXWriter writerWithValue:request] + responseClass:[GetMasternodeStatusResponse class] + responsesWriteable:[GRXWriteable writeableWithSingleHandler:handler]]; +} +- (GRPCUnaryProtoCall *)getMasternodeStatusWithMessage:(GetMasternodeStatusRequest *)message responseHandler:(id)handler callOptions:(GRPCCallOptions *_Nullable)callOptions { + return [self RPCToMethod:@"getMasternodeStatus" + message:message + responseHandler:handler + callOptions:callOptions + responseClass:[GetMasternodeStatusResponse class]]; } #pragma mark getBlock(GetBlockRequest) returns (GetBlockResponse) diff --git a/packages/dapi-grpc/clients/core/v0/python/core_pb2.py b/packages/dapi-grpc/clients/core/v0/python/core_pb2.py index cc79763de8..2e6b3662ea 100644 --- a/packages/dapi-grpc/clients/core/v0/python/core_pb2.py +++ b/packages/dapi-grpc/clients/core/v0/python/core_pb2.py @@ -19,105 +19,105 @@ syntax='proto3', serialized_options=None, create_key=_descriptor._internal_create_key, - serialized_pb=b'\n\ncore.proto\x12\x19org.dash.platform.dapi.v0\"\x12\n\x10GetStatusRequest\"\x8e\n\n\x11GetStatusResponse\x12\x45\n\x07version\x18\x01 \x01(\x0b\x32\x34.org.dash.platform.dapi.v0.GetStatusResponse.Version\x12?\n\x04time\x18\x02 \x01(\x0b\x32\x31.org.dash.platform.dapi.v0.GetStatusResponse.Time\x12\x43\n\x06status\x18\x03 \x01(\x0e\x32\x33.org.dash.platform.dapi.v0.GetStatusResponse.Status\x12\x15\n\rsync_progress\x18\x04 \x01(\x01\x12\x41\n\x05\x63hain\x18\x05 \x01(\x0b\x32\x32.org.dash.platform.dapi.v0.GetStatusResponse.Chain\x12K\n\nmasternode\x18\x06 \x01(\x0b\x32\x37.org.dash.platform.dapi.v0.GetStatusResponse.Masternode\x12\x45\n\x07network\x18\x07 \x01(\x0b\x32\x34.org.dash.platform.dapi.v0.GetStatusResponse.Network\x1a<\n\x07Version\x12\x10\n\x08protocol\x18\x01 \x01(\r\x12\x10\n\x08software\x18\x02 \x01(\r\x12\r\n\x05\x61gent\x18\x03 \x01(\t\x1a\x33\n\x04Time\x12\x0b\n\x03now\x18\x01 \x01(\r\x12\x0e\n\x06offset\x18\x02 \x01(\x05\x12\x0e\n\x06median\x18\x03 \x01(\r\x1a\xad\x01\n\x05\x43hain\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x15\n\rheaders_count\x18\x02 \x01(\r\x12\x14\n\x0c\x62locks_count\x18\x03 \x01(\r\x12\x17\n\x0f\x62\x65st_block_hash\x18\x04 \x01(\x0c\x12\x12\n\ndifficulty\x18\x05 \x01(\x01\x12\x12\n\nchain_work\x18\x06 \x01(\x0c\x12\x11\n\tis_synced\x18\x07 \x01(\x08\x12\x15\n\rsync_progress\x18\x08 \x01(\x01\x1a\xc4\x02\n\nMasternode\x12N\n\x06status\x18\x01 \x01(\x0e\x32>.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.Status\x12\x13\n\x0bpro_tx_hash\x18\x02 \x01(\x0c\x12\x14\n\x0cpose_penalty\x18\x03 \x01(\r\x12\x11\n\tis_synced\x18\x04 \x01(\x08\x12\x15\n\rsync_progress\x18\x05 \x01(\x01\"\x90\x01\n\x06Status\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x15\n\x11WAITING_FOR_PROTX\x10\x01\x12\x0f\n\x0bPOSE_BANNED\x10\x02\x12\x0b\n\x07REMOVED\x10\x03\x12\x18\n\x14OPERATOR_KEY_CHANGED\x10\x04\x12\x14\n\x10PROTX_IP_CHANGED\x10\x05\x12\t\n\x05READY\x10\x06\x12\t\n\x05\x45RROR\x10\x07\x1a\x30\n\nNetworkFee\x12\r\n\x05relay\x18\x01 \x01(\x01\x12\x13\n\x0bincremental\x18\x02 \x01(\x01\x1a\x64\n\x07Network\x12\x13\n\x0bpeers_count\x18\x01 \x01(\r\x12\x44\n\x03\x66\x65\x65\x18\x02 \x01(\x0b\x32\x37.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee\"<\n\x06Status\x12\x0f\n\x0bNOT_STARTED\x10\x00\x12\x0b\n\x07SYNCING\x10\x01\x12\t\n\x05READY\x10\x02\x12\t\n\x05\x45RROR\x10\x03\"<\n\x0fGetBlockRequest\x12\x10\n\x06height\x18\x01 \x01(\rH\x00\x12\x0e\n\x04hash\x18\x02 \x01(\tH\x00\x42\x07\n\x05\x62lock\"!\n\x10GetBlockResponse\x12\r\n\x05\x62lock\x18\x01 \x01(\x0c\"b\n\x1b\x42roadcastTransactionRequest\x12\x13\n\x0btransaction\x18\x01 \x01(\x0c\x12\x17\n\x0f\x61llow_high_fees\x18\x02 \x01(\x08\x12\x15\n\rbypass_limits\x18\x03 \x01(\x08\"6\n\x1c\x42roadcastTransactionResponse\x12\x16\n\x0etransaction_id\x18\x01 \x01(\t\"#\n\x15GetTransactionRequest\x12\n\n\x02id\x18\x01 \x01(\t\"\x9c\x01\n\x16GetTransactionResponse\x12\x13\n\x0btransaction\x18\x01 \x01(\x0c\x12\x12\n\nblock_hash\x18\x02 \x01(\x0c\x12\x0e\n\x06height\x18\x03 \x01(\r\x12\x15\n\rconfirmations\x18\x04 \x01(\r\x12\x19\n\x11is_instant_locked\x18\x05 \x01(\x08\x12\x17\n\x0fis_chain_locked\x18\x06 \x01(\x08\"x\n!BlockHeadersWithChainLocksRequest\x12\x19\n\x0f\x66rom_block_hash\x18\x01 \x01(\x0cH\x00\x12\x1b\n\x11\x66rom_block_height\x18\x02 \x01(\rH\x00\x12\r\n\x05\x63ount\x18\x03 \x01(\rB\x0c\n\nfrom_block\"\x89\x01\n\"BlockHeadersWithChainLocksResponse\x12@\n\rblock_headers\x18\x01 \x01(\x0b\x32\'.org.dash.platform.dapi.v0.BlockHeadersH\x00\x12\x14\n\nchain_lock\x18\x02 \x01(\x0cH\x00\x42\x0b\n\tresponses\"\x1f\n\x0c\x42lockHeaders\x12\x0f\n\x07headers\x18\x01 \x03(\x0c\"3\n!GetEstimatedTransactionFeeRequest\x12\x0e\n\x06\x62locks\x18\x01 \x01(\r\"1\n\"GetEstimatedTransactionFeeResponse\x12\x0b\n\x03\x66\x65\x65\x18\x01 \x01(\x01\"\xd3\x01\n\x1dTransactionsWithProofsRequest\x12<\n\x0c\x62loom_filter\x18\x01 \x01(\x0b\x32&.org.dash.platform.dapi.v0.BloomFilter\x12\x19\n\x0f\x66rom_block_hash\x18\x02 \x01(\x0cH\x00\x12\x1b\n\x11\x66rom_block_height\x18\x03 \x01(\rH\x00\x12\r\n\x05\x63ount\x18\x04 \x01(\r\x12\x1f\n\x17send_transaction_hashes\x18\x05 \x01(\x08\x42\x0c\n\nfrom_block\"U\n\x0b\x42loomFilter\x12\x0e\n\x06v_data\x18\x01 \x01(\x0c\x12\x14\n\x0cn_hash_funcs\x18\x02 \x01(\r\x12\x0f\n\x07n_tweak\x18\x03 \x01(\r\x12\x0f\n\x07n_flags\x18\x04 \x01(\r\"\xeb\x01\n\x1eTransactionsWithProofsResponse\x12\x46\n\x10raw_transactions\x18\x01 \x01(\x0b\x32*.org.dash.platform.dapi.v0.RawTransactionsH\x00\x12X\n\x1ainstant_send_lock_messages\x18\x02 \x01(\x0b\x32\x32.org.dash.platform.dapi.v0.InstantSendLockMessagesH\x00\x12\x1a\n\x10raw_merkle_block\x18\x03 \x01(\x0cH\x00\x42\x0b\n\tresponses\"\'\n\x0fRawTransactions\x12\x14\n\x0ctransactions\x18\x01 \x03(\x0c\"+\n\x17InstantSendLockMessages\x12\x10\n\x08messages\x18\x01 \x03(\x0c\x32\xb6\x07\n\x04\x43ore\x12\x66\n\tgetStatus\x12+.org.dash.platform.dapi.v0.GetStatusRequest\x1a,.org.dash.platform.dapi.v0.GetStatusResponse\x12\x63\n\x08getBlock\x12*.org.dash.platform.dapi.v0.GetBlockRequest\x1a+.org.dash.platform.dapi.v0.GetBlockResponse\x12\x87\x01\n\x14\x62roadcastTransaction\x12\x36.org.dash.platform.dapi.v0.BroadcastTransactionRequest\x1a\x37.org.dash.platform.dapi.v0.BroadcastTransactionResponse\x12u\n\x0egetTransaction\x12\x30.org.dash.platform.dapi.v0.GetTransactionRequest\x1a\x31.org.dash.platform.dapi.v0.GetTransactionResponse\x12\x99\x01\n\x1agetEstimatedTransactionFee\x12<.org.dash.platform.dapi.v0.GetEstimatedTransactionFeeRequest\x1a=.org.dash.platform.dapi.v0.GetEstimatedTransactionFeeResponse\x12\xa6\x01\n%subscribeToBlockHeadersWithChainLocks\x12<.org.dash.platform.dapi.v0.BlockHeadersWithChainLocksRequest\x1a=.org.dash.platform.dapi.v0.BlockHeadersWithChainLocksResponse0\x01\x12\x9a\x01\n!subscribeToTransactionsWithProofs\x12\x38.org.dash.platform.dapi.v0.TransactionsWithProofsRequest\x1a\x39.org.dash.platform.dapi.v0.TransactionsWithProofsResponse0\x01\x62\x06proto3' + serialized_pb=b'\n\ncore.proto\x12\x19org.dash.platform.dapi.v0\"\x1c\n\x1aGetBlockchainStatusRequest\"\xc0\x07\n\x1bGetBlockchainStatusResponse\x12O\n\x07version\x18\x01 \x01(\x0b\x32>.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version\x12I\n\x04time\x18\x02 \x01(\x0b\x32;.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time\x12M\n\x06status\x18\x03 \x01(\x0e\x32=.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Status\x12\x15\n\rsync_progress\x18\x04 \x01(\x01\x12K\n\x05\x63hain\x18\x05 \x01(\x0b\x32<.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain\x12O\n\x07network\x18\x07 \x01(\x0b\x32>.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network\x1a<\n\x07Version\x12\x10\n\x08protocol\x18\x01 \x01(\r\x12\x10\n\x08software\x18\x02 \x01(\r\x12\r\n\x05\x61gent\x18\x03 \x01(\t\x1a\x33\n\x04Time\x12\x0b\n\x03now\x18\x01 \x01(\r\x12\x0e\n\x06offset\x18\x02 \x01(\x05\x12\x0e\n\x06median\x18\x03 \x01(\r\x1a\xad\x01\n\x05\x43hain\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x15\n\rheaders_count\x18\x02 \x01(\r\x12\x14\n\x0c\x62locks_count\x18\x03 \x01(\r\x12\x17\n\x0f\x62\x65st_block_hash\x18\x04 \x01(\x0c\x12\x12\n\ndifficulty\x18\x05 \x01(\x01\x12\x12\n\nchain_work\x18\x06 \x01(\x0c\x12\x11\n\tis_synced\x18\x07 \x01(\x08\x12\x15\n\rsync_progress\x18\x08 \x01(\x01\x1a\x30\n\nNetworkFee\x12\r\n\x05relay\x18\x01 \x01(\x01\x12\x13\n\x0bincremental\x18\x02 \x01(\x01\x1an\n\x07Network\x12\x13\n\x0bpeers_count\x18\x01 \x01(\r\x12N\n\x03\x66\x65\x65\x18\x02 \x01(\x0b\x32\x41.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee\"<\n\x06Status\x12\x0f\n\x0bNOT_STARTED\x10\x00\x12\x0b\n\x07SYNCING\x10\x01\x12\t\n\x05READY\x10\x02\x12\t\n\x05\x45RROR\x10\x03\"\x1c\n\x1aGetMasternodeStatusRequest\"\xd4\x02\n\x1bGetMasternodeStatusResponse\x12M\n\x06status\x18\x01 \x01(\x0e\x32=.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.Status\x12\x13\n\x0bpro_tx_hash\x18\x02 \x01(\x0c\x12\x14\n\x0cpose_penalty\x18\x03 \x01(\r\x12\x11\n\tis_synced\x18\x04 \x01(\x08\x12\x15\n\rsync_progress\x18\x05 \x01(\x01\"\x90\x01\n\x06Status\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x15\n\x11WAITING_FOR_PROTX\x10\x01\x12\x0f\n\x0bPOSE_BANNED\x10\x02\x12\x0b\n\x07REMOVED\x10\x03\x12\x18\n\x14OPERATOR_KEY_CHANGED\x10\x04\x12\x14\n\x10PROTX_IP_CHANGED\x10\x05\x12\t\n\x05READY\x10\x06\x12\t\n\x05\x45RROR\x10\x07\"<\n\x0fGetBlockRequest\x12\x10\n\x06height\x18\x01 \x01(\rH\x00\x12\x0e\n\x04hash\x18\x02 \x01(\tH\x00\x42\x07\n\x05\x62lock\"!\n\x10GetBlockResponse\x12\r\n\x05\x62lock\x18\x01 \x01(\x0c\"b\n\x1b\x42roadcastTransactionRequest\x12\x13\n\x0btransaction\x18\x01 \x01(\x0c\x12\x17\n\x0f\x61llow_high_fees\x18\x02 \x01(\x08\x12\x15\n\rbypass_limits\x18\x03 \x01(\x08\"6\n\x1c\x42roadcastTransactionResponse\x12\x16\n\x0etransaction_id\x18\x01 \x01(\t\"#\n\x15GetTransactionRequest\x12\n\n\x02id\x18\x01 \x01(\t\"\x9c\x01\n\x16GetTransactionResponse\x12\x13\n\x0btransaction\x18\x01 \x01(\x0c\x12\x12\n\nblock_hash\x18\x02 \x01(\x0c\x12\x0e\n\x06height\x18\x03 \x01(\r\x12\x15\n\rconfirmations\x18\x04 \x01(\r\x12\x19\n\x11is_instant_locked\x18\x05 \x01(\x08\x12\x17\n\x0fis_chain_locked\x18\x06 \x01(\x08\"x\n!BlockHeadersWithChainLocksRequest\x12\x19\n\x0f\x66rom_block_hash\x18\x01 \x01(\x0cH\x00\x12\x1b\n\x11\x66rom_block_height\x18\x02 \x01(\rH\x00\x12\r\n\x05\x63ount\x18\x03 \x01(\rB\x0c\n\nfrom_block\"\x89\x01\n\"BlockHeadersWithChainLocksResponse\x12@\n\rblock_headers\x18\x01 \x01(\x0b\x32\'.org.dash.platform.dapi.v0.BlockHeadersH\x00\x12\x14\n\nchain_lock\x18\x02 \x01(\x0cH\x00\x42\x0b\n\tresponses\"\x1f\n\x0c\x42lockHeaders\x12\x0f\n\x07headers\x18\x01 \x03(\x0c\"3\n!GetEstimatedTransactionFeeRequest\x12\x0e\n\x06\x62locks\x18\x01 \x01(\r\"1\n\"GetEstimatedTransactionFeeResponse\x12\x0b\n\x03\x66\x65\x65\x18\x01 \x01(\x01\"\xd3\x01\n\x1dTransactionsWithProofsRequest\x12<\n\x0c\x62loom_filter\x18\x01 \x01(\x0b\x32&.org.dash.platform.dapi.v0.BloomFilter\x12\x19\n\x0f\x66rom_block_hash\x18\x02 \x01(\x0cH\x00\x12\x1b\n\x11\x66rom_block_height\x18\x03 \x01(\rH\x00\x12\r\n\x05\x63ount\x18\x04 \x01(\r\x12\x1f\n\x17send_transaction_hashes\x18\x05 \x01(\x08\x42\x0c\n\nfrom_block\"U\n\x0b\x42loomFilter\x12\x0e\n\x06v_data\x18\x01 \x01(\x0c\x12\x14\n\x0cn_hash_funcs\x18\x02 \x01(\r\x12\x0f\n\x07n_tweak\x18\x03 \x01(\r\x12\x0f\n\x07n_flags\x18\x04 \x01(\r\"\xeb\x01\n\x1eTransactionsWithProofsResponse\x12\x46\n\x10raw_transactions\x18\x01 \x01(\x0b\x32*.org.dash.platform.dapi.v0.RawTransactionsH\x00\x12X\n\x1ainstant_send_lock_messages\x18\x02 \x01(\x0b\x32\x32.org.dash.platform.dapi.v0.InstantSendLockMessagesH\x00\x12\x1a\n\x10raw_merkle_block\x18\x03 \x01(\x0cH\x00\x42\x0b\n\tresponses\"\'\n\x0fRawTransactions\x12\x14\n\x0ctransactions\x18\x01 \x03(\x0c\"+\n\x17InstantSendLockMessages\x12\x10\n\x08messages\x18\x01 \x03(\x0c\x32\xdc\x08\n\x04\x43ore\x12\x84\x01\n\x13getBlockchainStatus\x12\x35.org.dash.platform.dapi.v0.GetBlockchainStatusRequest\x1a\x36.org.dash.platform.dapi.v0.GetBlockchainStatusResponse\x12\x84\x01\n\x13getMasternodeStatus\x12\x35.org.dash.platform.dapi.v0.GetMasternodeStatusRequest\x1a\x36.org.dash.platform.dapi.v0.GetMasternodeStatusResponse\x12\x63\n\x08getBlock\x12*.org.dash.platform.dapi.v0.GetBlockRequest\x1a+.org.dash.platform.dapi.v0.GetBlockResponse\x12\x87\x01\n\x14\x62roadcastTransaction\x12\x36.org.dash.platform.dapi.v0.BroadcastTransactionRequest\x1a\x37.org.dash.platform.dapi.v0.BroadcastTransactionResponse\x12u\n\x0egetTransaction\x12\x30.org.dash.platform.dapi.v0.GetTransactionRequest\x1a\x31.org.dash.platform.dapi.v0.GetTransactionResponse\x12\x99\x01\n\x1agetEstimatedTransactionFee\x12<.org.dash.platform.dapi.v0.GetEstimatedTransactionFeeRequest\x1a=.org.dash.platform.dapi.v0.GetEstimatedTransactionFeeResponse\x12\xa6\x01\n%subscribeToBlockHeadersWithChainLocks\x12<.org.dash.platform.dapi.v0.BlockHeadersWithChainLocksRequest\x1a=.org.dash.platform.dapi.v0.BlockHeadersWithChainLocksResponse0\x01\x12\x9a\x01\n!subscribeToTransactionsWithProofs\x12\x38.org.dash.platform.dapi.v0.TransactionsWithProofsRequest\x1a\x39.org.dash.platform.dapi.v0.TransactionsWithProofsResponse0\x01\x62\x06proto3' ) -_GETSTATUSRESPONSE_MASTERNODE_STATUS = _descriptor.EnumDescriptor( +_GETBLOCKCHAINSTATUSRESPONSE_STATUS = _descriptor.EnumDescriptor( name='Status', - full_name='org.dash.platform.dapi.v0.GetStatusResponse.Masternode.Status', + full_name='org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Status', filename=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key, values=[ _descriptor.EnumValueDescriptor( - name='UNKNOWN', index=0, number=0, + name='NOT_STARTED', index=0, number=0, serialized_options=None, type=None, create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( - name='WAITING_FOR_PROTX', index=1, number=1, + name='SYNCING', index=1, number=1, serialized_options=None, type=None, create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( - name='POSE_BANNED', index=2, number=2, + name='READY', index=2, number=2, serialized_options=None, type=None, create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( - name='REMOVED', index=3, number=3, + name='ERROR', index=3, number=3, serialized_options=None, type=None, create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + serialized_start=972, + serialized_end=1032, +) +_sym_db.RegisterEnumDescriptor(_GETBLOCKCHAINSTATUSRESPONSE_STATUS) + +_GETMASTERNODESTATUSRESPONSE_STATUS = _descriptor.EnumDescriptor( + name='Status', + full_name='org.dash.platform.dapi.v0.GetMasternodeStatusResponse.Status', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ _descriptor.EnumValueDescriptor( - name='OPERATOR_KEY_CHANGED', index=4, number=4, + name='UNKNOWN', index=0, number=0, serialized_options=None, type=None, create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( - name='PROTX_IP_CHANGED', index=5, number=5, + name='WAITING_FOR_PROTX', index=1, number=1, serialized_options=None, type=None, create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( - name='READY', index=6, number=6, + name='POSE_BANNED', index=2, number=2, serialized_options=None, type=None, create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( - name='ERROR', index=7, number=7, + name='REMOVED', index=3, number=3, serialized_options=None, type=None, create_key=_descriptor._internal_create_key), - ], - containing_type=None, - serialized_options=None, - serialized_start=998, - serialized_end=1142, -) -_sym_db.RegisterEnumDescriptor(_GETSTATUSRESPONSE_MASTERNODE_STATUS) - -_GETSTATUSRESPONSE_STATUS = _descriptor.EnumDescriptor( - name='Status', - full_name='org.dash.platform.dapi.v0.GetStatusResponse.Status', - filename=None, - file=DESCRIPTOR, - create_key=_descriptor._internal_create_key, - values=[ _descriptor.EnumValueDescriptor( - name='NOT_STARTED', index=0, number=0, + name='OPERATOR_KEY_CHANGED', index=4, number=4, serialized_options=None, type=None, create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( - name='SYNCING', index=1, number=1, + name='PROTX_IP_CHANGED', index=5, number=5, serialized_options=None, type=None, create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( - name='READY', index=2, number=2, + name='READY', index=6, number=6, serialized_options=None, type=None, create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( - name='ERROR', index=3, number=3, + name='ERROR', index=7, number=7, serialized_options=None, type=None, create_key=_descriptor._internal_create_key), ], containing_type=None, serialized_options=None, - serialized_start=1296, - serialized_end=1356, + serialized_start=1261, + serialized_end=1405, ) -_sym_db.RegisterEnumDescriptor(_GETSTATUSRESPONSE_STATUS) +_sym_db.RegisterEnumDescriptor(_GETMASTERNODESTATUSRESPONSE_STATUS) -_GETSTATUSREQUEST = _descriptor.Descriptor( - name='GetStatusRequest', - full_name='org.dash.platform.dapi.v0.GetStatusRequest', +_GETBLOCKCHAINSTATUSREQUEST = _descriptor.Descriptor( + name='GetBlockchainStatusRequest', + full_name='org.dash.platform.dapi.v0.GetBlockchainStatusRequest', filename=None, file=DESCRIPTOR, containing_type=None, @@ -136,34 +136,34 @@ oneofs=[ ], serialized_start=41, - serialized_end=59, + serialized_end=69, ) -_GETSTATUSRESPONSE_VERSION = _descriptor.Descriptor( +_GETBLOCKCHAINSTATUSRESPONSE_VERSION = _descriptor.Descriptor( name='Version', - full_name='org.dash.platform.dapi.v0.GetStatusResponse.Version', + full_name='org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( - name='protocol', full_name='org.dash.platform.dapi.v0.GetStatusResponse.Version.protocol', index=0, + name='protocol', full_name='org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version.protocol', index=0, number=1, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( - name='software', full_name='org.dash.platform.dapi.v0.GetStatusResponse.Version.software', index=1, + name='software', full_name='org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version.software', index=1, number=2, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( - name='agent', full_name='org.dash.platform.dapi.v0.GetStatusResponse.Version.agent', index=2, + name='agent', full_name='org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version.agent', index=2, number=3, type=9, cpp_type=9, label=1, has_default_value=False, default_value=b"".decode('utf-8'), message_type=None, enum_type=None, containing_type=None, @@ -181,34 +181,34 @@ extension_ranges=[], oneofs=[ ], - serialized_start=526, - serialized_end=586, + serialized_start=519, + serialized_end=579, ) -_GETSTATUSRESPONSE_TIME = _descriptor.Descriptor( +_GETBLOCKCHAINSTATUSRESPONSE_TIME = _descriptor.Descriptor( name='Time', - full_name='org.dash.platform.dapi.v0.GetStatusResponse.Time', + full_name='org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( - name='now', full_name='org.dash.platform.dapi.v0.GetStatusResponse.Time.now', index=0, + name='now', full_name='org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time.now', index=0, number=1, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( - name='offset', full_name='org.dash.platform.dapi.v0.GetStatusResponse.Time.offset', index=1, + name='offset', full_name='org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time.offset', index=1, number=2, type=5, cpp_type=1, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( - name='median', full_name='org.dash.platform.dapi.v0.GetStatusResponse.Time.median', index=2, + name='median', full_name='org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time.median', index=2, number=3, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, @@ -226,69 +226,69 @@ extension_ranges=[], oneofs=[ ], - serialized_start=588, - serialized_end=639, + serialized_start=581, + serialized_end=632, ) -_GETSTATUSRESPONSE_CHAIN = _descriptor.Descriptor( +_GETBLOCKCHAINSTATUSRESPONSE_CHAIN = _descriptor.Descriptor( name='Chain', - full_name='org.dash.platform.dapi.v0.GetStatusResponse.Chain', + full_name='org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( - name='name', full_name='org.dash.platform.dapi.v0.GetStatusResponse.Chain.name', index=0, + name='name', full_name='org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.name', index=0, number=1, type=9, cpp_type=9, label=1, has_default_value=False, default_value=b"".decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( - name='headers_count', full_name='org.dash.platform.dapi.v0.GetStatusResponse.Chain.headers_count', index=1, + name='headers_count', full_name='org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.headers_count', index=1, number=2, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( - name='blocks_count', full_name='org.dash.platform.dapi.v0.GetStatusResponse.Chain.blocks_count', index=2, + name='blocks_count', full_name='org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.blocks_count', index=2, number=3, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( - name='best_block_hash', full_name='org.dash.platform.dapi.v0.GetStatusResponse.Chain.best_block_hash', index=3, + name='best_block_hash', full_name='org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.best_block_hash', index=3, number=4, type=12, cpp_type=9, label=1, has_default_value=False, default_value=b"", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( - name='difficulty', full_name='org.dash.platform.dapi.v0.GetStatusResponse.Chain.difficulty', index=4, + name='difficulty', full_name='org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.difficulty', index=4, number=5, type=1, cpp_type=5, label=1, has_default_value=False, default_value=float(0), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( - name='chain_work', full_name='org.dash.platform.dapi.v0.GetStatusResponse.Chain.chain_work', index=5, + name='chain_work', full_name='org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.chain_work', index=5, number=6, type=12, cpp_type=9, label=1, has_default_value=False, default_value=b"", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( - name='is_synced', full_name='org.dash.platform.dapi.v0.GetStatusResponse.Chain.is_synced', index=6, + name='is_synced', full_name='org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.is_synced', index=6, number=7, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( - name='sync_progress', full_name='org.dash.platform.dapi.v0.GetStatusResponse.Chain.sync_progress', index=7, + name='sync_progress', full_name='org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.sync_progress', index=7, number=8, type=1, cpp_type=5, label=1, has_default_value=False, default_value=float(0), message_type=None, enum_type=None, containing_type=None, @@ -306,49 +306,28 @@ extension_ranges=[], oneofs=[ ], - serialized_start=642, - serialized_end=815, + serialized_start=635, + serialized_end=808, ) -_GETSTATUSRESPONSE_MASTERNODE = _descriptor.Descriptor( - name='Masternode', - full_name='org.dash.platform.dapi.v0.GetStatusResponse.Masternode', +_GETBLOCKCHAINSTATUSRESPONSE_NETWORKFEE = _descriptor.Descriptor( + name='NetworkFee', + full_name='org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( - name='status', full_name='org.dash.platform.dapi.v0.GetStatusResponse.Masternode.status', index=0, - number=1, type=14, cpp_type=8, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='pro_tx_hash', full_name='org.dash.platform.dapi.v0.GetStatusResponse.Masternode.pro_tx_hash', index=1, - number=2, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=b"", - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='pose_penalty', full_name='org.dash.platform.dapi.v0.GetStatusResponse.Masternode.pose_penalty', index=2, - number=3, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='is_synced', full_name='org.dash.platform.dapi.v0.GetStatusResponse.Masternode.is_synced', index=3, - number=4, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, + name='relay', full_name='org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee.relay', index=0, + number=1, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=float(0), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( - name='sync_progress', full_name='org.dash.platform.dapi.v0.GetStatusResponse.Masternode.sync_progress', index=4, - number=5, type=1, cpp_type=5, label=1, + name='incremental', full_name='org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee.incremental', index=1, + number=2, type=1, cpp_type=5, label=1, has_default_value=False, default_value=float(0), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, @@ -358,7 +337,6 @@ ], nested_types=[], enum_types=[ - _GETSTATUSRESPONSE_MASTERNODE_STATUS, ], serialized_options=None, is_extendable=False, @@ -366,29 +344,29 @@ extension_ranges=[], oneofs=[ ], - serialized_start=818, - serialized_end=1142, + serialized_start=810, + serialized_end=858, ) -_GETSTATUSRESPONSE_NETWORKFEE = _descriptor.Descriptor( - name='NetworkFee', - full_name='org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee', +_GETBLOCKCHAINSTATUSRESPONSE_NETWORK = _descriptor.Descriptor( + name='Network', + full_name='org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( - name='relay', full_name='org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.relay', index=0, - number=1, type=1, cpp_type=5, label=1, - has_default_value=False, default_value=float(0), + name='peers_count', full_name='org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network.peers_count', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( - name='incremental', full_name='org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.incremental', index=1, - number=2, type=1, cpp_type=5, label=1, - has_default_value=False, default_value=float(0), + name='fee', full_name='org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network.fee', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), @@ -404,32 +382,86 @@ extension_ranges=[], oneofs=[ ], - serialized_start=1144, - serialized_end=1192, + serialized_start=860, + serialized_end=970, ) -_GETSTATUSRESPONSE_NETWORK = _descriptor.Descriptor( - name='Network', - full_name='org.dash.platform.dapi.v0.GetStatusResponse.Network', +_GETBLOCKCHAINSTATUSRESPONSE = _descriptor.Descriptor( + name='GetBlockchainStatusResponse', + full_name='org.dash.platform.dapi.v0.GetBlockchainStatusResponse', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( - name='peers_count', full_name='org.dash.platform.dapi.v0.GetStatusResponse.Network.peers_count', index=0, - number=1, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, + name='version', full_name='org.dash.platform.dapi.v0.GetBlockchainStatusResponse.version', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( - name='fee', full_name='org.dash.platform.dapi.v0.GetStatusResponse.Network.fee', index=1, + name='time', full_name='org.dash.platform.dapi.v0.GetBlockchainStatusResponse.time', index=1, number=2, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='status', full_name='org.dash.platform.dapi.v0.GetBlockchainStatusResponse.status', index=2, + number=3, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='sync_progress', full_name='org.dash.platform.dapi.v0.GetBlockchainStatusResponse.sync_progress', index=3, + number=4, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='chain', full_name='org.dash.platform.dapi.v0.GetBlockchainStatusResponse.chain', index=4, + number=5, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='network', full_name='org.dash.platform.dapi.v0.GetBlockchainStatusResponse.network', index=5, + number=7, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_GETBLOCKCHAINSTATUSRESPONSE_VERSION, _GETBLOCKCHAINSTATUSRESPONSE_TIME, _GETBLOCKCHAINSTATUSRESPONSE_CHAIN, _GETBLOCKCHAINSTATUSRESPONSE_NETWORKFEE, _GETBLOCKCHAINSTATUSRESPONSE_NETWORK, ], + enum_types=[ + _GETBLOCKCHAINSTATUSRESPONSE_STATUS, + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=72, + serialized_end=1032, +) + + +_GETMASTERNODESTATUSREQUEST = _descriptor.Descriptor( + name='GetMasternodeStatusRequest', + full_name='org.dash.platform.dapi.v0.GetMasternodeStatusRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ ], extensions=[ ], @@ -442,73 +474,60 @@ extension_ranges=[], oneofs=[ ], - serialized_start=1194, - serialized_end=1294, + serialized_start=1034, + serialized_end=1062, ) -_GETSTATUSRESPONSE = _descriptor.Descriptor( - name='GetStatusResponse', - full_name='org.dash.platform.dapi.v0.GetStatusResponse', + +_GETMASTERNODESTATUSRESPONSE = _descriptor.Descriptor( + name='GetMasternodeStatusResponse', + full_name='org.dash.platform.dapi.v0.GetMasternodeStatusResponse', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( - name='version', full_name='org.dash.platform.dapi.v0.GetStatusResponse.version', index=0, - number=1, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='time', full_name='org.dash.platform.dapi.v0.GetStatusResponse.time', index=1, - number=2, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='status', full_name='org.dash.platform.dapi.v0.GetStatusResponse.status', index=2, - number=3, type=14, cpp_type=8, label=1, + name='status', full_name='org.dash.platform.dapi.v0.GetMasternodeStatusResponse.status', index=0, + number=1, type=14, cpp_type=8, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( - name='sync_progress', full_name='org.dash.platform.dapi.v0.GetStatusResponse.sync_progress', index=3, - number=4, type=1, cpp_type=5, label=1, - has_default_value=False, default_value=float(0), + name='pro_tx_hash', full_name='org.dash.platform.dapi.v0.GetMasternodeStatusResponse.pro_tx_hash', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( - name='chain', full_name='org.dash.platform.dapi.v0.GetStatusResponse.chain', index=4, - number=5, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, + name='pose_penalty', full_name='org.dash.platform.dapi.v0.GetMasternodeStatusResponse.pose_penalty', index=2, + number=3, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( - name='masternode', full_name='org.dash.platform.dapi.v0.GetStatusResponse.masternode', index=5, - number=6, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, + name='is_synced', full_name='org.dash.platform.dapi.v0.GetMasternodeStatusResponse.is_synced', index=3, + number=4, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( - name='network', full_name='org.dash.platform.dapi.v0.GetStatusResponse.network', index=6, - number=7, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, + name='sync_progress', full_name='org.dash.platform.dapi.v0.GetMasternodeStatusResponse.sync_progress', index=4, + number=5, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=float(0), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], - nested_types=[_GETSTATUSRESPONSE_VERSION, _GETSTATUSRESPONSE_TIME, _GETSTATUSRESPONSE_CHAIN, _GETSTATUSRESPONSE_MASTERNODE, _GETSTATUSRESPONSE_NETWORKFEE, _GETSTATUSRESPONSE_NETWORK, ], + nested_types=[], enum_types=[ - _GETSTATUSRESPONSE_STATUS, + _GETMASTERNODESTATUSRESPONSE_STATUS, ], serialized_options=None, is_extendable=False, @@ -516,8 +535,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=62, - serialized_end=1356, + serialized_start=1065, + serialized_end=1405, ) @@ -560,8 +579,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=1358, - serialized_end=1418, + serialized_start=1407, + serialized_end=1467, ) @@ -592,8 +611,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=1420, - serialized_end=1453, + serialized_start=1469, + serialized_end=1502, ) @@ -638,8 +657,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=1455, - serialized_end=1553, + serialized_start=1504, + serialized_end=1602, ) @@ -670,8 +689,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=1555, - serialized_end=1609, + serialized_start=1604, + serialized_end=1658, ) @@ -702,8 +721,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=1611, - serialized_end=1646, + serialized_start=1660, + serialized_end=1695, ) @@ -769,8 +788,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=1649, - serialized_end=1805, + serialized_start=1698, + serialized_end=1854, ) @@ -820,8 +839,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=1807, - serialized_end=1927, + serialized_start=1856, + serialized_end=1976, ) @@ -864,8 +883,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=1930, - serialized_end=2067, + serialized_start=1979, + serialized_end=2116, ) @@ -896,8 +915,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=2069, - serialized_end=2100, + serialized_start=2118, + serialized_end=2149, ) @@ -928,8 +947,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=2102, - serialized_end=2153, + serialized_start=2151, + serialized_end=2202, ) @@ -960,8 +979,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=2155, - serialized_end=2204, + serialized_start=2204, + serialized_end=2253, ) @@ -1025,8 +1044,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=2207, - serialized_end=2418, + serialized_start=2256, + serialized_end=2467, ) @@ -1078,8 +1097,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=2420, - serialized_end=2505, + serialized_start=2469, + serialized_end=2554, ) @@ -1129,8 +1148,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=2508, - serialized_end=2743, + serialized_start=2557, + serialized_end=2792, ) @@ -1161,8 +1180,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=2745, - serialized_end=2784, + serialized_start=2794, + serialized_end=2833, ) @@ -1193,26 +1212,24 @@ extension_ranges=[], oneofs=[ ], - serialized_start=2786, - serialized_end=2829, + serialized_start=2835, + serialized_end=2878, ) -_GETSTATUSRESPONSE_VERSION.containing_type = _GETSTATUSRESPONSE -_GETSTATUSRESPONSE_TIME.containing_type = _GETSTATUSRESPONSE -_GETSTATUSRESPONSE_CHAIN.containing_type = _GETSTATUSRESPONSE -_GETSTATUSRESPONSE_MASTERNODE.fields_by_name['status'].enum_type = _GETSTATUSRESPONSE_MASTERNODE_STATUS -_GETSTATUSRESPONSE_MASTERNODE.containing_type = _GETSTATUSRESPONSE -_GETSTATUSRESPONSE_MASTERNODE_STATUS.containing_type = _GETSTATUSRESPONSE_MASTERNODE -_GETSTATUSRESPONSE_NETWORKFEE.containing_type = _GETSTATUSRESPONSE -_GETSTATUSRESPONSE_NETWORK.fields_by_name['fee'].message_type = _GETSTATUSRESPONSE_NETWORKFEE -_GETSTATUSRESPONSE_NETWORK.containing_type = _GETSTATUSRESPONSE -_GETSTATUSRESPONSE.fields_by_name['version'].message_type = _GETSTATUSRESPONSE_VERSION -_GETSTATUSRESPONSE.fields_by_name['time'].message_type = _GETSTATUSRESPONSE_TIME -_GETSTATUSRESPONSE.fields_by_name['status'].enum_type = _GETSTATUSRESPONSE_STATUS -_GETSTATUSRESPONSE.fields_by_name['chain'].message_type = _GETSTATUSRESPONSE_CHAIN -_GETSTATUSRESPONSE.fields_by_name['masternode'].message_type = _GETSTATUSRESPONSE_MASTERNODE -_GETSTATUSRESPONSE.fields_by_name['network'].message_type = _GETSTATUSRESPONSE_NETWORK -_GETSTATUSRESPONSE_STATUS.containing_type = _GETSTATUSRESPONSE +_GETBLOCKCHAINSTATUSRESPONSE_VERSION.containing_type = _GETBLOCKCHAINSTATUSRESPONSE +_GETBLOCKCHAINSTATUSRESPONSE_TIME.containing_type = _GETBLOCKCHAINSTATUSRESPONSE +_GETBLOCKCHAINSTATUSRESPONSE_CHAIN.containing_type = _GETBLOCKCHAINSTATUSRESPONSE +_GETBLOCKCHAINSTATUSRESPONSE_NETWORKFEE.containing_type = _GETBLOCKCHAINSTATUSRESPONSE +_GETBLOCKCHAINSTATUSRESPONSE_NETWORK.fields_by_name['fee'].message_type = _GETBLOCKCHAINSTATUSRESPONSE_NETWORKFEE +_GETBLOCKCHAINSTATUSRESPONSE_NETWORK.containing_type = _GETBLOCKCHAINSTATUSRESPONSE +_GETBLOCKCHAINSTATUSRESPONSE.fields_by_name['version'].message_type = _GETBLOCKCHAINSTATUSRESPONSE_VERSION +_GETBLOCKCHAINSTATUSRESPONSE.fields_by_name['time'].message_type = _GETBLOCKCHAINSTATUSRESPONSE_TIME +_GETBLOCKCHAINSTATUSRESPONSE.fields_by_name['status'].enum_type = _GETBLOCKCHAINSTATUSRESPONSE_STATUS +_GETBLOCKCHAINSTATUSRESPONSE.fields_by_name['chain'].message_type = _GETBLOCKCHAINSTATUSRESPONSE_CHAIN +_GETBLOCKCHAINSTATUSRESPONSE.fields_by_name['network'].message_type = _GETBLOCKCHAINSTATUSRESPONSE_NETWORK +_GETBLOCKCHAINSTATUSRESPONSE_STATUS.containing_type = _GETBLOCKCHAINSTATUSRESPONSE +_GETMASTERNODESTATUSRESPONSE.fields_by_name['status'].enum_type = _GETMASTERNODESTATUSRESPONSE_STATUS +_GETMASTERNODESTATUSRESPONSE_STATUS.containing_type = _GETMASTERNODESTATUSRESPONSE _GETBLOCKREQUEST.oneofs_by_name['block'].fields.append( _GETBLOCKREQUEST.fields_by_name['height']) _GETBLOCKREQUEST.fields_by_name['height'].containing_oneof = _GETBLOCKREQUEST.oneofs_by_name['block'] @@ -1250,8 +1267,10 @@ _TRANSACTIONSWITHPROOFSRESPONSE.oneofs_by_name['responses'].fields.append( _TRANSACTIONSWITHPROOFSRESPONSE.fields_by_name['raw_merkle_block']) _TRANSACTIONSWITHPROOFSRESPONSE.fields_by_name['raw_merkle_block'].containing_oneof = _TRANSACTIONSWITHPROOFSRESPONSE.oneofs_by_name['responses'] -DESCRIPTOR.message_types_by_name['GetStatusRequest'] = _GETSTATUSREQUEST -DESCRIPTOR.message_types_by_name['GetStatusResponse'] = _GETSTATUSRESPONSE +DESCRIPTOR.message_types_by_name['GetBlockchainStatusRequest'] = _GETBLOCKCHAINSTATUSREQUEST +DESCRIPTOR.message_types_by_name['GetBlockchainStatusResponse'] = _GETBLOCKCHAINSTATUSRESPONSE +DESCRIPTOR.message_types_by_name['GetMasternodeStatusRequest'] = _GETMASTERNODESTATUSREQUEST +DESCRIPTOR.message_types_by_name['GetMasternodeStatusResponse'] = _GETMASTERNODESTATUSRESPONSE DESCRIPTOR.message_types_by_name['GetBlockRequest'] = _GETBLOCKREQUEST DESCRIPTOR.message_types_by_name['GetBlockResponse'] = _GETBLOCKRESPONSE DESCRIPTOR.message_types_by_name['BroadcastTransactionRequest'] = _BROADCASTTRANSACTIONREQUEST @@ -1270,67 +1289,73 @@ DESCRIPTOR.message_types_by_name['InstantSendLockMessages'] = _INSTANTSENDLOCKMESSAGES _sym_db.RegisterFileDescriptor(DESCRIPTOR) -GetStatusRequest = _reflection.GeneratedProtocolMessageType('GetStatusRequest', (_message.Message,), { - 'DESCRIPTOR' : _GETSTATUSREQUEST, +GetBlockchainStatusRequest = _reflection.GeneratedProtocolMessageType('GetBlockchainStatusRequest', (_message.Message,), { + 'DESCRIPTOR' : _GETBLOCKCHAINSTATUSREQUEST, '__module__' : 'core_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetStatusRequest) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetBlockchainStatusRequest) }) -_sym_db.RegisterMessage(GetStatusRequest) +_sym_db.RegisterMessage(GetBlockchainStatusRequest) -GetStatusResponse = _reflection.GeneratedProtocolMessageType('GetStatusResponse', (_message.Message,), { +GetBlockchainStatusResponse = _reflection.GeneratedProtocolMessageType('GetBlockchainStatusResponse', (_message.Message,), { 'Version' : _reflection.GeneratedProtocolMessageType('Version', (_message.Message,), { - 'DESCRIPTOR' : _GETSTATUSRESPONSE_VERSION, + 'DESCRIPTOR' : _GETBLOCKCHAINSTATUSRESPONSE_VERSION, '__module__' : 'core_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetStatusResponse.Version) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version) }) , 'Time' : _reflection.GeneratedProtocolMessageType('Time', (_message.Message,), { - 'DESCRIPTOR' : _GETSTATUSRESPONSE_TIME, + 'DESCRIPTOR' : _GETBLOCKCHAINSTATUSRESPONSE_TIME, '__module__' : 'core_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetStatusResponse.Time) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time) }) , 'Chain' : _reflection.GeneratedProtocolMessageType('Chain', (_message.Message,), { - 'DESCRIPTOR' : _GETSTATUSRESPONSE_CHAIN, - '__module__' : 'core_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetStatusResponse.Chain) - }) - , - - 'Masternode' : _reflection.GeneratedProtocolMessageType('Masternode', (_message.Message,), { - 'DESCRIPTOR' : _GETSTATUSRESPONSE_MASTERNODE, + 'DESCRIPTOR' : _GETBLOCKCHAINSTATUSRESPONSE_CHAIN, '__module__' : 'core_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetStatusResponse.Masternode) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain) }) , 'NetworkFee' : _reflection.GeneratedProtocolMessageType('NetworkFee', (_message.Message,), { - 'DESCRIPTOR' : _GETSTATUSRESPONSE_NETWORKFEE, + 'DESCRIPTOR' : _GETBLOCKCHAINSTATUSRESPONSE_NETWORKFEE, '__module__' : 'core_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee) }) , 'Network' : _reflection.GeneratedProtocolMessageType('Network', (_message.Message,), { - 'DESCRIPTOR' : _GETSTATUSRESPONSE_NETWORK, + 'DESCRIPTOR' : _GETBLOCKCHAINSTATUSRESPONSE_NETWORK, '__module__' : 'core_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetStatusResponse.Network) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network) }) , - 'DESCRIPTOR' : _GETSTATUSRESPONSE, + 'DESCRIPTOR' : _GETBLOCKCHAINSTATUSRESPONSE, + '__module__' : 'core_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetBlockchainStatusResponse) + }) +_sym_db.RegisterMessage(GetBlockchainStatusResponse) +_sym_db.RegisterMessage(GetBlockchainStatusResponse.Version) +_sym_db.RegisterMessage(GetBlockchainStatusResponse.Time) +_sym_db.RegisterMessage(GetBlockchainStatusResponse.Chain) +_sym_db.RegisterMessage(GetBlockchainStatusResponse.NetworkFee) +_sym_db.RegisterMessage(GetBlockchainStatusResponse.Network) + +GetMasternodeStatusRequest = _reflection.GeneratedProtocolMessageType('GetMasternodeStatusRequest', (_message.Message,), { + 'DESCRIPTOR' : _GETMASTERNODESTATUSREQUEST, + '__module__' : 'core_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetMasternodeStatusRequest) + }) +_sym_db.RegisterMessage(GetMasternodeStatusRequest) + +GetMasternodeStatusResponse = _reflection.GeneratedProtocolMessageType('GetMasternodeStatusResponse', (_message.Message,), { + 'DESCRIPTOR' : _GETMASTERNODESTATUSRESPONSE, '__module__' : 'core_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetStatusResponse) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetMasternodeStatusResponse) }) -_sym_db.RegisterMessage(GetStatusResponse) -_sym_db.RegisterMessage(GetStatusResponse.Version) -_sym_db.RegisterMessage(GetStatusResponse.Time) -_sym_db.RegisterMessage(GetStatusResponse.Chain) -_sym_db.RegisterMessage(GetStatusResponse.Masternode) -_sym_db.RegisterMessage(GetStatusResponse.NetworkFee) -_sym_db.RegisterMessage(GetStatusResponse.Network) +_sym_db.RegisterMessage(GetMasternodeStatusResponse) GetBlockRequest = _reflection.GeneratedProtocolMessageType('GetBlockRequest', (_message.Message,), { 'DESCRIPTOR' : _GETBLOCKREQUEST, @@ -1453,23 +1478,33 @@ index=0, serialized_options=None, create_key=_descriptor._internal_create_key, - serialized_start=2832, - serialized_end=3782, + serialized_start=2881, + serialized_end=3997, methods=[ _descriptor.MethodDescriptor( - name='getStatus', - full_name='org.dash.platform.dapi.v0.Core.getStatus', + name='getBlockchainStatus', + full_name='org.dash.platform.dapi.v0.Core.getBlockchainStatus', index=0, containing_service=None, - input_type=_GETSTATUSREQUEST, - output_type=_GETSTATUSRESPONSE, + input_type=_GETBLOCKCHAINSTATUSREQUEST, + output_type=_GETBLOCKCHAINSTATUSRESPONSE, + serialized_options=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.MethodDescriptor( + name='getMasternodeStatus', + full_name='org.dash.platform.dapi.v0.Core.getMasternodeStatus', + index=1, + containing_service=None, + input_type=_GETMASTERNODESTATUSREQUEST, + output_type=_GETMASTERNODESTATUSRESPONSE, serialized_options=None, create_key=_descriptor._internal_create_key, ), _descriptor.MethodDescriptor( name='getBlock', full_name='org.dash.platform.dapi.v0.Core.getBlock', - index=1, + index=2, containing_service=None, input_type=_GETBLOCKREQUEST, output_type=_GETBLOCKRESPONSE, @@ -1479,7 +1514,7 @@ _descriptor.MethodDescriptor( name='broadcastTransaction', full_name='org.dash.platform.dapi.v0.Core.broadcastTransaction', - index=2, + index=3, containing_service=None, input_type=_BROADCASTTRANSACTIONREQUEST, output_type=_BROADCASTTRANSACTIONRESPONSE, @@ -1489,7 +1524,7 @@ _descriptor.MethodDescriptor( name='getTransaction', full_name='org.dash.platform.dapi.v0.Core.getTransaction', - index=3, + index=4, containing_service=None, input_type=_GETTRANSACTIONREQUEST, output_type=_GETTRANSACTIONRESPONSE, @@ -1499,7 +1534,7 @@ _descriptor.MethodDescriptor( name='getEstimatedTransactionFee', full_name='org.dash.platform.dapi.v0.Core.getEstimatedTransactionFee', - index=4, + index=5, containing_service=None, input_type=_GETESTIMATEDTRANSACTIONFEEREQUEST, output_type=_GETESTIMATEDTRANSACTIONFEERESPONSE, @@ -1509,7 +1544,7 @@ _descriptor.MethodDescriptor( name='subscribeToBlockHeadersWithChainLocks', full_name='org.dash.platform.dapi.v0.Core.subscribeToBlockHeadersWithChainLocks', - index=5, + index=6, containing_service=None, input_type=_BLOCKHEADERSWITHCHAINLOCKSREQUEST, output_type=_BLOCKHEADERSWITHCHAINLOCKSRESPONSE, @@ -1519,7 +1554,7 @@ _descriptor.MethodDescriptor( name='subscribeToTransactionsWithProofs', full_name='org.dash.platform.dapi.v0.Core.subscribeToTransactionsWithProofs', - index=6, + index=7, containing_service=None, input_type=_TRANSACTIONSWITHPROOFSREQUEST, output_type=_TRANSACTIONSWITHPROOFSRESPONSE, diff --git a/packages/dapi-grpc/clients/core/v0/python/core_pb2_grpc.py b/packages/dapi-grpc/clients/core/v0/python/core_pb2_grpc.py index e8a4eec351..e96d204e90 100644 --- a/packages/dapi-grpc/clients/core/v0/python/core_pb2_grpc.py +++ b/packages/dapi-grpc/clients/core/v0/python/core_pb2_grpc.py @@ -14,10 +14,15 @@ def __init__(self, channel): Args: channel: A grpc.Channel. """ - self.getStatus = channel.unary_unary( - '/org.dash.platform.dapi.v0.Core/getStatus', - request_serializer=core__pb2.GetStatusRequest.SerializeToString, - response_deserializer=core__pb2.GetStatusResponse.FromString, + self.getBlockchainStatus = channel.unary_unary( + '/org.dash.platform.dapi.v0.Core/getBlockchainStatus', + request_serializer=core__pb2.GetBlockchainStatusRequest.SerializeToString, + response_deserializer=core__pb2.GetBlockchainStatusResponse.FromString, + ) + self.getMasternodeStatus = channel.unary_unary( + '/org.dash.platform.dapi.v0.Core/getMasternodeStatus', + request_serializer=core__pb2.GetMasternodeStatusRequest.SerializeToString, + response_deserializer=core__pb2.GetMasternodeStatusResponse.FromString, ) self.getBlock = channel.unary_unary( '/org.dash.platform.dapi.v0.Core/getBlock', @@ -54,7 +59,13 @@ def __init__(self, channel): class CoreServicer(object): """Missing associated documentation comment in .proto file.""" - def getStatus(self, request, context): + def getBlockchainStatus(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def getMasternodeStatus(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) context.set_details('Method not implemented!') @@ -99,10 +110,15 @@ def subscribeToTransactionsWithProofs(self, request, context): def add_CoreServicer_to_server(servicer, server): rpc_method_handlers = { - 'getStatus': grpc.unary_unary_rpc_method_handler( - servicer.getStatus, - request_deserializer=core__pb2.GetStatusRequest.FromString, - response_serializer=core__pb2.GetStatusResponse.SerializeToString, + 'getBlockchainStatus': grpc.unary_unary_rpc_method_handler( + servicer.getBlockchainStatus, + request_deserializer=core__pb2.GetBlockchainStatusRequest.FromString, + response_serializer=core__pb2.GetBlockchainStatusResponse.SerializeToString, + ), + 'getMasternodeStatus': grpc.unary_unary_rpc_method_handler( + servicer.getMasternodeStatus, + request_deserializer=core__pb2.GetMasternodeStatusRequest.FromString, + response_serializer=core__pb2.GetMasternodeStatusResponse.SerializeToString, ), 'getBlock': grpc.unary_unary_rpc_method_handler( servicer.getBlock, @@ -145,7 +161,24 @@ class Core(object): """Missing associated documentation comment in .proto file.""" @staticmethod - def getStatus(request, + def getBlockchainStatus(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/org.dash.platform.dapi.v0.Core/getBlockchainStatus', + core__pb2.GetBlockchainStatusRequest.SerializeToString, + core__pb2.GetBlockchainStatusResponse.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def getMasternodeStatus(request, target, options=(), channel_credentials=None, @@ -155,9 +188,9 @@ def getStatus(request, wait_for_ready=None, timeout=None, metadata=None): - return grpc.experimental.unary_unary(request, target, '/org.dash.platform.dapi.v0.Core/getStatus', - core__pb2.GetStatusRequest.SerializeToString, - core__pb2.GetStatusResponse.FromString, + return grpc.experimental.unary_unary(request, target, '/org.dash.platform.dapi.v0.Core/getMasternodeStatus', + core__pb2.GetMasternodeStatusRequest.SerializeToString, + core__pb2.GetMasternodeStatusResponse.FromString, options, channel_credentials, insecure, call_credentials, compression, wait_for_ready, timeout, metadata) diff --git a/packages/dapi-grpc/clients/core/v0/web/CorePromiseClient.js b/packages/dapi-grpc/clients/core/v0/web/CorePromiseClient.js index eecb1ced18..1b732919a6 100644 --- a/packages/dapi-grpc/clients/core/v0/web/CorePromiseClient.js +++ b/packages/dapi-grpc/clients/core/v0/web/CorePromiseClient.js @@ -52,15 +52,29 @@ class CorePromiseClient { } /** - * @param {!GetStatusRequest} getStatusRequest + * @param {!GetBlockchainStatusRequest} getBlockchainStatusRequest * @param {?Object} metadata - * @return {Promise} + * @return {Promise} */ - getStatus(getStatusRequest, metadata = {}) { + getBlockchainStatus(getBlockchainStatusRequest, metadata = {}) { return promisify( - this.client.getStatus.bind(this.client), + this.client.getBlockchainStatus.bind(this.client), )( - getStatusRequest, + getBlockchainStatusRequest, + metadata, + ); + } + + /** + * @param {!GetMasternodeStatusRequest} getMasternodeStatusRequest + * @param {?Object} metadata + * @return {Promise} + */ + getMasternodeStatus(getMasternodeStatusRequest, metadata = {}) { + return promisify( + this.client.getMasternodeStatus.bind(this.client), + )( + getMasternodeStatusRequest, metadata, ); } diff --git a/packages/dapi-grpc/clients/core/v0/web/core_pb.d.ts b/packages/dapi-grpc/clients/core/v0/web/core_pb.d.ts index b96051c0b3..e545204e5e 100644 --- a/packages/dapi-grpc/clients/core/v0/web/core_pb.d.ts +++ b/packages/dapi-grpc/clients/core/v0/web/core_pb.d.ts @@ -3,73 +3,67 @@ import * as jspb from "google-protobuf"; -export class GetStatusRequest extends jspb.Message { +export class GetBlockchainStatusRequest extends jspb.Message { serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): GetStatusRequest.AsObject; - static toObject(includeInstance: boolean, msg: GetStatusRequest): GetStatusRequest.AsObject; + toObject(includeInstance?: boolean): GetBlockchainStatusRequest.AsObject; + static toObject(includeInstance: boolean, msg: GetBlockchainStatusRequest): GetBlockchainStatusRequest.AsObject; static extensions: {[key: number]: jspb.ExtensionFieldInfo}; static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; - static serializeBinaryToWriter(message: GetStatusRequest, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): GetStatusRequest; - static deserializeBinaryFromReader(message: GetStatusRequest, reader: jspb.BinaryReader): GetStatusRequest; + static serializeBinaryToWriter(message: GetBlockchainStatusRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetBlockchainStatusRequest; + static deserializeBinaryFromReader(message: GetBlockchainStatusRequest, reader: jspb.BinaryReader): GetBlockchainStatusRequest; } -export namespace GetStatusRequest { +export namespace GetBlockchainStatusRequest { export type AsObject = { } } -export class GetStatusResponse extends jspb.Message { +export class GetBlockchainStatusResponse extends jspb.Message { hasVersion(): boolean; clearVersion(): void; - getVersion(): GetStatusResponse.Version | undefined; - setVersion(value?: GetStatusResponse.Version): void; + getVersion(): GetBlockchainStatusResponse.Version | undefined; + setVersion(value?: GetBlockchainStatusResponse.Version): void; hasTime(): boolean; clearTime(): void; - getTime(): GetStatusResponse.Time | undefined; - setTime(value?: GetStatusResponse.Time): void; + getTime(): GetBlockchainStatusResponse.Time | undefined; + setTime(value?: GetBlockchainStatusResponse.Time): void; - getStatus(): GetStatusResponse.StatusMap[keyof GetStatusResponse.StatusMap]; - setStatus(value: GetStatusResponse.StatusMap[keyof GetStatusResponse.StatusMap]): void; + getStatus(): GetBlockchainStatusResponse.StatusMap[keyof GetBlockchainStatusResponse.StatusMap]; + setStatus(value: GetBlockchainStatusResponse.StatusMap[keyof GetBlockchainStatusResponse.StatusMap]): void; getSyncProgress(): number; setSyncProgress(value: number): void; hasChain(): boolean; clearChain(): void; - getChain(): GetStatusResponse.Chain | undefined; - setChain(value?: GetStatusResponse.Chain): void; - - hasMasternode(): boolean; - clearMasternode(): void; - getMasternode(): GetStatusResponse.Masternode | undefined; - setMasternode(value?: GetStatusResponse.Masternode): void; + getChain(): GetBlockchainStatusResponse.Chain | undefined; + setChain(value?: GetBlockchainStatusResponse.Chain): void; hasNetwork(): boolean; clearNetwork(): void; - getNetwork(): GetStatusResponse.Network | undefined; - setNetwork(value?: GetStatusResponse.Network): void; + getNetwork(): GetBlockchainStatusResponse.Network | undefined; + setNetwork(value?: GetBlockchainStatusResponse.Network): void; serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): GetStatusResponse.AsObject; - static toObject(includeInstance: boolean, msg: GetStatusResponse): GetStatusResponse.AsObject; + toObject(includeInstance?: boolean): GetBlockchainStatusResponse.AsObject; + static toObject(includeInstance: boolean, msg: GetBlockchainStatusResponse): GetBlockchainStatusResponse.AsObject; static extensions: {[key: number]: jspb.ExtensionFieldInfo}; static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; - static serializeBinaryToWriter(message: GetStatusResponse, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): GetStatusResponse; - static deserializeBinaryFromReader(message: GetStatusResponse, reader: jspb.BinaryReader): GetStatusResponse; + static serializeBinaryToWriter(message: GetBlockchainStatusResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetBlockchainStatusResponse; + static deserializeBinaryFromReader(message: GetBlockchainStatusResponse, reader: jspb.BinaryReader): GetBlockchainStatusResponse; } -export namespace GetStatusResponse { +export namespace GetBlockchainStatusResponse { export type AsObject = { - version?: GetStatusResponse.Version.AsObject, - time?: GetStatusResponse.Time.AsObject, - status: GetStatusResponse.StatusMap[keyof GetStatusResponse.StatusMap], + version?: GetBlockchainStatusResponse.Version.AsObject, + time?: GetBlockchainStatusResponse.Time.AsObject, + status: GetBlockchainStatusResponse.StatusMap[keyof GetBlockchainStatusResponse.StatusMap], syncProgress: number, - chain?: GetStatusResponse.Chain.AsObject, - masternode?: GetStatusResponse.Masternode.AsObject, - network?: GetStatusResponse.Network.AsObject, + chain?: GetBlockchainStatusResponse.Chain.AsObject, + network?: GetBlockchainStatusResponse.Network.AsObject, } export class Version extends jspb.Message { @@ -180,57 +174,6 @@ export namespace GetStatusResponse { } } - export class Masternode extends jspb.Message { - getStatus(): GetStatusResponse.Masternode.StatusMap[keyof GetStatusResponse.Masternode.StatusMap]; - setStatus(value: GetStatusResponse.Masternode.StatusMap[keyof GetStatusResponse.Masternode.StatusMap]): void; - - getProTxHash(): Uint8Array | string; - getProTxHash_asU8(): Uint8Array; - getProTxHash_asB64(): string; - setProTxHash(value: Uint8Array | string): void; - - getPosePenalty(): number; - setPosePenalty(value: number): void; - - getIsSynced(): boolean; - setIsSynced(value: boolean): void; - - getSyncProgress(): number; - setSyncProgress(value: number): void; - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): Masternode.AsObject; - static toObject(includeInstance: boolean, msg: Masternode): Masternode.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; - static serializeBinaryToWriter(message: Masternode, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): Masternode; - static deserializeBinaryFromReader(message: Masternode, reader: jspb.BinaryReader): Masternode; - } - - export namespace Masternode { - export type AsObject = { - status: GetStatusResponse.Masternode.StatusMap[keyof GetStatusResponse.Masternode.StatusMap], - proTxHash: Uint8Array | string, - posePenalty: number, - isSynced: boolean, - syncProgress: number, - } - - export interface StatusMap { - UNKNOWN: 0; - WAITING_FOR_PROTX: 1; - POSE_BANNED: 2; - REMOVED: 3; - OPERATOR_KEY_CHANGED: 4; - PROTX_IP_CHANGED: 5; - READY: 6; - ERROR: 7; - } - - export const Status: StatusMap; - } - export class NetworkFee extends jspb.Message { getRelay(): number; setRelay(value: number): void; @@ -261,8 +204,8 @@ export namespace GetStatusResponse { hasFee(): boolean; clearFee(): void; - getFee(): GetStatusResponse.NetworkFee | undefined; - setFee(value?: GetStatusResponse.NetworkFee): void; + getFee(): GetBlockchainStatusResponse.NetworkFee | undefined; + setFee(value?: GetBlockchainStatusResponse.NetworkFee): void; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): Network.AsObject; @@ -277,7 +220,7 @@ export namespace GetStatusResponse { export namespace Network { export type AsObject = { peersCount: number, - fee?: GetStatusResponse.NetworkFee.AsObject, + fee?: GetBlockchainStatusResponse.NetworkFee.AsObject, } } @@ -291,6 +234,73 @@ export namespace GetStatusResponse { export const Status: StatusMap; } +export class GetMasternodeStatusRequest extends jspb.Message { + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetMasternodeStatusRequest.AsObject; + static toObject(includeInstance: boolean, msg: GetMasternodeStatusRequest): GetMasternodeStatusRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: GetMasternodeStatusRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetMasternodeStatusRequest; + static deserializeBinaryFromReader(message: GetMasternodeStatusRequest, reader: jspb.BinaryReader): GetMasternodeStatusRequest; +} + +export namespace GetMasternodeStatusRequest { + export type AsObject = { + } +} + +export class GetMasternodeStatusResponse extends jspb.Message { + getStatus(): GetMasternodeStatusResponse.StatusMap[keyof GetMasternodeStatusResponse.StatusMap]; + setStatus(value: GetMasternodeStatusResponse.StatusMap[keyof GetMasternodeStatusResponse.StatusMap]): void; + + getProTxHash(): Uint8Array | string; + getProTxHash_asU8(): Uint8Array; + getProTxHash_asB64(): string; + setProTxHash(value: Uint8Array | string): void; + + getPosePenalty(): number; + setPosePenalty(value: number): void; + + getIsSynced(): boolean; + setIsSynced(value: boolean): void; + + getSyncProgress(): number; + setSyncProgress(value: number): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetMasternodeStatusResponse.AsObject; + static toObject(includeInstance: boolean, msg: GetMasternodeStatusResponse): GetMasternodeStatusResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: GetMasternodeStatusResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetMasternodeStatusResponse; + static deserializeBinaryFromReader(message: GetMasternodeStatusResponse, reader: jspb.BinaryReader): GetMasternodeStatusResponse; +} + +export namespace GetMasternodeStatusResponse { + export type AsObject = { + status: GetMasternodeStatusResponse.StatusMap[keyof GetMasternodeStatusResponse.StatusMap], + proTxHash: Uint8Array | string, + posePenalty: number, + isSynced: boolean, + syncProgress: number, + } + + export interface StatusMap { + UNKNOWN: 0; + WAITING_FOR_PROTX: 1; + POSE_BANNED: 2; + REMOVED: 3; + OPERATOR_KEY_CHANGED: 4; + PROTX_IP_CHANGED: 5; + READY: 6; + ERROR: 7; + } + + export const Status: StatusMap; +} + export class GetBlockRequest extends jspb.Message { hasHeight(): boolean; clearHeight(): void; diff --git a/packages/dapi-grpc/clients/core/v0/web/core_pb.js b/packages/dapi-grpc/clients/core/v0/web/core_pb.js index ae974b2f81..05e280fbf3 100644 --- a/packages/dapi-grpc/clients/core/v0/web/core_pb.js +++ b/packages/dapi-grpc/clients/core/v0/web/core_pb.js @@ -26,18 +26,19 @@ goog.exportSymbol('proto.org.dash.platform.dapi.v0.BroadcastTransactionResponse' goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetBlockRequest', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetBlockRequest.BlockCase', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetBlockResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetBlockchainStatusRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Status', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetEstimatedTransactionFeeRequest', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetEstimatedTransactionFeeResponse', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusRequest', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.Status', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Network', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Status', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Time', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.Version', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetMasternodeStatusRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.Status', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTransactionRequest', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTransactionResponse', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.InstantSendLockMessages', null, { proto }); @@ -56,16 +57,16 @@ goog.exportSymbol('proto.org.dash.platform.dapi.v0.TransactionsWithProofsRespons * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetStatusRequest = function(opt_data) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusRequest = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetStatusRequest, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetBlockchainStatusRequest, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetStatusRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetStatusRequest'; + proto.org.dash.platform.dapi.v0.GetBlockchainStatusRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetBlockchainStatusRequest'; } /** * Generated by JsPbCodeGenerator. @@ -77,16 +78,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetStatusResponse = function(opt_data) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetStatusResponse, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetStatusResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetStatusResponse'; + proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse'; } /** * Generated by JsPbCodeGenerator. @@ -98,16 +99,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Version = function(opt_data) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetStatusResponse.Version, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.displayName = 'proto.org.dash.platform.dapi.v0.GetStatusResponse.Version'; + proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version.displayName = 'proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version'; } /** * Generated by JsPbCodeGenerator. @@ -119,16 +120,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Time = function(opt_data) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetStatusResponse.Time, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.displayName = 'proto.org.dash.platform.dapi.v0.GetStatusResponse.Time'; + proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time.displayName = 'proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time'; } /** * Generated by JsPbCodeGenerator. @@ -140,16 +141,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain = function(opt_data) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.displayName = 'proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain'; + proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.displayName = 'proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain'; } /** * Generated by JsPbCodeGenerator. @@ -161,16 +162,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode = function(opt_data) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.displayName = 'proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode'; + proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee.displayName = 'proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee'; } /** * Generated by JsPbCodeGenerator. @@ -182,16 +183,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee = function(opt_data) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.displayName = 'proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee'; + proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network.displayName = 'proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network'; } /** * Generated by JsPbCodeGenerator. @@ -203,16 +204,37 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Network = function(opt_data) { +proto.org.dash.platform.dapi.v0.GetMasternodeStatusRequest = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetStatusResponse.Network, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetMasternodeStatusRequest, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetStatusResponse.Network.displayName = 'proto.org.dash.platform.dapi.v0.GetStatusResponse.Network'; + proto.org.dash.platform.dapi.v0.GetMasternodeStatusRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetMasternodeStatusRequest'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse'; } /** * Generated by JsPbCodeGenerator. @@ -566,8 +588,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetStatusRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetBlockchainStatusRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetBlockchainStatusRequest.toObject(opt_includeInstance, this); }; @@ -576,11 +598,11 @@ proto.org.dash.platform.dapi.v0.GetStatusRequest.prototype.toObject = function(o * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetStatusRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusRequest.toObject = function(includeInstance, msg) { var f, obj = { }; @@ -596,23 +618,23 @@ proto.org.dash.platform.dapi.v0.GetStatusRequest.toObject = function(includeInst /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusRequest} */ -proto.org.dash.platform.dapi.v0.GetStatusRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetStatusRequest; - return proto.org.dash.platform.dapi.v0.GetStatusRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetBlockchainStatusRequest; + return proto.org.dash.platform.dapi.v0.GetBlockchainStatusRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusRequest} */ -proto.org.dash.platform.dapi.v0.GetStatusRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -632,9 +654,9 @@ proto.org.dash.platform.dapi.v0.GetStatusRequest.deserializeBinaryFromReader = f * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetStatusRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetBlockchainStatusRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -642,11 +664,11 @@ proto.org.dash.platform.dapi.v0.GetStatusRequest.prototype.serializeBinary = fun /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; }; @@ -667,8 +689,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetStatusResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.toObject(opt_includeInstance, this); }; @@ -677,19 +699,18 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.toObject = function( * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.toObject = function(includeInstance, msg) { var f, obj = { - version: (f = msg.getVersion()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.toObject(includeInstance, f), - time: (f = msg.getTime()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.toObject(includeInstance, f), + version: (f = msg.getVersion()) && proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version.toObject(includeInstance, f), + time: (f = msg.getTime()) && proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time.toObject(includeInstance, f), status: jspb.Message.getFieldWithDefault(msg, 3, 0), syncProgress: jspb.Message.getFloatingPointFieldWithDefault(msg, 4, 0.0), - chain: (f = msg.getChain()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.toObject(includeInstance, f), - masternode: (f = msg.getMasternode()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.toObject(includeInstance, f), - network: (f = msg.getNetwork()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.Network.toObject(includeInstance, f) + chain: (f = msg.getChain()) && proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.toObject(includeInstance, f), + network: (f = msg.getNetwork()) && proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network.toObject(includeInstance, f) }; if (includeInstance) { @@ -703,23 +724,23 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.toObject = function(includeIns /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse; - return proto.org.dash.platform.dapi.v0.GetStatusResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse; + return proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -727,17 +748,17 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.deserializeBinaryFromReader = var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.Version; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version.deserializeBinaryFromReader); msg.setVersion(value); break; case 2: - var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.Time; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time.deserializeBinaryFromReader); msg.setTime(value); break; case 3: - var value = /** @type {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Status} */ (reader.readEnum()); + var value = /** @type {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Status} */ (reader.readEnum()); msg.setStatus(value); break; case 4: @@ -745,18 +766,13 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.deserializeBinaryFromReader = msg.setSyncProgress(value); break; case 5: - var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.deserializeBinaryFromReader); msg.setChain(value); break; - case 6: - var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.deserializeBinaryFromReader); - msg.setMasternode(value); - break; case 7: - var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.Network; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.Network.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network.deserializeBinaryFromReader); msg.setNetwork(value); break; default: @@ -772,9 +788,9 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.deserializeBinaryFromReader = * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetStatusResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -782,18 +798,18 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.serializeBinary = fu /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getVersion(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version.serializeBinaryToWriter ); } f = message.getTime(); @@ -801,7 +817,7 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.serializeBinaryToWriter = func writer.writeMessage( 2, f, - proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time.serializeBinaryToWriter ); } f = message.getStatus(); @@ -823,15 +839,7 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.serializeBinaryToWriter = func writer.writeMessage( 5, f, - proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.serializeBinaryToWriter - ); - } - f = message.getMasternode(); - if (f != null) { - writer.writeMessage( - 6, - f, - proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.serializeBinaryToWriter ); } f = message.getNetwork(); @@ -839,7 +847,7 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.serializeBinaryToWriter = func writer.writeMessage( 7, f, - proto.org.dash.platform.dapi.v0.GetStatusResponse.Network.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network.serializeBinaryToWriter ); } }; @@ -848,7 +856,7 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.serializeBinaryToWriter = func /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Status = { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Status = { NOT_STARTED: 0, SYNCING: 1, READY: 2, @@ -871,8 +879,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version.toObject(opt_includeInstance, this); }; @@ -881,11 +889,11 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.prototype.toObject = f * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Version} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version.toObject = function(includeInstance, msg) { var f, obj = { protocol: jspb.Message.getFieldWithDefault(msg, 1, 0), software: jspb.Message.getFieldWithDefault(msg, 2, 0), @@ -903,23 +911,23 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.toObject = function(in /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Version} + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.Version; - return proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version; + return proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Version} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Version} + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -951,9 +959,9 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.deserializeBinaryFromR * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -961,11 +969,11 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.prototype.serializeBin /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Version} message + * @param {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getProtocol(); if (f !== 0) { @@ -995,16 +1003,16 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.serializeBinaryToWrite * optional uint32 protocol = 1; * @return {number} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.prototype.getProtocol = function() { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version.prototype.getProtocol = function() { return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); }; /** * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Version} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.prototype.setProtocol = function(value) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version.prototype.setProtocol = function(value) { return jspb.Message.setProto3IntField(this, 1, value); }; @@ -1013,16 +1021,16 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.prototype.setProtocol * optional uint32 software = 2; * @return {number} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.prototype.getSoftware = function() { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version.prototype.getSoftware = function() { return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); }; /** * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Version} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.prototype.setSoftware = function(value) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version.prototype.setSoftware = function(value) { return jspb.Message.setProto3IntField(this, 2, value); }; @@ -1031,16 +1039,16 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.prototype.setSoftware * optional string agent = 3; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.prototype.getAgent = function() { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version.prototype.getAgent = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); }; /** * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Version} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Version.prototype.setAgent = function(value) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version.prototype.setAgent = function(value) { return jspb.Message.setProto3StringField(this, 3, value); }; @@ -1061,8 +1069,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time.toObject(opt_includeInstance, this); }; @@ -1071,11 +1079,11 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.prototype.toObject = func * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Time} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time.toObject = function(includeInstance, msg) { var f, obj = { now: jspb.Message.getFieldWithDefault(msg, 1, 0), offset: jspb.Message.getFieldWithDefault(msg, 2, 0), @@ -1093,23 +1101,23 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.toObject = function(inclu /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Time} + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.Time; - return proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time; + return proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Time} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Time} + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -1141,9 +1149,9 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.deserializeBinaryFromRead * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -1151,11 +1159,11 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.prototype.serializeBinary /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Time} message + * @param {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getNow(); if (f !== 0) { @@ -1185,16 +1193,16 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.serializeBinaryToWriter = * optional uint32 now = 1; * @return {number} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.prototype.getNow = function() { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time.prototype.getNow = function() { return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); }; /** * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Time} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.prototype.setNow = function(value) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time.prototype.setNow = function(value) { return jspb.Message.setProto3IntField(this, 1, value); }; @@ -1203,16 +1211,16 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.prototype.setNow = functi * optional int32 offset = 2; * @return {number} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.prototype.getOffset = function() { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time.prototype.getOffset = function() { return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); }; /** * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Time} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.prototype.setOffset = function(value) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time.prototype.setOffset = function(value) { return jspb.Message.setProto3IntField(this, 2, value); }; @@ -1221,16 +1229,16 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.prototype.setOffset = fun * optional uint32 median = 3; * @return {number} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.prototype.getMedian = function() { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time.prototype.getMedian = function() { return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); }; /** * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Time} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Time.prototype.setMedian = function(value) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time.prototype.setMedian = function(value) { return jspb.Message.setProto3IntField(this, 3, value); }; @@ -1251,8 +1259,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.toObject(opt_includeInstance, this); }; @@ -1261,11 +1269,11 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.toObject = fun * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.toObject = function(includeInstance, msg) { var f, obj = { name: jspb.Message.getFieldWithDefault(msg, 1, ""), headersCount: jspb.Message.getFieldWithDefault(msg, 2, 0), @@ -1288,23 +1296,23 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.toObject = function(incl /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain} + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain; - return proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain; + return proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain} + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -1356,9 +1364,9 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.deserializeBinaryFromRea * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -1366,11 +1374,11 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.serializeBinar /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain} message + * @param {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getName(); if (f.length > 0) { @@ -1435,16 +1443,16 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.serializeBinaryToWriter * optional string name = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.getName = function() { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.prototype.getName = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.setName = function(value) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.prototype.setName = function(value) { return jspb.Message.setProto3StringField(this, 1, value); }; @@ -1453,16 +1461,16 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.setName = func * optional uint32 headers_count = 2; * @return {number} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.getHeadersCount = function() { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.prototype.getHeadersCount = function() { return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); }; /** * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.setHeadersCount = function(value) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.prototype.setHeadersCount = function(value) { return jspb.Message.setProto3IntField(this, 2, value); }; @@ -1471,16 +1479,16 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.setHeadersCoun * optional uint32 blocks_count = 3; * @return {number} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.getBlocksCount = function() { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.prototype.getBlocksCount = function() { return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); }; /** * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.setBlocksCount = function(value) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.prototype.setBlocksCount = function(value) { return jspb.Message.setProto3IntField(this, 3, value); }; @@ -1489,7 +1497,7 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.setBlocksCount * optional bytes best_block_hash = 4; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.getBestBlockHash = function() { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.prototype.getBestBlockHash = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); }; @@ -1499,7 +1507,7 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.getBestBlockHa * This is a type-conversion wrapper around `getBestBlockHash()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.getBestBlockHash_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.prototype.getBestBlockHash_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( this.getBestBlockHash())); }; @@ -1512,7 +1520,7 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.getBestBlockHa * This is a type-conversion wrapper around `getBestBlockHash()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.getBestBlockHash_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.prototype.getBestBlockHash_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( this.getBestBlockHash())); }; @@ -1520,9 +1528,9 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.getBestBlockHa /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.setBestBlockHash = function(value) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.prototype.setBestBlockHash = function(value) { return jspb.Message.setProto3BytesField(this, 4, value); }; @@ -1531,16 +1539,16 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.setBestBlockHa * optional double difficulty = 5; * @return {number} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.getDifficulty = function() { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.prototype.getDifficulty = function() { return /** @type {number} */ (jspb.Message.getFloatingPointFieldWithDefault(this, 5, 0.0)); }; /** * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.setDifficulty = function(value) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.prototype.setDifficulty = function(value) { return jspb.Message.setProto3FloatField(this, 5, value); }; @@ -1549,7 +1557,7 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.setDifficulty * optional bytes chain_work = 6; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.getChainWork = function() { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.prototype.getChainWork = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 6, "")); }; @@ -1559,7 +1567,7 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.getChainWork = * This is a type-conversion wrapper around `getChainWork()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.getChainWork_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.prototype.getChainWork_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( this.getChainWork())); }; @@ -1572,7 +1580,7 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.getChainWork_a * This is a type-conversion wrapper around `getChainWork()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.getChainWork_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.prototype.getChainWork_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( this.getChainWork())); }; @@ -1580,9 +1588,9 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.getChainWork_a /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.setChainWork = function(value) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.prototype.setChainWork = function(value) { return jspb.Message.setProto3BytesField(this, 6, value); }; @@ -1591,16 +1599,16 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.setChainWork = * optional bool is_synced = 7; * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.getIsSynced = function() { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.prototype.getIsSynced = function() { return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 7, false)); }; /** * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.setIsSynced = function(value) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.prototype.setIsSynced = function(value) { return jspb.Message.setProto3BooleanField(this, 7, value); }; @@ -1609,16 +1617,16 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.setIsSynced = * optional double sync_progress = 8; * @return {number} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.getSyncProgress = function() { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.prototype.getSyncProgress = function() { return /** @type {number} */ (jspb.Message.getFloatingPointFieldWithDefault(this, 8, 0.0)); }; /** * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain.prototype.setSyncProgress = function(value) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain.prototype.setSyncProgress = function(value) { return jspb.Message.setProto3FloatField(this, 8, value); }; @@ -1639,8 +1647,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee.toObject(opt_includeInstance, this); }; @@ -1649,17 +1657,14 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.prototype.toObject * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee.toObject = function(includeInstance, msg) { var f, obj = { - status: jspb.Message.getFieldWithDefault(msg, 1, 0), - proTxHash: msg.getProTxHash_asB64(), - posePenalty: jspb.Message.getFieldWithDefault(msg, 3, 0), - isSynced: jspb.Message.getBooleanFieldWithDefault(msg, 4, false), - syncProgress: jspb.Message.getFloatingPointFieldWithDefault(msg, 5, 0.0) + relay: jspb.Message.getFloatingPointFieldWithDefault(msg, 1, 0.0), + incremental: jspb.Message.getFloatingPointFieldWithDefault(msg, 2, 0.0) }; if (includeInstance) { @@ -1673,23 +1678,23 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.toObject = function /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode} + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode; - return proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee; + return proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode} + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -1697,24 +1702,12 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.deserializeBinaryFr var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.Status} */ (reader.readEnum()); - msg.setStatus(value); + var value = /** @type {number} */ (reader.readDouble()); + msg.setRelay(value); break; case 2: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setProTxHash(value); - break; - case 3: - var value = /** @type {number} */ (reader.readUint32()); - msg.setPosePenalty(value); - break; - case 4: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setIsSynced(value); - break; - case 5: var value = /** @type {number} */ (reader.readDouble()); - msg.setSyncProgress(value); + msg.setIncremental(value); break; default: reader.skipField(); @@ -1729,9 +1722,9 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.deserializeBinaryFr * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -1739,44 +1732,23 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.prototype.serialize /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode} message + * @param {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getStatus(); + f = message.getRelay(); if (f !== 0.0) { - writer.writeEnum( + writer.writeDouble( 1, f ); } - f = message.getProTxHash_asU8(); - if (f.length > 0) { - writer.writeBytes( - 2, - f - ); - } - f = message.getPosePenalty(); - if (f !== 0) { - writer.writeUint32( - 3, - f - ); - } - f = message.getIsSynced(); - if (f) { - writer.writeBool( - 4, - f - ); - } - f = message.getSyncProgress(); + f = message.getIncremental(); if (f !== 0.0) { writer.writeDouble( - 5, + 2, f ); } @@ -1784,130 +1756,38 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.serializeBinaryToWr /** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.Status = { - UNKNOWN: 0, - WAITING_FOR_PROTX: 1, - POSE_BANNED: 2, - REMOVED: 3, - OPERATOR_KEY_CHANGED: 4, - PROTX_IP_CHANGED: 5, - READY: 6, - ERROR: 7 -}; - -/** - * optional Status status = 1; - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.Status} - */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.prototype.getStatus = function() { - return /** @type {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.Status} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); -}; - - -/** - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.Status} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode} returns this - */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.prototype.setStatus = function(value) { - return jspb.Message.setProto3EnumField(this, 1, value); -}; - - -/** - * optional bytes pro_tx_hash = 2; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.prototype.getProTxHash = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); -}; - - -/** - * optional bytes pro_tx_hash = 2; - * This is a type-conversion wrapper around `getProTxHash()` - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.prototype.getProTxHash_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getProTxHash())); -}; - - -/** - * optional bytes pro_tx_hash = 2; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getProTxHash()` - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.prototype.getProTxHash_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getProTxHash())); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode} returns this - */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.prototype.setProTxHash = function(value) { - return jspb.Message.setProto3BytesField(this, 2, value); -}; - - -/** - * optional uint32 pose_penalty = 3; + * optional double relay = 1; * @return {number} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.prototype.getPosePenalty = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee.prototype.getRelay = function() { + return /** @type {number} */ (jspb.Message.getFloatingPointFieldWithDefault(this, 1, 0.0)); }; /** * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode} returns this - */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.prototype.setPosePenalty = function(value) { - return jspb.Message.setProto3IntField(this, 3, value); -}; - - -/** - * optional bool is_synced = 4; - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.prototype.getIsSynced = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 4, false)); -}; - - -/** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.prototype.setIsSynced = function(value) { - return jspb.Message.setProto3BooleanField(this, 4, value); +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee.prototype.setRelay = function(value) { + return jspb.Message.setProto3FloatField(this, 1, value); }; /** - * optional double sync_progress = 5; + * optional double incremental = 2; * @return {number} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.prototype.getSyncProgress = function() { - return /** @type {number} */ (jspb.Message.getFloatingPointFieldWithDefault(this, 5, 0.0)); +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee.prototype.getIncremental = function() { + return /** @type {number} */ (jspb.Message.getFloatingPointFieldWithDefault(this, 2, 0.0)); }; /** * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode.prototype.setSyncProgress = function(value) { - return jspb.Message.setProto3FloatField(this, 5, value); +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee.prototype.setIncremental = function(value) { + return jspb.Message.setProto3FloatField(this, 2, value); }; @@ -1927,8 +1807,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network.toObject(opt_includeInstance, this); }; @@ -1937,14 +1817,14 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.prototype.toObject * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network.toObject = function(includeInstance, msg) { var f, obj = { - relay: jspb.Message.getFloatingPointFieldWithDefault(msg, 1, 0.0), - incremental: jspb.Message.getFloatingPointFieldWithDefault(msg, 2, 0.0) + peersCount: jspb.Message.getFieldWithDefault(msg, 1, 0), + fee: (f = msg.getFee()) && proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee.toObject(includeInstance, f) }; if (includeInstance) { @@ -1958,23 +1838,23 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.toObject = function /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee} + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee; - return proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network; + return proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee} + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -1982,12 +1862,13 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.deserializeBinaryFr var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {number} */ (reader.readDouble()); - msg.setRelay(value); + var value = /** @type {number} */ (reader.readUint32()); + msg.setPeersCount(value); break; case 2: - var value = /** @type {number} */ (reader.readDouble()); - msg.setIncremental(value); + var value = new proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee.deserializeBinaryFromReader); + msg.setFee(value); break; default: reader.skipField(); @@ -2002,9 +1883,9 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.deserializeBinaryFr * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -2012,234 +1893,220 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.prototype.serialize /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee} message + * @param {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getRelay(); - if (f !== 0.0) { - writer.writeDouble( + f = message.getPeersCount(); + if (f !== 0) { + writer.writeUint32( 1, f ); } - f = message.getIncremental(); - if (f !== 0.0) { - writer.writeDouble( + f = message.getFee(); + if (f != null) { + writer.writeMessage( 2, - f + f, + proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee.serializeBinaryToWriter ); } }; /** - * optional double relay = 1; + * optional uint32 peers_count = 1; * @return {number} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.prototype.getRelay = function() { - return /** @type {number} */ (jspb.Message.getFloatingPointFieldWithDefault(this, 1, 0.0)); +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network.prototype.getPeersCount = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); }; /** * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.prototype.setRelay = function(value) { - return jspb.Message.setProto3FloatField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network.prototype.setPeersCount = function(value) { + return jspb.Message.setProto3IntField(this, 1, value); }; /** - * optional double incremental = 2; - * @return {number} + * optional NetworkFee fee = 2; + * @return {?proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.prototype.getIncremental = function() { - return /** @type {number} */ (jspb.Message.getFloatingPointFieldWithDefault(this, 2, 0.0)); +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network.prototype.getFee = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee, 2)); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee} returns this - */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.prototype.setIncremental = function(value) { - return jspb.Message.setProto3FloatField(this, 2, value); + * @param {?proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.NetworkFee|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network} returns this +*/ +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network.prototype.setFee = function(value) { + return jspb.Message.setWrapperField(this, 2, value); }; +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network} returns this + */ +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network.prototype.clearFee = function() { + return this.setFee(undefined); +}; - -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Network.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetStatusResponse.Network.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network.prototype.hasFee = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Network} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * optional Version version = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Network.toObject = function(includeInstance, msg) { - var f, obj = { - peersCount: jspb.Message.getFieldWithDefault(msg, 1, 0), - fee: (f = msg.getFee()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.toObject(includeInstance, f) - }; +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.prototype.getVersion = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version, 1)); +}; - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Version|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.prototype.setVersion = function(value) { + return jspb.Message.setWrapperField(this, 1, value); }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Network} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Network.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.Network; - return proto.org.dash.platform.dapi.v0.GetStatusResponse.Network.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.prototype.clearVersion = function() { + return this.setVersion(undefined); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Network} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Network} - */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Network.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {number} */ (reader.readUint32()); - msg.setPeersCount(value); - break; - case 2: - var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.deserializeBinaryFromReader); - msg.setFee(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.prototype.hasVersion = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} + * optional Time time = 2; + * @return {?proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Network.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetStatusResponse.Network.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.prototype.getTime = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time, 2)); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Network} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * @param {?proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Time|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.prototype.setTime = function(value) { + return jspb.Message.setWrapperField(this, 2, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Network.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getPeersCount(); - if (f !== 0) { - writer.writeUint32( - 1, - f - ); - } - f = message.getFee(); - if (f != null) { - writer.writeMessage( - 2, - f, - proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee.serializeBinaryToWriter - ); - } +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.prototype.clearTime = function() { + return this.setTime(undefined); }; /** - * optional uint32 peers_count = 1; + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.prototype.hasTime = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional Status status = 3; + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Status} + */ +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.prototype.getStatus = function() { + return /** @type {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Status} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Status} value + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.prototype.setStatus = function(value) { + return jspb.Message.setProto3EnumField(this, 3, value); +}; + + +/** + * optional double sync_progress = 4; * @return {number} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Network.prototype.getPeersCount = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.prototype.getSyncProgress = function() { + return /** @type {number} */ (jspb.Message.getFloatingPointFieldWithDefault(this, 4, 0.0)); }; /** * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Network} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Network.prototype.setPeersCount = function(value) { - return jspb.Message.setProto3IntField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.prototype.setSyncProgress = function(value) { + return jspb.Message.setProto3FloatField(this, 4, value); }; /** - * optional NetworkFee fee = 2; - * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee} + * optional Chain chain = 5; + * @return {?proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Network.prototype.getFee = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee, 2)); +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.prototype.getChain = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain, 5)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.NetworkFee|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Network} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Chain|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Network.prototype.setFee = function(value) { - return jspb.Message.setWrapperField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.prototype.setChain = function(value) { + return jspb.Message.setWrapperField(this, 5, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Network} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Network.prototype.clearFee = function() { - return this.setFee(undefined); +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.prototype.clearChain = function() { + return this.setChain(undefined); }; @@ -2247,36 +2114,36 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.Network.prototype.clearFee = f * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.Network.prototype.hasFee = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.prototype.hasChain = function() { + return jspb.Message.getField(this, 5) != null; }; /** - * optional Version version = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.Version} + * optional Network network = 7; + * @return {?proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.getVersion = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.Version} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.Version, 1)); +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.prototype.getNetwork = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network, 7)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.Version|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.Network|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.setVersion = function(value) { - return jspb.Message.setWrapperField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.prototype.setNetwork = function(value) { + return jspb.Message.setWrapperField(this, 7, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.clearVersion = function() { - return this.setVersion(undefined); +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.prototype.clearNetwork = function() { + return this.setNetwork(undefined); }; @@ -2284,192 +2151,397 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.clearVersion = funct * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.hasVersion = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetBlockchainStatusResponse.prototype.hasNetwork = function() { + return jspb.Message.getField(this, 7) != null; }; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * optional Time time = 2; - * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.Time} + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.getTime = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.Time} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.Time, 2)); +proto.org.dash.platform.dapi.v0.GetMasternodeStatusRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetMasternodeStatusRequest.toObject(opt_includeInstance, this); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.Time|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse} returns this -*/ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.setTime = function(value) { - return jspb.Message.setWrapperField(this, 2, value); + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetMasternodeStatusRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetMasternodeStatusRequest.toObject = function(includeInstance, msg) { + var f, obj = { + + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse} returns this + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetMasternodeStatusRequest} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.clearTime = function() { - return this.setTime(undefined); +proto.org.dash.platform.dapi.v0.GetMasternodeStatusRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetMasternodeStatusRequest; + return proto.org.dash.platform.dapi.v0.GetMasternodeStatusRequest.deserializeBinaryFromReader(msg, reader); }; /** - * Returns whether this field is set. - * @return {boolean} + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetMasternodeStatusRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetMasternodeStatusRequest} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.hasTime = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetMasternodeStatusRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * optional Status status = 3; - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Status} + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.getStatus = function() { - return /** @type {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Status} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); +proto.org.dash.platform.dapi.v0.GetMasternodeStatusRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetMasternodeStatusRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.Status} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse} returns this + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetMasternodeStatusRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.setStatus = function(value) { - return jspb.Message.setProto3EnumField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetMasternodeStatusRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; }; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * optional double sync_progress = 4; - * @return {number} + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.getSyncProgress = function() { - return /** @type {number} */ (jspb.Message.getFloatingPointFieldWithDefault(this, 4, 0.0)); +proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.toObject(opt_includeInstance, this); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse} returns this + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.setSyncProgress = function(value) { - return jspb.Message.setProto3FloatField(this, 4, value); +proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.toObject = function(includeInstance, msg) { + var f, obj = { + status: jspb.Message.getFieldWithDefault(msg, 1, 0), + proTxHash: msg.getProTxHash_asB64(), + posePenalty: jspb.Message.getFieldWithDefault(msg, 3, 0), + isSynced: jspb.Message.getBooleanFieldWithDefault(msg, 4, false), + syncProgress: jspb.Message.getFloatingPointFieldWithDefault(msg, 5, 0.0) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * optional Chain chain = 5; - * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain} + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.getChain = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain, 5)); +proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse; + return proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.deserializeBinaryFromReader(msg, reader); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.Chain|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse} returns this -*/ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.setChain = function(value) { - return jspb.Message.setWrapperField(this, 5, value); + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse} + */ +proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.Status} */ (reader.readEnum()); + msg.setStatus(value); + break; + case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setProTxHash(value); + break; + case 3: + var value = /** @type {number} */ (reader.readUint32()); + msg.setPosePenalty(value); + break; + case 4: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setIsSynced(value); + break; + case 5: + var value = /** @type {number} */ (reader.readDouble()); + msg.setSyncProgress(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse} returns this + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.clearChain = function() { - return this.setChain(undefined); +proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * Returns whether this field is set. - * @return {boolean} + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.hasChain = function() { - return jspb.Message.getField(this, 5) != null; +proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getStatus(); + if (f !== 0.0) { + writer.writeEnum( + 1, + f + ); + } + f = message.getProTxHash_asU8(); + if (f.length > 0) { + writer.writeBytes( + 2, + f + ); + } + f = message.getPosePenalty(); + if (f !== 0) { + writer.writeUint32( + 3, + f + ); + } + f = message.getIsSynced(); + if (f) { + writer.writeBool( + 4, + f + ); + } + f = message.getSyncProgress(); + if (f !== 0.0) { + writer.writeDouble( + 5, + f + ); + } }; /** - * optional Masternode masternode = 6; - * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode} + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.Status = { + UNKNOWN: 0, + WAITING_FOR_PROTX: 1, + POSE_BANNED: 2, + REMOVED: 3, + OPERATOR_KEY_CHANGED: 4, + PROTX_IP_CHANGED: 5, + READY: 6, + ERROR: 7 +}; + +/** + * optional Status status = 1; + * @return {!proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.Status} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.getMasternode = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode, 6)); +proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.prototype.getStatus = function() { + return /** @type {!proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.Status} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.Masternode|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse} returns this -*/ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.setMasternode = function(value) { - return jspb.Message.setWrapperField(this, 6, value); + * @param {!proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.Status} value + * @return {!proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.prototype.setStatus = function(value) { + return jspb.Message.setProto3EnumField(this, 1, value); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse} returns this + * optional bytes pro_tx_hash = 2; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.clearMasternode = function() { - return this.setMasternode(undefined); +proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.prototype.getProTxHash = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** - * Returns whether this field is set. - * @return {boolean} + * optional bytes pro_tx_hash = 2; + * This is a type-conversion wrapper around `getProTxHash()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.hasMasternode = function() { - return jspb.Message.getField(this, 6) != null; +proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.prototype.getProTxHash_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getProTxHash())); }; /** - * optional Network network = 7; - * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.Network} + * optional bytes pro_tx_hash = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getProTxHash()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.getNetwork = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.Network} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.Network, 7)); +proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.prototype.getProTxHash_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getProTxHash())); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.Network|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse} returns this -*/ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.setNetwork = function(value) { - return jspb.Message.setWrapperField(this, 7, value); + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.prototype.setProTxHash = function(value) { + return jspb.Message.setProto3BytesField(this, 2, value); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse} returns this + * optional uint32 pose_penalty = 3; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.clearNetwork = function() { - return this.setNetwork(undefined); +proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.prototype.getPosePenalty = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); }; /** - * Returns whether this field is set. + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.prototype.setPosePenalty = function(value) { + return jspb.Message.setProto3IntField(this, 3, value); +}; + + +/** + * optional bool is_synced = 4; * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.hasNetwork = function() { - return jspb.Message.getField(this, 7) != null; +proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.prototype.getIsSynced = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 4, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.prototype.setIsSynced = function(value) { + return jspb.Message.setProto3BooleanField(this, 4, value); +}; + + +/** + * optional double sync_progress = 5; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.prototype.getSyncProgress = function() { + return /** @type {number} */ (jspb.Message.getFloatingPointFieldWithDefault(this, 5, 0.0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetMasternodeStatusResponse.prototype.setSyncProgress = function(value) { + return jspb.Message.setProto3FloatField(this, 5, value); }; diff --git a/packages/dapi-grpc/clients/core/v0/web/core_pb_service.d.ts b/packages/dapi-grpc/clients/core/v0/web/core_pb_service.d.ts index 9b635554ba..8dd8513d80 100644 --- a/packages/dapi-grpc/clients/core/v0/web/core_pb_service.d.ts +++ b/packages/dapi-grpc/clients/core/v0/web/core_pb_service.d.ts @@ -4,13 +4,22 @@ import * as core_pb from "./core_pb"; import {grpc} from "@improbable-eng/grpc-web"; -type CoregetStatus = { +type CoregetBlockchainStatus = { readonly methodName: string; readonly service: typeof Core; readonly requestStream: false; readonly responseStream: false; - readonly requestType: typeof core_pb.GetStatusRequest; - readonly responseType: typeof core_pb.GetStatusResponse; + readonly requestType: typeof core_pb.GetBlockchainStatusRequest; + readonly responseType: typeof core_pb.GetBlockchainStatusResponse; +}; + +type CoregetMasternodeStatus = { + readonly methodName: string; + readonly service: typeof Core; + readonly requestStream: false; + readonly responseStream: false; + readonly requestType: typeof core_pb.GetMasternodeStatusRequest; + readonly responseType: typeof core_pb.GetMasternodeStatusResponse; }; type CoregetBlock = { @@ -69,7 +78,8 @@ type CoresubscribeToTransactionsWithProofs = { export class Core { static readonly serviceName: string; - static readonly getStatus: CoregetStatus; + static readonly getBlockchainStatus: CoregetBlockchainStatus; + static readonly getMasternodeStatus: CoregetMasternodeStatus; static readonly getBlock: CoregetBlock; static readonly broadcastTransaction: CorebroadcastTransaction; static readonly getTransaction: CoregetTransaction; @@ -110,14 +120,23 @@ export class CoreClient { readonly serviceHost: string; constructor(serviceHost: string, options?: grpc.RpcOptions); - getStatus( - requestMessage: core_pb.GetStatusRequest, + getBlockchainStatus( + requestMessage: core_pb.GetBlockchainStatusRequest, + metadata: grpc.Metadata, + callback: (error: ServiceError|null, responseMessage: core_pb.GetBlockchainStatusResponse|null) => void + ): UnaryResponse; + getBlockchainStatus( + requestMessage: core_pb.GetBlockchainStatusRequest, + callback: (error: ServiceError|null, responseMessage: core_pb.GetBlockchainStatusResponse|null) => void + ): UnaryResponse; + getMasternodeStatus( + requestMessage: core_pb.GetMasternodeStatusRequest, metadata: grpc.Metadata, - callback: (error: ServiceError|null, responseMessage: core_pb.GetStatusResponse|null) => void + callback: (error: ServiceError|null, responseMessage: core_pb.GetMasternodeStatusResponse|null) => void ): UnaryResponse; - getStatus( - requestMessage: core_pb.GetStatusRequest, - callback: (error: ServiceError|null, responseMessage: core_pb.GetStatusResponse|null) => void + getMasternodeStatus( + requestMessage: core_pb.GetMasternodeStatusRequest, + callback: (error: ServiceError|null, responseMessage: core_pb.GetMasternodeStatusResponse|null) => void ): UnaryResponse; getBlock( requestMessage: core_pb.GetBlockRequest, diff --git a/packages/dapi-grpc/clients/core/v0/web/core_pb_service.js b/packages/dapi-grpc/clients/core/v0/web/core_pb_service.js index 7eeda0af88..96c661a7c4 100644 --- a/packages/dapi-grpc/clients/core/v0/web/core_pb_service.js +++ b/packages/dapi-grpc/clients/core/v0/web/core_pb_service.js @@ -10,13 +10,22 @@ var Core = (function () { return Core; }()); -Core.getStatus = { - methodName: "getStatus", +Core.getBlockchainStatus = { + methodName: "getBlockchainStatus", service: Core, requestStream: false, responseStream: false, - requestType: core_pb.GetStatusRequest, - responseType: core_pb.GetStatusResponse + requestType: core_pb.GetBlockchainStatusRequest, + responseType: core_pb.GetBlockchainStatusResponse +}; + +Core.getMasternodeStatus = { + methodName: "getMasternodeStatus", + service: Core, + requestStream: false, + responseStream: false, + requestType: core_pb.GetMasternodeStatusRequest, + responseType: core_pb.GetMasternodeStatusResponse }; Core.getBlock = { @@ -80,11 +89,42 @@ function CoreClient(serviceHost, options) { this.options = options || {}; } -CoreClient.prototype.getStatus = function getStatus(requestMessage, metadata, callback) { +CoreClient.prototype.getBlockchainStatus = function getBlockchainStatus(requestMessage, metadata, callback) { + if (arguments.length === 2) { + callback = arguments[1]; + } + var client = grpc.unary(Core.getBlockchainStatus, { + request: requestMessage, + host: this.serviceHost, + metadata: metadata, + transport: this.options.transport, + debug: this.options.debug, + onEnd: function (response) { + if (callback) { + if (response.status !== grpc.Code.OK) { + var err = new Error(response.statusMessage); + err.code = response.status; + err.metadata = response.trailers; + callback(err, null); + } else { + callback(null, response.message); + } + } + } + }); + return { + cancel: function () { + callback = null; + client.close(); + } + }; +}; + +CoreClient.prototype.getMasternodeStatus = function getMasternodeStatus(requestMessage, metadata, callback) { if (arguments.length === 2) { callback = arguments[1]; } - var client = grpc.unary(Core.getStatus, { + var client = grpc.unary(Core.getMasternodeStatus, { request: requestMessage, host: this.serviceHost, metadata: metadata, diff --git a/packages/dapi-grpc/protos/core/v0/core.proto b/packages/dapi-grpc/protos/core/v0/core.proto index 2ba33d1953..3defd65df3 100644 --- a/packages/dapi-grpc/protos/core/v0/core.proto +++ b/packages/dapi-grpc/protos/core/v0/core.proto @@ -3,7 +3,8 @@ syntax = "proto3"; package org.dash.platform.dapi.v0; service Core { - rpc getStatus (GetStatusRequest) returns (GetStatusResponse); + rpc getBlockchainStatus (GetBlockchainStatusRequest) returns (GetBlockchainStatusResponse); + rpc getMasternodeStatus (GetMasternodeStatusRequest) returns (GetMasternodeStatusResponse); rpc getBlock (GetBlockRequest) returns (GetBlockResponse); rpc broadcastTransaction (BroadcastTransactionRequest) returns (BroadcastTransactionResponse); rpc getTransaction (GetTransactionRequest) returns (GetTransactionResponse); @@ -12,11 +13,11 @@ service Core { rpc subscribeToTransactionsWithProofs (TransactionsWithProofsRequest) returns (stream TransactionsWithProofsResponse); } -message GetStatusRequest { +message GetBlockchainStatusRequest { } -message GetStatusResponse { +message GetBlockchainStatusResponse { message Version { uint32 protocol = 1; uint32 software = 2; @@ -47,25 +48,6 @@ message GetStatusResponse { double sync_progress = 8; } - message Masternode { - enum Status { - UNKNOWN = 0; - WAITING_FOR_PROTX = 1; - POSE_BANNED = 2; - REMOVED = 3; - OPERATOR_KEY_CHANGED = 4; - PROTX_IP_CHANGED = 5; - READY = 6; - ERROR = 7; - } - - Status status = 1; - bytes pro_tx_hash = 2; - uint32 pose_penalty = 3; - bool is_synced = 4; - double sync_progress = 5; - } - message NetworkFee { double relay = 1; double incremental = 2; @@ -81,10 +63,32 @@ message GetStatusResponse { Status status = 3; double sync_progress = 4; Chain chain = 5; - Masternode masternode = 6; Network network = 7; } +message GetMasternodeStatusRequest { + +} + +message GetMasternodeStatusResponse { + enum Status { + UNKNOWN = 0; + WAITING_FOR_PROTX = 1; + POSE_BANNED = 2; + REMOVED = 3; + OPERATOR_KEY_CHANGED = 4; + PROTX_IP_CHANGED = 5; + READY = 6; + ERROR = 7; + } + + Status status = 1; + bytes pro_tx_hash = 2; + uint32 pose_penalty = 3; + bool is_synced = 4; + double sync_progress = 5; +} + message GetBlockRequest { oneof block { uint32 height = 1; diff --git a/packages/dapi-grpc/src/core/proto/org.dash.platform.dapi.v0.rs b/packages/dapi-grpc/src/core/proto/org.dash.platform.dapi.v0.rs index 05b6d41005..579b190333 100644 --- a/packages/dapi-grpc/src/core/proto/org.dash.platform.dapi.v0.rs +++ b/packages/dapi-grpc/src/core/proto/org.dash.platform.dapi.v0.rs @@ -2,29 +2,27 @@ #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct GetStatusRequest {} +pub struct GetBlockchainStatusRequest {} #[derive(::serde::Serialize, ::serde::Deserialize)] #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct GetStatusResponse { +pub struct GetBlockchainStatusResponse { #[prost(message, optional, tag = "1")] - pub version: ::core::option::Option, + pub version: ::core::option::Option, #[prost(message, optional, tag = "2")] - pub time: ::core::option::Option, - #[prost(enumeration = "get_status_response::Status", tag = "3")] + pub time: ::core::option::Option, + #[prost(enumeration = "get_blockchain_status_response::Status", tag = "3")] pub status: i32, #[prost(double, tag = "4")] pub sync_progress: f64, #[prost(message, optional, tag = "5")] - pub chain: ::core::option::Option, - #[prost(message, optional, tag = "6")] - pub masternode: ::core::option::Option, + pub chain: ::core::option::Option, #[prost(message, optional, tag = "7")] - pub network: ::core::option::Option, + pub network: ::core::option::Option, } -/// Nested message and enum types in `GetStatusResponse`. -pub mod get_status_response { +/// Nested message and enum types in `GetBlockchainStatusResponse`. +pub mod get_blockchain_status_response { #[derive(::serde::Serialize, ::serde::Deserialize)] #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] @@ -75,80 +73,6 @@ pub mod get_status_response { #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] - pub struct Masternode { - #[prost(enumeration = "masternode::Status", tag = "1")] - pub status: i32, - #[prost(bytes = "vec", tag = "2")] - pub pro_tx_hash: ::prost::alloc::vec::Vec, - #[prost(uint32, tag = "3")] - pub pose_penalty: u32, - #[prost(bool, tag = "4")] - pub is_synced: bool, - #[prost(double, tag = "5")] - pub sync_progress: f64, - } - /// Nested message and enum types in `Masternode`. - pub mod masternode { - #[derive(::serde::Serialize, ::serde::Deserialize)] - #[derive( - Clone, - Copy, - Debug, - PartialEq, - Eq, - Hash, - PartialOrd, - Ord, - ::prost::Enumeration - )] - #[repr(i32)] - pub enum Status { - Unknown = 0, - WaitingForProtx = 1, - PoseBanned = 2, - Removed = 3, - OperatorKeyChanged = 4, - ProtxIpChanged = 5, - Ready = 6, - Error = 7, - } - impl Status { - /// String value of the enum field names used in the ProtoBuf definition. - /// - /// The values are not transformed in any way and thus are considered stable - /// (if the ProtoBuf definition does not change) and safe for programmatic use. - pub fn as_str_name(&self) -> &'static str { - match self { - Status::Unknown => "UNKNOWN", - Status::WaitingForProtx => "WAITING_FOR_PROTX", - Status::PoseBanned => "POSE_BANNED", - Status::Removed => "REMOVED", - Status::OperatorKeyChanged => "OPERATOR_KEY_CHANGED", - Status::ProtxIpChanged => "PROTX_IP_CHANGED", - Status::Ready => "READY", - Status::Error => "ERROR", - } - } - /// Creates an enum from field names used in the ProtoBuf definition. - pub fn from_str_name(value: &str) -> ::core::option::Option { - match value { - "UNKNOWN" => Some(Self::Unknown), - "WAITING_FOR_PROTX" => Some(Self::WaitingForProtx), - "POSE_BANNED" => Some(Self::PoseBanned), - "REMOVED" => Some(Self::Removed), - "OPERATOR_KEY_CHANGED" => Some(Self::OperatorKeyChanged), - "PROTX_IP_CHANGED" => Some(Self::ProtxIpChanged), - "READY" => Some(Self::Ready), - "ERROR" => Some(Self::Error), - _ => None, - } - } - } - } - #[derive(::serde::Serialize, ::serde::Deserialize)] - #[derive(::dapi_grpc_macros::Mockable)] - #[allow(clippy::derive_partial_eq_without_eq)] - #[derive(Clone, PartialEq, ::prost::Message)] pub struct NetworkFee { #[prost(double, tag = "1")] pub relay: f64, @@ -213,6 +137,85 @@ pub mod get_status_response { #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] +pub struct GetMasternodeStatusRequest {} +#[derive(::serde::Serialize, ::serde::Deserialize)] +#[derive(::dapi_grpc_macros::Mockable)] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct GetMasternodeStatusResponse { + #[prost(enumeration = "get_masternode_status_response::Status", tag = "1")] + pub status: i32, + #[prost(bytes = "vec", tag = "2")] + pub pro_tx_hash: ::prost::alloc::vec::Vec, + #[prost(uint32, tag = "3")] + pub pose_penalty: u32, + #[prost(bool, tag = "4")] + pub is_synced: bool, + #[prost(double, tag = "5")] + pub sync_progress: f64, +} +/// Nested message and enum types in `GetMasternodeStatusResponse`. +pub mod get_masternode_status_response { + #[derive(::serde::Serialize, ::serde::Deserialize)] + #[derive( + Clone, + Copy, + Debug, + PartialEq, + Eq, + Hash, + PartialOrd, + Ord, + ::prost::Enumeration + )] + #[repr(i32)] + pub enum Status { + Unknown = 0, + WaitingForProtx = 1, + PoseBanned = 2, + Removed = 3, + OperatorKeyChanged = 4, + ProtxIpChanged = 5, + Ready = 6, + Error = 7, + } + impl Status { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Status::Unknown => "UNKNOWN", + Status::WaitingForProtx => "WAITING_FOR_PROTX", + Status::PoseBanned => "POSE_BANNED", + Status::Removed => "REMOVED", + Status::OperatorKeyChanged => "OPERATOR_KEY_CHANGED", + Status::ProtxIpChanged => "PROTX_IP_CHANGED", + Status::Ready => "READY", + Status::Error => "ERROR", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "UNKNOWN" => Some(Self::Unknown), + "WAITING_FOR_PROTX" => Some(Self::WaitingForProtx), + "POSE_BANNED" => Some(Self::PoseBanned), + "REMOVED" => Some(Self::Removed), + "OPERATOR_KEY_CHANGED" => Some(Self::OperatorKeyChanged), + "PROTX_IP_CHANGED" => Some(Self::ProtxIpChanged), + "READY" => Some(Self::Ready), + "ERROR" => Some(Self::Error), + _ => None, + } + } + } +} +#[derive(::serde::Serialize, ::serde::Deserialize)] +#[derive(::dapi_grpc_macros::Mockable)] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] pub struct GetBlockRequest { #[prost(oneof = "get_block_request::Block", tags = "1, 2")] pub block: ::core::option::Option, @@ -516,11 +519,11 @@ pub mod core_client { self.inner = self.inner.max_encoding_message_size(limit); self } - pub async fn get_status( + pub async fn get_blockchain_status( &mut self, - request: impl tonic::IntoRequest, + request: impl tonic::IntoRequest, ) -> std::result::Result< - tonic::Response, + tonic::Response, tonic::Status, > { self.inner @@ -534,11 +537,46 @@ pub mod core_client { })?; let codec = tonic::codec::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( - "/org.dash.platform.dapi.v0.Core/getStatus", + "/org.dash.platform.dapi.v0.Core/getBlockchainStatus", ); let mut req = request.into_request(); req.extensions_mut() - .insert(GrpcMethod::new("org.dash.platform.dapi.v0.Core", "getStatus")); + .insert( + GrpcMethod::new( + "org.dash.platform.dapi.v0.Core", + "getBlockchainStatus", + ), + ); + self.inner.unary(req, path, codec).await + } + pub async fn get_masternode_status( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/org.dash.platform.dapi.v0.Core/getMasternodeStatus", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "org.dash.platform.dapi.v0.Core", + "getMasternodeStatus", + ), + ); self.inner.unary(req, path, codec).await } pub async fn get_block( @@ -726,11 +764,18 @@ pub mod core_server { /// Generated trait containing gRPC methods that should be implemented for use with CoreServer. #[async_trait] pub trait Core: Send + Sync + 'static { - async fn get_status( + async fn get_blockchain_status( &self, - request: tonic::Request, + request: tonic::Request, ) -> std::result::Result< - tonic::Response, + tonic::Response, + tonic::Status, + >; + async fn get_masternode_status( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, tonic::Status, >; async fn get_block( @@ -873,22 +918,72 @@ pub mod core_server { fn call(&mut self, req: http::Request) -> Self::Future { let inner = self.inner.clone(); match req.uri().path() { - "/org.dash.platform.dapi.v0.Core/getStatus" => { + "/org.dash.platform.dapi.v0.Core/getBlockchainStatus" => { + #[allow(non_camel_case_types)] + struct getBlockchainStatusSvc(pub Arc); + impl< + T: Core, + > tonic::server::UnaryService + for getBlockchainStatusSvc { + type Response = super::GetBlockchainStatusResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + (*inner).get_blockchain_status(request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = getBlockchainStatusSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/org.dash.platform.dapi.v0.Core/getMasternodeStatus" => { #[allow(non_camel_case_types)] - struct getStatusSvc(pub Arc); - impl tonic::server::UnaryService - for getStatusSvc { - type Response = super::GetStatusResponse; + struct getMasternodeStatusSvc(pub Arc); + impl< + T: Core, + > tonic::server::UnaryService + for getMasternodeStatusSvc { + type Response = super::GetMasternodeStatusResponse; type Future = BoxFuture< tonic::Response, tonic::Status, >; fn call( &mut self, - request: tonic::Request, + request: tonic::Request, ) -> Self::Future { let inner = Arc::clone(&self.0); - let fut = async move { (*inner).get_status(request).await }; + let fut = async move { + (*inner).get_masternode_status(request).await + }; Box::pin(fut) } } @@ -899,7 +994,7 @@ pub mod core_server { let inner = self.inner.clone(); let fut = async move { let inner = inner.0; - let method = getStatusSvc(inner); + let method = getMasternodeStatusSvc(inner); let codec = tonic::codec::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( diff --git a/packages/dapi-grpc/test/unit/clients/core/v0/nodejs/CorePromiseClient.spec.js b/packages/dapi-grpc/test/unit/clients/core/v0/nodejs/CorePromiseClient.spec.js index 7710a63e2c..3ee9ce6e2a 100644 --- a/packages/dapi-grpc/test/unit/clients/core/v0/nodejs/CorePromiseClient.spec.js +++ b/packages/dapi-grpc/test/unit/clients/core/v0/nodejs/CorePromiseClient.spec.js @@ -11,7 +11,8 @@ describe('CorePromiseClient', () => { corePromiseClient = new CorePromiseClient('https://localhost/'); corePromiseClient.client = { - getStatus: this.sinon.stub().resolves(response), + getBlockchainStatus: this.sinon.stub().resolves(response), + getMasternodeStatus: this.sinon.stub().resolves(response), getBlock: this.sinon.stub().resolves(response), broadcastTransaction: this.sinon.stub().resolves(response), getTransaction: this.sinon.stub().resolves(response), @@ -20,17 +21,37 @@ describe('CorePromiseClient', () => { }; }); - describe('#getStatus', () => { - it('should return status', async () => { - const result = await corePromiseClient.getStatus(request); + describe('#getBlockchainStatus', () => { + it('should return core chain status', async () => { + const result = await corePromiseClient.getBlockchainStatus(request); + + expect(result).to.equal(response); + expect(corePromiseClient.client.getBlockchainStatus).to.be.calledOnceWith(request); + }); + + it('should throw an error when metadata is not an object', async () => { + try { + corePromiseClient.getBlockchainStatus({}, 'metadata'); + + expect.fail('Error was not thrown'); + } catch (e) { + expect(e.message).to.equal('metadata must be an object'); + } + }); + }); + + describe('#getMasternodeStatus', () => { + it('should return masternode status', async () => { + const result = await corePromiseClient.getMasternodeStatus(request); expect(result).to.equal(response); - expect(corePromiseClient.client.getStatus).to.be.calledOnceWith(request); + expect(corePromiseClient.client.getMasternodeStatus) + .to.be.calledOnceWith(request); }); it('should throw an error when metadata is not an object', async () => { try { - corePromiseClient.getStatus({}, 'metadata'); + corePromiseClient.getMasternodeStatus({}, 'metadata'); expect.fail('Error was not thrown'); } catch (e) { diff --git a/packages/dapi-grpc/test/unit/getCoreDefinition.spec.js b/packages/dapi-grpc/test/unit/getCoreDefinition.spec.js index d0dbdc78e0..c40fc73d4c 100644 --- a/packages/dapi-grpc/test/unit/getCoreDefinition.spec.js +++ b/packages/dapi-grpc/test/unit/getCoreDefinition.spec.js @@ -14,8 +14,11 @@ describe('getCoreDefinition', () => { expect(coreDefinition.service).to.have.property('getTransaction'); expect(coreDefinition.service.getTransaction.path).to.equal('/org.dash.platform.dapi.v0.Core/getTransaction'); - expect(coreDefinition.service).to.have.property('getStatus'); - expect(coreDefinition.service.getStatus.path).to.equal('/org.dash.platform.dapi.v0.Core/getStatus'); + expect(coreDefinition.service).to.have.property('getBlockchainStatus'); + expect(coreDefinition.service.getBlockchainStatus.path).to.equal('/org.dash.platform.dapi.v0.Core/getBlockchainStatus'); + + expect(coreDefinition.service).to.have.property('getMasternodeStatus'); + expect(coreDefinition.service.getMasternodeStatus.path).to.equal('/org.dash.platform.dapi.v0.Core/getMasternodeStatus'); expect(coreDefinition.service).to.have.property('getBlock'); expect(coreDefinition.service.getBlock.path).to.equal('/org.dash.platform.dapi.v0.Core/getBlock'); diff --git a/packages/dapi/lib/grpcServer/handlers/core/coreHandlersFactory.js b/packages/dapi/lib/grpcServer/handlers/core/coreHandlersFactory.js index b2a597a753..b5fb385c73 100644 --- a/packages/dapi/lib/grpcServer/handlers/core/coreHandlersFactory.js +++ b/packages/dapi/lib/grpcServer/handlers/core/coreHandlersFactory.js @@ -17,15 +17,18 @@ const { v0: { BroadcastTransactionRequest, GetTransactionRequest, - GetStatusRequest, + GetBlockchainStatusRequest, + GetMasternodeStatusRequest, GetBlockRequest, pbjs: { BroadcastTransactionRequest: PBJSBroadcastTransactionRequest, BroadcastTransactionResponse: PBJSBroadcastTransactionResponse, GetTransactionRequest: PBJSGetTransactionRequest, GetTransactionResponse: PBJSGetTransactionResponse, - GetStatusRequest: PBJSGetStatusRequest, - GetStatusResponse: PBJSGetStatusResponse, + GetBlockchainStatusRequest: PBJSGetBlockchainStatusRequest, + GetBlockchainStatusResponse: PBJSGetBlockchainStatusResponse, + GetMasternodeStatusRequest: PBJSGetMasternodeStatusRequest, + GetMasternodeStatusResponse: PBJSGetMasternodeStatusResponse, GetBlockRequest: PBJSGetBlockRequest, GetBlockResponse: PBJSGetBlockResponse, }, @@ -37,8 +40,11 @@ const logger = require('../../../logger'); const getBlockHandlerFactory = require( './getBlockHandlerFactory', ); -const getStatusHandlerFactory = require( - './getStatusHandlerFactory', +const getBlockchainStatusHandlerFactory = require( + './getBlockchainStatusHandlerFactory', +); +const getMasternodeStatusHandlerFactory = require( + './getMasternodeStatusHandlerFactory', ); const getTransactionHandlerFactory = require( './getTransactionHandlerFactory', @@ -68,17 +74,30 @@ function coreHandlersFactory(coreRPCClient, isProductionEnvironment) { wrapInErrorHandler(getBlockHandler), ); - // getStatus - const getStatusHandler = getStatusHandlerFactory(coreRPCClient); - const wrappedGetStatus = jsonToProtobufHandlerWrapper( + // getBlockchainStatus + const getBlockchainStatusHandler = getBlockchainStatusHandlerFactory(coreRPCClient); + const wrappedGetBlockchainStatus = jsonToProtobufHandlerWrapper( + jsonToProtobufFactory( + GetBlockchainStatusRequest, + PBJSGetBlockchainStatusRequest, + ), + protobufToJsonFactory( + PBJSGetBlockchainStatusResponse, + ), + wrapInErrorHandler(getBlockchainStatusHandler), + ); + + // getMasternodeStatus + const getMasternodeStatusHandler = getMasternodeStatusHandlerFactory(coreRPCClient); + const wrappedGetMasternodeStatus = jsonToProtobufHandlerWrapper( jsonToProtobufFactory( - GetStatusRequest, - PBJSGetStatusRequest, + GetMasternodeStatusRequest, + PBJSGetMasternodeStatusRequest, ), protobufToJsonFactory( - PBJSGetStatusResponse, + PBJSGetMasternodeStatusResponse, ), - wrapInErrorHandler(getStatusHandler), + wrapInErrorHandler(getMasternodeStatusHandler), ); // getTransaction @@ -109,7 +128,8 @@ function coreHandlersFactory(coreRPCClient, isProductionEnvironment) { return { getBlock: wrappedGetBlock, - getStatus: wrappedGetStatus, + getBlockchainStatus: wrappedGetBlockchainStatus, + getMasternodeStatus: wrappedGetMasternodeStatus, getTransaction: wrappedGetTransaction, broadcastTransaction: wrappedBroadcastTransaction, }; diff --git a/packages/dapi/lib/grpcServer/handlers/core/getBlockchainStatusHandlerFactory.js b/packages/dapi/lib/grpcServer/handlers/core/getBlockchainStatusHandlerFactory.js new file mode 100644 index 0000000000..067cb2e374 --- /dev/null +++ b/packages/dapi/lib/grpcServer/handlers/core/getBlockchainStatusHandlerFactory.js @@ -0,0 +1,75 @@ +const { + v0: { + GetBlockchainStatusResponse, + }, +} = require('@dashevo/dapi-grpc'); + +/** + * @param {CoreRpcClient} coreRPCClient + * @returns {getBlockchainStatusHandler} + */ +function getBlockchainStatusHandlerFactory(coreRPCClient) { + /** + * @typedef getBlockchainStatusHandler + * @return {Promise} + */ + async function getBlockchainStatusHandler() { + const [ + blockchainInfoResponse, + networkInfoResponse, + ] = await Promise.all([ + coreRPCClient.getBlockchainInfo(), + coreRPCClient.getNetworkInfo(), + ]); + + const response = new GetBlockchainStatusResponse(); + + const version = new GetBlockchainStatusResponse.Version(); + version.setProtocol(networkInfoResponse.protocolversion); + version.setSoftware(networkInfoResponse.version); + version.setAgent(networkInfoResponse.subversion); + + const time = new GetBlockchainStatusResponse.Time(); + time.setNow(Math.floor(Date.now() / 1000)); + time.setOffset(networkInfoResponse.timeoffset); + time.setMedian(blockchainInfoResponse.mediantime); + + const chain = new GetBlockchainStatusResponse.Chain(); + chain.setName(blockchainInfoResponse.chain); + chain.setBlocksCount(blockchainInfoResponse.blocks); + chain.setHeadersCount(blockchainInfoResponse.headers); + chain.setBestBlockHash(Buffer.from(blockchainInfoResponse.bestblockhash, 'hex')); + chain.setDifficulty(blockchainInfoResponse.difficulty); + chain.setChainWork(Buffer.from(blockchainInfoResponse.chainwork, 'hex')); + chain.setIsSynced(blockchainInfoResponse.verificationprogress === 1); + chain.setSyncProgress(blockchainInfoResponse.verificationprogress); + + const network = new GetBlockchainStatusResponse.Network(); + network.setPeersCount(networkInfoResponse.connections); + + const networkFee = new GetBlockchainStatusResponse.NetworkFee(); + networkFee.setRelay(networkInfoResponse.relayfee); + networkFee.setIncremental(networkInfoResponse.incrementalfee); + + network.setFee(networkFee); + + response.setVersion(version); + response.setTime(time); + response.setSyncProgress(blockchainInfoResponse.verificationprogress); + response.setChain(chain); + response.setNetwork(network); + + let status = GetBlockchainStatusResponse.Status.SYNCING; + if (blockchainInfoResponse.verificationprogress === 1) { + status = GetBlockchainStatusResponse.Status.READY; + } + + response.setStatus(status); + + return response; + } + + return getBlockchainStatusHandler; +} + +module.exports = getBlockchainStatusHandlerFactory; diff --git a/packages/dapi/lib/grpcServer/handlers/core/getMasternodeStatusHandlerFactory.js b/packages/dapi/lib/grpcServer/handlers/core/getMasternodeStatusHandlerFactory.js new file mode 100644 index 0000000000..abfc078200 --- /dev/null +++ b/packages/dapi/lib/grpcServer/handlers/core/getMasternodeStatusHandlerFactory.js @@ -0,0 +1,67 @@ +const { + v0: { + GetMasternodeStatusResponse, + }, +} = require('@dashevo/dapi-grpc'); + +/** + * @param {CoreRpcClient} coreRPCClient + * @returns {getMasternodeStatusHandler} + */ +function getMasternodeStatusHandlerFactory(coreRPCClient) { + /** + * @typedef getMasternodeStatusHandler + * @return {Promise} + */ + async function getMasternodeStatusHandler() { + const [ + mnSyncStatusResponse, + masternodeStatusResponse, + ] = await Promise.all([ + coreRPCClient.getMnSync('status'), + coreRPCClient.getMasternode('status'), + ]); + + const response = new GetMasternodeStatusResponse(); + + const masternodeStatus = GetMasternodeStatusResponse.Status[masternodeStatusResponse.state]; + + response.setStatus(masternodeStatus); + + if (masternodeStatusResponse.proTxHash) { + response.setProTxHash(Buffer.from(masternodeStatusResponse.proTxHash, 'hex')); + } + + if (masternodeStatusResponse.dmnState) { + response.setPosePenalty(masternodeStatusResponse.dmnState.PoSePenalty); + } + + response.setIsSynced(mnSyncStatusResponse.IsSynced); + + let syncProgress; + switch (mnSyncStatusResponse.AssetID) { + case 999: + syncProgress = 1; + break; + case 0: + syncProgress = 0; + break; + case 1: + syncProgress = 1 / 3; + break; + case 4: + syncProgress = 2 / 3; + break; + default: + syncProgress = 0; + } + + response.setSyncProgress(syncProgress); + + return response; + } + + return getMasternodeStatusHandler; +} + +module.exports = getMasternodeStatusHandlerFactory; diff --git a/packages/dapi/lib/grpcServer/handlers/core/getStatusHandlerFactory.js b/packages/dapi/lib/grpcServer/handlers/core/getStatusHandlerFactory.js deleted file mode 100644 index 3f76cfa63d..0000000000 --- a/packages/dapi/lib/grpcServer/handlers/core/getStatusHandlerFactory.js +++ /dev/null @@ -1,118 +0,0 @@ -const { - v0: { - GetStatusResponse, - }, -} = require('@dashevo/dapi-grpc'); - -/** - * @param {CoreRpcClient} coreRPCClient - * @returns {getStatusHandler} - */ -function getStatusHandlerFactory(coreRPCClient) { - /** - * @typedef getStatusHandler - * @return {Promise} - */ - async function getStatusHandler() { - const [ - blockchainInfoResponse, - networkInfoResponse, - mnSyncStatusResponse, - masternodeStatusResponse, - ] = await Promise.all([ - coreRPCClient.getBlockchainInfo(), - coreRPCClient.getNetworkInfo(), - coreRPCClient.getMnSync('status'), - coreRPCClient.getMasternode('status'), - ]); - - const response = new GetStatusResponse(); - - const version = new GetStatusResponse.Version(); - version.setProtocol(networkInfoResponse.protocolversion); - version.setSoftware(networkInfoResponse.version); - version.setAgent(networkInfoResponse.subversion); - - const time = new GetStatusResponse.Time(); - time.setNow(Math.floor(Date.now() / 1000)); - time.setOffset(networkInfoResponse.timeoffset); - time.setMedian(blockchainInfoResponse.mediantime); - - const chain = new GetStatusResponse.Chain(); - chain.setName(blockchainInfoResponse.chain); - chain.setBlocksCount(blockchainInfoResponse.blocks); - chain.setHeadersCount(blockchainInfoResponse.headers); - chain.setBestBlockHash(Buffer.from(blockchainInfoResponse.bestblockhash, 'hex')); - chain.setDifficulty(blockchainInfoResponse.difficulty); - chain.setChainWork(Buffer.from(blockchainInfoResponse.chainwork, 'hex')); - chain.setIsSynced(mnSyncStatusResponse.IsBlockchainSynced); - chain.setSyncProgress(blockchainInfoResponse.verificationprogress); - - const masternode = new GetStatusResponse.Masternode(); - - const masternodeStatus = GetStatusResponse.Masternode.Status[masternodeStatusResponse.state]; - - masternode.setStatus(masternodeStatus); - - if (masternodeStatusResponse.proTxHash) { - masternode.setProTxHash(Buffer.from(masternodeStatusResponse.proTxHash, 'hex')); - } - - if (masternodeStatusResponse.dmnState) { - masternode.setPosePenalty(masternodeStatusResponse.dmnState.PoSePenalty); - } - - masternode.setIsSynced(mnSyncStatusResponse.IsSynced); - - let syncProgress; - switch (mnSyncStatusResponse.AssetID) { - case 999: - syncProgress = 1; - break; - case 0: - syncProgress = 0; - break; - case 1: - syncProgress = 1 / 3; - break; - case 4: - syncProgress = 2 / 3; - break; - default: - syncProgress = 0; - } - - masternode.setSyncProgress(syncProgress); - - const network = new GetStatusResponse.Network(); - network.setPeersCount(networkInfoResponse.connections); - - const networkFee = new GetStatusResponse.NetworkFee(); - networkFee.setRelay(networkInfoResponse.relayfee); - networkFee.setIncremental(networkInfoResponse.incrementalfee); - - network.setFee(networkFee); - - response.setVersion(version); - response.setTime(time); - response.setSyncProgress(blockchainInfoResponse.verificationprogress); - response.setChain(chain); - response.setMasternode(masternode); - response.setNetwork(network); - - let status = GetStatusResponse.Status.NOT_STARTED; - if (mnSyncStatusResponse.IsBlockchainSynced && mnSyncStatusResponse.IsSynced) { - status = GetStatusResponse.Status.READY; - } else if (blockchainInfoResponse.verificationprogress > 0) { - status = GetStatusResponse.Status.SYNCING; - } - - response.setStatus(status); - - return response; - } - - return getStatusHandler; -} - -module.exports = getStatusHandlerFactory; diff --git a/packages/dapi/test/unit/grpcServer/handlers/core/getStatusHandlerFactory.spec.js b/packages/dapi/test/unit/grpcServer/handlers/core/getBlockchainStatusHandlerFactory.spec.js similarity index 56% rename from packages/dapi/test/unit/grpcServer/handlers/core/getStatusHandlerFactory.spec.js rename to packages/dapi/test/unit/grpcServer/handlers/core/getBlockchainStatusHandlerFactory.spec.js index 1a1558a444..d6bed46d4f 100644 --- a/packages/dapi/test/unit/grpcServer/handlers/core/getStatusHandlerFactory.spec.js +++ b/packages/dapi/test/unit/grpcServer/handlers/core/getBlockchainStatusHandlerFactory.spec.js @@ -1,34 +1,23 @@ const { v0: { - GetStatusResponse, + GetBlockchainStatusResponse, }, } = require('@dashevo/dapi-grpc'); -const getStatusHandlerFactory = require('../../../../../lib/grpcServer/handlers/core/getStatusHandlerFactory'); +const getBlockchainStatusHandlerFactory = require('../../../../../lib/grpcServer/handlers/core/getBlockchainStatusHandlerFactory'); const GrpcCallMock = require('../../../../../lib/test/mock/GrpcCallMock'); -describe('getStatusHandlerFactory', () => { +describe('getBlockchainStatusHandlerFactory', () => { let call; - let getStatusHandler; + let getBlockchainStatusHandler; let coreRPCClientMock; let now; let blockchainInfo; let networkInfo; - let mnSyncInfo; - let masternodeStatus; beforeEach(function beforeEach() { - mnSyncInfo = { - AssetID: 999, - AssetName: 'MASTERNODE_SYNC_FINISHED', - AssetStartTime: 1615466139, - Attempt: 0, - IsBlockchainSynced: true, - IsSynced: true, - }; - blockchainInfo = { chain: 'test', blocks: 460991, @@ -57,48 +46,23 @@ describe('getStatusHandlerFactory', () => { warnings: 'Warning: unknown new rules activated (versionbit 3)', }; - masternodeStatus = { - outpoint: 'd1be3a1aa0b9516d06ed180607c168724c21d8ccf6c5a3f5983769830724c357-0', - service: '45.32.237.76:19999', - proTxHash: '04d06d16b3eca2f104ef9749d0c1c17d183eb1b4fe3a16808fd70464f03bcd63', - collateralHash: 'd1be3a1aa0b9516d06ed180607c168724c21d8ccf6c5a3f5983769830724c357', - collateralIndex: 0, - dmnState: { - service: '45.32.237.76:19999', - registeredHeight: 7402, - lastPaidHeight: 59721, - PoSePenalty: 0, - PoSeRevivedHeight: 61915, - PoSeBanHeight: -1, - revocationReason: 0, - ownerAddress: 'yT8DDY5NkX4ZtBkUVz7y1RgzbakCnMPogh', - votingAddress: 'yMLrhooXyJtpV3R2ncsxvkrh6wRennNPoG', - payoutAddress: 'yTsGq4wV8WF5GKLaYV2C43zrkr2sfTtysT', - pubKeyOperator: '02a2e2673109a5e204f8a82baf628bb5f09a8dfc671859e84d2661cae03e6c6e198a037e968253e94cd099d07b98e94e', - }, - state: 'READY', - status: 'Ready', - }; - call = new GrpcCallMock(this.sinon); coreRPCClientMock = { getBlockchainInfo: this.sinon.stub().resolves(blockchainInfo), getNetworkInfo: this.sinon.stub().resolves(networkInfo), - getMnSync: this.sinon.stub().resolves(mnSyncInfo), - getMasternode: this.sinon.stub().resolves(masternodeStatus), }; now = new Date(); this.sinon.useFakeTimers(now.getTime()); - getStatusHandler = getStatusHandlerFactory(coreRPCClientMock); + getBlockchainStatusHandler = getBlockchainStatusHandlerFactory(coreRPCClientMock); }); it('should return valid result', async () => { - const result = await getStatusHandler(call); + const result = await getBlockchainStatusHandler(call); - expect(result).to.be.an.instanceOf(GetStatusResponse); + expect(result).to.be.an.instanceOf(GetBlockchainStatusResponse); // Validate protobuf object values result.serializeBinary(); @@ -123,17 +87,9 @@ describe('getStatusHandlerFactory', () => { expect(chain.getDifficulty()).to.be.equal(blockchainInfo.difficulty); expect(chain.getChainWork()).to.be.an.instanceOf(Buffer); expect(chain.getChainWork().toString('hex')).to.be.equal(blockchainInfo.chainwork); - expect(chain.getIsSynced()).to.be.equal(mnSyncInfo.IsBlockchainSynced); + expect(chain.getIsSynced()).to.be.equal(blockchainInfo.verificationprogress === 1); expect(chain.getSyncProgress()).to.be.equal(blockchainInfo.verificationprogress); - const masternode = result.getMasternode(); - expect(masternode.getStatus()).to.be.equal(GetStatusResponse.Masternode.Status.READY); - expect(masternode.getProTxHash()).to.be.an.instanceOf(Buffer); - expect(masternode.getProTxHash().toString('hex')).to.be.equal(masternodeStatus.proTxHash); - expect(masternode.getPosePenalty()).to.be.equal(masternodeStatus.dmnState.PoSePenalty); - expect(masternode.getIsSynced()).to.be.equal(mnSyncInfo.IsSynced); - expect(masternode.getSyncProgress()).to.be.equal(1); - const network = result.getNetwork(); expect(network.getPeersCount()).to.be.equal(networkInfo.connections); @@ -141,10 +97,8 @@ describe('getStatusHandlerFactory', () => { expect(fee.getRelay()).to.be.equal(networkInfo.relayfee); expect(fee.getIncremental()).to.be.equal(networkInfo.incrementalfee); - expect(result.getStatus()).to.be.equal(GetStatusResponse.Status.READY); + expect(result.getStatus()).to.be.equal(GetBlockchainStatusResponse.Status.SYNCING); expect(coreRPCClientMock.getBlockchainInfo).to.be.calledOnce(); expect(coreRPCClientMock.getNetworkInfo).to.be.calledOnce(); - expect(coreRPCClientMock.getMnSync).to.be.calledOnceWith('status'); - expect(coreRPCClientMock.getMasternode).to.be.calledOnceWith('status'); }); }); diff --git a/packages/dapi/test/unit/grpcServer/handlers/core/getMasternodeStatusHandlerFactory.spec.js b/packages/dapi/test/unit/grpcServer/handlers/core/getMasternodeStatusHandlerFactory.spec.js new file mode 100644 index 0000000000..0465462a08 --- /dev/null +++ b/packages/dapi/test/unit/grpcServer/handlers/core/getMasternodeStatusHandlerFactory.spec.js @@ -0,0 +1,84 @@ +const { + v0: { + GetMasternodeStatusResponse, + }, +} = require('@dashevo/dapi-grpc'); + +const getMasternodeStatusHandlerFactory = require('../../../../../lib/grpcServer/handlers/core/getMasternodeStatusHandlerFactory'); + +const GrpcCallMock = require('../../../../../lib/test/mock/GrpcCallMock'); + +describe('getMasternodeStatusHandlerFactory', () => { + let call; + let getMasternodeStatusHandler; + let coreRPCClientMock; + let now; + + let mnSyncInfo; + let masternodeStatus; + + beforeEach(function beforeEach() { + mnSyncInfo = { + AssetID: 999, + AssetName: 'MASTERNODE_SYNC_FINISHED', + AssetStartTime: 1615466139, + Attempt: 0, + IsBlockchainSynced: true, + IsSynced: true, + }; + + masternodeStatus = { + outpoint: 'd1be3a1aa0b9516d06ed180607c168724c21d8ccf6c5a3f5983769830724c357-0', + service: '45.32.237.76:19999', + proTxHash: '04d06d16b3eca2f104ef9749d0c1c17d183eb1b4fe3a16808fd70464f03bcd63', + collateralHash: 'd1be3a1aa0b9516d06ed180607c168724c21d8ccf6c5a3f5983769830724c357', + collateralIndex: 0, + dmnState: { + service: '45.32.237.76:19999', + registeredHeight: 7402, + lastPaidHeight: 59721, + PoSePenalty: 0, + PoSeRevivedHeight: 61915, + PoSeBanHeight: -1, + revocationReason: 0, + ownerAddress: 'yT8DDY5NkX4ZtBkUVz7y1RgzbakCnMPogh', + votingAddress: 'yMLrhooXyJtpV3R2ncsxvkrh6wRennNPoG', + payoutAddress: 'yTsGq4wV8WF5GKLaYV2C43zrkr2sfTtysT', + pubKeyOperator: '02a2e2673109a5e204f8a82baf628bb5f09a8dfc671859e84d2661cae03e6c6e198a037e968253e94cd099d07b98e94e', + }, + state: 'READY', + status: 'Ready', + }; + + call = new GrpcCallMock(this.sinon); + + coreRPCClientMock = { + getMnSync: this.sinon.stub().resolves(mnSyncInfo), + getMasternode: this.sinon.stub().resolves(masternodeStatus), + }; + + now = new Date(); + this.sinon.useFakeTimers(now.getTime()); + + getMasternodeStatusHandler = getMasternodeStatusHandlerFactory(coreRPCClientMock); + }); + + it('should return valid result', async () => { + const result = await getMasternodeStatusHandler(call); + + expect(result).to.be.an.instanceOf(GetMasternodeStatusResponse); + + // Validate protobuf object values + result.serializeBinary(); + + expect(result.getStatus()).to.be.equal(GetMasternodeStatusResponse.Status.READY); + expect(result.getProTxHash()).to.be.an.instanceOf(Buffer); + expect(result.getProTxHash().toString('hex')).to.be.equal(masternodeStatus.proTxHash); + expect(result.getPosePenalty()).to.be.equal(masternodeStatus.dmnState.PoSePenalty); + expect(result.getIsSynced()).to.be.equal(mnSyncInfo.IsSynced); + expect(result.getSyncProgress()).to.be.equal(1); + + expect(coreRPCClientMock.getMnSync).to.be.calledOnceWith('status'); + expect(coreRPCClientMock.getMasternode).to.be.calledOnceWith('status'); + }); +}); diff --git a/packages/js-dapi-client/lib/methods/core/CoreMethodsFacade.js b/packages/js-dapi-client/lib/methods/core/CoreMethodsFacade.js index 306add3c95..0be2fe745e 100644 --- a/packages/js-dapi-client/lib/methods/core/CoreMethodsFacade.js +++ b/packages/js-dapi-client/lib/methods/core/CoreMethodsFacade.js @@ -5,7 +5,8 @@ const getBlockByHashFactory = require('./getBlockByHashFactory'); const getBlockByHeightFactory = require('./getBlockByHeightFactory'); const getBlockHashFactory = require('./getBlockHashFactory'); const getMnListDiffFactory = require('./getMnListDiffFactory'); -const getStatusFactory = require('./getStatusFactory'); +const getBlockchainStatusFactory = require('./getBlockchainStatusFactory'); +const getMasternodeStatusFactory = require('./getMasternodeStatusFactory'); const getTransactionFactory = require('./getTransaction/getTransactionFactory'); const subscribeToTransactionsWithProofsFactory = require('./subscribeToTransactionsWithProofsFactory'); const subscribeToBlockHeadersWithChainLocksFactory = require('./subscribeToBlockHeadersWithChainLocksFactory'); @@ -23,7 +24,8 @@ class CoreMethodsFacade { this.getBlockByHeight = getBlockByHeightFactory(grpcTransport); this.getBlockHash = getBlockHashFactory(jsonRpcTransport); this.getMnListDiff = getMnListDiffFactory(jsonRpcTransport); - this.getStatus = getStatusFactory(grpcTransport); + this.getBlockchainStatus = getBlockchainStatusFactory(grpcTransport); + this.getMasternodeStatus = getMasternodeStatusFactory(grpcTransport); this.getTransaction = getTransactionFactory(grpcTransport); this.subscribeToTransactionsWithProofs = subscribeToTransactionsWithProofsFactory( grpcTransport, diff --git a/packages/js-dapi-client/lib/methods/core/getBlockchainStatusFactory.js b/packages/js-dapi-client/lib/methods/core/getBlockchainStatusFactory.js new file mode 100644 index 0000000000..22b1f88e57 --- /dev/null +++ b/packages/js-dapi-client/lib/methods/core/getBlockchainStatusFactory.js @@ -0,0 +1,59 @@ +const { + v0: { + GetBlockchainStatusRequest, + GetBlockchainStatusResponse, + CorePromiseClient, + }, +} = require('@dashevo/dapi-grpc'); + +/** + * @param {GrpcTransport} grpcTransport + * @returns {getBlockchainStatus} + */ +function getBlockchainStatusFactory(grpcTransport) { + /** + * Get Core chain status + * @typedef {getBlockchainStatus} + * @param {DAPIClientOptions} [options] + * @returns {Promise} + */ + async function getBlockchainStatus(options = {}) { + const getBlockchainStatusRequest = new GetBlockchainStatusRequest(); + + const response = await grpcTransport.request( + CorePromiseClient, + 'getBlockchainStatus', + getBlockchainStatusRequest, + options, + ); + + const responseObject = response.toObject(); + + // Respond with Buffers instead of base64 for binary fields + + if (response.getChain()) { + if (response.getChain() + .getBestBlockHash()) { + responseObject.chain.bestBlockHash = Buffer.from(response.getChain() + .getBestBlockHash()); + } + + if (response.getChain() + .getChainWork()) { + responseObject.chain.chainWork = Buffer.from(response.getChain() + .getChainWork()); + } + } + + // Respond with constant names instead of constant values + + responseObject.status = Object.keys(GetBlockchainStatusResponse.Status) + .find((key) => GetBlockchainStatusResponse.Status[key] === responseObject.status); + + return responseObject; + } + + return getBlockchainStatus; +} + +module.exports = getBlockchainStatusFactory; diff --git a/packages/js-dapi-client/lib/methods/core/getMasternodeStatusFactory.js b/packages/js-dapi-client/lib/methods/core/getMasternodeStatusFactory.js new file mode 100644 index 0000000000..c0da5feef9 --- /dev/null +++ b/packages/js-dapi-client/lib/methods/core/getMasternodeStatusFactory.js @@ -0,0 +1,45 @@ +const { + v0: { + GetMasternodeStatusRequest, + GetMasternodeStatusResponse, + CorePromiseClient, + }, +} = require('@dashevo/dapi-grpc'); + +/** + * @param {GrpcTransport} grpcTransport + * @returns {getMasternodeStatus} + */ +function getMasternodeStatusFactory(grpcTransport) { + /** + * Get Core chain status + * @typedef {getMasternodeStatus} + * @param {DAPIClientOptions} [options] + * @returns {Promise} + */ + async function getMasternodeStatus(options = {}) { + const getMasternodeStatusRequest = new GetMasternodeStatusRequest(); + + const response = await grpcTransport.request( + CorePromiseClient, + 'getMasternodeStatus', + getMasternodeStatusRequest, + options, + ); + + const responseObject = response.toObject(); + + // Respond with constant names instead of constant values + + responseObject.status = Object.keys(GetMasternodeStatusResponse.Status) + .find((key) => GetMasternodeStatusResponse.Status[key] === responseObject.status); + + responseObject.proTxHash = Buffer.from(responseObject.proTxHash, 'base64'); + + return responseObject; + } + + return getMasternodeStatus; +} + +module.exports = getMasternodeStatusFactory; diff --git a/packages/js-dapi-client/lib/methods/core/getStatusFactory.js b/packages/js-dapi-client/lib/methods/core/getStatusFactory.js deleted file mode 100644 index b631e6edfe..0000000000 --- a/packages/js-dapi-client/lib/methods/core/getStatusFactory.js +++ /dev/null @@ -1,68 +0,0 @@ -const { - v0: { - GetStatusRequest, - GetStatusResponse, - CorePromiseClient, - }, -} = require('@dashevo/dapi-grpc'); - -/** - * @param {GrpcTransport} grpcTransport - * @returns {getStatus} - */ -function getStatusFactory(grpcTransport) { - /** - * Get Core chain status - * @typedef {getStatus} - * @param {DAPIClientOptions} [options] - * @returns {Promise} - */ - async function getStatus(options = {}) { - const getStatusRequest = new GetStatusRequest(); - - const response = await grpcTransport.request( - CorePromiseClient, - 'getStatus', - getStatusRequest, - options, - ); - - const responseObject = response.toObject(); - - // Respond with Buffers instead of base64 for binary fields - - if (response.getChain()) { - if (response.getChain().getBestBlockHash()) { - responseObject.chain.bestBlockHash = Buffer.from(response.getChain().getBestBlockHash()); - } - - if (response.getChain().getChainWork()) { - responseObject.chain.chainWork = Buffer.from(response.getChain().getChainWork()); - } - } - - if (response.getMasternode()) { - if (response.getMasternode().getProTxHash()) { - responseObject.masternode.proTxHash = Buffer.from(response.getMasternode().getProTxHash()); - } - } - - // Respond with constant names instead of constant values - - responseObject.status = Object.keys(GetStatusResponse.Status) - .find((key) => GetStatusResponse.Status[key] === responseObject.status); - - if (responseObject.masternode) { - responseObject.masternode.status = Object.keys(GetStatusResponse.Masternode.Status) - .find((key) => ( - GetStatusResponse.Masternode.Status[key] === responseObject.masternode.status - )); - } - - return responseObject; - } - - return getStatus; -} - -module.exports = getStatusFactory; diff --git a/packages/js-dapi-client/test/integration/methods/core/CoreMethodsFacade.spec.js b/packages/js-dapi-client/test/integration/methods/core/CoreMethodsFacade.spec.js index 0e007be067..c25ad463dc 100644 --- a/packages/js-dapi-client/test/integration/methods/core/CoreMethodsFacade.spec.js +++ b/packages/js-dapi-client/test/integration/methods/core/CoreMethodsFacade.spec.js @@ -5,7 +5,8 @@ const { BroadcastTransactionResponse, GetBlockResponse, GetTransactionResponse, - GetStatusResponse, + GetBlockchainStatusResponse, + GetMasternodeStatusResponse, }, } = require('@dashevo/dapi-grpc'); @@ -121,21 +122,30 @@ describe('CoreMethodsFacade', () => { }); }); - describe('#getStatus', () => { + describe('#getBlockchainStatus', () => { it('should get status', async () => { - const response = new GetStatusResponse(); + const response = new GetBlockchainStatusResponse(); - response.setStatus(GetStatusResponse.Status.READY); + response.setStatus(GetBlockchainStatusResponse.Status.READY); - const masternode = new GetStatusResponse.Masternode(); + grpcTransportMock.request.resolves(response); + + await coreMethods.getBlockchainStatus(); + + expect(jsonRpcTransportMock.request).to.be.not.called(); + expect(grpcTransportMock.request).to.be.calledOnce(); + }); + }); - masternode.setStatus(GetStatusResponse.Masternode.Status.READY); + describe('#getMasternodeStatus', () => { + it('should get masternode status', async () => { + const response = new GetMasternodeStatusResponse(); - response.setMasternode(masternode); + response.setStatus(GetMasternodeStatusResponse.Status.READY); grpcTransportMock.request.resolves(response); - await coreMethods.getStatus(); + await coreMethods.getMasternodeStatus(); expect(jsonRpcTransportMock.request).to.be.not.called(); expect(grpcTransportMock.request).to.be.calledOnce(); diff --git a/packages/js-dapi-client/test/unit/methods/core/getStatusFactory.spec.js b/packages/js-dapi-client/test/unit/methods/core/getBlockchainStatusFactory.spec.js similarity index 53% rename from packages/js-dapi-client/test/unit/methods/core/getStatusFactory.spec.js rename to packages/js-dapi-client/test/unit/methods/core/getBlockchainStatusFactory.spec.js index b5376020de..bceb20a0ec 100644 --- a/packages/js-dapi-client/test/unit/methods/core/getStatusFactory.spec.js +++ b/packages/js-dapi-client/test/unit/methods/core/getBlockchainStatusFactory.spec.js @@ -1,37 +1,32 @@ const { v0: { - GetStatusRequest, - GetStatusResponse, + GetBlockchainStatusRequest, + GetBlockchainStatusResponse, CorePromiseClient, }, } = require('@dashevo/dapi-grpc'); -const getStatusFactory = require('../../../../lib/methods/core/getStatusFactory'); +const getBlockchainStatusFactory = require('../../../../lib/methods/core/getBlockchainStatusFactory'); -describe('getStatusFactory', () => { - let getStatus; +describe('getBlockchainStatusFactory', () => { + let getBlockchainStatus; let grpcTransportMock; beforeEach(function beforeEach() { grpcTransportMock = { request: this.sinon.stub(), }; - getStatus = getStatusFactory(grpcTransportMock); + getBlockchainStatus = getBlockchainStatusFactory(grpcTransportMock); }); it('should return status', async () => { - const response = new GetStatusResponse(); + const response = new GetBlockchainStatusResponse(); - response.setStatus(GetStatusResponse.Status.READY); + response.setStatus(GetBlockchainStatusResponse.Status.READY); - const masternode = new GetStatusResponse.Masternode(); - - masternode.setStatus(GetStatusResponse.Masternode.Status.READY); - - const chain = new GetStatusResponse.Chain(); + const chain = new GetBlockchainStatusResponse.Chain(); chain.setBestBlockHash(Buffer.from('bestBlockHash')); - response.setMasternode(masternode); response.setChain(chain); grpcTransportMock.request.resolves(response); @@ -40,15 +35,15 @@ describe('getStatusFactory', () => { timeout: 1000, }; - const result = await getStatus( + const result = await getBlockchainStatus( options, ); - const request = new GetStatusRequest(); + const request = new GetBlockchainStatusRequest(); expect(grpcTransportMock.request).to.be.calledOnceWithExactly( CorePromiseClient, - 'getStatus', + 'getBlockchainStatus', request, options, ); @@ -56,10 +51,6 @@ describe('getStatusFactory', () => { const expectedResult = { ...response.toObject(), status: 'READY', - masternode: { - ...response.getMasternode().toObject(), - status: 'READY', - }, }; expectedResult.chain.bestBlockHash = Buffer.from(expectedResult.chain.bestBlockHash, 'base64'); diff --git a/packages/js-dapi-client/test/unit/methods/core/getMasternodeStatusFactory.spec.js b/packages/js-dapi-client/test/unit/methods/core/getMasternodeStatusFactory.spec.js new file mode 100644 index 0000000000..fdd1b569e5 --- /dev/null +++ b/packages/js-dapi-client/test/unit/methods/core/getMasternodeStatusFactory.spec.js @@ -0,0 +1,54 @@ +const { + v0: { + GetMasternodeStatusRequest, + GetMasternodeStatusResponse, + CorePromiseClient, + }, +} = require('@dashevo/dapi-grpc'); + +const getMasternodeStatusFactory = require('../../../../lib/methods/core/getMasternodeStatusFactory'); + +describe('getMasternodeStatusFactory', () => { + let getMasternodeStatus; + let grpcTransportMock; + + beforeEach(function beforeEach() { + grpcTransportMock = { + request: this.sinon.stub(), + }; + getMasternodeStatus = getMasternodeStatusFactory(grpcTransportMock); + }); + + it('should return status', async () => { + const response = new GetMasternodeStatusResponse(); + + response.setStatus(GetMasternodeStatusResponse.Status.READY); + + grpcTransportMock.request.resolves(response); + + const options = { + timeout: 1000, + }; + + const result = await getMasternodeStatus( + options, + ); + + const request = new GetMasternodeStatusRequest(); + + expect(grpcTransportMock.request).to.be.calledOnceWithExactly( + CorePromiseClient, + 'getMasternodeStatus', + request, + options, + ); + + const expectedResult = { + ...response.toObject(), + proTxHash: Buffer.alloc(0), + status: 'READY', + }; + + expect(result).to.deep.equal(expectedResult); + }); +}); diff --git a/packages/platform-test-suite/lib/waitForBlocks.js b/packages/platform-test-suite/lib/waitForBlocks.js index 4f0be6d4bf..90334a7376 100644 --- a/packages/platform-test-suite/lib/waitForBlocks.js +++ b/packages/platform-test-suite/lib/waitForBlocks.js @@ -7,11 +7,11 @@ const wait = require('./wait'); * @return {Promise} */ module.exports = async function waitForBlocks(dapiClient, numberOfBlocks) { - let { chain: { blocksCount: currentBlockHeight } } = await dapiClient.core.getStatus(); + let { chain: { blocksCount: currentBlockHeight } } = await dapiClient.core.getBlockchainStatus(); const desiredBlockHeight = currentBlockHeight + numberOfBlocks; do { - ({ chain: { blocksCount: currentBlockHeight } } = await dapiClient.core.getStatus()); + ({ chain: { blocksCount: currentBlockHeight } } = await dapiClient.core.getBlockchainStatus()); if (currentBlockHeight < desiredBlockHeight) { await wait(5000); diff --git a/packages/platform-test-suite/test/functional/core/getBlock.spec.js b/packages/platform-test-suite/test/functional/core/getBlock.spec.js index 792baa5bf2..d789fbe75f 100644 --- a/packages/platform-test-suite/test/functional/core/getBlock.spec.js +++ b/packages/platform-test-suite/test/functional/core/getBlock.spec.js @@ -30,7 +30,7 @@ describe('Core', () => { it('should get block by height', async () => { const { chain: { blocksCount: bestBlockHeight } } = await client - .getDAPIClient().core.getStatus(); + .getDAPIClient().core.getBlockchainStatus(); const blockBinary = await client.getDAPIClient().core.getBlockByHeight(bestBlockHeight); diff --git a/packages/platform-test-suite/test/functional/core/getBlockHash.spec.js b/packages/platform-test-suite/test/functional/core/getBlockHash.spec.js index 2c1bbdd61a..00725d7102 100644 --- a/packages/platform-test-suite/test/functional/core/getBlockHash.spec.js +++ b/packages/platform-test-suite/test/functional/core/getBlockHash.spec.js @@ -9,7 +9,7 @@ describe('Core', () => { client = createClientWithoutWallet(); ({ chain: { blocksCount: lastBlockHeight } } = await client - .getDAPIClient().core.getStatus()); + .getDAPIClient().core.getBlockchainStatus()); }); after(async () => { diff --git a/packages/platform-test-suite/test/functional/core/getStatus.spec.js b/packages/platform-test-suite/test/functional/core/getBlockchainStatus.spec.js similarity index 75% rename from packages/platform-test-suite/test/functional/core/getStatus.spec.js rename to packages/platform-test-suite/test/functional/core/getBlockchainStatus.spec.js index ae8c56aa5b..780e2da588 100644 --- a/packages/platform-test-suite/test/functional/core/getStatus.spec.js +++ b/packages/platform-test-suite/test/functional/core/getBlockchainStatus.spec.js @@ -3,7 +3,7 @@ const { Essentials: { Buffer } } = require('dash'); const createClientWithoutWallet = require('../../../lib/test/createClientWithoutWallet'); describe('Core', () => { - describe('getStatus', function main() { + describe('getBlockchainStatus', function main() { let client; this.timeout(160000); @@ -19,10 +19,10 @@ describe('Core', () => { }); it('should return status', async () => { - const result = await client.getDAPIClient().core.getStatus(); + const result = await client.getDAPIClient().core.getBlockchainStatus(); const { - version, time, status, syncProgress, chain, masternode, network, + version, time, status, syncProgress, chain, network, } = result; expect(version.protocol).to.be.a('number'); @@ -46,12 +46,6 @@ describe('Core', () => { expect(chain.isSynced).to.be.a('boolean'); expect(chain.syncProgress).to.be.a('number'); - expect(masternode.status).to.be.a('string'); - expect(masternode.proTxHash).to.be.an.instanceOf(Buffer); - expect(masternode.posePenalty).to.be.a('number'); - expect(masternode.isSynced).to.be.a('boolean'); - expect(masternode.syncProgress).to.be.a('number'); - expect(network.peersCount).to.be.a('number'); expect(network.fee.relay).to.be.a('number'); expect(network.fee.incremental).to.be.a('number'); diff --git a/packages/platform-test-suite/test/functional/core/getMasternodeStatus.spec.js b/packages/platform-test-suite/test/functional/core/getMasternodeStatus.spec.js new file mode 100644 index 0000000000..3f9fc394e6 --- /dev/null +++ b/packages/platform-test-suite/test/functional/core/getMasternodeStatus.spec.js @@ -0,0 +1,35 @@ +const { Essentials: { Buffer } } = require('dash'); + +const createClientWithoutWallet = require('../../../lib/test/createClientWithoutWallet'); + +describe('Core', () => { + describe('getMasternodeStatus', function main() { + let client; + + this.timeout(160000); + + before(() => { + client = createClientWithoutWallet(); + }); + + after(async () => { + if (client) { + await client.disconnect(); + } + }); + + it('should return status', async () => { + const result = await client.getDAPIClient().core.getMasternodeStatus(); + + const { + status, proTxHash, posePenalty, isSynced, syncProgress, + } = result; + + expect(status).to.be.a('string'); + expect(proTxHash).to.be.an.instanceOf(Buffer); + expect(posePenalty).to.be.a('number'); + expect(isSynced).to.be.a('boolean'); + expect(syncProgress).to.be.a('number'); + }); + }); +}); diff --git a/packages/rs-dapi-client/src/transport/grpc.rs b/packages/rs-dapi-client/src/transport/grpc.rs index 76ee80eac0..db314e0ce3 100644 --- a/packages/rs-dapi-client/src/transport/grpc.rs +++ b/packages/rs-dapi-client/src/transport/grpc.rs @@ -292,11 +292,11 @@ impl_transport_request_grpc!( ); impl_transport_request_grpc!( - core_proto::GetStatusRequest, - core_proto::GetStatusResponse, + core_proto::GetBlockchainStatusRequest, + core_proto::GetBlockchainStatusResponse, CoreGrpcClient, RequestSettings::default(), - get_status + get_blockchain_status ); impl_transport_request_grpc!( diff --git a/packages/wallet-lib/src/plugins/Plugins/ChainPlugin.js b/packages/wallet-lib/src/plugins/Plugins/ChainPlugin.js index 87739b3bc9..66edb59a25 100644 --- a/packages/wallet-lib/src/plugins/Plugins/ChainPlugin.js +++ b/packages/wallet-lib/src/plugins/Plugins/ChainPlugin.js @@ -26,7 +26,8 @@ class ChainPlugin extends StandardPlugin { /** * Used on ChainPlugin to be able to report on BLOCKHEIGHT_CHANGED. - * Neither Block or Blockheader contains blockheight, we need to fetch it from getStatus.blocks + * Neither Block or Blockheader contains blockheight, we need to fetch it + * from getBlockchainStatus.blocks * @return {Promise} */ async execStatusFetch() { diff --git a/packages/wallet-lib/src/test/mocks/TransportMock.js b/packages/wallet-lib/src/test/mocks/TransportMock.js index e52d659e46..986c42f58f 100644 --- a/packages/wallet-lib/src/test/mocks/TransportMock.js +++ b/packages/wallet-lib/src/test/mocks/TransportMock.js @@ -1,5 +1,5 @@ const EventEmitter = require('events'); -const getStatus = require('../../transport/FixtureTransport/methods/getStatus'); +const getBlockchainStatus = require('../../transport/FixtureTransport/methods/getBlockchainStatus'); class TransportMock extends EventEmitter { constructor(sinon, transactionStreamMock) { @@ -25,7 +25,7 @@ class TransportMock extends EventEmitter { this.sendTransaction = sinon.stub(); this.getTransaction = sinon.stub(); this.getBlockHeaderByHash = sinon.stub(); - this.getStatus = sinon.stub().resolves(getStatus.call(this)); + this.getBlockchainStatus = sinon.stub().resolves(getBlockchainStatus.call(this)); const provider = new EventEmitter(); provider.stop = sinon.stub().callsFake(() => { diff --git a/packages/wallet-lib/src/transport/DAPIClientTransport/DAPIClientTransport.js b/packages/wallet-lib/src/transport/DAPIClientTransport/DAPIClientTransport.js index b120486e38..649af7b434 100644 --- a/packages/wallet-lib/src/transport/DAPIClientTransport/DAPIClientTransport.js +++ b/packages/wallet-lib/src/transport/DAPIClientTransport/DAPIClientTransport.js @@ -19,7 +19,7 @@ DAPIClientTransport.prototype.getBlockByHash = require('./methods/getBlockByHash DAPIClientTransport.prototype.getBlockByHeight = require('./methods/getBlockByHeight'); DAPIClientTransport.prototype.getBlockHeaderByHash = require('./methods/getBlockHeaderByHash'); DAPIClientTransport.prototype.getBlockHeaderByHeight = require('./methods/getBlockHeaderByHeight'); -DAPIClientTransport.prototype.getStatus = require('./methods/getStatus'); +DAPIClientTransport.prototype.getBlockchainStatus = require('./methods/getBlockchainStatus'); DAPIClientTransport.prototype.getTransaction = require('./methods/getTransaction'); DAPIClientTransport.prototype.sendTransaction = require('./methods/sendTransaction'); DAPIClientTransport.prototype.getIdentitiesByPublicKeyHashes = require('./methods/getIdentitiesByPublicKeyHashes'); diff --git a/packages/wallet-lib/src/transport/DAPIClientTransport/methods/getBestBlockHeight.js b/packages/wallet-lib/src/transport/DAPIClientTransport/methods/getBestBlockHeight.js index ffabc94492..c7a4b961de 100644 --- a/packages/wallet-lib/src/transport/DAPIClientTransport/methods/getBestBlockHeight.js +++ b/packages/wallet-lib/src/transport/DAPIClientTransport/methods/getBestBlockHeight.js @@ -4,7 +4,7 @@ module.exports = async function getBestBlockHeight() { logger.silly('DAPIClientTransport.getBestBlockHeight'); // Previously we would have done getBlock(hash).height - const { chain: { blocksCount } } = await this.getStatus(); + const { chain: { blocksCount } } = await this.getBlockchainStatus(); return blocksCount; }; diff --git a/packages/wallet-lib/src/transport/DAPIClientTransport/methods/getBestBlockHeight.spec.js b/packages/wallet-lib/src/transport/DAPIClientTransport/methods/getBestBlockHeight.spec.js index 298d867090..22081ce523 100644 --- a/packages/wallet-lib/src/transport/DAPIClientTransport/methods/getBestBlockHeight.spec.js +++ b/packages/wallet-lib/src/transport/DAPIClientTransport/methods/getBestBlockHeight.spec.js @@ -2,7 +2,7 @@ const { expect } = require('chai'); const DAPIClientTransport = require('../DAPIClientTransport'); -const getStatus = require('../../FixtureTransport/methods/getStatus'); +const getBlockchainStatus = require('../../FixtureTransport/methods/getBlockchainStatus'); describe('transports - DAPIClientTransport - .getBestBlockHeight', function suite() { let fixture; @@ -10,11 +10,11 @@ describe('transports - DAPIClientTransport - .getBestBlockHeight', function suit let clientMock; beforeEach(() => { - fixture = getStatus(); + fixture = getBlockchainStatus(); clientMock = { core: { - getStatus: () => fixture, + getBlockchainStatus: () => fixture, } } diff --git a/packages/wallet-lib/src/transport/DAPIClientTransport/methods/getBlockchainStatus.js b/packages/wallet-lib/src/transport/DAPIClientTransport/methods/getBlockchainStatus.js new file mode 100644 index 0000000000..44faa64ada --- /dev/null +++ b/packages/wallet-lib/src/transport/DAPIClientTransport/methods/getBlockchainStatus.js @@ -0,0 +1,7 @@ +const logger = require('../../../logger'); + +module.exports = async function getBlockchainStatus() { + logger.silly('DAPIClientTransport.getBlockchainStatus'); + + return this.client.core.getBlockchainStatus(); +}; diff --git a/packages/wallet-lib/src/transport/DAPIClientTransport/methods/getStatus.spec.js b/packages/wallet-lib/src/transport/DAPIClientTransport/methods/getBlockchainStatus.spec.js similarity index 77% rename from packages/wallet-lib/src/transport/DAPIClientTransport/methods/getStatus.spec.js rename to packages/wallet-lib/src/transport/DAPIClientTransport/methods/getBlockchainStatus.spec.js index fd43867d53..705462a518 100644 --- a/packages/wallet-lib/src/transport/DAPIClientTransport/methods/getStatus.spec.js +++ b/packages/wallet-lib/src/transport/DAPIClientTransport/methods/getBlockchainStatus.spec.js @@ -2,7 +2,7 @@ const { expect } = require('chai'); const DAPIClientTransport = require('../DAPIClientTransport'); -describe('transports - DAPIClientTransport - .getStatus', function suite() { +describe('transports - DAPIClientTransport - .getBlockchainStatus', function suite() { let fixture; let transport; let clientMock; @@ -14,7 +14,7 @@ describe('transports - DAPIClientTransport - .getStatus', function suite() { clientMock = { core: { - getStatus: () => fixture, + getBlockchainStatus: () => fixture, } } @@ -26,7 +26,7 @@ describe('transports - DAPIClientTransport - .getStatus', function suite() { }) it('should work', async () => { - const res = await transport.getStatus(); + const res = await transport.getBlockchainStatus(); expect(res).to.deep.equal(fixture); }); diff --git a/packages/wallet-lib/src/transport/DAPIClientTransport/methods/getStatus.js b/packages/wallet-lib/src/transport/DAPIClientTransport/methods/getStatus.js deleted file mode 100644 index 0e1d021a2e..0000000000 --- a/packages/wallet-lib/src/transport/DAPIClientTransport/methods/getStatus.js +++ /dev/null @@ -1,7 +0,0 @@ -const logger = require('../../../logger'); - -module.exports = async function getStatus() { - logger.silly('DAPIClientTransport.getStatus'); - - return this.client.core.getStatus(); -}; diff --git a/packages/wallet-lib/src/transport/FixtureTransport/FixtureTransport.js b/packages/wallet-lib/src/transport/FixtureTransport/FixtureTransport.js index 94a0d96eba..d6c98b0c65 100644 --- a/packages/wallet-lib/src/transport/FixtureTransport/FixtureTransport.js +++ b/packages/wallet-lib/src/transport/FixtureTransport/FixtureTransport.js @@ -63,7 +63,7 @@ FixtureTransport.prototype.getBlockByHash = require('./methods/getBlockByHash'); FixtureTransport.prototype.getBlockByHeight = require('./methods/getBlockByHeight'); FixtureTransport.prototype.getBlockHeaderByHash = require('./methods/getBlockHeaderByHash'); FixtureTransport.prototype.getBlockHeaderByHeight = require('./methods/getBlockHeaderByHeight'); -FixtureTransport.prototype.getStatus = require('./methods/getStatus'); +FixtureTransport.prototype.getBlockchainStatus = require('./methods/getBlockchainStatus'); FixtureTransport.prototype.getTransaction = require('./methods/getTransaction'); FixtureTransport.prototype.sendTransaction = require('./methods/sendTransaction'); FixtureTransport.prototype.subscribeToAddressesTransactions = require('./methods/subscribeToAddressesTransactions'); diff --git a/packages/wallet-lib/src/transport/FixtureTransport/methods/getStatus.js b/packages/wallet-lib/src/transport/FixtureTransport/methods/getBlockchainStatus.js similarity index 94% rename from packages/wallet-lib/src/transport/FixtureTransport/methods/getStatus.js rename to packages/wallet-lib/src/transport/FixtureTransport/methods/getBlockchainStatus.js index 32b4997dad..eb36aa8e0a 100644 --- a/packages/wallet-lib/src/transport/FixtureTransport/methods/getStatus.js +++ b/packages/wallet-lib/src/transport/FixtureTransport/methods/getBlockchainStatus.js @@ -1,4 +1,4 @@ -module.exports = async function getStatus() { +module.exports = async function getBlockchainStatus() { const { height, relayFee, network } = this; return { diff --git a/packages/wallet-lib/src/transport/Transport.d.ts b/packages/wallet-lib/src/transport/Transport.d.ts index adaf221c14..6dcef7e96b 100644 --- a/packages/wallet-lib/src/transport/Transport.d.ts +++ b/packages/wallet-lib/src/transport/Transport.d.ts @@ -22,7 +22,7 @@ export declare interface Transport { getIdentitiesByPublicKeyHashes(publicKeyHashes: Buffer[]): Promise - getStatus(): Promise + getBlockchainStatus(): Promise getTransaction(txid: string): Promise diff --git a/packages/wallet-lib/src/types/Account/methods/fetchStatus.js b/packages/wallet-lib/src/types/Account/methods/fetchStatus.js index c7727b9f79..9299f3d6e5 100644 --- a/packages/wallet-lib/src/types/Account/methods/fetchStatus.js +++ b/packages/wallet-lib/src/types/Account/methods/fetchStatus.js @@ -8,7 +8,7 @@ async function fetchStatus() { throw new ValidTransportLayerRequired('fetchStatus'); } - return this.transport.getStatus(); + return this.transport.getBlockchainStatus(); } module.exports = fetchStatus; diff --git a/packages/wallet-lib/tests/integration/types/Wallet.spec.js b/packages/wallet-lib/tests/integration/types/Wallet.spec.js index c3f1069e5c..8c087ef7c5 100644 --- a/packages/wallet-lib/tests/integration/types/Wallet.spec.js +++ b/packages/wallet-lib/tests/integration/types/Wallet.spec.js @@ -60,7 +60,7 @@ describe('Wallet', () => { return streamMock; }); - this.sinon.stub(wallet.transport.client.core, 'getStatus') + this.sinon.stub(wallet.transport.client.core, 'getBlockchainStatus') .resolves({ chain: { blocksCount: bestBlockHeight }, network: { fee: 237 } From 0b4a7338ea5b0eb2e729960e2e8c4051998b2026 Mon Sep 17 00:00:00 2001 From: Igor Markin Date: Thu, 25 Apr 2024 11:23:25 +0100 Subject: [PATCH 144/191] feat(sdk): add query for data contract history (#1787) Co-authored-by: Quantum Explorer --- packages/rs-sdk/src/mock/sdk.rs | 4 +++ packages/rs-sdk/src/platform/fetch.rs | 4 +++ packages/rs-sdk/src/platform/query.rs | 21 ++++++++++++ packages/rs-sdk/tests/fetch/data_contract.rs | 32 +++++++++++++++++- .../test_data_contract_history_read/.gitkeep | 0 ...f8505da12dd67cb9d5d8b43fad82de9d06061.json | Bin 0 -> 57547 bytes ...32a287dd182f4ea3b1b4bf70dcd56c1b87d78.json | 1 + 7 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_history_read/.gitkeep create mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_history_read/msg_2024-04-11T16:57:48.166543000Z_GetDataContractHistoryRequest_1519241de3a099f69aa1d8523aef8505da12dd67cb9d5d8b43fad82de9d06061.json create mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_history_read/quorum_pubkey-106-0db75802182bb9b9417e92b278832a287dd182f4ea3b1b4bf70dcd56c1b87d78.json diff --git a/packages/rs-sdk/src/mock/sdk.rs b/packages/rs-sdk/src/mock/sdk.rs index 82c5c65ecb..6fadfea695 100644 --- a/packages/rs-sdk/src/mock/sdk.rs +++ b/packages/rs-sdk/src/mock/sdk.rs @@ -120,6 +120,10 @@ impl MockDashPlatformSdk { self.load_expectation::(filename) .await? } + "GetDataContractHistoryRequest" => { + self.load_expectation::(filename) + .await? + } "IdentityRequest" => self.load_expectation::(filename).await?, "GetIdentityRequest" => { self.load_expectation::(filename) diff --git a/packages/rs-sdk/src/platform/fetch.rs b/packages/rs-sdk/src/platform/fetch.rs index dc8c12a38a..70266354d2 100644 --- a/packages/rs-sdk/src/platform/fetch.rs +++ b/packages/rs-sdk/src/platform/fetch.rs @@ -219,6 +219,10 @@ impl Fetch for drive_proof_verifier::types::IdentityBalanceAndRevision { type Request = platform_proto::GetIdentityBalanceAndRevisionRequest; } +impl Fetch for drive_proof_verifier::types::DataContractHistory { + type Request = platform_proto::GetDataContractHistoryRequest; +} + impl Fetch for ExtendedEpochInfo { type Request = platform_proto::GetEpochsInfoRequest; } diff --git a/packages/rs-sdk/src/platform/query.rs b/packages/rs-sdk/src/platform/query.rs index a1c80abf10..e0d6b8bb40 100644 --- a/packages/rs-sdk/src/platform/query.rs +++ b/packages/rs-sdk/src/platform/query.rs @@ -114,6 +114,27 @@ impl Query for Vec { } } +impl Query for LimitQuery<(Identifier, u64)> { + fn query(self, prove: bool) -> Result { + if !prove { + unimplemented!("queries without proofs are not supported yet"); + } + let (id, start_at_ms) = self.query; + + Ok(proto::GetDataContractHistoryRequest { + version: Some(proto::get_data_contract_history_request::Version::V0( + proto::get_data_contract_history_request::GetDataContractHistoryRequestV0 { + id: id.to_vec(), + limit: self.limit, + offset: None, + start_at_ms, + prove, + }, + )), + }) + } +} + impl Query for Identifier { /// Get all keys for an identity with provided identifier. fn query(self, prove: bool) -> Result { diff --git a/packages/rs-sdk/tests/fetch/data_contract.rs b/packages/rs-sdk/tests/fetch/data_contract.rs index d6a6134159..d68646eb70 100644 --- a/packages/rs-sdk/tests/fetch/data_contract.rs +++ b/packages/rs-sdk/tests/fetch/data_contract.rs @@ -1,6 +1,9 @@ use super::config::Config; -use dash_sdk::platform::{Fetch, FetchMany}; +use dash_sdk::platform::{Fetch, FetchMany, LimitQuery}; +use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::platform_value::string_encoding::Encoding; use dpp::prelude::{DataContract, Identifier}; +use drive_proof_verifier::types::DataContractHistory; /// Given some dummy data contract ID, when I fetch data contract, I get None because it doesn't exist. #[tokio::test(flavor = "multi_thread", worker_threads = 1)] @@ -88,3 +91,30 @@ async fn test_data_contracts_2_nx() { "proof of non-existence 2 failed" ); } + +// This test currently supports offline mode only. +// It needs Data Contract with `keep_history` set to true, which is not available in the network +// by default and has to be created manually. +// At the moment tests in rs-sdk do not provide Core Wallet signer, and unable to create +// identities and data contracts. +// The contract for this test was pre-created with +// `packages/platform-test-suite/test/functional/platform/DataContract.spec.js` +// and stored as a test vector for offline testing only. +#[cfg(not(feature = "network-testing"))] +#[tokio::test(flavor = "multi_thread", worker_threads = 1)] +async fn test_data_contract_history_read() { + let cfg = Config::new(); + let id = Identifier::from_string( + "3c71ba2d0b655ac3d231c4411d3c3fad43451d3f48213537ff9da331b24e5dea", + Encoding::Hex, + ) + .unwrap(); + + let sdk = cfg.setup_api("test_data_contract_history_read").await; + + let result = DataContractHistory::fetch(&sdk, LimitQuery::from((id, 10))).await; + + assert!(matches!(result, Ok(Some(_))), "result: {:?}", result); + let (_, contract) = result.unwrap().unwrap().pop_first().unwrap(); + assert_eq!(contract.id(), id); +} diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_history_read/.gitkeep b/packages/rs-sdk/tests/vectors/test_data_contract_history_read/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_history_read/msg_2024-04-11T16:57:48.166543000Z_GetDataContractHistoryRequest_1519241de3a099f69aa1d8523aef8505da12dd67cb9d5d8b43fad82de9d06061.json b/packages/rs-sdk/tests/vectors/test_data_contract_history_read/msg_2024-04-11T16:57:48.166543000Z_GetDataContractHistoryRequest_1519241de3a099f69aa1d8523aef8505da12dd67cb9d5d8b43fad82de9d06061.json new file mode 100644 index 0000000000000000000000000000000000000000..3891dee2469224b71441e63992080713db5648bc GIT binary patch literal 57547 zcmeI*+j87SvW4M&?Wb_?dS9@>^SsK$ghFG{mSQB!qr*h(n9#fL1|>`A?{6ETPHvIy z3zlZJdJpc9RZ$JKbb2y(ke*gF8=*gqa(cf=AnLj;0 z{@?e1k8!d%xIF)GaC-LP?=cpCA1@BBmP1`F?wH2nlhdok?N^IA&X;#AE?Tbee7V4j z#liW-hf&WLH&2Vdmp5NbAFe-HjB~d9d%2*q#lbjR%r=(8ZV7jB`C*Rb-&cz{rjyfm z>i@^@7au)+^6bg0jgfwR{q*Vklh1$t`Q>%azI^rY#j6JoUp;vCa&yDcI6iuR!*4I1 z|L1yh^3{vi*EdtV+5G$Fhc`d`&kr*$)?o7N`qjfn4_`gpjPMplH&A+f{p6R&^D2(U z>4&*Cqy6;!#r1=q9zT5Y>w~AyfBM(;qX+LV-Dqne@X_^e&wqNn8DRm5qgPL!UH>k^ z#h5P7PS4M$v*U~R(rjkf$n)y?PtTt|_<-*P_Kx1peFN^JM-N{^VX@&w7<-1eDu!;zkm3_b7qAsRxlqfKy`C?vH;D^ z39euI#r*jKF!SL?6TdHbKKya1v-!}`PM!aF;a)d4Fy5BK≶rZcoVl6UPf1&Ua5| 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_history_read/quorum_pubkey-106-0db75802182bb9b9417e92b278832a287dd182f4ea3b1b4bf70dcd56c1b87d78.json b/packages/rs-sdk/tests/vectors/test_data_contract_history_read/quorum_pubkey-106-0db75802182bb9b9417e92b278832a287dd182f4ea3b1b4bf70dcd56c1b87d78.json new file mode 100644 index 0000000000..e836917eaf --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_data_contract_history_read/quorum_pubkey-106-0db75802182bb9b9417e92b278832a287dd182f4ea3b1b4bf70dcd56c1b87d78.json @@ -0,0 +1 @@ +[134,90,211,2,159,204,117,201,202,79,41,171,146,86,115,171,247,117,185,147,133,32,111,139,93,126,226,86,104,239,140,58,90,36,89,121,41,96,244,146,48,229,249,80,185,69,142,129] \ No newline at end of file From 377087b0218b9ccf599ce1524e063f406c13418d Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Thu, 25 Apr 2024 19:35:18 +0700 Subject: [PATCH 145/191] feat(platform)!: basic nft support (#1829) --- Cargo.lock | 20 +- .../schema/v1/dashpay.schema.json | 1 + .../document/v0/document-meta.json | 29 + .../rs-dpp/src/data_contract/config/fields.rs | 3 + .../methods/validate_config_update/v0/mod.rs | 14 + .../rs-dpp/src/data_contract/config/mod.rs | 12 + .../rs-dpp/src/data_contract/config/v0/mod.rs | 26 +- .../document_type/accessors/mod.rs | 56 + .../document_type/accessors/v0/mod.rs | 11 + .../mod.rs | 3 + .../v0/mod.rs | 2 + .../class_methods/try_from_schema/mod.rs | 2 + .../class_methods/try_from_schema/v0/mod.rs | 44 +- .../document_type/methods/mod.rs | 5 +- .../src/data_contract/document_type/mod.rs | 7 + .../document_type/restricted_creation/mod.rs | 44 + .../document_type/v0/accessors.rs | 14 + .../src/data_contract/document_type/v0/mod.rs | 11 +- .../document_type/v0/random_document_type.rs | 11 + .../data_contract/extra/drive_api_tests.rs | 8 + .../src/data_contract/v0/methods/schema.rs | 2 + .../src/data_contract/v0/serialization/mod.rs | 1 + packages/rs-dpp/src/document/accessors/mod.rs | 6 + .../rs-dpp/src/document/accessors/v0/mod.rs | 1 + .../src/document/extended_document/mod.rs | 2 +- .../src/document/extended_document/v0/mod.rs | 5 +- packages/rs-dpp/src/document/fields.rs | 1 + packages/rs-dpp/src/document/v0/accessors.rs | 9 + packages/rs-dpp/src/document/v0/serialize.rs | 54 +- .../src/errors/consensus/basic/basic_error.rs | 29 +- ...incompatible_data_contract_schema_error.rs | 2 +- .../consensus/basic/data_contract/mod.rs | 4 + ...ocument_creation_restriction_mode_error.rs | 47 + .../data_contract/unknown_trade_mode_error.rs | 47 + .../document_creation_not_allowed_error.rs | 58 + .../errors/consensus/basic/document/mod.rs | 2 + packages/rs-dpp/src/errors/consensus/codes.rs | 5 + ...document_incorrect_purchase_price_error.rs | 58 + .../document/document_not_for_sale_error.rs | 37 + .../errors/consensus/state/document/mod.rs | 2 + .../src/errors/consensus/state/state_error.rs | 8 + packages/rs-dpp/src/fee/fee_result/mod.rs | 2 +- packages/rs-dpp/src/lib.rs | 1 + packages/rs-dpp/src/nft/mod.rs | 55 + .../document_transition/action_type.rs | 4 + .../from_document.rs | 45 + .../document_purchase_transition/mod.rs | 19 + .../v0/from_document.rs | 40 + .../document_purchase_transition/v0/mod.rs | 33 + .../v0/v0_methods.rs | 50 + .../v0_methods.rs | 43 + .../from_document.rs | 44 + .../document_update_price_transition/mod.rs | 19 + .../v0/from_document.rs | 36 + .../v0/mod.rs | 277 + .../v0/v0_methods.rs | 58 + .../v0_methods.rs | 49 + .../document_transition/mod.rs | 50 +- .../documents_batch_transition/methods/mod.rs | 108 +- .../methods/v0/mod.rs | 38 +- .../v0/v0_methods.rs | 116 +- packages/rs-dpp/src/util/json_schema.rs | 1 + packages/rs-dpp/src/util/mod.rs | 1 + packages/rs-dpp/src/util/units.rs | 29 + .../src/execution/check_tx/v0/mod.rs | 16 +- .../create_genesis_state/v0/mod.rs | 4 +- .../execution/types/execution_event/mod.rs | 19 + .../v0/mod.rs | 2 +- .../state_transition/processor/v0/mod.rs | 4 +- .../data_contract_update/mod.rs | 173 +- .../data_contract_update/state/v0/mod.rs | 1 + .../document_create_transition_action/mod.rs | 4 +- .../state_v0/mod.rs | 28 +- .../structure_v0/mod.rs | 39 +- .../structure_v0/mod.rs | 4 +- .../mod.rs | 87 + .../state_v0/mod.rs | 70 + .../structure_v0/mod.rs | 61 + .../state_v0/mod.rs | 30 +- .../state_v0/mod.rs | 30 +- .../mod.rs | 87 + .../state_v0/mod.rs | 68 + .../structure_v0/mod.rs | 49 + .../documents_batch/action_validation/mod.rs | 2 + .../advanced_structure/v0/mod.rs | 30 +- .../documents_batch/balance/mod.rs | 33 + .../documents_batch/balance/v0/mod.rs | 54 + .../data_triggers/bindings/list/v0/mod.rs | 12 - .../state_transitions/documents_batch/mod.rs | 5440 ++++++++++++----- .../documents_batch/state/v0/mod.rs | 21 + .../documents_batch/transformer/v0/mod.rs | 143 +- .../rs-drive-abci/src/test/helpers/setup.rs | 37 +- .../tests/strategy_tests/main.rs | 7 +- .../verify_state_transitions.rs | 41 + ...ame-all-transferable-no-owner-indexes.json | 114 + .../crypto-card-game-all-transferable.json | 1 + ...purchase-creation-restricted-to-owner.json | 135 + .../crypto-card-game-direct-purchase.json | 134 + ...equest-mutable-and-can-not-be-deleted.json | 234 + ...equest-not-mutable-and-can-be-deleted.json | 234 + packages/rs-drive-proof-verifier/Cargo.toml | 2 +- packages/rs-drive/Cargo.toml | 10 +- .../document/document_purchase_transition.rs | 61 + .../document/document_transition.rs | 14 + .../document_update_price_transition.rs | 46 + .../drive/batch/transitions/document/mod.rs | 2 + .../v0/mod.rs | 2 +- .../drive/document/index_uniqueness/mod.rs | 2 + .../mod.rs | 70 + .../v0/mod.rs | 64 + .../mod.rs | 70 + .../v0/mod.rs | 64 + .../v0/mod.rs | 8 +- packages/rs-drive/src/drive/flags.rs | 90 +- .../v0/mod.rs | 30 +- .../v0/mod.rs | 26 +- .../v0/mod.rs | 30 + packages/rs-drive/src/query/test_index.rs | 1 + .../document_transition/action_type.rs | 4 + .../mod.rs | 98 + .../transformer.rs | 33 + .../v0/mod.rs | 37 + .../v0/transformer.rs | 59 + .../v0/transformer.rs | 8 +- .../mod.rs | 85 + .../transformer.rs | 31 + .../v0/mod.rs | 26 + .../v0/transformer.rs | 51 + .../document_transition/mod.rs | 14 + .../document/documents_batch/mod.rs | 8 + .../document/documents_batch/v0/mod.rs | 21 + .../rs-drive/tests/deterministic_root_hash.rs | 2 +- packages/rs-drive/tests/query_tests.rs | 52 +- .../rs-drive/tests/query_tests_history.rs | 8 +- .../src/rules/rule_set.rs | 351 ++ packages/rs-platform-version/Cargo.toml | 2 +- .../src/version/dpp_versions.rs | 2 + .../src/version/drive_abci_versions.rs | 5 + .../src/version/drive_versions.rs | 2 + .../fee/state_transition_min_fees/mod.rs | 2 +- .../fee/state_transition_min_fees/v1.rs | 2 +- .../src/version/mocks/v2_test.rs | 21 + .../src/version/mocks/v3_test.rs | 21 + .../rs-platform-version/src/version/v1.rs | 21 + packages/rs-sdk/src/platform/transition.rs | 2 + .../platform/transition/purchase_document.rs | 181 + .../transition/update_price_of_document.rs | 168 + packages/rs-sdk/tests/fetch/common.rs | 1 + ...1733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json} | Bin 74128 -> 74146 bytes ...a6c7c92c604537febea6e2287e0e3f386284.json} | Bin 24209 -> 24260 bytes ...86e1afd90c1d4732f93cf8287fa0e9c27e35e.json | 1 + ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 - ...1733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json} | Bin 74128 -> 74146 bytes ...e4e5ee0324e5f38b49daf9dc9d1f1384bdae.json} | Bin 24209 -> 24260 bytes ...86e1afd90c1d4732f93cf8287fa0e9c27e35e.json | 1 + ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 - ...1733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json} | Bin 74128 -> 74146 bytes ...a6c7c92c604537febea6e2287e0e3f386284.json} | Bin 24209 -> 24260 bytes ...fd789f4e600ee4aa306f63d281b740f2d0e7.json} | Bin 24335 -> 24386 bytes ...86e1afd90c1d4732f93cf8287fa0e9c27e35e.json | 1 + ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 - ...01c1ba166a2dd8f6efb31b0289dc011da983.json} | Bin 8837 -> 8844 bytes ...86e1afd90c1d4732f93cf8287fa0e9c27e35e.json | 1 + ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 - ...1733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json} | Bin 74128 -> 74146 bytes ...71699f696f184c08c2a12a5930a1d6631661.json} | Bin 22299 -> 22350 bytes ...86e1afd90c1d4732f93cf8287fa0e9c27e35e.json | 1 + ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 - ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 74128 -> 0 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 0 -> 74146 bytes ...86e1afd90c1d4732f93cf8287fa0e9c27e35e.json | 1 + ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 - ...8c03122daf7ab2e77108f4bf44af1ad15eae.json} | Bin 8837 -> 8844 bytes ...86e1afd90c1d4732f93cf8287fa0e9c27e35e.json | 1 + ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 - ...67bd9ccc29eca3092a5664a5a9ba3bb7e967.json} | Bin 75594 -> 75616 bytes ...86e1afd90c1d4732f93cf8287fa0e9c27e35e.json | 1 + ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 - ...bbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json} | Bin 8690 -> 8697 bytes ...86e1afd90c1d4732f93cf8287fa0e9c27e35e.json | 1 + ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 - ...776113debe4287515ae60d0645da450a80a1.json} | Bin 19700 -> 20855 bytes ...caf3663c40a12d3b03827006d66058e439ac.json} | Bin 1466620 -> 1466608 bytes ...86e1afd90c1d4732f93cf8287fa0e9c27e35e.json | 1 + ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 - ...776113debe4287515ae60d0645da450a80a1.json} | Bin 19700 -> 20855 bytes ...7089535588985622579e77969e0ffd68afc7.json} | Bin 21205 -> 21193 bytes ...86e1afd90c1d4732f93cf8287fa0e9c27e35e.json | 1 + ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 - ...776113debe4287515ae60d0645da450a80a1.json} | Bin 19700 -> 20855 bytes ...dd01a7428085ffdcf1e11cccf19c48c5f7a1.json} | Bin 2668626 -> 2668629 bytes ...86e1afd90c1d4732f93cf8287fa0e9c27e35e.json | 1 + ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 - ...7776113debe4287515ae60d0645da450a80a1.json | Bin 0 -> 20855 bytes ...592c8fe7361bed628d9a36747664c9789bf1.json} | Bin 2437729 -> 2437720 bytes ...86e1afd90c1d4732f93cf8287fa0e9c27e35e.json | 1 + ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 - ...7776113debe4287515ae60d0645da450a80a1.json | Bin 19700 -> 0 bytes ...7776113debe4287515ae60d0645da450a80a1.json | Bin 0 -> 20855 bytes ...0b93d9d2e841a5e3d60755f8e7be3b93315b.json} | Bin 2425355 -> 2425346 bytes ...86e1afd90c1d4732f93cf8287fa0e9c27e35e.json | 1 + ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 - ...776113debe4287515ae60d0645da450a80a1.json} | Bin 10644 -> 11193 bytes ...86e1afd90c1d4732f93cf8287fa0e9c27e35e.json | 1 + ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 - ...7776113debe4287515ae60d0645da450a80a1.json | Bin 18554 -> 0 bytes ...776113debe4287515ae60d0645da450a80a1.json} | Bin 19700 -> 19709 bytes ...86e1afd90c1d4732f93cf8287fa0e9c27e35e.json | 1 + ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 - ...fa69b4749b19cc1f5ef0abf37fa0c04ab2ef.json} | Bin 13407 -> 13996 bytes ...86e1afd90c1d4732f93cf8287fa0e9c27e35e.json | 1 + ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 - ...a459dc7a67570ea6df3f8858d3fae7820ffe.json} | Bin 14334 -> 14923 bytes ...86e1afd90c1d4732f93cf8287fa0e9c27e35e.json | 1 + ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 - ...53464633a072722c5a04b15ee01f3a45de99.json} | Bin 22156 -> 23447 bytes ...86e1afd90c1d4732f93cf8287fa0e9c27e35e.json | 1 + ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 - ...53464633a072722c5a04b15ee01f3a45de99.json} | Bin 22156 -> 23447 bytes ...28f9b6b120d8fa853e3398e1539b8fc54d9b.json} | Bin 28889 -> 29547 bytes ...86e1afd90c1d4732f93cf8287fa0e9c27e35e.json | 1 + ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 - ...550f0ea4a6af6f68037e7d50ff4e4de74509.json} | Bin 8229 -> 8216 bytes ...86e1afd90c1d4732f93cf8287fa0e9c27e35e.json | 1 + ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 - ...06e5eda740be44679cc960ea35f2134af628.json} | Bin 10897 -> 10892 bytes ...86e1afd90c1d4732f93cf8287fa0e9c27e35e.json | 1 + ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 - ...f1acc3394d29ac72f662d38e81344496631e.json} | Bin 10645 -> 10644 bytes ...86e1afd90c1d4732f93cf8287fa0e9c27e35e.json | 1 + ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 - ...b1a05862cb8d40c088b193b59ca3564210bc.json} | Bin 11313 -> 11317 bytes ...86e1afd90c1d4732f93cf8287fa0e9c27e35e.json | 1 + ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 - ...2dfc69cc7b123be24b7ad993281979b2a3a2.json} | Bin 11003 -> 11002 bytes ...86e1afd90c1d4732f93cf8287fa0e9c27e35e.json | 1 + ...4f96cedd665e3629baec62e8777fe169fc6e7.json | 1 - packages/strategy-tests/src/operations.rs | 1 + packages/wasm-dpp/Cargo.toml | 2 +- .../src/errors/consensus/consensus_error.rs | 21 +- .../unit/dataContract/DataContract.spec.js | 4 +- .../DataContractCreateTransition.spec.js | 2 +- .../DataContractUpdateTransition.spec.js | 2 +- .../test/unit/document/Document.spec.js | 2 +- 244 files changed, 9617 insertions(+), 1646 deletions(-) create mode 100644 packages/rs-dpp/src/data_contract/document_type/restricted_creation/mod.rs create mode 100644 packages/rs-dpp/src/errors/consensus/basic/data_contract/unknown_document_creation_restriction_mode_error.rs create mode 100644 packages/rs-dpp/src/errors/consensus/basic/data_contract/unknown_trade_mode_error.rs create mode 100644 packages/rs-dpp/src/errors/consensus/basic/document/document_creation_not_allowed_error.rs create mode 100644 packages/rs-dpp/src/errors/consensus/state/document/document_incorrect_purchase_price_error.rs create mode 100644 packages/rs-dpp/src/errors/consensus/state/document/document_not_for_sale_error.rs create mode 100644 packages/rs-dpp/src/nft/mod.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/from_document.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/mod.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0/from_document.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0/mod.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0/v0_methods.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0_methods.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/from_document.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/mod.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0/from_document.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0/mod.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0/v0_methods.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0_methods.rs create mode 100644 packages/rs-dpp/src/util/units.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_purchase_transition_action/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_purchase_transition_action/state_v0/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_purchase_transition_action/structure_v0/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_update_price_transition_action/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_update_price_transition_action/state_v0/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_update_price_transition_action/structure_v0/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/balance/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/balance/v0/mod.rs create mode 100644 packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-all-transferable-no-owner-indexes.json create mode 100644 packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-direct-purchase-creation-restricted-to-owner.json create mode 100644 packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-direct-purchase.json create mode 100644 packages/rs-drive-abci/tests/supporting_files/contract/dashpay/dashpay-contract-contact-request-mutable-and-can-not-be-deleted.json create mode 100644 packages/rs-drive-abci/tests/supporting_files/contract/dashpay/dashpay-contract-contact-request-not-mutable-and-can-be-deleted.json create mode 100644 packages/rs-drive/src/drive/batch/transitions/document/document_purchase_transition.rs create mode 100644 packages/rs-drive/src/drive/batch/transitions/document/document_update_price_transition.rs create mode 100644 packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/mod.rs create mode 100644 packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/mod.rs create mode 100644 packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/v0/mod.rs create mode 100644 packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/mod.rs create mode 100644 packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/transformer.rs create mode 100644 packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/v0/mod.rs create mode 100644 packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/v0/transformer.rs create mode 100644 packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/mod.rs create mode 100644 packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/transformer.rs create mode 100644 packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/v0/mod.rs create mode 100644 packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/v0/transformer.rs create mode 100644 packages/rs-sdk/src/platform/transition/purchase_document.rs create mode 100644 packages/rs-sdk/src/platform/transition/update_price_of_document.rs rename packages/rs-sdk/tests/vectors/document_list_document_query/{msg_2024-04-20T17:32:57.729547000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json => msg_2024-04-24T00:37:29.546154000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json} (96%) rename packages/rs-sdk/tests/vectors/document_list_document_query/{msg_2024-04-20T17:32:57.791831000Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json => msg_2024-04-24T00:37:29.598081000Z_DocumentQuery_466b07ebed6757e3497ed2487cd8a6c7c92c604537febea6e2287e0e3f386284.json} (87%) create mode 100644 packages/rs-sdk/tests/vectors/document_list_document_query/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json delete mode 100644 packages/rs-sdk/tests/vectors/document_list_document_query/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json rename packages/rs-sdk/tests/vectors/{document_read/msg_2024-04-20T17:32:57.732862000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json => document_list_drive_query/msg_2024-04-24T00:37:29.544194000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json} (96%) rename packages/rs-sdk/tests/vectors/document_list_drive_query/{msg_2024-04-20T17:32:57.791314000Z_DocumentQuery_c104c67292061fe0b8e2f959cd2625892e0011f1264c65e1474532f59456ff51.json => msg_2024-04-24T00:37:29.598737000Z_DocumentQuery_f7b86e21e5bcf796a7c9d570c64ee4e5ee0324e5f38b49daf9dc9d1f1384bdae.json} (87%) create mode 100644 packages/rs-sdk/tests/vectors/document_list_drive_query/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json delete mode 100644 packages/rs-sdk/tests/vectors/document_list_drive_query/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json rename packages/rs-sdk/tests/vectors/{document_read_no_document/msg_2024-04-20T17:32:57.729722000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json => document_read/msg_2024-04-24T00:37:29.546204000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json} (96%) rename packages/rs-sdk/tests/vectors/document_read/{msg_2024-04-20T17:32:57.792844000Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json => msg_2024-04-24T00:37:29.597728000Z_DocumentQuery_466b07ebed6757e3497ed2487cd8a6c7c92c604537febea6e2287e0e3f386284.json} (87%) rename packages/rs-sdk/tests/vectors/document_read/{msg_2024-04-20T17:32:57.805474000Z_DocumentQuery_90af5a08200f1b0e42dbd3ad7a6af38ff6415d9cabab87315b9d9d736194597f.json => msg_2024-04-24T00:37:29.611459000Z_DocumentQuery_254e866b054c1427a47d649d455dfd789f4e600ee4aa306f63d281b740f2d0e7.json} (87%) create mode 100644 packages/rs-sdk/tests/vectors/document_read/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json delete mode 100644 packages/rs-sdk/tests/vectors/document_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json rename packages/rs-sdk/tests/vectors/document_read_no_contract/{msg_2024-04-20T17:32:57.733023000Z_GetDataContractRequest_e4cf74168e03a40bd159451456b501c1ba166a2dd8f6efb31b0289dc011da983.json => msg_2024-04-24T00:37:29.543524000Z_GetDataContractRequest_e4cf74168e03a40bd159451456b501c1ba166a2dd8f6efb31b0289dc011da983.json} (66%) create mode 100644 packages/rs-sdk/tests/vectors/document_read_no_contract/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json delete mode 100644 packages/rs-sdk/tests/vectors/document_read_no_contract/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json rename packages/rs-sdk/tests/vectors/{document_list_drive_query/msg_2024-04-20T17:32:57.734304000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json => document_read_no_document/msg_2024-04-24T00:37:29.545143000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json} (96%) rename packages/rs-sdk/tests/vectors/document_read_no_document/{msg_2024-04-20T17:32:57.792219000Z_DocumentQuery_fb3b25c8fa37750a6c1b18d9085fcf0df7bf150009b1ced887a6f051ab86085b.json => msg_2024-04-24T00:37:29.598817000Z_DocumentQuery_d67f67ad2f9ff259ca475971fae971699f696f184c08c2a12a5930a1d6631661.json} (86%) create mode 100644 packages/rs-sdk/tests/vectors/document_read_no_document/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json delete mode 100644 packages/rs-sdk/tests/vectors/document_read_no_document/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json delete mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_read/msg_2024-04-20T17:32:57.729789000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json create mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_read/msg_2024-04-24T00:37:29.546319000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json create mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_read/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json delete mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json rename packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/{msg_2024-04-20T17:32:57.732964000Z_GetDataContractRequest_1d1e53ab5e04d9ec5dce4ff9ac048c03122daf7ab2e77108f4bf44af1ad15eae.json => msg_2024-04-24T00:37:29.544535000Z_GetDataContractRequest_1d1e53ab5e04d9ec5dce4ff9ac048c03122daf7ab2e77108f4bf44af1ad15eae.json} (66%) create mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json delete mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json rename packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/{msg_2024-04-20T17:32:57.730152000Z_GetDataContractsRequest_f229a0e58a5c4fb050f57c087bf067bd9ccc29eca3092a5664a5a9ba3bb7e967.json => msg_2024-04-24T00:37:29.544223000Z_GetDataContractsRequest_f229a0e58a5c4fb050f57c087bf067bd9ccc29eca3092a5664a5a9ba3bb7e967.json} (96%) create mode 100644 packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json delete mode 100644 packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json rename packages/rs-sdk/tests/vectors/test_data_contracts_2_nx/{msg_2024-04-20T17:32:57.729112000Z_GetDataContractsRequest_93bdf343bce1bafb96fd873236cabbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json => msg_2024-04-24T00:37:29.547687000Z_GetDataContractsRequest_93bdf343bce1bafb96fd873236cabbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json} (66%) create mode 100644 packages/rs-sdk/tests/vectors/test_data_contracts_2_nx/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json delete mode 100644 packages/rs-sdk/tests/vectors/test_data_contracts_2_nx/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json rename packages/rs-sdk/tests/vectors/{test_epoch_list/msg_2024-04-20T17:32:57.792457000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json => test_epoch_fetch/msg_2024-04-24T00:37:29.599078000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json} (74%) rename packages/rs-sdk/tests/vectors/test_epoch_fetch/{msg_2024-04-20T17:32:57.933588000Z_GetEpochsInfoRequest_b2b426ac4a52cb4cb08904c63386caf3663c40a12d3b03827006d66058e439ac.json => msg_2024-04-24T00:37:29.754758000Z_GetEpochsInfoRequest_b2b426ac4a52cb4cb08904c63386caf3663c40a12d3b03827006d66058e439ac.json} (99%) create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json rename packages/rs-sdk/tests/vectors/{test_epoch_fetch_future/msg_2024-04-20T17:32:57.792846000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json => test_epoch_fetch_current/msg_2024-04-24T00:37:29.598966000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json} (74%) rename packages/rs-sdk/tests/vectors/test_epoch_fetch_current/{msg_2024-04-20T17:32:57.795519000Z_GetEpochsInfoRequest_1b87e649557ccb609adb9e2904c67089535588985622579e77969e0ffd68afc7.json => msg_2024-04-24T00:37:29.606190000Z_GetEpochsInfoRequest_1b87e649557ccb609adb9e2904c67089535588985622579e77969e0ffd68afc7.json} (86%) create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json rename packages/rs-sdk/tests/vectors/{test_epoch_fetch/msg_2024-04-20T17:32:57.792584000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json => test_epoch_fetch_future/msg_2024-04-24T00:37:29.598638000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json} (74%) rename packages/rs-sdk/tests/vectors/test_epoch_fetch_future/{msg_2024-04-20T17:32:58.239918000Z_GetEpochsInfoRequest_6a828350e795a088dbc835260a1add01a7428085ffdcf1e11cccf19c48c5f7a1.json => msg_2024-04-24T00:37:30.085258000Z_GetEpochsInfoRequest_6a828350e795a088dbc835260a1add01a7428085ffdcf1e11cccf19c48c5f7a1.json} (99%) create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list/msg_2024-04-24T00:37:29.599207000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json rename packages/rs-sdk/tests/vectors/test_epoch_list/{msg_2024-04-20T17:32:58.219154000Z_GetEpochsInfoRequest_734f6594c67fe6a9ab170191031d592c8fe7361bed628d9a36747664c9789bf1.json => msg_2024-04-24T00:37:30.072218000Z_GetEpochsInfoRequest_734f6594c67fe6a9ab170191031d592c8fe7361bed628d9a36747664c9789bf1.json} (99%) create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_2024-04-20T17:32:57.794148000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_2024-04-24T00:37:29.599593000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json rename packages/rs-sdk/tests/vectors/test_epoch_list_limit/{msg_2024-04-20T17:32:58.215202000Z_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json => msg_2024-04-24T00:37:30.072303000Z_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json} (99%) create mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list_limit/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json delete mode 100644 packages/rs-sdk/tests/vectors/test_epoch_list_limit/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json rename packages/rs-sdk/tests/vectors/test_identity_balance_read/{msg_2024-04-20T17:32:57.805378000Z_GetIdentityBalanceRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json => msg_2024-04-24T00:37:29.611908000Z_GetIdentityBalanceRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json} (68%) create mode 100644 packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/msg_2024-04-20T17:32:57.807110000Z_GetIdentityBalanceAndRevisionRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json rename packages/rs-sdk/tests/vectors/{test_epoch_fetch_current/msg_2024-04-20T17:32:57.791668000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json => test_identity_balance_revision_read/msg_2024-04-24T00:37:29.615871000Z_GetIdentityBalanceAndRevisionRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json} (75%) create mode 100644 packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json rename packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/{msg_2024-04-20T17:32:57.825471000Z_GetIdentityContractNonceRequest_b7c02dae0c3c762ece1f70a36f88fa69b4749b19cc1f5ef0abf37fa0c04ab2ef.json => msg_2024-04-24T00:37:29.632356000Z_GetIdentityContractNonceRequest_b7c02dae0c3c762ece1f70a36f88fa69b4749b19cc1f5ef0abf37fa0c04ab2ef.json} (71%) create mode 100644 packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json rename packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/{msg_2024-04-20T17:32:57.805215000Z_GetIdentityKeysRequest_b4ecff7acf52818aef9ed37a98d4a459dc7a67570ea6df3f8858d3fae7820ffe.json => msg_2024-04-24T00:37:29.611949000Z_GetIdentityKeysRequest_b4ecff7acf52818aef9ed37a98d4a459dc7a67570ea6df3f8858d3fae7820ffe.json} (72%) create mode 100644 packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json rename packages/rs-sdk/tests/vectors/test_identity_read/{msg_2024-04-20T17:32:57.819765000Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json => msg_2024-04-24T00:37:29.627284000Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json} (74%) create mode 100644 packages/rs-sdk/tests/vectors/test_identity_read/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json rename packages/rs-sdk/tests/vectors/test_identity_read_by_key/{msg_2024-04-20T17:32:57.822981000Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json => msg_2024-04-24T00:37:29.629157000Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json} (74%) rename packages/rs-sdk/tests/vectors/test_identity_read_by_key/{msg_2024-04-20T17:32:57.846960000Z_IdentityRequest_3107337faa1f180a1071b78a90dcdc46e3cf0d7d4ce093bba24086e17410ed7d.json => msg_2024-04-24T00:37:29.651813000Z_IdentityRequest_abf7b19244827334575a04cf67f428f9b6b120d8fa853e3398e1539b8fc54d9b.json} (77%) create mode 100644 packages/rs-sdk/tests/vectors/test_identity_read_by_key/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json delete mode 100644 packages/rs-sdk/tests/vectors/test_identity_read_by_key/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json rename packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/{msg_2024-04-20T17:32:57.844598000Z_GetProtocolVersionUpgradeStateRequest_bb149e1933b9dc561bbfacfb6d09550f0ea4a6af6f68037e7d50ff4e4de74509.json => msg_2024-04-24T00:37:29.650095000Z_GetProtocolVersionUpgradeStateRequest_bb149e1933b9dc561bbfacfb6d09550f0ea4a6af6f68037e7d50ff4e4de74509.json} (67%) create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json delete mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json rename packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/{msg_2024-04-20T17:32:57.847045000Z_GetProtocolVersionUpgradeVoteStatusRequest_ec9dca65a964669b3bc8195d5ff106e5eda740be44679cc960ea35f2134af628.json => msg_2024-04-24T00:37:29.650285000Z_GetProtocolVersionUpgradeVoteStatusRequest_ec9dca65a964669b3bc8195d5ff106e5eda740be44679cc960ea35f2134af628.json} (69%) create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json delete mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json rename packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/{msg_2024-04-20T17:32:57.846269000Z_GetProtocolVersionUpgradeVoteStatusRequest_983670ac95678b1166deab32209bf1acc3394d29ac72f662d38e81344496631e.json => msg_2024-04-24T00:37:29.653372000Z_GetProtocolVersionUpgradeVoteStatusRequest_983670ac95678b1166deab32209bf1acc3394d29ac72f662d38e81344496631e.json} (68%) create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json delete mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json rename packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/{msg_2024-04-20T17:32:57.853232000Z_GetProtocolVersionUpgradeVoteStatusRequest_8534be7e0b4dd648520dc3a67209b1a05862cb8d40c088b193b59ca3564210bc.json => msg_2024-04-24T00:37:29.656446000Z_GetProtocolVersionUpgradeVoteStatusRequest_8534be7e0b4dd648520dc3a67209b1a05862cb8d40c088b193b59ca3564210bc.json} (71%) create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json delete mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json rename packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/{msg_2024-04-20T17:32:57.858773000Z_GetProtocolVersionUpgradeVoteStatusRequest_92a45a0fe4f69d355022d2f2f7622dfc69cc7b123be24b7ad993281979b2a3a2.json => msg_2024-04-24T00:37:29.661820000Z_GetProtocolVersionUpgradeVoteStatusRequest_92a45a0fe4f69d355022d2f2f7622dfc69cc7b123be24b7ad993281979b2a3a2.json} (69%) create mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json delete mode 100644 packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json diff --git a/Cargo.lock b/Cargo.lock index 020768c914..084f5b1851 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1876,7 +1876,7 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "grovedb" version = "1.0.0-rc.2" -source = "git+https://github.com/dashpay/grovedb?rev=f5a3382c5537de7417e983cdf2132792aa9fdc9d#f5a3382c5537de7417e983cdf2132792aa9fdc9d" +source = "git+https://github.com/dashpay/grovedb?rev=941dd86d70c86e7a236541919e789dba078abae6#941dd86d70c86e7a236541919e789dba078abae6" dependencies = [ "bincode", "grovedb-costs", @@ -1897,7 +1897,7 @@ dependencies = [ [[package]] name = "grovedb-costs" version = "1.0.0-rc.2" -source = "git+https://github.com/dashpay/grovedb?rev=f5a3382c5537de7417e983cdf2132792aa9fdc9d#f5a3382c5537de7417e983cdf2132792aa9fdc9d" +source = "git+https://github.com/dashpay/grovedb?rev=941dd86d70c86e7a236541919e789dba078abae6#941dd86d70c86e7a236541919e789dba078abae6" dependencies = [ "integer-encoding", "intmap", @@ -1907,7 +1907,7 @@ dependencies = [ [[package]] name = "grovedb-merk" version = "1.0.0-rc.2" -source = "git+https://github.com/dashpay/grovedb?rev=f5a3382c5537de7417e983cdf2132792aa9fdc9d#f5a3382c5537de7417e983cdf2132792aa9fdc9d" +source = "git+https://github.com/dashpay/grovedb?rev=941dd86d70c86e7a236541919e789dba078abae6#941dd86d70c86e7a236541919e789dba078abae6" dependencies = [ "blake3", "byteorder", @@ -1930,12 +1930,12 @@ dependencies = [ [[package]] name = "grovedb-path" version = "1.0.0-rc.2" -source = "git+https://github.com/dashpay/grovedb?rev=f5a3382c5537de7417e983cdf2132792aa9fdc9d#f5a3382c5537de7417e983cdf2132792aa9fdc9d" +source = "git+https://github.com/dashpay/grovedb?rev=941dd86d70c86e7a236541919e789dba078abae6#941dd86d70c86e7a236541919e789dba078abae6" [[package]] name = "grovedb-storage" version = "1.0.0-rc.2" -source = "git+https://github.com/dashpay/grovedb?rev=f5a3382c5537de7417e983cdf2132792aa9fdc9d#f5a3382c5537de7417e983cdf2132792aa9fdc9d" +source = "git+https://github.com/dashpay/grovedb?rev=941dd86d70c86e7a236541919e789dba078abae6#941dd86d70c86e7a236541919e789dba078abae6" dependencies = [ "blake3", "grovedb-costs", @@ -1954,7 +1954,7 @@ dependencies = [ [[package]] name = "grovedb-visualize" version = "1.0.0-rc.2" -source = "git+https://github.com/dashpay/grovedb?rev=f5a3382c5537de7417e983cdf2132792aa9fdc9d#f5a3382c5537de7417e983cdf2132792aa9fdc9d" +source = "git+https://github.com/dashpay/grovedb?rev=941dd86d70c86e7a236541919e789dba078abae6#941dd86d70c86e7a236541919e789dba078abae6" dependencies = [ "hex", "itertools 0.12.1", @@ -4403,18 +4403,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.58" +version = "1.0.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" +checksum = "f0126ad08bff79f29fc3ae6a55cc72352056dfff61e3ff8bb7129476d44b23aa" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.58" +version = "1.0.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" +checksum = "d1cd413b5d558b4c5bf3680e324a6fa5014e7b7c067a51e69dbdf47eb7148b66" dependencies = [ "proc-macro2", "quote", diff --git a/packages/dashpay-contract/schema/v1/dashpay.schema.json b/packages/dashpay-contract/schema/v1/dashpay.schema.json index d4281468ed..016d40db73 100644 --- a/packages/dashpay-contract/schema/v1/dashpay.schema.json +++ b/packages/dashpay-contract/schema/v1/dashpay.schema.json @@ -132,6 +132,7 @@ }, "contactRequest": { "documentsMutable": false, + "canBeDeleted": false, "requiresIdentityEncryptionBoundedKey": 2, "requiresIdentityDecryptionBoundedKey": 2, "type": "object", diff --git a/packages/rs-dpp/schema/meta_schemas/document/v0/document-meta.json b/packages/rs-dpp/schema/meta_schemas/document/v0/document-meta.json index c5067f16e1..e25b17af3d 100644 --- a/packages/rs-dpp/schema/meta_schemas/document/v0/document-meta.json +++ b/packages/rs-dpp/schema/meta_schemas/document/v0/document-meta.json @@ -481,6 +481,18 @@ ], "description": "Public key security level. 0 - Master, 1 - Critical, 2 - High, 3 - Medium. If none specified, High level is used" }, + "documentsKeepHistory": { + "type": "boolean", + "description": "True if the documents keep all their history, default is false" + }, + "documentsMutable": { + "type": "boolean", + "description": "True if the documents are mutable, default is true" + }, + "canBeDeleted": { + "type": "boolean", + "description": "True if the documents can be deleted, default is true" + }, "transferable": { "type": "integer", "enum": [ @@ -489,6 +501,23 @@ ], "description": "Transferable without a marketplace sell. 0 - Never, 1 - Always" }, + "tradeMode": { + "type": "integer", + "enum": [ + 0, + 1 + ], + "description": "Built in marketplace system. 0 - None, 1 - Direct purchase (The user can buy the item without the need for an approval)" + }, + "creationRestrictionMode": { + "type": "integer", + "enum": [ + 0, + 1, + 2 + ], + "description": "Restrictions of document creation. 0 - No restrictions, 1 - Owner only, 2 - No creation (System Only)" + }, "requiresIdentityEncryptionBoundedKey": { "type": "integer", "enum": [ diff --git a/packages/rs-dpp/src/data_contract/config/fields.rs b/packages/rs-dpp/src/data_contract/config/fields.rs index 33ced8f00f..200c0402e0 100644 --- a/packages/rs-dpp/src/data_contract/config/fields.rs +++ b/packages/rs-dpp/src/data_contract/config/fields.rs @@ -3,6 +3,7 @@ pub const DEFAULT_CONTRACT_CAN_BE_DELETED: bool = false; pub const DEFAULT_CONTRACT_MUTABILITY: bool = true; pub const DEFAULT_CONTRACT_DOCUMENTS_KEEPS_HISTORY: bool = false; pub const DEFAULT_CONTRACT_DOCUMENT_MUTABILITY: bool = true; +pub const DEFAULT_CONTRACT_DOCUMENTS_CAN_BE_DELETED: bool = true; pub mod property { pub const CAN_BE_DELETED: &str = "canBeDeleted"; @@ -10,6 +11,8 @@ pub mod property { pub const KEEPS_HISTORY: &str = "keepsHistory"; pub const DOCUMENTS_KEEP_HISTORY_CONTRACT_DEFAULT: &str = "documentsKeepHistoryContractDefault"; pub const DOCUMENTS_MUTABLE_CONTRACT_DEFAULT: &str = "documentsMutableContractDefault"; + pub const DOCUMENTS_CAN_BE_DELETED_CONTRACT_DEFAULT: &str = + "documentsCanBeDeletedContractDefault"; pub const REQUIRES_IDENTITY_ENCRYPTION_BOUNDED_KEY: &str = "requiresIdentityEncryptionBoundedKey"; pub const REQUIRES_IDENTITY_DECRYPTION_BOUNDED_KEY: &str = diff --git a/packages/rs-dpp/src/data_contract/config/methods/validate_config_update/v0/mod.rs b/packages/rs-dpp/src/data_contract/config/methods/validate_config_update/v0/mod.rs index 0003e220b1..90cc1ef73c 100644 --- a/packages/rs-dpp/src/data_contract/config/methods/validate_config_update/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/config/methods/validate_config_update/v0/mod.rs @@ -92,6 +92,20 @@ impl DataContractConfig { ); } + // Validate: Documents can be deleted contract default did not change + + if new_config.documents_can_be_deleted_contract_default() + != self.documents_can_be_deleted_contract_default() + { + return SimpleConsensusValidationResult::new_with_error( + DataContractConfigUpdateError::new( + contract_id, + "contract can not change the default of whether documents can be deleted", + ) + .into(), + ); + } + // Validate: Requires identity encryption bounded key did not change if new_config.requires_identity_encryption_bounded_key() diff --git a/packages/rs-dpp/src/data_contract/config/mod.rs b/packages/rs-dpp/src/data_contract/config/mod.rs index 26aaba3636..aa4a4ef036 100644 --- a/packages/rs-dpp/src/data_contract/config/mod.rs +++ b/packages/rs-dpp/src/data_contract/config/mod.rs @@ -117,6 +117,12 @@ impl DataContractConfigGettersV0 for DataContractConfig { } } + fn documents_can_be_deleted_contract_default(&self) -> bool { + match self { + DataContractConfig::V0(v0) => v0.documents_can_be_deleted_contract_default, + } + } + /// Encryption key storage requirements fn requires_identity_encryption_bounded_key(&self) -> Option { match self { @@ -157,6 +163,12 @@ impl DataContractConfigSettersV0 for DataContractConfig { } } + fn set_documents_can_be_deleted_contract_default(&mut self, value: bool) { + match self { + DataContractConfig::V0(v0) => v0.documents_can_be_deleted_contract_default = value, + } + } + fn set_documents_mutable_contract_default(&mut self, value: bool) { match self { DataContractConfig::V0(v0) => v0.documents_mutable_contract_default = value, diff --git a/packages/rs-dpp/src/data_contract/config/v0/mod.rs b/packages/rs-dpp/src/data_contract/config/v0/mod.rs index 35734a01e5..329361befe 100644 --- a/packages/rs-dpp/src/data_contract/config/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/config/v0/mod.rs @@ -1,8 +1,8 @@ use crate::data_contract::config; use crate::data_contract::config::{ - DataContractConfig, DEFAULT_CONTRACT_CAN_BE_DELETED, DEFAULT_CONTRACT_DOCUMENTS_KEEPS_HISTORY, - DEFAULT_CONTRACT_DOCUMENT_MUTABILITY, DEFAULT_CONTRACT_KEEPS_HISTORY, - DEFAULT_CONTRACT_MUTABILITY, + DataContractConfig, DEFAULT_CONTRACT_CAN_BE_DELETED, DEFAULT_CONTRACT_DOCUMENTS_CAN_BE_DELETED, + DEFAULT_CONTRACT_DOCUMENTS_KEEPS_HISTORY, DEFAULT_CONTRACT_DOCUMENT_MUTABILITY, + DEFAULT_CONTRACT_KEEPS_HISTORY, DEFAULT_CONTRACT_MUTABILITY, }; use crate::data_contract::storage_requirements::keys_for_document_type::StorageKeyRequirements; use crate::ProtocolError; @@ -27,10 +27,14 @@ pub struct DataContractConfigV0 { /// Do documents in the contract keep history. This is a default for all documents in /// the contract, but can be overridden by the document itself pub documents_keep_history_contract_default: bool, - /// Are documents in the contract mutable. This specifies whether the document can be - /// changed or deleted. This is a default for all documents in the contract, but can be - /// overridden by the document itself + /// Are documents in the contract mutable? This specifies whether the documents can be + /// changed. This is a default for all document types in the contract, but can be + /// overridden by the document type config. pub documents_mutable_contract_default: bool, + /// Can documents in the contract be deleted? This specifies whether the documents can be + /// deleted. This is a default for all document types in the contract, but can be + /// overridden by the document types itself. + pub documents_can_be_deleted_contract_default: bool, /// Encryption key storage requirements pub requires_identity_encryption_bounded_key: Option, /// Decryption key storage requirements @@ -53,6 +57,7 @@ pub trait DataContractConfigGettersV0 { /// Returns whether documents in the contract are mutable by default. fn documents_mutable_contract_default(&self) -> bool; + fn documents_can_be_deleted_contract_default(&self) -> bool; /// Encryption key storage requirements fn requires_identity_encryption_bounded_key(&self) -> Option; @@ -78,6 +83,9 @@ pub trait DataContractConfigSettersV0 { /// Sets whether documents in the contract are mutable by default. fn set_documents_mutable_contract_default(&mut self, value: bool); + /// Sets whether documents in the contract can be deleted by default. + fn set_documents_can_be_deleted_contract_default(&mut self, value: bool); + /// Sets Encryption key storage requirements. fn set_requires_identity_encryption_bounded_key( &mut self, @@ -99,6 +107,7 @@ impl std::default::Default for DataContractConfigV0 { keeps_history: DEFAULT_CONTRACT_KEEPS_HISTORY, documents_keep_history_contract_default: DEFAULT_CONTRACT_DOCUMENTS_KEEPS_HISTORY, documents_mutable_contract_default: DEFAULT_CONTRACT_DOCUMENT_MUTABILITY, + documents_can_be_deleted_contract_default: DEFAULT_CONTRACT_DOCUMENTS_CAN_BE_DELETED, requires_identity_encryption_bounded_key: None, requires_identity_decryption_bounded_key: None, } @@ -157,6 +166,10 @@ impl DataContractConfigV0 { .get_optional_bool(config::property::DOCUMENTS_MUTABLE_CONTRACT_DEFAULT)? .unwrap_or(DEFAULT_CONTRACT_DOCUMENT_MUTABILITY); + let documents_can_be_deleted_contract_default = contract + .get_optional_bool(config::property::DOCUMENTS_CAN_BE_DELETED_CONTRACT_DEFAULT)? + .unwrap_or(DEFAULT_CONTRACT_DOCUMENTS_CAN_BE_DELETED); + let requires_identity_encryption_bounded_key = contract .get_optional_integer::(config::property::REQUIRES_IDENTITY_ENCRYPTION_BOUNDED_KEY)? .map(|int| int.try_into()) @@ -173,6 +186,7 @@ impl DataContractConfigV0 { keeps_history, documents_keep_history_contract_default, documents_mutable_contract_default, + documents_can_be_deleted_contract_default, requires_identity_encryption_bounded_key, requires_identity_decryption_bounded_key, }) diff --git a/packages/rs-dpp/src/data_contract/document_type/accessors/mod.rs b/packages/rs-dpp/src/data_contract/document_type/accessors/mod.rs index 3b4aef6b3c..3dea66c691 100644 --- a/packages/rs-dpp/src/data_contract/document_type/accessors/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/accessors/mod.rs @@ -7,9 +7,11 @@ use crate::data_contract::document_type::{DocumentType, DocumentTypeMutRef, Docu use platform_value::{Identifier, Value}; +use crate::data_contract::document_type::restricted_creation::CreationRestrictionMode; use crate::data_contract::storage_requirements::keys_for_document_type::StorageKeyRequirements; use crate::document::transfer::Transferable; use crate::identity::SecurityLevel; +use crate::nft::TradeMode; use indexmap::IndexMap; use std::collections::BTreeSet; pub use v0::*; @@ -87,6 +89,24 @@ impl DocumentTypeV0Getters for DocumentType { } } + fn documents_can_be_deleted(&self) -> bool { + match self { + DocumentType::V0(v0) => v0.documents_can_be_deleted(), + } + } + + fn trade_mode(&self) -> TradeMode { + match self { + DocumentType::V0(v0) => v0.trade_mode(), + } + } + + fn creation_restriction_mode(&self) -> CreationRestrictionMode { + match self { + DocumentType::V0(v0) => v0.creation_restriction_mode(), + } + } + fn documents_transferable(&self) -> Transferable { match self { DocumentType::V0(v0) => v0.documents_transferable(), @@ -191,12 +211,30 @@ impl<'a> DocumentTypeV0Getters for DocumentTypeRef<'a> { } } + fn documents_can_be_deleted(&self) -> bool { + match self { + DocumentTypeRef::V0(v0) => v0.documents_can_be_deleted(), + } + } + fn documents_transferable(&self) -> Transferable { match self { DocumentTypeRef::V0(v0) => v0.documents_transferable(), } } + fn trade_mode(&self) -> TradeMode { + match self { + DocumentTypeRef::V0(v0) => v0.trade_mode(), + } + } + + fn creation_restriction_mode(&self) -> CreationRestrictionMode { + match self { + DocumentTypeRef::V0(v0) => v0.creation_restriction_mode(), + } + } + fn data_contract_id(&self) -> Identifier { match self { DocumentTypeRef::V0(v0) => v0.data_contract_id(), @@ -295,12 +333,30 @@ impl<'a> DocumentTypeV0Getters for DocumentTypeMutRef<'a> { } } + fn documents_can_be_deleted(&self) -> bool { + match self { + DocumentTypeMutRef::V0(v0) => v0.documents_can_be_deleted(), + } + } + fn documents_transferable(&self) -> Transferable { match self { DocumentTypeMutRef::V0(v0) => v0.documents_transferable(), } } + fn trade_mode(&self) -> TradeMode { + match self { + DocumentTypeMutRef::V0(v0) => v0.trade_mode(), + } + } + + fn creation_restriction_mode(&self) -> CreationRestrictionMode { + match self { + DocumentTypeMutRef::V0(v0) => v0.creation_restriction_mode(), + } + } + fn data_contract_id(&self) -> Identifier { match self { DocumentTypeMutRef::V0(v0) => v0.data_contract_id(), diff --git a/packages/rs-dpp/src/data_contract/document_type/accessors/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/accessors/v0/mod.rs index b297b3dd9b..c577029668 100644 --- a/packages/rs-dpp/src/data_contract/document_type/accessors/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/accessors/v0/mod.rs @@ -4,9 +4,11 @@ use crate::data_contract::document_type::property::DocumentProperty; use platform_value::{Identifier, Value}; +use crate::data_contract::document_type::restricted_creation::CreationRestrictionMode; use crate::data_contract::storage_requirements::keys_for_document_type::StorageKeyRequirements; use crate::document::transfer::Transferable; use crate::identity::SecurityLevel; +use crate::nft::TradeMode; use indexmap::IndexMap; use std::collections::BTreeSet; @@ -45,9 +47,18 @@ pub trait DocumentTypeV0Getters { /// Returns the documents mutable flag of the document type. fn documents_mutable(&self) -> bool; + /// Returns the documents can be deleted flag of the document type. + fn documents_can_be_deleted(&self) -> bool; + /// Returns the documents transferable flag of the document type. fn documents_transferable(&self) -> Transferable; + /// Returns the documents trade mode flag of the document type. + fn trade_mode(&self) -> TradeMode; + + /// Returns the creation restriction mode. + fn creation_restriction_mode(&self) -> CreationRestrictionMode; + /// Returns the data contract id of the document type. fn data_contract_id(&self) -> Identifier; diff --git a/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/mod.rs b/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/mod.rs index a2d6e2fe63..b767891bfb 100644 --- a/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/mod.rs @@ -39,6 +39,7 @@ impl DocumentType { schema_defs: Option<&BTreeMap>, documents_keep_history_contract_default: bool, documents_mutable_contract_default: bool, + documents_can_be_deleted_contract_default: bool, validate: bool, validation_operations: &mut Vec, platform_version: &PlatformVersion, @@ -56,6 +57,7 @@ impl DocumentType { schema_defs, documents_keep_history_contract_default, documents_mutable_contract_default, + documents_can_be_deleted_contract_default, validate, validation_operations, platform_version, @@ -85,6 +87,7 @@ mod test { false, false, false, + false, &mut vec![], crate::version::PlatformVersion::latest(), ); diff --git a/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/v0/mod.rs index 12177daec6..1bc7ae3661 100644 --- a/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/v0/mod.rs @@ -15,6 +15,7 @@ impl DocumentTypeV0 { schema_defs: Option<&BTreeMap>, documents_keep_history_contract_default: bool, documents_mutable_contract_default: bool, + documents_can_be_deleted_contract_default: bool, validate: bool, validation_operations: &mut Vec, platform_version: &PlatformVersion, @@ -41,6 +42,7 @@ impl DocumentTypeV0 { schema_defs, documents_keep_history_contract_default, documents_mutable_contract_default, + documents_can_be_deleted_contract_default, validate, validation_operations, platform_version, diff --git a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/mod.rs b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/mod.rs index 023291dc5b..6a0bc14fc3 100644 --- a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/mod.rs @@ -16,6 +16,7 @@ impl DocumentType { schema_defs: Option<&BTreeMap>, default_keeps_history: bool, default_mutability: bool, + default_can_be_deleted: bool, validate: bool, validation_operations: &mut Vec, platform_version: &PlatformVersion, @@ -34,6 +35,7 @@ impl DocumentType { schema_defs, default_keeps_history, default_mutability, + default_can_be_deleted, validate, validation_operations, platform_version, diff --git a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs index 2571ff0cf6..00d16d6fcf 100644 --- a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs @@ -32,6 +32,10 @@ use crate::consensus::basic::data_contract::InvalidDocumentTypeRequiredSecurityL use crate::consensus::basic::document::MissingPositionsInDocumentTypePropertiesError; #[cfg(feature = "validation")] use crate::consensus::basic::BasicError; +use crate::data_contract::document_type::property_names::{ + CAN_BE_DELETED, CREATION_RESTRICTION_MODE, DOCUMENTS_KEEP_HISTORY, DOCUMENTS_MUTABLE, + TRADE_MODE, TRANSFERABLE, +}; use crate::data_contract::document_type::{property_names, DocumentType}; use crate::data_contract::errors::DataContractError; use crate::data_contract::storage_requirements::keys_for_document_type::StorageKeyRequirements; @@ -106,6 +110,7 @@ impl DocumentTypeV0 { schema_defs: Option<&BTreeMap>, default_keeps_history: bool, default_mutability: bool, + default_can_be_deleted: bool, validate: bool, // we don't need to validate if loaded from state validation_operations: &mut Vec, platform_version: &PlatformVersion, @@ -208,27 +213,48 @@ impl DocumentTypeV0 { )) })?; - // TODO: These properties aren't defined in JSON meta schema // Do documents of this type keep history? (Overrides contract value) let documents_keep_history: bool = - Value::inner_optional_bool_value(schema_map, "documentsKeepHistory") + Value::inner_optional_bool_value(schema_map, DOCUMENTS_KEEP_HISTORY) .map_err(consensus_or_protocol_value_error)? .unwrap_or(default_keeps_history); // Are documents of this type mutable? (Overrides contract value) let documents_mutable: bool = - Value::inner_optional_bool_value(schema_map, "documentsMutable") + Value::inner_optional_bool_value(schema_map, DOCUMENTS_MUTABLE) .map_err(consensus_or_protocol_value_error)? .unwrap_or(default_mutability); - // Are documents of this type transferable? (Overrides contract value) + // Can documents of this type be deleted? (Overrides contract value) + let documents_can_be_deleted: bool = + Value::inner_optional_bool_value(schema_map, CAN_BE_DELETED) + .map_err(consensus_or_protocol_value_error)? + .unwrap_or(default_can_be_deleted); + + // Are documents of this type transferable? let documents_transferable_u8: u8 = - Value::inner_optional_integer_value(schema_map, "transferable") + Value::inner_optional_integer_value(schema_map, TRANSFERABLE) .map_err(consensus_or_protocol_value_error)? .unwrap_or_default(); let documents_transferable = documents_transferable_u8.try_into()?; + // What is the trade mode of these documents + let documents_trade_mode_u8: u8 = + Value::inner_optional_integer_value(schema_map, TRADE_MODE) + .map_err(consensus_or_protocol_value_error)? + .unwrap_or_default(); + + let trade_mode = documents_trade_mode_u8.try_into()?; + + // What is the creation restriction mode of this document type? + let documents_creation_restriction_mode_u8: u8 = + Value::inner_optional_integer_value(schema_map, CREATION_RESTRICTION_MODE) + .map_err(consensus_or_protocol_value_error)? + .unwrap_or_default(); + + let creation_restriction_mode = documents_creation_restriction_mode_u8.try_into()?; + // Extract the properties let property_values = Value::inner_optional_index_map::( schema_map, @@ -511,7 +537,10 @@ impl DocumentTypeV0 { required_fields, documents_keep_history, documents_mutable, + documents_can_be_deleted, documents_transferable, + trade_mode, + creation_restriction_mode, data_contract_id, requires_identity_encryption_bounded_key, requires_identity_decryption_bounded_key, @@ -809,6 +838,7 @@ mod tests { None, false, false, + false, true, &mut vec![], platform_version, @@ -838,6 +868,7 @@ mod tests { None, false, false, + false, true, &mut vec![], platform_version, @@ -876,6 +907,7 @@ mod tests { None, false, false, + false, true, &mut vec![], platform_version, @@ -914,6 +946,7 @@ mod tests { None, false, false, + false, true, &mut vec![], platform_version, @@ -936,6 +969,7 @@ mod tests { None, false, false, + false, true, &mut vec![], platform_version, diff --git a/packages/rs-dpp/src/data_contract/document_type/methods/mod.rs b/packages/rs-dpp/src/data_contract/document_type/methods/mod.rs index 240e1d9668..47df2fd0f4 100644 --- a/packages/rs-dpp/src/data_contract/document_type/methods/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/methods/mod.rs @@ -18,7 +18,6 @@ use crate::prelude::{BlockHeight, CoreBlockHeight, Revision}; use crate::version::PlatformVersion; use crate::ProtocolError; -use crate::document::transfer::Transferable; use platform_value::{Identifier, Value}; // TODO: Some of those methods are only for tests. Hide under feature @@ -216,7 +215,9 @@ impl DocumentTypeV0Methods for DocumentTypeV0 { } fn requires_revision(&self) -> bool { - self.documents_mutable || self.documents_transferable != Transferable::Never + self.documents_mutable + || self.documents_transferable.is_transferable() + || self.trade_mode.seller_sets_price() } fn top_level_indices(&self) -> Vec<&IndexProperty> { diff --git a/packages/rs-dpp/src/data_contract/document_type/mod.rs b/packages/rs-dpp/src/data_contract/document_type/mod.rs index eed70afb85..c37c7fc252 100644 --- a/packages/rs-dpp/src/data_contract/document_type/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/mod.rs @@ -10,6 +10,7 @@ pub use index_level::IndexLevel; #[cfg(feature = "random-documents")] pub mod random_document; +pub mod restricted_creation; pub mod schema; pub mod v0; @@ -26,6 +27,12 @@ use std::collections::BTreeMap; mod property_names { pub const DOCUMENTS_KEEP_HISTORY: &str = "documentsKeepHistory"; pub const DOCUMENTS_MUTABLE: &str = "documentsMutable"; + + pub const CAN_BE_DELETED: &str = "canBeDeleted"; + pub const TRANSFERABLE: &str = "transferable"; + pub const TRADE_MODE: &str = "tradeMode"; + + pub const CREATION_RESTRICTION_MODE: &str = "creationRestrictionMode"; pub const SECURITY_LEVEL_REQUIREMENT: &str = "signatureSecurityLevelRequirement"; pub const REQUIRES_IDENTITY_ENCRYPTION_BOUNDED_KEY: &str = "requiresIdentityEncryptionBoundedKey"; diff --git a/packages/rs-dpp/src/data_contract/document_type/restricted_creation/mod.rs b/packages/rs-dpp/src/data_contract/document_type/restricted_creation/mod.rs new file mode 100644 index 0000000000..81194382f4 --- /dev/null +++ b/packages/rs-dpp/src/data_contract/document_type/restricted_creation/mod.rs @@ -0,0 +1,44 @@ +use crate::consensus::basic::data_contract::UnknownDocumentCreationRestrictionModeError; +use crate::consensus::basic::BasicError; +use crate::consensus::ConsensusError; +use crate::identity::state_transition::asset_lock_proof::{Decode, Encode}; +use crate::ProtocolError; +use std::fmt; +use std::fmt::{Display, Formatter}; + +#[derive(Debug, PartialEq, Clone, Copy, Eq, Encode, Decode)] +pub enum CreationRestrictionMode { + NoRestrictions, + OwnerOnly, + NoCreationAllowed, +} + +impl Display for CreationRestrictionMode { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + match self { + CreationRestrictionMode::NoRestrictions => write!(f, "No Restrictions"), + CreationRestrictionMode::OwnerOnly => write!(f, "Owner Only"), + CreationRestrictionMode::NoCreationAllowed => write!(f, "No Creation Allowed"), + } + } +} + +impl TryFrom for CreationRestrictionMode { + type Error = ProtocolError; + + fn try_from(value: u8) -> Result { + match value { + 0 => Ok(Self::NoRestrictions), + 1 => Ok(Self::OwnerOnly), + 2 => Ok(Self::NoCreationAllowed), + value => Err(ProtocolError::ConsensusError( + ConsensusError::BasicError( + BasicError::UnknownDocumentCreationRestrictionModeError( + UnknownDocumentCreationRestrictionModeError::new(vec![0, 1, 2], value), + ), + ) + .into(), + )), + } + } +} diff --git a/packages/rs-dpp/src/data_contract/document_type/v0/accessors.rs b/packages/rs-dpp/src/data_contract/document_type/v0/accessors.rs index b3b875ba57..ad0cb272b3 100644 --- a/packages/rs-dpp/src/data_contract/document_type/v0/accessors.rs +++ b/packages/rs-dpp/src/data_contract/document_type/v0/accessors.rs @@ -6,9 +6,11 @@ use crate::data_contract::document_type::v0::DocumentTypeV0; use platform_value::{Identifier, Value}; +use crate::data_contract::document_type::restricted_creation::CreationRestrictionMode; use crate::data_contract::storage_requirements::keys_for_document_type::StorageKeyRequirements; use crate::document::transfer::Transferable; use crate::identity::SecurityLevel; +use crate::nft::TradeMode; use indexmap::IndexMap; use std::collections::BTreeSet; @@ -61,10 +63,22 @@ impl DocumentTypeV0Getters for DocumentTypeV0 { self.documents_mutable } + fn documents_can_be_deleted(&self) -> bool { + self.documents_can_be_deleted + } + fn documents_transferable(&self) -> Transferable { self.documents_transferable } + fn trade_mode(&self) -> TradeMode { + self.trade_mode + } + + fn creation_restriction_mode(&self) -> CreationRestrictionMode { + self.creation_restriction_mode + } + fn data_contract_id(&self) -> Identifier { self.data_contract_id } diff --git a/packages/rs-dpp/src/data_contract/document_type/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/v0/mod.rs index 7d8c6f990b..147614713c 100644 --- a/packages/rs-dpp/src/data_contract/document_type/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/v0/mod.rs @@ -9,8 +9,10 @@ use crate::data_contract::storage_requirements::keys_for_document_type::StorageK #[cfg(feature = "validation")] pub(in crate::data_contract) use validator::StatelessJsonSchemaLazyValidator; +use crate::data_contract::document_type::restricted_creation::CreationRestrictionMode; use crate::document::transfer::Transferable; use crate::identity::SecurityLevel; +use crate::nft::TradeMode; use platform_value::{Identifier, Value}; mod accessors; @@ -54,8 +56,15 @@ pub struct DocumentTypeV0 { pub(in crate::data_contract) documents_keep_history: bool, /// Are documents mutable? pub(in crate::data_contract) documents_mutable: bool, - /// Are documents transferable? + /// Can documents of this type be deleted? + pub(in crate::data_contract) documents_can_be_deleted: bool, + /// Can documents be transferred without a trade? pub(in crate::data_contract) documents_transferable: Transferable, + /// How are these documents traded? + pub(in crate::data_contract) trade_mode: TradeMode, + /// Is document creation restricted? + pub(in crate::data_contract) creation_restriction_mode: CreationRestrictionMode, + /// The data contract id pub(in crate::data_contract) data_contract_id: Identifier, /// Encryption key storage requirements pub(in crate::data_contract) requires_identity_encryption_bounded_key: diff --git a/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs b/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs index 5a977161c4..3e46c291ea 100644 --- a/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs +++ b/packages/rs-dpp/src/data_contract/document_type/v0/random_document_type.rs @@ -72,6 +72,7 @@ pub struct RandomDocumentTypeParameters { pub field_bounds: FieldMinMaxBounds, pub keep_history_chance: f64, pub documents_mutable_chance: f64, + pub documents_can_be_deleted_chance: f64, } impl RandomDocumentTypeParameters { @@ -99,6 +100,7 @@ impl RandomDocumentTypeParameters { use crate::data_contract::document_type::array::ArrayItemType; use crate::data_contract::document_type::index_level::IndexLevel; +use crate::data_contract::document_type::restricted_creation::CreationRestrictionMode; #[cfg(feature = "validation")] use crate::data_contract::document_type::v0::StatelessJsonSchemaLazyValidator; use crate::data_contract::document_type::{ @@ -106,6 +108,7 @@ use crate::data_contract::document_type::{ }; use crate::document::transfer::Transferable; use crate::identity::SecurityLevel; +use crate::nft::TradeMode; use crate::version::PlatformVersion; use crate::ProtocolError; use bincode::{Decode, Encode}; @@ -242,6 +245,7 @@ impl DocumentTypeV0 { let documents_keep_history = rng.gen_bool(parameters.keep_history_chance); let documents_mutable = rng.gen_bool(parameters.documents_mutable_chance); + let documents_can_be_deleted = rng.gen_bool(parameters.documents_can_be_deleted_chance); let name = format!("doc_type_{}", rng.gen::()); @@ -423,7 +427,10 @@ impl DocumentTypeV0 { required_fields, documents_keep_history, documents_mutable, + documents_can_be_deleted, documents_transferable: Transferable::Never, + trade_mode: TradeMode::None, + creation_restriction_mode: CreationRestrictionMode::NoRestrictions, data_contract_id, requires_identity_encryption_bounded_key: None, requires_identity_decryption_bounded_key: None, @@ -556,6 +563,7 @@ impl DocumentTypeV0 { let documents_keep_history = rng.gen_bool(parameters.keep_history_chance); let documents_mutable = rng.gen_bool(parameters.documents_mutable_chance); + let documents_can_be_deleted = rng.gen_bool(parameters.documents_can_be_deleted_chance); let name = format!("doc_type_{}", rng.gen::()); @@ -587,7 +595,10 @@ impl DocumentTypeV0 { required_fields, documents_keep_history, documents_mutable, + documents_can_be_deleted, documents_transferable: Transferable::Never, + trade_mode: TradeMode::None, + creation_restriction_mode: CreationRestrictionMode::NoRestrictions, data_contract_id, requires_identity_encryption_bounded_key: None, requires_identity_decryption_bounded_key: None, diff --git a/packages/rs-dpp/src/data_contract/extra/drive_api_tests.rs b/packages/rs-dpp/src/data_contract/extra/drive_api_tests.rs index cdf5f9b226..e1cd6308ce 100644 --- a/packages/rs-dpp/src/data_contract/extra/drive_api_tests.rs +++ b/packages/rs-dpp/src/data_contract/extra/drive_api_tests.rs @@ -217,6 +217,9 @@ mod test { contract .config .set_documents_mutable_contract_default(false); + contract + .config + .set_documents_can_be_deleted_contract_default(false); contract .config .set_documents_keep_history_contract_default(true); @@ -235,6 +238,7 @@ mod test { keeps_history: true, documents_mutable_contract_default: false, documents_keep_history_contract_default: true, + documents_can_be_deleted_contract_default: false, requires_identity_encryption_bounded_key: None, requires_identity_decryption_bounded_key: None, }) @@ -264,6 +268,9 @@ mod test { contract_v0 .config .set_documents_mutable_contract_default(false); + contract_v0 + .config + .set_documents_can_be_deleted_contract_default(false); contract_v0 .config .set_documents_keep_history_contract_default(true); @@ -285,6 +292,7 @@ mod test { documents_keep_history_contract_default: true, requires_identity_encryption_bounded_key: None, requires_identity_decryption_bounded_key: None, + documents_can_be_deleted_contract_default: false, }) ); } diff --git a/packages/rs-dpp/src/data_contract/v0/methods/schema.rs b/packages/rs-dpp/src/data_contract/v0/methods/schema.rs index 03bf8f8f5b..23bbbb106e 100644 --- a/packages/rs-dpp/src/data_contract/v0/methods/schema.rs +++ b/packages/rs-dpp/src/data_contract/v0/methods/schema.rs @@ -25,6 +25,7 @@ impl DataContractSchemaMethodsV0 for DataContractV0 { defs.as_ref(), self.config.documents_keep_history_contract_default(), self.config.documents_mutable_contract_default(), + self.config.documents_can_be_deleted_contract_default(), validate, validation_operations, platform_version, @@ -48,6 +49,7 @@ impl DataContractSchemaMethodsV0 for DataContractV0 { self.schema_defs.as_ref(), self.config.documents_keep_history_contract_default(), self.config.documents_mutable_contract_default(), + self.config.documents_mutable_contract_default(), validate, validation_operations, platform_version, diff --git a/packages/rs-dpp/src/data_contract/v0/serialization/mod.rs b/packages/rs-dpp/src/data_contract/v0/serialization/mod.rs index b1992eba7b..87aa2680b7 100644 --- a/packages/rs-dpp/src/data_contract/v0/serialization/mod.rs +++ b/packages/rs-dpp/src/data_contract/v0/serialization/mod.rs @@ -97,6 +97,7 @@ impl DataContractV0 { schema_defs.as_ref(), config.documents_keep_history_contract_default(), config.documents_mutable_contract_default(), + config.documents_can_be_deleted_contract_default(), validate, validation_operations, platform_version, diff --git a/packages/rs-dpp/src/document/accessors/mod.rs b/packages/rs-dpp/src/document/accessors/mod.rs index ce005efd62..2ba6d88310 100644 --- a/packages/rs-dpp/src/document/accessors/mod.rs +++ b/packages/rs-dpp/src/document/accessors/mod.rs @@ -137,6 +137,12 @@ impl DocumentV0Setters for Document { } } + fn bump_revision(&mut self) { + match self { + Document::V0(v0) => v0.bump_revision(), + } + } + fn set_created_at(&mut self, created_at: Option) { match self { Document::V0(v0) => v0.created_at = created_at, diff --git a/packages/rs-dpp/src/document/accessors/v0/mod.rs b/packages/rs-dpp/src/document/accessors/v0/mod.rs index 7717ee02f5..e8274af221 100644 --- a/packages/rs-dpp/src/document/accessors/v0/mod.rs +++ b/packages/rs-dpp/src/document/accessors/v0/mod.rs @@ -142,4 +142,5 @@ pub trait DocumentV0Setters: DocumentV0Getters { ); fn set_transferred_at_block_height(&mut self, transferred_at_block_height: Option); fn set_transferred_at(&mut self, transferred_at: Option); + fn bump_revision(&mut self); } diff --git a/packages/rs-dpp/src/document/extended_document/mod.rs b/packages/rs-dpp/src/document/extended_document/mod.rs index ae9e23e606..c97b4b588b 100644 --- a/packages/rs-dpp/src/document/extended_document/mod.rs +++ b/packages/rs-dpp/src/document/extended_document/mod.rs @@ -75,7 +75,7 @@ impl ExtendedDocument { /// Returns a `ProtocolError` if the document type is not found in the data contract. pub fn needs_revision(&self) -> Result { match self { - ExtendedDocument::V0(v0) => v0.needs_revision(), + ExtendedDocument::V0(v0) => v0.requires_revision(), } } diff --git a/packages/rs-dpp/src/document/extended_document/v0/mod.rs b/packages/rs-dpp/src/document/extended_document/v0/mod.rs index 918d190e14..a5cf0ec476 100644 --- a/packages/rs-dpp/src/document/extended_document/v0/mod.rs +++ b/packages/rs-dpp/src/document/extended_document/v0/mod.rs @@ -32,6 +32,7 @@ use std::collections::BTreeMap; use crate::data_contract::accessors::v0::DataContractV0Getters; use crate::data_contract::document_type::accessors::DocumentTypeV0Getters; +use crate::data_contract::document_type::methods::DocumentTypeV0Methods; #[cfg(feature = "validation")] use crate::data_contract::validation::DataContractValidationMethodsV0; #[cfg(feature = "document-json-conversion")] @@ -161,9 +162,9 @@ impl ExtendedDocumentV0 { .map(|document_type| document_type.documents_mutable()) } - pub fn needs_revision(&self) -> Result { + pub fn requires_revision(&self) -> Result { self.document_type() - .map(|document_type| document_type.documents_mutable()) + .map(|document_type| document_type.requires_revision()) } pub fn revision(&self) -> Option { diff --git a/packages/rs-dpp/src/document/fields.rs b/packages/rs-dpp/src/document/fields.rs index f4d7afee69..452b7f7c3e 100644 --- a/packages/rs-dpp/src/document/fields.rs +++ b/packages/rs-dpp/src/document/fields.rs @@ -5,6 +5,7 @@ pub mod property_names { pub const DATA_CONTRACT_ID: &str = "$dataContractId"; pub const REVISION: &str = "$revision"; pub const OWNER_ID: &str = "$ownerId"; + pub const PRICE: &str = "$price"; pub const CREATED_AT: &str = "$createdAt"; pub const UPDATED_AT: &str = "$updatedAt"; pub const TRANSFERRED_AT: &str = "$transferredAt"; diff --git a/packages/rs-dpp/src/document/v0/accessors.rs b/packages/rs-dpp/src/document/v0/accessors.rs index 4a14bea18a..63d056b2d1 100644 --- a/packages/rs-dpp/src/document/v0/accessors.rs +++ b/packages/rs-dpp/src/document/v0/accessors.rs @@ -188,6 +188,15 @@ impl DocumentV0Setters for DocumentV0 { self.revision = revision; } + /// Bumps the document's revision if it has one. This is applicable if the document's schema indicates + /// the document type as mutable. + /// + fn bump_revision(&mut self) { + if let Some(revision) = self.revision { + self.revision = Some(revision.saturating_add(1)) + } + } + /// Sets the timestamp of when the document was created. This is applicable if the document's /// schema requires a creation timestamp. /// diff --git a/packages/rs-dpp/src/document/v0/serialize.rs b/packages/rs-dpp/src/document/v0/serialize.rs index 259258fa4d..a26879d9ff 100644 --- a/packages/rs-dpp/src/document/v0/serialize.rs +++ b/packages/rs-dpp/src/document/v0/serialize.rs @@ -2,7 +2,7 @@ use crate::data_contract::document_type::DocumentTypeRef; use crate::data_contract::errors::DataContractError; use crate::document::property_names::{ - CREATED_AT, CREATED_AT_BLOCK_HEIGHT, CREATED_AT_CORE_BLOCK_HEIGHT, TRANSFERRED_AT, + CREATED_AT, CREATED_AT_BLOCK_HEIGHT, CREATED_AT_CORE_BLOCK_HEIGHT, PRICE, TRANSFERRED_AT, TRANSFERRED_AT_BLOCK_HEIGHT, TRANSFERRED_AT_CORE_BLOCK_HEIGHT, UPDATED_AT, UPDATED_AT_BLOCK_HEIGHT, UPDATED_AT_CORE_BLOCK_HEIGHT, }; @@ -193,6 +193,18 @@ impl DocumentPlatformSerializationMethodsV0 for DocumentV0 { buffer.extend(bitwise_exists_flag.to_be_bytes().as_slice()); buffer.append(&mut time_fields_data_buffer); + // Now we serialize the price which might not be necessary unless called for by the document type + + if document_type.trade_mode().seller_sets_price() { + if let Some(price) = self.properties.get(PRICE) { + buffer.push(1); + let price_as_u64: u64 = price.to_integer().map_err(ProtocolError::ValueError)?; + buffer.append(&mut price_as_u64.to_be_bytes().to_vec()); + } else { + buffer.push(0); + } + } + // User defined properties document_type .properties() @@ -397,6 +409,18 @@ impl DocumentPlatformSerializationMethodsV0 for DocumentV0 { buffer.extend(bitwise_exists_flag.to_be_bytes().as_slice()); buffer.append(&mut time_fields_data_buffer); + // Now we serialize the price which might not be necessary unless called for by the document type + + if document_type.trade_mode().seller_sets_price() { + if let Some(price) = self.properties.get(PRICE) { + buffer.push(1); + let price_as_u64: u64 = price.to_integer().map_err(ProtocolError::ValueError)?; + buffer.append(&mut price_as_u64.to_be_bytes().to_vec()); + } else { + buffer.push(0); + } + } + // User defined properties document_type .properties() @@ -591,9 +615,31 @@ impl DocumentPlatformDeserializationMethodsV0 for DocumentV0 { None }; + // Now we deserialize the price which might not be necessary unless called for by the document type + + let price = if document_type.trade_mode().seller_sets_price() { + let has_price = buf.read_u8().map_err(|_| { + DataContractError::CorruptedSerialization( + "error reading has price bool from serialized document".to_string(), + ) + })?; + if has_price > 0 { + let price = buf.read_u64::().map_err(|_| { + DataContractError::CorruptedSerialization( + "error reading price u64 from serialized document".to_string(), + ) + })?; + Some(price) + } else { + None + } + } else { + None + }; + let mut finished_buffer = false; - let properties = document_type + let mut properties = document_type .properties() .iter() .filter_map(|(key, property)| { @@ -620,6 +666,10 @@ impl DocumentPlatformDeserializationMethodsV0 for DocumentV0 { }) .collect::, DataContractError>>()?; + if let Some(price) = price { + properties.insert(PRICE.to_string(), price.into()); + } + Ok(DocumentV0 { id: Identifier::new(id), properties, diff --git a/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs b/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs index 65ad96ade7..f78903696a 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs @@ -14,20 +14,22 @@ use crate::consensus::basic::data_contract::{ InvalidDataContractIdError, InvalidDataContractVersionError, InvalidDocumentTypeNameError, InvalidDocumentTypeRequiredSecurityLevelError, InvalidIndexPropertyTypeError, InvalidIndexedPropertyConstraintError, SystemPropertyIndexAlreadyPresentError, - UndefinedIndexPropertyError, UniqueIndicesLimitReachedError, UnknownSecurityLevelError, - UnknownStorageKeyRequirementsError, UnknownTransferableTypeError, + UndefinedIndexPropertyError, UniqueIndicesLimitReachedError, + UnknownDocumentCreationRestrictionModeError, UnknownSecurityLevelError, + UnknownStorageKeyRequirementsError, UnknownTradeModeError, UnknownTransferableTypeError, }; use crate::consensus::basic::decode::{ ProtocolVersionParsingError, SerializedObjectParsingError, VersionError, }; use crate::consensus::basic::document::{ - DataContractNotPresentError, DocumentTransitionsAreAbsentError, - DuplicateDocumentTransitionsWithIdsError, DuplicateDocumentTransitionsWithIndicesError, - InconsistentCompoundIndexDataError, InvalidDocumentTransitionActionError, - InvalidDocumentTransitionIdError, InvalidDocumentTypeError, - MaxDocumentsTransitionsExceededError, MissingDataContractIdBasicError, - MissingDocumentTransitionActionError, MissingDocumentTransitionTypeError, - MissingDocumentTypeError, MissingPositionsInDocumentTypePropertiesError, NonceOutOfBoundsError, + DataContractNotPresentError, DocumentCreationNotAllowedError, + DocumentTransitionsAreAbsentError, DuplicateDocumentTransitionsWithIdsError, + DuplicateDocumentTransitionsWithIndicesError, InconsistentCompoundIndexDataError, + InvalidDocumentTransitionActionError, InvalidDocumentTransitionIdError, + InvalidDocumentTypeError, MaxDocumentsTransitionsExceededError, + MissingDataContractIdBasicError, MissingDocumentTransitionActionError, + MissingDocumentTransitionTypeError, MissingDocumentTypeError, + MissingPositionsInDocumentTypePropertiesError, NonceOutOfBoundsError, }; use crate::consensus::basic::identity::{ DataContractBoundsNotPresentError, DisablingKeyIdAlsoBeingAddedInSameTransitionError, @@ -93,6 +95,12 @@ pub enum BasicError { #[error(transparent)] UnknownTransferableTypeError(UnknownTransferableTypeError), + #[error(transparent)] + UnknownTradeModeError(UnknownTradeModeError), + + #[error(transparent)] + UnknownDocumentCreationRestrictionModeError(UnknownDocumentCreationRestrictionModeError), + #[error(transparent)] SerializedObjectParsingError(SerializedObjectParsingError), @@ -183,6 +191,9 @@ pub enum BasicError { #[error(transparent)] DataContractNotPresentError(DataContractNotPresentError), + #[error(transparent)] + DocumentCreationNotAllowedError(DocumentCreationNotAllowedError), + #[error(transparent)] DataContractBoundsNotPresentError(DataContractBoundsNotPresentError), diff --git a/packages/rs-dpp/src/errors/consensus/basic/data_contract/incompatible_data_contract_schema_error.rs b/packages/rs-dpp/src/errors/consensus/basic/data_contract/incompatible_data_contract_schema_error.rs index 444662dfd8..9a75c00949 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/data_contract/incompatible_data_contract_schema_error.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/data_contract/incompatible_data_contract_schema_error.rs @@ -11,7 +11,7 @@ use bincode::{Decode, Encode}; #[derive( Error, Debug, Clone, PartialEq, Encode, Decode, PlatformSerialize, PlatformDeserialize, )] -#[error("Data Contract updated schema is not backward compatible with one defined in Data Contract wid id {data_contract_id}. Field: '{field_path}', Operation: '{operation}'" +#[error("Data Contract updated schema is not backward compatible with one defined in Data Contract with id {data_contract_id}. Field: '{field_path}', Operation: '{operation}'" )] #[platform_serialize(unversioned)] pub struct IncompatibleDataContractSchemaError { diff --git a/packages/rs-dpp/src/errors/consensus/basic/data_contract/mod.rs b/packages/rs-dpp/src/errors/consensus/basic/data_contract/mod.rs index 30fa795b1f..4e79e023ac 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/data_contract/mod.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/data_contract/mod.rs @@ -20,8 +20,10 @@ mod invalid_json_schema_ref_error; mod system_property_index_already_present_error; mod undefined_index_property_error; mod unique_indices_limit_reached_error; +mod unknown_document_creation_restriction_mode_error; mod unknown_security_level_error; mod unknown_storage_key_requirements_error; +mod unknown_trade_mode_error; mod unknown_transferable_type_error; pub use data_contract_empty_schema_error::*; @@ -47,6 +49,8 @@ pub use undefined_index_property_error::*; pub use unique_indices_limit_reached_error::*; pub use invalid_document_type_name_error::*; +pub use unknown_document_creation_restriction_mode_error::*; pub use unknown_security_level_error::*; pub use unknown_storage_key_requirements_error::*; +pub use unknown_trade_mode_error::*; pub use unknown_transferable_type_error::*; diff --git a/packages/rs-dpp/src/errors/consensus/basic/data_contract/unknown_document_creation_restriction_mode_error.rs b/packages/rs-dpp/src/errors/consensus/basic/data_contract/unknown_document_creation_restriction_mode_error.rs new file mode 100644 index 0000000000..2d55df7e39 --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/basic/data_contract/unknown_document_creation_restriction_mode_error.rs @@ -0,0 +1,47 @@ +use crate::consensus::basic::BasicError; +use crate::consensus::ConsensusError; +use crate::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error( + "Unrecognized document creation restriction mode: allowed {:?}, got {}", + allowed_values, + received +)] +#[platform_serialize(unversioned)] +pub struct UnknownDocumentCreationRestrictionModeError { + /* + + DO NOT CHANGE ORDER OF FIELDS WITHOUT INTRODUCING OF NEW VERSION + + */ + allowed_values: Vec, + received: u8, +} + +impl UnknownDocumentCreationRestrictionModeError { + pub fn new(allowed_values: Vec, received: u8) -> Self { + Self { + allowed_values, + received, + } + } + + pub fn allowed_values(&self) -> Vec { + self.allowed_values.clone() + } + pub fn received(&self) -> u8 { + self.received + } +} + +impl From for ConsensusError { + fn from(err: UnknownDocumentCreationRestrictionModeError) -> Self { + Self::BasicError(BasicError::UnknownDocumentCreationRestrictionModeError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/basic/data_contract/unknown_trade_mode_error.rs b/packages/rs-dpp/src/errors/consensus/basic/data_contract/unknown_trade_mode_error.rs new file mode 100644 index 0000000000..bbf57f3335 --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/basic/data_contract/unknown_trade_mode_error.rs @@ -0,0 +1,47 @@ +use crate::consensus::basic::BasicError; +use crate::consensus::ConsensusError; +use crate::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error( + "Unrecognized trade mode: allowed {:?}, got {}", + allowed_values, + received +)] +#[platform_serialize(unversioned)] +pub struct UnknownTradeModeError { + /* + + DO NOT CHANGE ORDER OF FIELDS WITHOUT INTRODUCING OF NEW VERSION + + */ + allowed_values: Vec, + received: u8, +} + +impl UnknownTradeModeError { + pub fn new(allowed_values: Vec, received: u8) -> Self { + Self { + allowed_values, + received, + } + } + + pub fn allowed_values(&self) -> Vec { + self.allowed_values.clone() + } + pub fn received(&self) -> u8 { + self.received + } +} + +impl From for ConsensusError { + fn from(err: UnknownTradeModeError) -> Self { + Self::BasicError(BasicError::UnknownTradeModeError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/basic/document/document_creation_not_allowed_error.rs b/packages/rs-dpp/src/errors/consensus/basic/document/document_creation_not_allowed_error.rs new file mode 100644 index 0000000000..5ad1732ddd --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/basic/document/document_creation_not_allowed_error.rs @@ -0,0 +1,58 @@ +use crate::consensus::basic::BasicError; +use crate::consensus::ConsensusError; +use crate::data_contract::document_type::restricted_creation::CreationRestrictionMode; +use crate::errors::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use platform_value::Identifier; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error("Document Creation on {data_contract_id}:{document_type_name} is not allowed because of the document type's creation restriction mode {creation_restriction_mode}")] +#[platform_serialize(unversioned)] +pub struct DocumentCreationNotAllowedError { + /* + + DO NOT CHANGE ORDER OF FIELDS WITHOUT INTRODUCING OF NEW VERSION + + */ + data_contract_id: Identifier, + + document_type_name: String, + + creation_restriction_mode: CreationRestrictionMode, +} + +impl DocumentCreationNotAllowedError { + pub fn new( + data_contract_id: Identifier, + document_type_name: String, + creation_restriction_mode: CreationRestrictionMode, + ) -> Self { + Self { + data_contract_id, + document_type_name, + creation_restriction_mode, + } + } + + pub fn data_contract_id(&self) -> Identifier { + self.data_contract_id + } + + pub fn document_type_name(&self) -> &str { + self.document_type_name.as_str() + } + + pub fn creation_restriction_mode(&self) -> CreationRestrictionMode { + self.creation_restriction_mode + } +} + +impl From for ConsensusError { + fn from(err: DocumentCreationNotAllowedError) -> Self { + Self::BasicError(BasicError::DocumentCreationNotAllowedError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/basic/document/mod.rs b/packages/rs-dpp/src/errors/consensus/basic/document/mod.rs index 7cc323f4fa..9c011e12b5 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/document/mod.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/document/mod.rs @@ -1,4 +1,5 @@ mod data_contract_not_present_error; +mod document_creation_not_allowed_error; mod document_transitions_are_absent_error; mod duplicate_document_transitions_with_ids_error; mod duplicate_document_transitions_with_indices_error; @@ -15,6 +16,7 @@ mod missing_document_type_error; mod missing_positions_in_document_type_properties_error; pub use data_contract_not_present_error::*; +pub use document_creation_not_allowed_error::*; pub use document_transitions_are_absent_error::*; pub use duplicate_document_transitions_with_ids_error::*; pub use duplicate_document_transitions_with_indices_error::*; diff --git a/packages/rs-dpp/src/errors/consensus/codes.rs b/packages/rs-dpp/src/errors/consensus/codes.rs index 07f19201fa..93544fc1d3 100644 --- a/packages/rs-dpp/src/errors/consensus/codes.rs +++ b/packages/rs-dpp/src/errors/consensus/codes.rs @@ -91,6 +91,8 @@ impl ErrorWithCode for BasicError { Self::ContractError(DataContractError::KeyWrongBounds(_)) => 10241, Self::ContractError(DataContractError::KeyValueMustExist(_)) => 10242, Self::UnknownTransferableTypeError { .. } => 10243, + Self::UnknownTradeModeError { .. } => 10244, + Self::UnknownDocumentCreationRestrictionModeError { .. } => 10245, // Document Errors: 10400-10499 Self::DataContractNotPresentError { .. } => 10400, @@ -109,6 +111,7 @@ impl ErrorWithCode for BasicError { Self::DocumentTransitionsAreAbsentError { .. } => 10413, Self::NonceOutOfBoundsError(_) => 10414, Self::InvalidDocumentTypeNameError(_) => 10415, + Self::DocumentCreationNotAllowedError(_) => 10416, // Identity Errors: 10500-10599 Self::DuplicatedIdentityPublicKeyBasicError(_) => 10500, @@ -196,6 +199,8 @@ impl ErrorWithCode for StateError { Self::DuplicateUniqueIndexError { .. } => 40105, Self::InvalidDocumentRevisionError { .. } => 40106, Self::DocumentTimestampsAreEqualError(_) => 40107, + Self::DocumentNotForSaleError(_) => 40108, + Self::DocumentIncorrectPurchasePriceError(_) => 40109, // Identity Errors: 40200-40299 Self::IdentityAlreadyExistsError(_) => 40200, diff --git a/packages/rs-dpp/src/errors/consensus/state/document/document_incorrect_purchase_price_error.rs b/packages/rs-dpp/src/errors/consensus/state/document/document_incorrect_purchase_price_error.rs new file mode 100644 index 0000000000..5e726c5cbe --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/state/document/document_incorrect_purchase_price_error.rs @@ -0,0 +1,58 @@ +use crate::consensus::state::state_error::StateError; +use crate::consensus::ConsensusError; +use crate::errors::ProtocolError; +use crate::fee::Credits; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use platform_value::Identifier; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error("{document_id} document can not be purchased for {trying_to_purchase_at_price}, it's sale price is {actual_price} (in credits)")] +#[platform_serialize(unversioned)] +pub struct DocumentIncorrectPurchasePriceError { + /* + + DO NOT CHANGE ORDER OF FIELDS WITHOUT INTRODUCING OF NEW VERSION + + */ + document_id: Identifier, + + trying_to_purchase_at_price: Credits, + + actual_price: Credits, +} + +impl DocumentIncorrectPurchasePriceError { + pub fn new( + document_id: Identifier, + trying_to_purchase_at_price: Credits, + actual_price: Credits, + ) -> Self { + Self { + document_id, + trying_to_purchase_at_price, + actual_price, + } + } + + pub fn document_id(&self) -> &Identifier { + &self.document_id + } + + pub fn trying_to_purchase_at_price(&self) -> Credits { + self.trying_to_purchase_at_price + } + + pub fn actual_price(&self) -> Credits { + self.actual_price + } +} + +impl From for ConsensusError { + fn from(err: DocumentIncorrectPurchasePriceError) -> Self { + Self::StateError(StateError::DocumentIncorrectPurchasePriceError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/state/document/document_not_for_sale_error.rs b/packages/rs-dpp/src/errors/consensus/state/document/document_not_for_sale_error.rs new file mode 100644 index 0000000000..1304477355 --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/state/document/document_not_for_sale_error.rs @@ -0,0 +1,37 @@ +use crate::consensus::state::state_error::StateError; +use crate::consensus::ConsensusError; +use crate::errors::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use platform_value::Identifier; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error("{document_id} document not for sale")] +#[platform_serialize(unversioned)] +pub struct DocumentNotForSaleError { + /* + + DO NOT CHANGE ORDER OF FIELDS WITHOUT INTRODUCING OF NEW VERSION + + */ + document_id: Identifier, +} + +impl DocumentNotForSaleError { + pub fn new(document_id: Identifier) -> Self { + Self { document_id } + } + + pub fn document_id(&self) -> &Identifier { + &self.document_id + } +} + +impl From for ConsensusError { + fn from(err: DocumentNotForSaleError) -> Self { + Self::StateError(StateError::DocumentNotForSaleError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/state/document/mod.rs b/packages/rs-dpp/src/errors/consensus/state/document/mod.rs index 2469345323..36621070ab 100644 --- a/packages/rs-dpp/src/errors/consensus/state/document/mod.rs +++ b/packages/rs-dpp/src/errors/consensus/state/document/mod.rs @@ -1,4 +1,6 @@ pub mod document_already_present_error; +pub mod document_incorrect_purchase_price_error; +pub mod document_not_for_sale_error; pub mod document_not_found_error; pub mod document_owner_id_mismatch_error; pub mod document_timestamp_window_violation_error; diff --git a/packages/rs-dpp/src/errors/consensus/state/state_error.rs b/packages/rs-dpp/src/errors/consensus/state/state_error.rs index a8379044b9..a71511e45b 100644 --- a/packages/rs-dpp/src/errors/consensus/state/state_error.rs +++ b/packages/rs-dpp/src/errors/consensus/state/state_error.rs @@ -28,6 +28,8 @@ use crate::consensus::state::identity::{ }; use crate::consensus::ConsensusError; use crate::consensus::state::data_contract::document_type_update_error::DocumentTypeUpdateError; +use crate::consensus::state::document::document_incorrect_purchase_price_error::DocumentIncorrectPurchasePriceError; +use crate::consensus::state::document::document_not_for_sale_error::DocumentNotForSaleError; use crate::consensus::state::identity::identity_public_key_already_exists_for_unique_contract_bounds_error::IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError; use crate::consensus::state::identity::invalid_identity_contract_nonce_error::InvalidIdentityNonceError; @@ -55,6 +57,12 @@ pub enum StateError { #[error(transparent)] DocumentNotFoundError(DocumentNotFoundError), + #[error(transparent)] + DocumentNotForSaleError(DocumentNotForSaleError), + + #[error(transparent)] + DocumentIncorrectPurchasePriceError(DocumentIncorrectPurchasePriceError), + #[error(transparent)] DocumentOwnerIdMismatchError(DocumentOwnerIdMismatchError), diff --git a/packages/rs-dpp/src/fee/fee_result/mod.rs b/packages/rs-dpp/src/fee/fee_result/mod.rs index c58e7b97c2..749cc83426 100644 --- a/packages/rs-dpp/src/fee/fee_result/mod.rs +++ b/packages/rs-dpp/src/fee/fee_result/mod.rs @@ -90,7 +90,7 @@ impl TryFrom>> for FeeResult { } /// The balance change for an identity -#[derive(Clone, Debug)] +#[derive(Clone, Debug, PartialEq, Eq)] pub enum BalanceChange { /// Add Balance AddToBalance(Credits), diff --git a/packages/rs-dpp/src/lib.rs b/packages/rs-dpp/src/lib.rs index cef2d9f3e7..c9eb000abb 100644 --- a/packages/rs-dpp/src/lib.rs +++ b/packages/rs-dpp/src/lib.rs @@ -39,6 +39,7 @@ pub mod asset_lock; pub mod balances; pub mod block; pub mod fee; +pub mod nft; pub mod serialization; #[cfg(any( feature = "message-signing", diff --git a/packages/rs-dpp/src/nft/mod.rs b/packages/rs-dpp/src/nft/mod.rs new file mode 100644 index 0000000000..884906fb1e --- /dev/null +++ b/packages/rs-dpp/src/nft/mod.rs @@ -0,0 +1,55 @@ +use crate::consensus::basic::data_contract::UnknownTradeModeError; +use crate::consensus::basic::BasicError; +use crate::consensus::ConsensusError; +use crate::ProtocolError; +use std::fmt; +use std::fmt::{Display, Formatter}; + +#[derive(Debug, PartialEq, Clone, Copy)] +pub enum TradeMode { + None = 0, + DirectPurchase = 1, + // PublicOffer = 2, + // PrivateOffer = 3, +} + +impl TradeMode { + pub fn seller_sets_price(&self) -> bool { + match self { + TradeMode::None => false, + TradeMode::DirectPurchase => true, + // TradeMode::PublicOffer => true, //min price + // TradeMode::PrivateOffer => true, //min price + } + } +} + +impl Display for TradeMode { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + match self { + TradeMode::None => write!(f, "No Trading"), + TradeMode::DirectPurchase => write!(f, "Direct Purchase"), + // TradeMode::PublicOffer => write!(f, "Public Offer"), + // TradeMode::PrivateOffer => write!(f, "Private Offer"), + } + } +} + +impl TryFrom for TradeMode { + type Error = ProtocolError; + + fn try_from(value: u8) -> Result { + match value { + 0 => Ok(Self::None), + 1 => Ok(Self::DirectPurchase), + // 2 => Ok(Self::PublicOffer), + // 3 => Ok(Self::PrivateOffer), + value => Err(ProtocolError::ConsensusError( + ConsensusError::BasicError(BasicError::UnknownTradeModeError( + UnknownTradeModeError::new(vec![0, 1], value), + )) + .into(), + )), + } + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/action_type.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/action_type.rs index 9052109dca..fd7c376f7b 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/action_type.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/action_type.rs @@ -8,6 +8,8 @@ pub enum DocumentTransitionActionType { Replace, Delete, Transfer, + Purchase, + UpdatePrice, IgnoreWhileBumpingRevision, } @@ -22,6 +24,8 @@ impl TransitionActionTypeGetter for DocumentTransition { DocumentTransition::Delete(_) => DocumentTransitionActionType::Delete, DocumentTransition::Replace(_) => DocumentTransitionActionType::Replace, DocumentTransition::Transfer(_) => DocumentTransitionActionType::Transfer, + DocumentTransition::UpdatePrice(_) => DocumentTransitionActionType::UpdatePrice, + DocumentTransition::Purchase(_) => DocumentTransitionActionType::Purchase, } } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/from_document.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/from_document.rs new file mode 100644 index 0000000000..d4b913405f --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/from_document.rs @@ -0,0 +1,45 @@ +use crate::data_contract::document_type::DocumentTypeRef; +use crate::document::Document; +use crate::fee::Credits; +use crate::prelude::IdentityNonce; +use crate::ProtocolError; +use platform_version::version::{FeatureVersion, PlatformVersion}; + +use crate::state_transition::documents_batch_transition::document_transition::{DocumentPurchaseTransition}; +use crate::state_transition::documents_batch_transition::document_transition::document_purchase_transition::DocumentPurchaseTransitionV0; + +impl DocumentPurchaseTransition { + pub fn from_document( + document: Document, + document_type: DocumentTypeRef, + price: Credits, + identity_contract_nonce: IdentityNonce, + platform_version: &PlatformVersion, + feature_version: Option, + base_feature_version: Option, + ) -> Result { + match feature_version.unwrap_or( + platform_version + .dpp + .state_transition_serialization_versions + .document_purchase_state_transition + .bounds + .default_current_version, + ) { + 0 => Ok(DocumentPurchaseTransitionV0::from_document( + document, + document_type, + price, + identity_contract_nonce, + platform_version, + base_feature_version, + )? + .into()), + version => Err(ProtocolError::UnknownVersionMismatch { + method: "DocumentPurchaseTransition::from_document".to_string(), + known_versions: vec![0], + received: version, + }), + } + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/mod.rs new file mode 100644 index 0000000000..9a5664cfaa --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/mod.rs @@ -0,0 +1,19 @@ +mod from_document; +pub mod v0; +pub mod v0_methods; + +use bincode::{Decode, Encode}; +use derive_more::{Display, From}; +#[cfg(feature = "state-transition-serde-conversion")] +use serde::{Deserialize, Serialize}; +pub use v0::*; + +#[derive(Debug, Clone, Encode, Decode, PartialEq, Display, From)] +#[cfg_attr( + feature = "state-transition-serde-conversion", + derive(Serialize, Deserialize) +)] +pub enum DocumentPurchaseTransition { + #[display(fmt = "V0({})", "_0")] + V0(DocumentPurchaseTransitionV0), +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0/from_document.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0/from_document.rs new file mode 100644 index 0000000000..80bfc2115c --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0/from_document.rs @@ -0,0 +1,40 @@ +use platform_version::version::{FeatureVersion, PlatformVersion}; +use crate::data_contract::document_type::{DocumentTypeRef}; +use crate::document::{Document, DocumentV0Getters}; +use crate::document::errors::DocumentError; +use crate::fee::Credits; +use crate::prelude::IdentityNonce; +use crate::ProtocolError; +use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; +use crate::state_transition::documents_batch_transition::document_transition::document_purchase_transition::DocumentPurchaseTransitionV0; + +impl DocumentPurchaseTransitionV0 { + pub(crate) fn from_document( + document: Document, + document_type: DocumentTypeRef, + price: Credits, + identity_contract_nonce: IdentityNonce, + platform_version: &PlatformVersion, + base_feature_version: Option, + ) -> Result { + let Some(revision) = document.revision() else { + return Err(ProtocolError::Document(Box::new( + DocumentError::DocumentNoRevisionError { + document: Box::new(document.clone()), + }, + ))); + }; + + Ok(DocumentPurchaseTransitionV0 { + base: DocumentBaseTransition::from_document( + &document, + document_type, + identity_contract_nonce, + platform_version, + base_feature_version, + )?, + revision, + price, + }) + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0/mod.rs new file mode 100644 index 0000000000..255310c394 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0/mod.rs @@ -0,0 +1,33 @@ +mod from_document; +pub mod v0_methods; + +use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; + +use bincode::{Decode, Encode}; +use derive_more::Display; + +use crate::fee::Credits; +use crate::prelude::Revision; +#[cfg(feature = "state-transition-serde-conversion")] +use serde::{Deserialize, Serialize}; + +pub use super::super::document_base_transition::IDENTIFIER_FIELDS; + +#[derive(Debug, Clone, Default, Encode, Decode, PartialEq, Display)] +#[cfg_attr( + feature = "state-transition-serde-conversion", + derive(Serialize, Deserialize), + serde(rename_all = "camelCase") +)] +#[display(fmt = "Base: {}", "base")] +pub struct DocumentPurchaseTransitionV0 { + #[cfg_attr(feature = "state-transition-serde-conversion", serde(flatten))] + pub base: DocumentBaseTransition, + #[cfg_attr( + feature = "state-transition-serde-conversion", + serde(rename = "$revision") + )] + pub revision: Revision, + #[cfg_attr(feature = "state-transition-serde-conversion", serde(rename = "price"))] + pub price: Credits, +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0/v0_methods.rs new file mode 100644 index 0000000000..95333296e4 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0/v0_methods.rs @@ -0,0 +1,50 @@ +use crate::fee::Credits; +use crate::prelude::Revision; +use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; +use crate::state_transition::documents_batch_transition::document_transition::document_purchase_transition::DocumentPurchaseTransitionV0; + +pub trait DocumentPurchaseTransitionV0Methods { + /// Returns a reference to the `base` field of the `DocumentCreateTransitionV0`. + fn base(&self) -> &DocumentBaseTransition; + fn base_mut(&mut self) -> &mut DocumentBaseTransition; + + /// Sets the value of the `base` field in the `DocumentCreateTransitionV0`. + /// + /// # Arguments + /// + /// * `base` - A value of type `DocumentBaseTransition` to set. + fn set_base(&mut self, base: DocumentBaseTransition); + + /// Returns a reference to the `revision` field of the `DocumentReplaceTransitionV0`. + fn revision(&self) -> Revision; + + /// Sets the value of the `revision` field in the `DocumentReplaceTransitionV0`. + fn set_revision(&mut self, revision: Revision); + fn price(&self) -> Credits; +} + +impl DocumentPurchaseTransitionV0Methods for DocumentPurchaseTransitionV0 { + fn base(&self) -> &DocumentBaseTransition { + &self.base + } + + fn base_mut(&mut self) -> &mut DocumentBaseTransition { + &mut self.base + } + + fn set_base(&mut self, base: DocumentBaseTransition) { + self.base = base + } + + fn revision(&self) -> Revision { + self.revision + } + + fn set_revision(&mut self, revision: Revision) { + self.revision = revision; + } + + fn price(&self) -> Credits { + self.price + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0_methods.rs new file mode 100644 index 0000000000..86c2fe8f19 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0_methods.rs @@ -0,0 +1,43 @@ +use crate::fee::Credits; +use crate::prelude::Revision; +use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; +use crate::state_transition::documents_batch_transition::document_transition::document_purchase_transition::v0::v0_methods::DocumentPurchaseTransitionV0Methods; +use crate::state_transition::documents_batch_transition::document_transition::DocumentPurchaseTransition; + +impl DocumentPurchaseTransitionV0Methods for DocumentPurchaseTransition { + fn base(&self) -> &DocumentBaseTransition { + match self { + DocumentPurchaseTransition::V0(v0) => &v0.base, + } + } + + fn base_mut(&mut self) -> &mut DocumentBaseTransition { + match self { + DocumentPurchaseTransition::V0(v0) => &mut v0.base, + } + } + + fn set_base(&mut self, base: DocumentBaseTransition) { + match self { + DocumentPurchaseTransition::V0(v0) => v0.base = base, + } + } + + fn revision(&self) -> Revision { + match self { + DocumentPurchaseTransition::V0(v0) => v0.revision, + } + } + + fn set_revision(&mut self, revision: Revision) { + match self { + DocumentPurchaseTransition::V0(v0) => v0.revision = revision, + } + } + + fn price(&self) -> Credits { + match self { + DocumentPurchaseTransition::V0(v0) => v0.price, + } + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/from_document.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/from_document.rs new file mode 100644 index 0000000000..4f26ff90bd --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/from_document.rs @@ -0,0 +1,44 @@ +use platform_version::version::{FeatureVersion, PlatformVersion}; +use crate::data_contract::document_type::{DocumentTypeRef}; +use crate::document::{Document}; +use crate::fee::Credits; +use crate::prelude::IdentityNonce; +use crate::ProtocolError; +use crate::state_transition::documents_batch_transition::document_transition::DocumentUpdatePriceTransition; +use crate::state_transition::documents_batch_transition::document_transition::document_update_price_transition::DocumentUpdatePriceTransitionV0; + +impl DocumentUpdatePriceTransition { + pub fn from_document( + document: Document, + document_type: DocumentTypeRef, + price: Credits, + identity_contract_nonce: IdentityNonce, + platform_version: &PlatformVersion, + feature_version: Option, + base_feature_version: Option, + ) -> Result { + match feature_version.unwrap_or( + platform_version + .dpp + .state_transition_serialization_versions + .document_update_price_state_transition + .bounds + .default_current_version, + ) { + 0 => Ok(DocumentUpdatePriceTransitionV0::from_document( + document, + document_type, + price, + identity_contract_nonce, + platform_version, + base_feature_version, + )? + .into()), + version => Err(ProtocolError::UnknownVersionMismatch { + method: "DocumentUpdatePriceTransition::from_document".to_string(), + known_versions: vec![0], + received: version, + }), + } + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/mod.rs new file mode 100644 index 0000000000..25a16a09ae --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/mod.rs @@ -0,0 +1,19 @@ +mod from_document; +pub mod v0; +pub mod v0_methods; + +use bincode::{Decode, Encode}; +use derive_more::{Display, From}; +#[cfg(feature = "state-transition-serde-conversion")] +use serde::{Deserialize, Serialize}; +pub use v0::*; + +#[derive(Debug, Clone, Encode, Decode, PartialEq, Display, From)] +#[cfg_attr( + feature = "state-transition-serde-conversion", + derive(Serialize, Deserialize) +)] +pub enum DocumentUpdatePriceTransition { + #[display(fmt = "V0({})", "_0")] + V0(DocumentUpdatePriceTransitionV0), +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0/from_document.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0/from_document.rs new file mode 100644 index 0000000000..570a3fb561 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0/from_document.rs @@ -0,0 +1,36 @@ +use platform_version::version::{FeatureVersion, PlatformVersion}; +use crate::data_contract::document_type::{DocumentTypeRef}; +use crate::document::{Document, DocumentV0Getters}; +use crate::document::errors::DocumentError; +use crate::fee::Credits; +use crate::prelude::IdentityNonce; +use crate::ProtocolError; +use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; +use crate::state_transition::documents_batch_transition::document_transition::document_update_price_transition::DocumentUpdatePriceTransitionV0; + +impl DocumentUpdatePriceTransitionV0 { + pub(crate) fn from_document( + document: Document, + document_type: DocumentTypeRef, + price: Credits, + identity_contract_nonce: IdentityNonce, + platform_version: &PlatformVersion, + base_feature_version: Option, + ) -> Result { + Ok(DocumentUpdatePriceTransitionV0 { + base: DocumentBaseTransition::from_document( + &document, + document_type, + identity_contract_nonce, + platform_version, + base_feature_version, + )?, + revision: document.revision().ok_or_else(|| { + ProtocolError::Document(Box::new(DocumentError::DocumentNoRevisionError { + document: Box::new(document.clone()), + })) + })?, + price, + }) + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0/mod.rs new file mode 100644 index 0000000000..fe1e11cae1 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0/mod.rs @@ -0,0 +1,277 @@ +mod from_document; +pub mod v0_methods; + +use crate::prelude::Revision; +use bincode::{Decode, Encode}; +use derive_more::Display; + +#[cfg(feature = "state-transition-serde-conversion")] +use serde::{Deserialize, Serialize}; + +use crate::fee::Credits; + +pub use super::super::document_base_transition::IDENTIFIER_FIELDS; +use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; + +mod property_names { + pub const REVISION: &str = "$revision"; +} + +#[derive(Debug, Clone, Default, Encode, Decode, PartialEq, Display)] +#[cfg_attr( + feature = "state-transition-serde-conversion", + derive(Serialize, Deserialize), + serde(rename_all = "camelCase") +)] +#[display(fmt = "Base: {}, Revision: {}, Price: {}", "base", "revision", "price")] +pub struct DocumentUpdatePriceTransitionV0 { + #[cfg_attr(feature = "state-transition-serde-conversion", serde(flatten))] + pub base: DocumentBaseTransition, + #[cfg_attr( + feature = "state-transition-serde-conversion", + serde(rename = "$revision") + )] + pub revision: Revision, + #[cfg_attr( + feature = "state-transition-serde-conversion", + serde(rename = "$price") + )] + pub price: Credits, +} +// +// /// document from update_price transition v0 +// pub trait DocumentFromUpdatePriceTransitionV0 { +// /// Attempts to create a new `Document` from the given `DocumentUpdatePriceTransitionV0` reference. This operation is typically used to update_price or update an existing document with new information. +// /// +// /// # Arguments +// /// +// /// * `value` - A reference to the `DocumentUpdatePriceTransitionV0` containing the new information for the document. +// /// * `owner_id` - The `Identifier` of the document's owner. +// /// * `created_at` - An optional timestamp representing when the original document was created. This is preserved during update_pricement. +// /// * `created_at_block_height` - An optional height of the block at which the original document was created. This is preserved during update_pricement. +// /// * `created_at_core_block_height` - An optional core block height at which the original document was created. This is preserved during update_pricement. +// /// * `block_info` - Information about the current block at the time of this update_price transition. +// /// * `document_type` - A reference to the `DocumentTypeRef` indicating the type of the document being update_priced. +// /// * `platform_version` - A reference to the `PlatformVersion` indicating the version of the platform under which the document is being update_priced. +// /// +// /// # Returns +// /// +// /// * `Result` - On successful update_pricement, returns a new `Document` object populated with the provided data. Returns a `ProtocolError` if the update_pricement fails due to validation errors or other issues. +// /// +// /// # Errors +// /// +// /// This function may return a `ProtocolError` if validation fails, required fields are missing, or if there are mismatches between field types and the schema defined in the data contract. +// fn try_from_update_price_transition_v0( +// value: &DocumentUpdatePriceTransitionV0, +// owner_id: Identifier, +// created_at: Option, +// created_at_block_height: Option, +// created_at_core_block_height: Option, +// transferred_at: Option, +// transferred_at_block_height: Option, +// transferred_at_core_block_height: Option, +// block_info: &BlockInfo, +// document_type: &DocumentTypeRef, +// platform_version: &PlatformVersion, +// ) -> Result +// where +// Self: Sized; +// /// Attempts to create a new `Document` from the given `DocumentUpdatePriceTransitionV0` instance. This function is similar to `try_from_update_price_transition_v0` but consumes the `DocumentUpdatePriceTransitionV0` instance, making it suitable for scenarios where the transition is owned and should not be reused after document creation. +// /// +// /// # Arguments +// /// +// /// * `value` - An owned `DocumentUpdatePriceTransitionV0` instance containing the new information for the document. +// /// * `owner_id` - The `Identifier` of the document's owner. +// /// * `created_at` - An optional timestamp representing when the original document was created. This is preserved during update_pricement. +// /// * `created_at_block_height` - An optional height of the block at which the original document was created. This is preserved during update_pricement. +// /// * `created_at_core_block_height` - An optional core block height at which the original document was created. This is preserved during update_pricement. +// /// * `block_info` - Information about the current block at the time of this update_price transition. +// /// * `document_type` - A reference to the `DocumentTypeRef` indicating the type of the document being update_priced. +// /// * `platform_version` - A reference to the `PlatformVersion` indicating the version of the platform under which the document is being update_priced. +// /// +// /// # Returns +// /// +// /// * `Result` - On successful update_pricement, returns a new `Document` object populated with the provided data. Returns a `ProtocolError` if the update_pricement fails due to validation errors or other issues. +// /// +// /// # Errors +// /// +// /// This function may return a `ProtocolError` for the same reasons as `try_from_update_price_transition_v0`, including validation failures, missing required fields, or schema mismatches. +// fn try_from_owned_update_price_transition_v0( +// value: DocumentUpdatePriceTransitionV0, +// owner_id: Identifier, +// created_at: Option, +// created_at_block_height: Option, +// created_at_core_block_height: Option, +// transferred_at: Option, +// transferred_at_block_height: Option, +// transferred_at_core_block_height: Option, +// block_info: &BlockInfo, +// document_type: &DocumentTypeRef, +// platform_version: &PlatformVersion, +// ) -> Result +// where +// Self: Sized; +// } +// +// impl DocumentFromUpdatePriceTransitionV0 for Document { +// fn try_from_update_price_transition_v0( +// value: &DocumentUpdatePriceTransitionV0, +// owner_id: Identifier, +// created_at: Option, +// created_at_block_height: Option, +// created_at_core_block_height: Option, +// transferred_at: Option, +// transferred_at_block_height: Option, +// transferred_at_core_block_height: Option, +// block_info: &BlockInfo, +// document_type: &DocumentTypeRef, +// platform_version: &PlatformVersion, +// ) -> Result { +// let DocumentUpdatePriceTransitionV0 { +// base, +// revision, +// price, +// } = value; +// +// let id = base.id(); +// +// let requires_updated_at = document_type +// .required_fields() +// .contains(document::property_names::UPDATED_AT); +// +// let requires_updated_at_block_height = document_type +// .required_fields() +// .contains(document::property_names::UPDATED_AT_BLOCK_HEIGHT); +// +// let requires_updated_at_core_block_height = document_type +// .required_fields() +// .contains(document::property_names::UPDATED_AT_CORE_BLOCK_HEIGHT); +// +// let updated_at = if requires_updated_at { +// Some(block_info.time_ms) +// } else { +// None +// }; +// +// let updated_at_block_height = if requires_updated_at_block_height { +// Some(block_info.height) +// } else { +// None +// }; +// +// let updated_at_core_block_height = if requires_updated_at_core_block_height { +// Some(block_info.core_height) +// } else { +// None +// }; +// +// data +// +// match platform_version +// .dpp +// .document_versions +// .document_structure_version +// { +// 0 => Ok(DocumentV0 { +// id, +// owner_id, +// properties: data.clone(), +// revision: Some(*revision), +// created_at, +// updated_at, +// transferred_at, +// created_at_block_height, +// updated_at_block_height, +// transferred_at_block_height, +// created_at_core_block_height, +// updated_at_core_block_height, +// transferred_at_core_block_height, +// } +// .into()), +// version => Err(ProtocolError::UnknownVersionMismatch { +// method: "Document::try_from_update_price_transition".to_string(), +// known_versions: vec![0], +// received: version, +// }), +// } +// } +// +// fn try_from_owned_update_price_transition_v0( +// value: DocumentUpdatePriceTransitionV0, +// owner_id: Identifier, +// created_at: Option, +// created_at_block_height: Option, +// created_at_core_block_height: Option, +// transferred_at: Option, +// transferred_at_block_height: Option, +// transferred_at_core_block_height: Option, +// block_info: &BlockInfo, +// document_type: &DocumentTypeRef, +// platform_version: &PlatformVersion, +// ) -> Result { +// let DocumentUpdatePriceTransitionV0 { +// base, +// revision, +// price, +// } = value; +// +// let id = base.id(); +// +// let requires_updated_at = document_type +// .required_fields() +// .contains(document::property_names::UPDATED_AT); +// +// let requires_updated_at_block_height = document_type +// .required_fields() +// .contains(document::property_names::UPDATED_AT_BLOCK_HEIGHT); +// +// let requires_updated_at_core_block_height = document_type +// .required_fields() +// .contains(document::property_names::UPDATED_AT_CORE_BLOCK_HEIGHT); +// +// let updated_at = if requires_updated_at { +// Some(block_info.time_ms) +// } else { +// None +// }; +// +// let updated_at_block_height = if requires_updated_at_block_height { +// Some(block_info.height) +// } else { +// None +// }; +// +// let updated_at_core_block_height = if requires_updated_at_core_block_height { +// Some(block_info.core_height) +// } else { +// None +// }; +// match platform_version +// .dpp +// .document_versions +// .document_structure_version +// { +// 0 => Ok(DocumentV0 { +// id, +// owner_id, +// properties: data, +// revision: Some(revision), +// created_at, +// updated_at, +// transferred_at, +// created_at_block_height, +// updated_at_block_height, +// transferred_at_block_height, +// created_at_core_block_height, +// updated_at_core_block_height, +// transferred_at_core_block_height, +// } +// .into()), +// version => Err(ProtocolError::UnknownVersionMismatch { +// method: "Document::try_from_update_price_transition".to_string(), +// known_versions: vec![0], +// received: version, +// }), +// } +// } +// } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0/v0_methods.rs new file mode 100644 index 0000000000..74b27a3589 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0/v0_methods.rs @@ -0,0 +1,58 @@ +use crate::fee::Credits; +use crate::prelude::Revision; + +use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; + +use crate::state_transition::documents_batch_transition::document_transition::document_update_price_transition::DocumentUpdatePriceTransitionV0; + +pub trait DocumentUpdatePriceTransitionV0Methods { + /// Returns a reference to the `base` field of the `DocumentUpdatePriceTransitionV0`. + fn base(&self) -> &DocumentBaseTransition; + /// Returns a mut reference to the `base` field of the `DocumentUpdatePriceTransitionV0`. + fn base_mut(&mut self) -> &mut DocumentBaseTransition; + + /// Sets the value of the `base` field in the `DocumentUpdatePriceTransitionV0`. + fn set_base(&mut self, base: DocumentBaseTransition); + + /// Returns a reference to the `revision` field of the `DocumentUpdatePriceTransitionV0`. + fn revision(&self) -> Revision; + + /// Sets the value of the `revision` field in the `DocumentUpdatePriceTransitionV0`. + fn set_revision(&mut self, revision: Revision); + + /// Returns a reference to the `price` field of the `DocumentUpdatePriceTransitionV0`. + fn price(&self) -> Credits; + + /// Sets the value of the `price` field in the `DocumentUpdatePriceTransitionV0`. + fn set_price(&mut self, price: Credits); +} + +impl DocumentUpdatePriceTransitionV0Methods for DocumentUpdatePriceTransitionV0 { + fn base(&self) -> &DocumentBaseTransition { + &self.base + } + + fn base_mut(&mut self) -> &mut DocumentBaseTransition { + &mut self.base + } + + fn set_base(&mut self, base: DocumentBaseTransition) { + self.base = base; + } + + fn revision(&self) -> Revision { + self.revision + } + + fn set_revision(&mut self, revision: Revision) { + self.revision = revision; + } + + fn price(&self) -> Credits { + self.price + } + + fn set_price(&mut self, price: Credits) { + self.price = price; + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0_methods.rs new file mode 100644 index 0000000000..3b605d7431 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0_methods.rs @@ -0,0 +1,49 @@ +use crate::fee::Credits; +use crate::prelude::Revision; +use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; +use crate::state_transition::documents_batch_transition::document_transition::document_update_price_transition::v0::v0_methods::DocumentUpdatePriceTransitionV0Methods; +use crate::state_transition::documents_batch_transition::document_transition::DocumentUpdatePriceTransition; + +impl DocumentUpdatePriceTransitionV0Methods for DocumentUpdatePriceTransition { + fn base(&self) -> &DocumentBaseTransition { + match self { + DocumentUpdatePriceTransition::V0(v0) => &v0.base, + } + } + + fn base_mut(&mut self) -> &mut DocumentBaseTransition { + match self { + DocumentUpdatePriceTransition::V0(v0) => &mut v0.base, + } + } + + fn set_base(&mut self, base: DocumentBaseTransition) { + match self { + DocumentUpdatePriceTransition::V0(v0) => v0.base = base, + } + } + + fn revision(&self) -> Revision { + match self { + DocumentUpdatePriceTransition::V0(v0) => v0.revision, + } + } + + fn set_revision(&mut self, revision: Revision) { + match self { + DocumentUpdatePriceTransition::V0(v0) => v0.revision = revision, + } + } + + fn price(&self) -> Credits { + match self { + DocumentUpdatePriceTransition::V0(v0) => v0.price, + } + } + + fn set_price(&mut self, price: Credits) { + match self { + DocumentUpdatePriceTransition::V0(v0) => v0.price = price, + } + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/mod.rs index 9ff8246a8e..00e566b2a8 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/mod.rs @@ -12,8 +12,10 @@ pub mod action_type; pub mod document_base_transition; pub mod document_create_transition; pub mod document_delete_transition; +pub mod document_purchase_transition; pub mod document_replace_transition; pub mod document_transfer_transition; +pub mod document_update_price_transition; use crate::prelude::Revision; use crate::state_transition::documents_batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; @@ -22,7 +24,11 @@ pub use document_create_transition::DocumentCreateTransition; pub use document_delete_transition::DocumentDeleteTransition; pub use document_replace_transition::DocumentReplaceTransition; pub use document_transfer_transition::DocumentTransferTransition; +pub use document_purchase_transition::DocumentPurchaseTransition; +pub use document_update_price_transition::DocumentUpdatePriceTransition; use platform_value::Value; +use crate::state_transition::documents_batch_transition::document_transition::document_purchase_transition::v0::v0_methods::DocumentPurchaseTransitionV0Methods; +use crate::state_transition::documents_batch_transition::document_transition::document_update_price_transition::v0::v0_methods::DocumentUpdatePriceTransitionV0Methods; use crate::state_transition::state_transitions::document::documents_batch_transition::document_transition::document_create_transition::v0::v0_methods::DocumentCreateTransitionV0Methods; use crate::state_transition::state_transitions::document::documents_batch_transition::document_transition::document_replace_transition::v0::v0_methods::DocumentReplaceTransitionV0Methods; @@ -81,6 +87,12 @@ pub enum DocumentTransition { #[display(fmt = "TransferDocumentTransition({})", "_0")] Transfer(DocumentTransferTransition), + + #[display(fmt = "UpdatePriceDocumentTransition({})", "_0")] + UpdatePrice(DocumentUpdatePriceTransition), + + #[display(fmt = "PurchaseDocumentTransition({})", "_0")] + Purchase(DocumentPurchaseTransition), } impl DocumentTransition { @@ -106,6 +118,22 @@ impl DocumentTransition { None } } + + pub fn as_transition_transfer(&self) -> Option<&DocumentTransferTransition> { + if let Self::Transfer(ref t) = self { + Some(t) + } else { + None + } + } + + pub fn as_transition_purchase(&self) -> Option<&DocumentPurchaseTransition> { + if let Self::Purchase(ref t) = self { + Some(t) + } else { + None + } + } } impl DocumentTransitionV0Methods for DocumentTransition { @@ -115,6 +143,8 @@ impl DocumentTransitionV0Methods for DocumentTransition { DocumentTransition::Replace(t) => t.base(), DocumentTransition::Delete(t) => t.base(), DocumentTransition::Transfer(t) => t.base(), + DocumentTransition::UpdatePrice(t) => t.base(), + DocumentTransition::Purchase(t) => t.base(), } } @@ -124,6 +154,8 @@ impl DocumentTransitionV0Methods for DocumentTransition { DocumentTransition::Replace(t) => t.data().get(path), DocumentTransition::Delete(_) => None, DocumentTransition::Transfer(_) => None, + DocumentTransition::UpdatePrice(_) => None, + DocumentTransition::Purchase(_) => None, } } @@ -145,6 +177,8 @@ impl DocumentTransitionV0Methods for DocumentTransition { DocumentTransition::Replace(t) => Some(t.data()), DocumentTransition::Delete(_) => None, DocumentTransition::Transfer(_) => None, + DocumentTransition::UpdatePrice(_) => None, + DocumentTransition::Purchase(_) => None, } } @@ -154,6 +188,8 @@ impl DocumentTransitionV0Methods for DocumentTransition { DocumentTransition::Replace(t) => Some(t.revision()), DocumentTransition::Delete(_) => None, DocumentTransition::Transfer(t) => Some(t.revision()), + DocumentTransition::UpdatePrice(t) => Some(t.revision()), + DocumentTransition::Purchase(t) => Some(t.revision()), } } @@ -163,6 +199,8 @@ impl DocumentTransitionV0Methods for DocumentTransition { DocumentTransition::Replace(t) => t.base().identity_contract_nonce(), DocumentTransition::Delete(t) => t.base().identity_contract_nonce(), DocumentTransition::Transfer(t) => t.base().identity_contract_nonce(), + DocumentTransition::UpdatePrice(t) => t.base().identity_contract_nonce(), + DocumentTransition::Purchase(t) => t.base().identity_contract_nonce(), } } @@ -181,6 +219,8 @@ impl DocumentTransitionV0Methods for DocumentTransition { } DocumentTransition::Delete(_) => {} DocumentTransition::Transfer(_) => {} + DocumentTransition::UpdatePrice(_) => {} + DocumentTransition::Purchase(_) => {} } } @@ -194,6 +234,8 @@ impl DocumentTransitionV0Methods for DocumentTransition { DocumentTransition::Replace(t) => t.base_mut(), DocumentTransition::Delete(t) => t.base_mut(), DocumentTransition::Transfer(t) => t.base_mut(), + DocumentTransition::UpdatePrice(t) => t.base_mut(), + DocumentTransition::Purchase(t) => t.base_mut(), } } @@ -203,6 +245,8 @@ impl DocumentTransitionV0Methods for DocumentTransition { DocumentTransition::Replace(t) => Some(t.data_mut()), DocumentTransition::Delete(_) => None, DocumentTransition::Transfer(_) => None, + DocumentTransition::UpdatePrice(_) => None, + DocumentTransition::Purchase(_) => None, } } @@ -211,7 +255,9 @@ impl DocumentTransitionV0Methods for DocumentTransition { DocumentTransition::Create(_) => {} DocumentTransition::Replace(ref mut t) => t.set_revision(revision), DocumentTransition::Delete(_) => {} - DocumentTransition::Transfer(_) => {} + DocumentTransition::Transfer(ref mut t) => t.set_revision(revision), + DocumentTransition::UpdatePrice(ref mut t) => t.set_revision(revision), + DocumentTransition::Purchase(ref mut t) => t.set_revision(revision), } } @@ -221,6 +267,8 @@ impl DocumentTransitionV0Methods for DocumentTransition { DocumentTransition::Replace(t) => t.base_mut().set_identity_contract_nonce(nonce), DocumentTransition::Delete(t) => t.base_mut().set_identity_contract_nonce(nonce), DocumentTransition::Transfer(t) => t.base_mut().set_identity_contract_nonce(nonce), + DocumentTransition::UpdatePrice(t) => t.base_mut().set_identity_contract_nonce(nonce), + DocumentTransition::Purchase(t) => t.base_mut().set_identity_contract_nonce(nonce), } } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs index 27ae53c2a0..6d2b9a451a 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs @@ -2,6 +2,7 @@ use crate::data_contract::document_type::DocumentTypeRef; #[cfg(feature = "state-transition-signing")] use crate::document::Document; +use crate::fee::Credits; #[cfg(feature = "state-transition-signing")] use crate::identity::signer::Signer; #[cfg(feature = "state-transition-signing")] @@ -26,6 +27,12 @@ use platform_version::version::{FeatureVersion, PlatformVersion}; pub mod v0; impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransition { + fn all_purchases_amount(&self) -> Option { + match self { + DocumentsBatchTransition::V0(v0) => v0.all_purchases_amount(), + } + } + fn set_transitions(&mut self, transitions: Vec) { match self { DocumentsBatchTransition::V0(v0) => v0.set_transitions(transitions), @@ -94,7 +101,7 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransition { signer: &S, platform_version: &PlatformVersion, batch_feature_version: Option, - update_feature_version: Option, + replace_feature_version: Option, base_feature_version: Option, ) -> Result { match batch_feature_version.unwrap_or( @@ -114,7 +121,7 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransition { signer, platform_version, batch_feature_version, - update_feature_version, + replace_feature_version, base_feature_version, )?, ), @@ -139,7 +146,7 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransition { signer: &S, platform_version: &PlatformVersion, batch_feature_version: Option, - update_feature_version: Option, + transfer_feature_version: Option, base_feature_version: Option, ) -> Result { match batch_feature_version.unwrap_or( @@ -160,7 +167,7 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransition { signer, platform_version, batch_feature_version, - update_feature_version, + transfer_feature_version, base_feature_version, )?, ), @@ -216,4 +223,97 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransition { }), } } + + #[cfg(feature = "state-transition-signing")] + fn new_document_update_price_transition_from_document( + document: Document, + document_type: DocumentTypeRef, + price: Credits, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + batch_feature_version: Option, + update_price_feature_version: Option, + base_feature_version: Option, + ) -> Result { + match batch_feature_version.unwrap_or( + platform_version + .dpp + .state_transition_serialization_versions + .documents_batch_state_transition + .default_current_version, + ) { + 0 => Ok( + DocumentsBatchTransitionV0::new_document_update_price_transition_from_document( + document, + document_type, + price, + identity_public_key, + identity_contract_nonce, + user_fee_increase, + signer, + platform_version, + batch_feature_version, + update_price_feature_version, + base_feature_version, + )?, + ), + version => Err(ProtocolError::UnknownVersionMismatch { + method: + "DocumentsBatchTransition::new_document_update_price_transition_from_document" + .to_string(), + known_versions: vec![0], + received: version, + }), + } + } + + #[cfg(feature = "state-transition-signing")] + fn new_document_purchase_transition_from_document( + document: Document, + document_type: DocumentTypeRef, + new_owner_id: Identifier, + price: Credits, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + batch_feature_version: Option, + purchase_feature_version: Option, + base_feature_version: Option, + ) -> Result { + match batch_feature_version.unwrap_or( + platform_version + .dpp + .state_transition_serialization_versions + .documents_batch_state_transition + .default_current_version, + ) { + 0 => Ok( + DocumentsBatchTransitionV0::new_document_purchase_transition_from_document( + document, + document_type, + new_owner_id, + price, + identity_public_key, + identity_contract_nonce, + user_fee_increase, + signer, + platform_version, + batch_feature_version, + purchase_feature_version, + base_feature_version, + )?, + ), + version => Err(ProtocolError::UnknownVersionMismatch { + method: "DocumentsBatchTransition::new_document_purchase_transition_from_document" + .to_string(), + known_versions: vec![0], + received: version, + }), + } + } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/v0/mod.rs index 8c48bce89c..a21448ea48 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/v0/mod.rs @@ -2,6 +2,7 @@ use crate::data_contract::document_type::DocumentTypeRef; #[cfg(feature = "state-transition-signing")] use crate::document::Document; +use crate::fee::Credits; #[cfg(feature = "state-transition-signing")] use crate::identity::signer::Signer; #[cfg(feature = "state-transition-signing")] @@ -49,7 +50,7 @@ pub trait DocumentsBatchTransitionMethodsV0: DocumentsBatchTransitionAccessorsV0 signer: &S, platform_version: &PlatformVersion, _batch_feature_version: Option, - update_feature_version: Option, + replace_feature_version: Option, base_feature_version: Option, ) -> Result; @@ -78,7 +79,38 @@ pub trait DocumentsBatchTransitionMethodsV0: DocumentsBatchTransitionAccessorsV0 signer: &S, platform_version: &PlatformVersion, _batch_feature_version: Option, - delete_feature_version: Option, + transfer_feature_version: Option, + base_feature_version: Option, + ) -> Result; + + #[cfg(feature = "state-transition-signing")] + fn new_document_update_price_transition_from_document( + document: Document, + document_type: DocumentTypeRef, + price: Credits, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + batch_feature_version: Option, + update_price_feature_version: Option, + base_feature_version: Option, + ) -> Result; + + #[cfg(feature = "state-transition-signing")] + fn new_document_purchase_transition_from_document( + document: Document, + document_type: DocumentTypeRef, + new_owner_id: Identifier, + price: Credits, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + batch_feature_version: Option, + purchase_feature_version: Option, base_feature_version: Option, ) -> Result; @@ -123,4 +155,6 @@ pub trait DocumentsBatchTransitionMethodsV0: DocumentsBatchTransitionAccessorsV0 fn set_transitions(&mut self, transitions: Vec); fn set_identity_contract_nonce(&mut self, identity_contract_nonce: IdentityNonce); + + fn all_purchases_amount(&self) -> Option; } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs index 3029f033e4..397de6c5e5 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs @@ -2,6 +2,7 @@ use crate::data_contract::document_type::DocumentTypeRef; #[cfg(feature = "state-transition-signing")] use crate::document::{Document, DocumentV0Getters}; +use crate::fee::Credits; #[cfg(feature = "state-transition-signing")] use crate::identity::signer::Signer; #[cfg(feature = "state-transition-signing")] @@ -14,12 +15,12 @@ use crate::prelude::UserFeeIncrease; use crate::state_transition::documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; #[cfg(feature = "state-transition-signing")] use crate::state_transition::documents_batch_transition::document_create_transition::DocumentCreateTransition; -#[cfg(feature = "state-transition-signing")] use crate::state_transition::documents_batch_transition::document_transition::{ - DocumentReplaceTransition, DocumentTransferTransition, + DocumentTransition, DocumentTransitionV0Methods, }; +#[cfg(feature = "state-transition-signing")] use crate::state_transition::documents_batch_transition::document_transition::{ - DocumentTransition, DocumentTransitionV0Methods, + DocumentReplaceTransition, DocumentTransferTransition, DocumentPurchaseTransition, DocumentUpdatePriceTransition, }; use crate::state_transition::documents_batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; use crate::state_transition::documents_batch_transition::DocumentsBatchTransitionV0; @@ -35,6 +36,7 @@ use crate::ProtocolError; use platform_value::Identifier; #[cfg(feature = "state-transition-signing")] use platform_version::version::{FeatureVersion, PlatformVersion}; +use crate::state_transition::documents_batch_transition::document_transition::document_purchase_transition::v0::v0_methods::DocumentPurchaseTransitionV0Methods; impl DocumentsBatchTransitionAccessorsV0 for DocumentsBatchTransitionV0 { fn transitions(&self) -> &Vec { @@ -98,7 +100,7 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransitionV0 { signer: &S, platform_version: &PlatformVersion, _batch_feature_version: Option, - update_feature_version: Option, + replace_feature_version: Option, base_feature_version: Option, ) -> Result { let owner_id = document.owner_id(); @@ -107,7 +109,7 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransitionV0 { document_type, identity_contract_nonce, platform_version, - update_feature_version, + replace_feature_version, base_feature_version, )?; let documents_batch_transition: DocumentsBatchTransition = DocumentsBatchTransitionV0 { @@ -138,7 +140,7 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransitionV0 { signer: &S, platform_version: &PlatformVersion, _batch_feature_version: Option, - delete_feature_version: Option, + transfer_feature_version: Option, base_feature_version: Option, ) -> Result { let owner_id = document.owner_id(); @@ -148,7 +150,7 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransitionV0 { identity_contract_nonce, recipient_owner_id, platform_version, - delete_feature_version, + transfer_feature_version, base_feature_version, )?; let documents_batch_transition: DocumentsBatchTransition = DocumentsBatchTransitionV0 { @@ -207,6 +209,88 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransitionV0 { Ok(state_transition) } + #[cfg(feature = "state-transition-signing")] + fn new_document_update_price_transition_from_document( + document: Document, + document_type: DocumentTypeRef, + price: Credits, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + _batch_feature_version: Option, + update_price_feature_version: Option, + base_feature_version: Option, + ) -> Result { + let owner_id = document.owner_id(); + let transfer_transition = DocumentUpdatePriceTransition::from_document( + document, + document_type, + price, + identity_contract_nonce, + platform_version, + update_price_feature_version, + base_feature_version, + )?; + let documents_batch_transition: DocumentsBatchTransition = DocumentsBatchTransitionV0 { + owner_id, + transitions: vec![transfer_transition.into()], + user_fee_increase, + signature_public_key_id: 0, + signature: Default::default(), + } + .into(); + let mut state_transition: StateTransition = documents_batch_transition.into(); + state_transition.sign_external( + identity_public_key, + signer, + Some(|_, _| Ok(SecurityLevel::HIGH)), + )?; + Ok(state_transition) + } + + #[cfg(feature = "state-transition-signing")] + fn new_document_purchase_transition_from_document( + document: Document, + document_type: DocumentTypeRef, + new_owner_id: Identifier, + price: Credits, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + _batch_feature_version: Option, + purchase_feature_version: Option, + base_feature_version: Option, + ) -> Result { + let purchase_transition = DocumentPurchaseTransition::from_document( + document, + document_type, + price, + identity_contract_nonce, + platform_version, + purchase_feature_version, + base_feature_version, + )?; + let documents_batch_transition: DocumentsBatchTransition = DocumentsBatchTransitionV0 { + owner_id: new_owner_id, + transitions: vec![purchase_transition.into()], + user_fee_increase, + signature_public_key_id: 0, + signature: Default::default(), + } + .into(); + let mut state_transition: StateTransition = documents_batch_transition.into(); + state_transition.sign_external( + identity_public_key, + signer, + Some(|_, _| Ok(SecurityLevel::HIGH)), + )?; + Ok(state_transition) + } + fn set_transitions(&mut self, transitions: Vec) { self.transitions = transitions; } @@ -216,4 +300,22 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransitionV0 { .iter_mut() .for_each(|transition| transition.set_identity_contract_nonce(identity_contract_nonce)); } + + fn all_purchases_amount(&self) -> Option { + let (total, any_purchases) = self + .transitions + .iter() + .filter_map(|transition| { + transition + .as_transition_purchase() + .map(|purchase| purchase.price()) + }) + .fold((0, false), |(acc, _), price| (acc + price, true)); + + if any_purchases { + Some(total) // Return the sum as Some(Credits) if there were any purchases + } else { + None // Return None if no purchases were found + } + } } diff --git a/packages/rs-dpp/src/util/json_schema.rs b/packages/rs-dpp/src/util/json_schema.rs index 24ba0b584b..0e6459083d 100644 --- a/packages/rs-dpp/src/util/json_schema.rs +++ b/packages/rs-dpp/src/util/json_schema.rs @@ -213,6 +213,7 @@ mod test { false, false, false, + false, &mut vec![], LATEST_PLATFORM_VERSION, ) diff --git a/packages/rs-dpp/src/util/mod.rs b/packages/rs-dpp/src/util/mod.rs index a4ae012dca..2dee13be29 100644 --- a/packages/rs-dpp/src/util/mod.rs +++ b/packages/rs-dpp/src/util/mod.rs @@ -13,4 +13,5 @@ pub mod json_value; pub mod protocol_data; pub mod strings; +pub mod units; pub mod vec; diff --git a/packages/rs-dpp/src/util/units.rs b/packages/rs-dpp/src/util/units.rs new file mode 100644 index 0000000000..ca00561cf0 --- /dev/null +++ b/packages/rs-dpp/src/util/units.rs @@ -0,0 +1,29 @@ +#[macro_export] +macro_rules! dash_to_credits { + // The macro takes a string literal representing the Dash amount. + ($dash:expr) => {{ + let dash_str = stringify!($dash); + + // Parsing the input string to separate the whole and fractional parts. + let parts: Vec<&str> = dash_str.split('.').collect(); + let mut credits: u128 = 0; + + // Process the whole number part if it exists. + if let Some(whole) = parts.get(0) { + if let Ok(whole_number) = whole.parse::() { + credits += whole_number * 100_000_000_000; // Whole Dash amount to credits + } + } + + // Process the fractional part if it exists. + if let Some(fraction) = parts.get(1) { + let fraction_length = fraction.len(); + let fraction_number = fraction.parse::().unwrap_or(0); + // Calculate the multiplier based on the number of digits in the fraction. + let multiplier = 10u128.pow(11 - fraction_length as u32); + credits += fraction_number * multiplier; // Fractional Dash to credits + } + + credits as u64 + }}; +} diff --git a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs index 1bd5aff521..a7c6a1739d 100644 --- a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs @@ -434,7 +434,7 @@ mod tests { ) .expect("expected to process state transition"); - assert_eq!(processing_result.aggregated_fees().processing_fee, 2978520); + assert_eq!(processing_result.aggregated_fees().processing_fee, 2985330); let check_result = platform .check_tx( @@ -549,6 +549,7 @@ mod tests { }, keep_history_chance: 0.0, documents_mutable_chance: 0.0, + documents_can_be_deleted_chance: 0.0, }; let mut rng = StdRng::seed_from_u64(6); @@ -625,7 +626,7 @@ mod tests { // We have one invalid paid for state transition assert_eq!(processing_result.invalid_paid_count(), 1); - assert_eq!(processing_result.aggregated_fees().processing_fee, 909510); + assert_eq!(processing_result.aggregated_fees().processing_fee, 909520); let check_result = platform .check_tx( @@ -767,7 +768,7 @@ mod tests { // since a fee multiplier of 100 means 100% more of 1 (gives 2) assert_eq!( processing_result.aggregated_fees().processing_fee, - 2978520 * 2 + 2985330 * 2 ); let check_result = platform @@ -1005,7 +1006,7 @@ mod tests { ) .expect("expected to process state transition"); - assert_eq!(processing_result.aggregated_fees().processing_fee, 2978520); + assert_eq!(processing_result.aggregated_fees().processing_fee, 2985330); platform .drive @@ -1089,7 +1090,7 @@ mod tests { assert_eq!( update_processing_result.aggregated_fees().processing_fee, - 7098500 + 7125710 ); let check_result = platform @@ -1201,7 +1202,7 @@ mod tests { ) .expect("expected to process state transition"); - assert_eq!(processing_result.aggregated_fees().processing_fee, 2978520); + assert_eq!(processing_result.aggregated_fees().processing_fee, 2985330); platform .drive @@ -1250,6 +1251,7 @@ mod tests { }, keep_history_chance: 0.0, documents_mutable_chance: 0.0, + documents_can_be_deleted_chance: 0.0, }; let mut rng = StdRng::seed_from_u64(6); @@ -1320,7 +1322,7 @@ mod tests { // We have one invalid paid for state transition assert_eq!(processing_result.invalid_paid_count(), 1); - assert_eq!(processing_result.aggregated_fees().processing_fee, 1231120); + assert_eq!(processing_result.aggregated_fees().processing_fee, 1231130); let check_result = platform .check_tx( diff --git a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs index 20a540e4f3..d3f23b70eb 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs @@ -317,8 +317,8 @@ mod tests { assert_eq!( root_hash, [ - 123, 106, 97, 8, 95, 223, 24, 44, 147, 229, 106, 103, 31, 32, 29, 97, 198, 204, - 237, 215, 138, 194, 34, 107, 129, 234, 97, 250, 155, 104, 75, 210 + 162, 81, 50, 217, 246, 11, 77, 233, 231, 192, 228, 176, 197, 102, 24, 18, 160, + 5, 182, 75, 119, 174, 75, 155, 86, 92, 88, 197, 201, 60, 60, 157 ] ) } diff --git a/packages/rs-drive-abci/src/execution/types/execution_event/mod.rs b/packages/rs-drive-abci/src/execution/types/execution_event/mod.rs index 4caa4413db..a5b011522b 100644 --- a/packages/rs-drive-abci/src/execution/types/execution_event/mod.rs +++ b/packages/rs-drive-abci/src/execution/types/execution_event/mod.rs @@ -155,6 +155,25 @@ impl<'a> ExecutionEvent<'a> { ))) } } + StateTransitionAction::DocumentsBatchAction(document_batch_action) => { + let user_fee_increase = action.user_fee_increase(); + let removed_balance = document_batch_action.all_purchases_amount(); + let operations = + action.into_high_level_drive_operations(epoch, platform_version)?; + if let Some(identity) = identity { + Ok(ExecutionEvent::Paid { + identity, + removed_balance, + operations, + execution_operations: execution_context.operations_consume(), + user_fee_increase, + }) + } else { + Err(Error::Execution(ExecutionError::CorruptedCodeExecution( + "partial identity should be present for other state transitions", + ))) + } + } _ => { let user_fee_increase = action.user_fee_increase(); let operations = diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_simple_pre_check_balance/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_simple_pre_check_balance/v0/mod.rs index 99ad4d4795..07c2895c25 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_simple_pre_check_balance/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_simple_pre_check_balance/v0/mod.rs @@ -37,7 +37,7 @@ impl ValidateSimplePreCheckBalanceV0 for StateTransition { platform_version .fee_version .state_transition_min_fees - .document_batch_transition + .document_batch_sub_transition } StateTransition::IdentityCreate(_) | StateTransition::IdentityTopUp(_) => 0, StateTransition::IdentityCreditWithdrawal(_) => { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs index 3a6acb90d0..2b98dd8b1c 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs @@ -549,9 +549,11 @@ impl StateTransitionBalanceValidationV0 for StateTransition { StateTransition::IdentityCreditWithdrawal(st) => { st.validate_minimum_balance_pre_check(identity, platform_version) } + StateTransition::DocumentsBatch(st) => { + st.validate_minimum_balance_pre_check(identity, platform_version) + } StateTransition::DataContractCreate(_) | StateTransition::DataContractUpdate(_) - | StateTransition::DocumentsBatch(_) | StateTransition::IdentityUpdate(_) => { self.validate_simple_pre_check_minimum_balance(identity, platform_version) } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs index ae9be56b21..4215a4ce69 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs @@ -57,19 +57,95 @@ mod tests { use crate::rpc::core::MockCoreRPCLike; use crate::test::helpers::setup::{TempPlatform, TestPlatformBuilder}; use dpp::block::block_info::BlockInfo; + use dpp::dash_to_credits; + use dpp::data_contract::accessors::v0::DataContractV0Setters; + use rand::prelude::StdRng; + use rand::SeedableRng; + use std::collections::BTreeMap; use dpp::data_contract::DataContract; + use dpp::fee::Credits; + use dpp::identifier::Identifier; + use dpp::identity::accessors::IdentityGettersV0; + use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; + use dpp::identity::{Identity, IdentityPublicKey, IdentityV0}; use dpp::platform_value::BinaryData; - use dpp::state_transition::data_contract_update_transition::DataContractUpdateTransitionV0; + use dpp::serialization::PlatformSerializable; + use dpp::state_transition::data_contract_update_transition::methods::DataContractUpdateTransitionMethodsV0; + use dpp::state_transition::data_contract_update_transition::{ + DataContractUpdateTransition, DataContractUpdateTransitionV0, + }; + use crate::platform_types::state_transitions_processing_result::StateTransitionExecutionResult; use dpp::tests::fixtures::get_data_contract_fixture; + use dpp::tests::json_document::json_document_to_contract; use dpp::version::PlatformVersion; + use drive::drive::flags::StorageFlags; + use simple_signer::signer::SimpleSigner; struct TestData { data_contract: DataContract, platform: TempPlatform, } + fn setup_identity( + platform: &mut TempPlatform, + seed: u64, + credits: Credits, + ) -> (Identity, SimpleSigner, IdentityPublicKey) { + let platform_version = PlatformVersion::latest(); + let mut signer = SimpleSigner::default(); + + let mut rng = StdRng::seed_from_u64(seed); + + let (master_key, master_private_key) = + IdentityPublicKey::random_ecdsa_master_authentication_key_with_rng( + 0, + &mut rng, + platform_version, + ) + .expect("expected to get key pair"); + + signer.add_key(master_key.clone(), master_private_key.clone()); + + let (critical_public_key, private_key) = + IdentityPublicKey::random_ecdsa_critical_level_authentication_key_with_rng( + 1, + &mut rng, + platform_version, + ) + .expect("expected to get key pair"); + + signer.add_key(critical_public_key.clone(), private_key.clone()); + + let identity: Identity = IdentityV0 { + id: Identifier::random_with_rng(&mut rng), + public_keys: BTreeMap::from([ + (0, master_key.clone()), + (1, critical_public_key.clone()), + ]), + balance: credits, + revision: 0, + } + .into(); + + // We just add this identity to the system first + + platform + .drive + .add_new_identity( + identity.clone(), + false, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to add a new identity"); + + (identity, signer, critical_public_key) + } + fn apply_contract( platform: &TempPlatform, data_contract: &DataContract, @@ -484,4 +560,99 @@ mod tests { ); } } + + #[test] + fn test_data_contract_update_changing_various_document_type_options() { + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure(); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); + + let card_game_path = "tests/supporting_files/contract/crypto-card-game/crypto-card-game-direct-purchase-creation-restricted-to-owner.json"; + + let platform_version = platform + .state + .load() + .current_platform_version() + .expect("expected to get current platform version"); + + // let's construct the grovedb structure for the card game data contract + let mut contract = json_document_to_contract(card_game_path, true, platform_version) + .expect("expected to get data contract"); + + contract.set_owner_id(identity.id()); + + platform + .drive + .apply_contract( + &contract, + BlockInfo::default(), + true, + StorageFlags::optional_default_as_cow(), + None, + platform_version, + ) + .expect("expected to apply contract successfully"); + + let updated_card_game_path = "tests/supporting_files/contract/crypto-card-game/crypto-card-game-direct-purchase.json"; + + // let's construct the grovedb structure for the card game data contract + let mut contract_not_restricted_to_owner = + json_document_to_contract(updated_card_game_path, true, platform_version) + .expect("expected to get data contract"); + + contract_not_restricted_to_owner.set_owner_id(identity.id()); + + contract_not_restricted_to_owner.set_version(2); + + let data_contract_update_transition = DataContractUpdateTransition::new_from_data_contract( + contract_not_restricted_to_owner, + &identity.into_partial_identity_info(), + key.id(), + 2, + 0, + &signer, + platform_version, + None, + ) + .expect("expect to create documents batch transition"); + + let data_contract_update_serialized_transition = data_contract_update_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![data_contract_update_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + // There is no issue because the creator of the contract made the document + + assert_eq!(processing_result.invalid_paid_count(), 1); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let result = processing_result.into_execution_results().remove(0); + + let StateTransitionExecutionResult::PaidConsensusError(consensus_error, _) = result else { + panic!("expected a paid consensus error"); + }; + assert_eq!(consensus_error.to_string(), "Data Contract updated schema is not backward compatible with one defined in Data Contract with id 86LHvdC1Tqx5P97LQUSibGFqf2vnKFpB6VkqQ7oso86e. Field: '/creationRestrictionMode', Operation: 'remove'"); + } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/v0/mod.rs index eacae1bdd3..8eb2695276 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/v0/mod.rs @@ -173,6 +173,7 @@ impl DataContractUpdateStateTransitionStateValidationV0 for DataContractUpdateTr // - Keeps history did not change // - Can be deleted did not change // - Documents keep history did not change + // - Documents can be deleted contract default did not change // - Documents mutable contract default did not change // - Requires identity encryption bounded key did not change // - Requires identity decryption bounded key did not change diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/mod.rs index 713d82c129..2d5e116aa8 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/mod.rs @@ -17,6 +17,7 @@ mod structure_v0; pub trait DocumentCreateTransitionActionValidation { fn validate_structure( &self, + owner_id: Identifier, platform_version: &PlatformVersion, ) -> Result; @@ -34,6 +35,7 @@ pub trait DocumentCreateTransitionActionValidation { impl DocumentCreateTransitionActionValidation for DocumentCreateTransitionAction { fn validate_structure( &self, + owner_id: Identifier, platform_version: &PlatformVersion, ) -> Result { match platform_version @@ -43,7 +45,7 @@ impl DocumentCreateTransitionActionValidation for DocumentCreateTransitionAction .documents_batch_state_transition .document_create_transition_structure_validation { - 0 => self.validate_structure_v0(platform_version), + 0 => self.validate_structure_v0(owner_id, platform_version), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "DocumentCreateTransitionAction::validate_structure".to_string(), known_versions: vec![0], diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/state_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/state_v0/mod.rs index f266d18c76..aff96c0337 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/state_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/state_v0/mod.rs @@ -4,6 +4,7 @@ use dpp::consensus::ConsensusError; use dpp::consensus::state::document::document_already_present_error::DocumentAlreadyPresentError; use dpp::consensus::state::state_error::StateError; use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::prelude::{ConsensusValidationResult, Identifier}; use dpp::validation::SimpleConsensusValidationResult; use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; @@ -70,16 +71,21 @@ impl DocumentCreateTransitionActionStateValidationV0 for DocumentCreateTransitio // we also need to validate that the new document wouldn't conflict with any other document // this means for example having overlapping unique indexes - platform - .drive - .validate_document_create_transition_action_uniqueness( - contract, - document_type, - self, - owner_id, - transaction, - platform_version, - ) - .map_err(Error::Drive) + + if document_type.indices().iter().any(|index| index.unique) { + platform + .drive + .validate_document_create_transition_action_uniqueness( + contract, + document_type, + self, + owner_id, + transaction, + platform_version, + ) + .map_err(Error::Drive) + } else { + Ok(SimpleConsensusValidationResult::new()) + } } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/structure_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/structure_v0/mod.rs index bda10d4b2c..3ddc152f08 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/structure_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/structure_v0/mod.rs @@ -1,6 +1,9 @@ -use dpp::consensus::basic::document::InvalidDocumentTypeError; +use dpp::consensus::basic::document::{DocumentCreationNotAllowedError, InvalidDocumentTypeError}; use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; +use dpp::data_contract::document_type::restricted_creation::CreationRestrictionMode; use dpp::data_contract::validation::DataContractValidationMethodsV0; +use dpp::identifier::Identifier; use dpp::validation::{SimpleConsensusValidationResult}; use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; use drive::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::{DocumentCreateTransitionAction, DocumentCreateTransitionActionAccessorsV0}; @@ -10,12 +13,14 @@ use crate::error::Error; pub(super) trait DocumentCreateTransitionActionStructureValidationV0 { fn validate_structure_v0( &self, + owner_id: Identifier, platform_version: &PlatformVersion, ) -> Result; } impl DocumentCreateTransitionActionStructureValidationV0 for DocumentCreateTransitionAction { fn validate_structure_v0( &self, + owner_id: Identifier, platform_version: &PlatformVersion, ) -> Result { let contract_fetch_info = self.base().data_contract_fetch_info(); @@ -23,16 +28,40 @@ impl DocumentCreateTransitionActionStructureValidationV0 for DocumentCreateTrans // Make sure that the document type is defined in the contract let document_type_name = self.base().document_type_name(); - if data_contract - .document_type_optional_for_name(document_type_name) - .is_none() - { + let Some(document_type) = data_contract.document_type_optional_for_name(document_type_name) + else { return Ok(SimpleConsensusValidationResult::new_with_error( InvalidDocumentTypeError::new(document_type_name.clone(), data_contract.id()) .into(), )); }; + match document_type.creation_restriction_mode() { + CreationRestrictionMode::NoRestrictions => {} + CreationRestrictionMode::OwnerOnly => { + if owner_id != data_contract.owner_id() { + return Ok(SimpleConsensusValidationResult::new_with_error( + DocumentCreationNotAllowedError::new( + self.base().data_contract_id(), + document_type_name.clone(), + document_type.creation_restriction_mode(), + ) + .into(), + )); + } + } + CreationRestrictionMode::NoCreationAllowed => { + return Ok(SimpleConsensusValidationResult::new_with_error( + DocumentCreationNotAllowedError::new( + self.base().data_contract_id(), + document_type_name.clone(), + document_type.creation_restriction_mode(), + ) + .into(), + )); + } + } + // Validate user defined properties data_contract diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_delete_transition_action/structure_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_delete_transition_action/structure_v0/mod.rs index d0891ffe9b..3813405201 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_delete_transition_action/structure_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_delete_transition_action/structure_v0/mod.rs @@ -26,10 +26,10 @@ impl DocumentDeleteTransitionActionStructureValidationV0 for DocumentDeleteTrans )); }; - if !document_type.documents_mutable() { + if !document_type.documents_can_be_deleted() { Ok(SimpleConsensusValidationResult::new_with_error( InvalidDocumentTransitionActionError::new(format!( - "{} is not mutable and can not be deleted", + "documents of type {} can not be deleted", document_type_name )) .into(), diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_purchase_transition_action/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_purchase_transition_action/mod.rs new file mode 100644 index 0000000000..c72f4ea28d --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_purchase_transition_action/mod.rs @@ -0,0 +1,87 @@ +use dpp::block::epoch::Epoch; +use dpp::identifier::Identifier; + +use dpp::validation::SimpleConsensusValidationResult; +use drive::state_transition_action::document::documents_batch::document_transition::document_purchase_transition_action::DocumentPurchaseTransitionAction; +use dpp::version::PlatformVersion; +use drive::grovedb::TransactionArg; +use crate::error::Error; +use crate::error::execution::ExecutionError; +use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; +use crate::execution::validation::state_transition::documents_batch::action_validation::document_purchase_transition_action::state_v0::DocumentPurchaseTransitionActionStateValidationV0; +use crate::execution::validation::state_transition::documents_batch::action_validation::document_purchase_transition_action::structure_v0::DocumentPurchaseTransitionActionStructureValidationV0; +use crate::platform_types::platform::PlatformStateRef; + +mod state_v0; +mod structure_v0; + +pub trait DocumentPurchaseTransitionActionValidation { + fn validate_structure( + &self, + platform_version: &PlatformVersion, + ) -> Result; + + fn validate_state( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + epoch: &Epoch, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result; +} + +impl DocumentPurchaseTransitionActionValidation for DocumentPurchaseTransitionAction { + fn validate_structure( + &self, + platform_version: &PlatformVersion, + ) -> Result { + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .documents_batch_state_transition + .document_purchase_transition_structure_validation + { + 0 => self.validate_structure_v0(platform_version), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "DocumentPurchaseTransitionAction::validate_structure".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + fn validate_state( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + epoch: &Epoch, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result { + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .documents_batch_state_transition + .document_purchase_transition_state_validation + { + 0 => self.validate_state_v0( + platform, + owner_id, + epoch, + execution_context, + transaction, + platform_version, + ), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "DocumentPurchaseTransitionAction::validate_state".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_purchase_transition_action/state_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_purchase_transition_action/state_v0/mod.rs new file mode 100644 index 0000000000..e4a59552eb --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_purchase_transition_action/state_v0/mod.rs @@ -0,0 +1,70 @@ +use dpp::block::epoch::Epoch; +use dpp::consensus::basic::document::InvalidDocumentTypeError; +use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; +use dpp::identifier::Identifier; +use dpp::validation::SimpleConsensusValidationResult; +use drive::state_transition_action::document::documents_batch::document_transition::document_purchase_transition_action::{DocumentPurchaseTransitionAction, DocumentPurchaseTransitionActionAccessorsV0}; +use dpp::version::PlatformVersion; +use drive::grovedb::TransactionArg; +use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use crate::error::Error; +use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; +use crate::platform_types::platform::PlatformStateRef; + +pub(super) trait DocumentPurchaseTransitionActionStateValidationV0 { + fn validate_state_v0( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + epoch: &Epoch, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result; +} +impl DocumentPurchaseTransitionActionStateValidationV0 for DocumentPurchaseTransitionAction { + fn validate_state_v0( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + _epoch: &Epoch, + _execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result { + let contract_fetch_info = self.base().data_contract_fetch_info(); + + let contract = &contract_fetch_info.contract; + + let document_type_name = self.base().document_type_name(); + + let Some(document_type) = contract.document_type_optional_for_name(document_type_name) + else { + return Ok(SimpleConsensusValidationResult::new_with_error( + InvalidDocumentTypeError::new(document_type_name.clone(), contract.id()).into(), + )); + }; + + // There is no need to verify that the document already existed, since this is done when + // transforming into an action + + // We need to verify that the resultant document doesn't violate any unique properties + + if document_type.indices().iter().any(|index| index.unique) { + platform + .drive + .validate_document_purchase_transition_action_uniqueness( + contract, + document_type, + self, + owner_id, + transaction, + platform_version, + ) + .map_err(Error::Drive) + } else { + Ok(SimpleConsensusValidationResult::new()) + } + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_purchase_transition_action/structure_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_purchase_transition_action/structure_v0/mod.rs new file mode 100644 index 0000000000..afbe3ae28b --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_purchase_transition_action/structure_v0/mod.rs @@ -0,0 +1,61 @@ +use dpp::consensus::basic::document::{InvalidDocumentTransitionActionError, InvalidDocumentTypeError}; +use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; +use dpp::document::DocumentV0Getters; +use dpp::nft::TradeMode; +use dpp::validation::SimpleConsensusValidationResult; +use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use drive::state_transition_action::document::documents_batch::document_transition::document_purchase_transition_action::{DocumentPurchaseTransitionAction, DocumentPurchaseTransitionActionAccessorsV0}; +use dpp::version::PlatformVersion; +use crate::error::Error; + +pub(super) trait DocumentPurchaseTransitionActionStructureValidationV0 { + fn validate_structure_v0( + &self, + platform_version: &PlatformVersion, + ) -> Result; +} +impl DocumentPurchaseTransitionActionStructureValidationV0 for DocumentPurchaseTransitionAction { + fn validate_structure_v0( + &self, + _platform_version: &PlatformVersion, + ) -> Result { + let contract_fetch_info = self.base().data_contract_fetch_info(); + let data_contract = &contract_fetch_info.contract; + let document_type_name = self.base().document_type_name(); + + // Make sure that the document type is defined in the contract + let Some(document_type) = data_contract.document_type_optional_for_name(document_type_name) + else { + return Ok(SimpleConsensusValidationResult::new_with_error( + InvalidDocumentTypeError::new(document_type_name.clone(), data_contract.id()) + .into(), + )); + }; + + // We can not purchase from ourselves + // The document owner id is already our owner id, as the action we want to take is to + // insert this document into the state (with our owner id) + if self.original_owner_id() == self.document().owner_id() { + return Ok(SimpleConsensusValidationResult::new_with_error( + InvalidDocumentTransitionActionError::new(format!( + "on document type: {} identity trying to purchase a document that is already owned by the purchaser", + document_type_name + )) + .into(), + )); + } + + if document_type.trade_mode() != TradeMode::DirectPurchase { + Ok(SimpleConsensusValidationResult::new_with_error( + InvalidDocumentTransitionActionError::new(format!( + "{} trade mode is not direct purchase but we are trying to purchase directly", + document_type_name + )) + .into(), + )) + } else { + Ok(SimpleConsensusValidationResult::default()) + } + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/state_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/state_v0/mod.rs index 1329b35eae..ea9e1529e8 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/state_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/state_v0/mod.rs @@ -1,6 +1,7 @@ use dpp::block::epoch::Epoch; use dpp::consensus::basic::document::InvalidDocumentTypeError; use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::identifier::Identifier; use dpp::validation::SimpleConsensusValidationResult; use drive::state_transition_action::document::documents_batch::document_transition::document_replace_transition_action::{DocumentReplaceTransitionAction, DocumentReplaceTransitionActionAccessorsV0}; @@ -48,19 +49,20 @@ impl DocumentReplaceTransitionActionStateValidationV0 for DocumentReplaceTransit // There is no need to verify that the document already existed, since this is done when // transforming into an action - // The rest of state validation is actually happening in documents batch transition transformer - // TODO: Think more about this architecture - - platform - .drive - .validate_document_replace_transition_action_uniqueness( - contract, - document_type, - self, - owner_id, - transaction, - platform_version, - ) - .map_err(Error::Drive) + if document_type.indices().iter().any(|index| index.unique) { + platform + .drive + .validate_document_replace_transition_action_uniqueness( + contract, + document_type, + self, + owner_id, + transaction, + platform_version, + ) + .map_err(Error::Drive) + } else { + Ok(SimpleConsensusValidationResult::new()) + } } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/state_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/state_v0/mod.rs index 2eaada0c4f..7e1e64bab4 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/state_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/state_v0/mod.rs @@ -1,6 +1,7 @@ use dpp::block::epoch::Epoch; use dpp::consensus::basic::document::InvalidDocumentTypeError; use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::identifier::Identifier; use dpp::validation::SimpleConsensusValidationResult; use drive::state_transition_action::document::documents_batch::document_transition::document_transfer_transition_action::{DocumentTransferTransitionAction, DocumentTransferTransitionActionAccessorsV0}; @@ -48,19 +49,20 @@ impl DocumentTransferTransitionActionStateValidationV0 for DocumentTransferTrans // There is no need to verify that the document already existed, since this is done when // transforming into an action - // The rest of state validation is actually happening in documents batch transition transformer - // TODO: Think more about this architecture - - platform - .drive - .validate_document_transfer_transition_action_uniqueness( - contract, - document_type, - self, - owner_id, - transaction, - platform_version, - ) - .map_err(Error::Drive) + if document_type.indices().iter().any(|index| index.unique) { + platform + .drive + .validate_document_transfer_transition_action_uniqueness( + contract, + document_type, + self, + owner_id, + transaction, + platform_version, + ) + .map_err(Error::Drive) + } else { + Ok(SimpleConsensusValidationResult::new()) + } } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_update_price_transition_action/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_update_price_transition_action/mod.rs new file mode 100644 index 0000000000..18876a8fe8 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_update_price_transition_action/mod.rs @@ -0,0 +1,87 @@ +use dpp::block::epoch::Epoch; +use dpp::identifier::Identifier; + +use dpp::validation::SimpleConsensusValidationResult; +use dpp::version::PlatformVersion; +use drive::grovedb::TransactionArg; +use drive::state_transition_action::document::documents_batch::document_transition::document_update_price_transition_action::DocumentUpdatePriceTransitionAction; +use crate::error::Error; +use crate::error::execution::ExecutionError; +use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; +use crate::execution::validation::state_transition::documents_batch::action_validation::document_update_price_transition_action::state_v0::DocumentUpdatePriceTransitionActionStateValidationV0; +use crate::execution::validation::state_transition::documents_batch::action_validation::document_update_price_transition_action::structure_v0::DocumentUpdatePriceTransitionActionStructureValidationV0; +use crate::platform_types::platform::PlatformStateRef; + +mod state_v0; +mod structure_v0; + +pub trait DocumentUpdatePriceTransitionActionValidation { + fn validate_structure( + &self, + platform_version: &PlatformVersion, + ) -> Result; + + fn validate_state( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + epoch: &Epoch, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result; +} + +impl DocumentUpdatePriceTransitionActionValidation for DocumentUpdatePriceTransitionAction { + fn validate_structure( + &self, + platform_version: &PlatformVersion, + ) -> Result { + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .documents_batch_state_transition + .document_transfer_transition_structure_validation + { + 0 => self.validate_structure_v0(platform_version), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "DocumentUpdatePriceTransitionAction::validate_structure".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + fn validate_state( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + epoch: &Epoch, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result { + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .documents_batch_state_transition + .document_transfer_transition_state_validation + { + 0 => self.validate_state_v0( + platform, + owner_id, + epoch, + execution_context, + transaction, + platform_version, + ), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "DocumentUpdatePriceTransitionAction::validate_state".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_update_price_transition_action/state_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_update_price_transition_action/state_v0/mod.rs new file mode 100644 index 0000000000..4f622331b5 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_update_price_transition_action/state_v0/mod.rs @@ -0,0 +1,68 @@ +use dpp::block::epoch::Epoch; +use dpp::consensus::basic::document::InvalidDocumentTypeError; +use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; +use dpp::identifier::Identifier; +use dpp::validation::SimpleConsensusValidationResult; +use drive::state_transition_action::document::documents_batch::document_transition::document_update_price_transition_action::{DocumentUpdatePriceTransitionAction, DocumentUpdatePriceTransitionActionAccessorsV0}; +use dpp::version::PlatformVersion; +use drive::grovedb::TransactionArg; +use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use crate::error::Error; +use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; +use crate::platform_types::platform::PlatformStateRef; + +pub(super) trait DocumentUpdatePriceTransitionActionStateValidationV0 { + fn validate_state_v0( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + epoch: &Epoch, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result; +} +impl DocumentUpdatePriceTransitionActionStateValidationV0 for DocumentUpdatePriceTransitionAction { + fn validate_state_v0( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + _epoch: &Epoch, + _execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result { + let contract_fetch_info = self.base().data_contract_fetch_info(); + + let contract = &contract_fetch_info.contract; + + let document_type_name = self.base().document_type_name(); + + let Some(document_type) = contract.document_type_optional_for_name(document_type_name) + else { + return Ok(SimpleConsensusValidationResult::new_with_error( + InvalidDocumentTypeError::new(document_type_name.clone(), contract.id()).into(), + )); + }; + + // There is no need to verify that the document already existed, since this is done when + // transforming into an action + + if document_type.indices().iter().any(|index| index.unique) { + platform + .drive + .validate_document_update_price_transition_action_uniqueness( + contract, + document_type, + self, + owner_id, + transaction, + platform_version, + ) + .map_err(Error::Drive) + } else { + Ok(SimpleConsensusValidationResult::new()) + } + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_update_price_transition_action/structure_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_update_price_transition_action/structure_v0/mod.rs new file mode 100644 index 0000000000..f8b66fe374 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_update_price_transition_action/structure_v0/mod.rs @@ -0,0 +1,49 @@ +use dpp::consensus::basic::document::{InvalidDocumentTransitionActionError, InvalidDocumentTypeError}; +use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; +use dpp::validation::SimpleConsensusValidationResult; +use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use drive::state_transition_action::document::documents_batch::document_transition::document_update_price_transition_action::{DocumentUpdatePriceTransitionAction, DocumentUpdatePriceTransitionActionAccessorsV0}; +use dpp::version::PlatformVersion; +use crate::error::Error; + +pub(super) trait DocumentUpdatePriceTransitionActionStructureValidationV0 { + fn validate_structure_v0( + &self, + platform_version: &PlatformVersion, + ) -> Result; +} +impl DocumentUpdatePriceTransitionActionStructureValidationV0 + for DocumentUpdatePriceTransitionAction +{ + fn validate_structure_v0( + &self, + _platform_version: &PlatformVersion, + ) -> Result { + let contract_fetch_info = self.base().data_contract_fetch_info(); + let data_contract = &contract_fetch_info.contract; + let document_type_name = self.base().document_type_name(); + + // Make sure that the document type is defined in the contract + let Some(document_type) = data_contract.document_type_optional_for_name(document_type_name) + else { + return Ok(SimpleConsensusValidationResult::new_with_error( + InvalidDocumentTypeError::new(document_type_name.clone(), data_contract.id()) + .into(), + )); + }; + + if !document_type.trade_mode().seller_sets_price() { + Ok(SimpleConsensusValidationResult::new_with_error( + InvalidDocumentTransitionActionError::new(format!( + "{} is in trade mode {} that does not support the seller setting the price", + document_type_name, + document_type.trade_mode(), + )) + .into(), + )) + } else { + Ok(SimpleConsensusValidationResult::default()) + } + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/mod.rs index 152a761298..32c28c43fa 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/mod.rs @@ -1,4 +1,6 @@ pub(crate) mod document_create_transition_action; pub(crate) mod document_delete_transition_action; +pub(crate) mod document_purchase_transition_action; pub(crate) mod document_replace_transition_action; pub(crate) mod document_transfer_transition_action; +pub(crate) mod document_update_price_transition_action; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/v0/mod.rs index 1e0163bfd4..6c9f7b93b4 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/v0/mod.rs @@ -28,7 +28,9 @@ use drive::state_transition_action::system::bump_identity_data_contract_nonce_ac use crate::error::execution::ExecutionError; use crate::execution::types::execution_operation::ValidationOperation; use crate::execution::types::state_transition_execution_context::{StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0}; +use crate::execution::validation::state_transition::documents_batch::action_validation::document_purchase_transition_action::DocumentPurchaseTransitionActionValidation; use crate::execution::validation::state_transition::documents_batch::action_validation::document_transfer_transition_action::DocumentTransferTransitionActionValidation; +use crate::execution::validation::state_transition::documents_batch::action_validation::document_update_price_transition_action::DocumentUpdatePriceTransitionActionValidation; pub(in crate::execution::validation::state_transition::state_transitions::documents_batch) trait DocumentsBatchStateTransitionStructureValidationV0 { @@ -117,7 +119,7 @@ impl DocumentsBatchStateTransitionStructureValidationV0 for DocumentsBatchTransi for transition in action.transitions() { match transition { DocumentTransitionAction::CreateAction(create_action) => { - let result = create_action.validate_structure(platform_version)?; + let result = create_action.validate_structure(identity.id, platform_version)?; if !result.is_valid() { let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( BumpIdentityDataContractNonceAction::from_borrowed_document_base_transition_action(transition.base().expect("there is always a base for the create action"), self.owner_id(), self.user_fee_increase()), @@ -168,6 +170,32 @@ impl DocumentsBatchStateTransitionStructureValidationV0 for DocumentsBatchTransi )); } } + DocumentTransitionAction::UpdatePriceAction(update_price_action) => { + let result = update_price_action.validate_structure(platform_version)?; + if !result.is_valid() { + let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( + BumpIdentityDataContractNonceAction::from_borrowed_document_base_transition_action(transition.base().expect("there is always a base for the update price action"), self.owner_id(), self.user_fee_increase()), + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + result.errors, + )); + } + } + DocumentTransitionAction::PurchaseAction(purchase_action) => { + let result = purchase_action.validate_structure(platform_version)?; + if !result.is_valid() { + let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( + BumpIdentityDataContractNonceAction::from_borrowed_document_base_transition_action(transition.base().expect("there is always a base for the purchase action"), self.owner_id(), self.user_fee_increase()), + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + result.errors, + )); + } + } DocumentTransitionAction::BumpIdentityDataContractNonce(_) => { return Err(Error::Execution(ExecutionError::CorruptedCodeExecution( "we should not have a bump identity contract nonce at this stage", diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/balance/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/balance/mod.rs new file mode 100644 index 0000000000..4ca24ddc1c --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/balance/mod.rs @@ -0,0 +1,33 @@ +use crate::error::execution::ExecutionError; +use crate::error::Error; +use crate::execution::validation::state_transition::documents_batch::balance::v0::DocumentsBatchTransitionBalanceValidationV0; +use crate::execution::validation::state_transition::processor::v0::StateTransitionBalanceValidationV0; +use dpp::identity::PartialIdentity; +use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; +use dpp::validation::SimpleConsensusValidationResult; +use dpp::version::PlatformVersion; + +pub(crate) mod v0; +impl StateTransitionBalanceValidationV0 for DocumentsBatchTransition { + fn validate_minimum_balance_pre_check( + &self, + identity: &PartialIdentity, + platform_version: &PlatformVersion, + ) -> Result { + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .documents_batch_state_transition + .balance_pre_check + { + 0 => self.validate_advanced_minimum_balance_pre_check_v0(identity, platform_version), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "documents batch transition: validate_minimum_balance_pre_check" + .to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/balance/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/balance/v0/mod.rs new file mode 100644 index 0000000000..a46b1aad9b --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/balance/v0/mod.rs @@ -0,0 +1,54 @@ +use crate::error::Error; +use dpp::consensus::state::identity::IdentityInsufficientBalanceError; +use dpp::identity::PartialIdentity; +use dpp::state_transition::documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; +use dpp::state_transition::documents_batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; +use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; + +use dpp::validation::SimpleConsensusValidationResult; + +use crate::error::execution::ExecutionError; +use dpp::version::PlatformVersion; + +pub(in crate::execution::validation::state_transition::state_transitions) trait DocumentsBatchTransitionBalanceValidationV0 +{ + fn validate_advanced_minimum_balance_pre_check_v0( + &self, + identity: &PartialIdentity, + platform_version: &PlatformVersion, + ) -> Result; +} + +impl DocumentsBatchTransitionBalanceValidationV0 for DocumentsBatchTransition { + fn validate_advanced_minimum_balance_pre_check_v0( + &self, + identity: &PartialIdentity, + platform_version: &PlatformVersion, + ) -> Result { + let balance = + identity + .balance + .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( + "expected to have a balance on identity for documents batch transition", + )))?; + + let purchases_amount = self.all_purchases_amount().unwrap_or_default(); + + let base_fees = platform_version.fee_version.state_transition_min_fees.document_batch_sub_transition.checked_mul(self.transitions().len() as u64).ok_or(Error::Execution(ExecutionError::Overflow("overflow when multiplying base fee and amount of sub transitions in documents batch transition")))?; + + // This is just the needed balance to pass this validation step, most likely the actual fees are smaller + let needed_balance = purchases_amount + .checked_add(base_fees) + .ok_or(Error::Execution(ExecutionError::Overflow( + "overflow when adding all purchases amount and base fees in documents batch transition", + )))?; + + if balance < needed_balance { + return Ok(SimpleConsensusValidationResult::new_with_error( + IdentityInsufficientBalanceError::new(identity.id, balance, needed_balance).into(), + )); + } + + Ok(SimpleConsensusValidationResult::new()) + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/bindings/list/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/bindings/list/v0/mod.rs index c96ec40cdf..05ede54a77 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/bindings/list/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/bindings/list/v0/mod.rs @@ -62,18 +62,6 @@ pub(super) fn data_trigger_bindings_list_v0() -> Result, seed: u64, + credits: Credits, ) -> (Identity, SimpleSigner, IdentityPublicKey) { let platform_version = PlatformVersion::latest(); let mut signer = SimpleSigner::default(); @@ -295,7 +305,7 @@ mod tests { (0, master_key.clone()), (1, critical_public_key.clone()), ]), - balance: 10000000000, + balance: credits, revision: 0, } .into(); @@ -317,1699 +327,4349 @@ mod tests { (identity, signer, critical_public_key) } - #[test] - fn test_document_replace_on_document_type_that_is_mutable() { - let platform_version = PlatformVersion::latest(); - let mut platform = TestPlatformBuilder::new() - .build_with_mock_rpc() - .set_genesis_state(); + mod creation_tests { + use super::*; + use dpp::data_contract::accessors::v0::DataContractV0Setters; + use dpp::data_contract::document_type::restricted_creation::CreationRestrictionMode; - let mut rng = StdRng::seed_from_u64(433); + #[test] + fn test_document_creation() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_genesis_state(); - let platform_state = platform.state.load(); + let mut rng = StdRng::seed_from_u64(433); - let (identity, signer, key) = setup_identity(&mut platform, 958); + let platform_state = platform.state.load(); - let dashpay = platform.drive.cache.system_data_contracts.load_dashpay(); - let dashpay_contract = dashpay.clone(); + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); - let profile = dashpay_contract - .document_type_for_name("profile") - .expect("expected a profile document type"); + let dashpay = platform.drive.cache.system_data_contracts.load_dashpay(); + let dashpay_contract = dashpay.clone(); - assert!(profile.documents_mutable()); + let profile = dashpay_contract + .document_type_for_name("profile") + .expect("expected a profile document type"); - let entropy = Bytes32::random_with_rng(&mut rng); + assert!(profile.documents_mutable()); - let mut document = profile - .random_document_with_identifier_and_entropy( - &mut rng, - identity.id(), - entropy, - DocumentFieldFillType::FillIfNotRequired, - DocumentFieldFillSize::AnyDocumentFillSize, - platform_version, - ) - .expect("expected a random document"); + let entropy = Bytes32::random_with_rng(&mut rng); - document.set("avatarUrl", "http://test.com/bob.jpg".into()); + let mut document = profile + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); - let mut altered_document = document.clone(); + document.set("avatarUrl", "http://test.com/bob.jpg".into()); - altered_document.increment_revision().unwrap(); - altered_document.set("displayName", "Samuel".into()); - altered_document.set("avatarUrl", "http://test.com/cat.jpg".into()); + let mut altered_document = document.clone(); - let documents_batch_create_transition = - DocumentsBatchTransition::new_document_creation_transition_from_document( - document, - profile, - entropy.0, - &key, - 2, - 0, - &signer, - platform_version, - None, - None, - None, - ) - .expect("expect to create documents batch transition"); + altered_document.increment_revision().unwrap(); + altered_document.set("displayName", "Samuel".into()); + altered_document.set("avatarUrl", "http://test.com/cat.jpg".into()); - let documents_batch_create_serialized_transition = documents_batch_create_transition - .serialize_to_bytes() - .expect("expected documents batch serialized state transition"); + let documents_batch_create_transition = + DocumentsBatchTransition::new_document_creation_transition_from_document( + document, + profile, + entropy.0, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); - let transaction = platform.drive.grove.start_transaction(); + let documents_batch_create_serialized_transition = documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); - let processing_result = platform - .platform - .process_raw_state_transitions( - &vec![documents_batch_create_serialized_transition.clone()], - &platform_state, - &BlockInfo::default(), - &transaction, - platform_version, - ) - .expect("expected to process state transition"); + let transaction = platform.drive.grove.start_transaction(); - assert_eq!(processing_result.valid_count(), 1); + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); - platform - .drive - .grove - .commit_transaction(transaction) - .unwrap() - .expect("expected to commit transaction"); - - let documents_batch_update_transition = - DocumentsBatchTransition::new_document_replacement_transition_from_document( - altered_document, - profile, - &key, - 3, - 0, - &signer, - platform_version, - None, - None, - None, - ) - .expect("expect to create documents batch transition"); + assert_eq!(processing_result.valid_count(), 1); - let documents_batch_update_serialized_transition = documents_batch_update_transition - .serialize_to_bytes() - .expect("expected documents batch serialized state transition"); + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + } - let transaction = platform.drive.grove.start_transaction(); + #[test] + fn test_document_creation_on_restricted_document_type_that_only_allows_contract_owner_to_create( + ) { + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure(); - let processing_result = platform - .platform - .process_raw_state_transitions( - &vec![documents_batch_update_serialized_transition.clone()], - &platform_state, - &BlockInfo::default(), - &transaction, - platform_version, - ) - .expect("expected to process state transition"); + let platform_state = platform.state.load(); - platform - .drive - .grove - .commit_transaction(transaction) - .unwrap() - .expect("expected to commit transaction"); + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); - assert_eq!(processing_result.invalid_paid_count(), 0); + let (another_identity, another_identity_signer, another_identity_key) = + setup_identity(&mut platform, 450, dash_to_credits!(0.1)); - assert_eq!(processing_result.invalid_unpaid_count(), 0); + let card_game_path = "tests/supporting_files/contract/crypto-card-game/crypto-card-game-direct-purchase-creation-restricted-to-owner.json"; - assert_eq!(processing_result.valid_count(), 1); + let platform_version = platform + .state + .load() + .current_platform_version() + .expect("expected to get current platform version"); - assert_eq!(processing_result.aggregated_fees().processing_fee, 5074230); - } + // let's construct the grovedb structure for the card game data contract + let mut contract = json_document_to_contract(card_game_path, true, platform_version) + .expect("expected to get data contract"); - #[test] - fn test_document_replace_on_document_type_that_is_not_mutable() { - let platform_version = PlatformVersion::latest(); - let mut platform = TestPlatformBuilder::new() - .build_with_mock_rpc() - .set_genesis_state(); + contract.set_owner_id(identity.id()); - let mut rng = StdRng::seed_from_u64(437); + platform + .drive + .apply_contract( + &contract, + BlockInfo::default(), + true, + StorageFlags::optional_default_as_cow(), + None, + platform_version, + ) + .expect("expected to apply contract successfully"); - let platform_state = platform.state.load(); + let card_document_type = contract + .document_type_for_name("card") + .expect("expected a profile document type"); - let (identity, signer, key) = setup_identity(&mut platform, 958); + assert_eq!( + card_document_type.creation_restriction_mode(), + CreationRestrictionMode::OwnerOnly + ); - let (other_identity, ..) = setup_identity(&mut platform, 495); + let mut rng = StdRng::seed_from_u64(433); - let dashpay = platform.drive.cache.system_data_contracts.load_dashpay(); - let dashpay_contract = dashpay.clone(); + let entropy = Bytes32::random_with_rng(&mut rng); - let contact_request_document_type = dashpay_contract - .document_type_for_name("contactRequest") - .expect("expected a profile document type"); + let mut document = card_document_type + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::DoNotFillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set("attack", 4.into()); + document.set("defense", 7.into()); + + let documents_batch_create_transition = + DocumentsBatchTransition::new_document_creation_transition_from_document( + document.clone(), + card_document_type, + entropy.0, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); - assert!(!contact_request_document_type.documents_mutable()); + let documents_batch_create_serialized_transition = documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); - let entropy = Bytes32::random_with_rng(&mut rng); + let transaction = platform.drive.grove.start_transaction(); - let mut document = contact_request_document_type - .random_document_with_identifier_and_entropy( - &mut rng, - identity.id(), - entropy, - DocumentFieldFillType::FillIfNotRequired, - DocumentFieldFillSize::AnyDocumentFillSize, - platform_version, - ) - .expect("expected a random document"); - - document.set( - "toUserId", - Value::Identifier(other_identity.id().to_buffer()), - ); - document.set("recipientKeyIndex", Value::U32(1)); - document.set("senderKeyIndex", Value::U32(1)); - document.set("accountReference", Value::U32(0)); - document.set("coreHeightCreatedAt", Value::U32(5)); - - let mut altered_document = document.clone(); - - altered_document.set_revision(Some(1)); - altered_document.set("senderKeyIndex", Value::U32(2)); - - let documents_batch_create_transition = - DocumentsBatchTransition::new_document_creation_transition_from_document( - document, - contact_request_document_type, - entropy.0, - &key, - 2, - 0, - &signer, - platform_version, - None, - None, - None, - ) - .expect("expect to create documents batch transition"); + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); - let documents_batch_create_serialized_transition = documents_batch_create_transition - .serialize_to_bytes() - .expect("expected documents batch serialized state transition"); + // There is no issue because the creator of the contract made the document - let transaction = platform.drive.grove.start_transaction(); + assert_eq!(processing_result.valid_count(), 1); - let processing_result = platform - .platform - .process_raw_state_transitions( - &vec![documents_batch_create_serialized_transition.clone()], - &platform_state, - &BlockInfo::default(), - &transaction, - platform_version, - ) - .expect("expected to process state transition"); + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); - assert_eq!(processing_result.valid_count(), 1); + // Now let's try for another identity - platform - .drive - .grove - .commit_transaction(transaction) - .unwrap() - .expect("expected to commit transaction"); - - let documents_batch_update_transition = - DocumentsBatchTransition::new_document_replacement_transition_from_document( - altered_document, - contact_request_document_type, - &key, - 3, - 0, - &signer, - platform_version, - None, - None, - None, - ) - .expect("expect to create documents batch transition"); + let mut document = card_document_type + .random_document_with_identifier_and_entropy( + &mut rng, + another_identity.id(), + entropy, + DocumentFieldFillType::DoNotFillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set("attack", 8.into()); + document.set("defense", 2.into()); + + let documents_batch_create_transition = + DocumentsBatchTransition::new_document_creation_transition_from_document( + document.clone(), + card_document_type, + entropy.0, + &another_identity_key, + 2, + 0, + &another_identity_signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); - let documents_batch_update_serialized_transition = documents_batch_update_transition - .serialize_to_bytes() - .expect("expected documents batch serialized state transition"); + let documents_batch_create_serialized_transition = documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); - let transaction = platform.drive.grove.start_transaction(); + let transaction = platform.drive.grove.start_transaction(); - let processing_result = platform - .platform - .process_raw_state_transitions( - &vec![documents_batch_update_serialized_transition.clone()], - &platform_state, - &BlockInfo::default(), - &transaction, - platform_version, - ) - .expect("expected to process state transition"); + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); - platform - .drive - .grove - .commit_transaction(transaction) - .unwrap() - .expect("expected to commit transaction"); + // There is no issue because the creator of the contract made the document - assert_eq!(processing_result.invalid_paid_count(), 1); + assert_eq!(processing_result.invalid_paid_count(), 1); - assert_eq!(processing_result.invalid_unpaid_count(), 0); + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); - assert_eq!(processing_result.valid_count(), 0); + let result = processing_result.into_execution_results().remove(0); - assert_eq!(processing_result.aggregated_fees().processing_fee, 102690); + let StateTransitionExecutionResult::PaidConsensusError(consensus_error, _) = result + else { + panic!("expected a paid consensus error"); + }; + assert_eq!(consensus_error.to_string(), "Document Creation on 86LHvdC1Tqx5P97LQUSibGFqf2vnKFpB6VkqQ7oso86e:card is not allowed because of the document type's creation restriction mode Owner Only"); + } } - #[test] - fn test_document_replace_on_document_type_that_is_not_mutable_but_is_transferable() { - let platform_version = PlatformVersion::latest(); - let (mut platform, contract) = TestPlatformBuilder::new() - .build_with_mock_rpc() - .set_initial_state_structure() - .with_crypto_card_game(Transferable::Always); + mod replacement_tests { + use super::*; - let mut rng = StdRng::seed_from_u64(435); + #[test] + fn test_document_replace_on_document_type_that_is_mutable() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_genesis_state(); - let platform_state = platform.state.load(); + let mut rng = StdRng::seed_from_u64(433); - let (identity, signer, key) = setup_identity(&mut platform, 958); + let platform_state = platform.state.load(); - let (receiver, _, _) = setup_identity(&mut platform, 452); + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); - let card_document_type = contract - .document_type_for_name("card") - .expect("expected a profile document type"); + let dashpay = platform.drive.cache.system_data_contracts.load_dashpay(); + let dashpay_contract = dashpay.clone(); - let entropy = Bytes32::random_with_rng(&mut rng); + let profile = dashpay_contract + .document_type_for_name("profile") + .expect("expected a profile document type"); - let mut document = card_document_type - .random_document_with_identifier_and_entropy( - &mut rng, - identity.id(), - entropy, - DocumentFieldFillType::DoNotFillIfNotRequired, - DocumentFieldFillSize::AnyDocumentFillSize, - platform_version, - ) - .expect("expected a random document"); - - document.set("attack", 4.into()); - document.set("defense", 7.into()); - - let documents_batch_create_transition = - DocumentsBatchTransition::new_document_creation_transition_from_document( - document.clone(), - card_document_type, - entropy.0, - &key, - 2, - 0, - &signer, - platform_version, - None, - None, - None, - ) - .expect("expect to create documents batch transition"); + assert!(profile.documents_mutable()); - let documents_batch_create_serialized_transition = documents_batch_create_transition - .serialize_to_bytes() - .expect("expected documents batch serialized state transition"); + let entropy = Bytes32::random_with_rng(&mut rng); - let transaction = platform.drive.grove.start_transaction(); + let mut document = profile + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); - let processing_result = platform - .platform - .process_raw_state_transitions( - &vec![documents_batch_create_serialized_transition.clone()], - &platform_state, - &BlockInfo::default(), - &transaction, - platform_version, - ) - .expect("expected to process state transition"); + document.set("avatarUrl", "http://test.com/bob.jpg".into()); - assert_eq!(processing_result.valid_count(), 1); + let mut altered_document = document.clone(); - platform - .drive - .grove - .commit_transaction(transaction) - .unwrap() - .expect("expected to commit transaction"); - - let sender_documents_sql_string = - format!("select * from card where $ownerId == '{}'", identity.id()); - - let query_sender_identity_documents = DriveQuery::from_sql_expr( - sender_documents_sql_string.as_str(), - &contract, - Some(&platform.config.drive), - ) - .expect("expected document query"); - - let receiver_documents_sql_string = - format!("select * from card where $ownerId == '{}'", receiver.id()); - - let query_receiver_identity_documents = DriveQuery::from_sql_expr( - receiver_documents_sql_string.as_str(), - &contract, - Some(&platform.config.drive), - ) - .expect("expected document query"); - - let query_sender_results = platform - .drive - .query_documents( - query_sender_identity_documents.clone(), - None, - false, - None, - None, - ) - .expect("expected query result"); + altered_document.increment_revision().unwrap(); + altered_document.set("displayName", "Samuel".into()); + altered_document.set("avatarUrl", "http://test.com/cat.jpg".into()); - let query_receiver_results = platform - .drive - .query_documents( - query_receiver_identity_documents.clone(), - None, - false, - None, - None, - ) - .expect("expected query result"); + let documents_batch_create_transition = + DocumentsBatchTransition::new_document_creation_transition_from_document( + document, + profile, + entropy.0, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); - // We expect the sender to have 1 document, and the receiver to have none - assert_eq!(query_sender_results.documents().len(), 1); + let documents_batch_create_serialized_transition = documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); - assert_eq!(query_receiver_results.documents().len(), 0); + let transaction = platform.drive.grove.start_transaction(); - document.set_revision(Some(2)); + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.valid_count(), 1); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let documents_batch_update_transition = + DocumentsBatchTransition::new_document_replacement_transition_from_document( + altered_document, + profile, + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); - document.set("attack", 6.into()); - document.set("defense", 0.into()); + let documents_batch_update_serialized_transition = documents_batch_update_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); - let documents_batch_transfer_transition = - DocumentsBatchTransition::new_document_replacement_transition_from_document( - document, - card_document_type, - &key, - 3, - 0, - &signer, - platform_version, - None, - None, - None, - ) - .expect("expect to create documents batch transition for transfer"); + let transaction = platform.drive.grove.start_transaction(); - let documents_batch_transfer_serialized_transition = documents_batch_transfer_transition - .serialize_to_bytes() - .expect("expected documents batch serialized state transition"); + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_update_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); - let transaction = platform.drive.grove.start_transaction(); + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); - let processing_result = platform - .platform - .process_raw_state_transitions( - &vec![documents_batch_transfer_serialized_transition.clone()], - &platform_state, - &BlockInfo::default(), - &transaction, - platform_version, - ) - .expect("expected to process state transition"); + assert_eq!(processing_result.invalid_paid_count(), 0); - platform - .drive - .grove - .commit_transaction(transaction) - .unwrap() - .expect("expected to commit transaction"); + assert_eq!(processing_result.invalid_unpaid_count(), 0); - assert_eq!(processing_result.invalid_paid_count(), 1); + assert_eq!(processing_result.valid_count(), 1); - assert_eq!(processing_result.invalid_unpaid_count(), 0); + assert_eq!(processing_result.aggregated_fees().processing_fee, 5081030); + } - assert_eq!(processing_result.valid_count(), 0); + #[test] + fn test_document_replace_on_document_type_that_is_not_mutable() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_genesis_state(); - assert_eq!(processing_result.aggregated_fees().processing_fee, 1253950); + let mut rng = StdRng::seed_from_u64(437); - let query_sender_results = platform - .drive - .query_documents(query_sender_identity_documents, None, false, None, None) - .expect("expected query result"); + let platform_state = platform.state.load(); - let query_receiver_results = platform - .drive - .query_documents(query_receiver_identity_documents, None, false, None, None) - .expect("expected query result"); + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); - // We expect the sender to still have their document, and the receiver to have none - assert_eq!(query_sender_results.documents().len(), 1); + let (other_identity, ..) = setup_identity(&mut platform, 495, dash_to_credits!(0.1)); - assert_eq!(query_receiver_results.documents().len(), 0); - } + let dashpay = platform.drive.cache.system_data_contracts.load_dashpay(); + let dashpay_contract = dashpay.clone(); - #[test] - fn test_document_replace_that_does_not_yet_exist() { - let platform_version = PlatformVersion::latest(); - let mut platform = TestPlatformBuilder::new() - .build_with_mock_rpc() - .set_genesis_state(); + let contact_request_document_type = dashpay_contract + .document_type_for_name("contactRequest") + .expect("expected a profile document type"); - let mut rng = StdRng::seed_from_u64(433); + assert!(!contact_request_document_type.documents_mutable()); - let platform_state = platform.state.load(); + let entropy = Bytes32::random_with_rng(&mut rng); - let (identity, signer, key) = setup_identity(&mut platform, 958); + let mut document = contact_request_document_type + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set( + "toUserId", + Value::Identifier(other_identity.id().to_buffer()), + ); + document.set("recipientKeyIndex", Value::U32(1)); + document.set("senderKeyIndex", Value::U32(1)); + document.set("accountReference", Value::U32(0)); + document.set("coreHeightCreatedAt", Value::U32(5)); + + let mut altered_document = document.clone(); + + altered_document.set_revision(Some(1)); + altered_document.set("senderKeyIndex", Value::U32(2)); + + let documents_batch_create_transition = + DocumentsBatchTransition::new_document_creation_transition_from_document( + document, + contact_request_document_type, + entropy.0, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); - let dashpay = platform.drive.cache.system_data_contracts.load_dashpay(); - let dashpay_contract = dashpay.clone(); + let documents_batch_create_serialized_transition = documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); - let profile = dashpay_contract - .document_type_for_name("profile") - .expect("expected a profile document type"); + let transaction = platform.drive.grove.start_transaction(); - let entropy = Bytes32::random_with_rng(&mut rng); + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.valid_count(), 1); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let documents_batch_update_transition = + DocumentsBatchTransition::new_document_replacement_transition_from_document( + altered_document, + contact_request_document_type, + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); - let mut document = profile - .random_document_with_identifier_and_entropy( - &mut rng, - identity.id(), - entropy, - DocumentFieldFillType::FillIfNotRequired, - DocumentFieldFillSize::AnyDocumentFillSize, - platform_version, - ) - .expect("expected a random document"); + let documents_batch_update_serialized_transition = documents_batch_update_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); - document.set("avatarUrl", "http://test.com/bob.jpg".into()); + let transaction = platform.drive.grove.start_transaction(); - let mut altered_document = document.clone(); + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_update_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); - altered_document.increment_revision().unwrap(); - altered_document.set("displayName", "Samuel".into()); - altered_document.set("avatarUrl", "http://test.com/cat.jpg".into()); + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); - let documents_batch_update_transition = - DocumentsBatchTransition::new_document_replacement_transition_from_document( - altered_document, - profile, - &key, - 3, - 0, - &signer, - platform_version, - None, - None, - None, - ) - .expect("expect to create documents batch transition"); + assert_eq!(processing_result.invalid_paid_count(), 1); - let documents_batch_update_serialized_transition = documents_batch_update_transition - .serialize_to_bytes() - .expect("expected documents batch serialized state transition"); + assert_eq!(processing_result.invalid_unpaid_count(), 0); - let transaction = platform.drive.grove.start_transaction(); + assert_eq!(processing_result.valid_count(), 0); - let processing_result = platform - .platform - .process_raw_state_transitions( - &vec![documents_batch_update_serialized_transition.clone()], - &platform_state, - &BlockInfo::default(), - &transaction, - platform_version, - ) - .expect("expected to process state transition"); + assert_eq!(processing_result.aggregated_fees().processing_fee, 102690); + } - platform - .drive - .grove - .commit_transaction(transaction) - .unwrap() - .expect("expected to commit transaction"); + #[test] + fn test_document_replace_on_document_type_that_is_not_mutable_but_is_transferable() { + let platform_version = PlatformVersion::latest(); + let (mut platform, contract) = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure() + .with_crypto_card_game_transfer_only(Transferable::Always); - assert_eq!(processing_result.invalid_paid_count(), 1); + let mut rng = StdRng::seed_from_u64(435); - assert_eq!(processing_result.invalid_unpaid_count(), 0); + let platform_state = platform.state.load(); - assert_eq!(processing_result.valid_count(), 0); + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); - assert_eq!(processing_result.aggregated_fees().processing_fee, 1244470); - } + let (receiver, _, _) = setup_identity(&mut platform, 452, dash_to_credits!(0.1)); - #[test] - fn test_document_delete_on_document_type_that_is_mutable() { - let platform_version = PlatformVersion::latest(); - let mut platform = TestPlatformBuilder::new() - .build_with_mock_rpc() - .set_genesis_state(); + let card_document_type = contract + .document_type_for_name("card") + .expect("expected a profile document type"); + + let entropy = Bytes32::random_with_rng(&mut rng); - let mut rng = StdRng::seed_from_u64(433); + let mut document = card_document_type + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::DoNotFillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set("attack", 4.into()); + document.set("defense", 7.into()); + + let documents_batch_create_transition = + DocumentsBatchTransition::new_document_creation_transition_from_document( + document.clone(), + card_document_type, + entropy.0, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); - let platform_state = platform.state.load(); + let documents_batch_create_serialized_transition = documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); - let (identity, signer, key) = setup_identity(&mut platform, 958); + let transaction = platform.drive.grove.start_transaction(); - let dashpay = platform.drive.cache.system_data_contracts.load_dashpay(); - let dashpay_contract = dashpay.clone(); + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); - let profile = dashpay_contract - .document_type_for_name("profile") - .expect("expected a profile document type"); + assert_eq!(processing_result.valid_count(), 1); - assert!(profile.documents_mutable()); + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); - let entropy = Bytes32::random_with_rng(&mut rng); + let sender_documents_sql_string = + format!("select * from card where $ownerId == '{}'", identity.id()); - let mut document = profile - .random_document_with_identifier_and_entropy( - &mut rng, - identity.id(), - entropy, - DocumentFieldFillType::FillIfNotRequired, - DocumentFieldFillSize::AnyDocumentFillSize, - platform_version, + let query_sender_identity_documents = DriveQuery::from_sql_expr( + sender_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), ) - .expect("expected a random document"); + .expect("expected document query"); - document.set("avatarUrl", "http://test.com/bob.jpg".into()); + let receiver_documents_sql_string = + format!("select * from card where $ownerId == '{}'", receiver.id()); - let mut altered_document = document.clone(); + let query_receiver_identity_documents = DriveQuery::from_sql_expr( + receiver_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); + + let query_sender_results = platform + .drive + .query_documents( + query_sender_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + let query_receiver_results = platform + .drive + .query_documents( + query_receiver_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); - altered_document.increment_revision().unwrap(); - altered_document.set("displayName", "Samuel".into()); - altered_document.set("avatarUrl", "http://test.com/cat.jpg".into()); + // We expect the sender to have 1 document, and the receiver to have none + assert_eq!(query_sender_results.documents().len(), 1); - let documents_batch_create_transition = - DocumentsBatchTransition::new_document_creation_transition_from_document( - document, - profile, - entropy.0, - &key, - 2, - 0, - &signer, - platform_version, - None, - None, - None, - ) - .expect("expect to create documents batch transition"); + assert_eq!(query_receiver_results.documents().len(), 0); - let documents_batch_create_serialized_transition = documents_batch_create_transition - .serialize_to_bytes() - .expect("expected documents batch serialized state transition"); + document.set_revision(Some(2)); - let transaction = platform.drive.grove.start_transaction(); + document.set("attack", 6.into()); + document.set("defense", 0.into()); - let processing_result = platform - .platform - .process_raw_state_transitions( - &vec![documents_batch_create_serialized_transition.clone()], - &platform_state, - &BlockInfo::default(), - &transaction, - platform_version, - ) - .expect("expected to process state transition"); + let documents_batch_transfer_transition = + DocumentsBatchTransition::new_document_replacement_transition_from_document( + document, + card_document_type, + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition for transfer"); + + let documents_batch_transfer_serialized_transition = + documents_batch_transfer_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_transfer_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); - assert_eq!(processing_result.valid_count(), 1); + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); - platform - .drive - .grove - .commit_transaction(transaction) - .unwrap() - .expect("expected to commit transaction"); - - let documents_batch_deletion_transition = - DocumentsBatchTransition::new_document_deletion_transition_from_document( - altered_document, - profile, - &key, - 3, - 0, - &signer, - platform_version, - None, - None, - None, - ) - .expect("expect to create documents batch transition"); + assert_eq!(processing_result.invalid_paid_count(), 1); - let documents_batch_update_serialized_transition = documents_batch_deletion_transition - .serialize_to_bytes() - .expect("expected documents batch serialized state transition"); + assert_eq!(processing_result.invalid_unpaid_count(), 0); - let transaction = platform.drive.grove.start_transaction(); + assert_eq!(processing_result.valid_count(), 0); - let processing_result = platform - .platform - .process_raw_state_transitions( - &vec![documents_batch_update_serialized_transition.clone()], - &platform_state, - &BlockInfo::default(), - &transaction, - platform_version, - ) - .expect("expected to process state transition"); + assert_eq!(processing_result.aggregated_fees().processing_fee, 1253950); - platform - .drive - .grove - .commit_transaction(transaction) - .unwrap() - .expect("expected to commit transaction"); + let query_sender_results = platform + .drive + .query_documents(query_sender_identity_documents, None, false, None, None) + .expect("expected query result"); - assert_eq!(processing_result.invalid_paid_count(), 0); + let query_receiver_results = platform + .drive + .query_documents(query_receiver_identity_documents, None, false, None, None) + .expect("expected query result"); - assert_eq!(processing_result.invalid_unpaid_count(), 0); + // We expect the sender to still have their document, and the receiver to have none + assert_eq!(query_sender_results.documents().len(), 1); - assert_eq!(processing_result.valid_count(), 1); + assert_eq!(query_receiver_results.documents().len(), 0); + } - assert_eq!(processing_result.aggregated_fees().processing_fee, 5588830); - } + #[test] + fn test_document_replace_that_does_not_yet_exist() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_genesis_state(); - #[test] - fn test_document_delete_on_document_type_that_is_not_mutable() { - let platform_version = PlatformVersion::latest(); - let mut platform = TestPlatformBuilder::new() - .build_with_mock_rpc() - .set_genesis_state(); + let mut rng = StdRng::seed_from_u64(433); - let mut rng = StdRng::seed_from_u64(437); + let platform_state = platform.state.load(); - let platform_state = platform.state.load(); + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); - let (identity, signer, key) = setup_identity(&mut platform, 958); + let dashpay = platform.drive.cache.system_data_contracts.load_dashpay(); + let dashpay_contract = dashpay.clone(); - let (other_identity, ..) = setup_identity(&mut platform, 495); + let profile = dashpay_contract + .document_type_for_name("profile") + .expect("expected a profile document type"); - let dashpay = platform.drive.cache.system_data_contracts.load_dashpay(); - let dashpay_contract = dashpay.clone(); + let entropy = Bytes32::random_with_rng(&mut rng); - let contact_request_document_type = dashpay_contract - .document_type_for_name("contactRequest") - .expect("expected a profile document type"); + let mut document = profile + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); - assert!(!contact_request_document_type.documents_mutable()); + document.set("avatarUrl", "http://test.com/bob.jpg".into()); - let entropy = Bytes32::random_with_rng(&mut rng); + let mut altered_document = document.clone(); - let mut document = contact_request_document_type - .random_document_with_identifier_and_entropy( - &mut rng, - identity.id(), - entropy, - DocumentFieldFillType::FillIfNotRequired, - DocumentFieldFillSize::AnyDocumentFillSize, - platform_version, - ) - .expect("expected a random document"); - - document.set( - "toUserId", - Value::Identifier(other_identity.id().to_buffer()), - ); - document.set("recipientKeyIndex", Value::U32(1)); - document.set("senderKeyIndex", Value::U32(1)); - document.set("accountReference", Value::U32(0)); - document.set("coreHeightCreatedAt", Value::U32(5)); - - let mut altered_document = document.clone(); - - altered_document.set_revision(Some(1)); - altered_document.set("senderKeyIndex", Value::U32(2)); - - let documents_batch_create_transition = - DocumentsBatchTransition::new_document_creation_transition_from_document( - document, - contact_request_document_type, - entropy.0, - &key, - 2, - 0, - &signer, - platform_version, - None, - None, - None, - ) - .expect("expect to create documents batch transition"); + altered_document.increment_revision().unwrap(); + altered_document.set("displayName", "Samuel".into()); + altered_document.set("avatarUrl", "http://test.com/cat.jpg".into()); - let documents_batch_create_serialized_transition = documents_batch_create_transition - .serialize_to_bytes() - .expect("expected documents batch serialized state transition"); + let documents_batch_update_transition = + DocumentsBatchTransition::new_document_replacement_transition_from_document( + altered_document, + profile, + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); - let transaction = platform.drive.grove.start_transaction(); + let documents_batch_update_serialized_transition = documents_batch_update_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); - let processing_result = platform - .platform - .process_raw_state_transitions( - &vec![documents_batch_create_serialized_transition.clone()], - &platform_state, - &BlockInfo::default(), - &transaction, - platform_version, - ) - .expect("expected to process state transition"); + let transaction = platform.drive.grove.start_transaction(); - assert_eq!(processing_result.valid_count(), 1); + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_update_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); - platform - .drive - .grove - .commit_transaction(transaction) - .unwrap() - .expect("expected to commit transaction"); - - let documents_batch_deletion_transition = - DocumentsBatchTransition::new_document_deletion_transition_from_document( - altered_document, - contact_request_document_type, - &key, - 3, - 0, - &signer, - platform_version, - None, - None, - None, - ) - .expect("expect to create documents batch transition"); + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); - let documents_batch_deletion_serialized_transition = documents_batch_deletion_transition - .serialize_to_bytes() - .expect("expected documents batch serialized state transition"); + assert_eq!(processing_result.invalid_paid_count(), 1); - let transaction = platform.drive.grove.start_transaction(); + assert_eq!(processing_result.invalid_unpaid_count(), 0); - let processing_result = platform - .platform - .process_raw_state_transitions( - &vec![documents_batch_deletion_serialized_transition.clone()], - &platform_state, - &BlockInfo::default(), - &transaction, - platform_version, - ) - .expect("expected to process state transition"); + assert_eq!(processing_result.valid_count(), 0); - platform - .drive - .grove - .commit_transaction(transaction) - .unwrap() - .expect("expected to commit transaction"); + assert_eq!(processing_result.aggregated_fees().processing_fee, 1244470); + } + } - assert_eq!(processing_result.invalid_paid_count(), 1); + mod deletion_tests { + use super::*; - assert_eq!(processing_result.invalid_unpaid_count(), 0); + #[test] + fn test_document_delete_on_document_type_that_is_mutable_and_can_be_deleted() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_genesis_state(); - assert_eq!(processing_result.valid_count(), 0); + let mut rng = StdRng::seed_from_u64(433); - assert_eq!(processing_result.aggregated_fees().processing_fee, 1507670); - } + let platform_state = platform.state.load(); - #[test] - fn test_document_delete_that_does_not_yet_exist() { - let platform_version = PlatformVersion::latest(); - let mut platform = TestPlatformBuilder::new() - .build_with_mock_rpc() - .set_genesis_state(); + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); - let mut rng = StdRng::seed_from_u64(433); + let dashpay = platform.drive.cache.system_data_contracts.load_dashpay(); + let dashpay_contract = dashpay.clone(); - let platform_state = platform.state.load(); + let profile = dashpay_contract + .document_type_for_name("profile") + .expect("expected a profile document type"); - let (identity, signer, key) = setup_identity(&mut platform, 958); + assert!(profile.documents_mutable()); - let dashpay = platform.drive.cache.system_data_contracts.load_dashpay(); - let dashpay_contract = dashpay.clone(); + assert!(profile.documents_can_be_deleted()); - let profile = dashpay_contract - .document_type_for_name("profile") - .expect("expected a profile document type"); + let entropy = Bytes32::random_with_rng(&mut rng); - let entropy = Bytes32::random_with_rng(&mut rng); + let mut document = profile + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); - let mut document = profile - .random_document_with_identifier_and_entropy( - &mut rng, - identity.id(), - entropy, - DocumentFieldFillType::FillIfNotRequired, - DocumentFieldFillSize::AnyDocumentFillSize, - platform_version, - ) - .expect("expected a random document"); + document.set("avatarUrl", "http://test.com/bob.jpg".into()); - document.set("avatarUrl", "http://test.com/bob.jpg".into()); + let mut altered_document = document.clone(); - let mut altered_document = document.clone(); + altered_document.increment_revision().unwrap(); + altered_document.set("displayName", "Samuel".into()); + altered_document.set("avatarUrl", "http://test.com/cat.jpg".into()); - altered_document.increment_revision().unwrap(); - altered_document.set("displayName", "Samuel".into()); - altered_document.set("avatarUrl", "http://test.com/cat.jpg".into()); + let documents_batch_create_transition = + DocumentsBatchTransition::new_document_creation_transition_from_document( + document, + profile, + entropy.0, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); - let documents_batch_delete_transition = - DocumentsBatchTransition::new_document_deletion_transition_from_document( - altered_document, - profile, - &key, - 3, - 0, - &signer, - platform_version, - None, - None, - None, - ) - .expect("expect to create documents batch transition"); + let documents_batch_create_serialized_transition = documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); - let documents_batch_delete_serialized_transition = documents_batch_delete_transition - .serialize_to_bytes() - .expect("expected documents batch serialized state transition"); + let transaction = platform.drive.grove.start_transaction(); - let transaction = platform.drive.grove.start_transaction(); + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.valid_count(), 1); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let documents_batch_deletion_transition = + DocumentsBatchTransition::new_document_deletion_transition_from_document( + altered_document, + profile, + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); - let processing_result = platform - .platform - .process_raw_state_transitions( - &vec![documents_batch_delete_serialized_transition.clone()], - &platform_state, - &BlockInfo::default(), - &transaction, - platform_version, - ) - .expect("expected to process state transition"); + let documents_batch_update_serialized_transition = documents_batch_deletion_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); - platform - .drive - .grove - .commit_transaction(transaction) - .unwrap() - .expect("expected to commit transaction"); + let transaction = platform.drive.grove.start_transaction(); - assert_eq!(processing_result.invalid_paid_count(), 1); + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_update_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); - assert_eq!(processing_result.invalid_unpaid_count(), 0); + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); - assert_eq!(processing_result.valid_count(), 0); + assert_eq!(processing_result.invalid_paid_count(), 0); - assert_eq!(processing_result.aggregated_fees().processing_fee, 1244470); - } + assert_eq!(processing_result.invalid_unpaid_count(), 0); - #[test] - fn test_document_transfer_on_document_type_that_is_transferable() { - let platform_version = PlatformVersion::latest(); - let (mut platform, contract) = TestPlatformBuilder::new() - .build_with_mock_rpc() - .set_initial_state_structure() - .with_crypto_card_game(Transferable::Always); + assert_eq!(processing_result.valid_count(), 1); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 5588830); + } + + #[test] + fn test_document_delete_on_document_type_that_is_mutable_and_can_not_be_deleted() { + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure(); + + let contract_path = "tests/supporting_files/contract/dashpay/dashpay-contract-contact-request-mutable-and-can-not-be-deleted.json"; + + let platform_version = platform + .state + .load() + .current_platform_version() + .expect("expected to get current platform version"); + + // let's construct the grovedb structure for the card game data contract + let dashpay_contract = json_document_to_contract(contract_path, true, platform_version) + .expect("expected to get data contract"); + platform + .drive + .apply_contract( + &dashpay_contract, + BlockInfo::default(), + true, + StorageFlags::optional_default_as_cow(), + None, + platform_version, + ) + .expect("expected to apply contract successfully"); + + let mut rng = StdRng::seed_from_u64(437); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); + + let (other_identity, ..) = setup_identity(&mut platform, 495, dash_to_credits!(0.1)); + + let contact_request_document_type = dashpay_contract + .document_type_for_name("contactRequest") + .expect("expected a profile document type"); + + assert!(contact_request_document_type.documents_mutable()); + + assert!(!contact_request_document_type.documents_can_be_deleted()); + + let entropy = Bytes32::random_with_rng(&mut rng); + + let mut document = contact_request_document_type + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set( + "toUserId", + Value::Identifier(other_identity.id().to_buffer()), + ); + document.set("recipientKeyIndex", Value::U32(1)); + document.set("senderKeyIndex", Value::U32(1)); + document.set("accountReference", Value::U32(0)); + document.set("coreHeightCreatedAt", Value::U32(5)); + + let mut altered_document = document.clone(); + + altered_document.set_revision(Some(1)); + altered_document.set("senderKeyIndex", Value::U32(2)); + + let documents_batch_create_transition = + DocumentsBatchTransition::new_document_creation_transition_from_document( + document, + contact_request_document_type, + entropy.0, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition = documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.valid_count(), 1); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let documents_batch_deletion_transition = + DocumentsBatchTransition::new_document_deletion_transition_from_document( + altered_document, + contact_request_document_type, + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_deletion_serialized_transition = + documents_batch_deletion_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_deletion_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.invalid_paid_count(), 1); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 0); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 1253950); + } + + #[test] + fn test_document_delete_on_document_type_that_is_not_mutable_and_can_be_deleted() { + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure(); + + let contract_path = "tests/supporting_files/contract/dashpay/dashpay-contract-contact-request-not-mutable-and-can-be-deleted.json"; + + let platform_version = platform + .state + .load() + .current_platform_version() + .expect("expected to get current platform version"); + + // let's construct the grovedb structure for the card game data contract + let dashpay_contract = json_document_to_contract(contract_path, true, platform_version) + .expect("expected to get data contract"); + platform + .drive + .apply_contract( + &dashpay_contract, + BlockInfo::default(), + true, + StorageFlags::optional_default_as_cow(), + None, + platform_version, + ) + .expect("expected to apply contract successfully"); + + let mut rng = StdRng::seed_from_u64(437); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); + + let (other_identity, ..) = setup_identity(&mut platform, 495, dash_to_credits!(0.1)); + + let contact_request_document_type = dashpay_contract + .document_type_for_name("contactRequest") + .expect("expected a profile document type"); + + assert!(!contact_request_document_type.documents_mutable()); + + assert!(contact_request_document_type.documents_can_be_deleted()); + + let entropy = Bytes32::random_with_rng(&mut rng); + + let mut document = contact_request_document_type + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set( + "toUserId", + Value::Identifier(other_identity.id().to_buffer()), + ); + document.set("recipientKeyIndex", Value::U32(1)); + document.set("senderKeyIndex", Value::U32(1)); + document.set("accountReference", Value::U32(0)); + document.set("coreHeightCreatedAt", Value::U32(5)); + + let mut altered_document = document.clone(); + + altered_document.set_revision(Some(1)); + altered_document.set("senderKeyIndex", Value::U32(2)); + + let documents_batch_create_transition = + DocumentsBatchTransition::new_document_creation_transition_from_document( + document, + contact_request_document_type, + entropy.0, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition = documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.valid_count(), 1); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let documents_batch_deletion_transition = + DocumentsBatchTransition::new_document_deletion_transition_from_document( + altered_document, + contact_request_document_type, + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_deletion_serialized_transition = + documents_batch_deletion_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_deletion_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.invalid_paid_count(), 0); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 1); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 9951520); + } + + #[test] + fn test_document_delete_on_document_type_that_is_not_mutable_and_can_not_be_deleted() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(437); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); + + let (other_identity, ..) = setup_identity(&mut platform, 495, dash_to_credits!(0.1)); + + let dashpay = platform.drive.cache.system_data_contracts.load_dashpay(); + let dashpay_contract = dashpay.clone(); + + let contact_request_document_type = dashpay_contract + .document_type_for_name("contactRequest") + .expect("expected a profile document type"); + + assert!(!contact_request_document_type.documents_mutable()); + + assert!(!contact_request_document_type.documents_can_be_deleted()); + + let entropy = Bytes32::random_with_rng(&mut rng); + + let mut document = contact_request_document_type + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set( + "toUserId", + Value::Identifier(other_identity.id().to_buffer()), + ); + document.set("recipientKeyIndex", Value::U32(1)); + document.set("senderKeyIndex", Value::U32(1)); + document.set("accountReference", Value::U32(0)); + document.set("coreHeightCreatedAt", Value::U32(5)); + + let mut altered_document = document.clone(); + + altered_document.set_revision(Some(1)); + altered_document.set("senderKeyIndex", Value::U32(2)); + + let documents_batch_create_transition = + DocumentsBatchTransition::new_document_creation_transition_from_document( + document, + contact_request_document_type, + entropy.0, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition = documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.valid_count(), 1); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let documents_batch_deletion_transition = + DocumentsBatchTransition::new_document_deletion_transition_from_document( + altered_document, + contact_request_document_type, + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_deletion_serialized_transition = + documents_batch_deletion_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_deletion_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.invalid_paid_count(), 1); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 0); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 1507670); + } + + #[test] + fn test_document_delete_that_does_not_yet_exist() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(433); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); + + let dashpay = platform.drive.cache.system_data_contracts.load_dashpay(); + let dashpay_contract = dashpay.clone(); + + let profile = dashpay_contract + .document_type_for_name("profile") + .expect("expected a profile document type"); + + let entropy = Bytes32::random_with_rng(&mut rng); + + let mut document = profile + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set("avatarUrl", "http://test.com/bob.jpg".into()); + + let mut altered_document = document.clone(); + + altered_document.increment_revision().unwrap(); + altered_document.set("displayName", "Samuel".into()); + altered_document.set("avatarUrl", "http://test.com/cat.jpg".into()); + + let documents_batch_delete_transition = + DocumentsBatchTransition::new_document_deletion_transition_from_document( + altered_document, + profile, + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_delete_serialized_transition = documents_batch_delete_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_delete_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.invalid_paid_count(), 1); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 0); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 1244470); + } + } + + mod transfer_tests { + use super::*; + + #[test] + fn test_document_transfer_on_document_type_that_is_transferable_that_has_no_owner_indices() + { + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure(); + + let card_game_path = "tests/supporting_files/contract/crypto-card-game/crypto-card-game-all-transferable-no-owner-indexes.json"; + + let platform_version = platform + .state + .load() + .current_platform_version() + .expect("expected to get current platform version"); + + // let's construct the grovedb structure for the card game data contract + let contract = json_document_to_contract(card_game_path, true, platform_version) + .expect("expected to get data contract"); + platform + .drive + .apply_contract( + &contract, + BlockInfo::default(), + true, + StorageFlags::optional_default_as_cow(), + None, + platform_version, + ) + .expect("expected to apply contract successfully"); + + let mut rng = StdRng::seed_from_u64(433); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); + + let (receiver, _, _) = setup_identity(&mut platform, 450, dash_to_credits!(0.1)); + + let card_document_type = contract + .document_type_for_name("card") + .expect("expected a profile document type"); + + assert!(!card_document_type.documents_mutable()); + + let entropy = Bytes32::random_with_rng(&mut rng); + + let mut document = card_document_type + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::DoNotFillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set("attack", 4.into()); + document.set("defense", 7.into()); + + let documents_batch_create_transition = + DocumentsBatchTransition::new_document_creation_transition_from_document( + document.clone(), + card_document_type, + entropy.0, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition = documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.valid_count(), 1); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + document.set_revision(Some(2)); + + let documents_batch_transfer_transition = + DocumentsBatchTransition::new_document_transfer_transition_from_document( + document, + card_document_type, + receiver.id(), + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition for transfer"); + + let documents_batch_transfer_serialized_transition = + documents_batch_transfer_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_transfer_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.invalid_paid_count(), 0); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 1); + + assert_eq!(processing_result.aggregated_fees().storage_fee, 0); // There is no storage fee, as there are no indexes that will change + + assert_eq!(processing_result.aggregated_fees().processing_fee, 5609930); + } + + #[test] + fn test_document_transfer_on_document_type_that_is_transferable() { + let platform_version = PlatformVersion::latest(); + let (mut platform, contract) = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure() + .with_crypto_card_game_transfer_only(Transferable::Always); + + let mut rng = StdRng::seed_from_u64(433); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); + + let (receiver, _, _) = setup_identity(&mut platform, 450, dash_to_credits!(0.1)); + + let card_document_type = contract + .document_type_for_name("card") + .expect("expected a profile document type"); + + assert!(!card_document_type.documents_mutable()); + + let entropy = Bytes32::random_with_rng(&mut rng); + + let mut document = card_document_type + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::DoNotFillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set("attack", 4.into()); + document.set("defense", 7.into()); + + let documents_batch_create_transition = + DocumentsBatchTransition::new_document_creation_transition_from_document( + document.clone(), + card_document_type, + entropy.0, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition = documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.valid_count(), 1); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let sender_documents_sql_string = + format!("select * from card where $ownerId == '{}'", identity.id()); + + let query_sender_identity_documents = DriveQuery::from_sql_expr( + sender_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); + + let receiver_documents_sql_string = + format!("select * from card where $ownerId == '{}'", receiver.id()); + + let query_receiver_identity_documents = DriveQuery::from_sql_expr( + receiver_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); + + let query_sender_results = platform + .drive + .query_documents( + query_sender_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + let query_receiver_results = platform + .drive + .query_documents( + query_receiver_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + // We expect the sender to have 1 document, and the receiver to have none + assert_eq!(query_sender_results.documents().len(), 1); + + assert_eq!(query_receiver_results.documents().len(), 0); + + document.set_revision(Some(2)); + + let documents_batch_transfer_transition = + DocumentsBatchTransition::new_document_transfer_transition_from_document( + document, + card_document_type, + receiver.id(), + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition for transfer"); + + let documents_batch_transfer_serialized_transition = + documents_batch_transfer_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_transfer_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.invalid_paid_count(), 0); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 1); + + assert_eq!(processing_result.aggregated_fees().storage_fee, 37341000); // 1383 bytes added + + // todo: we should expect these numbers to be closer + + assert_eq!( + processing_result + .aggregated_fees() + .fee_refunds + .calculate_refunds_amount_for_identity(identity.id()), + Some(14992395) + ); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 9357180); + + let query_sender_results = platform + .drive + .query_documents(query_sender_identity_documents, None, false, None, None) + .expect("expected query result"); + + let query_receiver_results = platform + .drive + .query_documents(query_receiver_identity_documents, None, false, None, None) + .expect("expected query result"); + + // We expect the sender to have no documents, and the receiver to have 1 + assert_eq!(query_sender_results.documents().len(), 0); + + assert_eq!(query_receiver_results.documents().len(), 1); + } + + #[test] + fn test_document_transfer_on_document_type_that_is_not_transferable() { + let platform_version = PlatformVersion::latest(); + let (mut platform, contract) = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure() + .with_crypto_card_game_transfer_only(Transferable::Never); + + let mut rng = StdRng::seed_from_u64(435); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); + + let (receiver, _, _) = setup_identity(&mut platform, 452, dash_to_credits!(0.1)); + + let card_document_type = contract + .document_type_for_name("card") + .expect("expected a profile document type"); + + let entropy = Bytes32::random_with_rng(&mut rng); + + let mut document = card_document_type + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::DoNotFillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set("attack", 4.into()); + document.set("defense", 7.into()); + + let documents_batch_create_transition = + DocumentsBatchTransition::new_document_creation_transition_from_document( + document.clone(), + card_document_type, + entropy.0, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition = documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.valid_count(), 1); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let sender_documents_sql_string = + format!("select * from card where $ownerId == '{}'", identity.id()); + + let query_sender_identity_documents = DriveQuery::from_sql_expr( + sender_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); + + let receiver_documents_sql_string = + format!("select * from card where $ownerId == '{}'", receiver.id()); + + let query_receiver_identity_documents = DriveQuery::from_sql_expr( + receiver_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); + + let query_sender_results = platform + .drive + .query_documents( + query_sender_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + let query_receiver_results = platform + .drive + .query_documents( + query_receiver_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + // We expect the sender to have 1 document, and the receiver to have none + assert_eq!(query_sender_results.documents().len(), 1); + + assert_eq!(query_receiver_results.documents().len(), 0); + + document.set_revision(Some(2)); + + let documents_batch_transfer_transition = + DocumentsBatchTransition::new_document_transfer_transition_from_document( + document, + card_document_type, + receiver.id(), + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition for transfer"); + + let documents_batch_transfer_serialized_transition = + documents_batch_transfer_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_transfer_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.invalid_paid_count(), 1); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 0); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 1253950); + + let query_sender_results = platform + .drive + .query_documents(query_sender_identity_documents, None, false, None, None) + .expect("expected query result"); + + let query_receiver_results = platform + .drive + .query_documents(query_receiver_identity_documents, None, false, None, None) + .expect("expected query result"); + + // We expect the sender to still have their document, and the receiver to have none + assert_eq!(query_sender_results.documents().len(), 1); + + assert_eq!(query_receiver_results.documents().len(), 0); + } + + #[test] + fn test_document_transfer_that_does_not_yet_exist() { + let platform_version = PlatformVersion::latest(); + let (mut platform, contract) = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure() + .with_crypto_card_game_transfer_only(Transferable::Never); + + let mut rng = StdRng::seed_from_u64(435); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); + + let (receiver, _, _) = setup_identity(&mut platform, 452, dash_to_credits!(0.1)); + + let card_document_type = contract + .document_type_for_name("card") + .expect("expected a profile document type"); + + let entropy = Bytes32::random_with_rng(&mut rng); + + let mut document = card_document_type + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::DoNotFillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set("attack", 4.into()); + document.set("defense", 7.into()); + + let sender_documents_sql_string = + format!("select * from card where $ownerId == '{}'", identity.id()); + + let query_sender_identity_documents = DriveQuery::from_sql_expr( + sender_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); + + let receiver_documents_sql_string = + format!("select * from card where $ownerId == '{}'", receiver.id()); + + let query_receiver_identity_documents = DriveQuery::from_sql_expr( + receiver_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); + + let query_sender_results = platform + .drive + .query_documents( + query_sender_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + let query_receiver_results = platform + .drive + .query_documents( + query_receiver_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + // We expect the sender to have 0 documents, and the receiver to also have none + assert_eq!(query_sender_results.documents().len(), 0); + + assert_eq!(query_receiver_results.documents().len(), 0); + + document.set_revision(Some(2)); + + let documents_batch_transfer_transition = + DocumentsBatchTransition::new_document_transfer_transition_from_document( + document, + card_document_type, + receiver.id(), + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition for transfer"); + + let documents_batch_transfer_serialized_transition = + documents_batch_transfer_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_transfer_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.invalid_paid_count(), 1); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 0); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 25090); + + let query_sender_results = platform + .drive + .query_documents(query_sender_identity_documents, None, false, None, None) + .expect("expected query result"); + + let query_receiver_results = platform + .drive + .query_documents(query_receiver_identity_documents, None, false, None, None) + .expect("expected query result"); + + // We expect the sender to still have no document, and the receiver to have none as well + assert_eq!(query_sender_results.documents().len(), 0); + + assert_eq!(query_receiver_results.documents().len(), 0); + } + + #[test] + fn test_document_delete_after_transfer() { + let platform_version = PlatformVersion::latest(); + let (mut platform, contract) = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure() + .with_crypto_card_game_transfer_only(Transferable::Always); + + let mut rng = StdRng::seed_from_u64(433); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); + + let (receiver, recipient_signer, recipient_key) = + setup_identity(&mut platform, 450, dash_to_credits!(0.1)); + + let card_document_type = contract + .document_type_for_name("card") + .expect("expected a profile document type"); + + assert!(!card_document_type.documents_mutable()); + + let entropy = Bytes32::random_with_rng(&mut rng); + + let mut document = card_document_type + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::DoNotFillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set("attack", 4.into()); + document.set("defense", 7.into()); + + let documents_batch_create_transition = + DocumentsBatchTransition::new_document_creation_transition_from_document( + document.clone(), + card_document_type, + entropy.0, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition = documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.valid_count(), 1); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let sender_documents_sql_string = + format!("select * from card where $ownerId == '{}'", identity.id()); + + let query_sender_identity_documents = DriveQuery::from_sql_expr( + sender_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); + + let receiver_documents_sql_string = + format!("select * from card where $ownerId == '{}'", receiver.id()); + + let query_receiver_identity_documents = DriveQuery::from_sql_expr( + receiver_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); + + let query_sender_results = platform + .drive + .query_documents( + query_sender_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + let query_receiver_results = platform + .drive + .query_documents( + query_receiver_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + // We expect the sender to have 1 document, and the receiver to have none + assert_eq!(query_sender_results.documents().len(), 1); + + assert_eq!(query_receiver_results.documents().len(), 0); + + document.set_revision(Some(2)); + + let documents_batch_transfer_transition = + DocumentsBatchTransition::new_document_transfer_transition_from_document( + document.clone(), + card_document_type, + receiver.id(), + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition for transfer"); + + let documents_batch_transfer_serialized_transition = + documents_batch_transfer_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_transfer_serialized_transition.clone()], + &platform_state, + &BlockInfo::default_with_time(50000000), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.invalid_paid_count(), 0); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 1); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 10283900); + + let query_sender_results = platform + .drive + .query_documents(query_sender_identity_documents, None, false, None, None) + .expect("expected query result"); + + let query_receiver_results = platform + .drive + .query_documents(query_receiver_identity_documents, None, false, None, None) + .expect("expected query result"); + + // We expect the sender to have no documents, and the receiver to have 1 + assert_eq!(query_sender_results.documents().len(), 0); + + assert_eq!(query_receiver_results.documents().len(), 1); + + // Now let's try to delete the transferred document + + document.set_owner_id(receiver.id()); + + let documents_batch_deletion_transition = + DocumentsBatchTransition::new_document_deletion_transition_from_document( + document, + card_document_type, + &recipient_key, + 2, + 0, + &recipient_signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_deletion_serialized_transition = + documents_batch_deletion_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_deletion_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.invalid_paid_count(), 1); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 0); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 1107610); + } + } + + mod nft_tests { + use super::*; + #[test] + fn test_document_set_price_on_document_without_ability_to_purchase() { + let platform_version = PlatformVersion::latest(); + let (mut platform, contract) = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure() + .with_crypto_card_game_transfer_only(Transferable::Always); + + let mut rng = StdRng::seed_from_u64(433); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); + + let card_document_type = contract + .document_type_for_name("card") + .expect("expected a profile document type"); + + assert!(!card_document_type.documents_mutable()); + + let entropy = Bytes32::random_with_rng(&mut rng); + + let mut document = card_document_type + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::DoNotFillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set("attack", 4.into()); + document.set("defense", 7.into()); + + let documents_batch_create_transition = + DocumentsBatchTransition::new_document_creation_transition_from_document( + document.clone(), + card_document_type, + entropy.0, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition = documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.valid_count(), 1); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let sender_documents_sql_string = + format!("select * from card where $ownerId == '{}'", identity.id()); + + let query_sender_identity_documents = DriveQuery::from_sql_expr( + sender_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); + + let query_sender_results = platform + .drive + .query_documents( + query_sender_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + // We expect the sender to have 1 document, and the receiver to have none + assert_eq!(query_sender_results.documents().len(), 1); + + document.set_revision(Some(2)); + + let documents_batch_update_price_transition = + DocumentsBatchTransition::new_document_update_price_transition_from_document( + document.clone(), + card_document_type, + dash_to_credits!(0.1), + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition for the update price"); + + let documents_batch_transfer_serialized_transition = + documents_batch_update_price_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_transfer_serialized_transition.clone()], + &platform_state, + &BlockInfo::default_with_time(50000000), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let result = processing_result.into_execution_results().remove(0); + + let StateTransitionExecutionResult::PaidConsensusError(consensus_error, _) = result + else { + panic!("expected a paid consensus error"); + }; + assert_eq!(consensus_error.to_string(), "Document transition action card is in trade mode No Trading that does not support the seller setting the price is not supported"); + } + + #[test] + fn test_document_set_price() { + let platform_version = PlatformVersion::latest(); + let (mut platform, contract) = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure() + .with_crypto_card_game_nft(TradeMode::DirectPurchase); + + let mut rng = StdRng::seed_from_u64(433); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); + + let (receiver, _, _) = setup_identity(&mut platform, 450, dash_to_credits!(0.1)); + + let card_document_type = contract + .document_type_for_name("card") + .expect("expected a profile document type"); + + assert!(!card_document_type.documents_mutable()); + + let entropy = Bytes32::random_with_rng(&mut rng); + + let mut document = card_document_type + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::DoNotFillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set("attack", 4.into()); + document.set("defense", 7.into()); + + let documents_batch_create_transition = + DocumentsBatchTransition::new_document_creation_transition_from_document( + document.clone(), + card_document_type, + entropy.0, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition = documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.valid_count(), 1); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let sender_documents_sql_string = + format!("select * from card where $ownerId == '{}'", identity.id()); + + let query_sender_identity_documents = DriveQuery::from_sql_expr( + sender_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); + + let receiver_documents_sql_string = + format!("select * from card where $ownerId == '{}'", receiver.id()); + + let query_receiver_identity_documents = DriveQuery::from_sql_expr( + receiver_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); + + let query_sender_results = platform + .drive + .query_documents( + query_sender_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + let query_receiver_results = platform + .drive + .query_documents( + query_receiver_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + // We expect the sender to have 1 document, and the receiver to have none + assert_eq!(query_sender_results.documents().len(), 1); + + assert_eq!(query_receiver_results.documents().len(), 0); + + document.set_revision(Some(2)); + + let documents_batch_update_price_transition = + DocumentsBatchTransition::new_document_update_price_transition_from_document( + document.clone(), + card_document_type, + dash_to_credits!(0.1), + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition for the update price"); + + let documents_batch_transfer_serialized_transition = + documents_batch_update_price_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_transfer_serialized_transition.clone()], + &platform_state, + &BlockInfo::default_with_time(50000000), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.invalid_paid_count(), 0); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 1); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 6814950); + + let query_sender_results = platform + .drive + .query_documents(query_sender_identity_documents, None, false, None, None) + .expect("expected query result"); + + let query_receiver_results = platform + .drive + .query_documents(query_receiver_identity_documents, None, false, None, None) + .expect("expected query result"); + + // We expect the sender to still have their document, and the receiver to have none + assert_eq!(query_sender_results.documents().len(), 1); + + assert_eq!(query_receiver_results.documents().len(), 0); + + // The sender document should have the desired price + + let document = query_sender_results.documents().first().unwrap(); + + let price: Credits = document + .properties() + .get_integer("$price") + .expect("expected to get back price"); + + assert_eq!(dash_to_credits!(0.1), price); + + assert_eq!(document.revision(), Some(2)); + } + + #[test] + fn test_document_set_price_and_purchase() { + let platform_version = PlatformVersion::latest(); + let (mut platform, contract) = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure() + .with_crypto_card_game_nft(TradeMode::DirectPurchase); + + let mut rng = StdRng::seed_from_u64(433); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); + + let (purchaser, recipient_signer, recipient_key) = + setup_identity(&mut platform, 450, dash_to_credits!(1.0)); + + let seller_balance = platform + .drive + .fetch_identity_balance(identity.id().to_buffer(), None, platform_version) + .expect("expected to get identity balance") + .expect("expected that identity exists"); + + assert_eq!(seller_balance, dash_to_credits!(0.1)); + + let card_document_type = contract + .document_type_for_name("card") + .expect("expected a profile document type"); + + assert!(!card_document_type.documents_mutable()); + + let entropy = Bytes32::random_with_rng(&mut rng); + + let mut document = card_document_type + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::DoNotFillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set("attack", 4.into()); + document.set("defense", 7.into()); + + let documents_batch_create_transition = + DocumentsBatchTransition::new_document_creation_transition_from_document( + document.clone(), + card_document_type, + entropy.0, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition = documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.valid_count(), 1); + + assert_eq!( + processing_result + .aggregated_fees() + .clone() + .into_balance_change(identity.id()) + .change(), + &BalanceChange::RemoveFromBalance { + required_removed_balance: 123579000, + desired_removed_balance: 128673220, + } + ); + + let original_creation_cost = 128673220; + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let seller_balance = platform + .drive + .fetch_identity_balance(identity.id().to_buffer(), None, platform_version) + .expect("expected to get identity balance") + .expect("expected that identity exists"); + + // the seller should have received 0.1 and already had 0.1 minus the processing fee and storage fee + assert_eq!( + seller_balance, + dash_to_credits!(0.1) - original_creation_cost + ); + + let sender_documents_sql_string = + format!("select * from card where $ownerId == '{}'", identity.id()); + + let query_sender_identity_documents = DriveQuery::from_sql_expr( + sender_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); + + let receiver_documents_sql_string = + format!("select * from card where $ownerId == '{}'", purchaser.id()); + + let query_receiver_identity_documents = DriveQuery::from_sql_expr( + receiver_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); + + let query_sender_results = platform + .drive + .query_documents( + query_sender_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + let query_receiver_results = platform + .drive + .query_documents( + query_receiver_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + // We expect the sender to have 1 document, and the receiver to have none + assert_eq!(query_sender_results.documents().len(), 1); + + assert_eq!(query_receiver_results.documents().len(), 0); + + document.set_revision(Some(2)); + + let documents_batch_update_price_transition = + DocumentsBatchTransition::new_document_update_price_transition_from_document( + document.clone(), + card_document_type, + dash_to_credits!(0.1), + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition for the update price"); + + let documents_batch_transfer_serialized_transition = + documents_batch_update_price_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_transfer_serialized_transition.clone()], + &platform_state, + &BlockInfo::default_with_time(50000000), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.invalid_paid_count(), 0); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 1); + + assert_eq!(processing_result.aggregated_fees().storage_fee, 216000); // we added 8 bytes for the price + + assert_eq!( + processing_result + .aggregated_fees() + .fee_refunds + .calculate_refunds_amount_for_identity(identity.id()), + None + ); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 6814950); + + let seller_balance = platform + .drive + .fetch_identity_balance(identity.id().to_buffer(), None, platform_version) + .expect("expected to get identity balance") + .expect("expected that identity exists"); + + // the seller should have received 0.1 and already had 0.1 minus the processing fee and storage fee + assert_eq!( + seller_balance, + dash_to_credits!(0.1) - 6814950 - 216000 - original_creation_cost + ); + + let query_sender_results = platform + .drive + .query_documents( + query_sender_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + let query_receiver_results = platform + .drive + .query_documents( + query_receiver_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + // We expect the sender to still have their document, and the receiver to have none + assert_eq!(query_sender_results.documents().len(), 1); + + assert_eq!(query_receiver_results.documents().len(), 0); + + // The sender document should have the desired price + + let mut document = query_sender_results.documents_owned().remove(0); + + let price: Credits = document + .properties() + .get_integer("$price") + .expect("expected to get back price"); + + assert_eq!(dash_to_credits!(0.1), price); + + // At this point we want to have the receiver purchase the document + + document.set_revision(Some(3)); + + let documents_batch_purchase_transition = + DocumentsBatchTransition::new_document_purchase_transition_from_document( + document.clone(), + card_document_type, + purchaser.id(), + dash_to_credits!(0.1), //same price as requested + &recipient_key, + 1, // 1 because he's never done anything + 0, + &recipient_signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition for the purchase"); + + let documents_batch_purchase_serialized_transition = + documents_batch_purchase_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_purchase_serialized_transition], + &platform_state, + &BlockInfo::default_with_time(50000000), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.invalid_paid_count(), 0); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); - let mut rng = StdRng::seed_from_u64(433); + assert_eq!(processing_result.valid_count(), 1); - let platform_state = platform.state.load(); + assert_eq!(processing_result.aggregated_fees().storage_fee, 64611000); - let (identity, signer, key) = setup_identity(&mut platform, 958); + assert_eq!(processing_result.aggregated_fees().processing_fee, 10873700); - let (receiver, _, _) = setup_identity(&mut platform, 450); + assert_eq!( + processing_result + .aggregated_fees() + .fee_refunds + .calculate_refunds_amount_for_identity(identity.id()), + Some(22704503) + ); - let card_document_type = contract - .document_type_for_name("card") - .expect("expected a profile document type"); + let query_sender_results = platform + .drive + .query_documents(query_sender_identity_documents, None, false, None, None) + .expect("expected query result"); - assert!(!card_document_type.documents_mutable()); + let query_receiver_results = platform + .drive + .query_documents(query_receiver_identity_documents, None, false, None, None) + .expect("expected query result"); - let entropy = Bytes32::random_with_rng(&mut rng); + // We expect the sender to have no documents, and the receiver to have 1 + assert_eq!(query_sender_results.documents().len(), 0); - let mut document = card_document_type - .random_document_with_identifier_and_entropy( - &mut rng, - identity.id(), - entropy, - DocumentFieldFillType::DoNotFillIfNotRequired, - DocumentFieldFillSize::AnyDocumentFillSize, - platform_version, - ) - .expect("expected a random document"); - - document.set("attack", 4.into()); - document.set("defense", 7.into()); - - let documents_batch_create_transition = - DocumentsBatchTransition::new_document_creation_transition_from_document( - document.clone(), - card_document_type, - entropy.0, - &key, - 2, - 0, - &signer, - platform_version, - None, - None, - None, - ) - .expect("expect to create documents batch transition"); + assert_eq!(query_receiver_results.documents().len(), 1); - let documents_batch_create_serialized_transition = documents_batch_create_transition - .serialize_to_bytes() - .expect("expected documents batch serialized state transition"); + let seller_balance = platform + .drive + .fetch_identity_balance(identity.id().to_buffer(), None, platform_version) + .expect("expected to get identity balance") + .expect("expected that identity exists"); - let transaction = platform.drive.grove.start_transaction(); + // the seller should have received 0.1 and already had 0.1 minus the processing fee and storage fee + assert_eq!( + seller_balance, + dash_to_credits!(0.2) - 6814950 - 216000 - original_creation_cost + 22704503 + ); - let processing_result = platform - .platform - .process_raw_state_transitions( - &vec![documents_batch_create_serialized_transition.clone()], - &platform_state, - &BlockInfo::default(), - &transaction, - platform_version, - ) - .expect("expected to process state transition"); + let buyers_balance = platform + .drive + .fetch_identity_balance(purchaser.id().to_buffer(), None, platform_version) + .expect("expected to get purchaser balance") + .expect("expected that purchaser exists"); - assert_eq!(processing_result.valid_count(), 1); + // the buyer payed 0.1, but also storage and processing fees + assert_eq!(buyers_balance, dash_to_credits!(0.9) - 10873700 - 64611000); + } - platform - .drive - .grove - .commit_transaction(transaction) - .unwrap() - .expect("expected to commit transaction"); - - let sender_documents_sql_string = - format!("select * from card where $ownerId == '{}'", identity.id()); - - let query_sender_identity_documents = DriveQuery::from_sql_expr( - sender_documents_sql_string.as_str(), - &contract, - Some(&platform.config.drive), - ) - .expect("expected document query"); - - let receiver_documents_sql_string = - format!("select * from card where $ownerId == '{}'", receiver.id()); - - let query_receiver_identity_documents = DriveQuery::from_sql_expr( - receiver_documents_sql_string.as_str(), - &contract, - Some(&platform.config.drive), - ) - .expect("expected document query"); - - let query_sender_results = platform - .drive - .query_documents( - query_sender_identity_documents.clone(), - None, - false, - None, - None, - ) - .expect("expected query result"); + #[test] + fn test_document_set_price_and_try_purchase_at_different_amount() { + let platform_version = PlatformVersion::latest(); + let (mut platform, contract) = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure() + .with_crypto_card_game_nft(TradeMode::DirectPurchase); - let query_receiver_results = platform - .drive - .query_documents( - query_receiver_identity_documents.clone(), - None, - false, - None, - None, - ) - .expect("expected query result"); + let mut rng = StdRng::seed_from_u64(433); - // We expect the sender to have 1 document, and the receiver to have none - assert_eq!(query_sender_results.documents().len(), 1); + let platform_state = platform.state.load(); - assert_eq!(query_receiver_results.documents().len(), 0); + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); - document.set_revision(Some(2)); + let (purchaser, recipient_signer, recipient_key) = + setup_identity(&mut platform, 450, dash_to_credits!(1.0)); - let documents_batch_transfer_transition = - DocumentsBatchTransition::new_document_transfer_transition_from_document( - document, - card_document_type, - receiver.id(), - &key, - 3, - 0, - &signer, - platform_version, - None, - None, - None, - ) - .expect("expect to create documents batch transition for transfer"); + let seller_balance = platform + .drive + .fetch_identity_balance(identity.id().to_buffer(), None, platform_version) + .expect("expected to get identity balance") + .expect("expected that identity exists"); - let documents_batch_transfer_serialized_transition = documents_batch_transfer_transition - .serialize_to_bytes() - .expect("expected documents batch serialized state transition"); + assert_eq!(seller_balance, dash_to_credits!(0.1)); - let transaction = platform.drive.grove.start_transaction(); + let card_document_type = contract + .document_type_for_name("card") + .expect("expected a profile document type"); - let processing_result = platform - .platform - .process_raw_state_transitions( - &vec![documents_batch_transfer_serialized_transition.clone()], - &platform_state, - &BlockInfo::default(), - &transaction, - platform_version, - ) - .expect("expected to process state transition"); + assert!(!card_document_type.documents_mutable()); - platform - .drive - .grove - .commit_transaction(transaction) - .unwrap() - .expect("expected to commit transaction"); + let entropy = Bytes32::random_with_rng(&mut rng); - assert_eq!(processing_result.invalid_paid_count(), 0); + let mut document = card_document_type + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::DoNotFillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set("attack", 4.into()); + document.set("defense", 7.into()); + + let documents_batch_create_transition = + DocumentsBatchTransition::new_document_creation_transition_from_document( + document.clone(), + card_document_type, + entropy.0, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); - assert_eq!(processing_result.invalid_unpaid_count(), 0); + let documents_batch_create_serialized_transition = documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); - assert_eq!(processing_result.valid_count(), 1); + let transaction = platform.drive.grove.start_transaction(); - assert_eq!(processing_result.aggregated_fees().processing_fee, 9350380); + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.valid_count(), 1); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + document.set_revision(Some(2)); + + let documents_batch_update_price_transition = + DocumentsBatchTransition::new_document_update_price_transition_from_document( + document.clone(), + card_document_type, + dash_to_credits!(0.5), + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition for the update price"); + + let documents_batch_transfer_serialized_transition = + documents_batch_update_price_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_transfer_serialized_transition.clone()], + &platform_state, + &BlockInfo::default_with_time(50000000), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.valid_count(), 1); + + // At this point we want to have the receiver purchase the document + + document.set_revision(Some(3)); + + let documents_batch_purchase_transition = + DocumentsBatchTransition::new_document_purchase_transition_from_document( + document.clone(), + card_document_type, + purchaser.id(), + dash_to_credits!(0.35), //different than requested price + &recipient_key, + 1, // 1 because he's never done anything + 0, + &recipient_signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition for the purchase"); + + let documents_batch_purchase_serialized_transition = + documents_batch_purchase_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_purchase_serialized_transition], + &platform_state, + &BlockInfo::default_with_time(50000000), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); - let query_sender_results = platform - .drive - .query_documents(query_sender_identity_documents, None, false, None, None) - .expect("expected query result"); + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); - let query_receiver_results = platform - .drive - .query_documents(query_receiver_identity_documents, None, false, None, None) - .expect("expected query result"); + assert_eq!(processing_result.invalid_paid_count(), 1); - // We expect the sender to have no documents, and the receiver to have 1 - assert_eq!(query_sender_results.documents().len(), 0); + let result = processing_result.into_execution_results().remove(0); - assert_eq!(query_receiver_results.documents().len(), 1); - } + let StateTransitionExecutionResult::PaidConsensusError(consensus_error, _) = result + else { + panic!("expected a paid consensus error"); + }; + assert_eq!(consensus_error.to_string(), "5rJccTdtJfg6AxSKyrptWUug3PWjveEitTTLqBn9wHdk document can not be purchased for 35000000000, it's sale price is 50000000000 (in credits)"); + } - #[test] - fn test_document_transfer_on_document_type_that_is_not_transferable() { - let platform_version = PlatformVersion::latest(); - let (mut platform, contract) = TestPlatformBuilder::new() - .build_with_mock_rpc() - .set_initial_state_structure() - .with_crypto_card_game(Transferable::Never); + #[test] + fn test_document_set_price_and_purchase_from_ones_self() { + let platform_version = PlatformVersion::latest(); + let (mut platform, contract) = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure() + .with_crypto_card_game_nft(TradeMode::DirectPurchase); - let mut rng = StdRng::seed_from_u64(435); + let mut rng = StdRng::seed_from_u64(433); - let platform_state = platform.state.load(); + let platform_state = platform.state.load(); - let (identity, signer, key) = setup_identity(&mut platform, 958); + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.5)); - let (receiver, _, _) = setup_identity(&mut platform, 452); + let seller_balance = platform + .drive + .fetch_identity_balance(identity.id().to_buffer(), None, platform_version) + .expect("expected to get identity balance") + .expect("expected that identity exists"); - let card_document_type = contract - .document_type_for_name("card") - .expect("expected a profile document type"); + assert_eq!(seller_balance, dash_to_credits!(0.5)); - let entropy = Bytes32::random_with_rng(&mut rng); + let card_document_type = contract + .document_type_for_name("card") + .expect("expected a profile document type"); - let mut document = card_document_type - .random_document_with_identifier_and_entropy( - &mut rng, - identity.id(), - entropy, - DocumentFieldFillType::DoNotFillIfNotRequired, - DocumentFieldFillSize::AnyDocumentFillSize, - platform_version, - ) - .expect("expected a random document"); - - document.set("attack", 4.into()); - document.set("defense", 7.into()); - - let documents_batch_create_transition = - DocumentsBatchTransition::new_document_creation_transition_from_document( - document.clone(), - card_document_type, - entropy.0, - &key, - 2, - 0, - &signer, - platform_version, - None, - None, - None, - ) - .expect("expect to create documents batch transition"); + assert!(!card_document_type.documents_mutable()); - let documents_batch_create_serialized_transition = documents_batch_create_transition - .serialize_to_bytes() - .expect("expected documents batch serialized state transition"); + let entropy = Bytes32::random_with_rng(&mut rng); - let transaction = platform.drive.grove.start_transaction(); + let mut document = card_document_type + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::DoNotFillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set("attack", 4.into()); + document.set("defense", 7.into()); + + let documents_batch_create_transition = + DocumentsBatchTransition::new_document_creation_transition_from_document( + document.clone(), + card_document_type, + entropy.0, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); - let processing_result = platform - .platform - .process_raw_state_transitions( - &vec![documents_batch_create_serialized_transition.clone()], - &platform_state, - &BlockInfo::default(), - &transaction, - platform_version, - ) - .expect("expected to process state transition"); + let documents_batch_create_serialized_transition = documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); - assert_eq!(processing_result.valid_count(), 1); + let transaction = platform.drive.grove.start_transaction(); - platform - .drive - .grove - .commit_transaction(transaction) - .unwrap() - .expect("expected to commit transaction"); - - let sender_documents_sql_string = - format!("select * from card where $ownerId == '{}'", identity.id()); - - let query_sender_identity_documents = DriveQuery::from_sql_expr( - sender_documents_sql_string.as_str(), - &contract, - Some(&platform.config.drive), - ) - .expect("expected document query"); - - let receiver_documents_sql_string = - format!("select * from card where $ownerId == '{}'", receiver.id()); - - let query_receiver_identity_documents = DriveQuery::from_sql_expr( - receiver_documents_sql_string.as_str(), - &contract, - Some(&platform.config.drive), - ) - .expect("expected document query"); - - let query_sender_results = platform - .drive - .query_documents( - query_sender_identity_documents.clone(), - None, - false, - None, - None, - ) - .expect("expected query result"); + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.valid_count(), 1); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + document.set_revision(Some(2)); + + let documents_batch_update_price_transition = + DocumentsBatchTransition::new_document_update_price_transition_from_document( + document.clone(), + card_document_type, + dash_to_credits!(0.1), + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition for the update price"); + + let documents_batch_transfer_serialized_transition = + documents_batch_update_price_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_transfer_serialized_transition.clone()], + &platform_state, + &BlockInfo::default_with_time(50000000), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.valid_count(), 1); + + // At this point we want to have the receiver purchase the document + + document.set_revision(Some(3)); + + let documents_batch_purchase_transition = + DocumentsBatchTransition::new_document_purchase_transition_from_document( + document.clone(), + card_document_type, + identity.id(), + dash_to_credits!(0.1), //same price as requested + &key, + 1, // 1 because he's never done anything + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition for the purchase"); + + let documents_batch_purchase_serialized_transition = + documents_batch_purchase_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_purchase_serialized_transition], + &platform_state, + &BlockInfo::default_with_time(50000000), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); - let query_receiver_results = platform - .drive - .query_documents( - query_receiver_identity_documents.clone(), - None, - false, - None, - None, - ) - .expect("expected query result"); + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); - // We expect the sender to have 1 document, and the receiver to have none - assert_eq!(query_sender_results.documents().len(), 1); + assert_eq!(processing_result.invalid_paid_count(), 1); - assert_eq!(query_receiver_results.documents().len(), 0); + let result = processing_result.into_execution_results().remove(0); - document.set_revision(Some(2)); + let StateTransitionExecutionResult::PaidConsensusError(consensus_error, _) = result + else { + panic!("expected a paid consensus error"); + }; + assert_eq!(consensus_error.to_string(), "Document transition action on document type: card identity trying to purchase a document that is already owned by the purchaser is not supported"); + } - let documents_batch_transfer_transition = - DocumentsBatchTransition::new_document_transfer_transition_from_document( - document, - card_document_type, - receiver.id(), - &key, - 3, - 0, - &signer, - platform_version, - None, - None, - None, - ) - .expect("expect to create documents batch transition for transfer"); + #[test] + fn test_document_set_price_and_purchase_then_try_buy_back() { + // In this test we try to buy back a document after it has been sold - let documents_batch_transfer_serialized_transition = documents_batch_transfer_transition - .serialize_to_bytes() - .expect("expected documents batch serialized state transition"); + let platform_version = PlatformVersion::latest(); + let (mut platform, contract) = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure() + .with_crypto_card_game_nft(TradeMode::DirectPurchase); - let transaction = platform.drive.grove.start_transaction(); + let mut rng = StdRng::seed_from_u64(433); - let processing_result = platform - .platform - .process_raw_state_transitions( - &vec![documents_batch_transfer_serialized_transition.clone()], - &platform_state, - &BlockInfo::default(), - &transaction, - platform_version, - ) - .expect("expected to process state transition"); + let platform_state = platform.state.load(); - platform - .drive - .grove - .commit_transaction(transaction) - .unwrap() - .expect("expected to commit transaction"); + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); - assert_eq!(processing_result.invalid_paid_count(), 1); + let (purchaser, recipient_signer, recipient_key) = + setup_identity(&mut platform, 450, dash_to_credits!(1.0)); - assert_eq!(processing_result.invalid_unpaid_count(), 0); + let seller_balance = platform + .drive + .fetch_identity_balance(identity.id().to_buffer(), None, platform_version) + .expect("expected to get identity balance") + .expect("expected that identity exists"); - assert_eq!(processing_result.valid_count(), 0); + assert_eq!(seller_balance, dash_to_credits!(0.1)); - assert_eq!(processing_result.aggregated_fees().processing_fee, 1253950); + let card_document_type = contract + .document_type_for_name("card") + .expect("expected a profile document type"); - let query_sender_results = platform - .drive - .query_documents(query_sender_identity_documents, None, false, None, None) - .expect("expected query result"); + assert!(!card_document_type.documents_mutable()); - let query_receiver_results = platform - .drive - .query_documents(query_receiver_identity_documents, None, false, None, None) - .expect("expected query result"); + let entropy = Bytes32::random_with_rng(&mut rng); + + let mut document = card_document_type + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::DoNotFillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set("attack", 4.into()); + document.set("defense", 7.into()); + + let documents_batch_create_transition = + DocumentsBatchTransition::new_document_creation_transition_from_document( + document.clone(), + card_document_type, + entropy.0, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); - // We expect the sender to still have their document, and the receiver to have none - assert_eq!(query_sender_results.documents().len(), 1); + let documents_batch_create_serialized_transition = documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); - assert_eq!(query_receiver_results.documents().len(), 0); - } + let transaction = platform.drive.grove.start_transaction(); - #[test] - fn test_document_transfer_that_does_not_yet_exist() { - let platform_version = PlatformVersion::latest(); - let (mut platform, contract) = TestPlatformBuilder::new() - .build_with_mock_rpc() - .set_initial_state_structure() - .with_crypto_card_game(Transferable::Never); + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.valid_count(), 1); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + document.set_revision(Some(2)); + + let documents_batch_update_price_transition = + DocumentsBatchTransition::new_document_update_price_transition_from_document( + document.clone(), + card_document_type, + dash_to_credits!(0.1), + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition for the update price"); + + let documents_batch_transfer_serialized_transition = + documents_batch_update_price_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_transfer_serialized_transition.clone()], + &platform_state, + &BlockInfo::default_with_time(50000000), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.valid_count(), 1); + + // At this point we want to have the receiver purchase the document + + document.set_revision(Some(3)); + + let documents_batch_purchase_transition = + DocumentsBatchTransition::new_document_purchase_transition_from_document( + document.clone(), + card_document_type, + purchaser.id(), + dash_to_credits!(0.1), //same price as requested + &recipient_key, + 1, // 1 because he's never done anything + 0, + &recipient_signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition for the purchase"); + + let documents_batch_purchase_serialized_transition = + documents_batch_purchase_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_purchase_serialized_transition], + &platform_state, + &BlockInfo::default_with_time(50000000), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); - let mut rng = StdRng::seed_from_u64(435); + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); - let platform_state = platform.state.load(); + assert_eq!(processing_result.valid_count(), 1); - let (identity, signer, key) = setup_identity(&mut platform, 958); + // Let's verify some stuff - let (receiver, _, _) = setup_identity(&mut platform, 452); + let sender_documents_sql_string = + format!("select * from card where $ownerId == '{}'", identity.id()); - let card_document_type = contract - .document_type_for_name("card") - .expect("expected a profile document type"); + let query_sender_identity_documents = DriveQuery::from_sql_expr( + sender_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); - let entropy = Bytes32::random_with_rng(&mut rng); + let receiver_documents_sql_string = + format!("select * from card where $ownerId == '{}'", purchaser.id()); - let mut document = card_document_type - .random_document_with_identifier_and_entropy( - &mut rng, - identity.id(), - entropy, - DocumentFieldFillType::DoNotFillIfNotRequired, - DocumentFieldFillSize::AnyDocumentFillSize, - platform_version, + let query_receiver_identity_documents = DriveQuery::from_sql_expr( + receiver_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), ) - .expect("expected a random document"); + .expect("expected document query"); + + let query_sender_results = platform + .drive + .query_documents( + query_sender_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + let query_receiver_results = platform + .drive + .query_documents( + query_receiver_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); - document.set("attack", 4.into()); - document.set("defense", 7.into()); + // We expect the sender to still have their document, and the receiver to have none + assert_eq!(query_sender_results.documents().len(), 0); - let sender_documents_sql_string = - format!("select * from card where $ownerId == '{}'", identity.id()); + assert_eq!(query_receiver_results.documents().len(), 1); - let query_sender_identity_documents = DriveQuery::from_sql_expr( - sender_documents_sql_string.as_str(), - &contract, - Some(&platform.config.drive), - ) - .expect("expected document query"); + // The sender document should have the desired price - let receiver_documents_sql_string = - format!("select * from card where $ownerId == '{}'", receiver.id()); + let mut document = query_receiver_results.documents_owned().remove(0); - let query_receiver_identity_documents = DriveQuery::from_sql_expr( - receiver_documents_sql_string.as_str(), - &contract, - Some(&platform.config.drive), - ) - .expect("expected document query"); + let price: Option = document + .properties() + .get_optional_integer("$price") + .expect("expected to get back price"); - let query_sender_results = platform - .drive - .query_documents( - query_sender_identity_documents.clone(), - None, - false, - None, - None, - ) - .expect("expected query result"); + assert_eq!(price, None); - let query_receiver_results = platform - .drive - .query_documents( - query_receiver_identity_documents.clone(), - None, - false, - None, - None, - ) - .expect("expected query result"); + assert_eq!(document.owner_id(), purchaser.id()); - // We expect the sender to have 0 documents, and the receiver to also have none - assert_eq!(query_sender_results.documents().len(), 0); + // At this point we want to have the sender to try to buy back the document - assert_eq!(query_receiver_results.documents().len(), 0); + document.set_revision(Some(4)); - document.set_revision(Some(2)); + let documents_batch_purchase_transition = + DocumentsBatchTransition::new_document_purchase_transition_from_document( + document.clone(), + card_document_type, + identity.id(), + dash_to_credits!(0.1), //same price as old requested + &key, + 4, // 1 because he's never done anything + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition for the purchase"); + + let documents_batch_purchase_serialized_transition = + documents_batch_purchase_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_purchase_serialized_transition], + &platform_state, + &BlockInfo::default_with_time(50000000), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.invalid_paid_count(), 1); + + let result = processing_result.into_execution_results().remove(0); + + let StateTransitionExecutionResult::PaidConsensusError(consensus_error, _) = result + else { + panic!("expected a paid consensus error"); + }; + assert_eq!( + consensus_error.to_string(), + "5rJccTdtJfg6AxSKyrptWUug3PWjveEitTTLqBn9wHdk document not for sale" + ); + } - let documents_batch_transfer_transition = - DocumentsBatchTransition::new_document_transfer_transition_from_document( - document, - card_document_type, - receiver.id(), - &key, - 3, - 0, - &signer, - platform_version, - None, - None, - None, - ) - .expect("expect to create documents batch transition for transfer"); + #[test] + fn test_document_set_price_and_purchase_with_enough_credits_to_buy_but_not_enough_to_pay_for_processing( + ) { + let platform_version = PlatformVersion::latest(); + let (mut platform, contract) = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure() + .with_crypto_card_game_nft(TradeMode::DirectPurchase); - let documents_batch_transfer_serialized_transition = documents_batch_transfer_transition - .serialize_to_bytes() - .expect("expected documents batch serialized state transition"); + let mut rng = StdRng::seed_from_u64(433); - let transaction = platform.drive.grove.start_transaction(); + let platform_state = platform.state.load(); - let processing_result = platform - .platform - .process_raw_state_transitions( - &vec![documents_batch_transfer_serialized_transition.clone()], - &platform_state, - &BlockInfo::default(), - &transaction, - platform_version, + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); + + let (receiver, recipient_signer, recipient_key) = + setup_identity(&mut platform, 450, dash_to_credits!(0.1)); + + let card_document_type = contract + .document_type_for_name("card") + .expect("expected a profile document type"); + + assert!(!card_document_type.documents_mutable()); + + let entropy = Bytes32::random_with_rng(&mut rng); + + let mut document = card_document_type + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::DoNotFillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set("attack", 4.into()); + document.set("defense", 7.into()); + + let documents_batch_create_transition = + DocumentsBatchTransition::new_document_creation_transition_from_document( + document.clone(), + card_document_type, + entropy.0, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition = documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.valid_count(), 1); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let sender_documents_sql_string = + format!("select * from card where $ownerId == '{}'", identity.id()); + + let query_sender_identity_documents = DriveQuery::from_sql_expr( + sender_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), ) - .expect("expected to process state transition"); + .expect("expected document query"); - platform - .drive - .grove - .commit_transaction(transaction) - .unwrap() - .expect("expected to commit transaction"); + let receiver_documents_sql_string = + format!("select * from card where $ownerId == '{}'", receiver.id()); - assert_eq!(processing_result.invalid_paid_count(), 1); + let query_receiver_identity_documents = DriveQuery::from_sql_expr( + receiver_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); + + let query_sender_results = platform + .drive + .query_documents( + query_sender_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + let query_receiver_results = platform + .drive + .query_documents( + query_receiver_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); - assert_eq!(processing_result.invalid_unpaid_count(), 0); + // We expect the sender to have 1 document, and the receiver to have none + assert_eq!(query_sender_results.documents().len(), 1); - assert_eq!(processing_result.valid_count(), 0); + assert_eq!(query_receiver_results.documents().len(), 0); - assert_eq!(processing_result.aggregated_fees().processing_fee, 25090); + document.set_revision(Some(2)); - let query_sender_results = platform - .drive - .query_documents(query_sender_identity_documents, None, false, None, None) - .expect("expected query result"); + let documents_batch_update_price_transition = + DocumentsBatchTransition::new_document_update_price_transition_from_document( + document.clone(), + card_document_type, + dash_to_credits!(0.1), + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition for the update price"); + + let documents_batch_transfer_serialized_transition = + documents_batch_update_price_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_transfer_serialized_transition.clone()], + &platform_state, + &BlockInfo::default_with_time(50000000), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); - let query_receiver_results = platform - .drive - .query_documents(query_receiver_identity_documents, None, false, None, None) - .expect("expected query result"); + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); - // We expect the sender to still have no document, and the receiver to have none as well - assert_eq!(query_sender_results.documents().len(), 0); + assert_eq!(processing_result.invalid_paid_count(), 0); - assert_eq!(query_receiver_results.documents().len(), 0); - } + assert_eq!(processing_result.invalid_unpaid_count(), 0); - #[test] - fn test_document_delete_after_transfer() { - let platform_version = PlatformVersion::latest(); - let (mut platform, contract) = TestPlatformBuilder::new() - .build_with_mock_rpc() - .set_initial_state_structure() - .with_crypto_card_game(Transferable::Always); + assert_eq!(processing_result.valid_count(), 1); - let mut rng = StdRng::seed_from_u64(433); + assert_eq!(processing_result.aggregated_fees().processing_fee, 6814950); - let platform_state = platform.state.load(); + let query_sender_results = platform + .drive + .query_documents( + query_sender_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + let query_receiver_results = platform + .drive + .query_documents( + query_receiver_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); - let (identity, signer, key) = setup_identity(&mut platform, 958); + // We expect the sender to still have their document, and the receiver to have none + assert_eq!(query_sender_results.documents().len(), 1); - let (receiver, recipient_signer, recipient_key) = setup_identity(&mut platform, 450); + assert_eq!(query_receiver_results.documents().len(), 0); - let card_document_type = contract - .document_type_for_name("card") - .expect("expected a profile document type"); + // The sender document should have the desired price - assert!(!card_document_type.documents_mutable()); + let mut document = query_sender_results.documents_owned().remove(0); - let entropy = Bytes32::random_with_rng(&mut rng); + let price: Credits = document + .properties() + .get_integer("$price") + .expect("expected to get back price"); - let mut document = card_document_type - .random_document_with_identifier_and_entropy( - &mut rng, - identity.id(), - entropy, - DocumentFieldFillType::DoNotFillIfNotRequired, - DocumentFieldFillSize::AnyDocumentFillSize, - platform_version, - ) - .expect("expected a random document"); - - document.set("attack", 4.into()); - document.set("defense", 7.into()); - - let documents_batch_create_transition = - DocumentsBatchTransition::new_document_creation_transition_from_document( - document.clone(), - card_document_type, - entropy.0, - &key, - 2, - 0, - &signer, - platform_version, - None, - None, - None, - ) - .expect("expect to create documents batch transition"); + assert_eq!(dash_to_credits!(0.1), price); - let documents_batch_create_serialized_transition = documents_batch_create_transition - .serialize_to_bytes() - .expect("expected documents batch serialized state transition"); + // At this point we want to have the receiver purchase the document - let transaction = platform.drive.grove.start_transaction(); + document.set_revision(Some(3)); - let processing_result = platform - .platform - .process_raw_state_transitions( - &vec![documents_batch_create_serialized_transition.clone()], - &platform_state, - &BlockInfo::default(), - &transaction, - platform_version, - ) - .expect("expected to process state transition"); + let documents_batch_purchase_transition = + DocumentsBatchTransition::new_document_purchase_transition_from_document( + document.clone(), + card_document_type, + receiver.id(), + dash_to_credits!(0.1), //same price as requested + &recipient_key, + 1, // 1 because he's never done anything + 0, + &recipient_signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition for the purchase"); + + let documents_batch_purchase_serialized_transition = + documents_batch_purchase_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_purchase_serialized_transition], + &platform_state, + &BlockInfo::default_with_time(50000000), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); - assert_eq!(processing_result.valid_count(), 1); + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); - platform - .drive - .grove - .commit_transaction(transaction) - .unwrap() - .expect("expected to commit transaction"); - - let sender_documents_sql_string = - format!("select * from card where $ownerId == '{}'", identity.id()); - - let query_sender_identity_documents = DriveQuery::from_sql_expr( - sender_documents_sql_string.as_str(), - &contract, - Some(&platform.config.drive), - ) - .expect("expected document query"); - - let receiver_documents_sql_string = - format!("select * from card where $ownerId == '{}'", receiver.id()); - - let query_receiver_identity_documents = DriveQuery::from_sql_expr( - receiver_documents_sql_string.as_str(), - &contract, - Some(&platform.config.drive), - ) - .expect("expected document query"); - - let query_sender_results = platform - .drive - .query_documents( - query_sender_identity_documents.clone(), - None, - false, - None, - None, - ) - .expect("expected query result"); + // nothing can go through because the purchaser doesn't have enough balance - let query_receiver_results = platform - .drive - .query_documents( - query_receiver_identity_documents.clone(), - None, - false, - None, - None, - ) - .expect("expected query result"); + assert_eq!(processing_result.invalid_paid_count(), 0); - // We expect the sender to have 1 document, and the receiver to have none - assert_eq!(query_sender_results.documents().len(), 1); + assert_eq!(processing_result.invalid_unpaid_count(), 1); - assert_eq!(query_receiver_results.documents().len(), 0); + assert_eq!(processing_result.valid_count(), 0); - document.set_revision(Some(2)); + assert_eq!(processing_result.aggregated_fees().processing_fee, 0); + } - let documents_batch_transfer_transition = - DocumentsBatchTransition::new_document_transfer_transition_from_document( - document.clone(), - card_document_type, - receiver.id(), - &key, - 3, - 0, - &signer, - platform_version, - None, - None, - None, - ) - .expect("expect to create documents batch transition for transfer"); + #[test] + fn test_document_set_price_on_not_owned_document() { + let platform_version = PlatformVersion::latest(); + let (mut platform, contract) = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure() + .with_crypto_card_game_nft(TradeMode::DirectPurchase); - let documents_batch_transfer_serialized_transition = documents_batch_transfer_transition - .serialize_to_bytes() - .expect("expected documents batch serialized state transition"); + let mut rng = StdRng::seed_from_u64(433); - let transaction = platform.drive.grove.start_transaction(); + let platform_state = platform.state.load(); - let processing_result = platform - .platform - .process_raw_state_transitions( - &vec![documents_batch_transfer_serialized_transition.clone()], - &platform_state, - &BlockInfo::default_with_time(50000000), - &transaction, - platform_version, - ) - .expect("expected to process state transition"); + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); - platform - .drive - .grove - .commit_transaction(transaction) - .unwrap() - .expect("expected to commit transaction"); + let (other_identity, other_identity_signer, other_identity_key) = + setup_identity(&mut platform, 450, dash_to_credits!(0.1)); - assert_eq!(processing_result.invalid_paid_count(), 0); + let card_document_type = contract + .document_type_for_name("card") + .expect("expected a profile document type"); - assert_eq!(processing_result.invalid_unpaid_count(), 0); + assert!(!card_document_type.documents_mutable()); - assert_eq!(processing_result.valid_count(), 1); + let entropy = Bytes32::random_with_rng(&mut rng); - assert_eq!(processing_result.aggregated_fees().processing_fee, 10277100); + let mut document = card_document_type + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::DoNotFillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set("attack", 4.into()); + document.set("defense", 7.into()); + + let documents_batch_create_transition = + DocumentsBatchTransition::new_document_creation_transition_from_document( + document.clone(), + card_document_type, + entropy.0, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); - let query_sender_results = platform - .drive - .query_documents(query_sender_identity_documents, None, false, None, None) - .expect("expected query result"); + let documents_batch_create_serialized_transition = documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); - let query_receiver_results = platform - .drive - .query_documents(query_receiver_identity_documents, None, false, None, None) - .expect("expected query result"); + let transaction = platform.drive.grove.start_transaction(); - // We expect the sender to have no documents, and the receiver to have 1 - assert_eq!(query_sender_results.documents().len(), 0); + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.valid_count(), 1); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + document.set_revision(Some(2)); + + document.set_owner_id(other_identity.id()); // we do this to trick the system + + let documents_batch_update_price_transition = + DocumentsBatchTransition::new_document_update_price_transition_from_document( + document.clone(), + card_document_type, + dash_to_credits!(0.1), + &other_identity_key, + 1, + 0, + &other_identity_signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition for the update price"); + + let documents_batch_transfer_serialized_transition = + documents_batch_update_price_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_transfer_serialized_transition.clone()], + &platform_state, + &BlockInfo::default_with_time(50000000), + &transaction, + platform_version, + ) + .expect("expected to process state transition"); - assert_eq!(query_receiver_results.documents().len(), 1); + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); - // Now let's try to delete the transferred document + assert_eq!(processing_result.invalid_paid_count(), 1); - document.set_owner_id(receiver.id()); + assert_eq!(processing_result.invalid_unpaid_count(), 0); - let documents_batch_deletion_transition = - DocumentsBatchTransition::new_document_deletion_transition_from_document( - document, - card_document_type, - &recipient_key, - 2, - 0, - &recipient_signer, - platform_version, - None, - None, - None, - ) - .expect("expect to create documents batch transition"); + assert_eq!(processing_result.valid_count(), 0); - let documents_batch_deletion_serialized_transition = documents_batch_deletion_transition - .serialize_to_bytes() - .expect("expected documents batch serialized state transition"); + assert_eq!(processing_result.aggregated_fees().processing_fee, 25090); - let transaction = platform.drive.grove.start_transaction(); + let sender_documents_sql_string = + format!("select * from card where $ownerId == '{}'", identity.id()); - let processing_result = platform - .platform - .process_raw_state_transitions( - &vec![documents_batch_deletion_serialized_transition.clone()], - &platform_state, - &BlockInfo::default(), - &transaction, - platform_version, + let query_sender_identity_documents = DriveQuery::from_sql_expr( + sender_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), ) - .expect("expected to process state transition"); + .expect("expected document query"); - platform - .drive - .grove - .commit_transaction(transaction) - .unwrap() - .expect("expected to commit transaction"); + let query_sender_results = platform + .drive + .query_documents(query_sender_identity_documents, None, false, None, None) + .expect("expected query result"); - assert_eq!(processing_result.invalid_paid_count(), 1); + // The sender document should not have the desired price - assert_eq!(processing_result.invalid_unpaid_count(), 0); + let document = query_sender_results.documents().first().unwrap(); - assert_eq!(processing_result.valid_count(), 0); - - assert_eq!(processing_result.aggregated_fees().processing_fee, 1107610); + assert_eq!( + document + .properties() + .get_optional_integer::("$price") + .expect("expected None"), + None + ); + } } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs index d65b089289..ad7ed83761 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs @@ -16,8 +16,10 @@ use crate::error::execution::ExecutionError; use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; use crate::execution::validation::state_transition::documents_batch::action_validation::document_create_transition_action::DocumentCreateTransitionActionValidation; use crate::execution::validation::state_transition::documents_batch::action_validation::document_delete_transition_action::DocumentDeleteTransitionActionValidation; +use crate::execution::validation::state_transition::documents_batch::action_validation::document_purchase_transition_action::DocumentPurchaseTransitionActionValidation; use crate::execution::validation::state_transition::documents_batch::action_validation::document_replace_transition_action::DocumentReplaceTransitionActionValidation; use crate::execution::validation::state_transition::documents_batch::action_validation::document_transfer_transition_action::DocumentTransferTransitionActionValidation; +use crate::execution::validation::state_transition::documents_batch::action_validation::document_update_price_transition_action::DocumentUpdatePriceTransitionActionValidation; use crate::execution::validation::state_transition::documents_batch::data_triggers::{data_trigger_bindings_list, DataTriggerExecutionContext, DataTriggerExecutor}; use crate::platform_types::platform::{PlatformStateRef}; use crate::execution::validation::state_transition::state_transitions::documents_batch::transformer::v0::DocumentsBatchTransitionTransformerV0; @@ -111,6 +113,25 @@ impl DocumentsBatchStateTransitionStateValidationV0 for DocumentsBatchTransition transaction, platform_version, )?, + DocumentTransitionAction::UpdatePriceAction(update_price_action) => { + update_price_action.validate_state( + platform, + owner_id, + epoch, + execution_context, + transaction, + platform_version, + )? + } + DocumentTransitionAction::PurchaseAction(purchase_action) => purchase_action + .validate_state( + platform, + owner_id, + epoch, + execution_context, + transaction, + platform_version, + )?, DocumentTransitionAction::BumpIdentityDataContractNonce(..) => { return Err(Error::Execution(ExecutionError::CorruptedCodeExecution( "we should never start with a bump identity data contract nonce", diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs index 07ae9b5e7e..96fa641efa 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs @@ -15,7 +15,12 @@ use dpp::consensus::state::state_error::StateError; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::block::block_info::BlockInfo; +use dpp::consensus::state::document::document_incorrect_purchase_price_error::DocumentIncorrectPurchasePriceError; +use dpp::consensus::state::document::document_not_for_sale_error::DocumentNotForSaleError; +use dpp::document::property_names::PRICE; use dpp::document::{Document, DocumentV0Getters}; +use dpp::fee::Credits; +use dpp::platform_value::btreemap_extensions::BTreeValueMapHelper; use dpp::prelude::Revision; use dpp::validation::SimpleConsensusValidationResult; use dpp::{consensus::ConsensusError, prelude::Identifier, validation::ConsensusValidationResult}; @@ -24,6 +29,7 @@ use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; use dpp::state_transition::documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; use dpp::state_transition::documents_batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; use dpp::state_transition::documents_batch_transition::document_transition::{DocumentTransition, DocumentTransitionV0Methods}; +use dpp::state_transition::documents_batch_transition::document_transition::document_purchase_transition::v0::v0_methods::DocumentPurchaseTransitionV0Methods; use dpp::state_transition::StateTransitionLike; use drive::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::DocumentCreateTransitionAction; use drive::state_transition_action::document::documents_batch::document_transition::document_delete_transition_action::DocumentDeleteTransitionAction; @@ -38,8 +44,11 @@ use drive::grovedb::TransactionArg; use dpp::state_transition::documents_batch_transition::document_transition::document_replace_transition::v0::v0_methods::DocumentReplaceTransitionV0Methods; use dpp::state_transition::documents_batch_transition::document_transition::document_transfer_transition::v0::v0_methods::DocumentTransferTransitionV0Methods; +use dpp::state_transition::documents_batch_transition::document_transition::document_update_price_transition::v0::v0_methods::DocumentUpdatePriceTransitionV0Methods; use drive::drive::contract::DataContractFetchInfo; +use drive::state_transition_action::document::documents_batch::document_transition::document_purchase_transition_action::DocumentPurchaseTransitionAction; use drive::state_transition_action::document::documents_batch::document_transition::document_transfer_transition_action::DocumentTransferTransitionAction; +use drive::state_transition_action::document::documents_batch::document_transition::document_update_price_transition_action::DocumentUpdatePriceTransitionAction; use drive::state_transition_action::system::bump_identity_data_contract_nonce_action::BumpIdentityDataContractNonceAction; use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; @@ -273,7 +282,10 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition .filter(|transition| { matches!( transition, - DocumentTransition::Replace(_) | DocumentTransition::Transfer(_) + DocumentTransition::Replace(_) + | DocumentTransition::Transfer(_) + | DocumentTransition::Purchase(_) + | DocumentTransition::UpdatePrice(_) ) }) .copied() @@ -345,9 +357,10 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition DocumentTransition::Create(document_create_transition) => { let result = ConsensusValidationResult::::new(); - let document_create_action = DocumentCreateTransitionAction::from_document_borrowed_create_transition_with_contract_lookup(document_create_transition, block_info, |_identifier| { - Ok(data_contract_fetch_info.clone()) - })?; + let document_create_action = DocumentCreateTransitionAction::from_document_borrowed_create_transition_with_contract_lookup( + document_create_transition, block_info, |_identifier| { + Ok(data_contract_fetch_info.clone()) + })?; if result.is_valid() { Ok(DocumentTransitionAction::CreateAction(document_create_action).into()) @@ -502,6 +515,128 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition Ok(result) } } + DocumentTransition::UpdatePrice(document_update_price_transition) => { + let mut result = ConsensusValidationResult::::new(); + + let validation_result = + Self::find_replaced_document_v0(transition, replaced_documents); + + if !validation_result.is_valid_with_data() { + result.merge(validation_result); + return Ok(result); + } + + let original_document = validation_result.into_data()?; + + let validation_result = Self::check_ownership_of_old_replaced_document_v0( + document_update_price_transition.base().id(), + original_document, + &owner_id, + ); + + if !validation_result.is_valid() { + result.merge(validation_result); + return Ok(result); + } + + if validate_against_state { + //there are situations where we don't want to validate this against the state + // for example when we already applied the state transition action + // and we are just validating it happened + let validation_result = Self::check_revision_is_bumped_by_one_during_replace_v0( + document_update_price_transition.revision(), + document_update_price_transition.base().id(), + original_document, + ); + + if !validation_result.is_valid() { + result.merge(validation_result); + return Ok(result); + } + } + + let document_update_price_action = + DocumentUpdatePriceTransitionAction::try_from_borrowed_document_update_price_transition( + document_update_price_transition, + original_document.clone(), //todo: find a way to not have to use cloning + block_info, + |_identifier| Ok(data_contract_fetch_info.clone()), + )?; + + if result.is_valid() { + Ok( + DocumentTransitionAction::UpdatePriceAction(document_update_price_action) + .into(), + ) + } else { + Ok(result) + } + } + DocumentTransition::Purchase(document_purchase_transition) => { + let mut result = ConsensusValidationResult::::new(); + + let validation_result = + Self::find_replaced_document_v0(transition, replaced_documents); + + if !validation_result.is_valid_with_data() { + result.merge(validation_result); + return Ok(result); + } + + let original_document = validation_result.into_data()?; + + let Some(listed_price) = original_document + .properties() + .get_optional_integer::(PRICE)? + else { + result.add_error(StateError::DocumentNotForSaleError( + DocumentNotForSaleError::new(original_document.id()), + )); + return Ok(result); + }; + + if listed_price != document_purchase_transition.price() { + result.add_error(StateError::DocumentIncorrectPurchasePriceError( + DocumentIncorrectPurchasePriceError::new( + original_document.id(), + document_purchase_transition.price(), + listed_price, + ), + )); + return Ok(result); + } + + if validate_against_state { + //there are situations where we don't want to validate this against the state + // for example when we already applied the state transition action + // and we are just validating it happened + let validation_result = Self::check_revision_is_bumped_by_one_during_replace_v0( + document_purchase_transition.revision(), + document_purchase_transition.base().id(), + original_document, + ); + + if !validation_result.is_valid() { + result.merge(validation_result); + return Ok(result); + } + } + + let document_purchase_action = + DocumentPurchaseTransitionAction::try_from_borrowed_document_purchase_transition( + document_purchase_transition, + original_document.clone(), //todo: find a way to not have to use cloning + owner_id, + block_info, + |_identifier| Ok(data_contract_fetch_info.clone()), + )?; + + if result.is_valid() { + Ok(DocumentTransitionAction::PurchaseAction(document_purchase_action).into()) + } else { + Ok(result) + } + } } } diff --git a/packages/rs-drive-abci/src/test/helpers/setup.rs b/packages/rs-drive-abci/src/test/helpers/setup.rs index a3971dc066..45ab6a0e36 100644 --- a/packages/rs-drive-abci/src/test/helpers/setup.rs +++ b/packages/rs-drive-abci/src/test/helpers/setup.rs @@ -41,6 +41,7 @@ use crate::test::fixture::abci::static_system_identity_public_keys_v0; use crate::{config::PlatformConfig, rpc::core::DefaultCoreRPC}; use dpp::block::block_info::BlockInfo; use dpp::document::transfer::Transferable; +use dpp::nft::TradeMode; use dpp::prelude::DataContract; use dpp::tests::json_document::json_document_to_contract; use dpp::version::PlatformVersion; @@ -125,7 +126,10 @@ impl TempPlatform { } /// A function which adds the crypto card game to the state and returns it. - pub fn with_crypto_card_game(self, transferable: Transferable) -> (Self, DataContract) { + pub fn with_crypto_card_game_transfer_only( + self, + transferable: Transferable, + ) -> (Self, DataContract) { let card_game_path = match transferable { Transferable::Never => "tests/supporting_files/contract/crypto-card-game/crypto-card-game-not-transferable.json", Transferable::Always => "tests/supporting_files/contract/crypto-card-game/crypto-card-game-all-transferable.json", @@ -155,6 +159,37 @@ impl TempPlatform { (self, card_game_contract) } + /// A function which adds the crypto card game to the state and returns it. + pub fn with_crypto_card_game_nft(self, marketplace: TradeMode) -> (Self, DataContract) { + let card_game_path = match marketplace { + TradeMode::DirectPurchase => "tests/supporting_files/contract/crypto-card-game/crypto-card-game-direct-purchase.json", + _ => panic!("not yet supported") + }; + + let platform_version = self + .platform + .state + .load() + .current_platform_version() + .expect("expected to get current platform version"); + + // let's construct the grovedb structure for the card game data contract + let card_game_contract = json_document_to_contract(card_game_path, true, platform_version) + .expect("expected to get data contract"); + self.drive + .apply_contract( + &card_game_contract, + BlockInfo::default(), + true, + StorageFlags::optional_default_as_cow(), + None, + platform_version, + ) + .expect("expected to apply contract successfully"); + + (self, card_game_contract) + } + /// Sets Platform to genesis state. pub fn set_genesis_state(self) -> Self { self.platform diff --git a/packages/rs-drive-abci/tests/strategy_tests/main.rs b/packages/rs-drive-abci/tests/strategy_tests/main.rs index 1f0d30beb4..812cf5f846 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/main.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/main.rs @@ -1088,7 +1088,7 @@ mod tests { .unwrap() .unwrap() ), - "547963a6f85f531173493bc145bdec8796bfd4d61240ef108c3a2644175939eb".to_string() + "3beaf287fb5fb712715e688ef3cf642e3e4042270907ebd022050b06af0cb433".to_string() ) } @@ -1217,6 +1217,7 @@ mod tests { }, keep_history_chance: 1.0, documents_mutable_chance: 1.0, + documents_can_be_deleted_chance: 1.0, }, 30..31, ), @@ -1777,7 +1778,7 @@ mod tests { .unwrap() .unwrap() ), - "2609439c79ea50f6f6a2d4e4f357f710097fa2fab8a196e35c176689b2f2687a".to_string() + "c0c1f59b535f358448a33c20b419b93bcfa12b05b221f77a7347892f48ca2f16".to_string() ) } @@ -1902,7 +1903,7 @@ mod tests { .unwrap() .unwrap() ), - "58b927769fb1782259883aa91a91a60c6d451cc5f95d3e0d905abcd9ff61f434".to_string() + "a7be306dcdf58930dc14befa2b78c839d66699cf9d454942ac9c595161ffe99e".to_string() ) } diff --git a/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs b/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs index 13910492ef..0a09757567 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs @@ -7,6 +7,7 @@ use dpp::document::{Document, DocumentV0Getters}; use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; use dpp::asset_lock::reduced_asset_lock_value::AssetLockValueGettersV0; +use dpp::document::property_names::PRICE; use dpp::state_transition::StateTransition; use dpp::version::PlatformVersion; use drive::drive::identity::key::fetch::IdentityKeysRequest; @@ -22,8 +23,10 @@ use tenderdash_abci::proto::abci::ExecTxResult; use dpp::state_transition::documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; use drive::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::DocumentFromCreateTransitionAction; +use drive::state_transition_action::document::documents_batch::document_transition::document_purchase_transition_action::DocumentPurchaseTransitionActionAccessorsV0; use drive::state_transition_action::document::documents_batch::document_transition::document_replace_transition_action::DocumentFromReplaceTransitionAction; use drive::state_transition_action::document::documents_batch::document_transition::document_transfer_transition_action::DocumentTransferTransitionActionAccessorsV0; +use drive::state_transition_action::document::documents_batch::document_transition::document_update_price_transition_action::DocumentUpdatePriceTransitionActionAccessorsV0; use drive_abci::abci::app::FullAbciApplication; use drive_abci::execution::types::state_transition_execution_context::StateTransitionExecutionContext; use drive_abci::execution::validation::state_transition::ValidationMode; @@ -404,6 +407,44 @@ pub(crate) fn verify_state_transitions_were_or_were_not_executed( } } } + DocumentTransitionAction::PurchaseAction(purchase_action) => { + if *was_executed { + if let Some(document) = document { + assert_eq!( + document.owner_id(), + purchase_action.document().owner_id() + ); + } + } else { + //there is the possibility that the state transition was not executed and the state is equal to the previous + // state, aka there would have been no change anyways, we can discount that for now + if let Some(document) = document { + assert_ne!( + document.owner_id(), + purchase_action.document().owner_id() + ); + } + } + } + DocumentTransitionAction::UpdatePriceAction(update_price_action) => { + if *was_executed { + if let Some(document) = document { + assert_eq!( + document.get(PRICE), + update_price_action.document().get(PRICE) + ); + } + } else { + //there is the possibility that the state transition was not executed and the state is equal to the previous + // state, aka there would have been no change anyways, we can discount that for now + if let Some(document) = document { + assert_ne!( + document.get(PRICE), + update_price_action.document().get(PRICE) + ); + } + } + } } } } diff --git a/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-all-transferable-no-owner-indexes.json b/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-all-transferable-no-owner-indexes.json new file mode 100644 index 0000000000..aa852c13bb --- /dev/null +++ b/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-all-transferable-no-owner-indexes.json @@ -0,0 +1,114 @@ +{ + "$format_version": "0", + "id": "86LHvdC1Tqx5P97LQUSibGFqf2vnKFpB6VkqQ7oso86e", + "ownerId": "2QjL594djCH2NyDsn45vd6yQjEDHupMKo7CEGVTHtQxU", + "version": 1, + "documentSchemas": { + "card": { + "type": "object", + "documentsMutable": false, + "canBeDeleted": false, + "transferable": 1, + "properties": { + "name": { + "type": "string", + "description": "Name of the card", + "maxLength": 63, + "position": 0 + }, + "description": { + "type": "string", + "description": "Description of the card", + "maxLength": 256, + "position": 1 + }, + "imageUrl": { + "type": "string", + "description": "URL of the image associated with the card", + "maxLength": 2048, + "format": "uri", + "position": 2 + }, + "imageHash": { + "type": "array", + "description": "SHA256 hash of the bytes of the image specified by imageUrl", + "byteArray": true, + "minItems": 32, + "maxItems": 32, + "position": 3 + }, + "imageFingerprint": { + "type": "array", + "description": "dHash of the image specified by imageUrl", + "byteArray": true, + "minItems": 8, + "maxItems": 8, + "position": 4 + }, + "attack": { + "type": "integer", + "description": "Attack power of the card", + "minimum": 0, + "position": 5 + }, + "defense": { + "type": "integer", + "description": "Defense level of the card", + "minimum": 0, + "position": 6 + } + }, + "indices": [ + { + "name": "attack", + "properties": [ + { + "attack": "asc" + } + ] + }, + { + "name": "defense", + "properties": [ + { + "defense": "asc" + } + ] + }, + { + "name": "transferredAt", + "properties": [ + { + "$transferredAt": "asc" + } + ] + }, + { + "name": "transferredAtBlockHeight", + "properties": [ + { + "$transferredAtBlockHeight": "asc" + } + ] + }, + { + "name": "transferredAtCoreBlockHeight", + "properties": [ + { + "$transferredAtCoreBlockHeight": "asc" + } + ] + } + ], + "required": [ + "name", + "$transferredAt", + "$transferredAtBlockHeight", + "$transferredAtCoreBlockHeight", + "attack", + "defense" + ], + "additionalProperties": false + } + } +} \ No newline at end of file diff --git a/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-all-transferable.json b/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-all-transferable.json index b14e8fe5ad..88a6c22aa9 100644 --- a/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-all-transferable.json +++ b/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-all-transferable.json @@ -7,6 +7,7 @@ "card": { "type": "object", "documentsMutable": false, + "canBeDeleted": false, "transferable": 1, "properties": { "name": { diff --git a/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-direct-purchase-creation-restricted-to-owner.json b/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-direct-purchase-creation-restricted-to-owner.json new file mode 100644 index 0000000000..3a1c2daecc --- /dev/null +++ b/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-direct-purchase-creation-restricted-to-owner.json @@ -0,0 +1,135 @@ +{ + "$format_version": "0", + "id": "86LHvdC1Tqx5P97LQUSibGFqf2vnKFpB6VkqQ7oso86e", + "ownerId": "2QjL594djCH2NyDsn45vd6yQjEDHupMKo7CEGVTHtQxU", + "version": 1, + "documentSchemas": { + "card": { + "type": "object", + "documentsMutable": false, + "canBeDeleted": true, + "transferable": 1, + "tradeMode": 1, + "creationRestrictionMode": 1, + "properties": { + "name": { + "type": "string", + "description": "Name of the card", + "maxLength": 63, + "position": 0 + }, + "description": { + "type": "string", + "description": "Description of the card", + "maxLength": 256, + "position": 1 + }, + "imageUrl": { + "type": "string", + "description": "URL of the image associated with the card", + "maxLength": 2048, + "format": "uri", + "position": 2 + }, + "imageHash": { + "type": "array", + "description": "SHA256 hash of the bytes of the image specified by imageUrl", + "byteArray": true, + "minItems": 32, + "maxItems": 32, + "position": 3 + }, + "imageFingerprint": { + "type": "array", + "description": "dHash of the image specified by imageUrl", + "byteArray": true, + "minItems": 8, + "maxItems": 8, + "position": 4 + }, + "attack": { + "type": "integer", + "description": "Attack power of the card", + "minimum": 0, + "position": 5 + }, + "defense": { + "type": "integer", + "description": "Defense level of the card", + "minimum": 0, + "position": 6 + } + }, + "indices": [ + { + "name": "owner", + "properties": [ + { + "$ownerId": "asc" + } + ] + }, + { + "name": "attack", + "properties": [ + { + "attack": "asc" + } + ] + }, + { + "name": "defense", + "properties": [ + { + "defense": "asc" + } + ] + }, + { + "name": "transferredAt", + "properties": [ + { + "$transferredAt": "asc" + } + ] + }, + { + "name": "ownerTransferredAt", + "properties": [ + { + "$ownerId": "asc" + }, + { + "$transferredAt": "asc" + } + ] + }, + { + "name": "transferredAtBlockHeight", + "properties": [ + { + "$transferredAtBlockHeight": "asc" + } + ] + }, + { + "name": "transferredAtCoreBlockHeight", + "properties": [ + { + "$transferredAtCoreBlockHeight": "asc" + } + ] + } + ], + "required": [ + "name", + "$transferredAt", + "$transferredAtBlockHeight", + "$transferredAtCoreBlockHeight", + "attack", + "defense" + ], + "additionalProperties": false + } + } +} \ No newline at end of file diff --git a/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-direct-purchase.json b/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-direct-purchase.json new file mode 100644 index 0000000000..0dbc7641d5 --- /dev/null +++ b/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-direct-purchase.json @@ -0,0 +1,134 @@ +{ + "$format_version": "0", + "id": "86LHvdC1Tqx5P97LQUSibGFqf2vnKFpB6VkqQ7oso86e", + "ownerId": "2QjL594djCH2NyDsn45vd6yQjEDHupMKo7CEGVTHtQxU", + "version": 1, + "documentSchemas": { + "card": { + "type": "object", + "documentsMutable": false, + "canBeDeleted": true, + "transferable": 1, + "tradeMode": 1, + "properties": { + "name": { + "type": "string", + "description": "Name of the card", + "maxLength": 63, + "position": 0 + }, + "description": { + "type": "string", + "description": "Description of the card", + "maxLength": 256, + "position": 1 + }, + "imageUrl": { + "type": "string", + "description": "URL of the image associated with the card", + "maxLength": 2048, + "format": "uri", + "position": 2 + }, + "imageHash": { + "type": "array", + "description": "SHA256 hash of the bytes of the image specified by imageUrl", + "byteArray": true, + "minItems": 32, + "maxItems": 32, + "position": 3 + }, + "imageFingerprint": { + "type": "array", + "description": "dHash of the image specified by imageUrl", + "byteArray": true, + "minItems": 8, + "maxItems": 8, + "position": 4 + }, + "attack": { + "type": "integer", + "description": "Attack power of the card", + "minimum": 0, + "position": 5 + }, + "defense": { + "type": "integer", + "description": "Defense level of the card", + "minimum": 0, + "position": 6 + } + }, + "indices": [ + { + "name": "owner", + "properties": [ + { + "$ownerId": "asc" + } + ] + }, + { + "name": "attack", + "properties": [ + { + "attack": "asc" + } + ] + }, + { + "name": "defense", + "properties": [ + { + "defense": "asc" + } + ] + }, + { + "name": "transferredAt", + "properties": [ + { + "$transferredAt": "asc" + } + ] + }, + { + "name": "ownerTransferredAt", + "properties": [ + { + "$ownerId": "asc" + }, + { + "$transferredAt": "asc" + } + ] + }, + { + "name": "transferredAtBlockHeight", + "properties": [ + { + "$transferredAtBlockHeight": "asc" + } + ] + }, + { + "name": "transferredAtCoreBlockHeight", + "properties": [ + { + "$transferredAtCoreBlockHeight": "asc" + } + ] + } + ], + "required": [ + "name", + "$transferredAt", + "$transferredAtBlockHeight", + "$transferredAtCoreBlockHeight", + "attack", + "defense" + ], + "additionalProperties": false + } + } +} \ No newline at end of file diff --git a/packages/rs-drive-abci/tests/supporting_files/contract/dashpay/dashpay-contract-contact-request-mutable-and-can-not-be-deleted.json b/packages/rs-drive-abci/tests/supporting_files/contract/dashpay/dashpay-contract-contact-request-mutable-and-can-not-be-deleted.json new file mode 100644 index 0000000000..1011c390f0 --- /dev/null +++ b/packages/rs-drive-abci/tests/supporting_files/contract/dashpay/dashpay-contract-contact-request-mutable-and-can-not-be-deleted.json @@ -0,0 +1,234 @@ +{ + "$format_version": "0", + "id": "8MjTnX7JUbGfYYswyuCtHU7ZqcYU9s1fUaNiqD9s5tEw", + "ownerId": "2QjL594djCH2NyDsn45vd6yQjEDHupMKo7CEGVTHtQxU", + "version": 1, + "documentSchemas": { + "profile": { + "type": "object", + "indices": [ + { + "name": "ownerId", + "properties": [ + { + "$ownerId": "asc" + } + ], + "unique": true + }, + { + "name": "ownerIdUpdatedAt", + "properties": [ + { + "$ownerId": "asc" + }, + { + "$updatedAt": "asc" + } + ] + } + ], + "properties": { + "avatarUrl": { + "type": "string", + "format": "uri", + "maxLength": 2048, + "position": 0 + }, + "publicMessage": { + "type": "string", + "maxLength": 140, + "position": 1 + }, + "displayName": { + "type": "string", + "maxLength": 25, + "position": 2 + } + }, + "required": [ + "$createdAt", + "$updatedAt" + ], + "additionalProperties": false + }, + "contactInfo": { + "type": "object", + "indices": [ + { + "name": "ownerIdKeyIndexes", + "properties": [ + { + "$ownerId": "asc" + }, + { + "rootEncryptionKeyIndex": "asc" + }, + { + "derivationEncryptionKeyIndex": "asc" + } + ], + "unique": true + }, + { + "name": "owner_updated", + "properties": [ + { + "$ownerId": "asc" + }, + { + "$updatedAt": "asc" + } + ] + } + ], + "properties": { + "encToUserId": { + "type": "array", + "byteArray": true, + "minItems": 32, + "maxItems": 32, + "position": 0 + }, + "rootEncryptionKeyIndex": { + "type": "integer", + "position": 1 + }, + "derivationEncryptionKeyIndex": { + "type": "integer", + "position": 2 + }, + "privateData": { + "type": "array", + "byteArray": true, + "minItems": 48, + "maxItems": 2048, + "position": 3, + "description": "This is the encrypted values of aliasName + note + displayHidden encoded as an array in cbor" + } + }, + "required": [ + "$createdAt", + "$updatedAt", + "encToUserId", + "privateData", + "rootEncryptionKeyIndex", + "derivationEncryptionKeyIndex" + ], + "additionalProperties": false + }, + "contactRequest": { + "documentsMutable": true, + "canBeDeleted": false, + "requiresIdentityEncryptionBoundedKey": 2, + "requiresIdentityDecryptionBoundedKey": 2, + "type": "object", + "indices": [ + { + "name": "owner_user_ref", + "properties": [ + { + "$ownerId": "asc" + }, + { + "toUserId": "asc" + }, + { + "accountReference": "asc" + } + ], + "unique": true + }, + { + "name": "ownerId_toUserId", + "properties": [ + { + "$ownerId": "asc" + }, + { + "toUserId": "asc" + } + ] + }, + { + "name": "toUserId_$createdAt", + "properties": [ + { + "toUserId": "asc" + }, + { + "$createdAt": "asc" + } + ] + }, + { + "name": "$ownerId_$createdAt", + "properties": [ + { + "$ownerId": "asc" + }, + { + "$createdAt": "asc" + } + ] + } + ], + "properties": { + "toUserId": { + "type": "array", + "byteArray": true, + "minItems": 32, + "maxItems": 32, + "position": 0 + }, + "encryptedPublicKey": { + "type": "array", + "byteArray": true, + "minItems": 96, + "maxItems": 96, + "position": 1 + }, + "senderKeyIndex": { + "type": "integer", + "position": 2 + }, + "recipientKeyIndex": { + "type": "integer", + "position": 3 + }, + "accountReference": { + "type": "integer", + "position": 4 + }, + "encryptedAccountLabel": { + "type": "array", + "byteArray": true, + "minItems": 48, + "maxItems": 80, + "position": 5 + }, + "autoAcceptProof": { + "type": "array", + "byteArray": true, + "minItems": 38, + "maxItems": 102, + "position": 6 + }, + "coreHeightCreatedAt": { + "type": "integer", + "minimum": 1, + "position": 7 + } + }, + "required": [ + "$createdAt", + "toUserId", + "encryptedPublicKey", + "senderKeyIndex", + "recipientKeyIndex", + "accountReference" + ], + "additionalProperties": false + } + } +} diff --git a/packages/rs-drive-abci/tests/supporting_files/contract/dashpay/dashpay-contract-contact-request-not-mutable-and-can-be-deleted.json b/packages/rs-drive-abci/tests/supporting_files/contract/dashpay/dashpay-contract-contact-request-not-mutable-and-can-be-deleted.json new file mode 100644 index 0000000000..bda8b4f729 --- /dev/null +++ b/packages/rs-drive-abci/tests/supporting_files/contract/dashpay/dashpay-contract-contact-request-not-mutable-and-can-be-deleted.json @@ -0,0 +1,234 @@ +{ + "$format_version": "0", + "id": "8MjTnX7JUbGfYYswyuCtHU7ZqcYU9s1fUaNiqD9s5tEw", + "ownerId": "2QjL594djCH2NyDsn45vd6yQjEDHupMKo7CEGVTHtQxU", + "version": 1, + "documentSchemas": { + "profile": { + "type": "object", + "indices": [ + { + "name": "ownerId", + "properties": [ + { + "$ownerId": "asc" + } + ], + "unique": true + }, + { + "name": "ownerIdUpdatedAt", + "properties": [ + { + "$ownerId": "asc" + }, + { + "$updatedAt": "asc" + } + ] + } + ], + "properties": { + "avatarUrl": { + "type": "string", + "format": "uri", + "maxLength": 2048, + "position": 0 + }, + "publicMessage": { + "type": "string", + "maxLength": 140, + "position": 1 + }, + "displayName": { + "type": "string", + "maxLength": 25, + "position": 2 + } + }, + "required": [ + "$createdAt", + "$updatedAt" + ], + "additionalProperties": false + }, + "contactInfo": { + "type": "object", + "indices": [ + { + "name": "ownerIdKeyIndexes", + "properties": [ + { + "$ownerId": "asc" + }, + { + "rootEncryptionKeyIndex": "asc" + }, + { + "derivationEncryptionKeyIndex": "asc" + } + ], + "unique": true + }, + { + "name": "owner_updated", + "properties": [ + { + "$ownerId": "asc" + }, + { + "$updatedAt": "asc" + } + ] + } + ], + "properties": { + "encToUserId": { + "type": "array", + "byteArray": true, + "minItems": 32, + "maxItems": 32, + "position": 0 + }, + "rootEncryptionKeyIndex": { + "type": "integer", + "position": 1 + }, + "derivationEncryptionKeyIndex": { + "type": "integer", + "position": 2 + }, + "privateData": { + "type": "array", + "byteArray": true, + "minItems": 48, + "maxItems": 2048, + "position": 3, + "description": "This is the encrypted values of aliasName + note + displayHidden encoded as an array in cbor" + } + }, + "required": [ + "$createdAt", + "$updatedAt", + "encToUserId", + "privateData", + "rootEncryptionKeyIndex", + "derivationEncryptionKeyIndex" + ], + "additionalProperties": false + }, + "contactRequest": { + "documentsMutable": false, + "canBeDeleted": true, + "requiresIdentityEncryptionBoundedKey": 2, + "requiresIdentityDecryptionBoundedKey": 2, + "type": "object", + "indices": [ + { + "name": "owner_user_ref", + "properties": [ + { + "$ownerId": "asc" + }, + { + "toUserId": "asc" + }, + { + "accountReference": "asc" + } + ], + "unique": true + }, + { + "name": "ownerId_toUserId", + "properties": [ + { + "$ownerId": "asc" + }, + { + "toUserId": "asc" + } + ] + }, + { + "name": "toUserId_$createdAt", + "properties": [ + { + "toUserId": "asc" + }, + { + "$createdAt": "asc" + } + ] + }, + { + "name": "$ownerId_$createdAt", + "properties": [ + { + "$ownerId": "asc" + }, + { + "$createdAt": "asc" + } + ] + } + ], + "properties": { + "toUserId": { + "type": "array", + "byteArray": true, + "minItems": 32, + "maxItems": 32, + "position": 0 + }, + "encryptedPublicKey": { + "type": "array", + "byteArray": true, + "minItems": 96, + "maxItems": 96, + "position": 1 + }, + "senderKeyIndex": { + "type": "integer", + "position": 2 + }, + "recipientKeyIndex": { + "type": "integer", + "position": 3 + }, + "accountReference": { + "type": "integer", + "position": 4 + }, + "encryptedAccountLabel": { + "type": "array", + "byteArray": true, + "minItems": 48, + "maxItems": 80, + "position": 5 + }, + "autoAcceptProof": { + "type": "array", + "byteArray": true, + "minItems": 38, + "maxItems": 102, + "position": 6 + }, + "coreHeightCreatedAt": { + "type": "integer", + "minimum": 1, + "position": 7 + } + }, + "required": [ + "$createdAt", + "toUserId", + "encryptedPublicKey", + "senderKeyIndex", + "recipientKeyIndex", + "accountReference" + ], + "additionalProperties": false + } + } +} diff --git a/packages/rs-drive-proof-verifier/Cargo.toml b/packages/rs-drive-proof-verifier/Cargo.toml index 28d9a19f72..b1afb8ade4 100644 --- a/packages/rs-drive-proof-verifier/Cargo.toml +++ b/packages/rs-drive-proof-verifier/Cargo.toml @@ -13,7 +13,7 @@ json = ["dep:serde_json"] [dependencies] -thiserror = { version = "1.0.58" } +thiserror = { version = "1.0.59" } dapi-grpc = { path = "../dapi-grpc" } drive = { path = "../rs-drive", default-features = false, features = [ "verify", diff --git a/packages/rs-drive/Cargo.toml b/packages/rs-drive/Cargo.toml index a29d414f17..dedd037575 100644 --- a/packages/rs-drive/Cargo.toml +++ b/packages/rs-drive/Cargo.toml @@ -26,7 +26,7 @@ sqlparser = { version = "0.38.0" } # used for int maps and needed in the verifier nohash-hasher = { version = "0.2.0" } dpp = { path = "../rs-dpp", features = ["state-transitions"], default-features = false, optional = true } -thiserror = { version = "1.0.58" } +thiserror = { version = "1.0.59" } tracing = { version = "0.1.37", default-features = false, features = [] } derive_more = { version = "0.99.17", optional = true} @@ -45,10 +45,10 @@ enum-map = { version = "2.0.3", optional = true } intmap = { version = "2.0.0", features = ["serde"], optional = true } chrono = { version = "0.4.35", optional = true } itertools = { version = "0.11.0", optional = true } -grovedb = { git = "https://github.com/dashpay/grovedb", rev = "f5a3382c5537de7417e983cdf2132792aa9fdc9d", optional = true, default-features = false } -grovedb-costs = { git = "https://github.com/dashpay/grovedb", rev = "f5a3382c5537de7417e983cdf2132792aa9fdc9d", optional = true } -grovedb-path = { git = "https://github.com/dashpay/grovedb", rev = "f5a3382c5537de7417e983cdf2132792aa9fdc9d" } -grovedb-storage = { git = "https://github.com/dashpay/grovedb", rev = "f5a3382c5537de7417e983cdf2132792aa9fdc9d", optional = true } +grovedb = { git = "https://github.com/dashpay/grovedb", rev = "941dd86d70c86e7a236541919e789dba078abae6", optional = true, default-features = false } +grovedb-costs = { git = "https://github.com/dashpay/grovedb", rev = "941dd86d70c86e7a236541919e789dba078abae6", optional = true } +grovedb-path = { git = "https://github.com/dashpay/grovedb", rev = "941dd86d70c86e7a236541919e789dba078abae6" } +grovedb-storage = { git = "https://github.com/dashpay/grovedb", rev = "941dd86d70c86e7a236541919e789dba078abae6", optional = true } [dev-dependencies] criterion = "0.3.5" diff --git a/packages/rs-drive/src/drive/batch/transitions/document/document_purchase_transition.rs b/packages/rs-drive/src/drive/batch/transitions/document/document_purchase_transition.rs new file mode 100644 index 0000000000..97d9cf3816 --- /dev/null +++ b/packages/rs-drive/src/drive/batch/transitions/document/document_purchase_transition.rs @@ -0,0 +1,61 @@ +use crate::drive::batch::transitions::document::DriveHighLevelDocumentOperationConverter; +use crate::drive::batch::DriveOperation::{DocumentOperation, IdentityOperation}; +use crate::drive::batch::{DocumentOperationType, DriveOperation, IdentityOperationType}; +use crate::drive::flags::StorageFlags; +use crate::drive::object_size_info::DocumentInfo::DocumentOwnedInfo; +use crate::drive::object_size_info::OwnedDocumentInfo; +use crate::error::Error; +use dpp::block::epoch::Epoch; + +use dpp::prelude::Identifier; +use std::borrow::Cow; +use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use crate::state_transition_action::document::documents_batch::document_transition::document_purchase_transition_action::{DocumentPurchaseTransitionAction, DocumentPurchaseTransitionActionAccessorsV0}; +use dpp::version::PlatformVersion; + +impl DriveHighLevelDocumentOperationConverter for DocumentPurchaseTransitionAction { + fn into_high_level_document_drive_operations<'b>( + self, + epoch: &Epoch, + owner_id: Identifier, + _platform_version: &PlatformVersion, + ) -> Result>, Error> { + let data_contract_id = self.base().data_contract_id(); + let document_type_name = self.base().document_type_name().clone(); + let identity_contract_nonce = self.base().identity_contract_nonce(); + let original_owner_id = self.original_owner_id(); + let purchase_amount = self.price(); + let document = self.document_owned(); + + // we are purchasing the document so the new storage flags should be on the new owner + + let new_document_owner_id = owner_id; + + let storage_flags = + StorageFlags::new_single_epoch(epoch.index, Some(new_document_owner_id.to_buffer())); + + Ok(vec![ + IdentityOperation(IdentityOperationType::UpdateIdentityContractNonce { + identity_id: owner_id.into_buffer(), + contract_id: data_contract_id.into_buffer(), + nonce: identity_contract_nonce, + }), + DocumentOperation(DocumentOperationType::UpdateDocument { + owned_document_info: OwnedDocumentInfo { + document_info: DocumentOwnedInfo((document, Some(Cow::Owned(storage_flags)))), + owner_id: Some(new_document_owner_id.into_buffer()), + }, + contract_id: data_contract_id, + document_type_name: Cow::Owned(document_type_name), + }), + IdentityOperation(IdentityOperationType::RemoveFromIdentityBalance { + identity_id: owner_id.to_buffer(), + balance_to_remove: purchase_amount, + }), + IdentityOperation(IdentityOperationType::AddToIdentityBalance { + identity_id: original_owner_id.to_buffer(), + added_balance: purchase_amount, + }), + ]) + } +} diff --git a/packages/rs-drive/src/drive/batch/transitions/document/document_transition.rs b/packages/rs-drive/src/drive/batch/transitions/document/document_transition.rs index c141cae6c4..e902db925f 100644 --- a/packages/rs-drive/src/drive/batch/transitions/document/document_transition.rs +++ b/packages/rs-drive/src/drive/batch/transitions/document/document_transition.rs @@ -43,6 +43,20 @@ impl DriveHighLevelDocumentOperationConverter for DocumentTransitionAction { platform_version, ) } + DocumentTransitionAction::PurchaseAction(document_purchase_transition) => { + document_purchase_transition.into_high_level_document_drive_operations( + epoch, + owner_id, + platform_version, + ) + } + DocumentTransitionAction::UpdatePriceAction(document_update_price_transition) => { + document_update_price_transition.into_high_level_document_drive_operations( + epoch, + owner_id, + platform_version, + ) + } DocumentTransitionAction::BumpIdentityDataContractNonce( bump_identity_contract_nonce_action, ) => bump_identity_contract_nonce_action diff --git a/packages/rs-drive/src/drive/batch/transitions/document/document_update_price_transition.rs b/packages/rs-drive/src/drive/batch/transitions/document/document_update_price_transition.rs new file mode 100644 index 0000000000..835af6aa21 --- /dev/null +++ b/packages/rs-drive/src/drive/batch/transitions/document/document_update_price_transition.rs @@ -0,0 +1,46 @@ +use crate::drive::batch::transitions::document::DriveHighLevelDocumentOperationConverter; +use crate::drive::batch::DriveOperation::{DocumentOperation, IdentityOperation}; +use crate::drive::batch::{DocumentOperationType, DriveOperation, IdentityOperationType}; +use crate::drive::flags::StorageFlags; +use crate::drive::object_size_info::DocumentInfo::DocumentOwnedInfo; +use crate::drive::object_size_info::OwnedDocumentInfo; +use crate::error::Error; +use dpp::block::epoch::Epoch; + +use dpp::prelude::Identifier; +use std::borrow::Cow; +use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use crate::state_transition_action::document::documents_batch::document_transition::document_update_price_transition_action::{DocumentUpdatePriceTransitionAction, DocumentUpdatePriceTransitionActionAccessorsV0}; +use dpp::version::PlatformVersion; + +impl DriveHighLevelDocumentOperationConverter for DocumentUpdatePriceTransitionAction { + fn into_high_level_document_drive_operations<'b>( + self, + epoch: &Epoch, + owner_id: Identifier, + _platform_version: &PlatformVersion, + ) -> Result>, Error> { + let data_contract_id = self.base().data_contract_id(); + let document_type_name = self.base().document_type_name().clone(); + let identity_contract_nonce = self.base().identity_contract_nonce(); + let document = self.document_owned(); + + let storage_flags = StorageFlags::new_single_epoch(epoch.index, Some(owner_id.to_buffer())); + + Ok(vec![ + IdentityOperation(IdentityOperationType::UpdateIdentityContractNonce { + identity_id: owner_id.into_buffer(), + contract_id: data_contract_id.into_buffer(), + nonce: identity_contract_nonce, + }), + DocumentOperation(DocumentOperationType::UpdateDocument { + owned_document_info: OwnedDocumentInfo { + document_info: DocumentOwnedInfo((document, Some(Cow::Owned(storage_flags)))), + owner_id: Some(owner_id.into_buffer()), + }, + contract_id: data_contract_id, + document_type_name: Cow::Owned(document_type_name), + }), + ]) + } +} diff --git a/packages/rs-drive/src/drive/batch/transitions/document/mod.rs b/packages/rs-drive/src/drive/batch/transitions/document/mod.rs index b7df757580..46ec23550e 100644 --- a/packages/rs-drive/src/drive/batch/transitions/document/mod.rs +++ b/packages/rs-drive/src/drive/batch/transitions/document/mod.rs @@ -6,9 +6,11 @@ use dpp::version::PlatformVersion; mod document_create_transition; mod document_delete_transition; +mod document_purchase_transition; mod document_replace_transition; mod document_transfer_transition; mod document_transition; +mod document_update_price_transition; mod documents_batch_transition; /// A converter that will get High Level Drive Operations from State transitions diff --git a/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_operations/v0/mod.rs b/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_operations/v0/mod.rs index 7eb61ca5fb..1adaab41ae 100644 --- a/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_operations/v0/mod.rs @@ -49,7 +49,7 @@ impl Drive { ) -> Result, Error> { let mut batch_operations: Vec = vec![]; - if !document_type.documents_mutable() { + if !document_type.documents_can_be_deleted() { return Err(Error::Drive(DriveError::UpdatingReadOnlyImmutableDocument( "this document type is not mutable and can not be deleted", ))); diff --git a/packages/rs-drive/src/drive/document/index_uniqueness/mod.rs b/packages/rs-drive/src/drive/document/index_uniqueness/mod.rs index ffeeab47df..e5dac3fa3e 100644 --- a/packages/rs-drive/src/drive/document/index_uniqueness/mod.rs +++ b/packages/rs-drive/src/drive/document/index_uniqueness/mod.rs @@ -39,5 +39,7 @@ mod validate_document_create_transition_action_uniqueness; mod validate_document_replace_transition_action_uniqueness; +mod validate_document_purchase_transition_action_uniqueness; mod validate_document_transfer_transition_action_uniqueness; mod validate_document_uniqueness; +mod validate_document_update_price_transition_action_uniqueness; diff --git a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/mod.rs b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/mod.rs new file mode 100644 index 0000000000..a4e3bc9d05 --- /dev/null +++ b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/mod.rs @@ -0,0 +1,70 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; + +use dpp::data_contract::document_type::DocumentTypeRef; +use dpp::data_contract::DataContract; + +use dpp::identifier::Identifier; + +use dpp::validation::SimpleConsensusValidationResult; + +use grovedb::TransactionArg; + +use crate::state_transition_action::document::documents_batch::document_transition::document_purchase_transition_action::DocumentPurchaseTransitionAction; +use dpp::version::PlatformVersion; + +impl Drive { + /// Validate that a document purchase transition action would be unique in the state. + /// + /// # Arguments + /// + /// * `contract` - A `DataContract` object representing the contract. + /// * `document_type` - A `DocumentType` object representing the type of the document. + /// * `document_purchase_transition` - A `DocumentPurchaseTransitionAction` object representing the document purchase transition action. + /// * `owner_id` - An `Identifier` object representing the owner's ID. + /// * `transaction` - A `TransactionArg` object representing the transaction. + /// * `drive_version` - A `DriveVersion` object representing the version of the Drive. + /// + /// # Returns + /// + /// * `Result` - If successful, returns a `SimpleConsensusValidationResult` object representing the result of the validation. + /// If an error occurs during the operation, returns an `Error`. + /// + /// # Errors + /// + /// This function will return an error if the version of the Drive is unknown. + pub fn validate_document_purchase_transition_action_uniqueness( + &self, + contract: &DataContract, + document_type: DocumentTypeRef, + document_purchase_transition: &DocumentPurchaseTransitionAction, + owner_id: Identifier, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result { + match platform_version + .drive + .methods + .document + .index_uniqueness + .validate_document_purchase_transition_action_uniqueness + { + 0 => self.validate_document_purchase_transition_action_uniqueness_v0( + contract, + document_type, + document_purchase_transition, + owner_id, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "validate_document_purchase_transition_action_uniqueness".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/v0/mod.rs b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/v0/mod.rs new file mode 100644 index 0000000000..a9673724cf --- /dev/null +++ b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/v0/mod.rs @@ -0,0 +1,64 @@ +use dpp::data_contract::DataContract; + +use crate::drive::Drive; + +use crate::drive::document::index_uniqueness::internal::validate_uniqueness_of_data::UniquenessOfDataRequest; +use crate::error::Error; + +use dpp::data_contract::document_type::DocumentTypeRef; + +use dpp::identifier::Identifier; + +use dpp::validation::SimpleConsensusValidationResult; + +use dpp::document::DocumentV0Getters; +use grovedb::TransactionArg; + +use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use crate::state_transition_action::document::documents_batch::document_transition::document_purchase_transition_action::{DocumentPurchaseTransitionAction, DocumentPurchaseTransitionActionAccessorsV0}; +use dpp::version::PlatformVersion; + +impl Drive { + /// Validate that a document purchase transition action would be unique in the state + #[inline(always)] + pub(super) fn validate_document_purchase_transition_action_uniqueness_v0( + &self, + contract: &DataContract, + document_type: DocumentTypeRef, + document_purchase_transition: &DocumentPurchaseTransitionAction, + owner_id: Identifier, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result { + let request = UniquenessOfDataRequest { + contract, + document_type, + owner_id, + document_id: document_purchase_transition.base().id(), + allow_original: true, + created_at: document_purchase_transition.document().created_at(), + updated_at: document_purchase_transition.document().updated_at(), + transferred_at: document_purchase_transition.document().transferred_at(), + created_at_block_height: document_purchase_transition + .document() + .created_at_block_height(), + updated_at_block_height: document_purchase_transition + .document() + .updated_at_block_height(), + transferred_at_block_height: document_purchase_transition + .document() + .transferred_at_block_height(), + created_at_core_block_height: document_purchase_transition + .document() + .created_at_core_block_height(), + updated_at_core_block_height: document_purchase_transition + .document() + .updated_at_core_block_height(), + transferred_at_core_block_height: document_purchase_transition + .document() + .transferred_at_core_block_height(), + data: document_purchase_transition.document().properties(), + }; + self.validate_uniqueness_of_data(request, transaction, platform_version) + } +} diff --git a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/mod.rs b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/mod.rs new file mode 100644 index 0000000000..6d412a95ab --- /dev/null +++ b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/mod.rs @@ -0,0 +1,70 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; + +use dpp::data_contract::document_type::DocumentTypeRef; +use dpp::data_contract::DataContract; + +use dpp::identifier::Identifier; + +use dpp::validation::SimpleConsensusValidationResult; + +use grovedb::TransactionArg; + +use crate::state_transition_action::document::documents_batch::document_transition::document_update_price_transition_action::DocumentUpdatePriceTransitionAction; +use dpp::version::PlatformVersion; + +impl Drive { + /// Validate that a document update_price transition action would be unique in the state. + /// + /// # Arguments + /// + /// * `contract` - A `DataContract` object representing the contract. + /// * `document_type` - A `DocumentType` object representing the type of the document. + /// * `document_update_price_transition` - A `DocumentUpdatePriceTransitionAction` object representing the document update_price transition action. + /// * `owner_id` - An `Identifier` object representing the owner's ID. + /// * `transaction` - A `TransactionArg` object representing the transaction. + /// * `drive_version` - A `DriveVersion` object representing the version of the Drive. + /// + /// # Returns + /// + /// * `Result` - If successful, returns a `SimpleConsensusValidationResult` object representing the result of the validation. + /// If an error occurs during the operation, returns an `Error`. + /// + /// # Errors + /// + /// This function will return an error if the version of the Drive is unknown. + pub fn validate_document_update_price_transition_action_uniqueness( + &self, + contract: &DataContract, + document_type: DocumentTypeRef, + document_update_price_transition: &DocumentUpdatePriceTransitionAction, + owner_id: Identifier, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result { + match platform_version + .drive + .methods + .document + .index_uniqueness + .validate_document_update_price_transition_action_uniqueness + { + 0 => self.validate_document_update_price_transition_action_uniqueness_v0( + contract, + document_type, + document_update_price_transition, + owner_id, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "validate_document_update_price_transition_action_uniqueness".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/v0/mod.rs b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/v0/mod.rs new file mode 100644 index 0000000000..21b3d94564 --- /dev/null +++ b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/v0/mod.rs @@ -0,0 +1,64 @@ +use dpp::data_contract::DataContract; + +use crate::drive::Drive; + +use crate::drive::document::index_uniqueness::internal::validate_uniqueness_of_data::UniquenessOfDataRequest; +use crate::error::Error; + +use dpp::data_contract::document_type::DocumentTypeRef; + +use dpp::identifier::Identifier; + +use dpp::validation::SimpleConsensusValidationResult; + +use dpp::document::DocumentV0Getters; +use grovedb::TransactionArg; + +use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use crate::state_transition_action::document::documents_batch::document_transition::document_update_price_transition_action::{DocumentUpdatePriceTransitionAction, DocumentUpdatePriceTransitionActionAccessorsV0}; +use dpp::version::PlatformVersion; + +impl Drive { + /// Validate that a document update_price transition action would be unique in the state + #[inline(always)] + pub(super) fn validate_document_update_price_transition_action_uniqueness_v0( + &self, + contract: &DataContract, + document_type: DocumentTypeRef, + document_update_price_transition: &DocumentUpdatePriceTransitionAction, + owner_id: Identifier, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result { + let request = UniquenessOfDataRequest { + contract, + document_type, + owner_id, + document_id: document_update_price_transition.base().id(), + allow_original: true, + created_at: document_update_price_transition.document().created_at(), + updated_at: document_update_price_transition.document().updated_at(), + transferred_at: document_update_price_transition.document().transferred_at(), + created_at_block_height: document_update_price_transition + .document() + .created_at_block_height(), + updated_at_block_height: document_update_price_transition + .document() + .updated_at_block_height(), + transferred_at_block_height: document_update_price_transition + .document() + .transferred_at_block_height(), + created_at_core_block_height: document_update_price_transition + .document() + .created_at_core_block_height(), + updated_at_core_block_height: document_update_price_transition + .document() + .updated_at_core_block_height(), + transferred_at_core_block_height: document_update_price_transition + .document() + .transferred_at_core_block_height(), + data: document_update_price_transition.document().properties(), + }; + self.validate_uniqueness_of_data(request, transaction, platform_version) + } +} diff --git a/packages/rs-drive/src/drive/document/update/internal/update_document_for_contract_operations/v0/mod.rs b/packages/rs-drive/src/drive/document/update/internal/update_document_for_contract_operations/v0/mod.rs index a39199206f..a47f7d2a97 100644 --- a/packages/rs-drive/src/drive/document/update/internal/update_document_for_contract_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/update/internal/update_document_for_contract_operations/v0/mod.rs @@ -28,6 +28,7 @@ use dpp::document::document_methods::DocumentMethodsV0; use dpp::document::serialization_traits::DocumentPlatformConversionMethodsV0; use dpp::document::{Document, DocumentV0Getters}; +use dpp::data_contract::document_type::methods::DocumentTypeV0Methods; use dpp::version::PlatformVersion; use grovedb::batch::key_info::KeyInfo; use grovedb::batch::key_info::KeyInfo::KnownKey; @@ -51,11 +52,8 @@ impl Drive { ) -> Result, Error> { let drive_version = &platform_version.drive; let mut batch_operations: Vec = vec![]; - if !document_and_contract_info.document_type.documents_mutable() - && !document_and_contract_info - .document_type - .documents_transferable() - .is_transferable() + if !document_and_contract_info.document_type.requires_revision() + // if it requires revision then there are reasons for us to be able to update in drive { return Err(Error::Drive(DriveError::UpdatingReadOnlyImmutableDocument( "documents for this contract are not mutable", diff --git a/packages/rs-drive/src/drive/flags.rs b/packages/rs-drive/src/drive/flags.rs index dcae6e3a7e..d456346943 100644 --- a/packages/rs-drive/src/drive/flags.rs +++ b/packages/rs-drive/src/drive/flags.rs @@ -97,6 +97,19 @@ pub enum StorageFlags { MultiEpochOwned(BaseEpoch, BTreeMap, OwnerId), } +#[cfg(any(feature = "server", feature = "verify"))] +/// MergingOwnersStrategy decides which owner to keep during a merge +#[derive(Clone, Copy, Debug, PartialEq, Eq, Default)] +pub enum MergingOwnersStrategy { + #[default] + /// Raise an issue that owners of nodes are different + RaiseIssue, + /// Use the original owner id + UseOurs, + /// Use the new owner id + UseTheirs, +} + #[cfg(feature = "server")] impl StorageFlags { /// Create new single epoch storage flags @@ -107,18 +120,29 @@ impl StorageFlags { } } - fn combine_owner_id<'a>(&'a self, rhs: &'a Self) -> Result, Error> { + fn combine_owner_id<'a>( + &'a self, + rhs: &'a Self, + merging_owners_strategy: MergingOwnersStrategy, + ) -> Result, Error> { if let Some(our_owner_id) = self.owner_id() { if let Some(other_owner_id) = rhs.owner_id() { if our_owner_id != other_owner_id { - return Err(Error::StorageFlags( - StorageFlagsError::MergingStorageFlagsFromDifferentOwners( - "can not merge from different owners", - ), - )); + match merging_owners_strategy { + MergingOwnersStrategy::RaiseIssue => Err(Error::StorageFlags( + StorageFlagsError::MergingStorageFlagsFromDifferentOwners( + "can not merge from different owners", + ), + )), + MergingOwnersStrategy::UseOurs => Ok(Some(our_owner_id)), + MergingOwnersStrategy::UseTheirs => Ok(Some(other_owner_id)), + } + } else { + Ok(Some(our_owner_id)) } + } else { + Ok(Some(our_owner_id)) } - Ok(Some(our_owner_id)) } else if let Some(other_owner_id) = rhs.owner_id() { Ok(Some(other_owner_id)) } else { @@ -152,9 +176,13 @@ impl StorageFlags { } } - fn combine_same_base_epoch(&self, rhs: Self) -> Result { + fn combine_same_base_epoch( + &self, + rhs: Self, + merging_owners_strategy: MergingOwnersStrategy, + ) -> Result { let base_epoch = *self.base_epoch(); - let owner_id = self.combine_owner_id(&rhs)?; + let owner_id = self.combine_owner_id(&rhs, merging_owners_strategy)?; let other_epoch_bytes = self.combine_non_base_epoch_bytes(&rhs); match (owner_id, other_epoch_bytes) { @@ -167,10 +195,15 @@ impl StorageFlags { } } - fn combine_with_higher_base_epoch(&self, rhs: Self, added_bytes: u32) -> Result { + fn combine_with_higher_base_epoch( + &self, + rhs: Self, + added_bytes: u32, + merging_owners_strategy: MergingOwnersStrategy, + ) -> Result { let base_epoch = *self.base_epoch(); let epoch_with_adding_bytes = rhs.base_epoch(); - let owner_id = self.combine_owner_id(&rhs)?; + let owner_id = self.combine_owner_id(&rhs, merging_owners_strategy)?; let mut other_epoch_bytes = self.combine_non_base_epoch_bytes(&rhs).unwrap_or_default(); let original_value = other_epoch_bytes.remove(epoch_with_adding_bytes); match original_value { @@ -190,12 +223,13 @@ impl StorageFlags { self, rhs: Self, removed_bytes: &StorageRemovedBytes, + merging_owners_strategy: MergingOwnersStrategy, ) -> Result { if matches!(&self, &SingleEpoch(_) | &SingleEpochOwned(..)) { return Ok(self); } let base_epoch = *self.base_epoch(); - let owner_id = self.combine_owner_id(&rhs)?; + let owner_id = self.combine_owner_id(&rhs, merging_owners_strategy)?; let mut other_epoch_bytes = self.combine_non_base_epoch_bytes(&rhs).unwrap_or_default(); if let SectionedStorageRemoval(sectioned_bytes_by_identifier) = removed_bytes { if sectioned_bytes_by_identifier.len() > 1 { @@ -246,10 +280,13 @@ impl StorageFlags { ours: Option, theirs: Self, added_bytes: u32, + merging_owners_strategy: MergingOwnersStrategy, ) -> Result { match ours { None => Ok(theirs), - Some(ours) => Ok(ours.combine_added_bytes(theirs, added_bytes)?), + Some(ours) => { + Ok(ours.combine_added_bytes(theirs, added_bytes, merging_owners_strategy)?) + } } } @@ -258,18 +295,28 @@ impl StorageFlags { ours: Option, theirs: Self, removed_bytes: &StorageRemovedBytes, + merging_owners_strategy: MergingOwnersStrategy, ) -> Result { match ours { None => Ok(theirs), - Some(ours) => Ok(ours.combine_removed_bytes(theirs, removed_bytes)?), + Some(ours) => { + Ok(ours.combine_removed_bytes(theirs, removed_bytes, merging_owners_strategy)?) + } } } /// Combine added bytes - pub fn combine_added_bytes(self, rhs: Self, added_bytes: u32) -> Result { + pub fn combine_added_bytes( + self, + rhs: Self, + added_bytes: u32, + merging_owners_strategy: MergingOwnersStrategy, + ) -> Result { match self.base_epoch().cmp(rhs.base_epoch()) { - Ordering::Equal => self.combine_same_base_epoch(rhs), - Ordering::Less => self.combine_with_higher_base_epoch(rhs, added_bytes), + Ordering::Equal => self.combine_same_base_epoch(rhs, merging_owners_strategy), + Ordering::Less => { + self.combine_with_higher_base_epoch(rhs, added_bytes, merging_owners_strategy) + } Ordering::Greater => Err(Error::StorageFlags( StorageFlagsError::MergingStorageFlagsWithDifferentBaseEpoch( "can not merge with new item in older base epoch", @@ -283,10 +330,15 @@ impl StorageFlags { self, rhs: Self, removed_bytes: &StorageRemovedBytes, + merging_owners_strategy: MergingOwnersStrategy, ) -> Result { match self.base_epoch().cmp(rhs.base_epoch()) { - Ordering::Equal => self.combine_same_base_epoch(rhs), - Ordering::Less => self.combine_with_higher_base_epoch_remove_bytes(rhs, removed_bytes), + Ordering::Equal => self.combine_same_base_epoch(rhs, merging_owners_strategy), + Ordering::Less => self.combine_with_higher_base_epoch_remove_bytes( + rhs, + removed_bytes, + merging_owners_strategy, + ), Ordering::Greater => Err(Error::StorageFlags( StorageFlagsError::MergingStorageFlagsWithDifferentBaseEpoch( "can not merge with new item in older base epoch", diff --git a/packages/rs-drive/src/drive/grove_operations/grove_apply_batch_with_add_costs/v0/mod.rs b/packages/rs-drive/src/drive/grove_operations/grove_apply_batch_with_add_costs/v0/mod.rs index 1ada7f8918..b6d86527ff 100644 --- a/packages/rs-drive/src/drive/grove_operations/grove_apply_batch_with_add_costs/v0/mod.rs +++ b/packages/rs-drive/src/drive/grove_operations/grove_apply_batch_with_add_costs/v0/mod.rs @@ -1,6 +1,6 @@ use crate::drive::batch::grovedb_op_batch::GroveDbOpBatchV0Methods; use crate::drive::batch::GroveDbOpBatch; -use crate::drive::flags::StorageFlags; +use crate::drive::flags::{MergingOwnersStrategy, StorageFlags}; use crate::drive::grove_operations::push_drive_operation_result; use crate::drive::Drive; use crate::error::drive::DriveError; @@ -76,30 +76,33 @@ impl Drive { // This could be none only because the old element didn't exist // If they were empty we get an error let maybe_old_storage_flags = StorageFlags::map_some_element_flags_ref(&old_flags) - .map_err(|_| { + .map_err(|e| { GroveError::JustInTimeElementFlagsClientError( - "drive did not understand flags of old item being updated", + format!("drive did not understand flags of old item being updated: {}", e) ) })?; let new_storage_flags = StorageFlags::from_element_flags_ref(new_flags) - .map_err(|_| { + .map_err(|e| { GroveError::JustInTimeElementFlagsClientError( - "drive did not understand updated item flag information", + format!("drive did not understand updated item flag information: {}",e) ) })? .ok_or(GroveError::JustInTimeElementFlagsClientError( - "removing flags from an item with flags is not allowed", + "removing flags from an item with flags is not allowed".to_string() ))?; match &cost.transition_type() { OperationStorageTransitionType::OperationUpdateBiggerSize => { + // In the case that the owners do not match up this means that there has been a transfer + // of ownership of the underlying document, the value held is transferred to the new owner let combined_storage_flags = StorageFlags::optional_combine_added_bytes( maybe_old_storage_flags, new_storage_flags, cost.added_bytes, + MergingOwnersStrategy::UseTheirs, ) - .map_err(|_| { + .map_err(|e| { GroveError::JustInTimeElementFlagsClientError( - "drive could not combine storage flags (new flags were bigger)", + format!("drive could not combine storage flags (new flags were bigger): {}",e) ) })?; let combined_flags = combined_storage_flags.to_element_flags(); @@ -113,14 +116,17 @@ impl Drive { } } OperationStorageTransitionType::OperationUpdateSmallerSize => { + // In the case that the owners do not match up this means that there has been a transfer + // of ownership of the underlying document, the value held is transferred to the new owner let combined_storage_flags = StorageFlags::optional_combine_removed_bytes( maybe_old_storage_flags, new_storage_flags, &cost.removed_bytes, + MergingOwnersStrategy::UseTheirs, ) - .map_err(|_| { + .map_err(|e| { GroveError::JustInTimeElementFlagsClientError( - "drive could not combine storage flags (new flags were smaller)", + format!("drive could not combine storage flags (new flags were smaller): {}", e) ) })?; let combined_flags = combined_storage_flags.to_element_flags(); @@ -138,9 +144,9 @@ impl Drive { }, |flags, removed_key_bytes, removed_value_bytes| { let maybe_storage_flags = - StorageFlags::from_element_flags_ref(flags).map_err(|_| { + StorageFlags::from_element_flags_ref(flags).map_err(|e| { GroveError::SplitRemovalBytesClientError( - "drive did not understand flags of item being updated", + format!("drive did not understand flags of item being updated: {}",e) ) })?; // if there were no flags before then the new flags are used diff --git a/packages/rs-drive/src/drive/grove_operations/grove_apply_partial_batch_with_add_costs/v0/mod.rs b/packages/rs-drive/src/drive/grove_operations/grove_apply_partial_batch_with_add_costs/v0/mod.rs index c26e17fe48..55e400c240 100644 --- a/packages/rs-drive/src/drive/grove_operations/grove_apply_partial_batch_with_add_costs/v0/mod.rs +++ b/packages/rs-drive/src/drive/grove_operations/grove_apply_partial_batch_with_add_costs/v0/mod.rs @@ -1,6 +1,6 @@ use crate::drive::batch::grovedb_op_batch::GroveDbOpBatchV0Methods; use crate::drive::batch::GroveDbOpBatch; -use crate::drive::flags::StorageFlags; +use crate::drive::flags::{MergingOwnersStrategy, StorageFlags}; use crate::drive::grove_operations::push_drive_operation_result; use crate::drive::Drive; use crate::error::drive::DriveError; @@ -59,19 +59,19 @@ impl Drive { // This could be none only because the old element didn't exist // If they were empty we get an error let maybe_old_storage_flags = StorageFlags::map_some_element_flags_ref(&old_flags) - .map_err(|_| { + .map_err(|e| { GroveError::JustInTimeElementFlagsClientError( - "drive did not understand flags of old item being updated", + format!("drive did not understand flags of old item being updated {}",e) ) })?; let new_storage_flags = StorageFlags::from_element_flags_ref(new_flags) - .map_err(|_| { + .map_err(|e| { GroveError::JustInTimeElementFlagsClientError( - "drive did not understand updated item flag information", + format!("drive did not understand updated item flag information {}", e) ) })? .ok_or(GroveError::JustInTimeElementFlagsClientError( - "removing flags from an item with flags is not allowed", + "removing flags from an item with flags is not allowed".to_string() ))?; match &cost.transition_type() { OperationStorageTransitionType::OperationUpdateBiggerSize => { @@ -79,10 +79,11 @@ impl Drive { maybe_old_storage_flags, new_storage_flags, cost.added_bytes, + MergingOwnersStrategy::RaiseIssue, ) - .map_err(|_| { + .map_err(|e| { GroveError::JustInTimeElementFlagsClientError( - "drive could not combine storage flags (new flags were bigger)", + format!("drive could not combine storage flags (new flags were bigger): {}", e) ) })?; let combined_flags = combined_storage_flags.to_element_flags(); @@ -100,10 +101,11 @@ impl Drive { maybe_old_storage_flags, new_storage_flags, &cost.removed_bytes, + MergingOwnersStrategy::RaiseIssue, ) - .map_err(|_| { + .map_err(|e| { GroveError::JustInTimeElementFlagsClientError( - "drive could not combine storage flags (new flags were smaller)", + format!("drive could not combine storage flags (new flags were smaller): {}",e) ) })?; let combined_flags = combined_storage_flags.to_element_flags(); @@ -121,9 +123,9 @@ impl Drive { }, |flags, removed_key_bytes, removed_value_bytes| { let maybe_storage_flags = - StorageFlags::from_element_flags_ref(flags).map_err(|_| { + StorageFlags::from_element_flags_ref(flags).map_err(|e| { GroveError::SplitRemovalBytesClientError( - "drive did not understand flags of item being updated", + format!("drive did not understand flags of item being updated: {}",e) ) })?; // if there were no flags before then the new flags are used diff --git a/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs b/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs index d4d4e148e4..1a703b6b4b 100644 --- a/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs +++ b/packages/rs-drive/src/drive/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs @@ -6,7 +6,10 @@ use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::data_contract::serialized_version::DataContractInSerializationFormat; use dpp::document::{Document, DocumentV0Getters}; use dpp::document::document_methods::DocumentMethodsV0; +use dpp::document::property_names::PRICE; +use dpp::fee::Credits; use dpp::identity::PartialIdentity; +use dpp::platform_value::btreemap_extensions::BTreeValueMapHelper; use dpp::prelude::{DataContract, Identifier}; use dpp::state_transition::data_contract_create_transition::accessors::DataContractCreateTransitionAccessorsV0; use dpp::state_transition::data_contract_update_transition::accessors::DataContractUpdateTransitionAccessorsV0; @@ -24,7 +27,9 @@ use dpp::state_transition::documents_batch_transition::document_create_transitio use dpp::state_transition::documents_batch_transition::document_delete_transition::v0::v0_methods::DocumentDeleteTransitionV0Methods; use dpp::state_transition::documents_batch_transition::document_replace_transition::DocumentFromReplaceTransition; use dpp::state_transition::documents_batch_transition::document_replace_transition::v0::v0_methods::DocumentReplaceTransitionV0Methods; +use dpp::state_transition::documents_batch_transition::document_transition::document_purchase_transition::v0::v0_methods::DocumentPurchaseTransitionV0Methods; use dpp::state_transition::documents_batch_transition::document_transition::document_transfer_transition::v0::v0_methods::DocumentTransferTransitionV0Methods; +use dpp::state_transition::documents_batch_transition::document_transition::document_update_price_transition::v0::v0_methods::DocumentUpdatePriceTransitionV0Methods; use dpp::state_transition::proof_result::StateTransitionProofResult; use dpp::state_transition::proof_result::StateTransitionProofResult::{VerifiedBalanceTransfer, VerifiedDataContract, VerifiedDocuments, VerifiedIdentity, VerifiedPartialIdentity}; use platform_version::TryIntoPlatformVersioned; @@ -94,6 +99,8 @@ impl Drive { ))); }; + let owner_id = documents_batch_transition.owner_id(); + let data_contract_id = transition.data_contract_id(); let contract = known_contracts_provider_fn(&data_contract_id)?.ok_or( @@ -198,6 +205,29 @@ impl Drive { )])), )) } + DocumentTransition::UpdatePrice(update_price_transition) => { + let document = document.ok_or(Error::Proof(ProofError::IncorrectProof(format!("proof did not contain document with id {} expected to exist because of state transition (update price)", update_price_transition.base().id()))))?; + let new_document_price : Credits = document.properties().get_integer(PRICE).map_err(|e| Error::Proof(ProofError::IncorrectProof(format!("proof did not contain a document that contained a price field with id {} expected to exist because of state transition (update price): {}", update_price_transition.base().id(), e))))?; + if new_document_price != update_price_transition.price() { + return Err(Error::Proof(ProofError::IncorrectProof(format!("proof of state transition execution did not contain expected document update of price after price update with id {}", update_price_transition.base().id())))); + } + Ok(( + root_hash, + VerifiedDocuments(BTreeMap::from([(document.id(), Some(document))])), + )) + } + DocumentTransition::Purchase(purchase_transition) => { + let document = document.ok_or(Error::Proof(ProofError::IncorrectProof(format!("proof did not contain document with id {} expected to exist because of state transition (purchase)", purchase_transition.base().id()))))?; + + if document.owner_id() != owner_id { + return Err(Error::Proof(ProofError::IncorrectProof(format!("proof of state transition execution did not have the transfer executed after expected transfer with id {}", purchase_transition.base().id())))); + } + + Ok(( + root_hash, + VerifiedDocuments(BTreeMap::from([(document.id(), Some(document))])), + )) + } } } StateTransition::IdentityCreate(identity_create_transition) => { diff --git a/packages/rs-drive/src/query/test_index.rs b/packages/rs-drive/src/query/test_index.rs index f486f0128f..d0b4b12cb6 100644 --- a/packages/rs-drive/src/query/test_index.rs +++ b/packages/rs-drive/src/query/test_index.rs @@ -84,6 +84,7 @@ mod tests { None, false, false, + false, true, &mut vec![], platform_version, diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/action_type.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/action_type.rs index f2dda79525..de03698b22 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/action_type.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/action_type.rs @@ -10,6 +10,10 @@ impl TransitionActionTypeGetter for DocumentTransitionAction { DocumentTransitionAction::DeleteAction(_) => DocumentTransitionActionType::Delete, DocumentTransitionAction::ReplaceAction(_) => DocumentTransitionActionType::Replace, DocumentTransitionAction::TransferAction(_) => DocumentTransitionActionType::Transfer, + DocumentTransitionAction::PurchaseAction(_) => DocumentTransitionActionType::Purchase, + DocumentTransitionAction::UpdatePriceAction(_) => { + DocumentTransitionActionType::UpdatePrice + } DocumentTransitionAction::BumpIdentityDataContractNonce(_) => { DocumentTransitionActionType::IgnoreWhileBumpingRevision } diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/mod.rs new file mode 100644 index 0000000000..53a84fe1a5 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/mod.rs @@ -0,0 +1,98 @@ +mod v0; + +use derive_more::From; +use dpp::document::Document; +use dpp::fee::Credits; + +use dpp::platform_value::Identifier; +use dpp::ProtocolError; +pub use v0::*; + +use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionAction; +use dpp::version::PlatformVersion; + +/// transformer +pub mod transformer; + +/// action +#[derive(Debug, Clone, From)] +pub enum DocumentPurchaseTransitionAction { + /// v0 + V0(DocumentPurchaseTransitionActionV0), +} + +impl DocumentPurchaseTransitionActionAccessorsV0 for DocumentPurchaseTransitionAction { + fn base(&self) -> &DocumentBaseTransitionAction { + match self { + DocumentPurchaseTransitionAction::V0(v0) => &v0.base, + } + } + + fn base_owned(self) -> DocumentBaseTransitionAction { + match self { + DocumentPurchaseTransitionAction::V0(v0) => v0.base, + } + } + + fn document(&self) -> &Document { + match self { + DocumentPurchaseTransitionAction::V0(v0) => &v0.document, + } + } + + fn document_owned(self) -> Document { + match self { + DocumentPurchaseTransitionAction::V0(v0) => v0.document, + } + } + + fn original_owner_id(&self) -> Identifier { + match self { + DocumentPurchaseTransitionAction::V0(v0) => v0.original_owner_id, + } + } + + fn price(&self) -> Credits { + match self { + DocumentPurchaseTransitionAction::V0(v0) => v0.price, + } + } +} + +/// document from purchase transition +pub trait DocumentFromPurchaseTransitionAction { + /// Attempts to create a new `Document` from the given `DocumentPurchaseTransitionAction` reference and `owner_id`. + /// + /// # Arguments + /// + /// * `value` - A reference to the `DocumentPurchaseTransitionAction` containing information about the document being purchased. + /// * `owner_id` - The `Identifier` of the document's owner. + /// + /// # Returns + /// + /// * `Result` - A new `Document` object if successful, otherwise a `ProtocolError`. + fn try_from_purchase_transition_action( + document_purchase_transition_action: &DocumentPurchaseTransitionAction, + owner_id: Identifier, + platform_version: &PlatformVersion, + ) -> Result + where + Self: Sized; + /// Attempts to create a new `Document` from the given `DocumentPurchaseTransitionAction` instance and `owner_id`. + /// + /// # Arguments + /// + /// * `value` - A `DocumentPurchaseTransitionAction` instance containing information about the document being purchased. + /// * `owner_id` - The `Identifier` of the document's owner. + /// + /// # Returns + /// + /// * `Result` - A new `Document` object if successful, otherwise a `ProtocolError`. + fn try_from_owned_purchase_transition_action( + document_purchase_transition_action: DocumentPurchaseTransitionAction, + owner_id: Identifier, + platform_version: &PlatformVersion, + ) -> Result + where + Self: Sized; +} diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/transformer.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/transformer.rs new file mode 100644 index 0000000000..894e13b5bd --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/transformer.rs @@ -0,0 +1,33 @@ +use dpp::block::block_info::BlockInfo; +use dpp::document::Document; +use dpp::platform_value::Identifier; +use std::sync::Arc; + +use dpp::ProtocolError; +use dpp::state_transition::documents_batch_transition::document_transition::DocumentPurchaseTransition; +use crate::drive::contract::DataContractFetchInfo; +use crate::state_transition_action::document::documents_batch::document_transition::document_purchase_transition_action::{DocumentPurchaseTransitionAction, DocumentPurchaseTransitionActionV0}; + +impl DocumentPurchaseTransitionAction { + /// try from borrowed + pub fn try_from_borrowed_document_purchase_transition( + document_purchase_transition: &DocumentPurchaseTransition, + original_document: Document, + purchaser_id: Identifier, + block_info: &BlockInfo, + get_data_contract: impl Fn(Identifier) -> Result, ProtocolError>, + ) -> Result { + match document_purchase_transition { + DocumentPurchaseTransition::V0(v0) => Ok( + DocumentPurchaseTransitionActionV0::try_from_borrowed_document_purchase_transition( + v0, + original_document, + purchaser_id, + block_info, + get_data_contract, + )? + .into(), + ), + } + } +} diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/v0/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/v0/mod.rs new file mode 100644 index 0000000000..785ccb32b6 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/v0/mod.rs @@ -0,0 +1,37 @@ +pub mod transformer; + +use dpp::document::Document; +use dpp::fee::Credits; +use dpp::identifier::Identifier; + +use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionAction; + +/// document purchase transition action v0 +#[derive(Debug, Clone)] +pub struct DocumentPurchaseTransitionActionV0 { + /// Document Base Transition + pub base: DocumentBaseTransitionAction, + /// The new document to be inserted + pub document: Document, + /// The original owner id + pub original_owner_id: Identifier, + /// Price + pub price: Credits, +} + +/// document purchase transition action accessors v0 +pub trait DocumentPurchaseTransitionActionAccessorsV0 { + /// base + fn base(&self) -> &DocumentBaseTransitionAction; + /// base owned + fn base_owned(self) -> DocumentBaseTransitionAction; + /// the document to be inserted as a ref + fn document(&self) -> &Document; + /// the document to be inserted as owned + fn document_owned(self) -> Document; + + /// The original owner id + fn original_owner_id(&self) -> Identifier; + /// Price + fn price(&self) -> Credits; +} diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/v0/transformer.rs new file mode 100644 index 0000000000..e888f20d33 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/v0/transformer.rs @@ -0,0 +1,59 @@ +use dpp::block::block_info::BlockInfo; +use dpp::document::property_names::PRICE; +use dpp::document::{property_names, Document, DocumentV0Getters, DocumentV0Setters}; +use dpp::platform_value::Identifier; +use std::sync::Arc; + +use dpp::ProtocolError; +use dpp::state_transition::documents_batch_transition::document_transition::document_purchase_transition::DocumentPurchaseTransitionV0; +use crate::drive::contract::DataContractFetchInfo; +use crate::state_transition_action::document::documents_batch::document_transition::document_purchase_transition_action::v0::DocumentPurchaseTransitionActionV0; +use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::{DocumentBaseTransitionAction, DocumentBaseTransitionActionAccessorsV0}; + +impl DocumentPurchaseTransitionActionV0 { + /// try from borrowed + pub fn try_from_borrowed_document_purchase_transition( + document_purchase_transition: &DocumentPurchaseTransitionV0, + original_document: Document, + purchaser_id: Identifier, + block_info: &BlockInfo, + get_data_contract: impl Fn(Identifier) -> Result, ProtocolError>, + ) -> Result { + let DocumentPurchaseTransitionV0 { base, price, .. } = document_purchase_transition; + let base = + DocumentBaseTransitionAction::from_borrowed_base_transition_with_contract_lookup( + base, + get_data_contract, + )?; + + let original_owner_id = original_document.owner_id(); + + let mut modified_document = original_document; + + modified_document.bump_revision(); + + // We must remove the price if there is one + modified_document.properties_mut().remove(PRICE); + + modified_document.set_owner_id(purchaser_id); + + if base.document_type_field_is_required(property_names::TRANSFERRED_AT)? { + modified_document.set_transferred_at(Some(block_info.time_ms)); + } + + if base.document_type_field_is_required(property_names::TRANSFERRED_AT_BLOCK_HEIGHT)? { + modified_document.set_transferred_at_block_height(Some(block_info.height)); + } + + if base.document_type_field_is_required(property_names::TRANSFERRED_AT_CORE_BLOCK_HEIGHT)? { + modified_document.set_transferred_at_core_block_height(Some(block_info.core_height)); + } + + Ok(DocumentPurchaseTransitionActionV0 { + base, + document: modified_document, + original_owner_id, + price: *price, + }) + } +} diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/v0/transformer.rs index aec0832019..88f6d0776a 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/v0/transformer.rs @@ -1,5 +1,6 @@ use dpp::block::block_info::BlockInfo; -use dpp::document::{property_names, Document, DocumentV0Setters}; +use dpp::document::property_names::PRICE; +use dpp::document::{property_names, Document, DocumentV0Getters, DocumentV0Setters}; use dpp::platform_value::Identifier; use std::sync::Arc; @@ -32,6 +33,11 @@ impl DocumentTransferTransitionActionV0 { modified_document.set_owner_id(*recipient_owner_id); + // We must remove the price + modified_document.properties_mut().remove(PRICE); + + modified_document.bump_revision(); + if base.document_type_field_is_required(property_names::TRANSFERRED_AT)? { modified_document.set_transferred_at(Some(block_info.time_ms)); } diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/mod.rs new file mode 100644 index 0000000000..c206f21da9 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/mod.rs @@ -0,0 +1,85 @@ +mod v0; + +use derive_more::From; +use dpp::document::Document; + +use dpp::platform_value::Identifier; +use dpp::ProtocolError; +pub use v0::*; + +use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionAction; +use dpp::version::PlatformVersion; + +/// transformer +pub mod transformer; + +/// action +#[derive(Debug, Clone, From)] +pub enum DocumentUpdatePriceTransitionAction { + /// v0 + V0(DocumentUpdatePriceTransitionActionV0), +} + +impl DocumentUpdatePriceTransitionActionAccessorsV0 for DocumentUpdatePriceTransitionAction { + fn base(&self) -> &DocumentBaseTransitionAction { + match self { + DocumentUpdatePriceTransitionAction::V0(v0) => &v0.base, + } + } + + fn base_owned(self) -> DocumentBaseTransitionAction { + match self { + DocumentUpdatePriceTransitionAction::V0(v0) => v0.base, + } + } + + fn document(&self) -> &Document { + match self { + DocumentUpdatePriceTransitionAction::V0(v0) => &v0.document, + } + } + + fn document_owned(self) -> Document { + match self { + DocumentUpdatePriceTransitionAction::V0(v0) => v0.document, + } + } +} + +/// document from update price transition +pub trait DocumentFromUpdatePriceTransitionAction { + /// Attempts to create a new `Document` from the given `DocumentUpdatePriceTransitionAction` reference and `owner_id`. + /// + /// # Arguments + /// + /// * `value` - A reference to the `DocumentUpdatePriceTransitionAction` containing information about the document being update_priced. + /// * `owner_id` - The `Identifier` of the document's owner. + /// + /// # Returns + /// + /// * `Result` - A new `Document` object if successful, otherwise a `ProtocolError`. + fn try_from_update_price_transition_action( + document_update_price_transition_action: &DocumentUpdatePriceTransitionAction, + owner_id: Identifier, + platform_version: &PlatformVersion, + ) -> Result + where + Self: Sized; + /// Attempts to create a new `Document` from the given `DocumentUpdatePriceTransitionAction` instance and `owner_id`. + /// + /// # Arguments + /// + /// * `value` - A `DocumentUpdatePriceTransitionAction` instance containing information about the document being update_priced. + /// * `owner_id` - The `Identifier` of the document's owner. + /// + /// # Returns + /// + /// * `Result` - A new `Document` object if successful, otherwise a `ProtocolError`. + fn try_from_owned_update_price_transition_action( + document_update_price_transition_action: DocumentUpdatePriceTransitionAction, + owner_id: Identifier, + platform_version: &PlatformVersion, + ) -> Result + where + Self: Sized; +} diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/transformer.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/transformer.rs new file mode 100644 index 0000000000..f52e99d0d6 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/transformer.rs @@ -0,0 +1,31 @@ +use dpp::block::block_info::BlockInfo; +use dpp::document::Document; +use dpp::platform_value::Identifier; +use std::sync::Arc; + +use dpp::ProtocolError; +use dpp::state_transition::documents_batch_transition::document_transition::DocumentUpdatePriceTransition; +use crate::drive::contract::DataContractFetchInfo; +use crate::state_transition_action::document::documents_batch::document_transition::document_update_price_transition_action::{DocumentUpdatePriceTransitionAction, DocumentUpdatePriceTransitionActionV0}; + +impl DocumentUpdatePriceTransitionAction { + /// try from borrowed + pub fn try_from_borrowed_document_update_price_transition( + document_update_price_transition: &DocumentUpdatePriceTransition, + original_document: Document, + block_info: &BlockInfo, + get_data_contract: impl Fn(Identifier) -> Result, ProtocolError>, + ) -> Result { + match document_update_price_transition { + DocumentUpdatePriceTransition::V0(v0) => Ok( + DocumentUpdatePriceTransitionActionV0::try_from_borrowed_document_update_price_transition( + v0, + original_document, + block_info, + get_data_contract, + )? + .into(), + ), + } + } +} diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/v0/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/v0/mod.rs new file mode 100644 index 0000000000..37f3f8100c --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/v0/mod.rs @@ -0,0 +1,26 @@ +pub mod transformer; + +use dpp::document::Document; + +use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionAction; + +/// document transfer transition action v0 +#[derive(Debug, Clone)] +pub struct DocumentUpdatePriceTransitionActionV0 { + /// Document Base Transition + pub base: DocumentBaseTransitionAction, + /// The new document to be updated + pub document: Document, +} + +/// document transfer transition action accessors v0 +pub trait DocumentUpdatePriceTransitionActionAccessorsV0 { + /// base + fn base(&self) -> &DocumentBaseTransitionAction; + /// base owned + fn base_owned(self) -> DocumentBaseTransitionAction; + /// the document with updated price to be reinserted as a ref + fn document(&self) -> &Document; + /// the document with updated price to be reinserted as owned + fn document_owned(self) -> Document; +} diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/v0/transformer.rs new file mode 100644 index 0000000000..6054d09f9b --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/v0/transformer.rs @@ -0,0 +1,51 @@ +use dpp::block::block_info::BlockInfo; +use dpp::document::property_names::PRICE; +use dpp::document::{property_names, Document, DocumentV0Setters}; +use dpp::platform_value::Identifier; +use std::sync::Arc; + +use dpp::ProtocolError; +use dpp::state_transition::documents_batch_transition::document_transition::document_update_price_transition::DocumentUpdatePriceTransitionV0; +use crate::drive::contract::DataContractFetchInfo; +use crate::state_transition_action::document::documents_batch::document_transition::document_update_price_transition_action::v0::DocumentUpdatePriceTransitionActionV0; +use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::{DocumentBaseTransitionAction, DocumentBaseTransitionActionAccessorsV0}; + +impl DocumentUpdatePriceTransitionActionV0 { + /// try from borrowed + pub fn try_from_borrowed_document_update_price_transition( + document_update_price_transition: &DocumentUpdatePriceTransitionV0, + original_document: Document, + block_info: &BlockInfo, + get_data_contract: impl Fn(Identifier) -> Result, ProtocolError>, + ) -> Result { + let DocumentUpdatePriceTransitionV0 { base, price, .. } = document_update_price_transition; + let base = + DocumentBaseTransitionAction::from_borrowed_base_transition_with_contract_lookup( + base, + get_data_contract, + )?; + + let mut modified_document = original_document; + + modified_document.set_u64(PRICE, *price); + + modified_document.bump_revision(); + + if base.document_type_field_is_required(property_names::UPDATED_AT)? { + modified_document.set_updated_at(Some(block_info.time_ms)); + } + + if base.document_type_field_is_required(property_names::UPDATED_AT_BLOCK_HEIGHT)? { + modified_document.set_updated_at_block_height(Some(block_info.height)); + } + + if base.document_type_field_is_required(property_names::UPDATED_AT_CORE_BLOCK_HEIGHT)? { + modified_document.set_updated_at_core_block_height(Some(block_info.core_height)); + } + + Ok(DocumentUpdatePriceTransitionActionV0 { + base, + document: modified_document, + }) + } +} diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/mod.rs index d5df86cb32..51c7f19d2d 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/mod.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/mod.rs @@ -5,10 +5,14 @@ pub mod document_base_transition_action; pub mod document_create_transition_action; /// document_delete_transition_action pub mod document_delete_transition_action; +/// document_purchase_transition_action +pub mod document_purchase_transition_action; /// document_replace_transition_action pub mod document_replace_transition_action; /// document_transfer_transition_action pub mod document_transfer_transition_action; +/// document_update_price_transition_action +pub mod document_update_price_transition_action; pub use dpp::state_transition::documents_batch_transition::document_transition::action_type::DocumentTransitionActionType; @@ -19,7 +23,9 @@ use crate::state_transition_action::document::documents_batch::document_transiti use crate::state_transition_action::document::documents_batch::document_transition::document_delete_transition_action::DocumentDeleteTransitionAction; use crate::state_transition_action::document::documents_batch::document_transition::document_replace_transition_action::{DocumentReplaceTransitionAction, DocumentReplaceTransitionActionAccessorsV0}; use crate::state_transition_action::document::documents_batch::document_transition::document_delete_transition_action::v0::DocumentDeleteTransitionActionAccessorsV0; +use crate::state_transition_action::document::documents_batch::document_transition::document_purchase_transition_action::{DocumentPurchaseTransitionAction, DocumentPurchaseTransitionActionAccessorsV0}; use crate::state_transition_action::document::documents_batch::document_transition::document_transfer_transition_action::{DocumentTransferTransitionAction, DocumentTransferTransitionActionAccessorsV0}; +use crate::state_transition_action::document::documents_batch::document_transition::document_update_price_transition_action::{DocumentUpdatePriceTransitionAction, DocumentUpdatePriceTransitionActionAccessorsV0}; use crate::state_transition_action::system::bump_identity_data_contract_nonce_action::BumpIdentityDataContractNonceAction; /// version @@ -36,6 +42,10 @@ pub enum DocumentTransitionAction { DeleteAction(DocumentDeleteTransitionAction), /// transfer TransferAction(DocumentTransferTransitionAction), + /// purchase + PurchaseAction(DocumentPurchaseTransitionAction), + /// update price + UpdatePriceAction(DocumentUpdatePriceTransitionAction), /// bump identity data contract nonce BumpIdentityDataContractNonce(BumpIdentityDataContractNonceAction), } @@ -48,6 +58,8 @@ impl DocumentTransitionAction { DocumentTransitionAction::DeleteAction(d) => Some(d.base()), DocumentTransitionAction::ReplaceAction(d) => Some(d.base()), DocumentTransitionAction::TransferAction(d) => Some(d.base()), + DocumentTransitionAction::PurchaseAction(d) => Some(d.base()), + DocumentTransitionAction::UpdatePriceAction(d) => Some(d.base()), DocumentTransitionAction::BumpIdentityDataContractNonce(_) => None, } } @@ -59,6 +71,8 @@ impl DocumentTransitionAction { DocumentTransitionAction::DeleteAction(d) => Some(d.base_owned()), DocumentTransitionAction::ReplaceAction(d) => Some(d.base_owned()), DocumentTransitionAction::TransferAction(d) => Some(d.base_owned()), + DocumentTransitionAction::PurchaseAction(d) => Some(d.base_owned()), + DocumentTransitionAction::UpdatePriceAction(d) => Some(d.base_owned()), DocumentTransitionAction::BumpIdentityDataContractNonce(_) => None, } } diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/mod.rs index d6581cd9d1..fc5de09a35 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/mod.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/mod.rs @@ -3,6 +3,7 @@ use crate::state_transition_action::document::documents_batch::v0::DocumentsBatc use derive_more::From; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; +use dpp::fee::Credits; use dpp::identity::SecurityLevel; use dpp::platform_value::Identifier; use dpp::prelude::UserFeeIncrease; @@ -73,6 +74,13 @@ impl DocumentsBatchTransitionAction { } impl DocumentsBatchTransitionAction { + /// The sum of all purchases amounts for all purchase transitions in the batch + pub fn all_purchases_amount(&self) -> Option { + match self { + DocumentsBatchTransitionAction::V0(v0) => v0.all_purchases_amount(), + } + } + /// Determines the security level requirements for the batch transition action. /// /// This method performs the following steps: diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/v0/mod.rs b/packages/rs-drive/src/state_transition_action/document/documents_batch/v0/mod.rs index 6fef9bd853..4d1ccce401 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/document/documents_batch/v0/mod.rs @@ -1,6 +1,8 @@ +use dpp::fee::Credits; use crate::state_transition_action::document::documents_batch::document_transition::DocumentTransitionAction; use dpp::identifier::Identifier; use dpp::prelude::UserFeeIncrease; +use crate::state_transition_action::document::documents_batch::document_transition::document_purchase_transition_action::DocumentPurchaseTransitionActionAccessorsV0; /// action v0 #[derive(Default, Debug, Clone)] @@ -12,3 +14,22 @@ pub struct DocumentsBatchTransitionActionV0 { /// fee multiplier pub user_fee_increase: UserFeeIncrease, } + +impl DocumentsBatchTransitionActionV0 { + pub(super) fn all_purchases_amount(&self) -> Option { + let (total, any_purchases) = self + .transitions + .iter() + .filter_map(|transition| match transition { + DocumentTransitionAction::PurchaseAction(purchase) => Some(purchase.price()), + _ => None, + }) + .fold((0, false), |(acc, _), price| (acc + price, true)); + + if any_purchases { + Some(total) // Return the sum as Some(Credits) if there were any purchases + } else { + None // Return None if no purchases were found + } + } +} diff --git a/packages/rs-drive/tests/deterministic_root_hash.rs b/packages/rs-drive/tests/deterministic_root_hash.rs index e038574573..fa6ecc9091 100644 --- a/packages/rs-drive/tests/deterministic_root_hash.rs +++ b/packages/rs-drive/tests/deterministic_root_hash.rs @@ -446,7 +446,7 @@ fn test_root_hash_with_batches(drive: &Drive, db_transaction: &Transaction) { .unwrap() .expect("should return app hash"); - let expected_app_hash = "8880c628746348b09621b00589ccf856f75634388436a105473eb4506bb7e85e"; + let expected_app_hash = "fa23fefadd8b0254b9e4c594f09026c070148f5de9c39ff9ea227a327761e062"; assert_eq!(hex::encode(app_hash), expected_app_hash); } diff --git a/packages/rs-drive/tests/query_tests.rs b/packages/rs-drive/tests/query_tests.rs index a696c6df34..9a0e033391 100644 --- a/packages/rs-drive/tests/query_tests.rs +++ b/packages/rs-drive/tests/query_tests.rs @@ -993,8 +993,8 @@ fn test_family_basic_queries() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 90, 210, 2, 14, 207, 220, 54, 103, 243, 153, 202, 228, 38, 19, 30, 201, 119, 135, 210, 26, - 216, 14, 17, 94, 98, 181, 133, 247, 36, 139, 235, 67, + 32, 210, 24, 196, 148, 43, 20, 34, 0, 116, 183, 136, 32, 210, 163, 183, 214, 6, 152, 86, + 46, 45, 88, 13, 23, 41, 37, 70, 129, 119, 211, 12, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -2305,8 +2305,8 @@ fn test_family_basic_queries() { assert_eq!( root_hash.as_slice(), vec![ - 60, 109, 98, 63, 192, 76, 21, 51, 95, 13, 145, 173, 155, 30, 5, 194, 221, 33, 152, 195, - 108, 127, 146, 37, 82, 5, 166, 38, 67, 162, 1, 83, + 251, 69, 177, 93, 128, 236, 106, 87, 205, 123, 80, 61, 44, 107, 186, 193, 22, 192, 239, + 7, 107, 110, 97, 197, 59, 245, 26, 12, 63, 91, 248, 231, ], ); } @@ -2452,8 +2452,8 @@ fn test_family_starts_at_queries() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 90, 210, 2, 14, 207, 220, 54, 103, 243, 153, 202, 228, 38, 19, 30, 201, 119, 135, 210, 26, - 216, 14, 17, 94, 98, 181, 133, 247, 36, 139, 235, 67, + 32, 210, 24, 196, 148, 43, 20, 34, 0, 116, 183, 136, 32, 210, 163, 183, 214, 6, 152, 86, + 46, 45, 88, 13, 23, 41, 37, 70, 129, 119, 211, 12, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -2894,8 +2894,8 @@ fn test_family_with_nulls_query() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 124, 137, 76, 15, 82, 78, 62, 179, 206, 204, 2, 84, 187, 107, 28, 121, 186, 221, 98, 66, - 187, 78, 66, 70, 54, 10, 193, 108, 39, 59, 195, 209, + 92, 186, 224, 49, 242, 195, 32, 14, 46, 55, 244, 57, 55, 191, 10, 119, 228, 132, 91, 235, + 170, 114, 36, 41, 126, 136, 180, 51, 132, 17, 26, 182, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -3017,8 +3017,8 @@ fn test_query_with_cached_contract() { // Make sure the state is deterministic let expected_app_hash = vec![ - 90, 210, 2, 14, 207, 220, 54, 103, 243, 153, 202, 228, 38, 19, 30, 201, 119, 135, 210, 26, - 216, 14, 17, 94, 98, 181, 133, 247, 36, 139, 235, 67, + 32, 210, 24, 196, 148, 43, 20, 34, 0, 116, 183, 136, 32, 210, 163, 183, 214, 6, 152, 86, + 46, 45, 88, 13, 23, 41, 37, 70, 129, 119, 211, 12, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -3166,8 +3166,8 @@ fn test_dpns_query() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 175, 37, 171, 184, 32, 136, 247, 111, 230, 81, 39, 88, 130, 203, 38, 44, 228, 121, 233, - 118, 123, 8, 192, 213, 216, 249, 146, 44, 95, 0, 130, 52, + 244, 146, 123, 117, 189, 33, 121, 197, 170, 145, 77, 125, 25, 189, 87, 118, 50, 94, 170, 7, + 21, 208, 63, 241, 89, 4, 243, 50, 118, 21, 49, 24, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -3718,8 +3718,8 @@ fn test_dpns_query_start_at() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 175, 37, 171, 184, 32, 136, 247, 111, 230, 81, 39, 88, 130, 203, 38, 44, 228, 121, 233, - 118, 123, 8, 192, 213, 216, 249, 146, 44, 95, 0, 130, 52, + 244, 146, 123, 117, 189, 33, 121, 197, 170, 145, 77, 125, 25, 189, 87, 118, 50, 94, 170, 7, + 21, 208, 63, 241, 89, 4, 243, 50, 118, 21, 49, 24, ]; assert_eq!(root_hash.as_slice(), expected_app_hash,); @@ -3812,8 +3812,8 @@ fn test_dpns_query_start_after() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 175, 37, 171, 184, 32, 136, 247, 111, 230, 81, 39, 88, 130, 203, 38, 44, 228, 121, 233, - 118, 123, 8, 192, 213, 216, 249, 146, 44, 95, 0, 130, 52, + 244, 146, 123, 117, 189, 33, 121, 197, 170, 145, 77, 125, 25, 189, 87, 118, 50, 94, 170, 7, + 21, 208, 63, 241, 89, 4, 243, 50, 118, 21, 49, 24, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -3906,8 +3906,8 @@ fn test_dpns_query_start_at_desc() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 175, 37, 171, 184, 32, 136, 247, 111, 230, 81, 39, 88, 130, 203, 38, 44, 228, 121, 233, - 118, 123, 8, 192, 213, 216, 249, 146, 44, 95, 0, 130, 52, + 244, 146, 123, 117, 189, 33, 121, 197, 170, 145, 77, 125, 25, 189, 87, 118, 50, 94, 170, 7, + 21, 208, 63, 241, 89, 4, 243, 50, 118, 21, 49, 24, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -4000,8 +4000,8 @@ fn test_dpns_query_start_after_desc() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 175, 37, 171, 184, 32, 136, 247, 111, 230, 81, 39, 88, 130, 203, 38, 44, 228, 121, 233, - 118, 123, 8, 192, 213, 216, 249, 146, 44, 95, 0, 130, 52, + 244, 146, 123, 117, 189, 33, 121, 197, 170, 145, 77, 125, 25, 189, 87, 118, 50, 94, 170, 7, + 21, 208, 63, 241, 89, 4, 243, 50, 118, 21, 49, 24, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -4192,8 +4192,8 @@ fn test_dpns_query_start_at_with_null_id() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 1, 56, 101, 133, 212, 109, 114, 252, 181, 180, 21, 151, 38, 31, 9, 88, 2, 61, 230, 165, - 228, 57, 90, 132, 94, 38, 166, 89, 44, 13, 49, 115, + 217, 196, 25, 2, 88, 47, 16, 244, 117, 34, 65, 18, 208, 158, 14, 207, 158, 105, 191, 62, + 108, 124, 189, 159, 196, 137, 212, 243, 65, 230, 231, 95, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -4393,8 +4393,8 @@ fn test_dpns_query_start_after_with_null_id() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 1, 56, 101, 133, 212, 109, 114, 252, 181, 180, 21, 151, 38, 31, 9, 88, 2, 61, 230, 165, - 228, 57, 90, 132, 94, 38, 166, 89, 44, 13, 49, 115, + 217, 196, 25, 2, 88, 47, 16, 244, 117, 34, 65, 18, 208, 158, 14, 207, 158, 105, 191, 62, + 108, 124, 189, 159, 196, 137, 212, 243, 65, 230, 231, 95, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -4598,8 +4598,8 @@ fn test_dpns_query_start_after_with_null_id_desc() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 1, 56, 101, 133, 212, 109, 114, 252, 181, 180, 21, 151, 38, 31, 9, 88, 2, 61, 230, 165, - 228, 57, 90, 132, 94, 38, 166, 89, 44, 13, 49, 115, + 217, 196, 25, 2, 88, 47, 16, 244, 117, 34, 65, 18, 208, 158, 14, 207, 158, 105, 191, 62, + 108, 124, 189, 159, 196, 137, 212, 243, 65, 230, 231, 95, ]; assert_eq!(root_hash.as_slice(), expected_app_hash,); diff --git a/packages/rs-drive/tests/query_tests_history.rs b/packages/rs-drive/tests/query_tests_history.rs index ef1e5528fe..d89480eb01 100644 --- a/packages/rs-drive/tests/query_tests_history.rs +++ b/packages/rs-drive/tests/query_tests_history.rs @@ -291,8 +291,8 @@ fn test_query_historical() { assert_eq!( root_hash.as_slice(), vec![ - 54, 217, 155, 152, 174, 237, 193, 15, 240, 181, 31, 17, 238, 127, 246, 92, 20, 222, 37, - 39, 104, 146, 240, 98, 159, 130, 29, 227, 5, 94, 69, 207, + 163, 151, 181, 112, 234, 184, 171, 83, 83, 105, 116, 97, 25, 160, 197, 58, 81, 214, + 243, 144, 11, 91, 223, 83, 71, 99, 170, 203, 145, 244, 137, 134, ] ); @@ -1655,8 +1655,8 @@ fn test_query_historical() { assert_eq!( root_hash.as_slice(), vec![ - 117, 239, 44, 103, 118, 107, 30, 109, 225, 15, 234, 90, 59, 0, 22, 79, 32, 4, 94, 225, - 241, 206, 146, 22, 138, 217, 87, 208, 96, 176, 216, 114 + 212, 52, 34, 33, 150, 181, 101, 7, 122, 203, 197, 177, 146, 225, 160, 186, 49, 229, 70, + 206, 170, 180, 253, 90, 90, 188, 107, 108, 162, 216, 195, 81 ] ); } diff --git a/packages/rs-json-schema-compatibility-validator/src/rules/rule_set.rs b/packages/rs-json-schema-compatibility-validator/src/rules/rule_set.rs index f04f513e27..5479866989 100644 --- a/packages/rs-json-schema-compatibility-validator/src/rules/rule_set.rs +++ b/packages/rs-json-schema-compatibility-validator/src/rules/rule_set.rs @@ -1374,5 +1374,356 @@ pub static KEYWORD_COMPATIBILITY_RULES: Lazy { + /// Tries to purchase a document on platform + /// Setting settings to `None` sets default connection behavior + async fn purchase_document( + &self, + price: Credits, + sdk: &Sdk, + document_type: DocumentType, + purchaser_id: Identifier, + identity_public_key: IdentityPublicKey, + signer: &S, + settings: Option, + ) -> Result; + + /// Waits for the response of a state transition after it has been broadcast + async fn wait_for_response( + &self, + sdk: &Sdk, + state_transition: StateTransition, + data_contract: Arc, + ) -> Result; + + /// Tries to purchase a document on platform and waits for the response + async fn purchase_document_and_wait_for_response( + &self, + price: Credits, + sdk: &Sdk, + document_type: DocumentType, + purchaser_id: Identifier, + identity_public_key: IdentityPublicKey, + data_contract: Arc, + signer: &S, + ) -> Result; +} + +#[async_trait::async_trait] +impl PurchaseDocument for Document { + async fn purchase_document( + &self, + price: Credits, + sdk: &Sdk, + document_type: DocumentType, + purchaser_id: Identifier, + identity_public_key: IdentityPublicKey, + signer: &S, + settings: Option, + ) -> Result { + let new_identity_contract_nonce = sdk + .get_identity_contract_nonce( + purchaser_id, + document_type.data_contract_id(), + true, + settings, + ) + .await?; + + let settings = settings.unwrap_or_default(); + + let transition = DocumentsBatchTransition::new_document_purchase_transition_from_document( + self.clone(), + document_type.as_ref(), + purchaser_id, + price, + &identity_public_key, + new_identity_contract_nonce, + settings.user_fee_increase.unwrap_or_default(), + signer, + sdk.version(), + None, + None, + None, + )?; + + let request = transition.broadcast_request_for_state_transition()?; + + request + .clone() + .execute(sdk, settings.request_settings) + .await?; + + // response is empty for a broadcast, result comes from the stream wait for state transition result + + Ok(transition) + } + + async fn wait_for_response( + &self, + sdk: &Sdk, + state_transition: StateTransition, + data_contract: Arc, + ) -> Result { + let request = state_transition.wait_for_state_transition_result_request()?; + + let response = request.execute(sdk, RequestSettings::default()).await?; + + let block_info = block_info_from_metadata(response.metadata()?)?; + + let proof = response.proof_owned()?; + + let (_, result) = Drive::verify_state_transition_was_executed_with_proof( + &state_transition, + &block_info, + proof.grovedb_proof.as_slice(), + &|_| Ok(Some(data_contract.clone())), + sdk.version(), + )?; + + match result { + StateTransitionProofResult::VerifiedDocuments(mut documents) => { + let document = documents + .remove(self.id_ref()) + .ok_or(Error::InvalidProvedResponse( + "did not prove the sent document".to_string(), + ))? + .ok_or(Error::InvalidProvedResponse( + "expected there to actually be a document".to_string(), + ))?; + Ok(document) + } + _ => Err(Error::DapiClientError("proved a non document".to_string())), + } + } + + async fn purchase_document_and_wait_for_response( + &self, + price: Credits, + sdk: &Sdk, + document_type: DocumentType, + purchaser_id: Identifier, + identity_public_key: IdentityPublicKey, + data_contract: Arc, + signer: &S, + ) -> Result { + let state_transition = self + .purchase_document( + price, + sdk, + document_type, + purchaser_id, + identity_public_key, + signer, + None, + ) + .await?; + + let document = >::wait_for_response( + self, + sdk, + state_transition, + data_contract, + ) + .await?; + + Ok(document) + } +} diff --git a/packages/rs-sdk/src/platform/transition/update_price_of_document.rs b/packages/rs-sdk/src/platform/transition/update_price_of_document.rs new file mode 100644 index 0000000000..93da9aaf2b --- /dev/null +++ b/packages/rs-sdk/src/platform/transition/update_price_of_document.rs @@ -0,0 +1,168 @@ +use crate::platform::transition::broadcast_request::BroadcastRequestForStateTransition; +use std::sync::Arc; + +use crate::{Error, Sdk}; + +use crate::platform::block_info_from_metadata::block_info_from_metadata; +use crate::platform::transition::put_settings::PutSettings; +use dapi_grpc::platform::VersionedGrpcResponse; +use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; +use dpp::data_contract::document_type::DocumentType; +use dpp::data_contract::DataContract; +use dpp::document::{Document, DocumentV0Getters}; +use dpp::fee::Credits; +use dpp::identity::signer::Signer; +use dpp::identity::IdentityPublicKey; +use dpp::state_transition::documents_batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; +use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; +use dpp::state_transition::proof_result::StateTransitionProofResult; +use dpp::state_transition::StateTransition; +use drive::drive::Drive; +use rs_dapi_client::{DapiRequest, RequestSettings}; + +#[async_trait::async_trait] +/// A trait for updating the price of a document on Platform +pub trait UpdatePriceOfDocument { + /// Updates the price of a document on platform + /// Setting settings to `None` sets default connection behavior + async fn update_price_of_document( + &self, + price: Credits, + sdk: &Sdk, + document_type: DocumentType, + identity_public_key: IdentityPublicKey, + signer: &S, + settings: Option, + ) -> Result; + + /// Waits for the response of a state transition after it has been broadcast + async fn wait_for_response( + &self, + sdk: &Sdk, + state_transition: StateTransition, + data_contract: Arc, + ) -> Result; + + /// Updates the price of a document on platform and waits for the response + async fn update_price_of_document_and_wait_for_response( + &self, + price: Credits, + sdk: &Sdk, + document_type: DocumentType, + identity_public_key: IdentityPublicKey, + data_contract: Arc, + signer: &S, + ) -> Result; +} + +#[async_trait::async_trait] +impl UpdatePriceOfDocument for Document { + async fn update_price_of_document( + &self, + price: Credits, + sdk: &Sdk, + document_type: DocumentType, + identity_public_key: IdentityPublicKey, + signer: &S, + settings: Option, + ) -> Result { + let new_identity_contract_nonce = sdk + .get_identity_contract_nonce( + self.owner_id(), + document_type.data_contract_id(), + true, + settings, + ) + .await?; + + let settings = settings.unwrap_or_default(); + + let transition = + DocumentsBatchTransition::new_document_update_price_transition_from_document( + self.clone(), + document_type.as_ref(), + price, + &identity_public_key, + new_identity_contract_nonce, + settings.user_fee_increase.unwrap_or_default(), + signer, + sdk.version(), + None, + None, + None, + )?; + + let request = transition.broadcast_request_for_state_transition()?; + + request + .clone() + .execute(sdk, settings.request_settings) + .await?; + + // response is empty for a broadcast, result comes from the stream wait for state transition result + + Ok(transition) + } + + async fn wait_for_response( + &self, + sdk: &Sdk, + state_transition: StateTransition, + data_contract: Arc, + ) -> Result { + let request = state_transition.wait_for_state_transition_result_request()?; + + let response = request.execute(sdk, RequestSettings::default()).await?; + + let block_info = block_info_from_metadata(response.metadata()?)?; + + let proof = response.proof_owned()?; + + let (_, result) = Drive::verify_state_transition_was_executed_with_proof( + &state_transition, + &block_info, + proof.grovedb_proof.as_slice(), + &|_| Ok(Some(data_contract.clone())), + sdk.version(), + )?; + + match result { + StateTransitionProofResult::VerifiedDocuments(mut documents) => { + let document = documents + .remove(self.id_ref()) + .ok_or(Error::InvalidProvedResponse( + "did not prove the sent document".to_string(), + ))? + .ok_or(Error::InvalidProvedResponse( + "expected there to actually be a document".to_string(), + ))?; + Ok(document) + } + _ => Err(Error::DapiClientError("proved a non document".to_string())), + } + } + + async fn update_price_of_document_and_wait_for_response( + &self, + price: Credits, + sdk: &Sdk, + document_type: DocumentType, + identity_public_key: IdentityPublicKey, + data_contract: Arc, + signer: &S, + ) -> Result { + let state_transition = self + .update_price_of_document(price, sdk, document_type, identity_public_key, signer, None) + .await?; + + let document = >::wait_for_response( + self, + sdk, + state_transition, + data_contract, + ) + .await?; + + Ok(document) + } +} diff --git a/packages/rs-sdk/tests/fetch/common.rs b/packages/rs-sdk/tests/fetch/common.rs index 2ad8df272f..e286593bb6 100644 --- a/packages/rs-sdk/tests/fetch/common.rs +++ b/packages/rs-sdk/tests/fetch/common.rs @@ -29,6 +29,7 @@ pub fn mock_document_type() -> dpp::data_contract::document_type::DocumentType { None, false, false, + false, true, &mut vec![], platform_version, diff --git a/packages/rs-sdk/tests/vectors/document_list_document_query/msg_2024-04-20T17:32:57.729547000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/document_list_document_query/msg_2024-04-24T00:37:29.546154000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json similarity index 96% rename from packages/rs-sdk/tests/vectors/document_list_document_query/msg_2024-04-20T17:32:57.729547000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json rename to packages/rs-sdk/tests/vectors/document_list_document_query/msg_2024-04-24T00:37:29.546154000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json index 0528f564cf7e762ed8d49371c89b999bbd16f7ed..a20af6fd4f943c3e621a9b6381ae300774f904a6 100644 GIT binary patch delta 1793 zcmY*ZTWDNW6y@AIoyjDf+;eV{X_{p2y%7p6De1iOl9E9jeWVnaq=D1=4^0^-L%VTPxj<`vc+5{9v*bIs}8#Ayvd778K;n=RzKi- z)ha{fIZc~mnx?BXf00mz=I1>6=a79cQytsm@Xc!F;k8HOJ2hQQ)y^D?A6Vv8jq)i< z`g}2=TDdod%3r!XH<#}sbt>SeGfMO4t}?vTh*xhUJ=(Ox@P&FjUZ}@~2djJz8}R;b z2ai5A_*HJgS9OchbazzKs{k|kH1aJ zU_~BDs!dM5K)?1yd?HZ3DP%WRNB{eDlbU*jKLG~*0KK?bF58^MuZ)k@Lw)G@k!Jhk=(ys{eC z{}DIz%{46}7^l079=IWG-HW39!$rA5mX9{6kY8DYgV|1cYgNFLGU!5sZy{R>dj0j4VQt_+BmO@IloWiWIDICY^3{eCE*v3E7^2h(&B7MXa~PaK^(#w6x;!GdRp+fWvncy30~nX?opITm%!WXii8bwQEe#RAm%&s|oo$ zhT`EGY1L!H)6EwO{Jn^6xkIG#xU3kk(s&Asx=kbfG`}W!Bc7%4HJ+GF^LdGg>6Z-k zyM_izJ|C6*+n2DBBWluPrHJ=QJW5c~CSUVB?&fj=AoieI)XC0e=pL~AoX`a2IE}rM zu9bZm^0f6@y;%6PP&5(K;#*@EUBb)hDDv$(6!Sa?->}#9cAZ!!2OT2BnCK5VT3g l8wAv{Y)t=INFvcJc?ey4D%)fuVYm@d-yyIfez{ex{};%^28#dy delta 1823 zcmZ8iU1$_n6z0yZ$?j%1bMI`LZq{UGBD83uaeuPA5mSlOv|?M6g4$|Z^rfI^{eeQE zpu6frEB-Wkz*AaDqE7|U6{H0E7pYKeqL>$HE26%n760N(p|ooHommU5^DxZZx%Zs! zeBXD@oH!pIJRd$Y&$9A)>agZng&eK1I-|vWSH6_ZWioWodPU{viuGYKS18Pn`Tx1{ z8Ok^=`A#DpTCFLgZGJAKG<_e@bYRlR0!{xIyq}GQH(B^#2Rm`%Y_;ydBkJ#UxDr-| zHgwo@;CW-^OXTlzY3>$7BT>Wggwp)3uM97Y;P!i?a(HK2IZo;SNV26O?M}ITqXFrM z`*dyl+GcD=c+F)AF_gx~%YB+w-qLiFbST%A<<}dO%T4Y7ZcMlUGghamnlQYg8AtEc zyoufB8JU;Cx=V%L%AT2LQsFhS1 zH*`9pc{zBua#=dQ*A3;e-Tc5o9LS06CeVZ2FSRQ1<2L2)}POD3b!Z$U2yIk|N5Rg^tw3W+{x$5!H9wO~rrs>Q8 z!jIN6^FdHTmz^hw?Tq2;8v6#8X#OG!Tir?G4UXeS^^mF3sp-a7h6aitfOd>~yvYWN zK*E7uA>~dSq%4n0y&+h0q79#0(FOtuo^W`z=+v;$P_H)p$!xp~uGKsigA#UJ)AS-k z!_Z5rqlMUVEQ*KeKEpo&3138mhO&@QIWBjI&mbrnHrACI%9Qp^VdoE?e8Q? zID~Dy*#V@@&8kR;qK;Ku#N{-AzEg)!Gth*-Ic$z(j4JZ=Hsz7_utyzekp4Y}ed&$Onnb5{Tv+*YJ>$+zVZ5zmeJ7~veKA)?@YT&wl zfoa1_&eQ*pLarvI=cz8fEdx?ayuA~n=mUMU5$Q1=#cn%%j8vIQla6w&Y&Y#r`+PzA zcnZTos-vpoa9Y~w!IR$r`D;KZ{zTLGCANmx-aAYK(#cHkJlh$@zNfX1X{Xp?=@W=F8e7^Xf(xZZ zw~A@uTNomgE=)~`R!vzc6&Ef{h_o(DbRlJ{6e1hrf)>AX#~2BdOfvW8od5B?=G=kv{emMoeuIJyM^NY(_^eT3 zHLY-+-EZ#?EpOF01t@AYv38IzGv%1$INRb1u{wb>D0pSSz-czx>JnZuP{)hk9u(X@ zXkcZ(3E#`&<-`}e^i0Az1YZOUp2@Oe}UBB?m)gFb8$ndv_9CgZTmY}kXm-YNKvuh;7}FdQVSP#2Ts z#pc(&#mV@iBSfPy+;c2pIVF z4CFf%C#4|DdiO&%@fIAV9yE;_i66QZCL07Ha&w7m&eZ)m-nJcWc{`a!*oV@ z<6$fWEEI7eeO)uHOV~|X0a`Xi%a^lfyqFp^akN@scPdPk3zk?KRUoG;g^T)9tY3{N#a z?(!i^A71jy`4_omr)U7qWi32O$s6QihP-G$Ih?gJZ9MZ>?Pw&7hCv&1l;BMgHq=u^ zQ42muaj3rh!;%k8AaG`vgfVo)xc&QyE{a!-`t>Y-8;_Rx-fc~NR=25C88Q(hV$ zk<-dnciWMSjd7N!Wm*i?h?^3#wSw*#rz18i)O01KpdGH&SHY6nI2&a0uLcu}zw3eq z4)fd*GN(f%kTE@BtXsCLi&`#I$PP{?`S-ih|0-=UN%B_zI-=0e0Ngl0deU;9sX;!_ z!tfcVGXA9OoN^!LY0$H*o5F=|3pWVyW|hKSi~69Z7nlfRe(ieYWoS;-`mh!dQoP1a zMa;5Pui#e7gw1E|@fDJ)Nhsla9mlT1)69XW79e5ZIwvv;Z?h4N_*fJ~5^-#B5X#3J zsfNTXMyC3Y02xX!TIpw^sJ(rS<)&HsS|gEV%xH5pQ@5J*=N&gjCz%YhTxE&JbX4k4 w(SH&;p~f?AXua2OyH41o6drJ}w+Pun*1%??cB67_yVxuRu|!@5$40{c03Z-15&!@I delta 1710 zcmY*aO-vkR7|zZf3^rlDZ%9mR*_l}s!t%4bGrP;~^0VxQmOr5j0lKiT)T=24&#f)? zqC{Fq^JrotRz0ZIiqvp0kpLcy^iaWz2Y&({JTxYyCVDafe7@l#n@l#l^UeD{@ALD{ zck8~}>%Ir0zSWz)fzw(nhTStEE#ac9GF;Xai^r0V8;v4c+2wOr=PHX9ey}ArBSMQO zAp-$~8zfpg1ddDt;f#*8dWk2F#G7Xgyb}`$*BE%@2+WiO$`cZ=^-Jt`^1Dx9IV&;Q zDDYfLpt4TjpjzPLn8f3tfi>3HwgqA_>37@|qOOUp3la|o1+uxos+no`qqT5+bF$CG z=PaVIebXfHc8%0r2Uf3ze4q*oRT6g#6}au%u*L=Y>x7n$;vi(<>X6}cF_E|N3Y#wy z#L}?9wYb#c4raPd95f%d2##C$B`k5|l;e=N!wm-Z>jkzu1^y{XY@`kR+$wxY+{gvB zL=r1m8!vYWzso{*dMsQd0e9FV6EKkGLwc7$Z(c$~Nlc5xZ0-dNgh)t1Ak|rc{bn79 zj_!9@D>`UlCBkQNf&}OY2T1UQ#7@6JH^KZiDv%Eum^&*m(D4RYrPb-HIEC5I4od7g=Y#iA>XRI1@w`+pzT#gDcLJt{qL=>#@yi-HNfpO;!H z1uJ8EI$j-;__K$`3z@jqEpS+`<9;ZE59%aN^-5gI%hh84Qy=Q8j@_r+^)+W-Y@@mX zA{rC;lm+gGyi3*os9<3;w-SUMv-N^Vh}+G^=hF;9w= zB5i!;Cwg!rU4bc5C~_t;wF3LJZlF%5^aiq|c&kBRnl(QgH4se*=0#Vr^CrDFBD@hS zB2>LMX(N@fqX>PN6?oVxFw0yinff^0Hr1TWN&H1?AC9OzO3zL!zrvhE0pq&!lq~Ma>~=gHd9nwsokz(Pub?0`Az%pbQ}1DabHPrj2eljy~2wz z-RL<~3G^=A$;9HlY=y@po$GgF4i<)<#~&kSFqJv#6 zfs15GF`%}|E`y}tDEFKvi&tpIBmQT0F~CU#yG$HaN)M&dynT#AGKXr}gtwxK*vYq-lc`(|c;<8_c~r zu6BpYIU|dMqBmN;(Z(K0R=Y=OHe1kfnVpp7=eb`S*zF|}sx(!*c+CmokXkGIKMqQ@ z;uY_?iMVH7WvxA4Gd!-i*IQ_99%V{iWb#jDFr7I0+ac7iGPdU{wa(@_{f893xz8|C x$&+WfcVBI@z51Jk*GCek$?p@sHnvHQS_LYp4+lsdqr%sO7E2MTjit%j{{U2$D@gzV diff --git a/packages/rs-sdk/tests/vectors/document_list_document_query/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json b/packages/rs-sdk/tests/vectors/document_list_document_query/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json new file mode 100644 index 0000000000..ca9f21e752 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/document_list_document_query/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json @@ -0,0 +1 @@ +[183,213,77,25,46,6,139,69,130,159,190,72,193,8,131,191,105,54,247,90,65,206,156,68,41,55,185,93,114,209,189,211,207,236,91,86,76,47,4,205,217,32,122,8,123,104,168,118] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/document_list_document_query/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/document_list_document_query/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json deleted file mode 100644 index 7f0850a40d..0000000000 --- a/packages/rs-sdk/tests/vectors/document_list_document_query/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json +++ /dev/null @@ -1 +0,0 @@ -[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/document_read/msg_2024-04-20T17:32:57.732862000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/document_list_drive_query/msg_2024-04-24T00:37:29.544194000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json similarity index 96% rename from packages/rs-sdk/tests/vectors/document_read/msg_2024-04-20T17:32:57.732862000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json rename to packages/rs-sdk/tests/vectors/document_list_drive_query/msg_2024-04-24T00:37:29.544194000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json index 0528f564cf7e762ed8d49371c89b999bbd16f7ed..a20af6fd4f943c3e621a9b6381ae300774f904a6 100644 GIT binary patch delta 1793 zcmY*ZTWDNW6y@AIoyjDf+;eV{X_{p2y%7p6De1iOl9E9jeWVnaq=D1=4^0^-L%VTPxj<`vc+5{9v*bIs}8#Ayvd778K;n=RzKi- z)ha{fIZc~mnx?BXf00mz=I1>6=a79cQytsm@Xc!F;k8HOJ2hQQ)y^D?A6Vv8jq)i< z`g}2=TDdod%3r!XH<#}sbt>SeGfMO4t}?vTh*xhUJ=(Ox@P&FjUZ}@~2djJz8}R;b z2ai5A_*HJgS9OchbazzKs{k|kH1aJ zU_~BDs!dM5K)?1yd?HZ3DP%WRNB{eDlbU*jKLG~*0KK?bF58^MuZ)k@Lw)G@k!Jhk=(ys{eC z{}DIz%{46}7^l079=IWG-HW39!$rA5mX9{6kY8DYgV|1cYgNFLGU!5sZy{R>dj0j4VQt_+BmO@IloWiWIDICY^3{eCE*v3E7^2h(&B7MXa~PaK^(#w6x;!GdRp+fWvncy30~nX?opITm%!WXii8bwQEe#RAm%&s|oo$ zhT`EGY1L!H)6EwO{Jn^6xkIG#xU3kk(s&Asx=kbfG`}W!Bc7%4HJ+GF^LdGg>6Z-k zyM_izJ|C6*+n2DBBWluPrHJ=QJW5c~CSUVB?&fj=AoieI)XC0e=pL~AoX`a2IE}rM zu9bZm^0f6@y;%6PP&5(K;#*@EUBb)hDDv$(6!Sa?->}#9cAZ!!2OT2BnCK5VT3g l8wAv{Y)t=INFvcJc?ey4D%)fuVYm@d-yyIfez{ex{};%^28#dy delta 1823 zcmZ8iU1$_n6z0yZ$?j%1bMI`LZq{UGBD83uaeuPA5mSlOv|?M6g4$|Z^rfI^{eeQE zpu6frEB-Wkz*AaDqE7|U6{H0E7pYKeqL>$HE26%n760N(p|ooHommU5^DxZZx%Zs! zeBXD@oH!pIJRd$Y&$9A)>agZng&eK1I-|vWSH6_ZWioWodPU{viuGYKS18Pn`Tx1{ z8Ok^=`A#DpTCFLgZGJAKG<_e@bYRlR0!{xIyq}GQH(B^#2Rm`%Y_;ydBkJ#UxDr-| zHgwo@;CW-^OXTlzY3>$7BT>Wggwp)3uM97Y;P!i?a(HK2IZo;SNV26O?M}ITqXFrM z`*dyl+GcD=c+F)AF_gx~%YB+w-qLiFbST%A<<}dO%T4Y7ZcMlUGghamnlQYg8AtEc zyoufB8JU;Cx=V%L%AT2LQsFhS1 zH*`9pc{zBua#=dQ*A3;e-Tc5o9LS06CeVZ2FSRQ1<2L2)}POD3b!Z$U2yIk|N5Rg^tw3W+{x$5!H9wO~rrs>Q8 z!jIN6^FdHTmz^hw?Tq2;8v6#8X#OG!Tir?G4UXeS^^mF3sp-a7h6aitfOd>~yvYWN zK*E7uA>~dSq%4n0y&+h0q79#0(FOtuo^W`z=+v;$P_H)p$!xp~uGKsigA#UJ)AS-k z!_Z5rqlMUVEQ*KeKEpo&3138mhO&@QIWBjI&mbrnHrACI%9Qp^VdoE?e8Q? zID~Dy*#V@@&8kR;qK;Ku#N{-AzEg)!Gth*-Ic$z(j4JZ=Hsz7_utyzekp4Y}ed&$Onnb5{Tv+*YJ>$+zVZ5zmeJ7~veKA)?@YT&wl zfoa1_&eQ*pLarvI=cz8fEdx?ayuA~n=mUMU5$Q1=#cn%%j8vIQla6w&Y&Y#r`+PzA zcnZTos-vpoa9Y~w!IR$r`D;KZ{zTLGCANmx-aAYK(#cHkJlh$@zNfX1X{Xp?=@W=F8e7^Xf(xZZ zw~A@uTNomgE=)~`R!vzc6&Ef{h_o(DbRlJ{6e1hrf)>AX#~2BdOfvW8od5B?=G=kv{emMoeuIJyM^NY(_^eT3 zHLY-+-EZ#?EpOF01t@AYv38IzGv%1$INRb1u{wb>D0pSSz-czx>JnZuP{)hk9u(X@ zXkcZ(3E#`&<-`}e^i0Az1YZOUp2@Oe}UBB?m)gFb8$ndv_9CgZTmY}kXm-YNKvuh;7}FdQVSP#2Ts z#pc(&#mV@iBSfPy+;c2pIVF z4CFf%C#4|DdiO&%@fIAV9yE;_i66QZCL07Ha&w7m&eZ)m-nJcWc{`a!*oV@ z<6$fWEEI7eeO)uHOV~|X0a`Xi%a^lfyqFp^akN@scPdPk3zk?KRUoG;g^T)9tY3{N#a z?(!i^A71jy`4_omr)U7qWi32O$s6QihP-G$Ih?gJZ9MZ>?Pw&7hCv&1l;BMgHq=u^ zQ42muaj3rh!;%k8AaG`vgfVo)xc&QyE{a!-`t>Y-8;_Rx-fc~NR=25C88Q(hV$ zk<-dnciWMSjd7N!Wm*i?h?^3#wSw*#rz18i)O01KpdGH&SHY6nI2&a0uLcu}zw3eq z4)fd*GN(f%kTE@BtXsCLi&`#I$PP{?`S-ih|0-=UN%B_zI-=0e0Ngl0deU;9sX;!_ z!tfcVGXA9OoN^!LY0$H*o5F=|3pWVyW|hKSi~69Z7nlfRe(ieYWoS;-`mh!dQoP1a zMa;5Pui#e7gw1E|@fDJ)Nhsla9mlT1)69XW79e5ZIwvv;Z?h4N_*fJ~5^-#B5X#3J zsfNTXMyC3Y02xX!TIpw^sJ(rS<)&HsS|gEV%xH5pQ@5J*=N&gjCz%YhTxE&JbX4k4 w(SH&;p~f?AXua2OyH41o6drJ}w+Pun*1%??cB67_yVxuRu|!@5$40{c03Z-15&!@I delta 1710 zcmY*aO-vkR7|zZf3^rlDZ%9mR*_l}s!t%4bGrP;~^0VxQmOr5j0lKiT)T=24&#f)? zqC{Fq^JrotRz0ZIiqvp0kpLcy^iaWz2Y&({JTxYyCVDafe7@l#n@l#l^UeD{@ALD{ zck8~}>%Ir0zSWz)fzw(nhTStEE#ac9GF;Xai^r0V8;v4c+2wOr=PHX9ey}ArBSMQO zAp-$~8zfpg1ddDt;f#*8dWk2F#G7Xgyb}`$*BE%@2+WiO$`cZ=^-Jt`^1Dx9IV&;Q zDDYfLpt4TjpjzPLn8f3tfi>3HwgqA_>37@|qOOUp3la|o1+uxos+no`qqT5+bF$CG z=PaVIebXfHc8%0r2Uf3ze4q*oRT6g#6}au%u*L=Y>x7n$;vi(<>X6}cF_E|N3Y#wy z#L}?9wYb#c4raPd95f%d2##C$B`k5|l;e=N!wm-Z>jkzu1^y{XY@`kR+$wxY+{gvB zL=r1m8!vYWzso{*dMsQd0e9FV6EKkGLwc7$Z(c$~Nlc5xZ0-dNgh)t1Ak|rc{bn79 zj_!9@D>`UlCBkQNf&}OY2T1UQ#7@6JH^KZiDv%Eum^&*m(D4RYrPb-HIEC5I4od7g=Y#iA>XRI1@w`+pzT#gDcLJt{qL=>#@yi-HNfpO;!H z1uJ8EI$j-;__K$`3z@jqEpS+`<9;ZE59%aN^-5gI%hh84Qy=Q8j@_r+^)+W-Y@@mX zA{rC;lm+gGyi3*os9<3;w-SUMv-N^Vh}+G^=hF;9w= zB5i!;Cwg!rU4bc5C~_t;wF3LJZlF%5^aiq|c&kBRnl(QgH4se*=0#Vr^CrDFBD@hS zB2>LMX(N@fqX>PN6?oVxFw0yinff^0Hr1TWN&H1?AC9OzO3zL!zrvhE0pq&!lq~Ma>~=gHd9nwsokz(Pub?0`Az%pbQ}1DabHPrj2eljy~2wz z-RL<~3G^=A$;9HlY=y@po$GgF4i<)<#~&kSFqJv#6 zfs15GF`%}|E`y}tDEFKvi&tpIBmQT0F~CU#yG$HaN)M&dynT#AGKXr}gtwxK*vYq-lc`(|c;<8_c~r zu6BpYIU|dMqBmN;(Z(K0R=Y=OHe1kfnVpp7=eb`S*zF|}sx(!*c+CmokXkGIKMqQ@ z;uY_?iMVH7WvxA4Gd!-i*IQ_99%V{iWb#jDFr7I0+ac7iGPdU{wa(@_{f893xz8|C x$&+WfcVBI@z51Jk*GCek$?p@sHnvHQS_LYp4+lsdqr%sO7E2MTjit%j{{U2$D@gzV diff --git a/packages/rs-sdk/tests/vectors/document_list_drive_query/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json b/packages/rs-sdk/tests/vectors/document_list_drive_query/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json new file mode 100644 index 0000000000..ca9f21e752 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/document_list_drive_query/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json @@ -0,0 +1 @@ +[183,213,77,25,46,6,139,69,130,159,190,72,193,8,131,191,105,54,247,90,65,206,156,68,41,55,185,93,114,209,189,211,207,236,91,86,76,47,4,205,217,32,122,8,123,104,168,118] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/document_list_drive_query/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/document_list_drive_query/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json deleted file mode 100644 index 7f0850a40d..0000000000 --- a/packages/rs-sdk/tests/vectors/document_list_drive_query/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json +++ /dev/null @@ -1 +0,0 @@ -[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/document_read_no_document/msg_2024-04-20T17:32:57.729722000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/document_read/msg_2024-04-24T00:37:29.546204000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json similarity index 96% rename from packages/rs-sdk/tests/vectors/document_read_no_document/msg_2024-04-20T17:32:57.729722000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json rename to packages/rs-sdk/tests/vectors/document_read/msg_2024-04-24T00:37:29.546204000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json index 0528f564cf7e762ed8d49371c89b999bbd16f7ed..a20af6fd4f943c3e621a9b6381ae300774f904a6 100644 GIT binary patch delta 1793 zcmY*ZTWDNW6y@AIoyjDf+;eV{X_{p2y%7p6De1iOl9E9jeWVnaq=D1=4^0^-L%VTPxj<`vc+5{9v*bIs}8#Ayvd778K;n=RzKi- z)ha{fIZc~mnx?BXf00mz=I1>6=a79cQytsm@Xc!F;k8HOJ2hQQ)y^D?A6Vv8jq)i< z`g}2=TDdod%3r!XH<#}sbt>SeGfMO4t}?vTh*xhUJ=(Ox@P&FjUZ}@~2djJz8}R;b z2ai5A_*HJgS9OchbazzKs{k|kH1aJ zU_~BDs!dM5K)?1yd?HZ3DP%WRNB{eDlbU*jKLG~*0KK?bF58^MuZ)k@Lw)G@k!Jhk=(ys{eC z{}DIz%{46}7^l079=IWG-HW39!$rA5mX9{6kY8DYgV|1cYgNFLGU!5sZy{R>dj0j4VQt_+BmO@IloWiWIDICY^3{eCE*v3E7^2h(&B7MXa~PaK^(#w6x;!GdRp+fWvncy30~nX?opITm%!WXii8bwQEe#RAm%&s|oo$ zhT`EGY1L!H)6EwO{Jn^6xkIG#xU3kk(s&Asx=kbfG`}W!Bc7%4HJ+GF^LdGg>6Z-k zyM_izJ|C6*+n2DBBWluPrHJ=QJW5c~CSUVB?&fj=AoieI)XC0e=pL~AoX`a2IE}rM zu9bZm^0f6@y;%6PP&5(K;#*@EUBb)hDDv$(6!Sa?->}#9cAZ!!2OT2BnCK5VT3g l8wAv{Y)t=INFvcJc?ey4D%)fuVYm@d-yyIfez{ex{};%^28#dy delta 1823 zcmZ8iU1$_n6z0yZ$?j%1bMI`LZq{UGBD83uaeuPA5mSlOv|?M6g4$|Z^rfI^{eeQE zpu6frEB-Wkz*AaDqE7|U6{H0E7pYKeqL>$HE26%n760N(p|ooHommU5^DxZZx%Zs! zeBXD@oH!pIJRd$Y&$9A)>agZng&eK1I-|vWSH6_ZWioWodPU{viuGYKS18Pn`Tx1{ z8Ok^=`A#DpTCFLgZGJAKG<_e@bYRlR0!{xIyq}GQH(B^#2Rm`%Y_;ydBkJ#UxDr-| zHgwo@;CW-^OXTlzY3>$7BT>Wggwp)3uM97Y;P!i?a(HK2IZo;SNV26O?M}ITqXFrM z`*dyl+GcD=c+F)AF_gx~%YB+w-qLiFbST%A<<}dO%T4Y7ZcMlUGghamnlQYg8AtEc zyoufB8JU;Cx=V%L%AT2LQsFhS1 zH*`9pc{zBua#=dQ*A3;e-Tc5o9LS06CeVZ2FSRQ1<2L2)}POD3b!Z$U2yIk|N5Rg^tw3W+{x$5!H9wO~rrs>Q8 z!jIN6^FdHTmz^hw?Tq2;8v6#8X#OG!Tir?G4UXeS^^mF3sp-a7h6aitfOd>~yvYWN zK*E7uA>~dSq%4n0y&+h0q79#0(FOtuo^W`z=+v;$P_H)p$!xp~uGKsigA#UJ)AS-k z!_Z5rqlMUVEQ*KeKEpo&3138mhO&@QIWBjI&mbrnHrACI%9Qp^VdoE?e8Q? zID~Dy*#V@@&8kR;qK;Ku#N{-AzEg)!Gth*-Ic$z(j4JZ=Hsz7_utyzekp4Y}ed&$Onnb5{Tv+*YJ>$+zVZ5zmeJ7~veKA)?@YT&wl zfoa1_&eQ*pLarvI=cz8fEdx?ayuA~n=mUMU5$Q1=#cn%%j8vIQla6w&Y&Y#r`+PzA zcnZTos-vpoa9Y~w!IR$r`D;KZ{zTLGCANmx-aAYK(#cHkJlh$@zNfX1X{Xp?=@W=F8e7^Xf(xZZ zw~A@uTNomgE=)~`R!vzc6&Ef{h_o(DbRlJ{6e1hrf)>AX#~2BdOfvW8od5B?=G=kv{emMoeuIJyM^NY(_^eT3 zHLY-+-EZ#?EpOF01t@AYv38IzGv%1$INRb1u{wb>D0pSSz-czx>JnZuP{)hk9u(X@ zXkcZ(3E#`&<-`}e^i0Az1YZOUp2@Oe}UBB?m)gFb8$ndv_9CgZTmY}kXm-YNKvuh;7}FdQVSP#2Ts z#pc(&#mV@iBSfPy+;c2pIVF z4CFf%C#4|DdiO&%@fIAV9yE;_i66QZCL07Ha&w7m&eZ)m-nJcWc{`a!*oV@ z<6$fWEEI7eeO)uHOV~|X0a`Xi%a^lfyqFp^akN@scPdPk3zk?KRUoG;g^T)9tY3{N#a z?(!i^A71jy`4_omr)U7qWi32O$s6QihP-G$Ih?gJZ9MZ>?Pw&7hCv&1l;BMgHq=u^ zQ42muaj3rh!;%k8AaG`vgfVo)xc&QyE{a!-`t>Y-8;_Rx-fc~NR=25C88Q(hV$ zk<-dnciWMSjd7N!Wm*i?h?^3#wSw*#rz18i)O01KpdGH&SHY6nI2&a0uLcu}zw3eq z4)fd*GN(f%kTE@BtXsCLi&`#I$PP{?`S-ih|0-=UN%B_zI-=0e0Ngl0deU;9sX;!_ z!tfcVGXA9OoN^!LY0$H*o5F=|3pWVyW|hKSi~69Z7nlfRe(ieYWoS;-`mh!dQoP1a zMa;5Pui#e7gw1E|@fDJ)Nhsla9mlT1)69XW79e5ZIwvv;Z?h4N_*fJ~5^-#B5X#3J zsfNTXMyC3Y02xX!TIpw^sJ(rS<)&HsS|gEV%xH5pQ@5J*=N&gjCz%YhTxE&JbX4k4 w(SH&;p~f?AXua2OyH41o6drJ}w+Pun*1%??cB67_yVxuRu|!@5$40{c03Z-15&!@I delta 1710 zcmY*aO-vkR7|zZf3^rlDZ%9mR*_l}s!t%4bGrP;~^0VxQmOr5j0lKiT)T=24&#f)? zqC{Fq^JrotRz0ZIiqvp0kpLcy^iaWz2Y&({JTxYyCVDafe7@l#n@l#l^UeD{@ALD{ zck8~}>%Ir0zSWz)fzw(nhTStEE#ac9GF;Xai^r0V8;v4c+2wOr=PHX9ey}ArBSMQO zAp-$~8zfpg1ddDt;f#*8dWk2F#G7Xgyb}`$*BE%@2+WiO$`cZ=^-Jt`^1Dx9IV&;Q zDDYfLpt4TjpjzPLn8f3tfi>3HwgqA_>37@|qOOUp3la|o1+uxos+no`qqT5+bF$CG z=PaVIebXfHc8%0r2Uf3ze4q*oRT6g#6}au%u*L=Y>x7n$;vi(<>X6}cF_E|N3Y#wy z#L}?9wYb#c4raPd95f%d2##C$B`k5|l;e=N!wm-Z>jkzu1^y{XY@`kR+$wxY+{gvB zL=r1m8!vYWzso{*dMsQd0e9FV6EKkGLwc7$Z(c$~Nlc5xZ0-dNgh)t1Ak|rc{bn79 zj_!9@D>`UlCBkQNf&}OY2T1UQ#7@6JH^KZiDv%Eum^&*m(D4RYrPb-HIEC5I4od7g=Y#iA>XRI1@w`+pzT#gDcLJt{qL=>#@yi-HNfpO;!H z1uJ8EI$j-;__K$`3z@jqEpS+`<9;ZE59%aN^-5gI%hh84Qy=Q8j@_r+^)+W-Y@@mX zA{rC;lm+gGyi3*os9<3;w-SUMv-N^Vh}+G^=hF;9w= zB5i!;Cwg!rU4bc5C~_t;wF3LJZlF%5^aiq|c&kBRnl(QgH4se*=0#Vr^CrDFBD@hS zB2>LMX(N@fqX>PN6?oVxFw0yinff^0Hr1TWN&H1?AC9OzO3zL!zrvhE0pq&!lq~Ma>~=gHd9nwsokz(Pub?0`Az%pbQ}1DabHPrj2eljy~2wz z-RL<~3G^=A$;9HlY=y@po$GgF4i<)<#~&kSFqJv#6 zfs15GF`%}|E`y}tDEFKvi&tpIBmQT0F~CU#yG$HaN)M&dynT#AGKXr}gtwxK*vYq-lc`(|c;<8_c~r zu6BpYIU|dMqBmN;(Z(K0R=Y=OHe1kfnVpp7=eb`S*zF|}sx(!*c+CmokXkGIKMqQ@ z;uY_?iMVH7WvxA4Gd!-i*IQ_99%V{iWb#jDFr7I0+ac7iGPdU{wa(@_{f893xz8|C x$&+WfcVBI@z51Jk*GCek$?p@sHnvHQS_LYp4+lsdqr%sO7E2MTjit%j{{U2$D@gzV diff --git a/packages/rs-sdk/tests/vectors/document_read/msg_2024-04-20T17:32:57.805474000Z_DocumentQuery_90af5a08200f1b0e42dbd3ad7a6af38ff6415d9cabab87315b9d9d736194597f.json b/packages/rs-sdk/tests/vectors/document_read/msg_2024-04-24T00:37:29.611459000Z_DocumentQuery_254e866b054c1427a47d649d455dfd789f4e600ee4aa306f63d281b740f2d0e7.json similarity index 87% rename from packages/rs-sdk/tests/vectors/document_read/msg_2024-04-20T17:32:57.805474000Z_DocumentQuery_90af5a08200f1b0e42dbd3ad7a6af38ff6415d9cabab87315b9d9d736194597f.json rename to packages/rs-sdk/tests/vectors/document_read/msg_2024-04-24T00:37:29.611459000Z_DocumentQuery_254e866b054c1427a47d649d455dfd789f4e600ee4aa306f63d281b740f2d0e7.json index 1325a37dbf1ae244fe10f739c30802fef6748e81..e92d96a3240c50c2dde27a6c6b0b40b818c57a7a 100644 GIT binary patch delta 1710 zcmZ8iT})e598Zf6j>O(`&Sp$ZxwnimG<5B43$&#`**ahY)-u@mss)TA>SR>2X^e{l z6SoIHK=*ULIG8WK%*~kaWVW&CiwVnE;>$A47_TE)G4Vx*Z2r!z56&h{!_7VC|NHzi zyXg99(e?eH>)FGFSKdB4K6(6D`sK;p<9o&@#*dF5UP!neJnxRw;|1@F?z%YoyumGr zaKf$&H}K&{-VRs&!Y|%o3zw<{{vMK;Z;~+fN&MU;aG_q5g<~;X*y+P(eh+T-N_W&g z(_taUx92;hN(9P%|M^6s^=KV5VRb2dvrph`Na3qM>Ee7;Vjy9li$}|=B<^PU4M>=# z#OaWMpeeAwNi3vVCd%;1UWN6TKyzCaJS_sJ>WCx~!}*-$YJe~9L!n<_)^A|8R-ma@ zVx-qVu}Wc{7zuf-#zJOLa=OIMS_3yZbtNs~AvIAW@UT^CdMIxYc)v+tDy1;pFHs13 zaEhqU?J&?27w~jQyq;7j?v?nhSxNgz!tpRZ4_e5EC7u};CP~=Nh^%UfjRA>lN}{z|U@k`;h(t?VOqNI%dEZs)chWEM z15LV3b4J_L!fWk*HxG)kNF<60+awK%iv0rp34uTKg}b%Dq}VA@y+dO3kRVWr)qLr~ zkp_u`O>Lt#4x}vHKPcUH1K!D)@bn1egAys?nyK-JJlyKLz6Tf@1VlHnBizU+9Pq9ad?9SS1Cl+RM@PL z_$wq3;E0Wg#8?}}N>adT4MDi$4fw!s;*l-zMMk>AQM6L&Ja2!@+b4s}ErDuQD|Dz( zBXMI$Pz4>#5`pD>$<+@tj0q8JR+IpnY{tc;v5oHiPv)?VYdH%Z_V6Cr-RX-l)e>78 z1r{q6x~mK<4JqgE?x50zDRf%+I7z$7KI9W_3LZ$CxXViEw{^8H(y&Rwd#_UB8k5Mj zI!>>r71shzXDl*Oj-;c^-lt@cIi%cm<;Xtu93uT*oTjW}v{uJayK!eH^OP>dV3o0* z;qzOJ=Gq>KHFhG{BJpc8f4L*Zn8#&y;0E)b^6F)ps~eN3&* delta 1642 zcmYjRO-!3*98XI$VVS(o|K+f3(!MQZI1sSyTX;J@TDlE7zS?TGQa+0w)MR9E^B^C` zWeJmIzl(`(a56^uFyXRH2kJqi(aqx`n0Z{7!j49R_qTRc2sW!SzSzc#fnf)IVZr8zLMf?mJ78g@ zL2&Q9!mMLsC28RUM{p%3c%jQiuBfn5Yoj-&kZcj$Xjb@pKropRlrAbPv0E1Ws2%tBk9@_T2o z>^b3Bqf7m2i34jf{dC7OZo?LYv?qU4sX8f}KHSo{wdP!<4=%>^f+S@MsO$ zs@fSTLte`3my&F zxZa_#n6kNVXVEE(y6&y<5V{%_Y72sAl(wN&p^ZQ_!vpzBEEg;@>!;ovp2ig~5ko|( ziDbM^oRsNiK7@5oao`cHPhV5`jQeTwu2I(EA*xnqf|ND!@kPQd1 z)@I{oN?|V|=nrc(6xIvkPb6?V88jlz6Uw{23RC<%O=hQ47V7GgSkK!~q=15MJQ~>d z;nQkmoJHrLneSgpa$P!Yl}R*vaccd_kc~CQ zp>)wQane9*3kp_LkmET$x`Xl1(U~O~?P-N>3U}~arymKZKWk%$I$fo0X9_xIV$9OW zbc~X`W0ySK_Q*<5p|NPAlkvQh7r*Br>IRK>=SCb@v|`1%BV_k=nkid}KQGY+l**(s zn-Y9fE0|(}bVC2+8sBw_(PxWx)uB9@t~5mQ`?8oD#qmog@mAqw?BW zV*~7v|KJ;jHEnbKQ8Td6EZCMjw14*7VSgx)(ZSne~4 z!x%|^$h1G{X5VqO?>iMf9Mr@!taMTZ`(wU`$mp5b07cDM$hPP%bOMKJV5sc&D1>K}Zx}Ycy^wtSftr@JjTaUPt$i6%?HoT>emB7_LO4}A^B+Uz BCUpP+ diff --git a/packages/rs-sdk/tests/vectors/document_read/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json b/packages/rs-sdk/tests/vectors/document_read/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json new file mode 100644 index 0000000000..ca9f21e752 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/document_read/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json @@ -0,0 +1 @@ +[183,213,77,25,46,6,139,69,130,159,190,72,193,8,131,191,105,54,247,90,65,206,156,68,41,55,185,93,114,209,189,211,207,236,91,86,76,47,4,205,217,32,122,8,123,104,168,118] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/document_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/document_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json deleted file mode 100644 index 7f0850a40d..0000000000 --- a/packages/rs-sdk/tests/vectors/document_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json +++ /dev/null @@ -1 +0,0 @@ -[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/document_read_no_contract/msg_2024-04-20T17:32:57.733023000Z_GetDataContractRequest_e4cf74168e03a40bd159451456b501c1ba166a2dd8f6efb31b0289dc011da983.json b/packages/rs-sdk/tests/vectors/document_read_no_contract/msg_2024-04-24T00:37:29.543524000Z_GetDataContractRequest_e4cf74168e03a40bd159451456b501c1ba166a2dd8f6efb31b0289dc011da983.json similarity index 66% rename from packages/rs-sdk/tests/vectors/document_read_no_contract/msg_2024-04-20T17:32:57.733023000Z_GetDataContractRequest_e4cf74168e03a40bd159451456b501c1ba166a2dd8f6efb31b0289dc011da983.json rename to packages/rs-sdk/tests/vectors/document_read_no_contract/msg_2024-04-24T00:37:29.543524000Z_GetDataContractRequest_e4cf74168e03a40bd159451456b501c1ba166a2dd8f6efb31b0289dc011da983.json index 029dad249d0b7877bce734066cf8198a4275a588..c3d5d74ec7923105349b21fcece8b7684908cdde 100644 GIT binary patch literal 8844 zcmeI2OK;;w5QKB~uP}Jdfz^EPUkL(2D>0T3%XIWuAXxanXU3Mi;#c1Il4JJZH6Jt6 z(_LL%)AaYd`}^YCbU5zjr{c@~_jH+Wl<&W%tKBAD{r37KKP`X#|JVQC4;P>Qesyl~ ze3-vY$?>Pdd3t^Ll77D2z1;nBm!tGq(Du`5wOO53H-Supw$tumdrJ3;Xo~An>Hc~? zOyhdH+C7br^ZL(eGrqs6rtWXvoSx_PHcfDYg5tE>PvicWr&XtF&`{QDmn)?0oaXiX zIQ{^eZl--(`xR-$W_8@|SEnhPvU(iTJQwG@Tn7|~>3Dw3`*;Iv4o7y_{Kw)}y7`d3 zxcNF>AO3)G9&=+szHF}Z=L>tP8n1tH*4XfiO@UKp)V5I7LIfF2R#1|r#BW$06H6pl;9{W@eJFzX*crN%MN~}po zU{~gs7AA7j%PqHf4C^Y!bvYWgSMX=bMZDi)gty_ag#M~1Z>m*EO!7yRE%B+zet!uJ>I~SYB`|6 z07FPL7}9bdq!tkn+^CoZfhEWsj200Uo|Qxt8B@2_E)(46{Kja|bzvAN;r`&FBK6Ba zV6@uNj+S7@3k{Lj0o!Kxl10L>&YkyIfw@5lSvsnMr+Q35W{U;`EZ*27Kuf}~WE3r6 z97qV3I97UydLyX@MkbMkNWjl5et2wN4bf{X$w8KihMpzbmL|%$dHEb+u@Yvh;YKj` zIU#*eVggS&=1*AKA`GG)v+6=pCBHGt-6*O^5(PPyP_Y>qmjPf4lZ+IuEJtBBahnvG zt{MFeAe2%-OcFyZgC%U#YNTnPC>cK^Fr&o5mNg)n9e^%rxnZVRmFqDj8O0QY69Cq* z^pb6z`=TUAzR^ZwZt?6Q0|kpWmZ0P8*f3z1&h{)PKyr^z2^Oft3uGyjGcWU$Kz78F z;h1D@v}A>UNyT)V?6lCqY@(jmc67F*wCT?QOAN^W3XupZ1sTBupa>NsZO0eOWX3XR zlNdZlFs<%M7bQ|zBtEX;xeZU6EN88E&#{j2ENn&PgA*sIlT|~EcrbV5&cURn&6wak zFq$}H&HqdSlah=`MSU1{%4JCx`ycF81TkQT^#NEH_d)h14q4+}a)Q|W1Zh2s5-Dp# z91`GXZ+Ovewcv?hSB+f=D$THF6H=0CZ^}d6rC*tkkM9lLd{O*$o)72!xJ@0-)TvxH zBaMJ4qeRoq65`*KSnA9!xn3PzZ0FqpL@8EXidHt~44o`c+=sOmTpzM^5LS7ackWH@ zoUI-^CfV`y1I+^WvedF^W@sDgpMvMOdw5!%&WHR}Utg7k+rty2rY(EQJEjxGi&&z9A1fF=>qZf# z^pkaHtsiC_K`Cj)n8cL6v@TI{y>Q2R(%H9r+B7qxr(`#DRNq#NJg%zw*}|GoWx`OAiX0RLs( Aq5uE@ literal 8837 zcmeI2$!;4-5Jcy!uMqm|Lr3;LzcLsQG}#sji)sxQ0|P_QuE=U3H4GygebQbDUPw z*ZmyTOP+O%JOj$QCy7ka$QjD$HVC{>+uTM?2c@(>D%m9y7`c; zxc<7hKKupayyixNeA!(0&lmPoHD3SZGH%Rv-mb%qh+%$U1h>R>sOO3sKb#M-Ey{Mj zM1eg9ywK4MEf$2T`IbHPXz)Tp#e79n-TX$+GhnM0N2tRBHBe)q8a%Sb0yPklG6^y@ z&>?OEB|D?Xf_knqj%)E4o~ zWQ+)gG5W0m=}#d$XD;%41C?mz2)qytbP(fO;v2M^N^FWtW(Y5)h?g$_?fo=NoY7fDniZG8pk&O!UZaj9u<%C9D8r5p%|?9i$csC3Rm_R zN2ytt3TFhFnjoUy!K}+dfCLrHcw$Kg=cxq7EVQ_R2=oEKk06c>V@zSJ1O^}|N}OT! z430FzvQ%K~i6R)Sy@LnP7=)&sWFTd}G3I2aCZ@>L!{=!;-JV5~;XJ=tJd`4FsWjOQ3yB40DygZ?y*L1>A^p0y&u)VQN`7%NB{$DNiC4f^~>U0+yKQav5_W+<-$14?`|wB+_NX z#T!8iFki3<5;=l>e)zNkbj#dG)(EnIdMGOEo4U)WGLL`WX1V#I_~$h3PrJn?4L8$} z5_3p;#Bspfzy`{4B%Q?U};)Mqe#S>*t>94W4#N9kK*K;DckA_8+03-ZH8bBLBL!31iHN|pdR$5%zKtR z!Gs)nT6maRR#+NW4yFeR2gZlxEmqt%=VIe%xCV1riD1nSy~QrjLRM_@Oh}TGmBUoi zCe|YC441~-sC_JxF+-c>tdwDFu%RX)r~$^_(Sise3ESjT0~DiFGSt}{EYxkbW!))~ zK4*AgKt}y!dDOGJ&!Z45Hlri^$v*Hf={50Ta@kL(r~HwBCV25Re+ph~)3@MvYZfv( z=dJWVYhA;f_X%DN&m>HrXjwOs$-HE<`q^d!RD{7|m6UZa{Kmx2U+e=+b!(!nLL^69 viwfAXqk<)aLl-e=poU86^+P;eYTe_%&$(Pt*}lD*|A-;~d;S0NCk_7rAVA#0 diff --git a/packages/rs-sdk/tests/vectors/document_read_no_contract/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json b/packages/rs-sdk/tests/vectors/document_read_no_contract/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json new file mode 100644 index 0000000000..ca9f21e752 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/document_read_no_contract/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json @@ -0,0 +1 @@ +[183,213,77,25,46,6,139,69,130,159,190,72,193,8,131,191,105,54,247,90,65,206,156,68,41,55,185,93,114,209,189,211,207,236,91,86,76,47,4,205,217,32,122,8,123,104,168,118] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/document_read_no_contract/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/document_read_no_contract/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json deleted file mode 100644 index 7f0850a40d..0000000000 --- a/packages/rs-sdk/tests/vectors/document_read_no_contract/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json +++ /dev/null @@ -1 +0,0 @@ -[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/document_list_drive_query/msg_2024-04-20T17:32:57.734304000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/document_read_no_document/msg_2024-04-24T00:37:29.545143000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json similarity index 96% rename from packages/rs-sdk/tests/vectors/document_list_drive_query/msg_2024-04-20T17:32:57.734304000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json rename to packages/rs-sdk/tests/vectors/document_read_no_document/msg_2024-04-24T00:37:29.545143000Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json index 0528f564cf7e762ed8d49371c89b999bbd16f7ed..a20af6fd4f943c3e621a9b6381ae300774f904a6 100644 GIT binary patch delta 1793 zcmY*ZTWDNW6y@AIoyjDf+;eV{X_{p2y%7p6De1iOl9E9jeWVnaq=D1=4^0^-L%VTPxj<`vc+5{9v*bIs}8#Ayvd778K;n=RzKi- z)ha{fIZc~mnx?BXf00mz=I1>6=a79cQytsm@Xc!F;k8HOJ2hQQ)y^D?A6Vv8jq)i< z`g}2=TDdod%3r!XH<#}sbt>SeGfMO4t}?vTh*xhUJ=(Ox@P&FjUZ}@~2djJz8}R;b z2ai5A_*HJgS9OchbazzKs{k|kH1aJ zU_~BDs!dM5K)?1yd?HZ3DP%WRNB{eDlbU*jKLG~*0KK?bF58^MuZ)k@Lw)G@k!Jhk=(ys{eC z{}DIz%{46}7^l079=IWG-HW39!$rA5mX9{6kY8DYgV|1cYgNFLGU!5sZy{R>dj0j4VQt_+BmO@IloWiWIDICY^3{eCE*v3E7^2h(&B7MXa~PaK^(#w6x;!GdRp+fWvncy30~nX?opITm%!WXii8bwQEe#RAm%&s|oo$ zhT`EGY1L!H)6EwO{Jn^6xkIG#xU3kk(s&Asx=kbfG`}W!Bc7%4HJ+GF^LdGg>6Z-k zyM_izJ|C6*+n2DBBWluPrHJ=QJW5c~CSUVB?&fj=AoieI)XC0e=pL~AoX`a2IE}rM zu9bZm^0f6@y;%6PP&5(K;#*@EUBb)hDDv$(6!Sa?->}#9cAZ!!2OT2BnCK5VT3g l8wAv{Y)t=INFvcJc?ey4D%)fuVYm@d-yyIfez{ex{};%^28#dy delta 1823 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 H-@W-iM+pgM literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_read/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json b/packages/rs-sdk/tests/vectors/test_data_contract_read/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json new file mode 100644 index 0000000000..ca9f21e752 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_data_contract_read/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json @@ -0,0 +1 @@ +[183,213,77,25,46,6,139,69,130,159,190,72,193,8,131,191,105,54,247,90,65,206,156,68,41,55,185,93,114,209,189,211,207,236,91,86,76,47,4,205,217,32,122,8,123,104,168,118] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/test_data_contract_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json deleted file mode 100644 index 7f0850a40d..0000000000 --- a/packages/rs-sdk/tests/vectors/test_data_contract_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json +++ /dev/null @@ -1 +0,0 @@ -[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/msg_2024-04-20T17:32:57.732964000Z_GetDataContractRequest_1d1e53ab5e04d9ec5dce4ff9ac048c03122daf7ab2e77108f4bf44af1ad15eae.json b/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/msg_2024-04-24T00:37:29.544535000Z_GetDataContractRequest_1d1e53ab5e04d9ec5dce4ff9ac048c03122daf7ab2e77108f4bf44af1ad15eae.json similarity index 66% rename from packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/msg_2024-04-20T17:32:57.732964000Z_GetDataContractRequest_1d1e53ab5e04d9ec5dce4ff9ac048c03122daf7ab2e77108f4bf44af1ad15eae.json rename to packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/msg_2024-04-24T00:37:29.544535000Z_GetDataContractRequest_1d1e53ab5e04d9ec5dce4ff9ac048c03122daf7ab2e77108f4bf44af1ad15eae.json index 3dee81e184d77ab703d3ca78792fea7624d40df7..3cc40f9459efea8dc9fdbf85fc2b263fb47895e7 100644 GIT binary patch literal 8844 zcmeI2&2HO341|03Qv^EqAX5K*m7)+FTaAszR%*)uiooyQUB^zm-?+`C$M%p$KfB8% zhr?MaFSEP5?0MMj*W)((a`zH0{bDs= zZ~Mn_@ncx_Z*N*vwpVWsPvc@0CdjYuP3z6jZ}xFoYpm$3%S)@%6~cC=aWOvj?_j$E zQuey`32E7KzF%$T(-2LWKlWjsvvZD@HM8BYKRm{LyaG0cBRXvSp48U zsbL~Foo>0tV^~)(uIXslUcjFr7x8|L5#lauI7A#&z@-JY;Ji^{O2?)wml-g^;L{2N z=yPjeV~e0#fiQNsHo~CB3q-raB;zJa-f-Ax9kAR03|=sL4g6w;DXhgCn9^zvs4zef z;uVI}+y|+}2ncS}m<5g{$Q+Co5#^edL=+j*uB%-nxR3db(V**GFp$Ij&P9#XZvq0L z)rNM|1Up`+h{Oii7Q0gxaltxw-eLvj1|cNrXazjgVhS>wR~R7i#vTD$5{4wB(E`SS zgdm9{rH7~&lB!^25Lt)>{LJEq$Kq8tdW|L7$x>d?vqW2Jq6s&r&k+_WVX_)-ICGy9 z(g!&v(3E5TxTGz@VANw$T}Z0rH)gpSMHNY+Ajc9aG9%;C0cK$b!|(=ty9Bu6|G z9Fxq2mZb2fR7|&-oE93GP1N(+cy#8q>dy{Kbjbe#k#H&n6M_do5h_MnjxUnQjHS~i zWAGHgw7Ml-FUSvNH#d=S<-FU0D2-K@qLs}#K_?3o_aUtX)rV{yxKv)|oqCfy zXRAk!Npd{Bp;_QwmRdH=1Z`dUNAT>|58L^4*u}2`DRiW1VO-ZGtWpL<%kX4CuH#Wd zCJ^2drlU|$naM>({K}z>#3V^UMi2!h!c*)9ld-IjQ&h_Gw8GAbNo$LaFs2#nr@+@M zxP~1&HG*YCQkf-LDASpc zvMFcXVfgez3cFV>&St+%K%$dM!(4mu97V>(g17)zA%V+Erp-6+D8 zev%HY^uvTBC?%yBlbFJn))b}EyO9wL1xgxa;9rW%Zai$`cm6~lWcTrFaK8?pgKsGo z=MhT}VHDsZ$5^PyFvJcKEtxFhf;v@Q|Y|CS;Cd;S0XmkqxGHGtj1 literal 8837 zcmeI2$!^<76h(XOuQ0gIg7+iS2#ioB>jaxkL zrypZ7{BeI8&ktYH&zHNGyFc!-mp*gaZagm6%j5FKk!jIp+&*lM>0VJ)#r3Fke>LsL zVYOLqpN7Y2^?h6qZ*Qt;;^xiqd0K7K2IbAY<90U=yF=bqovOB~t4>jtw*ZmyTOP+O%JOlDC@#i%xt>|<$HVC{>+uTM?2c@(>D%m9y7`c; zxc)j^AO3;Cy-2K4h~eIxLD&#^jg%yxdg!;Of3z9fPt;5xM6iW@(i53w!E zcD_V`J$k&*(F`pXgsSB5EQcKTaLjwb& zR1DJ!5g}#-I;zG3${1YWglS+fDH*sXwpzf$BF)qB93Zr$vGV+N7@EYv2(rv%+{6vZ zz-A-{gqa|fvvZlf(1OyISHPD>&_s_+D25SVAeAugZAbd02XRD2p*xt8i6~4aKw34< zkddyx0o#iNM5&l^gSp4~1{~TW1fqfrM*J2N3*VZoU7-s7*wXBFW3Z$9Kk+6d|CmzWo{&E1X(}}C@Slly343CkAL1~x%r~_=QQn4yJ3@t zn`uaiIV3&eIACsI17$gqPGWX)#-hP2vW=nGl382FiC9=^#~f&r!4M0Ql7UDlFn6aB zHZlfTPh3J`wJDK4t!fOhbfF!ZraB+O=dgWvS{_gP{7C@d;o#0>=NKdm`Gh_j2^)Jb z64+@Nx$*^ewpOxHBw|hMT{x<--i5Y4|-GP zJxiWoLXJEwJWMSsER8FB(*uPAiv1B+1Fj zVXA2pYY}#aOJi=-K9g){`>NeZ5 z?i5L%GrTY$qkghH>e=1rQ3w{B(UJXRA9$Gbn)ooe?5ERH{>VQQy!e_w1rOWwE%@D< zg^bR5EB((}*D&XOf>*;c3DYN9){SH`FWIbqw%Gs`VX#;wW!($EF|qR(`v6njnrN#K x$~2xZ*S&5V#xnq|G)f6!+%w5+~NQL diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json b/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json new file mode 100644 index 0000000000..ca9f21e752 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json @@ -0,0 +1 @@ +[183,213,77,25,46,6,139,69,130,159,190,72,193,8,131,191,105,54,247,90,65,206,156,68,41,55,185,93,114,209,189,211,207,236,91,86,76,47,4,205,217,32,122,8,123,104,168,118] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json deleted file mode 100644 index 7f0850a40d..0000000000 --- a/packages/rs-sdk/tests/vectors/test_data_contract_read_not_found/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json +++ /dev/null @@ -1 +0,0 @@ -[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/msg_2024-04-20T17:32:57.730152000Z_GetDataContractsRequest_f229a0e58a5c4fb050f57c087bf067bd9ccc29eca3092a5664a5a9ba3bb7e967.json b/packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/msg_2024-04-24T00:37:29.544223000Z_GetDataContractsRequest_f229a0e58a5c4fb050f57c087bf067bd9ccc29eca3092a5664a5a9ba3bb7e967.json similarity index 96% rename from packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/msg_2024-04-20T17:32:57.730152000Z_GetDataContractsRequest_f229a0e58a5c4fb050f57c087bf067bd9ccc29eca3092a5664a5a9ba3bb7e967.json rename to packages/rs-sdk/tests/vectors/test_data_contracts_1_ok_1_nx/msg_2024-04-24T00:37:29.544223000Z_GetDataContractsRequest_f229a0e58a5c4fb050f57c087bf067bd9ccc29eca3092a5664a5a9ba3bb7e967.json index e5b544d05db47d1f97c8c0be3c10b8439fc631b5..4fcf0041b93d73647fd553256427374bf4c79b62 100644 GIT binary patch delta 1898 zcmZWqU2Icj7|wUPZm!*WzVCD^8$aiqZgYUj($jWpN8&brA|i-fII?77F(xD?!k9n7 zX+qH(l|%-6LtZc3U{@M1D7r+@3s!;`{0M_9!C*EMH6{+|jTb-wpYJOd5|?ysPtW(h z&-=X3^PF=RYZfln9E%7m-AxT*wUy0NPIT4x2ED0l(1VLR#X8YF^PT7jQF*20R8ly6 z!4)>`yd!C0O!3#QkaQ!a=y08)t2K(BRJg@U3PlIjIkd1|TKR6C?i4PS)=Ih`b2!y5 zB+n*rt|S$0uT{LVO(_1s!I@ubB=tuny`FGr+fa;#rQ~Oq3Wq|qicZuhs4t(3|;pTY6H0Q}S;j!BaCU)(>Ol3uz8YSn6d+V~Jk63`3+?a=Y7l4e_^_R3JLM6*B%#>gY3sQU7U) zAnNAM6~gB-{6wXKZ5HyF<7ojQJ5NhG*Wl32m}0M0!0|}D(XB4;)**Tcsk0P04bSP2 zVwr?hbQZvOChJUk)4keNf#agJL+v6 evh+rS&RAqyZ`Cr@v{;P`-JDpCO|`8QtNsO2Dm-Zb delta 1867 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 UNe9f=mHGE1^3Th^=ii$6AJ^j7TmS$7 literal 8690 zcma)?%WmUF5Jj{0R|s5Z!CQO}FpCM056C(Q1dYU4LM+qKV}M}be^0k-x2kRx{rzUKD87w{<8HbyJ}thd%Y37J{eQaJZI0>k&!EUDg`|;-S=9il+_D5Rm$J1)FI<2lWOD}E5 z-R<_2?iE#aE$VtYjLY?QwYy*5P3wQg&GL1nnkFtnr5(nHX}wJwlvnpoyZyM_XR8(J zRJB!Ib&9gQJ|U@dn%2|Z@`v?xwZ-$vpR0~tJ9c8S=}uoF2;Ghyigp*DG%zh}3SxVPDgo3G2u!yj(V?_5ccFWbxh`NE!ZaXnvsWu!M=Zn0WzKYty& zH}j_zcjtA78xc^38{)A_Y@oWEi=Y-al7r_f0y?O~jS4~xv_UoBP#sQip#ob{>I!!6 zAd>A!zYN1%rl=@%2UAu!B1|T#S>p`VkXpWimT9mlr4po!8e&RR42T%${|Yh?gKDW) zPra~!JF0=yg1be`1p(1PYSl1Q%2#s_tHmK5rM6(k86jAPAQJSB21g9IuHl;qoS>32 zK&cW(T4-?t5$KH82wKuGMo9I*+yE`2gq{tg7LGK-Rxkr&PZYt@+8cO))DW6>l7V!9 z)Rs97<`v%v=!NGr6YZqn3VM3|_r^0&- zEiqp++=KqK9AmbHchmva(Lg8(in;0?93W;o6D!CXU@Os@21Ay71~{~^ni8f~iNqEq zZAF)R5rKzA9wH_ID@=5`s2IZyLRokiav>v;E=ydz5ljK*i=aCxbO&69=r5)&*2WLB zfO;sZfP;wuhycUNSP9A)F3kpXwRtMY7|bXvT3%~yi_)xsfFH2Hf|;~4n8ABGlY}pI zUUTCF!=Q&yG@eBo)0WY(fjNmsG8>DDk1`3MW{QgIW;FL%EC7Vx+$LmhfFG$Kgn@yX zUe$7ai#OEcKoPGpI96~xJDT8)8d9(ml;vPk1VAA>C0NBw)1#V+`OknuHbD-~j>yss z0!)TH<}#6$kr9Vg35y2?sR(Ddo9J&*{H$v?-p_JL*D-&R?GWL-rUEhs&T4CKP${B^ zu9N|knaqO3NIcUjf|=FYR4!mdi^DH+0b~P94DW z9L|nRLg=Yril=T(A$U?j#OB8d(~83+u$dv;a__Wu4fjUWhu0M>=g z*`4V_9lrXis%L+B^}`QGKi@ulyu1H!^rs(w*clGD}H`}+Tmw){J z_gMeFI$6FrJ6kX2)5SbFf4Vq+`txi&{XH(0q2{=H`sVEP>F;^G&T+hqH7?iZPuJU) z$;a_>*H~^kU6y;c+%uPl&o7=9vaD%bF58%=%L8K_>3o^(e39Ylx{0w|%=PJUF~4fy zFW(k%^wY!r&$l~0JwAN8-GBLc_utR2KEL|It4*oDrQ`Rvk2h~_9&Z-C?;d)4d-vnp z$K7W~^X%x`RJ+e#-#^@5zkYjj_u=~8{p-KqzPbK>=QvyKD{)EFZR8+@!bsfe>?bSx3M2LDZcsZ^|vpdtbTiDS;2FcSIZ{1 z?-wh2=Jq)kv)R5sXZX45e}BVba{B>Slixnz`%|vR>EcNH0j^l$>ULjla7(8wdY&-E zT&#H;;)D^-S;KVKJU<7!n5%bgGtAX>w-3fSbGoKES%kZ~V3)&1I%ULg?g*z2am>Da z;G6MoJKBj6F|)%JQ@7i>o4FlqoFR{K%oAe;tZf2q^8ib?8!j^>`yFfS*bjMv2u>D| z+-^8$R|ojNAAtepiu_-uKyG6N-|dde1+n)}=+x0;yzIoCk0pfc$Gl(_^O&7oA%2}^ zD4IG&y@X|5sgE-j!6L^M>JY!CUX)c{u&uF@giSJW<#_*Kk!wiakKiJlVobJirpAv! zpy3=2Ij5qWYFq>wx#N;CrocHeh6>w-(nHV?=0^6aHD4hNr&weA-jul?1<#4P#yJld z^qepQV3l*_aNCM>=wX1_5tKtIjrivolZ?p+mu?H2nkNc^ZJ(g+tVt`?#A0((&xkcd z5+N87%}g9n5+i_l9PuJd%1rcBg+7pOOn+XnuLs@>#a0?Z}om)kQf(w;!5AQ zA=vfRZ{0uEBxt{eE9HCzZnoM5S1tU&PdjxN#4#Pzb$(>+^*$A*xJ~Oq8HMid6JT#Qy zlm|)i{t+O-MT|r)1rf5rwy+hK2%ZbaFAt`Kf2YrzPWS(W-d$>csA>sE%&lQ7;aMN} zzo5^^Ar>wc7%=3{*>qAgsn%HQbDOq|!K0&3I+L(E_3s z^@B#ze$12>YD zt0(v$+E3P;$Q`QXwwa(^0hJ-aosKx|0#5^JDq&hcW4DAawXqq3U{VwcIE;L4nh*+1 zH!ZlKiLa9t%n%RUkSuwTfj&6bkd1P7EwW8<_zfokQ4Hp%yJtPz6Vn^$azR z5eYOVGD(((;Wi#_5;5$n5Wo%i(>y25-5~f#t6j+$6EKL>O;k-=)*47k^lA2$@L@sO zmkuk+XfT?f-)r_Y7@nBP8g#886Ye9Dm2kwNf9lY!bz~Vtg`7DUTDr8)(-{eN86goh zS-)nfBpOBxc3xZk2tp@Q3Fksmcq0ao^9h(NSZxF%Aia3$$gCuZgb_3~yy>nksd?B!iqBj9eUq z8hL1rtmTkRP9fzyXBc1>nr2gu9lmUkFFOiQ!%+X3qr5ye#?8zxU+O6AF%7)bQc_eN z$$CA~MXuITmNYsCr~qQaUwS2F0%jn6+dz$lFw!CC6QM4JIOQaEH4D$G zjSA6~oWnWONKADiceE3tHj*2KJ6Uf}9hmC{T-*w{Y5Ibo83yuM)9FT7N$JM1gUrbR6Yyfw0vdb9^q z;qoDLC1%B3^fgbK`a$ix80A!0YY&+p51yh-9&f0~q z$C@0|I#Zz6RT24HOpx=nAkjtugkhK<=GbzRq3~fTbP>X%YeuC&3>qy7N!bZU5I~Gl zhKEKJ1I9BU#yLF&Y9#dZGP_KQ7ABRK5{CVXdZ#2JXOZ+S51QDaN(W!qOS)3DZVH4f zhpQSFUw><3W8vR_jAXkw`p2jHhfnXX-|l{$WA`f?hd-nt7PM=tUpBi#O&!8lkLpC4 zYmh(hni^}YqNtT&kaZtTM8f?WJ#-^cF5J!!rv1*mSItw%REd}XAURl06{Z-@n zc=zLno5xQN+b`N2noiP|oR1G^q{)@iKz;_oMw{+xEF8)4BzTF~DUXNQN>lU7^a%CZjKg&2*}~4jLJ4;7a`QemCbg;Ov7cv;f;6c zjrzXQGe?e%$^kK2w$kAk;t)POXJ>*GmKC}}H_0W2!dq62`bN;kmylAu=zCZiNe4Br zOUS?(o+*t=<%CTm24<%_nKvdxh1RLPV4G%YD=_JdDfkTT{p+h{VHMk%61?B Z`O`*OcD(WXo!js5ZU4Uf|Ld>v{R^QKCBFaw literal 19700 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 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_2024-04-20T17:32:57.933588000Z_GetEpochsInfoRequest_b2b426ac4a52cb4cb08904c63386caf3663c40a12d3b03827006d66058e439ac.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_2024-04-24T00:37:29.754758000Z_GetEpochsInfoRequest_b2b426ac4a52cb4cb08904c63386caf3663c40a12d3b03827006d66058e439ac.json similarity index 99% rename from packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_2024-04-20T17:32:57.933588000Z_GetEpochsInfoRequest_b2b426ac4a52cb4cb08904c63386caf3663c40a12d3b03827006d66058e439ac.json rename to packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_2024-04-24T00:37:29.754758000Z_GetEpochsInfoRequest_b2b426ac4a52cb4cb08904c63386caf3663c40a12d3b03827006d66058e439ac.json index b0522e468fbb350016966f27936a4859939ef3c2..4d1eaa7fe52c1c0dec4bfbf96fcf9bc1667c4143 100644 GIT binary patch delta 2367 zcmZuzZD?Cn7$#|xwOx{P&TV%cVw*s5*tz9qvz@kfO%-Q#W&QZEb<-{_MNm;&v4Rvd z8LUj0qe(q*DNAMS@uMMdz(R*>zFTkCV)yZOr>?+ zQj$J9wO&%l@hCd~yHK>U-kMk?81|}}$(QUc zC6u`r5R_iUmuNQ*Tdl?sI5wiE7NprYLa}a74aF@b^jc8pI8c}ycm)4{kcVBW7WX}* ziuzu)@48qPk01d~JyjC`a@9Cy3i#^x!Ez{JTa>HC@uCextySaK;0$swMNlCJfnWWl z46ywJL8gZB;IY(BOrE}A;Ft$V=?Csy-C3dNn6F&wTtv~ys1p30H`7i97Oy}9jMUm= zC5nCoD-_=#1l>Mi&IBx!2RBA&OrE~BMY?@y_~gziWCQ}Gt+zjdEO@dM@9tk1AKpf;MPNG#9ukiOs&om8_MT5iGG2MfG7~FHl@0NOT zD0gtK6(@I%K&Jef_{R8_aVoBgWiz+SD`+u?F5-@9eg$oJ-LH_fIfDhr%S>nKc!h+) zNSZqhFH0xA5em)Yd{ZDWmvqO1bx!pFf}vq#&3(y!XaLg1O_I__!T!75A>p>_U7gluk=F{2N*uW%CP6#XNpyp8p=ZogemsWZTazxCgeAS8&=!U2o=iWo0e0)wV6 zusU2Pa2PsctcXKu1^{%+D7KbGp>+SmLpxa83Yxe$ZfwJqc0NY)7~eML#H2aRc)16) zhR|GnTgwGsU$k0_ZZcg!Y(**|$H?U`OyT|;Y{#qX&G&J@^ei6c znsj}9&~MRN5*jebGNpa5SIN&y+|DvhZ+eu?+->gTFsVD)5WE;*id{etw@fV+d$Gs# zM(klOWTPdvh@~vjn2Q24xU1Bn6zQSqv;zZRZz~?dRC`V>6h1=Vvg-(6U2o6; z{ll=Nz60=XQ$8h|uo>GG=RRGJSGMxRO#sJ!$bP)6u$?h7mvK&n|I=`C?2qZQxai(8 eW&}sh{)(yGfUH2=_0s!H11;>u&2zKge(GQ6*bCDD delta 2244 zcmZuzZERCj7*4x(-`hE-8#iRI-Kqo~WOQr@3c?gJ$H%sg2;#!lF8hNfjuF&|!d4PO z2%1>t!M$+{+oIVY7aT^&qGoG}iQorx2}U5sv?lul8rsC*5(muZymw3d;g7euJ@x0X!XTEdS*7jYkbU$6w_t%=d^|kA2H>|CxuGXtu4X&Cm54%DxI=WR! zo%BnJr*b8gce)g1+AT%%Jq3z-I*ahM*YeTOU?JZAjkohX9z|V)c#*Ehyw&xVq(@by zlG2ZRm0pgQ<*#B||_T?xNSFfl#w?bc7A^s;M zP2VXgr{QAMIQ%lZ2dBtk?*dL-ckdpc*q)1uqAvrB?g5X|-KC0tXz)oo=y6FJ zuaingdVCaX$J9_grnXJxNfI9_Nq3qoUw@lt;a__t5Vq$G)}3ypGjCzT8Ej~vF5m55 zfHZOf4T+Q~eF!ZwDe6R#oVd5u`o%+=-(4aoJ&F`f%W^bdJrrLPvGyv8-{LRj*gZoN`h#*<2lq81{EKz2H58( z3qiEgfT4REUPgSXzZVcCvX!DKL*no#00|zzgm69P&sUWSEw@X$J_o#+++AHjtF;NK z^0u6QuE`f6iArF^i!V4w(#EeuQB`~XfDNeJG;AzKtu)OXc5MN}3GTpJYTqP*bU1}T1r5<^&oPrC@<%;Vhu>eQt`T@#sKf3HB0Okw>x-8L`EE4#Dd{A*z65 z#8xQU(qAC;nq$&Y0ec=R)p#CNw;>T@o>;;fM+UG*3U9z^U+uNlQ`at}!S=_#DbApx zok$PlRt}{mZ(~L&HR&=_hZeHYbcqw?#giBt* zSY093b9r?W$Ru_eKhZIaji-SyXJ@8l)zq$~*?rbJvO!E|0ds^&m-Z_fc?IKDF9ID_ z+`U_XZTv}i7mqP^+;dhfC)}QddV;`hcon*8y49Txx2nU)gOyMcROXbznDez{iZYFZ zCp&DW^y?@h{t~JV0V18u1~{j{K(-3F0S#3aE$Ezk%FfGWnF4hp+ehP*@M}l^7qOBn zN+5w{=(0|Hf_DD|S@2DlGRAah1_op1vy_a-=@jVKcoH(2Z-lTOt`u}`5We)yXIS|0 zEM(3%9p8s6m*o9LmNHo8Cg7!%8H03_=6*a5JNC~(cEH2AFT%Ic8-E8fU~ZTT+fZJo z?=EO3{WfGXxgRax*q3AE0ky=8(yO89L!g3=!@o{-h#G>0i3Z^UK80^l?Q zE*K~ikv)v<++a%fUF2#UfH}-A%Eg(F2*+pHz1d3n1A=!lI-zR^028y0tu){ja4?&q Y1L(SGoY5PI_6&W!*YeZV4(q9Z0f3P9>Hq)$ diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json new file mode 100644 index 0000000000..ca9f21e752 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json @@ -0,0 +1 @@ +[183,213,77,25,46,6,139,69,130,159,190,72,193,8,131,191,105,54,247,90,65,206,156,68,41,55,185,93,114,209,189,211,207,236,91,86,76,47,4,205,217,32,122,8,123,104,168,118] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json deleted file mode 100644 index 7f0850a40d..0000000000 --- a/packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json +++ /dev/null @@ -1 +0,0 @@ -[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_2024-04-20T17:32:57.792846000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_2024-04-24T00:37:29.598966000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json similarity index 74% rename from packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_2024-04-20T17:32:57.792846000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json rename to packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_2024-04-24T00:37:29.598966000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json index 348f1953ea70832d271ea0c5f015878ece72bb76..883396a628abf2e409c01fb761dc2ab56bd7139a 100644 GIT binary patch literal 20855 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 Z`O`*OcD(WXo!js5ZU4Uf|Ld>v{R^QKCBFaw literal 19700 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 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_2024-04-20T17:32:57.795519000Z_GetEpochsInfoRequest_1b87e649557ccb609adb9e2904c67089535588985622579e77969e0ffd68afc7.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_2024-04-24T00:37:29.606190000Z_GetEpochsInfoRequest_1b87e649557ccb609adb9e2904c67089535588985622579e77969e0ffd68afc7.json similarity index 86% rename from packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_2024-04-20T17:32:57.795519000Z_GetEpochsInfoRequest_1b87e649557ccb609adb9e2904c67089535588985622579e77969e0ffd68afc7.json rename to packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_2024-04-24T00:37:29.606190000Z_GetEpochsInfoRequest_1b87e649557ccb609adb9e2904c67089535588985622579e77969e0ffd68afc7.json index ac77510963d614ba5c340eb14d253ea0dfa7a6d5..4e023eea4eade7b2df86de69c5b9d362691c298b 100644 GIT binary patch delta 1864 zcmah}TTGi}7*0z^)&c#$?*rXxfx^JCI?AE6R44_;smvb7h4HYld1rLUuBOHb+?W`r zZ0n|z%?ab>b)1`=nySlqnRX<#!k@vw#Yyni!qy=Z>;4)6Cqr}z6a zj%#NeC$2j~k&`z9&hWD*|7>x0wRg3J+dD%Mv^Wxu$oV6VBh7G+YAly3XIm$}@%s_% zQJ5Q6xHe>P+@6yEO$Am@u<(>@UVrmn-va?>XP7X~WP-(f-i z{^v=9yL;>GJ8N|sOma!eq5{=@Y6OvdwKpwZfFp_i^WSf=2m_dfLKd^NX7**H6Qk1E?#Vy@d!jrBHR z*&x@%Gc0#%hemZ%@q4k+;9!%2BJBd>3ZI#-A#%6Ig0V_M9i8~Su^u^5o)pYdHF3j< zU@g^s%&djw{?}1LLtiomy=5AUr5fA98mGewU+vL2mQ#3wu%^=n6?D=c4F>mFtB(-Z zH+gI~tV@RGa_Er=w-CTsA7_FcRg8BxUpSfaW~oEvk%C|+07dB^rSqu zkEpJCE&G0V!l0Y```N0rxe+r+?Jnlx5dHZz8T}wf^D!Lzsub2XS$0h^Vz61`x+d#` z2J?wddmz1?QRr$;eE^P+dh9IX*bCYP^0M+pQG)Vs3oQld$`7g+g~i z;|dx7ocG1xQ^fleN7uG0gC$~`r&=k}C_$B}SGC7D!uTTL#ov2;SSPt91I5>FQl|oS z-@@u;wC#jcqOOAQiujgxo+BGSXSFjD#m0ai87>JSD{MeW_K`H1n-e5J$ZqZ6Frfv7 znD=PC!#uxC>wLuX7nw{iNxHywNuBH$SmSoNMy`cxtR-%5X6z{&jr8pJVHYwuZ?4_y1*12YhDk&nyUMHs>W140k=V*PQ$)bQFm~w$vXw`Pge=7Im9?!}^ zv#N_z;~dL!BIJ8G82I`!(OoSym?Wb$Eb&PtS>zL|WcpN{!2#Mz>~YCxXGerSsKdh8 G&VK{y delta 1792 zcmXw4NlaT;6qSvkIDr3quSf_P4?*ZN z2xnVDHc{Is1teBY7&h4?q5-L@)TWZtZCi%yS_u+*?*Hn-^7P)l=bqvIXAfMzJaElD zcPEo~w;J53=DYvIyy;|1@?4@h9!JcTbv3VEbzO~MGNe#isoco~hTUPTcr@-*DqIg3 z)bwh6SkKRuX8yFo?SMw4N@2fT!y4fC2911LBUffzEx45nBNNkDt24-VDrCwup0f5) zF;9;uOnVga{GN#^Y?o;KnAiAj$XZqL4_ugwS{QD(upJL#dQ{t=&$kWYI5B`l`LE5w zMw7zjQVYIrgBz6=CfPtBZTncPNMW+q;0r>V^eVhfDfmV-ma7$NB7}WWW1v!_;*`RA zR3rS3#%2|P)hg^=(wG@l2-O;Vsx>;;Kg{uDn5p+1;5pv^x=G{T8fD{HjIy7beOwk_ z3Xk&&3&YCBaocb3s!idV(wOy=o~%vT>Q^b_!TE@y7&g;U*4z!M)q}QkZp6q+F~M&T zRFv%Pp5%K@;YGE^mnSr~E(v=YLu4_)A*4yDTjARa8twc%#bRr9swk0;;}cH^2X!QX z|A*2F%arnn1YJ`K^(PgM>qrtw93&xskf0|$4zZ%?c3fd4PT(YVt5~6vBugE^_fwn3 zdLQrRbWw9Wh5Tq3)t3xjW-N43SrP8}8HL|FG>*#^mIis2!imGa@8KN|?xV$)NaPNE z6dEzeQLF-q`>iCIVlL8|;}juBfftw{G0Z*2@+nQmSi;Zya_$Mu zBEoi-8GPKM=TFN~P47@&9>2me^Vu|Vrx?T%gJtTn%aK3JI02XnS(xbJo`^6MgegH< z3_;(xz74y#PNB# za72EJEW99&gKA^T%zWE;YZ3wM(FPslOqP}GTh55kfOAf=FFRtBH6;JPW(k$zBr~dWKtUdg-=#cCtpao1r|^Vf*q!5??|< zvm`f9k>B<+8+>G}#GOZl7)C-Zi_O>VJd3;(WPusTFeBUCs^j$IUNIK}f6H@O43UtU Ni?+vUhE}5J{SRd8IV%7F diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json new file mode 100644 index 0000000000..ca9f21e752 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json @@ -0,0 +1 @@ +[183,213,77,25,46,6,139,69,130,159,190,72,193,8,131,191,105,54,247,90,65,206,156,68,41,55,185,93,114,209,189,211,207,236,91,86,76,47,4,205,217,32,122,8,123,104,168,118] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json deleted file mode 100644 index 7f0850a40d..0000000000 --- a/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json +++ /dev/null @@ -1 +0,0 @@ -[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_2024-04-20T17:32:57.792584000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_2024-04-24T00:37:29.598638000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json similarity index 74% rename from packages/rs-sdk/tests/vectors/test_epoch_fetch/msg_2024-04-20T17:32:57.792584000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json rename to packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_2024-04-24T00:37:29.598638000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json index 348f1953ea70832d271ea0c5f015878ece72bb76..883396a628abf2e409c01fb761dc2ab56bd7139a 100644 GIT binary patch literal 20855 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 Z`O`*OcD(WXo!js5ZU4Uf|Ld>v{R^QKCBFaw literal 19700 zcmeI)%WfRW5d~1M^%X>~z39k(!J*nBVM#6XF@Q19zq_(2idpA!$dzFj7%gU4 zRayCn$Bi42S^fKmi;Kl?$GiL6)7Ql>7r#%J{l@a=-_zCY$LZ>C=O_K?djHp-f7kf; zVKqG1Y{rZBa?w`Xmy6}gpPPF5yLLlYtqw0wHtUza+j1OZIrLTg@%{DKY#6+jL#rAZ zt%vDuhBj?@dAoa=$S|kc56ful;e{G|+76>_2N|x%MbvQ7#c?_jo)%{678n`-krz{_>$K^*tSbIX+x{yn47A^gg|GbG-d@^Dy08tX7NXp{D!S zr@Q0j_084o*UQhR>wg|UUjA%Zo6R7-#qrze`ey22Sjytz_RI0|%YE;*cD35B)~j8$ z<#HThTF%4i`t|9?iCoxntTpCRrm6_7`R@+Hcf|5&gz~fP-^`(cSwEhj=#N{_Nsng?d@y zh^xIhtuY=un;dXHS}td;svBAufUHlT4hVh3#@=AdkhMcVtx&>B39VRGTRI6F=y#1S z+ZYM@EZd4@&S1T_7_s?$ZI?>~Q9HUUXQ{oWHnjMrC_+}^lg_T^svX;JSd|`fPz+=I z>~bn~QBHB>0sRfdQqI9KH7KoorSB)tS3m*NHUcZR z1CpAN!mhd*^X)eb@*74JA)8?-445exq)HqSAdMWY(PJ!#fd=}A2+s`*N z&!&Y}AdiU56wBvj@KX;hA)Iy87U)=E<4skyF>^T^1Lzc(UyX%unVuHTE#3Q~kMKHp|v}gK~s9GuhI=v;w*7lVVTUUpYZKEEn`1{+0_e>a?XR){Dz< zACoNoGPwR+ib8T*Ybz26^;}^I4mrz)&zhajA>u+AijrmPBtrCj1gD4t8Ft?8ObJIs zNtPyTlwk@C_>(htGnxLiK;ZvJ&WyP=%^_F|gu#TUOnloCuPvkRR%kH{l>n)Sl>xqt zuaR{{0CFPWH`kklifE;xG`VVXh7&@QL9qGGCK$dXOVbzKvTEmubSf4OkU1RfqR_?i0-^Fk>Q~Auf1`4rP8j)qm#`NU*R_h2@PK0X-5#N)+Y6aZ}(a zb~p!1sX;jtu!POf6k|vVEee@}n0KLwpiW8M9l?~?#K~%7)D4oph_I+im_hSzUp7r? z-W=CsTa5hgX={KH_C!mnj#wMN|EauIgF}!s*WX6Ad*N(#Zs|TWhz6{y7cq| zLNuem#5cN_`v9w05^wC$V&uaRgeVL&hcF_QC7`5m%&A#b3d*Kw>119vD=?8H6p}5g zLUySwWhqQ}a#g6tMT&-H{O?ZU?w?&}PVgvicBE2TmFZgfKjnEN9De6=f;*;WP!U9^X zDwsJYh8(lv3`MB%B*WPxgWJa(0^(GT4WfQ)nNf3?_Tb<2Jc&yM-HO~!CX#s>fF&<3 z^>59uTz1o<0yI%Z_1V#x{(`vyOKgRO z24-3;$PEs=2oT&5gUhgPH8nQ*$_g`XR;o(o5=n}>k1bsH8Iu?oT`K$z#ERUt8I?od zs?Vs6Uq*4?=MHErY40Pw)s5VeR}Q6Xw%||(Qo%mU6EO{pEZBGehF~9-9t=hIj=(BT zmRluCB4}8Y@1#v3y4Y~kv}5NKNddH)jHn5%6Hw*=W@m3crRN9{R^}=S7gDDv3~1h^ zLzHws^1?WoVHPK6jHkI@`V7N}BUJg?c~Ywo&9@D16a&B!n#nw2ylqI5u2yb(s_mSh|Y@RXBr z-UwMDMHCjJ;1K)SVWx3>$GzF8ndrb&i9{sr7!cCzc?^{D^nZ03Zh{fR`O3Qe+ah~= zRc<}dT0`aWfA7+0&l-dOW$nt1=kVL8!bEN_(z|&Vpqb}$jn*I-0xX@_%wIsvB1%9a zBbGJ2iqN4=RD@xp(RAi}P8AY&=g&ibdn6Isa(^pQCpzE~`w>>=v*TUm;bZ)h#|*{O zx8J2Pm-+~OWie~M%G`ccNG5&}3(ec)fKd%`XF6&daTGFkEu%Ie96IX?W0YK3rfwEQ zGFEC6ak?SqZSf&8oolVn_!wv#Ngovn4=dL~G zo*OP2eC$XYs-u{o`&!UY>X98=^U7mA@rsOt@a67CR-jBPJj-j*#RM$QkmT_gi_3AQ z2jq(MTDgc-nf%5q%@ad6rXr5nqWU4(juuh=4Q6Jo;uYCZY{2Vl2zEH=}Jg8s`NUGoBeSTEwocirb zEZs6*)I@{A#D|CE-EM}?bUl6EX}L4L79$;PtNkC6l^)_(v%--%}c diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_2024-04-20T17:32:58.239918000Z_GetEpochsInfoRequest_6a828350e795a088dbc835260a1add01a7428085ffdcf1e11cccf19c48c5f7a1.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_2024-04-24T00:37:30.085258000Z_GetEpochsInfoRequest_6a828350e795a088dbc835260a1add01a7428085ffdcf1e11cccf19c48c5f7a1.json similarity index 99% rename from packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_2024-04-20T17:32:58.239918000Z_GetEpochsInfoRequest_6a828350e795a088dbc835260a1add01a7428085ffdcf1e11cccf19c48c5f7a1.json rename to packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_2024-04-24T00:37:30.085258000Z_GetEpochsInfoRequest_6a828350e795a088dbc835260a1add01a7428085ffdcf1e11cccf19c48c5f7a1.json index 47a7cc84c41a9d724c1b9f4115a1c6e89c9c100c..374fc7868a5ec520b3deb3313bde3ae262ce4da3 100644 GIT binary patch delta 1998 zcmX|CT}+!*7!C#c1K97JmhmI3AnN$WOw0Ij!x_3njd~%}8Db(ySueyyYdbM>UKNu0 z6K>jV2l5IbE!jlObS*fC%Ove38bdK#ydY6ZqBkyqlIU(`0zT)h@#6V%zVDp#{yoq8 zes}k-mi+=;TC;TZUjFf@rRU`3zrBvW<9(ey$Di)%RmaL+EbCS8m))jlz%3~FmP=A{ z*e<6FRzco*msBlXg8Bn?N%3Kur1ZL5Qr5(&bl4`#y6G`DOtwQi93>fS52Wt8l-xv%Fw%PiJ5hJ zQ9x!Z_mf3XZVVzwo;%am80~HTRpvMbTMsoLNC0 z{;MErum(m_*>XuSKLm6De|karYOI)WtsN?KyIW~1g;g+Zy3{u4pI-o{zIj;V>)wC# ztyKxlyxDTaX^`=SIYZH9oX)^m%ja;`AA*6XHW0WjC@m3Y@FG5KE#WcXMf{z`TB$aE zcTsW3COB!|>rOG9!b>zHsVNOB`2`$gLB>|GVp;7D!NMC2hEQp%ixL5s04G?4?Ly^t z1XnqSopGz1Kd6icG2Pd}*Mqy9iB)tHJPp*qBvYwH%4E=f7^%&^gx$z2YV<5Bd6FC|?)4V-$+I z^tF>jJIcrkOs^sWPH&t4%%%-s1XYiiXnRL?f^*PruV&rz&SteU*>w_yey5#V=seh z@Q1l6uOM1~2rT8_hH8>)c92m4@P z{~;(1uH(VFNp|C|cNH64Tup51Gei)vl)5VwgJ z2)N;w-ox)n`#tYFVF{P^l1M6NLFMo(Fq``97==k(q!6YSo^KP5Ve z$u+WQq6&JL-kF7zSWgotkh$@io`EO`%Zri=xRIDbTyZbl=rKcC3I99^^&lqyO>Ig~ zF)aboF)96WTsy?U)oQyB*bJHL!k;CCeI)!D8e0th!5=F@A;w`L z`oqL6?Z`=ZqcXZ^LKY0|kcmvqY77Kfv_+CZ;z&1s5RyUKg%FjPF`x5xKc1U=&w0;# z-jC;f?)=Kvwp+m1b$eUesT(ibceb8-5~yfz+tJq1(%Rgt{I(ujt9svdg`(}{g50~y zB%M4|Bb9HfNx4;*z>B29V6~)h%9NC8k%H29-GYW5yQE5gE-3f2Q&87UmptvMl{7c% z5afN}lH~u*DO9pvQsRgUXSN!GLU$bot-V?$s4!)jN*osC+ko}VlX9W@-xd_HYVqjw z2 zIi-&wERJZXy<8F-2S2Vr22>_L9d>>;?6d)PzyUl5=rtEm29yI8zy_car~)0Uyu^Yyn;bwgN8!O~5u_`wzoTtK$rpCTby# z>^!nxbg!qY7MCOi?v+Vp95(5v8Mmi>~+Z z7CKfTDe`8OP%G_{I`^V2k?WcS`*9%L3$t85%Cz(c%Fe_%ao)nw+t>|G;w|JaLrc*e zTB&jvs<}o`l(6({6&BCRQS0~uoM^|K!O#r8zWj3|`r4^u*o_zpJ=IdJT}5UdymSWz z4V?B;|ui|rHWCNPqiM7H>7{6kG za$VD=RH5TO8uQu=l|SaA$${du*MY6EZH%Cch+lLjDqII9ps$}y9`?T$0JoRvwkS%fR8<& zRH0BUW+MeJTG-qvX=2(EYT0H|aSqWJme5r$r+XUFClG1ZC|=T)lG3__zYJnxcyt297gpP~T-&zJLAy@=Bedd?Mp zJ=oQ1L^=(%s3k?WUdtPW$MJS{6$etAVf)v%T3o9YZDItC&5vLsa1#%m9(4_ad_@Q9 z*iyOKcAIAYJzRug6DoK`Q1&4@ zru&%A1rg6RER}{FeN`D8(z)p*6||6y{kj!;^nbijDKJPA)l0RlJPW>T6VPk4Z)bY(Ygh=DuiF(KvIIrG<&9ZI%PsXfZ z3I#GKnEM;#ssD(xVUTi4f&kN|z+bi0&s*PHJ4y`_zY7)GBxrFScBlY#eE_zyBbF~# zbFIDPO(AprLsO0L%L1xXD@h#-6Ki+(e^}GXQ1Zk-u&@JcW!`BSrT)Ls^syr@FU7*x X7-&cSnXyV?Z+l&b*GR8jv8?|ASjojq diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json new file mode 100644 index 0000000000..ca9f21e752 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json @@ -0,0 +1 @@ +[183,213,77,25,46,6,139,69,130,159,190,72,193,8,131,191,105,54,247,90,65,206,156,68,41,55,185,93,114,209,189,211,207,236,91,86,76,47,4,205,217,32,122,8,123,104,168,118] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json deleted file mode 100644 index 7f0850a40d..0000000000 --- a/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json +++ /dev/null @@ -1 +0,0 @@ -[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list/msg_2024-04-24T00:37:29.599207000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/test_epoch_list/msg_2024-04-24T00:37:29.599207000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json new file mode 100644 index 0000000000000000000000000000000000000000..883396a628abf2e409c01fb761dc2ab56bd7139a GIT binary patch literal 20855 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 Z`O`*OcD(WXo!js5ZU4Uf|Ld>v{R^QKCBFaw literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list/msg_2024-04-20T17:32:58.219154000Z_GetEpochsInfoRequest_734f6594c67fe6a9ab170191031d592c8fe7361bed628d9a36747664c9789bf1.json b/packages/rs-sdk/tests/vectors/test_epoch_list/msg_2024-04-24T00:37:30.072218000Z_GetEpochsInfoRequest_734f6594c67fe6a9ab170191031d592c8fe7361bed628d9a36747664c9789bf1.json similarity index 99% rename from packages/rs-sdk/tests/vectors/test_epoch_list/msg_2024-04-20T17:32:58.219154000Z_GetEpochsInfoRequest_734f6594c67fe6a9ab170191031d592c8fe7361bed628d9a36747664c9789bf1.json rename to packages/rs-sdk/tests/vectors/test_epoch_list/msg_2024-04-24T00:37:30.072218000Z_GetEpochsInfoRequest_734f6594c67fe6a9ab170191031d592c8fe7361bed628d9a36747664c9789bf1.json index 8d42780da1314ffcf203b41405e3efcfd78878b8..34407691cb2696fbf98b82001177e63922d08bc9 100644 GIT binary patch delta 1968 zcmX|CT})g>6wX~1%EIo>%mvC%Wf#S3L1FKLfRbXChD1!NEb?L+0*k3HT4gb@8jY|f z#`<6c%9x(Fu4y0oAW)*lYDj@6ZK}BVV4_h0txcN9PmCC&3B_;DU48gAd*{xaIp_Pn zbMDW-zGr<0Okel4wx7Gv=xclU+@G;PXG>?it)-*2T{l_1R=a-5x=P~#rD(aUT+!e6 zIZ7uhC1t<2BvtQ~Dta~UDC!$3k(B5um-$Ys_z9R&^`wZ5`=cUq#BJ3cgbkr~D{RUi>j5zu0OK*pj zPTi7k_WR%N_gjDuC;-fJAy5Py0*ZkEPy&YVTr4=jSH$ulTnCjl1IQ$o&cqs-w#JcO|l z356u3B92Y#HE%s9xgKc7`lK%j zNz0cZQsy$GiF_<24X^p7p7JRg*+)W|Q+U~Y5^Al+kbLYUc8GnfT`+DLI*a-ao<@+k z14ppjnK+alPC)&+C{EOk;sr-ZZsuD<`a4N`6ulA=e4i zQGb~wbsT&e_vobGrm=xyNfQkSxz>bt5{a;5qZdv3QDno^!-n?xUTig-=#33QPt+I@ z_CVfgzffdMMY*LirH4>t>NrjxJc^&$S}^u?7s7rp6Y^Bk*L=!RdtETn!dq!8P9TX=k%i@s{{ zf!lHv!qsq)T$S)V5t@Mn$v(t2=MWqHqP!zrtA)wb5P*c#>)B8%hu=3J#xLUl7 zOk7MuVlECsNc-9u(7Hah^0(7EKk2&K4;sZ+SF`+hv~wvB4=HT5kB;{J0x@W?GbiAwbj_Kq#V zhSCN@=q*@#4sn@V9s+$IB00|9&^Ciz+@x1bgAboAgt4~^Q1@R&@Z7f4b7&6Ez)S_> zWO92Elm|$B7=GjRO>~;kP;YE0+Kf5E>$_wCZD=GkovGbjiEmB*bFv!7c*5LamN|dp zO*E-ZsRaDTB%9BZ=Mr{r<|3-*uadFp^_#doTZsbt`$FP>L4R?bHi|`X(0tBx7MZaW z{HvwACqNx k8y3o-u~snexm)TULh&1Oc}JST=6kT+n68dGTb+h~0kz(4QUCw| delta 1976 zcmX9gNi6&xsd=Xn^Fq)_}LNzg|rZNy8q^KSG0Usia>+JbhleuTk-gob{ z*Isku_jjxnVECJy`uYpkDs%SMUD&8DXsmCjf4H`;rbbs;hpamNk~K?HGa*H<0`nGa4o3~Qg`!%#%0T`&+=h+e?8VFy&Co&lYqI`Gk2 zg&V_haC-V{Tk6EBA~}esR6r
    jKHypno)v$Tt)H*hvtgRwvAlOt^yILk^L^g7fYv;;N1Y&*2r5fHk$Oz@Fj z22smDf`LSHk)-8L+*;4W$J|l8@mLI|rBu&qRB-fuD$E5hTn314pxH7MZ8 z5o}WICG!p*-H>L~?>!Tj*h=t`m>}8End>b7-(FZzs zGE=`6NG)uedin|lfp4kj{X)mmlHQ&{0w#bJ*YqKh4m}M4bh+3?Gt%sir^kE(DKN74 z5MX3Nm!rtPu;P*WDoC7LwWN-&C>?`3%+6Em7_`6L0&@8JDHrR^vN`Ovsre~1DFz|S z=!#A4#dzws&=s3RWRKfOw~k4rq8{TQZMMmg0(Eh`H*^+5WpRg$9hGmwY|`K3Mw^XrZtl~@T%`rlCT4Jy+yJ>; zg1OHZ&=X^jK?_hVBj25C|?0t5uiEi_)8Y-UO@Cb6cP$E2ql|-p42*fIp<43~f6Gmmm ziPP9eU5Yoh+c=th5ORi}(m)k%vFq`2vX_~nv*n9ZaEEzR*EEP%PJWC2m@cy}l-|M_ zOO@%0jiYuB<;^q1>r{zNH5SBX2;s8(QxGRaVAFsF`8b9o7XH2+kk1R0IfJ^4I#@_i z3u&D{PzQ8MW-ImhZ#HWHe}dVu{uFf^ct}R<#?7eP#f-VsraX~NWX#QYJUeo99a*QE zi?F=N%D!s4(?+7~P3-4v+3W!(3vUbcKL&jn@fm;BQ$AsA%%O~N{fUSRTCj9b+#{y6 G$NvXwzm8l0 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json b/packages/rs-sdk/tests/vectors/test_epoch_list/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json new file mode 100644 index 0000000000..ca9f21e752 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_epoch_list/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json @@ -0,0 +1 @@ +[183,213,77,25,46,6,139,69,130,159,190,72,193,8,131,191,105,54,247,90,65,206,156,68,41,55,185,93,114,209,189,211,207,236,91,86,76,47,4,205,217,32,122,8,123,104,168,118] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/test_epoch_list/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json deleted file mode 100644 index 7f0850a40d..0000000000 --- a/packages/rs-sdk/tests/vectors/test_epoch_list/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json +++ /dev/null @@ -1 +0,0 @@ -[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_2024-04-20T17:32:57.794148000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_2024-04-20T17:32:57.794148000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json deleted file mode 100644 index 348f1953ea70832d271ea0c5f015878ece72bb76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19700 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 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_2024-04-24T00:37:29.599593000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_2024-04-24T00:37:29.599593000Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json new file mode 100644 index 0000000000000000000000000000000000000000..883396a628abf2e409c01fb761dc2ab56bd7139a GIT binary patch literal 20855 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 Z`O`*OcD(WXo!js5ZU4Uf|Ld>v{R^QKCBFaw literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_2024-04-20T17:32:58.215202000Z_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json b/packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_2024-04-24T00:37:30.072303000Z_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json similarity index 99% rename from packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_2024-04-20T17:32:58.215202000Z_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json rename to packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_2024-04-24T00:37:30.072303000Z_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json index e6f8492c798806035acbed63ffa818f1e9acb958..30a0e8c0d78ca22da356225f575e75a7787e9744 100644 GIT binary patch delta 1965 zcmXX{T})h65Y8??%L2hF}at3)mVJD~nMvB;xwbTpqs7-E;4mGxN>& z&AIgITb>I*{}gQ8NWrrU;K*Z-}GqrDfBcx zEqymrQCCHQrW0F^O--FznbaMdsz*E)EtTeLTB*sLjT?w zvn{tfEv?9_d&ALYe$%GU>N6BgHw2W4K?g zOa#I^U7Ky0)U4%7G|`4*+Rk-iBH#+;(bd{Y*aCOyAXW>O-#TUz^rP^DzP!5i(g0 z=XCvw_A(0;KZlfu%fTCuGS~R6XvQ#FdA$&JlfuN=++uq95p2&H#nY|nG`DZ#i<(;d z&|D!hbQAI&egYa?nF2p--S{%t5x|9=SD9e4NP0i*V{0zSU+V@=_hm8 zo2ND}VS)Eq`&=G7eoi5)1PvuA(7{EDo0h@!0+2a3tN*i6|U`IU(;V4|Fd?$Z``Xl66r#cMy`)RQ->GYl00J&VpNHpha$4W_%I1!VUL637m%^c=ia- zQi2F`z75-Cs0hz|KZ$HewA62}diI7qsSVIUa0 zs0kOFbmV|9gsdfI7sjaDg-QfNX99^5wJsV>a8eS3s06B*p@gpWdCxa5o}}k|=e*~A zpXYhszW(M3&jc{_g}1Zw_?5@JPb7~owFSC6yE=O|Cp$XyCeKb!QjdAg>Ef`WYZD$x z6LV5gDG*Y+)~#s#act!)j-oXy#-5*r+{xA5o^@JAzBa+hh9i@9MNrSn1rNam?e8-j)d*DQ6!fdsJb+<@PS+@$bk5Ht8}M4kL*y`oJ))Nt%=)Lq-@RPMK$U+%*N5vYsoTN+=xwkVyX)9`$ct0aMoEPqEX9;j`MOW&>lI0@`y22r9*t0G zu|ep5Bxiz}^h^7YW+{y%ZX)pSFNIyr(++YtycMh6QAry=_d~D+N!cpIoWHS3Qrm$j zwxpz~nN{LsX}wK5nnF@%Nm2VK4ox3zP&ya3^)?)yeHro_Q>D8-F&Ynf1kIP7)0Fdp z!Hd74LQb28`s$@FgG+W5n+cC95=$r^=CEm$jdQkH>e}~;I{ZOgV_TlNQwIxu7m~(j zC|5XH_TB&&O(8|OIF|!5%S%3lzKeI_mxcaz7&Y%h zU};&xeA6-3gs%+#2=gun6s0x@sjG17*DvCM(j`UKAxK*+Fbz3qmYGBZrcRgNQM!Er z+8t3;`xT_75VqZqXqgdwW@*?rlztC3dQgL1hQjz&>O&31Jh(D@AW`aqB|w9ucsCAk z@j5nwFaojOny**%$3G5SbRcTeKmszwN201~Yjt?I>|lAe0nZqF8Z-3!ZM_4crpl0Ij_SgaV!IeV0uGT>~D}Ti+xkZ>>@Zdx^JI>FM1~t%x{}nVH}%3TK~VR zdJtw7y+m$tOGqlT3sskzK}X?FFtK<6OFrUDc5bGx?m4R|ao<@(*GADC=9Y0RdoFVj zaTbup3m=0Y(^O_E3PQnVkJ&TQb6+B1_-CjAu8c^XFQG?`TnAB07KL8D=#!?E+*+!q zFab{|z{*oIAl=wDH-*>CpfnQ}ge#i5jJrHosj}>#-*_Hy%bWY?W_J+l93D6H)`p>D z<`PomIbp2yU<}6Okt_m`d~`7=&17xghC^$+SZt=O_}q%~xR=Z%GhMm51*-4_a0~d^ zLeP0=%p-!TN!yKVI_2!U()Fp~su(~}bCDa)yrD(WrtuNH4?;}JXHN4dWc5w*F`fg) z^u2o^Dz}c#TQ=o$5n&vZ8Nqm1eud+~Y$Pni>G;y7$vG+UkLC)RsX1M)K-?>4I^9AS z=-tyu_9Lj_RhU%hT#Rf(C}o~U2Izg)!|tTy+E(1jGs#S7GcS2Ga2$H|FmlXnfdpw7 gkN+c27QkkzufEm%Yr3*=$H8n{IJY=m^{n6UA8u`!MgRZ+ diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list_limit/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json b/packages/rs-sdk/tests/vectors/test_epoch_list_limit/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json new file mode 100644 index 0000000000..ca9f21e752 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_epoch_list_limit/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json @@ -0,0 +1 @@ +[183,213,77,25,46,6,139,69,130,159,190,72,193,8,131,191,105,54,247,90,65,206,156,68,41,55,185,93,114,209,189,211,207,236,91,86,76,47,4,205,217,32,122,8,123,104,168,118] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list_limit/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/test_epoch_list_limit/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json deleted file mode 100644 index 7f0850a40d..0000000000 --- a/packages/rs-sdk/tests/vectors/test_epoch_list_limit/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json +++ /dev/null @@ -1 +0,0 @@ -[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_balance_read/msg_2024-04-20T17:32:57.805378000Z_GetIdentityBalanceRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/test_identity_balance_read/msg_2024-04-24T00:37:29.611908000Z_GetIdentityBalanceRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json similarity index 68% rename from packages/rs-sdk/tests/vectors/test_identity_balance_read/msg_2024-04-20T17:32:57.805378000Z_GetIdentityBalanceRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json rename to packages/rs-sdk/tests/vectors/test_identity_balance_read/msg_2024-04-24T00:37:29.611908000Z_GetIdentityBalanceRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json index 16eed9d48e9bf224fce28bcc1720c0798dba3417..ed92121f133b2b32621ea5b35a694653d7720d83 100644 GIT binary patch literal 11193 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 diff --git a/packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json b/packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json new file mode 100644 index 0000000000..ca9f21e752 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json @@ -0,0 +1 @@ +[183,213,77,25,46,6,139,69,130,159,190,72,193,8,131,191,105,54,247,90,65,206,156,68,41,55,185,93,114,209,189,211,207,236,91,86,76,47,4,205,217,32,122,8,123,104,168,118] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json deleted file mode 100644 index 7f0850a40d..0000000000 --- a/packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json +++ /dev/null @@ -1 +0,0 @@ -[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/msg_2024-04-20T17:32:57.807110000Z_GetIdentityBalanceAndRevisionRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/msg_2024-04-20T17:32:57.807110000Z_GetIdentityBalanceAndRevisionRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json deleted file mode 100644 index 4f098886a58ef4403b75cd388367a6e254062963..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18554 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 literal 19700 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 diff --git a/packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json b/packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json new file mode 100644 index 0000000000..ca9f21e752 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json @@ -0,0 +1 @@ +[183,213,77,25,46,6,139,69,130,159,190,72,193,8,131,191,105,54,247,90,65,206,156,68,41,55,185,93,114,209,189,211,207,236,91,86,76,47,4,205,217,32,122,8,123,104,168,118] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json deleted file mode 100644 index 7f0850a40d..0000000000 --- a/packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json +++ /dev/null @@ -1 +0,0 @@ -[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/msg_2024-04-20T17:32:57.825471000Z_GetIdentityContractNonceRequest_b7c02dae0c3c762ece1f70a36f88fa69b4749b19cc1f5ef0abf37fa0c04ab2ef.json b/packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/msg_2024-04-24T00:37:29.632356000Z_GetIdentityContractNonceRequest_b7c02dae0c3c762ece1f70a36f88fa69b4749b19cc1f5ef0abf37fa0c04ab2ef.json similarity index 71% rename from packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/msg_2024-04-20T17:32:57.825471000Z_GetIdentityContractNonceRequest_b7c02dae0c3c762ece1f70a36f88fa69b4749b19cc1f5ef0abf37fa0c04ab2ef.json rename to packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/msg_2024-04-24T00:37:29.632356000Z_GetIdentityContractNonceRequest_b7c02dae0c3c762ece1f70a36f88fa69b4749b19cc1f5ef0abf37fa0c04ab2ef.json index d6c0fefcd87dd2d12bf452dbacc89c2f2fddd193..e0e9171f38f1f8af7cafa9b32f5925ad49914047 100644 GIT binary patch literal 13996 zcmeI3%WfM-5Jj`rR|s5Z!74r{zY+ulO)(Y`NpvX6fMMw0Gd+5+<{ZV|WSJ}+&P-2t zbv>tjD^S906roa9BFr*EeuYZ02 z9rbrND-RZndXblloGmXG)636ATz2`nke0%QiO>!}LvvhxdcRcMkyW8#IVRLuf{k6Z@ypN1U4bRE`%W-$xPf$E*az5Pe zH}{Wi+E~S`i*7oP<#>gDJLlu>c(=J=MDgp%%i04jOm4Q1xA)ugzKOEE+w}9iD(Cr4 z;>l_M_;lCy@q#nW29th;HA0W}(j0R;et`6~dm8+bm)b<8PXS72wDpg_;CLRZY#ZsZ(7=L}P1!It*M3^Obt zLvq)6KLfkSij{**6-e8SSYl1elnEiYs}*(`6p~9y4NJ~2=M+=yi!Z$Sa@$d_MyMG( ztQoEi$7rn0$zlP0#1wBtO&@Im`sOIJwE=5QiTy^+39{zl zmnERLsHw1xSeN`cyuk>N9TjCW?mQS(D@c)3?5uxskmbF2ZXEyX_$eb%q1eRjRh?}1p)=v;FOtEWzynApwNgl=12l( zXbu{z&#Yt6Ak2mKN^kC<3@%Yq{SY1)4+CeyT(QIpOnO{U6TmC8GU_G~13H*sdcHE& zQYbzbSR@iR*4!3+DrZy#wmpNjB@?}rE+(H#MuxmWnn-~-#Yp7=Y9a)fQ>ho~#@4Ay z3j60u?=)?%tnfn9e$8y~eK9c1XJ=MK2V zZPO(&JeYoo1*3wni9kIvmL)T_LU$u-!qD6R6HqL$B{~8%Mx!WU$rIL?LX?Ei0Xs)+ zAT%Aq?$l7!4o4dwlz0vKY{0)3H?5^)9Av!sm#$sku! zHtbuZV@QFih!5kz@HAeE`;Xs7h+^d*Uz+2QUSRCCZU{UTXceZ2x4Tat-wSo@DCb4L~=-h)d!+n zMAn?cCFx*&uYQa*q>Ho$p^GvrbBk(m+rV;nM#$|}C>a$+$xe7OktUsp9$;2O!WU}6 z(W`GNM5Y9+pK(`e!eLo|LYG zp+ZH7eY1>l`6zD8&MyZrFEY!y55Fdsu`-bdF);>#Xo2tvdA3wR?(;!63NS(+NdXUo z<7Ys_xy3p>DjJQKTA7SC7t5#1V-`_ znwGmJ4VKHpDx$PH=UX8qxd36V6=T$SrErqPzL+=Pp#4Mv)priQqR2y93)W4{)he_| zT&X$Kl+>&kh{KTR!4-9cO8U2kOiYSqYs^@wKp;oau^{{Ja9a9Lu%ghX8Y=Ec1`N9h z9QumfK)!j&T%ZW;*)f(S|@wx=-eU5TVy; zh#ClFh&-$i-BVv&r7ogPfRLGoq)HXMk&ICtL#onD+Ds)IPf+Oo`k?APSlGDwqAk+K_6)`bl64J1nlNJ!w?324#q_lY&19%Pt_eu)#33b7?&ArP1*vh^$YhH$EcOpd`C-CAQDl0%3g zIH3!~uqe}#iweRAyWwO$Y^($m51ou6s)xZ=sF|$LhD|7y5&h@ipe}S0cb&-kl`_z_ z(1#029MD-cT^Vl2aN==IFhwQ17_^?Sjc!UksV-GBM!3Tcpz=9^NuS7(3n{ zbN(Q?oQ_Wq?azNkeTB)V_GbtEUz&W(So8s{t4@`G><%$Ok}S}7*ho<%>%^EeSV~hd z70fBY(wNni4uDcq@RU-?knTWo?L!HE)ybryPiWai@W+Zw0VYMPwq}ceB`mLO_x$Zk Wqbxmdd>`5VXr}%5^8eRAq4@`i@0YFs literal 13407 zcmeI3%WmUF5Jj{0R~TAnp(;wElwSz~L9vywkg+w9nY$F%tg{U*F%4(~k!$sXhl#8ryN1v}2`0Y)I+0F6ceA?Zd zX|1x*|391iUSIzQdXW0RoQ_}jLztXTPy6xV^YHKU)$`R)S1q{yE!OV$=iTk@yesiH zymYree7ZXi_hwx;d$aU#|K@nwZ*T5)hllOw@q#nW2D4#>;~$e-!_7}ki?_dT-yU8-r@d1oXqUx|A3V)@L5&Zd zW3rB;yAt>9^+7>z`)QZM4a~6S469;@@r8N8iFPBFm~w#u6(wF?D4;V=$?JsF(Nn6m zUZEaWkYa+rqZlj5z2Ou+2jDs>mE^8o+}7+Nb`K$=W~EUz6)<0<#uV!U&f|azzU>B= znA*RCd9lTs<=SKz4d>xxLp)Abo8W(&FBUX)!U`p=j4y1U^qQ&K09rMAC@2FO?5Lp* z+sZkG-~h&5V#=&}xk;HFwmC_%Z3GQpDZ@B}kfFzvK`H64wgx>usS4?80}C_Q8Mzo9 z9KVEl86g{Lwz8R~m!K_zB34#5Y7$EZW#F20D0+F%DB-4wkbxkek8^=aQD1xk4%*{7 z<`5~VCE6(}ZEI_6Fawl8q)R$m4{wY$-4!!pyaFT=649>FG0>qECPz7A5{!ZXE`$qB zN?WYq!67Js*v!Dx+XkANQ1oWHNgdK|Fv%~mA`vo~mgK+?p_Ub+1jG>nBr`{nmuQm^ z8NQ(R@w`?mqky%D8gI}&lO7&I9wIVC3_e%#qaD%^j(x-m(9yxilcvgAN4A}=flk8w zNNfa`j!a@j3Vui;Hw^w-`Zg&S@UU9kw&#qpN$uPQ1Xq|c6Qx^38TBk^NYdb_U4>Bs zLTbPj_8G+z!O^-x2CBdVN=H>Jac~3}6;*-P< zArh1P3UU(zp~+;<#&du?@l66FY`w+WiE6eE;?bld)kYw$YiDYlfca9EFy(|l2CGR$ zozO;MDB#5!40Hx6QJ98?Ats%zrUs)IS0F`Y?qIhuB6M$o`ia77G;r|~lBN>iXi zzQD@=d>Jfo?J`^(xkB7Tl@ZDI&?UqMaIGoX8(^S7VGJy$BB(?;nFS~davGC5WM&(B zU(*f821;D;dOCi|OvhG8r!C=)HLNH~027ECC6`d$NEV#T6O8L*=3%==QAWq%b&`Yz z>#iVpFez|KnT|p$4{-oY!%Y$mgH&Dx2}>BbqY_PW4{)~0al@EL7Mv2^gm??G++e9F zNKVF#Z?M)Qe`F&os7dNc6@)a!T98bL2{)A}m}!K4#3DwG%unzqt08nG)33;uVnPiz zx-bDvyAlV0ive9+bQ2)!(c0*eY?y>(5X8|q91tvFS!vN7hEs_tE+b3`a3Q+I(oOvd zmWSFVTO>jIt3cqklO83|gfUi(e(jS*4rL0KIilKJVyfq4;l(IYEk|%*DTgg)z(a+Z z>Q<=7!zl!UOXT2ST9=mC=L{B72(zH6$XryU(Dv$LQv?$OW|vUhF-+*g$*e4U(|pX@ zh)eYe@f_C2Q<5v{XgHdjx+e?ZV1xzj5b_1;IhYu7j#brVWbXma!E_jN4B(1vZlow5 z!;%i1bEsBuMrN;0eW<~~MHTyegZ5MJGo)I+5>y`GB6w0mmKV&BglS*{2^2LevZJC( zy-BX9LY{ul#K8(cC4mkAlxmc6RV=arhEP@3XC>~#|qUvWlaL8v|z$+Me z5o`>;ts1JHn`K#V`~da0W>q%sxq{p;6E&3f-&+qH|?Ur)!=)BW~t z`2K15jtQSC$=6syB}*}hhFm6As)n1+yksN=8Kt5^Q#}lR@{zkeH-~TGDZ@=q4Y9+B19UfK8<{aGO!iI^eoMhnkHj|%|`-)YiaKSjLOQTiv(!~rLxy)1WCDI znK(|AV5O3jQWQ)fuIx_F4gm`%C7%k>ZYI6u+g|~go1BhM5ACluCWj)k-`m&X!ygFz zfU^+tSquYXd|FG~5~B|3iK$Lsff32v5 diff --git a/packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json b/packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json new file mode 100644 index 0000000000..ca9f21e752 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json @@ -0,0 +1 @@ +[183,213,77,25,46,6,139,69,130,159,190,72,193,8,131,191,105,54,247,90,65,206,156,68,41,55,185,93,114,209,189,211,207,236,91,86,76,47,4,205,217,32,122,8,123,104,168,118] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json deleted file mode 100644 index 7f0850a40d..0000000000 --- a/packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json +++ /dev/null @@ -1 +0,0 @@ -[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/msg_2024-04-20T17:32:57.805215000Z_GetIdentityKeysRequest_b4ecff7acf52818aef9ed37a98d4a459dc7a67570ea6df3f8858d3fae7820ffe.json b/packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/msg_2024-04-24T00:37:29.611949000Z_GetIdentityKeysRequest_b4ecff7acf52818aef9ed37a98d4a459dc7a67570ea6df3f8858d3fae7820ffe.json similarity index 72% rename from packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/msg_2024-04-20T17:32:57.805215000Z_GetIdentityKeysRequest_b4ecff7acf52818aef9ed37a98d4a459dc7a67570ea6df3f8858d3fae7820ffe.json rename to packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/msg_2024-04-24T00:37:29.611949000Z_GetIdentityKeysRequest_b4ecff7acf52818aef9ed37a98d4a459dc7a67570ea6df3f8858d3fae7820ffe.json index 73d7c1d6c87db55a28d8e21dfbaf385468a1fac3..a45f6fb1f950c35b1bab17021cdd5f8c0e17152d 100644 GIT binary patch literal 14923 zcmb`O%WfM<3`J+{uL!iBg-E^UR|W$?v6WbeY$dWBAPD^L)77yh_BoEdnAxejtLwqK zyu4(!eqMd}F#5hdKI{(nqrX1<>@M4l@%eXmwY%BgpLVAo>)lOv`|rLFBdtPUoOU%pR>69jz#GzV|95ln_hnBxQ;O{eZ{iAKdsHm;4v<(qBNS8 z>CQ@ z(q1}HvZ|KXfr*p^q-QDigHM)P?@6R_6pFTZob@%J> z@VyOwIzDdu9$RluS5H@eTs4Hf2e`ZKX>+qVZ3Z(P-EMcEZ`)9#oQ+;4&~47xo62Ut?)rJQ=*5o5?Ze}~t>c%o^$ypKaQHO1)h+CE zv*OLi^~=MH=e2jr4BBNuYX5YM=LNm}^NRu7WwFRBm(_1xdyKK)?(BbjI>DkakDL~N zZ1avOj1tS@a;?RrxMTlDV!9FRV#XGUX;h|aeO7jC*ONjZ?Ya_XyYA39+^oWa?Rf^5 zxkQgq38e3Gi7vA;THomyoq7~nH))#6@BOH>L`0#*zC~sD{)XmN>G{=(#u6KnmEGGb zc#cb8irYQh3cUN@90fz6Z|oSJzI{nY!5UNhPy=dj1LND{^ht`~_pt+MZ1m((6+#!FcdBYn4w#kaQGafkt&j#tpx=q919r5ugtOLoM0M3z|0BSDG{Y< zaIZ*M!7hl06=oS#h4y>L9y0OD0@p!bqa`A^t`#C7uVp%h&P*DYfew~pb3lep07PQC zn=Dw?uR0!XeYr-L29FmihyH+4HzU_ZDsVRs99d$ z0DC4nrL970NeiPjWeUZ27+0c>J=Bb?ts-m2*x$hR$j8An07$H0*jM5!<}6=X!m>g4 zs)=ozGeu$s05V9o+Z)uroHgB5VJODd~!a2s5 zSd1k$8yjP1r&&a;L-I+oIngw19v0@q1`DhxR=6Q0zoLq>FfIhUr=i?fDwd@CD@2T74X*# zi5HGgD}wC}Dt9V-X>GGE;gn;s%5%LB_;W1 zl)+Bjq23VJL06$6q`rkiYS552UI4mmz_=);5*IEJ2ZNc35X8VJB2sE4WXlvZW~y*a zV-X|DQRN)(5e<`87JT_WZJmcxRo)bw#kik`_ z6bcy=;Lk}dOVcJD+}_4@bJjZNa$d=G(P1@-p~EXfBtxJ%V=YyM4o2j8%&cHmqAPfq z6Dx35{cfXSMZsE!vnjhHK+sRg7L1F`OtkfqBxzCuE2>Wdj@bcg5=<5}q|6{yL!F$= z2jG_g56z4fihG7wd#AIQ!2zZELvaEVP>Q}(mq4e=(#mca{!}bwCcwDj!UEA4OcYr+ zlm}=ZdJNsiA5gLGb>W9h&xOrNd6KxXqGGsOY_>V#JONB z=O6GR6$=>{R0^av435DrliI_gnhfL?%wnCDs1N6N@Hx_)%br9tBR7X&9?L)tqIo6% zfVOAQ!w9z;s`ifgI(ZRDMByN@>pslsu;=gqV_QPDCjoCd|E}kbwqS zLIOjkaV?LQ&_Rn%Iv6|Y(Qs&G4{Wb;qKJ$fPF2Iu#ONQ45|q%=)Krd2npEAzs&(4K z!d;NQLj?qut+;IZCWM;8FS$T#pdIPUnln>Lq8@3&yW~Pgo?%G@g4%OHDh?rm37RAc zsRR40;s<<`7E(1-XI-QofmvsIJc^)HWhAmXWE>~EaY%5!tSTZ>+(?Epm2_h9{K;<1 zTh8BAw~NuY$HVdQZhhN*XU=IlHIQU`SJq?8B=clxgi1*+h&@}M!~6bj=EXsWiTPq4M32f0=~ zGR2nP384(ccss+aL{om0j1MP1{IZysIR-ftDykF5MWWnGwsRjw}Rza?LPmJu+xp_mgheQ_IIBD G-1jdAULC9e literal 14334 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 literal 22156 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 diff --git a/packages/rs-sdk/tests/vectors/test_identity_read/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json b/packages/rs-sdk/tests/vectors/test_identity_read/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json new file mode 100644 index 0000000000..ca9f21e752 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_identity_read/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json @@ -0,0 +1 @@ +[183,213,77,25,46,6,139,69,130,159,190,72,193,8,131,191,105,54,247,90,65,206,156,68,41,55,185,93,114,209,189,211,207,236,91,86,76,47,4,205,217,32,122,8,123,104,168,118] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/test_identity_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json deleted file mode 100644 index 7f0850a40d..0000000000 --- a/packages/rs-sdk/tests/vectors/test_identity_read/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json +++ /dev/null @@ -1 +0,0 @@ -[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_2024-04-20T17:32:57.822981000Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json b/packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_2024-04-24T00:37:29.629157000Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json similarity index 74% rename from packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_2024-04-20T17:32:57.822981000Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json rename to packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_2024-04-24T00:37:29.629157000Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json index 26ea2400cf8930fe6a3e1b4a085a611984d8bfda..2f7f45c7000fc3d48baeb69b38e7d3a14437440c 100644 GIT binary patch literal 23447 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 literal 22156 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 diff --git a/packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_2024-04-20T17:32:57.846960000Z_IdentityRequest_3107337faa1f180a1071b78a90dcdc46e3cf0d7d4ce093bba24086e17410ed7d.json b/packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_2024-04-24T00:37:29.651813000Z_IdentityRequest_abf7b19244827334575a04cf67f428f9b6b120d8fa853e3398e1539b8fc54d9b.json similarity index 77% rename from packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_2024-04-20T17:32:57.846960000Z_IdentityRequest_3107337faa1f180a1071b78a90dcdc46e3cf0d7d4ce093bba24086e17410ed7d.json rename to packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_2024-04-24T00:37:29.651813000Z_IdentityRequest_abf7b19244827334575a04cf67f428f9b6b120d8fa853e3398e1539b8fc54d9b.json index 12a843e9bc7048161bd561991d2aea4aafa26770..de49a8398d2e9381909cd23b3851e564edddd7a2 100644 GIT binary patch literal 29547 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 literal 8229 zcmai(*^b*r5JmGmUm@r@54^=azY+w5EHNV?qv1rN3>e1zySrx#d2Yt`gYBl+wb!kM z-|se??bq>gJx!0>KQ`afF+V6i{+~`ym+9-69?X~9`11R6`uq9r`R=#7{Qj@5pT~K3 z*v-2I$#m&Bp6-uxdbTag?e8ySUs&&_%Q)t55vcss_R(1IX+GMV#S(UA#D3%w{okRTrydgf#Q&MqG|n{s`` zT^twY$#<*uUHpo>VD$5s+h$D~oIo11aIDv)U=EP_`4N=Wl9;+RGga;SK?F4G;SW&) z*i9W?=pj@|f(0%_Q0kT@s$uUEJfeVF>Y+H*ih_FM9HLa@QQ-v$-9e-VuPdMwT_ZAR zX*hwUkp#=AK%s_=C9Fp0M+IlnxeW*^5H4iU;&&C$DFk1)I7da#nHB-HEnK1mS5v%z zvuYT^604=A!5a;vDsh&%mr}YO^iOTZA`=)7KYJFe;RCPBQ<))1GX$MurYD9)Kq(ms zCbt6K=%F?dM-4875U3s888u!=HF|BUD3Kf;dB9c;Sjb|kh8jJ?m@Jtqsv#t0A_@{Q zV%fIj8r(q%9_cImPP?n1Sv%-x5{M;D1q=y4*zc;q)U>uBwZLycf}j)?5G5)o)*;Np z03x6Wj)sitVeKgF0iG!gJjN2~I56@3|O8`UDSaWu4oBXNWR2sIKzOstQf zY>6ad63=4OCDB8czCyf}1|q&b~YV;JHUB49?*jaGJot-Ko0us%DeiAl~E2&n8z z$x?)-l33Ow+N|C>0+Xfye|}zU-TqpJ*!JJsbh({}V_Ny8)g88TgcA{=#9^0}-zKt_ zq5@#7Vg*rBh8V0+Y?p&l8E$eomf;?ogAm*%UtU2~tG$+a#38GLmIIvoExj$m+3%SP zjcJ-LJ`JDi>Hcvy-!6Gkj^N>tVzP6f49-@;E|8t54btp9IB2uEF#_CL*#Jn97;C;B zU^!wH=U8O8#)h2x2CK2w&4{CttphFKnPirQW=iToZ_2z!h$nt?XJP4KYH<#u62Fq+j*m$$ivu`JCq^*v6b+`G_ z>LiJ>9r7`pMX!!ei_2xYJ?0ORt1fu^C4V3tPU#Ej|Mo0|d@gb5e@?R&b76D6bwMn3 zVv|QC^AVYw0MW9x=wY(hRKvDN{O)99H#e%LI!6N=#%z?b4-qJbT(7TuoxTX$0*pn& gTKw+QczWw~=WkEBT~X0|yqQ1k=RdFizJ2Kb0c&}RIsgCw diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json b/packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json new file mode 100644 index 0000000000..ca9f21e752 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json @@ -0,0 +1 @@ +[183,213,77,25,46,6,139,69,130,159,190,72,193,8,131,191,105,54,247,90,65,206,156,68,41,55,185,93,114,209,189,211,207,236,91,86,76,47,4,205,217,32,122,8,123,104,168,118] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json deleted file mode 100644 index 7f0850a40d..0000000000 --- a/packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json +++ /dev/null @@ -1 +0,0 @@ -[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/msg_2024-04-20T17:32:57.847045000Z_GetProtocolVersionUpgradeVoteStatusRequest_ec9dca65a964669b3bc8195d5ff106e5eda740be44679cc960ea35f2134af628.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/msg_2024-04-24T00:37:29.650285000Z_GetProtocolVersionUpgradeVoteStatusRequest_ec9dca65a964669b3bc8195d5ff106e5eda740be44679cc960ea35f2134af628.json similarity index 69% rename from packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/msg_2024-04-20T17:32:57.847045000Z_GetProtocolVersionUpgradeVoteStatusRequest_ec9dca65a964669b3bc8195d5ff106e5eda740be44679cc960ea35f2134af628.json rename to packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/msg_2024-04-24T00:37:29.650285000Z_GetProtocolVersionUpgradeVoteStatusRequest_ec9dca65a964669b3bc8195d5ff106e5eda740be44679cc960ea35f2134af628.json index 21c535cabdd031820be105632d426dc5d4cd07d0..c82ac29784cf7b769bb91db40505e461153d80fe 100644 GIT binary patch literal 10892 zcmeI&%WfM-5Czbz^%Vx!S+JTMKJqI;K+qCn5s^fPqKpKF{yj5#nRBikZ?cQMuszM` z?&^BoTh;UV;@!K+r`_>>f4H0c^6qp0I1EhR{@*{{pSH)-=Hv0OIsLV{-risLKmPjk z;_&kH=O6$5@AdGa)8Af|JGneO+?{&Gx3`hrAfI;q$m#g7dwTt`|NHUc@#3e8!HnOt z>h12dz1p6(XO`|KUGMfEu7`alt(&}V)sJ5uj=Rm}^>%-^xj9_^vAf#5y;yM=4vq-_ zu4v}+$Wn+pQ#n(NTr)OTbQY{BN2>*gFSl^TB_fwbuke!@CR(#+oAN@_M2#686T%Za zY}{rjz8q*%RN1FH+`H7~ih&towuTtG|I!J@c{QafrXVD*^Q%f2AJCUkGLzff-#Kg* z?pw-UnRIaQmHui-)D(Tput^VH<5MKw;3*KPL*z*2rdmu?>HR2{6E!njEfJxX z>=EuC1GR`X*w%B+&_ft^toASzW-)~0P;JhkOaeGUt->FbSPyP9mB13MkUDIE@02iH zrnXvhtZJCQ=4|?vl6I4@1a*&UrnN)JA#Ok@` zED;_%WzVnhaMTo-FV0wnigu|*ge+sgYQ6N}vJ{SUT0Jytnv%$u9FVXmoj!PhBvVD; zJfW9`>1FIq8Q1DjRvB;{xddCUICB`r5Rpxl0~S<~;~O&o?y>T$siA+u~=l)z5k$vbWrZJn`WEl|1YX;IxrcWb<0Ni>V>E^myYP@WiR zs?J-P&mA}RD1|I3pO^zonq!*Dwb_Y@l%k^q%tgmdM^T7sdb^5J`Fz3LXm*bhywWLEwb?KDUwP0VKDM9)k+QXbLujmk#;{Hn zxZ;f2M2FD<%<(Zl^du6tslggxsA43oa-pOt9z!wBF#?OWT#$sDjny^<;SGQNNth@_ zh%MQ`@;N&C&E}%Wr7g39vECp{;-3-v7@7lMBNqc!#*eIQ+c1tEFc$4!QMj^Ki-fpD ze`7Y5v7|52>9Lv)M2IGgnao;Bp)1@>$E_fWYtCsqYN;I~-J+S`ftsrpE-7h98ip%I zmp95IrCh#TM-Bwy?FM&vnEd&0I6mCwCHnBAydj7|@E;p%aebIegu*my^X4G|%z7Zw z1w_}3Sen3d1o6#MZjB>kO>DI%&5EKn?JVF#q29DvRFrm>jpSxUxt@R1dG7Zg?zX3g z<8bNEHMMN5+&9f?y`4>N0bRfjo=T`iX&aYVaVOPug>q9HHYMiU-N>Mb_?7nMJ)|eY z`=YKAfMP}YnAh~RX3M4`N;Vtaf894)tdgG;0$i^M<){H8IgkwU)*@)W4G)1P`LVe2 z6>lE{sK67B7@u~CBL;_YT#_uE%sgw;H!i=!d_mH)3nD}AKe`z!BD<53!sK#6UkHY% zHCnW|Oq;qgZfA8OpACqL%QdZ6n$N0UJvB3|1#{*$tI+^sKlbTAq#7H?`{qbxVG5W? zR0`h)mt+5Z+3<1Ii2hFA4Dl?3}qen+12f482 zA4FG7=d2_sqzW%sJPFH(A;X+dVV= zsMoDq)%<*Mc{%yCJ3j6Y_mkf)Klj7o!SwzA{pj(uJ)SlX$HV6I&*o)9yeW5bb$Gfz^@?xrPkMuV+VxLP$EV%P=g@(@Q$=g=_^Q*&gx4F96?(a9ZhpWGK*PHh*Yd(KJRR87f z;czv0$eCYEPW!vv=I(J=wwBc`x>>iZHl3dD(2H|ATpeyVU%j!;5Ad@0{(4yBy7$4m z?P)h0WqZ46ZStzF=eG%ye4c97$XM-K*?^gA5>96jnEejK!T{b6wLmzQ51dzf=} zf?;?j=gZrgzil`SFE2ZWem|X!KWI~CEE%sB;|bMRvSY<1C$7br9fl*;Y&l-Cb?&j| zLB|qp#-=mWP~D0>8gjMr!IUX$jydB{wLntltB9pStj9;J5CS1<#gP@EG+vvt=ZY~y zHsmehGUQ{9+Tk^Q?2V;wb7s`c2Mr^m?^>hK6(8ym|WkkjwPE;Q-08KsD_T4 z5!^b&Y&xErn!DtbJ!{F5amvPwv_^QZst8@JvG9UJEZLLK5sJ5{nV}zJXTEMJ{n$6x zc$$v5#JLx^QJ-hV3nm24+=3;FEm$xDy%y-NgtKaBWzCEQM=JfS=B%({g=$FQcq7nB!)x(3LQ2gbD(9OHC1q_bXrP=aIZrqYJE%s7keo5G`b4i53XpnkX&( zNi~-K6Ao50RP_yrSF*WNRs=$u@gTSYPAUMG%wWxe5jYBJ_zRV|uo8`-0liC&I2&vI z%(4T)?Eh%wpIP>cUPi_8@Mu92u4V+9wo7telFEp4z(-zI5}F@xDW;0qrj42ds*x$#9q0j{!(UK&!qj0tajdu z86YMy_Bi1+ZAFSx?`6lL1{!lp)(VhOa(8Y~Dm zaz!awlASh1{Y^+RP@*d#%afpm&qiCrSRFe|v|WrUK1ZPFk?4Qr0a>6F$O1#1mXI0{ z80cgBpvtUSe5^mx_quN#iVhpn02$5)q}` zR<(k#fEid()~L}Bz~L=nh~hFvV}n|-q8*F`QF%g}QHhjpZlPUrljw5jL3W7BV}h6w zNS0<%>l=AEN1MThA{(N|rfCAB!?w}sEK`LJWn0ojQD)etm;#JEQw%gUMO(8?;St6@ zdMwFMa(rwXJvH1fWQ;7YskCL##%L}9c;uBZBqu~exSETBgySJAMq0(+2l5<^|#gIXb&8UJQy)x`y#?SJY2pPCX7w{>f*cZ^SJ+b zzdb!2hueSdt1VLE>=u;Gi@xXx7#aNy{#b)D58q2}Vu9$FTL4N-^|cZZyj^K#@u(t9 zsS@(I?G?0w&BP6L*%u9mmkG#KqQMZ=kk+iQo)9m7+p~yfo)utbkw`piJSN=V_>e-y zH9=I$S-u1LAV(A;nYWk`_#eUQCm;WJR7Ad{k5AcBc4idB0K z0zyT9H>J=+Lb{kupKDRqhn`GzCCL-XvP6zw z2B_I+^cXBQ!z&7RZ=|E_wxb%NTN*?$78EA#KB&%Yua9g!+}~+0lLj2BPp{wgr&q3f Z`uAa=D>Yrbe>wbKarpD)-`8I+{s$Qn^tAv0 diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json new file mode 100644 index 0000000000..ca9f21e752 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json @@ -0,0 +1 @@ +[183,213,77,25,46,6,139,69,130,159,190,72,193,8,131,191,105,54,247,90,65,206,156,68,41,55,185,93,114,209,189,211,207,236,91,86,76,47,4,205,217,32,122,8,123,104,168,118] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json deleted file mode 100644 index 7f0850a40d..0000000000 --- a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json +++ /dev/null @@ -1 +0,0 @@ -[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/msg_2024-04-20T17:32:57.846269000Z_GetProtocolVersionUpgradeVoteStatusRequest_983670ac95678b1166deab32209bf1acc3394d29ac72f662d38e81344496631e.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/msg_2024-04-24T00:37:29.653372000Z_GetProtocolVersionUpgradeVoteStatusRequest_983670ac95678b1166deab32209bf1acc3394d29ac72f662d38e81344496631e.json similarity index 68% rename from packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/msg_2024-04-20T17:32:57.846269000Z_GetProtocolVersionUpgradeVoteStatusRequest_983670ac95678b1166deab32209bf1acc3394d29ac72f662d38e81344496631e.json rename to packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/msg_2024-04-24T00:37:29.653372000Z_GetProtocolVersionUpgradeVoteStatusRequest_983670ac95678b1166deab32209bf1acc3394d29ac72f662d38e81344496631e.json index 59b15a0b6086638b6215c1cbad9aa6f28542787c..82b4cc8cd3649548b623ffe5d6ed2f5715f6b279 100644 GIT binary patch literal 10644 zcmeI2+fo}x5QcNjQ&76j#s0l#zltlRlEns80Ys#g%Ptr1o*4o1&i51i00|es?#`jl z{ddp&xVpYxeVq=+-Tra)>H0@{%rC0T|LN&CZw~YN>9AkV-`01V<6Zjr`H$bvL(}K& z{`5GfSE{PZyEORgl-|vU({vv9oPIxFJzxEHmAClSjt|qkx!KH{1r=%1-L$*C%R8;2 zUA=8}Cg3oww|AS}FZS2;buO;{bK3mr!d!HX}Vf+$nCEA1piX%2W%gUkq!LG$l9fqt$a zRl*byiQ)K4A(RYqFoaBI>ACLgFt(_%L(ssf*B0)9SlGX%?W}6-yeVFS|6JxoPd+7kH0fq zs0Z&sott5n(#2MktNe4J3)1*=5X$)I-hT6 zh!lN*DOiF98>})u2?oQ`C5r|P$R}_M(dZ2q5baP9Fdmaj2T9X-%=0Nn)^C=MEtWvn z19&#Y&_#%*3|_H#bBM>b4!9=#4UU&Uw1EzbkZeWJC!hzb?nn5c(L_0R*uiKf@MV^O zo_-N`xSh3-$}q)3iQ)b{Tu=m>qH96PRzDIaTA0$ZZJJ?=2qi@#MaajTgCOIr zJ@{L&LbZ@WL$Nex-8~u#i4e;}6NJ@FkhLk3VjHbtL(}W#y*p}FU zG0#p9f{je7in{a)hNuHk(gGF~iAOL19dWVJ_VE=f56Ifax}`B|H8Ts#`@*1s{%^iU z_+p(NR@0Ud*yglI##)L*%gl_1D+7un_+*Q*ryecbLNbN}sV-}b20??vFqmQxfLnP) zD*MHG<>kCM$D`HXr~Tpda5+p~j7uF7SYEK|GW=uhJsws15+*RJHF(P535+Su!UbH0 z5m8hD`7q$?rQ8TZ2-fXlwdc}=+FZ{}I98|!b!HVM+g|kKU`07L3!^BF=eWCl+{~v# zzF>eOaf7Yg*VXEMT{xeZ(3!9er*Z+7wsv4<=U+in5I1GRW^wx>dsw;;Kq|~B%zp{{ z{LGVU!uqVPVgj-iiN|;)KqI!a8vr7jweCO7*IKLuKTZVly3CcW2DIRSVBn_~2J;zj znP?mzGq1d3?Pbnq;xR+C@WBH%ItTq&1X(mP##saXtf)+V2GYF?!d_9j;8P01iVt6u zSkB-JoWW|1U>vY|m8J}{V|7AEZ7IqQ*Qh;PXht#NT$j;-x72z-BNs2aAg|D7zfRq+(Tp9U&8r_|-H9 lWAO?`-7ajR1T3#;cmDpAAxmnFTt?<=k@@H4@9QPWe*oEt)MWqw literal 10645 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 diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json new file mode 100644 index 0000000000..ca9f21e752 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/quorum_pubkey-106-32f78e1ab8f7beb1edc06a461c486e1afd90c1d4732f93cf8287fa0e9c27e35e.json @@ -0,0 +1 @@ +[183,213,77,25,46,6,139,69,130,159,190,72,193,8,131,191,105,54,247,90,65,206,156,68,41,55,185,93,114,209,189,211,207,236,91,86,76,47,4,205,217,32,122,8,123,104,168,118] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json deleted file mode 100644 index 7f0850a40d..0000000000 --- a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/quorum_pubkey-106-74a99f32dc4d12a6d3a3f02dfa34f96cedd665e3629baec62e8777fe169fc6e7.json +++ /dev/null @@ -1 +0,0 @@ -[132,249,59,196,81,157,6,73,112,77,16,80,212,23,49,138,16,164,4,130,169,33,129,84,52,20,174,186,3,132,254,96,166,51,9,209,96,142,242,180,224,179,143,71,37,70,89,13] \ No newline at end of file diff --git a/packages/strategy-tests/src/operations.rs b/packages/strategy-tests/src/operations.rs index 2affeddf50..2cbf7e8a04 100644 --- a/packages/strategy-tests/src/operations.rs +++ b/packages/strategy-tests/src/operations.rs @@ -323,6 +323,7 @@ impl PlatformDeserializableWithPotentialValidationFromVersionedStructure for Dat None, true, true, + true, validate, &mut vec![], platform_version, diff --git a/packages/wasm-dpp/Cargo.toml b/packages/wasm-dpp/Cargo.toml index 5bec0550a4..dd1eff352d 100644 --- a/packages/wasm-dpp/Cargo.toml +++ b/packages/wasm-dpp/Cargo.toml @@ -18,7 +18,7 @@ serde_json = { version = "1.0", features = ["preserve_order"] } wasm-bindgen = { version = "=0.2.86" } js-sys = "0.3.53" web-sys = { version = "0.3.6", features = ["console"] } -thiserror = { version = "1.0.58" } +thiserror = { version = "1.0.59" } serde-wasm-bindgen = { git = "https://github.com/QuantumExplorer/serde-wasm-bindgen", branch = "feat/not_human_readable" } dpp = { path = "../rs-dpp", default-features = false, features = [ "state-transition-serde-conversion", diff --git a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs index c124b9f0ac..4f39880387 100644 --- a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs @@ -61,10 +61,12 @@ use dpp::consensus::state::data_trigger::DataTriggerError::{ DataTriggerConditionError, DataTriggerExecutionError, DataTriggerInvalidResultError, }; use wasm_bindgen::{JsError, JsValue}; -use dpp::consensus::basic::data_contract::{InvalidDocumentTypeRequiredSecurityLevelError, UnknownSecurityLevelError, UnknownStorageKeyRequirementsError, UnknownTransferableTypeError}; -use dpp::consensus::basic::document::{MaxDocumentsTransitionsExceededError, MissingPositionsInDocumentTypePropertiesError}; +use dpp::consensus::basic::data_contract::{InvalidDocumentTypeRequiredSecurityLevelError, UnknownDocumentCreationRestrictionModeError, UnknownSecurityLevelError, UnknownStorageKeyRequirementsError, UnknownTradeModeError, UnknownTransferableTypeError}; +use dpp::consensus::basic::document::{DocumentCreationNotAllowedError, MaxDocumentsTransitionsExceededError, MissingPositionsInDocumentTypePropertiesError}; use dpp::consensus::basic::identity::{DataContractBoundsNotPresentError, DisablingKeyIdAlsoBeingAddedInSameTransitionError, InvalidIdentityCreditWithdrawalTransitionAmountError, InvalidIdentityUpdateTransitionDisableKeysError, InvalidIdentityUpdateTransitionEmptyError, TooManyMasterPublicKeyError}; use dpp::consensus::state::data_contract::document_type_update_error::DocumentTypeUpdateError; +use dpp::consensus::state::document::document_incorrect_purchase_price_error::DocumentIncorrectPurchasePriceError; +use dpp::consensus::state::document::document_not_for_sale_error::DocumentNotForSaleError; use dpp::consensus::state::identity::identity_public_key_already_exists_for_unique_contract_bounds_error::IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError; use dpp::consensus::state::identity::master_public_key_update_error::MasterPublicKeyUpdateError; @@ -229,6 +231,12 @@ pub fn from_state_error(state_error: &StateError) -> JsValue { StateError::DocumentTypeUpdateError(e) => { generic_consensus_error!(DocumentTypeUpdateError, e).into() } + StateError::DocumentNotForSaleError(e) => { + generic_consensus_error!(DocumentNotForSaleError, e).into() + } + StateError::DocumentIncorrectPurchasePriceError(e) => { + generic_consensus_error!(DocumentIncorrectPurchasePriceError, e).into() + } } } @@ -460,6 +468,15 @@ fn from_basic_error(basic_error: &BasicError) -> JsValue { BasicError::UnknownTransferableTypeError(e) => { generic_consensus_error!(UnknownTransferableTypeError, e).into() } + BasicError::UnknownTradeModeError(e) => { + generic_consensus_error!(UnknownTradeModeError, e).into() + } + BasicError::UnknownDocumentCreationRestrictionModeError(e) => { + generic_consensus_error!(UnknownDocumentCreationRestrictionModeError, e).into() + } + BasicError::DocumentCreationNotAllowedError(e) => { + generic_consensus_error!(DocumentCreationNotAllowedError, e).into() + } } } diff --git a/packages/wasm-dpp/test/unit/dataContract/DataContract.spec.js b/packages/wasm-dpp/test/unit/dataContract/DataContract.spec.js index 649e61bc98..4726cb31cd 100644 --- a/packages/wasm-dpp/test/unit/dataContract/DataContract.spec.js +++ b/packages/wasm-dpp/test/unit/dataContract/DataContract.spec.js @@ -223,6 +223,7 @@ describe('DataContract', () => { config: { $format_version: '0', canBeDeleted: false, + documentsCanBeDeletedContractDefault: true, documentsKeepHistoryContractDefault: false, documentsMutableContractDefault: true, keepsHistory: false, @@ -252,6 +253,7 @@ describe('DataContract', () => { config: { $format_version: '0', canBeDeleted: false, + documentsCanBeDeletedContractDefault: true, documentsKeepHistoryContractDefault: false, documentsMutableContractDefault: true, keepsHistory: false, @@ -272,7 +274,7 @@ describe('DataContract', () => { it('should return DataContract as a Buffer', () => { const result = dataContract.toBuffer(); expect(result).to.be.instanceOf(Buffer); - expect(result).to.have.lengthOf(235); + expect(result).to.have.lengthOf(236); }); }); diff --git a/packages/wasm-dpp/test/unit/dataContract/stateTransition/DataContractCreateTransition/DataContractCreateTransition.spec.js b/packages/wasm-dpp/test/unit/dataContract/stateTransition/DataContractCreateTransition/DataContractCreateTransition.spec.js index 973c2f90e3..dc394aee3c 100644 --- a/packages/wasm-dpp/test/unit/dataContract/stateTransition/DataContractCreateTransition/DataContractCreateTransition.spec.js +++ b/packages/wasm-dpp/test/unit/dataContract/stateTransition/DataContractCreateTransition/DataContractCreateTransition.spec.js @@ -66,7 +66,7 @@ describe('DataContractCreateTransition', () => { it('should return serialized State Transition', () => { const result = stateTransition.toBuffer(); expect(result).to.be.instanceOf(Buffer); - expect(result).to.have.lengthOf(2358); + expect(result).to.have.lengthOf(2359); }); it('should be able to restore contract config from bytes', () => { diff --git a/packages/wasm-dpp/test/unit/dataContract/stateTransition/DataContractUpdateTransition/DataContractUpdateTransition.spec.js b/packages/wasm-dpp/test/unit/dataContract/stateTransition/DataContractUpdateTransition/DataContractUpdateTransition.spec.js index dd2cda514c..444f695113 100644 --- a/packages/wasm-dpp/test/unit/dataContract/stateTransition/DataContractUpdateTransition/DataContractUpdateTransition.spec.js +++ b/packages/wasm-dpp/test/unit/dataContract/stateTransition/DataContractUpdateTransition/DataContractUpdateTransition.spec.js @@ -65,7 +65,7 @@ describe('DataContractUpdateTransition', () => { it('should return serialized State Transition', () => { const result = stateTransition.toBuffer(); expect(result).to.be.instanceOf(Buffer); - expect(result).to.have.lengthOf(2358); + expect(result).to.have.lengthOf(2359); }); it('should be able to restore contract config from bytes', () => { diff --git a/packages/wasm-dpp/test/unit/document/Document.spec.js b/packages/wasm-dpp/test/unit/document/Document.spec.js index 8e7f80d90b..3caa3750cc 100644 --- a/packages/wasm-dpp/test/unit/document/Document.spec.js +++ b/packages/wasm-dpp/test/unit/document/Document.spec.js @@ -424,7 +424,7 @@ describe('Document', () => { it('should return serialized Document', () => { const buffer = document.toBuffer(); expect(buffer).to.be.instanceOf(Buffer); - expect(buffer.length).to.equal(648); + expect(buffer.length).to.equal(649); }); // TODO: remove or replace? From 122bbb9ccd11eed4bc1f95f84761d207116e5991 Mon Sep 17 00:00:00 2001 From: Igor Markin Date: Thu, 25 Apr 2024 15:31:43 +0100 Subject: [PATCH 146/191] feat(wallet-lib): optional sync of the account (#1830) --- packages/js-dash-sdk/src/SDK/Client/Client.ts | 1 + .../wallet-lib/src/types/Account/Account.d.ts | 1 + .../wallet-lib/src/types/Account/Account.js | 7 ++---- .../src/types/Account/_initializeAccount.js | 16 ------------- .../src/types/Wallet/methods/createAccount.js | 23 ++++++++++++++++++- .../src/types/Wallet/methods/getAccount.js | 11 ++++++--- 6 files changed, 34 insertions(+), 25 deletions(-) diff --git a/packages/js-dash-sdk/src/SDK/Client/Client.ts b/packages/js-dash-sdk/src/SDK/Client/Client.ts index aab3eecfba..87df6d5526 100644 --- a/packages/js-dash-sdk/src/SDK/Client/Client.ts +++ b/packages/js-dash-sdk/src/SDK/Client/Client.ts @@ -165,6 +165,7 @@ export class Client extends EventEmitter { options = { index: this.defaultAccountIndex, + synchronize: true, ...options, }; diff --git a/packages/wallet-lib/src/types/Account/Account.d.ts b/packages/wallet-lib/src/types/Account/Account.d.ts index 68e07f2b3c..974440babe 100644 --- a/packages/wallet-lib/src/types/Account/Account.d.ts +++ b/packages/wallet-lib/src/types/Account/Account.d.ts @@ -88,6 +88,7 @@ export declare interface getUTXOSOptions { export declare namespace Account { interface Options { index?: number, + synchronize?: boolean, network?: Network; debug?: boolean; label?: string; diff --git a/packages/wallet-lib/src/types/Account/Account.js b/packages/wallet-lib/src/types/Account/Account.js index a51a014579..b8240f621b 100644 --- a/packages/wallet-lib/src/types/Account/Account.js +++ b/packages/wallet-lib/src/types/Account/Account.js @@ -56,6 +56,7 @@ class Account extends EventEmitter { if (!wallet || wallet.constructor.name !== Wallet.name) throw new Error('Expected wallet to be passed as param'); if (!_.has(wallet, 'walletId')) throw new Error('Missing walletID to create an account'); this.walletId = wallet.walletId; + this.wallet = wallet; this.logger = logger.getForWallet(this.walletId); this.logger.debug(`Loading up wallet ${this.walletId}`); @@ -223,16 +224,12 @@ class Account extends EventEmitter { return `${EVENTS.INSTANT_LOCK}:${transactionHash}`; } - // It's actually Account that mutates wallet.accounts to add itself. - // We might want to get rid of that as it can be really confusing. - // It would gives that responsability to createAccount to create - // (and therefore push to accounts). async init(wallet) { if (this.state.isInitialized) { return true; } await _addAccountToWallet(this, wallet); - await _initializeAccount(this, wallet.plugins); + await _initializeAccount(this, wallet ? wallet.plugins : this.wallet.plugins); return true; } diff --git a/packages/wallet-lib/src/types/Account/_initializeAccount.js b/packages/wallet-lib/src/types/Account/_initializeAccount.js index 3a034f21e6..65c69b7a20 100644 --- a/packages/wallet-lib/src/types/Account/_initializeAccount.js +++ b/packages/wallet-lib/src/types/Account/_initializeAccount.js @@ -6,22 +6,6 @@ const preparePlugins = require('./_preparePlugins'); async function _initializeAccount(account, userUnsafePlugins) { const self = account; - // Add default derivation paths - account.addDefaultPaths(); - - // Issue additional derivation paths in case we have transactions in the store - // at the moment of initialization (from persistent storage) - account.createPathsForTransactions(); - - // Add block headers from storage into the SPV chain if there are any - const chainStore = self.storage.getDefaultChainStore(); - const { blockHeaders, lastSyncedHeaderHeight } = chainStore.state; - if (!self.offlineMode) { - const { blockHeadersProvider } = self.transport.client; - const firstHeaderHeight = lastSyncedHeaderHeight - blockHeaders.length + 1; - await blockHeadersProvider.initializeChainWith(blockHeaders, firstHeaderHeight); - } - // We run faster in offlineMode to speed up the process when less happens. const readinessIntervalTime = (account.offlineMode) ? 50 : 200; // TODO: perform rejection with a timeout diff --git a/packages/wallet-lib/src/types/Wallet/methods/createAccount.js b/packages/wallet-lib/src/types/Wallet/methods/createAccount.js index 8f49c6ec83..f74c4bb885 100644 --- a/packages/wallet-lib/src/types/Wallet/methods/createAccount.js +++ b/packages/wallet-lib/src/types/Wallet/methods/createAccount.js @@ -28,8 +28,29 @@ async function createAccount(accountOpts) { const opts = Object.assign(baseOpts, accountOpts); const account = new Account(this, opts); + + // Add default derivation paths + account.addDefaultPaths(); + + // Issue additional derivation paths in case we have transactions in the store + // at the moment of initialization (from persistent storage) + account.createPathsForTransactions(); + + // Add block headers from storage into the SPV chain if there are any + const chainStore = this.storage.getDefaultChainStore(); + const { blockHeaders, lastSyncedHeaderHeight } = chainStore.state; + if (!this.offlineMode && blockHeaders.length > 0) { + const { blockHeadersProvider } = this.transport.client; + blockHeadersProvider.initializeChainWith(blockHeaders, lastSyncedHeaderHeight); + } + + this.accounts.push(account); + try { - await account.init(this); + if (opts.synchronize) { + await account.init(this); + } + return account; } catch (e) { await account.disconnect(); diff --git a/packages/wallet-lib/src/types/Wallet/methods/getAccount.js b/packages/wallet-lib/src/types/Wallet/methods/getAccount.js index d333c1209f..8e3f33c712 100644 --- a/packages/wallet-lib/src/types/Wallet/methods/getAccount.js +++ b/packages/wallet-lib/src/types/Wallet/methods/getAccount.js @@ -2,14 +2,19 @@ const _ = require('lodash'); const { is } = require('../../../utils'); const EVENTS = require('../../../EVENTS'); +const defaultOpts = { + index: 0, + synchronize: true, +}; + /** * Get a specific account per accounts index * @param accountOpts - If the account doesn't exist yet, we create it passing these options * @param accountOpts.index - Default: 0, set a specific index to get + * @param accountOpts.synchronize - Default: true, specifies whether account has to be synchronized * @return {Account} */ - -async function getAccount(accountOpts = {}) { +async function getAccount(accountOpts = defaultOpts) { if (!this.storage.configured) { await new Promise((resolve) => { this.storage.once(EVENTS.CONFIGURED, resolve); }); } @@ -27,7 +32,7 @@ async function getAccount(accountOpts = {}) { const baseOpts = { index: accountIndex }; const opts = Object.assign(baseOpts, accountOpts); - return (acc[0]) || this.createAccount(opts); + return acc[0] || this.createAccount(opts); } module.exports = getAccount; From 2a331c1ec403f2dc8a87838d8d6ac8b9b5cbfe40 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Fri, 26 Apr 2024 16:23:36 +0700 Subject: [PATCH 147/191] chore(dashmate): limit concurrent state transition checks (#1824) --- .../configs/defaults/getBaseConfigFactory.js | 3 +- .../configs/getConfigFileMigrationsFactory.js | 9 +++++ .../dashmate/src/config/configJsonSchema.js | 6 +++- .../platform/drive/tenderdash/config.toml.dot | 36 ++++++++++++++----- 4 files changed, 44 insertions(+), 10 deletions(-) diff --git a/packages/dashmate/configs/defaults/getBaseConfigFactory.js b/packages/dashmate/configs/defaults/getBaseConfigFactory.js index a358496b0e..dfa5800145 100644 --- a/packages/dashmate/configs/defaults/getBaseConfigFactory.js +++ b/packages/dashmate/configs/defaults/getBaseConfigFactory.js @@ -206,7 +206,7 @@ export default function getBaseConfigFactory(homeDir) { tenderdash: { mode: 'full', docker: { - image: 'dashpay/tenderdash:0.14.0-dev.5', + image: 'dashpay/tenderdash:0.14.0-dev.6', }, p2p: { host: '0.0.0.0', @@ -241,6 +241,7 @@ export default function getBaseConfigFactory(homeDir) { txEnqueueTimeout: '0', txSendRateLimit: 0, txRecvRateLimit: 0, + maxConcurrentCheckTx: 250, }, consensus: { createEmptyBlocks: true, diff --git a/packages/dashmate/configs/getConfigFileMigrationsFactory.js b/packages/dashmate/configs/getConfigFileMigrationsFactory.js index fec6ab4d0f..0dc4d7027f 100644 --- a/packages/dashmate/configs/getConfigFileMigrationsFactory.js +++ b/packages/dashmate/configs/getConfigFileMigrationsFactory.js @@ -521,6 +521,15 @@ export default function getConfigFileMigrationsFactory(homeDir, defaultConfigs) return configFile; }, + '1.0.0-dev.12': (configFile) => { + Object.entries(configFile.configs) + .forEach(([, options]) => { + options.platform.drive.tenderdash.docker.image = base.get('platform.drive.tenderdash.docker.image'); + options.platform.drive.tenderdash.mempool.maxConcurrentCheckTx = base.get('platform.drive.tenderdash.mempool.maxConcurrentCheckTx'); + }); + + return configFile; + }, }; } diff --git a/packages/dashmate/src/config/configJsonSchema.js b/packages/dashmate/src/config/configJsonSchema.js index e669e05133..357f5e5ecf 100644 --- a/packages/dashmate/src/config/configJsonSchema.js +++ b/packages/dashmate/src/config/configJsonSchema.js @@ -656,9 +656,13 @@ export default { type: 'integer', minimum: 0, }, + maxConcurrentCheckTx: { + type: 'integer', + minimum: 0, + }, }, additionalProperties: false, - required: ['size', 'maxTxsBytes', 'cacheSize', 'timeoutCheckTx', 'txEnqueueTimeout', 'txSendRateLimit', 'txRecvRateLimit'], + required: ['size', 'maxTxsBytes', 'cacheSize', 'timeoutCheckTx', 'txEnqueueTimeout', 'txSendRateLimit', 'txRecvRateLimit', 'maxConcurrentCheckTx'], }, consensus: { type: 'object', diff --git a/packages/dashmate/templates/platform/drive/tenderdash/config.toml.dot b/packages/dashmate/templates/platform/drive/tenderdash/config.toml.dot index 5320cd0e93..3aad5cc204 100644 --- a/packages/dashmate/templates/platform/drive/tenderdash/config.toml.dot +++ b/packages/dashmate/templates/platform/drive/tenderdash/config.toml.dot @@ -10,11 +10,6 @@ ### Main Base Config Options ### ####################################################################### -# TCP or UNIX socket address of the ABCI application, -# or the name of an ABCI application compiled in with the Tendermint binary -#proxy-app = "tcp://drive_abci:26658" -proxy-app = "CheckTx:grpc:drive_abci:26670,*:socket:tcp://drive_abci:26658" - # A custom human readable name for this node {{?it.platform.drive.tenderdash.moniker}}moniker = "{{=it.platform.drive.tenderdash.moniker}}"{{?}} @@ -72,13 +67,38 @@ genesis-file = "config/genesis.json" # Path to the JSON file containing the private key to use for node authentication in the p2p protocol node-key-file = "config/node_key.json" -# Mechanism to connect to the ABCI application: socket | grpc -abci = "routed" - # If true, query the ABCI app on connecting to a new peer # so the app can decide if we should keep the connection or not filter-peers = false +####################################################### +### ABCI App Connection Options ### +####################################################### +[abci] +# TCP or UNIX socket address of the ABCI application, +# or routing rules for routed multi-app setup, +# or the name of an ABCI application compiled in with the Tendermint binary +# Example for routed multi-app setup: +# abci = "routed" +# address = "Info:socket:unix:///tmp/socket.1,Info:socket:unix:///tmp/socket.2,CheckTx:socket:unix:///tmp/socket.1,*:socket:unix:///tmp/socket.3" +address = "CheckTx:grpc:drive_abci:26670,*:socket:tcp://drive_abci:26658" +# Transport mechanism to connect to the ABCI application: socket | grpc | routed +transport = "routed" +# Maximum number of simultaneous connections to the ABCI application +# per each method. Map of a gRPC method name,like "echo", to the number of concurrent connections. +# Special value "*" can be used to set the default limit for methods not explicitly listed. +# +# Example: +# +# grpc-concurrency = [ +# { "*" = 10 }, +# { "echo" = 2 }, +# { "info" = 2 }, +#] +grpc-concurrency = [ + { "check_tx" = {{= it.platform.drive.tenderdash.mempool.maxConcurrentCheckTx }} }, +] + ####################################################### ### Priv Validator Configuration ### From cfdc7ddbe177676770fb3093353e2af63331a938 Mon Sep 17 00:00:00 2001 From: Igor Markin Date: Sat, 27 Apr 2024 21:24:13 +0100 Subject: [PATCH 148/191] feat!: getIdentitiesContractKeys endpoint (#1766) Co-authored-by: Quantum Explorer --- Cargo.lock | 209 +- packages/check-features/src/main.rs | 2 +- packages/dapi-grpc/build.rs | 6 +- .../dash/platform/dapi/v0/PlatformGrpc.java | 222 +- .../v0/nodejs/PlatformPromiseClient.js | 69 +- .../platform/v0/nodejs/platform_pbjs.js | 15547 +++++++--------- .../platform/v0/nodejs/platform_protoc.js | 7461 ++++---- .../platform/v0/objective-c/Platform.pbobjc.h | 480 +- .../platform/v0/objective-c/Platform.pbobjc.m | 2927 ++- .../platform/v0/objective-c/Platform.pbrpc.h | 37 +- .../platform/v0/objective-c/Platform.pbrpc.m | 56 +- .../platform/v0/python/platform_pb2.py | 1688 +- .../platform/v0/python/platform_pb2_grpc.py | 73 +- .../platform/v0/web/PlatformPromiseClient.js | 30 +- .../clients/platform/v0/web/platform_pb.d.ts | 603 +- .../clients/platform/v0/web/platform_pb.js | 7461 ++++---- .../platform/v0/web/platform_pb_service.d.ts | 51 +- .../platform/v0/web/platform_pb_service.js | 64 +- .../protos/platform/v0/platform.proto | 113 +- .../proto/org.dash.platform.dapi.v0.rs | 542 +- .../v0/nodejs/PlatformPromiseClient.spec.js | 21 + .../platform/platformHandlersFactory.js | 2 +- .../methods/platform/PlatformMethodsFacade.js | 6 +- .../GetIdentitiesByPublicKeyHashesResponse.js | 46 - .../getIdentitiesByPublicKeyHashesFactory.js | 65 - .../GetIdentitiesContractKeysResponse.js | 65 + .../getIdentitiesContractKeysFactory.js | 93 + .../GetIdentityByPublicKeyHashResponse.js | 40 + .../getIdentityByPublicKeyHashFactory.js | 64 + .../transport/GrpcTransport/GrpcTransport.js | 8 +- packages/js-dapi-client/package.json | 2 +- .../platform/PlatformMethodsFacade.spec.js | 55 + ...dentitiesByPublicKeyHashesResponse.spec.js | 144 - .../GetIdentitiesContractKeysResponse.spec.js | 177 + .../getIdentitiesContractKeysFactory.spec.js | 214 + ...GetIdentityByPublicKeyHashResponse.spec.js | 136 + ...getIdentityByPublicKeyHashFactory.spec.js} | 76 +- .../createAndAttachTransportMocksToClient.ts | 4 +- .../test/e2e/contacts.spec.js | 73 +- .../test/functional/platform/Identity.spec.js | 8 +- .../test/functional/platform/proofs.spec.js | 2 +- packages/rs-dapi-client/src/transport/grpc.rs | 16 +- .../src/identity/identities_contract_keys.rs | 6 + .../identity/identity_public_key/purpose.rs | 15 + .../identity/identity_public_key/random.rs | 3 + .../identity/identity_public_key/v0/random.rs | 4 +- packages/rs-dpp/src/identity/mod.rs | 1 + .../public_key_in_creation/accessors.rs | 8 + .../identity/public_key_in_creation/v0/mod.rs | 4 + .../create_genesis_state/v0/mod.rs | 1 - .../data_contract/v0/mod.rs | 6 +- .../data_contract_history/v0/mod.rs | 10 +- .../data_contracts/v0/mod.rs | 6 +- .../src/query/document_query/v0/mod.rs | 20 +- .../identity_based_queries/balance/v0/mod.rs | 6 +- .../balance_and_revision/v0/mod.rs | 6 +- .../identities/v0/mod.rs | 153 - .../identities_by_public_key_hashes/mod.rs | 67 - .../identities_by_public_key_hashes/v0/mod.rs | 159 - .../mod.rs | 29 +- .../identities_contract_keys/v0/mod.rs | 1145 ++ .../identity_based_queries/identity/v0/mod.rs | 6 +- .../identity_by_public_key_hash/v0/mod.rs | 6 +- .../identity_contract_nonce/v0/mod.rs | 16 +- .../identity_nonce/v0/mod.rs | 12 +- .../identity_based_queries/keys/v0/mod.rs | 18 +- .../src/query/identity_based_queries/mod.rs | 3 +- packages/rs-drive-abci/src/query/mod.rs | 16 +- .../rs-drive-abci/src/query/proofs/v0/mod.rs | 14 +- packages/rs-drive-abci/src/query/service.rs | 25 +- .../src/query/system/epoch_infos/v0/mod.rs | 4 +- .../src/query/system/path_elements/v0/mod.rs | 2 +- .../system/version_upgrade_state/v0/mod.rs | 8 +- .../version_upgrade_vote_status/v0/mod.rs | 8 +- .../tests/strategy_tests/query.rs | 148 +- .../tests/strategy_tests/strategy.rs | 1 + packages/rs-drive-proof-verifier/src/proof.rs | 128 +- packages/rs-drive/Cargo.toml | 11 +- .../proposers/get_epoch_proposers/v0/mod.rs | 1 + .../v0/mod.rs | 1 + .../rs-drive/src/drive/credit_pools/mod.rs | 1 + .../v0/mod.rs | 1 + .../v0/mod.rs | 1 + .../fetch_pending_epoch_refunds/v0/mod.rs | 1 + .../grove_get_path_query/v0/mod.rs | 1 + .../v0/mod.rs | 2 +- .../v0/mod.rs | 2 +- .../grove_get_raw_path_query/v0/mod.rs | 1 + .../v0/mod.rs | 2 +- .../v0/mod.rs | 5 +- .../drive/identity/fetch/contract_keys/mod.rs | 62 + .../identity/fetch/contract_keys/v0/mod.rs | 130 + .../rs-drive/src/drive/identity/fetch/mod.rs | 12 +- .../src/drive/identity/fetch/prove/mod.rs | 1 + .../prove/prove_full_identities/v0/mod.rs | 2 + .../fetch/prove/prove_full_identity/v0/mod.rs | 1 + .../prove_identities_contract_keys/mod.rs | 58 + .../prove_identities_contract_keys/v0/mod.rs | 36 + .../src/drive/identity/fetch/queries/mod.rs | 102 +- .../v0/mod.rs | 1 + packages/rs-drive/src/drive/mod.rs | 6 + .../rs-drive/src/drive/verify/identity/mod.rs | 1 + .../verify_identities_contract_keys/mod.rs | 71 + .../verify_identities_contract_keys/v0/mod.rs | 115 + .../src/version/drive_abci_versions.rs | 3 +- .../src/version/drive_versions.rs | 3 + .../src/version/mocks/v2_test.rs | 10 +- .../src/version/mocks/v3_test.rs | 10 +- .../rs-platform-version/src/version/v1.rs | 12 +- packages/rs-sdk/src/platform.rs | 1 + packages/rs-sdk/src/platform/fetch_many.rs | 9 +- .../identities_contract_keys_query.rs | 89 + packages/rs-sdk/src/platform/query.rs | 4 +- packages/rs-sdk/src/sdk.rs | 2 +- packages/rs-sdk/tests/fetch/data_contract.rs | 2 +- ...f8505da12dd67cb9d5d8b43fad82de9d06061.json | Bin 57547 -> 0 bytes ...036b2cfcb3e5818816e3bc8a7c250a9cf384e.json | Bin 0 -> 31092 bytes ...32a287dd182f4ea3b1b4bf70dcd56c1b87d78.json | 1 - ...d16b80a691707cf7fd94a349b3c2cb029a601.json | 1 + packages/strategy-tests/src/transitions.rs | 1 + .../src/plugins/Workers/IdentitySyncWorker.js | 40 +- .../src/test/mocks/TransportMock.js | 4 +- .../DAPIClientTransport.js | 2 +- .../methods/getIdentitiesByPublicKeyHashes.js | 11 - .../methods/getIdentityByPublicKeyHash.js | 11 + .../wallet-lib/src/transport/Transport.d.ts | 2 +- .../src/identity/identity_public_key/mod.rs | 15 +- .../identity_public_key_transitions.rs | 22 + 128 files changed, 19908 insertions(+), 21997 deletions(-) delete mode 100644 packages/js-dapi-client/lib/methods/platform/getIdentitiesByPublicKeyHashes/GetIdentitiesByPublicKeyHashesResponse.js delete mode 100644 packages/js-dapi-client/lib/methods/platform/getIdentitiesByPublicKeyHashes/getIdentitiesByPublicKeyHashesFactory.js create mode 100644 packages/js-dapi-client/lib/methods/platform/getIdentitiesContractKeys/GetIdentitiesContractKeysResponse.js create mode 100644 packages/js-dapi-client/lib/methods/platform/getIdentitiesContractKeys/getIdentitiesContractKeysFactory.js create mode 100644 packages/js-dapi-client/lib/methods/platform/getIdentityByPublicKeyHash/GetIdentityByPublicKeyHashResponse.js create mode 100644 packages/js-dapi-client/lib/methods/platform/getIdentityByPublicKeyHash/getIdentityByPublicKeyHashFactory.js delete mode 100644 packages/js-dapi-client/test/unit/methods/platform/getIdentitiesByPublicKeyHashes/GetIdentitiesByPublicKeyHashesResponse.spec.js create mode 100644 packages/js-dapi-client/test/unit/methods/platform/getIdentitiesContractKeys/GetIdentitiesContractKeysResponse.spec.js create mode 100644 packages/js-dapi-client/test/unit/methods/platform/getIdentitiesContractKeys/getIdentitiesContractKeysFactory.spec.js create mode 100644 packages/js-dapi-client/test/unit/methods/platform/getIdentityByPublicKeyHash/GetIdentityByPublicKeyHashResponse.spec.js rename packages/js-dapi-client/test/unit/methods/platform/{getIdentitiesByPublicKeyHashes/getIdentitiesByPublicKeyHashesFactory.spec.js => getIdentityByPublicKeyHash/getIdentityByPublicKeyHashFactory.spec.js} (58%) create mode 100644 packages/rs-dpp/src/identity/identities_contract_keys.rs delete mode 100644 packages/rs-drive-abci/src/query/identity_based_queries/identities/v0/mod.rs delete mode 100644 packages/rs-drive-abci/src/query/identity_based_queries/identities_by_public_key_hashes/mod.rs delete mode 100644 packages/rs-drive-abci/src/query/identity_based_queries/identities_by_public_key_hashes/v0/mod.rs rename packages/rs-drive-abci/src/query/identity_based_queries/{identities => identities_contract_keys}/mod.rs (60%) create mode 100644 packages/rs-drive-abci/src/query/identity_based_queries/identities_contract_keys/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/identity/fetch/contract_keys/mod.rs create mode 100644 packages/rs-drive/src/drive/identity/fetch/contract_keys/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/identity/fetch/prove/prove_identities_contract_keys/mod.rs create mode 100644 packages/rs-drive/src/drive/identity/fetch/prove/prove_identities_contract_keys/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/verify/identity/verify_identities_contract_keys/mod.rs create mode 100644 packages/rs-drive/src/drive/verify/identity/verify_identities_contract_keys/v0/mod.rs create mode 100644 packages/rs-sdk/src/platform/identities_contract_keys_query.rs delete mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_history_read/msg_2024-04-11T16:57:48.166543000Z_GetDataContractHistoryRequest_1519241de3a099f69aa1d8523aef8505da12dd67cb9d5d8b43fad82de9d06061.json create mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_history_read/msg_2024-04-26T12:12:57.324522000Z_GetDataContractHistoryRequest_9659531622bd289c14efcc20c8c036b2cfcb3e5818816e3bc8a7c250a9cf384e.json delete mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_history_read/quorum_pubkey-106-0db75802182bb9b9417e92b278832a287dd182f4ea3b1b4bf70dcd56c1b87d78.json create mode 100644 packages/rs-sdk/tests/vectors/test_data_contract_history_read/quorum_pubkey-106-61ba8a20d570891f2ba1f7d30c1d16b80a691707cf7fd94a349b3c2cb029a601.json delete mode 100644 packages/wallet-lib/src/transport/DAPIClientTransport/methods/getIdentitiesByPublicKeyHashes.js create mode 100644 packages/wallet-lib/src/transport/DAPIClientTransport/methods/getIdentityByPublicKeyHash.js diff --git a/Cargo.lock b/Cargo.lock index 084f5b1851..4cbc3e6297 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -192,7 +192,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -203,7 +203,7 @@ checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -363,13 +363,13 @@ dependencies = [ "lazycell", "log", "peeking_take_while", - "prettyplease 0.2.17", + "prettyplease 0.2.19", "proc-macro2", "quote", "regex", "rustc-hash", "shlex", - "syn 2.0.58", + "syn 2.0.60", "which", ] @@ -390,7 +390,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -520,7 +520,7 @@ dependencies = [ "proc-macro-crate 3.1.0", "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", "syn_derive", ] @@ -569,9 +569,9 @@ dependencies = [ [[package]] name = "bytecount" -version = "0.6.7" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1e5f035d16fc623ae5f74981db80a439803888314e3a555fd6f04acd51a3205" +checksum = "5ce89b21cab1437276d2650d57e971f9d548a2d9037cc231abdc0562b97498ce" [[package]] name = "byteorder" @@ -638,12 +638,13 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.0.92" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2678b2e3449475e95b0aa6f9b506a28e61b3dc8996592b983695e8ebb58a8b41" +checksum = "d32a725bc159af97c3e629873bb9f88fb8cf8a4867175f76dc987815ea07c83b" dependencies = [ "jobserver", "libc", + "once_cell", ] [[package]] @@ -676,9 +677,9 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.37" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0d04d43504c61aa6c7531f1871dd0d418d91130162063b789da00fd7057a5e" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ "android-tzdata", "iana-time-zone", @@ -766,7 +767,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -1015,7 +1016,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -1041,7 +1042,7 @@ dependencies = [ "dapi-grpc", "heck 0.5.0", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -1065,7 +1066,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.10.0", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -1076,7 +1077,7 @@ checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" dependencies = [ "darling_core", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -1415,7 +1416,7 @@ dependencies = [ "rust_decimal_macros", "serde", "serde_json", - "serde_with 3.7.0", + "serde_with 3.8.0", "sha2", "simple-signer", "strategy-tests", @@ -1514,7 +1515,7 @@ checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -1643,9 +1644,9 @@ dependencies = [ [[package]] name = "fiat-crypto" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c007b1ae3abe1cb6f85a16305acd418b7ca6343b953633fee2b76d8f108b830f" +checksum = "38793c55593b33412e3ae40c2c9781ffaa6f438f6f8c10f24e71846fbd7ae01e" [[package]] name = "file-rotate" @@ -1805,7 +1806,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -1876,7 +1877,7 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "grovedb" version = "1.0.0-rc.2" -source = "git+https://github.com/dashpay/grovedb?rev=941dd86d70c86e7a236541919e789dba078abae6#941dd86d70c86e7a236541919e789dba078abae6" +source = "git+https://github.com/dashpay/grovedb?rev=d9292aa20bd8f3bda7c5d25d62db06ac341b0677#d9292aa20bd8f3bda7c5d25d62db06ac341b0677" dependencies = [ "bincode", "grovedb-costs", @@ -1897,7 +1898,7 @@ dependencies = [ [[package]] name = "grovedb-costs" version = "1.0.0-rc.2" -source = "git+https://github.com/dashpay/grovedb?rev=941dd86d70c86e7a236541919e789dba078abae6#941dd86d70c86e7a236541919e789dba078abae6" +source = "git+https://github.com/dashpay/grovedb?rev=d9292aa20bd8f3bda7c5d25d62db06ac341b0677#d9292aa20bd8f3bda7c5d25d62db06ac341b0677" dependencies = [ "integer-encoding", "intmap", @@ -1907,7 +1908,7 @@ dependencies = [ [[package]] name = "grovedb-merk" version = "1.0.0-rc.2" -source = "git+https://github.com/dashpay/grovedb?rev=941dd86d70c86e7a236541919e789dba078abae6#941dd86d70c86e7a236541919e789dba078abae6" +source = "git+https://github.com/dashpay/grovedb?rev=d9292aa20bd8f3bda7c5d25d62db06ac341b0677#d9292aa20bd8f3bda7c5d25d62db06ac341b0677" dependencies = [ "blake3", "byteorder", @@ -1930,12 +1931,12 @@ dependencies = [ [[package]] name = "grovedb-path" version = "1.0.0-rc.2" -source = "git+https://github.com/dashpay/grovedb?rev=941dd86d70c86e7a236541919e789dba078abae6#941dd86d70c86e7a236541919e789dba078abae6" +source = "git+https://github.com/dashpay/grovedb?rev=d9292aa20bd8f3bda7c5d25d62db06ac341b0677#d9292aa20bd8f3bda7c5d25d62db06ac341b0677" [[package]] name = "grovedb-storage" version = "1.0.0-rc.2" -source = "git+https://github.com/dashpay/grovedb?rev=941dd86d70c86e7a236541919e789dba078abae6#941dd86d70c86e7a236541919e789dba078abae6" +source = "git+https://github.com/dashpay/grovedb?rev=d9292aa20bd8f3bda7c5d25d62db06ac341b0677#d9292aa20bd8f3bda7c5d25d62db06ac341b0677" dependencies = [ "blake3", "grovedb-costs", @@ -1954,7 +1955,7 @@ dependencies = [ [[package]] name = "grovedb-visualize" version = "1.0.0-rc.2" -source = "git+https://github.com/dashpay/grovedb?rev=941dd86d70c86e7a236541919e789dba078abae6#941dd86d70c86e7a236541919e789dba078abae6" +source = "git+https://github.com/dashpay/grovedb?rev=d9292aa20bd8f3bda7c5d25d62db06ac341b0677#d9292aa20bd8f3bda7c5d25d62db06ac341b0677" dependencies = [ "hex", "itertools 0.12.1", @@ -2310,9 +2311,9 @@ checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "jobserver" -version = "0.1.30" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "685a7d121ee3f65ae4fddd72b25a04bb36b6af81bc0828f7d5434c0fe60fa3a2" +checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" dependencies = [ "libc", ] @@ -2461,9 +2462,9 @@ checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" [[package]] name = "lock_api" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ "autocfg", "scopeguard", @@ -2571,7 +2572,7 @@ checksum = "38b4faf00617defe497754acde3024865bc143d44a86799b24e191ecff91354f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -2777,7 +2778,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -2893,9 +2894,9 @@ checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "7e4af0ca4f6caed20e900d564c242b8e5d4903fdacf31d3daf527b66fe6f42fb" dependencies = [ "lock_api", "parking_lot_core", @@ -2903,15 +2904,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.9" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-targets 0.48.5", + "windows-targets 0.52.5", ] [[package]] @@ -2959,7 +2960,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -3004,7 +3005,7 @@ version = "1.0.0-dev.11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", "virtue 0.0.14", ] @@ -3034,7 +3035,7 @@ name = "platform-value-convertible" version = "1.0.0-dev.11" dependencies = [ "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -3050,7 +3051,7 @@ version = "1.0.0-dev.11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -3173,12 +3174,12 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.17" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d3928fb5db768cb86f891ff014f0144589297e3c6a1aba6ed7cecfdace270c7" +checksum = "5ac2cf0f2e4f42b49f5ffd07dae8d746508ef7526c13940e5f524012ae6c6550" dependencies = [ "proc-macro2", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -3226,9 +3227,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.79" +version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" +checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" dependencies = [ "unicode-ident", ] @@ -3288,11 +3289,11 @@ dependencies = [ "multimap 0.10.0", "once_cell", "petgraph", - "prettyplease 0.2.17", + "prettyplease 0.2.19", "prost 0.12.4", "prost-types 0.12.4", "regex", - "syn 2.0.58", + "syn 2.0.60", "tempfile", ] @@ -3319,7 +3320,7 @@ dependencies = [ "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -3463,11 +3464,11 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.4.1" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.5.0", ] [[package]] @@ -3678,9 +3679,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.32" +version = "0.38.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65e04861e65f21776e67888bfbea442b3642beaa0138fdb1dd7a84a52dffdb89" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" dependencies = [ "bitflags 2.5.0", "errno", @@ -3691,9 +3692,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.22.3" +version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99008d7ad0bbbea527ec27bddbc0e432c5b87d8175178cee68d2eec9c4a1813c" +checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432" dependencies = [ "log", "ring", @@ -3728,15 +3729,15 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.4.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecd36cc4259e3e4514335c4a138c6b43171a8d61d8f5c9348f9fc7529416f247" +checksum = "beb461507cee2c2ff151784c52762cf4d9ff6a61f3e80968600ed24fa837fa54" [[package]] name = "rustls-webpki" -version = "0.102.2" +version = "0.102.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faaa0a62740bedb9b2ef5afa303da42764c012f743917351dc9a237ea1663610" +checksum = "f3bce581c0dd41bce533ce695a1437fa16a7ab5ac3ccfa99fe1a620a7885eabf" dependencies = [ "ring", "rustls-pki-types", @@ -3859,9 +3860,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.197" +version = "1.0.198" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" +checksum = "9846a40c979031340571da2545a4e5b7c4163bdae79b301d5f86d03979451fcc" dependencies = [ "serde_derive", ] @@ -3897,20 +3898,20 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.197" +version = "1.0.198" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" +checksum = "e88edab869b01783ba905e7d0153f9fc1a6505a96e4ad3018011eedb838566d9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] name = "serde_json" -version = "1.0.115" +version = "1.0.116" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12dc5c46daa8e9fdf4f5e71b6cf9a53f2487da0e86e55808e2d35539666497dd" +checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813" dependencies = [ "indexmap 2.2.6", "itoa", @@ -3926,7 +3927,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -3956,17 +3957,17 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.7.0" +version = "3.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee80b0e361bbf88fd2f6e242ccd19cfda072cb0faa6ae694ecee08199938569a" +checksum = "2c85f8e96d1d6857f13768fcbd895fcb06225510022a2774ed8b5150581847b0" dependencies = [ - "base64 0.21.7", + "base64 0.22.0", "chrono", "hex", "serde", "serde_derive", "serde_json", - "serde_with_macros 3.7.0", + "serde_with_macros 3.8.0", "time", ] @@ -3979,19 +3980,19 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] name = "serde_with_macros" -version = "3.7.0" +version = "3.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6561dc161a9224638a31d876ccdfefbc1df91d3f3a8342eddb35f055d48c7655" +checksum = "c8b3a576c4eb2924262d5951a3b737ccaf16c931e39a2810c36f9a7e25575557" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -4022,9 +4023,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" dependencies = [ "libc", ] @@ -4191,7 +4192,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -4204,7 +4205,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -4235,9 +4236,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.58" +version = "2.0.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44cfb93f38070beee36b3fef7d4f5a16f27751d94b187b666a5cc5e9b0d30687" +checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3" dependencies = [ "proc-macro2", "quote", @@ -4253,7 +4254,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -4294,7 +4295,7 @@ checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" dependencies = [ "cfg-if", "fastrand 2.0.2", - "rustix 0.38.32", + "rustix 0.38.34", "windows-sys 0.52.0", ] @@ -4418,7 +4419,7 @@ checksum = "d1cd413b5d558b4c5bf3680e324a6fa5014e7b7c067a51e69dbdf47eb7148b66" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -4525,7 +4526,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -4586,7 +4587,7 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.22.9", + "toml_edit 0.22.12", ] [[package]] @@ -4622,9 +4623,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.9" +version = "0.22.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e40bb779c5187258fd7aad0eb68cb8706a0a81fa712fbea808ab43c4b8374c4" +checksum = "d3328d4f68a705b2a4498da1d580585d39a6510f98318a2cec3018a7ec61ddef" dependencies = [ "indexmap 2.2.6", "serde", @@ -4711,11 +4712,11 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be4ef6dd70a610078cb4e338a0f79d06bc759ff1b22d2120c2ff02ae264ba9c2" dependencies = [ - "prettyplease 0.2.17", + "prettyplease 0.2.19", "proc-macro2", "prost-build 0.12.4", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -4766,7 +4767,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -4904,11 +4905,11 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "ureq" -version = "2.9.6" +version = "2.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11f214ce18d8b2cbe84ed3aa6486ed3f5b285cf8d8fbdbce9f3f767a724adc35" +checksum = "d11a831e3c0b56e438a28308e7c810799e3c118417f342d30ecec080105395cd" dependencies = [ - "base64 0.21.7", + "base64 0.22.0", "flate2", "log", "once_cell", @@ -5028,7 +5029,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", "wasm-bindgen-shared", ] @@ -5062,7 +5063,7 @@ checksum = "e128beba882dd1eb6200e1dc92ae6c5dbaa4311aa7bb211ca035779e5efc39f8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5135,7 +5136,7 @@ dependencies = [ "either", "home", "once_cell", - "rustix 0.38.32", + "rustix 0.38.34", ] [[package]] @@ -5156,11 +5157,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" dependencies = [ - "winapi", + "windows-sys 0.52.0", ] [[package]] @@ -5380,7 +5381,7 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] diff --git a/packages/check-features/src/main.rs b/packages/check-features/src/main.rs index 35b023e201..c74fa560c8 100644 --- a/packages/check-features/src/main.rs +++ b/packages/check-features/src/main.rs @@ -4,7 +4,7 @@ use toml::Value; fn main() { let crates = [ - "dash-sdk", + "rs-sdk", "rs-drive-abci", "rs-dpp", "rs-drive", diff --git a/packages/dapi-grpc/build.rs b/packages/dapi-grpc/build.rs index 20af478ffb..c339c5f496 100644 --- a/packages/dapi-grpc/build.rs +++ b/packages/dapi-grpc/build.rs @@ -39,7 +39,7 @@ fn configure_platform(mut platform: MappingConfig) -> MappingConfig { // Derive features for versioned messages // // "GetConsensusParamsRequest" is excluded as this message does not support proofs - const VERSIONED_REQUESTS: [&str; 18] = [ + const VERSIONED_REQUESTS: [&str; 19] = [ "GetDataContractHistoryRequest", "GetDataContractRequest", "GetDataContractsRequest", @@ -58,10 +58,11 @@ fn configure_platform(mut platform: MappingConfig) -> MappingConfig { "GetProtocolVersionUpgradeStateRequest", "GetProtocolVersionUpgradeVoteStatusRequest", "GetPathElementsRequest", + "GetIdentitiesContractKeysRequest", ]; // "GetConsensusParamsResponse" is excluded as this message does not support proofs - const VERSIONED_RESPONSES: [&str; 19] = [ + const VERSIONED_RESPONSES: [&str; 20] = [ "GetDataContractHistoryResponse", "GetDataContractResponse", "GetDataContractsResponse", @@ -81,6 +82,7 @@ fn configure_platform(mut platform: MappingConfig) -> MappingConfig { "GetProtocolVersionUpgradeStateResponse", "GetProtocolVersionUpgradeVoteStatusResponse", "GetPathElementsResponse", + "GetIdentitiesContractKeysResponse", ]; // Derive VersionedGrpcMessage on requests diff --git a/packages/dapi-grpc/clients/platform/v0/java/org/dash/platform/dapi/v0/PlatformGrpc.java b/packages/dapi-grpc/clients/platform/v0/java/org/dash/platform/dapi/v0/PlatformGrpc.java index 2b3a2bfdd1..1223bc5e01 100644 --- a/packages/dapi-grpc/clients/platform/v0/java/org/dash/platform/dapi/v0/PlatformGrpc.java +++ b/packages/dapi-grpc/clients/platform/v0/java/org/dash/platform/dapi/v0/PlatformGrpc.java @@ -77,37 +77,6 @@ org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityResponse> getGetIdentity return getGetIdentityMethod; } - private static volatile io.grpc.MethodDescriptor getGetIdentitiesMethod; - - @io.grpc.stub.annotations.RpcMethod( - fullMethodName = SERVICE_NAME + '/' + "getIdentities", - requestType = org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesRequest.class, - responseType = org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesResponse.class, - methodType = io.grpc.MethodDescriptor.MethodType.UNARY) - public static io.grpc.MethodDescriptor getGetIdentitiesMethod() { - io.grpc.MethodDescriptor getGetIdentitiesMethod; - if ((getGetIdentitiesMethod = PlatformGrpc.getGetIdentitiesMethod) == null) { - synchronized (PlatformGrpc.class) { - if ((getGetIdentitiesMethod = PlatformGrpc.getGetIdentitiesMethod) == null) { - PlatformGrpc.getGetIdentitiesMethod = getGetIdentitiesMethod = - io.grpc.MethodDescriptor.newBuilder() - .setType(io.grpc.MethodDescriptor.MethodType.UNARY) - .setFullMethodName(generateFullMethodName(SERVICE_NAME, "getIdentities")) - .setSampledToLocalTracing(true) - .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( - org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesRequest.getDefaultInstance())) - .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( - org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesResponse.getDefaultInstance())) - .setSchemaDescriptor(new PlatformMethodDescriptorSupplier("getIdentities")) - .build(); - } - } - } - return getGetIdentitiesMethod; - } - private static volatile io.grpc.MethodDescriptor getGetIdentityKeysMethod; @@ -139,6 +108,37 @@ org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityKeysResponse> getGetIden return getGetIdentityKeysMethod; } + private static volatile io.grpc.MethodDescriptor getGetIdentitiesContractKeysMethod; + + @io.grpc.stub.annotations.RpcMethod( + fullMethodName = SERVICE_NAME + '/' + "getIdentitiesContractKeys", + requestType = org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesContractKeysRequest.class, + responseType = org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesContractKeysResponse.class, + methodType = io.grpc.MethodDescriptor.MethodType.UNARY) + public static io.grpc.MethodDescriptor getGetIdentitiesContractKeysMethod() { + io.grpc.MethodDescriptor getGetIdentitiesContractKeysMethod; + if ((getGetIdentitiesContractKeysMethod = PlatformGrpc.getGetIdentitiesContractKeysMethod) == null) { + synchronized (PlatformGrpc.class) { + if ((getGetIdentitiesContractKeysMethod = PlatformGrpc.getGetIdentitiesContractKeysMethod) == null) { + PlatformGrpc.getGetIdentitiesContractKeysMethod = getGetIdentitiesContractKeysMethod = + io.grpc.MethodDescriptor.newBuilder() + .setType(io.grpc.MethodDescriptor.MethodType.UNARY) + .setFullMethodName(generateFullMethodName(SERVICE_NAME, "getIdentitiesContractKeys")) + .setSampledToLocalTracing(true) + .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesContractKeysRequest.getDefaultInstance())) + .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesContractKeysResponse.getDefaultInstance())) + .setSchemaDescriptor(new PlatformMethodDescriptorSupplier("getIdentitiesContractKeys")) + .build(); + } + } + } + return getGetIdentitiesContractKeysMethod; + } + private static volatile io.grpc.MethodDescriptor getGetIdentityNonceMethod; @@ -418,37 +418,6 @@ org.dash.platform.dapi.v0.PlatformOuterClass.GetDocumentsResponse> getGetDocumen return getGetDocumentsMethod; } - private static volatile io.grpc.MethodDescriptor getGetIdentitiesByPublicKeyHashesMethod; - - @io.grpc.stub.annotations.RpcMethod( - fullMethodName = SERVICE_NAME + '/' + "getIdentitiesByPublicKeyHashes", - requestType = org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesByPublicKeyHashesRequest.class, - responseType = org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesByPublicKeyHashesResponse.class, - methodType = io.grpc.MethodDescriptor.MethodType.UNARY) - public static io.grpc.MethodDescriptor getGetIdentitiesByPublicKeyHashesMethod() { - io.grpc.MethodDescriptor getGetIdentitiesByPublicKeyHashesMethod; - if ((getGetIdentitiesByPublicKeyHashesMethod = PlatformGrpc.getGetIdentitiesByPublicKeyHashesMethod) == null) { - synchronized (PlatformGrpc.class) { - if ((getGetIdentitiesByPublicKeyHashesMethod = PlatformGrpc.getGetIdentitiesByPublicKeyHashesMethod) == null) { - PlatformGrpc.getGetIdentitiesByPublicKeyHashesMethod = getGetIdentitiesByPublicKeyHashesMethod = - io.grpc.MethodDescriptor.newBuilder() - .setType(io.grpc.MethodDescriptor.MethodType.UNARY) - .setFullMethodName(generateFullMethodName(SERVICE_NAME, "getIdentitiesByPublicKeyHashes")) - .setSampledToLocalTracing(true) - .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( - org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesByPublicKeyHashesRequest.getDefaultInstance())) - .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( - org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesByPublicKeyHashesResponse.getDefaultInstance())) - .setSchemaDescriptor(new PlatformMethodDescriptorSupplier("getIdentitiesByPublicKeyHashes")) - .build(); - } - } - } - return getGetIdentitiesByPublicKeyHashesMethod; - } - private static volatile io.grpc.MethodDescriptor getGetIdentityByPublicKeyHashMethod; @@ -730,16 +699,16 @@ public void getIdentity(org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentity /** */ - public void getIdentities(org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesRequest request, - io.grpc.stub.StreamObserver responseObserver) { - io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetIdentitiesMethod(), responseObserver); + public void getIdentityKeys(org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityKeysRequest request, + io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetIdentityKeysMethod(), responseObserver); } /** */ - public void getIdentityKeys(org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityKeysRequest request, - io.grpc.stub.StreamObserver responseObserver) { - io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetIdentityKeysMethod(), responseObserver); + public void getIdentitiesContractKeys(org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesContractKeysRequest request, + io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetIdentitiesContractKeysMethod(), responseObserver); } /** @@ -805,13 +774,6 @@ public void getDocuments(org.dash.platform.dapi.v0.PlatformOuterClass.GetDocumen io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetDocumentsMethod(), responseObserver); } - /** - */ - public void getIdentitiesByPublicKeyHashes(org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesByPublicKeyHashesRequest request, - io.grpc.stub.StreamObserver responseObserver) { - io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetIdentitiesByPublicKeyHashesMethod(), responseObserver); - } - /** */ public void getIdentityByPublicKeyHash(org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityByPublicKeyHashRequest request, @@ -877,13 +839,6 @@ public void getPathElements(org.dash.platform.dapi.v0.PlatformOuterClass.GetPath org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityRequest, org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityResponse>( this, METHODID_GET_IDENTITY))) - .addMethod( - getGetIdentitiesMethod(), - io.grpc.stub.ServerCalls.asyncUnaryCall( - new MethodHandlers< - org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesRequest, - org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesResponse>( - this, METHODID_GET_IDENTITIES))) .addMethod( getGetIdentityKeysMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall( @@ -891,6 +846,13 @@ public void getPathElements(org.dash.platform.dapi.v0.PlatformOuterClass.GetPath org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityKeysRequest, org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityKeysResponse>( this, METHODID_GET_IDENTITY_KEYS))) + .addMethod( + getGetIdentitiesContractKeysMethod(), + io.grpc.stub.ServerCalls.asyncUnaryCall( + new MethodHandlers< + org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesContractKeysRequest, + org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesContractKeysResponse>( + this, METHODID_GET_IDENTITIES_CONTRACT_KEYS))) .addMethod( getGetIdentityNonceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall( @@ -954,13 +916,6 @@ public void getPathElements(org.dash.platform.dapi.v0.PlatformOuterClass.GetPath org.dash.platform.dapi.v0.PlatformOuterClass.GetDocumentsRequest, org.dash.platform.dapi.v0.PlatformOuterClass.GetDocumentsResponse>( this, METHODID_GET_DOCUMENTS))) - .addMethod( - getGetIdentitiesByPublicKeyHashesMethod(), - io.grpc.stub.ServerCalls.asyncUnaryCall( - new MethodHandlers< - org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesByPublicKeyHashesRequest, - org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesByPublicKeyHashesResponse>( - this, METHODID_GET_IDENTITIES_BY_PUBLIC_KEY_HASHES))) .addMethod( getGetIdentityByPublicKeyHashMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall( @@ -1046,18 +1001,18 @@ public void getIdentity(org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentity /** */ - public void getIdentities(org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesRequest request, - io.grpc.stub.StreamObserver responseObserver) { + public void getIdentityKeys(org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityKeysRequest request, + io.grpc.stub.StreamObserver responseObserver) { io.grpc.stub.ClientCalls.asyncUnaryCall( - getChannel().newCall(getGetIdentitiesMethod(), getCallOptions()), request, responseObserver); + getChannel().newCall(getGetIdentityKeysMethod(), getCallOptions()), request, responseObserver); } /** */ - public void getIdentityKeys(org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityKeysRequest request, - io.grpc.stub.StreamObserver responseObserver) { + public void getIdentitiesContractKeys(org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesContractKeysRequest request, + io.grpc.stub.StreamObserver responseObserver) { io.grpc.stub.ClientCalls.asyncUnaryCall( - getChannel().newCall(getGetIdentityKeysMethod(), getCallOptions()), request, responseObserver); + getChannel().newCall(getGetIdentitiesContractKeysMethod(), getCallOptions()), request, responseObserver); } /** @@ -1132,14 +1087,6 @@ public void getDocuments(org.dash.platform.dapi.v0.PlatformOuterClass.GetDocumen getChannel().newCall(getGetDocumentsMethod(), getCallOptions()), request, responseObserver); } - /** - */ - public void getIdentitiesByPublicKeyHashes(org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesByPublicKeyHashesRequest request, - io.grpc.stub.StreamObserver responseObserver) { - io.grpc.stub.ClientCalls.asyncUnaryCall( - getChannel().newCall(getGetIdentitiesByPublicKeyHashesMethod(), getCallOptions()), request, responseObserver); - } - /** */ public void getIdentityByPublicKeyHash(org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityByPublicKeyHashRequest request, @@ -1227,16 +1174,16 @@ public org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityResponse getIdent /** */ - public org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesResponse getIdentities(org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesRequest request) { + public org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityKeysResponse getIdentityKeys(org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityKeysRequest request) { return io.grpc.stub.ClientCalls.blockingUnaryCall( - getChannel(), getGetIdentitiesMethod(), getCallOptions(), request); + getChannel(), getGetIdentityKeysMethod(), getCallOptions(), request); } /** */ - public org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityKeysResponse getIdentityKeys(org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityKeysRequest request) { + public org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesContractKeysResponse getIdentitiesContractKeys(org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesContractKeysRequest request) { return io.grpc.stub.ClientCalls.blockingUnaryCall( - getChannel(), getGetIdentityKeysMethod(), getCallOptions(), request); + getChannel(), getGetIdentitiesContractKeysMethod(), getCallOptions(), request); } /** @@ -1302,13 +1249,6 @@ public org.dash.platform.dapi.v0.PlatformOuterClass.GetDocumentsResponse getDocu getChannel(), getGetDocumentsMethod(), getCallOptions(), request); } - /** - */ - public org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesByPublicKeyHashesResponse getIdentitiesByPublicKeyHashes(org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesByPublicKeyHashesRequest request) { - return io.grpc.stub.ClientCalls.blockingUnaryCall( - getChannel(), getGetIdentitiesByPublicKeyHashesMethod(), getCallOptions(), request); - } - /** */ public org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityByPublicKeyHashResponse getIdentityByPublicKeyHash(org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityByPublicKeyHashRequest request) { @@ -1391,18 +1331,18 @@ public com.google.common.util.concurrent.ListenableFuture getIdentities( - org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesRequest request) { + public com.google.common.util.concurrent.ListenableFuture getIdentityKeys( + org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityKeysRequest request) { return io.grpc.stub.ClientCalls.futureUnaryCall( - getChannel().newCall(getGetIdentitiesMethod(), getCallOptions()), request); + getChannel().newCall(getGetIdentityKeysMethod(), getCallOptions()), request); } /** */ - public com.google.common.util.concurrent.ListenableFuture getIdentityKeys( - org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityKeysRequest request) { + public com.google.common.util.concurrent.ListenableFuture getIdentitiesContractKeys( + org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesContractKeysRequest request) { return io.grpc.stub.ClientCalls.futureUnaryCall( - getChannel().newCall(getGetIdentityKeysMethod(), getCallOptions()), request); + getChannel().newCall(getGetIdentitiesContractKeysMethod(), getCallOptions()), request); } /** @@ -1477,14 +1417,6 @@ public com.google.common.util.concurrent.ListenableFuture getIdentitiesByPublicKeyHashes( - org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesByPublicKeyHashesRequest request) { - return io.grpc.stub.ClientCalls.futureUnaryCall( - getChannel().newCall(getGetIdentitiesByPublicKeyHashesMethod(), getCallOptions()), request); - } - /** */ public com.google.common.util.concurrent.ListenableFuture getIdentityByPublicKeyHash( @@ -1544,8 +1476,8 @@ public com.google.common.util.concurrent.ListenableFuture implements io.grpc.stub.ServerCalls.UnaryMethod, @@ -1589,14 +1520,14 @@ public void invoke(Req request, io.grpc.stub.StreamObserver responseObserv serviceImpl.getIdentity((org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityRequest) request, (io.grpc.stub.StreamObserver) responseObserver); break; - case METHODID_GET_IDENTITIES: - serviceImpl.getIdentities((org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesRequest) request, - (io.grpc.stub.StreamObserver) responseObserver); - break; case METHODID_GET_IDENTITY_KEYS: serviceImpl.getIdentityKeys((org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityKeysRequest) request, (io.grpc.stub.StreamObserver) responseObserver); break; + case METHODID_GET_IDENTITIES_CONTRACT_KEYS: + serviceImpl.getIdentitiesContractKeys((org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesContractKeysRequest) request, + (io.grpc.stub.StreamObserver) responseObserver); + break; case METHODID_GET_IDENTITY_NONCE: serviceImpl.getIdentityNonce((org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityNonceRequest) request, (io.grpc.stub.StreamObserver) responseObserver); @@ -1633,10 +1564,6 @@ public void invoke(Req request, io.grpc.stub.StreamObserver responseObserv serviceImpl.getDocuments((org.dash.platform.dapi.v0.PlatformOuterClass.GetDocumentsRequest) request, (io.grpc.stub.StreamObserver) responseObserver); break; - case METHODID_GET_IDENTITIES_BY_PUBLIC_KEY_HASHES: - serviceImpl.getIdentitiesByPublicKeyHashes((org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesByPublicKeyHashesRequest) request, - (io.grpc.stub.StreamObserver) responseObserver); - break; case METHODID_GET_IDENTITY_BY_PUBLIC_KEY_HASH: serviceImpl.getIdentityByPublicKeyHash((org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityByPublicKeyHashRequest) request, (io.grpc.stub.StreamObserver) responseObserver); @@ -1728,8 +1655,8 @@ public static io.grpc.ServiceDescriptor getServiceDescriptor() { .setSchemaDescriptor(new PlatformFileDescriptorSupplier()) .addMethod(getBroadcastStateTransitionMethod()) .addMethod(getGetIdentityMethod()) - .addMethod(getGetIdentitiesMethod()) .addMethod(getGetIdentityKeysMethod()) + .addMethod(getGetIdentitiesContractKeysMethod()) .addMethod(getGetIdentityNonceMethod()) .addMethod(getGetIdentityContractNonceMethod()) .addMethod(getGetIdentityBalanceMethod()) @@ -1739,7 +1666,6 @@ public static io.grpc.ServiceDescriptor getServiceDescriptor() { .addMethod(getGetDataContractHistoryMethod()) .addMethod(getGetDataContractsMethod()) .addMethod(getGetDocumentsMethod()) - .addMethod(getGetIdentitiesByPublicKeyHashesMethod()) .addMethod(getGetIdentityByPublicKeyHashMethod()) .addMethod(getWaitForStateTransitionResultMethod()) .addMethod(getGetConsensusParamsMethod()) diff --git a/packages/dapi-grpc/clients/platform/v0/nodejs/PlatformPromiseClient.js b/packages/dapi-grpc/clients/platform/v0/nodejs/PlatformPromiseClient.js index dc2043a177..d56eaf8f30 100644 --- a/packages/dapi-grpc/clients/platform/v0/nodejs/PlatformPromiseClient.js +++ b/packages/dapi-grpc/clients/platform/v0/nodejs/PlatformPromiseClient.js @@ -28,14 +28,16 @@ const { BroadcastStateTransitionResponse: PBJSBroadcastStateTransitionResponse, GetIdentityRequest: PBJSGetIdentityRequest, GetIdentityResponse: PBJSGetIdentityResponse, + GetIdentitiesContractKeysRequest: PBJSGetIdentitiesContractKeysRequest, + GetIdentitiesContractKeysResponse: PBJSGetIdentitiesContractKeysResponse, GetDataContractRequest: PBJSGetDataContractRequest, GetDataContractResponse: PBJSGetDataContractResponse, GetDataContractHistoryRequest: PBJSGetDataContractHistoryRequest, GetDataContractHistoryResponse: PBJSGetDataContractHistoryResponse, GetDocumentsRequest: PBJSGetDocumentsRequest, GetDocumentsResponse: PBJSGetDocumentsResponse, - GetIdentitiesByPublicKeyHashesRequest: PBJSGetIdentitiesByPublicKeyHashesRequest, - GetIdentitiesByPublicKeyHashesResponse: PBJSGetIdentitiesByPublicKeyHashesResponse, + GetIdentityByPublicKeyHashRequest: PBJSGetIdentityByPublicKeyHashRequest, + GetIdentityByPublicKeyHashResponse: PBJSGetIdentityByPublicKeyHashResponse, WaitForStateTransitionResultRequest: PBJSWaitForStateTransitionResultRequest, WaitForStateTransitionResultResponse: PBJSWaitForStateTransitionResultResponse, GetConsensusParamsRequest: PBJSGetConsensusParamsRequest, @@ -66,10 +68,11 @@ const { const { BroadcastStateTransitionResponse: ProtocBroadcastStateTransitionResponse, GetIdentityResponse: ProtocGetIdentityResponse, + GetIdentitiesContractKeysResponse: ProtocGetIdentitiesContractKeysResponse, GetDataContractResponse: ProtocGetDataContractResponse, GetDataContractHistoryResponse: ProtocGetDataContractHistoryResponse, GetDocumentsResponse: ProtocGetDocumentsResponse, - GetIdentitiesByPublicKeyHashesResponse: ProtocGetIdentitiesByPublicKeyHashesResponse, + GetIdentityByPublicKeyHashResponse: ProtocGetIdentityByPublicKeyHashResponse, WaitForStateTransitionResultResponse: ProtocWaitForStateTransitionResultResponse, GetConsensusParamsResponse: ProtocGetConsensusParamsResponse, GetEpochsInfoResponse: ProtocGetEpochsInfoResponse, @@ -113,6 +116,10 @@ class PlatformPromiseClient { this.client.getIdentity.bind(this.client), ); + this.client.getIdentitiesContractKeys = promisify( + this.client.getIdentitiesContractKeys.bind(this.client), + ); + this.client.getDataContract = promisify( this.client.getDataContract.bind(this.client), ); @@ -125,8 +132,8 @@ class PlatformPromiseClient { this.client.getDocuments.bind(this.client), ); - this.client.getIdentitiesByPublicKeyHashes = promisify( - this.client.getIdentitiesByPublicKeyHashes.bind(this.client), + this.client.getIdentityByPublicKeyHash = promisify( + this.client.getIdentityByPublicKeyHash.bind(this.client), ); this.client.waitForStateTransitionResult = promisify( @@ -230,6 +237,40 @@ class PlatformPromiseClient { ); } + /** + * @param {!GetIdentitiesContractKeysRequest} getIdentitiesContractKeysRequest + * @param {?Object} metadata + * @param {CallOptions} [options={}] + * @returns {Promise} + */ + getIdentitiesContractKeys( + getIdentitiesContractKeysRequest, + metadata = {}, + options = {}, + ) { + if (!isObject(metadata)) { + throw new Error('metadata must be an object'); + } + return this.client.getIdentitiesContractKeys( + getIdentitiesContractKeysRequest, + convertObjectToMetadata(metadata), + { + interceptors: [ + jsonToProtobufInterceptorFactory( + jsonToProtobufFactory( + ProtocGetIdentitiesContractKeysResponse, + PBJSGetIdentitiesContractKeysResponse, + ), + protobufToJsonFactory( + PBJSGetIdentitiesContractKeysRequest, + ), + ), + ], + ...options, + }, + ); + } + /** * * @param {!GetDataContractRequest} getDataContractRequest @@ -327,13 +368,13 @@ class PlatformPromiseClient { } /** - * @param {!GetIdentitiesByPublicKeyHashesRequest} getIdentitiesByPublicKeyHashesRequest + * @param {!GetIdentityByPublicKeyHashRequest} getIdentityByPublicKeyHashRequest * @param {?Object} metadata * @param {CallOptions} [options={}] - * @returns {Promise} + * @returns {Promise} */ - getIdentitiesByPublicKeyHashes( - getIdentitiesByPublicKeyHashesRequest, + getIdentityByPublicKeyHash( + getIdentityByPublicKeyHashRequest, metadata = {}, options = {}, ) { @@ -341,18 +382,18 @@ class PlatformPromiseClient { throw new Error('metadata must be an object'); } - return this.client.getIdentitiesByPublicKeyHashes( - getIdentitiesByPublicKeyHashesRequest, + return this.client.getIdentityByPublicKeyHash( + getIdentityByPublicKeyHashRequest, convertObjectToMetadata(metadata), { interceptors: [ jsonToProtobufInterceptorFactory( jsonToProtobufFactory( - ProtocGetIdentitiesByPublicKeyHashesResponse, - PBJSGetIdentitiesByPublicKeyHashesResponse, + ProtocGetIdentityByPublicKeyHashResponse, + PBJSGetIdentityByPublicKeyHashResponse, ), protobufToJsonFactory( - PBJSGetIdentitiesByPublicKeyHashesRequest, + PBJSGetIdentityByPublicKeyHashRequest, ), ), ], diff --git a/packages/dapi-grpc/clients/platform/v0/nodejs/platform_pbjs.js b/packages/dapi-grpc/clients/platform/v0/nodejs/platform_pbjs.js index 1b45c95481..7cc9498b9e 100644 --- a/packages/dapi-grpc/clients/platform/v0/nodejs/platform_pbjs.js +++ b/packages/dapi-grpc/clients/platform/v0/nodejs/platform_pbjs.js @@ -153,68 +153,68 @@ $root.org = (function() { */ /** - * Callback as used by {@link org.dash.platform.dapi.v0.Platform#getIdentities}. + * Callback as used by {@link org.dash.platform.dapi.v0.Platform#getIdentityKeys}. * @memberof org.dash.platform.dapi.v0.Platform - * @typedef getIdentitiesCallback + * @typedef getIdentityKeysCallback * @type {function} * @param {Error|null} error Error, if any - * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse} [response] GetIdentitiesResponse + * @param {org.dash.platform.dapi.v0.GetIdentityKeysResponse} [response] GetIdentityKeysResponse */ /** - * Calls getIdentities. - * @function getIdentities + * Calls getIdentityKeys. + * @function getIdentityKeys * @memberof org.dash.platform.dapi.v0.Platform * @instance - * @param {org.dash.platform.dapi.v0.IGetIdentitiesRequest} request GetIdentitiesRequest message or plain object - * @param {org.dash.platform.dapi.v0.Platform.getIdentitiesCallback} callback Node-style callback called with the error, if any, and GetIdentitiesResponse + * @param {org.dash.platform.dapi.v0.IGetIdentityKeysRequest} request GetIdentityKeysRequest message or plain object + * @param {org.dash.platform.dapi.v0.Platform.getIdentityKeysCallback} callback Node-style callback called with the error, if any, and GetIdentityKeysResponse * @returns {undefined} * @variation 1 */ - Object.defineProperty(Platform.prototype.getIdentities = function getIdentities(request, callback) { - return this.rpcCall(getIdentities, $root.org.dash.platform.dapi.v0.GetIdentitiesRequest, $root.org.dash.platform.dapi.v0.GetIdentitiesResponse, request, callback); - }, "name", { value: "getIdentities" }); + Object.defineProperty(Platform.prototype.getIdentityKeys = function getIdentityKeys(request, callback) { + return this.rpcCall(getIdentityKeys, $root.org.dash.platform.dapi.v0.GetIdentityKeysRequest, $root.org.dash.platform.dapi.v0.GetIdentityKeysResponse, request, callback); + }, "name", { value: "getIdentityKeys" }); /** - * Calls getIdentities. - * @function getIdentities + * Calls getIdentityKeys. + * @function getIdentityKeys * @memberof org.dash.platform.dapi.v0.Platform * @instance - * @param {org.dash.platform.dapi.v0.IGetIdentitiesRequest} request GetIdentitiesRequest message or plain object - * @returns {Promise} Promise + * @param {org.dash.platform.dapi.v0.IGetIdentityKeysRequest} request GetIdentityKeysRequest message or plain object + * @returns {Promise} Promise * @variation 2 */ /** - * Callback as used by {@link org.dash.platform.dapi.v0.Platform#getIdentityKeys}. + * Callback as used by {@link org.dash.platform.dapi.v0.Platform#getIdentitiesContractKeys}. * @memberof org.dash.platform.dapi.v0.Platform - * @typedef getIdentityKeysCallback + * @typedef getIdentitiesContractKeysCallback * @type {function} * @param {Error|null} error Error, if any - * @param {org.dash.platform.dapi.v0.GetIdentityKeysResponse} [response] GetIdentityKeysResponse + * @param {org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse} [response] GetIdentitiesContractKeysResponse */ /** - * Calls getIdentityKeys. - * @function getIdentityKeys + * Calls getIdentitiesContractKeys. + * @function getIdentitiesContractKeys * @memberof org.dash.platform.dapi.v0.Platform * @instance - * @param {org.dash.platform.dapi.v0.IGetIdentityKeysRequest} request GetIdentityKeysRequest message or plain object - * @param {org.dash.platform.dapi.v0.Platform.getIdentityKeysCallback} callback Node-style callback called with the error, if any, and GetIdentityKeysResponse + * @param {org.dash.platform.dapi.v0.IGetIdentitiesContractKeysRequest} request GetIdentitiesContractKeysRequest message or plain object + * @param {org.dash.platform.dapi.v0.Platform.getIdentitiesContractKeysCallback} callback Node-style callback called with the error, if any, and GetIdentitiesContractKeysResponse * @returns {undefined} * @variation 1 */ - Object.defineProperty(Platform.prototype.getIdentityKeys = function getIdentityKeys(request, callback) { - return this.rpcCall(getIdentityKeys, $root.org.dash.platform.dapi.v0.GetIdentityKeysRequest, $root.org.dash.platform.dapi.v0.GetIdentityKeysResponse, request, callback); - }, "name", { value: "getIdentityKeys" }); + Object.defineProperty(Platform.prototype.getIdentitiesContractKeys = function getIdentitiesContractKeys(request, callback) { + return this.rpcCall(getIdentitiesContractKeys, $root.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest, $root.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse, request, callback); + }, "name", { value: "getIdentitiesContractKeys" }); /** - * Calls getIdentityKeys. - * @function getIdentityKeys + * Calls getIdentitiesContractKeys. + * @function getIdentitiesContractKeys * @memberof org.dash.platform.dapi.v0.Platform * @instance - * @param {org.dash.platform.dapi.v0.IGetIdentityKeysRequest} request GetIdentityKeysRequest message or plain object - * @returns {Promise} Promise + * @param {org.dash.platform.dapi.v0.IGetIdentitiesContractKeysRequest} request GetIdentitiesContractKeysRequest message or plain object + * @returns {Promise} Promise * @variation 2 */ @@ -515,39 +515,6 @@ $root.org = (function() { * @variation 2 */ - /** - * Callback as used by {@link org.dash.platform.dapi.v0.Platform#getIdentitiesByPublicKeyHashes}. - * @memberof org.dash.platform.dapi.v0.Platform - * @typedef getIdentitiesByPublicKeyHashesCallback - * @type {function} - * @param {Error|null} error Error, if any - * @param {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse} [response] GetIdentitiesByPublicKeyHashesResponse - */ - - /** - * Calls getIdentitiesByPublicKeyHashes. - * @function getIdentitiesByPublicKeyHashes - * @memberof org.dash.platform.dapi.v0.Platform - * @instance - * @param {org.dash.platform.dapi.v0.IGetIdentitiesByPublicKeyHashesRequest} request GetIdentitiesByPublicKeyHashesRequest message or plain object - * @param {org.dash.platform.dapi.v0.Platform.getIdentitiesByPublicKeyHashesCallback} callback Node-style callback called with the error, if any, and GetIdentitiesByPublicKeyHashesResponse - * @returns {undefined} - * @variation 1 - */ - Object.defineProperty(Platform.prototype.getIdentitiesByPublicKeyHashes = function getIdentitiesByPublicKeyHashes(request, callback) { - return this.rpcCall(getIdentitiesByPublicKeyHashes, $root.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest, $root.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse, request, callback); - }, "name", { value: "getIdentitiesByPublicKeyHashes" }); - - /** - * Calls getIdentitiesByPublicKeyHashes. - * @function getIdentitiesByPublicKeyHashes - * @memberof org.dash.platform.dapi.v0.Platform - * @instance - * @param {org.dash.platform.dapi.v0.IGetIdentitiesByPublicKeyHashesRequest} request GetIdentitiesByPublicKeyHashesRequest message or plain object - * @returns {Promise} Promise - * @variation 2 - */ - /** * Callback as used by {@link org.dash.platform.dapi.v0.Platform#getIdentityByPublicKeyHash}. * @memberof org.dash.platform.dapi.v0.Platform @@ -1683,6 +1650,26 @@ $root.org = (function() { return StateTransitionBroadcastError; })(); + /** + * KeyPurpose enum. + * @name org.dash.platform.dapi.v0.KeyPurpose + * @enum {number} + * @property {number} AUTHENTICATION=0 AUTHENTICATION value + * @property {number} ENCRYPTION=1 ENCRYPTION value + * @property {number} DECRYPTION=2 DECRYPTION value + * @property {number} TRANSFER=3 TRANSFER value + * @property {number} VOTING=5 VOTING value + */ + v0.KeyPurpose = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "AUTHENTICATION"] = 0; + values[valuesById[1] = "ENCRYPTION"] = 1; + values[valuesById[2] = "DECRYPTION"] = 2; + values[valuesById[3] = "TRANSFER"] = 3; + values[valuesById[5] = "VOTING"] = 5; + return values; + })(); + v0.BroadcastStateTransitionRequest = (function() { /** @@ -4701,24 +4688,24 @@ $root.org = (function() { return GetIdentityResponse; })(); - v0.GetIdentitiesRequest = (function() { + v0.GetIdentityNonceResponse = (function() { /** - * Properties of a GetIdentitiesRequest. + * Properties of a GetIdentityNonceResponse. * @memberof org.dash.platform.dapi.v0 - * @interface IGetIdentitiesRequest - * @property {org.dash.platform.dapi.v0.GetIdentitiesRequest.IGetIdentitiesRequestV0|null} [v0] GetIdentitiesRequest v0 + * @interface IGetIdentityNonceResponse + * @property {org.dash.platform.dapi.v0.GetIdentityNonceResponse.IGetIdentityNonceResponseV0|null} [v0] GetIdentityNonceResponse v0 */ /** - * Constructs a new GetIdentitiesRequest. + * Constructs a new GetIdentityNonceResponse. * @memberof org.dash.platform.dapi.v0 - * @classdesc Represents a GetIdentitiesRequest. - * @implements IGetIdentitiesRequest + * @classdesc Represents a GetIdentityNonceResponse. + * @implements IGetIdentityNonceResponse * @constructor - * @param {org.dash.platform.dapi.v0.IGetIdentitiesRequest=} [properties] Properties to set + * @param {org.dash.platform.dapi.v0.IGetIdentityNonceResponse=} [properties] Properties to set */ - function GetIdentitiesRequest(properties) { + function GetIdentityNonceResponse(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -4726,89 +4713,89 @@ $root.org = (function() { } /** - * GetIdentitiesRequest v0. - * @member {org.dash.platform.dapi.v0.GetIdentitiesRequest.IGetIdentitiesRequestV0|null|undefined} v0 - * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest + * GetIdentityNonceResponse v0. + * @member {org.dash.platform.dapi.v0.GetIdentityNonceResponse.IGetIdentityNonceResponseV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse * @instance */ - GetIdentitiesRequest.prototype.v0 = null; + GetIdentityNonceResponse.prototype.v0 = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** - * GetIdentitiesRequest version. + * GetIdentityNonceResponse version. * @member {"v0"|undefined} version - * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse * @instance */ - Object.defineProperty(GetIdentitiesRequest.prototype, "version", { + Object.defineProperty(GetIdentityNonceResponse.prototype, "version", { get: $util.oneOfGetter($oneOfFields = ["v0"]), set: $util.oneOfSetter($oneOfFields) }); /** - * Creates a new GetIdentitiesRequest instance using the specified properties. + * Creates a new GetIdentityNonceResponse instance using the specified properties. * @function create - * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse * @static - * @param {org.dash.platform.dapi.v0.IGetIdentitiesRequest=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetIdentitiesRequest} GetIdentitiesRequest instance + * @param {org.dash.platform.dapi.v0.IGetIdentityNonceResponse=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentityNonceResponse} GetIdentityNonceResponse instance */ - GetIdentitiesRequest.create = function create(properties) { - return new GetIdentitiesRequest(properties); + GetIdentityNonceResponse.create = function create(properties) { + return new GetIdentityNonceResponse(properties); }; /** - * Encodes the specified GetIdentitiesRequest message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesRequest.verify|verify} messages. + * Encodes the specified GetIdentityNonceResponse message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityNonceResponse.verify|verify} messages. * @function encode - * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse * @static - * @param {org.dash.platform.dapi.v0.IGetIdentitiesRequest} message GetIdentitiesRequest message or plain object to encode + * @param {org.dash.platform.dapi.v0.IGetIdentityNonceResponse} message GetIdentityNonceResponse message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetIdentitiesRequest.encode = function encode(message, writer) { + GetIdentityNonceResponse.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) - $root.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + $root.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); return writer; }; /** - * Encodes the specified GetIdentitiesRequest message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesRequest.verify|verify} messages. + * Encodes the specified GetIdentityNonceResponse message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityNonceResponse.verify|verify} messages. * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse * @static - * @param {org.dash.platform.dapi.v0.IGetIdentitiesRequest} message GetIdentitiesRequest message or plain object to encode + * @param {org.dash.platform.dapi.v0.IGetIdentityNonceResponse} message GetIdentityNonceResponse message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetIdentitiesRequest.encodeDelimited = function encodeDelimited(message, writer) { + GetIdentityNonceResponse.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a GetIdentitiesRequest message from the specified reader or buffer. + * Decodes a GetIdentityNonceResponse message from the specified reader or buffer. * @function decode - * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetIdentitiesRequest} GetIdentitiesRequest + * @returns {org.dash.platform.dapi.v0.GetIdentityNonceResponse} GetIdentityNonceResponse * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetIdentitiesRequest.decode = function decode(reader, length) { + GetIdentityNonceResponse.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentitiesRequest(); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityNonceResponse(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { case 1: - message.v0 = $root.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.decode(reader, reader.uint32()); + message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.decode(reader, reader.uint32()); break; default: reader.skipType(tag & 7); @@ -4819,37 +4806,37 @@ $root.org = (function() { }; /** - * Decodes a GetIdentitiesRequest message from the specified reader or buffer, length delimited. + * Decodes a GetIdentityNonceResponse message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetIdentitiesRequest} GetIdentitiesRequest + * @returns {org.dash.platform.dapi.v0.GetIdentityNonceResponse} GetIdentityNonceResponse * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetIdentitiesRequest.decodeDelimited = function decodeDelimited(reader) { + GetIdentityNonceResponse.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a GetIdentitiesRequest message. + * Verifies a GetIdentityNonceResponse message. * @function verify - * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - GetIdentitiesRequest.verify = function verify(message) { + GetIdentityNonceResponse.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; var properties = {}; if (message.v0 != null && message.hasOwnProperty("v0")) { properties.version = 1; { - var error = $root.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.verify(message.v0); + var error = $root.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.verify(message.v0); if (error) return "v0." + error; } @@ -4858,40 +4845,40 @@ $root.org = (function() { }; /** - * Creates a GetIdentitiesRequest message from a plain object. Also converts values to their respective internal types. + * Creates a GetIdentityNonceResponse message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse * @static * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetIdentitiesRequest} GetIdentitiesRequest + * @returns {org.dash.platform.dapi.v0.GetIdentityNonceResponse} GetIdentityNonceResponse */ - GetIdentitiesRequest.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentitiesRequest) + GetIdentityNonceResponse.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityNonceResponse) return object; - var message = new $root.org.dash.platform.dapi.v0.GetIdentitiesRequest(); + var message = new $root.org.dash.platform.dapi.v0.GetIdentityNonceResponse(); if (object.v0 != null) { if (typeof object.v0 !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesRequest.v0: object expected"); - message.v0 = $root.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.fromObject(object.v0); + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityNonceResponse.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.fromObject(object.v0); } return message; }; /** - * Creates a plain object from a GetIdentitiesRequest message. Also converts values to other types if specified. + * Creates a plain object from a GetIdentityNonceResponse message. Also converts values to other types if specified. * @function toObject - * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesRequest} message GetIdentitiesRequest + * @param {org.dash.platform.dapi.v0.GetIdentityNonceResponse} message GetIdentityNonceResponse * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - GetIdentitiesRequest.toObject = function toObject(message, options) { + GetIdentityNonceResponse.toObject = function toObject(message, options) { if (!options) options = {}; var object = {}; if (message.v0 != null && message.hasOwnProperty("v0")) { - object.v0 = $root.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.toObject(message.v0, options); + object.v0 = $root.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.toObject(message.v0, options); if (options.oneofs) object.version = "v0"; } @@ -4899,36 +4886,36 @@ $root.org = (function() { }; /** - * Converts this GetIdentitiesRequest to JSON. + * Converts this GetIdentityNonceResponse to JSON. * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse * @instance * @returns {Object.} JSON object */ - GetIdentitiesRequest.prototype.toJSON = function toJSON() { + GetIdentityNonceResponse.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - GetIdentitiesRequest.GetIdentitiesRequestV0 = (function() { + GetIdentityNonceResponse.GetIdentityNonceResponseV0 = (function() { /** - * Properties of a GetIdentitiesRequestV0. - * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest - * @interface IGetIdentitiesRequestV0 - * @property {Array.|null} [ids] GetIdentitiesRequestV0 ids - * @property {boolean|null} [prove] GetIdentitiesRequestV0 prove + * Properties of a GetIdentityNonceResponseV0. + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse + * @interface IGetIdentityNonceResponseV0 + * @property {number|Long|null} [identityNonce] GetIdentityNonceResponseV0 identityNonce + * @property {org.dash.platform.dapi.v0.IProof|null} [proof] GetIdentityNonceResponseV0 proof + * @property {org.dash.platform.dapi.v0.IResponseMetadata|null} [metadata] GetIdentityNonceResponseV0 metadata */ /** - * Constructs a new GetIdentitiesRequestV0. - * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest - * @classdesc Represents a GetIdentitiesRequestV0. - * @implements IGetIdentitiesRequestV0 + * Constructs a new GetIdentityNonceResponseV0. + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse + * @classdesc Represents a GetIdentityNonceResponseV0. + * @implements IGetIdentityNonceResponseV0 * @constructor - * @param {org.dash.platform.dapi.v0.GetIdentitiesRequest.IGetIdentitiesRequestV0=} [properties] Properties to set + * @param {org.dash.platform.dapi.v0.GetIdentityNonceResponse.IGetIdentityNonceResponseV0=} [properties] Properties to set */ - function GetIdentitiesRequestV0(properties) { - this.ids = []; + function GetIdentityNonceResponseV0(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -4936,91 +4923,115 @@ $root.org = (function() { } /** - * GetIdentitiesRequestV0 ids. - * @member {Array.} ids - * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0 + * GetIdentityNonceResponseV0 identityNonce. + * @member {number|Long} identityNonce + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0 * @instance */ - GetIdentitiesRequestV0.prototype.ids = $util.emptyArray; + GetIdentityNonceResponseV0.prototype.identityNonce = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** - * GetIdentitiesRequestV0 prove. - * @member {boolean} prove - * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0 + * GetIdentityNonceResponseV0 proof. + * @member {org.dash.platform.dapi.v0.IProof|null|undefined} proof + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0 + * @instance + */ + GetIdentityNonceResponseV0.prototype.proof = null; + + /** + * GetIdentityNonceResponseV0 metadata. + * @member {org.dash.platform.dapi.v0.IResponseMetadata|null|undefined} metadata + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0 + * @instance + */ + GetIdentityNonceResponseV0.prototype.metadata = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetIdentityNonceResponseV0 result. + * @member {"identityNonce"|"proof"|undefined} result + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0 * @instance */ - GetIdentitiesRequestV0.prototype.prove = false; + Object.defineProperty(GetIdentityNonceResponseV0.prototype, "result", { + get: $util.oneOfGetter($oneOfFields = ["identityNonce", "proof"]), + set: $util.oneOfSetter($oneOfFields) + }); /** - * Creates a new GetIdentitiesRequestV0 instance using the specified properties. + * Creates a new GetIdentityNonceResponseV0 instance using the specified properties. * @function create - * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesRequest.IGetIdentitiesRequestV0=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} GetIdentitiesRequestV0 instance + * @param {org.dash.platform.dapi.v0.GetIdentityNonceResponse.IGetIdentityNonceResponseV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} GetIdentityNonceResponseV0 instance */ - GetIdentitiesRequestV0.create = function create(properties) { - return new GetIdentitiesRequestV0(properties); + GetIdentityNonceResponseV0.create = function create(properties) { + return new GetIdentityNonceResponseV0(properties); }; /** - * Encodes the specified GetIdentitiesRequestV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.verify|verify} messages. + * Encodes the specified GetIdentityNonceResponseV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.verify|verify} messages. * @function encode - * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesRequest.IGetIdentitiesRequestV0} message GetIdentitiesRequestV0 message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetIdentityNonceResponse.IGetIdentityNonceResponseV0} message GetIdentityNonceResponseV0 message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetIdentitiesRequestV0.encode = function encode(message, writer) { + GetIdentityNonceResponseV0.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.ids != null && message.ids.length) - for (var i = 0; i < message.ids.length; ++i) - writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.ids[i]); - if (message.prove != null && Object.hasOwnProperty.call(message, "prove")) - writer.uint32(/* id 2, wireType 0 =*/16).bool(message.prove); + if (message.identityNonce != null && Object.hasOwnProperty.call(message, "identityNonce")) + writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.identityNonce); + if (message.proof != null && Object.hasOwnProperty.call(message, "proof")) + $root.org.dash.platform.dapi.v0.Proof.encode(message.proof, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.metadata != null && Object.hasOwnProperty.call(message, "metadata")) + $root.org.dash.platform.dapi.v0.ResponseMetadata.encode(message.metadata, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); return writer; }; /** - * Encodes the specified GetIdentitiesRequestV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.verify|verify} messages. + * Encodes the specified GetIdentityNonceResponseV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.verify|verify} messages. * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesRequest.IGetIdentitiesRequestV0} message GetIdentitiesRequestV0 message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetIdentityNonceResponse.IGetIdentityNonceResponseV0} message GetIdentityNonceResponseV0 message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetIdentitiesRequestV0.encodeDelimited = function encodeDelimited(message, writer) { + GetIdentityNonceResponseV0.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a GetIdentitiesRequestV0 message from the specified reader or buffer. + * Decodes a GetIdentityNonceResponseV0 message from the specified reader or buffer. * @function decode - * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0 * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} GetIdentitiesRequestV0 + * @returns {org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} GetIdentityNonceResponseV0 * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetIdentitiesRequestV0.decode = function decode(reader, length) { + GetIdentityNonceResponseV0.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0(); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { case 1: - if (!(message.ids && message.ids.length)) - message.ids = []; - message.ids.push(reader.bytes()); + message.identityNonce = reader.uint64(); break; case 2: - message.prove = reader.bool(); + message.proof = $root.org.dash.platform.dapi.v0.Proof.decode(reader, reader.uint32()); + break; + case 3: + message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.decode(reader, reader.uint32()); break; default: reader.skipType(tag & 7); @@ -5031,134 +5042,158 @@ $root.org = (function() { }; /** - * Decodes a GetIdentitiesRequestV0 message from the specified reader or buffer, length delimited. + * Decodes a GetIdentityNonceResponseV0 message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0 * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} GetIdentitiesRequestV0 + * @returns {org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} GetIdentityNonceResponseV0 * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetIdentitiesRequestV0.decodeDelimited = function decodeDelimited(reader) { + GetIdentityNonceResponseV0.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a GetIdentitiesRequestV0 message. + * Verifies a GetIdentityNonceResponseV0 message. * @function verify - * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0 * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - GetIdentitiesRequestV0.verify = function verify(message) { + GetIdentityNonceResponseV0.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; - if (message.ids != null && message.hasOwnProperty("ids")) { - if (!Array.isArray(message.ids)) - return "ids: array expected"; - for (var i = 0; i < message.ids.length; ++i) - if (!(message.ids[i] && typeof message.ids[i].length === "number" || $util.isString(message.ids[i]))) - return "ids: buffer[] expected"; + var properties = {}; + if (message.identityNonce != null && message.hasOwnProperty("identityNonce")) { + properties.result = 1; + if (!$util.isInteger(message.identityNonce) && !(message.identityNonce && $util.isInteger(message.identityNonce.low) && $util.isInteger(message.identityNonce.high))) + return "identityNonce: integer|Long expected"; + } + if (message.proof != null && message.hasOwnProperty("proof")) { + if (properties.result === 1) + return "result: multiple values"; + properties.result = 1; + { + var error = $root.org.dash.platform.dapi.v0.Proof.verify(message.proof); + if (error) + return "proof." + error; + } + } + if (message.metadata != null && message.hasOwnProperty("metadata")) { + var error = $root.org.dash.platform.dapi.v0.ResponseMetadata.verify(message.metadata); + if (error) + return "metadata." + error; } - if (message.prove != null && message.hasOwnProperty("prove")) - if (typeof message.prove !== "boolean") - return "prove: boolean expected"; return null; }; /** - * Creates a GetIdentitiesRequestV0 message from a plain object. Also converts values to their respective internal types. + * Creates a GetIdentityNonceResponseV0 message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0 * @static * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} GetIdentitiesRequestV0 + * @returns {org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} GetIdentityNonceResponseV0 */ - GetIdentitiesRequestV0.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0) + GetIdentityNonceResponseV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0) return object; - var message = new $root.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0(); - if (object.ids) { - if (!Array.isArray(object.ids)) - throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.ids: array expected"); - message.ids = []; - for (var i = 0; i < object.ids.length; ++i) - if (typeof object.ids[i] === "string") - $util.base64.decode(object.ids[i], message.ids[i] = $util.newBuffer($util.base64.length(object.ids[i])), 0); - else if (object.ids[i].length >= 0) - message.ids[i] = object.ids[i]; - } - if (object.prove != null) - message.prove = Boolean(object.prove); - return message; - }; - - /** - * Creates a plain object from a GetIdentitiesRequestV0 message. Also converts values to other types if specified. - * @function toObject - * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0 - * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} message GetIdentitiesRequestV0 - * @param {$protobuf.IConversionOptions} [options] Conversion options + var message = new $root.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0(); + if (object.identityNonce != null) + if ($util.Long) + (message.identityNonce = $util.Long.fromValue(object.identityNonce)).unsigned = true; + else if (typeof object.identityNonce === "string") + message.identityNonce = parseInt(object.identityNonce, 10); + else if (typeof object.identityNonce === "number") + message.identityNonce = object.identityNonce; + else if (typeof object.identityNonce === "object") + message.identityNonce = new $util.LongBits(object.identityNonce.low >>> 0, object.identityNonce.high >>> 0).toNumber(true); + if (object.proof != null) { + if (typeof object.proof !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.proof: object expected"); + message.proof = $root.org.dash.platform.dapi.v0.Proof.fromObject(object.proof); + } + if (object.metadata != null) { + if (typeof object.metadata !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.metadata: object expected"); + message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.fromObject(object.metadata); + } + return message; + }; + + /** + * Creates a plain object from a GetIdentityNonceResponseV0 message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} message GetIdentityNonceResponseV0 + * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - GetIdentitiesRequestV0.toObject = function toObject(message, options) { + GetIdentityNonceResponseV0.toObject = function toObject(message, options) { if (!options) options = {}; var object = {}; - if (options.arrays || options.defaults) - object.ids = []; if (options.defaults) - object.prove = false; - if (message.ids && message.ids.length) { - object.ids = []; - for (var j = 0; j < message.ids.length; ++j) - object.ids[j] = options.bytes === String ? $util.base64.encode(message.ids[j], 0, message.ids[j].length) : options.bytes === Array ? Array.prototype.slice.call(message.ids[j]) : message.ids[j]; + object.metadata = null; + if (message.identityNonce != null && message.hasOwnProperty("identityNonce")) { + if (typeof message.identityNonce === "number") + object.identityNonce = options.longs === String ? String(message.identityNonce) : message.identityNonce; + else + object.identityNonce = options.longs === String ? $util.Long.prototype.toString.call(message.identityNonce) : options.longs === Number ? new $util.LongBits(message.identityNonce.low >>> 0, message.identityNonce.high >>> 0).toNumber(true) : message.identityNonce; + if (options.oneofs) + object.result = "identityNonce"; } - if (message.prove != null && message.hasOwnProperty("prove")) - object.prove = message.prove; + if (message.proof != null && message.hasOwnProperty("proof")) { + object.proof = $root.org.dash.platform.dapi.v0.Proof.toObject(message.proof, options); + if (options.oneofs) + object.result = "proof"; + } + if (message.metadata != null && message.hasOwnProperty("metadata")) + object.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.toObject(message.metadata, options); return object; }; /** - * Converts this GetIdentitiesRequestV0 to JSON. + * Converts this GetIdentityNonceResponseV0 to JSON. * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0 * @instance * @returns {Object.} JSON object */ - GetIdentitiesRequestV0.prototype.toJSON = function toJSON() { + GetIdentityNonceResponseV0.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - return GetIdentitiesRequestV0; + return GetIdentityNonceResponseV0; })(); - return GetIdentitiesRequest; + return GetIdentityNonceResponse; })(); - v0.GetIdentitiesResponse = (function() { + v0.GetIdentityContractNonceResponse = (function() { /** - * Properties of a GetIdentitiesResponse. + * Properties of a GetIdentityContractNonceResponse. * @memberof org.dash.platform.dapi.v0 - * @interface IGetIdentitiesResponse - * @property {org.dash.platform.dapi.v0.GetIdentitiesResponse.IGetIdentitiesResponseV0|null} [v0] GetIdentitiesResponse v0 + * @interface IGetIdentityContractNonceResponse + * @property {org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.IGetIdentityContractNonceResponseV0|null} [v0] GetIdentityContractNonceResponse v0 */ /** - * Constructs a new GetIdentitiesResponse. + * Constructs a new GetIdentityContractNonceResponse. * @memberof org.dash.platform.dapi.v0 - * @classdesc Represents a GetIdentitiesResponse. - * @implements IGetIdentitiesResponse + * @classdesc Represents a GetIdentityContractNonceResponse. + * @implements IGetIdentityContractNonceResponse * @constructor - * @param {org.dash.platform.dapi.v0.IGetIdentitiesResponse=} [properties] Properties to set + * @param {org.dash.platform.dapi.v0.IGetIdentityContractNonceResponse=} [properties] Properties to set */ - function GetIdentitiesResponse(properties) { + function GetIdentityContractNonceResponse(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -5166,89 +5201,89 @@ $root.org = (function() { } /** - * GetIdentitiesResponse v0. - * @member {org.dash.platform.dapi.v0.GetIdentitiesResponse.IGetIdentitiesResponseV0|null|undefined} v0 - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse + * GetIdentityContractNonceResponse v0. + * @member {org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.IGetIdentityContractNonceResponseV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse * @instance */ - GetIdentitiesResponse.prototype.v0 = null; + GetIdentityContractNonceResponse.prototype.v0 = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** - * GetIdentitiesResponse version. + * GetIdentityContractNonceResponse version. * @member {"v0"|undefined} version - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse * @instance */ - Object.defineProperty(GetIdentitiesResponse.prototype, "version", { + Object.defineProperty(GetIdentityContractNonceResponse.prototype, "version", { get: $util.oneOfGetter($oneOfFields = ["v0"]), set: $util.oneOfSetter($oneOfFields) }); /** - * Creates a new GetIdentitiesResponse instance using the specified properties. + * Creates a new GetIdentityContractNonceResponse instance using the specified properties. * @function create - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse * @static - * @param {org.dash.platform.dapi.v0.IGetIdentitiesResponse=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse} GetIdentitiesResponse instance + * @param {org.dash.platform.dapi.v0.IGetIdentityContractNonceResponse=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} GetIdentityContractNonceResponse instance */ - GetIdentitiesResponse.create = function create(properties) { - return new GetIdentitiesResponse(properties); + GetIdentityContractNonceResponse.create = function create(properties) { + return new GetIdentityContractNonceResponse(properties); }; /** - * Encodes the specified GetIdentitiesResponse message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesResponse.verify|verify} messages. + * Encodes the specified GetIdentityContractNonceResponse message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.verify|verify} messages. * @function encode - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse * @static - * @param {org.dash.platform.dapi.v0.IGetIdentitiesResponse} message GetIdentitiesResponse message or plain object to encode + * @param {org.dash.platform.dapi.v0.IGetIdentityContractNonceResponse} message GetIdentityContractNonceResponse message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetIdentitiesResponse.encode = function encode(message, writer) { + GetIdentityContractNonceResponse.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) - $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + $root.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); return writer; }; /** - * Encodes the specified GetIdentitiesResponse message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesResponse.verify|verify} messages. + * Encodes the specified GetIdentityContractNonceResponse message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.verify|verify} messages. * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse * @static - * @param {org.dash.platform.dapi.v0.IGetIdentitiesResponse} message GetIdentitiesResponse message or plain object to encode + * @param {org.dash.platform.dapi.v0.IGetIdentityContractNonceResponse} message GetIdentityContractNonceResponse message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetIdentitiesResponse.encodeDelimited = function encodeDelimited(message, writer) { + GetIdentityContractNonceResponse.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a GetIdentitiesResponse message from the specified reader or buffer. + * Decodes a GetIdentityContractNonceResponse message from the specified reader or buffer. * @function decode - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse} GetIdentitiesResponse + * @returns {org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} GetIdentityContractNonceResponse * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetIdentitiesResponse.decode = function decode(reader, length) { + GetIdentityContractNonceResponse.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentitiesResponse(); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { case 1: - message.v0 = $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.decode(reader, reader.uint32()); + message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.decode(reader, reader.uint32()); break; default: reader.skipType(tag & 7); @@ -5259,37 +5294,37 @@ $root.org = (function() { }; /** - * Decodes a GetIdentitiesResponse message from the specified reader or buffer, length delimited. + * Decodes a GetIdentityContractNonceResponse message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse} GetIdentitiesResponse + * @returns {org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} GetIdentityContractNonceResponse * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetIdentitiesResponse.decodeDelimited = function decodeDelimited(reader) { + GetIdentityContractNonceResponse.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a GetIdentitiesResponse message. + * Verifies a GetIdentityContractNonceResponse message. * @function verify - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - GetIdentitiesResponse.verify = function verify(message) { + GetIdentityContractNonceResponse.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; var properties = {}; if (message.v0 != null && message.hasOwnProperty("v0")) { properties.version = 1; { - var error = $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.verify(message.v0); + var error = $root.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.verify(message.v0); if (error) return "v0." + error; } @@ -5298,40 +5333,40 @@ $root.org = (function() { }; /** - * Creates a GetIdentitiesResponse message from a plain object. Also converts values to their respective internal types. + * Creates a GetIdentityContractNonceResponse message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse * @static * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse} GetIdentitiesResponse + * @returns {org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} GetIdentityContractNonceResponse */ - GetIdentitiesResponse.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentitiesResponse) + GetIdentityContractNonceResponse.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse) return object; - var message = new $root.org.dash.platform.dapi.v0.GetIdentitiesResponse(); + var message = new $root.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse(); if (object.v0 != null) { if (typeof object.v0 !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesResponse.v0: object expected"); - message.v0 = $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.fromObject(object.v0); + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.fromObject(object.v0); } return message; }; /** - * Creates a plain object from a GetIdentitiesResponse message. Also converts values to other types if specified. + * Creates a plain object from a GetIdentityContractNonceResponse message. Also converts values to other types if specified. * @function toObject - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse} message GetIdentitiesResponse + * @param {org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} message GetIdentityContractNonceResponse * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - GetIdentitiesResponse.toObject = function toObject(message, options) { + GetIdentityContractNonceResponse.toObject = function toObject(message, options) { if (!options) options = {}; var object = {}; if (message.v0 != null && message.hasOwnProperty("v0")) { - object.v0 = $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.toObject(message.v0, options); + object.v0 = $root.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.toObject(message.v0, options); if (options.oneofs) object.version = "v0"; } @@ -5339,34 +5374,36 @@ $root.org = (function() { }; /** - * Converts this GetIdentitiesResponse to JSON. + * Converts this GetIdentityContractNonceResponse to JSON. * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse * @instance * @returns {Object.} JSON object */ - GetIdentitiesResponse.prototype.toJSON = function toJSON() { + GetIdentityContractNonceResponse.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - GetIdentitiesResponse.IdentityValue = (function() { + GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0 = (function() { /** - * Properties of an IdentityValue. - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse - * @interface IIdentityValue - * @property {Uint8Array|null} [value] IdentityValue value + * Properties of a GetIdentityContractNonceResponseV0. + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse + * @interface IGetIdentityContractNonceResponseV0 + * @property {number|Long|null} [identityContractNonce] GetIdentityContractNonceResponseV0 identityContractNonce + * @property {org.dash.platform.dapi.v0.IProof|null} [proof] GetIdentityContractNonceResponseV0 proof + * @property {org.dash.platform.dapi.v0.IResponseMetadata|null} [metadata] GetIdentityContractNonceResponseV0 metadata */ /** - * Constructs a new IdentityValue. - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse - * @classdesc Represents an IdentityValue. - * @implements IIdentityValue + * Constructs a new GetIdentityContractNonceResponseV0. + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse + * @classdesc Represents a GetIdentityContractNonceResponseV0. + * @implements IGetIdentityContractNonceResponseV0 * @constructor - * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IIdentityValue=} [properties] Properties to set + * @param {org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.IGetIdentityContractNonceResponseV0=} [properties] Properties to set */ - function IdentityValue(properties) { + function GetIdentityContractNonceResponseV0(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -5374,75 +5411,115 @@ $root.org = (function() { } /** - * IdentityValue value. - * @member {Uint8Array} value - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue + * GetIdentityContractNonceResponseV0 identityContractNonce. + * @member {number|Long} identityContractNonce + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0 + * @instance + */ + GetIdentityContractNonceResponseV0.prototype.identityContractNonce = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * GetIdentityContractNonceResponseV0 proof. + * @member {org.dash.platform.dapi.v0.IProof|null|undefined} proof + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0 + * @instance + */ + GetIdentityContractNonceResponseV0.prototype.proof = null; + + /** + * GetIdentityContractNonceResponseV0 metadata. + * @member {org.dash.platform.dapi.v0.IResponseMetadata|null|undefined} metadata + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0 + * @instance + */ + GetIdentityContractNonceResponseV0.prototype.metadata = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetIdentityContractNonceResponseV0 result. + * @member {"identityContractNonce"|"proof"|undefined} result + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0 * @instance */ - IdentityValue.prototype.value = $util.newBuffer([]); + Object.defineProperty(GetIdentityContractNonceResponseV0.prototype, "result", { + get: $util.oneOfGetter($oneOfFields = ["identityContractNonce", "proof"]), + set: $util.oneOfSetter($oneOfFields) + }); /** - * Creates a new IdentityValue instance using the specified properties. + * Creates a new GetIdentityContractNonceResponseV0 instance using the specified properties. * @function create - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IIdentityValue=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} IdentityValue instance + * @param {org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.IGetIdentityContractNonceResponseV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} GetIdentityContractNonceResponseV0 instance */ - IdentityValue.create = function create(properties) { - return new IdentityValue(properties); + GetIdentityContractNonceResponseV0.create = function create(properties) { + return new GetIdentityContractNonceResponseV0(properties); }; /** - * Encodes the specified IdentityValue message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.verify|verify} messages. + * Encodes the specified GetIdentityContractNonceResponseV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.verify|verify} messages. * @function encode - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IIdentityValue} message IdentityValue message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.IGetIdentityContractNonceResponseV0} message GetIdentityContractNonceResponseV0 message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - IdentityValue.encode = function encode(message, writer) { + GetIdentityContractNonceResponseV0.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.value != null && Object.hasOwnProperty.call(message, "value")) - writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.value); + if (message.identityContractNonce != null && Object.hasOwnProperty.call(message, "identityContractNonce")) + writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.identityContractNonce); + if (message.proof != null && Object.hasOwnProperty.call(message, "proof")) + $root.org.dash.platform.dapi.v0.Proof.encode(message.proof, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.metadata != null && Object.hasOwnProperty.call(message, "metadata")) + $root.org.dash.platform.dapi.v0.ResponseMetadata.encode(message.metadata, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); return writer; }; /** - * Encodes the specified IdentityValue message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.verify|verify} messages. + * Encodes the specified GetIdentityContractNonceResponseV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.verify|verify} messages. * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IIdentityValue} message IdentityValue message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.IGetIdentityContractNonceResponseV0} message GetIdentityContractNonceResponseV0 message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - IdentityValue.encodeDelimited = function encodeDelimited(message, writer) { + GetIdentityContractNonceResponseV0.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes an IdentityValue message from the specified reader or buffer. + * Decodes a GetIdentityContractNonceResponseV0 message from the specified reader or buffer. * @function decode - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0 * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} IdentityValue + * @returns {org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} GetIdentityContractNonceResponseV0 * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - IdentityValue.decode = function decode(reader, length) { + GetIdentityContractNonceResponseV0.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue(); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { case 1: - message.value = reader.bytes(); + message.identityContractNonce = reader.uint64(); + break; + case 2: + message.proof = $root.org.dash.platform.dapi.v0.Proof.decode(reader, reader.uint32()); + break; + case 3: + message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.decode(reader, reader.uint32()); break; default: reader.skipType(tag & 7); @@ -5453,117 +5530,368 @@ $root.org = (function() { }; /** - * Decodes an IdentityValue message from the specified reader or buffer, length delimited. + * Decodes a GetIdentityContractNonceResponseV0 message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0 * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} IdentityValue + * @returns {org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} GetIdentityContractNonceResponseV0 * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - IdentityValue.decodeDelimited = function decodeDelimited(reader) { + GetIdentityContractNonceResponseV0.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies an IdentityValue message. + * Verifies a GetIdentityContractNonceResponseV0 message. * @function verify - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0 * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - IdentityValue.verify = function verify(message) { + GetIdentityContractNonceResponseV0.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; - if (message.value != null && message.hasOwnProperty("value")) - if (!(message.value && typeof message.value.length === "number" || $util.isString(message.value))) - return "value: buffer expected"; + var properties = {}; + if (message.identityContractNonce != null && message.hasOwnProperty("identityContractNonce")) { + properties.result = 1; + if (!$util.isInteger(message.identityContractNonce) && !(message.identityContractNonce && $util.isInteger(message.identityContractNonce.low) && $util.isInteger(message.identityContractNonce.high))) + return "identityContractNonce: integer|Long expected"; + } + if (message.proof != null && message.hasOwnProperty("proof")) { + if (properties.result === 1) + return "result: multiple values"; + properties.result = 1; + { + var error = $root.org.dash.platform.dapi.v0.Proof.verify(message.proof); + if (error) + return "proof." + error; + } + } + if (message.metadata != null && message.hasOwnProperty("metadata")) { + var error = $root.org.dash.platform.dapi.v0.ResponseMetadata.verify(message.metadata); + if (error) + return "metadata." + error; + } return null; }; /** - * Creates an IdentityValue message from a plain object. Also converts values to their respective internal types. + * Creates a GetIdentityContractNonceResponseV0 message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0 * @static * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} IdentityValue + * @returns {org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} GetIdentityContractNonceResponseV0 */ - IdentityValue.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue) + GetIdentityContractNonceResponseV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0) return object; - var message = new $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue(); - if (object.value != null) - if (typeof object.value === "string") - $util.base64.decode(object.value, message.value = $util.newBuffer($util.base64.length(object.value)), 0); - else if (object.value.length >= 0) - message.value = object.value; + var message = new $root.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0(); + if (object.identityContractNonce != null) + if ($util.Long) + (message.identityContractNonce = $util.Long.fromValue(object.identityContractNonce)).unsigned = true; + else if (typeof object.identityContractNonce === "string") + message.identityContractNonce = parseInt(object.identityContractNonce, 10); + else if (typeof object.identityContractNonce === "number") + message.identityContractNonce = object.identityContractNonce; + else if (typeof object.identityContractNonce === "object") + message.identityContractNonce = new $util.LongBits(object.identityContractNonce.low >>> 0, object.identityContractNonce.high >>> 0).toNumber(true); + if (object.proof != null) { + if (typeof object.proof !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.proof: object expected"); + message.proof = $root.org.dash.platform.dapi.v0.Proof.fromObject(object.proof); + } + if (object.metadata != null) { + if (typeof object.metadata !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.metadata: object expected"); + message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.fromObject(object.metadata); + } return message; }; /** - * Creates a plain object from an IdentityValue message. Also converts values to other types if specified. + * Creates a plain object from a GetIdentityContractNonceResponseV0 message. Also converts values to other types if specified. * @function toObject - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} message IdentityValue + * @param {org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} message GetIdentityContractNonceResponseV0 * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - IdentityValue.toObject = function toObject(message, options) { + GetIdentityContractNonceResponseV0.toObject = function toObject(message, options) { if (!options) options = {}; var object = {}; if (options.defaults) - if (options.bytes === String) - object.value = ""; - else { - object.value = []; - if (options.bytes !== Array) - object.value = $util.newBuffer(object.value); - } - if (message.value != null && message.hasOwnProperty("value")) - object.value = options.bytes === String ? $util.base64.encode(message.value, 0, message.value.length) : options.bytes === Array ? Array.prototype.slice.call(message.value) : message.value; + object.metadata = null; + if (message.identityContractNonce != null && message.hasOwnProperty("identityContractNonce")) { + if (typeof message.identityContractNonce === "number") + object.identityContractNonce = options.longs === String ? String(message.identityContractNonce) : message.identityContractNonce; + else + object.identityContractNonce = options.longs === String ? $util.Long.prototype.toString.call(message.identityContractNonce) : options.longs === Number ? new $util.LongBits(message.identityContractNonce.low >>> 0, message.identityContractNonce.high >>> 0).toNumber(true) : message.identityContractNonce; + if (options.oneofs) + object.result = "identityContractNonce"; + } + if (message.proof != null && message.hasOwnProperty("proof")) { + object.proof = $root.org.dash.platform.dapi.v0.Proof.toObject(message.proof, options); + if (options.oneofs) + object.result = "proof"; + } + if (message.metadata != null && message.hasOwnProperty("metadata")) + object.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.toObject(message.metadata, options); return object; }; /** - * Converts this IdentityValue to JSON. + * Converts this GetIdentityContractNonceResponseV0 to JSON. * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue + * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0 * @instance * @returns {Object.} JSON object */ - IdentityValue.prototype.toJSON = function toJSON() { + GetIdentityContractNonceResponseV0.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - return IdentityValue; + return GetIdentityContractNonceResponseV0; })(); - GetIdentitiesResponse.IdentityEntry = (function() { + return GetIdentityContractNonceResponse; + })(); + + v0.GetIdentityBalanceResponse = (function() { + + /** + * Properties of a GetIdentityBalanceResponse. + * @memberof org.dash.platform.dapi.v0 + * @interface IGetIdentityBalanceResponse + * @property {org.dash.platform.dapi.v0.GetIdentityBalanceResponse.IGetIdentityBalanceResponseV0|null} [v0] GetIdentityBalanceResponse v0 + */ + + /** + * Constructs a new GetIdentityBalanceResponse. + * @memberof org.dash.platform.dapi.v0 + * @classdesc Represents a GetIdentityBalanceResponse. + * @implements IGetIdentityBalanceResponse + * @constructor + * @param {org.dash.platform.dapi.v0.IGetIdentityBalanceResponse=} [properties] Properties to set + */ + function GetIdentityBalanceResponse(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetIdentityBalanceResponse v0. + * @member {org.dash.platform.dapi.v0.GetIdentityBalanceResponse.IGetIdentityBalanceResponseV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse + * @instance + */ + GetIdentityBalanceResponse.prototype.v0 = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetIdentityBalanceResponse version. + * @member {"v0"|undefined} version + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse + * @instance + */ + Object.defineProperty(GetIdentityBalanceResponse.prototype, "version", { + get: $util.oneOfGetter($oneOfFields = ["v0"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetIdentityBalanceResponse instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetIdentityBalanceResponse=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceResponse} GetIdentityBalanceResponse instance + */ + GetIdentityBalanceResponse.create = function create(properties) { + return new GetIdentityBalanceResponse(properties); + }; + + /** + * Encodes the specified GetIdentityBalanceResponse message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityBalanceResponse.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetIdentityBalanceResponse} message GetIdentityBalanceResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentityBalanceResponse.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) + $root.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetIdentityBalanceResponse message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityBalanceResponse.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetIdentityBalanceResponse} message GetIdentityBalanceResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentityBalanceResponse.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetIdentityBalanceResponse message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceResponse} GetIdentityBalanceResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetIdentityBalanceResponse.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityBalanceResponse(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetIdentityBalanceResponse message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceResponse} GetIdentityBalanceResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetIdentityBalanceResponse.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetIdentityBalanceResponse message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetIdentityBalanceResponse.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + properties.version = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.verify(message.v0); + if (error) + return "v0." + error; + } + } + return null; + }; + + /** + * Creates a GetIdentityBalanceResponse message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse + * @static + * @param {Object.} object Plain object + * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceResponse} GetIdentityBalanceResponse + */ + GetIdentityBalanceResponse.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityBalanceResponse) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetIdentityBalanceResponse(); + if (object.v0 != null) { + if (typeof object.v0 !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityBalanceResponse.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.fromObject(object.v0); + } + return message; + }; + + /** + * Creates a plain object from a GetIdentityBalanceResponse message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityBalanceResponse} message GetIdentityBalanceResponse + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + GetIdentityBalanceResponse.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + object.v0 = $root.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.toObject(message.v0, options); + if (options.oneofs) + object.version = "v0"; + } + return object; + }; + + /** + * Converts this GetIdentityBalanceResponse to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse + * @instance + * @returns {Object.} JSON object + */ + GetIdentityBalanceResponse.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + GetIdentityBalanceResponse.GetIdentityBalanceResponseV0 = (function() { /** - * Properties of an IdentityEntry. - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse - * @interface IIdentityEntry - * @property {Uint8Array|null} [key] IdentityEntry key - * @property {org.dash.platform.dapi.v0.GetIdentitiesResponse.IIdentityValue|null} [value] IdentityEntry value + * Properties of a GetIdentityBalanceResponseV0. + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse + * @interface IGetIdentityBalanceResponseV0 + * @property {number|Long|null} [balance] GetIdentityBalanceResponseV0 balance + * @property {org.dash.platform.dapi.v0.IProof|null} [proof] GetIdentityBalanceResponseV0 proof + * @property {org.dash.platform.dapi.v0.IResponseMetadata|null} [metadata] GetIdentityBalanceResponseV0 metadata */ /** - * Constructs a new IdentityEntry. - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse - * @classdesc Represents an IdentityEntry. - * @implements IIdentityEntry + * Constructs a new GetIdentityBalanceResponseV0. + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse + * @classdesc Represents a GetIdentityBalanceResponseV0. + * @implements IGetIdentityBalanceResponseV0 * @constructor - * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IIdentityEntry=} [properties] Properties to set + * @param {org.dash.platform.dapi.v0.GetIdentityBalanceResponse.IGetIdentityBalanceResponseV0=} [properties] Properties to set */ - function IdentityEntry(properties) { + function GetIdentityBalanceResponseV0(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -5571,302 +5899,115 @@ $root.org = (function() { } /** - * IdentityEntry key. - * @member {Uint8Array} key - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry + * GetIdentityBalanceResponseV0 balance. + * @member {number|Long} balance + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0 * @instance */ - IdentityEntry.prototype.key = $util.newBuffer([]); + GetIdentityBalanceResponseV0.prototype.balance = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** - * IdentityEntry value. - * @member {org.dash.platform.dapi.v0.GetIdentitiesResponse.IIdentityValue|null|undefined} value - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry + * GetIdentityBalanceResponseV0 proof. + * @member {org.dash.platform.dapi.v0.IProof|null|undefined} proof + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0 * @instance */ - IdentityEntry.prototype.value = null; - - /** - * Creates a new IdentityEntry instance using the specified properties. - * @function create - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry - * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IIdentityEntry=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} IdentityEntry instance - */ - IdentityEntry.create = function create(properties) { - return new IdentityEntry(properties); - }; - - /** - * Encodes the specified IdentityEntry message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.verify|verify} messages. - * @function encode - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry - * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IIdentityEntry} message IdentityEntry message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - IdentityEntry.encode = function encode(message, writer) { - if (!writer) - writer = $Writer.create(); - if (message.key != null && Object.hasOwnProperty.call(message, "key")) - writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.key); - if (message.value != null && Object.hasOwnProperty.call(message, "value")) - $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.encode(message.value, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); - return writer; - }; - - /** - * Encodes the specified IdentityEntry message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.verify|verify} messages. - * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry - * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IIdentityEntry} message IdentityEntry message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - IdentityEntry.encodeDelimited = function encodeDelimited(message, writer) { - return this.encode(message, writer).ldelim(); - }; - - /** - * Decodes an IdentityEntry message from the specified reader or buffer. - * @function decode - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} IdentityEntry - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - IdentityEntry.decode = function decode(reader, length) { - if (!(reader instanceof $Reader)) - reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry(); - while (reader.pos < end) { - var tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - message.key = reader.bytes(); - break; - case 2: - message.value = $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.decode(reader, reader.uint32()); - break; - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }; - - /** - * Decodes an IdentityEntry message from the specified reader or buffer, length delimited. - * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} IdentityEntry - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - IdentityEntry.decodeDelimited = function decodeDelimited(reader) { - if (!(reader instanceof $Reader)) - reader = new $Reader(reader); - return this.decode(reader, reader.uint32()); - }; - - /** - * Verifies an IdentityEntry message. - * @function verify - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry - * @static - * @param {Object.} message Plain object to verify - * @returns {string|null} `null` if valid, otherwise the reason why it is not - */ - IdentityEntry.verify = function verify(message) { - if (typeof message !== "object" || message === null) - return "object expected"; - if (message.key != null && message.hasOwnProperty("key")) - if (!(message.key && typeof message.key.length === "number" || $util.isString(message.key))) - return "key: buffer expected"; - if (message.value != null && message.hasOwnProperty("value")) { - var error = $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.verify(message.value); - if (error) - return "value." + error; - } - return null; - }; - - /** - * Creates an IdentityEntry message from a plain object. Also converts values to their respective internal types. - * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry - * @static - * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} IdentityEntry - */ - IdentityEntry.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry) - return object; - var message = new $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry(); - if (object.key != null) - if (typeof object.key === "string") - $util.base64.decode(object.key, message.key = $util.newBuffer($util.base64.length(object.key)), 0); - else if (object.key.length >= 0) - message.key = object.key; - if (object.value != null) { - if (typeof object.value !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.value: object expected"); - message.value = $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.fromObject(object.value); - } - return message; - }; - - /** - * Creates a plain object from an IdentityEntry message. Also converts values to other types if specified. - * @function toObject - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry - * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} message IdentityEntry - * @param {$protobuf.IConversionOptions} [options] Conversion options - * @returns {Object.} Plain object - */ - IdentityEntry.toObject = function toObject(message, options) { - if (!options) - options = {}; - var object = {}; - if (options.defaults) { - if (options.bytes === String) - object.key = ""; - else { - object.key = []; - if (options.bytes !== Array) - object.key = $util.newBuffer(object.key); - } - object.value = null; - } - if (message.key != null && message.hasOwnProperty("key")) - object.key = options.bytes === String ? $util.base64.encode(message.key, 0, message.key.length) : options.bytes === Array ? Array.prototype.slice.call(message.key) : message.key; - if (message.value != null && message.hasOwnProperty("value")) - object.value = $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.toObject(message.value, options); - return object; - }; + GetIdentityBalanceResponseV0.prototype.proof = null; /** - * Converts this IdentityEntry to JSON. - * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry + * GetIdentityBalanceResponseV0 metadata. + * @member {org.dash.platform.dapi.v0.IResponseMetadata|null|undefined} metadata + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0 * @instance - * @returns {Object.} JSON object - */ - IdentityEntry.prototype.toJSON = function toJSON() { - return this.constructor.toObject(this, $protobuf.util.toJSONOptions); - }; - - return IdentityEntry; - })(); - - GetIdentitiesResponse.Identities = (function() { - - /** - * Properties of an Identities. - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse - * @interface IIdentities - * @property {Array.|null} [identityEntries] Identities identityEntries */ + GetIdentityBalanceResponseV0.prototype.metadata = null; - /** - * Constructs a new Identities. - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse - * @classdesc Represents an Identities. - * @implements IIdentities - * @constructor - * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IIdentities=} [properties] Properties to set - */ - function Identities(properties) { - this.identityEntries = []; - if (properties) - for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) - if (properties[keys[i]] != null) - this[keys[i]] = properties[keys[i]]; - } + // OneOf field names bound to virtual getters and setters + var $oneOfFields; /** - * Identities identityEntries. - * @member {Array.} identityEntries - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities + * GetIdentityBalanceResponseV0 result. + * @member {"balance"|"proof"|undefined} result + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0 * @instance */ - Identities.prototype.identityEntries = $util.emptyArray; + Object.defineProperty(GetIdentityBalanceResponseV0.prototype, "result", { + get: $util.oneOfGetter($oneOfFields = ["balance", "proof"]), + set: $util.oneOfSetter($oneOfFields) + }); /** - * Creates a new Identities instance using the specified properties. + * Creates a new GetIdentityBalanceResponseV0 instance using the specified properties. * @function create - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IIdentities=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} Identities instance + * @param {org.dash.platform.dapi.v0.GetIdentityBalanceResponse.IGetIdentityBalanceResponseV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} GetIdentityBalanceResponseV0 instance */ - Identities.create = function create(properties) { - return new Identities(properties); + GetIdentityBalanceResponseV0.create = function create(properties) { + return new GetIdentityBalanceResponseV0(properties); }; /** - * Encodes the specified Identities message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.verify|verify} messages. + * Encodes the specified GetIdentityBalanceResponseV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.verify|verify} messages. * @function encode - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IIdentities} message Identities message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetIdentityBalanceResponse.IGetIdentityBalanceResponseV0} message GetIdentityBalanceResponseV0 message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - Identities.encode = function encode(message, writer) { + GetIdentityBalanceResponseV0.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.identityEntries != null && message.identityEntries.length) - for (var i = 0; i < message.identityEntries.length; ++i) - $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.encode(message.identityEntries[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.balance != null && Object.hasOwnProperty.call(message, "balance")) + writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.balance); + if (message.proof != null && Object.hasOwnProperty.call(message, "proof")) + $root.org.dash.platform.dapi.v0.Proof.encode(message.proof, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.metadata != null && Object.hasOwnProperty.call(message, "metadata")) + $root.org.dash.platform.dapi.v0.ResponseMetadata.encode(message.metadata, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); return writer; }; /** - * Encodes the specified Identities message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.verify|verify} messages. + * Encodes the specified GetIdentityBalanceResponseV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.verify|verify} messages. * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IIdentities} message Identities message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetIdentityBalanceResponse.IGetIdentityBalanceResponseV0} message GetIdentityBalanceResponseV0 message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - Identities.encodeDelimited = function encodeDelimited(message, writer) { + GetIdentityBalanceResponseV0.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes an Identities message from the specified reader or buffer. + * Decodes a GetIdentityBalanceResponseV0 message from the specified reader or buffer. * @function decode - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0 * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} Identities + * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} GetIdentityBalanceResponseV0 * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - Identities.decode = function decode(reader, length) { + GetIdentityBalanceResponseV0.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities(); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { case 1: - if (!(message.identityEntries && message.identityEntries.length)) - message.identityEntries = []; - message.identityEntries.push($root.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.decode(reader, reader.uint32())); + message.balance = reader.uint64(); + break; + case 2: + message.proof = $root.org.dash.platform.dapi.v0.Proof.decode(reader, reader.uint32()); + break; + case 3: + message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.decode(reader, reader.uint32()); break; default: reader.skipType(tag & 7); @@ -5877,400 +6018,158 @@ $root.org = (function() { }; /** - * Decodes an Identities message from the specified reader or buffer, length delimited. + * Decodes a GetIdentityBalanceResponseV0 message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0 * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} Identities + * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} GetIdentityBalanceResponseV0 * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - Identities.decodeDelimited = function decodeDelimited(reader) { + GetIdentityBalanceResponseV0.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies an Identities message. + * Verifies a GetIdentityBalanceResponseV0 message. * @function verify - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0 * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - Identities.verify = function verify(message) { + GetIdentityBalanceResponseV0.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; - if (message.identityEntries != null && message.hasOwnProperty("identityEntries")) { - if (!Array.isArray(message.identityEntries)) - return "identityEntries: array expected"; - for (var i = 0; i < message.identityEntries.length; ++i) { - var error = $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.verify(message.identityEntries[i]); + var properties = {}; + if (message.balance != null && message.hasOwnProperty("balance")) { + properties.result = 1; + if (!$util.isInteger(message.balance) && !(message.balance && $util.isInteger(message.balance.low) && $util.isInteger(message.balance.high))) + return "balance: integer|Long expected"; + } + if (message.proof != null && message.hasOwnProperty("proof")) { + if (properties.result === 1) + return "result: multiple values"; + properties.result = 1; + { + var error = $root.org.dash.platform.dapi.v0.Proof.verify(message.proof); if (error) - return "identityEntries." + error; + return "proof." + error; } } + if (message.metadata != null && message.hasOwnProperty("metadata")) { + var error = $root.org.dash.platform.dapi.v0.ResponseMetadata.verify(message.metadata); + if (error) + return "metadata." + error; + } return null; }; /** - * Creates an Identities message from a plain object. Also converts values to their respective internal types. + * Creates a GetIdentityBalanceResponseV0 message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0 * @static * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} Identities + * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} GetIdentityBalanceResponseV0 */ - Identities.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities) + GetIdentityBalanceResponseV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0) return object; - var message = new $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities(); - if (object.identityEntries) { - if (!Array.isArray(object.identityEntries)) - throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.identityEntries: array expected"); - message.identityEntries = []; - for (var i = 0; i < object.identityEntries.length; ++i) { - if (typeof object.identityEntries[i] !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.identityEntries: object expected"); - message.identityEntries[i] = $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.fromObject(object.identityEntries[i]); - } + var message = new $root.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0(); + if (object.balance != null) + if ($util.Long) + (message.balance = $util.Long.fromValue(object.balance)).unsigned = true; + else if (typeof object.balance === "string") + message.balance = parseInt(object.balance, 10); + else if (typeof object.balance === "number") + message.balance = object.balance; + else if (typeof object.balance === "object") + message.balance = new $util.LongBits(object.balance.low >>> 0, object.balance.high >>> 0).toNumber(true); + if (object.proof != null) { + if (typeof object.proof !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.proof: object expected"); + message.proof = $root.org.dash.platform.dapi.v0.Proof.fromObject(object.proof); + } + if (object.metadata != null) { + if (typeof object.metadata !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.metadata: object expected"); + message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.fromObject(object.metadata); } return message; }; /** - * Creates a plain object from an Identities message. Also converts values to other types if specified. + * Creates a plain object from a GetIdentityBalanceResponseV0 message. Also converts values to other types if specified. * @function toObject - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} message Identities + * @param {org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} message GetIdentityBalanceResponseV0 * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - Identities.toObject = function toObject(message, options) { + GetIdentityBalanceResponseV0.toObject = function toObject(message, options) { if (!options) options = {}; var object = {}; - if (options.arrays || options.defaults) - object.identityEntries = []; - if (message.identityEntries && message.identityEntries.length) { - object.identityEntries = []; - for (var j = 0; j < message.identityEntries.length; ++j) - object.identityEntries[j] = $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.toObject(message.identityEntries[j], options); + if (options.defaults) + object.metadata = null; + if (message.balance != null && message.hasOwnProperty("balance")) { + if (typeof message.balance === "number") + object.balance = options.longs === String ? String(message.balance) : message.balance; + else + object.balance = options.longs === String ? $util.Long.prototype.toString.call(message.balance) : options.longs === Number ? new $util.LongBits(message.balance.low >>> 0, message.balance.high >>> 0).toNumber(true) : message.balance; + if (options.oneofs) + object.result = "balance"; } + if (message.proof != null && message.hasOwnProperty("proof")) { + object.proof = $root.org.dash.platform.dapi.v0.Proof.toObject(message.proof, options); + if (options.oneofs) + object.result = "proof"; + } + if (message.metadata != null && message.hasOwnProperty("metadata")) + object.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.toObject(message.metadata, options); return object; }; /** - * Converts this Identities to JSON. + * Converts this GetIdentityBalanceResponseV0 to JSON. * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0 * @instance * @returns {Object.} JSON object */ - Identities.prototype.toJSON = function toJSON() { + GetIdentityBalanceResponseV0.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - return Identities; + return GetIdentityBalanceResponseV0; })(); - GetIdentitiesResponse.GetIdentitiesResponseV0 = (function() { + return GetIdentityBalanceResponse; + })(); - /** - * Properties of a GetIdentitiesResponseV0. - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse - * @interface IGetIdentitiesResponseV0 - * @property {org.dash.platform.dapi.v0.GetIdentitiesResponse.IIdentities|null} [identities] GetIdentitiesResponseV0 identities - * @property {org.dash.platform.dapi.v0.IProof|null} [proof] GetIdentitiesResponseV0 proof - * @property {org.dash.platform.dapi.v0.IResponseMetadata|null} [metadata] GetIdentitiesResponseV0 metadata - */ - - /** - * Constructs a new GetIdentitiesResponseV0. - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse - * @classdesc Represents a GetIdentitiesResponseV0. - * @implements IGetIdentitiesResponseV0 - * @constructor - * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IGetIdentitiesResponseV0=} [properties] Properties to set - */ - function GetIdentitiesResponseV0(properties) { - if (properties) - for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) - if (properties[keys[i]] != null) - this[keys[i]] = properties[keys[i]]; - } - - /** - * GetIdentitiesResponseV0 identities. - * @member {org.dash.platform.dapi.v0.GetIdentitiesResponse.IIdentities|null|undefined} identities - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0 - * @instance - */ - GetIdentitiesResponseV0.prototype.identities = null; - - /** - * GetIdentitiesResponseV0 proof. - * @member {org.dash.platform.dapi.v0.IProof|null|undefined} proof - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0 - * @instance - */ - GetIdentitiesResponseV0.prototype.proof = null; - - /** - * GetIdentitiesResponseV0 metadata. - * @member {org.dash.platform.dapi.v0.IResponseMetadata|null|undefined} metadata - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0 - * @instance - */ - GetIdentitiesResponseV0.prototype.metadata = null; - - // OneOf field names bound to virtual getters and setters - var $oneOfFields; - - /** - * GetIdentitiesResponseV0 result. - * @member {"identities"|"proof"|undefined} result - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0 - * @instance - */ - Object.defineProperty(GetIdentitiesResponseV0.prototype, "result", { - get: $util.oneOfGetter($oneOfFields = ["identities", "proof"]), - set: $util.oneOfSetter($oneOfFields) - }); - - /** - * Creates a new GetIdentitiesResponseV0 instance using the specified properties. - * @function create - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0 - * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IGetIdentitiesResponseV0=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} GetIdentitiesResponseV0 instance - */ - GetIdentitiesResponseV0.create = function create(properties) { - return new GetIdentitiesResponseV0(properties); - }; - - /** - * Encodes the specified GetIdentitiesResponseV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.verify|verify} messages. - * @function encode - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0 - * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IGetIdentitiesResponseV0} message GetIdentitiesResponseV0 message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - GetIdentitiesResponseV0.encode = function encode(message, writer) { - if (!writer) - writer = $Writer.create(); - if (message.identities != null && Object.hasOwnProperty.call(message, "identities")) - $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.encode(message.identities, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); - if (message.proof != null && Object.hasOwnProperty.call(message, "proof")) - $root.org.dash.platform.dapi.v0.Proof.encode(message.proof, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); - if (message.metadata != null && Object.hasOwnProperty.call(message, "metadata")) - $root.org.dash.platform.dapi.v0.ResponseMetadata.encode(message.metadata, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); - return writer; - }; - - /** - * Encodes the specified GetIdentitiesResponseV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.verify|verify} messages. - * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0 - * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.IGetIdentitiesResponseV0} message GetIdentitiesResponseV0 message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - GetIdentitiesResponseV0.encodeDelimited = function encodeDelimited(message, writer) { - return this.encode(message, writer).ldelim(); - }; - - /** - * Decodes a GetIdentitiesResponseV0 message from the specified reader or buffer. - * @function decode - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0 - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} GetIdentitiesResponseV0 - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - GetIdentitiesResponseV0.decode = function decode(reader, length) { - if (!(reader instanceof $Reader)) - reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0(); - while (reader.pos < end) { - var tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - message.identities = $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.decode(reader, reader.uint32()); - break; - case 2: - message.proof = $root.org.dash.platform.dapi.v0.Proof.decode(reader, reader.uint32()); - break; - case 3: - message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.decode(reader, reader.uint32()); - break; - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }; - - /** - * Decodes a GetIdentitiesResponseV0 message from the specified reader or buffer, length delimited. - * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0 - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} GetIdentitiesResponseV0 - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - GetIdentitiesResponseV0.decodeDelimited = function decodeDelimited(reader) { - if (!(reader instanceof $Reader)) - reader = new $Reader(reader); - return this.decode(reader, reader.uint32()); - }; - - /** - * Verifies a GetIdentitiesResponseV0 message. - * @function verify - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0 - * @static - * @param {Object.} message Plain object to verify - * @returns {string|null} `null` if valid, otherwise the reason why it is not - */ - GetIdentitiesResponseV0.verify = function verify(message) { - if (typeof message !== "object" || message === null) - return "object expected"; - var properties = {}; - if (message.identities != null && message.hasOwnProperty("identities")) { - properties.result = 1; - { - var error = $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.verify(message.identities); - if (error) - return "identities." + error; - } - } - if (message.proof != null && message.hasOwnProperty("proof")) { - if (properties.result === 1) - return "result: multiple values"; - properties.result = 1; - { - var error = $root.org.dash.platform.dapi.v0.Proof.verify(message.proof); - if (error) - return "proof." + error; - } - } - if (message.metadata != null && message.hasOwnProperty("metadata")) { - var error = $root.org.dash.platform.dapi.v0.ResponseMetadata.verify(message.metadata); - if (error) - return "metadata." + error; - } - return null; - }; - - /** - * Creates a GetIdentitiesResponseV0 message from a plain object. Also converts values to their respective internal types. - * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0 - * @static - * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} GetIdentitiesResponseV0 - */ - GetIdentitiesResponseV0.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0) - return object; - var message = new $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0(); - if (object.identities != null) { - if (typeof object.identities !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.identities: object expected"); - message.identities = $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.fromObject(object.identities); - } - if (object.proof != null) { - if (typeof object.proof !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.proof: object expected"); - message.proof = $root.org.dash.platform.dapi.v0.Proof.fromObject(object.proof); - } - if (object.metadata != null) { - if (typeof object.metadata !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.metadata: object expected"); - message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.fromObject(object.metadata); - } - return message; - }; - - /** - * Creates a plain object from a GetIdentitiesResponseV0 message. Also converts values to other types if specified. - * @function toObject - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0 - * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} message GetIdentitiesResponseV0 - * @param {$protobuf.IConversionOptions} [options] Conversion options - * @returns {Object.} Plain object - */ - GetIdentitiesResponseV0.toObject = function toObject(message, options) { - if (!options) - options = {}; - var object = {}; - if (options.defaults) - object.metadata = null; - if (message.identities != null && message.hasOwnProperty("identities")) { - object.identities = $root.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.toObject(message.identities, options); - if (options.oneofs) - object.result = "identities"; - } - if (message.proof != null && message.hasOwnProperty("proof")) { - object.proof = $root.org.dash.platform.dapi.v0.Proof.toObject(message.proof, options); - if (options.oneofs) - object.result = "proof"; - } - if (message.metadata != null && message.hasOwnProperty("metadata")) - object.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.toObject(message.metadata, options); - return object; - }; - - /** - * Converts this GetIdentitiesResponseV0 to JSON. - * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0 - * @instance - * @returns {Object.} JSON object - */ - GetIdentitiesResponseV0.prototype.toJSON = function toJSON() { - return this.constructor.toObject(this, $protobuf.util.toJSONOptions); - }; - - return GetIdentitiesResponseV0; - })(); - - return GetIdentitiesResponse; - })(); - - v0.GetIdentityNonceResponse = (function() { + v0.GetIdentityBalanceAndRevisionResponse = (function() { /** - * Properties of a GetIdentityNonceResponse. + * Properties of a GetIdentityBalanceAndRevisionResponse. * @memberof org.dash.platform.dapi.v0 - * @interface IGetIdentityNonceResponse - * @property {org.dash.platform.dapi.v0.GetIdentityNonceResponse.IGetIdentityNonceResponseV0|null} [v0] GetIdentityNonceResponse v0 + * @interface IGetIdentityBalanceAndRevisionResponse + * @property {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.IGetIdentityBalanceAndRevisionResponseV0|null} [v0] GetIdentityBalanceAndRevisionResponse v0 */ /** - * Constructs a new GetIdentityNonceResponse. + * Constructs a new GetIdentityBalanceAndRevisionResponse. * @memberof org.dash.platform.dapi.v0 - * @classdesc Represents a GetIdentityNonceResponse. - * @implements IGetIdentityNonceResponse + * @classdesc Represents a GetIdentityBalanceAndRevisionResponse. + * @implements IGetIdentityBalanceAndRevisionResponse * @constructor - * @param {org.dash.platform.dapi.v0.IGetIdentityNonceResponse=} [properties] Properties to set + * @param {org.dash.platform.dapi.v0.IGetIdentityBalanceAndRevisionResponse=} [properties] Properties to set */ - function GetIdentityNonceResponse(properties) { + function GetIdentityBalanceAndRevisionResponse(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -6278,89 +6177,89 @@ $root.org = (function() { } /** - * GetIdentityNonceResponse v0. - * @member {org.dash.platform.dapi.v0.GetIdentityNonceResponse.IGetIdentityNonceResponseV0|null|undefined} v0 - * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse + * GetIdentityBalanceAndRevisionResponse v0. + * @member {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.IGetIdentityBalanceAndRevisionResponseV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse * @instance */ - GetIdentityNonceResponse.prototype.v0 = null; + GetIdentityBalanceAndRevisionResponse.prototype.v0 = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** - * GetIdentityNonceResponse version. + * GetIdentityBalanceAndRevisionResponse version. * @member {"v0"|undefined} version - * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse * @instance */ - Object.defineProperty(GetIdentityNonceResponse.prototype, "version", { + Object.defineProperty(GetIdentityBalanceAndRevisionResponse.prototype, "version", { get: $util.oneOfGetter($oneOfFields = ["v0"]), set: $util.oneOfSetter($oneOfFields) }); /** - * Creates a new GetIdentityNonceResponse instance using the specified properties. + * Creates a new GetIdentityBalanceAndRevisionResponse instance using the specified properties. * @function create - * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse * @static - * @param {org.dash.platform.dapi.v0.IGetIdentityNonceResponse=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetIdentityNonceResponse} GetIdentityNonceResponse instance + * @param {org.dash.platform.dapi.v0.IGetIdentityBalanceAndRevisionResponse=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} GetIdentityBalanceAndRevisionResponse instance */ - GetIdentityNonceResponse.create = function create(properties) { - return new GetIdentityNonceResponse(properties); + GetIdentityBalanceAndRevisionResponse.create = function create(properties) { + return new GetIdentityBalanceAndRevisionResponse(properties); }; /** - * Encodes the specified GetIdentityNonceResponse message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityNonceResponse.verify|verify} messages. + * Encodes the specified GetIdentityBalanceAndRevisionResponse message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.verify|verify} messages. * @function encode - * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse * @static - * @param {org.dash.platform.dapi.v0.IGetIdentityNonceResponse} message GetIdentityNonceResponse message or plain object to encode + * @param {org.dash.platform.dapi.v0.IGetIdentityBalanceAndRevisionResponse} message GetIdentityBalanceAndRevisionResponse message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetIdentityNonceResponse.encode = function encode(message, writer) { + GetIdentityBalanceAndRevisionResponse.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) - $root.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); return writer; }; /** - * Encodes the specified GetIdentityNonceResponse message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityNonceResponse.verify|verify} messages. + * Encodes the specified GetIdentityBalanceAndRevisionResponse message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.verify|verify} messages. * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse * @static - * @param {org.dash.platform.dapi.v0.IGetIdentityNonceResponse} message GetIdentityNonceResponse message or plain object to encode + * @param {org.dash.platform.dapi.v0.IGetIdentityBalanceAndRevisionResponse} message GetIdentityBalanceAndRevisionResponse message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetIdentityNonceResponse.encodeDelimited = function encodeDelimited(message, writer) { + GetIdentityBalanceAndRevisionResponse.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a GetIdentityNonceResponse message from the specified reader or buffer. + * Decodes a GetIdentityBalanceAndRevisionResponse message from the specified reader or buffer. * @function decode - * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetIdentityNonceResponse} GetIdentityNonceResponse + * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} GetIdentityBalanceAndRevisionResponse * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetIdentityNonceResponse.decode = function decode(reader, length) { + GetIdentityBalanceAndRevisionResponse.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityNonceResponse(); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { case 1: - message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.decode(reader, reader.uint32()); + message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.decode(reader, reader.uint32()); break; default: reader.skipType(tag & 7); @@ -6371,37 +6270,37 @@ $root.org = (function() { }; /** - * Decodes a GetIdentityNonceResponse message from the specified reader or buffer, length delimited. + * Decodes a GetIdentityBalanceAndRevisionResponse message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetIdentityNonceResponse} GetIdentityNonceResponse + * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} GetIdentityBalanceAndRevisionResponse * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetIdentityNonceResponse.decodeDelimited = function decodeDelimited(reader) { + GetIdentityBalanceAndRevisionResponse.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a GetIdentityNonceResponse message. + * Verifies a GetIdentityBalanceAndRevisionResponse message. * @function verify - * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - GetIdentityNonceResponse.verify = function verify(message) { + GetIdentityBalanceAndRevisionResponse.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; var properties = {}; if (message.v0 != null && message.hasOwnProperty("v0")) { properties.version = 1; { - var error = $root.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.verify(message.v0); + var error = $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.verify(message.v0); if (error) return "v0." + error; } @@ -6410,40 +6309,40 @@ $root.org = (function() { }; /** - * Creates a GetIdentityNonceResponse message from a plain object. Also converts values to their respective internal types. + * Creates a GetIdentityBalanceAndRevisionResponse message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse * @static * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetIdentityNonceResponse} GetIdentityNonceResponse + * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} GetIdentityBalanceAndRevisionResponse */ - GetIdentityNonceResponse.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityNonceResponse) + GetIdentityBalanceAndRevisionResponse.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse) return object; - var message = new $root.org.dash.platform.dapi.v0.GetIdentityNonceResponse(); + var message = new $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse(); if (object.v0 != null) { if (typeof object.v0 !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetIdentityNonceResponse.v0: object expected"); - message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.fromObject(object.v0); + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.fromObject(object.v0); } return message; }; /** - * Creates a plain object from a GetIdentityNonceResponse message. Also converts values to other types if specified. + * Creates a plain object from a GetIdentityBalanceAndRevisionResponse message. Also converts values to other types if specified. * @function toObject - * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse * @static - * @param {org.dash.platform.dapi.v0.GetIdentityNonceResponse} message GetIdentityNonceResponse + * @param {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} message GetIdentityBalanceAndRevisionResponse * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - GetIdentityNonceResponse.toObject = function toObject(message, options) { + GetIdentityBalanceAndRevisionResponse.toObject = function toObject(message, options) { if (!options) options = {}; var object = {}; if (message.v0 != null && message.hasOwnProperty("v0")) { - object.v0 = $root.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.toObject(message.v0, options); + object.v0 = $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.toObject(message.v0, options); if (options.oneofs) object.version = "v0"; } @@ -6451,36 +6350,36 @@ $root.org = (function() { }; /** - * Converts this GetIdentityNonceResponse to JSON. + * Converts this GetIdentityBalanceAndRevisionResponse to JSON. * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse * @instance * @returns {Object.} JSON object */ - GetIdentityNonceResponse.prototype.toJSON = function toJSON() { + GetIdentityBalanceAndRevisionResponse.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - GetIdentityNonceResponse.GetIdentityNonceResponseV0 = (function() { + GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0 = (function() { /** - * Properties of a GetIdentityNonceResponseV0. - * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse - * @interface IGetIdentityNonceResponseV0 - * @property {number|Long|null} [identityNonce] GetIdentityNonceResponseV0 identityNonce - * @property {org.dash.platform.dapi.v0.IProof|null} [proof] GetIdentityNonceResponseV0 proof - * @property {org.dash.platform.dapi.v0.IResponseMetadata|null} [metadata] GetIdentityNonceResponseV0 metadata + * Properties of a GetIdentityBalanceAndRevisionResponseV0. + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse + * @interface IGetIdentityBalanceAndRevisionResponseV0 + * @property {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.IBalanceAndRevision|null} [balanceAndRevision] GetIdentityBalanceAndRevisionResponseV0 balanceAndRevision + * @property {org.dash.platform.dapi.v0.IProof|null} [proof] GetIdentityBalanceAndRevisionResponseV0 proof + * @property {org.dash.platform.dapi.v0.IResponseMetadata|null} [metadata] GetIdentityBalanceAndRevisionResponseV0 metadata */ /** - * Constructs a new GetIdentityNonceResponseV0. - * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse - * @classdesc Represents a GetIdentityNonceResponseV0. - * @implements IGetIdentityNonceResponseV0 + * Constructs a new GetIdentityBalanceAndRevisionResponseV0. + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse + * @classdesc Represents a GetIdentityBalanceAndRevisionResponseV0. + * @implements IGetIdentityBalanceAndRevisionResponseV0 * @constructor - * @param {org.dash.platform.dapi.v0.GetIdentityNonceResponse.IGetIdentityNonceResponseV0=} [properties] Properties to set + * @param {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.IGetIdentityBalanceAndRevisionResponseV0=} [properties] Properties to set */ - function GetIdentityNonceResponseV0(properties) { + function GetIdentityBalanceAndRevisionResponseV0(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -6488,69 +6387,69 @@ $root.org = (function() { } /** - * GetIdentityNonceResponseV0 identityNonce. - * @member {number|Long} identityNonce - * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0 + * GetIdentityBalanceAndRevisionResponseV0 balanceAndRevision. + * @member {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.IBalanceAndRevision|null|undefined} balanceAndRevision + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0 * @instance */ - GetIdentityNonceResponseV0.prototype.identityNonce = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + GetIdentityBalanceAndRevisionResponseV0.prototype.balanceAndRevision = null; /** - * GetIdentityNonceResponseV0 proof. + * GetIdentityBalanceAndRevisionResponseV0 proof. * @member {org.dash.platform.dapi.v0.IProof|null|undefined} proof - * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0 * @instance */ - GetIdentityNonceResponseV0.prototype.proof = null; + GetIdentityBalanceAndRevisionResponseV0.prototype.proof = null; /** - * GetIdentityNonceResponseV0 metadata. + * GetIdentityBalanceAndRevisionResponseV0 metadata. * @member {org.dash.platform.dapi.v0.IResponseMetadata|null|undefined} metadata - * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0 * @instance */ - GetIdentityNonceResponseV0.prototype.metadata = null; + GetIdentityBalanceAndRevisionResponseV0.prototype.metadata = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** - * GetIdentityNonceResponseV0 result. - * @member {"identityNonce"|"proof"|undefined} result - * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0 + * GetIdentityBalanceAndRevisionResponseV0 result. + * @member {"balanceAndRevision"|"proof"|undefined} result + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0 * @instance */ - Object.defineProperty(GetIdentityNonceResponseV0.prototype, "result", { - get: $util.oneOfGetter($oneOfFields = ["identityNonce", "proof"]), + Object.defineProperty(GetIdentityBalanceAndRevisionResponseV0.prototype, "result", { + get: $util.oneOfGetter($oneOfFields = ["balanceAndRevision", "proof"]), set: $util.oneOfSetter($oneOfFields) }); /** - * Creates a new GetIdentityNonceResponseV0 instance using the specified properties. + * Creates a new GetIdentityBalanceAndRevisionResponseV0 instance using the specified properties. * @function create - * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentityNonceResponse.IGetIdentityNonceResponseV0=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} GetIdentityNonceResponseV0 instance + * @param {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.IGetIdentityBalanceAndRevisionResponseV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} GetIdentityBalanceAndRevisionResponseV0 instance */ - GetIdentityNonceResponseV0.create = function create(properties) { - return new GetIdentityNonceResponseV0(properties); + GetIdentityBalanceAndRevisionResponseV0.create = function create(properties) { + return new GetIdentityBalanceAndRevisionResponseV0(properties); }; /** - * Encodes the specified GetIdentityNonceResponseV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.verify|verify} messages. + * Encodes the specified GetIdentityBalanceAndRevisionResponseV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.verify|verify} messages. * @function encode - * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentityNonceResponse.IGetIdentityNonceResponseV0} message GetIdentityNonceResponseV0 message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.IGetIdentityBalanceAndRevisionResponseV0} message GetIdentityBalanceAndRevisionResponseV0 message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetIdentityNonceResponseV0.encode = function encode(message, writer) { + GetIdentityBalanceAndRevisionResponseV0.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.identityNonce != null && Object.hasOwnProperty.call(message, "identityNonce")) - writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.identityNonce); + if (message.balanceAndRevision != null && Object.hasOwnProperty.call(message, "balanceAndRevision")) + $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.encode(message.balanceAndRevision, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); if (message.proof != null && Object.hasOwnProperty.call(message, "proof")) $root.org.dash.platform.dapi.v0.Proof.encode(message.proof, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); if (message.metadata != null && Object.hasOwnProperty.call(message, "metadata")) @@ -6559,38 +6458,38 @@ $root.org = (function() { }; /** - * Encodes the specified GetIdentityNonceResponseV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.verify|verify} messages. + * Encodes the specified GetIdentityBalanceAndRevisionResponseV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.verify|verify} messages. * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentityNonceResponse.IGetIdentityNonceResponseV0} message GetIdentityNonceResponseV0 message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.IGetIdentityBalanceAndRevisionResponseV0} message GetIdentityBalanceAndRevisionResponseV0 message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetIdentityNonceResponseV0.encodeDelimited = function encodeDelimited(message, writer) { + GetIdentityBalanceAndRevisionResponseV0.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a GetIdentityNonceResponseV0 message from the specified reader or buffer. + * Decodes a GetIdentityBalanceAndRevisionResponseV0 message from the specified reader or buffer. * @function decode - * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0 * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} GetIdentityNonceResponseV0 + * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} GetIdentityBalanceAndRevisionResponseV0 * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetIdentityNonceResponseV0.decode = function decode(reader, length) { + GetIdentityBalanceAndRevisionResponseV0.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0(); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { case 1: - message.identityNonce = reader.uint64(); + message.balanceAndRevision = $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.decode(reader, reader.uint32()); break; case 2: message.proof = $root.org.dash.platform.dapi.v0.Proof.decode(reader, reader.uint32()); @@ -6607,37 +6506,40 @@ $root.org = (function() { }; /** - * Decodes a GetIdentityNonceResponseV0 message from the specified reader or buffer, length delimited. + * Decodes a GetIdentityBalanceAndRevisionResponseV0 message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0 * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} GetIdentityNonceResponseV0 + * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} GetIdentityBalanceAndRevisionResponseV0 * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetIdentityNonceResponseV0.decodeDelimited = function decodeDelimited(reader) { + GetIdentityBalanceAndRevisionResponseV0.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a GetIdentityNonceResponseV0 message. + * Verifies a GetIdentityBalanceAndRevisionResponseV0 message. * @function verify - * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0 * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - GetIdentityNonceResponseV0.verify = function verify(message) { + GetIdentityBalanceAndRevisionResponseV0.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; var properties = {}; - if (message.identityNonce != null && message.hasOwnProperty("identityNonce")) { + if (message.balanceAndRevision != null && message.hasOwnProperty("balanceAndRevision")) { properties.result = 1; - if (!$util.isInteger(message.identityNonce) && !(message.identityNonce && $util.isInteger(message.identityNonce.low) && $util.isInteger(message.identityNonce.high))) - return "identityNonce: integer|Long expected"; + { + var error = $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.verify(message.balanceAndRevision); + if (error) + return "balanceAndRevision." + error; + } } if (message.proof != null && message.hasOwnProperty("proof")) { if (properties.result === 1) @@ -6658,61 +6560,54 @@ $root.org = (function() { }; /** - * Creates a GetIdentityNonceResponseV0 message from a plain object. Also converts values to their respective internal types. + * Creates a GetIdentityBalanceAndRevisionResponseV0 message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0 * @static * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} GetIdentityNonceResponseV0 + * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} GetIdentityBalanceAndRevisionResponseV0 */ - GetIdentityNonceResponseV0.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0) + GetIdentityBalanceAndRevisionResponseV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0) return object; - var message = new $root.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0(); - if (object.identityNonce != null) - if ($util.Long) - (message.identityNonce = $util.Long.fromValue(object.identityNonce)).unsigned = true; - else if (typeof object.identityNonce === "string") - message.identityNonce = parseInt(object.identityNonce, 10); - else if (typeof object.identityNonce === "number") - message.identityNonce = object.identityNonce; - else if (typeof object.identityNonce === "object") - message.identityNonce = new $util.LongBits(object.identityNonce.low >>> 0, object.identityNonce.high >>> 0).toNumber(true); + var message = new $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0(); + if (object.balanceAndRevision != null) { + if (typeof object.balanceAndRevision !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.balanceAndRevision: object expected"); + message.balanceAndRevision = $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.fromObject(object.balanceAndRevision); + } if (object.proof != null) { if (typeof object.proof !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.proof: object expected"); + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.proof: object expected"); message.proof = $root.org.dash.platform.dapi.v0.Proof.fromObject(object.proof); } if (object.metadata != null) { if (typeof object.metadata !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.metadata: object expected"); + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.metadata: object expected"); message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.fromObject(object.metadata); } return message; }; /** - * Creates a plain object from a GetIdentityNonceResponseV0 message. Also converts values to other types if specified. + * Creates a plain object from a GetIdentityBalanceAndRevisionResponseV0 message. Also converts values to other types if specified. * @function toObject - * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} message GetIdentityNonceResponseV0 + * @param {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} message GetIdentityBalanceAndRevisionResponseV0 * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - GetIdentityNonceResponseV0.toObject = function toObject(message, options) { + GetIdentityBalanceAndRevisionResponseV0.toObject = function toObject(message, options) { if (!options) options = {}; var object = {}; if (options.defaults) object.metadata = null; - if (message.identityNonce != null && message.hasOwnProperty("identityNonce")) { - if (typeof message.identityNonce === "number") - object.identityNonce = options.longs === String ? String(message.identityNonce) : message.identityNonce; - else - object.identityNonce = options.longs === String ? $util.Long.prototype.toString.call(message.identityNonce) : options.longs === Number ? new $util.LongBits(message.identityNonce.low >>> 0, message.identityNonce.high >>> 0).toNumber(true) : message.identityNonce; + if (message.balanceAndRevision != null && message.hasOwnProperty("balanceAndRevision")) { + object.balanceAndRevision = $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.toObject(message.balanceAndRevision, options); if (options.oneofs) - object.result = "identityNonce"; + object.result = "balanceAndRevision"; } if (message.proof != null && message.hasOwnProperty("proof")) { object.proof = $root.org.dash.platform.dapi.v0.Proof.toObject(message.proof, options); @@ -6725,40 +6620,280 @@ $root.org = (function() { }; /** - * Converts this GetIdentityNonceResponseV0 to JSON. + * Converts this GetIdentityBalanceAndRevisionResponseV0 to JSON. * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0 * @instance * @returns {Object.} JSON object */ - GetIdentityNonceResponseV0.prototype.toJSON = function toJSON() { + GetIdentityBalanceAndRevisionResponseV0.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - return GetIdentityNonceResponseV0; - })(); + GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision = (function() { - return GetIdentityNonceResponse; - })(); + /** + * Properties of a BalanceAndRevision. + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0 + * @interface IBalanceAndRevision + * @property {number|Long|null} [balance] BalanceAndRevision balance + * @property {number|Long|null} [revision] BalanceAndRevision revision + */ - v0.GetIdentityContractNonceResponse = (function() { + /** + * Constructs a new BalanceAndRevision. + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0 + * @classdesc Represents a BalanceAndRevision. + * @implements IBalanceAndRevision + * @constructor + * @param {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.IBalanceAndRevision=} [properties] Properties to set + */ + function BalanceAndRevision(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } - /** - * Properties of a GetIdentityContractNonceResponse. - * @memberof org.dash.platform.dapi.v0 - * @interface IGetIdentityContractNonceResponse - * @property {org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.IGetIdentityContractNonceResponseV0|null} [v0] GetIdentityContractNonceResponse v0 + /** + * BalanceAndRevision balance. + * @member {number|Long} balance + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision + * @instance + */ + BalanceAndRevision.prototype.balance = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * BalanceAndRevision revision. + * @member {number|Long} revision + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision + * @instance + */ + BalanceAndRevision.prototype.revision = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * Creates a new BalanceAndRevision instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.IBalanceAndRevision=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} BalanceAndRevision instance + */ + BalanceAndRevision.create = function create(properties) { + return new BalanceAndRevision(properties); + }; + + /** + * Encodes the specified BalanceAndRevision message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.IBalanceAndRevision} message BalanceAndRevision message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + BalanceAndRevision.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.balance != null && Object.hasOwnProperty.call(message, "balance")) + writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.balance); + if (message.revision != null && Object.hasOwnProperty.call(message, "revision")) + writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.revision); + return writer; + }; + + /** + * Encodes the specified BalanceAndRevision message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.IBalanceAndRevision} message BalanceAndRevision message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + BalanceAndRevision.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a BalanceAndRevision message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} BalanceAndRevision + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + BalanceAndRevision.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.balance = reader.uint64(); + break; + case 2: + message.revision = reader.uint64(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a BalanceAndRevision message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} BalanceAndRevision + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + BalanceAndRevision.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a BalanceAndRevision message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + BalanceAndRevision.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.balance != null && message.hasOwnProperty("balance")) + if (!$util.isInteger(message.balance) && !(message.balance && $util.isInteger(message.balance.low) && $util.isInteger(message.balance.high))) + return "balance: integer|Long expected"; + if (message.revision != null && message.hasOwnProperty("revision")) + if (!$util.isInteger(message.revision) && !(message.revision && $util.isInteger(message.revision.low) && $util.isInteger(message.revision.high))) + return "revision: integer|Long expected"; + return null; + }; + + /** + * Creates a BalanceAndRevision message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision + * @static + * @param {Object.} object Plain object + * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} BalanceAndRevision + */ + BalanceAndRevision.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision(); + if (object.balance != null) + if ($util.Long) + (message.balance = $util.Long.fromValue(object.balance)).unsigned = true; + else if (typeof object.balance === "string") + message.balance = parseInt(object.balance, 10); + else if (typeof object.balance === "number") + message.balance = object.balance; + else if (typeof object.balance === "object") + message.balance = new $util.LongBits(object.balance.low >>> 0, object.balance.high >>> 0).toNumber(true); + if (object.revision != null) + if ($util.Long) + (message.revision = $util.Long.fromValue(object.revision)).unsigned = true; + else if (typeof object.revision === "string") + message.revision = parseInt(object.revision, 10); + else if (typeof object.revision === "number") + message.revision = object.revision; + else if (typeof object.revision === "object") + message.revision = new $util.LongBits(object.revision.low >>> 0, object.revision.high >>> 0).toNumber(true); + return message; + }; + + /** + * Creates a plain object from a BalanceAndRevision message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} message BalanceAndRevision + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + BalanceAndRevision.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.balance = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.balance = options.longs === String ? "0" : 0; + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.revision = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.revision = options.longs === String ? "0" : 0; + } + if (message.balance != null && message.hasOwnProperty("balance")) + if (typeof message.balance === "number") + object.balance = options.longs === String ? String(message.balance) : message.balance; + else + object.balance = options.longs === String ? $util.Long.prototype.toString.call(message.balance) : options.longs === Number ? new $util.LongBits(message.balance.low >>> 0, message.balance.high >>> 0).toNumber(true) : message.balance; + if (message.revision != null && message.hasOwnProperty("revision")) + if (typeof message.revision === "number") + object.revision = options.longs === String ? String(message.revision) : message.revision; + else + object.revision = options.longs === String ? $util.Long.prototype.toString.call(message.revision) : options.longs === Number ? new $util.LongBits(message.revision.low >>> 0, message.revision.high >>> 0).toNumber(true) : message.revision; + return object; + }; + + /** + * Converts this BalanceAndRevision to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision + * @instance + * @returns {Object.} JSON object + */ + BalanceAndRevision.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return BalanceAndRevision; + })(); + + return GetIdentityBalanceAndRevisionResponseV0; + })(); + + return GetIdentityBalanceAndRevisionResponse; + })(); + + v0.KeyRequestType = (function() { + + /** + * Properties of a KeyRequestType. + * @memberof org.dash.platform.dapi.v0 + * @interface IKeyRequestType + * @property {org.dash.platform.dapi.v0.IAllKeys|null} [allKeys] KeyRequestType allKeys + * @property {org.dash.platform.dapi.v0.ISpecificKeys|null} [specificKeys] KeyRequestType specificKeys + * @property {org.dash.platform.dapi.v0.ISearchKey|null} [searchKey] KeyRequestType searchKey */ /** - * Constructs a new GetIdentityContractNonceResponse. + * Constructs a new KeyRequestType. * @memberof org.dash.platform.dapi.v0 - * @classdesc Represents a GetIdentityContractNonceResponse. - * @implements IGetIdentityContractNonceResponse + * @classdesc Represents a KeyRequestType. + * @implements IKeyRequestType * @constructor - * @param {org.dash.platform.dapi.v0.IGetIdentityContractNonceResponse=} [properties] Properties to set + * @param {org.dash.platform.dapi.v0.IKeyRequestType=} [properties] Properties to set */ - function GetIdentityContractNonceResponse(properties) { + function KeyRequestType(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -6766,89 +6901,115 @@ $root.org = (function() { } /** - * GetIdentityContractNonceResponse v0. - * @member {org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.IGetIdentityContractNonceResponseV0|null|undefined} v0 - * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse + * KeyRequestType allKeys. + * @member {org.dash.platform.dapi.v0.IAllKeys|null|undefined} allKeys + * @memberof org.dash.platform.dapi.v0.KeyRequestType * @instance */ - GetIdentityContractNonceResponse.prototype.v0 = null; - - // OneOf field names bound to virtual getters and setters - var $oneOfFields; + KeyRequestType.prototype.allKeys = null; /** - * GetIdentityContractNonceResponse version. - * @member {"v0"|undefined} version - * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse + * KeyRequestType specificKeys. + * @member {org.dash.platform.dapi.v0.ISpecificKeys|null|undefined} specificKeys + * @memberof org.dash.platform.dapi.v0.KeyRequestType * @instance */ - Object.defineProperty(GetIdentityContractNonceResponse.prototype, "version", { - get: $util.oneOfGetter($oneOfFields = ["v0"]), + KeyRequestType.prototype.specificKeys = null; + + /** + * KeyRequestType searchKey. + * @member {org.dash.platform.dapi.v0.ISearchKey|null|undefined} searchKey + * @memberof org.dash.platform.dapi.v0.KeyRequestType + * @instance + */ + KeyRequestType.prototype.searchKey = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * KeyRequestType request. + * @member {"allKeys"|"specificKeys"|"searchKey"|undefined} request + * @memberof org.dash.platform.dapi.v0.KeyRequestType + * @instance + */ + Object.defineProperty(KeyRequestType.prototype, "request", { + get: $util.oneOfGetter($oneOfFields = ["allKeys", "specificKeys", "searchKey"]), set: $util.oneOfSetter($oneOfFields) }); /** - * Creates a new GetIdentityContractNonceResponse instance using the specified properties. + * Creates a new KeyRequestType instance using the specified properties. * @function create - * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse + * @memberof org.dash.platform.dapi.v0.KeyRequestType * @static - * @param {org.dash.platform.dapi.v0.IGetIdentityContractNonceResponse=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} GetIdentityContractNonceResponse instance + * @param {org.dash.platform.dapi.v0.IKeyRequestType=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.KeyRequestType} KeyRequestType instance */ - GetIdentityContractNonceResponse.create = function create(properties) { - return new GetIdentityContractNonceResponse(properties); + KeyRequestType.create = function create(properties) { + return new KeyRequestType(properties); }; /** - * Encodes the specified GetIdentityContractNonceResponse message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.verify|verify} messages. + * Encodes the specified KeyRequestType message. Does not implicitly {@link org.dash.platform.dapi.v0.KeyRequestType.verify|verify} messages. * @function encode - * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse + * @memberof org.dash.platform.dapi.v0.KeyRequestType * @static - * @param {org.dash.platform.dapi.v0.IGetIdentityContractNonceResponse} message GetIdentityContractNonceResponse message or plain object to encode + * @param {org.dash.platform.dapi.v0.IKeyRequestType} message KeyRequestType message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetIdentityContractNonceResponse.encode = function encode(message, writer) { + KeyRequestType.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) - $root.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.allKeys != null && Object.hasOwnProperty.call(message, "allKeys")) + $root.org.dash.platform.dapi.v0.AllKeys.encode(message.allKeys, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.specificKeys != null && Object.hasOwnProperty.call(message, "specificKeys")) + $root.org.dash.platform.dapi.v0.SpecificKeys.encode(message.specificKeys, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.searchKey != null && Object.hasOwnProperty.call(message, "searchKey")) + $root.org.dash.platform.dapi.v0.SearchKey.encode(message.searchKey, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); return writer; }; /** - * Encodes the specified GetIdentityContractNonceResponse message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.verify|verify} messages. + * Encodes the specified KeyRequestType message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.KeyRequestType.verify|verify} messages. * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse + * @memberof org.dash.platform.dapi.v0.KeyRequestType * @static - * @param {org.dash.platform.dapi.v0.IGetIdentityContractNonceResponse} message GetIdentityContractNonceResponse message or plain object to encode + * @param {org.dash.platform.dapi.v0.IKeyRequestType} message KeyRequestType message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetIdentityContractNonceResponse.encodeDelimited = function encodeDelimited(message, writer) { + KeyRequestType.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a GetIdentityContractNonceResponse message from the specified reader or buffer. + * Decodes a KeyRequestType message from the specified reader or buffer. * @function decode - * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse + * @memberof org.dash.platform.dapi.v0.KeyRequestType * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} GetIdentityContractNonceResponse + * @returns {org.dash.platform.dapi.v0.KeyRequestType} KeyRequestType * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetIdentityContractNonceResponse.decode = function decode(reader, length) { + KeyRequestType.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse(); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.KeyRequestType(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { case 1: - message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.decode(reader, reader.uint32()); + message.allKeys = $root.org.dash.platform.dapi.v0.AllKeys.decode(reader, reader.uint32()); + break; + case 2: + message.specificKeys = $root.org.dash.platform.dapi.v0.SpecificKeys.decode(reader, reader.uint32()); + break; + case 3: + message.searchKey = $root.org.dash.platform.dapi.v0.SearchKey.decode(reader, reader.uint32()); break; default: reader.skipType(tag & 7); @@ -6859,394 +7020,318 @@ $root.org = (function() { }; /** - * Decodes a GetIdentityContractNonceResponse message from the specified reader or buffer, length delimited. + * Decodes a KeyRequestType message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse + * @memberof org.dash.platform.dapi.v0.KeyRequestType * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} GetIdentityContractNonceResponse + * @returns {org.dash.platform.dapi.v0.KeyRequestType} KeyRequestType * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetIdentityContractNonceResponse.decodeDelimited = function decodeDelimited(reader) { + KeyRequestType.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a GetIdentityContractNonceResponse message. + * Verifies a KeyRequestType message. * @function verify - * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse + * @memberof org.dash.platform.dapi.v0.KeyRequestType * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - GetIdentityContractNonceResponse.verify = function verify(message) { + KeyRequestType.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; var properties = {}; - if (message.v0 != null && message.hasOwnProperty("v0")) { - properties.version = 1; + if (message.allKeys != null && message.hasOwnProperty("allKeys")) { + properties.request = 1; { - var error = $root.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.verify(message.v0); + var error = $root.org.dash.platform.dapi.v0.AllKeys.verify(message.allKeys); if (error) - return "v0." + error; + return "allKeys." + error; + } + } + if (message.specificKeys != null && message.hasOwnProperty("specificKeys")) { + if (properties.request === 1) + return "request: multiple values"; + properties.request = 1; + { + var error = $root.org.dash.platform.dapi.v0.SpecificKeys.verify(message.specificKeys); + if (error) + return "specificKeys." + error; + } + } + if (message.searchKey != null && message.hasOwnProperty("searchKey")) { + if (properties.request === 1) + return "request: multiple values"; + properties.request = 1; + { + var error = $root.org.dash.platform.dapi.v0.SearchKey.verify(message.searchKey); + if (error) + return "searchKey." + error; } } return null; }; /** - * Creates a GetIdentityContractNonceResponse message from a plain object. Also converts values to their respective internal types. + * Creates a KeyRequestType message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse + * @memberof org.dash.platform.dapi.v0.KeyRequestType * @static * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} GetIdentityContractNonceResponse + * @returns {org.dash.platform.dapi.v0.KeyRequestType} KeyRequestType */ - GetIdentityContractNonceResponse.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse) + KeyRequestType.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.KeyRequestType) return object; - var message = new $root.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse(); - if (object.v0 != null) { - if (typeof object.v0 !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.v0: object expected"); - message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.fromObject(object.v0); + var message = new $root.org.dash.platform.dapi.v0.KeyRequestType(); + if (object.allKeys != null) { + if (typeof object.allKeys !== "object") + throw TypeError(".org.dash.platform.dapi.v0.KeyRequestType.allKeys: object expected"); + message.allKeys = $root.org.dash.platform.dapi.v0.AllKeys.fromObject(object.allKeys); + } + if (object.specificKeys != null) { + if (typeof object.specificKeys !== "object") + throw TypeError(".org.dash.platform.dapi.v0.KeyRequestType.specificKeys: object expected"); + message.specificKeys = $root.org.dash.platform.dapi.v0.SpecificKeys.fromObject(object.specificKeys); + } + if (object.searchKey != null) { + if (typeof object.searchKey !== "object") + throw TypeError(".org.dash.platform.dapi.v0.KeyRequestType.searchKey: object expected"); + message.searchKey = $root.org.dash.platform.dapi.v0.SearchKey.fromObject(object.searchKey); } return message; }; /** - * Creates a plain object from a GetIdentityContractNonceResponse message. Also converts values to other types if specified. + * Creates a plain object from a KeyRequestType message. Also converts values to other types if specified. * @function toObject - * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse + * @memberof org.dash.platform.dapi.v0.KeyRequestType * @static - * @param {org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} message GetIdentityContractNonceResponse + * @param {org.dash.platform.dapi.v0.KeyRequestType} message KeyRequestType * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - GetIdentityContractNonceResponse.toObject = function toObject(message, options) { + KeyRequestType.toObject = function toObject(message, options) { if (!options) options = {}; var object = {}; - if (message.v0 != null && message.hasOwnProperty("v0")) { - object.v0 = $root.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.toObject(message.v0, options); + if (message.allKeys != null && message.hasOwnProperty("allKeys")) { + object.allKeys = $root.org.dash.platform.dapi.v0.AllKeys.toObject(message.allKeys, options); if (options.oneofs) - object.version = "v0"; + object.request = "allKeys"; + } + if (message.specificKeys != null && message.hasOwnProperty("specificKeys")) { + object.specificKeys = $root.org.dash.platform.dapi.v0.SpecificKeys.toObject(message.specificKeys, options); + if (options.oneofs) + object.request = "specificKeys"; + } + if (message.searchKey != null && message.hasOwnProperty("searchKey")) { + object.searchKey = $root.org.dash.platform.dapi.v0.SearchKey.toObject(message.searchKey, options); + if (options.oneofs) + object.request = "searchKey"; } return object; }; /** - * Converts this GetIdentityContractNonceResponse to JSON. + * Converts this KeyRequestType to JSON. * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse + * @memberof org.dash.platform.dapi.v0.KeyRequestType * @instance * @returns {Object.} JSON object */ - GetIdentityContractNonceResponse.prototype.toJSON = function toJSON() { + KeyRequestType.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0 = (function() { + return KeyRequestType; + })(); - /** - * Properties of a GetIdentityContractNonceResponseV0. - * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse - * @interface IGetIdentityContractNonceResponseV0 - * @property {number|Long|null} [identityContractNonce] GetIdentityContractNonceResponseV0 identityContractNonce - * @property {org.dash.platform.dapi.v0.IProof|null} [proof] GetIdentityContractNonceResponseV0 proof - * @property {org.dash.platform.dapi.v0.IResponseMetadata|null} [metadata] GetIdentityContractNonceResponseV0 metadata - */ + v0.AllKeys = (function() { - /** - * Constructs a new GetIdentityContractNonceResponseV0. - * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse - * @classdesc Represents a GetIdentityContractNonceResponseV0. - * @implements IGetIdentityContractNonceResponseV0 - * @constructor - * @param {org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.IGetIdentityContractNonceResponseV0=} [properties] Properties to set - */ - function GetIdentityContractNonceResponseV0(properties) { - if (properties) - for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) - if (properties[keys[i]] != null) - this[keys[i]] = properties[keys[i]]; - } + /** + * Properties of an AllKeys. + * @memberof org.dash.platform.dapi.v0 + * @interface IAllKeys + */ - /** - * GetIdentityContractNonceResponseV0 identityContractNonce. - * @member {number|Long} identityContractNonce - * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0 - * @instance - */ - GetIdentityContractNonceResponseV0.prototype.identityContractNonce = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + /** + * Constructs a new AllKeys. + * @memberof org.dash.platform.dapi.v0 + * @classdesc Represents an AllKeys. + * @implements IAllKeys + * @constructor + * @param {org.dash.platform.dapi.v0.IAllKeys=} [properties] Properties to set + */ + function AllKeys(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } - /** - * GetIdentityContractNonceResponseV0 proof. - * @member {org.dash.platform.dapi.v0.IProof|null|undefined} proof - * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0 - * @instance - */ - GetIdentityContractNonceResponseV0.prototype.proof = null; + /** + * Creates a new AllKeys instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.AllKeys + * @static + * @param {org.dash.platform.dapi.v0.IAllKeys=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.AllKeys} AllKeys instance + */ + AllKeys.create = function create(properties) { + return new AllKeys(properties); + }; - /** - * GetIdentityContractNonceResponseV0 metadata. - * @member {org.dash.platform.dapi.v0.IResponseMetadata|null|undefined} metadata - * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0 - * @instance - */ - GetIdentityContractNonceResponseV0.prototype.metadata = null; + /** + * Encodes the specified AllKeys message. Does not implicitly {@link org.dash.platform.dapi.v0.AllKeys.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.AllKeys + * @static + * @param {org.dash.platform.dapi.v0.IAllKeys} message AllKeys message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + AllKeys.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + return writer; + }; - // OneOf field names bound to virtual getters and setters - var $oneOfFields; + /** + * Encodes the specified AllKeys message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.AllKeys.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.AllKeys + * @static + * @param {org.dash.platform.dapi.v0.IAllKeys} message AllKeys message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + AllKeys.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; - /** - * GetIdentityContractNonceResponseV0 result. - * @member {"identityContractNonce"|"proof"|undefined} result - * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0 - * @instance - */ - Object.defineProperty(GetIdentityContractNonceResponseV0.prototype, "result", { - get: $util.oneOfGetter($oneOfFields = ["identityContractNonce", "proof"]), - set: $util.oneOfSetter($oneOfFields) - }); + /** + * Decodes an AllKeys message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.AllKeys + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.AllKeys} AllKeys + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + AllKeys.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.AllKeys(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; - /** - * Creates a new GetIdentityContractNonceResponseV0 instance using the specified properties. - * @function create - * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0 - * @static - * @param {org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.IGetIdentityContractNonceResponseV0=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} GetIdentityContractNonceResponseV0 instance - */ - GetIdentityContractNonceResponseV0.create = function create(properties) { - return new GetIdentityContractNonceResponseV0(properties); - }; + /** + * Decodes an AllKeys message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.AllKeys + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.AllKeys} AllKeys + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + AllKeys.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; - /** - * Encodes the specified GetIdentityContractNonceResponseV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.verify|verify} messages. - * @function encode - * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0 - * @static - * @param {org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.IGetIdentityContractNonceResponseV0} message GetIdentityContractNonceResponseV0 message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - GetIdentityContractNonceResponseV0.encode = function encode(message, writer) { - if (!writer) - writer = $Writer.create(); - if (message.identityContractNonce != null && Object.hasOwnProperty.call(message, "identityContractNonce")) - writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.identityContractNonce); - if (message.proof != null && Object.hasOwnProperty.call(message, "proof")) - $root.org.dash.platform.dapi.v0.Proof.encode(message.proof, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); - if (message.metadata != null && Object.hasOwnProperty.call(message, "metadata")) - $root.org.dash.platform.dapi.v0.ResponseMetadata.encode(message.metadata, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); - return writer; - }; + /** + * Verifies an AllKeys message. + * @function verify + * @memberof org.dash.platform.dapi.v0.AllKeys + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + AllKeys.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + return null; + }; - /** - * Encodes the specified GetIdentityContractNonceResponseV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.verify|verify} messages. - * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0 - * @static - * @param {org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.IGetIdentityContractNonceResponseV0} message GetIdentityContractNonceResponseV0 message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - GetIdentityContractNonceResponseV0.encodeDelimited = function encodeDelimited(message, writer) { - return this.encode(message, writer).ldelim(); - }; + /** + * Creates an AllKeys message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.AllKeys + * @static + * @param {Object.} object Plain object + * @returns {org.dash.platform.dapi.v0.AllKeys} AllKeys + */ + AllKeys.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.AllKeys) + return object; + return new $root.org.dash.platform.dapi.v0.AllKeys(); + }; - /** - * Decodes a GetIdentityContractNonceResponseV0 message from the specified reader or buffer. - * @function decode - * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0 - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} GetIdentityContractNonceResponseV0 - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - GetIdentityContractNonceResponseV0.decode = function decode(reader, length) { - if (!(reader instanceof $Reader)) - reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0(); - while (reader.pos < end) { - var tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - message.identityContractNonce = reader.uint64(); - break; - case 2: - message.proof = $root.org.dash.platform.dapi.v0.Proof.decode(reader, reader.uint32()); - break; - case 3: - message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.decode(reader, reader.uint32()); - break; - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }; + /** + * Creates a plain object from an AllKeys message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.AllKeys + * @static + * @param {org.dash.platform.dapi.v0.AllKeys} message AllKeys + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + AllKeys.toObject = function toObject() { + return {}; + }; - /** - * Decodes a GetIdentityContractNonceResponseV0 message from the specified reader or buffer, length delimited. - * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0 - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} GetIdentityContractNonceResponseV0 - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - GetIdentityContractNonceResponseV0.decodeDelimited = function decodeDelimited(reader) { - if (!(reader instanceof $Reader)) - reader = new $Reader(reader); - return this.decode(reader, reader.uint32()); - }; + /** + * Converts this AllKeys to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.AllKeys + * @instance + * @returns {Object.} JSON object + */ + AllKeys.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; - /** - * Verifies a GetIdentityContractNonceResponseV0 message. - * @function verify - * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0 - * @static - * @param {Object.} message Plain object to verify - * @returns {string|null} `null` if valid, otherwise the reason why it is not - */ - GetIdentityContractNonceResponseV0.verify = function verify(message) { - if (typeof message !== "object" || message === null) - return "object expected"; - var properties = {}; - if (message.identityContractNonce != null && message.hasOwnProperty("identityContractNonce")) { - properties.result = 1; - if (!$util.isInteger(message.identityContractNonce) && !(message.identityContractNonce && $util.isInteger(message.identityContractNonce.low) && $util.isInteger(message.identityContractNonce.high))) - return "identityContractNonce: integer|Long expected"; - } - if (message.proof != null && message.hasOwnProperty("proof")) { - if (properties.result === 1) - return "result: multiple values"; - properties.result = 1; - { - var error = $root.org.dash.platform.dapi.v0.Proof.verify(message.proof); - if (error) - return "proof." + error; - } - } - if (message.metadata != null && message.hasOwnProperty("metadata")) { - var error = $root.org.dash.platform.dapi.v0.ResponseMetadata.verify(message.metadata); - if (error) - return "metadata." + error; - } - return null; - }; + return AllKeys; + })(); - /** - * Creates a GetIdentityContractNonceResponseV0 message from a plain object. Also converts values to their respective internal types. - * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0 - * @static - * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} GetIdentityContractNonceResponseV0 - */ - GetIdentityContractNonceResponseV0.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0) - return object; - var message = new $root.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0(); - if (object.identityContractNonce != null) - if ($util.Long) - (message.identityContractNonce = $util.Long.fromValue(object.identityContractNonce)).unsigned = true; - else if (typeof object.identityContractNonce === "string") - message.identityContractNonce = parseInt(object.identityContractNonce, 10); - else if (typeof object.identityContractNonce === "number") - message.identityContractNonce = object.identityContractNonce; - else if (typeof object.identityContractNonce === "object") - message.identityContractNonce = new $util.LongBits(object.identityContractNonce.low >>> 0, object.identityContractNonce.high >>> 0).toNumber(true); - if (object.proof != null) { - if (typeof object.proof !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.proof: object expected"); - message.proof = $root.org.dash.platform.dapi.v0.Proof.fromObject(object.proof); - } - if (object.metadata != null) { - if (typeof object.metadata !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.metadata: object expected"); - message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.fromObject(object.metadata); - } - return message; - }; - - /** - * Creates a plain object from a GetIdentityContractNonceResponseV0 message. Also converts values to other types if specified. - * @function toObject - * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0 - * @static - * @param {org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} message GetIdentityContractNonceResponseV0 - * @param {$protobuf.IConversionOptions} [options] Conversion options - * @returns {Object.} Plain object - */ - GetIdentityContractNonceResponseV0.toObject = function toObject(message, options) { - if (!options) - options = {}; - var object = {}; - if (options.defaults) - object.metadata = null; - if (message.identityContractNonce != null && message.hasOwnProperty("identityContractNonce")) { - if (typeof message.identityContractNonce === "number") - object.identityContractNonce = options.longs === String ? String(message.identityContractNonce) : message.identityContractNonce; - else - object.identityContractNonce = options.longs === String ? $util.Long.prototype.toString.call(message.identityContractNonce) : options.longs === Number ? new $util.LongBits(message.identityContractNonce.low >>> 0, message.identityContractNonce.high >>> 0).toNumber(true) : message.identityContractNonce; - if (options.oneofs) - object.result = "identityContractNonce"; - } - if (message.proof != null && message.hasOwnProperty("proof")) { - object.proof = $root.org.dash.platform.dapi.v0.Proof.toObject(message.proof, options); - if (options.oneofs) - object.result = "proof"; - } - if (message.metadata != null && message.hasOwnProperty("metadata")) - object.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.toObject(message.metadata, options); - return object; - }; - - /** - * Converts this GetIdentityContractNonceResponseV0 to JSON. - * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0 - * @instance - * @returns {Object.} JSON object - */ - GetIdentityContractNonceResponseV0.prototype.toJSON = function toJSON() { - return this.constructor.toObject(this, $protobuf.util.toJSONOptions); - }; - - return GetIdentityContractNonceResponseV0; - })(); - - return GetIdentityContractNonceResponse; - })(); - - v0.GetIdentityBalanceResponse = (function() { + v0.SpecificKeys = (function() { /** - * Properties of a GetIdentityBalanceResponse. + * Properties of a SpecificKeys. * @memberof org.dash.platform.dapi.v0 - * @interface IGetIdentityBalanceResponse - * @property {org.dash.platform.dapi.v0.GetIdentityBalanceResponse.IGetIdentityBalanceResponseV0|null} [v0] GetIdentityBalanceResponse v0 + * @interface ISpecificKeys + * @property {Array.|null} [keyIds] SpecificKeys keyIds */ /** - * Constructs a new GetIdentityBalanceResponse. + * Constructs a new SpecificKeys. * @memberof org.dash.platform.dapi.v0 - * @classdesc Represents a GetIdentityBalanceResponse. - * @implements IGetIdentityBalanceResponse + * @classdesc Represents a SpecificKeys. + * @implements ISpecificKeys * @constructor - * @param {org.dash.platform.dapi.v0.IGetIdentityBalanceResponse=} [properties] Properties to set + * @param {org.dash.platform.dapi.v0.ISpecificKeys=} [properties] Properties to set */ - function GetIdentityBalanceResponse(properties) { + function SpecificKeys(properties) { + this.keyIds = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -7254,89 +7339,86 @@ $root.org = (function() { } /** - * GetIdentityBalanceResponse v0. - * @member {org.dash.platform.dapi.v0.GetIdentityBalanceResponse.IGetIdentityBalanceResponseV0|null|undefined} v0 - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse - * @instance - */ - GetIdentityBalanceResponse.prototype.v0 = null; - - // OneOf field names bound to virtual getters and setters - var $oneOfFields; - - /** - * GetIdentityBalanceResponse version. - * @member {"v0"|undefined} version - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse + * SpecificKeys keyIds. + * @member {Array.} keyIds + * @memberof org.dash.platform.dapi.v0.SpecificKeys * @instance */ - Object.defineProperty(GetIdentityBalanceResponse.prototype, "version", { - get: $util.oneOfGetter($oneOfFields = ["v0"]), - set: $util.oneOfSetter($oneOfFields) - }); + SpecificKeys.prototype.keyIds = $util.emptyArray; /** - * Creates a new GetIdentityBalanceResponse instance using the specified properties. + * Creates a new SpecificKeys instance using the specified properties. * @function create - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse + * @memberof org.dash.platform.dapi.v0.SpecificKeys * @static - * @param {org.dash.platform.dapi.v0.IGetIdentityBalanceResponse=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceResponse} GetIdentityBalanceResponse instance + * @param {org.dash.platform.dapi.v0.ISpecificKeys=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.SpecificKeys} SpecificKeys instance */ - GetIdentityBalanceResponse.create = function create(properties) { - return new GetIdentityBalanceResponse(properties); + SpecificKeys.create = function create(properties) { + return new SpecificKeys(properties); }; /** - * Encodes the specified GetIdentityBalanceResponse message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityBalanceResponse.verify|verify} messages. + * Encodes the specified SpecificKeys message. Does not implicitly {@link org.dash.platform.dapi.v0.SpecificKeys.verify|verify} messages. * @function encode - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse + * @memberof org.dash.platform.dapi.v0.SpecificKeys * @static - * @param {org.dash.platform.dapi.v0.IGetIdentityBalanceResponse} message GetIdentityBalanceResponse message or plain object to encode + * @param {org.dash.platform.dapi.v0.ISpecificKeys} message SpecificKeys message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetIdentityBalanceResponse.encode = function encode(message, writer) { + SpecificKeys.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) - $root.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.keyIds != null && message.keyIds.length) { + writer.uint32(/* id 1, wireType 2 =*/10).fork(); + for (var i = 0; i < message.keyIds.length; ++i) + writer.uint32(message.keyIds[i]); + writer.ldelim(); + } return writer; }; /** - * Encodes the specified GetIdentityBalanceResponse message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityBalanceResponse.verify|verify} messages. + * Encodes the specified SpecificKeys message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.SpecificKeys.verify|verify} messages. * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse + * @memberof org.dash.platform.dapi.v0.SpecificKeys * @static - * @param {org.dash.platform.dapi.v0.IGetIdentityBalanceResponse} message GetIdentityBalanceResponse message or plain object to encode + * @param {org.dash.platform.dapi.v0.ISpecificKeys} message SpecificKeys message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetIdentityBalanceResponse.encodeDelimited = function encodeDelimited(message, writer) { + SpecificKeys.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a GetIdentityBalanceResponse message from the specified reader or buffer. + * Decodes a SpecificKeys message from the specified reader or buffer. * @function decode - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse + * @memberof org.dash.platform.dapi.v0.SpecificKeys * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceResponse} GetIdentityBalanceResponse + * @returns {org.dash.platform.dapi.v0.SpecificKeys} SpecificKeys * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetIdentityBalanceResponse.decode = function decode(reader, length) { + SpecificKeys.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityBalanceResponse(); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.SpecificKeys(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { case 1: - message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.decode(reader, reader.uint32()); + if (!(message.keyIds && message.keyIds.length)) + message.keyIds = []; + if ((tag & 7) === 2) { + var end2 = reader.uint32() + reader.pos; + while (reader.pos < end2) + message.keyIds.push(reader.uint32()); + } else + message.keyIds.push(reader.uint32()); break; default: reader.skipType(tag & 7); @@ -7347,394 +7429,353 @@ $root.org = (function() { }; /** - * Decodes a GetIdentityBalanceResponse message from the specified reader or buffer, length delimited. + * Decodes a SpecificKeys message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse + * @memberof org.dash.platform.dapi.v0.SpecificKeys * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceResponse} GetIdentityBalanceResponse + * @returns {org.dash.platform.dapi.v0.SpecificKeys} SpecificKeys * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetIdentityBalanceResponse.decodeDelimited = function decodeDelimited(reader) { + SpecificKeys.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a GetIdentityBalanceResponse message. + * Verifies a SpecificKeys message. * @function verify - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse + * @memberof org.dash.platform.dapi.v0.SpecificKeys * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - GetIdentityBalanceResponse.verify = function verify(message) { + SpecificKeys.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; - var properties = {}; - if (message.v0 != null && message.hasOwnProperty("v0")) { - properties.version = 1; - { - var error = $root.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.verify(message.v0); - if (error) - return "v0." + error; - } + if (message.keyIds != null && message.hasOwnProperty("keyIds")) { + if (!Array.isArray(message.keyIds)) + return "keyIds: array expected"; + for (var i = 0; i < message.keyIds.length; ++i) + if (!$util.isInteger(message.keyIds[i])) + return "keyIds: integer[] expected"; } return null; }; /** - * Creates a GetIdentityBalanceResponse message from a plain object. Also converts values to their respective internal types. + * Creates a SpecificKeys message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse + * @memberof org.dash.platform.dapi.v0.SpecificKeys * @static * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceResponse} GetIdentityBalanceResponse + * @returns {org.dash.platform.dapi.v0.SpecificKeys} SpecificKeys */ - GetIdentityBalanceResponse.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityBalanceResponse) + SpecificKeys.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.SpecificKeys) return object; - var message = new $root.org.dash.platform.dapi.v0.GetIdentityBalanceResponse(); - if (object.v0 != null) { - if (typeof object.v0 !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetIdentityBalanceResponse.v0: object expected"); - message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.fromObject(object.v0); + var message = new $root.org.dash.platform.dapi.v0.SpecificKeys(); + if (object.keyIds) { + if (!Array.isArray(object.keyIds)) + throw TypeError(".org.dash.platform.dapi.v0.SpecificKeys.keyIds: array expected"); + message.keyIds = []; + for (var i = 0; i < object.keyIds.length; ++i) + message.keyIds[i] = object.keyIds[i] >>> 0; } return message; }; /** - * Creates a plain object from a GetIdentityBalanceResponse message. Also converts values to other types if specified. + * Creates a plain object from a SpecificKeys message. Also converts values to other types if specified. * @function toObject - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse + * @memberof org.dash.platform.dapi.v0.SpecificKeys * @static - * @param {org.dash.platform.dapi.v0.GetIdentityBalanceResponse} message GetIdentityBalanceResponse + * @param {org.dash.platform.dapi.v0.SpecificKeys} message SpecificKeys * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - GetIdentityBalanceResponse.toObject = function toObject(message, options) { + SpecificKeys.toObject = function toObject(message, options) { if (!options) options = {}; var object = {}; - if (message.v0 != null && message.hasOwnProperty("v0")) { - object.v0 = $root.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.toObject(message.v0, options); - if (options.oneofs) - object.version = "v0"; + if (options.arrays || options.defaults) + object.keyIds = []; + if (message.keyIds && message.keyIds.length) { + object.keyIds = []; + for (var j = 0; j < message.keyIds.length; ++j) + object.keyIds[j] = message.keyIds[j]; } return object; }; /** - * Converts this GetIdentityBalanceResponse to JSON. + * Converts this SpecificKeys to JSON. * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse + * @memberof org.dash.platform.dapi.v0.SpecificKeys * @instance * @returns {Object.} JSON object */ - GetIdentityBalanceResponse.prototype.toJSON = function toJSON() { + SpecificKeys.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - GetIdentityBalanceResponse.GetIdentityBalanceResponseV0 = (function() { + return SpecificKeys; + })(); - /** - * Properties of a GetIdentityBalanceResponseV0. - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse - * @interface IGetIdentityBalanceResponseV0 - * @property {number|Long|null} [balance] GetIdentityBalanceResponseV0 balance - * @property {org.dash.platform.dapi.v0.IProof|null} [proof] GetIdentityBalanceResponseV0 proof - * @property {org.dash.platform.dapi.v0.IResponseMetadata|null} [metadata] GetIdentityBalanceResponseV0 metadata - */ - - /** - * Constructs a new GetIdentityBalanceResponseV0. - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse - * @classdesc Represents a GetIdentityBalanceResponseV0. - * @implements IGetIdentityBalanceResponseV0 - * @constructor - * @param {org.dash.platform.dapi.v0.GetIdentityBalanceResponse.IGetIdentityBalanceResponseV0=} [properties] Properties to set - */ - function GetIdentityBalanceResponseV0(properties) { - if (properties) - for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) - if (properties[keys[i]] != null) - this[keys[i]] = properties[keys[i]]; - } - - /** - * GetIdentityBalanceResponseV0 balance. - * @member {number|Long} balance - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0 - * @instance - */ - GetIdentityBalanceResponseV0.prototype.balance = $util.Long ? $util.Long.fromBits(0,0,true) : 0; - - /** - * GetIdentityBalanceResponseV0 proof. - * @member {org.dash.platform.dapi.v0.IProof|null|undefined} proof - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0 - * @instance - */ - GetIdentityBalanceResponseV0.prototype.proof = null; + v0.SearchKey = (function() { - /** - * GetIdentityBalanceResponseV0 metadata. - * @member {org.dash.platform.dapi.v0.IResponseMetadata|null|undefined} metadata - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0 - * @instance - */ - GetIdentityBalanceResponseV0.prototype.metadata = null; + /** + * Properties of a SearchKey. + * @memberof org.dash.platform.dapi.v0 + * @interface ISearchKey + * @property {Object.|null} [purposeMap] SearchKey purposeMap + */ - // OneOf field names bound to virtual getters and setters - var $oneOfFields; + /** + * Constructs a new SearchKey. + * @memberof org.dash.platform.dapi.v0 + * @classdesc Represents a SearchKey. + * @implements ISearchKey + * @constructor + * @param {org.dash.platform.dapi.v0.ISearchKey=} [properties] Properties to set + */ + function SearchKey(properties) { + this.purposeMap = {}; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } - /** - * GetIdentityBalanceResponseV0 result. - * @member {"balance"|"proof"|undefined} result - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0 - * @instance - */ - Object.defineProperty(GetIdentityBalanceResponseV0.prototype, "result", { - get: $util.oneOfGetter($oneOfFields = ["balance", "proof"]), - set: $util.oneOfSetter($oneOfFields) - }); + /** + * SearchKey purposeMap. + * @member {Object.} purposeMap + * @memberof org.dash.platform.dapi.v0.SearchKey + * @instance + */ + SearchKey.prototype.purposeMap = $util.emptyObject; - /** - * Creates a new GetIdentityBalanceResponseV0 instance using the specified properties. - * @function create - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0 - * @static - * @param {org.dash.platform.dapi.v0.GetIdentityBalanceResponse.IGetIdentityBalanceResponseV0=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} GetIdentityBalanceResponseV0 instance - */ - GetIdentityBalanceResponseV0.create = function create(properties) { - return new GetIdentityBalanceResponseV0(properties); - }; + /** + * Creates a new SearchKey instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.SearchKey + * @static + * @param {org.dash.platform.dapi.v0.ISearchKey=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.SearchKey} SearchKey instance + */ + SearchKey.create = function create(properties) { + return new SearchKey(properties); + }; - /** - * Encodes the specified GetIdentityBalanceResponseV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.verify|verify} messages. - * @function encode - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0 - * @static - * @param {org.dash.platform.dapi.v0.GetIdentityBalanceResponse.IGetIdentityBalanceResponseV0} message GetIdentityBalanceResponseV0 message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - GetIdentityBalanceResponseV0.encode = function encode(message, writer) { - if (!writer) - writer = $Writer.create(); - if (message.balance != null && Object.hasOwnProperty.call(message, "balance")) - writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.balance); - if (message.proof != null && Object.hasOwnProperty.call(message, "proof")) - $root.org.dash.platform.dapi.v0.Proof.encode(message.proof, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); - if (message.metadata != null && Object.hasOwnProperty.call(message, "metadata")) - $root.org.dash.platform.dapi.v0.ResponseMetadata.encode(message.metadata, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); - return writer; - }; + /** + * Encodes the specified SearchKey message. Does not implicitly {@link org.dash.platform.dapi.v0.SearchKey.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.SearchKey + * @static + * @param {org.dash.platform.dapi.v0.ISearchKey} message SearchKey message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SearchKey.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.purposeMap != null && Object.hasOwnProperty.call(message, "purposeMap")) + for (var keys = Object.keys(message.purposeMap), i = 0; i < keys.length; ++i) { + writer.uint32(/* id 1, wireType 2 =*/10).fork().uint32(/* id 1, wireType 0 =*/8).uint32(keys[i]); + $root.org.dash.platform.dapi.v0.SecurityLevelMap.encode(message.purposeMap[keys[i]], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim().ldelim(); + } + return writer; + }; - /** - * Encodes the specified GetIdentityBalanceResponseV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.verify|verify} messages. - * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0 - * @static - * @param {org.dash.platform.dapi.v0.GetIdentityBalanceResponse.IGetIdentityBalanceResponseV0} message GetIdentityBalanceResponseV0 message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - GetIdentityBalanceResponseV0.encodeDelimited = function encodeDelimited(message, writer) { - return this.encode(message, writer).ldelim(); - }; + /** + * Encodes the specified SearchKey message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.SearchKey.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.SearchKey + * @static + * @param {org.dash.platform.dapi.v0.ISearchKey} message SearchKey message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SearchKey.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; - /** - * Decodes a GetIdentityBalanceResponseV0 message from the specified reader or buffer. - * @function decode - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0 - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} GetIdentityBalanceResponseV0 - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - GetIdentityBalanceResponseV0.decode = function decode(reader, length) { - if (!(reader instanceof $Reader)) - reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0(); - while (reader.pos < end) { - var tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - message.balance = reader.uint64(); - break; - case 2: - message.proof = $root.org.dash.platform.dapi.v0.Proof.decode(reader, reader.uint32()); - break; - case 3: - message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.decode(reader, reader.uint32()); - break; - default: - reader.skipType(tag & 7); - break; + /** + * Decodes a SearchKey message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.SearchKey + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.SearchKey} SearchKey + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SearchKey.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.SearchKey(), key, value; + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (message.purposeMap === $util.emptyObject) + message.purposeMap = {}; + var end2 = reader.uint32() + reader.pos; + key = 0; + value = null; + while (reader.pos < end2) { + var tag2 = reader.uint32(); + switch (tag2 >>> 3) { + case 1: + key = reader.uint32(); + break; + case 2: + value = $root.org.dash.platform.dapi.v0.SecurityLevelMap.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag2 & 7); + break; + } } + message.purposeMap[key] = value; + break; + default: + reader.skipType(tag & 7); + break; } - return message; - }; + } + return message; + }; - /** - * Decodes a GetIdentityBalanceResponseV0 message from the specified reader or buffer, length delimited. - * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0 - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} GetIdentityBalanceResponseV0 - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - GetIdentityBalanceResponseV0.decodeDelimited = function decodeDelimited(reader) { - if (!(reader instanceof $Reader)) - reader = new $Reader(reader); - return this.decode(reader, reader.uint32()); - }; + /** + * Decodes a SearchKey message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.SearchKey + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.SearchKey} SearchKey + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SearchKey.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; - /** - * Verifies a GetIdentityBalanceResponseV0 message. - * @function verify - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0 - * @static - * @param {Object.} message Plain object to verify - * @returns {string|null} `null` if valid, otherwise the reason why it is not - */ - GetIdentityBalanceResponseV0.verify = function verify(message) { - if (typeof message !== "object" || message === null) - return "object expected"; - var properties = {}; - if (message.balance != null && message.hasOwnProperty("balance")) { - properties.result = 1; - if (!$util.isInteger(message.balance) && !(message.balance && $util.isInteger(message.balance.low) && $util.isInteger(message.balance.high))) - return "balance: integer|Long expected"; - } - if (message.proof != null && message.hasOwnProperty("proof")) { - if (properties.result === 1) - return "result: multiple values"; - properties.result = 1; + /** + * Verifies a SearchKey message. + * @function verify + * @memberof org.dash.platform.dapi.v0.SearchKey + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + SearchKey.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.purposeMap != null && message.hasOwnProperty("purposeMap")) { + if (!$util.isObject(message.purposeMap)) + return "purposeMap: object expected"; + var key = Object.keys(message.purposeMap); + for (var i = 0; i < key.length; ++i) { + if (!$util.key32Re.test(key[i])) + return "purposeMap: integer key{k:uint32} expected"; { - var error = $root.org.dash.platform.dapi.v0.Proof.verify(message.proof); + var error = $root.org.dash.platform.dapi.v0.SecurityLevelMap.verify(message.purposeMap[key[i]]); if (error) - return "proof." + error; + return "purposeMap." + error; } } - if (message.metadata != null && message.hasOwnProperty("metadata")) { - var error = $root.org.dash.platform.dapi.v0.ResponseMetadata.verify(message.metadata); - if (error) - return "metadata." + error; - } - return null; - }; - - /** - * Creates a GetIdentityBalanceResponseV0 message from a plain object. Also converts values to their respective internal types. - * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0 - * @static - * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} GetIdentityBalanceResponseV0 - */ - GetIdentityBalanceResponseV0.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0) - return object; - var message = new $root.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0(); - if (object.balance != null) - if ($util.Long) - (message.balance = $util.Long.fromValue(object.balance)).unsigned = true; - else if (typeof object.balance === "string") - message.balance = parseInt(object.balance, 10); - else if (typeof object.balance === "number") - message.balance = object.balance; - else if (typeof object.balance === "object") - message.balance = new $util.LongBits(object.balance.low >>> 0, object.balance.high >>> 0).toNumber(true); - if (object.proof != null) { - if (typeof object.proof !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.proof: object expected"); - message.proof = $root.org.dash.platform.dapi.v0.Proof.fromObject(object.proof); - } - if (object.metadata != null) { - if (typeof object.metadata !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.metadata: object expected"); - message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.fromObject(object.metadata); - } - return message; - }; + } + return null; + }; - /** - * Creates a plain object from a GetIdentityBalanceResponseV0 message. Also converts values to other types if specified. - * @function toObject - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0 - * @static - * @param {org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} message GetIdentityBalanceResponseV0 - * @param {$protobuf.IConversionOptions} [options] Conversion options - * @returns {Object.} Plain object - */ - GetIdentityBalanceResponseV0.toObject = function toObject(message, options) { - if (!options) - options = {}; - var object = {}; - if (options.defaults) - object.metadata = null; - if (message.balance != null && message.hasOwnProperty("balance")) { - if (typeof message.balance === "number") - object.balance = options.longs === String ? String(message.balance) : message.balance; - else - object.balance = options.longs === String ? $util.Long.prototype.toString.call(message.balance) : options.longs === Number ? new $util.LongBits(message.balance.low >>> 0, message.balance.high >>> 0).toNumber(true) : message.balance; - if (options.oneofs) - object.result = "balance"; - } - if (message.proof != null && message.hasOwnProperty("proof")) { - object.proof = $root.org.dash.platform.dapi.v0.Proof.toObject(message.proof, options); - if (options.oneofs) - object.result = "proof"; - } - if (message.metadata != null && message.hasOwnProperty("metadata")) - object.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.toObject(message.metadata, options); + /** + * Creates a SearchKey message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.SearchKey + * @static + * @param {Object.} object Plain object + * @returns {org.dash.platform.dapi.v0.SearchKey} SearchKey + */ + SearchKey.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.SearchKey) return object; - }; + var message = new $root.org.dash.platform.dapi.v0.SearchKey(); + if (object.purposeMap) { + if (typeof object.purposeMap !== "object") + throw TypeError(".org.dash.platform.dapi.v0.SearchKey.purposeMap: object expected"); + message.purposeMap = {}; + for (var keys = Object.keys(object.purposeMap), i = 0; i < keys.length; ++i) { + if (typeof object.purposeMap[keys[i]] !== "object") + throw TypeError(".org.dash.platform.dapi.v0.SearchKey.purposeMap: object expected"); + message.purposeMap[keys[i]] = $root.org.dash.platform.dapi.v0.SecurityLevelMap.fromObject(object.purposeMap[keys[i]]); + } + } + return message; + }; - /** - * Converts this GetIdentityBalanceResponseV0 to JSON. - * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0 - * @instance - * @returns {Object.} JSON object - */ - GetIdentityBalanceResponseV0.prototype.toJSON = function toJSON() { - return this.constructor.toObject(this, $protobuf.util.toJSONOptions); - }; + /** + * Creates a plain object from a SearchKey message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.SearchKey + * @static + * @param {org.dash.platform.dapi.v0.SearchKey} message SearchKey + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + SearchKey.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.objects || options.defaults) + object.purposeMap = {}; + var keys2; + if (message.purposeMap && (keys2 = Object.keys(message.purposeMap)).length) { + object.purposeMap = {}; + for (var j = 0; j < keys2.length; ++j) + object.purposeMap[keys2[j]] = $root.org.dash.platform.dapi.v0.SecurityLevelMap.toObject(message.purposeMap[keys2[j]], options); + } + return object; + }; - return GetIdentityBalanceResponseV0; - })(); + /** + * Converts this SearchKey to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.SearchKey + * @instance + * @returns {Object.} JSON object + */ + SearchKey.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; - return GetIdentityBalanceResponse; + return SearchKey; })(); - v0.GetIdentityBalanceAndRevisionResponse = (function() { + v0.SecurityLevelMap = (function() { /** - * Properties of a GetIdentityBalanceAndRevisionResponse. + * Properties of a SecurityLevelMap. * @memberof org.dash.platform.dapi.v0 - * @interface IGetIdentityBalanceAndRevisionResponse - * @property {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.IGetIdentityBalanceAndRevisionResponseV0|null} [v0] GetIdentityBalanceAndRevisionResponse v0 + * @interface ISecurityLevelMap + * @property {Object.|null} [securityLevelMap] SecurityLevelMap securityLevelMap */ /** - * Constructs a new GetIdentityBalanceAndRevisionResponse. + * Constructs a new SecurityLevelMap. * @memberof org.dash.platform.dapi.v0 - * @classdesc Represents a GetIdentityBalanceAndRevisionResponse. - * @implements IGetIdentityBalanceAndRevisionResponse + * @classdesc Represents a SecurityLevelMap. + * @implements ISecurityLevelMap * @constructor - * @param {org.dash.platform.dapi.v0.IGetIdentityBalanceAndRevisionResponse=} [properties] Properties to set + * @param {org.dash.platform.dapi.v0.ISecurityLevelMap=} [properties] Properties to set */ - function GetIdentityBalanceAndRevisionResponse(properties) { + function SecurityLevelMap(properties) { + this.securityLevelMap = {}; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -7742,89 +7783,95 @@ $root.org = (function() { } /** - * GetIdentityBalanceAndRevisionResponse v0. - * @member {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.IGetIdentityBalanceAndRevisionResponseV0|null|undefined} v0 - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse - * @instance - */ - GetIdentityBalanceAndRevisionResponse.prototype.v0 = null; - - // OneOf field names bound to virtual getters and setters - var $oneOfFields; - - /** - * GetIdentityBalanceAndRevisionResponse version. - * @member {"v0"|undefined} version - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse + * SecurityLevelMap securityLevelMap. + * @member {Object.} securityLevelMap + * @memberof org.dash.platform.dapi.v0.SecurityLevelMap * @instance */ - Object.defineProperty(GetIdentityBalanceAndRevisionResponse.prototype, "version", { - get: $util.oneOfGetter($oneOfFields = ["v0"]), - set: $util.oneOfSetter($oneOfFields) - }); + SecurityLevelMap.prototype.securityLevelMap = $util.emptyObject; /** - * Creates a new GetIdentityBalanceAndRevisionResponse instance using the specified properties. + * Creates a new SecurityLevelMap instance using the specified properties. * @function create - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse + * @memberof org.dash.platform.dapi.v0.SecurityLevelMap * @static - * @param {org.dash.platform.dapi.v0.IGetIdentityBalanceAndRevisionResponse=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} GetIdentityBalanceAndRevisionResponse instance + * @param {org.dash.platform.dapi.v0.ISecurityLevelMap=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.SecurityLevelMap} SecurityLevelMap instance */ - GetIdentityBalanceAndRevisionResponse.create = function create(properties) { - return new GetIdentityBalanceAndRevisionResponse(properties); + SecurityLevelMap.create = function create(properties) { + return new SecurityLevelMap(properties); }; /** - * Encodes the specified GetIdentityBalanceAndRevisionResponse message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.verify|verify} messages. + * Encodes the specified SecurityLevelMap message. Does not implicitly {@link org.dash.platform.dapi.v0.SecurityLevelMap.verify|verify} messages. * @function encode - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse + * @memberof org.dash.platform.dapi.v0.SecurityLevelMap * @static - * @param {org.dash.platform.dapi.v0.IGetIdentityBalanceAndRevisionResponse} message GetIdentityBalanceAndRevisionResponse message or plain object to encode + * @param {org.dash.platform.dapi.v0.ISecurityLevelMap} message SecurityLevelMap message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetIdentityBalanceAndRevisionResponse.encode = function encode(message, writer) { + SecurityLevelMap.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) - $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.securityLevelMap != null && Object.hasOwnProperty.call(message, "securityLevelMap")) + for (var keys = Object.keys(message.securityLevelMap), i = 0; i < keys.length; ++i) + writer.uint32(/* id 1, wireType 2 =*/10).fork().uint32(/* id 1, wireType 0 =*/8).uint32(keys[i]).uint32(/* id 2, wireType 0 =*/16).int32(message.securityLevelMap[keys[i]]).ldelim(); return writer; }; /** - * Encodes the specified GetIdentityBalanceAndRevisionResponse message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.verify|verify} messages. + * Encodes the specified SecurityLevelMap message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.SecurityLevelMap.verify|verify} messages. * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse + * @memberof org.dash.platform.dapi.v0.SecurityLevelMap * @static - * @param {org.dash.platform.dapi.v0.IGetIdentityBalanceAndRevisionResponse} message GetIdentityBalanceAndRevisionResponse message or plain object to encode + * @param {org.dash.platform.dapi.v0.ISecurityLevelMap} message SecurityLevelMap message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetIdentityBalanceAndRevisionResponse.encodeDelimited = function encodeDelimited(message, writer) { + SecurityLevelMap.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a GetIdentityBalanceAndRevisionResponse message from the specified reader or buffer. + * Decodes a SecurityLevelMap message from the specified reader or buffer. * @function decode - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse + * @memberof org.dash.platform.dapi.v0.SecurityLevelMap * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} GetIdentityBalanceAndRevisionResponse + * @returns {org.dash.platform.dapi.v0.SecurityLevelMap} SecurityLevelMap * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetIdentityBalanceAndRevisionResponse.decode = function decode(reader, length) { + SecurityLevelMap.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse(); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.SecurityLevelMap(), key, value; while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { case 1: - message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.decode(reader, reader.uint32()); + if (message.securityLevelMap === $util.emptyObject) + message.securityLevelMap = {}; + var end2 = reader.uint32() + reader.pos; + key = 0; + value = 0; + while (reader.pos < end2) { + var tag2 = reader.uint32(); + switch (tag2 >>> 3) { + case 1: + key = reader.uint32(); + break; + case 2: + value = reader.int32(); + break; + default: + reader.skipType(tag2 & 7); + break; + } + } + message.securityLevelMap[key] = value; break; default: reader.skipType(tag & 7); @@ -7835,232 +7882,492 @@ $root.org = (function() { }; /** - * Decodes a GetIdentityBalanceAndRevisionResponse message from the specified reader or buffer, length delimited. + * Decodes a SecurityLevelMap message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse + * @memberof org.dash.platform.dapi.v0.SecurityLevelMap * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} GetIdentityBalanceAndRevisionResponse + * @returns {org.dash.platform.dapi.v0.SecurityLevelMap} SecurityLevelMap * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetIdentityBalanceAndRevisionResponse.decodeDelimited = function decodeDelimited(reader) { + SecurityLevelMap.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a GetIdentityBalanceAndRevisionResponse message. + * Verifies a SecurityLevelMap message. * @function verify - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse + * @memberof org.dash.platform.dapi.v0.SecurityLevelMap * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - GetIdentityBalanceAndRevisionResponse.verify = function verify(message) { + SecurityLevelMap.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; - var properties = {}; - if (message.v0 != null && message.hasOwnProperty("v0")) { - properties.version = 1; - { - var error = $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.verify(message.v0); - if (error) - return "v0." + error; + if (message.securityLevelMap != null && message.hasOwnProperty("securityLevelMap")) { + if (!$util.isObject(message.securityLevelMap)) + return "securityLevelMap: object expected"; + var key = Object.keys(message.securityLevelMap); + for (var i = 0; i < key.length; ++i) { + if (!$util.key32Re.test(key[i])) + return "securityLevelMap: integer key{k:uint32} expected"; + switch (message.securityLevelMap[key[i]]) { + default: + return "securityLevelMap: enum value{k:uint32} expected"; + case 0: + case 1: + break; + } } } return null; }; /** - * Creates a GetIdentityBalanceAndRevisionResponse message from a plain object. Also converts values to their respective internal types. + * Creates a SecurityLevelMap message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse + * @memberof org.dash.platform.dapi.v0.SecurityLevelMap * @static * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} GetIdentityBalanceAndRevisionResponse + * @returns {org.dash.platform.dapi.v0.SecurityLevelMap} SecurityLevelMap */ - GetIdentityBalanceAndRevisionResponse.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse) + SecurityLevelMap.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.SecurityLevelMap) return object; - var message = new $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse(); - if (object.v0 != null) { - if (typeof object.v0 !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.v0: object expected"); - message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.fromObject(object.v0); + var message = new $root.org.dash.platform.dapi.v0.SecurityLevelMap(); + if (object.securityLevelMap) { + if (typeof object.securityLevelMap !== "object") + throw TypeError(".org.dash.platform.dapi.v0.SecurityLevelMap.securityLevelMap: object expected"); + message.securityLevelMap = {}; + for (var keys = Object.keys(object.securityLevelMap), i = 0; i < keys.length; ++i) + switch (object.securityLevelMap[keys[i]]) { + case "CURRENT_KEY_OF_KIND_REQUEST": + case 0: + message.securityLevelMap[keys[i]] = 0; + break; + case "ALL_KEYS_OF_KIND_REQUEST": + case 1: + message.securityLevelMap[keys[i]] = 1; + break; + } } return message; }; /** - * Creates a plain object from a GetIdentityBalanceAndRevisionResponse message. Also converts values to other types if specified. + * Creates a plain object from a SecurityLevelMap message. Also converts values to other types if specified. * @function toObject - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse + * @memberof org.dash.platform.dapi.v0.SecurityLevelMap * @static - * @param {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} message GetIdentityBalanceAndRevisionResponse + * @param {org.dash.platform.dapi.v0.SecurityLevelMap} message SecurityLevelMap * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - GetIdentityBalanceAndRevisionResponse.toObject = function toObject(message, options) { + SecurityLevelMap.toObject = function toObject(message, options) { if (!options) options = {}; var object = {}; - if (message.v0 != null && message.hasOwnProperty("v0")) { - object.v0 = $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.toObject(message.v0, options); - if (options.oneofs) - object.version = "v0"; + if (options.objects || options.defaults) + object.securityLevelMap = {}; + var keys2; + if (message.securityLevelMap && (keys2 = Object.keys(message.securityLevelMap)).length) { + object.securityLevelMap = {}; + for (var j = 0; j < keys2.length; ++j) + object.securityLevelMap[keys2[j]] = options.enums === String ? $root.org.dash.platform.dapi.v0.SecurityLevelMap.KeyKindRequestType[message.securityLevelMap[keys2[j]]] : message.securityLevelMap[keys2[j]]; } return object; }; /** - * Converts this GetIdentityBalanceAndRevisionResponse to JSON. + * Converts this SecurityLevelMap to JSON. * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse + * @memberof org.dash.platform.dapi.v0.SecurityLevelMap * @instance * @returns {Object.} JSON object */ - GetIdentityBalanceAndRevisionResponse.prototype.toJSON = function toJSON() { + SecurityLevelMap.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0 = (function() { - - /** - * Properties of a GetIdentityBalanceAndRevisionResponseV0. - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse - * @interface IGetIdentityBalanceAndRevisionResponseV0 - * @property {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.IBalanceAndRevision|null} [balanceAndRevision] GetIdentityBalanceAndRevisionResponseV0 balanceAndRevision - * @property {org.dash.platform.dapi.v0.IProof|null} [proof] GetIdentityBalanceAndRevisionResponseV0 proof - * @property {org.dash.platform.dapi.v0.IResponseMetadata|null} [metadata] GetIdentityBalanceAndRevisionResponseV0 metadata - */ + /** + * KeyKindRequestType enum. + * @name org.dash.platform.dapi.v0.SecurityLevelMap.KeyKindRequestType + * @enum {number} + * @property {number} CURRENT_KEY_OF_KIND_REQUEST=0 CURRENT_KEY_OF_KIND_REQUEST value + * @property {number} ALL_KEYS_OF_KIND_REQUEST=1 ALL_KEYS_OF_KIND_REQUEST value + */ + SecurityLevelMap.KeyKindRequestType = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "CURRENT_KEY_OF_KIND_REQUEST"] = 0; + values[valuesById[1] = "ALL_KEYS_OF_KIND_REQUEST"] = 1; + return values; + })(); - /** - * Constructs a new GetIdentityBalanceAndRevisionResponseV0. - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse - * @classdesc Represents a GetIdentityBalanceAndRevisionResponseV0. - * @implements IGetIdentityBalanceAndRevisionResponseV0 - * @constructor - * @param {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.IGetIdentityBalanceAndRevisionResponseV0=} [properties] Properties to set - */ - function GetIdentityBalanceAndRevisionResponseV0(properties) { - if (properties) - for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) - if (properties[keys[i]] != null) - this[keys[i]] = properties[keys[i]]; - } + return SecurityLevelMap; + })(); - /** - * GetIdentityBalanceAndRevisionResponseV0 balanceAndRevision. - * @member {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.IBalanceAndRevision|null|undefined} balanceAndRevision - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0 - * @instance - */ - GetIdentityBalanceAndRevisionResponseV0.prototype.balanceAndRevision = null; + v0.GetIdentityKeysRequest = (function() { - /** - * GetIdentityBalanceAndRevisionResponseV0 proof. - * @member {org.dash.platform.dapi.v0.IProof|null|undefined} proof - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0 - * @instance - */ - GetIdentityBalanceAndRevisionResponseV0.prototype.proof = null; + /** + * Properties of a GetIdentityKeysRequest. + * @memberof org.dash.platform.dapi.v0 + * @interface IGetIdentityKeysRequest + * @property {org.dash.platform.dapi.v0.GetIdentityKeysRequest.IGetIdentityKeysRequestV0|null} [v0] GetIdentityKeysRequest v0 + */ - /** - * GetIdentityBalanceAndRevisionResponseV0 metadata. - * @member {org.dash.platform.dapi.v0.IResponseMetadata|null|undefined} metadata - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0 - * @instance - */ - GetIdentityBalanceAndRevisionResponseV0.prototype.metadata = null; + /** + * Constructs a new GetIdentityKeysRequest. + * @memberof org.dash.platform.dapi.v0 + * @classdesc Represents a GetIdentityKeysRequest. + * @implements IGetIdentityKeysRequest + * @constructor + * @param {org.dash.platform.dapi.v0.IGetIdentityKeysRequest=} [properties] Properties to set + */ + function GetIdentityKeysRequest(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } - // OneOf field names bound to virtual getters and setters - var $oneOfFields; + /** + * GetIdentityKeysRequest v0. + * @member {org.dash.platform.dapi.v0.GetIdentityKeysRequest.IGetIdentityKeysRequestV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest + * @instance + */ + GetIdentityKeysRequest.prototype.v0 = null; - /** - * GetIdentityBalanceAndRevisionResponseV0 result. - * @member {"balanceAndRevision"|"proof"|undefined} result - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0 - * @instance - */ - Object.defineProperty(GetIdentityBalanceAndRevisionResponseV0.prototype, "result", { - get: $util.oneOfGetter($oneOfFields = ["balanceAndRevision", "proof"]), - set: $util.oneOfSetter($oneOfFields) - }); + // OneOf field names bound to virtual getters and setters + var $oneOfFields; - /** - * Creates a new GetIdentityBalanceAndRevisionResponseV0 instance using the specified properties. - * @function create - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0 - * @static - * @param {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.IGetIdentityBalanceAndRevisionResponseV0=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} GetIdentityBalanceAndRevisionResponseV0 instance + /** + * GetIdentityKeysRequest version. + * @member {"v0"|undefined} version + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest + * @instance + */ + Object.defineProperty(GetIdentityKeysRequest.prototype, "version", { + get: $util.oneOfGetter($oneOfFields = ["v0"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetIdentityKeysRequest instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetIdentityKeysRequest=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentityKeysRequest} GetIdentityKeysRequest instance + */ + GetIdentityKeysRequest.create = function create(properties) { + return new GetIdentityKeysRequest(properties); + }; + + /** + * Encodes the specified GetIdentityKeysRequest message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityKeysRequest.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetIdentityKeysRequest} message GetIdentityKeysRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentityKeysRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) + $root.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetIdentityKeysRequest message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityKeysRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetIdentityKeysRequest} message GetIdentityKeysRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentityKeysRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetIdentityKeysRequest message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetIdentityKeysRequest} GetIdentityKeysRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetIdentityKeysRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityKeysRequest(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetIdentityKeysRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetIdentityKeysRequest} GetIdentityKeysRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetIdentityKeysRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetIdentityKeysRequest message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetIdentityKeysRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + properties.version = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.verify(message.v0); + if (error) + return "v0." + error; + } + } + return null; + }; + + /** + * Creates a GetIdentityKeysRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest + * @static + * @param {Object.} object Plain object + * @returns {org.dash.platform.dapi.v0.GetIdentityKeysRequest} GetIdentityKeysRequest + */ + GetIdentityKeysRequest.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityKeysRequest) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetIdentityKeysRequest(); + if (object.v0 != null) { + if (typeof object.v0 !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityKeysRequest.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.fromObject(object.v0); + } + return message; + }; + + /** + * Creates a plain object from a GetIdentityKeysRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityKeysRequest} message GetIdentityKeysRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + GetIdentityKeysRequest.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + object.v0 = $root.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.toObject(message.v0, options); + if (options.oneofs) + object.version = "v0"; + } + return object; + }; + + /** + * Converts this GetIdentityKeysRequest to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest + * @instance + * @returns {Object.} JSON object + */ + GetIdentityKeysRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + GetIdentityKeysRequest.GetIdentityKeysRequestV0 = (function() { + + /** + * Properties of a GetIdentityKeysRequestV0. + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest + * @interface IGetIdentityKeysRequestV0 + * @property {Uint8Array|null} [identityId] GetIdentityKeysRequestV0 identityId + * @property {org.dash.platform.dapi.v0.IKeyRequestType|null} [requestType] GetIdentityKeysRequestV0 requestType + * @property {google.protobuf.IUInt32Value|null} [limit] GetIdentityKeysRequestV0 limit + * @property {google.protobuf.IUInt32Value|null} [offset] GetIdentityKeysRequestV0 offset + * @property {boolean|null} [prove] GetIdentityKeysRequestV0 prove */ - GetIdentityBalanceAndRevisionResponseV0.create = function create(properties) { - return new GetIdentityBalanceAndRevisionResponseV0(properties); - }; /** - * Encodes the specified GetIdentityBalanceAndRevisionResponseV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.verify|verify} messages. - * @function encode - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0 - * @static - * @param {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.IGetIdentityBalanceAndRevisionResponseV0} message GetIdentityBalanceAndRevisionResponseV0 message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer + * Constructs a new GetIdentityKeysRequestV0. + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest + * @classdesc Represents a GetIdentityKeysRequestV0. + * @implements IGetIdentityKeysRequestV0 + * @constructor + * @param {org.dash.platform.dapi.v0.GetIdentityKeysRequest.IGetIdentityKeysRequestV0=} [properties] Properties to set */ - GetIdentityBalanceAndRevisionResponseV0.encode = function encode(message, writer) { - if (!writer) - writer = $Writer.create(); - if (message.balanceAndRevision != null && Object.hasOwnProperty.call(message, "balanceAndRevision")) - $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.encode(message.balanceAndRevision, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); - if (message.proof != null && Object.hasOwnProperty.call(message, "proof")) - $root.org.dash.platform.dapi.v0.Proof.encode(message.proof, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); - if (message.metadata != null && Object.hasOwnProperty.call(message, "metadata")) - $root.org.dash.platform.dapi.v0.ResponseMetadata.encode(message.metadata, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); - return writer; - }; + function GetIdentityKeysRequestV0(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } /** - * Encodes the specified GetIdentityBalanceAndRevisionResponseV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.verify|verify} messages. - * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0 - * @static - * @param {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.IGetIdentityBalanceAndRevisionResponseV0} message GetIdentityBalanceAndRevisionResponseV0 message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer + * GetIdentityKeysRequestV0 identityId. + * @member {Uint8Array} identityId + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0 + * @instance */ - GetIdentityBalanceAndRevisionResponseV0.encodeDelimited = function encodeDelimited(message, writer) { - return this.encode(message, writer).ldelim(); - }; + GetIdentityKeysRequestV0.prototype.identityId = $util.newBuffer([]); /** - * Decodes a GetIdentityBalanceAndRevisionResponseV0 message from the specified reader or buffer. - * @function decode - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0 - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} GetIdentityBalanceAndRevisionResponseV0 - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing + * GetIdentityKeysRequestV0 requestType. + * @member {org.dash.platform.dapi.v0.IKeyRequestType|null|undefined} requestType + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0 + * @instance */ - GetIdentityBalanceAndRevisionResponseV0.decode = function decode(reader, length) { - if (!(reader instanceof $Reader)) - reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0(); - while (reader.pos < end) { - var tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - message.balanceAndRevision = $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.decode(reader, reader.uint32()); + GetIdentityKeysRequestV0.prototype.requestType = null; + + /** + * GetIdentityKeysRequestV0 limit. + * @member {google.protobuf.IUInt32Value|null|undefined} limit + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0 + * @instance + */ + GetIdentityKeysRequestV0.prototype.limit = null; + + /** + * GetIdentityKeysRequestV0 offset. + * @member {google.protobuf.IUInt32Value|null|undefined} offset + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0 + * @instance + */ + GetIdentityKeysRequestV0.prototype.offset = null; + + /** + * GetIdentityKeysRequestV0 prove. + * @member {boolean} prove + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0 + * @instance + */ + GetIdentityKeysRequestV0.prototype.prove = false; + + /** + * Creates a new GetIdentityKeysRequestV0 instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityKeysRequest.IGetIdentityKeysRequestV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} GetIdentityKeysRequestV0 instance + */ + GetIdentityKeysRequestV0.create = function create(properties) { + return new GetIdentityKeysRequestV0(properties); + }; + + /** + * Encodes the specified GetIdentityKeysRequestV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityKeysRequest.IGetIdentityKeysRequestV0} message GetIdentityKeysRequestV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentityKeysRequestV0.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.identityId != null && Object.hasOwnProperty.call(message, "identityId")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.identityId); + if (message.requestType != null && Object.hasOwnProperty.call(message, "requestType")) + $root.org.dash.platform.dapi.v0.KeyRequestType.encode(message.requestType, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.limit != null && Object.hasOwnProperty.call(message, "limit")) + $root.google.protobuf.UInt32Value.encode(message.limit, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + if (message.offset != null && Object.hasOwnProperty.call(message, "offset")) + $root.google.protobuf.UInt32Value.encode(message.offset, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); + if (message.prove != null && Object.hasOwnProperty.call(message, "prove")) + writer.uint32(/* id 5, wireType 0 =*/40).bool(message.prove); + return writer; + }; + + /** + * Encodes the specified GetIdentityKeysRequestV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityKeysRequest.IGetIdentityKeysRequestV0} message GetIdentityKeysRequestV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentityKeysRequestV0.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetIdentityKeysRequestV0 message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} GetIdentityKeysRequestV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetIdentityKeysRequestV0.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.identityId = reader.bytes(); break; case 2: - message.proof = $root.org.dash.platform.dapi.v0.Proof.decode(reader, reader.uint32()); + message.requestType = $root.org.dash.platform.dapi.v0.KeyRequestType.decode(reader, reader.uint32()); break; case 3: - message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.decode(reader, reader.uint32()); + message.limit = $root.google.protobuf.UInt32Value.decode(reader, reader.uint32()); + break; + case 4: + message.offset = $root.google.protobuf.UInt32Value.decode(reader, reader.uint32()); + break; + case 5: + message.prove = reader.bool(); break; default: reader.skipType(tag & 7); @@ -8071,394 +8378,167 @@ $root.org = (function() { }; /** - * Decodes a GetIdentityBalanceAndRevisionResponseV0 message from the specified reader or buffer, length delimited. + * Decodes a GetIdentityKeysRequestV0 message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0 * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} GetIdentityBalanceAndRevisionResponseV0 + * @returns {org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} GetIdentityKeysRequestV0 * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetIdentityBalanceAndRevisionResponseV0.decodeDelimited = function decodeDelimited(reader) { + GetIdentityKeysRequestV0.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a GetIdentityBalanceAndRevisionResponseV0 message. + * Verifies a GetIdentityKeysRequestV0 message. * @function verify - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0 * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - GetIdentityBalanceAndRevisionResponseV0.verify = function verify(message) { + GetIdentityKeysRequestV0.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; - var properties = {}; - if (message.balanceAndRevision != null && message.hasOwnProperty("balanceAndRevision")) { - properties.result = 1; - { - var error = $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.verify(message.balanceAndRevision); - if (error) - return "balanceAndRevision." + error; - } + if (message.identityId != null && message.hasOwnProperty("identityId")) + if (!(message.identityId && typeof message.identityId.length === "number" || $util.isString(message.identityId))) + return "identityId: buffer expected"; + if (message.requestType != null && message.hasOwnProperty("requestType")) { + var error = $root.org.dash.platform.dapi.v0.KeyRequestType.verify(message.requestType); + if (error) + return "requestType." + error; } - if (message.proof != null && message.hasOwnProperty("proof")) { - if (properties.result === 1) - return "result: multiple values"; - properties.result = 1; - { - var error = $root.org.dash.platform.dapi.v0.Proof.verify(message.proof); - if (error) - return "proof." + error; - } + if (message.limit != null && message.hasOwnProperty("limit")) { + var error = $root.google.protobuf.UInt32Value.verify(message.limit); + if (error) + return "limit." + error; } - if (message.metadata != null && message.hasOwnProperty("metadata")) { - var error = $root.org.dash.platform.dapi.v0.ResponseMetadata.verify(message.metadata); + if (message.offset != null && message.hasOwnProperty("offset")) { + var error = $root.google.protobuf.UInt32Value.verify(message.offset); if (error) - return "metadata." + error; + return "offset." + error; } + if (message.prove != null && message.hasOwnProperty("prove")) + if (typeof message.prove !== "boolean") + return "prove: boolean expected"; return null; }; /** - * Creates a GetIdentityBalanceAndRevisionResponseV0 message from a plain object. Also converts values to their respective internal types. + * Creates a GetIdentityKeysRequestV0 message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0 * @static * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} GetIdentityBalanceAndRevisionResponseV0 + * @returns {org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} GetIdentityKeysRequestV0 */ - GetIdentityBalanceAndRevisionResponseV0.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0) + GetIdentityKeysRequestV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0) return object; - var message = new $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0(); - if (object.balanceAndRevision != null) { - if (typeof object.balanceAndRevision !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.balanceAndRevision: object expected"); - message.balanceAndRevision = $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.fromObject(object.balanceAndRevision); + var message = new $root.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0(); + if (object.identityId != null) + if (typeof object.identityId === "string") + $util.base64.decode(object.identityId, message.identityId = $util.newBuffer($util.base64.length(object.identityId)), 0); + else if (object.identityId.length >= 0) + message.identityId = object.identityId; + if (object.requestType != null) { + if (typeof object.requestType !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.requestType: object expected"); + message.requestType = $root.org.dash.platform.dapi.v0.KeyRequestType.fromObject(object.requestType); } - if (object.proof != null) { - if (typeof object.proof !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.proof: object expected"); - message.proof = $root.org.dash.platform.dapi.v0.Proof.fromObject(object.proof); + if (object.limit != null) { + if (typeof object.limit !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.limit: object expected"); + message.limit = $root.google.protobuf.UInt32Value.fromObject(object.limit); } - if (object.metadata != null) { - if (typeof object.metadata !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.metadata: object expected"); - message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.fromObject(object.metadata); + if (object.offset != null) { + if (typeof object.offset !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.offset: object expected"); + message.offset = $root.google.protobuf.UInt32Value.fromObject(object.offset); } + if (object.prove != null) + message.prove = Boolean(object.prove); return message; }; /** - * Creates a plain object from a GetIdentityBalanceAndRevisionResponseV0 message. Also converts values to other types if specified. + * Creates a plain object from a GetIdentityKeysRequestV0 message. Also converts values to other types if specified. * @function toObject - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} message GetIdentityBalanceAndRevisionResponseV0 + * @param {org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} message GetIdentityKeysRequestV0 * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - GetIdentityBalanceAndRevisionResponseV0.toObject = function toObject(message, options) { + GetIdentityKeysRequestV0.toObject = function toObject(message, options) { if (!options) options = {}; var object = {}; - if (options.defaults) - object.metadata = null; - if (message.balanceAndRevision != null && message.hasOwnProperty("balanceAndRevision")) { - object.balanceAndRevision = $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.toObject(message.balanceAndRevision, options); - if (options.oneofs) - object.result = "balanceAndRevision"; - } - if (message.proof != null && message.hasOwnProperty("proof")) { - object.proof = $root.org.dash.platform.dapi.v0.Proof.toObject(message.proof, options); - if (options.oneofs) - object.result = "proof"; + if (options.defaults) { + if (options.bytes === String) + object.identityId = ""; + else { + object.identityId = []; + if (options.bytes !== Array) + object.identityId = $util.newBuffer(object.identityId); + } + object.requestType = null; + object.limit = null; + object.offset = null; + object.prove = false; } - if (message.metadata != null && message.hasOwnProperty("metadata")) - object.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.toObject(message.metadata, options); + if (message.identityId != null && message.hasOwnProperty("identityId")) + object.identityId = options.bytes === String ? $util.base64.encode(message.identityId, 0, message.identityId.length) : options.bytes === Array ? Array.prototype.slice.call(message.identityId) : message.identityId; + if (message.requestType != null && message.hasOwnProperty("requestType")) + object.requestType = $root.org.dash.platform.dapi.v0.KeyRequestType.toObject(message.requestType, options); + if (message.limit != null && message.hasOwnProperty("limit")) + object.limit = $root.google.protobuf.UInt32Value.toObject(message.limit, options); + if (message.offset != null && message.hasOwnProperty("offset")) + object.offset = $root.google.protobuf.UInt32Value.toObject(message.offset, options); + if (message.prove != null && message.hasOwnProperty("prove")) + object.prove = message.prove; return object; }; /** - * Converts this GetIdentityBalanceAndRevisionResponseV0 to JSON. + * Converts this GetIdentityKeysRequestV0 to JSON. * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0 + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0 * @instance * @returns {Object.} JSON object */ - GetIdentityBalanceAndRevisionResponseV0.prototype.toJSON = function toJSON() { + GetIdentityKeysRequestV0.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision = (function() { + return GetIdentityKeysRequestV0; + })(); - /** - * Properties of a BalanceAndRevision. - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0 - * @interface IBalanceAndRevision - * @property {number|Long|null} [balance] BalanceAndRevision balance - * @property {number|Long|null} [revision] BalanceAndRevision revision - */ - - /** - * Constructs a new BalanceAndRevision. - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0 - * @classdesc Represents a BalanceAndRevision. - * @implements IBalanceAndRevision - * @constructor - * @param {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.IBalanceAndRevision=} [properties] Properties to set - */ - function BalanceAndRevision(properties) { - if (properties) - for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) - if (properties[keys[i]] != null) - this[keys[i]] = properties[keys[i]]; - } - - /** - * BalanceAndRevision balance. - * @member {number|Long} balance - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision - * @instance - */ - BalanceAndRevision.prototype.balance = $util.Long ? $util.Long.fromBits(0,0,true) : 0; - - /** - * BalanceAndRevision revision. - * @member {number|Long} revision - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision - * @instance - */ - BalanceAndRevision.prototype.revision = $util.Long ? $util.Long.fromBits(0,0,true) : 0; - - /** - * Creates a new BalanceAndRevision instance using the specified properties. - * @function create - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision - * @static - * @param {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.IBalanceAndRevision=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} BalanceAndRevision instance - */ - BalanceAndRevision.create = function create(properties) { - return new BalanceAndRevision(properties); - }; - - /** - * Encodes the specified BalanceAndRevision message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.verify|verify} messages. - * @function encode - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision - * @static - * @param {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.IBalanceAndRevision} message BalanceAndRevision message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - BalanceAndRevision.encode = function encode(message, writer) { - if (!writer) - writer = $Writer.create(); - if (message.balance != null && Object.hasOwnProperty.call(message, "balance")) - writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.balance); - if (message.revision != null && Object.hasOwnProperty.call(message, "revision")) - writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.revision); - return writer; - }; - - /** - * Encodes the specified BalanceAndRevision message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.verify|verify} messages. - * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision - * @static - * @param {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.IBalanceAndRevision} message BalanceAndRevision message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - BalanceAndRevision.encodeDelimited = function encodeDelimited(message, writer) { - return this.encode(message, writer).ldelim(); - }; - - /** - * Decodes a BalanceAndRevision message from the specified reader or buffer. - * @function decode - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} BalanceAndRevision - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - BalanceAndRevision.decode = function decode(reader, length) { - if (!(reader instanceof $Reader)) - reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision(); - while (reader.pos < end) { - var tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - message.balance = reader.uint64(); - break; - case 2: - message.revision = reader.uint64(); - break; - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }; - - /** - * Decodes a BalanceAndRevision message from the specified reader or buffer, length delimited. - * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} BalanceAndRevision - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - BalanceAndRevision.decodeDelimited = function decodeDelimited(reader) { - if (!(reader instanceof $Reader)) - reader = new $Reader(reader); - return this.decode(reader, reader.uint32()); - }; - - /** - * Verifies a BalanceAndRevision message. - * @function verify - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision - * @static - * @param {Object.} message Plain object to verify - * @returns {string|null} `null` if valid, otherwise the reason why it is not - */ - BalanceAndRevision.verify = function verify(message) { - if (typeof message !== "object" || message === null) - return "object expected"; - if (message.balance != null && message.hasOwnProperty("balance")) - if (!$util.isInteger(message.balance) && !(message.balance && $util.isInteger(message.balance.low) && $util.isInteger(message.balance.high))) - return "balance: integer|Long expected"; - if (message.revision != null && message.hasOwnProperty("revision")) - if (!$util.isInteger(message.revision) && !(message.revision && $util.isInteger(message.revision.low) && $util.isInteger(message.revision.high))) - return "revision: integer|Long expected"; - return null; - }; - - /** - * Creates a BalanceAndRevision message from a plain object. Also converts values to their respective internal types. - * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision - * @static - * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} BalanceAndRevision - */ - BalanceAndRevision.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision) - return object; - var message = new $root.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision(); - if (object.balance != null) - if ($util.Long) - (message.balance = $util.Long.fromValue(object.balance)).unsigned = true; - else if (typeof object.balance === "string") - message.balance = parseInt(object.balance, 10); - else if (typeof object.balance === "number") - message.balance = object.balance; - else if (typeof object.balance === "object") - message.balance = new $util.LongBits(object.balance.low >>> 0, object.balance.high >>> 0).toNumber(true); - if (object.revision != null) - if ($util.Long) - (message.revision = $util.Long.fromValue(object.revision)).unsigned = true; - else if (typeof object.revision === "string") - message.revision = parseInt(object.revision, 10); - else if (typeof object.revision === "number") - message.revision = object.revision; - else if (typeof object.revision === "object") - message.revision = new $util.LongBits(object.revision.low >>> 0, object.revision.high >>> 0).toNumber(true); - return message; - }; - - /** - * Creates a plain object from a BalanceAndRevision message. Also converts values to other types if specified. - * @function toObject - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision - * @static - * @param {org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} message BalanceAndRevision - * @param {$protobuf.IConversionOptions} [options] Conversion options - * @returns {Object.} Plain object - */ - BalanceAndRevision.toObject = function toObject(message, options) { - if (!options) - options = {}; - var object = {}; - if (options.defaults) { - if ($util.Long) { - var long = new $util.Long(0, 0, true); - object.balance = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; - } else - object.balance = options.longs === String ? "0" : 0; - if ($util.Long) { - var long = new $util.Long(0, 0, true); - object.revision = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; - } else - object.revision = options.longs === String ? "0" : 0; - } - if (message.balance != null && message.hasOwnProperty("balance")) - if (typeof message.balance === "number") - object.balance = options.longs === String ? String(message.balance) : message.balance; - else - object.balance = options.longs === String ? $util.Long.prototype.toString.call(message.balance) : options.longs === Number ? new $util.LongBits(message.balance.low >>> 0, message.balance.high >>> 0).toNumber(true) : message.balance; - if (message.revision != null && message.hasOwnProperty("revision")) - if (typeof message.revision === "number") - object.revision = options.longs === String ? String(message.revision) : message.revision; - else - object.revision = options.longs === String ? $util.Long.prototype.toString.call(message.revision) : options.longs === Number ? new $util.LongBits(message.revision.low >>> 0, message.revision.high >>> 0).toNumber(true) : message.revision; - return object; - }; - - /** - * Converts this BalanceAndRevision to JSON. - * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision - * @instance - * @returns {Object.} JSON object - */ - BalanceAndRevision.prototype.toJSON = function toJSON() { - return this.constructor.toObject(this, $protobuf.util.toJSONOptions); - }; - - return BalanceAndRevision; - })(); - - return GetIdentityBalanceAndRevisionResponseV0; - })(); - - return GetIdentityBalanceAndRevisionResponse; + return GetIdentityKeysRequest; })(); - v0.KeyRequestType = (function() { + v0.GetIdentityKeysResponse = (function() { /** - * Properties of a KeyRequestType. + * Properties of a GetIdentityKeysResponse. * @memberof org.dash.platform.dapi.v0 - * @interface IKeyRequestType - * @property {org.dash.platform.dapi.v0.IAllKeys|null} [allKeys] KeyRequestType allKeys - * @property {org.dash.platform.dapi.v0.ISpecificKeys|null} [specificKeys] KeyRequestType specificKeys - * @property {org.dash.platform.dapi.v0.ISearchKey|null} [searchKey] KeyRequestType searchKey + * @interface IGetIdentityKeysResponse + * @property {org.dash.platform.dapi.v0.GetIdentityKeysResponse.IGetIdentityKeysResponseV0|null} [v0] GetIdentityKeysResponse v0 */ /** - * Constructs a new KeyRequestType. + * Constructs a new GetIdentityKeysResponse. * @memberof org.dash.platform.dapi.v0 - * @classdesc Represents a KeyRequestType. - * @implements IKeyRequestType + * @classdesc Represents a GetIdentityKeysResponse. + * @implements IGetIdentityKeysResponse * @constructor - * @param {org.dash.platform.dapi.v0.IKeyRequestType=} [properties] Properties to set + * @param {org.dash.platform.dapi.v0.IGetIdentityKeysResponse=} [properties] Properties to set */ - function KeyRequestType(properties) { + function GetIdentityKeysResponse(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -8466,115 +8546,89 @@ $root.org = (function() { } /** - * KeyRequestType allKeys. - * @member {org.dash.platform.dapi.v0.IAllKeys|null|undefined} allKeys - * @memberof org.dash.platform.dapi.v0.KeyRequestType - * @instance - */ - KeyRequestType.prototype.allKeys = null; - - /** - * KeyRequestType specificKeys. - * @member {org.dash.platform.dapi.v0.ISpecificKeys|null|undefined} specificKeys - * @memberof org.dash.platform.dapi.v0.KeyRequestType - * @instance - */ - KeyRequestType.prototype.specificKeys = null; - - /** - * KeyRequestType searchKey. - * @member {org.dash.platform.dapi.v0.ISearchKey|null|undefined} searchKey - * @memberof org.dash.platform.dapi.v0.KeyRequestType + * GetIdentityKeysResponse v0. + * @member {org.dash.platform.dapi.v0.GetIdentityKeysResponse.IGetIdentityKeysResponseV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse * @instance */ - KeyRequestType.prototype.searchKey = null; + GetIdentityKeysResponse.prototype.v0 = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** - * KeyRequestType request. - * @member {"allKeys"|"specificKeys"|"searchKey"|undefined} request - * @memberof org.dash.platform.dapi.v0.KeyRequestType + * GetIdentityKeysResponse version. + * @member {"v0"|undefined} version + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse * @instance */ - Object.defineProperty(KeyRequestType.prototype, "request", { - get: $util.oneOfGetter($oneOfFields = ["allKeys", "specificKeys", "searchKey"]), + Object.defineProperty(GetIdentityKeysResponse.prototype, "version", { + get: $util.oneOfGetter($oneOfFields = ["v0"]), set: $util.oneOfSetter($oneOfFields) }); /** - * Creates a new KeyRequestType instance using the specified properties. + * Creates a new GetIdentityKeysResponse instance using the specified properties. * @function create - * @memberof org.dash.platform.dapi.v0.KeyRequestType + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse * @static - * @param {org.dash.platform.dapi.v0.IKeyRequestType=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.KeyRequestType} KeyRequestType instance + * @param {org.dash.platform.dapi.v0.IGetIdentityKeysResponse=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentityKeysResponse} GetIdentityKeysResponse instance */ - KeyRequestType.create = function create(properties) { - return new KeyRequestType(properties); + GetIdentityKeysResponse.create = function create(properties) { + return new GetIdentityKeysResponse(properties); }; /** - * Encodes the specified KeyRequestType message. Does not implicitly {@link org.dash.platform.dapi.v0.KeyRequestType.verify|verify} messages. + * Encodes the specified GetIdentityKeysResponse message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityKeysResponse.verify|verify} messages. * @function encode - * @memberof org.dash.platform.dapi.v0.KeyRequestType + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse * @static - * @param {org.dash.platform.dapi.v0.IKeyRequestType} message KeyRequestType message or plain object to encode + * @param {org.dash.platform.dapi.v0.IGetIdentityKeysResponse} message GetIdentityKeysResponse message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - KeyRequestType.encode = function encode(message, writer) { + GetIdentityKeysResponse.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.allKeys != null && Object.hasOwnProperty.call(message, "allKeys")) - $root.org.dash.platform.dapi.v0.AllKeys.encode(message.allKeys, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); - if (message.specificKeys != null && Object.hasOwnProperty.call(message, "specificKeys")) - $root.org.dash.platform.dapi.v0.SpecificKeys.encode(message.specificKeys, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); - if (message.searchKey != null && Object.hasOwnProperty.call(message, "searchKey")) - $root.org.dash.platform.dapi.v0.SearchKey.encode(message.searchKey, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) + $root.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); return writer; }; /** - * Encodes the specified KeyRequestType message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.KeyRequestType.verify|verify} messages. + * Encodes the specified GetIdentityKeysResponse message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityKeysResponse.verify|verify} messages. * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.KeyRequestType + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse * @static - * @param {org.dash.platform.dapi.v0.IKeyRequestType} message KeyRequestType message or plain object to encode + * @param {org.dash.platform.dapi.v0.IGetIdentityKeysResponse} message GetIdentityKeysResponse message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - KeyRequestType.encodeDelimited = function encodeDelimited(message, writer) { + GetIdentityKeysResponse.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a KeyRequestType message from the specified reader or buffer. + * Decodes a GetIdentityKeysResponse message from the specified reader or buffer. * @function decode - * @memberof org.dash.platform.dapi.v0.KeyRequestType + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.KeyRequestType} KeyRequestType + * @returns {org.dash.platform.dapi.v0.GetIdentityKeysResponse} GetIdentityKeysResponse * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - KeyRequestType.decode = function decode(reader, length) { + GetIdentityKeysResponse.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.KeyRequestType(); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityKeysResponse(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { case 1: - message.allKeys = $root.org.dash.platform.dapi.v0.AllKeys.decode(reader, reader.uint32()); - break; - case 2: - message.specificKeys = $root.org.dash.platform.dapi.v0.SpecificKeys.decode(reader, reader.uint32()); - break; - case 3: - message.searchKey = $root.org.dash.platform.dapi.v0.SearchKey.decode(reader, reader.uint32()); + message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.decode(reader, reader.uint32()); break; default: reader.skipType(tag & 7); @@ -8585,529 +8639,596 @@ $root.org = (function() { }; /** - * Decodes a KeyRequestType message from the specified reader or buffer, length delimited. + * Decodes a GetIdentityKeysResponse message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.KeyRequestType + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.KeyRequestType} KeyRequestType + * @returns {org.dash.platform.dapi.v0.GetIdentityKeysResponse} GetIdentityKeysResponse * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - KeyRequestType.decodeDelimited = function decodeDelimited(reader) { + GetIdentityKeysResponse.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a KeyRequestType message. + * Verifies a GetIdentityKeysResponse message. * @function verify - * @memberof org.dash.platform.dapi.v0.KeyRequestType + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - KeyRequestType.verify = function verify(message) { + GetIdentityKeysResponse.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; var properties = {}; - if (message.allKeys != null && message.hasOwnProperty("allKeys")) { - properties.request = 1; - { - var error = $root.org.dash.platform.dapi.v0.AllKeys.verify(message.allKeys); - if (error) - return "allKeys." + error; - } - } - if (message.specificKeys != null && message.hasOwnProperty("specificKeys")) { - if (properties.request === 1) - return "request: multiple values"; - properties.request = 1; - { - var error = $root.org.dash.platform.dapi.v0.SpecificKeys.verify(message.specificKeys); - if (error) - return "specificKeys." + error; - } - } - if (message.searchKey != null && message.hasOwnProperty("searchKey")) { - if (properties.request === 1) - return "request: multiple values"; - properties.request = 1; + if (message.v0 != null && message.hasOwnProperty("v0")) { + properties.version = 1; { - var error = $root.org.dash.platform.dapi.v0.SearchKey.verify(message.searchKey); + var error = $root.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.verify(message.v0); if (error) - return "searchKey." + error; + return "v0." + error; } } return null; }; /** - * Creates a KeyRequestType message from a plain object. Also converts values to their respective internal types. + * Creates a GetIdentityKeysResponse message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof org.dash.platform.dapi.v0.KeyRequestType + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse * @static * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.KeyRequestType} KeyRequestType + * @returns {org.dash.platform.dapi.v0.GetIdentityKeysResponse} GetIdentityKeysResponse */ - KeyRequestType.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.KeyRequestType) + GetIdentityKeysResponse.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityKeysResponse) return object; - var message = new $root.org.dash.platform.dapi.v0.KeyRequestType(); - if (object.allKeys != null) { - if (typeof object.allKeys !== "object") - throw TypeError(".org.dash.platform.dapi.v0.KeyRequestType.allKeys: object expected"); - message.allKeys = $root.org.dash.platform.dapi.v0.AllKeys.fromObject(object.allKeys); - } - if (object.specificKeys != null) { - if (typeof object.specificKeys !== "object") - throw TypeError(".org.dash.platform.dapi.v0.KeyRequestType.specificKeys: object expected"); - message.specificKeys = $root.org.dash.platform.dapi.v0.SpecificKeys.fromObject(object.specificKeys); - } - if (object.searchKey != null) { - if (typeof object.searchKey !== "object") - throw TypeError(".org.dash.platform.dapi.v0.KeyRequestType.searchKey: object expected"); - message.searchKey = $root.org.dash.platform.dapi.v0.SearchKey.fromObject(object.searchKey); + var message = new $root.org.dash.platform.dapi.v0.GetIdentityKeysResponse(); + if (object.v0 != null) { + if (typeof object.v0 !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityKeysResponse.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.fromObject(object.v0); } return message; }; /** - * Creates a plain object from a KeyRequestType message. Also converts values to other types if specified. + * Creates a plain object from a GetIdentityKeysResponse message. Also converts values to other types if specified. * @function toObject - * @memberof org.dash.platform.dapi.v0.KeyRequestType + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse * @static - * @param {org.dash.platform.dapi.v0.KeyRequestType} message KeyRequestType + * @param {org.dash.platform.dapi.v0.GetIdentityKeysResponse} message GetIdentityKeysResponse * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - KeyRequestType.toObject = function toObject(message, options) { + GetIdentityKeysResponse.toObject = function toObject(message, options) { if (!options) options = {}; var object = {}; - if (message.allKeys != null && message.hasOwnProperty("allKeys")) { - object.allKeys = $root.org.dash.platform.dapi.v0.AllKeys.toObject(message.allKeys, options); - if (options.oneofs) - object.request = "allKeys"; - } - if (message.specificKeys != null && message.hasOwnProperty("specificKeys")) { - object.specificKeys = $root.org.dash.platform.dapi.v0.SpecificKeys.toObject(message.specificKeys, options); - if (options.oneofs) - object.request = "specificKeys"; - } - if (message.searchKey != null && message.hasOwnProperty("searchKey")) { - object.searchKey = $root.org.dash.platform.dapi.v0.SearchKey.toObject(message.searchKey, options); + if (message.v0 != null && message.hasOwnProperty("v0")) { + object.v0 = $root.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.toObject(message.v0, options); if (options.oneofs) - object.request = "searchKey"; + object.version = "v0"; } return object; }; /** - * Converts this KeyRequestType to JSON. + * Converts this GetIdentityKeysResponse to JSON. * @function toJSON - * @memberof org.dash.platform.dapi.v0.KeyRequestType + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse * @instance * @returns {Object.} JSON object */ - KeyRequestType.prototype.toJSON = function toJSON() { + GetIdentityKeysResponse.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - return KeyRequestType; - })(); - - v0.AllKeys = (function() { + GetIdentityKeysResponse.GetIdentityKeysResponseV0 = (function() { - /** - * Properties of an AllKeys. - * @memberof org.dash.platform.dapi.v0 - * @interface IAllKeys - */ + /** + * Properties of a GetIdentityKeysResponseV0. + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse + * @interface IGetIdentityKeysResponseV0 + * @property {org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.IKeys|null} [keys] GetIdentityKeysResponseV0 keys + * @property {org.dash.platform.dapi.v0.IProof|null} [proof] GetIdentityKeysResponseV0 proof + * @property {org.dash.platform.dapi.v0.IResponseMetadata|null} [metadata] GetIdentityKeysResponseV0 metadata + */ - /** - * Constructs a new AllKeys. - * @memberof org.dash.platform.dapi.v0 - * @classdesc Represents an AllKeys. - * @implements IAllKeys - * @constructor - * @param {org.dash.platform.dapi.v0.IAllKeys=} [properties] Properties to set - */ - function AllKeys(properties) { - if (properties) - for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) - if (properties[keys[i]] != null) - this[keys[i]] = properties[keys[i]]; - } + /** + * Constructs a new GetIdentityKeysResponseV0. + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse + * @classdesc Represents a GetIdentityKeysResponseV0. + * @implements IGetIdentityKeysResponseV0 + * @constructor + * @param {org.dash.platform.dapi.v0.GetIdentityKeysResponse.IGetIdentityKeysResponseV0=} [properties] Properties to set + */ + function GetIdentityKeysResponseV0(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } - /** - * Creates a new AllKeys instance using the specified properties. - * @function create - * @memberof org.dash.platform.dapi.v0.AllKeys - * @static - * @param {org.dash.platform.dapi.v0.IAllKeys=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.AllKeys} AllKeys instance - */ - AllKeys.create = function create(properties) { - return new AllKeys(properties); - }; + /** + * GetIdentityKeysResponseV0 keys. + * @member {org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.IKeys|null|undefined} keys + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0 + * @instance + */ + GetIdentityKeysResponseV0.prototype.keys = null; - /** - * Encodes the specified AllKeys message. Does not implicitly {@link org.dash.platform.dapi.v0.AllKeys.verify|verify} messages. - * @function encode - * @memberof org.dash.platform.dapi.v0.AllKeys - * @static - * @param {org.dash.platform.dapi.v0.IAllKeys} message AllKeys message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - AllKeys.encode = function encode(message, writer) { - if (!writer) - writer = $Writer.create(); - return writer; - }; - - /** - * Encodes the specified AllKeys message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.AllKeys.verify|verify} messages. - * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.AllKeys - * @static - * @param {org.dash.platform.dapi.v0.IAllKeys} message AllKeys message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - AllKeys.encodeDelimited = function encodeDelimited(message, writer) { - return this.encode(message, writer).ldelim(); - }; - - /** - * Decodes an AllKeys message from the specified reader or buffer. - * @function decode - * @memberof org.dash.platform.dapi.v0.AllKeys - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.AllKeys} AllKeys - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - AllKeys.decode = function decode(reader, length) { - if (!(reader instanceof $Reader)) - reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.AllKeys(); - while (reader.pos < end) { - var tag = reader.uint32(); - switch (tag >>> 3) { - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }; + /** + * GetIdentityKeysResponseV0 proof. + * @member {org.dash.platform.dapi.v0.IProof|null|undefined} proof + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0 + * @instance + */ + GetIdentityKeysResponseV0.prototype.proof = null; - /** - * Decodes an AllKeys message from the specified reader or buffer, length delimited. - * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.AllKeys - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.AllKeys} AllKeys - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - AllKeys.decodeDelimited = function decodeDelimited(reader) { - if (!(reader instanceof $Reader)) - reader = new $Reader(reader); - return this.decode(reader, reader.uint32()); - }; + /** + * GetIdentityKeysResponseV0 metadata. + * @member {org.dash.platform.dapi.v0.IResponseMetadata|null|undefined} metadata + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0 + * @instance + */ + GetIdentityKeysResponseV0.prototype.metadata = null; - /** - * Verifies an AllKeys message. - * @function verify - * @memberof org.dash.platform.dapi.v0.AllKeys - * @static - * @param {Object.} message Plain object to verify - * @returns {string|null} `null` if valid, otherwise the reason why it is not - */ - AllKeys.verify = function verify(message) { - if (typeof message !== "object" || message === null) - return "object expected"; - return null; - }; + // OneOf field names bound to virtual getters and setters + var $oneOfFields; - /** - * Creates an AllKeys message from a plain object. Also converts values to their respective internal types. - * @function fromObject - * @memberof org.dash.platform.dapi.v0.AllKeys - * @static - * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.AllKeys} AllKeys - */ - AllKeys.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.AllKeys) - return object; - return new $root.org.dash.platform.dapi.v0.AllKeys(); - }; + /** + * GetIdentityKeysResponseV0 result. + * @member {"keys"|"proof"|undefined} result + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0 + * @instance + */ + Object.defineProperty(GetIdentityKeysResponseV0.prototype, "result", { + get: $util.oneOfGetter($oneOfFields = ["keys", "proof"]), + set: $util.oneOfSetter($oneOfFields) + }); - /** - * Creates a plain object from an AllKeys message. Also converts values to other types if specified. - * @function toObject - * @memberof org.dash.platform.dapi.v0.AllKeys - * @static - * @param {org.dash.platform.dapi.v0.AllKeys} message AllKeys - * @param {$protobuf.IConversionOptions} [options] Conversion options - * @returns {Object.} Plain object - */ - AllKeys.toObject = function toObject() { - return {}; - }; + /** + * Creates a new GetIdentityKeysResponseV0 instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityKeysResponse.IGetIdentityKeysResponseV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} GetIdentityKeysResponseV0 instance + */ + GetIdentityKeysResponseV0.create = function create(properties) { + return new GetIdentityKeysResponseV0(properties); + }; - /** - * Converts this AllKeys to JSON. - * @function toJSON - * @memberof org.dash.platform.dapi.v0.AllKeys - * @instance - * @returns {Object.} JSON object - */ - AllKeys.prototype.toJSON = function toJSON() { - return this.constructor.toObject(this, $protobuf.util.toJSONOptions); - }; + /** + * Encodes the specified GetIdentityKeysResponseV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityKeysResponse.IGetIdentityKeysResponseV0} message GetIdentityKeysResponseV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentityKeysResponseV0.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.keys != null && Object.hasOwnProperty.call(message, "keys")) + $root.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.encode(message.keys, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.proof != null && Object.hasOwnProperty.call(message, "proof")) + $root.org.dash.platform.dapi.v0.Proof.encode(message.proof, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.metadata != null && Object.hasOwnProperty.call(message, "metadata")) + $root.org.dash.platform.dapi.v0.ResponseMetadata.encode(message.metadata, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + return writer; + }; - return AllKeys; - })(); + /** + * Encodes the specified GetIdentityKeysResponseV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityKeysResponse.IGetIdentityKeysResponseV0} message GetIdentityKeysResponseV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentityKeysResponseV0.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; - v0.SpecificKeys = (function() { + /** + * Decodes a GetIdentityKeysResponseV0 message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} GetIdentityKeysResponseV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetIdentityKeysResponseV0.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.keys = $root.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.decode(reader, reader.uint32()); + break; + case 2: + message.proof = $root.org.dash.platform.dapi.v0.Proof.decode(reader, reader.uint32()); + break; + case 3: + message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; - /** - * Properties of a SpecificKeys. - * @memberof org.dash.platform.dapi.v0 - * @interface ISpecificKeys - * @property {Array.|null} [keyIds] SpecificKeys keyIds - */ + /** + * Decodes a GetIdentityKeysResponseV0 message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} GetIdentityKeysResponseV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetIdentityKeysResponseV0.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; - /** - * Constructs a new SpecificKeys. - * @memberof org.dash.platform.dapi.v0 - * @classdesc Represents a SpecificKeys. - * @implements ISpecificKeys - * @constructor - * @param {org.dash.platform.dapi.v0.ISpecificKeys=} [properties] Properties to set - */ - function SpecificKeys(properties) { - this.keyIds = []; - if (properties) - for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) - if (properties[keys[i]] != null) - this[keys[i]] = properties[keys[i]]; - } + /** + * Verifies a GetIdentityKeysResponseV0 message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0 + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetIdentityKeysResponseV0.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.keys != null && message.hasOwnProperty("keys")) { + properties.result = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.verify(message.keys); + if (error) + return "keys." + error; + } + } + if (message.proof != null && message.hasOwnProperty("proof")) { + if (properties.result === 1) + return "result: multiple values"; + properties.result = 1; + { + var error = $root.org.dash.platform.dapi.v0.Proof.verify(message.proof); + if (error) + return "proof." + error; + } + } + if (message.metadata != null && message.hasOwnProperty("metadata")) { + var error = $root.org.dash.platform.dapi.v0.ResponseMetadata.verify(message.metadata); + if (error) + return "metadata." + error; + } + return null; + }; - /** - * SpecificKeys keyIds. - * @member {Array.} keyIds - * @memberof org.dash.platform.dapi.v0.SpecificKeys - * @instance - */ - SpecificKeys.prototype.keyIds = $util.emptyArray; + /** + * Creates a GetIdentityKeysResponseV0 message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0 + * @static + * @param {Object.} object Plain object + * @returns {org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} GetIdentityKeysResponseV0 + */ + GetIdentityKeysResponseV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0(); + if (object.keys != null) { + if (typeof object.keys !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.keys: object expected"); + message.keys = $root.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.fromObject(object.keys); + } + if (object.proof != null) { + if (typeof object.proof !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.proof: object expected"); + message.proof = $root.org.dash.platform.dapi.v0.Proof.fromObject(object.proof); + } + if (object.metadata != null) { + if (typeof object.metadata !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.metadata: object expected"); + message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.fromObject(object.metadata); + } + return message; + }; - /** - * Creates a new SpecificKeys instance using the specified properties. - * @function create - * @memberof org.dash.platform.dapi.v0.SpecificKeys - * @static - * @param {org.dash.platform.dapi.v0.ISpecificKeys=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.SpecificKeys} SpecificKeys instance - */ - SpecificKeys.create = function create(properties) { - return new SpecificKeys(properties); - }; + /** + * Creates a plain object from a GetIdentityKeysResponseV0 message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} message GetIdentityKeysResponseV0 + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + GetIdentityKeysResponseV0.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.metadata = null; + if (message.keys != null && message.hasOwnProperty("keys")) { + object.keys = $root.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.toObject(message.keys, options); + if (options.oneofs) + object.result = "keys"; + } + if (message.proof != null && message.hasOwnProperty("proof")) { + object.proof = $root.org.dash.platform.dapi.v0.Proof.toObject(message.proof, options); + if (options.oneofs) + object.result = "proof"; + } + if (message.metadata != null && message.hasOwnProperty("metadata")) + object.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.toObject(message.metadata, options); + return object; + }; - /** - * Encodes the specified SpecificKeys message. Does not implicitly {@link org.dash.platform.dapi.v0.SpecificKeys.verify|verify} messages. - * @function encode - * @memberof org.dash.platform.dapi.v0.SpecificKeys - * @static - * @param {org.dash.platform.dapi.v0.ISpecificKeys} message SpecificKeys message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - SpecificKeys.encode = function encode(message, writer) { - if (!writer) - writer = $Writer.create(); - if (message.keyIds != null && message.keyIds.length) { - writer.uint32(/* id 1, wireType 2 =*/10).fork(); - for (var i = 0; i < message.keyIds.length; ++i) - writer.uint32(message.keyIds[i]); - writer.ldelim(); - } - return writer; - }; + /** + * Converts this GetIdentityKeysResponseV0 to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0 + * @instance + * @returns {Object.} JSON object + */ + GetIdentityKeysResponseV0.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; - /** - * Encodes the specified SpecificKeys message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.SpecificKeys.verify|verify} messages. - * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.SpecificKeys - * @static - * @param {org.dash.platform.dapi.v0.ISpecificKeys} message SpecificKeys message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - SpecificKeys.encodeDelimited = function encodeDelimited(message, writer) { - return this.encode(message, writer).ldelim(); - }; + GetIdentityKeysResponseV0.Keys = (function() { - /** - * Decodes a SpecificKeys message from the specified reader or buffer. - * @function decode - * @memberof org.dash.platform.dapi.v0.SpecificKeys - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.SpecificKeys} SpecificKeys - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - SpecificKeys.decode = function decode(reader, length) { - if (!(reader instanceof $Reader)) - reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.SpecificKeys(); - while (reader.pos < end) { - var tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (!(message.keyIds && message.keyIds.length)) - message.keyIds = []; - if ((tag & 7) === 2) { - var end2 = reader.uint32() + reader.pos; - while (reader.pos < end2) - message.keyIds.push(reader.uint32()); - } else - message.keyIds.push(reader.uint32()); - break; - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }; + /** + * Properties of a Keys. + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0 + * @interface IKeys + * @property {Array.|null} [keysBytes] Keys keysBytes + */ - /** - * Decodes a SpecificKeys message from the specified reader or buffer, length delimited. - * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.SpecificKeys - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.SpecificKeys} SpecificKeys - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - SpecificKeys.decodeDelimited = function decodeDelimited(reader) { - if (!(reader instanceof $Reader)) - reader = new $Reader(reader); - return this.decode(reader, reader.uint32()); - }; + /** + * Constructs a new Keys. + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0 + * @classdesc Represents a Keys. + * @implements IKeys + * @constructor + * @param {org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.IKeys=} [properties] Properties to set + */ + function Keys(properties) { + this.keysBytes = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } - /** - * Verifies a SpecificKeys message. - * @function verify - * @memberof org.dash.platform.dapi.v0.SpecificKeys - * @static - * @param {Object.} message Plain object to verify - * @returns {string|null} `null` if valid, otherwise the reason why it is not - */ - SpecificKeys.verify = function verify(message) { - if (typeof message !== "object" || message === null) - return "object expected"; - if (message.keyIds != null && message.hasOwnProperty("keyIds")) { - if (!Array.isArray(message.keyIds)) - return "keyIds: array expected"; - for (var i = 0; i < message.keyIds.length; ++i) - if (!$util.isInteger(message.keyIds[i])) - return "keyIds: integer[] expected"; - } - return null; - }; + /** + * Keys keysBytes. + * @member {Array.} keysBytes + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys + * @instance + */ + Keys.prototype.keysBytes = $util.emptyArray; - /** - * Creates a SpecificKeys message from a plain object. Also converts values to their respective internal types. - * @function fromObject - * @memberof org.dash.platform.dapi.v0.SpecificKeys - * @static - * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.SpecificKeys} SpecificKeys - */ - SpecificKeys.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.SpecificKeys) - return object; - var message = new $root.org.dash.platform.dapi.v0.SpecificKeys(); - if (object.keyIds) { - if (!Array.isArray(object.keyIds)) - throw TypeError(".org.dash.platform.dapi.v0.SpecificKeys.keyIds: array expected"); - message.keyIds = []; - for (var i = 0; i < object.keyIds.length; ++i) - message.keyIds[i] = object.keyIds[i] >>> 0; - } - return message; - }; + /** + * Creates a new Keys instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.IKeys=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} Keys instance + */ + Keys.create = function create(properties) { + return new Keys(properties); + }; - /** - * Creates a plain object from a SpecificKeys message. Also converts values to other types if specified. - * @function toObject - * @memberof org.dash.platform.dapi.v0.SpecificKeys - * @static - * @param {org.dash.platform.dapi.v0.SpecificKeys} message SpecificKeys - * @param {$protobuf.IConversionOptions} [options] Conversion options - * @returns {Object.} Plain object - */ - SpecificKeys.toObject = function toObject(message, options) { - if (!options) - options = {}; - var object = {}; - if (options.arrays || options.defaults) - object.keyIds = []; - if (message.keyIds && message.keyIds.length) { - object.keyIds = []; - for (var j = 0; j < message.keyIds.length; ++j) - object.keyIds[j] = message.keyIds[j]; - } - return object; - }; + /** + * Encodes the specified Keys message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.IKeys} message Keys message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Keys.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.keysBytes != null && message.keysBytes.length) + for (var i = 0; i < message.keysBytes.length; ++i) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.keysBytes[i]); + return writer; + }; - /** - * Converts this SpecificKeys to JSON. - * @function toJSON - * @memberof org.dash.platform.dapi.v0.SpecificKeys - * @instance - * @returns {Object.} JSON object - */ - SpecificKeys.prototype.toJSON = function toJSON() { - return this.constructor.toObject(this, $protobuf.util.toJSONOptions); - }; + /** + * Encodes the specified Keys message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.IKeys} message Keys message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Keys.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; - return SpecificKeys; + /** + * Decodes a Keys message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} Keys + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Keys.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (!(message.keysBytes && message.keysBytes.length)) + message.keysBytes = []; + message.keysBytes.push(reader.bytes()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a Keys message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} Keys + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Keys.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a Keys message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + Keys.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.keysBytes != null && message.hasOwnProperty("keysBytes")) { + if (!Array.isArray(message.keysBytes)) + return "keysBytes: array expected"; + for (var i = 0; i < message.keysBytes.length; ++i) + if (!(message.keysBytes[i] && typeof message.keysBytes[i].length === "number" || $util.isString(message.keysBytes[i]))) + return "keysBytes: buffer[] expected"; + } + return null; + }; + + /** + * Creates a Keys message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys + * @static + * @param {Object.} object Plain object + * @returns {org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} Keys + */ + Keys.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys(); + if (object.keysBytes) { + if (!Array.isArray(object.keysBytes)) + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.keysBytes: array expected"); + message.keysBytes = []; + for (var i = 0; i < object.keysBytes.length; ++i) + if (typeof object.keysBytes[i] === "string") + $util.base64.decode(object.keysBytes[i], message.keysBytes[i] = $util.newBuffer($util.base64.length(object.keysBytes[i])), 0); + else if (object.keysBytes[i].length >= 0) + message.keysBytes[i] = object.keysBytes[i]; + } + return message; + }; + + /** + * Creates a plain object from a Keys message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} message Keys + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + Keys.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.keysBytes = []; + if (message.keysBytes && message.keysBytes.length) { + object.keysBytes = []; + for (var j = 0; j < message.keysBytes.length; ++j) + object.keysBytes[j] = options.bytes === String ? $util.base64.encode(message.keysBytes[j], 0, message.keysBytes[j].length) : options.bytes === Array ? Array.prototype.slice.call(message.keysBytes[j]) : message.keysBytes[j]; + } + return object; + }; + + /** + * Converts this Keys to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys + * @instance + * @returns {Object.} JSON object + */ + Keys.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return Keys; + })(); + + return GetIdentityKeysResponseV0; + })(); + + return GetIdentityKeysResponse; })(); - v0.SearchKey = (function() { + v0.GetIdentitiesContractKeysRequest = (function() { /** - * Properties of a SearchKey. + * Properties of a GetIdentitiesContractKeysRequest. * @memberof org.dash.platform.dapi.v0 - * @interface ISearchKey - * @property {Object.|null} [purposeMap] SearchKey purposeMap + * @interface IGetIdentitiesContractKeysRequest + * @property {org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.IGetIdentitiesContractKeysRequestV0|null} [v0] GetIdentitiesContractKeysRequest v0 */ /** - * Constructs a new SearchKey. + * Constructs a new GetIdentitiesContractKeysRequest. * @memberof org.dash.platform.dapi.v0 - * @classdesc Represents a SearchKey. - * @implements ISearchKey + * @classdesc Represents a GetIdentitiesContractKeysRequest. + * @implements IGetIdentitiesContractKeysRequest * @constructor - * @param {org.dash.platform.dapi.v0.ISearchKey=} [properties] Properties to set + * @param {org.dash.platform.dapi.v0.IGetIdentitiesContractKeysRequest=} [properties] Properties to set */ - function SearchKey(properties) { - this.purposeMap = {}; + function GetIdentitiesContractKeysRequest(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -9115,97 +9236,89 @@ $root.org = (function() { } /** - * SearchKey purposeMap. - * @member {Object.} purposeMap - * @memberof org.dash.platform.dapi.v0.SearchKey + * GetIdentitiesContractKeysRequest v0. + * @member {org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.IGetIdentitiesContractKeysRequestV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest * @instance */ - SearchKey.prototype.purposeMap = $util.emptyObject; + GetIdentitiesContractKeysRequest.prototype.v0 = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; /** - * Creates a new SearchKey instance using the specified properties. + * GetIdentitiesContractKeysRequest version. + * @member {"v0"|undefined} version + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest + * @instance + */ + Object.defineProperty(GetIdentitiesContractKeysRequest.prototype, "version", { + get: $util.oneOfGetter($oneOfFields = ["v0"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetIdentitiesContractKeysRequest instance using the specified properties. * @function create - * @memberof org.dash.platform.dapi.v0.SearchKey + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest * @static - * @param {org.dash.platform.dapi.v0.ISearchKey=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.SearchKey} SearchKey instance + * @param {org.dash.platform.dapi.v0.IGetIdentitiesContractKeysRequest=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest} GetIdentitiesContractKeysRequest instance */ - SearchKey.create = function create(properties) { - return new SearchKey(properties); + GetIdentitiesContractKeysRequest.create = function create(properties) { + return new GetIdentitiesContractKeysRequest(properties); }; /** - * Encodes the specified SearchKey message. Does not implicitly {@link org.dash.platform.dapi.v0.SearchKey.verify|verify} messages. + * Encodes the specified GetIdentitiesContractKeysRequest message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.verify|verify} messages. * @function encode - * @memberof org.dash.platform.dapi.v0.SearchKey + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest * @static - * @param {org.dash.platform.dapi.v0.ISearchKey} message SearchKey message or plain object to encode + * @param {org.dash.platform.dapi.v0.IGetIdentitiesContractKeysRequest} message GetIdentitiesContractKeysRequest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - SearchKey.encode = function encode(message, writer) { + GetIdentitiesContractKeysRequest.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.purposeMap != null && Object.hasOwnProperty.call(message, "purposeMap")) - for (var keys = Object.keys(message.purposeMap), i = 0; i < keys.length; ++i) { - writer.uint32(/* id 1, wireType 2 =*/10).fork().uint32(/* id 1, wireType 0 =*/8).uint32(keys[i]); - $root.org.dash.platform.dapi.v0.SecurityLevelMap.encode(message.purposeMap[keys[i]], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim().ldelim(); - } + if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) + $root.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); return writer; }; /** - * Encodes the specified SearchKey message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.SearchKey.verify|verify} messages. + * Encodes the specified GetIdentitiesContractKeysRequest message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.verify|verify} messages. * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.SearchKey + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest * @static - * @param {org.dash.platform.dapi.v0.ISearchKey} message SearchKey message or plain object to encode + * @param {org.dash.platform.dapi.v0.IGetIdentitiesContractKeysRequest} message GetIdentitiesContractKeysRequest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - SearchKey.encodeDelimited = function encodeDelimited(message, writer) { + GetIdentitiesContractKeysRequest.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a SearchKey message from the specified reader or buffer. + * Decodes a GetIdentitiesContractKeysRequest message from the specified reader or buffer. * @function decode - * @memberof org.dash.platform.dapi.v0.SearchKey + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.SearchKey} SearchKey + * @returns {org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest} GetIdentitiesContractKeysRequest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - SearchKey.decode = function decode(reader, length) { + GetIdentitiesContractKeysRequest.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.SearchKey(), key, value; + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { case 1: - if (message.purposeMap === $util.emptyObject) - message.purposeMap = {}; - var end2 = reader.uint32() + reader.pos; - key = 0; - value = null; - while (reader.pos < end2) { - var tag2 = reader.uint32(); - switch (tag2 >>> 3) { - case 1: - key = reader.uint32(); - break; - case 2: - value = $root.org.dash.platform.dapi.v0.SecurityLevelMap.decode(reader, reader.uint32()); - break; - default: - reader.skipType(tag2 & 7); - break; - } - } - message.purposeMap[key] = value; + message.v0 = $root.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.decode(reader, reader.uint32()); break; default: reader.skipType(tag & 7); @@ -9216,383 +9329,477 @@ $root.org = (function() { }; /** - * Decodes a SearchKey message from the specified reader or buffer, length delimited. + * Decodes a GetIdentitiesContractKeysRequest message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.SearchKey + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.SearchKey} SearchKey + * @returns {org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest} GetIdentitiesContractKeysRequest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - SearchKey.decodeDelimited = function decodeDelimited(reader) { + GetIdentitiesContractKeysRequest.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a SearchKey message. + * Verifies a GetIdentitiesContractKeysRequest message. * @function verify - * @memberof org.dash.platform.dapi.v0.SearchKey + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - SearchKey.verify = function verify(message) { + GetIdentitiesContractKeysRequest.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; - if (message.purposeMap != null && message.hasOwnProperty("purposeMap")) { - if (!$util.isObject(message.purposeMap)) - return "purposeMap: object expected"; - var key = Object.keys(message.purposeMap); - for (var i = 0; i < key.length; ++i) { - if (!$util.key32Re.test(key[i])) - return "purposeMap: integer key{k:uint32} expected"; - { - var error = $root.org.dash.platform.dapi.v0.SecurityLevelMap.verify(message.purposeMap[key[i]]); - if (error) - return "purposeMap." + error; - } + var properties = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + properties.version = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.verify(message.v0); + if (error) + return "v0." + error; } } return null; }; /** - * Creates a SearchKey message from a plain object. Also converts values to their respective internal types. + * Creates a GetIdentitiesContractKeysRequest message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof org.dash.platform.dapi.v0.SearchKey + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest * @static * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.SearchKey} SearchKey + * @returns {org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest} GetIdentitiesContractKeysRequest */ - SearchKey.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.SearchKey) + GetIdentitiesContractKeysRequest.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest) return object; - var message = new $root.org.dash.platform.dapi.v0.SearchKey(); - if (object.purposeMap) { - if (typeof object.purposeMap !== "object") - throw TypeError(".org.dash.platform.dapi.v0.SearchKey.purposeMap: object expected"); - message.purposeMap = {}; - for (var keys = Object.keys(object.purposeMap), i = 0; i < keys.length; ++i) { - if (typeof object.purposeMap[keys[i]] !== "object") - throw TypeError(".org.dash.platform.dapi.v0.SearchKey.purposeMap: object expected"); - message.purposeMap[keys[i]] = $root.org.dash.platform.dapi.v0.SecurityLevelMap.fromObject(object.purposeMap[keys[i]]); - } + var message = new $root.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest(); + if (object.v0 != null) { + if (typeof object.v0 !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.fromObject(object.v0); } return message; }; /** - * Creates a plain object from a SearchKey message. Also converts values to other types if specified. + * Creates a plain object from a GetIdentitiesContractKeysRequest message. Also converts values to other types if specified. * @function toObject - * @memberof org.dash.platform.dapi.v0.SearchKey + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest * @static - * @param {org.dash.platform.dapi.v0.SearchKey} message SearchKey + * @param {org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest} message GetIdentitiesContractKeysRequest * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - SearchKey.toObject = function toObject(message, options) { + GetIdentitiesContractKeysRequest.toObject = function toObject(message, options) { if (!options) options = {}; var object = {}; - if (options.objects || options.defaults) - object.purposeMap = {}; - var keys2; - if (message.purposeMap && (keys2 = Object.keys(message.purposeMap)).length) { - object.purposeMap = {}; - for (var j = 0; j < keys2.length; ++j) - object.purposeMap[keys2[j]] = $root.org.dash.platform.dapi.v0.SecurityLevelMap.toObject(message.purposeMap[keys2[j]], options); + if (message.v0 != null && message.hasOwnProperty("v0")) { + object.v0 = $root.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.toObject(message.v0, options); + if (options.oneofs) + object.version = "v0"; } return object; }; /** - * Converts this SearchKey to JSON. + * Converts this GetIdentitiesContractKeysRequest to JSON. * @function toJSON - * @memberof org.dash.platform.dapi.v0.SearchKey + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest * @instance * @returns {Object.} JSON object */ - SearchKey.prototype.toJSON = function toJSON() { + GetIdentitiesContractKeysRequest.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - return SearchKey; - })(); + GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0 = (function() { - v0.SecurityLevelMap = (function() { + /** + * Properties of a GetIdentitiesContractKeysRequestV0. + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest + * @interface IGetIdentitiesContractKeysRequestV0 + * @property {Array.|null} [identitiesIds] GetIdentitiesContractKeysRequestV0 identitiesIds + * @property {Uint8Array|null} [contractId] GetIdentitiesContractKeysRequestV0 contractId + * @property {string|null} [documentTypeName] GetIdentitiesContractKeysRequestV0 documentTypeName + * @property {Array.|null} [purposes] GetIdentitiesContractKeysRequestV0 purposes + * @property {boolean|null} [prove] GetIdentitiesContractKeysRequestV0 prove + */ - /** - * Properties of a SecurityLevelMap. - * @memberof org.dash.platform.dapi.v0 - * @interface ISecurityLevelMap - * @property {Object.|null} [securityLevelMap] SecurityLevelMap securityLevelMap - */ + /** + * Constructs a new GetIdentitiesContractKeysRequestV0. + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest + * @classdesc Represents a GetIdentitiesContractKeysRequestV0. + * @implements IGetIdentitiesContractKeysRequestV0 + * @constructor + * @param {org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.IGetIdentitiesContractKeysRequestV0=} [properties] Properties to set + */ + function GetIdentitiesContractKeysRequestV0(properties) { + this.identitiesIds = []; + this.purposes = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } - /** - * Constructs a new SecurityLevelMap. - * @memberof org.dash.platform.dapi.v0 - * @classdesc Represents a SecurityLevelMap. - * @implements ISecurityLevelMap - * @constructor - * @param {org.dash.platform.dapi.v0.ISecurityLevelMap=} [properties] Properties to set - */ - function SecurityLevelMap(properties) { - this.securityLevelMap = {}; - if (properties) - for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) - if (properties[keys[i]] != null) - this[keys[i]] = properties[keys[i]]; - } + /** + * GetIdentitiesContractKeysRequestV0 identitiesIds. + * @member {Array.} identitiesIds + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0 + * @instance + */ + GetIdentitiesContractKeysRequestV0.prototype.identitiesIds = $util.emptyArray; - /** - * SecurityLevelMap securityLevelMap. - * @member {Object.} securityLevelMap - * @memberof org.dash.platform.dapi.v0.SecurityLevelMap - * @instance - */ - SecurityLevelMap.prototype.securityLevelMap = $util.emptyObject; + /** + * GetIdentitiesContractKeysRequestV0 contractId. + * @member {Uint8Array} contractId + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0 + * @instance + */ + GetIdentitiesContractKeysRequestV0.prototype.contractId = $util.newBuffer([]); - /** - * Creates a new SecurityLevelMap instance using the specified properties. - * @function create - * @memberof org.dash.platform.dapi.v0.SecurityLevelMap - * @static - * @param {org.dash.platform.dapi.v0.ISecurityLevelMap=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.SecurityLevelMap} SecurityLevelMap instance - */ - SecurityLevelMap.create = function create(properties) { - return new SecurityLevelMap(properties); - }; + /** + * GetIdentitiesContractKeysRequestV0 documentTypeName. + * @member {string} documentTypeName + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0 + * @instance + */ + GetIdentitiesContractKeysRequestV0.prototype.documentTypeName = ""; - /** - * Encodes the specified SecurityLevelMap message. Does not implicitly {@link org.dash.platform.dapi.v0.SecurityLevelMap.verify|verify} messages. - * @function encode - * @memberof org.dash.platform.dapi.v0.SecurityLevelMap - * @static - * @param {org.dash.platform.dapi.v0.ISecurityLevelMap} message SecurityLevelMap message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - SecurityLevelMap.encode = function encode(message, writer) { - if (!writer) - writer = $Writer.create(); - if (message.securityLevelMap != null && Object.hasOwnProperty.call(message, "securityLevelMap")) - for (var keys = Object.keys(message.securityLevelMap), i = 0; i < keys.length; ++i) - writer.uint32(/* id 1, wireType 2 =*/10).fork().uint32(/* id 1, wireType 0 =*/8).uint32(keys[i]).uint32(/* id 2, wireType 0 =*/16).int32(message.securityLevelMap[keys[i]]).ldelim(); - return writer; - }; + /** + * GetIdentitiesContractKeysRequestV0 purposes. + * @member {Array.} purposes + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0 + * @instance + */ + GetIdentitiesContractKeysRequestV0.prototype.purposes = $util.emptyArray; - /** - * Encodes the specified SecurityLevelMap message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.SecurityLevelMap.verify|verify} messages. - * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.SecurityLevelMap - * @static - * @param {org.dash.platform.dapi.v0.ISecurityLevelMap} message SecurityLevelMap message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - SecurityLevelMap.encodeDelimited = function encodeDelimited(message, writer) { - return this.encode(message, writer).ldelim(); - }; + /** + * GetIdentitiesContractKeysRequestV0 prove. + * @member {boolean} prove + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0 + * @instance + */ + GetIdentitiesContractKeysRequestV0.prototype.prove = false; - /** - * Decodes a SecurityLevelMap message from the specified reader or buffer. - * @function decode - * @memberof org.dash.platform.dapi.v0.SecurityLevelMap - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.SecurityLevelMap} SecurityLevelMap - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - SecurityLevelMap.decode = function decode(reader, length) { - if (!(reader instanceof $Reader)) - reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.SecurityLevelMap(), key, value; - while (reader.pos < end) { - var tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (message.securityLevelMap === $util.emptyObject) - message.securityLevelMap = {}; - var end2 = reader.uint32() + reader.pos; - key = 0; - value = 0; - while (reader.pos < end2) { - var tag2 = reader.uint32(); - switch (tag2 >>> 3) { - case 1: - key = reader.uint32(); - break; - case 2: - value = reader.int32(); - break; - default: - reader.skipType(tag2 & 7); - break; - } - } - message.securityLevelMap[key] = value; - break; - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }; + /** + * Creates a new GetIdentitiesContractKeysRequestV0 instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.IGetIdentitiesContractKeysRequestV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} GetIdentitiesContractKeysRequestV0 instance + */ + GetIdentitiesContractKeysRequestV0.create = function create(properties) { + return new GetIdentitiesContractKeysRequestV0(properties); + }; - /** - * Decodes a SecurityLevelMap message from the specified reader or buffer, length delimited. - * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.SecurityLevelMap - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.SecurityLevelMap} SecurityLevelMap - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - SecurityLevelMap.decodeDelimited = function decodeDelimited(reader) { - if (!(reader instanceof $Reader)) - reader = new $Reader(reader); - return this.decode(reader, reader.uint32()); - }; + /** + * Encodes the specified GetIdentitiesContractKeysRequestV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.IGetIdentitiesContractKeysRequestV0} message GetIdentitiesContractKeysRequestV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentitiesContractKeysRequestV0.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.identitiesIds != null && message.identitiesIds.length) + for (var i = 0; i < message.identitiesIds.length; ++i) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.identitiesIds[i]); + if (message.contractId != null && Object.hasOwnProperty.call(message, "contractId")) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.contractId); + if (message.documentTypeName != null && Object.hasOwnProperty.call(message, "documentTypeName")) + writer.uint32(/* id 3, wireType 2 =*/26).string(message.documentTypeName); + if (message.purposes != null && message.purposes.length) { + writer.uint32(/* id 4, wireType 2 =*/34).fork(); + for (var i = 0; i < message.purposes.length; ++i) + writer.int32(message.purposes[i]); + writer.ldelim(); + } + if (message.prove != null && Object.hasOwnProperty.call(message, "prove")) + writer.uint32(/* id 5, wireType 0 =*/40).bool(message.prove); + return writer; + }; - /** - * Verifies a SecurityLevelMap message. - * @function verify - * @memberof org.dash.platform.dapi.v0.SecurityLevelMap - * @static - * @param {Object.} message Plain object to verify - * @returns {string|null} `null` if valid, otherwise the reason why it is not - */ - SecurityLevelMap.verify = function verify(message) { - if (typeof message !== "object" || message === null) - return "object expected"; - if (message.securityLevelMap != null && message.hasOwnProperty("securityLevelMap")) { - if (!$util.isObject(message.securityLevelMap)) - return "securityLevelMap: object expected"; - var key = Object.keys(message.securityLevelMap); - for (var i = 0; i < key.length; ++i) { - if (!$util.key32Re.test(key[i])) - return "securityLevelMap: integer key{k:uint32} expected"; - switch (message.securityLevelMap[key[i]]) { - default: - return "securityLevelMap: enum value{k:uint32} expected"; - case 0: + /** + * Encodes the specified GetIdentitiesContractKeysRequestV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.IGetIdentitiesContractKeysRequestV0} message GetIdentitiesContractKeysRequestV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentitiesContractKeysRequestV0.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetIdentitiesContractKeysRequestV0 message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} GetIdentitiesContractKeysRequestV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetIdentitiesContractKeysRequestV0.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { case 1: + if (!(message.identitiesIds && message.identitiesIds.length)) + message.identitiesIds = []; + message.identitiesIds.push(reader.bytes()); + break; + case 2: + message.contractId = reader.bytes(); + break; + case 3: + message.documentTypeName = reader.string(); + break; + case 4: + if (!(message.purposes && message.purposes.length)) + message.purposes = []; + if ((tag & 7) === 2) { + var end2 = reader.uint32() + reader.pos; + while (reader.pos < end2) + message.purposes.push(reader.int32()); + } else + message.purposes.push(reader.int32()); + break; + case 5: + message.prove = reader.bool(); + break; + default: + reader.skipType(tag & 7); break; } } - } - return null; - }; + return message; + }; - /** - * Creates a SecurityLevelMap message from a plain object. Also converts values to their respective internal types. - * @function fromObject - * @memberof org.dash.platform.dapi.v0.SecurityLevelMap - * @static - * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.SecurityLevelMap} SecurityLevelMap - */ - SecurityLevelMap.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.SecurityLevelMap) - return object; - var message = new $root.org.dash.platform.dapi.v0.SecurityLevelMap(); - if (object.securityLevelMap) { - if (typeof object.securityLevelMap !== "object") - throw TypeError(".org.dash.platform.dapi.v0.SecurityLevelMap.securityLevelMap: object expected"); - message.securityLevelMap = {}; - for (var keys = Object.keys(object.securityLevelMap), i = 0; i < keys.length; ++i) - switch (object.securityLevelMap[keys[i]]) { - case "CURRENT_KEY_OF_KIND_REQUEST": - case 0: - message.securityLevelMap[keys[i]] = 0; - break; - case "ALL_KEYS_OF_KIND_REQUEST": - case 1: - message.securityLevelMap[keys[i]] = 1; - break; + /** + * Decodes a GetIdentitiesContractKeysRequestV0 message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} GetIdentitiesContractKeysRequestV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetIdentitiesContractKeysRequestV0.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetIdentitiesContractKeysRequestV0 message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0 + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetIdentitiesContractKeysRequestV0.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.identitiesIds != null && message.hasOwnProperty("identitiesIds")) { + if (!Array.isArray(message.identitiesIds)) + return "identitiesIds: array expected"; + for (var i = 0; i < message.identitiesIds.length; ++i) + if (!(message.identitiesIds[i] && typeof message.identitiesIds[i].length === "number" || $util.isString(message.identitiesIds[i]))) + return "identitiesIds: buffer[] expected"; + } + if (message.contractId != null && message.hasOwnProperty("contractId")) + if (!(message.contractId && typeof message.contractId.length === "number" || $util.isString(message.contractId))) + return "contractId: buffer expected"; + if (message.documentTypeName != null && message.hasOwnProperty("documentTypeName")) + if (!$util.isString(message.documentTypeName)) + return "documentTypeName: string expected"; + if (message.purposes != null && message.hasOwnProperty("purposes")) { + if (!Array.isArray(message.purposes)) + return "purposes: array expected"; + for (var i = 0; i < message.purposes.length; ++i) + switch (message.purposes[i]) { + default: + return "purposes: enum value[] expected"; + case 0: + case 1: + case 2: + case 3: + case 5: + break; + } + } + if (message.prove != null && message.hasOwnProperty("prove")) + if (typeof message.prove !== "boolean") + return "prove: boolean expected"; + return null; + }; + + /** + * Creates a GetIdentitiesContractKeysRequestV0 message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0 + * @static + * @param {Object.} object Plain object + * @returns {org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} GetIdentitiesContractKeysRequestV0 + */ + GetIdentitiesContractKeysRequestV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0(); + if (object.identitiesIds) { + if (!Array.isArray(object.identitiesIds)) + throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.identitiesIds: array expected"); + message.identitiesIds = []; + for (var i = 0; i < object.identitiesIds.length; ++i) + if (typeof object.identitiesIds[i] === "string") + $util.base64.decode(object.identitiesIds[i], message.identitiesIds[i] = $util.newBuffer($util.base64.length(object.identitiesIds[i])), 0); + else if (object.identitiesIds[i].length >= 0) + message.identitiesIds[i] = object.identitiesIds[i]; + } + if (object.contractId != null) + if (typeof object.contractId === "string") + $util.base64.decode(object.contractId, message.contractId = $util.newBuffer($util.base64.length(object.contractId)), 0); + else if (object.contractId.length >= 0) + message.contractId = object.contractId; + if (object.documentTypeName != null) + message.documentTypeName = String(object.documentTypeName); + if (object.purposes) { + if (!Array.isArray(object.purposes)) + throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.purposes: array expected"); + message.purposes = []; + for (var i = 0; i < object.purposes.length; ++i) + switch (object.purposes[i]) { + default: + case "AUTHENTICATION": + case 0: + message.purposes[i] = 0; + break; + case "ENCRYPTION": + case 1: + message.purposes[i] = 1; + break; + case "DECRYPTION": + case 2: + message.purposes[i] = 2; + break; + case "TRANSFER": + case 3: + message.purposes[i] = 3; + break; + case "VOTING": + case 5: + message.purposes[i] = 5; + break; + } + } + if (object.prove != null) + message.prove = Boolean(object.prove); + return message; + }; + + /** + * Creates a plain object from a GetIdentitiesContractKeysRequestV0 message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} message GetIdentitiesContractKeysRequestV0 + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + GetIdentitiesContractKeysRequestV0.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) { + object.identitiesIds = []; + object.purposes = []; + } + if (options.defaults) { + if (options.bytes === String) + object.contractId = ""; + else { + object.contractId = []; + if (options.bytes !== Array) + object.contractId = $util.newBuffer(object.contractId); } - } - return message; - }; + object.documentTypeName = ""; + object.prove = false; + } + if (message.identitiesIds && message.identitiesIds.length) { + object.identitiesIds = []; + for (var j = 0; j < message.identitiesIds.length; ++j) + object.identitiesIds[j] = options.bytes === String ? $util.base64.encode(message.identitiesIds[j], 0, message.identitiesIds[j].length) : options.bytes === Array ? Array.prototype.slice.call(message.identitiesIds[j]) : message.identitiesIds[j]; + } + if (message.contractId != null && message.hasOwnProperty("contractId")) + object.contractId = options.bytes === String ? $util.base64.encode(message.contractId, 0, message.contractId.length) : options.bytes === Array ? Array.prototype.slice.call(message.contractId) : message.contractId; + if (message.documentTypeName != null && message.hasOwnProperty("documentTypeName")) + object.documentTypeName = message.documentTypeName; + if (message.purposes && message.purposes.length) { + object.purposes = []; + for (var j = 0; j < message.purposes.length; ++j) + object.purposes[j] = options.enums === String ? $root.org.dash.platform.dapi.v0.KeyPurpose[message.purposes[j]] : message.purposes[j]; + } + if (message.prove != null && message.hasOwnProperty("prove")) + object.prove = message.prove; + return object; + }; + + /** + * Converts this GetIdentitiesContractKeysRequestV0 to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0 + * @instance + * @returns {Object.} JSON object + */ + GetIdentitiesContractKeysRequestV0.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return GetIdentitiesContractKeysRequestV0; + })(); + + return GetIdentitiesContractKeysRequest; + })(); + + v0.GetIdentitiesContractKeysResponse = (function() { /** - * Creates a plain object from a SecurityLevelMap message. Also converts values to other types if specified. - * @function toObject - * @memberof org.dash.platform.dapi.v0.SecurityLevelMap - * @static - * @param {org.dash.platform.dapi.v0.SecurityLevelMap} message SecurityLevelMap - * @param {$protobuf.IConversionOptions} [options] Conversion options - * @returns {Object.} Plain object + * Properties of a GetIdentitiesContractKeysResponse. + * @memberof org.dash.platform.dapi.v0 + * @interface IGetIdentitiesContractKeysResponse + * @property {org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.IGetIdentitiesContractKeysResponseV0|null} [v0] GetIdentitiesContractKeysResponse v0 */ - SecurityLevelMap.toObject = function toObject(message, options) { - if (!options) - options = {}; - var object = {}; - if (options.objects || options.defaults) - object.securityLevelMap = {}; - var keys2; - if (message.securityLevelMap && (keys2 = Object.keys(message.securityLevelMap)).length) { - object.securityLevelMap = {}; - for (var j = 0; j < keys2.length; ++j) - object.securityLevelMap[keys2[j]] = options.enums === String ? $root.org.dash.platform.dapi.v0.SecurityLevelMap.KeyKindRequestType[message.securityLevelMap[keys2[j]]] : message.securityLevelMap[keys2[j]]; - } - return object; - }; /** - * Converts this SecurityLevelMap to JSON. - * @function toJSON - * @memberof org.dash.platform.dapi.v0.SecurityLevelMap - * @instance - * @returns {Object.} JSON object + * Constructs a new GetIdentitiesContractKeysResponse. + * @memberof org.dash.platform.dapi.v0 + * @classdesc Represents a GetIdentitiesContractKeysResponse. + * @implements IGetIdentitiesContractKeysResponse + * @constructor + * @param {org.dash.platform.dapi.v0.IGetIdentitiesContractKeysResponse=} [properties] Properties to set */ - SecurityLevelMap.prototype.toJSON = function toJSON() { - return this.constructor.toObject(this, $protobuf.util.toJSONOptions); - }; - - /** - * KeyKindRequestType enum. - * @name org.dash.platform.dapi.v0.SecurityLevelMap.KeyKindRequestType - * @enum {number} - * @property {number} CURRENT_KEY_OF_KIND_REQUEST=0 CURRENT_KEY_OF_KIND_REQUEST value - * @property {number} ALL_KEYS_OF_KIND_REQUEST=1 ALL_KEYS_OF_KIND_REQUEST value - */ - SecurityLevelMap.KeyKindRequestType = (function() { - var valuesById = {}, values = Object.create(valuesById); - values[valuesById[0] = "CURRENT_KEY_OF_KIND_REQUEST"] = 0; - values[valuesById[1] = "ALL_KEYS_OF_KIND_REQUEST"] = 1; - return values; - })(); - - return SecurityLevelMap; - })(); - - v0.GetIdentityKeysRequest = (function() { - - /** - * Properties of a GetIdentityKeysRequest. - * @memberof org.dash.platform.dapi.v0 - * @interface IGetIdentityKeysRequest - * @property {org.dash.platform.dapi.v0.GetIdentityKeysRequest.IGetIdentityKeysRequestV0|null} [v0] GetIdentityKeysRequest v0 - */ - - /** - * Constructs a new GetIdentityKeysRequest. - * @memberof org.dash.platform.dapi.v0 - * @classdesc Represents a GetIdentityKeysRequest. - * @implements IGetIdentityKeysRequest - * @constructor - * @param {org.dash.platform.dapi.v0.IGetIdentityKeysRequest=} [properties] Properties to set - */ - function GetIdentityKeysRequest(properties) { + function GetIdentitiesContractKeysResponse(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -9600,89 +9807,89 @@ $root.org = (function() { } /** - * GetIdentityKeysRequest v0. - * @member {org.dash.platform.dapi.v0.GetIdentityKeysRequest.IGetIdentityKeysRequestV0|null|undefined} v0 - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest + * GetIdentitiesContractKeysResponse v0. + * @member {org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.IGetIdentitiesContractKeysResponseV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse * @instance */ - GetIdentityKeysRequest.prototype.v0 = null; + GetIdentitiesContractKeysResponse.prototype.v0 = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** - * GetIdentityKeysRequest version. + * GetIdentitiesContractKeysResponse version. * @member {"v0"|undefined} version - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse * @instance */ - Object.defineProperty(GetIdentityKeysRequest.prototype, "version", { + Object.defineProperty(GetIdentitiesContractKeysResponse.prototype, "version", { get: $util.oneOfGetter($oneOfFields = ["v0"]), set: $util.oneOfSetter($oneOfFields) }); /** - * Creates a new GetIdentityKeysRequest instance using the specified properties. + * Creates a new GetIdentitiesContractKeysResponse instance using the specified properties. * @function create - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse * @static - * @param {org.dash.platform.dapi.v0.IGetIdentityKeysRequest=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetIdentityKeysRequest} GetIdentityKeysRequest instance + * @param {org.dash.platform.dapi.v0.IGetIdentitiesContractKeysResponse=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse} GetIdentitiesContractKeysResponse instance */ - GetIdentityKeysRequest.create = function create(properties) { - return new GetIdentityKeysRequest(properties); + GetIdentitiesContractKeysResponse.create = function create(properties) { + return new GetIdentitiesContractKeysResponse(properties); }; /** - * Encodes the specified GetIdentityKeysRequest message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityKeysRequest.verify|verify} messages. + * Encodes the specified GetIdentitiesContractKeysResponse message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.verify|verify} messages. * @function encode - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse * @static - * @param {org.dash.platform.dapi.v0.IGetIdentityKeysRequest} message GetIdentityKeysRequest message or plain object to encode + * @param {org.dash.platform.dapi.v0.IGetIdentitiesContractKeysResponse} message GetIdentitiesContractKeysResponse message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetIdentityKeysRequest.encode = function encode(message, writer) { + GetIdentitiesContractKeysResponse.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) - $root.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + $root.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); return writer; }; /** - * Encodes the specified GetIdentityKeysRequest message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityKeysRequest.verify|verify} messages. + * Encodes the specified GetIdentitiesContractKeysResponse message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.verify|verify} messages. * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse * @static - * @param {org.dash.platform.dapi.v0.IGetIdentityKeysRequest} message GetIdentityKeysRequest message or plain object to encode + * @param {org.dash.platform.dapi.v0.IGetIdentitiesContractKeysResponse} message GetIdentitiesContractKeysResponse message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetIdentityKeysRequest.encodeDelimited = function encodeDelimited(message, writer) { + GetIdentitiesContractKeysResponse.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a GetIdentityKeysRequest message from the specified reader or buffer. + * Decodes a GetIdentitiesContractKeysResponse message from the specified reader or buffer. * @function decode - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetIdentityKeysRequest} GetIdentityKeysRequest + * @returns {org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse} GetIdentitiesContractKeysResponse * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetIdentityKeysRequest.decode = function decode(reader, length) { + GetIdentitiesContractKeysResponse.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityKeysRequest(); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { case 1: - message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.decode(reader, reader.uint32()); + message.v0 = $root.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.decode(reader, reader.uint32()); break; default: reader.skipType(tag & 7); @@ -9693,37 +9900,37 @@ $root.org = (function() { }; /** - * Decodes a GetIdentityKeysRequest message from the specified reader or buffer, length delimited. + * Decodes a GetIdentitiesContractKeysResponse message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetIdentityKeysRequest} GetIdentityKeysRequest + * @returns {org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse} GetIdentitiesContractKeysResponse * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetIdentityKeysRequest.decodeDelimited = function decodeDelimited(reader) { + GetIdentitiesContractKeysResponse.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a GetIdentityKeysRequest message. + * Verifies a GetIdentitiesContractKeysResponse message. * @function verify - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - GetIdentityKeysRequest.verify = function verify(message) { + GetIdentitiesContractKeysResponse.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; var properties = {}; if (message.v0 != null && message.hasOwnProperty("v0")) { properties.version = 1; { - var error = $root.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.verify(message.v0); + var error = $root.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.verify(message.v0); if (error) return "v0." + error; } @@ -9732,40 +9939,40 @@ $root.org = (function() { }; /** - * Creates a GetIdentityKeysRequest message from a plain object. Also converts values to their respective internal types. + * Creates a GetIdentitiesContractKeysResponse message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse * @static * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetIdentityKeysRequest} GetIdentityKeysRequest + * @returns {org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse} GetIdentitiesContractKeysResponse */ - GetIdentityKeysRequest.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityKeysRequest) + GetIdentitiesContractKeysResponse.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse) return object; - var message = new $root.org.dash.platform.dapi.v0.GetIdentityKeysRequest(); + var message = new $root.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse(); if (object.v0 != null) { if (typeof object.v0 !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetIdentityKeysRequest.v0: object expected"); - message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.fromObject(object.v0); + throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.fromObject(object.v0); } return message; }; /** - * Creates a plain object from a GetIdentityKeysRequest message. Also converts values to other types if specified. + * Creates a plain object from a GetIdentitiesContractKeysResponse message. Also converts values to other types if specified. * @function toObject - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse * @static - * @param {org.dash.platform.dapi.v0.GetIdentityKeysRequest} message GetIdentityKeysRequest + * @param {org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse} message GetIdentitiesContractKeysResponse * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - GetIdentityKeysRequest.toObject = function toObject(message, options) { + GetIdentitiesContractKeysResponse.toObject = function toObject(message, options) { if (!options) options = {}; var object = {}; if (message.v0 != null && message.hasOwnProperty("v0")) { - object.v0 = $root.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.toObject(message.v0, options); + object.v0 = $root.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.toObject(message.v0, options); if (options.oneofs) object.version = "v0"; } @@ -9773,38 +9980,36 @@ $root.org = (function() { }; /** - * Converts this GetIdentityKeysRequest to JSON. + * Converts this GetIdentitiesContractKeysResponse to JSON. * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse * @instance * @returns {Object.} JSON object */ - GetIdentityKeysRequest.prototype.toJSON = function toJSON() { + GetIdentitiesContractKeysResponse.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - GetIdentityKeysRequest.GetIdentityKeysRequestV0 = (function() { + GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0 = (function() { /** - * Properties of a GetIdentityKeysRequestV0. - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest - * @interface IGetIdentityKeysRequestV0 - * @property {Uint8Array|null} [identityId] GetIdentityKeysRequestV0 identityId - * @property {org.dash.platform.dapi.v0.IKeyRequestType|null} [requestType] GetIdentityKeysRequestV0 requestType - * @property {google.protobuf.IUInt32Value|null} [limit] GetIdentityKeysRequestV0 limit - * @property {google.protobuf.IUInt32Value|null} [offset] GetIdentityKeysRequestV0 offset - * @property {boolean|null} [prove] GetIdentityKeysRequestV0 prove + * Properties of a GetIdentitiesContractKeysResponseV0. + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse + * @interface IGetIdentitiesContractKeysResponseV0 + * @property {org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IIdentitiesKeys|null} [identitiesKeys] GetIdentitiesContractKeysResponseV0 identitiesKeys + * @property {org.dash.platform.dapi.v0.IProof|null} [proof] GetIdentitiesContractKeysResponseV0 proof + * @property {org.dash.platform.dapi.v0.IResponseMetadata|null} [metadata] GetIdentitiesContractKeysResponseV0 metadata */ /** - * Constructs a new GetIdentityKeysRequestV0. - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest - * @classdesc Represents a GetIdentityKeysRequestV0. - * @implements IGetIdentityKeysRequestV0 + * Constructs a new GetIdentitiesContractKeysResponseV0. + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse + * @classdesc Represents a GetIdentitiesContractKeysResponseV0. + * @implements IGetIdentitiesContractKeysResponseV0 * @constructor - * @param {org.dash.platform.dapi.v0.GetIdentityKeysRequest.IGetIdentityKeysRequestV0=} [properties] Properties to set + * @param {org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.IGetIdentitiesContractKeysResponseV0=} [properties] Properties to set */ - function GetIdentityKeysRequestV0(properties) { + function GetIdentitiesContractKeysResponseV0(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -9812,127 +10017,115 @@ $root.org = (function() { } /** - * GetIdentityKeysRequestV0 identityId. - * @member {Uint8Array} identityId - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0 + * GetIdentitiesContractKeysResponseV0 identitiesKeys. + * @member {org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IIdentitiesKeys|null|undefined} identitiesKeys + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0 * @instance */ - GetIdentityKeysRequestV0.prototype.identityId = $util.newBuffer([]); + GetIdentitiesContractKeysResponseV0.prototype.identitiesKeys = null; /** - * GetIdentityKeysRequestV0 requestType. - * @member {org.dash.platform.dapi.v0.IKeyRequestType|null|undefined} requestType - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0 + * GetIdentitiesContractKeysResponseV0 proof. + * @member {org.dash.platform.dapi.v0.IProof|null|undefined} proof + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0 * @instance */ - GetIdentityKeysRequestV0.prototype.requestType = null; + GetIdentitiesContractKeysResponseV0.prototype.proof = null; /** - * GetIdentityKeysRequestV0 limit. - * @member {google.protobuf.IUInt32Value|null|undefined} limit - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0 + * GetIdentitiesContractKeysResponseV0 metadata. + * @member {org.dash.platform.dapi.v0.IResponseMetadata|null|undefined} metadata + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0 * @instance */ - GetIdentityKeysRequestV0.prototype.limit = null; + GetIdentitiesContractKeysResponseV0.prototype.metadata = null; - /** - * GetIdentityKeysRequestV0 offset. - * @member {google.protobuf.IUInt32Value|null|undefined} offset - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0 - * @instance - */ - GetIdentityKeysRequestV0.prototype.offset = null; + // OneOf field names bound to virtual getters and setters + var $oneOfFields; /** - * GetIdentityKeysRequestV0 prove. - * @member {boolean} prove - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0 + * GetIdentitiesContractKeysResponseV0 result. + * @member {"identitiesKeys"|"proof"|undefined} result + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0 * @instance */ - GetIdentityKeysRequestV0.prototype.prove = false; + Object.defineProperty(GetIdentitiesContractKeysResponseV0.prototype, "result", { + get: $util.oneOfGetter($oneOfFields = ["identitiesKeys", "proof"]), + set: $util.oneOfSetter($oneOfFields) + }); /** - * Creates a new GetIdentityKeysRequestV0 instance using the specified properties. + * Creates a new GetIdentitiesContractKeysResponseV0 instance using the specified properties. * @function create - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0 + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentityKeysRequest.IGetIdentityKeysRequestV0=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} GetIdentityKeysRequestV0 instance + * @param {org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.IGetIdentitiesContractKeysResponseV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} GetIdentitiesContractKeysResponseV0 instance */ - GetIdentityKeysRequestV0.create = function create(properties) { - return new GetIdentityKeysRequestV0(properties); + GetIdentitiesContractKeysResponseV0.create = function create(properties) { + return new GetIdentitiesContractKeysResponseV0(properties); }; /** - * Encodes the specified GetIdentityKeysRequestV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.verify|verify} messages. + * Encodes the specified GetIdentitiesContractKeysResponseV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.verify|verify} messages. * @function encode - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0 + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentityKeysRequest.IGetIdentityKeysRequestV0} message GetIdentityKeysRequestV0 message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.IGetIdentitiesContractKeysResponseV0} message GetIdentitiesContractKeysResponseV0 message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetIdentityKeysRequestV0.encode = function encode(message, writer) { + GetIdentitiesContractKeysResponseV0.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.identityId != null && Object.hasOwnProperty.call(message, "identityId")) - writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.identityId); - if (message.requestType != null && Object.hasOwnProperty.call(message, "requestType")) - $root.org.dash.platform.dapi.v0.KeyRequestType.encode(message.requestType, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); - if (message.limit != null && Object.hasOwnProperty.call(message, "limit")) - $root.google.protobuf.UInt32Value.encode(message.limit, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); - if (message.offset != null && Object.hasOwnProperty.call(message, "offset")) - $root.google.protobuf.UInt32Value.encode(message.offset, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); - if (message.prove != null && Object.hasOwnProperty.call(message, "prove")) - writer.uint32(/* id 5, wireType 0 =*/40).bool(message.prove); + if (message.identitiesKeys != null && Object.hasOwnProperty.call(message, "identitiesKeys")) + $root.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.encode(message.identitiesKeys, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.proof != null && Object.hasOwnProperty.call(message, "proof")) + $root.org.dash.platform.dapi.v0.Proof.encode(message.proof, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.metadata != null && Object.hasOwnProperty.call(message, "metadata")) + $root.org.dash.platform.dapi.v0.ResponseMetadata.encode(message.metadata, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); return writer; }; /** - * Encodes the specified GetIdentityKeysRequestV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.verify|verify} messages. + * Encodes the specified GetIdentitiesContractKeysResponseV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.verify|verify} messages. * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0 + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentityKeysRequest.IGetIdentityKeysRequestV0} message GetIdentityKeysRequestV0 message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.IGetIdentitiesContractKeysResponseV0} message GetIdentitiesContractKeysResponseV0 message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetIdentityKeysRequestV0.encodeDelimited = function encodeDelimited(message, writer) { + GetIdentitiesContractKeysResponseV0.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a GetIdentityKeysRequestV0 message from the specified reader or buffer. + * Decodes a GetIdentitiesContractKeysResponseV0 message from the specified reader or buffer. * @function decode - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0 + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0 * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} GetIdentityKeysRequestV0 + * @returns {org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} GetIdentitiesContractKeysResponseV0 * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetIdentityKeysRequestV0.decode = function decode(reader, length) { + GetIdentitiesContractKeysResponseV0.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0(); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { case 1: - message.identityId = reader.bytes(); + message.identitiesKeys = $root.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.decode(reader, reader.uint32()); break; case 2: - message.requestType = $root.org.dash.platform.dapi.v0.KeyRequestType.decode(reader, reader.uint32()); + message.proof = $root.org.dash.platform.dapi.v0.Proof.decode(reader, reader.uint32()); break; case 3: - message.limit = $root.google.protobuf.UInt32Value.decode(reader, reader.uint32()); - break; - case 4: - message.offset = $root.google.protobuf.UInt32Value.decode(reader, reader.uint32()); - break; - case 5: - message.prove = reader.bool(); + message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.decode(reader, reader.uint32()); break; default: reader.skipType(tag & 7); @@ -9943,725 +10136,725 @@ $root.org = (function() { }; /** - * Decodes a GetIdentityKeysRequestV0 message from the specified reader or buffer, length delimited. + * Decodes a GetIdentitiesContractKeysResponseV0 message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0 + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0 * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} GetIdentityKeysRequestV0 + * @returns {org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} GetIdentitiesContractKeysResponseV0 * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetIdentityKeysRequestV0.decodeDelimited = function decodeDelimited(reader) { + GetIdentitiesContractKeysResponseV0.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a GetIdentityKeysRequestV0 message. + * Verifies a GetIdentitiesContractKeysResponseV0 message. * @function verify - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0 + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0 * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - GetIdentityKeysRequestV0.verify = function verify(message) { + GetIdentitiesContractKeysResponseV0.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; - if (message.identityId != null && message.hasOwnProperty("identityId")) - if (!(message.identityId && typeof message.identityId.length === "number" || $util.isString(message.identityId))) - return "identityId: buffer expected"; - if (message.requestType != null && message.hasOwnProperty("requestType")) { - var error = $root.org.dash.platform.dapi.v0.KeyRequestType.verify(message.requestType); - if (error) - return "requestType." + error; + var properties = {}; + if (message.identitiesKeys != null && message.hasOwnProperty("identitiesKeys")) { + properties.result = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.verify(message.identitiesKeys); + if (error) + return "identitiesKeys." + error; + } } - if (message.limit != null && message.hasOwnProperty("limit")) { - var error = $root.google.protobuf.UInt32Value.verify(message.limit); - if (error) - return "limit." + error; + if (message.proof != null && message.hasOwnProperty("proof")) { + if (properties.result === 1) + return "result: multiple values"; + properties.result = 1; + { + var error = $root.org.dash.platform.dapi.v0.Proof.verify(message.proof); + if (error) + return "proof." + error; + } } - if (message.offset != null && message.hasOwnProperty("offset")) { - var error = $root.google.protobuf.UInt32Value.verify(message.offset); + if (message.metadata != null && message.hasOwnProperty("metadata")) { + var error = $root.org.dash.platform.dapi.v0.ResponseMetadata.verify(message.metadata); if (error) - return "offset." + error; + return "metadata." + error; } - if (message.prove != null && message.hasOwnProperty("prove")) - if (typeof message.prove !== "boolean") - return "prove: boolean expected"; return null; }; /** - * Creates a GetIdentityKeysRequestV0 message from a plain object. Also converts values to their respective internal types. + * Creates a GetIdentitiesContractKeysResponseV0 message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0 + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0 * @static * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} GetIdentityKeysRequestV0 + * @returns {org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} GetIdentitiesContractKeysResponseV0 */ - GetIdentityKeysRequestV0.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0) + GetIdentitiesContractKeysResponseV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0) return object; - var message = new $root.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0(); - if (object.identityId != null) - if (typeof object.identityId === "string") - $util.base64.decode(object.identityId, message.identityId = $util.newBuffer($util.base64.length(object.identityId)), 0); - else if (object.identityId.length >= 0) - message.identityId = object.identityId; - if (object.requestType != null) { - if (typeof object.requestType !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.requestType: object expected"); - message.requestType = $root.org.dash.platform.dapi.v0.KeyRequestType.fromObject(object.requestType); + var message = new $root.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0(); + if (object.identitiesKeys != null) { + if (typeof object.identitiesKeys !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.identitiesKeys: object expected"); + message.identitiesKeys = $root.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.fromObject(object.identitiesKeys); } - if (object.limit != null) { - if (typeof object.limit !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.limit: object expected"); - message.limit = $root.google.protobuf.UInt32Value.fromObject(object.limit); + if (object.proof != null) { + if (typeof object.proof !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.proof: object expected"); + message.proof = $root.org.dash.platform.dapi.v0.Proof.fromObject(object.proof); } - if (object.offset != null) { - if (typeof object.offset !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.offset: object expected"); - message.offset = $root.google.protobuf.UInt32Value.fromObject(object.offset); + if (object.metadata != null) { + if (typeof object.metadata !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.metadata: object expected"); + message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.fromObject(object.metadata); } - if (object.prove != null) - message.prove = Boolean(object.prove); return message; }; /** - * Creates a plain object from a GetIdentityKeysRequestV0 message. Also converts values to other types if specified. + * Creates a plain object from a GetIdentitiesContractKeysResponseV0 message. Also converts values to other types if specified. * @function toObject - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0 + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} message GetIdentityKeysRequestV0 + * @param {org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} message GetIdentitiesContractKeysResponseV0 * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - GetIdentityKeysRequestV0.toObject = function toObject(message, options) { + GetIdentitiesContractKeysResponseV0.toObject = function toObject(message, options) { if (!options) options = {}; var object = {}; - if (options.defaults) { - if (options.bytes === String) - object.identityId = ""; - else { - object.identityId = []; - if (options.bytes !== Array) - object.identityId = $util.newBuffer(object.identityId); - } - object.requestType = null; - object.limit = null; - object.offset = null; - object.prove = false; + if (options.defaults) + object.metadata = null; + if (message.identitiesKeys != null && message.hasOwnProperty("identitiesKeys")) { + object.identitiesKeys = $root.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.toObject(message.identitiesKeys, options); + if (options.oneofs) + object.result = "identitiesKeys"; } - if (message.identityId != null && message.hasOwnProperty("identityId")) - object.identityId = options.bytes === String ? $util.base64.encode(message.identityId, 0, message.identityId.length) : options.bytes === Array ? Array.prototype.slice.call(message.identityId) : message.identityId; - if (message.requestType != null && message.hasOwnProperty("requestType")) - object.requestType = $root.org.dash.platform.dapi.v0.KeyRequestType.toObject(message.requestType, options); - if (message.limit != null && message.hasOwnProperty("limit")) - object.limit = $root.google.protobuf.UInt32Value.toObject(message.limit, options); - if (message.offset != null && message.hasOwnProperty("offset")) - object.offset = $root.google.protobuf.UInt32Value.toObject(message.offset, options); - if (message.prove != null && message.hasOwnProperty("prove")) - object.prove = message.prove; + if (message.proof != null && message.hasOwnProperty("proof")) { + object.proof = $root.org.dash.platform.dapi.v0.Proof.toObject(message.proof, options); + if (options.oneofs) + object.result = "proof"; + } + if (message.metadata != null && message.hasOwnProperty("metadata")) + object.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.toObject(message.metadata, options); return object; }; /** - * Converts this GetIdentityKeysRequestV0 to JSON. + * Converts this GetIdentitiesContractKeysResponseV0 to JSON. * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0 + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0 * @instance * @returns {Object.} JSON object */ - GetIdentityKeysRequestV0.prototype.toJSON = function toJSON() { + GetIdentitiesContractKeysResponseV0.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - return GetIdentityKeysRequestV0; - })(); - - return GetIdentityKeysRequest; - })(); + GetIdentitiesContractKeysResponseV0.PurposeKeys = (function() { - v0.GetIdentityKeysResponse = (function() { + /** + * Properties of a PurposeKeys. + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0 + * @interface IPurposeKeys + * @property {org.dash.platform.dapi.v0.KeyPurpose|null} [purpose] PurposeKeys purpose + * @property {Array.|null} [keysBytes] PurposeKeys keysBytes + */ - /** - * Properties of a GetIdentityKeysResponse. - * @memberof org.dash.platform.dapi.v0 - * @interface IGetIdentityKeysResponse - * @property {org.dash.platform.dapi.v0.GetIdentityKeysResponse.IGetIdentityKeysResponseV0|null} [v0] GetIdentityKeysResponse v0 - */ + /** + * Constructs a new PurposeKeys. + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0 + * @classdesc Represents a PurposeKeys. + * @implements IPurposeKeys + * @constructor + * @param {org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IPurposeKeys=} [properties] Properties to set + */ + function PurposeKeys(properties) { + this.keysBytes = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } - /** - * Constructs a new GetIdentityKeysResponse. - * @memberof org.dash.platform.dapi.v0 - * @classdesc Represents a GetIdentityKeysResponse. - * @implements IGetIdentityKeysResponse - * @constructor - * @param {org.dash.platform.dapi.v0.IGetIdentityKeysResponse=} [properties] Properties to set - */ - function GetIdentityKeysResponse(properties) { - if (properties) - for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) - if (properties[keys[i]] != null) - this[keys[i]] = properties[keys[i]]; - } + /** + * PurposeKeys purpose. + * @member {org.dash.platform.dapi.v0.KeyPurpose} purpose + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys + * @instance + */ + PurposeKeys.prototype.purpose = 0; - /** - * GetIdentityKeysResponse v0. - * @member {org.dash.platform.dapi.v0.GetIdentityKeysResponse.IGetIdentityKeysResponseV0|null|undefined} v0 - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse - * @instance - */ - GetIdentityKeysResponse.prototype.v0 = null; + /** + * PurposeKeys keysBytes. + * @member {Array.} keysBytes + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys + * @instance + */ + PurposeKeys.prototype.keysBytes = $util.emptyArray; - // OneOf field names bound to virtual getters and setters - var $oneOfFields; + /** + * Creates a new PurposeKeys instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IPurposeKeys=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} PurposeKeys instance + */ + PurposeKeys.create = function create(properties) { + return new PurposeKeys(properties); + }; - /** - * GetIdentityKeysResponse version. - * @member {"v0"|undefined} version - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse - * @instance - */ - Object.defineProperty(GetIdentityKeysResponse.prototype, "version", { - get: $util.oneOfGetter($oneOfFields = ["v0"]), - set: $util.oneOfSetter($oneOfFields) - }); + /** + * Encodes the specified PurposeKeys message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IPurposeKeys} message PurposeKeys message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PurposeKeys.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.purpose != null && Object.hasOwnProperty.call(message, "purpose")) + writer.uint32(/* id 1, wireType 0 =*/8).int32(message.purpose); + if (message.keysBytes != null && message.keysBytes.length) + for (var i = 0; i < message.keysBytes.length; ++i) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.keysBytes[i]); + return writer; + }; - /** - * Creates a new GetIdentityKeysResponse instance using the specified properties. - * @function create - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse - * @static - * @param {org.dash.platform.dapi.v0.IGetIdentityKeysResponse=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetIdentityKeysResponse} GetIdentityKeysResponse instance - */ - GetIdentityKeysResponse.create = function create(properties) { - return new GetIdentityKeysResponse(properties); - }; + /** + * Encodes the specified PurposeKeys message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IPurposeKeys} message PurposeKeys message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PurposeKeys.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; - /** - * Encodes the specified GetIdentityKeysResponse message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityKeysResponse.verify|verify} messages. - * @function encode - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse - * @static - * @param {org.dash.platform.dapi.v0.IGetIdentityKeysResponse} message GetIdentityKeysResponse message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - GetIdentityKeysResponse.encode = function encode(message, writer) { - if (!writer) - writer = $Writer.create(); - if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) - $root.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); - return writer; - }; + /** + * Decodes a PurposeKeys message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} PurposeKeys + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PurposeKeys.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.purpose = reader.int32(); + break; + case 2: + if (!(message.keysBytes && message.keysBytes.length)) + message.keysBytes = []; + message.keysBytes.push(reader.bytes()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; - /** - * Encodes the specified GetIdentityKeysResponse message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityKeysResponse.verify|verify} messages. - * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse - * @static - * @param {org.dash.platform.dapi.v0.IGetIdentityKeysResponse} message GetIdentityKeysResponse message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - GetIdentityKeysResponse.encodeDelimited = function encodeDelimited(message, writer) { - return this.encode(message, writer).ldelim(); - }; + /** + * Decodes a PurposeKeys message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} PurposeKeys + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PurposeKeys.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; - /** - * Decodes a GetIdentityKeysResponse message from the specified reader or buffer. - * @function decode - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetIdentityKeysResponse} GetIdentityKeysResponse - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - GetIdentityKeysResponse.decode = function decode(reader, length) { - if (!(reader instanceof $Reader)) - reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityKeysResponse(); - while (reader.pos < end) { - var tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.decode(reader, reader.uint32()); - break; - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }; + /** + * Verifies a PurposeKeys message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + PurposeKeys.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.purpose != null && message.hasOwnProperty("purpose")) + switch (message.purpose) { + default: + return "purpose: enum value expected"; + case 0: + case 1: + case 2: + case 3: + case 5: + break; + } + if (message.keysBytes != null && message.hasOwnProperty("keysBytes")) { + if (!Array.isArray(message.keysBytes)) + return "keysBytes: array expected"; + for (var i = 0; i < message.keysBytes.length; ++i) + if (!(message.keysBytes[i] && typeof message.keysBytes[i].length === "number" || $util.isString(message.keysBytes[i]))) + return "keysBytes: buffer[] expected"; + } + return null; + }; - /** - * Decodes a GetIdentityKeysResponse message from the specified reader or buffer, length delimited. - * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetIdentityKeysResponse} GetIdentityKeysResponse - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - GetIdentityKeysResponse.decodeDelimited = function decodeDelimited(reader) { - if (!(reader instanceof $Reader)) - reader = new $Reader(reader); - return this.decode(reader, reader.uint32()); - }; - - /** - * Verifies a GetIdentityKeysResponse message. - * @function verify - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse - * @static - * @param {Object.} message Plain object to verify - * @returns {string|null} `null` if valid, otherwise the reason why it is not - */ - GetIdentityKeysResponse.verify = function verify(message) { - if (typeof message !== "object" || message === null) - return "object expected"; - var properties = {}; - if (message.v0 != null && message.hasOwnProperty("v0")) { - properties.version = 1; - { - var error = $root.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.verify(message.v0); - if (error) - return "v0." + error; - } - } - return null; - }; - - /** - * Creates a GetIdentityKeysResponse message from a plain object. Also converts values to their respective internal types. - * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse - * @static - * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetIdentityKeysResponse} GetIdentityKeysResponse - */ - GetIdentityKeysResponse.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityKeysResponse) - return object; - var message = new $root.org.dash.platform.dapi.v0.GetIdentityKeysResponse(); - if (object.v0 != null) { - if (typeof object.v0 !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetIdentityKeysResponse.v0: object expected"); - message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.fromObject(object.v0); - } - return message; - }; + /** + * Creates a PurposeKeys message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys + * @static + * @param {Object.} object Plain object + * @returns {org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} PurposeKeys + */ + PurposeKeys.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys(); + switch (object.purpose) { + case "AUTHENTICATION": + case 0: + message.purpose = 0; + break; + case "ENCRYPTION": + case 1: + message.purpose = 1; + break; + case "DECRYPTION": + case 2: + message.purpose = 2; + break; + case "TRANSFER": + case 3: + message.purpose = 3; + break; + case "VOTING": + case 5: + message.purpose = 5; + break; + } + if (object.keysBytes) { + if (!Array.isArray(object.keysBytes)) + throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.keysBytes: array expected"); + message.keysBytes = []; + for (var i = 0; i < object.keysBytes.length; ++i) + if (typeof object.keysBytes[i] === "string") + $util.base64.decode(object.keysBytes[i], message.keysBytes[i] = $util.newBuffer($util.base64.length(object.keysBytes[i])), 0); + else if (object.keysBytes[i].length >= 0) + message.keysBytes[i] = object.keysBytes[i]; + } + return message; + }; - /** - * Creates a plain object from a GetIdentityKeysResponse message. Also converts values to other types if specified. - * @function toObject - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse - * @static - * @param {org.dash.platform.dapi.v0.GetIdentityKeysResponse} message GetIdentityKeysResponse - * @param {$protobuf.IConversionOptions} [options] Conversion options - * @returns {Object.} Plain object - */ - GetIdentityKeysResponse.toObject = function toObject(message, options) { - if (!options) - options = {}; - var object = {}; - if (message.v0 != null && message.hasOwnProperty("v0")) { - object.v0 = $root.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.toObject(message.v0, options); - if (options.oneofs) - object.version = "v0"; - } - return object; - }; + /** + * Creates a plain object from a PurposeKeys message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} message PurposeKeys + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + PurposeKeys.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.keysBytes = []; + if (options.defaults) + object.purpose = options.enums === String ? "AUTHENTICATION" : 0; + if (message.purpose != null && message.hasOwnProperty("purpose")) + object.purpose = options.enums === String ? $root.org.dash.platform.dapi.v0.KeyPurpose[message.purpose] : message.purpose; + if (message.keysBytes && message.keysBytes.length) { + object.keysBytes = []; + for (var j = 0; j < message.keysBytes.length; ++j) + object.keysBytes[j] = options.bytes === String ? $util.base64.encode(message.keysBytes[j], 0, message.keysBytes[j].length) : options.bytes === Array ? Array.prototype.slice.call(message.keysBytes[j]) : message.keysBytes[j]; + } + return object; + }; - /** - * Converts this GetIdentityKeysResponse to JSON. - * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse - * @instance - * @returns {Object.} JSON object - */ - GetIdentityKeysResponse.prototype.toJSON = function toJSON() { - return this.constructor.toObject(this, $protobuf.util.toJSONOptions); - }; + /** + * Converts this PurposeKeys to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys + * @instance + * @returns {Object.} JSON object + */ + PurposeKeys.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; - GetIdentityKeysResponse.GetIdentityKeysResponseV0 = (function() { + return PurposeKeys; + })(); - /** - * Properties of a GetIdentityKeysResponseV0. - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse - * @interface IGetIdentityKeysResponseV0 - * @property {org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.IKeys|null} [keys] GetIdentityKeysResponseV0 keys - * @property {org.dash.platform.dapi.v0.IProof|null} [proof] GetIdentityKeysResponseV0 proof - * @property {org.dash.platform.dapi.v0.IResponseMetadata|null} [metadata] GetIdentityKeysResponseV0 metadata - */ + GetIdentitiesContractKeysResponseV0.IdentityKeys = (function() { - /** - * Constructs a new GetIdentityKeysResponseV0. - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse - * @classdesc Represents a GetIdentityKeysResponseV0. - * @implements IGetIdentityKeysResponseV0 - * @constructor - * @param {org.dash.platform.dapi.v0.GetIdentityKeysResponse.IGetIdentityKeysResponseV0=} [properties] Properties to set - */ - function GetIdentityKeysResponseV0(properties) { - if (properties) - for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) - if (properties[keys[i]] != null) - this[keys[i]] = properties[keys[i]]; - } + /** + * Properties of an IdentityKeys. + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0 + * @interface IIdentityKeys + * @property {Uint8Array|null} [identityId] IdentityKeys identityId + * @property {Array.|null} [keys] IdentityKeys keys + */ - /** - * GetIdentityKeysResponseV0 keys. - * @member {org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.IKeys|null|undefined} keys - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0 - * @instance - */ - GetIdentityKeysResponseV0.prototype.keys = null; + /** + * Constructs a new IdentityKeys. + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0 + * @classdesc Represents an IdentityKeys. + * @implements IIdentityKeys + * @constructor + * @param {org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IIdentityKeys=} [properties] Properties to set + */ + function IdentityKeys(properties) { + this.keys = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } - /** - * GetIdentityKeysResponseV0 proof. - * @member {org.dash.platform.dapi.v0.IProof|null|undefined} proof - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0 - * @instance - */ - GetIdentityKeysResponseV0.prototype.proof = null; + /** + * IdentityKeys identityId. + * @member {Uint8Array} identityId + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys + * @instance + */ + IdentityKeys.prototype.identityId = $util.newBuffer([]); - /** - * GetIdentityKeysResponseV0 metadata. - * @member {org.dash.platform.dapi.v0.IResponseMetadata|null|undefined} metadata - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0 - * @instance - */ - GetIdentityKeysResponseV0.prototype.metadata = null; + /** + * IdentityKeys keys. + * @member {Array.} keys + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys + * @instance + */ + IdentityKeys.prototype.keys = $util.emptyArray; - // OneOf field names bound to virtual getters and setters - var $oneOfFields; + /** + * Creates a new IdentityKeys instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IIdentityKeys=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} IdentityKeys instance + */ + IdentityKeys.create = function create(properties) { + return new IdentityKeys(properties); + }; - /** - * GetIdentityKeysResponseV0 result. - * @member {"keys"|"proof"|undefined} result - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0 - * @instance - */ - Object.defineProperty(GetIdentityKeysResponseV0.prototype, "result", { - get: $util.oneOfGetter($oneOfFields = ["keys", "proof"]), - set: $util.oneOfSetter($oneOfFields) - }); + /** + * Encodes the specified IdentityKeys message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IIdentityKeys} message IdentityKeys message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + IdentityKeys.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.identityId != null && Object.hasOwnProperty.call(message, "identityId")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.identityId); + if (message.keys != null && message.keys.length) + for (var i = 0; i < message.keys.length; ++i) + $root.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.encode(message.keys[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + return writer; + }; - /** - * Creates a new GetIdentityKeysResponseV0 instance using the specified properties. - * @function create - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0 - * @static - * @param {org.dash.platform.dapi.v0.GetIdentityKeysResponse.IGetIdentityKeysResponseV0=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} GetIdentityKeysResponseV0 instance - */ - GetIdentityKeysResponseV0.create = function create(properties) { - return new GetIdentityKeysResponseV0(properties); - }; - - /** - * Encodes the specified GetIdentityKeysResponseV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.verify|verify} messages. - * @function encode - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0 - * @static - * @param {org.dash.platform.dapi.v0.GetIdentityKeysResponse.IGetIdentityKeysResponseV0} message GetIdentityKeysResponseV0 message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - GetIdentityKeysResponseV0.encode = function encode(message, writer) { - if (!writer) - writer = $Writer.create(); - if (message.keys != null && Object.hasOwnProperty.call(message, "keys")) - $root.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.encode(message.keys, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); - if (message.proof != null && Object.hasOwnProperty.call(message, "proof")) - $root.org.dash.platform.dapi.v0.Proof.encode(message.proof, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); - if (message.metadata != null && Object.hasOwnProperty.call(message, "metadata")) - $root.org.dash.platform.dapi.v0.ResponseMetadata.encode(message.metadata, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); - return writer; - }; - - /** - * Encodes the specified GetIdentityKeysResponseV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.verify|verify} messages. - * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0 - * @static - * @param {org.dash.platform.dapi.v0.GetIdentityKeysResponse.IGetIdentityKeysResponseV0} message GetIdentityKeysResponseV0 message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - GetIdentityKeysResponseV0.encodeDelimited = function encodeDelimited(message, writer) { - return this.encode(message, writer).ldelim(); - }; - - /** - * Decodes a GetIdentityKeysResponseV0 message from the specified reader or buffer. - * @function decode - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0 - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} GetIdentityKeysResponseV0 - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - GetIdentityKeysResponseV0.decode = function decode(reader, length) { - if (!(reader instanceof $Reader)) - reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0(); - while (reader.pos < end) { - var tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - message.keys = $root.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.decode(reader, reader.uint32()); - break; - case 2: - message.proof = $root.org.dash.platform.dapi.v0.Proof.decode(reader, reader.uint32()); - break; - case 3: - message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.decode(reader, reader.uint32()); - break; - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }; - - /** - * Decodes a GetIdentityKeysResponseV0 message from the specified reader or buffer, length delimited. - * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0 - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} GetIdentityKeysResponseV0 - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - GetIdentityKeysResponseV0.decodeDelimited = function decodeDelimited(reader) { - if (!(reader instanceof $Reader)) - reader = new $Reader(reader); - return this.decode(reader, reader.uint32()); - }; - - /** - * Verifies a GetIdentityKeysResponseV0 message. - * @function verify - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0 - * @static - * @param {Object.} message Plain object to verify - * @returns {string|null} `null` if valid, otherwise the reason why it is not - */ - GetIdentityKeysResponseV0.verify = function verify(message) { - if (typeof message !== "object" || message === null) - return "object expected"; - var properties = {}; - if (message.keys != null && message.hasOwnProperty("keys")) { - properties.result = 1; - { - var error = $root.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.verify(message.keys); - if (error) - return "keys." + error; - } - } - if (message.proof != null && message.hasOwnProperty("proof")) { - if (properties.result === 1) - return "result: multiple values"; - properties.result = 1; - { - var error = $root.org.dash.platform.dapi.v0.Proof.verify(message.proof); - if (error) - return "proof." + error; - } - } - if (message.metadata != null && message.hasOwnProperty("metadata")) { - var error = $root.org.dash.platform.dapi.v0.ResponseMetadata.verify(message.metadata); - if (error) - return "metadata." + error; - } - return null; - }; - - /** - * Creates a GetIdentityKeysResponseV0 message from a plain object. Also converts values to their respective internal types. - * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0 - * @static - * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} GetIdentityKeysResponseV0 - */ - GetIdentityKeysResponseV0.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0) - return object; - var message = new $root.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0(); - if (object.keys != null) { - if (typeof object.keys !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.keys: object expected"); - message.keys = $root.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.fromObject(object.keys); - } - if (object.proof != null) { - if (typeof object.proof !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.proof: object expected"); - message.proof = $root.org.dash.platform.dapi.v0.Proof.fromObject(object.proof); - } - if (object.metadata != null) { - if (typeof object.metadata !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.metadata: object expected"); - message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.fromObject(object.metadata); - } - return message; - }; - - /** - * Creates a plain object from a GetIdentityKeysResponseV0 message. Also converts values to other types if specified. - * @function toObject - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0 - * @static - * @param {org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} message GetIdentityKeysResponseV0 - * @param {$protobuf.IConversionOptions} [options] Conversion options - * @returns {Object.} Plain object - */ - GetIdentityKeysResponseV0.toObject = function toObject(message, options) { - if (!options) - options = {}; - var object = {}; - if (options.defaults) - object.metadata = null; - if (message.keys != null && message.hasOwnProperty("keys")) { - object.keys = $root.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.toObject(message.keys, options); - if (options.oneofs) - object.result = "keys"; - } - if (message.proof != null && message.hasOwnProperty("proof")) { - object.proof = $root.org.dash.platform.dapi.v0.Proof.toObject(message.proof, options); - if (options.oneofs) - object.result = "proof"; - } - if (message.metadata != null && message.hasOwnProperty("metadata")) - object.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.toObject(message.metadata, options); - return object; - }; - - /** - * Converts this GetIdentityKeysResponseV0 to JSON. - * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0 - * @instance - * @returns {Object.} JSON object - */ - GetIdentityKeysResponseV0.prototype.toJSON = function toJSON() { - return this.constructor.toObject(this, $protobuf.util.toJSONOptions); - }; - - GetIdentityKeysResponseV0.Keys = (function() { + /** + * Encodes the specified IdentityKeys message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IIdentityKeys} message IdentityKeys message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + IdentityKeys.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; /** - * Properties of a Keys. - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0 - * @interface IKeys - * @property {Array.|null} [keysBytes] Keys keysBytes + * Decodes an IdentityKeys message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} IdentityKeys + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing */ + IdentityKeys.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.identityId = reader.bytes(); + break; + case 2: + if (!(message.keys && message.keys.length)) + message.keys = []; + message.keys.push($root.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.decode(reader, reader.uint32())); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; /** - * Constructs a new Keys. - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0 - * @classdesc Represents a Keys. - * @implements IKeys - * @constructor - * @param {org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.IKeys=} [properties] Properties to set + * Decodes an IdentityKeys message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} IdentityKeys + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - function Keys(properties) { - this.keysBytes = []; - if (properties) - for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) - if (properties[keys[i]] != null) - this[keys[i]] = properties[keys[i]]; - } + IdentityKeys.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; /** - * Keys keysBytes. - * @member {Array.} keysBytes - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys - * @instance + * Verifies an IdentityKeys message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - Keys.prototype.keysBytes = $util.emptyArray; + IdentityKeys.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.identityId != null && message.hasOwnProperty("identityId")) + if (!(message.identityId && typeof message.identityId.length === "number" || $util.isString(message.identityId))) + return "identityId: buffer expected"; + if (message.keys != null && message.hasOwnProperty("keys")) { + if (!Array.isArray(message.keys)) + return "keys: array expected"; + for (var i = 0; i < message.keys.length; ++i) { + var error = $root.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.verify(message.keys[i]); + if (error) + return "keys." + error; + } + } + return null; + }; /** - * Creates a new Keys instance using the specified properties. + * Creates an IdentityKeys message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys + * @static + * @param {Object.} object Plain object + * @returns {org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} IdentityKeys + */ + IdentityKeys.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys(); + if (object.identityId != null) + if (typeof object.identityId === "string") + $util.base64.decode(object.identityId, message.identityId = $util.newBuffer($util.base64.length(object.identityId)), 0); + else if (object.identityId.length >= 0) + message.identityId = object.identityId; + if (object.keys) { + if (!Array.isArray(object.keys)) + throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.keys: array expected"); + message.keys = []; + for (var i = 0; i < object.keys.length; ++i) { + if (typeof object.keys[i] !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.keys: object expected"); + message.keys[i] = $root.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.fromObject(object.keys[i]); + } + } + return message; + }; + + /** + * Creates a plain object from an IdentityKeys message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} message IdentityKeys + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + IdentityKeys.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.keys = []; + if (options.defaults) + if (options.bytes === String) + object.identityId = ""; + else { + object.identityId = []; + if (options.bytes !== Array) + object.identityId = $util.newBuffer(object.identityId); + } + if (message.identityId != null && message.hasOwnProperty("identityId")) + object.identityId = options.bytes === String ? $util.base64.encode(message.identityId, 0, message.identityId.length) : options.bytes === Array ? Array.prototype.slice.call(message.identityId) : message.identityId; + if (message.keys && message.keys.length) { + object.keys = []; + for (var j = 0; j < message.keys.length; ++j) + object.keys[j] = $root.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.toObject(message.keys[j], options); + } + return object; + }; + + /** + * Converts this IdentityKeys to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys + * @instance + * @returns {Object.} JSON object + */ + IdentityKeys.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return IdentityKeys; + })(); + + GetIdentitiesContractKeysResponseV0.IdentitiesKeys = (function() { + + /** + * Properties of an IdentitiesKeys. + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0 + * @interface IIdentitiesKeys + * @property {Array.|null} [entries] IdentitiesKeys entries + */ + + /** + * Constructs a new IdentitiesKeys. + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0 + * @classdesc Represents an IdentitiesKeys. + * @implements IIdentitiesKeys + * @constructor + * @param {org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IIdentitiesKeys=} [properties] Properties to set + */ + function IdentitiesKeys(properties) { + this.entries = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * IdentitiesKeys entries. + * @member {Array.} entries + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys + * @instance + */ + IdentitiesKeys.prototype.entries = $util.emptyArray; + + /** + * Creates a new IdentitiesKeys instance using the specified properties. * @function create - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys * @static - * @param {org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.IKeys=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} Keys instance + * @param {org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IIdentitiesKeys=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} IdentitiesKeys instance */ - Keys.create = function create(properties) { - return new Keys(properties); + IdentitiesKeys.create = function create(properties) { + return new IdentitiesKeys(properties); }; /** - * Encodes the specified Keys message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.verify|verify} messages. + * Encodes the specified IdentitiesKeys message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.verify|verify} messages. * @function encode - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys * @static - * @param {org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.IKeys} message Keys message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IIdentitiesKeys} message IdentitiesKeys message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - Keys.encode = function encode(message, writer) { + IdentitiesKeys.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.keysBytes != null && message.keysBytes.length) - for (var i = 0; i < message.keysBytes.length; ++i) - writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.keysBytes[i]); + if (message.entries != null && message.entries.length) + for (var i = 0; i < message.entries.length; ++i) + $root.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.encode(message.entries[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); return writer; }; /** - * Encodes the specified Keys message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.verify|verify} messages. + * Encodes the specified IdentitiesKeys message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.verify|verify} messages. * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys * @static - * @param {org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.IKeys} message Keys message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IIdentitiesKeys} message IdentitiesKeys message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - Keys.encodeDelimited = function encodeDelimited(message, writer) { + IdentitiesKeys.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a Keys message from the specified reader or buffer. + * Decodes an IdentitiesKeys message from the specified reader or buffer. * @function decode - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} Keys + * @returns {org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} IdentitiesKeys * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - Keys.decode = function decode(reader, length) { + IdentitiesKeys.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys(); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { case 1: - if (!(message.keysBytes && message.keysBytes.length)) - message.keysBytes = []; - message.keysBytes.push(reader.bytes()); + if (!(message.entries && message.entries.length)) + message.entries = []; + message.entries.push($root.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.decode(reader, reader.uint32())); break; default: reader.skipType(tag & 7); @@ -10672,108 +10865,110 @@ $root.org = (function() { }; /** - * Decodes a Keys message from the specified reader or buffer, length delimited. + * Decodes an IdentitiesKeys message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} Keys + * @returns {org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} IdentitiesKeys * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - Keys.decodeDelimited = function decodeDelimited(reader) { + IdentitiesKeys.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a Keys message. + * Verifies an IdentitiesKeys message. * @function verify - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - Keys.verify = function verify(message) { + IdentitiesKeys.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; - if (message.keysBytes != null && message.hasOwnProperty("keysBytes")) { - if (!Array.isArray(message.keysBytes)) - return "keysBytes: array expected"; - for (var i = 0; i < message.keysBytes.length; ++i) - if (!(message.keysBytes[i] && typeof message.keysBytes[i].length === "number" || $util.isString(message.keysBytes[i]))) - return "keysBytes: buffer[] expected"; + if (message.entries != null && message.hasOwnProperty("entries")) { + if (!Array.isArray(message.entries)) + return "entries: array expected"; + for (var i = 0; i < message.entries.length; ++i) { + var error = $root.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.verify(message.entries[i]); + if (error) + return "entries." + error; + } } return null; }; /** - * Creates a Keys message from a plain object. Also converts values to their respective internal types. + * Creates an IdentitiesKeys message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys * @static * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} Keys + * @returns {org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} IdentitiesKeys */ - Keys.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys) + IdentitiesKeys.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys) return object; - var message = new $root.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys(); - if (object.keysBytes) { - if (!Array.isArray(object.keysBytes)) - throw TypeError(".org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.keysBytes: array expected"); - message.keysBytes = []; - for (var i = 0; i < object.keysBytes.length; ++i) - if (typeof object.keysBytes[i] === "string") - $util.base64.decode(object.keysBytes[i], message.keysBytes[i] = $util.newBuffer($util.base64.length(object.keysBytes[i])), 0); - else if (object.keysBytes[i].length >= 0) - message.keysBytes[i] = object.keysBytes[i]; + var message = new $root.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys(); + if (object.entries) { + if (!Array.isArray(object.entries)) + throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.entries: array expected"); + message.entries = []; + for (var i = 0; i < object.entries.length; ++i) { + if (typeof object.entries[i] !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.entries: object expected"); + message.entries[i] = $root.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.fromObject(object.entries[i]); + } } return message; }; /** - * Creates a plain object from a Keys message. Also converts values to other types if specified. + * Creates a plain object from an IdentitiesKeys message. Also converts values to other types if specified. * @function toObject - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys * @static - * @param {org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} message Keys + * @param {org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} message IdentitiesKeys * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - Keys.toObject = function toObject(message, options) { + IdentitiesKeys.toObject = function toObject(message, options) { if (!options) options = {}; var object = {}; if (options.arrays || options.defaults) - object.keysBytes = []; - if (message.keysBytes && message.keysBytes.length) { - object.keysBytes = []; - for (var j = 0; j < message.keysBytes.length; ++j) - object.keysBytes[j] = options.bytes === String ? $util.base64.encode(message.keysBytes[j], 0, message.keysBytes[j].length) : options.bytes === Array ? Array.prototype.slice.call(message.keysBytes[j]) : message.keysBytes[j]; + object.entries = []; + if (message.entries && message.entries.length) { + object.entries = []; + for (var j = 0; j < message.entries.length; ++j) + object.entries[j] = $root.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.toObject(message.entries[j], options); } return object; }; /** - * Converts this Keys to JSON. + * Converts this IdentitiesKeys to JSON. * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys + * @memberof org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys * @instance * @returns {Object.} JSON object */ - Keys.prototype.toJSON = function toJSON() { + IdentitiesKeys.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - return Keys; + return IdentitiesKeys; })(); - return GetIdentityKeysResponseV0; + return GetIdentitiesContractKeysResponseV0; })(); - return GetIdentityKeysResponse; + return GetIdentitiesContractKeysResponse; })(); v0.GetProofsRequest = (function() { @@ -11983,1852 +12178,51 @@ $root.org = (function() { else { object.contractId = []; if (options.bytes !== Array) - object.contractId = $util.newBuffer(object.contractId); - } - if (message.contractId != null && message.hasOwnProperty("contractId")) - object.contractId = options.bytes === String ? $util.base64.encode(message.contractId, 0, message.contractId.length) : options.bytes === Array ? Array.prototype.slice.call(message.contractId) : message.contractId; - return object; - }; - - /** - * Converts this ContractRequest to JSON. - * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest - * @instance - * @returns {Object.} JSON object - */ - ContractRequest.prototype.toJSON = function toJSON() { - return this.constructor.toObject(this, $protobuf.util.toJSONOptions); - }; - - return ContractRequest; - })(); - - return GetProofsRequestV0; - })(); - - return GetProofsRequest; - })(); - - v0.GetProofsResponse = (function() { - - /** - * Properties of a GetProofsResponse. - * @memberof org.dash.platform.dapi.v0 - * @interface IGetProofsResponse - * @property {org.dash.platform.dapi.v0.GetProofsResponse.IGetProofsResponseV0|null} [v0] GetProofsResponse v0 - */ - - /** - * Constructs a new GetProofsResponse. - * @memberof org.dash.platform.dapi.v0 - * @classdesc Represents a GetProofsResponse. - * @implements IGetProofsResponse - * @constructor - * @param {org.dash.platform.dapi.v0.IGetProofsResponse=} [properties] Properties to set - */ - function GetProofsResponse(properties) { - if (properties) - for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) - if (properties[keys[i]] != null) - this[keys[i]] = properties[keys[i]]; - } - - /** - * GetProofsResponse v0. - * @member {org.dash.platform.dapi.v0.GetProofsResponse.IGetProofsResponseV0|null|undefined} v0 - * @memberof org.dash.platform.dapi.v0.GetProofsResponse - * @instance - */ - GetProofsResponse.prototype.v0 = null; - - // OneOf field names bound to virtual getters and setters - var $oneOfFields; - - /** - * GetProofsResponse version. - * @member {"v0"|undefined} version - * @memberof org.dash.platform.dapi.v0.GetProofsResponse - * @instance - */ - Object.defineProperty(GetProofsResponse.prototype, "version", { - get: $util.oneOfGetter($oneOfFields = ["v0"]), - set: $util.oneOfSetter($oneOfFields) - }); - - /** - * Creates a new GetProofsResponse instance using the specified properties. - * @function create - * @memberof org.dash.platform.dapi.v0.GetProofsResponse - * @static - * @param {org.dash.platform.dapi.v0.IGetProofsResponse=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetProofsResponse} GetProofsResponse instance - */ - GetProofsResponse.create = function create(properties) { - return new GetProofsResponse(properties); - }; - - /** - * Encodes the specified GetProofsResponse message. Does not implicitly {@link org.dash.platform.dapi.v0.GetProofsResponse.verify|verify} messages. - * @function encode - * @memberof org.dash.platform.dapi.v0.GetProofsResponse - * @static - * @param {org.dash.platform.dapi.v0.IGetProofsResponse} message GetProofsResponse message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - GetProofsResponse.encode = function encode(message, writer) { - if (!writer) - writer = $Writer.create(); - if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) - $root.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); - return writer; - }; - - /** - * Encodes the specified GetProofsResponse message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetProofsResponse.verify|verify} messages. - * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetProofsResponse - * @static - * @param {org.dash.platform.dapi.v0.IGetProofsResponse} message GetProofsResponse message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - GetProofsResponse.encodeDelimited = function encodeDelimited(message, writer) { - return this.encode(message, writer).ldelim(); - }; - - /** - * Decodes a GetProofsResponse message from the specified reader or buffer. - * @function decode - * @memberof org.dash.platform.dapi.v0.GetProofsResponse - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetProofsResponse} GetProofsResponse - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - GetProofsResponse.decode = function decode(reader, length) { - if (!(reader instanceof $Reader)) - reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetProofsResponse(); - while (reader.pos < end) { - var tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - message.v0 = $root.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.decode(reader, reader.uint32()); - break; - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }; - - /** - * Decodes a GetProofsResponse message from the specified reader or buffer, length delimited. - * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetProofsResponse - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetProofsResponse} GetProofsResponse - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - GetProofsResponse.decodeDelimited = function decodeDelimited(reader) { - if (!(reader instanceof $Reader)) - reader = new $Reader(reader); - return this.decode(reader, reader.uint32()); - }; - - /** - * Verifies a GetProofsResponse message. - * @function verify - * @memberof org.dash.platform.dapi.v0.GetProofsResponse - * @static - * @param {Object.} message Plain object to verify - * @returns {string|null} `null` if valid, otherwise the reason why it is not - */ - GetProofsResponse.verify = function verify(message) { - if (typeof message !== "object" || message === null) - return "object expected"; - var properties = {}; - if (message.v0 != null && message.hasOwnProperty("v0")) { - properties.version = 1; - { - var error = $root.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.verify(message.v0); - if (error) - return "v0." + error; - } - } - return null; - }; - - /** - * Creates a GetProofsResponse message from a plain object. Also converts values to their respective internal types. - * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetProofsResponse - * @static - * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetProofsResponse} GetProofsResponse - */ - GetProofsResponse.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetProofsResponse) - return object; - var message = new $root.org.dash.platform.dapi.v0.GetProofsResponse(); - if (object.v0 != null) { - if (typeof object.v0 !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetProofsResponse.v0: object expected"); - message.v0 = $root.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.fromObject(object.v0); - } - return message; - }; - - /** - * Creates a plain object from a GetProofsResponse message. Also converts values to other types if specified. - * @function toObject - * @memberof org.dash.platform.dapi.v0.GetProofsResponse - * @static - * @param {org.dash.platform.dapi.v0.GetProofsResponse} message GetProofsResponse - * @param {$protobuf.IConversionOptions} [options] Conversion options - * @returns {Object.} Plain object - */ - GetProofsResponse.toObject = function toObject(message, options) { - if (!options) - options = {}; - var object = {}; - if (message.v0 != null && message.hasOwnProperty("v0")) { - object.v0 = $root.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.toObject(message.v0, options); - if (options.oneofs) - object.version = "v0"; - } - return object; - }; - - /** - * Converts this GetProofsResponse to JSON. - * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetProofsResponse - * @instance - * @returns {Object.} JSON object - */ - GetProofsResponse.prototype.toJSON = function toJSON() { - return this.constructor.toObject(this, $protobuf.util.toJSONOptions); - }; - - GetProofsResponse.GetProofsResponseV0 = (function() { - - /** - * Properties of a GetProofsResponseV0. - * @memberof org.dash.platform.dapi.v0.GetProofsResponse - * @interface IGetProofsResponseV0 - * @property {org.dash.platform.dapi.v0.IProof|null} [proof] GetProofsResponseV0 proof - * @property {org.dash.platform.dapi.v0.IResponseMetadata|null} [metadata] GetProofsResponseV0 metadata - */ - - /** - * Constructs a new GetProofsResponseV0. - * @memberof org.dash.platform.dapi.v0.GetProofsResponse - * @classdesc Represents a GetProofsResponseV0. - * @implements IGetProofsResponseV0 - * @constructor - * @param {org.dash.platform.dapi.v0.GetProofsResponse.IGetProofsResponseV0=} [properties] Properties to set - */ - function GetProofsResponseV0(properties) { - if (properties) - for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) - if (properties[keys[i]] != null) - this[keys[i]] = properties[keys[i]]; - } - - /** - * GetProofsResponseV0 proof. - * @member {org.dash.platform.dapi.v0.IProof|null|undefined} proof - * @memberof org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0 - * @instance - */ - GetProofsResponseV0.prototype.proof = null; - - /** - * GetProofsResponseV0 metadata. - * @member {org.dash.platform.dapi.v0.IResponseMetadata|null|undefined} metadata - * @memberof org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0 - * @instance - */ - GetProofsResponseV0.prototype.metadata = null; - - // OneOf field names bound to virtual getters and setters - var $oneOfFields; - - /** - * GetProofsResponseV0 result. - * @member {"proof"|undefined} result - * @memberof org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0 - * @instance - */ - Object.defineProperty(GetProofsResponseV0.prototype, "result", { - get: $util.oneOfGetter($oneOfFields = ["proof"]), - set: $util.oneOfSetter($oneOfFields) - }); - - /** - * Creates a new GetProofsResponseV0 instance using the specified properties. - * @function create - * @memberof org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0 - * @static - * @param {org.dash.platform.dapi.v0.GetProofsResponse.IGetProofsResponseV0=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} GetProofsResponseV0 instance - */ - GetProofsResponseV0.create = function create(properties) { - return new GetProofsResponseV0(properties); - }; - - /** - * Encodes the specified GetProofsResponseV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.verify|verify} messages. - * @function encode - * @memberof org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0 - * @static - * @param {org.dash.platform.dapi.v0.GetProofsResponse.IGetProofsResponseV0} message GetProofsResponseV0 message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - GetProofsResponseV0.encode = function encode(message, writer) { - if (!writer) - writer = $Writer.create(); - if (message.proof != null && Object.hasOwnProperty.call(message, "proof")) - $root.org.dash.platform.dapi.v0.Proof.encode(message.proof, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); - if (message.metadata != null && Object.hasOwnProperty.call(message, "metadata")) - $root.org.dash.platform.dapi.v0.ResponseMetadata.encode(message.metadata, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); - return writer; - }; - - /** - * Encodes the specified GetProofsResponseV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.verify|verify} messages. - * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0 - * @static - * @param {org.dash.platform.dapi.v0.GetProofsResponse.IGetProofsResponseV0} message GetProofsResponseV0 message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - GetProofsResponseV0.encodeDelimited = function encodeDelimited(message, writer) { - return this.encode(message, writer).ldelim(); - }; - - /** - * Decodes a GetProofsResponseV0 message from the specified reader or buffer. - * @function decode - * @memberof org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0 - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} GetProofsResponseV0 - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - GetProofsResponseV0.decode = function decode(reader, length) { - if (!(reader instanceof $Reader)) - reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0(); - while (reader.pos < end) { - var tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - message.proof = $root.org.dash.platform.dapi.v0.Proof.decode(reader, reader.uint32()); - break; - case 2: - message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.decode(reader, reader.uint32()); - break; - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }; - - /** - * Decodes a GetProofsResponseV0 message from the specified reader or buffer, length delimited. - * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0 - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} GetProofsResponseV0 - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - GetProofsResponseV0.decodeDelimited = function decodeDelimited(reader) { - if (!(reader instanceof $Reader)) - reader = new $Reader(reader); - return this.decode(reader, reader.uint32()); - }; - - /** - * Verifies a GetProofsResponseV0 message. - * @function verify - * @memberof org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0 - * @static - * @param {Object.} message Plain object to verify - * @returns {string|null} `null` if valid, otherwise the reason why it is not - */ - GetProofsResponseV0.verify = function verify(message) { - if (typeof message !== "object" || message === null) - return "object expected"; - var properties = {}; - if (message.proof != null && message.hasOwnProperty("proof")) { - properties.result = 1; - { - var error = $root.org.dash.platform.dapi.v0.Proof.verify(message.proof); - if (error) - return "proof." + error; - } - } - if (message.metadata != null && message.hasOwnProperty("metadata")) { - var error = $root.org.dash.platform.dapi.v0.ResponseMetadata.verify(message.metadata); - if (error) - return "metadata." + error; - } - return null; - }; - - /** - * Creates a GetProofsResponseV0 message from a plain object. Also converts values to their respective internal types. - * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0 - * @static - * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} GetProofsResponseV0 - */ - GetProofsResponseV0.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0) - return object; - var message = new $root.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0(); - if (object.proof != null) { - if (typeof object.proof !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.proof: object expected"); - message.proof = $root.org.dash.platform.dapi.v0.Proof.fromObject(object.proof); - } - if (object.metadata != null) { - if (typeof object.metadata !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.metadata: object expected"); - message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.fromObject(object.metadata); - } - return message; - }; - - /** - * Creates a plain object from a GetProofsResponseV0 message. Also converts values to other types if specified. - * @function toObject - * @memberof org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0 - * @static - * @param {org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} message GetProofsResponseV0 - * @param {$protobuf.IConversionOptions} [options] Conversion options - * @returns {Object.} Plain object - */ - GetProofsResponseV0.toObject = function toObject(message, options) { - if (!options) - options = {}; - var object = {}; - if (options.defaults) - object.metadata = null; - if (message.proof != null && message.hasOwnProperty("proof")) { - object.proof = $root.org.dash.platform.dapi.v0.Proof.toObject(message.proof, options); - if (options.oneofs) - object.result = "proof"; - } - if (message.metadata != null && message.hasOwnProperty("metadata")) - object.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.toObject(message.metadata, options); - return object; - }; - - /** - * Converts this GetProofsResponseV0 to JSON. - * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0 - * @instance - * @returns {Object.} JSON object - */ - GetProofsResponseV0.prototype.toJSON = function toJSON() { - return this.constructor.toObject(this, $protobuf.util.toJSONOptions); - }; - - return GetProofsResponseV0; - })(); - - return GetProofsResponse; - })(); - - v0.GetDataContractRequest = (function() { - - /** - * Properties of a GetDataContractRequest. - * @memberof org.dash.platform.dapi.v0 - * @interface IGetDataContractRequest - * @property {org.dash.platform.dapi.v0.GetDataContractRequest.IGetDataContractRequestV0|null} [v0] GetDataContractRequest v0 - */ - - /** - * Constructs a new GetDataContractRequest. - * @memberof org.dash.platform.dapi.v0 - * @classdesc Represents a GetDataContractRequest. - * @implements IGetDataContractRequest - * @constructor - * @param {org.dash.platform.dapi.v0.IGetDataContractRequest=} [properties] Properties to set - */ - function GetDataContractRequest(properties) { - if (properties) - for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) - if (properties[keys[i]] != null) - this[keys[i]] = properties[keys[i]]; - } - - /** - * GetDataContractRequest v0. - * @member {org.dash.platform.dapi.v0.GetDataContractRequest.IGetDataContractRequestV0|null|undefined} v0 - * @memberof org.dash.platform.dapi.v0.GetDataContractRequest - * @instance - */ - GetDataContractRequest.prototype.v0 = null; - - // OneOf field names bound to virtual getters and setters - var $oneOfFields; - - /** - * GetDataContractRequest version. - * @member {"v0"|undefined} version - * @memberof org.dash.platform.dapi.v0.GetDataContractRequest - * @instance - */ - Object.defineProperty(GetDataContractRequest.prototype, "version", { - get: $util.oneOfGetter($oneOfFields = ["v0"]), - set: $util.oneOfSetter($oneOfFields) - }); - - /** - * Creates a new GetDataContractRequest instance using the specified properties. - * @function create - * @memberof org.dash.platform.dapi.v0.GetDataContractRequest - * @static - * @param {org.dash.platform.dapi.v0.IGetDataContractRequest=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetDataContractRequest} GetDataContractRequest instance - */ - GetDataContractRequest.create = function create(properties) { - return new GetDataContractRequest(properties); - }; - - /** - * Encodes the specified GetDataContractRequest message. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractRequest.verify|verify} messages. - * @function encode - * @memberof org.dash.platform.dapi.v0.GetDataContractRequest - * @static - * @param {org.dash.platform.dapi.v0.IGetDataContractRequest} message GetDataContractRequest message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - GetDataContractRequest.encode = function encode(message, writer) { - if (!writer) - writer = $Writer.create(); - if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) - $root.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); - return writer; - }; - - /** - * Encodes the specified GetDataContractRequest message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractRequest.verify|verify} messages. - * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetDataContractRequest - * @static - * @param {org.dash.platform.dapi.v0.IGetDataContractRequest} message GetDataContractRequest message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - GetDataContractRequest.encodeDelimited = function encodeDelimited(message, writer) { - return this.encode(message, writer).ldelim(); - }; - - /** - * Decodes a GetDataContractRequest message from the specified reader or buffer. - * @function decode - * @memberof org.dash.platform.dapi.v0.GetDataContractRequest - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetDataContractRequest} GetDataContractRequest - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - GetDataContractRequest.decode = function decode(reader, length) { - if (!(reader instanceof $Reader)) - reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetDataContractRequest(); - while (reader.pos < end) { - var tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - message.v0 = $root.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.decode(reader, reader.uint32()); - break; - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }; - - /** - * Decodes a GetDataContractRequest message from the specified reader or buffer, length delimited. - * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetDataContractRequest - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetDataContractRequest} GetDataContractRequest - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - GetDataContractRequest.decodeDelimited = function decodeDelimited(reader) { - if (!(reader instanceof $Reader)) - reader = new $Reader(reader); - return this.decode(reader, reader.uint32()); - }; - - /** - * Verifies a GetDataContractRequest message. - * @function verify - * @memberof org.dash.platform.dapi.v0.GetDataContractRequest - * @static - * @param {Object.} message Plain object to verify - * @returns {string|null} `null` if valid, otherwise the reason why it is not - */ - GetDataContractRequest.verify = function verify(message) { - if (typeof message !== "object" || message === null) - return "object expected"; - var properties = {}; - if (message.v0 != null && message.hasOwnProperty("v0")) { - properties.version = 1; - { - var error = $root.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.verify(message.v0); - if (error) - return "v0." + error; - } - } - return null; - }; - - /** - * Creates a GetDataContractRequest message from a plain object. Also converts values to their respective internal types. - * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetDataContractRequest - * @static - * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetDataContractRequest} GetDataContractRequest - */ - GetDataContractRequest.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetDataContractRequest) - return object; - var message = new $root.org.dash.platform.dapi.v0.GetDataContractRequest(); - if (object.v0 != null) { - if (typeof object.v0 !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetDataContractRequest.v0: object expected"); - message.v0 = $root.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.fromObject(object.v0); - } - return message; - }; - - /** - * Creates a plain object from a GetDataContractRequest message. Also converts values to other types if specified. - * @function toObject - * @memberof org.dash.platform.dapi.v0.GetDataContractRequest - * @static - * @param {org.dash.platform.dapi.v0.GetDataContractRequest} message GetDataContractRequest - * @param {$protobuf.IConversionOptions} [options] Conversion options - * @returns {Object.} Plain object - */ - GetDataContractRequest.toObject = function toObject(message, options) { - if (!options) - options = {}; - var object = {}; - if (message.v0 != null && message.hasOwnProperty("v0")) { - object.v0 = $root.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.toObject(message.v0, options); - if (options.oneofs) - object.version = "v0"; - } - return object; - }; - - /** - * Converts this GetDataContractRequest to JSON. - * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetDataContractRequest - * @instance - * @returns {Object.} JSON object - */ - GetDataContractRequest.prototype.toJSON = function toJSON() { - return this.constructor.toObject(this, $protobuf.util.toJSONOptions); - }; - - GetDataContractRequest.GetDataContractRequestV0 = (function() { - - /** - * Properties of a GetDataContractRequestV0. - * @memberof org.dash.platform.dapi.v0.GetDataContractRequest - * @interface IGetDataContractRequestV0 - * @property {Uint8Array|null} [id] GetDataContractRequestV0 id - * @property {boolean|null} [prove] GetDataContractRequestV0 prove - */ - - /** - * Constructs a new GetDataContractRequestV0. - * @memberof org.dash.platform.dapi.v0.GetDataContractRequest - * @classdesc Represents a GetDataContractRequestV0. - * @implements IGetDataContractRequestV0 - * @constructor - * @param {org.dash.platform.dapi.v0.GetDataContractRequest.IGetDataContractRequestV0=} [properties] Properties to set - */ - function GetDataContractRequestV0(properties) { - if (properties) - for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) - if (properties[keys[i]] != null) - this[keys[i]] = properties[keys[i]]; - } - - /** - * GetDataContractRequestV0 id. - * @member {Uint8Array} id - * @memberof org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0 - * @instance - */ - GetDataContractRequestV0.prototype.id = $util.newBuffer([]); - - /** - * GetDataContractRequestV0 prove. - * @member {boolean} prove - * @memberof org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0 - * @instance - */ - GetDataContractRequestV0.prototype.prove = false; - - /** - * Creates a new GetDataContractRequestV0 instance using the specified properties. - * @function create - * @memberof org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0 - * @static - * @param {org.dash.platform.dapi.v0.GetDataContractRequest.IGetDataContractRequestV0=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0} GetDataContractRequestV0 instance - */ - GetDataContractRequestV0.create = function create(properties) { - return new GetDataContractRequestV0(properties); - }; - - /** - * Encodes the specified GetDataContractRequestV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.verify|verify} messages. - * @function encode - * @memberof org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0 - * @static - * @param {org.dash.platform.dapi.v0.GetDataContractRequest.IGetDataContractRequestV0} message GetDataContractRequestV0 message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - GetDataContractRequestV0.encode = function encode(message, writer) { - if (!writer) - writer = $Writer.create(); - if (message.id != null && Object.hasOwnProperty.call(message, "id")) - writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.id); - if (message.prove != null && Object.hasOwnProperty.call(message, "prove")) - writer.uint32(/* id 2, wireType 0 =*/16).bool(message.prove); - return writer; - }; - - /** - * Encodes the specified GetDataContractRequestV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.verify|verify} messages. - * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0 - * @static - * @param {org.dash.platform.dapi.v0.GetDataContractRequest.IGetDataContractRequestV0} message GetDataContractRequestV0 message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - GetDataContractRequestV0.encodeDelimited = function encodeDelimited(message, writer) { - return this.encode(message, writer).ldelim(); - }; - - /** - * Decodes a GetDataContractRequestV0 message from the specified reader or buffer. - * @function decode - * @memberof org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0 - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0} GetDataContractRequestV0 - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - GetDataContractRequestV0.decode = function decode(reader, length) { - if (!(reader instanceof $Reader)) - reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0(); - while (reader.pos < end) { - var tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - message.id = reader.bytes(); - break; - case 2: - message.prove = reader.bool(); - break; - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }; - - /** - * Decodes a GetDataContractRequestV0 message from the specified reader or buffer, length delimited. - * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0 - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0} GetDataContractRequestV0 - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - GetDataContractRequestV0.decodeDelimited = function decodeDelimited(reader) { - if (!(reader instanceof $Reader)) - reader = new $Reader(reader); - return this.decode(reader, reader.uint32()); - }; - - /** - * Verifies a GetDataContractRequestV0 message. - * @function verify - * @memberof org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0 - * @static - * @param {Object.} message Plain object to verify - * @returns {string|null} `null` if valid, otherwise the reason why it is not - */ - GetDataContractRequestV0.verify = function verify(message) { - if (typeof message !== "object" || message === null) - return "object expected"; - if (message.id != null && message.hasOwnProperty("id")) - if (!(message.id && typeof message.id.length === "number" || $util.isString(message.id))) - return "id: buffer expected"; - if (message.prove != null && message.hasOwnProperty("prove")) - if (typeof message.prove !== "boolean") - return "prove: boolean expected"; - return null; - }; - - /** - * Creates a GetDataContractRequestV0 message from a plain object. Also converts values to their respective internal types. - * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0 - * @static - * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0} GetDataContractRequestV0 - */ - GetDataContractRequestV0.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0) - return object; - var message = new $root.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0(); - if (object.id != null) - if (typeof object.id === "string") - $util.base64.decode(object.id, message.id = $util.newBuffer($util.base64.length(object.id)), 0); - else if (object.id.length >= 0) - message.id = object.id; - if (object.prove != null) - message.prove = Boolean(object.prove); - return message; - }; - - /** - * Creates a plain object from a GetDataContractRequestV0 message. Also converts values to other types if specified. - * @function toObject - * @memberof org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0 - * @static - * @param {org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0} message GetDataContractRequestV0 - * @param {$protobuf.IConversionOptions} [options] Conversion options - * @returns {Object.} Plain object - */ - GetDataContractRequestV0.toObject = function toObject(message, options) { - if (!options) - options = {}; - var object = {}; - if (options.defaults) { - if (options.bytes === String) - object.id = ""; - else { - object.id = []; - if (options.bytes !== Array) - object.id = $util.newBuffer(object.id); - } - object.prove = false; - } - if (message.id != null && message.hasOwnProperty("id")) - object.id = options.bytes === String ? $util.base64.encode(message.id, 0, message.id.length) : options.bytes === Array ? Array.prototype.slice.call(message.id) : message.id; - if (message.prove != null && message.hasOwnProperty("prove")) - object.prove = message.prove; - return object; - }; - - /** - * Converts this GetDataContractRequestV0 to JSON. - * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0 - * @instance - * @returns {Object.} JSON object - */ - GetDataContractRequestV0.prototype.toJSON = function toJSON() { - return this.constructor.toObject(this, $protobuf.util.toJSONOptions); - }; - - return GetDataContractRequestV0; - })(); - - return GetDataContractRequest; - })(); - - v0.GetDataContractResponse = (function() { - - /** - * Properties of a GetDataContractResponse. - * @memberof org.dash.platform.dapi.v0 - * @interface IGetDataContractResponse - * @property {org.dash.platform.dapi.v0.GetDataContractResponse.IGetDataContractResponseV0|null} [v0] GetDataContractResponse v0 - */ - - /** - * Constructs a new GetDataContractResponse. - * @memberof org.dash.platform.dapi.v0 - * @classdesc Represents a GetDataContractResponse. - * @implements IGetDataContractResponse - * @constructor - * @param {org.dash.platform.dapi.v0.IGetDataContractResponse=} [properties] Properties to set - */ - function GetDataContractResponse(properties) { - if (properties) - for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) - if (properties[keys[i]] != null) - this[keys[i]] = properties[keys[i]]; - } - - /** - * GetDataContractResponse v0. - * @member {org.dash.platform.dapi.v0.GetDataContractResponse.IGetDataContractResponseV0|null|undefined} v0 - * @memberof org.dash.platform.dapi.v0.GetDataContractResponse - * @instance - */ - GetDataContractResponse.prototype.v0 = null; - - // OneOf field names bound to virtual getters and setters - var $oneOfFields; - - /** - * GetDataContractResponse version. - * @member {"v0"|undefined} version - * @memberof org.dash.platform.dapi.v0.GetDataContractResponse - * @instance - */ - Object.defineProperty(GetDataContractResponse.prototype, "version", { - get: $util.oneOfGetter($oneOfFields = ["v0"]), - set: $util.oneOfSetter($oneOfFields) - }); - - /** - * Creates a new GetDataContractResponse instance using the specified properties. - * @function create - * @memberof org.dash.platform.dapi.v0.GetDataContractResponse - * @static - * @param {org.dash.platform.dapi.v0.IGetDataContractResponse=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetDataContractResponse} GetDataContractResponse instance - */ - GetDataContractResponse.create = function create(properties) { - return new GetDataContractResponse(properties); - }; - - /** - * Encodes the specified GetDataContractResponse message. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractResponse.verify|verify} messages. - * @function encode - * @memberof org.dash.platform.dapi.v0.GetDataContractResponse - * @static - * @param {org.dash.platform.dapi.v0.IGetDataContractResponse} message GetDataContractResponse message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - GetDataContractResponse.encode = function encode(message, writer) { - if (!writer) - writer = $Writer.create(); - if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) - $root.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); - return writer; - }; - - /** - * Encodes the specified GetDataContractResponse message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractResponse.verify|verify} messages. - * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetDataContractResponse - * @static - * @param {org.dash.platform.dapi.v0.IGetDataContractResponse} message GetDataContractResponse message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - GetDataContractResponse.encodeDelimited = function encodeDelimited(message, writer) { - return this.encode(message, writer).ldelim(); - }; - - /** - * Decodes a GetDataContractResponse message from the specified reader or buffer. - * @function decode - * @memberof org.dash.platform.dapi.v0.GetDataContractResponse - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetDataContractResponse} GetDataContractResponse - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - GetDataContractResponse.decode = function decode(reader, length) { - if (!(reader instanceof $Reader)) - reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetDataContractResponse(); - while (reader.pos < end) { - var tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - message.v0 = $root.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.decode(reader, reader.uint32()); - break; - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }; - - /** - * Decodes a GetDataContractResponse message from the specified reader or buffer, length delimited. - * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetDataContractResponse - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetDataContractResponse} GetDataContractResponse - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - GetDataContractResponse.decodeDelimited = function decodeDelimited(reader) { - if (!(reader instanceof $Reader)) - reader = new $Reader(reader); - return this.decode(reader, reader.uint32()); - }; - - /** - * Verifies a GetDataContractResponse message. - * @function verify - * @memberof org.dash.platform.dapi.v0.GetDataContractResponse - * @static - * @param {Object.} message Plain object to verify - * @returns {string|null} `null` if valid, otherwise the reason why it is not - */ - GetDataContractResponse.verify = function verify(message) { - if (typeof message !== "object" || message === null) - return "object expected"; - var properties = {}; - if (message.v0 != null && message.hasOwnProperty("v0")) { - properties.version = 1; - { - var error = $root.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.verify(message.v0); - if (error) - return "v0." + error; - } - } - return null; - }; - - /** - * Creates a GetDataContractResponse message from a plain object. Also converts values to their respective internal types. - * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetDataContractResponse - * @static - * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetDataContractResponse} GetDataContractResponse - */ - GetDataContractResponse.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetDataContractResponse) - return object; - var message = new $root.org.dash.platform.dapi.v0.GetDataContractResponse(); - if (object.v0 != null) { - if (typeof object.v0 !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetDataContractResponse.v0: object expected"); - message.v0 = $root.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.fromObject(object.v0); - } - return message; - }; - - /** - * Creates a plain object from a GetDataContractResponse message. Also converts values to other types if specified. - * @function toObject - * @memberof org.dash.platform.dapi.v0.GetDataContractResponse - * @static - * @param {org.dash.platform.dapi.v0.GetDataContractResponse} message GetDataContractResponse - * @param {$protobuf.IConversionOptions} [options] Conversion options - * @returns {Object.} Plain object - */ - GetDataContractResponse.toObject = function toObject(message, options) { - if (!options) - options = {}; - var object = {}; - if (message.v0 != null && message.hasOwnProperty("v0")) { - object.v0 = $root.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.toObject(message.v0, options); - if (options.oneofs) - object.version = "v0"; - } - return object; - }; - - /** - * Converts this GetDataContractResponse to JSON. - * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetDataContractResponse - * @instance - * @returns {Object.} JSON object - */ - GetDataContractResponse.prototype.toJSON = function toJSON() { - return this.constructor.toObject(this, $protobuf.util.toJSONOptions); - }; - - GetDataContractResponse.GetDataContractResponseV0 = (function() { - - /** - * Properties of a GetDataContractResponseV0. - * @memberof org.dash.platform.dapi.v0.GetDataContractResponse - * @interface IGetDataContractResponseV0 - * @property {Uint8Array|null} [dataContract] GetDataContractResponseV0 dataContract - * @property {org.dash.platform.dapi.v0.IProof|null} [proof] GetDataContractResponseV0 proof - * @property {org.dash.platform.dapi.v0.IResponseMetadata|null} [metadata] GetDataContractResponseV0 metadata - */ - - /** - * Constructs a new GetDataContractResponseV0. - * @memberof org.dash.platform.dapi.v0.GetDataContractResponse - * @classdesc Represents a GetDataContractResponseV0. - * @implements IGetDataContractResponseV0 - * @constructor - * @param {org.dash.platform.dapi.v0.GetDataContractResponse.IGetDataContractResponseV0=} [properties] Properties to set - */ - function GetDataContractResponseV0(properties) { - if (properties) - for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) - if (properties[keys[i]] != null) - this[keys[i]] = properties[keys[i]]; - } - - /** - * GetDataContractResponseV0 dataContract. - * @member {Uint8Array} dataContract - * @memberof org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0 - * @instance - */ - GetDataContractResponseV0.prototype.dataContract = $util.newBuffer([]); - - /** - * GetDataContractResponseV0 proof. - * @member {org.dash.platform.dapi.v0.IProof|null|undefined} proof - * @memberof org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0 - * @instance - */ - GetDataContractResponseV0.prototype.proof = null; - - /** - * GetDataContractResponseV0 metadata. - * @member {org.dash.platform.dapi.v0.IResponseMetadata|null|undefined} metadata - * @memberof org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0 - * @instance - */ - GetDataContractResponseV0.prototype.metadata = null; - - // OneOf field names bound to virtual getters and setters - var $oneOfFields; - - /** - * GetDataContractResponseV0 result. - * @member {"dataContract"|"proof"|undefined} result - * @memberof org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0 - * @instance - */ - Object.defineProperty(GetDataContractResponseV0.prototype, "result", { - get: $util.oneOfGetter($oneOfFields = ["dataContract", "proof"]), - set: $util.oneOfSetter($oneOfFields) - }); - - /** - * Creates a new GetDataContractResponseV0 instance using the specified properties. - * @function create - * @memberof org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0 - * @static - * @param {org.dash.platform.dapi.v0.GetDataContractResponse.IGetDataContractResponseV0=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} GetDataContractResponseV0 instance - */ - GetDataContractResponseV0.create = function create(properties) { - return new GetDataContractResponseV0(properties); - }; - - /** - * Encodes the specified GetDataContractResponseV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.verify|verify} messages. - * @function encode - * @memberof org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0 - * @static - * @param {org.dash.platform.dapi.v0.GetDataContractResponse.IGetDataContractResponseV0} message GetDataContractResponseV0 message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - GetDataContractResponseV0.encode = function encode(message, writer) { - if (!writer) - writer = $Writer.create(); - if (message.dataContract != null && Object.hasOwnProperty.call(message, "dataContract")) - writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.dataContract); - if (message.proof != null && Object.hasOwnProperty.call(message, "proof")) - $root.org.dash.platform.dapi.v0.Proof.encode(message.proof, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); - if (message.metadata != null && Object.hasOwnProperty.call(message, "metadata")) - $root.org.dash.platform.dapi.v0.ResponseMetadata.encode(message.metadata, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); - return writer; - }; - - /** - * Encodes the specified GetDataContractResponseV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.verify|verify} messages. - * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0 - * @static - * @param {org.dash.platform.dapi.v0.GetDataContractResponse.IGetDataContractResponseV0} message GetDataContractResponseV0 message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - GetDataContractResponseV0.encodeDelimited = function encodeDelimited(message, writer) { - return this.encode(message, writer).ldelim(); - }; - - /** - * Decodes a GetDataContractResponseV0 message from the specified reader or buffer. - * @function decode - * @memberof org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0 - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} GetDataContractResponseV0 - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - GetDataContractResponseV0.decode = function decode(reader, length) { - if (!(reader instanceof $Reader)) - reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0(); - while (reader.pos < end) { - var tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - message.dataContract = reader.bytes(); - break; - case 2: - message.proof = $root.org.dash.platform.dapi.v0.Proof.decode(reader, reader.uint32()); - break; - case 3: - message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.decode(reader, reader.uint32()); - break; - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }; - - /** - * Decodes a GetDataContractResponseV0 message from the specified reader or buffer, length delimited. - * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0 - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} GetDataContractResponseV0 - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - GetDataContractResponseV0.decodeDelimited = function decodeDelimited(reader) { - if (!(reader instanceof $Reader)) - reader = new $Reader(reader); - return this.decode(reader, reader.uint32()); - }; - - /** - * Verifies a GetDataContractResponseV0 message. - * @function verify - * @memberof org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0 - * @static - * @param {Object.} message Plain object to verify - * @returns {string|null} `null` if valid, otherwise the reason why it is not - */ - GetDataContractResponseV0.verify = function verify(message) { - if (typeof message !== "object" || message === null) - return "object expected"; - var properties = {}; - if (message.dataContract != null && message.hasOwnProperty("dataContract")) { - properties.result = 1; - if (!(message.dataContract && typeof message.dataContract.length === "number" || $util.isString(message.dataContract))) - return "dataContract: buffer expected"; - } - if (message.proof != null && message.hasOwnProperty("proof")) { - if (properties.result === 1) - return "result: multiple values"; - properties.result = 1; - { - var error = $root.org.dash.platform.dapi.v0.Proof.verify(message.proof); - if (error) - return "proof." + error; - } - } - if (message.metadata != null && message.hasOwnProperty("metadata")) { - var error = $root.org.dash.platform.dapi.v0.ResponseMetadata.verify(message.metadata); - if (error) - return "metadata." + error; - } - return null; - }; - - /** - * Creates a GetDataContractResponseV0 message from a plain object. Also converts values to their respective internal types. - * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0 - * @static - * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} GetDataContractResponseV0 - */ - GetDataContractResponseV0.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0) - return object; - var message = new $root.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0(); - if (object.dataContract != null) - if (typeof object.dataContract === "string") - $util.base64.decode(object.dataContract, message.dataContract = $util.newBuffer($util.base64.length(object.dataContract)), 0); - else if (object.dataContract.length >= 0) - message.dataContract = object.dataContract; - if (object.proof != null) { - if (typeof object.proof !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.proof: object expected"); - message.proof = $root.org.dash.platform.dapi.v0.Proof.fromObject(object.proof); - } - if (object.metadata != null) { - if (typeof object.metadata !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.metadata: object expected"); - message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.fromObject(object.metadata); - } - return message; - }; - - /** - * Creates a plain object from a GetDataContractResponseV0 message. Also converts values to other types if specified. - * @function toObject - * @memberof org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0 - * @static - * @param {org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} message GetDataContractResponseV0 - * @param {$protobuf.IConversionOptions} [options] Conversion options - * @returns {Object.} Plain object - */ - GetDataContractResponseV0.toObject = function toObject(message, options) { - if (!options) - options = {}; - var object = {}; - if (options.defaults) - object.metadata = null; - if (message.dataContract != null && message.hasOwnProperty("dataContract")) { - object.dataContract = options.bytes === String ? $util.base64.encode(message.dataContract, 0, message.dataContract.length) : options.bytes === Array ? Array.prototype.slice.call(message.dataContract) : message.dataContract; - if (options.oneofs) - object.result = "dataContract"; - } - if (message.proof != null && message.hasOwnProperty("proof")) { - object.proof = $root.org.dash.platform.dapi.v0.Proof.toObject(message.proof, options); - if (options.oneofs) - object.result = "proof"; - } - if (message.metadata != null && message.hasOwnProperty("metadata")) - object.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.toObject(message.metadata, options); - return object; - }; - - /** - * Converts this GetDataContractResponseV0 to JSON. - * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0 - * @instance - * @returns {Object.} JSON object - */ - GetDataContractResponseV0.prototype.toJSON = function toJSON() { - return this.constructor.toObject(this, $protobuf.util.toJSONOptions); - }; - - return GetDataContractResponseV0; - })(); - - return GetDataContractResponse; - })(); - - v0.GetDataContractsRequest = (function() { - - /** - * Properties of a GetDataContractsRequest. - * @memberof org.dash.platform.dapi.v0 - * @interface IGetDataContractsRequest - * @property {org.dash.platform.dapi.v0.GetDataContractsRequest.IGetDataContractsRequestV0|null} [v0] GetDataContractsRequest v0 - */ - - /** - * Constructs a new GetDataContractsRequest. - * @memberof org.dash.platform.dapi.v0 - * @classdesc Represents a GetDataContractsRequest. - * @implements IGetDataContractsRequest - * @constructor - * @param {org.dash.platform.dapi.v0.IGetDataContractsRequest=} [properties] Properties to set - */ - function GetDataContractsRequest(properties) { - if (properties) - for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) - if (properties[keys[i]] != null) - this[keys[i]] = properties[keys[i]]; - } - - /** - * GetDataContractsRequest v0. - * @member {org.dash.platform.dapi.v0.GetDataContractsRequest.IGetDataContractsRequestV0|null|undefined} v0 - * @memberof org.dash.platform.dapi.v0.GetDataContractsRequest - * @instance - */ - GetDataContractsRequest.prototype.v0 = null; - - // OneOf field names bound to virtual getters and setters - var $oneOfFields; - - /** - * GetDataContractsRequest version. - * @member {"v0"|undefined} version - * @memberof org.dash.platform.dapi.v0.GetDataContractsRequest - * @instance - */ - Object.defineProperty(GetDataContractsRequest.prototype, "version", { - get: $util.oneOfGetter($oneOfFields = ["v0"]), - set: $util.oneOfSetter($oneOfFields) - }); - - /** - * Creates a new GetDataContractsRequest instance using the specified properties. - * @function create - * @memberof org.dash.platform.dapi.v0.GetDataContractsRequest - * @static - * @param {org.dash.platform.dapi.v0.IGetDataContractsRequest=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetDataContractsRequest} GetDataContractsRequest instance - */ - GetDataContractsRequest.create = function create(properties) { - return new GetDataContractsRequest(properties); - }; - - /** - * Encodes the specified GetDataContractsRequest message. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractsRequest.verify|verify} messages. - * @function encode - * @memberof org.dash.platform.dapi.v0.GetDataContractsRequest - * @static - * @param {org.dash.platform.dapi.v0.IGetDataContractsRequest} message GetDataContractsRequest message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - GetDataContractsRequest.encode = function encode(message, writer) { - if (!writer) - writer = $Writer.create(); - if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) - $root.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); - return writer; - }; - - /** - * Encodes the specified GetDataContractsRequest message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractsRequest.verify|verify} messages. - * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetDataContractsRequest - * @static - * @param {org.dash.platform.dapi.v0.IGetDataContractsRequest} message GetDataContractsRequest message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - GetDataContractsRequest.encodeDelimited = function encodeDelimited(message, writer) { - return this.encode(message, writer).ldelim(); - }; - - /** - * Decodes a GetDataContractsRequest message from the specified reader or buffer. - * @function decode - * @memberof org.dash.platform.dapi.v0.GetDataContractsRequest - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetDataContractsRequest} GetDataContractsRequest - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - GetDataContractsRequest.decode = function decode(reader, length) { - if (!(reader instanceof $Reader)) - reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetDataContractsRequest(); - while (reader.pos < end) { - var tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - message.v0 = $root.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.decode(reader, reader.uint32()); - break; - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }; - - /** - * Decodes a GetDataContractsRequest message from the specified reader or buffer, length delimited. - * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetDataContractsRequest - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetDataContractsRequest} GetDataContractsRequest - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - GetDataContractsRequest.decodeDelimited = function decodeDelimited(reader) { - if (!(reader instanceof $Reader)) - reader = new $Reader(reader); - return this.decode(reader, reader.uint32()); - }; - - /** - * Verifies a GetDataContractsRequest message. - * @function verify - * @memberof org.dash.platform.dapi.v0.GetDataContractsRequest - * @static - * @param {Object.} message Plain object to verify - * @returns {string|null} `null` if valid, otherwise the reason why it is not - */ - GetDataContractsRequest.verify = function verify(message) { - if (typeof message !== "object" || message === null) - return "object expected"; - var properties = {}; - if (message.v0 != null && message.hasOwnProperty("v0")) { - properties.version = 1; - { - var error = $root.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.verify(message.v0); - if (error) - return "v0." + error; - } - } - return null; - }; - - /** - * Creates a GetDataContractsRequest message from a plain object. Also converts values to their respective internal types. - * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetDataContractsRequest - * @static - * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetDataContractsRequest} GetDataContractsRequest - */ - GetDataContractsRequest.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetDataContractsRequest) - return object; - var message = new $root.org.dash.platform.dapi.v0.GetDataContractsRequest(); - if (object.v0 != null) { - if (typeof object.v0 !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetDataContractsRequest.v0: object expected"); - message.v0 = $root.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.fromObject(object.v0); - } - return message; - }; - - /** - * Creates a plain object from a GetDataContractsRequest message. Also converts values to other types if specified. - * @function toObject - * @memberof org.dash.platform.dapi.v0.GetDataContractsRequest - * @static - * @param {org.dash.platform.dapi.v0.GetDataContractsRequest} message GetDataContractsRequest - * @param {$protobuf.IConversionOptions} [options] Conversion options - * @returns {Object.} Plain object - */ - GetDataContractsRequest.toObject = function toObject(message, options) { - if (!options) - options = {}; - var object = {}; - if (message.v0 != null && message.hasOwnProperty("v0")) { - object.v0 = $root.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.toObject(message.v0, options); - if (options.oneofs) - object.version = "v0"; - } - return object; - }; - - /** - * Converts this GetDataContractsRequest to JSON. - * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetDataContractsRequest - * @instance - * @returns {Object.} JSON object - */ - GetDataContractsRequest.prototype.toJSON = function toJSON() { - return this.constructor.toObject(this, $protobuf.util.toJSONOptions); - }; - - GetDataContractsRequest.GetDataContractsRequestV0 = (function() { - - /** - * Properties of a GetDataContractsRequestV0. - * @memberof org.dash.platform.dapi.v0.GetDataContractsRequest - * @interface IGetDataContractsRequestV0 - * @property {Array.|null} [ids] GetDataContractsRequestV0 ids - * @property {boolean|null} [prove] GetDataContractsRequestV0 prove - */ - - /** - * Constructs a new GetDataContractsRequestV0. - * @memberof org.dash.platform.dapi.v0.GetDataContractsRequest - * @classdesc Represents a GetDataContractsRequestV0. - * @implements IGetDataContractsRequestV0 - * @constructor - * @param {org.dash.platform.dapi.v0.GetDataContractsRequest.IGetDataContractsRequestV0=} [properties] Properties to set - */ - function GetDataContractsRequestV0(properties) { - this.ids = []; - if (properties) - for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) - if (properties[keys[i]] != null) - this[keys[i]] = properties[keys[i]]; - } - - /** - * GetDataContractsRequestV0 ids. - * @member {Array.} ids - * @memberof org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0 - * @instance - */ - GetDataContractsRequestV0.prototype.ids = $util.emptyArray; - - /** - * GetDataContractsRequestV0 prove. - * @member {boolean} prove - * @memberof org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0 - * @instance - */ - GetDataContractsRequestV0.prototype.prove = false; - - /** - * Creates a new GetDataContractsRequestV0 instance using the specified properties. - * @function create - * @memberof org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0 - * @static - * @param {org.dash.platform.dapi.v0.GetDataContractsRequest.IGetDataContractsRequestV0=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} GetDataContractsRequestV0 instance - */ - GetDataContractsRequestV0.create = function create(properties) { - return new GetDataContractsRequestV0(properties); - }; - - /** - * Encodes the specified GetDataContractsRequestV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.verify|verify} messages. - * @function encode - * @memberof org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0 - * @static - * @param {org.dash.platform.dapi.v0.GetDataContractsRequest.IGetDataContractsRequestV0} message GetDataContractsRequestV0 message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - GetDataContractsRequestV0.encode = function encode(message, writer) { - if (!writer) - writer = $Writer.create(); - if (message.ids != null && message.ids.length) - for (var i = 0; i < message.ids.length; ++i) - writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.ids[i]); - if (message.prove != null && Object.hasOwnProperty.call(message, "prove")) - writer.uint32(/* id 2, wireType 0 =*/16).bool(message.prove); - return writer; - }; - - /** - * Encodes the specified GetDataContractsRequestV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.verify|verify} messages. - * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0 - * @static - * @param {org.dash.platform.dapi.v0.GetDataContractsRequest.IGetDataContractsRequestV0} message GetDataContractsRequestV0 message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - GetDataContractsRequestV0.encodeDelimited = function encodeDelimited(message, writer) { - return this.encode(message, writer).ldelim(); - }; - - /** - * Decodes a GetDataContractsRequestV0 message from the specified reader or buffer. - * @function decode - * @memberof org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0 - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} GetDataContractsRequestV0 - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - GetDataContractsRequestV0.decode = function decode(reader, length) { - if (!(reader instanceof $Reader)) - reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0(); - while (reader.pos < end) { - var tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (!(message.ids && message.ids.length)) - message.ids = []; - message.ids.push(reader.bytes()); - break; - case 2: - message.prove = reader.bool(); - break; - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }; - - /** - * Decodes a GetDataContractsRequestV0 message from the specified reader or buffer, length delimited. - * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0 - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} GetDataContractsRequestV0 - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - GetDataContractsRequestV0.decodeDelimited = function decodeDelimited(reader) { - if (!(reader instanceof $Reader)) - reader = new $Reader(reader); - return this.decode(reader, reader.uint32()); - }; - - /** - * Verifies a GetDataContractsRequestV0 message. - * @function verify - * @memberof org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0 - * @static - * @param {Object.} message Plain object to verify - * @returns {string|null} `null` if valid, otherwise the reason why it is not - */ - GetDataContractsRequestV0.verify = function verify(message) { - if (typeof message !== "object" || message === null) - return "object expected"; - if (message.ids != null && message.hasOwnProperty("ids")) { - if (!Array.isArray(message.ids)) - return "ids: array expected"; - for (var i = 0; i < message.ids.length; ++i) - if (!(message.ids[i] && typeof message.ids[i].length === "number" || $util.isString(message.ids[i]))) - return "ids: buffer[] expected"; - } - if (message.prove != null && message.hasOwnProperty("prove")) - if (typeof message.prove !== "boolean") - return "prove: boolean expected"; - return null; - }; - - /** - * Creates a GetDataContractsRequestV0 message from a plain object. Also converts values to their respective internal types. - * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0 - * @static - * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} GetDataContractsRequestV0 - */ - GetDataContractsRequestV0.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0) + object.contractId = $util.newBuffer(object.contractId); + } + if (message.contractId != null && message.hasOwnProperty("contractId")) + object.contractId = options.bytes === String ? $util.base64.encode(message.contractId, 0, message.contractId.length) : options.bytes === Array ? Array.prototype.slice.call(message.contractId) : message.contractId; return object; - var message = new $root.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0(); - if (object.ids) { - if (!Array.isArray(object.ids)) - throw TypeError(".org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.ids: array expected"); - message.ids = []; - for (var i = 0; i < object.ids.length; ++i) - if (typeof object.ids[i] === "string") - $util.base64.decode(object.ids[i], message.ids[i] = $util.newBuffer($util.base64.length(object.ids[i])), 0); - else if (object.ids[i].length >= 0) - message.ids[i] = object.ids[i]; - } - if (object.prove != null) - message.prove = Boolean(object.prove); - return message; - }; + }; - /** - * Creates a plain object from a GetDataContractsRequestV0 message. Also converts values to other types if specified. - * @function toObject - * @memberof org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0 - * @static - * @param {org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} message GetDataContractsRequestV0 - * @param {$protobuf.IConversionOptions} [options] Conversion options - * @returns {Object.} Plain object - */ - GetDataContractsRequestV0.toObject = function toObject(message, options) { - if (!options) - options = {}; - var object = {}; - if (options.arrays || options.defaults) - object.ids = []; - if (options.defaults) - object.prove = false; - if (message.ids && message.ids.length) { - object.ids = []; - for (var j = 0; j < message.ids.length; ++j) - object.ids[j] = options.bytes === String ? $util.base64.encode(message.ids[j], 0, message.ids[j].length) : options.bytes === Array ? Array.prototype.slice.call(message.ids[j]) : message.ids[j]; - } - if (message.prove != null && message.hasOwnProperty("prove")) - object.prove = message.prove; - return object; - }; + /** + * Converts this ContractRequest to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest + * @instance + * @returns {Object.} JSON object + */ + ContractRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; - /** - * Converts this GetDataContractsRequestV0 to JSON. - * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0 - * @instance - * @returns {Object.} JSON object - */ - GetDataContractsRequestV0.prototype.toJSON = function toJSON() { - return this.constructor.toObject(this, $protobuf.util.toJSONOptions); - }; + return ContractRequest; + })(); - return GetDataContractsRequestV0; + return GetProofsRequestV0; })(); - return GetDataContractsRequest; + return GetProofsRequest; })(); - v0.GetDataContractsResponse = (function() { + v0.GetProofsResponse = (function() { /** - * Properties of a GetDataContractsResponse. + * Properties of a GetProofsResponse. * @memberof org.dash.platform.dapi.v0 - * @interface IGetDataContractsResponse - * @property {org.dash.platform.dapi.v0.GetDataContractsResponse.IGetDataContractsResponseV0|null} [v0] GetDataContractsResponse v0 + * @interface IGetProofsResponse + * @property {org.dash.platform.dapi.v0.GetProofsResponse.IGetProofsResponseV0|null} [v0] GetProofsResponse v0 */ /** - * Constructs a new GetDataContractsResponse. + * Constructs a new GetProofsResponse. * @memberof org.dash.platform.dapi.v0 - * @classdesc Represents a GetDataContractsResponse. - * @implements IGetDataContractsResponse + * @classdesc Represents a GetProofsResponse. + * @implements IGetProofsResponse * @constructor - * @param {org.dash.platform.dapi.v0.IGetDataContractsResponse=} [properties] Properties to set + * @param {org.dash.platform.dapi.v0.IGetProofsResponse=} [properties] Properties to set */ - function GetDataContractsResponse(properties) { + function GetProofsResponse(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -13836,89 +12230,89 @@ $root.org = (function() { } /** - * GetDataContractsResponse v0. - * @member {org.dash.platform.dapi.v0.GetDataContractsResponse.IGetDataContractsResponseV0|null|undefined} v0 - * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse + * GetProofsResponse v0. + * @member {org.dash.platform.dapi.v0.GetProofsResponse.IGetProofsResponseV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetProofsResponse * @instance */ - GetDataContractsResponse.prototype.v0 = null; + GetProofsResponse.prototype.v0 = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** - * GetDataContractsResponse version. + * GetProofsResponse version. * @member {"v0"|undefined} version - * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse + * @memberof org.dash.platform.dapi.v0.GetProofsResponse * @instance */ - Object.defineProperty(GetDataContractsResponse.prototype, "version", { + Object.defineProperty(GetProofsResponse.prototype, "version", { get: $util.oneOfGetter($oneOfFields = ["v0"]), set: $util.oneOfSetter($oneOfFields) }); /** - * Creates a new GetDataContractsResponse instance using the specified properties. + * Creates a new GetProofsResponse instance using the specified properties. * @function create - * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse + * @memberof org.dash.platform.dapi.v0.GetProofsResponse * @static - * @param {org.dash.platform.dapi.v0.IGetDataContractsResponse=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetDataContractsResponse} GetDataContractsResponse instance + * @param {org.dash.platform.dapi.v0.IGetProofsResponse=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetProofsResponse} GetProofsResponse instance */ - GetDataContractsResponse.create = function create(properties) { - return new GetDataContractsResponse(properties); + GetProofsResponse.create = function create(properties) { + return new GetProofsResponse(properties); }; /** - * Encodes the specified GetDataContractsResponse message. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractsResponse.verify|verify} messages. + * Encodes the specified GetProofsResponse message. Does not implicitly {@link org.dash.platform.dapi.v0.GetProofsResponse.verify|verify} messages. * @function encode - * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse + * @memberof org.dash.platform.dapi.v0.GetProofsResponse * @static - * @param {org.dash.platform.dapi.v0.IGetDataContractsResponse} message GetDataContractsResponse message or plain object to encode + * @param {org.dash.platform.dapi.v0.IGetProofsResponse} message GetProofsResponse message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetDataContractsResponse.encode = function encode(message, writer) { + GetProofsResponse.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) - $root.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + $root.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); return writer; }; /** - * Encodes the specified GetDataContractsResponse message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractsResponse.verify|verify} messages. + * Encodes the specified GetProofsResponse message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetProofsResponse.verify|verify} messages. * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse + * @memberof org.dash.platform.dapi.v0.GetProofsResponse * @static - * @param {org.dash.platform.dapi.v0.IGetDataContractsResponse} message GetDataContractsResponse message or plain object to encode + * @param {org.dash.platform.dapi.v0.IGetProofsResponse} message GetProofsResponse message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetDataContractsResponse.encodeDelimited = function encodeDelimited(message, writer) { + GetProofsResponse.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a GetDataContractsResponse message from the specified reader or buffer. + * Decodes a GetProofsResponse message from the specified reader or buffer. * @function decode - * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse + * @memberof org.dash.platform.dapi.v0.GetProofsResponse * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetDataContractsResponse} GetDataContractsResponse + * @returns {org.dash.platform.dapi.v0.GetProofsResponse} GetProofsResponse * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetDataContractsResponse.decode = function decode(reader, length) { + GetProofsResponse.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetDataContractsResponse(); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetProofsResponse(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { case 1: - message.v0 = $root.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.decode(reader, reader.uint32()); + message.v0 = $root.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.decode(reader, reader.uint32()); break; default: reader.skipType(tag & 7); @@ -13929,37 +12323,37 @@ $root.org = (function() { }; /** - * Decodes a GetDataContractsResponse message from the specified reader or buffer, length delimited. + * Decodes a GetProofsResponse message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse + * @memberof org.dash.platform.dapi.v0.GetProofsResponse * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetDataContractsResponse} GetDataContractsResponse + * @returns {org.dash.platform.dapi.v0.GetProofsResponse} GetProofsResponse * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetDataContractsResponse.decodeDelimited = function decodeDelimited(reader) { + GetProofsResponse.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a GetDataContractsResponse message. + * Verifies a GetProofsResponse message. * @function verify - * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse + * @memberof org.dash.platform.dapi.v0.GetProofsResponse * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - GetDataContractsResponse.verify = function verify(message) { + GetProofsResponse.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; var properties = {}; if (message.v0 != null && message.hasOwnProperty("v0")) { properties.version = 1; { - var error = $root.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.verify(message.v0); + var error = $root.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.verify(message.v0); if (error) return "v0." + error; } @@ -13968,40 +12362,40 @@ $root.org = (function() { }; /** - * Creates a GetDataContractsResponse message from a plain object. Also converts values to their respective internal types. + * Creates a GetProofsResponse message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse + * @memberof org.dash.platform.dapi.v0.GetProofsResponse * @static * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetDataContractsResponse} GetDataContractsResponse + * @returns {org.dash.platform.dapi.v0.GetProofsResponse} GetProofsResponse */ - GetDataContractsResponse.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetDataContractsResponse) + GetProofsResponse.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetProofsResponse) return object; - var message = new $root.org.dash.platform.dapi.v0.GetDataContractsResponse(); + var message = new $root.org.dash.platform.dapi.v0.GetProofsResponse(); if (object.v0 != null) { if (typeof object.v0 !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetDataContractsResponse.v0: object expected"); - message.v0 = $root.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.fromObject(object.v0); + throw TypeError(".org.dash.platform.dapi.v0.GetProofsResponse.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.fromObject(object.v0); } return message; }; /** - * Creates a plain object from a GetDataContractsResponse message. Also converts values to other types if specified. + * Creates a plain object from a GetProofsResponse message. Also converts values to other types if specified. * @function toObject - * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse + * @memberof org.dash.platform.dapi.v0.GetProofsResponse * @static - * @param {org.dash.platform.dapi.v0.GetDataContractsResponse} message GetDataContractsResponse + * @param {org.dash.platform.dapi.v0.GetProofsResponse} message GetProofsResponse * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - GetDataContractsResponse.toObject = function toObject(message, options) { + GetProofsResponse.toObject = function toObject(message, options) { if (!options) options = {}; var object = {}; if (message.v0 != null && message.hasOwnProperty("v0")) { - object.v0 = $root.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.toObject(message.v0, options); + object.v0 = $root.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.toObject(message.v0, options); if (options.oneofs) object.version = "v0"; } @@ -14009,35 +12403,35 @@ $root.org = (function() { }; /** - * Converts this GetDataContractsResponse to JSON. + * Converts this GetProofsResponse to JSON. * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse + * @memberof org.dash.platform.dapi.v0.GetProofsResponse * @instance * @returns {Object.} JSON object */ - GetDataContractsResponse.prototype.toJSON = function toJSON() { + GetProofsResponse.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - GetDataContractsResponse.DataContractEntry = (function() { + GetProofsResponse.GetProofsResponseV0 = (function() { /** - * Properties of a DataContractEntry. - * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse - * @interface IDataContractEntry - * @property {Uint8Array|null} [identifier] DataContractEntry identifier - * @property {google.protobuf.IBytesValue|null} [dataContract] DataContractEntry dataContract + * Properties of a GetProofsResponseV0. + * @memberof org.dash.platform.dapi.v0.GetProofsResponse + * @interface IGetProofsResponseV0 + * @property {org.dash.platform.dapi.v0.IProof|null} [proof] GetProofsResponseV0 proof + * @property {org.dash.platform.dapi.v0.IResponseMetadata|null} [metadata] GetProofsResponseV0 metadata */ /** - * Constructs a new DataContractEntry. - * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse - * @classdesc Represents a DataContractEntry. - * @implements IDataContractEntry + * Constructs a new GetProofsResponseV0. + * @memberof org.dash.platform.dapi.v0.GetProofsResponse + * @classdesc Represents a GetProofsResponseV0. + * @implements IGetProofsResponseV0 * @constructor - * @param {org.dash.platform.dapi.v0.GetDataContractsResponse.IDataContractEntry=} [properties] Properties to set + * @param {org.dash.platform.dapi.v0.GetProofsResponse.IGetProofsResponseV0=} [properties] Properties to set */ - function DataContractEntry(properties) { + function GetProofsResponseV0(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -14045,223 +12439,449 @@ $root.org = (function() { } /** - * DataContractEntry identifier. - * @member {Uint8Array} identifier - * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry + * GetProofsResponseV0 proof. + * @member {org.dash.platform.dapi.v0.IProof|null|undefined} proof + * @memberof org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0 * @instance */ - DataContractEntry.prototype.identifier = $util.newBuffer([]); + GetProofsResponseV0.prototype.proof = null; /** - * DataContractEntry dataContract. - * @member {google.protobuf.IBytesValue|null|undefined} dataContract - * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry + * GetProofsResponseV0 metadata. + * @member {org.dash.platform.dapi.v0.IResponseMetadata|null|undefined} metadata + * @memberof org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0 * @instance */ - DataContractEntry.prototype.dataContract = null; + GetProofsResponseV0.prototype.metadata = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; /** - * Creates a new DataContractEntry instance using the specified properties. + * GetProofsResponseV0 result. + * @member {"proof"|undefined} result + * @memberof org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0 + * @instance + */ + Object.defineProperty(GetProofsResponseV0.prototype, "result", { + get: $util.oneOfGetter($oneOfFields = ["proof"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetProofsResponseV0 instance using the specified properties. * @function create - * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry + * @memberof org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0 * @static - * @param {org.dash.platform.dapi.v0.GetDataContractsResponse.IDataContractEntry=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry} DataContractEntry instance + * @param {org.dash.platform.dapi.v0.GetProofsResponse.IGetProofsResponseV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} GetProofsResponseV0 instance */ - DataContractEntry.create = function create(properties) { - return new DataContractEntry(properties); + GetProofsResponseV0.create = function create(properties) { + return new GetProofsResponseV0(properties); }; /** - * Encodes the specified DataContractEntry message. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.verify|verify} messages. + * Encodes the specified GetProofsResponseV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.verify|verify} messages. * @function encode - * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry + * @memberof org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0 * @static - * @param {org.dash.platform.dapi.v0.GetDataContractsResponse.IDataContractEntry} message DataContractEntry message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetProofsResponse.IGetProofsResponseV0} message GetProofsResponseV0 message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - DataContractEntry.encode = function encode(message, writer) { + GetProofsResponseV0.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.identifier != null && Object.hasOwnProperty.call(message, "identifier")) - writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.identifier); - if (message.dataContract != null && Object.hasOwnProperty.call(message, "dataContract")) - $root.google.protobuf.BytesValue.encode(message.dataContract, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.proof != null && Object.hasOwnProperty.call(message, "proof")) + $root.org.dash.platform.dapi.v0.Proof.encode(message.proof, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.metadata != null && Object.hasOwnProperty.call(message, "metadata")) + $root.org.dash.platform.dapi.v0.ResponseMetadata.encode(message.metadata, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); return writer; }; /** - * Encodes the specified DataContractEntry message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.verify|verify} messages. + * Encodes the specified GetProofsResponseV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.verify|verify} messages. * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry + * @memberof org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0 * @static - * @param {org.dash.platform.dapi.v0.GetDataContractsResponse.IDataContractEntry} message DataContractEntry message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetProofsResponse.IGetProofsResponseV0} message GetProofsResponseV0 message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - DataContractEntry.encodeDelimited = function encodeDelimited(message, writer) { + GetProofsResponseV0.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a DataContractEntry message from the specified reader or buffer. + * Decodes a GetProofsResponseV0 message from the specified reader or buffer. * @function decode - * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry + * @memberof org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0 * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry} DataContractEntry + * @returns {org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} GetProofsResponseV0 * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - DataContractEntry.decode = function decode(reader, length) { + GetProofsResponseV0.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry(); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { case 1: - message.identifier = reader.bytes(); + message.proof = $root.org.dash.platform.dapi.v0.Proof.decode(reader, reader.uint32()); break; case 2: - message.dataContract = $root.google.protobuf.BytesValue.decode(reader, reader.uint32()); + message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.decode(reader, reader.uint32()); break; default: reader.skipType(tag & 7); break; } } - return message; - }; + return message; + }; + + /** + * Decodes a GetProofsResponseV0 message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} GetProofsResponseV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetProofsResponseV0.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetProofsResponseV0 message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0 + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetProofsResponseV0.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.proof != null && message.hasOwnProperty("proof")) { + properties.result = 1; + { + var error = $root.org.dash.platform.dapi.v0.Proof.verify(message.proof); + if (error) + return "proof." + error; + } + } + if (message.metadata != null && message.hasOwnProperty("metadata")) { + var error = $root.org.dash.platform.dapi.v0.ResponseMetadata.verify(message.metadata); + if (error) + return "metadata." + error; + } + return null; + }; + + /** + * Creates a GetProofsResponseV0 message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0 + * @static + * @param {Object.} object Plain object + * @returns {org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} GetProofsResponseV0 + */ + GetProofsResponseV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0(); + if (object.proof != null) { + if (typeof object.proof !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.proof: object expected"); + message.proof = $root.org.dash.platform.dapi.v0.Proof.fromObject(object.proof); + } + if (object.metadata != null) { + if (typeof object.metadata !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.metadata: object expected"); + message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.fromObject(object.metadata); + } + return message; + }; + + /** + * Creates a plain object from a GetProofsResponseV0 message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} message GetProofsResponseV0 + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + GetProofsResponseV0.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.metadata = null; + if (message.proof != null && message.hasOwnProperty("proof")) { + object.proof = $root.org.dash.platform.dapi.v0.Proof.toObject(message.proof, options); + if (options.oneofs) + object.result = "proof"; + } + if (message.metadata != null && message.hasOwnProperty("metadata")) + object.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.toObject(message.metadata, options); + return object; + }; + + /** + * Converts this GetProofsResponseV0 to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0 + * @instance + * @returns {Object.} JSON object + */ + GetProofsResponseV0.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return GetProofsResponseV0; + })(); + + return GetProofsResponse; + })(); + + v0.GetDataContractRequest = (function() { + + /** + * Properties of a GetDataContractRequest. + * @memberof org.dash.platform.dapi.v0 + * @interface IGetDataContractRequest + * @property {org.dash.platform.dapi.v0.GetDataContractRequest.IGetDataContractRequestV0|null} [v0] GetDataContractRequest v0 + */ + + /** + * Constructs a new GetDataContractRequest. + * @memberof org.dash.platform.dapi.v0 + * @classdesc Represents a GetDataContractRequest. + * @implements IGetDataContractRequest + * @constructor + * @param {org.dash.platform.dapi.v0.IGetDataContractRequest=} [properties] Properties to set + */ + function GetDataContractRequest(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetDataContractRequest v0. + * @member {org.dash.platform.dapi.v0.GetDataContractRequest.IGetDataContractRequestV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetDataContractRequest + * @instance + */ + GetDataContractRequest.prototype.v0 = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetDataContractRequest version. + * @member {"v0"|undefined} version + * @memberof org.dash.platform.dapi.v0.GetDataContractRequest + * @instance + */ + Object.defineProperty(GetDataContractRequest.prototype, "version", { + get: $util.oneOfGetter($oneOfFields = ["v0"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetDataContractRequest instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetDataContractRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetDataContractRequest=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetDataContractRequest} GetDataContractRequest instance + */ + GetDataContractRequest.create = function create(properties) { + return new GetDataContractRequest(properties); + }; + + /** + * Encodes the specified GetDataContractRequest message. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractRequest.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetDataContractRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetDataContractRequest} message GetDataContractRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetDataContractRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) + $root.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetDataContractRequest message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetDataContractRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetDataContractRequest} message GetDataContractRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetDataContractRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetDataContractRequest message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetDataContractRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetDataContractRequest} GetDataContractRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetDataContractRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetDataContractRequest(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.v0 = $root.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; - /** - * Decodes a DataContractEntry message from the specified reader or buffer, length delimited. - * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry} DataContractEntry - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - DataContractEntry.decodeDelimited = function decodeDelimited(reader) { - if (!(reader instanceof $Reader)) - reader = new $Reader(reader); - return this.decode(reader, reader.uint32()); - }; + /** + * Decodes a GetDataContractRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetDataContractRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetDataContractRequest} GetDataContractRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetDataContractRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; - /** - * Verifies a DataContractEntry message. - * @function verify - * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry - * @static - * @param {Object.} message Plain object to verify - * @returns {string|null} `null` if valid, otherwise the reason why it is not - */ - DataContractEntry.verify = function verify(message) { - if (typeof message !== "object" || message === null) - return "object expected"; - if (message.identifier != null && message.hasOwnProperty("identifier")) - if (!(message.identifier && typeof message.identifier.length === "number" || $util.isString(message.identifier))) - return "identifier: buffer expected"; - if (message.dataContract != null && message.hasOwnProperty("dataContract")) { - var error = $root.google.protobuf.BytesValue.verify(message.dataContract); + /** + * Verifies a GetDataContractRequest message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetDataContractRequest + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetDataContractRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + properties.version = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.verify(message.v0); if (error) - return "dataContract." + error; - } - return null; - }; - - /** - * Creates a DataContractEntry message from a plain object. Also converts values to their respective internal types. - * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry - * @static - * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry} DataContractEntry - */ - DataContractEntry.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry) - return object; - var message = new $root.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry(); - if (object.identifier != null) - if (typeof object.identifier === "string") - $util.base64.decode(object.identifier, message.identifier = $util.newBuffer($util.base64.length(object.identifier)), 0); - else if (object.identifier.length >= 0) - message.identifier = object.identifier; - if (object.dataContract != null) { - if (typeof object.dataContract !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.dataContract: object expected"); - message.dataContract = $root.google.protobuf.BytesValue.fromObject(object.dataContract); + return "v0." + error; } - return message; - }; + } + return null; + }; - /** - * Creates a plain object from a DataContractEntry message. Also converts values to other types if specified. - * @function toObject - * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry - * @static - * @param {org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry} message DataContractEntry - * @param {$protobuf.IConversionOptions} [options] Conversion options - * @returns {Object.} Plain object - */ - DataContractEntry.toObject = function toObject(message, options) { - if (!options) - options = {}; - var object = {}; - if (options.defaults) { - if (options.bytes === String) - object.identifier = ""; - else { - object.identifier = []; - if (options.bytes !== Array) - object.identifier = $util.newBuffer(object.identifier); - } - object.dataContract = null; - } - if (message.identifier != null && message.hasOwnProperty("identifier")) - object.identifier = options.bytes === String ? $util.base64.encode(message.identifier, 0, message.identifier.length) : options.bytes === Array ? Array.prototype.slice.call(message.identifier) : message.identifier; - if (message.dataContract != null && message.hasOwnProperty("dataContract")) - object.dataContract = $root.google.protobuf.BytesValue.toObject(message.dataContract, options); + /** + * Creates a GetDataContractRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetDataContractRequest + * @static + * @param {Object.} object Plain object + * @returns {org.dash.platform.dapi.v0.GetDataContractRequest} GetDataContractRequest + */ + GetDataContractRequest.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetDataContractRequest) return object; - }; + var message = new $root.org.dash.platform.dapi.v0.GetDataContractRequest(); + if (object.v0 != null) { + if (typeof object.v0 !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetDataContractRequest.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.fromObject(object.v0); + } + return message; + }; - /** - * Converts this DataContractEntry to JSON. - * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry - * @instance - * @returns {Object.} JSON object - */ - DataContractEntry.prototype.toJSON = function toJSON() { - return this.constructor.toObject(this, $protobuf.util.toJSONOptions); - }; + /** + * Creates a plain object from a GetDataContractRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetDataContractRequest + * @static + * @param {org.dash.platform.dapi.v0.GetDataContractRequest} message GetDataContractRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + GetDataContractRequest.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + object.v0 = $root.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.toObject(message.v0, options); + if (options.oneofs) + object.version = "v0"; + } + return object; + }; - return DataContractEntry; - })(); + /** + * Converts this GetDataContractRequest to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetDataContractRequest + * @instance + * @returns {Object.} JSON object + */ + GetDataContractRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; - GetDataContractsResponse.DataContracts = (function() { + GetDataContractRequest.GetDataContractRequestV0 = (function() { /** - * Properties of a DataContracts. - * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse - * @interface IDataContracts - * @property {Array.|null} [dataContractEntries] DataContracts dataContractEntries + * Properties of a GetDataContractRequestV0. + * @memberof org.dash.platform.dapi.v0.GetDataContractRequest + * @interface IGetDataContractRequestV0 + * @property {Uint8Array|null} [id] GetDataContractRequestV0 id + * @property {boolean|null} [prove] GetDataContractRequestV0 prove */ /** - * Constructs a new DataContracts. - * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse - * @classdesc Represents a DataContracts. - * @implements IDataContracts + * Constructs a new GetDataContractRequestV0. + * @memberof org.dash.platform.dapi.v0.GetDataContractRequest + * @classdesc Represents a GetDataContractRequestV0. + * @implements IGetDataContractRequestV0 * @constructor - * @param {org.dash.platform.dapi.v0.GetDataContractsResponse.IDataContracts=} [properties] Properties to set + * @param {org.dash.platform.dapi.v0.GetDataContractRequest.IGetDataContractRequestV0=} [properties] Properties to set */ - function DataContracts(properties) { - this.dataContractEntries = []; + function GetDataContractRequestV0(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -14269,78 +12889,88 @@ $root.org = (function() { } /** - * DataContracts dataContractEntries. - * @member {Array.} dataContractEntries - * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts + * GetDataContractRequestV0 id. + * @member {Uint8Array} id + * @memberof org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0 * @instance */ - DataContracts.prototype.dataContractEntries = $util.emptyArray; + GetDataContractRequestV0.prototype.id = $util.newBuffer([]); /** - * Creates a new DataContracts instance using the specified properties. + * GetDataContractRequestV0 prove. + * @member {boolean} prove + * @memberof org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0 + * @instance + */ + GetDataContractRequestV0.prototype.prove = false; + + /** + * Creates a new GetDataContractRequestV0 instance using the specified properties. * @function create - * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts + * @memberof org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0 * @static - * @param {org.dash.platform.dapi.v0.GetDataContractsResponse.IDataContracts=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts} DataContracts instance + * @param {org.dash.platform.dapi.v0.GetDataContractRequest.IGetDataContractRequestV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0} GetDataContractRequestV0 instance */ - DataContracts.create = function create(properties) { - return new DataContracts(properties); + GetDataContractRequestV0.create = function create(properties) { + return new GetDataContractRequestV0(properties); }; /** - * Encodes the specified DataContracts message. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.verify|verify} messages. + * Encodes the specified GetDataContractRequestV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.verify|verify} messages. * @function encode - * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts + * @memberof org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0 * @static - * @param {org.dash.platform.dapi.v0.GetDataContractsResponse.IDataContracts} message DataContracts message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetDataContractRequest.IGetDataContractRequestV0} message GetDataContractRequestV0 message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - DataContracts.encode = function encode(message, writer) { + GetDataContractRequestV0.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.dataContractEntries != null && message.dataContractEntries.length) - for (var i = 0; i < message.dataContractEntries.length; ++i) - $root.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.encode(message.dataContractEntries[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.id != null && Object.hasOwnProperty.call(message, "id")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.id); + if (message.prove != null && Object.hasOwnProperty.call(message, "prove")) + writer.uint32(/* id 2, wireType 0 =*/16).bool(message.prove); return writer; }; /** - * Encodes the specified DataContracts message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.verify|verify} messages. + * Encodes the specified GetDataContractRequestV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.verify|verify} messages. * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts + * @memberof org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0 * @static - * @param {org.dash.platform.dapi.v0.GetDataContractsResponse.IDataContracts} message DataContracts message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetDataContractRequest.IGetDataContractRequestV0} message GetDataContractRequestV0 message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - DataContracts.encodeDelimited = function encodeDelimited(message, writer) { + GetDataContractRequestV0.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a DataContracts message from the specified reader or buffer. + * Decodes a GetDataContractRequestV0 message from the specified reader or buffer. * @function decode - * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts + * @memberof org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0 * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts} DataContracts + * @returns {org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0} GetDataContractRequestV0 * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - DataContracts.decode = function decode(reader, length) { + GetDataContractRequestV0.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts(); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { case 1: - if (!(message.dataContractEntries && message.dataContractEntries.length)) - message.dataContractEntries = []; - message.dataContractEntries.push($root.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.decode(reader, reader.uint32())); + message.id = reader.bytes(); + break; + case 2: + message.prove = reader.bool(); break; default: reader.skipType(tag & 7); @@ -14351,126 +12981,338 @@ $root.org = (function() { }; /** - * Decodes a DataContracts message from the specified reader or buffer, length delimited. + * Decodes a GetDataContractRequestV0 message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts + * @memberof org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0 * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts} DataContracts + * @returns {org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0} GetDataContractRequestV0 * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - DataContracts.decodeDelimited = function decodeDelimited(reader) { + GetDataContractRequestV0.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a DataContracts message. + * Verifies a GetDataContractRequestV0 message. * @function verify - * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts + * @memberof org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0 * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - DataContracts.verify = function verify(message) { + GetDataContractRequestV0.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; - if (message.dataContractEntries != null && message.hasOwnProperty("dataContractEntries")) { - if (!Array.isArray(message.dataContractEntries)) - return "dataContractEntries: array expected"; - for (var i = 0; i < message.dataContractEntries.length; ++i) { - var error = $root.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.verify(message.dataContractEntries[i]); - if (error) - return "dataContractEntries." + error; - } - } + if (message.id != null && message.hasOwnProperty("id")) + if (!(message.id && typeof message.id.length === "number" || $util.isString(message.id))) + return "id: buffer expected"; + if (message.prove != null && message.hasOwnProperty("prove")) + if (typeof message.prove !== "boolean") + return "prove: boolean expected"; return null; }; /** - * Creates a DataContracts message from a plain object. Also converts values to their respective internal types. + * Creates a GetDataContractRequestV0 message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts + * @memberof org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0 * @static * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts} DataContracts + * @returns {org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0} GetDataContractRequestV0 */ - DataContracts.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts) + GetDataContractRequestV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0) return object; - var message = new $root.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts(); - if (object.dataContractEntries) { - if (!Array.isArray(object.dataContractEntries)) - throw TypeError(".org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.dataContractEntries: array expected"); - message.dataContractEntries = []; - for (var i = 0; i < object.dataContractEntries.length; ++i) { - if (typeof object.dataContractEntries[i] !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.dataContractEntries: object expected"); - message.dataContractEntries[i] = $root.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.fromObject(object.dataContractEntries[i]); + var message = new $root.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0(); + if (object.id != null) + if (typeof object.id === "string") + $util.base64.decode(object.id, message.id = $util.newBuffer($util.base64.length(object.id)), 0); + else if (object.id.length >= 0) + message.id = object.id; + if (object.prove != null) + message.prove = Boolean(object.prove); + return message; + }; + + /** + * Creates a plain object from a GetDataContractRequestV0 message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0} message GetDataContractRequestV0 + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + GetDataContractRequestV0.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if (options.bytes === String) + object.id = ""; + else { + object.id = []; + if (options.bytes !== Array) + object.id = $util.newBuffer(object.id); } + object.prove = false; } - return message; + if (message.id != null && message.hasOwnProperty("id")) + object.id = options.bytes === String ? $util.base64.encode(message.id, 0, message.id.length) : options.bytes === Array ? Array.prototype.slice.call(message.id) : message.id; + if (message.prove != null && message.hasOwnProperty("prove")) + object.prove = message.prove; + return object; + }; + + /** + * Converts this GetDataContractRequestV0 to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0 + * @instance + * @returns {Object.} JSON object + */ + GetDataContractRequestV0.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - /** - * Creates a plain object from a DataContracts message. Also converts values to other types if specified. - * @function toObject - * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts - * @static - * @param {org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts} message DataContracts - * @param {$protobuf.IConversionOptions} [options] Conversion options - * @returns {Object.} Plain object - */ - DataContracts.toObject = function toObject(message, options) { - if (!options) - options = {}; - var object = {}; - if (options.arrays || options.defaults) - object.dataContractEntries = []; - if (message.dataContractEntries && message.dataContractEntries.length) { - object.dataContractEntries = []; - for (var j = 0; j < message.dataContractEntries.length; ++j) - object.dataContractEntries[j] = $root.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.toObject(message.dataContractEntries[j], options); + return GetDataContractRequestV0; + })(); + + return GetDataContractRequest; + })(); + + v0.GetDataContractResponse = (function() { + + /** + * Properties of a GetDataContractResponse. + * @memberof org.dash.platform.dapi.v0 + * @interface IGetDataContractResponse + * @property {org.dash.platform.dapi.v0.GetDataContractResponse.IGetDataContractResponseV0|null} [v0] GetDataContractResponse v0 + */ + + /** + * Constructs a new GetDataContractResponse. + * @memberof org.dash.platform.dapi.v0 + * @classdesc Represents a GetDataContractResponse. + * @implements IGetDataContractResponse + * @constructor + * @param {org.dash.platform.dapi.v0.IGetDataContractResponse=} [properties] Properties to set + */ + function GetDataContractResponse(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetDataContractResponse v0. + * @member {org.dash.platform.dapi.v0.GetDataContractResponse.IGetDataContractResponseV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetDataContractResponse + * @instance + */ + GetDataContractResponse.prototype.v0 = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetDataContractResponse version. + * @member {"v0"|undefined} version + * @memberof org.dash.platform.dapi.v0.GetDataContractResponse + * @instance + */ + Object.defineProperty(GetDataContractResponse.prototype, "version", { + get: $util.oneOfGetter($oneOfFields = ["v0"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetDataContractResponse instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetDataContractResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetDataContractResponse=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetDataContractResponse} GetDataContractResponse instance + */ + GetDataContractResponse.create = function create(properties) { + return new GetDataContractResponse(properties); + }; + + /** + * Encodes the specified GetDataContractResponse message. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractResponse.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetDataContractResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetDataContractResponse} message GetDataContractResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetDataContractResponse.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) + $root.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetDataContractResponse message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractResponse.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetDataContractResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetDataContractResponse} message GetDataContractResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetDataContractResponse.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetDataContractResponse message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetDataContractResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetDataContractResponse} GetDataContractResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetDataContractResponse.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetDataContractResponse(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.v0 = $root.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetDataContractResponse message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetDataContractResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetDataContractResponse} GetDataContractResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetDataContractResponse.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetDataContractResponse message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetDataContractResponse + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetDataContractResponse.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + properties.version = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.verify(message.v0); + if (error) + return "v0." + error; } + } + return null; + }; + + /** + * Creates a GetDataContractResponse message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetDataContractResponse + * @static + * @param {Object.} object Plain object + * @returns {org.dash.platform.dapi.v0.GetDataContractResponse} GetDataContractResponse + */ + GetDataContractResponse.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetDataContractResponse) return object; - }; + var message = new $root.org.dash.platform.dapi.v0.GetDataContractResponse(); + if (object.v0 != null) { + if (typeof object.v0 !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetDataContractResponse.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.fromObject(object.v0); + } + return message; + }; - /** - * Converts this DataContracts to JSON. - * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts - * @instance - * @returns {Object.} JSON object - */ - DataContracts.prototype.toJSON = function toJSON() { - return this.constructor.toObject(this, $protobuf.util.toJSONOptions); - }; + /** + * Creates a plain object from a GetDataContractResponse message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetDataContractResponse + * @static + * @param {org.dash.platform.dapi.v0.GetDataContractResponse} message GetDataContractResponse + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + GetDataContractResponse.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + object.v0 = $root.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.toObject(message.v0, options); + if (options.oneofs) + object.version = "v0"; + } + return object; + }; - return DataContracts; - })(); + /** + * Converts this GetDataContractResponse to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetDataContractResponse + * @instance + * @returns {Object.} JSON object + */ + GetDataContractResponse.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; - GetDataContractsResponse.GetDataContractsResponseV0 = (function() { + GetDataContractResponse.GetDataContractResponseV0 = (function() { /** - * Properties of a GetDataContractsResponseV0. - * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse - * @interface IGetDataContractsResponseV0 - * @property {org.dash.platform.dapi.v0.GetDataContractsResponse.IDataContracts|null} [dataContracts] GetDataContractsResponseV0 dataContracts - * @property {org.dash.platform.dapi.v0.IProof|null} [proof] GetDataContractsResponseV0 proof - * @property {org.dash.platform.dapi.v0.IResponseMetadata|null} [metadata] GetDataContractsResponseV0 metadata + * Properties of a GetDataContractResponseV0. + * @memberof org.dash.platform.dapi.v0.GetDataContractResponse + * @interface IGetDataContractResponseV0 + * @property {Uint8Array|null} [dataContract] GetDataContractResponseV0 dataContract + * @property {org.dash.platform.dapi.v0.IProof|null} [proof] GetDataContractResponseV0 proof + * @property {org.dash.platform.dapi.v0.IResponseMetadata|null} [metadata] GetDataContractResponseV0 metadata */ /** - * Constructs a new GetDataContractsResponseV0. - * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse - * @classdesc Represents a GetDataContractsResponseV0. - * @implements IGetDataContractsResponseV0 + * Constructs a new GetDataContractResponseV0. + * @memberof org.dash.platform.dapi.v0.GetDataContractResponse + * @classdesc Represents a GetDataContractResponseV0. + * @implements IGetDataContractResponseV0 * @constructor - * @param {org.dash.platform.dapi.v0.GetDataContractsResponse.IGetDataContractsResponseV0=} [properties] Properties to set + * @param {org.dash.platform.dapi.v0.GetDataContractResponse.IGetDataContractResponseV0=} [properties] Properties to set */ - function GetDataContractsResponseV0(properties) { + function GetDataContractResponseV0(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -14478,69 +13320,69 @@ $root.org = (function() { } /** - * GetDataContractsResponseV0 dataContracts. - * @member {org.dash.platform.dapi.v0.GetDataContractsResponse.IDataContracts|null|undefined} dataContracts - * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0 + * GetDataContractResponseV0 dataContract. + * @member {Uint8Array} dataContract + * @memberof org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0 * @instance */ - GetDataContractsResponseV0.prototype.dataContracts = null; + GetDataContractResponseV0.prototype.dataContract = $util.newBuffer([]); /** - * GetDataContractsResponseV0 proof. + * GetDataContractResponseV0 proof. * @member {org.dash.platform.dapi.v0.IProof|null|undefined} proof - * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0 + * @memberof org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0 * @instance */ - GetDataContractsResponseV0.prototype.proof = null; + GetDataContractResponseV0.prototype.proof = null; /** - * GetDataContractsResponseV0 metadata. + * GetDataContractResponseV0 metadata. * @member {org.dash.platform.dapi.v0.IResponseMetadata|null|undefined} metadata - * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0 + * @memberof org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0 * @instance */ - GetDataContractsResponseV0.prototype.metadata = null; + GetDataContractResponseV0.prototype.metadata = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** - * GetDataContractsResponseV0 result. - * @member {"dataContracts"|"proof"|undefined} result - * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0 + * GetDataContractResponseV0 result. + * @member {"dataContract"|"proof"|undefined} result + * @memberof org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0 * @instance */ - Object.defineProperty(GetDataContractsResponseV0.prototype, "result", { - get: $util.oneOfGetter($oneOfFields = ["dataContracts", "proof"]), + Object.defineProperty(GetDataContractResponseV0.prototype, "result", { + get: $util.oneOfGetter($oneOfFields = ["dataContract", "proof"]), set: $util.oneOfSetter($oneOfFields) }); /** - * Creates a new GetDataContractsResponseV0 instance using the specified properties. + * Creates a new GetDataContractResponseV0 instance using the specified properties. * @function create - * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0 + * @memberof org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0 * @static - * @param {org.dash.platform.dapi.v0.GetDataContractsResponse.IGetDataContractsResponseV0=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} GetDataContractsResponseV0 instance + * @param {org.dash.platform.dapi.v0.GetDataContractResponse.IGetDataContractResponseV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} GetDataContractResponseV0 instance */ - GetDataContractsResponseV0.create = function create(properties) { - return new GetDataContractsResponseV0(properties); + GetDataContractResponseV0.create = function create(properties) { + return new GetDataContractResponseV0(properties); }; /** - * Encodes the specified GetDataContractsResponseV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.verify|verify} messages. + * Encodes the specified GetDataContractResponseV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.verify|verify} messages. * @function encode - * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0 + * @memberof org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0 * @static - * @param {org.dash.platform.dapi.v0.GetDataContractsResponse.IGetDataContractsResponseV0} message GetDataContractsResponseV0 message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetDataContractResponse.IGetDataContractResponseV0} message GetDataContractResponseV0 message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetDataContractsResponseV0.encode = function encode(message, writer) { + GetDataContractResponseV0.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.dataContracts != null && Object.hasOwnProperty.call(message, "dataContracts")) - $root.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.encode(message.dataContracts, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.dataContract != null && Object.hasOwnProperty.call(message, "dataContract")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.dataContract); if (message.proof != null && Object.hasOwnProperty.call(message, "proof")) $root.org.dash.platform.dapi.v0.Proof.encode(message.proof, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); if (message.metadata != null && Object.hasOwnProperty.call(message, "metadata")) @@ -14549,38 +13391,38 @@ $root.org = (function() { }; /** - * Encodes the specified GetDataContractsResponseV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.verify|verify} messages. + * Encodes the specified GetDataContractResponseV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.verify|verify} messages. * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0 + * @memberof org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0 * @static - * @param {org.dash.platform.dapi.v0.GetDataContractsResponse.IGetDataContractsResponseV0} message GetDataContractsResponseV0 message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetDataContractResponse.IGetDataContractResponseV0} message GetDataContractResponseV0 message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetDataContractsResponseV0.encodeDelimited = function encodeDelimited(message, writer) { + GetDataContractResponseV0.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a GetDataContractsResponseV0 message from the specified reader or buffer. + * Decodes a GetDataContractResponseV0 message from the specified reader or buffer. * @function decode - * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0 + * @memberof org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0 * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} GetDataContractsResponseV0 + * @returns {org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} GetDataContractResponseV0 * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetDataContractsResponseV0.decode = function decode(reader, length) { + GetDataContractResponseV0.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0(); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { case 1: - message.dataContracts = $root.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.decode(reader, reader.uint32()); + message.dataContract = reader.bytes(); break; case 2: message.proof = $root.org.dash.platform.dapi.v0.Proof.decode(reader, reader.uint32()); @@ -14597,40 +13439,37 @@ $root.org = (function() { }; /** - * Decodes a GetDataContractsResponseV0 message from the specified reader or buffer, length delimited. + * Decodes a GetDataContractResponseV0 message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0 + * @memberof org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0 * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} GetDataContractsResponseV0 + * @returns {org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} GetDataContractResponseV0 * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetDataContractsResponseV0.decodeDelimited = function decodeDelimited(reader) { + GetDataContractResponseV0.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a GetDataContractsResponseV0 message. + * Verifies a GetDataContractResponseV0 message. * @function verify - * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0 + * @memberof org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0 * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - GetDataContractsResponseV0.verify = function verify(message) { + GetDataContractResponseV0.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; var properties = {}; - if (message.dataContracts != null && message.hasOwnProperty("dataContracts")) { + if (message.dataContract != null && message.hasOwnProperty("dataContract")) { properties.result = 1; - { - var error = $root.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.verify(message.dataContracts); - if (error) - return "dataContracts." + error; - } + if (!(message.dataContract && typeof message.dataContract.length === "number" || $util.isString(message.dataContract))) + return "dataContract: buffer expected"; } if (message.proof != null && message.hasOwnProperty("proof")) { if (properties.result === 1) @@ -14651,54 +13490,54 @@ $root.org = (function() { }; /** - * Creates a GetDataContractsResponseV0 message from a plain object. Also converts values to their respective internal types. + * Creates a GetDataContractResponseV0 message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0 + * @memberof org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0 * @static * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} GetDataContractsResponseV0 + * @returns {org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} GetDataContractResponseV0 */ - GetDataContractsResponseV0.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0) - return object; - var message = new $root.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0(); - if (object.dataContracts != null) { - if (typeof object.dataContracts !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.dataContracts: object expected"); - message.dataContracts = $root.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.fromObject(object.dataContracts); - } + GetDataContractResponseV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0(); + if (object.dataContract != null) + if (typeof object.dataContract === "string") + $util.base64.decode(object.dataContract, message.dataContract = $util.newBuffer($util.base64.length(object.dataContract)), 0); + else if (object.dataContract.length >= 0) + message.dataContract = object.dataContract; if (object.proof != null) { if (typeof object.proof !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.proof: object expected"); + throw TypeError(".org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.proof: object expected"); message.proof = $root.org.dash.platform.dapi.v0.Proof.fromObject(object.proof); } if (object.metadata != null) { if (typeof object.metadata !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.metadata: object expected"); + throw TypeError(".org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.metadata: object expected"); message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.fromObject(object.metadata); } return message; }; /** - * Creates a plain object from a GetDataContractsResponseV0 message. Also converts values to other types if specified. + * Creates a plain object from a GetDataContractResponseV0 message. Also converts values to other types if specified. * @function toObject - * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0 + * @memberof org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0 * @static - * @param {org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} message GetDataContractsResponseV0 + * @param {org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} message GetDataContractResponseV0 * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - GetDataContractsResponseV0.toObject = function toObject(message, options) { + GetDataContractResponseV0.toObject = function toObject(message, options) { if (!options) options = {}; var object = {}; if (options.defaults) object.metadata = null; - if (message.dataContracts != null && message.hasOwnProperty("dataContracts")) { - object.dataContracts = $root.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.toObject(message.dataContracts, options); + if (message.dataContract != null && message.hasOwnProperty("dataContract")) { + object.dataContract = options.bytes === String ? $util.base64.encode(message.dataContract, 0, message.dataContract.length) : options.bytes === Array ? Array.prototype.slice.call(message.dataContract) : message.dataContract; if (options.oneofs) - object.result = "dataContracts"; + object.result = "dataContract"; } if (message.proof != null && message.hasOwnProperty("proof")) { object.proof = $root.org.dash.platform.dapi.v0.Proof.toObject(message.proof, options); @@ -14711,40 +13550,40 @@ $root.org = (function() { }; /** - * Converts this GetDataContractsResponseV0 to JSON. + * Converts this GetDataContractResponseV0 to JSON. * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0 + * @memberof org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0 * @instance * @returns {Object.} JSON object */ - GetDataContractsResponseV0.prototype.toJSON = function toJSON() { + GetDataContractResponseV0.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - return GetDataContractsResponseV0; + return GetDataContractResponseV0; })(); - return GetDataContractsResponse; + return GetDataContractResponse; })(); - v0.GetDataContractHistoryRequest = (function() { + v0.GetDataContractsRequest = (function() { /** - * Properties of a GetDataContractHistoryRequest. + * Properties of a GetDataContractsRequest. * @memberof org.dash.platform.dapi.v0 - * @interface IGetDataContractHistoryRequest - * @property {org.dash.platform.dapi.v0.GetDataContractHistoryRequest.IGetDataContractHistoryRequestV0|null} [v0] GetDataContractHistoryRequest v0 + * @interface IGetDataContractsRequest + * @property {org.dash.platform.dapi.v0.GetDataContractsRequest.IGetDataContractsRequestV0|null} [v0] GetDataContractsRequest v0 */ /** - * Constructs a new GetDataContractHistoryRequest. + * Constructs a new GetDataContractsRequest. * @memberof org.dash.platform.dapi.v0 - * @classdesc Represents a GetDataContractHistoryRequest. - * @implements IGetDataContractHistoryRequest + * @classdesc Represents a GetDataContractsRequest. + * @implements IGetDataContractsRequest * @constructor - * @param {org.dash.platform.dapi.v0.IGetDataContractHistoryRequest=} [properties] Properties to set + * @param {org.dash.platform.dapi.v0.IGetDataContractsRequest=} [properties] Properties to set */ - function GetDataContractHistoryRequest(properties) { + function GetDataContractsRequest(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -14752,89 +13591,89 @@ $root.org = (function() { } /** - * GetDataContractHistoryRequest v0. - * @member {org.dash.platform.dapi.v0.GetDataContractHistoryRequest.IGetDataContractHistoryRequestV0|null|undefined} v0 - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest + * GetDataContractsRequest v0. + * @member {org.dash.platform.dapi.v0.GetDataContractsRequest.IGetDataContractsRequestV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetDataContractsRequest * @instance */ - GetDataContractHistoryRequest.prototype.v0 = null; + GetDataContractsRequest.prototype.v0 = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** - * GetDataContractHistoryRequest version. + * GetDataContractsRequest version. * @member {"v0"|undefined} version - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest + * @memberof org.dash.platform.dapi.v0.GetDataContractsRequest * @instance */ - Object.defineProperty(GetDataContractHistoryRequest.prototype, "version", { + Object.defineProperty(GetDataContractsRequest.prototype, "version", { get: $util.oneOfGetter($oneOfFields = ["v0"]), set: $util.oneOfSetter($oneOfFields) }); /** - * Creates a new GetDataContractHistoryRequest instance using the specified properties. + * Creates a new GetDataContractsRequest instance using the specified properties. * @function create - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest + * @memberof org.dash.platform.dapi.v0.GetDataContractsRequest * @static - * @param {org.dash.platform.dapi.v0.IGetDataContractHistoryRequest=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetDataContractHistoryRequest} GetDataContractHistoryRequest instance + * @param {org.dash.platform.dapi.v0.IGetDataContractsRequest=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetDataContractsRequest} GetDataContractsRequest instance */ - GetDataContractHistoryRequest.create = function create(properties) { - return new GetDataContractHistoryRequest(properties); + GetDataContractsRequest.create = function create(properties) { + return new GetDataContractsRequest(properties); }; /** - * Encodes the specified GetDataContractHistoryRequest message. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractHistoryRequest.verify|verify} messages. + * Encodes the specified GetDataContractsRequest message. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractsRequest.verify|verify} messages. * @function encode - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest + * @memberof org.dash.platform.dapi.v0.GetDataContractsRequest * @static - * @param {org.dash.platform.dapi.v0.IGetDataContractHistoryRequest} message GetDataContractHistoryRequest message or plain object to encode + * @param {org.dash.platform.dapi.v0.IGetDataContractsRequest} message GetDataContractsRequest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetDataContractHistoryRequest.encode = function encode(message, writer) { + GetDataContractsRequest.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) - $root.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + $root.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); return writer; }; /** - * Encodes the specified GetDataContractHistoryRequest message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractHistoryRequest.verify|verify} messages. + * Encodes the specified GetDataContractsRequest message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractsRequest.verify|verify} messages. * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest + * @memberof org.dash.platform.dapi.v0.GetDataContractsRequest * @static - * @param {org.dash.platform.dapi.v0.IGetDataContractHistoryRequest} message GetDataContractHistoryRequest message or plain object to encode + * @param {org.dash.platform.dapi.v0.IGetDataContractsRequest} message GetDataContractsRequest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetDataContractHistoryRequest.encodeDelimited = function encodeDelimited(message, writer) { + GetDataContractsRequest.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a GetDataContractHistoryRequest message from the specified reader or buffer. + * Decodes a GetDataContractsRequest message from the specified reader or buffer. * @function decode - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest + * @memberof org.dash.platform.dapi.v0.GetDataContractsRequest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetDataContractHistoryRequest} GetDataContractHistoryRequest + * @returns {org.dash.platform.dapi.v0.GetDataContractsRequest} GetDataContractsRequest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetDataContractHistoryRequest.decode = function decode(reader, length) { + GetDataContractsRequest.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetDataContractHistoryRequest(); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetDataContractsRequest(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { case 1: - message.v0 = $root.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.decode(reader, reader.uint32()); + message.v0 = $root.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.decode(reader, reader.uint32()); break; default: reader.skipType(tag & 7); @@ -14845,37 +13684,37 @@ $root.org = (function() { }; /** - * Decodes a GetDataContractHistoryRequest message from the specified reader or buffer, length delimited. + * Decodes a GetDataContractsRequest message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest + * @memberof org.dash.platform.dapi.v0.GetDataContractsRequest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetDataContractHistoryRequest} GetDataContractHistoryRequest + * @returns {org.dash.platform.dapi.v0.GetDataContractsRequest} GetDataContractsRequest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetDataContractHistoryRequest.decodeDelimited = function decodeDelimited(reader) { + GetDataContractsRequest.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a GetDataContractHistoryRequest message. + * Verifies a GetDataContractsRequest message. * @function verify - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest + * @memberof org.dash.platform.dapi.v0.GetDataContractsRequest * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - GetDataContractHistoryRequest.verify = function verify(message) { + GetDataContractsRequest.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; var properties = {}; if (message.v0 != null && message.hasOwnProperty("v0")) { properties.version = 1; { - var error = $root.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.verify(message.v0); + var error = $root.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.verify(message.v0); if (error) return "v0." + error; } @@ -14884,40 +13723,40 @@ $root.org = (function() { }; /** - * Creates a GetDataContractHistoryRequest message from a plain object. Also converts values to their respective internal types. + * Creates a GetDataContractsRequest message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest + * @memberof org.dash.platform.dapi.v0.GetDataContractsRequest * @static * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetDataContractHistoryRequest} GetDataContractHistoryRequest + * @returns {org.dash.platform.dapi.v0.GetDataContractsRequest} GetDataContractsRequest */ - GetDataContractHistoryRequest.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetDataContractHistoryRequest) + GetDataContractsRequest.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetDataContractsRequest) return object; - var message = new $root.org.dash.platform.dapi.v0.GetDataContractHistoryRequest(); + var message = new $root.org.dash.platform.dapi.v0.GetDataContractsRequest(); if (object.v0 != null) { if (typeof object.v0 !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetDataContractHistoryRequest.v0: object expected"); - message.v0 = $root.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.fromObject(object.v0); + throw TypeError(".org.dash.platform.dapi.v0.GetDataContractsRequest.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.fromObject(object.v0); } return message; }; /** - * Creates a plain object from a GetDataContractHistoryRequest message. Also converts values to other types if specified. + * Creates a plain object from a GetDataContractsRequest message. Also converts values to other types if specified. * @function toObject - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest + * @memberof org.dash.platform.dapi.v0.GetDataContractsRequest * @static - * @param {org.dash.platform.dapi.v0.GetDataContractHistoryRequest} message GetDataContractHistoryRequest + * @param {org.dash.platform.dapi.v0.GetDataContractsRequest} message GetDataContractsRequest * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - GetDataContractHistoryRequest.toObject = function toObject(message, options) { + GetDataContractsRequest.toObject = function toObject(message, options) { if (!options) options = {}; var object = {}; if (message.v0 != null && message.hasOwnProperty("v0")) { - object.v0 = $root.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.toObject(message.v0, options); + object.v0 = $root.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.toObject(message.v0, options); if (options.oneofs) object.version = "v0"; } @@ -14925,38 +13764,36 @@ $root.org = (function() { }; /** - * Converts this GetDataContractHistoryRequest to JSON. + * Converts this GetDataContractsRequest to JSON. * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest + * @memberof org.dash.platform.dapi.v0.GetDataContractsRequest * @instance * @returns {Object.} JSON object */ - GetDataContractHistoryRequest.prototype.toJSON = function toJSON() { + GetDataContractsRequest.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - GetDataContractHistoryRequest.GetDataContractHistoryRequestV0 = (function() { + GetDataContractsRequest.GetDataContractsRequestV0 = (function() { /** - * Properties of a GetDataContractHistoryRequestV0. - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest - * @interface IGetDataContractHistoryRequestV0 - * @property {Uint8Array|null} [id] GetDataContractHistoryRequestV0 id - * @property {google.protobuf.IUInt32Value|null} [limit] GetDataContractHistoryRequestV0 limit - * @property {google.protobuf.IUInt32Value|null} [offset] GetDataContractHistoryRequestV0 offset - * @property {number|Long|null} [startAtMs] GetDataContractHistoryRequestV0 startAtMs - * @property {boolean|null} [prove] GetDataContractHistoryRequestV0 prove + * Properties of a GetDataContractsRequestV0. + * @memberof org.dash.platform.dapi.v0.GetDataContractsRequest + * @interface IGetDataContractsRequestV0 + * @property {Array.|null} [ids] GetDataContractsRequestV0 ids + * @property {boolean|null} [prove] GetDataContractsRequestV0 prove */ /** - * Constructs a new GetDataContractHistoryRequestV0. - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest - * @classdesc Represents a GetDataContractHistoryRequestV0. - * @implements IGetDataContractHistoryRequestV0 + * Constructs a new GetDataContractsRequestV0. + * @memberof org.dash.platform.dapi.v0.GetDataContractsRequest + * @classdesc Represents a GetDataContractsRequestV0. + * @implements IGetDataContractsRequestV0 * @constructor - * @param {org.dash.platform.dapi.v0.GetDataContractHistoryRequest.IGetDataContractHistoryRequestV0=} [properties] Properties to set + * @param {org.dash.platform.dapi.v0.GetDataContractsRequest.IGetDataContractsRequestV0=} [properties] Properties to set */ - function GetDataContractHistoryRequestV0(properties) { + function GetDataContractsRequestV0(properties) { + this.ids = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -14964,126 +13801,90 @@ $root.org = (function() { } /** - * GetDataContractHistoryRequestV0 id. - * @member {Uint8Array} id - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0 - * @instance - */ - GetDataContractHistoryRequestV0.prototype.id = $util.newBuffer([]); - - /** - * GetDataContractHistoryRequestV0 limit. - * @member {google.protobuf.IUInt32Value|null|undefined} limit - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0 - * @instance - */ - GetDataContractHistoryRequestV0.prototype.limit = null; - - /** - * GetDataContractHistoryRequestV0 offset. - * @member {google.protobuf.IUInt32Value|null|undefined} offset - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0 - * @instance - */ - GetDataContractHistoryRequestV0.prototype.offset = null; - - /** - * GetDataContractHistoryRequestV0 startAtMs. - * @member {number|Long} startAtMs - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0 + * GetDataContractsRequestV0 ids. + * @member {Array.} ids + * @memberof org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0 * @instance */ - GetDataContractHistoryRequestV0.prototype.startAtMs = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + GetDataContractsRequestV0.prototype.ids = $util.emptyArray; /** - * GetDataContractHistoryRequestV0 prove. + * GetDataContractsRequestV0 prove. * @member {boolean} prove - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0 + * @memberof org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0 * @instance */ - GetDataContractHistoryRequestV0.prototype.prove = false; + GetDataContractsRequestV0.prototype.prove = false; /** - * Creates a new GetDataContractHistoryRequestV0 instance using the specified properties. + * Creates a new GetDataContractsRequestV0 instance using the specified properties. * @function create - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0 + * @memberof org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0 * @static - * @param {org.dash.platform.dapi.v0.GetDataContractHistoryRequest.IGetDataContractHistoryRequestV0=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} GetDataContractHistoryRequestV0 instance + * @param {org.dash.platform.dapi.v0.GetDataContractsRequest.IGetDataContractsRequestV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} GetDataContractsRequestV0 instance */ - GetDataContractHistoryRequestV0.create = function create(properties) { - return new GetDataContractHistoryRequestV0(properties); + GetDataContractsRequestV0.create = function create(properties) { + return new GetDataContractsRequestV0(properties); }; /** - * Encodes the specified GetDataContractHistoryRequestV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.verify|verify} messages. + * Encodes the specified GetDataContractsRequestV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.verify|verify} messages. * @function encode - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0 + * @memberof org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0 * @static - * @param {org.dash.platform.dapi.v0.GetDataContractHistoryRequest.IGetDataContractHistoryRequestV0} message GetDataContractHistoryRequestV0 message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetDataContractsRequest.IGetDataContractsRequestV0} message GetDataContractsRequestV0 message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - GetDataContractHistoryRequestV0.encode = function encode(message, writer) { - if (!writer) - writer = $Writer.create(); - if (message.id != null && Object.hasOwnProperty.call(message, "id")) - writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.id); - if (message.limit != null && Object.hasOwnProperty.call(message, "limit")) - $root.google.protobuf.UInt32Value.encode(message.limit, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); - if (message.offset != null && Object.hasOwnProperty.call(message, "offset")) - $root.google.protobuf.UInt32Value.encode(message.offset, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); - if (message.startAtMs != null && Object.hasOwnProperty.call(message, "startAtMs")) - writer.uint32(/* id 4, wireType 0 =*/32).uint64(message.startAtMs); + * @returns {$protobuf.Writer} Writer + */ + GetDataContractsRequestV0.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.ids != null && message.ids.length) + for (var i = 0; i < message.ids.length; ++i) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.ids[i]); if (message.prove != null && Object.hasOwnProperty.call(message, "prove")) - writer.uint32(/* id 5, wireType 0 =*/40).bool(message.prove); + writer.uint32(/* id 2, wireType 0 =*/16).bool(message.prove); return writer; }; /** - * Encodes the specified GetDataContractHistoryRequestV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.verify|verify} messages. + * Encodes the specified GetDataContractsRequestV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.verify|verify} messages. * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0 + * @memberof org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0 * @static - * @param {org.dash.platform.dapi.v0.GetDataContractHistoryRequest.IGetDataContractHistoryRequestV0} message GetDataContractHistoryRequestV0 message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetDataContractsRequest.IGetDataContractsRequestV0} message GetDataContractsRequestV0 message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetDataContractHistoryRequestV0.encodeDelimited = function encodeDelimited(message, writer) { + GetDataContractsRequestV0.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a GetDataContractHistoryRequestV0 message from the specified reader or buffer. + * Decodes a GetDataContractsRequestV0 message from the specified reader or buffer. * @function decode - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0 + * @memberof org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0 * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} GetDataContractHistoryRequestV0 + * @returns {org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} GetDataContractsRequestV0 * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetDataContractHistoryRequestV0.decode = function decode(reader, length) { + GetDataContractsRequestV0.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0(); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { case 1: - message.id = reader.bytes(); + if (!(message.ids && message.ids.length)) + message.ids = []; + message.ids.push(reader.bytes()); break; case 2: - message.limit = $root.google.protobuf.UInt32Value.decode(reader, reader.uint32()); - break; - case 3: - message.offset = $root.google.protobuf.UInt32Value.decode(reader, reader.uint32()); - break; - case 4: - message.startAtMs = reader.uint64(); - break; - case 5: message.prove = reader.bool(); break; default: @@ -15095,48 +13896,39 @@ $root.org = (function() { }; /** - * Decodes a GetDataContractHistoryRequestV0 message from the specified reader or buffer, length delimited. + * Decodes a GetDataContractsRequestV0 message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0 + * @memberof org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0 * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} GetDataContractHistoryRequestV0 + * @returns {org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} GetDataContractsRequestV0 * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetDataContractHistoryRequestV0.decodeDelimited = function decodeDelimited(reader) { + GetDataContractsRequestV0.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a GetDataContractHistoryRequestV0 message. + * Verifies a GetDataContractsRequestV0 message. * @function verify - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0 + * @memberof org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0 * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - GetDataContractHistoryRequestV0.verify = function verify(message) { + GetDataContractsRequestV0.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; - if (message.id != null && message.hasOwnProperty("id")) - if (!(message.id && typeof message.id.length === "number" || $util.isString(message.id))) - return "id: buffer expected"; - if (message.limit != null && message.hasOwnProperty("limit")) { - var error = $root.google.protobuf.UInt32Value.verify(message.limit); - if (error) - return "limit." + error; - } - if (message.offset != null && message.hasOwnProperty("offset")) { - var error = $root.google.protobuf.UInt32Value.verify(message.offset); - if (error) - return "offset." + error; + if (message.ids != null && message.hasOwnProperty("ids")) { + if (!Array.isArray(message.ids)) + return "ids: array expected"; + for (var i = 0; i < message.ids.length; ++i) + if (!(message.ids[i] && typeof message.ids[i].length === "number" || $util.isString(message.ids[i]))) + return "ids: buffer[] expected"; } - if (message.startAtMs != null && message.hasOwnProperty("startAtMs")) - if (!$util.isInteger(message.startAtMs) && !(message.startAtMs && $util.isInteger(message.startAtMs.low) && $util.isInteger(message.startAtMs.high))) - return "startAtMs: integer|Long expected"; if (message.prove != null && message.hasOwnProperty("prove")) if (typeof message.prove !== "boolean") return "prove: boolean expected"; @@ -15144,127 +13936,94 @@ $root.org = (function() { }; /** - * Creates a GetDataContractHistoryRequestV0 message from a plain object. Also converts values to their respective internal types. + * Creates a GetDataContractsRequestV0 message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0 + * @memberof org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0 * @static * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} GetDataContractHistoryRequestV0 + * @returns {org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} GetDataContractsRequestV0 */ - GetDataContractHistoryRequestV0.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0) + GetDataContractsRequestV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0) return object; - var message = new $root.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0(); - if (object.id != null) - if (typeof object.id === "string") - $util.base64.decode(object.id, message.id = $util.newBuffer($util.base64.length(object.id)), 0); - else if (object.id.length >= 0) - message.id = object.id; - if (object.limit != null) { - if (typeof object.limit !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.limit: object expected"); - message.limit = $root.google.protobuf.UInt32Value.fromObject(object.limit); - } - if (object.offset != null) { - if (typeof object.offset !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.offset: object expected"); - message.offset = $root.google.protobuf.UInt32Value.fromObject(object.offset); + var message = new $root.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0(); + if (object.ids) { + if (!Array.isArray(object.ids)) + throw TypeError(".org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.ids: array expected"); + message.ids = []; + for (var i = 0; i < object.ids.length; ++i) + if (typeof object.ids[i] === "string") + $util.base64.decode(object.ids[i], message.ids[i] = $util.newBuffer($util.base64.length(object.ids[i])), 0); + else if (object.ids[i].length >= 0) + message.ids[i] = object.ids[i]; } - if (object.startAtMs != null) - if ($util.Long) - (message.startAtMs = $util.Long.fromValue(object.startAtMs)).unsigned = true; - else if (typeof object.startAtMs === "string") - message.startAtMs = parseInt(object.startAtMs, 10); - else if (typeof object.startAtMs === "number") - message.startAtMs = object.startAtMs; - else if (typeof object.startAtMs === "object") - message.startAtMs = new $util.LongBits(object.startAtMs.low >>> 0, object.startAtMs.high >>> 0).toNumber(true); if (object.prove != null) message.prove = Boolean(object.prove); return message; }; /** - * Creates a plain object from a GetDataContractHistoryRequestV0 message. Also converts values to other types if specified. + * Creates a plain object from a GetDataContractsRequestV0 message. Also converts values to other types if specified. * @function toObject - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0 + * @memberof org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0 * @static - * @param {org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} message GetDataContractHistoryRequestV0 + * @param {org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} message GetDataContractsRequestV0 * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - GetDataContractHistoryRequestV0.toObject = function toObject(message, options) { + GetDataContractsRequestV0.toObject = function toObject(message, options) { if (!options) options = {}; var object = {}; - if (options.defaults) { - if (options.bytes === String) - object.id = ""; - else { - object.id = []; - if (options.bytes !== Array) - object.id = $util.newBuffer(object.id); - } - object.limit = null; - object.offset = null; - if ($util.Long) { - var long = new $util.Long(0, 0, true); - object.startAtMs = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; - } else - object.startAtMs = options.longs === String ? "0" : 0; + if (options.arrays || options.defaults) + object.ids = []; + if (options.defaults) object.prove = false; + if (message.ids && message.ids.length) { + object.ids = []; + for (var j = 0; j < message.ids.length; ++j) + object.ids[j] = options.bytes === String ? $util.base64.encode(message.ids[j], 0, message.ids[j].length) : options.bytes === Array ? Array.prototype.slice.call(message.ids[j]) : message.ids[j]; } - if (message.id != null && message.hasOwnProperty("id")) - object.id = options.bytes === String ? $util.base64.encode(message.id, 0, message.id.length) : options.bytes === Array ? Array.prototype.slice.call(message.id) : message.id; - if (message.limit != null && message.hasOwnProperty("limit")) - object.limit = $root.google.protobuf.UInt32Value.toObject(message.limit, options); - if (message.offset != null && message.hasOwnProperty("offset")) - object.offset = $root.google.protobuf.UInt32Value.toObject(message.offset, options); - if (message.startAtMs != null && message.hasOwnProperty("startAtMs")) - if (typeof message.startAtMs === "number") - object.startAtMs = options.longs === String ? String(message.startAtMs) : message.startAtMs; - else - object.startAtMs = options.longs === String ? $util.Long.prototype.toString.call(message.startAtMs) : options.longs === Number ? new $util.LongBits(message.startAtMs.low >>> 0, message.startAtMs.high >>> 0).toNumber(true) : message.startAtMs; if (message.prove != null && message.hasOwnProperty("prove")) object.prove = message.prove; return object; }; /** - * Converts this GetDataContractHistoryRequestV0 to JSON. + * Converts this GetDataContractsRequestV0 to JSON. * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0 + * @memberof org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0 * @instance * @returns {Object.} JSON object */ - GetDataContractHistoryRequestV0.prototype.toJSON = function toJSON() { + GetDataContractsRequestV0.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - return GetDataContractHistoryRequestV0; + return GetDataContractsRequestV0; })(); - return GetDataContractHistoryRequest; + return GetDataContractsRequest; })(); - v0.GetDataContractHistoryResponse = (function() { + v0.GetDataContractsResponse = (function() { /** - * Properties of a GetDataContractHistoryResponse. + * Properties of a GetDataContractsResponse. * @memberof org.dash.platform.dapi.v0 - * @interface IGetDataContractHistoryResponse - * @property {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.IGetDataContractHistoryResponseV0|null} [v0] GetDataContractHistoryResponse v0 + * @interface IGetDataContractsResponse + * @property {org.dash.platform.dapi.v0.GetDataContractsResponse.IGetDataContractsResponseV0|null} [v0] GetDataContractsResponse v0 */ /** - * Constructs a new GetDataContractHistoryResponse. + * Constructs a new GetDataContractsResponse. * @memberof org.dash.platform.dapi.v0 - * @classdesc Represents a GetDataContractHistoryResponse. - * @implements IGetDataContractHistoryResponse + * @classdesc Represents a GetDataContractsResponse. + * @implements IGetDataContractsResponse * @constructor - * @param {org.dash.platform.dapi.v0.IGetDataContractHistoryResponse=} [properties] Properties to set + * @param {org.dash.platform.dapi.v0.IGetDataContractsResponse=} [properties] Properties to set */ - function GetDataContractHistoryResponse(properties) { + function GetDataContractsResponse(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -15272,89 +14031,89 @@ $root.org = (function() { } /** - * GetDataContractHistoryResponse v0. - * @member {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.IGetDataContractHistoryResponseV0|null|undefined} v0 - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse + * GetDataContractsResponse v0. + * @member {org.dash.platform.dapi.v0.GetDataContractsResponse.IGetDataContractsResponseV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse * @instance */ - GetDataContractHistoryResponse.prototype.v0 = null; + GetDataContractsResponse.prototype.v0 = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** - * GetDataContractHistoryResponse version. + * GetDataContractsResponse version. * @member {"v0"|undefined} version - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse + * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse * @instance */ - Object.defineProperty(GetDataContractHistoryResponse.prototype, "version", { + Object.defineProperty(GetDataContractsResponse.prototype, "version", { get: $util.oneOfGetter($oneOfFields = ["v0"]), set: $util.oneOfSetter($oneOfFields) }); /** - * Creates a new GetDataContractHistoryResponse instance using the specified properties. + * Creates a new GetDataContractsResponse instance using the specified properties. * @function create - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse + * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse * @static - * @param {org.dash.platform.dapi.v0.IGetDataContractHistoryResponse=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetDataContractHistoryResponse} GetDataContractHistoryResponse instance + * @param {org.dash.platform.dapi.v0.IGetDataContractsResponse=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetDataContractsResponse} GetDataContractsResponse instance */ - GetDataContractHistoryResponse.create = function create(properties) { - return new GetDataContractHistoryResponse(properties); + GetDataContractsResponse.create = function create(properties) { + return new GetDataContractsResponse(properties); }; /** - * Encodes the specified GetDataContractHistoryResponse message. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractHistoryResponse.verify|verify} messages. + * Encodes the specified GetDataContractsResponse message. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractsResponse.verify|verify} messages. * @function encode - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse + * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse * @static - * @param {org.dash.platform.dapi.v0.IGetDataContractHistoryResponse} message GetDataContractHistoryResponse message or plain object to encode + * @param {org.dash.platform.dapi.v0.IGetDataContractsResponse} message GetDataContractsResponse message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetDataContractHistoryResponse.encode = function encode(message, writer) { + GetDataContractsResponse.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) - $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + $root.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); return writer; }; /** - * Encodes the specified GetDataContractHistoryResponse message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractHistoryResponse.verify|verify} messages. + * Encodes the specified GetDataContractsResponse message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractsResponse.verify|verify} messages. * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse + * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse * @static - * @param {org.dash.platform.dapi.v0.IGetDataContractHistoryResponse} message GetDataContractHistoryResponse message or plain object to encode + * @param {org.dash.platform.dapi.v0.IGetDataContractsResponse} message GetDataContractsResponse message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetDataContractHistoryResponse.encodeDelimited = function encodeDelimited(message, writer) { + GetDataContractsResponse.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a GetDataContractHistoryResponse message from the specified reader or buffer. + * Decodes a GetDataContractsResponse message from the specified reader or buffer. * @function decode - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse + * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetDataContractHistoryResponse} GetDataContractHistoryResponse + * @returns {org.dash.platform.dapi.v0.GetDataContractsResponse} GetDataContractsResponse * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetDataContractHistoryResponse.decode = function decode(reader, length) { + GetDataContractsResponse.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse(); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetDataContractsResponse(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { case 1: - message.v0 = $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.decode(reader, reader.uint32()); + message.v0 = $root.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.decode(reader, reader.uint32()); break; default: reader.skipType(tag & 7); @@ -15365,37 +14124,37 @@ $root.org = (function() { }; /** - * Decodes a GetDataContractHistoryResponse message from the specified reader or buffer, length delimited. + * Decodes a GetDataContractsResponse message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse + * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetDataContractHistoryResponse} GetDataContractHistoryResponse + * @returns {org.dash.platform.dapi.v0.GetDataContractsResponse} GetDataContractsResponse * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetDataContractHistoryResponse.decodeDelimited = function decodeDelimited(reader) { + GetDataContractsResponse.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a GetDataContractHistoryResponse message. + * Verifies a GetDataContractsResponse message. * @function verify - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse + * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - GetDataContractHistoryResponse.verify = function verify(message) { + GetDataContractsResponse.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; var properties = {}; if (message.v0 != null && message.hasOwnProperty("v0")) { properties.version = 1; { - var error = $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.verify(message.v0); + var error = $root.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.verify(message.v0); if (error) return "v0." + error; } @@ -15404,40 +14163,40 @@ $root.org = (function() { }; /** - * Creates a GetDataContractHistoryResponse message from a plain object. Also converts values to their respective internal types. + * Creates a GetDataContractsResponse message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse + * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse * @static * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetDataContractHistoryResponse} GetDataContractHistoryResponse + * @returns {org.dash.platform.dapi.v0.GetDataContractsResponse} GetDataContractsResponse */ - GetDataContractHistoryResponse.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse) + GetDataContractsResponse.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetDataContractsResponse) return object; - var message = new $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse(); + var message = new $root.org.dash.platform.dapi.v0.GetDataContractsResponse(); if (object.v0 != null) { if (typeof object.v0 !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetDataContractHistoryResponse.v0: object expected"); - message.v0 = $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.fromObject(object.v0); + throw TypeError(".org.dash.platform.dapi.v0.GetDataContractsResponse.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.fromObject(object.v0); } return message; }; /** - * Creates a plain object from a GetDataContractHistoryResponse message. Also converts values to other types if specified. + * Creates a plain object from a GetDataContractsResponse message. Also converts values to other types if specified. * @function toObject - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse + * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse * @static - * @param {org.dash.platform.dapi.v0.GetDataContractHistoryResponse} message GetDataContractHistoryResponse + * @param {org.dash.platform.dapi.v0.GetDataContractsResponse} message GetDataContractsResponse * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - GetDataContractHistoryResponse.toObject = function toObject(message, options) { + GetDataContractsResponse.toObject = function toObject(message, options) { if (!options) options = {}; var object = {}; if (message.v0 != null && message.hasOwnProperty("v0")) { - object.v0 = $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.toObject(message.v0, options); + object.v0 = $root.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.toObject(message.v0, options); if (options.oneofs) object.version = "v0"; } @@ -15445,36 +14204,35 @@ $root.org = (function() { }; /** - * Converts this GetDataContractHistoryResponse to JSON. + * Converts this GetDataContractsResponse to JSON. * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse + * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse * @instance * @returns {Object.} JSON object */ - GetDataContractHistoryResponse.prototype.toJSON = function toJSON() { + GetDataContractsResponse.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - GetDataContractHistoryResponse.GetDataContractHistoryResponseV0 = (function() { + GetDataContractsResponse.DataContractEntry = (function() { /** - * Properties of a GetDataContractHistoryResponseV0. - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse - * @interface IGetDataContractHistoryResponseV0 - * @property {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.IDataContractHistory|null} [dataContractHistory] GetDataContractHistoryResponseV0 dataContractHistory - * @property {org.dash.platform.dapi.v0.IProof|null} [proof] GetDataContractHistoryResponseV0 proof - * @property {org.dash.platform.dapi.v0.IResponseMetadata|null} [metadata] GetDataContractHistoryResponseV0 metadata + * Properties of a DataContractEntry. + * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse + * @interface IDataContractEntry + * @property {Uint8Array|null} [identifier] DataContractEntry identifier + * @property {google.protobuf.IBytesValue|null} [dataContract] DataContractEntry dataContract */ /** - * Constructs a new GetDataContractHistoryResponseV0. - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse - * @classdesc Represents a GetDataContractHistoryResponseV0. - * @implements IGetDataContractHistoryResponseV0 + * Constructs a new DataContractEntry. + * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse + * @classdesc Represents a DataContractEntry. + * @implements IDataContractEntry * @constructor - * @param {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.IGetDataContractHistoryResponseV0=} [properties] Properties to set + * @param {org.dash.platform.dapi.v0.GetDataContractsResponse.IDataContractEntry=} [properties] Properties to set */ - function GetDataContractHistoryResponseV0(properties) { + function DataContractEntry(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -15482,115 +14240,88 @@ $root.org = (function() { } /** - * GetDataContractHistoryResponseV0 dataContractHistory. - * @member {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.IDataContractHistory|null|undefined} dataContractHistory - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0 - * @instance - */ - GetDataContractHistoryResponseV0.prototype.dataContractHistory = null; - - /** - * GetDataContractHistoryResponseV0 proof. - * @member {org.dash.platform.dapi.v0.IProof|null|undefined} proof - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0 - * @instance - */ - GetDataContractHistoryResponseV0.prototype.proof = null; - - /** - * GetDataContractHistoryResponseV0 metadata. - * @member {org.dash.platform.dapi.v0.IResponseMetadata|null|undefined} metadata - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0 + * DataContractEntry identifier. + * @member {Uint8Array} identifier + * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry * @instance */ - GetDataContractHistoryResponseV0.prototype.metadata = null; - - // OneOf field names bound to virtual getters and setters - var $oneOfFields; + DataContractEntry.prototype.identifier = $util.newBuffer([]); /** - * GetDataContractHistoryResponseV0 result. - * @member {"dataContractHistory"|"proof"|undefined} result - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0 + * DataContractEntry dataContract. + * @member {google.protobuf.IBytesValue|null|undefined} dataContract + * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry * @instance */ - Object.defineProperty(GetDataContractHistoryResponseV0.prototype, "result", { - get: $util.oneOfGetter($oneOfFields = ["dataContractHistory", "proof"]), - set: $util.oneOfSetter($oneOfFields) - }); + DataContractEntry.prototype.dataContract = null; /** - * Creates a new GetDataContractHistoryResponseV0 instance using the specified properties. + * Creates a new DataContractEntry instance using the specified properties. * @function create - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0 + * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry * @static - * @param {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.IGetDataContractHistoryResponseV0=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} GetDataContractHistoryResponseV0 instance + * @param {org.dash.platform.dapi.v0.GetDataContractsResponse.IDataContractEntry=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry} DataContractEntry instance */ - GetDataContractHistoryResponseV0.create = function create(properties) { - return new GetDataContractHistoryResponseV0(properties); + DataContractEntry.create = function create(properties) { + return new DataContractEntry(properties); }; /** - * Encodes the specified GetDataContractHistoryResponseV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.verify|verify} messages. + * Encodes the specified DataContractEntry message. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.verify|verify} messages. * @function encode - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0 + * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry * @static - * @param {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.IGetDataContractHistoryResponseV0} message GetDataContractHistoryResponseV0 message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetDataContractsResponse.IDataContractEntry} message DataContractEntry message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetDataContractHistoryResponseV0.encode = function encode(message, writer) { + DataContractEntry.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.dataContractHistory != null && Object.hasOwnProperty.call(message, "dataContractHistory")) - $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.encode(message.dataContractHistory, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); - if (message.proof != null && Object.hasOwnProperty.call(message, "proof")) - $root.org.dash.platform.dapi.v0.Proof.encode(message.proof, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); - if (message.metadata != null && Object.hasOwnProperty.call(message, "metadata")) - $root.org.dash.platform.dapi.v0.ResponseMetadata.encode(message.metadata, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + if (message.identifier != null && Object.hasOwnProperty.call(message, "identifier")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.identifier); + if (message.dataContract != null && Object.hasOwnProperty.call(message, "dataContract")) + $root.google.protobuf.BytesValue.encode(message.dataContract, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); return writer; }; /** - * Encodes the specified GetDataContractHistoryResponseV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.verify|verify} messages. + * Encodes the specified DataContractEntry message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.verify|verify} messages. * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0 + * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry * @static - * @param {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.IGetDataContractHistoryResponseV0} message GetDataContractHistoryResponseV0 message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetDataContractsResponse.IDataContractEntry} message DataContractEntry message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetDataContractHistoryResponseV0.encodeDelimited = function encodeDelimited(message, writer) { + DataContractEntry.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a GetDataContractHistoryResponseV0 message from the specified reader or buffer. + * Decodes a DataContractEntry message from the specified reader or buffer. * @function decode - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0 + * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} GetDataContractHistoryResponseV0 + * @returns {org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry} DataContractEntry * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetDataContractHistoryResponseV0.decode = function decode(reader, length) { + DataContractEntry.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0(); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { case 1: - message.dataContractHistory = $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.decode(reader, reader.uint32()); + message.identifier = reader.bytes(); break; case 2: - message.proof = $root.org.dash.platform.dapi.v0.Proof.decode(reader, reader.uint32()); - break; - case 3: - message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.decode(reader, reader.uint32()); + message.dataContract = $root.google.protobuf.BytesValue.decode(reader, reader.uint32()); break; default: reader.skipType(tag & 7); @@ -15601,595 +14332,614 @@ $root.org = (function() { }; /** - * Decodes a GetDataContractHistoryResponseV0 message from the specified reader or buffer, length delimited. + * Decodes a DataContractEntry message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0 + * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} GetDataContractHistoryResponseV0 + * @returns {org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry} DataContractEntry * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetDataContractHistoryResponseV0.decodeDelimited = function decodeDelimited(reader) { + DataContractEntry.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a GetDataContractHistoryResponseV0 message. + * Verifies a DataContractEntry message. * @function verify - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0 + * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - GetDataContractHistoryResponseV0.verify = function verify(message) { + DataContractEntry.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; - var properties = {}; - if (message.dataContractHistory != null && message.hasOwnProperty("dataContractHistory")) { - properties.result = 1; - { - var error = $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.verify(message.dataContractHistory); - if (error) - return "dataContractHistory." + error; - } - } - if (message.proof != null && message.hasOwnProperty("proof")) { - if (properties.result === 1) - return "result: multiple values"; - properties.result = 1; - { - var error = $root.org.dash.platform.dapi.v0.Proof.verify(message.proof); - if (error) - return "proof." + error; - } - } - if (message.metadata != null && message.hasOwnProperty("metadata")) { - var error = $root.org.dash.platform.dapi.v0.ResponseMetadata.verify(message.metadata); + if (message.identifier != null && message.hasOwnProperty("identifier")) + if (!(message.identifier && typeof message.identifier.length === "number" || $util.isString(message.identifier))) + return "identifier: buffer expected"; + if (message.dataContract != null && message.hasOwnProperty("dataContract")) { + var error = $root.google.protobuf.BytesValue.verify(message.dataContract); if (error) - return "metadata." + error; + return "dataContract." + error; } return null; }; /** - * Creates a GetDataContractHistoryResponseV0 message from a plain object. Also converts values to their respective internal types. + * Creates a DataContractEntry message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0 + * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry * @static * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} GetDataContractHistoryResponseV0 + * @returns {org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry} DataContractEntry */ - GetDataContractHistoryResponseV0.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0) + DataContractEntry.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry) return object; - var message = new $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0(); - if (object.dataContractHistory != null) { - if (typeof object.dataContractHistory !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.dataContractHistory: object expected"); - message.dataContractHistory = $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.fromObject(object.dataContractHistory); - } - if (object.proof != null) { - if (typeof object.proof !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.proof: object expected"); - message.proof = $root.org.dash.platform.dapi.v0.Proof.fromObject(object.proof); - } - if (object.metadata != null) { - if (typeof object.metadata !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.metadata: object expected"); - message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.fromObject(object.metadata); + var message = new $root.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry(); + if (object.identifier != null) + if (typeof object.identifier === "string") + $util.base64.decode(object.identifier, message.identifier = $util.newBuffer($util.base64.length(object.identifier)), 0); + else if (object.identifier.length >= 0) + message.identifier = object.identifier; + if (object.dataContract != null) { + if (typeof object.dataContract !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.dataContract: object expected"); + message.dataContract = $root.google.protobuf.BytesValue.fromObject(object.dataContract); } return message; }; /** - * Creates a plain object from a GetDataContractHistoryResponseV0 message. Also converts values to other types if specified. + * Creates a plain object from a DataContractEntry message. Also converts values to other types if specified. * @function toObject - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0 + * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry * @static - * @param {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} message GetDataContractHistoryResponseV0 + * @param {org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry} message DataContractEntry * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - GetDataContractHistoryResponseV0.toObject = function toObject(message, options) { + DataContractEntry.toObject = function toObject(message, options) { if (!options) options = {}; var object = {}; - if (options.defaults) - object.metadata = null; - if (message.dataContractHistory != null && message.hasOwnProperty("dataContractHistory")) { - object.dataContractHistory = $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.toObject(message.dataContractHistory, options); - if (options.oneofs) - object.result = "dataContractHistory"; - } - if (message.proof != null && message.hasOwnProperty("proof")) { - object.proof = $root.org.dash.platform.dapi.v0.Proof.toObject(message.proof, options); - if (options.oneofs) - object.result = "proof"; + if (options.defaults) { + if (options.bytes === String) + object.identifier = ""; + else { + object.identifier = []; + if (options.bytes !== Array) + object.identifier = $util.newBuffer(object.identifier); + } + object.dataContract = null; } - if (message.metadata != null && message.hasOwnProperty("metadata")) - object.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.toObject(message.metadata, options); + if (message.identifier != null && message.hasOwnProperty("identifier")) + object.identifier = options.bytes === String ? $util.base64.encode(message.identifier, 0, message.identifier.length) : options.bytes === Array ? Array.prototype.slice.call(message.identifier) : message.identifier; + if (message.dataContract != null && message.hasOwnProperty("dataContract")) + object.dataContract = $root.google.protobuf.BytesValue.toObject(message.dataContract, options); return object; }; /** - * Converts this GetDataContractHistoryResponseV0 to JSON. + * Converts this DataContractEntry to JSON. * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0 + * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry * @instance * @returns {Object.} JSON object */ - GetDataContractHistoryResponseV0.prototype.toJSON = function toJSON() { + DataContractEntry.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - GetDataContractHistoryResponseV0.DataContractHistoryEntry = (function() { + return DataContractEntry; + })(); - /** - * Properties of a DataContractHistoryEntry. - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0 - * @interface IDataContractHistoryEntry - * @property {number|Long|null} [date] DataContractHistoryEntry date - * @property {Uint8Array|null} [value] DataContractHistoryEntry value - */ + GetDataContractsResponse.DataContracts = (function() { - /** - * Constructs a new DataContractHistoryEntry. - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0 - * @classdesc Represents a DataContractHistoryEntry. - * @implements IDataContractHistoryEntry - * @constructor - * @param {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.IDataContractHistoryEntry=} [properties] Properties to set - */ - function DataContractHistoryEntry(properties) { - if (properties) - for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) - if (properties[keys[i]] != null) - this[keys[i]] = properties[keys[i]]; - } + /** + * Properties of a DataContracts. + * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse + * @interface IDataContracts + * @property {Array.|null} [dataContractEntries] DataContracts dataContractEntries + */ - /** - * DataContractHistoryEntry date. - * @member {number|Long} date - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry - * @instance - */ - DataContractHistoryEntry.prototype.date = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + /** + * Constructs a new DataContracts. + * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse + * @classdesc Represents a DataContracts. + * @implements IDataContracts + * @constructor + * @param {org.dash.platform.dapi.v0.GetDataContractsResponse.IDataContracts=} [properties] Properties to set + */ + function DataContracts(properties) { + this.dataContractEntries = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } - /** - * DataContractHistoryEntry value. - * @member {Uint8Array} value - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry - * @instance - */ - DataContractHistoryEntry.prototype.value = $util.newBuffer([]); + /** + * DataContracts dataContractEntries. + * @member {Array.} dataContractEntries + * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts + * @instance + */ + DataContracts.prototype.dataContractEntries = $util.emptyArray; - /** - * Creates a new DataContractHistoryEntry instance using the specified properties. - * @function create - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry - * @static - * @param {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.IDataContractHistoryEntry=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry} DataContractHistoryEntry instance - */ - DataContractHistoryEntry.create = function create(properties) { - return new DataContractHistoryEntry(properties); - }; + /** + * Creates a new DataContracts instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts + * @static + * @param {org.dash.platform.dapi.v0.GetDataContractsResponse.IDataContracts=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts} DataContracts instance + */ + DataContracts.create = function create(properties) { + return new DataContracts(properties); + }; - /** - * Encodes the specified DataContractHistoryEntry message. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.verify|verify} messages. - * @function encode - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry - * @static - * @param {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.IDataContractHistoryEntry} message DataContractHistoryEntry message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - DataContractHistoryEntry.encode = function encode(message, writer) { - if (!writer) - writer = $Writer.create(); - if (message.date != null && Object.hasOwnProperty.call(message, "date")) - writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.date); - if (message.value != null && Object.hasOwnProperty.call(message, "value")) - writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.value); - return writer; - }; + /** + * Encodes the specified DataContracts message. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts + * @static + * @param {org.dash.platform.dapi.v0.GetDataContractsResponse.IDataContracts} message DataContracts message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + DataContracts.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.dataContractEntries != null && message.dataContractEntries.length) + for (var i = 0; i < message.dataContractEntries.length; ++i) + $root.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.encode(message.dataContractEntries[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; - /** - * Encodes the specified DataContractHistoryEntry message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.verify|verify} messages. - * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry - * @static - * @param {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.IDataContractHistoryEntry} message DataContractHistoryEntry message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - DataContractHistoryEntry.encodeDelimited = function encodeDelimited(message, writer) { - return this.encode(message, writer).ldelim(); - }; + /** + * Encodes the specified DataContracts message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts + * @static + * @param {org.dash.platform.dapi.v0.GetDataContractsResponse.IDataContracts} message DataContracts message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + DataContracts.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; - /** - * Decodes a DataContractHistoryEntry message from the specified reader or buffer. - * @function decode - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry} DataContractHistoryEntry - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - DataContractHistoryEntry.decode = function decode(reader, length) { - if (!(reader instanceof $Reader)) - reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry(); - while (reader.pos < end) { - var tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - message.date = reader.uint64(); - break; - case 2: - message.value = reader.bytes(); - break; - default: - reader.skipType(tag & 7); - break; - } + /** + * Decodes a DataContracts message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts} DataContracts + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + DataContracts.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (!(message.dataContractEntries && message.dataContractEntries.length)) + message.dataContractEntries = []; + message.dataContractEntries.push($root.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.decode(reader, reader.uint32())); + break; + default: + reader.skipType(tag & 7); + break; } - return message; - }; - - /** - * Decodes a DataContractHistoryEntry message from the specified reader or buffer, length delimited. - * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry} DataContractHistoryEntry - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - DataContractHistoryEntry.decodeDelimited = function decodeDelimited(reader) { - if (!(reader instanceof $Reader)) - reader = new $Reader(reader); - return this.decode(reader, reader.uint32()); - }; - - /** - * Verifies a DataContractHistoryEntry message. - * @function verify - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry - * @static - * @param {Object.} message Plain object to verify - * @returns {string|null} `null` if valid, otherwise the reason why it is not - */ - DataContractHistoryEntry.verify = function verify(message) { - if (typeof message !== "object" || message === null) - return "object expected"; - if (message.date != null && message.hasOwnProperty("date")) - if (!$util.isInteger(message.date) && !(message.date && $util.isInteger(message.date.low) && $util.isInteger(message.date.high))) - return "date: integer|Long expected"; - if (message.value != null && message.hasOwnProperty("value")) - if (!(message.value && typeof message.value.length === "number" || $util.isString(message.value))) - return "value: buffer expected"; - return null; - }; + } + return message; + }; - /** - * Creates a DataContractHistoryEntry message from a plain object. Also converts values to their respective internal types. - * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry - * @static - * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry} DataContractHistoryEntry - */ - DataContractHistoryEntry.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry) - return object; - var message = new $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry(); - if (object.date != null) - if ($util.Long) - (message.date = $util.Long.fromValue(object.date)).unsigned = true; - else if (typeof object.date === "string") - message.date = parseInt(object.date, 10); - else if (typeof object.date === "number") - message.date = object.date; - else if (typeof object.date === "object") - message.date = new $util.LongBits(object.date.low >>> 0, object.date.high >>> 0).toNumber(true); - if (object.value != null) - if (typeof object.value === "string") - $util.base64.decode(object.value, message.value = $util.newBuffer($util.base64.length(object.value)), 0); - else if (object.value.length >= 0) - message.value = object.value; - return message; - }; + /** + * Decodes a DataContracts message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts} DataContracts + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + DataContracts.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; - /** - * Creates a plain object from a DataContractHistoryEntry message. Also converts values to other types if specified. - * @function toObject - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry - * @static - * @param {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry} message DataContractHistoryEntry - * @param {$protobuf.IConversionOptions} [options] Conversion options - * @returns {Object.} Plain object - */ - DataContractHistoryEntry.toObject = function toObject(message, options) { - if (!options) - options = {}; - var object = {}; - if (options.defaults) { - if ($util.Long) { - var long = new $util.Long(0, 0, true); - object.date = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; - } else - object.date = options.longs === String ? "0" : 0; - if (options.bytes === String) - object.value = ""; - else { - object.value = []; - if (options.bytes !== Array) - object.value = $util.newBuffer(object.value); - } + /** + * Verifies a DataContracts message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + DataContracts.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.dataContractEntries != null && message.hasOwnProperty("dataContractEntries")) { + if (!Array.isArray(message.dataContractEntries)) + return "dataContractEntries: array expected"; + for (var i = 0; i < message.dataContractEntries.length; ++i) { + var error = $root.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.verify(message.dataContractEntries[i]); + if (error) + return "dataContractEntries." + error; } - if (message.date != null && message.hasOwnProperty("date")) - if (typeof message.date === "number") - object.date = options.longs === String ? String(message.date) : message.date; - else - object.date = options.longs === String ? $util.Long.prototype.toString.call(message.date) : options.longs === Number ? new $util.LongBits(message.date.low >>> 0, message.date.high >>> 0).toNumber(true) : message.date; - if (message.value != null && message.hasOwnProperty("value")) - object.value = options.bytes === String ? $util.base64.encode(message.value, 0, message.value.length) : options.bytes === Array ? Array.prototype.slice.call(message.value) : message.value; + } + return null; + }; + + /** + * Creates a DataContracts message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts + * @static + * @param {Object.} object Plain object + * @returns {org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts} DataContracts + */ + DataContracts.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts) return object; - }; + var message = new $root.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts(); + if (object.dataContractEntries) { + if (!Array.isArray(object.dataContractEntries)) + throw TypeError(".org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.dataContractEntries: array expected"); + message.dataContractEntries = []; + for (var i = 0; i < object.dataContractEntries.length; ++i) { + if (typeof object.dataContractEntries[i] !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.dataContractEntries: object expected"); + message.dataContractEntries[i] = $root.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.fromObject(object.dataContractEntries[i]); + } + } + return message; + }; - /** - * Converts this DataContractHistoryEntry to JSON. - * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry - * @instance - * @returns {Object.} JSON object - */ - DataContractHistoryEntry.prototype.toJSON = function toJSON() { - return this.constructor.toObject(this, $protobuf.util.toJSONOptions); - }; + /** + * Creates a plain object from a DataContracts message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts + * @static + * @param {org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts} message DataContracts + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + DataContracts.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.dataContractEntries = []; + if (message.dataContractEntries && message.dataContractEntries.length) { + object.dataContractEntries = []; + for (var j = 0; j < message.dataContractEntries.length; ++j) + object.dataContractEntries[j] = $root.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.toObject(message.dataContractEntries[j], options); + } + return object; + }; - return DataContractHistoryEntry; - })(); + /** + * Converts this DataContracts to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts + * @instance + * @returns {Object.} JSON object + */ + DataContracts.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; - GetDataContractHistoryResponseV0.DataContractHistory = (function() { + return DataContracts; + })(); - /** - * Properties of a DataContractHistory. - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0 - * @interface IDataContractHistory - * @property {Array.|null} [dataContractEntries] DataContractHistory dataContractEntries - */ + GetDataContractsResponse.GetDataContractsResponseV0 = (function() { - /** - * Constructs a new DataContractHistory. - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0 - * @classdesc Represents a DataContractHistory. - * @implements IDataContractHistory - * @constructor - * @param {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.IDataContractHistory=} [properties] Properties to set - */ - function DataContractHistory(properties) { - this.dataContractEntries = []; - if (properties) - for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) - if (properties[keys[i]] != null) - this[keys[i]] = properties[keys[i]]; - } + /** + * Properties of a GetDataContractsResponseV0. + * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse + * @interface IGetDataContractsResponseV0 + * @property {org.dash.platform.dapi.v0.GetDataContractsResponse.IDataContracts|null} [dataContracts] GetDataContractsResponseV0 dataContracts + * @property {org.dash.platform.dapi.v0.IProof|null} [proof] GetDataContractsResponseV0 proof + * @property {org.dash.platform.dapi.v0.IResponseMetadata|null} [metadata] GetDataContractsResponseV0 metadata + */ - /** - * DataContractHistory dataContractEntries. - * @member {Array.} dataContractEntries - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory - * @instance - */ - DataContractHistory.prototype.dataContractEntries = $util.emptyArray; + /** + * Constructs a new GetDataContractsResponseV0. + * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse + * @classdesc Represents a GetDataContractsResponseV0. + * @implements IGetDataContractsResponseV0 + * @constructor + * @param {org.dash.platform.dapi.v0.GetDataContractsResponse.IGetDataContractsResponseV0=} [properties] Properties to set + */ + function GetDataContractsResponseV0(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } - /** - * Creates a new DataContractHistory instance using the specified properties. - * @function create - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory - * @static - * @param {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.IDataContractHistory=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory} DataContractHistory instance - */ - DataContractHistory.create = function create(properties) { - return new DataContractHistory(properties); - }; + /** + * GetDataContractsResponseV0 dataContracts. + * @member {org.dash.platform.dapi.v0.GetDataContractsResponse.IDataContracts|null|undefined} dataContracts + * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0 + * @instance + */ + GetDataContractsResponseV0.prototype.dataContracts = null; + + /** + * GetDataContractsResponseV0 proof. + * @member {org.dash.platform.dapi.v0.IProof|null|undefined} proof + * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0 + * @instance + */ + GetDataContractsResponseV0.prototype.proof = null; + + /** + * GetDataContractsResponseV0 metadata. + * @member {org.dash.platform.dapi.v0.IResponseMetadata|null|undefined} metadata + * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0 + * @instance + */ + GetDataContractsResponseV0.prototype.metadata = null; - /** - * Encodes the specified DataContractHistory message. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.verify|verify} messages. - * @function encode - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory - * @static - * @param {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.IDataContractHistory} message DataContractHistory message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - DataContractHistory.encode = function encode(message, writer) { - if (!writer) - writer = $Writer.create(); - if (message.dataContractEntries != null && message.dataContractEntries.length) - for (var i = 0; i < message.dataContractEntries.length; ++i) - $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.encode(message.dataContractEntries[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); - return writer; - }; + // OneOf field names bound to virtual getters and setters + var $oneOfFields; - /** - * Encodes the specified DataContractHistory message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.verify|verify} messages. - * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory - * @static - * @param {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.IDataContractHistory} message DataContractHistory message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - DataContractHistory.encodeDelimited = function encodeDelimited(message, writer) { - return this.encode(message, writer).ldelim(); - }; + /** + * GetDataContractsResponseV0 result. + * @member {"dataContracts"|"proof"|undefined} result + * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0 + * @instance + */ + Object.defineProperty(GetDataContractsResponseV0.prototype, "result", { + get: $util.oneOfGetter($oneOfFields = ["dataContracts", "proof"]), + set: $util.oneOfSetter($oneOfFields) + }); - /** - * Decodes a DataContractHistory message from the specified reader or buffer. - * @function decode - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory} DataContractHistory - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - DataContractHistory.decode = function decode(reader, length) { - if (!(reader instanceof $Reader)) - reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory(); - while (reader.pos < end) { - var tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (!(message.dataContractEntries && message.dataContractEntries.length)) - message.dataContractEntries = []; - message.dataContractEntries.push($root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.decode(reader, reader.uint32())); - break; - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }; + /** + * Creates a new GetDataContractsResponseV0 instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetDataContractsResponse.IGetDataContractsResponseV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} GetDataContractsResponseV0 instance + */ + GetDataContractsResponseV0.create = function create(properties) { + return new GetDataContractsResponseV0(properties); + }; - /** - * Decodes a DataContractHistory message from the specified reader or buffer, length delimited. - * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory} DataContractHistory - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - DataContractHistory.decodeDelimited = function decodeDelimited(reader) { - if (!(reader instanceof $Reader)) - reader = new $Reader(reader); - return this.decode(reader, reader.uint32()); - }; + /** + * Encodes the specified GetDataContractsResponseV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetDataContractsResponse.IGetDataContractsResponseV0} message GetDataContractsResponseV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetDataContractsResponseV0.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.dataContracts != null && Object.hasOwnProperty.call(message, "dataContracts")) + $root.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.encode(message.dataContracts, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.proof != null && Object.hasOwnProperty.call(message, "proof")) + $root.org.dash.platform.dapi.v0.Proof.encode(message.proof, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.metadata != null && Object.hasOwnProperty.call(message, "metadata")) + $root.org.dash.platform.dapi.v0.ResponseMetadata.encode(message.metadata, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + return writer; + }; - /** - * Verifies a DataContractHistory message. - * @function verify - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory - * @static - * @param {Object.} message Plain object to verify - * @returns {string|null} `null` if valid, otherwise the reason why it is not - */ - DataContractHistory.verify = function verify(message) { - if (typeof message !== "object" || message === null) - return "object expected"; - if (message.dataContractEntries != null && message.hasOwnProperty("dataContractEntries")) { - if (!Array.isArray(message.dataContractEntries)) - return "dataContractEntries: array expected"; - for (var i = 0; i < message.dataContractEntries.length; ++i) { - var error = $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.verify(message.dataContractEntries[i]); - if (error) - return "dataContractEntries." + error; - } - } - return null; - }; + /** + * Encodes the specified GetDataContractsResponseV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetDataContractsResponse.IGetDataContractsResponseV0} message GetDataContractsResponseV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetDataContractsResponseV0.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; - /** - * Creates a DataContractHistory message from a plain object. Also converts values to their respective internal types. - * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory - * @static - * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory} DataContractHistory - */ - DataContractHistory.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory) - return object; - var message = new $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory(); - if (object.dataContractEntries) { - if (!Array.isArray(object.dataContractEntries)) - throw TypeError(".org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.dataContractEntries: array expected"); - message.dataContractEntries = []; - for (var i = 0; i < object.dataContractEntries.length; ++i) { - if (typeof object.dataContractEntries[i] !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.dataContractEntries: object expected"); - message.dataContractEntries[i] = $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.fromObject(object.dataContractEntries[i]); - } + /** + * Decodes a GetDataContractsResponseV0 message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} GetDataContractsResponseV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetDataContractsResponseV0.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.dataContracts = $root.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.decode(reader, reader.uint32()); + break; + case 2: + message.proof = $root.org.dash.platform.dapi.v0.Proof.decode(reader, reader.uint32()); + break; + case 3: + message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; } - return message; - }; + } + return message; + }; - /** - * Creates a plain object from a DataContractHistory message. Also converts values to other types if specified. - * @function toObject - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory - * @static - * @param {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory} message DataContractHistory - * @param {$protobuf.IConversionOptions} [options] Conversion options - * @returns {Object.} Plain object - */ - DataContractHistory.toObject = function toObject(message, options) { - if (!options) - options = {}; - var object = {}; - if (options.arrays || options.defaults) - object.dataContractEntries = []; - if (message.dataContractEntries && message.dataContractEntries.length) { - object.dataContractEntries = []; - for (var j = 0; j < message.dataContractEntries.length; ++j) - object.dataContractEntries[j] = $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.toObject(message.dataContractEntries[j], options); + /** + * Decodes a GetDataContractsResponseV0 message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} GetDataContractsResponseV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetDataContractsResponseV0.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetDataContractsResponseV0 message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0 + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetDataContractsResponseV0.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.dataContracts != null && message.hasOwnProperty("dataContracts")) { + properties.result = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.verify(message.dataContracts); + if (error) + return "dataContracts." + error; + } + } + if (message.proof != null && message.hasOwnProperty("proof")) { + if (properties.result === 1) + return "result: multiple values"; + properties.result = 1; + { + var error = $root.org.dash.platform.dapi.v0.Proof.verify(message.proof); + if (error) + return "proof." + error; } + } + if (message.metadata != null && message.hasOwnProperty("metadata")) { + var error = $root.org.dash.platform.dapi.v0.ResponseMetadata.verify(message.metadata); + if (error) + return "metadata." + error; + } + return null; + }; + + /** + * Creates a GetDataContractsResponseV0 message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0 + * @static + * @param {Object.} object Plain object + * @returns {org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} GetDataContractsResponseV0 + */ + GetDataContractsResponseV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0) return object; - }; + var message = new $root.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0(); + if (object.dataContracts != null) { + if (typeof object.dataContracts !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.dataContracts: object expected"); + message.dataContracts = $root.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.fromObject(object.dataContracts); + } + if (object.proof != null) { + if (typeof object.proof !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.proof: object expected"); + message.proof = $root.org.dash.platform.dapi.v0.Proof.fromObject(object.proof); + } + if (object.metadata != null) { + if (typeof object.metadata !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.metadata: object expected"); + message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.fromObject(object.metadata); + } + return message; + }; - /** - * Converts this DataContractHistory to JSON. - * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory - * @instance - * @returns {Object.} JSON object - */ - DataContractHistory.prototype.toJSON = function toJSON() { - return this.constructor.toObject(this, $protobuf.util.toJSONOptions); - }; + /** + * Creates a plain object from a GetDataContractsResponseV0 message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} message GetDataContractsResponseV0 + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + GetDataContractsResponseV0.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.metadata = null; + if (message.dataContracts != null && message.hasOwnProperty("dataContracts")) { + object.dataContracts = $root.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.toObject(message.dataContracts, options); + if (options.oneofs) + object.result = "dataContracts"; + } + if (message.proof != null && message.hasOwnProperty("proof")) { + object.proof = $root.org.dash.platform.dapi.v0.Proof.toObject(message.proof, options); + if (options.oneofs) + object.result = "proof"; + } + if (message.metadata != null && message.hasOwnProperty("metadata")) + object.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.toObject(message.metadata, options); + return object; + }; - return DataContractHistory; - })(); + /** + * Converts this GetDataContractsResponseV0 to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0 + * @instance + * @returns {Object.} JSON object + */ + GetDataContractsResponseV0.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; - return GetDataContractHistoryResponseV0; + return GetDataContractsResponseV0; })(); - return GetDataContractHistoryResponse; + return GetDataContractsResponse; })(); - v0.GetDocumentsRequest = (function() { + v0.GetDataContractHistoryRequest = (function() { /** - * Properties of a GetDocumentsRequest. + * Properties of a GetDataContractHistoryRequest. * @memberof org.dash.platform.dapi.v0 - * @interface IGetDocumentsRequest - * @property {org.dash.platform.dapi.v0.GetDocumentsRequest.IGetDocumentsRequestV0|null} [v0] GetDocumentsRequest v0 + * @interface IGetDataContractHistoryRequest + * @property {org.dash.platform.dapi.v0.GetDataContractHistoryRequest.IGetDataContractHistoryRequestV0|null} [v0] GetDataContractHistoryRequest v0 */ /** - * Constructs a new GetDocumentsRequest. + * Constructs a new GetDataContractHistoryRequest. * @memberof org.dash.platform.dapi.v0 - * @classdesc Represents a GetDocumentsRequest. - * @implements IGetDocumentsRequest + * @classdesc Represents a GetDataContractHistoryRequest. + * @implements IGetDataContractHistoryRequest * @constructor - * @param {org.dash.platform.dapi.v0.IGetDocumentsRequest=} [properties] Properties to set + * @param {org.dash.platform.dapi.v0.IGetDataContractHistoryRequest=} [properties] Properties to set */ - function GetDocumentsRequest(properties) { + function GetDataContractHistoryRequest(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -16197,89 +14947,89 @@ $root.org = (function() { } /** - * GetDocumentsRequest v0. - * @member {org.dash.platform.dapi.v0.GetDocumentsRequest.IGetDocumentsRequestV0|null|undefined} v0 - * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest + * GetDataContractHistoryRequest v0. + * @member {org.dash.platform.dapi.v0.GetDataContractHistoryRequest.IGetDataContractHistoryRequestV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest * @instance */ - GetDocumentsRequest.prototype.v0 = null; + GetDataContractHistoryRequest.prototype.v0 = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** - * GetDocumentsRequest version. + * GetDataContractHistoryRequest version. * @member {"v0"|undefined} version - * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest * @instance */ - Object.defineProperty(GetDocumentsRequest.prototype, "version", { + Object.defineProperty(GetDataContractHistoryRequest.prototype, "version", { get: $util.oneOfGetter($oneOfFields = ["v0"]), set: $util.oneOfSetter($oneOfFields) }); /** - * Creates a new GetDocumentsRequest instance using the specified properties. + * Creates a new GetDataContractHistoryRequest instance using the specified properties. * @function create - * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest * @static - * @param {org.dash.platform.dapi.v0.IGetDocumentsRequest=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetDocumentsRequest} GetDocumentsRequest instance + * @param {org.dash.platform.dapi.v0.IGetDataContractHistoryRequest=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetDataContractHistoryRequest} GetDataContractHistoryRequest instance */ - GetDocumentsRequest.create = function create(properties) { - return new GetDocumentsRequest(properties); + GetDataContractHistoryRequest.create = function create(properties) { + return new GetDataContractHistoryRequest(properties); }; /** - * Encodes the specified GetDocumentsRequest message. Does not implicitly {@link org.dash.platform.dapi.v0.GetDocumentsRequest.verify|verify} messages. + * Encodes the specified GetDataContractHistoryRequest message. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractHistoryRequest.verify|verify} messages. * @function encode - * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest * @static - * @param {org.dash.platform.dapi.v0.IGetDocumentsRequest} message GetDocumentsRequest message or plain object to encode + * @param {org.dash.platform.dapi.v0.IGetDataContractHistoryRequest} message GetDataContractHistoryRequest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetDocumentsRequest.encode = function encode(message, writer) { + GetDataContractHistoryRequest.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) - $root.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + $root.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); return writer; }; /** - * Encodes the specified GetDocumentsRequest message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetDocumentsRequest.verify|verify} messages. + * Encodes the specified GetDataContractHistoryRequest message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractHistoryRequest.verify|verify} messages. * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest * @static - * @param {org.dash.platform.dapi.v0.IGetDocumentsRequest} message GetDocumentsRequest message or plain object to encode + * @param {org.dash.platform.dapi.v0.IGetDataContractHistoryRequest} message GetDataContractHistoryRequest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetDocumentsRequest.encodeDelimited = function encodeDelimited(message, writer) { + GetDataContractHistoryRequest.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a GetDocumentsRequest message from the specified reader or buffer. + * Decodes a GetDataContractHistoryRequest message from the specified reader or buffer. * @function decode - * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetDocumentsRequest} GetDocumentsRequest + * @returns {org.dash.platform.dapi.v0.GetDataContractHistoryRequest} GetDataContractHistoryRequest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetDocumentsRequest.decode = function decode(reader, length) { + GetDataContractHistoryRequest.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetDocumentsRequest(); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetDataContractHistoryRequest(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { case 1: - message.v0 = $root.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.decode(reader, reader.uint32()); + message.v0 = $root.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.decode(reader, reader.uint32()); break; default: reader.skipType(tag & 7); @@ -16290,37 +15040,37 @@ $root.org = (function() { }; /** - * Decodes a GetDocumentsRequest message from the specified reader or buffer, length delimited. + * Decodes a GetDataContractHistoryRequest message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetDocumentsRequest} GetDocumentsRequest + * @returns {org.dash.platform.dapi.v0.GetDataContractHistoryRequest} GetDataContractHistoryRequest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetDocumentsRequest.decodeDelimited = function decodeDelimited(reader) { + GetDataContractHistoryRequest.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a GetDocumentsRequest message. + * Verifies a GetDataContractHistoryRequest message. * @function verify - * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - GetDocumentsRequest.verify = function verify(message) { + GetDataContractHistoryRequest.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; var properties = {}; if (message.v0 != null && message.hasOwnProperty("v0")) { properties.version = 1; { - var error = $root.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.verify(message.v0); + var error = $root.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.verify(message.v0); if (error) return "v0." + error; } @@ -16329,40 +15079,40 @@ $root.org = (function() { }; /** - * Creates a GetDocumentsRequest message from a plain object. Also converts values to their respective internal types. + * Creates a GetDataContractHistoryRequest message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest * @static * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetDocumentsRequest} GetDocumentsRequest + * @returns {org.dash.platform.dapi.v0.GetDataContractHistoryRequest} GetDataContractHistoryRequest */ - GetDocumentsRequest.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetDocumentsRequest) + GetDataContractHistoryRequest.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetDataContractHistoryRequest) return object; - var message = new $root.org.dash.platform.dapi.v0.GetDocumentsRequest(); + var message = new $root.org.dash.platform.dapi.v0.GetDataContractHistoryRequest(); if (object.v0 != null) { if (typeof object.v0 !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetDocumentsRequest.v0: object expected"); - message.v0 = $root.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.fromObject(object.v0); + throw TypeError(".org.dash.platform.dapi.v0.GetDataContractHistoryRequest.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.fromObject(object.v0); } return message; }; /** - * Creates a plain object from a GetDocumentsRequest message. Also converts values to other types if specified. + * Creates a plain object from a GetDataContractHistoryRequest message. Also converts values to other types if specified. * @function toObject - * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest * @static - * @param {org.dash.platform.dapi.v0.GetDocumentsRequest} message GetDocumentsRequest + * @param {org.dash.platform.dapi.v0.GetDataContractHistoryRequest} message GetDataContractHistoryRequest * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - GetDocumentsRequest.toObject = function toObject(message, options) { + GetDataContractHistoryRequest.toObject = function toObject(message, options) { if (!options) options = {}; var object = {}; if (message.v0 != null && message.hasOwnProperty("v0")) { - object.v0 = $root.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.toObject(message.v0, options); + object.v0 = $root.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.toObject(message.v0, options); if (options.oneofs) object.version = "v0"; } @@ -16370,41 +15120,38 @@ $root.org = (function() { }; /** - * Converts this GetDocumentsRequest to JSON. + * Converts this GetDataContractHistoryRequest to JSON. * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest * @instance * @returns {Object.} JSON object */ - GetDocumentsRequest.prototype.toJSON = function toJSON() { + GetDataContractHistoryRequest.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - GetDocumentsRequest.GetDocumentsRequestV0 = (function() { + GetDataContractHistoryRequest.GetDataContractHistoryRequestV0 = (function() { /** - * Properties of a GetDocumentsRequestV0. - * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest - * @interface IGetDocumentsRequestV0 - * @property {Uint8Array|null} [dataContractId] GetDocumentsRequestV0 dataContractId - * @property {string|null} [documentType] GetDocumentsRequestV0 documentType - * @property {Uint8Array|null} [where] GetDocumentsRequestV0 where - * @property {Uint8Array|null} [orderBy] GetDocumentsRequestV0 orderBy - * @property {number|null} [limit] GetDocumentsRequestV0 limit - * @property {Uint8Array|null} [startAfter] GetDocumentsRequestV0 startAfter - * @property {Uint8Array|null} [startAt] GetDocumentsRequestV0 startAt - * @property {boolean|null} [prove] GetDocumentsRequestV0 prove + * Properties of a GetDataContractHistoryRequestV0. + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest + * @interface IGetDataContractHistoryRequestV0 + * @property {Uint8Array|null} [id] GetDataContractHistoryRequestV0 id + * @property {google.protobuf.IUInt32Value|null} [limit] GetDataContractHistoryRequestV0 limit + * @property {google.protobuf.IUInt32Value|null} [offset] GetDataContractHistoryRequestV0 offset + * @property {number|Long|null} [startAtMs] GetDataContractHistoryRequestV0 startAtMs + * @property {boolean|null} [prove] GetDataContractHistoryRequestV0 prove */ /** - * Constructs a new GetDocumentsRequestV0. - * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest - * @classdesc Represents a GetDocumentsRequestV0. - * @implements IGetDocumentsRequestV0 + * Constructs a new GetDataContractHistoryRequestV0. + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest + * @classdesc Represents a GetDataContractHistoryRequestV0. + * @implements IGetDataContractHistoryRequestV0 * @constructor - * @param {org.dash.platform.dapi.v0.GetDocumentsRequest.IGetDocumentsRequestV0=} [properties] Properties to set + * @param {org.dash.platform.dapi.v0.GetDataContractHistoryRequest.IGetDataContractHistoryRequestV0=} [properties] Properties to set */ - function GetDocumentsRequestV0(properties) { + function GetDataContractHistoryRequestV0(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -16412,179 +15159,126 @@ $root.org = (function() { } /** - * GetDocumentsRequestV0 dataContractId. - * @member {Uint8Array} dataContractId - * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0 - * @instance - */ - GetDocumentsRequestV0.prototype.dataContractId = $util.newBuffer([]); - - /** - * GetDocumentsRequestV0 documentType. - * @member {string} documentType - * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0 - * @instance - */ - GetDocumentsRequestV0.prototype.documentType = ""; - - /** - * GetDocumentsRequestV0 where. - * @member {Uint8Array} where - * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0 - * @instance - */ - GetDocumentsRequestV0.prototype.where = $util.newBuffer([]); - - /** - * GetDocumentsRequestV0 orderBy. - * @member {Uint8Array} orderBy - * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0 + * GetDataContractHistoryRequestV0 id. + * @member {Uint8Array} id + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0 * @instance */ - GetDocumentsRequestV0.prototype.orderBy = $util.newBuffer([]); + GetDataContractHistoryRequestV0.prototype.id = $util.newBuffer([]); /** - * GetDocumentsRequestV0 limit. - * @member {number} limit - * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0 + * GetDataContractHistoryRequestV0 limit. + * @member {google.protobuf.IUInt32Value|null|undefined} limit + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0 * @instance */ - GetDocumentsRequestV0.prototype.limit = 0; + GetDataContractHistoryRequestV0.prototype.limit = null; /** - * GetDocumentsRequestV0 startAfter. - * @member {Uint8Array} startAfter - * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0 + * GetDataContractHistoryRequestV0 offset. + * @member {google.protobuf.IUInt32Value|null|undefined} offset + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0 * @instance */ - GetDocumentsRequestV0.prototype.startAfter = $util.newBuffer([]); + GetDataContractHistoryRequestV0.prototype.offset = null; /** - * GetDocumentsRequestV0 startAt. - * @member {Uint8Array} startAt - * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0 + * GetDataContractHistoryRequestV0 startAtMs. + * @member {number|Long} startAtMs + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0 * @instance */ - GetDocumentsRequestV0.prototype.startAt = $util.newBuffer([]); + GetDataContractHistoryRequestV0.prototype.startAtMs = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** - * GetDocumentsRequestV0 prove. + * GetDataContractHistoryRequestV0 prove. * @member {boolean} prove - * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0 - * @instance - */ - GetDocumentsRequestV0.prototype.prove = false; - - // OneOf field names bound to virtual getters and setters - var $oneOfFields; - - /** - * GetDocumentsRequestV0 start. - * @member {"startAfter"|"startAt"|undefined} start - * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0 + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0 * @instance */ - Object.defineProperty(GetDocumentsRequestV0.prototype, "start", { - get: $util.oneOfGetter($oneOfFields = ["startAfter", "startAt"]), - set: $util.oneOfSetter($oneOfFields) - }); + GetDataContractHistoryRequestV0.prototype.prove = false; /** - * Creates a new GetDocumentsRequestV0 instance using the specified properties. + * Creates a new GetDataContractHistoryRequestV0 instance using the specified properties. * @function create - * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0 + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0 * @static - * @param {org.dash.platform.dapi.v0.GetDocumentsRequest.IGetDocumentsRequestV0=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} GetDocumentsRequestV0 instance + * @param {org.dash.platform.dapi.v0.GetDataContractHistoryRequest.IGetDataContractHistoryRequestV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} GetDataContractHistoryRequestV0 instance */ - GetDocumentsRequestV0.create = function create(properties) { - return new GetDocumentsRequestV0(properties); + GetDataContractHistoryRequestV0.create = function create(properties) { + return new GetDataContractHistoryRequestV0(properties); }; /** - * Encodes the specified GetDocumentsRequestV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.verify|verify} messages. + * Encodes the specified GetDataContractHistoryRequestV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.verify|verify} messages. * @function encode - * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0 + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0 * @static - * @param {org.dash.platform.dapi.v0.GetDocumentsRequest.IGetDocumentsRequestV0} message GetDocumentsRequestV0 message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetDataContractHistoryRequest.IGetDataContractHistoryRequestV0} message GetDataContractHistoryRequestV0 message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetDocumentsRequestV0.encode = function encode(message, writer) { + GetDataContractHistoryRequestV0.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.dataContractId != null && Object.hasOwnProperty.call(message, "dataContractId")) - writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.dataContractId); - if (message.documentType != null && Object.hasOwnProperty.call(message, "documentType")) - writer.uint32(/* id 2, wireType 2 =*/18).string(message.documentType); - if (message.where != null && Object.hasOwnProperty.call(message, "where")) - writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.where); - if (message.orderBy != null && Object.hasOwnProperty.call(message, "orderBy")) - writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.orderBy); + if (message.id != null && Object.hasOwnProperty.call(message, "id")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.id); if (message.limit != null && Object.hasOwnProperty.call(message, "limit")) - writer.uint32(/* id 5, wireType 0 =*/40).uint32(message.limit); - if (message.startAfter != null && Object.hasOwnProperty.call(message, "startAfter")) - writer.uint32(/* id 6, wireType 2 =*/50).bytes(message.startAfter); - if (message.startAt != null && Object.hasOwnProperty.call(message, "startAt")) - writer.uint32(/* id 7, wireType 2 =*/58).bytes(message.startAt); + $root.google.protobuf.UInt32Value.encode(message.limit, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.offset != null && Object.hasOwnProperty.call(message, "offset")) + $root.google.protobuf.UInt32Value.encode(message.offset, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + if (message.startAtMs != null && Object.hasOwnProperty.call(message, "startAtMs")) + writer.uint32(/* id 4, wireType 0 =*/32).uint64(message.startAtMs); if (message.prove != null && Object.hasOwnProperty.call(message, "prove")) - writer.uint32(/* id 8, wireType 0 =*/64).bool(message.prove); + writer.uint32(/* id 5, wireType 0 =*/40).bool(message.prove); return writer; }; /** - * Encodes the specified GetDocumentsRequestV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.verify|verify} messages. + * Encodes the specified GetDataContractHistoryRequestV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.verify|verify} messages. * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0 + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0 * @static - * @param {org.dash.platform.dapi.v0.GetDocumentsRequest.IGetDocumentsRequestV0} message GetDocumentsRequestV0 message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetDataContractHistoryRequest.IGetDataContractHistoryRequestV0} message GetDataContractHistoryRequestV0 message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetDocumentsRequestV0.encodeDelimited = function encodeDelimited(message, writer) { + GetDataContractHistoryRequestV0.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a GetDocumentsRequestV0 message from the specified reader or buffer. + * Decodes a GetDataContractHistoryRequestV0 message from the specified reader or buffer. * @function decode - * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0 + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0 * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} GetDocumentsRequestV0 + * @returns {org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} GetDataContractHistoryRequestV0 * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetDocumentsRequestV0.decode = function decode(reader, length) { + GetDataContractHistoryRequestV0.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0(); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { case 1: - message.dataContractId = reader.bytes(); + message.id = reader.bytes(); break; case 2: - message.documentType = reader.string(); + message.limit = $root.google.protobuf.UInt32Value.decode(reader, reader.uint32()); break; case 3: - message.where = reader.bytes(); + message.offset = $root.google.protobuf.UInt32Value.decode(reader, reader.uint32()); break; case 4: - message.orderBy = reader.bytes(); + message.startAtMs = reader.uint64(); break; case 5: - message.limit = reader.uint32(); - break; - case 6: - message.startAfter = reader.bytes(); - break; - case 7: - message.startAt = reader.bytes(); - break; - case 8: message.prove = reader.bool(); break; default: @@ -16596,211 +15290,176 @@ $root.org = (function() { }; /** - * Decodes a GetDocumentsRequestV0 message from the specified reader or buffer, length delimited. + * Decodes a GetDataContractHistoryRequestV0 message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0 + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0 * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} GetDocumentsRequestV0 + * @returns {org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} GetDataContractHistoryRequestV0 * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetDocumentsRequestV0.decodeDelimited = function decodeDelimited(reader) { + GetDataContractHistoryRequestV0.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a GetDocumentsRequestV0 message. + * Verifies a GetDataContractHistoryRequestV0 message. * @function verify - * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0 + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0 * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - GetDocumentsRequestV0.verify = function verify(message) { + GetDataContractHistoryRequestV0.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; - var properties = {}; - if (message.dataContractId != null && message.hasOwnProperty("dataContractId")) - if (!(message.dataContractId && typeof message.dataContractId.length === "number" || $util.isString(message.dataContractId))) - return "dataContractId: buffer expected"; - if (message.documentType != null && message.hasOwnProperty("documentType")) - if (!$util.isString(message.documentType)) - return "documentType: string expected"; - if (message.where != null && message.hasOwnProperty("where")) - if (!(message.where && typeof message.where.length === "number" || $util.isString(message.where))) - return "where: buffer expected"; - if (message.orderBy != null && message.hasOwnProperty("orderBy")) - if (!(message.orderBy && typeof message.orderBy.length === "number" || $util.isString(message.orderBy))) - return "orderBy: buffer expected"; - if (message.limit != null && message.hasOwnProperty("limit")) - if (!$util.isInteger(message.limit)) - return "limit: integer expected"; - if (message.startAfter != null && message.hasOwnProperty("startAfter")) { - properties.start = 1; - if (!(message.startAfter && typeof message.startAfter.length === "number" || $util.isString(message.startAfter))) - return "startAfter: buffer expected"; - } - if (message.startAt != null && message.hasOwnProperty("startAt")) { - if (properties.start === 1) - return "start: multiple values"; - properties.start = 1; - if (!(message.startAt && typeof message.startAt.length === "number" || $util.isString(message.startAt))) - return "startAt: buffer expected"; + if (message.id != null && message.hasOwnProperty("id")) + if (!(message.id && typeof message.id.length === "number" || $util.isString(message.id))) + return "id: buffer expected"; + if (message.limit != null && message.hasOwnProperty("limit")) { + var error = $root.google.protobuf.UInt32Value.verify(message.limit); + if (error) + return "limit." + error; } - if (message.prove != null && message.hasOwnProperty("prove")) - if (typeof message.prove !== "boolean") - return "prove: boolean expected"; - return null; - }; - - /** - * Creates a GetDocumentsRequestV0 message from a plain object. Also converts values to their respective internal types. - * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0 - * @static - * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} GetDocumentsRequestV0 - */ - GetDocumentsRequestV0.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0) - return object; - var message = new $root.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0(); - if (object.dataContractId != null) - if (typeof object.dataContractId === "string") - $util.base64.decode(object.dataContractId, message.dataContractId = $util.newBuffer($util.base64.length(object.dataContractId)), 0); - else if (object.dataContractId.length >= 0) - message.dataContractId = object.dataContractId; - if (object.documentType != null) - message.documentType = String(object.documentType); - if (object.where != null) - if (typeof object.where === "string") - $util.base64.decode(object.where, message.where = $util.newBuffer($util.base64.length(object.where)), 0); - else if (object.where.length >= 0) - message.where = object.where; - if (object.orderBy != null) - if (typeof object.orderBy === "string") - $util.base64.decode(object.orderBy, message.orderBy = $util.newBuffer($util.base64.length(object.orderBy)), 0); - else if (object.orderBy.length >= 0) - message.orderBy = object.orderBy; - if (object.limit != null) - message.limit = object.limit >>> 0; - if (object.startAfter != null) - if (typeof object.startAfter === "string") - $util.base64.decode(object.startAfter, message.startAfter = $util.newBuffer($util.base64.length(object.startAfter)), 0); - else if (object.startAfter.length >= 0) - message.startAfter = object.startAfter; - if (object.startAt != null) - if (typeof object.startAt === "string") - $util.base64.decode(object.startAt, message.startAt = $util.newBuffer($util.base64.length(object.startAt)), 0); - else if (object.startAt.length >= 0) - message.startAt = object.startAt; + if (message.offset != null && message.hasOwnProperty("offset")) { + var error = $root.google.protobuf.UInt32Value.verify(message.offset); + if (error) + return "offset." + error; + } + if (message.startAtMs != null && message.hasOwnProperty("startAtMs")) + if (!$util.isInteger(message.startAtMs) && !(message.startAtMs && $util.isInteger(message.startAtMs.low) && $util.isInteger(message.startAtMs.high))) + return "startAtMs: integer|Long expected"; + if (message.prove != null && message.hasOwnProperty("prove")) + if (typeof message.prove !== "boolean") + return "prove: boolean expected"; + return null; + }; + + /** + * Creates a GetDataContractHistoryRequestV0 message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0 + * @static + * @param {Object.} object Plain object + * @returns {org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} GetDataContractHistoryRequestV0 + */ + GetDataContractHistoryRequestV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0(); + if (object.id != null) + if (typeof object.id === "string") + $util.base64.decode(object.id, message.id = $util.newBuffer($util.base64.length(object.id)), 0); + else if (object.id.length >= 0) + message.id = object.id; + if (object.limit != null) { + if (typeof object.limit !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.limit: object expected"); + message.limit = $root.google.protobuf.UInt32Value.fromObject(object.limit); + } + if (object.offset != null) { + if (typeof object.offset !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.offset: object expected"); + message.offset = $root.google.protobuf.UInt32Value.fromObject(object.offset); + } + if (object.startAtMs != null) + if ($util.Long) + (message.startAtMs = $util.Long.fromValue(object.startAtMs)).unsigned = true; + else if (typeof object.startAtMs === "string") + message.startAtMs = parseInt(object.startAtMs, 10); + else if (typeof object.startAtMs === "number") + message.startAtMs = object.startAtMs; + else if (typeof object.startAtMs === "object") + message.startAtMs = new $util.LongBits(object.startAtMs.low >>> 0, object.startAtMs.high >>> 0).toNumber(true); if (object.prove != null) message.prove = Boolean(object.prove); return message; }; /** - * Creates a plain object from a GetDocumentsRequestV0 message. Also converts values to other types if specified. + * Creates a plain object from a GetDataContractHistoryRequestV0 message. Also converts values to other types if specified. * @function toObject - * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0 + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0 * @static - * @param {org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} message GetDocumentsRequestV0 + * @param {org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} message GetDataContractHistoryRequestV0 * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - GetDocumentsRequestV0.toObject = function toObject(message, options) { + GetDataContractHistoryRequestV0.toObject = function toObject(message, options) { if (!options) options = {}; var object = {}; if (options.defaults) { if (options.bytes === String) - object.dataContractId = ""; - else { - object.dataContractId = []; - if (options.bytes !== Array) - object.dataContractId = $util.newBuffer(object.dataContractId); - } - object.documentType = ""; - if (options.bytes === String) - object.where = ""; - else { - object.where = []; - if (options.bytes !== Array) - object.where = $util.newBuffer(object.where); - } - if (options.bytes === String) - object.orderBy = ""; + object.id = ""; else { - object.orderBy = []; + object.id = []; if (options.bytes !== Array) - object.orderBy = $util.newBuffer(object.orderBy); + object.id = $util.newBuffer(object.id); } - object.limit = 0; + object.limit = null; + object.offset = null; + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.startAtMs = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.startAtMs = options.longs === String ? "0" : 0; object.prove = false; } - if (message.dataContractId != null && message.hasOwnProperty("dataContractId")) - object.dataContractId = options.bytes === String ? $util.base64.encode(message.dataContractId, 0, message.dataContractId.length) : options.bytes === Array ? Array.prototype.slice.call(message.dataContractId) : message.dataContractId; - if (message.documentType != null && message.hasOwnProperty("documentType")) - object.documentType = message.documentType; - if (message.where != null && message.hasOwnProperty("where")) - object.where = options.bytes === String ? $util.base64.encode(message.where, 0, message.where.length) : options.bytes === Array ? Array.prototype.slice.call(message.where) : message.where; - if (message.orderBy != null && message.hasOwnProperty("orderBy")) - object.orderBy = options.bytes === String ? $util.base64.encode(message.orderBy, 0, message.orderBy.length) : options.bytes === Array ? Array.prototype.slice.call(message.orderBy) : message.orderBy; + if (message.id != null && message.hasOwnProperty("id")) + object.id = options.bytes === String ? $util.base64.encode(message.id, 0, message.id.length) : options.bytes === Array ? Array.prototype.slice.call(message.id) : message.id; if (message.limit != null && message.hasOwnProperty("limit")) - object.limit = message.limit; - if (message.startAfter != null && message.hasOwnProperty("startAfter")) { - object.startAfter = options.bytes === String ? $util.base64.encode(message.startAfter, 0, message.startAfter.length) : options.bytes === Array ? Array.prototype.slice.call(message.startAfter) : message.startAfter; - if (options.oneofs) - object.start = "startAfter"; - } - if (message.startAt != null && message.hasOwnProperty("startAt")) { - object.startAt = options.bytes === String ? $util.base64.encode(message.startAt, 0, message.startAt.length) : options.bytes === Array ? Array.prototype.slice.call(message.startAt) : message.startAt; - if (options.oneofs) - object.start = "startAt"; - } + object.limit = $root.google.protobuf.UInt32Value.toObject(message.limit, options); + if (message.offset != null && message.hasOwnProperty("offset")) + object.offset = $root.google.protobuf.UInt32Value.toObject(message.offset, options); + if (message.startAtMs != null && message.hasOwnProperty("startAtMs")) + if (typeof message.startAtMs === "number") + object.startAtMs = options.longs === String ? String(message.startAtMs) : message.startAtMs; + else + object.startAtMs = options.longs === String ? $util.Long.prototype.toString.call(message.startAtMs) : options.longs === Number ? new $util.LongBits(message.startAtMs.low >>> 0, message.startAtMs.high >>> 0).toNumber(true) : message.startAtMs; if (message.prove != null && message.hasOwnProperty("prove")) object.prove = message.prove; return object; }; /** - * Converts this GetDocumentsRequestV0 to JSON. + * Converts this GetDataContractHistoryRequestV0 to JSON. * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0 + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0 * @instance * @returns {Object.} JSON object */ - GetDocumentsRequestV0.prototype.toJSON = function toJSON() { + GetDataContractHistoryRequestV0.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - return GetDocumentsRequestV0; + return GetDataContractHistoryRequestV0; })(); - return GetDocumentsRequest; + return GetDataContractHistoryRequest; })(); - v0.GetDocumentsResponse = (function() { + v0.GetDataContractHistoryResponse = (function() { /** - * Properties of a GetDocumentsResponse. + * Properties of a GetDataContractHistoryResponse. * @memberof org.dash.platform.dapi.v0 - * @interface IGetDocumentsResponse - * @property {org.dash.platform.dapi.v0.GetDocumentsResponse.IGetDocumentsResponseV0|null} [v0] GetDocumentsResponse v0 + * @interface IGetDataContractHistoryResponse + * @property {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.IGetDataContractHistoryResponseV0|null} [v0] GetDataContractHistoryResponse v0 */ /** - * Constructs a new GetDocumentsResponse. + * Constructs a new GetDataContractHistoryResponse. * @memberof org.dash.platform.dapi.v0 - * @classdesc Represents a GetDocumentsResponse. - * @implements IGetDocumentsResponse + * @classdesc Represents a GetDataContractHistoryResponse. + * @implements IGetDataContractHistoryResponse * @constructor - * @param {org.dash.platform.dapi.v0.IGetDocumentsResponse=} [properties] Properties to set + * @param {org.dash.platform.dapi.v0.IGetDataContractHistoryResponse=} [properties] Properties to set */ - function GetDocumentsResponse(properties) { + function GetDataContractHistoryResponse(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -16808,89 +15467,89 @@ $root.org = (function() { } /** - * GetDocumentsResponse v0. - * @member {org.dash.platform.dapi.v0.GetDocumentsResponse.IGetDocumentsResponseV0|null|undefined} v0 - * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse + * GetDataContractHistoryResponse v0. + * @member {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.IGetDataContractHistoryResponseV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse * @instance */ - GetDocumentsResponse.prototype.v0 = null; + GetDataContractHistoryResponse.prototype.v0 = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** - * GetDocumentsResponse version. + * GetDataContractHistoryResponse version. * @member {"v0"|undefined} version - * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse * @instance */ - Object.defineProperty(GetDocumentsResponse.prototype, "version", { + Object.defineProperty(GetDataContractHistoryResponse.prototype, "version", { get: $util.oneOfGetter($oneOfFields = ["v0"]), set: $util.oneOfSetter($oneOfFields) }); /** - * Creates a new GetDocumentsResponse instance using the specified properties. + * Creates a new GetDataContractHistoryResponse instance using the specified properties. * @function create - * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse * @static - * @param {org.dash.platform.dapi.v0.IGetDocumentsResponse=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetDocumentsResponse} GetDocumentsResponse instance + * @param {org.dash.platform.dapi.v0.IGetDataContractHistoryResponse=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetDataContractHistoryResponse} GetDataContractHistoryResponse instance */ - GetDocumentsResponse.create = function create(properties) { - return new GetDocumentsResponse(properties); + GetDataContractHistoryResponse.create = function create(properties) { + return new GetDataContractHistoryResponse(properties); }; /** - * Encodes the specified GetDocumentsResponse message. Does not implicitly {@link org.dash.platform.dapi.v0.GetDocumentsResponse.verify|verify} messages. + * Encodes the specified GetDataContractHistoryResponse message. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractHistoryResponse.verify|verify} messages. * @function encode - * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse * @static - * @param {org.dash.platform.dapi.v0.IGetDocumentsResponse} message GetDocumentsResponse message or plain object to encode + * @param {org.dash.platform.dapi.v0.IGetDataContractHistoryResponse} message GetDataContractHistoryResponse message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetDocumentsResponse.encode = function encode(message, writer) { + GetDataContractHistoryResponse.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) - $root.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); return writer; }; /** - * Encodes the specified GetDocumentsResponse message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetDocumentsResponse.verify|verify} messages. + * Encodes the specified GetDataContractHistoryResponse message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractHistoryResponse.verify|verify} messages. * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse * @static - * @param {org.dash.platform.dapi.v0.IGetDocumentsResponse} message GetDocumentsResponse message or plain object to encode + * @param {org.dash.platform.dapi.v0.IGetDataContractHistoryResponse} message GetDataContractHistoryResponse message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetDocumentsResponse.encodeDelimited = function encodeDelimited(message, writer) { + GetDataContractHistoryResponse.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a GetDocumentsResponse message from the specified reader or buffer. + * Decodes a GetDataContractHistoryResponse message from the specified reader or buffer. * @function decode - * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetDocumentsResponse} GetDocumentsResponse + * @returns {org.dash.platform.dapi.v0.GetDataContractHistoryResponse} GetDataContractHistoryResponse * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetDocumentsResponse.decode = function decode(reader, length) { + GetDataContractHistoryResponse.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetDocumentsResponse(); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { case 1: - message.v0 = $root.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.decode(reader, reader.uint32()); + message.v0 = $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.decode(reader, reader.uint32()); break; default: reader.skipType(tag & 7); @@ -16901,37 +15560,37 @@ $root.org = (function() { }; /** - * Decodes a GetDocumentsResponse message from the specified reader or buffer, length delimited. + * Decodes a GetDataContractHistoryResponse message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetDocumentsResponse} GetDocumentsResponse + * @returns {org.dash.platform.dapi.v0.GetDataContractHistoryResponse} GetDataContractHistoryResponse * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetDocumentsResponse.decodeDelimited = function decodeDelimited(reader) { + GetDataContractHistoryResponse.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a GetDocumentsResponse message. + * Verifies a GetDataContractHistoryResponse message. * @function verify - * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - GetDocumentsResponse.verify = function verify(message) { + GetDataContractHistoryResponse.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; var properties = {}; if (message.v0 != null && message.hasOwnProperty("v0")) { properties.version = 1; { - var error = $root.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.verify(message.v0); + var error = $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.verify(message.v0); if (error) return "v0." + error; } @@ -16940,40 +15599,40 @@ $root.org = (function() { }; /** - * Creates a GetDocumentsResponse message from a plain object. Also converts values to their respective internal types. + * Creates a GetDataContractHistoryResponse message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse * @static * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetDocumentsResponse} GetDocumentsResponse + * @returns {org.dash.platform.dapi.v0.GetDataContractHistoryResponse} GetDataContractHistoryResponse */ - GetDocumentsResponse.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetDocumentsResponse) + GetDataContractHistoryResponse.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse) return object; - var message = new $root.org.dash.platform.dapi.v0.GetDocumentsResponse(); + var message = new $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse(); if (object.v0 != null) { if (typeof object.v0 !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetDocumentsResponse.v0: object expected"); - message.v0 = $root.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.fromObject(object.v0); + throw TypeError(".org.dash.platform.dapi.v0.GetDataContractHistoryResponse.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.fromObject(object.v0); } return message; }; /** - * Creates a plain object from a GetDocumentsResponse message. Also converts values to other types if specified. + * Creates a plain object from a GetDataContractHistoryResponse message. Also converts values to other types if specified. * @function toObject - * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse * @static - * @param {org.dash.platform.dapi.v0.GetDocumentsResponse} message GetDocumentsResponse + * @param {org.dash.platform.dapi.v0.GetDataContractHistoryResponse} message GetDataContractHistoryResponse * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - GetDocumentsResponse.toObject = function toObject(message, options) { + GetDataContractHistoryResponse.toObject = function toObject(message, options) { if (!options) options = {}; var object = {}; if (message.v0 != null && message.hasOwnProperty("v0")) { - object.v0 = $root.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.toObject(message.v0, options); + object.v0 = $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.toObject(message.v0, options); if (options.oneofs) object.version = "v0"; } @@ -16981,36 +15640,36 @@ $root.org = (function() { }; /** - * Converts this GetDocumentsResponse to JSON. + * Converts this GetDataContractHistoryResponse to JSON. * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse * @instance * @returns {Object.} JSON object */ - GetDocumentsResponse.prototype.toJSON = function toJSON() { + GetDataContractHistoryResponse.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - GetDocumentsResponse.GetDocumentsResponseV0 = (function() { + GetDataContractHistoryResponse.GetDataContractHistoryResponseV0 = (function() { - /** - * Properties of a GetDocumentsResponseV0. - * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse - * @interface IGetDocumentsResponseV0 - * @property {org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.IDocuments|null} [documents] GetDocumentsResponseV0 documents - * @property {org.dash.platform.dapi.v0.IProof|null} [proof] GetDocumentsResponseV0 proof - * @property {org.dash.platform.dapi.v0.IResponseMetadata|null} [metadata] GetDocumentsResponseV0 metadata + /** + * Properties of a GetDataContractHistoryResponseV0. + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse + * @interface IGetDataContractHistoryResponseV0 + * @property {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.IDataContractHistory|null} [dataContractHistory] GetDataContractHistoryResponseV0 dataContractHistory + * @property {org.dash.platform.dapi.v0.IProof|null} [proof] GetDataContractHistoryResponseV0 proof + * @property {org.dash.platform.dapi.v0.IResponseMetadata|null} [metadata] GetDataContractHistoryResponseV0 metadata */ /** - * Constructs a new GetDocumentsResponseV0. - * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse - * @classdesc Represents a GetDocumentsResponseV0. - * @implements IGetDocumentsResponseV0 + * Constructs a new GetDataContractHistoryResponseV0. + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse + * @classdesc Represents a GetDataContractHistoryResponseV0. + * @implements IGetDataContractHistoryResponseV0 * @constructor - * @param {org.dash.platform.dapi.v0.GetDocumentsResponse.IGetDocumentsResponseV0=} [properties] Properties to set + * @param {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.IGetDataContractHistoryResponseV0=} [properties] Properties to set */ - function GetDocumentsResponseV0(properties) { + function GetDataContractHistoryResponseV0(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -17018,69 +15677,69 @@ $root.org = (function() { } /** - * GetDocumentsResponseV0 documents. - * @member {org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.IDocuments|null|undefined} documents - * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0 + * GetDataContractHistoryResponseV0 dataContractHistory. + * @member {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.IDataContractHistory|null|undefined} dataContractHistory + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0 * @instance */ - GetDocumentsResponseV0.prototype.documents = null; + GetDataContractHistoryResponseV0.prototype.dataContractHistory = null; /** - * GetDocumentsResponseV0 proof. + * GetDataContractHistoryResponseV0 proof. * @member {org.dash.platform.dapi.v0.IProof|null|undefined} proof - * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0 + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0 * @instance */ - GetDocumentsResponseV0.prototype.proof = null; + GetDataContractHistoryResponseV0.prototype.proof = null; /** - * GetDocumentsResponseV0 metadata. + * GetDataContractHistoryResponseV0 metadata. * @member {org.dash.platform.dapi.v0.IResponseMetadata|null|undefined} metadata - * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0 + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0 * @instance */ - GetDocumentsResponseV0.prototype.metadata = null; + GetDataContractHistoryResponseV0.prototype.metadata = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** - * GetDocumentsResponseV0 result. - * @member {"documents"|"proof"|undefined} result - * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0 + * GetDataContractHistoryResponseV0 result. + * @member {"dataContractHistory"|"proof"|undefined} result + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0 * @instance */ - Object.defineProperty(GetDocumentsResponseV0.prototype, "result", { - get: $util.oneOfGetter($oneOfFields = ["documents", "proof"]), + Object.defineProperty(GetDataContractHistoryResponseV0.prototype, "result", { + get: $util.oneOfGetter($oneOfFields = ["dataContractHistory", "proof"]), set: $util.oneOfSetter($oneOfFields) }); /** - * Creates a new GetDocumentsResponseV0 instance using the specified properties. + * Creates a new GetDataContractHistoryResponseV0 instance using the specified properties. * @function create - * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0 + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0 * @static - * @param {org.dash.platform.dapi.v0.GetDocumentsResponse.IGetDocumentsResponseV0=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} GetDocumentsResponseV0 instance + * @param {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.IGetDataContractHistoryResponseV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} GetDataContractHistoryResponseV0 instance */ - GetDocumentsResponseV0.create = function create(properties) { - return new GetDocumentsResponseV0(properties); + GetDataContractHistoryResponseV0.create = function create(properties) { + return new GetDataContractHistoryResponseV0(properties); }; /** - * Encodes the specified GetDocumentsResponseV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.verify|verify} messages. + * Encodes the specified GetDataContractHistoryResponseV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.verify|verify} messages. * @function encode - * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0 + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0 * @static - * @param {org.dash.platform.dapi.v0.GetDocumentsResponse.IGetDocumentsResponseV0} message GetDocumentsResponseV0 message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.IGetDataContractHistoryResponseV0} message GetDataContractHistoryResponseV0 message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetDocumentsResponseV0.encode = function encode(message, writer) { + GetDataContractHistoryResponseV0.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.documents != null && Object.hasOwnProperty.call(message, "documents")) - $root.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.encode(message.documents, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.dataContractHistory != null && Object.hasOwnProperty.call(message, "dataContractHistory")) + $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.encode(message.dataContractHistory, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); if (message.proof != null && Object.hasOwnProperty.call(message, "proof")) $root.org.dash.platform.dapi.v0.Proof.encode(message.proof, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); if (message.metadata != null && Object.hasOwnProperty.call(message, "metadata")) @@ -17089,38 +15748,38 @@ $root.org = (function() { }; /** - * Encodes the specified GetDocumentsResponseV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.verify|verify} messages. + * Encodes the specified GetDataContractHistoryResponseV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.verify|verify} messages. * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0 + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0 * @static - * @param {org.dash.platform.dapi.v0.GetDocumentsResponse.IGetDocumentsResponseV0} message GetDocumentsResponseV0 message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.IGetDataContractHistoryResponseV0} message GetDataContractHistoryResponseV0 message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetDocumentsResponseV0.encodeDelimited = function encodeDelimited(message, writer) { + GetDataContractHistoryResponseV0.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a GetDocumentsResponseV0 message from the specified reader or buffer. + * Decodes a GetDataContractHistoryResponseV0 message from the specified reader or buffer. * @function decode - * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0 + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0 * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} GetDocumentsResponseV0 + * @returns {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} GetDataContractHistoryResponseV0 * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetDocumentsResponseV0.decode = function decode(reader, length) { + GetDataContractHistoryResponseV0.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0(); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { case 1: - message.documents = $root.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.decode(reader, reader.uint32()); + message.dataContractHistory = $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.decode(reader, reader.uint32()); break; case 2: message.proof = $root.org.dash.platform.dapi.v0.Proof.decode(reader, reader.uint32()); @@ -17137,39 +15796,39 @@ $root.org = (function() { }; /** - * Decodes a GetDocumentsResponseV0 message from the specified reader or buffer, length delimited. + * Decodes a GetDataContractHistoryResponseV0 message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0 + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0 * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} GetDocumentsResponseV0 + * @returns {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} GetDataContractHistoryResponseV0 * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetDocumentsResponseV0.decodeDelimited = function decodeDelimited(reader) { + GetDataContractHistoryResponseV0.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a GetDocumentsResponseV0 message. + * Verifies a GetDataContractHistoryResponseV0 message. * @function verify - * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0 + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0 * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - GetDocumentsResponseV0.verify = function verify(message) { + GetDataContractHistoryResponseV0.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; var properties = {}; - if (message.documents != null && message.hasOwnProperty("documents")) { + if (message.dataContractHistory != null && message.hasOwnProperty("dataContractHistory")) { properties.result = 1; { - var error = $root.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.verify(message.documents); + var error = $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.verify(message.dataContractHistory); if (error) - return "documents." + error; + return "dataContractHistory." + error; } } if (message.proof != null && message.hasOwnProperty("proof")) { @@ -17191,54 +15850,54 @@ $root.org = (function() { }; /** - * Creates a GetDocumentsResponseV0 message from a plain object. Also converts values to their respective internal types. + * Creates a GetDataContractHistoryResponseV0 message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0 + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0 * @static * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} GetDocumentsResponseV0 + * @returns {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} GetDataContractHistoryResponseV0 */ - GetDocumentsResponseV0.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0) + GetDataContractHistoryResponseV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0) return object; - var message = new $root.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0(); - if (object.documents != null) { - if (typeof object.documents !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.documents: object expected"); - message.documents = $root.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.fromObject(object.documents); + var message = new $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0(); + if (object.dataContractHistory != null) { + if (typeof object.dataContractHistory !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.dataContractHistory: object expected"); + message.dataContractHistory = $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.fromObject(object.dataContractHistory); } if (object.proof != null) { if (typeof object.proof !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.proof: object expected"); + throw TypeError(".org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.proof: object expected"); message.proof = $root.org.dash.platform.dapi.v0.Proof.fromObject(object.proof); } if (object.metadata != null) { if (typeof object.metadata !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.metadata: object expected"); + throw TypeError(".org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.metadata: object expected"); message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.fromObject(object.metadata); } return message; }; /** - * Creates a plain object from a GetDocumentsResponseV0 message. Also converts values to other types if specified. + * Creates a plain object from a GetDataContractHistoryResponseV0 message. Also converts values to other types if specified. * @function toObject - * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0 + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0 * @static - * @param {org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} message GetDocumentsResponseV0 + * @param {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} message GetDataContractHistoryResponseV0 * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - GetDocumentsResponseV0.toObject = function toObject(message, options) { + GetDataContractHistoryResponseV0.toObject = function toObject(message, options) { if (!options) options = {}; var object = {}; if (options.defaults) object.metadata = null; - if (message.documents != null && message.hasOwnProperty("documents")) { - object.documents = $root.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.toObject(message.documents, options); + if (message.dataContractHistory != null && message.hasOwnProperty("dataContractHistory")) { + object.dataContractHistory = $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.toObject(message.dataContractHistory, options); if (options.oneofs) - object.result = "documents"; + object.result = "dataContractHistory"; } if (message.proof != null && message.hasOwnProperty("proof")) { object.proof = $root.org.dash.platform.dapi.v0.Proof.toObject(message.proof, options); @@ -17251,35 +15910,35 @@ $root.org = (function() { }; /** - * Converts this GetDocumentsResponseV0 to JSON. + * Converts this GetDataContractHistoryResponseV0 to JSON. * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0 + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0 * @instance * @returns {Object.} JSON object */ - GetDocumentsResponseV0.prototype.toJSON = function toJSON() { + GetDataContractHistoryResponseV0.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - GetDocumentsResponseV0.Documents = (function() { + GetDataContractHistoryResponseV0.DataContractHistoryEntry = (function() { /** - * Properties of a Documents. - * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0 - * @interface IDocuments - * @property {Array.|null} [documents] Documents documents + * Properties of a DataContractHistoryEntry. + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0 + * @interface IDataContractHistoryEntry + * @property {number|Long|null} [date] DataContractHistoryEntry date + * @property {Uint8Array|null} [value] DataContractHistoryEntry value */ /** - * Constructs a new Documents. - * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0 - * @classdesc Represents a Documents. - * @implements IDocuments + * Constructs a new DataContractHistoryEntry. + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0 + * @classdesc Represents a DataContractHistoryEntry. + * @implements IDataContractHistoryEntry * @constructor - * @param {org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.IDocuments=} [properties] Properties to set + * @param {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.IDataContractHistoryEntry=} [properties] Properties to set */ - function Documents(properties) { - this.documents = []; + function DataContractHistoryEntry(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -17287,78 +15946,88 @@ $root.org = (function() { } /** - * Documents documents. - * @member {Array.} documents - * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents + * DataContractHistoryEntry date. + * @member {number|Long} date + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry * @instance */ - Documents.prototype.documents = $util.emptyArray; + DataContractHistoryEntry.prototype.date = $util.Long ? $util.Long.fromBits(0,0,true) : 0; /** - * Creates a new Documents instance using the specified properties. + * DataContractHistoryEntry value. + * @member {Uint8Array} value + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry + * @instance + */ + DataContractHistoryEntry.prototype.value = $util.newBuffer([]); + + /** + * Creates a new DataContractHistoryEntry instance using the specified properties. * @function create - * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry * @static - * @param {org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.IDocuments=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} Documents instance + * @param {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.IDataContractHistoryEntry=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry} DataContractHistoryEntry instance */ - Documents.create = function create(properties) { - return new Documents(properties); + DataContractHistoryEntry.create = function create(properties) { + return new DataContractHistoryEntry(properties); }; /** - * Encodes the specified Documents message. Does not implicitly {@link org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.verify|verify} messages. + * Encodes the specified DataContractHistoryEntry message. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.verify|verify} messages. * @function encode - * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry * @static - * @param {org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.IDocuments} message Documents message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.IDataContractHistoryEntry} message DataContractHistoryEntry message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - Documents.encode = function encode(message, writer) { + DataContractHistoryEntry.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.documents != null && message.documents.length) - for (var i = 0; i < message.documents.length; ++i) - writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.documents[i]); + if (message.date != null && Object.hasOwnProperty.call(message, "date")) + writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.date); + if (message.value != null && Object.hasOwnProperty.call(message, "value")) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.value); return writer; }; /** - * Encodes the specified Documents message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.verify|verify} messages. + * Encodes the specified DataContractHistoryEntry message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.verify|verify} messages. * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry * @static - * @param {org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.IDocuments} message Documents message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.IDataContractHistoryEntry} message DataContractHistoryEntry message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - Documents.encodeDelimited = function encodeDelimited(message, writer) { + DataContractHistoryEntry.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a Documents message from the specified reader or buffer. + * Decodes a DataContractHistoryEntry message from the specified reader or buffer. * @function decode - * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} Documents + * @returns {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry} DataContractHistoryEntry * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - Documents.decode = function decode(reader, length) { + DataContractHistoryEntry.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents(); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { case 1: - if (!(message.documents && message.documents.length)) - message.documents = []; - message.documents.push(reader.bytes()); + message.date = reader.uint64(); + break; + case 2: + message.value = reader.bytes(); break; default: reader.skipType(tag & 7); @@ -17369,568 +16038,353 @@ $root.org = (function() { }; /** - * Decodes a Documents message from the specified reader or buffer, length delimited. + * Decodes a DataContractHistoryEntry message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} Documents + * @returns {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry} DataContractHistoryEntry * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - Documents.decodeDelimited = function decodeDelimited(reader) { + DataContractHistoryEntry.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a Documents message. + * Verifies a DataContractHistoryEntry message. * @function verify - * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - Documents.verify = function verify(message) { + DataContractHistoryEntry.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; - if (message.documents != null && message.hasOwnProperty("documents")) { - if (!Array.isArray(message.documents)) - return "documents: array expected"; - for (var i = 0; i < message.documents.length; ++i) - if (!(message.documents[i] && typeof message.documents[i].length === "number" || $util.isString(message.documents[i]))) - return "documents: buffer[] expected"; - } + if (message.date != null && message.hasOwnProperty("date")) + if (!$util.isInteger(message.date) && !(message.date && $util.isInteger(message.date.low) && $util.isInteger(message.date.high))) + return "date: integer|Long expected"; + if (message.value != null && message.hasOwnProperty("value")) + if (!(message.value && typeof message.value.length === "number" || $util.isString(message.value))) + return "value: buffer expected"; return null; }; /** - * Creates a Documents message from a plain object. Also converts values to their respective internal types. + * Creates a DataContractHistoryEntry message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry * @static * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} Documents + * @returns {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry} DataContractHistoryEntry */ - Documents.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents) + DataContractHistoryEntry.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry) return object; - var message = new $root.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents(); - if (object.documents) { - if (!Array.isArray(object.documents)) - throw TypeError(".org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.documents: array expected"); - message.documents = []; - for (var i = 0; i < object.documents.length; ++i) - if (typeof object.documents[i] === "string") - $util.base64.decode(object.documents[i], message.documents[i] = $util.newBuffer($util.base64.length(object.documents[i])), 0); - else if (object.documents[i].length >= 0) - message.documents[i] = object.documents[i]; - } + var message = new $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry(); + if (object.date != null) + if ($util.Long) + (message.date = $util.Long.fromValue(object.date)).unsigned = true; + else if (typeof object.date === "string") + message.date = parseInt(object.date, 10); + else if (typeof object.date === "number") + message.date = object.date; + else if (typeof object.date === "object") + message.date = new $util.LongBits(object.date.low >>> 0, object.date.high >>> 0).toNumber(true); + if (object.value != null) + if (typeof object.value === "string") + $util.base64.decode(object.value, message.value = $util.newBuffer($util.base64.length(object.value)), 0); + else if (object.value.length >= 0) + message.value = object.value; return message; }; /** - * Creates a plain object from a Documents message. Also converts values to other types if specified. + * Creates a plain object from a DataContractHistoryEntry message. Also converts values to other types if specified. * @function toObject - * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry * @static - * @param {org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} message Documents + * @param {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry} message DataContractHistoryEntry * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - Documents.toObject = function toObject(message, options) { + DataContractHistoryEntry.toObject = function toObject(message, options) { if (!options) options = {}; var object = {}; - if (options.arrays || options.defaults) - object.documents = []; - if (message.documents && message.documents.length) { - object.documents = []; - for (var j = 0; j < message.documents.length; ++j) - object.documents[j] = options.bytes === String ? $util.base64.encode(message.documents[j], 0, message.documents[j].length) : options.bytes === Array ? Array.prototype.slice.call(message.documents[j]) : message.documents[j]; + if (options.defaults) { + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.date = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.date = options.longs === String ? "0" : 0; + if (options.bytes === String) + object.value = ""; + else { + object.value = []; + if (options.bytes !== Array) + object.value = $util.newBuffer(object.value); + } } + if (message.date != null && message.hasOwnProperty("date")) + if (typeof message.date === "number") + object.date = options.longs === String ? String(message.date) : message.date; + else + object.date = options.longs === String ? $util.Long.prototype.toString.call(message.date) : options.longs === Number ? new $util.LongBits(message.date.low >>> 0, message.date.high >>> 0).toNumber(true) : message.date; + if (message.value != null && message.hasOwnProperty("value")) + object.value = options.bytes === String ? $util.base64.encode(message.value, 0, message.value.length) : options.bytes === Array ? Array.prototype.slice.call(message.value) : message.value; return object; }; /** - * Converts this Documents to JSON. + * Converts this DataContractHistoryEntry to JSON. * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents - * @instance - * @returns {Object.} JSON object - */ - Documents.prototype.toJSON = function toJSON() { - return this.constructor.toObject(this, $protobuf.util.toJSONOptions); - }; - - return Documents; - })(); - - return GetDocumentsResponseV0; - })(); - - return GetDocumentsResponse; - })(); - - v0.GetIdentitiesByPublicKeyHashesRequest = (function() { - - /** - * Properties of a GetIdentitiesByPublicKeyHashesRequest. - * @memberof org.dash.platform.dapi.v0 - * @interface IGetIdentitiesByPublicKeyHashesRequest - * @property {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.IGetIdentitiesByPublicKeyHashesRequestV0|null} [v0] GetIdentitiesByPublicKeyHashesRequest v0 - */ - - /** - * Constructs a new GetIdentitiesByPublicKeyHashesRequest. - * @memberof org.dash.platform.dapi.v0 - * @classdesc Represents a GetIdentitiesByPublicKeyHashesRequest. - * @implements IGetIdentitiesByPublicKeyHashesRequest - * @constructor - * @param {org.dash.platform.dapi.v0.IGetIdentitiesByPublicKeyHashesRequest=} [properties] Properties to set - */ - function GetIdentitiesByPublicKeyHashesRequest(properties) { - if (properties) - for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) - if (properties[keys[i]] != null) - this[keys[i]] = properties[keys[i]]; - } - - /** - * GetIdentitiesByPublicKeyHashesRequest v0. - * @member {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.IGetIdentitiesByPublicKeyHashesRequestV0|null|undefined} v0 - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest - * @instance - */ - GetIdentitiesByPublicKeyHashesRequest.prototype.v0 = null; - - // OneOf field names bound to virtual getters and setters - var $oneOfFields; - - /** - * GetIdentitiesByPublicKeyHashesRequest version. - * @member {"v0"|undefined} version - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest - * @instance - */ - Object.defineProperty(GetIdentitiesByPublicKeyHashesRequest.prototype, "version", { - get: $util.oneOfGetter($oneOfFields = ["v0"]), - set: $util.oneOfSetter($oneOfFields) - }); - - /** - * Creates a new GetIdentitiesByPublicKeyHashesRequest instance using the specified properties. - * @function create - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest - * @static - * @param {org.dash.platform.dapi.v0.IGetIdentitiesByPublicKeyHashesRequest=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest} GetIdentitiesByPublicKeyHashesRequest instance - */ - GetIdentitiesByPublicKeyHashesRequest.create = function create(properties) { - return new GetIdentitiesByPublicKeyHashesRequest(properties); - }; - - /** - * Encodes the specified GetIdentitiesByPublicKeyHashesRequest message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.verify|verify} messages. - * @function encode - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest - * @static - * @param {org.dash.platform.dapi.v0.IGetIdentitiesByPublicKeyHashesRequest} message GetIdentitiesByPublicKeyHashesRequest message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - GetIdentitiesByPublicKeyHashesRequest.encode = function encode(message, writer) { - if (!writer) - writer = $Writer.create(); - if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) - $root.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); - return writer; - }; - - /** - * Encodes the specified GetIdentitiesByPublicKeyHashesRequest message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.verify|verify} messages. - * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest - * @static - * @param {org.dash.platform.dapi.v0.IGetIdentitiesByPublicKeyHashesRequest} message GetIdentitiesByPublicKeyHashesRequest message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - GetIdentitiesByPublicKeyHashesRequest.encodeDelimited = function encodeDelimited(message, writer) { - return this.encode(message, writer).ldelim(); - }; - - /** - * Decodes a GetIdentitiesByPublicKeyHashesRequest message from the specified reader or buffer. - * @function decode - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest} GetIdentitiesByPublicKeyHashesRequest - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - GetIdentitiesByPublicKeyHashesRequest.decode = function decode(reader, length) { - if (!(reader instanceof $Reader)) - reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest(); - while (reader.pos < end) { - var tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - message.v0 = $root.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.decode(reader, reader.uint32()); - break; - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }; - - /** - * Decodes a GetIdentitiesByPublicKeyHashesRequest message from the specified reader or buffer, length delimited. - * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest} GetIdentitiesByPublicKeyHashesRequest - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - GetIdentitiesByPublicKeyHashesRequest.decodeDelimited = function decodeDelimited(reader) { - if (!(reader instanceof $Reader)) - reader = new $Reader(reader); - return this.decode(reader, reader.uint32()); - }; - - /** - * Verifies a GetIdentitiesByPublicKeyHashesRequest message. - * @function verify - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest - * @static - * @param {Object.} message Plain object to verify - * @returns {string|null} `null` if valid, otherwise the reason why it is not - */ - GetIdentitiesByPublicKeyHashesRequest.verify = function verify(message) { - if (typeof message !== "object" || message === null) - return "object expected"; - var properties = {}; - if (message.v0 != null && message.hasOwnProperty("v0")) { - properties.version = 1; - { - var error = $root.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.verify(message.v0); - if (error) - return "v0." + error; - } - } - return null; - }; - - /** - * Creates a GetIdentitiesByPublicKeyHashesRequest message from a plain object. Also converts values to their respective internal types. - * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest - * @static - * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest} GetIdentitiesByPublicKeyHashesRequest - */ - GetIdentitiesByPublicKeyHashesRequest.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest) - return object; - var message = new $root.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest(); - if (object.v0 != null) { - if (typeof object.v0 !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.v0: object expected"); - message.v0 = $root.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.fromObject(object.v0); - } - return message; - }; - - /** - * Creates a plain object from a GetIdentitiesByPublicKeyHashesRequest message. Also converts values to other types if specified. - * @function toObject - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest - * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest} message GetIdentitiesByPublicKeyHashesRequest - * @param {$protobuf.IConversionOptions} [options] Conversion options - * @returns {Object.} Plain object - */ - GetIdentitiesByPublicKeyHashesRequest.toObject = function toObject(message, options) { - if (!options) - options = {}; - var object = {}; - if (message.v0 != null && message.hasOwnProperty("v0")) { - object.v0 = $root.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.toObject(message.v0, options); - if (options.oneofs) - object.version = "v0"; - } - return object; - }; - - /** - * Converts this GetIdentitiesByPublicKeyHashesRequest to JSON. - * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest - * @instance - * @returns {Object.} JSON object - */ - GetIdentitiesByPublicKeyHashesRequest.prototype.toJSON = function toJSON() { - return this.constructor.toObject(this, $protobuf.util.toJSONOptions); - }; + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry + * @instance + * @returns {Object.} JSON object + */ + DataContractHistoryEntry.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; - GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0 = (function() { + return DataContractHistoryEntry; + })(); - /** - * Properties of a GetIdentitiesByPublicKeyHashesRequestV0. - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest - * @interface IGetIdentitiesByPublicKeyHashesRequestV0 - * @property {Array.|null} [publicKeyHashes] GetIdentitiesByPublicKeyHashesRequestV0 publicKeyHashes - * @property {boolean|null} [prove] GetIdentitiesByPublicKeyHashesRequestV0 prove - */ + GetDataContractHistoryResponseV0.DataContractHistory = (function() { - /** - * Constructs a new GetIdentitiesByPublicKeyHashesRequestV0. - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest - * @classdesc Represents a GetIdentitiesByPublicKeyHashesRequestV0. - * @implements IGetIdentitiesByPublicKeyHashesRequestV0 - * @constructor - * @param {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.IGetIdentitiesByPublicKeyHashesRequestV0=} [properties] Properties to set - */ - function GetIdentitiesByPublicKeyHashesRequestV0(properties) { - this.publicKeyHashes = []; - if (properties) - for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) - if (properties[keys[i]] != null) - this[keys[i]] = properties[keys[i]]; - } + /** + * Properties of a DataContractHistory. + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0 + * @interface IDataContractHistory + * @property {Array.|null} [dataContractEntries] DataContractHistory dataContractEntries + */ - /** - * GetIdentitiesByPublicKeyHashesRequestV0 publicKeyHashes. - * @member {Array.} publicKeyHashes - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0 - * @instance - */ - GetIdentitiesByPublicKeyHashesRequestV0.prototype.publicKeyHashes = $util.emptyArray; + /** + * Constructs a new DataContractHistory. + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0 + * @classdesc Represents a DataContractHistory. + * @implements IDataContractHistory + * @constructor + * @param {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.IDataContractHistory=} [properties] Properties to set + */ + function DataContractHistory(properties) { + this.dataContractEntries = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } - /** - * GetIdentitiesByPublicKeyHashesRequestV0 prove. - * @member {boolean} prove - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0 - * @instance - */ - GetIdentitiesByPublicKeyHashesRequestV0.prototype.prove = false; + /** + * DataContractHistory dataContractEntries. + * @member {Array.} dataContractEntries + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory + * @instance + */ + DataContractHistory.prototype.dataContractEntries = $util.emptyArray; - /** - * Creates a new GetIdentitiesByPublicKeyHashesRequestV0 instance using the specified properties. - * @function create - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0 - * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.IGetIdentitiesByPublicKeyHashesRequestV0=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0} GetIdentitiesByPublicKeyHashesRequestV0 instance - */ - GetIdentitiesByPublicKeyHashesRequestV0.create = function create(properties) { - return new GetIdentitiesByPublicKeyHashesRequestV0(properties); - }; + /** + * Creates a new DataContractHistory instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory + * @static + * @param {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.IDataContractHistory=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory} DataContractHistory instance + */ + DataContractHistory.create = function create(properties) { + return new DataContractHistory(properties); + }; - /** - * Encodes the specified GetIdentitiesByPublicKeyHashesRequestV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.verify|verify} messages. - * @function encode - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0 - * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.IGetIdentitiesByPublicKeyHashesRequestV0} message GetIdentitiesByPublicKeyHashesRequestV0 message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - GetIdentitiesByPublicKeyHashesRequestV0.encode = function encode(message, writer) { - if (!writer) - writer = $Writer.create(); - if (message.publicKeyHashes != null && message.publicKeyHashes.length) - for (var i = 0; i < message.publicKeyHashes.length; ++i) - writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.publicKeyHashes[i]); - if (message.prove != null && Object.hasOwnProperty.call(message, "prove")) - writer.uint32(/* id 2, wireType 0 =*/16).bool(message.prove); - return writer; - }; + /** + * Encodes the specified DataContractHistory message. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory + * @static + * @param {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.IDataContractHistory} message DataContractHistory message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + DataContractHistory.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.dataContractEntries != null && message.dataContractEntries.length) + for (var i = 0; i < message.dataContractEntries.length; ++i) + $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.encode(message.dataContractEntries[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; - /** - * Encodes the specified GetIdentitiesByPublicKeyHashesRequestV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.verify|verify} messages. - * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0 - * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.IGetIdentitiesByPublicKeyHashesRequestV0} message GetIdentitiesByPublicKeyHashesRequestV0 message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - GetIdentitiesByPublicKeyHashesRequestV0.encodeDelimited = function encodeDelimited(message, writer) { - return this.encode(message, writer).ldelim(); - }; + /** + * Encodes the specified DataContractHistory message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory + * @static + * @param {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.IDataContractHistory} message DataContractHistory message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + DataContractHistory.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; - /** - * Decodes a GetIdentitiesByPublicKeyHashesRequestV0 message from the specified reader or buffer. - * @function decode - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0 - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0} GetIdentitiesByPublicKeyHashesRequestV0 - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - GetIdentitiesByPublicKeyHashesRequestV0.decode = function decode(reader, length) { - if (!(reader instanceof $Reader)) - reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0(); - while (reader.pos < end) { - var tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (!(message.publicKeyHashes && message.publicKeyHashes.length)) - message.publicKeyHashes = []; - message.publicKeyHashes.push(reader.bytes()); - break; - case 2: - message.prove = reader.bool(); - break; - default: - reader.skipType(tag & 7); - break; + /** + * Decodes a DataContractHistory message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory} DataContractHistory + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + DataContractHistory.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (!(message.dataContractEntries && message.dataContractEntries.length)) + message.dataContractEntries = []; + message.dataContractEntries.push($root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.decode(reader, reader.uint32())); + break; + default: + reader.skipType(tag & 7); + break; + } } - } - return message; - }; + return message; + }; - /** - * Decodes a GetIdentitiesByPublicKeyHashesRequestV0 message from the specified reader or buffer, length delimited. - * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0 - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0} GetIdentitiesByPublicKeyHashesRequestV0 - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - GetIdentitiesByPublicKeyHashesRequestV0.decodeDelimited = function decodeDelimited(reader) { - if (!(reader instanceof $Reader)) - reader = new $Reader(reader); - return this.decode(reader, reader.uint32()); - }; + /** + * Decodes a DataContractHistory message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory} DataContractHistory + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + DataContractHistory.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; - /** - * Verifies a GetIdentitiesByPublicKeyHashesRequestV0 message. - * @function verify - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0 - * @static - * @param {Object.} message Plain object to verify - * @returns {string|null} `null` if valid, otherwise the reason why it is not - */ - GetIdentitiesByPublicKeyHashesRequestV0.verify = function verify(message) { - if (typeof message !== "object" || message === null) - return "object expected"; - if (message.publicKeyHashes != null && message.hasOwnProperty("publicKeyHashes")) { - if (!Array.isArray(message.publicKeyHashes)) - return "publicKeyHashes: array expected"; - for (var i = 0; i < message.publicKeyHashes.length; ++i) - if (!(message.publicKeyHashes[i] && typeof message.publicKeyHashes[i].length === "number" || $util.isString(message.publicKeyHashes[i]))) - return "publicKeyHashes: buffer[] expected"; - } - if (message.prove != null && message.hasOwnProperty("prove")) - if (typeof message.prove !== "boolean") - return "prove: boolean expected"; - return null; - }; + /** + * Verifies a DataContractHistory message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + DataContractHistory.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.dataContractEntries != null && message.hasOwnProperty("dataContractEntries")) { + if (!Array.isArray(message.dataContractEntries)) + return "dataContractEntries: array expected"; + for (var i = 0; i < message.dataContractEntries.length; ++i) { + var error = $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.verify(message.dataContractEntries[i]); + if (error) + return "dataContractEntries." + error; + } + } + return null; + }; + + /** + * Creates a DataContractHistory message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory + * @static + * @param {Object.} object Plain object + * @returns {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory} DataContractHistory + */ + DataContractHistory.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory(); + if (object.dataContractEntries) { + if (!Array.isArray(object.dataContractEntries)) + throw TypeError(".org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.dataContractEntries: array expected"); + message.dataContractEntries = []; + for (var i = 0; i < object.dataContractEntries.length; ++i) { + if (typeof object.dataContractEntries[i] !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.dataContractEntries: object expected"); + message.dataContractEntries[i] = $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.fromObject(object.dataContractEntries[i]); + } + } + return message; + }; - /** - * Creates a GetIdentitiesByPublicKeyHashesRequestV0 message from a plain object. Also converts values to their respective internal types. - * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0 - * @static - * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0} GetIdentitiesByPublicKeyHashesRequestV0 - */ - GetIdentitiesByPublicKeyHashesRequestV0.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0) + /** + * Creates a plain object from a DataContractHistory message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory + * @static + * @param {org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory} message DataContractHistory + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + DataContractHistory.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.dataContractEntries = []; + if (message.dataContractEntries && message.dataContractEntries.length) { + object.dataContractEntries = []; + for (var j = 0; j < message.dataContractEntries.length; ++j) + object.dataContractEntries[j] = $root.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.toObject(message.dataContractEntries[j], options); + } return object; - var message = new $root.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0(); - if (object.publicKeyHashes) { - if (!Array.isArray(object.publicKeyHashes)) - throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.publicKeyHashes: array expected"); - message.publicKeyHashes = []; - for (var i = 0; i < object.publicKeyHashes.length; ++i) - if (typeof object.publicKeyHashes[i] === "string") - $util.base64.decode(object.publicKeyHashes[i], message.publicKeyHashes[i] = $util.newBuffer($util.base64.length(object.publicKeyHashes[i])), 0); - else if (object.publicKeyHashes[i].length >= 0) - message.publicKeyHashes[i] = object.publicKeyHashes[i]; - } - if (object.prove != null) - message.prove = Boolean(object.prove); - return message; - }; + }; - /** - * Creates a plain object from a GetIdentitiesByPublicKeyHashesRequestV0 message. Also converts values to other types if specified. - * @function toObject - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0 - * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0} message GetIdentitiesByPublicKeyHashesRequestV0 - * @param {$protobuf.IConversionOptions} [options] Conversion options - * @returns {Object.} Plain object - */ - GetIdentitiesByPublicKeyHashesRequestV0.toObject = function toObject(message, options) { - if (!options) - options = {}; - var object = {}; - if (options.arrays || options.defaults) - object.publicKeyHashes = []; - if (options.defaults) - object.prove = false; - if (message.publicKeyHashes && message.publicKeyHashes.length) { - object.publicKeyHashes = []; - for (var j = 0; j < message.publicKeyHashes.length; ++j) - object.publicKeyHashes[j] = options.bytes === String ? $util.base64.encode(message.publicKeyHashes[j], 0, message.publicKeyHashes[j].length) : options.bytes === Array ? Array.prototype.slice.call(message.publicKeyHashes[j]) : message.publicKeyHashes[j]; - } - if (message.prove != null && message.hasOwnProperty("prove")) - object.prove = message.prove; - return object; - }; + /** + * Converts this DataContractHistory to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory + * @instance + * @returns {Object.} JSON object + */ + DataContractHistory.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; - /** - * Converts this GetIdentitiesByPublicKeyHashesRequestV0 to JSON. - * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0 - * @instance - * @returns {Object.} JSON object - */ - GetIdentitiesByPublicKeyHashesRequestV0.prototype.toJSON = function toJSON() { - return this.constructor.toObject(this, $protobuf.util.toJSONOptions); - }; + return DataContractHistory; + })(); - return GetIdentitiesByPublicKeyHashesRequestV0; + return GetDataContractHistoryResponseV0; })(); - return GetIdentitiesByPublicKeyHashesRequest; + return GetDataContractHistoryResponse; })(); - v0.GetIdentitiesByPublicKeyHashesResponse = (function() { + v0.GetDocumentsRequest = (function() { /** - * Properties of a GetIdentitiesByPublicKeyHashesResponse. + * Properties of a GetDocumentsRequest. * @memberof org.dash.platform.dapi.v0 - * @interface IGetIdentitiesByPublicKeyHashesResponse - * @property {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IGetIdentitiesByPublicKeyHashesResponseV0|null} [v0] GetIdentitiesByPublicKeyHashesResponse v0 + * @interface IGetDocumentsRequest + * @property {org.dash.platform.dapi.v0.GetDocumentsRequest.IGetDocumentsRequestV0|null} [v0] GetDocumentsRequest v0 */ /** - * Constructs a new GetIdentitiesByPublicKeyHashesResponse. + * Constructs a new GetDocumentsRequest. * @memberof org.dash.platform.dapi.v0 - * @classdesc Represents a GetIdentitiesByPublicKeyHashesResponse. - * @implements IGetIdentitiesByPublicKeyHashesResponse + * @classdesc Represents a GetDocumentsRequest. + * @implements IGetDocumentsRequest * @constructor - * @param {org.dash.platform.dapi.v0.IGetIdentitiesByPublicKeyHashesResponse=} [properties] Properties to set + * @param {org.dash.platform.dapi.v0.IGetDocumentsRequest=} [properties] Properties to set */ - function GetIdentitiesByPublicKeyHashesResponse(properties) { + function GetDocumentsRequest(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -17938,89 +16392,89 @@ $root.org = (function() { } /** - * GetIdentitiesByPublicKeyHashesResponse v0. - * @member {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IGetIdentitiesByPublicKeyHashesResponseV0|null|undefined} v0 - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse + * GetDocumentsRequest v0. + * @member {org.dash.platform.dapi.v0.GetDocumentsRequest.IGetDocumentsRequestV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest * @instance */ - GetIdentitiesByPublicKeyHashesResponse.prototype.v0 = null; + GetDocumentsRequest.prototype.v0 = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** - * GetIdentitiesByPublicKeyHashesResponse version. + * GetDocumentsRequest version. * @member {"v0"|undefined} version - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse + * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest * @instance */ - Object.defineProperty(GetIdentitiesByPublicKeyHashesResponse.prototype, "version", { + Object.defineProperty(GetDocumentsRequest.prototype, "version", { get: $util.oneOfGetter($oneOfFields = ["v0"]), set: $util.oneOfSetter($oneOfFields) }); /** - * Creates a new GetIdentitiesByPublicKeyHashesResponse instance using the specified properties. + * Creates a new GetDocumentsRequest instance using the specified properties. * @function create - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse + * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest * @static - * @param {org.dash.platform.dapi.v0.IGetIdentitiesByPublicKeyHashesResponse=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse} GetIdentitiesByPublicKeyHashesResponse instance + * @param {org.dash.platform.dapi.v0.IGetDocumentsRequest=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetDocumentsRequest} GetDocumentsRequest instance */ - GetIdentitiesByPublicKeyHashesResponse.create = function create(properties) { - return new GetIdentitiesByPublicKeyHashesResponse(properties); + GetDocumentsRequest.create = function create(properties) { + return new GetDocumentsRequest(properties); }; /** - * Encodes the specified GetIdentitiesByPublicKeyHashesResponse message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.verify|verify} messages. + * Encodes the specified GetDocumentsRequest message. Does not implicitly {@link org.dash.platform.dapi.v0.GetDocumentsRequest.verify|verify} messages. * @function encode - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse + * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest * @static - * @param {org.dash.platform.dapi.v0.IGetIdentitiesByPublicKeyHashesResponse} message GetIdentitiesByPublicKeyHashesResponse message or plain object to encode + * @param {org.dash.platform.dapi.v0.IGetDocumentsRequest} message GetDocumentsRequest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetIdentitiesByPublicKeyHashesResponse.encode = function encode(message, writer) { + GetDocumentsRequest.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) - $root.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + $root.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); return writer; }; /** - * Encodes the specified GetIdentitiesByPublicKeyHashesResponse message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.verify|verify} messages. + * Encodes the specified GetDocumentsRequest message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetDocumentsRequest.verify|verify} messages. * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse + * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest * @static - * @param {org.dash.platform.dapi.v0.IGetIdentitiesByPublicKeyHashesResponse} message GetIdentitiesByPublicKeyHashesResponse message or plain object to encode + * @param {org.dash.platform.dapi.v0.IGetDocumentsRequest} message GetDocumentsRequest message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetIdentitiesByPublicKeyHashesResponse.encodeDelimited = function encodeDelimited(message, writer) { + GetDocumentsRequest.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a GetIdentitiesByPublicKeyHashesResponse message from the specified reader or buffer. + * Decodes a GetDocumentsRequest message from the specified reader or buffer. * @function decode - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse + * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse} GetIdentitiesByPublicKeyHashesResponse + * @returns {org.dash.platform.dapi.v0.GetDocumentsRequest} GetDocumentsRequest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetIdentitiesByPublicKeyHashesResponse.decode = function decode(reader, length) { + GetDocumentsRequest.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse(); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetDocumentsRequest(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { case 1: - message.v0 = $root.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.decode(reader, reader.uint32()); + message.v0 = $root.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.decode(reader, reader.uint32()); break; default: reader.skipType(tag & 7); @@ -18031,37 +16485,37 @@ $root.org = (function() { }; /** - * Decodes a GetIdentitiesByPublicKeyHashesResponse message from the specified reader or buffer, length delimited. + * Decodes a GetDocumentsRequest message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse + * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse} GetIdentitiesByPublicKeyHashesResponse + * @returns {org.dash.platform.dapi.v0.GetDocumentsRequest} GetDocumentsRequest * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetIdentitiesByPublicKeyHashesResponse.decodeDelimited = function decodeDelimited(reader) { + GetDocumentsRequest.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a GetIdentitiesByPublicKeyHashesResponse message. + * Verifies a GetDocumentsRequest message. * @function verify - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse + * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - GetIdentitiesByPublicKeyHashesResponse.verify = function verify(message) { + GetDocumentsRequest.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; var properties = {}; if (message.v0 != null && message.hasOwnProperty("v0")) { properties.version = 1; { - var error = $root.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.verify(message.v0); + var error = $root.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.verify(message.v0); if (error) return "v0." + error; } @@ -18070,40 +16524,40 @@ $root.org = (function() { }; /** - * Creates a GetIdentitiesByPublicKeyHashesResponse message from a plain object. Also converts values to their respective internal types. + * Creates a GetDocumentsRequest message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse + * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest * @static * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse} GetIdentitiesByPublicKeyHashesResponse + * @returns {org.dash.platform.dapi.v0.GetDocumentsRequest} GetDocumentsRequest */ - GetIdentitiesByPublicKeyHashesResponse.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse) + GetDocumentsRequest.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetDocumentsRequest) return object; - var message = new $root.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse(); + var message = new $root.org.dash.platform.dapi.v0.GetDocumentsRequest(); if (object.v0 != null) { if (typeof object.v0 !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.v0: object expected"); - message.v0 = $root.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.fromObject(object.v0); + throw TypeError(".org.dash.platform.dapi.v0.GetDocumentsRequest.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.fromObject(object.v0); } return message; }; /** - * Creates a plain object from a GetIdentitiesByPublicKeyHashesResponse message. Also converts values to other types if specified. + * Creates a plain object from a GetDocumentsRequest message. Also converts values to other types if specified. * @function toObject - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse + * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse} message GetIdentitiesByPublicKeyHashesResponse + * @param {org.dash.platform.dapi.v0.GetDocumentsRequest} message GetDocumentsRequest * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - GetIdentitiesByPublicKeyHashesResponse.toObject = function toObject(message, options) { + GetDocumentsRequest.toObject = function toObject(message, options) { if (!options) options = {}; var object = {}; if (message.v0 != null && message.hasOwnProperty("v0")) { - object.v0 = $root.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.toObject(message.v0, options); + object.v0 = $root.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.toObject(message.v0, options); if (options.oneofs) object.version = "v0"; } @@ -18111,35 +16565,41 @@ $root.org = (function() { }; /** - * Converts this GetIdentitiesByPublicKeyHashesResponse to JSON. + * Converts this GetDocumentsRequest to JSON. * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse + * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest * @instance * @returns {Object.} JSON object */ - GetIdentitiesByPublicKeyHashesResponse.prototype.toJSON = function toJSON() { + GetDocumentsRequest.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry = (function() { + GetDocumentsRequest.GetDocumentsRequestV0 = (function() { /** - * Properties of a PublicKeyHashIdentityEntry. - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse - * @interface IPublicKeyHashIdentityEntry - * @property {Uint8Array|null} [publicKeyHash] PublicKeyHashIdentityEntry publicKeyHash - * @property {google.protobuf.IBytesValue|null} [value] PublicKeyHashIdentityEntry value + * Properties of a GetDocumentsRequestV0. + * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest + * @interface IGetDocumentsRequestV0 + * @property {Uint8Array|null} [dataContractId] GetDocumentsRequestV0 dataContractId + * @property {string|null} [documentType] GetDocumentsRequestV0 documentType + * @property {Uint8Array|null} [where] GetDocumentsRequestV0 where + * @property {Uint8Array|null} [orderBy] GetDocumentsRequestV0 orderBy + * @property {number|null} [limit] GetDocumentsRequestV0 limit + * @property {Uint8Array|null} [startAfter] GetDocumentsRequestV0 startAfter + * @property {Uint8Array|null} [startAt] GetDocumentsRequestV0 startAt + * @property {boolean|null} [prove] GetDocumentsRequestV0 prove */ /** - * Constructs a new PublicKeyHashIdentityEntry. - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse - * @classdesc Represents a PublicKeyHashIdentityEntry. - * @implements IPublicKeyHashIdentityEntry + * Constructs a new GetDocumentsRequestV0. + * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest + * @classdesc Represents a GetDocumentsRequestV0. + * @implements IGetDocumentsRequestV0 * @constructor - * @param {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IPublicKeyHashIdentityEntry=} [properties] Properties to set + * @param {org.dash.platform.dapi.v0.GetDocumentsRequest.IGetDocumentsRequestV0=} [properties] Properties to set */ - function PublicKeyHashIdentityEntry(properties) { + function GetDocumentsRequestV0(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -18147,302 +16607,180 @@ $root.org = (function() { } /** - * PublicKeyHashIdentityEntry publicKeyHash. - * @member {Uint8Array} publicKeyHash - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry + * GetDocumentsRequestV0 dataContractId. + * @member {Uint8Array} dataContractId + * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0 * @instance */ - PublicKeyHashIdentityEntry.prototype.publicKeyHash = $util.newBuffer([]); + GetDocumentsRequestV0.prototype.dataContractId = $util.newBuffer([]); /** - * PublicKeyHashIdentityEntry value. - * @member {google.protobuf.IBytesValue|null|undefined} value - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry + * GetDocumentsRequestV0 documentType. + * @member {string} documentType + * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0 * @instance */ - PublicKeyHashIdentityEntry.prototype.value = null; - - /** - * Creates a new PublicKeyHashIdentityEntry instance using the specified properties. - * @function create - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry - * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IPublicKeyHashIdentityEntry=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry} PublicKeyHashIdentityEntry instance - */ - PublicKeyHashIdentityEntry.create = function create(properties) { - return new PublicKeyHashIdentityEntry(properties); - }; - - /** - * Encodes the specified PublicKeyHashIdentityEntry message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.verify|verify} messages. - * @function encode - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry - * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IPublicKeyHashIdentityEntry} message PublicKeyHashIdentityEntry message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - PublicKeyHashIdentityEntry.encode = function encode(message, writer) { - if (!writer) - writer = $Writer.create(); - if (message.publicKeyHash != null && Object.hasOwnProperty.call(message, "publicKeyHash")) - writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.publicKeyHash); - if (message.value != null && Object.hasOwnProperty.call(message, "value")) - $root.google.protobuf.BytesValue.encode(message.value, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); - return writer; - }; - - /** - * Encodes the specified PublicKeyHashIdentityEntry message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.verify|verify} messages. - * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry - * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IPublicKeyHashIdentityEntry} message PublicKeyHashIdentityEntry message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - PublicKeyHashIdentityEntry.encodeDelimited = function encodeDelimited(message, writer) { - return this.encode(message, writer).ldelim(); - }; - - /** - * Decodes a PublicKeyHashIdentityEntry message from the specified reader or buffer. - * @function decode - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry} PublicKeyHashIdentityEntry - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - PublicKeyHashIdentityEntry.decode = function decode(reader, length) { - if (!(reader instanceof $Reader)) - reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry(); - while (reader.pos < end) { - var tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - message.publicKeyHash = reader.bytes(); - break; - case 2: - message.value = $root.google.protobuf.BytesValue.decode(reader, reader.uint32()); - break; - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }; - - /** - * Decodes a PublicKeyHashIdentityEntry message from the specified reader or buffer, length delimited. - * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry} PublicKeyHashIdentityEntry - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - PublicKeyHashIdentityEntry.decodeDelimited = function decodeDelimited(reader) { - if (!(reader instanceof $Reader)) - reader = new $Reader(reader); - return this.decode(reader, reader.uint32()); - }; - - /** - * Verifies a PublicKeyHashIdentityEntry message. - * @function verify - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry - * @static - * @param {Object.} message Plain object to verify - * @returns {string|null} `null` if valid, otherwise the reason why it is not - */ - PublicKeyHashIdentityEntry.verify = function verify(message) { - if (typeof message !== "object" || message === null) - return "object expected"; - if (message.publicKeyHash != null && message.hasOwnProperty("publicKeyHash")) - if (!(message.publicKeyHash && typeof message.publicKeyHash.length === "number" || $util.isString(message.publicKeyHash))) - return "publicKeyHash: buffer expected"; - if (message.value != null && message.hasOwnProperty("value")) { - var error = $root.google.protobuf.BytesValue.verify(message.value); - if (error) - return "value." + error; - } - return null; - }; + GetDocumentsRequestV0.prototype.documentType = ""; /** - * Creates a PublicKeyHashIdentityEntry message from a plain object. Also converts values to their respective internal types. - * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry - * @static - * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry} PublicKeyHashIdentityEntry - */ - PublicKeyHashIdentityEntry.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry) - return object; - var message = new $root.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry(); - if (object.publicKeyHash != null) - if (typeof object.publicKeyHash === "string") - $util.base64.decode(object.publicKeyHash, message.publicKeyHash = $util.newBuffer($util.base64.length(object.publicKeyHash)), 0); - else if (object.publicKeyHash.length >= 0) - message.publicKeyHash = object.publicKeyHash; - if (object.value != null) { - if (typeof object.value !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.value: object expected"); - message.value = $root.google.protobuf.BytesValue.fromObject(object.value); - } - return message; - }; + * GetDocumentsRequestV0 where. + * @member {Uint8Array} where + * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0 + * @instance + */ + GetDocumentsRequestV0.prototype.where = $util.newBuffer([]); /** - * Creates a plain object from a PublicKeyHashIdentityEntry message. Also converts values to other types if specified. - * @function toObject - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry - * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry} message PublicKeyHashIdentityEntry - * @param {$protobuf.IConversionOptions} [options] Conversion options - * @returns {Object.} Plain object + * GetDocumentsRequestV0 orderBy. + * @member {Uint8Array} orderBy + * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0 + * @instance */ - PublicKeyHashIdentityEntry.toObject = function toObject(message, options) { - if (!options) - options = {}; - var object = {}; - if (options.defaults) { - if (options.bytes === String) - object.publicKeyHash = ""; - else { - object.publicKeyHash = []; - if (options.bytes !== Array) - object.publicKeyHash = $util.newBuffer(object.publicKeyHash); - } - object.value = null; - } - if (message.publicKeyHash != null && message.hasOwnProperty("publicKeyHash")) - object.publicKeyHash = options.bytes === String ? $util.base64.encode(message.publicKeyHash, 0, message.publicKeyHash.length) : options.bytes === Array ? Array.prototype.slice.call(message.publicKeyHash) : message.publicKeyHash; - if (message.value != null && message.hasOwnProperty("value")) - object.value = $root.google.protobuf.BytesValue.toObject(message.value, options); - return object; - }; + GetDocumentsRequestV0.prototype.orderBy = $util.newBuffer([]); /** - * Converts this PublicKeyHashIdentityEntry to JSON. - * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry + * GetDocumentsRequestV0 limit. + * @member {number} limit + * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0 * @instance - * @returns {Object.} JSON object */ - PublicKeyHashIdentityEntry.prototype.toJSON = function toJSON() { - return this.constructor.toObject(this, $protobuf.util.toJSONOptions); - }; - - return PublicKeyHashIdentityEntry; - })(); + GetDocumentsRequestV0.prototype.limit = 0; - GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes = (function() { + /** + * GetDocumentsRequestV0 startAfter. + * @member {Uint8Array} startAfter + * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0 + * @instance + */ + GetDocumentsRequestV0.prototype.startAfter = $util.newBuffer([]); /** - * Properties of an IdentitiesByPublicKeyHashes. - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse - * @interface IIdentitiesByPublicKeyHashes - * @property {Array.|null} [identityEntries] IdentitiesByPublicKeyHashes identityEntries + * GetDocumentsRequestV0 startAt. + * @member {Uint8Array} startAt + * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0 + * @instance */ + GetDocumentsRequestV0.prototype.startAt = $util.newBuffer([]); /** - * Constructs a new IdentitiesByPublicKeyHashes. - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse - * @classdesc Represents an IdentitiesByPublicKeyHashes. - * @implements IIdentitiesByPublicKeyHashes - * @constructor - * @param {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IIdentitiesByPublicKeyHashes=} [properties] Properties to set + * GetDocumentsRequestV0 prove. + * @member {boolean} prove + * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0 + * @instance */ - function IdentitiesByPublicKeyHashes(properties) { - this.identityEntries = []; - if (properties) - for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) - if (properties[keys[i]] != null) - this[keys[i]] = properties[keys[i]]; - } + GetDocumentsRequestV0.prototype.prove = false; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; /** - * IdentitiesByPublicKeyHashes identityEntries. - * @member {Array.} identityEntries - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes + * GetDocumentsRequestV0 start. + * @member {"startAfter"|"startAt"|undefined} start + * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0 * @instance */ - IdentitiesByPublicKeyHashes.prototype.identityEntries = $util.emptyArray; + Object.defineProperty(GetDocumentsRequestV0.prototype, "start", { + get: $util.oneOfGetter($oneOfFields = ["startAfter", "startAt"]), + set: $util.oneOfSetter($oneOfFields) + }); /** - * Creates a new IdentitiesByPublicKeyHashes instance using the specified properties. + * Creates a new GetDocumentsRequestV0 instance using the specified properties. * @function create - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes + * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IIdentitiesByPublicKeyHashes=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes} IdentitiesByPublicKeyHashes instance + * @param {org.dash.platform.dapi.v0.GetDocumentsRequest.IGetDocumentsRequestV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} GetDocumentsRequestV0 instance */ - IdentitiesByPublicKeyHashes.create = function create(properties) { - return new IdentitiesByPublicKeyHashes(properties); + GetDocumentsRequestV0.create = function create(properties) { + return new GetDocumentsRequestV0(properties); }; /** - * Encodes the specified IdentitiesByPublicKeyHashes message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes.verify|verify} messages. + * Encodes the specified GetDocumentsRequestV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.verify|verify} messages. * @function encode - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes + * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IIdentitiesByPublicKeyHashes} message IdentitiesByPublicKeyHashes message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetDocumentsRequest.IGetDocumentsRequestV0} message GetDocumentsRequestV0 message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - IdentitiesByPublicKeyHashes.encode = function encode(message, writer) { + GetDocumentsRequestV0.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.identityEntries != null && message.identityEntries.length) - for (var i = 0; i < message.identityEntries.length; ++i) - $root.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.encode(message.identityEntries[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.dataContractId != null && Object.hasOwnProperty.call(message, "dataContractId")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.dataContractId); + if (message.documentType != null && Object.hasOwnProperty.call(message, "documentType")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.documentType); + if (message.where != null && Object.hasOwnProperty.call(message, "where")) + writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.where); + if (message.orderBy != null && Object.hasOwnProperty.call(message, "orderBy")) + writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.orderBy); + if (message.limit != null && Object.hasOwnProperty.call(message, "limit")) + writer.uint32(/* id 5, wireType 0 =*/40).uint32(message.limit); + if (message.startAfter != null && Object.hasOwnProperty.call(message, "startAfter")) + writer.uint32(/* id 6, wireType 2 =*/50).bytes(message.startAfter); + if (message.startAt != null && Object.hasOwnProperty.call(message, "startAt")) + writer.uint32(/* id 7, wireType 2 =*/58).bytes(message.startAt); + if (message.prove != null && Object.hasOwnProperty.call(message, "prove")) + writer.uint32(/* id 8, wireType 0 =*/64).bool(message.prove); return writer; }; /** - * Encodes the specified IdentitiesByPublicKeyHashes message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes.verify|verify} messages. + * Encodes the specified GetDocumentsRequestV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.verify|verify} messages. * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes + * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IIdentitiesByPublicKeyHashes} message IdentitiesByPublicKeyHashes message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetDocumentsRequest.IGetDocumentsRequestV0} message GetDocumentsRequestV0 message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - IdentitiesByPublicKeyHashes.encodeDelimited = function encodeDelimited(message, writer) { + GetDocumentsRequestV0.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes an IdentitiesByPublicKeyHashes message from the specified reader or buffer. + * Decodes a GetDocumentsRequestV0 message from the specified reader or buffer. * @function decode - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes + * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0 * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes} IdentitiesByPublicKeyHashes + * @returns {org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} GetDocumentsRequestV0 * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - IdentitiesByPublicKeyHashes.decode = function decode(reader, length) { + GetDocumentsRequestV0.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes(); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { case 1: - if (!(message.identityEntries && message.identityEntries.length)) - message.identityEntries = []; - message.identityEntries.push($root.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.decode(reader, reader.uint32())); + message.dataContractId = reader.bytes(); + break; + case 2: + message.documentType = reader.string(); + break; + case 3: + message.where = reader.bytes(); + break; + case 4: + message.orderBy = reader.bytes(); + break; + case 5: + message.limit = reader.uint32(); + break; + case 6: + message.startAfter = reader.bytes(); + break; + case 7: + message.startAt = reader.bytes(); + break; + case 8: + message.prove = reader.bool(); break; default: reader.skipType(tag & 7); @@ -18453,126 +16791,421 @@ $root.org = (function() { }; /** - * Decodes an IdentitiesByPublicKeyHashes message from the specified reader or buffer, length delimited. + * Decodes a GetDocumentsRequestV0 message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes + * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0 * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes} IdentitiesByPublicKeyHashes + * @returns {org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} GetDocumentsRequestV0 * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - IdentitiesByPublicKeyHashes.decodeDelimited = function decodeDelimited(reader) { + GetDocumentsRequestV0.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies an IdentitiesByPublicKeyHashes message. + * Verifies a GetDocumentsRequestV0 message. * @function verify - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes + * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0 * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - IdentitiesByPublicKeyHashes.verify = function verify(message) { + GetDocumentsRequestV0.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; - if (message.identityEntries != null && message.hasOwnProperty("identityEntries")) { - if (!Array.isArray(message.identityEntries)) - return "identityEntries: array expected"; - for (var i = 0; i < message.identityEntries.length; ++i) { - var error = $root.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.verify(message.identityEntries[i]); - if (error) - return "identityEntries." + error; - } + var properties = {}; + if (message.dataContractId != null && message.hasOwnProperty("dataContractId")) + if (!(message.dataContractId && typeof message.dataContractId.length === "number" || $util.isString(message.dataContractId))) + return "dataContractId: buffer expected"; + if (message.documentType != null && message.hasOwnProperty("documentType")) + if (!$util.isString(message.documentType)) + return "documentType: string expected"; + if (message.where != null && message.hasOwnProperty("where")) + if (!(message.where && typeof message.where.length === "number" || $util.isString(message.where))) + return "where: buffer expected"; + if (message.orderBy != null && message.hasOwnProperty("orderBy")) + if (!(message.orderBy && typeof message.orderBy.length === "number" || $util.isString(message.orderBy))) + return "orderBy: buffer expected"; + if (message.limit != null && message.hasOwnProperty("limit")) + if (!$util.isInteger(message.limit)) + return "limit: integer expected"; + if (message.startAfter != null && message.hasOwnProperty("startAfter")) { + properties.start = 1; + if (!(message.startAfter && typeof message.startAfter.length === "number" || $util.isString(message.startAfter))) + return "startAfter: buffer expected"; + } + if (message.startAt != null && message.hasOwnProperty("startAt")) { + if (properties.start === 1) + return "start: multiple values"; + properties.start = 1; + if (!(message.startAt && typeof message.startAt.length === "number" || $util.isString(message.startAt))) + return "startAt: buffer expected"; } + if (message.prove != null && message.hasOwnProperty("prove")) + if (typeof message.prove !== "boolean") + return "prove: boolean expected"; return null; }; /** - * Creates an IdentitiesByPublicKeyHashes message from a plain object. Also converts values to their respective internal types. + * Creates a GetDocumentsRequestV0 message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes + * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0 * @static * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes} IdentitiesByPublicKeyHashes + * @returns {org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} GetDocumentsRequestV0 */ - IdentitiesByPublicKeyHashes.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes) + GetDocumentsRequestV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0) return object; - var message = new $root.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes(); - if (object.identityEntries) { - if (!Array.isArray(object.identityEntries)) - throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes.identityEntries: array expected"); - message.identityEntries = []; - for (var i = 0; i < object.identityEntries.length; ++i) { - if (typeof object.identityEntries[i] !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes.identityEntries: object expected"); - message.identityEntries[i] = $root.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.fromObject(object.identityEntries[i]); - } - } + var message = new $root.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0(); + if (object.dataContractId != null) + if (typeof object.dataContractId === "string") + $util.base64.decode(object.dataContractId, message.dataContractId = $util.newBuffer($util.base64.length(object.dataContractId)), 0); + else if (object.dataContractId.length >= 0) + message.dataContractId = object.dataContractId; + if (object.documentType != null) + message.documentType = String(object.documentType); + if (object.where != null) + if (typeof object.where === "string") + $util.base64.decode(object.where, message.where = $util.newBuffer($util.base64.length(object.where)), 0); + else if (object.where.length >= 0) + message.where = object.where; + if (object.orderBy != null) + if (typeof object.orderBy === "string") + $util.base64.decode(object.orderBy, message.orderBy = $util.newBuffer($util.base64.length(object.orderBy)), 0); + else if (object.orderBy.length >= 0) + message.orderBy = object.orderBy; + if (object.limit != null) + message.limit = object.limit >>> 0; + if (object.startAfter != null) + if (typeof object.startAfter === "string") + $util.base64.decode(object.startAfter, message.startAfter = $util.newBuffer($util.base64.length(object.startAfter)), 0); + else if (object.startAfter.length >= 0) + message.startAfter = object.startAfter; + if (object.startAt != null) + if (typeof object.startAt === "string") + $util.base64.decode(object.startAt, message.startAt = $util.newBuffer($util.base64.length(object.startAt)), 0); + else if (object.startAt.length >= 0) + message.startAt = object.startAt; + if (object.prove != null) + message.prove = Boolean(object.prove); return message; }; /** - * Creates a plain object from an IdentitiesByPublicKeyHashes message. Also converts values to other types if specified. + * Creates a plain object from a GetDocumentsRequestV0 message. Also converts values to other types if specified. * @function toObject - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes + * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes} message IdentitiesByPublicKeyHashes + * @param {org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} message GetDocumentsRequestV0 * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - IdentitiesByPublicKeyHashes.toObject = function toObject(message, options) { + GetDocumentsRequestV0.toObject = function toObject(message, options) { if (!options) options = {}; var object = {}; - if (options.arrays || options.defaults) - object.identityEntries = []; - if (message.identityEntries && message.identityEntries.length) { - object.identityEntries = []; - for (var j = 0; j < message.identityEntries.length; ++j) - object.identityEntries[j] = $root.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.toObject(message.identityEntries[j], options); + if (options.defaults) { + if (options.bytes === String) + object.dataContractId = ""; + else { + object.dataContractId = []; + if (options.bytes !== Array) + object.dataContractId = $util.newBuffer(object.dataContractId); + } + object.documentType = ""; + if (options.bytes === String) + object.where = ""; + else { + object.where = []; + if (options.bytes !== Array) + object.where = $util.newBuffer(object.where); + } + if (options.bytes === String) + object.orderBy = ""; + else { + object.orderBy = []; + if (options.bytes !== Array) + object.orderBy = $util.newBuffer(object.orderBy); + } + object.limit = 0; + object.prove = false; + } + if (message.dataContractId != null && message.hasOwnProperty("dataContractId")) + object.dataContractId = options.bytes === String ? $util.base64.encode(message.dataContractId, 0, message.dataContractId.length) : options.bytes === Array ? Array.prototype.slice.call(message.dataContractId) : message.dataContractId; + if (message.documentType != null && message.hasOwnProperty("documentType")) + object.documentType = message.documentType; + if (message.where != null && message.hasOwnProperty("where")) + object.where = options.bytes === String ? $util.base64.encode(message.where, 0, message.where.length) : options.bytes === Array ? Array.prototype.slice.call(message.where) : message.where; + if (message.orderBy != null && message.hasOwnProperty("orderBy")) + object.orderBy = options.bytes === String ? $util.base64.encode(message.orderBy, 0, message.orderBy.length) : options.bytes === Array ? Array.prototype.slice.call(message.orderBy) : message.orderBy; + if (message.limit != null && message.hasOwnProperty("limit")) + object.limit = message.limit; + if (message.startAfter != null && message.hasOwnProperty("startAfter")) { + object.startAfter = options.bytes === String ? $util.base64.encode(message.startAfter, 0, message.startAfter.length) : options.bytes === Array ? Array.prototype.slice.call(message.startAfter) : message.startAfter; + if (options.oneofs) + object.start = "startAfter"; + } + if (message.startAt != null && message.hasOwnProperty("startAt")) { + object.startAt = options.bytes === String ? $util.base64.encode(message.startAt, 0, message.startAt.length) : options.bytes === Array ? Array.prototype.slice.call(message.startAt) : message.startAt; + if (options.oneofs) + object.start = "startAt"; } + if (message.prove != null && message.hasOwnProperty("prove")) + object.prove = message.prove; return object; }; /** - * Converts this IdentitiesByPublicKeyHashes to JSON. + * Converts this GetDocumentsRequestV0 to JSON. * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes + * @memberof org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0 * @instance * @returns {Object.} JSON object */ - IdentitiesByPublicKeyHashes.prototype.toJSON = function toJSON() { + GetDocumentsRequestV0.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - return IdentitiesByPublicKeyHashes; + return GetDocumentsRequestV0; })(); - GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0 = (function() { + return GetDocumentsRequest; + })(); + + v0.GetDocumentsResponse = (function() { + + /** + * Properties of a GetDocumentsResponse. + * @memberof org.dash.platform.dapi.v0 + * @interface IGetDocumentsResponse + * @property {org.dash.platform.dapi.v0.GetDocumentsResponse.IGetDocumentsResponseV0|null} [v0] GetDocumentsResponse v0 + */ + + /** + * Constructs a new GetDocumentsResponse. + * @memberof org.dash.platform.dapi.v0 + * @classdesc Represents a GetDocumentsResponse. + * @implements IGetDocumentsResponse + * @constructor + * @param {org.dash.platform.dapi.v0.IGetDocumentsResponse=} [properties] Properties to set + */ + function GetDocumentsResponse(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetDocumentsResponse v0. + * @member {org.dash.platform.dapi.v0.GetDocumentsResponse.IGetDocumentsResponseV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse + * @instance + */ + GetDocumentsResponse.prototype.v0 = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetDocumentsResponse version. + * @member {"v0"|undefined} version + * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse + * @instance + */ + Object.defineProperty(GetDocumentsResponse.prototype, "version", { + get: $util.oneOfGetter($oneOfFields = ["v0"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetDocumentsResponse instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetDocumentsResponse=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetDocumentsResponse} GetDocumentsResponse instance + */ + GetDocumentsResponse.create = function create(properties) { + return new GetDocumentsResponse(properties); + }; + + /** + * Encodes the specified GetDocumentsResponse message. Does not implicitly {@link org.dash.platform.dapi.v0.GetDocumentsResponse.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetDocumentsResponse} message GetDocumentsResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetDocumentsResponse.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) + $root.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetDocumentsResponse message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetDocumentsResponse.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetDocumentsResponse} message GetDocumentsResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetDocumentsResponse.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetDocumentsResponse message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetDocumentsResponse} GetDocumentsResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetDocumentsResponse.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetDocumentsResponse(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.v0 = $root.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetDocumentsResponse message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetDocumentsResponse} GetDocumentsResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetDocumentsResponse.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetDocumentsResponse message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetDocumentsResponse.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + properties.version = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.verify(message.v0); + if (error) + return "v0." + error; + } + } + return null; + }; + + /** + * Creates a GetDocumentsResponse message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse + * @static + * @param {Object.} object Plain object + * @returns {org.dash.platform.dapi.v0.GetDocumentsResponse} GetDocumentsResponse + */ + GetDocumentsResponse.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetDocumentsResponse) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetDocumentsResponse(); + if (object.v0 != null) { + if (typeof object.v0 !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetDocumentsResponse.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.fromObject(object.v0); + } + return message; + }; + + /** + * Creates a plain object from a GetDocumentsResponse message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse + * @static + * @param {org.dash.platform.dapi.v0.GetDocumentsResponse} message GetDocumentsResponse + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + GetDocumentsResponse.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + object.v0 = $root.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.toObject(message.v0, options); + if (options.oneofs) + object.version = "v0"; + } + return object; + }; + + /** + * Converts this GetDocumentsResponse to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse + * @instance + * @returns {Object.} JSON object + */ + GetDocumentsResponse.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + GetDocumentsResponse.GetDocumentsResponseV0 = (function() { /** - * Properties of a GetIdentitiesByPublicKeyHashesResponseV0. - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse - * @interface IGetIdentitiesByPublicKeyHashesResponseV0 - * @property {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IIdentitiesByPublicKeyHashes|null} [identities] GetIdentitiesByPublicKeyHashesResponseV0 identities - * @property {org.dash.platform.dapi.v0.IProof|null} [proof] GetIdentitiesByPublicKeyHashesResponseV0 proof - * @property {org.dash.platform.dapi.v0.IResponseMetadata|null} [metadata] GetIdentitiesByPublicKeyHashesResponseV0 metadata + * Properties of a GetDocumentsResponseV0. + * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse + * @interface IGetDocumentsResponseV0 + * @property {org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.IDocuments|null} [documents] GetDocumentsResponseV0 documents + * @property {org.dash.platform.dapi.v0.IProof|null} [proof] GetDocumentsResponseV0 proof + * @property {org.dash.platform.dapi.v0.IResponseMetadata|null} [metadata] GetDocumentsResponseV0 metadata */ /** - * Constructs a new GetIdentitiesByPublicKeyHashesResponseV0. - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse - * @classdesc Represents a GetIdentitiesByPublicKeyHashesResponseV0. - * @implements IGetIdentitiesByPublicKeyHashesResponseV0 + * Constructs a new GetDocumentsResponseV0. + * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse + * @classdesc Represents a GetDocumentsResponseV0. + * @implements IGetDocumentsResponseV0 * @constructor - * @param {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IGetIdentitiesByPublicKeyHashesResponseV0=} [properties] Properties to set + * @param {org.dash.platform.dapi.v0.GetDocumentsResponse.IGetDocumentsResponseV0=} [properties] Properties to set */ - function GetIdentitiesByPublicKeyHashesResponseV0(properties) { + function GetDocumentsResponseV0(properties) { if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -18580,69 +17213,69 @@ $root.org = (function() { } /** - * GetIdentitiesByPublicKeyHashesResponseV0 identities. - * @member {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IIdentitiesByPublicKeyHashes|null|undefined} identities - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0 + * GetDocumentsResponseV0 documents. + * @member {org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.IDocuments|null|undefined} documents + * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0 * @instance */ - GetIdentitiesByPublicKeyHashesResponseV0.prototype.identities = null; + GetDocumentsResponseV0.prototype.documents = null; /** - * GetIdentitiesByPublicKeyHashesResponseV0 proof. + * GetDocumentsResponseV0 proof. * @member {org.dash.platform.dapi.v0.IProof|null|undefined} proof - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0 + * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0 * @instance */ - GetIdentitiesByPublicKeyHashesResponseV0.prototype.proof = null; + GetDocumentsResponseV0.prototype.proof = null; /** - * GetIdentitiesByPublicKeyHashesResponseV0 metadata. + * GetDocumentsResponseV0 metadata. * @member {org.dash.platform.dapi.v0.IResponseMetadata|null|undefined} metadata - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0 + * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0 * @instance */ - GetIdentitiesByPublicKeyHashesResponseV0.prototype.metadata = null; + GetDocumentsResponseV0.prototype.metadata = null; // OneOf field names bound to virtual getters and setters var $oneOfFields; /** - * GetIdentitiesByPublicKeyHashesResponseV0 result. - * @member {"identities"|"proof"|undefined} result - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0 + * GetDocumentsResponseV0 result. + * @member {"documents"|"proof"|undefined} result + * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0 * @instance */ - Object.defineProperty(GetIdentitiesByPublicKeyHashesResponseV0.prototype, "result", { - get: $util.oneOfGetter($oneOfFields = ["identities", "proof"]), + Object.defineProperty(GetDocumentsResponseV0.prototype, "result", { + get: $util.oneOfGetter($oneOfFields = ["documents", "proof"]), set: $util.oneOfSetter($oneOfFields) }); /** - * Creates a new GetIdentitiesByPublicKeyHashesResponseV0 instance using the specified properties. + * Creates a new GetDocumentsResponseV0 instance using the specified properties. * @function create - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0 + * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IGetIdentitiesByPublicKeyHashesResponseV0=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0} GetIdentitiesByPublicKeyHashesResponseV0 instance + * @param {org.dash.platform.dapi.v0.GetDocumentsResponse.IGetDocumentsResponseV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} GetDocumentsResponseV0 instance */ - GetIdentitiesByPublicKeyHashesResponseV0.create = function create(properties) { - return new GetIdentitiesByPublicKeyHashesResponseV0(properties); + GetDocumentsResponseV0.create = function create(properties) { + return new GetDocumentsResponseV0(properties); }; /** - * Encodes the specified GetIdentitiesByPublicKeyHashesResponseV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.verify|verify} messages. + * Encodes the specified GetDocumentsResponseV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.verify|verify} messages. * @function encode - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0 + * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IGetIdentitiesByPublicKeyHashesResponseV0} message GetIdentitiesByPublicKeyHashesResponseV0 message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetDocumentsResponse.IGetDocumentsResponseV0} message GetDocumentsResponseV0 message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetIdentitiesByPublicKeyHashesResponseV0.encode = function encode(message, writer) { + GetDocumentsResponseV0.encode = function encode(message, writer) { if (!writer) writer = $Writer.create(); - if (message.identities != null && Object.hasOwnProperty.call(message, "identities")) - $root.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes.encode(message.identities, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.documents != null && Object.hasOwnProperty.call(message, "documents")) + $root.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.encode(message.documents, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); if (message.proof != null && Object.hasOwnProperty.call(message, "proof")) $root.org.dash.platform.dapi.v0.Proof.encode(message.proof, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); if (message.metadata != null && Object.hasOwnProperty.call(message, "metadata")) @@ -18651,38 +17284,38 @@ $root.org = (function() { }; /** - * Encodes the specified GetIdentitiesByPublicKeyHashesResponseV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.verify|verify} messages. + * Encodes the specified GetDocumentsResponseV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.verify|verify} messages. * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0 + * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IGetIdentitiesByPublicKeyHashesResponseV0} message GetIdentitiesByPublicKeyHashesResponseV0 message or plain object to encode + * @param {org.dash.platform.dapi.v0.GetDocumentsResponse.IGetDocumentsResponseV0} message GetDocumentsResponseV0 message or plain object to encode * @param {$protobuf.Writer} [writer] Writer to encode to * @returns {$protobuf.Writer} Writer */ - GetIdentitiesByPublicKeyHashesResponseV0.encodeDelimited = function encodeDelimited(message, writer) { + GetDocumentsResponseV0.encodeDelimited = function encodeDelimited(message, writer) { return this.encode(message, writer).ldelim(); }; /** - * Decodes a GetIdentitiesByPublicKeyHashesResponseV0 message from the specified reader or buffer. + * Decodes a GetDocumentsResponseV0 message from the specified reader or buffer. * @function decode - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0 + * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0 * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0} GetIdentitiesByPublicKeyHashesResponseV0 + * @returns {org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} GetDocumentsResponseV0 * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetIdentitiesByPublicKeyHashesResponseV0.decode = function decode(reader, length) { + GetDocumentsResponseV0.decode = function decode(reader, length) { if (!(reader instanceof $Reader)) reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0(); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0(); while (reader.pos < end) { var tag = reader.uint32(); switch (tag >>> 3) { case 1: - message.identities = $root.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes.decode(reader, reader.uint32()); + message.documents = $root.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.decode(reader, reader.uint32()); break; case 2: message.proof = $root.org.dash.platform.dapi.v0.Proof.decode(reader, reader.uint32()); @@ -18699,39 +17332,39 @@ $root.org = (function() { }; /** - * Decodes a GetIdentitiesByPublicKeyHashesResponseV0 message from the specified reader or buffer, length delimited. + * Decodes a GetDocumentsResponseV0 message from the specified reader or buffer, length delimited. * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0 + * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0 * @static * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0} GetIdentitiesByPublicKeyHashesResponseV0 + * @returns {org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} GetDocumentsResponseV0 * @throws {Error} If the payload is not a reader or valid buffer * @throws {$protobuf.util.ProtocolError} If required fields are missing */ - GetIdentitiesByPublicKeyHashesResponseV0.decodeDelimited = function decodeDelimited(reader) { + GetDocumentsResponseV0.decodeDelimited = function decodeDelimited(reader) { if (!(reader instanceof $Reader)) reader = new $Reader(reader); return this.decode(reader, reader.uint32()); }; /** - * Verifies a GetIdentitiesByPublicKeyHashesResponseV0 message. + * Verifies a GetDocumentsResponseV0 message. * @function verify - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0 + * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0 * @static * @param {Object.} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ - GetIdentitiesByPublicKeyHashesResponseV0.verify = function verify(message) { + GetDocumentsResponseV0.verify = function verify(message) { if (typeof message !== "object" || message === null) return "object expected"; var properties = {}; - if (message.identities != null && message.hasOwnProperty("identities")) { + if (message.documents != null && message.hasOwnProperty("documents")) { properties.result = 1; { - var error = $root.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes.verify(message.identities); + var error = $root.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.verify(message.documents); if (error) - return "identities." + error; + return "documents." + error; } } if (message.proof != null && message.hasOwnProperty("proof")) { @@ -18753,54 +17386,54 @@ $root.org = (function() { }; /** - * Creates a GetIdentitiesByPublicKeyHashesResponseV0 message from a plain object. Also converts values to their respective internal types. + * Creates a GetDocumentsResponseV0 message from a plain object. Also converts values to their respective internal types. * @function fromObject - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0 + * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0 * @static * @param {Object.} object Plain object - * @returns {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0} GetIdentitiesByPublicKeyHashesResponseV0 + * @returns {org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} GetDocumentsResponseV0 */ - GetIdentitiesByPublicKeyHashesResponseV0.fromObject = function fromObject(object) { - if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0) + GetDocumentsResponseV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0) return object; - var message = new $root.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0(); - if (object.identities != null) { - if (typeof object.identities !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.identities: object expected"); - message.identities = $root.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes.fromObject(object.identities); + var message = new $root.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0(); + if (object.documents != null) { + if (typeof object.documents !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.documents: object expected"); + message.documents = $root.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.fromObject(object.documents); } if (object.proof != null) { if (typeof object.proof !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.proof: object expected"); + throw TypeError(".org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.proof: object expected"); message.proof = $root.org.dash.platform.dapi.v0.Proof.fromObject(object.proof); } if (object.metadata != null) { if (typeof object.metadata !== "object") - throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.metadata: object expected"); + throw TypeError(".org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.metadata: object expected"); message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.fromObject(object.metadata); } return message; }; /** - * Creates a plain object from a GetIdentitiesByPublicKeyHashesResponseV0 message. Also converts values to other types if specified. + * Creates a plain object from a GetDocumentsResponseV0 message. Also converts values to other types if specified. * @function toObject - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0 + * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0 * @static - * @param {org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0} message GetIdentitiesByPublicKeyHashesResponseV0 + * @param {org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} message GetDocumentsResponseV0 * @param {$protobuf.IConversionOptions} [options] Conversion options * @returns {Object.} Plain object */ - GetIdentitiesByPublicKeyHashesResponseV0.toObject = function toObject(message, options) { + GetDocumentsResponseV0.toObject = function toObject(message, options) { if (!options) options = {}; var object = {}; if (options.defaults) object.metadata = null; - if (message.identities != null && message.hasOwnProperty("identities")) { - object.identities = $root.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes.toObject(message.identities, options); + if (message.documents != null && message.hasOwnProperty("documents")) { + object.documents = $root.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.toObject(message.documents, options); if (options.oneofs) - object.result = "identities"; + object.result = "documents"; } if (message.proof != null && message.hasOwnProperty("proof")) { object.proof = $root.org.dash.platform.dapi.v0.Proof.toObject(message.proof, options); @@ -18813,20 +17446,226 @@ $root.org = (function() { }; /** - * Converts this GetIdentitiesByPublicKeyHashesResponseV0 to JSON. + * Converts this GetDocumentsResponseV0 to JSON. * @function toJSON - * @memberof org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0 + * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0 * @instance * @returns {Object.} JSON object */ - GetIdentitiesByPublicKeyHashesResponseV0.prototype.toJSON = function toJSON() { + GetDocumentsResponseV0.prototype.toJSON = function toJSON() { return this.constructor.toObject(this, $protobuf.util.toJSONOptions); }; - return GetIdentitiesByPublicKeyHashesResponseV0; + GetDocumentsResponseV0.Documents = (function() { + + /** + * Properties of a Documents. + * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0 + * @interface IDocuments + * @property {Array.|null} [documents] Documents documents + */ + + /** + * Constructs a new Documents. + * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0 + * @classdesc Represents a Documents. + * @implements IDocuments + * @constructor + * @param {org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.IDocuments=} [properties] Properties to set + */ + function Documents(properties) { + this.documents = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Documents documents. + * @member {Array.} documents + * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents + * @instance + */ + Documents.prototype.documents = $util.emptyArray; + + /** + * Creates a new Documents instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents + * @static + * @param {org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.IDocuments=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} Documents instance + */ + Documents.create = function create(properties) { + return new Documents(properties); + }; + + /** + * Encodes the specified Documents message. Does not implicitly {@link org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents + * @static + * @param {org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.IDocuments} message Documents message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Documents.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.documents != null && message.documents.length) + for (var i = 0; i < message.documents.length; ++i) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.documents[i]); + return writer; + }; + + /** + * Encodes the specified Documents message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents + * @static + * @param {org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.IDocuments} message Documents message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Documents.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a Documents message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} Documents + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Documents.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (!(message.documents && message.documents.length)) + message.documents = []; + message.documents.push(reader.bytes()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a Documents message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} Documents + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Documents.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a Documents message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + Documents.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.documents != null && message.hasOwnProperty("documents")) { + if (!Array.isArray(message.documents)) + return "documents: array expected"; + for (var i = 0; i < message.documents.length; ++i) + if (!(message.documents[i] && typeof message.documents[i].length === "number" || $util.isString(message.documents[i]))) + return "documents: buffer[] expected"; + } + return null; + }; + + /** + * Creates a Documents message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents + * @static + * @param {Object.} object Plain object + * @returns {org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} Documents + */ + Documents.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents(); + if (object.documents) { + if (!Array.isArray(object.documents)) + throw TypeError(".org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.documents: array expected"); + message.documents = []; + for (var i = 0; i < object.documents.length; ++i) + if (typeof object.documents[i] === "string") + $util.base64.decode(object.documents[i], message.documents[i] = $util.newBuffer($util.base64.length(object.documents[i])), 0); + else if (object.documents[i].length >= 0) + message.documents[i] = object.documents[i]; + } + return message; + }; + + /** + * Creates a plain object from a Documents message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents + * @static + * @param {org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} message Documents + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + Documents.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.documents = []; + if (message.documents && message.documents.length) { + object.documents = []; + for (var j = 0; j < message.documents.length; ++j) + object.documents[j] = options.bytes === String ? $util.base64.encode(message.documents[j], 0, message.documents[j].length) : options.bytes === Array ? Array.prototype.slice.call(message.documents[j]) : message.documents[j]; + } + return object; + }; + + /** + * Converts this Documents to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents + * @instance + * @returns {Object.} JSON object + */ + Documents.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return Documents; + })(); + + return GetDocumentsResponseV0; })(); - return GetIdentitiesByPublicKeyHashesResponse; + return GetDocumentsResponse; })(); v0.GetIdentityByPublicKeyHashRequest = (function() { diff --git a/packages/dapi-grpc/clients/platform/v0/nodejs/platform_protoc.js b/packages/dapi-grpc/clients/platform/v0/nodejs/platform_protoc.js index b30f67af84..f8609dbd8b 100644 --- a/packages/dapi-grpc/clients/platform/v0/nodejs/platform_protoc.js +++ b/packages/dapi-grpc/clients/platform/v0/nodejs/platform_protoc.js @@ -75,25 +75,16 @@ goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpoc goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.ResultCase', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.VersionCase', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.VersionCase', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.ResultCase', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.VersionCase', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesRequest', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.VersionCase', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesResponse', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.ResultCase', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.ResultCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.VersionCase', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.VersionCase', null, { proto }); @@ -182,6 +173,7 @@ goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVote goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.KeyPurpose', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.KeyRequestType', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.KeyRequestType.RequestCase', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.Proof', null, { proto }); @@ -565,16 +557,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.oneofGroups_); +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.oneofGroups_); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesRequest, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesRequest'; + proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse'; } /** * Generated by JsPbCodeGenerator. @@ -586,16 +578,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0 = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.repeatedFields_, null); +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0'; + proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0'; } /** * Generated by JsPbCodeGenerator. @@ -607,16 +599,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.oneofGroups_); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.oneofGroups_); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesResponse, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesResponse'; + proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse'; } /** * Generated by JsPbCodeGenerator. @@ -628,16 +620,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue'; + proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0'; } /** * Generated by JsPbCodeGenerator. @@ -649,16 +641,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.oneofGroups_); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry'; + proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse'; } /** * Generated by JsPbCodeGenerator. @@ -670,16 +662,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.repeatedFields_, null); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.oneofGroups_); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities'; + proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0'; } /** * Generated by JsPbCodeGenerator. @@ -691,16 +683,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0 = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.oneofGroups_); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.oneofGroups_); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0'; + proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse'; } /** * Generated by JsPbCodeGenerator. @@ -712,16 +704,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.oneofGroups_); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.oneofGroups_); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse'; + proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0'; } /** * Generated by JsPbCodeGenerator. @@ -733,16 +725,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0 = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0'; + proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision'; } /** * Generated by JsPbCodeGenerator. @@ -754,16 +746,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.oneofGroups_); +proto.org.dash.platform.dapi.v0.KeyRequestType = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.KeyRequestType.oneofGroups_); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.KeyRequestType, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse'; + proto.org.dash.platform.dapi.v0.KeyRequestType.displayName = 'proto.org.dash.platform.dapi.v0.KeyRequestType'; } /** * Generated by JsPbCodeGenerator. @@ -775,16 +767,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0 = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_); +proto.org.dash.platform.dapi.v0.AllKeys = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.AllKeys, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0'; + proto.org.dash.platform.dapi.v0.AllKeys.displayName = 'proto.org.dash.platform.dapi.v0.AllKeys'; } /** * Generated by JsPbCodeGenerator. @@ -796,16 +788,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.oneofGroups_); +proto.org.dash.platform.dapi.v0.SpecificKeys = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.SpecificKeys.repeatedFields_, null); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.SpecificKeys, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse'; + proto.org.dash.platform.dapi.v0.SpecificKeys.displayName = 'proto.org.dash.platform.dapi.v0.SpecificKeys'; } /** * Generated by JsPbCodeGenerator. @@ -817,16 +809,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0 = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.oneofGroups_); +proto.org.dash.platform.dapi.v0.SearchKey = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.SearchKey, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0'; + proto.org.dash.platform.dapi.v0.SearchKey.displayName = 'proto.org.dash.platform.dapi.v0.SearchKey'; } /** * Generated by JsPbCodeGenerator. @@ -838,16 +830,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.oneofGroups_); +proto.org.dash.platform.dapi.v0.SecurityLevelMap = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.SecurityLevelMap, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse'; + proto.org.dash.platform.dapi.v0.SecurityLevelMap.displayName = 'proto.org.dash.platform.dapi.v0.SecurityLevelMap'; } /** * Generated by JsPbCodeGenerator. @@ -859,16 +851,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0 = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.oneofGroups_); +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.oneofGroups_); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0'; + proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest'; } /** * Generated by JsPbCodeGenerator. @@ -880,16 +872,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision = function(opt_data) { +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0 = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision'; + proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0'; } /** * Generated by JsPbCodeGenerator. @@ -901,16 +893,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.KeyRequestType = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.KeyRequestType.oneofGroups_); +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.oneofGroups_); }; -goog.inherits(proto.org.dash.platform.dapi.v0.KeyRequestType, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.KeyRequestType.displayName = 'proto.org.dash.platform.dapi.v0.KeyRequestType'; + proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse'; } /** * Generated by JsPbCodeGenerator. @@ -922,16 +914,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.AllKeys = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.oneofGroups_); }; -goog.inherits(proto.org.dash.platform.dapi.v0.AllKeys, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.AllKeys.displayName = 'proto.org.dash.platform.dapi.v0.AllKeys'; + proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0'; } /** * Generated by JsPbCodeGenerator. @@ -943,16 +935,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.SpecificKeys = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.SpecificKeys.repeatedFields_, null); +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.repeatedFields_, null); }; -goog.inherits(proto.org.dash.platform.dapi.v0.SpecificKeys, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.SpecificKeys.displayName = 'proto.org.dash.platform.dapi.v0.SpecificKeys'; + proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys'; } /** * Generated by JsPbCodeGenerator. @@ -964,16 +956,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.SearchKey = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.oneofGroups_); }; -goog.inherits(proto.org.dash.platform.dapi.v0.SearchKey, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.SearchKey.displayName = 'proto.org.dash.platform.dapi.v0.SearchKey'; + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest'; } /** * Generated by JsPbCodeGenerator. @@ -985,16 +977,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.SecurityLevelMap = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.repeatedFields_, null); }; -goog.inherits(proto.org.dash.platform.dapi.v0.SecurityLevelMap, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.SecurityLevelMap.displayName = 'proto.org.dash.platform.dapi.v0.SecurityLevelMap'; + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0'; } /** * Generated by JsPbCodeGenerator. @@ -1006,16 +998,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.oneofGroups_); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.oneofGroups_); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest'; + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse'; } /** * Generated by JsPbCodeGenerator. @@ -1027,16 +1019,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0 = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.oneofGroups_); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0'; + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0'; } /** * Generated by JsPbCodeGenerator. @@ -1048,16 +1040,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.oneofGroups_); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.repeatedFields_, null); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse'; + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys'; } /** * Generated by JsPbCodeGenerator. @@ -1069,16 +1061,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0 = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.oneofGroups_); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.repeatedFields_, null); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0'; + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys'; } /** * Generated by JsPbCodeGenerator. @@ -1090,16 +1082,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.repeatedFields_, null); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.repeatedFields_, null); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys'; + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys'; } /** * Generated by JsPbCodeGenerator. @@ -1689,132 +1681,6 @@ if (goog.DEBUG && !COMPILED) { */ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.displayName = 'proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents'; } -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.oneofGroups_); -}; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest'; -} -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0 = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.repeatedFields_, null); -}; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0'; -} -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.oneofGroups_); -}; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse'; -} -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry'; -} -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes.repeatedFields_, null); -}; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes'; -} -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0 = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.oneofGroups_); -}; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0'; -} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -6056,21 +5922,21 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.hasV0 = function() * @private {!Array>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.VersionCase = { +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.oneofGroups_[0])); }; @@ -6088,8 +5954,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.toObject(opt_includeInstance, this); }; @@ -6098,13 +5964,13 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.toObject = functi * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -6118,23 +5984,23 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.toObject = function(include /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesRequest; - return proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse; + return proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -6142,8 +6008,8 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.deserializeBinaryFromReader var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -6159,9 +6025,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.deserializeBinaryFromReader * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -6169,18 +6035,18 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.serializeBinary = /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.serializeBinaryToWriter ); } }; @@ -6188,11 +6054,30 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.serializeBinaryToWriter = f /** - * List of repeated fields within this message type. - * @private {!Array} + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.repeatedFields_ = [1]; +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + IDENTITY_NONCE: 1, + PROOF: 2 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_[0])); +}; @@ -6209,8 +6094,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.toObject(opt_includeInstance, this); }; @@ -6219,14 +6104,15 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prot * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - idsList: msg.getIdsList_asB64(), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + identityNonce: jspb.Message.getFieldWithDefault(msg, 1, 0), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; if (includeInstance) { @@ -6240,23 +6126,23 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.toOb /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0; - return proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0; + return proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -6264,12 +6150,18 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.dese var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.addIds(value); + var value = /** @type {number} */ (reader.readUint64()); + msg.setIdentityNonce(value); break; case 2: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setProve(value); + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); break; default: reader.skipField(); @@ -6284,9 +6176,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.dese * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -6294,132 +6186,172 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prot /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getIdsList_asU8(); - if (f.length > 0) { - writer.writeRepeatedBytes( + f = /** @type {number} */ (jspb.Message.getField(message, 1)); + if (f != null) { + writer.writeUint64( 1, f ); } - f = message.getProve(); - if (f) { - writer.writeBool( + f = message.getProof(); + if (f != null) { + writer.writeMessage( 2, - f + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter ); } }; /** - * repeated bytes ids = 1; - * @return {!Array} + * optional uint64 identity_nonce = 1; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.getIdsList = function() { - return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 1)); +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.getIdentityNonce = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); }; /** - * repeated bytes ids = 1; - * This is a type-conversion wrapper around `getIdsList()` - * @return {!Array} + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.getIdsList_asB64 = function() { - return /** @type {!Array} */ (jspb.Message.bytesListAsB64( - this.getIdsList())); +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.setIdentityNonce = function(value) { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_[0], value); }; /** - * repeated bytes ids = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getIdsList()` - * @return {!Array} + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.getIdsList_asU8 = function() { - return /** @type {!Array} */ (jspb.Message.bytesListAsU8( - this.getIdsList())); +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.clearIdentityNonce = function() { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_[0], undefined); }; /** - * @param {!(Array|Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.setIdsList = function(value) { - return jspb.Message.setField(this, 1, value || []); +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.hasIdentityNonce = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * @param {!(string|Uint8Array)} value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} returns this + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.addIds = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.clearIdsList = function() { - return this.setIdsList([]); +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); }; /** - * optional bool prove = 2; + * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} returns this + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; }; /** - * optional GetIdentitiesRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} + * optional GetIdentityNonceResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -6428,7 +6360,7 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.clearV0 = functio * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -6442,21 +6374,21 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.hasV0 = function( * @private {!Array>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.VersionCase = { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.oneofGroups_[0])); }; @@ -6474,8 +6406,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.toObject(opt_includeInstance, this); }; @@ -6484,13 +6416,13 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.toObject = funct * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -6504,23 +6436,23 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.toObject = function(includ /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse; - return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse; + return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -6528,8 +6460,8 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.deserializeBinaryFromReade var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -6545,9 +6477,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.deserializeBinaryFromReade * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -6555,180 +6487,52 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.serializeBinary /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.serializeBinaryToWriter ); } }; - - -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} + * @const */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.toObject = function(includeInstance, msg) { - var f, obj = { - value: msg.getValue_asB64() - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue; - return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setValue(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getValue_asU8(); - if (f.length > 0) { - writer.writeBytes( - 1, - f - ); - } -}; - - -/** - * optional bytes value = 1; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.prototype.getValue = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * optional bytes value = 1; - * This is a type-conversion wrapper around `getValue()` - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.prototype.getValue_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getValue())); -}; - +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_ = [[1,2]]; /** - * optional bytes value = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getValue()` - * @return {!Uint8Array} + * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.prototype.getValue_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getValue())); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + IDENTITY_CONTRACT_NONCE: 1, + PROOF: 2 }; - /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} returns this + * @return {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.ResultCase} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.prototype.setValue = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_[0])); }; - - if (jspb.Message.GENERATE_TO_OBJECT) { /** * Creates an object representation of this proto. @@ -6742,8 +6546,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.toObject(opt_includeInstance, this); }; @@ -6752,14 +6556,15 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.to * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - key: msg.getKey_asB64(), - value: (f = msg.getValue()) && proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.toObject(includeInstance, f) + identityContractNonce: jspb.Message.getFieldWithDefault(msg, 1, 0), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; if (includeInstance) { @@ -6773,23 +6578,23 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.toObject = f /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry; - return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0; + return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -6797,13 +6602,18 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.deserializeB var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setKey(value); + var value = /** @type {number} */ (reader.readUint64()); + msg.setIdentityContractNonce(value); break; case 2: - var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.deserializeBinaryFromReader); - msg.setValue(value); + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); break; default: reader.skipField(); @@ -6818,9 +6628,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.deserializeB * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -6828,97 +6638,99 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.se /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getKey_asU8(); - if (f.length > 0) { - writer.writeBytes( + f = /** @type {number} */ (jspb.Message.getField(message, 1)); + if (f != null) { + writer.writeUint64( 1, f ); } - f = message.getValue(); + f = message.getProof(); if (f != null) { writer.writeMessage( 2, f, - proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter ); } }; /** - * optional bytes key = 1; - * @return {string} + * optional uint64 identity_contract_nonce = 1; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.getKey = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.getIdentityContractNonce = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); }; /** - * optional bytes key = 1; - * This is a type-conversion wrapper around `getKey()` - * @return {string} + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.getKey_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getKey())); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.setIdentityContractNonce = function(value) { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_[0], value); }; /** - * optional bytes key = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getKey()` - * @return {!Uint8Array} + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.getKey_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getKey())); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.clearIdentityContractNonce = function() { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_[0], undefined); }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.setKey = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.hasIdentityContractNonce = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * optional IdentityValue value = 2; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.getValue = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue, 2)); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} returns this + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.setValue = function(value) { - return jspb.Message.setWrapperField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.clearValue = function() { - return this.setValue(undefined); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); }; @@ -6926,82 +6738,173 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.cl * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.hasValue = function() { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.hasProof = function() { return jspb.Message.getField(this, 2) != null; }; - /** - * List of repeated fields within this message type. - * @private {!Array} - * @const + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.repeatedFields_ = [1]; - +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.toObject(opt_includeInstance, this); + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.toObject = function(includeInstance, msg) { - var f, obj = { - identityEntriesList: jspb.Message.toObjectList(msg.getIdentityEntriesList(), - proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.toObject, includeInstance) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities; - return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.deserializeBinaryFromReader = function(msg, reader) { + * optional GetIdentityContractNonceResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse; + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -7009,9 +6912,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.deserializeBina var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.deserializeBinaryFromReader); - msg.addIdentityEntries(value); + var value = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.deserializeBinaryFromReader); + msg.setV0(value); break; default: reader.skipField(); @@ -7026,9 +6929,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.deserializeBina * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -7036,61 +6939,23 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.prototype.seria /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getIdentityEntriesList(); - if (f.length > 0) { - writer.writeRepeatedMessage( + f = message.getV0(); + if (f != null) { + writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.serializeBinaryToWriter ); } }; -/** - * repeated IdentityEntry identity_entries = 1; - * @return {!Array} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.prototype.getIdentityEntriesList = function() { - return /** @type{!Array} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry, 1)); -}; - - -/** - * @param {!Array} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.prototype.setIdentityEntriesList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 1, value); -}; - - -/** - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry=} opt_value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.prototype.addIdentityEntries = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry, opt_index); -}; - - -/** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.prototype.clearIdentityEntriesList = function() { - return this.setIdentityEntriesList([]); -}; - - /** * Oneof group definitions for this message. Each group defines the field @@ -7100,22 +6965,22 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.prototype.clear * @private {!Array>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.oneofGroups_ = [[1,2]]; +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.oneofGroups_ = [[1,2]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.ResultCase = { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.ResultCase = { RESULT_NOT_SET: 0, - IDENTITIES: 1, + BALANCE: 1, PROOF: 2 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.ResultCase} + * @return {proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.ResultCase} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.oneofGroups_[0])); }; @@ -7133,8 +6998,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.toObject(opt_includeInstance, this); }; @@ -7143,13 +7008,13 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.pr * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - identities: (f = msg.getIdentities()) && proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.toObject(includeInstance, f), + balance: jspb.Message.getFieldWithDefault(msg, 1, 0), proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; @@ -7165,23 +7030,23 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.to /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0; - return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0; + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -7189,9 +7054,8 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.de var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.deserializeBinaryFromReader); - msg.setIdentities(value); + var value = /** @type {number} */ (reader.readUint64()); + msg.setBalance(value); break; case 2: var value = new proto.org.dash.platform.dapi.v0.Proof; @@ -7216,9 +7080,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.de * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -7226,18 +7090,17 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.pr /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getIdentities(); + f = /** @type {number} */ (jspb.Message.getField(message, 1)); if (f != null) { - writer.writeMessage( + writer.writeUint64( 1, - f, - proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.serializeBinaryToWriter + f ); } f = message.getProof(); @@ -7260,30 +7123,29 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.se /** - * optional Identities identities = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} + * optional uint64 balance = 1; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.getIdentities = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities, 1)); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.getBalance = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.setIdentities = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.oneofGroups_[0], value); + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.setBalance = function(value) { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.oneofGroups_[0], value); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} returns this + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.clearIdentities = function() { - return this.setIdentities(undefined); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.clearBalance = function() { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.oneofGroups_[0], undefined); }; @@ -7291,7 +7153,7 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.pr * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.hasIdentities = function() { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.hasBalance = function() { return jspb.Message.getField(this, 1) != null; }; @@ -7300,7 +7162,7 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.pr * optional Proof proof = 2; * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.getProof = function() { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.getProof = function() { return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; @@ -7308,18 +7170,18 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.pr /** * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.clearProof = function() { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.clearProof = function() { return this.setProof(undefined); }; @@ -7328,7 +7190,7 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.pr * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.hasProof = function() { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.hasProof = function() { return jspb.Message.getField(this, 2) != null; }; @@ -7337,7 +7199,7 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.pr * optional ResponseMetadata metadata = 3; * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.getMetadata = function() { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.getMetadata = function() { return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); }; @@ -7345,18 +7207,18 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.pr /** * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.setMetadata = function(value) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.setMetadata = function(value) { return jspb.Message.setWrapperField(this, 3, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.clearMetadata = function() { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.clearMetadata = function() { return this.setMetadata(undefined); }; @@ -7365,35 +7227,35 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.pr * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.hasMetadata = function() { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.hasMetadata = function() { return jspb.Message.getField(this, 3) != null; }; /** - * optional GetIdentitiesResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} + * optional GetIdentityBalanceResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -7402,7 +7264,7 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.clearV0 = functi * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -7416,21 +7278,21 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.hasV0 = function * @private {!Array>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.VersionCase = { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.oneofGroups_[0])); }; @@ -7448,8 +7310,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.toObject(opt_includeInstance, this); }; @@ -7458,13 +7320,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.toObject = fu * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -7478,23 +7340,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.toObject = function(inc /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse; - return proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse; + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -7502,8 +7364,8 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.deserializeBinaryFromRe var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -7519,9 +7381,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.deserializeBinaryFromRe * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -7529,18 +7391,18 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.serializeBina /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.serializeBinaryToWriter ); } }; @@ -7555,22 +7417,22 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.serializeBinaryToWriter * @private {!Array>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_ = [[1,2]]; +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.oneofGroups_ = [[1,2]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.ResultCase = { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.ResultCase = { RESULT_NOT_SET: 0, - IDENTITY_NONCE: 1, + BALANCE_AND_REVISION: 1, PROOF: 2 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.ResultCase} + * @return {proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.ResultCase} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.oneofGroups_[0])); }; @@ -7588,8 +7450,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.toObject(opt_includeInstance, this); }; @@ -7598,13 +7460,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceRespons * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - identityNonce: jspb.Message.getFieldWithDefault(msg, 1, 0), + balanceAndRevision: (f = msg.getBalanceAndRevision()) && proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.toObject(includeInstance, f), proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; @@ -7620,23 +7482,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceRespons /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0; - return proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0; + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -7644,8 +7506,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceRespons var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {number} */ (reader.readUint64()); - msg.setIdentityNonce(value); + var value = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.deserializeBinaryFromReader); + msg.setBalanceAndRevision(value); break; case 2: var value = new proto.org.dash.platform.dapi.v0.Proof; @@ -7670,9 +7533,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceRespons * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -7680,17 +7543,18 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceRespons /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = /** @type {number} */ (jspb.Message.getField(message, 1)); + f = message.getBalanceAndRevision(); if (f != null) { - writer.writeUint64( + writer.writeMessage( 1, - f + f, + proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.serializeBinaryToWriter ); } f = message.getProof(); @@ -7712,289 +7576,311 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceRespons }; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * optional uint64 identity_nonce = 1; - * @return {number} + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.getIdentityNonce = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.toObject(opt_includeInstance, this); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.setIdentityNonce = function(value) { - return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.toObject = function(includeInstance, msg) { + var f, obj = { + balance: jspb.Message.getFieldWithDefault(msg, 1, 0), + revision: jspb.Message.getFieldWithDefault(msg, 2, 0) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.clearIdentityNonce = function() { - return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_[0], undefined); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision; + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.deserializeBinaryFromReader(msg, reader); }; /** - * Returns whether this field is set. - * @return {boolean} + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.hasIdentityNonce = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {number} */ (reader.readUint64()); + msg.setBalance(value); + break; + case 2: + var value = /** @type {number} */ (reader.readUint64()); + msg.setRevision(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * optional Proof proof = 2; - * @return {?proto.org.dash.platform.dapi.v0.Proof} + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.getProof = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_[0], value); + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getBalance(); + if (f !== 0) { + writer.writeUint64( + 1, + f + ); + } + f = message.getRevision(); + if (f !== 0) { + writer.writeUint64( + 2, + f + ); + } }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this + * optional uint64 balance = 1; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.clearProof = function() { - return this.setProof(undefined); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.prototype.getBalance = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.hasProof = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.prototype.setBalance = function(value) { + return jspb.Message.setProto3IntField(this, 1, value); }; /** - * optional ResponseMetadata metadata = 3; - * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + * optional uint64 revision = 2; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.getMetadata = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.prototype.getRevision = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 3, value); + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.prototype.setRevision = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this + * optional BalanceAndRevision balance_and_revision = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.clearMetadata = function() { - return this.setMetadata(undefined); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.getBalanceAndRevision = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision, 1)); }; /** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 3) != null; + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.setBalanceAndRevision = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.oneofGroups_[0], value); }; /** - * optional GetIdentityNonceResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} - */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0, 1)); + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.clearBalanceAndRevision = function() { + return this.setBalanceAndRevision(undefined); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.oneofGroups_[0], value); + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.hasBalanceAndRevision = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} returns this + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.clearV0 = function() { - return this.setV0(undefined); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; /** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.oneofGroups_[0], value); }; - /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array>} - * @const + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); +}; + /** - * @enum {number} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; }; + /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.VersionCase} + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); }; +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.toObject = function(includeInstance, msg) { - var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.toObject(includeInstance, f) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} + * optional GetIdentityBalanceAndRevisionResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse; - return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0, 1)); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} - */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.deserializeBinaryFromReader); - msg.setV0(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.oneofGroups_[0], value); }; /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.clearV0 = function() { + return this.setV0(undefined); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.serializeBinaryToWriter - ); - } +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; }; @@ -8007,22 +7893,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.serializeBinary * @private {!Array>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_ = [[1,2]]; +proto.org.dash.platform.dapi.v0.KeyRequestType.oneofGroups_ = [[1,2,3]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.ResultCase = { - RESULT_NOT_SET: 0, - IDENTITY_CONTRACT_NONCE: 1, - PROOF: 2 +proto.org.dash.platform.dapi.v0.KeyRequestType.RequestCase = { + REQUEST_NOT_SET: 0, + ALL_KEYS: 1, + SPECIFIC_KEYS: 2, + SEARCH_KEY: 3 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.ResultCase} + * @return {proto.org.dash.platform.dapi.v0.KeyRequestType.RequestCase} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.getRequestCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.KeyRequestType.RequestCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.KeyRequestType.oneofGroups_[0])); }; @@ -8040,8 +7927,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.KeyRequestType.toObject(opt_includeInstance, this); }; @@ -8050,15 +7937,15 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityCont * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.KeyRequestType} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.KeyRequestType.toObject = function(includeInstance, msg) { var f, obj = { - identityContractNonce: jspb.Message.getFieldWithDefault(msg, 1, 0), - proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), - metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + allKeys: (f = msg.getAllKeys()) && proto.org.dash.platform.dapi.v0.AllKeys.toObject(includeInstance, f), + specificKeys: (f = msg.getSpecificKeys()) && proto.org.dash.platform.dapi.v0.SpecificKeys.toObject(includeInstance, f), + searchKey: (f = msg.getSearchKey()) && proto.org.dash.platform.dapi.v0.SearchKey.toObject(includeInstance, f) }; if (includeInstance) { @@ -8072,23 +7959,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityCont /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.KeyRequestType.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0; - return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.KeyRequestType; + return proto.org.dash.platform.dapi.v0.KeyRequestType.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.KeyRequestType} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.KeyRequestType.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -8096,18 +7983,19 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityCont var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {number} */ (reader.readUint64()); - msg.setIdentityContractNonce(value); + var value = new proto.org.dash.platform.dapi.v0.AllKeys; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.AllKeys.deserializeBinaryFromReader); + msg.setAllKeys(value); break; case 2: - var value = new proto.org.dash.platform.dapi.v0.Proof; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); - msg.setProof(value); + var value = new proto.org.dash.platform.dapi.v0.SpecificKeys; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.SpecificKeys.deserializeBinaryFromReader); + msg.setSpecificKeys(value); break; case 3: - var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); - msg.setMetadata(value); + var value = new proto.org.dash.platform.dapi.v0.SearchKey; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.SearchKey.deserializeBinaryFromReader); + msg.setSearchKey(value); break; default: reader.skipField(); @@ -8122,9 +8010,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityCont * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.KeyRequestType.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -8132,62 +8020,64 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityCont /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.KeyRequestType} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.KeyRequestType.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = /** @type {number} */ (jspb.Message.getField(message, 1)); + f = message.getAllKeys(); if (f != null) { - writer.writeUint64( + writer.writeMessage( 1, - f + f, + proto.org.dash.platform.dapi.v0.AllKeys.serializeBinaryToWriter ); } - f = message.getProof(); + f = message.getSpecificKeys(); if (f != null) { writer.writeMessage( 2, f, - proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.SpecificKeys.serializeBinaryToWriter ); } - f = message.getMetadata(); + f = message.getSearchKey(); if (f != null) { writer.writeMessage( 3, f, - proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.SearchKey.serializeBinaryToWriter ); } }; /** - * optional uint64 identity_contract_nonce = 1; - * @return {number} + * optional AllKeys all_keys = 1; + * @return {?proto.org.dash.platform.dapi.v0.AllKeys} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.getIdentityContractNonce = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.getAllKeys = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.AllKeys} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.AllKeys, 1)); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.setIdentityContractNonce = function(value) { - return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_[0], value); + * @param {?proto.org.dash.platform.dapi.v0.AllKeys|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} returns this +*/ +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.setAllKeys = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.KeyRequestType.oneofGroups_[0], value); }; /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.clearIdentityContractNonce = function() { - return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_[0], undefined); +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.clearAllKeys = function() { + return this.setAllKeys(undefined); }; @@ -8195,36 +8085,36 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityCont * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.hasIdentityContractNonce = function() { +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.hasAllKeys = function() { return jspb.Message.getField(this, 1) != null; }; /** - * optional Proof proof = 2; - * @return {?proto.org.dash.platform.dapi.v0.Proof} + * optional SpecificKeys specific_keys = 2; + * @return {?proto.org.dash.platform.dapi.v0.SpecificKeys} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.getProof = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.getSpecificKeys = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.SpecificKeys} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.SpecificKeys, 2)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.SpecificKeys|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.setSpecificKeys = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.KeyRequestType.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.clearProof = function() { - return this.setProof(undefined); +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.clearSpecificKeys = function() { + return this.setSpecificKeys(undefined); }; @@ -8232,36 +8122,36 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityCont * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.hasProof = function() { +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.hasSpecificKeys = function() { return jspb.Message.getField(this, 2) != null; }; /** - * optional ResponseMetadata metadata = 3; - * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + * optional SearchKey search_key = 3; + * @return {?proto.org.dash.platform.dapi.v0.SearchKey} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.getMetadata = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.getSearchKey = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.SearchKey} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.SearchKey, 3)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.SearchKey|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 3, value); +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.setSearchKey = function(value) { + return jspb.Message.setOneofWrapperField(this, 3, proto.org.dash.platform.dapi.v0.KeyRequestType.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.clearMetadata = function() { - return this.setMetadata(undefined); +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.clearSearchKey = function() { + return this.setSearchKey(undefined); }; @@ -8269,73 +8159,11 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityCont * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.hasMetadata = function() { +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.hasSearchKey = function() { return jspb.Message.getField(this, 3) != null; }; -/** - * optional GetIdentityContractNonceResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} - */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0, 1)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.clearV0 = function() { - return this.setV0(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; -}; - - - -/** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.oneofGroups_ = [[1]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.VersionCase} - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.oneofGroups_[0])); -}; @@ -8352,8 +8180,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.AllKeys.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.AllKeys.toObject(opt_includeInstance, this); }; @@ -8362,13 +8190,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.toObject = * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.AllKeys} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.AllKeys.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.toObject(includeInstance, f) + }; if (includeInstance) { @@ -8382,34 +8210,29 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.toObject = function(i /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} + * @return {!proto.org.dash.platform.dapi.v0.AllKeys} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.AllKeys.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse; - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.AllKeys; + return proto.org.dash.platform.dapi.v0.AllKeys.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.AllKeys} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} + * @return {!proto.org.dash.platform.dapi.v0.AllKeys} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.AllKeys.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; } var field = reader.getFieldNumber(); switch (field) { - case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.deserializeBinaryFromReader); - msg.setV0(value); - break; default: reader.skipField(); break; @@ -8423,9 +8246,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.deserializeBinaryFrom * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.AllKeys.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.AllKeys.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -8433,49 +8256,22 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.serializeBi /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} message + * @param {!proto.org.dash.platform.dapi.v0.AllKeys} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.AllKeys.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.serializeBinaryToWriter - ); - } }; /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array>} + * List of repeated fields within this message type. + * @private {!Array} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.oneofGroups_ = [[1,2]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.ResultCase = { - RESULT_NOT_SET: 0, - BALANCE: 1, - PROOF: 2 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.ResultCase} - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.oneofGroups_[0])); -}; +proto.org.dash.platform.dapi.v0.SpecificKeys.repeatedFields_ = [1]; @@ -8492,8 +8288,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.SpecificKeys.toObject(opt_includeInstance, this); }; @@ -8502,15 +8298,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceRes * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.SpecificKeys} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.SpecificKeys.toObject = function(includeInstance, msg) { var f, obj = { - balance: jspb.Message.getFieldWithDefault(msg, 1, 0), - proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), - metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + keyIdsList: (f = jspb.Message.getRepeatedField(msg, 1)) == null ? undefined : f }; if (includeInstance) { @@ -8524,23 +8318,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceRes /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.SpecificKeys} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.SpecificKeys.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0; - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.SpecificKeys; + return proto.org.dash.platform.dapi.v0.SpecificKeys.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.SpecificKeys} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.SpecificKeys} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.SpecificKeys.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -8548,18 +8342,10 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceRes var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {number} */ (reader.readUint64()); - msg.setBalance(value); - break; - case 2: - var value = new proto.org.dash.platform.dapi.v0.Proof; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); - msg.setProof(value); - break; - case 3: - var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); - msg.setMetadata(value); + var values = /** @type {!Array} */ (reader.isDelimited() ? reader.readPackedUint32() : [reader.readUint32()]); + for (var i = 0; i < values.length; i++) { + msg.addKeyIds(values[i]); + } break; default: reader.skipField(); @@ -8574,9 +8360,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceRes * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.SpecificKeys.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -8584,211 +8370,60 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceRes /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.SpecificKeys} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.SpecificKeys.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = /** @type {number} */ (jspb.Message.getField(message, 1)); - if (f != null) { - writer.writeUint64( + f = message.getKeyIdsList(); + if (f.length > 0) { + writer.writePackedUint32( 1, f ); } - f = message.getProof(); - if (f != null) { - writer.writeMessage( - 2, - f, - proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter - ); - } - f = message.getMetadata(); - if (f != null) { - writer.writeMessage( - 3, - f, - proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter - ); - } -}; - - -/** - * optional uint64 balance = 1; - * @return {number} - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.getBalance = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.setBalance = function(value) { - return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.oneofGroups_[0], value); -}; - - -/** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.clearBalance = function() { - return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.oneofGroups_[0], undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.hasBalance = function() { - return jspb.Message.getField(this, 1) != null; -}; - - -/** - * optional Proof proof = 2; - * @return {?proto.org.dash.platform.dapi.v0.Proof} - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.getProof = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.clearProof = function() { - return this.setProof(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.hasProof = function() { - return jspb.Message.getField(this, 2) != null; -}; - - -/** - * optional ResponseMetadata metadata = 3; - * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.getMetadata = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 3, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.clearMetadata = function() { - return this.setMetadata(undefined); }; /** - * Returns whether this field is set. - * @return {boolean} + * repeated uint32 key_ids = 1; + * @return {!Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.getKeyIdsList = function() { + return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 1)); }; /** - * optional GetIdentityBalanceResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} + * @param {!Array} value + * @return {!proto.org.dash.platform.dapi.v0.SpecificKeys} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0, 1)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.setKeyIdsList = function(value) { + return jspb.Message.setField(this, 1, value || []); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} returns this + * @param {number} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.SpecificKeys} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.clearV0 = function() { - return this.setV0(undefined); +proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.addKeyIds = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 1, value, opt_index); }; /** - * Returns whether this field is set. - * @return {boolean} + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.SpecificKeys} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.clearKeyIdsList = function() { + return this.setKeyIdsList([]); }; -/** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.oneofGroups_ = [[1]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.VersionCase} - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.oneofGroups_[0])); -}; - if (jspb.Message.GENERATE_TO_OBJECT) { @@ -8804,8 +8439,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.SearchKey.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.SearchKey.toObject(opt_includeInstance, this); }; @@ -8814,13 +8449,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype. * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.SearchKey} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.SearchKey.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.toObject(includeInstance, f) + purposeMapMap: (f = msg.getPurposeMapMap()) ? f.toObject(includeInstance, proto.org.dash.platform.dapi.v0.SecurityLevelMap.toObject) : [] }; if (includeInstance) { @@ -8834,23 +8469,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.toObject = /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} + * @return {!proto.org.dash.platform.dapi.v0.SearchKey} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.SearchKey.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse; - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.SearchKey; + return proto.org.dash.platform.dapi.v0.SearchKey.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.SearchKey} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} + * @return {!proto.org.dash.platform.dapi.v0.SearchKey} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.SearchKey.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -8858,9 +8493,10 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.deserializ var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.deserializeBinaryFromReader); - msg.setV0(value); + var value = msg.getPurposeMapMap(); + reader.readMessage(value, function(message, reader) { + jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readUint32, jspb.BinaryReader.prototype.readMessage, proto.org.dash.platform.dapi.v0.SecurityLevelMap.deserializeBinaryFromReader, 0, new proto.org.dash.platform.dapi.v0.SecurityLevelMap()); + }); break; default: reader.skipField(); @@ -8875,9 +8511,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.deserializ * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.SearchKey.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.SearchKey.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -8885,49 +8521,41 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype. /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} message + * @param {!proto.org.dash.platform.dapi.v0.SearchKey} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.SearchKey.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.serializeBinaryToWriter - ); + f = message.getPurposeMapMap(true); + if (f && f.getLength() > 0) { + f.serializeBinary(1, writer, jspb.BinaryWriter.prototype.writeUint32, jspb.BinaryWriter.prototype.writeMessage, proto.org.dash.platform.dapi.v0.SecurityLevelMap.serializeBinaryToWriter); } }; - -/** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.oneofGroups_ = [[1,2]]; - /** - * @enum {number} + * map purpose_map = 1; + * @param {boolean=} opt_noLazyCreate Do not create the map if + * empty, instead returning `undefined` + * @return {!jspb.Map} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.ResultCase = { - RESULT_NOT_SET: 0, - BALANCE_AND_REVISION: 1, - PROOF: 2 +proto.org.dash.platform.dapi.v0.SearchKey.prototype.getPurposeMapMap = function(opt_noLazyCreate) { + return /** @type {!jspb.Map} */ ( + jspb.Message.getMapField(this, 1, opt_noLazyCreate, + proto.org.dash.platform.dapi.v0.SecurityLevelMap)); }; + /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.ResultCase} + * Clears values from the map. The map will be non-null. + * @return {!proto.org.dash.platform.dapi.v0.SearchKey} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.oneofGroups_[0])); -}; +proto.org.dash.platform.dapi.v0.SearchKey.prototype.clearPurposeMapMap = function() { + this.getPurposeMapMap().clear(); + return this;}; + + @@ -8944,8 +8572,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.SecurityLevelMap.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.SecurityLevelMap.toObject(opt_includeInstance, this); }; @@ -8954,15 +8582,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.SecurityLevelMap} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.SecurityLevelMap.toObject = function(includeInstance, msg) { var f, obj = { - balanceAndRevision: (f = msg.getBalanceAndRevision()) && proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.toObject(includeInstance, f), - proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), - metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + securityLevelMapMap: (f = msg.getSecurityLevelMapMap()) ? f.toObject(includeInstance, undefined) : [] }; if (includeInstance) { @@ -8976,23 +8602,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.SecurityLevelMap} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.SecurityLevelMap.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0; - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.SecurityLevelMap; + return proto.org.dash.platform.dapi.v0.SecurityLevelMap.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.SecurityLevelMap} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.SecurityLevelMap} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.SecurityLevelMap.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -9000,19 +8626,10 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.deserializeBinaryFromReader); - msg.setBalanceAndRevision(value); - break; - case 2: - var value = new proto.org.dash.platform.dapi.v0.Proof; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); - msg.setProof(value); - break; - case 3: - var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); - msg.setMetadata(value); + var value = msg.getSecurityLevelMapMap(); + reader.readMessage(value, function(message, reader) { + jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readUint32, jspb.BinaryReader.prototype.readEnum, null, 0, 0); + }); break; default: reader.skipField(); @@ -9027,9 +8644,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.SecurityLevelMap.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.SecurityLevelMap.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -9037,39 +8654,74 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.SecurityLevelMap} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.SecurityLevelMap.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getBalanceAndRevision(); - if (f != null) { - writer.writeMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.serializeBinaryToWriter - ); - } - f = message.getProof(); - if (f != null) { - writer.writeMessage( - 2, - f, - proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter - ); - } - f = message.getMetadata(); - if (f != null) { - writer.writeMessage( - 3, - f, - proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter - ); + f = message.getSecurityLevelMapMap(true); + if (f && f.getLength() > 0) { + f.serializeBinary(1, writer, jspb.BinaryWriter.prototype.writeUint32, jspb.BinaryWriter.prototype.writeEnum); } }; +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.SecurityLevelMap.KeyKindRequestType = { + CURRENT_KEY_OF_KIND_REQUEST: 0, + ALL_KEYS_OF_KIND_REQUEST: 1 +}; + +/** + * map security_level_map = 1; + * @param {boolean=} opt_noLazyCreate Do not create the map if + * empty, instead returning `undefined` + * @return {!jspb.Map} + */ +proto.org.dash.platform.dapi.v0.SecurityLevelMap.prototype.getSecurityLevelMapMap = function(opt_noLazyCreate) { + return /** @type {!jspb.Map} */ ( + jspb.Message.getMapField(this, 1, opt_noLazyCreate, + null)); +}; + + +/** + * Clears values from the map. The map will be non-null. + * @return {!proto.org.dash.platform.dapi.v0.SecurityLevelMap} returns this + */ +proto.org.dash.platform.dapi.v0.SecurityLevelMap.prototype.clearSecurityLevelMapMap = function() { + this.getSecurityLevelMapMap().clear(); + return this;}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.oneofGroups_[0])); +}; @@ -9086,8 +8738,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.toObject(opt_includeInstance, this); }; @@ -9096,14 +8748,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.toObject = function(includeInstance, msg) { var f, obj = { - balance: jspb.Message.getFieldWithDefault(msg, 1, 0), - revision: jspb.Message.getFieldWithDefault(msg, 2, 0) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -9117,23 +8768,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision; - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest; + return proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -9141,12 +8792,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {number} */ (reader.readUint64()); - msg.setBalance(value); - break; - case 2: - var value = /** @type {number} */ (reader.readUint64()); - msg.setRevision(value); + var value = new proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.deserializeBinaryFromReader); + msg.setV0(value); break; default: reader.skipField(); @@ -9161,9 +8809,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -9171,164 +8819,256 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getBalance(); - if (f !== 0) { - writer.writeUint64( + f = message.getV0(); + if (f != null) { + writer.writeMessage( 1, - f - ); - } - f = message.getRevision(); - if (f !== 0) { - writer.writeUint64( - 2, - f + f, + proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.serializeBinaryToWriter ); } }; -/** - * optional uint64 balance = 1; - * @return {number} - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.prototype.getBalance = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); -}; + +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} returns this + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.prototype.setBalance = function(value) { - return jspb.Message.setProto3IntField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.toObject(opt_includeInstance, this); }; /** - * optional uint64 revision = 2; - * @return {number} + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.prototype.getRevision = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); -}; - +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.toObject = function(includeInstance, msg) { + var f, obj = { + identityId: msg.getIdentityId_asB64(), + requestType: (f = msg.getRequestType()) && proto.org.dash.platform.dapi.v0.KeyRequestType.toObject(includeInstance, f), + limit: (f = msg.getLimit()) && google_protobuf_wrappers_pb.UInt32Value.toObject(includeInstance, f), + offset: (f = msg.getOffset()) && google_protobuf_wrappers_pb.UInt32Value.toObject(includeInstance, f), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 5, false) + }; -/** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.prototype.setRevision = function(value) { - return jspb.Message.setProto3IntField(this, 2, value); + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * optional BalanceAndRevision balance_and_revision = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.getBalanceAndRevision = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision, 1)); +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0; + return proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.deserializeBinaryFromReader(msg, reader); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.setBalanceAndRevision = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.oneofGroups_[0], value); + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setIdentityId(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.KeyRequestType; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.KeyRequestType.deserializeBinaryFromReader); + msg.setRequestType(value); + break; + case 3: + var value = new google_protobuf_wrappers_pb.UInt32Value; + reader.readMessage(value,google_protobuf_wrappers_pb.UInt32Value.deserializeBinaryFromReader); + msg.setLimit(value); + break; + case 4: + var value = new google_protobuf_wrappers_pb.UInt32Value; + reader.readMessage(value,google_protobuf_wrappers_pb.UInt32Value.deserializeBinaryFromReader); + msg.setOffset(value); + break; + case 5: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} returns this + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.clearBalanceAndRevision = function() { - return this.setBalanceAndRevision(undefined); +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * Returns whether this field is set. - * @return {boolean} + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.hasBalanceAndRevision = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getIdentityId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getRequestType(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.KeyRequestType.serializeBinaryToWriter + ); + } + f = message.getLimit(); + if (f != null) { + writer.writeMessage( + 3, + f, + google_protobuf_wrappers_pb.UInt32Value.serializeBinaryToWriter + ); + } + f = message.getOffset(); + if (f != null) { + writer.writeMessage( + 4, + f, + google_protobuf_wrappers_pb.UInt32Value.serializeBinaryToWriter + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 5, + f + ); + } }; /** - * optional Proof proof = 2; - * @return {?proto.org.dash.platform.dapi.v0.Proof} + * optional bytes identity_id = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.getProof = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getIdentityId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.oneofGroups_[0], value); + * optional bytes identity_id = 1; + * This is a type-conversion wrapper around `getIdentityId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getIdentityId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getIdentityId())); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} returns this + * optional bytes identity_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIdentityId()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.clearProof = function() { - return this.setProof(undefined); +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getIdentityId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getIdentityId())); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.hasProof = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.setIdentityId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * optional ResponseMetadata metadata = 3; - * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + * optional KeyRequestType request_type = 2; + * @return {?proto.org.dash.platform.dapi.v0.KeyRequestType} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.getMetadata = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getRequestType = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.KeyRequestType} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.KeyRequestType, 2)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.KeyRequestType|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.setRequestType = function(value) { + return jspb.Message.setWrapperField(this, 2, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.clearMetadata = function() { - return this.setMetadata(undefined); +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.clearRequestType = function() { + return this.setRequestType(undefined); }; @@ -9336,36 +9076,36 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.hasRequestType = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * optional GetIdentityBalanceAndRevisionResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} + * optional google.protobuf.UInt32Value limit = 3; + * @return {?proto.google.protobuf.UInt32Value} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getLimit = function() { + return /** @type{?proto.google.protobuf.UInt32Value} */ ( + jspb.Message.getWrapperField(this, google_protobuf_wrappers_pb.UInt32Value, 3)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} returns this + * @param {?proto.google.protobuf.UInt32Value|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.setLimit = function(value) { + return jspb.Message.setWrapperField(this, 3, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.clearV0 = function() { - return this.setV0(undefined); +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.clearLimit = function() { + return this.setLimit(undefined); }; @@ -9373,37 +9113,127 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype. * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.hasLimit = function() { + return jspb.Message.getField(this, 3) != null; }; - /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array>} - * @const + * optional google.protobuf.UInt32Value offset = 4; + * @return {?proto.google.protobuf.UInt32Value} */ -proto.org.dash.platform.dapi.v0.KeyRequestType.oneofGroups_ = [[1,2,3]]; +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getOffset = function() { + return /** @type{?proto.google.protobuf.UInt32Value} */ ( + jspb.Message.getWrapperField(this, google_protobuf_wrappers_pb.UInt32Value, 4)); +}; + + +/** + * @param {?proto.google.protobuf.UInt32Value|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.setOffset = function(value) { + return jspb.Message.setWrapperField(this, 4, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.clearOffset = function() { + return this.setOffset(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.hasOffset = function() { + return jspb.Message.getField(this, 4) != null; +}; + + +/** + * optional bool prove = 5; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 5, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 5, value); +}; + + +/** + * optional GetIdentityKeysRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.KeyRequestType.RequestCase = { - REQUEST_NOT_SET: 0, - ALL_KEYS: 1, - SPECIFIC_KEYS: 2, - SEARCH_KEY: 3 +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.KeyRequestType.RequestCase} + * @return {proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.getRequestCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.KeyRequestType.RequestCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.KeyRequestType.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.oneofGroups_[0])); }; @@ -9421,8 +9251,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.KeyRequestType.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.toObject(opt_includeInstance, this); }; @@ -9431,15 +9261,13 @@ proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.toObject = function(opt * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.KeyRequestType} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.KeyRequestType.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.toObject = function(includeInstance, msg) { var f, obj = { - allKeys: (f = msg.getAllKeys()) && proto.org.dash.platform.dapi.v0.AllKeys.toObject(includeInstance, f), - specificKeys: (f = msg.getSpecificKeys()) && proto.org.dash.platform.dapi.v0.SpecificKeys.toObject(includeInstance, f), - searchKey: (f = msg.getSearchKey()) && proto.org.dash.platform.dapi.v0.SearchKey.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -9453,23 +9281,23 @@ proto.org.dash.platform.dapi.v0.KeyRequestType.toObject = function(includeInstan /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} */ -proto.org.dash.platform.dapi.v0.KeyRequestType.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.KeyRequestType; - return proto.org.dash.platform.dapi.v0.KeyRequestType.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse; + return proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.KeyRequestType} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} */ -proto.org.dash.platform.dapi.v0.KeyRequestType.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -9477,19 +9305,9 @@ proto.org.dash.platform.dapi.v0.KeyRequestType.deserializeBinaryFromReader = fun var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.AllKeys; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.AllKeys.deserializeBinaryFromReader); - msg.setAllKeys(value); - break; - case 2: - var value = new proto.org.dash.platform.dapi.v0.SpecificKeys; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.SpecificKeys.deserializeBinaryFromReader); - msg.setSpecificKeys(value); - break; - case 3: - var value = new proto.org.dash.platform.dapi.v0.SearchKey; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.SearchKey.deserializeBinaryFromReader); - msg.setSearchKey(value); + var value = new proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.deserializeBinaryFromReader); + msg.setV0(value); break; default: reader.skipField(); @@ -9504,9 +9322,9 @@ proto.org.dash.platform.dapi.v0.KeyRequestType.deserializeBinaryFromReader = fun * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.KeyRequestType.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -9514,168 +9332,67 @@ proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.serializeBinary = funct /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.KeyRequestType} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.KeyRequestType.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getAllKeys(); + f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.AllKeys.serializeBinaryToWriter - ); - } - f = message.getSpecificKeys(); - if (f != null) { - writer.writeMessage( - 2, - f, - proto.org.dash.platform.dapi.v0.SpecificKeys.serializeBinaryToWriter - ); - } - f = message.getSearchKey(); - if (f != null) { - writer.writeMessage( - 3, - f, - proto.org.dash.platform.dapi.v0.SearchKey.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.serializeBinaryToWriter ); } }; -/** - * optional AllKeys all_keys = 1; - * @return {?proto.org.dash.platform.dapi.v0.AllKeys} - */ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.getAllKeys = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.AllKeys} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.AllKeys, 1)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.AllKeys|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} returns this -*/ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.setAllKeys = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.KeyRequestType.oneofGroups_[0], value); -}; - /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} returns this + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} + * @const */ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.clearAllKeys = function() { - return this.setAllKeys(undefined); -}; - +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.oneofGroups_ = [[1,2]]; /** - * Returns whether this field is set. - * @return {boolean} + * @enum {number} */ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.hasAllKeys = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + KEYS: 1, + PROOF: 2 }; - /** - * optional SpecificKeys specific_keys = 2; - * @return {?proto.org.dash.platform.dapi.v0.SpecificKeys} + * @return {proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.ResultCase} */ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.getSpecificKeys = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.SpecificKeys} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.SpecificKeys, 2)); +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.oneofGroups_[0])); }; -/** - * @param {?proto.org.dash.platform.dapi.v0.SpecificKeys|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} returns this -*/ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.setSpecificKeys = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.KeyRequestType.oneofGroups_[0], value); -}; - +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} returns this + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.clearSpecificKeys = function() { - return this.setSpecificKeys(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.hasSpecificKeys = function() { - return jspb.Message.getField(this, 2) != null; -}; - - -/** - * optional SearchKey search_key = 3; - * @return {?proto.org.dash.platform.dapi.v0.SearchKey} - */ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.getSearchKey = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.SearchKey} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.SearchKey, 3)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.SearchKey|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} returns this -*/ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.setSearchKey = function(value) { - return jspb.Message.setOneofWrapperField(this, 3, proto.org.dash.platform.dapi.v0.KeyRequestType.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} returns this - */ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.clearSearchKey = function() { - return this.setSearchKey(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.hasSearchKey = function() { - return jspb.Message.getField(this, 3) != null; -}; - - - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.org.dash.platform.dapi.v0.AllKeys.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.AllKeys.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.toObject(opt_includeInstance, this); }; @@ -9684,13 +9401,15 @@ proto.org.dash.platform.dapi.v0.AllKeys.prototype.toObject = function(opt_includ * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.AllKeys} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.AllKeys.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - + keys: (f = msg.getKeys()) && proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.toObject(includeInstance, f), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; if (includeInstance) { @@ -9704,29 +9423,44 @@ proto.org.dash.platform.dapi.v0.AllKeys.toObject = function(includeInstance, msg /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.AllKeys} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} */ -proto.org.dash.platform.dapi.v0.AllKeys.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.AllKeys; - return proto.org.dash.platform.dapi.v0.AllKeys.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0; + return proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.AllKeys} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.AllKeys} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} */ -proto.org.dash.platform.dapi.v0.AllKeys.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; } var field = reader.getFieldNumber(); switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.deserializeBinaryFromReader); + msg.setKeys(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); + break; default: reader.skipField(); break; @@ -9740,9 +9474,9 @@ proto.org.dash.platform.dapi.v0.AllKeys.deserializeBinaryFromReader = function(m * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.AllKeys.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.AllKeys.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -9750,12 +9484,36 @@ proto.org.dash.platform.dapi.v0.AllKeys.prototype.serializeBinary = function() { /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.AllKeys} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.AllKeys.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; + f = message.getKeys(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.serializeBinaryToWriter + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); + } }; @@ -9765,7 +9523,7 @@ proto.org.dash.platform.dapi.v0.AllKeys.serializeBinaryToWriter = function(messa * @private {!Array} * @const */ -proto.org.dash.platform.dapi.v0.SpecificKeys.repeatedFields_ = [1]; +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.repeatedFields_ = [1]; @@ -9782,8 +9540,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.SpecificKeys.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.toObject(opt_includeInstance, this); }; @@ -9792,13 +9550,13 @@ proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.toObject = function(opt_i * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.SpecificKeys} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.SpecificKeys.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.toObject = function(includeInstance, msg) { var f, obj = { - keyIdsList: (f = jspb.Message.getRepeatedField(msg, 1)) == null ? undefined : f + keysBytesList: msg.getKeysBytesList_asB64() }; if (includeInstance) { @@ -9812,23 +9570,23 @@ proto.org.dash.platform.dapi.v0.SpecificKeys.toObject = function(includeInstance /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.SpecificKeys} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} */ -proto.org.dash.platform.dapi.v0.SpecificKeys.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.SpecificKeys; - return proto.org.dash.platform.dapi.v0.SpecificKeys.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys; + return proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.SpecificKeys} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.SpecificKeys} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} */ -proto.org.dash.platform.dapi.v0.SpecificKeys.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -9836,10 +9594,8 @@ proto.org.dash.platform.dapi.v0.SpecificKeys.deserializeBinaryFromReader = funct var field = reader.getFieldNumber(); switch (field) { case 1: - var values = /** @type {!Array} */ (reader.isDelimited() ? reader.readPackedUint32() : [reader.readUint32()]); - for (var i = 0; i < values.length; i++) { - msg.addKeyIds(values[i]); - } + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addKeysBytes(value); break; default: reader.skipField(); @@ -9854,9 +9610,9 @@ proto.org.dash.platform.dapi.v0.SpecificKeys.deserializeBinaryFromReader = funct * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.SpecificKeys.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -9864,15 +9620,15 @@ proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.serializeBinary = functio /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.SpecificKeys} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.SpecificKeys.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getKeyIdsList(); + f = message.getKeysBytesList_asU8(); if (f.length > 0) { - writer.writePackedUint32( + writer.writeRepeatedBytes( 1, f ); @@ -9881,175 +9637,239 @@ proto.org.dash.platform.dapi.v0.SpecificKeys.serializeBinaryToWriter = function( /** - * repeated uint32 key_ids = 1; - * @return {!Array} + * repeated bytes keys_bytes = 1; + * @return {!Array} */ -proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.getKeyIdsList = function() { - return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 1)); +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.getKeysBytesList = function() { + return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 1)); }; /** - * @param {!Array} value - * @return {!proto.org.dash.platform.dapi.v0.SpecificKeys} returns this + * repeated bytes keys_bytes = 1; + * This is a type-conversion wrapper around `getKeysBytesList()` + * @return {!Array} */ -proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.setKeyIdsList = function(value) { +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.getKeysBytesList_asB64 = function() { + return /** @type {!Array} */ (jspb.Message.bytesListAsB64( + this.getKeysBytesList())); +}; + + +/** + * repeated bytes keys_bytes = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getKeysBytesList()` + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.getKeysBytesList_asU8 = function() { + return /** @type {!Array} */ (jspb.Message.bytesListAsU8( + this.getKeysBytesList())); +}; + + +/** + * @param {!(Array|Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.setKeysBytesList = function(value) { return jspb.Message.setField(this, 1, value || []); }; /** - * @param {number} value + * @param {!(string|Uint8Array)} value * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.SpecificKeys} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} returns this */ -proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.addKeyIds = function(value, opt_index) { +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.addKeysBytes = function(value, opt_index) { return jspb.Message.addToRepeatedField(this, 1, value, opt_index); }; /** * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.SpecificKeys} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} returns this */ -proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.clearKeyIdsList = function() { - return this.setKeyIdsList([]); +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.clearKeysBytesList = function() { + return this.setKeysBytesList([]); }; - - - -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * optional Keys keys = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} */ -proto.org.dash.platform.dapi.v0.SearchKey.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.SearchKey.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.getKeys = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys, 1)); }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.SearchKey} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.setKeys = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.SearchKey.toObject = function(includeInstance, msg) { - var f, obj = { - purposeMapMap: (f = msg.getPurposeMapMap()) ? f.toObject(includeInstance, proto.org.dash.platform.dapi.v0.SecurityLevelMap.toObject) : [] - }; +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.clearKeys = function() { + return this.setKeys(undefined); +}; - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.hasKeys = function() { + return jspb.Message.getField(this, 1) != null; }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.SearchKey} + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.SearchKey.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.SearchKey; - return proto.org.dash.platform.dapi.v0.SearchKey.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.SearchKey} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.SearchKey} + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.SearchKey.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = msg.getPurposeMapMap(); - reader.readMessage(value, function(message, reader) { - jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readUint32, jspb.BinaryReader.prototype.readMessage, proto.org.dash.platform.dapi.v0.SecurityLevelMap.deserializeBinaryFromReader, 0, new proto.org.dash.platform.dapi.v0.SecurityLevelMap()); - }); - break; - default: - reader.skipField(); - break; - } - } - return msg; +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); }; /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.SearchKey.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.SearchKey.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.SearchKey} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.SearchKey.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getPurposeMapMap(true); - if (f && f.getLength() > 0) { - f.serializeBinary(1, writer, jspb.BinaryWriter.prototype.writeUint32, jspb.BinaryWriter.prototype.writeMessage, proto.org.dash.platform.dapi.v0.SecurityLevelMap.serializeBinaryToWriter); - } +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); }; /** - * map purpose_map = 1; - * @param {boolean=} opt_noLazyCreate Do not create the map if - * empty, instead returning `undefined` - * @return {!jspb.Map} + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.SearchKey.prototype.getPurposeMapMap = function(opt_noLazyCreate) { - return /** @type {!jspb.Map} */ ( - jspb.Message.getMapField(this, 1, opt_noLazyCreate, - proto.org.dash.platform.dapi.v0.SecurityLevelMap)); +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); }; /** - * Clears values from the map. The map will be non-null. - * @return {!proto.org.dash.platform.dapi.v0.SearchKey} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.SearchKey.prototype.clearPurposeMapMap = function() { - this.getPurposeMapMap().clear(); - return this;}; +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional GetIdentityKeysResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.oneofGroups_[0])); +}; @@ -10066,8 +9886,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.SecurityLevelMap.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.SecurityLevelMap.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.toObject(opt_includeInstance, this); }; @@ -10076,13 +9896,13 @@ proto.org.dash.platform.dapi.v0.SecurityLevelMap.prototype.toObject = function(o * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.SecurityLevelMap} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.SecurityLevelMap.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.toObject = function(includeInstance, msg) { var f, obj = { - securityLevelMapMap: (f = msg.getSecurityLevelMapMap()) ? f.toObject(includeInstance, undefined) : [] + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -10096,23 +9916,23 @@ proto.org.dash.platform.dapi.v0.SecurityLevelMap.toObject = function(includeInst /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.SecurityLevelMap} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest} */ -proto.org.dash.platform.dapi.v0.SecurityLevelMap.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.SecurityLevelMap; - return proto.org.dash.platform.dapi.v0.SecurityLevelMap.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest; + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.SecurityLevelMap} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.SecurityLevelMap} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest} */ -proto.org.dash.platform.dapi.v0.SecurityLevelMap.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -10120,10 +9940,9 @@ proto.org.dash.platform.dapi.v0.SecurityLevelMap.deserializeBinaryFromReader = f var field = reader.getFieldNumber(); switch (field) { case 1: - var value = msg.getSecurityLevelMapMap(); - reader.readMessage(value, function(message, reader) { - jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readUint32, jspb.BinaryReader.prototype.readEnum, null, 0, 0); - }); + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.deserializeBinaryFromReader); + msg.setV0(value); break; default: reader.skipField(); @@ -10138,9 +9957,9 @@ proto.org.dash.platform.dapi.v0.SecurityLevelMap.deserializeBinaryFromReader = f * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.SecurityLevelMap.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.SecurityLevelMap.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -10148,206 +9967,48 @@ proto.org.dash.platform.dapi.v0.SecurityLevelMap.prototype.serializeBinary = fun /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.SecurityLevelMap} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.SecurityLevelMap.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getSecurityLevelMapMap(true); - if (f && f.getLength() > 0) { - f.serializeBinary(1, writer, jspb.BinaryWriter.prototype.writeUint32, jspb.BinaryWriter.prototype.writeEnum); + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.serializeBinaryToWriter + ); } }; + /** - * @enum {number} + * List of repeated fields within this message type. + * @private {!Array} + * @const */ -proto.org.dash.platform.dapi.v0.SecurityLevelMap.KeyKindRequestType = { - CURRENT_KEY_OF_KIND_REQUEST: 0, - ALL_KEYS_OF_KIND_REQUEST: 1 -}; +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.repeatedFields_ = [1,4]; + + +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * map security_level_map = 1; - * @param {boolean=} opt_noLazyCreate Do not create the map if - * empty, instead returning `undefined` - * @return {!jspb.Map} + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.SecurityLevelMap.prototype.getSecurityLevelMapMap = function(opt_noLazyCreate) { - return /** @type {!jspb.Map} */ ( - jspb.Message.getMapField(this, 1, opt_noLazyCreate, - null)); -}; - - -/** - * Clears values from the map. The map will be non-null. - * @return {!proto.org.dash.platform.dapi.v0.SecurityLevelMap} returns this - */ -proto.org.dash.platform.dapi.v0.SecurityLevelMap.prototype.clearSecurityLevelMapMap = function() { - this.getSecurityLevelMapMap().clear(); - return this;}; - - - -/** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.oneofGroups_ = [[1]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.VersionCase} - */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.oneofGroups_[0])); -}; - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.toObject = function(includeInstance, msg) { - var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.toObject(includeInstance, f) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} - */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest; - return proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} - */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.deserializeBinaryFromReader); - msg.setV0(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.serializeBinaryToWriter - ); - } -}; - - - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.toObject(opt_includeInstance, this); }; @@ -10356,16 +10017,16 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0. * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - identityId: msg.getIdentityId_asB64(), - requestType: (f = msg.getRequestType()) && proto.org.dash.platform.dapi.v0.KeyRequestType.toObject(includeInstance, f), - limit: (f = msg.getLimit()) && google_protobuf_wrappers_pb.UInt32Value.toObject(includeInstance, f), - offset: (f = msg.getOffset()) && google_protobuf_wrappers_pb.UInt32Value.toObject(includeInstance, f), + identitiesIdsList: msg.getIdentitiesIdsList_asB64(), + contractId: msg.getContractId_asB64(), + documentTypeName: jspb.Message.getFieldWithDefault(msg, 3, ""), + purposesList: (f = jspb.Message.getRepeatedField(msg, 4)) == null ? undefined : f, prove: jspb.Message.getBooleanFieldWithDefault(msg, 5, false) }; @@ -10380,23 +10041,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0. /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0; - return proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0; + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -10405,22 +10066,21 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0. switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setIdentityId(value); + msg.addIdentitiesIds(value); break; case 2: - var value = new proto.org.dash.platform.dapi.v0.KeyRequestType; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.KeyRequestType.deserializeBinaryFromReader); - msg.setRequestType(value); + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setContractId(value); break; case 3: - var value = new google_protobuf_wrappers_pb.UInt32Value; - reader.readMessage(value,google_protobuf_wrappers_pb.UInt32Value.deserializeBinaryFromReader); - msg.setLimit(value); + var value = /** @type {string} */ (reader.readString()); + msg.setDocumentTypeName(value); break; case 4: - var value = new google_protobuf_wrappers_pb.UInt32Value; - reader.readMessage(value,google_protobuf_wrappers_pb.UInt32Value.deserializeBinaryFromReader); - msg.setOffset(value); + var values = /** @type {!Array} */ (reader.isDelimited() ? reader.readPackedEnum() : [reader.readEnum()]); + for (var i = 0; i < values.length; i++) { + msg.addPurposes(values[i]); + } break; case 5: var value = /** @type {boolean} */ (reader.readBool()); @@ -10439,9 +10099,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0. * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -10449,41 +10109,38 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0. /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getIdentityId_asU8(); + f = message.getIdentitiesIdsList_asU8(); if (f.length > 0) { - writer.writeBytes( + writer.writeRepeatedBytes( 1, f ); } - f = message.getRequestType(); - if (f != null) { - writer.writeMessage( + f = message.getContractId_asU8(); + if (f.length > 0) { + writer.writeBytes( 2, - f, - proto.org.dash.platform.dapi.v0.KeyRequestType.serializeBinaryToWriter + f ); } - f = message.getLimit(); + f = /** @type {string} */ (jspb.Message.getField(message, 3)); if (f != null) { - writer.writeMessage( + writer.writeString( 3, - f, - google_protobuf_wrappers_pb.UInt32Value.serializeBinaryToWriter + f ); } - f = message.getOffset(); - if (f != null) { - writer.writeMessage( + f = message.getPurposesList(); + if (f.length > 0) { + writer.writePackedEnum( 4, - f, - google_protobuf_wrappers_pb.UInt32Value.serializeBinaryToWriter + f ); } f = message.getProve(); @@ -10497,109 +10154,132 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0. /** - * optional bytes identity_id = 1; - * @return {string} + * repeated bytes identities_ids = 1; + * @return {!Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getIdentityId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getIdentitiesIdsList = function() { + return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 1)); }; /** - * optional bytes identity_id = 1; - * This is a type-conversion wrapper around `getIdentityId()` - * @return {string} + * repeated bytes identities_ids = 1; + * This is a type-conversion wrapper around `getIdentitiesIdsList()` + * @return {!Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getIdentityId_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getIdentityId())); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getIdentitiesIdsList_asB64 = function() { + return /** @type {!Array} */ (jspb.Message.bytesListAsB64( + this.getIdentitiesIdsList())); }; /** - * optional bytes identity_id = 1; + * repeated bytes identities_ids = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getIdentityId()` - * @return {!Uint8Array} + * This is a type-conversion wrapper around `getIdentitiesIdsList()` + * @return {!Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getIdentityId_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getIdentityId())); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getIdentitiesIdsList_asU8 = function() { + return /** @type {!Array} */ (jspb.Message.bytesListAsU8( + this.getIdentitiesIdsList())); }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this + * @param {!(Array|Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.setIdentityId = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.setIdentitiesIdsList = function(value) { + return jspb.Message.setField(this, 1, value || []); }; /** - * optional KeyRequestType request_type = 2; - * @return {?proto.org.dash.platform.dapi.v0.KeyRequestType} + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getRequestType = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.KeyRequestType} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.KeyRequestType, 2)); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.addIdentitiesIds = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 1, value, opt_index); }; /** - * @param {?proto.org.dash.platform.dapi.v0.KeyRequestType|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.setRequestType = function(value) { - return jspb.Message.setWrapperField(this, 2, value); + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.clearIdentitiesIdsList = function() { + return this.setIdentitiesIdsList([]); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this + * optional bytes contract_id = 2; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.clearRequestType = function() { - return this.setRequestType(undefined); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getContractId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** - * Returns whether this field is set. - * @return {boolean} + * optional bytes contract_id = 2; + * This is a type-conversion wrapper around `getContractId()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.hasRequestType = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getContractId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getContractId())); }; /** - * optional google.protobuf.UInt32Value limit = 3; - * @return {?proto.google.protobuf.UInt32Value} + * optional bytes contract_id = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getContractId()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getLimit = function() { - return /** @type{?proto.google.protobuf.UInt32Value} */ ( - jspb.Message.getWrapperField(this, google_protobuf_wrappers_pb.UInt32Value, 3)); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getContractId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getContractId())); }; /** - * @param {?proto.google.protobuf.UInt32Value|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.setLimit = function(value) { - return jspb.Message.setWrapperField(this, 3, value); + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.setContractId = function(value) { + return jspb.Message.setProto3BytesField(this, 2, value); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this + * optional string document_type_name = 3; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.clearLimit = function() { - return this.setLimit(undefined); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getDocumentTypeName = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.setDocumentTypeName = function(value) { + return jspb.Message.setField(this, 3, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.clearDocumentTypeName = function() { + return jspb.Message.setField(this, 3, undefined); }; @@ -10607,45 +10287,45 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0. * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.hasLimit = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.hasDocumentTypeName = function() { return jspb.Message.getField(this, 3) != null; }; /** - * optional google.protobuf.UInt32Value offset = 4; - * @return {?proto.google.protobuf.UInt32Value} + * repeated KeyPurpose purposes = 4; + * @return {!Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getOffset = function() { - return /** @type{?proto.google.protobuf.UInt32Value} */ ( - jspb.Message.getWrapperField(this, google_protobuf_wrappers_pb.UInt32Value, 4)); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getPurposesList = function() { + return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 4)); }; /** - * @param {?proto.google.protobuf.UInt32Value|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.setOffset = function(value) { - return jspb.Message.setWrapperField(this, 4, value); + * @param {!Array} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.setPurposesList = function(value) { + return jspb.Message.setField(this, 4, value || []); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this + * @param {!proto.org.dash.platform.dapi.v0.KeyPurpose} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.clearOffset = function() { - return this.setOffset(undefined); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.addPurposes = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 4, value, opt_index); }; /** - * Returns whether this field is set. - * @return {boolean} + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.hasOffset = function() { - return jspb.Message.getField(this, 4) != null; +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.clearPurposesList = function() { + return this.setPurposesList([]); }; @@ -10653,44 +10333,44 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0. * optional bool prove = 5; * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getProve = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getProve = function() { return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 5, false)); }; /** * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.setProve = function(value) { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.setProve = function(value) { return jspb.Message.setProto3BooleanField(this, 5, value); }; /** - * optional GetIdentityKeysRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} + * optional GetIdentitiesContractKeysRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -10699,7 +10379,7 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.clearV0 = funct * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -10713,21 +10393,21 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.hasV0 = functio * @private {!Array>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.VersionCase = { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.oneofGroups_[0])); }; @@ -10745,8 +10425,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.toObject(opt_includeInstance, this); }; @@ -10755,13 +10435,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.toObject = fun * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -10775,23 +10455,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.toObject = function(incl /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse; - return proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse; + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -10799,8 +10479,8 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.deserializeBinaryFromRea var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -10816,9 +10496,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.deserializeBinaryFromRea * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -10826,18 +10506,18 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.serializeBinar /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.serializeBinaryToWriter ); } }; @@ -10852,22 +10532,22 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.serializeBinaryToWriter * @private {!Array>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.oneofGroups_ = [[1,2]]; +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.oneofGroups_ = [[1,2]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.ResultCase = { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.ResultCase = { RESULT_NOT_SET: 0, - KEYS: 1, + IDENTITIES_KEYS: 1, PROOF: 2 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.ResultCase} + * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.ResultCase} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.oneofGroups_[0])); }; @@ -10885,8 +10565,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.toObject(opt_includeInstance, this); }; @@ -10895,13 +10575,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - keys: (f = msg.getKeys()) && proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.toObject(includeInstance, f), + identitiesKeys: (f = msg.getIdentitiesKeys()) && proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.toObject(includeInstance, f), proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; @@ -10917,23 +10597,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0; - return proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0; + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -10941,9 +10621,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.deserializeBinaryFromReader); - msg.setKeys(value); + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.deserializeBinaryFromReader); + msg.setIdentitiesKeys(value); break; case 2: var value = new proto.org.dash.platform.dapi.v0.Proof; @@ -10968,9 +10648,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -10978,18 +10658,18 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getKeys(); + f = message.getIdentitiesKeys(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.serializeBinaryToWriter ); } f = message.getProof(); @@ -11017,7 +10697,7 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV * @private {!Array} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.repeatedFields_ = [1]; +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.repeatedFields_ = [2]; @@ -11034,8 +10714,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.toObject(opt_includeInstance, this); }; @@ -11044,12 +10724,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.toObject = function(includeInstance, msg) { var f, obj = { + purpose: jspb.Message.getFieldWithDefault(msg, 1, 0), keysBytesList: msg.getKeysBytesList_asB64() }; @@ -11064,23 +10745,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys; - return proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys; + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -11088,6 +10769,10 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV var field = reader.getFieldNumber(); switch (field) { case 1: + var value = /** @type {!proto.org.dash.platform.dapi.v0.KeyPurpose} */ (reader.readEnum()); + msg.setPurpose(value); + break; + case 2: var value = /** @type {!Uint8Array} */ (reader.readBytes()); msg.addKeysBytes(value); break; @@ -11104,9 +10789,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -11114,16 +10799,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.serializeBinaryToWriter = function(message, writer) { var f = undefined; + f = message.getPurpose(); + if (f !== 0.0) { + writer.writeEnum( + 1, + f + ); + } f = message.getKeysBytesList_asU8(); if (f.length > 0) { writer.writeRepeatedBytes( - 1, + 2, f ); } @@ -11131,33 +10823,51 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV /** - * repeated bytes keys_bytes = 1; + * optional KeyPurpose purpose = 1; + * @return {!proto.org.dash.platform.dapi.v0.KeyPurpose} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.getPurpose = function() { + return /** @type {!proto.org.dash.platform.dapi.v0.KeyPurpose} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.KeyPurpose} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.setPurpose = function(value) { + return jspb.Message.setProto3EnumField(this, 1, value); +}; + + +/** + * repeated bytes keys_bytes = 2; * @return {!Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.getKeysBytesList = function() { - return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 1)); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.getKeysBytesList = function() { + return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 2)); }; /** - * repeated bytes keys_bytes = 1; + * repeated bytes keys_bytes = 2; * This is a type-conversion wrapper around `getKeysBytesList()` * @return {!Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.getKeysBytesList_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.getKeysBytesList_asB64 = function() { return /** @type {!Array} */ (jspb.Message.bytesListAsB64( this.getKeysBytesList())); }; /** - * repeated bytes keys_bytes = 1; + * repeated bytes keys_bytes = 2; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array * This is a type-conversion wrapper around `getKeysBytesList()` * @return {!Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.getKeysBytesList_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.getKeysBytesList_asU8 = function() { return /** @type {!Array} */ (jspb.Message.bytesListAsU8( this.getKeysBytesList())); }; @@ -11165,205 +10875,253 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV /** * @param {!(Array|Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.setKeysBytesList = function(value) { - return jspb.Message.setField(this, 1, value || []); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.setKeysBytesList = function(value) { + return jspb.Message.setField(this, 2, value || []); }; /** * @param {!(string|Uint8Array)} value * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.addKeysBytes = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.addKeysBytes = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 2, value, opt_index); }; /** * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.clearKeysBytesList = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.clearKeysBytesList = function() { return this.setKeysBytesList([]); }; + /** - * optional Keys keys = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} + * List of repeated fields within this message type. + * @private {!Array} + * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.getKeys = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys, 1)); -}; +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.repeatedFields_ = [2]; + +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.setKeys = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.oneofGroups_[0], value); + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.toObject(opt_includeInstance, this); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} returns this + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.clearKeys = function() { - return this.setKeys(undefined); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.toObject = function(includeInstance, msg) { + var f, obj = { + identityId: msg.getIdentityId_asB64(), + keysList: jspb.Message.toObjectList(msg.getKeysList(), + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.toObject, includeInstance) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * Returns whether this field is set. - * @return {boolean} + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.hasKeys = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys; + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.deserializeBinaryFromReader(msg, reader); }; /** - * optional Proof proof = 2; - * @return {?proto.org.dash.platform.dapi.v0.Proof} + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.getProof = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setIdentityId(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.deserializeBinaryFromReader); + msg.addKeys(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} returns this + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.clearProof = function() { - return this.setProof(undefined); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * Returns whether this field is set. - * @return {boolean} + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.hasProof = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getIdentityId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getKeysList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.serializeBinaryToWriter + ); + } }; /** - * optional ResponseMetadata metadata = 3; - * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + * optional bytes identity_id = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.getMetadata = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.getIdentityId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 3, value); + * optional bytes identity_id = 1; + * This is a type-conversion wrapper around `getIdentityId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.getIdentityId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getIdentityId())); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} returns this + * optional bytes identity_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIdentityId()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.clearMetadata = function() { - return this.setMetadata(undefined); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.getIdentityId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getIdentityId())); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.setIdentityId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * optional GetIdentityKeysResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} + * repeated PurposeKeys keys = 2; + * @return {!Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.getKeysList = function() { + return /** @type{!Array} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys, 2)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} returns this + * @param {!Array} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.setKeysList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 2, value); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} returns this + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.clearV0 = function() { - return this.setV0(undefined); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.addKeys = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 2, opt_value, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys, opt_index); }; /** - * Returns whether this field is set. - * @return {boolean} + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.clearKeysList = function() { + return this.setKeysList([]); }; /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array>} + * List of repeated fields within this message type. + * @private {!Array} * @const */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.oneofGroups_ = [[1]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetProofsRequest.VersionCase} - */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetProofsRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetProofsRequest.oneofGroups_[0])); -}; +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.repeatedFields_ = [1]; @@ -11380,8 +11138,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProofsRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.toObject(opt_includeInstance, this); }; @@ -11390,13 +11148,14 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.toObject = function(o * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.toObject(includeInstance, f) + entriesList: jspb.Message.toObjectList(msg.getEntriesList(), + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.toObject, includeInstance) }; if (includeInstance) { @@ -11410,23 +11169,23 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.toObject = function(includeInst /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest; - return proto.org.dash.platform.dapi.v0.GetProofsRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys; + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -11434,9 +11193,9 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.deserializeBinaryFromReader = f var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.deserializeBinaryFromReader); - msg.setV0(value); + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.deserializeBinaryFromReader); + msg.addEntries(value); break; default: reader.skipField(); @@ -11451,9 +11210,9 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.deserializeBinaryFromReader = f * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProofsRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -11461,176 +11220,235 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.serializeBinary = fun /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( + f = message.getEntriesList(); + if (f.length > 0) { + writer.writeRepeatedMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.serializeBinaryToWriter ); } }; - /** - * List of repeated fields within this message type. - * @private {!Array} - * @const + * repeated IdentityKeys entries = 1; + * @return {!Array} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.repeatedFields_ = [1,2,3]; +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.prototype.getEntriesList = function() { + return /** @type{!Array} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys, 1)); +}; +/** + * @param {!Array} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.prototype.setEntriesList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); +}; + -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.prototype.addEntries = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys, opt_index); }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.toObject = function(includeInstance, msg) { - var f, obj = { - identitiesList: jspb.Message.toObjectList(msg.getIdentitiesList(), - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.toObject, includeInstance), - contractsList: jspb.Message.toObjectList(msg.getContractsList(), - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.toObject, includeInstance), - documentsList: jspb.Message.toObjectList(msg.getDocumentsList(), - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.toObject, includeInstance) - }; +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.prototype.clearEntriesList = function() { + return this.setEntriesList([]); +}; - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; + +/** + * optional IdentitiesKeys identities_keys = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.getIdentitiesKeys = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys, 1)); }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} + * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.setIdentitiesKeys = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0; - return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.clearIdentitiesKeys = function() { + return this.setIdentitiesKeys(undefined); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.deserializeBinaryFromReader); - msg.addIdentities(value); - break; - case 2: - var value = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.deserializeBinaryFromReader); - msg.addContracts(value); - break; - case 3: - var value = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.deserializeBinaryFromReader); - msg.addDocuments(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.hasIdentitiesKeys = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getIdentitiesList(); - if (f.length > 0) { - writer.writeRepeatedMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.serializeBinaryToWriter - ); - } - f = message.getContractsList(); - if (f.length > 0) { - writer.writeRepeatedMessage( - 2, - f, - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.serializeBinaryToWriter - ); - } - f = message.getDocumentsList(); - if (f.length > 0) { - writer.writeRepeatedMessage( - 3, - f, - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.serializeBinaryToWriter - ); - } +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional GetIdentitiesContractKeysResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; }; +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetProofsRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetProofsRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetProofsRequest.oneofGroups_[0])); +}; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -11646,8 +11464,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProofsRequest.toObject(opt_includeInstance, this); }; @@ -11656,16 +11474,13 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequ * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetProofsRequest.toObject = function(includeInstance, msg) { var f, obj = { - contractId: msg.getContractId_asB64(), - documentType: jspb.Message.getFieldWithDefault(msg, 2, ""), - documentTypeKeepsHistory: jspb.Message.getBooleanFieldWithDefault(msg, 3, false), - documentId: msg.getDocumentId_asB64() + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -11679,23 +11494,23 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequ /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetProofsRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest; - return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest; + return proto.org.dash.platform.dapi.v0.GetProofsRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetProofsRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -11703,20 +11518,9 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequ var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setContractId(value); - break; - case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setDocumentType(value); - break; - case 3: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setDocumentTypeKeepsHistory(value); - break; - case 4: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setDocumentId(value); + var value = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.deserializeBinaryFromReader); + msg.setV0(value); break; default: reader.skipField(); @@ -11731,9 +11535,9 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequ * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetProofsRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -11741,160 +11545,172 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequ /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetProofsRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getContractId_asU8(); - if (f.length > 0) { - writer.writeBytes( + f = message.getV0(); + if (f != null) { + writer.writeMessage( 1, - f - ); - } - f = message.getDocumentType(); - if (f.length > 0) { - writer.writeString( - 2, - f - ); - } - f = message.getDocumentTypeKeepsHistory(); - if (f) { - writer.writeBool( - 3, - f - ); - } - f = message.getDocumentId_asU8(); - if (f.length > 0) { - writer.writeBytes( - 4, - f + f, + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.serializeBinaryToWriter ); } }; + /** - * optional bytes contract_id = 1; - * @return {string} + * List of repeated fields within this message type. + * @private {!Array} + * @const */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getContractId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.repeatedFields_ = [1,2,3]; + +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * optional bytes contract_id = 1; - * This is a type-conversion wrapper around `getContractId()` - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getContractId_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getContractId())); -}; - - -/** - * optional bytes contract_id = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getContractId()` - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getContractId_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getContractId())); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} returns this - */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.setContractId = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); -}; - - -/** - * optional string document_type = 2; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getDocumentType = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); -}; - - -/** - * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} returns this + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.setDocumentType = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.toObject(opt_includeInstance, this); }; /** - * optional bool document_type_keeps_history = 3; - * @return {boolean} + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getDocumentTypeKeepsHistory = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); -}; - +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.toObject = function(includeInstance, msg) { + var f, obj = { + identitiesList: jspb.Message.toObjectList(msg.getIdentitiesList(), + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.toObject, includeInstance), + contractsList: jspb.Message.toObjectList(msg.getContractsList(), + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.toObject, includeInstance), + documentsList: jspb.Message.toObjectList(msg.getDocumentsList(), + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.toObject, includeInstance) + }; -/** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} returns this - */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.setDocumentTypeKeepsHistory = function(value) { - return jspb.Message.setProto3BooleanField(this, 3, value); + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * optional bytes document_id = 4; - * @return {string} + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getDocumentId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0; + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.deserializeBinaryFromReader(msg, reader); }; /** - * optional bytes document_id = 4; - * This is a type-conversion wrapper around `getDocumentId()` - * @return {string} + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getDocumentId_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getDocumentId())); +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.deserializeBinaryFromReader); + msg.addIdentities(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.deserializeBinaryFromReader); + msg.addContracts(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.deserializeBinaryFromReader); + msg.addDocuments(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * optional bytes document_id = 4; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getDocumentId()` + * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getDocumentId_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getDocumentId())); +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} returns this + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.setDocumentId = function(value) { - return jspb.Message.setProto3BytesField(this, 4, value); +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getIdentitiesList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.serializeBinaryToWriter + ); + } + f = message.getContractsList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.serializeBinaryToWriter + ); + } + f = message.getDocumentsList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.serializeBinaryToWriter + ); + } }; @@ -11914,8 +11730,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.toObject(opt_includeInstance, this); }; @@ -11924,14 +11740,16 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequ * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.toObject = function(includeInstance, msg) { var f, obj = { - identityId: msg.getIdentityId_asB64(), - requestType: jspb.Message.getFieldWithDefault(msg, 2, 0) + contractId: msg.getContractId_asB64(), + documentType: jspb.Message.getFieldWithDefault(msg, 2, ""), + documentTypeKeepsHistory: jspb.Message.getBooleanFieldWithDefault(msg, 3, false), + documentId: msg.getDocumentId_asB64() }; if (includeInstance) { @@ -11945,23 +11763,23 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequ /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest; - return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest; + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -11970,11 +11788,19 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequ switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setIdentityId(value); + msg.setContractId(value); break; case 2: - var value = /** @type {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type} */ (reader.readEnum()); - msg.setRequestType(value); + var value = /** @type {string} */ (reader.readString()); + msg.setDocumentType(value); + break; + case 3: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setDocumentTypeKeepsHistory(value); + break; + case 4: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setDocumentId(value); break; default: reader.skipField(); @@ -11989,9 +11815,9 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequ * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -11999,96 +11825,160 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequ /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getIdentityId_asU8(); + f = message.getContractId_asU8(); if (f.length > 0) { writer.writeBytes( 1, f ); } - f = message.getRequestType(); - if (f !== 0.0) { - writer.writeEnum( + f = message.getDocumentType(); + if (f.length > 0) { + writer.writeString( 2, f ); } -}; - - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type = { - FULL_IDENTITY: 0, - BALANCE: 1, - KEYS: 2, - REVISION: 3 -}; + f = message.getDocumentTypeKeepsHistory(); + if (f) { + writer.writeBool( + 3, + f + ); + } + f = message.getDocumentId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 4, + f + ); + } +}; + /** - * optional bytes identity_id = 1; + * optional bytes contract_id = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.getIdentityId = function() { +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getContractId = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional bytes identity_id = 1; - * This is a type-conversion wrapper around `getIdentityId()` + * optional bytes contract_id = 1; + * This is a type-conversion wrapper around `getContractId()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.getIdentityId_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getContractId_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getIdentityId())); + this.getContractId())); }; /** - * optional bytes identity_id = 1; + * optional bytes contract_id = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getIdentityId()` + * This is a type-conversion wrapper around `getContractId()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.getIdentityId_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getContractId_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getIdentityId())); + this.getContractId())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.setIdentityId = function(value) { +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.setContractId = function(value) { return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * optional Type request_type = 2; - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type} + * optional string document_type = 2; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.getRequestType = function() { - return /** @type {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getDocumentType = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} returns this + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.setRequestType = function(value) { - return jspb.Message.setProto3EnumField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.setDocumentType = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * optional bool document_type_keeps_history = 3; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getDocumentTypeKeepsHistory = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.setDocumentTypeKeepsHistory = function(value) { + return jspb.Message.setProto3BooleanField(this, 3, value); +}; + + +/** + * optional bytes document_id = 4; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getDocumentId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +}; + + +/** + * optional bytes document_id = 4; + * This is a type-conversion wrapper around `getDocumentId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getDocumentId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getDocumentId())); +}; + + +/** + * optional bytes document_id = 4; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getDocumentId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getDocumentId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getDocumentId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.setDocumentId = function(value) { + return jspb.Message.setProto3BytesField(this, 4, value); }; @@ -12108,8 +11998,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.toObject(opt_includeInstance, this); }; @@ -12118,13 +12008,14 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequ * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.toObject = function(includeInstance, msg) { var f, obj = { - contractId: msg.getContractId_asB64() + identityId: msg.getIdentityId_asB64(), + requestType: jspb.Message.getFieldWithDefault(msg, 2, 0) }; if (includeInstance) { @@ -12138,23 +12029,23 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequ /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest; - return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest; + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -12163,7 +12054,11 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequ switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setContractId(value); + msg.setIdentityId(value); + break; + case 2: + var value = /** @type {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type} */ (reader.readEnum()); + msg.setRequestType(value); break; default: reader.skipField(); @@ -12178,9 +12073,9 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequ * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -12188,118 +12083,307 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequ /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getContractId_asU8(); + f = message.getIdentityId_asU8(); if (f.length > 0) { writer.writeBytes( 1, f ); } + f = message.getRequestType(); + if (f !== 0.0) { + writer.writeEnum( + 2, + f + ); + } }; /** - * optional bytes contract_id = 1; + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type = { + FULL_IDENTITY: 0, + BALANCE: 1, + KEYS: 2, + REVISION: 3 +}; + +/** + * optional bytes identity_id = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.prototype.getContractId = function() { +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.getIdentityId = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional bytes contract_id = 1; - * This is a type-conversion wrapper around `getContractId()` + * optional bytes identity_id = 1; + * This is a type-conversion wrapper around `getIdentityId()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.prototype.getContractId_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.getIdentityId_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getContractId())); + this.getIdentityId())); }; /** - * optional bytes contract_id = 1; + * optional bytes identity_id = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getContractId()` + * This is a type-conversion wrapper around `getIdentityId()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.prototype.getContractId_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.getIdentityId_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getContractId())); + this.getIdentityId())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.prototype.setContractId = function(value) { +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.setIdentityId = function(value) { return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * repeated IdentityRequest identities = 1; - * @return {!Array} + * optional Type request_type = 2; + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.getIdentitiesList = function() { - return /** @type{!Array} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest, 1)); -}; - - -/** - * @param {!Array} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.setIdentitiesList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.getRequestType = function() { + return /** @type {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); }; /** - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest=} opt_value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.addIdentities = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest, opt_index); +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.setRequestType = function(value) { + return jspb.Message.setProto3EnumField(this, 2, value); }; -/** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.clearIdentitiesList = function() { - return this.setIdentitiesList([]); -}; + +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * repeated ContractRequest contracts = 2; - * @return {!Array} + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.getContractsList = function() { - return /** @type{!Array} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest, 2)); +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.toObject(opt_includeInstance, this); }; /** - * @param {!Array} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.setContractsList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 2, value); + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.toObject = function(includeInstance, msg) { + var f, obj = { + contractId: msg.getContractId_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest; + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setContractId(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getContractId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } +}; + + +/** + * optional bytes contract_id = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.prototype.getContractId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes contract_id = 1; + * This is a type-conversion wrapper around `getContractId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.prototype.getContractId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getContractId())); +}; + + +/** + * optional bytes contract_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getContractId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.prototype.getContractId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getContractId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.prototype.setContractId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * repeated IdentityRequest identities = 1; + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.getIdentitiesList = function() { + return /** @type{!Array} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest, 1)); +}; + + +/** + * @param {!Array} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.setIdentitiesList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.addIdentities = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.clearIdentitiesList = function() { + return this.setIdentitiesList([]); +}; + + +/** + * repeated ContractRequest contracts = 2; + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.getContractsList = function() { + return /** @type{!Array} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest, 2)); +}; + + +/** + * @param {!Array} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.setContractsList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 2, value); }; @@ -16731,1114 +16815,93 @@ proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.protot * @return {string} */ proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getStartAt_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getStartAt())); -}; - - -/** - * optional bytes start_at = 7; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getStartAt()` - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getStartAt_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getStartAt())); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.setStartAt = function(value) { - return jspb.Message.setOneofField(this, 7, proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.oneofGroups_[0], value); -}; - - -/** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.clearStartAt = function() { - return jspb.Message.setOneofField(this, 7, proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.oneofGroups_[0], undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.hasStartAt = function() { - return jspb.Message.getField(this, 7) != null; -}; - - -/** - * optional bool prove = 8; - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 8, false)); -}; - - -/** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 8, value); -}; - - -/** - * optional GetDocumentsRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0, 1)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest} returns this -*/ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDocumentsRequest.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest} returns this - */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.clearV0 = function() { - return this.setV0(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; -}; - - - -/** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.oneofGroups_ = [[1]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetDocumentsResponse.VersionCase} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetDocumentsResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.oneofGroups_[0])); -}; - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetDocumentsResponse.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.toObject = function(includeInstance, msg) { - var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.toObject(includeInstance, f) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetDocumentsResponse; - return proto.org.dash.platform.dapi.v0.GetDocumentsResponse.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.deserializeBinaryFromReader); - msg.setV0(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetDocumentsResponse.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.serializeBinaryToWriter - ); - } -}; - - - -/** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.oneofGroups_ = [[1,2]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.ResultCase = { - RESULT_NOT_SET: 0, - DOCUMENTS: 1, - PROOF: 2 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.ResultCase} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.oneofGroups_[0])); -}; - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.toObject = function(includeInstance, msg) { - var f, obj = { - documents: (f = msg.getDocuments()) && proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.toObject(includeInstance, f), - proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), - metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0; - return proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.deserializeBinaryFromReader); - msg.setDocuments(value); - break; - case 2: - var value = new proto.org.dash.platform.dapi.v0.Proof; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); - msg.setProof(value); - break; - case 3: - var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); - msg.setMetadata(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getDocuments(); - if (f != null) { - writer.writeMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.serializeBinaryToWriter - ); - } - f = message.getProof(); - if (f != null) { - writer.writeMessage( - 2, - f, - proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter - ); - } - f = message.getMetadata(); - if (f != null) { - writer.writeMessage( - 3, - f, - proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter - ); - } -}; - - - -/** - * List of repeated fields within this message type. - * @private {!Array} - * @const - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.repeatedFields_ = [1]; - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.toObject = function(includeInstance, msg) { - var f, obj = { - documentsList: msg.getDocumentsList_asB64() - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents; - return proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.addDocuments(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getDocumentsList_asU8(); - if (f.length > 0) { - writer.writeRepeatedBytes( - 1, - f - ); - } -}; - - -/** - * repeated bytes documents = 1; - * @return {!Array} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.getDocumentsList = function() { - return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 1)); -}; - - -/** - * repeated bytes documents = 1; - * This is a type-conversion wrapper around `getDocumentsList()` - * @return {!Array} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.getDocumentsList_asB64 = function() { - return /** @type {!Array} */ (jspb.Message.bytesListAsB64( - this.getDocumentsList())); -}; - - -/** - * repeated bytes documents = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getDocumentsList()` - * @return {!Array} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.getDocumentsList_asU8 = function() { - return /** @type {!Array} */ (jspb.Message.bytesListAsU8( - this.getDocumentsList())); -}; - - -/** - * @param {!(Array|Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} returns this - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.setDocumentsList = function(value) { - return jspb.Message.setField(this, 1, value || []); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} returns this - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.addDocuments = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 1, value, opt_index); -}; - - -/** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} returns this - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.clearDocumentsList = function() { - return this.setDocumentsList([]); -}; - - -/** - * optional Documents documents = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.getDocuments = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents, 1)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.setDocuments = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.clearDocuments = function() { - return this.setDocuments(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.hasDocuments = function() { - return jspb.Message.getField(this, 1) != null; -}; - - -/** - * optional Proof proof = 2; - * @return {?proto.org.dash.platform.dapi.v0.Proof} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.getProof = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.clearProof = function() { - return this.setProof(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.hasProof = function() { - return jspb.Message.getField(this, 2) != null; -}; - - -/** - * optional ResponseMetadata metadata = 3; - * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.getMetadata = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 3, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.clearMetadata = function() { - return this.setMetadata(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 3) != null; -}; - - -/** - * optional GetDocumentsResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0, 1)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} returns this -*/ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} returns this - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.clearV0 = function() { - return this.setV0(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; -}; - - - -/** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.oneofGroups_ = [[1]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.VersionCase} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.oneofGroups_[0])); -}; - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.toObject = function(includeInstance, msg) { - var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.toObject(includeInstance, f) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest; - return proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.deserializeBinaryFromReader); - msg.setV0(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.serializeBinaryToWriter - ); - } -}; - - - -/** - * List of repeated fields within this message type. - * @private {!Array} - * @const - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.repeatedFields_ = [1]; - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.toObject = function(includeInstance, msg) { - var f, obj = { - publicKeyHashesList: msg.getPublicKeyHashesList_asB64(), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0; - return proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.addPublicKeyHashes(value); - break; - case 2: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setProve(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getPublicKeyHashesList_asU8(); - if (f.length > 0) { - writer.writeRepeatedBytes( - 1, - f - ); - } - f = message.getProve(); - if (f) { - writer.writeBool( - 2, - f - ); - } -}; - - -/** - * repeated bytes public_key_hashes = 1; - * @return {!Array} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.prototype.getPublicKeyHashesList = function() { - return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 1)); -}; - - -/** - * repeated bytes public_key_hashes = 1; - * This is a type-conversion wrapper around `getPublicKeyHashesList()` - * @return {!Array} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.prototype.getPublicKeyHashesList_asB64 = function() { - return /** @type {!Array} */ (jspb.Message.bytesListAsB64( - this.getPublicKeyHashesList())); + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getStartAt())); }; /** - * repeated bytes public_key_hashes = 1; + * optional bytes start_at = 7; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getPublicKeyHashesList()` - * @return {!Array} + * This is a type-conversion wrapper around `getStartAt()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.prototype.getPublicKeyHashesList_asU8 = function() { - return /** @type {!Array} */ (jspb.Message.bytesListAsU8( - this.getPublicKeyHashesList())); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getStartAt_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getStartAt())); }; /** - * @param {!(Array|Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0} returns this + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.prototype.setPublicKeyHashesList = function(value) { - return jspb.Message.setField(this, 1, value || []); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.setStartAt = function(value) { + return jspb.Message.setOneofField(this, 7, proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.oneofGroups_[0], value); }; /** - * @param {!(string|Uint8Array)} value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0} returns this + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.prototype.addPublicKeyHashes = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.clearStartAt = function() { + return jspb.Message.setOneofField(this, 7, proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.oneofGroups_[0], undefined); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.prototype.clearPublicKeyHashesList = function() { - return this.setPublicKeyHashesList([]); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.hasStartAt = function() { + return jspb.Message.getField(this, 7) != null; }; /** - * optional bool prove = 2; + * optional bool prove = 8; * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 8, false)); }; /** * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 8, value); }; /** - * optional GetIdentitiesByPublicKeyHashesRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0} + * optional GetDocumentsRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDocumentsRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -17847,7 +16910,7 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.prototype. * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -17861,21 +16924,21 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.prototype. * @private {!Array>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.VersionCase = { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetDocumentsResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetDocumentsResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.oneofGroups_[0])); }; @@ -17893,8 +16956,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetDocumentsResponse.toObject(opt_includeInstance, this); }; @@ -17903,13 +16966,13 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.prototype * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -17923,23 +16986,23 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.toObject /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse; - return proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetDocumentsResponse; + return proto.org.dash.platform.dapi.v0.GetDocumentsResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -17947,8 +17010,8 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.deseriali var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -17964,9 +17027,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.deseriali * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetDocumentsResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -17974,235 +17037,49 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.prototype /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.serializeBinaryToWriter - ); - } -}; - - - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.toObject = function(includeInstance, msg) { - var f, obj = { - publicKeyHash: msg.getPublicKeyHash_asB64(), - value: (f = msg.getValue()) && google_protobuf_wrappers_pb.BytesValue.toObject(includeInstance, f) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry; - return proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setPublicKeyHash(value); - break; - case 2: - var value = new google_protobuf_wrappers_pb.BytesValue; - reader.readMessage(value,google_protobuf_wrappers_pb.BytesValue.deserializeBinaryFromReader); - msg.setValue(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getPublicKeyHash_asU8(); - if (f.length > 0) { - writer.writeBytes( - 1, - f - ); - } - f = message.getValue(); - if (f != null) { - writer.writeMessage( - 2, - f, - google_protobuf_wrappers_pb.BytesValue.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.serializeBinaryToWriter ); } }; -/** - * optional bytes public_key_hash = 1; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.prototype.getPublicKeyHash = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * optional bytes public_key_hash = 1; - * This is a type-conversion wrapper around `getPublicKeyHash()` - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.prototype.getPublicKeyHash_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getPublicKeyHash())); -}; - - -/** - * optional bytes public_key_hash = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getPublicKeyHash()` - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.prototype.getPublicKeyHash_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getPublicKeyHash())); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.prototype.setPublicKeyHash = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); -}; - - -/** - * optional google.protobuf.BytesValue value = 2; - * @return {?proto.google.protobuf.BytesValue} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.prototype.getValue = function() { - return /** @type{?proto.google.protobuf.BytesValue} */ ( - jspb.Message.getWrapperField(this, google_protobuf_wrappers_pb.BytesValue, 2)); -}; - - -/** - * @param {?proto.google.protobuf.BytesValue|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.prototype.setValue = function(value) { - return jspb.Message.setWrapperField(this, 2, value); -}; - /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry} returns this + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} + * @const */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.prototype.clearValue = function() { - return this.setValue(undefined); -}; - +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.oneofGroups_ = [[1,2]]; /** - * Returns whether this field is set. - * @return {boolean} + * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.prototype.hasValue = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + DOCUMENTS: 1, + PROOF: 2 }; - - /** - * List of repeated fields within this message type. - * @private {!Array} - * @const + * @return {proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.ResultCase} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes.repeatedFields_ = [1]; +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.oneofGroups_[0])); +}; @@ -18219,8 +17096,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.toObject(opt_includeInstance, this); }; @@ -18229,14 +17106,15 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.Identitie * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - identityEntriesList: jspb.Message.toObjectList(msg.getIdentityEntriesList(), - proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.toObject, includeInstance) + documents: (f = msg.getDocuments()) && proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.toObject(includeInstance, f), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; if (includeInstance) { @@ -18250,23 +17128,23 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.Identitie /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes} + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes; - return proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0; + return proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes} + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -18274,9 +17152,19 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.Identitie var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.deserializeBinaryFromReader); - msg.addIdentityEntries(value); + var value = new proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.deserializeBinaryFromReader); + msg.setDocuments(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); break; default: reader.skipField(); @@ -18291,9 +17179,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.Identitie * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -18301,87 +17189,46 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.Identitie /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes} message + * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getIdentityEntriesList(); - if (f.length > 0) { - writer.writeRepeatedMessage( + f = message.getDocuments(); + if (f != null) { + writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.serializeBinaryToWriter + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter ); } -}; - - -/** - * repeated PublicKeyHashIdentityEntry identity_entries = 1; - * @return {!Array} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes.prototype.getIdentityEntriesList = function() { - return /** @type{!Array} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry, 1)); -}; - - -/** - * @param {!Array} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes.prototype.setIdentityEntriesList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 1, value); -}; - - -/** - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry=} opt_value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes.prototype.addIdentityEntries = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry, opt_index); -}; - - -/** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes.prototype.clearIdentityEntriesList = function() { - return this.setIdentityEntriesList([]); }; /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array>} + * List of repeated fields within this message type. + * @private {!Array} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.oneofGroups_ = [[1,2]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.ResultCase = { - RESULT_NOT_SET: 0, - IDENTITIES: 1, - PROOF: 2 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.ResultCase} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.oneofGroups_[0])); -}; +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.repeatedFields_ = [1]; @@ -18398,8 +17245,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.toObject(opt_includeInstance, this); }; @@ -18408,15 +17255,13 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdenti * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.toObject = function(includeInstance, msg) { var f, obj = { - identities: (f = msg.getIdentities()) && proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes.toObject(includeInstance, f), - proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), - metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + documentsList: msg.getDocumentsList_asB64() }; if (includeInstance) { @@ -18430,23 +17275,23 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdenti /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0; - return proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents; + return proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -18454,19 +17299,8 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdenti var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes.deserializeBinaryFromReader); - msg.setIdentities(value); - break; - case 2: - var value = new proto.org.dash.platform.dapi.v0.Proof; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); - msg.setProof(value); - break; - case 3: - var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); - msg.setMetadata(value); + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addDocuments(value); break; default: reader.skipField(); @@ -18481,9 +17315,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdenti * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -18491,64 +17325,108 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdenti /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getIdentities(); - if (f != null) { - writer.writeMessage( + f = message.getDocumentsList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( 1, - f, - proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes.serializeBinaryToWriter - ); - } - f = message.getProof(); - if (f != null) { - writer.writeMessage( - 2, - f, - proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter - ); - } - f = message.getMetadata(); - if (f != null) { - writer.writeMessage( - 3, - f, - proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + f ); } }; /** - * optional IdentitiesByPublicKeyHashes identities = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes} + * repeated bytes documents = 1; + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.getDocumentsList = function() { + return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 1)); +}; + + +/** + * repeated bytes documents = 1; + * This is a type-conversion wrapper around `getDocumentsList()` + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.getDocumentsList_asB64 = function() { + return /** @type {!Array} */ (jspb.Message.bytesListAsB64( + this.getDocumentsList())); +}; + + +/** + * repeated bytes documents = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getDocumentsList()` + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.getDocumentsList_asU8 = function() { + return /** @type {!Array} */ (jspb.Message.bytesListAsU8( + this.getDocumentsList())); +}; + + +/** + * @param {!(Array|Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} returns this + */ +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.setDocumentsList = function(value) { + return jspb.Message.setField(this, 1, value || []); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} returns this + */ +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.addDocuments = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} returns this + */ +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.clearDocumentsList = function() { + return this.setDocumentsList([]); +}; + + +/** + * optional Documents documents = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.prototype.getIdentities = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes, 1)); +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.getDocuments = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.prototype.setIdentities = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.setDocuments = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.prototype.clearIdentities = function() { - return this.setIdentities(undefined); +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.clearDocuments = function() { + return this.setDocuments(undefined); }; @@ -18556,7 +17434,7 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdenti * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.prototype.hasIdentities = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.hasDocuments = function() { return jspb.Message.getField(this, 1) != null; }; @@ -18565,7 +17443,7 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdenti * optional Proof proof = 2; * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.prototype.getProof = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.getProof = function() { return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; @@ -18573,18 +17451,18 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdenti /** * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.prototype.clearProof = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.clearProof = function() { return this.setProof(undefined); }; @@ -18593,7 +17471,7 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdenti * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.prototype.hasProof = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.hasProof = function() { return jspb.Message.getField(this, 2) != null; }; @@ -18602,7 +17480,7 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdenti * optional ResponseMetadata metadata = 3; * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.prototype.getMetadata = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.getMetadata = function() { return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); }; @@ -18610,18 +17488,18 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdenti /** * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.prototype.setMetadata = function(value) { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.setMetadata = function(value) { return jspb.Message.setWrapperField(this, 3, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.prototype.clearMetadata = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.clearMetadata = function() { return this.setMetadata(undefined); }; @@ -18630,35 +17508,35 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdenti * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.prototype.hasMetadata = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.hasMetadata = function() { return jspb.Message.getField(this, 3) != null; }; /** - * optional GetIdentitiesByPublicKeyHashesResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0} + * optional GetDocumentsResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -18667,7 +17545,7 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.prototype * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -26093,4 +24971,15 @@ proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.hasV0 = functi }; +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.KeyPurpose = { + AUTHENTICATION: 0, + ENCRYPTION: 1, + DECRYPTION: 2, + TRANSFER: 3, + VOTING: 5 +}; + goog.object.extend(exports, proto.org.dash.platform.dapi.v0); diff --git a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.h b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.h index 40fdb0a6eb..658a32ab95 100644 --- a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.h +++ b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.h @@ -51,15 +51,11 @@ CF_EXTERN_C_BEGIN @class GetEpochsInfoResponse_GetEpochsInfoResponseV0; @class GetEpochsInfoResponse_GetEpochsInfoResponseV0_EpochInfo; @class GetEpochsInfoResponse_GetEpochsInfoResponseV0_EpochInfos; -@class GetIdentitiesByPublicKeyHashesRequest_GetIdentitiesByPublicKeyHashesRequestV0; -@class GetIdentitiesByPublicKeyHashesResponse_GetIdentitiesByPublicKeyHashesResponseV0; -@class GetIdentitiesByPublicKeyHashesResponse_IdentitiesByPublicKeyHashes; -@class GetIdentitiesByPublicKeyHashesResponse_PublicKeyHashIdentityEntry; -@class GetIdentitiesRequest_GetIdentitiesRequestV0; -@class GetIdentitiesResponse_GetIdentitiesResponseV0; -@class GetIdentitiesResponse_Identities; -@class GetIdentitiesResponse_IdentityEntry; -@class GetIdentitiesResponse_IdentityValue; +@class GetIdentitiesContractKeysRequest_GetIdentitiesContractKeysRequestV0; +@class GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0; +@class GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_IdentitiesKeys; +@class GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_IdentityKeys; +@class GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_PurposeKeys; @class GetIdentityBalanceAndRevisionRequest_GetIdentityBalanceAndRevisionRequestV0; @class GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0; @class GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0_BalanceAndRevision; @@ -104,6 +100,30 @@ CF_EXTERN_C_BEGIN NS_ASSUME_NONNULL_BEGIN +#pragma mark - Enum KeyPurpose + +typedef GPB_ENUM(KeyPurpose) { + /** + * Value used if any message's field encounters a value that is not defined + * by this enum. The message will also have C functions to get/set the rawValue + * of the field. + **/ + KeyPurpose_GPBUnrecognizedEnumeratorValue = kGPBUnrecognizedEnumeratorValue, + KeyPurpose_Authentication = 0, + KeyPurpose_Encryption = 1, + KeyPurpose_Decryption = 2, + KeyPurpose_Transfer = 3, + KeyPurpose_Voting = 5, +}; + +GPBEnumDescriptor *KeyPurpose_EnumDescriptor(void); + +/** + * Checks to see if the given value is defined by the enum or was not known at + * the time this source was generated. + **/ +BOOL KeyPurpose_IsValidValue(int32_t value); + #pragma mark - Enum SecurityLevelMap_KeyKindRequestType typedef GPB_ENUM(SecurityLevelMap_KeyKindRequestType) { @@ -508,147 +528,6 @@ GPB_FINAL @interface GetIdentityResponse_GetIdentityResponseV0 : GPBMessage **/ void GetIdentityResponse_GetIdentityResponseV0_ClearResultOneOfCase(GetIdentityResponse_GetIdentityResponseV0 *message); -#pragma mark - GetIdentitiesRequest - -typedef GPB_ENUM(GetIdentitiesRequest_FieldNumber) { - GetIdentitiesRequest_FieldNumber_V0 = 1, -}; - -typedef GPB_ENUM(GetIdentitiesRequest_Version_OneOfCase) { - GetIdentitiesRequest_Version_OneOfCase_GPBUnsetOneOfCase = 0, - GetIdentitiesRequest_Version_OneOfCase_V0 = 1, -}; - -GPB_FINAL @interface GetIdentitiesRequest : GPBMessage - -@property(nonatomic, readonly) GetIdentitiesRequest_Version_OneOfCase versionOneOfCase; - -@property(nonatomic, readwrite, strong, null_resettable) GetIdentitiesRequest_GetIdentitiesRequestV0 *v0; - -@end - -/** - * Clears whatever value was set for the oneof 'version'. - **/ -void GetIdentitiesRequest_ClearVersionOneOfCase(GetIdentitiesRequest *message); - -#pragma mark - GetIdentitiesRequest_GetIdentitiesRequestV0 - -typedef GPB_ENUM(GetIdentitiesRequest_GetIdentitiesRequestV0_FieldNumber) { - GetIdentitiesRequest_GetIdentitiesRequestV0_FieldNumber_IdsArray = 1, - GetIdentitiesRequest_GetIdentitiesRequestV0_FieldNumber_Prove = 2, -}; - -GPB_FINAL @interface GetIdentitiesRequest_GetIdentitiesRequestV0 : GPBMessage - -@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray *idsArray; -/** The number of items in @c idsArray without causing the array to be created. */ -@property(nonatomic, readonly) NSUInteger idsArray_Count; - -@property(nonatomic, readwrite) BOOL prove; - -@end - -#pragma mark - GetIdentitiesResponse - -typedef GPB_ENUM(GetIdentitiesResponse_FieldNumber) { - GetIdentitiesResponse_FieldNumber_V0 = 1, -}; - -typedef GPB_ENUM(GetIdentitiesResponse_Version_OneOfCase) { - GetIdentitiesResponse_Version_OneOfCase_GPBUnsetOneOfCase = 0, - GetIdentitiesResponse_Version_OneOfCase_V0 = 1, -}; - -GPB_FINAL @interface GetIdentitiesResponse : GPBMessage - -@property(nonatomic, readonly) GetIdentitiesResponse_Version_OneOfCase versionOneOfCase; - -@property(nonatomic, readwrite, strong, null_resettable) GetIdentitiesResponse_GetIdentitiesResponseV0 *v0; - -@end - -/** - * Clears whatever value was set for the oneof 'version'. - **/ -void GetIdentitiesResponse_ClearVersionOneOfCase(GetIdentitiesResponse *message); - -#pragma mark - GetIdentitiesResponse_IdentityValue - -typedef GPB_ENUM(GetIdentitiesResponse_IdentityValue_FieldNumber) { - GetIdentitiesResponse_IdentityValue_FieldNumber_Value = 1, -}; - -GPB_FINAL @interface GetIdentitiesResponse_IdentityValue : GPBMessage - -@property(nonatomic, readwrite, copy, null_resettable) NSData *value; - -@end - -#pragma mark - GetIdentitiesResponse_IdentityEntry - -typedef GPB_ENUM(GetIdentitiesResponse_IdentityEntry_FieldNumber) { - GetIdentitiesResponse_IdentityEntry_FieldNumber_Key = 1, - GetIdentitiesResponse_IdentityEntry_FieldNumber_Value = 2, -}; - -GPB_FINAL @interface GetIdentitiesResponse_IdentityEntry : GPBMessage - -@property(nonatomic, readwrite, copy, null_resettable) NSData *key; - -@property(nonatomic, readwrite, strong, null_resettable) GetIdentitiesResponse_IdentityValue *value; -/** Test to see if @c value has been set. */ -@property(nonatomic, readwrite) BOOL hasValue; - -@end - -#pragma mark - GetIdentitiesResponse_Identities - -typedef GPB_ENUM(GetIdentitiesResponse_Identities_FieldNumber) { - GetIdentitiesResponse_Identities_FieldNumber_IdentityEntriesArray = 1, -}; - -GPB_FINAL @interface GetIdentitiesResponse_Identities : GPBMessage - -@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray *identityEntriesArray; -/** The number of items in @c identityEntriesArray without causing the array to be created. */ -@property(nonatomic, readonly) NSUInteger identityEntriesArray_Count; - -@end - -#pragma mark - GetIdentitiesResponse_GetIdentitiesResponseV0 - -typedef GPB_ENUM(GetIdentitiesResponse_GetIdentitiesResponseV0_FieldNumber) { - GetIdentitiesResponse_GetIdentitiesResponseV0_FieldNumber_Identities = 1, - GetIdentitiesResponse_GetIdentitiesResponseV0_FieldNumber_Proof = 2, - GetIdentitiesResponse_GetIdentitiesResponseV0_FieldNumber_Metadata = 3, -}; - -typedef GPB_ENUM(GetIdentitiesResponse_GetIdentitiesResponseV0_Result_OneOfCase) { - GetIdentitiesResponse_GetIdentitiesResponseV0_Result_OneOfCase_GPBUnsetOneOfCase = 0, - GetIdentitiesResponse_GetIdentitiesResponseV0_Result_OneOfCase_Identities = 1, - GetIdentitiesResponse_GetIdentitiesResponseV0_Result_OneOfCase_Proof = 2, -}; - -GPB_FINAL @interface GetIdentitiesResponse_GetIdentitiesResponseV0 : GPBMessage - -@property(nonatomic, readonly) GetIdentitiesResponse_GetIdentitiesResponseV0_Result_OneOfCase resultOneOfCase; - -@property(nonatomic, readwrite, strong, null_resettable) GetIdentitiesResponse_Identities *identities; - -@property(nonatomic, readwrite, strong, null_resettable) Proof *proof; - -@property(nonatomic, readwrite, strong, null_resettable) ResponseMetadata *metadata; -/** Test to see if @c metadata has been set. */ -@property(nonatomic, readwrite) BOOL hasMetadata; - -@end - -/** - * Clears whatever value was set for the oneof 'result'. - **/ -void GetIdentitiesResponse_GetIdentitiesResponseV0_ClearResultOneOfCase(GetIdentitiesResponse_GetIdentitiesResponseV0 *message); - #pragma mark - GetIdentityNonceResponse typedef GPB_ENUM(GetIdentityNonceResponse_FieldNumber) { @@ -1098,6 +977,178 @@ GPB_FINAL @interface GetIdentityKeysResponse_GetIdentityKeysResponseV0_Keys : GP @end +#pragma mark - GetIdentitiesContractKeysRequest + +typedef GPB_ENUM(GetIdentitiesContractKeysRequest_FieldNumber) { + GetIdentitiesContractKeysRequest_FieldNumber_V0 = 1, +}; + +typedef GPB_ENUM(GetIdentitiesContractKeysRequest_Version_OneOfCase) { + GetIdentitiesContractKeysRequest_Version_OneOfCase_GPBUnsetOneOfCase = 0, + GetIdentitiesContractKeysRequest_Version_OneOfCase_V0 = 1, +}; + +GPB_FINAL @interface GetIdentitiesContractKeysRequest : GPBMessage + +@property(nonatomic, readonly) GetIdentitiesContractKeysRequest_Version_OneOfCase versionOneOfCase; + +@property(nonatomic, readwrite, strong, null_resettable) GetIdentitiesContractKeysRequest_GetIdentitiesContractKeysRequestV0 *v0; + +@end + +/** + * Clears whatever value was set for the oneof 'version'. + **/ +void GetIdentitiesContractKeysRequest_ClearVersionOneOfCase(GetIdentitiesContractKeysRequest *message); + +#pragma mark - GetIdentitiesContractKeysRequest_GetIdentitiesContractKeysRequestV0 + +typedef GPB_ENUM(GetIdentitiesContractKeysRequest_GetIdentitiesContractKeysRequestV0_FieldNumber) { + GetIdentitiesContractKeysRequest_GetIdentitiesContractKeysRequestV0_FieldNumber_IdentitiesIdsArray = 1, + GetIdentitiesContractKeysRequest_GetIdentitiesContractKeysRequestV0_FieldNumber_ContractId = 2, + GetIdentitiesContractKeysRequest_GetIdentitiesContractKeysRequestV0_FieldNumber_DocumentTypeName = 3, + GetIdentitiesContractKeysRequest_GetIdentitiesContractKeysRequestV0_FieldNumber_PurposesArray = 4, + GetIdentitiesContractKeysRequest_GetIdentitiesContractKeysRequestV0_FieldNumber_Prove = 5, +}; + +GPB_FINAL @interface GetIdentitiesContractKeysRequest_GetIdentitiesContractKeysRequestV0 : GPBMessage + +@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray *identitiesIdsArray; +/** The number of items in @c identitiesIdsArray without causing the array to be created. */ +@property(nonatomic, readonly) NSUInteger identitiesIdsArray_Count; + +@property(nonatomic, readwrite, copy, null_resettable) NSData *contractId; + +@property(nonatomic, readwrite, copy, null_resettable) NSString *documentTypeName; +/** Test to see if @c documentTypeName has been set. */ +@property(nonatomic, readwrite) BOOL hasDocumentTypeName; + +// |purposesArray| contains |KeyPurpose| +@property(nonatomic, readwrite, strong, null_resettable) GPBEnumArray *purposesArray; +/** The number of items in @c purposesArray without causing the array to be created. */ +@property(nonatomic, readonly) NSUInteger purposesArray_Count; + +@property(nonatomic, readwrite) BOOL prove; + +@end + +#pragma mark - GetIdentitiesContractKeysResponse + +typedef GPB_ENUM(GetIdentitiesContractKeysResponse_FieldNumber) { + GetIdentitiesContractKeysResponse_FieldNumber_V0 = 1, +}; + +typedef GPB_ENUM(GetIdentitiesContractKeysResponse_Version_OneOfCase) { + GetIdentitiesContractKeysResponse_Version_OneOfCase_GPBUnsetOneOfCase = 0, + GetIdentitiesContractKeysResponse_Version_OneOfCase_V0 = 1, +}; + +GPB_FINAL @interface GetIdentitiesContractKeysResponse : GPBMessage + +@property(nonatomic, readonly) GetIdentitiesContractKeysResponse_Version_OneOfCase versionOneOfCase; + +@property(nonatomic, readwrite, strong, null_resettable) GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0 *v0; + +@end + +/** + * Clears whatever value was set for the oneof 'version'. + **/ +void GetIdentitiesContractKeysResponse_ClearVersionOneOfCase(GetIdentitiesContractKeysResponse *message); + +#pragma mark - GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0 + +typedef GPB_ENUM(GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_FieldNumber) { + GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_FieldNumber_IdentitiesKeys = 1, + GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_FieldNumber_Proof = 2, + GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_FieldNumber_Metadata = 3, +}; + +typedef GPB_ENUM(GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_Result_OneOfCase) { + GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_Result_OneOfCase_GPBUnsetOneOfCase = 0, + GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_Result_OneOfCase_IdentitiesKeys = 1, + GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_Result_OneOfCase_Proof = 2, +}; + +GPB_FINAL @interface GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0 : GPBMessage + +@property(nonatomic, readonly) GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_Result_OneOfCase resultOneOfCase; + +@property(nonatomic, readwrite, strong, null_resettable) GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_IdentitiesKeys *identitiesKeys; + +@property(nonatomic, readwrite, strong, null_resettable) Proof *proof; + +@property(nonatomic, readwrite, strong, null_resettable) ResponseMetadata *metadata; +/** Test to see if @c metadata has been set. */ +@property(nonatomic, readwrite) BOOL hasMetadata; + +@end + +/** + * Clears whatever value was set for the oneof 'result'. + **/ +void GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_ClearResultOneOfCase(GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0 *message); + +#pragma mark - GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_PurposeKeys + +typedef GPB_ENUM(GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_PurposeKeys_FieldNumber) { + GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_PurposeKeys_FieldNumber_Purpose = 1, + GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_PurposeKeys_FieldNumber_KeysBytesArray = 2, +}; + +GPB_FINAL @interface GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_PurposeKeys : GPBMessage + +@property(nonatomic, readwrite) KeyPurpose purpose; + +@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray *keysBytesArray; +/** The number of items in @c keysBytesArray without causing the array to be created. */ +@property(nonatomic, readonly) NSUInteger keysBytesArray_Count; + +@end + +/** + * Fetches the raw value of a @c GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_PurposeKeys's @c purpose property, even + * if the value was not defined by the enum at the time the code was generated. + **/ +int32_t GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_PurposeKeys_Purpose_RawValue(GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_PurposeKeys *message); +/** + * Sets the raw value of an @c GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_PurposeKeys's @c purpose property, allowing + * it to be set to a value that was not defined by the enum at the time the code + * was generated. + **/ +void SetGetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_PurposeKeys_Purpose_RawValue(GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_PurposeKeys *message, int32_t value); + +#pragma mark - GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_IdentityKeys + +typedef GPB_ENUM(GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_IdentityKeys_FieldNumber) { + GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_IdentityKeys_FieldNumber_IdentityId = 1, + GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_IdentityKeys_FieldNumber_KeysArray = 2, +}; + +GPB_FINAL @interface GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_IdentityKeys : GPBMessage + +@property(nonatomic, readwrite, copy, null_resettable) NSData *identityId; + +@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray *keysArray; +/** The number of items in @c keysArray without causing the array to be created. */ +@property(nonatomic, readonly) NSUInteger keysArray_Count; + +@end + +#pragma mark - GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_IdentitiesKeys + +typedef GPB_ENUM(GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_IdentitiesKeys_FieldNumber) { + GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_IdentitiesKeys_FieldNumber_EntriesArray = 1, +}; + +GPB_FINAL @interface GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_IdentitiesKeys : GPBMessage + +@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray *entriesArray; +/** The number of items in @c entriesArray without causing the array to be created. */ +@property(nonatomic, readonly) NSUInteger entriesArray_Count; + +@end + #pragma mark - GetProofsRequest typedef GPB_ENUM(GetProofsRequest_FieldNumber) { @@ -1763,135 +1814,6 @@ GPB_FINAL @interface GetDocumentsResponse_GetDocumentsResponseV0_Documents : GPB @end -#pragma mark - GetIdentitiesByPublicKeyHashesRequest - -typedef GPB_ENUM(GetIdentitiesByPublicKeyHashesRequest_FieldNumber) { - GetIdentitiesByPublicKeyHashesRequest_FieldNumber_V0 = 1, -}; - -typedef GPB_ENUM(GetIdentitiesByPublicKeyHashesRequest_Version_OneOfCase) { - GetIdentitiesByPublicKeyHashesRequest_Version_OneOfCase_GPBUnsetOneOfCase = 0, - GetIdentitiesByPublicKeyHashesRequest_Version_OneOfCase_V0 = 1, -}; - -GPB_FINAL @interface GetIdentitiesByPublicKeyHashesRequest : GPBMessage - -@property(nonatomic, readonly) GetIdentitiesByPublicKeyHashesRequest_Version_OneOfCase versionOneOfCase; - -@property(nonatomic, readwrite, strong, null_resettable) GetIdentitiesByPublicKeyHashesRequest_GetIdentitiesByPublicKeyHashesRequestV0 *v0; - -@end - -/** - * Clears whatever value was set for the oneof 'version'. - **/ -void GetIdentitiesByPublicKeyHashesRequest_ClearVersionOneOfCase(GetIdentitiesByPublicKeyHashesRequest *message); - -#pragma mark - GetIdentitiesByPublicKeyHashesRequest_GetIdentitiesByPublicKeyHashesRequestV0 - -typedef GPB_ENUM(GetIdentitiesByPublicKeyHashesRequest_GetIdentitiesByPublicKeyHashesRequestV0_FieldNumber) { - GetIdentitiesByPublicKeyHashesRequest_GetIdentitiesByPublicKeyHashesRequestV0_FieldNumber_PublicKeyHashesArray = 1, - GetIdentitiesByPublicKeyHashesRequest_GetIdentitiesByPublicKeyHashesRequestV0_FieldNumber_Prove = 2, -}; - -GPB_FINAL @interface GetIdentitiesByPublicKeyHashesRequest_GetIdentitiesByPublicKeyHashesRequestV0 : GPBMessage - -@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray *publicKeyHashesArray; -/** The number of items in @c publicKeyHashesArray without causing the array to be created. */ -@property(nonatomic, readonly) NSUInteger publicKeyHashesArray_Count; - -@property(nonatomic, readwrite) BOOL prove; - -@end - -#pragma mark - GetIdentitiesByPublicKeyHashesResponse - -typedef GPB_ENUM(GetIdentitiesByPublicKeyHashesResponse_FieldNumber) { - GetIdentitiesByPublicKeyHashesResponse_FieldNumber_V0 = 1, -}; - -typedef GPB_ENUM(GetIdentitiesByPublicKeyHashesResponse_Version_OneOfCase) { - GetIdentitiesByPublicKeyHashesResponse_Version_OneOfCase_GPBUnsetOneOfCase = 0, - GetIdentitiesByPublicKeyHashesResponse_Version_OneOfCase_V0 = 1, -}; - -GPB_FINAL @interface GetIdentitiesByPublicKeyHashesResponse : GPBMessage - -@property(nonatomic, readonly) GetIdentitiesByPublicKeyHashesResponse_Version_OneOfCase versionOneOfCase; - -@property(nonatomic, readwrite, strong, null_resettable) GetIdentitiesByPublicKeyHashesResponse_GetIdentitiesByPublicKeyHashesResponseV0 *v0; - -@end - -/** - * Clears whatever value was set for the oneof 'version'. - **/ -void GetIdentitiesByPublicKeyHashesResponse_ClearVersionOneOfCase(GetIdentitiesByPublicKeyHashesResponse *message); - -#pragma mark - GetIdentitiesByPublicKeyHashesResponse_PublicKeyHashIdentityEntry - -typedef GPB_ENUM(GetIdentitiesByPublicKeyHashesResponse_PublicKeyHashIdentityEntry_FieldNumber) { - GetIdentitiesByPublicKeyHashesResponse_PublicKeyHashIdentityEntry_FieldNumber_PublicKeyHash = 1, - GetIdentitiesByPublicKeyHashesResponse_PublicKeyHashIdentityEntry_FieldNumber_Value = 2, -}; - -GPB_FINAL @interface GetIdentitiesByPublicKeyHashesResponse_PublicKeyHashIdentityEntry : GPBMessage - -@property(nonatomic, readwrite, copy, null_resettable) NSData *publicKeyHash; - -@property(nonatomic, readwrite, strong, null_resettable) GPBBytesValue *value; -/** Test to see if @c value has been set. */ -@property(nonatomic, readwrite) BOOL hasValue; - -@end - -#pragma mark - GetIdentitiesByPublicKeyHashesResponse_IdentitiesByPublicKeyHashes - -typedef GPB_ENUM(GetIdentitiesByPublicKeyHashesResponse_IdentitiesByPublicKeyHashes_FieldNumber) { - GetIdentitiesByPublicKeyHashesResponse_IdentitiesByPublicKeyHashes_FieldNumber_IdentityEntriesArray = 1, -}; - -GPB_FINAL @interface GetIdentitiesByPublicKeyHashesResponse_IdentitiesByPublicKeyHashes : GPBMessage - -@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray *identityEntriesArray; -/** The number of items in @c identityEntriesArray without causing the array to be created. */ -@property(nonatomic, readonly) NSUInteger identityEntriesArray_Count; - -@end - -#pragma mark - GetIdentitiesByPublicKeyHashesResponse_GetIdentitiesByPublicKeyHashesResponseV0 - -typedef GPB_ENUM(GetIdentitiesByPublicKeyHashesResponse_GetIdentitiesByPublicKeyHashesResponseV0_FieldNumber) { - GetIdentitiesByPublicKeyHashesResponse_GetIdentitiesByPublicKeyHashesResponseV0_FieldNumber_Identities = 1, - GetIdentitiesByPublicKeyHashesResponse_GetIdentitiesByPublicKeyHashesResponseV0_FieldNumber_Proof = 2, - GetIdentitiesByPublicKeyHashesResponse_GetIdentitiesByPublicKeyHashesResponseV0_FieldNumber_Metadata = 3, -}; - -typedef GPB_ENUM(GetIdentitiesByPublicKeyHashesResponse_GetIdentitiesByPublicKeyHashesResponseV0_Result_OneOfCase) { - GetIdentitiesByPublicKeyHashesResponse_GetIdentitiesByPublicKeyHashesResponseV0_Result_OneOfCase_GPBUnsetOneOfCase = 0, - GetIdentitiesByPublicKeyHashesResponse_GetIdentitiesByPublicKeyHashesResponseV0_Result_OneOfCase_Identities = 1, - GetIdentitiesByPublicKeyHashesResponse_GetIdentitiesByPublicKeyHashesResponseV0_Result_OneOfCase_Proof = 2, -}; - -GPB_FINAL @interface GetIdentitiesByPublicKeyHashesResponse_GetIdentitiesByPublicKeyHashesResponseV0 : GPBMessage - -@property(nonatomic, readonly) GetIdentitiesByPublicKeyHashesResponse_GetIdentitiesByPublicKeyHashesResponseV0_Result_OneOfCase resultOneOfCase; - -@property(nonatomic, readwrite, strong, null_resettable) GetIdentitiesByPublicKeyHashesResponse_IdentitiesByPublicKeyHashes *identities; - -@property(nonatomic, readwrite, strong, null_resettable) Proof *proof; - -@property(nonatomic, readwrite, strong, null_resettable) ResponseMetadata *metadata; -/** Test to see if @c metadata has been set. */ -@property(nonatomic, readwrite) BOOL hasMetadata; - -@end - -/** - * Clears whatever value was set for the oneof 'result'. - **/ -void GetIdentitiesByPublicKeyHashesResponse_GetIdentitiesByPublicKeyHashesResponseV0_ClearResultOneOfCase(GetIdentitiesByPublicKeyHashesResponse_GetIdentitiesByPublicKeyHashesResponseV0 *message); - #pragma mark - GetIdentityByPublicKeyHashRequest typedef GPB_ENUM(GetIdentityByPublicKeyHashRequest_FieldNumber) { diff --git a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.m b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.m index f78cda6408..65bdc7ed82 100644 --- a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.m +++ b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.m @@ -63,19 +63,13 @@ GPBObjCClassDeclaration(GetEpochsInfoResponse_GetEpochsInfoResponseV0); GPBObjCClassDeclaration(GetEpochsInfoResponse_GetEpochsInfoResponseV0_EpochInfo); GPBObjCClassDeclaration(GetEpochsInfoResponse_GetEpochsInfoResponseV0_EpochInfos); -GPBObjCClassDeclaration(GetIdentitiesByPublicKeyHashesRequest); -GPBObjCClassDeclaration(GetIdentitiesByPublicKeyHashesRequest_GetIdentitiesByPublicKeyHashesRequestV0); -GPBObjCClassDeclaration(GetIdentitiesByPublicKeyHashesResponse); -GPBObjCClassDeclaration(GetIdentitiesByPublicKeyHashesResponse_GetIdentitiesByPublicKeyHashesResponseV0); -GPBObjCClassDeclaration(GetIdentitiesByPublicKeyHashesResponse_IdentitiesByPublicKeyHashes); -GPBObjCClassDeclaration(GetIdentitiesByPublicKeyHashesResponse_PublicKeyHashIdentityEntry); -GPBObjCClassDeclaration(GetIdentitiesRequest); -GPBObjCClassDeclaration(GetIdentitiesRequest_GetIdentitiesRequestV0); -GPBObjCClassDeclaration(GetIdentitiesResponse); -GPBObjCClassDeclaration(GetIdentitiesResponse_GetIdentitiesResponseV0); -GPBObjCClassDeclaration(GetIdentitiesResponse_Identities); -GPBObjCClassDeclaration(GetIdentitiesResponse_IdentityEntry); -GPBObjCClassDeclaration(GetIdentitiesResponse_IdentityValue); +GPBObjCClassDeclaration(GetIdentitiesContractKeysRequest); +GPBObjCClassDeclaration(GetIdentitiesContractKeysRequest_GetIdentitiesContractKeysRequestV0); +GPBObjCClassDeclaration(GetIdentitiesContractKeysResponse); +GPBObjCClassDeclaration(GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0); +GPBObjCClassDeclaration(GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_IdentitiesKeys); +GPBObjCClassDeclaration(GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_IdentityKeys); +GPBObjCClassDeclaration(GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_PurposeKeys); GPBObjCClassDeclaration(GetIdentityBalanceAndRevisionRequest); GPBObjCClassDeclaration(GetIdentityBalanceAndRevisionRequest_GetIdentityBalanceAndRevisionRequestV0); GPBObjCClassDeclaration(GetIdentityBalanceAndRevisionResponse); @@ -165,6 +159,48 @@ @implementation PlatformRoot return descriptor; } +#pragma mark - Enum KeyPurpose + +GPBEnumDescriptor *KeyPurpose_EnumDescriptor(void) { + static _Atomic(GPBEnumDescriptor*) descriptor = nil; + if (!descriptor) { + static const char *valueNames = + "Authentication\000Encryption\000Decryption\000Tra" + "nsfer\000Voting\000"; + static const int32_t values[] = { + KeyPurpose_Authentication, + KeyPurpose_Encryption, + KeyPurpose_Decryption, + KeyPurpose_Transfer, + KeyPurpose_Voting, + }; + GPBEnumDescriptor *worker = + [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol(KeyPurpose) + valueNames:valueNames + values:values + count:(uint32_t)(sizeof(values) / sizeof(int32_t)) + enumVerifier:KeyPurpose_IsValidValue]; + GPBEnumDescriptor *expected = nil; + if (!atomic_compare_exchange_strong(&descriptor, &expected, worker)) { + [worker release]; + } + } + return descriptor; +} + +BOOL KeyPurpose_IsValidValue(int32_t value__) { + switch (value__) { + case KeyPurpose_Authentication: + case KeyPurpose_Encryption: + case KeyPurpose_Decryption: + case KeyPurpose_Transfer: + case KeyPurpose_Voting: + return YES; + default: + return NO; + } +} + #pragma mark - Proof @implementation Proof @@ -1222,17 +1258,17 @@ void GetIdentityResponse_GetIdentityResponseV0_ClearResultOneOfCase(GetIdentityR GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; GPBClearOneof(message, oneof); } -#pragma mark - GetIdentitiesRequest +#pragma mark - GetIdentityNonceResponse -@implementation GetIdentitiesRequest +@implementation GetIdentityNonceResponse @dynamic versionOneOfCase; @dynamic v0; -typedef struct GetIdentitiesRequest__storage_ { +typedef struct GetIdentityNonceResponse__storage_ { uint32_t _has_storage_[2]; - GetIdentitiesRequest_GetIdentitiesRequestV0 *v0; -} GetIdentitiesRequest__storage_; + GetIdentityNonceResponse_GetIdentityNonceResponseV0 *v0; +} GetIdentityNonceResponse__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. @@ -1242,21 +1278,21 @@ + (GPBDescriptor *)descriptor { static GPBMessageFieldDescription fields[] = { { .name = "v0", - .dataTypeSpecific.clazz = GPBObjCClass(GetIdentitiesRequest_GetIdentitiesRequestV0), - .number = GetIdentitiesRequest_FieldNumber_V0, + .dataTypeSpecific.clazz = GPBObjCClass(GetIdentityNonceResponse_GetIdentityNonceResponseV0), + .number = GetIdentityNonceResponse_FieldNumber_V0, .hasIndex = -1, - .offset = (uint32_t)offsetof(GetIdentitiesRequest__storage_, v0), + .offset = (uint32_t)offsetof(GetIdentityNonceResponse__storage_, v0), .flags = GPBFieldOptional, .dataType = GPBDataTypeMessage, }, }; GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetIdentitiesRequest class] + [GPBDescriptor allocDescriptorForClass:[GetIdentityNonceResponse class] rootClass:[PlatformRoot class] file:PlatformRoot_FileDescriptor() fields:fields fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetIdentitiesRequest__storage_) + storageSize:sizeof(GetIdentityNonceResponse__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; static const char *oneofs[] = { "version", @@ -1274,22 +1310,26 @@ + (GPBDescriptor *)descriptor { @end -void GetIdentitiesRequest_ClearVersionOneOfCase(GetIdentitiesRequest *message) { - GPBDescriptor *descriptor = [GetIdentitiesRequest descriptor]; +void GetIdentityNonceResponse_ClearVersionOneOfCase(GetIdentityNonceResponse *message) { + GPBDescriptor *descriptor = [GetIdentityNonceResponse descriptor]; GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; GPBClearOneof(message, oneof); } -#pragma mark - GetIdentitiesRequest_GetIdentitiesRequestV0 +#pragma mark - GetIdentityNonceResponse_GetIdentityNonceResponseV0 -@implementation GetIdentitiesRequest_GetIdentitiesRequestV0 +@implementation GetIdentityNonceResponse_GetIdentityNonceResponseV0 -@dynamic idsArray, idsArray_Count; -@dynamic prove; +@dynamic resultOneOfCase; +@dynamic identityNonce; +@dynamic proof; +@dynamic hasMetadata, metadata; -typedef struct GetIdentitiesRequest_GetIdentitiesRequestV0__storage_ { - uint32_t _has_storage_[1]; - NSMutableArray *idsArray; -} GetIdentitiesRequest_GetIdentitiesRequestV0__storage_; +typedef struct GetIdentityNonceResponse_GetIdentityNonceResponseV0__storage_ { + uint32_t _has_storage_[2]; + Proof *proof; + ResponseMetadata *metadata; + uint64_t identityNonce; +} GetIdentityNonceResponse_GetIdentityNonceResponseV0__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. @@ -1298,33 +1338,48 @@ + (GPBDescriptor *)descriptor { if (!descriptor) { static GPBMessageFieldDescription fields[] = { { - .name = "idsArray", + .name = "identityNonce", .dataTypeSpecific.clazz = Nil, - .number = GetIdentitiesRequest_GetIdentitiesRequestV0_FieldNumber_IdsArray, - .hasIndex = GPBNoHasBit, - .offset = (uint32_t)offsetof(GetIdentitiesRequest_GetIdentitiesRequestV0__storage_, idsArray), - .flags = GPBFieldRepeated, - .dataType = GPBDataTypeBytes, + .number = GetIdentityNonceResponse_GetIdentityNonceResponseV0_FieldNumber_IdentityNonce, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetIdentityNonceResponse_GetIdentityNonceResponseV0__storage_, identityNonce), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeUInt64, }, { - .name = "prove", - .dataTypeSpecific.clazz = Nil, - .number = GetIdentitiesRequest_GetIdentitiesRequestV0_FieldNumber_Prove, + .name = "proof", + .dataTypeSpecific.clazz = GPBObjCClass(Proof), + .number = GetIdentityNonceResponse_GetIdentityNonceResponseV0_FieldNumber_Proof, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetIdentityNonceResponse_GetIdentityNonceResponseV0__storage_, proof), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + { + .name = "metadata", + .dataTypeSpecific.clazz = GPBObjCClass(ResponseMetadata), + .number = GetIdentityNonceResponse_GetIdentityNonceResponseV0_FieldNumber_Metadata, .hasIndex = 0, - .offset = 1, // Stored in _has_storage_ to save space. - .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), - .dataType = GPBDataTypeBool, + .offset = (uint32_t)offsetof(GetIdentityNonceResponse_GetIdentityNonceResponseV0__storage_, metadata), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, }, }; GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetIdentitiesRequest_GetIdentitiesRequestV0 class] + [GPBDescriptor allocDescriptorForClass:[GetIdentityNonceResponse_GetIdentityNonceResponseV0 class] rootClass:[PlatformRoot class] file:PlatformRoot_FileDescriptor() fields:fields fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetIdentitiesRequest_GetIdentitiesRequestV0__storage_) + storageSize:sizeof(GetIdentityNonceResponse_GetIdentityNonceResponseV0__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; - [localDescriptor setupContainingMessageClass:GPBObjCClass(GetIdentitiesRequest)]; + static const char *oneofs[] = { + "result", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetIdentityNonceResponse)]; #if defined(DEBUG) && DEBUG NSAssert(descriptor == nil, @"Startup recursed!"); #endif // DEBUG @@ -1335,17 +1390,22 @@ + (GPBDescriptor *)descriptor { @end -#pragma mark - GetIdentitiesResponse +void GetIdentityNonceResponse_GetIdentityNonceResponseV0_ClearResultOneOfCase(GetIdentityNonceResponse_GetIdentityNonceResponseV0 *message) { + GPBDescriptor *descriptor = [GetIdentityNonceResponse_GetIdentityNonceResponseV0 descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetIdentityContractNonceResponse -@implementation GetIdentitiesResponse +@implementation GetIdentityContractNonceResponse @dynamic versionOneOfCase; @dynamic v0; -typedef struct GetIdentitiesResponse__storage_ { +typedef struct GetIdentityContractNonceResponse__storage_ { uint32_t _has_storage_[2]; - GetIdentitiesResponse_GetIdentitiesResponseV0 *v0; -} GetIdentitiesResponse__storage_; + GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0 *v0; +} GetIdentityContractNonceResponse__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. @@ -1355,21 +1415,21 @@ + (GPBDescriptor *)descriptor { static GPBMessageFieldDescription fields[] = { { .name = "v0", - .dataTypeSpecific.clazz = GPBObjCClass(GetIdentitiesResponse_GetIdentitiesResponseV0), - .number = GetIdentitiesResponse_FieldNumber_V0, + .dataTypeSpecific.clazz = GPBObjCClass(GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0), + .number = GetIdentityContractNonceResponse_FieldNumber_V0, .hasIndex = -1, - .offset = (uint32_t)offsetof(GetIdentitiesResponse__storage_, v0), + .offset = (uint32_t)offsetof(GetIdentityContractNonceResponse__storage_, v0), .flags = GPBFieldOptional, .dataType = GPBDataTypeMessage, }, }; GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetIdentitiesResponse class] + [GPBDescriptor allocDescriptorForClass:[GetIdentityContractNonceResponse class] rootClass:[PlatformRoot class] file:PlatformRoot_FileDescriptor() fields:fields fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetIdentitiesResponse__storage_) + storageSize:sizeof(GetIdentityContractNonceResponse__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; static const char *oneofs[] = { "version", @@ -1387,21 +1447,26 @@ + (GPBDescriptor *)descriptor { @end -void GetIdentitiesResponse_ClearVersionOneOfCase(GetIdentitiesResponse *message) { - GPBDescriptor *descriptor = [GetIdentitiesResponse descriptor]; +void GetIdentityContractNonceResponse_ClearVersionOneOfCase(GetIdentityContractNonceResponse *message) { + GPBDescriptor *descriptor = [GetIdentityContractNonceResponse descriptor]; GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; GPBClearOneof(message, oneof); } -#pragma mark - GetIdentitiesResponse_IdentityValue +#pragma mark - GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0 -@implementation GetIdentitiesResponse_IdentityValue +@implementation GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0 -@dynamic value; +@dynamic resultOneOfCase; +@dynamic identityContractNonce; +@dynamic proof; +@dynamic hasMetadata, metadata; -typedef struct GetIdentitiesResponse_IdentityValue__storage_ { - uint32_t _has_storage_[1]; - NSData *value; -} GetIdentitiesResponse_IdentityValue__storage_; +typedef struct GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0__storage_ { + uint32_t _has_storage_[2]; + Proof *proof; + ResponseMetadata *metadata; + uint64_t identityContractNonce; +} GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. @@ -1410,81 +1475,48 @@ + (GPBDescriptor *)descriptor { if (!descriptor) { static GPBMessageFieldDescription fields[] = { { - .name = "value", + .name = "identityContractNonce", .dataTypeSpecific.clazz = Nil, - .number = GetIdentitiesResponse_IdentityValue_FieldNumber_Value, - .hasIndex = 0, - .offset = (uint32_t)offsetof(GetIdentitiesResponse_IdentityValue__storage_, value), - .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), - .dataType = GPBDataTypeBytes, + .number = GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0_FieldNumber_IdentityContractNonce, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0__storage_, identityContractNonce), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeUInt64, }, - }; - GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetIdentitiesResponse_IdentityValue class] - rootClass:[PlatformRoot class] - file:PlatformRoot_FileDescriptor() - fields:fields - fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetIdentitiesResponse_IdentityValue__storage_) - flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; - [localDescriptor setupContainingMessageClass:GPBObjCClass(GetIdentitiesResponse)]; - #if defined(DEBUG) && DEBUG - NSAssert(descriptor == nil, @"Startup recursed!"); - #endif // DEBUG - descriptor = localDescriptor; - } - return descriptor; -} - -@end - -#pragma mark - GetIdentitiesResponse_IdentityEntry - -@implementation GetIdentitiesResponse_IdentityEntry - -@dynamic key; -@dynamic hasValue, value; - -typedef struct GetIdentitiesResponse_IdentityEntry__storage_ { - uint32_t _has_storage_[1]; - NSData *key; - GetIdentitiesResponse_IdentityValue *value; -} GetIdentitiesResponse_IdentityEntry__storage_; - -// This method is threadsafe because it is initially called -// in +initialize for each subclass. -+ (GPBDescriptor *)descriptor { - static GPBDescriptor *descriptor = nil; - if (!descriptor) { - static GPBMessageFieldDescription fields[] = { { - .name = "key", - .dataTypeSpecific.clazz = Nil, - .number = GetIdentitiesResponse_IdentityEntry_FieldNumber_Key, - .hasIndex = 0, - .offset = (uint32_t)offsetof(GetIdentitiesResponse_IdentityEntry__storage_, key), - .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), - .dataType = GPBDataTypeBytes, + .name = "proof", + .dataTypeSpecific.clazz = GPBObjCClass(Proof), + .number = GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0_FieldNumber_Proof, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0__storage_, proof), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, }, { - .name = "value", - .dataTypeSpecific.clazz = GPBObjCClass(GetIdentitiesResponse_IdentityValue), - .number = GetIdentitiesResponse_IdentityEntry_FieldNumber_Value, - .hasIndex = 1, - .offset = (uint32_t)offsetof(GetIdentitiesResponse_IdentityEntry__storage_, value), + .name = "metadata", + .dataTypeSpecific.clazz = GPBObjCClass(ResponseMetadata), + .number = GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0_FieldNumber_Metadata, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0__storage_, metadata), .flags = GPBFieldOptional, .dataType = GPBDataTypeMessage, }, }; GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetIdentitiesResponse_IdentityEntry class] + [GPBDescriptor allocDescriptorForClass:[GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0 class] rootClass:[PlatformRoot class] file:PlatformRoot_FileDescriptor() fields:fields fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetIdentitiesResponse_IdentityEntry__storage_) + storageSize:sizeof(GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; - [localDescriptor setupContainingMessageClass:GPBObjCClass(GetIdentitiesResponse)]; + static const char *oneofs[] = { + "result", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetIdentityContractNonceResponse)]; #if defined(DEBUG) && DEBUG NSAssert(descriptor == nil, @"Startup recursed!"); #endif // DEBUG @@ -1495,16 +1527,22 @@ + (GPBDescriptor *)descriptor { @end -#pragma mark - GetIdentitiesResponse_Identities +void GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0_ClearResultOneOfCase(GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0 *message) { + GPBDescriptor *descriptor = [GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0 descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetIdentityBalanceResponse -@implementation GetIdentitiesResponse_Identities +@implementation GetIdentityBalanceResponse -@dynamic identityEntriesArray, identityEntriesArray_Count; +@dynamic versionOneOfCase; +@dynamic v0; -typedef struct GetIdentitiesResponse_Identities__storage_ { - uint32_t _has_storage_[1]; - NSMutableArray *identityEntriesArray; -} GetIdentitiesResponse_Identities__storage_; +typedef struct GetIdentityBalanceResponse__storage_ { + uint32_t _has_storage_[2]; + GetIdentityBalanceResponse_GetIdentityBalanceResponseV0 *v0; +} GetIdentityBalanceResponse__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. @@ -1513,24 +1551,29 @@ + (GPBDescriptor *)descriptor { if (!descriptor) { static GPBMessageFieldDescription fields[] = { { - .name = "identityEntriesArray", - .dataTypeSpecific.clazz = GPBObjCClass(GetIdentitiesResponse_IdentityEntry), - .number = GetIdentitiesResponse_Identities_FieldNumber_IdentityEntriesArray, - .hasIndex = GPBNoHasBit, - .offset = (uint32_t)offsetof(GetIdentitiesResponse_Identities__storage_, identityEntriesArray), - .flags = GPBFieldRepeated, + .name = "v0", + .dataTypeSpecific.clazz = GPBObjCClass(GetIdentityBalanceResponse_GetIdentityBalanceResponseV0), + .number = GetIdentityBalanceResponse_FieldNumber_V0, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetIdentityBalanceResponse__storage_, v0), + .flags = GPBFieldOptional, .dataType = GPBDataTypeMessage, }, }; GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetIdentitiesResponse_Identities class] + [GPBDescriptor allocDescriptorForClass:[GetIdentityBalanceResponse class] rootClass:[PlatformRoot class] file:PlatformRoot_FileDescriptor() fields:fields fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetIdentitiesResponse_Identities__storage_) + storageSize:sizeof(GetIdentityBalanceResponse__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; - [localDescriptor setupContainingMessageClass:GPBObjCClass(GetIdentitiesResponse)]; + static const char *oneofs[] = { + "version", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; #if defined(DEBUG) && DEBUG NSAssert(descriptor == nil, @"Startup recursed!"); #endif // DEBUG @@ -1541,21 +1584,26 @@ + (GPBDescriptor *)descriptor { @end -#pragma mark - GetIdentitiesResponse_GetIdentitiesResponseV0 +void GetIdentityBalanceResponse_ClearVersionOneOfCase(GetIdentityBalanceResponse *message) { + GPBDescriptor *descriptor = [GetIdentityBalanceResponse descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetIdentityBalanceResponse_GetIdentityBalanceResponseV0 -@implementation GetIdentitiesResponse_GetIdentitiesResponseV0 +@implementation GetIdentityBalanceResponse_GetIdentityBalanceResponseV0 @dynamic resultOneOfCase; -@dynamic identities; +@dynamic balance; @dynamic proof; @dynamic hasMetadata, metadata; -typedef struct GetIdentitiesResponse_GetIdentitiesResponseV0__storage_ { +typedef struct GetIdentityBalanceResponse_GetIdentityBalanceResponseV0__storage_ { uint32_t _has_storage_[2]; - GetIdentitiesResponse_Identities *identities; Proof *proof; ResponseMetadata *metadata; -} GetIdentitiesResponse_GetIdentitiesResponseV0__storage_; + uint64_t balance; +} GetIdentityBalanceResponse_GetIdentityBalanceResponseV0__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. @@ -1564,40 +1612,40 @@ + (GPBDescriptor *)descriptor { if (!descriptor) { static GPBMessageFieldDescription fields[] = { { - .name = "identities", - .dataTypeSpecific.clazz = GPBObjCClass(GetIdentitiesResponse_Identities), - .number = GetIdentitiesResponse_GetIdentitiesResponseV0_FieldNumber_Identities, + .name = "balance", + .dataTypeSpecific.clazz = Nil, + .number = GetIdentityBalanceResponse_GetIdentityBalanceResponseV0_FieldNumber_Balance, .hasIndex = -1, - .offset = (uint32_t)offsetof(GetIdentitiesResponse_GetIdentitiesResponseV0__storage_, identities), + .offset = (uint32_t)offsetof(GetIdentityBalanceResponse_GetIdentityBalanceResponseV0__storage_, balance), .flags = GPBFieldOptional, - .dataType = GPBDataTypeMessage, + .dataType = GPBDataTypeUInt64, }, { .name = "proof", .dataTypeSpecific.clazz = GPBObjCClass(Proof), - .number = GetIdentitiesResponse_GetIdentitiesResponseV0_FieldNumber_Proof, + .number = GetIdentityBalanceResponse_GetIdentityBalanceResponseV0_FieldNumber_Proof, .hasIndex = -1, - .offset = (uint32_t)offsetof(GetIdentitiesResponse_GetIdentitiesResponseV0__storage_, proof), + .offset = (uint32_t)offsetof(GetIdentityBalanceResponse_GetIdentityBalanceResponseV0__storage_, proof), .flags = GPBFieldOptional, .dataType = GPBDataTypeMessage, }, { .name = "metadata", .dataTypeSpecific.clazz = GPBObjCClass(ResponseMetadata), - .number = GetIdentitiesResponse_GetIdentitiesResponseV0_FieldNumber_Metadata, + .number = GetIdentityBalanceResponse_GetIdentityBalanceResponseV0_FieldNumber_Metadata, .hasIndex = 0, - .offset = (uint32_t)offsetof(GetIdentitiesResponse_GetIdentitiesResponseV0__storage_, metadata), + .offset = (uint32_t)offsetof(GetIdentityBalanceResponse_GetIdentityBalanceResponseV0__storage_, metadata), .flags = GPBFieldOptional, .dataType = GPBDataTypeMessage, }, }; GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetIdentitiesResponse_GetIdentitiesResponseV0 class] + [GPBDescriptor allocDescriptorForClass:[GetIdentityBalanceResponse_GetIdentityBalanceResponseV0 class] rootClass:[PlatformRoot class] file:PlatformRoot_FileDescriptor() fields:fields fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetIdentitiesResponse_GetIdentitiesResponseV0__storage_) + storageSize:sizeof(GetIdentityBalanceResponse_GetIdentityBalanceResponseV0__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; static const char *oneofs[] = { "result", @@ -1605,7 +1653,7 @@ + (GPBDescriptor *)descriptor { [localDescriptor setupOneofs:oneofs count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) firstHasIndex:-1]; - [localDescriptor setupContainingMessageClass:GPBObjCClass(GetIdentitiesResponse)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetIdentityBalanceResponse)]; #if defined(DEBUG) && DEBUG NSAssert(descriptor == nil, @"Startup recursed!"); #endif // DEBUG @@ -1616,22 +1664,22 @@ + (GPBDescriptor *)descriptor { @end -void GetIdentitiesResponse_GetIdentitiesResponseV0_ClearResultOneOfCase(GetIdentitiesResponse_GetIdentitiesResponseV0 *message) { - GPBDescriptor *descriptor = [GetIdentitiesResponse_GetIdentitiesResponseV0 descriptor]; +void GetIdentityBalanceResponse_GetIdentityBalanceResponseV0_ClearResultOneOfCase(GetIdentityBalanceResponse_GetIdentityBalanceResponseV0 *message) { + GPBDescriptor *descriptor = [GetIdentityBalanceResponse_GetIdentityBalanceResponseV0 descriptor]; GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; GPBClearOneof(message, oneof); } -#pragma mark - GetIdentityNonceResponse +#pragma mark - GetIdentityBalanceAndRevisionResponse -@implementation GetIdentityNonceResponse +@implementation GetIdentityBalanceAndRevisionResponse @dynamic versionOneOfCase; @dynamic v0; -typedef struct GetIdentityNonceResponse__storage_ { +typedef struct GetIdentityBalanceAndRevisionResponse__storage_ { uint32_t _has_storage_[2]; - GetIdentityNonceResponse_GetIdentityNonceResponseV0 *v0; -} GetIdentityNonceResponse__storage_; + GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0 *v0; +} GetIdentityBalanceAndRevisionResponse__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. @@ -1641,21 +1689,21 @@ + (GPBDescriptor *)descriptor { static GPBMessageFieldDescription fields[] = { { .name = "v0", - .dataTypeSpecific.clazz = GPBObjCClass(GetIdentityNonceResponse_GetIdentityNonceResponseV0), - .number = GetIdentityNonceResponse_FieldNumber_V0, + .dataTypeSpecific.clazz = GPBObjCClass(GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0), + .number = GetIdentityBalanceAndRevisionResponse_FieldNumber_V0, .hasIndex = -1, - .offset = (uint32_t)offsetof(GetIdentityNonceResponse__storage_, v0), + .offset = (uint32_t)offsetof(GetIdentityBalanceAndRevisionResponse__storage_, v0), .flags = GPBFieldOptional, .dataType = GPBDataTypeMessage, }, }; GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetIdentityNonceResponse class] + [GPBDescriptor allocDescriptorForClass:[GetIdentityBalanceAndRevisionResponse class] rootClass:[PlatformRoot class] file:PlatformRoot_FileDescriptor() fields:fields fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetIdentityNonceResponse__storage_) + storageSize:sizeof(GetIdentityBalanceAndRevisionResponse__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; static const char *oneofs[] = { "version", @@ -1673,26 +1721,26 @@ + (GPBDescriptor *)descriptor { @end -void GetIdentityNonceResponse_ClearVersionOneOfCase(GetIdentityNonceResponse *message) { - GPBDescriptor *descriptor = [GetIdentityNonceResponse descriptor]; +void GetIdentityBalanceAndRevisionResponse_ClearVersionOneOfCase(GetIdentityBalanceAndRevisionResponse *message) { + GPBDescriptor *descriptor = [GetIdentityBalanceAndRevisionResponse descriptor]; GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; GPBClearOneof(message, oneof); } -#pragma mark - GetIdentityNonceResponse_GetIdentityNonceResponseV0 +#pragma mark - GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0 -@implementation GetIdentityNonceResponse_GetIdentityNonceResponseV0 +@implementation GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0 @dynamic resultOneOfCase; -@dynamic identityNonce; +@dynamic balanceAndRevision; @dynamic proof; @dynamic hasMetadata, metadata; -typedef struct GetIdentityNonceResponse_GetIdentityNonceResponseV0__storage_ { +typedef struct GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0__storage_ { uint32_t _has_storage_[2]; + GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0_BalanceAndRevision *balanceAndRevision; Proof *proof; ResponseMetadata *metadata; - uint64_t identityNonce; -} GetIdentityNonceResponse_GetIdentityNonceResponseV0__storage_; +} GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. @@ -1701,40 +1749,40 @@ + (GPBDescriptor *)descriptor { if (!descriptor) { static GPBMessageFieldDescription fields[] = { { - .name = "identityNonce", - .dataTypeSpecific.clazz = Nil, - .number = GetIdentityNonceResponse_GetIdentityNonceResponseV0_FieldNumber_IdentityNonce, + .name = "balanceAndRevision", + .dataTypeSpecific.clazz = GPBObjCClass(GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0_BalanceAndRevision), + .number = GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0_FieldNumber_BalanceAndRevision, .hasIndex = -1, - .offset = (uint32_t)offsetof(GetIdentityNonceResponse_GetIdentityNonceResponseV0__storage_, identityNonce), + .offset = (uint32_t)offsetof(GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0__storage_, balanceAndRevision), .flags = GPBFieldOptional, - .dataType = GPBDataTypeUInt64, + .dataType = GPBDataTypeMessage, }, { .name = "proof", .dataTypeSpecific.clazz = GPBObjCClass(Proof), - .number = GetIdentityNonceResponse_GetIdentityNonceResponseV0_FieldNumber_Proof, + .number = GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0_FieldNumber_Proof, .hasIndex = -1, - .offset = (uint32_t)offsetof(GetIdentityNonceResponse_GetIdentityNonceResponseV0__storage_, proof), + .offset = (uint32_t)offsetof(GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0__storage_, proof), .flags = GPBFieldOptional, .dataType = GPBDataTypeMessage, }, { .name = "metadata", .dataTypeSpecific.clazz = GPBObjCClass(ResponseMetadata), - .number = GetIdentityNonceResponse_GetIdentityNonceResponseV0_FieldNumber_Metadata, + .number = GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0_FieldNumber_Metadata, .hasIndex = 0, - .offset = (uint32_t)offsetof(GetIdentityNonceResponse_GetIdentityNonceResponseV0__storage_, metadata), + .offset = (uint32_t)offsetof(GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0__storage_, metadata), .flags = GPBFieldOptional, .dataType = GPBDataTypeMessage, }, }; GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetIdentityNonceResponse_GetIdentityNonceResponseV0 class] + [GPBDescriptor allocDescriptorForClass:[GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0 class] rootClass:[PlatformRoot class] file:PlatformRoot_FileDescriptor() fields:fields fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetIdentityNonceResponse_GetIdentityNonceResponseV0__storage_) + storageSize:sizeof(GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; static const char *oneofs[] = { "result", @@ -1742,7 +1790,7 @@ + (GPBDescriptor *)descriptor { [localDescriptor setupOneofs:oneofs count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) firstHasIndex:-1]; - [localDescriptor setupContainingMessageClass:GPBObjCClass(GetIdentityNonceResponse)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetIdentityBalanceAndRevisionResponse)]; #if defined(DEBUG) && DEBUG NSAssert(descriptor == nil, @"Startup recursed!"); #endif // DEBUG @@ -1753,22 +1801,23 @@ + (GPBDescriptor *)descriptor { @end -void GetIdentityNonceResponse_GetIdentityNonceResponseV0_ClearResultOneOfCase(GetIdentityNonceResponse_GetIdentityNonceResponseV0 *message) { - GPBDescriptor *descriptor = [GetIdentityNonceResponse_GetIdentityNonceResponseV0 descriptor]; +void GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0_ClearResultOneOfCase(GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0 *message) { + GPBDescriptor *descriptor = [GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0 descriptor]; GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; GPBClearOneof(message, oneof); } -#pragma mark - GetIdentityContractNonceResponse +#pragma mark - GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0_BalanceAndRevision -@implementation GetIdentityContractNonceResponse +@implementation GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0_BalanceAndRevision -@dynamic versionOneOfCase; -@dynamic v0; +@dynamic balance; +@dynamic revision; -typedef struct GetIdentityContractNonceResponse__storage_ { - uint32_t _has_storage_[2]; - GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0 *v0; -} GetIdentityContractNonceResponse__storage_; +typedef struct GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0_BalanceAndRevision__storage_ { + uint32_t _has_storage_[1]; + uint64_t balance; + uint64_t revision; +} GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0_BalanceAndRevision__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. @@ -1777,29 +1826,33 @@ + (GPBDescriptor *)descriptor { if (!descriptor) { static GPBMessageFieldDescription fields[] = { { - .name = "v0", - .dataTypeSpecific.clazz = GPBObjCClass(GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0), - .number = GetIdentityContractNonceResponse_FieldNumber_V0, - .hasIndex = -1, - .offset = (uint32_t)offsetof(GetIdentityContractNonceResponse__storage_, v0), - .flags = GPBFieldOptional, - .dataType = GPBDataTypeMessage, + .name = "balance", + .dataTypeSpecific.clazz = Nil, + .number = GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0_BalanceAndRevision_FieldNumber_Balance, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0_BalanceAndRevision__storage_, balance), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeUInt64, + }, + { + .name = "revision", + .dataTypeSpecific.clazz = Nil, + .number = GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0_BalanceAndRevision_FieldNumber_Revision, + .hasIndex = 1, + .offset = (uint32_t)offsetof(GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0_BalanceAndRevision__storage_, revision), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeUInt64, }, }; GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetIdentityContractNonceResponse class] + [GPBDescriptor allocDescriptorForClass:[GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0_BalanceAndRevision class] rootClass:[PlatformRoot class] file:PlatformRoot_FileDescriptor() fields:fields fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetIdentityContractNonceResponse__storage_) + storageSize:sizeof(GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0_BalanceAndRevision__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; - static const char *oneofs[] = { - "version", - }; - [localDescriptor setupOneofs:oneofs - count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) - firstHasIndex:-1]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0)]; #if defined(DEBUG) && DEBUG NSAssert(descriptor == nil, @"Startup recursed!"); #endif // DEBUG @@ -1810,26 +1863,21 @@ + (GPBDescriptor *)descriptor { @end -void GetIdentityContractNonceResponse_ClearVersionOneOfCase(GetIdentityContractNonceResponse *message) { - GPBDescriptor *descriptor = [GetIdentityContractNonceResponse descriptor]; - GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; - GPBClearOneof(message, oneof); -} -#pragma mark - GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0 +#pragma mark - KeyRequestType -@implementation GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0 +@implementation KeyRequestType -@dynamic resultOneOfCase; -@dynamic identityContractNonce; -@dynamic proof; -@dynamic hasMetadata, metadata; +@dynamic requestOneOfCase; +@dynamic allKeys; +@dynamic specificKeys; +@dynamic searchKey; -typedef struct GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0__storage_ { +typedef struct KeyRequestType__storage_ { uint32_t _has_storage_[2]; - Proof *proof; - ResponseMetadata *metadata; - uint64_t identityContractNonce; -} GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0__storage_; + AllKeys *allKeys; + SpecificKeys *specificKeys; + SearchKey *searchKey; +} KeyRequestType__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. @@ -1838,48 +1886,47 @@ + (GPBDescriptor *)descriptor { if (!descriptor) { static GPBMessageFieldDescription fields[] = { { - .name = "identityContractNonce", - .dataTypeSpecific.clazz = Nil, - .number = GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0_FieldNumber_IdentityContractNonce, + .name = "allKeys", + .dataTypeSpecific.clazz = GPBObjCClass(AllKeys), + .number = KeyRequestType_FieldNumber_AllKeys, .hasIndex = -1, - .offset = (uint32_t)offsetof(GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0__storage_, identityContractNonce), + .offset = (uint32_t)offsetof(KeyRequestType__storage_, allKeys), .flags = GPBFieldOptional, - .dataType = GPBDataTypeUInt64, + .dataType = GPBDataTypeMessage, }, { - .name = "proof", - .dataTypeSpecific.clazz = GPBObjCClass(Proof), - .number = GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0_FieldNumber_Proof, + .name = "specificKeys", + .dataTypeSpecific.clazz = GPBObjCClass(SpecificKeys), + .number = KeyRequestType_FieldNumber_SpecificKeys, .hasIndex = -1, - .offset = (uint32_t)offsetof(GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0__storage_, proof), + .offset = (uint32_t)offsetof(KeyRequestType__storage_, specificKeys), .flags = GPBFieldOptional, .dataType = GPBDataTypeMessage, }, { - .name = "metadata", - .dataTypeSpecific.clazz = GPBObjCClass(ResponseMetadata), - .number = GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0_FieldNumber_Metadata, - .hasIndex = 0, - .offset = (uint32_t)offsetof(GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0__storage_, metadata), + .name = "searchKey", + .dataTypeSpecific.clazz = GPBObjCClass(SearchKey), + .number = KeyRequestType_FieldNumber_SearchKey, + .hasIndex = -1, + .offset = (uint32_t)offsetof(KeyRequestType__storage_, searchKey), .flags = GPBFieldOptional, .dataType = GPBDataTypeMessage, }, }; GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0 class] + [GPBDescriptor allocDescriptorForClass:[KeyRequestType class] rootClass:[PlatformRoot class] file:PlatformRoot_FileDescriptor() fields:fields fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0__storage_) + storageSize:sizeof(KeyRequestType__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; static const char *oneofs[] = { - "result", + "request", }; [localDescriptor setupOneofs:oneofs count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) firstHasIndex:-1]; - [localDescriptor setupContainingMessageClass:GPBObjCClass(GetIdentityContractNonceResponse)]; #if defined(DEBUG) && DEBUG NSAssert(descriptor == nil, @"Startup recursed!"); #endif // DEBUG @@ -1890,53 +1937,33 @@ + (GPBDescriptor *)descriptor { @end -void GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0_ClearResultOneOfCase(GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0 *message) { - GPBDescriptor *descriptor = [GetIdentityContractNonceResponse_GetIdentityContractNonceResponseV0 descriptor]; +void KeyRequestType_ClearRequestOneOfCase(KeyRequestType *message) { + GPBDescriptor *descriptor = [KeyRequestType descriptor]; GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; GPBClearOneof(message, oneof); } -#pragma mark - GetIdentityBalanceResponse +#pragma mark - AllKeys -@implementation GetIdentityBalanceResponse +@implementation AllKeys -@dynamic versionOneOfCase; -@dynamic v0; -typedef struct GetIdentityBalanceResponse__storage_ { - uint32_t _has_storage_[2]; - GetIdentityBalanceResponse_GetIdentityBalanceResponseV0 *v0; -} GetIdentityBalanceResponse__storage_; +typedef struct AllKeys__storage_ { + uint32_t _has_storage_[1]; +} AllKeys__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. + (GPBDescriptor *)descriptor { static GPBDescriptor *descriptor = nil; if (!descriptor) { - static GPBMessageFieldDescription fields[] = { - { - .name = "v0", - .dataTypeSpecific.clazz = GPBObjCClass(GetIdentityBalanceResponse_GetIdentityBalanceResponseV0), - .number = GetIdentityBalanceResponse_FieldNumber_V0, - .hasIndex = -1, - .offset = (uint32_t)offsetof(GetIdentityBalanceResponse__storage_, v0), - .flags = GPBFieldOptional, - .dataType = GPBDataTypeMessage, - }, - }; GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetIdentityBalanceResponse class] + [GPBDescriptor allocDescriptorForClass:[AllKeys class] rootClass:[PlatformRoot class] file:PlatformRoot_FileDescriptor() - fields:fields - fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetIdentityBalanceResponse__storage_) + fields:NULL + fieldCount:0 + storageSize:sizeof(AllKeys__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; - static const char *oneofs[] = { - "version", - }; - [localDescriptor setupOneofs:oneofs - count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) - firstHasIndex:-1]; #if defined(DEBUG) && DEBUG NSAssert(descriptor == nil, @"Startup recursed!"); #endif // DEBUG @@ -1947,26 +1974,16 @@ + (GPBDescriptor *)descriptor { @end -void GetIdentityBalanceResponse_ClearVersionOneOfCase(GetIdentityBalanceResponse *message) { - GPBDescriptor *descriptor = [GetIdentityBalanceResponse descriptor]; - GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; - GPBClearOneof(message, oneof); -} -#pragma mark - GetIdentityBalanceResponse_GetIdentityBalanceResponseV0 +#pragma mark - SpecificKeys -@implementation GetIdentityBalanceResponse_GetIdentityBalanceResponseV0 +@implementation SpecificKeys -@dynamic resultOneOfCase; -@dynamic balance; -@dynamic proof; -@dynamic hasMetadata, metadata; +@dynamic keyIdsArray, keyIdsArray_Count; -typedef struct GetIdentityBalanceResponse_GetIdentityBalanceResponseV0__storage_ { - uint32_t _has_storage_[2]; - Proof *proof; - ResponseMetadata *metadata; - uint64_t balance; -} GetIdentityBalanceResponse_GetIdentityBalanceResponseV0__storage_; +typedef struct SpecificKeys__storage_ { + uint32_t _has_storage_[1]; + GPBUInt32Array *keyIdsArray; +} SpecificKeys__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. @@ -1975,393 +1992,13 @@ + (GPBDescriptor *)descriptor { if (!descriptor) { static GPBMessageFieldDescription fields[] = { { - .name = "balance", + .name = "keyIdsArray", .dataTypeSpecific.clazz = Nil, - .number = GetIdentityBalanceResponse_GetIdentityBalanceResponseV0_FieldNumber_Balance, - .hasIndex = -1, - .offset = (uint32_t)offsetof(GetIdentityBalanceResponse_GetIdentityBalanceResponseV0__storage_, balance), - .flags = GPBFieldOptional, - .dataType = GPBDataTypeUInt64, - }, - { - .name = "proof", - .dataTypeSpecific.clazz = GPBObjCClass(Proof), - .number = GetIdentityBalanceResponse_GetIdentityBalanceResponseV0_FieldNumber_Proof, - .hasIndex = -1, - .offset = (uint32_t)offsetof(GetIdentityBalanceResponse_GetIdentityBalanceResponseV0__storage_, proof), - .flags = GPBFieldOptional, - .dataType = GPBDataTypeMessage, - }, - { - .name = "metadata", - .dataTypeSpecific.clazz = GPBObjCClass(ResponseMetadata), - .number = GetIdentityBalanceResponse_GetIdentityBalanceResponseV0_FieldNumber_Metadata, - .hasIndex = 0, - .offset = (uint32_t)offsetof(GetIdentityBalanceResponse_GetIdentityBalanceResponseV0__storage_, metadata), - .flags = GPBFieldOptional, - .dataType = GPBDataTypeMessage, - }, - }; - GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetIdentityBalanceResponse_GetIdentityBalanceResponseV0 class] - rootClass:[PlatformRoot class] - file:PlatformRoot_FileDescriptor() - fields:fields - fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetIdentityBalanceResponse_GetIdentityBalanceResponseV0__storage_) - flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; - static const char *oneofs[] = { - "result", - }; - [localDescriptor setupOneofs:oneofs - count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) - firstHasIndex:-1]; - [localDescriptor setupContainingMessageClass:GPBObjCClass(GetIdentityBalanceResponse)]; - #if defined(DEBUG) && DEBUG - NSAssert(descriptor == nil, @"Startup recursed!"); - #endif // DEBUG - descriptor = localDescriptor; - } - return descriptor; -} - -@end - -void GetIdentityBalanceResponse_GetIdentityBalanceResponseV0_ClearResultOneOfCase(GetIdentityBalanceResponse_GetIdentityBalanceResponseV0 *message) { - GPBDescriptor *descriptor = [GetIdentityBalanceResponse_GetIdentityBalanceResponseV0 descriptor]; - GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; - GPBClearOneof(message, oneof); -} -#pragma mark - GetIdentityBalanceAndRevisionResponse - -@implementation GetIdentityBalanceAndRevisionResponse - -@dynamic versionOneOfCase; -@dynamic v0; - -typedef struct GetIdentityBalanceAndRevisionResponse__storage_ { - uint32_t _has_storage_[2]; - GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0 *v0; -} GetIdentityBalanceAndRevisionResponse__storage_; - -// This method is threadsafe because it is initially called -// in +initialize for each subclass. -+ (GPBDescriptor *)descriptor { - static GPBDescriptor *descriptor = nil; - if (!descriptor) { - static GPBMessageFieldDescription fields[] = { - { - .name = "v0", - .dataTypeSpecific.clazz = GPBObjCClass(GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0), - .number = GetIdentityBalanceAndRevisionResponse_FieldNumber_V0, - .hasIndex = -1, - .offset = (uint32_t)offsetof(GetIdentityBalanceAndRevisionResponse__storage_, v0), - .flags = GPBFieldOptional, - .dataType = GPBDataTypeMessage, - }, - }; - GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetIdentityBalanceAndRevisionResponse class] - rootClass:[PlatformRoot class] - file:PlatformRoot_FileDescriptor() - fields:fields - fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetIdentityBalanceAndRevisionResponse__storage_) - flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; - static const char *oneofs[] = { - "version", - }; - [localDescriptor setupOneofs:oneofs - count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) - firstHasIndex:-1]; - #if defined(DEBUG) && DEBUG - NSAssert(descriptor == nil, @"Startup recursed!"); - #endif // DEBUG - descriptor = localDescriptor; - } - return descriptor; -} - -@end - -void GetIdentityBalanceAndRevisionResponse_ClearVersionOneOfCase(GetIdentityBalanceAndRevisionResponse *message) { - GPBDescriptor *descriptor = [GetIdentityBalanceAndRevisionResponse descriptor]; - GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; - GPBClearOneof(message, oneof); -} -#pragma mark - GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0 - -@implementation GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0 - -@dynamic resultOneOfCase; -@dynamic balanceAndRevision; -@dynamic proof; -@dynamic hasMetadata, metadata; - -typedef struct GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0__storage_ { - uint32_t _has_storage_[2]; - GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0_BalanceAndRevision *balanceAndRevision; - Proof *proof; - ResponseMetadata *metadata; -} GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0__storage_; - -// This method is threadsafe because it is initially called -// in +initialize for each subclass. -+ (GPBDescriptor *)descriptor { - static GPBDescriptor *descriptor = nil; - if (!descriptor) { - static GPBMessageFieldDescription fields[] = { - { - .name = "balanceAndRevision", - .dataTypeSpecific.clazz = GPBObjCClass(GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0_BalanceAndRevision), - .number = GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0_FieldNumber_BalanceAndRevision, - .hasIndex = -1, - .offset = (uint32_t)offsetof(GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0__storage_, balanceAndRevision), - .flags = GPBFieldOptional, - .dataType = GPBDataTypeMessage, - }, - { - .name = "proof", - .dataTypeSpecific.clazz = GPBObjCClass(Proof), - .number = GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0_FieldNumber_Proof, - .hasIndex = -1, - .offset = (uint32_t)offsetof(GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0__storage_, proof), - .flags = GPBFieldOptional, - .dataType = GPBDataTypeMessage, - }, - { - .name = "metadata", - .dataTypeSpecific.clazz = GPBObjCClass(ResponseMetadata), - .number = GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0_FieldNumber_Metadata, - .hasIndex = 0, - .offset = (uint32_t)offsetof(GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0__storage_, metadata), - .flags = GPBFieldOptional, - .dataType = GPBDataTypeMessage, - }, - }; - GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0 class] - rootClass:[PlatformRoot class] - file:PlatformRoot_FileDescriptor() - fields:fields - fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0__storage_) - flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; - static const char *oneofs[] = { - "result", - }; - [localDescriptor setupOneofs:oneofs - count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) - firstHasIndex:-1]; - [localDescriptor setupContainingMessageClass:GPBObjCClass(GetIdentityBalanceAndRevisionResponse)]; - #if defined(DEBUG) && DEBUG - NSAssert(descriptor == nil, @"Startup recursed!"); - #endif // DEBUG - descriptor = localDescriptor; - } - return descriptor; -} - -@end - -void GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0_ClearResultOneOfCase(GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0 *message) { - GPBDescriptor *descriptor = [GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0 descriptor]; - GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; - GPBClearOneof(message, oneof); -} -#pragma mark - GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0_BalanceAndRevision - -@implementation GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0_BalanceAndRevision - -@dynamic balance; -@dynamic revision; - -typedef struct GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0_BalanceAndRevision__storage_ { - uint32_t _has_storage_[1]; - uint64_t balance; - uint64_t revision; -} GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0_BalanceAndRevision__storage_; - -// This method is threadsafe because it is initially called -// in +initialize for each subclass. -+ (GPBDescriptor *)descriptor { - static GPBDescriptor *descriptor = nil; - if (!descriptor) { - static GPBMessageFieldDescription fields[] = { - { - .name = "balance", - .dataTypeSpecific.clazz = Nil, - .number = GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0_BalanceAndRevision_FieldNumber_Balance, - .hasIndex = 0, - .offset = (uint32_t)offsetof(GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0_BalanceAndRevision__storage_, balance), - .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), - .dataType = GPBDataTypeUInt64, - }, - { - .name = "revision", - .dataTypeSpecific.clazz = Nil, - .number = GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0_BalanceAndRevision_FieldNumber_Revision, - .hasIndex = 1, - .offset = (uint32_t)offsetof(GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0_BalanceAndRevision__storage_, revision), - .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), - .dataType = GPBDataTypeUInt64, - }, - }; - GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0_BalanceAndRevision class] - rootClass:[PlatformRoot class] - file:PlatformRoot_FileDescriptor() - fields:fields - fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0_BalanceAndRevision__storage_) - flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; - [localDescriptor setupContainingMessageClass:GPBObjCClass(GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0)]; - #if defined(DEBUG) && DEBUG - NSAssert(descriptor == nil, @"Startup recursed!"); - #endif // DEBUG - descriptor = localDescriptor; - } - return descriptor; -} - -@end - -#pragma mark - KeyRequestType - -@implementation KeyRequestType - -@dynamic requestOneOfCase; -@dynamic allKeys; -@dynamic specificKeys; -@dynamic searchKey; - -typedef struct KeyRequestType__storage_ { - uint32_t _has_storage_[2]; - AllKeys *allKeys; - SpecificKeys *specificKeys; - SearchKey *searchKey; -} KeyRequestType__storage_; - -// This method is threadsafe because it is initially called -// in +initialize for each subclass. -+ (GPBDescriptor *)descriptor { - static GPBDescriptor *descriptor = nil; - if (!descriptor) { - static GPBMessageFieldDescription fields[] = { - { - .name = "allKeys", - .dataTypeSpecific.clazz = GPBObjCClass(AllKeys), - .number = KeyRequestType_FieldNumber_AllKeys, - .hasIndex = -1, - .offset = (uint32_t)offsetof(KeyRequestType__storage_, allKeys), - .flags = GPBFieldOptional, - .dataType = GPBDataTypeMessage, - }, - { - .name = "specificKeys", - .dataTypeSpecific.clazz = GPBObjCClass(SpecificKeys), - .number = KeyRequestType_FieldNumber_SpecificKeys, - .hasIndex = -1, - .offset = (uint32_t)offsetof(KeyRequestType__storage_, specificKeys), - .flags = GPBFieldOptional, - .dataType = GPBDataTypeMessage, - }, - { - .name = "searchKey", - .dataTypeSpecific.clazz = GPBObjCClass(SearchKey), - .number = KeyRequestType_FieldNumber_SearchKey, - .hasIndex = -1, - .offset = (uint32_t)offsetof(KeyRequestType__storage_, searchKey), - .flags = GPBFieldOptional, - .dataType = GPBDataTypeMessage, - }, - }; - GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[KeyRequestType class] - rootClass:[PlatformRoot class] - file:PlatformRoot_FileDescriptor() - fields:fields - fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(KeyRequestType__storage_) - flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; - static const char *oneofs[] = { - "request", - }; - [localDescriptor setupOneofs:oneofs - count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) - firstHasIndex:-1]; - #if defined(DEBUG) && DEBUG - NSAssert(descriptor == nil, @"Startup recursed!"); - #endif // DEBUG - descriptor = localDescriptor; - } - return descriptor; -} - -@end - -void KeyRequestType_ClearRequestOneOfCase(KeyRequestType *message) { - GPBDescriptor *descriptor = [KeyRequestType descriptor]; - GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; - GPBClearOneof(message, oneof); -} -#pragma mark - AllKeys - -@implementation AllKeys - - -typedef struct AllKeys__storage_ { - uint32_t _has_storage_[1]; -} AllKeys__storage_; - -// This method is threadsafe because it is initially called -// in +initialize for each subclass. -+ (GPBDescriptor *)descriptor { - static GPBDescriptor *descriptor = nil; - if (!descriptor) { - GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[AllKeys class] - rootClass:[PlatformRoot class] - file:PlatformRoot_FileDescriptor() - fields:NULL - fieldCount:0 - storageSize:sizeof(AllKeys__storage_) - flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; - #if defined(DEBUG) && DEBUG - NSAssert(descriptor == nil, @"Startup recursed!"); - #endif // DEBUG - descriptor = localDescriptor; - } - return descriptor; -} - -@end - -#pragma mark - SpecificKeys - -@implementation SpecificKeys - -@dynamic keyIdsArray, keyIdsArray_Count; - -typedef struct SpecificKeys__storage_ { - uint32_t _has_storage_[1]; - GPBUInt32Array *keyIdsArray; -} SpecificKeys__storage_; - -// This method is threadsafe because it is initially called -// in +initialize for each subclass. -+ (GPBDescriptor *)descriptor { - static GPBDescriptor *descriptor = nil; - if (!descriptor) { - static GPBMessageFieldDescription fields[] = { - { - .name = "keyIdsArray", - .dataTypeSpecific.clazz = Nil, - .number = SpecificKeys_FieldNumber_KeyIdsArray, - .hasIndex = GPBNoHasBit, - .offset = (uint32_t)offsetof(SpecificKeys__storage_, keyIdsArray), - .flags = (GPBFieldFlags)(GPBFieldRepeated | GPBFieldPacked), - .dataType = GPBDataTypeUInt32, + .number = SpecificKeys_FieldNumber_KeyIdsArray, + .hasIndex = GPBNoHasBit, + .offset = (uint32_t)offsetof(SpecificKeys__storage_, keyIdsArray), + .flags = (GPBFieldFlags)(GPBFieldRepeated | GPBFieldPacked), + .dataType = GPBDataTypeUInt32, }, }; GPBDescriptor *localDescriptor = @@ -2837,17 +2474,17 @@ + (GPBDescriptor *)descriptor { @end -#pragma mark - GetProofsRequest +#pragma mark - GetIdentitiesContractKeysRequest -@implementation GetProofsRequest +@implementation GetIdentitiesContractKeysRequest @dynamic versionOneOfCase; @dynamic v0; -typedef struct GetProofsRequest__storage_ { +typedef struct GetIdentitiesContractKeysRequest__storage_ { uint32_t _has_storage_[2]; - GetProofsRequest_GetProofsRequestV0 *v0; -} GetProofsRequest__storage_; + GetIdentitiesContractKeysRequest_GetIdentitiesContractKeysRequestV0 *v0; +} GetIdentitiesContractKeysRequest__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. @@ -2857,21 +2494,21 @@ + (GPBDescriptor *)descriptor { static GPBMessageFieldDescription fields[] = { { .name = "v0", - .dataTypeSpecific.clazz = GPBObjCClass(GetProofsRequest_GetProofsRequestV0), - .number = GetProofsRequest_FieldNumber_V0, + .dataTypeSpecific.clazz = GPBObjCClass(GetIdentitiesContractKeysRequest_GetIdentitiesContractKeysRequestV0), + .number = GetIdentitiesContractKeysRequest_FieldNumber_V0, .hasIndex = -1, - .offset = (uint32_t)offsetof(GetProofsRequest__storage_, v0), + .offset = (uint32_t)offsetof(GetIdentitiesContractKeysRequest__storage_, v0), .flags = GPBFieldOptional, .dataType = GPBDataTypeMessage, }, }; GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetProofsRequest class] + [GPBDescriptor allocDescriptorForClass:[GetIdentitiesContractKeysRequest class] rootClass:[PlatformRoot class] file:PlatformRoot_FileDescriptor() fields:fields fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetProofsRequest__storage_) + storageSize:sizeof(GetIdentitiesContractKeysRequest__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; static const char *oneofs[] = { "version", @@ -2889,25 +2526,28 @@ + (GPBDescriptor *)descriptor { @end -void GetProofsRequest_ClearVersionOneOfCase(GetProofsRequest *message) { - GPBDescriptor *descriptor = [GetProofsRequest descriptor]; +void GetIdentitiesContractKeysRequest_ClearVersionOneOfCase(GetIdentitiesContractKeysRequest *message) { + GPBDescriptor *descriptor = [GetIdentitiesContractKeysRequest descriptor]; GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; GPBClearOneof(message, oneof); } -#pragma mark - GetProofsRequest_GetProofsRequestV0 +#pragma mark - GetIdentitiesContractKeysRequest_GetIdentitiesContractKeysRequestV0 -@implementation GetProofsRequest_GetProofsRequestV0 +@implementation GetIdentitiesContractKeysRequest_GetIdentitiesContractKeysRequestV0 -@dynamic identitiesArray, identitiesArray_Count; -@dynamic contractsArray, contractsArray_Count; -@dynamic documentsArray, documentsArray_Count; +@dynamic identitiesIdsArray, identitiesIdsArray_Count; +@dynamic contractId; +@dynamic hasDocumentTypeName, documentTypeName; +@dynamic purposesArray, purposesArray_Count; +@dynamic prove; -typedef struct GetProofsRequest_GetProofsRequestV0__storage_ { +typedef struct GetIdentitiesContractKeysRequest_GetIdentitiesContractKeysRequestV0__storage_ { uint32_t _has_storage_[1]; - NSMutableArray *identitiesArray; - NSMutableArray *contractsArray; - NSMutableArray *documentsArray; -} GetProofsRequest_GetProofsRequestV0__storage_; + NSMutableArray *identitiesIdsArray; + NSData *contractId; + NSString *documentTypeName; + GPBEnumArray *purposesArray; +} GetIdentitiesContractKeysRequest_GetIdentitiesContractKeysRequestV0__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. @@ -2916,42 +2556,60 @@ + (GPBDescriptor *)descriptor { if (!descriptor) { static GPBMessageFieldDescription fields[] = { { - .name = "identitiesArray", - .dataTypeSpecific.clazz = GPBObjCClass(GetProofsRequest_GetProofsRequestV0_IdentityRequest), - .number = GetProofsRequest_GetProofsRequestV0_FieldNumber_IdentitiesArray, + .name = "identitiesIdsArray", + .dataTypeSpecific.clazz = Nil, + .number = GetIdentitiesContractKeysRequest_GetIdentitiesContractKeysRequestV0_FieldNumber_IdentitiesIdsArray, .hasIndex = GPBNoHasBit, - .offset = (uint32_t)offsetof(GetProofsRequest_GetProofsRequestV0__storage_, identitiesArray), + .offset = (uint32_t)offsetof(GetIdentitiesContractKeysRequest_GetIdentitiesContractKeysRequestV0__storage_, identitiesIdsArray), .flags = GPBFieldRepeated, - .dataType = GPBDataTypeMessage, + .dataType = GPBDataTypeBytes, }, { - .name = "contractsArray", - .dataTypeSpecific.clazz = GPBObjCClass(GetProofsRequest_GetProofsRequestV0_ContractRequest), - .number = GetProofsRequest_GetProofsRequestV0_FieldNumber_ContractsArray, - .hasIndex = GPBNoHasBit, - .offset = (uint32_t)offsetof(GetProofsRequest_GetProofsRequestV0__storage_, contractsArray), - .flags = GPBFieldRepeated, - .dataType = GPBDataTypeMessage, + .name = "contractId", + .dataTypeSpecific.clazz = Nil, + .number = GetIdentitiesContractKeysRequest_GetIdentitiesContractKeysRequestV0_FieldNumber_ContractId, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetIdentitiesContractKeysRequest_GetIdentitiesContractKeysRequestV0__storage_, contractId), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, }, { - .name = "documentsArray", - .dataTypeSpecific.clazz = GPBObjCClass(GetProofsRequest_GetProofsRequestV0_DocumentRequest), - .number = GetProofsRequest_GetProofsRequestV0_FieldNumber_DocumentsArray, + .name = "documentTypeName", + .dataTypeSpecific.clazz = Nil, + .number = GetIdentitiesContractKeysRequest_GetIdentitiesContractKeysRequestV0_FieldNumber_DocumentTypeName, + .hasIndex = 1, + .offset = (uint32_t)offsetof(GetIdentitiesContractKeysRequest_GetIdentitiesContractKeysRequestV0__storage_, documentTypeName), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeString, + }, + { + .name = "purposesArray", + .dataTypeSpecific.enumDescFunc = KeyPurpose_EnumDescriptor, + .number = GetIdentitiesContractKeysRequest_GetIdentitiesContractKeysRequestV0_FieldNumber_PurposesArray, .hasIndex = GPBNoHasBit, - .offset = (uint32_t)offsetof(GetProofsRequest_GetProofsRequestV0__storage_, documentsArray), - .flags = GPBFieldRepeated, - .dataType = GPBDataTypeMessage, + .offset = (uint32_t)offsetof(GetIdentitiesContractKeysRequest_GetIdentitiesContractKeysRequestV0__storage_, purposesArray), + .flags = (GPBFieldFlags)(GPBFieldRepeated | GPBFieldPacked | GPBFieldHasEnumDescriptor), + .dataType = GPBDataTypeEnum, + }, + { + .name = "prove", + .dataTypeSpecific.clazz = Nil, + .number = GetIdentitiesContractKeysRequest_GetIdentitiesContractKeysRequestV0_FieldNumber_Prove, + .hasIndex = 2, + .offset = 3, // Stored in _has_storage_ to save space. + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBool, }, }; GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetProofsRequest_GetProofsRequestV0 class] + [GPBDescriptor allocDescriptorForClass:[GetIdentitiesContractKeysRequest_GetIdentitiesContractKeysRequestV0 class] rootClass:[PlatformRoot class] file:PlatformRoot_FileDescriptor() fields:fields fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetProofsRequest_GetProofsRequestV0__storage_) + storageSize:sizeof(GetIdentitiesContractKeysRequest_GetIdentitiesContractKeysRequestV0__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; - [localDescriptor setupContainingMessageClass:GPBObjCClass(GetProofsRequest)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetIdentitiesContractKeysRequest)]; #if defined(DEBUG) && DEBUG NSAssert(descriptor == nil, @"Startup recursed!"); #endif // DEBUG @@ -2962,21 +2620,17 @@ + (GPBDescriptor *)descriptor { @end -#pragma mark - GetProofsRequest_GetProofsRequestV0_DocumentRequest +#pragma mark - GetIdentitiesContractKeysResponse -@implementation GetProofsRequest_GetProofsRequestV0_DocumentRequest +@implementation GetIdentitiesContractKeysResponse -@dynamic contractId; -@dynamic documentType; -@dynamic documentTypeKeepsHistory; -@dynamic documentId; +@dynamic versionOneOfCase; +@dynamic v0; -typedef struct GetProofsRequest_GetProofsRequestV0_DocumentRequest__storage_ { - uint32_t _has_storage_[1]; - NSData *contractId; - NSString *documentType; - NSData *documentId; -} GetProofsRequest_GetProofsRequestV0_DocumentRequest__storage_; +typedef struct GetIdentitiesContractKeysResponse__storage_ { + uint32_t _has_storage_[2]; + GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0 *v0; +} GetIdentitiesContractKeysResponse__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. @@ -2985,51 +2639,109 @@ + (GPBDescriptor *)descriptor { if (!descriptor) { static GPBMessageFieldDescription fields[] = { { - .name = "contractId", - .dataTypeSpecific.clazz = Nil, - .number = GetProofsRequest_GetProofsRequestV0_DocumentRequest_FieldNumber_ContractId, - .hasIndex = 0, - .offset = (uint32_t)offsetof(GetProofsRequest_GetProofsRequestV0_DocumentRequest__storage_, contractId), - .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), - .dataType = GPBDataTypeBytes, + .name = "v0", + .dataTypeSpecific.clazz = GPBObjCClass(GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0), + .number = GetIdentitiesContractKeysResponse_FieldNumber_V0, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetIdentitiesContractKeysResponse__storage_, v0), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetIdentitiesContractKeysResponse class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetIdentitiesContractKeysResponse__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "version", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetIdentitiesContractKeysResponse_ClearVersionOneOfCase(GetIdentitiesContractKeysResponse *message) { + GPBDescriptor *descriptor = [GetIdentitiesContractKeysResponse descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0 + +@implementation GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0 + +@dynamic resultOneOfCase; +@dynamic identitiesKeys; +@dynamic proof; +@dynamic hasMetadata, metadata; + +typedef struct GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0__storage_ { + uint32_t _has_storage_[2]; + GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_IdentitiesKeys *identitiesKeys; + Proof *proof; + ResponseMetadata *metadata; +} GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { { - .name = "documentType", - .dataTypeSpecific.clazz = Nil, - .number = GetProofsRequest_GetProofsRequestV0_DocumentRequest_FieldNumber_DocumentType, - .hasIndex = 1, - .offset = (uint32_t)offsetof(GetProofsRequest_GetProofsRequestV0_DocumentRequest__storage_, documentType), - .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), - .dataType = GPBDataTypeString, + .name = "identitiesKeys", + .dataTypeSpecific.clazz = GPBObjCClass(GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_IdentitiesKeys), + .number = GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_FieldNumber_IdentitiesKeys, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0__storage_, identitiesKeys), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, }, { - .name = "documentTypeKeepsHistory", - .dataTypeSpecific.clazz = Nil, - .number = GetProofsRequest_GetProofsRequestV0_DocumentRequest_FieldNumber_DocumentTypeKeepsHistory, - .hasIndex = 2, - .offset = 3, // Stored in _has_storage_ to save space. - .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), - .dataType = GPBDataTypeBool, + .name = "proof", + .dataTypeSpecific.clazz = GPBObjCClass(Proof), + .number = GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_FieldNumber_Proof, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0__storage_, proof), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, }, { - .name = "documentId", - .dataTypeSpecific.clazz = Nil, - .number = GetProofsRequest_GetProofsRequestV0_DocumentRequest_FieldNumber_DocumentId, - .hasIndex = 4, - .offset = (uint32_t)offsetof(GetProofsRequest_GetProofsRequestV0_DocumentRequest__storage_, documentId), - .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), - .dataType = GPBDataTypeBytes, + .name = "metadata", + .dataTypeSpecific.clazz = GPBObjCClass(ResponseMetadata), + .number = GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_FieldNumber_Metadata, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0__storage_, metadata), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, }, }; GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetProofsRequest_GetProofsRequestV0_DocumentRequest class] + [GPBDescriptor allocDescriptorForClass:[GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0 class] rootClass:[PlatformRoot class] file:PlatformRoot_FileDescriptor() fields:fields fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetProofsRequest_GetProofsRequestV0_DocumentRequest__storage_) + storageSize:sizeof(GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; - [localDescriptor setupContainingMessageClass:GPBObjCClass(GetProofsRequest_GetProofsRequestV0)]; + static const char *oneofs[] = { + "result", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetIdentitiesContractKeysResponse)]; #if defined(DEBUG) && DEBUG NSAssert(descriptor == nil, @"Startup recursed!"); #endif // DEBUG @@ -3040,18 +2752,23 @@ + (GPBDescriptor *)descriptor { @end -#pragma mark - GetProofsRequest_GetProofsRequestV0_IdentityRequest +void GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_ClearResultOneOfCase(GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0 *message) { + GPBDescriptor *descriptor = [GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0 descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_PurposeKeys -@implementation GetProofsRequest_GetProofsRequestV0_IdentityRequest +@implementation GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_PurposeKeys -@dynamic identityId; -@dynamic requestType; +@dynamic purpose; +@dynamic keysBytesArray, keysBytesArray_Count; -typedef struct GetProofsRequest_GetProofsRequestV0_IdentityRequest__storage_ { +typedef struct GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_PurposeKeys__storage_ { uint32_t _has_storage_[1]; - GetProofsRequest_GetProofsRequestV0_IdentityRequest_Type requestType; - NSData *identityId; -} GetProofsRequest_GetProofsRequestV0_IdentityRequest__storage_; + KeyPurpose purpose; + NSMutableArray *keysBytesArray; +} GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_PurposeKeys__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. @@ -3060,33 +2777,33 @@ + (GPBDescriptor *)descriptor { if (!descriptor) { static GPBMessageFieldDescription fields[] = { { - .name = "identityId", - .dataTypeSpecific.clazz = Nil, - .number = GetProofsRequest_GetProofsRequestV0_IdentityRequest_FieldNumber_IdentityId, + .name = "purpose", + .dataTypeSpecific.enumDescFunc = KeyPurpose_EnumDescriptor, + .number = GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_PurposeKeys_FieldNumber_Purpose, .hasIndex = 0, - .offset = (uint32_t)offsetof(GetProofsRequest_GetProofsRequestV0_IdentityRequest__storage_, identityId), - .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), - .dataType = GPBDataTypeBytes, - }, - { - .name = "requestType", - .dataTypeSpecific.enumDescFunc = GetProofsRequest_GetProofsRequestV0_IdentityRequest_Type_EnumDescriptor, - .number = GetProofsRequest_GetProofsRequestV0_IdentityRequest_FieldNumber_RequestType, - .hasIndex = 1, - .offset = (uint32_t)offsetof(GetProofsRequest_GetProofsRequestV0_IdentityRequest__storage_, requestType), + .offset = (uint32_t)offsetof(GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_PurposeKeys__storage_, purpose), .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldHasEnumDescriptor | GPBFieldClearHasIvarOnZero), .dataType = GPBDataTypeEnum, }, + { + .name = "keysBytesArray", + .dataTypeSpecific.clazz = Nil, + .number = GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_PurposeKeys_FieldNumber_KeysBytesArray, + .hasIndex = GPBNoHasBit, + .offset = (uint32_t)offsetof(GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_PurposeKeys__storage_, keysBytesArray), + .flags = GPBFieldRepeated, + .dataType = GPBDataTypeBytes, + }, }; GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetProofsRequest_GetProofsRequestV0_IdentityRequest class] + [GPBDescriptor allocDescriptorForClass:[GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_PurposeKeys class] rootClass:[PlatformRoot class] file:PlatformRoot_FileDescriptor() fields:fields fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetProofsRequest_GetProofsRequestV0_IdentityRequest__storage_) + storageSize:sizeof(GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_PurposeKeys__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; - [localDescriptor setupContainingMessageClass:GPBObjCClass(GetProofsRequest_GetProofsRequestV0)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0)]; #if defined(DEBUG) && DEBUG NSAssert(descriptor == nil, @"Startup recursed!"); #endif // DEBUG @@ -3097,67 +2814,30 @@ + (GPBDescriptor *)descriptor { @end -int32_t GetProofsRequest_GetProofsRequestV0_IdentityRequest_RequestType_RawValue(GetProofsRequest_GetProofsRequestV0_IdentityRequest *message) { - GPBDescriptor *descriptor = [GetProofsRequest_GetProofsRequestV0_IdentityRequest descriptor]; - GPBFieldDescriptor *field = [descriptor fieldWithNumber:GetProofsRequest_GetProofsRequestV0_IdentityRequest_FieldNumber_RequestType]; +int32_t GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_PurposeKeys_Purpose_RawValue(GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_PurposeKeys *message) { + GPBDescriptor *descriptor = [GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_PurposeKeys descriptor]; + GPBFieldDescriptor *field = [descriptor fieldWithNumber:GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_PurposeKeys_FieldNumber_Purpose]; return GPBGetMessageRawEnumField(message, field); } -void SetGetProofsRequest_GetProofsRequestV0_IdentityRequest_RequestType_RawValue(GetProofsRequest_GetProofsRequestV0_IdentityRequest *message, int32_t value) { - GPBDescriptor *descriptor = [GetProofsRequest_GetProofsRequestV0_IdentityRequest descriptor]; - GPBFieldDescriptor *field = [descriptor fieldWithNumber:GetProofsRequest_GetProofsRequestV0_IdentityRequest_FieldNumber_RequestType]; +void SetGetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_PurposeKeys_Purpose_RawValue(GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_PurposeKeys *message, int32_t value) { + GPBDescriptor *descriptor = [GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_PurposeKeys descriptor]; + GPBFieldDescriptor *field = [descriptor fieldWithNumber:GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_PurposeKeys_FieldNumber_Purpose]; GPBSetMessageRawEnumField(message, field, value); } -#pragma mark - Enum GetProofsRequest_GetProofsRequestV0_IdentityRequest_Type - -GPBEnumDescriptor *GetProofsRequest_GetProofsRequestV0_IdentityRequest_Type_EnumDescriptor(void) { - static _Atomic(GPBEnumDescriptor*) descriptor = nil; - if (!descriptor) { - static const char *valueNames = - "FullIdentity\000Balance\000Keys\000Revision\000"; - static const int32_t values[] = { - GetProofsRequest_GetProofsRequestV0_IdentityRequest_Type_FullIdentity, - GetProofsRequest_GetProofsRequestV0_IdentityRequest_Type_Balance, - GetProofsRequest_GetProofsRequestV0_IdentityRequest_Type_Keys, - GetProofsRequest_GetProofsRequestV0_IdentityRequest_Type_Revision, - }; - GPBEnumDescriptor *worker = - [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol(GetProofsRequest_GetProofsRequestV0_IdentityRequest_Type) - valueNames:valueNames - values:values - count:(uint32_t)(sizeof(values) / sizeof(int32_t)) - enumVerifier:GetProofsRequest_GetProofsRequestV0_IdentityRequest_Type_IsValidValue]; - GPBEnumDescriptor *expected = nil; - if (!atomic_compare_exchange_strong(&descriptor, &expected, worker)) { - [worker release]; - } - } - return descriptor; -} - -BOOL GetProofsRequest_GetProofsRequestV0_IdentityRequest_Type_IsValidValue(int32_t value__) { - switch (value__) { - case GetProofsRequest_GetProofsRequestV0_IdentityRequest_Type_FullIdentity: - case GetProofsRequest_GetProofsRequestV0_IdentityRequest_Type_Balance: - case GetProofsRequest_GetProofsRequestV0_IdentityRequest_Type_Keys: - case GetProofsRequest_GetProofsRequestV0_IdentityRequest_Type_Revision: - return YES; - default: - return NO; - } -} - -#pragma mark - GetProofsRequest_GetProofsRequestV0_ContractRequest +#pragma mark - GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_IdentityKeys -@implementation GetProofsRequest_GetProofsRequestV0_ContractRequest +@implementation GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_IdentityKeys -@dynamic contractId; +@dynamic identityId; +@dynamic keysArray, keysArray_Count; -typedef struct GetProofsRequest_GetProofsRequestV0_ContractRequest__storage_ { +typedef struct GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_IdentityKeys__storage_ { uint32_t _has_storage_[1]; - NSData *contractId; -} GetProofsRequest_GetProofsRequestV0_ContractRequest__storage_; + NSData *identityId; + NSMutableArray *keysArray; +} GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_IdentityKeys__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. @@ -3166,24 +2846,33 @@ + (GPBDescriptor *)descriptor { if (!descriptor) { static GPBMessageFieldDescription fields[] = { { - .name = "contractId", + .name = "identityId", .dataTypeSpecific.clazz = Nil, - .number = GetProofsRequest_GetProofsRequestV0_ContractRequest_FieldNumber_ContractId, + .number = GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_IdentityKeys_FieldNumber_IdentityId, .hasIndex = 0, - .offset = (uint32_t)offsetof(GetProofsRequest_GetProofsRequestV0_ContractRequest__storage_, contractId), + .offset = (uint32_t)offsetof(GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_IdentityKeys__storage_, identityId), .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), .dataType = GPBDataTypeBytes, }, + { + .name = "keysArray", + .dataTypeSpecific.clazz = GPBObjCClass(GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_PurposeKeys), + .number = GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_IdentityKeys_FieldNumber_KeysArray, + .hasIndex = GPBNoHasBit, + .offset = (uint32_t)offsetof(GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_IdentityKeys__storage_, keysArray), + .flags = GPBFieldRepeated, + .dataType = GPBDataTypeMessage, + }, }; GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetProofsRequest_GetProofsRequestV0_ContractRequest class] + [GPBDescriptor allocDescriptorForClass:[GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_IdentityKeys class] rootClass:[PlatformRoot class] file:PlatformRoot_FileDescriptor() fields:fields fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetProofsRequest_GetProofsRequestV0_ContractRequest__storage_) + storageSize:sizeof(GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_IdentityKeys__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; - [localDescriptor setupContainingMessageClass:GPBObjCClass(GetProofsRequest_GetProofsRequestV0)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0)]; #if defined(DEBUG) && DEBUG NSAssert(descriptor == nil, @"Startup recursed!"); #endif // DEBUG @@ -3194,17 +2883,16 @@ + (GPBDescriptor *)descriptor { @end -#pragma mark - GetProofsResponse +#pragma mark - GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_IdentitiesKeys -@implementation GetProofsResponse +@implementation GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_IdentitiesKeys -@dynamic versionOneOfCase; -@dynamic v0; +@dynamic entriesArray, entriesArray_Count; -typedef struct GetProofsResponse__storage_ { - uint32_t _has_storage_[2]; - GetProofsResponse_GetProofsResponseV0 *v0; -} GetProofsResponse__storage_; +typedef struct GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_IdentitiesKeys__storage_ { + uint32_t _has_storage_[1]; + NSMutableArray *entriesArray; +} GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_IdentitiesKeys__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. @@ -3213,29 +2901,24 @@ + (GPBDescriptor *)descriptor { if (!descriptor) { static GPBMessageFieldDescription fields[] = { { - .name = "v0", - .dataTypeSpecific.clazz = GPBObjCClass(GetProofsResponse_GetProofsResponseV0), - .number = GetProofsResponse_FieldNumber_V0, - .hasIndex = -1, - .offset = (uint32_t)offsetof(GetProofsResponse__storage_, v0), - .flags = GPBFieldOptional, + .name = "entriesArray", + .dataTypeSpecific.clazz = GPBObjCClass(GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_IdentityKeys), + .number = GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_IdentitiesKeys_FieldNumber_EntriesArray, + .hasIndex = GPBNoHasBit, + .offset = (uint32_t)offsetof(GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_IdentitiesKeys__storage_, entriesArray), + .flags = GPBFieldRepeated, .dataType = GPBDataTypeMessage, }, }; GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetProofsResponse class] + [GPBDescriptor allocDescriptorForClass:[GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_IdentitiesKeys class] rootClass:[PlatformRoot class] file:PlatformRoot_FileDescriptor() fields:fields fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetProofsResponse__storage_) + storageSize:sizeof(GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_IdentitiesKeys__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; - static const char *oneofs[] = { - "version", - }; - [localDescriptor setupOneofs:oneofs - count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) - firstHasIndex:-1]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0)]; #if defined(DEBUG) && DEBUG NSAssert(descriptor == nil, @"Startup recursed!"); #endif // DEBUG @@ -3246,24 +2929,17 @@ + (GPBDescriptor *)descriptor { @end -void GetProofsResponse_ClearVersionOneOfCase(GetProofsResponse *message) { - GPBDescriptor *descriptor = [GetProofsResponse descriptor]; - GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; - GPBClearOneof(message, oneof); -} -#pragma mark - GetProofsResponse_GetProofsResponseV0 +#pragma mark - GetProofsRequest -@implementation GetProofsResponse_GetProofsResponseV0 +@implementation GetProofsRequest -@dynamic resultOneOfCase; -@dynamic proof; -@dynamic hasMetadata, metadata; +@dynamic versionOneOfCase; +@dynamic v0; -typedef struct GetProofsResponse_GetProofsResponseV0__storage_ { +typedef struct GetProofsRequest__storage_ { uint32_t _has_storage_[2]; - Proof *proof; - ResponseMetadata *metadata; -} GetProofsResponse_GetProofsResponseV0__storage_; + GetProofsRequest_GetProofsRequestV0 *v0; +} GetProofsRequest__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. @@ -3272,39 +2948,29 @@ + (GPBDescriptor *)descriptor { if (!descriptor) { static GPBMessageFieldDescription fields[] = { { - .name = "proof", - .dataTypeSpecific.clazz = GPBObjCClass(Proof), - .number = GetProofsResponse_GetProofsResponseV0_FieldNumber_Proof, + .name = "v0", + .dataTypeSpecific.clazz = GPBObjCClass(GetProofsRequest_GetProofsRequestV0), + .number = GetProofsRequest_FieldNumber_V0, .hasIndex = -1, - .offset = (uint32_t)offsetof(GetProofsResponse_GetProofsResponseV0__storage_, proof), - .flags = GPBFieldOptional, - .dataType = GPBDataTypeMessage, - }, - { - .name = "metadata", - .dataTypeSpecific.clazz = GPBObjCClass(ResponseMetadata), - .number = GetProofsResponse_GetProofsResponseV0_FieldNumber_Metadata, - .hasIndex = 0, - .offset = (uint32_t)offsetof(GetProofsResponse_GetProofsResponseV0__storage_, metadata), + .offset = (uint32_t)offsetof(GetProofsRequest__storage_, v0), .flags = GPBFieldOptional, .dataType = GPBDataTypeMessage, }, }; GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetProofsResponse_GetProofsResponseV0 class] + [GPBDescriptor allocDescriptorForClass:[GetProofsRequest class] rootClass:[PlatformRoot class] file:PlatformRoot_FileDescriptor() fields:fields fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetProofsResponse_GetProofsResponseV0__storage_) + storageSize:sizeof(GetProofsRequest__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; static const char *oneofs[] = { - "result", + "version", }; [localDescriptor setupOneofs:oneofs count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) firstHasIndex:-1]; - [localDescriptor setupContainingMessageClass:GPBObjCClass(GetProofsResponse)]; #if defined(DEBUG) && DEBUG NSAssert(descriptor == nil, @"Startup recursed!"); #endif // DEBUG @@ -3315,22 +2981,25 @@ + (GPBDescriptor *)descriptor { @end -void GetProofsResponse_GetProofsResponseV0_ClearResultOneOfCase(GetProofsResponse_GetProofsResponseV0 *message) { - GPBDescriptor *descriptor = [GetProofsResponse_GetProofsResponseV0 descriptor]; +void GetProofsRequest_ClearVersionOneOfCase(GetProofsRequest *message) { + GPBDescriptor *descriptor = [GetProofsRequest descriptor]; GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; GPBClearOneof(message, oneof); } -#pragma mark - GetDataContractRequest +#pragma mark - GetProofsRequest_GetProofsRequestV0 -@implementation GetDataContractRequest +@implementation GetProofsRequest_GetProofsRequestV0 -@dynamic versionOneOfCase; -@dynamic v0; +@dynamic identitiesArray, identitiesArray_Count; +@dynamic contractsArray, contractsArray_Count; +@dynamic documentsArray, documentsArray_Count; -typedef struct GetDataContractRequest__storage_ { - uint32_t _has_storage_[2]; - GetDataContractRequest_GetDataContractRequestV0 *v0; -} GetDataContractRequest__storage_; +typedef struct GetProofsRequest_GetProofsRequestV0__storage_ { + uint32_t _has_storage_[1]; + NSMutableArray *identitiesArray; + NSMutableArray *contractsArray; + NSMutableArray *documentsArray; +} GetProofsRequest_GetProofsRequestV0__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. @@ -3339,29 +3008,42 @@ + (GPBDescriptor *)descriptor { if (!descriptor) { static GPBMessageFieldDescription fields[] = { { - .name = "v0", - .dataTypeSpecific.clazz = GPBObjCClass(GetDataContractRequest_GetDataContractRequestV0), - .number = GetDataContractRequest_FieldNumber_V0, - .hasIndex = -1, - .offset = (uint32_t)offsetof(GetDataContractRequest__storage_, v0), - .flags = GPBFieldOptional, + .name = "identitiesArray", + .dataTypeSpecific.clazz = GPBObjCClass(GetProofsRequest_GetProofsRequestV0_IdentityRequest), + .number = GetProofsRequest_GetProofsRequestV0_FieldNumber_IdentitiesArray, + .hasIndex = GPBNoHasBit, + .offset = (uint32_t)offsetof(GetProofsRequest_GetProofsRequestV0__storage_, identitiesArray), + .flags = GPBFieldRepeated, + .dataType = GPBDataTypeMessage, + }, + { + .name = "contractsArray", + .dataTypeSpecific.clazz = GPBObjCClass(GetProofsRequest_GetProofsRequestV0_ContractRequest), + .number = GetProofsRequest_GetProofsRequestV0_FieldNumber_ContractsArray, + .hasIndex = GPBNoHasBit, + .offset = (uint32_t)offsetof(GetProofsRequest_GetProofsRequestV0__storage_, contractsArray), + .flags = GPBFieldRepeated, + .dataType = GPBDataTypeMessage, + }, + { + .name = "documentsArray", + .dataTypeSpecific.clazz = GPBObjCClass(GetProofsRequest_GetProofsRequestV0_DocumentRequest), + .number = GetProofsRequest_GetProofsRequestV0_FieldNumber_DocumentsArray, + .hasIndex = GPBNoHasBit, + .offset = (uint32_t)offsetof(GetProofsRequest_GetProofsRequestV0__storage_, documentsArray), + .flags = GPBFieldRepeated, .dataType = GPBDataTypeMessage, }, }; GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetDataContractRequest class] + [GPBDescriptor allocDescriptorForClass:[GetProofsRequest_GetProofsRequestV0 class] rootClass:[PlatformRoot class] file:PlatformRoot_FileDescriptor() fields:fields fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetDataContractRequest__storage_) + storageSize:sizeof(GetProofsRequest_GetProofsRequestV0__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; - static const char *oneofs[] = { - "version", - }; - [localDescriptor setupOneofs:oneofs - count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) - firstHasIndex:-1]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetProofsRequest)]; #if defined(DEBUG) && DEBUG NSAssert(descriptor == nil, @"Startup recursed!"); #endif // DEBUG @@ -3372,22 +3054,21 @@ + (GPBDescriptor *)descriptor { @end -void GetDataContractRequest_ClearVersionOneOfCase(GetDataContractRequest *message) { - GPBDescriptor *descriptor = [GetDataContractRequest descriptor]; - GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; - GPBClearOneof(message, oneof); -} -#pragma mark - GetDataContractRequest_GetDataContractRequestV0 +#pragma mark - GetProofsRequest_GetProofsRequestV0_DocumentRequest -@implementation GetDataContractRequest_GetDataContractRequestV0 +@implementation GetProofsRequest_GetProofsRequestV0_DocumentRequest -@dynamic id_p; -@dynamic prove; +@dynamic contractId; +@dynamic documentType; +@dynamic documentTypeKeepsHistory; +@dynamic documentId; -typedef struct GetDataContractRequest_GetDataContractRequestV0__storage_ { +typedef struct GetProofsRequest_GetProofsRequestV0_DocumentRequest__storage_ { uint32_t _has_storage_[1]; - NSData *id_p; -} GetDataContractRequest_GetDataContractRequestV0__storage_; + NSData *contractId; + NSString *documentType; + NSData *documentId; +} GetProofsRequest_GetProofsRequestV0_DocumentRequest__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. @@ -3396,33 +3077,51 @@ + (GPBDescriptor *)descriptor { if (!descriptor) { static GPBMessageFieldDescription fields[] = { { - .name = "id_p", + .name = "contractId", .dataTypeSpecific.clazz = Nil, - .number = GetDataContractRequest_GetDataContractRequestV0_FieldNumber_Id_p, + .number = GetProofsRequest_GetProofsRequestV0_DocumentRequest_FieldNumber_ContractId, .hasIndex = 0, - .offset = (uint32_t)offsetof(GetDataContractRequest_GetDataContractRequestV0__storage_, id_p), + .offset = (uint32_t)offsetof(GetProofsRequest_GetProofsRequestV0_DocumentRequest__storage_, contractId), .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), .dataType = GPBDataTypeBytes, }, { - .name = "prove", + .name = "documentType", .dataTypeSpecific.clazz = Nil, - .number = GetDataContractRequest_GetDataContractRequestV0_FieldNumber_Prove, + .number = GetProofsRequest_GetProofsRequestV0_DocumentRequest_FieldNumber_DocumentType, .hasIndex = 1, - .offset = 2, // Stored in _has_storage_ to save space. + .offset = (uint32_t)offsetof(GetProofsRequest_GetProofsRequestV0_DocumentRequest__storage_, documentType), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeString, + }, + { + .name = "documentTypeKeepsHistory", + .dataTypeSpecific.clazz = Nil, + .number = GetProofsRequest_GetProofsRequestV0_DocumentRequest_FieldNumber_DocumentTypeKeepsHistory, + .hasIndex = 2, + .offset = 3, // Stored in _has_storage_ to save space. .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), .dataType = GPBDataTypeBool, }, + { + .name = "documentId", + .dataTypeSpecific.clazz = Nil, + .number = GetProofsRequest_GetProofsRequestV0_DocumentRequest_FieldNumber_DocumentId, + .hasIndex = 4, + .offset = (uint32_t)offsetof(GetProofsRequest_GetProofsRequestV0_DocumentRequest__storage_, documentId), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, + }, }; GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetDataContractRequest_GetDataContractRequestV0 class] + [GPBDescriptor allocDescriptorForClass:[GetProofsRequest_GetProofsRequestV0_DocumentRequest class] rootClass:[PlatformRoot class] file:PlatformRoot_FileDescriptor() fields:fields fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetDataContractRequest_GetDataContractRequestV0__storage_) + storageSize:sizeof(GetProofsRequest_GetProofsRequestV0_DocumentRequest__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; - [localDescriptor setupContainingMessageClass:GPBObjCClass(GetDataContractRequest)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetProofsRequest_GetProofsRequestV0)]; #if defined(DEBUG) && DEBUG NSAssert(descriptor == nil, @"Startup recursed!"); #endif // DEBUG @@ -3433,17 +3132,18 @@ + (GPBDescriptor *)descriptor { @end -#pragma mark - GetDataContractResponse +#pragma mark - GetProofsRequest_GetProofsRequestV0_IdentityRequest -@implementation GetDataContractResponse +@implementation GetProofsRequest_GetProofsRequestV0_IdentityRequest -@dynamic versionOneOfCase; -@dynamic v0; +@dynamic identityId; +@dynamic requestType; -typedef struct GetDataContractResponse__storage_ { - uint32_t _has_storage_[2]; - GetDataContractResponse_GetDataContractResponseV0 *v0; -} GetDataContractResponse__storage_; +typedef struct GetProofsRequest_GetProofsRequestV0_IdentityRequest__storage_ { + uint32_t _has_storage_[1]; + GetProofsRequest_GetProofsRequestV0_IdentityRequest_Type requestType; + NSData *identityId; +} GetProofsRequest_GetProofsRequestV0_IdentityRequest__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. @@ -3452,29 +3152,33 @@ + (GPBDescriptor *)descriptor { if (!descriptor) { static GPBMessageFieldDescription fields[] = { { - .name = "v0", - .dataTypeSpecific.clazz = GPBObjCClass(GetDataContractResponse_GetDataContractResponseV0), - .number = GetDataContractResponse_FieldNumber_V0, - .hasIndex = -1, - .offset = (uint32_t)offsetof(GetDataContractResponse__storage_, v0), - .flags = GPBFieldOptional, - .dataType = GPBDataTypeMessage, + .name = "identityId", + .dataTypeSpecific.clazz = Nil, + .number = GetProofsRequest_GetProofsRequestV0_IdentityRequest_FieldNumber_IdentityId, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetProofsRequest_GetProofsRequestV0_IdentityRequest__storage_, identityId), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, + }, + { + .name = "requestType", + .dataTypeSpecific.enumDescFunc = GetProofsRequest_GetProofsRequestV0_IdentityRequest_Type_EnumDescriptor, + .number = GetProofsRequest_GetProofsRequestV0_IdentityRequest_FieldNumber_RequestType, + .hasIndex = 1, + .offset = (uint32_t)offsetof(GetProofsRequest_GetProofsRequestV0_IdentityRequest__storage_, requestType), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldHasEnumDescriptor | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeEnum, }, }; GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetDataContractResponse class] + [GPBDescriptor allocDescriptorForClass:[GetProofsRequest_GetProofsRequestV0_IdentityRequest class] rootClass:[PlatformRoot class] file:PlatformRoot_FileDescriptor() fields:fields fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetDataContractResponse__storage_) + storageSize:sizeof(GetProofsRequest_GetProofsRequestV0_IdentityRequest__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; - static const char *oneofs[] = { - "version", - }; - [localDescriptor setupOneofs:oneofs - count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) - firstHasIndex:-1]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetProofsRequest_GetProofsRequestV0)]; #if defined(DEBUG) && DEBUG NSAssert(descriptor == nil, @"Startup recursed!"); #endif // DEBUG @@ -3485,26 +3189,67 @@ + (GPBDescriptor *)descriptor { @end -void GetDataContractResponse_ClearVersionOneOfCase(GetDataContractResponse *message) { - GPBDescriptor *descriptor = [GetDataContractResponse descriptor]; - GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; - GPBClearOneof(message, oneof); +int32_t GetProofsRequest_GetProofsRequestV0_IdentityRequest_RequestType_RawValue(GetProofsRequest_GetProofsRequestV0_IdentityRequest *message) { + GPBDescriptor *descriptor = [GetProofsRequest_GetProofsRequestV0_IdentityRequest descriptor]; + GPBFieldDescriptor *field = [descriptor fieldWithNumber:GetProofsRequest_GetProofsRequestV0_IdentityRequest_FieldNumber_RequestType]; + return GPBGetMessageRawEnumField(message, field); } -#pragma mark - GetDataContractResponse_GetDataContractResponseV0 -@implementation GetDataContractResponse_GetDataContractResponseV0 +void SetGetProofsRequest_GetProofsRequestV0_IdentityRequest_RequestType_RawValue(GetProofsRequest_GetProofsRequestV0_IdentityRequest *message, int32_t value) { + GPBDescriptor *descriptor = [GetProofsRequest_GetProofsRequestV0_IdentityRequest descriptor]; + GPBFieldDescriptor *field = [descriptor fieldWithNumber:GetProofsRequest_GetProofsRequestV0_IdentityRequest_FieldNumber_RequestType]; + GPBSetMessageRawEnumField(message, field, value); +} -@dynamic resultOneOfCase; -@dynamic dataContract; -@dynamic proof; -@dynamic hasMetadata, metadata; +#pragma mark - Enum GetProofsRequest_GetProofsRequestV0_IdentityRequest_Type -typedef struct GetDataContractResponse_GetDataContractResponseV0__storage_ { - uint32_t _has_storage_[2]; - NSData *dataContract; - Proof *proof; - ResponseMetadata *metadata; -} GetDataContractResponse_GetDataContractResponseV0__storage_; +GPBEnumDescriptor *GetProofsRequest_GetProofsRequestV0_IdentityRequest_Type_EnumDescriptor(void) { + static _Atomic(GPBEnumDescriptor*) descriptor = nil; + if (!descriptor) { + static const char *valueNames = + "FullIdentity\000Balance\000Keys\000Revision\000"; + static const int32_t values[] = { + GetProofsRequest_GetProofsRequestV0_IdentityRequest_Type_FullIdentity, + GetProofsRequest_GetProofsRequestV0_IdentityRequest_Type_Balance, + GetProofsRequest_GetProofsRequestV0_IdentityRequest_Type_Keys, + GetProofsRequest_GetProofsRequestV0_IdentityRequest_Type_Revision, + }; + GPBEnumDescriptor *worker = + [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol(GetProofsRequest_GetProofsRequestV0_IdentityRequest_Type) + valueNames:valueNames + values:values + count:(uint32_t)(sizeof(values) / sizeof(int32_t)) + enumVerifier:GetProofsRequest_GetProofsRequestV0_IdentityRequest_Type_IsValidValue]; + GPBEnumDescriptor *expected = nil; + if (!atomic_compare_exchange_strong(&descriptor, &expected, worker)) { + [worker release]; + } + } + return descriptor; +} + +BOOL GetProofsRequest_GetProofsRequestV0_IdentityRequest_Type_IsValidValue(int32_t value__) { + switch (value__) { + case GetProofsRequest_GetProofsRequestV0_IdentityRequest_Type_FullIdentity: + case GetProofsRequest_GetProofsRequestV0_IdentityRequest_Type_Balance: + case GetProofsRequest_GetProofsRequestV0_IdentityRequest_Type_Keys: + case GetProofsRequest_GetProofsRequestV0_IdentityRequest_Type_Revision: + return YES; + default: + return NO; + } +} + +#pragma mark - GetProofsRequest_GetProofsRequestV0_ContractRequest + +@implementation GetProofsRequest_GetProofsRequestV0_ContractRequest + +@dynamic contractId; + +typedef struct GetProofsRequest_GetProofsRequestV0_ContractRequest__storage_ { + uint32_t _has_storage_[1]; + NSData *contractId; +} GetProofsRequest_GetProofsRequestV0_ContractRequest__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. @@ -3513,48 +3258,24 @@ + (GPBDescriptor *)descriptor { if (!descriptor) { static GPBMessageFieldDescription fields[] = { { - .name = "dataContract", + .name = "contractId", .dataTypeSpecific.clazz = Nil, - .number = GetDataContractResponse_GetDataContractResponseV0_FieldNumber_DataContract, - .hasIndex = -1, - .offset = (uint32_t)offsetof(GetDataContractResponse_GetDataContractResponseV0__storage_, dataContract), - .flags = GPBFieldOptional, - .dataType = GPBDataTypeBytes, - }, - { - .name = "proof", - .dataTypeSpecific.clazz = GPBObjCClass(Proof), - .number = GetDataContractResponse_GetDataContractResponseV0_FieldNumber_Proof, - .hasIndex = -1, - .offset = (uint32_t)offsetof(GetDataContractResponse_GetDataContractResponseV0__storage_, proof), - .flags = GPBFieldOptional, - .dataType = GPBDataTypeMessage, - }, - { - .name = "metadata", - .dataTypeSpecific.clazz = GPBObjCClass(ResponseMetadata), - .number = GetDataContractResponse_GetDataContractResponseV0_FieldNumber_Metadata, + .number = GetProofsRequest_GetProofsRequestV0_ContractRequest_FieldNumber_ContractId, .hasIndex = 0, - .offset = (uint32_t)offsetof(GetDataContractResponse_GetDataContractResponseV0__storage_, metadata), - .flags = GPBFieldOptional, - .dataType = GPBDataTypeMessage, + .offset = (uint32_t)offsetof(GetProofsRequest_GetProofsRequestV0_ContractRequest__storage_, contractId), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, }, }; GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetDataContractResponse_GetDataContractResponseV0 class] + [GPBDescriptor allocDescriptorForClass:[GetProofsRequest_GetProofsRequestV0_ContractRequest class] rootClass:[PlatformRoot class] file:PlatformRoot_FileDescriptor() fields:fields fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetDataContractResponse_GetDataContractResponseV0__storage_) + storageSize:sizeof(GetProofsRequest_GetProofsRequestV0_ContractRequest__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; - static const char *oneofs[] = { - "result", - }; - [localDescriptor setupOneofs:oneofs - count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) - firstHasIndex:-1]; - [localDescriptor setupContainingMessageClass:GPBObjCClass(GetDataContractResponse)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetProofsRequest_GetProofsRequestV0)]; #if defined(DEBUG) && DEBUG NSAssert(descriptor == nil, @"Startup recursed!"); #endif // DEBUG @@ -3565,22 +3286,17 @@ + (GPBDescriptor *)descriptor { @end -void GetDataContractResponse_GetDataContractResponseV0_ClearResultOneOfCase(GetDataContractResponse_GetDataContractResponseV0 *message) { - GPBDescriptor *descriptor = [GetDataContractResponse_GetDataContractResponseV0 descriptor]; - GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; - GPBClearOneof(message, oneof); -} -#pragma mark - GetDataContractsRequest +#pragma mark - GetProofsResponse -@implementation GetDataContractsRequest +@implementation GetProofsResponse @dynamic versionOneOfCase; @dynamic v0; -typedef struct GetDataContractsRequest__storage_ { +typedef struct GetProofsResponse__storage_ { uint32_t _has_storage_[2]; - GetDataContractsRequest_GetDataContractsRequestV0 *v0; -} GetDataContractsRequest__storage_; + GetProofsResponse_GetProofsResponseV0 *v0; +} GetProofsResponse__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. @@ -3590,21 +3306,21 @@ + (GPBDescriptor *)descriptor { static GPBMessageFieldDescription fields[] = { { .name = "v0", - .dataTypeSpecific.clazz = GPBObjCClass(GetDataContractsRequest_GetDataContractsRequestV0), - .number = GetDataContractsRequest_FieldNumber_V0, + .dataTypeSpecific.clazz = GPBObjCClass(GetProofsResponse_GetProofsResponseV0), + .number = GetProofsResponse_FieldNumber_V0, .hasIndex = -1, - .offset = (uint32_t)offsetof(GetDataContractsRequest__storage_, v0), + .offset = (uint32_t)offsetof(GetProofsResponse__storage_, v0), .flags = GPBFieldOptional, .dataType = GPBDataTypeMessage, }, }; GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetDataContractsRequest class] + [GPBDescriptor allocDescriptorForClass:[GetProofsResponse class] rootClass:[PlatformRoot class] file:PlatformRoot_FileDescriptor() fields:fields fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetDataContractsRequest__storage_) + storageSize:sizeof(GetProofsResponse__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; static const char *oneofs[] = { "version", @@ -3622,22 +3338,24 @@ + (GPBDescriptor *)descriptor { @end -void GetDataContractsRequest_ClearVersionOneOfCase(GetDataContractsRequest *message) { - GPBDescriptor *descriptor = [GetDataContractsRequest descriptor]; +void GetProofsResponse_ClearVersionOneOfCase(GetProofsResponse *message) { + GPBDescriptor *descriptor = [GetProofsResponse descriptor]; GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; GPBClearOneof(message, oneof); } -#pragma mark - GetDataContractsRequest_GetDataContractsRequestV0 +#pragma mark - GetProofsResponse_GetProofsResponseV0 -@implementation GetDataContractsRequest_GetDataContractsRequestV0 +@implementation GetProofsResponse_GetProofsResponseV0 -@dynamic idsArray, idsArray_Count; -@dynamic prove; +@dynamic resultOneOfCase; +@dynamic proof; +@dynamic hasMetadata, metadata; -typedef struct GetDataContractsRequest_GetDataContractsRequestV0__storage_ { - uint32_t _has_storage_[1]; - NSMutableArray *idsArray; -} GetDataContractsRequest_GetDataContractsRequestV0__storage_; +typedef struct GetProofsResponse_GetProofsResponseV0__storage_ { + uint32_t _has_storage_[2]; + Proof *proof; + ResponseMetadata *metadata; +} GetProofsResponse_GetProofsResponseV0__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. @@ -3646,33 +3364,39 @@ + (GPBDescriptor *)descriptor { if (!descriptor) { static GPBMessageFieldDescription fields[] = { { - .name = "idsArray", - .dataTypeSpecific.clazz = Nil, - .number = GetDataContractsRequest_GetDataContractsRequestV0_FieldNumber_IdsArray, - .hasIndex = GPBNoHasBit, - .offset = (uint32_t)offsetof(GetDataContractsRequest_GetDataContractsRequestV0__storage_, idsArray), - .flags = GPBFieldRepeated, - .dataType = GPBDataTypeBytes, + .name = "proof", + .dataTypeSpecific.clazz = GPBObjCClass(Proof), + .number = GetProofsResponse_GetProofsResponseV0_FieldNumber_Proof, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetProofsResponse_GetProofsResponseV0__storage_, proof), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, }, { - .name = "prove", - .dataTypeSpecific.clazz = Nil, - .number = GetDataContractsRequest_GetDataContractsRequestV0_FieldNumber_Prove, + .name = "metadata", + .dataTypeSpecific.clazz = GPBObjCClass(ResponseMetadata), + .number = GetProofsResponse_GetProofsResponseV0_FieldNumber_Metadata, .hasIndex = 0, - .offset = 1, // Stored in _has_storage_ to save space. - .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), - .dataType = GPBDataTypeBool, + .offset = (uint32_t)offsetof(GetProofsResponse_GetProofsResponseV0__storage_, metadata), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, }, }; GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetDataContractsRequest_GetDataContractsRequestV0 class] + [GPBDescriptor allocDescriptorForClass:[GetProofsResponse_GetProofsResponseV0 class] rootClass:[PlatformRoot class] file:PlatformRoot_FileDescriptor() fields:fields fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetDataContractsRequest_GetDataContractsRequestV0__storage_) + storageSize:sizeof(GetProofsResponse_GetProofsResponseV0__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; - [localDescriptor setupContainingMessageClass:GPBObjCClass(GetDataContractsRequest)]; + static const char *oneofs[] = { + "result", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetProofsResponse)]; #if defined(DEBUG) && DEBUG NSAssert(descriptor == nil, @"Startup recursed!"); #endif // DEBUG @@ -3683,17 +3407,22 @@ + (GPBDescriptor *)descriptor { @end -#pragma mark - GetDataContractsResponse +void GetProofsResponse_GetProofsResponseV0_ClearResultOneOfCase(GetProofsResponse_GetProofsResponseV0 *message) { + GPBDescriptor *descriptor = [GetProofsResponse_GetProofsResponseV0 descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetDataContractRequest -@implementation GetDataContractsResponse +@implementation GetDataContractRequest @dynamic versionOneOfCase; @dynamic v0; -typedef struct GetDataContractsResponse__storage_ { +typedef struct GetDataContractRequest__storage_ { uint32_t _has_storage_[2]; - GetDataContractsResponse_GetDataContractsResponseV0 *v0; -} GetDataContractsResponse__storage_; + GetDataContractRequest_GetDataContractRequestV0 *v0; +} GetDataContractRequest__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. @@ -3703,21 +3432,21 @@ + (GPBDescriptor *)descriptor { static GPBMessageFieldDescription fields[] = { { .name = "v0", - .dataTypeSpecific.clazz = GPBObjCClass(GetDataContractsResponse_GetDataContractsResponseV0), - .number = GetDataContractsResponse_FieldNumber_V0, + .dataTypeSpecific.clazz = GPBObjCClass(GetDataContractRequest_GetDataContractRequestV0), + .number = GetDataContractRequest_FieldNumber_V0, .hasIndex = -1, - .offset = (uint32_t)offsetof(GetDataContractsResponse__storage_, v0), + .offset = (uint32_t)offsetof(GetDataContractRequest__storage_, v0), .flags = GPBFieldOptional, .dataType = GPBDataTypeMessage, }, }; GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetDataContractsResponse class] + [GPBDescriptor allocDescriptorForClass:[GetDataContractRequest class] rootClass:[PlatformRoot class] file:PlatformRoot_FileDescriptor() fields:fields fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetDataContractsResponse__storage_) + storageSize:sizeof(GetDataContractRequest__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; static const char *oneofs[] = { "version", @@ -3735,23 +3464,22 @@ + (GPBDescriptor *)descriptor { @end -void GetDataContractsResponse_ClearVersionOneOfCase(GetDataContractsResponse *message) { - GPBDescriptor *descriptor = [GetDataContractsResponse descriptor]; +void GetDataContractRequest_ClearVersionOneOfCase(GetDataContractRequest *message) { + GPBDescriptor *descriptor = [GetDataContractRequest descriptor]; GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; GPBClearOneof(message, oneof); } -#pragma mark - GetDataContractsResponse_DataContractEntry +#pragma mark - GetDataContractRequest_GetDataContractRequestV0 -@implementation GetDataContractsResponse_DataContractEntry +@implementation GetDataContractRequest_GetDataContractRequestV0 -@dynamic identifier; -@dynamic hasDataContract, dataContract; +@dynamic id_p; +@dynamic prove; -typedef struct GetDataContractsResponse_DataContractEntry__storage_ { +typedef struct GetDataContractRequest_GetDataContractRequestV0__storage_ { uint32_t _has_storage_[1]; - NSData *identifier; - GPBBytesValue *dataContract; -} GetDataContractsResponse_DataContractEntry__storage_; + NSData *id_p; +} GetDataContractRequest_GetDataContractRequestV0__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. @@ -3760,33 +3488,33 @@ + (GPBDescriptor *)descriptor { if (!descriptor) { static GPBMessageFieldDescription fields[] = { { - .name = "identifier", + .name = "id_p", .dataTypeSpecific.clazz = Nil, - .number = GetDataContractsResponse_DataContractEntry_FieldNumber_Identifier, + .number = GetDataContractRequest_GetDataContractRequestV0_FieldNumber_Id_p, .hasIndex = 0, - .offset = (uint32_t)offsetof(GetDataContractsResponse_DataContractEntry__storage_, identifier), + .offset = (uint32_t)offsetof(GetDataContractRequest_GetDataContractRequestV0__storage_, id_p), .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), .dataType = GPBDataTypeBytes, }, { - .name = "dataContract", - .dataTypeSpecific.clazz = GPBObjCClass(GPBBytesValue), - .number = GetDataContractsResponse_DataContractEntry_FieldNumber_DataContract, + .name = "prove", + .dataTypeSpecific.clazz = Nil, + .number = GetDataContractRequest_GetDataContractRequestV0_FieldNumber_Prove, .hasIndex = 1, - .offset = (uint32_t)offsetof(GetDataContractsResponse_DataContractEntry__storage_, dataContract), - .flags = GPBFieldOptional, - .dataType = GPBDataTypeMessage, + .offset = 2, // Stored in _has_storage_ to save space. + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBool, }, }; GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetDataContractsResponse_DataContractEntry class] + [GPBDescriptor allocDescriptorForClass:[GetDataContractRequest_GetDataContractRequestV0 class] rootClass:[PlatformRoot class] file:PlatformRoot_FileDescriptor() fields:fields fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetDataContractsResponse_DataContractEntry__storage_) + storageSize:sizeof(GetDataContractRequest_GetDataContractRequestV0__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; - [localDescriptor setupContainingMessageClass:GPBObjCClass(GetDataContractsResponse)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetDataContractRequest)]; #if defined(DEBUG) && DEBUG NSAssert(descriptor == nil, @"Startup recursed!"); #endif // DEBUG @@ -3797,16 +3525,17 @@ + (GPBDescriptor *)descriptor { @end -#pragma mark - GetDataContractsResponse_DataContracts +#pragma mark - GetDataContractResponse -@implementation GetDataContractsResponse_DataContracts +@implementation GetDataContractResponse -@dynamic dataContractEntriesArray, dataContractEntriesArray_Count; +@dynamic versionOneOfCase; +@dynamic v0; -typedef struct GetDataContractsResponse_DataContracts__storage_ { - uint32_t _has_storage_[1]; - NSMutableArray *dataContractEntriesArray; -} GetDataContractsResponse_DataContracts__storage_; +typedef struct GetDataContractResponse__storage_ { + uint32_t _has_storage_[2]; + GetDataContractResponse_GetDataContractResponseV0 *v0; +} GetDataContractResponse__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. @@ -3815,24 +3544,29 @@ + (GPBDescriptor *)descriptor { if (!descriptor) { static GPBMessageFieldDescription fields[] = { { - .name = "dataContractEntriesArray", - .dataTypeSpecific.clazz = GPBObjCClass(GetDataContractsResponse_DataContractEntry), - .number = GetDataContractsResponse_DataContracts_FieldNumber_DataContractEntriesArray, - .hasIndex = GPBNoHasBit, - .offset = (uint32_t)offsetof(GetDataContractsResponse_DataContracts__storage_, dataContractEntriesArray), - .flags = GPBFieldRepeated, + .name = "v0", + .dataTypeSpecific.clazz = GPBObjCClass(GetDataContractResponse_GetDataContractResponseV0), + .number = GetDataContractResponse_FieldNumber_V0, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetDataContractResponse__storage_, v0), + .flags = GPBFieldOptional, .dataType = GPBDataTypeMessage, }, }; GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetDataContractsResponse_DataContracts class] + [GPBDescriptor allocDescriptorForClass:[GetDataContractResponse class] rootClass:[PlatformRoot class] file:PlatformRoot_FileDescriptor() fields:fields fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetDataContractsResponse_DataContracts__storage_) + storageSize:sizeof(GetDataContractResponse__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; - [localDescriptor setupContainingMessageClass:GPBObjCClass(GetDataContractsResponse)]; + static const char *oneofs[] = { + "version", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; #if defined(DEBUG) && DEBUG NSAssert(descriptor == nil, @"Startup recursed!"); #endif // DEBUG @@ -3843,21 +3577,26 @@ + (GPBDescriptor *)descriptor { @end -#pragma mark - GetDataContractsResponse_GetDataContractsResponseV0 +void GetDataContractResponse_ClearVersionOneOfCase(GetDataContractResponse *message) { + GPBDescriptor *descriptor = [GetDataContractResponse descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetDataContractResponse_GetDataContractResponseV0 -@implementation GetDataContractsResponse_GetDataContractsResponseV0 +@implementation GetDataContractResponse_GetDataContractResponseV0 @dynamic resultOneOfCase; -@dynamic dataContracts; +@dynamic dataContract; @dynamic proof; @dynamic hasMetadata, metadata; -typedef struct GetDataContractsResponse_GetDataContractsResponseV0__storage_ { +typedef struct GetDataContractResponse_GetDataContractResponseV0__storage_ { uint32_t _has_storage_[2]; - GetDataContractsResponse_DataContracts *dataContracts; + NSData *dataContract; Proof *proof; ResponseMetadata *metadata; -} GetDataContractsResponse_GetDataContractsResponseV0__storage_; +} GetDataContractResponse_GetDataContractResponseV0__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. @@ -3866,40 +3605,40 @@ + (GPBDescriptor *)descriptor { if (!descriptor) { static GPBMessageFieldDescription fields[] = { { - .name = "dataContracts", - .dataTypeSpecific.clazz = GPBObjCClass(GetDataContractsResponse_DataContracts), - .number = GetDataContractsResponse_GetDataContractsResponseV0_FieldNumber_DataContracts, + .name = "dataContract", + .dataTypeSpecific.clazz = Nil, + .number = GetDataContractResponse_GetDataContractResponseV0_FieldNumber_DataContract, .hasIndex = -1, - .offset = (uint32_t)offsetof(GetDataContractsResponse_GetDataContractsResponseV0__storage_, dataContracts), + .offset = (uint32_t)offsetof(GetDataContractResponse_GetDataContractResponseV0__storage_, dataContract), .flags = GPBFieldOptional, - .dataType = GPBDataTypeMessage, + .dataType = GPBDataTypeBytes, }, { .name = "proof", .dataTypeSpecific.clazz = GPBObjCClass(Proof), - .number = GetDataContractsResponse_GetDataContractsResponseV0_FieldNumber_Proof, + .number = GetDataContractResponse_GetDataContractResponseV0_FieldNumber_Proof, .hasIndex = -1, - .offset = (uint32_t)offsetof(GetDataContractsResponse_GetDataContractsResponseV0__storage_, proof), + .offset = (uint32_t)offsetof(GetDataContractResponse_GetDataContractResponseV0__storage_, proof), .flags = GPBFieldOptional, .dataType = GPBDataTypeMessage, }, { .name = "metadata", .dataTypeSpecific.clazz = GPBObjCClass(ResponseMetadata), - .number = GetDataContractsResponse_GetDataContractsResponseV0_FieldNumber_Metadata, + .number = GetDataContractResponse_GetDataContractResponseV0_FieldNumber_Metadata, .hasIndex = 0, - .offset = (uint32_t)offsetof(GetDataContractsResponse_GetDataContractsResponseV0__storage_, metadata), + .offset = (uint32_t)offsetof(GetDataContractResponse_GetDataContractResponseV0__storage_, metadata), .flags = GPBFieldOptional, .dataType = GPBDataTypeMessage, }, }; GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetDataContractsResponse_GetDataContractsResponseV0 class] + [GPBDescriptor allocDescriptorForClass:[GetDataContractResponse_GetDataContractResponseV0 class] rootClass:[PlatformRoot class] file:PlatformRoot_FileDescriptor() fields:fields fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetDataContractsResponse_GetDataContractsResponseV0__storage_) + storageSize:sizeof(GetDataContractResponse_GetDataContractResponseV0__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; static const char *oneofs[] = { "result", @@ -3907,7 +3646,7 @@ + (GPBDescriptor *)descriptor { [localDescriptor setupOneofs:oneofs count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) firstHasIndex:-1]; - [localDescriptor setupContainingMessageClass:GPBObjCClass(GetDataContractsResponse)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetDataContractResponse)]; #if defined(DEBUG) && DEBUG NSAssert(descriptor == nil, @"Startup recursed!"); #endif // DEBUG @@ -3918,22 +3657,22 @@ + (GPBDescriptor *)descriptor { @end -void GetDataContractsResponse_GetDataContractsResponseV0_ClearResultOneOfCase(GetDataContractsResponse_GetDataContractsResponseV0 *message) { - GPBDescriptor *descriptor = [GetDataContractsResponse_GetDataContractsResponseV0 descriptor]; +void GetDataContractResponse_GetDataContractResponseV0_ClearResultOneOfCase(GetDataContractResponse_GetDataContractResponseV0 *message) { + GPBDescriptor *descriptor = [GetDataContractResponse_GetDataContractResponseV0 descriptor]; GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; GPBClearOneof(message, oneof); } -#pragma mark - GetDataContractHistoryRequest +#pragma mark - GetDataContractsRequest -@implementation GetDataContractHistoryRequest +@implementation GetDataContractsRequest @dynamic versionOneOfCase; @dynamic v0; -typedef struct GetDataContractHistoryRequest__storage_ { +typedef struct GetDataContractsRequest__storage_ { uint32_t _has_storage_[2]; - GetDataContractHistoryRequest_GetDataContractHistoryRequestV0 *v0; -} GetDataContractHistoryRequest__storage_; + GetDataContractsRequest_GetDataContractsRequestV0 *v0; +} GetDataContractsRequest__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. @@ -3943,21 +3682,21 @@ + (GPBDescriptor *)descriptor { static GPBMessageFieldDescription fields[] = { { .name = "v0", - .dataTypeSpecific.clazz = GPBObjCClass(GetDataContractHistoryRequest_GetDataContractHistoryRequestV0), - .number = GetDataContractHistoryRequest_FieldNumber_V0, + .dataTypeSpecific.clazz = GPBObjCClass(GetDataContractsRequest_GetDataContractsRequestV0), + .number = GetDataContractsRequest_FieldNumber_V0, .hasIndex = -1, - .offset = (uint32_t)offsetof(GetDataContractHistoryRequest__storage_, v0), + .offset = (uint32_t)offsetof(GetDataContractsRequest__storage_, v0), .flags = GPBFieldOptional, .dataType = GPBDataTypeMessage, }, }; GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetDataContractHistoryRequest class] + [GPBDescriptor allocDescriptorForClass:[GetDataContractsRequest class] rootClass:[PlatformRoot class] file:PlatformRoot_FileDescriptor() fields:fields fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetDataContractHistoryRequest__storage_) + storageSize:sizeof(GetDataContractsRequest__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; static const char *oneofs[] = { "version", @@ -3975,90 +3714,57 @@ + (GPBDescriptor *)descriptor { @end -void GetDataContractHistoryRequest_ClearVersionOneOfCase(GetDataContractHistoryRequest *message) { - GPBDescriptor *descriptor = [GetDataContractHistoryRequest descriptor]; +void GetDataContractsRequest_ClearVersionOneOfCase(GetDataContractsRequest *message) { + GPBDescriptor *descriptor = [GetDataContractsRequest descriptor]; GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; GPBClearOneof(message, oneof); } -#pragma mark - GetDataContractHistoryRequest_GetDataContractHistoryRequestV0 - -@implementation GetDataContractHistoryRequest_GetDataContractHistoryRequestV0 - -@dynamic id_p; -@dynamic hasLimit, limit; -@dynamic hasOffset, offset; -@dynamic startAtMs; -@dynamic prove; +#pragma mark - GetDataContractsRequest_GetDataContractsRequestV0 -typedef struct GetDataContractHistoryRequest_GetDataContractHistoryRequestV0__storage_ { - uint32_t _has_storage_[1]; - NSData *id_p; - GPBUInt32Value *limit; - GPBUInt32Value *offset; - uint64_t startAtMs; -} GetDataContractHistoryRequest_GetDataContractHistoryRequestV0__storage_; +@implementation GetDataContractsRequest_GetDataContractsRequestV0 -// This method is threadsafe because it is initially called -// in +initialize for each subclass. -+ (GPBDescriptor *)descriptor { - static GPBDescriptor *descriptor = nil; - if (!descriptor) { - static GPBMessageFieldDescription fields[] = { - { - .name = "id_p", - .dataTypeSpecific.clazz = Nil, - .number = GetDataContractHistoryRequest_GetDataContractHistoryRequestV0_FieldNumber_Id_p, - .hasIndex = 0, - .offset = (uint32_t)offsetof(GetDataContractHistoryRequest_GetDataContractHistoryRequestV0__storage_, id_p), - .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), - .dataType = GPBDataTypeBytes, - }, - { - .name = "limit", - .dataTypeSpecific.clazz = GPBObjCClass(GPBUInt32Value), - .number = GetDataContractHistoryRequest_GetDataContractHistoryRequestV0_FieldNumber_Limit, - .hasIndex = 1, - .offset = (uint32_t)offsetof(GetDataContractHistoryRequest_GetDataContractHistoryRequestV0__storage_, limit), - .flags = GPBFieldOptional, - .dataType = GPBDataTypeMessage, - }, - { - .name = "offset", - .dataTypeSpecific.clazz = GPBObjCClass(GPBUInt32Value), - .number = GetDataContractHistoryRequest_GetDataContractHistoryRequestV0_FieldNumber_Offset, - .hasIndex = 2, - .offset = (uint32_t)offsetof(GetDataContractHistoryRequest_GetDataContractHistoryRequestV0__storage_, offset), - .flags = GPBFieldOptional, - .dataType = GPBDataTypeMessage, - }, +@dynamic idsArray, idsArray_Count; +@dynamic prove; + +typedef struct GetDataContractsRequest_GetDataContractsRequestV0__storage_ { + uint32_t _has_storage_[1]; + NSMutableArray *idsArray; +} GetDataContractsRequest_GetDataContractsRequestV0__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { { - .name = "startAtMs", + .name = "idsArray", .dataTypeSpecific.clazz = Nil, - .number = GetDataContractHistoryRequest_GetDataContractHistoryRequestV0_FieldNumber_StartAtMs, - .hasIndex = 3, - .offset = (uint32_t)offsetof(GetDataContractHistoryRequest_GetDataContractHistoryRequestV0__storage_, startAtMs), - .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), - .dataType = GPBDataTypeUInt64, + .number = GetDataContractsRequest_GetDataContractsRequestV0_FieldNumber_IdsArray, + .hasIndex = GPBNoHasBit, + .offset = (uint32_t)offsetof(GetDataContractsRequest_GetDataContractsRequestV0__storage_, idsArray), + .flags = GPBFieldRepeated, + .dataType = GPBDataTypeBytes, }, { .name = "prove", .dataTypeSpecific.clazz = Nil, - .number = GetDataContractHistoryRequest_GetDataContractHistoryRequestV0_FieldNumber_Prove, - .hasIndex = 4, - .offset = 5, // Stored in _has_storage_ to save space. + .number = GetDataContractsRequest_GetDataContractsRequestV0_FieldNumber_Prove, + .hasIndex = 0, + .offset = 1, // Stored in _has_storage_ to save space. .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), .dataType = GPBDataTypeBool, }, }; GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetDataContractHistoryRequest_GetDataContractHistoryRequestV0 class] + [GPBDescriptor allocDescriptorForClass:[GetDataContractsRequest_GetDataContractsRequestV0 class] rootClass:[PlatformRoot class] file:PlatformRoot_FileDescriptor() fields:fields fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetDataContractHistoryRequest_GetDataContractHistoryRequestV0__storage_) + storageSize:sizeof(GetDataContractsRequest_GetDataContractsRequestV0__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; - [localDescriptor setupContainingMessageClass:GPBObjCClass(GetDataContractHistoryRequest)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetDataContractsRequest)]; #if defined(DEBUG) && DEBUG NSAssert(descriptor == nil, @"Startup recursed!"); #endif // DEBUG @@ -4069,17 +3775,17 @@ + (GPBDescriptor *)descriptor { @end -#pragma mark - GetDataContractHistoryResponse +#pragma mark - GetDataContractsResponse -@implementation GetDataContractHistoryResponse +@implementation GetDataContractsResponse @dynamic versionOneOfCase; @dynamic v0; -typedef struct GetDataContractHistoryResponse__storage_ { +typedef struct GetDataContractsResponse__storage_ { uint32_t _has_storage_[2]; - GetDataContractHistoryResponse_GetDataContractHistoryResponseV0 *v0; -} GetDataContractHistoryResponse__storage_; + GetDataContractsResponse_GetDataContractsResponseV0 *v0; +} GetDataContractsResponse__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. @@ -4089,21 +3795,21 @@ + (GPBDescriptor *)descriptor { static GPBMessageFieldDescription fields[] = { { .name = "v0", - .dataTypeSpecific.clazz = GPBObjCClass(GetDataContractHistoryResponse_GetDataContractHistoryResponseV0), - .number = GetDataContractHistoryResponse_FieldNumber_V0, + .dataTypeSpecific.clazz = GPBObjCClass(GetDataContractsResponse_GetDataContractsResponseV0), + .number = GetDataContractsResponse_FieldNumber_V0, .hasIndex = -1, - .offset = (uint32_t)offsetof(GetDataContractHistoryResponse__storage_, v0), + .offset = (uint32_t)offsetof(GetDataContractsResponse__storage_, v0), .flags = GPBFieldOptional, .dataType = GPBDataTypeMessage, }, }; GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetDataContractHistoryResponse class] + [GPBDescriptor allocDescriptorForClass:[GetDataContractsResponse class] rootClass:[PlatformRoot class] file:PlatformRoot_FileDescriptor() fields:fields fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetDataContractHistoryResponse__storage_) + storageSize:sizeof(GetDataContractsResponse__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; static const char *oneofs[] = { "version", @@ -4121,26 +3827,23 @@ + (GPBDescriptor *)descriptor { @end -void GetDataContractHistoryResponse_ClearVersionOneOfCase(GetDataContractHistoryResponse *message) { - GPBDescriptor *descriptor = [GetDataContractHistoryResponse descriptor]; +void GetDataContractsResponse_ClearVersionOneOfCase(GetDataContractsResponse *message) { + GPBDescriptor *descriptor = [GetDataContractsResponse descriptor]; GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; GPBClearOneof(message, oneof); } -#pragma mark - GetDataContractHistoryResponse_GetDataContractHistoryResponseV0 +#pragma mark - GetDataContractsResponse_DataContractEntry -@implementation GetDataContractHistoryResponse_GetDataContractHistoryResponseV0 +@implementation GetDataContractsResponse_DataContractEntry -@dynamic resultOneOfCase; -@dynamic dataContractHistory; -@dynamic proof; -@dynamic hasMetadata, metadata; +@dynamic identifier; +@dynamic hasDataContract, dataContract; -typedef struct GetDataContractHistoryResponse_GetDataContractHistoryResponseV0__storage_ { - uint32_t _has_storage_[2]; - GetDataContractHistoryResponse_GetDataContractHistoryResponseV0_DataContractHistory *dataContractHistory; - Proof *proof; - ResponseMetadata *metadata; -} GetDataContractHistoryResponse_GetDataContractHistoryResponseV0__storage_; +typedef struct GetDataContractsResponse_DataContractEntry__storage_ { + uint32_t _has_storage_[1]; + NSData *identifier; + GPBBytesValue *dataContract; +} GetDataContractsResponse_DataContractEntry__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. @@ -4149,48 +3852,33 @@ + (GPBDescriptor *)descriptor { if (!descriptor) { static GPBMessageFieldDescription fields[] = { { - .name = "dataContractHistory", - .dataTypeSpecific.clazz = GPBObjCClass(GetDataContractHistoryResponse_GetDataContractHistoryResponseV0_DataContractHistory), - .number = GetDataContractHistoryResponse_GetDataContractHistoryResponseV0_FieldNumber_DataContractHistory, - .hasIndex = -1, - .offset = (uint32_t)offsetof(GetDataContractHistoryResponse_GetDataContractHistoryResponseV0__storage_, dataContractHistory), - .flags = GPBFieldOptional, - .dataType = GPBDataTypeMessage, - }, - { - .name = "proof", - .dataTypeSpecific.clazz = GPBObjCClass(Proof), - .number = GetDataContractHistoryResponse_GetDataContractHistoryResponseV0_FieldNumber_Proof, - .hasIndex = -1, - .offset = (uint32_t)offsetof(GetDataContractHistoryResponse_GetDataContractHistoryResponseV0__storage_, proof), - .flags = GPBFieldOptional, - .dataType = GPBDataTypeMessage, + .name = "identifier", + .dataTypeSpecific.clazz = Nil, + .number = GetDataContractsResponse_DataContractEntry_FieldNumber_Identifier, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetDataContractsResponse_DataContractEntry__storage_, identifier), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, }, { - .name = "metadata", - .dataTypeSpecific.clazz = GPBObjCClass(ResponseMetadata), - .number = GetDataContractHistoryResponse_GetDataContractHistoryResponseV0_FieldNumber_Metadata, - .hasIndex = 0, - .offset = (uint32_t)offsetof(GetDataContractHistoryResponse_GetDataContractHistoryResponseV0__storage_, metadata), + .name = "dataContract", + .dataTypeSpecific.clazz = GPBObjCClass(GPBBytesValue), + .number = GetDataContractsResponse_DataContractEntry_FieldNumber_DataContract, + .hasIndex = 1, + .offset = (uint32_t)offsetof(GetDataContractsResponse_DataContractEntry__storage_, dataContract), .flags = GPBFieldOptional, .dataType = GPBDataTypeMessage, }, }; GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetDataContractHistoryResponse_GetDataContractHistoryResponseV0 class] + [GPBDescriptor allocDescriptorForClass:[GetDataContractsResponse_DataContractEntry class] rootClass:[PlatformRoot class] file:PlatformRoot_FileDescriptor() fields:fields fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetDataContractHistoryResponse_GetDataContractHistoryResponseV0__storage_) + storageSize:sizeof(GetDataContractsResponse_DataContractEntry__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; - static const char *oneofs[] = { - "result", - }; - [localDescriptor setupOneofs:oneofs - count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) - firstHasIndex:-1]; - [localDescriptor setupContainingMessageClass:GPBObjCClass(GetDataContractHistoryResponse)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetDataContractsResponse)]; #if defined(DEBUG) && DEBUG NSAssert(descriptor == nil, @"Startup recursed!"); #endif // DEBUG @@ -4201,23 +3889,16 @@ + (GPBDescriptor *)descriptor { @end -void GetDataContractHistoryResponse_GetDataContractHistoryResponseV0_ClearResultOneOfCase(GetDataContractHistoryResponse_GetDataContractHistoryResponseV0 *message) { - GPBDescriptor *descriptor = [GetDataContractHistoryResponse_GetDataContractHistoryResponseV0 descriptor]; - GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; - GPBClearOneof(message, oneof); -} -#pragma mark - GetDataContractHistoryResponse_GetDataContractHistoryResponseV0_DataContractHistoryEntry +#pragma mark - GetDataContractsResponse_DataContracts -@implementation GetDataContractHistoryResponse_GetDataContractHistoryResponseV0_DataContractHistoryEntry +@implementation GetDataContractsResponse_DataContracts -@dynamic date; -@dynamic value; +@dynamic dataContractEntriesArray, dataContractEntriesArray_Count; -typedef struct GetDataContractHistoryResponse_GetDataContractHistoryResponseV0_DataContractHistoryEntry__storage_ { +typedef struct GetDataContractsResponse_DataContracts__storage_ { uint32_t _has_storage_[1]; - NSData *value; - uint64_t date; -} GetDataContractHistoryResponse_GetDataContractHistoryResponseV0_DataContractHistoryEntry__storage_; + NSMutableArray *dataContractEntriesArray; +} GetDataContractsResponse_DataContracts__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. @@ -4226,33 +3907,24 @@ + (GPBDescriptor *)descriptor { if (!descriptor) { static GPBMessageFieldDescription fields[] = { { - .name = "date", - .dataTypeSpecific.clazz = Nil, - .number = GetDataContractHistoryResponse_GetDataContractHistoryResponseV0_DataContractHistoryEntry_FieldNumber_Date, - .hasIndex = 0, - .offset = (uint32_t)offsetof(GetDataContractHistoryResponse_GetDataContractHistoryResponseV0_DataContractHistoryEntry__storage_, date), - .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), - .dataType = GPBDataTypeUInt64, - }, - { - .name = "value", - .dataTypeSpecific.clazz = Nil, - .number = GetDataContractHistoryResponse_GetDataContractHistoryResponseV0_DataContractHistoryEntry_FieldNumber_Value, - .hasIndex = 1, - .offset = (uint32_t)offsetof(GetDataContractHistoryResponse_GetDataContractHistoryResponseV0_DataContractHistoryEntry__storage_, value), - .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), - .dataType = GPBDataTypeBytes, + .name = "dataContractEntriesArray", + .dataTypeSpecific.clazz = GPBObjCClass(GetDataContractsResponse_DataContractEntry), + .number = GetDataContractsResponse_DataContracts_FieldNumber_DataContractEntriesArray, + .hasIndex = GPBNoHasBit, + .offset = (uint32_t)offsetof(GetDataContractsResponse_DataContracts__storage_, dataContractEntriesArray), + .flags = GPBFieldRepeated, + .dataType = GPBDataTypeMessage, }, }; GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetDataContractHistoryResponse_GetDataContractHistoryResponseV0_DataContractHistoryEntry class] + [GPBDescriptor allocDescriptorForClass:[GetDataContractsResponse_DataContracts class] rootClass:[PlatformRoot class] file:PlatformRoot_FileDescriptor() fields:fields fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetDataContractHistoryResponse_GetDataContractHistoryResponseV0_DataContractHistoryEntry__storage_) + storageSize:sizeof(GetDataContractsResponse_DataContracts__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; - [localDescriptor setupContainingMessageClass:GPBObjCClass(GetDataContractHistoryResponse_GetDataContractHistoryResponseV0)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetDataContractsResponse)]; #if defined(DEBUG) && DEBUG NSAssert(descriptor == nil, @"Startup recursed!"); #endif // DEBUG @@ -4263,16 +3935,21 @@ + (GPBDescriptor *)descriptor { @end -#pragma mark - GetDataContractHistoryResponse_GetDataContractHistoryResponseV0_DataContractHistory +#pragma mark - GetDataContractsResponse_GetDataContractsResponseV0 -@implementation GetDataContractHistoryResponse_GetDataContractHistoryResponseV0_DataContractHistory +@implementation GetDataContractsResponse_GetDataContractsResponseV0 -@dynamic dataContractEntriesArray, dataContractEntriesArray_Count; +@dynamic resultOneOfCase; +@dynamic dataContracts; +@dynamic proof; +@dynamic hasMetadata, metadata; -typedef struct GetDataContractHistoryResponse_GetDataContractHistoryResponseV0_DataContractHistory__storage_ { - uint32_t _has_storage_[1]; - NSMutableArray *dataContractEntriesArray; -} GetDataContractHistoryResponse_GetDataContractHistoryResponseV0_DataContractHistory__storage_; +typedef struct GetDataContractsResponse_GetDataContractsResponseV0__storage_ { + uint32_t _has_storage_[2]; + GetDataContractsResponse_DataContracts *dataContracts; + Proof *proof; + ResponseMetadata *metadata; +} GetDataContractsResponse_GetDataContractsResponseV0__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. @@ -4281,24 +3958,48 @@ + (GPBDescriptor *)descriptor { if (!descriptor) { static GPBMessageFieldDescription fields[] = { { - .name = "dataContractEntriesArray", - .dataTypeSpecific.clazz = GPBObjCClass(GetDataContractHistoryResponse_GetDataContractHistoryResponseV0_DataContractHistoryEntry), - .number = GetDataContractHistoryResponse_GetDataContractHistoryResponseV0_DataContractHistory_FieldNumber_DataContractEntriesArray, - .hasIndex = GPBNoHasBit, - .offset = (uint32_t)offsetof(GetDataContractHistoryResponse_GetDataContractHistoryResponseV0_DataContractHistory__storage_, dataContractEntriesArray), - .flags = GPBFieldRepeated, + .name = "dataContracts", + .dataTypeSpecific.clazz = GPBObjCClass(GetDataContractsResponse_DataContracts), + .number = GetDataContractsResponse_GetDataContractsResponseV0_FieldNumber_DataContracts, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetDataContractsResponse_GetDataContractsResponseV0__storage_, dataContracts), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + { + .name = "proof", + .dataTypeSpecific.clazz = GPBObjCClass(Proof), + .number = GetDataContractsResponse_GetDataContractsResponseV0_FieldNumber_Proof, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetDataContractsResponse_GetDataContractsResponseV0__storage_, proof), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + { + .name = "metadata", + .dataTypeSpecific.clazz = GPBObjCClass(ResponseMetadata), + .number = GetDataContractsResponse_GetDataContractsResponseV0_FieldNumber_Metadata, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetDataContractsResponse_GetDataContractsResponseV0__storage_, metadata), + .flags = GPBFieldOptional, .dataType = GPBDataTypeMessage, }, }; GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetDataContractHistoryResponse_GetDataContractHistoryResponseV0_DataContractHistory class] + [GPBDescriptor allocDescriptorForClass:[GetDataContractsResponse_GetDataContractsResponseV0 class] rootClass:[PlatformRoot class] file:PlatformRoot_FileDescriptor() fields:fields fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetDataContractHistoryResponse_GetDataContractHistoryResponseV0_DataContractHistory__storage_) + storageSize:sizeof(GetDataContractsResponse_GetDataContractsResponseV0__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; - [localDescriptor setupContainingMessageClass:GPBObjCClass(GetDataContractHistoryResponse_GetDataContractHistoryResponseV0)]; + static const char *oneofs[] = { + "result", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetDataContractsResponse)]; #if defined(DEBUG) && DEBUG NSAssert(descriptor == nil, @"Startup recursed!"); #endif // DEBUG @@ -4309,17 +4010,22 @@ + (GPBDescriptor *)descriptor { @end -#pragma mark - GetDocumentsRequest +void GetDataContractsResponse_GetDataContractsResponseV0_ClearResultOneOfCase(GetDataContractsResponse_GetDataContractsResponseV0 *message) { + GPBDescriptor *descriptor = [GetDataContractsResponse_GetDataContractsResponseV0 descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetDataContractHistoryRequest -@implementation GetDocumentsRequest +@implementation GetDataContractHistoryRequest @dynamic versionOneOfCase; @dynamic v0; -typedef struct GetDocumentsRequest__storage_ { +typedef struct GetDataContractHistoryRequest__storage_ { uint32_t _has_storage_[2]; - GetDocumentsRequest_GetDocumentsRequestV0 *v0; -} GetDocumentsRequest__storage_; + GetDataContractHistoryRequest_GetDataContractHistoryRequestV0 *v0; +} GetDataContractHistoryRequest__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. @@ -4329,21 +4035,21 @@ + (GPBDescriptor *)descriptor { static GPBMessageFieldDescription fields[] = { { .name = "v0", - .dataTypeSpecific.clazz = GPBObjCClass(GetDocumentsRequest_GetDocumentsRequestV0), - .number = GetDocumentsRequest_FieldNumber_V0, + .dataTypeSpecific.clazz = GPBObjCClass(GetDataContractHistoryRequest_GetDataContractHistoryRequestV0), + .number = GetDataContractHistoryRequest_FieldNumber_V0, .hasIndex = -1, - .offset = (uint32_t)offsetof(GetDocumentsRequest__storage_, v0), + .offset = (uint32_t)offsetof(GetDataContractHistoryRequest__storage_, v0), .flags = GPBFieldOptional, .dataType = GPBDataTypeMessage, }, }; GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetDocumentsRequest class] + [GPBDescriptor allocDescriptorForClass:[GetDataContractHistoryRequest class] rootClass:[PlatformRoot class] file:PlatformRoot_FileDescriptor() fields:fields fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetDocumentsRequest__storage_) + storageSize:sizeof(GetDataContractHistoryRequest__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; static const char *oneofs[] = { "version", @@ -4361,35 +4067,28 @@ + (GPBDescriptor *)descriptor { @end -void GetDocumentsRequest_ClearVersionOneOfCase(GetDocumentsRequest *message) { - GPBDescriptor *descriptor = [GetDocumentsRequest descriptor]; +void GetDataContractHistoryRequest_ClearVersionOneOfCase(GetDataContractHistoryRequest *message) { + GPBDescriptor *descriptor = [GetDataContractHistoryRequest descriptor]; GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; GPBClearOneof(message, oneof); } -#pragma mark - GetDocumentsRequest_GetDocumentsRequestV0 +#pragma mark - GetDataContractHistoryRequest_GetDataContractHistoryRequestV0 -@implementation GetDocumentsRequest_GetDocumentsRequestV0 +@implementation GetDataContractHistoryRequest_GetDataContractHistoryRequestV0 -@dynamic startOneOfCase; -@dynamic dataContractId; -@dynamic documentType; -@dynamic where; -@dynamic orderBy; -@dynamic limit; -@dynamic startAfter; -@dynamic startAt; +@dynamic id_p; +@dynamic hasLimit, limit; +@dynamic hasOffset, offset; +@dynamic startAtMs; @dynamic prove; -typedef struct GetDocumentsRequest_GetDocumentsRequestV0__storage_ { - uint32_t _has_storage_[2]; - uint32_t limit; - NSData *dataContractId; - NSString *documentType; - NSData *where; - NSData *orderBy; - NSData *startAfter; - NSData *startAt; -} GetDocumentsRequest_GetDocumentsRequestV0__storage_; +typedef struct GetDataContractHistoryRequest_GetDataContractHistoryRequestV0__storage_ { + uint32_t _has_storage_[1]; + NSData *id_p; + GPBUInt32Value *limit; + GPBUInt32Value *offset; + uint64_t startAtMs; +} GetDataContractHistoryRequest_GetDataContractHistoryRequestV0__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. @@ -4398,93 +4097,60 @@ + (GPBDescriptor *)descriptor { if (!descriptor) { static GPBMessageFieldDescription fields[] = { { - .name = "dataContractId", + .name = "id_p", .dataTypeSpecific.clazz = Nil, - .number = GetDocumentsRequest_GetDocumentsRequestV0_FieldNumber_DataContractId, + .number = GetDataContractHistoryRequest_GetDataContractHistoryRequestV0_FieldNumber_Id_p, .hasIndex = 0, - .offset = (uint32_t)offsetof(GetDocumentsRequest_GetDocumentsRequestV0__storage_, dataContractId), + .offset = (uint32_t)offsetof(GetDataContractHistoryRequest_GetDataContractHistoryRequestV0__storage_, id_p), .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), .dataType = GPBDataTypeBytes, }, { - .name = "documentType", - .dataTypeSpecific.clazz = Nil, - .number = GetDocumentsRequest_GetDocumentsRequestV0_FieldNumber_DocumentType, + .name = "limit", + .dataTypeSpecific.clazz = GPBObjCClass(GPBUInt32Value), + .number = GetDataContractHistoryRequest_GetDataContractHistoryRequestV0_FieldNumber_Limit, .hasIndex = 1, - .offset = (uint32_t)offsetof(GetDocumentsRequest_GetDocumentsRequestV0__storage_, documentType), - .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), - .dataType = GPBDataTypeString, + .offset = (uint32_t)offsetof(GetDataContractHistoryRequest_GetDataContractHistoryRequestV0__storage_, limit), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, }, { - .name = "where", - .dataTypeSpecific.clazz = Nil, - .number = GetDocumentsRequest_GetDocumentsRequestV0_FieldNumber_Where, + .name = "offset", + .dataTypeSpecific.clazz = GPBObjCClass(GPBUInt32Value), + .number = GetDataContractHistoryRequest_GetDataContractHistoryRequestV0_FieldNumber_Offset, .hasIndex = 2, - .offset = (uint32_t)offsetof(GetDocumentsRequest_GetDocumentsRequestV0__storage_, where), - .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), - .dataType = GPBDataTypeBytes, + .offset = (uint32_t)offsetof(GetDataContractHistoryRequest_GetDataContractHistoryRequestV0__storage_, offset), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, }, { - .name = "orderBy", + .name = "startAtMs", .dataTypeSpecific.clazz = Nil, - .number = GetDocumentsRequest_GetDocumentsRequestV0_FieldNumber_OrderBy, + .number = GetDataContractHistoryRequest_GetDataContractHistoryRequestV0_FieldNumber_StartAtMs, .hasIndex = 3, - .offset = (uint32_t)offsetof(GetDocumentsRequest_GetDocumentsRequestV0__storage_, orderBy), - .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), - .dataType = GPBDataTypeBytes, - }, - { - .name = "limit", - .dataTypeSpecific.clazz = Nil, - .number = GetDocumentsRequest_GetDocumentsRequestV0_FieldNumber_Limit, - .hasIndex = 4, - .offset = (uint32_t)offsetof(GetDocumentsRequest_GetDocumentsRequestV0__storage_, limit), + .offset = (uint32_t)offsetof(GetDataContractHistoryRequest_GetDataContractHistoryRequestV0__storage_, startAtMs), .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), - .dataType = GPBDataTypeUInt32, - }, - { - .name = "startAfter", - .dataTypeSpecific.clazz = Nil, - .number = GetDocumentsRequest_GetDocumentsRequestV0_FieldNumber_StartAfter, - .hasIndex = -1, - .offset = (uint32_t)offsetof(GetDocumentsRequest_GetDocumentsRequestV0__storage_, startAfter), - .flags = GPBFieldOptional, - .dataType = GPBDataTypeBytes, - }, - { - .name = "startAt", - .dataTypeSpecific.clazz = Nil, - .number = GetDocumentsRequest_GetDocumentsRequestV0_FieldNumber_StartAt, - .hasIndex = -1, - .offset = (uint32_t)offsetof(GetDocumentsRequest_GetDocumentsRequestV0__storage_, startAt), - .flags = GPBFieldOptional, - .dataType = GPBDataTypeBytes, + .dataType = GPBDataTypeUInt64, }, { .name = "prove", .dataTypeSpecific.clazz = Nil, - .number = GetDocumentsRequest_GetDocumentsRequestV0_FieldNumber_Prove, - .hasIndex = 5, - .offset = 6, // Stored in _has_storage_ to save space. + .number = GetDataContractHistoryRequest_GetDataContractHistoryRequestV0_FieldNumber_Prove, + .hasIndex = 4, + .offset = 5, // Stored in _has_storage_ to save space. .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), .dataType = GPBDataTypeBool, }, }; GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetDocumentsRequest_GetDocumentsRequestV0 class] + [GPBDescriptor allocDescriptorForClass:[GetDataContractHistoryRequest_GetDataContractHistoryRequestV0 class] rootClass:[PlatformRoot class] file:PlatformRoot_FileDescriptor() fields:fields fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetDocumentsRequest_GetDocumentsRequestV0__storage_) + storageSize:sizeof(GetDataContractHistoryRequest_GetDataContractHistoryRequestV0__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; - static const char *oneofs[] = { - "start", - }; - [localDescriptor setupOneofs:oneofs - count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) - firstHasIndex:-1]; - [localDescriptor setupContainingMessageClass:GPBObjCClass(GetDocumentsRequest)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetDataContractHistoryRequest)]; #if defined(DEBUG) && DEBUG NSAssert(descriptor == nil, @"Startup recursed!"); #endif // DEBUG @@ -4495,22 +4161,17 @@ + (GPBDescriptor *)descriptor { @end -void GetDocumentsRequest_GetDocumentsRequestV0_ClearStartOneOfCase(GetDocumentsRequest_GetDocumentsRequestV0 *message) { - GPBDescriptor *descriptor = [GetDocumentsRequest_GetDocumentsRequestV0 descriptor]; - GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; - GPBClearOneof(message, oneof); -} -#pragma mark - GetDocumentsResponse +#pragma mark - GetDataContractHistoryResponse -@implementation GetDocumentsResponse +@implementation GetDataContractHistoryResponse @dynamic versionOneOfCase; @dynamic v0; -typedef struct GetDocumentsResponse__storage_ { +typedef struct GetDataContractHistoryResponse__storage_ { uint32_t _has_storage_[2]; - GetDocumentsResponse_GetDocumentsResponseV0 *v0; -} GetDocumentsResponse__storage_; + GetDataContractHistoryResponse_GetDataContractHistoryResponseV0 *v0; +} GetDataContractHistoryResponse__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. @@ -4520,21 +4181,21 @@ + (GPBDescriptor *)descriptor { static GPBMessageFieldDescription fields[] = { { .name = "v0", - .dataTypeSpecific.clazz = GPBObjCClass(GetDocumentsResponse_GetDocumentsResponseV0), - .number = GetDocumentsResponse_FieldNumber_V0, + .dataTypeSpecific.clazz = GPBObjCClass(GetDataContractHistoryResponse_GetDataContractHistoryResponseV0), + .number = GetDataContractHistoryResponse_FieldNumber_V0, .hasIndex = -1, - .offset = (uint32_t)offsetof(GetDocumentsResponse__storage_, v0), + .offset = (uint32_t)offsetof(GetDataContractHistoryResponse__storage_, v0), .flags = GPBFieldOptional, .dataType = GPBDataTypeMessage, }, }; GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetDocumentsResponse class] + [GPBDescriptor allocDescriptorForClass:[GetDataContractHistoryResponse class] rootClass:[PlatformRoot class] file:PlatformRoot_FileDescriptor() fields:fields fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetDocumentsResponse__storage_) + storageSize:sizeof(GetDataContractHistoryResponse__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; static const char *oneofs[] = { "version", @@ -4552,26 +4213,26 @@ + (GPBDescriptor *)descriptor { @end -void GetDocumentsResponse_ClearVersionOneOfCase(GetDocumentsResponse *message) { - GPBDescriptor *descriptor = [GetDocumentsResponse descriptor]; +void GetDataContractHistoryResponse_ClearVersionOneOfCase(GetDataContractHistoryResponse *message) { + GPBDescriptor *descriptor = [GetDataContractHistoryResponse descriptor]; GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; GPBClearOneof(message, oneof); } -#pragma mark - GetDocumentsResponse_GetDocumentsResponseV0 +#pragma mark - GetDataContractHistoryResponse_GetDataContractHistoryResponseV0 -@implementation GetDocumentsResponse_GetDocumentsResponseV0 +@implementation GetDataContractHistoryResponse_GetDataContractHistoryResponseV0 @dynamic resultOneOfCase; -@dynamic documents; +@dynamic dataContractHistory; @dynamic proof; @dynamic hasMetadata, metadata; -typedef struct GetDocumentsResponse_GetDocumentsResponseV0__storage_ { +typedef struct GetDataContractHistoryResponse_GetDataContractHistoryResponseV0__storage_ { uint32_t _has_storage_[2]; - GetDocumentsResponse_GetDocumentsResponseV0_Documents *documents; + GetDataContractHistoryResponse_GetDataContractHistoryResponseV0_DataContractHistory *dataContractHistory; Proof *proof; ResponseMetadata *metadata; -} GetDocumentsResponse_GetDocumentsResponseV0__storage_; +} GetDataContractHistoryResponse_GetDataContractHistoryResponseV0__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. @@ -4580,40 +4241,40 @@ + (GPBDescriptor *)descriptor { if (!descriptor) { static GPBMessageFieldDescription fields[] = { { - .name = "documents", - .dataTypeSpecific.clazz = GPBObjCClass(GetDocumentsResponse_GetDocumentsResponseV0_Documents), - .number = GetDocumentsResponse_GetDocumentsResponseV0_FieldNumber_Documents, + .name = "dataContractHistory", + .dataTypeSpecific.clazz = GPBObjCClass(GetDataContractHistoryResponse_GetDataContractHistoryResponseV0_DataContractHistory), + .number = GetDataContractHistoryResponse_GetDataContractHistoryResponseV0_FieldNumber_DataContractHistory, .hasIndex = -1, - .offset = (uint32_t)offsetof(GetDocumentsResponse_GetDocumentsResponseV0__storage_, documents), + .offset = (uint32_t)offsetof(GetDataContractHistoryResponse_GetDataContractHistoryResponseV0__storage_, dataContractHistory), .flags = GPBFieldOptional, .dataType = GPBDataTypeMessage, }, { .name = "proof", .dataTypeSpecific.clazz = GPBObjCClass(Proof), - .number = GetDocumentsResponse_GetDocumentsResponseV0_FieldNumber_Proof, + .number = GetDataContractHistoryResponse_GetDataContractHistoryResponseV0_FieldNumber_Proof, .hasIndex = -1, - .offset = (uint32_t)offsetof(GetDocumentsResponse_GetDocumentsResponseV0__storage_, proof), + .offset = (uint32_t)offsetof(GetDataContractHistoryResponse_GetDataContractHistoryResponseV0__storage_, proof), .flags = GPBFieldOptional, .dataType = GPBDataTypeMessage, }, { .name = "metadata", .dataTypeSpecific.clazz = GPBObjCClass(ResponseMetadata), - .number = GetDocumentsResponse_GetDocumentsResponseV0_FieldNumber_Metadata, + .number = GetDataContractHistoryResponse_GetDataContractHistoryResponseV0_FieldNumber_Metadata, .hasIndex = 0, - .offset = (uint32_t)offsetof(GetDocumentsResponse_GetDocumentsResponseV0__storage_, metadata), + .offset = (uint32_t)offsetof(GetDataContractHistoryResponse_GetDataContractHistoryResponseV0__storage_, metadata), .flags = GPBFieldOptional, .dataType = GPBDataTypeMessage, }, }; GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetDocumentsResponse_GetDocumentsResponseV0 class] + [GPBDescriptor allocDescriptorForClass:[GetDataContractHistoryResponse_GetDataContractHistoryResponseV0 class] rootClass:[PlatformRoot class] file:PlatformRoot_FileDescriptor() fields:fields fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetDocumentsResponse_GetDocumentsResponseV0__storage_) + storageSize:sizeof(GetDataContractHistoryResponse_GetDataContractHistoryResponseV0__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; static const char *oneofs[] = { "result", @@ -4621,7 +4282,7 @@ + (GPBDescriptor *)descriptor { [localDescriptor setupOneofs:oneofs count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) firstHasIndex:-1]; - [localDescriptor setupContainingMessageClass:GPBObjCClass(GetDocumentsResponse)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetDataContractHistoryResponse)]; #if defined(DEBUG) && DEBUG NSAssert(descriptor == nil, @"Startup recursed!"); #endif // DEBUG @@ -4632,21 +4293,23 @@ + (GPBDescriptor *)descriptor { @end -void GetDocumentsResponse_GetDocumentsResponseV0_ClearResultOneOfCase(GetDocumentsResponse_GetDocumentsResponseV0 *message) { - GPBDescriptor *descriptor = [GetDocumentsResponse_GetDocumentsResponseV0 descriptor]; +void GetDataContractHistoryResponse_GetDataContractHistoryResponseV0_ClearResultOneOfCase(GetDataContractHistoryResponse_GetDataContractHistoryResponseV0 *message) { + GPBDescriptor *descriptor = [GetDataContractHistoryResponse_GetDataContractHistoryResponseV0 descriptor]; GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; GPBClearOneof(message, oneof); } -#pragma mark - GetDocumentsResponse_GetDocumentsResponseV0_Documents +#pragma mark - GetDataContractHistoryResponse_GetDataContractHistoryResponseV0_DataContractHistoryEntry -@implementation GetDocumentsResponse_GetDocumentsResponseV0_Documents +@implementation GetDataContractHistoryResponse_GetDataContractHistoryResponseV0_DataContractHistoryEntry -@dynamic documentsArray, documentsArray_Count; +@dynamic date; +@dynamic value; -typedef struct GetDocumentsResponse_GetDocumentsResponseV0_Documents__storage_ { +typedef struct GetDataContractHistoryResponse_GetDataContractHistoryResponseV0_DataContractHistoryEntry__storage_ { uint32_t _has_storage_[1]; - NSMutableArray *documentsArray; -} GetDocumentsResponse_GetDocumentsResponseV0_Documents__storage_; + NSData *value; + uint64_t date; +} GetDataContractHistoryResponse_GetDataContractHistoryResponseV0_DataContractHistoryEntry__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. @@ -4655,76 +4318,33 @@ + (GPBDescriptor *)descriptor { if (!descriptor) { static GPBMessageFieldDescription fields[] = { { - .name = "documentsArray", + .name = "date", .dataTypeSpecific.clazz = Nil, - .number = GetDocumentsResponse_GetDocumentsResponseV0_Documents_FieldNumber_DocumentsArray, - .hasIndex = GPBNoHasBit, - .offset = (uint32_t)offsetof(GetDocumentsResponse_GetDocumentsResponseV0_Documents__storage_, documentsArray), - .flags = GPBFieldRepeated, - .dataType = GPBDataTypeBytes, + .number = GetDataContractHistoryResponse_GetDataContractHistoryResponseV0_DataContractHistoryEntry_FieldNumber_Date, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetDataContractHistoryResponse_GetDataContractHistoryResponseV0_DataContractHistoryEntry__storage_, date), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeUInt64, }, - }; - GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetDocumentsResponse_GetDocumentsResponseV0_Documents class] - rootClass:[PlatformRoot class] - file:PlatformRoot_FileDescriptor() - fields:fields - fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetDocumentsResponse_GetDocumentsResponseV0_Documents__storage_) - flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; - [localDescriptor setupContainingMessageClass:GPBObjCClass(GetDocumentsResponse_GetDocumentsResponseV0)]; - #if defined(DEBUG) && DEBUG - NSAssert(descriptor == nil, @"Startup recursed!"); - #endif // DEBUG - descriptor = localDescriptor; - } - return descriptor; -} - -@end - -#pragma mark - GetIdentitiesByPublicKeyHashesRequest - -@implementation GetIdentitiesByPublicKeyHashesRequest - -@dynamic versionOneOfCase; -@dynamic v0; - -typedef struct GetIdentitiesByPublicKeyHashesRequest__storage_ { - uint32_t _has_storage_[2]; - GetIdentitiesByPublicKeyHashesRequest_GetIdentitiesByPublicKeyHashesRequestV0 *v0; -} GetIdentitiesByPublicKeyHashesRequest__storage_; - -// This method is threadsafe because it is initially called -// in +initialize for each subclass. -+ (GPBDescriptor *)descriptor { - static GPBDescriptor *descriptor = nil; - if (!descriptor) { - static GPBMessageFieldDescription fields[] = { - { - .name = "v0", - .dataTypeSpecific.clazz = GPBObjCClass(GetIdentitiesByPublicKeyHashesRequest_GetIdentitiesByPublicKeyHashesRequestV0), - .number = GetIdentitiesByPublicKeyHashesRequest_FieldNumber_V0, - .hasIndex = -1, - .offset = (uint32_t)offsetof(GetIdentitiesByPublicKeyHashesRequest__storage_, v0), - .flags = GPBFieldOptional, - .dataType = GPBDataTypeMessage, + { + .name = "value", + .dataTypeSpecific.clazz = Nil, + .number = GetDataContractHistoryResponse_GetDataContractHistoryResponseV0_DataContractHistoryEntry_FieldNumber_Value, + .hasIndex = 1, + .offset = (uint32_t)offsetof(GetDataContractHistoryResponse_GetDataContractHistoryResponseV0_DataContractHistoryEntry__storage_, value), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, }, }; GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetIdentitiesByPublicKeyHashesRequest class] + [GPBDescriptor allocDescriptorForClass:[GetDataContractHistoryResponse_GetDataContractHistoryResponseV0_DataContractHistoryEntry class] rootClass:[PlatformRoot class] file:PlatformRoot_FileDescriptor() fields:fields fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetIdentitiesByPublicKeyHashesRequest__storage_) + storageSize:sizeof(GetDataContractHistoryResponse_GetDataContractHistoryResponseV0_DataContractHistoryEntry__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; - static const char *oneofs[] = { - "version", - }; - [localDescriptor setupOneofs:oneofs - count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) - firstHasIndex:-1]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetDataContractHistoryResponse_GetDataContractHistoryResponseV0)]; #if defined(DEBUG) && DEBUG NSAssert(descriptor == nil, @"Startup recursed!"); #endif // DEBUG @@ -4735,22 +4355,16 @@ + (GPBDescriptor *)descriptor { @end -void GetIdentitiesByPublicKeyHashesRequest_ClearVersionOneOfCase(GetIdentitiesByPublicKeyHashesRequest *message) { - GPBDescriptor *descriptor = [GetIdentitiesByPublicKeyHashesRequest descriptor]; - GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; - GPBClearOneof(message, oneof); -} -#pragma mark - GetIdentitiesByPublicKeyHashesRequest_GetIdentitiesByPublicKeyHashesRequestV0 +#pragma mark - GetDataContractHistoryResponse_GetDataContractHistoryResponseV0_DataContractHistory -@implementation GetIdentitiesByPublicKeyHashesRequest_GetIdentitiesByPublicKeyHashesRequestV0 +@implementation GetDataContractHistoryResponse_GetDataContractHistoryResponseV0_DataContractHistory -@dynamic publicKeyHashesArray, publicKeyHashesArray_Count; -@dynamic prove; +@dynamic dataContractEntriesArray, dataContractEntriesArray_Count; -typedef struct GetIdentitiesByPublicKeyHashesRequest_GetIdentitiesByPublicKeyHashesRequestV0__storage_ { +typedef struct GetDataContractHistoryResponse_GetDataContractHistoryResponseV0_DataContractHistory__storage_ { uint32_t _has_storage_[1]; - NSMutableArray *publicKeyHashesArray; -} GetIdentitiesByPublicKeyHashesRequest_GetIdentitiesByPublicKeyHashesRequestV0__storage_; + NSMutableArray *dataContractEntriesArray; +} GetDataContractHistoryResponse_GetDataContractHistoryResponseV0_DataContractHistory__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. @@ -4759,33 +4373,24 @@ + (GPBDescriptor *)descriptor { if (!descriptor) { static GPBMessageFieldDescription fields[] = { { - .name = "publicKeyHashesArray", - .dataTypeSpecific.clazz = Nil, - .number = GetIdentitiesByPublicKeyHashesRequest_GetIdentitiesByPublicKeyHashesRequestV0_FieldNumber_PublicKeyHashesArray, + .name = "dataContractEntriesArray", + .dataTypeSpecific.clazz = GPBObjCClass(GetDataContractHistoryResponse_GetDataContractHistoryResponseV0_DataContractHistoryEntry), + .number = GetDataContractHistoryResponse_GetDataContractHistoryResponseV0_DataContractHistory_FieldNumber_DataContractEntriesArray, .hasIndex = GPBNoHasBit, - .offset = (uint32_t)offsetof(GetIdentitiesByPublicKeyHashesRequest_GetIdentitiesByPublicKeyHashesRequestV0__storage_, publicKeyHashesArray), + .offset = (uint32_t)offsetof(GetDataContractHistoryResponse_GetDataContractHistoryResponseV0_DataContractHistory__storage_, dataContractEntriesArray), .flags = GPBFieldRepeated, - .dataType = GPBDataTypeBytes, - }, - { - .name = "prove", - .dataTypeSpecific.clazz = Nil, - .number = GetIdentitiesByPublicKeyHashesRequest_GetIdentitiesByPublicKeyHashesRequestV0_FieldNumber_Prove, - .hasIndex = 0, - .offset = 1, // Stored in _has_storage_ to save space. - .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), - .dataType = GPBDataTypeBool, + .dataType = GPBDataTypeMessage, }, }; GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetIdentitiesByPublicKeyHashesRequest_GetIdentitiesByPublicKeyHashesRequestV0 class] + [GPBDescriptor allocDescriptorForClass:[GetDataContractHistoryResponse_GetDataContractHistoryResponseV0_DataContractHistory class] rootClass:[PlatformRoot class] file:PlatformRoot_FileDescriptor() fields:fields fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetIdentitiesByPublicKeyHashesRequest_GetIdentitiesByPublicKeyHashesRequestV0__storage_) + storageSize:sizeof(GetDataContractHistoryResponse_GetDataContractHistoryResponseV0_DataContractHistory__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; - [localDescriptor setupContainingMessageClass:GPBObjCClass(GetIdentitiesByPublicKeyHashesRequest)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetDataContractHistoryResponse_GetDataContractHistoryResponseV0)]; #if defined(DEBUG) && DEBUG NSAssert(descriptor == nil, @"Startup recursed!"); #endif // DEBUG @@ -4796,17 +4401,17 @@ + (GPBDescriptor *)descriptor { @end -#pragma mark - GetIdentitiesByPublicKeyHashesResponse +#pragma mark - GetDocumentsRequest -@implementation GetIdentitiesByPublicKeyHashesResponse +@implementation GetDocumentsRequest @dynamic versionOneOfCase; @dynamic v0; -typedef struct GetIdentitiesByPublicKeyHashesResponse__storage_ { +typedef struct GetDocumentsRequest__storage_ { uint32_t _has_storage_[2]; - GetIdentitiesByPublicKeyHashesResponse_GetIdentitiesByPublicKeyHashesResponseV0 *v0; -} GetIdentitiesByPublicKeyHashesResponse__storage_; + GetDocumentsRequest_GetDocumentsRequestV0 *v0; +} GetDocumentsRequest__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. @@ -4816,21 +4421,21 @@ + (GPBDescriptor *)descriptor { static GPBMessageFieldDescription fields[] = { { .name = "v0", - .dataTypeSpecific.clazz = GPBObjCClass(GetIdentitiesByPublicKeyHashesResponse_GetIdentitiesByPublicKeyHashesResponseV0), - .number = GetIdentitiesByPublicKeyHashesResponse_FieldNumber_V0, + .dataTypeSpecific.clazz = GPBObjCClass(GetDocumentsRequest_GetDocumentsRequestV0), + .number = GetDocumentsRequest_FieldNumber_V0, .hasIndex = -1, - .offset = (uint32_t)offsetof(GetIdentitiesByPublicKeyHashesResponse__storage_, v0), + .offset = (uint32_t)offsetof(GetDocumentsRequest__storage_, v0), .flags = GPBFieldOptional, .dataType = GPBDataTypeMessage, }, }; GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetIdentitiesByPublicKeyHashesResponse class] + [GPBDescriptor allocDescriptorForClass:[GetDocumentsRequest class] rootClass:[PlatformRoot class] file:PlatformRoot_FileDescriptor() fields:fields fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetIdentitiesByPublicKeyHashesResponse__storage_) + storageSize:sizeof(GetDocumentsRequest__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; static const char *oneofs[] = { "version", @@ -4848,23 +4453,35 @@ + (GPBDescriptor *)descriptor { @end -void GetIdentitiesByPublicKeyHashesResponse_ClearVersionOneOfCase(GetIdentitiesByPublicKeyHashesResponse *message) { - GPBDescriptor *descriptor = [GetIdentitiesByPublicKeyHashesResponse descriptor]; +void GetDocumentsRequest_ClearVersionOneOfCase(GetDocumentsRequest *message) { + GPBDescriptor *descriptor = [GetDocumentsRequest descriptor]; GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; GPBClearOneof(message, oneof); } -#pragma mark - GetIdentitiesByPublicKeyHashesResponse_PublicKeyHashIdentityEntry +#pragma mark - GetDocumentsRequest_GetDocumentsRequestV0 -@implementation GetIdentitiesByPublicKeyHashesResponse_PublicKeyHashIdentityEntry +@implementation GetDocumentsRequest_GetDocumentsRequestV0 -@dynamic publicKeyHash; -@dynamic hasValue, value; +@dynamic startOneOfCase; +@dynamic dataContractId; +@dynamic documentType; +@dynamic where; +@dynamic orderBy; +@dynamic limit; +@dynamic startAfter; +@dynamic startAt; +@dynamic prove; -typedef struct GetIdentitiesByPublicKeyHashesResponse_PublicKeyHashIdentityEntry__storage_ { - uint32_t _has_storage_[1]; - NSData *publicKeyHash; - GPBBytesValue *value; -} GetIdentitiesByPublicKeyHashesResponse_PublicKeyHashIdentityEntry__storage_; +typedef struct GetDocumentsRequest_GetDocumentsRequestV0__storage_ { + uint32_t _has_storage_[2]; + uint32_t limit; + NSData *dataContractId; + NSString *documentType; + NSData *where; + NSData *orderBy; + NSData *startAfter; + NSData *startAt; +} GetDocumentsRequest_GetDocumentsRequestV0__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. @@ -4873,33 +4490,93 @@ + (GPBDescriptor *)descriptor { if (!descriptor) { static GPBMessageFieldDescription fields[] = { { - .name = "publicKeyHash", + .name = "dataContractId", .dataTypeSpecific.clazz = Nil, - .number = GetIdentitiesByPublicKeyHashesResponse_PublicKeyHashIdentityEntry_FieldNumber_PublicKeyHash, + .number = GetDocumentsRequest_GetDocumentsRequestV0_FieldNumber_DataContractId, .hasIndex = 0, - .offset = (uint32_t)offsetof(GetIdentitiesByPublicKeyHashesResponse_PublicKeyHashIdentityEntry__storage_, publicKeyHash), + .offset = (uint32_t)offsetof(GetDocumentsRequest_GetDocumentsRequestV0__storage_, dataContractId), .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), .dataType = GPBDataTypeBytes, }, { - .name = "value", - .dataTypeSpecific.clazz = GPBObjCClass(GPBBytesValue), - .number = GetIdentitiesByPublicKeyHashesResponse_PublicKeyHashIdentityEntry_FieldNumber_Value, + .name = "documentType", + .dataTypeSpecific.clazz = Nil, + .number = GetDocumentsRequest_GetDocumentsRequestV0_FieldNumber_DocumentType, .hasIndex = 1, - .offset = (uint32_t)offsetof(GetIdentitiesByPublicKeyHashesResponse_PublicKeyHashIdentityEntry__storage_, value), + .offset = (uint32_t)offsetof(GetDocumentsRequest_GetDocumentsRequestV0__storage_, documentType), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeString, + }, + { + .name = "where", + .dataTypeSpecific.clazz = Nil, + .number = GetDocumentsRequest_GetDocumentsRequestV0_FieldNumber_Where, + .hasIndex = 2, + .offset = (uint32_t)offsetof(GetDocumentsRequest_GetDocumentsRequestV0__storage_, where), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, + }, + { + .name = "orderBy", + .dataTypeSpecific.clazz = Nil, + .number = GetDocumentsRequest_GetDocumentsRequestV0_FieldNumber_OrderBy, + .hasIndex = 3, + .offset = (uint32_t)offsetof(GetDocumentsRequest_GetDocumentsRequestV0__storage_, orderBy), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, + }, + { + .name = "limit", + .dataTypeSpecific.clazz = Nil, + .number = GetDocumentsRequest_GetDocumentsRequestV0_FieldNumber_Limit, + .hasIndex = 4, + .offset = (uint32_t)offsetof(GetDocumentsRequest_GetDocumentsRequestV0__storage_, limit), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeUInt32, + }, + { + .name = "startAfter", + .dataTypeSpecific.clazz = Nil, + .number = GetDocumentsRequest_GetDocumentsRequestV0_FieldNumber_StartAfter, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetDocumentsRequest_GetDocumentsRequestV0__storage_, startAfter), .flags = GPBFieldOptional, - .dataType = GPBDataTypeMessage, + .dataType = GPBDataTypeBytes, + }, + { + .name = "startAt", + .dataTypeSpecific.clazz = Nil, + .number = GetDocumentsRequest_GetDocumentsRequestV0_FieldNumber_StartAt, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetDocumentsRequest_GetDocumentsRequestV0__storage_, startAt), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeBytes, + }, + { + .name = "prove", + .dataTypeSpecific.clazz = Nil, + .number = GetDocumentsRequest_GetDocumentsRequestV0_FieldNumber_Prove, + .hasIndex = 5, + .offset = 6, // Stored in _has_storage_ to save space. + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBool, }, }; GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetIdentitiesByPublicKeyHashesResponse_PublicKeyHashIdentityEntry class] + [GPBDescriptor allocDescriptorForClass:[GetDocumentsRequest_GetDocumentsRequestV0 class] rootClass:[PlatformRoot class] file:PlatformRoot_FileDescriptor() fields:fields fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetIdentitiesByPublicKeyHashesResponse_PublicKeyHashIdentityEntry__storage_) + storageSize:sizeof(GetDocumentsRequest_GetDocumentsRequestV0__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; - [localDescriptor setupContainingMessageClass:GPBObjCClass(GetIdentitiesByPublicKeyHashesResponse)]; + static const char *oneofs[] = { + "start", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetDocumentsRequest)]; #if defined(DEBUG) && DEBUG NSAssert(descriptor == nil, @"Startup recursed!"); #endif // DEBUG @@ -4910,16 +4587,22 @@ + (GPBDescriptor *)descriptor { @end -#pragma mark - GetIdentitiesByPublicKeyHashesResponse_IdentitiesByPublicKeyHashes +void GetDocumentsRequest_GetDocumentsRequestV0_ClearStartOneOfCase(GetDocumentsRequest_GetDocumentsRequestV0 *message) { + GPBDescriptor *descriptor = [GetDocumentsRequest_GetDocumentsRequestV0 descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetDocumentsResponse -@implementation GetIdentitiesByPublicKeyHashesResponse_IdentitiesByPublicKeyHashes +@implementation GetDocumentsResponse -@dynamic identityEntriesArray, identityEntriesArray_Count; +@dynamic versionOneOfCase; +@dynamic v0; -typedef struct GetIdentitiesByPublicKeyHashesResponse_IdentitiesByPublicKeyHashes__storage_ { - uint32_t _has_storage_[1]; - NSMutableArray *identityEntriesArray; -} GetIdentitiesByPublicKeyHashesResponse_IdentitiesByPublicKeyHashes__storage_; +typedef struct GetDocumentsResponse__storage_ { + uint32_t _has_storage_[2]; + GetDocumentsResponse_GetDocumentsResponseV0 *v0; +} GetDocumentsResponse__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. @@ -4928,24 +4611,29 @@ + (GPBDescriptor *)descriptor { if (!descriptor) { static GPBMessageFieldDescription fields[] = { { - .name = "identityEntriesArray", - .dataTypeSpecific.clazz = GPBObjCClass(GetIdentitiesByPublicKeyHashesResponse_PublicKeyHashIdentityEntry), - .number = GetIdentitiesByPublicKeyHashesResponse_IdentitiesByPublicKeyHashes_FieldNumber_IdentityEntriesArray, - .hasIndex = GPBNoHasBit, - .offset = (uint32_t)offsetof(GetIdentitiesByPublicKeyHashesResponse_IdentitiesByPublicKeyHashes__storage_, identityEntriesArray), - .flags = GPBFieldRepeated, + .name = "v0", + .dataTypeSpecific.clazz = GPBObjCClass(GetDocumentsResponse_GetDocumentsResponseV0), + .number = GetDocumentsResponse_FieldNumber_V0, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetDocumentsResponse__storage_, v0), + .flags = GPBFieldOptional, .dataType = GPBDataTypeMessage, }, }; GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetIdentitiesByPublicKeyHashesResponse_IdentitiesByPublicKeyHashes class] + [GPBDescriptor allocDescriptorForClass:[GetDocumentsResponse class] rootClass:[PlatformRoot class] file:PlatformRoot_FileDescriptor() fields:fields fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetIdentitiesByPublicKeyHashesResponse_IdentitiesByPublicKeyHashes__storage_) + storageSize:sizeof(GetDocumentsResponse__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; - [localDescriptor setupContainingMessageClass:GPBObjCClass(GetIdentitiesByPublicKeyHashesResponse)]; + static const char *oneofs[] = { + "version", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; #if defined(DEBUG) && DEBUG NSAssert(descriptor == nil, @"Startup recursed!"); #endif // DEBUG @@ -4956,21 +4644,26 @@ + (GPBDescriptor *)descriptor { @end -#pragma mark - GetIdentitiesByPublicKeyHashesResponse_GetIdentitiesByPublicKeyHashesResponseV0 +void GetDocumentsResponse_ClearVersionOneOfCase(GetDocumentsResponse *message) { + GPBDescriptor *descriptor = [GetDocumentsResponse descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetDocumentsResponse_GetDocumentsResponseV0 -@implementation GetIdentitiesByPublicKeyHashesResponse_GetIdentitiesByPublicKeyHashesResponseV0 +@implementation GetDocumentsResponse_GetDocumentsResponseV0 @dynamic resultOneOfCase; -@dynamic identities; +@dynamic documents; @dynamic proof; @dynamic hasMetadata, metadata; -typedef struct GetIdentitiesByPublicKeyHashesResponse_GetIdentitiesByPublicKeyHashesResponseV0__storage_ { +typedef struct GetDocumentsResponse_GetDocumentsResponseV0__storage_ { uint32_t _has_storage_[2]; - GetIdentitiesByPublicKeyHashesResponse_IdentitiesByPublicKeyHashes *identities; + GetDocumentsResponse_GetDocumentsResponseV0_Documents *documents; Proof *proof; ResponseMetadata *metadata; -} GetIdentitiesByPublicKeyHashesResponse_GetIdentitiesByPublicKeyHashesResponseV0__storage_; +} GetDocumentsResponse_GetDocumentsResponseV0__storage_; // This method is threadsafe because it is initially called // in +initialize for each subclass. @@ -4979,40 +4672,40 @@ + (GPBDescriptor *)descriptor { if (!descriptor) { static GPBMessageFieldDescription fields[] = { { - .name = "identities", - .dataTypeSpecific.clazz = GPBObjCClass(GetIdentitiesByPublicKeyHashesResponse_IdentitiesByPublicKeyHashes), - .number = GetIdentitiesByPublicKeyHashesResponse_GetIdentitiesByPublicKeyHashesResponseV0_FieldNumber_Identities, + .name = "documents", + .dataTypeSpecific.clazz = GPBObjCClass(GetDocumentsResponse_GetDocumentsResponseV0_Documents), + .number = GetDocumentsResponse_GetDocumentsResponseV0_FieldNumber_Documents, .hasIndex = -1, - .offset = (uint32_t)offsetof(GetIdentitiesByPublicKeyHashesResponse_GetIdentitiesByPublicKeyHashesResponseV0__storage_, identities), + .offset = (uint32_t)offsetof(GetDocumentsResponse_GetDocumentsResponseV0__storage_, documents), .flags = GPBFieldOptional, .dataType = GPBDataTypeMessage, }, { .name = "proof", .dataTypeSpecific.clazz = GPBObjCClass(Proof), - .number = GetIdentitiesByPublicKeyHashesResponse_GetIdentitiesByPublicKeyHashesResponseV0_FieldNumber_Proof, + .number = GetDocumentsResponse_GetDocumentsResponseV0_FieldNumber_Proof, .hasIndex = -1, - .offset = (uint32_t)offsetof(GetIdentitiesByPublicKeyHashesResponse_GetIdentitiesByPublicKeyHashesResponseV0__storage_, proof), + .offset = (uint32_t)offsetof(GetDocumentsResponse_GetDocumentsResponseV0__storage_, proof), .flags = GPBFieldOptional, .dataType = GPBDataTypeMessage, }, { .name = "metadata", .dataTypeSpecific.clazz = GPBObjCClass(ResponseMetadata), - .number = GetIdentitiesByPublicKeyHashesResponse_GetIdentitiesByPublicKeyHashesResponseV0_FieldNumber_Metadata, + .number = GetDocumentsResponse_GetDocumentsResponseV0_FieldNumber_Metadata, .hasIndex = 0, - .offset = (uint32_t)offsetof(GetIdentitiesByPublicKeyHashesResponse_GetIdentitiesByPublicKeyHashesResponseV0__storage_, metadata), + .offset = (uint32_t)offsetof(GetDocumentsResponse_GetDocumentsResponseV0__storage_, metadata), .flags = GPBFieldOptional, .dataType = GPBDataTypeMessage, }, }; GPBDescriptor *localDescriptor = - [GPBDescriptor allocDescriptorForClass:[GetIdentitiesByPublicKeyHashesResponse_GetIdentitiesByPublicKeyHashesResponseV0 class] + [GPBDescriptor allocDescriptorForClass:[GetDocumentsResponse_GetDocumentsResponseV0 class] rootClass:[PlatformRoot class] file:PlatformRoot_FileDescriptor() fields:fields fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) - storageSize:sizeof(GetIdentitiesByPublicKeyHashesResponse_GetIdentitiesByPublicKeyHashesResponseV0__storage_) + storageSize:sizeof(GetDocumentsResponse_GetDocumentsResponseV0__storage_) flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; static const char *oneofs[] = { "result", @@ -5020,7 +4713,7 @@ + (GPBDescriptor *)descriptor { [localDescriptor setupOneofs:oneofs count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) firstHasIndex:-1]; - [localDescriptor setupContainingMessageClass:GPBObjCClass(GetIdentitiesByPublicKeyHashesResponse)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetDocumentsResponse)]; #if defined(DEBUG) && DEBUG NSAssert(descriptor == nil, @"Startup recursed!"); #endif // DEBUG @@ -5031,11 +4724,57 @@ + (GPBDescriptor *)descriptor { @end -void GetIdentitiesByPublicKeyHashesResponse_GetIdentitiesByPublicKeyHashesResponseV0_ClearResultOneOfCase(GetIdentitiesByPublicKeyHashesResponse_GetIdentitiesByPublicKeyHashesResponseV0 *message) { - GPBDescriptor *descriptor = [GetIdentitiesByPublicKeyHashesResponse_GetIdentitiesByPublicKeyHashesResponseV0 descriptor]; +void GetDocumentsResponse_GetDocumentsResponseV0_ClearResultOneOfCase(GetDocumentsResponse_GetDocumentsResponseV0 *message) { + GPBDescriptor *descriptor = [GetDocumentsResponse_GetDocumentsResponseV0 descriptor]; GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; GPBClearOneof(message, oneof); } +#pragma mark - GetDocumentsResponse_GetDocumentsResponseV0_Documents + +@implementation GetDocumentsResponse_GetDocumentsResponseV0_Documents + +@dynamic documentsArray, documentsArray_Count; + +typedef struct GetDocumentsResponse_GetDocumentsResponseV0_Documents__storage_ { + uint32_t _has_storage_[1]; + NSMutableArray *documentsArray; +} GetDocumentsResponse_GetDocumentsResponseV0_Documents__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "documentsArray", + .dataTypeSpecific.clazz = Nil, + .number = GetDocumentsResponse_GetDocumentsResponseV0_Documents_FieldNumber_DocumentsArray, + .hasIndex = GPBNoHasBit, + .offset = (uint32_t)offsetof(GetDocumentsResponse_GetDocumentsResponseV0_Documents__storage_, documentsArray), + .flags = GPBFieldRepeated, + .dataType = GPBDataTypeBytes, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetDocumentsResponse_GetDocumentsResponseV0_Documents class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetDocumentsResponse_GetDocumentsResponseV0_Documents__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetDocumentsResponse_GetDocumentsResponseV0)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + #pragma mark - GetIdentityByPublicKeyHashRequest @implementation GetIdentityByPublicKeyHashRequest diff --git a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbrpc.h b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbrpc.h index 1554fa906e..e3182d0c37 100644 --- a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbrpc.h +++ b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbrpc.h @@ -28,10 +28,8 @@ @class GetDocumentsResponse; @class GetEpochsInfoRequest; @class GetEpochsInfoResponse; -@class GetIdentitiesByPublicKeyHashesRequest; -@class GetIdentitiesByPublicKeyHashesResponse; -@class GetIdentitiesRequest; -@class GetIdentitiesResponse; +@class GetIdentitiesContractKeysRequest; +@class GetIdentitiesContractKeysResponse; @class GetIdentityBalanceAndRevisionRequest; @class GetIdentityBalanceAndRevisionResponse; @class GetIdentityBalanceRequest; @@ -94,14 +92,14 @@ NS_ASSUME_NONNULL_BEGIN - (GRPCUnaryProtoCall *)getIdentityWithMessage:(GetIdentityRequest *)message responseHandler:(id)handler callOptions:(GRPCCallOptions *_Nullable)callOptions; -#pragma mark getIdentities(GetIdentitiesRequest) returns (GetIdentitiesResponse) - -- (GRPCUnaryProtoCall *)getIdentitiesWithMessage:(GetIdentitiesRequest *)message responseHandler:(id)handler callOptions:(GRPCCallOptions *_Nullable)callOptions; - #pragma mark getIdentityKeys(GetIdentityKeysRequest) returns (GetIdentityKeysResponse) - (GRPCUnaryProtoCall *)getIdentityKeysWithMessage:(GetIdentityKeysRequest *)message responseHandler:(id)handler callOptions:(GRPCCallOptions *_Nullable)callOptions; +#pragma mark getIdentitiesContractKeys(GetIdentitiesContractKeysRequest) returns (GetIdentitiesContractKeysResponse) + +- (GRPCUnaryProtoCall *)getIdentitiesContractKeysWithMessage:(GetIdentitiesContractKeysRequest *)message responseHandler:(id)handler callOptions:(GRPCCallOptions *_Nullable)callOptions; + #pragma mark getIdentityNonce(GetIdentityNonceRequest) returns (GetIdentityNonceResponse) - (GRPCUnaryProtoCall *)getIdentityNonceWithMessage:(GetIdentityNonceRequest *)message responseHandler:(id)handler callOptions:(GRPCCallOptions *_Nullable)callOptions; @@ -138,10 +136,6 @@ NS_ASSUME_NONNULL_BEGIN - (GRPCUnaryProtoCall *)getDocumentsWithMessage:(GetDocumentsRequest *)message responseHandler:(id)handler callOptions:(GRPCCallOptions *_Nullable)callOptions; -#pragma mark getIdentitiesByPublicKeyHashes(GetIdentitiesByPublicKeyHashesRequest) returns (GetIdentitiesByPublicKeyHashesResponse) - -- (GRPCUnaryProtoCall *)getIdentitiesByPublicKeyHashesWithMessage:(GetIdentitiesByPublicKeyHashesRequest *)message responseHandler:(id)handler callOptions:(GRPCCallOptions *_Nullable)callOptions; - #pragma mark getIdentityByPublicKeyHash(GetIdentityByPublicKeyHashRequest) returns (GetIdentityByPublicKeyHashResponse) - (GRPCUnaryProtoCall *)getIdentityByPublicKeyHashWithMessage:(GetIdentityByPublicKeyHashRequest *)message responseHandler:(id)handler callOptions:(GRPCCallOptions *_Nullable)callOptions; @@ -192,18 +186,18 @@ NS_ASSUME_NONNULL_BEGIN - (GRPCProtoCall *)RPCTogetIdentityWithRequest:(GetIdentityRequest *)request handler:(void(^)(GetIdentityResponse *_Nullable response, NSError *_Nullable error))handler; -#pragma mark getIdentities(GetIdentitiesRequest) returns (GetIdentitiesResponse) +#pragma mark getIdentityKeys(GetIdentityKeysRequest) returns (GetIdentityKeysResponse) -- (void)getIdentitiesWithRequest:(GetIdentitiesRequest *)request handler:(void(^)(GetIdentitiesResponse *_Nullable response, NSError *_Nullable error))handler; +- (void)getIdentityKeysWithRequest:(GetIdentityKeysRequest *)request handler:(void(^)(GetIdentityKeysResponse *_Nullable response, NSError *_Nullable error))handler; -- (GRPCProtoCall *)RPCTogetIdentitiesWithRequest:(GetIdentitiesRequest *)request handler:(void(^)(GetIdentitiesResponse *_Nullable response, NSError *_Nullable error))handler; +- (GRPCProtoCall *)RPCTogetIdentityKeysWithRequest:(GetIdentityKeysRequest *)request handler:(void(^)(GetIdentityKeysResponse *_Nullable response, NSError *_Nullable error))handler; -#pragma mark getIdentityKeys(GetIdentityKeysRequest) returns (GetIdentityKeysResponse) +#pragma mark getIdentitiesContractKeys(GetIdentitiesContractKeysRequest) returns (GetIdentitiesContractKeysResponse) -- (void)getIdentityKeysWithRequest:(GetIdentityKeysRequest *)request handler:(void(^)(GetIdentityKeysResponse *_Nullable response, NSError *_Nullable error))handler; +- (void)getIdentitiesContractKeysWithRequest:(GetIdentitiesContractKeysRequest *)request handler:(void(^)(GetIdentitiesContractKeysResponse *_Nullable response, NSError *_Nullable error))handler; -- (GRPCProtoCall *)RPCTogetIdentityKeysWithRequest:(GetIdentityKeysRequest *)request handler:(void(^)(GetIdentityKeysResponse *_Nullable response, NSError *_Nullable error))handler; +- (GRPCProtoCall *)RPCTogetIdentitiesContractKeysWithRequest:(GetIdentitiesContractKeysRequest *)request handler:(void(^)(GetIdentitiesContractKeysResponse *_Nullable response, NSError *_Nullable error))handler; #pragma mark getIdentityNonce(GetIdentityNonceRequest) returns (GetIdentityNonceResponse) @@ -269,13 +263,6 @@ NS_ASSUME_NONNULL_BEGIN - (GRPCProtoCall *)RPCTogetDocumentsWithRequest:(GetDocumentsRequest *)request handler:(void(^)(GetDocumentsResponse *_Nullable response, NSError *_Nullable error))handler; -#pragma mark getIdentitiesByPublicKeyHashes(GetIdentitiesByPublicKeyHashesRequest) returns (GetIdentitiesByPublicKeyHashesResponse) - -- (void)getIdentitiesByPublicKeyHashesWithRequest:(GetIdentitiesByPublicKeyHashesRequest *)request handler:(void(^)(GetIdentitiesByPublicKeyHashesResponse *_Nullable response, NSError *_Nullable error))handler; - -- (GRPCProtoCall *)RPCTogetIdentitiesByPublicKeyHashesWithRequest:(GetIdentitiesByPublicKeyHashesRequest *)request handler:(void(^)(GetIdentitiesByPublicKeyHashesResponse *_Nullable response, NSError *_Nullable error))handler; - - #pragma mark getIdentityByPublicKeyHash(GetIdentityByPublicKeyHashRequest) returns (GetIdentityByPublicKeyHashResponse) - (void)getIdentityByPublicKeyHashWithRequest:(GetIdentityByPublicKeyHashRequest *)request handler:(void(^)(GetIdentityByPublicKeyHashResponse *_Nullable response, NSError *_Nullable error))handler; diff --git a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbrpc.m b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbrpc.m index 72f06e7631..c418ebd11d 100644 --- a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbrpc.m +++ b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbrpc.m @@ -110,44 +110,44 @@ - (GRPCUnaryProtoCall *)getIdentityWithMessage:(GetIdentityRequest *)message res responseClass:[GetIdentityResponse class]]; } -#pragma mark getIdentities(GetIdentitiesRequest) returns (GetIdentitiesResponse) +#pragma mark getIdentityKeys(GetIdentityKeysRequest) returns (GetIdentityKeysResponse) -- (void)getIdentitiesWithRequest:(GetIdentitiesRequest *)request handler:(void(^)(GetIdentitiesResponse *_Nullable response, NSError *_Nullable error))handler{ - [[self RPCTogetIdentitiesWithRequest:request handler:handler] start]; +- (void)getIdentityKeysWithRequest:(GetIdentityKeysRequest *)request handler:(void(^)(GetIdentityKeysResponse *_Nullable response, NSError *_Nullable error))handler{ + [[self RPCTogetIdentityKeysWithRequest:request handler:handler] start]; } // Returns a not-yet-started RPC object. -- (GRPCProtoCall *)RPCTogetIdentitiesWithRequest:(GetIdentitiesRequest *)request handler:(void(^)(GetIdentitiesResponse *_Nullable response, NSError *_Nullable error))handler{ - return [self RPCToMethod:@"getIdentities" +- (GRPCProtoCall *)RPCTogetIdentityKeysWithRequest:(GetIdentityKeysRequest *)request handler:(void(^)(GetIdentityKeysResponse *_Nullable response, NSError *_Nullable error))handler{ + return [self RPCToMethod:@"getIdentityKeys" requestsWriter:[GRXWriter writerWithValue:request] - responseClass:[GetIdentitiesResponse class] + responseClass:[GetIdentityKeysResponse class] responsesWriteable:[GRXWriteable writeableWithSingleHandler:handler]]; } -- (GRPCUnaryProtoCall *)getIdentitiesWithMessage:(GetIdentitiesRequest *)message responseHandler:(id)handler callOptions:(GRPCCallOptions *_Nullable)callOptions { - return [self RPCToMethod:@"getIdentities" +- (GRPCUnaryProtoCall *)getIdentityKeysWithMessage:(GetIdentityKeysRequest *)message responseHandler:(id)handler callOptions:(GRPCCallOptions *_Nullable)callOptions { + return [self RPCToMethod:@"getIdentityKeys" message:message responseHandler:handler callOptions:callOptions - responseClass:[GetIdentitiesResponse class]]; + responseClass:[GetIdentityKeysResponse class]]; } -#pragma mark getIdentityKeys(GetIdentityKeysRequest) returns (GetIdentityKeysResponse) +#pragma mark getIdentitiesContractKeys(GetIdentitiesContractKeysRequest) returns (GetIdentitiesContractKeysResponse) -- (void)getIdentityKeysWithRequest:(GetIdentityKeysRequest *)request handler:(void(^)(GetIdentityKeysResponse *_Nullable response, NSError *_Nullable error))handler{ - [[self RPCTogetIdentityKeysWithRequest:request handler:handler] start]; +- (void)getIdentitiesContractKeysWithRequest:(GetIdentitiesContractKeysRequest *)request handler:(void(^)(GetIdentitiesContractKeysResponse *_Nullable response, NSError *_Nullable error))handler{ + [[self RPCTogetIdentitiesContractKeysWithRequest:request handler:handler] start]; } // Returns a not-yet-started RPC object. -- (GRPCProtoCall *)RPCTogetIdentityKeysWithRequest:(GetIdentityKeysRequest *)request handler:(void(^)(GetIdentityKeysResponse *_Nullable response, NSError *_Nullable error))handler{ - return [self RPCToMethod:@"getIdentityKeys" +- (GRPCProtoCall *)RPCTogetIdentitiesContractKeysWithRequest:(GetIdentitiesContractKeysRequest *)request handler:(void(^)(GetIdentitiesContractKeysResponse *_Nullable response, NSError *_Nullable error))handler{ + return [self RPCToMethod:@"getIdentitiesContractKeys" requestsWriter:[GRXWriter writerWithValue:request] - responseClass:[GetIdentityKeysResponse class] + responseClass:[GetIdentitiesContractKeysResponse class] responsesWriteable:[GRXWriteable writeableWithSingleHandler:handler]]; } -- (GRPCUnaryProtoCall *)getIdentityKeysWithMessage:(GetIdentityKeysRequest *)message responseHandler:(id)handler callOptions:(GRPCCallOptions *_Nullable)callOptions { - return [self RPCToMethod:@"getIdentityKeys" +- (GRPCUnaryProtoCall *)getIdentitiesContractKeysWithMessage:(GetIdentitiesContractKeysRequest *)message responseHandler:(id)handler callOptions:(GRPCCallOptions *_Nullable)callOptions { + return [self RPCToMethod:@"getIdentitiesContractKeys" message:message responseHandler:handler callOptions:callOptions - responseClass:[GetIdentityKeysResponse class]]; + responseClass:[GetIdentitiesContractKeysResponse class]]; } #pragma mark getIdentityNonce(GetIdentityNonceRequest) returns (GetIdentityNonceResponse) @@ -330,26 +330,6 @@ - (GRPCUnaryProtoCall *)getDocumentsWithMessage:(GetDocumentsRequest *)message r responseClass:[GetDocumentsResponse class]]; } -#pragma mark getIdentitiesByPublicKeyHashes(GetIdentitiesByPublicKeyHashesRequest) returns (GetIdentitiesByPublicKeyHashesResponse) - -- (void)getIdentitiesByPublicKeyHashesWithRequest:(GetIdentitiesByPublicKeyHashesRequest *)request handler:(void(^)(GetIdentitiesByPublicKeyHashesResponse *_Nullable response, NSError *_Nullable error))handler{ - [[self RPCTogetIdentitiesByPublicKeyHashesWithRequest:request handler:handler] start]; -} -// Returns a not-yet-started RPC object. -- (GRPCProtoCall *)RPCTogetIdentitiesByPublicKeyHashesWithRequest:(GetIdentitiesByPublicKeyHashesRequest *)request handler:(void(^)(GetIdentitiesByPublicKeyHashesResponse *_Nullable response, NSError *_Nullable error))handler{ - return [self RPCToMethod:@"getIdentitiesByPublicKeyHashes" - requestsWriter:[GRXWriter writerWithValue:request] - responseClass:[GetIdentitiesByPublicKeyHashesResponse class] - responsesWriteable:[GRXWriteable writeableWithSingleHandler:handler]]; -} -- (GRPCUnaryProtoCall *)getIdentitiesByPublicKeyHashesWithMessage:(GetIdentitiesByPublicKeyHashesRequest *)message responseHandler:(id)handler callOptions:(GRPCCallOptions *_Nullable)callOptions { - return [self RPCToMethod:@"getIdentitiesByPublicKeyHashes" - message:message - responseHandler:handler - callOptions:callOptions - responseClass:[GetIdentitiesByPublicKeyHashesResponse class]]; -} - #pragma mark getIdentityByPublicKeyHash(GetIdentityByPublicKeyHashRequest) returns (GetIdentityByPublicKeyHashResponse) - (void)getIdentityByPublicKeyHashWithRequest:(GetIdentityByPublicKeyHashRequest *)request handler:(void(^)(GetIdentityByPublicKeyHashResponse *_Nullable response, NSError *_Nullable error))handler{ diff --git a/packages/dapi-grpc/clients/platform/v0/python/platform_pb2.py b/packages/dapi-grpc/clients/platform/v0/python/platform_pb2.py index b4602e02e9..700073633a 100644 --- a/packages/dapi-grpc/clients/platform/v0/python/platform_pb2.py +++ b/packages/dapi-grpc/clients/platform/v0/python/platform_pb2.py @@ -2,6 +2,7 @@ # Generated by the protocol buffer compiler. DO NOT EDIT! # source: platform.proto """Generated protocol buffer code.""" +from google.protobuf.internal import enum_type_wrapper from google.protobuf import descriptor as _descriptor from google.protobuf import message as _message from google.protobuf import reflection as _reflection @@ -22,10 +23,56 @@ syntax='proto3', serialized_options=None, create_key=_descriptor._internal_create_key, - serialized_pb=b'\n\x0eplatform.proto\x12\x19org.dash.platform.dapi.v0\x1a\x1egoogle/protobuf/wrappers.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"\x81\x01\n\x05Proof\x12\x15\n\rgrovedb_proof\x18\x01 \x01(\x0c\x12\x13\n\x0bquorum_hash\x18\x02 \x01(\x0c\x12\x11\n\tsignature\x18\x03 \x01(\x0c\x12\r\n\x05round\x18\x04 \x01(\r\x12\x15\n\rblock_id_hash\x18\x05 \x01(\x0c\x12\x13\n\x0bquorum_type\x18\x06 \x01(\r\"\x90\x01\n\x10ResponseMetadata\x12\x0e\n\x06height\x18\x01 \x01(\x04\x12 \n\x18\x63ore_chain_locked_height\x18\x02 \x01(\r\x12\r\n\x05\x65poch\x18\x03 \x01(\r\x12\x0f\n\x07time_ms\x18\x04 \x01(\x04\x12\x18\n\x10protocol_version\x18\x05 \x01(\r\x12\x10\n\x08\x63hain_id\x18\x06 \x01(\t\"L\n\x1dStateTransitionBroadcastError\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\x0f\n\x07message\x18\x02 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x03 \x01(\x0c\";\n\x1f\x42roadcastStateTransitionRequest\x12\x18\n\x10state_transition\x18\x01 \x01(\x0c\"\"\n BroadcastStateTransitionResponse\"\xa4\x01\n\x12GetIdentityRequest\x12P\n\x02v0\x18\x01 \x01(\x0b\x32\x42.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0H\x00\x1a\x31\n\x14GetIdentityRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xc1\x01\n\x17GetIdentityNonceRequest\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0H\x00\x1a?\n\x19GetIdentityNonceRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xf6\x01\n\x1fGetIdentityContractNonceRequest\x12j\n\x02v0\x18\x01 \x01(\x0b\x32\\.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0H\x00\x1a\\\n!GetIdentityContractNonceRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12\x13\n\x0b\x63ontract_id\x18\x02 \x01(\x0c\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\xc0\x01\n\x19GetIdentityBalanceRequest\x12^\n\x02v0\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0H\x00\x1a\x38\n\x1bGetIdentityBalanceRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xec\x01\n$GetIdentityBalanceAndRevisionRequest\x12t\n\x02v0\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0H\x00\x1a\x43\n&GetIdentityBalanceAndRevisionRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x9e\x02\n\x13GetIdentityResponse\x12R\n\x02v0\x18\x01 \x01(\x0b\x32\x44.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0H\x00\x1a\xa7\x01\n\x15GetIdentityResponseV0\x12\x12\n\x08identity\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xad\x01\n\x14GetIdentitiesRequest\x12T\n\x02v0\x18\x01 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0H\x00\x1a\x34\n\x16GetIdentitiesRequestV0\x12\x0b\n\x03ids\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xda\x04\n\x15GetIdentitiesResponse\x12V\n\x02v0\x18\x01 \x01(\x0b\x32H.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0H\x00\x1a\x1e\n\rIdentityValue\x12\r\n\x05value\x18\x01 \x01(\x0c\x1ak\n\rIdentityEntry\x12\x0b\n\x03key\x18\x01 \x01(\x0c\x12M\n\x05value\x18\x02 \x01(\x0b\x32>.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue\x1a\x66\n\nIdentities\x12X\n\x10identity_entries\x18\x01 \x03(\x0b\x32>.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry\x1a\xe8\x01\n\x17GetIdentitiesResponseV0\x12Q\n\nidentities\x18\x01 \x01(\x0b\x32;.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentitiesH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb8\x02\n\x18GetIdentityNonceResponse\x12\\\n\x02v0\x18\x01 \x01(\x0b\x32N.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0H\x00\x1a\xb2\x01\n\x1aGetIdentityNonceResponseV0\x12\x18\n\x0eidentity_nonce\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xe1\x02\n GetIdentityContractNonceResponse\x12l\n\x02v0\x18\x01 \x01(\x0b\x32^.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0H\x00\x1a\xc3\x01\n\"GetIdentityContractNonceResponseV0\x12!\n\x17identity_contract_nonce\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb9\x02\n\x1aGetIdentityBalanceResponse\x12`\n\x02v0\x18\x01 \x01(\x0b\x32R.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0H\x00\x1a\xad\x01\n\x1cGetIdentityBalanceResponseV0\x12\x11\n\x07\x62\x61lance\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xa9\x04\n%GetIdentityBalanceAndRevisionResponse\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0H\x00\x1a\xfc\x02\n\'GetIdentityBalanceAndRevisionResponseV0\x12\x9b\x01\n\x14\x62\x61lance_and_revision\x18\x01 \x01(\x0b\x32{.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevisionH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x37\n\x12\x42\x61lanceAndRevision\x12\x0f\n\x07\x62\x61lance\x18\x01 \x01(\x04\x12\x10\n\x08revision\x18\x02 \x01(\x04\x42\x08\n\x06resultB\t\n\x07version\"\xd1\x01\n\x0eKeyRequestType\x12\x36\n\x08\x61ll_keys\x18\x01 \x01(\x0b\x32\".org.dash.platform.dapi.v0.AllKeysH\x00\x12@\n\rspecific_keys\x18\x02 \x01(\x0b\x32\'.org.dash.platform.dapi.v0.SpecificKeysH\x00\x12:\n\nsearch_key\x18\x03 \x01(\x0b\x32$.org.dash.platform.dapi.v0.SearchKeyH\x00\x42\t\n\x07request\"\t\n\x07\x41llKeys\"\x1f\n\x0cSpecificKeys\x12\x0f\n\x07key_ids\x18\x01 \x03(\r\"\xb6\x01\n\tSearchKey\x12I\n\x0bpurpose_map\x18\x01 \x03(\x0b\x32\x34.org.dash.platform.dapi.v0.SearchKey.PurposeMapEntry\x1a^\n\x0fPurposeMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12:\n\x05value\x18\x02 \x01(\x0b\x32+.org.dash.platform.dapi.v0.SecurityLevelMap:\x02\x38\x01\"\xbf\x02\n\x10SecurityLevelMap\x12]\n\x12security_level_map\x18\x01 \x03(\x0b\x32\x41.org.dash.platform.dapi.v0.SecurityLevelMap.SecurityLevelMapEntry\x1aw\n\x15SecurityLevelMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12M\n\x05value\x18\x02 \x01(\x0e\x32>.org.dash.platform.dapi.v0.SecurityLevelMap.KeyKindRequestType:\x02\x38\x01\"S\n\x12KeyKindRequestType\x12\x1f\n\x1b\x43URRENT_KEY_OF_KIND_REQUEST\x10\x00\x12\x1c\n\x18\x41LL_KEYS_OF_KIND_REQUEST\x10\x01\"\xda\x02\n\x16GetIdentityKeysRequest\x12X\n\x02v0\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0H\x00\x1a\xda\x01\n\x18GetIdentityKeysRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12?\n\x0crequest_type\x18\x02 \x01(\x0b\x32).org.dash.platform.dapi.v0.KeyRequestType\x12+\n\x05limit\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12,\n\x06offset\x18\x04 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\t\n\x07version\"\x99\x03\n\x17GetIdentityKeysResponse\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0H\x00\x1a\x96\x02\n\x19GetIdentityKeysResponseV0\x12\x61\n\x04keys\x18\x01 \x01(\x0b\x32Q.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.KeysH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x1a\n\x04Keys\x12\x12\n\nkeys_bytes\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version\"\xa1\x06\n\x10GetProofsRequest\x12L\n\x02v0\x18\x01 \x01(\x0b\x32>.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0H\x00\x1a\xb3\x05\n\x12GetProofsRequestV0\x12\x62\n\nidentities\x18\x01 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest\x12\x61\n\tcontracts\x18\x02 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest\x12\x61\n\tdocuments\x18\x03 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest\x1aw\n\x0f\x44ocumentRequest\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x15\n\rdocument_type\x18\x02 \x01(\t\x12#\n\x1b\x64ocument_type_keeps_history\x18\x03 \x01(\x08\x12\x13\n\x0b\x64ocument_id\x18\x04 \x01(\x0c\x1a\xd1\x01\n\x0fIdentityRequest\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12i\n\x0crequest_type\x18\x02 \x01(\x0e\x32S.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type\">\n\x04Type\x12\x11\n\rFULL_IDENTITY\x10\x00\x12\x0b\n\x07\x42\x41LANCE\x10\x01\x12\x08\n\x04KEYS\x10\x02\x12\x0c\n\x08REVISION\x10\x03\x1a&\n\x0f\x43ontractRequest\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x42\t\n\x07version\"\x82\x02\n\x11GetProofsResponse\x12N\n\x02v0\x18\x01 \x01(\x0b\x32@.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0H\x00\x1a\x91\x01\n\x13GetProofsResponseV0\x12\x31\n\x05proof\x18\x01 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x02 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb4\x01\n\x16GetDataContractRequest\x12X\n\x02v0\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0H\x00\x1a\x35\n\x18GetDataContractRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xb3\x02\n\x17GetDataContractResponse\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0H\x00\x1a\xb0\x01\n\x19GetDataContractResponseV0\x12\x17\n\rdata_contract\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb9\x01\n\x17GetDataContractsRequest\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0H\x00\x1a\x37\n\x19GetDataContractsRequestV0\x12\x0b\n\x03ids\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xcf\x04\n\x18GetDataContractsResponse\x12\\\n\x02v0\x18\x01 \x01(\x0b\x32N.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0H\x00\x1a[\n\x11\x44\x61taContractEntry\x12\x12\n\nidentifier\x18\x01 \x01(\x0c\x12\x32\n\rdata_contract\x18\x02 \x01(\x0b\x32\x1b.google.protobuf.BytesValue\x1au\n\rDataContracts\x12\x64\n\x15\x64\x61ta_contract_entries\x18\x01 \x03(\x0b\x32\x45.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry\x1a\xf5\x01\n\x1aGetDataContractsResponseV0\x12[\n\x0e\x64\x61ta_contracts\x18\x01 \x01(\x0b\x32\x41.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xc1\x02\n\x1dGetDataContractHistoryRequest\x12\x66\n\x02v0\x18\x01 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0H\x00\x1a\xac\x01\n\x1fGetDataContractHistoryRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12+\n\x05limit\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12,\n\x06offset\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\x13\n\x0bstart_at_ms\x18\x04 \x01(\x04\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\t\n\x07version\"\xae\x05\n\x1eGetDataContractHistoryResponse\x12h\n\x02v0\x18\x01 \x01(\x0b\x32Z.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0H\x00\x1a\x96\x04\n GetDataContractHistoryResponseV0\x12\x8f\x01\n\x15\x64\x61ta_contract_history\x18\x01 \x01(\x0b\x32n.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x37\n\x18\x44\x61taContractHistoryEntry\x12\x0c\n\x04\x64\x61te\x18\x01 \x01(\x04\x12\r\n\x05value\x18\x02 \x01(\x0c\x1a\xaa\x01\n\x13\x44\x61taContractHistory\x12\x92\x01\n\x15\x64\x61ta_contract_entries\x18\x01 \x03(\x0b\x32s.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntryB\x08\n\x06resultB\t\n\x07version\"\xb2\x02\n\x13GetDocumentsRequest\x12R\n\x02v0\x18\x01 \x01(\x0b\x32\x44.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0H\x00\x1a\xbb\x01\n\x15GetDocumentsRequestV0\x12\x18\n\x10\x64\x61ta_contract_id\x18\x01 \x01(\x0c\x12\x15\n\rdocument_type\x18\x02 \x01(\t\x12\r\n\x05where\x18\x03 \x01(\x0c\x12\x10\n\x08order_by\x18\x04 \x01(\x0c\x12\r\n\x05limit\x18\x05 \x01(\r\x12\x15\n\x0bstart_after\x18\x06 \x01(\x0cH\x00\x12\x12\n\x08start_at\x18\x07 \x01(\x0cH\x00\x12\r\n\x05prove\x18\x08 \x01(\x08\x42\x07\n\x05startB\t\n\x07version\"\x95\x03\n\x14GetDocumentsResponse\x12T\n\x02v0\x18\x01 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0H\x00\x1a\x9b\x02\n\x16GetDocumentsResponseV0\x12\x65\n\tdocuments\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.DocumentsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x1e\n\tDocuments\x12\x11\n\tdocuments\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version\"\xff\x01\n%GetIdentitiesByPublicKeyHashesRequest\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0H\x00\x1aS\n\'GetIdentitiesByPublicKeyHashesRequestV0\x12\x19\n\x11public_key_hashes\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xc6\x05\n&GetIdentitiesByPublicKeyHashesResponse\x12x\n\x02v0\x18\x01 \x01(\x0b\x32j.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0H\x00\x1a\x61\n\x1aPublicKeyHashIdentityEntry\x12\x17\n\x0fpublic_key_hash\x18\x01 \x01(\x0c\x12*\n\x05value\x18\x02 \x01(\x0b\x32\x1b.google.protobuf.BytesValue\x1a\x95\x01\n\x1bIdentitiesByPublicKeyHashes\x12v\n\x10identity_entries\x18\x01 \x03(\x0b\x32\\.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry\x1a\x9b\x02\n(GetIdentitiesByPublicKeyHashesResponseV0\x12s\n\nidentities\x18\x01 \x01(\x0b\x32].org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashesH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xed\x01\n!GetIdentityByPublicKeyHashRequest\x12n\n\x02v0\x18\x01 \x01(\x0b\x32`.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0H\x00\x1aM\n#GetIdentityByPublicKeyHashRequestV0\x12\x17\n\x0fpublic_key_hash\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xda\x02\n\"GetIdentityByPublicKeyHashResponse\x12p\n\x02v0\x18\x01 \x01(\x0b\x32\x62.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0H\x00\x1a\xb6\x01\n$GetIdentityByPublicKeyHashResponseV0\x12\x12\n\x08identity\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xfb\x01\n#WaitForStateTransitionResultRequest\x12r\n\x02v0\x18\x01 \x01(\x0b\x32\x64.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0H\x00\x1aU\n%WaitForStateTransitionResultRequestV0\x12\x1d\n\x15state_transition_hash\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x99\x03\n$WaitForStateTransitionResultResponse\x12t\n\x02v0\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0H\x00\x1a\xef\x01\n&WaitForStateTransitionResultResponseV0\x12I\n\x05\x65rror\x18\x01 \x01(\x0b\x32\x38.org.dash.platform.dapi.v0.StateTransitionBroadcastErrorH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xc4\x01\n\x19GetConsensusParamsRequest\x12^\n\x02v0\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0H\x00\x1a<\n\x1bGetConsensusParamsRequestV0\x12\x0e\n\x06height\x18\x01 \x01(\x05\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x9c\x04\n\x1aGetConsensusParamsResponse\x12`\n\x02v0\x18\x01 \x01(\x0b\x32R.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0H\x00\x1aP\n\x14\x43onsensusParamsBlock\x12\x11\n\tmax_bytes\x18\x01 \x01(\t\x12\x0f\n\x07max_gas\x18\x02 \x01(\t\x12\x14\n\x0ctime_iota_ms\x18\x03 \x01(\t\x1a\x62\n\x17\x43onsensusParamsEvidence\x12\x1a\n\x12max_age_num_blocks\x18\x01 \x01(\t\x12\x18\n\x10max_age_duration\x18\x02 \x01(\t\x12\x11\n\tmax_bytes\x18\x03 \x01(\t\x1a\xda\x01\n\x1cGetConsensusParamsResponseV0\x12Y\n\x05\x62lock\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock\x12_\n\x08\x65vidence\x18\x02 \x01(\x0b\x32M.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidenceB\t\n\x07version\"\xe4\x01\n%GetProtocolVersionUpgradeStateRequest\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0H\x00\x1a\x38\n\'GetProtocolVersionUpgradeStateRequestV0\x12\r\n\x05prove\x18\x01 \x01(\x08\x42\t\n\x07version\"\xb5\x05\n&GetProtocolVersionUpgradeStateResponse\x12x\n\x02v0\x18\x01 \x01(\x0b\x32j.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0H\x00\x1a\x85\x04\n(GetProtocolVersionUpgradeStateResponseV0\x12\x87\x01\n\x08versions\x18\x01 \x01(\x0b\x32s.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x96\x01\n\x08Versions\x12\x89\x01\n\x08versions\x18\x01 \x03(\x0b\x32w.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry\x1a:\n\x0cVersionEntry\x12\x16\n\x0eversion_number\x18\x01 \x01(\r\x12\x12\n\nvote_count\x18\x02 \x01(\rB\x08\n\x06resultB\t\n\x07version\"\xa3\x02\n*GetProtocolVersionUpgradeVoteStatusRequest\x12\x80\x01\n\x02v0\x18\x01 \x01(\x0b\x32r.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0H\x00\x1ag\n,GetProtocolVersionUpgradeVoteStatusRequestV0\x12\x19\n\x11start_pro_tx_hash\x18\x01 \x01(\x0c\x12\r\n\x05\x63ount\x18\x02 \x01(\r\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\xef\x05\n+GetProtocolVersionUpgradeVoteStatusResponse\x12\x82\x01\n\x02v0\x18\x01 \x01(\x0b\x32t.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0H\x00\x1a\xaf\x04\n-GetProtocolVersionUpgradeVoteStatusResponseV0\x12\x98\x01\n\x08versions\x18\x01 \x01(\x0b\x32\x83\x01.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignalsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\xaf\x01\n\x0eVersionSignals\x12\x9c\x01\n\x0fversion_signals\x18\x01 \x03(\x0b\x32\x82\x01.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal\x1a\x35\n\rVersionSignal\x12\x13\n\x0bpro_tx_hash\x18\x01 \x01(\x0c\x12\x0f\n\x07version\x18\x02 \x01(\rB\x08\n\x06resultB\t\n\x07version\"\xf5\x01\n\x14GetEpochsInfoRequest\x12T\n\x02v0\x18\x01 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0H\x00\x1a|\n\x16GetEpochsInfoRequestV0\x12\x31\n\x0bstart_epoch\x18\x01 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\r\n\x05\x63ount\x18\x02 \x01(\r\x12\x11\n\tascending\x18\x03 \x01(\x08\x12\r\n\x05prove\x18\x04 \x01(\x08\x42\t\n\x07version\"\x91\x05\n\x15GetEpochsInfoResponse\x12V\n\x02v0\x18\x01 \x01(\x0b\x32H.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0H\x00\x1a\x94\x04\n\x17GetEpochsInfoResponseV0\x12\x65\n\x06\x65pochs\x18\x01 \x01(\x0b\x32S.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfosH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1au\n\nEpochInfos\x12g\n\x0b\x65poch_infos\x18\x01 \x03(\x0b\x32R.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo\x1a\x9e\x01\n\tEpochInfo\x12\x0e\n\x06number\x18\x01 \x01(\r\x12\x1a\n\x12\x66irst_block_height\x18\x02 \x01(\x04\x12\x1f\n\x17\x66irst_core_block_height\x18\x03 \x01(\r\x12\x12\n\nstart_time\x18\x04 \x01(\x04\x12\x16\n\x0e\x66\x65\x65_multiplier\x18\x05 \x01(\x01\x12\x18\n\x10protocol_version\x18\x06 \x01(\rB\x08\n\x06resultB\t\n\x07version\"\xc4\x01\n\x16GetPathElementsRequest\x12X\n\x02v0\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0H\x00\x1a\x45\n\x18GetPathElementsRequestV0\x12\x0c\n\x04path\x18\x01 \x03(\x0c\x12\x0c\n\x04keys\x18\x02 \x03(\x0c\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\xa3\x03\n\x17GetPathElementsResponse\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0H\x00\x1a\xa0\x02\n\x19GetPathElementsResponseV0\x12i\n\x08\x65lements\x18\x01 \x01(\x0b\x32U.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.ElementsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x1c\n\x08\x45lements\x12\x10\n\x08\x65lements\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version2\xcf\x16\n\x08Platform\x12\x93\x01\n\x18\x62roadcastStateTransition\x12:.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest\x1a;.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse\x12l\n\x0bgetIdentity\x12-.org.dash.platform.dapi.v0.GetIdentityRequest\x1a..org.dash.platform.dapi.v0.GetIdentityResponse\x12r\n\rgetIdentities\x12/.org.dash.platform.dapi.v0.GetIdentitiesRequest\x1a\x30.org.dash.platform.dapi.v0.GetIdentitiesResponse\x12x\n\x0fgetIdentityKeys\x12\x31.org.dash.platform.dapi.v0.GetIdentityKeysRequest\x1a\x32.org.dash.platform.dapi.v0.GetIdentityKeysResponse\x12{\n\x10getIdentityNonce\x12\x32.org.dash.platform.dapi.v0.GetIdentityNonceRequest\x1a\x33.org.dash.platform.dapi.v0.GetIdentityNonceResponse\x12\x93\x01\n\x18getIdentityContractNonce\x12:.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest\x1a;.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse\x12\x81\x01\n\x12getIdentityBalance\x12\x34.org.dash.platform.dapi.v0.GetIdentityBalanceRequest\x1a\x35.org.dash.platform.dapi.v0.GetIdentityBalanceResponse\x12\xa2\x01\n\x1dgetIdentityBalanceAndRevision\x12?.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest\x1a@.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse\x12\x66\n\tgetProofs\x12+.org.dash.platform.dapi.v0.GetProofsRequest\x1a,.org.dash.platform.dapi.v0.GetProofsResponse\x12x\n\x0fgetDataContract\x12\x31.org.dash.platform.dapi.v0.GetDataContractRequest\x1a\x32.org.dash.platform.dapi.v0.GetDataContractResponse\x12\x8d\x01\n\x16getDataContractHistory\x12\x38.org.dash.platform.dapi.v0.GetDataContractHistoryRequest\x1a\x39.org.dash.platform.dapi.v0.GetDataContractHistoryResponse\x12{\n\x10getDataContracts\x12\x32.org.dash.platform.dapi.v0.GetDataContractsRequest\x1a\x33.org.dash.platform.dapi.v0.GetDataContractsResponse\x12o\n\x0cgetDocuments\x12..org.dash.platform.dapi.v0.GetDocumentsRequest\x1a/.org.dash.platform.dapi.v0.GetDocumentsResponse\x12\xa5\x01\n\x1egetIdentitiesByPublicKeyHashes\x12@.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest\x1a\x41.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse\x12\x99\x01\n\x1agetIdentityByPublicKeyHash\x12<.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest\x1a=.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse\x12\x9f\x01\n\x1cwaitForStateTransitionResult\x12>.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest\x1a?.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse\x12\x81\x01\n\x12getConsensusParams\x12\x34.org.dash.platform.dapi.v0.GetConsensusParamsRequest\x1a\x35.org.dash.platform.dapi.v0.GetConsensusParamsResponse\x12\xa5\x01\n\x1egetProtocolVersionUpgradeState\x12@.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest\x1a\x41.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse\x12\xb4\x01\n#getProtocolVersionUpgradeVoteStatus\x12\x45.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest\x1a\x46.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse\x12r\n\rgetEpochsInfo\x12/.org.dash.platform.dapi.v0.GetEpochsInfoRequest\x1a\x30.org.dash.platform.dapi.v0.GetEpochsInfoResponse\x12x\n\x0fgetPathElements\x12\x31.org.dash.platform.dapi.v0.GetPathElementsRequest\x1a\x32.org.dash.platform.dapi.v0.GetPathElementsResponseb\x06proto3' + serialized_pb=b'\n\x0eplatform.proto\x12\x19org.dash.platform.dapi.v0\x1a\x1egoogle/protobuf/wrappers.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"\x81\x01\n\x05Proof\x12\x15\n\rgrovedb_proof\x18\x01 \x01(\x0c\x12\x13\n\x0bquorum_hash\x18\x02 \x01(\x0c\x12\x11\n\tsignature\x18\x03 \x01(\x0c\x12\r\n\x05round\x18\x04 \x01(\r\x12\x15\n\rblock_id_hash\x18\x05 \x01(\x0c\x12\x13\n\x0bquorum_type\x18\x06 \x01(\r\"\x90\x01\n\x10ResponseMetadata\x12\x0e\n\x06height\x18\x01 \x01(\x04\x12 \n\x18\x63ore_chain_locked_height\x18\x02 \x01(\r\x12\r\n\x05\x65poch\x18\x03 \x01(\r\x12\x0f\n\x07time_ms\x18\x04 \x01(\x04\x12\x18\n\x10protocol_version\x18\x05 \x01(\r\x12\x10\n\x08\x63hain_id\x18\x06 \x01(\t\"L\n\x1dStateTransitionBroadcastError\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\x0f\n\x07message\x18\x02 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x03 \x01(\x0c\";\n\x1f\x42roadcastStateTransitionRequest\x12\x18\n\x10state_transition\x18\x01 \x01(\x0c\"\"\n BroadcastStateTransitionResponse\"\xa4\x01\n\x12GetIdentityRequest\x12P\n\x02v0\x18\x01 \x01(\x0b\x32\x42.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0H\x00\x1a\x31\n\x14GetIdentityRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xc1\x01\n\x17GetIdentityNonceRequest\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0H\x00\x1a?\n\x19GetIdentityNonceRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xf6\x01\n\x1fGetIdentityContractNonceRequest\x12j\n\x02v0\x18\x01 \x01(\x0b\x32\\.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0H\x00\x1a\\\n!GetIdentityContractNonceRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12\x13\n\x0b\x63ontract_id\x18\x02 \x01(\x0c\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\xc0\x01\n\x19GetIdentityBalanceRequest\x12^\n\x02v0\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0H\x00\x1a\x38\n\x1bGetIdentityBalanceRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xec\x01\n$GetIdentityBalanceAndRevisionRequest\x12t\n\x02v0\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0H\x00\x1a\x43\n&GetIdentityBalanceAndRevisionRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x9e\x02\n\x13GetIdentityResponse\x12R\n\x02v0\x18\x01 \x01(\x0b\x32\x44.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0H\x00\x1a\xa7\x01\n\x15GetIdentityResponseV0\x12\x12\n\x08identity\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb8\x02\n\x18GetIdentityNonceResponse\x12\\\n\x02v0\x18\x01 \x01(\x0b\x32N.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0H\x00\x1a\xb2\x01\n\x1aGetIdentityNonceResponseV0\x12\x18\n\x0eidentity_nonce\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xe1\x02\n GetIdentityContractNonceResponse\x12l\n\x02v0\x18\x01 \x01(\x0b\x32^.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0H\x00\x1a\xc3\x01\n\"GetIdentityContractNonceResponseV0\x12!\n\x17identity_contract_nonce\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb9\x02\n\x1aGetIdentityBalanceResponse\x12`\n\x02v0\x18\x01 \x01(\x0b\x32R.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0H\x00\x1a\xad\x01\n\x1cGetIdentityBalanceResponseV0\x12\x11\n\x07\x62\x61lance\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xa9\x04\n%GetIdentityBalanceAndRevisionResponse\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0H\x00\x1a\xfc\x02\n\'GetIdentityBalanceAndRevisionResponseV0\x12\x9b\x01\n\x14\x62\x61lance_and_revision\x18\x01 \x01(\x0b\x32{.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevisionH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x37\n\x12\x42\x61lanceAndRevision\x12\x0f\n\x07\x62\x61lance\x18\x01 \x01(\x04\x12\x10\n\x08revision\x18\x02 \x01(\x04\x42\x08\n\x06resultB\t\n\x07version\"\xd1\x01\n\x0eKeyRequestType\x12\x36\n\x08\x61ll_keys\x18\x01 \x01(\x0b\x32\".org.dash.platform.dapi.v0.AllKeysH\x00\x12@\n\rspecific_keys\x18\x02 \x01(\x0b\x32\'.org.dash.platform.dapi.v0.SpecificKeysH\x00\x12:\n\nsearch_key\x18\x03 \x01(\x0b\x32$.org.dash.platform.dapi.v0.SearchKeyH\x00\x42\t\n\x07request\"\t\n\x07\x41llKeys\"\x1f\n\x0cSpecificKeys\x12\x0f\n\x07key_ids\x18\x01 \x03(\r\"\xb6\x01\n\tSearchKey\x12I\n\x0bpurpose_map\x18\x01 \x03(\x0b\x32\x34.org.dash.platform.dapi.v0.SearchKey.PurposeMapEntry\x1a^\n\x0fPurposeMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12:\n\x05value\x18\x02 \x01(\x0b\x32+.org.dash.platform.dapi.v0.SecurityLevelMap:\x02\x38\x01\"\xbf\x02\n\x10SecurityLevelMap\x12]\n\x12security_level_map\x18\x01 \x03(\x0b\x32\x41.org.dash.platform.dapi.v0.SecurityLevelMap.SecurityLevelMapEntry\x1aw\n\x15SecurityLevelMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12M\n\x05value\x18\x02 \x01(\x0e\x32>.org.dash.platform.dapi.v0.SecurityLevelMap.KeyKindRequestType:\x02\x38\x01\"S\n\x12KeyKindRequestType\x12\x1f\n\x1b\x43URRENT_KEY_OF_KIND_REQUEST\x10\x00\x12\x1c\n\x18\x41LL_KEYS_OF_KIND_REQUEST\x10\x01\"\xda\x02\n\x16GetIdentityKeysRequest\x12X\n\x02v0\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0H\x00\x1a\xda\x01\n\x18GetIdentityKeysRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12?\n\x0crequest_type\x18\x02 \x01(\x0b\x32).org.dash.platform.dapi.v0.KeyRequestType\x12+\n\x05limit\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12,\n\x06offset\x18\x04 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\t\n\x07version\"\x99\x03\n\x17GetIdentityKeysResponse\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0H\x00\x1a\x96\x02\n\x19GetIdentityKeysResponseV0\x12\x61\n\x04keys\x18\x01 \x01(\x0b\x32Q.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.KeysH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x1a\n\x04Keys\x12\x12\n\nkeys_bytes\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version\"\xef\x02\n GetIdentitiesContractKeysRequest\x12l\n\x02v0\x18\x01 \x01(\x0b\x32^.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0H\x00\x1a\xd1\x01\n\"GetIdentitiesContractKeysRequestV0\x12\x16\n\x0eidentities_ids\x18\x01 \x03(\x0c\x12\x13\n\x0b\x63ontract_id\x18\x02 \x01(\x0c\x12\x1f\n\x12\x64ocument_type_name\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x37\n\x08purposes\x18\x04 \x03(\x0e\x32%.org.dash.platform.dapi.v0.KeyPurpose\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\x15\n\x13_document_type_nameB\t\n\x07version\"\xdf\x06\n!GetIdentitiesContractKeysResponse\x12n\n\x02v0\x18\x01 \x01(\x0b\x32`.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0H\x00\x1a\xbe\x05\n#GetIdentitiesContractKeysResponseV0\x12\x8a\x01\n\x0fidentities_keys\x18\x01 \x01(\x0b\x32o.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeysH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1aY\n\x0bPurposeKeys\x12\x36\n\x07purpose\x18\x01 \x01(\x0e\x32%.org.dash.platform.dapi.v0.KeyPurpose\x12\x12\n\nkeys_bytes\x18\x02 \x03(\x0c\x1a\x9f\x01\n\x0cIdentityKeys\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12z\n\x04keys\x18\x02 \x03(\x0b\x32l.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys\x1a\x90\x01\n\x0eIdentitiesKeys\x12~\n\x07\x65ntries\x18\x01 \x03(\x0b\x32m.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeysB\x08\n\x06resultB\t\n\x07version\"\xa1\x06\n\x10GetProofsRequest\x12L\n\x02v0\x18\x01 \x01(\x0b\x32>.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0H\x00\x1a\xb3\x05\n\x12GetProofsRequestV0\x12\x62\n\nidentities\x18\x01 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest\x12\x61\n\tcontracts\x18\x02 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest\x12\x61\n\tdocuments\x18\x03 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest\x1aw\n\x0f\x44ocumentRequest\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x15\n\rdocument_type\x18\x02 \x01(\t\x12#\n\x1b\x64ocument_type_keeps_history\x18\x03 \x01(\x08\x12\x13\n\x0b\x64ocument_id\x18\x04 \x01(\x0c\x1a\xd1\x01\n\x0fIdentityRequest\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12i\n\x0crequest_type\x18\x02 \x01(\x0e\x32S.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type\">\n\x04Type\x12\x11\n\rFULL_IDENTITY\x10\x00\x12\x0b\n\x07\x42\x41LANCE\x10\x01\x12\x08\n\x04KEYS\x10\x02\x12\x0c\n\x08REVISION\x10\x03\x1a&\n\x0f\x43ontractRequest\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x42\t\n\x07version\"\x82\x02\n\x11GetProofsResponse\x12N\n\x02v0\x18\x01 \x01(\x0b\x32@.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0H\x00\x1a\x91\x01\n\x13GetProofsResponseV0\x12\x31\n\x05proof\x18\x01 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x02 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb4\x01\n\x16GetDataContractRequest\x12X\n\x02v0\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0H\x00\x1a\x35\n\x18GetDataContractRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xb3\x02\n\x17GetDataContractResponse\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0H\x00\x1a\xb0\x01\n\x19GetDataContractResponseV0\x12\x17\n\rdata_contract\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb9\x01\n\x17GetDataContractsRequest\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0H\x00\x1a\x37\n\x19GetDataContractsRequestV0\x12\x0b\n\x03ids\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xcf\x04\n\x18GetDataContractsResponse\x12\\\n\x02v0\x18\x01 \x01(\x0b\x32N.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0H\x00\x1a[\n\x11\x44\x61taContractEntry\x12\x12\n\nidentifier\x18\x01 \x01(\x0c\x12\x32\n\rdata_contract\x18\x02 \x01(\x0b\x32\x1b.google.protobuf.BytesValue\x1au\n\rDataContracts\x12\x64\n\x15\x64\x61ta_contract_entries\x18\x01 \x03(\x0b\x32\x45.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry\x1a\xf5\x01\n\x1aGetDataContractsResponseV0\x12[\n\x0e\x64\x61ta_contracts\x18\x01 \x01(\x0b\x32\x41.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xc1\x02\n\x1dGetDataContractHistoryRequest\x12\x66\n\x02v0\x18\x01 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0H\x00\x1a\xac\x01\n\x1fGetDataContractHistoryRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12+\n\x05limit\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12,\n\x06offset\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\x13\n\x0bstart_at_ms\x18\x04 \x01(\x04\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\t\n\x07version\"\xae\x05\n\x1eGetDataContractHistoryResponse\x12h\n\x02v0\x18\x01 \x01(\x0b\x32Z.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0H\x00\x1a\x96\x04\n GetDataContractHistoryResponseV0\x12\x8f\x01\n\x15\x64\x61ta_contract_history\x18\x01 \x01(\x0b\x32n.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x37\n\x18\x44\x61taContractHistoryEntry\x12\x0c\n\x04\x64\x61te\x18\x01 \x01(\x04\x12\r\n\x05value\x18\x02 \x01(\x0c\x1a\xaa\x01\n\x13\x44\x61taContractHistory\x12\x92\x01\n\x15\x64\x61ta_contract_entries\x18\x01 \x03(\x0b\x32s.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntryB\x08\n\x06resultB\t\n\x07version\"\xb2\x02\n\x13GetDocumentsRequest\x12R\n\x02v0\x18\x01 \x01(\x0b\x32\x44.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0H\x00\x1a\xbb\x01\n\x15GetDocumentsRequestV0\x12\x18\n\x10\x64\x61ta_contract_id\x18\x01 \x01(\x0c\x12\x15\n\rdocument_type\x18\x02 \x01(\t\x12\r\n\x05where\x18\x03 \x01(\x0c\x12\x10\n\x08order_by\x18\x04 \x01(\x0c\x12\r\n\x05limit\x18\x05 \x01(\r\x12\x15\n\x0bstart_after\x18\x06 \x01(\x0cH\x00\x12\x12\n\x08start_at\x18\x07 \x01(\x0cH\x00\x12\r\n\x05prove\x18\x08 \x01(\x08\x42\x07\n\x05startB\t\n\x07version\"\x95\x03\n\x14GetDocumentsResponse\x12T\n\x02v0\x18\x01 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0H\x00\x1a\x9b\x02\n\x16GetDocumentsResponseV0\x12\x65\n\tdocuments\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.DocumentsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x1e\n\tDocuments\x12\x11\n\tdocuments\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version\"\xed\x01\n!GetIdentityByPublicKeyHashRequest\x12n\n\x02v0\x18\x01 \x01(\x0b\x32`.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0H\x00\x1aM\n#GetIdentityByPublicKeyHashRequestV0\x12\x17\n\x0fpublic_key_hash\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xda\x02\n\"GetIdentityByPublicKeyHashResponse\x12p\n\x02v0\x18\x01 \x01(\x0b\x32\x62.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0H\x00\x1a\xb6\x01\n$GetIdentityByPublicKeyHashResponseV0\x12\x12\n\x08identity\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xfb\x01\n#WaitForStateTransitionResultRequest\x12r\n\x02v0\x18\x01 \x01(\x0b\x32\x64.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0H\x00\x1aU\n%WaitForStateTransitionResultRequestV0\x12\x1d\n\x15state_transition_hash\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x99\x03\n$WaitForStateTransitionResultResponse\x12t\n\x02v0\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0H\x00\x1a\xef\x01\n&WaitForStateTransitionResultResponseV0\x12I\n\x05\x65rror\x18\x01 \x01(\x0b\x32\x38.org.dash.platform.dapi.v0.StateTransitionBroadcastErrorH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xc4\x01\n\x19GetConsensusParamsRequest\x12^\n\x02v0\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0H\x00\x1a<\n\x1bGetConsensusParamsRequestV0\x12\x0e\n\x06height\x18\x01 \x01(\x05\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x9c\x04\n\x1aGetConsensusParamsResponse\x12`\n\x02v0\x18\x01 \x01(\x0b\x32R.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0H\x00\x1aP\n\x14\x43onsensusParamsBlock\x12\x11\n\tmax_bytes\x18\x01 \x01(\t\x12\x0f\n\x07max_gas\x18\x02 \x01(\t\x12\x14\n\x0ctime_iota_ms\x18\x03 \x01(\t\x1a\x62\n\x17\x43onsensusParamsEvidence\x12\x1a\n\x12max_age_num_blocks\x18\x01 \x01(\t\x12\x18\n\x10max_age_duration\x18\x02 \x01(\t\x12\x11\n\tmax_bytes\x18\x03 \x01(\t\x1a\xda\x01\n\x1cGetConsensusParamsResponseV0\x12Y\n\x05\x62lock\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock\x12_\n\x08\x65vidence\x18\x02 \x01(\x0b\x32M.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidenceB\t\n\x07version\"\xe4\x01\n%GetProtocolVersionUpgradeStateRequest\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0H\x00\x1a\x38\n\'GetProtocolVersionUpgradeStateRequestV0\x12\r\n\x05prove\x18\x01 \x01(\x08\x42\t\n\x07version\"\xb5\x05\n&GetProtocolVersionUpgradeStateResponse\x12x\n\x02v0\x18\x01 \x01(\x0b\x32j.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0H\x00\x1a\x85\x04\n(GetProtocolVersionUpgradeStateResponseV0\x12\x87\x01\n\x08versions\x18\x01 \x01(\x0b\x32s.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x96\x01\n\x08Versions\x12\x89\x01\n\x08versions\x18\x01 \x03(\x0b\x32w.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry\x1a:\n\x0cVersionEntry\x12\x16\n\x0eversion_number\x18\x01 \x01(\r\x12\x12\n\nvote_count\x18\x02 \x01(\rB\x08\n\x06resultB\t\n\x07version\"\xa3\x02\n*GetProtocolVersionUpgradeVoteStatusRequest\x12\x80\x01\n\x02v0\x18\x01 \x01(\x0b\x32r.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0H\x00\x1ag\n,GetProtocolVersionUpgradeVoteStatusRequestV0\x12\x19\n\x11start_pro_tx_hash\x18\x01 \x01(\x0c\x12\r\n\x05\x63ount\x18\x02 \x01(\r\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\xef\x05\n+GetProtocolVersionUpgradeVoteStatusResponse\x12\x82\x01\n\x02v0\x18\x01 \x01(\x0b\x32t.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0H\x00\x1a\xaf\x04\n-GetProtocolVersionUpgradeVoteStatusResponseV0\x12\x98\x01\n\x08versions\x18\x01 \x01(\x0b\x32\x83\x01.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignalsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\xaf\x01\n\x0eVersionSignals\x12\x9c\x01\n\x0fversion_signals\x18\x01 \x03(\x0b\x32\x82\x01.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal\x1a\x35\n\rVersionSignal\x12\x13\n\x0bpro_tx_hash\x18\x01 \x01(\x0c\x12\x0f\n\x07version\x18\x02 \x01(\rB\x08\n\x06resultB\t\n\x07version\"\xf5\x01\n\x14GetEpochsInfoRequest\x12T\n\x02v0\x18\x01 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0H\x00\x1a|\n\x16GetEpochsInfoRequestV0\x12\x31\n\x0bstart_epoch\x18\x01 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\r\n\x05\x63ount\x18\x02 \x01(\r\x12\x11\n\tascending\x18\x03 \x01(\x08\x12\r\n\x05prove\x18\x04 \x01(\x08\x42\t\n\x07version\"\x91\x05\n\x15GetEpochsInfoResponse\x12V\n\x02v0\x18\x01 \x01(\x0b\x32H.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0H\x00\x1a\x94\x04\n\x17GetEpochsInfoResponseV0\x12\x65\n\x06\x65pochs\x18\x01 \x01(\x0b\x32S.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfosH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1au\n\nEpochInfos\x12g\n\x0b\x65poch_infos\x18\x01 \x03(\x0b\x32R.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo\x1a\x9e\x01\n\tEpochInfo\x12\x0e\n\x06number\x18\x01 \x01(\r\x12\x1a\n\x12\x66irst_block_height\x18\x02 \x01(\x04\x12\x1f\n\x17\x66irst_core_block_height\x18\x03 \x01(\r\x12\x12\n\nstart_time\x18\x04 \x01(\x04\x12\x16\n\x0e\x66\x65\x65_multiplier\x18\x05 \x01(\x01\x12\x18\n\x10protocol_version\x18\x06 \x01(\rB\x08\n\x06resultB\t\n\x07version\"\xc4\x01\n\x16GetPathElementsRequest\x12X\n\x02v0\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0H\x00\x1a\x45\n\x18GetPathElementsRequestV0\x12\x0c\n\x04path\x18\x01 \x03(\x0c\x12\x0c\n\x04keys\x18\x02 \x03(\x0c\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\xa3\x03\n\x17GetPathElementsResponse\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0H\x00\x1a\xa0\x02\n\x19GetPathElementsResponseV0\x12i\n\x08\x65lements\x18\x01 \x01(\x0b\x32U.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.ElementsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x1c\n\x08\x45lements\x12\x10\n\x08\x65lements\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version*Z\n\nKeyPurpose\x12\x12\n\x0e\x41UTHENTICATION\x10\x00\x12\x0e\n\nENCRYPTION\x10\x01\x12\x0e\n\nDECRYPTION\x10\x02\x12\x0c\n\x08TRANSFER\x10\x03\x12\n\n\x06VOTING\x10\x05\x32\xcc\x15\n\x08Platform\x12\x93\x01\n\x18\x62roadcastStateTransition\x12:.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest\x1a;.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse\x12l\n\x0bgetIdentity\x12-.org.dash.platform.dapi.v0.GetIdentityRequest\x1a..org.dash.platform.dapi.v0.GetIdentityResponse\x12x\n\x0fgetIdentityKeys\x12\x31.org.dash.platform.dapi.v0.GetIdentityKeysRequest\x1a\x32.org.dash.platform.dapi.v0.GetIdentityKeysResponse\x12\x96\x01\n\x19getIdentitiesContractKeys\x12;.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest\x1a<.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse\x12{\n\x10getIdentityNonce\x12\x32.org.dash.platform.dapi.v0.GetIdentityNonceRequest\x1a\x33.org.dash.platform.dapi.v0.GetIdentityNonceResponse\x12\x93\x01\n\x18getIdentityContractNonce\x12:.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest\x1a;.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse\x12\x81\x01\n\x12getIdentityBalance\x12\x34.org.dash.platform.dapi.v0.GetIdentityBalanceRequest\x1a\x35.org.dash.platform.dapi.v0.GetIdentityBalanceResponse\x12\xa2\x01\n\x1dgetIdentityBalanceAndRevision\x12?.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest\x1a@.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse\x12\x66\n\tgetProofs\x12+.org.dash.platform.dapi.v0.GetProofsRequest\x1a,.org.dash.platform.dapi.v0.GetProofsResponse\x12x\n\x0fgetDataContract\x12\x31.org.dash.platform.dapi.v0.GetDataContractRequest\x1a\x32.org.dash.platform.dapi.v0.GetDataContractResponse\x12\x8d\x01\n\x16getDataContractHistory\x12\x38.org.dash.platform.dapi.v0.GetDataContractHistoryRequest\x1a\x39.org.dash.platform.dapi.v0.GetDataContractHistoryResponse\x12{\n\x10getDataContracts\x12\x32.org.dash.platform.dapi.v0.GetDataContractsRequest\x1a\x33.org.dash.platform.dapi.v0.GetDataContractsResponse\x12o\n\x0cgetDocuments\x12..org.dash.platform.dapi.v0.GetDocumentsRequest\x1a/.org.dash.platform.dapi.v0.GetDocumentsResponse\x12\x99\x01\n\x1agetIdentityByPublicKeyHash\x12<.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest\x1a=.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse\x12\x9f\x01\n\x1cwaitForStateTransitionResult\x12>.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest\x1a?.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse\x12\x81\x01\n\x12getConsensusParams\x12\x34.org.dash.platform.dapi.v0.GetConsensusParamsRequest\x1a\x35.org.dash.platform.dapi.v0.GetConsensusParamsResponse\x12\xa5\x01\n\x1egetProtocolVersionUpgradeState\x12@.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest\x1a\x41.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse\x12\xb4\x01\n#getProtocolVersionUpgradeVoteStatus\x12\x45.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest\x1a\x46.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse\x12r\n\rgetEpochsInfo\x12/.org.dash.platform.dapi.v0.GetEpochsInfoRequest\x1a\x30.org.dash.platform.dapi.v0.GetEpochsInfoResponse\x12x\n\x0fgetPathElements\x12\x31.org.dash.platform.dapi.v0.GetPathElementsRequest\x1a\x32.org.dash.platform.dapi.v0.GetPathElementsResponseb\x06proto3' , dependencies=[google_dot_protobuf_dot_wrappers__pb2.DESCRIPTOR,google_dot_protobuf_dot_struct__pb2.DESCRIPTOR,google_dot_protobuf_dot_timestamp__pb2.DESCRIPTOR,]) +_KEYPURPOSE = _descriptor.EnumDescriptor( + name='KeyPurpose', + full_name='org.dash.platform.dapi.v0.KeyPurpose', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='AUTHENTICATION', index=0, number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='ENCRYPTION', index=1, number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='DECRYPTION', index=2, number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='TRANSFER', index=3, number=3, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='VOTING', index=4, number=5, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + serialized_start=15803, + serialized_end=15893, +) +_sym_db.RegisterEnumDescriptor(_KEYPURPOSE) + +KeyPurpose = enum_type_wrapper.EnumTypeWrapper(_KEYPURPOSE) +AUTHENTICATION = 0 +ENCRYPTION = 1 +DECRYPTION = 2 +TRANSFER = 3 +VOTING = 5 _SECURITYLEVELMAP_KEYKINDREQUESTTYPE = _descriptor.EnumDescriptor( @@ -48,8 +95,8 @@ ], containing_type=None, serialized_options=None, - serialized_start=4931, - serialized_end=5014, + serialized_start=4150, + serialized_end=4233, ) _sym_db.RegisterEnumDescriptor(_SECURITYLEVELMAP_KEYKINDREQUESTTYPE) @@ -83,8 +130,8 @@ ], containing_type=None, serialized_options=None, - serialized_start=6466, - serialized_end=6528, + serialized_start=6921, + serialized_end=6983, ) _sym_db.RegisterEnumDescriptor(_GETPROOFSREQUEST_GETPROOFSREQUESTV0_IDENTITYREQUEST_TYPE) @@ -795,268 +842,6 @@ ) -_GETIDENTITIESREQUEST_GETIDENTITIESREQUESTV0 = _descriptor.Descriptor( - name='GetIdentitiesRequestV0', - full_name='org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='ids', full_name='org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.ids', index=0, - number=1, type=12, cpp_type=9, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='prove', full_name='org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prove', index=1, - number=2, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=2040, - serialized_end=2092, -) - -_GETIDENTITIESREQUEST = _descriptor.Descriptor( - name='GetIdentitiesRequest', - full_name='org.dash.platform.dapi.v0.GetIdentitiesRequest', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='v0', full_name='org.dash.platform.dapi.v0.GetIdentitiesRequest.v0', index=0, - number=1, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[_GETIDENTITIESREQUEST_GETIDENTITIESREQUESTV0, ], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - _descriptor.OneofDescriptor( - name='version', full_name='org.dash.platform.dapi.v0.GetIdentitiesRequest.version', - index=0, containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[]), - ], - serialized_start=1930, - serialized_end=2103, -) - - -_GETIDENTITIESRESPONSE_IDENTITYVALUE = _descriptor.Descriptor( - name='IdentityValue', - full_name='org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='value', full_name='org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.value', index=0, - number=1, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=b"", - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=2219, - serialized_end=2249, -) - -_GETIDENTITIESRESPONSE_IDENTITYENTRY = _descriptor.Descriptor( - name='IdentityEntry', - full_name='org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='key', full_name='org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.key', index=0, - number=1, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=b"", - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='value', full_name='org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.value', index=1, - number=2, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=2251, - serialized_end=2358, -) - -_GETIDENTITIESRESPONSE_IDENTITIES = _descriptor.Descriptor( - name='Identities', - full_name='org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='identity_entries', full_name='org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.identity_entries', index=0, - number=1, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=2360, - serialized_end=2462, -) - -_GETIDENTITIESRESPONSE_GETIDENTITIESRESPONSEV0 = _descriptor.Descriptor( - name='GetIdentitiesResponseV0', - full_name='org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='identities', full_name='org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.identities', index=0, - number=1, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='proof', full_name='org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.proof', index=1, - number=2, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='metadata', full_name='org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.metadata', index=2, - number=3, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - _descriptor.OneofDescriptor( - name='result', full_name='org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.result', - index=0, containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[]), - ], - serialized_start=2465, - serialized_end=2697, -) - -_GETIDENTITIESRESPONSE = _descriptor.Descriptor( - name='GetIdentitiesResponse', - full_name='org.dash.platform.dapi.v0.GetIdentitiesResponse', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='v0', full_name='org.dash.platform.dapi.v0.GetIdentitiesResponse.v0', index=0, - number=1, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[_GETIDENTITIESRESPONSE_IDENTITYVALUE, _GETIDENTITIESRESPONSE_IDENTITYENTRY, _GETIDENTITIESRESPONSE_IDENTITIES, _GETIDENTITIESRESPONSE_GETIDENTITIESRESPONSEV0, ], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - _descriptor.OneofDescriptor( - name='version', full_name='org.dash.platform.dapi.v0.GetIdentitiesResponse.version', - index=0, containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[]), - ], - serialized_start=2106, - serialized_end=2708, -) - - _GETIDENTITYNONCERESPONSE_GETIDENTITYNONCERESPONSEV0 = _descriptor.Descriptor( name='GetIdentityNonceResponseV0', full_name='org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0', @@ -1103,8 +888,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=2834, - serialized_end=3012, + serialized_start=2053, + serialized_end=2231, ) _GETIDENTITYNONCERESPONSE = _descriptor.Descriptor( @@ -1139,8 +924,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=2711, - serialized_end=3023, + serialized_start=1930, + serialized_end=2242, ) @@ -1190,8 +975,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=3173, - serialized_end=3368, + serialized_start=2392, + serialized_end=2587, ) _GETIDENTITYCONTRACTNONCERESPONSE = _descriptor.Descriptor( @@ -1226,8 +1011,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=3026, - serialized_end=3379, + serialized_start=2245, + serialized_end=2598, ) @@ -1277,8 +1062,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=3511, - serialized_end=3684, + serialized_start=2730, + serialized_end=2903, ) _GETIDENTITYBALANCERESPONSE = _descriptor.Descriptor( @@ -1313,8 +1098,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=3382, - serialized_end=3695, + serialized_start=2601, + serialized_end=2914, ) @@ -1352,8 +1137,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=4175, - serialized_end=4230, + serialized_start=3394, + serialized_end=3449, ) _GETIDENTITYBALANCEANDREVISIONRESPONSE_GETIDENTITYBALANCEANDREVISIONRESPONSEV0 = _descriptor.Descriptor( @@ -1402,8 +1187,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=3860, - serialized_end=4240, + serialized_start=3079, + serialized_end=3459, ) _GETIDENTITYBALANCEANDREVISIONRESPONSE = _descriptor.Descriptor( @@ -1438,8 +1223,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=3698, - serialized_end=4251, + serialized_start=2917, + serialized_end=3470, ) @@ -1489,8 +1274,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=4254, - serialized_end=4463, + serialized_start=3473, + serialized_end=3682, ) @@ -1514,8 +1299,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=4465, - serialized_end=4474, + serialized_start=3684, + serialized_end=3693, ) @@ -1546,8 +1331,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=4476, - serialized_end=4507, + serialized_start=3695, + serialized_end=3726, ) @@ -1585,8 +1370,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=4598, - serialized_end=4692, + serialized_start=3817, + serialized_end=3911, ) _SEARCHKEY = _descriptor.Descriptor( @@ -1616,8 +1401,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=4510, - serialized_end=4692, + serialized_start=3729, + serialized_end=3911, ) @@ -1655,8 +1440,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=4810, - serialized_end=4929, + serialized_start=4029, + serialized_end=4148, ) _SECURITYLEVELMAP = _descriptor.Descriptor( @@ -1687,8 +1472,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=4695, - serialized_end=5014, + serialized_start=3914, + serialized_end=4233, ) @@ -1747,8 +1532,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=5134, - serialized_end=5352, + serialized_start=4353, + serialized_end=4571, ) _GETIDENTITYKEYSREQUEST = _descriptor.Descriptor( @@ -1783,8 +1568,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=5017, - serialized_end=5363, + serialized_start=4236, + serialized_end=4582, ) @@ -1815,8 +1600,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=5728, - serialized_end=5754, + serialized_start=4947, + serialized_end=4973, ) _GETIDENTITYKEYSRESPONSE_GETIDENTITYKEYSRESPONSEV0 = _descriptor.Descriptor( @@ -1865,8 +1650,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=5486, - serialized_end=5764, + serialized_start=4705, + serialized_end=4983, ) _GETIDENTITYKEYSRESPONSE = _descriptor.Descriptor( @@ -1901,35 +1686,330 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=5366, - serialized_end=5775, + serialized_start=4585, + serialized_end=4994, ) -_GETPROOFSREQUEST_GETPROOFSREQUESTV0_DOCUMENTREQUEST = _descriptor.Descriptor( - name='DocumentRequest', - full_name='org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest', +_GETIDENTITIESCONTRACTKEYSREQUEST_GETIDENTITIESCONTRACTKEYSREQUESTV0 = _descriptor.Descriptor( + name='GetIdentitiesContractKeysRequestV0', + full_name='org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( - name='contract_id', full_name='org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.contract_id', index=0, - number=1, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=b"", + name='identities_ids', full_name='org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.identities_ids', index=0, + number=1, type=12, cpp_type=9, label=3, + has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( - name='document_type', full_name='org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.document_type', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), + name='contract_id', full_name='org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.contract_id', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( - name='document_type_keeps_history', full_name='org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.document_type_keeps_history', index=2, + name='document_type_name', full_name='org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.document_type_name', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='purposes', full_name='org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.purposes', index=3, + number=4, type=14, cpp_type=8, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='prove', full_name='org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prove', index=4, + number=5, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='_document_type_name', full_name='org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0._document_type_name', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=5144, + serialized_end=5353, +) + +_GETIDENTITIESCONTRACTKEYSREQUEST = _descriptor.Descriptor( + name='GetIdentitiesContractKeysRequest', + full_name='org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='v0', full_name='org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.v0', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_GETIDENTITIESCONTRACTKEYSREQUEST_GETIDENTITIESCONTRACTKEYSREQUESTV0, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='version', full_name='org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.version', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=4997, + serialized_end=5364, +) + + +_GETIDENTITIESCONTRACTKEYSRESPONSE_GETIDENTITIESCONTRACTKEYSRESPONSEV0_PURPOSEKEYS = _descriptor.Descriptor( + name='PurposeKeys', + full_name='org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='purpose', full_name='org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.purpose', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='keys_bytes', full_name='org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.keys_bytes', index=1, + number=2, type=12, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5811, + serialized_end=5900, +) + +_GETIDENTITIESCONTRACTKEYSRESPONSE_GETIDENTITIESCONTRACTKEYSRESPONSEV0_IDENTITYKEYS = _descriptor.Descriptor( + name='IdentityKeys', + full_name='org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='identity_id', full_name='org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.identity_id', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='keys', full_name='org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.keys', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5903, + serialized_end=6062, +) + +_GETIDENTITIESCONTRACTKEYSRESPONSE_GETIDENTITIESCONTRACTKEYSRESPONSEV0_IDENTITIESKEYS = _descriptor.Descriptor( + name='IdentitiesKeys', + full_name='org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='entries', full_name='org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.entries', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=6065, + serialized_end=6209, +) + +_GETIDENTITIESCONTRACTKEYSRESPONSE_GETIDENTITIESCONTRACTKEYSRESPONSEV0 = _descriptor.Descriptor( + name='GetIdentitiesContractKeysResponseV0', + full_name='org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='identities_keys', full_name='org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.identities_keys', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='proof', full_name='org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.proof', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='metadata', full_name='org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.metadata', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_GETIDENTITIESCONTRACTKEYSRESPONSE_GETIDENTITIESCONTRACTKEYSRESPONSEV0_PURPOSEKEYS, _GETIDENTITIESCONTRACTKEYSRESPONSE_GETIDENTITIESCONTRACTKEYSRESPONSEV0_IDENTITYKEYS, _GETIDENTITIESCONTRACTKEYSRESPONSE_GETIDENTITIESCONTRACTKEYSRESPONSEV0_IDENTITIESKEYS, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='result', full_name='org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.result', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=5517, + serialized_end=6219, +) + +_GETIDENTITIESCONTRACTKEYSRESPONSE = _descriptor.Descriptor( + name='GetIdentitiesContractKeysResponse', + full_name='org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='v0', full_name='org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.v0', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_GETIDENTITIESCONTRACTKEYSRESPONSE_GETIDENTITIESCONTRACTKEYSRESPONSEV0, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='version', full_name='org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.version', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=5367, + serialized_end=6230, +) + + +_GETPROOFSREQUEST_GETPROOFSREQUESTV0_DOCUMENTREQUEST = _descriptor.Descriptor( + name='DocumentRequest', + full_name='org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='contract_id', full_name='org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.contract_id', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='document_type', full_name='org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.document_type', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='document_type_keeps_history', full_name='org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.document_type_keeps_history', index=2, number=3, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, @@ -1954,8 +2034,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=6197, - serialized_end=6316, + serialized_start=6652, + serialized_end=6771, ) _GETPROOFSREQUEST_GETPROOFSREQUESTV0_IDENTITYREQUEST = _descriptor.Descriptor( @@ -1993,8 +2073,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=6319, - serialized_end=6528, + serialized_start=6774, + serialized_end=6983, ) _GETPROOFSREQUEST_GETPROOFSREQUESTV0_CONTRACTREQUEST = _descriptor.Descriptor( @@ -2024,8 +2104,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=6530, - serialized_end=6568, + serialized_start=6985, + serialized_end=7023, ) _GETPROOFSREQUEST_GETPROOFSREQUESTV0 = _descriptor.Descriptor( @@ -2069,8 +2149,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=5877, - serialized_end=6568, + serialized_start=6332, + serialized_end=7023, ) _GETPROOFSREQUEST = _descriptor.Descriptor( @@ -2105,8 +2185,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=5778, - serialized_end=6579, + serialized_start=6233, + serialized_end=7034, ) @@ -2149,8 +2229,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=6684, - serialized_end=6829, + serialized_start=7139, + serialized_end=7284, ) _GETPROOFSRESPONSE = _descriptor.Descriptor( @@ -2185,8 +2265,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=6582, - serialized_end=6840, + serialized_start=7037, + serialized_end=7295, ) @@ -2224,8 +2304,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=6959, - serialized_end=7012, + serialized_start=7414, + serialized_end=7467, ) _GETDATACONTRACTREQUEST = _descriptor.Descriptor( @@ -2260,8 +2340,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=6843, - serialized_end=7023, + serialized_start=7298, + serialized_end=7478, ) @@ -2311,8 +2391,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=7146, - serialized_end=7322, + serialized_start=7601, + serialized_end=7777, ) _GETDATACONTRACTRESPONSE = _descriptor.Descriptor( @@ -2347,8 +2427,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=7026, - serialized_end=7333, + serialized_start=7481, + serialized_end=7788, ) @@ -2386,8 +2466,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=7455, - serialized_end=7510, + serialized_start=7910, + serialized_end=7965, ) _GETDATACONTRACTSREQUEST = _descriptor.Descriptor( @@ -2422,8 +2502,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=7336, - serialized_end=7521, + serialized_start=7791, + serialized_end=7976, ) @@ -2461,8 +2541,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=7646, - serialized_end=7737, + serialized_start=8101, + serialized_end=8192, ) _GETDATACONTRACTSRESPONSE_DATACONTRACTS = _descriptor.Descriptor( @@ -2492,8 +2572,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=7739, - serialized_end=7856, + serialized_start=8194, + serialized_end=8311, ) _GETDATACONTRACTSRESPONSE_GETDATACONTRACTSRESPONSEV0 = _descriptor.Descriptor( @@ -2542,8 +2622,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=7859, - serialized_end=8104, + serialized_start=8314, + serialized_end=8559, ) _GETDATACONTRACTSRESPONSE = _descriptor.Descriptor( @@ -2578,8 +2658,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=7524, - serialized_end=8115, + serialized_start=7979, + serialized_end=8570, ) @@ -2638,8 +2718,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=8256, - serialized_end=8428, + serialized_start=8711, + serialized_end=8883, ) _GETDATACONTRACTHISTORYREQUEST = _descriptor.Descriptor( @@ -2674,8 +2754,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=8118, - serialized_end=8439, + serialized_start=8573, + serialized_end=8894, ) @@ -2713,261 +2793,21 @@ extension_ranges=[], oneofs=[ ], - serialized_start=8879, - serialized_end=8934, -) - -_GETDATACONTRACTHISTORYRESPONSE_GETDATACONTRACTHISTORYRESPONSEV0_DATACONTRACTHISTORY = _descriptor.Descriptor( - name='DataContractHistory', - full_name='org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='data_contract_entries', full_name='org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.data_contract_entries', index=0, - number=1, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=8937, - serialized_end=9107, -) - -_GETDATACONTRACTHISTORYRESPONSE_GETDATACONTRACTHISTORYRESPONSEV0 = _descriptor.Descriptor( - name='GetDataContractHistoryResponseV0', - full_name='org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='data_contract_history', full_name='org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.data_contract_history', index=0, - number=1, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='proof', full_name='org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.proof', index=1, - number=2, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='metadata', full_name='org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.metadata', index=2, - number=3, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[_GETDATACONTRACTHISTORYRESPONSE_GETDATACONTRACTHISTORYRESPONSEV0_DATACONTRACTHISTORYENTRY, _GETDATACONTRACTHISTORYRESPONSE_GETDATACONTRACTHISTORYRESPONSEV0_DATACONTRACTHISTORY, ], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - _descriptor.OneofDescriptor( - name='result', full_name='org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.result', - index=0, containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[]), - ], - serialized_start=8583, - serialized_end=9117, -) - -_GETDATACONTRACTHISTORYRESPONSE = _descriptor.Descriptor( - name='GetDataContractHistoryResponse', - full_name='org.dash.platform.dapi.v0.GetDataContractHistoryResponse', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='v0', full_name='org.dash.platform.dapi.v0.GetDataContractHistoryResponse.v0', index=0, - number=1, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[_GETDATACONTRACTHISTORYRESPONSE_GETDATACONTRACTHISTORYRESPONSEV0, ], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - _descriptor.OneofDescriptor( - name='version', full_name='org.dash.platform.dapi.v0.GetDataContractHistoryResponse.version', - index=0, containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[]), - ], - serialized_start=8442, - serialized_end=9128, -) - - -_GETDOCUMENTSREQUEST_GETDOCUMENTSREQUESTV0 = _descriptor.Descriptor( - name='GetDocumentsRequestV0', - full_name='org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='data_contract_id', full_name='org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.data_contract_id', index=0, - number=1, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=b"", - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='document_type', full_name='org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.document_type', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='where', full_name='org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.where', index=2, - number=3, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=b"", - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='order_by', full_name='org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.order_by', index=3, - number=4, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=b"", - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='limit', full_name='org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.limit', index=4, - number=5, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='start_after', full_name='org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.start_after', index=5, - number=6, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=b"", - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='start_at', full_name='org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.start_at', index=6, - number=7, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=b"", - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='prove', full_name='org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prove', index=7, - number=8, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - _descriptor.OneofDescriptor( - name='start', full_name='org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.start', - index=0, containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[]), - ], - serialized_start=9239, - serialized_end=9426, -) - -_GETDOCUMENTSREQUEST = _descriptor.Descriptor( - name='GetDocumentsRequest', - full_name='org.dash.platform.dapi.v0.GetDocumentsRequest', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='v0', full_name='org.dash.platform.dapi.v0.GetDocumentsRequest.v0', index=0, - number=1, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[_GETDOCUMENTSREQUEST_GETDOCUMENTSREQUESTV0, ], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - _descriptor.OneofDescriptor( - name='version', full_name='org.dash.platform.dapi.v0.GetDocumentsRequest.version', - index=0, containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[]), - ], - serialized_start=9131, - serialized_end=9437, + serialized_start=9334, + serialized_end=9389, ) - -_GETDOCUMENTSRESPONSE_GETDOCUMENTSRESPONSEV0_DOCUMENTS = _descriptor.Descriptor( - name='Documents', - full_name='org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents', +_GETDATACONTRACTHISTORYRESPONSE_GETDATACONTRACTHISTORYRESPONSEV0_DATACONTRACTHISTORY = _descriptor.Descriptor( + name='DataContractHistory', + full_name='org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( - name='documents', full_name='org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.documents', index=0, - number=1, type=12, cpp_type=9, label=3, + name='data_contract_entries', full_name='org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.data_contract_entries', index=0, + number=1, type=11, cpp_type=10, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, @@ -2984,34 +2824,34 @@ extension_ranges=[], oneofs=[ ], - serialized_start=9794, - serialized_end=9824, + serialized_start=9392, + serialized_end=9562, ) -_GETDOCUMENTSRESPONSE_GETDOCUMENTSRESPONSEV0 = _descriptor.Descriptor( - name='GetDocumentsResponseV0', - full_name='org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0', +_GETDATACONTRACTHISTORYRESPONSE_GETDATACONTRACTHISTORYRESPONSEV0 = _descriptor.Descriptor( + name='GetDataContractHistoryResponseV0', + full_name='org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( - name='documents', full_name='org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.documents', index=0, + name='data_contract_history', full_name='org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.data_contract_history', index=0, number=1, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( - name='proof', full_name='org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.proof', index=1, + name='proof', full_name='org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.proof', index=1, number=2, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( - name='metadata', full_name='org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.metadata', index=2, + name='metadata', full_name='org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.metadata', index=2, number=3, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, @@ -3020,7 +2860,7 @@ ], extensions=[ ], - nested_types=[_GETDOCUMENTSRESPONSE_GETDOCUMENTSRESPONSEV0_DOCUMENTS, ], + nested_types=[_GETDATACONTRACTHISTORYRESPONSE_GETDATACONTRACTHISTORYRESPONSEV0_DATACONTRACTHISTORYENTRY, _GETDATACONTRACTHISTORYRESPONSE_GETDATACONTRACTHISTORYRESPONSEV0_DATACONTRACTHISTORY, ], enum_types=[ ], serialized_options=None, @@ -3029,25 +2869,25 @@ extension_ranges=[], oneofs=[ _descriptor.OneofDescriptor( - name='result', full_name='org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.result', + name='result', full_name='org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.result', index=0, containing_type=None, create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=9551, - serialized_end=9834, + serialized_start=9038, + serialized_end=9572, ) -_GETDOCUMENTSRESPONSE = _descriptor.Descriptor( - name='GetDocumentsResponse', - full_name='org.dash.platform.dapi.v0.GetDocumentsResponse', +_GETDATACONTRACTHISTORYRESPONSE = _descriptor.Descriptor( + name='GetDataContractHistoryResponse', + full_name='org.dash.platform.dapi.v0.GetDataContractHistoryResponse', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( - name='v0', full_name='org.dash.platform.dapi.v0.GetDocumentsResponse.v0', index=0, + name='v0', full_name='org.dash.platform.dapi.v0.GetDataContractHistoryResponse.v0', index=0, number=1, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, @@ -3056,7 +2896,7 @@ ], extensions=[ ], - nested_types=[_GETDOCUMENTSRESPONSE_GETDOCUMENTSRESPONSEV0, ], + nested_types=[_GETDATACONTRACTHISTORYRESPONSE_GETDATACONTRACTHISTORYRESPONSEV0, ], enum_types=[ ], serialized_options=None, @@ -3065,73 +2905,84 @@ extension_ranges=[], oneofs=[ _descriptor.OneofDescriptor( - name='version', full_name='org.dash.platform.dapi.v0.GetDocumentsResponse.version', + name='version', full_name='org.dash.platform.dapi.v0.GetDataContractHistoryResponse.version', index=0, containing_type=None, create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=9440, - serialized_end=9845, + serialized_start=8897, + serialized_end=9583, ) -_GETIDENTITIESBYPUBLICKEYHASHESREQUEST_GETIDENTITIESBYPUBLICKEYHASHESREQUESTV0 = _descriptor.Descriptor( - name='GetIdentitiesByPublicKeyHashesRequestV0', - full_name='org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0', +_GETDOCUMENTSREQUEST_GETDOCUMENTSREQUESTV0 = _descriptor.Descriptor( + name='GetDocumentsRequestV0', + full_name='org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( - name='public_key_hashes', full_name='org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.public_key_hashes', index=0, - number=1, type=12, cpp_type=9, label=3, - has_default_value=False, default_value=[], + name='data_contract_id', full_name='org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.data_contract_id', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( - name='prove', full_name='org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.prove', index=1, - number=2, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, + name='document_type', full_name='org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.document_type', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=10009, - serialized_end=10092, -) - -_GETIDENTITIESBYPUBLICKEYHASHESREQUEST = _descriptor.Descriptor( - name='GetIdentitiesByPublicKeyHashesRequest', - full_name='org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ _descriptor.FieldDescriptor( - name='v0', full_name='org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.v0', index=0, - number=1, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, + name='where', full_name='org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.where', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='order_by', full_name='org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.order_by', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='limit', full_name='org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.limit', index=4, + number=5, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='start_after', full_name='org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.start_after', index=5, + number=6, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='start_at', full_name='org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.start_at', index=6, + number=7, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='prove', full_name='org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prove', index=7, + number=8, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], - nested_types=[_GETIDENTITIESBYPUBLICKEYHASHESREQUEST_GETIDENTITIESBYPUBLICKEYHASHESREQUESTV0, ], + nested_types=[], enum_types=[ ], serialized_options=None, @@ -3140,34 +2991,26 @@ extension_ranges=[], oneofs=[ _descriptor.OneofDescriptor( - name='version', full_name='org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.version', + name='start', full_name='org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.start', index=0, containing_type=None, create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=9848, - serialized_end=10103, + serialized_start=9694, + serialized_end=9881, ) - -_GETIDENTITIESBYPUBLICKEYHASHESRESPONSE_PUBLICKEYHASHIDENTITYENTRY = _descriptor.Descriptor( - name='PublicKeyHashIdentityEntry', - full_name='org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry', +_GETDOCUMENTSREQUEST = _descriptor.Descriptor( + name='GetDocumentsRequest', + full_name='org.dash.platform.dapi.v0.GetDocumentsRequest', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( - name='public_key_hash', full_name='org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.public_key_hash', index=0, - number=1, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=b"", - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='value', full_name='org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.value', index=1, - number=2, type=11, cpp_type=10, label=1, + name='v0', full_name='org.dash.platform.dapi.v0.GetDocumentsRequest.v0', index=0, + number=1, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, @@ -3175,7 +3018,7 @@ ], extensions=[ ], - nested_types=[], + nested_types=[_GETDOCUMENTSREQUEST_GETDOCUMENTSREQUESTV0, ], enum_types=[ ], serialized_options=None, @@ -3183,22 +3026,28 @@ syntax='proto3', extension_ranges=[], oneofs=[ + _descriptor.OneofDescriptor( + name='version', full_name='org.dash.platform.dapi.v0.GetDocumentsRequest.version', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), ], - serialized_start=10270, - serialized_end=10367, + serialized_start=9586, + serialized_end=9892, ) -_GETIDENTITIESBYPUBLICKEYHASHESRESPONSE_IDENTITIESBYPUBLICKEYHASHES = _descriptor.Descriptor( - name='IdentitiesByPublicKeyHashes', - full_name='org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes', + +_GETDOCUMENTSRESPONSE_GETDOCUMENTSRESPONSEV0_DOCUMENTS = _descriptor.Descriptor( + name='Documents', + full_name='org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( - name='identity_entries', full_name='org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes.identity_entries', index=0, - number=1, type=11, cpp_type=10, label=3, + name='documents', full_name='org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.documents', index=0, + number=1, type=12, cpp_type=9, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, @@ -3215,34 +3064,34 @@ extension_ranges=[], oneofs=[ ], - serialized_start=10370, - serialized_end=10519, + serialized_start=10249, + serialized_end=10279, ) -_GETIDENTITIESBYPUBLICKEYHASHESRESPONSE_GETIDENTITIESBYPUBLICKEYHASHESRESPONSEV0 = _descriptor.Descriptor( - name='GetIdentitiesByPublicKeyHashesResponseV0', - full_name='org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0', +_GETDOCUMENTSRESPONSE_GETDOCUMENTSRESPONSEV0 = _descriptor.Descriptor( + name='GetDocumentsResponseV0', + full_name='org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( - name='identities', full_name='org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.identities', index=0, + name='documents', full_name='org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.documents', index=0, number=1, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( - name='proof', full_name='org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.proof', index=1, + name='proof', full_name='org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.proof', index=1, number=2, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( - name='metadata', full_name='org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.metadata', index=2, + name='metadata', full_name='org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.metadata', index=2, number=3, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, @@ -3251,7 +3100,7 @@ ], extensions=[ ], - nested_types=[], + nested_types=[_GETDOCUMENTSRESPONSE_GETDOCUMENTSRESPONSEV0_DOCUMENTS, ], enum_types=[ ], serialized_options=None, @@ -3260,25 +3109,25 @@ extension_ranges=[], oneofs=[ _descriptor.OneofDescriptor( - name='result', full_name='org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.result', + name='result', full_name='org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.result', index=0, containing_type=None, create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=10522, - serialized_end=10805, + serialized_start=10006, + serialized_end=10289, ) -_GETIDENTITIESBYPUBLICKEYHASHESRESPONSE = _descriptor.Descriptor( - name='GetIdentitiesByPublicKeyHashesResponse', - full_name='org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse', +_GETDOCUMENTSRESPONSE = _descriptor.Descriptor( + name='GetDocumentsResponse', + full_name='org.dash.platform.dapi.v0.GetDocumentsResponse', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( - name='v0', full_name='org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.v0', index=0, + name='v0', full_name='org.dash.platform.dapi.v0.GetDocumentsResponse.v0', index=0, number=1, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, @@ -3287,7 +3136,7 @@ ], extensions=[ ], - nested_types=[_GETIDENTITIESBYPUBLICKEYHASHESRESPONSE_PUBLICKEYHASHIDENTITYENTRY, _GETIDENTITIESBYPUBLICKEYHASHESRESPONSE_IDENTITIESBYPUBLICKEYHASHES, _GETIDENTITIESBYPUBLICKEYHASHESRESPONSE_GETIDENTITIESBYPUBLICKEYHASHESRESPONSEV0, ], + nested_types=[_GETDOCUMENTSRESPONSE_GETDOCUMENTSRESPONSEV0, ], enum_types=[ ], serialized_options=None, @@ -3296,13 +3145,13 @@ extension_ranges=[], oneofs=[ _descriptor.OneofDescriptor( - name='version', full_name='org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.version', + name='version', full_name='org.dash.platform.dapi.v0.GetDocumentsResponse.version', index=0, containing_type=None, create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=10106, - serialized_end=10816, + serialized_start=9895, + serialized_end=10300, ) @@ -3340,8 +3189,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=10968, - serialized_end=11045, + serialized_start=10452, + serialized_end=10529, ) _GETIDENTITYBYPUBLICKEYHASHREQUEST = _descriptor.Descriptor( @@ -3376,8 +3225,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=10819, - serialized_end=11056, + serialized_start=10303, + serialized_end=10540, ) @@ -3427,8 +3276,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=11212, - serialized_end=11394, + serialized_start=10696, + serialized_end=10878, ) _GETIDENTITYBYPUBLICKEYHASHRESPONSE = _descriptor.Descriptor( @@ -3463,8 +3312,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=11059, - serialized_end=11405, + serialized_start=10543, + serialized_end=10889, ) @@ -3502,8 +3351,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=11563, - serialized_end=11648, + serialized_start=11047, + serialized_end=11132, ) _WAITFORSTATETRANSITIONRESULTREQUEST = _descriptor.Descriptor( @@ -3538,8 +3387,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=11408, - serialized_end=11659, + serialized_start=10892, + serialized_end=11143, ) @@ -3589,8 +3438,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=11821, - serialized_end=12060, + serialized_start=11305, + serialized_end=11544, ) _WAITFORSTATETRANSITIONRESULTRESPONSE = _descriptor.Descriptor( @@ -3625,8 +3474,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=11662, - serialized_end=12071, + serialized_start=11146, + serialized_end=11555, ) @@ -3664,8 +3513,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=12199, - serialized_end=12259, + serialized_start=11683, + serialized_end=11743, ) _GETCONSENSUSPARAMSREQUEST = _descriptor.Descriptor( @@ -3700,8 +3549,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=12074, - serialized_end=12270, + serialized_start=11558, + serialized_end=11754, ) @@ -3746,8 +3595,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=12401, - serialized_end=12481, + serialized_start=11885, + serialized_end=11965, ) _GETCONSENSUSPARAMSRESPONSE_CONSENSUSPARAMSEVIDENCE = _descriptor.Descriptor( @@ -3791,8 +3640,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=12483, - serialized_end=12581, + serialized_start=11967, + serialized_end=12065, ) _GETCONSENSUSPARAMSRESPONSE_GETCONSENSUSPARAMSRESPONSEV0 = _descriptor.Descriptor( @@ -3829,8 +3678,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=12584, - serialized_end=12802, + serialized_start=12068, + serialized_end=12286, ) _GETCONSENSUSPARAMSRESPONSE = _descriptor.Descriptor( @@ -3865,8 +3714,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=12273, - serialized_end=12813, + serialized_start=11757, + serialized_end=12297, ) @@ -3897,8 +3746,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=12977, - serialized_end=13033, + serialized_start=12461, + serialized_end=12517, ) _GETPROTOCOLVERSIONUPGRADESTATEREQUEST = _descriptor.Descriptor( @@ -3933,8 +3782,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=12816, - serialized_end=13044, + serialized_start=12300, + serialized_end=12528, ) @@ -3965,8 +3814,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=13509, - serialized_end=13659, + serialized_start=12993, + serialized_end=13143, ) _GETPROTOCOLVERSIONUPGRADESTATERESPONSE_GETPROTOCOLVERSIONUPGRADESTATERESPONSEV0_VERSIONENTRY = _descriptor.Descriptor( @@ -4003,8 +3852,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=13661, - serialized_end=13719, + serialized_start=13145, + serialized_end=13203, ) _GETPROTOCOLVERSIONUPGRADESTATERESPONSE_GETPROTOCOLVERSIONUPGRADESTATERESPONSEV0 = _descriptor.Descriptor( @@ -4053,8 +3902,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=13212, - serialized_end=13729, + serialized_start=12696, + serialized_end=13213, ) _GETPROTOCOLVERSIONUPGRADESTATERESPONSE = _descriptor.Descriptor( @@ -4089,8 +3938,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=13047, - serialized_end=13740, + serialized_start=12531, + serialized_end=13224, ) @@ -4135,8 +3984,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=13920, - serialized_end=14023, + serialized_start=13404, + serialized_end=13507, ) _GETPROTOCOLVERSIONUPGRADEVOTESTATUSREQUEST = _descriptor.Descriptor( @@ -4171,8 +4020,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=13743, - serialized_end=14034, + serialized_start=13227, + serialized_end=13518, ) @@ -4203,8 +4052,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=14537, - serialized_end=14712, + serialized_start=14021, + serialized_end=14196, ) _GETPROTOCOLVERSIONUPGRADEVOTESTATUSRESPONSE_GETPROTOCOLVERSIONUPGRADEVOTESTATUSRESPONSEV0_VERSIONSIGNAL = _descriptor.Descriptor( @@ -4241,8 +4090,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=14714, - serialized_end=14767, + serialized_start=14198, + serialized_end=14251, ) _GETPROTOCOLVERSIONUPGRADEVOTESTATUSRESPONSE_GETPROTOCOLVERSIONUPGRADEVOTESTATUSRESPONSEV0 = _descriptor.Descriptor( @@ -4291,8 +4140,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=14218, - serialized_end=14777, + serialized_start=13702, + serialized_end=14261, ) _GETPROTOCOLVERSIONUPGRADEVOTESTATUSRESPONSE = _descriptor.Descriptor( @@ -4327,8 +4176,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=14037, - serialized_end=14788, + serialized_start=13521, + serialized_end=14272, ) @@ -4380,8 +4229,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=14901, - serialized_end=15025, + serialized_start=14385, + serialized_end=14509, ) _GETEPOCHSINFOREQUEST = _descriptor.Descriptor( @@ -4416,8 +4265,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=14791, - serialized_end=15036, + serialized_start=14275, + serialized_end=14520, ) @@ -4448,8 +4297,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=15397, - serialized_end=15514, + serialized_start=14881, + serialized_end=14998, ) _GETEPOCHSINFORESPONSE_GETEPOCHSINFORESPONSEV0_EPOCHINFO = _descriptor.Descriptor( @@ -4514,8 +4363,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=15517, - serialized_end=15675, + serialized_start=15001, + serialized_end=15159, ) _GETEPOCHSINFORESPONSE_GETEPOCHSINFORESPONSEV0 = _descriptor.Descriptor( @@ -4564,8 +4413,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=15153, - serialized_end=15685, + serialized_start=14637, + serialized_end=15169, ) _GETEPOCHSINFORESPONSE = _descriptor.Descriptor( @@ -4600,8 +4449,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=15039, - serialized_end=15696, + serialized_start=14523, + serialized_end=15180, ) @@ -4646,8 +4495,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=15815, - serialized_end=15884, + serialized_start=15299, + serialized_end=15368, ) _GETPATHELEMENTSREQUEST = _descriptor.Descriptor( @@ -4682,8 +4531,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=15699, - serialized_end=15895, + serialized_start=15183, + serialized_end=15379, ) @@ -4714,8 +4563,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=16268, - serialized_end=16296, + serialized_start=15752, + serialized_end=15780, ) _GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0 = _descriptor.Descriptor( @@ -4764,8 +4613,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=16018, - serialized_end=16306, + serialized_start=15502, + serialized_end=15790, ) _GETPATHELEMENTSRESPONSE = _descriptor.Descriptor( @@ -4800,8 +4649,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=15898, - serialized_end=16317, + serialized_start=15382, + serialized_end=15801, ) _GETIDENTITYREQUEST_GETIDENTITYREQUESTV0.containing_type = _GETIDENTITYREQUEST @@ -4842,30 +4691,6 @@ _GETIDENTITYRESPONSE.oneofs_by_name['version'].fields.append( _GETIDENTITYRESPONSE.fields_by_name['v0']) _GETIDENTITYRESPONSE.fields_by_name['v0'].containing_oneof = _GETIDENTITYRESPONSE.oneofs_by_name['version'] -_GETIDENTITIESREQUEST_GETIDENTITIESREQUESTV0.containing_type = _GETIDENTITIESREQUEST -_GETIDENTITIESREQUEST.fields_by_name['v0'].message_type = _GETIDENTITIESREQUEST_GETIDENTITIESREQUESTV0 -_GETIDENTITIESREQUEST.oneofs_by_name['version'].fields.append( - _GETIDENTITIESREQUEST.fields_by_name['v0']) -_GETIDENTITIESREQUEST.fields_by_name['v0'].containing_oneof = _GETIDENTITIESREQUEST.oneofs_by_name['version'] -_GETIDENTITIESRESPONSE_IDENTITYVALUE.containing_type = _GETIDENTITIESRESPONSE -_GETIDENTITIESRESPONSE_IDENTITYENTRY.fields_by_name['value'].message_type = _GETIDENTITIESRESPONSE_IDENTITYVALUE -_GETIDENTITIESRESPONSE_IDENTITYENTRY.containing_type = _GETIDENTITIESRESPONSE -_GETIDENTITIESRESPONSE_IDENTITIES.fields_by_name['identity_entries'].message_type = _GETIDENTITIESRESPONSE_IDENTITYENTRY -_GETIDENTITIESRESPONSE_IDENTITIES.containing_type = _GETIDENTITIESRESPONSE -_GETIDENTITIESRESPONSE_GETIDENTITIESRESPONSEV0.fields_by_name['identities'].message_type = _GETIDENTITIESRESPONSE_IDENTITIES -_GETIDENTITIESRESPONSE_GETIDENTITIESRESPONSEV0.fields_by_name['proof'].message_type = _PROOF -_GETIDENTITIESRESPONSE_GETIDENTITIESRESPONSEV0.fields_by_name['metadata'].message_type = _RESPONSEMETADATA -_GETIDENTITIESRESPONSE_GETIDENTITIESRESPONSEV0.containing_type = _GETIDENTITIESRESPONSE -_GETIDENTITIESRESPONSE_GETIDENTITIESRESPONSEV0.oneofs_by_name['result'].fields.append( - _GETIDENTITIESRESPONSE_GETIDENTITIESRESPONSEV0.fields_by_name['identities']) -_GETIDENTITIESRESPONSE_GETIDENTITIESRESPONSEV0.fields_by_name['identities'].containing_oneof = _GETIDENTITIESRESPONSE_GETIDENTITIESRESPONSEV0.oneofs_by_name['result'] -_GETIDENTITIESRESPONSE_GETIDENTITIESRESPONSEV0.oneofs_by_name['result'].fields.append( - _GETIDENTITIESRESPONSE_GETIDENTITIESRESPONSEV0.fields_by_name['proof']) -_GETIDENTITIESRESPONSE_GETIDENTITIESRESPONSEV0.fields_by_name['proof'].containing_oneof = _GETIDENTITIESRESPONSE_GETIDENTITIESRESPONSEV0.oneofs_by_name['result'] -_GETIDENTITIESRESPONSE.fields_by_name['v0'].message_type = _GETIDENTITIESRESPONSE_GETIDENTITIESRESPONSEV0 -_GETIDENTITIESRESPONSE.oneofs_by_name['version'].fields.append( - _GETIDENTITIESRESPONSE.fields_by_name['v0']) -_GETIDENTITIESRESPONSE.fields_by_name['v0'].containing_oneof = _GETIDENTITIESRESPONSE.oneofs_by_name['version'] _GETIDENTITYNONCERESPONSE_GETIDENTITYNONCERESPONSEV0.fields_by_name['proof'].message_type = _PROOF _GETIDENTITYNONCERESPONSE_GETIDENTITYNONCERESPONSEV0.fields_by_name['metadata'].message_type = _RESPONSEMETADATA _GETIDENTITYNONCERESPONSE_GETIDENTITYNONCERESPONSEV0.containing_type = _GETIDENTITYNONCERESPONSE @@ -4962,6 +4787,35 @@ _GETIDENTITYKEYSRESPONSE.oneofs_by_name['version'].fields.append( _GETIDENTITYKEYSRESPONSE.fields_by_name['v0']) _GETIDENTITYKEYSRESPONSE.fields_by_name['v0'].containing_oneof = _GETIDENTITYKEYSRESPONSE.oneofs_by_name['version'] +_GETIDENTITIESCONTRACTKEYSREQUEST_GETIDENTITIESCONTRACTKEYSREQUESTV0.fields_by_name['purposes'].enum_type = _KEYPURPOSE +_GETIDENTITIESCONTRACTKEYSREQUEST_GETIDENTITIESCONTRACTKEYSREQUESTV0.containing_type = _GETIDENTITIESCONTRACTKEYSREQUEST +_GETIDENTITIESCONTRACTKEYSREQUEST_GETIDENTITIESCONTRACTKEYSREQUESTV0.oneofs_by_name['_document_type_name'].fields.append( + _GETIDENTITIESCONTRACTKEYSREQUEST_GETIDENTITIESCONTRACTKEYSREQUESTV0.fields_by_name['document_type_name']) +_GETIDENTITIESCONTRACTKEYSREQUEST_GETIDENTITIESCONTRACTKEYSREQUESTV0.fields_by_name['document_type_name'].containing_oneof = _GETIDENTITIESCONTRACTKEYSREQUEST_GETIDENTITIESCONTRACTKEYSREQUESTV0.oneofs_by_name['_document_type_name'] +_GETIDENTITIESCONTRACTKEYSREQUEST.fields_by_name['v0'].message_type = _GETIDENTITIESCONTRACTKEYSREQUEST_GETIDENTITIESCONTRACTKEYSREQUESTV0 +_GETIDENTITIESCONTRACTKEYSREQUEST.oneofs_by_name['version'].fields.append( + _GETIDENTITIESCONTRACTKEYSREQUEST.fields_by_name['v0']) +_GETIDENTITIESCONTRACTKEYSREQUEST.fields_by_name['v0'].containing_oneof = _GETIDENTITIESCONTRACTKEYSREQUEST.oneofs_by_name['version'] +_GETIDENTITIESCONTRACTKEYSRESPONSE_GETIDENTITIESCONTRACTKEYSRESPONSEV0_PURPOSEKEYS.fields_by_name['purpose'].enum_type = _KEYPURPOSE +_GETIDENTITIESCONTRACTKEYSRESPONSE_GETIDENTITIESCONTRACTKEYSRESPONSEV0_PURPOSEKEYS.containing_type = _GETIDENTITIESCONTRACTKEYSRESPONSE_GETIDENTITIESCONTRACTKEYSRESPONSEV0 +_GETIDENTITIESCONTRACTKEYSRESPONSE_GETIDENTITIESCONTRACTKEYSRESPONSEV0_IDENTITYKEYS.fields_by_name['keys'].message_type = _GETIDENTITIESCONTRACTKEYSRESPONSE_GETIDENTITIESCONTRACTKEYSRESPONSEV0_PURPOSEKEYS +_GETIDENTITIESCONTRACTKEYSRESPONSE_GETIDENTITIESCONTRACTKEYSRESPONSEV0_IDENTITYKEYS.containing_type = _GETIDENTITIESCONTRACTKEYSRESPONSE_GETIDENTITIESCONTRACTKEYSRESPONSEV0 +_GETIDENTITIESCONTRACTKEYSRESPONSE_GETIDENTITIESCONTRACTKEYSRESPONSEV0_IDENTITIESKEYS.fields_by_name['entries'].message_type = _GETIDENTITIESCONTRACTKEYSRESPONSE_GETIDENTITIESCONTRACTKEYSRESPONSEV0_IDENTITYKEYS +_GETIDENTITIESCONTRACTKEYSRESPONSE_GETIDENTITIESCONTRACTKEYSRESPONSEV0_IDENTITIESKEYS.containing_type = _GETIDENTITIESCONTRACTKEYSRESPONSE_GETIDENTITIESCONTRACTKEYSRESPONSEV0 +_GETIDENTITIESCONTRACTKEYSRESPONSE_GETIDENTITIESCONTRACTKEYSRESPONSEV0.fields_by_name['identities_keys'].message_type = _GETIDENTITIESCONTRACTKEYSRESPONSE_GETIDENTITIESCONTRACTKEYSRESPONSEV0_IDENTITIESKEYS +_GETIDENTITIESCONTRACTKEYSRESPONSE_GETIDENTITIESCONTRACTKEYSRESPONSEV0.fields_by_name['proof'].message_type = _PROOF +_GETIDENTITIESCONTRACTKEYSRESPONSE_GETIDENTITIESCONTRACTKEYSRESPONSEV0.fields_by_name['metadata'].message_type = _RESPONSEMETADATA +_GETIDENTITIESCONTRACTKEYSRESPONSE_GETIDENTITIESCONTRACTKEYSRESPONSEV0.containing_type = _GETIDENTITIESCONTRACTKEYSRESPONSE +_GETIDENTITIESCONTRACTKEYSRESPONSE_GETIDENTITIESCONTRACTKEYSRESPONSEV0.oneofs_by_name['result'].fields.append( + _GETIDENTITIESCONTRACTKEYSRESPONSE_GETIDENTITIESCONTRACTKEYSRESPONSEV0.fields_by_name['identities_keys']) +_GETIDENTITIESCONTRACTKEYSRESPONSE_GETIDENTITIESCONTRACTKEYSRESPONSEV0.fields_by_name['identities_keys'].containing_oneof = _GETIDENTITIESCONTRACTKEYSRESPONSE_GETIDENTITIESCONTRACTKEYSRESPONSEV0.oneofs_by_name['result'] +_GETIDENTITIESCONTRACTKEYSRESPONSE_GETIDENTITIESCONTRACTKEYSRESPONSEV0.oneofs_by_name['result'].fields.append( + _GETIDENTITIESCONTRACTKEYSRESPONSE_GETIDENTITIESCONTRACTKEYSRESPONSEV0.fields_by_name['proof']) +_GETIDENTITIESCONTRACTKEYSRESPONSE_GETIDENTITIESCONTRACTKEYSRESPONSEV0.fields_by_name['proof'].containing_oneof = _GETIDENTITIESCONTRACTKEYSRESPONSE_GETIDENTITIESCONTRACTKEYSRESPONSEV0.oneofs_by_name['result'] +_GETIDENTITIESCONTRACTKEYSRESPONSE.fields_by_name['v0'].message_type = _GETIDENTITIESCONTRACTKEYSRESPONSE_GETIDENTITIESCONTRACTKEYSRESPONSEV0 +_GETIDENTITIESCONTRACTKEYSRESPONSE.oneofs_by_name['version'].fields.append( + _GETIDENTITIESCONTRACTKEYSRESPONSE.fields_by_name['v0']) +_GETIDENTITIESCONTRACTKEYSRESPONSE.fields_by_name['v0'].containing_oneof = _GETIDENTITIESCONTRACTKEYSRESPONSE.oneofs_by_name['version'] _GETPROOFSREQUEST_GETPROOFSREQUESTV0_DOCUMENTREQUEST.containing_type = _GETPROOFSREQUEST_GETPROOFSREQUESTV0 _GETPROOFSREQUEST_GETPROOFSREQUESTV0_IDENTITYREQUEST.fields_by_name['request_type'].enum_type = _GETPROOFSREQUEST_GETPROOFSREQUESTV0_IDENTITYREQUEST_TYPE _GETPROOFSREQUEST_GETPROOFSREQUESTV0_IDENTITYREQUEST.containing_type = _GETPROOFSREQUEST_GETPROOFSREQUESTV0 @@ -5076,29 +4930,6 @@ _GETDOCUMENTSRESPONSE.oneofs_by_name['version'].fields.append( _GETDOCUMENTSRESPONSE.fields_by_name['v0']) _GETDOCUMENTSRESPONSE.fields_by_name['v0'].containing_oneof = _GETDOCUMENTSRESPONSE.oneofs_by_name['version'] -_GETIDENTITIESBYPUBLICKEYHASHESREQUEST_GETIDENTITIESBYPUBLICKEYHASHESREQUESTV0.containing_type = _GETIDENTITIESBYPUBLICKEYHASHESREQUEST -_GETIDENTITIESBYPUBLICKEYHASHESREQUEST.fields_by_name['v0'].message_type = _GETIDENTITIESBYPUBLICKEYHASHESREQUEST_GETIDENTITIESBYPUBLICKEYHASHESREQUESTV0 -_GETIDENTITIESBYPUBLICKEYHASHESREQUEST.oneofs_by_name['version'].fields.append( - _GETIDENTITIESBYPUBLICKEYHASHESREQUEST.fields_by_name['v0']) -_GETIDENTITIESBYPUBLICKEYHASHESREQUEST.fields_by_name['v0'].containing_oneof = _GETIDENTITIESBYPUBLICKEYHASHESREQUEST.oneofs_by_name['version'] -_GETIDENTITIESBYPUBLICKEYHASHESRESPONSE_PUBLICKEYHASHIDENTITYENTRY.fields_by_name['value'].message_type = google_dot_protobuf_dot_wrappers__pb2._BYTESVALUE -_GETIDENTITIESBYPUBLICKEYHASHESRESPONSE_PUBLICKEYHASHIDENTITYENTRY.containing_type = _GETIDENTITIESBYPUBLICKEYHASHESRESPONSE -_GETIDENTITIESBYPUBLICKEYHASHESRESPONSE_IDENTITIESBYPUBLICKEYHASHES.fields_by_name['identity_entries'].message_type = _GETIDENTITIESBYPUBLICKEYHASHESRESPONSE_PUBLICKEYHASHIDENTITYENTRY -_GETIDENTITIESBYPUBLICKEYHASHESRESPONSE_IDENTITIESBYPUBLICKEYHASHES.containing_type = _GETIDENTITIESBYPUBLICKEYHASHESRESPONSE -_GETIDENTITIESBYPUBLICKEYHASHESRESPONSE_GETIDENTITIESBYPUBLICKEYHASHESRESPONSEV0.fields_by_name['identities'].message_type = _GETIDENTITIESBYPUBLICKEYHASHESRESPONSE_IDENTITIESBYPUBLICKEYHASHES -_GETIDENTITIESBYPUBLICKEYHASHESRESPONSE_GETIDENTITIESBYPUBLICKEYHASHESRESPONSEV0.fields_by_name['proof'].message_type = _PROOF -_GETIDENTITIESBYPUBLICKEYHASHESRESPONSE_GETIDENTITIESBYPUBLICKEYHASHESRESPONSEV0.fields_by_name['metadata'].message_type = _RESPONSEMETADATA -_GETIDENTITIESBYPUBLICKEYHASHESRESPONSE_GETIDENTITIESBYPUBLICKEYHASHESRESPONSEV0.containing_type = _GETIDENTITIESBYPUBLICKEYHASHESRESPONSE -_GETIDENTITIESBYPUBLICKEYHASHESRESPONSE_GETIDENTITIESBYPUBLICKEYHASHESRESPONSEV0.oneofs_by_name['result'].fields.append( - _GETIDENTITIESBYPUBLICKEYHASHESRESPONSE_GETIDENTITIESBYPUBLICKEYHASHESRESPONSEV0.fields_by_name['identities']) -_GETIDENTITIESBYPUBLICKEYHASHESRESPONSE_GETIDENTITIESBYPUBLICKEYHASHESRESPONSEV0.fields_by_name['identities'].containing_oneof = _GETIDENTITIESBYPUBLICKEYHASHESRESPONSE_GETIDENTITIESBYPUBLICKEYHASHESRESPONSEV0.oneofs_by_name['result'] -_GETIDENTITIESBYPUBLICKEYHASHESRESPONSE_GETIDENTITIESBYPUBLICKEYHASHESRESPONSEV0.oneofs_by_name['result'].fields.append( - _GETIDENTITIESBYPUBLICKEYHASHESRESPONSE_GETIDENTITIESBYPUBLICKEYHASHESRESPONSEV0.fields_by_name['proof']) -_GETIDENTITIESBYPUBLICKEYHASHESRESPONSE_GETIDENTITIESBYPUBLICKEYHASHESRESPONSEV0.fields_by_name['proof'].containing_oneof = _GETIDENTITIESBYPUBLICKEYHASHESRESPONSE_GETIDENTITIESBYPUBLICKEYHASHESRESPONSEV0.oneofs_by_name['result'] -_GETIDENTITIESBYPUBLICKEYHASHESRESPONSE.fields_by_name['v0'].message_type = _GETIDENTITIESBYPUBLICKEYHASHESRESPONSE_GETIDENTITIESBYPUBLICKEYHASHESRESPONSEV0 -_GETIDENTITIESBYPUBLICKEYHASHESRESPONSE.oneofs_by_name['version'].fields.append( - _GETIDENTITIESBYPUBLICKEYHASHESRESPONSE.fields_by_name['v0']) -_GETIDENTITIESBYPUBLICKEYHASHESRESPONSE.fields_by_name['v0'].containing_oneof = _GETIDENTITIESBYPUBLICKEYHASHESRESPONSE.oneofs_by_name['version'] _GETIDENTITYBYPUBLICKEYHASHREQUEST_GETIDENTITYBYPUBLICKEYHASHREQUESTV0.containing_type = _GETIDENTITYBYPUBLICKEYHASHREQUEST _GETIDENTITYBYPUBLICKEYHASHREQUEST.fields_by_name['v0'].message_type = _GETIDENTITYBYPUBLICKEYHASHREQUEST_GETIDENTITYBYPUBLICKEYHASHREQUESTV0 _GETIDENTITYBYPUBLICKEYHASHREQUEST.oneofs_by_name['version'].fields.append( @@ -5248,8 +5079,6 @@ DESCRIPTOR.message_types_by_name['GetIdentityBalanceRequest'] = _GETIDENTITYBALANCEREQUEST DESCRIPTOR.message_types_by_name['GetIdentityBalanceAndRevisionRequest'] = _GETIDENTITYBALANCEANDREVISIONREQUEST DESCRIPTOR.message_types_by_name['GetIdentityResponse'] = _GETIDENTITYRESPONSE -DESCRIPTOR.message_types_by_name['GetIdentitiesRequest'] = _GETIDENTITIESREQUEST -DESCRIPTOR.message_types_by_name['GetIdentitiesResponse'] = _GETIDENTITIESRESPONSE DESCRIPTOR.message_types_by_name['GetIdentityNonceResponse'] = _GETIDENTITYNONCERESPONSE DESCRIPTOR.message_types_by_name['GetIdentityContractNonceResponse'] = _GETIDENTITYCONTRACTNONCERESPONSE DESCRIPTOR.message_types_by_name['GetIdentityBalanceResponse'] = _GETIDENTITYBALANCERESPONSE @@ -5261,6 +5090,8 @@ DESCRIPTOR.message_types_by_name['SecurityLevelMap'] = _SECURITYLEVELMAP DESCRIPTOR.message_types_by_name['GetIdentityKeysRequest'] = _GETIDENTITYKEYSREQUEST DESCRIPTOR.message_types_by_name['GetIdentityKeysResponse'] = _GETIDENTITYKEYSRESPONSE +DESCRIPTOR.message_types_by_name['GetIdentitiesContractKeysRequest'] = _GETIDENTITIESCONTRACTKEYSREQUEST +DESCRIPTOR.message_types_by_name['GetIdentitiesContractKeysResponse'] = _GETIDENTITIESCONTRACTKEYSRESPONSE DESCRIPTOR.message_types_by_name['GetProofsRequest'] = _GETPROOFSREQUEST DESCRIPTOR.message_types_by_name['GetProofsResponse'] = _GETPROOFSRESPONSE DESCRIPTOR.message_types_by_name['GetDataContractRequest'] = _GETDATACONTRACTREQUEST @@ -5271,8 +5102,6 @@ DESCRIPTOR.message_types_by_name['GetDataContractHistoryResponse'] = _GETDATACONTRACTHISTORYRESPONSE DESCRIPTOR.message_types_by_name['GetDocumentsRequest'] = _GETDOCUMENTSREQUEST DESCRIPTOR.message_types_by_name['GetDocumentsResponse'] = _GETDOCUMENTSRESPONSE -DESCRIPTOR.message_types_by_name['GetIdentitiesByPublicKeyHashesRequest'] = _GETIDENTITIESBYPUBLICKEYHASHESREQUEST -DESCRIPTOR.message_types_by_name['GetIdentitiesByPublicKeyHashesResponse'] = _GETIDENTITIESBYPUBLICKEYHASHESRESPONSE DESCRIPTOR.message_types_by_name['GetIdentityByPublicKeyHashRequest'] = _GETIDENTITYBYPUBLICKEYHASHREQUEST DESCRIPTOR.message_types_by_name['GetIdentityByPublicKeyHashResponse'] = _GETIDENTITYBYPUBLICKEYHASHRESPONSE DESCRIPTOR.message_types_by_name['WaitForStateTransitionResultRequest'] = _WAITFORSTATETRANSITIONRESULTREQUEST @@ -5287,6 +5116,7 @@ DESCRIPTOR.message_types_by_name['GetEpochsInfoResponse'] = _GETEPOCHSINFORESPONSE DESCRIPTOR.message_types_by_name['GetPathElementsRequest'] = _GETPATHELEMENTSREQUEST DESCRIPTOR.message_types_by_name['GetPathElementsResponse'] = _GETPATHELEMENTSRESPONSE +DESCRIPTOR.enum_types_by_name['KeyPurpose'] = _KEYPURPOSE _sym_db.RegisterFileDescriptor(DESCRIPTOR) Proof = _reflection.GeneratedProtocolMessageType('Proof', (_message.Message,), { @@ -5414,60 +5244,6 @@ _sym_db.RegisterMessage(GetIdentityResponse) _sym_db.RegisterMessage(GetIdentityResponse.GetIdentityResponseV0) -GetIdentitiesRequest = _reflection.GeneratedProtocolMessageType('GetIdentitiesRequest', (_message.Message,), { - - 'GetIdentitiesRequestV0' : _reflection.GeneratedProtocolMessageType('GetIdentitiesRequestV0', (_message.Message,), { - 'DESCRIPTOR' : _GETIDENTITIESREQUEST_GETIDENTITIESREQUESTV0, - '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0) - }) - , - 'DESCRIPTOR' : _GETIDENTITIESREQUEST, - '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesRequest) - }) -_sym_db.RegisterMessage(GetIdentitiesRequest) -_sym_db.RegisterMessage(GetIdentitiesRequest.GetIdentitiesRequestV0) - -GetIdentitiesResponse = _reflection.GeneratedProtocolMessageType('GetIdentitiesResponse', (_message.Message,), { - - 'IdentityValue' : _reflection.GeneratedProtocolMessageType('IdentityValue', (_message.Message,), { - 'DESCRIPTOR' : _GETIDENTITIESRESPONSE_IDENTITYVALUE, - '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue) - }) - , - - 'IdentityEntry' : _reflection.GeneratedProtocolMessageType('IdentityEntry', (_message.Message,), { - 'DESCRIPTOR' : _GETIDENTITIESRESPONSE_IDENTITYENTRY, - '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry) - }) - , - - 'Identities' : _reflection.GeneratedProtocolMessageType('Identities', (_message.Message,), { - 'DESCRIPTOR' : _GETIDENTITIESRESPONSE_IDENTITIES, - '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities) - }) - , - - 'GetIdentitiesResponseV0' : _reflection.GeneratedProtocolMessageType('GetIdentitiesResponseV0', (_message.Message,), { - 'DESCRIPTOR' : _GETIDENTITIESRESPONSE_GETIDENTITIESRESPONSEV0, - '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0) - }) - , - 'DESCRIPTOR' : _GETIDENTITIESRESPONSE, - '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesResponse) - }) -_sym_db.RegisterMessage(GetIdentitiesResponse) -_sym_db.RegisterMessage(GetIdentitiesResponse.IdentityValue) -_sym_db.RegisterMessage(GetIdentitiesResponse.IdentityEntry) -_sym_db.RegisterMessage(GetIdentitiesResponse.Identities) -_sym_db.RegisterMessage(GetIdentitiesResponse.GetIdentitiesResponseV0) - GetIdentityNonceResponse = _reflection.GeneratedProtocolMessageType('GetIdentityNonceResponse', (_message.Message,), { 'GetIdentityNonceResponseV0' : _reflection.GeneratedProtocolMessageType('GetIdentityNonceResponseV0', (_message.Message,), { @@ -5625,6 +5401,60 @@ _sym_db.RegisterMessage(GetIdentityKeysResponse.GetIdentityKeysResponseV0) _sym_db.RegisterMessage(GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys) +GetIdentitiesContractKeysRequest = _reflection.GeneratedProtocolMessageType('GetIdentitiesContractKeysRequest', (_message.Message,), { + + 'GetIdentitiesContractKeysRequestV0' : _reflection.GeneratedProtocolMessageType('GetIdentitiesContractKeysRequestV0', (_message.Message,), { + 'DESCRIPTOR' : _GETIDENTITIESCONTRACTKEYSREQUEST_GETIDENTITIESCONTRACTKEYSREQUESTV0, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0) + }) + , + 'DESCRIPTOR' : _GETIDENTITIESCONTRACTKEYSREQUEST, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest) + }) +_sym_db.RegisterMessage(GetIdentitiesContractKeysRequest) +_sym_db.RegisterMessage(GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0) + +GetIdentitiesContractKeysResponse = _reflection.GeneratedProtocolMessageType('GetIdentitiesContractKeysResponse', (_message.Message,), { + + 'GetIdentitiesContractKeysResponseV0' : _reflection.GeneratedProtocolMessageType('GetIdentitiesContractKeysResponseV0', (_message.Message,), { + + 'PurposeKeys' : _reflection.GeneratedProtocolMessageType('PurposeKeys', (_message.Message,), { + 'DESCRIPTOR' : _GETIDENTITIESCONTRACTKEYSRESPONSE_GETIDENTITIESCONTRACTKEYSRESPONSEV0_PURPOSEKEYS, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys) + }) + , + + 'IdentityKeys' : _reflection.GeneratedProtocolMessageType('IdentityKeys', (_message.Message,), { + 'DESCRIPTOR' : _GETIDENTITIESCONTRACTKEYSRESPONSE_GETIDENTITIESCONTRACTKEYSRESPONSEV0_IDENTITYKEYS, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys) + }) + , + + 'IdentitiesKeys' : _reflection.GeneratedProtocolMessageType('IdentitiesKeys', (_message.Message,), { + 'DESCRIPTOR' : _GETIDENTITIESCONTRACTKEYSRESPONSE_GETIDENTITIESCONTRACTKEYSRESPONSEV0_IDENTITIESKEYS, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys) + }) + , + 'DESCRIPTOR' : _GETIDENTITIESCONTRACTKEYSRESPONSE_GETIDENTITIESCONTRACTKEYSRESPONSEV0, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0) + }) + , + 'DESCRIPTOR' : _GETIDENTITIESCONTRACTKEYSRESPONSE, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse) + }) +_sym_db.RegisterMessage(GetIdentitiesContractKeysResponse) +_sym_db.RegisterMessage(GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0) +_sym_db.RegisterMessage(GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys) +_sym_db.RegisterMessage(GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys) +_sym_db.RegisterMessage(GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys) + GetProofsRequest = _reflection.GeneratedProtocolMessageType('GetProofsRequest', (_message.Message,), { 'GetProofsRequestV0' : _reflection.GeneratedProtocolMessageType('GetProofsRequestV0', (_message.Message,), { @@ -5839,52 +5669,6 @@ _sym_db.RegisterMessage(GetDocumentsResponse.GetDocumentsResponseV0) _sym_db.RegisterMessage(GetDocumentsResponse.GetDocumentsResponseV0.Documents) -GetIdentitiesByPublicKeyHashesRequest = _reflection.GeneratedProtocolMessageType('GetIdentitiesByPublicKeyHashesRequest', (_message.Message,), { - - 'GetIdentitiesByPublicKeyHashesRequestV0' : _reflection.GeneratedProtocolMessageType('GetIdentitiesByPublicKeyHashesRequestV0', (_message.Message,), { - 'DESCRIPTOR' : _GETIDENTITIESBYPUBLICKEYHASHESREQUEST_GETIDENTITIESBYPUBLICKEYHASHESREQUESTV0, - '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0) - }) - , - 'DESCRIPTOR' : _GETIDENTITIESBYPUBLICKEYHASHESREQUEST, - '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest) - }) -_sym_db.RegisterMessage(GetIdentitiesByPublicKeyHashesRequest) -_sym_db.RegisterMessage(GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0) - -GetIdentitiesByPublicKeyHashesResponse = _reflection.GeneratedProtocolMessageType('GetIdentitiesByPublicKeyHashesResponse', (_message.Message,), { - - 'PublicKeyHashIdentityEntry' : _reflection.GeneratedProtocolMessageType('PublicKeyHashIdentityEntry', (_message.Message,), { - 'DESCRIPTOR' : _GETIDENTITIESBYPUBLICKEYHASHESRESPONSE_PUBLICKEYHASHIDENTITYENTRY, - '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry) - }) - , - - 'IdentitiesByPublicKeyHashes' : _reflection.GeneratedProtocolMessageType('IdentitiesByPublicKeyHashes', (_message.Message,), { - 'DESCRIPTOR' : _GETIDENTITIESBYPUBLICKEYHASHESRESPONSE_IDENTITIESBYPUBLICKEYHASHES, - '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes) - }) - , - - 'GetIdentitiesByPublicKeyHashesResponseV0' : _reflection.GeneratedProtocolMessageType('GetIdentitiesByPublicKeyHashesResponseV0', (_message.Message,), { - 'DESCRIPTOR' : _GETIDENTITIESBYPUBLICKEYHASHESRESPONSE_GETIDENTITIESBYPUBLICKEYHASHESRESPONSEV0, - '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0) - }) - , - 'DESCRIPTOR' : _GETIDENTITIESBYPUBLICKEYHASHESRESPONSE, - '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse) - }) -_sym_db.RegisterMessage(GetIdentitiesByPublicKeyHashesResponse) -_sym_db.RegisterMessage(GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry) -_sym_db.RegisterMessage(GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes) -_sym_db.RegisterMessage(GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0) - GetIdentityByPublicKeyHashRequest = _reflection.GeneratedProtocolMessageType('GetIdentityByPublicKeyHashRequest', (_message.Message,), { 'GetIdentityByPublicKeyHashRequestV0' : _reflection.GeneratedProtocolMessageType('GetIdentityByPublicKeyHashRequestV0', (_message.Message,), { @@ -6178,8 +5962,8 @@ index=0, serialized_options=None, create_key=_descriptor._internal_create_key, - serialized_start=16320, - serialized_end=19215, + serialized_start=15896, + serialized_end=18660, methods=[ _descriptor.MethodDescriptor( name='broadcastStateTransition', @@ -6202,22 +5986,22 @@ create_key=_descriptor._internal_create_key, ), _descriptor.MethodDescriptor( - name='getIdentities', - full_name='org.dash.platform.dapi.v0.Platform.getIdentities', + name='getIdentityKeys', + full_name='org.dash.platform.dapi.v0.Platform.getIdentityKeys', index=2, containing_service=None, - input_type=_GETIDENTITIESREQUEST, - output_type=_GETIDENTITIESRESPONSE, + input_type=_GETIDENTITYKEYSREQUEST, + output_type=_GETIDENTITYKEYSRESPONSE, serialized_options=None, create_key=_descriptor._internal_create_key, ), _descriptor.MethodDescriptor( - name='getIdentityKeys', - full_name='org.dash.platform.dapi.v0.Platform.getIdentityKeys', + name='getIdentitiesContractKeys', + full_name='org.dash.platform.dapi.v0.Platform.getIdentitiesContractKeys', index=3, containing_service=None, - input_type=_GETIDENTITYKEYSREQUEST, - output_type=_GETIDENTITYKEYSRESPONSE, + input_type=_GETIDENTITIESCONTRACTKEYSREQUEST, + output_type=_GETIDENTITIESCONTRACTKEYSRESPONSE, serialized_options=None, create_key=_descriptor._internal_create_key, ), @@ -6311,20 +6095,10 @@ serialized_options=None, create_key=_descriptor._internal_create_key, ), - _descriptor.MethodDescriptor( - name='getIdentitiesByPublicKeyHashes', - full_name='org.dash.platform.dapi.v0.Platform.getIdentitiesByPublicKeyHashes', - index=13, - containing_service=None, - input_type=_GETIDENTITIESBYPUBLICKEYHASHESREQUEST, - output_type=_GETIDENTITIESBYPUBLICKEYHASHESRESPONSE, - serialized_options=None, - create_key=_descriptor._internal_create_key, - ), _descriptor.MethodDescriptor( name='getIdentityByPublicKeyHash', full_name='org.dash.platform.dapi.v0.Platform.getIdentityByPublicKeyHash', - index=14, + index=13, containing_service=None, input_type=_GETIDENTITYBYPUBLICKEYHASHREQUEST, output_type=_GETIDENTITYBYPUBLICKEYHASHRESPONSE, @@ -6334,7 +6108,7 @@ _descriptor.MethodDescriptor( name='waitForStateTransitionResult', full_name='org.dash.platform.dapi.v0.Platform.waitForStateTransitionResult', - index=15, + index=14, containing_service=None, input_type=_WAITFORSTATETRANSITIONRESULTREQUEST, output_type=_WAITFORSTATETRANSITIONRESULTRESPONSE, @@ -6344,7 +6118,7 @@ _descriptor.MethodDescriptor( name='getConsensusParams', full_name='org.dash.platform.dapi.v0.Platform.getConsensusParams', - index=16, + index=15, containing_service=None, input_type=_GETCONSENSUSPARAMSREQUEST, output_type=_GETCONSENSUSPARAMSRESPONSE, @@ -6354,7 +6128,7 @@ _descriptor.MethodDescriptor( name='getProtocolVersionUpgradeState', full_name='org.dash.platform.dapi.v0.Platform.getProtocolVersionUpgradeState', - index=17, + index=16, containing_service=None, input_type=_GETPROTOCOLVERSIONUPGRADESTATEREQUEST, output_type=_GETPROTOCOLVERSIONUPGRADESTATERESPONSE, @@ -6364,7 +6138,7 @@ _descriptor.MethodDescriptor( name='getProtocolVersionUpgradeVoteStatus', full_name='org.dash.platform.dapi.v0.Platform.getProtocolVersionUpgradeVoteStatus', - index=18, + index=17, containing_service=None, input_type=_GETPROTOCOLVERSIONUPGRADEVOTESTATUSREQUEST, output_type=_GETPROTOCOLVERSIONUPGRADEVOTESTATUSRESPONSE, @@ -6374,7 +6148,7 @@ _descriptor.MethodDescriptor( name='getEpochsInfo', full_name='org.dash.platform.dapi.v0.Platform.getEpochsInfo', - index=19, + index=18, containing_service=None, input_type=_GETEPOCHSINFOREQUEST, output_type=_GETEPOCHSINFORESPONSE, @@ -6384,7 +6158,7 @@ _descriptor.MethodDescriptor( name='getPathElements', full_name='org.dash.platform.dapi.v0.Platform.getPathElements', - index=20, + index=19, containing_service=None, input_type=_GETPATHELEMENTSREQUEST, output_type=_GETPATHELEMENTSRESPONSE, diff --git a/packages/dapi-grpc/clients/platform/v0/python/platform_pb2_grpc.py b/packages/dapi-grpc/clients/platform/v0/python/platform_pb2_grpc.py index e164f15e68..1abfa77d1d 100644 --- a/packages/dapi-grpc/clients/platform/v0/python/platform_pb2_grpc.py +++ b/packages/dapi-grpc/clients/platform/v0/python/platform_pb2_grpc.py @@ -24,16 +24,16 @@ def __init__(self, channel): request_serializer=platform__pb2.GetIdentityRequest.SerializeToString, response_deserializer=platform__pb2.GetIdentityResponse.FromString, ) - self.getIdentities = channel.unary_unary( - '/org.dash.platform.dapi.v0.Platform/getIdentities', - request_serializer=platform__pb2.GetIdentitiesRequest.SerializeToString, - response_deserializer=platform__pb2.GetIdentitiesResponse.FromString, - ) self.getIdentityKeys = channel.unary_unary( '/org.dash.platform.dapi.v0.Platform/getIdentityKeys', request_serializer=platform__pb2.GetIdentityKeysRequest.SerializeToString, response_deserializer=platform__pb2.GetIdentityKeysResponse.FromString, ) + self.getIdentitiesContractKeys = channel.unary_unary( + '/org.dash.platform.dapi.v0.Platform/getIdentitiesContractKeys', + request_serializer=platform__pb2.GetIdentitiesContractKeysRequest.SerializeToString, + response_deserializer=platform__pb2.GetIdentitiesContractKeysResponse.FromString, + ) self.getIdentityNonce = channel.unary_unary( '/org.dash.platform.dapi.v0.Platform/getIdentityNonce', request_serializer=platform__pb2.GetIdentityNonceRequest.SerializeToString, @@ -79,11 +79,6 @@ def __init__(self, channel): request_serializer=platform__pb2.GetDocumentsRequest.SerializeToString, response_deserializer=platform__pb2.GetDocumentsResponse.FromString, ) - self.getIdentitiesByPublicKeyHashes = channel.unary_unary( - '/org.dash.platform.dapi.v0.Platform/getIdentitiesByPublicKeyHashes', - request_serializer=platform__pb2.GetIdentitiesByPublicKeyHashesRequest.SerializeToString, - response_deserializer=platform__pb2.GetIdentitiesByPublicKeyHashesResponse.FromString, - ) self.getIdentityByPublicKeyHash = channel.unary_unary( '/org.dash.platform.dapi.v0.Platform/getIdentityByPublicKeyHash', request_serializer=platform__pb2.GetIdentityByPublicKeyHashRequest.SerializeToString, @@ -136,13 +131,13 @@ def getIdentity(self, request, context): context.set_details('Method not implemented!') raise NotImplementedError('Method not implemented!') - def getIdentities(self, request, context): + def getIdentityKeys(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) context.set_details('Method not implemented!') raise NotImplementedError('Method not implemented!') - def getIdentityKeys(self, request, context): + def getIdentitiesContractKeys(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) context.set_details('Method not implemented!') @@ -202,12 +197,6 @@ def getDocuments(self, request, context): context.set_details('Method not implemented!') raise NotImplementedError('Method not implemented!') - def getIdentitiesByPublicKeyHashes(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - def getIdentityByPublicKeyHash(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) @@ -263,16 +252,16 @@ def add_PlatformServicer_to_server(servicer, server): request_deserializer=platform__pb2.GetIdentityRequest.FromString, response_serializer=platform__pb2.GetIdentityResponse.SerializeToString, ), - 'getIdentities': grpc.unary_unary_rpc_method_handler( - servicer.getIdentities, - request_deserializer=platform__pb2.GetIdentitiesRequest.FromString, - response_serializer=platform__pb2.GetIdentitiesResponse.SerializeToString, - ), 'getIdentityKeys': grpc.unary_unary_rpc_method_handler( servicer.getIdentityKeys, request_deserializer=platform__pb2.GetIdentityKeysRequest.FromString, response_serializer=platform__pb2.GetIdentityKeysResponse.SerializeToString, ), + 'getIdentitiesContractKeys': grpc.unary_unary_rpc_method_handler( + servicer.getIdentitiesContractKeys, + request_deserializer=platform__pb2.GetIdentitiesContractKeysRequest.FromString, + response_serializer=platform__pb2.GetIdentitiesContractKeysResponse.SerializeToString, + ), 'getIdentityNonce': grpc.unary_unary_rpc_method_handler( servicer.getIdentityNonce, request_deserializer=platform__pb2.GetIdentityNonceRequest.FromString, @@ -318,11 +307,6 @@ def add_PlatformServicer_to_server(servicer, server): request_deserializer=platform__pb2.GetDocumentsRequest.FromString, response_serializer=platform__pb2.GetDocumentsResponse.SerializeToString, ), - 'getIdentitiesByPublicKeyHashes': grpc.unary_unary_rpc_method_handler( - servicer.getIdentitiesByPublicKeyHashes, - request_deserializer=platform__pb2.GetIdentitiesByPublicKeyHashesRequest.FromString, - response_serializer=platform__pb2.GetIdentitiesByPublicKeyHashesResponse.SerializeToString, - ), 'getIdentityByPublicKeyHash': grpc.unary_unary_rpc_method_handler( servicer.getIdentityByPublicKeyHash, request_deserializer=platform__pb2.GetIdentityByPublicKeyHashRequest.FromString, @@ -403,7 +387,7 @@ def getIdentity(request, insecure, call_credentials, compression, wait_for_ready, timeout, metadata) @staticmethod - def getIdentities(request, + def getIdentityKeys(request, target, options=(), channel_credentials=None, @@ -413,14 +397,14 @@ def getIdentities(request, wait_for_ready=None, timeout=None, metadata=None): - return grpc.experimental.unary_unary(request, target, '/org.dash.platform.dapi.v0.Platform/getIdentities', - platform__pb2.GetIdentitiesRequest.SerializeToString, - platform__pb2.GetIdentitiesResponse.FromString, + return grpc.experimental.unary_unary(request, target, '/org.dash.platform.dapi.v0.Platform/getIdentityKeys', + platform__pb2.GetIdentityKeysRequest.SerializeToString, + platform__pb2.GetIdentityKeysResponse.FromString, options, channel_credentials, insecure, call_credentials, compression, wait_for_ready, timeout, metadata) @staticmethod - def getIdentityKeys(request, + def getIdentitiesContractKeys(request, target, options=(), channel_credentials=None, @@ -430,9 +414,9 @@ def getIdentityKeys(request, wait_for_ready=None, timeout=None, metadata=None): - return grpc.experimental.unary_unary(request, target, '/org.dash.platform.dapi.v0.Platform/getIdentityKeys', - platform__pb2.GetIdentityKeysRequest.SerializeToString, - platform__pb2.GetIdentityKeysResponse.FromString, + return grpc.experimental.unary_unary(request, target, '/org.dash.platform.dapi.v0.Platform/getIdentitiesContractKeys', + platform__pb2.GetIdentitiesContractKeysRequest.SerializeToString, + platform__pb2.GetIdentitiesContractKeysResponse.FromString, options, channel_credentials, insecure, call_credentials, compression, wait_for_ready, timeout, metadata) @@ -589,23 +573,6 @@ def getDocuments(request, options, channel_credentials, insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - @staticmethod - def getIdentitiesByPublicKeyHashes(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/org.dash.platform.dapi.v0.Platform/getIdentitiesByPublicKeyHashes', - platform__pb2.GetIdentitiesByPublicKeyHashesRequest.SerializeToString, - platform__pb2.GetIdentitiesByPublicKeyHashesResponse.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - @staticmethod def getIdentityByPublicKeyHash(request, target, diff --git a/packages/dapi-grpc/clients/platform/v0/web/PlatformPromiseClient.js b/packages/dapi-grpc/clients/platform/v0/web/PlatformPromiseClient.js index 2d14532505..9805cd84ff 100644 --- a/packages/dapi-grpc/clients/platform/v0/web/PlatformPromiseClient.js +++ b/packages/dapi-grpc/clients/platform/v0/web/PlatformPromiseClient.js @@ -7,8 +7,8 @@ class PlatformPromiseClient { * @param {?Object} credentials * @param {?Object} options */ - constructor(hostname, credentials , options = {}) { - this.client = new PlatformClient(hostname, options) + constructor(hostname, credentials, options = {}) { + this.client = new PlatformClient(hostname, options); this.protocolVersion = undefined; } @@ -41,6 +41,20 @@ class PlatformPromiseClient { ); } + /** + * @param {!GetIdentitiesContractKeysRequest} getIdentitiesContractKeysRequest + * @param {?Object} metadata + * @return {Promise} + */ + getIdentitiesContractKeys(getIdentitiesContractKeysRequest, metadata = {}) { + return promisify( + this.client.getIdentitiesContractKeys.bind(this.client), + )( + getIdentitiesContractKeysRequest, + metadata, + ); + } + /** * * @param {!GetDataContractRequest} getDataContractRequest @@ -87,17 +101,17 @@ class PlatformPromiseClient { } /** - * @param {!GetIdentitiesByPublicKeyHashesRequest} getIdentitiesByPublicKeyHashesRequest + * @param {!GetIdentityByPublicKeyHash} getIdentityByPublicKeyHashRequest * @param {?Object} metadata - * @returns {Promise} + * @returns {Promise} */ - getIdentitiesByPublicKeyHashes( - getIdentitiesByPublicKeyHashesRequest, metadata = {} + getIdentityByPublicKeyHash( + getIdentityByPublicKeyHashRequest, metadata = {} ) { return promisify( - this.client.getIdentitiesByPublicKeyHashes.bind(this.client), + this.client.getIdentityByPublicKeyHash.bind(this.client), )( - getIdentitiesByPublicKeyHashesRequest, + getIdentityByPublicKeyHashRequest, metadata, ); } diff --git a/packages/dapi-grpc/clients/platform/v0/web/platform_pb.d.ts b/packages/dapi-grpc/clients/platform/v0/web/platform_pb.d.ts index 8e30e8127a..db12d1300f 100644 --- a/packages/dapi-grpc/clients/platform/v0/web/platform_pb.d.ts +++ b/packages/dapi-grpc/clients/platform/v0/web/platform_pb.d.ts @@ -509,203 +509,6 @@ export namespace GetIdentityResponse { } } -export class GetIdentitiesRequest extends jspb.Message { - hasV0(): boolean; - clearV0(): void; - getV0(): GetIdentitiesRequest.GetIdentitiesRequestV0 | undefined; - setV0(value?: GetIdentitiesRequest.GetIdentitiesRequestV0): void; - - getVersionCase(): GetIdentitiesRequest.VersionCase; - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): GetIdentitiesRequest.AsObject; - static toObject(includeInstance: boolean, msg: GetIdentitiesRequest): GetIdentitiesRequest.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; - static serializeBinaryToWriter(message: GetIdentitiesRequest, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): GetIdentitiesRequest; - static deserializeBinaryFromReader(message: GetIdentitiesRequest, reader: jspb.BinaryReader): GetIdentitiesRequest; -} - -export namespace GetIdentitiesRequest { - export type AsObject = { - v0?: GetIdentitiesRequest.GetIdentitiesRequestV0.AsObject, - } - - export class GetIdentitiesRequestV0 extends jspb.Message { - clearIdsList(): void; - getIdsList(): Array; - getIdsList_asU8(): Array; - getIdsList_asB64(): Array; - setIdsList(value: Array): void; - addIds(value: Uint8Array | string, index?: number): Uint8Array | string; - - getProve(): boolean; - setProve(value: boolean): void; - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): GetIdentitiesRequestV0.AsObject; - static toObject(includeInstance: boolean, msg: GetIdentitiesRequestV0): GetIdentitiesRequestV0.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; - static serializeBinaryToWriter(message: GetIdentitiesRequestV0, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): GetIdentitiesRequestV0; - static deserializeBinaryFromReader(message: GetIdentitiesRequestV0, reader: jspb.BinaryReader): GetIdentitiesRequestV0; - } - - export namespace GetIdentitiesRequestV0 { - export type AsObject = { - idsList: Array, - prove: boolean, - } - } - - export enum VersionCase { - VERSION_NOT_SET = 0, - V0 = 1, - } -} - -export class GetIdentitiesResponse extends jspb.Message { - hasV0(): boolean; - clearV0(): void; - getV0(): GetIdentitiesResponse.GetIdentitiesResponseV0 | undefined; - setV0(value?: GetIdentitiesResponse.GetIdentitiesResponseV0): void; - - getVersionCase(): GetIdentitiesResponse.VersionCase; - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): GetIdentitiesResponse.AsObject; - static toObject(includeInstance: boolean, msg: GetIdentitiesResponse): GetIdentitiesResponse.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; - static serializeBinaryToWriter(message: GetIdentitiesResponse, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): GetIdentitiesResponse; - static deserializeBinaryFromReader(message: GetIdentitiesResponse, reader: jspb.BinaryReader): GetIdentitiesResponse; -} - -export namespace GetIdentitiesResponse { - export type AsObject = { - v0?: GetIdentitiesResponse.GetIdentitiesResponseV0.AsObject, - } - - export class IdentityValue extends jspb.Message { - getValue(): Uint8Array | string; - getValue_asU8(): Uint8Array; - getValue_asB64(): string; - setValue(value: Uint8Array | string): void; - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): IdentityValue.AsObject; - static toObject(includeInstance: boolean, msg: IdentityValue): IdentityValue.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; - static serializeBinaryToWriter(message: IdentityValue, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): IdentityValue; - static deserializeBinaryFromReader(message: IdentityValue, reader: jspb.BinaryReader): IdentityValue; - } - - export namespace IdentityValue { - export type AsObject = { - value: Uint8Array | string, - } - } - - export class IdentityEntry extends jspb.Message { - getKey(): Uint8Array | string; - getKey_asU8(): Uint8Array; - getKey_asB64(): string; - setKey(value: Uint8Array | string): void; - - hasValue(): boolean; - clearValue(): void; - getValue(): GetIdentitiesResponse.IdentityValue | undefined; - setValue(value?: GetIdentitiesResponse.IdentityValue): void; - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): IdentityEntry.AsObject; - static toObject(includeInstance: boolean, msg: IdentityEntry): IdentityEntry.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; - static serializeBinaryToWriter(message: IdentityEntry, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): IdentityEntry; - static deserializeBinaryFromReader(message: IdentityEntry, reader: jspb.BinaryReader): IdentityEntry; - } - - export namespace IdentityEntry { - export type AsObject = { - key: Uint8Array | string, - value?: GetIdentitiesResponse.IdentityValue.AsObject, - } - } - - export class Identities extends jspb.Message { - clearIdentityEntriesList(): void; - getIdentityEntriesList(): Array; - setIdentityEntriesList(value: Array): void; - addIdentityEntries(value?: GetIdentitiesResponse.IdentityEntry, index?: number): GetIdentitiesResponse.IdentityEntry; - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): Identities.AsObject; - static toObject(includeInstance: boolean, msg: Identities): Identities.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; - static serializeBinaryToWriter(message: Identities, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): Identities; - static deserializeBinaryFromReader(message: Identities, reader: jspb.BinaryReader): Identities; - } - - export namespace Identities { - export type AsObject = { - identityEntriesList: Array, - } - } - - export class GetIdentitiesResponseV0 extends jspb.Message { - hasIdentities(): boolean; - clearIdentities(): void; - getIdentities(): GetIdentitiesResponse.Identities | undefined; - setIdentities(value?: GetIdentitiesResponse.Identities): void; - - hasProof(): boolean; - clearProof(): void; - getProof(): Proof | undefined; - setProof(value?: Proof): void; - - hasMetadata(): boolean; - clearMetadata(): void; - getMetadata(): ResponseMetadata | undefined; - setMetadata(value?: ResponseMetadata): void; - - getResultCase(): GetIdentitiesResponseV0.ResultCase; - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): GetIdentitiesResponseV0.AsObject; - static toObject(includeInstance: boolean, msg: GetIdentitiesResponseV0): GetIdentitiesResponseV0.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; - static serializeBinaryToWriter(message: GetIdentitiesResponseV0, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): GetIdentitiesResponseV0; - static deserializeBinaryFromReader(message: GetIdentitiesResponseV0, reader: jspb.BinaryReader): GetIdentitiesResponseV0; - } - - export namespace GetIdentitiesResponseV0 { - export type AsObject = { - identities?: GetIdentitiesResponse.Identities.AsObject, - proof?: Proof.AsObject, - metadata?: ResponseMetadata.AsObject, - } - - export enum ResultCase { - RESULT_NOT_SET = 0, - IDENTITIES = 1, - PROOF = 2, - } - } - - export enum VersionCase { - VERSION_NOT_SET = 0, - V0 = 1, - } -} - export class GetIdentityNonceResponse extends jspb.Message { hasV0(): boolean; clearV0(): void; @@ -1296,6 +1099,227 @@ export namespace GetIdentityKeysResponse { } } +export class GetIdentitiesContractKeysRequest extends jspb.Message { + hasV0(): boolean; + clearV0(): void; + getV0(): GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0 | undefined; + setV0(value?: GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0): void; + + getVersionCase(): GetIdentitiesContractKeysRequest.VersionCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetIdentitiesContractKeysRequest.AsObject; + static toObject(includeInstance: boolean, msg: GetIdentitiesContractKeysRequest): GetIdentitiesContractKeysRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: GetIdentitiesContractKeysRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetIdentitiesContractKeysRequest; + static deserializeBinaryFromReader(message: GetIdentitiesContractKeysRequest, reader: jspb.BinaryReader): GetIdentitiesContractKeysRequest; +} + +export namespace GetIdentitiesContractKeysRequest { + export type AsObject = { + v0?: GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.AsObject, + } + + export class GetIdentitiesContractKeysRequestV0 extends jspb.Message { + clearIdentitiesIdsList(): void; + getIdentitiesIdsList(): Array; + getIdentitiesIdsList_asU8(): Array; + getIdentitiesIdsList_asB64(): Array; + setIdentitiesIdsList(value: Array): void; + addIdentitiesIds(value: Uint8Array | string, index?: number): Uint8Array | string; + + getContractId(): Uint8Array | string; + getContractId_asU8(): Uint8Array; + getContractId_asB64(): string; + setContractId(value: Uint8Array | string): void; + + hasDocumentTypeName(): boolean; + clearDocumentTypeName(): void; + getDocumentTypeName(): string; + setDocumentTypeName(value: string): void; + + clearPurposesList(): void; + getPurposesList(): Array; + setPurposesList(value: Array): void; + addPurposes(value: KeyPurposeMap[keyof KeyPurposeMap], index?: number): KeyPurposeMap[keyof KeyPurposeMap]; + + getProve(): boolean; + setProve(value: boolean): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetIdentitiesContractKeysRequestV0.AsObject; + static toObject(includeInstance: boolean, msg: GetIdentitiesContractKeysRequestV0): GetIdentitiesContractKeysRequestV0.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: GetIdentitiesContractKeysRequestV0, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetIdentitiesContractKeysRequestV0; + static deserializeBinaryFromReader(message: GetIdentitiesContractKeysRequestV0, reader: jspb.BinaryReader): GetIdentitiesContractKeysRequestV0; + } + + export namespace GetIdentitiesContractKeysRequestV0 { + export type AsObject = { + identitiesIdsList: Array, + contractId: Uint8Array | string, + documentTypeName: string, + purposesList: Array, + prove: boolean, + } + } + + export enum VersionCase { + VERSION_NOT_SET = 0, + V0 = 1, + } +} + +export class GetIdentitiesContractKeysResponse extends jspb.Message { + hasV0(): boolean; + clearV0(): void; + getV0(): GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0 | undefined; + setV0(value?: GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0): void; + + getVersionCase(): GetIdentitiesContractKeysResponse.VersionCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetIdentitiesContractKeysResponse.AsObject; + static toObject(includeInstance: boolean, msg: GetIdentitiesContractKeysResponse): GetIdentitiesContractKeysResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: GetIdentitiesContractKeysResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetIdentitiesContractKeysResponse; + static deserializeBinaryFromReader(message: GetIdentitiesContractKeysResponse, reader: jspb.BinaryReader): GetIdentitiesContractKeysResponse; +} + +export namespace GetIdentitiesContractKeysResponse { + export type AsObject = { + v0?: GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.AsObject, + } + + export class GetIdentitiesContractKeysResponseV0 extends jspb.Message { + hasIdentitiesKeys(): boolean; + clearIdentitiesKeys(): void; + getIdentitiesKeys(): GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys | undefined; + setIdentitiesKeys(value?: GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys): void; + + hasProof(): boolean; + clearProof(): void; + getProof(): Proof | undefined; + setProof(value?: Proof): void; + + hasMetadata(): boolean; + clearMetadata(): void; + getMetadata(): ResponseMetadata | undefined; + setMetadata(value?: ResponseMetadata): void; + + getResultCase(): GetIdentitiesContractKeysResponseV0.ResultCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetIdentitiesContractKeysResponseV0.AsObject; + static toObject(includeInstance: boolean, msg: GetIdentitiesContractKeysResponseV0): GetIdentitiesContractKeysResponseV0.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: GetIdentitiesContractKeysResponseV0, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetIdentitiesContractKeysResponseV0; + static deserializeBinaryFromReader(message: GetIdentitiesContractKeysResponseV0, reader: jspb.BinaryReader): GetIdentitiesContractKeysResponseV0; + } + + export namespace GetIdentitiesContractKeysResponseV0 { + export type AsObject = { + identitiesKeys?: GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.AsObject, + proof?: Proof.AsObject, + metadata?: ResponseMetadata.AsObject, + } + + export class PurposeKeys extends jspb.Message { + getPurpose(): KeyPurposeMap[keyof KeyPurposeMap]; + setPurpose(value: KeyPurposeMap[keyof KeyPurposeMap]): void; + + clearKeysBytesList(): void; + getKeysBytesList(): Array; + getKeysBytesList_asU8(): Array; + getKeysBytesList_asB64(): Array; + setKeysBytesList(value: Array): void; + addKeysBytes(value: Uint8Array | string, index?: number): Uint8Array | string; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): PurposeKeys.AsObject; + static toObject(includeInstance: boolean, msg: PurposeKeys): PurposeKeys.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: PurposeKeys, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): PurposeKeys; + static deserializeBinaryFromReader(message: PurposeKeys, reader: jspb.BinaryReader): PurposeKeys; + } + + export namespace PurposeKeys { + export type AsObject = { + purpose: KeyPurposeMap[keyof KeyPurposeMap], + keysBytesList: Array, + } + } + + export class IdentityKeys extends jspb.Message { + getIdentityId(): Uint8Array | string; + getIdentityId_asU8(): Uint8Array; + getIdentityId_asB64(): string; + setIdentityId(value: Uint8Array | string): void; + + clearKeysList(): void; + getKeysList(): Array; + setKeysList(value: Array): void; + addKeys(value?: GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys, index?: number): GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): IdentityKeys.AsObject; + static toObject(includeInstance: boolean, msg: IdentityKeys): IdentityKeys.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: IdentityKeys, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): IdentityKeys; + static deserializeBinaryFromReader(message: IdentityKeys, reader: jspb.BinaryReader): IdentityKeys; + } + + export namespace IdentityKeys { + export type AsObject = { + identityId: Uint8Array | string, + keysList: Array, + } + } + + export class IdentitiesKeys extends jspb.Message { + clearEntriesList(): void; + getEntriesList(): Array; + setEntriesList(value: Array): void; + addEntries(value?: GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys, index?: number): GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): IdentitiesKeys.AsObject; + static toObject(includeInstance: boolean, msg: IdentitiesKeys): IdentitiesKeys.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: IdentitiesKeys, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): IdentitiesKeys; + static deserializeBinaryFromReader(message: IdentitiesKeys, reader: jspb.BinaryReader): IdentitiesKeys; + } + + export namespace IdentitiesKeys { + export type AsObject = { + entriesList: Array, + } + } + + export enum ResultCase { + RESULT_NOT_SET = 0, + IDENTITIES_KEYS = 1, + PROOF = 2, + } + } + + export enum VersionCase { + VERSION_NOT_SET = 0, + V0 = 1, + } +} + export class GetProofsRequest extends jspb.Message { hasV0(): boolean; clearV0(): void; @@ -2190,181 +2214,6 @@ export namespace GetDocumentsResponse { } } -export class GetIdentitiesByPublicKeyHashesRequest extends jspb.Message { - hasV0(): boolean; - clearV0(): void; - getV0(): GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0 | undefined; - setV0(value?: GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0): void; - - getVersionCase(): GetIdentitiesByPublicKeyHashesRequest.VersionCase; - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): GetIdentitiesByPublicKeyHashesRequest.AsObject; - static toObject(includeInstance: boolean, msg: GetIdentitiesByPublicKeyHashesRequest): GetIdentitiesByPublicKeyHashesRequest.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; - static serializeBinaryToWriter(message: GetIdentitiesByPublicKeyHashesRequest, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): GetIdentitiesByPublicKeyHashesRequest; - static deserializeBinaryFromReader(message: GetIdentitiesByPublicKeyHashesRequest, reader: jspb.BinaryReader): GetIdentitiesByPublicKeyHashesRequest; -} - -export namespace GetIdentitiesByPublicKeyHashesRequest { - export type AsObject = { - v0?: GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.AsObject, - } - - export class GetIdentitiesByPublicKeyHashesRequestV0 extends jspb.Message { - clearPublicKeyHashesList(): void; - getPublicKeyHashesList(): Array; - getPublicKeyHashesList_asU8(): Array; - getPublicKeyHashesList_asB64(): Array; - setPublicKeyHashesList(value: Array): void; - addPublicKeyHashes(value: Uint8Array | string, index?: number): Uint8Array | string; - - getProve(): boolean; - setProve(value: boolean): void; - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): GetIdentitiesByPublicKeyHashesRequestV0.AsObject; - static toObject(includeInstance: boolean, msg: GetIdentitiesByPublicKeyHashesRequestV0): GetIdentitiesByPublicKeyHashesRequestV0.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; - static serializeBinaryToWriter(message: GetIdentitiesByPublicKeyHashesRequestV0, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): GetIdentitiesByPublicKeyHashesRequestV0; - static deserializeBinaryFromReader(message: GetIdentitiesByPublicKeyHashesRequestV0, reader: jspb.BinaryReader): GetIdentitiesByPublicKeyHashesRequestV0; - } - - export namespace GetIdentitiesByPublicKeyHashesRequestV0 { - export type AsObject = { - publicKeyHashesList: Array, - prove: boolean, - } - } - - export enum VersionCase { - VERSION_NOT_SET = 0, - V0 = 1, - } -} - -export class GetIdentitiesByPublicKeyHashesResponse extends jspb.Message { - hasV0(): boolean; - clearV0(): void; - getV0(): GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0 | undefined; - setV0(value?: GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0): void; - - getVersionCase(): GetIdentitiesByPublicKeyHashesResponse.VersionCase; - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): GetIdentitiesByPublicKeyHashesResponse.AsObject; - static toObject(includeInstance: boolean, msg: GetIdentitiesByPublicKeyHashesResponse): GetIdentitiesByPublicKeyHashesResponse.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; - static serializeBinaryToWriter(message: GetIdentitiesByPublicKeyHashesResponse, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): GetIdentitiesByPublicKeyHashesResponse; - static deserializeBinaryFromReader(message: GetIdentitiesByPublicKeyHashesResponse, reader: jspb.BinaryReader): GetIdentitiesByPublicKeyHashesResponse; -} - -export namespace GetIdentitiesByPublicKeyHashesResponse { - export type AsObject = { - v0?: GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.AsObject, - } - - export class PublicKeyHashIdentityEntry extends jspb.Message { - getPublicKeyHash(): Uint8Array | string; - getPublicKeyHash_asU8(): Uint8Array; - getPublicKeyHash_asB64(): string; - setPublicKeyHash(value: Uint8Array | string): void; - - hasValue(): boolean; - clearValue(): void; - getValue(): google_protobuf_wrappers_pb.BytesValue | undefined; - setValue(value?: google_protobuf_wrappers_pb.BytesValue): void; - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): PublicKeyHashIdentityEntry.AsObject; - static toObject(includeInstance: boolean, msg: PublicKeyHashIdentityEntry): PublicKeyHashIdentityEntry.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; - static serializeBinaryToWriter(message: PublicKeyHashIdentityEntry, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): PublicKeyHashIdentityEntry; - static deserializeBinaryFromReader(message: PublicKeyHashIdentityEntry, reader: jspb.BinaryReader): PublicKeyHashIdentityEntry; - } - - export namespace PublicKeyHashIdentityEntry { - export type AsObject = { - publicKeyHash: Uint8Array | string, - value?: google_protobuf_wrappers_pb.BytesValue.AsObject, - } - } - - export class IdentitiesByPublicKeyHashes extends jspb.Message { - clearIdentityEntriesList(): void; - getIdentityEntriesList(): Array; - setIdentityEntriesList(value: Array): void; - addIdentityEntries(value?: GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry, index?: number): GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry; - - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): IdentitiesByPublicKeyHashes.AsObject; - static toObject(includeInstance: boolean, msg: IdentitiesByPublicKeyHashes): IdentitiesByPublicKeyHashes.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; - static serializeBinaryToWriter(message: IdentitiesByPublicKeyHashes, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): IdentitiesByPublicKeyHashes; - static deserializeBinaryFromReader(message: IdentitiesByPublicKeyHashes, reader: jspb.BinaryReader): IdentitiesByPublicKeyHashes; - } - - export namespace IdentitiesByPublicKeyHashes { - export type AsObject = { - identityEntriesList: Array, - } - } - - export class GetIdentitiesByPublicKeyHashesResponseV0 extends jspb.Message { - hasIdentities(): boolean; - clearIdentities(): void; - getIdentities(): GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes | undefined; - setIdentities(value?: GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes): void; - - hasProof(): boolean; - clearProof(): void; - getProof(): Proof | undefined; - setProof(value?: Proof): void; - - hasMetadata(): boolean; - clearMetadata(): void; - getMetadata(): ResponseMetadata | undefined; - setMetadata(value?: ResponseMetadata): void; - - getResultCase(): GetIdentitiesByPublicKeyHashesResponseV0.ResultCase; - serializeBinary(): Uint8Array; - toObject(includeInstance?: boolean): GetIdentitiesByPublicKeyHashesResponseV0.AsObject; - static toObject(includeInstance: boolean, msg: GetIdentitiesByPublicKeyHashesResponseV0): GetIdentitiesByPublicKeyHashesResponseV0.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; - static serializeBinaryToWriter(message: GetIdentitiesByPublicKeyHashesResponseV0, writer: jspb.BinaryWriter): void; - static deserializeBinary(bytes: Uint8Array): GetIdentitiesByPublicKeyHashesResponseV0; - static deserializeBinaryFromReader(message: GetIdentitiesByPublicKeyHashesResponseV0, reader: jspb.BinaryReader): GetIdentitiesByPublicKeyHashesResponseV0; - } - - export namespace GetIdentitiesByPublicKeyHashesResponseV0 { - export type AsObject = { - identities?: GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes.AsObject, - proof?: Proof.AsObject, - metadata?: ResponseMetadata.AsObject, - } - - export enum ResultCase { - RESULT_NOT_SET = 0, - IDENTITIES = 1, - PROOF = 2, - } - } - - export enum VersionCase { - VERSION_NOT_SET = 0, - V0 = 1, - } -} - export class GetIdentityByPublicKeyHashRequest extends jspb.Message { hasV0(): boolean; clearV0(): void; @@ -3465,3 +3314,13 @@ export namespace GetPathElementsResponse { } } +export interface KeyPurposeMap { + AUTHENTICATION: 0; + ENCRYPTION: 1; + DECRYPTION: 2; + TRANSFER: 3; + VOTING: 5; +} + +export const KeyPurpose: KeyPurposeMap; + diff --git a/packages/dapi-grpc/clients/platform/v0/web/platform_pb.js b/packages/dapi-grpc/clients/platform/v0/web/platform_pb.js index b30f67af84..f8609dbd8b 100644 --- a/packages/dapi-grpc/clients/platform/v0/web/platform_pb.js +++ b/packages/dapi-grpc/clients/platform/v0/web/platform_pb.js @@ -75,25 +75,16 @@ goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpoc goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.ResultCase', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.VersionCase', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.VersionCase', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.ResultCase', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.VersionCase', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesRequest', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.VersionCase', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesResponse', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.ResultCase', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue', null, { proto }); -goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.ResultCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.VersionCase', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.VersionCase', null, { proto }); @@ -182,6 +173,7 @@ goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVote goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.KeyPurpose', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.KeyRequestType', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.KeyRequestType.RequestCase', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.Proof', null, { proto }); @@ -565,16 +557,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.oneofGroups_); +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.oneofGroups_); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesRequest, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesRequest'; + proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse'; } /** * Generated by JsPbCodeGenerator. @@ -586,16 +578,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0 = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.repeatedFields_, null); +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0'; + proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0'; } /** * Generated by JsPbCodeGenerator. @@ -607,16 +599,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.oneofGroups_); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.oneofGroups_); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesResponse, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesResponse'; + proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse'; } /** * Generated by JsPbCodeGenerator. @@ -628,16 +620,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue'; + proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0'; } /** * Generated by JsPbCodeGenerator. @@ -649,16 +641,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.oneofGroups_); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry'; + proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse'; } /** * Generated by JsPbCodeGenerator. @@ -670,16 +662,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.repeatedFields_, null); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.oneofGroups_); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities'; + proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0'; } /** * Generated by JsPbCodeGenerator. @@ -691,16 +683,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0 = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.oneofGroups_); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.oneofGroups_); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0'; + proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse'; } /** * Generated by JsPbCodeGenerator. @@ -712,16 +704,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.oneofGroups_); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.oneofGroups_); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse'; + proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0'; } /** * Generated by JsPbCodeGenerator. @@ -733,16 +725,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0 = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0'; + proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision'; } /** * Generated by JsPbCodeGenerator. @@ -754,16 +746,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.oneofGroups_); +proto.org.dash.platform.dapi.v0.KeyRequestType = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.KeyRequestType.oneofGroups_); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.KeyRequestType, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse'; + proto.org.dash.platform.dapi.v0.KeyRequestType.displayName = 'proto.org.dash.platform.dapi.v0.KeyRequestType'; } /** * Generated by JsPbCodeGenerator. @@ -775,16 +767,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0 = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_); +proto.org.dash.platform.dapi.v0.AllKeys = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.AllKeys, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0'; + proto.org.dash.platform.dapi.v0.AllKeys.displayName = 'proto.org.dash.platform.dapi.v0.AllKeys'; } /** * Generated by JsPbCodeGenerator. @@ -796,16 +788,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.oneofGroups_); +proto.org.dash.platform.dapi.v0.SpecificKeys = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.SpecificKeys.repeatedFields_, null); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.SpecificKeys, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse'; + proto.org.dash.platform.dapi.v0.SpecificKeys.displayName = 'proto.org.dash.platform.dapi.v0.SpecificKeys'; } /** * Generated by JsPbCodeGenerator. @@ -817,16 +809,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0 = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.oneofGroups_); +proto.org.dash.platform.dapi.v0.SearchKey = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.SearchKey, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0'; + proto.org.dash.platform.dapi.v0.SearchKey.displayName = 'proto.org.dash.platform.dapi.v0.SearchKey'; } /** * Generated by JsPbCodeGenerator. @@ -838,16 +830,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.oneofGroups_); +proto.org.dash.platform.dapi.v0.SecurityLevelMap = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.SecurityLevelMap, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse'; + proto.org.dash.platform.dapi.v0.SecurityLevelMap.displayName = 'proto.org.dash.platform.dapi.v0.SecurityLevelMap'; } /** * Generated by JsPbCodeGenerator. @@ -859,16 +851,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0 = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.oneofGroups_); +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.oneofGroups_); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0'; + proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest'; } /** * Generated by JsPbCodeGenerator. @@ -880,16 +872,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision = function(opt_data) { +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0 = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision'; + proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0'; } /** * Generated by JsPbCodeGenerator. @@ -901,16 +893,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.KeyRequestType = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.KeyRequestType.oneofGroups_); +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.oneofGroups_); }; -goog.inherits(proto.org.dash.platform.dapi.v0.KeyRequestType, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.KeyRequestType.displayName = 'proto.org.dash.platform.dapi.v0.KeyRequestType'; + proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse'; } /** * Generated by JsPbCodeGenerator. @@ -922,16 +914,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.AllKeys = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.oneofGroups_); }; -goog.inherits(proto.org.dash.platform.dapi.v0.AllKeys, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.AllKeys.displayName = 'proto.org.dash.platform.dapi.v0.AllKeys'; + proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0'; } /** * Generated by JsPbCodeGenerator. @@ -943,16 +935,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.SpecificKeys = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.SpecificKeys.repeatedFields_, null); +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.repeatedFields_, null); }; -goog.inherits(proto.org.dash.platform.dapi.v0.SpecificKeys, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.SpecificKeys.displayName = 'proto.org.dash.platform.dapi.v0.SpecificKeys'; + proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys'; } /** * Generated by JsPbCodeGenerator. @@ -964,16 +956,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.SearchKey = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.oneofGroups_); }; -goog.inherits(proto.org.dash.platform.dapi.v0.SearchKey, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.SearchKey.displayName = 'proto.org.dash.platform.dapi.v0.SearchKey'; + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest'; } /** * Generated by JsPbCodeGenerator. @@ -985,16 +977,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.SecurityLevelMap = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.repeatedFields_, null); }; -goog.inherits(proto.org.dash.platform.dapi.v0.SecurityLevelMap, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.SecurityLevelMap.displayName = 'proto.org.dash.platform.dapi.v0.SecurityLevelMap'; + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0'; } /** * Generated by JsPbCodeGenerator. @@ -1006,16 +998,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.oneofGroups_); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.oneofGroups_); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest'; + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse'; } /** * Generated by JsPbCodeGenerator. @@ -1027,16 +1019,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0 = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.oneofGroups_); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0'; + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0'; } /** * Generated by JsPbCodeGenerator. @@ -1048,16 +1040,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.oneofGroups_); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.repeatedFields_, null); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse'; + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys'; } /** * Generated by JsPbCodeGenerator. @@ -1069,16 +1061,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0 = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.oneofGroups_); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.repeatedFields_, null); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0'; + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys'; } /** * Generated by JsPbCodeGenerator. @@ -1090,16 +1082,16 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.repeatedFields_, null); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.repeatedFields_, null); }; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys, jspb.Message); +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys, jspb.Message); if (goog.DEBUG && !COMPILED) { /** * @public * @override */ - proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys'; + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys'; } /** * Generated by JsPbCodeGenerator. @@ -1689,132 +1681,6 @@ if (goog.DEBUG && !COMPILED) { */ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.displayName = 'proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents'; } -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.oneofGroups_); -}; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest'; -} -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0 = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.repeatedFields_, null); -}; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0'; -} -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.oneofGroups_); -}; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse'; -} -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry'; -} -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes.repeatedFields_, null); -}; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes'; -} -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0 = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.oneofGroups_); -}; -goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0'; -} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -6056,21 +5922,21 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.hasV0 = function() * @private {!Array>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.VersionCase = { +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.oneofGroups_[0])); }; @@ -6088,8 +5954,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.toObject(opt_includeInstance, this); }; @@ -6098,13 +5964,13 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.toObject = functi * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -6118,23 +5984,23 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.toObject = function(include /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesRequest; - return proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse; + return proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -6142,8 +6008,8 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.deserializeBinaryFromReader var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -6159,9 +6025,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.deserializeBinaryFromReader * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -6169,18 +6035,18 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.serializeBinary = /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.serializeBinaryToWriter ); } }; @@ -6188,11 +6054,30 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.serializeBinaryToWriter = f /** - * List of repeated fields within this message type. - * @private {!Array} + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.repeatedFields_ = [1]; +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + IDENTITY_NONCE: 1, + PROOF: 2 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_[0])); +}; @@ -6209,8 +6094,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.toObject(opt_includeInstance, this); }; @@ -6219,14 +6104,15 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prot * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - idsList: msg.getIdsList_asB64(), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + identityNonce: jspb.Message.getFieldWithDefault(msg, 1, 0), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; if (includeInstance) { @@ -6240,23 +6126,23 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.toOb /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0; - return proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0; + return proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -6264,12 +6150,18 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.dese var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.addIds(value); + var value = /** @type {number} */ (reader.readUint64()); + msg.setIdentityNonce(value); break; case 2: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setProve(value); + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); break; default: reader.skipField(); @@ -6284,9 +6176,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.dese * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -6294,132 +6186,172 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prot /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getIdsList_asU8(); - if (f.length > 0) { - writer.writeRepeatedBytes( + f = /** @type {number} */ (jspb.Message.getField(message, 1)); + if (f != null) { + writer.writeUint64( 1, f ); } - f = message.getProve(); - if (f) { - writer.writeBool( + f = message.getProof(); + if (f != null) { + writer.writeMessage( 2, - f + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter ); } }; /** - * repeated bytes ids = 1; - * @return {!Array} + * optional uint64 identity_nonce = 1; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.getIdsList = function() { - return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 1)); +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.getIdentityNonce = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); }; /** - * repeated bytes ids = 1; - * This is a type-conversion wrapper around `getIdsList()` - * @return {!Array} + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.getIdsList_asB64 = function() { - return /** @type {!Array} */ (jspb.Message.bytesListAsB64( - this.getIdsList())); +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.setIdentityNonce = function(value) { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_[0], value); }; /** - * repeated bytes ids = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getIdsList()` - * @return {!Array} + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.getIdsList_asU8 = function() { - return /** @type {!Array} */ (jspb.Message.bytesListAsU8( - this.getIdsList())); +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.clearIdentityNonce = function() { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_[0], undefined); }; /** - * @param {!(Array|Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.setIdsList = function(value) { - return jspb.Message.setField(this, 1, value || []); +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.hasIdentityNonce = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * @param {!(string|Uint8Array)} value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} returns this + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.addIds = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.clearIdsList = function() { - return this.setIdsList([]); +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); }; /** - * optional bool prove = 2; + * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} returns this + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; }; /** - * optional GetIdentitiesRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} + * optional GetIdentityNonceResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.GetIdentitiesRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -6428,7 +6360,7 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.clearV0 = functio * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -6442,21 +6374,21 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesRequest.prototype.hasV0 = function( * @private {!Array>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.VersionCase = { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.oneofGroups_[0])); }; @@ -6474,8 +6406,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.toObject(opt_includeInstance, this); }; @@ -6484,13 +6416,13 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.toObject = funct * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -6504,23 +6436,23 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.toObject = function(includ /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse; - return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse; + return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -6528,8 +6460,8 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.deserializeBinaryFromReade var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -6545,9 +6477,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.deserializeBinaryFromReade * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -6555,180 +6487,52 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.serializeBinary /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.serializeBinaryToWriter ); } }; - - -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} + * @const */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.toObject = function(includeInstance, msg) { - var f, obj = { - value: msg.getValue_asB64() - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue; - return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setValue(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getValue_asU8(); - if (f.length > 0) { - writer.writeBytes( - 1, - f - ); - } -}; - - -/** - * optional bytes value = 1; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.prototype.getValue = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * optional bytes value = 1; - * This is a type-conversion wrapper around `getValue()` - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.prototype.getValue_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getValue())); -}; - +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_ = [[1,2]]; /** - * optional bytes value = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getValue()` - * @return {!Uint8Array} + * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.prototype.getValue_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getValue())); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + IDENTITY_CONTRACT_NONCE: 1, + PROOF: 2 }; - /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} returns this + * @return {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.ResultCase} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.prototype.setValue = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_[0])); }; - - if (jspb.Message.GENERATE_TO_OBJECT) { /** * Creates an object representation of this proto. @@ -6742,8 +6546,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.toObject(opt_includeInstance, this); }; @@ -6752,14 +6556,15 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.to * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - key: msg.getKey_asB64(), - value: (f = msg.getValue()) && proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.toObject(includeInstance, f) + identityContractNonce: jspb.Message.getFieldWithDefault(msg, 1, 0), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; if (includeInstance) { @@ -6773,23 +6578,23 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.toObject = f /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry; - return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0; + return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -6797,13 +6602,18 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.deserializeB var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setKey(value); + var value = /** @type {number} */ (reader.readUint64()); + msg.setIdentityContractNonce(value); break; case 2: - var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.deserializeBinaryFromReader); - msg.setValue(value); + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); break; default: reader.skipField(); @@ -6818,9 +6628,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.deserializeB * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -6828,97 +6638,99 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.se /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getKey_asU8(); - if (f.length > 0) { - writer.writeBytes( + f = /** @type {number} */ (jspb.Message.getField(message, 1)); + if (f != null) { + writer.writeUint64( 1, f ); } - f = message.getValue(); + f = message.getProof(); if (f != null) { writer.writeMessage( 2, f, - proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter ); } }; /** - * optional bytes key = 1; - * @return {string} + * optional uint64 identity_contract_nonce = 1; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.getKey = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.getIdentityContractNonce = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); }; /** - * optional bytes key = 1; - * This is a type-conversion wrapper around `getKey()` - * @return {string} + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.getKey_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getKey())); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.setIdentityContractNonce = function(value) { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_[0], value); }; /** - * optional bytes key = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getKey()` - * @return {!Uint8Array} + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.getKey_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getKey())); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.clearIdentityContractNonce = function() { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_[0], undefined); }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.setKey = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.hasIdentityContractNonce = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * optional IdentityValue value = 2; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.getValue = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue, 2)); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityValue|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} returns this + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.setValue = function(value) { - return jspb.Message.setWrapperField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.clearValue = function() { - return this.setValue(undefined); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); }; @@ -6926,82 +6738,173 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.cl * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.prototype.hasValue = function() { +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.hasProof = function() { return jspb.Message.getField(this, 2) != null; }; - /** - * List of repeated fields within this message type. - * @private {!Array} - * @const + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.repeatedFields_ = [1]; - +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.toObject(opt_includeInstance, this); + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.toObject = function(includeInstance, msg) { - var f, obj = { - identityEntriesList: jspb.Message.toObjectList(msg.getIdentityEntriesList(), - proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.toObject, includeInstance) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities; - return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.deserializeBinaryFromReader = function(msg, reader) { + * optional GetIdentityContractNonceResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse; + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -7009,9 +6912,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.deserializeBina var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.deserializeBinaryFromReader); - msg.addIdentityEntries(value); + var value = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.deserializeBinaryFromReader); + msg.setV0(value); break; default: reader.skipField(); @@ -7026,9 +6929,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.deserializeBina * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -7036,61 +6939,23 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.prototype.seria /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getIdentityEntriesList(); - if (f.length > 0) { - writer.writeRepeatedMessage( + f = message.getV0(); + if (f != null) { + writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.serializeBinaryToWriter ); } }; -/** - * repeated IdentityEntry identity_entries = 1; - * @return {!Array} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.prototype.getIdentityEntriesList = function() { - return /** @type{!Array} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry, 1)); -}; - - -/** - * @param {!Array} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.prototype.setIdentityEntriesList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 1, value); -}; - - -/** - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry=} opt_value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.prototype.addIdentityEntries = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.IdentityEntry, opt_index); -}; - - -/** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.prototype.clearIdentityEntriesList = function() { - return this.setIdentityEntriesList([]); -}; - - /** * Oneof group definitions for this message. Each group defines the field @@ -7100,22 +6965,22 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.prototype.clear * @private {!Array>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.oneofGroups_ = [[1,2]]; +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.oneofGroups_ = [[1,2]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.ResultCase = { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.ResultCase = { RESULT_NOT_SET: 0, - IDENTITIES: 1, + BALANCE: 1, PROOF: 2 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.ResultCase} + * @return {proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.ResultCase} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.oneofGroups_[0])); }; @@ -7133,8 +6998,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.toObject(opt_includeInstance, this); }; @@ -7143,13 +7008,13 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.pr * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - identities: (f = msg.getIdentities()) && proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.toObject(includeInstance, f), + balance: jspb.Message.getFieldWithDefault(msg, 1, 0), proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; @@ -7165,23 +7030,23 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.to /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0; - return proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0; + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -7189,9 +7054,8 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.de var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.deserializeBinaryFromReader); - msg.setIdentities(value); + var value = /** @type {number} */ (reader.readUint64()); + msg.setBalance(value); break; case 2: var value = new proto.org.dash.platform.dapi.v0.Proof; @@ -7216,9 +7080,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.de * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -7226,18 +7090,17 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.pr /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getIdentities(); + f = /** @type {number} */ (jspb.Message.getField(message, 1)); if (f != null) { - writer.writeMessage( + writer.writeUint64( 1, - f, - proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities.serializeBinaryToWriter + f ); } f = message.getProof(); @@ -7260,30 +7123,29 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.se /** - * optional Identities identities = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} + * optional uint64 balance = 1; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.getIdentities = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities, 1)); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.getBalance = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.Identities|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.setIdentities = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.oneofGroups_[0], value); + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.setBalance = function(value) { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.oneofGroups_[0], value); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} returns this + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.clearIdentities = function() { - return this.setIdentities(undefined); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.clearBalance = function() { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.oneofGroups_[0], undefined); }; @@ -7291,7 +7153,7 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.pr * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.hasIdentities = function() { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.hasBalance = function() { return jspb.Message.getField(this, 1) != null; }; @@ -7300,7 +7162,7 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.pr * optional Proof proof = 2; * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.getProof = function() { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.getProof = function() { return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; @@ -7308,18 +7170,18 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.pr /** * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.clearProof = function() { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.clearProof = function() { return this.setProof(undefined); }; @@ -7328,7 +7190,7 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.pr * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.hasProof = function() { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.hasProof = function() { return jspb.Message.getField(this, 2) != null; }; @@ -7337,7 +7199,7 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.pr * optional ResponseMetadata metadata = 3; * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.getMetadata = function() { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.getMetadata = function() { return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); }; @@ -7345,18 +7207,18 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.pr /** * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.setMetadata = function(value) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.setMetadata = function(value) { return jspb.Message.setWrapperField(this, 3, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.clearMetadata = function() { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.clearMetadata = function() { return this.setMetadata(undefined); }; @@ -7365,35 +7227,35 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.pr * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0.prototype.hasMetadata = function() { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.hasMetadata = function() { return jspb.Message.getField(this, 3) != null; }; /** - * optional GetIdentitiesResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} + * optional GetIdentityBalanceResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.GetIdentitiesResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -7402,7 +7264,7 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.clearV0 = functi * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -7416,21 +7278,21 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesResponse.prototype.hasV0 = function * @private {!Array>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.VersionCase = { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.oneofGroups_[0])); }; @@ -7448,8 +7310,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.toObject(opt_includeInstance, this); }; @@ -7458,13 +7320,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.toObject = fu * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -7478,23 +7340,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.toObject = function(inc /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse; - return proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse; + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -7502,8 +7364,8 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.deserializeBinaryFromRe var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -7519,9 +7381,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.deserializeBinaryFromRe * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -7529,18 +7391,18 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.serializeBina /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.serializeBinaryToWriter ); } }; @@ -7555,22 +7417,22 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.serializeBinaryToWriter * @private {!Array>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_ = [[1,2]]; +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.oneofGroups_ = [[1,2]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.ResultCase = { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.ResultCase = { RESULT_NOT_SET: 0, - IDENTITY_NONCE: 1, + BALANCE_AND_REVISION: 1, PROOF: 2 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.ResultCase} + * @return {proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.ResultCase} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.oneofGroups_[0])); }; @@ -7588,8 +7450,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.toObject(opt_includeInstance, this); }; @@ -7598,13 +7460,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceRespons * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - identityNonce: jspb.Message.getFieldWithDefault(msg, 1, 0), + balanceAndRevision: (f = msg.getBalanceAndRevision()) && proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.toObject(includeInstance, f), proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; @@ -7620,23 +7482,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceRespons /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0; - return proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0; + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -7644,8 +7506,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceRespons var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {number} */ (reader.readUint64()); - msg.setIdentityNonce(value); + var value = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.deserializeBinaryFromReader); + msg.setBalanceAndRevision(value); break; case 2: var value = new proto.org.dash.platform.dapi.v0.Proof; @@ -7670,9 +7533,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceRespons * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -7680,17 +7543,18 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceRespons /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = /** @type {number} */ (jspb.Message.getField(message, 1)); + f = message.getBalanceAndRevision(); if (f != null) { - writer.writeUint64( + writer.writeMessage( 1, - f + f, + proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.serializeBinaryToWriter ); } f = message.getProof(); @@ -7712,289 +7576,311 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceRespons }; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * optional uint64 identity_nonce = 1; - * @return {number} + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.getIdentityNonce = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.toObject(opt_includeInstance, this); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.setIdentityNonce = function(value) { - return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.toObject = function(includeInstance, msg) { + var f, obj = { + balance: jspb.Message.getFieldWithDefault(msg, 1, 0), + revision: jspb.Message.getFieldWithDefault(msg, 2, 0) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.clearIdentityNonce = function() { - return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_[0], undefined); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision; + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.deserializeBinaryFromReader(msg, reader); }; /** - * Returns whether this field is set. - * @return {boolean} + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.hasIdentityNonce = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {number} */ (reader.readUint64()); + msg.setBalance(value); + break; + case 2: + var value = /** @type {number} */ (reader.readUint64()); + msg.setRevision(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * optional Proof proof = 2; - * @return {?proto.org.dash.platform.dapi.v0.Proof} + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.getProof = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_[0], value); + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getBalance(); + if (f !== 0) { + writer.writeUint64( + 1, + f + ); + } + f = message.getRevision(); + if (f !== 0) { + writer.writeUint64( + 2, + f + ); + } }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this + * optional uint64 balance = 1; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.clearProof = function() { - return this.setProof(undefined); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.prototype.getBalance = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.hasProof = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.prototype.setBalance = function(value) { + return jspb.Message.setProto3IntField(this, 1, value); }; /** - * optional ResponseMetadata metadata = 3; - * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + * optional uint64 revision = 2; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.getMetadata = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.prototype.getRevision = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 3, value); + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.prototype.setRevision = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this + * optional BalanceAndRevision balance_and_revision = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.clearMetadata = function() { - return this.setMetadata(undefined); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.getBalanceAndRevision = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision, 1)); }; /** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 3) != null; + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.setBalanceAndRevision = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.oneofGroups_[0], value); }; /** - * optional GetIdentityNonceResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} - */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0, 1)); + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.clearBalanceAndRevision = function() { + return this.setBalanceAndRevision(undefined); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.oneofGroups_[0], value); + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.hasBalanceAndRevision = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} returns this + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.clearV0 = function() { - return this.setV0(undefined); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; /** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.oneofGroups_[0], value); }; - /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array>} - * @const + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); +}; + /** - * @enum {number} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; }; + /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.VersionCase} + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); }; +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.toObject = function(includeInstance, msg) { - var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.toObject(includeInstance, f) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} + * optional GetIdentityBalanceAndRevisionResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse; - return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0, 1)); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} - */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.deserializeBinaryFromReader); - msg.setV0(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.oneofGroups_[0], value); }; /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.clearV0 = function() { + return this.setV0(undefined); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.serializeBinaryToWriter - ); - } +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; }; @@ -8007,22 +7893,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.serializeBinary * @private {!Array>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_ = [[1,2]]; +proto.org.dash.platform.dapi.v0.KeyRequestType.oneofGroups_ = [[1,2,3]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.ResultCase = { - RESULT_NOT_SET: 0, - IDENTITY_CONTRACT_NONCE: 1, - PROOF: 2 +proto.org.dash.platform.dapi.v0.KeyRequestType.RequestCase = { + REQUEST_NOT_SET: 0, + ALL_KEYS: 1, + SPECIFIC_KEYS: 2, + SEARCH_KEY: 3 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.ResultCase} + * @return {proto.org.dash.platform.dapi.v0.KeyRequestType.RequestCase} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.getRequestCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.KeyRequestType.RequestCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.KeyRequestType.oneofGroups_[0])); }; @@ -8040,8 +7927,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.KeyRequestType.toObject(opt_includeInstance, this); }; @@ -8050,15 +7937,15 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityCont * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.KeyRequestType} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.KeyRequestType.toObject = function(includeInstance, msg) { var f, obj = { - identityContractNonce: jspb.Message.getFieldWithDefault(msg, 1, 0), - proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), - metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + allKeys: (f = msg.getAllKeys()) && proto.org.dash.platform.dapi.v0.AllKeys.toObject(includeInstance, f), + specificKeys: (f = msg.getSpecificKeys()) && proto.org.dash.platform.dapi.v0.SpecificKeys.toObject(includeInstance, f), + searchKey: (f = msg.getSearchKey()) && proto.org.dash.platform.dapi.v0.SearchKey.toObject(includeInstance, f) }; if (includeInstance) { @@ -8072,23 +7959,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityCont /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.KeyRequestType.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0; - return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.KeyRequestType; + return proto.org.dash.platform.dapi.v0.KeyRequestType.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.KeyRequestType} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.KeyRequestType.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -8096,18 +7983,19 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityCont var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {number} */ (reader.readUint64()); - msg.setIdentityContractNonce(value); + var value = new proto.org.dash.platform.dapi.v0.AllKeys; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.AllKeys.deserializeBinaryFromReader); + msg.setAllKeys(value); break; case 2: - var value = new proto.org.dash.platform.dapi.v0.Proof; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); - msg.setProof(value); + var value = new proto.org.dash.platform.dapi.v0.SpecificKeys; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.SpecificKeys.deserializeBinaryFromReader); + msg.setSpecificKeys(value); break; case 3: - var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); - msg.setMetadata(value); + var value = new proto.org.dash.platform.dapi.v0.SearchKey; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.SearchKey.deserializeBinaryFromReader); + msg.setSearchKey(value); break; default: reader.skipField(); @@ -8122,9 +8010,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityCont * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.KeyRequestType.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -8132,62 +8020,64 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityCont /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.KeyRequestType} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.KeyRequestType.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = /** @type {number} */ (jspb.Message.getField(message, 1)); + f = message.getAllKeys(); if (f != null) { - writer.writeUint64( + writer.writeMessage( 1, - f + f, + proto.org.dash.platform.dapi.v0.AllKeys.serializeBinaryToWriter ); } - f = message.getProof(); + f = message.getSpecificKeys(); if (f != null) { writer.writeMessage( 2, f, - proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.SpecificKeys.serializeBinaryToWriter ); } - f = message.getMetadata(); + f = message.getSearchKey(); if (f != null) { writer.writeMessage( 3, f, - proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.SearchKey.serializeBinaryToWriter ); } }; /** - * optional uint64 identity_contract_nonce = 1; - * @return {number} + * optional AllKeys all_keys = 1; + * @return {?proto.org.dash.platform.dapi.v0.AllKeys} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.getIdentityContractNonce = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.getAllKeys = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.AllKeys} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.AllKeys, 1)); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.setIdentityContractNonce = function(value) { - return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_[0], value); + * @param {?proto.org.dash.platform.dapi.v0.AllKeys|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} returns this +*/ +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.setAllKeys = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.KeyRequestType.oneofGroups_[0], value); }; /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.clearIdentityContractNonce = function() { - return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_[0], undefined); +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.clearAllKeys = function() { + return this.setAllKeys(undefined); }; @@ -8195,36 +8085,36 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityCont * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.hasIdentityContractNonce = function() { +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.hasAllKeys = function() { return jspb.Message.getField(this, 1) != null; }; /** - * optional Proof proof = 2; - * @return {?proto.org.dash.platform.dapi.v0.Proof} + * optional SpecificKeys specific_keys = 2; + * @return {?proto.org.dash.platform.dapi.v0.SpecificKeys} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.getProof = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.getSpecificKeys = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.SpecificKeys} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.SpecificKeys, 2)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.SpecificKeys|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.setSpecificKeys = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.KeyRequestType.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.clearProof = function() { - return this.setProof(undefined); +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.clearSpecificKeys = function() { + return this.setSpecificKeys(undefined); }; @@ -8232,36 +8122,36 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityCont * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.hasProof = function() { +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.hasSpecificKeys = function() { return jspb.Message.getField(this, 2) != null; }; /** - * optional ResponseMetadata metadata = 3; - * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + * optional SearchKey search_key = 3; + * @return {?proto.org.dash.platform.dapi.v0.SearchKey} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.getMetadata = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.getSearchKey = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.SearchKey} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.SearchKey, 3)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.SearchKey|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 3, value); +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.setSearchKey = function(value) { + return jspb.Message.setOneofWrapperField(this, 3, proto.org.dash.platform.dapi.v0.KeyRequestType.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.clearMetadata = function() { - return this.setMetadata(undefined); +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.clearSearchKey = function() { + return this.setSearchKey(undefined); }; @@ -8269,73 +8159,11 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityCont * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.hasMetadata = function() { +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.hasSearchKey = function() { return jspb.Message.getField(this, 3) != null; }; -/** - * optional GetIdentityContractNonceResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} - */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0, 1)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.clearV0 = function() { - return this.setV0(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; -}; - - - -/** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.oneofGroups_ = [[1]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.VersionCase} - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.oneofGroups_[0])); -}; @@ -8352,8 +8180,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.AllKeys.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.AllKeys.toObject(opt_includeInstance, this); }; @@ -8362,13 +8190,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.toObject = * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.AllKeys} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.AllKeys.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.toObject(includeInstance, f) + }; if (includeInstance) { @@ -8382,34 +8210,29 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.toObject = function(i /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} + * @return {!proto.org.dash.platform.dapi.v0.AllKeys} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.AllKeys.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse; - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.AllKeys; + return proto.org.dash.platform.dapi.v0.AllKeys.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.AllKeys} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} + * @return {!proto.org.dash.platform.dapi.v0.AllKeys} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.AllKeys.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; } var field = reader.getFieldNumber(); switch (field) { - case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.deserializeBinaryFromReader); - msg.setV0(value); - break; default: reader.skipField(); break; @@ -8423,9 +8246,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.deserializeBinaryFrom * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.AllKeys.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.AllKeys.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -8433,49 +8256,22 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.serializeBi /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} message + * @param {!proto.org.dash.platform.dapi.v0.AllKeys} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.AllKeys.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.serializeBinaryToWriter - ); - } }; /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array>} + * List of repeated fields within this message type. + * @private {!Array} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.oneofGroups_ = [[1,2]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.ResultCase = { - RESULT_NOT_SET: 0, - BALANCE: 1, - PROOF: 2 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.ResultCase} - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.oneofGroups_[0])); -}; +proto.org.dash.platform.dapi.v0.SpecificKeys.repeatedFields_ = [1]; @@ -8492,8 +8288,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.SpecificKeys.toObject(opt_includeInstance, this); }; @@ -8502,15 +8298,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceRes * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.SpecificKeys} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.SpecificKeys.toObject = function(includeInstance, msg) { var f, obj = { - balance: jspb.Message.getFieldWithDefault(msg, 1, 0), - proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), - metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + keyIdsList: (f = jspb.Message.getRepeatedField(msg, 1)) == null ? undefined : f }; if (includeInstance) { @@ -8524,23 +8318,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceRes /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.SpecificKeys} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.SpecificKeys.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0; - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.SpecificKeys; + return proto.org.dash.platform.dapi.v0.SpecificKeys.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.SpecificKeys} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.SpecificKeys} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.SpecificKeys.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -8548,18 +8342,10 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceRes var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {number} */ (reader.readUint64()); - msg.setBalance(value); - break; - case 2: - var value = new proto.org.dash.platform.dapi.v0.Proof; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); - msg.setProof(value); - break; - case 3: - var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); - msg.setMetadata(value); + var values = /** @type {!Array} */ (reader.isDelimited() ? reader.readPackedUint32() : [reader.readUint32()]); + for (var i = 0; i < values.length; i++) { + msg.addKeyIds(values[i]); + } break; default: reader.skipField(); @@ -8574,9 +8360,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceRes * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.SpecificKeys.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -8584,211 +8370,60 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceRes /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.SpecificKeys} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.SpecificKeys.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = /** @type {number} */ (jspb.Message.getField(message, 1)); - if (f != null) { - writer.writeUint64( + f = message.getKeyIdsList(); + if (f.length > 0) { + writer.writePackedUint32( 1, f ); } - f = message.getProof(); - if (f != null) { - writer.writeMessage( - 2, - f, - proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter - ); - } - f = message.getMetadata(); - if (f != null) { - writer.writeMessage( - 3, - f, - proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter - ); - } -}; - - -/** - * optional uint64 balance = 1; - * @return {number} - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.getBalance = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.setBalance = function(value) { - return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.oneofGroups_[0], value); -}; - - -/** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.clearBalance = function() { - return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.oneofGroups_[0], undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.hasBalance = function() { - return jspb.Message.getField(this, 1) != null; -}; - - -/** - * optional Proof proof = 2; - * @return {?proto.org.dash.platform.dapi.v0.Proof} - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.getProof = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.clearProof = function() { - return this.setProof(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.hasProof = function() { - return jspb.Message.getField(this, 2) != null; -}; - - -/** - * optional ResponseMetadata metadata = 3; - * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.getMetadata = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 3, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.clearMetadata = function() { - return this.setMetadata(undefined); }; /** - * Returns whether this field is set. - * @return {boolean} + * repeated uint32 key_ids = 1; + * @return {!Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.getKeyIdsList = function() { + return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 1)); }; /** - * optional GetIdentityBalanceResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} + * @param {!Array} value + * @return {!proto.org.dash.platform.dapi.v0.SpecificKeys} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0, 1)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.setKeyIdsList = function(value) { + return jspb.Message.setField(this, 1, value || []); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} returns this + * @param {number} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.SpecificKeys} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.clearV0 = function() { - return this.setV0(undefined); +proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.addKeyIds = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 1, value, opt_index); }; /** - * Returns whether this field is set. - * @return {boolean} + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.SpecificKeys} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.clearKeyIdsList = function() { + return this.setKeyIdsList([]); }; -/** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.oneofGroups_ = [[1]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.VersionCase} - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.oneofGroups_[0])); -}; - if (jspb.Message.GENERATE_TO_OBJECT) { @@ -8804,8 +8439,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.SearchKey.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.SearchKey.toObject(opt_includeInstance, this); }; @@ -8814,13 +8449,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype. * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.SearchKey} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.SearchKey.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.toObject(includeInstance, f) + purposeMapMap: (f = msg.getPurposeMapMap()) ? f.toObject(includeInstance, proto.org.dash.platform.dapi.v0.SecurityLevelMap.toObject) : [] }; if (includeInstance) { @@ -8834,23 +8469,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.toObject = /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} + * @return {!proto.org.dash.platform.dapi.v0.SearchKey} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.SearchKey.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse; - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.SearchKey; + return proto.org.dash.platform.dapi.v0.SearchKey.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.SearchKey} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} + * @return {!proto.org.dash.platform.dapi.v0.SearchKey} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.SearchKey.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -8858,9 +8493,10 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.deserializ var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.deserializeBinaryFromReader); - msg.setV0(value); + var value = msg.getPurposeMapMap(); + reader.readMessage(value, function(message, reader) { + jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readUint32, jspb.BinaryReader.prototype.readMessage, proto.org.dash.platform.dapi.v0.SecurityLevelMap.deserializeBinaryFromReader, 0, new proto.org.dash.platform.dapi.v0.SecurityLevelMap()); + }); break; default: reader.skipField(); @@ -8875,9 +8511,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.deserializ * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.SearchKey.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.SearchKey.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -8885,49 +8521,41 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype. /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} message + * @param {!proto.org.dash.platform.dapi.v0.SearchKey} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.SearchKey.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.serializeBinaryToWriter - ); + f = message.getPurposeMapMap(true); + if (f && f.getLength() > 0) { + f.serializeBinary(1, writer, jspb.BinaryWriter.prototype.writeUint32, jspb.BinaryWriter.prototype.writeMessage, proto.org.dash.platform.dapi.v0.SecurityLevelMap.serializeBinaryToWriter); } }; - -/** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.oneofGroups_ = [[1,2]]; - /** - * @enum {number} + * map purpose_map = 1; + * @param {boolean=} opt_noLazyCreate Do not create the map if + * empty, instead returning `undefined` + * @return {!jspb.Map} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.ResultCase = { - RESULT_NOT_SET: 0, - BALANCE_AND_REVISION: 1, - PROOF: 2 +proto.org.dash.platform.dapi.v0.SearchKey.prototype.getPurposeMapMap = function(opt_noLazyCreate) { + return /** @type {!jspb.Map} */ ( + jspb.Message.getMapField(this, 1, opt_noLazyCreate, + proto.org.dash.platform.dapi.v0.SecurityLevelMap)); }; + /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.ResultCase} + * Clears values from the map. The map will be non-null. + * @return {!proto.org.dash.platform.dapi.v0.SearchKey} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.oneofGroups_[0])); -}; +proto.org.dash.platform.dapi.v0.SearchKey.prototype.clearPurposeMapMap = function() { + this.getPurposeMapMap().clear(); + return this;}; + + @@ -8944,8 +8572,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.SecurityLevelMap.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.SecurityLevelMap.toObject(opt_includeInstance, this); }; @@ -8954,15 +8582,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.SecurityLevelMap} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.SecurityLevelMap.toObject = function(includeInstance, msg) { var f, obj = { - balanceAndRevision: (f = msg.getBalanceAndRevision()) && proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.toObject(includeInstance, f), - proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), - metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + securityLevelMapMap: (f = msg.getSecurityLevelMapMap()) ? f.toObject(includeInstance, undefined) : [] }; if (includeInstance) { @@ -8976,23 +8602,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.SecurityLevelMap} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.SecurityLevelMap.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0; - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.SecurityLevelMap; + return proto.org.dash.platform.dapi.v0.SecurityLevelMap.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.SecurityLevelMap} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.SecurityLevelMap} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.SecurityLevelMap.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -9000,19 +8626,10 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.deserializeBinaryFromReader); - msg.setBalanceAndRevision(value); - break; - case 2: - var value = new proto.org.dash.platform.dapi.v0.Proof; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); - msg.setProof(value); - break; - case 3: - var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); - msg.setMetadata(value); + var value = msg.getSecurityLevelMapMap(); + reader.readMessage(value, function(message, reader) { + jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readUint32, jspb.BinaryReader.prototype.readEnum, null, 0, 0); + }); break; default: reader.skipField(); @@ -9027,9 +8644,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.SecurityLevelMap.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.SecurityLevelMap.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -9037,39 +8654,74 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.SecurityLevelMap} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.SecurityLevelMap.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getBalanceAndRevision(); - if (f != null) { - writer.writeMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.serializeBinaryToWriter - ); - } - f = message.getProof(); - if (f != null) { - writer.writeMessage( - 2, - f, - proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter - ); - } - f = message.getMetadata(); - if (f != null) { - writer.writeMessage( - 3, - f, - proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter - ); + f = message.getSecurityLevelMapMap(true); + if (f && f.getLength() > 0) { + f.serializeBinary(1, writer, jspb.BinaryWriter.prototype.writeUint32, jspb.BinaryWriter.prototype.writeEnum); } }; +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.SecurityLevelMap.KeyKindRequestType = { + CURRENT_KEY_OF_KIND_REQUEST: 0, + ALL_KEYS_OF_KIND_REQUEST: 1 +}; + +/** + * map security_level_map = 1; + * @param {boolean=} opt_noLazyCreate Do not create the map if + * empty, instead returning `undefined` + * @return {!jspb.Map} + */ +proto.org.dash.platform.dapi.v0.SecurityLevelMap.prototype.getSecurityLevelMapMap = function(opt_noLazyCreate) { + return /** @type {!jspb.Map} */ ( + jspb.Message.getMapField(this, 1, opt_noLazyCreate, + null)); +}; + + +/** + * Clears values from the map. The map will be non-null. + * @return {!proto.org.dash.platform.dapi.v0.SecurityLevelMap} returns this + */ +proto.org.dash.platform.dapi.v0.SecurityLevelMap.prototype.clearSecurityLevelMapMap = function() { + this.getSecurityLevelMapMap().clear(); + return this;}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.oneofGroups_[0])); +}; @@ -9086,8 +8738,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.toObject(opt_includeInstance, this); }; @@ -9096,14 +8748,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.toObject = function(includeInstance, msg) { var f, obj = { - balance: jspb.Message.getFieldWithDefault(msg, 1, 0), - revision: jspb.Message.getFieldWithDefault(msg, 2, 0) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -9117,23 +8768,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision; - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest; + return proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -9141,12 +8792,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {number} */ (reader.readUint64()); - msg.setBalance(value); - break; - case 2: - var value = /** @type {number} */ (reader.readUint64()); - msg.setRevision(value); + var value = new proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.deserializeBinaryFromReader); + msg.setV0(value); break; default: reader.skipField(); @@ -9161,9 +8809,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -9171,164 +8819,256 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getBalance(); - if (f !== 0) { - writer.writeUint64( + f = message.getV0(); + if (f != null) { + writer.writeMessage( 1, - f - ); - } - f = message.getRevision(); - if (f !== 0) { - writer.writeUint64( - 2, - f + f, + proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.serializeBinaryToWriter ); } }; -/** - * optional uint64 balance = 1; - * @return {number} - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.prototype.getBalance = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); -}; + +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} returns this + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.prototype.setBalance = function(value) { - return jspb.Message.setProto3IntField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.toObject(opt_includeInstance, this); }; /** - * optional uint64 revision = 2; - * @return {number} + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.prototype.getRevision = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); -}; - +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.toObject = function(includeInstance, msg) { + var f, obj = { + identityId: msg.getIdentityId_asB64(), + requestType: (f = msg.getRequestType()) && proto.org.dash.platform.dapi.v0.KeyRequestType.toObject(includeInstance, f), + limit: (f = msg.getLimit()) && google_protobuf_wrappers_pb.UInt32Value.toObject(includeInstance, f), + offset: (f = msg.getOffset()) && google_protobuf_wrappers_pb.UInt32Value.toObject(includeInstance, f), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 5, false) + }; -/** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.prototype.setRevision = function(value) { - return jspb.Message.setProto3IntField(this, 2, value); + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * optional BalanceAndRevision balance_and_revision = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.getBalanceAndRevision = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision, 1)); +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0; + return proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.deserializeBinaryFromReader(msg, reader); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.setBalanceAndRevision = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.oneofGroups_[0], value); + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setIdentityId(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.KeyRequestType; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.KeyRequestType.deserializeBinaryFromReader); + msg.setRequestType(value); + break; + case 3: + var value = new google_protobuf_wrappers_pb.UInt32Value; + reader.readMessage(value,google_protobuf_wrappers_pb.UInt32Value.deserializeBinaryFromReader); + msg.setLimit(value); + break; + case 4: + var value = new google_protobuf_wrappers_pb.UInt32Value; + reader.readMessage(value,google_protobuf_wrappers_pb.UInt32Value.deserializeBinaryFromReader); + msg.setOffset(value); + break; + case 5: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} returns this + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.clearBalanceAndRevision = function() { - return this.setBalanceAndRevision(undefined); +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * Returns whether this field is set. - * @return {boolean} + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.hasBalanceAndRevision = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getIdentityId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getRequestType(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.KeyRequestType.serializeBinaryToWriter + ); + } + f = message.getLimit(); + if (f != null) { + writer.writeMessage( + 3, + f, + google_protobuf_wrappers_pb.UInt32Value.serializeBinaryToWriter + ); + } + f = message.getOffset(); + if (f != null) { + writer.writeMessage( + 4, + f, + google_protobuf_wrappers_pb.UInt32Value.serializeBinaryToWriter + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 5, + f + ); + } }; /** - * optional Proof proof = 2; - * @return {?proto.org.dash.platform.dapi.v0.Proof} + * optional bytes identity_id = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.getProof = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getIdentityId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.oneofGroups_[0], value); + * optional bytes identity_id = 1; + * This is a type-conversion wrapper around `getIdentityId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getIdentityId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getIdentityId())); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} returns this + * optional bytes identity_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIdentityId()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.clearProof = function() { - return this.setProof(undefined); +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getIdentityId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getIdentityId())); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.hasProof = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.setIdentityId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * optional ResponseMetadata metadata = 3; - * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + * optional KeyRequestType request_type = 2; + * @return {?proto.org.dash.platform.dapi.v0.KeyRequestType} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.getMetadata = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getRequestType = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.KeyRequestType} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.KeyRequestType, 2)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.KeyRequestType|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.setRequestType = function(value) { + return jspb.Message.setWrapperField(this, 2, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.clearMetadata = function() { - return this.setMetadata(undefined); +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.clearRequestType = function() { + return this.setRequestType(undefined); }; @@ -9336,36 +9076,36 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.hasRequestType = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * optional GetIdentityBalanceAndRevisionResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} + * optional google.protobuf.UInt32Value limit = 3; + * @return {?proto.google.protobuf.UInt32Value} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getLimit = function() { + return /** @type{?proto.google.protobuf.UInt32Value} */ ( + jspb.Message.getWrapperField(this, google_protobuf_wrappers_pb.UInt32Value, 3)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} returns this + * @param {?proto.google.protobuf.UInt32Value|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.setLimit = function(value) { + return jspb.Message.setWrapperField(this, 3, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.clearV0 = function() { - return this.setV0(undefined); +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.clearLimit = function() { + return this.setLimit(undefined); }; @@ -9373,37 +9113,127 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype. * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.hasLimit = function() { + return jspb.Message.getField(this, 3) != null; }; - /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array>} - * @const + * optional google.protobuf.UInt32Value offset = 4; + * @return {?proto.google.protobuf.UInt32Value} */ -proto.org.dash.platform.dapi.v0.KeyRequestType.oneofGroups_ = [[1,2,3]]; +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getOffset = function() { + return /** @type{?proto.google.protobuf.UInt32Value} */ ( + jspb.Message.getWrapperField(this, google_protobuf_wrappers_pb.UInt32Value, 4)); +}; + + +/** + * @param {?proto.google.protobuf.UInt32Value|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.setOffset = function(value) { + return jspb.Message.setWrapperField(this, 4, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.clearOffset = function() { + return this.setOffset(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.hasOffset = function() { + return jspb.Message.getField(this, 4) != null; +}; + + +/** + * optional bool prove = 5; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 5, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 5, value); +}; + + +/** + * optional GetIdentityKeysRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.KeyRequestType.RequestCase = { - REQUEST_NOT_SET: 0, - ALL_KEYS: 1, - SPECIFIC_KEYS: 2, - SEARCH_KEY: 3 +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.KeyRequestType.RequestCase} + * @return {proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.getRequestCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.KeyRequestType.RequestCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.KeyRequestType.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.oneofGroups_[0])); }; @@ -9421,8 +9251,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.KeyRequestType.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.toObject(opt_includeInstance, this); }; @@ -9431,15 +9261,13 @@ proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.toObject = function(opt * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.KeyRequestType} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.KeyRequestType.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.toObject = function(includeInstance, msg) { var f, obj = { - allKeys: (f = msg.getAllKeys()) && proto.org.dash.platform.dapi.v0.AllKeys.toObject(includeInstance, f), - specificKeys: (f = msg.getSpecificKeys()) && proto.org.dash.platform.dapi.v0.SpecificKeys.toObject(includeInstance, f), - searchKey: (f = msg.getSearchKey()) && proto.org.dash.platform.dapi.v0.SearchKey.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -9453,23 +9281,23 @@ proto.org.dash.platform.dapi.v0.KeyRequestType.toObject = function(includeInstan /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} */ -proto.org.dash.platform.dapi.v0.KeyRequestType.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.KeyRequestType; - return proto.org.dash.platform.dapi.v0.KeyRequestType.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse; + return proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.KeyRequestType} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} */ -proto.org.dash.platform.dapi.v0.KeyRequestType.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -9477,19 +9305,9 @@ proto.org.dash.platform.dapi.v0.KeyRequestType.deserializeBinaryFromReader = fun var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.AllKeys; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.AllKeys.deserializeBinaryFromReader); - msg.setAllKeys(value); - break; - case 2: - var value = new proto.org.dash.platform.dapi.v0.SpecificKeys; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.SpecificKeys.deserializeBinaryFromReader); - msg.setSpecificKeys(value); - break; - case 3: - var value = new proto.org.dash.platform.dapi.v0.SearchKey; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.SearchKey.deserializeBinaryFromReader); - msg.setSearchKey(value); + var value = new proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.deserializeBinaryFromReader); + msg.setV0(value); break; default: reader.skipField(); @@ -9504,9 +9322,9 @@ proto.org.dash.platform.dapi.v0.KeyRequestType.deserializeBinaryFromReader = fun * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.KeyRequestType.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -9514,168 +9332,67 @@ proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.serializeBinary = funct /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.KeyRequestType} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.KeyRequestType.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getAllKeys(); + f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.AllKeys.serializeBinaryToWriter - ); - } - f = message.getSpecificKeys(); - if (f != null) { - writer.writeMessage( - 2, - f, - proto.org.dash.platform.dapi.v0.SpecificKeys.serializeBinaryToWriter - ); - } - f = message.getSearchKey(); - if (f != null) { - writer.writeMessage( - 3, - f, - proto.org.dash.platform.dapi.v0.SearchKey.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.serializeBinaryToWriter ); } }; -/** - * optional AllKeys all_keys = 1; - * @return {?proto.org.dash.platform.dapi.v0.AllKeys} - */ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.getAllKeys = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.AllKeys} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.AllKeys, 1)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.AllKeys|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} returns this -*/ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.setAllKeys = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.KeyRequestType.oneofGroups_[0], value); -}; - /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} returns this + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} + * @const */ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.clearAllKeys = function() { - return this.setAllKeys(undefined); -}; - +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.oneofGroups_ = [[1,2]]; /** - * Returns whether this field is set. - * @return {boolean} + * @enum {number} */ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.hasAllKeys = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + KEYS: 1, + PROOF: 2 }; - /** - * optional SpecificKeys specific_keys = 2; - * @return {?proto.org.dash.platform.dapi.v0.SpecificKeys} + * @return {proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.ResultCase} */ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.getSpecificKeys = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.SpecificKeys} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.SpecificKeys, 2)); +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.oneofGroups_[0])); }; -/** - * @param {?proto.org.dash.platform.dapi.v0.SpecificKeys|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} returns this -*/ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.setSpecificKeys = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.KeyRequestType.oneofGroups_[0], value); -}; - +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} returns this + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.clearSpecificKeys = function() { - return this.setSpecificKeys(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.hasSpecificKeys = function() { - return jspb.Message.getField(this, 2) != null; -}; - - -/** - * optional SearchKey search_key = 3; - * @return {?proto.org.dash.platform.dapi.v0.SearchKey} - */ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.getSearchKey = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.SearchKey} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.SearchKey, 3)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.SearchKey|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} returns this -*/ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.setSearchKey = function(value) { - return jspb.Message.setOneofWrapperField(this, 3, proto.org.dash.platform.dapi.v0.KeyRequestType.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} returns this - */ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.clearSearchKey = function() { - return this.setSearchKey(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.hasSearchKey = function() { - return jspb.Message.getField(this, 3) != null; -}; - - - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.org.dash.platform.dapi.v0.AllKeys.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.AllKeys.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.toObject(opt_includeInstance, this); }; @@ -9684,13 +9401,15 @@ proto.org.dash.platform.dapi.v0.AllKeys.prototype.toObject = function(opt_includ * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.AllKeys} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.AllKeys.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - + keys: (f = msg.getKeys()) && proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.toObject(includeInstance, f), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; if (includeInstance) { @@ -9704,29 +9423,44 @@ proto.org.dash.platform.dapi.v0.AllKeys.toObject = function(includeInstance, msg /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.AllKeys} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} */ -proto.org.dash.platform.dapi.v0.AllKeys.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.AllKeys; - return proto.org.dash.platform.dapi.v0.AllKeys.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0; + return proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.AllKeys} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.AllKeys} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} */ -proto.org.dash.platform.dapi.v0.AllKeys.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; } var field = reader.getFieldNumber(); switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.deserializeBinaryFromReader); + msg.setKeys(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); + break; default: reader.skipField(); break; @@ -9740,9 +9474,9 @@ proto.org.dash.platform.dapi.v0.AllKeys.deserializeBinaryFromReader = function(m * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.AllKeys.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.AllKeys.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -9750,12 +9484,36 @@ proto.org.dash.platform.dapi.v0.AllKeys.prototype.serializeBinary = function() { /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.AllKeys} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.AllKeys.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; + f = message.getKeys(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.serializeBinaryToWriter + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); + } }; @@ -9765,7 +9523,7 @@ proto.org.dash.platform.dapi.v0.AllKeys.serializeBinaryToWriter = function(messa * @private {!Array} * @const */ -proto.org.dash.platform.dapi.v0.SpecificKeys.repeatedFields_ = [1]; +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.repeatedFields_ = [1]; @@ -9782,8 +9540,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.SpecificKeys.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.toObject(opt_includeInstance, this); }; @@ -9792,13 +9550,13 @@ proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.toObject = function(opt_i * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.SpecificKeys} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.SpecificKeys.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.toObject = function(includeInstance, msg) { var f, obj = { - keyIdsList: (f = jspb.Message.getRepeatedField(msg, 1)) == null ? undefined : f + keysBytesList: msg.getKeysBytesList_asB64() }; if (includeInstance) { @@ -9812,23 +9570,23 @@ proto.org.dash.platform.dapi.v0.SpecificKeys.toObject = function(includeInstance /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.SpecificKeys} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} */ -proto.org.dash.platform.dapi.v0.SpecificKeys.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.SpecificKeys; - return proto.org.dash.platform.dapi.v0.SpecificKeys.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys; + return proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.SpecificKeys} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.SpecificKeys} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} */ -proto.org.dash.platform.dapi.v0.SpecificKeys.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -9836,10 +9594,8 @@ proto.org.dash.platform.dapi.v0.SpecificKeys.deserializeBinaryFromReader = funct var field = reader.getFieldNumber(); switch (field) { case 1: - var values = /** @type {!Array} */ (reader.isDelimited() ? reader.readPackedUint32() : [reader.readUint32()]); - for (var i = 0; i < values.length; i++) { - msg.addKeyIds(values[i]); - } + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addKeysBytes(value); break; default: reader.skipField(); @@ -9854,9 +9610,9 @@ proto.org.dash.platform.dapi.v0.SpecificKeys.deserializeBinaryFromReader = funct * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.SpecificKeys.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -9864,15 +9620,15 @@ proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.serializeBinary = functio /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.SpecificKeys} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.SpecificKeys.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getKeyIdsList(); + f = message.getKeysBytesList_asU8(); if (f.length > 0) { - writer.writePackedUint32( + writer.writeRepeatedBytes( 1, f ); @@ -9881,175 +9637,239 @@ proto.org.dash.platform.dapi.v0.SpecificKeys.serializeBinaryToWriter = function( /** - * repeated uint32 key_ids = 1; - * @return {!Array} + * repeated bytes keys_bytes = 1; + * @return {!Array} */ -proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.getKeyIdsList = function() { - return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 1)); +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.getKeysBytesList = function() { + return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 1)); }; /** - * @param {!Array} value - * @return {!proto.org.dash.platform.dapi.v0.SpecificKeys} returns this + * repeated bytes keys_bytes = 1; + * This is a type-conversion wrapper around `getKeysBytesList()` + * @return {!Array} */ -proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.setKeyIdsList = function(value) { +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.getKeysBytesList_asB64 = function() { + return /** @type {!Array} */ (jspb.Message.bytesListAsB64( + this.getKeysBytesList())); +}; + + +/** + * repeated bytes keys_bytes = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getKeysBytesList()` + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.getKeysBytesList_asU8 = function() { + return /** @type {!Array} */ (jspb.Message.bytesListAsU8( + this.getKeysBytesList())); +}; + + +/** + * @param {!(Array|Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.setKeysBytesList = function(value) { return jspb.Message.setField(this, 1, value || []); }; /** - * @param {number} value + * @param {!(string|Uint8Array)} value * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.SpecificKeys} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} returns this */ -proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.addKeyIds = function(value, opt_index) { +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.addKeysBytes = function(value, opt_index) { return jspb.Message.addToRepeatedField(this, 1, value, opt_index); }; /** * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.SpecificKeys} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} returns this */ -proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.clearKeyIdsList = function() { - return this.setKeyIdsList([]); +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.clearKeysBytesList = function() { + return this.setKeysBytesList([]); }; - - - -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * optional Keys keys = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} */ -proto.org.dash.platform.dapi.v0.SearchKey.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.SearchKey.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.getKeys = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys, 1)); }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.SearchKey} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.setKeys = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.SearchKey.toObject = function(includeInstance, msg) { - var f, obj = { - purposeMapMap: (f = msg.getPurposeMapMap()) ? f.toObject(includeInstance, proto.org.dash.platform.dapi.v0.SecurityLevelMap.toObject) : [] - }; +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.clearKeys = function() { + return this.setKeys(undefined); +}; - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.hasKeys = function() { + return jspb.Message.getField(this, 1) != null; }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.SearchKey} + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.SearchKey.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.SearchKey; - return proto.org.dash.platform.dapi.v0.SearchKey.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.SearchKey} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.SearchKey} + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.SearchKey.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = msg.getPurposeMapMap(); - reader.readMessage(value, function(message, reader) { - jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readUint32, jspb.BinaryReader.prototype.readMessage, proto.org.dash.platform.dapi.v0.SecurityLevelMap.deserializeBinaryFromReader, 0, new proto.org.dash.platform.dapi.v0.SecurityLevelMap()); - }); - break; - default: - reader.skipField(); - break; - } - } - return msg; +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); }; /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.SearchKey.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.SearchKey.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.SearchKey} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.SearchKey.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getPurposeMapMap(true); - if (f && f.getLength() > 0) { - f.serializeBinary(1, writer, jspb.BinaryWriter.prototype.writeUint32, jspb.BinaryWriter.prototype.writeMessage, proto.org.dash.platform.dapi.v0.SecurityLevelMap.serializeBinaryToWriter); - } +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); }; /** - * map purpose_map = 1; - * @param {boolean=} opt_noLazyCreate Do not create the map if - * empty, instead returning `undefined` - * @return {!jspb.Map} + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.SearchKey.prototype.getPurposeMapMap = function(opt_noLazyCreate) { - return /** @type {!jspb.Map} */ ( - jspb.Message.getMapField(this, 1, opt_noLazyCreate, - proto.org.dash.platform.dapi.v0.SecurityLevelMap)); +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); }; /** - * Clears values from the map. The map will be non-null. - * @return {!proto.org.dash.platform.dapi.v0.SearchKey} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.SearchKey.prototype.clearPurposeMapMap = function() { - this.getPurposeMapMap().clear(); - return this;}; +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional GetIdentityKeysResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.oneofGroups_[0])); +}; @@ -10066,8 +9886,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.SecurityLevelMap.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.SecurityLevelMap.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.toObject(opt_includeInstance, this); }; @@ -10076,13 +9896,13 @@ proto.org.dash.platform.dapi.v0.SecurityLevelMap.prototype.toObject = function(o * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.SecurityLevelMap} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.SecurityLevelMap.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.toObject = function(includeInstance, msg) { var f, obj = { - securityLevelMapMap: (f = msg.getSecurityLevelMapMap()) ? f.toObject(includeInstance, undefined) : [] + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -10096,23 +9916,23 @@ proto.org.dash.platform.dapi.v0.SecurityLevelMap.toObject = function(includeInst /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.SecurityLevelMap} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest} */ -proto.org.dash.platform.dapi.v0.SecurityLevelMap.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.SecurityLevelMap; - return proto.org.dash.platform.dapi.v0.SecurityLevelMap.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest; + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.SecurityLevelMap} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.SecurityLevelMap} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest} */ -proto.org.dash.platform.dapi.v0.SecurityLevelMap.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -10120,10 +9940,9 @@ proto.org.dash.platform.dapi.v0.SecurityLevelMap.deserializeBinaryFromReader = f var field = reader.getFieldNumber(); switch (field) { case 1: - var value = msg.getSecurityLevelMapMap(); - reader.readMessage(value, function(message, reader) { - jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readUint32, jspb.BinaryReader.prototype.readEnum, null, 0, 0); - }); + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.deserializeBinaryFromReader); + msg.setV0(value); break; default: reader.skipField(); @@ -10138,9 +9957,9 @@ proto.org.dash.platform.dapi.v0.SecurityLevelMap.deserializeBinaryFromReader = f * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.SecurityLevelMap.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.SecurityLevelMap.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -10148,206 +9967,48 @@ proto.org.dash.platform.dapi.v0.SecurityLevelMap.prototype.serializeBinary = fun /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.SecurityLevelMap} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.SecurityLevelMap.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getSecurityLevelMapMap(true); - if (f && f.getLength() > 0) { - f.serializeBinary(1, writer, jspb.BinaryWriter.prototype.writeUint32, jspb.BinaryWriter.prototype.writeEnum); + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.serializeBinaryToWriter + ); } }; + /** - * @enum {number} + * List of repeated fields within this message type. + * @private {!Array} + * @const */ -proto.org.dash.platform.dapi.v0.SecurityLevelMap.KeyKindRequestType = { - CURRENT_KEY_OF_KIND_REQUEST: 0, - ALL_KEYS_OF_KIND_REQUEST: 1 -}; +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.repeatedFields_ = [1,4]; + + +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * map security_level_map = 1; - * @param {boolean=} opt_noLazyCreate Do not create the map if - * empty, instead returning `undefined` - * @return {!jspb.Map} + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.SecurityLevelMap.prototype.getSecurityLevelMapMap = function(opt_noLazyCreate) { - return /** @type {!jspb.Map} */ ( - jspb.Message.getMapField(this, 1, opt_noLazyCreate, - null)); -}; - - -/** - * Clears values from the map. The map will be non-null. - * @return {!proto.org.dash.platform.dapi.v0.SecurityLevelMap} returns this - */ -proto.org.dash.platform.dapi.v0.SecurityLevelMap.prototype.clearSecurityLevelMapMap = function() { - this.getSecurityLevelMapMap().clear(); - return this;}; - - - -/** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.oneofGroups_ = [[1]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.VersionCase} - */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.oneofGroups_[0])); -}; - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.toObject = function(includeInstance, msg) { - var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.toObject(includeInstance, f) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} - */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest; - return proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} - */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.deserializeBinaryFromReader); - msg.setV0(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.serializeBinaryToWriter - ); - } -}; - - - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.toObject(opt_includeInstance, this); }; @@ -10356,16 +10017,16 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0. * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - identityId: msg.getIdentityId_asB64(), - requestType: (f = msg.getRequestType()) && proto.org.dash.platform.dapi.v0.KeyRequestType.toObject(includeInstance, f), - limit: (f = msg.getLimit()) && google_protobuf_wrappers_pb.UInt32Value.toObject(includeInstance, f), - offset: (f = msg.getOffset()) && google_protobuf_wrappers_pb.UInt32Value.toObject(includeInstance, f), + identitiesIdsList: msg.getIdentitiesIdsList_asB64(), + contractId: msg.getContractId_asB64(), + documentTypeName: jspb.Message.getFieldWithDefault(msg, 3, ""), + purposesList: (f = jspb.Message.getRepeatedField(msg, 4)) == null ? undefined : f, prove: jspb.Message.getBooleanFieldWithDefault(msg, 5, false) }; @@ -10380,23 +10041,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0. /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0; - return proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0; + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -10405,22 +10066,21 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0. switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setIdentityId(value); + msg.addIdentitiesIds(value); break; case 2: - var value = new proto.org.dash.platform.dapi.v0.KeyRequestType; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.KeyRequestType.deserializeBinaryFromReader); - msg.setRequestType(value); + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setContractId(value); break; case 3: - var value = new google_protobuf_wrappers_pb.UInt32Value; - reader.readMessage(value,google_protobuf_wrappers_pb.UInt32Value.deserializeBinaryFromReader); - msg.setLimit(value); + var value = /** @type {string} */ (reader.readString()); + msg.setDocumentTypeName(value); break; case 4: - var value = new google_protobuf_wrappers_pb.UInt32Value; - reader.readMessage(value,google_protobuf_wrappers_pb.UInt32Value.deserializeBinaryFromReader); - msg.setOffset(value); + var values = /** @type {!Array} */ (reader.isDelimited() ? reader.readPackedEnum() : [reader.readEnum()]); + for (var i = 0; i < values.length; i++) { + msg.addPurposes(values[i]); + } break; case 5: var value = /** @type {boolean} */ (reader.readBool()); @@ -10439,9 +10099,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0. * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -10449,41 +10109,38 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0. /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getIdentityId_asU8(); + f = message.getIdentitiesIdsList_asU8(); if (f.length > 0) { - writer.writeBytes( + writer.writeRepeatedBytes( 1, f ); } - f = message.getRequestType(); - if (f != null) { - writer.writeMessage( + f = message.getContractId_asU8(); + if (f.length > 0) { + writer.writeBytes( 2, - f, - proto.org.dash.platform.dapi.v0.KeyRequestType.serializeBinaryToWriter + f ); } - f = message.getLimit(); + f = /** @type {string} */ (jspb.Message.getField(message, 3)); if (f != null) { - writer.writeMessage( + writer.writeString( 3, - f, - google_protobuf_wrappers_pb.UInt32Value.serializeBinaryToWriter + f ); } - f = message.getOffset(); - if (f != null) { - writer.writeMessage( + f = message.getPurposesList(); + if (f.length > 0) { + writer.writePackedEnum( 4, - f, - google_protobuf_wrappers_pb.UInt32Value.serializeBinaryToWriter + f ); } f = message.getProve(); @@ -10497,109 +10154,132 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0. /** - * optional bytes identity_id = 1; - * @return {string} + * repeated bytes identities_ids = 1; + * @return {!Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getIdentityId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getIdentitiesIdsList = function() { + return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 1)); }; /** - * optional bytes identity_id = 1; - * This is a type-conversion wrapper around `getIdentityId()` - * @return {string} + * repeated bytes identities_ids = 1; + * This is a type-conversion wrapper around `getIdentitiesIdsList()` + * @return {!Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getIdentityId_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getIdentityId())); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getIdentitiesIdsList_asB64 = function() { + return /** @type {!Array} */ (jspb.Message.bytesListAsB64( + this.getIdentitiesIdsList())); }; /** - * optional bytes identity_id = 1; + * repeated bytes identities_ids = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getIdentityId()` - * @return {!Uint8Array} + * This is a type-conversion wrapper around `getIdentitiesIdsList()` + * @return {!Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getIdentityId_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getIdentityId())); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getIdentitiesIdsList_asU8 = function() { + return /** @type {!Array} */ (jspb.Message.bytesListAsU8( + this.getIdentitiesIdsList())); }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this + * @param {!(Array|Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.setIdentityId = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.setIdentitiesIdsList = function(value) { + return jspb.Message.setField(this, 1, value || []); }; /** - * optional KeyRequestType request_type = 2; - * @return {?proto.org.dash.platform.dapi.v0.KeyRequestType} + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getRequestType = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.KeyRequestType} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.KeyRequestType, 2)); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.addIdentitiesIds = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 1, value, opt_index); }; /** - * @param {?proto.org.dash.platform.dapi.v0.KeyRequestType|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.setRequestType = function(value) { - return jspb.Message.setWrapperField(this, 2, value); + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.clearIdentitiesIdsList = function() { + return this.setIdentitiesIdsList([]); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this + * optional bytes contract_id = 2; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.clearRequestType = function() { - return this.setRequestType(undefined); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getContractId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** - * Returns whether this field is set. - * @return {boolean} + * optional bytes contract_id = 2; + * This is a type-conversion wrapper around `getContractId()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.hasRequestType = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getContractId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getContractId())); }; /** - * optional google.protobuf.UInt32Value limit = 3; - * @return {?proto.google.protobuf.UInt32Value} + * optional bytes contract_id = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getContractId()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getLimit = function() { - return /** @type{?proto.google.protobuf.UInt32Value} */ ( - jspb.Message.getWrapperField(this, google_protobuf_wrappers_pb.UInt32Value, 3)); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getContractId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getContractId())); }; /** - * @param {?proto.google.protobuf.UInt32Value|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.setLimit = function(value) { - return jspb.Message.setWrapperField(this, 3, value); + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.setContractId = function(value) { + return jspb.Message.setProto3BytesField(this, 2, value); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this + * optional string document_type_name = 3; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.clearLimit = function() { - return this.setLimit(undefined); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getDocumentTypeName = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.setDocumentTypeName = function(value) { + return jspb.Message.setField(this, 3, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.clearDocumentTypeName = function() { + return jspb.Message.setField(this, 3, undefined); }; @@ -10607,45 +10287,45 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0. * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.hasLimit = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.hasDocumentTypeName = function() { return jspb.Message.getField(this, 3) != null; }; /** - * optional google.protobuf.UInt32Value offset = 4; - * @return {?proto.google.protobuf.UInt32Value} + * repeated KeyPurpose purposes = 4; + * @return {!Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getOffset = function() { - return /** @type{?proto.google.protobuf.UInt32Value} */ ( - jspb.Message.getWrapperField(this, google_protobuf_wrappers_pb.UInt32Value, 4)); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getPurposesList = function() { + return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 4)); }; /** - * @param {?proto.google.protobuf.UInt32Value|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.setOffset = function(value) { - return jspb.Message.setWrapperField(this, 4, value); + * @param {!Array} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.setPurposesList = function(value) { + return jspb.Message.setField(this, 4, value || []); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this + * @param {!proto.org.dash.platform.dapi.v0.KeyPurpose} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.clearOffset = function() { - return this.setOffset(undefined); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.addPurposes = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 4, value, opt_index); }; /** - * Returns whether this field is set. - * @return {boolean} + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.hasOffset = function() { - return jspb.Message.getField(this, 4) != null; +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.clearPurposesList = function() { + return this.setPurposesList([]); }; @@ -10653,44 +10333,44 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0. * optional bool prove = 5; * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getProve = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getProve = function() { return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 5, false)); }; /** * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.setProve = function(value) { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.setProve = function(value) { return jspb.Message.setProto3BooleanField(this, 5, value); }; /** - * optional GetIdentityKeysRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} + * optional GetIdentitiesContractKeysRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -10699,7 +10379,7 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.clearV0 = funct * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -10713,21 +10393,21 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.hasV0 = functio * @private {!Array>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.VersionCase = { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.oneofGroups_[0])); }; @@ -10745,8 +10425,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.toObject(opt_includeInstance, this); }; @@ -10755,13 +10435,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.toObject = fun * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -10775,23 +10455,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.toObject = function(incl /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse; - return proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse; + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -10799,8 +10479,8 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.deserializeBinaryFromRea var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -10816,9 +10496,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.deserializeBinaryFromRea * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -10826,18 +10506,18 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.serializeBinar /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.serializeBinaryToWriter ); } }; @@ -10852,22 +10532,22 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.serializeBinaryToWriter * @private {!Array>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.oneofGroups_ = [[1,2]]; +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.oneofGroups_ = [[1,2]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.ResultCase = { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.ResultCase = { RESULT_NOT_SET: 0, - KEYS: 1, + IDENTITIES_KEYS: 1, PROOF: 2 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.ResultCase} + * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.ResultCase} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.oneofGroups_[0])); }; @@ -10885,8 +10565,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.toObject(opt_includeInstance, this); }; @@ -10895,13 +10575,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - keys: (f = msg.getKeys()) && proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.toObject(includeInstance, f), + identitiesKeys: (f = msg.getIdentitiesKeys()) && proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.toObject(includeInstance, f), proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; @@ -10917,23 +10597,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0; - return proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0; + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -10941,9 +10621,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.deserializeBinaryFromReader); - msg.setKeys(value); + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.deserializeBinaryFromReader); + msg.setIdentitiesKeys(value); break; case 2: var value = new proto.org.dash.platform.dapi.v0.Proof; @@ -10968,9 +10648,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -10978,18 +10658,18 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getKeys(); + f = message.getIdentitiesKeys(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.serializeBinaryToWriter ); } f = message.getProof(); @@ -11017,7 +10697,7 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV * @private {!Array} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.repeatedFields_ = [1]; +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.repeatedFields_ = [2]; @@ -11034,8 +10714,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.toObject(opt_includeInstance, this); }; @@ -11044,12 +10724,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.toObject = function(includeInstance, msg) { var f, obj = { + purpose: jspb.Message.getFieldWithDefault(msg, 1, 0), keysBytesList: msg.getKeysBytesList_asB64() }; @@ -11064,23 +10745,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys; - return proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys; + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -11088,6 +10769,10 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV var field = reader.getFieldNumber(); switch (field) { case 1: + var value = /** @type {!proto.org.dash.platform.dapi.v0.KeyPurpose} */ (reader.readEnum()); + msg.setPurpose(value); + break; + case 2: var value = /** @type {!Uint8Array} */ (reader.readBytes()); msg.addKeysBytes(value); break; @@ -11104,9 +10789,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -11114,16 +10799,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.serializeBinaryToWriter = function(message, writer) { var f = undefined; + f = message.getPurpose(); + if (f !== 0.0) { + writer.writeEnum( + 1, + f + ); + } f = message.getKeysBytesList_asU8(); if (f.length > 0) { writer.writeRepeatedBytes( - 1, + 2, f ); } @@ -11131,33 +10823,51 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV /** - * repeated bytes keys_bytes = 1; + * optional KeyPurpose purpose = 1; + * @return {!proto.org.dash.platform.dapi.v0.KeyPurpose} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.getPurpose = function() { + return /** @type {!proto.org.dash.platform.dapi.v0.KeyPurpose} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.KeyPurpose} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.setPurpose = function(value) { + return jspb.Message.setProto3EnumField(this, 1, value); +}; + + +/** + * repeated bytes keys_bytes = 2; * @return {!Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.getKeysBytesList = function() { - return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 1)); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.getKeysBytesList = function() { + return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 2)); }; /** - * repeated bytes keys_bytes = 1; + * repeated bytes keys_bytes = 2; * This is a type-conversion wrapper around `getKeysBytesList()` * @return {!Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.getKeysBytesList_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.getKeysBytesList_asB64 = function() { return /** @type {!Array} */ (jspb.Message.bytesListAsB64( this.getKeysBytesList())); }; /** - * repeated bytes keys_bytes = 1; + * repeated bytes keys_bytes = 2; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array * This is a type-conversion wrapper around `getKeysBytesList()` * @return {!Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.getKeysBytesList_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.getKeysBytesList_asU8 = function() { return /** @type {!Array} */ (jspb.Message.bytesListAsU8( this.getKeysBytesList())); }; @@ -11165,205 +10875,253 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV /** * @param {!(Array|Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.setKeysBytesList = function(value) { - return jspb.Message.setField(this, 1, value || []); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.setKeysBytesList = function(value) { + return jspb.Message.setField(this, 2, value || []); }; /** * @param {!(string|Uint8Array)} value * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.addKeysBytes = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.addKeysBytes = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 2, value, opt_index); }; /** * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.clearKeysBytesList = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.clearKeysBytesList = function() { return this.setKeysBytesList([]); }; + /** - * optional Keys keys = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} + * List of repeated fields within this message type. + * @private {!Array} + * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.getKeys = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys, 1)); -}; +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.repeatedFields_ = [2]; + +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.setKeys = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.oneofGroups_[0], value); + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.toObject(opt_includeInstance, this); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} returns this + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.clearKeys = function() { - return this.setKeys(undefined); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.toObject = function(includeInstance, msg) { + var f, obj = { + identityId: msg.getIdentityId_asB64(), + keysList: jspb.Message.toObjectList(msg.getKeysList(), + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.toObject, includeInstance) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * Returns whether this field is set. - * @return {boolean} + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.hasKeys = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys; + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.deserializeBinaryFromReader(msg, reader); }; /** - * optional Proof proof = 2; - * @return {?proto.org.dash.platform.dapi.v0.Proof} + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.getProof = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setIdentityId(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.deserializeBinaryFromReader); + msg.addKeys(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} returns this + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.clearProof = function() { - return this.setProof(undefined); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * Returns whether this field is set. - * @return {boolean} + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.hasProof = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getIdentityId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getKeysList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.serializeBinaryToWriter + ); + } }; /** - * optional ResponseMetadata metadata = 3; - * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + * optional bytes identity_id = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.getMetadata = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.getIdentityId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 3, value); + * optional bytes identity_id = 1; + * This is a type-conversion wrapper around `getIdentityId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.getIdentityId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getIdentityId())); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} returns this + * optional bytes identity_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIdentityId()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.clearMetadata = function() { - return this.setMetadata(undefined); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.getIdentityId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getIdentityId())); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.setIdentityId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * optional GetIdentityKeysResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} + * repeated PurposeKeys keys = 2; + * @return {!Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.getKeysList = function() { + return /** @type{!Array} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys, 2)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} returns this + * @param {!Array} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.setKeysList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 2, value); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} returns this + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.clearV0 = function() { - return this.setV0(undefined); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.addKeys = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 2, opt_value, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys, opt_index); }; /** - * Returns whether this field is set. - * @return {boolean} + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.clearKeysList = function() { + return this.setKeysList([]); }; /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array>} + * List of repeated fields within this message type. + * @private {!Array} * @const */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.oneofGroups_ = [[1]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetProofsRequest.VersionCase} - */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetProofsRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetProofsRequest.oneofGroups_[0])); -}; +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.repeatedFields_ = [1]; @@ -11380,8 +11138,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProofsRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.toObject(opt_includeInstance, this); }; @@ -11390,13 +11148,14 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.toObject = function(o * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.toObject(includeInstance, f) + entriesList: jspb.Message.toObjectList(msg.getEntriesList(), + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.toObject, includeInstance) }; if (includeInstance) { @@ -11410,23 +11169,23 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.toObject = function(includeInst /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest; - return proto.org.dash.platform.dapi.v0.GetProofsRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys; + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -11434,9 +11193,9 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.deserializeBinaryFromReader = f var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.deserializeBinaryFromReader); - msg.setV0(value); + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.deserializeBinaryFromReader); + msg.addEntries(value); break; default: reader.skipField(); @@ -11451,9 +11210,9 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.deserializeBinaryFromReader = f * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProofsRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -11461,176 +11220,235 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.serializeBinary = fun /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( + f = message.getEntriesList(); + if (f.length > 0) { + writer.writeRepeatedMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.serializeBinaryToWriter ); } }; - /** - * List of repeated fields within this message type. - * @private {!Array} - * @const + * repeated IdentityKeys entries = 1; + * @return {!Array} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.repeatedFields_ = [1,2,3]; +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.prototype.getEntriesList = function() { + return /** @type{!Array} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys, 1)); +}; +/** + * @param {!Array} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.prototype.setEntriesList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); +}; + -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.prototype.addEntries = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys, opt_index); }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.toObject = function(includeInstance, msg) { - var f, obj = { - identitiesList: jspb.Message.toObjectList(msg.getIdentitiesList(), - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.toObject, includeInstance), - contractsList: jspb.Message.toObjectList(msg.getContractsList(), - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.toObject, includeInstance), - documentsList: jspb.Message.toObjectList(msg.getDocumentsList(), - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.toObject, includeInstance) - }; +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.prototype.clearEntriesList = function() { + return this.setEntriesList([]); +}; - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; + +/** + * optional IdentitiesKeys identities_keys = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.getIdentitiesKeys = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys, 1)); }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} + * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.setIdentitiesKeys = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0; - return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.clearIdentitiesKeys = function() { + return this.setIdentitiesKeys(undefined); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.deserializeBinaryFromReader); - msg.addIdentities(value); - break; - case 2: - var value = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.deserializeBinaryFromReader); - msg.addContracts(value); - break; - case 3: - var value = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.deserializeBinaryFromReader); - msg.addDocuments(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.hasIdentitiesKeys = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getIdentitiesList(); - if (f.length > 0) { - writer.writeRepeatedMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.serializeBinaryToWriter - ); - } - f = message.getContractsList(); - if (f.length > 0) { - writer.writeRepeatedMessage( - 2, - f, - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.serializeBinaryToWriter - ); - } - f = message.getDocumentsList(); - if (f.length > 0) { - writer.writeRepeatedMessage( - 3, - f, - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.serializeBinaryToWriter - ); - } +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional GetIdentitiesContractKeysResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; }; +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetProofsRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetProofsRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetProofsRequest.oneofGroups_[0])); +}; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -11646,8 +11464,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProofsRequest.toObject(opt_includeInstance, this); }; @@ -11656,16 +11474,13 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequ * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetProofsRequest.toObject = function(includeInstance, msg) { var f, obj = { - contractId: msg.getContractId_asB64(), - documentType: jspb.Message.getFieldWithDefault(msg, 2, ""), - documentTypeKeepsHistory: jspb.Message.getBooleanFieldWithDefault(msg, 3, false), - documentId: msg.getDocumentId_asB64() + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -11679,23 +11494,23 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequ /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetProofsRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest; - return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest; + return proto.org.dash.platform.dapi.v0.GetProofsRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetProofsRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -11703,20 +11518,9 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequ var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setContractId(value); - break; - case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setDocumentType(value); - break; - case 3: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setDocumentTypeKeepsHistory(value); - break; - case 4: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setDocumentId(value); + var value = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.deserializeBinaryFromReader); + msg.setV0(value); break; default: reader.skipField(); @@ -11731,9 +11535,9 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequ * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetProofsRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -11741,160 +11545,172 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequ /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetProofsRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getContractId_asU8(); - if (f.length > 0) { - writer.writeBytes( + f = message.getV0(); + if (f != null) { + writer.writeMessage( 1, - f - ); - } - f = message.getDocumentType(); - if (f.length > 0) { - writer.writeString( - 2, - f - ); - } - f = message.getDocumentTypeKeepsHistory(); - if (f) { - writer.writeBool( - 3, - f - ); - } - f = message.getDocumentId_asU8(); - if (f.length > 0) { - writer.writeBytes( - 4, - f + f, + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.serializeBinaryToWriter ); } }; + /** - * optional bytes contract_id = 1; - * @return {string} + * List of repeated fields within this message type. + * @private {!Array} + * @const */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getContractId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.repeatedFields_ = [1,2,3]; + +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * optional bytes contract_id = 1; - * This is a type-conversion wrapper around `getContractId()` - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getContractId_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getContractId())); -}; - - -/** - * optional bytes contract_id = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getContractId()` - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getContractId_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getContractId())); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} returns this - */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.setContractId = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); -}; - - -/** - * optional string document_type = 2; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getDocumentType = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); -}; - - -/** - * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} returns this + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.setDocumentType = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.toObject(opt_includeInstance, this); }; /** - * optional bool document_type_keeps_history = 3; - * @return {boolean} + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getDocumentTypeKeepsHistory = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); -}; - +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.toObject = function(includeInstance, msg) { + var f, obj = { + identitiesList: jspb.Message.toObjectList(msg.getIdentitiesList(), + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.toObject, includeInstance), + contractsList: jspb.Message.toObjectList(msg.getContractsList(), + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.toObject, includeInstance), + documentsList: jspb.Message.toObjectList(msg.getDocumentsList(), + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.toObject, includeInstance) + }; -/** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} returns this - */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.setDocumentTypeKeepsHistory = function(value) { - return jspb.Message.setProto3BooleanField(this, 3, value); + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * optional bytes document_id = 4; - * @return {string} + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getDocumentId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0; + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.deserializeBinaryFromReader(msg, reader); }; /** - * optional bytes document_id = 4; - * This is a type-conversion wrapper around `getDocumentId()` - * @return {string} + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getDocumentId_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getDocumentId())); +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.deserializeBinaryFromReader); + msg.addIdentities(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.deserializeBinaryFromReader); + msg.addContracts(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.deserializeBinaryFromReader); + msg.addDocuments(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * optional bytes document_id = 4; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getDocumentId()` + * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getDocumentId_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getDocumentId())); +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} returns this + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.setDocumentId = function(value) { - return jspb.Message.setProto3BytesField(this, 4, value); +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getIdentitiesList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.serializeBinaryToWriter + ); + } + f = message.getContractsList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.serializeBinaryToWriter + ); + } + f = message.getDocumentsList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.serializeBinaryToWriter + ); + } }; @@ -11914,8 +11730,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.toObject(opt_includeInstance, this); }; @@ -11924,14 +11740,16 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequ * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.toObject = function(includeInstance, msg) { var f, obj = { - identityId: msg.getIdentityId_asB64(), - requestType: jspb.Message.getFieldWithDefault(msg, 2, 0) + contractId: msg.getContractId_asB64(), + documentType: jspb.Message.getFieldWithDefault(msg, 2, ""), + documentTypeKeepsHistory: jspb.Message.getBooleanFieldWithDefault(msg, 3, false), + documentId: msg.getDocumentId_asB64() }; if (includeInstance) { @@ -11945,23 +11763,23 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequ /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest; - return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest; + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -11970,11 +11788,19 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequ switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setIdentityId(value); + msg.setContractId(value); break; case 2: - var value = /** @type {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type} */ (reader.readEnum()); - msg.setRequestType(value); + var value = /** @type {string} */ (reader.readString()); + msg.setDocumentType(value); + break; + case 3: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setDocumentTypeKeepsHistory(value); + break; + case 4: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setDocumentId(value); break; default: reader.skipField(); @@ -11989,9 +11815,9 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequ * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -11999,96 +11825,160 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequ /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getIdentityId_asU8(); + f = message.getContractId_asU8(); if (f.length > 0) { writer.writeBytes( 1, f ); } - f = message.getRequestType(); - if (f !== 0.0) { - writer.writeEnum( + f = message.getDocumentType(); + if (f.length > 0) { + writer.writeString( 2, f ); } -}; - - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type = { - FULL_IDENTITY: 0, - BALANCE: 1, - KEYS: 2, - REVISION: 3 -}; + f = message.getDocumentTypeKeepsHistory(); + if (f) { + writer.writeBool( + 3, + f + ); + } + f = message.getDocumentId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 4, + f + ); + } +}; + /** - * optional bytes identity_id = 1; + * optional bytes contract_id = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.getIdentityId = function() { +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getContractId = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional bytes identity_id = 1; - * This is a type-conversion wrapper around `getIdentityId()` + * optional bytes contract_id = 1; + * This is a type-conversion wrapper around `getContractId()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.getIdentityId_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getContractId_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getIdentityId())); + this.getContractId())); }; /** - * optional bytes identity_id = 1; + * optional bytes contract_id = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getIdentityId()` + * This is a type-conversion wrapper around `getContractId()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.getIdentityId_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getContractId_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getIdentityId())); + this.getContractId())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.setIdentityId = function(value) { +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.setContractId = function(value) { return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * optional Type request_type = 2; - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type} + * optional string document_type = 2; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.getRequestType = function() { - return /** @type {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getDocumentType = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} returns this + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.setRequestType = function(value) { - return jspb.Message.setProto3EnumField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.setDocumentType = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * optional bool document_type_keeps_history = 3; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getDocumentTypeKeepsHistory = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.setDocumentTypeKeepsHistory = function(value) { + return jspb.Message.setProto3BooleanField(this, 3, value); +}; + + +/** + * optional bytes document_id = 4; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getDocumentId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +}; + + +/** + * optional bytes document_id = 4; + * This is a type-conversion wrapper around `getDocumentId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getDocumentId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getDocumentId())); +}; + + +/** + * optional bytes document_id = 4; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getDocumentId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getDocumentId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getDocumentId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.setDocumentId = function(value) { + return jspb.Message.setProto3BytesField(this, 4, value); }; @@ -12108,8 +11998,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.toObject(opt_includeInstance, this); }; @@ -12118,13 +12008,14 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequ * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.toObject = function(includeInstance, msg) { var f, obj = { - contractId: msg.getContractId_asB64() + identityId: msg.getIdentityId_asB64(), + requestType: jspb.Message.getFieldWithDefault(msg, 2, 0) }; if (includeInstance) { @@ -12138,23 +12029,23 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequ /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest; - return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest; + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -12163,7 +12054,11 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequ switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setContractId(value); + msg.setIdentityId(value); + break; + case 2: + var value = /** @type {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type} */ (reader.readEnum()); + msg.setRequestType(value); break; default: reader.skipField(); @@ -12178,9 +12073,9 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequ * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -12188,118 +12083,307 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequ /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getContractId_asU8(); + f = message.getIdentityId_asU8(); if (f.length > 0) { writer.writeBytes( 1, f ); } + f = message.getRequestType(); + if (f !== 0.0) { + writer.writeEnum( + 2, + f + ); + } }; /** - * optional bytes contract_id = 1; + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type = { + FULL_IDENTITY: 0, + BALANCE: 1, + KEYS: 2, + REVISION: 3 +}; + +/** + * optional bytes identity_id = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.prototype.getContractId = function() { +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.getIdentityId = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional bytes contract_id = 1; - * This is a type-conversion wrapper around `getContractId()` + * optional bytes identity_id = 1; + * This is a type-conversion wrapper around `getIdentityId()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.prototype.getContractId_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.getIdentityId_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getContractId())); + this.getIdentityId())); }; /** - * optional bytes contract_id = 1; + * optional bytes identity_id = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getContractId()` + * This is a type-conversion wrapper around `getIdentityId()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.prototype.getContractId_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.getIdentityId_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getContractId())); + this.getIdentityId())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.prototype.setContractId = function(value) { +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.setIdentityId = function(value) { return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * repeated IdentityRequest identities = 1; - * @return {!Array} + * optional Type request_type = 2; + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.getIdentitiesList = function() { - return /** @type{!Array} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest, 1)); -}; - - -/** - * @param {!Array} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.setIdentitiesList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.getRequestType = function() { + return /** @type {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); }; /** - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest=} opt_value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.addIdentities = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest, opt_index); +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.setRequestType = function(value) { + return jspb.Message.setProto3EnumField(this, 2, value); }; -/** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.clearIdentitiesList = function() { - return this.setIdentitiesList([]); -}; + +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * repeated ContractRequest contracts = 2; - * @return {!Array} + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.getContractsList = function() { - return /** @type{!Array} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest, 2)); +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.toObject(opt_includeInstance, this); }; /** - * @param {!Array} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.setContractsList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 2, value); + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.toObject = function(includeInstance, msg) { + var f, obj = { + contractId: msg.getContractId_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest; + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setContractId(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getContractId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } +}; + + +/** + * optional bytes contract_id = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.prototype.getContractId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes contract_id = 1; + * This is a type-conversion wrapper around `getContractId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.prototype.getContractId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getContractId())); +}; + + +/** + * optional bytes contract_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getContractId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.prototype.getContractId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getContractId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.prototype.setContractId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * repeated IdentityRequest identities = 1; + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.getIdentitiesList = function() { + return /** @type{!Array} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest, 1)); +}; + + +/** + * @param {!Array} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.setIdentitiesList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.addIdentities = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.clearIdentitiesList = function() { + return this.setIdentitiesList([]); +}; + + +/** + * repeated ContractRequest contracts = 2; + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.getContractsList = function() { + return /** @type{!Array} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest, 2)); +}; + + +/** + * @param {!Array} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.setContractsList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 2, value); }; @@ -16731,1114 +16815,93 @@ proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.protot * @return {string} */ proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getStartAt_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getStartAt())); -}; - - -/** - * optional bytes start_at = 7; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getStartAt()` - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getStartAt_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getStartAt())); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.setStartAt = function(value) { - return jspb.Message.setOneofField(this, 7, proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.oneofGroups_[0], value); -}; - - -/** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.clearStartAt = function() { - return jspb.Message.setOneofField(this, 7, proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.oneofGroups_[0], undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.hasStartAt = function() { - return jspb.Message.getField(this, 7) != null; -}; - - -/** - * optional bool prove = 8; - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 8, false)); -}; - - -/** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 8, value); -}; - - -/** - * optional GetDocumentsRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0, 1)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest} returns this -*/ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDocumentsRequest.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest} returns this - */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.clearV0 = function() { - return this.setV0(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; -}; - - - -/** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.oneofGroups_ = [[1]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetDocumentsResponse.VersionCase} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetDocumentsResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.oneofGroups_[0])); -}; - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetDocumentsResponse.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.toObject = function(includeInstance, msg) { - var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.toObject(includeInstance, f) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetDocumentsResponse; - return proto.org.dash.platform.dapi.v0.GetDocumentsResponse.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.deserializeBinaryFromReader); - msg.setV0(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetDocumentsResponse.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.serializeBinaryToWriter - ); - } -}; - - - -/** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.oneofGroups_ = [[1,2]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.ResultCase = { - RESULT_NOT_SET: 0, - DOCUMENTS: 1, - PROOF: 2 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.ResultCase} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.oneofGroups_[0])); -}; - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.toObject = function(includeInstance, msg) { - var f, obj = { - documents: (f = msg.getDocuments()) && proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.toObject(includeInstance, f), - proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), - metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0; - return proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.deserializeBinaryFromReader); - msg.setDocuments(value); - break; - case 2: - var value = new proto.org.dash.platform.dapi.v0.Proof; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); - msg.setProof(value); - break; - case 3: - var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); - msg.setMetadata(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getDocuments(); - if (f != null) { - writer.writeMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.serializeBinaryToWriter - ); - } - f = message.getProof(); - if (f != null) { - writer.writeMessage( - 2, - f, - proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter - ); - } - f = message.getMetadata(); - if (f != null) { - writer.writeMessage( - 3, - f, - proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter - ); - } -}; - - - -/** - * List of repeated fields within this message type. - * @private {!Array} - * @const - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.repeatedFields_ = [1]; - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.toObject = function(includeInstance, msg) { - var f, obj = { - documentsList: msg.getDocumentsList_asB64() - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents; - return proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.addDocuments(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getDocumentsList_asU8(); - if (f.length > 0) { - writer.writeRepeatedBytes( - 1, - f - ); - } -}; - - -/** - * repeated bytes documents = 1; - * @return {!Array} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.getDocumentsList = function() { - return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 1)); -}; - - -/** - * repeated bytes documents = 1; - * This is a type-conversion wrapper around `getDocumentsList()` - * @return {!Array} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.getDocumentsList_asB64 = function() { - return /** @type {!Array} */ (jspb.Message.bytesListAsB64( - this.getDocumentsList())); -}; - - -/** - * repeated bytes documents = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getDocumentsList()` - * @return {!Array} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.getDocumentsList_asU8 = function() { - return /** @type {!Array} */ (jspb.Message.bytesListAsU8( - this.getDocumentsList())); -}; - - -/** - * @param {!(Array|Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} returns this - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.setDocumentsList = function(value) { - return jspb.Message.setField(this, 1, value || []); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} returns this - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.addDocuments = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 1, value, opt_index); -}; - - -/** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} returns this - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.clearDocumentsList = function() { - return this.setDocumentsList([]); -}; - - -/** - * optional Documents documents = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.getDocuments = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents, 1)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.setDocuments = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.clearDocuments = function() { - return this.setDocuments(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.hasDocuments = function() { - return jspb.Message.getField(this, 1) != null; -}; - - -/** - * optional Proof proof = 2; - * @return {?proto.org.dash.platform.dapi.v0.Proof} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.getProof = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.clearProof = function() { - return this.setProof(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.hasProof = function() { - return jspb.Message.getField(this, 2) != null; -}; - - -/** - * optional ResponseMetadata metadata = 3; - * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.getMetadata = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 3, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.clearMetadata = function() { - return this.setMetadata(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 3) != null; -}; - - -/** - * optional GetDocumentsResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0, 1)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} returns this -*/ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} returns this - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.clearV0 = function() { - return this.setV0(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; -}; - - - -/** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.oneofGroups_ = [[1]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.VersionCase} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.oneofGroups_[0])); -}; - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.toObject = function(includeInstance, msg) { - var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.toObject(includeInstance, f) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest; - return proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.deserializeBinaryFromReader); - msg.setV0(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.serializeBinaryToWriter - ); - } -}; - - - -/** - * List of repeated fields within this message type. - * @private {!Array} - * @const - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.repeatedFields_ = [1]; - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.toObject = function(includeInstance, msg) { - var f, obj = { - publicKeyHashesList: msg.getPublicKeyHashesList_asB64(), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0; - return proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.addPublicKeyHashes(value); - break; - case 2: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setProve(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getPublicKeyHashesList_asU8(); - if (f.length > 0) { - writer.writeRepeatedBytes( - 1, - f - ); - } - f = message.getProve(); - if (f) { - writer.writeBool( - 2, - f - ); - } -}; - - -/** - * repeated bytes public_key_hashes = 1; - * @return {!Array} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.prototype.getPublicKeyHashesList = function() { - return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 1)); -}; - - -/** - * repeated bytes public_key_hashes = 1; - * This is a type-conversion wrapper around `getPublicKeyHashesList()` - * @return {!Array} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.prototype.getPublicKeyHashesList_asB64 = function() { - return /** @type {!Array} */ (jspb.Message.bytesListAsB64( - this.getPublicKeyHashesList())); + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getStartAt())); }; /** - * repeated bytes public_key_hashes = 1; + * optional bytes start_at = 7; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getPublicKeyHashesList()` - * @return {!Array} + * This is a type-conversion wrapper around `getStartAt()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.prototype.getPublicKeyHashesList_asU8 = function() { - return /** @type {!Array} */ (jspb.Message.bytesListAsU8( - this.getPublicKeyHashesList())); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getStartAt_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getStartAt())); }; /** - * @param {!(Array|Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0} returns this + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.prototype.setPublicKeyHashesList = function(value) { - return jspb.Message.setField(this, 1, value || []); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.setStartAt = function(value) { + return jspb.Message.setOneofField(this, 7, proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.oneofGroups_[0], value); }; /** - * @param {!(string|Uint8Array)} value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0} returns this + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.prototype.addPublicKeyHashes = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.clearStartAt = function() { + return jspb.Message.setOneofField(this, 7, proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.oneofGroups_[0], undefined); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.prototype.clearPublicKeyHashesList = function() { - return this.setPublicKeyHashesList([]); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.hasStartAt = function() { + return jspb.Message.getField(this, 7) != null; }; /** - * optional bool prove = 2; + * optional bool prove = 8; * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 8, false)); }; /** * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 8, value); }; /** - * optional GetIdentitiesByPublicKeyHashesRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0} + * optional GetDocumentsRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.GetIdentitiesByPublicKeyHashesRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDocumentsRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -17847,7 +16910,7 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.prototype. * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -17861,21 +16924,21 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesRequest.prototype. * @private {!Array>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.VersionCase = { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetDocumentsResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetDocumentsResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.oneofGroups_[0])); }; @@ -17893,8 +16956,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetDocumentsResponse.toObject(opt_includeInstance, this); }; @@ -17903,13 +16966,13 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.prototype * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -17923,23 +16986,23 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.toObject /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse; - return proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetDocumentsResponse; + return proto.org.dash.platform.dapi.v0.GetDocumentsResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -17947,8 +17010,8 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.deseriali var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -17964,9 +17027,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.deseriali * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetDocumentsResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -17974,235 +17037,49 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.prototype /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.serializeBinaryToWriter - ); - } -}; - - - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.toObject = function(includeInstance, msg) { - var f, obj = { - publicKeyHash: msg.getPublicKeyHash_asB64(), - value: (f = msg.getValue()) && google_protobuf_wrappers_pb.BytesValue.toObject(includeInstance, f) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry; - return proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setPublicKeyHash(value); - break; - case 2: - var value = new google_protobuf_wrappers_pb.BytesValue; - reader.readMessage(value,google_protobuf_wrappers_pb.BytesValue.deserializeBinaryFromReader); - msg.setValue(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getPublicKeyHash_asU8(); - if (f.length > 0) { - writer.writeBytes( - 1, - f - ); - } - f = message.getValue(); - if (f != null) { - writer.writeMessage( - 2, - f, - google_protobuf_wrappers_pb.BytesValue.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.serializeBinaryToWriter ); } }; -/** - * optional bytes public_key_hash = 1; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.prototype.getPublicKeyHash = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * optional bytes public_key_hash = 1; - * This is a type-conversion wrapper around `getPublicKeyHash()` - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.prototype.getPublicKeyHash_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getPublicKeyHash())); -}; - - -/** - * optional bytes public_key_hash = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getPublicKeyHash()` - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.prototype.getPublicKeyHash_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getPublicKeyHash())); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.prototype.setPublicKeyHash = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); -}; - - -/** - * optional google.protobuf.BytesValue value = 2; - * @return {?proto.google.protobuf.BytesValue} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.prototype.getValue = function() { - return /** @type{?proto.google.protobuf.BytesValue} */ ( - jspb.Message.getWrapperField(this, google_protobuf_wrappers_pb.BytesValue, 2)); -}; - - -/** - * @param {?proto.google.protobuf.BytesValue|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.prototype.setValue = function(value) { - return jspb.Message.setWrapperField(this, 2, value); -}; - /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry} returns this + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} + * @const */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.prototype.clearValue = function() { - return this.setValue(undefined); -}; - +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.oneofGroups_ = [[1,2]]; /** - * Returns whether this field is set. - * @return {boolean} + * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.prototype.hasValue = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + DOCUMENTS: 1, + PROOF: 2 }; - - /** - * List of repeated fields within this message type. - * @private {!Array} - * @const + * @return {proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.ResultCase} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes.repeatedFields_ = [1]; +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.oneofGroups_[0])); +}; @@ -18219,8 +17096,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.toObject(opt_includeInstance, this); }; @@ -18229,14 +17106,15 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.Identitie * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - identityEntriesList: jspb.Message.toObjectList(msg.getIdentityEntriesList(), - proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.toObject, includeInstance) + documents: (f = msg.getDocuments()) && proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.toObject(includeInstance, f), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; if (includeInstance) { @@ -18250,23 +17128,23 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.Identitie /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes} + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes; - return proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0; + return proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes} + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -18274,9 +17152,19 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.Identitie var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.deserializeBinaryFromReader); - msg.addIdentityEntries(value); + var value = new proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.deserializeBinaryFromReader); + msg.setDocuments(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); break; default: reader.skipField(); @@ -18291,9 +17179,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.Identitie * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -18301,87 +17189,46 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.Identitie /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes} message + * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getIdentityEntriesList(); - if (f.length > 0) { - writer.writeRepeatedMessage( + f = message.getDocuments(); + if (f != null) { + writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.serializeBinaryToWriter + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter ); } -}; - - -/** - * repeated PublicKeyHashIdentityEntry identity_entries = 1; - * @return {!Array} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes.prototype.getIdentityEntriesList = function() { - return /** @type{!Array} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry, 1)); -}; - - -/** - * @param {!Array} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes.prototype.setIdentityEntriesList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 1, value); -}; - - -/** - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry=} opt_value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes.prototype.addIdentityEntries = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.PublicKeyHashIdentityEntry, opt_index); -}; - - -/** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes.prototype.clearIdentityEntriesList = function() { - return this.setIdentityEntriesList([]); }; /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array>} + * List of repeated fields within this message type. + * @private {!Array} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.oneofGroups_ = [[1,2]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.ResultCase = { - RESULT_NOT_SET: 0, - IDENTITIES: 1, - PROOF: 2 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.ResultCase} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.oneofGroups_[0])); -}; +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.repeatedFields_ = [1]; @@ -18398,8 +17245,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.toObject(opt_includeInstance, this); }; @@ -18408,15 +17255,13 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdenti * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.toObject = function(includeInstance, msg) { var f, obj = { - identities: (f = msg.getIdentities()) && proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes.toObject(includeInstance, f), - proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), - metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + documentsList: msg.getDocumentsList_asB64() }; if (includeInstance) { @@ -18430,23 +17275,23 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdenti /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0; - return proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents; + return proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -18454,19 +17299,8 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdenti var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes.deserializeBinaryFromReader); - msg.setIdentities(value); - break; - case 2: - var value = new proto.org.dash.platform.dapi.v0.Proof; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); - msg.setProof(value); - break; - case 3: - var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); - msg.setMetadata(value); + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addDocuments(value); break; default: reader.skipField(); @@ -18481,9 +17315,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdenti * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -18491,64 +17325,108 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdenti /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getIdentities(); - if (f != null) { - writer.writeMessage( + f = message.getDocumentsList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( 1, - f, - proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes.serializeBinaryToWriter - ); - } - f = message.getProof(); - if (f != null) { - writer.writeMessage( - 2, - f, - proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter - ); - } - f = message.getMetadata(); - if (f != null) { - writer.writeMessage( - 3, - f, - proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + f ); } }; /** - * optional IdentitiesByPublicKeyHashes identities = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes} + * repeated bytes documents = 1; + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.getDocumentsList = function() { + return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 1)); +}; + + +/** + * repeated bytes documents = 1; + * This is a type-conversion wrapper around `getDocumentsList()` + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.getDocumentsList_asB64 = function() { + return /** @type {!Array} */ (jspb.Message.bytesListAsB64( + this.getDocumentsList())); +}; + + +/** + * repeated bytes documents = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getDocumentsList()` + * @return {!Array} + */ +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.getDocumentsList_asU8 = function() { + return /** @type {!Array} */ (jspb.Message.bytesListAsU8( + this.getDocumentsList())); +}; + + +/** + * @param {!(Array|Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} returns this + */ +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.setDocumentsList = function(value) { + return jspb.Message.setField(this, 1, value || []); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} returns this + */ +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.addDocuments = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} returns this + */ +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.clearDocumentsList = function() { + return this.setDocumentsList([]); +}; + + +/** + * optional Documents documents = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.prototype.getIdentities = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes, 1)); +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.getDocuments = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.IdentitiesByPublicKeyHashes|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.prototype.setIdentities = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.setDocuments = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.prototype.clearIdentities = function() { - return this.setIdentities(undefined); +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.clearDocuments = function() { + return this.setDocuments(undefined); }; @@ -18556,7 +17434,7 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdenti * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.prototype.hasIdentities = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.hasDocuments = function() { return jspb.Message.getField(this, 1) != null; }; @@ -18565,7 +17443,7 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdenti * optional Proof proof = 2; * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.prototype.getProof = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.getProof = function() { return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; @@ -18573,18 +17451,18 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdenti /** * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.prototype.clearProof = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.clearProof = function() { return this.setProof(undefined); }; @@ -18593,7 +17471,7 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdenti * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.prototype.hasProof = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.hasProof = function() { return jspb.Message.getField(this, 2) != null; }; @@ -18602,7 +17480,7 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdenti * optional ResponseMetadata metadata = 3; * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.prototype.getMetadata = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.getMetadata = function() { return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); }; @@ -18610,18 +17488,18 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdenti /** * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.prototype.setMetadata = function(value) { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.setMetadata = function(value) { return jspb.Message.setWrapperField(this, 3, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.prototype.clearMetadata = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.clearMetadata = function() { return this.setMetadata(undefined); }; @@ -18630,35 +17508,35 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdenti * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0.prototype.hasMetadata = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.hasMetadata = function() { return jspb.Message.getField(this, 3) != null; }; /** - * optional GetIdentitiesByPublicKeyHashesResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0} + * optional GetDocumentsResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.GetIdentitiesByPublicKeyHashesResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -18667,7 +17545,7 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.prototype * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesByPublicKeyHashesResponse.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -26093,4 +24971,15 @@ proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.hasV0 = functi }; +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.KeyPurpose = { + AUTHENTICATION: 0, + ENCRYPTION: 1, + DECRYPTION: 2, + TRANSFER: 3, + VOTING: 5 +}; + goog.object.extend(exports, proto.org.dash.platform.dapi.v0); diff --git a/packages/dapi-grpc/clients/platform/v0/web/platform_pb_service.d.ts b/packages/dapi-grpc/clients/platform/v0/web/platform_pb_service.d.ts index 798657ea3e..c172c02896 100644 --- a/packages/dapi-grpc/clients/platform/v0/web/platform_pb_service.d.ts +++ b/packages/dapi-grpc/clients/platform/v0/web/platform_pb_service.d.ts @@ -22,22 +22,22 @@ type PlatformgetIdentity = { readonly responseType: typeof platform_pb.GetIdentityResponse; }; -type PlatformgetIdentities = { +type PlatformgetIdentityKeys = { readonly methodName: string; readonly service: typeof Platform; readonly requestStream: false; readonly responseStream: false; - readonly requestType: typeof platform_pb.GetIdentitiesRequest; - readonly responseType: typeof platform_pb.GetIdentitiesResponse; + readonly requestType: typeof platform_pb.GetIdentityKeysRequest; + readonly responseType: typeof platform_pb.GetIdentityKeysResponse; }; -type PlatformgetIdentityKeys = { +type PlatformgetIdentitiesContractKeys = { readonly methodName: string; readonly service: typeof Platform; readonly requestStream: false; readonly responseStream: false; - readonly requestType: typeof platform_pb.GetIdentityKeysRequest; - readonly responseType: typeof platform_pb.GetIdentityKeysResponse; + readonly requestType: typeof platform_pb.GetIdentitiesContractKeysRequest; + readonly responseType: typeof platform_pb.GetIdentitiesContractKeysResponse; }; type PlatformgetIdentityNonce = { @@ -121,15 +121,6 @@ type PlatformgetDocuments = { readonly responseType: typeof platform_pb.GetDocumentsResponse; }; -type PlatformgetIdentitiesByPublicKeyHashes = { - readonly methodName: string; - readonly service: typeof Platform; - readonly requestStream: false; - readonly responseStream: false; - readonly requestType: typeof platform_pb.GetIdentitiesByPublicKeyHashesRequest; - readonly responseType: typeof platform_pb.GetIdentitiesByPublicKeyHashesResponse; -}; - type PlatformgetIdentityByPublicKeyHash = { readonly methodName: string; readonly service: typeof Platform; @@ -197,8 +188,8 @@ export class Platform { static readonly serviceName: string; static readonly broadcastStateTransition: PlatformbroadcastStateTransition; static readonly getIdentity: PlatformgetIdentity; - static readonly getIdentities: PlatformgetIdentities; static readonly getIdentityKeys: PlatformgetIdentityKeys; + static readonly getIdentitiesContractKeys: PlatformgetIdentitiesContractKeys; static readonly getIdentityNonce: PlatformgetIdentityNonce; static readonly getIdentityContractNonce: PlatformgetIdentityContractNonce; static readonly getIdentityBalance: PlatformgetIdentityBalance; @@ -208,7 +199,6 @@ export class Platform { static readonly getDataContractHistory: PlatformgetDataContractHistory; static readonly getDataContracts: PlatformgetDataContracts; static readonly getDocuments: PlatformgetDocuments; - static readonly getIdentitiesByPublicKeyHashes: PlatformgetIdentitiesByPublicKeyHashes; static readonly getIdentityByPublicKeyHash: PlatformgetIdentityByPublicKeyHash; static readonly waitForStateTransitionResult: PlatformwaitForStateTransitionResult; static readonly getConsensusParams: PlatformgetConsensusParams; @@ -268,15 +258,6 @@ export class PlatformClient { requestMessage: platform_pb.GetIdentityRequest, callback: (error: ServiceError|null, responseMessage: platform_pb.GetIdentityResponse|null) => void ): UnaryResponse; - getIdentities( - requestMessage: platform_pb.GetIdentitiesRequest, - metadata: grpc.Metadata, - callback: (error: ServiceError|null, responseMessage: platform_pb.GetIdentitiesResponse|null) => void - ): UnaryResponse; - getIdentities( - requestMessage: platform_pb.GetIdentitiesRequest, - callback: (error: ServiceError|null, responseMessage: platform_pb.GetIdentitiesResponse|null) => void - ): UnaryResponse; getIdentityKeys( requestMessage: platform_pb.GetIdentityKeysRequest, metadata: grpc.Metadata, @@ -286,6 +267,15 @@ export class PlatformClient { requestMessage: platform_pb.GetIdentityKeysRequest, callback: (error: ServiceError|null, responseMessage: platform_pb.GetIdentityKeysResponse|null) => void ): UnaryResponse; + getIdentitiesContractKeys( + requestMessage: platform_pb.GetIdentitiesContractKeysRequest, + metadata: grpc.Metadata, + callback: (error: ServiceError|null, responseMessage: platform_pb.GetIdentitiesContractKeysResponse|null) => void + ): UnaryResponse; + getIdentitiesContractKeys( + requestMessage: platform_pb.GetIdentitiesContractKeysRequest, + callback: (error: ServiceError|null, responseMessage: platform_pb.GetIdentitiesContractKeysResponse|null) => void + ): UnaryResponse; getIdentityNonce( requestMessage: platform_pb.GetIdentityNonceRequest, metadata: grpc.Metadata, @@ -367,15 +357,6 @@ export class PlatformClient { requestMessage: platform_pb.GetDocumentsRequest, callback: (error: ServiceError|null, responseMessage: platform_pb.GetDocumentsResponse|null) => void ): UnaryResponse; - getIdentitiesByPublicKeyHashes( - requestMessage: platform_pb.GetIdentitiesByPublicKeyHashesRequest, - metadata: grpc.Metadata, - callback: (error: ServiceError|null, responseMessage: platform_pb.GetIdentitiesByPublicKeyHashesResponse|null) => void - ): UnaryResponse; - getIdentitiesByPublicKeyHashes( - requestMessage: platform_pb.GetIdentitiesByPublicKeyHashesRequest, - callback: (error: ServiceError|null, responseMessage: platform_pb.GetIdentitiesByPublicKeyHashesResponse|null) => void - ): UnaryResponse; getIdentityByPublicKeyHash( requestMessage: platform_pb.GetIdentityByPublicKeyHashRequest, metadata: grpc.Metadata, diff --git a/packages/dapi-grpc/clients/platform/v0/web/platform_pb_service.js b/packages/dapi-grpc/clients/platform/v0/web/platform_pb_service.js index f6dc929969..c25b97c059 100644 --- a/packages/dapi-grpc/clients/platform/v0/web/platform_pb_service.js +++ b/packages/dapi-grpc/clients/platform/v0/web/platform_pb_service.js @@ -28,22 +28,22 @@ Platform.getIdentity = { responseType: platform_pb.GetIdentityResponse }; -Platform.getIdentities = { - methodName: "getIdentities", +Platform.getIdentityKeys = { + methodName: "getIdentityKeys", service: Platform, requestStream: false, responseStream: false, - requestType: platform_pb.GetIdentitiesRequest, - responseType: platform_pb.GetIdentitiesResponse + requestType: platform_pb.GetIdentityKeysRequest, + responseType: platform_pb.GetIdentityKeysResponse }; -Platform.getIdentityKeys = { - methodName: "getIdentityKeys", +Platform.getIdentitiesContractKeys = { + methodName: "getIdentitiesContractKeys", service: Platform, requestStream: false, responseStream: false, - requestType: platform_pb.GetIdentityKeysRequest, - responseType: platform_pb.GetIdentityKeysResponse + requestType: platform_pb.GetIdentitiesContractKeysRequest, + responseType: platform_pb.GetIdentitiesContractKeysResponse }; Platform.getIdentityNonce = { @@ -127,15 +127,6 @@ Platform.getDocuments = { responseType: platform_pb.GetDocumentsResponse }; -Platform.getIdentitiesByPublicKeyHashes = { - methodName: "getIdentitiesByPublicKeyHashes", - service: Platform, - requestStream: false, - responseStream: false, - requestType: platform_pb.GetIdentitiesByPublicKeyHashesRequest, - responseType: platform_pb.GetIdentitiesByPublicKeyHashesResponse -}; - Platform.getIdentityByPublicKeyHash = { methodName: "getIdentityByPublicKeyHash", service: Platform, @@ -268,11 +259,11 @@ PlatformClient.prototype.getIdentity = function getIdentity(requestMessage, meta }; }; -PlatformClient.prototype.getIdentities = function getIdentities(requestMessage, metadata, callback) { +PlatformClient.prototype.getIdentityKeys = function getIdentityKeys(requestMessage, metadata, callback) { if (arguments.length === 2) { callback = arguments[1]; } - var client = grpc.unary(Platform.getIdentities, { + var client = grpc.unary(Platform.getIdentityKeys, { request: requestMessage, host: this.serviceHost, metadata: metadata, @@ -299,11 +290,11 @@ PlatformClient.prototype.getIdentities = function getIdentities(requestMessage, }; }; -PlatformClient.prototype.getIdentityKeys = function getIdentityKeys(requestMessage, metadata, callback) { +PlatformClient.prototype.getIdentitiesContractKeys = function getIdentitiesContractKeys(requestMessage, metadata, callback) { if (arguments.length === 2) { callback = arguments[1]; } - var client = grpc.unary(Platform.getIdentityKeys, { + var client = grpc.unary(Platform.getIdentitiesContractKeys, { request: requestMessage, host: this.serviceHost, metadata: metadata, @@ -609,37 +600,6 @@ PlatformClient.prototype.getDocuments = function getDocuments(requestMessage, me }; }; -PlatformClient.prototype.getIdentitiesByPublicKeyHashes = function getIdentitiesByPublicKeyHashes(requestMessage, metadata, callback) { - if (arguments.length === 2) { - callback = arguments[1]; - } - var client = grpc.unary(Platform.getIdentitiesByPublicKeyHashes, { - request: requestMessage, - host: this.serviceHost, - metadata: metadata, - transport: this.options.transport, - debug: this.options.debug, - onEnd: function (response) { - if (callback) { - if (response.status !== grpc.Code.OK) { - var err = new Error(response.statusMessage); - err.code = response.status; - err.metadata = response.trailers; - callback(err, null); - } else { - callback(null, response.message); - } - } - } - }); - return { - cancel: function () { - callback = null; - client.close(); - } - }; -}; - PlatformClient.prototype.getIdentityByPublicKeyHash = function getIdentityByPublicKeyHash(requestMessage, metadata, callback) { if (arguments.length === 2) { callback = arguments[1]; diff --git a/packages/dapi-grpc/protos/platform/v0/platform.proto b/packages/dapi-grpc/protos/platform/v0/platform.proto index 78a6809d1a..2c11696570 100644 --- a/packages/dapi-grpc/protos/platform/v0/platform.proto +++ b/packages/dapi-grpc/protos/platform/v0/platform.proto @@ -10,8 +10,8 @@ service Platform { rpc broadcastStateTransition(BroadcastStateTransitionRequest) returns (BroadcastStateTransitionResponse); rpc getIdentity(GetIdentityRequest) returns (GetIdentityResponse); - rpc getIdentities(GetIdentitiesRequest) returns (GetIdentitiesResponse); rpc getIdentityKeys(GetIdentityKeysRequest) returns (GetIdentityKeysResponse); + rpc getIdentitiesContractKeys(GetIdentitiesContractKeysRequest) returns (GetIdentitiesContractKeysResponse); rpc getIdentityNonce(GetIdentityNonceRequest) returns (GetIdentityNonceResponse); rpc getIdentityContractNonce(GetIdentityContractNonceRequest) returns (GetIdentityContractNonceResponse); rpc getIdentityBalance(GetIdentityBalanceRequest) @@ -25,8 +25,6 @@ service Platform { rpc getDataContracts(GetDataContractsRequest) returns (GetDataContractsResponse); rpc getDocuments(GetDocumentsRequest) returns (GetDocumentsResponse); - rpc getIdentitiesByPublicKeyHashes(GetIdentitiesByPublicKeyHashesRequest) - returns (GetIdentitiesByPublicKeyHashesResponse); rpc getIdentityByPublicKeyHash(GetIdentityByPublicKeyHashRequest) returns (GetIdentityByPublicKeyHashResponse); rpc waitForStateTransitionResult(WaitForStateTransitionResultRequest) @@ -63,6 +61,14 @@ message StateTransitionBroadcastError { bytes data = 3; } +enum KeyPurpose { + AUTHENTICATION = 0; + ENCRYPTION = 1; + DECRYPTION = 2; + TRANSFER = 3; + VOTING = 5; +} + message BroadcastStateTransitionRequest { bytes state_transition = 1; } message BroadcastStateTransitionResponse {} @@ -132,38 +138,6 @@ message GetIdentityResponse { oneof version { GetIdentityResponseV0 v0 = 1; } } -message GetIdentitiesRequest { - - message GetIdentitiesRequestV0 { - repeated bytes ids = 1; - bool prove = 2; - } - - oneof version { GetIdentitiesRequestV0 v0 = 1; } -} - -message GetIdentitiesResponse { - - message IdentityValue { bytes value = 1; } - - message IdentityEntry { - bytes key = 1; - IdentityValue value = 2; - } - - message Identities { repeated IdentityEntry identity_entries = 1; } - - message GetIdentitiesResponseV0 { - oneof result { - Identities identities = 1; - Proof proof = 2; - } - ResponseMetadata metadata = 3; - } - - oneof version { GetIdentitiesResponseV0 v0 = 1; } -} - message GetIdentityNonceResponse { message GetIdentityNonceResponseV0 { @@ -271,6 +245,46 @@ message GetIdentityKeysResponse { oneof version { GetIdentityKeysResponseV0 v0 = 1; } } +message GetIdentitiesContractKeysRequest { + message GetIdentitiesContractKeysRequestV0 { + repeated bytes identities_ids = 1; + bytes contract_id = 2; + optional string document_type_name = 3; + repeated KeyPurpose purposes = 4; + bool prove = 5; + } + + oneof version { + GetIdentitiesContractKeysRequestV0 v0 = 1; + } +} + +message GetIdentitiesContractKeysResponse { + message GetIdentitiesContractKeysResponseV0 { + message PurposeKeys { + KeyPurpose purpose = 1; + repeated bytes keys_bytes = 2; + } + + message IdentityKeys { + bytes identity_id = 1; + repeated PurposeKeys keys = 2; + } + + message IdentitiesKeys { + repeated IdentityKeys entries = 1; + }; + + oneof result { + IdentitiesKeys identities_keys = 1; + Proof proof = 2; + } + ResponseMetadata metadata = 3; + } + + oneof version { GetIdentitiesContractKeysResponseV0 v0 = 1; } +} + message GetProofsRequest { message GetProofsRequestV0 { message DocumentRequest { @@ -417,35 +431,6 @@ message GetDocumentsResponse { oneof version { GetDocumentsResponseV0 v0 = 1; } } -message GetIdentitiesByPublicKeyHashesRequest { - message GetIdentitiesByPublicKeyHashesRequestV0 { - repeated bytes public_key_hashes = 1; - bool prove = 2; - } - oneof version { GetIdentitiesByPublicKeyHashesRequestV0 v0 = 1; } -} - -message GetIdentitiesByPublicKeyHashesResponse { - message PublicKeyHashIdentityEntry { - bytes public_key_hash = 1; - google.protobuf.BytesValue value = 2; - } - - message IdentitiesByPublicKeyHashes { - repeated PublicKeyHashIdentityEntry identity_entries = 1; - } - - message GetIdentitiesByPublicKeyHashesResponseV0 { - oneof result { - IdentitiesByPublicKeyHashes identities = 1; - Proof proof = 2; - } - - ResponseMetadata metadata = 3; - } - oneof version { GetIdentitiesByPublicKeyHashesResponseV0 v0 = 1; } -} - message GetIdentityByPublicKeyHashRequest { message GetIdentityByPublicKeyHashRequestV0 { bytes public_key_hash = 1; diff --git a/packages/dapi-grpc/src/platform/proto/org.dash.platform.dapi.v0.rs b/packages/dapi-grpc/src/platform/proto/org.dash.platform.dapi.v0.rs index 048982c8df..ddbd4bb7fb 100644 --- a/packages/dapi-grpc/src/platform/proto/org.dash.platform.dapi.v0.rs +++ b/packages/dapi-grpc/src/platform/proto/org.dash.platform.dapi.v0.rs @@ -295,118 +295,6 @@ pub mod get_identity_response { } #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename_all = "snake_case")] -#[derive(::dapi_grpc_macros::VersionedGrpcMessage)] -#[grpc_versions(0)] -#[derive(::dapi_grpc_macros::Mockable)] -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct GetIdentitiesRequest { - #[prost(oneof = "get_identities_request::Version", tags = "1")] - pub version: ::core::option::Option, -} -/// Nested message and enum types in `GetIdentitiesRequest`. -pub mod get_identities_request { - #[derive(::serde::Serialize, ::serde::Deserialize)] - #[serde(rename_all = "snake_case")] - #[derive(::dapi_grpc_macros::Mockable)] - #[allow(clippy::derive_partial_eq_without_eq)] - #[derive(Clone, PartialEq, ::prost::Message)] - pub struct GetIdentitiesRequestV0 { - #[prost(bytes = "vec", repeated, tag = "1")] - #[serde(with = "crate::deserialization::vec_base64string")] - pub ids: ::prost::alloc::vec::Vec<::prost::alloc::vec::Vec>, - #[prost(bool, tag = "2")] - pub prove: bool, - } - #[derive(::serde::Serialize, ::serde::Deserialize)] - #[serde(rename_all = "snake_case")] - #[allow(clippy::derive_partial_eq_without_eq)] - #[derive(Clone, PartialEq, ::prost::Oneof)] - pub enum Version { - #[prost(message, tag = "1")] - V0(GetIdentitiesRequestV0), - } -} -#[derive(::serde::Serialize, ::serde::Deserialize)] -#[serde(rename_all = "snake_case")] -#[derive( - ::dapi_grpc_macros::VersionedGrpcMessage, - ::dapi_grpc_macros::VersionedGrpcResponse -)] -#[grpc_versions(0)] -#[derive(::dapi_grpc_macros::Mockable)] -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct GetIdentitiesResponse { - #[prost(oneof = "get_identities_response::Version", tags = "1")] - pub version: ::core::option::Option, -} -/// Nested message and enum types in `GetIdentitiesResponse`. -pub mod get_identities_response { - #[derive(::serde::Serialize, ::serde::Deserialize)] - #[serde(rename_all = "snake_case")] - #[derive(::dapi_grpc_macros::Mockable)] - #[allow(clippy::derive_partial_eq_without_eq)] - #[derive(Clone, PartialEq, ::prost::Message)] - pub struct IdentityValue { - #[prost(bytes = "vec", tag = "1")] - pub value: ::prost::alloc::vec::Vec, - } - #[derive(::serde::Serialize, ::serde::Deserialize)] - #[serde(rename_all = "snake_case")] - #[derive(::dapi_grpc_macros::Mockable)] - #[allow(clippy::derive_partial_eq_without_eq)] - #[derive(Clone, PartialEq, ::prost::Message)] - pub struct IdentityEntry { - #[prost(bytes = "vec", tag = "1")] - pub key: ::prost::alloc::vec::Vec, - #[prost(message, optional, tag = "2")] - pub value: ::core::option::Option, - } - #[derive(::serde::Serialize, ::serde::Deserialize)] - #[serde(rename_all = "snake_case")] - #[derive(::dapi_grpc_macros::Mockable)] - #[allow(clippy::derive_partial_eq_without_eq)] - #[derive(Clone, PartialEq, ::prost::Message)] - pub struct Identities { - #[prost(message, repeated, tag = "1")] - pub identity_entries: ::prost::alloc::vec::Vec, - } - #[derive(::serde::Serialize, ::serde::Deserialize)] - #[serde(rename_all = "snake_case")] - #[derive(::dapi_grpc_macros::Mockable)] - #[allow(clippy::derive_partial_eq_without_eq)] - #[derive(Clone, PartialEq, ::prost::Message)] - pub struct GetIdentitiesResponseV0 { - #[prost(message, optional, tag = "3")] - pub metadata: ::core::option::Option, - #[prost(oneof = "get_identities_response_v0::Result", tags = "1, 2")] - pub result: ::core::option::Option, - } - /// Nested message and enum types in `GetIdentitiesResponseV0`. - pub mod get_identities_response_v0 { - #[derive(::serde::Serialize, ::serde::Deserialize)] - #[serde(rename_all = "snake_case")] - #[allow(clippy::derive_partial_eq_without_eq)] - #[derive(Clone, PartialEq, ::prost::Oneof)] - pub enum Result { - #[prost(message, tag = "1")] - Identities(super::Identities), - #[prost(message, tag = "2")] - Proof(super::super::Proof), - } - } - #[derive(::serde::Serialize, ::serde::Deserialize)] - #[serde(rename_all = "snake_case")] - #[allow(clippy::derive_partial_eq_without_eq)] - #[derive(Clone, PartialEq, ::prost::Oneof)] - pub enum Version { - #[prost(message, tag = "1")] - V0(GetIdentitiesResponseV0), - } -} -#[derive(::serde::Serialize, ::serde::Deserialize)] -#[serde(rename_all = "snake_case")] #[derive( ::dapi_grpc_macros::VersionedGrpcMessage, ::dapi_grpc_macros::VersionedGrpcResponse @@ -832,6 +720,131 @@ pub mod get_identity_keys_response { #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] +pub struct GetIdentitiesContractKeysRequest { + #[prost(oneof = "get_identities_contract_keys_request::Version", tags = "1")] + pub version: ::core::option::Option, +} +/// Nested message and enum types in `GetIdentitiesContractKeysRequest`. +pub mod get_identities_contract_keys_request { + #[derive(::serde::Serialize, ::serde::Deserialize)] + #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct GetIdentitiesContractKeysRequestV0 { + #[prost(bytes = "vec", repeated, tag = "1")] + pub identities_ids: ::prost::alloc::vec::Vec<::prost::alloc::vec::Vec>, + #[prost(bytes = "vec", tag = "2")] + pub contract_id: ::prost::alloc::vec::Vec, + #[prost(string, optional, tag = "3")] + pub document_type_name: ::core::option::Option<::prost::alloc::string::String>, + #[prost(enumeration = "super::KeyPurpose", repeated, tag = "4")] + pub purposes: ::prost::alloc::vec::Vec, + #[prost(bool, tag = "5")] + pub prove: bool, + } + #[derive(::serde::Serialize, ::serde::Deserialize)] + #[serde(rename_all = "snake_case")] + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Version { + #[prost(message, tag = "1")] + V0(GetIdentitiesContractKeysRequestV0), + } +} +#[derive(::serde::Serialize, ::serde::Deserialize)] +#[serde(rename_all = "snake_case")] +#[derive( + ::dapi_grpc_macros::VersionedGrpcMessage, + ::dapi_grpc_macros::VersionedGrpcResponse +)] +#[grpc_versions(0)] +#[derive(::dapi_grpc_macros::Mockable)] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct GetIdentitiesContractKeysResponse { + #[prost(oneof = "get_identities_contract_keys_response::Version", tags = "1")] + pub version: ::core::option::Option, +} +/// Nested message and enum types in `GetIdentitiesContractKeysResponse`. +pub mod get_identities_contract_keys_response { + #[derive(::serde::Serialize, ::serde::Deserialize)] + #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct GetIdentitiesContractKeysResponseV0 { + #[prost(message, optional, tag = "3")] + pub metadata: ::core::option::Option, + #[prost( + oneof = "get_identities_contract_keys_response_v0::Result", + tags = "1, 2" + )] + pub result: ::core::option::Option< + get_identities_contract_keys_response_v0::Result, + >, + } + /// Nested message and enum types in `GetIdentitiesContractKeysResponseV0`. + pub mod get_identities_contract_keys_response_v0 { + #[derive(::serde::Serialize, ::serde::Deserialize)] + #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct PurposeKeys { + #[prost(enumeration = "super::super::KeyPurpose", tag = "1")] + pub purpose: i32, + #[prost(bytes = "vec", repeated, tag = "2")] + pub keys_bytes: ::prost::alloc::vec::Vec<::prost::alloc::vec::Vec>, + } + #[derive(::serde::Serialize, ::serde::Deserialize)] + #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct IdentityKeys { + #[prost(bytes = "vec", tag = "1")] + #[serde(with = "serde_bytes")] + pub identity_id: ::prost::alloc::vec::Vec, + #[prost(message, repeated, tag = "2")] + pub keys: ::prost::alloc::vec::Vec, + } + #[derive(::serde::Serialize, ::serde::Deserialize)] + #[serde(rename_all = "snake_case")] + #[derive(::dapi_grpc_macros::Mockable)] + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct IdentitiesKeys { + #[prost(message, repeated, tag = "1")] + pub entries: ::prost::alloc::vec::Vec, + } + #[derive(::serde::Serialize, ::serde::Deserialize)] + #[serde(rename_all = "snake_case")] + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Result { + #[prost(message, tag = "1")] + IdentitiesKeys(IdentitiesKeys), + #[prost(message, tag = "2")] + Proof(super::super::Proof), + } + } + #[derive(::serde::Serialize, ::serde::Deserialize)] + #[serde(rename_all = "snake_case")] + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Version { + #[prost(message, tag = "1")] + V0(GetIdentitiesContractKeysResponseV0), + } +} +#[derive(::serde::Serialize, ::serde::Deserialize)] +#[serde(rename_all = "snake_case")] +#[derive(::dapi_grpc_macros::VersionedGrpcMessage)] +#[grpc_versions(0)] +#[derive(::dapi_grpc_macros::Mockable)] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] pub struct GetProofsRequest { #[prost(oneof = "get_proofs_request::Version", tags = "1")] pub version: ::core::option::Option, @@ -1417,119 +1430,6 @@ pub mod get_documents_response { #[derive(::dapi_grpc_macros::Mockable)] #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] -pub struct GetIdentitiesByPublicKeyHashesRequest { - #[prost(oneof = "get_identities_by_public_key_hashes_request::Version", tags = "1")] - pub version: ::core::option::Option< - get_identities_by_public_key_hashes_request::Version, - >, -} -/// Nested message and enum types in `GetIdentitiesByPublicKeyHashesRequest`. -pub mod get_identities_by_public_key_hashes_request { - #[derive(::serde::Serialize, ::serde::Deserialize)] - #[serde(rename_all = "snake_case")] - #[derive(::dapi_grpc_macros::Mockable)] - #[allow(clippy::derive_partial_eq_without_eq)] - #[derive(Clone, PartialEq, ::prost::Message)] - pub struct GetIdentitiesByPublicKeyHashesRequestV0 { - #[prost(bytes = "vec", repeated, tag = "1")] - #[serde(with = "crate::deserialization::vec_base64string")] - pub public_key_hashes: ::prost::alloc::vec::Vec<::prost::alloc::vec::Vec>, - #[prost(bool, tag = "2")] - pub prove: bool, - } - #[derive(::serde::Serialize, ::serde::Deserialize)] - #[serde(rename_all = "snake_case")] - #[allow(clippy::derive_partial_eq_without_eq)] - #[derive(Clone, PartialEq, ::prost::Oneof)] - pub enum Version { - #[prost(message, tag = "1")] - V0(GetIdentitiesByPublicKeyHashesRequestV0), - } -} -#[derive(::serde::Serialize, ::serde::Deserialize)] -#[serde(rename_all = "snake_case")] -#[derive( - ::dapi_grpc_macros::VersionedGrpcMessage, - ::dapi_grpc_macros::VersionedGrpcResponse -)] -#[grpc_versions(0)] -#[derive(::dapi_grpc_macros::Mockable)] -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct GetIdentitiesByPublicKeyHashesResponse { - #[prost(oneof = "get_identities_by_public_key_hashes_response::Version", tags = "1")] - pub version: ::core::option::Option< - get_identities_by_public_key_hashes_response::Version, - >, -} -/// Nested message and enum types in `GetIdentitiesByPublicKeyHashesResponse`. -pub mod get_identities_by_public_key_hashes_response { - #[derive(::serde::Serialize, ::serde::Deserialize)] - #[serde(rename_all = "snake_case")] - #[derive(::dapi_grpc_macros::Mockable)] - #[allow(clippy::derive_partial_eq_without_eq)] - #[derive(Clone, PartialEq, ::prost::Message)] - pub struct PublicKeyHashIdentityEntry { - #[prost(bytes = "vec", tag = "1")] - #[serde(with = "serde_bytes")] - pub public_key_hash: ::prost::alloc::vec::Vec, - #[prost(message, optional, tag = "2")] - pub value: ::core::option::Option<::prost::alloc::vec::Vec>, - } - #[derive(::serde::Serialize, ::serde::Deserialize)] - #[serde(rename_all = "snake_case")] - #[derive(::dapi_grpc_macros::Mockable)] - #[allow(clippy::derive_partial_eq_without_eq)] - #[derive(Clone, PartialEq, ::prost::Message)] - pub struct IdentitiesByPublicKeyHashes { - #[prost(message, repeated, tag = "1")] - pub identity_entries: ::prost::alloc::vec::Vec, - } - #[derive(::serde::Serialize, ::serde::Deserialize)] - #[serde(rename_all = "snake_case")] - #[derive(::dapi_grpc_macros::Mockable)] - #[allow(clippy::derive_partial_eq_without_eq)] - #[derive(Clone, PartialEq, ::prost::Message)] - pub struct GetIdentitiesByPublicKeyHashesResponseV0 { - #[prost(message, optional, tag = "3")] - pub metadata: ::core::option::Option, - #[prost( - oneof = "get_identities_by_public_key_hashes_response_v0::Result", - tags = "1, 2" - )] - pub result: ::core::option::Option< - get_identities_by_public_key_hashes_response_v0::Result, - >, - } - /// Nested message and enum types in `GetIdentitiesByPublicKeyHashesResponseV0`. - pub mod get_identities_by_public_key_hashes_response_v0 { - #[derive(::serde::Serialize, ::serde::Deserialize)] - #[serde(rename_all = "snake_case")] - #[allow(clippy::derive_partial_eq_without_eq)] - #[derive(Clone, PartialEq, ::prost::Oneof)] - pub enum Result { - #[prost(message, tag = "1")] - Identities(super::IdentitiesByPublicKeyHashes), - #[prost(message, tag = "2")] - Proof(super::super::Proof), - } - } - #[derive(::serde::Serialize, ::serde::Deserialize)] - #[serde(rename_all = "snake_case")] - #[allow(clippy::derive_partial_eq_without_eq)] - #[derive(Clone, PartialEq, ::prost::Oneof)] - pub enum Version { - #[prost(message, tag = "1")] - V0(GetIdentitiesByPublicKeyHashesResponseV0), - } -} -#[derive(::serde::Serialize, ::serde::Deserialize)] -#[serde(rename_all = "snake_case")] -#[derive(::dapi_grpc_macros::VersionedGrpcMessage)] -#[grpc_versions(0)] -#[derive(::dapi_grpc_macros::Mockable)] -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] pub struct GetIdentityByPublicKeyHashRequest { #[prost(oneof = "get_identity_by_public_key_hash_request::Version", tags = "1")] pub version: ::core::option::Option< @@ -2227,6 +2127,43 @@ pub mod get_path_elements_response { V0(GetPathElementsResponseV0), } } +#[derive(::serde::Serialize, ::serde::Deserialize)] +#[serde(rename_all = "snake_case")] +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] +#[repr(i32)] +pub enum KeyPurpose { + Authentication = 0, + Encryption = 1, + Decryption = 2, + Transfer = 3, + Voting = 5, +} +impl KeyPurpose { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + KeyPurpose::Authentication => "AUTHENTICATION", + KeyPurpose::Encryption => "ENCRYPTION", + KeyPurpose::Decryption => "DECRYPTION", + KeyPurpose::Transfer => "TRANSFER", + KeyPurpose::Voting => "VOTING", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "AUTHENTICATION" => Some(Self::Authentication), + "ENCRYPTION" => Some(Self::Encryption), + "DECRYPTION" => Some(Self::Decryption), + "TRANSFER" => Some(Self::Transfer), + "VOTING" => Some(Self::Voting), + _ => None, + } + } +} /// Generated client implementations. pub mod platform_client { #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] @@ -2369,11 +2306,11 @@ pub mod platform_client { ); self.inner.unary(req, path, codec).await } - pub async fn get_identities( + pub async fn get_identity_keys( &mut self, - request: impl tonic::IntoRequest, + request: impl tonic::IntoRequest, ) -> std::result::Result< - tonic::Response, + tonic::Response, tonic::Status, > { self.inner @@ -2387,23 +2324,23 @@ pub mod platform_client { })?; let codec = tonic::codec::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( - "/org.dash.platform.dapi.v0.Platform/getIdentities", + "/org.dash.platform.dapi.v0.Platform/getIdentityKeys", ); let mut req = request.into_request(); req.extensions_mut() .insert( GrpcMethod::new( "org.dash.platform.dapi.v0.Platform", - "getIdentities", + "getIdentityKeys", ), ); self.inner.unary(req, path, codec).await } - pub async fn get_identity_keys( + pub async fn get_identities_contract_keys( &mut self, - request: impl tonic::IntoRequest, + request: impl tonic::IntoRequest, ) -> std::result::Result< - tonic::Response, + tonic::Response, tonic::Status, > { self.inner @@ -2417,14 +2354,14 @@ pub mod platform_client { })?; let codec = tonic::codec::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( - "/org.dash.platform.dapi.v0.Platform/getIdentityKeys", + "/org.dash.platform.dapi.v0.Platform/getIdentitiesContractKeys", ); let mut req = request.into_request(); req.extensions_mut() .insert( GrpcMethod::new( "org.dash.platform.dapi.v0.Platform", - "getIdentityKeys", + "getIdentitiesContractKeys", ), ); self.inner.unary(req, path, codec).await @@ -2693,38 +2630,6 @@ pub mod platform_client { ); self.inner.unary(req, path, codec).await } - pub async fn get_identities_by_public_key_hashes( - &mut self, - request: impl tonic::IntoRequest< - super::GetIdentitiesByPublicKeyHashesRequest, - >, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - > { - self.inner - .ready() - .await - .map_err(|e| { - tonic::Status::new( - tonic::Code::Unknown, - format!("Service was not ready: {}", e.into()), - ) - })?; - let codec = tonic::codec::ProstCodec::default(); - let path = http::uri::PathAndQuery::from_static( - "/org.dash.platform.dapi.v0.Platform/getIdentitiesByPublicKeyHashes", - ); - let mut req = request.into_request(); - req.extensions_mut() - .insert( - GrpcMethod::new( - "org.dash.platform.dapi.v0.Platform", - "getIdentitiesByPublicKeyHashes", - ), - ); - self.inner.unary(req, path, codec).await - } pub async fn get_identity_by_public_key_hash( &mut self, request: impl tonic::IntoRequest, @@ -2962,18 +2867,18 @@ pub mod platform_server { tonic::Response, tonic::Status, >; - async fn get_identities( + async fn get_identity_keys( &self, - request: tonic::Request, + request: tonic::Request, ) -> std::result::Result< - tonic::Response, + tonic::Response, tonic::Status, >; - async fn get_identity_keys( + async fn get_identities_contract_keys( &self, - request: tonic::Request, + request: tonic::Request, ) -> std::result::Result< - tonic::Response, + tonic::Response, tonic::Status, >; async fn get_identity_nonce( @@ -3039,13 +2944,6 @@ pub mod platform_server { tonic::Response, tonic::Status, >; - async fn get_identities_by_public_key_hashes( - &self, - request: tonic::Request, - ) -> std::result::Result< - tonic::Response, - tonic::Status, - >; async fn get_identity_by_public_key_hash( &self, request: tonic::Request, @@ -3269,25 +3167,25 @@ pub mod platform_server { }; Box::pin(fut) } - "/org.dash.platform.dapi.v0.Platform/getIdentities" => { + "/org.dash.platform.dapi.v0.Platform/getIdentityKeys" => { #[allow(non_camel_case_types)] - struct getIdentitiesSvc(pub Arc); + struct getIdentityKeysSvc(pub Arc); impl< T: Platform, - > tonic::server::UnaryService - for getIdentitiesSvc { - type Response = super::GetIdentitiesResponse; + > tonic::server::UnaryService + for getIdentityKeysSvc { + type Response = super::GetIdentityKeysResponse; type Future = BoxFuture< tonic::Response, tonic::Status, >; fn call( &mut self, - request: tonic::Request, + request: tonic::Request, ) -> Self::Future { let inner = Arc::clone(&self.0); let fut = async move { - (*inner).get_identities(request).await + (*inner).get_identity_keys(request).await }; Box::pin(fut) } @@ -3299,7 +3197,7 @@ pub mod platform_server { let inner = self.inner.clone(); let fut = async move { let inner = inner.0; - let method = getIdentitiesSvc(inner); + let method = getIdentityKeysSvc(inner); let codec = tonic::codec::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( @@ -3315,25 +3213,28 @@ pub mod platform_server { }; Box::pin(fut) } - "/org.dash.platform.dapi.v0.Platform/getIdentityKeys" => { + "/org.dash.platform.dapi.v0.Platform/getIdentitiesContractKeys" => { #[allow(non_camel_case_types)] - struct getIdentityKeysSvc(pub Arc); + struct getIdentitiesContractKeysSvc(pub Arc); impl< T: Platform, - > tonic::server::UnaryService - for getIdentityKeysSvc { - type Response = super::GetIdentityKeysResponse; + > tonic::server::UnaryService< + super::GetIdentitiesContractKeysRequest, + > for getIdentitiesContractKeysSvc { + type Response = super::GetIdentitiesContractKeysResponse; type Future = BoxFuture< tonic::Response, tonic::Status, >; fn call( &mut self, - request: tonic::Request, + request: tonic::Request< + super::GetIdentitiesContractKeysRequest, + >, ) -> Self::Future { let inner = Arc::clone(&self.0); let fut = async move { - (*inner).get_identity_keys(request).await + (*inner).get_identities_contract_keys(request).await }; Box::pin(fut) } @@ -3345,7 +3246,7 @@ pub mod platform_server { let inner = self.inner.clone(); let fut = async move { let inner = inner.0; - let method = getIdentityKeysSvc(inner); + let method = getIdentitiesContractKeysSvc(inner); let codec = tonic::codec::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( @@ -3778,55 +3679,6 @@ pub mod platform_server { }; Box::pin(fut) } - "/org.dash.platform.dapi.v0.Platform/getIdentitiesByPublicKeyHashes" => { - #[allow(non_camel_case_types)] - struct getIdentitiesByPublicKeyHashesSvc(pub Arc); - impl< - T: Platform, - > tonic::server::UnaryService< - super::GetIdentitiesByPublicKeyHashesRequest, - > for getIdentitiesByPublicKeyHashesSvc { - type Response = super::GetIdentitiesByPublicKeyHashesResponse; - type Future = BoxFuture< - tonic::Response, - tonic::Status, - >; - fn call( - &mut self, - request: tonic::Request< - super::GetIdentitiesByPublicKeyHashesRequest, - >, - ) -> Self::Future { - let inner = Arc::clone(&self.0); - let fut = async move { - (*inner).get_identities_by_public_key_hashes(request).await - }; - Box::pin(fut) - } - } - let accept_compression_encodings = self.accept_compression_encodings; - let send_compression_encodings = self.send_compression_encodings; - let max_decoding_message_size = self.max_decoding_message_size; - let max_encoding_message_size = self.max_encoding_message_size; - let inner = self.inner.clone(); - let fut = async move { - let inner = inner.0; - let method = getIdentitiesByPublicKeyHashesSvc(inner); - let codec = tonic::codec::ProstCodec::default(); - let mut grpc = tonic::server::Grpc::new(codec) - .apply_compression_config( - accept_compression_encodings, - send_compression_encodings, - ) - .apply_max_message_size_config( - max_decoding_message_size, - max_encoding_message_size, - ); - let res = grpc.unary(method, req).await; - Ok(res) - }; - Box::pin(fut) - } "/org.dash.platform.dapi.v0.Platform/getIdentityByPublicKeyHash" => { #[allow(non_camel_case_types)] struct getIdentityByPublicKeyHashSvc(pub Arc); diff --git a/packages/dapi-grpc/test/unit/clients/platform/v0/nodejs/PlatformPromiseClient.spec.js b/packages/dapi-grpc/test/unit/clients/platform/v0/nodejs/PlatformPromiseClient.spec.js index a022a3691b..8633267544 100644 --- a/packages/dapi-grpc/test/unit/clients/platform/v0/nodejs/PlatformPromiseClient.spec.js +++ b/packages/dapi-grpc/test/unit/clients/platform/v0/nodejs/PlatformPromiseClient.spec.js @@ -13,6 +13,7 @@ describe('PlatformPromiseClient', () => { platformPromiseClient.client = { broadcastStateTransition: this.sinon.stub().resolves(response), getIdentity: this.sinon.stub().resolves(response), + getIdentitiesContractKeys: this.sinon.stub().resolves(response), getDataContract: this.sinon.stub().resolves(response), getDocuments: this.sinon.stub().resolves(response), getEpochsInfo: this.sinon.stub().resolves(response), @@ -63,6 +64,26 @@ describe('PlatformPromiseClient', () => { }); }); + describe('#getIdentitiesContractKeys', () => { + it('should get identities', async () => { + const result = await platformPromiseClient.getIdentitiesContractKeys(request); + + expect(result).to.equal(response); + expect(platformPromiseClient.client.getIdentitiesContractKeys) + .to.be.calledOnceWith(request); + }); + + it('should throw an error when metadata is not an object', async () => { + try { + platformPromiseClient.getIdentitiesContractKeys({}, 'metadata'); + + expect.fail('Error was not thrown'); + } catch (e) { + expect(e.message).to.equal('metadata must be an object'); + } + }); + }); + describe('#getDataContract', () => { it('should get data contract', async () => { const result = await platformPromiseClient.getDataContract(request); diff --git a/packages/dapi/lib/grpcServer/handlers/platform/platformHandlersFactory.js b/packages/dapi/lib/grpcServer/handlers/platform/platformHandlersFactory.js index 74eb18c49f..91fc8fa913 100644 --- a/packages/dapi/lib/grpcServer/handlers/platform/platformHandlersFactory.js +++ b/packages/dapi/lib/grpcServer/handlers/platform/platformHandlersFactory.js @@ -135,7 +135,7 @@ function platformHandlersFactory( return { broadcastStateTransition: wrappedBroadcastStateTransition, getIdentity: wrapInErrorHandler(unimplementedHandlerFactory('getIdentity')), - getIdentities: wrapInErrorHandler(unimplementedHandlerFactory('getIdentities')), + getIdentitiesContractKeys: wrapInErrorHandler(unimplementedHandlerFactory('getIdentitiesContractKeys')), getIdentityBalance: wrapInErrorHandler(unimplementedHandlerFactory('getIdentityBalance')), getIdentityBalanceAndRevision: wrapInErrorHandler(unimplementedHandlerFactory('getIdentityBalanceAndRevision')), getIdentityKeys: wrapInErrorHandler(unimplementedHandlerFactory('getIdentityKeys')), diff --git a/packages/js-dapi-client/lib/methods/platform/PlatformMethodsFacade.js b/packages/js-dapi-client/lib/methods/platform/PlatformMethodsFacade.js index 0ad680800d..e82f776cbb 100644 --- a/packages/js-dapi-client/lib/methods/platform/PlatformMethodsFacade.js +++ b/packages/js-dapi-client/lib/methods/platform/PlatformMethodsFacade.js @@ -3,7 +3,8 @@ const getDataContractFactory = require('./getDataContract/getDataContractFactory const getDataContractHistoryFactory = require('./getDataContractHistory/getDataContractHistoryFactory'); const getDocumentsFactory = require('./getDocuments/getDocumentsFactory'); const getIdentityFactory = require('./getIdentity/getIdentityFactory'); -const getIdentitiesByPublicKeyHashesFactory = require('./getIdentitiesByPublicKeyHashes/getIdentitiesByPublicKeyHashesFactory'); +const getIdentityByPublicKeyHashFactory = require('./getIdentityByPublicKeyHash/getIdentityByPublicKeyHashFactory'); +const getIdentitiesContractKeysFactory = require('./getIdentitiesContractKeys/getIdentitiesContractKeysFactory'); const waitForStateTransitionResultFactory = require('./waitForStateTransitionResult/waitForStateTransitionResultFactory'); const getConsensusParamsFactory = require('./getConsensusParams/getConsensusParamsFactory'); const getEpochsInfoFactory = require('./getEpochsInfo/getEpochsInfoFactory'); @@ -23,7 +24,8 @@ class PlatformMethodsFacade { this.getDataContractHistory = getDataContractHistoryFactory(grpcTransport); this.getDocuments = getDocumentsFactory(grpcTransport); this.getIdentity = getIdentityFactory(grpcTransport); - this.getIdentitiesByPublicKeyHashes = getIdentitiesByPublicKeyHashesFactory(grpcTransport); + this.getIdentityByPublicKeyHash = getIdentityByPublicKeyHashFactory(grpcTransport); + this.getIdentitiesContractKeys = getIdentitiesContractKeysFactory(grpcTransport); this.waitForStateTransitionResult = waitForStateTransitionResultFactory(grpcTransport); this.getConsensusParams = getConsensusParamsFactory(grpcTransport); this.getEpochsInfo = getEpochsInfoFactory(grpcTransport); diff --git a/packages/js-dapi-client/lib/methods/platform/getIdentitiesByPublicKeyHashes/GetIdentitiesByPublicKeyHashesResponse.js b/packages/js-dapi-client/lib/methods/platform/getIdentitiesByPublicKeyHashes/GetIdentitiesByPublicKeyHashesResponse.js deleted file mode 100644 index 18b6198fb4..0000000000 --- a/packages/js-dapi-client/lib/methods/platform/getIdentitiesByPublicKeyHashes/GetIdentitiesByPublicKeyHashesResponse.js +++ /dev/null @@ -1,46 +0,0 @@ -const AbstractResponse = require('../response/AbstractResponse'); - -class GetIdentitiesByPublicKeyHashesResponse extends AbstractResponse { - /** - * @param {Buffer[]} identities - * @param {Metadata} metadata - * @param {Proof} [proof] - */ - constructor(identities, metadata, proof = undefined) { - super(metadata, proof); - - this.identities = identities; - } - - /** - * @returns {Buffer[]} - */ - getIdentities() { - return this.identities; - } - - /** - * @param proto - * @returns {GetIdentitiesByPublicKeyHashesResponse} - */ - static createFromProto(proto) { - const { metadata, proof } = AbstractResponse.createMetadataAndProofFromProto(proto); - - const identitiesList = proto.getV0().getIdentities(); - - return new GetIdentitiesByPublicKeyHashesResponse( - identitiesList !== undefined - ? identitiesList.getIdentityEntriesList() - .map((identity) => { - const value = identity.getValue(); - // TODO: rework to return whole `identity.getValue()` instead of inner getValue() - return value && Buffer.from(value.getValue()); - }) - : [], - metadata, - proof, - ); - } -} - -module.exports = GetIdentitiesByPublicKeyHashesResponse; diff --git a/packages/js-dapi-client/lib/methods/platform/getIdentitiesByPublicKeyHashes/getIdentitiesByPublicKeyHashesFactory.js b/packages/js-dapi-client/lib/methods/platform/getIdentitiesByPublicKeyHashes/getIdentitiesByPublicKeyHashesFactory.js deleted file mode 100644 index 0580db3918..0000000000 --- a/packages/js-dapi-client/lib/methods/platform/getIdentitiesByPublicKeyHashes/getIdentitiesByPublicKeyHashesFactory.js +++ /dev/null @@ -1,65 +0,0 @@ -const { - v0: { - PlatformPromiseClient, - GetIdentitiesByPublicKeyHashesRequest, - }, -} = require('@dashevo/dapi-grpc'); - -const GetIdentitiesByPublicKeyHashesResponse = require('./GetIdentitiesByPublicKeyHashesResponse'); -const InvalidResponseError = require('../response/errors/InvalidResponseError'); - -/** - * @param {GrpcTransport} grpcTransport - * @returns {getIdentitiesByPublicKeyHashes} - */ -function getIdentitiesByPublicKeyHashesFactory(grpcTransport) { - /** - * Fetch the identities by public key hashes - * @typedef {getIdentitiesByPublicKeyHashes} - * @param {Buffer[]} publicKeyHashes - * @param {DAPIClientOptions & {prove: boolean}} [options] - * @returns {Promise} - */ - async function getIdentitiesByPublicKeyHashes(publicKeyHashes, options = {}) { - const { GetIdentitiesByPublicKeyHashesRequestV0 } = GetIdentitiesByPublicKeyHashesRequest; - const getIdentitiesByPublicKeyHashesRequest = new GetIdentitiesByPublicKeyHashesRequest(); - getIdentitiesByPublicKeyHashesRequest.setV0( - new GetIdentitiesByPublicKeyHashesRequestV0() - .setPublicKeyHashesList( - publicKeyHashes, - ).setProve(!!options.prove), - ); - - let lastError; - - // TODO: simple retry before the dapi versioning is properly implemented - for (let i = 0; i < 3; i += 1) { - try { - // eslint-disable-next-line no-await-in-loop - const getIdentitiesByPublicKeyHashesResponse = await grpcTransport.request( - PlatformPromiseClient, - 'getIdentitiesByPublicKeyHashes', - getIdentitiesByPublicKeyHashesRequest, - options, - ); - - return GetIdentitiesByPublicKeyHashesResponse - .createFromProto(getIdentitiesByPublicKeyHashesResponse); - } catch (e) { - if (e instanceof InvalidResponseError) { - lastError = e; - } else { - throw e; - } - } - } - - // If we made it past the cycle it means that the retry didn't work, - // and we're throwing the last error encountered - throw lastError; - } - - return getIdentitiesByPublicKeyHashes; -} - -module.exports = getIdentitiesByPublicKeyHashesFactory; diff --git a/packages/js-dapi-client/lib/methods/platform/getIdentitiesContractKeys/GetIdentitiesContractKeysResponse.js b/packages/js-dapi-client/lib/methods/platform/getIdentitiesContractKeys/GetIdentitiesContractKeysResponse.js new file mode 100644 index 0000000000..4fd843f6f9 --- /dev/null +++ b/packages/js-dapi-client/lib/methods/platform/getIdentitiesContractKeys/GetIdentitiesContractKeysResponse.js @@ -0,0 +1,65 @@ +const { Identifier } = require('@dashevo/wasm-dpp'); +const AbstractResponse = require('../response/AbstractResponse'); + +class GetIdentitiesContractKeysResponse extends AbstractResponse { + /** + * @param {object} identitiesKeys + * @param {Metadata} metadata + * @param {Proof} [proof] + */ + constructor(identitiesKeys, metadata, proof = undefined) { + super(metadata, proof); + + this.identitiesKeys = identitiesKeys; + } + + /** + * @returns {object} + */ + getIdentitiesKeys() { + return this.identitiesKeys; + } + + /** + * @param proto + * @returns {GetIdentitiesContractKeysResponse} + */ + static createFromProto(proto) { + const { metadata, proof } = AbstractResponse.createMetadataAndProofFromProto(proto); + + const identitiesKeys = proto.getV0().getIdentitiesKeys(); + + let identitiesKeysMap = {}; + if (identitiesKeys) { + const keysEntries = identitiesKeys.getEntriesList(); + + identitiesKeysMap = keysEntries.reduce((acc, entry) => { + const identityId = Identifier.from(Buffer.from(entry.getIdentityId())).toString(); + if (!acc[identityId]) { + acc[identityId] = {}; + } + + entry.getKeysList().forEach((key) => { + const purpose = key.getPurpose(); + if (!acc[identityId][purpose]) { + // eslint-disable-next-line no-param-reassign + acc[identityId][purpose] = []; + } + + // eslint-disable-next-line no-param-reassign + acc[identityId][purpose] = acc[identityId][purpose].concat(key.getKeysBytesList()); + }, {}); + + return acc; + }, {}); + } + + return new GetIdentitiesContractKeysResponse( + identitiesKeysMap, + metadata, + proof, + ); + } +} + +module.exports = GetIdentitiesContractKeysResponse; diff --git a/packages/js-dapi-client/lib/methods/platform/getIdentitiesContractKeys/getIdentitiesContractKeysFactory.js b/packages/js-dapi-client/lib/methods/platform/getIdentitiesContractKeys/getIdentitiesContractKeysFactory.js new file mode 100644 index 0000000000..47140bfe0c --- /dev/null +++ b/packages/js-dapi-client/lib/methods/platform/getIdentitiesContractKeys/getIdentitiesContractKeysFactory.js @@ -0,0 +1,93 @@ +const { + v0: { + PlatformPromiseClient, + GetIdentitiesContractKeysRequest, + }, +} = require('@dashevo/dapi-grpc'); +const { IdentityPublicKey } = require('@dashevo/wasm-dpp'); + +const GetIdentitiesContractKeysResponse = require('./GetIdentitiesContractKeysResponse'); +const InvalidResponseError = require('../response/errors/InvalidResponseError'); + +/** + * @param {GrpcTransport} grpcTransport + * @returns {getIdentitiesContractKeys} + */ +function getIdentitiesContractKeysFactory(grpcTransport) { + /** + * Fetch the identities by public key hashes + * @typedef {getIdentitiesContractKeys} + * @param {Buffer[]} identitiesIds + * @param {Buffer} contractId + * @param {IdentityPublicKey.PURPOSES[]} keyPurposes + * @param {string | null} documentTypeName + * @param {DAPIClientOptions & {prove: boolean}} [options] + * @returns {Promise} + */ + async function getIdentitiesContractKeys( + identitiesIds, + contractId, + keyPurposes, + documentTypeName = null, + options = {}, + ) { + const { GetIdentitiesContractKeysRequestV0 } = GetIdentitiesContractKeysRequest; + const getIdentitiesContractKeysRequest = new GetIdentitiesContractKeysRequest(); + + // eslint-disable-next-line no-param-reassign + identitiesIds = identitiesIds.map((id) => { + if (Buffer.isBuffer(id)) { + // eslint-disable-next-line no-param-reassign + id = Buffer.from(id); + } + + return id; + }); + + if (Buffer.isBuffer(contractId)) { + // eslint-disable-next-line no-param-reassign + contractId = Buffer.from(contractId); + } + + getIdentitiesContractKeysRequest.setV0( + new GetIdentitiesContractKeysRequestV0() + .setProve(!!options.prove) + .setIdentitiesIdsList(identitiesIds) + .setContractId(contractId) + .setPurposesList(keyPurposes) + .setDocumentTypeName(documentTypeName), + ); + + let lastError; + + // TODO: simple retry before the dapi versioning is properly implemented + for (let i = 0; i < 3; i += 1) { + try { + // eslint-disable-next-line no-await-in-loop + const getIdentitiesContractKeysResponse = await grpcTransport.request( + PlatformPromiseClient, + 'getIdentitiesContractKeys', + getIdentitiesContractKeysRequest, + options, + ); + + return GetIdentitiesContractKeysResponse + .createFromProto(getIdentitiesContractKeysResponse); + } catch (e) { + if (e instanceof InvalidResponseError) { + lastError = e; + } else { + throw e; + } + } + } + + // If we made it past the cycle it means that the retry didn't work, + // and we're throwing the last error encountered + throw lastError; + } + + return getIdentitiesContractKeys; +} + +module.exports = getIdentitiesContractKeysFactory; diff --git a/packages/js-dapi-client/lib/methods/platform/getIdentityByPublicKeyHash/GetIdentityByPublicKeyHashResponse.js b/packages/js-dapi-client/lib/methods/platform/getIdentityByPublicKeyHash/GetIdentityByPublicKeyHashResponse.js new file mode 100644 index 0000000000..86f97aecfe --- /dev/null +++ b/packages/js-dapi-client/lib/methods/platform/getIdentityByPublicKeyHash/GetIdentityByPublicKeyHashResponse.js @@ -0,0 +1,40 @@ +const AbstractResponse = require('../response/AbstractResponse'); + +class GetIdentityByPublicKeyHashResponse extends AbstractResponse { + /** + * @param {Buffer} identities + * @param identity + * @param {Metadata} metadata + * @param {Proof} [proof] + */ + constructor(identity, metadata, proof = undefined) { + super(metadata, proof); + + this.identity = identity; + } + + /** + * @returns {Buffer[]} + */ + getIdentity() { + return this.identity; + } + + /** + * @param proto + * @returns {GetIdentityByPublicKeyHashResponse} + */ + static createFromProto(proto) { + const { metadata, proof } = AbstractResponse.createMetadataAndProofFromProto(proto); + + const identity = proto.getV0().getIdentity(); + + return new GetIdentityByPublicKeyHashResponse( + Buffer.from(identity), + metadata, + proof, + ); + } +} + +module.exports = GetIdentityByPublicKeyHashResponse; diff --git a/packages/js-dapi-client/lib/methods/platform/getIdentityByPublicKeyHash/getIdentityByPublicKeyHashFactory.js b/packages/js-dapi-client/lib/methods/platform/getIdentityByPublicKeyHash/getIdentityByPublicKeyHashFactory.js new file mode 100644 index 0000000000..ed3ca1fca7 --- /dev/null +++ b/packages/js-dapi-client/lib/methods/platform/getIdentityByPublicKeyHash/getIdentityByPublicKeyHashFactory.js @@ -0,0 +1,64 @@ +const { + v0: { + PlatformPromiseClient, + GetIdentityByPublicKeyHashRequest, + }, +} = require('@dashevo/dapi-grpc'); + +const GetIdentityByPublicKeyHashResponse = require('./GetIdentityByPublicKeyHashResponse'); +const InvalidResponseError = require('../response/errors/InvalidResponseError'); + +/** + * @param {GrpcTransport} grpcTransport + * @returns {getIdentityByPublicKeyHash} + */ +function getIdentityByPublicKeyHashFactory(grpcTransport) { + /** + * Fetch the identity by public key hash + * @typedef {getIdentityByPublicKeyHash} + * @param {Buffer} publicKeyHash + * @param {DAPIClientOptions & {prove: boolean}} [options] + * @returns {Promise} + */ + async function getIdentityByPublicKeyHash(publicKeyHash, options = {}) { + const { GetIdentityByPublicKeyHashRequestV0 } = GetIdentityByPublicKeyHashRequest; + const getIdentityByPublicKeyHashRequest = new GetIdentityByPublicKeyHashRequest(); + getIdentityByPublicKeyHashRequest.setV0( + new GetIdentityByPublicKeyHashRequestV0() + .setPublicKeyHash(publicKeyHash) + .setProve(!!options.prove), + ); + + let lastError; + + // TODO: simple retry before the dapi versioning is properly implemented + for (let i = 0; i < 3; i += 1) { + try { + // eslint-disable-next-line no-await-in-loop + const getIdentityByPublicKeyHashResponse = await grpcTransport.request( + PlatformPromiseClient, + 'getIdentityByPublicKeyHash', + getIdentityByPublicKeyHashRequest, + options, + ); + + return GetIdentityByPublicKeyHashResponse + .createFromProto(getIdentityByPublicKeyHashResponse); + } catch (e) { + if (e instanceof InvalidResponseError) { + lastError = e; + } else { + throw e; + } + } + } + + // If we made it past the cycle it means that the retry didn't work, + // and we're throwing the last error encountered + throw lastError; + } + + return getIdentityByPublicKeyHash; +} + +module.exports = getIdentityByPublicKeyHashFactory; diff --git a/packages/js-dapi-client/lib/transport/GrpcTransport/GrpcTransport.js b/packages/js-dapi-client/lib/transport/GrpcTransport/GrpcTransport.js index 0618ca42ad..5a25bf5e2e 100644 --- a/packages/js-dapi-client/lib/transport/GrpcTransport/GrpcTransport.js +++ b/packages/js-dapi-client/lib/transport/GrpcTransport/GrpcTransport.js @@ -1,3 +1,4 @@ +const GrpcErrorCodes = require('@dashevo/grpc-common/lib/server/error/GrpcErrorCodes'); const logger = require('../../logger'); const MaxRetriesReachedError = require('../errors/response/MaxRetriesReachedError'); @@ -81,7 +82,12 @@ class GrpcTransport { } catch (error) { this.lastUsedAddress = address; - this.logger.error(`GRPC Request ${method} to ${address.toString()} failed with error: ${error.message}`); + // Show NOT_FOUND errors only in debug mode + if (error.code !== GrpcErrorCodes.NOT_FOUND) { + this.logger.error(`GRPC Request ${method} to ${address.toString()} failed with error: ${error.message}`); + } else { + this.logger.debug(`GRPC Request ${method} to ${address.toString()} failed with error: ${error.message}`); + } // for unknown errors if (error.code === undefined) { diff --git a/packages/js-dapi-client/package.json b/packages/js-dapi-client/package.json index a18b0fa27a..ce9207f7d7 100644 --- a/packages/js-dapi-client/package.json +++ b/packages/js-dapi-client/package.json @@ -92,7 +92,7 @@ "test:integration": "mocha './test/integration/**/*.spec.js'", "test:node": "NODE_ENV=test mocha", "test:browsers": "karma start ./karma.conf.js --single-run", - "test:coverage": "NODE_ENV=test nyc --check-coverage --stmts=98 --branch=98 --funcs=98 --lines=95 yarn run mocha 'test/unit/**/*.spec.js' 'test/integration/**/*.spec.js'", + "test:coverage": "NODE_ENV=test nyc --check-coverage --stmts=98 --branch=98 --funcs=98 --lines=94.99 yarn run mocha 'test/unit/**/*.spec.js' 'test/integration/**/*.spec.js'", "prepublishOnly": "yarn run build:web" }, "ultra": { diff --git a/packages/js-dapi-client/test/integration/methods/platform/PlatformMethodsFacade.spec.js b/packages/js-dapi-client/test/integration/methods/platform/PlatformMethodsFacade.spec.js index 1b972962c7..eea314d64a 100644 --- a/packages/js-dapi-client/test/integration/methods/platform/PlatformMethodsFacade.spec.js +++ b/packages/js-dapi-client/test/integration/methods/platform/PlatformMethodsFacade.spec.js @@ -4,6 +4,8 @@ const { GetDataContractResponse, GetDocumentsResponse, GetIdentityResponse, + GetIdentityByPublicKeyHashResponse, + GetIdentitiesContractKeysResponse, GetEpochsInfoResponse, GetProtocolVersionUpgradeVoteStatusResponse, GetProtocolVersionUpgradeStateResponse, @@ -12,6 +14,7 @@ const { GetIdentityKeysResponse, BroadcastStateTransitionResponse, WaitForStateTransitionResultResponse, + KeyPurpose, }, } = require('@dashevo/dapi-grpc'); @@ -24,6 +27,8 @@ const PlatformMethodsFacade = require('../../../../lib/methods/platform/Platform const { WaitForStateTransitionResultResponseV0 } = WaitForStateTransitionResultResponse; const { GetIdentityResponseV0 } = GetIdentityResponse; +const { GetIdentityByPublicKeyHashResponseV0 } = GetIdentityByPublicKeyHashResponse; +const { GetIdentitiesContractKeysResponseV0 } = GetIdentitiesContractKeysResponse; const { GetDocumentsResponseV0 } = GetDocumentsResponse; const { GetDataContractResponseV0 } = GetDataContractResponse; const { GetEpochsInfoResponseV0 } = GetEpochsInfoResponse; @@ -114,6 +119,56 @@ describe('PlatformMethodsFacade', () => { }); }); + describe('#getIdentityByPublicKeyHash', () => { + it('should get Identity', async () => { + const response = new GetIdentityByPublicKeyHashResponse(); + response.setV0( + new GetIdentityByPublicKeyHashResponseV0() + .setMetadata(new ResponseMetadata()) + .setIdentity((await getIdentityFixture()).toBuffer()), + ); + + grpcTransportMock.request.resolves(response); + + await platformMethods.getIdentityByPublicKeyHash('41nthkqvHBLnqiMkSbsdTNANzYu9bgdv4etKoRUunY1M'); + + expect(grpcTransportMock.request).to.be.calledOnce(); + }); + }); + + describe('#getIdentitiesContractKeys', () => { + it('should get identities keys', async () => { + const identityFixture = await getIdentityFixture(); + + const { IdentitiesKeys, IdentityKeys, PurposeKeys } = GetIdentitiesContractKeysResponseV0; + + const response = new GetIdentitiesContractKeysResponse(); + response.setV0( + new GetIdentitiesContractKeysResponseV0() + .setIdentitiesKeys(new IdentitiesKeys() + .setEntriesList([ + new IdentityKeys() + .setIdentityId(new Uint8Array(identityFixture.getId().toBuffer())) + .setKeysList([ + new PurposeKeys() + .setPurpose(KeyPurpose.ENCRYPTION) + .setKeysBytesList(identityFixture.getPublicKeys() + .map((key) => new Uint8Array(key.toBuffer()))), + ]), + ])) + .setMetadata(new ResponseMetadata()), + ); + + grpcTransportMock.request.resolves(response); + + await platformMethods.getIdentitiesContractKeys([ + Buffer.alloc(32).fill(1), + ], Buffer.alloc(32).fill(2), [KeyPurpose.ENCRYPTION]); + + expect(grpcTransportMock.request).to.be.calledOnce(); + }); + }); + describe('#waitForStateTransitionResult', () => { it('should wait for state transition', async () => { const response = new WaitForStateTransitionResultResponse(); diff --git a/packages/js-dapi-client/test/unit/methods/platform/getIdentitiesByPublicKeyHashes/GetIdentitiesByPublicKeyHashesResponse.spec.js b/packages/js-dapi-client/test/unit/methods/platform/getIdentitiesByPublicKeyHashes/GetIdentitiesByPublicKeyHashesResponse.spec.js deleted file mode 100644 index b43a0e5686..0000000000 --- a/packages/js-dapi-client/test/unit/methods/platform/getIdentitiesByPublicKeyHashes/GetIdentitiesByPublicKeyHashesResponse.spec.js +++ /dev/null @@ -1,144 +0,0 @@ -const { BytesValue } = require('google-protobuf/google/protobuf/wrappers_pb'); - -const getIdentityFixture = require('@dashevo/wasm-dpp/lib/test/fixtures/getIdentityFixture'); -const { - v0: { - GetIdentitiesByPublicKeyHashesResponse, - ResponseMetadata, - Proof: ProofResponse, - }, -} = require('@dashevo/dapi-grpc'); - -const GetIdentitiesByPublicKeyHashesResponseClass = require('../../../../../lib/methods/platform/getIdentitiesByPublicKeyHashes/GetIdentitiesByPublicKeyHashesResponse'); -const getMetadataFixture = require('../../../../../lib/test/fixtures/getMetadataFixture'); -const InvalidResponseError = require('../../../../../lib/methods/platform/response/errors/InvalidResponseError'); -const getProofFixture = require('../../../../../lib/test/fixtures/getProofFixture'); -const Proof = require('../../../../../lib/methods/platform/response/Proof'); -const Metadata = require('../../../../../lib/methods/platform/response/Metadata'); - -describe('GetIdentitiesByPublicKeyHashesResponse', () => { - let getIdentitiesResponse; - let metadataFixture; - let identityFixture; - let proto; - let proofFixture; - - beforeEach(async () => { - metadataFixture = getMetadataFixture(); - identityFixture = await getIdentityFixture(); - proofFixture = getProofFixture(); - - const { - IdentitiesByPublicKeyHashes, - PublicKeyHashIdentityEntry, - GetIdentitiesByPublicKeyHashesResponseV0, - } = GetIdentitiesByPublicKeyHashesResponse; - - proto = new GetIdentitiesByPublicKeyHashesResponse(); - - const metadata = new ResponseMetadata(); - metadata.setHeight(metadataFixture.height); - metadata.setCoreChainLockedHeight(metadataFixture.coreChainLockedHeight); - metadata.setTimeMs(metadataFixture.timeMs); - metadata.setProtocolVersion(metadataFixture.protocolVersion); - - proto.setV0( - new GetIdentitiesByPublicKeyHashesResponseV0().setIdentities( - new IdentitiesByPublicKeyHashes() - .setIdentityEntriesList([ - new PublicKeyHashIdentityEntry() - .setPublicKeyHash(Buffer.alloc(20)) - .setValue(new BytesValue().setValue(identityFixture.toBuffer())), - ]), - ).setMetadata(metadata), - ); - - getIdentitiesResponse = new GetIdentitiesByPublicKeyHashesResponseClass( - [identityFixture.toBuffer()], - new Metadata(metadataFixture), - ); - }); - - it('should return identities', () => { - const identities = getIdentitiesResponse.getIdentities(); - const proof = getIdentitiesResponse.getProof(); - - expect(identities).to.deep.members([identityFixture.toBuffer()]); - expect(proof).to.equal(undefined); - }); - - it('should return proof', () => { - getIdentitiesResponse = new GetIdentitiesByPublicKeyHashesResponseClass( - [], - new Metadata(metadataFixture), - new Proof(proofFixture), - ); - - const identities = getIdentitiesResponse.getIdentities(); - const proof = getIdentitiesResponse.getProof(); - - expect(identities).to.deep.members([]); - expect(proof).to.be.an.instanceOf(Proof); - expect(proof.getGrovedbProof()).to.deep.equal(proofFixture.merkleProof); - expect(proof.getQuorumHash()).to.deep.equal(proofFixture.quorumHash); - expect(proof.getSignature()).to.deep.equal(proofFixture.signature); - }); - - it('should create an instance from proto', () => { - getIdentitiesResponse = GetIdentitiesByPublicKeyHashesResponseClass.createFromProto(proto); - expect(getIdentitiesResponse).to.be.an.instanceOf( - GetIdentitiesByPublicKeyHashesResponseClass, - ); - expect(getIdentitiesResponse.getIdentities()).to.deep.equal([identityFixture.toBuffer()]); - - expect(getIdentitiesResponse.getMetadata()) - .to.be.an.instanceOf(Metadata); - expect(getIdentitiesResponse.getMetadata().getHeight()) - .to.equal(metadataFixture.height); - expect(getIdentitiesResponse.getMetadata().getCoreChainLockedHeight()) - .to.equal(metadataFixture.coreChainLockedHeight); - - expect(getIdentitiesResponse.getProof()).to.equal(undefined); - }); - - it('should create an instance with proof from proto', () => { - const proofProto = new ProofResponse(); - - proofProto.setQuorumHash(proofFixture.quorumHash); - proofProto.setSignature(proofFixture.signature); - proofProto.setGrovedbProof(proofFixture.merkleProof); - proofProto.setRound(proofFixture.round); - - proto.getV0().setProof(proofProto); - - getIdentitiesResponse = GetIdentitiesByPublicKeyHashesResponseClass.createFromProto(proto); - expect(getIdentitiesResponse).to.be.an.instanceOf( - GetIdentitiesByPublicKeyHashesResponseClass, - ); - expect(getIdentitiesResponse.getIdentities()).to.deep.members([]); - expect(getIdentitiesResponse.getMetadata()).to.deep.equal(metadataFixture); - - expect(getIdentitiesResponse.getProof()) - .to.be.an.instanceOf(Proof); - expect(getIdentitiesResponse.getProof().getGrovedbProof()) - .to.deep.equal(proofFixture.merkleProof); - expect(getIdentitiesResponse.getProof().getQuorumHash()) - .to.deep.equal(proofFixture.quorumHash); - expect(getIdentitiesResponse.getProof().getSignature()) - .to.deep.equal(proofFixture.signature); - expect(getIdentitiesResponse.getProof().getRound()) - .to.deep.equal(proofFixture.round); - }); - - it('should throw InvalidResponseError if Metadata is not defined', () => { - proto.getV0().setMetadata(undefined); - - try { - getIdentitiesResponse = GetIdentitiesByPublicKeyHashesResponseClass.createFromProto(proto); - - expect.fail('should throw InvalidResponseError'); - } catch (e) { - expect(e).to.be.an.instanceOf(InvalidResponseError); - } - }); -}); diff --git a/packages/js-dapi-client/test/unit/methods/platform/getIdentitiesContractKeys/GetIdentitiesContractKeysResponse.spec.js b/packages/js-dapi-client/test/unit/methods/platform/getIdentitiesContractKeys/GetIdentitiesContractKeysResponse.spec.js new file mode 100644 index 0000000000..36fe8f57d7 --- /dev/null +++ b/packages/js-dapi-client/test/unit/methods/platform/getIdentitiesContractKeys/GetIdentitiesContractKeysResponse.spec.js @@ -0,0 +1,177 @@ +const generateRandomIdentifier = require('@dashevo/wasm-dpp/lib/test/utils/generateRandomIdentifierAsync'); +const getIdentityFixture = require('@dashevo/wasm-dpp/lib/test/fixtures/getIdentityFixture'); +const { + v0: { + GetIdentitiesContractKeysResponse, + ResponseMetadata, + KeyPurpose, + Proof: ProofResponse, + }, +} = require('@dashevo/dapi-grpc'); + +const GetIdentitiesContractKeysResponseClass = require('../../../../../lib/methods/platform/getIdentitiesContractKeys/GetIdentitiesContractKeysResponse'); +const getMetadataFixture = require('../../../../../lib/test/fixtures/getMetadataFixture'); +const InvalidResponseError = require('../../../../../lib/methods/platform/response/errors/InvalidResponseError'); +const getProofFixture = require('../../../../../lib/test/fixtures/getProofFixture'); +const Proof = require('../../../../../lib/methods/platform/response/Proof'); +const Metadata = require('../../../../../lib/methods/platform/response/Metadata'); + +describe('GetIdentitiesContractKeysResponse', () => { + let getIdentitiesContractKeysResponse; + let metadataFixture; + let identityFixtureA; + let identityFixtureB; + let identitiesContractKeys; + let proto; + let proofFixture; + + beforeEach(async () => { + metadataFixture = getMetadataFixture(); + identityFixtureA = await getIdentityFixture(await generateRandomIdentifier()); + identityFixtureB = await getIdentityFixture(await generateRandomIdentifier()); + proofFixture = getProofFixture(); + + const { + GetIdentitiesContractKeysResponseV0, + } = GetIdentitiesContractKeysResponse; + + const { IdentitiesKeys, IdentityKeys, PurposeKeys } = GetIdentitiesContractKeysResponseV0; + + proto = new GetIdentitiesContractKeysResponse(); + + const metadata = new ResponseMetadata(); + metadata.setHeight(metadataFixture.height); + metadata.setCoreChainLockedHeight(metadataFixture.coreChainLockedHeight); + metadata.setTimeMs(metadataFixture.timeMs); + metadata.setProtocolVersion(metadataFixture.protocolVersion); + + proto.setV0( + new GetIdentitiesContractKeysResponseV0() + .setIdentitiesKeys(new IdentitiesKeys() + .setEntriesList([ + new IdentityKeys() + .setIdentityId(new Uint8Array(identityFixtureA.getId().toBuffer())) + .setKeysList([ + new PurposeKeys() + .setPurpose(KeyPurpose.ENCRYPTION) + .setKeysBytesList(identityFixtureA.getPublicKeys() + .map((key) => new Uint8Array(key.toBuffer()))), + ]), + new IdentityKeys() + .setIdentityId(new Uint8Array(identityFixtureB.getId().toBuffer())) + .setKeysList([ + new PurposeKeys() + .setPurpose(KeyPurpose.DECRYPTION) + .setKeysBytesList(identityFixtureB.getPublicKeys() + .map((key) => new Uint8Array(key.toBuffer()))), + ]), + ])) + .setMetadata(metadata), + ); + + identitiesContractKeys = { + [identityFixtureA.getId().toString()]: { + [KeyPurpose.ENCRYPTION]: identityFixtureA.getPublicKeys() + .map((key) => new Uint8Array(key.toBuffer())), + }, + [identityFixtureB.getId().toString()]: { + [KeyPurpose.DECRYPTION]: identityFixtureB.getPublicKeys() + .map((key) => new Uint8Array(key.toBuffer())), + }, + }; + + getIdentitiesContractKeysResponse = new GetIdentitiesContractKeysResponseClass( + identitiesContractKeys, + new Metadata(metadataFixture), + ); + }); + + it('should return identities keys', () => { + const keys = getIdentitiesContractKeysResponse.getIdentitiesKeys(); + const proof = getIdentitiesContractKeysResponse.getProof(); + + expect(keys).to.deep.equal(identitiesContractKeys); + expect(proof).to.equal(undefined); + }); + + it('should return proof', () => { + getIdentitiesContractKeysResponse = new GetIdentitiesContractKeysResponseClass( + {}, + new Metadata(metadataFixture), + new Proof(proofFixture), + ); + + const keys = getIdentitiesContractKeysResponse.getIdentitiesKeys(); + const proof = getIdentitiesContractKeysResponse.getProof(); + + expect(keys).to.deep.equal({}); + expect(proof).to.be.an.instanceOf(Proof); + expect(proof.getGrovedbProof()).to.deep.equal(proofFixture.merkleProof); + expect(proof.getQuorumHash()).to.deep.equal(proofFixture.quorumHash); + expect(proof.getSignature()).to.deep.equal(proofFixture.signature); + }); + + it('should create an instance from proto', () => { + getIdentitiesContractKeysResponse = GetIdentitiesContractKeysResponseClass + .createFromProto(proto); + expect(getIdentitiesContractKeysResponse).to.be.an.instanceOf( + GetIdentitiesContractKeysResponseClass, + ); + + expect(getIdentitiesContractKeysResponse.getIdentitiesKeys()).to.deep.equal( + identitiesContractKeys, + ); + + expect(getIdentitiesContractKeysResponse.getMetadata()) + .to.be.an.instanceOf(Metadata); + expect(getIdentitiesContractKeysResponse.getMetadata().getHeight()) + .to.equal(metadataFixture.height); + expect(getIdentitiesContractKeysResponse.getMetadata().getCoreChainLockedHeight()) + .to.equal(metadataFixture.coreChainLockedHeight); + + expect(getIdentitiesContractKeysResponse.getProof()).to.equal(undefined); + }); + + it('should create an instance with proof from proto', () => { + const proofProto = new ProofResponse(); + + proofProto.setQuorumHash(proofFixture.quorumHash); + proofProto.setSignature(proofFixture.signature); + proofProto.setGrovedbProof(proofFixture.merkleProof); + proofProto.setRound(proofFixture.round); + + proto.getV0().setProof(proofProto); + + getIdentitiesContractKeysResponse = GetIdentitiesContractKeysResponseClass + .createFromProto(proto); + expect(getIdentitiesContractKeysResponse).to.be.an.instanceOf( + GetIdentitiesContractKeysResponseClass, + ); + expect(getIdentitiesContractKeysResponse.getIdentitiesKeys()).to.deep.equal({}); + expect(getIdentitiesContractKeysResponse.getMetadata()).to.deep.equal(metadataFixture); + + expect(getIdentitiesContractKeysResponse.getProof()) + .to.be.an.instanceOf(Proof); + expect(getIdentitiesContractKeysResponse.getProof().getGrovedbProof()) + .to.deep.equal(proofFixture.merkleProof); + expect(getIdentitiesContractKeysResponse.getProof().getQuorumHash()) + .to.deep.equal(proofFixture.quorumHash); + expect(getIdentitiesContractKeysResponse.getProof().getSignature()) + .to.deep.equal(proofFixture.signature); + expect(getIdentitiesContractKeysResponse.getProof().getRound()) + .to.deep.equal(proofFixture.round); + }); + + it('should throw InvalidResponseError if Metadata is not defined', () => { + proto.getV0().setMetadata(undefined); + + try { + getIdentitiesContractKeysResponse = GetIdentitiesContractKeysResponseClass + .createFromProto(proto); + + expect.fail('should throw InvalidResponseError'); + } catch (e) { + expect(e).to.be.an.instanceOf(InvalidResponseError); + } + }); +}); diff --git a/packages/js-dapi-client/test/unit/methods/platform/getIdentitiesContractKeys/getIdentitiesContractKeysFactory.spec.js b/packages/js-dapi-client/test/unit/methods/platform/getIdentitiesContractKeys/getIdentitiesContractKeysFactory.spec.js new file mode 100644 index 0000000000..f6f061092d --- /dev/null +++ b/packages/js-dapi-client/test/unit/methods/platform/getIdentitiesContractKeys/getIdentitiesContractKeysFactory.spec.js @@ -0,0 +1,214 @@ +const { + v0: { + PlatformPromiseClient, + GetIdentitiesContractKeysRequest, + GetIdentitiesContractKeysResponse, + KeyPurpose, + ResponseMetadata, + Proof: ProofResponse, + }, +} = require('@dashevo/dapi-grpc'); +const generateRandomIdentifier = require('@dashevo/wasm-dpp/lib/test/utils/generateRandomIdentifierAsync'); + +const getIdentityFixture = require('@dashevo/wasm-dpp/lib/test/fixtures/getIdentityFixture'); +const getMetadataFixture = require('../../../../../lib/test/fixtures/getMetadataFixture'); +const getProofFixture = require('../../../../../lib/test/fixtures/getProofFixture'); + +const getIdentitiesContractKeysFactory = require( + '../../../../../lib/methods/platform/getIdentitiesContractKeys/getIdentitiesContractKeysFactory', +); +const Proof = require('../../../../../lib/methods/platform/response/Proof'); + +describe('getIdentitiesContractKeysFactory', () => { + let grpcTransportMock; + let getIdentitiesContractKeys; + let options; + let response; + + let identityFixtureA; + let identityFixtureB; + let contractId; + let identitiesContractKeys; + + let metadataFixture; + let proofFixture; + let proofResponse; + + let mockRequest; + + beforeEach(async function beforeEach() { + identityFixtureA = await getIdentityFixture(await generateRandomIdentifier()); + identityFixtureB = await getIdentityFixture(await generateRandomIdentifier()); + contractId = await generateRandomIdentifier(); + metadataFixture = getMetadataFixture(); + proofFixture = getProofFixture(); + + const metadata = new ResponseMetadata(); + metadata.setHeight(metadataFixture.height); + metadata.setCoreChainLockedHeight(metadataFixture.coreChainLockedHeight); + metadata.setTimeMs(metadataFixture.timeMs); + metadata.setProtocolVersion(metadataFixture.protocolVersion); + + const { + GetIdentitiesContractKeysResponseV0, + } = GetIdentitiesContractKeysResponse; + + const { IdentitiesKeys, IdentityKeys, PurposeKeys } = GetIdentitiesContractKeysResponseV0; + + response = new GetIdentitiesContractKeysResponse(); + response.setV0( + new GetIdentitiesContractKeysResponseV0() + .setIdentitiesKeys(new IdentitiesKeys() + .setEntriesList([ + new IdentityKeys() + .setIdentityId(new Uint8Array(identityFixtureA.getId().toBuffer())) + .setKeysList([ + new PurposeKeys() + .setPurpose(KeyPurpose.ENCRYPTION) + .setKeysBytesList(identityFixtureA.getPublicKeys() + .map((key) => new Uint8Array(key.toBuffer()))), + ]), + new IdentityKeys() + .setIdentityId(new Uint8Array(identityFixtureB.getId().toBuffer())) + .setKeysList([ + new PurposeKeys() + .setPurpose(KeyPurpose.DECRYPTION) + .setKeysBytesList(identityFixtureB.getPublicKeys() + .map((key) => new Uint8Array(key.toBuffer()))), + ]), + ])) + .setMetadata(metadata), + ); + + proofResponse = new ProofResponse(); + + proofResponse.setQuorumHash(proofFixture.quorumHash); + proofResponse.setSignature(proofFixture.signature); + proofResponse.setGrovedbProof(proofFixture.merkleProof); + proofResponse.setRound(proofFixture.round); + + identitiesContractKeys = { + [identityFixtureA.getId().toString()]: { + [KeyPurpose.ENCRYPTION]: identityFixtureA.getPublicKeys() + .map((key) => new Uint8Array(key.toBuffer())), + }, + [identityFixtureB.getId().toString()]: { + [KeyPurpose.DECRYPTION]: identityFixtureB.getPublicKeys() + .map((key) => new Uint8Array(key.toBuffer())), + }, + }; + + grpcTransportMock = { + request: this.sinon.stub().resolves(response), + }; + + options = { + timeout: 1000, + }; + + mockRequest = () => { + const { GetIdentitiesContractKeysRequestV0 } = GetIdentitiesContractKeysRequest; + const request = new GetIdentitiesContractKeysRequest(); + request.setV0( + new GetIdentitiesContractKeysRequestV0() + .setProve(!!options.prove) + .setIdentitiesIdsList( + [Buffer.from(identityFixtureA.getId()), Buffer.from(identityFixtureB.getId())], + ) + .setContractId(Buffer.from(contractId)) + .setPurposesList([KeyPurpose.ENCRYPTION, KeyPurpose.DECRYPTION]) + .setDocumentTypeName('contactRequest'), + ); + + return request; + }; + + getIdentitiesContractKeys = getIdentitiesContractKeysFactory(grpcTransportMock); + }); + + it('should return identity ids to key purposes to keys', async () => { + const result = await getIdentitiesContractKeys( + [identityFixtureA.getId(), identityFixtureB.getId()], + contractId, + [KeyPurpose.ENCRYPTION, KeyPurpose.DECRYPTION], + 'contactRequest', + options, + ); + + const request = mockRequest(); + + expect(grpcTransportMock.request).to.be.calledOnceWithExactly( + PlatformPromiseClient, + 'getIdentitiesContractKeys', + request, + options, + ); + expect(result.getIdentitiesKeys()).to.deep.equal(identitiesContractKeys); + expect(result.getMetadata()).to.deep.equal(metadataFixture); + expect(result.getProof()).to.equal(undefined); + }); + + it('should return proof', async () => { + options.prove = true; + response.getV0().setProof(proofResponse); + + const result = await getIdentitiesContractKeys( + [identityFixtureA.getId(), identityFixtureB.getId()], + contractId, + [KeyPurpose.ENCRYPTION, KeyPurpose.DECRYPTION], + 'contactRequest', + options, + ); + + const request = mockRequest(); + + expect(grpcTransportMock.request).to.be.calledOnceWithExactly( + PlatformPromiseClient, + 'getIdentitiesContractKeys', + request, + options, + ); + expect(result.getIdentitiesKeys()).to.deep.equal({}); + + expect(result.getMetadata()).to.deep.equal(metadataFixture); + + expect(result.getProof()).to.be.an.instanceOf(Proof); + expect(result.getProof().getGrovedbProof()).to.deep.equal(proofFixture.merkleProof); + expect(result.getProof().getQuorumHash()).to.deep.equal(proofFixture.quorumHash); + expect(result.getProof().getSignature()).to.deep.equal(proofFixture.signature); + expect(result.getProof().getRound()).to.deep.equal(proofFixture.round); + expect(result.getMetadata()).to.deep.equal(metadataFixture); + expect(result.getMetadata().getHeight()).to.equal(metadataFixture.height); + expect(result.getMetadata().getCoreChainLockedHeight()).to.equal( + metadataFixture.coreChainLockedHeight, + ); + }); + + it('should throw unknown error', async () => { + const error = new Error('Unknown found'); + + grpcTransportMock.request.throws(error); + + const request = mockRequest(); + + try { + await getIdentitiesContractKeys( + [identityFixtureA.getId(), identityFixtureB.getId()], + contractId, + [KeyPurpose.ENCRYPTION, KeyPurpose.DECRYPTION], + 'contactRequest', + options, + ); + + expect.fail('should throw unknown error'); + } catch (e) { + expect(e).to.deep.equal(error); + expect(grpcTransportMock.request).to.be.calledOnceWithExactly( + PlatformPromiseClient, + 'getIdentitiesContractKeys', + request, + options, + ); + } + }); +}); diff --git a/packages/js-dapi-client/test/unit/methods/platform/getIdentityByPublicKeyHash/GetIdentityByPublicKeyHashResponse.spec.js b/packages/js-dapi-client/test/unit/methods/platform/getIdentityByPublicKeyHash/GetIdentityByPublicKeyHashResponse.spec.js new file mode 100644 index 0000000000..bda482f7df --- /dev/null +++ b/packages/js-dapi-client/test/unit/methods/platform/getIdentityByPublicKeyHash/GetIdentityByPublicKeyHashResponse.spec.js @@ -0,0 +1,136 @@ +const getIdentityFixture = require('@dashevo/wasm-dpp/lib/test/fixtures/getIdentityFixture'); +const { + v0: { + GetIdentityByPublicKeyHashResponse, + ResponseMetadata, + Proof: ProofResponse, + }, +} = require('@dashevo/dapi-grpc'); + +const GetIdentityByPublicKeyHashResponseClass = require('../../../../../lib/methods/platform/getIdentityByPublicKeyHash/GetIdentityByPublicKeyHashResponse'); +const getMetadataFixture = require('../../../../../lib/test/fixtures/getMetadataFixture'); +const InvalidResponseError = require('../../../../../lib/methods/platform/response/errors/InvalidResponseError'); +const getProofFixture = require('../../../../../lib/test/fixtures/getProofFixture'); +const Proof = require('../../../../../lib/methods/platform/response/Proof'); +const Metadata = require('../../../../../lib/methods/platform/response/Metadata'); + +describe('GetIdentityByPublicKeyHashResponse', () => { + let getIdentityResponse; + let metadataFixture; + let identityFixture; + let proto; + let proofFixture; + + beforeEach(async () => { + metadataFixture = getMetadataFixture(); + identityFixture = await getIdentityFixture(); + proofFixture = getProofFixture(); + + const { + GetIdentityByPublicKeyHashResponseV0, + } = GetIdentityByPublicKeyHashResponse; + + proto = new GetIdentityByPublicKeyHashResponse(); + + const metadata = new ResponseMetadata(); + metadata.setHeight(metadataFixture.height); + metadata.setCoreChainLockedHeight(metadataFixture.coreChainLockedHeight); + metadata.setTimeMs(metadataFixture.timeMs); + metadata.setProtocolVersion(metadataFixture.protocolVersion); + + proto.setV0( + new GetIdentityByPublicKeyHashResponseV0() + .setIdentity(identityFixture.toBuffer()) + .setMetadata(metadata), + ); + + getIdentityResponse = new GetIdentityByPublicKeyHashResponseClass( + identityFixture.toBuffer(), + new Metadata(metadataFixture), + ); + }); + + it('should return identity', () => { + const identity = getIdentityResponse.getIdentity(); + const proof = getIdentityResponse.getProof(); + + expect(identity).to.deep.equal(identityFixture.toBuffer()); + expect(proof).to.equal(undefined); + }); + + it('should return proof', () => { + getIdentityResponse = new GetIdentityByPublicKeyHashResponseClass( + undefined, + new Metadata(metadataFixture), + new Proof(proofFixture), + ); + + const identity = getIdentityResponse.getIdentity(); + const proof = getIdentityResponse.getProof(); + + expect(identity).to.equal(undefined); + expect(proof).to.be.an.instanceOf(Proof); + expect(proof.getGrovedbProof()).to.deep.equal(proofFixture.merkleProof); + expect(proof.getQuorumHash()).to.deep.equal(proofFixture.quorumHash); + expect(proof.getSignature()).to.deep.equal(proofFixture.signature); + }); + + it('should create an instance from proto', () => { + getIdentityResponse = GetIdentityByPublicKeyHashResponseClass.createFromProto(proto); + expect(getIdentityResponse).to.be.an.instanceOf( + GetIdentityByPublicKeyHashResponseClass, + ); + expect(getIdentityResponse.getIdentity()).to.deep.equal(identityFixture.toBuffer()); + + expect(getIdentityResponse.getMetadata()) + .to.be.an.instanceOf(Metadata); + expect(getIdentityResponse.getMetadata().getHeight()) + .to.equal(metadataFixture.height); + expect(getIdentityResponse.getMetadata().getCoreChainLockedHeight()) + .to.equal(metadataFixture.coreChainLockedHeight); + + expect(getIdentityResponse.getProof()).to.equal(undefined); + }); + + it('should create an instance with proof from proto', () => { + const proofProto = new ProofResponse(); + + proofProto.setQuorumHash(proofFixture.quorumHash); + proofProto.setSignature(proofFixture.signature); + proofProto.setGrovedbProof(proofFixture.merkleProof); + proofProto.setRound(proofFixture.round); + + proto.getV0().setProof(proofProto); + proto.getV0().setIdentity(undefined); + + getIdentityResponse = GetIdentityByPublicKeyHashResponseClass.createFromProto(proto); + expect(getIdentityResponse).to.be.an.instanceOf( + GetIdentityByPublicKeyHashResponseClass, + ); + expect(getIdentityResponse.getIdentity()).to.deep.equal(Buffer.alloc(0)); + expect(getIdentityResponse.getMetadata()).to.deep.equal(metadataFixture); + + expect(getIdentityResponse.getProof()) + .to.be.an.instanceOf(Proof); + expect(getIdentityResponse.getProof().getGrovedbProof()) + .to.deep.equal(proofFixture.merkleProof); + expect(getIdentityResponse.getProof().getQuorumHash()) + .to.deep.equal(proofFixture.quorumHash); + expect(getIdentityResponse.getProof().getSignature()) + .to.deep.equal(proofFixture.signature); + expect(getIdentityResponse.getProof().getRound()) + .to.deep.equal(proofFixture.round); + }); + + it('should throw InvalidResponseError if Metadata is not defined', () => { + proto.getV0().setMetadata(undefined); + + try { + getIdentityResponse = GetIdentityByPublicKeyHashResponseClass.createFromProto(proto); + + expect.fail('should throw InvalidResponseError'); + } catch (e) { + expect(e).to.be.an.instanceOf(InvalidResponseError); + } + }); +}); diff --git a/packages/js-dapi-client/test/unit/methods/platform/getIdentitiesByPublicKeyHashes/getIdentitiesByPublicKeyHashesFactory.spec.js b/packages/js-dapi-client/test/unit/methods/platform/getIdentityByPublicKeyHash/getIdentityByPublicKeyHashFactory.spec.js similarity index 58% rename from packages/js-dapi-client/test/unit/methods/platform/getIdentitiesByPublicKeyHashes/getIdentitiesByPublicKeyHashesFactory.spec.js rename to packages/js-dapi-client/test/unit/methods/platform/getIdentityByPublicKeyHash/getIdentityByPublicKeyHashFactory.spec.js index 205e45583f..c36acc5eff 100644 --- a/packages/js-dapi-client/test/unit/methods/platform/getIdentitiesByPublicKeyHashes/getIdentitiesByPublicKeyHashesFactory.spec.js +++ b/packages/js-dapi-client/test/unit/methods/platform/getIdentityByPublicKeyHash/getIdentityByPublicKeyHashFactory.spec.js @@ -1,9 +1,8 @@ -const { BytesValue } = require('google-protobuf/google/protobuf/wrappers_pb'); const { v0: { PlatformPromiseClient, - GetIdentitiesByPublicKeyHashesRequest, - GetIdentitiesByPublicKeyHashesResponse, + GetIdentityByPublicKeyHashRequest, + GetIdentityByPublicKeyHashResponse, ResponseMetadata, Proof: ProofResponse, }, @@ -13,14 +12,14 @@ const getIdentityFixture = require('@dashevo/wasm-dpp/lib/test/fixtures/getIdent const getMetadataFixture = require('../../../../../lib/test/fixtures/getMetadataFixture'); const getProofFixture = require('../../../../../lib/test/fixtures/getProofFixture'); -const getIdentitiesByPublicKeyHashesFactory = require( - '../../../../../lib/methods/platform/getIdentitiesByPublicKeyHashes/getIdentitiesByPublicKeyHashesFactory', +const getIdentityByPublicKeyHashFactory = require( + '../../../../../lib/methods/platform/getIdentityByPublicKeyHash/getIdentityByPublicKeyHashFactory', ); const Proof = require('../../../../../lib/methods/platform/response/Proof'); -describe('getIdentitiesByPublicKeyHashesFactory', () => { +describe('getIdentityByPublicKeyHashFactory', () => { let grpcTransportMock; - let getIdentitiesByPublicKeyHashes; + let getIdentityByPublicKeyHash; let options; let response; let identityFixture; @@ -41,21 +40,14 @@ describe('getIdentitiesByPublicKeyHashesFactory', () => { metadata.setProtocolVersion(metadataFixture.protocolVersion); const { - IdentitiesByPublicKeyHashes, - PublicKeyHashIdentityEntry, - GetIdentitiesByPublicKeyHashesResponseV0, - } = GetIdentitiesByPublicKeyHashesResponse; + GetIdentityByPublicKeyHashResponseV0, + } = GetIdentityByPublicKeyHashResponse; - response = new GetIdentitiesByPublicKeyHashesResponse(); + response = new GetIdentityByPublicKeyHashResponse(); response.setV0( - new GetIdentitiesByPublicKeyHashesResponseV0().setIdentities( - new IdentitiesByPublicKeyHashes() - .setIdentityEntriesList([ - new PublicKeyHashIdentityEntry() - .setPublicKeyHash(publicKeyHash) - .setValue(new BytesValue().setValue(identityFixture.toBuffer())), - ]), - ).setMetadata(metadata), + new GetIdentityByPublicKeyHashResponseV0() + .setIdentity(identityFixture.toBuffer()) + .setMetadata(metadata), ); proofResponse = new ProofResponse(); @@ -75,27 +67,27 @@ describe('getIdentitiesByPublicKeyHashesFactory', () => { timeout: 1000, }; - getIdentitiesByPublicKeyHashes = getIdentitiesByPublicKeyHashesFactory(grpcTransportMock); + getIdentityByPublicKeyHash = getIdentityByPublicKeyHashFactory(grpcTransportMock); }); - it('should return public key hashes to identity map', async () => { - const result = await getIdentitiesByPublicKeyHashes([publicKeyHash], options); + it('should return identity', async () => { + const result = await getIdentityByPublicKeyHash(publicKeyHash, options); - const { GetIdentitiesByPublicKeyHashesRequestV0 } = GetIdentitiesByPublicKeyHashesRequest; - const request = new GetIdentitiesByPublicKeyHashesRequest(); + const { GetIdentityByPublicKeyHashRequestV0 } = GetIdentityByPublicKeyHashRequest; + const request = new GetIdentityByPublicKeyHashRequest(); request.setV0( - new GetIdentitiesByPublicKeyHashesRequestV0() - .setPublicKeyHashesList([publicKeyHash]) + new GetIdentityByPublicKeyHashRequestV0() + .setPublicKeyHash(publicKeyHash) .setProve(false), ); expect(grpcTransportMock.request).to.be.calledOnceWithExactly( PlatformPromiseClient, - 'getIdentitiesByPublicKeyHashes', + 'getIdentityByPublicKeyHash', request, options, ); - expect(result.getIdentities()).to.have.deep.equal([identityFixture.toBuffer()]); + expect(result.getIdentity()).to.have.deep.equal(identityFixture.toBuffer()); expect(result.getMetadata()).to.deep.equal(metadataFixture); expect(result.getProof()).to.equal(undefined); }); @@ -104,23 +96,23 @@ describe('getIdentitiesByPublicKeyHashesFactory', () => { options.prove = true; response.getV0().setProof(proofResponse); - const result = await getIdentitiesByPublicKeyHashes([publicKeyHash], options); + const result = await getIdentityByPublicKeyHash(publicKeyHash, options); - const { GetIdentitiesByPublicKeyHashesRequestV0 } = GetIdentitiesByPublicKeyHashesRequest; - const request = new GetIdentitiesByPublicKeyHashesRequest(); + const { GetIdentityByPublicKeyHashRequestV0 } = GetIdentityByPublicKeyHashRequest; + const request = new GetIdentityByPublicKeyHashRequest(); request.setV0( - new GetIdentitiesByPublicKeyHashesRequestV0() - .setPublicKeyHashesList([publicKeyHash]) + new GetIdentityByPublicKeyHashRequestV0() + .setPublicKeyHash(publicKeyHash) .setProve(true), ); expect(grpcTransportMock.request).to.be.calledOnceWithExactly( PlatformPromiseClient, - 'getIdentitiesByPublicKeyHashes', + 'getIdentityByPublicKeyHash', request, options, ); - expect(result.getIdentities()).to.have.deep.members([]); + expect(result.getIdentity()).to.deep.equal(Buffer.alloc(0)); expect(result.getMetadata()).to.deep.equal(metadataFixture); @@ -141,23 +133,23 @@ describe('getIdentitiesByPublicKeyHashesFactory', () => { grpcTransportMock.request.throws(error); - const { GetIdentitiesByPublicKeyHashesRequestV0 } = GetIdentitiesByPublicKeyHashesRequest; - const request = new GetIdentitiesByPublicKeyHashesRequest(); + const { GetIdentityByPublicKeyHashRequestV0 } = GetIdentityByPublicKeyHashRequest; + const request = new GetIdentityByPublicKeyHashRequest(); request.setV0( - new GetIdentitiesByPublicKeyHashesRequestV0() - .setPublicKeyHashesList([publicKeyHash]) + new GetIdentityByPublicKeyHashRequestV0() + .setPublicKeyHash(publicKeyHash) .setProve(false), ); try { - await getIdentitiesByPublicKeyHashes([publicKeyHash], options); + await getIdentityByPublicKeyHash(publicKeyHash, options); expect.fail('should throw unknown error'); } catch (e) { expect(e).to.deep.equal(error); expect(grpcTransportMock.request).to.be.calledOnceWithExactly( PlatformPromiseClient, - 'getIdentitiesByPublicKeyHashes', + 'getIdentityByPublicKeyHash', request, options, ); diff --git a/packages/js-dash-sdk/src/test/mocks/createAndAttachTransportMocksToClient.ts b/packages/js-dash-sdk/src/test/mocks/createAndAttachTransportMocksToClient.ts index 4ac2e7b847..b59c77b43f 100644 --- a/packages/js-dash-sdk/src/test/mocks/createAndAttachTransportMocksToClient.ts +++ b/packages/js-dash-sdk/src/test/mocks/createAndAttachTransportMocksToClient.ts @@ -9,6 +9,7 @@ import { createDapiClientMock } from './createDapiClientMock'; import { wait } from '../../utils/wait'; const GetIdentityResponse = require('@dashevo/dapi-client/lib/methods/platform/getIdentity/GetIdentityResponse'); +const NotFoundError = require('@dashevo/dapi-client/lib/transport/GrpcTransport/errors/NotFoundError'); const TxStreamMock = require('@dashevo/wallet-lib/src/test/mocks/TxStreamMock'); const TxStreamDataResponseMock = require('@dashevo/wallet-lib/src/test/mocks/TxStreamDataResponseMock'); @@ -103,7 +104,8 @@ export async function createAndAttachTransportMocksToClient(client, sinon) { await accountPromise; // Putting data in transport stubs - transportMock.getIdentitiesByPublicKeyHashes.resolves([]); + transportMock.getIdentityByPublicKeyHash + .rejects(new NotFoundError('Identity not found', {}, null)); makeTxStreamEmitISLocksForTransactions(transportMock, txStreamMock); await makeGetIdentityRespondWithIdentity(client, dapiClientMock); diff --git a/packages/platform-test-suite/test/e2e/contacts.spec.js b/packages/platform-test-suite/test/e2e/contacts.spec.js index df15ff694f..fe8eaf2fce 100644 --- a/packages/platform-test-suite/test/e2e/contacts.spec.js +++ b/packages/platform-test-suite/test/e2e/contacts.spec.js @@ -1,4 +1,12 @@ -const { Identifier } = require('@dashevo/wasm-dpp'); +const Dash = require('dash'); + +const { + PlatformProtocol: { + Identifier, + IdentityPublicKey, + IdentityPublicKeyWithWitness, + }, +} = Dash; const createClientWithFundedWallet = require('../../lib/test/createClientWithFundedWallet'); const waitForSTPropagated = require('../../lib/waitForSTPropagated'); @@ -49,6 +57,8 @@ describe('e2e', () => { }, contact: { type: 'object', + requiresIdentityEncryptionBoundedKey: 2, + requiresIdentityDecryptionBoundedKey: 2, indices: [ { name: 'onwerIdToUserId', @@ -94,9 +104,9 @@ describe('e2e', () => { describe('Bob', () => { it('should create user wallet and identity', async () => { // Create Bob wallet - bobClient = await createClientWithFundedWallet(400000); + bobClient = await createClientWithFundedWallet(500000); - bobIdentity = await bobClient.platform.identities.register(300000); + bobIdentity = await bobClient.platform.identities.register(400000); // Additional wait time to mitigate testnet latency await waitForSTPropagated(); @@ -149,6 +159,63 @@ describe('e2e', () => { expect(fetchedProfile.toObject()).to.be.deep.equal(profile.toObject()); }); + + it('should add encryption and decryption keys to the identity', async () => { + const account = await bobClient.getWalletAccount(); + + const numKeys = bobIdentity.getPublicKeys().length; + const identityIndex = await account.getUnusedIdentityIndex(); + + const { privateKey: encryptionPrivateKey } = account + .identities + .getIdentityHDKeyByIndex(identityIndex, 1); + + const { privateKey: decryptionPrivateKey } = account + .identities + .getIdentityHDKeyByIndex(identityIndex, 2); + + const encryptionPublicKey = new IdentityPublicKeyWithWitness(1); + encryptionPublicKey.setId(numKeys + 1); + encryptionPublicKey.setSecurityLevel(IdentityPublicKey.SECURITY_LEVELS.MEDIUM); + encryptionPublicKey.setPurpose(IdentityPublicKey.PURPOSES.ENCRYPTION); + encryptionPublicKey.setContractBounds(dataContract.getId(), 'contact'); + encryptionPublicKey.setData(encryptionPrivateKey.toPublicKey().toBuffer()); + + const decryptionPublicKey = new IdentityPublicKeyWithWitness(1); + decryptionPublicKey.setId(numKeys + 2); + decryptionPublicKey.setSecurityLevel(IdentityPublicKey.SECURITY_LEVELS.MEDIUM); + decryptionPublicKey.setPurpose(IdentityPublicKey.PURPOSES.DECRYPTION); + decryptionPublicKey.setContractBounds(dataContract.getId(), 'contact'); + decryptionPublicKey.setData(decryptionPrivateKey.toPublicKey().toBuffer()); + + const update = { + add: [encryptionPublicKey, decryptionPublicKey], + }; + + await bobClient.platform.identities.update( + bobIdentity, + update, + { + [encryptionPublicKey.getId()]: encryptionPrivateKey, + [decryptionPublicKey.getId()]: decryptionPrivateKey, + }, + ); + + await waitForSTPropagated(); + + const { identitiesKeys } = await bobClient.getDAPIClient().platform + .getIdentitiesContractKeys( + [bobIdentity.getId()], + dataContract.getId(), + [IdentityPublicKey.PURPOSES.ENCRYPTION, IdentityPublicKey.PURPOSES.DECRYPTION], + 'contact', + ); + + const bobKeys = identitiesKeys[bobIdentity.getId().toString()]; + expect(bobKeys).to.exist(); + expect(bobKeys[IdentityPublicKey.PURPOSES.ENCRYPTION]).to.have.length(1); + expect(bobKeys[IdentityPublicKey.PURPOSES.DECRYPTION]).to.have.length(1); + }); }); describe('Alice', () => { diff --git a/packages/platform-test-suite/test/functional/platform/Identity.spec.js b/packages/platform-test-suite/test/functional/platform/Identity.spec.js index 2499e16cd2..eb2a8f96df 100644 --- a/packages/platform-test-suite/test/functional/platform/Identity.spec.js +++ b/packages/platform-test-suite/test/functional/platform/Identity.spec.js @@ -234,13 +234,13 @@ describe('Platform', () => { }); it('should be able to get newly created identity by it\'s public key', async () => { - const response = await client.getDAPIClient().platform.getIdentitiesByPublicKeyHashes( - [identity.getPublicKeyById(0).hash()], + const response = await client.getDAPIClient().platform.getIdentityByPublicKeyHash( + identity.getPublicKeyById(0).hash(), ); - const [fetchedIdentity] = response.getIdentities(); + const fetchedIdentity = response.getIdentity(); - expect(fetchedIdentity).to.be.not.null(); + expect(fetchedIdentity.length).to.be.greaterThan(0); // TODO(rs-drive-abci): fix. rs-drive-abci now only returning identity bytes without the // asset lock proof. We would also want to do the same in rs-dpp and wasm-dpp, but diff --git a/packages/platform-test-suite/test/functional/platform/proofs.spec.js b/packages/platform-test-suite/test/functional/platform/proofs.spec.js index 14c43c04f8..d354fb7d4e 100644 --- a/packages/platform-test-suite/test/functional/platform/proofs.spec.js +++ b/packages/platform-test-suite/test/functional/platform/proofs.spec.js @@ -233,7 +233,7 @@ describe('Platform', () => { }); // eslint-disable-next max-len - it('should be able to verify that multiple identities exist with getIdentitiesByPublicKeyHashes', async () => { + it.skip('should be able to verify that multiple identities exist with getIdentitiesByPublicKeyHashes', async () => { const publicKeyHashes = [ identity6PublicKeyHash, nonIncludedIdentityPubKeyHash, diff --git a/packages/rs-dapi-client/src/transport/grpc.rs b/packages/rs-dapi-client/src/transport/grpc.rs index db314e0ce3..91276fe4d1 100644 --- a/packages/rs-dapi-client/src/transport/grpc.rs +++ b/packages/rs-dapi-client/src/transport/grpc.rs @@ -193,14 +193,6 @@ impl_transport_request_grpc!( wait_for_state_transition_result ); -impl_transport_request_grpc!( - platform_proto::GetIdentitiesByPublicKeyHashesRequest, - platform_proto::GetIdentitiesByPublicKeyHashesResponse, - PlatformGrpcClient, - RequestSettings::default(), - get_identities_by_public_key_hashes -); - impl_transport_request_grpc!( platform_proto::GetIdentityByPublicKeyHashRequest, platform_proto::GetIdentityByPublicKeyHashResponse, @@ -241,6 +233,14 @@ impl_transport_request_grpc!( get_identity_balance_and_revision ); +impl_transport_request_grpc!( + platform_proto::GetIdentitiesContractKeysRequest, + platform_proto::GetIdentitiesContractKeysResponse, + PlatformGrpcClient, + RequestSettings::default(), + get_identities_contract_keys +); + impl_transport_request_grpc!( platform_proto::GetIdentityKeysRequest, platform_proto::GetIdentityKeysResponse, diff --git a/packages/rs-dpp/src/identity/identities_contract_keys.rs b/packages/rs-dpp/src/identity/identities_contract_keys.rs new file mode 100644 index 0000000000..063b5dabc7 --- /dev/null +++ b/packages/rs-dpp/src/identity/identities_contract_keys.rs @@ -0,0 +1,6 @@ +use crate::identity::{IdentityPublicKey, Purpose}; +use platform_value::Identifier; +use std::collections::BTreeMap; + +pub type IdentitiesContractKeys = + BTreeMap>>; diff --git a/packages/rs-dpp/src/identity/identity_public_key/purpose.rs b/packages/rs-dpp/src/identity/identity_public_key/purpose.rs index 3d47322d2e..17612a9cd2 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/purpose.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/purpose.rs @@ -73,6 +73,21 @@ impl TryFrom for Purpose { } } +impl TryFrom for Purpose { + type Error = anyhow::Error; + fn try_from(value: i32) -> Result { + match value { + 0 => Ok(AUTHENTICATION), + 1 => Ok(ENCRYPTION), + 2 => Ok(DECRYPTION), + 3 => Ok(TRANSFER), + 4 => Ok(SYSTEM), + 5 => Ok(VOTING), + value => bail!("unrecognized purpose: {}", value), + } + } +} + #[cfg(feature = "cbor")] impl Into for Purpose { fn into(self) -> CborValue { diff --git a/packages/rs-dpp/src/identity/identity_public_key/random.rs b/packages/rs-dpp/src/identity/identity_public_key/random.rs index ca8543c184..fd5d6d5d2c 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/random.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/random.rs @@ -4,6 +4,7 @@ use crate::identity::{IdentityPublicKey, KeyCount, KeyID, KeyType, Purpose, Secu use crate::version::PlatformVersion; use crate::ProtocolError; +use crate::identity::contract_bounds::ContractBounds; use rand::rngs::StdRng; use rand::SeedableRng; @@ -269,6 +270,7 @@ impl IdentityPublicKey { purpose: Purpose, security_level: SecurityLevel, key_type: KeyType, + contract_bounds: Option, platform_version: &PlatformVersion, ) -> Result<(Self, Vec), ProtocolError> { match platform_version @@ -283,6 +285,7 @@ impl IdentityPublicKey { purpose, security_level, key_type, + contract_bounds, platform_version, )?; Ok((key.into(), private_key)) diff --git a/packages/rs-dpp/src/identity/identity_public_key/v0/random.rs b/packages/rs-dpp/src/identity/identity_public_key/v0/random.rs index 2ba6c75e02..2375810df2 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/v0/random.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/v0/random.rs @@ -1,3 +1,4 @@ +use crate::identity::contract_bounds::ContractBounds; use crate::identity::identity_public_key::v0::IdentityPublicKeyV0; use crate::identity::KeyType::ECDSA_SECP256K1; use crate::identity::Purpose::AUTHENTICATION; @@ -121,6 +122,7 @@ impl IdentityPublicKeyV0 { purpose: Purpose, security_level: SecurityLevel, key_type: KeyType, + contract_bounds: Option, platform_version: &PlatformVersion, ) -> Result<(Self, Vec), ProtocolError> { let read_only = false; @@ -135,7 +137,7 @@ impl IdentityPublicKeyV0 { read_only, disabled_at: None, data, - contract_bounds: None, + contract_bounds, }; Ok((identity_public_key, private_data)) } diff --git a/packages/rs-dpp/src/identity/mod.rs b/packages/rs-dpp/src/identity/mod.rs index 0aaf90ad0a..34ad4c3496 100644 --- a/packages/rs-dpp/src/identity/mod.rs +++ b/packages/rs-dpp/src/identity/mod.rs @@ -19,6 +19,7 @@ pub mod signer; pub mod accessors; pub(crate) mod conversion; pub mod fields; +pub mod identities_contract_keys; #[cfg(feature = "client")] mod identity_facade; #[cfg(feature = "factories")] diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/accessors.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/accessors.rs index 6e43c60aeb..9be50be2d6 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/accessors.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/accessors.rs @@ -40,6 +40,8 @@ pub trait IdentityPublicKeyInCreationV0Setters { fn set_security_level(&mut self, security_level: SecurityLevel); + fn set_contract_bounds(&mut self, contract_bounds: Option); + fn set_read_only(&mut self, read_only: bool); } @@ -80,6 +82,12 @@ impl IdentityPublicKeyInCreationV0Setters for IdentityPublicKeyInCreation { } } + fn set_contract_bounds(&mut self, contract_bounds: Option) { + match self { + IdentityPublicKeyInCreation::V0(v0) => v0.contract_bounds = contract_bounds, + } + } + fn set_read_only(&mut self, read_only: bool) { match self { IdentityPublicKeyInCreation::V0(v0) => v0.read_only = read_only, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/v0/mod.rs index 1b9e9c2e0e..8170f2a7b2 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/v0/mod.rs @@ -103,6 +103,10 @@ impl IdentityPublicKeyInCreationV0Setters for IdentityPublicKeyInCreationV0 { self.security_level = security_level; } + fn set_contract_bounds(&mut self, contract_bounds: Option) { + self.contract_bounds = contract_bounds; + } + fn set_purpose(&mut self, purpose: Purpose) { self.purpose = purpose; } diff --git a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs index d3f23b70eb..83a50e457d 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs @@ -201,7 +201,6 @@ impl Platform { let serialization = data_contract.serialize_to_bytes_with_platform_version(platform_version)?; operations.push(DriveOperation::DataContractOperation( - //todo: remove cbor DataContractOperationType::ApplyContractWithSerialization { contract: Cow::Borrowed(data_contract), serialized_contract: serialization, diff --git a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract/v0/mod.rs b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract/v0/mod.rs index 1d4f8fcbcc..dbc404f84f 100644 --- a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract/v0/mod.rs @@ -79,7 +79,7 @@ mod tests { #[test] fn test_invalid_data_contract_id() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let request = GetDataContractRequestV0 { id: vec![0; 8], @@ -93,7 +93,7 @@ mod tests { #[test] fn test_data_contract_not_found() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let id = vec![0; 32]; let request = GetDataContractRequestV0 { @@ -113,7 +113,7 @@ mod tests { #[test] fn test_data_contract_absence_proof() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let id = vec![0; 32]; let request = GetDataContractRequestV0 { diff --git a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/v0/mod.rs b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/v0/mod.rs index 10e6811483..464de7f09c 100644 --- a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contract_history/v0/mod.rs @@ -242,7 +242,7 @@ mod tests { #[test] fn test_invalid_data_contract_id() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let request = GetDataContractHistoryRequestV0 { id: vec![0; 8], @@ -261,7 +261,7 @@ mod tests { #[test] fn test_invalid_limit_overflow() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let request = GetDataContractHistoryRequestV0 { id: vec![0; 32], @@ -283,7 +283,7 @@ mod tests { #[test] fn test_invalid_offset_overflow() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let request = GetDataContractHistoryRequestV0 { id: vec![0; 32], @@ -304,7 +304,7 @@ mod tests { #[test] fn test_data_contract_not_found() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let id = vec![0; 32]; @@ -469,7 +469,7 @@ mod tests { #[test] fn test_data_contract_history_absence_proof() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let request = GetDataContractHistoryRequestV0 { id: vec![0; 32], diff --git a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contracts/v0/mod.rs b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contracts/v0/mod.rs index 16c82e7406..f7ca5e71ed 100644 --- a/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contracts/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/data_contract_based_queries/data_contracts/v0/mod.rs @@ -91,7 +91,7 @@ mod tests { #[test] fn test_invalid_data_contract_id() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let request = GetDataContractsRequestV0 { ids: vec![vec![0; 8]], @@ -107,7 +107,7 @@ mod tests { #[test] fn test_data_contracts_not_found() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let id = vec![0; 32]; let request = GetDataContractsRequestV0 { @@ -130,7 +130,7 @@ mod tests { #[test] fn test_data_contracts_absence_proof() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let id = vec![0; 32]; let request = GetDataContractsRequestV0 { diff --git a/packages/rs-drive-abci/src/query/document_query/v0/mod.rs b/packages/rs-drive-abci/src/query/document_query/v0/mod.rs index 37f0a253b1..f5a740312a 100644 --- a/packages/rs-drive-abci/src/query/document_query/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/document_query/v0/mod.rs @@ -184,7 +184,7 @@ mod tests { #[test] fn test_invalid_document_id() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let request = GetDocumentsRequestV0 { data_contract_id: vec![0; 8], @@ -205,7 +205,7 @@ mod tests { #[test] fn test_data_contract_not_found_in_documents_request() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let data_contract_id = vec![0; 32]; @@ -231,7 +231,7 @@ mod tests { #[test] fn test_absent_document_type() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let created_data_contract = get_data_contract_fixture(None, 0, version.protocol_version); store_data_contract(&platform, created_data_contract.data_contract(), version); @@ -263,7 +263,7 @@ mod tests { #[test] fn test_invalid_where_clause() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let created_data_contract = get_data_contract_fixture(None, 0, version.protocol_version); store_data_contract(&platform, created_data_contract.data_contract(), version); @@ -293,7 +293,7 @@ mod tests { #[test] fn test_invalid_order_by_clause() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let created_data_contract = get_data_contract_fixture(None, 0, version.protocol_version); store_data_contract(&platform, created_data_contract.data_contract(), version); @@ -323,7 +323,7 @@ mod tests { #[test] fn test_invalid_start_at_clause() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let created_data_contract = get_data_contract_fixture(None, 0, version.protocol_version); store_data_contract(&platform, created_data_contract.data_contract(), version); @@ -353,7 +353,7 @@ mod tests { #[test] fn test_invalid_start_after_clause() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let created_data_contract = get_data_contract_fixture(None, 0, version.protocol_version); store_data_contract(&platform, created_data_contract.data_contract(), version); @@ -383,7 +383,7 @@ mod tests { #[test] fn test_invalid_limit() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let created_data_contract = get_data_contract_fixture(None, 0, version.protocol_version); store_data_contract(&platform, created_data_contract.data_contract(), version); @@ -414,7 +414,7 @@ mod tests { #[test] fn test_documents_not_found() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let created_data_contract = get_data_contract_fixture(None, 0, version.protocol_version); store_data_contract(&platform, created_data_contract.data_contract(), version); @@ -447,7 +447,7 @@ mod tests { #[test] fn test_documents_absence_proof() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let created_data_contract = get_data_contract_fixture(None, 0, version.protocol_version); store_data_contract(&platform, created_data_contract.data_contract(), version); diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/balance/v0/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/balance/v0/mod.rs index 6595495757..3abbaec601 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/balance/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/balance/v0/mod.rs @@ -68,7 +68,7 @@ mod tests { #[test] fn test_invalid_identity_id() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let request = GetIdentityBalanceRequestV0 { id: vec![0; 8], @@ -84,7 +84,7 @@ mod tests { #[test] fn test_identity_not_found() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let id = vec![0; 32]; @@ -105,7 +105,7 @@ mod tests { #[test] fn test_identity_balance_absence_proof() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let id = vec![0; 32]; diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/balance_and_revision/v0/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/balance_and_revision/v0/mod.rs index 097d9753e7..6d3bc39c68 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/balance_and_revision/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/balance_and_revision/v0/mod.rs @@ -87,7 +87,7 @@ mod tests { #[test] fn test_invalid_identity_id() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let request = GetIdentityBalanceAndRevisionRequestV0 { id: vec![0; 8], @@ -103,7 +103,7 @@ mod tests { #[test] fn test_identity_not_found_when_querying_balance_and_revision() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let id = vec![0; 32]; @@ -124,7 +124,7 @@ mod tests { #[test] fn test_identity_balance_and_revision_absence_proof() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let id = vec![0; 32]; diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identities/v0/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identities/v0/mod.rs deleted file mode 100644 index 47fe819409..0000000000 --- a/packages/rs-drive-abci/src/query/identity_based_queries/identities/v0/mod.rs +++ /dev/null @@ -1,153 +0,0 @@ -use crate::error::query::QueryError; -use crate::error::Error; -use crate::platform_types::platform::Platform; -use crate::platform_types::platform_state::PlatformState; -use crate::query::QueryValidationResult; -use dapi_grpc::platform::v0::get_identities_request::GetIdentitiesRequestV0; -use dapi_grpc::platform::v0::get_identities_response; -use dapi_grpc::platform::v0::get_identities_response::{ - get_identities_response_v0, GetIdentitiesResponseV0, IdentityEntry, -}; -use dpp::platform_value::Bytes32; -use dpp::serialization::PlatformSerializable; -use dpp::validation::ValidationResult; -use dpp::version::PlatformVersion; -use dpp::{check_validation_result_with_data, ProtocolError}; - -impl Platform { - pub(super) fn query_identities_v0( - &self, - GetIdentitiesRequestV0 { ids, prove }: GetIdentitiesRequestV0, - platform_state: &PlatformState, - platform_version: &PlatformVersion, - ) -> Result, Error> { - let identity_ids = check_validation_result_with_data!(ids - .into_iter() - .map(|identity_id_vec| { - Bytes32::from_vec(identity_id_vec) - .map(|bytes| bytes.0) - .map_err(|_| { - QueryError::InvalidArgument( - "id must be a valid identifier (32 bytes long)".to_string(), - ) - }) - }) - .collect::, QueryError>>()); - - let response = if prove { - let proof = self.drive.prove_full_identities( - identity_ids.as_slice(), - None, - &platform_version.drive, - )?; - - GetIdentitiesResponseV0 { - result: Some(get_identities_response_v0::Result::Proof( - self.response_proof_v0(platform_state, proof), - )), - metadata: Some(self.response_metadata_v0(platform_state)), - } - } else { - let identities = self.drive.fetch_full_identities( - identity_ids.as_slice(), - None, - platform_version, - )?; - - let identities = identities - .into_iter() - .map(|(key, maybe_identity)| { - Ok::(IdentityEntry { - key: key.to_vec(), - value: maybe_identity - .map(|identity| { - Ok::( - get_identities_response::IdentityValue { - value: identity.serialize_consume_to_bytes()?, - }, - ) - }) - .transpose()?, - }) - }) - .collect::, ProtocolError>>()?; - - GetIdentitiesResponseV0 { - result: Some(get_identities_response_v0::Result::Identities( - get_identities_response::Identities { - identity_entries: identities, - }, - )), - metadata: Some(self.response_metadata_v0(platform_state)), - } - }; - - Ok(QueryValidationResult::new_with_data(response)) - } -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::query::tests::{assert_invalid_identifier, setup_platform}; - - #[test] - fn test_invalid_identity_id() { - let (platform, state, version) = setup_platform(); - - let request = GetIdentitiesRequestV0 { - ids: vec![vec![0; 8]], - prove: false, - }; - - let result = platform - .query_identities_v0(request, &state, version) - .expect("should query identities"); - - assert_invalid_identifier(result); - } - - #[test] - fn test_identities_not_found() { - let (platform, state, version) = setup_platform(); - - let id = vec![0; 32]; - - let request = GetIdentitiesRequestV0 { - ids: vec![id.clone()], - prove: false, - }; - - let result = platform - .query_identities_v0(request, &state, version) - .expect("should query identities"); - - assert!(matches!(result.data, Some(GetIdentitiesResponseV0 { - result: Some(get_identities_response_v0::Result::Identities(identites)), - metadata: Some(_) - }) if identites.identity_entries.len() == 1 && identites.identity_entries[0].value.is_none())); - } - - #[test] - fn test_identities_absence_proof() { - let (platform, state, version) = setup_platform(); - - let id = vec![0; 32]; - let request = GetIdentitiesRequestV0 { - ids: vec![id.clone()], - prove: true, - }; - - let result = platform - .query_identities_v0(request, &state, version) - .expect("should query identities"); - - assert!(matches!( - result.data, - Some(GetIdentitiesResponseV0 { - result: Some(get_identities_response_v0::Result::Proof(_)), - metadata: Some(_) - }) - )); - } -} diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identities_by_public_key_hashes/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identities_by_public_key_hashes/mod.rs deleted file mode 100644 index 63db7e9b98..0000000000 --- a/packages/rs-drive-abci/src/query/identity_based_queries/identities_by_public_key_hashes/mod.rs +++ /dev/null @@ -1,67 +0,0 @@ -use crate::error::query::QueryError; -use crate::error::Error; -use crate::platform_types::platform::Platform; -use crate::platform_types::platform_state::PlatformState; -use crate::query::QueryValidationResult; -use dapi_grpc::platform::v0::get_identities_by_public_key_hashes_request::Version as RequestVersion; -use dapi_grpc::platform::v0::get_identities_by_public_key_hashes_response::Version as ResponseVersion; -use dapi_grpc::platform::v0::{ - GetIdentitiesByPublicKeyHashesRequest, GetIdentitiesByPublicKeyHashesResponse, -}; -use dpp::version::PlatformVersion; - -mod v0; - -impl Platform { - /// Querying of an identity by a public key hash - pub fn query_identities_by_public_key_hashes( - &self, - GetIdentitiesByPublicKeyHashesRequest { version }: GetIdentitiesByPublicKeyHashesRequest, - platform_state: &PlatformState, - platform_version: &PlatformVersion, - ) -> Result, Error> { - let Some(version) = version else { - return Ok(QueryValidationResult::new_with_error( - QueryError::DecodingError( - "could not decode identities by public key hashes query".to_string(), - ), - )); - }; - - let feature_version_bounds = &platform_version - .drive_abci - .query - .identity_based_queries - .identities_by_public_key_hashes; - - let feature_version = match &version { - RequestVersion::V0(_) => 0, - }; - if !feature_version_bounds.check_version(feature_version) { - return Ok(QueryValidationResult::new_with_error( - QueryError::UnsupportedQueryVersion( - "identities_by_public_key_hashes".to_string(), - feature_version_bounds.min_version, - feature_version_bounds.max_version, - platform_version.protocol_version, - feature_version, - ), - )); - } - match version { - RequestVersion::V0(request_v0) => { - let result = self.query_identities_by_public_key_hashes_v0( - request_v0, - platform_state, - platform_version, - )?; - - Ok( - result.map(|response_v0| GetIdentitiesByPublicKeyHashesResponse { - version: Some(ResponseVersion::V0(response_v0)), - }), - ) - } - } - } -} diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identities_by_public_key_hashes/v0/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identities_by_public_key_hashes/v0/mod.rs deleted file mode 100644 index 4a6f8c190d..0000000000 --- a/packages/rs-drive-abci/src/query/identity_based_queries/identities_by_public_key_hashes/v0/mod.rs +++ /dev/null @@ -1,159 +0,0 @@ -use crate::error::query::QueryError; -use crate::error::Error; -use crate::platform_types::platform::Platform; -use crate::platform_types::platform_state::PlatformState; -use crate::query::QueryValidationResult; -use dapi_grpc::platform::v0::get_identities_by_public_key_hashes_request::GetIdentitiesByPublicKeyHashesRequestV0; -use dapi_grpc::platform::v0::get_identities_by_public_key_hashes_response; -use dapi_grpc::platform::v0::get_identities_by_public_key_hashes_response::{ - get_identities_by_public_key_hashes_response_v0, GetIdentitiesByPublicKeyHashesResponseV0, - PublicKeyHashIdentityEntry, -}; -use dpp::platform_value::Bytes20; -use dpp::serialization::PlatformSerializable; -use dpp::validation::ValidationResult; -use dpp::version::PlatformVersion; -use dpp::{check_validation_result_with_data, ProtocolError}; - -impl Platform { - pub(super) fn query_identities_by_public_key_hashes_v0( - &self, - GetIdentitiesByPublicKeyHashesRequestV0 { - public_key_hashes, - prove, - }: GetIdentitiesByPublicKeyHashesRequestV0, - platform_state: &PlatformState, - platform_version: &PlatformVersion, - ) -> Result, Error> { - let public_key_hashes = check_validation_result_with_data!(public_key_hashes - .into_iter() - .map(|pub_key_hash_vec| { - Bytes20::from_vec(pub_key_hash_vec) - .map(|bytes| bytes.0) - .map_err(|_| { - QueryError::InvalidArgument( - "public key hash must be 20 bytes long".to_string(), - ) - }) - }) - .collect::, QueryError>>()); - - let response = if prove { - let proof = self - .drive - .prove_full_identities_by_unique_public_key_hashes( - &public_key_hashes, - None, - platform_version, - )?; - - GetIdentitiesByPublicKeyHashesResponseV0 { - result: Some( - get_identities_by_public_key_hashes_response_v0::Result::Proof( - self.response_proof_v0(platform_state, proof), - ), - ), - metadata: Some(self.response_metadata_v0(platform_state)), - } - } else { - let identities = self - .drive - .fetch_full_identities_by_unique_public_key_hashes( - public_key_hashes.as_slice(), - None, - platform_version, - )?; - let identities = identities - .into_iter() - .map(|(hash, maybe_identity)| { - Ok(PublicKeyHashIdentityEntry { - public_key_hash: hash.to_vec(), - value: maybe_identity - .map(|identity| identity.serialize_consume_to_bytes()) - .transpose()?, - }) - }) - .collect::, ProtocolError>>()?; - - GetIdentitiesByPublicKeyHashesResponseV0 { - metadata: Some(self.response_metadata_v0(platform_state)), - result: Some( - get_identities_by_public_key_hashes_response_v0::Result::Identities( - get_identities_by_public_key_hashes_response::IdentitiesByPublicKeyHashes { - identity_entries: identities, - }, - ), - ), - } - }; - - Ok(QueryValidationResult::new_with_data(response)) - } -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::query::tests::setup_platform; - - #[test] - fn test_invalid_public_key_hash() { - let (platform, state, version) = setup_platform(); - - let request = GetIdentitiesByPublicKeyHashesRequestV0 { - public_key_hashes: vec![vec![0; 8]], - prove: false, - }; - - let result = platform - .query_identities_by_public_key_hashes_v0(request, &state, version) - .expect("should query identities by public key hashes"); - - assert!( - matches!(result.errors.as_slice(), [QueryError::InvalidArgument(msg)] if msg == "public key hash must be 20 bytes long") - ); - } - - #[test] - fn test_identities_not_found() { - let (platform, state, version) = setup_platform(); - - let request = GetIdentitiesByPublicKeyHashesRequestV0 { - public_key_hashes: vec![vec![0; 20]], - prove: false, - }; - - let result = platform - .query_identities_by_public_key_hashes_v0(request, &state, version) - .expect("expected query to succeed"); - - assert!( - matches!(result.data, Some(GetIdentitiesByPublicKeyHashesResponseV0 { - result: Some(get_identities_by_public_key_hashes_response_v0::Result::Identities(identites)), - metadata: Some(_) - }) if identites.identity_entries.len() == 1 && identites.identity_entries[0].value.is_none()) - ); - } - - #[test] - fn test_identities_absence_proof() { - let (platform, state, version) = setup_platform(); - - let request = GetIdentitiesByPublicKeyHashesRequestV0 { - public_key_hashes: vec![vec![0; 20]], - prove: true, - }; - - let result = platform - .query_identities_by_public_key_hashes_v0(request, &state, version) - .expect("expected query to succeed"); - - assert!(matches!( - result.data, - Some(GetIdentitiesByPublicKeyHashesResponseV0 { - result: Some(get_identities_by_public_key_hashes_response_v0::Result::Proof(_)), - metadata: Some(_) - }) - )); - } -} diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identities/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identities_contract_keys/mod.rs similarity index 60% rename from packages/rs-drive-abci/src/query/identity_based_queries/identities/mod.rs rename to packages/rs-drive-abci/src/query/identity_based_queries/identities_contract_keys/mod.rs index 3fcab01fcd..97636fcbfe 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/identities/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identities_contract_keys/mod.rs @@ -3,21 +3,23 @@ use crate::error::Error; use crate::platform_types::platform::Platform; use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; -use dapi_grpc::platform::v0::get_identities_request::Version as RequestVersion; -use dapi_grpc::platform::v0::get_identities_response::Version as ResponseVersion; -use dapi_grpc::platform::v0::{GetIdentitiesRequest, GetIdentitiesResponse}; +use dapi_grpc::platform::v0::get_identities_contract_keys_request::Version as RequestVersion; +use dapi_grpc::platform::v0::get_identities_contract_keys_response::Version as ResponseVersion; +use dapi_grpc::platform::v0::{ + GetIdentitiesContractKeysRequest, GetIdentitiesContractKeysResponse, +}; use dpp::version::PlatformVersion; mod v0; impl Platform { - /// Querying of an identity by a public key hash - pub fn query_identities( + /// Querying identities keys bound to specified contract + pub fn query_identities_contract_keys( &self, - GetIdentitiesRequest { version }: GetIdentitiesRequest, + GetIdentitiesContractKeysRequest { version }: GetIdentitiesContractKeysRequest, platform_state: &PlatformState, platform_version: &PlatformVersion, - ) -> Result, Error> { + ) -> Result, Error> { let Some(version) = version else { return Ok(QueryValidationResult::new_with_error( QueryError::DecodingError("could not decode identities query".to_string()), @@ -28,7 +30,7 @@ impl Platform { .drive_abci .query .identity_based_queries - .identities; + .identities_contract_keys; let feature_version = match &version { RequestVersion::V0(_) => 0, @@ -36,7 +38,7 @@ impl Platform { if !feature_version_bounds.check_version(feature_version) { return Ok(QueryValidationResult::new_with_error( QueryError::UnsupportedQueryVersion( - "identities".to_string(), + "identities_contract_keys".to_string(), feature_version_bounds.min_version, feature_version_bounds.max_version, platform_version.protocol_version, @@ -46,10 +48,13 @@ impl Platform { } match version { RequestVersion::V0(request_v0) => { - let result = - self.query_identities_v0(request_v0, platform_state, platform_version)?; + let result = self.query_identities_contract_keys_v0( + request_v0, + platform_state, + platform_version, + )?; - Ok(result.map(|response_v0| GetIdentitiesResponse { + Ok(result.map(|response_v0| GetIdentitiesContractKeysResponse { version: Some(ResponseVersion::V0(response_v0)), })) } diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identities_contract_keys/v0/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identities_contract_keys/v0/mod.rs new file mode 100644 index 0000000000..53a2af0eb6 --- /dev/null +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identities_contract_keys/v0/mod.rs @@ -0,0 +1,1145 @@ +use crate::error::query::QueryError; +use crate::error::Error; +use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; +use crate::query::QueryValidationResult; +use dapi_grpc::platform::v0::get_identities_contract_keys_request::GetIdentitiesContractKeysRequestV0; +use dapi_grpc::platform::v0::get_identities_contract_keys_response::{ + get_identities_contract_keys_response_v0, GetIdentitiesContractKeysResponseV0, +}; +use dpp::check_validation_result_with_data; +use dpp::identity::Purpose; +use dpp::platform_value::Bytes32; +use dpp::validation::ValidationResult; +use dpp::version::PlatformVersion; +use drive::error::query::QuerySyntaxError; + +impl Platform { + #[inline(always)] + pub(super) fn query_identities_contract_keys_v0( + &self, + GetIdentitiesContractKeysRequestV0 { + identities_ids, + contract_id, + document_type_name, + purposes, + prove, + }: GetIdentitiesContractKeysRequestV0, + platform_state: &PlatformState, + platform_version: &PlatformVersion, + ) -> Result, Error> { + let identities_ids = check_validation_result_with_data!(identities_ids + .into_iter() + .map(|identity_id| { + let identity_id = Bytes32::from_vec(identity_id) + .map(|bytes| bytes.0) + .map_err(|_| { + QueryError::InvalidArgument( + "id must be a valid identifier (32 bytes long)".to_string(), + ) + })?; + + Ok(identity_id) + }) + .collect::, QueryError>>()); + + let contract_id = check_validation_result_with_data!(Bytes32::from_vec(contract_id) + .map(|bytes| bytes.0) + .map_err(|_| { + QueryError::InvalidArgument( + "contract_id must be a valid identifier (32 bytes long)".to_string(), + ) + })); + + let purposes = check_validation_result_with_data!(purposes + .into_iter() + .map( + |purpose| Purpose::try_from(purpose as u8).map_err(|_| QueryError::Query( + QuerySyntaxError::InvalidKeyParameter(format!( + "purpose {} not recognized", + purpose + )) + )) + ) + .collect::, QueryError>>()); + + let response = if prove { + let proof = self.drive.prove_identities_contract_keys( + identities_ids.as_slice(), + &contract_id, + document_type_name, + purposes, + None, + &platform_version.drive, + )?; + + GetIdentitiesContractKeysResponseV0 { + result: Some(get_identities_contract_keys_response_v0::Result::Proof( + self.response_proof_v0(platform_state, proof), + )), + metadata: Some(self.response_metadata_v0(platform_state)), + } + } else { + use get_identities_contract_keys_response_v0::IdentitiesKeys; + use get_identities_contract_keys_response_v0::IdentityKeys; + use get_identities_contract_keys_response_v0::PurposeKeys; + use get_identities_contract_keys_response_v0::Result; + + let keys = self.drive.fetch_identities_contract_keys( + identities_ids.as_slice(), + &contract_id, + document_type_name, + purposes, + None, + platform_version, + )?; + + let identities_keys = keys + .iter() + .map(|(identity_id, keys)| { + let keys = keys + .iter() + .map(|(purpose, key)| PurposeKeys { + purpose: *purpose as i32, + keys_bytes: vec![key.to_owned()], + }) + .collect::>(); + + IdentityKeys { + identity_id: identity_id.to_vec(), + keys, + } + }) + .collect::>(); + + GetIdentitiesContractKeysResponseV0 { + result: Some(Result::IdentitiesKeys(IdentitiesKeys { + entries: identities_keys, + })), + metadata: Some(self.response_metadata_v0(platform_state)), + } + }; + + Ok(QueryValidationResult::new_with_data(response)) + } +} + +#[cfg(test)] +mod tests { + use crate::query::tests::setup_platform; + use dapi_grpc::platform::v0::get_identities_contract_keys_request::GetIdentitiesContractKeysRequestV0; + use dapi_grpc::platform::v0::get_identities_contract_keys_response::{ + GetIdentitiesContractKeysResponseV0, + }; + use dpp::block::block_info::BlockInfo; + use dpp::block::epoch::Epoch; + use dpp::data_contract::accessors::v0::DataContractV0Getters; + use dpp::identity::accessors::IdentityGettersV0; + use dpp::identity::contract_bounds::ContractBounds; + use dpp::identity::{Identity, KeyID, KeyType, Purpose, SecurityLevel}; + use dpp::prelude::{Identifier, IdentityPublicKey}; + use dpp::serialization::PlatformDeserializable; + use drive::common::test_utils::identities::create_test_identity_with_rng; + use rand::prelude::StdRng; + use rand::{Rng, SeedableRng}; + use itertools::Itertools; + use dapi_grpc::platform::v0::get_identities_contract_keys_response::get_identities_contract_keys_response_v0::{IdentitiesKeys, IdentityKeys, Result}; + use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; + use drive::drive::Drive; + + #[test] + fn test_identities_contract_keys_missing_identity() { + let (platform, state, platform_version) = setup_platform(true); + + let dashpay = platform.drive.cache.system_data_contracts.load_dashpay(); + + let request = GetIdentitiesContractKeysRequestV0 { + identities_ids: vec![vec![1; 32]], + contract_id: dashpay.id().to_vec(), + document_type_name: Some("contactRequest".to_string()), + purposes: vec![Purpose::ENCRYPTION as i32, Purpose::DECRYPTION as i32], + prove: false, + }; + + let result = platform + .query_identities_contract_keys_v0(request, &state, platform_version) + .expect("query failed"); + + let GetIdentitiesContractKeysResponseV0 { result, .. } = + result.data.expect("expected data"); + + let Result::IdentitiesKeys(IdentitiesKeys { entries: keys }) = + result.expect("expected result") + else { + panic!("expected IdentitiesKeys"); + }; + + assert_eq!(keys.len(), 0); + } + + #[test] + fn test_identities_contract_keys_missing_identity_proved() { + let (platform, state, platform_version) = setup_platform(true); + + let dashpay = platform.drive.cache.system_data_contracts.load_dashpay(); + + let identity_ids = vec![vec![1; 32]]; + + let request = GetIdentitiesContractKeysRequestV0 { + identities_ids: identity_ids.clone(), + contract_id: dashpay.id().to_vec(), + document_type_name: Some("contactRequest".to_string()), + purposes: vec![Purpose::ENCRYPTION as i32, Purpose::DECRYPTION as i32], + prove: true, + }; + + let result = platform + .query_identities_contract_keys_v0(request, &state, platform_version) + .expect("query failed"); + + let GetIdentitiesContractKeysResponseV0 { result, .. } = + result.data.expect("expected data"); + + let Result::Proof(proof) = result.expect("expected proof") else { + panic!("expected IdentitiesKeys"); + }; + + let (_, results) = Drive::verify_identities_contract_keys( + proof.grovedb_proof.as_slice(), + vec![[1u8; 32]].as_slice(), + dashpay.id().as_bytes(), + Some("contactRequest".to_string()), + vec![Purpose::ENCRYPTION, Purpose::DECRYPTION], + false, + platform_version, + ) + .expect("expected to verify proof"); + + assert_eq!(results.len(), 1); + + assert_eq!( + results + .get(&Identifier::from([1u8; 32])) + .expect("expected this identifier") + .values() + .cloned() + .collect::>(), + vec![None, None] + ); + } + + #[test] + fn test_identities_contract_keys_missing_identity_absent_contract() { + let (platform, state, platform_version) = setup_platform(false); + + let request = GetIdentitiesContractKeysRequestV0 { + identities_ids: vec![vec![1; 32]], + contract_id: vec![2; 32], + document_type_name: Some("contactRequest".to_string()), + purposes: vec![Purpose::ENCRYPTION as i32, Purpose::DECRYPTION as i32], + prove: false, + }; + + let result = platform + .query_identities_contract_keys_v0(request, &state, platform_version) + .expect("query failed"); + + let GetIdentitiesContractKeysResponseV0 { result, .. } = + result.data.expect("expected data"); + + let Result::IdentitiesKeys(IdentitiesKeys { entries: keys }) = + result.expect("expected result") + else { + panic!("expected IdentitiesKeys"); + }; + + assert_eq!(keys.len(), 0); + } + + #[test] + fn test_identities_contract_keys_missing_identity_absent_contract_proved() { + let (platform, state, platform_version) = setup_platform(false); + + let request = GetIdentitiesContractKeysRequestV0 { + identities_ids: vec![vec![1; 32]], + contract_id: vec![2; 32], + document_type_name: Some("contactRequest".to_string()), + purposes: vec![Purpose::ENCRYPTION as i32, Purpose::DECRYPTION as i32], + prove: true, + }; + + let result = platform + .query_identities_contract_keys_v0(request, &state, platform_version) + .expect("query failed"); + + let GetIdentitiesContractKeysResponseV0 { result, .. } = + result.data.expect("expected data"); + + let Result::Proof(proof) = result.expect("expected proof") else { + panic!("expected IdentitiesKeys"); + }; + + let (_, results) = Drive::verify_identities_contract_keys( + proof.grovedb_proof.as_slice(), + vec![[1u8; 32]].as_slice(), + &[2; 32], + Some("contactRequest".to_string()), + vec![Purpose::ENCRYPTION, Purpose::DECRYPTION], + false, + platform_version, + ) + .expect("expected to verify proof"); + + assert_eq!(results.len(), 1); + + assert_eq!( + results + .get(&Identifier::from([1u8; 32])) + .expect("expected this identifier") + .values() + .cloned() + .collect::>(), + vec![None, None] + ); + } + + #[test] + fn test_identities_contract_keys_with_identity_absent_contract() { + let (platform, state, platform_version) = setup_platform(false); + + let mut rng = StdRng::seed_from_u64(10); + + let alice_id = rng.gen::<[u8; 32]>(); + + // Create alice identity + let alice = create_test_identity_with_rng( + &platform.drive, + alice_id, + &mut rng, + None, + platform_version, + ) + .expect("expected to create a test identity"); + + let request = GetIdentitiesContractKeysRequestV0 { + identities_ids: vec![alice.id().to_vec()], + contract_id: vec![2; 32], + document_type_name: Some("contactRequest".to_string()), + purposes: vec![Purpose::ENCRYPTION as i32, Purpose::DECRYPTION as i32], + prove: false, + }; + + let result = platform + .query_identities_contract_keys_v0(request, &state, platform_version) + .expect("query failed"); + + let GetIdentitiesContractKeysResponseV0 { result, .. } = + result.data.expect("expected data"); + + let Result::IdentitiesKeys(IdentitiesKeys { entries: keys }) = + result.expect("expected result") + else { + panic!("expected IdentitiesKeys"); + }; + + assert_eq!(keys.len(), 0); + } + + #[test] + fn test_identities_contract_keys_with_identity_absent_contract_proved() { + let (platform, state, platform_version) = setup_platform(false); + + let mut rng = StdRng::seed_from_u64(10); + + let alice_id = rng.gen::<[u8; 32]>(); + + // Create alice identity + let alice = create_test_identity_with_rng( + &platform.drive, + alice_id, + &mut rng, + None, + platform_version, + ) + .expect("expected to create a test identity"); + + let request = GetIdentitiesContractKeysRequestV0 { + identities_ids: vec![alice.id().to_vec()], + contract_id: vec![2; 32], + document_type_name: Some("contactRequest".to_string()), + purposes: vec![Purpose::ENCRYPTION as i32, Purpose::DECRYPTION as i32], + prove: true, + }; + + let result = platform + .query_identities_contract_keys_v0(request, &state, platform_version) + .expect("query failed"); + + let GetIdentitiesContractKeysResponseV0 { result, .. } = + result.data.expect("expected data"); + + let Result::Proof(proof) = result.expect("expected proof") else { + panic!("expected IdentitiesKeys"); + }; + + let (_, results) = Drive::verify_identities_contract_keys( + proof.grovedb_proof.as_slice(), + &[alice.id().to_buffer()], + &[2; 32], + Some("contactRequest".to_string()), + vec![Purpose::ENCRYPTION, Purpose::DECRYPTION], + false, + platform_version, + ) + .expect("expected to verify proof"); + + assert_eq!(results.len(), 1); + + assert_eq!( + results + .get(&alice.id()) + .expect("expected this identifier") + .values() + .cloned() + .collect::>(), + vec![None, None] + ); + } + + #[test] + fn test_identities_contract_keys_missing_identity_keys() { + let (platform, state, platform_version) = setup_platform(true); + + let dashpay = platform.drive.cache.system_data_contracts.load_dashpay(); + + let mut rng = StdRng::seed_from_u64(10); + + let alice_id = rng.gen::<[u8; 32]>(); + + // Create alice identity + let alice = create_test_identity_with_rng( + &platform.drive, + alice_id, + &mut rng, + None, + platform_version, + ) + .expect("expected to create a test identity"); + + let request = GetIdentitiesContractKeysRequestV0 { + identities_ids: vec![alice.id().to_vec()], + contract_id: dashpay.id().to_vec(), + document_type_name: Some("contactRequest".to_string()), + purposes: vec![Purpose::ENCRYPTION as i32, Purpose::DECRYPTION as i32], + prove: false, + }; + + let result = platform + .query_identities_contract_keys_v0(request, &state, platform_version) + .expect("query failed"); + + let GetIdentitiesContractKeysResponseV0 { result, .. } = + result.data.expect("expected data"); + + let Result::IdentitiesKeys(IdentitiesKeys { entries: keys }) = + result.expect("expected result") + else { + panic!("expected IdentitiesKeys"); + }; + + assert_eq!(keys.len(), 0); + } + + #[test] + fn test_identities_contract_keys_missing_identity_keys_proved() { + let (platform, state, platform_version) = setup_platform(true); + + let dashpay = platform.drive.cache.system_data_contracts.load_dashpay(); + + let mut rng = StdRng::seed_from_u64(10); + + let alice_id = rng.gen::<[u8; 32]>(); + + // Create alice identity + let alice = create_test_identity_with_rng( + &platform.drive, + alice_id, + &mut rng, + None, + platform_version, + ) + .expect("expected to create a test identity"); + + let request = GetIdentitiesContractKeysRequestV0 { + identities_ids: vec![alice.id().to_vec()], + contract_id: dashpay.id().to_vec(), + document_type_name: Some("contactRequest".to_string()), + purposes: vec![Purpose::ENCRYPTION as i32, Purpose::DECRYPTION as i32], + prove: true, + }; + + let result = platform + .query_identities_contract_keys_v0(request, &state, platform_version) + .expect("query failed"); + + let GetIdentitiesContractKeysResponseV0 { result, .. } = + result.data.expect("expected data"); + + let Result::Proof(proof) = result.expect("expected proof") else { + panic!("expected IdentitiesKeys"); + }; + + let (_, results) = Drive::verify_identities_contract_keys( + proof.grovedb_proof.as_slice(), + &[alice.id().to_buffer()], + dashpay.id().as_bytes(), + Some("contactRequest".to_string()), + vec![Purpose::ENCRYPTION, Purpose::DECRYPTION], + false, + platform_version, + ) + .expect("expected to verify proof"); + + assert_eq!(results.len(), 1); + + assert_eq!( + results + .get(&alice.id()) + .expect("expected this identifier") + .values() + .cloned() + .collect::>(), + vec![None, None] + ); + } + + #[test] + fn test_identities_contract_keys() { + let (platform, state, platform_version) = setup_platform(true); + + let dashpay = platform.drive.cache.system_data_contracts.load_dashpay(); + + // Create alice and bob identities with encryption and decryption keys + let (alice, bob) = { + let mut rng = StdRng::seed_from_u64(10); + + let alice_id = rng.gen::<[u8; 32]>(); + let bob_id = rng.gen::<[u8; 32]>(); + + // Create alice and bob identities + let (mut alice, mut bob) = { + let alice = create_test_identity_with_rng( + &platform.drive, + alice_id, + &mut rng, + None, + platform_version, + ) + .expect("expected to create a test identity"); + + let bob = create_test_identity_with_rng( + &platform.drive, + bob_id, + &mut rng, + None, + platform_version, + ) + .expect("expected to create a test identity"); + + (alice, bob) + }; + + // Add keys to alice and bob + { + let block = BlockInfo::default_with_epoch(Epoch::new(0).unwrap()); + let db_transaction = platform.drive.grove.start_transaction(); + + let mut add_key_to_identity = + |identity: &mut Identity, key_id: KeyID, purpose: Purpose| { + let (key, _) = IdentityPublicKey::random_key_with_known_attributes( + key_id, + &mut rng, + purpose, + SecurityLevel::MEDIUM, + KeyType::ECDSA_SECP256K1, + Some(ContractBounds::SingleContractDocumentType { + id: dashpay.id(), + document_type_name: "contactRequest".to_string(), + }), + platform_version, + ) + .unwrap(); + + platform + .drive + .add_new_unique_keys_to_identity( + identity.id().to_buffer(), + vec![key.clone()], + &block, + true, + Some(&db_transaction), + platform_version, + ) + .expect("expected to add a new key"); + + identity.public_keys_mut().insert(key.id(), key); + }; + + add_key_to_identity(&mut alice, 2, Purpose::ENCRYPTION); + add_key_to_identity(&mut alice, 3, Purpose::DECRYPTION); + add_key_to_identity(&mut bob, 2, Purpose::ENCRYPTION); + add_key_to_identity(&mut bob, 3, Purpose::DECRYPTION); + + platform + .drive + .grove + .commit_transaction(db_transaction) + .unwrap() + .expect("expected to be able to commit a transaction"); + } + + (alice, bob) + }; + + let request = GetIdentitiesContractKeysRequestV0 { + identities_ids: vec![alice.id().to_vec(), bob.id().to_vec()], + contract_id: dashpay.id().to_vec(), + document_type_name: Some("contactRequest".to_string()), + purposes: vec![Purpose::ENCRYPTION as i32, Purpose::DECRYPTION as i32], + prove: false, + }; + + let result = platform + .query_identities_contract_keys_v0(request, &state, platform_version) + .expect("query failed"); + + let GetIdentitiesContractKeysResponseV0 { result, .. } = + result.data.expect("expected data"); + + let Result::IdentitiesKeys(IdentitiesKeys { entries: keys }) = + result.expect("expected result") + else { + panic!("expected IdentitiesKeys"); + }; + fn assert_keys(identity: &Identity, result_keys: &Vec) { + let identity_keys_result = result_keys + .iter() + .find(|key| key.identity_id == identity.id().to_vec()); + assert_eq!(identity_keys_result.is_some(), true); + let identity_keys_result = identity_keys_result.unwrap(); + + let get_expected_keys = |identity: &Identity, purpose: Purpose| { + identity + .public_keys() + .iter() + .filter(|(_, key)| key.purpose() == purpose) + .map(|(key_id, _)| *key_id) + .sorted() + .collect::>() + }; + + let get_keys_from_result = |keys: &IdentityKeys, purpose: Purpose| { + let mut keys_result = keys + .keys + .iter() + .filter(|key| key.purpose == purpose as i32) + .fold(vec![], |mut acc, keys| { + let keys = keys.keys_bytes.iter().map(|key_bytes| { + IdentityPublicKey::deserialize_from_bytes(key_bytes.as_slice()) + .unwrap() + .id() + }); + acc.extend(keys); + acc + }); + + keys_result.sort(); + keys_result + }; + + let enc_keys_expected = get_expected_keys(identity, Purpose::ENCRYPTION); + let dec_keys_expected = get_expected_keys(identity, Purpose::DECRYPTION); + + let enc_keys_result = get_keys_from_result(identity_keys_result, Purpose::ENCRYPTION); + let dec_keys_result = get_keys_from_result(identity_keys_result, Purpose::DECRYPTION); + + assert_eq!(enc_keys_result, enc_keys_expected); + assert_eq!(dec_keys_result, dec_keys_expected); + } + + assert_keys(&alice, &keys); + assert_keys(&bob, &keys); + } + + #[test] + fn test_identities_contract_keys_proof() { + let (platform, state, platform_version) = setup_platform(true); + + let dashpay = platform.drive.cache.system_data_contracts.load_dashpay(); + + let mut rng = StdRng::seed_from_u64(10); + + let alice_id = rng.gen::<[u8; 32]>(); + let alice = create_test_identity_with_rng( + &platform.drive, + alice_id, + &mut rng, + None, + platform_version, + ) + .expect("expected to create a test identity"); + + let block = BlockInfo::default_with_epoch(Epoch::new(0).unwrap()); + + let (alice_enc_key, _) = IdentityPublicKey::random_key_with_known_attributes( + 2, + &mut rng, + Purpose::ENCRYPTION, + SecurityLevel::MEDIUM, + KeyType::ECDSA_SECP256K1, + Some(ContractBounds::SingleContractDocumentType { + id: dashpay.id(), + document_type_name: "contactRequest".to_string(), + }), + platform_version, + ) + .unwrap(); + + let db_transaction = platform.drive.grove.start_transaction(); + + platform + .drive + .add_new_unique_keys_to_identity( + alice.id().to_buffer(), + vec![alice_enc_key.clone()], + &block, + true, + Some(&db_transaction), + platform_version, + ) + .expect("expected to add a new key"); + platform + .drive + .grove + .commit_transaction(db_transaction) + .unwrap() + .expect("expected to be able to commit a transaction"); + + let request = GetIdentitiesContractKeysRequestV0 { + identities_ids: vec![alice.id().to_vec()], + contract_id: dashpay.id().to_vec(), + document_type_name: Some("contactRequest".to_string()), + purposes: vec![Purpose::ENCRYPTION as i32, Purpose::DECRYPTION as i32], + prove: true, + }; + + let result = platform + .query_identities_contract_keys_v0(request, &state, platform_version) + .expect("query failed"); + + let GetIdentitiesContractKeysResponseV0 { result, .. } = + result.data.expect("expected data"); + + let Result::Proof(proof) = result.expect("expected proof") else { + panic!("expected IdentitiesKeys"); + }; + + let (_, results) = Drive::verify_identities_contract_keys( + proof.grovedb_proof.as_slice(), + &[alice.id().to_buffer()], + dashpay.id().as_bytes(), + Some("contactRequest".to_string()), + vec![Purpose::ENCRYPTION, Purpose::DECRYPTION], + false, + platform_version, + ) + .expect("expected to verify proof"); + + assert_eq!( + results + .get(&alice.id()) + .expect("expected this identifier") + .values() + .cloned() + .collect::>(), + vec![Some(alice_enc_key), None] + ); + } + + #[test] + fn test_multiple_identities_contract_keys() { + let (platform, state, platform_version) = setup_platform(true); + + let dashpay = platform.drive.cache.system_data_contracts.load_dashpay(); + + let mut rng = StdRng::seed_from_u64(10); + + let alice_id = rng.gen::<[u8; 32]>(); + let bob_id = rng.gen::<[u8; 32]>(); + let carol_id = rng.gen::<[u8; 32]>(); + let mut alice = create_test_identity_with_rng( + &platform.drive, + alice_id, + &mut rng, + None, + platform_version, + ) + .expect("expected to create a test identity"); + + let mut bob = create_test_identity_with_rng( + &platform.drive, + bob_id, + &mut rng, + None, + platform_version, + ) + .expect("expected to create a test identity"); + + let carol = create_test_identity_with_rng( + &platform.drive, + carol_id, + &mut rng, + None, + platform_version, + ) + .expect("expected to create a test identity"); + + let block = BlockInfo::default_with_epoch(Epoch::new(0).unwrap()); + + let (alice_enc_key, _) = IdentityPublicKey::random_key_with_known_attributes( + 2, + &mut rng, + Purpose::ENCRYPTION, + SecurityLevel::MEDIUM, + KeyType::ECDSA_SECP256K1, + Some(ContractBounds::SingleContractDocumentType { + id: dashpay.id(), + document_type_name: "contactRequest".to_string(), + }), + platform_version, + ) + .unwrap(); + + let (alice_dec_key, _) = IdentityPublicKey::random_key_with_known_attributes( + 3, + &mut rng, + Purpose::DECRYPTION, + SecurityLevel::MEDIUM, + KeyType::ECDSA_SECP256K1, + Some(ContractBounds::SingleContractDocumentType { + id: dashpay.id(), + document_type_name: "contactRequest".to_string(), + }), + platform_version, + ) + .unwrap(); + + let (bob_enc_key, _) = IdentityPublicKey::random_key_with_known_attributes( + 2, + &mut rng, + Purpose::ENCRYPTION, + SecurityLevel::MEDIUM, + KeyType::ECDSA_SECP256K1, + Some(ContractBounds::SingleContractDocumentType { + id: dashpay.id(), + document_type_name: "contactRequest".to_string(), + }), + platform_version, + ) + .unwrap(); + + let db_transaction = platform.drive.grove.start_transaction(); + + platform + .drive + .add_new_unique_keys_to_identity( + alice.id().to_buffer(), + vec![alice_enc_key.clone(), alice_dec_key.clone()], + &block, + true, + Some(&db_transaction), + platform_version, + ) + .expect("expected to add a new key"); + + alice.public_keys_mut().insert(2, alice_enc_key.clone()); + alice.public_keys_mut().insert(3, alice_dec_key.clone()); + + platform + .drive + .add_new_unique_keys_to_identity( + bob.id().to_buffer(), + vec![bob_enc_key.clone()], + &block, + true, + Some(&db_transaction), + platform_version, + ) + .expect("expected to add a new key"); + + bob.public_keys_mut().insert(2, bob_enc_key.clone()); + + platform + .drive + .grove + .commit_transaction(db_transaction) + .unwrap() + .expect("expected to be able to commit a transaction"); + + let request = GetIdentitiesContractKeysRequestV0 { + identities_ids: vec![alice.id().to_vec(), bob.id().to_vec(), carol.id().to_vec()], + contract_id: dashpay.id().to_vec(), + document_type_name: Some("contactRequest".to_string()), + purposes: vec![Purpose::ENCRYPTION as i32, Purpose::DECRYPTION as i32], + prove: false, + }; + + let result = platform + .query_identities_contract_keys_v0(request, &state, platform_version) + .expect("query failed"); + + let GetIdentitiesContractKeysResponseV0 { result, .. } = + result.data.expect("expected data"); + + let Result::IdentitiesKeys(IdentitiesKeys { entries: keys }) = + result.expect("expected result") + else { + panic!("expected IdentitiesKeys"); + }; + fn assert_keys(identity: &Identity, result_keys: &Vec) { + let identity_keys_result = result_keys + .iter() + .find(|key| key.identity_id == identity.id().to_vec()); + + let get_expected_keys = |identity: &Identity, purpose: Purpose| { + identity + .public_keys() + .iter() + .filter(|(_, key)| key.purpose() == purpose) + .map(|(key_id, _)| *key_id) + .sorted() + .collect::>() + }; + + let enc_keys_expected = get_expected_keys(identity, Purpose::ENCRYPTION); + let dec_keys_expected = get_expected_keys(identity, Purpose::DECRYPTION); + + if enc_keys_expected.is_empty() + && dec_keys_expected.is_empty() + && identity_keys_result.is_none() + { + return; + } + + let get_keys_from_result = |keys: &IdentityKeys, purpose: Purpose| { + let mut keys_result = keys + .keys + .iter() + .filter(|key| key.purpose == purpose as i32) + .fold(vec![], |mut acc, keys| { + let keys = keys.keys_bytes.iter().map(|key_bytes| { + IdentityPublicKey::deserialize_from_bytes(key_bytes.as_slice()) + .unwrap() + .id() + }); + acc.extend(keys); + acc + }); + + keys_result.sort(); + keys_result + }; + + assert_eq!(identity_keys_result.is_some(), true); + + let identity_keys_result = identity_keys_result.unwrap(); + + let enc_keys_result = get_keys_from_result(identity_keys_result, Purpose::ENCRYPTION); + let dec_keys_result = get_keys_from_result(identity_keys_result, Purpose::DECRYPTION); + + assert_eq!(enc_keys_result, enc_keys_expected); + assert_eq!(dec_keys_result, dec_keys_expected); + } + + assert_keys(&alice, &keys); + assert_keys(&bob, &keys); + assert_keys(&carol, &keys); + } + + #[test] + fn test_multiple_identities_contract_keys_proof() { + let (platform, state, platform_version) = setup_platform(true); + + let dashpay = platform.drive.cache.system_data_contracts.load_dashpay(); + + let mut rng = StdRng::seed_from_u64(10); + + let alice_id = rng.gen::<[u8; 32]>(); + let bob_id = rng.gen::<[u8; 32]>(); + let carol_id = rng.gen::<[u8; 32]>(); + let alice = create_test_identity_with_rng( + &platform.drive, + alice_id, + &mut rng, + None, + platform_version, + ) + .expect("expected to create a test identity"); + + let bob = create_test_identity_with_rng( + &platform.drive, + bob_id, + &mut rng, + None, + platform_version, + ) + .expect("expected to create a test identity"); + + let carol = create_test_identity_with_rng( + &platform.drive, + carol_id, + &mut rng, + None, + platform_version, + ) + .expect("expected to create a test identity"); + + let block = BlockInfo::default_with_epoch(Epoch::new(0).unwrap()); + + let (alice_enc_key, _) = IdentityPublicKey::random_key_with_known_attributes( + 2, + &mut rng, + Purpose::ENCRYPTION, + SecurityLevel::MEDIUM, + KeyType::ECDSA_SECP256K1, + Some(ContractBounds::SingleContractDocumentType { + id: dashpay.id(), + document_type_name: "contactRequest".to_string(), + }), + platform_version, + ) + .unwrap(); + + let (alice_dec_key, _) = IdentityPublicKey::random_key_with_known_attributes( + 3, + &mut rng, + Purpose::DECRYPTION, + SecurityLevel::MEDIUM, + KeyType::ECDSA_SECP256K1, + Some(ContractBounds::SingleContractDocumentType { + id: dashpay.id(), + document_type_name: "contactRequest".to_string(), + }), + platform_version, + ) + .unwrap(); + + let (bob_enc_key, _) = IdentityPublicKey::random_key_with_known_attributes( + 2, + &mut rng, + Purpose::ENCRYPTION, + SecurityLevel::MEDIUM, + KeyType::ECDSA_SECP256K1, + Some(ContractBounds::SingleContractDocumentType { + id: dashpay.id(), + document_type_name: "contactRequest".to_string(), + }), + platform_version, + ) + .unwrap(); + + let db_transaction = platform.drive.grove.start_transaction(); + + platform + .drive + .add_new_unique_keys_to_identity( + alice.id().to_buffer(), + vec![alice_enc_key.clone(), alice_dec_key.clone()], + &block, + true, + Some(&db_transaction), + platform_version, + ) + .expect("expected to add a new key"); + + platform + .drive + .add_new_unique_keys_to_identity( + bob.id().to_buffer(), + vec![bob_enc_key.clone()], + &block, + true, + Some(&db_transaction), + platform_version, + ) + .expect("expected to add a new key"); + platform + .drive + .grove + .commit_transaction(db_transaction) + .unwrap() + .expect("expected to be able to commit a transaction"); + + let request = GetIdentitiesContractKeysRequestV0 { + identities_ids: vec![alice.id().to_vec(), bob.id().to_vec(), carol.id().to_vec()], + contract_id: dashpay.id().to_vec(), + document_type_name: Some("contactRequest".to_string()), + purposes: vec![Purpose::ENCRYPTION as i32, Purpose::DECRYPTION as i32], + prove: true, + }; + + let result = platform + .query_identities_contract_keys_v0(request, &state, platform_version) + .expect("query failed"); + + let GetIdentitiesContractKeysResponseV0 { result, .. } = + result.data.expect("expected data"); + + let Result::Proof(proof) = result.expect("expected proof") else { + panic!("expected IdentitiesKeys"); + }; + + let (_, results) = Drive::verify_identities_contract_keys( + proof.grovedb_proof.as_slice(), + &[ + alice.id().to_buffer(), + bob.id().to_buffer(), + carol.id().to_buffer(), + ], + dashpay.id().as_bytes(), + Some("contactRequest".to_string()), + vec![Purpose::ENCRYPTION, Purpose::DECRYPTION], + false, + platform_version, + ) + .expect("expected to verify proof"); + + assert_eq!( + results + .get(&alice.id()) + .expect("expected this identifier") + .values() + .cloned() + .collect::>(), + vec![Some(alice_enc_key), Some(alice_dec_key)] + ); + assert_eq!( + results + .get(&bob.id()) + .expect("expected this identifier") + .values() + .cloned() + .collect::>(), + vec![Some(bob_enc_key), None] + ); + assert_eq!( + results + .get(&carol.id()) + .expect("expected this identifier") + .values() + .cloned() + .collect::>(), + vec![None, None] + ); + } +} diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identity/v0/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identity/v0/mod.rs index 9420ee1650..fa1b9002bc 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/identity/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identity/v0/mod.rs @@ -74,7 +74,7 @@ mod tests { #[test] fn test_invalid_identity_id() { - let (platform, state, _unused_version) = setup_platform(); + let (platform, state, _unused_version) = setup_platform(false); let version = PlatformVersion::latest(); @@ -92,7 +92,7 @@ mod tests { #[test] fn test_identity_not_found() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let id = vec![0; 32]; let request = GetIdentityRequestV0 { @@ -114,7 +114,7 @@ mod tests { #[test] fn test_identity_absence_proof() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let id = vec![0; 32]; let request = GetIdentityRequestV0 { diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identity_by_public_key_hash/v0/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identity_by_public_key_hash/v0/mod.rs index 2500b19d42..38e4b50a91 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/identity_by_public_key_hash/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identity_by_public_key_hash/v0/mod.rs @@ -82,7 +82,7 @@ mod tests { #[test] fn test_invalid_public_key_hash() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let request = GetIdentityByPublicKeyHashRequestV0 { public_key_hash: vec![0; 8], @@ -101,7 +101,7 @@ mod tests { #[test] fn test_identity_not_found() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let public_key_hash = vec![0; 20]; let request = GetIdentityByPublicKeyHashRequestV0 { @@ -121,7 +121,7 @@ mod tests { #[test] fn test_identity_absence_proof() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let public_key_hash = vec![0; 20]; let request = GetIdentityByPublicKeyHashRequestV0 { diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identity_contract_nonce/v0/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identity_contract_nonce/v0/mod.rs index ff62101fcd..40adde2c50 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/identity_contract_nonce/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identity_contract_nonce/v0/mod.rs @@ -91,7 +91,7 @@ mod tests { #[test] fn test_invalid_identity_id() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let request = GetIdentityContractNonceRequestV0 { identity_id: vec![0; 8], @@ -110,7 +110,7 @@ mod tests { #[test] fn test_invalid_contract_id() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let request = GetIdentityContractNonceRequestV0 { identity_id: vec![0; 32], @@ -129,7 +129,7 @@ mod tests { #[test] fn test_identity_not_found_when_querying_identity_nonce() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let request = GetIdentityContractNonceRequestV0 { identity_id: vec![0; 32], @@ -156,7 +156,7 @@ mod tests { #[test] fn test_contract_info_not_found_when_querying_identity_nonce_with_known_identity() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let mut rng = StdRng::seed_from_u64(45); let id = rng.gen::<[u8; 32]>(); let _unused_identity = @@ -188,7 +188,7 @@ mod tests { #[test] fn test_identity_is_found_when_querying_identity_nonce() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let mut rng = StdRng::seed_from_u64(10); let id = rng.gen::<[u8; 32]>(); let identity = create_test_identity_with_rng(&platform.drive, id, &mut rng, None, version) @@ -235,7 +235,7 @@ mod tests { #[test] fn test_identity_is_found_when_querying_identity_nonce_after_update() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let mut rng = StdRng::seed_from_u64(10); let id = rng.gen::<[u8; 32]>(); let identity = create_test_identity_with_rng(&platform.drive, id, &mut rng, None, version) @@ -296,7 +296,7 @@ mod tests { #[test] fn test_identity_is_found_when_querying_identity_nonce_after_update_for_past() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let mut rng = StdRng::seed_from_u64(10); let id = rng.gen::<[u8; 32]>(); let identity = create_test_identity_with_rng(&platform.drive, id, &mut rng, None, version) @@ -372,7 +372,7 @@ mod tests { #[test] fn test_identity_contract_nonce_absence_proof() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let request = GetIdentityContractNonceRequestV0 { identity_id: vec![0; 32], diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/identity_nonce/v0/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/identity_nonce/v0/mod.rs index b98b3f07fd..9981bbb233 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/identity_nonce/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/identity_nonce/v0/mod.rs @@ -71,7 +71,7 @@ mod tests { #[test] fn test_invalid_identity_id() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let request = GetIdentityNonceRequestV0 { identity_id: vec![0; 8], @@ -89,7 +89,7 @@ mod tests { #[test] fn test_identity_not_found_when_querying_identity_nonce() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let request = GetIdentityNonceRequestV0 { identity_id: vec![0; 32], @@ -113,7 +113,7 @@ mod tests { #[test] fn test_identity_is_found_when_querying_identity_nonce() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let mut rng = StdRng::seed_from_u64(10); let id = rng.gen::<[u8; 32]>(); let _unused_identity = @@ -142,7 +142,7 @@ mod tests { #[test] fn test_identity_is_found_when_querying_identity_nonce_after_update() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let mut rng = StdRng::seed_from_u64(10); let id = rng.gen::<[u8; 32]>(); let identity = create_test_identity_with_rng(&platform.drive, id, &mut rng, None, version) @@ -194,7 +194,7 @@ mod tests { #[test] fn test_identity_is_found_when_querying_identity_nonce_after_update_for_past() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let mut rng = StdRng::seed_from_u64(10); let id = rng.gen::<[u8; 32]>(); let identity = create_test_identity_with_rng(&platform.drive, id, &mut rng, None, version) @@ -259,7 +259,7 @@ mod tests { #[test] fn test_identity_contract_nonce_absence_proof() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let request = GetIdentityNonceRequestV0 { identity_id: vec![0; 32], diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/keys/v0/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/keys/v0/mod.rs index de77fe63db..a8e8510b24 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/keys/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/keys/v0/mod.rs @@ -172,7 +172,7 @@ mod tests { #[test] fn test_invalid_identity_id() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let request = GetIdentityKeysRequestV0 { identity_id: vec![0; 8], @@ -191,7 +191,7 @@ mod tests { #[test] fn test_invalid_limit_u16_overflow() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let request = GetIdentityKeysRequestV0 { identity_id: vec![0; 32], @@ -213,7 +213,7 @@ mod tests { #[test] fn test_invalid_limit_max() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let request = GetIdentityKeysRequestV0 { identity_id: vec![0; 32], @@ -240,7 +240,7 @@ mod tests { #[test] fn test_invalid_offset_u16_overflow() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let request = GetIdentityKeysRequestV0 { identity_id: vec![0; 32], @@ -262,7 +262,7 @@ mod tests { #[test] fn test_missing_request_type() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let request = GetIdentityKeysRequestV0 { identity_id: vec![0; 32], @@ -284,7 +284,7 @@ mod tests { #[test] fn test_missing_request() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let request = GetIdentityKeysRequestV0 { identity_id: vec![0; 32], @@ -306,7 +306,7 @@ mod tests { #[test] fn test_invalid_key_request_type() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let request = GetIdentityKeysRequestV0 { identity_id: vec![0; 32], @@ -339,7 +339,7 @@ mod tests { #[test] fn test_absent_keys() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let request = GetIdentityKeysRequestV0 { identity_id: vec![0; 32], @@ -366,7 +366,7 @@ mod tests { #[test] fn test_absent_keys_proof() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let request = GetIdentityKeysRequestV0 { identity_id: vec![0; 32], diff --git a/packages/rs-drive-abci/src/query/identity_based_queries/mod.rs b/packages/rs-drive-abci/src/query/identity_based_queries/mod.rs index dda33e20e5..3a9d833283 100644 --- a/packages/rs-drive-abci/src/query/identity_based_queries/mod.rs +++ b/packages/rs-drive-abci/src/query/identity_based_queries/mod.rs @@ -1,7 +1,6 @@ mod balance; mod balance_and_revision; -mod identities; -mod identities_by_public_key_hashes; +mod identities_contract_keys; mod identity; mod identity_by_public_key_hash; mod identity_contract_nonce; diff --git a/packages/rs-drive-abci/src/query/mod.rs b/packages/rs-drive-abci/src/query/mod.rs index 233707a3de..c27ec51c7d 100644 --- a/packages/rs-drive-abci/src/query/mod.rs +++ b/packages/rs-drive-abci/src/query/mod.rs @@ -31,14 +31,22 @@ mod tests { use std::borrow::Cow; use std::sync::Arc; - pub fn setup_platform<'a>() -> ( + pub fn setup_platform<'a>( + with_genesis_state: bool, + ) -> ( TempPlatform, Arc, &'a PlatformVersion, ) { - let platform = TestPlatformBuilder::new() - .build_with_mock_rpc() - .set_initial_state_structure(); + let platform = if with_genesis_state { + TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_genesis_state() + } else { + TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure() + }; // We can't return a reference to Arc (`load` method) so we clone Arc (`load_full`). // This is a bit slower but we don't care since we are in test environment diff --git a/packages/rs-drive-abci/src/query/proofs/v0/mod.rs b/packages/rs-drive-abci/src/query/proofs/v0/mod.rs index e1a2409e35..c33d3301b7 100644 --- a/packages/rs-drive-abci/src/query/proofs/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/proofs/v0/mod.rs @@ -119,7 +119,7 @@ mod tests { #[test] fn test_invalid_identity_ids() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let request = GetProofsRequestV0 { identities: vec![IdentityRequest { @@ -139,7 +139,7 @@ mod tests { #[test] fn test_invalid_identity_prove_request_type() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let request_type = 10; @@ -167,7 +167,7 @@ mod tests { #[test] fn test_invalid_contract_ids() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let request = GetProofsRequestV0 { identities: vec![], @@ -186,7 +186,7 @@ mod tests { #[test] fn test_invalid_contract_id_for_documents_proof() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let request = GetProofsRequestV0 { identities: vec![], @@ -208,7 +208,7 @@ mod tests { #[test] fn test_invalid_document_id() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let request = GetProofsRequestV0 { identities: vec![], @@ -230,7 +230,7 @@ mod tests { #[test] fn test_proof_of_absence() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let request = GetProofsRequestV0 { identities: vec![], @@ -255,7 +255,7 @@ mod tests { #[test] fn test_prove_all() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let request = GetProofsRequestV0 { identities: vec![IdentityRequest { diff --git a/packages/rs-drive-abci/src/query/service.rs b/packages/rs-drive-abci/src/query/service.rs index 15060e5fcf..4a95675645 100644 --- a/packages/rs-drive-abci/src/query/service.rs +++ b/packages/rs-drive-abci/src/query/service.rs @@ -13,8 +13,7 @@ use dapi_grpc::platform::v0::{ GetConsensusParamsResponse, GetDataContractHistoryRequest, GetDataContractHistoryResponse, GetDataContractRequest, GetDataContractResponse, GetDataContractsRequest, GetDataContractsResponse, GetDocumentsRequest, GetDocumentsResponse, GetEpochsInfoRequest, - GetEpochsInfoResponse, GetIdentitiesByPublicKeyHashesRequest, - GetIdentitiesByPublicKeyHashesResponse, GetIdentitiesRequest, GetIdentitiesResponse, + GetEpochsInfoResponse, GetIdentitiesContractKeysRequest, GetIdentitiesContractKeysResponse, GetIdentityBalanceAndRevisionRequest, GetIdentityBalanceAndRevisionResponse, GetIdentityBalanceRequest, GetIdentityBalanceResponse, GetIdentityByPublicKeyHashRequest, GetIdentityByPublicKeyHashResponse, GetIdentityContractNonceRequest, @@ -183,14 +182,14 @@ impl PlatformService for QueryService { .await } - async fn get_identities( + async fn get_identities_contract_keys( &self, - request: Request, - ) -> Result, Status> { + request: Request, + ) -> Result, Status> { self.handle_blocking_query( request, - Platform::::query_identities, - "get_identities", + Platform::::query_identities_contract_keys, + "get_identities_contract_keys", ) .await } @@ -315,18 +314,6 @@ impl PlatformService for QueryService { .await } - async fn get_identities_by_public_key_hashes( - &self, - request: Request, - ) -> Result, Status> { - self.handle_blocking_query( - request, - Platform::::query_identities_by_public_key_hashes, - "get_identities_by_public_key_hashes", - ) - .await - } - async fn get_identity_by_public_key_hash( &self, request: Request, diff --git a/packages/rs-drive-abci/src/query/system/epoch_infos/v0/mod.rs b/packages/rs-drive-abci/src/query/system/epoch_infos/v0/mod.rs index afce159664..08b55713a4 100644 --- a/packages/rs-drive-abci/src/query/system/epoch_infos/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/system/epoch_infos/v0/mod.rs @@ -105,7 +105,7 @@ mod tests { #[test] fn test_query_empty_epoch_infos() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let request = GetEpochsInfoRequestV0 { start_epoch: None, // 0 @@ -129,7 +129,7 @@ mod tests { #[test] fn test_query_empty_epoch_infos_descending() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let request = GetEpochsInfoRequestV0 { start_epoch: None, // 0 diff --git a/packages/rs-drive-abci/src/query/system/path_elements/v0/mod.rs b/packages/rs-drive-abci/src/query/system/path_elements/v0/mod.rs index 705375640b..9a4cfa0cc6 100644 --- a/packages/rs-drive-abci/src/query/system/path_elements/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/system/path_elements/v0/mod.rs @@ -84,7 +84,7 @@ mod tests { #[test] fn test_query_total_system_credits_from_path_elements_query() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let platform_version = PlatformVersion::latest(); diff --git a/packages/rs-drive-abci/src/query/system/version_upgrade_state/v0/mod.rs b/packages/rs-drive-abci/src/query/system/version_upgrade_state/v0/mod.rs index e840dd2dff..705de30be4 100644 --- a/packages/rs-drive-abci/src/query/system/version_upgrade_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/system/version_upgrade_state/v0/mod.rs @@ -77,7 +77,7 @@ mod tests { #[test] fn test_query_empty_upgrade_state() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let request = GetProtocolVersionUpgradeStateRequestV0 { prove: false }; @@ -96,7 +96,7 @@ mod tests { #[test] fn test_query_upgrade_state() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let mut rand = StdRng::seed_from_u64(10); @@ -187,7 +187,7 @@ mod tests { #[test] fn test_prove_empty_upgrade_state() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let request = GetProtocolVersionUpgradeStateRequestV0 { prove: true }; @@ -219,7 +219,7 @@ mod tests { #[test] fn test_prove_upgrade_state() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let mut rand = StdRng::seed_from_u64(10); diff --git a/packages/rs-drive-abci/src/query/system/version_upgrade_vote_status/v0/mod.rs b/packages/rs-drive-abci/src/query/system/version_upgrade_vote_status/v0/mod.rs index ea550ccf7c..4e4983763d 100644 --- a/packages/rs-drive-abci/src/query/system/version_upgrade_vote_status/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/system/version_upgrade_vote_status/v0/mod.rs @@ -113,7 +113,7 @@ mod tests { #[test] fn test_query_empty_upgrade_vote_status() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let mut rand = StdRng::seed_from_u64(10); @@ -139,7 +139,7 @@ mod tests { #[test] fn test_query_upgrade_vote_status() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let mut rand = StdRng::seed_from_u64(10); @@ -231,7 +231,7 @@ mod tests { #[test] fn test_prove_empty_upgrade_vote_status() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let mut rand = StdRng::seed_from_u64(10); @@ -275,7 +275,7 @@ mod tests { #[test] fn test_prove_upgrade_vote_status() { - let (platform, state, version) = setup_platform(); + let (platform, state, version) = setup_platform(false); let mut rand = StdRng::seed_from_u64(10); diff --git a/packages/rs-drive-abci/tests/strategy_tests/query.rs b/packages/rs-drive-abci/tests/strategy_tests/query.rs index b25ac5ad02..3423bca21c 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/query.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/query.rs @@ -1,9 +1,8 @@ use crate::strategy::StrategyRandomness; -use dapi_grpc::platform::v0::get_identities_by_public_key_hashes_request::GetIdentitiesByPublicKeyHashesRequestV0; -use dapi_grpc::platform::v0::get_identities_by_public_key_hashes_response::PublicKeyHashIdentityEntry; +use dapi_grpc::platform::v0::get_identity_by_public_key_hash_request::GetIdentityByPublicKeyHashRequestV0; use dapi_grpc::platform::v0::{ - get_identities_by_public_key_hashes_request, get_identities_by_public_key_hashes_response, - GetIdentitiesByPublicKeyHashesRequest, Proof, + get_identity_by_public_key_hash_request, get_identity_by_public_key_hash_response, + GetIdentityByPublicKeyHashRequest, Proof, }; use dashcore_rpc::dashcore_rpc_json::QuorumType; use dpp::identity::accessors::IdentityGettersV0; @@ -114,7 +113,7 @@ impl<'a> ProofVerification<'a> { e, format!("Malformed signature data: {}", hex::encode(self.signature)), ), - ) + ); } }; tracing::trace!( @@ -231,88 +230,63 @@ impl QueryStrategy { let prove: bool = rng.gen(); - let request = GetIdentitiesByPublicKeyHashesRequest { - version: Some(get_identities_by_public_key_hashes_request::Version::V0( - GetIdentitiesByPublicKeyHashesRequestV0 { - public_key_hashes: public_key_hashes - .keys() - .map(|hash| hash.to_vec()) - .collect(), - prove, - }, - )), - }; - let query_validation_result = abci_app - .platform - .query_identities_by_public_key_hashes(request, &platform_state, platform_version) - .expect("expected to run query"); - - assert!( - query_validation_result.errors.is_empty(), - "{:?}", - query_validation_result.errors - ); - - let response = query_validation_result - .into_data() - .expect("expected data on query_validation_result"); - - let versioned_result = response.version.expect("expected a result"); - match versioned_result { - get_identities_by_public_key_hashes_response::Version::V0(v0) => { - let result = v0.result.expect("expected a result"); - - match result { - get_identities_by_public_key_hashes_response::get_identities_by_public_key_hashes_response_v0::Result::Proof(proof) => { - let (proof_root_hash, identities): ( - RootHash, - HashMap<[u8; 20], Option>, - ) = Drive::verify_full_identities_by_public_key_hashes( - &proof.grovedb_proof, - public_key_hashes - .keys() - .cloned() - .collect::>() - .as_slice(), - platform_version, - ) - .expect("expected to verify proof"); - let identities: HashMap<[u8; 20], PartialIdentity> = identities - .into_iter() - .map(|(k, v)| { - ( - k, - v.expect("expect an identity") - .into_partial_identity_info_no_balance(), - ) - }) - .collect(); - assert_eq!(proof_verification.app_hash, &proof_root_hash); - assert!(proof_verification - .verify_proof(&proof_root_hash, proof) - .is_valid()); - assert_eq!(identities, public_key_hashes); - } - get_identities_by_public_key_hashes_response::get_identities_by_public_key_hashes_response_v0::Result::Identities(data) => { - let identities_returned = data - .identity_entries - .into_iter() - .map(|entry| { - let PublicKeyHashIdentityEntry{ value, .. } = entry; - Identity::deserialize_from_bytes(&value.expect("expected a value")) - .expect("expected to deserialize identity") - .id() - }) - .collect::>(); - assert_eq!( - identities_returned, - public_key_hashes - .values() - .map(|partial_identity| partial_identity.id) - .collect() - ); - } - } + for (key_hash, expected_identity) in public_key_hashes { + let request = GetIdentityByPublicKeyHashRequest { + version: Some(get_identity_by_public_key_hash_request::Version::V0( + GetIdentityByPublicKeyHashRequestV0 { + public_key_hash: key_hash.to_vec(), + prove, + }, + )), + }; + + let query_validation_result = abci_app + .platform + .query_identity_by_public_key_hash(request, &platform_state, platform_version) + .expect("expected to run query"); + + assert!( + query_validation_result.errors.is_empty(), + "{:?}", + query_validation_result.errors + ); + + let response = query_validation_result + .into_data() + .expect("expected data on query_validation_result"); + + let versioned_result = response.version.expect("expected a result"); + match versioned_result { + get_identity_by_public_key_hash_response::Version::V0(v0) => { + let result = v0.result.expect("expected a result"); + + match result { + get_identity_by_public_key_hash_response::get_identity_by_public_key_hash_response_v0::Result::Proof(proof) => { + let (proof_root_hash, identity): ( + RootHash, + Option, + ) = Drive::verify_full_identity_by_public_key_hash( + &proof.grovedb_proof, + key_hash, + platform_version, + ) + .expect("expected to verify proof"); + let identity = identity.expect("expected an identity") + .into_partial_identity_info_no_balance(); + assert_eq!(proof_verification.app_hash, &proof_root_hash); + assert!(proof_verification + .verify_proof(&proof_root_hash, proof) + .is_valid()); + assert_eq!(identity, expected_identity); + } + get_identity_by_public_key_hash_response::get_identity_by_public_key_hash_response_v0::Result::Identity(data) => { + let identity_id = Identity::deserialize_from_bytes(&data) + .expect("expected to deserialize identity").id(); + + assert_eq!(identity_id, expected_identity.id); + } + } + } } } } diff --git a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs index a52c42ac3d..dae0d7acc8 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs @@ -1340,6 +1340,7 @@ impl NetworkStrategy { *purpose, *security_level, *key_type, + None, platform_version, ) .expect("expected to create key"); diff --git a/packages/rs-drive-proof-verifier/src/proof.rs b/packages/rs-drive-proof-verifier/src/proof.rs index 4fc62fd12b..b9db571ae2 100644 --- a/packages/rs-drive-proof-verifier/src/proof.rs +++ b/packages/rs-drive-proof-verifier/src/proof.rs @@ -5,10 +5,11 @@ use dapi_grpc::platform::v0::get_protocol_version_upgrade_vote_status_request::{ use dapi_grpc::platform::v0::security_level_map::KeyKindRequestType as GrpcKeyKind; use dapi_grpc::platform::v0::{ get_data_contract_history_request, get_data_contract_request, get_data_contracts_request, - get_epochs_info_request, get_identity_balance_and_revision_request, - get_identity_balance_request, get_identity_by_public_key_hash_request, - get_identity_contract_nonce_request, get_identity_keys_request, get_identity_nonce_request, - get_identity_request, get_path_elements_request, GetPathElementsRequest, + get_epochs_info_request, get_identities_contract_keys_request, + get_identity_balance_and_revision_request, get_identity_balance_request, + get_identity_by_public_key_hash_request, get_identity_contract_nonce_request, + get_identity_keys_request, get_identity_nonce_request, get_identity_request, + get_path_elements_request, GetIdentitiesContractKeysRequest, GetPathElementsRequest, GetPathElementsResponse, GetProtocolVersionUpgradeStateRequest, GetProtocolVersionUpgradeStateResponse, GetProtocolVersionUpgradeVoteStatusRequest, GetProtocolVersionUpgradeVoteStatusResponse, ResponseMetadata, @@ -31,8 +32,12 @@ use drive::drive::identity::key::fetch::{ IdentityKeysRequest, KeyKindRequestType, KeyRequestType, PurposeU8, SecurityLevelU8, }; +use dapi_grpc::platform::v0::get_identities_contract_keys_request::GetIdentitiesContractKeysRequestV0; use dapi_grpc::platform::v0::get_path_elements_request::GetPathElementsRequestV0; use dpp::block::block_info::BlockInfo; +use dpp::identity::identities_contract_keys::IdentitiesContractKeys; +use dpp::identity::{IdentityPublicKey, Purpose}; +use dpp::platform_value; use drive::drive::Drive; use drive::error::proof::ProofError; use drive::query::DriveQuery; @@ -68,6 +73,7 @@ pub trait FromProof { /// /// * `request`: The request sent to the server. /// * `response`: The response received from the server. + /// * `platform_version`: The platform version that should be used. /// * `provider`: A callback implementing [ContextProvider] that provides quorum details required to verify the proof. /// /// # Returns @@ -95,6 +101,7 @@ pub trait FromProof { /// /// * `request`: The request sent to the server. /// * `response`: The response received from the server. + /// * `platform_version`: The platform version that should be used. /// * `provider`: A callback implementing [ContextProvider] that provides quorum details required to verify the proof. /// /// # Returns @@ -123,6 +130,7 @@ pub trait FromProof { /// /// * `request`: The request sent to the server. /// * `response`: The response received from the server. + /// * `platform_version`: The platform version that should be used. /// * `provider`: A callback implementing [ContextProvider] that provides quorum details required to verify the proof. /// /// # Returns @@ -142,6 +150,39 @@ pub trait FromProof { Self::maybe_from_proof(request, response, platform_version, provider)? .ok_or(Error::NotFound) } + + /// Retrieve the requested object from the proof with metadata. + /// + /// Runs full verification of the proof and retrieves enclosed objects. + /// + /// This method uses [`FromProof::maybe_from_proof_with_metadata()`] internally and throws an error + /// if the requested object does not exist in the proof. + /// + /// # Arguments + /// + /// * `request`: The request sent to the server. + /// * `response`: The response received from the server. + /// * `platform_version`: The platform version that should be used. + /// * `provider`: A callback implementing [ContextProvider] that provides quorum details required to verify the proof. + /// + /// # Returns + /// + /// * `Ok(Some(object, metadata))` when the requested object was found in the proof. + /// * `Err(Error::DocumentMissingInProof)` when the requested object was not found in the proof. + /// * `Err(Error)` when either the provided data is invalid or proof validation failed. + fn from_proof_with_metadata<'a, I: Into, O: Into>( + request: I, + response: O, + platform_version: &PlatformVersion, + provider: &'a dyn ContextProvider, + ) -> Result<(Self, ResponseMetadata), Error> + where + Self: Sized + 'a, + { + let (main_item, response_metadata) = + Self::maybe_from_proof_with_metadata(request, response, platform_version, provider)?; + Ok((main_item.ok_or(Error::NotFound)?, response_metadata)) + } } impl FromProof for Identity { @@ -1145,6 +1186,85 @@ where } } +impl FromProof for IdentitiesContractKeys { + type Request = platform::GetIdentitiesContractKeysRequest; + type Response = platform::GetIdentitiesContractKeysResponse; + + fn maybe_from_proof_with_metadata<'a, I: Into, O: Into>( + request: I, + response: O, + platform_version: &PlatformVersion, + + provider: &'a dyn ContextProvider, + ) -> Result<(Option, ResponseMetadata), Error> + where + Self: 'a, + { + let request: Self::Request = request.into(); + let response: Self::Response = response.into(); + + // Parse response to read proof and metadata + let proof = response.proof().or(Err(Error::NoProofInResult))?; + + let mtd = response.metadata().or(Err(Error::EmptyResponseMetadata))?; + + let (identities_ids, contract_id, document_type_name, purposes) = + match request.version.ok_or(Error::EmptyVersion)? { + get_identities_contract_keys_request::Version::V0(v0) => { + let GetIdentitiesContractKeysRequestV0 { + identities_ids, + contract_id, + document_type_name, + purposes, + prove, + } = v0; + let identifiers = identities_ids + .into_iter() + .map(|identity_id_vec| { + let identifier = Identifier::from_vec(identity_id_vec)?; + Ok(identifier.to_buffer()) + }) + .collect::, platform_value::Error>>() + .map_err(|e| Error::ProtocolError { + error: e.to_string(), + })?; + let contract_id = Identifier::from_vec(contract_id) + .map_err(|e| Error::ProtocolError { + error: e.to_string(), + })? + .into_buffer(); + let purposes = purposes + .into_iter() + .map(|purpose| { + Purpose::try_from(purpose).map_err(|e| Error::ProtocolError { + error: e.to_string(), + }) + }) + .collect::, Error>>()?; + (identifiers, contract_id, document_type_name, purposes) + } + }; + + // Extract content from proof and verify Drive/GroveDB proofs + let (root_hash, identities_contract_keys) = Drive::verify_identities_contract_keys( + &proof.grovedb_proof, + identities_ids.as_slice(), + &contract_id, + document_type_name, + purposes, + false, + platform_version, + ) + .map_err(|e| Error::DriveError { + error: e.to_string(), + })?; + + verify_tenderdash_proof(proof, mtd, &root_hash, provider)?; + + Ok((Some(identities_contract_keys), mtd.clone())) + } +} + /// Convert u32, if 0 return None, otherwise return Some(u16). /// Errors when value is out of range. fn u32_to_u16_opt(i: u32) -> Result, Error> { diff --git a/packages/rs-drive/Cargo.toml b/packages/rs-drive/Cargo.toml index dedd037575..0c1cb49d73 100644 --- a/packages/rs-drive/Cargo.toml +++ b/packages/rs-drive/Cargo.toml @@ -29,6 +29,7 @@ dpp = { path = "../rs-dpp", features = ["state-transitions"], default-features = thiserror = { version = "1.0.59" } tracing = { version = "0.1.37", default-features = false, features = [] } derive_more = { version = "0.99.17", optional = true} +hex = { version = "0.4.3" } # optional dependencies parking_lot = { version = "0.12.1", optional = true } @@ -39,16 +40,15 @@ rand = { version = "0.8.4", features = ["small_rng"], optional = true } moka = { version = "0.11.1", features = ["future", "futures-util"], optional = true } bs58 = { version = "0.5.0", optional = true } base64 = { version = "0.21.0", optional = true } -hex = { version = "0.4.3", optional = true } tempfile = { version = "3", optional = true } enum-map = { version = "2.0.3", optional = true } intmap = { version = "2.0.0", features = ["serde"], optional = true } chrono = { version = "0.4.35", optional = true } itertools = { version = "0.11.0", optional = true } -grovedb = { git = "https://github.com/dashpay/grovedb", rev = "941dd86d70c86e7a236541919e789dba078abae6", optional = true, default-features = false } -grovedb-costs = { git = "https://github.com/dashpay/grovedb", rev = "941dd86d70c86e7a236541919e789dba078abae6", optional = true } -grovedb-path = { git = "https://github.com/dashpay/grovedb", rev = "941dd86d70c86e7a236541919e789dba078abae6" } -grovedb-storage = { git = "https://github.com/dashpay/grovedb", rev = "941dd86d70c86e7a236541919e789dba078abae6", optional = true } +grovedb = { git = "https://github.com/dashpay/grovedb", rev = "d9292aa20bd8f3bda7c5d25d62db06ac341b0677", optional = true, default-features = false } +grovedb-costs = { git = "https://github.com/dashpay/grovedb", rev = "d9292aa20bd8f3bda7c5d25d62db06ac341b0677", optional = true } +grovedb-path = { git = "https://github.com/dashpay/grovedb", rev = "d9292aa20bd8f3bda7c5d25d62db06ac341b0677" } +grovedb-storage = { git = "https://github.com/dashpay/grovedb", rev = "d9292aa20bd8f3bda7c5d25d62db06ac341b0677", optional = true } [dev-dependencies] criterion = "0.3.5" @@ -92,7 +92,6 @@ server = [ "grovedb-costs", "itertools", "rand", #todo: this should be removed eventually - "hex", "derive_more", "enum-map", "intmap", diff --git a/packages/rs-drive/src/drive/credit_pools/epochs/proposers/get_epoch_proposers/v0/mod.rs b/packages/rs-drive/src/drive/credit_pools/epochs/proposers/get_epoch_proposers/v0/mod.rs index 4646c4630c..3c6a860a21 100644 --- a/packages/rs-drive/src/drive/credit_pools/epochs/proposers/get_epoch_proposers/v0/mod.rs +++ b/packages/rs-drive/src/drive/credit_pools/epochs/proposers/get_epoch_proposers/v0/mod.rs @@ -28,6 +28,7 @@ impl Drive { &path_query, transaction.is_some(), true, + true, QueryKeyElementPairResultType, transaction, ) diff --git a/packages/rs-drive/src/drive/credit_pools/epochs/start_block/get_first_epoch_start_block_info_between_epochs/v0/mod.rs b/packages/rs-drive/src/drive/credit_pools/epochs/start_block/get_first_epoch_start_block_info_between_epochs/v0/mod.rs index c65d9a06b4..6fd0d084e5 100644 --- a/packages/rs-drive/src/drive/credit_pools/epochs/start_block/get_first_epoch_start_block_info_between_epochs/v0/mod.rs +++ b/packages/rs-drive/src/drive/credit_pools/epochs/start_block/get_first_epoch_start_block_info_between_epochs/v0/mod.rs @@ -45,6 +45,7 @@ impl Drive { &path_query, transaction.is_some(), false, //set to false on purpose + true, QueryPathKeyElementTrioResultType, transaction, ) diff --git a/packages/rs-drive/src/drive/credit_pools/mod.rs b/packages/rs-drive/src/drive/credit_pools/mod.rs index 8144fade30..f166005da6 100644 --- a/packages/rs-drive/src/drive/credit_pools/mod.rs +++ b/packages/rs-drive/src/drive/credit_pools/mod.rs @@ -126,6 +126,7 @@ impl Drive { &PathQuery::new_unsized(pools_vec_path(), epochs_query), transaction.is_some(), true, + true, QueryResultType::QueryElementResultType, transaction, ) diff --git a/packages/rs-drive/src/drive/credit_pools/pending_epoch_refunds/methods/add_delete_pending_epoch_refunds_except_specified/v0/mod.rs b/packages/rs-drive/src/drive/credit_pools/pending_epoch_refunds/methods/add_delete_pending_epoch_refunds_except_specified/v0/mod.rs index 98b63f3738..410a89920e 100644 --- a/packages/rs-drive/src/drive/credit_pools/pending_epoch_refunds/methods/add_delete_pending_epoch_refunds_except_specified/v0/mod.rs +++ b/packages/rs-drive/src/drive/credit_pools/pending_epoch_refunds/methods/add_delete_pending_epoch_refunds_except_specified/v0/mod.rs @@ -29,6 +29,7 @@ impl Drive { &PathQuery::new_unsized(pending_epoch_refunds_path_vec(), query), transaction.is_some(), true, + true, QueryResultType::QueryKeyElementPairResultType, transaction, ) diff --git a/packages/rs-drive/src/drive/credit_pools/pending_epoch_refunds/methods/fetch_and_add_pending_epoch_refunds_to_collection/v0/mod.rs b/packages/rs-drive/src/drive/credit_pools/pending_epoch_refunds/methods/fetch_and_add_pending_epoch_refunds_to_collection/v0/mod.rs index 9c6245aa1c..be751238ed 100644 --- a/packages/rs-drive/src/drive/credit_pools/pending_epoch_refunds/methods/fetch_and_add_pending_epoch_refunds_to_collection/v0/mod.rs +++ b/packages/rs-drive/src/drive/credit_pools/pending_epoch_refunds/methods/fetch_and_add_pending_epoch_refunds_to_collection/v0/mod.rs @@ -36,6 +36,7 @@ impl Drive { &PathQuery::new_unsized(pending_epoch_refunds_path_vec(), query), transaction.is_some(), true, + true, QueryResultType::QueryKeyElementPairResultType, transaction, ) diff --git a/packages/rs-drive/src/drive/credit_pools/pending_epoch_refunds/methods/fetch_pending_epoch_refunds/v0/mod.rs b/packages/rs-drive/src/drive/credit_pools/pending_epoch_refunds/methods/fetch_pending_epoch_refunds/v0/mod.rs index 64419b3205..c5a4cee27c 100644 --- a/packages/rs-drive/src/drive/credit_pools/pending_epoch_refunds/methods/fetch_pending_epoch_refunds/v0/mod.rs +++ b/packages/rs-drive/src/drive/credit_pools/pending_epoch_refunds/methods/fetch_pending_epoch_refunds/v0/mod.rs @@ -24,6 +24,7 @@ impl Drive { &PathQuery::new_unsized(pending_epoch_refunds_path_vec(), query), transaction.is_some(), true, + true, QueryResultType::QueryKeyElementPairResultType, transaction, ) diff --git a/packages/rs-drive/src/drive/grove_operations/grove_get_path_query/v0/mod.rs b/packages/rs-drive/src/drive/grove_operations/grove_get_path_query/v0/mod.rs index 1b26fca1fa..766295859c 100644 --- a/packages/rs-drive/src/drive/grove_operations/grove_get_path_query/v0/mod.rs +++ b/packages/rs-drive/src/drive/grove_operations/grove_get_path_query/v0/mod.rs @@ -20,6 +20,7 @@ impl Drive { path_query, transaction.is_some(), true, + false, result_type, transaction, ); diff --git a/packages/rs-drive/src/drive/grove_operations/grove_get_path_query_serialized_results/v0/mod.rs b/packages/rs-drive/src/drive/grove_operations/grove_get_path_query_serialized_results/v0/mod.rs index c99e84e0ea..dbe04090e9 100644 --- a/packages/rs-drive/src/drive/grove_operations/grove_get_path_query_serialized_results/v0/mod.rs +++ b/packages/rs-drive/src/drive/grove_operations/grove_get_path_query_serialized_results/v0/mod.rs @@ -16,7 +16,7 @@ impl Drive { ) -> Result<(Vec>, u16), Error> { let CostContext { value, cost } = self.grove - .query_item_value(path_query, transaction.is_some(), true, transaction); + .query_item_value(path_query, transaction.is_some(), true, true, transaction); drive_operations.push(CalculatedCostOperation(cost)); value.map_err(Error::GroveDB) } diff --git a/packages/rs-drive/src/drive/grove_operations/grove_get_path_query_with_optional/v0/mod.rs b/packages/rs-drive/src/drive/grove_operations/grove_get_path_query_with_optional/v0/mod.rs index c456f8b611..aa960ff97e 100644 --- a/packages/rs-drive/src/drive/grove_operations/grove_get_path_query_with_optional/v0/mod.rs +++ b/packages/rs-drive/src/drive/grove_operations/grove_get_path_query_with_optional/v0/mod.rs @@ -17,7 +17,7 @@ impl Drive { ) -> Result, Error> { let CostContext { value, cost } = self.grove - .query_keys_optional(path_query, true, true, transaction); + .query_keys_optional(path_query, true, true, true, transaction); drive_operations.push(CalculatedCostOperation(cost)); value.map_err(Error::GroveDB) } diff --git a/packages/rs-drive/src/drive/grove_operations/grove_get_raw_path_query/v0/mod.rs b/packages/rs-drive/src/drive/grove_operations/grove_get_raw_path_query/v0/mod.rs index 7293183a99..baede8095a 100644 --- a/packages/rs-drive/src/drive/grove_operations/grove_get_raw_path_query/v0/mod.rs +++ b/packages/rs-drive/src/drive/grove_operations/grove_get_raw_path_query/v0/mod.rs @@ -20,6 +20,7 @@ impl Drive { path_query, transaction.is_some(), true, + true, result_type, transaction, ); diff --git a/packages/rs-drive/src/drive/grove_operations/grove_get_raw_path_query_with_optional/v0/mod.rs b/packages/rs-drive/src/drive/grove_operations/grove_get_raw_path_query_with_optional/v0/mod.rs index a76ed04f39..f285d941a8 100644 --- a/packages/rs-drive/src/drive/grove_operations/grove_get_raw_path_query_with_optional/v0/mod.rs +++ b/packages/rs-drive/src/drive/grove_operations/grove_get_raw_path_query_with_optional/v0/mod.rs @@ -17,7 +17,7 @@ impl Drive { ) -> Result, Error> { let CostContext { value, cost } = self.grove - .query_raw_keys_optional(path_query, true, true, transaction); + .query_raw_keys_optional(path_query, true, true, true, transaction); drive_operations.push(CalculatedCostOperation(cost)); value.map_err(Error::GroveDB) } diff --git a/packages/rs-drive/src/drive/identity/contract_info/keys/add_potential_contract_info_for_contract_bounded_key/v0/mod.rs b/packages/rs-drive/src/drive/identity/contract_info/keys/add_potential_contract_info_for_contract_bounded_key/v0/mod.rs index 3fe34a2f10..b43ee22d05 100644 --- a/packages/rs-drive/src/drive/identity/contract_info/keys/add_potential_contract_info_for_contract_bounded_key/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/contract_info/keys/add_potential_contract_info_for_contract_bounded_key/v0/mod.rs @@ -30,6 +30,7 @@ use integer_encoding::VarInt; use std::collections::HashMap; impl Drive { + #[inline(always)] pub(in crate::drive::identity::contract_info) fn add_potential_contract_info_for_contract_bounded_key_v0( &self, identity_id: [u8; 32], @@ -244,7 +245,7 @@ impl Drive { .requires_identity_encryption_bounded_key() .ok_or(Error::DataContract( DataContractError::KeyBoundsExpectedButNotPresent( - "expected encryption key bounds", + "expected encryption key bounds for encryption", ), ))?; Ok(encryption_storage_key_requirements) @@ -256,7 +257,7 @@ impl Drive { .requires_identity_decryption_bounded_key() .ok_or(Error::DataContract( DataContractError::KeyBoundsExpectedButNotPresent( - "expected encryption key bounds", + "expected encryption key bounds for decryption", ), ))?; Ok(decryption_storage_key_requirements) diff --git a/packages/rs-drive/src/drive/identity/fetch/contract_keys/mod.rs b/packages/rs-drive/src/drive/identity/fetch/contract_keys/mod.rs new file mode 100644 index 0000000000..20f41d6507 --- /dev/null +++ b/packages/rs-drive/src/drive/identity/fetch/contract_keys/mod.rs @@ -0,0 +1,62 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use std::collections::BTreeMap; + +use dpp::identifier::Identifier; +use dpp::identity::Purpose; +use grovedb::TransactionArg; +use platform_version::version::PlatformVersion; + +impl Drive { + /// Fetches identities contract keys given identity ids, contract id, optional document type name and purposes + /// + /// This function uses the versioning system to call the appropriate handler based on the provided `DriveVersion`. + /// + /// # Arguments + /// + /// * `identity_ids` - The slice of identity ids to prove + /// * `contract_id` - The contract id + /// * `document_type_name` - The optional document type name + /// * `purposes` - Key purposes + /// * `transaction` - Transaction arguments. + /// * `drive_version` - A reference to the drive version. + /// + /// # Returns + /// + /// Returns a `Result` containing a map with keys per purpose per identity id, otherwise an `Error` if the operation fails or the version is not supported. + pub fn fetch_identities_contract_keys( + &self, + identity_ids: &[[u8; 32]], + contract_id: &[u8; 32], + document_type_name: Option, + purposes: Vec, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result>>, Error> { + match platform_version + .drive + .methods + .identity + .keys + .fetch + .fetch_identities_contract_keys + { + 0 => self.fetch_identities_contract_keys_v0( + identity_ids, + contract_id, + document_type_name, + purposes, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "fetch_identities_contract_keys".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/identity/fetch/contract_keys/v0/mod.rs b/packages/rs-drive/src/drive/identity/fetch/contract_keys/v0/mod.rs new file mode 100644 index 0000000000..11cbfc5678 --- /dev/null +++ b/packages/rs-drive/src/drive/identity/fetch/contract_keys/v0/mod.rs @@ -0,0 +1,130 @@ +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fee::op::LowLevelDriveOperation; +use dpp::identity::Purpose; +use dpp::prelude::Identifier; +use grovedb::query_result_type::QueryResultType; +use grovedb::TransactionArg; +use platform_version::version::PlatformVersion; +use std::collections::BTreeMap; + +impl Drive { + /// Fetches identities keys bound to specified contract + pub(super) fn fetch_identities_contract_keys_v0( + &self, + identity_ids: &[[u8; 32]], + contract_id: &[u8; 32], + document_type_name: Option, + purposes: Vec, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result>>, Error> { + // let contract = &self.get_contract_with_fetch_info( + // *contract_id, + // false, + // transaction, + // platform_version, + // )?.ok_or(Error::Query(QuerySyntaxError::DataContractNotFound("Contract not found for get_identities_contract_keys")))?.contract; + + // let (requires_encryption, requires_decryption) = + // if let Some(document_type_name) = document_type_name { + // let document_type = contract.document_type_for_name(&document_type_name)?; + // ( + // document_type.requires_identity_encryption_bounded_key(), + // document_type.requires_identity_decryption_bounded_key() + // ) + // } else { + // ( + // contract.config().requires_identity_encryption_bounded_key(), + // contract.config().requires_identity_decryption_bounded_key(), + // ) + // }; + + // let purpose_to_storage_requirements = purposes + // .into_iter() + // .map(|purpose| { + // let requirements = if purpose == Purpose::ENCRYPTION { + // requires_encryption.ok_or(Error::DataContract(DataContractError::KeyBoundsExpectedButNotPresent( + // "expected an encryption key" + // ))) + // } else if purpose == Purpose::DECRYPTION { + // requires_decryption.ok_or(Error::DataContract(DataContractError::KeyBoundsExpectedButNotPresent( + // "expected a decryption key" + // ))) + // } else { + // Err( + // Error::Query( + // QuerySyntaxError::InvalidKeyParameter( + // "expected an encryption or decryption key".to_string() + // ) + // ) + // ) + // }?; + // + // Ok((purpose, requirements)) + // }) + // .collect::, Error>>()?; + + let mut drive_operations: Vec = vec![]; + + let query = Self::identities_contract_keys_query( + identity_ids, + contract_id, + &document_type_name, + &purposes, + Some((identity_ids.len() * purposes.len()) as u16), + ); + + let result = self + .grove_get_path_query( + &query, + transaction, + QueryResultType::QueryPathKeyElementTrioResultType, + &mut drive_operations, + &platform_version.drive, + )? + .0 + .to_path_key_elements(); + + let mut partial_identities = BTreeMap::new(); + + for (path, _, element) in result { + if let Some(identity_id_bytes) = path.get(1) { + let identity_id = Identifier::from_vec(identity_id_bytes.to_owned())?; + // We can use expect here because we have already shown that the path must have + // at least 2 sub parts as we get index 1 + let purpose_bytes = path.last().expect("last path element is the purpose"); + if purpose_bytes.len() != 1 { + return Err(Error::Drive(DriveError::CorruptedDriveState(format!( + "purpose for identifier {} at path {} is {}, should be 1 byte", + identity_id, + path.iter().map(hex::encode).collect::>().join("/"), + hex::encode(purpose_bytes) + )))); + } + + let purpose_first_byte = purpose_bytes + .first() + .expect("we have already shown there is 1 byte"); + + let purpose = Purpose::try_from(*purpose_first_byte).map_err(|e| { + Error::Drive(DriveError::CorruptedDriveState(format!( + "purpose for identifier {} at path {} has error : {}", + identity_id, + path.iter().map(hex::encode).collect::>().join("/"), + e + ))) + })?; + + let entry = partial_identities + .entry(identity_id) + .or_insert(BTreeMap::new()); + + entry.insert(purpose, element.into_item_bytes()?); + } + } + + Ok(partial_identities) + } +} diff --git a/packages/rs-drive/src/drive/identity/fetch/mod.rs b/packages/rs-drive/src/drive/identity/fetch/mod.rs index e3231f04ac..0d484effe8 100644 --- a/packages/rs-drive/src/drive/identity/fetch/mod.rs +++ b/packages/rs-drive/src/drive/identity/fetch/mod.rs @@ -35,6 +35,8 @@ use std::collections::BTreeMap; #[cfg(feature = "server")] mod balance; #[cfg(feature = "server")] +mod contract_keys; +#[cfg(feature = "server")] mod fetch_by_public_key_hashes; #[cfg(feature = "server")] mod full_identity; @@ -87,7 +89,14 @@ impl Drive { }; let (result_items, _) = self .grove - .query_raw(&path_query, true, true, QueryElementResultType, transaction) + .query_raw( + &path_query, + true, + true, + true, + QueryElementResultType, + transaction, + ) .unwrap() .map_err(Error::GroveDB)?; @@ -119,6 +128,7 @@ impl Drive { &path_query, true, true, + true, QueryKeyElementPairResultType, transaction, ) diff --git a/packages/rs-drive/src/drive/identity/fetch/prove/mod.rs b/packages/rs-drive/src/drive/identity/fetch/prove/mod.rs index 1efdd47e5d..b095b6bf42 100644 --- a/packages/rs-drive/src/drive/identity/fetch/prove/mod.rs +++ b/packages/rs-drive/src/drive/identity/fetch/prove/mod.rs @@ -2,5 +2,6 @@ mod prove_full_identities; mod prove_full_identities_by_unique_public_key_hashes; mod prove_full_identity; mod prove_full_identity_by_unique_public_key_hash; +mod prove_identities_contract_keys; mod prove_identity_id_by_unique_public_key_hash; mod prove_identity_ids_by_unique_public_key_hashes; diff --git a/packages/rs-drive/src/drive/identity/fetch/prove/prove_full_identities/v0/mod.rs b/packages/rs-drive/src/drive/identity/fetch/prove/prove_full_identities/v0/mod.rs index 36c6e2fe50..d7e309eb1b 100644 --- a/packages/rs-drive/src/drive/identity/fetch/prove/prove_full_identities/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/fetch/prove/prove_full_identities/v0/mod.rs @@ -82,6 +82,7 @@ mod tests { &path_query, true, true, + true, QueryResultType::QueryPathKeyElementTrioResultType, None, ) @@ -250,6 +251,7 @@ mod tests { &path_query, true, true, + true, QueryResultType::QueryPathKeyElementTrioResultType, None, ) diff --git a/packages/rs-drive/src/drive/identity/fetch/prove/prove_full_identity/v0/mod.rs b/packages/rs-drive/src/drive/identity/fetch/prove/prove_full_identity/v0/mod.rs index 5c0fa1fb84..90d1e31076 100644 --- a/packages/rs-drive/src/drive/identity/fetch/prove/prove_full_identity/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/fetch/prove/prove_full_identity/v0/mod.rs @@ -147,6 +147,7 @@ mod tests { &path_query, true, true, + true, QueryResultType::QueryPathKeyElementTrioResultType, None, ) diff --git a/packages/rs-drive/src/drive/identity/fetch/prove/prove_identities_contract_keys/mod.rs b/packages/rs-drive/src/drive/identity/fetch/prove/prove_identities_contract_keys/mod.rs new file mode 100644 index 0000000000..7556fca425 --- /dev/null +++ b/packages/rs-drive/src/drive/identity/fetch/prove/prove_identities_contract_keys/mod.rs @@ -0,0 +1,58 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; + +use dpp::identity::Purpose; +use dpp::version::drive_versions::DriveVersion; +use grovedb::TransactionArg; + +impl Drive { + /// Proves identities contract keys given identity ids, contract id, optional document type name and purposes + /// + /// This function uses the versioning system to call the appropriate handler based on the provided `DriveVersion`. + /// + /// # Arguments + /// + /// * `identity_ids` - The slice of identity ids to prove + /// * `contract_id` - The contract id + /// * `document_type_name` - The optional document type name + /// * `purposes` - Key purposes + /// * `transaction` - Transaction arguments. + /// * `drive_version` - A reference to the drive version. + /// + /// # Returns + /// + /// Returns a `Result` containing a vector of bytes representing the proved identities keys bound to specified contract, otherwise an `Error` if the operation fails or the version is not supported. + pub fn prove_identities_contract_keys( + &self, + identity_ids: &[[u8; 32]], + contract_id: &[u8; 32], + document_type_name: Option, + purposes: Vec, + transaction: TransactionArg, + drive_version: &DriveVersion, + ) -> Result, Error> { + match drive_version + .methods + .identity + .prove + .identities_contract_keys + { + 0 => self.prove_identities_contract_keys_v0( + identity_ids, + contract_id, + document_type_name, + purposes, + transaction, + drive_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "prove_identities_contract_keys".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/identity/fetch/prove/prove_identities_contract_keys/v0/mod.rs b/packages/rs-drive/src/drive/identity/fetch/prove/prove_identities_contract_keys/v0/mod.rs new file mode 100644 index 0000000000..d877c94fe2 --- /dev/null +++ b/packages/rs-drive/src/drive/identity/fetch/prove/prove_identities_contract_keys/v0/mod.rs @@ -0,0 +1,36 @@ +use crate::drive::Drive; +use crate::error::Error; +use crate::fee::op::LowLevelDriveOperation; +use dpp::identity::Purpose; +use dpp::version::drive_versions::DriveVersion; +use grovedb::TransactionArg; + +impl Drive { + /// Proves identities keys bound to specified contract + #[inline(always)] + pub(super) fn prove_identities_contract_keys_v0( + &self, + identity_ids: &[[u8; 32]], + contract_id: &[u8; 32], + document_type_name: Option, + purposes: Vec, + transaction: TransactionArg, + drive_version: &DriveVersion, + ) -> Result, Error> { + let mut drive_operations: Vec = vec![]; + let query = Self::identities_contract_keys_query( + identity_ids, + contract_id, + &document_type_name, + &purposes, + Some((identity_ids.len() * purposes.len()) as u16), + ); + self.grove_get_proved_path_query( + &query, + false, + transaction, + &mut drive_operations, + drive_version, + ) + } +} diff --git a/packages/rs-drive/src/drive/identity/fetch/queries/mod.rs b/packages/rs-drive/src/drive/identity/fetch/queries/mod.rs index d4120d07ce..5fc73dc640 100644 --- a/packages/rs-drive/src/drive/identity/fetch/queries/mod.rs +++ b/packages/rs-drive/src/drive/identity/fetch/queries/mod.rs @@ -1,13 +1,18 @@ use crate::drive::balances::balance_path_vec; use crate::drive::identity::key::fetch::IdentityKeysRequest; -use crate::drive::{unique_key_hashes_tree_path_vec, Drive}; +use crate::drive::{identity_tree_path_vec, unique_key_hashes_tree_path_vec, Drive}; use crate::error::Error; +use crate::drive::identity::contract_info::ContractInfoStructure; use crate::drive::identity::contract_info::ContractInfoStructure::IdentityContractNonceKey; use crate::drive::identity::IdentityRootStructure::{IdentityTreeNonce, IdentityTreeRevision}; -use crate::drive::identity::{identity_contract_info_group_path_vec, identity_path_vec}; +use crate::drive::identity::{ + identity_contract_info_group_path_vec, identity_path_vec, IdentityRootStructure, +}; use crate::error::query::QuerySyntaxError; +use dpp::identity::Purpose; +use grovedb::query_result_type::Key; use grovedb::{PathQuery, Query, SizedQuery}; /// An enumeration representing the types of identity prove requests. @@ -177,6 +182,99 @@ impl Drive { } } + /// The query for the identity contract bounded keys for multiple identities + pub fn identities_contract_keys_query( + identity_ids: &[[u8; 32]], + contract_id: &[u8; 32], + document_type_name: &Option, + purposes: &[Purpose], + limit: Option, + ) -> PathQuery { + let identities_path = identity_tree_path_vec(); + let mut query = Query::new(); + query.insert_keys( + identity_ids + .iter() + .map(|identity_id| identity_id.to_vec()) + .collect(), + ); + + let mut group_id = contract_id.to_vec(); + if let Some(document_type_name) = document_type_name { + group_id.extend(document_type_name.as_bytes()); + } + + query.default_subquery_branch.subquery_path = Some(vec![ + vec![IdentityRootStructure::IdentityContractInfo as u8], + group_id, + vec![ContractInfoStructure::ContractInfoKeysKey as u8], + ]); + + let mut sub_query = Query::new(); + + sub_query.insert_keys( + purposes + .iter() + .map(|purpose| vec![*purpose as u8]) + .collect(), + ); + + sub_query.set_subquery_key(Key::new()); + + query.default_subquery_branch.subquery = Some(sub_query.into()); + PathQuery { + path: identities_path, + query: SizedQuery { + query, + limit, + offset: None, + }, + } + } + + /// The query for the identity contract document type bounded keys for multiple identities + pub fn identities_contract_document_type_keys_query( + identity_ids: &[[u8; 32]], + contract_id: [u8; 32], + document_type_name: &str, + purposes: Vec, + ) -> PathQuery { + let identities_path = identity_tree_path_vec(); + let mut query = Query::new(); + query.insert_keys( + identity_ids + .iter() + .map(|identity_id| identity_id.to_vec()) + .collect(), + ); + let mut group_id = contract_id.to_vec(); + group_id.extend(document_type_name.as_bytes()); + query.default_subquery_branch.subquery_path = Some(vec![ + vec![IdentityRootStructure::IdentityContractInfo as u8], + contract_id.to_vec(), + vec![ContractInfoStructure::ContractInfoKeysKey as u8], + ]); + + let mut sub_query = Query::new(); + + sub_query.insert_keys( + purposes + .into_iter() + .map(|purpose| vec![purpose as u8]) + .collect(), + ); + + query.default_subquery_branch.subquery = Some(sub_query.into()); + PathQuery { + path: identities_path, + query: SizedQuery { + query, + limit: None, + offset: None, + }, + } + } + /// The query for proving the identities balance from an identity id. pub fn balance_for_identity_id_query(identity_id: [u8; 32]) -> PathQuery { let balance_path = balance_path_vec(); diff --git a/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/dequeue_untied_withdrawal_transactions/v0/mod.rs b/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/dequeue_untied_withdrawal_transactions/v0/mod.rs index 6de788887d..fd5fa5e1af 100644 --- a/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/dequeue_untied_withdrawal_transactions/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/withdrawals/transaction/queue/dequeue_untied_withdrawal_transactions/v0/mod.rs @@ -39,6 +39,7 @@ impl Drive { &path_query, transaction.is_some(), true, + true, QueryResultType::QueryKeyElementPairResultType, transaction, ) diff --git a/packages/rs-drive/src/drive/mod.rs b/packages/rs-drive/src/drive/mod.rs index bcd46bce32..b37399d3c3 100644 --- a/packages/rs-drive/src/drive/mod.rs +++ b/packages/rs-drive/src/drive/mod.rs @@ -195,6 +195,12 @@ pub(crate) fn identity_tree_path() -> [&'static [u8]; 1] { [Into::<&[u8; 1]>::into(RootTree::Identities)] } +/// Returns the path to the identities as a vec +#[cfg(any(feature = "server", feature = "verify"))] +pub(crate) fn identity_tree_path_vec() -> Vec> { + vec![vec![RootTree::Identities as u8]] +} + /// Returns the path to the key hashes. #[cfg(feature = "server")] pub(crate) fn unique_key_hashes_tree_path() -> [&'static [u8]; 1] { diff --git a/packages/rs-drive/src/drive/verify/identity/mod.rs b/packages/rs-drive/src/drive/verify/identity/mod.rs index 05d2d9d2b3..dd24b00f67 100644 --- a/packages/rs-drive/src/drive/verify/identity/mod.rs +++ b/packages/rs-drive/src/drive/verify/identity/mod.rs @@ -1,6 +1,7 @@ mod verify_full_identities_by_public_key_hashes; mod verify_full_identity_by_identity_id; mod verify_full_identity_by_public_key_hash; +mod verify_identities_contract_keys; mod verify_identity_balance_and_revision_for_identity_id; mod verify_identity_balance_for_identity_id; mod verify_identity_balances_for_identity_ids; diff --git a/packages/rs-drive/src/drive/verify/identity/verify_identities_contract_keys/mod.rs b/packages/rs-drive/src/drive/verify/identity/verify_identities_contract_keys/mod.rs new file mode 100644 index 0000000000..3a41777b7f --- /dev/null +++ b/packages/rs-drive/src/drive/verify/identity/verify_identities_contract_keys/mod.rs @@ -0,0 +1,71 @@ +mod v0; + +use crate::drive::Drive; + +use crate::error::drive::DriveError; + +use crate::error::Error; + +use crate::drive::verify::RootHash; + +use dpp::identity::identities_contract_keys::IdentitiesContractKeys; +use dpp::identity::Purpose; + +use dpp::version::PlatformVersion; + +impl Drive { + /// Verifies the identity keys of a user by their identity ID. + /// + /// # Parameters + /// + /// - `proof`: A byte slice representing the proof of authentication from the user. + /// - `is_proof_subset`: A boolean indicating whether the proof is a subset. + /// - `identity_id`: A 32-byte array representing the identity ID of the user. + /// - `platform_version`: The platform version against which to verify the identity keys. + /// + /// # Returns + /// + /// If the verification is successful, it returns a `Result` with a tuple of `RootHash` and + /// an `Option` of `PartialIdentity`. The `RootHash` represents the root hash of GroveDB, + /// and the `Option` represents the partial identity of the user if it exists. + /// + /// # Errors + /// + /// Returns an `Error` if: + /// + /// - An unknown or unsupported platform version is provided. + /// - Any other error as documented in the specific versioned function. + /// + pub fn verify_identities_contract_keys( + proof: &[u8], + identity_ids: &[[u8; 32]], + contract_id: &[u8; 32], + document_type_name: Option, + purposes: Vec, + is_proof_subset: bool, + platform_version: &PlatformVersion, + ) -> Result<(RootHash, IdentitiesContractKeys), Error> { + match platform_version + .drive + .methods + .verify + .identity + .verify_identities_contract_keys + { + 0 => Self::verify_identities_contract_keys_v0( + proof, + identity_ids, + contract_id, + document_type_name, + purposes, + is_proof_subset, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "verify_identities_contract_keys".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/verify/identity/verify_identities_contract_keys/v0/mod.rs b/packages/rs-drive/src/drive/verify/identity/verify_identities_contract_keys/v0/mod.rs new file mode 100644 index 0000000000..2076771fad --- /dev/null +++ b/packages/rs-drive/src/drive/verify/identity/verify_identities_contract_keys/v0/mod.rs @@ -0,0 +1,115 @@ +use crate::drive::Drive; + +use crate::error::Error; + +use crate::drive::verify::RootHash; +use dpp::identifier::Identifier; +use dpp::identity::{IdentityPublicKey, Purpose}; + +use crate::error::drive::DriveError; +use dpp::identity::identities_contract_keys::IdentitiesContractKeys; +use dpp::serialization::PlatformDeserializable; +use dpp::version::PlatformVersion; +use grovedb::GroveDb; +use std::collections::BTreeMap; + +impl Drive { + /// Verifies the identity keys of a user by their identity ID. + /// + /// # Parameters + /// + /// - `proof`: A byte slice representing the proof of authentication from the user. + /// - `is_proof_subset`: A boolean indicating whether the proof is a subset. + /// - `identity_id`: A 32-byte array representing the identity ID of the user. + /// + /// # Returns + /// + /// If the verification is successful, it returns a `Result` with a tuple of `RootHash` and + /// an `Option` of `PartialIdentity`. The `RootHash` represents the root hash of GroveDB, + /// and the `Option` represents the partial identity of the user if it exists. + /// + /// # Errors + /// + /// Returns an `Error` if: + /// + /// - The proof of authentication is not valid. + /// - The identity ID does not correspond to a valid partial identity. + /// - The keys information is missing or incorrect. + /// + #[inline(always)] + pub(super) fn verify_identities_contract_keys_v0( + proof: &[u8], + identity_ids: &[[u8; 32]], + contract_id: &[u8; 32], + document_type_name: Option, + purposes: Vec, + is_proof_subset: bool, + _platform_version: &PlatformVersion, + ) -> Result<(RootHash, IdentitiesContractKeys), Error> { + let path_query = Self::identities_contract_keys_query( + identity_ids, + contract_id, + &document_type_name, + &purposes, + Some((identity_ids.len() * purposes.len()) as u16), + ); + + let (root_hash, proved_values) = if is_proof_subset { + GroveDb::verify_subset_query_with_absence_proof(proof, &path_query)? + } else { + GroveDb::verify_query_with_absence_proof(proof, &path_query)? + }; + + let mut group_id = contract_id.to_vec(); + if let Some(document_type_name) = document_type_name { + group_id.extend(document_type_name.as_bytes()); + } + + let mut values = BTreeMap::new(); + + for (path, _, maybe_element) in proved_values { + if let Some(identity_id_bytes) = path.get(1) { + let identity_id = Identifier::from_vec(identity_id_bytes.to_owned())?; + // We can use expect here because we have already shown that the path must have + // at least 2 sub parts as we get index 1 + let purpose_bytes = path.last().expect("last path element is the purpose"); + if purpose_bytes.len() != 1 { + return Err(Error::Drive(DriveError::CorruptedDriveState(format!( + "purpose for identifier {} at path {} is {}, should be 1 byte", + identity_id, + path.iter().map(hex::encode).collect::>().join("/"), + hex::encode(purpose_bytes) + )))); + } + + let purpose_first_byte = purpose_bytes + .first() + .expect("we have already shown there is 1 byte"); + + let purpose = Purpose::try_from(*purpose_first_byte).map_err(|e| { + Error::Drive(DriveError::CorruptedDriveState(format!( + "purpose for identifier {} at path {} has error : {}", + identity_id, + path.iter().map(hex::encode).collect::>().join("/"), + e + ))) + })?; + + let entry = values.entry(identity_id).or_insert(BTreeMap::new()); + + let maybe_item_bytes = maybe_element + .as_ref() + .map(|element| element.as_item_bytes()) + .transpose()?; + + let maybe_identity_public_key = maybe_item_bytes + .map(IdentityPublicKey::deserialize_from_bytes) + .transpose()?; + + entry.insert(purpose, maybe_identity_public_key); + } + } + + Ok((root_hash, values)) + } +} diff --git a/packages/rs-platform-version/src/version/drive_abci_versions.rs b/packages/rs-platform-version/src/version/drive_abci_versions.rs index 4a86d99475..2439f050b1 100644 --- a/packages/rs-platform-version/src/version/drive_abci_versions.rs +++ b/packages/rs-platform-version/src/version/drive_abci_versions.rs @@ -22,14 +22,13 @@ pub struct DriveAbciQueryVersions { #[derive(Clone, Debug, Default)] pub struct DriveAbciQueryIdentityVersions { pub identity: FeatureVersionBounds, - pub identities: FeatureVersionBounds, + pub identities_contract_keys: FeatureVersionBounds, pub keys: FeatureVersionBounds, pub identity_nonce: FeatureVersionBounds, pub identity_contract_nonce: FeatureVersionBounds, pub balance: FeatureVersionBounds, pub balance_and_revision: FeatureVersionBounds, pub identity_by_public_key_hash: FeatureVersionBounds, - pub identities_by_public_key_hashes: FeatureVersionBounds, } #[derive(Clone, Debug, Default)] diff --git a/packages/rs-platform-version/src/version/drive_versions.rs b/packages/rs-platform-version/src/version/drive_versions.rs index 4446749e4b..94ac237f1b 100644 --- a/packages/rs-platform-version/src/version/drive_versions.rs +++ b/packages/rs-platform-version/src/version/drive_versions.rs @@ -103,6 +103,7 @@ pub struct DriveVerifyIdentityMethodVersions { pub verify_identity_keys_by_identity_id: FeatureVersion, pub verify_identity_nonce: FeatureVersion, pub verify_identity_contract_nonce: FeatureVersion, + pub verify_identities_contract_keys: FeatureVersion, } #[derive(Clone, Debug, Default)] @@ -537,6 +538,7 @@ pub struct DriveIdentityProveMethodVersions { pub full_identities: FeatureVersion, pub identity_nonce: FeatureVersion, pub identity_contract_nonce: FeatureVersion, + pub identities_contract_keys: FeatureVersion, pub prove_full_identities_by_unique_public_key_hashes: FeatureVersion, pub prove_full_identity_by_unique_public_key_hash: FeatureVersion, pub prove_identity_id_by_unique_public_key_hash: FeatureVersion, @@ -557,6 +559,7 @@ pub struct DriveIdentityKeysFetchMethodVersions { pub fetch_all_identity_keys: FeatureVersion, pub fetch_identities_all_keys: FeatureVersion, pub fetch_identity_keys: FeatureVersion, + pub fetch_identities_contract_keys: FeatureVersion, } #[derive(Clone, Debug, Default)] diff --git a/packages/rs-platform-version/src/version/mocks/v2_test.rs b/packages/rs-platform-version/src/version/mocks/v2_test.rs index 172c19190a..584b9c369d 100644 --- a/packages/rs-platform-version/src/version/mocks/v2_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v2_test.rs @@ -264,6 +264,7 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { verify_identity_keys_by_identity_id: 0, verify_identity_nonce: 0, verify_identity_contract_nonce: 0, + verify_identities_contract_keys: 0, }, single_document: DriveVerifySingleDocumentMethodVersions { verify_proof: 0, @@ -316,6 +317,7 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { full_identities: 0, identity_nonce: 0, identity_contract_nonce: 0, + identities_contract_keys: 0, prove_full_identities_by_unique_public_key_hashes: 0, prove_full_identity_by_unique_public_key_hash: 0, prove_identity_id_by_unique_public_key_hash: 0, @@ -327,6 +329,7 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { fetch_all_identity_keys: 0, fetch_identities_all_keys: 0, fetch_identity_keys: 0, + fetch_identities_contract_keys: 0, }, prove: DriveIdentityKeysProveMethodVersions { prove_identities_all_keys: 0, @@ -736,11 +739,6 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { max_version: 0, default_current_version: 0, }, - identities: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, keys: FeatureVersionBounds { min_version: 0, max_version: 0, @@ -771,7 +769,7 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { max_version: 0, default_current_version: 0, }, - identities_by_public_key_hashes: FeatureVersionBounds { + identities_contract_keys: FeatureVersionBounds { min_version: 0, max_version: 0, default_current_version: 0, diff --git a/packages/rs-platform-version/src/version/mocks/v3_test.rs b/packages/rs-platform-version/src/version/mocks/v3_test.rs index 32731a00f2..2cbbdb3fe6 100644 --- a/packages/rs-platform-version/src/version/mocks/v3_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v3_test.rs @@ -272,6 +272,7 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { verify_identity_keys_by_identity_id: 0, verify_identity_nonce: 0, verify_identity_contract_nonce: 0, + verify_identities_contract_keys: 0, }, single_document: DriveVerifySingleDocumentMethodVersions { verify_proof: 0, @@ -324,6 +325,7 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { full_identities: 0, identity_nonce: 0, identity_contract_nonce: 0, + identities_contract_keys: 0, prove_full_identities_by_unique_public_key_hashes: 0, prove_full_identity_by_unique_public_key_hash: 0, prove_identity_id_by_unique_public_key_hash: 0, @@ -335,6 +337,7 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { fetch_all_identity_keys: 0, fetch_identities_all_keys: 0, fetch_identity_keys: 0, + fetch_identities_contract_keys: 0, }, prove: DriveIdentityKeysProveMethodVersions { prove_identities_all_keys: 0, @@ -736,11 +739,6 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { max_version: 0, default_current_version: 0, }, - identities: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, keys: FeatureVersionBounds { min_version: 0, max_version: 0, @@ -771,7 +769,7 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { max_version: 0, default_current_version: 0, }, - identities_by_public_key_hashes: FeatureVersionBounds { + identities_contract_keys: FeatureVersionBounds { min_version: 0, max_version: 0, default_current_version: 0, diff --git a/packages/rs-platform-version/src/version/v1.rs b/packages/rs-platform-version/src/version/v1.rs index 21552c8b14..acaf64eb56 100644 --- a/packages/rs-platform-version/src/version/v1.rs +++ b/packages/rs-platform-version/src/version/v1.rs @@ -263,6 +263,7 @@ pub const PLATFORM_V1: PlatformVersion = PlatformVersion { verify_identity_keys_by_identity_id: 0, verify_identity_nonce: 0, verify_identity_contract_nonce: 0, + verify_identities_contract_keys: 0, }, single_document: DriveVerifySingleDocumentMethodVersions { verify_proof: 0, @@ -315,6 +316,7 @@ pub const PLATFORM_V1: PlatformVersion = PlatformVersion { full_identities: 0, identity_nonce: 0, identity_contract_nonce: 0, + identities_contract_keys: 0, prove_full_identities_by_unique_public_key_hashes: 0, prove_full_identity_by_unique_public_key_hash: 0, prove_identity_id_by_unique_public_key_hash: 0, @@ -326,6 +328,7 @@ pub const PLATFORM_V1: PlatformVersion = PlatformVersion { fetch_all_identity_keys: 0, fetch_identities_all_keys: 0, fetch_identity_keys: 0, + fetch_identities_contract_keys: 0, }, prove: DriveIdentityKeysProveMethodVersions { prove_identities_all_keys: 0, @@ -735,12 +738,12 @@ pub const PLATFORM_V1: PlatformVersion = PlatformVersion { max_version: 0, default_current_version: 0, }, - identities: FeatureVersionBounds { + keys: FeatureVersionBounds { min_version: 0, max_version: 0, default_current_version: 0, }, - keys: FeatureVersionBounds { + identities_contract_keys: FeatureVersionBounds { min_version: 0, max_version: 0, default_current_version: 0, @@ -770,11 +773,6 @@ pub const PLATFORM_V1: PlatformVersion = PlatformVersion { max_version: 0, default_current_version: 0, }, - identities_by_public_key_hashes: FeatureVersionBounds { - min_version: 0, - max_version: 0, - default_current_version: 0, - }, }, data_contract_based_queries: DriveAbciQueryDataContractVersions { data_contract: FeatureVersionBounds { diff --git a/packages/rs-sdk/src/platform.rs b/packages/rs-sdk/src/platform.rs index 7e630fd85c..0718da718d 100644 --- a/packages/rs-sdk/src/platform.rs +++ b/packages/rs-sdk/src/platform.rs @@ -10,6 +10,7 @@ mod delegate; mod document_query; mod fetch; mod fetch_many; +mod identities_contract_keys_query; mod query; pub mod transition; pub mod types; diff --git a/packages/rs-sdk/src/platform/fetch_many.rs b/packages/rs-sdk/src/platform/fetch_many.rs index d98bd86267..6bfc96f92f 100644 --- a/packages/rs-sdk/src/platform/fetch_many.rs +++ b/packages/rs-sdk/src/platform/fetch_many.rs @@ -12,7 +12,8 @@ use crate::{ Sdk, }; use dapi_grpc::platform::v0::{ - GetDataContractsRequest, GetDocumentsResponse, GetEpochsInfoRequest, GetIdentityKeysRequest, + GetDataContractsRequest, GetDocumentsResponse, GetEpochsInfoRequest, + GetIdentitiesContractKeysRequest, GetIdentityKeysRequest, GetProtocolVersionUpgradeStateRequest, GetProtocolVersionUpgradeVoteStatusRequest, }; use dashcore_rpc::dashcore::ProTxHash; @@ -20,7 +21,7 @@ use dpp::block::epoch::EpochIndex; use dpp::block::extended_epoch_info::ExtendedEpochInfo; use dpp::data_contract::DataContract; use dpp::document::Document; -use dpp::identity::KeyID; +use dpp::identity::{KeyID, Purpose}; use dpp::prelude::{Identifier, IdentityPublicKey}; use dpp::util::deserializer::ProtocolVersion; use dpp::version::ProtocolVersionVoteCount; @@ -36,7 +37,7 @@ use super::LimitQuery; /// To fetch multiple objects from the platform, you need to define some query (criteria that fetched objects must match) /// and use [FetchMany::fetch_many()] for your object type. /// -/// You can also use conveniance methods: +/// You can also use convenience methods: /// * [FetchMany::fetch_many_by_identifiers()] - to fetch multiple objects by their identifiers, /// * [FetchMany::fetch_many_with_limit()] - to fetch not more than `limit` objects. /// @@ -149,7 +150,7 @@ where /// Fetch multiple objects from the Platform by their identifiers. /// - /// Conveniance method to fetch multiple objects by their identifiers. + /// Convenience method to fetch multiple objects by their identifiers. /// See [FetchMany] and [FetchMany::fetch_many()] for more detailed documentation. /// /// ## Parameters diff --git a/packages/rs-sdk/src/platform/identities_contract_keys_query.rs b/packages/rs-sdk/src/platform/identities_contract_keys_query.rs new file mode 100644 index 0000000000..4716982231 --- /dev/null +++ b/packages/rs-sdk/src/platform/identities_contract_keys_query.rs @@ -0,0 +1,89 @@ +use dapi_grpc::platform::v0::get_identities_contract_keys_request::GetIdentitiesContractKeysRequestV0; +use dapi_grpc::platform::v0::get_identities_contract_keys_request::Version::V0; +use dapi_grpc::platform::v0::GetIdentitiesContractKeysRequest; +use dpp::identity::Purpose; +use rs_dapi_client::transport::{ + AppliedRequestSettings, BoxFuture, TransportClient, TransportRequest, +}; + +use crate::platform::Identifier; +use crate::Error; + +/// Request that is used to query identities' contract keys +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, dapi_grpc_macros::Mockable)] +pub struct IdentitiesContractKeysQuery { + /// The identities' identifiers that we want to query + pub identities_ids: Vec, + /// The contract identifier + pub contract_id: Identifier, + /// An optional document type if the keys are on a document type instead of the contract + pub document_type_name: Option, + /// The purposes we want to query for + pub purposes: Vec, +} + +impl IdentitiesContractKeysQuery { + /// Create new IdentitiesContractKeysQuery for provided identities ids, contract id, the document + /// type (if we want to make the query on the document type level), and purposes + pub fn new( + identities_ids: Vec, + contract_id: Identifier, + document_type_name: Option, + purposes: Vec, + ) -> Result { + Ok(Self { + identities_ids, + contract_id, + document_type_name, + purposes, + }) + } +} + +impl TryFrom for GetIdentitiesContractKeysRequest { + type Error = Error; + fn try_from(dapi_request: IdentitiesContractKeysQuery) -> Result { + let IdentitiesContractKeysQuery { + identities_ids, + contract_id, + document_type_name, + purposes, + } = dapi_request; + //todo: transform this into PlatformVersionedTryFrom + Ok(GetIdentitiesContractKeysRequest { + version: Some(V0(GetIdentitiesContractKeysRequestV0 { + identities_ids: identities_ids.into_iter().map(|a| a.to_vec()).collect(), + contract_id: contract_id.to_vec(), + document_type_name, + purposes: purposes.into_iter().map(|purpose| purpose as i32).collect(), + prove: true, + })), + }) + } +} + +impl TransportRequest for IdentitiesContractKeysQuery { + type Client = ::Client; + type Response = ::Response; + const SETTINGS_OVERRIDES: rs_dapi_client::RequestSettings = + ::SETTINGS_OVERRIDES; + + fn request_name(&self) -> &'static str { + "getIdentitiesContractKeysRequest" + } + + fn method_name(&self) -> &'static str { + "get_identities_contract_keys" + } + + fn execute_transport<'c>( + self, + client: &'c mut Self::Client, + settings: &AppliedRequestSettings, + ) -> BoxFuture<'c, Result::Error>> { + let request: GetIdentitiesContractKeysRequest = self + .try_into() + .expect("IdentitiesContractKeysQuery should always be valid"); + request.execute_transport(client, settings) + } +} diff --git a/packages/rs-sdk/src/platform/query.rs b/packages/rs-sdk/src/platform/query.rs index e0d6b8bb40..aa946feed0 100644 --- a/packages/rs-sdk/src/platform/query.rs +++ b/packages/rs-sdk/src/platform/query.rs @@ -263,14 +263,14 @@ impl Query for Option { } } -/// Conveniance method that allows direct use of a ProTxHash +/// Convenience method that allows direct use of a ProTxHash impl Query for ProTxHash { fn query(self, prove: bool) -> Result { Some(self).query(prove) } } -/// Conveniance method that allows direct use of a ProTxHash +/// Convenience method that allows direct use of a ProTxHash impl Query for LimitQuery { fn query(self, prove: bool) -> Result { LimitQuery { diff --git a/packages/rs-sdk/src/sdk.rs b/packages/rs-sdk/src/sdk.rs index df24ca08d6..f6f40e14da 100644 --- a/packages/rs-sdk/src/sdk.rs +++ b/packages/rs-sdk/src/sdk.rs @@ -633,7 +633,7 @@ impl SdkBuilder { /// Use Dash Core as a wallet and context provider. /// - /// This is a conveniance method that configures the SDK to use Dash Core as a wallet and context provider. + /// This is a convenience method that configures the SDK to use Dash Core as a wallet and context provider. /// /// For more control over the configuration, use [SdkBuilder::with_wallet()] and [SdkBuilder::with_context_provider()]. /// diff --git a/packages/rs-sdk/tests/fetch/data_contract.rs b/packages/rs-sdk/tests/fetch/data_contract.rs index d68646eb70..bfcd383e15 100644 --- a/packages/rs-sdk/tests/fetch/data_contract.rs +++ b/packages/rs-sdk/tests/fetch/data_contract.rs @@ -105,7 +105,7 @@ async fn test_data_contracts_2_nx() { async fn test_data_contract_history_read() { let cfg = Config::new(); let id = Identifier::from_string( - "3c71ba2d0b655ac3d231c4411d3c3fad43451d3f48213537ff9da331b24e5dea", + "8be1d279d6e01d6556d85d5fc69661273b563defa99d00b84e543b1b0b33b4f3", Encoding::Hex, ) .unwrap(); diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_history_read/msg_2024-04-11T16:57:48.166543000Z_GetDataContractHistoryRequest_1519241de3a099f69aa1d8523aef8505da12dd67cb9d5d8b43fad82de9d06061.json b/packages/rs-sdk/tests/vectors/test_data_contract_history_read/msg_2024-04-11T16:57:48.166543000Z_GetDataContractHistoryRequest_1519241de3a099f69aa1d8523aef8505da12dd67cb9d5d8b43fad82de9d06061.json deleted file mode 100644 index 3891dee2469224b71441e63992080713db5648bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57547 zcmeI*+j87SvW4M&?Wb_?dS9@>^SsK$ghFG{mSQB!qr*h(n9#fL1|>`A?{6ETPHvIy z3zlZJdJpc9RZ$JKbb2y(ke*gF8=*gqa(cf=AnLj;0 z{@?e1k8!d%xIF)GaC-LP?=cpCA1@BBmP1`F?wH2nlhdok?N^IA&X;#AE?Tbee7V4j z#liW-hf&WLH&2Vdmp5NbAFe-HjB~d9d%2*q#lbjR%r=(8ZV7jB`C*Rb-&cz{rjyfm z>i@^@7au)+^6bg0jgfwR{q*Vklh1$t`Q>%azI^rY#j6JoUp;vCa&yDcI6iuR!*4I1 z|L1yh^3{vi*EdtV+5G$Fhc`d`&kr*$)?o7N`qjfn4_`gpjPMplH&A+f{p6R&^D2(U z>4&*Cqy6;!#r1=q9zT5Y>w~AyfBM(;qX+LV-Dqne@X_^e&wqNn8DRm5qgPL!UH>k^ z#h5P7PS4M$v*U~R(rjkf$n)y?PtTt|_<-*P_Kx1peFN^JM-N{^VX@&w7<-1eDu!;zkm3_b7qAsRxlqfKy`C?vH;D^ z39euI#r*jKF!SL?6TdHbKKya1v-!}`PM!aF;a)d4Fy5BK≶rZcoVl6UPf1&Ua5| ztcc4eKIZnNqtC--bz@0M^A$^4dV9zA^2d^%<_ne-b#ud#rsfk{R5hPidh~oemXtN0 zSkl&fykwl4&y{lF4D;t>=^ZyWEXd{NctK(FaVB8ECAH1hFX?SQUQ*o6u^?Si-F(3o z-QAp6Qr>(bN?Ow0e1XSH3Y=hDe5Htoj zpKt_K!6MOoh8qTt5l_n+nSupYEnGhmKAoY8bPk5p%RU7lC^BnskwaLjN!G04AcBEN zF&uckip;CnVg}atRlG{7P|7%N&^Mw8*ykkeAeA&-)ix~$fjWdPbW5Em;V~-S0azrAi-!ITRgr0(vA?jA^pGGyzpvq8vgZ5d zF^zrde%taI@?KEc83e4MVuu5j&DrOH$~H=XBgQc&LOW9Ffw*QY?MSGNtG6RABMN3o zIDrCUwp&LF+5J-zS5;tTV_|%Ei3?2_rubMrVEjAjq^jh8IKYaOhsZsX>xN#TH$%7i z{77A8%@KmMo6*cOU6*9DawdLDGTJ3Dpi=1~E3C1mw8pIDg^JuIE3$e{>1Ovl`Ge&5 zrM0%=a(5)MqBWH&HrlF)2er^wld*lr2wZ@Cz0Q2oUKUPp@R1E&)=g3K8nb9wi0qE| zh+-h+!AEXl?;-f!sNoJVDBjJXf?BukXR}k@Ux|OZezL!WndU}B9`$CZGmtg$Nx1xo zntMgg7>^T)6qe{0iqRlXZa$7(Q7YoC7<{@W z#6EQ14qmjA>v5WFmLI(6ZKkkkgMM)@T8U1f0;pw2L4ljL3@+`i4r-xn_;3K09e^qI z`jS?|%a`9!G(rA8yE1E16dwsUT0eYHw=j8dh+DTwK-6CLh)ph{C$*67(N~GvT?Wd$ zG?XV(Yi)OBCKnD~C#29q0&%meR4tiZEZ0VUhqQc37+ zFN>YeRmt~2z^*YdAfkUAVi2A*(B6w>6#_%=kCP{-THCdQ~GX#dF$LChyMn<7t(WuXl=&eY{bp?es^BZ&36*`5S`x8~j=!etqSD9u zW-Spy_!OQ@u%ne9Ypf1xs0&24yZ=g|bAO+?*C8SJ5Z_z6BrM&YN!?S@H-xFz@7ULp z+kCz?Z-ff6D;EUc^5e=9Z4}Q^t$uXX{Gc=M7}d7b9lJSoN-s0hJ4(6~b@{_Xk2M zO6mj=ejHD#uc`Xjjw!HYL7X*kB6nm>%t&RppT+P0V-~=|(^%v#6`;HxBU$Zg7!WMvT|jR_uQ% z1Y_M>BhI&12S6DyCz=^5h9FZj)ixun^Wdpt+SxhPyVZUrcM&!kR)^dXBw)f0kx7MS zIHZYjM9rWqV@Dhitf3x=gu}%6PT{)q9@4_XMcp>Y`+9NXmVOdPl8xJ5NY3~LK-pygyu0#U z!~~J;f(@y^`VXVzmk9g?1srFr{7^uC8723_4(Q|X(1jSb{4~nS zPXqxgVj`b%$i;`BMwt;e|9ALllvxX)1wLDE?3j=32(Tb9dq7RPjN1G8FqXM0(au%G0(cZ>bX{{5~Gr|6C=hbiFj+r>Nl#2_NyD46&l_ zw<{_QiOhv4Sl)JW$z2W$0utzdnK!$0^s? zU9ZT(%pCqn8rH%G|Gl% zTcOZn2!KBSeWeF4x`}YB6bL8AR6ck2P2QzjI+?STL#64D*mH`b87@|MHpbUTt%68 z<#FWXuwp;o7D;WV|Ly0aXDf8;$6*=iyQRN+Fl7*xf5D??F>cKtMZ{GMzmYouH_A*E z(=l*a(@?|4zJR1{a_f))t`kzXG06StDf(6FUSTYt3}2QZ&tTu0`PMCV)QUWbI>U81}BU-v9)0G+;2 z^$M5{W(+9uhKV9uZu9H8hxdTJ?I9%E##k_sij_?7>(lD6&gaHvTp+Z!mwQ$B=V|p7 zYx8l!B5^l9lQ3J7Wr_wh<_K{IQcn6UzWPhfk~O&f{6#NlvbTg18<1qh z1f-5Z47?>_xP!Ya3XhPP0UEXw4cULmiFhh0wU%e zAypDFGT+CEspEu+qVf&=ba)TgoHeGR>R08;!|M!b`{E-w6hHbJ5lgyJ4q(fQ+VF^L z-#P<7(9I19qew{6u#TZ5hh!EOHXrkDJLg<=gTs5kZpzTjKk7epufehlu;WXfM2N$C zz<$^Eu02b52M zj3fMI`fvK4Km$y22)LWbth$m+0JC)Ib7!%G=c7hTWgbV zO&b@;bwR?+VT4NPRkxE&I4;o3N=x7pdPZbyjRrW>tgd7myoQpA6Ar$8_c&$rDX-{Z zyw!KyG2tZSy1B~|&Olr@xr6gs3rJjHA2B%`(pWZGO=ID_YEO3#17yVEEtXhV};Zg3``#Ripb*Xn$Oxy%X%Et~t((vULy>Ysybj2pF7PVHqKbDT@YA)2XI`)Huw7 zP@y`R4DW?_o>+93-jEf;iYDibjQ;HOBxOwo($lyNf{#Xj&@@a_LY#hGN#e{)SF22) z825dhWlAA6EZoR7nrILagW$_Wiawfn`=5d<&jO#;zo)~AWXedLJjX2JqKP zAn`VbjBLtsiLA1_G0FR7qsbSaT_EXD7vcGi>Cc#Znvy3%#qG1hYZRskF+vyafz7c>P4|_?#FSUiXN#MscBdLO1Bh|#1 zu|@EM?NoepPp00kV(e(M3^mkt7-G2s6kDN@nnwKW0BOzBmj$B;RtN2 zM2g)8qSao6*}ikm~=@LOvcTd8WIMq z2jUMSzag@%{(w0SGcK`r3IIz8#c~P2%ep8X%gF((ld=gmS@sM&H5SL&$_s(&wUbSW zaK6hAHI71;<~U&GA&`~G`4nPRZ9$u&@|OdTeb0If|4LPOljIJN+FvfMe+?h zBr3-42^ct4QW%`D-{i4pWuzV^5JR5q6N7F!nA972M@UULOBR|u25hmcCUpE{ch0G% zq!u?`Q`4oSS5FD|_9!Pisp*Cc1I$QbWLrD-OeL9+A|~2uFvFMejQQDPPWQ|3g8F5R zv^`0b def598%{j~F8LanLzIpf8+yBr1zWL$J{{uB@Pf!2= diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_history_read/msg_2024-04-26T12:12:57.324522000Z_GetDataContractHistoryRequest_9659531622bd289c14efcc20c8c036b2cfcb3e5818816e3bc8a7c250a9cf384e.json b/packages/rs-sdk/tests/vectors/test_data_contract_history_read/msg_2024-04-26T12:12:57.324522000Z_GetDataContractHistoryRequest_9659531622bd289c14efcc20c8c036b2cfcb3e5818816e3bc8a7c250a9cf384e.json new file mode 100644 index 0000000000000000000000000000000000000000..d09d7251385316bb2050d9be02272fc377c63315 GIT binary patch literal 31092 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_history_read/quorum_pubkey-106-0db75802182bb9b9417e92b278832a287dd182f4ea3b1b4bf70dcd56c1b87d78.json b/packages/rs-sdk/tests/vectors/test_data_contract_history_read/quorum_pubkey-106-0db75802182bb9b9417e92b278832a287dd182f4ea3b1b4bf70dcd56c1b87d78.json deleted file mode 100644 index e836917eaf..0000000000 --- a/packages/rs-sdk/tests/vectors/test_data_contract_history_read/quorum_pubkey-106-0db75802182bb9b9417e92b278832a287dd182f4ea3b1b4bf70dcd56c1b87d78.json +++ /dev/null @@ -1 +0,0 @@ -[134,90,211,2,159,204,117,201,202,79,41,171,146,86,115,171,247,117,185,147,133,32,111,139,93,126,226,86,104,239,140,58,90,36,89,121,41,96,244,146,48,229,249,80,185,69,142,129] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_data_contract_history_read/quorum_pubkey-106-61ba8a20d570891f2ba1f7d30c1d16b80a691707cf7fd94a349b3c2cb029a601.json b/packages/rs-sdk/tests/vectors/test_data_contract_history_read/quorum_pubkey-106-61ba8a20d570891f2ba1f7d30c1d16b80a691707cf7fd94a349b3c2cb029a601.json new file mode 100644 index 0000000000..bed4309348 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_data_contract_history_read/quorum_pubkey-106-61ba8a20d570891f2ba1f7d30c1d16b80a691707cf7fd94a349b3c2cb029a601.json @@ -0,0 +1 @@ +[140,189,175,71,98,121,233,120,71,207,91,48,163,17,244,248,75,84,17,15,148,190,121,226,87,25,99,23,140,63,240,67,249,255,41,0,216,142,186,97,243,57,221,222,107,11,110,19] \ No newline at end of file diff --git a/packages/strategy-tests/src/transitions.rs b/packages/strategy-tests/src/transitions.rs index e7d28f3860..0ef26db956 100644 --- a/packages/strategy-tests/src/transitions.rs +++ b/packages/strategy-tests/src/transitions.rs @@ -659,6 +659,7 @@ pub fn create_identities_state_transitions( *purpose, *security_level, *key_type, + None, platform_version, )?; identity.add_public_key(key.clone()); diff --git a/packages/wallet-lib/src/plugins/Workers/IdentitySyncWorker.js b/packages/wallet-lib/src/plugins/Workers/IdentitySyncWorker.js index 2cc17bd830..f9ed5183b6 100644 --- a/packages/wallet-lib/src/plugins/Workers/IdentitySyncWorker.js +++ b/packages/wallet-lib/src/plugins/Workers/IdentitySyncWorker.js @@ -1,4 +1,5 @@ const { default: loadDpp, Identity } = require('@dashevo/wasm-dpp'); +const GrpcErrorCodes = require('@dashevo/grpc-common/lib/server/error/GrpcErrorCodes'); const Worker = require('../Worker'); @@ -68,28 +69,29 @@ class IdentitySyncWorker extends Worker { const { privateKey } = this.identities.getIdentityHDKeyByIndex(index, 0); const publicKey = privateKey.toPublicKey(); - // TODO: rework with singular `getIdentityByPublicKeyHash`? - // (needs to be implemented in the transport and dapi) - // eslint-disable-next-line no-await-in-loop - const identityBuffers = await this.transport.getIdentitiesByPublicKeyHashes( - [publicKey.hash], - ); - - // if identity is not preset then increment gap count - // and stop sync if gap limit is reached - if (!identityBuffers[0]) { - gapCount += 1; - - if (gapCount >= this.gapLimit) { - break; + let identityBuffer; + try { + // eslint-disable-next-line no-await-in-loop + identityBuffer = await this.transport.getIdentityByPublicKeyHash( + publicKey.hash, + ); + } catch (e) { + // if identity is not preset then increment gap count + // and stop sync if gap limit is reached + if (e.code === GrpcErrorCodes.NOT_FOUND) { + gapCount += 1; + + if (gapCount >= this.gapLimit) { + break; + } + + // eslint-disable-next-line no-continue + continue; + } else { + throw e; } - - // eslint-disable-next-line no-continue - continue; } - const [identityBuffer] = identityBuffers; - // If it's not an undefined and not a buffer or Identifier (which inherits Buffer), // this method will loop forever. // This check prevents this from happening diff --git a/packages/wallet-lib/src/test/mocks/TransportMock.js b/packages/wallet-lib/src/test/mocks/TransportMock.js index 986c42f58f..d4ea750e07 100644 --- a/packages/wallet-lib/src/test/mocks/TransportMock.js +++ b/packages/wallet-lib/src/test/mocks/TransportMock.js @@ -1,4 +1,5 @@ const EventEmitter = require('events'); +const NotFoundError = require('@dashevo/dapi-client/lib/transport/GrpcTransport/errors/NotFoundError'); const getBlockchainStatus = require('../../transport/FixtureTransport/methods/getBlockchainStatus'); class TransportMock extends EventEmitter { @@ -21,7 +22,8 @@ class TransportMock extends EventEmitter { nonce: 351770, }); this.subscribeToBlocks = sinon.stub(); - this.getIdentitiesByPublicKeyHashes = sinon.stub().returns([]); + this.getIdentityByPublicKeyHash = sinon.stub() + .rejects(new NotFoundError('Identity not found', {}, null)); this.sendTransaction = sinon.stub(); this.getTransaction = sinon.stub(); this.getBlockHeaderByHash = sinon.stub(); diff --git a/packages/wallet-lib/src/transport/DAPIClientTransport/DAPIClientTransport.js b/packages/wallet-lib/src/transport/DAPIClientTransport/DAPIClientTransport.js index 649af7b434..ee582985fd 100644 --- a/packages/wallet-lib/src/transport/DAPIClientTransport/DAPIClientTransport.js +++ b/packages/wallet-lib/src/transport/DAPIClientTransport/DAPIClientTransport.js @@ -22,7 +22,7 @@ DAPIClientTransport.prototype.getBlockHeaderByHeight = require('./methods/getBlo DAPIClientTransport.prototype.getBlockchainStatus = require('./methods/getBlockchainStatus'); DAPIClientTransport.prototype.getTransaction = require('./methods/getTransaction'); DAPIClientTransport.prototype.sendTransaction = require('./methods/sendTransaction'); -DAPIClientTransport.prototype.getIdentitiesByPublicKeyHashes = require('./methods/getIdentitiesByPublicKeyHashes'); +DAPIClientTransport.prototype.getIdentityByPublicKeyHash = require('./methods/getIdentityByPublicKeyHash'); DAPIClientTransport.prototype.subscribeToTransactionsWithProofs = require('./methods/subscribeToTransactionsWithProofs'); module.exports = DAPIClientTransport; diff --git a/packages/wallet-lib/src/transport/DAPIClientTransport/methods/getIdentitiesByPublicKeyHashes.js b/packages/wallet-lib/src/transport/DAPIClientTransport/methods/getIdentitiesByPublicKeyHashes.js deleted file mode 100644 index e193f16ee3..0000000000 --- a/packages/wallet-lib/src/transport/DAPIClientTransport/methods/getIdentitiesByPublicKeyHashes.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * @param {Buffer[]} publicKeyHashes - * @return {Promise} - */ -module.exports = async function getIdentitiesByPublicKeyHashes(publicKeyHashes) { - const response = await this.client.platform.getIdentitiesByPublicKeyHashes( - publicKeyHashes, - ); - - return response.getIdentities(); -}; diff --git a/packages/wallet-lib/src/transport/DAPIClientTransport/methods/getIdentityByPublicKeyHash.js b/packages/wallet-lib/src/transport/DAPIClientTransport/methods/getIdentityByPublicKeyHash.js new file mode 100644 index 0000000000..00fa5e1286 --- /dev/null +++ b/packages/wallet-lib/src/transport/DAPIClientTransport/methods/getIdentityByPublicKeyHash.js @@ -0,0 +1,11 @@ +/** + * @param {Buffer} publicKeyHash + * @return {Promise} + */ +module.exports = async function getIdentityByPublicKeyHash(publicKeyHash) { + const response = await this.client.platform.getIdentityByPublicKeyHash( + publicKeyHash, + ); + + return response.getIdentity(); +}; diff --git a/packages/wallet-lib/src/transport/Transport.d.ts b/packages/wallet-lib/src/transport/Transport.d.ts index 6dcef7e96b..9a9697c897 100644 --- a/packages/wallet-lib/src/transport/Transport.d.ts +++ b/packages/wallet-lib/src/transport/Transport.d.ts @@ -20,7 +20,7 @@ export declare interface Transport { getBlockHeaderByHeight(height: number): Promise - getIdentitiesByPublicKeyHashes(publicKeyHashes: Buffer[]): Promise + getIdentityByPublicKeyHash(publicKeyHash: Buffer): Promise getBlockchainStatus(): Promise diff --git a/packages/wasm-dpp/src/identity/identity_public_key/mod.rs b/packages/wasm-dpp/src/identity/identity_public_key/mod.rs index 0066b86294..bf07fd9bf4 100644 --- a/packages/wasm-dpp/src/identity/identity_public_key/mod.rs +++ b/packages/wasm-dpp/src/identity/identity_public_key/mod.rs @@ -11,7 +11,7 @@ use dpp::identity::identity_public_key::accessors::v0::{ use dpp::identity::identity_public_key::hash::IdentityPublicKeyHashMethodsV0; use dpp::identity::{IdentityPublicKey, KeyID, TimestampMillis}; use dpp::platform_value::{BinaryData, ReplacementType}; -use dpp::serialization::ValueConvertible; +use dpp::serialization::{PlatformDeserializable, PlatformSerializable, ValueConvertible}; use dpp::ProtocolError; use dpp::version::PlatformVersion; @@ -183,6 +183,19 @@ impl IdentityPublicKeyWasm { Ok(js_object) } + + #[wasm_bindgen(js_name=toBuffer)] + pub fn to_buffer(&self) -> Result { + let bytes = PlatformSerializable::serialize_to_bytes(&self.0.clone()).with_js_error()?; + Ok(Buffer::from_bytes(&bytes)) + } + + #[wasm_bindgen(js_name=fromBuffer)] + pub fn from_buffer(buffer: Vec) -> Result { + let key: IdentityPublicKey = + PlatformDeserializable::deserialize_from_bytes(buffer.as_slice()).with_js_error()?; + Ok(key.into()) + } } // impl Inner for IdentityPublicKeyWasm { diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_public_key_transitions.rs b/packages/wasm-dpp/src/identity/state_transition/identity_public_key_transitions.rs index fb4289784a..e6eb7bd481 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_public_key_transitions.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_public_key_transitions.rs @@ -9,14 +9,17 @@ use dpp::state_transition::public_key_in_creation::IdentityPublicKeyInCreation; use js_sys::Reflect::delete_property; pub use serde::{Deserialize, Serialize}; +use dpp::identity::contract_bounds::ContractBounds; use dpp::ProtocolError; use std::convert::TryInto; use wasm_bindgen::prelude::*; use crate::errors::from_dpp_err; +use crate::identifier::IdentifierWrapper; use crate::utils::WithJsError; use crate::{buffer::Buffer, with_js_error}; use dpp::version::PlatformVersion; + #[derive(Deserialize, Default)] #[serde(rename_all = "camelCase")] struct ToObjectOptions { @@ -102,6 +105,25 @@ impl IdentityPublicKeyWithWitnessWasm { Ok(()) } + #[wasm_bindgen(js_name=setContractBounds)] + pub fn set_contract_bounds( + &mut self, + contract_id: IdentifierWrapper, + document_type_name: Option, + ) { + let contract_bounds = if document_type_name.is_some() { + ContractBounds::SingleContractDocumentType { + id: contract_id.into(), + document_type_name: document_type_name.unwrap(), + } + } else { + ContractBounds::SingleContract { + id: contract_id.into(), + } + }; + self.0.set_contract_bounds(Some(contract_bounds)) + } + #[wasm_bindgen(js_name=getSecurityLevel)] pub fn get_security_level(&self) -> u8 { self.0.security_level() as u8 From 6de96cdb0c5b029bed60f04fe83ac5ae1137c6ac Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Mon, 29 Apr 2024 16:26:51 +0700 Subject: [PATCH 149/191] chore(release): update changelog and bump version to 1.0.0-dev.12 (#1831) --- CHANGELOG.md | 31 ++++++++++++ Cargo.lock | 50 +++++++++---------- package.json | 2 +- packages/bench-suite/package.json | 2 +- packages/check-features/Cargo.toml | 2 +- packages/dapi-grpc/Cargo.toml | 2 +- packages/dapi-grpc/package.json | 2 +- packages/dapi/package.json | 2 +- packages/dash-spv/package.json | 2 +- packages/dashmate/package.json | 2 +- packages/dashpay-contract/Cargo.toml | 2 +- packages/dashpay-contract/package.json | 2 +- packages/data-contracts/Cargo.toml | 2 +- packages/dpns-contract/Cargo.toml | 2 +- packages/dpns-contract/package.json | 2 +- packages/feature-flags-contract/Cargo.toml | 2 +- packages/feature-flags-contract/package.json | 2 +- packages/js-dapi-client/package.json | 2 +- packages/js-dash-sdk/package.json | 2 +- packages/js-grpc-common/package.json | 2 +- .../Cargo.toml | 2 +- .../package.json | 2 +- packages/platform-test-suite/package.json | 2 +- packages/rs-dapi-client/Cargo.toml | 2 +- packages/rs-dapi-grpc-macros/Cargo.toml | 2 +- packages/rs-dpp/Cargo.toml | 2 +- packages/rs-drive-abci/Cargo.toml | 2 +- packages/rs-drive-proof-verifier/Cargo.toml | 2 +- packages/rs-drive/Cargo.toml | 2 +- .../Cargo.toml | 2 +- .../Cargo.toml | 2 +- packages/rs-platform-serialization/Cargo.toml | 2 +- .../rs-platform-value-convertible/Cargo.toml | 2 +- packages/rs-platform-value/Cargo.toml | 2 +- packages/rs-platform-version/Cargo.toml | 2 +- packages/rs-platform-versioning/Cargo.toml | 2 +- packages/rs-sdk/Cargo.toml | 2 +- packages/simple-signer/Cargo.toml | 2 +- packages/strategy-tests/Cargo.toml | 2 +- packages/wallet-lib/package.json | 2 +- packages/wasm-dpp/Cargo.toml | 2 +- packages/wasm-dpp/package.json | 2 +- packages/withdrawals-contract/Cargo.toml | 2 +- packages/withdrawals-contract/package.json | 2 +- 44 files changed, 98 insertions(+), 67 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e1e18ecbda..fcc4c8c181 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,34 @@ +## [1.0.0-dev.12](https://github.com/dashpay/platform/compare/v1.0.0-dev.11...v1.0.0-dev.12) (2024-04-29) + + +### ⚠ BREAKING CHANGES + +* Removed `getIdentities` and `getIdentitiesByPublicKeyHashes` endpoints in favor of `getIdentitiesContractKeys` (#1766) +* **platform:** basic nft support (#1829) +* **dapi:** `getStatus` is removed in favor of `getMasternodeStatus` and `getBlockchainStatus` (#1812) +* **platform:** documents serialization format is changed that makes previously created block chain data invalid (#1826) + +### Features + +* **dapi:** split getStatus into two endpoints ([#1812](https://github.com/dashpay/platform/issues/1812)) +* **drive-abci:** configure dir to store rejected txs ([#1823](https://github.com/dashpay/platform/issues/1823)) +* getIdentitiesContractKeys endpoint ([#1766](https://github.com/dashpay/platform/issues/1766)) +* **platform:** ability to transfer documents ([#1826](https://github.com/dashpay/platform/issues/1826)) +* **platform:** basic nft support ([#1829](https://github.com/dashpay/platform/issues/1829)) +* **sdk:** add query for data contract history ([#1787](https://github.com/dashpay/platform/issues/1787)) +* **wallet-lib:** optional sync of the account ([#1830](https://github.com/dashpay/platform/issues/1830)) + + +### Bug Fixes + +* add tls-webpki-roots to support tls on mobile (Android, iOS) ([#1828](https://github.com/dashpay/platform/issues/1828)) + + +### Miscellaneous Chores + +* **dapi:** update autogenerated clients ([#1827](https://github.com/dashpay/platform/issues/1827)) +* **dashmate:** limit concurrent state transition checks ([#1824](https://github.com/dashpay/platform/issues/1824)) + ## [1.0.0-dev.10](https://github.com/dashpay/platform/compare/v1.0.0-dev.9...v1.0.0-dev.10) (2024-04-04) diff --git a/Cargo.lock b/Cargo.lock index 4cbc3e6297..a871a5be5d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -670,7 +670,7 @@ checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" [[package]] name = "check-features" -version = "0.1.0" +version = "0.1.1-0" dependencies = [ "toml", ] @@ -1021,7 +1021,7 @@ dependencies = [ [[package]] name = "dapi-grpc" -version = "1.0.0-dev.11" +version = "1.0.0-dev.12" dependencies = [ "dapi-grpc-macros", "futures-core", @@ -1037,7 +1037,7 @@ dependencies = [ [[package]] name = "dapi-grpc-macros" -version = "1.0.0-dev.11" +version = "1.0.0-dev.12" dependencies = [ "dapi-grpc", "heck 0.5.0", @@ -1082,7 +1082,7 @@ dependencies = [ [[package]] name = "dash-sdk" -version = "1.0.0-dev.11" +version = "1.0.0-dev.12" dependencies = [ "async-trait", "base64 0.22.0", @@ -1179,7 +1179,7 @@ dependencies = [ [[package]] name = "dashpay-contract" -version = "1.0.0-dev.11" +version = "1.0.0-dev.12" dependencies = [ "platform-value", "platform-version", @@ -1189,7 +1189,7 @@ dependencies = [ [[package]] name = "data-contracts" -version = "1.0.0-dev.11" +version = "1.0.0-dev.12" dependencies = [ "dashpay-contract", "dpns-contract", @@ -1282,7 +1282,7 @@ checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" [[package]] name = "dpns-contract" -version = "1.0.0-dev.11" +version = "1.0.0-dev.12" dependencies = [ "platform-value", "platform-version", @@ -1292,7 +1292,7 @@ dependencies = [ [[package]] name = "dpp" -version = "1.0.0-dev.11" +version = "1.0.0-dev.12" dependencies = [ "anyhow", "async-trait", @@ -1342,7 +1342,7 @@ dependencies = [ [[package]] name = "drive" -version = "1.0.0-dev.11" +version = "1.0.0-dev.12" dependencies = [ "arc-swap", "base64 0.21.7", @@ -1378,7 +1378,7 @@ dependencies = [ [[package]] name = "drive-abci" -version = "1.0.0-dev.11" +version = "1.0.0-dev.12" dependencies = [ "arc-swap", "async-trait", @@ -1433,7 +1433,7 @@ dependencies = [ [[package]] name = "drive-proof-verifier" -version = "1.0.0-dev.11" +version = "1.0.0-dev.12" dependencies = [ "dapi-grpc", "dpp", @@ -1634,7 +1634,7 @@ checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984" [[package]] name = "feature-flags-contract" -version = "1.0.0-dev.11" +version = "1.0.0-dev.12" dependencies = [ "platform-value", "platform-version", @@ -2341,7 +2341,7 @@ dependencies = [ [[package]] name = "json-schema-compatibility-validator" -version = "0.25.16-rc.3" +version = "0.25.16-rc.4" dependencies = [ "json-patch", "json-schema-compatibility-validator", @@ -2506,7 +2506,7 @@ dependencies = [ [[package]] name = "masternode-reward-shares-contract" -version = "1.0.0-dev.11" +version = "1.0.0-dev.12" dependencies = [ "platform-value", "platform-version", @@ -2993,7 +2993,7 @@ checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "platform-serialization" -version = "1.0.0-dev.11" +version = "1.0.0-dev.12" dependencies = [ "bincode", "platform-version", @@ -3001,7 +3001,7 @@ dependencies = [ [[package]] name = "platform-serialization-derive" -version = "1.0.0-dev.11" +version = "1.0.0-dev.12" dependencies = [ "proc-macro2", "quote", @@ -3011,7 +3011,7 @@ dependencies = [ [[package]] name = "platform-value" -version = "1.0.0-dev.11" +version = "1.0.0-dev.12" dependencies = [ "base64 0.22.0", "bincode", @@ -3032,7 +3032,7 @@ dependencies = [ [[package]] name = "platform-value-convertible" -version = "1.0.0-dev.11" +version = "1.0.0-dev.12" dependencies = [ "quote", "syn 2.0.60", @@ -3040,14 +3040,14 @@ dependencies = [ [[package]] name = "platform-version" -version = "1.0.0-dev.11" +version = "1.0.0-dev.12" dependencies = [ "thiserror", ] [[package]] name = "platform-versioning" -version = "1.0.0-dev.11" +version = "1.0.0-dev.12" dependencies = [ "proc-macro2", "quote", @@ -3589,7 +3589,7 @@ dependencies = [ [[package]] name = "rs-dapi-client" -version = "1.0.0-dev.11" +version = "1.0.0-dev.12" dependencies = [ "backon", "chrono", @@ -4047,7 +4047,7 @@ checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" [[package]] name = "simple-signer" -version = "1.0.0-dev.11" +version = "1.0.0-dev.12" dependencies = [ "bincode", "dashcore-rpc", @@ -4137,7 +4137,7 @@ dependencies = [ [[package]] name = "strategy-tests" -version = "1.0.0-dev.11" +version = "1.0.0-dev.12" dependencies = [ "bincode", "dpp", @@ -5076,7 +5076,7 @@ checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93" [[package]] name = "wasm-dpp" -version = "1.0.0-dev.11" +version = "1.0.0-dev.12" dependencies = [ "anyhow", "async-trait", @@ -5338,7 +5338,7 @@ dependencies = [ [[package]] name = "withdrawals-contract" -version = "1.0.0-dev.11" +version = "1.0.0-dev.12" dependencies = [ "num_enum", "platform-value", diff --git a/package.json b/package.json index d63439323a..b31de1b640 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/platform", - "version": "1.0.0-dev.11", + "version": "1.0.0-dev.12", "private": true, "scripts": { "setup": "yarn install && yarn run build && yarn run configure", diff --git a/packages/bench-suite/package.json b/packages/bench-suite/package.json index 66b4231642..151468e078 100644 --- a/packages/bench-suite/package.json +++ b/packages/bench-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/bench-suite", "private": true, - "version": "1.0.0-dev.11", + "version": "1.0.0-dev.12", "description": "Dash Platform benchmark tool", "scripts": { "bench": "node ./bin/bench.js", diff --git a/packages/check-features/Cargo.toml b/packages/check-features/Cargo.toml index 9a7085c755..6cac7501aa 100644 --- a/packages/check-features/Cargo.toml +++ b/packages/check-features/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "check-features" -version = "0.1.0" +version = "0.1.1-0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/packages/dapi-grpc/Cargo.toml b/packages/dapi-grpc/Cargo.toml index ebe7e89fba..e05d98ee7b 100644 --- a/packages/dapi-grpc/Cargo.toml +++ b/packages/dapi-grpc/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc" description = "GRPC client for Dash Platform" -version = "1.0.0-dev.11" +version = "1.0.0-dev.12" authors = [ "Samuel Westrich ", "Igor Markin ", diff --git a/packages/dapi-grpc/package.json b/packages/dapi-grpc/package.json index 13cc51f1a8..806b93d373 100644 --- a/packages/dapi-grpc/package.json +++ b/packages/dapi-grpc/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-grpc", - "version": "1.0.0-dev.11", + "version": "1.0.0-dev.12", "description": "DAPI GRPC definition file and generated clients", "browser": "browser.js", "main": "node.js", diff --git a/packages/dapi/package.json b/packages/dapi/package.json index 5b79214188..54a3b15bce 100644 --- a/packages/dapi/package.json +++ b/packages/dapi/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/dapi", "private": true, - "version": "1.0.0-dev.11", + "version": "1.0.0-dev.12", "description": "A decentralized API for the Dash network", "scripts": { "api": "node scripts/api.js", diff --git a/packages/dash-spv/package.json b/packages/dash-spv/package.json index 61b2bfebb1..fbc882046c 100644 --- a/packages/dash-spv/package.json +++ b/packages/dash-spv/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dash-spv", - "version": "1.0.0-dev.11", + "version": "1.0.0-dev.12", "description": "Repository containing SPV functions used by @dashevo", "main": "index.js", "scripts": { diff --git a/packages/dashmate/package.json b/packages/dashmate/package.json index 4840248452..3067040e2a 100644 --- a/packages/dashmate/package.json +++ b/packages/dashmate/package.json @@ -1,6 +1,6 @@ { "name": "dashmate", - "version": "1.0.0-dev.11", + "version": "1.0.0-dev.12", "description": "Distribution package for Dash node installation", "scripts": { "lint": "eslint .", diff --git a/packages/dashpay-contract/Cargo.toml b/packages/dashpay-contract/Cargo.toml index b05b1d032f..d10e8aea79 100644 --- a/packages/dashpay-contract/Cargo.toml +++ b/packages/dashpay-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dashpay-contract" description = "DashPay data contract schema and tools" -version = "1.0.0-dev.11" +version = "1.0.0-dev.12" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/dashpay-contract/package.json b/packages/dashpay-contract/package.json index f0bf04f5ff..bc2b1bb97a 100644 --- a/packages/dashpay-contract/package.json +++ b/packages/dashpay-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dashpay-contract", - "version": "1.0.0-dev.11", + "version": "1.0.0-dev.12", "description": "Reference contract of the DashPay DPA on Dash Evolution", "scripts": { "lint": "eslint .", diff --git a/packages/data-contracts/Cargo.toml b/packages/data-contracts/Cargo.toml index cd20360074..8c25e44f4e 100644 --- a/packages/data-contracts/Cargo.toml +++ b/packages/data-contracts/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "data-contracts" description = "Dash Platform system data contracts" -version = "1.0.0-dev.11" +version = "1.0.0-dev.12" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/dpns-contract/Cargo.toml b/packages/dpns-contract/Cargo.toml index 88635c7170..ca02c84464 100644 --- a/packages/dpns-contract/Cargo.toml +++ b/packages/dpns-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dpns-contract" description = "DPNS data contract schema and tools" -version = "1.0.0-dev.11" +version = "1.0.0-dev.12" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/dpns-contract/package.json b/packages/dpns-contract/package.json index 1be0a9e467..b443184e5b 100644 --- a/packages/dpns-contract/package.json +++ b/packages/dpns-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dpns-contract", - "version": "1.0.0-dev.11", + "version": "1.0.0-dev.12", "description": "A contract and helper scripts for DPNS DApp", "scripts": { "lint": "eslint .", diff --git a/packages/feature-flags-contract/Cargo.toml b/packages/feature-flags-contract/Cargo.toml index ef8f169e67..6700c263c0 100644 --- a/packages/feature-flags-contract/Cargo.toml +++ b/packages/feature-flags-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "feature-flags-contract" description = "Feature flags data contract schema and tools" -version = "1.0.0-dev.11" +version = "1.0.0-dev.12" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/feature-flags-contract/package.json b/packages/feature-flags-contract/package.json index c6bd6cfd61..07177012d8 100644 --- a/packages/feature-flags-contract/package.json +++ b/packages/feature-flags-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/feature-flags-contract", - "version": "1.0.0-dev.11", + "version": "1.0.0-dev.12", "description": "Data Contract to store Dash Platform feature flags", "scripts": { "build": "", diff --git a/packages/js-dapi-client/package.json b/packages/js-dapi-client/package.json index ce9207f7d7..aeceb23813 100644 --- a/packages/js-dapi-client/package.json +++ b/packages/js-dapi-client/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-client", - "version": "1.0.0-dev.11", + "version": "1.0.0-dev.12", "description": "Client library used to access Dash DAPI endpoints", "main": "lib/index.js", "contributors": [ diff --git a/packages/js-dash-sdk/package.json b/packages/js-dash-sdk/package.json index d4f9b0e87a..591e6bca28 100644 --- a/packages/js-dash-sdk/package.json +++ b/packages/js-dash-sdk/package.json @@ -1,6 +1,6 @@ { "name": "dash", - "version": "4.0.0-dev.11", + "version": "4.0.0-dev.12", "description": "Dash library for JavaScript/TypeScript ecosystem (Wallet, DAPI, Primitives, BLS, ...)", "main": "build/index.js", "unpkg": "dist/dash.min.js", diff --git a/packages/js-grpc-common/package.json b/packages/js-grpc-common/package.json index 4b4e4f5cc6..b01d583043 100644 --- a/packages/js-grpc-common/package.json +++ b/packages/js-grpc-common/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/grpc-common", - "version": "1.0.0-dev.11", + "version": "1.0.0-dev.12", "description": "Common GRPC library", "main": "index.js", "scripts": { diff --git a/packages/masternode-reward-shares-contract/Cargo.toml b/packages/masternode-reward-shares-contract/Cargo.toml index 6614dcd9a7..4cde7b83ca 100644 --- a/packages/masternode-reward-shares-contract/Cargo.toml +++ b/packages/masternode-reward-shares-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "masternode-reward-shares-contract" description = "Masternode reward shares data contract schema and tools" -version = "1.0.0-dev.11" +version = "1.0.0-dev.12" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/masternode-reward-shares-contract/package.json b/packages/masternode-reward-shares-contract/package.json index 4a08a070b7..eb1800b06e 100644 --- a/packages/masternode-reward-shares-contract/package.json +++ b/packages/masternode-reward-shares-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/masternode-reward-shares-contract", - "version": "1.0.0-dev.11", + "version": "1.0.0-dev.12", "description": "A contract and helper scripts for reward sharing", "scripts": { "lint": "eslint .", diff --git a/packages/platform-test-suite/package.json b/packages/platform-test-suite/package.json index 60cd7ec22c..c815636db5 100644 --- a/packages/platform-test-suite/package.json +++ b/packages/platform-test-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/platform-test-suite", "private": true, - "version": "1.0.0-dev.11", + "version": "1.0.0-dev.12", "description": "Dash Network end-to-end tests", "scripts": { "test": "yarn exec bin/test.sh", diff --git a/packages/rs-dapi-client/Cargo.toml b/packages/rs-dapi-client/Cargo.toml index 335369e1df..db4679344d 100644 --- a/packages/rs-dapi-client/Cargo.toml +++ b/packages/rs-dapi-client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rs-dapi-client" -version = "1.0.0-dev.11" +version = "1.0.0-dev.12" edition = "2021" [features] diff --git a/packages/rs-dapi-grpc-macros/Cargo.toml b/packages/rs-dapi-grpc-macros/Cargo.toml index acc05db0cc..d6ad568370 100644 --- a/packages/rs-dapi-grpc-macros/Cargo.toml +++ b/packages/rs-dapi-grpc-macros/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc-macros" -version = "1.0.0-dev.11" +version = "1.0.0-dev.12" edition = "2021" description = "Macros used by dapi-grpc. Internal use only." diff --git a/packages/rs-dpp/Cargo.toml b/packages/rs-dpp/Cargo.toml index 8d71a08206..8710052e86 100644 --- a/packages/rs-dpp/Cargo.toml +++ b/packages/rs-dpp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dpp" -version = "1.0.0-dev.11" +version = "1.0.0-dev.12" edition = "2021" rust-version = "1.76" authors = [ diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index 98dcc85595..db8334cc12 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drive-abci" -version = "1.0.0-dev.11" +version = "1.0.0-dev.12" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/rs-drive-proof-verifier/Cargo.toml b/packages/rs-drive-proof-verifier/Cargo.toml index b1afb8ade4..e64bb9aefe 100644 --- a/packages/rs-drive-proof-verifier/Cargo.toml +++ b/packages/rs-drive-proof-verifier/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drive-proof-verifier" -version = "1.0.0-dev.11" +version = "1.0.0-dev.12" edition = "2021" rust-version = "1.76" diff --git a/packages/rs-drive/Cargo.toml b/packages/rs-drive/Cargo.toml index 0c1cb49d73..d2975f1258 100644 --- a/packages/rs-drive/Cargo.toml +++ b/packages/rs-drive/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "drive" description = "Dash drive built on top of GroveDB" -version = "1.0.0-dev.11" +version = "1.0.0-dev.12" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/rs-json-schema-compatibility-validator/Cargo.toml b/packages/rs-json-schema-compatibility-validator/Cargo.toml index 67f1155b7b..46f3faf993 100644 --- a/packages/rs-json-schema-compatibility-validator/Cargo.toml +++ b/packages/rs-json-schema-compatibility-validator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "json-schema-compatibility-validator" -version = "0.25.16-rc.3" +version = "0.25.16-rc.4" edition = "2021" rust-version = "1.76" authors = [ diff --git a/packages/rs-platform-serialization-derive/Cargo.toml b/packages/rs-platform-serialization-derive/Cargo.toml index 006590d310..936f560f59 100644 --- a/packages/rs-platform-serialization-derive/Cargo.toml +++ b/packages/rs-platform-serialization-derive/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization-derive" authors = ["Samuel Westrich "] description = "Bincode serialization and deserialization derivations" -version = "1.0.0-dev.11" +version = "1.0.0-dev.12" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/rs-platform-serialization/Cargo.toml b/packages/rs-platform-serialization/Cargo.toml index 2fcd4d91b9..98db694b06 100644 --- a/packages/rs-platform-serialization/Cargo.toml +++ b/packages/rs-platform-serialization/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization" authors = ["Samuel Westrich "] description = "Bincode based serialization and deserialization" -version = "1.0.0-dev.11" +version = "1.0.0-dev.12" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/rs-platform-value-convertible/Cargo.toml b/packages/rs-platform-value-convertible/Cargo.toml index 26792a1c4d..4dddcb689d 100644 --- a/packages/rs-platform-value-convertible/Cargo.toml +++ b/packages/rs-platform-value-convertible/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-value-convertible" authors = ["Samuel Westrich "] description = "Convertion to and from platform values" -version = "1.0.0-dev.11" +version = "1.0.0-dev.12" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/rs-platform-value/Cargo.toml b/packages/rs-platform-value/Cargo.toml index b98f4fea86..721e57b446 100644 --- a/packages/rs-platform-value/Cargo.toml +++ b/packages/rs-platform-value/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-value" authors = ["Samuel Westrich "] description = "A simple value module" -version = "1.0.0-dev.11" +version = "1.0.0-dev.12" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/rs-platform-version/Cargo.toml b/packages/rs-platform-version/Cargo.toml index bdfe347781..566b7d2faa 100644 --- a/packages/rs-platform-version/Cargo.toml +++ b/packages/rs-platform-version/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-version" authors = ["Samuel Westrich "] description = "Bincode based serialization and deserialization" -version = "1.0.0-dev.11" +version = "1.0.0-dev.12" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/rs-platform-versioning/Cargo.toml b/packages/rs-platform-versioning/Cargo.toml index e91be96f7c..10ba0061cb 100644 --- a/packages/rs-platform-versioning/Cargo.toml +++ b/packages/rs-platform-versioning/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-versioning" authors = ["Samuel Westrich "] description = "Version derivation" -version = "1.0.0-dev.11" +version = "1.0.0-dev.12" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/rs-sdk/Cargo.toml b/packages/rs-sdk/Cargo.toml index 94d42b7bb4..f8a713ba0e 100644 --- a/packages/rs-sdk/Cargo.toml +++ b/packages/rs-sdk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dash-sdk" -version = "1.0.0-dev.11" +version = "1.0.0-dev.12" edition = "2021" [dependencies] diff --git a/packages/simple-signer/Cargo.toml b/packages/simple-signer/Cargo.toml index 0c2464be40..0294a5fda4 100644 --- a/packages/simple-signer/Cargo.toml +++ b/packages/simple-signer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "simple-signer" -version = "1.0.0-dev.11" +version = "1.0.0-dev.12" edition = "2021" rust-version = "1.76" diff --git a/packages/strategy-tests/Cargo.toml b/packages/strategy-tests/Cargo.toml index 2432c02267..5a46f1a165 100644 --- a/packages/strategy-tests/Cargo.toml +++ b/packages/strategy-tests/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "strategy-tests" -version = "1.0.0-dev.11" +version = "1.0.0-dev.12" authors = [ "Samuel Westrich ", "Ivan Shumkov ", diff --git a/packages/wallet-lib/package.json b/packages/wallet-lib/package.json index 17bcb3b929..c75654ab97 100644 --- a/packages/wallet-lib/package.json +++ b/packages/wallet-lib/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wallet-lib", - "version": "8.0.0-dev.11", + "version": "8.0.0-dev.12", "description": "Light wallet library for Dash", "main": "src/index.js", "unpkg": "dist/wallet-lib.min.js", diff --git a/packages/wasm-dpp/Cargo.toml b/packages/wasm-dpp/Cargo.toml index dd1eff352d..387d16d336 100644 --- a/packages/wasm-dpp/Cargo.toml +++ b/packages/wasm-dpp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasm-dpp" -version = "1.0.0-dev.11" +version = "1.0.0-dev.12" edition = "2021" rust-version = "1.76" authors = ["Anton Suprunchuk "] diff --git a/packages/wasm-dpp/package.json b/packages/wasm-dpp/package.json index 96b06dc78a..da0dccc927 100644 --- a/packages/wasm-dpp/package.json +++ b/packages/wasm-dpp/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wasm-dpp", - "version": "1.0.0-dev.11", + "version": "1.0.0-dev.12", "description": "The JavaScript implementation of the Dash Platform Protocol", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/withdrawals-contract/Cargo.toml b/packages/withdrawals-contract/Cargo.toml index 069166f850..a8ca290f5b 100644 --- a/packages/withdrawals-contract/Cargo.toml +++ b/packages/withdrawals-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "withdrawals-contract" description = "Witdrawals data contract schema and tools" -version = "1.0.0-dev.11" +version = "1.0.0-dev.12" edition = "2021" rust-version = "1.76" license = "MIT" diff --git a/packages/withdrawals-contract/package.json b/packages/withdrawals-contract/package.json index ddac67d23d..85a2c05d19 100644 --- a/packages/withdrawals-contract/package.json +++ b/packages/withdrawals-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/withdrawals-contract", - "version": "1.0.0-dev.11", + "version": "1.0.0-dev.12", "description": "Data Contract to manipulate and track withdrawals", "scripts": { "build": "", From 7e1e91c7fabe805ea8c5718e17f6e9687819e22f Mon Sep 17 00:00:00 2001 From: pauldelucia Date: Mon, 29 Apr 2024 18:22:58 +0700 Subject: [PATCH 150/191] feat: make purchase document public --- packages/rs-sdk/src/platform/transition.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/rs-sdk/src/platform/transition.rs b/packages/rs-sdk/src/platform/transition.rs index d8abdb5eb0..ae08111e8f 100644 --- a/packages/rs-sdk/src/platform/transition.rs +++ b/packages/rs-sdk/src/platform/transition.rs @@ -3,7 +3,7 @@ pub mod broadcast; pub(crate) mod broadcast_identity; pub mod broadcast_request; pub(crate) mod context; -mod purchase_document; +pub mod purchase_document; mod put_contract; pub mod put_document; pub mod put_identity; From b47245f8b5f0da6e170615b5254fc55ff1750e8a Mon Sep 17 00:00:00 2001 From: pauldelucia Date: Mon, 29 Apr 2024 18:30:15 +0700 Subject: [PATCH 151/191] feat: make document tranfers public --- packages/rs-sdk/src/platform/transition.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/rs-sdk/src/platform/transition.rs b/packages/rs-sdk/src/platform/transition.rs index ae08111e8f..985c730b05 100644 --- a/packages/rs-sdk/src/platform/transition.rs +++ b/packages/rs-sdk/src/platform/transition.rs @@ -9,7 +9,7 @@ pub mod put_document; pub mod put_identity; pub mod put_settings; pub mod top_up_identity; -mod transfer_document; +pub mod transfer_document; mod txid; mod update_price_of_document; pub mod withdraw_from_identity; From 4ea0310b3987e99682a685c961d363aa850648f1 Mon Sep 17 00:00:00 2001 From: Paul DeLucia <69597248+pauldelucia@users.noreply.github.com> Date: Mon, 29 Apr 2024 18:36:09 +0700 Subject: [PATCH 152/191] feat: make sdk document purchases public (#1832) --- packages/rs-sdk/src/platform/transition.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/rs-sdk/src/platform/transition.rs b/packages/rs-sdk/src/platform/transition.rs index d8abdb5eb0..985c730b05 100644 --- a/packages/rs-sdk/src/platform/transition.rs +++ b/packages/rs-sdk/src/platform/transition.rs @@ -3,13 +3,13 @@ pub mod broadcast; pub(crate) mod broadcast_identity; pub mod broadcast_request; pub(crate) mod context; -mod purchase_document; +pub mod purchase_document; mod put_contract; pub mod put_document; pub mod put_identity; pub mod put_settings; pub mod top_up_identity; -mod transfer_document; +pub mod transfer_document; mod txid; mod update_price_of_document; pub mod withdraw_from_identity; From 4566ad9c496b1e10a68218d476e1c78c45c608dc Mon Sep 17 00:00:00 2001 From: pauldelucia Date: Mon, 29 Apr 2024 22:37:56 +0700 Subject: [PATCH 153/191] feat: make sdk files public --- packages/rs-sdk/src/platform/transition.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/rs-sdk/src/platform/transition.rs b/packages/rs-sdk/src/platform/transition.rs index 985c730b05..7dd65ce9de 100644 --- a/packages/rs-sdk/src/platform/transition.rs +++ b/packages/rs-sdk/src/platform/transition.rs @@ -4,14 +4,14 @@ pub(crate) mod broadcast_identity; pub mod broadcast_request; pub(crate) mod context; pub mod purchase_document; -mod put_contract; +pub mod put_contract; pub mod put_document; pub mod put_identity; pub mod put_settings; pub mod top_up_identity; pub mod transfer_document; mod txid; -mod update_price_of_document; +pub mod update_price_of_document; pub mod withdraw_from_identity; pub use context::*; From d71bfc487718112a0c9c4cb430f98bac99973248 Mon Sep 17 00:00:00 2001 From: pauldelucia Date: Tue, 30 Apr 2024 18:04:44 +0700 Subject: [PATCH 154/191] feat: serialize for indexes and change error messages to strings --- .../rs-dpp/src/data_contract/document_type/index/mod.rs | 4 ++-- packages/rs-drive/src/error/query.rs | 2 +- packages/rs-drive/src/query/mod.rs | 7 ++++--- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/packages/rs-dpp/src/data_contract/document_type/index/mod.rs b/packages/rs-dpp/src/data_contract/document_type/index/mod.rs index 9213e18cbb..752f491d63 100644 --- a/packages/rs-dpp/src/data_contract/document_type/index/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/index/mod.rs @@ -20,7 +20,7 @@ use std::{collections::BTreeMap, convert::TryFrom}; pub mod random_index; // Indices documentation: https://dashplatform.readme.io/docs/reference-data-contracts#document-indices -#[derive(Clone, Debug, PartialEq, Eq)] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct Index { pub name: String, pub properties: Vec, @@ -53,7 +53,7 @@ impl Index { } } -#[derive(Clone, Debug, PartialEq, Eq, Hash)] +#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub struct IndexProperty { pub name: String, pub ascending: bool, diff --git a/packages/rs-drive/src/error/query.rs b/packages/rs-drive/src/error/query.rs index f472519ef0..8b1db734ce 100644 --- a/packages/rs-drive/src/error/query.rs +++ b/packages/rs-drive/src/error/query.rs @@ -96,7 +96,7 @@ pub enum QuerySyntaxError { /// Where clause on non indexed property error #[error("where clause on non indexed property error: {0}")] - WhereClauseOnNonIndexedProperty(&'static str), + WhereClauseOnNonIndexedProperty(String), /// Query is too far from index error #[error("query is too far from index: {0}")] QueryTooFarFromIndex(&'static str), diff --git a/packages/rs-drive/src/query/mod.rs b/packages/rs-drive/src/query/mod.rs index 5db17e742c..2f6db41c17 100644 --- a/packages/rs-drive/src/query/mod.rs +++ b/packages/rs-drive/src/query/mod.rs @@ -1135,9 +1135,10 @@ impl<'a> DriveQuery<'a> { platform_version, )? .ok_or(Error::Query( - QuerySyntaxError::WhereClauseOnNonIndexedProperty( - "query must be for valid indexes", - ), + QuerySyntaxError::WhereClauseOnNonIndexedProperty(format!( + "query must be for valid indexes, valid indexes are: {:?}", + self.document_type.indices() + )), ))?; if difference > defaults::MAX_INDEX_DIFFERENCE { return Err(Error::Query(QuerySyntaxError::QueryTooFarFromIndex( From 5612b31013242be2e9cedacc3d12872afd62c788 Mon Sep 17 00:00:00 2001 From: pshenmic Date: Sun, 5 May 2024 22:05:43 +0700 Subject: [PATCH 155/191] fix(platform): npm audit security fix (#1836) --- .pnp.cjs | 86 +++++++++++++++-- .../ejs-npm-3.1.8-30583753fc-879f84c8ee.zip | Bin 46500 -> 0 bytes package.json | 1 - yarn.lock | 87 ++++++++++++++++-- 4 files changed, 159 insertions(+), 15 deletions(-) delete mode 100644 .yarn/cache/ejs-npm-3.1.8-30583753fc-879f84c8ee.zip diff --git a/.pnp.cjs b/.pnp.cjs index 93a8e6f3ef..7f355456bd 100755 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -3819,7 +3819,7 @@ const RAW_RUNTIME_STATE = ["clean-stack", "npm:3.0.1"],\ ["cli-progress", "npm:3.12.0"],\ ["debug", "virtual:87db25c7c5e6b25bbc12571091cdabc648b79d427ab445d1714ccfdcdfb3265c9de6561ca760cc3de470037cbedf3af4be56ba3b684b3a1c01d4c9c2fd55a741#npm:4.3.4"],\ - ["ejs", "npm:3.1.8"],\ + ["ejs", "npm:3.1.10"],\ ["get-package-type", "npm:0.1.0"],\ ["globby", "npm:11.1.0"],\ ["hyperlinker", "npm:1.0.0"],\ @@ -3853,7 +3853,7 @@ const RAW_RUNTIME_STATE = ["clean-stack", "npm:3.0.1"],\ ["cli-progress", "npm:3.12.0"],\ ["debug", "virtual:87db25c7c5e6b25bbc12571091cdabc648b79d427ab445d1714ccfdcdfb3265c9de6561ca760cc3de470037cbedf3af4be56ba3b684b3a1c01d4c9c2fd55a741#npm:4.3.4"],\ - ["ejs", "npm:3.1.8"],\ + ["ejs", "npm:3.1.10"],\ ["get-package-type", "npm:0.1.0"],\ ["globby", "npm:11.1.0"],\ ["hyperlinker", "npm:1.0.0"],\ @@ -3874,6 +3874,41 @@ const RAW_RUNTIME_STATE = ["wrap-ansi", "npm:7.0.0"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:3.26.5", {\ + "packageLocation": "./.yarn/cache/@oclif-core-npm-3.26.5-02719845fd-4e2aa1a945.zip/node_modules/@oclif/core/",\ + "packageDependencies": [\ + ["@oclif/core", "npm:3.26.5"],\ + ["@types/cli-progress", "npm:3.11.5"],\ + ["ansi-escapes", "npm:4.3.2"],\ + ["ansi-styles", "npm:4.3.0"],\ + ["cardinal", "npm:2.1.1"],\ + ["chalk", "npm:4.1.2"],\ + ["clean-stack", "npm:3.0.1"],\ + ["cli-progress", "npm:3.12.0"],\ + ["color", "npm:4.2.3"],\ + ["debug", "virtual:87db25c7c5e6b25bbc12571091cdabc648b79d427ab445d1714ccfdcdfb3265c9de6561ca760cc3de470037cbedf3af4be56ba3b684b3a1c01d4c9c2fd55a741#npm:4.3.4"],\ + ["ejs", "npm:3.1.10"],\ + ["get-package-type", "npm:0.1.0"],\ + ["globby", "npm:11.1.0"],\ + ["hyperlinker", "npm:1.0.0"],\ + ["indent-string", "npm:4.0.0"],\ + ["is-wsl", "npm:2.2.0"],\ + ["js-yaml", "npm:3.14.1"],\ + ["minimatch", "npm:9.0.4"],\ + ["natural-orderby", "npm:2.0.3"],\ + ["object-treeify", "npm:1.1.33"],\ + ["password-prompt", "npm:1.1.3"],\ + ["slice-ansi", "npm:4.0.0"],\ + ["string-width", "npm:4.2.3"],\ + ["strip-ansi", "npm:6.0.1"],\ + ["supports-color", "npm:8.1.1"],\ + ["supports-hyperlinks", "npm:2.3.0"],\ + ["widest-line", "npm:3.1.0"],\ + ["wordwrap", "npm:1.0.0"],\ + ["wrap-ansi", "npm:7.0.0"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["@oclif/plugin-help", [\ @@ -7635,6 +7670,15 @@ const RAW_RUNTIME_STATE = ["color-string", "npm:1.6.0"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:4.2.3", {\ + "packageLocation": "./.yarn/cache/color-npm-4.2.3-4a23227581-b23f5e500a.zip/node_modules/color/",\ + "packageDependencies": [\ + ["color", "npm:4.2.3"],\ + ["color-convert", "npm:2.0.1"],\ + ["color-string", "npm:1.9.1"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["color-convert", [\ @@ -7680,6 +7724,15 @@ const RAW_RUNTIME_STATE = ["simple-swizzle", "npm:0.2.2"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:1.9.1", {\ + "packageLocation": "./.yarn/cache/color-string-npm-1.9.1-dc020e56be-72aa0b81ee.zip/node_modules/color-string/",\ + "packageDependencies": [\ + ["color-string", "npm:1.9.1"],\ + ["color-name", "npm:1.1.4"],\ + ["simple-swizzle", "npm:0.2.2"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["color-support", [\ @@ -8410,7 +8463,7 @@ const RAW_RUNTIME_STATE = ["@dashevo/masternode-reward-shares-contract", "workspace:packages/masternode-reward-shares-contract"],\ ["@dashevo/wallet-lib", "workspace:packages/wallet-lib"],\ ["@dashevo/withdrawals-contract", "workspace:packages/withdrawals-contract"],\ - ["@oclif/core", "npm:3.10.8"],\ + ["@oclif/core", "npm:3.26.5"],\ ["@oclif/plugin-help", "npm:6.0.5"],\ ["ajv", "npm:8.12.0"],\ ["ajv-formats", "virtual:e822c5b02ef2b3c5fb9c8d88d5e0ca208365bff76f80510f4ccf9b1de44e2078264bcb00d3cdd5e193c256e9ab81e27c34fcfb1ad3a0e8c1dc8fa0066c78c468#npm:2.1.1"],\ @@ -9075,10 +9128,10 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["ejs", [\ - ["npm:3.1.8", {\ - "packageLocation": "./.yarn/cache/ejs-npm-3.1.8-30583753fc-879f84c8ee.zip/node_modules/ejs/",\ + ["npm:3.1.10", {\ + "packageLocation": "./.yarn/cache/ejs-npm-3.1.10-4e8cf4bdc1-a9cb7d7cd1.zip/node_modules/ejs/",\ "packageDependencies": [\ - ["ejs", "npm:3.1.8"],\ + ["ejs", "npm:3.1.10"],\ ["jake", "npm:10.8.5"]\ ],\ "linkType": "HARD"\ @@ -13517,7 +13570,7 @@ const RAW_RUNTIME_STATE = ["binaryextensions", "npm:4.18.0"],\ ["commondir", "npm:1.0.1"],\ ["deep-extend", "npm:0.6.0"],\ - ["ejs", "npm:3.1.8"],\ + ["ejs", "npm:3.1.10"],\ ["globby", "npm:11.1.0"],\ ["isbinaryfile", "npm:5.0.0"],\ ["mem-fs", "npm:2.2.1"],\ @@ -13540,7 +13593,7 @@ const RAW_RUNTIME_STATE = ["binaryextensions", "npm:4.18.0"],\ ["commondir", "npm:1.0.1"],\ ["deep-extend", "npm:0.6.0"],\ - ["ejs", "npm:3.1.8"],\ + ["ejs", "npm:3.1.10"],\ ["globby", "npm:11.1.0"],\ ["isbinaryfile", "npm:5.0.0"],\ ["mem-fs", null],\ @@ -13813,6 +13866,14 @@ const RAW_RUNTIME_STATE = ["brace-expansion", "npm:2.0.1"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:9.0.4", {\ + "packageLocation": "./.yarn/cache/minimatch-npm-9.0.4-7be5a33efc-4cdc18d112.zip/node_modules/minimatch/",\ + "packageDependencies": [\ + ["minimatch", "npm:9.0.4"],\ + ["brace-expansion", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["minimist", [\ @@ -15366,6 +15427,15 @@ const RAW_RUNTIME_STATE = ["cross-spawn", "npm:6.0.5"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:1.1.3", {\ + "packageLocation": "./.yarn/cache/password-prompt-npm-1.1.3-0190666768-1cf7001e66.zip/node_modules/password-prompt/",\ + "packageDependencies": [\ + ["password-prompt", "npm:1.1.3"],\ + ["ansi-escapes", "npm:4.3.2"],\ + ["cross-spawn", "npm:7.0.3"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["path-browserify", [\ diff --git a/.yarn/cache/ejs-npm-3.1.8-30583753fc-879f84c8ee.zip b/.yarn/cache/ejs-npm-3.1.8-30583753fc-879f84c8ee.zip deleted file mode 100644 index 368ffb9272af1292ae8c0e7fdacc7db715877d10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46500 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�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 L_O-R{kJ0}F7oMI? diff --git a/package.json b/package.json index b31de1b640..0a15524e42 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,6 @@ "resolutions": { "elliptic": "^6.5.4", "bn.js": "4.12.0", - "ejs": "^3.1.7", "fast-json-patch": "^3.1.1", "node-tar": "^6.2.1", "oclif@3.4.2": "patch:oclif@npm:3.4.2#.yarn/patches/oclif-npm-3.4.2-a655d32eed.patch", diff --git a/yarn.lock b/yarn.lock index 0c9f1d5de1..218479264c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2591,7 +2591,7 @@ __metadata: languageName: node linkType: hard -"@oclif/core@npm:^3.0.4, @oclif/core@npm:^3.10.8, @oclif/core@npm:^3.3.1, @oclif/core@npm:^3.9.1": +"@oclif/core@npm:^3.0.4, @oclif/core@npm:^3.3.1, @oclif/core@npm:^3.9.1": version: 3.10.8 resolution: "@oclif/core@npm:3.10.8" dependencies: @@ -2625,6 +2625,42 @@ __metadata: languageName: node linkType: hard +"@oclif/core@npm:^3.10.8": + version: 3.26.5 + resolution: "@oclif/core@npm:3.26.5" + dependencies: + "@types/cli-progress": "npm:^3.11.5" + ansi-escapes: "npm:^4.3.2" + ansi-styles: "npm:^4.3.0" + cardinal: "npm:^2.1.1" + chalk: "npm:^4.1.2" + clean-stack: "npm:^3.0.1" + cli-progress: "npm:^3.12.0" + color: "npm:^4.2.3" + debug: "npm:^4.3.4" + ejs: "npm:^3.1.10" + get-package-type: "npm:^0.1.0" + globby: "npm:^11.1.0" + hyperlinker: "npm:^1.0.0" + indent-string: "npm:^4.0.0" + is-wsl: "npm:^2.2.0" + js-yaml: "npm:^3.14.1" + minimatch: "npm:^9.0.4" + natural-orderby: "npm:^2.0.3" + object-treeify: "npm:^1.1.33" + password-prompt: "npm:^1.1.3" + slice-ansi: "npm:^4.0.0" + string-width: "npm:^4.2.3" + strip-ansi: "npm:^6.0.1" + supports-color: "npm:^8.1.1" + supports-hyperlinks: "npm:^2.2.0" + widest-line: "npm:^3.1.0" + wordwrap: "npm:^1.0.0" + wrap-ansi: "npm:^7.0.0" + checksum: 4e2aa1a9453d15e6bbb1b321b4b0e556ab36b02bd65d80632722e497e25baf661547993bf410a41e4a129518e66771a8608b18c9a16601be2be516eb5397f5e6 + languageName: node + linkType: hard + "@oclif/plugin-help@npm:^5.2.14": version: 5.2.20 resolution: "@oclif/plugin-help@npm:5.2.20" @@ -3152,7 +3188,7 @@ __metadata: languageName: node linkType: hard -"@types/cli-progress@npm:^3.11.0": +"@types/cli-progress@npm:^3.11.0, @types/cli-progress@npm:^3.11.5": version: 3.11.5 resolution: "@types/cli-progress@npm:3.11.5" dependencies: @@ -5597,6 +5633,16 @@ __metadata: languageName: node linkType: hard +"color-string@npm:^1.9.0": + version: 1.9.1 + resolution: "color-string@npm:1.9.1" + dependencies: + color-name: "npm:^1.0.0" + simple-swizzle: "npm:^0.2.2" + checksum: 72aa0b81ee71b3f4fb1ac9cd839cdbd7a011a7d318ef58e6cb13b3708dca75c7e45029697260488709f1b1c7ac4e35489a87e528156c1e365917d1c4ccb9b9cd + languageName: node + linkType: hard + "color-support@npm:^1.1.2": version: 1.1.3 resolution: "color-support@npm:1.1.3" @@ -5616,6 +5662,16 @@ __metadata: languageName: node linkType: hard +"color@npm:^4.2.3": + version: 4.2.3 + resolution: "color@npm:4.2.3" + dependencies: + color-convert: "npm:^2.0.1" + color-string: "npm:^1.9.0" + checksum: b23f5e500a79ea22428db43d1a70642d983405c0dd1f95ef59dbdb9ba66afbb4773b334fa0b75bb10b0552fd7534c6b28d4db0a8b528f91975976e70973c0152 + languageName: node + linkType: hard + "colorette@npm:^2.0.14, colorette@npm:^2.0.19, colorette@npm:^2.0.7": version: 2.0.20 resolution: "colorette@npm:2.0.20" @@ -6775,14 +6831,14 @@ __metadata: languageName: node linkType: hard -"ejs@npm:^3.1.7": - version: 3.1.8 - resolution: "ejs@npm:3.1.8" +"ejs@npm:^3.1.10, ejs@npm:^3.1.8, ejs@npm:^3.1.9": + version: 3.1.10 + resolution: "ejs@npm:3.1.10" dependencies: jake: "npm:^10.8.5" bin: ejs: bin/cli.js - checksum: 879f84c8ee56d06dea7b47a8b493e1b398dba578ec7a701660cf77c8a6d565b932c5896639d1dc4a3be29204eccdb70ee4e1bdf634647c2490227f727d5d6a3d + checksum: a9cb7d7cd13b7b1cd0be5c4788e44dd10d92f7285d2f65b942f33e127230c054f99a42db4d99f766d8dbc6c57e94799593ee66a14efd7c8dd70c4812bf6aa384 languageName: node linkType: hard @@ -10756,6 +10812,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:^9.0.4": + version: 9.0.4 + resolution: "minimatch@npm:9.0.4" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 4cdc18d112b164084513e890d6323370db14c22249d536ad1854539577a895e690a27513dc346392f61a4a50afbbd8abc88f3f25558bfbbbb862cd56508b20f5 + languageName: node + linkType: hard + "minimist-options@npm:4.1.0": version: 4.1.0 resolution: "minimist-options@npm:4.1.0" @@ -12190,6 +12255,16 @@ __metadata: languageName: node linkType: hard +"password-prompt@npm:^1.1.3": + version: 1.1.3 + resolution: "password-prompt@npm:1.1.3" + dependencies: + ansi-escapes: "npm:^4.3.2" + cross-spawn: "npm:^7.0.3" + checksum: 1cf7001e66868b2ed7a03e036bc2f1dd45eb6dc8fee7e3e2056370057c484be25e7468fee00a1378e1ee8eca77ba79f48bee5ce15dcb464413987ace63c68b35 + languageName: node + linkType: hard + "path-browserify@npm:^1.0.1": version: 1.0.1 resolution: "path-browserify@npm:1.0.1" From 8073c3f2c9a9d1f81a8acad7f23f300381f10cc9 Mon Sep 17 00:00:00 2001 From: pshenmic Date: Mon, 6 May 2024 15:34:08 +0700 Subject: [PATCH 156/191] feat(dashmate): handle docker pull error on images update (#1685) --- packages/dashmate/src/commands/update.js | 8 +++- .../dashmate/src/update/updateNodeFactory.js | 43 +++++++++++++++---- .../test/unit/commands/update.spec.js | 40 +++++++++++++++++ 3 files changed, 82 insertions(+), 9 deletions(-) diff --git a/packages/dashmate/src/commands/update.js b/packages/dashmate/src/commands/update.js index 8ba5b774d2..dce6b2c679 100644 --- a/packages/dashmate/src/commands/update.js +++ b/packages/dashmate/src/commands/update.js @@ -35,6 +35,12 @@ export default class UpdateCommand extends ConfigBaseCommand { ) { const updateInfo = await updateNode(config); + const colors = { + updated: chalk.yellow, + 'up to date': chalk.green, + error: chalk.red, + }; + // Draw table or show json printArrayOfObjects(updateInfo .reduce( @@ -43,7 +49,7 @@ export default class UpdateCommand extends ConfigBaseCommand { }) => ([ ...acc, format === OUTPUT_FORMATS.PLAIN - ? { Service: title, Image: image, Updated: updated ? chalk.yellow('updated') : chalk.green('up to date') } + ? { Service: title, Image: image, Updated: colors[updated](updated) } : { name, title, updated, image, }, diff --git a/packages/dashmate/src/update/updateNodeFactory.js b/packages/dashmate/src/update/updateNodeFactory.js index 79996a2511..9ce4fb126a 100644 --- a/packages/dashmate/src/update/updateNodeFactory.js +++ b/packages/dashmate/src/update/updateNodeFactory.js @@ -19,10 +19,17 @@ export default function updateNodeFactory(getServiceList, docker) { return Promise.all( lodash.uniqBy(services, 'image') - .map(async ({ name, image, title }) => new Promise((resolve, reject) => { + .map(async ({ name, image, title }) => new Promise((resolve) => { docker.pull(image, (err, stream) => { if (err) { - reject(err); + if (process.env.DEBUG) { + // eslint-disable-next-line no-console + console.error(`Failed to update ${name} service, image ${image}, error: ${err}`); + } + + resolve({ + name, title, image, updated: 'error', + }); } else { let updated = null; @@ -33,15 +40,35 @@ export default function updateNodeFactory(getServiceList, docker) { .trim() .split('\r\n') .map((str) => JSON.parse(str)) - .filter((obj) => obj.status.startsWith('Status: ')); + .filter((obj) => obj?.status?.startsWith('Status: ')); + + if (status) { + if (status.status.includes('Image is up to date for')) { + updated = 'up to date'; + } else if (status.status.includes('Downloaded newer image for')) { + updated = 'updated'; + } + } else { + if (process.env.DEBUG) { + // eslint-disable-next-line no-console + console.error('Failed to read docker json data, status not found'); + } - if (status?.status.includes('Image is up to date for')) { - updated = false; - } else if (status?.status.includes('Downloaded newer image for')) { - updated = true; + resolve({ + name, title, image, updated: 'error', + }); } }); - stream.on('error', reject); + stream.on('error', () => { + if (process.env.DEBUG) { + // eslint-disable-next-line no-console + console.error(`Failed to update ${name} service, image ${image}, error: ${err}`); + } + + resolve({ + name, title, image, updated: 'error', + }); + }); stream.on('end', () => resolve({ name, title, image, updated, })); diff --git a/packages/dashmate/test/unit/commands/update.spec.js b/packages/dashmate/test/unit/commands/update.spec.js index ecf95ad7a3..12536a2293 100644 --- a/packages/dashmate/test/unit/commands/update.spec.js +++ b/packages/dashmate/test/unit/commands/update.spec.js @@ -42,4 +42,44 @@ describe('Update command', () => { expect(mockGetServicesList).to.have.been.calledOnceWithExactly(config); expect(mockDocker.pull).to.have.been.calledOnceWith(mockServicesList[0].image); }); + + it('should update other services if one of them fails', async function it() { + const command = new UpdateCommand(); + mockDockerResponse = { status: 'Status: Image is up to date for' }; + mockServicesList = [{ name: 'fake', image: 'fake', title: 'FAKE' }, + { name: 'fake_docker_pull_error', image: 'fake_err_image', title: 'FAKE_ERROR' }]; + + // test docker.pull returns error + mockDocker = { + pull: this.sinon.stub() + .callsFake((image, cb) => (image === mockServicesList[1].image ? cb(new Error(), null) + : cb(false, mockDockerStream))), + }; + + let updateNode = updateNodeFactory(mockGetServicesList, mockDocker); + + await command.runWithDependencies({}, { format: 'json' }, mockDocker, config, updateNode); + + expect(mockGetServicesList).to.have.been.calledOnceWithExactly(config); + expect(mockDocker.pull.firstCall.firstArg).to.equal(mockServicesList[0].image); + expect(mockDocker.pull.secondCall.firstArg).to.equal(mockServicesList[1].image); + + // test docker.pull stream returns error + mockDocker = { pull: this.sinon.stub().callsFake((image, cb) => cb(false, mockDockerStream)) }; + mockDockerStream = { + on: this.sinon.stub().callsFake((channel, cb) => (channel === 'error' ? cb(new Error()) : null)), + }; + + // reset + mockGetServicesList = this.sinon.stub().callsFake(() => mockServicesList); + mockDocker = { pull: this.sinon.stub().callsFake((image, cb) => cb(false, mockDockerStream)) }; + + updateNode = updateNodeFactory(mockGetServicesList, mockDocker); + + await command.runWithDependencies({}, { format: 'json' }, mockDocker, config, updateNode); + + expect(mockGetServicesList).to.have.been.calledOnceWithExactly(config); + expect(mockDocker.pull.firstCall.firstArg).to.equal(mockServicesList[0].image); + expect(mockDocker.pull.secondCall.firstArg).to.equal(mockServicesList[1].image); + }); }); From 751ee6e646475c388be7ca62deab32ae14b9b8f6 Mon Sep 17 00:00:00 2001 From: pauldelucia Date: Tue, 7 May 2024 17:21:23 +0530 Subject: [PATCH 157/191] fix a test --- packages/rs-drive/src/query/test_index.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/rs-drive/src/query/test_index.rs b/packages/rs-drive/src/query/test_index.rs index d0b4b12cb6..a721f2f8a2 100644 --- a/packages/rs-drive/src/query/test_index.rs +++ b/packages/rs-drive/src/query/test_index.rs @@ -164,7 +164,7 @@ mod tests { .find_best_index(platform_version) .expect_err("expected to not find index"); assert!( - matches!(error, Error::Query(QuerySyntaxError::WhereClauseOnNonIndexedProperty(message)) if message == "query must be for valid indexes") + matches!(error, Error::Query(QuerySyntaxError::WhereClauseOnNonIndexedProperty(message)) if message.contains("query must be for valid indexes")) ) } } From c7a1b0fa914edc9cb71ea419385a5cb44e2ba6b1 Mon Sep 17 00:00:00 2001 From: Paul DeLucia <69597248+pauldelucia@users.noreply.github.com> Date: Tue, 7 May 2024 22:36:30 +0530 Subject: [PATCH 158/191] feat: use all current identities for strategy test state transitions (#1820) --- packages/strategy-tests/src/lib.rs | 41 ++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/packages/strategy-tests/src/lib.rs b/packages/strategy-tests/src/lib.rs index 4ed118819c..29ce98f09c 100644 --- a/packages/strategy-tests/src/lib.rs +++ b/packages/strategy-tests/src/lib.rs @@ -42,8 +42,8 @@ use dpp::state_transition::data_contract_update_transition::methods::DataContrac use operations::{DataContractUpdateAction, DataContractUpdateOp}; use platform_version::TryFromPlatformVersioned; use rand::prelude::StdRng; +use rand::seq::SliceRandom; use rand::Rng; -use tracing::error; use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet}; use bincode::{Decode, Encode}; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; @@ -413,7 +413,7 @@ impl Strategy { ) { Ok(transitions) => transitions, Err(e) => { - error!("identity_state_transitions_for_block error: {}", e); + tracing::error!("identity_state_transitions_for_block error: {}", e); return (vec![], finalize_block_operations, vec![]); } }; @@ -1202,15 +1202,17 @@ impl Strategy { ) { Ok(contract_factory) => contract_factory, Err(e) => { - error!("Failed to get DataContractFactory while creating random contract: {e}"); + tracing::error!("Failed to get DataContractFactory while creating random contract: {e}"); continue; } }; // Create `count` ContractCreate transitions and push to operations vec for _ in 0..count { - // Get the contract owner_id from loaded_identity and loaded_identity nonce - let identity = ¤t_identities[0]; + // Get the contract owner_id from a random current_identity and identity nonce + let identity = current_identities + .choose(rng) + .expect("Expected to get an identity for ContractCreate"); let identity_nonce = identity_nonce_counter.entry(identity.id()).or_default(); *identity_nonce += 1; @@ -1242,7 +1244,7 @@ impl Strategy { )) } Err(e) => { - error!( + tracing::error!( "Error generating random document type: {:?}", e ); @@ -1261,7 +1263,7 @@ impl Strategy { ) { Ok(contract) => contract, Err(e) => { - error!("Failed to create random data contract: {e}"); + tracing::error!("Failed to create random data contract: {e}"); continue; } }; @@ -1271,7 +1273,9 @@ impl Strategy { { Ok(transition) => transition, Err(e) => { - error!("Failed to create ContractCreate transition: {e}"); + tracing::error!( + "Failed to create ContractCreate transition: {e}" + ); continue; } }; @@ -1293,7 +1297,7 @@ impl Strategy { fn(Identifier, String) -> Result, >, ) { - error!("Error signing state transition: {:?}", e); + tracing::error!("Error signing state transition: {:?}", e); } operations.push(state_transition); @@ -1327,7 +1331,13 @@ impl Strategy { ); contract_ref.increment_version(); - let identity = ¤t_identities[0]; + let identity = current_identities + .iter() + .find(|identity| { + identity.id() == contract_ref.owner_id() + }) + .or_else(|| current_identities.choose(rng)).expect("Expected to get an identity for DataContractUpdate"); + let identity_contract_nonce = contract_nonce_counter .entry((identity.id(), contract_ref.id())) .or_default(); @@ -1336,7 +1346,7 @@ impl Strategy { // Prepare the DataContractUpdateTransition with the updated contract_ref match DataContractUpdateTransition::try_from_platform_versioned((DataContract::V0(contract_ref.clone()), *identity_contract_nonce), platform_version) { Ok(data_contract_update_transition) => { - let identity_public_key = current_identities[0] + let identity_public_key = identity .get_first_public_key_matching( Purpose::AUTHENTICATION, HashSet::from([SecurityLevel::CRITICAL]), @@ -1356,15 +1366,18 @@ impl Strategy { operations.push(state_transition); }, - Err(e) => error!("Error converting data contract to update transition: {:?}", e), + Err(e) => tracing::error!("Error converting data contract to update transition: {:?}", e), } } Err(e) => { - error!("Error generating random document type: {:?}", e) + tracing::error!( + "Error generating random document type: {:?}", + e + ) } } } else { - // Handle the case where the contract is not found in known_contracts + tracing::error!("Contract not found in known_contracts"); } } } From 2b5626363870d6bc340bb383ee1f9178d98367fa Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Tue, 7 May 2024 19:42:22 +0200 Subject: [PATCH 159/191] refactor(platform)!: document creation/update/deletion does not refetch contract (#1840) --- .../create_genesis_state/v0/mod.rs | 25 +- .../state_transitions/documents_batch/mod.rs | 26 +- .../tests/strategy_tests/main.rs | 4 +- .../tests/strategy_tests/query.rs | 2 +- .../drive/batch/drive_op_batch/document.rs | 352 ++++-------------- .../src/drive/batch/drive_op_batch/mod.rs | 56 ++- .../document/document_create_transition.rs | 9 +- .../document/document_delete_transition.rs | 18 +- .../document/document_purchase_transition.rs | 7 +- .../document/document_replace_transition.rs | 7 +- .../document/document_transfer_transition.rs | 7 +- .../document_update_price_transition.rs | 7 +- .../delete_document_for_contract/mod.rs | 3 +- .../delete_document_for_contract/v0/mod.rs | 3 +- .../mod.rs | 3 +- .../v0/mod.rs | 3 +- .../delete_document_for_contract_id/mod.rs | 5 +- .../delete_document_for_contract_id/v0/mod.rs | 7 +- .../mod.rs | 5 +- .../v0/mod.rs | 7 +- .../mod.rs | 3 +- .../v0/mod.rs | 3 +- .../mod.rs | 3 +- .../v0/mod.rs | 3 +- .../rs-drive/src/drive/document/delete/mod.rs | 29 -- .../mod.rs | 3 +- .../v0/mod.rs | 3 +- .../rs-drive/src/drive/document/update/mod.rs | 4 +- .../drive/object_size_info/contract_info.rs | 133 +++++++ .../src/drive/object_size_info/mod.rs | 31 +- packages/rs-sdk/src/platform/fetch_many.rs | 2 +- 31 files changed, 326 insertions(+), 447 deletions(-) create mode 100644 packages/rs-drive/src/drive/object_size_info/contract_info.rs diff --git a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs index 83a50e457d..73795a0aab 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs @@ -49,7 +49,9 @@ use drive::drive::batch::{ DataContractOperationType, DocumentOperationType, DriveOperation, IdentityOperationType, }; -use drive::drive::object_size_info::{DocumentAndContractInfo, DocumentInfo, OwnedDocumentInfo}; +use drive::drive::object_size_info::{ + DataContractInfo, DocumentInfo, DocumentTypeInfo, OwnedDocumentInfo, +}; use drive::query::TransactionArg; use std::borrow::Cow; use std::collections::BTreeMap; @@ -267,18 +269,15 @@ impl Platform { let document_type = contract.document_type_for_name("domain")?; - let operation = - DriveOperation::DocumentOperation(DocumentOperationType::AddDocumentForContract { - document_and_contract_info: DocumentAndContractInfo { - owned_document_info: OwnedDocumentInfo { - document_info: DocumentInfo::DocumentOwnedInfo((document, None)), - owner_id: None, - }, - contract, - document_type, - }, - override_document: false, - }); + let operation = DriveOperation::DocumentOperation(DocumentOperationType::AddDocument { + owned_document_info: OwnedDocumentInfo { + document_info: DocumentInfo::DocumentOwnedInfo((document, None)), + owner_id: None, + }, + contract_info: DataContractInfo::BorrowedDataContract(contract), + document_type_info: DocumentTypeInfo::DocumentTypeRef(document_type), + override_document: false, + }); operations.push(operation); diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs index 4926564cbb..da5d970161 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs @@ -732,7 +732,7 @@ mod tests { assert_eq!(processing_result.valid_count(), 1); - assert_eq!(processing_result.aggregated_fees().processing_fee, 5081030); + assert_eq!(processing_result.aggregated_fees().processing_fee, 3810570); } #[test] @@ -2014,7 +2014,7 @@ mod tests { assert_eq!(processing_result.aggregated_fees().storage_fee, 0); // There is no storage fee, as there are no indexes that will change - assert_eq!(processing_result.aggregated_fees().processing_fee, 5609930); + assert_eq!(processing_result.aggregated_fees().processing_fee, 4926670); } #[test] @@ -2205,7 +2205,7 @@ mod tests { Some(14992395) ); - assert_eq!(processing_result.aggregated_fees().processing_fee, 9357180); + assert_eq!(processing_result.aggregated_fees().processing_fee, 8622720); let query_sender_results = platform .drive @@ -2742,7 +2742,7 @@ mod tests { assert_eq!(processing_result.valid_count(), 1); - assert_eq!(processing_result.aggregated_fees().processing_fee, 10283900); + assert_eq!(processing_result.aggregated_fees().processing_fee, 9549440); let query_sender_results = platform .drive @@ -3145,7 +3145,7 @@ mod tests { assert_eq!(processing_result.valid_count(), 1); - assert_eq!(processing_result.aggregated_fees().processing_fee, 6814950); + assert_eq!(processing_result.aggregated_fees().processing_fee, 6075290); let query_sender_results = platform .drive @@ -3266,11 +3266,11 @@ mod tests { .change(), &BalanceChange::RemoveFromBalance { required_removed_balance: 123579000, - desired_removed_balance: 128673220, + desired_removed_balance: 127933560, } ); - let original_creation_cost = 128673220; + let original_creation_cost = 127933560; platform .drive @@ -3397,7 +3397,7 @@ mod tests { None ); - assert_eq!(processing_result.aggregated_fees().processing_fee, 6814950); + assert_eq!(processing_result.aggregated_fees().processing_fee, 6075290); let seller_balance = platform .drive @@ -3408,7 +3408,7 @@ mod tests { // the seller should have received 0.1 and already had 0.1 minus the processing fee and storage fee assert_eq!( seller_balance, - dash_to_credits!(0.1) - 6814950 - 216000 - original_creation_cost + dash_to_credits!(0.1) - 6075290 - 216000 - original_creation_cost ); let query_sender_results = platform @@ -3503,7 +3503,7 @@ mod tests { assert_eq!(processing_result.aggregated_fees().storage_fee, 64611000); - assert_eq!(processing_result.aggregated_fees().processing_fee, 10873700); + assert_eq!(processing_result.aggregated_fees().processing_fee, 10134040); assert_eq!( processing_result @@ -3537,7 +3537,7 @@ mod tests { // the seller should have received 0.1 and already had 0.1 minus the processing fee and storage fee assert_eq!( seller_balance, - dash_to_credits!(0.2) - 6814950 - 216000 - original_creation_cost + 22704503 + dash_to_credits!(0.2) - 6075290 - 216000 - original_creation_cost + 22704503 ); let buyers_balance = platform @@ -3547,7 +3547,7 @@ mod tests { .expect("expected that purchaser exists"); // the buyer payed 0.1, but also storage and processing fees - assert_eq!(buyers_balance, dash_to_credits!(0.9) - 10873700 - 64611000); + assert_eq!(buyers_balance, dash_to_credits!(0.9) - 10134040 - 64611000); } #[test] @@ -4413,7 +4413,7 @@ mod tests { assert_eq!(processing_result.valid_count(), 1); - assert_eq!(processing_result.aggregated_fees().processing_fee, 6814950); + assert_eq!(processing_result.aggregated_fees().processing_fee, 6075290); let query_sender_results = platform .drive diff --git a/packages/rs-drive-abci/tests/strategy_tests/main.rs b/packages/rs-drive-abci/tests/strategy_tests/main.rs index 812cf5f846..43ea171e36 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/main.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/main.rs @@ -1778,7 +1778,7 @@ mod tests { .unwrap() .unwrap() ), - "c0c1f59b535f358448a33c20b419b93bcfa12b05b221f77a7347892f48ca2f16".to_string() + "10fbe38850d752b491305b2587468788acbd6dd130272c5a8844d0da05e3a9cf".to_string() ) } @@ -1903,7 +1903,7 @@ mod tests { .unwrap() .unwrap() ), - "a7be306dcdf58930dc14befa2b78c839d66699cf9d454942ac9c595161ffe99e".to_string() + "9ed86b1ed5d0f7a981cb0ff2f3943603a095a031c463b3389bce8a6f60e2b21e".to_string() ) } diff --git a/packages/rs-drive-abci/tests/strategy_tests/query.rs b/packages/rs-drive-abci/tests/strategy_tests/query.rs index 3423bca21c..c8825c7dfe 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/query.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/query.rs @@ -20,7 +20,7 @@ use drive_abci::rpc::core::MockCoreRPCLike; use rand::prelude::SliceRandom; use rand::rngs::StdRng; use rand::{Rng, SeedableRng}; -use std::collections::{HashMap, HashSet}; +use std::collections::HashMap; use strategy_tests::frequency::Frequency; use tenderdash_abci::proto::google::protobuf::Timestamp; use tenderdash_abci::proto::serializers::timestamp::ToMilis; diff --git a/packages/rs-drive/src/drive/batch/drive_op_batch/document.rs b/packages/rs-drive/src/drive/batch/drive_op_batch/document.rs index d26327ff8f..99f5cb5388 100644 --- a/packages/rs-drive/src/drive/batch/drive_op_batch/document.rs +++ b/packages/rs-drive/src/drive/batch/drive_op_batch/document.rs @@ -1,16 +1,16 @@ use crate::drive::batch::drive_op_batch::DriveLowLevelOperationConverter; use crate::drive::flags::StorageFlags; use crate::drive::object_size_info::DocumentInfo::{DocumentRefAndSerialization, DocumentRefInfo}; -use crate::drive::object_size_info::{DocumentAndContractInfo, OwnedDocumentInfo}; +use crate::drive::object_size_info::{ + DataContractInfo, DocumentAndContractInfo, DocumentTypeInfo, OwnedDocumentInfo, +}; use crate::drive::Drive; -use crate::error::document::DocumentError; use crate::error::Error; use crate::fee::op::LowLevelDriveOperation; use dpp::block::block_info::BlockInfo; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::document_type::DocumentTypeRef; use dpp::data_contract::DataContract; -use dpp::document::serialization_traits::DocumentPlatformConversionMethodsV0; use dpp::document::Document; use dpp::prelude::Identifier; @@ -51,113 +51,45 @@ pub struct DocumentOperationsForContractDocumentType<'a> { /// Operations on Documents #[derive(Clone, Debug)] pub enum DocumentOperationType<'a> { - /// Deserializes a document and adds it to a contract. - AddSerializedDocumentForContract { - /// The serialized document - serialized_document: &'a [u8], - /// The contract - contract: &'a DataContract, - /// The name of the document type - document_type_name: &'a str, - /// The owner id, if none is specified will try to recover from serialized document - owner_id: Option<[u8; 32]>, - /// Should we override the document if one already exists? - override_document: bool, - /// Add storage flags (like epoch, owner id, etc) - storage_flags: Option>, - }, /// Adds a document to a contract matching the desired info. AddDocument { /// The document and contract info, also may contain the owner_id owned_document_info: OwnedDocumentInfo<'a>, - ///DataContract - contract_id: Identifier, + /// Data Contract info to potentially be resolved if needed + contract_info: DataContractInfo<'a>, /// Document type - document_type_name: Cow<'a, String>, + document_type_info: DocumentTypeInfo<'a>, /// Should we override the document if one already exists? override_document: bool, }, - /// Adds a withdrawal document. - AddWithdrawalDocument { + /// Updates a document and returns the associated fee. + UpdateDocument { /// The document and contract info, also may contain the owner_id owned_document_info: OwnedDocumentInfo<'a>, + /// Data Contract info to potentially be resolved if needed + contract_info: DataContractInfo<'a>, + /// Document type + document_type_info: DocumentTypeInfo<'a>, }, - /// Adds a document to a contract. - AddDocumentForContract { + /// Deletes a document + DeleteDocument { + /// The document id + document_id: Identifier, + /// Data Contract info to potentially be resolved if needed + contract_info: DataContractInfo<'a>, + /// Document type + document_type_info: DocumentTypeInfo<'a>, + }, + /// Convenience method to add a withdrawal document. + AddWithdrawalDocument { /// The document and contract info, also may contain the owner_id - document_and_contract_info: DocumentAndContractInfo<'a>, - /// Should we override the document if one already exists? - override_document: bool, + owned_document_info: OwnedDocumentInfo<'a>, }, /// Adds a document to a contract. MultipleDocumentOperationsForSameContractDocumentType { /// The document operations document_operations: DocumentOperationsForContractDocumentType<'a>, }, - /// Deletes a document and returns the associated fee. - DeleteDocumentOfNamedTypeForContractId { - /// The document id - document_id: [u8; 32], - /// The contract id - contract_id: [u8; 32], - /// The name of the document type - document_type_name: Cow<'a, String>, - }, - /// Deletes a document and returns the associated fee. - DeleteDocumentOfNamedTypeForContract { - /// The document id - document_id: [u8; 32], - /// The contract - contract: &'a DataContract, - /// The name of the document type - document_type_name: &'a str, - }, - /// Deletes a document and returns the associated fee. - DeleteDocumentForContract { - /// The document id - document_id: [u8; 32], - /// The contract - contract: &'a DataContract, - /// The name of the document type - document_type: DocumentTypeRef<'a>, - }, - /// Updates a serialized document and returns the associated fee. - UpdateSerializedDocumentForContract { - /// The serialized document - serialized_document: &'a [u8], - /// The contract - contract: &'a DataContract, - /// The name of the document type - document_type_name: &'a str, - /// The owner id, if none is specified will try to recover from serialized document - owner_id: Option<[u8; 32]>, - /// Add storage flags (like epoch, owner id, etc) - storage_flags: Option>, - }, - /// Updates a document and returns the associated fee. - UpdateDocument { - /// The document and contract info, also may contain the owner_id - owned_document_info: OwnedDocumentInfo<'a>, - /// DataContract - contract_id: Identifier, - /// Document type - document_type_name: Cow<'a, String>, - }, - /// Updates a document and returns the associated fee. - UpdateDocumentForContract { - /// The document to update - document: &'a Document, - /// The document in pre-serialized form - serialized_document: &'a [u8], - /// The contract - contract: &'a DataContract, - /// The name of the document type - document_type_name: &'a str, - /// The owner id, if none is specified will try to recover from serialized document - owner_id: Option<[u8; 32]>, - /// Add storage flags (like epoch, owner id, etc) - storage_flags: Option>, - }, } impl DriveLowLevelOperationConverter for DocumentOperationType<'_> { @@ -172,65 +104,22 @@ impl DriveLowLevelOperationConverter for DocumentOperationType<'_> { platform_version: &PlatformVersion, ) -> Result, Error> { match self { - DocumentOperationType::AddSerializedDocumentForContract { - serialized_document, - contract, - document_type_name, - owner_id, - override_document, - storage_flags, - } => { - let document_type = contract - .document_type_for_name(document_type_name) - .map_err(ProtocolError::DataContractError)?; - - let document = - Document::from_bytes(serialized_document, document_type, platform_version)?; - - let document_info = - DocumentRefAndSerialization((&document, serialized_document, storage_flags)); - - let document_and_contract_info = DocumentAndContractInfo { - owned_document_info: OwnedDocumentInfo { - document_info, - owner_id, - }, - contract, - document_type, - }; - drive.add_document_for_contract_operations( - document_and_contract_info, - override_document, - block_info, - &mut None, - estimated_costs_only_with_layer_info, - transaction, - platform_version, - ) - } DocumentOperationType::AddDocument { owned_document_info, - contract_id, - document_type_name, + contract_info, + document_type_info, override_document, } => { let mut drive_operations: Vec = vec![]; - let contract_fetch_info = drive - .get_contract_with_fetch_info_and_add_to_operations( - contract_id.into_buffer(), - Some(&block_info.epoch), - true, - transaction, - &mut drive_operations, - platform_version, - )? - .ok_or(Error::Document(DocumentError::DataContractNotFound))?; - - let contract = &contract_fetch_info.contract; - - let document_type = contract - .document_type_for_name(document_type_name.as_str()) - .map_err(ProtocolError::DataContractError)?; + let contract_resolved_info = contract_info.resolve( + drive, + block_info, + transaction, + &mut drive_operations, + platform_version, + )?; + let contract = contract_resolved_info.as_ref(); + let document_type = document_type_info.resolve(contract)?; let document_and_contract_info = DocumentAndContractInfo { owned_document_info, @@ -273,119 +162,59 @@ impl DriveLowLevelOperationConverter for DocumentOperationType<'_> { platform_version, ) } - DocumentOperationType::AddDocumentForContract { - document_and_contract_info, - override_document, - } => drive.add_document_for_contract_operations( - document_and_contract_info, - override_document, - block_info, - &mut None, - estimated_costs_only_with_layer_info, - transaction, - platform_version, - ), - DocumentOperationType::DeleteDocumentForContract { - document_id, - contract, - document_type, - } => drive.delete_document_for_contract_operations( - document_id, - contract, - document_type, - None, - estimated_costs_only_with_layer_info, - transaction, - platform_version, - ), - DocumentOperationType::DeleteDocumentOfNamedTypeForContractId { - document_id, - contract_id, - document_type_name, - } => drive.delete_document_for_contract_id_with_named_type_operations( - document_id, - contract_id, - document_type_name.as_str(), - &block_info.epoch, - None, - estimated_costs_only_with_layer_info, - transaction, - platform_version, - ), - DocumentOperationType::DeleteDocumentOfNamedTypeForContract { - document_id, - contract, - document_type_name, - } => drive.delete_document_for_contract_with_named_type_operations( - document_id, - contract, - document_type_name, - None, - estimated_costs_only_with_layer_info, - transaction, - platform_version, - ), - DocumentOperationType::UpdateSerializedDocumentForContract { - serialized_document, - contract, - document_type_name, - owner_id, - storage_flags, + DocumentOperationType::UpdateDocument { + owned_document_info, + contract_info, + document_type_info, } => { - let document_type = contract - .document_type_for_name(document_type_name) - .map_err(ProtocolError::DataContractError)?; - - let document = - Document::from_bytes(serialized_document, document_type, platform_version)?; - - let document_info = - DocumentRefAndSerialization((&document, serialized_document, storage_flags)); + let mut drive_operations = vec![]; + let contract_resolved_info = contract_info.resolve( + drive, + block_info, + transaction, + &mut drive_operations, + platform_version, + )?; + let contract = contract_resolved_info.as_ref(); + let document_type = document_type_info.resolve(contract)?; let document_and_contract_info = DocumentAndContractInfo { - owned_document_info: OwnedDocumentInfo { - document_info, - owner_id, - }, + owned_document_info, contract, document_type, }; - drive.update_document_for_contract_operations( + let mut operations = drive.update_document_for_contract_operations( document_and_contract_info, block_info, &mut None, estimated_costs_only_with_layer_info, transaction, platform_version, - ) + )?; + drive_operations.append(&mut operations); + Ok(drive_operations) } - DocumentOperationType::UpdateDocumentForContract { - document, - serialized_document, - contract, - document_type_name, - owner_id, - storage_flags, + DocumentOperationType::DeleteDocument { + document_id, + contract_info, + document_type_info, } => { - let document_info = - DocumentRefAndSerialization((document, serialized_document, storage_flags)); - - let document_type = contract - .document_type_for_name(document_type_name) - .map_err(ProtocolError::DataContractError)?; + let mut drive_operations: Vec = vec![]; + let contract_resolved_info = contract_info.resolve( + drive, + block_info, + transaction, + &mut drive_operations, + platform_version, + )?; + let contract = contract_resolved_info.as_ref(); + let document_type = document_type_info.resolve(contract)?; - let document_and_contract_info = DocumentAndContractInfo { - owned_document_info: OwnedDocumentInfo { - document_info, - owner_id, - }, + drive.delete_document_for_contract_operations( + document_id, contract, document_type, - }; - drive.update_document_for_contract_operations( - document_and_contract_info, - block_info, - &mut None, + None, estimated_costs_only_with_layer_info, transaction, platform_version, @@ -463,45 +292,6 @@ impl DriveLowLevelOperationConverter for DocumentOperationType<'_> { } Ok(drive_operations) } - DocumentOperationType::UpdateDocument { - owned_document_info, - contract_id, - document_type_name, - } => { - let mut drive_operations = vec![]; - let contract_fetch_info = drive - .get_contract_with_fetch_info_and_add_to_operations( - contract_id.into_buffer(), - Some(&block_info.epoch), - true, - transaction, - &mut drive_operations, - platform_version, - )? - .ok_or(Error::Document(DocumentError::DataContractNotFound))?; - - let contract = &contract_fetch_info.contract; - - let document_type = contract - .document_type_for_name(document_type_name.as_str()) - .map_err(ProtocolError::DataContractError)?; - - let document_and_contract_info = DocumentAndContractInfo { - owned_document_info, - contract, - document_type, - }; - let mut operations = drive.update_document_for_contract_operations( - document_and_contract_info, - block_info, - &mut None, - estimated_costs_only_with_layer_info, - transaction, - platform_version, - )?; - drive_operations.append(&mut operations); - Ok(drive_operations) - } } } } diff --git a/packages/rs-drive/src/drive/batch/drive_op_batch/mod.rs b/packages/rs-drive/src/drive/batch/drive_op_batch/mod.rs index 7354d38359..a7095f2b6f 100644 --- a/packages/rs-drive/src/drive/batch/drive_op_batch/mod.rs +++ b/packages/rs-drive/src/drive/batch/drive_op_batch/mod.rs @@ -203,13 +203,13 @@ mod tests { DocumentOperationsForContractDocumentType, UpdateOperationInfo, }; use crate::drive::batch::DataContractOperationType::ApplyContract; - use crate::drive::batch::DocumentOperationType::AddDocumentForContract; + use crate::drive::batch::DocumentOperationType::AddDocument; use crate::drive::batch::DriveOperation::{DataContractOperation, DocumentOperation}; use crate::drive::contract::paths::contract_root_path; use crate::drive::flags::StorageFlags; use crate::drive::object_size_info::DocumentInfo::DocumentRefInfo; - use crate::drive::object_size_info::{DocumentAndContractInfo, OwnedDocumentInfo}; + use crate::drive::object_size_info::{DataContractInfo, DocumentTypeInfo, OwnedDocumentInfo}; use crate::drive::Drive; use crate::tests::helpers::setup::setup_drive_with_initial_state_structure; @@ -251,18 +251,16 @@ mod tests { ) .expect("expected to get document"); - drive_operations.push(DocumentOperation(AddDocumentForContract { - document_and_contract_info: DocumentAndContractInfo { - owned_document_info: OwnedDocumentInfo { - document_info: DocumentRefInfo(( - &dashpay_cr_document, - StorageFlags::optional_default_as_cow(), - )), - owner_id: None, - }, - contract: &contract, - document_type, + drive_operations.push(DocumentOperation(AddDocument { + owned_document_info: OwnedDocumentInfo { + document_info: DocumentRefInfo(( + &dashpay_cr_document, + StorageFlags::optional_default_as_cow(), + )), + owner_id: None, }, + contract_info: DataContractInfo::BorrowedDataContract(&contract), + document_type_info: DocumentTypeInfo::DocumentTypeRef(document_type), override_document: false, })); @@ -354,17 +352,13 @@ mod tests { ) .expect("expected to get contract"); - drive_operations.push(DocumentOperation(AddDocumentForContract { - document_and_contract_info: DocumentAndContractInfo { - owned_document_info: OwnedDocumentInfo { - document_info: DocumentRefInfo((&dashpay_cr_document, None)), - owner_id: None, - }, - contract: &contract, - document_type: contract - .document_type_for_name("contactRequest") - .expect("expected to get document type"), + drive_operations.push(DocumentOperation(AddDocument { + owned_document_info: OwnedDocumentInfo { + document_info: DocumentRefInfo((&dashpay_cr_document, None)), + owner_id: None, }, + contract_info: DataContractInfo::BorrowedDataContract(&contract), + document_type_info: DocumentTypeInfo::DocumentTypeNameAsStr("contactRequest"), override_document: false, })); @@ -378,17 +372,13 @@ mod tests { ) .expect("expected to get contract"); - drive_operations.push(DocumentOperation(AddDocumentForContract { - document_and_contract_info: DocumentAndContractInfo { - owned_document_info: OwnedDocumentInfo { - document_info: DocumentRefInfo((&dashpay_cr_1_document, None)), - owner_id: None, - }, - contract: &contract, - document_type: contract - .document_type_for_name("contactRequest") - .expect("expected to get document type"), + drive_operations.push(DocumentOperation(AddDocument { + owned_document_info: OwnedDocumentInfo { + document_info: DocumentRefInfo((&dashpay_cr_1_document, None)), + owner_id: None, }, + contract_info: DataContractInfo::BorrowedDataContract(&contract), + document_type_info: DocumentTypeInfo::DocumentTypeNameAsStr("contactRequest"), override_document: false, })); diff --git a/packages/rs-drive/src/drive/batch/transitions/document/document_create_transition.rs b/packages/rs-drive/src/drive/batch/transitions/document/document_create_transition.rs index cca4a7dee6..56d3db6c7e 100644 --- a/packages/rs-drive/src/drive/batch/transitions/document/document_create_transition.rs +++ b/packages/rs-drive/src/drive/batch/transitions/document/document_create_transition.rs @@ -3,7 +3,7 @@ use crate::drive::batch::DriveOperation::{DocumentOperation, IdentityOperation}; use crate::drive::batch::{DocumentOperationType, DriveOperation, IdentityOperationType}; use crate::drive::flags::StorageFlags; use crate::drive::object_size_info::DocumentInfo::DocumentOwnedInfo; -use crate::drive::object_size_info::OwnedDocumentInfo; +use crate::drive::object_size_info::{DocumentTypeInfo, OwnedDocumentInfo}; use crate::error::Error; use dpp::block::epoch::Epoch; @@ -13,6 +13,7 @@ use std::borrow::Cow; use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; use crate::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::{DocumentCreateTransitionAction, DocumentCreateTransitionActionAccessorsV0, DocumentFromCreateTransitionAction}; use dpp::version::PlatformVersion; +use crate::drive::object_size_info::DataContractInfo::DataContractFetchInfo; impl DriveHighLevelDocumentOperationConverter for DocumentCreateTransitionAction { fn into_high_level_document_drive_operations<'b>( @@ -23,6 +24,8 @@ impl DriveHighLevelDocumentOperationConverter for DocumentCreateTransitionAction ) -> Result>, Error> { let data_contract_id = self.base().data_contract_id(); + let contract_fetch_info = self.base().data_contract_fetch_info(); + let document_type_name = self.base().document_type_name().clone(); let identity_contract_nonce = self.base().identity_contract_nonce(); @@ -43,8 +46,8 @@ impl DriveHighLevelDocumentOperationConverter for DocumentCreateTransitionAction document_info: DocumentOwnedInfo((document, Some(Cow::Owned(storage_flags)))), owner_id: Some(owner_id.into_buffer()), }, - contract_id: data_contract_id, - document_type_name: Cow::Owned(document_type_name), + contract_info: DataContractFetchInfo(contract_fetch_info), + document_type_info: DocumentTypeInfo::DocumentTypeName(document_type_name), override_document: false, }), ]) diff --git a/packages/rs-drive/src/drive/batch/transitions/document/document_delete_transition.rs b/packages/rs-drive/src/drive/batch/transitions/document/document_delete_transition.rs index 816bb1fa84..55ae330832 100644 --- a/packages/rs-drive/src/drive/batch/transitions/document/document_delete_transition.rs +++ b/packages/rs-drive/src/drive/batch/transitions/document/document_delete_transition.rs @@ -7,11 +7,11 @@ use crate::error::Error; use dpp::block::epoch::Epoch; use dpp::identifier::Identifier; -use std::borrow::Cow; use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; use crate::state_transition_action::document::documents_batch::document_transition::document_delete_transition_action::DocumentDeleteTransitionAction; use crate::state_transition_action::document::documents_batch::document_transition::document_delete_transition_action::v0::DocumentDeleteTransitionActionAccessorsV0; use dpp::version::PlatformVersion; +use crate::drive::object_size_info::{DataContractInfo, DocumentTypeInfo}; impl DriveHighLevelDocumentOperationConverter for DocumentDeleteTransitionAction { fn into_high_level_document_drive_operations<'b>( @@ -32,13 +32,15 @@ impl DriveHighLevelDocumentOperationConverter for DocumentDeleteTransitionAction contract_id: data_contract_id.into_buffer(), nonce: identity_contract_nonce, }), - DocumentOperation( - DocumentOperationType::DeleteDocumentOfNamedTypeForContractId { - document_id: base.id().to_buffer(), - contract_id: base.data_contract_id().to_buffer(), - document_type_name: Cow::Owned(base.document_type_name_owned()), - }, - ), + DocumentOperation(DocumentOperationType::DeleteDocument { + document_id: base.id(), + contract_info: DataContractInfo::DataContractFetchInfo( + base.data_contract_fetch_info(), + ), + document_type_info: DocumentTypeInfo::DocumentTypeName( + base.document_type_name_owned(), + ), + }), ]) } } diff --git a/packages/rs-drive/src/drive/batch/transitions/document/document_purchase_transition.rs b/packages/rs-drive/src/drive/batch/transitions/document/document_purchase_transition.rs index 97d9cf3816..60ec4c37fa 100644 --- a/packages/rs-drive/src/drive/batch/transitions/document/document_purchase_transition.rs +++ b/packages/rs-drive/src/drive/batch/transitions/document/document_purchase_transition.rs @@ -3,7 +3,7 @@ use crate::drive::batch::DriveOperation::{DocumentOperation, IdentityOperation}; use crate::drive::batch::{DocumentOperationType, DriveOperation, IdentityOperationType}; use crate::drive::flags::StorageFlags; use crate::drive::object_size_info::DocumentInfo::DocumentOwnedInfo; -use crate::drive::object_size_info::OwnedDocumentInfo; +use crate::drive::object_size_info::{DataContractInfo, DocumentTypeInfo, OwnedDocumentInfo}; use crate::error::Error; use dpp::block::epoch::Epoch; @@ -25,6 +25,7 @@ impl DriveHighLevelDocumentOperationConverter for DocumentPurchaseTransitionActi let identity_contract_nonce = self.base().identity_contract_nonce(); let original_owner_id = self.original_owner_id(); let purchase_amount = self.price(); + let contract_fetch_info = self.base().data_contract_fetch_info(); let document = self.document_owned(); // we are purchasing the document so the new storage flags should be on the new owner @@ -45,8 +46,8 @@ impl DriveHighLevelDocumentOperationConverter for DocumentPurchaseTransitionActi document_info: DocumentOwnedInfo((document, Some(Cow::Owned(storage_flags)))), owner_id: Some(new_document_owner_id.into_buffer()), }, - contract_id: data_contract_id, - document_type_name: Cow::Owned(document_type_name), + contract_info: DataContractInfo::DataContractFetchInfo(contract_fetch_info), + document_type_info: DocumentTypeInfo::DocumentTypeName(document_type_name), }), IdentityOperation(IdentityOperationType::RemoveFromIdentityBalance { identity_id: owner_id.to_buffer(), diff --git a/packages/rs-drive/src/drive/batch/transitions/document/document_replace_transition.rs b/packages/rs-drive/src/drive/batch/transitions/document/document_replace_transition.rs index 58bfaaf1ca..bbfb663e55 100644 --- a/packages/rs-drive/src/drive/batch/transitions/document/document_replace_transition.rs +++ b/packages/rs-drive/src/drive/batch/transitions/document/document_replace_transition.rs @@ -3,7 +3,7 @@ use crate::drive::batch::DriveOperation::{DocumentOperation, IdentityOperation}; use crate::drive::batch::{DocumentOperationType, DriveOperation, IdentityOperationType}; use crate::drive::flags::StorageFlags; use crate::drive::object_size_info::DocumentInfo::DocumentOwnedInfo; -use crate::drive::object_size_info::OwnedDocumentInfo; +use crate::drive::object_size_info::{DataContractInfo, DocumentTypeInfo, OwnedDocumentInfo}; use crate::error::Error; use dpp::block::epoch::Epoch; @@ -24,6 +24,7 @@ impl DriveHighLevelDocumentOperationConverter for DocumentReplaceTransitionActio let data_contract_id = self.base().data_contract_id(); let document_type_name = self.base().document_type_name().clone(); let identity_contract_nonce = self.base().identity_contract_nonce(); + let contract_fetch_info = self.base().data_contract_fetch_info(); let document = Document::try_from_owned_replace_transition_action(self, owner_id, platform_version)?; @@ -40,8 +41,8 @@ impl DriveHighLevelDocumentOperationConverter for DocumentReplaceTransitionActio document_info: DocumentOwnedInfo((document, Some(Cow::Owned(storage_flags)))), owner_id: Some(owner_id.into_buffer()), }, - contract_id: data_contract_id, - document_type_name: Cow::Owned(document_type_name), + contract_info: DataContractInfo::DataContractFetchInfo(contract_fetch_info), + document_type_info: DocumentTypeInfo::DocumentTypeName(document_type_name), }), ]) } diff --git a/packages/rs-drive/src/drive/batch/transitions/document/document_transfer_transition.rs b/packages/rs-drive/src/drive/batch/transitions/document/document_transfer_transition.rs index e16715f4db..66d0ab4484 100644 --- a/packages/rs-drive/src/drive/batch/transitions/document/document_transfer_transition.rs +++ b/packages/rs-drive/src/drive/batch/transitions/document/document_transfer_transition.rs @@ -3,7 +3,7 @@ use crate::drive::batch::DriveOperation::{DocumentOperation, IdentityOperation}; use crate::drive::batch::{DocumentOperationType, DriveOperation, IdentityOperationType}; use crate::drive::flags::StorageFlags; use crate::drive::object_size_info::DocumentInfo::DocumentOwnedInfo; -use crate::drive::object_size_info::OwnedDocumentInfo; +use crate::drive::object_size_info::{DataContractInfo, DocumentTypeInfo, OwnedDocumentInfo}; use crate::error::Error; use dpp::block::epoch::Epoch; @@ -24,6 +24,7 @@ impl DriveHighLevelDocumentOperationConverter for DocumentTransferTransitionActi let data_contract_id = self.base().data_contract_id(); let document_type_name = self.base().document_type_name().clone(); let identity_contract_nonce = self.base().identity_contract_nonce(); + let contract_fetch_info = self.base().data_contract_fetch_info(); let document = self.document_owned(); // we are transferring the document so the new storage flags should be on the new owner @@ -44,8 +45,8 @@ impl DriveHighLevelDocumentOperationConverter for DocumentTransferTransitionActi document_info: DocumentOwnedInfo((document, Some(Cow::Owned(storage_flags)))), owner_id: Some(new_document_owner_id.into_buffer()), }, - contract_id: data_contract_id, - document_type_name: Cow::Owned(document_type_name), + contract_info: DataContractInfo::DataContractFetchInfo(contract_fetch_info), + document_type_info: DocumentTypeInfo::DocumentTypeName(document_type_name), }), ]) } diff --git a/packages/rs-drive/src/drive/batch/transitions/document/document_update_price_transition.rs b/packages/rs-drive/src/drive/batch/transitions/document/document_update_price_transition.rs index 835af6aa21..9225d43a58 100644 --- a/packages/rs-drive/src/drive/batch/transitions/document/document_update_price_transition.rs +++ b/packages/rs-drive/src/drive/batch/transitions/document/document_update_price_transition.rs @@ -3,7 +3,7 @@ use crate::drive::batch::DriveOperation::{DocumentOperation, IdentityOperation}; use crate::drive::batch::{DocumentOperationType, DriveOperation, IdentityOperationType}; use crate::drive::flags::StorageFlags; use crate::drive::object_size_info::DocumentInfo::DocumentOwnedInfo; -use crate::drive::object_size_info::OwnedDocumentInfo; +use crate::drive::object_size_info::{DataContractInfo, DocumentTypeInfo, OwnedDocumentInfo}; use crate::error::Error; use dpp::block::epoch::Epoch; @@ -23,6 +23,7 @@ impl DriveHighLevelDocumentOperationConverter for DocumentUpdatePriceTransitionA let data_contract_id = self.base().data_contract_id(); let document_type_name = self.base().document_type_name().clone(); let identity_contract_nonce = self.base().identity_contract_nonce(); + let fetch_info = self.base().data_contract_fetch_info(); let document = self.document_owned(); let storage_flags = StorageFlags::new_single_epoch(epoch.index, Some(owner_id.to_buffer())); @@ -38,8 +39,8 @@ impl DriveHighLevelDocumentOperationConverter for DocumentUpdatePriceTransitionA document_info: DocumentOwnedInfo((document, Some(Cow::Owned(storage_flags)))), owner_id: Some(owner_id.into_buffer()), }, - contract_id: data_contract_id, - document_type_name: Cow::Owned(document_type_name), + contract_info: DataContractInfo::DataContractFetchInfo(fetch_info), + document_type_info: DocumentTypeInfo::DocumentTypeName(document_type_name), }), ]) } diff --git a/packages/rs-drive/src/drive/document/delete/delete_document_for_contract/mod.rs b/packages/rs-drive/src/drive/document/delete/delete_document_for_contract/mod.rs index a90d757fdc..fe1d9b0b46 100644 --- a/packages/rs-drive/src/drive/document/delete/delete_document_for_contract/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/delete_document_for_contract/mod.rs @@ -10,6 +10,7 @@ use dpp::fee::fee_result::FeeResult; use dpp::version::PlatformVersion; +use dpp::identifier::Identifier; use grovedb::TransactionArg; impl Drive { @@ -30,7 +31,7 @@ impl Drive { /// * `Err(DriveError::UnknownVersionMismatch)` if the drive version does not match known versions. pub fn delete_document_for_contract( &self, - document_id: [u8; 32], + document_id: Identifier, contract: &DataContract, document_type_name: &str, block_info: BlockInfo, diff --git a/packages/rs-drive/src/drive/document/delete/delete_document_for_contract/v0/mod.rs b/packages/rs-drive/src/drive/document/delete/delete_document_for_contract/v0/mod.rs index b9a941c44d..a9f3180a43 100644 --- a/packages/rs-drive/src/drive/document/delete/delete_document_for_contract/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/delete_document_for_contract/v0/mod.rs @@ -5,6 +5,7 @@ use dpp::block::block_info::BlockInfo; use dpp::data_contract::DataContract; use dpp::fee::fee_result::FeeResult; +use dpp::identifier::Identifier; use dpp::version::PlatformVersion; use grovedb::batch::KeyInfoPath; use grovedb::{EstimatedLayerInformation, TransactionArg}; @@ -15,7 +16,7 @@ impl Drive { #[inline(always)] pub(super) fn delete_document_for_contract_v0( &self, - document_id: [u8; 32], + document_id: Identifier, contract: &DataContract, document_type_name: &str, block_info: BlockInfo, diff --git a/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_apply_and_add_to_operations/mod.rs b/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_apply_and_add_to_operations/mod.rs index ad521ec087..27df346622 100644 --- a/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_apply_and_add_to_operations/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_apply_and_add_to_operations/mod.rs @@ -6,6 +6,7 @@ use crate::error::Error; use crate::fee::op::LowLevelDriveOperation; use dpp::data_contract::DataContract; +use dpp::identifier::Identifier; use dpp::version::PlatformVersion; use grovedb::batch::KeyInfoPath; use grovedb::{EstimatedLayerInformation, TransactionArg}; @@ -29,7 +30,7 @@ impl Drive { /// * `Err(DriveError::UnknownVersionMismatch)` if the drive version does not match known versions. pub fn delete_document_for_contract_apply_and_add_to_operations( &self, - document_id: [u8; 32], + document_id: Identifier, contract: &DataContract, document_type_name: &str, estimated_costs_only_with_layer_info: Option< diff --git a/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_apply_and_add_to_operations/v0/mod.rs b/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_apply_and_add_to_operations/v0/mod.rs index 33ec82159d..8fb4846a19 100644 --- a/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_apply_and_add_to_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_apply_and_add_to_operations/v0/mod.rs @@ -3,6 +3,7 @@ use crate::error::Error; use crate::fee::op::LowLevelDriveOperation; use dpp::data_contract::DataContract; +use dpp::identifier::Identifier; use dpp::version::PlatformVersion; use grovedb::batch::KeyInfoPath; use grovedb::{EstimatedLayerInformation, TransactionArg}; @@ -13,7 +14,7 @@ impl Drive { #[inline(always)] pub(super) fn delete_document_for_contract_apply_and_add_to_operations_v0( &self, - document_id: [u8; 32], + document_id: Identifier, contract: &DataContract, document_type_name: &str, mut estimated_costs_only_with_layer_info: Option< diff --git a/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_id/mod.rs b/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_id/mod.rs index 64009ee3a0..5305f991ac 100644 --- a/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_id/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_id/mod.rs @@ -11,6 +11,7 @@ use crate::error::drive::DriveError; use crate::error::Error; use dpp::fee::fee_result::FeeResult; +use dpp::identifier::Identifier; use dpp::version::PlatformVersion; @@ -33,8 +34,8 @@ impl Drive { /// * `Err(DriveError::UnknownVersionMismatch)` if the drive version does not match known versions. pub fn delete_document_for_contract_id( &self, - document_id: [u8; 32], - contract_id: [u8; 32], + document_id: Identifier, + contract_id: Identifier, document_type_name: &str, block_info: BlockInfo, apply: bool, diff --git a/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_id/v0/mod.rs b/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_id/v0/mod.rs index 91da9282b7..e7439154c8 100644 --- a/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_id/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_id/v0/mod.rs @@ -13,6 +13,7 @@ use crate::error::Error; use crate::fee::op::LowLevelDriveOperation; use dpp::fee::fee_result::FeeResult; +use dpp::identifier::Identifier; use dpp::version::PlatformVersion; @@ -22,8 +23,8 @@ impl Drive { #[inline(always)] pub(super) fn delete_document_for_contract_id_v0( &self, - document_id: [u8; 32], - contract_id: [u8; 32], + document_id: Identifier, + contract_id: Identifier, document_type_name: &str, block_info: BlockInfo, apply: bool, @@ -39,7 +40,7 @@ impl Drive { let contract_fetch_info = self .get_contract_with_fetch_info_and_add_to_operations( - contract_id, + contract_id.to_buffer(), Some(&block_info.epoch), true, transaction, diff --git a/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_id_with_named_type_operations/mod.rs b/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_id_with_named_type_operations/mod.rs index 0a64f0ccaf..f4a693ebd0 100644 --- a/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_id_with_named_type_operations/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_id_with_named_type_operations/mod.rs @@ -6,6 +6,7 @@ use crate::error::Error; use crate::fee::op::LowLevelDriveOperation; use dpp::block::epoch::Epoch; +use dpp::identifier::Identifier; use dpp::version::PlatformVersion; use grovedb::batch::KeyInfoPath; use grovedb::{EstimatedLayerInformation, TransactionArg}; @@ -30,8 +31,8 @@ impl Drive { /// * `Err(DriveError::UnknownVersionMismatch)` if the drive version does not match known versions. pub fn delete_document_for_contract_id_with_named_type_operations( &self, - document_id: [u8; 32], - contract_id: [u8; 32], + document_id: Identifier, + contract_id: Identifier, document_type_name: &str, epoch: &Epoch, previous_batch_operations: Option<&mut Vec>, diff --git a/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_id_with_named_type_operations/v0/mod.rs b/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_id_with_named_type_operations/v0/mod.rs index 87d1ed5e6d..7435b0aaad 100644 --- a/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_id_with_named_type_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_id_with_named_type_operations/v0/mod.rs @@ -12,6 +12,7 @@ use crate::fee::op::LowLevelDriveOperation; use dpp::block::epoch::Epoch; use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::identifier::Identifier; use dpp::version::PlatformVersion; @@ -20,8 +21,8 @@ impl Drive { #[inline(always)] pub(super) fn delete_document_for_contract_id_with_named_type_operations_v0( &self, - document_id: [u8; 32], - contract_id: [u8; 32], + document_id: Identifier, + contract_id: Identifier, document_type_name: &str, epoch: &Epoch, previous_batch_operations: Option<&mut Vec>, @@ -33,7 +34,7 @@ impl Drive { ) -> Result, Error> { let mut operations = vec![]; let Some(contract_fetch_info) = self.get_contract_with_fetch_info_and_add_to_operations( - contract_id, + contract_id.to_buffer(), Some(epoch), true, transaction, diff --git a/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_operations/mod.rs b/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_operations/mod.rs index 1abdf5037d..a4fca0aa96 100644 --- a/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_operations/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_operations/mod.rs @@ -8,6 +8,7 @@ use crate::fee::op::LowLevelDriveOperation; use dpp::data_contract::document_type::DocumentTypeRef; use dpp::data_contract::DataContract; +use dpp::identifier::Identifier; use dpp::version::PlatformVersion; use grovedb::batch::KeyInfoPath; use grovedb::{EstimatedLayerInformation, TransactionArg}; @@ -30,7 +31,7 @@ impl Drive { /// * `Err(DriveError::UnknownVersionMismatch)` if the drive version does not match known versions. pub(crate) fn delete_document_for_contract_operations( &self, - document_id: [u8; 32], + document_id: Identifier, contract: &DataContract, document_type: DocumentTypeRef, previous_batch_operations: Option<&mut Vec>, diff --git a/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_operations/v0/mod.rs b/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_operations/v0/mod.rs index 1adaab41ae..e972831bb1 100644 --- a/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_operations/v0/mod.rs @@ -29,6 +29,7 @@ use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::data_contract::document_type::methods::DocumentTypeV0Methods; use dpp::document::serialization_traits::DocumentPlatformConversionMethodsV0; +use dpp::identifier::Identifier; use dpp::version::PlatformVersion; @@ -37,7 +38,7 @@ impl Drive { #[inline(always)] pub(super) fn delete_document_for_contract_operations_v0( &self, - document_id: [u8; 32], + document_id: Identifier, contract: &DataContract, document_type: DocumentTypeRef, previous_batch_operations: Option<&mut Vec>, diff --git a/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_with_named_type_operations/mod.rs b/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_with_named_type_operations/mod.rs index 66d0fd37cb..195a8f1c75 100644 --- a/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_with_named_type_operations/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_with_named_type_operations/mod.rs @@ -7,6 +7,7 @@ use crate::fee::op::LowLevelDriveOperation; use dpp::data_contract::DataContract; +use dpp::identifier::Identifier; use dpp::version::PlatformVersion; use grovedb::batch::KeyInfoPath; use grovedb::{EstimatedLayerInformation, TransactionArg}; @@ -29,7 +30,7 @@ impl Drive { /// * `Err(DriveError::UnknownVersionMismatch)` if the drive version does not match known versions. pub(crate) fn delete_document_for_contract_with_named_type_operations( &self, - document_id: [u8; 32], + document_id: Identifier, contract: &DataContract, document_type_name: &str, previous_batch_operations: Option<&mut Vec>, diff --git a/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_with_named_type_operations/v0/mod.rs b/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_with_named_type_operations/v0/mod.rs index 59b6755ab3..6999b5130f 100644 --- a/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_with_named_type_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_with_named_type_operations/v0/mod.rs @@ -12,6 +12,7 @@ use crate::error::Error; use crate::fee::op::LowLevelDriveOperation; use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::identifier::Identifier; use dpp::version::PlatformVersion; @@ -20,7 +21,7 @@ impl Drive { #[inline(always)] pub(super) fn delete_document_for_contract_with_named_type_operations_v0( &self, - document_id: [u8; 32], + document_id: Identifier, contract: &DataContract, document_type_name: &str, previous_batch_operations: Option<&mut Vec>, diff --git a/packages/rs-drive/src/drive/document/delete/mod.rs b/packages/rs-drive/src/drive/document/delete/mod.rs index 6fe049c5ff..89c007e59f 100644 --- a/packages/rs-drive/src/drive/document/delete/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/mod.rs @@ -1,32 +1,3 @@ -// MIT LICENSE -// -// Copyright (c) 2021 Dash Core Group -// -// Permission is hereby granted, free of charge, to any -// person obtaining a copy of this software and associated -// documentation files (the "Software"), to deal in the -// Software without restriction, including without -// limitation the rights to use, copy, modify, merge, -// publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software -// is furnished to do so, subject to the following -// conditions: -// -// The above copyright notice and this permission notice -// shall be included in all copies or substantial portions -// of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -// ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -// TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -// SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -// IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -// DEALINGS IN THE SOFTWARE. -// - //! Delete Documents. //! //! This module implements functions in Drive for deleting documents. diff --git a/packages/rs-drive/src/drive/document/delete/remove_document_from_primary_storage/mod.rs b/packages/rs-drive/src/drive/document/delete/remove_document_from_primary_storage/mod.rs index 1dd989ae6a..bf990bf905 100644 --- a/packages/rs-drive/src/drive/document/delete/remove_document_from_primary_storage/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/remove_document_from_primary_storage/mod.rs @@ -6,6 +6,7 @@ use crate::error::Error; use crate::fee::op::LowLevelDriveOperation; use dpp::data_contract::document_type::DocumentTypeRef; +use dpp::identifier::Identifier; use dpp::version::PlatformVersion; use grovedb::batch::KeyInfoPath; use grovedb::{EstimatedLayerInformation, TransactionArg}; @@ -28,7 +29,7 @@ impl Drive { /// * `Err(DriveError::UnknownVersionMismatch)` if the drive version does not match known versions. pub(in crate::drive::document) fn remove_document_from_primary_storage( &self, - document_id: [u8; 32], + document_id: Identifier, document_type: DocumentTypeRef, contract_documents_primary_key_path: [&[u8]; 5], estimated_costs_only_with_layer_info: &mut Option< diff --git a/packages/rs-drive/src/drive/document/delete/remove_document_from_primary_storage/v0/mod.rs b/packages/rs-drive/src/drive/document/delete/remove_document_from_primary_storage/v0/mod.rs index 24016aa56f..642d5679f4 100644 --- a/packages/rs-drive/src/drive/document/delete/remove_document_from_primary_storage/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/remove_document_from_primary_storage/v0/mod.rs @@ -16,6 +16,7 @@ use crate::error::Error; use crate::fee::op::LowLevelDriveOperation; use dpp::data_contract::document_type::methods::DocumentTypeV0Methods; +use dpp::identifier::Identifier; use dpp::version::PlatformVersion; @@ -24,7 +25,7 @@ impl Drive { #[inline(always)] pub(super) fn remove_document_from_primary_storage_v0( &self, - document_id: [u8; 32], + document_id: Identifier, document_type: DocumentTypeRef, contract_documents_primary_key_path: [&[u8]; 5], estimated_costs_only_with_layer_info: &mut Option< diff --git a/packages/rs-drive/src/drive/document/update/mod.rs b/packages/rs-drive/src/drive/document/update/mod.rs index f8090d3b03..74b4681b63 100644 --- a/packages/rs-drive/src/drive/document/update/mod.rs +++ b/packages/rs-drive/src/drive/document/update/mod.rs @@ -456,7 +456,7 @@ mod tests { drive .delete_document_for_contract( - document.id().to_buffer(), + document.id(), &contract, "profile", BlockInfo::default(), @@ -1641,7 +1641,7 @@ mod tests { ) -> FeeResult { drive .delete_document_for_contract( - person.id.to_buffer(), + person.id, contract, "person", block_info, diff --git a/packages/rs-drive/src/drive/object_size_info/contract_info.rs b/packages/rs-drive/src/drive/object_size_info/contract_info.rs new file mode 100644 index 0000000000..4f7691ad3f --- /dev/null +++ b/packages/rs-drive/src/drive/object_size_info/contract_info.rs @@ -0,0 +1,133 @@ +use crate::drive::contract::DataContractFetchInfo; +use crate::drive::Drive; +use crate::error::document::DocumentError; +use crate::error::Error; +use crate::fee::op::LowLevelDriveOperation; +use dpp::block::block_info::BlockInfo; +use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::document_type::DocumentTypeRef; +use dpp::data_contract::DataContract; +use dpp::identifier::Identifier; +use dpp::ProtocolError; +use grovedb::TransactionArg; +use platform_version::version::PlatformVersion; +use std::sync::Arc; + +/// Represents various forms of accessing or representing a data contract. +/// This enum is used to handle different scenarios in which data contracts +/// might be needed, providing a unified interface to access their data. +#[derive(Clone, Debug)] +pub enum DataContractInfo<'a> { + /// A unique identifier for a data contract. This variant is typically used + /// when only the identity of the data contract is required without needing + /// to access the full contract itself. + DataContractId(Identifier), + + /// Information necessary for fetching a data contract, encapsulated in an + /// `Arc` for thread-safe shared ownership. This variant is used when the + /// data needs to be fetched or is not immediately available. + DataContractFetchInfo(Arc), + + /// A borrowed reference to a data contract. This variant is used for temporary, + /// read-only access to a data contract, avoiding ownership transfer. + BorrowedDataContract(&'a DataContract), + + /// An owned version of a data contract. This variant is used when full ownership + /// and possibly mutability of the data contract is necessary. + OwnedDataContract(DataContract), +} + +impl<'a> DataContractInfo<'a> { + /// Resolve the data contract info into an object that contains the data contract + pub(crate) fn resolve( + self, + drive: &Drive, + block_info: &BlockInfo, + transaction: TransactionArg, + drive_operations: &mut Vec, + platform_version: &PlatformVersion, + ) -> Result, Error> { + match self { + DataContractInfo::DataContractId(contract_id) => { + let contract_fetch_info = drive + .get_contract_with_fetch_info_and_add_to_operations( + contract_id.into_buffer(), + Some(&block_info.epoch), + true, + transaction, + drive_operations, + platform_version, + )? + .ok_or(Error::Document(DocumentError::DataContractNotFound))?; + Ok(DataContractResolvedInfo::DataContractFetchInfo( + contract_fetch_info, + )) + } + DataContractInfo::DataContractFetchInfo(contract_fetch_info) => Ok( + DataContractResolvedInfo::DataContractFetchInfo(contract_fetch_info), + ), + DataContractInfo::BorrowedDataContract(contract) => { + Ok(DataContractResolvedInfo::BorrowedDataContract(contract)) + } + DataContractInfo::OwnedDataContract(contract) => { + Ok(DataContractResolvedInfo::OwnedDataContract(contract)) + } + } + } +} + +/// Contains resolved data contract information, typically used after initial +/// fetching or retrieval steps have been completed. This enum simplifies handling +/// of data contract states post-retrieval. +#[derive(Clone, Debug)] +pub(crate) enum DataContractResolvedInfo<'a> { + /// Information necessary for fetched data contracts, encapsulated in an + /// `Arc` to ensure thread-safe shared ownership and access. + DataContractFetchInfo(Arc), + + /// A borrowed reference to a resolved data contract. This variant is suitable + /// for scenarios where temporary, read-only access to a data contract is required. + BorrowedDataContract(&'a DataContract), + + /// An owned instance of a data contract. This variant provides full control + /// and mutability over the data contract, suitable for scenarios requiring + /// modifications or extended operations on the data contract. + OwnedDataContract(DataContract), +} +impl<'a> AsRef for DataContractResolvedInfo<'a> { + fn as_ref(&self) -> &DataContract { + match self { + DataContractResolvedInfo::DataContractFetchInfo(fetch_info) => &fetch_info.contract, + DataContractResolvedInfo::BorrowedDataContract(borrowed) => borrowed, + DataContractResolvedInfo::OwnedDataContract(owned) => owned, + } + } +} + +/// Enumerates methods for identifying or referencing document types, accommodating various application needs. +#[derive(Clone, Debug)] +pub enum DocumentTypeInfo<'a> { + /// Contains the document type name as an owned `String`, suitable for dynamic or mutable scenarios. + DocumentTypeName(String), + + /// References the document type name via a borrowed `&'a str`, ideal for static or temporary usage. + DocumentTypeNameAsStr(&'a str), + + /// References a document type that has already been resolved through `DocumentTypeRef`. + DocumentTypeRef(DocumentTypeRef<'a>), +} + +impl<'a> DocumentTypeInfo<'a> { + /// Resolve the data contract info into an object that contains the data contract + pub fn resolve(self, contract: &'a DataContract) -> Result, ProtocolError> { + match self { + DocumentTypeInfo::DocumentTypeName(document_type_name) => contract + .document_type_for_name(document_type_name.as_str()) + .map_err(ProtocolError::DataContractError), + DocumentTypeInfo::DocumentTypeNameAsStr(document_type_name) => contract + .document_type_for_name(document_type_name) + .map_err(ProtocolError::DataContractError), + DocumentTypeInfo::DocumentTypeRef(document_type_ref) => Ok(document_type_ref), + } + } +} diff --git a/packages/rs-drive/src/drive/object_size_info/mod.rs b/packages/rs-drive/src/drive/object_size_info/mod.rs index 91eb8c07cd..7f739bb9b7 100644 --- a/packages/rs-drive/src/drive/object_size_info/mod.rs +++ b/packages/rs-drive/src/drive/object_size_info/mod.rs @@ -1,37 +1,9 @@ -// MIT LICENSE -// -// Copyright (c) 2021 Dash Core Group -// -// Permission is hereby granted, free of charge, to any -// person obtaining a copy of this software and associated -// documentation files (the "Software"), to deal in the -// Software without restriction, including without -// limitation the rights to use, copy, modify, merge, -// publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software -// is furnished to do so, subject to the following -// conditions: -// -// The above copyright notice and this permission notice -// shall be included in all copies or substantial portions -// of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -// ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -// TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -// SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -// IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -// DEALINGS IN THE SOFTWARE. -// - //! Object Size Info //! //! This module defines enums and implements functions relevant to the sizes of objects. //! +mod contract_info; mod deletion_info; mod document_and_contract_info; mod document_info; @@ -44,6 +16,7 @@ mod path_info; mod path_key_element_info; mod path_key_info; +pub use contract_info::*; pub use deletion_info::*; pub use document_and_contract_info::*; pub use document_info::*; diff --git a/packages/rs-sdk/src/platform/fetch_many.rs b/packages/rs-sdk/src/platform/fetch_many.rs index 6bfc96f92f..39446c1f69 100644 --- a/packages/rs-sdk/src/platform/fetch_many.rs +++ b/packages/rs-sdk/src/platform/fetch_many.rs @@ -21,7 +21,7 @@ use dpp::block::epoch::EpochIndex; use dpp::block::extended_epoch_info::ExtendedEpochInfo; use dpp::data_contract::DataContract; use dpp::document::Document; -use dpp::identity::{KeyID, Purpose}; +use dpp::identity::KeyID; use dpp::prelude::{Identifier, IdentityPublicKey}; use dpp::util::deserializer::ProtocolVersion; use dpp::version::ProtocolVersionVoteCount; From 63d06f6aaeb140a462e4c8e45a82774fc73ba806 Mon Sep 17 00:00:00 2001 From: lklimek <842586+lklimek@users.noreply.github.com> Date: Wed, 8 May 2024 00:23:21 +0200 Subject: [PATCH 160/191] refactor(sdk)!: don't return Arc in SdkBuilder (#1838) --- packages/rs-dapi-client/src/dapi_client.rs | 8 +- packages/rs-sdk/examples/read_contract.rs | 16 ++-- packages/rs-sdk/src/mock.rs | 2 +- packages/rs-sdk/src/mock/provider.rs | 6 +- packages/rs-sdk/src/mock/sdk.rs | 6 +- packages/rs-sdk/src/platform/fetch.rs | 4 +- packages/rs-sdk/src/platform/fetch_many.rs | 6 +- packages/rs-sdk/src/sdk.rs | 92 ++++++++++--------- packages/rs-sdk/tests/fetch/broadcast.rs | 3 +- packages/rs-sdk/tests/fetch/config.rs | 6 +- packages/rs-sdk/tests/fetch/mock_fetch.rs | 10 +- .../rs-sdk/tests/fetch/mock_fetch_many.rs | 2 +- 12 files changed, 81 insertions(+), 80 deletions(-) diff --git a/packages/rs-dapi-client/src/dapi_client.rs b/packages/rs-dapi-client/src/dapi_client.rs index f698050304..4c29819e20 100644 --- a/packages/rs-dapi-client/src/dapi_client.rs +++ b/packages/rs-dapi-client/src/dapi_client.rs @@ -3,7 +3,7 @@ use backon::{ExponentialBuilder, Retryable}; use dapi_grpc::mock::Mockable; use dapi_grpc::tonic::async_trait; -use std::sync::RwLock; +use std::sync::{Arc, RwLock}; use std::time::Duration; use tracing::Instrument; @@ -61,9 +61,9 @@ pub trait DapiRequestExecutor { } /// Access point to DAPI. -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct DapiClient { - address_list: RwLock, + address_list: Arc>, settings: RequestSettings, pool: ConnectionPool, #[cfg(feature = "dump")] @@ -77,7 +77,7 @@ impl DapiClient { let address_count = 3 * address_list.len(); Self { - address_list: RwLock::new(address_list), + address_list: Arc::new(RwLock::new(address_list)), settings, pool: ConnectionPool::new(address_count), #[cfg(feature = "dump")] diff --git a/packages/rs-sdk/examples/read_contract.rs b/packages/rs-sdk/examples/read_contract.rs index f0a2bf2b75..0f025efd8a 100644 --- a/packages/rs-sdk/examples/read_contract.rs +++ b/packages/rs-sdk/examples/read_contract.rs @@ -1,4 +1,4 @@ -use std::{num::NonZeroUsize, str::FromStr, sync::Arc}; +use std::{num::NonZeroUsize, str::FromStr}; use clap::Parser; use dash_sdk::{mock::provider::GrpcContextProvider, platform::Fetch, Sdk, SdkBuilder}; @@ -58,7 +58,7 @@ async fn main() { } /// Setup Rust SDK -fn setup_sdk(config: &Config) -> Arc { +fn setup_sdk(config: &Config) -> Sdk { // We need to implement a ContextProvider. // Here, we will just use a mock implementation. // Tricky thing here is that this implementation requires SDK, so we have a @@ -66,7 +66,7 @@ fn setup_sdk(config: &Config) -> Arc { // We'll first provide `None` Sdk, and then update it later. // // To modify context provider, we need locks and Arc to overcome ownership rules. - let context_provider = GrpcContextProvider::new( + let mut context_provider = GrpcContextProvider::new( None, &config.server_address, config.core_port, @@ -76,7 +76,6 @@ fn setup_sdk(config: &Config) -> Arc { NonZeroUsize::new(100).expect("quorum public keys cache size"), ) .expect("context provider"); - let context_provider = Arc::new(std::sync::Mutex::new(context_provider)); // Let's build the Sdk. // First, we need an URI of some Dash Platform DAPI host to connect to and use as seed. @@ -87,16 +86,13 @@ fn setup_sdk(config: &Config) -> Arc { .expect("parse uri"); // Now, we create the Sdk with the wallet and context provider. - let sdk = SdkBuilder::new(AddressList::from_iter([uri])) - .with_context_provider(Arc::clone(&context_provider)) + let mut sdk = SdkBuilder::new(AddressList::from_iter([uri])) .build() .expect("cannot build sdk"); // Reconfigure context provider with Sdk - let mut guard = context_provider.lock().expect("lock context provider"); - guard.set_sdk(Some(Arc::clone(&sdk))); - drop(guard); - + context_provider.set_sdk(Some(sdk.clone())); + sdk.set_context_provider(context_provider); // Return the SDK we created sdk } diff --git a/packages/rs-sdk/src/mock.rs b/packages/rs-sdk/src/mock.rs index 7e5208cd4f..b3f1b69c63 100644 --- a/packages/rs-sdk/src/mock.rs +++ b/packages/rs-sdk/src/mock.rs @@ -12,7 +12,7 @@ //! ## Example //! //! ```no_run -//! let sdk = dash_sdk::Sdk::new_mock(); +//! let mut sdk = dash_sdk::Sdk::new_mock(); //! let query = dash_sdk::platform::Identifier::random(); //! sdk.mock().expect_fetch(query, None as Option); //! ``` diff --git a/packages/rs-sdk/src/mock/provider.rs b/packages/rs-sdk/src/mock/provider.rs index 7e0d928c3a..aa5c6f1a66 100644 --- a/packages/rs-sdk/src/mock/provider.rs +++ b/packages/rs-sdk/src/mock/provider.rs @@ -24,7 +24,7 @@ pub struct GrpcContextProvider { /// values set by the user in the caches: `data_contracts_cache`, `quorum_public_keys_cache`. /// /// We use [Arc] as we have circular dependencies between Sdk and ContextProvider. - sdk: Option>, + sdk: Option, /// Data contracts cache. /// @@ -53,7 +53,7 @@ impl GrpcContextProvider { /// /// Sdk can be set later with [`GrpcContextProvider::set_sdk`]. pub fn new( - sdk: Option>, + sdk: Option, core_ip: &str, core_port: u16, core_user: &str, @@ -78,7 +78,7 @@ impl GrpcContextProvider { /// /// Note that if the `sdk` is `None`, the context provider will not be able to fetch data itself and will rely on /// values set by the user in the caches: `data_contracts_cache`, `quorum_public_keys_cache`. - pub fn set_sdk(&mut self, sdk: Option>) { + pub fn set_sdk(&mut self, sdk: Option) { self.sdk = sdk; } /// Set the directory where to store dumped data. diff --git a/packages/rs-sdk/src/mock/sdk.rs b/packages/rs-sdk/src/mock/sdk.rs index 6fadfea695..56cd074095 100644 --- a/packages/rs-sdk/src/mock/sdk.rs +++ b/packages/rs-sdk/src/mock/sdk.rs @@ -34,13 +34,13 @@ use super::MockResponse; /// ## Panics /// /// Can panic on errors. -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct MockDashPlatformSdk { from_proof_expectations: BTreeMap>, platform_version: &'static PlatformVersion, dapi: Arc>, prove: bool, - quorum_provider: Option, + quorum_provider: Option>, } impl MockDashPlatformSdk { @@ -68,7 +68,7 @@ impl MockDashPlatformSdk { pub fn quorum_info_dir>(&mut self, dir: P) -> &mut Self { let mut provider = MockContextProvider::new(); provider.quorum_keys_dir(Some(dir.as_ref().to_path_buf())); - self.quorum_provider = Some(provider); + self.quorum_provider = Some(Arc::new(provider)); self } diff --git a/packages/rs-sdk/src/platform/fetch.rs b/packages/rs-sdk/src/platform/fetch.rs index 70266354d2..0560524e0e 100644 --- a/packages/rs-sdk/src/platform/fetch.rs +++ b/packages/rs-sdk/src/platform/fetch.rs @@ -124,7 +124,7 @@ where tracing::trace!(request = ?request, response = ?response, object_type, "fetched object from platform"); let (object, response_metadata): (Option, ResponseMetadata) = - sdk.parse_proof_with_metadata(request, response)?; + sdk.parse_proof_with_metadata(request, response).await?; match object { Some(item) => Ok((item.into(), response_metadata)), @@ -165,7 +165,7 @@ where let object_type = std::any::type_name::().to_string(); tracing::trace!(request = ?request, response = ?response, object_type, "fetched object from platform"); - let object: Option = sdk.parse_proof(request, response)?; + let object: Option = sdk.parse_proof(request, response).await?; match object { Some(item) => Ok(item.into()), diff --git a/packages/rs-sdk/src/platform/fetch_many.rs b/packages/rs-sdk/src/platform/fetch_many.rs index 39446c1f69..aa1db58d35 100644 --- a/packages/rs-sdk/src/platform/fetch_many.rs +++ b/packages/rs-sdk/src/platform/fetch_many.rs @@ -142,7 +142,8 @@ where let object: BTreeMap> = sdk .parse_proof::<>::Request, BTreeMap>>( request, response, - )? + ) + .await? .unwrap_or_default(); Ok(object) @@ -227,7 +228,8 @@ impl FetchMany for Document { // let object: Option> = sdk let documents: BTreeMap> = sdk - .parse_proof::(document_query, response)? + .parse_proof::(document_query, response) + .await? .unwrap_or_default(); Ok(documents) diff --git a/packages/rs-sdk/src/sdk.rs b/packages/rs-sdk/src/sdk.rs index f6f40e14da..bf3618fa75 100644 --- a/packages/rs-sdk/src/sdk.rs +++ b/packages/rs-sdk/src/sdk.rs @@ -2,7 +2,7 @@ use std::collections::btree_map::Entry; use std::sync::Arc; -use std::{fmt::Debug, num::NonZeroUsize, ops::DerefMut}; +use std::{fmt::Debug, num::NonZeroUsize}; use crate::error::Error; use crate::internal_cache::InternalSdkCache; @@ -33,7 +33,7 @@ use rs_dapi_client::{ use std::path::{Path, PathBuf}; use std::time::{SystemTime, UNIX_EPOCH}; #[cfg(feature = "mocks")] -use tokio::sync::Mutex; +use tokio::sync::{Mutex, MutexGuard}; use tokio_util::sync::{CancellationToken, WaitForCancellationFuture}; /// How many data contracts fit in the cache. @@ -69,9 +69,12 @@ pub type LastQueryTimestamp = u64; /// Sdk is thread safe and can be shared between threads. /// It uses internal locking when needed. /// +/// It is also safe to clone the Sdk. +/// /// ## Examples /// /// See tests/ for examples of using the SDK. +#[derive(Clone)] pub struct Sdk { inner: SdkInstance, /// Use proofs when retrieving data from the platform. @@ -80,14 +83,14 @@ pub struct Sdk { proofs: bool, /// An internal SDK cache managed exclusively by the SDK - internal_cache: InternalSdkCache, + internal_cache: Arc, /// Context provider used by the SDK. /// /// ## Panics /// /// Note that setting this to None can panic. - context_provider: std::sync::Mutex>>, + context_provider: Option>>, /// Cancellation token; once cancelled, all pending requests should be aborted. pub(crate) cancel_token: CancellationToken, @@ -118,7 +121,7 @@ impl Debug for Sdk { /// /// This is used to store the actual Sdk instance, which can be either a real Sdk or a mock Sdk. /// We use it to avoid exposing internals defined below to the public. -#[derive(Debug)] +#[derive(Debug, Clone)] enum SdkInstance { /// Real Sdk, using DAPI with gRPC transport Dapi { @@ -136,7 +139,10 @@ enum SdkInstance { /// Dapi client is wrapped in a tokio [Mutex](tokio::sync::Mutex) as it's used in async context. dapi: Arc>, /// Mock SDK implementation processing mock expectations and responses. - mock: std::sync::Mutex, + mock: Arc>, + + /// Platform version configured for this Sdk + version: &'static PlatformVersion, }, } @@ -146,7 +152,7 @@ impl Sdk { /// This is a helper method that uses [`SdkBuilder`] to initialize the SDK in mock mode. /// /// See also [`SdkBuilder`]. - pub fn new_mock() -> Arc { + pub fn new_mock() -> Self { SdkBuilder::default() .build() .expect("mock should be created") @@ -160,7 +166,7 @@ impl Sdk { /// /// - `R`: Type of the request that was used to fetch the proof. /// - `O`: Type of the object to be retrieved from the proof. - pub(crate) fn parse_proof + MockResponse>( + pub(crate) async fn parse_proof + MockResponse>( &self, request: O::Request, response: O::Response, @@ -169,6 +175,7 @@ impl Sdk { O::Request: Mockable, { self.parse_proof_with_metadata(request, response) + .await .map(|result| result.0) } @@ -180,7 +187,7 @@ impl Sdk { /// /// - `R`: Type of the request that was used to fetch the proof. /// - `O`: Type of the object to be retrieved from the proof. - pub(crate) fn parse_proof_with_metadata + MockResponse>( + pub(crate) async fn parse_proof_with_metadata + MockResponse>( &self, request: O::Request, response: O::Response, @@ -188,11 +195,8 @@ impl Sdk { where O::Request: Mockable, { - let guard = self + let provider = self .context_provider - .lock() - .expect("context provider lock poisoned"); - let provider = guard .as_ref() .ok_or(drive_proof_verifier::Error::ContextProviderNotSet)?; @@ -201,7 +205,10 @@ impl Sdk { O::maybe_from_proof_with_metadata(request, response, self.version(), &provider) } #[cfg(feature = "mocks")] - SdkInstance::Mock { .. } => self.mock().parse_proof_with_metadata(request, response), + SdkInstance::Mock { ref mock, .. } => { + let guard = mock.lock().await; + guard.parse_proof_with_metadata(request, response) + } } } @@ -211,15 +218,19 @@ impl Sdk { /// /// # Panics /// - /// Panics if the `self` instance is not a `Mock` variant. + /// Panics when: + /// + /// * the `self` instance is not a `Mock` variant, + /// * the `self` instance is in use by another thread. #[cfg(feature = "mocks")] - pub fn mock(&self) -> std::sync::MutexGuard { + pub fn mock(&mut self) -> MutexGuard { if let Sdk { inner: SdkInstance::Mock { ref mock, .. }, .. } = self { - mock.lock().expect("mock lock poisoned") + mock.try_lock() + .expect("mock sdk is in use by another thread and connot be reconfigured") } else { panic!("not a mock") } @@ -414,7 +425,7 @@ impl Sdk { match &self.inner { SdkInstance::Dapi { version, .. } => version, #[cfg(feature = "mocks")] - SdkInstance::Mock { .. } => self.mock().version(), + SdkInstance::Mock { version, .. } => version, } } @@ -428,13 +439,9 @@ impl Sdk { /// [ContextProvider] is used to access state information, like data contracts and quorum public keys. /// /// Note that this will overwrite any previous context provider. - pub fn set_context_provider(&self, context_provider: C) { - let mut guard = self - .context_provider - .lock() - .expect("context provider lock poisoned"); - - guard.deref_mut().replace(Box::new(context_provider)); + pub fn set_context_provider(&mut self, context_provider: C) { + self.context_provider + .replace(Arc::new(Box::new(context_provider))); } /// Returns a future that resolves when the Sdk is cancelled (eg. shutdown was requested). @@ -545,6 +552,7 @@ impl Default for SdkBuilder { cancel_token: CancellationToken::new(), version: PlatformVersion::latest(), + #[cfg(feature = "mocks")] dump_dir: None, } @@ -673,36 +681,33 @@ impl SdkBuilder { /// # Errors /// /// This method will return an error if the Sdk cannot be created. - pub fn build(self) -> Result, Error> { + pub fn build(self) -> Result { PlatformVersion::set_current(self.version); - let sdk= match self.addresses { + let sdk= match self.addresses { // non-mock mode Some(addresses) => { let dapi = DapiClient::new(addresses, self.settings); #[cfg(feature = "mocks")] let dapi = dapi.dump_dir(self.dump_dir.clone()); - let sdk= Sdk{ + let mut sdk= Sdk{ inner:SdkInstance::Dapi { dapi, version:self.version }, proofs:self.proofs, - context_provider: std::sync:: Mutex::new(self.context_provider), + context_provider: self.context_provider.map(Arc::new), cancel_token: self.cancel_token, #[cfg(feature = "mocks")] dump_dir: self.dump_dir, internal_cache: Default::default(), }; - let sdk = Arc::new(sdk); - // if context provider is not set correctly (is None), it means we need to fallback to core wallet - let mut ctx_guard = sdk.context_provider.lock().expect("lock poisoned"); - if ctx_guard.is_none() { + if sdk.context_provider.is_none() { #[cfg(feature = "mocks")] if !self.core_ip.is_empty() { tracing::warn!("ContextProvider not set; mocking with Dash Core. \ Please provide your own ContextProvider with SdkBuilder::with_context_provider()."); - let mut context_provider = GrpcContextProvider::new(Some(Arc::clone(&sdk)), + let mut context_provider = GrpcContextProvider::new(Some(sdk.clone()), &self.core_ip, self.core_port, &self.core_user, &self.core_password, self.data_contract_cache_size, self.quorum_public_keys_cache_size)?; #[cfg(feature = "mocks")] @@ -710,7 +715,7 @@ impl SdkBuilder { context_provider.set_dump_dir(sdk.dump_dir.clone()); } - ctx_guard.replace(Box::new(context_provider)); + sdk.context_provider.replace(Arc::new(Box::new(context_provider))); } else{ tracing::warn!( "Configure ContextProvider with Sdk::with_context_provider(); otherwise Sdk will fail"); @@ -719,9 +724,8 @@ impl SdkBuilder { tracing::warn!( "Configure ContextProvider with Sdk::with_context_provider(); otherwise Sdk will fail"); }; - drop(ctx_guard); - Ok(sdk) + sdk }, #[cfg(feature = "mocks")] // mock mode @@ -730,23 +734,23 @@ impl SdkBuilder { // We create mock context provider that will use the mock DAPI client to retrieve data contracts. let context_provider = self.context_provider.unwrap_or(Box::new(MockContextProvider::new())); - let sdk = Sdk { + Sdk { inner:SdkInstance::Mock { - mock: std::sync::Mutex::new( MockDashPlatformSdk::new(self.version, Arc::clone(&dapi), self.proofs)), + mock:Arc::new(Mutex::new( MockDashPlatformSdk::new(self.version, Arc::clone(&dapi), self.proofs))), dapi, + version:self.version, }, dump_dir: self.dump_dir, proofs:self.proofs, internal_cache: Default::default(), - context_provider: std::sync:: Mutex::new( Some(context_provider)), + context_provider:Some(Arc::new(context_provider)), cancel_token: self.cancel_token, - }; - Ok(Arc::new(sdk)) + } }, #[cfg(not(feature = "mocks"))] - None => Err(Error::Config("Mock mode is not available. Please enable `mocks` feature or provide address list.".to_string())), + None => return Err(Error::Config("Mock mode is not available. Please enable `mocks` feature or provide address list.".to_string())), }; - sdk + Ok(sdk) } } diff --git a/packages/rs-sdk/tests/fetch/broadcast.rs b/packages/rs-sdk/tests/fetch/broadcast.rs index ff8b821ab8..b6566bc0b1 100644 --- a/packages/rs-sdk/tests/fetch/broadcast.rs +++ b/packages/rs-sdk/tests/fetch/broadcast.rs @@ -20,7 +20,6 @@ mod online { let cfg = Config::new(); let sdk = cfg.setup_api("test_wait_timeout").await; - let sdk_ref: &Sdk = sdk.as_ref(); let request: WaitForStateTransitionResultRequest = WaitForStateTransitionResultRequestV0 { prove: false, @@ -36,7 +35,7 @@ mod online { // we add few millis to duration to give chance to the server to time out before we kill request let response = tokio::time::timeout( TIMEOUT + Duration::from_millis(100), - request.execute(sdk_ref, settings), + request.execute(&sdk, settings), ) .await .expect("expected request timeout, got tokio timeout"); diff --git a/packages/rs-sdk/tests/fetch/config.rs b/packages/rs-sdk/tests/fetch/config.rs index d4b0c5132f..839f3dec9d 100644 --- a/packages/rs-sdk/tests/fetch/config.rs +++ b/packages/rs-sdk/tests/fetch/config.rs @@ -6,7 +6,7 @@ use dpp::prelude::Identifier; use rs_dapi_client::AddressList; use serde::Deserialize; -use std::{path::PathBuf, str::FromStr, sync::Arc}; +use std::{path::PathBuf, str::FromStr}; /// Existing document ID /// @@ -144,7 +144,7 @@ impl Config { /// expectations from different tests. /// /// When empty string is provided, expectations are stored in the root of the dump directory. - pub async fn setup_api(&self, namespace: &str) -> Arc { + pub async fn setup_api(&self, namespace: &str) -> dash_sdk::Sdk { let dump_dir = match namespace.is_empty() { true => self.dump_dir.clone(), false => self.dump_dir.join(sanitize_filename::sanitize(namespace)), @@ -194,7 +194,7 @@ impl Config { // offline testing takes precedence over network testing #[cfg(feature = "offline-testing")] let sdk = { - let mock_sdk = dash_sdk::SdkBuilder::new_mock() + let mut mock_sdk = dash_sdk::SdkBuilder::new_mock() .build() .expect("initialize api"); diff --git a/packages/rs-sdk/tests/fetch/mock_fetch.rs b/packages/rs-sdk/tests/fetch/mock_fetch.rs index 1f735e5e54..a5d4916077 100644 --- a/packages/rs-sdk/tests/fetch/mock_fetch.rs +++ b/packages/rs-sdk/tests/fetch/mock_fetch.rs @@ -22,7 +22,7 @@ use dpp::{ #[tokio::test] /// Given some identity, when I fetch it using mock API, then I get the same identity async fn test_mock_fetch_identity() { - let sdk = Sdk::new_mock(); + let mut sdk = Sdk::new_mock(); let expected: Identity = Identity::from(IdentityV0::default()); let query = expected.id(); @@ -43,7 +43,7 @@ async fn test_mock_fetch_identity() { #[tokio::test] /// When I define mock expectation twice for the same request, second call ends with error async fn test_mock_fetch_duplicate_expectation() { - let sdk = Sdk::new_mock(); + let mut sdk = Sdk::new_mock(); let expected: Identity = Identity::from(IdentityV0::default()); let expected2 = @@ -72,7 +72,7 @@ async fn test_mock_fetch_duplicate_expectation() { #[tokio::test] /// Given some random identity ID, when I fetch it using mock API, then I get None async fn test_mock_fetch_identity_not_found() { - let sdk = Sdk::new_mock(); + let mut sdk = Sdk::new_mock(); let id = Identifier::random(); @@ -91,7 +91,7 @@ async fn test_mock_fetch_identity_not_found() { /// Given some data contract, when I fetch it by ID, I get it. #[tokio::test] async fn test_mock_fetch_data_contract() { - let sdk = Sdk::new_mock(); + let mut sdk = Sdk::new_mock(); let document_type: DocumentType = mock_document_type(); let expected = mock_data_contract(Some(&document_type)); @@ -114,7 +114,7 @@ async fn test_mock_fetch_data_contract() { async fn test_mock_fetch_document() { use dpp::document::DocumentV0Getters; - let sdk = Sdk::new_mock(); + let mut sdk = Sdk::new_mock(); let document_type: DocumentType = mock_document_type(); let data_contract = mock_data_contract(Some(&document_type)); diff --git a/packages/rs-sdk/tests/fetch/mock_fetch_many.rs b/packages/rs-sdk/tests/fetch/mock_fetch_many.rs index 1663ad8aa5..fdf3811d8d 100644 --- a/packages/rs-sdk/tests/fetch/mock_fetch_many.rs +++ b/packages/rs-sdk/tests/fetch/mock_fetch_many.rs @@ -19,7 +19,7 @@ use dpp::{ /// document. #[tokio::test] async fn test_mock_document_fetch_many() { - let sdk = Sdk::new_mock(); + let mut sdk = Sdk::new_mock(); let document_type: DocumentType = mock_document_type(); let data_contract = mock_data_contract(Some(&document_type)); From fbdfef57ea5597e868c383e8183508a81e5bf76b Mon Sep 17 00:00:00 2001 From: pauldelucia Date: Wed, 8 May 2024 17:36:33 +0530 Subject: [PATCH 161/191] feat: make start identities number u16 --- packages/strategy-tests/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/strategy-tests/src/lib.rs b/packages/strategy-tests/src/lib.rs index 29ce98f09c..1ada5b8384 100644 --- a/packages/strategy-tests/src/lib.rs +++ b/packages/strategy-tests/src/lib.rs @@ -124,7 +124,7 @@ pub struct StrategyConfig { /// Identities to register on the first block of the strategy #[derive(Clone, Debug, PartialEq, Default, Encode, Decode)] pub struct StartIdentities { - pub number_of_identities: u8, + pub number_of_identities: u16, pub keys_per_identity: u8, pub starting_balances: u64, // starting balance in duffs pub extra_keys: KeyMaps, From e624e02ff2f99c1f9ffd8221fd4746db9a27fe24 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Wed, 8 May 2024 23:45:16 +0700 Subject: [PATCH 162/191] chore: observability and security for HTTP gateway (#1825) --- ...-core-npm-3.26.5-02719845fd-4e2aa1a945.zip | Bin 0 -> 166839 bytes .../color-npm-4.2.3-4a23227581-b23f5e500a.zip | Bin 0 -> 6567 bytes ...string-npm-1.9.1-dc020e56be-72aa0b81ee.zip | Bin 0 -> 4141 bytes .../ejs-npm-3.1.10-4e8cf4bdc1-a9cb7d7cd1.zip | Bin 0 -> 47501 bytes ...imatch-npm-9.0.4-7be5a33efc-4cdc18d112.zip | Bin 0 -> 127958 bytes ...prompt-npm-1.1.3-0190666768-1cf7001e66.zip | Bin 0 -> 2966 bytes Cargo.lock | 310 +++++++++-- Dockerfile | 3 +- packages/dashmate/README.md | 6 +- .../configs/defaults/getBaseConfigFactory.js | 96 +++- .../configs/defaults/getLocalConfigFactory.js | 18 +- .../defaults/getTestnetConfigFactory.js | 6 +- .../configs/getConfigFileMigrationsFactory.js | 95 +++- ...ocker-compose.build.dapi_core_streams.yml} | 2 +- .../docker-compose.rate_limiter.metrics.yml | 20 + .../dashmate/docker-compose.rate_limiter.yml | 54 ++ packages/dashmate/docker-compose.yml | 49 +- packages/dashmate/scripts/helper.js | 4 +- .../dashmate/src/commands/config/render.js | 2 +- .../dashmate/src/config/configJsonSchema.js | 367 ++++++++++--- .../src/config/generateEnvsFactory.js | 17 +- .../src/core/wallet/registerMasternode.js | 2 +- .../scheduleRenewZeroSslCertificateFactory.js | 11 +- .../src/listr/prompts/createIpAndPortsForm.js | 2 +- .../waitForNodeToBeReadyTaskFactory.js | 4 +- .../setup/regular/configureNodeTaskFactory.js | 2 +- .../configureSSLCertificateTaskFactory.js | 4 +- .../getConfigurationOutputFromContext.js | 2 +- .../registerMasternodeWithCoreWallet.js | 2 +- .../registerMasternodeGuideTaskFactory.js | 2 +- .../setup/setupLocalPresetTaskFactory.js | 6 +- .../src/listr/tasks/ssl/VerificationServer.js | 12 +- .../listr/tasks/ssl/saveCertificateTask.js | 5 +- .../obtainZeroSSLCertificateTaskFactory.js | 12 +- .../src/listr/tasks/startNodeTaskFactory.js | 24 +- .../dashmate/src/status/scopes/platform.js | 4 +- .../dashmate/src/test/constants/services.js | 4 +- .../dashmate/src/test/mock/getConfigMock.js | 6 +- .../templates/dynamic-compose.yml.dot | 9 + .../platform/dapi/envoy/envoy.yaml.dot | 263 ---------- .../_zerossl_validation.yaml.dot | 0 .../templates/platform/gateway/envoy.yaml.dot | 487 ++++++++++++++++++ .../rate_limiter/rate_limiter.yaml.dot | 23 + .../rate_limiter/statsd_exporter.yaml.dot | 93 ++++ .../dashmate/test/e2e/localNetwork.spec.js | 2 +- .../dashmate/test/e2e/testnetEvonode.spec.js | 2 +- .../dashmate/test/e2e/testnetFullnode.spec.js | 2 +- .../test/unit/status/scopes/platform.spec.js | 2 +- packages/rs-drive-abci/.env.local | 4 +- packages/rs-drive-abci/.env.mainnet | 4 +- packages/rs-drive-abci/.env.testnet | 4 +- packages/rs-drive-abci/Cargo.toml | 4 +- packages/rs-drive-abci/src/logging/level.rs | 2 +- packages/rs-drive-abci/src/main.rs | 2 + packages/rs-drive-abci/src/metrics.rs | 73 ++- packages/rs-drive-abci/src/query/service.rs | 79 ++- scripts/configure_dotenv.sh | 2 +- 57 files changed, 1682 insertions(+), 528 deletions(-) create mode 100644 .yarn/cache/@oclif-core-npm-3.26.5-02719845fd-4e2aa1a945.zip create mode 100644 .yarn/cache/color-npm-4.2.3-4a23227581-b23f5e500a.zip create mode 100644 .yarn/cache/color-string-npm-1.9.1-dc020e56be-72aa0b81ee.zip create mode 100644 .yarn/cache/ejs-npm-3.1.10-4e8cf4bdc1-a9cb7d7cd1.zip create mode 100644 .yarn/cache/minimatch-npm-9.0.4-7be5a33efc-4cdc18d112.zip create mode 100644 .yarn/cache/password-prompt-npm-1.1.3-0190666768-1cf7001e66.zip rename packages/dashmate/{docker-compose.build.dapi_tx_filter_stream.yml => docker-compose.build.dapi_core_streams.yml} (96%) create mode 100644 packages/dashmate/docker-compose.rate_limiter.metrics.yml create mode 100644 packages/dashmate/docker-compose.rate_limiter.yml delete mode 100644 packages/dashmate/templates/platform/dapi/envoy/envoy.yaml.dot rename packages/dashmate/templates/platform/{dapi/envoy => gateway}/_zerossl_validation.yaml.dot (100%) create mode 100644 packages/dashmate/templates/platform/gateway/envoy.yaml.dot create mode 100644 packages/dashmate/templates/platform/gateway/rate_limiter/rate_limiter.yaml.dot create mode 100644 packages/dashmate/templates/platform/gateway/rate_limiter/statsd_exporter.yaml.dot diff --git a/.yarn/cache/@oclif-core-npm-3.26.5-02719845fd-4e2aa1a945.zip b/.yarn/cache/@oclif-core-npm-3.26.5-02719845fd-4e2aa1a945.zip new file mode 100644 index 0000000000000000000000000000000000000000..abfc68a753a802501e4546c0960b69c062029440 GIT binary patch literal 166839 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�tx9qnmpDf#BPU|*;IJ3L0M^9|mA ztnM@*TdJ(-SER5N$v7-FC=*JgEX+T*-HbV6_Dugkkn^TqYj+hSdPVC0DNCWv zF^(+?coLp0z{ zncK(6x`lwvF_x;T3_2`Mg1?6@H;7|ldKp#&)7Z*5=x|f;3~{=qTy1+a72t;3%c6dF ztXh}Q9#l@(-H6=*baUPIhbZl=@G;+iv`z>cz2Pe7YN;zci-4U1{2ghd!6cf4Q=HnX z%>EfEuILs8z1nt*Vy(sNv%ZhGp>oO!ayt-=5Xz3j+f#C~h%Ucu(?PpyU(RydS)ou9 z!2DBhlvitWLP*b}Owp~AOW}T(VT!%ZZ2@`iA|I+|=>v45u|K8OUT%4z)L`wZ4bzWEQ=zQ81JA!K?bxVKHRfv1 z?=j`VR&xp^VOWOrRaK>o(La<+4O;ygThGa}q1KE`y5YX%=R_|fL*1B9#-uP+cLerS zw5=-)GQO|D{8$QP+HAS}*=N}(rJWO9tep5P2dvuulK%It?QJluhtv;e0s7g{|I6N< zf4t9j|K$B7{IC>$n2_gpRMnJX6^ZdR2uMgUG+}V!A#$0lCwWh}Cmku3$L@XpauC!y z0>;CwSDtk}Bv1i_>E;^+%WTye^_RkdF-~npmXR-neJ`O46DWn0JZ?oy%cx@eU>#j> zZU19`d#sXTD(R(@RF^BNJ(`UkexF>LEiF|CvF2b8ODM;^UWIT>3D+vND7#+9Aq6U0 zaYEQ^8B#D(`_yHYIAZK*3YuY~5uGwH{FQ+1+%Cz|&Xndwx-7P67pu-XAj_goeuSGs z=uj1_nawIrg${ppwVh{YDw`N0w<04|S6p_z#h2Aa)MslSDq@}f^%@C~Y!{TnF`@ug z7-pF|B>YB8)AAiCyHNpnVJ}?Rlle=e=@OpAd;WcOiJw|+_V<3!%HnsVZ(%EhZ**-~ zr2s-A_G6t~&8KKz1D9sKKCF-UASFxQ{}v`wNEw$3^HXtGq4;l@CH|lL)<3Tw>bR(F z*mr!`u4xC1 z1AvfsFEq^IGdq{jVBxzHsh`Alo$519 zUc7kjHhZzN?u=bouCcD8nIolwMynq87{HUo_$YI4s2U);fcfUv)BP^WvU9?#gZAzt zy$JX-1zI)_$+IRWx6=*J_Pu9;++R_-!>4xmTW!*3q?_Q}b3m3$v4kkMPU?;(r?z;_ zu{pMwtlr?mNpZ0wP@)tZRqhBs(?hkVK_`83HS%VlXivMqqk=?gQQ-|Op@M852$yG3KLU&)(Ap+?pKAzv(`kZN`gNoVCL zYM;r{1*@sEStcd(AP;aSAe8N~*Ve>ZOs;+vuc zc3nt|BH%QlaX20_5;nWWU1MqZtGXmWkTr-(PV6xms!FVtMa6Fi$L(@zoVHo_x z8ai*qiSUS^ag^12z`Y|1Q%;Qp8qEZ=w#M3rPxc;$v|g8N@S{xoOvW*^#>7v*wci!G z)>+rVTqlV+!Id*-2D#Eh(Vtv39Dz+yOZiY!9QAke9^aB^six}WZTr-(bOL+?fm*%5Z&l`QE-BxUzri=&- z#2BDf$a4BBd1U#LqB#ZBb?%&Inp6)D;B)oBMs#$++L{?*A{lTAw*K5bm-K7?C_#V$ z4QKRb{HQcp88X%;@Ldb?wM&<7%^NN-Uxz=7+%Sg-)Yt;+p=^DT-~z+aD*_39M#N4Y zz_O<*8q6x`#~n~a?Ih~b%^*#rN)n3iO_~u-+8J_tQsfu368j)!p|fF~-m^s7hvsW^ zqRm>-N-rBXEua_+gc2So8COJ9tm~$Pmn-hTm5Wp_=3Pol90rlZH6G87HFO~2-4MVy z;MCe--<%(*DChW7n5=1U6h%8k^BtApX+iQC_l1g#iGd5|tqYY*thp3mhL1B%5Fj5t zd+bX&(ds3d$SkR!3)#Qwp}k-pD4?3c5??=9G> zKnJ7(VTqo5X0sm+h@^WSXXFDjrn-P(JOM2DfG(GaL``8>Pw16T!i}}JD2q#;d zbfxhANLi_>c!)Ju-3WYuady#!{oVP%+Qz6XdBZtD3@4pLwl77J7|jb$ePJj|;krF7 zrZ!lFGA0J5kZ#@8GwyfRQpqKH(d6b|O7%!t&}OYk;EEesv|a-}x6EWMA~9y@g(>O& zRZ|dM>_ete(Q^453H?;tvbKj3$Dkf=9tCfzS}?t{zC~t*;A-4CdrY&L&Tn^1DrM)_ z8ar@fltm|8Z!cig5tjK5i+&@i2w^>z5$sev@-VH%eNF zN*cq?mnR=y2-(+~5nyJkS6ETl#;iNF$ATmQ5@IY|!5Wz_4le;@f%pOKRq>F1@ktXS zgN_U0f$SU$t)9csrWDMUiQ_NeWH$(H7!Y{1gIk$AUNzR5ym&nZgwo-kTyR2i05t+q zCT}+Hl{?GRzZ4H#2UU*ASd+rgmq~|@W?*mYMJGaTG_CJ3OsCVx=}8cRve8B$sh7Kt zzaj;$AY`&{qfk>Xf(!+eedL&Vb4?S>U2m`#%wCyjy5azKI7tXkkq|9A%0}muW*CQ; z;dQKZ8sx0|dG%Rck1gWX@VS+T3!NwShYGRSDWrn$+zJ#^+^nGw9Gn(0F01qvOVA9g zeB&y+cW}_EKt;Cn9Sc z&!c~|VM)l%>DhZa!ng;(~IN;tGLMO&TrGyNrR}`%|MBvVH)(YBC<5s zyJJBtLbv_oEx?*0*VO~b8M_ApWfVAeq%*z){v;&GUjiLk_}4;D)y6?9%aRiJhH%&i zun^cS1tz~*GPG@~4DPA+S$H=HAJWb43C+=iNsx#*Ok!1GL0As^iM0TqU>lgxcgZ0j5e*$RbKed zSrI*>l}Xw{LV{V+$=TXte*=Mp0_?@zI%JK+l;Ac}cv)jCeDe_?JEFZ-?X?_r_kJN0e1t9kMfuwnW;1QlI&6pM-i zDS)d729BF*B^%S|jyJ|xy0S2pO(c4Td>i2~_IDB}sIDSCzop_f+Z|WLBWaY?B8yNp zqsJpFQr0*FZ0!VMAggqtCvZZtkA6>OsEE_9z$wIYDP=Ij>e&gmLEj?u=xLj_+*=?{ zs?g(sGZD%t)(iEloF7!FIPz1<(8kTJ-x>A)w3;1mE#h0_iF~%MTC5qJZ7Zq6M}DT0 zIqhH*R=%1DSq`!8cxJK!Q~DH$_iWkE++}PAa3XdA&iHrupxE)V-X|<$3@;^_gd#vt zCPUCu&o}K{8$Hzt$JE|$SA){w%U~J)=EZi52cY>C!j69M#-TgL`U0WQ?8U8nyADfE z;S7)lLW`JlfNe&$E(g(FNygOWBJ&Jh^%p!0cN*s7d*c1cN8>};fwwz0CWeDYb6AYC z8)HIZ9#V=(#pvLflQCVJrX6LFrn`p4iJwnHOpOp5Acrrx1qUI-zG+EzJexK|(Mj`W zBx`Z&?o(|6HW!=3mHd{hZX<&Y@?Z<8Ij3nxg>)7XICK-kYC=8IZhHm#k=|7}kU*+T7BjwY30z0s83|-3sA_?Tv}4q`b+ytjO`j4u#)eSToNrqu zYIg7i(UF(Pm58-WliH>MFAfo_eS1SVepCQr+r1F2&wDMi4U#sYU7`Y?2wV3go&2wV z27o5XriOaHPk@5#G|X55tfC6)HP<0aFNBT4*YB^fAkn#_$b5qXVF}J1QlYZezKDQv z7@nL)QrbkHW`VzeP|+CakVO49q8Jg4jF0DYP^v?nuSnQF@BY8>-jVRaupfn+o;t^s zkVD+rZ#bTyb9G}Dn)p|-291E4Qp7Hh4A@oUI~PWx<%t_H;QE3;MnoVLuSg%0bH$)N zY5(GFxFMvKfb7?kQ*B*s<}_IzA?Z|vZr76Wwc@J7bLpEe^ETmKPj zwMCt&YKr}Oi~mj^0#6BG)=8->T}XNJtVYl~U_wsEsO17Z^FQTZGBFrYR)m0$aBzqM zK_7;gZeU_vwJ_rPUAOe%uHEd$A-~&Wk1w+|ol^9m^jiZfyyrx`a6xAA((kEL-kJc3 z$B?Giw!PI5gr+G|HO@T#Fb>|nCnf>Rb`$_w_gsA z_}e5ZdGS3pMD1PE1oJ7xc8$X7T#D*6x{#TMc>ohN20=SVh0k{nxlfPM259W->EnW;O$yOm+1m_H@MAqq zA_DGhV&Go&g3yw5?nTe+4g06wU+_la>LAW)UeK5$8(X7kL%BsO<%{TZWwMtOu(;|? zVxjJP7wnam&(4AMWcSoE(>6tJjKqp?V@3@i8SVKPrKFbmwVA-={52iJ2GL*0bT@_k zHU~a-)L(_Lz{J*Ol@MM9la+NymcjJ!E_>7Xj4~j`4a;$L^#hEItlvaO#|VGP>T~ei zMpjL6M#&28vtf=WoU+ZV$os4Cy2I)x0GDTGt4S_AYDDidD{WS$ubT{07JpLI2HI)z z&UymCp7%Wy&E&U^Qz364Lk+0Z2+B7`vCeVbabt>laH_Pk?e4Q`ewipMVaV#Q!>Me^Bl+l8gXp<24{zE_)xG1} zD&5M!N%uGSW&gf)n?1c}8ZqSc!^GL7>9G}9zYOagFWQDpd%UXE;e}xe)@HcshbI_9ehu)JNNA8NM&xU*4vchka*U|FqPlL@rqi zCK#ds%4qvL{aSNb;;Y1G%$`eoC4o*%yzPMzdxoct%!BBlJ`LJkLTmKL;14NsJ(>8& zB=oZ%`5S)9BZK)7Hod>-p%(g(LvV>UJb-px1uuu8Pc1`Qf-A$t*rw%CO(JSSiRGb= z+n{CG(u0I+&HcMyk?c?p{OP2U^pp9>*ZNM=6yDBn)g~KNdCnRunWH&OL5(CQcwd(S zOod*MMaIgVgC8r01rph?sA<@UF+5~PXF&hlnQr7H5u(lTp8C#!lje@_mLaw2+gcrC zkQ8g9w&ii8n)B`z@L5SmYq{-A>$`@Ow>#9)Yp9wFEx(+oI#7jW0^ZXeVMuCyWlE2d z-KrI_5h{0mGUQEa>f=DG)S1}|`p6f5$RMnClm7$Y2WsHlWmIDzm0k42pJW#s-Q8{i zNN4t{n*$&GNpz3Ta?X}HFu&k4g74w7Sm`RaQMH80QGmU#>0-Rd`UM7(oM0{j0TX30 zl8RF$h}uKfzkQD7>p+SsZy4A0+-7SgE7-J1@?U$$0hpmS9FbD#bz35tTmG`&riuN0 zbI0(L_wh^4l>r~6=P``dCoUQ)qn&KPV#Tj)UH%>dSobm-qhICwC5l<@Vf}E_*Buj1 zW4DW!fB!HJnw8Fub@m+^_Wu>_Jda|g@j=dWKYQ10Nq={`XhWWYu;OZe{8Nh4#WEU+am?dLccx%p(XMi~J?-~y0{RJ#kky?*PseAZ zI1V&_7TmlY)-RwYRxfLiF-6Glx0<}aft~_9X1v=0EcwuTUS)!IrMq|*5yVIxqGL9$ zLWBowi%Y>%-0wiCau6X*4mGBZsj|S5dT8Y(DaLG9m!RTO-h>|@cq`L zRxg&xzwAWz)TjlvmIX9%FK_M;r*w`1JODT7!=}}jubkdrhqNFFY^yr_fDywu;w<^= ze3;X|XwZRo8yS3HPW76!URHS%Ems?C z@~3zo4tb-2OA;8zHSnALDY?2*G(lI7AJ9guBROVv6nR+TFI}6ynAq7;f~fk`4q&yd zQod6C=?`9JTa~YMQ+RU~B?9^LW0zk(gk^AAV$`}0RS)luruytmAn;(3)va5$(~l0y zZjO9+ySzMv_6RkbyWY5_0$+8tsqx%D5Qq_u+vWDn#_toItC~~bgW^v6 zy@XoaOYY6*vyXq7R!uHK3b>^&ldBR> zBaW*Co&e{q#jR*-eG!DE?Tu5wTP}p=CDsk}CW|)%ZW#o>x}XSKi3b#DCzwR?2E7dl zlo1i0WRPb^Omf$AN;P{F%0RK8QXjnYqL*skk4|_Rlm zFA^IpGGv(2dYNSq8q>i0!!W~}S!M@?6eXAf{6AAZ8$T0xI>hsd$5J+3KjXv+r$df? z#qkcJ2!V~{tUohT-WcAz`Bt$8`T+v6 z(|lO+m-0Xl=Qn;*j}FaCj3BHH(f0GC9nozb4xMxdWG^+i8GW72j*5_S1eOakpJhdJ z9m?(MrM+He7X(^6M72=mjISkF=JH&TJ4&wC>4Kqp01kfs_UJeU2~zA+T>m~81POKQ z-#ACf>|Y=~ij_TcAsMxn15lo&OI~5LO!SlfL`LzY#F$0gR1TO{caN>23WlC?kkb}W z<0TqM40m#f;@hXQV0vktg@Epng&Q-{%wktv5)p+jzew}cCK32VP8tDCfRY*SH6GXm zu4hI)?GKxqYDx9mTWJ3DhtWAfJ9SzlI&$D7I`^iYTwGWq3-m;3CsK|bk@)!G4Q9zN z%WykC!CjIS<#`ro6_QbOQk_@FqkGBJD?V$IR6{3>?vW8Xu+38V24ik;(+lPpd!y9q zgwh8qO}T7_B?fEUG^0r?%IXbx9(wx;yr6oA2W#^{8*B0PB+9V(4<)A+VPnkE`!&_S zkuNSJfrig4am|jjBqOKn+VRNC_QKXXR|fB_+hTJ^NJ9RAn}tSrAa{TiD3oiNXaQ{2$)Ddi4CMy1J~Z0 z@6K~~D&NE$+vMIb^zR;vqnW=&sxTi%v-HiOh*_br3pS`^(d8>MR=s-MKdC5DbdIVe zLUnWHZ%3xP>Hdw6TMJL_uOmOdlu{ucONI(L9WsK8Z-|mF&Z+__-}$7(h2%uY3yFby z$T!Lbdn_;$8{{{yjubl)AoM6*b_=$DoCD6{uLdVAx2%L>7&BopLO!e;VMIio_iab; z*rAn^lJKFcTPS{|LO4lOmEx=aGA z(E`AS%;9ua6`k?Oy-NN#{4-Ah_j4#GC7f4o3KOdi%!1uE4`!tT74qv?dR%!pC4+^^0&=Mk7RXt2J?Th9qH1 zUK9lp#lMKswwX?~{>l8^1B44{DUm7!tdw5B|5g>;5C9mEyXW)HZK3JkKw=@;IH~+# z14d0|D~eu(h(4>a$B;}WHr3<=C)iLyjs)`;+4)wKU{w~wA&ED^K8}50VG=?ueFZ}5 z5@|LlD5O5W5I+?MJ1W9b=^O0UmP})%p(yBplC)Z2xxBwEk(xvBxzUyis|mPub?q(P z6JXeHluWU=K7D{JxU^Y{3sxin`2icAaRe0ShHb6zJ#BE46^Z_Fcd>qev zc$i$XaAykphIxDG+6$DSSJ~RFZb(E= zl^+RPtl5Vs{Fdti9TRp9eAKv8>{=Wv=9sdb7s=YS#a)dV8p23VwT;H{5u8uY;RT2q zFF!|4R+jr_Sueka*!kOFrxdb%stQP0k9Y^;a{%cmDg(rm-)?~E%{nkWq15rZ5D~c; zOo}JWFQ~N*R2O#~oS-X70tWJW3&@Yi11>jk#_#(R-#OI;r!1^7V5g_moYe*;F7tL) zUvj9qDeIK})u)y5EHILNsnpF>CY6mZxCQAMZbBzw&Nz;iW@w()4@`XqJ-)!TV0khK z_{1m4WHbiFhGh~U!^Y6s`ZovBUzwy`HEbio$y3$P6V~CeoNdX&KbJa)?G_ENdWNpi z^X9T?P3x>LIlmsBRIZ_;cjH;H1&lsL`b;m!^zHcZJE#~AiZKhFn<9K_a$F4-BgwxJ zl6>MJj)Aef{k`Op`GX0OPFu>-`y|?hH`cEHOios*A~{ zWg{S;B-qmInrh7!Af7^fj`^!7tqh&K64v1p2cs^$fWVX*m?dS)<<)XM*co3Nt|UG< zc^>gG#yX5jjkF3MPSFr%2Hu`n*FofQKM#__tAwuGXba7=R>vdoDPaqx z-b6QR*sjm4Sbbm3U1`*y6qC?~9#dEWb;dBzHK>z3W9=3s7XBWth-8Cc563T&LXH!u z-rwlB1YI^fq876&sF}@xW}Q|eHTLxq=^~(r#ez&my$dpdWMp@mv6I5gfE}cnaC~s> zq44vIH=t>bUXtB{QwP#X;dz6EAY_yo3Hj{2h+Y9s#Tloz+$5p%(w+!`H0JKobocN8 zO>q29LCv;=`ZFb`H=*E=e+I*qiuHSw^DX75meWR+jcgz?xzu2**~wzRRw01oC>pW9 z3u)g|Wf-{prPJwpeMRe9JGJyiOW;yzQcIlKE5)%bAH_D9gRv{cO*ue1>j#!w3~b1~y@l`IIU5`JDqjX+kY zy>OADG!LiX^f-jI0zDFc22xg-&Aa9dO(rt(L!hggz&TuuNukeeAr!O8uS1y%VBln$ zV#ck~+FHNnE5ib_4aIuB2<9!>=dXYA6aVju?*BiL@b;EYcK>0)`5y$OR)}O~ZBM|7 z#8tv&)z4WHB+=ZzuG@(y!V}23WZP*V3?nUe-=#p_eLjQm^>1~_eSKxRr{?g^tN->4%|f(OIjl1lxk3dT1*-qOt(0RO z1MyLddb?C&T&EsKDR&Za$b1V~9rvg$K!6X4%20_h#-^;hb!_LMph$~9Wf0q-h_)fL z_tlZ-RXGz^1eq%hG0u|5eQm*7tOADrir6G_r@$=;!mxG zzw#~!i#Gmvipot%>YuNNttMZlVlS(vkSrPM^G*;;f2%XOTI!uBjGPG~OS2_n0SfPC ztVPu$(WTDnEZ@czTt#A}p<(~3+t)8&?5ZT8giNNZO5Civi&(eQe}~r1U=iO4H&!_u?TEYA{TD~(NG{f?i$0?x!M}Sr(c*9-LoPb^*2TuZPM`ZBog&}4U(Kx&M z=^N&mk?4;BFgZCB!YI9J5$Y&(e-JDmU$4z8mDWS zT=G1B}w!H{0XF~AeljJ<>;Bq?q<3W}}{4+!WjDd{-> z$<4^y=$6Ijgz#lIqR4;8qeu>okNG5zobk-#*%A@6p%RyM+ouL*q%#(36>rdjI9OrN zP9#ZQci1T$2;wp-={^uT&efv`y;0Etv{8^Yf9{?OdnenCIu8<{GGAG~vy6GT0>chm zs9WYhm<*%=E({m$jGQ$xk7HQWP8`OghafE$2&hMDsvtBD@{xo4pc1j61=Y0Hw6d1E zpL>kJC`FC8cofgv>uagah440Rm>6`jyUoO+&mu<5`9LwXM2TKJ6#_>vc(Ac1;)K^w zaXkFsXRKKtJlQe(10mD-!1T3O( zGH7#Zg^GPm1D3_>$5;_J)UN|$mdKZky{fg*-re;l3SoqrcAwX?mK?vfF89}~<>l*Y zI=&8%Pg(+{$pFR^wvnZU?O#N{gM1+#!B>JHnWc4D$qj@a&4G4%T;eGw0>MMThNHN}+5f>{TK zR<3i)jOhUqMMn32IazvSu~c%m-PF>91f>9~o4iJSsH0FsJ5CEKpaHt+|J@$kh$+UF53Fw!L_6OK&klYWWY2&v#3^!-*s&~^%wZFAopeP!S zV5tGr0?$w9&|?vdxNfp45*Og>|`-`mGtw%_aVH{Z{>U)`wh0|ahVp6&ZX z(Fz26Wq3=do(RSas51wq(!OEtF~9<_-Ybu)(8Zt%$$m88q*!T~BfTBDsytB;XPi3E zXyxEOTb-$IZi?$#zR^>61=$-scVlWsm{t4@1#LHz1$H{thW54~(r8ru0dpHD+am{TN{THPg;U?j1JNK`?MQszRF@{qxjM#oh{KDL1-iLXVpU&KQ_r{Tt{R3_T%hnt8f zp&{hvJ|bOm)8hjJD`bICRMW$g`a6HphtngZ#Zlf?H&&ekP1m*7aa6!l^XeMp?b27~ z#aT-ipXTJepLWxvplZYk&UiWSyvINLM5o2n_dD;xCaP~CHN|0&6%TJYwv+T4y&tUB*8K++J=vhR~i;lvdp0(fB@4@jJ zQ1cq^iT}3=iESsY<6ojqGl@JNzk6{H z%Qge9mY2Cpm3ar1j(9dx{glk-xWTTOJcsF%)Ij}Du?7i-5uTD_h{>apR`UZb*Hxy#05@6;D6R<@QP#lc@fUpxeFYqH<^4x zRdkLoZUHyCNS*L8|2S(NJCor+^SekAb`@zb6VVM(mK&vZUlZAM+BqNA$N$_mA>M|M zEq3zP{itx7U&VjDekH<(pzoXq!K;XWP30YS0f^{S$dDr-l}jxz+tKQEzxr_IUy(g) zuM^$Zpcu@3d`Exkdiy^77)pRa{&yn#TFWynYtefZjl~jU%$kNZuDigu494qqJD!i|%CDLCw?(b$ z$iiZiT~Lqo-&_0H;C`rO%gN?_y*I!{kX%&rE~0|h7+M{9&nK59K#N~-Y&N1^H`j)@ zA;c~qI*kPQ<&GldZ@&nh*;%mN-)YJ}0e4!X8(1(sU7AR@NO3MDdQOCzyYfM)_nHgK zo;S_uD4sbp$}3q`AwwH%m!&kSvF5JmEp;yd=R@^{SFc2M%lmj`2o>=7}S?6pssVR!ug!#0%L3U#W`L=gGz5 z*@RV;Kf+s_s5_rEnEc_K$1gt{?({U%3c5;Ri==ftiP6|<@lQB_xH^F_yMS+@bYo|a zv?SD9K!E~7m%sUt?bLcIDjx_lhE3JrTZE>+80G0i-dNdK|VO8k)7BkYH zlSa6x4zjHG^hwON&P0S&y|5no2{En-*t`-_sMk3g(j0>7hm)m3Hw7i)V66e6{zB0y znUfpqFbG4v)&m#X0St81!d1Ymb_G`ao`eJM#I(AJ(@}-yhIs+BkV0t1-aIwqj6@Ez z&NyOa@M~v`;S~pOG8zQrj%qLREwWu1hS%j%1Kju4=1pHWH}c_a{6 zhAoLBn^BD=pjv9i&l!0k@4d%#o#|(n?~%(5@HMn_!}!yDz0}BXSKZzoFN|+aHz7VU zJKZ>66}Q`;%Q(J?86jW%09|o$7Qq0m@n`5mwWty|f4=*?uy${l1wn>;c?i=ji;Y#1 zAq}Lf-*v_UNhTp0aMLB*QS%q^L>zhwXSV|cnLq(YEfql(+xt$WBqDq8&ydGW zh~Tou!J$`MTTkZO?^~{i8xkWM8q|(U8WNwcO>@3np5FF&(quEvu(s_vNa&5=6rv99 zDNH0hq{>4hQJ;biG%tbWB;O_AG7ZyQuouvp6~uU|01ag@Zcx>-0;r=39l<5QW8Pti=S3@x05v_`oun#@}1bC)o#6^Ur7~BJK&zf!Zs1(oQ?HKOCfn8;s zN@I2yWtp6d(1$29G)ZzM4vDdwl)~M>RF!Y)bL`2%a2e zHRH}Zn>zCcYrtLf5GwVRphLuY0g(?L=>ni!Makx^F{|lWJ=#Ew!f^Q)L?D-@E%}mN zw>XDLu38-}LwFs~^m@ET$~1rBAO@9i^+rQYnT4Si49Uar3oLJ>hXxVm!^L%i9r>7R zkUW{}TBX%RBi{&$sCD@nRpQ>?05l=WZv>EPK(>;om(=D&BB+0H4i?ixz&`!a_cm`l znG$rgNssq}O4J#8Hc>c&hr+|rYm&93M^UVGHaRS7w+0u4nMH1cY^U9H+@T*)g^67O zkqVYb_`;C{jLnoE#%c&9+D^3dM22R1y&n+<)U5sd4(=mH>m zHFbSD+ut6>H$&(96U!%P+_g7`W|8;}c?U!M$Ic4mmseXlJTp?Od@=C8jy|U6WKXl# zJfvDmAs8rU!Z=)|dRd)r*jQ8VaEgxV6is8C^B&OxSJo44aZ@fz^L^nZG_$0Oq^|jX zKU^@b+KC^g!Xu~~zMSla4hEtj@7!fouNEKYCF_G8rl|EN1}QP@_Sv z)X;6+vVz9q^u2aQIR=j4ErjC8eDV^(u$!j#Rk=)JWLudvEmpA9|KjbP zqAcsSt-%c2j>s@FY}>YN+qP}nwr$(CZD#0?@7${T>)ckYo%>K#59?v?r?uCbbM7(v z=)lo$m#m?t+gcaMm9hIh1~`Q);OKm_P@K^JUU4uycvj4co-U z4ph@W2U;5D4a2$ync76U6zc^-MxdLZ(m(zHi&ck1JF)x3MP-dQjHWTIxDAl^PIae` zBkoZ-_=>AM>N^I%2KO9K8`!V0XR+!>i4U%0r>$gyM+-6Wf#@Wx(_b^ z@hwOiA~{ZoJl{Z?mbqtOfPB*IcOo8+7Y-gq3cT9BDqAY``2Bg{#AY}b0}d@7d52Fa z6f`EXX6k5pQ`OoJkfJnJkWAnKaVVo68Xxpl6wKXjjk=~e; zrx3w(HwU-`FD@1fezZ#NWb~3~M5k?mh4}%`?Pa0Z?q#S!^f(0bRstU9mcJGnH_n|?{Qj@{kPJK$-rjLyl%Qa+m?vfkoQ^P95C zdhm0`38WQa!0F0}Ai&BD86)`WHJmgNG?UG`_m_eLhRbShU^Qy1o=1dJz6-y{kE+uS zG5SM5!Q%#;vHa0Sz2Kgre9Wz_#nKqWY{Ht*@h$*J3L@kE_1c=Unhv1+q?iBPB6nbK zw<`m_Ut^Z+F^Q(V&N}i!%EIr<2svN(Pl(*MLqn&OkeA9H0G6BEHWFlndR`SG>XTlw z5k2nb>H;p+ZIH?M`~mG^35d2yaR$8fn5ux%v!$rpvt&fXHGILBmBzE5yw*7MxASvRiM~zQ>nfxth36hTwLU7^H41i z8+-;S?&PaZP1Oihb~8oh4E$^m=Z?VzVWO+M3O&a*F`8!YTW(!&FL?ID# za^Ryq{YCfndbTyh)^k-@8oSM#qyqb4d%u;KqkoPwczI3X%eZjd_(fI?2_EeKhGE2p zDuaikd=37)Q2SJoPF^5^rF&$HIJX5+8l|}_h6q1);Q_}3CL;&RyR_EWg7vqn?}9J7 z|67PX6+>{p!{x6U@LqL;QQ~SP_E^MHpzwttyX#O)49Z2FGC`X9L(|jc&7Z zGEHyI71F``W-3F&Cuj!`5TQ@iHuuA&2lbAg$2=@#tcTVfhnj{Hr-2YpA^WRu z89DT967hZ{3?i+W=?cPlhGT#h!Z^}mEusn`e>S~O@n;fiYmMf+30pC(`bee)p=(UG zCL&)u1mRv>Y~2xRVLP?#{Jy|2R#R7)gPuYrK_fX1N+LUz1?D;nl9H^W3cXBQHF8y1 z_*>CmoAAUUSyG5`!d&lia~RztoTAwKCFHzH@yCI-jhM8IQdPq#QYQmCKuVvNqiwy;N3{ykuBs6}ktiG#;YnAE$U@osq# zY%}1e-2LSwk-ud|YIu6M+|MqO*xUx5Px|eKP)W|0l`C5>U0U%BCto*bvv-{4l#&4` zX3;qJCfgE#b`exOK)D=`TsrH~S`SnoR@nrl(pWcF05gZDOfBNW97`ueJ`F7k__w#5 zi~waab+UK9cUti(IzAsZR6P{nl@#IQI_oRBwYl{7q!p&D73AI4<|Pq3~j=mhtTKnODza9>%JKWs3{^%zC_>u)iDJ?|6= z1i)lar@V6)xB^}zB|h8Z_ziz(44-T>%~g9@s9Gi%c#9WAL;C-jBtoIMgexKe>NLd9 zCs?6EYwg%auad?aWF^E}v(zh%75HSJy{MM0pj|kN?*=RR0)+jnZ0(I49o?vG?SE)rKR21BEccJC-H(Y*D zMx8V)R@gi#dDY%|&rNiq;ksRLu0LM-;g-t|_DwWwJ8B-2dbL#S6i#69k-V~0)s&5D zXf?-@dmIzmtrjZZ~!SsX22XaKdwmw zA1#WMg7pp(ihxepWJj=D^Wl;Jl|$>Ku|+y&EV+nL@^6SHHSM{txSY6QAC59Q$js9= zB$$2Iz}I}C2ITUj@0w}-6UyVVW{arO%59>QVzkHhEZz7*8+?`+qAmIeDUrLt69jXu z3t)2=Y`BR$7Ud5ZiH|Ui=y@kqy^U~~V2HpA_LhQS|B&Vl%i1Q|Jt6$^? zj8t+~lh~A~P_2=FPC!H0kH*P&47l<?kbOIE&+7p&#T zFcz*_Lk_Cymc8?Zwrma0kn@nuFNZ#P9T!D9c!Ra@TOscHi|Ll;0w;o_Z==?e7IZ4U*}z%7PkR8!K0@UNg40rQWR;Sd0&U$a}w>Ec(DaZ5d#s@5?Y!< zR?fhW3{c?u(h`_ zu{Uz~N2sqQ%k__)*w!ZnER9s*E@U0kxO`Y0xj&_(+_@$Np+Uw&oA3OG%WnvpP3ITx z$Lld<1cHP)N)0>Ct^#AGy){-(65QC=lKz|BFascabXuH`M9Ohc7RmVaT*=JRF1pwHvw8L=-@#*vGyG0A_v zV2jD+ld_pMd#PzKBDlG9dR*__jmnXMBgU76{g#4bPA%Bj2t=YBn<3LGe8icOB~>Zo zrP0QFVt76#e7wSfQ%gyC_yNT zk(Y=maB`{!Ta9#=O*I~w8-^3z!kOd>yOWy-hA5nJ<~6pYYltnpoCYRnnuf&1!55!m z7^#~EVcrjdG8jh5CiM37*EpP95#xsZ(+4{`Y(2PuS3M`{i5y-6#n0m#k*RZ;zRKu=<^Fp)~#-<|;48*Ztw;M+3TG|dP> zoj#hMxLuiZk>YI9Z?F*_I@26NN}yZ|{~%+BTVNBm6S1M@Zmc41Ec3IKvx9 zt4+N$dP4G7sutyoLLoyB?%etZx8lqac;VkX5QF>>@~d&$lu?zY#$Uos#f)XFEhV(qLeQe#WD3&#ai|z& zS4N7|tR|YQnBn$SuD@}SsP;-z;|o&Ej-sbd!3!}B$qv}2`ISp)e*Ky~B9n{A%Fb*h zYDTJ=6;ni`1x`D#j38aZ#2xUZ*ENzG&z%4v2GBhz!^_i$o?sTNDzZn&Te~PGAxK0B zGlb-DTZb+?vH&w+8WP7~!(2xw0+0scs)-atcMrb89hKk@3=IO#9svm+Adf8OqC3z$ z9dtHBRQG@v%$8>o?oL?fjb7uf8()>ba6^|x8)W&5i>>H)E zQN@I=h)Q$Ozn*4DkEK=B4GW-yJOQFD4?H!^$FUR>rfngkrPo642J#lrJMyhYlx<%{ zoO&8VE^YST2CJPqsU171Gt7AuMHiy`h<|T>e6#W^gYqZGaxUG*Zcj`_St93S*1o zcTw4*T=5nYQIKz!_LnRat2n#xe&no2Tli+T5LKb);%diN z+aTk%SzQXLZx4+XMANS!j(8(WEYKD6`U6Gp=gq;H6mXxwT3rJ`rv`zHhqRE_hql4EmZSeQg98nznrwN62X_s6oJ+Y9x8bp zy`z)S^K;r^5#@Sm$n9Js6wb21=6v=~W+M5Na`AH!p4@@EJVSbWv!VYKlGtfYve)X9 z&qKxS^5ZH#`$8?=BG4T)tHPp+i||N`Q=@;Qs77fs=RJaW)ATQ#%7wWYl41L$%f^^> z8fp9$tnl)ap=gc*HFeWy72?Gm$CZ?Ka#;gu)a%jV)a+VSjGvZm5ymj6)EcHitc41& z^QexfsNnfCIzLbxJ}c$vba&TvZ5kkyHUp%D|DgrkE@vUpapAY)y}>2B1HJwQLI9Wp zeTF@=&+0tDh?In7=ohp~-`(0c%0$`7ATkUgAy_A6RBw-op}J0001>QZ%9Z9i5@=Nr z%xv-^OKU7CwQe$8q53{`s9O1gaR#{igmd6$P@U)N(jDay&lX3~Yzo430~#%rq0lq$ zWJF;KtsEG=S(5J?@)lT>yZ2+f}Q>#jBNq zY%@FeDtJNM<@XG(W=(lV_8lbT&fVS~0DB{ots=>1YwI z7eZj}4)mZ?a#QA*UoA_jN->xhjKhfc(iO56v#ia9=lZ+aCo{4^mG$~wPU6_#zxEu4 zw3sjIxrSgMjI1ju@#ncNAWc&eFiKu(L(vnYn+SH2YKM3U0&PPtkZsZY0XZ=fo5=P+ zl0afrSj)@V(1CobJyUEenqC(;$@d&|3kRyQRU!f{a3yqrO0CA71{(c7eV-fQ=F!za zkVgRJF1A2mBJoML=cwvPa*Z{-tXHZl>(Xigft*vB>>I@bO9REdTigo)BSGai#A+D< ze_Mi$3jjS)OT8)LBq2r@qOYl~UPmKv`J&vvYHu(fh(pPVrMipns|_6Vtq{rg+75Em z9Bp)`5|C|}MO`CK3`7aG%LZ;!Q-tUQmk~wZ52T+>TSu{>$I>e-E3H8Trume|nhOAA%tL zf2w!>6X;V`Ans~YOj7D|rAb^7^ zP^vQX)yv6to+(f-m-|_Jk5oF_eYppym3#HDIwsSqMzxLxxrT=PG}G!V%f(x{j`1$- zXR&%wdMf*ovGMfrg!qCvS#B6%raz>O^3GyJJp4M66*G4#^6RHLPsY=|Ceu@g0q6pGwiSQwqiUuvVF!RIwL{+`!d0ZW4zhPTgTHEea z6~K(xRSB`DNf70^i>R>uRM)y+Z|FcHsc&-D3gqZ-)L_^ykx@aDxV@;ss;}BW6wKzP z@42!`xYA?hKZN#c>avF%!eVj7x}O_yK1paVN~DEF!Wu|1F5U)AMUif*E%m6^5TeCD zfSyD=2Ql0W+KY$d33vd{Fs3ltEPM~-LCn};S{dBN(fXvu?MP&7@<1$I)v_?$Mlys) zxz_H_Y4lMLeJq85nCQwEP-+=d8WE_)(lnE_BHq_Snh98Xh}wXggq1qqw(M472A&k3 zp0`=C1TGQ=-qW{*7woF0|jIyPA7+z?9hNlU3Zu1!F-B$a3j@C6Zgb?J){2r0=1B3Rf zi-OKFWUCp9JaQ%TMt+t(Tvc*V{t2rYbV0AeZLi%0TTU_D@5uxS&oJk0f3i}4oI$Sn z*1O;lYNb2|ikMscW~goL;R5y|v&6l~b%SwCGwV40`_`rKdf_?V-jjPUxA=?*oG0SN zxsY)v2eBz4v*OM}N7v{G_j;7i(|GONYq5?WtOBWN?+$l!hvUcI>4TyEYCH&$x_acu z#=HMnXHR$ZjZw)Gig%rK)27n=Sf}{`_3vdq;Dg?A!H@GE`VUd}M?Ch++Q!gG=f7Nm z9cXxMetIHf8Uq`9BN|IHeVTtoPuttr{8Qp@DQU?3lQwZvb4ws-Nrvu9oG$z0G~yR= z+Kd(~E-D=%hiTGHi~iViGiZiba>clMkWX&*;dQd_(0u@`3^XSkwg`N;ODAVYkMJN* z&fssR?;ya9Xnq|;vawOf0010VWC~B8qHVW(YCPso+}9e-R3tRe{Hk8zW}D=ZkLS zN2$swYLpkXp~@x(Nk#JB8ke+K=8vmPn(KFPrP%4)G<=M6ynCsRbJAf(?R>dV4HS@U z5jDC}x|HAH)LEwZFo-ToakzzQyU971t|?|FjYk8)i9t$#h4ldWy4Xnr6^&o4kJ|BF z&&Y1AZ0EtuBtMsqz}9G{;A9qYbX8yn)n2`VetZdLHa8AfM}6AA#V|{T+AI(HG;pNr z2~E|7-sw48zl#XPb;J$j)GV!mAE=kI77Pw~@#7%@|NN)>W!NbVN?_ndXtZ@&2+}d< z4vZ|^y~+WJDKL`MXZKLzfHE%QJozSrtcrt@~4?e((dm7)-%R z*Kuc8_o;3+^4jXY0N0BJ){`gug^27rOfTr^ z)DZL%wsnvt-?o9*pYYN@s+z7P5mE-I+PGSoSuisqEUB|rKC|lBA4U3mEe92MJu=_) zl0Gi4aVi5C$irA)L%MHtR_QVArrd0IyDa~#^#5n3{C~s({%`tC2L`JDf9%hhpca6b ze}D>ypY2HUpSGfdfxVH@KLq|Dxh;!+T6muu9lHw!sCcqh+T|-TbZ~EI$4ENixo1ZV z<}+%vt>Uknh-Nt!=1Boj@0WMhYkmuO=!8jDN&me^7zR|f>B4@Gd16E#;a53x{RLlI zskuidYczCbU6_fn{(UA|wLq&(U?w>{1VR*wvT!L(Fp{>PQR{4F$B?2hzft~kv#QWz}MpaDbU*9 ztzTSFt~JVw91caw?7J|>Xd?GdjwS4CYf4#W*)6=rty#WvTYP3MY->dQt+l8c#`Zq_czLvwUpYpr8E{#h?m2bP7l}#O#rpR{5IkepG3V!r-~C*q|MAKHV7+G6CjS6KR?$FUgE7s)4V3HeOg z$gRekn5Y8rUHD}fUKt{PMd?y|^`Hf!DlXO&qPTW$7{fvG@mR4XKivdXNmTr6{r~UU zP&KD>y!vN(LH&fZ{7*er^$Z-%Y^-S<%&crJ{}BsUDN4y4{1Ygp0xc(mO(s5+1djjQ zeJS2motSP+4sC|Wc>oCcc5|`nx13iY4#mcH@aFn(9AzK?KB!*BHeI0O0@r$6IT%%b z*J7={_(6VKWW}feX(xyGX(_Itm&p&tp@z{3ybPKrb8ot}IB5F^A_A%vFiJ+)4B4(3 z-STc%PK-dc+)86_DqTt8hxW5f9Hp1m@>R<-E2PWgZ8b-dkpPu`GOcP!F7QHt;gz}5 zm0#()94^<&V3*eaA;TqeAC>^6ZNG+&dSG<3&^&*SpJ;VR+qCZ6;-&iBCaEDlOf12C znDx9=OTdXpuMY=lF#%wXuk})vH5zLZzBf74P&fh~Cd}ME4YUKdVmaD2aEKi1<8a#7 z%T#Hc1-5FU2HG&K^GMMOU8B6PJ!(mZzN`<>0uz9BhH5c zwM`$N8B&y?>>2e**nSJavm(899S9x`+KlNkai@9UV6?JuJt(a1=T#!Q`|*4FxhdMr zm^^yP4^~>@Tj8-XL)tXIib(Kd`(tB+EH{DbqTmh#OPj@vy!ivWTfpt{zX5vrbBX~n zKkwe?hm6YfpBDN5frb8`@88zU+WKF5oGxW6nFC??ujv|e0{1$hRj4+3B|$RsBl0Xo zMOhN z3-2l5#|Lk_usmcCkLb!%N}3wr)vt`?3|$31R!KFcclG0zHeOkS>=%#D`K^)lh&;)) z)xTEHxN%p!C7mP+G?bF5!!^&bqHs5utYFL1$Ju}*IPc_!WDJ77IhzBWBpwU}WXF<* zY?^SGFX2S+#wnrn(j~wn&o^&l3FJ;>4H^Lk2OVlr=vUgj$yhUl#t%3m3Md)6Vb%to zLqVAna9BYyrkruTxJnMs>%qW{ktRNo%`$I97Tb10&V%A~D^##(r^OnJ6`dWzcrs=o zF`9ldcI}brJqb|vNGV|AWX}Z8QX(tH$du>DvFY9_B#GhJh3^K*o%`20vxU|^oCM_W zBqy1vNRVHYIOaL%+`H}6WZig<)Tp^E1~g|D&9VlCr&vVvZTajhjE1)lYPil8)8XRw zsk&Z-o9ASO$bnOAdV{mGvQvV|&I`f|{3&SoQ}B+Jw}p<<85D(cKlnH;@eta%G!?|v zzSeD7DFYgAXypfj$+8ZMgp;oj8B78*P)n$f#p$S%FJEGMw6NG+I`AcgGLu>p0;tKI zGmw4?lijc8%NLm+YH2raHjK>s4t2D$xmTn4Y&4rQLncEt2BKQ!4P8BgA~;Fi_s;cs;6ICf%$8w7>lxwv!lOpEa3T~1_1!id z18)@K4mFE4DZ*6K-YRq20BA{67GE71@36xSO}87b5* zT+6SLx4%QEZXp`7S~)&d;#z_hdKH~I?$%)2c(`sr_3X%$sD1Vnq9%8^UkkuTeOB3r zz>4=(-V$CzE(M^AVDI@Wn8AgIP0Ma{KfA3&qr1&BzY6$@*32fd+S>@*s=3+_28#Bv z8o)eNS>(){(N}_KyQP;s1PE_3tP2 zKSjxvnvTtaGP2K2N$p?6RdEpw^h(nC!ROwI!D2BFzpx-({}3z}>HcxmqDLBhn8w1g zEaxD0GZmszP)BU!XE3v!z*~S}k<=QW7ZRsSgX%KZ_59J3*Wd3h)1L<(Gi)s_u?k6= z+l%vW+elm`Gd>l?51(j@5$ejHn~cIr3_ef3?9Aq=Z<;yt9@m-a?~|>vvrF6DN9p#& zMQDq9#5SmkMjyLjIA3@kJW8_<;__|F1+6`aX*kD}?^=usgyz<&Yzd}o6=B>%#IU2- zu^o6Yu}y<3URN$nmfB2O9RuUNdjs$>FLs2*cU*eL&V2#tO}y3tt9VMW?4tyu_Rs|Z zflF0uKF%j7))iCRR*r>F%pFc$gj(04ChYPP1_E8|IQxt6dx=k$H#-5%&H?!*9z|Ai zBJC=JMOp+T#O!vnH#cvI)mXyJn|d`*pO^Zz6K2kDsao3xX!!!5(ShoCpyg1XHzHQc zzIJWO=s}k1#O_;Zx9%fpz-g#1_oM2}4)az*q~03+-eExE6WJ!4eS$hI!4>_CvO(sY zO0B_V`rQKS_+Eq?11Q{4lW6m2atxlm)2^bHiRdZFn)0?{eZ(*J;k$z!VsJv!1$7B> zNTdDpMtVv0wX*8Xm%#hGi{eH~zAC_d=4Mh8Reokuk{5|Po(MEF5l-6Udc4`~KqUcQXAK%*siGQ8dimcG`7G$BAe+8XM&s7xtsRH@~< zs2~bRlkvKgeXIUuP{wMs6yckxTD13y9a(IY(&%(x6YUL9_h8`d!)w58VD{LC+UDI1 zV5MuVUnwDtUw=k#aLl@IMS%>xU=Hy|70faO?5nf^`0(~syN~aOZ2~?Z>q)Qr5XOPJ z$tM50FWjKw28rNB-&n7_9A?59DX(`F)cq|v-&i8?>c6Tj(|^NJyNxS972E!$mco;` ziqr+us^LgTsty~j?4NHg%Sc8H>1M}4x(*S}?4NH&HW!Ti@!Vl`5UwZ^0zD!)>6IlF zVj#beM`YwfO{$(~e&?S^dMHFex}J!sBqH934`S1`!Avdg&5JwczeM#IaQ?7+x}GlR9$aiX3%5Bi#?cnN*I+o5g?ueJXzBTQYY5@_3A zN5%t}n?kOr5!GZv&1QT~a`9(BsfGf9(BmjHIKRq8`;GPR%VA>XpA>n*6DVV0;`s;V z&pI#_kyy2zxD2tBRmE{Rg|fd$IX@}O(n=~I4gLh1SupM3XpGFs;T{PC|#vDF4@oB5DKO`c!t3nxcz{qt`ok<;LCEFW$IOcZnd)(^Suo& zc>d>Q;X9QN;o#=d;!#KA}6VVQ(9 z7RJ(&%$U4EkN-fHw{)ii`Z8=8Rb9ZB(K@4}i@?Mn9bu&q7WO4Gd;ZyDwsOv~mSPWK z#7mY&pfV5Lq@^G}CI~lHk}wv2%%>{#s1uAS8-cqu71wQT^7X_OVjHKE=DfO)n*=p;qpA=UAgQGVgXw|F$jgPHw~ z{7ZRWYP49zs^I4PN*jMA@GW3}U~XPU`T4ma6*rl`OCcE*w7qv3`hk^Y6d>-XWLyolNWD zJ#2g6)X1vQ54Jcj+zDJ9TAP8U#zP8dLF7+?{)^il(AfK~fC^aMNkz zHjYo-oG?p3;}W-1VzYErVH!A4`>Hwu#dx^^FZ1(K-1S0% z<{Lm|F+@xQs!rW{3a>2mVW%wH*J0Ult8&38E>tKPF!|xLN7jSpHL@L{0NS`O_l*+U@AsuZw^r z$Vz}ULg+8~F6LE_Pz_~lT42(_& z#!YZKWY87QLu-ZuRRfhtr6JkH90dtfQ5V!nohawN4Xg5ybcP9mnN)tM z{W~*$w5^^n*h3=iP=CLGQzND>X!GyC2)WWBo#LlMHe~(v>pvzW{ySsHQBVJ0AW4(P zr~L*q;p!*TLO ztFF%{MS)BY!%dxzkJ0t}L<}dT7u!HKor_wL9)?L-hSaL@4_SK$DP}7M{cA|#Ser}l z;Vo0iY%s-coG@k%ydxa~e4lV%C=?;cZD`_!<;=yc`N+-f1?KqPRl~SVVzf&w;6;>@ zFnL&&-q?;Dfy+Pyt9Ck~MNN@7Q);NzCt<|MHf%=~AGDuRYq)~Egs;Xpb!l>wAzK-X z+PI{0l7d?gkHKilxi0Xiv+_RC3RUHVq1k|AY)kq>$4cb7eH#|y?0ig6wols`XZ2kY z!Z@Ph&&exU>M!9MW$Qi(GJl&_`qKFM{2l61AVp6t2jOpW*>Yc(xYKxer(@Ni!*O^^&hN^@Us)DcEj>)iQY9VxlXXtpE3C02f%UhVCzVFmVHx^2FksIi#-D(jf+QdfXGJbgYBM5-w4e5&L! zQ&M80Yzx;FJ#G*p2Y-seM=c&cFAeg15i2u2?}kFX`o3`PtfmEiXNG=iZhcK!?-S{z z{6=P3V*<4konSH{>!DgBc}+dy<~Yc#ny}Z9l#y1pYpbS4AYlHZmO40*Ks)g!hK#1C zgiQOne^^n|4Vaf8mkKP@#|=J^@CP4qoEN8!R-#-=os^}kh(TeIVO3K*2zeRYTYf;= zoORD~y>#%OSk4#Yp+~xW(QbfWhi#!Scb_SCM6Kr z0_6iR_Jjcn8F&mKhXCT7g(rv0U;>YIS>`NkpZ`7Mn zP8r&#OGrO%@Ouv@Y;NX_8G`@oxAtb6Ey<)_v9|6vd59Sg)iNyHns)}whcGt3MEt? z`XL9MjLpREUERQ;r$VC~s)Isc6UvHlt02*qpwMv^TKrHbYyJN5*1@z*zRuw}i|HWe zS@!k0v1nK*89V(*HZx~RqZ3Jszfe}UoowizPPWiwZPnA`#;&GSiGzv2ARbP)d%cQD zp3tMh$_vjGoa{lYtm7BU!N+Juz>L-a0uEnU{n=8EtR~2KyqLq*(hy4Mg#1)jv2pYR zefzhYZS6Y&S(?grh;$g6d=O;zAN(` z!VQT_P1^8Zd@rThN3IA~hJUI=>p@9nTBf zfAM^}cfJsxHU^rVXD%4_4&G(v!>BH@d)w!@U6=d`rCr2Xy4PP*q`pxtYW6JAz;(+4 zY8JuEUP76Lo{6ZQnzOaCL+Thp2vuaMQg&7JCkDROHZu;L(qbYBg3)#h5Y-_xu&9bq zB)zIIg{ib)^L`&Ms3c$_PF$WQ|R2A=ecXh!L zgV>}$51*522~CzVFLb2c{$?#R0hFz7txj-8re1}y==7&-y9QZkpdBq5oLbA5uSc4` zT{1zdW)CubQT@)gKIzGRG9tip*`wmqw=uS$me|}tk%sH1S&_6uS~z12qGpKBo&>s7 zCL&gdIEVuu>_;=VmyA_KnLZ#jsL7|C$mWGr5_3X|nguJru}r$oM2bwZbAN+iQ-b4%<`+J+SU$z5_>`h!Y*UYQ39-&wE=p}?7OmEAd8*bgFaNqxuG*2ebg4u{P@9H7yLVe{ zC0_MK*ik3t$__P3VJF@_W34$L!FboY--Sd2#GeelZdF@6IY1gk91RT87jkLwRnO~2 z5$+zQbma?0`5VGCRWTH(n!#DnLKZilKaVAOL*(56iLj7VkDO#sn+VQ2Wx?d~r6JXzSGkn9>?j;enk?ZM($_W39L>VmK@QW-^pZq*=Vi;;bpdlALB`F-{LV z`!hajDWg}3njW1V$0JQ%ypoii}DmPQM+lQ?%aTgRY#fQ?p`_=*0HGJ zFr9+t2|ppL{6ul1ZM*OaR%#U~<35q2vGgW(dH1gHF^#+iphPO27zPoJ(Ja+;0DSD> zSD#Gv4F|u*<`Sdj0z&PJI{*7$p6Hv`4LtWS28?E}0t3f@&d;cV;m*M#)a1MT#QtxD zteJLVF`Ry+ts*ey6nFxD2@TP!avs9hbl6|eFH!J3wQ7mj`k$tISf6*F`g~Lw5 z!m8vrCF+%aJKy4;l*gZ1N@3WElT`_M^djP4!S@0}PwR?RNp0HRYLjA`p3hEgAlSFX z{-_6AU+wMyP&lp?(jl_7-)XipwLczo&`fG%dOCVPh9Ycqx?Qi_fQl9`@hVOO3l0aW z;A9%io0RP@L|c-;)kZdy$JJ>XOPLdwS-2bQi~*CH?s-|bYv?dSW3Z&21Kc`JZ5*CY z`>+HfUWJTTgtW?bdRh6lt(5^(RcRRa?r*+OA}I1jm?|C7z9R zJ=kp&-*uNz)`ATVDw0eA^50W#iQPN-0-*xpwLte!%B(Z(akip7obucf^O#rK_Xn^J{Y_(c}fGOmcmZ*<0m7=AdSZ+D*Hwktgu%0a2DfR{X#T3h3q&GR5(;JZ2;=wT3iW`1ND^U5bKV^7bH=)?n79W5lTjU+~AY9bPY;* z$7M`qJnTxGB!J&jtues~gg?GEzE^#n7DcE-3nM6-PlZq!=AiTQsgD#V!QQallWA+p@$nuXa8^M(B?9lrd}E09c7NAhe-9%Id7m zrz&zaUvHp11;*g?c1q@;!2^|uR()zg7nOl%Q&{KXOy+|_0E*Okn%mMucWu4c+*p`4+XqqGk zxTF~?@405_f8cLp$9qe(=x~aU;jfLLa{#f}UuMHI7qnq!lVPhS229gHxyQF&LJA!f z&Cu1#k2in>(%dT$`O6arcjAogc)H_payUo2{&=uZ;tv+EO_o?l&|iL5xbrDzv84eL z3^#}tk@RzaEiI~@IV4H&nnsJV>&c%Olj2}%cO`eBMzJ-+HZDkax)Kt9gf zc)&|5aF)>%F7ow^Ha&JZ5_MlGQ+Y^1TD9S)_oIQsa}(#POLnwYW~{sqw*Zzwcr39f zgAh7on1m$f14mp;Sk(zZ?YtZr%OIht8$qoAnMJK8&?=k2cF6$}T5CtRw@@&qS^yV` zI{>-#ZC}}QVTsm{i(I<^O{U-Jgw)#M3KG4d=ZY$Nr*^?dY}x1N3YEn{-K_VIDUkPM zS{%!6?H#7Z(`$_&NG{QTGfb!6R6UkD^PoR(t=5XFgsT>hGzE0NkbhH7gI(a8=Of(r zEoV6!kl&bJvZZke)1aNVPxISsLW3pQp$d4T%>khr&pMw!W0x|rw1G05-eNk zAxOx70Ne_gBa%?jM6n^Ps#Shdj}25pY>dgdfU11Fj;gX{`id@T!?kRgqpW;*E4ie* ztnm{ZTJ;aL#825e=VH^2w&d$_!L7C=oh9UXHZJ)7Zz;GU;1?AcKkQxk9|a=i|8PR@ zXli8j4>O}k>Aw^=*E)7{zWmV0Z49$C%$zh*pwO%9uogWS!3Cm!GMWV4k&lR^eiCp! z6O2|sK_zJ^@2=ZgPNEGLnZcu!IalTkYbTH?Q`-6^4?L(Lsg-GiRBPOTY_@&fO8&Tm z?(_(JoZV3zvpZp?@@X~`tZ0U-lF0t4&D#m>yZCjwM?9E;AX%bdD&$9urbo%i)f^d)Z}A>Ol@AbnSrOwK&LR`}pyG$kpHkS5q0hh-?h4)n*6?=~Mx{_%Njp z=&{;y`TV?-a!?L?gdWdaFesd-{v0{~o&!DpX55%tB<0UpKf4LqRIrOPQCanv_La^5 zB@p3)-w^R66y$(PY@)Vlq$Cl6eF+5cqf~c08BuIuSe3=7X^}shNk`>bc9dN=_jd@j zPDyqv@u~AoDkyrZ-s;GDH>aisgeOXhCw_dIH!4?}*|AxLKy^eLk$S^2ZQEF}ZQHhO+t!M0J6W;q zWW~0Vo4wDeTeVNCc6Qy?ZasWY-^(0x_R+`a`u$Pe$egWpa%Zo$e&_XW`gZkxzWaJS zzhCD06>I-hkrIn(C9D7+JU<829<)*LM-5EPztt!eeWR{VS<;;=KiwAJqeH$4uNyH_ zM1f%ZUHL;MpqglX;Hd*yJYy6;Wyb6FO8fO<1P}8^;|SuZ1{fm>d^yUtq5c_VOB{vw zVVp?2U51>7Cq8))*ht`fT()ZTYnp$C;vW5%SOtFQBK*bX09yT{Yg4Hz~t4{-Wqm8|!AL5e|mBu$&IJjjKdVwBSWldevbc+Me&TbTcC_2pV zUVr4^DP%2Jt%pfT-8uin!@EDzfEvBIMVGGX50+;GI8*hi^jokn3^+h+sF#shf$T?D zZHPk~uo4I$d|Q9lo|-h!UB@Qb&8#mrbzv`W5jIGdd)w}%kFB^&p1M0c$)#ShVZQz; zBk@1mux!7gjOKsx;-Noz@&7Nt-v6=DU6N(&)_);{UVoty(={PUdeWT*fG8IS{~k~v zMiDW;z+J{htL?;>uRQa+#`xV-&?31rkPerb-yOM0EWjxEZaupn0r zHQ(|f><3j+ozZ9BN!qA5DS;)kOOK<#^#-NN9q5-=s_?lxb?;cOX^oGTh0!Abd~m!L z_iD|%vrTUn2k(1O1`B@2Ry z2U!Jl5Gk0NpAF_RUIY*C9n+_GphQL!L!L&Ekbc$K*NjanQ7$Vp#Hz3jlBwRvLr}VD zi2R%MNCzslpVCe9X7VXAc-LDvoDNG+)dEJMnlLyeF+O_(Z*kvE;N5%6CH3a|GZ(oB z5~f^{yAi1eDn|UpXC^YZ7bN$6p4X0!D0F;T$j?$hsIC2IPGd8^y5`jxk;|A~txK`t zapW+%>4A72fDCR*Q9YT+rqHtC$(XqsXNJf7U0?i6ZlSc$LJp-mpqvZm0|I7X^)<^j z##mBvv3}QPU6$y&_P9xi{F45nyCaexRkdvMVJ_2`d+vRf8citxt9stX?aOQr`Pf*I zcA6E8TT1X+8MvB?%Ph8digeEg>+}C7ptG}`y@k=wLGXVO=-kL&SMKp+x=TN2)W4lB z`7gQgpKjHkhx1XIunl5B=(n3Q~9P(iQ>ye^tFWq(z=r|JF z8-NyeARbi$;D|c{f;1bn$X<`6**v9%LU{S%NqfK40BKB=qrKC@^A2JKdT+W1-+1jhkw;Dxt%&g=`HjB+N8-%?#eCv*f>R z|M;kq3|;hSv^`~3skqJ-^D)Y{`c|Yi4b!tjHk{b1u5y2@=2fOYlAWVrR#H?M`w+1; zr_+xw-&WtpaA}53V%_8x&`7D@ei@n?y!T!N;cl$SXyCahY<7%&&DRzYhDwJ%dabo< z==mvMHo((@W_pl`DBJB=nY7`3az*0*qsZ~UZ-xH1t)Tx)E3~r{?f*L{^ncOLq`5Xl z>Rj;R0u=>F|J=s%E|KaXZ_;B5Y5V?W4nrwz8dA7*CZ6BQGAf@@|L%UzoVHZ`ta zcuvIDIe6Y^p@ev$5F!o0_+9(kb?Xl`Q!$zL+0iLSRvIwMhyF?6N%999&J$yDZEuI^ z;OLV>2Q_lYm?LUJHimfnmk0H4=QYF^tmZr4>%ANk?Y;VM8uINxQa+DW;v4+ZhQFSW z@PqgqQo~}Y$(WC0+}ec1cfUL%M3=D3OCI;|KKxvrq>M28R5KUkvQd*Kyy9x&n=s;a zV=CAIa3(0IPs7D^6&s%5pJDU~hD*h#1t2=@9eh8(E*=KQYLDyMj4cFz{xnR5mVlZ@ zE6?A518Cv+ERyDY^yHK}F{cvj+_PXVTZwl-nJEvnw3w-s1r;dE_w;o+ zqucjDW(81~#zZH)T6zIZVVW{C1YWmY%wLenSNyHP;iAtGlW0Y`JIa#d5=8uGHgJ*L zq4pi%Ya!5U$-k0dAYMM9q#cK>JlvLvYw}bQ&LAW)dmHwkj6ogAQ)zlu;29ju$Ua)C zXC=)roa}_VX14BQaJ}Kq&VrpO*y9M67w}kEZ=2ahYzlrWqf3gh^s8V~$DnWO>XTANaTlpE5QC9mkb};;-SNHRxxiNCy6uwC?wfLR@ZUVu19|waNCMd$Ylc`1BjF zbwQP-IwSGdj@X?pFBrsn2?LE)^`4=ms?9ZOIcVyi-%Y(|%M;@##fME+UVfjho<0tD z4lu1NM>2=nM&%ezxy*8;@v5;`qv1)#oC=*3L7ouyI#L{byx4iV6deg|GY4G9Mi+Y7 zy=obK2hkEy+IL>}#*eKYsCxSWm73OJ$!cfZmh+&GecVOEycmCOa5>Y@`CPdfJRED`|5D@5=Bdci*1WNX)cKGpQE({LE zV#p_Vr0TPvQr|L3JA0+yApKx`cZB0i#XiWxdf~?US0V|fEQEn6Jik%26>P)88rpTD>0_Frl%-Q`ru030FIVc=@Ho|`DUII%8%Je zoL3@5sV$aaBuGsiJ-Q^`@o3IctBkRA$u0=JBsg+Q_4k=9Ch}f{|LQ(K(ZN2}LHAm{ zqLNP}kG;{a$68o-!2&LH86h^w{2npMCHSB$LTp2s5*h1nJW8nYF9?YE6@SP`Yo0sH z)3dYHyPjL;8Uy2Si)oCQzbu8)-@Rw2k@-II`ew@pwDIVtNVxP|tDPsXdXP+Qt>)5D z9XM3?X9jAq1cIi^3pqcKHz>A_(qq|xv{C~;QgO0-Gn)T^IdaWhv$) z8c=6fbK`sYG=mT=leBT zIe*;dz=2(SXHiL~<__euLzhp8a2mff6|}aB=Yvk;VuTf`S=kuz(E>L>HqGnp^7_#} zTHcDD^UW5WyviCY?21u2!VJDXe^w=NH&n)7D(U@FR){DIXu`it{WaiZUDw43c>e;y z+NYX5UmbNYgECo>s`wRfkTE$6LRe=$Wz&+ch)Ebm^*!cVvguYdHS?Op%x)WEHWNT71!V-ic z<3~W1_6MwV7un4=6fEkKOs(ezz~4KIpDdvnqJS|g&rV}Mx!D74+iCwxlead_EFD5o z0M6xp|Fnz!2xD)4y4T---fH)C`?gex-%=<9(n{of+vWTI_O8Z_OEFF(bo0qR)BpW> z{<&he2ax-UJDOyXszRz`QrMz$b;LqmYBqXsetXKV@W~4axIqj6hCD(#r5?cayqFU@ z!cMMY6W@;u_9wp3KX+0Y9+65*8KuvYy~%>3jTco%2;efk9%FhdNpZJUVoO$bHql@! zVORkU&(VM}W?1m`FS&?~ei@v9w_HkNvsvX89-QI%{WZ{~)Cp`ykWg0R2bv_@Qju-I zeDAxgcD8iNaRAJaGeACrdDa*%M!i7{g&Pc${Mq=R*d zR0QW>S#=KsiVQ;$m95_8_ZEk&+mJf=qAofEUyy=;ds4kdxOqPdN{(>wgxdS;LS>+% zxm!8#$-)P%@*w{Z7?QI1-^0?a)bd~L6 ziH-qkWThf#!?U2Y^+;Fmrd;#zZ+y|pV1M;@>?V26Fu@zllh8UGWFAL}8F~&{MqM!q zyMD1&tH1X(I@D3V#a5Wx*E{wSOwMCBQzqwX<@_jI_2&+rWZrg^Z!#sV;v_CE`HY_Q z|A`6TdSI^?+?y&Cp5H&!19ZCET{YcfH!)rCV$!uZTO3Kz^Boc%m(M z{9C`SW_5I{>eG1O7|E}Cwq8pGRQY7FLN$w1C)4p2QWC3H5Qv|qc9QyHEY98H#NbT9 zY?d`y(5o&y6g!OE)vr02HZu-6i*f{-!R9fsnRC@pgSjYqb|iECX_q0dGmI-&0x5{< zK=o&U(g-8zCNpyMWsnhOB;U8bu^OMr5tj%sWSSH9C70teb1L6osK#s-hR0We`(~AP z2e^Xl4Hj;)K7K7YG~QjAS6E*c6qPr~067|)hQhO*n98vxxS67lvmgQC%3&#CfLopdV&1~X zW&u?jfv8VVxGvza@u^zZ0Mb>tXSrpGx8W)I$P4Wr6fKO(PaT>954@s6VTCY;3D)1m ze8N{zIb7CJ$9yE=YL6JQTBrbnB}tGPk7%$UUlBN*Ic8pZcQA)8mauu;GBE_4AyA&* z_N}iOWTU|jf44qTw=qh=$aT+QqK1(Lq2B;!ATW*95&jLk#{{lvYnssK4G-WI*KHQO ztg<4qcI3*KmG{WWqRmZ)k{vmCD>C41Y%=&yS31AHMy6bc51rKf(W zgi|P3}?e$P~1QxskD zSEd9^kJ7Rr*ooT|Emf3C?F&4RPU>4ObLozUt96EbaKCi6KCmJwpCRA0yvXcRy*=@c zO;^Ayel7=SA?;XJh~ZXUK<#?wCJg&8MI7S(G^XDQxNGndKt;9sqKAr zbd!&C_B24OJJ4dt_MHOP56mnpDq=7&OL{FJPmCvl!RuAf%238`Rd6KDY+M!sGF3vy z^_eeYEBY!bn&jRjPBNewUkNSix=@$4IHgmQmozZT`|!|ooV6bGF#t(pOgd1?6N@-biN3pqBwO(6sR`;??x(!( zi=7uZK*Us!oRg+~C*abRw0C7KKP+WpQgw;F%VS7egR@G>o%N*WD7rKT+}zPB`cdO; z5Vp}ytAIz^6(T=BPKAHpIPK}flB+~Kj47wg4j=DRuU8NX%%4F1jXXl1%uLM7i=o*i z%sH$gqu?qZ_QSGZ%mnYxK3HSrdgjZIuTkB9q&H|@EQvz9@d5K5!xe63<>W%AK80Xi zm-{`3G8ISb+T$O0(*|Mgr%^m|#=?_F6LYmE72dG{TE*|m@^x2_6~d@#bpeUYjr6(` z^$>jrnBxqZ7++D^b5$bLV(U%3{kAAHRmc&mGku9e_9axdz`}a7S}Jk#C5bdUvS_xZ zCAISCe~!N?lEo?IIKLPXFM?iFN^iL6%NNNP=w@R%7t|L_s}o+$!T)Mq z3XJ5tfEo7TL})nx6<05)Gmp1?&dSq8{brh_3(VgG&TPnC)nid+ z8-BkXJ=9!B5|T-?5F&3>Y8*RvP|jQZDyw;%!=!&d%ejpSogfG_78yorpY81wP&Pqe zvI`!!pViqpY>YomsQXl(u;I%*JsHM)AJ@H>aRq?CEHK(?G?1H|Ha*|hGL`Ft2bQ%u zsDOUmmzIFKj>PMJAhy#;vq2TAqtCxlud>nFX1mE}X#;M%WBU1Bb4%;XadSO09zlXT zbuwJUJ}x(})Xvp$TAb~`SX*A~T5ynq^dPdRkQ_EVDK^0u`LN#aCo>G~?Zq9W_0k<9 zW)3j{VG5qOL)C;nRKJXdYY9|<5`~a?v%Z(AoUw>2;SZ%+U?Nfkbwy?8F}cm#U(2KY zLR6u-H-DY)wqSyt9z2{fx^<6{sX|8c{kZ`ZJ%Wlm75RiV7xlGzFAKAO^ECP^12#Ll zOUI3OzfF48QS$hnU2L@JS17!ZZ0&w42hKCoPS~wWk3Am~AA4S>qG?$)UH34D8QVeH z9&_5n#MmO!cj$#MLfUvzzyUIn9O%bbB^8HUIP?xm$EI~q3vO8g!|C=mdJpQGfYpp= zjMz&k3&OJyc@#jxU`8}`t;fDBod8JliJSHSE`E6sq0Yy5*o1QO^nduG|Cy=|>v+F{ z{h3D^MEXBvL;UAnzf_a4+u-=en6Pwo;m?F);t|Fm>^hi;le%?)bu0LwIYxvmhE#EC zaki<>_j67GMMMh;G( z5W!WrI(-fS1y1*!;}zM1?HjUq&2<-OE9QG_ilk}#HSC@Np_Y`?%$E3E+oh|P%bQ=T%n%2 zW5+7c2$QFC_JFVOfiwD;+{)UdK3iqsHO{(>36khE=-)TbZ?-WQtnX6mt@tVm3>i9i ziucJ1gguP3RxN8wAIXiKL6+{HeD_@>-On0i;$t9&Mz=V>nWO)n-6g3G>++drJ*`TtFTGbM7Fe+ahI~-A8YSwe2xX#8F{CO7tL|PMRRp>O;O+=aX@tW)4W9ZdOD=WQqXrp z=glgttd?_EQLA!CT33QjfJgin5sbMDH@y<{ClGfCh{!&XS!F5L;~42s1E_ zcRQ9yBu7ppR4nl(eYO%=*~uOLve~#C$&Xn&NHG`% zU3}Dbn&f7W1s-PISsVNN9AFM^5$OzX?IF?D3IlXE-x24z-X2RrBg3n-K5KgnQk&L+ z&4D80cWzw;3gr?Q#>3!M@%ofumPT3JRq1NxjU)vk(w z0)Je47h^9U1|RmP?E&Q4^n4G$BBl2aHXjc zXRxi&2VXOxNnVD(7#9!qes^{w93r z+^iGPy2!>t*$NR+PTWpc!J|833(ox$%{R`8r}#K{k#XU?Hcb+t$ln^%U>2PaT+&x! zZ71xxXEy(il{Y>#hkac$cR+MPmYJ^f&=z2QINs4hQd_xSDa$Mbhns@^F$QkVA+}$_ znwZ_|@!PH-4|{D_sZMV`s_zGDGAp@%CtQfTX}qev?=25qkhM+y!3hZZ$r<(h% z1+mNxzhQ&Gi3Y_Ij)jvm(JiN#J!id`-J2o1t?dRj@Ln7wRrerzC3Y(v{9n3hKjm3d z8)@466Zm9DxJ&Gct|DKeR&EI$YRhJNMu_<#brm&hBQsbI4(tQsawfi^xwTh?_~U&G z5R=`G#nR2{C4^32w3vqvlJvWBhWCUy#kU`@xSyiE5qT~Xmc0fKK!Yv_(yqT#H#Owq z{%iTOx-Ci_`=|7Y^ON8Ix4fZ$63YJbOsQ7Y`v+9n@42+?Z$YZOM!ntvsc56gPZ9~Y zu9`j+QGTA%fG7$}qJ1pV`v)j0K}OoT>VGOw7(4p@ez29(3MF7M=H%0p>ocCquwoHF zT6@b*iIx1uI*=wRUX8@j+bi~{fMOGJ4Cx<&dXwLaPdt$PvA{bH-X&C0Z;ynk z-CsABIdhaPXJz%3_B^qaGt1v7*$pw zQo=7j=1nGYy{jxDO&k>TseOT+`c4BolSexta08TjuCcbIxrz@zuJVzJ{p6D_3g&fJ!S~$u+TIU z-#!64nR86@K``Z-T}n#VA~``pV0#Nffw1zFzU~I&*!FPkBoT>`Qf?@vObizCMghW! zNer0SIPqk@EJyfqGF;wJF5(Z8djnAJE*3|ZmszZ_aC=7sQ^%lzJ@{l>h*=w88e=E> z+TR89C^53CQ8-3iTGfC=xY8r$>0IFh_ho8>p^>U#n@c)xKy38^Qif7;;?N5cp%%Q! zCiJkY4S1sXw3v{B-+hNgix0e;OjDJLRm3c^Tkx3qJG8YtaVUYKaBjl)pv%bU<43k_Lk1RIEK%hAy^KHw7TXf z9sBZbD4r_bckQuQQ2~yPX=omO(o9~J2@fDA8CtU*DUTdA8-d}*1R}ALvUI%pPC5Rq z?VW9(&?&H^djbX_F?(pa`b*pcoKJ}y$3uhd2gZ?y}Ah2LZ5I5USi?3Zh@&c+iThK_CP4E zmutSjFi+h)io~Rm*5vU#Os@iB6C6wXGofTj_!)u&Ltg9Wc4Ri6R6Q_SY00MuX4_r% zACU1!q0u))4;*>5G~?!*j5})Yf``P@c+k}t0yY?iZzlQOd0w(-hrF>IzM61$vV&&aX- zK5$kutKg0^nQIK6988Pxic8AcV)xE?7;Eb9Lu6ZQiy_g_0*rZZL!uE}4&Fl>volG3*T@9=)j18RsQKH_`-1)h?!uZbU6;Ou`kC@nAHw&m;)SP?DW*1`eGNO8SE&k$}&yDESNpDs7QL>S@Qt_5KEn zgj>Qe!QmZm2&q^L)TRejz7%|^qZ{Z+K2H?Z4e6!d>Y&?4xX=L50#{n(Xc&B;fn}vH zcA;ua$(u7fd=QhkMAo&QsJ?+Uw-O{H6o4JI^_jAsWg;vMYSD}^w zVcN*0g`{qnlP_nuJ#{hV_^X>=B!*8Qhx z_Z~xs%tSY4UezjBd^wGNTF_ENFC$l(d<~5r6`C1a|9-=Awa|9Xz*sa~VO|cFxm_tm z69TvX*w|RhoE`u#e>_@fR&v-NEuB{LL2|?NUpAr`bRX;s_iiFJjV5rc2Cwr2((qm* zVvRH_1VOtWj)uZLA!{OkVs$&|6Le|&ISi}~*vZU3DTUz};Wvv#EQC(x>cZ0~wmB9c ze#>oOR-Q&pc^^7#59x7cZodimHu`~ER+aNt3t9*@Cj-TRG)o1a$n;ifn+6%;u9P;R znNGbSHTBv6SA*z?PfvG8V2dO~&>Vqd1#v6iTbHjoG|$CN-R8G28;AY5*)wijL`m&a zav4$BZ%2MzhGiRCVjhgjAsO^ZM5pQu`TZA}eKlEoYE#4Uhe+%)!dZKY&yOEkd)7GO8LIu$+2(| zBr{4eecxANYM0;=Ytb-u7D-VuCW5KKu4zici`kMTz`eft%{I@?N^O3xR}l~MG+=sF zWIidSJC6ro8CPjrdd*1@+(Q9_N6{s1uAH&258E*JbdR${aPbBcA2VoUgKr0fB9qGi zFN7ty6<$GRO|^)jZnQAMTeU%HRsvb#Z)7E9yx`nNaQ_f^5{T~613ER*%RShRpV9$0 zW&b6i5tY45H!s6TSUC{7XhYZv*NmnY^yNRW1qj>Bon7#9ggK$or^p|hLHV*xX)biU zNayxIb-SXjkY~(!AJ4i!zxOLnym-)-hAB3bs!o-s<+C9MQKn^sC2tzOZrKPPM+&nx zeUK-kOmw>^CbzdVHc}YI|Gc}F{1>U)Dtt=JJ=}m>{#&$>ij2S#^kDfKY|AdD*vQ~^ z7h3#5dAA6Qj2qW_vGX-59EwB(QoVY8#U)U|jJXBXvfwM5eWv!U&ZsDLkEKWX$ zCPmxqRy9vYDM#wKxuyreaqp)cUa zZeH*~!fP}mo`9!EY<_@0 zk<1WVuNV2slaba%EHUUCO8Hl{${c_3p0D#rCpwT44`zVVSXE1wz4N*w=#?$?41h^A`-8=>9 z46D6tI!qLvPpJ)qBwjY#2t7tIw!9A^}72sOp`Nr@JdF;;lgC3?as60v$ZYI;BOOGeV2nd>Qn*Mpb)TSU2G)3DVCl}M1{rO;-^ z>?O#D!gyZ%2pJ{o^e>4R`*6cr;07q_{%`#j=|AH*Z->=cwjeXRR8NWutxzqA)Y?Az zkBvA&5xuNw7;n)s3yFGXTZ@686lY@((;fzE#GYrWpNJ}VP7som##Y8+>Oy9vPnDu~ znxCWcGj7RJQuQsNnd#a>y6l>dDU=F;bB5e|oT%yzI`Xul!u%#?%i>{10NmCcgBaAHkq{7saWVyx~z~9F0T(xzgV2WD* zia|D~8d`1nlp0$HGyG{UUXV5}psqqy&NP*SfNXpC^`{^0p(ikjq6QDO#YR#8__m3w z>U^7`n5OVnnp>8I<6^yXv{BV$=)~a$FA(3wo@CYy#R-2B?M)U1bX?&9pFlNoz+F?m znB)^Q3KT^2dpBnbi1{I>_2cF8>*?#>NbOWidC!3!SFdy-mnnAV(Yi%;-S(a0`<@MR zR{6@{;AVM=H#hc~8~dw78?E+V?MyAx-r)FW*O>ftcmAJF9=JJL{PV)>Bj0a1$N-_MsXW8LiFuum{%BYN69qrry3ElplfO5Xh(IRruTw;CnJ^ODY7 zgq!CTafd=y{I0&=Ba%d0z=4CHS2zs_4Rv#GJv5jbK@uX)rpOvcjpgUmQbL zcyEZsVi*o+80%6bu-DIV}zhb6|coSiSIr}8Dv41Ok~&VK4n31m-j>e? zLG>pv;{2NJ-J^=H#jv}w4SmxC{bYD>QZuxCj92+#wPH{gZ6vSCrTU@E4k}|>pd=^K zsS*~19YihV9C>d5OtIaP13`m7u{px0E`r6T@77b(28{ijT$IX?HL=vN{bfItnFUdZLJG9jXREkEUVzfK z7Y|^vsChMW+L_^A$A+4`<*JSY6hm)@)@O=E;ff?=g_vrZSw<2Q)HZ2%6w3T0#}?WO z*;wEUO!{G~ShWKwpuDFa(tyjdcNGpF3fk@e-GH3{0tBfL;# zcOU55a!x7&!VlsDZVU-?dh>7E3Zq!1{fA(v3|xbwucx80E!;Z@#DZ(H^|i!Bi+e+b zYx;^#i)43z(ycwmQhL<_tQ^>*rSX!zt(1 z>oOgmZ_Pm^b?C-41ZaQrpA;F?AqZz9cf8Pm@%AP^e$cE+czgi-k(=%KCVu3Wm=Xu{! z3xw(_EK)x6ndiN{dPNlO1u(EDDX7Is&QWx$yig`U4>8}g}Z^} zguCeh4Q}oZQS}4VM^rw5k|**C_{6u|#&oVOggxWrmdz$P8bMD7;sO9SxG6Umds8qu zd=vcUh9vQHZ`zM!s(=X_h)M4D`hMs4>yqf&$u+Y@#{!8GR^d>Sc$NXV>24fM%U&25 zunpGsn}M4W_~`8*b`KCSeLTB&P)e_Me>%9}|5v{&B-EvU{nIT0j|l)k^xyeiMG*mE z84)@g<7)M5TkKK9@9EOjRZx*YQdUZvNLD%TOSjcQa#!0()Fn|V{5_AmH_JtHCoOdv zCRg3FvYDII0Vre^NBNkRY8`nc2ALUvWDo1onu9jz( zp1hy9%vq)_3gw-2BU+9Z-*Y7`l)sxNYx4ibyGpb3)LSWOW^|rvmRDlakFR_$$Q*Mi zjg({8QrNW-x`*jBlw{CJcBZQ;W}UvSjh)`Fou*g4=lOkp((gw&Y7|+)1ILP@Q(uC7 zNz`A^(4@8?MyaN?vw>pbgOIs{R6y|6lj=&14(YCFjXX!d!A`&B%~N1Ebg0SNHl^xPt_#lQOWLhIW<{#q z*(XaXv&|eJ889Zv`c#nimUv?BS&=WKxZg!!5wUb_A=a%3Y) zG8C@;6qh%|e8|gbbYyZ+a4T|dQ)D9X71X@5{p9ezqK%Y&-Bpn^OjaPL(8Q%?{1Gc3 z5o2RPc!OvrrK=x>alRK}rLwMBU-S_vEHEUFC_^e~ldMibQA@@EZF@li(~2Gw7;vs= z>TOfN17fJM3c~+=zq3zCu`b#^M}g>e#S_9@8kbdA?JruG3hVJTjhjFqjY$V~YoP@) zD<~4@IV>PhPbDNhYq3ImFr%V6I^aw6sUm^RNe8Hs2VFJw&U`CW%`ojp*0^Ac@&5` zWk#d3j1>%H3K>V<;pvCuG&S`(j|gBpFKU{ZF3Xu*b!e?1nZn&66h|&~lEq<*ew}XZ zf`42v_;vs245{IRrp}+?+xS8C3oT$^e4I-LI7T&#pavDFQg5yAkAC}=N zhOmVp=i?I&)Ho?KK)|82i^Xz`>_Xkjs**`fD~5hSWkz@iBM9u_$w)=EVFXVquo^gq z7Y0<+fQ26m^UsljyqB2nk0dD$kE%o6t>VVV5k2x7L5Kh`OzXCs;%*{onfU8yf%wk2 ztkq$^h9&ET5zc{lO0WTvJYF*n>#T4ckP?Nb%GcSI(*(D@&UHVCkW}NX5{n-b1cW}$ zxInKGG3!(%DBhiUNJFcJIIUw}U$=)k_pGWse;QA#n{b*hXwpcny6}pFujF0!TY@t) zYFfSj1BnX($jtgX+8;dAwT0*cM9EFaMW?)>337<~ULc`FX+d`ASJJ%Zna<)nBb}^% zR!bP1>Sq)zkOQTbKb(MNC{HCRlUpvyuHsB*7pa|yd9e#hq4n?{GmVuo^jg7w{_0R6 zuR3J;`GwY#KEyO-!pXE+=?{+Ig=(2P{YDeCSgEZEV0r*P30bP`SHu@eU) zYHZO;g5cwPlH0Vin`T2W3xQmZxkqQ&;8ds{y;WfrQgusSnyJzd5^F6ZF0J%z+OK7|!@peZoS1@}EMT~E)M7ma5J zf+d?M{0lmA>&mk+c$$F)dnKIn})NV|g;ZR|*@C*h# z7Mmzok|v~#N(9jB_hf3NJ3eNDaay^6f&=2OB388Vq8zq;O}6zGTm7+sG$L7ROV$Iv z6cx@A&G}X|zyfTze)&}KOi{14)Th?4HGwZ390(s101@TO5;{#JdwT{BsunKgn4;GN zPZt|({?no}-af$xr)#7NnEUA?;T=W=un@kt9_r_y386=b5*k2z4E4FfYMb~102-!h zD9}vp6}2P4#U>XzO!FC-O^sCCWw3RBX2KZGH^D4G0XnB{?Fupiako1m#I>@--Bpx> zRqzDTGUDh*htl>0(pk10XB(rMH)uzLAQ!5P{^7_3Y_N!OWr^8wUCOI?G~)w6tl;Xb zc#|-?-{TAw*&KTm%lxyT)|F|nRJ&m9QtBHnEjqrnCNjA6YHCC3MV>d#i+rO$6EAv~ z&P2sj_MTi9{9ZFIK2%aS?&K9fVfs-$IVA)q+N;343!JW?tt>iv`m<WnMGqaL+ z*H#)WO>xFRaHac{?qZX<0E~>zOUsIL*3AE!{L+??Zonj?myNf@--UiZvd z@@B+(5e=O8fk+cU-beHLr{Z4X+HeOfOa0)dHlI{+3eX~jY)Ey6AYvZ=Fl}JXJm0W9 zuJA{x5ptAE8s>6XWQAfsLC&=8Z_n9LVi=|>alWg%^a`qQ_on|StYxm;$@tReh&`uc+Vbo>%xnN7pw=KwDodDp-(w2 zndWlvV)WGVE{O_tFl0Hae0n6z4@+|h4C}vsTA=iESg?cZ{XV-`s~kl)qt7i>;fp00 zQW|U)WgJF@Ch;_1X8=Z}f}3TV__G*9W#57xcYz_&jh3-qyt~nErV5 z2_bmPYu0gzMLz#=Z<7Qpi=X;(Sh;X5r@K27yQ%fgkLen0kliZf9&LI6Kxoz6Hx&5M zc~SSwYaVSHwtYmBl1j(wnkiGm3?gFPzyTUc07(kNiP{z;YNj2D-F)0q7Ixsp@<-3% zg|noCsmo~sd`@!|(^Ojo+wn9OU7O2iEO-xA`kC z92~jH%<8O!tiWxRb2zAa!xCrvx{w{<1yGE4J*TRGCG-YvEi)fI#HX4rur zJl^c)r;@mlTcmkpAE+Jy_l^g)H~-?~$FrxC`MZPmZM!h~)ACdeLC%hO%A zgmyUarceNTI?N26Mawido88O(6og;#MtXFghaV1U(J_&F+^`R@$DyX>44zCo^(uc} z40y1>rBNF}i7XV-be}_BT73&cD^X`DeFmte;{Pm)-!ZYT981NB*TC9>8jdQL9654d)trMHPZ*7P2hSq+e0?d?l$vp%8!=d z3nZL~f+iXimRRIrG@&BLA|~yI=G+Mb!pTsP`i%bw2opt9h2a7)tzgx@Y>v=#sZE@x zj&hz`W={w=iE1%z(zrq2%kovh6*$pI{~W2OZUz+CH7?f2??#6X{3T1z;{)Nt!JzAI4tK9=#RjhMH;|qR9Vn zulj6g=&uNFlQP*vbwe}aVF?)|aeV+|;-~>(ML|>PlGrI(OI-}^g(3VqM;~GA>?otG zeI#@C0Z>}o0KiIHKkb!$t&Z4N)w{;47Q6&;^sRrO7>_}qS=TPAQr8|XGs{aK4s_GY z5PGV*L5$rcm)^fFQ7ia`1neg({PdF*{K+nI(l}tB3 z^Gx$c974GRB7*p}!pPZcp5eY4^@?(JP3RxU@#p^I59;v(G(JGlc?QrI3a%mimjgDN z7QyC#nCW2BZDdcSs9JvIEsKBXkRLd|lvw>W)PyLb;FgjHPvz>{f=3Xtd;BeNYG~yl z<>CT6lNME^L`d@)wi)^jL5#%`jR|y`oT3WK!mt%_u)S-y>*~9i5tg#E4$|P53@H0a z*TV9j73aMdxjGo4G$7kjX#zh3Anb^nieDTnA>`_UWvHN!#OR}P#zao z_-j^MyWdEo8!dN-`*HZ@hvT3~4$aYrzB7Acof4)XCtH81hvsdA$je%OjX?6GPojTL zs|vJ!5Z0JT_2LPZXIOjxT7;PL%R*db$W++1XR~^CiWB;Z*CGMh)<6wjfO#!{qYt?Q< zZ#1XtGmi3$h! zz;ss|5nnZLOVj-R*D|mXrafghxlhHswRSg`G8#59@D{9mZcTtW;-v;9F42`4aS~C~ z-r>?)F%pC4Sa@n5{E6HcHA@%Id|#73tuoo2EPwlc-}2+zREJ$ZbPN;gDiCJM8Oa?P zJi-2}19(0w7svehWDft|rJM{6oJ{`d;zE>Vk_vy^!8`REnPzJCFy_|UMy_e)gQ*6L zV9?tCL)kkS`xeYwuSz?kt*`ihseT%+UDOF@p(OWGl>?{D$!uNek4 zbQep5^x(?gcZb@?mN%Awvb)SOdws(W>_J@S5W$@6_t*}&<50} zL&w#hX*ZEvP(u<74N0pqR^{OpY!?i!5J~M_sYWbuUlVT^Jr)jKGLI;^D-tZPmyTe3 zV?1SZ(>sO)2LVNCS1&x|7Y%_k4Wjf*q?FwfVONyM2_+b`pn!csK`!V!wc590e!W!s zEUYRmt-e8hy{|!0b1?G^asZtfC+ZiI{5qP5Vyb!ua)F`_{jtEjx|$$Ge>x}is#c`a zc5RW`bHC{``^(4I&8^oqB%v%U=Ew`f1e<4VRLXm=N?=H;GA0zs->nZR0ccXWZLDMg=+ zz^G6?Hv^jqyw`(tv2reU%l9AiX}P@CsyVJ;?c1@8SF5|w`Q>cec^cY4&X@3sTBqH) zsi(ziNkotsN*!mT=CYfjBJbu-_K!H^dl80IzI%@p$!0)-n|UhNDQwdI2J=u7%qJUr zbfJ%IS{;fxz)V}^UU}vVe>FA*yWOYaK_P?*Zdz$7>))t6!A;Q-Wi1yXhZ8d^*?vF$ z0Q%3PHXOMmngOs3SAg-4QW1Y52m?I>QzL**gcYD`p5dQIO-i~Gs*es~>lLM0DetET zCC5Nf#69ZNLB1c6N<0e4?WWY{z~$8|tMx(b4y=EcK+Voqj@p3wYV1~iBb8Jw=9N=D zF5N(H&d>WHQYb9qL1WF4i^AnSMIvf2U~acG7>`)8oS#nL7}&bS*%q$^%=PGppq2_H z+R>E}$fAknqXsS8;)h0ysahB{_x;Q&faH9#ZrFlsF4Wk zVOxk~DI?RN8Z#gzkQI&rxq;-T>#Q58= zptdi`>)*Dtv18UO7+~~;0fk(o|1`@#ck|C(jFOkK+55Bi+r%V@k}W*-S-1jaBR=&S z^jWXdP_McHp@%;&)u$J!9YkT0a)w0wXhzDDUc>q;uWfLU%bKDs5bhh?fMNL>p9^xs zgl1gDa?bb@xaw*f!gjgR^}P zLX=DMZV{oXXrqv_@Cn%?NUw*u4=o337>O7)2c=oChyb*XK2`jcnEDFDwka|m_AKFm zh&tl*C9Cr{Srh?eROg+ogyEx#puaTMe<-MXq|;3^^&4b(gsCqj^QvJQKm||Q(HRA@w)#i{ zgZXjae+S=x=@_SvCo1S+^R^A=G}H4+))cN%{Y93u*-u%RVr`HJ@BBO-YJ`H{CXk@h z?#m;~>8y*BtW)=7cD%j!P2Xmcb><4>Bj9z(>VxOqr(_M>AvO@!i1q?j>=%0rnnTw_ zefNKUopI76Q)7UwJpH34@1M5vU;Kc7{Q&fN{@1oftpDK$R3^$+10B6Gi*s8QPP z=lbPU)v!3f*Aodd5E;I2bH-mt(MhNoSQ>A6cBHwrJw<=l+(}_-dlx=1g^mfN&&Cs5 zC&LO@g(m!Y;I6v4z5K=yxBwNFHv|&0*j3J&0mZU2>Q-1v&wE4WR6#5V&fX98mBz_G z6BJx8X|`#u>}2P54yQ3o0(mSp(tm%?*00 zB=g1yJO%2RPg=hKl?1=T7xy=qnNHOC=H$q$k=%pztD>H9JpcgqnqRQ@OPY3o}j_N2}uRC1w7GCWU;$ zB6rqMCFrRs4VvRV$_crMKRU|%o%}c>XCT%$t4t^|c~pa{no6tb3836Mz)J)q_kjd2XsI|d| zPU+JN)CWgkbP^{5-e$zS^=;)qcd=^vC0t_e^nqU7><}dZq&7>49_NZWOB7pK$>WbX zS*|YFVK;loUBcM$gkr#~{P{QPNUT=Z-T^qJ(@)H=%=9=G8r=0R#i^iz<8{U9}M4ZC%C&1uf=5br$*rFty6fmMPf|6P^?-N zuGkjR8&>u3AnM{|JObYPIZ_nTuNxx*M&0e{b-eTjB+dW$%#3kPwU~aL zs!pdZzG9du=S(ccWG)GY5KzY!{(bI{!k?|^m_KJ?P*~AHPOaGZASj_G2?~mtJkFNCSn5L*#<>bjH->^SiH#g;<=qd!q)iX@ti5BnNst zdYsO?l`~v3vZOYb(;+Y43#c>Q&L)yEk67o!#p>gI%yL=~a*VZN=#K&?YJ^MP1Q3hN z%o%lWVFO=k3v24EK`>>TpMu^=?Hi-*?d>F4pB}fjM=2H42`xRbylPjrU_E_d z3%uYde4xLWQ^b6H3`%@>piOr&xieTuXi970U{4H1xH`oKGH;V~PIJF#*a2F@WR9SZ zdCh7}>mmEoxS;Bc@0k?x`@C0eOevI!gS|&?oT%>5Wj-@#DBHu$a7Z4g>=w$<_?yrc zFEU&yIo!fTvoO@qigYULsb-RpBwOxK4LNaboa08ye{4qk6CF4y48J+w@AcVRrf zXs)(WVt0%7V-1|(A}r2lCvv{L_`=@Hw|!3l34uedOki0ILRz7&IC~J#iZIVpm%tTe z9F?E;o{zd1V!d&58!==!!MBYc%)Gox)>8oD32)M_0J3cGe6A0uYk*a$MfMhjkuw}u zOMbeJ1MUvx*=$y$rDxK7gQx%2^`aeI`?AZEo5XRQ0&`^D`~;b}IZ@Ru+q)pTz$~vv z3tjnCuXzy5=yLIvuX3h*vBT28`Wz|;vAGDzanx)UQgD9L&)PMT12kHcP< zQb)aGR4o}N`_2X2GiiKC&8mUm^;4pz2fP7k)_|>9N`p|$Q}w9h=eStBn*Q_x7<1lR zb1=fZSQWh)mvHylS(iNgqN9uprF;=B<<8P6bv0hZk32Ki5&;I!K8o8OZ4TtIp!GP$ z7cOE#AM3BU{XzG-&ubYUxbTsazEBV^U(A($D@)h zLT56bL`OpDRJ;a#>PUT2(!BkrQ}*e)g|HWz-fOxE+N)I_cW^c#GGz<&g2Sr zZsgxW?@24d6#6(|dD-pl+e0WqFs56u-HpL4jhomj$x6zyzvR8Npd#HY&Tx%NIE$Jb zNFXFj_tHsz9UQm_oJa+fN|wNGyDee2mD4+|bZ}aXf8RhW71zQuwIX6;t|PrPEpk@H z(6uay4&51hICuEf>Oh=i&aMe9(6f%S7iy%Nek6h|P%Hn*Lv)LbM$sw&9j@`Py7z0= zM=300NQQ^$FlXwM=b>7gsbW&0-*JVc+JZ@j#}~VB{;Q&>{dX@4Qw%tUQHm4~8l>uu zb>5yDfwO5RKbNojC)`I5^)owbIzhuP{M7-fHRwP_G#SPw&w_#6>_T*TuvsrQ`8~2e zSTa=k56JOd?1kCIPEMSc+V$#{v+SBm>pl*NcRzeKc-v_wz~CuY+l80dI%Q}nj*NIe zEmKf7`IGb44H0-5UC!$oV5)#5sdEpj7~f}|JZ*iREsjR93kMUura5{2n(^Auks@=; zQVJ{#T!=xo>Kbb)gRYm{)g22%cKB{v?k?Z7ARz2AP&guUL`*?-4*iE#2xdT$8E2MM ze_D=^Qh%sO6cz@cnP@xMxfo9JDbDcDK}=(Fn!;B%6%8-2h|LH3G ze~;r>2B73kK)B=|^#o0gENyB39S;>L_Wsd}tn--Cv7#O1>558=zu62rD2Unvie2)e zjxv_GAg-Of?9+>QylIaJ&JUHSPMGn!(=9wCC221Bay5WLA{Ns^wOVP^dheO$AunSv z^0m?iCbUyDfFlHj-0&9xTKv-mrck4N8;F6-@#Q0|LVwa*6oWt%NA2dJSH4h>Rz$2G z1utR4wqPf3NT00<6>t>hiucgPnIfqd-&;9;Kvj>B3zdU55xCU=ywwO^#n{ZrjNDs! zrYY8!krNJPaghYgJG1N;p=b>mc{8I*rBr$Z90>9=Z)D@qR;nfJ$3gRR{V8JOX0K;D zSO3C@5pVyMBAUITH=OWkl-P>gg!qRcv?{N~H<$-ws%wmu;5@V=cs{>bBCp^?^Q|=` ztwsE++{(a*avz8`Jg>qeCn!f$cbZ&V^am&nl(==!=cG+`ol5lUGaHvA9;7BEar}`{ zG+d}gRpoPei|03Q7`IOy>E;=pfH;*{DR#MBLD-|dAXN3m#k02LxAwDS2`~F3M+_$m z>b!w$OUAG!jPUduRp6A0i0_`(4jUjZkV4f`I+%hFXhg@xYCGN{wQ+S4lkfC$ULV`j zJXAn;^EbrTiZSr)u)8D^V~;f8!OMZh%T?0FKBZAgcC{MPvVxHvN|r<{uf7 z$vAHNetd)=k1T!8K^jRbGlqm55+QkZa5{dkedRYMP)ZElQFo>55t-iwZA=nnYJ zhXai0n@ZILuefi!AW;Qyzk*`LP?Qw!82Y`=4h3RvqQ7Fn$HXqH2C;J%Ub9LJD%Eax?hQUn}lCP6t3K-guFTY$8CgjzQU0{dtS zo&RS#Yo0pU83=g+cHT%{X`@Q-tLR|Fp*1tBi~MrY2PB)xF-Anw8KZdj^M zLKBNBx-24QqVqkOEgqX44ar8qF6&Q?I>q&A#yK7ZY6d|T90BeL5+bt`X*?(hXA3hE zljgkpsN*=D;gZUGv`fO_atR++Pm);G6;OL@Bze_s+Qx-z*cNvo^S zso{C2H-KIYjE@bp5!EY2MM{!ebEf5o0 zh4H~eq8=JaF%aL>km%(zc$4xge4;>@hmA}GebOcRS5Hx_gK;HV{l%A(q#dvcF|L-@ z%V@yka_%ARvuk!WPk(hP z7pbe%?Zrz{d~lvh7FX&i;?b@kK-R0iZTF8YHc3JM8egZmx{#BH0H+>{mu3e`f3lN zy4nae%7vc=q(C}20rZ0|*o<%lY;#W+4ZR3>?u*o1j7wqEL($CgJ8?*EvCaz4m&+ zdny&L4HH)wfWr*9wK4*t^!xFI64>VOE$@+%hux(lPntnK*dR}+LrXA>A49PQ|4kd@ zbi^Y&TGL17(9-=qRrWWoI~inqACm}cinu|Zj3%c&IgUGvmwZSX4s1F|u}ZCh_zTu} z_!}2|RHFBy>X<{Y9~3}eeE6gL$d$o()nV*M^*&pt*ZUfy+oU(2UZjdrBs6kR@9(1% z=QI^7AjOM=;wZ8i3C>C?+Y=1($(^`)Ed~Sq!x8yx*UJgQE9@qD^R5G|Pw#c0q`+1$ zS%>zeFJB*BLcNB+DQcif23R#3xDX@tq5IbfBM;cH!b&$nvhbMnNyuT-Z0&ZiDQCW^^#n+NO#HLTz7V*Y205FaX8Hz z-wE2P%27^o>c6ssSPwFk0Y(JcPk|0YO6sA;R%?){ytvBPd4AaRrVt!?w_7VV-J~&a zkGrY4had0w9J)gjeUQFFCWmt!4SZ|1+%(~s$i^0SP)q6nSL>J%BxXcXDYytLx1V`_ zlt7mqNuM1Z(%F5~%3z}RWi!ZIvRngG(z9EaXYaIA5&l<;3Zr84=mh6of|cXs=++0- zdbzlz7LLoFX#}6zjVV1bOnV45Nrr}1bV;q<*TwH>?O(U4tZhj2;8JrPDa~c8xWgFf zPUm%jd%>%cit&R|iGGF2Jz`2~tUhrT|F|Y;9=7}8`h;y+f;K$vHZvY$yL?>_y1*1V zryZDH5GiKdIyGi*Z+RT4Mb%IerL0CWmODr=?&?&@D>sWKy5w#OgGUD`_=49Y7+#NlR?r%y~ z`@Fb+>>ks8rcYpa=X{dBT|cr1On!?nfR~g*ca3T~-cZPPl3wHn+QVICsBL`v5B1J{c16M7tG z#sT~p<@3q|aS_StBG*MRm~Dw^njRsv0@v>d9#W&&(T2kLG-re#8Ox~S!y33I$yq0! zWIvip8j{kINa!fb*C%`_=FF3vLT^*jzk#Wm8O&=2Q`%iPt`)3VS^hR3oCB!TSY~jy z(1)NCQ?;F_sHSM1V(t}KyO9iUy=i%aSIABjmyePy{J}D5Csp6xn}Rlsf5h{FI3Ue-M<}(vW8DU}mKCRGXC^ z-l5Tsn9+%dC{+7Nd?o1J^b>7)QB~b?Ma0f|s0#^AG4H3$>+I%CYhosigUawb_gcWEFzu`hn)(a{HGOI4WH&Vjh(W2MufiO(PP1f+1xMfu8&t$2!w*iFPvjO8D(c=G# zxBm%7{tUS*Nl8Ej(xI$Bp{%xMtTwCMAerk(fh>D1f?!4Kn*5bxe8$g+EI# z?C%4k3yCPG_jbg~)_PLPIoR71211s#SGSn_D7)W>XfrM>{MO+|tKTOoOokZka1sna z9c1y5@Qo7!ydOkIP`<^vb_~~RQV4X#DWn-G79M0zBu$Lqhwly0!U}UP& z>FSOiyX2S+6HnFvE@zO?{nUB8+G0pPzl3IU4&ag*`}Ca?q0O<$im% zG10U>(O7eVNTMJxe@J~Rm{KGdi}XXBk*DX(Nff1w=Y{xlw)Na(5VNk~xcw8Awg+cl z#^N)M%cc}Xh#jx?t<&o%$C^nXe_vU0LJj$oNCC*Iwd?-FWgI$3XO1y&Sf|kBBGglI z=KIf)BZfS#C5iHH_dkt3b6rzWBZ8=lag=+oftfKF)?rkX@s%`9}nD>>OCMDPgA zUdCbAZlmUX1)oGx6li(>;etQ6 z?fpB`%pmTgp@9ETwc9F{#z>ib!AlQI17nEfNJ-{Ql~=~j=r7_(-r(2rEl z@6!may!~g)uvN^74jML|7P;-rg1;+xf1J)Lnik94rWy@($YKX={1WVUe#`Cu>`qQ1Rs2z#MYW>0kU#&E=TCS9#*)RgSr(O;iR`N(m1T=xp!)q zco*Z`veeb9nPkF|8P;HTrr;&0Wl;rTegVe55Z)-I+ZvAG%{889VBh>TdH-mP?*;yY zw=UQSADWSTyhDkoIqLvh1MY#wf#Mf+!3mUO@8oTC888uYz`EUxG~PRChS&BX928=@ zhN#wE$1BIrF~aW*ib4@J*2|qW-Ef&ldHeU9x(6-7dVy@FOi8F=TgX3Dt7G!X4Ig*- zJ{iVk!mkM%>|0xNMsVg>^&is8rB&O-mBcE$c!qJ}+K|tx`Hz)!WUuTlUoRJ;nEAyN(88{$&#Bc5ZihXs?oBG z=-GwIjys#%yC-}ivPDD;d5X@W!%Eodaa;0^PsdNx?km@&DQ^sS<%{Q+P+6YLbWpXN zq!cDM=~`g112o4SS%z2n3V&6Xlm}0S(>xvCC-V2zB{?c-9aoW?H(&U7+0S1MRoioI zU#=b(BS|+4aNb0kzd9eJ|1_@tMILcg*l^Znv8i+A@#OLOw>-Y)Rq%)~AYKs%kZAnx z!diwl1~#^ie~~&H6(#=YBh+K%0Jed~w@_`Y z)EF`aZf`sb+}zW%QJIl=j*CFAWLZA zkMaRivwMj*3SxwJh}y7}W5smtNUCUJ&Nb>`q#@LF1cyECWD-Xt#)fD7wK)47a`v)u znciUK2S+~-hz(=Fwdr}d`;gHR=6h`=(a6grsVS{-A9RbFtRK-t6{BV{K!+3hj<>xf zUv@aOZ4brtQ!PW{+)gXJLNEMs`}gO;N_(>k(JITP4F5giWYlF{k<56z(Y{oB>5^WE z*w5$*W8cFssuw=y1>*gIIiv^P3;NB6AJrq@ACb?XIaQ*VG_xGORNQ6;GZ`0GzLU{% z38ro)n9em3=6Rcaf3 zb0dSl=(kd`b@qL9Fq?O%HU&na)fO0Q--c((Bv_;QR-o(%oTZ&b*>|=p0+G({%v`Te zPsOUu0*Er}V59`L_QJ*a1Jtt7kH99;(%LJwjGlJaY2H)Vb5to9a3Ye4>P-dcb4*eV z4h={n6&2?COo?%_jG*JS7W(jGYTu0$>^&E0_~XqI`O6de79-k<4Z?)BLz#8!`hMWoQ6WvHV0 zEu_n|aNhk+Q+nq6>)#fb=!bS)I$&X$01Nz&pZve`J^sX*^mvnVsi~n#r?ED=E6W$Wsu24fwNaTz{IZ!~20UR!e?=qST;mvvbsgiv$f8h{>mt zd6Bksl&C93m8ww`shXFh8*SDP0Iw?Rd=Q9-(ir?IXMcJbN>?daNk@5*H)=d$ie9D+ z?X1JYric-6`N5dYljL?=W)tco&K*U0+k};sX<4t%{WrswEI-5n2biHaz_|S*tL5Jy z>R%K7bE;l(^fmy>deGBbcm_wUA$&Q9U{*%wneGiH6=p{EG-~OX&o!n1wt5j&aLD%4 z)+$?+ABO8U#3?06#@YM793tREQK-)53PBrr&^*c|bgwZlOT5!I5+?nPK+Gpuf~^UFjJ% zyIrS9pN>kvF-HlehwfxWs9DALkg8e``weKTus!4zvm1$G#=qJ32dSkKdp1sA_8DaI zwc_Meg6J$;-$vN_lz3IT8fV*Jp>_VFs<)9lw%6j6W8V)56F;yAX~Z((57$A~j6qupR}!zBzx*{3J}<(0isRAwO2C7UD#tk!9S+4)2aw@7~>R zbjlbb=W08e*@_Ep?66&5q;@w*QU|mOc1^12+RFP|Re=mbQe+RMC}U{OmYMuE^U4K7U3khR=E!=@cp>dDq)Ahx!+krD{c0o- zr5Gfu8;uzxu-+OLYLjqLwv=bW z1fI(<#}N{xwps7=+3GYY-s~^&&B1q^V(fERbD*)+2y+Y5d|(#x@CT;m;PKL|{$g{T zY1uZ|hH8XrdEO7XHe~Q>J80ued$Ii;4rwXrb|?p7QL&G*7}uF>0Pjc*UAwWTQc8rL zXQW(!sy1$(!*%{yB8GmNLDHEwE&g6w-H;Peup3gzz0ZoMulKDikj?KD22evqwn<;R z+anoJt}XH=?mUaow`TWx#aiLWZ_qxfuk1ADpV+_#DlyJk%c>nomBMeKB6_!L0dJA z-xBTu4Py5o{~5e!11pkr2KbO_z@YvoC;hKfmys(#CFzg7mZ%~dp{0-$6_c70qY_v8 z5@UxshyK^e*r zDr**ms>rPhG$TkE)G@bFs95S*#k^44u@|2|cM$*fJ!&t0Abw6il>t{#fw`*Hy!CI) zwvoMX{v^PQ{~=iOkCfzpcY+SI|9c)<(Y;UsyfA{--a^)ALf7smd|W6{?_gTP^*dL| zmVuzR+t}t2MFb!u9ccq?Cc1f1SH^V?(>STl>FjJ{73E7!+C6u=2zM+EIvwp=pF8Sb z6M5Z{ktZ1FL`@}vP4<USNG%wsBDL0j?s5eQ;R3?H;0=ScS8uS@lJ zhBjnaKFgvM4TytO{jfxY`(PbC7XrR1y4$rC ze~j2IO+v)7|8i<>u=)H2-j&0G^b0Sr!F9n6tdE*QuXVCQG0aji}hqX z2Y)3Jr+oQY7?h6oa~>l~@(EOX2q2Nr)X{0Ju{@ zDuVRyOo`aR>SX9%1z1p=VMu46t9G4TdZ8tsFCn@Mx+#HfJs(C|1a3u|5LNKs48JY$O_Z-s)FDV zdf5|p?Je0hY3=uAeNun7DFoja6`mB)S=gRf%98NGhxP%(;|*h7EK@2&g5kSR9G*~| z&e|o*Jqk&wY$U>jWn|kY-v|Z|FK79!B~_9i>GS?8da6LaA(#{8AqxQq11tOj{q3h&o##FE{^wHsY7J~`htkqBgQms-ZyzJ zsLlSXrMHHSKtqyd7hmQX>HWdb_cwm>#tS3=Mg$@Lk`1!^GM5spMCrx4djQfA?*jMx zy{iGWD?`HL3zSrK;4-ap1pY;go2)&5i}X%|ygc)n%3fR%7udJu3~jTm`tIY$3N2{A zVK(tJeo=e+`crCtJgP6&z0E>!D%KEYm7XF|7|6*b!Y(`5prdMQ8e3^wJ4eZqLWr3w zwI`&6O44eVzH;o&77p=D9b_11Jx3oI?g&dZm&rc<^g%wyntB~{OP0<{*0wghuNtT! zDOQ>lG9RJwt);Jbh?Gim&IdFcv9*eXd9e{IVBxpgILnpaaAl5XKVfES&-Zw9m2bCl z;uz3S**VeL_&#WEtQDV?Rawtlu%@gQU&OyWCB9l7bk)3ir*F z!9&)dG}6ogYX%7Kqfk-w=Wk~B#uk-jdL{|1M_W!@Y4qP*NRBiRM4H|2D6}i=bXu)b znp|Jd^3C_6e?((_pm^1FC>Qkxp3#2aP*zE{ThBJV$#!pp_teGC1G5LSBK%pk!iC>T zh36JYFRL;!J492MXGh2+W|JStJ2dEik5WAt0W|8GY_hfBR_7;G!CHHI77Xk8_62EU zrG?1bR813^rBfA#A)~QhD9F(}(*rGGX+)G+BW)G}DAV5Ro&$n0O#}bUvpzeis7f_o zCaj_UYr$YLY+|_iJ)gS`MEIU{7bqH}%q;{R8zVTOZsR9(uZF#zK?y=CcAi;rGyK$& zxxsE7m2WwjLd{R@Y{xk`uF!eQ9zISMh)H^VxDTZ+hb_VyrL=;A*9TGxtLrreY~<|X zL{N8GoXQlP>K%GAdc^hDy7OSrML4!8`CBUV8kd7o8MR+zZkk}1K=ZfO+nGZ^(Q2J4 z?uR3LE{1g|rxy<4m{1N`_sN2du`j!{=sba$vD^~IHg65??Fo&)@muljuOfPB*9>qi zw98^8-!{cIt3#Um&O{fPmXlMk>FgA=_;b z9{i)&OIib(W!;jge|Q6NG0P#4RYQCo7*odx(3$f`@+GE0^G1{@o{JWwV{J-+5}q78 z8c$3*^MzKdn4N1J`X-h2&ARMvPDbK!>>eS}Ns{G@5xE<8hWB))C9yBK?kkeN*3?zR z^WHkq$rt{YE}7L{c6S0BpOOx)jANe3_C}w-Sw+R0eu-ItbDRY@$A4@^{BKvp|1pqO z3ggj$_!poRagqd#snJzW{Gu@bTITm4JkxbTUwOi14GOb7!W z&Y_;}BTX$|B|dOQU(BAJ#rzjqP$xK+#H6==jrn9$_gIVT=ebp@-*1_Z)tLp*5^31oFngaCYde~AUNzNw!}ZxI&X4KB+)+5t zi?d(GZjZR;CM&7aCVnOBj6iZHb#NgTSMxIzEY+N)CK&|Kt`E<91;^S*!l6&vHxA0! zRX=w4^xzrK-}6nJX_VFEQkvPtVEkk~ub)(5ZNB^pWyU=`gdK{Qx3MyFFyeByF*E$Z3H6`TM;_SW zIR>Bx4!HjUJpM^}G`6v~(sOh)vj1}}s#G=s-MV0Wu624tu;Wq6pkchkyU|cMHS7AX zYQfq=s(p<#qMb}6f{9os-Cwpv#6P6#QA1wxs-(i-;@;vEh2$u#c2Tbs0WD#A;N+{I zQbBs%E_kG9WCE8tK#g~_)vFcI9Oli!AF(O!&`T_vi9_JIXz^SvgW|hyFLS7Bp2LOM zLo8gmfjp6{^{K_>RekH!M;?lhMU`)^#;vMvil0Af|Y!bf#|f^{^_al9c8Ko;xJ!2qff>gb;c_pG;1xLb zNXv`8iu|hH%;I1aQ$lOMzmq=X9A7m%4`}o#j?~wG6~EVjLEN!G)hH?vsbF&%Y}M*9 zDX!9eS=^=AoOnEQyrzJkMdP2SfdrF;_^PVsn%u2Qmsb7@p-ib{W zju5o)u@!>kAxLsJDCCR|q4j~dUB^ha6kNfcCZLZ#sQXV6xJnuhF$5DaD7u~VCJRZUU`isEx z&1-R!$jVA+V$Qtk?H1ZVYqo7NU%&}ho0pW?tM0gShrk#=?}D&FiC}5@pTsC6v_7bi zwz-KUf~q4p!To&L&JOpmpLjCE#~d2@;=w*O6tgaDU2h~tnJ7IEHTVe*`TA?yhs{*Y09nXEy3UV)EFu{06n1<~vF`iTv?`IKfpRIYuN+YZ^&sU|>jswkV zE8`&r>s6N+Z&f2y`6}U7v%P*zis@DVbxC3r$ugndpS+FX!F2j-`*gSu0?s`ed&Dt9 z0Ansf^vnN*T){OgmoJJve?hs0EWRANW%(_t2Hw%cb~(sdQLmkO?W20u!O7HFGpn^E z2Pv&oihH2r#<=hTPLw$`ANA)Lr8usUjfPBgq*InoO6{x?gEKSLt#wF3e%>tGRz-tx zK=!6%kC~Q&NAHZ!Cwur|tUb6*;CbvXyHaXptQT2&xFg)mo1uCR;j1W(Z7*^gNeH(2mqi$4gf0tF#`72 zjr(7@w75xWV0skcr#qBwq)@;2n}VT}KGaz^KaNf#tl;%gD-nX*T`O=QK?2jgVkw)~ zto8Y5umG5^6G^T}7^E%9L3rkrieRMJWJ@g-i{4hD8R26^BBhF$6FIgdPr3T>*j!= z7qKr`1H*kG7<0bM{5WSwmGC34?ft|iKkoiOQ!0FT75hJ(lb@NJ9vfhtIsO~6^}hl* zrhsB{%fI4{R&sm*!C{1sS5y!4IRq-QpWvKQ@WeCxc|Q)m)^}Dnuf)$*&j-eKyIe96 zNl}8t3pW(ZQZ;751ADmAVwEcsJky0x<&Mxm9}FD9Mw8*>LUjd+;b0HaD>m_F7b0e% zWN<Vn5S%V$bN>_S8^TkMIx`7$=$Qxlf{Y2@f* zSNfEs@6xnmAioYM?Bk`Tr*U@dsG=6Cy+@OT_>hGId_pVB~@~Lu-J!Z!l4B zSk7aRVc~Bvh2;90nixO#Peb`5^_1F?HJ%x`sc<^mA7Musy4*Op?@UZ=Xty|-G;v?gVb$TnFL zyck@);|7;n&H(MHR0S|>gWxpnVJ!Yhi3oK!B?K)lacHPze8shpR4EZvlepY#Tvc@1 zzNwwOA%(S)HMFFI;mpYy;PZp$NSTXIM;^;+b})jy3|r1;&W@UKljRUAJa2E-V)elZ9^ z;A*`?I_e&I$jTKL6tGdWCZ!S`7;?!0!Q2W-M&G2w5(oEL*tvjR$AW~eeKQ<&O!qPe zKPi5=5}j~WELyWD*f-+>6^IBjUgtgJ!Vsw?9ExnK3Y6}XS5NNXfa1u^p{-%GTQnkR za3!;VBHk11`4S&jHkw%Tu@Zb}WVp9SD4*tvs_Mr!g5u6b-;PGF<6r*l6&r1 zX{}45#QO4`y~Uyv`{6Wz#=r}_$>Q+@Po=%+i_o!{8i{=U9tee$85mU|<0P(VYnF*I zUvvSARA_eL$MX~GrAuD2DtsE`8F!syf;SV*fy3oV>X}zetXe+2z^F;!+e8RGx}t+>elg8d%FpQ>ksKgmbVRS#Kyj7{eix9 z&C>nZ6zDZvBV3Qy&diJ>atnKBDeg|DRvK_=8W)t@MOpgj!lqazVw?yiK`gf*Xo_p# z(X9RCl{0%Z@zT%HLh)Gmncn;%YI}aIOxdNQ)jPqEVw1*t;NezRO!8~*s5|5DB$AzO z8$e8aeE1pYC(N+o42h4{y@A=F%!==a~{XM3&+TQ?>FPbvqE%!&|lKd z6WL}FLHeI=#)hFnECz4~+5<2h|6gJRrZzSffBE%66$uA`iR(I7xhQkw3im8AY{hI& zqev*mikXWLHt0W)=a&M;`SP=><@fbq1g%73Sz*?%?{;+??~h+=;nNQ_$z1&`vW)@< zYXbytVEkuKzT4;Pa^*InNu0DP&v6LPD5lkQ$O=3c$o_sZ5MQd#%SI-UV_G~mt1GT7 z(+3p}B1eG?L-5{z+jUU{(FV)K%cdMlgV_Zmq}dBo^sj$F`2Q$-$M8&-r42N;ZQGtq zY}=mLwr$(i#OB1A*tV02IWgzF3;XQ7)^*Oe_Wn`V^SAox?yBmlyY7N{=zT)Ximgr+ zP=&$(F<8IR|D>>v2k#v+4a3k?f^`*jziQ4#Vn|Uhr(EG}nc1{SijM<+}@iX;5A z*xA3W;CUxeBV;$tgB+&_n?2Tsvd^ljH4%AE5Q2KOR@2m<@oUARIaRrv!9ho}SeP^L zH3CZQyQ>CG$fmphbm|Ak;GB5D)H8~6H$#)eYquOHMj)}dc)SGsO>(2l%!AgF`Ll|qvj-0N21^5U-&;2v{1A9XZDyh?*Ml+XE+d{#(Pnt- z6~q>M#4`9|xNu~szCTeVzSutv_LO~dNt0)XeF{YHBN`U3xMR^bN$klni=K-!VyPuMjFM%8iG{E1G^T*-POvddkW$NnCd_) z;<++^+4McZ$);GJm$TisYkQeG!ExiY6DnD>qQ<+B54z~EcOi+8r*4t5#ZeX~#Hx^3 zR=cE1n1vUn^P&af*Y@pt(jZBkWGx+m4V2M}LqCChTap*mhZ$5y1IZdk-$KWzkh*aQ zUFx;Jc5bgX)UDLP*pHIeoKt=?OW~5rWYTRDxHF`~@j*-Mr)7O`{^xw1N3@rgiYk?d zvpQ=vwl+8W&mrxXab*J$jXw&Z)aENvhp|dT@+U=D7_Gj!IXn1XLUD#=1xmWF5rH<( z;?EvoD_BUQkW;^hGH)35H{&arIyS~mW1++BC$u^;Qz<8Ov#WSePz2PYKCNG`eQmYs z+5WyJb?DtC+E|)8i1P{_NlX> zWR3|d=xEi}w>=VQA0kF}eC7I}-)R3O{y0^RcQ{bZZsCylsaItI%#-ol-M~9b3~S=1 z6b8$rcgraMROci{HK|2xP8SrU%q!P@NM+nZ zMKa%m*7c_i3l`bM z`kl$(`v{t}MmF)r(|Htm^)Gsb6=5xo*)|Ayuiz!i`L8+OFB1YbQ(mmlo8(s9^eOh)IFmkz)gGgIrQI-~x-8@M z8*cxsxir;t-S7L`YXy76^u`fjxn}@E1CamU4A*bmZNI-(ER6p!Ybi1HF#QT}qHaAT z+O!fK%Zh1JzI~*lw7_3TEMN-nwzVs2z?Z!cj-))&Av<>sGfn)l8?*x|EVO3zr=dNn zrXYQ737EH%SPvwb2hjR$6Ot2?I@3KXW~DU4KGyoM7`U>5TAd%eI6r#z?uz6-+#LTN zdbW!`I|4#aNVNYxM+PWunz;WScMfXk+N~3z`ApXecv#>NzqXGqT?(hP@Kz;pSs>0A zqu_EkacKBw87qFgGU#*1$Jw3*<%E&pA>h?bcVT9wq{QRMA}b!NNfD!u6;sWMq75#z zFdmW~N@(Bl&B|OOiYPW&c`(=OcLF(2H={0{+4Yt?i&tCU`j_05=35LqO!9u!`$c5U zKL~>}Be~qdS|TY(CVE{RO|TY=!t>6d@;iPkhwTJ+J%nK^U%fo9zTeB4*%S6FQV^~8Qd=xv@^__=;MWmdg; zhwtHWY9{5Ts-DV<2`-o%j=bXQb?eDL%8_N&naE0_xblpJQU}%*(L_ZKE5Lm}U^o^K z(6e!{S-F+(Vu*DhqpQjm9hEAwu=iZr^M8tR>}R-dO2N$9?jHUU_r-kV0`KW@gm9Yd zTW@c#-x76Gi(SiA7T!tC{w7^RiM2!VDgs^Q)X>CFnS(LYv$5@y6F#^PxA+zjh0ZVE zrOh)Z!p*V*L&}u;?fJEvT@&rjeSRArZ*@vPJe91Vw&S~+>>R2g1bkUD9l~B?s`YkR zIN4Id`sQciB(p$nqlOvpCR`V4ar;FIIDXyW@_bx^3&jnvyLS5_o44E;y>p?Zye*KG zAtNAR+zzZe16X}r8$Ro`m4P5cA=Fo9$C>5+wkUt6kKvfz=~aA4f=3f?Jg+6bLo75% z01-7O9`{lAj`sP)sk}b0wXXYE(2!}!bQnd8T4n(ecwy^um?YC(N_7{YLy1KkV<5aH zgYOh%f=beN#i*`E&vtf1t&rL?O{q*6dRD=c@bn&3tG-YGHj<2fkkvn$w5vE=7_A_Y z2L`*qOKMi>OloqE)67$ou{Yj?E-}zVL5n;_xinFWnyEdqwx&j`G`$_EPngP!_*3vV z*u#&M4!YSM=cG^wq?U*pzfB4XNTe3z?H*fYt`|(#!E!%c?OzZHn`uiQKORNBkZip0 zj=y~7F^4O;LSPmyZyhfBxX)5v2I{}m_!P{9FS48~{hG#3xohA|jtA_v#r#CLW$dE! z2%yNN8RzW=^**IXGx557&?r@S&7Qt2II3YW93yqL8|JF;!MefP?5K}T2p5ugSf}hG zrwzLQ%0}u^Fxk=_Auyu2l>~q3VUF-Ru5or8UXT-1gn2$xSgCmtWAso43hu4 z#DC&Q%G3Zz5^1_gYDEb;H7bVk2}#)-`7tS32E{T}3EHt~RfXmGX-L>IZKo2$S!IRf zJiTNso#d}h?bffL4s~nKuJldN*f4G zvGwqe3IQ4r2oMyIK+O`=BXb^Y3qX}TK*arz>in7g__sPPQ@;_*AwleHemxFF7^?{i zGGOWpR;Ri^fpt(pRAn;k#5@;TC=nl$smiS|v{Y$W zEfz+oX%fsj$9S^FhDoV3OOp#Ad$N@p)(jN(o$$@zVBeBVzi0SJ!0IOBO}OB3oO_rS zVhwC24Bp^A)8_@t1CeyBuo@BLhhVK|(qmOw1V_aOzvr{H7%}WoEwGZhwshZt!D#+8 zDVW?nY~1SpH~Zg<(KZkW$o*sk8oB>*+SKpGiGQ!ZSyeV}4Zy~5RhzyJA@Us`iQc4{ zW=^VlZA-0k441nv(MY@nRQlxOF*fH)Ktrop2jqL!CssSY{&^V-SaFR?HuA)N+5xQ+ zd)(0ZGN#QbJNEz_Q0BUX)RT0P2{sA6bsT%y=ZJ`^0$vl|K;aGA9F!9Z6Q;6Hf47qiS5Mvb`F2B$)s7NWxq7ddQHbPedgFJU`6w`{Cx1Q&!t|q^ODD2DHk{dm5Su<+es{_7MGP!h5XmF2oo>0`>t=Y zqW%|J7P1IYeA7SS3u~oTci^L!8LrPmPfNWRD{R{u|jQ) zxL@}lN_+KuOsDb^E7hB_(wv;&uWOe5yG#jqH)6)gKBpETVp3xG3NlbfwHr76JmNOY z*sdpR(P4D6J596qQNP48WL9v{BU}H@--g_n`7x0Y<%Ini&o#qY%!J5Nx=?R!{CU#u zuh!7;L0(Dt(~*??rM^YBdC{=q4itZT`S+@J^Ql@RRwZFTH&= zcd_q!8Vh$!{e09ZQb^KebL|H|h1%bX56KOuPbQ9O0-K@c5>n=ToV;2`ognKdY;2K( zeiWZ}X5SooTvvZSWZkpX&DdF01Y!&J@qVVN^2lV)uz5S|S2(tb zU8S7pyqWoRryr^BLD;4BFe8l>(HZKzwrLZU^CkA5_tEOoWSnpRbvt%}!3PBZ+hGCN zj{oJ&|L>h~NfeX^B}NLl`hcc3p8E9k20 z93Gzd3Dk|Rq`!OY|6bSbTD>Buv5Tod&vTu0f2dCiX>Y&i8y$1LoNrG|8Sj|QM=@J#Gd%|(NT#82 zsUE4!kvE^@*&)1~oB;owJ{DND%Ci&T?7sXr&hF3j(!cj2L_rod==afrj!vK%Zs-Qw zaITq~YGGyIunL(%Mv zD|lFgWZQSo?^`#&^7^+J1lc~))fn&}(g5<0X|_LuCTk0)zkqJ3%IPFjukS|b7;fk! zCspfI!xUj)mjo=It&f*d) zqXFTD0mi14_mrbN^F{DtNkwe;O z5`wVzc{)gns2|=ut1W|g?P}B2rhXt1#W@o1fsRCrK z?;34}nsz^RGzZc8WR44CdNr!cICC&}Fho(gorl5djgk{|~$r zfWz6s)a1`|$R5p%5KM$7;w8tNgTF4^((nL=3rn(nkLeF=$QIgBSyr1dabU7CNo;y< z9^^EnjTX(!$)@BR>SfuK->l`41)X!lqcrwph{@^ERGjO3V^kUMX#DGH@s(biRmRw* zc?=(RaGJ27i!I>&EiJ z0LGPyx#bCIuaU2w)jLxa-@y%~2KBW>9taQ}T%x~!6@ucsxl^F|vS%MCAuSIFvXb&J58#CvqbbI%99nN zO4gT96W-hd#vRBa`_%YLR)xbujJvwRfGnZD-K6Q|U)RW~U67#%a9eor|HYmAk5&D7 z=PuM_?Qocpx&Zy0DjmY@nDl`oINi1x0QaMAl&};Uf8RlaNLvbb2Hl{Q`qUfLZ%6F+X zz`@1av?LG;gBM;b40`RQE8oLG+{m%OQ{v|331kSR6p6`7-JSSBP1JR2Lw0wVkid=O znJ1a^#3`?P;0fnH&KMt|byV@&Ua+o+&h{i5v<{G?cXFd-bTQ7NFXz zNO)Gz8_}9)Pg|+V$Oh8Hu*OTkjS~Foa9)pspfoEursd)1t3qXy`<%|-Q@bfcqIbRY z4AS=GqZh#(f+LEf4625TTbOS@fB!agZNs;o(r-D9TaN%wFRte{+9b6$q3FJ{8nyca z1A~@MS<5iesiKJ}LqvrQVzM2uhl{c>40Ee8eIJasvz#zt$Ih*%MgV8|f ztBt9G8-LJIf2gAlr>QtzlyA16#SzO0c&mpTKD{1?Z@Y2-!sXsJd~Y0a7+&k9Rpzu_ z&w6^ncun0)$sD4c$#GQ=@(aUFfi)eSmlfy(l6r~CHbn6|>27I4=gJhqFovEeD@_hA zK?*;z)EQvHzS5f+ez9&BaM^M#F)zwTEWsLuu5F5K3gMr%y(}6HLWMi3YiMDfA2sgM zqipB{Lv5NRQ{xmI8*<>GaMeozFm%v>adO-4=FhkF{Pn8Ry4M!}mQj!d$UlzN`D+T~ zKe}B1-AnUF284D}ngK9xLis=QAhRR#V+~3Y6O{{!BXZSrEv+D97$%1$;=`8x=}S6) z^V+AUp`e!lmGA*?>;DeFV)rM0MNw876kt05rF_qFhPL)rnm~eqASjsJ`SWv*c+>ug z;5EN1k?Jx`#69}XPWhqFkVny|EQkL2VS$eIBW!yh8zx6D-9ZF3K2icK))rw#2Y>;m z9$;eC*@CU+^5v2-Yb(>|(h(jlc~tsJYp^Q7T8cahbi-dyIj_|^X!f9gk5FoqWI*$(CRKCIcz9>nhFHWr$ zHZ)0SaTDM7xUp5jcMr@AnyP1xXE>RXby;M`T|@A%tu)D%YYSv7TLMe?MXa_a zWZ&5f#T6(7OCCU3r9YophWkC&Q`jJ}=#^|x3$pAU7F>X89sPXi0I~5>$EpH$R9_{r zpF`o0Jz-7UXvJU$Cz?3cJ~0;7QEj$um_DPY@lZA1@V`y61 z{Q!C~07KIFDXWq0$ZQruv&7`gxE9Mh3#%LX#cSn&;K>BQ*C%LD%L*NJ-Z zch|ktmPAZX2Q5=}oZ42b4s47`7aEI?`WT~DOqmj=&>1OaOdXBk5q5lS)iYjAVh1N; zhMRA!IH0;?=MKx7#j4$^JQ}3LEJ23ZLEk_*y{^`GLmH`mra0$q7w$NEL_cOXac^lU zCSUZw6XS~QC;3M{?YVQRH?caeP^P}<^c@M@a8JLEx>nnyjPY*2AD*8Yjn8MA-EK7X z9Zsq7&mKpnwMV@Ez4YT_`12hM4lve>=YMOE{^R)mesC{vS8dn19(cb9-Vw`j%LQhL zQ@T*-UgqfBaR{DHMIrY#$P9O;h$2#(31<1_IkhDvb{c0iLuhg9Om*KV7~XDXJRLZ}lM)D*zorQKYV0exMaZXI&`RBXA zh`99RAEc3V@O@E>G7;TMyy6Dq`_7UzPmqwJ|KnaY&iKds?38flg$j@9@~gZVW=8y7 z5t2?eBh8TX2@suqso6&_A}#QTWLz2j9^5Z3$0QvCx5i8?-uL{TWBl*Wj-LsY6-hyr9(jw-IOJAoocK6y@mHJ<6u4~=B80p}hZwb>1oAwWd)hU6W9 z_CjXzb{XxMOodl~uu}6dM8D@Xlvrt&a0P9CC-zt+HJXCWOgVtmOhx4~APg6gDYl2kS3dEj;{9hcVm<~~fuRFqK%5%GFT zQ6<2&W#1&OaD^|PxLFICEc#Lq_KlWZNTdKe{>ce9o%jl9Y4+{AQ6=h)s_8PDOD%L# z6iG)<@h=S)K}t$FQTA-L!t%MU$T0otfXa3F@OA2TaH<*yfAVVIfa|*exkeMk5Hjk> z`|EA5faW*z`d()vN0+%l!xj3$FedVy(dM~05peYi?5 zHx%Coz4X*}WQReo*mOWaocLjWWC$#7`wZ^vW_{v5fX61)oet{2RX@@`UI?qlI7EP>>P{*-*Kis6;E!^ zukGknLLDPe2TB|z4N5c9G+-&{iAi`QOX-$%0=q)jxEz8gyqXAAAfv@PBqQ08G@wFM zrX1mND7p$HPiAv)Ki>`4%3sGJPGMA44XZY0peDz@vtjX1f&uqBt!}ci+=5j%Gc8nA zESNJ`BvA9PwgAc4CdG;yl$4U9tU1P=vqMtgUXpOh6kjgyIRtXaRg2C7({LqDm%jj? zWV#mSrz>s8xAD(}B3~z^lkNwO9>a$?k4b-mVQX3llYqSbb`9Oc(CnQG4Wvpt z0Bl)}vdo=KzIO!wncOjSqT~L8ecocW!;URN+j8LrC_U z{sarAj3#EgiKxMT`ldq}Yt2w2brwAD{1>F2w)di3wwojd^tQ!8ae5UmNt5aLO(5Owy!G>x;)u>Y0 z9_$xBOf2k6+ORTctsTqDg1?D)6)jKs_U63Pp`RxB2Oh)#)$gQ)ggaX?u-w@m>hl9Rl&M3_xKLRc%<-2me7;>avrI}e^R^g0-NR`;U3J*L-HK2*oxd1`5 zQ-)qPCeMqzaX4`?zTg{Eq5?RCR>LqxQNEi;ee!u|jnK^v!#FJyH&h`7p`_*YB=IT{ z$ypJ#bMsB74)jORRML#62HG7$@kvnw*vcY(2#7?1^dJEp&q)GXHl?}mboXq&hOpV} z4R6U>9H;^tSa_o#Lz%XlqM~A9QT~-DJ}3CGV~yg6W*?FHxa!``jti0amu&>-OHP;Y z2aYk)+N^W^DH=+AbW&DDLsw;TOH;6@@cz0@I&JxBF}<>J3c<<}|0l7bM@2<+F2CF# ztY4~bJN4&5)kBS@cY24-OQ8m#m~}BYQin_^Q)LzGrNcu@f*U>{Fm^IjM+wmy=qOCY zJ9-`A0vt<|6x!2=xu~AK$f|aswCpgeDj`4o=8pZuvp*eOW}-HpCBnXxWY+!sn)B85 zLoP1tzV=ra?(!`}s12Y)spoxSUGP=-SZhSf1%e6Y_=+lKfT+tCe3GI9Bnq7uQVpA| z7F|m%M>R#Txs!N;CW(9QJbv~A&+J3y?(vJ5Zq?7k&+NN*FCl7WASneqxD7xaCe*VL zXDQV%Pwe0+u(~k%(hI}qu7p*aU4u8}J&W*mq0EX2D3LXO8 zX+W$O&S`eA>0*T~<0S;KwScFzG(bq_n0$(^Y-ro#qr<*K$~+($FPAAwEI@xcapr~} zZBsDe;qYV2;Zi9yIHpC4xU}_|7}D96#JPy;Z%iTf2^M3Q0!?UWl3AX@DH*m$O1|95 z@~o}~XF^YInF;uorD82N-w%o zpDZs;G@$uoIMDFIk8jau+<*z3RQ=Ld-ysD!b7p*R`2v4zuE8xh*Gh&t2TXirzr3p+{aj=m&HwdvO>q* z!g!+4&sVlunHpYxy{7rFOx@B_X<8G9;;R;P-CsXqavbz*@U>jT=ay9d>dPt~VfzI~ z_Is0R{oMe@111$le&Q`8@)vE9jIGS~cBY+K(EhoJmcc#@7~e_9LM`pnCg5_y+xYX{ zKp&ZK_?cv4gM`Ko+!7yk_A?X>%t584^*ACWH5k>p?cqD^xi<2jB&%W`nHB`jSNL1&9U;Vgds>3Zb#ATs%)MMv;ksfGY>Kc!?Dwr`SQ z9#w%2vJG8<8m=b;vQ6RoQNk?1Sqo`pFd`y;pDADzkTo&jHo^*`1`MskOxoI;fFdK!E`N(fA=rt@5r6UxLT52m;UaB)PuR|)l{jua}O>EJ44eBB(tC%+p$yip! z1xqXBJ-w;sw5B5Z-+BgeE+@WV@p3QM?Sy_%KFqy0L5$&4TUCGfI` zJQx0~G!Oa1kGX&No9~B`JFZaPS2AC=q2X*oy|?t4C4twpY`i66yKd%H4rgn!p7BY} zF7JuY&n0o+8B4#L^={gAMlCI?j=nF(wTWY2DcKE{)HXe*p;*<{hbVu&N%o>-_RyWw zX$Ve_ZWz8UTW4%0zv?G%8i?B8E~eP#cgJc2=4&mmPz1|Btab0)epxr?yZz7@n~Yq8859UrrbD>q<92-o+d0 zUy~ZQy+DIVfczsDpdsKNOBD7dj=why+8X`QlaZpPZMVjR=6hAkc}gHf3vo45Us$93 z^`4^10#Q{}#t{l57JpTa(en9a~zaNUJxUAZF?#!<**MmK4i6LI$q2@lLtt!!z!bKZB(k?Xc4} z^pvDt-#WYl$H|9&A(1JoBsetzpne0*c>Du|WEhC$#{gYon#GxB3qDQddKAntPlJ>jPJ}bA zr1Lmfw;DE{7ZAp9-;BkPJC8r*pmaMaYx|Jg_v4i+`pTFGv_aPwwM=IWgEDt|>2Xqb zI<6n7@U7om9KtiIr<%${ukYpM-mr3d+fhJBVKwR9dx06MX&#qH?gRM+k|oS=Y--4V z6sV5D=YBI5?^{PSp{gSxoJTLNcMaO$j4c;y7yCh|9FZDp!AJWm2GNxYS_2o4bU}v4$~)$Hiq+T^)n)E$3I|o*;DR zY^>HTZGejqtkvVi>ySyLymOiweFzJ%*c*%bP@q982h1ZPuYXjU!~ru7Vb$S9|81bM zhn^||^1GWu@L_Qrd!-uoMqvJ+T*4PMhst5RMY-(O#p|8FjoF3R8w3i61Oke~``@b4 z_Lfd|f7G9TXnwH+AkqDl!fjYTdg&ahp^?3P3V}5jC zEHD3zeRiXbtdgDvyaG)yBR(8D+tLS>R(Oy-XrEgs3M6euv0LCVnfZI0p<%@7w3PHX zm3$7AyMYKWoI?2{orDmplu{E_y-tE7vRC0QS~Nw|oiSq>@H$8r*ab%7o35fHhS+kW z+il*xt(F<-2DMEB)R$~?o9WpY^y~~|J8k+Y(pYLV5K&5; zB@LNfJwV)54ky$^oa=?`TS)rN>z|>0aKG3$q5Z%i*FbhLS7pAA4#+eWNx4xc?*(3K zQ2RkXtMxVJf_o_+yO8`?R(18s$?}5>Y(hb$gAt@yYzqEx@DwNK4%smnd zn98_9NmwaUm>sB@ zKwdJG_E2v2#&KJ$b`*39b}8SdUgMZ2A4M_>B4EB8L6AJj!YE3qT~v$mj?1Y{-x0Upk0cY5dmEB z^=YcBYd{irCkaG5Yn)b3$FkZcsL^In2H`y96v5_n-3}25EF=OEWEegQEW0d{yfT$X z456p9&C6m_E;}MmgRW7o0*3jZJMZpg@qBz&$kI&nXn@{CvLn<|^Mh>!^)hjZ_SloS zlN^)Y<9F3@am_*0YAq%$@uFJ0U}D^2u(AB6%<@8hX!qLyi!i~H#N(Dh%DK4h@2x(L zo2|HeStFgIt;dvc^8B2#<$PqOp2p8PyNmYAn|?A3j%b zdRA8in81@Qy-QbT9eD6?8>|kwR&y+}SuFG3bMRK+eVYrY%i;$QGKAH-d3Z)6Y0!e8+J0rmt1&?-Yz)T^5^xLc0C~;`VFXerq1J#9T~;tE$?_ zy|sdolZzwzrG&>NC{KHtn{eSynL+Lm}k4x-f&R4mE94Dd)De|`JN+!;R`7iX1N1E0LbA~pXOG;Ubjd2_n32+3nu(^*K zE{O;xeWqqQfGn6qA|`dgfS&=+zS!owVB}|%XG<@n<|GH(7=l@BP#g&?C|CQGpc`TP zsOeU8SqU=&X?zUTMiZjT3!i5Xoxx8`ifltfl&@Yj)Uawx)mlu}RC~eDpY9~@Gkza@ zFN%8Sh5SkKgMjy;QViR5hbNeH=3@w|NReWL@&+H0{T zCzH_YWiJ^1ysj#dn?;41wQsHut?`8e?5MA*XlQ|8qB4<{ueekM%W_eTJ!cE0FHVJm&*{re7k#itWZUOm*O?xSza~cU+0}xGZ3K_+@ zY=OP*og?>3u@~vh&AwkUEz?BL6VxI$$$|V3O}`8dBT7>bDfy5`UMp zSDfRPeT4zFnDwpM=z97a6naw=9L5iTBiRRp&Hr2n`~z8RZ|!1cVf#BC;m^u_h_b9a z0Flu3sD98QE41E)pM|s!1i}%(DT^nRWGkqP`uPNm=KZQoa?SZX2(Mz~YSnkjX;4m* zshFfPZ21Rkxg><6IK=*q2wJGHm~suIBpH{Mo~?*r8O7s=CyPlTU3kW!wnN@M74?3d zir9!yl9iGuSe((R$A+3tPZD8XL0*{@9c(ch^DKl&y=39qvJH)4mqN6nFeV7dJjAo_ zBKvbZ%TbfP1O@RAzaUxK;VZJw`3rbcXpX`gOcdw#P~5zelH_c>*@gFBbHHV1#yX0P zIfStaVHw}YcNU&%@Wwxj8M53sa|iy(Km+-{ocz*bTNzg^QwrBwr&&Wz7JspKw84bqLgBe=Vb(| z5^2>pWo@QVPbOP?izH=RV=VH%r*+x;jX}l|(sbCVZn;9%EzVoq+lMMg#Kz3}e*b3o zab)-BVBux14*H^=XRu5On+&VfS(sbAPYd+7FB{uLORB-d{=$Hy@PQf^PKuN zH57Sto$!FT7cZw*<|qjnRyCD75kj#b1FX&CJ**U zb0BsI@T?yCj9cu~dLJ4k1jsLe$w@H?+wJGVPyPGijAoQN-@1#i=hJ~IWsG`Cfqm`knLsW=bf zzds(!D_Gf5aX|cp-JE{58a!Be?%7D={qp`dYw{G2Y$6A+B-Vfj`2RwC{GZ29b^SNa zN1tu=V|v{Lu9b&W4Ej*#UadQnDj(WN!TMv37&_?0Y}jufuT+|2-WK181Pl{M5D`a> z^ejy9Jjhv9RaIDiioq1ou#7cGZsEnq@!uTWE0-^Jx#~y)`tHucUOW6SDP9I?Rv&y- zGLPsXkMd@LTlxZ|AxrZ=$G4ZI=?wKA+@to%>pAwpjYL_n@$=?EfMOL*baj>_V(M>B z0J-?Bo)?$L(sqNDsfO+yiJG2ev|IBBrfS**S+ORW@Mu9`I`}i2B zbu47NSrS;Z%CTN-(OoD#!jmQuFccd&@p(nA*S-W7sWpU}+Lg@qak1p05tH7XK$N&c zG5J}HGR_ytYg9H;=p!Dd4^0Oos$+yaDj}9r+SjPCsqq3sy?Lm?<+y0E}~LG(iSj*CeRXSc`ZQT;~TraS=La7al{M!i_d8;on|z)@8s1SI{* zK$?~w$jHlt0JZOjC0^KwP;IUpAYf{aHSf-FUN(Xqb z8WdCQ-HNt^`w|$sWR&d+h-<9AeU1I)z*}Tk8aijBYDH{KI~%R^LQcZ$O#*1;pX9HZ zK4+%pLQUH!f2W+gO`HPm0ibJsbNGO|`~QMLw0AUdcJ`pRcLX3Se|Hlu@slus#`)kY zpUBUe;Im#)?h1&3`d^5bs=?;Std;5(x;vOZRLjP5P1BxD)t8p)#KQtdUt9FcyEv)W zm~qA8B4uNo>or0VNcW_Y4^r>2I@sjBt)R2M^Ih7NG)gszpOwra&^kj4Cg}E0h1{uBJ{Gs2$C;vC#VtF{&iw59_I057zS^xivhO&3GGjlX? z`U8bDK0*H*w{V%-H6s-O2SvN22sJe!JuT@XMW^(yt}FSe(FJ;{F?mKQdIq)DL#b*Y zE6IO#kOA;h5EiQb)UzXDSSEJhtSa*`1{Lg>e*;Nbl$ynt0=BRbU}^u^!CPChxW9M>|CglKtpYAK==r%GD|7ppJ{$@&~PN1nv>perSje6OJLZ8RjM@lV{1!13h z_T1+W>t-$0y1+09P@`&8j_XYMT6?yoeuRM8*$%XrFlT{lcd4B_`8{rT!C+x2V%y}k zEa#Dqj?C=BwM@0efifJ_GrS^V!bQ(63=-8{Y9z`&>5=LhWM3ZU_ILte8lP*$fGP;> z9Gh?30y5TbzU%73+a8K4gMym0?n7TznZ!nrHK~L!3NcX3I)PE%z1ffjwWWuls5CZb z*g?vCkAO>%bMX^IFCYtz@st?u_&V@^YFvOwSvWAkGwgh#%Z{~s??dIbc{M_7#=u-Z zl`jeHg`}N9k%u`z4m7>!wFU^RbtJXzf!FlO3)|MW zVJB@`T{f{l(84&R-pGoOn(#4g-_kL(qf}>qUJ5_MrlRAH9-F_P2>y^}O8RtQRO%Y|dAuu;pODmiyUPGF0!EC5Z+|h(FifC{H_ce6+r91^Aw%9} z&lmj}rih+jLhql?dj6W(c6})rZ~+|7-@wmo0Qo=B!@qY*JDM06(>pu;$IL6-SZO9{rH3P5Bq! zc%zbjAeFZW3r`Qqpk4Jrd88g!ffU6rxf@k%6@9Ch;dYOK?G6_Dif-o>-2<%7^_FKh zkx133z=bf0`PXImAw*O61Jo}BoL<_0TE_2fbN??Fv`^glZ}vv?@jY_&SzxV87p9Q5 zk00u!7;H@@Jwr^g0UGL3}-0@hKJshSql{_e@d-= zFU4hqc2Pt>(=zNQv-0S7jhdN^8pXO8MOQU8Hrtv_kQ_~Xv#XjR{Fmn+I9am5hItx z45&{bl%Yx{o5*4Vg}R=0SX8xgD<`=wy+_0MmnI7xYJIvt2+s<^#O+%h7Q~2Q%TO|B z)-FLCyC&z3`)j|$B6niggPVQvS2j&(hQNndreqFa&+Bg+XZn!|rYBlKPL91PhiQwh zz+cDje}2F>5WH&QP^aQ+qasaQNf8-Q! z0ys4bTeCkQq{*^&fXFlS>K&b@2K@A#lMJe*W-=819V@kIIW_fIq?!a9C4~X&VOxAu zE|aY{6dwaD+$iJVm5)r8UyBgSeG^3{Vztd9nE8zdo+&@E&VA!(tvI_a1$v8qlzGE|NkbdQ76I6H zim}K08-GuGXV|Y$g)XZ>pgi;YBlN5PI(q&Ss)uL^SStd@F7VR+AAeBQjJAleoo+=iqGSS=Z_0n2p z(md!?$_-#~lHpuDQ&aAhK5U_U1LbC=UND5@!7M@YF00BDHlpiV^6+8Jf+HUiiMJzK z_{zsE^0fdHl)|VE1EY<^o}kP^!Y0M7qBt@cNwZ(r5J5#&=MuXK4TmuGIC&z>-z(9K z_DPO;RY{7}2qTb|twrSSn85J>w5e|#y!Lh@dHraM-Sh)!%y5IF;8vM!8O)b_FM8=9 zU(ZcZWx;!0epLzrTV@|jCr!INfe3rCY5W8=!=D#Ag_zlm}4w2><0=^WH zo^G{g8h3-b+_tTbb8d8pii`i9E**}nHFy|sY0?0e;h$47f4Fyp-$_;(oh)qZ|D>4n ziS7Gs#)-()b7U7Xnabs^|Js*)H{(4?tI->+Ef*l-4}97gf2C$GEkOT-?y|U?6sD)$ zqQetY;G)ql9`Tu!Zv(vaTT5Yv^c?7Nr24ZN=P6otBIZXg#}30#l%jP%=Oof1$IPj% z^~OFG;UwWk2R`IX|9mg1FI3f76Hfwfw)$+1iz3V5O^=JSvWlHMrda&NJMe(uK03o% zG3kyl%}AFd^GDpiGMl*e)=JDOb_304I5(?TG|<>BaI_!2=LY>MKGn8=wJVeIY2Ck# z)xiW@@ZYF$|4%pgXPox0Ut@1!Yx`%q%14pc3P8WN`A!>4=a4@DXcTP{F2G+SUX_B5 zbU^^oMsfSPgYt8`QiGWpS|!Q-k?&GcRI!)TASk#+EdEQ}8(X8?K3wF{g!5KHFS4E` z^Hev@P}sN+YPo%2s1D?(DzsQo4PAY<@HI9wCHqsGv%RM(HV;nac{*%sbdE{F#GKb@UkdmTy-lr`->Z zGN@pU<jV)C#a|WB6AM%`X;Et=;tY21;%SKn?lOUdO zis$;pLT4lC;=q@w*L2jQJO;RY^N&TbKH&Hw{xJ7aV$pr2U!G3u+(vJ(Q z$SC_@LmRDr$7pGs-eJwI_@X_MwXXPwZJh8Oepj}UFyNIX;7G5crzI)$v=t=`dcxr6pC zhkn4mIrB>Pb=(TxrPx0V6wra7=jekU;@t#ac!OEp=#en?H=X9icY_%oDtWW!dB&6~ z?h{SC_}FJd&FhsFsO17|i;s(xNY9Q>Vf;()g zbMHIkO;i=04BdBuqlIa2L|mNEr;a`1Oyk8Rbe0mZ8)`fnc0p@BF{Y+?-q}*f5L7XZR6d# z|Ml)A!FI{6XGiZQH{6K%={BvqgS*D_OIrVu(CmFB^1pscrqw0x?_@HJ*%T9~A3eCj zqs{~KcQ9D3p&Kd$T$OYP`fIY@|Qvln5;|;BQ{bvG-<|g_x~piZQ?1x1o6c>g~$Rr_VSv-Rqq3 zAB~~QKHVpzEYZ;NLBI8E^&sn~?}m!>@`p{kvUSzXr<7Z}Z-k|{wJXJJ$ZuBUw+%44~<$sasu{&w9CtmZ{m8WX*YPLDm9Ri)aU7O-2x3W7d6Zxj!VzS~u zSi`2EF0=AQfnoAmZQOgV3mC^{x3sL&XlF@$^z-Z=$%@NM%{>$j=_Nc}iY|GVVRG}e zcUYpdlR|LJI-BVgQ6GH-Qq3&sI|jJY>=`Nc;JN5|r-~F>{qTozurEU1y?$%cY zSsp)igQL^`3-MC%Rbuc@>K-|p{D7&#lD<~FJ8wKTu*(+RDtzIHQssz$?^dqC+-^FN zv*i(msH~v&oZ|;JI{D;+Nu;Bz@nXXY<=XQeUcbsusDnGfW)hj z8$DyO7p&F%Y(vDF{VS91Sy#TM=*`HbU*_cnIY=M)8e**&f}aI?xcba(%1YeY?e$oc zC+wLW=MU6-J~Nr21~(Z{Bcyy4kKI%Kj89ISkq)z!Ud|qZf?tj$pqn$*MO5}A9Qej| zCCT$)X|ZPK1EFu7Z;yWCYRjMxN=-A-ym4~Bu&K~h`_rd?hp~hn6lA#dIg#1D>g|xn zr%m?huGI{s-;~9pGCb8*2dagFZ)vyeW^c+$otRa|(sgIsyf`ye{dTMNoh^D*@rr#9 zKZ|G8N-rOE5A|m(xNcH`3jI*RoxmCITXtyAIVZ70R~!A4uCad5y3QKV)+1A37XVI- zZ<~EpGw|k=p!8`&D}DZ0V{5D4J#Vv4EPemXxy9(9j&G^j%woa#s)93drQIg-cQju1 zWX!}w4L)odsO`909}XMrI8D3O3}6;xCXDm_~E1hhwQtH!tHcrQ}t@DGNrOP z$fXVqY(6vAI~sB=`;DJ(3R5OW^RB?m`%AVx{2`Zdp3~jkU0Jn-!TDX&4t)lH=Pk8O zc1{d?P|j}h{fi^IFV|;bv0FEZsg;}g+t2i!yZ>-ZOSdYJJ$t2Q{hHw3Ntc21W_2eT zdSuiCT{zo$&FWNnjO!lR7}q&h@Y_Ec3*dT}bT|E+pWvd!Vd3Tbhx~pE_wro(^YXn+ z`p3?1!V(2N7H6M>vwBd5O3oc7ZA!(uanS&tulkcKx9Iff)4b_ema4ah7`4$^yvdXOtNR=luTB;!OgI`OzPu{D z{lzUNsY?3N?H}oCIL7(g-*kOg1?}hk;OJ2>11@6^?tgL}KYveWeD{DbSg&oAGnO|o zHM7{xTBlHJW?S5EO&5{c{_aD5W5mhE>5ZXsQQ%m##(RPLu9_LTnV86K`A=r^W+@d# zZt;vW>F46M+BLvyH2J9ny+{WI99D3xZkJ)$U>F(9xII-k?)8bBVarUF zE&bXvdRJNpz1DRH=+t<)EwOpCI(Ru})1_z`<_cy8wgB58R~Cn0L=M%x^Q^(d0z6&*OKsUbM<(uNf}4Fqb}1!J%VW zZnXD%jdk_m_f3{}R-+>=cU(%AmANH@4ksu$a7d4B`1Qj+jJ}>z>hWNu=AhiV;lRuwHp7{b zAfe-tk2&guH9X%KIbJZ%TylT!&We3;&Ij$A)LC{_b4NCEamMFki_?#dNmqZS3)afl zb-bI+(VKj2r%{2d>?@1poun7ZhWm9sDS7eEOm+Cnv1q#CErFaaY1^+Ezv`}^Y(1G$+@pV4 zL+)e9*1SZA*n+0DJ{=buOZnB#w|}0V8JCobDcG|cbvwCFti9_;!02-&;i%!+?HZb| zVD_$$tk{pMn->gj-1Hu8dqZX>0z>>=A!{Vk>uMVtOyy;5iAC~a*l;!SY>%E!-6n{Y zofJxS=^t1k_fmEnT82(%zp+WUXKdwZUF-003ooZ^m2EfHOD&O3&)Ri1hozGhyH|1- zx?>lb9@ajtiK1um#`Pc9A1}7r zAr_e#doDrwZ0tshRfn~*e=O7ADPev2J$feJoPS5I==)^0v`ZVDj>Q<&cL#v)pYz$c zTzR4{DQwk=K#h(0Oo3i=J>W^168>Tti3hWIhHqNT{guF`s#XVSDE~>L3_iINdf2rI)S&!s3 z=N}ffuXYe;P!+4;QoxyjShfozE?9M-IHNwQ~kyjxmOM}uXyRqsFd{nq1k z^}P(C?|w{NTH1T+Q@8s1(br8D>W8jMed_vJ*lnLYxxT2`_-nA!nj*56C+s9;)NE0tUCs{h3iv{aMTNHuzrap%h37e{ikRQ4&^ss<_Q zmSx**?0iziaOG-VEq1H-H?GoSFFNTYU#@HjZV?u4>>rEzsatAgm0|DLih4P+`b#Chhe5`I{99+ z0C@Zis2YxFI{ZQr$#gcr-@&0219Ic(TV^7Z&6yWju$DOOzi`Mui%Z3Ps4u2{>tyiI zMh_nIW3`^A8XKFFDi4-o*C&g~73tF>W*uYra`(k&w8&vtMWplPh0Wn0Os;`j5h)!L>OKUayggk| zgkz7lH!0%!NX#w0MJ;K9CS~1)p+)2DHEBA@FAdZ5#6AokFpIYB{&V<;M_nwl>cQRX zYM-TF>}md1(#AK$qbC1f!h3zIvfA;*$P=NX4UO}XzJ+o zQs71bW6Oh#&tYHEW=|!)x^l@=ZOOeWvD4MXu(l;f=1Zp$cnB+SBd6-Qwj~%vJku9) z?%8q6x%KpG)-AR2j-3Y9SgCDmDe9 z0;sQK%~wXTTwDJfbeW~)uUY%c%hoGc7h6fs)j+#pEsZ;y4XkYCsccZ$u=%>I%9>23 z)opyHXp^cm%Es*h-I2rspxak)FLY!b9NNSZ1`Z`>KAxaX3y*q~m3dSMm1?0~&cic0pLp{Tz4Vztmap14R|zxBX{T-HZux<$D_lS zoyGqj!hg8P{_#}@_YX*Cgw~(V0q6eytIpq&BrU=+h;ZBp3L;$F4~$9N6rBA6T!E9% zJp-|HE<;isS1@SS6hM9!CBtAbskAU=#(D-8HU>l*?hkQ=c*y{CE6M)xRmT|gc>bys zuADk8lsE(xiG;#8BSaqYL5*MD))4>=Q9rnGV>sf4#XMdR59JQF)wqL9B|mrIr5Bng z0Y`#AJZ_PhczxB81#7=FAD(O^HAf{)%l62FbxVN4-MB4`#0!h@{|73{+usA_Dx=kw{%-+5%~BJaYi|NxPo!J57@xrLWLh^QL`!% zgv$#MAh=Zl;)TWN2riuO;_8Mv;2kIrTKWUjo?>Um%Zwf%B^YF&HAE5M7mHc36hR99 z0mu}`{WUxip+2Iq905saH;J#38WHLvhZjhMfr&oiz-h7XJFxFN;1Re!6Y;`gp8Oja zI5(Lki1_W=M?Xz3rlZ>erX!??Z19W4Ft0+e1f^f#{vK{#XlgbD?LJMv#_ypb8keY~ zK$u`48Yr0tPL^E@Q8Ic#JW5T8dj<$x%WhmiHO5Huwu3&N}xG080?5AD`Q zLeI_oz|Fw6Qd>|AM8K;gxUyLbBvL3lZ-<;OlJOwMctDIn?ZD=Spe(^}VQA{f9_qkv z+!4@Z$sUF$<+#x)rl~liq@eA>87qIPIA)%gGzfl$6W?!W?@FTf{olNaO}A2fboj7!r3gw)}B5R3*X z!AG)8GClyXF91V(1%XEpz~nxGR`?5Fmv_yMAkcA95t$o?k^H*&C;}hv*KVL#xIBKF zE2ZwJGP+n{;kI})6bDIs9$T0;ZFt?(bT#-F@MY3?NTD_uWL(DC*0e*?ocC$>&(Csn0;!Bgk}A<&$mUWTMO`N>Hnn-IwxqfC5LK{mpT0ioo* z*Ad8skolX=d=iN-i$IUO98`vvg?PuNn+RllHu@XaN6{)gAG9Cm_~7k_{9^(U9r@f#Tj6oxZzVp3@r#~ z{IL&2BK5ZijlQA|1R_~#p8o)aD1c<y#Ba`c5@#Bn&2pe%=gz( z%J)dF5K~|u2H=WP5D7Ey5G3H+0#NdtQf;hk@)=Ih*S}~DPfm#+5TJy}!T-#Ysrw9c z#QA;_flTHzb3*3vB#%ks@L;0$o-8^8lku7SIW022azZtzX0xj-zVK`G%?#e~cw9*|hH;Xb~c>t7_y+nl;- zps!R)1OZKM8hjm)c|6HBXi4_!!@#-a!E4okICwP@9-0IoUma6g=;nZm!T{iJ0l@^F zQaA&)1ubOENC?&Wk9a9%-2Joml^5u%JOGoU(DdH6dSNmMpWafU1(bD!-T^aR1uq6V zGL4Z#K;!cO^b=1?KEoKQzW`*irNB)=aLr#>%xwh(KE7808I)3Y9;np|)+1oaoQM27 zMoQIHIG!`Ag13qW>PyZmj!VM&N(eFtpA%9tSD#P0+tsXKD+ z)n5jha)5Rk+FTT^wFaujCc!)d7^)QXN1=hlr@t^6gili_)!#$^Xf_d;r3T#4 z26e&!0Zsg{f)XlFiq4P&CU;ST4^-+55unh1z})8&lmd)c2QQuj;cpGHBy>1oV7D*< zbKAHn$-c8-qd72jG%z)^<&)iwKqiY&D4lxzL+K{=|3Js@Bc{~-`i83)LV)faz%tOJ z_z{T?Gdpf4Fp*DPduY5~1}FT{Y%|DhGr#|qD1p@anQ8PGT;-&r8<2%hEt&5{kU;1e z5cjAO+0?a%_TP;hN95MsAE5Z=J>|wFW5`B;&-e7ZY~TA4#mnGM8M+P(7#|cgoYMh0QQ0}<+_5+^?L$}!I>D}8q0z!s+8GNSHBZ&sm+CWF&++dxL3!KOBP{0h= zZ{PqA5AE-qIZK0wn<>S+7jL%YRqTXt6DsO%BKJqI*zEwLST}sjoa2j4L|Ya z!j@$Ky`Q3Q<(q?mC%7H?h7M{Ho+fl|0dw+n!{COt23>gw67cU9x}}4f1g%;jZm_^i zcN^T$u}}@DfYyg)=Dk+WXz(g<%b(CbP$`)9qA6!?TL(30iiKozJ%E13 zwFuw=h!++UT!;XL4&=b=p!$ZB?eD*P42CBqU;-POzE2h*2q5l4pr&_(c#6ggpm#5D z9O&v!)>Q;7zOkXj{@lZC3VKm=AAw^k5Dfx;v6!kd1UA7b35)O46n}X3#dCFFkE39; z359#yK!VRTzck>Ps#gR2fTm!52L>O$hX5zMO&aikF7sjB6sQ(2+*L{{5#VI0fQEoQ z!_l>dz~(8S69Ijvfz=2C@b8qkGl81fugkp8$EEk1;0E3O`3s9-sX<`lgOqY_0yQZT zn;foX05%wH!k)nWDS{O8XrdZOY1TCwxXKtNz(UYSHLpcrlbL@`3{?Tfd3^71so**= zKh!fz>ktGGdPFqfmOQ5uK)$8Z2W=BH4OBNEz==Bws2ThYOQBg1F!*I~Lx-Ffn-H*s zP{ptLQ$yFji_<*~u()0kwBhh>MnIFlOTw-KY7&^u9~IvQHo;A#L5Ep3&k!WweUh}V zfExW&PozaFu(q8Lyt&xbia?)R`=fq%dhX^|eg)0$6gxAIJ>NDQsOdfVi$5!9n0`(twBmao^?v zU}25L@b{OD#Kz|<(hdWX<|KObng^z0z|>a2)X<1|@)|+&Iq#s}6+?uc}fSS&OlX=f>0e#ij;JwANw+L`D_rMv4YKH22;OCC(L*vW>jrQ9g5%7cz z^;fjt`isUVz`J}08aJq8r-J?MG&@)1n&bBdP_xXkTDR{3K=l@I%YvJDVKL}I1U~+4 z;&um6;||_7m(xCH;6TTZ3MUiP^4iUUxz4BXHm%izeu*o4XVzl#ui zeoI&n;Jv^N4bRMPNFvCW@~Npmp_n6A4!B?-0b|R3M_>~?{qK5L3Ep}f0U{_9^yHw! zW%*GAHa_(KPIel%G%*1h$AOm$?d4DXKp_7e`j(#gi8g?G0w~nGkB=ilVN3edOijPN z^w2$EYB0YBGxgF*1U?}!|E@c)e_W6YV4nduH0VXA5ZD9{$1m$sQ`^AMl0FGw-+>$2 z<9UXJCU^*8VV@ejs-ego7diWYO`xOkl3xgVtZ!c)y$YP<8!IsktZ=7JkvZw5gS8JbY< z4L+j-Km45Z6vK23w9`4kX`oB|)GP%*$($r3iXK4*KBW`RHHWJXKkJ)>y~BWjCBzc` zhpNrtXEKx6zRU=0GXI$qLsh^S?0hzofNEX@0pv^l)XWV(pNfPQ0adOR+Cq~~tAg7d zeoh97KQ4^GpBvM{miwta1N`6yl8ic$f004e_VCjDB)Gm90-XHi&Mo;<(;i-2oFw4A z1cCr)YJe>IQDUn>56vDzkH8{MUGYOt0jR41I z2k6p2H3{%i%OnXdG6)jzeUSOW%kW5m7cM4&{bUiqWR66>{7+4Ncm-jS6f-#lDP;A8 z;kv_%1Cyvv5vjy20MxXFmuw|*V?k{in%Rfokn9!Z4V1_aFsB1m=J;B0uMI1>AY8UmXvYX8oMmlGrLN5EVH%?Kdp&leYi z>klspM&ie7BJg46Cl&~UOMsW+B1t%~5kUg^6U=W6pyovIf>k6L*R>F25PA{BtpU{N z@bXL~`s&R{bSj$zsEL3VR3eFJM-)M}J%Ab-Ui62Ajt5)$X?hU8!NRqRRC_+~k~k!A zjV=Nh-`4&W46naJ0+)emmozmd^u^~l2~aZ#ydnw-f5ZR*PjLD9`Y3Q;hnF@Xp?Sd) x3r)=leYN>QCvY^pDhUaF4GB%udcH=2z literal 0 HcmV?d00001 diff --git a/.yarn/cache/color-npm-4.2.3-4a23227581-b23f5e500a.zip b/.yarn/cache/color-npm-4.2.3-4a23227581-b23f5e500a.zip new file mode 100644 index 0000000000000000000000000000000000000000..3f65ebe0c16e09d718f0b7e8d83954a5ffd01fc8 GIT binary patch literal 6567 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 z z=QfO+C*kFa&^EOvjP*`ccEG^M^aYm6bzjV zq!bqE+&X6>IG(f-ko?JebLCCrSPgTZZDqF*DA49akq)mxy*;tPBHz)@AHFUM$NNhA z6Uef>DmE0E$*vJKb7zXctb9fI8=P zZz{*}`pHU}Sr~ZkS$l=c?w~-}w&Q>GzVr`@*Rn z;;NawH$4(f-9|41?sqyT`}^((Od*j(!2tj!=l}rmKkvS(l$fNV6pNi%k(Qmq3J>P< ziJ?=3mNqi6PKv1jt9H=*VHCQ))-1^l1)Y&@J~MUQ7C4!tU@zeNstTBy)+%aT>`Hu1 z$k)^NM7EJ)Z022~F6#zHE!GT(+6KmoLreVFD3MWCv%ELLi=mR*pgvZef0z?f2bM9B z`j8SYjIb#(QtZ{CTNSE+a`DWxA`!$4c-*L4zjUPe8B;o=?o=yva&^C9@W*A(mg3;G zWNTdL4MZ!E2_@AFT_34pP?|4Za?_z2376saGub zo)jTUhgcDgjcpRBkXJe(9(l=&b0FSHGB*l>e34ByWM3~-DKmbgus5(nyPr9@xO;i& z+NyE`*!Q57Pojc4)%bKP-HFzW1trs`eUMh~;p(oDu~$@B)Xkqi;{%r>whLp5z=qM1 za-aIpNn&*NXQXks)TJz)ivk+Zt>1cl*hqM9$7(<5H+zxMTE{bbA-wx=D^uAKUZb48 z%5~J)?2fKx)%^vVhmyIl>0&J3EJ-r78_-WVYF1W>YC*iM^Xk34w5uKiJ*RhS0q3fz z&rC0F)OE&0x7ccP>;M|CeMurDRjzW_j)=Boa5Be$>YPI&IYo182yo1`p(KS zxVYCl^vp;~ln#k6oDPCD=Hb|9{I-7NdGpIa#kEHD=T&>5+5XC#Uf(&rH^gx>0u64* z)?JW+q2SP}q<#jI-bh=~Y zazJnx(G`xF+Is{SaMi^m*$cD5%Fcd@rE)T=B4kOc%202gR92j zmD#CmC{0$5a=zp!28b!t`9 z(K4=p`KQqu;B9{PHu$d%_U6A`yhC2%BS!F!$0JrxJB*stBkXoNTj%^U^&wmqmqhwO+$$ zwOi0>4p`WZJ(f784Igw>0zm z#pw^TzlXH`KtIrlP#@LxU(x1B^Kya z%_3+UY7a1oUC_Cr#P=^u;YMFKydr4d5>I^KQMMQ=#=yFd2a{XlNw*k|rVn1?^zfw+ zY)fuo4P9dPV12>9MI(u7(1e2=Zfsqj_PJcx7{={YZ`vwj$|SB#kP+2b3+;^QxG)8h zNgQ#jn=naI5drA5gPL&NA5MK6O1%>y1vYgyI^!k&fprtE#3o=3&7I8lO`XQdda3(E2>Y+UT)QFMGPqgAZc>PSl ztNeC%nA$$MKNBO#h1ygl)xdnqJN5!0ni6GS3Uedr+;_--3<6Q;J4cP zXFK3GpfKp&KLh^L9QeJ4-<&^H+y8Q⪙8ZwuXOy$ZrkzPtczU&3{3RnEwd+|I?d4 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
    FAhozvs(R9D7 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
    sk{j0f{$-=LErclYBg(%S%29egz-9bpsii7 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
    O0wz#I2u#HTEi07tl7qdj?V}{maN2`f}R-=zh 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%0DCbo(mX&9 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 literal 0 HcmV?d00001 diff --git a/.yarn/cache/password-prompt-npm-1.1.3-0190666768-1cf7001e66.zip b/.yarn/cache/password-prompt-npm-1.1.3-0190666768-1cf7001e66.zip new file mode 100644 index 0000000000000000000000000000000000000000..11d8442b2b54e770db0e0722e6e6cbb66f82acd5 GIT binary patch literal 2966 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 R0Dyh>8`wQx9@qETzW}M61X2J1 literal 0 HcmV?d00001 diff --git a/Cargo.lock b/Cargo.lock index a871a5be5d..96ce949078 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -234,9 +234,9 @@ dependencies = [ "bitflags 1.3.2", "bytes", "futures-util", - "http", - "http-body", - "hyper", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.28", "itoa", "matchit", "memchr", @@ -260,8 +260,8 @@ dependencies = [ "async-trait", "bytes", "futures-util", - "http", - "http-body", + "http 0.2.12", + "http-body 0.4.6", "mime", "rustversion", "tower-layer", @@ -1102,7 +1102,7 @@ dependencies = [ "envy", "futures", "hex", - "http", + "http 0.2.12", "lru", "rs-dapi-client", "sanitize-filename", @@ -1698,6 +1698,21 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + [[package]] name = "form_urlencoded" version = "1.2.1" @@ -1972,7 +1987,26 @@ dependencies = [ "futures-core", "futures-sink", "futures-util", - "http", + "http 0.2.12", + "indexmap 2.2.6", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "h2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "816ec7294445779408f36fe57bc5b7fc1cf59664059096c65f905c1c61f58069" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 1.1.0", "indexmap 2.2.6", "slab", "tokio", @@ -1995,15 +2029,6 @@ dependencies = [ "ahash 0.7.8", ] -[[package]] -name = "hashbrown" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ff8ae62cd3a9102e5637afc8452c55acf3844001bd5374e0b0bd7b6616c038" -dependencies = [ - "ahash 0.8.11", -] - [[package]] name = "hashbrown" version = "0.14.3" @@ -2089,6 +2114,17 @@ dependencies = [ "itoa", ] +[[package]] +name = "http" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + [[package]] name = "http-body" version = "0.4.6" @@ -2096,7 +2132,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", - "http", + "http 0.2.12", + "pin-project-lite", +] + +[[package]] +name = "http-body" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" +dependencies = [ + "bytes", + "http 1.1.0", +] + +[[package]] +name = "http-body-util" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" +dependencies = [ + "bytes", + "futures-core", + "http 1.1.0", + "http-body 1.0.0", "pin-project-lite", ] @@ -2128,9 +2187,9 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2", - "http", - "http-body", + "h2 0.3.26", + "http 0.2.12", + "http-body 0.4.6", "httparse", "httpdate", "itoa", @@ -2142,18 +2201,75 @@ dependencies = [ "want", ] +[[package]] +name = "hyper" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "h2 0.4.4", + "http 1.1.0", + "http-body 1.0.0", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + [[package]] name = "hyper-timeout" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" dependencies = [ - "hyper", + "hyper 0.14.28", "pin-project-lite", "tokio", "tokio-io-timeout", ] +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper 1.3.1", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http 1.1.0", + "http-body 1.0.0", + "hyper 1.3.1", + "pin-project-lite", + "socket2 0.5.6", + "tokio", + "tower", + "tower-service", + "tracing", +] + [[package]] name = "iana-time-zone" version = "0.1.60" @@ -2537,56 +2653,47 @@ checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" [[package]] name = "metrics" -version = "0.21.1" +version = "0.22.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fde3af1a009ed76a778cb84fdef9e7dbbdf5775ae3e4cc1f434a6a307f6f76c5" +checksum = "2be3cbd384d4e955b231c895ce10685e3d8260c5ccffae898c96c723b0772835" dependencies = [ "ahash 0.8.11", - "metrics-macros", "portable-atomic", ] [[package]] name = "metrics-exporter-prometheus" -version = "0.12.2" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d4fa7ce7c4862db464a37b0b31d89bca874562f034bd7993895572783d02950" +checksum = "5d58e362dc7206e9456ddbcdbd53c71ba441020e62104703075a69151e38d85f" dependencies = [ - "base64 0.21.7", - "hyper", - "indexmap 1.9.3", + "base64 0.22.0", + "http-body-util", + "hyper 1.3.1", + "hyper-tls", + "hyper-util", + "indexmap 2.2.6", "ipnet", "metrics", "metrics-util", - "quanta", + "quanta 0.12.3", "thiserror", "tokio", "tracing", ] -[[package]] -name = "metrics-macros" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b4faf00617defe497754acde3024865bc143d44a86799b24e191ecff91354f" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.60", -] - [[package]] name = "metrics-util" -version = "0.15.1" +version = "0.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4de2ed6e491ed114b40b732e4d1659a9d53992ebd87490c44a6ffe23739d973e" +checksum = "8b07a5eb561b8cbc16be2d216faf7757f9baf3bfb94dbb0fae3df8387a5bb47f" dependencies = [ "crossbeam-epoch", "crossbeam-utils", - "hashbrown 0.13.1", + "hashbrown 0.14.3", "metrics", "num_cpus", - "quanta", + "quanta 0.12.3", "sketches-ddsketch", ] @@ -2663,7 +2770,7 @@ dependencies = [ "futures-util", "once_cell", "parking_lot", - "quanta", + "quanta 0.11.1", "rustc_version", "scheduled-thread-pool", "skeptic", @@ -2692,6 +2799,24 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9252111cf132ba0929b6f8e030cac2a24b507f3a4d6db6fb2896f27b354c714b" +[[package]] +name = "native-tls" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +dependencies = [ + "lazy_static", + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + [[package]] name = "nohash-hasher" version = "0.2.0" @@ -2874,12 +2999,50 @@ version = "11.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" +[[package]] +name = "openssl" +version = "0.10.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" +dependencies = [ + "bitflags 2.5.0", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.60", +] + [[package]] name = "openssl-probe" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +[[package]] +name = "openssl-sys" +version = "0.9.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "overload" version = "0.1.1" @@ -3382,7 +3545,22 @@ dependencies = [ "libc", "mach2", "once_cell", - "raw-cpuid", + "raw-cpuid 10.7.0", + "wasi", + "web-sys", + "winapi", +] + +[[package]] +name = "quanta" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5167a477619228a0b284fac2674e3c388cba90631d7b7de620e6f1fcd08da5" +dependencies = [ + "crossbeam-utils", + "libc", + "once_cell", + "raw-cpuid 11.0.1", "wasi", "web-sys", "winapi", @@ -3442,6 +3620,15 @@ dependencies = [ "bitflags 1.3.2", ] +[[package]] +name = "raw-cpuid" +version = "11.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d86a7c4638d42c44551f4791a20e687dbb4c3de1f33c43dd71e355cd429def1" +dependencies = [ + "bitflags 2.5.0", +] + [[package]] name = "rayon" version = "1.10.0" @@ -3596,7 +3783,7 @@ dependencies = [ "dapi-grpc", "futures", "hex", - "http", + "http 0.2.12", "lru", "rand", "sha2", @@ -4529,6 +4716,16 @@ dependencies = [ "syn 2.0.60", ] +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + [[package]] name = "tokio-rustls" version = "0.25.0" @@ -4645,10 +4842,10 @@ dependencies = [ "axum", "base64 0.21.7", "bytes", - "h2", - "http", - "http-body", - "hyper", + "h2 0.3.26", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.28", "hyper-timeout", "percent-encoding", "pin-project", @@ -4672,10 +4869,10 @@ dependencies = [ "axum", "base64 0.21.7", "bytes", - "h2", - "http", - "http-body", - "hyper", + "h2 0.3.26", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.28", "hyper-timeout", "percent-encoding", "pin-project", @@ -4754,6 +4951,7 @@ version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ + "log", "pin-project-lite", "tracing-attributes", "tracing-core", diff --git a/Dockerfile b/Dockerfile index 7cafb4713d..a7c3030302 100644 --- a/Dockerfile +++ b/Dockerfile @@ -194,7 +194,8 @@ RUN --mount=type=cache,sharing=shared,id=cargo_registry_index,target=${CARGO_HOM if [[ -z "${SCCACHE_MEMCACHED}" ]] ; then unset SCCACHE_MEMCACHED ; fi ; \ cargo build \ --profile "$CARGO_BUILD_PROFILE" \ - --package drive-abci && \ + --package drive-abci \ + --locked && \ cp /platform/target/*/drive-abci /artifacts/ && \ if [[ "${RUSTC_WRAPPER}" == "sccache" ]] ; then sccache --show-stats; fi diff --git a/packages/dashmate/README.md b/packages/dashmate/README.md index acfa37c0c5..74b21560e6 100644 --- a/packages/dashmate/README.md +++ b/packages/dashmate/README.md @@ -71,11 +71,11 @@ $ dashmate update ║ Drive ABCI │ dashpay/drive:0.24 │ updated ║ ║ Drive Tenderdash │ dashpay/tenderdash:0.11.2 │ up to date ║ ║ DAPI API │ dashpay/dapi:0.24 │ updated ║ -║ DAPI Envoy │ dashpay/envoy:0.24 │ updated ║ +║ Gateway │ dashpay/envoy:0.24 │ updated ║ ║ Dashmate Helper │ dashpay/dashmate-helper:0.24 │ updated ║ ╚══════════════════╧══════════════════════════════╧════════════╝ $ dashmate update --format=json -[{"name":"core","title":"Core","updated":false,"image":"dashpay/dashd:19.2.0"},{"name":"drive_abci","title":"Drive ABCI","pulled":false,"image":"dashpay/drive:0.24"},{"name":"drive_tenderdash","title":"Drive Tenderdash","pulled":true,"image":"dashpay/tenderdash:0.11.2"},{"name":"dapi_api","title":"DAPI API","pulled":false,"image":"dashpay/dapi:0.24"},{"name":"dapi_envoy","title":"DAPI Envoy","pulled":false,"image":"dashpay/envoy:0.24"},{"name":"dashmate_helper","title":"Dashmate Helper","pulled":false,"image":"dashpay/dashmate-helper:0.24"}] +[{"name":"core","title":"Core","updated":false,"image":"dashpay/dashd:19.2.0"},{"name":"drive_abci","title":"Drive ABCI","pulled":false,"image":"dashpay/drive:0.24"},{"name":"drive_tenderdash","title":"Drive Tenderdash","pulled":true,"image":"dashpay/tenderdash:0.11.2"},{"name":"dapi_api","title":"DAPI API","pulled":false,"image":"dashpay/dapi:0.24"},{"name":"gateway","title":"Gateway","pulled":false,"image":"dashpay/envoy:0.24"},{"name":"dashmate_helper","title":"Dashmate Helper","pulled":false,"image":"dashpay/dashmate-helper:0.24"}] $ dashmate start ``` @@ -503,7 +503,7 @@ again all your service configs (dashd.conf, config.toml, etc.), you can issue th ```bash dashmate config render -Config "testnet" service configs rendered +"testnet" service configs rendered ``` ### Development diff --git a/packages/dashmate/configs/defaults/getBaseConfigFactory.js b/packages/dashmate/configs/defaults/getBaseConfigFactory.js index dfa5800145..9459d657db 100644 --- a/packages/dashmate/configs/defaults/getBaseConfigFactory.js +++ b/packages/dashmate/configs/defaults/getBaseConfigFactory.js @@ -125,34 +125,85 @@ export default function getBaseConfigFactory(homeDir) { indexes: true, }, platform: { - dapi: { - envoy: { - docker: { - image: 'dashpay/envoy:1.22.11', + gateway: { + docker: { + image: 'dashpay/envoy:1.30.2-impr.1', + }, + maxConnections: 1000, + maxHeapSizeInBytes: 125000000, // 1 Gb + upstreams: { + driveGrpc: { + maxRequests: 100, }, - http: { + dapiApi: { + maxRequests: 100, + }, + dapiCoreStreams: { + maxRequests: 100, + }, + dapiJsonRpc: { + maxRequests: 100, + }, + }, + metrics: { + enabled: false, + host: '127.0.0.1', + port: 9090, + }, + admin: { + enabled: false, + host: '127.0.0.1', + port: 9901, + }, + listeners: { + dapiAndDrive: { + http2: { + maxConcurrentStreams: 10, + }, host: '0.0.0.0', port: 443, - connectTimeout: '5s', - responseTimeout: '15s', }, - rateLimiter: { - maxTokens: 300, - tokensPerFill: 150, - fillInterval: '60s', - enabled: true, + }, + log: { + level: 'info', + accessLogs: [ + { + type: 'stdout', + format: 'text', + template: null, + }, + ], + }, + rateLimiter: { + docker: { + image: 'envoyproxy/ratelimit:3fcc3609', }, - ssl: { + metrics: { enabled: false, - provider: 'zerossl', - providerConfigs: { - zerossl: { - apiKey: null, - id: null, - }, + docker: { + image: 'prom/statsd-exporter:v0.26.1', }, + host: '127.0.0.1', + port: 9102, }, + unit: 'minute', + requestsPerUnit: 150, + blacklist: [], + whitelist: [], + enabled: true, }, + ssl: { + enabled: false, + provider: 'zerossl', + providerConfigs: { + zerossl: { + apiKey: null, + id: null, + }, + }, + }, + }, + dapi: { api: { docker: { image: `dashpay/dapi:${dockerImageVersion}`, @@ -191,7 +242,7 @@ export default function getBaseConfigFactory(homeDir) { enabled: false, host: '127.0.0.1', port: 6669, - retention_secs: 60 * 3, + retention: 60 * 3, }, validatorSet: { llmqType: 4, @@ -201,6 +252,11 @@ export default function getBaseConfigFactory(homeDir) { dkgInterval: 288, llmqSize: 400, }, + metrics: { + enabled: false, + host: '127.0.0.1', + port: 29090, + }, epochTime: 788400, }, tenderdash: { diff --git a/packages/dashmate/configs/defaults/getLocalConfigFactory.js b/packages/dashmate/configs/defaults/getLocalConfigFactory.js index 88b2870fc9..33992ceceb 100644 --- a/packages/dashmate/configs/defaults/getLocalConfigFactory.js +++ b/packages/dashmate/configs/defaults/getLocalConfigFactory.js @@ -36,17 +36,17 @@ export default function getLocalConfigFactory(getBaseConfig) { }, }, platform: { - dapi: { - envoy: { - ssl: { - provider: SSL_PROVIDERS.SELF_SIGNED, - }, - http: { + gateway: { + ssl: { + provider: SSL_PROVIDERS.SELF_SIGNED, + }, + listeners: { + dapiAndDrive: { port: 2443, }, - rateLimiter: { - enabled: false, - }, + }, + rateLimiter: { + enabled: false, }, }, drive: { diff --git a/packages/dashmate/configs/defaults/getTestnetConfigFactory.js b/packages/dashmate/configs/defaults/getTestnetConfigFactory.js index c885080be7..323d63314b 100644 --- a/packages/dashmate/configs/defaults/getTestnetConfigFactory.js +++ b/packages/dashmate/configs/defaults/getTestnetConfigFactory.js @@ -44,9 +44,9 @@ export default function getTestnetConfigFactory(homeDir, getBaseConfig) { }, }, platform: { - dapi: { - envoy: { - http: { + gateway: { + listeners: { + dapiAndDrive: { port: 1443, }, }, diff --git a/packages/dashmate/configs/getConfigFileMigrationsFactory.js b/packages/dashmate/configs/getConfigFileMigrationsFactory.js index 0dc4d7027f..cdd3cd9405 100644 --- a/packages/dashmate/configs/getConfigFileMigrationsFactory.js +++ b/packages/dashmate/configs/getConfigFileMigrationsFactory.js @@ -57,7 +57,7 @@ export default function getConfigFileMigrationsFactory(homeDir, defaultConfigs) options.platform.dapi.api.docker.image = base.get('platform.dapi.api.docker.image'); - options.platform.dapi.envoy.docker.image = base.get('platform.dapi.envoy.docker.image'); + options.platform.gateway.docker.image = base.get('platform.gateway.docker.image'); }); return configFile; @@ -106,7 +106,7 @@ export default function getConfigFileMigrationsFactory(homeDir, defaultConfigs) '0.24.16': (configFile) => { Object.entries(configFile.configs) .forEach(([, options]) => { - options.platform.dapi.envoy.docker = base.get('platform.dapi.envoy.docker'); + options.platform.gateway.docker = base.get('platform.gateway.docker'); options.platform.dapi.api.docker.build = base.get('platform.dapi.api.docker.build'); @@ -382,7 +382,7 @@ export default function getConfigFileMigrationsFactory(homeDir, defaultConfigs) options.core.p2p.host = base.get('core.p2p.host'); options.core.rpc.host = base.get('core.rpc.host'); - options.platform.dapi.envoy.http.host = base.get('platform.dapi.envoy.http.host'); + options.platform.dapi.envoy.http.host = '0.0.0.0'; options.platform.drive.tenderdash.p2p.host = base.get('platform.drive.tenderdash.p2p.host'); options.platform.drive.tenderdash.rpc.host = base.get('platform.drive.tenderdash.rpc.host'); options.platform.drive.tenderdash.metrics.host = base.get('platform.drive.tenderdash.metrics.host'); @@ -401,8 +401,8 @@ export default function getConfigFileMigrationsFactory(homeDir, defaultConfigs) '0.25.20': (configFile) => { Object.entries(configFile.configs) .forEach(([name, options]) => { - options.platform.dapi.envoy.http.connectTimeout = base.get('platform.dapi.envoy.http.connectTimeout'); - options.platform.dapi.envoy.http.responseTimeout = base.get('platform.dapi.envoy.http.responseTimeout'); + options.platform.dapi.envoy.http.connectTimeout = '5s'; + options.platform.dapi.envoy.http.responseTimeout = '15s'; options.platform.drive.tenderdash.rpc.maxOpenConnections = base.get('platform.drive.tenderdash.rpc.maxOpenConnections'); @@ -523,9 +523,92 @@ export default function getConfigFileMigrationsFactory(homeDir, defaultConfigs) }, '1.0.0-dev.12': (configFile) => { Object.entries(configFile.configs) - .forEach(([, options]) => { + .forEach(([name, options]) => { + // Update tenderdash config options.platform.drive.tenderdash.docker.image = base.get('platform.drive.tenderdash.docker.image'); options.platform.drive.tenderdash.mempool.maxConcurrentCheckTx = base.get('platform.drive.tenderdash.mempool.maxConcurrentCheckTx'); + + // Add metrics to Drive ABCI + options.platform.drive.abci.metrics = base.get('platform.drive.abci.metrics'); + + // Envoy -> Gateway + if (options.platform.dapi.envoy) { + options.platform.gateway = lodash.cloneDeep(options.platform.dapi.envoy); + + // add new options + options.platform.gateway.maxConnections = base.get('platform.gateway.maxConnections'); + options.platform.gateway.maxHeapSizeInBytes = base.get('platform.gateway.maxHeapSizeInBytes'); + options.platform.gateway.metrics = base.get('platform.gateway.metrics'); + options.platform.gateway.admin = base.get('platform.gateway.admin'); + options.platform.gateway.upstreams = base.get('platform.gateway.upstreams'); + options.platform.gateway.log = base.get('platform.gateway.log'); + + // http -> listeners + options.platform.gateway.listeners = lodash.cloneDeep( + base.get('platform.gateway.listeners'), + ); + + options.platform.gateway.listeners.dapiAndDrive.host = options.platform.dapi.envoy + .http.host; + options.platform.gateway.listeners.dapiAndDrive.port = options.platform.dapi.envoy + .http.port; + + delete options.platform.gateway.http; + + // update rate limiter + options.platform.gateway.rateLimiter.docker = base.get('platform.gateway.rateLimiter.docker'); + options.platform.gateway.rateLimiter.unit = base.get('platform.gateway.rateLimiter.unit'); + options.platform.gateway.rateLimiter.requestsPerUnit = base.get('platform.gateway.rateLimiter.requestsPerUnit'); + options.platform.gateway.rateLimiter.blacklist = base.get('platform.gateway.rateLimiter.blacklist'); + options.platform.gateway.rateLimiter.whitelist = base.get('platform.gateway.rateLimiter.whitelist'); + options.platform.gateway.rateLimiter.metrics = base.get('platform.gateway.rateLimiter.metrics'); + + delete options.platform.gateway.rateLimiter.fillInterval; + delete options.platform.gateway.rateLimiter.maxTokens; + delete options.platform.gateway.rateLimiter.tokensPerFill; + + // delete envoy + delete options.platform.dapi.envoy; + + // update image + options.platform.gateway.docker.image = base.get('platform.gateway.docker.image'); + } + + // rename non conventional field + if (options.platform.drive.abci.tokioConsole.retention_secs) { + options.platform.drive.abci.tokioConsole.retention = options.platform.drive.abci + .tokioConsole.retention_secs; + delete options.platform.drive.abci.tokioConsole.retention_secs; + } + + // move SSL files + if (options.network !== NETWORK_MAINNET) { + const filenames = ['private.key', 'bundle.crt', 'bundle.csr', 'csr.pem']; + + for (const filename of filenames) { + const oldFilePath = homeDir.joinPath( + name, + 'platform', + 'dapi', + 'envoy', + 'ssl', + filename, + ); + const newFilePath = homeDir.joinPath( + name, + 'platform', + 'gateway', + 'ssl', + filename, + ); + + if (fs.existsSync(oldFilePath)) { + fs.mkdirSync(path.dirname(newFilePath), { recursive: true }); + fs.copyFileSync(oldFilePath, newFilePath); + fs.rmSync(oldFilePath, { recursive: true }); + } + } + } }); return configFile; diff --git a/packages/dashmate/docker-compose.build.dapi_tx_filter_stream.yml b/packages/dashmate/docker-compose.build.dapi_core_streams.yml similarity index 96% rename from packages/dashmate/docker-compose.build.dapi_tx_filter_stream.yml rename to packages/dashmate/docker-compose.build.dapi_core_streams.yml index 35e82f593a..ec9cfdcf45 100644 --- a/packages/dashmate/docker-compose.build.dapi_tx_filter_stream.yml +++ b/packages/dashmate/docker-compose.build.dapi_core_streams.yml @@ -1,7 +1,7 @@ version: '3.7' services: - dapi_tx_filter_stream: + dapi_core_streams: build: context: ${PLATFORM_DAPI_API_DOCKER_BUILD_CONTEXT:?err} dockerfile: ${PLATFORM_DAPI_API_DOCKER_BUILD_DOCKER_FILE:?err} diff --git a/packages/dashmate/docker-compose.rate_limiter.metrics.yml b/packages/dashmate/docker-compose.rate_limiter.metrics.yml new file mode 100644 index 0000000000..7e76d9959c --- /dev/null +++ b/packages/dashmate/docker-compose.rate_limiter.metrics.yml @@ -0,0 +1,20 @@ +version: '3.7' + +services: + gateway_rate_limiter_metrics: + image: ${PLATFORM_GATEWAY_RATE_LIMITER_METRICS_DOCKER_IMAGE:?err} + labels: + org.dashmate.service.title: "Gateway rate limiter metrics exporter" + restart: unless-stopped + entrypoint: /bin/statsd_exporter + command: + - "--statsd.mapping-config=/etc/statsd-exporter/config.yaml" + networks: + - gateway_rate_limiter + volumes: + - ${DASHMATE_HOME_DIR:?err}/${CONFIG_NAME:?err}/platform/gateway/rate_limiter/statsd_exporter.yaml:/etc/statsd-exporter/config.yaml:ro + expose: + - 9125 + - 9125/udp + ports: + - ${PLATFORM_GATEWAY_RATE_LIMITER_METRICS_HOST:?err}:${PLATFORM_GATEWAY_RATE_LIMITER_METRICS_PORT:?err}:9102 diff --git a/packages/dashmate/docker-compose.rate_limiter.yml b/packages/dashmate/docker-compose.rate_limiter.yml new file mode 100644 index 0000000000..9833a62036 --- /dev/null +++ b/packages/dashmate/docker-compose.rate_limiter.yml @@ -0,0 +1,54 @@ +version: '3.7' + +services: + gateway: + depends_on: + - dapi_api + - dapi_core_streams + - drive_abci + - gateway_rate_limiter + + gateway_rate_limiter: + labels: + org.dashmate.service.title: "Gateway rate limiter" + restart: unless-stopped + image: ${PLATFORM_GATEWAY_RATE_LIMITER_DOCKER_IMAGE:?err} + command: /bin/ratelimit + depends_on: + - gateway_rate_limiter_redis + networks: + - gateway_rate_limiter + volumes: + - ${DASHMATE_HOME_DIR:?err}/${CONFIG_NAME:?err}/platform/gateway/rate_limiter/rate_limiter.yaml:/data/ratelimit/config/config.yaml:ro + environment: + - LOG_LEVEL=info + - LOG_FORMAT=text + - BACKEND_TYPE=redis + - REDIS_SOCKET_TYPE=tcp + - REDIS_URL=gateway_rate_limiter_redis:6379 + - RUNTIME_ROOT=/data + - RUNTIME_SUBDIRECTORY=ratelimit + - RUNTIME_WATCH_ROOT=false + - DISABLE_STATS=${PLATFORM_GATEWAY_RATE_LIMITER_METRICS_DISABLED:?err} + - STATSD_HOST=gateway_rate_limiter_metrics + - STATSD_PORT=9125 + - CONFIG_TYPE=FILE + - GRPC_MAX_CONNECTION_AGE=1h + - GRPC_MAX_CONNECTION_AGE_GRACE=10m + - GRPC_PORT=8081 + expose: + - 8081 + profiles: + - platform + + gateway_rate_limiter_redis: + labels: + org.dashmate.service.title: "Gateway rate limiter storage" + restart: unless-stopped + image: redis:alpine + expose: + - 6379 + networks: + - gateway_rate_limiter + profiles: + - platform diff --git a/packages/dashmate/docker-compose.yml b/packages/dashmate/docker-compose.yml index 9ee4f0c008..a2fad5c55a 100644 --- a/packages/dashmate/docker-compose.yml +++ b/packages/dashmate/docker-compose.yml @@ -24,8 +24,8 @@ services: org.dashmate.service.title: "Core" restart: unless-stopped ports: - - ${CORE_P2P_HOST:?err}:${CORE_P2P_PORT:?err}:${CORE_P2P_PORT:?err} # P2P - - ${CORE_RPC_HOST:?err}:${CORE_RPC_PORT:?err}:${CORE_RPC_PORT:?err} #RPC + - ${CORE_P2P_HOST:?err}:${CORE_P2P_PORT:?err}:${CORE_P2P_PORT:?err} + - ${CORE_RPC_HOST:?err}:${CORE_RPC_PORT:?err}:${CORE_RPC_PORT:?err} volumes: - core_data:/home/dash - ${DASHMATE_HOME_DIR:?err}/${CONFIG_NAME:?err}/core/dash.conf:/home/dash/.dashcore/dash.conf:ro @@ -72,16 +72,15 @@ services: - DB_PATH=/var/lib/dash/rs-drive-abci/db - ABCI_CONSENSUS_BIND_ADDRESS=tcp://0.0.0.0:26658 - GRPC_BIND_ADDRESS=0.0.0.0:26670 - - PROMETHEUS_BIND_ADDRESS=http://0.0.0.0:29090 + - PROMETHEUS_BIND_ADDRESS=${PLATFORM_DRIVE_ABCI_METRICS_URL} - TOKIO_CONSOLE_ENABLED=${PLATFORM_DRIVE_ABCI_TOKIO_CONSOLE_ENABLED:?err} - TOKIO_CONSOLE_ADDRESS=0.0.0.0:${PLATFORM_DRIVE_ABCI_TOKIO_CONSOLE_PORT:?err} - - TOKIO_CONSOLE_RETENTION_SECS=${PLATFORM_DRIVE_ABCI_TOKIO_CONSOLE_RETENTION_SECS:?err} + - TOKIO_CONSOLE_RETENTION_SECS=${PLATFORM_DRIVE_ABCI_TOKIO_CONSOLE_RETENTION:?err} stop_grace_period: 30s expose: - 26658 - 26659 - 26670 - - 29090 env_file: # Logger settings - ${DASHMATE_HOME_DIR:?err}/${CONFIG_NAME:?err}/platform/drive/abci/logger.env @@ -89,6 +88,7 @@ services: - platform ports: - ${PLATFORM_DRIVE_ABCI_TOKIO_CONSOLE_HOST:?err}:${PLATFORM_DRIVE_ABCI_TOKIO_CONSOLE_PORT:?err}:${PLATFORM_DRIVE_ABCI_TOKIO_CONSOLE_PORT:?err} + - ${PLATFORM_DRIVE_ABCI_METRICS_HOST:?err}:${PLATFORM_DRIVE_ABCI_METRICS_PORT:?err}:29090 drive_tenderdash: image: ${PLATFORM_DRIVE_TENDERDASH_DOCKER_IMAGE:?err} @@ -140,13 +140,13 @@ services: - DRIVE_RPC_PORT=26670 command: yarn run api stop_grace_period: 10s - profiles: - - platform expose: - 3004 - 3005 + profiles: + - platform - dapi_tx_filter_stream: + dapi_core_streams: image: ${PLATFORM_DAPI_API_DOCKER_IMAGE:?err} labels: org.dashmate.service.title: "DAPI Transactions Filter Stream" @@ -170,30 +170,40 @@ services: - TENDERMINT_RPC_PORT=26657 - DRIVE_RPC_HOST=drive_abci - DRIVE_RPC_PORT=26670 + expose: + - 3006 command: yarn run core-streams stop_grace_period: 10s profiles: - platform - expose: - - 3006 - dapi_envoy: - image: ${PLATFORM_DAPI_ENVOY_DOCKER_IMAGE:?err} + gateway: + image: ${PLATFORM_GATEWAY_DOCKER_IMAGE:?err} labels: - org.dashmate.service.title: "DAPI Envoy" + org.dashmate.service.title: "Gateway" restart: unless-stopped ports: - - ${PLATFORM_DAPI_ENVOY_HTTP_HOST:?err}:${PLATFORM_DAPI_ENVOY_HTTP_PORT:?err}:10000 # JSON RPC and gRPC Web & Native + # HTTP entry point to the platform. + # Supports HTTP1 and HTTP2 + # Serves JSON RPC, gRPC, and gRPC-Web + - ${PLATFORM_GATEWAY_LISTENERS_DAPI_AND_DRIVE_HOST:?err}:${PLATFORM_GATEWAY_LISTENERS_DAPI_AND_DRIVE_PORT:?err}:10000 + - ${PLATFORM_GATEWAY_METRICS_HOST:?err}:${PLATFORM_GATEWAY_METRICS_PORT:?err}:9090 + - ${PLATFORM_GATEWAY_ADMIN_HOST:?err}:${PLATFORM_GATEWAY_ADMIN_PORT:?err}:9901 depends_on: - dapi_api - - dapi_tx_filter_stream + - dapi_core_streams + - drive_abci + networks: + - default + - gateway_rate_limiter environment: - ENVOY_UID=${LOCAL_UID:?err} - ENVOY_GID=${LOCAL_GID:?err} + - LOG_LEVEL=${PLATFORM_GATEWAY_LOG_LEVEL:?err} volumes: - - ${DASHMATE_HOME_DIR:?err}/${CONFIG_NAME:?err}/platform/dapi/envoy/envoy.yaml:/etc/envoy/envoy.yaml:ro - - ${DASHMATE_HOME_DIR:?err}/${CONFIG_NAME:?err}/platform/dapi/envoy/ssl/bundle.crt:/etc/ssl/bundle.crt:ro - - ${DASHMATE_HOME_DIR:?err}/${CONFIG_NAME:?err}/platform/dapi/envoy/ssl/private.key:/etc/ssl/private.key:ro + - ${DASHMATE_HOME_DIR:?err}/${CONFIG_NAME:?err}/platform/gateway/envoy.yaml:/etc/envoy/envoy.yaml:ro + - ${DASHMATE_HOME_DIR:?err}/${CONFIG_NAME:?err}/platform/gateway/ssl/bundle.crt:/etc/ssl/bundle.crt:ro + - ${DASHMATE_HOME_DIR:?err}/${CONFIG_NAME:?err}/platform/gateway/ssl/private.key:/etc/ssl/private.key:ro stop_grace_period: 10s profiles: - platform @@ -205,6 +215,9 @@ volumes: networks: default: + driver: bridge ipam: config: - subnet: ${DOCKER_NETWORK_SUBNET:?err} + gateway_rate_limiter: + driver: bridge diff --git a/packages/dashmate/scripts/helper.js b/packages/dashmate/scripts/helper.js index 5ed920107c..6cd9feb9f6 100644 --- a/packages/dashmate/scripts/helper.js +++ b/packages/dashmate/scripts/helper.js @@ -47,8 +47,8 @@ import createDIContainer from '../src/createDIContainer.js'; configFile: asValue(configFile), }); - const provider = config.get('platform.dapi.envoy.ssl.provider'); - const isEnabled = config.get('platform.dapi.envoy.ssl.enabled'); + const provider = config.get('platform.gateway.ssl.provider'); + const isEnabled = config.get('platform.gateway.ssl.enabled'); if (isEnabled && provider === 'zerossl') { const scheduleRenewZeroSslCertificate = container.resolve('scheduleRenewZeroSslCertificate'); diff --git a/packages/dashmate/src/commands/config/render.js b/packages/dashmate/src/commands/config/render.js index 76a2f117db..0e9c58ae0b 100644 --- a/packages/dashmate/src/commands/config/render.js +++ b/packages/dashmate/src/commands/config/render.js @@ -31,6 +31,6 @@ Force dashmate to render all config's service configs writeServiceConfigs(config.getName(), configFiles); // eslint-disable-next-line no-console - console.log(`Config "${config.getName()}" service configs rendered`); + console.log(`"${config.getName()}" service configs rendered`); } } diff --git a/packages/dashmate/src/config/configJsonSchema.js b/packages/dashmate/src/config/configJsonSchema.js index 357f5e5ecf..b003a4aded 100644 --- a/packages/dashmate/src/config/configJsonSchema.js +++ b/packages/dashmate/src/config/configJsonSchema.js @@ -50,6 +50,11 @@ export default { required: ['image', 'build'], additionalProperties: false, }, + host: { + type: 'string', + minLength: 1, + format: 'ipv4', + }, port: { type: 'integer', minimum: 0, @@ -84,6 +89,22 @@ export default { type: 'string', pattern: '^[0-9]+(\\.[0-9]+)?s$', }, + enabledHostPort: { + type: 'object', + properties: { + enabled: { + type: 'boolean', + }, + host: { + $ref: '#/definitions/host', + }, + port: { + $ref: '#/definitions/port', + }, + }, + additionalProperties: false, + required: ['enabled', 'host', 'port'], + }, }, properties: { description: { @@ -173,9 +194,7 @@ export default { type: 'object', properties: { host: { - type: 'string', - minLength: 1, - format: 'ipv4', + $ref: '#/definitions/host', }, port: { $ref: '#/definitions/port', @@ -347,18 +366,75 @@ export default { platform: { type: 'object', properties: { - dapi: { + gateway: { type: 'object', properties: { - envoy: { + docker: { + $ref: '#/definitions/docker', + }, + maxConnections: { + type: 'integer', + minimum: 1, + description: 'Maximum number of connections that Gateway accepts from downstream clients', + }, + maxHeapSizeInBytes: { + type: 'integer', + minimum: 1, + description: 'Maximum heap size in bytes. If the heap size exceeds this value, Gateway will take actions to reduce memory usage', + }, + upstreams: { type: 'object', properties: { - docker: { - $ref: '#/definitions/docker', + driveGrpc: { + $id: 'gatewayUpstream', + type: 'object', + properties: { + maxRequests: { + type: 'integer', + minimum: 1, + description: 'The maximum number of parallel requests', + }, + }, + required: ['maxRequests'], + additionalProperties: false, + }, + dapiApi: { + $ref: 'gatewayUpstream', + }, + dapiCoreStreams: { + $ref: 'gatewayUpstream', }, - http: { + dapiJsonRpc: { + $ref: 'gatewayUpstream', + }, + }, + additionalProperties: false, + required: ['driveGrpc', 'dapiApi', 'dapiCoreStreams', 'dapiJsonRpc'], + }, + metrics: { + $ref: '#/definitions/enabledHostPort', + }, + admin: { + $ref: '#/definitions/enabledHostPort', + }, + listeners: { + type: 'object', + properties: { + dapiAndDrive: { type: 'object', properties: { + http2: { + type: 'object', + properties: { + maxConcurrentStreams: { + type: 'integer', + minimum: 1, + description: 'Maximum number of concurrent streams allowed for each connection', + }, + }, + additionalProperties: false, + required: ['maxConcurrentStreams'], + }, host: { type: 'string', minLength: 1, @@ -367,75 +443,228 @@ export default { port: { $ref: '#/definitions/port', }, - connectTimeout: { - $ref: '#/definitions/durationInSeconds', - }, - responseTimeout: { - $ref: '#/definitions/durationInSeconds', - }, }, - required: ['host', 'port', 'connectTimeout', 'responseTimeout'], + required: ['http2', 'host', 'port'], additionalProperties: false, }, - rateLimiter: { + }, + required: ['dapiAndDrive'], + additionalProperties: false, + }, + rateLimiter: { + type: 'object', + properties: { + docker: { + $ref: '#/definitions/docker', + }, + unit: { + type: 'string', + enum: ['second', 'minute', 'hour', 'day'], + }, + requestsPerUnit: { + type: 'integer', + minimum: 1, + }, + blacklist: { + type: 'array', + items: { + $ref: '#/definitions/host', + }, + description: 'List of IP addresses that are blacklisted from making requests', + }, + whitelist: { + type: 'array', + items: { + $ref: '#/definitions/host', + }, + description: 'List of IP addresses that are whitelisted to make requests without limits', + }, + metrics: { type: 'object', properties: { - maxTokens: { - type: 'integer', - minimum: 0, - }, - tokensPerFill: { - type: 'integer', - minimum: 0, - }, - fillInterval: { - $ref: '#/definitions/duration', + docker: { + $ref: '#/definitions/docker', }, enabled: { type: 'boolean', }, + host: { + $ref: '#/definitions/host', + }, + port: { + $ref: '#/definitions/port', + }, }, - required: ['enabled', 'fillInterval', 'tokensPerFill', 'maxTokens'], additionalProperties: false, + required: ['docker', 'enabled', 'host', 'port'], }, - ssl: { + enabled: { + type: 'boolean', + }, + }, + required: ['docker', 'enabled', 'unit', 'requestsPerUnit', 'blacklist', 'whitelist', 'metrics'], + additionalProperties: false, + }, + ssl: { + type: 'object', + properties: { + enabled: { + type: 'boolean', + }, + provider: { + type: 'string', + enum: ['zerossl', 'self-signed', 'file'], + }, + providerConfigs: { type: 'object', properties: { - enabled: { - type: 'boolean', - }, - provider: { - type: 'string', - enum: ['zerossl', 'self-signed', 'file'], - }, - providerConfigs: { - type: 'object', + zerossl: { + type: ['object'], properties: { - zerossl: { - type: ['object'], + apiKey: { + type: ['string', 'null'], + minLength: 32, + }, + id: { + type: ['string', 'null'], + minLength: 32, + }, + }, + required: ['apiKey', 'id'], + additionalProperties: false, + }, + }, + }, + }, + required: ['provider', 'providerConfigs', 'enabled'], + additionalProperties: false, + }, + log: { + type: 'object', + properties: { + level: { + type: 'string', + enum: ['trace', 'debug', 'info', 'warn', 'error', 'critical', 'off'], + }, + accessLogs: { + type: 'array', + items: { + oneOf: [ + { + type: 'object', + properties: { + type: { + type: 'string', + minLength: 1, + enum: ['stdout', 'stderr'], + description: 'Access log type: stdout, stderr or file', + }, + format: { + type: 'string', + enum: ['text', 'json'], + }, + template: true, + }, + required: ['type', 'format'], + additionalProperties: false, + if: { + type: 'object', properties: { - apiKey: { - type: ['string', 'null'], - minLength: 32, + format: { + const: 'json', }, - id: { - type: ['string', 'null'], - minLength: 32, + }, + }, + then: { + type: 'object', + properties: { + template: { + type: ['null', 'object'], + additionalProperties: { + type: 'string', + }, + description: 'JSON fields and values. If null, default template is used.', }, }, - required: ['apiKey', 'id'], - additionalProperties: false, + required: ['template'], + }, + else: { + type: 'object', + properties: { + template: { + type: ['null', 'string'], + description: 'Template string. If null, default template is used.', + }, + }, + required: ['template'], }, }, - }, + { + type: 'object', + properties: { + type: { + type: 'string', + const: 'file', + description: 'Access log type: stdout, stderr or file', + }, + format: { + type: 'string', + enum: ['text', 'json'], + }, + path: { + type: 'string', + minLength: 1, + }, + template: true, + }, + required: ['type', 'format', 'path'], + additionalProperties: false, + if: { + type: 'object', + properties: { + format: { + const: 'json', + }, + }, + }, + then: { + type: 'object', + properties: { + template: { + type: ['null', 'object'], + additionalProperties: { + type: 'string', + }, + description: 'JSON fields and values. If null, default template is used.', + }, + }, + required: ['template'], + }, + else: { + type: 'object', + properties: { + template: { + type: ['null', 'string'], + description: 'Template string. If null, default template is used.', + }, + }, + required: ['template'], + }, + }, + ], }, - required: ['provider', 'providerConfigs', 'enabled'], - additionalProperties: false, }, }, - required: ['docker', 'http', 'rateLimiter', 'ssl'], additionalProperties: false, + required: ['level', 'accessLogs'], }, + }, + required: ['docker', 'listeners', 'rateLimiter', 'ssl', 'maxHeapSizeInBytes', 'maxConnections', 'upstreams', 'metrics', 'admin', 'log'], + additionalProperties: false, + }, + dapi: { + type: 'object', + properties: { api: { type: 'object', properties: { @@ -469,7 +698,7 @@ export default { additionalProperties: false, }, }, - required: ['envoy', 'api'], + required: ['api'], additionalProperties: false, }, drive: { @@ -520,19 +749,18 @@ export default { type: 'boolean', }, host: { - type: 'string', - minLength: 1, - format: 'ipv4', + $ref: '#/definitions/host', }, port: { $ref: '#/definitions/port', }, - retention_secs: { + retention: { type: 'integer', minimum: 0, + description: 'How many seconds keep data if console is not connected', }, }, - required: ['enabled', 'host', 'port', 'retention_secs'], + required: ['enabled', 'host', 'port', 'retention'], additionalProperties: false, }, validatorSet: { @@ -571,9 +799,12 @@ export default { type: 'integer', minimum: 180, }, + metrics: { + $ref: '#/definitions/enabledHostPort', + }, }, additionalProperties: false, - required: ['docker', 'logs', 'tokioConsole', 'validatorSet', 'chainLock', 'epochTime'], + required: ['docker', 'logs', 'tokioConsole', 'validatorSet', 'chainLock', 'epochTime', 'metrics'], }, tenderdash: { type: 'object', @@ -791,23 +1022,7 @@ export default { additionalProperties: false, }, metrics: { - description: 'Prometheus metrics', - type: 'object', - properties: { - enabled: { - type: 'boolean', - }, - host: { - type: 'string', - minLength: 1, - format: 'ipv4', - }, - port: { - $ref: '#/definitions/port', - }, - }, - required: ['enabled', 'host', 'port'], - additionalProperties: false, + $ref: '#/definitions/enabledHostPort', }, node: { type: 'object', @@ -981,7 +1196,7 @@ export default { type: 'boolean', }, }, - required: ['dapi', 'drive', 'dpns', 'dashpay', 'featureFlags', 'sourcePath', 'masternodeRewardShares', 'withdrawals', 'enable'], + required: ['gateway', 'dapi', 'drive', 'dpns', 'dashpay', 'featureFlags', 'sourcePath', 'masternodeRewardShares', 'withdrawals', 'enable'], additionalProperties: false, }, dashmate: { diff --git a/packages/dashmate/src/config/generateEnvsFactory.js b/packages/dashmate/src/config/generateEnvsFactory.js index 9aedfbb95d..fcb0491ecf 100644 --- a/packages/dashmate/src/config/generateEnvsFactory.js +++ b/packages/dashmate/src/config/generateEnvsFactory.js @@ -44,7 +44,7 @@ export default function generateEnvsFactory(configFile, homeDir, getConfigProfil if (config.get('platform.dapi.api.docker.build.enabled')) { dockerComposeFiles.push('docker-compose.build.dapi_api.yml'); - dockerComposeFiles.push('docker-compose.build.dapi_tx_filter_stream.yml'); + dockerComposeFiles.push('docker-compose.build.dapi_core_streams.yml'); } } @@ -56,6 +56,14 @@ export default function generateEnvsFactory(configFile, homeDir, getConfigProfil dockerComposeFiles.push(insightComposeFile); } + if (config.get('platform.gateway.rateLimiter.enabled')) { + dockerComposeFiles.push('docker-compose.rate_limiter.yml'); + + if (config.get('platform.gateway.rateLimiter.metrics.enabled')) { + dockerComposeFiles.push('docker-compose.rate_limiter.metrics.yml'); + } + } + // we need this for compatibility with old configs const projectIdWithPrefix = configFile.getProjectId() ? `_${configFile.getProjectId()}` : ''; @@ -68,6 +76,11 @@ export default function generateEnvsFactory(configFile, homeDir, getConfigProfil tenderdashLogDirectoryPath = path.dirname(tenderdashLogFilePath); } + let driveAbciMetricsUrl = ''; + if (config.get('platform.drive.abci.metrics.enabled')) { + driveAbciMetricsUrl = 'http://0.0.0.0:29090'; + } + return { DASHMATE_HOME_DIR: homeDir.getPath(), LOCAL_UID: uid, @@ -84,6 +97,8 @@ export default function generateEnvsFactory(configFile, homeDir, getConfigProfil ), DASHMATE_HELPER_DOCKER_IMAGE, PLATFORM_DRIVE_TENDERDASH_LOG_DIRECTORY_PATH: tenderdashLogDirectoryPath, + PLATFORM_GATEWAY_RATE_LIMITER_METRICS_DISABLED: !config.get('platform.gateway.rateLimiter.metrics.enabled'), + PLATFORM_DRIVE_ABCI_METRICS_URL: driveAbciMetricsUrl, ...convertObjectToEnvs(config.getOptions()), }; } diff --git a/packages/dashmate/src/core/wallet/registerMasternode.js b/packages/dashmate/src/core/wallet/registerMasternode.js index d5d2dba275..285c65409b 100644 --- a/packages/dashmate/src/core/wallet/registerMasternode.js +++ b/packages/dashmate/src/core/wallet/registerMasternode.js @@ -46,7 +46,7 @@ export default async function registerMasternode( if (hp) { const platformNodeId = config.get('platform.drive.tenderdash.node.id'); const platformP2PPort = config.get('platform.drive.tenderdash.p2p.port'); - const platformHttpPort = config.get('platform.dapi.envoy.http.port'); + const platformHttpPort = config.get('platform.gateway.listeners.dapiAndDrive.port'); proTxArgs.push(platformNodeId); proTxArgs.push(platformP2PPort.toString()); diff --git a/packages/dashmate/src/helper/scheduleRenewZeroSslCertificateFactory.js b/packages/dashmate/src/helper/scheduleRenewZeroSslCertificateFactory.js index a594315ef1..8b490c6b3e 100644 --- a/packages/dashmate/src/helper/scheduleRenewZeroSslCertificateFactory.js +++ b/packages/dashmate/src/helper/scheduleRenewZeroSslCertificateFactory.js @@ -26,8 +26,8 @@ export default function scheduleRenewZeroSslCertificateFactory( */ async function scheduleRenewZeroSslCertificate(config) { const certificate = await getCertificate( - config.get('platform.dapi.envoy.ssl.providerConfigs.zerossl.apiKey', false), - config.get('platform.dapi.envoy.ssl.providerConfigs.zerossl.id', false), + config.get('platform.gateway.ssl.providerConfigs.zerossl.apiKey', false), + config.get('platform.gateway.ssl.providerConfigs.zerossl.id', false), ); if (!certificate) { @@ -61,8 +61,11 @@ export default function scheduleRenewZeroSslCertificateFactory( configFileRepository.write(configFile); writeConfigTemplates(config); - // Restart Envoy to catch up new SSL certificates - await dockerCompose.execCommand(config, 'dapi_envoy', 'kill -SIGHUP 1'); + // TODO: We can use https://www.envoyproxy.io/docs/envoy/v1.30.1/start/quick-start/configuration-dynamic-filesystem.html#start-quick-start-dynamic-fs-dynamic-lds + // to dynamically update envoy configuration without restarting it + + // Restart Gateway to catch up new SSL certificates + await dockerCompose.execCommand(config, 'gateway', 'kill -SIGHUP 1'); return job.stop(); }, async () => { diff --git a/packages/dashmate/src/listr/prompts/createIpAndPortsForm.js b/packages/dashmate/src/listr/prompts/createIpAndPortsForm.js index 1a2495b8f3..ac93be1a62 100644 --- a/packages/dashmate/src/listr/prompts/createIpAndPortsForm.js +++ b/packages/dashmate/src/listr/prompts/createIpAndPortsForm.js @@ -107,7 +107,7 @@ export default function createIpAndPortsFormFactory(defaultConfigs) { if (initialPlatformHTTPPort === null || initialPlatformHTTPPort === undefined || network === PRESET_MAINNET) { - initialPlatformHTTPPort = defaultConfigs.get(network).get('platform.dapi.envoy.http.port').toString(); + initialPlatformHTTPPort = defaultConfigs.get(network).get('platform.gateway.listeners.dapiAndDrive.port').toString(); } fields.push({ diff --git a/packages/dashmate/src/listr/tasks/platform/waitForNodeToBeReadyTaskFactory.js b/packages/dashmate/src/listr/tasks/platform/waitForNodeToBeReadyTaskFactory.js index 3b1bb0c61c..7953d4bcd1 100644 --- a/packages/dashmate/src/listr/tasks/platform/waitForNodeToBeReadyTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/platform/waitForNodeToBeReadyTaskFactory.js @@ -19,8 +19,8 @@ export default function waitForNodeToBeReadyTaskFactory() { { title: `Wait for node ${config.getName()} to be ready`, task: async () => { - let host = config.get('platform.dapi.envoy.http.host'); - const port = config.get('platform.dapi.envoy.http.port'); + let host = config.get('platform.gateway.listeners.dapiAndDrive.host'); + const port = config.get('platform.gateway.listeners.dapiAndDrive.port'); if (host === '0.0.0.0') { host = '127.0.0.1'; diff --git a/packages/dashmate/src/listr/tasks/setup/regular/configureNodeTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/regular/configureNodeTaskFactory.js index bdcbc554d8..3c227b1d50 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/configureNodeTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/configureNodeTaskFactory.js @@ -86,7 +86,7 @@ export default function configureNodeTaskFactory(createIpAndPortsForm) { ctx.config.set('core.p2p.port', form.coreP2PPort); if (ctx.isHP) { - ctx.config.set('platform.dapi.envoy.http.port', form.platformHTTPPort); + ctx.config.set('platform.gateway.listeners.dapiAndDrive.port', form.platformHTTPPort); ctx.config.set('platform.drive.tenderdash.p2p.port', form.platformP2PPort); } } diff --git a/packages/dashmate/src/listr/tasks/setup/regular/configureSSLCertificateTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/regular/configureSSLCertificateTaskFactory.js index f489be8de3..62c9f154d0 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/configureSSLCertificateTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/configureSSLCertificateTaskFactory.js @@ -91,7 +91,7 @@ export default function configureSSLCertificateTaskFactory( }, }); - ctx.config.set('platform.dapi.envoy.ssl.providerConfigs.zerossl.apiKey', apiKey); + ctx.config.set('platform.gateway.ssl.providerConfigs.zerossl.apiKey', apiKey); return obtainZeroSSLCertificateTask(ctx.config); }, @@ -141,7 +141,7 @@ export default function configureSSLCertificateTaskFactory( }); } - ctx.config.set('platform.dapi.envoy.ssl.provider', ctx.certificateProvider); + ctx.config.set('platform.gateway.ssl.provider', ctx.certificateProvider); // eslint-disable-next-line no-param-reassign task.output = ctx.certificateProvider; diff --git a/packages/dashmate/src/listr/tasks/setup/regular/getConfigurationOutputFromContext.js b/packages/dashmate/src/listr/tasks/setup/regular/getConfigurationOutputFromContext.js index de7f2be963..d9cb36a9cb 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/getConfigurationOutputFromContext.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/getConfigurationOutputFromContext.js @@ -23,7 +23,7 @@ export default async function getConfigurationOutputFromContext(ctx) { if (ctx.isHP) { output += `\n\nPlatform P2P port: ${ctx.config.get('platform.drive.tenderdash.p2p.port')} - Platform HTTP port: ${ctx.config.get('platform.dapi.envoy.http.port')}`; + Platform HTTP port: ${ctx.config.get('platform.gateway.listeners.dapiAndDrive.port')}`; } return output; diff --git a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternode/registerMasternodeWithCoreWallet.js b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternode/registerMasternodeWithCoreWallet.js index 8688af05bd..dda9811bcf 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternode/registerMasternodeWithCoreWallet.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternode/registerMasternodeWithCoreWallet.js @@ -218,7 +218,7 @@ export default function registerMasternodeWithCoreWalletFactory(createIpAndPorts const platformHTTPPort = state.ipAndPorts.platformHTTPPort || defaultConfigs.get(ctx.preset) - .get('platform.dapi.envoy.http.port'); + .get('platform.gateway.listeners.dapiAndDrive.port'); let command; if (ctx.isHP) { diff --git a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js index b65c2c84bf..ce358f56fd 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js @@ -73,7 +73,7 @@ export default function registerMasternodeGuideTaskFactory( ctx.config.set('platform.drive.tenderdash.node.id', deriveTenderdashNodeId(state.platformNodeKey)); ctx.config.set('platform.drive.tenderdash.node.key', state.platformNodeKey); - ctx.config.set('platform.dapi.envoy.http.port', state.ipAndPorts.platformHTTPPort); + ctx.config.set('platform.gateway.listeners.dapiAndDrive.port', state.ipAndPorts.platformHTTPPort); ctx.config.set('platform.drive.tenderdash.p2p.port', state.ipAndPorts.platformP2PPort); } diff --git a/packages/dashmate/src/listr/tasks/setup/setupLocalPresetTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/setupLocalPresetTaskFactory.js index 70a8cd7f96..51e9918a06 100644 --- a/packages/dashmate/src/listr/tasks/setup/setupLocalPresetTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/setupLocalPresetTaskFactory.js @@ -223,7 +223,11 @@ export default function setupLocalPresetTaskFactory( config.set('platform.drive.tenderdash.node.key', key); config.set('platform.drive.abci.tokioConsole.port', config.get('platform.drive.abci.tokioConsole.port') + (i * 100)); - config.set('platform.dapi.envoy.http.port', config.get('platform.dapi.envoy.http.port') + (i * 100)); + config.set('platform.drive.abci.metrics.port', config.get('platform.drive.abci.metrics.port') + (i * 100)); + config.set('platform.gateway.admin.port', config.get('platform.gateway.admin.port') + (i * 100)); + config.set('platform.gateway.listeners.dapiAndDrive.port', config.get('platform.gateway.listeners.dapiAndDrive.port') + (i * 100)); + config.set('platform.gateway.metrics.port', config.get('platform.gateway.metrics.port') + (i * 100)); + config.set('platform.gateway.rateLimiter.metrics.port', config.get('platform.gateway.rateLimiter.metrics.port') + (i * 100)); config.set('platform.drive.tenderdash.p2p.port', config.get('platform.drive.tenderdash.p2p.port') + (i * 100)); config.set('platform.drive.tenderdash.rpc.port', config.get('platform.drive.tenderdash.rpc.port') + (i * 100)); config.set('platform.drive.tenderdash.pprof.port', config.get('platform.drive.tenderdash.pprof.port') + (i * 100)); diff --git a/packages/dashmate/src/listr/tasks/ssl/VerificationServer.js b/packages/dashmate/src/listr/tasks/ssl/VerificationServer.js index 738c427611..eba5de00e4 100644 --- a/packages/dashmate/src/listr/tasks/ssl/VerificationServer.js +++ b/packages/dashmate/src/listr/tasks/ssl/VerificationServer.js @@ -39,8 +39,8 @@ export default class VerificationServer { dots.templateSettings.strip = false; - // Set up Envoy config - const configSubPath = path.join('platform', 'dapi', 'envoy'); + // Set up Gateway config + const configSubPath = path.join('platform', 'gateway'); const templatePath = path.join(TEMPLATES_DIR, configSubPath, '_zerossl_validation.yaml.dot'); const templateString = fs.readFileSync(templatePath, 'utf-8'); const template = dots.template(templateString); @@ -48,9 +48,9 @@ export default class VerificationServer { const route = validationUrl.replace(`http://${config.get('externalIp')}`, ''); const body = validationContent.join('\\n'); - const envoyConfig = template({ route, body }); + const gatewayConfig = template({ route, body }); - const configDir = this.homeDir.joinPath(config.getName(), 'platform', 'dapi', 'envoy'); + const configDir = this.homeDir.joinPath(config.getName(), 'platform', 'gateway'); const configName = path.basename(templatePath, '.dot'); this.configPath = path.join(configDir, configName); @@ -59,7 +59,7 @@ export default class VerificationServer { fs.mkdirSync(configDir); } fs.rmSync(this.configPath, { force: true }); - fs.writeFileSync(this.configPath, envoyConfig, 'utf8'); + fs.writeFileSync(this.configPath, gatewayConfig, 'utf8'); } /** @@ -76,7 +76,7 @@ export default class VerificationServer { return false; } - const image = this.config.get('platform.dapi.envoy.docker.image'); + const image = this.config.get('platform.gateway.docker.image'); const name = 'dashmate-zerossl-validation'; diff --git a/packages/dashmate/src/listr/tasks/ssl/saveCertificateTask.js b/packages/dashmate/src/listr/tasks/ssl/saveCertificateTask.js index b3096936c4..bbcfac1ea0 100644 --- a/packages/dashmate/src/listr/tasks/ssl/saveCertificateTask.js +++ b/packages/dashmate/src/listr/tasks/ssl/saveCertificateTask.js @@ -20,8 +20,7 @@ export default function saveCertificateTaskFactory(homeDir) { const certificatesDir = homeDir.joinPath( config.getName(), 'platform', - 'dapi', - 'envoy', + 'gateway', 'ssl', ); @@ -34,7 +33,7 @@ export default function saveCertificateTaskFactory(homeDir) { const keyFile = path.join(certificatesDir, 'private.key'); fs.writeFileSync(keyFile, ctx.privateKeyFile, 'utf8'); - config.set('platform.dapi.envoy.ssl.enabled', true); + config.set('platform.gateway.ssl.enabled', true); }, }]); } diff --git a/packages/dashmate/src/listr/tasks/ssl/zerossl/obtainZeroSSLCertificateTaskFactory.js b/packages/dashmate/src/listr/tasks/ssl/zerossl/obtainZeroSSLCertificateTaskFactory.js index 16e5c66933..12718ad4de 100644 --- a/packages/dashmate/src/listr/tasks/ssl/zerossl/obtainZeroSSLCertificateTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/ssl/zerossl/obtainZeroSSLCertificateTaskFactory.js @@ -37,10 +37,10 @@ export default function obtainZeroSSLCertificateTaskFactory( */ async function obtainZeroSSLCertificateTask(config) { // Make sure that required config options are set - const apiKey = config.get('platform.dapi.envoy.ssl.providerConfigs.zerossl.apiKey', true); + const apiKey = config.get('platform.gateway.ssl.providerConfigs.zerossl.apiKey', true); const externalIp = config.get('externalIp', true); - const sslConfigDir = homeDir.joinPath(config.getName(), 'platform', 'dapi', 'envoy', 'ssl'); + const sslConfigDir = homeDir.joinPath(config.getName(), 'platform', 'gateway', 'ssl'); const csrFilePath = path.join(sslConfigDir, 'csr.pem'); const privateKeyFilePath = path.join(sslConfigDir, 'private.key'); const bundleFilePath = path.join(sslConfigDir, 'bundle.crt'); @@ -54,7 +54,7 @@ export default function obtainZeroSSLCertificateTaskFactory( // Skips the check if force flag is set skip: (ctx) => ctx.force, task: async (ctx, task) => { - const certificateId = await config.get('platform.dapi.envoy.ssl.providerConfigs.zerossl.id'); + const certificateId = await config.get('platform.gateway.ssl.providerConfigs.zerossl.id'); if (!certificateId) { // Certificate is not configured @@ -179,9 +179,9 @@ export default function obtainZeroSSLCertificateTaskFactory( apiKey, ); - config.set('platform.dapi.envoy.ssl.enabled', true); - config.set('platform.dapi.envoy.ssl.provider', 'zerossl'); - config.set('platform.dapi.envoy.ssl.providerConfigs.zerossl.id', ctx.certificate.id); + config.set('platform.gateway.ssl.enabled', true); + config.set('platform.gateway.ssl.provider', 'zerossl'); + config.set('platform.gateway.ssl.providerConfigs.zerossl.id', ctx.certificate.id); }, }, { diff --git a/packages/dashmate/src/listr/tasks/startNodeTaskFactory.js b/packages/dashmate/src/listr/tasks/startNodeTaskFactory.js index ac2ea87a0c..9c0308b28c 100644 --- a/packages/dashmate/src/listr/tasks/startNodeTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/startNodeTaskFactory.js @@ -45,16 +45,22 @@ export default function startNodeTaskFactory( // Check Drive log files are created if (config.get('platform.enable')) { + // Ensure log files for Drive are created const loggers = config.get('platform.drive.abci.logs'); - - for (const logger of Object.values(loggers)) { - if (['stdout', 'stderr'].includes(logger.destination)) { - continue; - } - - ensureFileMountExists(logger.destination, 0o666); - } - + Object.values(loggers) + .filter((logger) => logger.destination !== 'stdout' && logger.destination !== 'stderr') + .forEach((logger) => { + ensureFileMountExists(logger.destination, 0o666); + }); + + // Ensure access log files for Gateway are created + config.get('platform.gateway.log.accessLogs') + .filter((log) => log.type === 'file') + .forEach((log) => { + ensureFileMountExists(log.path, 0o666); + }); + + // Ensure tenderdash log file is created const tenderdashLogFilePath = config.get('platform.drive.tenderdash.log.path'); if (tenderdashLogFilePath !== null) { ensureFileMountExists(tenderdashLogFilePath, 0o666); diff --git a/packages/dashmate/src/status/scopes/platform.js b/packages/dashmate/src/status/scopes/platform.js index ad640a3076..b826775229 100644 --- a/packages/dashmate/src/status/scopes/platform.js +++ b/packages/dashmate/src/status/scopes/platform.js @@ -77,7 +77,7 @@ export default function getPlatformScopeFactory( // Collecting platform data fails if Tenderdash is waiting for core to sync if (info.serviceStatus === ServiceStatusEnum.up) { const portStatusResult = await Promise.allSettled([ - providers.mnowatch.checkPortStatus(config.get('platform.dapi.envoy.http.port')), + providers.mnowatch.checkPortStatus(config.get('platform.gateway.listeners.dapiAndDrive.port')), providers.mnowatch.checkPortStatus(config.get('platform.drive.tenderdash.p2p.port')), ]); const [httpPortState, p2pPortState] = portStatusResult.map((result) => (result.status === 'fulfilled' ? result.value : null)); @@ -185,7 +185,7 @@ export default function getPlatformScopeFactory( * @returns {Promise} */ async function getPlatformScope(config) { - const httpPort = config.get('platform.dapi.envoy.http.port'); + const httpPort = config.get('platform.gateway.listeners.dapiAndDrive.port'); const httpService = config.get('externalIp') ? `${config.get('externalIp')}:${httpPort}` : null; const p2pPort = config.get('platform.drive.tenderdash.p2p.port'); const p2pService = config.get('externalIp') ? `${config.get('externalIp')}:${p2pPort}` : null; diff --git a/packages/dashmate/src/test/constants/services.js b/packages/dashmate/src/test/constants/services.js index 1b29357cbb..beb3d1d9aa 100644 --- a/packages/dashmate/src/test/constants/services.js +++ b/packages/dashmate/src/test/constants/services.js @@ -1,9 +1,9 @@ export default { dashmate_helper: 'Dashmate Helper', - dapi_envoy: 'DAPI Envoy', + gateway: 'Gateway', dapi_api: 'DAPI API', drive_tenderdash: 'Drive Tenderdash', drive_abci: 'Drive ABCI', - dapi_tx_filter_stream: 'DAPI Transactions Filter Stream', + dapi_core_streams: 'DAPI Core Streams', core: 'Core', }; diff --git a/packages/dashmate/src/test/mock/getConfigMock.js b/packages/dashmate/src/test/mock/getConfigMock.js index 0e30ce5e0b..1961c48f28 100644 --- a/packages/dashmate/src/test/mock/getConfigMock.js +++ b/packages/dashmate/src/test/mock/getConfigMock.js @@ -9,11 +9,11 @@ export default function getConfigMock(sinon) { configMock.get.withArgs('core.rpc.host').returns('127.0.0.1'); configMock.get.withArgs('docker.network.privateInterface').returns('127.0.0.1'); configMock.get.withArgs('docker.network.privateInterface').returns('127.0.0.1'); - configMock.get.withArgs('platform.dapi.envoy.http.port').returns('8100'); + configMock.get.withArgs('platform.gateway.listeners.dapiAndDrive.port').returns('8100'); configMock.get.withArgs('externalIp').returns('127.0.0.1'); configMock.get.withArgs('platform.drive.tenderdash.p2p.port').returns('8101'); - configMock.get.withArgs('platform.dapi.envoy.http.host').returns('0.0.0.0'); - configMock.get.withArgs('platform.dapi.envoy.http.port').returns('8102'); + configMock.get.withArgs('platform.gateway.listeners.dapiAndDrive.host').returns('0.0.0.0'); + configMock.get.withArgs('platform.gateway.listeners.dapiAndDrive.port').returns('8102'); configMock.get.withArgs('platform.drive.tenderdash.rpc.host').returns('127.0.0.1'); configMock.get.withArgs('platform.drive.tenderdash.rpc.port').returns('8103'); configMock.get.withArgs('platform.enable').returns(true); diff --git a/packages/dashmate/templates/dynamic-compose.yml.dot b/packages/dashmate/templates/dynamic-compose.yml.dot index 84fed7fa04..c0055e6949 100644 --- a/packages/dashmate/templates/dynamic-compose.yml.dot +++ b/packages/dashmate/templates/dynamic-compose.yml.dot @@ -17,3 +17,12 @@ services: - {{=settings.destination}}:/var/log/dash/drive/{{=name}}/{{=settings.destination.split('/').reverse()[0]}} {{~}} {{?}} + + {{ gatewayLogs = it.platform.gateway.log.accessLogs.filter((l) => l.type === 'file'); }} + {{? gatewayLogs.length > 0 }} + gateway: + volumes: + {{~ gatewayLogs :log }} + - {{= log.path }}:/var/log/{{= log.path.split('/').reverse()[0] }} + {{~}} + {{?}} diff --git a/packages/dashmate/templates/platform/dapi/envoy/envoy.yaml.dot b/packages/dashmate/templates/platform/dapi/envoy/envoy.yaml.dot deleted file mode 100644 index dab78d565f..0000000000 --- a/packages/dashmate/templates/platform/dapi/envoy/envoy.yaml.dot +++ /dev/null @@ -1,263 +0,0 @@ -!ignore filters: &filters - - name: envoy.http_connection_manager - typed_config: - "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager - stat_prefix: ingress_http - codec_type: auto - access_log: - - name: envoy.access_loggers.file - typed_config: - "@type": type.googleapis.com/envoy.extensions.access_loggers.file.v3.FileAccessLog - path: /dev/stdout - log_format: - json_format: - timestamp: "%START_TIME%" - client: "%DOWNSTREAM_REMOTE_ADDRESS_WITHOUT_PORT%" - protocol: "%PROTOCOL%" - method: "%REQ(:METHOD)%" - uri: "%REQ(X-ENVOY-ORIGINAL-PATH?:PATH)%" - upstream: "%UPSTREAM_HOST%" - "http-status": "%RESPONSE_CODE%" - "grpc-status": "%GRPC_STATUS%" - "rx-bytes": "%BYTES_RECEIVED%" - "tx-bytes": "%BYTES_SENT%" - "response-flags": "%RESPONSE_FLAGS%" - duration: "%DURATION%" - authority: "%REQ(:AUTHORITY)%" - http_filters: - - name: envoy.filters.http.local_ratelimit - typed_config: - "@type": type.googleapis.com/envoy.extensions.filters.http.local_ratelimit.v3.LocalRateLimit - stat_prefix: http_local_rate_limiter - # see documentation https://www.envoyproxy.io/docs/envoy/latest/api-v3/type/v3/token_bucket.proto#envoy-v3-api-msg-type-v3-tokenbucket - token_bucket: - max_tokens: {{=it.platform.dapi.envoy.rateLimiter.maxTokens}} - tokens_per_fill: {{=it.platform.dapi.envoy.rateLimiter.tokensPerFill}} - fill_interval: {{=it.platform.dapi.envoy.rateLimiter.fillInterval}} - filter_enabled: - runtime_key: local_rate_limit_enabled - default_value: - numerator: {{? it.platform.dapi.envoy.rateLimiter.enabled}}100{{??}}0{{?}} - denominator: HUNDRED - filter_enforced: - runtime_key: local_rate_limit_enforced - default_value: - numerator: 100 - denominator: HUNDRED - response_headers_to_add: - - append: false - header: - key: x-local-rate-limit - value: 'true' - - name: envoy.filters.http.grpc_web - typed_config: - "@type": type.googleapis.com/envoy.extensions.filters.http.grpc_web.v3.GrpcWeb - - name: envoy.filters.http.cors - typed_config: - "@type": type.googleapis.com/envoy.extensions.filters.http.cors.v3.Cors - - name: envoy.filters.http.router - typed_config: - "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router - route_config: - name: local_route - virtual_hosts: - - name: dapi_services - domains: [ "*" ] - routes: - # DAPI core streaming endpoints - - match: - prefix: "/org.dash.platform.dapi.v0.Core/subscribeTo" - route: - cluster: dapi_tx_filter_stream - timeout: 660s - max_stream_duration: - grpc_timeout_header_max: 600s - # Other DAPI Core endpoints - - match: - prefix: "/org.dash.platform.dapi.v0.Core" - route: - cluster: dapi_api - timeout: {{= it.platform.dapi.envoy.http.responseTimeout }} - # DAPI waitForStateTransitionResult endpoint with bigger timeout - - match: - path: "/org.dash.platform.dapi.v0.Platform/waitForStateTransitionResult" - route: - cluster: dapi_api - timeout: 80s - # DAPI getConsensusParams endpoint - - match: - path: "/org.dash.platform.dapi.v0.Platform/getConsensusParams" - route: - cluster: dapi_api - timeout: {{= it.platform.dapi.envoy.http.responseTimeout }} - # DAPI broadcastStateTransition endpoint - - match: - path: "/org.dash.platform.dapi.v0.Platform/broadcastStateTransition" - route: - cluster: dapi_api - timeout: {{= it.platform.dapi.envoy.http.responseTimeout }} - # Drive gRPC endpoints - - match: - prefix: "/org.dash.platform.dapi.v0.Platform" - route: - cluster: drive_grpc - timeout: {{= it.platform.dapi.envoy.http.responseTimeout }} - # Static responses of unsupported api versions - # core static response - - match: - safe_regex: - google_re2: { } - regex: "\/org\\.dash\\.platform\\.dapi\\.v[1-9]+\\." - response_headers_to_add: - - header: - key: "Content-Type" - value: "application/grpc-web+proto" - - header: - key: "grpc-status" - value: "12" - - header: - key: "grpc-message" - value: "Specified service version is not supported" - direct_response: - status: 204 - # JSON RPC endpoints - - match: - path: "/" - route: - cluster: dapi_json_rpc - cors: - allow_origin_string_match: - - prefix: "*" - allow_methods: GET, PUT, DELETE, POST, OPTIONS - allow_headers: keep-alive,user-agent,cache-control,content-type,content-transfer-encoding,custom-header-1,x-accept-content-transfer-encoding,x-accept-response-streaming,x-user-agent,x-grpc-web,grpc-timeout - max_age: "1728000" - expose_headers: custom-header-1,grpc-status,grpc-message - -static_resources: - listeners: - - name: grpc_and_json_rpc - address: - socket_address: - address: 0.0.0.0 - port_value: 10000 - {{? it.platform.dapi.envoy.ssl.provider === 'self-signed'}} - listener_filters: - - name: envoy.filters.listener.tls_inspector - typed_config: - "@type": type.googleapis.com/envoy.extensions.filters.listener.tls_inspector.v3.TlsInspector - filter_chains: - - filter_chain_match: - transport_protocol: raw_buffer - filters: *filters - - filter_chain_match: - transport_protocol: tls - filters: *filters - transport_socket: - name: envoy.transport_sockets.tls - typed_config: - "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext - common_tls_context: - alpn_protocols: [ "h2, http/1.1" ] - tls_certificates: - - certificate_chain: - filename: "/etc/ssl/bundle.crt" - private_key: - filename: "/etc/ssl/private.key" - {{??}} - filter_chains: - filters: *filters - transport_socket: - name: envoy.transport_sockets.tls - typed_config: - "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext - common_tls_context: - alpn_protocols: [ "h2, http/1.1" ] - tls_certificates: - - certificate_chain: - filename: "/etc/ssl/bundle.crt" - private_key: - filename: "/etc/ssl/private.key" - {{?}} - clusters: - - name: dapi_api - connect_timeout: {{= it.platform.dapi.envoy.http.connectTimeout }} - type: logical_dns - lb_policy: round_robin - typed_extension_protocol_options: - envoy.extensions.upstreams.http.v3.HttpProtocolOptions: - "@type": type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions - explicit_http_config: - http2_protocol_options: - connection_keepalive: - interval: 30s - timeout: 5s - load_assignment: - cluster_name: dapi_api - endpoints: - - lb_endpoints: - - endpoint: - address: - socket_address: - address: dapi_api - port_value: 3005 - - name: dapi_tx_filter_stream - connect_timeout: {{= it.platform.dapi.envoy.http.connectTimeout }} - type: logical_dns - lb_policy: round_robin - typed_extension_protocol_options: - envoy.extensions.upstreams.http.v3.HttpProtocolOptions: - "@type": type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions - explicit_http_config: - http2_protocol_options: - connection_keepalive: - interval: 30s - timeout: 5s - load_assignment: - cluster_name: dapi_tx_filter_stream - endpoints: - - lb_endpoints: - - endpoint: - address: - socket_address: - address: dapi_tx_filter_stream - port_value: 3006 - - name: dapi_json_rpc - connect_timeout: {{= it.platform.dapi.envoy.http.connectTimeout }} - type: logical_dns - lb_policy: round_robin - load_assignment: - cluster_name: dapi_json_rpc - endpoints: - - lb_endpoints: - - endpoint: - address: - socket_address: - address: dapi_api - port_value: 3004 - - name: drive_grpc - connect_timeout: {{= it.platform.dapi.envoy.http.connectTimeout }} - type: logical_dns - lb_policy: round_robin - typed_extension_protocol_options: - envoy.extensions.upstreams.http.v3.HttpProtocolOptions: - "@type": type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions - explicit_http_config: - http2_protocol_options: - connection_keepalive: - interval: 30s - timeout: 5s - load_assignment: - cluster_name: drive_grpc - endpoints: - - lb_endpoints: - - endpoint: - address: - socket_address: - address: drive_abci - port_value: 26670 - -admin: - address: - socket_address: - address: 0.0.0.0 # For docker container only. Must be a local/private interface. - port_value: 8081 diff --git a/packages/dashmate/templates/platform/dapi/envoy/_zerossl_validation.yaml.dot b/packages/dashmate/templates/platform/gateway/_zerossl_validation.yaml.dot similarity index 100% rename from packages/dashmate/templates/platform/dapi/envoy/_zerossl_validation.yaml.dot rename to packages/dashmate/templates/platform/gateway/_zerossl_validation.yaml.dot diff --git a/packages/dashmate/templates/platform/gateway/envoy.yaml.dot b/packages/dashmate/templates/platform/gateway/envoy.yaml.dot new file mode 100644 index 0000000000..3aa31efbb9 --- /dev/null +++ b/packages/dashmate/templates/platform/gateway/envoy.yaml.dot @@ -0,0 +1,487 @@ +!ignore filters: &filters + - name: envoy.http_connection_manager + typed_config: + "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager + stat_prefix: ingress_http + normalize_path: true + merge_slashes: true + use_remote_address: true + path_with_escaped_slashes_action: UNESCAPE_AND_REDIRECT + # Settings applied both to HTTP1 and HTTP2 + common_http_protocol_options: + # A single HTTP connection timeout. + max_connection_duration: 600s + # How long to keep the connection alive when there are no streams (requests). + idle_timeout: 300s + # Request (stream) timeout. + # HTTP2 support multiple streams (requests) per connection. + # For HTTP1 it applies for single request. + # This param is overwritten in specific routes. + max_stream_duration: 15s + # Reject malformed requests with headers containing underscores. + headers_with_underscores_action: REJECT_REQUEST + # HTTP2 specific settings + http2_protocol_options: + # As a side effect this field acts as a soft limit on the number of bytes Envoy will buffer per-stream in the + # QUIC stream send and receive buffers. Once the buffer reaches this pointer, watermark callbacks will fire + # to stop the flow of data to the stream buffers. So we reduce it from 16 MiB to 64 KiB + initial_stream_window_size: 65536 # 64 KiB + # The same but for connection-level flow-control + initial_connection_window_size: 1048576 # 1 MiB + # This option sets the maximum number of concurrent streams allowed for each connection. + # It means N requests can be in flight at the same time on a single connection. + max_concurrent_streams: {{= it.platform.gateway.listeners.dapiAndDrive.http2.maxConcurrentStreams }} + # Stream idle timeout + stream_idle_timeout: 15s +{{? it.platform.gateway.log.accessLogs }} + access_log: + {{~ it.platform.gateway.log.accessLogs :log }} + {{ loggerType = {file: 'file.v3.FileAccessLog', stdout: 'stream.v3.StdoutAccessLog', stderr: 'stream.v3.StderrAccessLog'}; }} + - name: envoy.access_loggers.{{=log.type}} + typed_config: + "@type": type.googleapis.com/envoy.extensions.access_loggers.{{=loggerType[log.type]}} + {{? log.type === 'file' }} + path: "/var/log/{{=log.path.split('/').reverse()[0]}}" + {{?? log.type === 'stream' }} + {{=log.destination}} + {{?}} + log_format: + {{? log.format === 'json' }} + json_format: + {{? log.template === null }} + timestamp: "%START_TIME%" + client: "%DOWNSTREAM_REMOTE_ADDRESS_WITHOUT_PORT%" + protocol: "%PROTOCOL%" + method: "%REQ(:METHOD)%" + uri: "%REQ(X-ENVOY-ORIGINAL-PATH?:PATH)%" + "http-status": "%RESPONSE_CODE%" + "grpc-status": "%GRPC_STATUS%" + "rx-bytes": "%BYTES_RECEIVED%" + "tx-bytes": "%BYTES_SENT%" + "response-flags": "%RESPONSE_FLAGS%" + duration: "%DURATION%" + {{??}} + {{ template = Object.entries(log.template); }} + {{~ template :entry }} + "{{=entry[0]}}": "{{=entry[1]}}" + {{~}} + {{?}} + {{??}} + text_format_source: + {{? log.template === null }} + inline_string: "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)%\" %RESPONSE_CODE% %GRPC_STATUS% %RESPONSE_FLAGS% R:%BYTES_RECEIVED% S:%BYTES_SENT% D:%DURATION%\n" + {{??}} + inline_string: "{{=log.template}}\n" + {{?}} + {{?}} + {{~}} +{{?}} + http_filters: + # TODO: Introduce when stable https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_filters/adaptive_concurrency_filter.html + {{? it.platform.gateway.rateLimiter.enabled}} + - name: envoy.filters.http.ratelimit + typed_config: + "@type": type.googleapis.com/envoy.extensions.filters.http.ratelimit.v3.RateLimit + domain: edge_proxy_per_ip + # The rate limit service timeout before the request is considered failed + timeout: 5s + # Reject a request if rate limit service is unavailable + failure_mode_deny: true + # Respond with RESOURCE_EXHAUSTED status code if request is rejected + rate_limited_as_resource_exhausted: true + rate_limit_service: + grpc_service: + envoy_grpc: + cluster_name: ratelimit_service + timeout: 0.5s + transport_api_version: V3 + {{?}} + - name: envoy.filters.http.grpc_web + typed_config: + "@type": type.googleapis.com/envoy.extensions.filters.http.grpc_web.v3.GrpcWeb + - name: envoy.filters.http.cors + typed_config: + "@type": type.googleapis.com/envoy.extensions.filters.http.cors.v3.Cors + - name: envoy.filters.http.router + typed_config: + "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router + route_config: + name: local_route + virtual_hosts: + - name: http_services + domains: [ "*" ] + routes: + # DAPI core streaming endpoints + - match: + prefix: "/org.dash.platform.dapi.v0.Core/subscribeTo" + route: + cluster: dapi_core_streams + idle_timeout: 300s + # Upstream response timeout + timeout: 600s + max_stream_duration: + # Entire stream/request timeout + max_stream_duration: 600s + grpc_timeout_header_max: 600s + # Other DAPI Core endpoints + - match: + prefix: "/org.dash.platform.dapi.v0.Core" + route: + cluster: dapi_api + # Upstream response timeout + timeout: 15s + # DAPI waitForStateTransitionResult endpoint with bigger timeout + - match: + path: "/org.dash.platform.dapi.v0.Platform/waitForStateTransitionResult" + route: + cluster: dapi_api + idle_timeout: 80s + # Upstream response timeout + timeout: 80s + max_stream_duration: + # Entire stream/request timeout + max_stream_duration: 80s + grpc_timeout_header_max: 80s + # DAPI getConsensusParams endpoint + - match: + path: "/org.dash.platform.dapi.v0.Platform/getConsensusParams" + route: + cluster: dapi_api + # Upstream response timeout + timeout: 10s + # DAPI broadcastStateTransition endpoint + - match: + path: "/org.dash.platform.dapi.v0.Platform/broadcastStateTransition" + route: + cluster: dapi_api + # Upstream response timeout + timeout: 10s + # getProofs endpoint only for internal use (DAPI -> Drive) + - match: + path: "/org.dash.platform.dapi.v0.Platform/getProofs" + response_headers_to_add: + - header: + key: "Content-Type" + value: "application/grpc-web+proto" + - header: + key: "grpc-status" + value: "12" + - header: + key: "grpc-message" + value: "getProofs endpoint is only for internal use" + direct_response: + status: 204 + # Drive gRPC endpoints + - match: + prefix: "/org.dash.platform.dapi.v0.Platform" + route: + cluster: drive_grpc + # Upstream response timeout + timeout: 10s + # Static responses of unsupported api versions + # core static response + - match: + safe_regex: + regex: "\/org\\.dash\\.platform\\.dapi\\.v[1-9]+\\." + response_headers_to_add: + - header: + key: "Content-Type" + value: "application/grpc-web+proto" + - header: + key: "grpc-status" + value: "12" + - header: + key: "grpc-message" + value: "Specified service version is not supported" + direct_response: + status: 204 + # JSON RPC endpoints + - match: + path: "/" + route: + cluster: dapi_json_rpc + # Upstream response timeout + timeout: 10s + {{? it.platform.gateway.rateLimiter.enabled }} + rate_limits: + - actions: + remote_address: {} + {{?}} + typed_per_filter_config: + envoy.filters.http.cors: + "@type": type.googleapis.com/envoy.extensions.filters.http.cors.v3.CorsPolicy + allow_origin_string_match: + - prefix: "*" + allow_methods: GET, PUT, DELETE, POST, OPTIONS + allow_headers: keep-alive,user-agent,cache-control,content-type,content-transfer-encoding,custom-header-1,x-accept-content-transfer-encoding,x-accept-response-streaming,x-user-agent,x-grpc-web,grpc-timeout + max_age: "1728000" + expose_headers: custom-header-1,grpc-status,grpc-message + +static_resources: + listeners: + - name: dapi_and_drive + address: + socket_address: + address: 0.0.0.0 # For docker container only. Must be a local/private interface. + port_value: 10000 + {{? it.platform.gateway.ssl.provider === 'self-signed'}} + listener_filters: + - name: envoy.filters.listener.tls_inspector + typed_config: + "@type": type.googleapis.com/envoy.extensions.filters.listener.tls_inspector.v3.TlsInspector + per_connection_buffer_limit_bytes: 32768 # 32 KiB + filter_chains: + - filter_chain_match: + transport_protocol: raw_buffer + filters: *filters + - filter_chain_match: + transport_protocol: tls + filters: *filters + transport_socket: + name: envoy.transport_sockets.tls + typed_config: + "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext + common_tls_context: + alpn_protocols: [ "h2, http/1.1" ] + tls_certificates: + - certificate_chain: + filename: "/etc/ssl/bundle.crt" + private_key: + filename: "/etc/ssl/private.key" + {{??}} + filter_chains: + filters: *filters + transport_socket: + name: envoy.transport_sockets.tls + typed_config: + "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext + common_tls_context: + alpn_protocols: [ "h2, http/1.1" ] + tls_certificates: + - certificate_chain: + filename: "/etc/ssl/bundle.crt" + private_key: + filename: "/etc/ssl/private.key" + {{?}} + {{? it.platform.gateway.metrics.enabled }} + # Forward /stats/prometheus (which is a part of admin endpoint) + # to a separate listener with default Prometheus path /metrics + - name: prometheus_metrics + address: + socket_address: + address: "0.0.0.0" + port_value: 9090 + filter_chains: + - filters: + - name: "envoy.http_connection_manager" + typed_config: + "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager + stat_prefix: ingress_metrics + route_config: + name: local_route + virtual_hosts: + - name: local_service + domains: [ "*" ] + routes: + - match: + prefix: "/metrics" + route: + cluster: admin + prefix_rewrite: "/stats/prometheus" + http_filters: + - name: envoy.filters.http.router + typed_config: + "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router + {{?}} + clusters: + - name: dapi_api + type: STRICT_DNS + per_connection_buffer_limit_bytes: 32768 # 32 KiB + typed_extension_protocol_options: + envoy.extensions.upstreams.http.v3.HttpProtocolOptions: + "@type": type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions + explicit_http_config: + http2_protocol_options: + initial_stream_window_size: 65536 # 64 KiB + initial_connection_window_size: 1048576 # 1 MiB + circuit_breakers: + thresholds: + - priority: DEFAULT + # The maximum number of parallel requests + max_requests: {{= it.platform.gateway.upstreams.dapiApi.maxRequests }} + load_assignment: + cluster_name: dapi_api + endpoints: + - lb_endpoints: + - endpoint: + address: + socket_address: + address: dapi_api + port_value: 3005 + - name: dapi_core_streams + type: STRICT_DNS + per_connection_buffer_limit_bytes: 32768 # 32 KiB + typed_extension_protocol_options: + envoy.extensions.upstreams.http.v3.HttpProtocolOptions: + "@type": type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions + explicit_http_config: + http2_protocol_options: + initial_stream_window_size: 65536 # 64 KiB + initial_connection_window_size: 1048576 # 1 MiB + circuit_breakers: + thresholds: + - priority: DEFAULT + max_requests: {{= it.platform.gateway.upstreams.dapiCoreStreams.maxRequests }} + load_assignment: + cluster_name: dapi_core_streams + endpoints: + - lb_endpoints: + - endpoint: + address: + socket_address: + address: dapi_core_streams + port_value: 3006 + - name: dapi_json_rpc + type: STRICT_DNS + per_connection_buffer_limit_bytes: 32768 # 32 KiB + circuit_breakers: + thresholds: + - priority: DEFAULT + # The maximum number of parallel connections + max_connections: {{= it.platform.gateway.upstreams.dapiJsonRpc.maxRequests }} + # The maximum number of parallel requests + max_requests: {{= it.platform.gateway.upstreams.dapiJsonRpc.maxRequests }} + load_assignment: + cluster_name: dapi_json_rpc + endpoints: + - lb_endpoints: + - endpoint: + address: + socket_address: + address: dapi_api + port_value: 3004 + - name: drive_grpc + type: STRICT_DNS + per_connection_buffer_limit_bytes: 32768 # 32 KiB + typed_extension_protocol_options: + envoy.extensions.upstreams.http.v3.HttpProtocolOptions: + "@type": type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions + explicit_http_config: + http2_protocol_options: + initial_stream_window_size: 65536 # 64 KiB + initial_connection_window_size: 1048576 # 1 MiB + circuit_breakers: + thresholds: + - priority: DEFAULT + # The maximum number of parallel requests. + max_requests: {{= it.platform.gateway.upstreams.driveGrpc.maxRequests }} + load_assignment: + cluster_name: drive_grpc + endpoints: + - lb_endpoints: + - endpoint: + address: + socket_address: + address: drive_abci + port_value: 26670 + {{? it.platform.gateway.rateLimiter.enabled }} + - name: ratelimit_service + type: STRICT_DNS + connect_timeout: 1s + protocol_selection: USE_CONFIGURED_PROTOCOL + typed_extension_protocol_options: + envoy.extensions.upstreams.http.v3.HttpProtocolOptions: + "@type": type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions + explicit_http_config: + http2_protocol_options: {} + load_assignment: + cluster_name: ratelimit_service + endpoints: + - lb_endpoints: + - endpoint: + address: + socket_address: + address: gateway_rate_limiter + port_value: 8081 + {{?}} + {{? it.platform.gateway.metrics.enabled && it.platform.gateway.admin.enabled }} + - name: admin + connect_timeout: 0.25s + type: STATIC + load_assignment: + cluster_name: admin + endpoints: + - lb_endpoints: + - endpoint: + address: + socket_address: + address: "127.0.0.1" + port_value: 9901 + {{?}} + +{{? it.platform.gateway.admin.enabled }} +admin: + address: + socket_address: + address: 0.0.0.0 # For docker container only. Must be a local/private interface. + port_value: 9901 +{{?}} + +# Dynamically adjust limits based on memory usage and number of active connections +# TODO: We can use data provided by drive, tenderdash, or dapi to configure adaptive limits based on load +# https://www.envoyproxy.io/docs/envoy/v1.30.1/api-v3/extensions/resource_monitors/injected_resource/v3/injected_resource.proto +overload_manager: + refresh_interval: 0.25s + resource_monitors: + # Monitor heap size + - name: "envoy.resource_monitors.fixed_heap" + typed_config: + "@type": type.googleapis.com/envoy.extensions.resource_monitors.fixed_heap.v3.FixedHeapConfig + # Maximum heap size in bytes. If the heap size exceeds this value, Envoy will take actions to reduce memory usage. + max_heap_size_bytes: {{= it.platform.gateway.maxHeapSizeInBytes }} + # Monitor the number of active downstream connections + - name: "envoy.resource_monitors.global_downstream_max_connections" + typed_config: + "@type": type.googleapis.com/envoy.extensions.resource_monitors.downstream_connections.v3.DownstreamConnectionsConfig + max_active_downstream_connections: {{= it.platform.gateway.maxConnections }} + actions: + # Reduce the heap size by releasing free memory if the current heap size is 92% of the maximum heap size. + - name: "envoy.overload_actions.shrink_heap" + triggers: + - name: "envoy.resource_monitors.fixed_heap" + threshold: + value: 0.92 + # Disable HTTP keepalive connections if the current heap size is 92% of the maximum heap size + # OR the number of active downstream connections is 95% of the maximum number of connections. + # Envoy will drain HTTP/2 and HTTP/3 connections using GOAWAY with a drain grace period. + # For HTTP/1, Envoy will set a drain timer to close the more idle recently used connections. + - name: "envoy.overload_actions.disable_http_keepalive" + triggers: + - name: "envoy.resource_monitors.fixed_heap" + threshold: + value: 0.92 + - name: "envoy.resource_monitors.global_downstream_max_connections" + threshold: + value: 0.95 + # Stop accepting new HTTP connections in configured listeners if the number of active downstream + # connections reached the maximum. + # TODO: Use `envoy.load_shed_points.tcp_listener_accept` instead `envoy.overload_actions.stop_accepting_connections` + # when `loadshed_points` start to support `global_downstream_max_connections` monitor. + - name: "envoy.overload_actions.stop_accepting_connections" + triggers: + - name: "envoy.resource_monitors.global_downstream_max_connections" + threshold: + value: 1.0 + # Stop accepting new HTTP requests if the current heap size is 95% of the maximum heap size. + - name: "envoy.overload_actions.stop_accepting_requests" + triggers: + - name: "envoy.resource_monitors.fixed_heap" + threshold: + value: 0.95 + loadshed_points: + # Stop accepting new TCP connections if the current heap size is 95% of the maximum heap size + - name: "envoy.load_shed_points.tcp_listener_accept" + triggers: + - name: "envoy.resource_monitors.fixed_heap" + threshold: + value: 0.95 diff --git a/packages/dashmate/templates/platform/gateway/rate_limiter/rate_limiter.yaml.dot b/packages/dashmate/templates/platform/gateway/rate_limiter/rate_limiter.yaml.dot new file mode 100644 index 0000000000..4e40286ada --- /dev/null +++ b/packages/dashmate/templates/platform/gateway/rate_limiter/rate_limiter.yaml.dot @@ -0,0 +1,23 @@ +domain: edge_proxy_per_ip +descriptors: + - key: remote_address + rate_limit: + unit: {{= it.platform.gateway.rateLimiter.unit }} + requests_per_unit: {{= it.platform.gateway.rateLimiter.requestsPerUnit }} + + # Blacklisted IPs + {{~ it.platform.gateway.rateLimiter.blacklist :ip }} + - key: remote_address + value: {{= ip }} + rate_limit: + unit: second + requests_per_unit: 0 + {{~}} + + # Whitelisted IPs + {{~ it.platform.gateway.rateLimiter.whitelist :ip }} + - key: remote_address + value: {{= ip }} + rate_limit: + unlimited: true + {{~}} diff --git a/packages/dashmate/templates/platform/gateway/rate_limiter/statsd_exporter.yaml.dot b/packages/dashmate/templates/platform/gateway/rate_limiter/statsd_exporter.yaml.dot new file mode 100644 index 0000000000..31f16dd6a5 --- /dev/null +++ b/packages/dashmate/templates/platform/gateway/rate_limiter/statsd_exporter.yaml.dot @@ -0,0 +1,93 @@ +mappings: # Requires statsd exporter >= v0.6.0 since it uses the "drop" action. + - match: "ratelimit.service.rate_limit.*.*.near_limit" + name: "ratelimit_service_rate_limit_near_limit" + timer_type: "histogram" + labels: + domain: "$1" + key1: "$2" + - match: "ratelimit.service.rate_limit.*.*.over_limit" + name: "ratelimit_service_rate_limit_over_limit" + timer_type: "histogram" + labels: + domain: "$1" + key1: "$2" + - match: "ratelimit.service.rate_limit.*.*.total_hits" + name: "ratelimit_service_rate_limit_total_hits" + timer_type: "histogram" + labels: + domain: "$1" + key1: "$2" + - match: "ratelimit.service.rate_limit.*.*.within_limit" + name: "ratelimit_service_rate_limit_within_limit" + timer_type: "histogram" + labels: + domain: "$1" + key1: "$2" + + - match: "ratelimit.service.rate_limit.*.*.*.near_limit" + name: "ratelimit_service_rate_limit_near_limit" + timer_type: "histogram" + labels: + domain: "$1" + key1: "$2" + key2: "$3" + - match: "ratelimit.service.rate_limit.*.*.*.over_limit" + name: "ratelimit_service_rate_limit_over_limit" + timer_type: "histogram" + labels: + domain: "$1" + key1: "$2" + key2: "$3" + - match: "ratelimit.service.rate_limit.*.*.*.total_hits" + name: "ratelimit_service_rate_limit_total_hits" + timer_type: "histogram" + labels: + domain: "$1" + key1: "$2" + key2: "$3" + - match: "ratelimit.service.rate_limit.*.*.*.within_limit" + name: "ratelimit_service_rate_limit_within_limit" + timer_type: "histogram" + labels: + domain: "$1" + key1: "$2" + key2: "$3" + + - match: "ratelimit.service.call.should_rate_limit.*" + name: "ratelimit_service_should_rate_limit_error" + match_metric_type: counter + labels: + err_type: "$1" + + - match: "ratelimit_server.*.total_requests" + name: "ratelimit_service_total_requests" + match_metric_type: counter + labels: + grpc_method: "$1" + + - match: "ratelimit_server.*.response_time" + name: "ratelimit_service_response_time_seconds" + timer_type: histogram + labels: + grpc_method: "$1" + + - match: "ratelimit.service.config_load_success" + name: "ratelimit_service_config_load_success" + match_metric_type: counter + - match: "ratelimit.service.config_load_error" + name: "ratelimit_service_config_load_error" + match_metric_type: counter + + - match: "ratelimit.service.rate_limit.*.*.*.shadow_mode" + name: "ratelimit_service_rate_limit_shadow_mode" + timer_type: "histogram" + labels: + domain: "$1" + key1: "$2" + key2: "$3" + + # Enable below in production once you have the metrics you need + # - match: "." + # match_type: "regex" + # action: "drop" + # name: "dropped" diff --git a/packages/dashmate/test/e2e/localNetwork.spec.js b/packages/dashmate/test/e2e/localNetwork.spec.js index ca4bc23cf7..d1f8c7bb7b 100644 --- a/packages/dashmate/test/e2e/localNetwork.spec.js +++ b/packages/dashmate/test/e2e/localNetwork.spec.js @@ -52,7 +52,7 @@ describe('Local Network', function main() { localConfig.set('dashmate.helper.api.port', 40000); localConfig.set('core.p2p.port', 40001); localConfig.set('core.rpc.port', 40002); - localConfig.set('platform.dapi.envoy.http.port', 40003); + localConfig.set('platform.gateway.listeners.dapiAndDrive.port', 40003); localConfig.set('platform.drive.tenderdash.p2p.port', 40004); localConfig.set('platform.drive.tenderdash.rpc.port', 40005); localConfig.set('platform.drive.tenderdash.pprof.port', 40006); diff --git a/packages/dashmate/test/e2e/testnetEvonode.spec.js b/packages/dashmate/test/e2e/testnetEvonode.spec.js index efabb10553..f37daa0df6 100644 --- a/packages/dashmate/test/e2e/testnetEvonode.spec.js +++ b/packages/dashmate/test/e2e/testnetEvonode.spec.js @@ -93,7 +93,7 @@ describe('Testnet Evonode', function main() { config.set('dashmate.helper.api.port', 40000); config.set('core.p2p.port', 40001); config.set('core.rpc.port', 40002); - config.set('platform.dapi.envoy.http.port', 40003); + config.set('platform.gateway.listeners.dapiAndDrive.port', 40003); config.set('platform.drive.tenderdash.p2p.port', 40004); config.set('platform.drive.tenderdash.rpc.port', 40005); config.set('platform.drive.tenderdash.pprof.port', 40006); diff --git a/packages/dashmate/test/e2e/testnetFullnode.spec.js b/packages/dashmate/test/e2e/testnetFullnode.spec.js index 147b9d820d..965f6f78d6 100644 --- a/packages/dashmate/test/e2e/testnetFullnode.spec.js +++ b/packages/dashmate/test/e2e/testnetFullnode.spec.js @@ -90,7 +90,7 @@ describe('Testnet Fullnode', function main() { config.set('dashmate.helper.api.port', 40000); config.set('core.p2p.port', 40001); config.set('core.rpc.port', 40002); - config.set('platform.dapi.envoy.http.port', 40003); + config.set('platform.gateway.listeners.dapiAndDrive.port', 40003); config.set('platform.drive.tenderdash.p2p.port', 40004); config.set('platform.drive.tenderdash.rpc.port', 40005); config.set('platform.drive.tenderdash.pprof.port', 40006); diff --git a/packages/dashmate/test/unit/status/scopes/platform.spec.js b/packages/dashmate/test/unit/status/scopes/platform.spec.js index 985ff18fa3..ad723f3077 100644 --- a/packages/dashmate/test/unit/status/scopes/platform.spec.js +++ b/packages/dashmate/test/unit/status/scopes/platform.spec.js @@ -47,7 +47,7 @@ describe('getPlatformScopeFactory', () => { config = getConfigMock(this.sinon); - httpPort = config.get('platform.dapi.envoy.http.port'); + httpPort = config.get('platform.gateway.listeners.dapiAndDrive.port'); httpService = `${config.get('externalIp')}:${httpPort}`; p2pPort = config.get('platform.drive.tenderdash.p2p.port'); p2pService = `${config.get('externalIp')}:${p2pPort}`; diff --git a/packages/rs-drive-abci/.env.local b/packages/rs-drive-abci/.env.local index 2fe951bad2..942707ab20 100644 --- a/packages/rs-drive-abci/.env.local +++ b/packages/rs-drive-abci/.env.local @@ -1,8 +1,10 @@ # ABCI host and port to listen ABCI_CONSENSUS_BIND_ADDRESS="tcp://0.0.0.0:26658" -PROMETHEUS_BIND_ADDRESS="http://0.0.0.0:29090" GRPC_BIND_ADDRESS="0.0.0.0:26670" +# Metrics are disabled when empty. Must be http://0.0.0.0:29090 for example to enable +PROMETHEUS_BIND_ADDRESS= + # stderr logging for humans ABCI_LOG_STDOUT_DESTINATION=stdout ABCI_LOG_STDOUT_LEVEL=info diff --git a/packages/rs-drive-abci/.env.mainnet b/packages/rs-drive-abci/.env.mainnet index ecdae2605a..a15602a413 100644 --- a/packages/rs-drive-abci/.env.mainnet +++ b/packages/rs-drive-abci/.env.mainnet @@ -1,8 +1,10 @@ # ABCI host and port to listen ABCI_CONSENSUS_BIND_ADDRESS="tcp://0.0.0.0:26658" -PROMETHEUS_BIND_ADDRESS="http://0.0.0.0:29090" GRPC_BIND_ADDRESS="0.0.0.0:26670" +# Metrics are disabled when empty. Must be http://0.0.0.0:29090 for example to enable +PROMETHEUS_BIND_ADDRESS= + # stderr logging for humans ABCI_LOG_STDOUT_DESTINATION=stdout ABCI_LOG_STDOUT_LEVEL=info diff --git a/packages/rs-drive-abci/.env.testnet b/packages/rs-drive-abci/.env.testnet index 9cc6c3385e..e40ea7efc0 100644 --- a/packages/rs-drive-abci/.env.testnet +++ b/packages/rs-drive-abci/.env.testnet @@ -1,8 +1,10 @@ # ABCI host and port to listen ABCI_CONSENSUS_BIND_ADDRESS="tcp://0.0.0.0:26658" -PROMETHEUS_BIND_ADDRESS="http://0.0.0.0:29090" GRPC_BIND_ADDRESS="0.0.0.0:26670" +# Metrics are disabled when empty. Must be http://0.0.0.0:29090 for example to enable +PROMETHEUS_BIND_ADDRESS= + # stderr logging for humans ABCI_LOG_STDOUT_DESTINATION=stdout ABCI_LOG_STDOUT_LEVEL=info diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index db8334cc12..9540d2acf9 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -64,8 +64,8 @@ file-rotate = { version = "0.7.3" } reopen = { version = "1.0.3" } delegate = { version = "0.9.0" } regex = { version = "1.8.1" } -metrics = { version = "0.21" } -metrics-exporter-prometheus = { version = "0.12" } +metrics = { version = "0.22.3" } +metrics-exporter-prometheus = { version = "0.14.0" } url = { version = "2.3.1" } ureq = { "version" = "2.6.2" } tokio = { version = "1.36", features = [ diff --git a/packages/rs-drive-abci/src/logging/level.rs b/packages/rs-drive-abci/src/logging/level.rs index 4986c11f64..a914e45d30 100644 --- a/packages/rs-drive-abci/src/logging/level.rs +++ b/packages/rs-drive-abci/src/logging/level.rs @@ -110,7 +110,7 @@ impl TryFrom<&LogLevel> for EnvFilter { .expect("should be a valid log specification") } LogLevel::Debug => EnvFilter::try_new( - "info,tenderdash_abci=debug,drive_abci=debug,drive=debug,dpp=debug", + "info,tenderdash_abci=debug,drive_abci=debug,drive=debug,dpp=debug,dapi_grpc=debug,tonic=debug", ) .expect("should be a valid log specification"), LogLevel::Trace => EnvFilter::try_new( diff --git a/packages/rs-drive-abci/src/main.rs b/packages/rs-drive-abci/src/main.rs index 1ccaed597e..b9e07c6ea1 100644 --- a/packages/rs-drive-abci/src/main.rs +++ b/packages/rs-drive-abci/src/main.rs @@ -262,6 +262,8 @@ fn start_prometheus(config: &PlatformConfig) -> Result, Strin .filter(|s| !s.is_empty()); if let Some(addr) = prometheus_addr { + tracing::info!("Expose prometheus metrics on {}", addr); + let addr = url::Url::parse(&addr).map_err(|e| e.to_string())?; Ok(Some(Prometheus::new(addr).map_err(|e| e.to_string())?)) } else { diff --git a/packages/rs-drive-abci/src/metrics.rs b/packages/rs-drive-abci/src/metrics.rs index 5aefbc843b..be79f8d4b0 100644 --- a/packages/rs-drive-abci/src/metrics.rs +++ b/packages/rs-drive-abci/src/metrics.rs @@ -4,7 +4,8 @@ use std::{sync::Once, time::Instant}; -use metrics::{absolute_counter, describe_counter, describe_histogram, histogram, Label}; +use dapi_grpc::tonic::Code; +use metrics::{counter, describe_counter, describe_histogram, histogram, Label}; use metrics_exporter_prometheus::PrometheusBuilder; /// Default Prometheus port (29090) @@ -15,6 +16,8 @@ const COUNTER_LAST_HEIGHT: &str = "abci_last_finalized_height"; const HISTOGRAM_FINALIZED_ROUND: &str = "abci_finalized_round"; const HISTOGRAM_ABCI_REQUEST_DURATION: &str = "abci_request_duration_seconds"; const LABEL_ENDPOINT: &str = "endpoint"; +const LABEL_RESPONSE_CODE: &str = "response_code"; +const HISTOGRAM_QUERY_DURATION: &str = "abci_query_duration"; /// Error returned by metrics subsystem #[derive(thiserror::Error, Debug)] @@ -37,6 +40,7 @@ pub enum Error { pub struct HistogramTiming { key: metrics::Key, start: Instant, + skip: bool, } impl HistogramTiming { @@ -54,6 +58,7 @@ impl HistogramTiming { Self { key: metric, start: Instant::now(), + skip: false, } } @@ -61,6 +66,18 @@ impl HistogramTiming { pub fn elapsed(&self) -> std::time::Duration { self.start.elapsed() } + + /// Add label to the histrgram + pub fn add_label(&mut self, label: Label) { + self.key = self.key.with_extra_labels(vec![label]); + } + + /// Cancel timing measurement and discard the metric. + pub fn cancel(mut self) { + self.skip = true; + + drop(self); + } } impl Drop for HistogramTiming { @@ -70,11 +87,15 @@ impl Drop for HistogramTiming { /// since the start time. #[inline] fn drop(&mut self) { + if self.skip { + return; + } + let stop = self.start.elapsed(); let key = self.key.name().to_string(); let labels: Vec

    cQ=m zosa;eD@(027sfd~5}x#+c?tzPR74i(05<(?*qlG(5+#tnFAyuGd#!dF=aysm#dF11 z0KnBAz*-ZAN@AR{?}-ke(UMcMKO^m^7i#?seCq=|jjyM0k9(PyqKTrLXD}#41t{Vc zo;!s+5{o!zKjLjtg?FS*owSN*Zx9$mDICb($9Q0c&vgJJHx3Vd-sRE8zgCB^%Wptw z06k|xXQL$9e&nOCs>$En)V>SlUMm7T_YjXM-vb29B{g2O5BF&4RmwOFTV14{_8j%r zQ$7O)rOyFT_<-gb&l$aO3(IITNG#|U-j zW6%uhcTc~i9Jkw#xO19))=uwL#WE7WiZ9CVMsk82+|h-QG1haRWR!+!Pd<0x9n z*2X$r&aHI&HPrM23)E1xAF0Quz#hZU)06pa`5p-LJ6|F>wuDgnHDU<*sp22!TfkKD zKK8`#_+>gFEpC9Bt;ksS1kZ|+&hms!KsJDu$ Mk9Zwaanif}UqWL~VE_OC diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json new file mode 100644 index 0000000000..febf179550 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_epoch_fetch/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json @@ -0,0 +1 @@ +[140,166,219,3,87,141,69,160,158,153,22,179,34,58,44,164,191,240,111,196,114,27,180,199,89,247,126,103,234,93,92,229,246,192,127,27,164,78,63,100,86,79,205,231,251,65,175,178] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/.gitkeep b/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:53.461986163Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_2024-03-18T17:30:02.275436110Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json similarity index 81% rename from packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:53.461986163Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json rename to packages/rs-sdk/tests/vectors/test_epoch_fetch_current/msg_2024-03-18T17:30:02.275436110Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json index 78feda0e9b1b911165130edff0a180d867fbc408..0a8e8600ca09a700408f8f9ba5b813e02fd3a1c0 100644 GIT binary patch literal 21965 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 LER_+)jnU}8DhneQ delta 1685 zcmX9C4^6wS=ErOdSR-S^t4?PPwSguf1*>DO=C0Xoby)hUI}v}`p{5;uYdG+}{J zYc*pW7P+H7!fKyakfpx9w>zF;sBH>lQGEb=_; z8LajhjO`WPTSQ+oNcHo+Rp3-Ce(e!-)ye$2>=!{q_&6D4fuKR+fMB^@aAi!eCui^( zLA=$=vsVQdhb@}-8(eus(9DE82&`IXFq&QiScw`m6L73gaIR`_h{g2pMKOpoS80o2 zwcf!c0*iP8z7OParkKRI>&!2Cf7e0SEGQm+!E?08HtRb*%E?nYGb#wJ5K44&;{%7~?C;+K1|TQCi8Wl#YuX&W|NBM5L-rz3L|I%Y|wM%?+J>c1OD|nI@EU?Qk%~qoEYSgj4NH+NW zP-7JN?Ski<*Ptk*qcmoQy5HO?6oOdjnU#RxLP7AAW07vP_?--D*H0<@i5`x_phF=w z&SIrN0fz)L^ytpA#UYxzlQGluRV41F*k#bpS62o@#wgWnS8Def3s{TOdgZ_K}QO3S;ZJF!&i&2Q%LaQ`zKM%P)7D77n)T5bO+-k?Xtd^tpvEry*@=>^XSy8^GcFPr>?$)q1xlUzdvg4wI=aCOI8DVKx)!9`pZ)k=%atY2;nak5Q?R$&S72(?^Yi~q{0m%q(_=Itd)7YY zI8eG0qNJ|K(9`~M)!}5nEcqji@=t=L7PvF UYdq*L1dT=~^bki1e;(NSKY`sByZ`_I diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json new file mode 100644 index 0000000000..febf179550 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_epoch_fetch_current/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json @@ -0,0 +1 @@ +[140,166,219,3,87,141,69,160,158,153,22,179,34,58,44,164,191,240,111,196,114,27,180,199,89,247,126,103,234,93,92,229,246,192,127,27,164,78,63,100,86,79,205,231,251,65,175,178] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/.gitkeep b/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:53.585317181Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_2024-03-18T17:30:02.315343769Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json similarity index 81% rename from packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:53.585317181Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json rename to packages/rs-sdk/tests/vectors/test_epoch_fetch_future/msg_2024-03-18T17:30:02.315343769Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json index 78feda0e9b1b911165130edff0a180d867fbc408..0a8e8600ca09a700408f8f9ba5b813e02fd3a1c0 100644 GIT binary patch literal 21965 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 H35EX!gSnnV delta 1976 zcmXw)ZETZO6vxwUjJ9BTRL1oyL~_tGqYldF+mu(FY<+MvLKq6 zwTW*LOk23hjW2Xe6Ch-4%c2>6VCV-CV$wn+(GarD7-9so&O}L!r1N)g=ZF8(d;6Sw z&pH2d{^$8|@pI2Dkon#l={WgAsH~$Sa`NHUn%2%pduM0+_SQ&5Zu30j?P!xnJ<}>W z<+0WH^B!9|6}Bqw4GKBeXsec;KB2N>yt87g;tzbb%A|#@3RSkHCNG6-l^ylj@((PA zTdRah?&D>yzt)zn5NdX))>h7C9wQ%C2$gupkCQoUzjs^p74VJ$*SndH{PzLmV1*iZkK_#dH)u0CWKrQeC3kYC? z0H_12z-kZ#YrtAi57vRlzZtU?bQB8bK4-3?2ttrU%PI(KB*ljjj6DT0#{M zlNu~arD-F{^n$f0ozssO|?R;e~zxQDs7o0FBeV@RtweQg@C2it{kkl zRBm&Ht73<3A$Ol|P$S<~x+?Lu*OlTkp<<2~>;3qi*ht994jzk>q2=&))U!1qJL5X5 zPq-rw$@wC=>qKQ&R><@=TcsUBF}e1hfaLgb&DAK^j#LFWc$?T~SF-))I-T4*77D1$ zYcLkug>nAGDk1MugWPQ_7RInOy105Fv30LBy!XRp~F`N-MLJO7sFvwYZCx>3c{R7hk7brpHRXV5Iqo z{BlQd9~QQ>eq$Wydv%_s&t&(WfNZU{RM%hhmVR#(T{y>7SZE|f^N7~cq!tae*Z`s7 zuklzs%gdC*U0W`NI%VM!r6cE3<1BVzmc4?76^7|#Q;<~#ZnRX?Ob@}Dx2Y+jGpp!r z{?nuB^c$9Tia%Y3!gUV$Gwhb?1ETB@bakMr}WIKeT)XYUwi zv;Bma-b5<799d+JL*dP*Npv`YXkt&GUWSFzT%n`?^ECezjsycTnJjh0xQEMH4)O5c z!8CW6)%Xw*Owe1czp#60b8y-5>^`=p%%)!key89g*Z9v|>x^>VXk}sAv!N8=Kp(}K zxrZR>K2tLjx0xhpg$djF-VGf^;bYoiYglm^eY#qu z(wO2MNT9uV6DjmynttRH-tBF=lJ)ARuPEn}|Kdo0sbs8L==$j~X~gF2#FKTIHEYU%B!VNnhB=A^%qqobkxayuO;27fJ$V1 Zj3)SV=kcX`+}qZ!`X)l_RMX{9_&;Jbp#1;< diff --git a/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json b/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json new file mode 100644 index 0000000000..febf179550 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_epoch_fetch_future/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json @@ -0,0 +1 @@ +[140,166,219,3,87,141,69,160,158,153,22,179,34,58,44,164,191,240,111,196,114,27,180,199,89,247,126,103,234,93,92,229,246,192,127,27,164,78,63,100,86,79,205,231,251,65,175,178] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list/.gitkeep b/packages/rs-sdk/tests/vectors/test_epoch_list/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:53.562881817Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/test_epoch_list/msg_2024-03-18T17:30:02.333739890Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json similarity index 81% rename from packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:53.562881817Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json rename to packages/rs-sdk/tests/vectors/test_epoch_list/msg_2024-03-18T17:30:02.333739890Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json index 78feda0e9b1b911165130edff0a180d867fbc408..0a8e8600ca09a700408f8f9ba5b813e02fd3a1c0 100644 GIT binary patch literal 21965 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 A5dZ)H delta 2036 zcmXw)Z%kEn7{_=2@JGOVe&>h~30zXoB&~Y^F9z0tRl3Ftpfz2y4Ro_w8*!Pf=B7c* zHeJ=b1*&(8V%dH#H# z@AI5%w?}-}!0}7|SmTNBYXgmqu@iqkQC!y)YiMd}*j5*dc@f`Ee`CG(j_)fS-9ce?5LCLaowZ0L&(?#rPVUni zEOWdorOK;brF4(qhn|4Q1&H0yJvZO(1Y#dlP+sh_CwDThke*N8npGrN>}O8 zokhyC3T!W(!NxtpNX~F`AeCo(bADU5l;gXnkhgHkQAd)&qsgET_(1@e?>vwX3P2%P z1&Tm1C;_WM2v|S?8#rJMC%j)F@yle;{j*G` zD@g0|0-2{q6x6zWw(Q`|DrK#%9vV-(5Gos~Wj2yq^KCCuZ0pPzUlU=Dbry2#%#U!~ zagMcV$EUn#F^rpPO;57^;Mvtm4=k`5xz6LWvphntLs7b|RO!e)s7uYV*1v~pWZLoC z6Dm-8_)V-&8W+dU=Ucg2$!_;Sj;y3Cs(+hni6I{601%+Ugw;+wmO~Pefg% zdutTZH<6{EE>K=wp7P!+Be8uP=o`VBFqE;mG0xl7@-Ql6rC% zL8rzzD_+cfsmAB7V|jZ+DwoyxPtsA&sqKEt%dS;AJEKhd(p|F-0%mne4{kG{_ZS3mAec}-HEpGBTy8mjx((~Ox>FnGzNz`&|uH7VL z9vv|<&5fROc%R;YTrx8zg(1#u+2l5P6Sv^g>A_}77siRS*%v<(?&cOIT6V3aZ@!9-OwGNO)sCL8 zHOhULQY{}cb-#mL?&cw(js=n$7$TnJdJJ_p8ws``D`7TuCun=azffQ^R)jV)qRE&{ zMu<4lMO{?@2m3ASWE}=0!?t~L38PCRJQAO9ZyKq2{g)pamYSw3(NLPXnjRxCnc1Vy z(H7z-Gs7k6p}CZ*$weoBi%=KQi4diDgF{4M=8qRaXVMYIoHv@W^6|tMuW^H>j)(gFk*iPr{${Rq{p?M68@pdj6$s@e2CdL>313B-vjQ{`u diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json b/packages/rs-sdk/tests/vectors/test_epoch_list/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json new file mode 100644 index 0000000000..febf179550 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_epoch_list/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json @@ -0,0 +1 @@ +[140,166,219,3,87,141,69,160,158,153,22,179,34,58,44,164,191,240,111,196,114,27,180,199,89,247,126,103,234,93,92,229,246,192,127,27,164,78,63,100,86,79,205,231,251,65,175,178] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list_limit/.gitkeep b/packages/rs-sdk/tests/vectors/test_epoch_list_limit/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_2024-03-18T17:30:02.341524594Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/test_epoch_list_limit/msg_2024-03-18T17:30:02.341524594Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json new file mode 100644 index 0000000000000000000000000000000000000000..0a8e8600ca09a700408f8f9ba5b813e02fd3a1c0 GIT binary patch literal 21965 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ªh9tu-A3~`Sd9=oO)4*Tvn`nL<4?lOao=(T-U48j7|9!c7x%%y@DD^8H zKkQE1+wEza^ga)|+wH&Ko#tmv*EjD=&ChQR$KB@UZo7Zn+#hcK+1+kFdaBPVYIZ*k zH+S;{=_t)<|FGLUJe6rRwo@0=6hqr}d4>5nr^C(ResjiV5^VFjb_Hg0yM4NQ*q(M} zE8F``ujWlSFYh~Uj=QJl`*My~d{>OmD;)k_Jem*oy-4x)+vfe{8TDmM+Cgb1l+?Ff zg2biw@7pQw=Fv&*rLFd>2SY+r9g!`uJcwi{wL_o8ULPnywT{TPReRW>Fa?%~NJy?T zt}q~0=%F45jcix1+r$u?BHKwBG2mRv#8jtTLwVV_N{0n4)dx7~!hTDKHPtavc9{d~ zlmbH3Vh$W*g&C=EKV@R8vf^xwOVp{yly+{YFVk|JF;nyFp&+Pi|FuJ=={iNG>iQtl zbsdr^yY_&b7Svrk;GCJl%lk~9rA^3XIxp{`hy|_J@tNAo1A|AV_|hTMd}$NHGDLFE zGwm;x2~|P&XreQk+)W4)Hym^n5hW7Yy_OTp=!jFSuxAnQL11(ou?7&bKdxdo6I{xa z3~3e=>IS{G`UoK&2r)-11VZxzCkXcX)D@vAfQvge0+ynq%Nlh?&1tc4RA%++N zoc?PBNCWKw3&_yWu?OKnD-E7PEze0<$Cv68*@lsV(Tlim*Ek?S4@iXvjc)=(Myiiq z+Gu=bn_S`?2-6BH&^OWBX`tv0=k&oQSPGJB1~(;o4(k!(!3Y2kSD-8r>FRJ)%3`85 zQWW&MbT^tzpIA~x;3BQi0L_4L&P9e+*%uw?Wq>G}Fa3krJ3ZvU6VM8J2*GHPQe()) zxRSazN6Pq^JD}#p&?GESXkp3}lgJ(#F@o-2J#00&?KK3qhM=?tSqGNH0y+OKNMW2x z_XHaZiz!K0BuLSz(wh(p*gugZD$c-3322QeEvhwVL@5R5Bzqa@a#u7Ex+=>LWHviM z)A9#g#heW--7+K5(1O%1qbqXe(mkz!;9xRl5TtjB7JNmzu_bJaj2#(|Sjw5DcK{x@iH}WPN&JQ?7_>3!y~bqyu!)Bd3`%c&?=&jd!7ZHb;3|5#P`I#|;(YV>2ancAY3Pv6>YBq+TxnoKO9xQax^u@@NH3>RtO;jyx z9~(k%o8D3YhJ;Wp>}N$^NmnEb_tw~w7<1BtQ;*~>dOM&uY>(8kEW$JwJVMH1kU%{$ z?-ipdo-&x7(P^9e3a%*=tsTr)T`~hbku${_2ne$~AQ0-Hwpi7`^kjGf*iv(ifFvfg ztcY%i2ec@Gk-2$WtM#}i<0dWSVoXLe#HoTt5v-fAR3j#wUels#ph+vdT*w8f3kCr= z7FOUE5f7LT0hX6d2DRpP#Tdw<2|~r9T&pCtBs=4C>WMr-1F%GtahDYq#e~QB&N&*A zri~li#Q4xdSVnWv0>ku;Rx_b!f+>PO;H8i;BqL)S98Irod0xX)0foyZeVfc#S&f!{ z!VMc%~6rgp7OE9DlfZfJ(#Ni7-hLJ~yVaphrSmaS2E7Hd%4Us{(Jiy=%3pYc>M zW3VNyW^O!0#~)-B$R)^q!Sa`RO&JIn0bva>;-S5JW<<8M+f#)6CI|Ptq`Jj-3-tnn zjy33#f;A|y08N;YLoDNG0m%Z;@$H_!?C|45h|*~OeLftYA2xUMmjUw)KQ8f!E#gA? z1C=tJm$F#*q)+7yw=B@`{1$3keDG0sVU-!~!m~dnRx$*Wl&mUdv)S$%>LkVszccoBiSfNc>^u~_~g zNwCOfWm5vpyy)V~xXKaOwb0GcEvwQ?x{=NSH_DS&nhnr_; diff --git a/packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json b/packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json new file mode 100644 index 0000000000..febf179550 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_identity_balance_read/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json @@ -0,0 +1 @@ +[140,166,219,3,87,141,69,160,158,153,22,179,34,58,44,164,191,240,111,196,114,27,180,199,89,247,126,103,234,93,92,229,246,192,127,27,164,78,63,100,86,79,205,231,251,65,175,178] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/.gitkeep b/packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:54.235614684Z_GetIdentityBalanceAndRevisionRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/msg_2024-03-18T17:30:02.345340351Z_GetIdentityBalanceAndRevisionRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json similarity index 80% rename from packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:54.235614684Z_GetIdentityBalanceAndRevisionRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json rename to packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/msg_2024-03-18T17:30:02.345340351Z_GetIdentityBalanceAndRevisionRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json index ebc626b707c24cbb40bbb8139d273036ef58f27c..f0ffccb180b02c7075a3bab60b6964c872394eb4 100644 GIT binary patch literal 20816 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 literal 20823 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 diff --git a/packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json b/packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json new file mode 100644 index 0000000000..febf179550 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_identity_balance_revision_read/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json @@ -0,0 +1 @@ +[140,166,219,3,87,141,69,160,158,153,22,179,34,58,44,164,191,240,111,196,114,27,180,199,89,247,126,103,234,93,92,229,246,192,127,27,164,78,63,100,86,79,205,231,251,65,175,178] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/.gitkeep b/packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:54.256001517Z_GetIdentityContractNonceRequest_b7c02dae0c3c762ece1f70a36f88fa69b4749b19cc1f5ef0abf37fa0c04ab2ef.json b/packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/msg_2024-03-18T17:30:02.540146201Z_GetIdentityContractNonceRequest_b7c02dae0c3c762ece1f70a36f88fa69b4749b19cc1f5ef0abf37fa0c04ab2ef.json similarity index 75% rename from packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:54.256001517Z_GetIdentityContractNonceRequest_b7c02dae0c3c762ece1f70a36f88fa69b4749b19cc1f5ef0abf37fa0c04ab2ef.json rename to packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/msg_2024-03-18T17:30:02.540146201Z_GetIdentityContractNonceRequest_b7c02dae0c3c762ece1f70a36f88fa69b4749b19cc1f5ef0abf37fa0c04ab2ef.json index 952cd3cad8e27bc0e647df3d65bff98e74ecadb0..6d937d38f122164168dd7db40ec70299fa69f914 100644 GIT binary patch literal 14553 zcmeI3%Wfk_3`Mi{R~TAnAyUuIuLOahv6Zn9+nUJo0E2=5JzedG*yq^sCd*_oQNQZJ zy1cw(m49AbUQWL6jt~38{p7dHpZ#UKF@5{pU+u4V_ow~o$7X-s-~N4grM)&^|N8bj z>hEq=9xN91BF`5&Tb?hb=bwu>|Bh8@Dx*6;Sr9k*8} zu2$*j|DO%MmzV#69c2D*$HVts?o6u*PBy+ZxTJOCa-JVKe;*_cblu5?f!mqd${^*cfEOgH@bO&=4AKnaCOr+QLr>Q z?eBJ*yN99SRZLgw?D~&ZUG1Tt(CKh>xZRvtq9A+n-1oo?lk4rn&E592YeU)IZgM_( zG0)TMh$qM0!{cq6$urZmRhaZW9R3{L>TiB+cD(+wd3|`Mo%T%`LAxvq`Oedv7T$R0 zIU37Z@%r}qn$0hY4TtukIR0=Wiz^Q|DoYGEy0SLI4GuD=Xk&q4#T)~VN+v^_Gfuo? z8Qy+11d(JLLd^NmKsIXlxFwG^$%vlB+$SF;^Mw8LuMn)m?Hi$VF zkkjV#S3tLq`$@xSFj5V4?RC7339_+R&>~ZO;f2QlMggvkV67%;LjogaFu@F7vBa!K zLAmuwC&?O)hZklXc8!SbjWw1&I($Kw$V!3FeQ@T4LafkcPBF6%<`-gVnyfmajlwso zv}tdM9_alTBn-2{b&`-c2Q6<*)x@Wkqth(uWw@?Vt4%uCfHA~zuYf`!0$qx2hz954Ui#$*G#Nr$~6=4ibNY#k`7(2NU>T= z%u0cRUK6x5;X-y;qKB*rN*iQq79=grv#RaZgvP{(Do@KfAegdDfMD2Z(%NJkg}{!^ z8^BOV!{7xDi46)vVsqY*py8}IMmkC`u1l$r<&vz)E`q+L#fcS=Ptz*GEMTgR-bRXv z84%K^bz^-IY-5EsLlYG(Nmj_;Y8KtFz6J?oO?%r5pYV)KCtPdPoM+5AQQ|Hb0g~KB zZO0J8P)o)SdRt6MG~^ZHkdR2)K5NlpFs-7e?@Wd^xHiHM=R4t*}M<>%oSEGc9HU@b z%VPtcM5fG%f_=WjDd<&;OKy~YW2e&A3cxW#U=r!j{9HZ)fP}%+JVnQ}U2?rl*kp9- z`^2nBIwp7!Az7}25Uz#O0RS?+To)}!6k-JQ3+fyiiKK{ik`0M*@?Fqo@;iw&;1|eX zgd_!XLQ(77gNpT}Tj=O=xlm}SHSwWMDmA%St&cy?Ys^>7 zZ$;uTJY5b8p@e2sKYtzo983fWMrDo_6rZY736EGRcmo!i&Na4I&=>GJCWoH?{gPzm zfJcxiM6N+jp^!)VN>+!GkP*`}VU&9(`G|!X!6X>ERn4S}YnU#jQ4-}0&{|^gEbizI zqaC0IXIA*6VuBJPv}g&?gvbc1O2pzZ>D`0IyhA>g^lR$mV2UA%6|STwiA|LiRk6_< zmOiZE$Rilf2?FLVFm|d?35E>iTHGH9<~3-6dFcx4%fba$6V354U5!D7@6+>0*zaU7 zu$dSe6AFo75M{r?HKt*@o%~dpx}1#bNcKgKiq5cdvIAvk)On#V;B=xm=DR^;$YCrY zXliD4SUQb?t1q}qT4~RN@gv1|^Z@#3au$j>qyg=tNS{&JkSCNnumC06=5j)Js5F#} z%_4FJ3Ic+bWx$g%q8&qArMeDq54Mox#nT=7kd$H+7GBjUgRGo} z!c#jz+T9F(5;Pt{n(EF9%*>)0evn46{6@9UJE%#X3DFjPGWoJ_XQ#ptA%mDiJ7~vN z%8~UEDg!%;be1$UO{HwZF^X9iE78hJDoM^1BuYQ19u%+H0-c2tN5yE-nz}&T zdnZVNBvkV!Gsf!WJY}mHy`A`N7n8pq568#5%}sv-vp-3R!;+_1d>(q#zzS9zNIU9VJ@Y8&Sz6XlkD_Qfe(*GtkQ! zB~qxaRfuJ2hlJXnDf%$H91oB8?N7!=ig5C!{h><#*GV6U6>1M@Z|A*SaBY(7BqOGR{8?Y+nen#tlEFi|9|;=tA7B4VB$Lf literal 14551 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 P`}?Z)-^>4B|Jv#ww=m(& diff --git a/packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json b/packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json new file mode 100644 index 0000000000..febf179550 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_identity_contract_no_nonce_read/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json @@ -0,0 +1 @@ +[140,166,219,3,87,141,69,160,158,153,22,179,34,58,44,164,191,240,111,196,114,27,180,199,89,247,126,103,234,93,92,229,246,192,127,27,164,78,63,100,86,79,205,231,251,65,175,178] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/.gitkeep b/packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:54.222895153Z_GetIdentityKeysRequest_b4ecff7acf52818aef9ed37a98d4a459dc7a67570ea6df3f8858d3fae7820ffe.json b/packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/msg_2024-03-18T17:30:02.532347572Z_GetIdentityKeysRequest_b4ecff7acf52818aef9ed37a98d4a459dc7a67570ea6df3f8858d3fae7820ffe.json similarity index 75% rename from packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:54.222895153Z_GetIdentityKeysRequest_b4ecff7acf52818aef9ed37a98d4a459dc7a67570ea6df3f8858d3fae7820ffe.json rename to packages/rs-sdk/tests/vectors/test_identity_public_keys_all_read/msg_2024-03-18T17:30:02.532347572Z_GetIdentityKeysRequest_b4ecff7acf52818aef9ed37a98d4a459dc7a67570ea6df3f8858d3fae7820ffe.json index f7a57bba0e35f2c87647bf21f220a6ac20108c32..263f1193e0191771ea235d43f36a7473cdc5dc97 100644 GIT binary patch literal 15483 zcmb`O%WfM<3`J+{uL!iBg-E^UR|W$?v6WbeY$dWBAPD^L)77yh_Bpn*nAxdcRV+R( zFIlCZS06r%zHg5YyTkqHuMa=F%XVXY{@q>eZnpQQ-RZ}AchlYeyMLvf^3t@3 zJ1g&G`FOs#2vTHFSTG=3&2cxV!CXbF(>Z29l0$x4X}`ZK_dp${oFk&<%HeIBwV1 zx0~JldVje7vb|ZK-;LF@*k`o;dbqyrhA0XhopyKI^<7*3C>AkZEOXU;v{=;{x&@sM z*N6T35-P>KqhE9P;W4_|Jlx)GPTMBRX1~tq=vk*1O&+%okNdWgU*Xn=TsOnv)8JOO zu+L48Hy_t84==ITz9|y4%i^p3(=nbG|Lvb&6xc3{MqatBk@MPP%>Djg|KrmM76mzC zQV^rbJu7k8u49Q8mL&%J7pBx=ai{(TP7x~#vCs`l5g2sFFDi((S-Ea}A4|+o!Ki(o z6U_ic#EfHBNb1K(s3s~-^>0K0#CBtWF*9kuniJX=LDd9jO{^p}X%uphmHQ#&qC;aq zLqQQDDdZF*W=;NW%A{tJ{>aFT1yzMfCsf3g)}R*!l^qMn9V;j^Cs2PfY?gQ-mQWwW z#-%)DXbM3Ad^?B?jQgxCu(yPj0C17!Q=iNsMou^eQEv`SXQdNOu2^sgnu0zR9DK!2DPWiylmQ9z?;9g#kXa%w_yQK4V?hy&6Us&SB1E^wT*Yr4 zcTj8h2A;zYh1@is@C^=-fe}ry5za(Vnp?)3V1U#V)IL#MG*dab*8IJquuOW9Zj6AR?X+PZ40O2(0Nm$a9%P$*f#pouVG zm?(~B8~|QOVp3a%y#q+~2&JH27)kUGx`#3?yqwGhc9IV1L74_f%}H)*r?`p0 zkb@xxUE}utpmW@AC`||;VJj6u>e5hV`6EolcpNex1{a<(7VtU@gqh#J6wuSBR8%TO zii;}c5x!JHX5CEaO-Q6)z(NXdH7>{vKTY@==0RDA7qd z1GS<}c&2sIKpNM*4y*wHBTH&yBvl^qa0CmkS131U1%xsX)fzDzz+H$AbIg#WiaG?~ z)(O|ivQKSeW>iI5((Bb@({3IoO=_EnqZFvk78YUVFmO}kDA78ifzh0u6cHM(iZU`# zl-I@7h;m8POA6|8YY z%++^#A7`XG`L)bLT?Kn(LBG@1l(383jwytxmWUsWwipv=h#K@mMGtkK+K3T$@snT` z^h%cufGIX4+)!#Ebp`FfO zM6#cv=8w8VHb2rHdmX_v+5M?%$QoHtVU;40?ER9o=zIyaLVu(@d@cs^3ZaJ<)EYL& z6jM^`O1fsES3t9H^v?CBAr) z&JnAzs_KVrX|NS>2{uyMlBQmXo6LMX8sdFxZh^Q@&TTg)LxKYnwl=!;0qb)WzVtU9 kEfeo%@H2Mjt2dqLnc+VF@w98Po!>nFnY6$2{AbXA0dtFKLI3~& literal 15482 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 diff --git a/packages/rs-sdk/tests/vectors/test_identity_read/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json b/packages/rs-sdk/tests/vectors/test_identity_read/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json new file mode 100644 index 0000000000..febf179550 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_identity_read/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json @@ -0,0 +1 @@ +[140,166,219,3,87,141,69,160,158,153,22,179,34,58,44,164,191,240,111,196,114,27,180,199,89,247,126,103,234,93,92,229,246,192,127,27,164,78,63,100,86,79,205,231,251,65,175,178] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_identity_read_by_key/.gitkeep b/packages/rs-sdk/tests/vectors/test_identity_read_by_key/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:54.255202663Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json b/packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_2024-03-18T17:30:02.533475216Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json similarity index 81% rename from packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:54.255202663Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json rename to packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_2024-03-18T17:30:02.533475216Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json index 080bf588d58f05c749097c9ac35a05713d8375dc..e0816d799b39ab64d398fc66bc9ca2f679af83b7 100644 GIT binary patch literal 24693 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 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:54.612885967Z_IdentityRequest_6f74498ccb101c39329fd63ff2af65555849abef7f60625ccd3623e6e829c227.json b/packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_2024-03-18T17:30:02.579369080Z_IdentityRequest_8fb3b1a4ef0db316161d4ed79b93efbcc93fdbc66e012e606d530c327265c52d.json similarity index 80% rename from packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:54.612885967Z_IdentityRequest_6f74498ccb101c39329fd63ff2af65555849abef7f60625ccd3623e6e829c227.json rename to packages/rs-sdk/tests/vectors/test_identity_read_by_key/msg_2024-03-18T17:30:02.579369080Z_IdentityRequest_8fb3b1a4ef0db316161d4ed79b93efbcc93fdbc66e012e606d530c327265c52d.json index ce48bc6b35973ffa0114c0fc200768c82ebf4a64..2d425cebff91579505398865224336c0b0af2f03 100644 GIT binary patch literal 30799 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 literal 31425 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 N4Dgr#xB4mMe*s?ypfvyh diff --git a/packages/rs-sdk/tests/vectors/test_identity_read_by_key/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json b/packages/rs-sdk/tests/vectors/test_identity_read_by_key/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json new file mode 100644 index 0000000000..febf179550 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_identity_read_by_key/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json @@ -0,0 +1 @@ +[140,166,219,3,87,141,69,160,158,153,22,179,34,58,44,164,191,240,111,196,114,27,180,199,89,247,126,103,234,93,92,229,246,192,127,27,164,78,63,100,86,79,205,231,251,65,175,178] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/.gitkeep b/packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:54.258421095Z_GetProtocolVersionUpgradeStateRequest_bb149e1933b9dc561bbfacfb6d09550f0ea4a6af6f68037e7d50ff4e4de74509.json b/packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/msg_2024-03-18T17:30:02.555246935Z_GetProtocolVersionUpgradeStateRequest_bb149e1933b9dc561bbfacfb6d09550f0ea4a6af6f68037e7d50ff4e4de74509.json similarity index 69% rename from packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:54.258421095Z_GetProtocolVersionUpgradeStateRequest_bb149e1933b9dc561bbfacfb6d09550f0ea4a6af6f68037e7d50ff4e4de74509.json rename to packages/rs-sdk/tests/vectors/test_protocol_version_vote_count/msg_2024-03-18T17:30:02.555246935Z_GetProtocolVersionUpgradeStateRequest_bb149e1933b9dc561bbfacfb6d09550f0ea4a6af6f68037e7d50ff4e4de74509.json index de8652c425ccfd1378a9f19ef8ec2dde1cac5dc9..4141ad29c3e6b380cea7145832a7e746746908fb 100644 GIT binary patch literal 8206 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 QG&6snnE$-~`}VcszavBOxBvhE literal 10896 zcmeI2&2rmD5QKBqQ>bvx0X_KltE5~gnnXlaBtaoTms2jid$1Bk6JJZ_C8v~ikOW|{ zJ3Bu;J+t_Jb92@AYuf>E}1)X6y0zIL(TW^PSlsUx)e5v_B3n!=LBh&o|FEzuhD=UbE`MFs(ML zX?0=g`K9f!yW6I9va-tFmYVOc$NkW+x2xS_e?PAO8aDlTq^hdC7&$zR>*OI9evwVP zhoOHsq-oXUZ5eGFbzYX2E6m%O#`SpL|L{g#O#8a_Zjb|d(oz(UG z_CmHF4#)enk5`XQ2Fm6Y#y=Og=9_m(i<>XWy1YAVG7X>a=Es@g<(u^>RgB+A2+;k}{Q)2{W{KK@D!S7p6~3L_mnh z@rEkixIRJ<6B{?pMz`EY#cN2dz>N~u9RvtL1T|Pfff1PT=TG4YxWrUfJTXL*L<9A} zB05E#-@Ny8L_Idh-$nM1+B=984N^4F}Q38b1AsB z98**OmOK z`SPDXZ~2%wY*@zN;sh;}A^{y$LamM(m?9W^!8vJa0+Y=B%)^;@Wf;L2P;h6&GKUos zh60jP3T8nO=$TnN+JhSXh38K)8=@Z(0|*n83D0>+J6JX*I1-@31T3INYT0NweJ5yI%S%Lf zHB7K36iim5KqdH2>B}LP~Qr2(~`(y7k2Dy)=wS!^PV!Ucl0#R!AiGuWLp)iHS(Q4q1$N*9Y~xG5Z8 zHl8%qJVe&jfnx`e);r!cz?v>1l4t7DmVgWfI!NTSm6hc|O~0cDaE&N%gKGklEEiC* z?_dlf;fisY`mJ#=9~>`}3a7NoBhUEzKQjng1@V8Og&@#<0`*jTBGaB7*$0T-5L`X$m?@URZBWN2t>tu{oL z#cOjqkxXrh^C51!$o@W#`{RS3qo;==1{+H>=%JfL1sq_pM$i^1d0g$!*&4DIAEoe; z(A^bLCz5KfPuN)Yy|8|;f`Se!+McHb6BU_=dfc|EAr6>F(R{Qbv zpGn4$g#+wd#J@v@e9DjTxdR%2YTapE18LMJY@!gS(DnnDDZlh_+qq> z186uq4Y2koxL8;ekT{ZkSR;TP5Ct>=MO%-}dMYAcHpC&pHaLjlLuWeC-RYmFL|2s8 Q=aK1i#q{&~_w@1Nzt$=9i~s-t diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json new file mode 100644 index 0000000000..febf179550 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_limit_2/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json @@ -0,0 +1 @@ +[140,166,219,3,87,141,69,160,158,153,22,179,34,58,44,164,191,240,111,196,114,27,180,199,89,247,126,103,234,93,92,229,246,192,127,27,164,78,63,100,86,79,205,231,251,65,175,178] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/.gitkeep b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:54.600823915Z_GetProtocolVersionUpgradeVoteStatusRequest_983670ac95678b1166deab32209bf1acc3394d29ac72f662d38e81344496631e.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/msg_2024-03-18T17:30:02.568021928Z_GetProtocolVersionUpgradeVoteStatusRequest_983670ac95678b1166deab32209bf1acc3394d29ac72f662d38e81344496631e.json similarity index 71% rename from packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:54.600823915Z_GetProtocolVersionUpgradeVoteStatusRequest_983670ac95678b1166deab32209bf1acc3394d29ac72f662d38e81344496631e.json rename to packages/rs-sdk/tests/vectors/test_protocol_version_votes_none/msg_2024-03-18T17:30:02.568021928Z_GetProtocolVersionUpgradeVoteStatusRequest_983670ac95678b1166deab32209bf1acc3394d29ac72f662d38e81344496631e.json index 25425f5831e3ad38f2210722aae37d54cbfa4f09..6e662aef9c2a5078bdd10721c73da04e8fa2141b 100644 GIT binary patch literal 10630 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 Ho6x@i2p2IU literal 11315 zcmeI2%W~UB5Jj`rSE#to0^NAhzmiI^Xo-=Eb-zB`Pe1;0dayj4 zZTs{87ymUIym{o;ch@X#cE_i2a$KJ8Ob-3FneL4H)zYjvc~O%;m7s3DWa?& zR&6Za%=PmA!eYNU93P4vuMu&IifM=4Z?jvIVt2)gw_i(moPPWf80DP{3CiW!_~l~y zwZ2gNbmM*h)6aZ6mRzo?=P&gA{5slhexqK_ua~&a_QLE%h~@&=<$8%7qsNUJI%Z;p z4kBgJ2mu+SHp~z`_8cG+&C=ob=&(Rm6cS2gElWd-213$sG($+J9xDdbqR_R}g47+Z zqsEPXn8PD@9oTc=14|e#h%h=ch>r;AjT;#-KBdS8V%CsK{*8dUlBQ88#ZqF;jhBQ# z64((4KY>EVY2ag<6RHNT;cQmrSmi5R(|J@q09U!b?KYRDwo0M#mciZ(P>nr|7AG zyG-s%6l4WhWMBe^=&6Dx z>}pgW$b7+!;`)w0q*OEx$(^mj%&>=q z3>JNwa{|=RN-09c6o+%6Nf@^bx(1$79Te`gkvr8jQ4NO80Qw1y2q|^TFk)P(W@Khz zAr&kDsU~G)J`Xjx6<$fTqZ%LqL7G9Scvh;BWf=UdTr`2wAdIGC@=&1=Bu+9w83^LI-raY(d3l2)D{dbuqf*e`burNhR|U zu`lIRGFiSVy3)9V#p#gXsD^om`8q5Wf{mSOkWQ7kl27p5g6Wq`r{G~cDjAAxHEKh2 zkr|_ZJM=B{m-9J!xmf&h-0hE#{?wuT80278iJ~5oSGFJqHftp9U`g&XQ#OFwLxV;? z!GVz`rW$JnlfUQgnpaB~_Bd)N2-u+S#ab*O6(r)d5a>C-QBIl`{SZNi?cLLQJnqZ) z75E~6@X+Z8fy^-v+idV8(H89gH2zo5>#qRj+#5OrqOnvjhr)!VXmSQkLunFZF_b~s z6$VF%8gm3ANr&X2>93l6l;t+CHgVsDT&al;j~|2cLfKDF;slbzkfhTz15)J4;N&`{ zC!KjBu?sjn(Nrf!V4()mf;t@02pb~FEG<$E$8&TpxkhH?Y{Fx9otH6(xRYbwrQVNK zxGD?SL9D9wQ^(QduB5YcCe9_~ZjJUi$k%a>PvsQR8q2UDAxQ^=D>%Ul&MIl%VC~n% zhxuhcea%-sWt(|q@wI$fx7tqM*6}0FQn@fONS;p;iCSi|96wkBgJ~R`B4hQt|imAm6#&!t?6 Ssyjbfz6dRUUjKdjKJ;&fQ8Nkv diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json new file mode 100644 index 0000000000..febf179550 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_nx/quorum_pubkey-106-7f5ab83561a836a5460dd8e6164db039bd8eba37530edf9202046cf912eb8efd.json @@ -0,0 +1 @@ +[140,166,219,3,87,141,69,160,158,153,22,179,34,58,44,164,191,240,111,196,114,27,180,199,89,247,126,103,234,93,92,229,246,192,127,27,164,78,63,100,86,79,205,231,251,65,175,178] \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/.gitkeep b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:54.612507684Z_GetProtocolVersionUpgradeVoteStatusRequest_92a45a0fe4f69d355022d2f2f7622dfc69cc7b123be24b7ad993281979b2a3a2.json b/packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/msg_2024-03-18T17:30:02.590618781Z_GetProtocolVersionUpgradeVoteStatusRequest_92a45a0fe4f69d355022d2f2f7622dfc69cc7b123be24b7ad993281979b2a3a2.json similarity index 72% rename from packages/rs-sdk/tests/vectors/msg_2024-02-20T11:33:54.612507684Z_GetProtocolVersionUpgradeVoteStatusRequest_92a45a0fe4f69d355022d2f2f7622dfc69cc7b123be24b7ad993281979b2a3a2.json rename to packages/rs-sdk/tests/vectors/test_protocol_version_votes_zeros/msg_2024-03-18T17:30:02.590618781Z_GetProtocolVersionUpgradeVoteStatusRequest_92a45a0fe4f69d355022d2f2f7622dfc69cc7b123be24b7ad993281979b2a3a2.json index b34619ece27ec2b9bbbfefa61892b1d776db82fd..4d9c8c4b4f057d90f7e9199c539e6847ea5eaba1 100644 GIT binary patch literal 10988 zcmeI2&2Ae<5QKBqQwTigu+{sYR|yP)CO0AxNmR(C;lR+lXNICE?pKtA0J+6J*k0~T z&rEl9_0Q~&o7>yjw_&&6Y#(R8-Tp|A`G?~C|MavU7rSx(wA;?d@ALIyzfLcIKMu@; zi(h~K_rKS}NvB_4l{;H*507I~yo$5JXUQbrhV??iabfE;X+3Q2)_J9w)M@s*f%Im%-3{~Qda-$&-*1S%Nn$-4}E2IOB+vWCt{)R|hh<#amv&u4735O4hamZU)+|Q$$ zomBSxI$^dO_J{j?k{48GBW0Cs|Cs!ge!RxgZvn;^7BJ_8~CA| zzAy1w_4Iv@@oF!Wc3hyvjEH6`qPQcjf{W}fMLB8J6q zivcAz*nk2X#zUsfDv*^KI*1=;E6mzNO9j&p5gsz@Gw?9NGJkEM2U~(UQ;B0U4%r3@ zqzMdE=F2Q#7_XWBl0NJRaBPA(SYvtV%(Np4Iu+oHr~hKlBrev?;^vM77LDP z!3)L-x*{EqjK+jG48J5vdak({^Bv<81?a)d%XnlVkaS_2Fa(iMm}zwMI>s}x4IyJv zSet+$n*fqf3UweVK1zavkfq}REY|8Z*Ox(>lxgV~3pQDP%pl1gpLK`Hn6?Dn45s|F zBTFop7hTZv?@v*<)=}csU148|B145t7?Ytw;l!h3BKpA-#kibxGT`!!;y6MI-VwPT+ zv8JZAh$UtuVg`#t$d-U!81vMgu03;W<9u73A7+0Yw!6cFU)blD7M6^dSTolk0qc~p zjB+l70T^sqBV92N^v}eGS0zKfdu=I(JZ9(MV=0^EZe6A_zi7FcUKXk)wdqSum%D1dhr&J(1fpoKRD|$60l%%2D2Lw6UrvMSS0x^3duy)sAmolY@bPV z6!u(#5rRhXb^@VbA1&BT2$OU8qIs`)Q^~}dwCR_M01BLtdID`*>&p5UY?06-tz%*? z2_1w(2t004(z0G&!!U!vDOmuCRx-bg&b{7pE ztkkU)$eULNQR4=viFG^mO5S9~#bh(AQnM=EDA4+4pO6CswtZqnHjy>F=orKsKdrHz j3!R_7+w|{(>6GD)e?R4HMMZNSnLmWge_sAQeHQr-p>_XW literal 11006 zcmeI2&2HmH5QKB~Qy4twz-s;~uMz}=R$?q6mgz{;Viya)dpMG;6~BU4mmKYbZE}Xg zp8lz>?%|Jz$H(kzzdvk;m+X(nAJb*JkzfCxt`6gJKX$MCp&P$-o8@6M4gPtWm?r1H zfByUb>*1o)zuuLbt%l>vI4NHFRpHrWlCS-AZ`>dI(*tkQ@3)7yhu13j$u;K67t?A}d(&G9{a`4mOPuEV*+(?iv<9+>fF^vXp6!Y-{ z!z$YOgy4)QD$IZc&5f#)2o>g+7_aO3db+jMX%8i3Dj_v4)#3p)xY6F2KD{CWLPU-y zRPo0B8G>BcxM?;Pb4^sdhSUn&C~>`j03nE=2Cq##pdMHx z=vjgQrmqJ2q32Z?j}j{eHW4|WpwMb;3FuUa7u9%)YCI7It;mgui$+B;IAZ~G8InYf zB`O$9HI+g2spSlUi)ceg1x;WS0^*XBAwIP3(F%9uUJ5Lr5;sC{U{jApC$<~JR#UlJ z>?#N{LBv-HZz5Q#hTPa!0mTM2QNqJ5tXfP^16`|zEw#W6Iub2-!suy8QWEjXwYf}rSCTEGTkl9vS> zLsUV(A#OT^k(^jKP&Xzf;)z*&L3?ncbj=33;|t+W^GiHiQ2P07c(Q@!XHrjebK>Qn zN&T#d({K2gDTi=kbRHRtXcNK&E>Kef@DeeoB?Kw)j0-lLz?{C1#1T)!*rfAB z7E%Tz*f#ku3!2EG1>?U=6;awdsTeFt#DJE9GGUyTw1a90L~ta54|0ALTmgnN%1_@3 zn%43X5nc^p*rXDqvUda&$gR1{$YDq}p~6@MeaBVH zqQeL|n<369iOD2ZR)^fd9$KrV;^x+4IZOu*W&mqj!DBruVTatHxFIsd$Psg5%9xs? z^Ie&cBI&E}1j7)!vJ?>oo@fay3rfvbil%|3thphU$)*Uanz#*yO^aQqM&=WxX8+IP ziZxI$vlz={SBKlAjO=GAhtQGZk+5>qS`hFD>tfK}R@}=p!{8@#u^t9Hp{6<}4TbTX?e;aQb-FD!!?=Hw@5)^PMQ|| z(1Q-!ra5PT$uv0HOGTS^Xvw@TJHnIK-hLTwG22(mPNOsIjWf@<#LfpF8 zcHB)xiRsYApxk0rD4q{mo5Lc>*RUg9EAsC(6}(^Lbr%rSIyyYS68nXwKQj_Z6pu`T z*k(N-i#$^}v5x7EFD-7(ruM1CUFYxt+5D5QFCMQ#p%h(F+Ow1Zgq2 z#159&tEBcs?pN!>{IZ`uY)jvC&BV;Uq;Jf+?eviuzc) Date: Tue, 19 Mar 2024 11:01:02 +0700 Subject: [PATCH 100/191] fix: identity add keys in strategy tests (#1727) --- .../tests/strategy_tests/strategy.rs | 1 + packages/strategy-tests/src/lib.rs | 66 +++++++++++++------ packages/strategy-tests/src/transitions.rs | 6 +- 3 files changed, 51 insertions(+), 22 deletions(-) diff --git a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs index 963d48260e..7cc4d28672 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs @@ -944,6 +944,7 @@ impl NetworkStrategy { strategy_tests::transitions::create_identity_update_transition_add_keys( random_identity, *count, + 0, identity_nonce_counter, signer, rng, diff --git a/packages/strategy-tests/src/lib.rs b/packages/strategy-tests/src/lib.rs index 8040850aa9..d83247538f 100644 --- a/packages/strategy-tests/src/lib.rs +++ b/packages/strategy-tests/src/lib.rs @@ -29,8 +29,8 @@ use dpp::state_transition::data_contract_update_transition::methods::DataContrac use operations::{DataContractUpdateAction, DataContractUpdateOp}; use platform_version::TryFromPlatformVersioned; use rand::prelude::StdRng; -use rand::Rng; -use tracing::error; +use rand::{thread_rng, Rng}; +use tracing::{error, info}; use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet}; use bincode::{Decode, Encode}; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; @@ -1057,26 +1057,50 @@ impl Strategy { OperationType::IdentityUpdate(update_op) if !current_identities.is_empty() => { match update_op { IdentityUpdateOp::IdentityUpdateAddKeys(keys_count) => { - (0..count).for_each(|_| { - current_identities.iter_mut().enumerate().for_each(|(i, random_identity)| { - if i >= count.into() { return; } + // Map the count of keys already added this block to each identity + // This prevents adding duplicate KeyIDs in the same block + let mut keys_already_added_count_map = HashMap::new(); + for id in &*current_identities { + keys_already_added_count_map.insert(id.id(), 0); + } - let (state_transition, keys_to_add_at_end_block) = - crate::transitions::create_identity_update_transition_add_keys( - random_identity, - *keys_count, - identity_nonce_counter, - signer, - rng, - platform_version, - ); - operations.push(state_transition); - finalize_block_operations.push(IdentityAddKeys( - keys_to_add_at_end_block.0, - keys_to_add_at_end_block.1, - )); - }); - }); + // Create `count` state transitions + for _ in 0..count { + let identities_count = current_identities.len(); + if identities_count == 0 { + break; + } + + // Select a random identity from the current_identities + let random_index = thread_rng().gen_range(0..identities_count); + let random_identity = &mut current_identities[random_index]; + + // Get keys already added + let keys_already_added = keys_already_added_count_map.get(&random_identity.id()) + .expect("Expected to get keys_already_added in IdentityAddKeys ST creation"); + + // Create transition + let (state_transition, keys_to_add_at_end_block) = + crate::transitions::create_identity_update_transition_add_keys( + random_identity, + *keys_count, + *keys_already_added, + identity_nonce_counter, + signer, + rng, + platform_version, + ); + + // Push to operations vectors + operations.push(state_transition); + finalize_block_operations.push(IdentityAddKeys( + keys_to_add_at_end_block.0, + keys_to_add_at_end_block.1, + )); + + // Increment keys_already_added count + keys_already_added_count_map.insert(random_identity.id(), keys_already_added + *keys_count as u32); + } } IdentityUpdateOp::IdentityUpdateDisableKey(keys_count) => { (0..count).for_each(|_| { diff --git a/packages/strategy-tests/src/transitions.rs b/packages/strategy-tests/src/transitions.rs index 487edef141..9f85336d51 100644 --- a/packages/strategy-tests/src/transitions.rs +++ b/packages/strategy-tests/src/transitions.rs @@ -34,6 +34,7 @@ use dpp::state_transition::{GetDataContractSecurityLevelRequirementFn, StateTran use dpp::version::PlatformVersion; use dpp::withdrawal::Pooling; use dpp::NativeBlsModule; +use drive::drive::identity::key; use rand::prelude::{IteratorRandom, StdRng}; use simple_signer::signer::SimpleSigner; @@ -283,6 +284,7 @@ pub fn create_identity_top_up_transition( pub fn create_identity_update_transition_add_keys( identity: &mut Identity, count: u16, + keys_already_added_this_block_count: u32, identity_nonce_counter: &mut BTreeMap, signer: &mut SimpleSigner, rng: &mut StdRng, @@ -290,8 +292,10 @@ pub fn create_identity_update_transition_add_keys( ) -> (StateTransition, (Identifier, Vec)) { identity.bump_revision(); + let start_id = (identity.public_keys().len() as u32 + keys_already_added_this_block_count) as KeyID; + let keys = IdentityPublicKey::random_authentication_keys_with_private_keys_with_rng( - identity.public_keys().len() as KeyID, + start_id, count as u32, rng, platform_version, From 5f93578527530ea078be3a0e3e5b2314d1414ed1 Mon Sep 17 00:00:00 2001 From: Paul DeLucia <69597248+pauldelucia@users.noreply.github.com> Date: Tue, 19 Mar 2024 11:19:56 +0700 Subject: [PATCH 101/191] feat: updated descriptions and function names in strategy tests plus readme file (#1785) --- .../tests/strategy_tests/execution.rs | 2 +- .../tests/strategy_tests/strategy.rs | 14 +- packages/strategy-tests/README.md | 29 + packages/strategy-tests/src/lib.rs | 1057 +++++++++-------- 4 files changed, 609 insertions(+), 493 deletions(-) create mode 100644 packages/strategy-tests/README.md diff --git a/packages/rs-drive-abci/tests/strategy_tests/execution.rs b/packages/rs-drive-abci/tests/strategy_tests/execution.rs index af9d6a8adc..9c628c1481 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/execution.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/execution.rs @@ -870,7 +870,7 @@ pub(crate) fn continue_chain_for_strategy( .get(i as usize) .unwrap(); let (state_transitions, finalize_block_operations) = strategy - .state_transitions_for_block_with_new_identities( + .state_transitions_for_block( platform, &block_info, &mut current_identities, diff --git a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs index 7cc4d28672..e26d2317ec 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs @@ -391,7 +391,7 @@ impl NetworkStrategy { Ok(state_transitions) } - pub fn contract_state_transitions( + pub fn initial_contract_state_transitions( &mut self, current_identities: &Vec, signer: &SimpleSigner, @@ -462,7 +462,7 @@ impl NetworkStrategy { .collect() } - pub fn contract_update_state_transitions( + pub fn initial_contract_update_state_transitions( &mut self, current_identities: &Vec, block_height: u64, @@ -510,7 +510,7 @@ impl NetworkStrategy { // TODO: this belongs to `DocumentOp`, also randomization details are common for all operations // and could be moved out of here - pub fn state_transitions_for_block( + pub fn operations_based_transitions( &self, platform: &Platform, block_info: &BlockInfo, @@ -1030,7 +1030,7 @@ impl NetworkStrategy { (operations, finalize_block_operations) } - pub fn state_transitions_for_block_with_new_identities( + pub fn state_transitions_for_block( &mut self, platform: &Platform, block_info: &BlockInfo, @@ -1062,7 +1062,7 @@ impl NetworkStrategy { if block_info.height == 1 { // add contracts on block 1 - let mut contract_state_transitions = self.contract_state_transitions( + let mut contract_state_transitions = self.initial_contract_state_transitions( current_identities, signer, contract_nonce_counter, @@ -1073,7 +1073,7 @@ impl NetworkStrategy { } else { // Don't do any state transitions on block 1 let (mut document_state_transitions, mut add_to_finalize_block_operations) = self - .state_transitions_for_block( + .operations_based_transitions( platform, block_info, current_identities, @@ -1088,7 +1088,7 @@ impl NetworkStrategy { // There can also be contract updates - let mut contract_update_state_transitions = self.contract_update_state_transitions( + let mut contract_update_state_transitions = self.initial_contract_update_state_transitions( current_identities, block_info.height, signer, diff --git a/packages/strategy-tests/README.md b/packages/strategy-tests/README.md new file mode 100644 index 0000000000..9d9b40e6fa --- /dev/null +++ b/packages/strategy-tests/README.md @@ -0,0 +1,29 @@ + +# Dash Platform Strategy Testing Library + +## Overview +This library offers a robust framework for developers and testers to simulate a wide range of blockchain activities on Dash Platform through comprehensive testing strategies. Utilizing the `Strategy` struct, it facilitates the simulation of various operations including balance transfers, contract interactions, and identity management with detailed control over state transitions on a per-block basis. + +## Key Features +- **State Transition Focused**: Designed to simulate every type of state transition possible on the Dash Platform, providing a comprehensive test environment. +- **Flexible Strategy Design**: Enables the crafting of complex strategies that can include operations like contract registration, document submissions, identity management, and credit transfers across blocks. +- **Dynamic Entity Management**: Allows for the seamless introduction and management of entities such as contracts and identities at any simulation stage without prior setup. +- **Accessible through Dash Platform's UI**: While directly accessible as part of the Dash Platform repository for integration and development, the library can also be conveniently used via the `Strategies` section of the Dash Platform terminal user interface found at `github.com/dashpay/rs-platform-explorer`. + +### Usage +Define your testing strategy within your application by instantiating the `Strategy` struct with the desired configurations and operations. For an interactive experience, use the `Strategies` module within the Dash Platform's terminal user interface: + +1. Navigate to `github.com/dashpay/rs-platform-explorer`, clone the repo, and run it via `cargo run`. +2. Use the interface to define and manage your strategies. +3. Execute and observe the simulation of blockchain activities as per your defined strategy. + +## Example +```rust +let strategy = Strategy { + contracts_with_updates: vec![...], + operations: vec![...], + start_identities: StartIdentities::new(...), + identities_inserts: Frequency::new(...), + signer: Some(SimpleSigner::new(...)), +}; +``` diff --git a/packages/strategy-tests/src/lib.rs b/packages/strategy-tests/src/lib.rs index d83247538f..81e2c1d865 100644 --- a/packages/strategy-tests/src/lib.rs +++ b/packages/strategy-tests/src/lib.rs @@ -1,3 +1,15 @@ +//! This library facilitates the creation and execution of comprehensive testing strategies for Dash Platform, leveraging the `Strategy` struct as its core. +//! It is designed to simulate a wide range of blockchain activities, offering detailed control over the generation of state transitions, contract interactions, and identity management across blocks. +//! +//! Utilizing this library, users can craft scenarios that encompass every conceivable state transition on Dash Platform, with precise timing control on a block-by-block basis. +//! Strategies can be as simple or complex as needed, from initializing contracts and identities at the start of a simulation to conducting intricate operations like document submissions, credit transfers, and more throughout the lifespan of the blockchain. +//! +//! This tool does not require any preliminary setup for the entities involved in the strategies; identities, contracts, and documents can be introduced at any point in the simulation. +//! This flexibility ensures users can test against both new and existing blockchain states, adapting the scenarios as Dash Platform evolves. +//! +//! As of March 2024, the recommended approach to leverage this library's capabilities is through the `Strategies` module within Dash Platform's terminal user interface, located at `dashpay/rs-platform-explorer`. +//! This interface provides an accessible and streamlined way to define, manage, and execute your testing strategies against Dash Platform. + use crate::frequency::Frequency; use crate::operations::FinalizeBlockOperation::IdentityAddKeys; use crate::operations::{ @@ -53,36 +65,39 @@ pub mod frequency; pub mod operations; pub mod transitions; -/// Represents a comprehensive strategy used for simulations or testing in a blockchain context. +/// Defines a detailed strategy for conducting simulations or tests on Dash Platform. +/// +/// This struct serves as the core framework for designing and executing comprehensive simulations or automated testing scenarios on Dash Platform. It encompasses a wide array of operations, state transitions, and data contract manipulations, enabling users to craft intricate strategies that mimic real-world blockchain dynamics or test specific functionalities. /// -/// The `Strategy` struct encapsulates various operations, state transitions, and data contracts to provide a structured plan or set of procedures for specific purposes such as simulations, automated tests, or other blockchain-related workflows. +/// The strategy allows for the specification of initial conditions, such as contracts to be created and identities to be registered, as well as dynamic actions that unfold over the simulation's lifespan, including contract updates and identity transactions. This versatile structure supports a broad spectrum of blockchain-related activities, from simple transfer operations to complex contract lifecycle management. /// /// # Fields -/// - `contracts_with_updates`: A list of tuples containing: -/// 1. `CreatedDataContract`: A data contract that was created. -/// 2. `Option>`: An optional mapping where the key is the block height (or other sequential integer identifier) and the value is a data contract that corresponds to an update. If `None`, it signifies that there are no updates. +/// - `contracts_with_updates`: Maps each created data contract to potential updates, enabling the simulation of contract evolution. Each tuple consists of a `CreatedDataContract` and an optional mapping of block heights to subsequent contract versions, facilitating time-sensitive contract transformations. /// -/// - `operations`: A list of `Operation`s which define individual tasks or actions that are part of the strategy. Operations could encompass a range of blockchain-related actions like transfers, state changes, contract creations, etc. +/// - `operations`: Enumerates discrete operations to be executed within the strategy. These operations represent individual actions or sequences of actions, such as document manipulations, identity updates, or contract interactions, each contributing to the overarching simulation narrative. /// -/// - `start_identities`: An instance of StartIdentities, which specifies the number of identities to register on the first block of the strategy, along with number of keys per identity and starting balance of each identity. +/// - `start_identities`: Specifies identities to be established at the simulation's outset, including their initial attributes and balances. This setup allows for immediate participation of these identities in the blockchain's simulated activities. /// -/// - `identities_inserts`: Defines the frequency distribution of identity inserts. `Frequency` might encapsulate statistical data like mean, median, variance, etc., for understanding or predicting the frequency of identity insertions. +/// - `identities_inserts`: Controls the stochastic introduction of new identities into the simulation, based on a defined frequency distribution. This field allows the strategy to dynamically expand the set of participants, reflecting organic growth or specific testing requirements. /// -/// - `signer`: An optional instance of `SimpleSigner`. The `SimpleSigner` is responsible for generating and managing cryptographic signatures, and might be used to authenticate or validate various operations or state transitions. +/// - `identity_contract_nonce_gaps`: Optionally defines intervals at which nonce values for identities and contracts may be artificially incremented, introducing realistic entropy or testing specific edge cases. /// -/// # Usage +/// - `signer`: Provides an optional `SimpleSigner` instance responsible for generating cryptographic signatures for various transactions within the strategy. While optional, a signer is critical for authenticating state transitions and operations that require verification. +/// +/// # Usage Example /// ```ignore /// let strategy = Strategy { -/// contracts_with_updates: vec![...], -/// operations: vec![...], -/// start_identities: vec![...], -/// identities_inserts: Frequency::new(...), -/// signer: Some(SimpleSigner::new(...)), +/// contracts_with_updates: vec![...], // Initial contracts and their planned updates +/// operations: vec![...], // Defined operations to simulate blockchain interactions +/// start_identities: StartIdentities::new(...), // Identities to initialize +/// identities_inserts: Frequency::new(...), // Frequency of new identity introduction +/// identity_contract_nonce_gaps: Some(Frequency::new(...)), // Optional nonce gaps +/// signer: Some(SimpleSigner::new(...)), // Optional signer for authenticating transactions /// }; /// ``` /// -/// # Note -/// Ensure that when using or updating the `Strategy`, all associated operations, identities, and contracts are coherent with the intended workflow or simulation. Inconsistencies might lead to unexpected behaviors or simulation failures. +/// # Implementation Note +/// It's imperative to maintain coherence among the specified operations, identities, and contracts within the `Strategy` to ensure the simulated scenarios accurately reflect intended behaviors or test conditions. Discrepancies or inconsistencies may result in unexpected outcomes or hinder the simulation's effectiveness in achieving its objectives. #[derive(Clone, Debug, PartialEq, Default)] pub struct Strategy { pub contracts_with_updates: Vec<( @@ -283,427 +298,310 @@ impl PlatformDeserializableWithPotentialValidationFromVersionedStructure for Str } impl Strategy { - /// Convenience method to get all contract ids that are in operations - pub fn used_contract_ids(&self) -> BTreeSet { - self.operations - .iter() - .filter_map(|operation| match &operation.op_type { - OperationType::Document(document) => Some(document.contract.id()), - OperationType::ContractUpdate(op) => Some(op.contract.id()), - _ => None, - }) - .collect() - } - - /// Creates state transitions based on the `identities_inserts` and `start_identities` fields. + /// Generates comprehensive state transitions for a given block, including handling new identities and contracts. /// - /// This method creates a list of state transitions associated with identities. If the block height - /// is `1` and there are starting identities present in the strategy, these identities are directly - /// added to the state transitions list. + /// This primary function orchestrates the generation of state transitions for a block, accounting for + /// new identities, document operations, contract creations, and updates. It serves as the main entry point + /// for simulating activities on the Dash Platform based on the defined strategy. The function integrates + /// the creation and management of identities, their related transactions, and the dynamics of contracts and + /// document operations to provide a holistic view of block activities. /// - /// Additionally, based on a frequency criterion, this method can generate and append more state transitions - /// related to the creation of identities. + /// Internally, it calls `operations_based_transitions` to process specific operations and generates + /// additional transitions related to identities and contracts. It's designed to simulate a realistic + /// blockchain environment, enabling the testing of complex scenarios and strategies. /// /// # Parameters - /// - `block_info`: Information about the current block, used to decide on which state transitions should be generated. - /// - `signer`: A mutable reference to a signer instance used during the creation of identities state transitions. - /// - `rng`: A mutable reference to a random number generator. - /// - `platform_version`: The current platform version. + /// - `document_query_callback`: Callback for querying documents based on specified criteria. + /// - `identity_fetch_callback`: Callback for fetching identity details, including public keys. + /// - `create_asset_lock`: Callback for creating asset lock proofs, primarily for identity transactions. + /// - `block_info`: Information about the current block, such as its height and timestamp. + /// - `current_identities`: A mutable list of identities present in the simulation, potentially expanded with new identities. + /// - `known_contracts`: A mutable map of contracts known in the simulation, including any updates. + /// - `signer`: A mutable reference to a signer instance for signing transactions. + /// - `identity_nonce_counter`: Tracks nonce values for identities, crucial for transaction uniqueness. + /// - `contract_nonce_counter`: Tracks nonce values for contract interactions. + /// - `rng`: A mutable random number generator for creating randomized elements in transactions. + /// - `config`: Configuration details for the strategy, including block start height and number of blocks. + /// - `platform_version`: Specifies the platform version for compatibility with Dash Platform features. /// /// # Returns - /// A vector of tuples containing `Identity` and its associated `StateTransition`. + /// A tuple containing: + /// 1. `Vec`: A collection of state transitions generated for the block. + /// 2. `Vec`: Operations that need to be finalized at the block's end, often related to identity updates. + /// + /// # Usage + /// This function is typically called once per block during simulation, with its output used to apply transactions + /// and operations within the simulated Dash Platform environment. /// - /// # Examples /// ```ignore - /// // Assuming `strategy` is an instance of `Strategy`, - /// // and `block_info`, `signer`, `rng`, and `platform_version` are appropriately initialized. - /// let state_transitions = strategy.identity_state_transitions_for_block(&block_info, &mut signer, &mut rng, &platform_version); + /// let (state_transitions, finalize_ops) = strategy.state_transitions_for_block( + /// &mut document_query_callback, + /// &mut identity_fetch_callback, + /// &mut create_asset_lock, + /// &block_info, + /// &mut current_identities, + /// &mut known_contracts, + /// &mut signer, + /// &mut identity_nonce_counter, + /// &mut contract_nonce_counter, + /// &mut rng, + /// &config, + /// &platform_version, + /// ); /// ``` - pub fn identity_state_transitions_for_block( - &self, + /// + /// # Note + /// This function is central to simulating the lifecycle of block processing and strategy execution + /// on the Dash Platform. It encapsulates the complexity of transaction generation, identity management, + /// and contract dynamics within a block's context. + pub async fn state_transitions_for_block( + &mut self, + document_query_callback: &mut impl FnMut(LocalDocumentQuery) -> Vec, + identity_fetch_callback: &mut impl FnMut( + Identifier, + Option, + ) -> PartialIdentity, + create_asset_lock: &mut impl FnMut(u64) -> Option<(AssetLockProof, PrivateKey)>, block_info: &BlockInfo, + current_identities: &mut Vec, + known_contracts: &mut BTreeMap, signer: &mut SimpleSigner, + identity_nonce_counter: &mut BTreeMap, + contract_nonce_counter: &mut BTreeMap<(Identifier, Identifier), u64>, rng: &mut StdRng, - create_asset_lock: &mut impl FnMut(u64) -> Option<(AssetLockProof, PrivateKey)>, config: &StrategyConfig, platform_version: &PlatformVersion, - ) -> Result, ProtocolError> { - let mut state_transitions = vec![]; + ) -> (Vec, Vec) { + let mut finalize_block_operations = vec![]; - // Add start_identities - if block_info.height == config.start_block_height - && self.start_identities.number_of_identities > 0 - { - let mut new_transitions = crate::transitions::create_identities_state_transitions( - self.start_identities.number_of_identities.into(), // number of identities - self.start_identities.keys_per_identity.into(), // number of keys per identity + // Get identity state transitions + let identity_state_transitions = match self.identity_state_transitions_for_block( + block_info, + signer, + rng, + create_asset_lock, + config, + platform_version, + ) { + Ok(transitions) => transitions, + Err(e) => { + error!("identity_state_transitions_for_block error: {}", e); + return (vec![], finalize_block_operations); + } + }; + + // Create state_transitions vec and identities vec based on identity_state_transitions outcome + let (mut identities, mut state_transitions): (Vec, Vec) = + identity_state_transitions.into_iter().unzip(); + + // Append the new identities to current_identities + current_identities.append(&mut identities); + + // Do we also need to add identities to the identity_nonce_counter? + + // Add initial contracts for contracts_with_updates on first block of strategy + if block_info.height == config.start_block_height { + let mut contract_state_transitions = self.initial_contract_state_transitions( + current_identities, + identity_nonce_counter, signer, rng, - create_asset_lock, platform_version, - )?; - state_transitions.append(&mut new_transitions); - } - - // Add identities_inserts - // Don't do this on first block because we need to skip utxo refresh - if block_info.height > config.start_block_height { - let frequency = &self.identities_inserts; - if frequency.check_hit(rng) { - let count = frequency.events(rng); - let mut new_transitions = crate::transitions::create_identities_state_transitions( - count, // number of identities - 3, // number of keys per identity + ); + state_transitions.append(&mut contract_state_transitions); + } else { + // Do operations and contract updates after the first block + let (mut operations_state_transitions, mut add_to_finalize_block_operations) = self + .operations_based_transitions( + document_query_callback, + identity_fetch_callback, + create_asset_lock, + block_info, + current_identities, + known_contracts, signer, + identity_nonce_counter, + contract_nonce_counter, rng, - create_asset_lock, platform_version, - )?; - state_transitions.append(&mut new_transitions); - } + ); + finalize_block_operations.append(&mut add_to_finalize_block_operations); + state_transitions.append(&mut operations_state_transitions); + + // Contract updates for contracts_with_updates + let mut initial_contract_update_state_transitions = self + .initial_contract_update_state_transitions( + current_identities, + block_info.height, + config.start_block_height, + signer, + contract_nonce_counter, + platform_version, + ); + state_transitions.append(&mut initial_contract_update_state_transitions); } - Ok(state_transitions) + (state_transitions, finalize_block_operations) } - /// Generates state transitions for the initial contracts of the contracts_with_updates field. + /// Processes strategy operations to generate state transitions specific to operations for a given block. /// - /// This method creates state transitions for data contracts by iterating over the contracts with updates - /// present in the strategy. For each contract: - /// 1. An identity is randomly selected from the provided list of current identities. - /// 2. The owner ID of the contract is set to the selected identity's ID. - /// 3. The ID of the contract is updated based on the selected identity's ID and entropy used during its creation. - /// 4. Any contract updates associated with the main contract are adjusted to reflect these changes. - /// 5. All operations in the strategy that match the old contract ID are updated with the new contract ID. + /// This function is responsible for generating state transitions based on the operations defined within + /// the strategy. It evaluates each operation's conditions and frequency to determine if a transition should + /// be created for the current block. The function supports a variety of operations, including document + /// creation, updates, deletions, identity-related transactions, and more, each tailored to the specifics + /// of the Dash Platform. /// - /// Finally, a new data contract create state transition is generated using the modified contract. + /// `operations_based_transitions` is called internally by `state_transitions_for_block` + /// to handle the operational aspects of the strategy. While it focuses on the execution of operations, + /// it is part of a larger workflow that includes managing new identities, contracts, and their updates + /// across blocks. /// /// # Parameters - /// - `current_identities`: A reference to a list of current identities. - /// - `signer`: A reference to a signer instance used during the creation of state transitions. - /// - `rng`: A mutable reference to a random number generator. - /// - `platform_version`: The current platform version. + /// - `document_query_callback`: A callback function for querying existing documents based on specified criteria. + /// - `identity_fetch_callback`: A callback function for fetching identity information, including public keys. + /// - `create_asset_lock`: A callback function for creating asset lock proofs for identity transactions. + /// - `block_info`: Information about the current block, including height and time. + /// - `current_identities`: A mutable reference to the list of current identities involved in the operations. + /// - `known_contracts`: A mutable reference to a map of known contracts and their updates. + /// - `signer`: A mutable reference to a signer instance used for transaction signatures. + /// - `identity_nonce_counter`: A mutable reference to a map tracking nonce values for identities. + /// - `contract_nonce_counter`: A mutable reference to a map tracking nonce values for contract interactions. + /// - `rng`: A mutable reference to a random number generator for random value generation in operations. + /// - `platform_version`: The platform version, ensuring compatibility with Dash Platform features. /// /// # Returns - /// A vector of `StateTransition` for data contracts. + /// A tuple containing: + /// 1. `Vec`: A vector of state transitions generated based on the operations for the current block. + /// 2. `Vec`: A vector of operations that need to be finalized by the end of the block processing. + /// + /// # Usage + /// This function is a critical component of the strategy execution process, providing detailed control over + /// the generation and management of operations-specific state transitions within a block's context. It is not + /// typically called directly by external code but is an essential part of the internal mechanics of generating + /// state transitions for simulation or testing purposes. /// - /// # Examples /// ```ignore - /// // Assuming `strategy` is an instance of `Strategy`, - /// // and `current_identities`, `signer`, `rng`, and `platform_version` are appropriately initialized. - /// let contract_transitions = strategy.contract_state_transitions(¤t_identities, &signer, &mut rng, &platform_version); + /// let (state_transitions, finalize_ops) = strategy.operations_based_transitions( + /// &mut document_query_callback, + /// &mut identity_fetch_callback, + /// &mut create_asset_lock, + /// &block_info, + /// &mut current_identities, + /// &mut known_contracts, + /// &mut signer, + /// &mut identity_nonce_counter, + /// &mut contract_nonce_counter, + /// &mut rng, + /// &platform_version, + /// ); /// ``` - pub fn contract_state_transitions( - &mut self, - current_identities: &[Identity], + /// + /// # Note + /// This function plays a pivotal role in simulating realistic blockchain operations, allowing for the + /// detailed and nuanced execution of a wide range of actions on the Dash Platform as defined by the strategy. + pub fn operations_based_transitions( + &self, + document_query_callback: &mut impl FnMut(LocalDocumentQuery) -> Vec, + identity_fetch_callback: &mut impl FnMut( + Identifier, + Option, + ) -> PartialIdentity, + create_asset_lock: &mut impl FnMut(u64) -> Option<(AssetLockProof, PrivateKey)>, + block_info: &BlockInfo, + current_identities: &mut [Identity], + known_contracts: &mut BTreeMap, + signer: &mut SimpleSigner, identity_nonce_counter: &mut BTreeMap, - signer: &SimpleSigner, + contract_nonce_counter: &mut BTreeMap<(Identifier, Identifier), u64>, rng: &mut StdRng, platform_version: &PlatformVersion, - ) -> Vec { - let mut id_mapping = HashMap::new(); // Maps old IDs to new IDs + ) -> (Vec, Vec) { + // Lists to store generated operations and block finalization operations + let mut operations = vec![]; + let mut finalize_block_operations = vec![]; - self.contracts_with_updates - .iter_mut() - .map(|(created_contract, contract_updates)| { - let identity_num = rng.gen_range(0..current_identities.len()); - let identity = current_identities - .get(identity_num) - .unwrap() - .clone() - .into_partial_identity_info(); + // Lists to keep track of replaced and deleted documents + let mut replaced = vec![]; + let mut deleted = vec![]; - let contract = created_contract.data_contract_mut(); + // Loop through the operations and generate state transitions based on frequency and type + for op in &self.operations { + // Check if the op frequency hits for this block + if op.frequency.check_hit(rng) { + // Get times_per_block + let count = rng.gen_range(op.frequency.times_per_block_range.clone()); + match &op.op_type { + // Generate state transition for document insert operation with random data + OperationType::Document(DocumentOp { + action: DocumentAction::DocumentActionInsertRandom(fill_type, fill_size), + document_type, + contract, + }) => { + // TO-DO: these documents should be created according to the data contract's validation rules + let documents = document_type + .random_documents_with_params( + count as u32, + current_identities, + Some(block_info.time_ms), + Some(block_info.height), + Some(block_info.core_height), + *fill_type, + *fill_size, + rng, + platform_version, + ) + .expect("expected random_documents_with_params"); - let identity_nonce = identity_nonce_counter.entry(identity.id).or_default(); - *identity_nonce += 1; + documents + .into_iter() + .for_each(|(document, identity, entropy)| { + let identity_contract_nonce = contract_nonce_counter + .entry((identity.id(), contract.id())) + .or_default(); + let gap = self + .identity_contract_nonce_gaps + .as_ref() + .map_or(0, |gap_amount| gap_amount.events_if_hit(rng)) + as u64; + *identity_contract_nonce += 1 + gap; - contract.set_owner_id(identity.id); - let old_id = contract.id(); - let new_id = - DataContract::generate_data_contract_id_v0(identity.id, *identity_nonce); - contract.set_id(new_id); + let document_create_transition: DocumentCreateTransition = + DocumentCreateTransitionV0 { + base: DocumentBaseTransitionV0 { + id: document.id(), + identity_contract_nonce: *identity_contract_nonce, + document_type_name: document_type.name().clone(), + data_contract_id: contract.id(), + } + .into(), + entropy: entropy.to_buffer(), + data: document.properties_consumed(), + } + .into(); - id_mapping.insert(old_id, new_id); // Store the mapping + let document_batch_transition: DocumentsBatchTransition = + DocumentsBatchTransitionV0 { + owner_id: identity.id(), + transitions: vec![document_create_transition.into()], + user_fee_increase: 0, + signature_public_key_id: 2, + signature: BinaryData::default(), + } + .into(); + let mut document_batch_transition: StateTransition = + document_batch_transition.into(); - if let Some(contract_updates) = contract_updates { - for (_, updated_contract) in contract_updates.iter_mut() { - let updated_contract_data = updated_contract.data_contract_mut(); - // Use the new ID from the mapping - if let Some(new_updated_id) = id_mapping.get(&updated_contract_data.id()) { - updated_contract_data.set_id(*new_updated_id); - } - updated_contract_data.set_owner_id(contract.owner_id()); - } - } - - // Update any document transitions that registered to the old contract id - for op in self.operations.iter_mut() { - if let OperationType::Document(document_op) = &mut op.op_type { - document_op.contract = contract.clone(); - let document_type = contract.document_type_cloned_for_name(document_op.document_type.name()) - .expect("Expected to get a document type for name while creating initial strategy contracts"); - document_op.document_type = document_type; - } - } - - DataContractCreateTransition::new_from_data_contract( - contract.clone(), - *identity_nonce, - &identity, - 2, // key id 1 should always be a high or critical auth key in these tests - signer, - platform_version, - None, - ) - .expect("expected to create a create state transition from a data contract") - }) - .collect() - } - - /// Generates state transitions for contract updates in contracts_with_updates based on the current set of identities and block height. - /// - /// This method creates update state transitions for data contracts by iterating over the contracts with updates - /// present in the strategy. For each contract: - /// 1. It checks for any contract updates associated with the provided block height. - /// 2. For each matching update, it locates the corresponding identity based on the owner ID in the update. - /// 3. A new data contract update state transition is then generated using the located identity and the updated contract. - /// - /// # Parameters - /// - `current_identities`: A reference to a list of current identities. - /// - `block_height`: The height of the current block. - /// - `signer`: A reference to a signer instance used during the creation of state transitions. - /// - `platform_version`: The current platform version. - /// - /// # Returns - /// A vector of `StateTransition` for updating data contracts. - /// - /// # Panics - /// The method will panic if it doesn't find an identity matching the owner ID from the data contract update. - /// - /// # Examples - /// ```ignore - /// // Assuming `strategy` is an instance of `Strategy`, - /// // and `current_identities`, `block_height`, `signer`, and `platform_version` are appropriately initialized. - /// let update_transitions = strategy.contract_update_state_transitions(¤t_identities, block_height, &signer, &platform_version); - /// ``` - pub fn contract_update_state_transitions( - &mut self, - current_identities: &[Identity], - block_height: u64, - initial_block_height: u64, - signer: &SimpleSigner, - contract_nonce_counter: &mut BTreeMap<(Identifier, Identifier), u64>, - platform_version: &PlatformVersion, - ) -> Vec { - // Collect updates - let updates: Vec<_> = self - .contracts_with_updates - .iter() - .flat_map(|(_, contract_updates_option)| { - contract_updates_option - .as_ref() - .map_or_else(Vec::new, |contract_updates| { - contract_updates - .iter() - .filter_map(move |(update_height, contract_update)| { - let adjusted_update_height = - initial_block_height + update_height * 3; - if adjusted_update_height != block_height { - return None; - } - current_identities - .iter() - .find(|identity| { - identity.id() == contract_update.data_contract().owner_id() - }) - .map(|identity| { - (identity.clone(), *update_height, contract_update) - }) - }) - .collect::>() - }) - .into_iter() - }) - .collect(); - - // Increment nonce counter, update data contract version, and create state transitions - updates - .into_iter() - .map(|(identity, update_height, contract_update)| { - let identity_info = identity.into_partial_identity_info(); - let contract_id = contract_update.data_contract().id(); - let nonce = contract_nonce_counter - .entry((identity_info.id, contract_id)) - .and_modify(|e| *e += 1) - .or_insert(1); - - // Set the version number on the data contract - let mut contract_update_clone = contract_update.clone(); - let data_contract = contract_update_clone.data_contract_mut(); - data_contract.set_version(update_height as u32); - - // Create the state transition - DataContractUpdateTransition::new_from_data_contract( - data_contract.clone(), - &identity_info, - 2, // Assuming key id 2 is a high or critical auth key - *nonce, - 0, - signer, - platform_version, - None, - ) - .expect("expected to create a state transition from a data contract") - }) - .collect() - } - - /// Generates state transitions for a given block based on Strategy operations. - /// - /// The `state_transitions_for_block` function processes state transitions based on the provided - /// block information, platform, identities, and other input parameters. It facilitates - /// the creation of state transitions for both new documents and updated documents in the system. - /// Only deals with the operations field of Strategy. Not contracts_with_updates or identities fields. - /// - /// # Parameters - /// - `platform`: A reference to the platform, which provides access to various blockchain - /// related functionalities and data. - /// - `block_info`: Information about the block for which the state transitions are being generated. - /// This contains data such as its height and time. - /// - `current_identities`: A mutable reference to the list of current identities in the system. - /// This list is used to facilitate state transitions related to the involved identities. - /// - `signer`: A mutable reference to a signer, which aids in creating cryptographic signatures - /// for the state transitions. - /// - `rng`: A mutable reference to a random number generator, used for generating random values - /// during state transition creation. - /// - `platform_version`: The version of the platform being used. This information is crucial - /// to ensure compatibility and consistency in state transition generation. - /// - /// # Returns - /// A tuple containing: - /// 1. `Vec`: A vector of state transitions generated for the given block. - /// These transitions encompass both new document state transitions and document update transitions. - /// 2. `Vec`: A vector of finalize block operations which may be necessary - /// to conclude the block's processing. - /// - /// # Examples - /// ```ignore - /// let (state_transitions, finalize_ops) = obj.state_transitions_for_block( - /// &platform, - /// &block_info, - /// &mut current_identities, - /// &mut signer, - /// &mut rng, - /// platform_version, - /// ); - /// ``` - /// - /// # Panics - /// This function may panic under unexpected conditions, for example, when unable to generate state - /// transitions for the given block. - pub fn state_transitions_for_block( - &self, - document_query_callback: &mut impl FnMut(LocalDocumentQuery) -> Vec, - identity_fetch_callback: &mut impl FnMut( - Identifier, - Option, - ) -> PartialIdentity, - create_asset_lock: &mut impl FnMut(u64) -> Option<(AssetLockProof, PrivateKey)>, - block_info: &BlockInfo, - current_identities: &mut [Identity], - known_contracts: &mut BTreeMap, - signer: &mut SimpleSigner, - identity_nonce_counter: &mut BTreeMap, - contract_nonce_counter: &mut BTreeMap<(Identifier, Identifier), u64>, - rng: &mut StdRng, - platform_version: &PlatformVersion, - ) -> (Vec, Vec) { - // Lists to store generated operations and block finalization operations - let mut operations = vec![]; - let mut finalize_block_operations = vec![]; - - // Lists to keep track of replaced and deleted documents - let mut replaced = vec![]; - let mut deleted = vec![]; - - // Loop through the operations and generate state transitions based on frequency and type - for op in &self.operations { - // Check if the op frequency hits for this block - if op.frequency.check_hit(rng) { - // Get times_per_block - let count = rng.gen_range(op.frequency.times_per_block_range.clone()); - match &op.op_type { - // Generate state transition for document insert operation with random data - OperationType::Document(DocumentOp { - action: DocumentAction::DocumentActionInsertRandom(fill_type, fill_size), - document_type, - contract, - }) => { - // TO-DO: these documents should be created according to the data contract's validation rules - let documents = document_type - .random_documents_with_params( - count as u32, - current_identities, - Some(block_info.time_ms), - Some(block_info.height), - Some(block_info.core_height), - *fill_type, - *fill_size, - rng, - platform_version, - ) - .expect("expected random_documents_with_params"); - - documents - .into_iter() - .for_each(|(document, identity, entropy)| { - let identity_contract_nonce = contract_nonce_counter - .entry((identity.id(), contract.id())) - .or_default(); - let gap = self - .identity_contract_nonce_gaps - .as_ref() - .map_or(0, |gap_amount| gap_amount.events_if_hit(rng)) - as u64; - *identity_contract_nonce += 1 + gap; - - let document_create_transition: DocumentCreateTransition = - DocumentCreateTransitionV0 { - base: DocumentBaseTransitionV0 { - id: document.id(), - identity_contract_nonce: *identity_contract_nonce, - document_type_name: document_type.name().clone(), - data_contract_id: contract.id(), - } - .into(), - entropy: entropy.to_buffer(), - data: document.properties_consumed(), - } - .into(); - - let document_batch_transition: DocumentsBatchTransition = - DocumentsBatchTransitionV0 { - owner_id: identity.id(), - transitions: vec![document_create_transition.into()], - user_fee_increase: 0, - signature_public_key_id: 2, - signature: BinaryData::default(), - } - .into(); - let mut document_batch_transition: StateTransition = - document_batch_transition.into(); - - let identity_public_key = identity - .get_first_public_key_matching( - Purpose::AUTHENTICATION, - HashSet::from([SecurityLevel::CRITICAL]), - HashSet::from([ - KeyType::ECDSA_SECP256K1, - KeyType::BLS12_381, - ]), - ) - .expect("expected to get a signing key"); + let identity_public_key = identity + .get_first_public_key_matching( + Purpose::AUTHENTICATION, + HashSet::from([SecurityLevel::CRITICAL]), + HashSet::from([ + KeyType::ECDSA_SECP256K1, + KeyType::BLS12_381, + ]), + ) + .expect("expected to get a signing key"); document_batch_transition .sign_external( @@ -1344,123 +1242,312 @@ impl Strategy { (operations, finalize_block_operations) } - /// Generates state transitions for a block by considering new identities. + /// Generates identity-related state transitions for a specified block, considering new and existing identities. /// - /// This function processes state transitions with respect to identities, contracts, - /// and document operations. The state transitions are generated based on the - /// given block's height and other parameters, with special handling for the initial block height. + /// This function orchestrates the creation of state transitions associated with identities, leveraging + /// the `start_identities` field to initialize identities at the strategy's start block, and the `identities_inserts` + /// field to dynamically insert new identities based on a defined frequency. It is essential for simulating + /// identity actions within the blockchain, such as identity creation, throughout the lifecycle of the strategy. + /// + /// The function intelligently handles the initial setup of identities at the beginning of the strategy and + /// supports the continuous introduction of new identities into the simulation, reflecting a more realistic + /// blockchain environment. /// /// # Parameters - /// - `platform`: A reference to the platform, which is parameterized with a mock core RPC type. - /// - `block_info`: Information about the current block, like its height and time. - /// - `current_identities`: A mutable reference to the current set of identities. This list - /// may be appended with new identities during processing. - /// - `signer`: A mutable reference to a signer used for creating cryptographic signatures. - /// - `rng`: A mutable reference to a random number generator. + /// - `block_info`: Provides details about the current block, such as height, to guide the generation of state transitions. + /// - `signer`: A mutable reference to a signer instance, used for signing the state transitions of identities. + /// - `rng`: A mutable reference to a random number generator, for creating randomized elements where necessary. + /// - `create_asset_lock`: A mutable reference to a callback function that generates an asset lock proof and associated private key, used in identity creation transactions. + /// - `config`: Configuration details of the strategy, including the start block height. + /// - `platform_version`: Specifies the version of the Dash Platform, ensuring compatibility with its features and behaviors. /// /// # Returns - /// A tuple containing two vectors: - /// 1. `Vec`: A vector of state transitions generated during processing. - /// 2. `Vec`: A vector of finalize block operations derived during processing. + /// A vector of tuples, each containing an `Identity` and its associated `StateTransition`, representing the actions taken by or on behalf of that identity within the block. /// /// # Examples /// ```ignore - /// let (state_transitions, finalize_ops) = obj.state_transitions_for_block_with_new_identities( - /// &platform, + /// // Assuming `strategy` is an instance of `Strategy`, with `block_info`, `signer`, `rng`, + /// // `create_asset_lock`, `config`, and `platform_version` properly initialized: + /// let identity_transitions = strategy.identity_state_transitions_for_block( /// &block_info, - /// &mut current_identities, /// &mut signer, /// &mut rng, - /// platform_version - /// ); + /// &mut create_asset_lock, + /// &config, + /// &platform_version, + /// ).expect("Expected to generate identity state transitions without error"); /// ``` - pub async fn state_transitions_for_block_with_new_identities( - &mut self, - document_query_callback: &mut impl FnMut(LocalDocumentQuery) -> Vec, - identity_fetch_callback: &mut impl FnMut( - Identifier, - Option, - ) -> PartialIdentity, - create_asset_lock: &mut impl FnMut(u64) -> Option<(AssetLockProof, PrivateKey)>, + /// + /// # Notes + /// This function plays a crucial role in simulating the dynamic nature of identity management on the Dash Platform, + /// allowing for a nuanced and detailed representation of identity-related activities within a blockchain simulation environment. + pub fn identity_state_transitions_for_block( + &self, block_info: &BlockInfo, - current_identities: &mut Vec, - known_contracts: &mut BTreeMap, signer: &mut SimpleSigner, - identity_nonce_counter: &mut BTreeMap, - contract_nonce_counter: &mut BTreeMap<(Identifier, Identifier), u64>, rng: &mut StdRng, + create_asset_lock: &mut impl FnMut(u64) -> Option<(AssetLockProof, PrivateKey)>, config: &StrategyConfig, platform_version: &PlatformVersion, - ) -> (Vec, Vec) { - let mut finalize_block_operations = vec![]; + ) -> Result, ProtocolError> { + let mut state_transitions = vec![]; - // Get identity state transitions - let identity_state_transitions = match self.identity_state_transitions_for_block( - block_info, - signer, - rng, - create_asset_lock, - config, - platform_version, - ) { - Ok(transitions) => transitions, - Err(e) => { - error!("identity_state_transitions_for_block error: {}", e); - return (vec![], finalize_block_operations); + // Add start_identities + if block_info.height == config.start_block_height + && self.start_identities.number_of_identities > 0 + { + let mut new_transitions = crate::transitions::create_identities_state_transitions( + self.start_identities.number_of_identities.into(), // number of identities + self.start_identities.keys_per_identity.into(), // number of keys per identity + signer, + rng, + create_asset_lock, + platform_version, + )?; + state_transitions.append(&mut new_transitions); + } + + // Add identities_inserts + // Don't do this on first block because we need to skip utxo refresh + if block_info.height > config.start_block_height { + let frequency = &self.identities_inserts; + if frequency.check_hit(rng) { + let count = frequency.events(rng); + let mut new_transitions = crate::transitions::create_identities_state_transitions( + count, // number of identities + 3, // number of keys per identity + signer, + rng, + create_asset_lock, + platform_version, + )?; + state_transitions.append(&mut new_transitions); } - }; + } - // Create state_transitions vec and identities vec based on identity_state_transitions outcome - let (mut identities, mut state_transitions): (Vec, Vec) = - identity_state_transitions.into_iter().unzip(); + Ok(state_transitions) + } - // Append the new identities to current_identities - current_identities.append(&mut identities); + /// Initializes contracts and generates their creation state transitions based on the `contracts_with_updates` field. + /// + /// This function orchestrates the setup of initial data contracts specified in the strategy, applying any predefined updates + /// based on the simulation's block height. It assigns ownership of these contracts to identities randomly selected from the + /// current identities list, ensuring dynamic interaction within the simulated environment. Additionally, the function + /// updates the ID of each contract to reflect the ownership and creation details, maintaining the integrity of contract + /// relationships throughout the simulation. + /// + /// For contracts designated with updates, this process also prepares the contracts by adjusting their details to match + /// the simulated block height, ensuring that updates are accurately reflected in the simulation. Operations related to + /// these contracts are updated accordingly to maintain consistency. + /// + /// # Parameters + /// - `current_identities`: A list of current identities available in the simulation. + /// - `identity_nonce_counter`: Tracks nonce values for each identity to ensure unique contract identifiers. + /// - `signer`: A reference to a signer instance for signing the contract creation transactions. + /// - `rng`: A random number generator for selecting identities and generating contract details. + /// - `platform_version`: Indicates the platform version to ensure compatibility with Dash Platform features. + /// + /// # Returns + /// A vector of `StateTransition`, each representing the creation of a data contract within the simulated environment. + /// + /// # Examples + /// ```ignore + /// let initial_contract_transitions = strategy.initial_contract_state_transitions( + /// ¤t_identities, + /// &mut identity_nonce_counter, + /// &signer, + /// &mut rng, + /// &platform_version, + /// ); + /// ``` + /// + /// This function is pivotal for setting up the simulated environment's initial state, providing a foundation for + /// subsequent operations and updates within the strategy. + pub fn initial_contract_state_transitions( + &mut self, + current_identities: &[Identity], + identity_nonce_counter: &mut BTreeMap, + signer: &SimpleSigner, + rng: &mut StdRng, + platform_version: &PlatformVersion, + ) -> Vec { + let mut id_mapping = HashMap::new(); // Maps old IDs to new IDs - // Do we also need to add identities to the identity_nonce_counter? + self.contracts_with_updates + .iter_mut() + .map(|(created_contract, contract_updates)| { + let identity_num = rng.gen_range(0..current_identities.len()); + let identity = current_identities + .get(identity_num) + .unwrap() + .clone() + .into_partial_identity_info(); - // Add initial contracts for contracts_with_updates on first block of strategy - if block_info.height == config.start_block_height { - let mut contract_state_transitions = self.contract_state_transitions( - current_identities, - identity_nonce_counter, - signer, - rng, - platform_version, - ); - state_transitions.append(&mut contract_state_transitions); - } else { - // Do operations and contract updates after the first block - let (mut document_state_transitions, mut add_to_finalize_block_operations) = self - .state_transitions_for_block( - document_query_callback, - identity_fetch_callback, - create_asset_lock, - block_info, - current_identities, - known_contracts, + let contract = created_contract.data_contract_mut(); + + let identity_nonce = identity_nonce_counter.entry(identity.id).or_default(); + *identity_nonce += 1; + + contract.set_owner_id(identity.id); + let old_id = contract.id(); + let new_id = + DataContract::generate_data_contract_id_v0(identity.id, *identity_nonce); + contract.set_id(new_id); + + id_mapping.insert(old_id, new_id); // Store the mapping + + if let Some(contract_updates) = contract_updates { + for (_, updated_contract) in contract_updates.iter_mut() { + let updated_contract_data = updated_contract.data_contract_mut(); + // Use the new ID from the mapping + if let Some(new_updated_id) = id_mapping.get(&updated_contract_data.id()) { + updated_contract_data.set_id(*new_updated_id); + } + updated_contract_data.set_owner_id(contract.owner_id()); + } + } + + // Update any document transitions that registered to the old contract id + for op in self.operations.iter_mut() { + if let OperationType::Document(document_op) = &mut op.op_type { + document_op.contract = contract.clone(); + let document_type = contract.document_type_cloned_for_name(document_op.document_type.name()) + .expect("Expected to get a document type for name while creating initial strategy contracts"); + document_op.document_type = document_type; + } + } + + DataContractCreateTransition::new_from_data_contract( + contract.clone(), + *identity_nonce, + &identity, + 2, // key id 1 should always be a high or critical auth key in these tests signer, - identity_nonce_counter, - contract_nonce_counter, - rng, platform_version, - ); - finalize_block_operations.append(&mut add_to_finalize_block_operations); - state_transitions.append(&mut document_state_transitions); + None, + ) + .expect("expected to create a create state transition from a data contract") + }) + .collect() + } - // Contract updates for contracts_with_updates - let mut contract_update_state_transitions = self.contract_update_state_transitions( - current_identities, - block_info.height, - config.start_block_height, - signer, - contract_nonce_counter, - platform_version, - ); - state_transitions.append(&mut contract_update_state_transitions); - } + /// Generates state transitions for updating contracts based on the current set of identities and the block height. + /// + /// This function identifies and processes updates for data contracts as specified in the strategy, taking into account + /// the current block height to determine which updates to apply. Each eligible update is matched with its corresponding + /// identity based on ownership, ensuring that contract state transitions reflect the intended changes within the simulation. + /// + /// The function dynamically adjusts contract versions and ownership details, generating update state transitions that + /// are applied to the simulated blockchain environment. This process enables the simulation of contract evolution over + /// time, reflecting real-world scenarios where contracts may be updated in response to changing requirements or conditions. + /// + /// # Parameters + /// - `current_identities`: The list of identities involved in the simulation, used to match contract ownership. + /// - `block_height`: The current block height, used to determine eligibility for contract updates. + /// - `initial_block_height`: The block height at which the simulation or strategy begins, for calculating update timing. + /// - `signer`: A reference to a signer instance for signing contract update transactions. + /// - `contract_nonce_counter`: Tracks nonce values for contract interactions, ensuring uniqueness. + /// - `platform_version`: The platform version, for compatibility with Dash Platform features. + /// + /// # Returns + /// A vector of `StateTransition`, each representing an update to a data contract within the simulation. + /// + /// # Examples + /// ```ignore + /// let contract_update_transitions = strategy.initial_contract_update_state_transitions( + /// ¤t_identities, + /// block_height, + /// initial_block_height, + /// &signer, + /// &mut contract_nonce_counter, + /// &platform_version, + /// ); + /// ``` + /// + /// Through these updates, the simulation accurately mirrors the lifecycle of contracts on the Dash Platform, incorporating + /// changes that may occur over time. + pub fn initial_contract_update_state_transitions( + &mut self, + current_identities: &[Identity], + block_height: u64, + initial_block_height: u64, + signer: &SimpleSigner, + contract_nonce_counter: &mut BTreeMap<(Identifier, Identifier), u64>, + platform_version: &PlatformVersion, + ) -> Vec { + // Collect updates + let updates: Vec<_> = self + .contracts_with_updates + .iter() + .flat_map(|(_, contract_updates_option)| { + contract_updates_option + .as_ref() + .map_or_else(Vec::new, |contract_updates| { + contract_updates + .iter() + .filter_map(move |(update_height, contract_update)| { + let adjusted_update_height = + initial_block_height + update_height * 3; + if adjusted_update_height != block_height { + return None; + } + current_identities + .iter() + .find(|identity| { + identity.id() == contract_update.data_contract().owner_id() + }) + .map(|identity| { + (identity.clone(), *update_height, contract_update) + }) + }) + .collect::>() + }) + .into_iter() + }) + .collect(); - (state_transitions, finalize_block_operations) + // Increment nonce counter, update data contract version, and create state transitions + updates + .into_iter() + .map(|(identity, update_height, contract_update)| { + let identity_info = identity.into_partial_identity_info(); + let contract_id = contract_update.data_contract().id(); + let nonce = contract_nonce_counter + .entry((identity_info.id, contract_id)) + .and_modify(|e| *e += 1) + .or_insert(1); + + // Set the version number on the data contract + let mut contract_update_clone = contract_update.clone(); + let data_contract = contract_update_clone.data_contract_mut(); + data_contract.set_version(update_height as u32); + + // Create the state transition + DataContractUpdateTransition::new_from_data_contract( + data_contract.clone(), + &identity_info, + 2, // Assuming key id 2 is a high or critical auth key + *nonce, + 0, + signer, + platform_version, + None, + ) + .expect("expected to create a state transition from a data contract") + }) + .collect() + } + + /// Convenience method to get all contract ids that are in operations + pub fn used_contract_ids(&self) -> BTreeSet { + self.operations + .iter() + .filter_map(|operation| match &operation.op_type { + OperationType::Document(document) => Some(document.contract.id()), + OperationType::ContractUpdate(op) => Some(op.contract.id()), + _ => None, + }) + .collect() } } From 85a7f6cd4829ad67b95007e0efedbeb1b15dd56d Mon Sep 17 00:00:00 2001 From: thephez Date: Tue, 19 Mar 2024 00:22:03 -0400 Subject: [PATCH 102/191] ci: update doc build branch in action config (#1748) --- .github/workflows/docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 7238fbec4e..12f512b720 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -2,7 +2,7 @@ name: Publish docs via GitHub Pages on: push: branches: - - master + - v1.0-dev jobs: build: From 5493ae9d13840b2609d8cb0abc54f7216dac77a3 Mon Sep 17 00:00:00 2001 From: Igor Markin Date: Tue, 19 Mar 2024 11:44:39 +0000 Subject: [PATCH 103/191] feat(dapi): use broadcast_tx instead of deprecated broadcast_tx_sync (#1775) --- .../handlers/platform/broadcastStateTransitionHandlerFactory.js | 2 +- .../platform/broadcastStateTransitionHandlerFactory.spec.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/dapi/lib/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.js b/packages/dapi/lib/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.js index b8a3657fd7..ad77276042 100644 --- a/packages/dapi/lib/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.js +++ b/packages/dapi/lib/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.js @@ -44,7 +44,7 @@ function broadcastStateTransitionHandlerFactory(rpcClient, createGrpcErrorFromDr let response; try { - response = await rpcClient.request('broadcast_tx_sync', { tx }); + response = await rpcClient.request('broadcast_tx', { tx }); } catch (e) { if (e.message === 'socket hang up') { throw new UnavailableGrpcError('Tenderdash is not available'); diff --git a/packages/dapi/test/unit/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.spec.js b/packages/dapi/test/unit/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.spec.js index 4a1b09a9a9..3dc61b2eb4 100644 --- a/packages/dapi/test/unit/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.spec.js +++ b/packages/dapi/test/unit/grpcServer/handlers/platform/broadcastStateTransitionHandlerFactory.spec.js @@ -114,7 +114,7 @@ describe('broadcastStateTransitionHandlerFactory', () => { const tx = stateTransitionFixture.toBuffer().toString('base64'); expect(result).to.be.an.instanceOf(BroadcastStateTransitionResponse); - expect(rpcClientMock.request).to.be.calledOnceWith('broadcast_tx_sync', { tx }); + expect(rpcClientMock.request).to.be.calledOnceWith('broadcast_tx', { tx }); }); it('should throw a UnavailableGrpcError if tenderdash hands up', async () => { From 807942ed33710c2d8ce0ac9e96c403b7b4d1118d Mon Sep 17 00:00:00 2001 From: QuantumExplorer Date: Tue, 19 Mar 2024 18:46:13 +0700 Subject: [PATCH 104/191] feat: identity state transition validation fixes (#1786) Co-authored-by: Lukasz Klimek <842586+lklimek@users.noreply.github.com> Co-authored-by: markin.io Co-authored-by: Ivan Shumkov --- .../createGrpcErrorFromDriveResponse.js | 12 +- .../createGrpcErrorFromDriveResponse.spec.js | 30 +- .../GrpcTransport/createGrpcTransportError.js | 2 +- .../createGrpcTransportError.spec.js | 2 +- .../methods/identities/creditTransfer.ts | 2 +- .../methods/identities/creditWithdrawal.ts | 2 +- .../createIdentityCreateTransition.ts | 102 ++++-- .../platform-test-suite/test/e2e/dpns.spec.js | 14 +- .../test/e2e/withdrawals.spec.js | 6 +- .../functional/platform/DataContract.spec.js | 6 +- .../test/functional/platform/Document.spec.js | 2 +- .../test/functional/platform/Identity.spec.js | 14 +- .../schema/enrich_with_base_schema/mod.rs | 10 +- .../schema/enrich_with_base_schema/v0/mod.rs | 34 +- .../schema/recursive_schema_validator/mod.rs | 6 +- .../methods/validation/v0/mod.rs | 15 +- .../src/errors/consensus/basic/basic_error.rs | 8 + .../errors/consensus/basic/identity/mod.rs | 2 + .../too_many_master_public_key_error.rs | 42 +++ packages/rs-dpp/src/errors/consensus/codes.rs | 318 ++++++++-------- ...alid_signature_public_key_purpose_error.rs | 47 +++ .../src/errors/consensus/signature/mod.rs | 2 + .../consensus/signature/signature_error.rs | 4 + .../master_public_key_update_error.rs | 66 ++++ .../errors/consensus/state/identity/mod.rs | 1 + .../identity/identity_public_key/purpose.rs | 35 +- .../identity/identity_public_key/random.rs | 84 ++++- .../identity/identity_public_key/v0/random.rs | 25 ++ .../src/serialization/serialization_traits.rs | 2 +- packages/rs-dpp/src/signing.rs | 43 ++- packages/rs-dpp/src/state_transition/mod.rs | 8 +- .../v0/identity_signed.rs | 4 +- .../identity_signed.rs | 8 +- .../v0/identity_signed.rs | 6 +- .../identity_signed.rs | 8 +- .../v0/identity_signed.rs | 6 +- .../v0/v0_methods.rs | 2 +- .../mod.rs | 2 + .../v0/mod.rs | 32 +- .../state_transition_identity_signed.rs | 14 +- .../src/execution/check_tx/v0/mod.rs | 40 ++- .../disable_identity_keys/v0/mod.rs | 4 +- .../get_operator_identity_keys/v0/mod.rs | 2 +- .../get_owner_identity_key/v0/mod.rs | 2 +- .../update_operator_identity/v0/mod.rs | 6 +- .../check_tx_verification/v0/mod.rs | 4 +- .../validation/state_transition/common/mod.rs | 1 + .../mod.rs | 6 +- .../v0/mod.rs | 24 +- .../mod.rs | 30 ++ .../v0/mod.rs | 42 +++ .../v0/mod.rs | 49 ++- .../state_transition/processor/v0/mod.rs | 148 ++++---- .../data_contract_create/state/v0/mod.rs | 2 +- .../data_contract_update/state/v0/mod.rs | 40 +-- .../advanced_structure/v0/mod.rs | 56 ++- .../state_transitions/documents_batch/mod.rs | 2 +- .../documents_batch/state/v0/mod.rs | 4 +- .../identity_and_signatures/v0/mod.rs | 36 +- .../identity_create/structure/v0/mod.rs | 1 + .../mod.rs | 0 .../v0/mod.rs | 59 +-- .../{structure => basic_structure}/mod.rs | 0 .../{structure => basic_structure}/v0/mod.rs | 1 + .../state_transitions/identity_update/mod.rs | 6 +- .../identity_update/state/v0/mod.rs | 34 +- .../tests/strategy_tests/chain_lock_update.rs | 8 +- .../tests/strategy_tests/core_update_tests.rs | 20 +- .../tests/strategy_tests/execution.rs | 19 +- .../tests/strategy_tests/failures.rs | 20 +- .../tests/strategy_tests/main.rs | 340 +++++++++++------- .../tests/strategy_tests/query.rs | 20 +- .../tests/strategy_tests/strategy.rs | 59 ++- .../strategy_tests/upgrade_fork_tests.rs | 45 +-- .../v0/mod.rs | 12 +- .../v0/mod.rs | 4 +- .../v0/mod.rs | 115 +++--- .../insert_new_non_unique_key/v0/mod.rs | 2 +- .../insert/insert_new_unique_key/v0/mod.rs | 2 +- packages/rs-drive/src/drive/identity/mod.rs | 21 +- .../transformer.rs | 91 +++-- .../v0/transformer.rs | 81 ++--- .../bump_identity_nonce_action/transformer.rs | 98 +++-- .../v0/transformer.rs | 161 ++++----- .../src/converter/ciborium.rs | 12 +- .../src/converter/serde_json.rs | 24 +- packages/rs-platform-value/src/display.rs | 8 +- .../src/version/drive_abci_versions.rs | 1 + .../src/version/mocks/v2_test.rs | 7 +- .../src/version/mocks/v3_test.rs | 3 +- .../rs-platform-version/src/version/v1.rs | 3 +- ...7776113debe4287515ae60d0645da450a80a1.json | Bin 0 -> 21981 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 0 -> 74149 bytes ...48c03122daf7ab2e77108f4bf44af1ad15eae.json | Bin 0 -> 8862 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 0 -> 74149 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 0 -> 74149 bytes ...7776113debe4287515ae60d0645da450a80a1.json | Bin 0 -> 21981 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 0 -> 74149 bytes ...71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json | Bin 0 -> 74149 bytes ...501c1ba166a2dd8f6efb31b0289dc011da983.json | Bin 0 -> 8862 bytes ...abbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json | Bin 0 -> 8715 bytes ...067bd9ccc29eca3092a5664a5a9ba3bb7e967.json | Bin 0 -> 75622 bytes ...67089535588985622579e77969e0ffd68afc7.json | Bin 0 -> 21008 bytes ...6caf3663c40a12d3b03827006d66058e439ac.json | Bin 0 -> 1466420 bytes ...093d92d2c84b425f8393ffa9599b06a3a77be.json | Bin 0 -> 24209 bytes ...7776113debe4287515ae60d0645da450a80a1.json | Bin 0 -> 21964 bytes ...7776113debe4287515ae60d0645da450a80a1.json | Bin 0 -> 21964 bytes ...625892e0011f1264c65e1474532f59456ff51.json | Bin 0 -> 24209 bytes ...af38ff6415d9cabab87315b9d9d736194597f.json | Bin 0 -> 24335 bytes ...7776113debe4287515ae60d0645da450a80a1.json | Bin 0 -> 11759 bytes ...fcf0df7bf150009b1ced887a6f051ab86085b.json | Bin 0 -> 22309 bytes ...7776113debe4287515ae60d0645da450a80a1.json | Bin 0 -> 21964 bytes ...093d92d2c84b425f8393ffa9599b06a3a77be.json | Bin 0 -> 24209 bytes ...7776113debe4287515ae60d0645da450a80a1.json | Bin 0 -> 20815 bytes ...4a459dc7a67570ea6df3f8858d3fae7820ffe.json | Bin 0 -> 15482 bytes ...8fa69b4749b19cc1f5ef0abf37fa0c04ab2ef.json | Bin 0 -> 14552 bytes ...c53464633a072722c5a04b15ee01f3a45de99.json | Bin 0 -> 24692 bytes ...c53464633a072722c5a04b15ee01f3a45de99.json | Bin 0 -> 24692 bytes ...9550f0ea4a6af6f68037e7d50ff4e4de74509.json | Bin 0 -> 8210 bytes ...106e5eda740be44679cc960ea35f2134af628.json | Bin 0 -> 10885 bytes ...bf1acc3394d29ac72f662d38e81344496631e.json | Bin 0 -> 10634 bytes ...9b1a05862cb8d40c088b193b59ca3564210bc.json | Bin 0 -> 11307 bytes ...22dfc69cc7b123be24b7ad993281979b2a3a2.json | Bin 0 -> 10992 bytes ...3efbcc93fdbc66e012e606d530c327265c52d.json | Bin 0 -> 30798 bytes ...d592c8fe7361bed628d9a36747664c9789bf1.json | Bin 0 -> 2437728 bytes ...b0b93d9d2e841a5e3d60755f8e7be3b93315b.json | Bin 0 -> 2425354 bytes ...add01a7428085ffdcf1e11cccf19c48c5f7a1.json | Bin 0 -> 2668628 bytes ...21dcf2753e9d37578afcce21a36925ab5248a.json | 1 + packages/strategy-tests/src/lib.rs | 54 ++- packages/strategy-tests/src/transitions.rs | 52 ++- ...alid_signature_public_key_purpose_error.rs | 39 ++ .../src/errors/consensus/basic/mod.rs | 2 + .../src/errors/consensus/consensus_error.rs | 6 +- .../identity/identity_public_key/purpose.rs | 4 +- .../validateDataContractFactory.spec.js | 2 +- .../deserializeConsensusError.spec.js | 4 +- ...ntractUpdateTransitionStateFactory.spec.js | 2 +- .../validateDataContractPatterns.spec.js | 2 +- ...ocumentsUniquenessByIndicesFactory.spec.js | 2 +- 139 files changed, 1886 insertions(+), 1087 deletions(-) create mode 100644 packages/rs-dpp/src/errors/consensus/basic/identity/too_many_master_public_key_error.rs create mode 100644 packages/rs-dpp/src/errors/consensus/signature/invalid_signature_public_key_purpose_error.rs create mode 100644 packages/rs-dpp/src/errors/consensus/state/identity/master_public_key_update_error.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_not_disabling_last_master_key/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_not_disabling_last_master_key/v0/mod.rs rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/{identity_and_signatures => advanced_structure}/mod.rs (100%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/{identity_and_signatures => advanced_structure}/v0/mod.rs (64%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/{structure => basic_structure}/mod.rs (100%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/{structure => basic_structure}/v0/mod.rs (99%) create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.629451923Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.630123500Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.630642159Z_GetDataContractRequest_1d1e53ab5e04d9ec5dce4ff9ac048c03122daf7ab2e77108f4bf44af1ad15eae.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.630652428Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.632256765Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.632500304Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.633007782Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.634383016Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.637905030Z_GetDataContractRequest_e4cf74168e03a40bd159451456b501c1ba166a2dd8f6efb31b0289dc011da983.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.637905411Z_GetDataContractsRequest_93bdf343bce1bafb96fd873236cabbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.639022859Z_GetDataContractsRequest_f229a0e58a5c4fb050f57c087bf067bd9ccc29eca3092a5664a5a9ba3bb7e967.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.642649491Z_GetEpochsInfoRequest_1b87e649557ccb609adb9e2904c67089535588985622579e77969e0ffd68afc7.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.719566753Z_GetEpochsInfoRequest_b2b426ac4a52cb4cb08904c63386caf3663c40a12d3b03827006d66058e439ac.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.787102609Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.791025249Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.813846802Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.815461989Z_DocumentQuery_c104c67292061fe0b8e2f959cd2625892e0011f1264c65e1474532f59456ff51.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.815625277Z_DocumentQuery_90af5a08200f1b0e42dbd3ad7a6af38ff6415d9cabab87315b9d9d736194597f.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.815887401Z_GetIdentityBalanceRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.818184304Z_DocumentQuery_fb3b25c8fa37750a6c1b18d9085fcf0df7bf150009b1ced887a6f051ab86085b.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.818401023Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.819407923Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.823315675Z_GetIdentityBalanceAndRevisionRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.824051072Z_GetIdentityKeysRequest_b4ecff7acf52818aef9ed37a98d4a459dc7a67570ea6df3f8858d3fae7820ffe.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.837728485Z_GetIdentityContractNonceRequest_b7c02dae0c3c762ece1f70a36f88fa69b4749b19cc1f5ef0abf37fa0c04ab2ef.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.838169256Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.841927325Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.866849731Z_GetProtocolVersionUpgradeStateRequest_bb149e1933b9dc561bbfacfb6d09550f0ea4a6af6f68037e7d50ff4e4de74509.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.866866313Z_GetProtocolVersionUpgradeVoteStatusRequest_ec9dca65a964669b3bc8195d5ff106e5eda740be44679cc960ea35f2134af628.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.873512881Z_GetProtocolVersionUpgradeVoteStatusRequest_983670ac95678b1166deab32209bf1acc3394d29ac72f662d38e81344496631e.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.895002050Z_GetProtocolVersionUpgradeVoteStatusRequest_8534be7e0b4dd648520dc3a67209b1a05862cb8d40c088b193b59ca3564210bc.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.896617067Z_GetProtocolVersionUpgradeVoteStatusRequest_92a45a0fe4f69d355022d2f2f7622dfc69cc7b123be24b7ad993281979b2a3a2.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.913049807Z_IdentityRequest_8fb3b1a4ef0db316161d4ed79b93efbcc93fdbc66e012e606d530c327265c52d.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:46.146063724Z_GetEpochsInfoRequest_734f6594c67fe6a9ab170191031d592c8fe7361bed628d9a36747664c9789bf1.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:46.188023131Z_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json create mode 100644 packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:46.205942235Z_GetEpochsInfoRequest_6a828350e795a088dbc835260a1add01a7428085ffdcf1e11cccf19c48c5f7a1.json create mode 100644 packages/rs-sdk/tests/vectors/quorum_pubkey-106-2e7d8ac39b3d5ce5c585b18badd21dcf2753e9d37578afcce21a36925ab5248a.json create mode 100644 packages/wasm-dpp/src/errors/consensus/basic/invalid_signature_public_key_purpose_error.rs diff --git a/packages/dapi/lib/grpcServer/handlers/createGrpcErrorFromDriveResponse.js b/packages/dapi/lib/grpcServer/handlers/createGrpcErrorFromDriveResponse.js index 924b5a709e..b6e7032f85 100644 --- a/packages/dapi/lib/grpcServer/handlers/createGrpcErrorFromDriveResponse.js +++ b/packages/dapi/lib/grpcServer/handlers/createGrpcErrorFromDriveResponse.js @@ -101,7 +101,7 @@ async function createGrpcErrorFromDriveResponse(code, info) { } // Undefined Drive and DAPI errors - if (code >= 17 && code < 1000) { + if (code >= 17 && code < 10000) { return new GrpcError( GrpcErrorCodes.UNKNOWN, message, @@ -110,7 +110,7 @@ async function createGrpcErrorFromDriveResponse(code, info) { } // DPP errors - if (code >= 1000 && code < 5000) { + if (code >= 10000 && code < 50000) { let consensusError; try { consensusError = deserializeConsensusError(data.serializedError || []); @@ -125,7 +125,7 @@ async function createGrpcErrorFromDriveResponse(code, info) { } // Basic - if (code >= 1000 && code < 2000) { + if (code >= 10000 && code < 20000) { return new InvalidArgumentGrpcError( consensusError.message, { code, ...createRawMetadata(data) }, @@ -133,7 +133,7 @@ async function createGrpcErrorFromDriveResponse(code, info) { } // Signature - if (code >= 2000 && code < 3000) { + if (code >= 20000 && code < 30000) { return new GrpcError( GrpcErrorCodes.UNAUTHENTICATED, consensusError.message, @@ -142,7 +142,7 @@ async function createGrpcErrorFromDriveResponse(code, info) { } // Fee - if (code >= 3000 && code < 4000) { + if (code >= 30000 && code < 40000) { return new FailedPreconditionGrpcError( consensusError.message, { code, ...createRawMetadata(data) }, @@ -150,7 +150,7 @@ async function createGrpcErrorFromDriveResponse(code, info) { } // State - if (code >= 4000 && code < 5000) { + if (code >= 40000 && code < 50000) { return new InvalidArgumentGrpcError( consensusError.message, { code, ...createRawMetadata(data) }, diff --git a/packages/dapi/test/unit/grpcServer/handlers/createGrpcErrorFromDriveResponse.spec.js b/packages/dapi/test/unit/grpcServer/handlers/createGrpcErrorFromDriveResponse.spec.js index 88420d1f43..48a4c32e78 100644 --- a/packages/dapi/test/unit/grpcServer/handlers/createGrpcErrorFromDriveResponse.spec.js +++ b/packages/dapi/test/unit/grpcServer/handlers/createGrpcErrorFromDriveResponse.spec.js @@ -66,23 +66,23 @@ describe('createGrpcErrorFromDriveResponse', () => { }); }); - it('should throw basic consensus error if error code = 1000', async () => { + it('should throw basic consensus error if error code = 10000', async () => { const consensusError = new ProtocolVersionParsingError('test'); const data = { serializedError: consensusError.serialize() }; info = { data }; - const error = await createGrpcErrorFromDriveResponse(1000, cbor.encode(info).toString('base64')); + const error = await createGrpcErrorFromDriveResponse(10000, cbor.encode(info).toString('base64')); expect(error).to.be.an.instanceOf(InvalidArgumentGrpcError); expect(error.message).to.be.equals(consensusError.message); expect(error.getRawMetadata()).to.deep.equal({ - code: 1000, + code: 10000, 'drive-error-data-bin': cbor.encode(data), }); }); - it('should throw signature consensus error if error code = 2000', async () => { + it('should throw signature consensus error if error code = 20000', async () => { const id = await generateRandomIdentifierAsync(); const consensusError = new IdentityNotFoundError(id); @@ -91,7 +91,7 @@ describe('createGrpcErrorFromDriveResponse', () => { info = { data }; const error = await createGrpcErrorFromDriveResponse( - 2000, + 20000, cbor.encode(info).toString('base64'), ); @@ -99,27 +99,27 @@ describe('createGrpcErrorFromDriveResponse', () => { expect(error.message).to.be.equals(consensusError.message); expect(error.getCode()).to.equal(GrpcErrorCodes.UNAUTHENTICATED); expect(error.getRawMetadata()).to.deep.equal({ - code: 2000, + code: 20000, 'drive-error-data-bin': cbor.encode(data), }); }); - it('should throw fee consensus error if error code = 3000', async () => { + it('should throw fee consensus error if error code = 30000', async () => { const consensusError = new BalanceIsNotEnoughError(BigInt(20), BigInt(10)); const data = { serializedError: consensusError.serialize() }; info = { data }; - const error = await createGrpcErrorFromDriveResponse(3000, cbor.encode(info).toString('base64')); + const error = await createGrpcErrorFromDriveResponse(30000, cbor.encode(info).toString('base64')); expect(error).to.be.an.instanceOf(FailedPreconditionGrpcError); expect(error.getRawMetadata()).to.deep.equal({ - code: 3000, + code: 30000, 'drive-error-data-bin': cbor.encode(data), }); }); - it('should throw state consensus error if error code = 4000', async () => { + it('should throw state consensus error if error code = 40000', async () => { const dataContractId = await generateRandomIdentifierAsync(); const consensusError = new DataContractAlreadyPresentError(dataContractId); @@ -128,23 +128,23 @@ describe('createGrpcErrorFromDriveResponse', () => { info = { data }; const error = await createGrpcErrorFromDriveResponse( - 4000, + 40000, cbor.encode(info).toString('base64'), ); expect(error).to.be.an.instanceOf(InvalidArgumentGrpcError); expect(error.getRawMetadata()).to.deep.equal({ - code: 4000, + code: 40000, 'drive-error-data-bin': cbor.encode(data), }); }); - it('should throw Unknown error code >= 5000', async () => { - const error = await createGrpcErrorFromDriveResponse(5000, encodedInfo); + it('should throw Unknown error code >= 50000', async () => { + const error = await createGrpcErrorFromDriveResponse(50000, encodedInfo); expect(error).to.be.an.instanceOf(GrpcError); expect(error.getMessage()).to.equal('Internal error'); - expect(error.getError().message).to.deep.equal('Unknown Drive’s error code: 5000'); + expect(error.getError().message).to.deep.equal('Unknown Drive’s error code: 50000'); }); it('should return InternalGrpcError if codes is undefined', async () => { diff --git a/packages/js-dapi-client/lib/transport/GrpcTransport/createGrpcTransportError.js b/packages/js-dapi-client/lib/transport/GrpcTransport/createGrpcTransportError.js index 98043b6121..103c37bb39 100644 --- a/packages/js-dapi-client/lib/transport/GrpcTransport/createGrpcTransportError.js +++ b/packages/js-dapi-client/lib/transport/GrpcTransport/createGrpcTransportError.js @@ -118,7 +118,7 @@ async function createGrpcTransportError(grpcError, dapiAddress) { } // DPP consensus errors - if (code >= 1000 && code < 5000) { + if (code >= 10000 && code < 50000) { const consensusError = deserializeConsensusError(data.serializedError || []); delete data.serializedError; diff --git a/packages/js-dapi-client/test/unit/transport/GrpcTransport/createGrpcTransportError.spec.js b/packages/js-dapi-client/test/unit/transport/GrpcTransport/createGrpcTransportError.spec.js index 7cab061aa3..13205f6e0c 100644 --- a/packages/js-dapi-client/test/unit/transport/GrpcTransport/createGrpcTransportError.spec.js +++ b/packages/js-dapi-client/test/unit/transport/GrpcTransport/createGrpcTransportError.spec.js @@ -168,7 +168,7 @@ describe('createGrpcTransportError', () => { metadata.set('drive-error-data-bin', driveErrorDataBin); const grpcError = new GrpcError( - 1000, + 10001, 'Parsing error', ); grpcError.metadata = metadata; diff --git a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/creditTransfer.ts b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/creditTransfer.ts index f6d05bc556..71c0f19658 100644 --- a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/creditTransfer.ts +++ b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/creditTransfer.ts @@ -28,7 +28,7 @@ export async function creditTransfer( this.logger.silly('[Identity#creditTransfer] Created IdentityCreditTransferTransition'); - const signerKeyIndex = 2; + const signerKeyIndex = 3; await signStateTransition(this, identityCreditTransferTransition, identity, signerKeyIndex); diff --git a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/creditWithdrawal.ts b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/creditWithdrawal.ts index a8ebae7640..a2bd513397 100644 --- a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/creditWithdrawal.ts +++ b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/creditWithdrawal.ts @@ -43,7 +43,7 @@ export async function creditWithdrawal( amount: number, to: string, options: WithdrawalOptions = { - signingKeyIndex: 2, + signingKeyIndex: 3, }, ): Promise { await this.initialize(); diff --git a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/internal/createIdentityCreateTransition.ts b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/internal/createIdentityCreateTransition.ts index d26c80a52a..83ece7d237 100644 --- a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/internal/createIdentityCreateTransition.ts +++ b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/internal/createIdentityCreateTransition.ts @@ -26,36 +26,55 @@ export async function createIdentityCreateTransition( const identityIndex = await account.getUnusedIdentityIndex(); + // Authentication master key + const { privateKey: identityMasterPrivateKey } = account.identities .getIdentityHDKeyByIndex(identityIndex, 0); const identityMasterPublicKey = identityMasterPrivateKey.toPublicKey(); - const { privateKey: identitySecondPrivateKey } = account.identities + const masterKey = new IdentityPublicKey(1); + masterKey.setId(0); + masterKey.setData(identityMasterPublicKey.toBuffer()); + masterKey.setSecurityLevel(IdentityPublicKey.SECURITY_LEVELS.MASTER); + + // Authentication high level key + + const { privateKey: identityHighAuthPrivateKey } = account.identities .getIdentityHDKeyByIndex(identityIndex, 1); - const identitySecondPublicKey = identitySecondPrivateKey.toPublicKey(); + const identityHighAuthPublicKey = identityHighAuthPrivateKey.toPublicKey(); + + const highAuthKey = new IdentityPublicKey(1); + highAuthKey.setId(1); + highAuthKey.setData(identityHighAuthPublicKey.toBuffer()); + highAuthKey.setSecurityLevel(IdentityPublicKey.SECURITY_LEVELS.HIGH); + + // Authentication critical level key - const { privateKey: identityThirdPrivateKey } = account.identities + const { privateKey: identityCriticalAuthPrivateKey } = account.identities .getIdentityHDKeyByIndex(identityIndex, 2); - const identityThirdPublicKey = identityThirdPrivateKey.toPublicKey(); + const identityCriticalAuthPublicKey = identityCriticalAuthPrivateKey.toPublicKey(); - const keyOne = new IdentityPublicKey(1); - keyOne.setData(identityMasterPublicKey.toBuffer()); - keyOne.setSecurityLevel(IdentityPublicKey.SECURITY_LEVELS.MASTER); + const criticalAuthKey = new IdentityPublicKey(1); + criticalAuthKey.setId(2); + criticalAuthKey.setData(identityCriticalAuthPublicKey.toBuffer()); + criticalAuthKey.setSecurityLevel(IdentityPublicKey.SECURITY_LEVELS.CRITICAL); - const keyTwo = new IdentityPublicKey(1); - keyTwo.setId(1); - keyTwo.setData(identitySecondPublicKey.toBuffer()); - keyTwo.setSecurityLevel(IdentityPublicKey.SECURITY_LEVELS.HIGH); + // Transfer key - const keyThree = new IdentityPublicKey(1); - keyThree.setId(2); - keyThree.setData(identityThirdPublicKey.toBuffer()); - keyThree.setSecurityLevel(IdentityPublicKey.SECURITY_LEVELS.CRITICAL); + const { privateKey: identityTransferPrivateKey } = account.identities + .getIdentityHDKeyByIndex(identityIndex, 3); + const identityTransferPublicKey = identityTransferPrivateKey.toPublicKey(); + + const transferKey = new IdentityPublicKey(1); + transferKey.setId(3); + transferKey.setPurpose(IdentityPublicKey.PURPOSES.TRANSFER); + transferKey.setData(identityTransferPublicKey.toBuffer()); + transferKey.setSecurityLevel(IdentityPublicKey.SECURITY_LEVELS.CRITICAL); // Create Identity const identity = dpp.identity.create( assetLockProof.createIdentifier(), - [keyOne, keyTwo, keyThree], + [masterKey, highAuthKey, criticalAuthKey, transferKey], ); // Create ST @@ -65,35 +84,62 @@ export async function createIdentityCreateTransition( ); // Create key proofs - const [masterKey, secondKey, thirdKey] = identityCreateTransition.getPublicKeys(); + const [ + stMasterKey, stHighAuthKey, stCriticalAuthKey, stTransferKey, + ] = identityCreateTransition.getPublicKeys(); + + // Sign master key + + identityCreateTransition.signByPrivateKey( + identityMasterPrivateKey.toBuffer(), + IdentityPublicKey.TYPES.ECDSA_SECP256K1, + ); - await identityCreateTransition - .signByPrivateKey(identityMasterPrivateKey.toBuffer(), IdentityPublicKey.TYPES.ECDSA_SECP256K1); + stMasterKey.setSignature(identityCreateTransition.getSignature()); - masterKey.setSignature(identityCreateTransition.getSignature()); + identityCreateTransition.setSignature(undefined); + + // Sign high auth key + + identityCreateTransition.signByPrivateKey( + identityHighAuthPrivateKey.toBuffer(), + IdentityPublicKey.TYPES.ECDSA_SECP256K1, + ); + + stHighAuthKey.setSignature(identityCreateTransition.getSignature()); identityCreateTransition.setSignature(undefined); - await identityCreateTransition - .signByPrivateKey(identitySecondPrivateKey.toBuffer(), IdentityPublicKey.TYPES.ECDSA_SECP256K1); + // Sign critical auth key - secondKey.setSignature(identityCreateTransition.getSignature()); + identityCreateTransition.signByPrivateKey( + identityCriticalAuthPrivateKey.toBuffer(), + IdentityPublicKey.TYPES.ECDSA_SECP256K1, + ); + + stCriticalAuthKey.setSignature(identityCreateTransition.getSignature()); identityCreateTransition.setSignature(undefined); - await identityCreateTransition - .signByPrivateKey(identityThirdPrivateKey.toBuffer(), IdentityPublicKey.TYPES.ECDSA_SECP256K1); + // Sign transfer key + + identityCreateTransition.signByPrivateKey( + identityTransferPrivateKey.toBuffer(), + IdentityPublicKey.TYPES.ECDSA_SECP256K1, + ); - thirdKey.setSignature(identityCreateTransition.getSignature()); + stTransferKey.setSignature(identityCreateTransition.getSignature()); identityCreateTransition.setSignature(undefined); // Set public keys back after updating their signatures - identityCreateTransition.setPublicKeys([masterKey, secondKey, thirdKey]); + identityCreateTransition.setPublicKeys([ + stMasterKey, stHighAuthKey, stCriticalAuthKey, stTransferKey, + ]); // Sign and validate state transition - await identityCreateTransition + identityCreateTransition .signByPrivateKey(assetLockPrivateKey.toBuffer(), IdentityPublicKey.TYPES.ECDSA_SECP256K1); // TODO(versioning): restore diff --git a/packages/platform-test-suite/test/e2e/dpns.spec.js b/packages/platform-test-suite/test/e2e/dpns.spec.js index b154644cc9..0f592c07e6 100644 --- a/packages/platform-test-suite/test/e2e/dpns.spec.js +++ b/packages/platform-test-suite/test/e2e/dpns.spec.js @@ -107,7 +107,7 @@ describe('DPNS', () => { expect(broadcastError).to.exist(); expect(broadcastError.message).to.be.equal('Action is not allowed'); - expect(broadcastError.code).to.equal(4001); + expect(broadcastError.code).to.equal(40500); }); it('should not be able to delete domain', async () => { @@ -123,7 +123,7 @@ describe('DPNS', () => { expect(broadcastError).to.exist(); expect(broadcastError.message).to.be.equal('Action is not allowed'); - expect(broadcastError.code).to.equal(4001); + expect(broadcastError.code).to.equal(40500); }); }); @@ -153,7 +153,7 @@ describe('DPNS', () => { expect(broadcastError).to.exist(); expect(broadcastError.message).to.be.equal('Can\'t create top level domain for this identity'); - expect(broadcastError.code).to.equal(4001); + expect(broadcastError.code).to.equal(40500); }); it('should be able to register a second level domain', async () => { @@ -185,7 +185,7 @@ describe('DPNS', () => { } expect(broadcastError).to.exist(); - expect(broadcastError.code).to.be.equal(4009); + expect(broadcastError.code).to.be.equal(40105); expect(broadcastError.message).to.match(/Document \w* has duplicate unique properties \["normalizedParentDomainName", "normalizedLabel"] with other documents/); }); @@ -206,7 +206,7 @@ describe('DPNS', () => { expect(broadcastError).to.exist(); expect(broadcastError.message).to.be.equal('Parent domain is not present'); - expect(broadcastError.code).to.equal(4001); + expect(broadcastError.code).to.equal(40500); }); it('should be able to search a domain', async () => { @@ -251,7 +251,7 @@ describe('DPNS', () => { expect(broadcastError).to.exist(); expect(broadcastError.message).to.be.equal('Action is not allowed'); - expect(broadcastError.code).to.equal(4001); + expect(broadcastError.code).to.equal(40500); }); it('should not be able to delete domain', async () => { @@ -267,7 +267,7 @@ describe('DPNS', () => { expect(broadcastError).to.exist(); expect(broadcastError.message).to.be.equal('Action is not allowed'); - expect(broadcastError.code).to.equal(4001); + expect(broadcastError.code).to.equal(40500); }); it('should not be able to register two domains with same `dashAliasIdentityId` record'); diff --git a/packages/platform-test-suite/test/e2e/withdrawals.spec.js b/packages/platform-test-suite/test/e2e/withdrawals.spec.js index 1b146edaea..02e4548329 100644 --- a/packages/platform-test-suite/test/e2e/withdrawals.spec.js +++ b/packages/platform-test-suite/test/e2e/withdrawals.spec.js @@ -202,7 +202,7 @@ describe('Withdrawals', function withdrawalsTest() { expect.fail('should throw broadcast error'); } catch (e) { expect(e.message).to.be.equal('Action is not allowed'); - expect(e.code).to.equal(4001); + expect(e.code).to.equal(40500); } }); @@ -244,7 +244,7 @@ describe('Withdrawals', function withdrawalsTest() { expect.fail('should throw broadcast error'); } catch (e) { expect(e.message).to.be.equal('withdrawal deletion is allowed only for COMPLETE statuses'); - expect(e.code).to.equal(4001); + expect(e.code).to.equal(40500); } }); @@ -267,7 +267,7 @@ describe('Withdrawals', function withdrawalsTest() { expect.fail('should throw broadcast error'); } catch (e) { expect(e.message).to.be.equal('Action is not allowed'); - expect(e.code).to.equal(4001); + expect(e.code).to.equal(40500); } }); }); diff --git a/packages/platform-test-suite/test/functional/platform/DataContract.spec.js b/packages/platform-test-suite/test/functional/platform/DataContract.spec.js index 6f75e906ba..775a842d5e 100644 --- a/packages/platform-test-suite/test/functional/platform/DataContract.spec.js +++ b/packages/platform-test-suite/test/functional/platform/DataContract.spec.js @@ -55,7 +55,7 @@ describe('Platform', () => { } expect(broadcastError).to.be.an.instanceOf(StateTransitionBroadcastError); - expect(broadcastError.getCause().getCode()).to.equal(2000); + expect(broadcastError.getCause().getCode()).to.equal(20000); expect(broadcastError.getCause()).to.be.an.instanceOf(IdentityNotFoundError); }); @@ -101,7 +101,7 @@ describe('Platform', () => { } expect(broadcastError).to.be.an.instanceOf(StateTransitionBroadcastError); - expect(broadcastError.getCause().getCode()).to.equal(1050); + expect(broadcastError.getCause().getCode()).to.equal(10212); expect(broadcastError.getCause()).to.be.an.instanceOf(InvalidDataContractVersionError); }); @@ -127,7 +127,7 @@ describe('Platform', () => { } expect(broadcastError).to.be.an.instanceOf(StateTransitionBroadcastError); - expect(broadcastError.getCause().getCode()).to.equal(1051); + expect(broadcastError.getCause().getCode()).to.equal(10213); expect(broadcastError.getCause()).to.be.an.instanceOf(IncompatibleDataContractSchemaError); }); diff --git a/packages/platform-test-suite/test/functional/platform/Document.spec.js b/packages/platform-test-suite/test/functional/platform/Document.spec.js index 3b03f98586..55b5c03a48 100644 --- a/packages/platform-test-suite/test/functional/platform/Document.spec.js +++ b/packages/platform-test-suite/test/functional/platform/Document.spec.js @@ -196,7 +196,7 @@ describe('Platform', () => { expect(broadcastError.code) .to .be - .equal(4009); + .equal(40105); expect(broadcastError.message) .to .match(/Document \w* has duplicate unique properties \["\$ownerId", "firstName"] with other documents/); diff --git a/packages/platform-test-suite/test/functional/platform/Identity.spec.js b/packages/platform-test-suite/test/functional/platform/Identity.spec.js index 7016119ec5..4d39d67755 100644 --- a/packages/platform-test-suite/test/functional/platform/Identity.spec.js +++ b/packages/platform-test-suite/test/functional/platform/Identity.spec.js @@ -66,7 +66,7 @@ describe('Platform', () => { } expect(broadcastError).to.be.an.instanceOf(StateTransitionBroadcastError); - expect(broadcastError.getCause().getCode()).to.equal(4029); + expect(broadcastError.getCause().getCode()).to.equal(40212); expect(broadcastError.getCause()).to.be.an.instanceOf( InvalidAssetLockProofValueError, ); @@ -104,7 +104,7 @@ describe('Platform', () => { } expect(broadcastError).to.be.an.instanceOf(StateTransitionBroadcastError); - expect(broadcastError.getCause().getCode()).to.equal(1042); + expect(broadcastError.getCause().getCode()).to.equal(10513); expect(broadcastError.getCause()).to.be.an.instanceOf( InvalidInstantAssetLockProofSignatureError, ); @@ -158,7 +158,7 @@ describe('Platform', () => { } expect(broadcastError).to.be.an.instanceOf(StateTransitionBroadcastError); - expect(broadcastError.getCause().getCode()).to.equal(1033); + expect(broadcastError.getCause().getCode()).to.equal(10504); expect(broadcastError.getCause()).to.be.an.instanceOf( IdentityAssetLockTransactionOutPointAlreadyExistsError, ); @@ -209,7 +209,7 @@ describe('Platform', () => { } expect(broadcastError).to.be.an.instanceOf(StateTransitionBroadcastError); - expect(broadcastError.getCause().getCode()).to.equal(2009); + expect(broadcastError.getCause().getCode()).to.equal(20009); expect(broadcastError.getCause()).to.be.an.instanceOf( BasicECDSAError, ); @@ -585,7 +585,7 @@ describe('Platform', () => { it('should be able to add public key to the identity', async () => { const identityBeforeUpdate = identity.toObject(); - expect(identityBeforeUpdate.publicKeys[3]).to.not.exist(); + const nextKeyId = identityBeforeUpdate.publicKeys.length; const account = await client.platform.client.getWalletAccount(); const identityIndex = await account.getUnusedIdentityIndex(); @@ -597,7 +597,7 @@ describe('Platform', () => { const identityPublicKey = identityPrivateKey.toPublicKey().toBuffer(); const newPublicKey = new IdentityPublicKeyWithWitness(1); - newPublicKey.setId(3); + newPublicKey.setId(nextKeyId); newPublicKey.setSecurityLevel(IdentityPublicKey.SECURITY_LEVELS.MEDIUM); newPublicKey.setData(identityPublicKey); @@ -623,7 +623,7 @@ describe('Platform', () => { expect(identity.getPublicKeyById(2)).to.exist(); const newPublicKeyObject = newPublicKey.toObject(true); - const expectedPublicKey = identity.getPublicKeyById(3).toObject(true); + const expectedPublicKey = identity.getPublicKeyById(4).toObject(true); delete expectedPublicKey.disabledAt; expect(expectedPublicKey).to.deep.equal( newPublicKeyObject, diff --git a/packages/rs-dpp/src/data_contract/document_type/schema/enrich_with_base_schema/mod.rs b/packages/rs-dpp/src/data_contract/document_type/schema/enrich_with_base_schema/mod.rs index 8dad4f62c0..dc7019cf7a 100644 --- a/packages/rs-dpp/src/data_contract/document_type/schema/enrich_with_base_schema/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/schema/enrich_with_base_schema/mod.rs @@ -1,5 +1,7 @@ mod v0; +use crate::consensus::basic::BasicError; +use crate::consensus::ConsensusError; use crate::data_contract::document_type::DocumentType; use crate::ProtocolError; use platform_value::Value; @@ -18,7 +20,13 @@ impl DocumentType { .schema .enrich_with_base_schema { - 0 => v0::enrich_with_base_schema_v0(schema, schema_defs), + 0 => Ok( + v0::enrich_with_base_schema_v0(schema, schema_defs).map_err(|e| { + ProtocolError::ConsensusError( + ConsensusError::BasicError(BasicError::ContractError(e)).into(), + ) + })?, + ), version => Err(ProtocolError::UnknownVersionMismatch { method: "enrich_with_base_schema".to_string(), known_versions: vec![0], diff --git a/packages/rs-dpp/src/data_contract/document_type/schema/enrich_with_base_schema/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/schema/enrich_with_base_schema/v0/mod.rs index 706070c876..74401626f3 100644 --- a/packages/rs-dpp/src/data_contract/document_type/schema/enrich_with_base_schema/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/schema/enrich_with_base_schema/v0/mod.rs @@ -1,9 +1,6 @@ -use crate::consensus::basic::BasicError; -use crate::consensus::ConsensusError; use crate::data_contract::document_type::property_names; use crate::data_contract::errors::DataContractError; use crate::data_contract::serialized_version::v0::property_names as contract_property_names; -use crate::ProtocolError; use platform_value::{Value, ValueMapHelper}; pub const DATA_CONTRACT_SCHEMA_URI_V0: &str = @@ -16,27 +13,17 @@ const TIMESTAMPS: [&str; 2] = ["$createdAt", "$updatedAt"]; pub fn enrich_with_base_schema_v0( mut schema: Value, schema_defs: Option, -) -> Result { +) -> Result { let schema_map = schema.to_map_mut().map_err(|err| { - ProtocolError::ConsensusError( - ConsensusError::BasicError(BasicError::ContractError( - DataContractError::InvalidContractStructure(format!( - "document schema must be an object: {err}" - )), - )) - .into(), - ) + DataContractError::InvalidContractStructure(format!( + "document schema must be an object: {err}" + )) })?; // Add $schema if schema_map.get_optional_key(PROPERTY_SCHEMA).is_some() { - return Err(ProtocolError::ConsensusError( - ConsensusError::BasicError(BasicError::ContractError( - DataContractError::InvalidContractStructure( - "document schema shouldn't contain '$schema' property".to_string(), - ), - )) - .into(), + return Err(DataContractError::InvalidContractStructure( + "document schema shouldn't contain '$schema' property".to_string(), )); } @@ -50,13 +37,8 @@ pub fn enrich_with_base_schema_v0( .get_optional_key(contract_property_names::DEFINITIONS) .is_some() { - return Err(ProtocolError::ConsensusError( - ConsensusError::BasicError(BasicError::ContractError( - DataContractError::InvalidContractStructure( - "document schema shouldn't contain '$defs' property".to_string(), - ), - )) - .into(), + return Err(DataContractError::InvalidContractStructure( + "document schema shouldn't contain '$defs' property".to_string(), )); } diff --git a/packages/rs-dpp/src/data_contract/document_type/schema/recursive_schema_validator/mod.rs b/packages/rs-dpp/src/data_contract/document_type/schema/recursive_schema_validator/mod.rs index 4a550196fa..2910e97487 100644 --- a/packages/rs-dpp/src/data_contract/document_type/schema/recursive_schema_validator/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/schema/recursive_schema_validator/mod.rs @@ -114,7 +114,7 @@ mod test { err.pattern(), "^((?!-|_)[a-zA-Z0-9-_]{0,62}[a-zA-Z0-9])$".to_string() ); - assert_eq!(consensus_error.code(), 1009); + assert_eq!(consensus_error.code(), 10202); } _ => panic!("Expected error to be IncompatibleRe2PatternError"), } @@ -157,7 +157,7 @@ mod test { err.pattern(), "^((?!-|_)[a-zA-Z0-9-_]{0,62}[a-zA-Z0-9])$".to_string() ); - assert_eq!(consensus_error.code(), 1009); + assert_eq!(consensus_error.code(), 10202); } _ => panic!("Expected error to be IncompatibleRe2PatternError"), } @@ -187,7 +187,7 @@ mod test { err.pattern(), "^((?!-|_)[a-zA-Z0-9-_]{0,62}[a-zA-Z0-9])$".to_string() ); - assert_eq!(consensus_error.code(), 1009); + assert_eq!(consensus_error.code(), 10202); } _ => panic!("Expected error to be IncompatibleRe2PatternError"), } diff --git a/packages/rs-dpp/src/data_contract/methods/validation/v0/mod.rs b/packages/rs-dpp/src/data_contract/methods/validation/v0/mod.rs index c84d23d11d..4b1791ac2b 100644 --- a/packages/rs-dpp/src/data_contract/methods/validation/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/methods/validation/v0/mod.rs @@ -3,6 +3,8 @@ use crate::data_contract::document_type::accessors::DocumentTypeV0Getters; use crate::data_contract::document_type::{DocumentType, DocumentTypeRef}; use crate::consensus::basic::document::{InvalidDocumentTypeError, MissingDocumentTypeError}; +use crate::consensus::basic::BasicError; +use crate::consensus::ConsensusError; use crate::data_contract::schema::DataContractSchemaMethodsV0; use crate::data_contract::DataContract; use crate::document::{property_names, Document, DocumentV0Getters}; @@ -47,6 +49,8 @@ impl DataContract { // Compile json schema validator if it's not yet compiled if !validator.is_compiled(platform_version)? { + // It is normal that we get a protocol error here, since the document type is coming + // from the state let root_schema = DocumentType::enrich_with_base_schema( // TODO: I just wondering if we could you references here // instead of cloning @@ -62,11 +66,12 @@ impl DataContract { validator.compile(&root_json_schema, platform_version)?; } - let json_value = value - .try_into_validating_json() - .map_err(ProtocolError::ValueError)?; - - validator.validate(&json_value, platform_version) + match value.try_into_validating_json() { + Ok(json_value) => validator.validate(&json_value, platform_version), + Err(e) => Ok(SimpleConsensusValidationResult::new_with_error( + ConsensusError::BasicError(BasicError::ValueError(e.into())), + )), + } } // TODO: Move to document diff --git a/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs b/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs index d29eb47fb0..516c49f9a5 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs @@ -46,6 +46,7 @@ use crate::consensus::basic::identity::{ InvalidIdentityUpdateTransitionDisableKeysError, InvalidIdentityUpdateTransitionEmptyError, InvalidInstantAssetLockProofError, InvalidInstantAssetLockProofSignatureError, MissingMasterPublicKeyError, NotImplementedIdentityCreditWithdrawalTransitionPoolingError, + TooManyMasterPublicKeyError, }; use crate::consensus::basic::invalid_identifier_error::InvalidIdentifierError; use crate::consensus::basic::state_transition::{ @@ -59,6 +60,7 @@ use crate::consensus::basic::json_schema_compilation_error::JsonSchemaCompilatio use crate::consensus::basic::json_schema_error::JsonSchemaError; use crate::consensus::basic::unsupported_version_error::UnsupportedVersionError; use crate::consensus::basic::value_error::ValueError; +use crate::consensus::state::identity::master_public_key_update_error::MasterPublicKeyUpdateError; use crate::data_contract::errors::DataContractError; #[derive(Error, Debug, PlatformSerialize, PlatformDeserialize, Encode, Decode, Clone)] @@ -277,6 +279,12 @@ pub enum BasicError { #[error(transparent)] MissingMasterPublicKeyError(MissingMasterPublicKeyError), + #[error(transparent)] + TooManyMasterPublicKeyError(TooManyMasterPublicKeyError), + + #[error(transparent)] + MasterPublicKeyUpdateError(MasterPublicKeyUpdateError), + #[error(transparent)] InvalidDocumentTypeRequiredSecurityLevelError(InvalidDocumentTypeRequiredSecurityLevelError), diff --git a/packages/rs-dpp/src/errors/consensus/basic/identity/mod.rs b/packages/rs-dpp/src/errors/consensus/basic/identity/mod.rs index 2193b587c2..6a62261e5d 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/identity/mod.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/identity/mod.rs @@ -26,6 +26,7 @@ pub use invalid_instant_asset_lock_proof_error::*; pub use invalid_instant_asset_lock_proof_signature_error::*; pub use missing_master_public_key_error::*; pub use not_implemented_identity_credit_withdrawal_transition_pooling_error::*; +pub use too_many_master_public_key_error::*; mod data_contract_bounds_not_present_error; mod disabling_key_id_also_being_added_in_same_transition_error; @@ -55,3 +56,4 @@ mod invalid_instant_asset_lock_proof_error; mod invalid_instant_asset_lock_proof_signature_error; mod missing_master_public_key_error; mod not_implemented_identity_credit_withdrawal_transition_pooling_error; +mod too_many_master_public_key_error; diff --git a/packages/rs-dpp/src/errors/consensus/basic/identity/too_many_master_public_key_error.rs b/packages/rs-dpp/src/errors/consensus/basic/identity/too_many_master_public_key_error.rs new file mode 100644 index 0000000000..0b8bda2d2c --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/basic/identity/too_many_master_public_key_error.rs @@ -0,0 +1,42 @@ +use crate::consensus::basic::BasicError; +use crate::consensus::ConsensusError; +use crate::errors::ProtocolError; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use thiserror::Error; + +use bincode::{Decode, Encode}; + +#[derive( + Error, + Debug, + Clone, + PartialEq, + Eq, + Default, + Encode, + Decode, + PlatformSerialize, + PlatformDeserialize, +)] +#[error( + "Identity is trying to be created with more than one master key. Please only use one master key." +)] +#[platform_serialize(unversioned)] +pub struct TooManyMasterPublicKeyError; + +/* + +DO NOT CHANGE ORDER OF FIELDS WITHOUT INTRODUCING OF NEW VERSION + +*/ + +impl TooManyMasterPublicKeyError { + pub fn new() -> Self { + Self + } +} +impl From for ConsensusError { + fn from(err: TooManyMasterPublicKeyError) -> Self { + Self::BasicError(BasicError::TooManyMasterPublicKeyError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/codes.rs b/packages/rs-dpp/src/errors/consensus/codes.rs index 838c419f5d..a843928069 100644 --- a/packages/rs-dpp/src/errors/consensus/codes.rs +++ b/packages/rs-dpp/src/errors/consensus/codes.rs @@ -26,122 +26,121 @@ impl ErrorWithCode for ConsensusError { } } } - impl ErrorWithCode for BasicError { fn code(&self) -> u32 { match self { - // Versioning - Self::UnsupportedVersionError(_) => 1100, - // Decoding - Self::ProtocolVersionParsingError { .. } => 1000, - Self::SerializedObjectParsingError { .. } => 1001, - Self::UnsupportedProtocolVersionError(_) => 1002, - Self::IncompatibleProtocolVersionError(_) => 1003, - Self::VersionError(_) => 1004, - - // Structure error - Self::JsonSchemaCompilationError(..) => 1004, - Self::JsonSchemaError(_) => 1005, - Self::InvalidIdentifierError { .. } => 1006, - Self::ValueError(_) => 1060, - - // DataContract - Self::DataContractMaxDepthExceedError { .. } => 1007, - Self::DuplicateIndexError { .. } => 1008, - Self::IncompatibleRe2PatternError { .. } => 1009, - Self::InvalidCompoundIndexError { .. } => 1010, - Self::InvalidDataContractIdError { .. } => 1011, - Self::InvalidIndexedPropertyConstraintError { .. } => 1012, - Self::InvalidIndexPropertyTypeError { .. } => 1013, - Self::InvalidJsonSchemaRefError { .. } => 1014, - Self::SystemPropertyIndexAlreadyPresentError { .. } => 1015, - Self::UndefinedIndexPropertyError { .. } => 1016, - Self::UniqueIndicesLimitReachedError { .. } => 1017, - Self::DuplicateIndexNameError { .. } => 1048, - Self::InvalidDataContractVersionError { .. } => 1050, - Self::IncompatibleDataContractSchemaError { .. } => 1051, - Self::DataContractEmptySchemaError { .. } => 1069, - Self::DataContractImmutablePropertiesUpdateError { .. } => 1052, - Self::DataContractUniqueIndicesChangedError { .. } => 1053, - Self::DataContractInvalidIndexDefinitionUpdateError { .. } => 1054, - Self::DataContractHaveNewUniqueIndexError { .. } => 1055, - Self::InvalidDocumentTypeRequiredSecurityLevelError { .. } => 1071, - Self::UnknownSecurityLevelError { .. } => 1072, - Self::UnknownStorageKeyRequirementsError { .. } => 1073, - Self::ContractError(DataContractError::DecodingContractError { .. }) => 1074, - Self::ContractError(DataContractError::DecodingDocumentError { .. }) => 1076, - Self::ContractError(DataContractError::InvalidDocumentTypeError { .. }) => 1077, - Self::ContractError(DataContractError::MissingRequiredKey(_)) => 1078, - Self::ContractError(DataContractError::FieldRequirementUnmet(_)) => 1079, - Self::ContractError(DataContractError::KeyWrongType(_)) => 1080, - Self::ContractError(DataContractError::ValueWrongType(_)) => 1081, - Self::ContractError(DataContractError::ValueDecodingError(_)) => 1082, - Self::ContractError(DataContractError::EncodingDataStructureNotSupported(_)) => 1083, - Self::ContractError(DataContractError::InvalidContractStructure(_)) => 1084, - Self::ContractError(DataContractError::DocumentTypeNotFound(_)) => 1085, - Self::ContractError(DataContractError::DocumentTypeFieldNotFound(_)) => 1086, - Self::ContractError(DataContractError::ReferenceDefinitionNotFound(_)) => 1087, - Self::ContractError(DataContractError::DocumentOwnerIdMissing(_)) => 1088, - Self::ContractError(DataContractError::DocumentIdMissing(_)) => 1089, - Self::ContractError(DataContractError::Unsupported(_)) => 1090, - Self::ContractError(DataContractError::CorruptedSerialization(_)) => 1091, - Self::ContractError(DataContractError::JsonSchema(_)) => 1092, - Self::ContractError(DataContractError::InvalidURI(_)) => 1093, - Self::ContractError(DataContractError::KeyWrongBounds(_)) => 1094, - Self::ContractError(DataContractError::KeyValueMustExist(_)) => 1095, - - // Document - Self::DataContractNotPresentError { .. } => 1018, - Self::DuplicateDocumentTransitionsWithIdsError { .. } => 1019, - Self::DuplicateDocumentTransitionsWithIndicesError { .. } => 1020, - Self::InconsistentCompoundIndexDataError { .. } => 1021, - Self::InvalidDocumentTransitionActionError { .. } => 1022, - Self::InvalidDocumentTransitionIdError { .. } => 1023, - Self::InvalidDocumentTypeError { .. } => 1024, - Self::MissingDataContractIdBasicError { .. } => 1025, - Self::MissingDocumentTransitionActionError { .. } => 1026, - Self::MissingDocumentTransitionTypeError { .. } => 1027, - Self::MissingDocumentTypeError { .. } => 1028, - Self::MissingPositionsInDocumentTypePropertiesError { .. } => 1067, - Self::MaxDocumentsTransitionsExceededError { .. } => 1065, - Self::DocumentTransitionsAreAbsentError { .. } => 1068, - Self::IdentityContractNonceOutOfBoundsError(_) => 1069, - - // Identity - Self::DuplicatedIdentityPublicKeyBasicError(_) => 1029, - Self::DuplicatedIdentityPublicKeyIdBasicError(_) => 1030, - Self::IdentityAssetLockProofLockedTransactionMismatchError(_) => 1031, - Self::IdentityAssetLockTransactionIsNotFoundError(_) => 1032, - Self::IdentityAssetLockTransactionOutPointAlreadyExistsError(_) => 1033, - Self::IdentityAssetLockTransactionOutputNotFoundError(_) => 1034, - Self::InvalidAssetLockProofCoreChainHeightError(_) => 1035, - Self::InvalidAssetLockProofTransactionHeightError(_) => 1036, - Self::InvalidAssetLockTransactionOutputReturnSizeError(_) => 1037, - Self::InvalidIdentityAssetLockTransactionError(_) => 1038, - Self::InvalidIdentityAssetLockTransactionOutputError(_) => 1039, - Self::InvalidIdentityPublicKeyDataError(_) => 1040, - Self::InvalidInstantAssetLockProofError(_) => 1041, - Self::InvalidInstantAssetLockProofSignatureError(_) => 1042, - Self::InvalidIdentityAssetLockProofChainLockValidationError(_) => 1043, - Self::DataContractBoundsNotPresentError(_) => 1066, - Self::DisablingKeyIdAlsoBeingAddedInSameTransitionError(_) => 1096, - - Self::MissingMasterPublicKeyError(_) => 1046, - Self::InvalidIdentityPublicKeySecurityLevelError(_) => 1047, - Self::InvalidIdentityKeySignatureError { .. } => 1056, - Self::InvalidIdentityCreditWithdrawalTransitionOutputScriptError(_) => 1057, - Self::InvalidIdentityCreditWithdrawalTransitionCoreFeeError(_) => 1058, - Self::NotImplementedIdentityCreditWithdrawalTransitionPoolingError(_) => 1059, - Self::InvalidIdentityCreditTransferAmountError(_) => 1061, - Self::InvalidIdentityCreditWithdrawalTransitionAmountError(_) => 1062, - Self::InvalidIdentityUpdateTransitionEmptyError(_) => 1063, - Self::InvalidIdentityUpdateTransitionDisableKeysError(_) => 1064, - Self::IdentityCreditTransferToSelfError(_) => 1070, - - // State Transition - Self::InvalidStateTransitionTypeError { .. } => 1043, - Self::MissingStateTransitionTypeError { .. } => 1044, - Self::StateTransitionMaxSizeExceededError { .. } => 1045, + // Versioning Errors: 10000-10099 + Self::UnsupportedVersionError(_) => 10000, + Self::ProtocolVersionParsingError { .. } => 10001, + Self::SerializedObjectParsingError { .. } => 10002, + Self::UnsupportedProtocolVersionError(_) => 10003, + Self::IncompatibleProtocolVersionError(_) => 10004, + Self::VersionError(_) => 10005, + + // Structure Errors: 10100-10199 + Self::JsonSchemaCompilationError(..) => 10100, + Self::JsonSchemaError(_) => 10101, + Self::InvalidIdentifierError { .. } => 10102, + Self::ValueError(_) => 10103, + + // DataContract Errors: 10200-10399 + Self::DataContractMaxDepthExceedError { .. } => 10200, + Self::DuplicateIndexError { .. } => 10201, + Self::IncompatibleRe2PatternError { .. } => 10202, + Self::InvalidCompoundIndexError { .. } => 10203, + Self::InvalidDataContractIdError { .. } => 10204, + Self::InvalidIndexedPropertyConstraintError { .. } => 10205, + Self::InvalidIndexPropertyTypeError { .. } => 10206, + Self::InvalidJsonSchemaRefError { .. } => 10207, + Self::SystemPropertyIndexAlreadyPresentError { .. } => 10208, + Self::UndefinedIndexPropertyError { .. } => 10209, + Self::UniqueIndicesLimitReachedError { .. } => 10210, + Self::DuplicateIndexNameError { .. } => 10211, + Self::InvalidDataContractVersionError { .. } => 10212, + Self::IncompatibleDataContractSchemaError { .. } => 10213, + Self::DataContractEmptySchemaError { .. } => 10214, + Self::DataContractImmutablePropertiesUpdateError { .. } => 10215, + Self::DataContractUniqueIndicesChangedError { .. } => 10216, + Self::DataContractInvalidIndexDefinitionUpdateError { .. } => 10217, + Self::DataContractHaveNewUniqueIndexError { .. } => 10218, + Self::InvalidDocumentTypeRequiredSecurityLevelError { .. } => 10219, + Self::UnknownSecurityLevelError { .. } => 10220, + Self::UnknownStorageKeyRequirementsError { .. } => 10221, + Self::ContractError(DataContractError::DecodingContractError { .. }) => 10222, + Self::ContractError(DataContractError::DecodingDocumentError { .. }) => 10223, + Self::ContractError(DataContractError::InvalidDocumentTypeError { .. }) => 10224, + Self::ContractError(DataContractError::MissingRequiredKey(_)) => 10225, + Self::ContractError(DataContractError::FieldRequirementUnmet(_)) => 10226, + Self::ContractError(DataContractError::KeyWrongType(_)) => 10227, + Self::ContractError(DataContractError::ValueWrongType(_)) => 10228, + Self::ContractError(DataContractError::ValueDecodingError(_)) => 10229, + Self::ContractError(DataContractError::EncodingDataStructureNotSupported(_)) => 10230, + Self::ContractError(DataContractError::InvalidContractStructure(_)) => 10231, + Self::ContractError(DataContractError::DocumentTypeNotFound(_)) => 10232, + Self::ContractError(DataContractError::DocumentTypeFieldNotFound(_)) => 10233, + Self::ContractError(DataContractError::ReferenceDefinitionNotFound(_)) => 10234, + Self::ContractError(DataContractError::DocumentOwnerIdMissing(_)) => 10235, + Self::ContractError(DataContractError::DocumentIdMissing(_)) => 10236, + Self::ContractError(DataContractError::Unsupported(_)) => 10237, + Self::ContractError(DataContractError::CorruptedSerialization(_)) => 10238, + Self::ContractError(DataContractError::JsonSchema(_)) => 10239, + Self::ContractError(DataContractError::InvalidURI(_)) => 10240, + Self::ContractError(DataContractError::KeyWrongBounds(_)) => 10241, + Self::ContractError(DataContractError::KeyValueMustExist(_)) => 10242, + + // Document Errors: 10400-10499 + Self::DataContractNotPresentError { .. } => 10400, + Self::DuplicateDocumentTransitionsWithIdsError { .. } => 10401, + Self::DuplicateDocumentTransitionsWithIndicesError { .. } => 10402, + Self::InconsistentCompoundIndexDataError { .. } => 10403, + Self::InvalidDocumentTransitionActionError { .. } => 10404, + Self::InvalidDocumentTransitionIdError { .. } => 10405, + Self::InvalidDocumentTypeError { .. } => 10406, + Self::MissingDataContractIdBasicError { .. } => 10407, + Self::MissingDocumentTransitionActionError { .. } => 10408, + Self::MissingDocumentTransitionTypeError { .. } => 10409, + Self::MissingDocumentTypeError { .. } => 10410, + Self::MissingPositionsInDocumentTypePropertiesError { .. } => 10411, + Self::MaxDocumentsTransitionsExceededError { .. } => 10412, + Self::DocumentTransitionsAreAbsentError { .. } => 10413, + Self::IdentityContractNonceOutOfBoundsError(_) => 10414, + + // Identity Errors: 10500-10599 + Self::DuplicatedIdentityPublicKeyBasicError(_) => 10500, + Self::DuplicatedIdentityPublicKeyIdBasicError(_) => 10501, + Self::IdentityAssetLockProofLockedTransactionMismatchError(_) => 10502, + Self::IdentityAssetLockTransactionIsNotFoundError(_) => 10503, + Self::IdentityAssetLockTransactionOutPointAlreadyExistsError(_) => 10504, + Self::IdentityAssetLockTransactionOutputNotFoundError(_) => 10505, + Self::InvalidAssetLockProofCoreChainHeightError(_) => 10506, + Self::InvalidAssetLockProofTransactionHeightError(_) => 10507, + Self::InvalidAssetLockTransactionOutputReturnSizeError(_) => 10508, + Self::InvalidIdentityAssetLockTransactionError(_) => 10509, + Self::InvalidIdentityAssetLockTransactionOutputError(_) => 10510, + Self::InvalidIdentityPublicKeyDataError(_) => 10511, + Self::InvalidInstantAssetLockProofError(_) => 10512, + Self::InvalidInstantAssetLockProofSignatureError(_) => 10513, + Self::InvalidIdentityAssetLockProofChainLockValidationError(_) => 10514, + Self::DataContractBoundsNotPresentError(_) => 10515, + Self::DisablingKeyIdAlsoBeingAddedInSameTransitionError(_) => 10516, + Self::MissingMasterPublicKeyError(_) => 10517, + Self::TooManyMasterPublicKeyError(_) => 10518, + Self::InvalidIdentityPublicKeySecurityLevelError(_) => 10519, + Self::InvalidIdentityKeySignatureError { .. } => 10520, + Self::InvalidIdentityCreditWithdrawalTransitionOutputScriptError(_) => 10521, + Self::InvalidIdentityCreditWithdrawalTransitionCoreFeeError(_) => 10522, + Self::NotImplementedIdentityCreditWithdrawalTransitionPoolingError(_) => 10523, + Self::InvalidIdentityCreditTransferAmountError(_) => 10524, + Self::InvalidIdentityCreditWithdrawalTransitionAmountError(_) => 10525, + Self::InvalidIdentityUpdateTransitionEmptyError(_) => 10526, + Self::InvalidIdentityUpdateTransitionDisableKeysError(_) => 10527, + Self::IdentityCreditTransferToSelfError(_) => 10528, + Self::MasterPublicKeyUpdateError(_) => 10529, + + // State Transition Errors: 10600-10699 + Self::InvalidStateTransitionTypeError { .. } => 10600, + Self::MissingStateTransitionTypeError { .. } => 10601, + Self::StateTransitionMaxSizeExceededError { .. } => 10602, } } } @@ -149,17 +148,18 @@ impl ErrorWithCode for BasicError { impl ErrorWithCode for SignatureError { fn code(&self) -> u32 { match self { - Self::IdentityNotFoundError { .. } => 2000, - Self::InvalidIdentityPublicKeyTypeError { .. } => 2001, - Self::InvalidStateTransitionSignatureError { .. } => 2002, - Self::MissingPublicKeyError { .. } => 2003, - Self::InvalidSignaturePublicKeySecurityLevelError { .. } => 2004, - Self::WrongPublicKeyPurposeError { .. } => 2005, - Self::PublicKeyIsDisabledError { .. } => 2006, - Self::PublicKeySecurityLevelNotMetError { .. } => 2007, - Self::SignatureShouldNotBePresentError(_) => 2008, - Self::BasicECDSAError(_) => 2009, - Self::BasicBLSError(_) => 2010, + Self::IdentityNotFoundError { .. } => 20000, + Self::InvalidIdentityPublicKeyTypeError { .. } => 20001, + Self::InvalidStateTransitionSignatureError { .. } => 20002, + Self::MissingPublicKeyError { .. } => 20003, + Self::InvalidSignaturePublicKeySecurityLevelError { .. } => 20004, + Self::WrongPublicKeyPurposeError { .. } => 20005, + Self::PublicKeyIsDisabledError { .. } => 20006, + Self::PublicKeySecurityLevelNotMetError { .. } => 20007, + Self::SignatureShouldNotBePresentError(_) => 20008, + Self::BasicECDSAError(_) => 20009, + Self::BasicBLSError(_) => 20010, + Self::InvalidSignaturePublicKeyPurposeError(_) => 20011, } } } @@ -167,7 +167,7 @@ impl ErrorWithCode for SignatureError { impl ErrorWithCode for FeeError { fn code(&self) -> u32 { match self { - Self::BalanceIsNotEnoughError { .. } => 3000, + Self::BalanceIsNotEnoughError { .. } => 30000, } } } @@ -175,38 +175,40 @@ impl ErrorWithCode for FeeError { impl ErrorWithCode for StateError { fn code(&self) -> u32 { match self { - // Data contract - Self::DataContractAlreadyPresentError { .. } => 4000, - Self::DataContractIsReadonlyError { .. } => 4026, + // Data contract Errors: 40000-40099 + Self::DataContractAlreadyPresentError { .. } => 40000, + Self::DataContractIsReadonlyError { .. } => 40001, + Self::DataContractConfigUpdateError { .. } => 40002, + + // Document Errors: 40100-40199 + Self::DocumentAlreadyPresentError { .. } => 40100, + Self::DocumentNotFoundError { .. } => 40101, + Self::DocumentOwnerIdMismatchError { .. } => 40102, + Self::DocumentTimestampsMismatchError { .. } => 40103, + Self::DocumentTimestampWindowViolationError { .. } => 40104, + Self::DuplicateUniqueIndexError { .. } => 40105, + Self::InvalidDocumentRevisionError { .. } => 40106, + Self::DocumentTimestampsAreEqualError(_) => 40107, + + // Identity Errors: 40200-40299 + Self::IdentityAlreadyExistsError(_) => 40200, + Self::IdentityPublicKeyIsReadOnlyError { .. } => 40201, + Self::InvalidIdentityPublicKeyIdError { .. } => 40202, + Self::InvalidIdentityRevisionError { .. } => 40203, + Self::InvalidIdentityNonceError(_) => 40204, + Self::MaxIdentityPublicKeyLimitReachedError { .. } => 40205, + Self::DuplicatedIdentityPublicKeyStateError { .. } => 40206, + Self::DuplicatedIdentityPublicKeyIdStateError { .. } => 40207, + Self::IdentityPublicKeyIsDisabledError { .. } => 40208, + Self::MissingIdentityPublicKeyIdsError { .. } => 40209, + Self::IdentityInsufficientBalanceError(_) => 40210, + Self::IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError(_) => 40211, + Self::InvalidAssetLockProofValueError(_) => 40212, + Self::DocumentTypeUpdateError(_) => 40213, + + // Data trigger errors: 40500-40799 #[cfg(feature = "state-transition-validation")] Self::DataTriggerError(ref e) => e.code(), - Self::DataContractConfigUpdateError { .. } => 4027, - - // Document - Self::DocumentAlreadyPresentError { .. } => 4004, - Self::DocumentNotFoundError { .. } => 4005, - Self::DocumentOwnerIdMismatchError { .. } => 4006, - Self::DocumentTimestampsMismatchError { .. } => 4007, - Self::DocumentTimestampWindowViolationError { .. } => 4008, - Self::DuplicateUniqueIndexError { .. } => 4009, - Self::InvalidDocumentRevisionError { .. } => 4010, - Self::DocumentTimestampsAreEqualError(_) => 4031, - - // Identity - Self::IdentityAlreadyExistsError(_) => 4011, - Self::IdentityPublicKeyIsReadOnlyError { .. } => 4017, - Self::InvalidIdentityPublicKeyIdError { .. } => 4018, - Self::InvalidIdentityRevisionError { .. } => 4019, - Self::InvalidIdentityNonceError(_) => 4020, - Self::MaxIdentityPublicKeyLimitReachedError { .. } => 4021, - Self::DuplicatedIdentityPublicKeyStateError { .. } => 4022, - Self::DuplicatedIdentityPublicKeyIdStateError { .. } => 4023, - Self::IdentityPublicKeyIsDisabledError { .. } => 4024, - Self::MissingIdentityPublicKeyIdsError { .. } => 4025, - Self::IdentityInsufficientBalanceError(_) => 4026, - Self::IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError(_) => 4028, - Self::InvalidAssetLockProofValueError(_) => 4029, - Self::DocumentTypeUpdateError(_) => 4030, } } } @@ -215,9 +217,9 @@ impl ErrorWithCode for StateError { impl ErrorWithCode for DataTriggerError { fn code(&self) -> u32 { match self { - Self::DataTriggerConditionError { .. } => 4001, - Self::DataTriggerExecutionError { .. } => 4002, - Self::DataTriggerInvalidResultError { .. } => 4003, + Self::DataTriggerConditionError { .. } => 40500, + Self::DataTriggerExecutionError { .. } => 40501, + Self::DataTriggerInvalidResultError { .. } => 40502, } } } diff --git a/packages/rs-dpp/src/errors/consensus/signature/invalid_signature_public_key_purpose_error.rs b/packages/rs-dpp/src/errors/consensus/signature/invalid_signature_public_key_purpose_error.rs new file mode 100644 index 0000000000..55a0596439 --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/signature/invalid_signature_public_key_purpose_error.rs @@ -0,0 +1,47 @@ +use thiserror::Error; + +use crate::consensus::signature::signature_error::SignatureError; +use crate::consensus::ConsensusError; +use crate::identity::Purpose; + +use crate::errors::ProtocolError; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; + +use bincode::{Decode, Encode}; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error("Invalid public key purpose {public_key_purpose}. The state transition requires {allowed_key_purpose}")] +#[platform_serialize(unversioned)] +pub struct InvalidSignaturePublicKeyPurposeError { + /* + + DO NOT CHANGE ORDER OF FIELDS WITHOUT INTRODUCING OF NEW VERSION + + */ + public_key_purpose: Purpose, + allowed_key_purpose: Purpose, +} + +impl InvalidSignaturePublicKeyPurposeError { + pub fn new(public_key_purpose: Purpose, allowed_key_purpose: Purpose) -> Self { + Self { + public_key_purpose, + allowed_key_purpose, + } + } + + pub fn public_key_purpose(&self) -> Purpose { + self.public_key_purpose + } + pub fn allowed_key_purpose(&self) -> Purpose { + self.allowed_key_purpose + } +} + +impl From for ConsensusError { + fn from(err: InvalidSignaturePublicKeyPurposeError) -> Self { + Self::SignatureError(SignatureError::InvalidSignaturePublicKeyPurposeError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/signature/mod.rs b/packages/rs-dpp/src/errors/consensus/signature/mod.rs index 37be8d8a87..46c0b6282a 100644 --- a/packages/rs-dpp/src/errors/consensus/signature/mod.rs +++ b/packages/rs-dpp/src/errors/consensus/signature/mod.rs @@ -2,6 +2,7 @@ mod basic_bls_error; mod basic_ecdsa_error; mod identity_not_found_error; mod invalid_identity_public_key_type_error; +mod invalid_signature_public_key_purpose_error; mod invalid_signature_public_key_security_level_error; mod invalid_state_transition_signature_error; mod missing_public_key_error; @@ -15,6 +16,7 @@ pub use crate::consensus::signature::basic_bls_error::BasicBLSError; pub use crate::consensus::signature::basic_ecdsa_error::BasicECDSAError; pub use crate::consensus::signature::identity_not_found_error::IdentityNotFoundError; pub use crate::consensus::signature::invalid_identity_public_key_type_error::InvalidIdentityPublicKeyTypeError; +pub use crate::consensus::signature::invalid_signature_public_key_purpose_error::InvalidSignaturePublicKeyPurposeError; pub use crate::consensus::signature::invalid_signature_public_key_security_level_error::InvalidSignaturePublicKeySecurityLevelError; pub use crate::consensus::signature::invalid_state_transition_signature_error::InvalidStateTransitionSignatureError; pub use crate::consensus::signature::missing_public_key_error::MissingPublicKeyError; diff --git a/packages/rs-dpp/src/errors/consensus/signature/signature_error.rs b/packages/rs-dpp/src/errors/consensus/signature/signature_error.rs index af4047782d..74b2c6a724 100644 --- a/packages/rs-dpp/src/errors/consensus/signature/signature_error.rs +++ b/packages/rs-dpp/src/errors/consensus/signature/signature_error.rs @@ -8,6 +8,7 @@ use crate::consensus::ConsensusError; use bincode::{Decode, Encode}; use thiserror::Error; +use crate::consensus::signature::invalid_signature_public_key_purpose_error::InvalidSignaturePublicKeyPurposeError; use crate::errors::ProtocolError; use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; @@ -30,6 +31,9 @@ pub enum SignatureError { #[error(transparent)] MissingPublicKeyError(MissingPublicKeyError), + #[error(transparent)] + InvalidSignaturePublicKeyPurposeError(InvalidSignaturePublicKeyPurposeError), + #[error(transparent)] InvalidSignaturePublicKeySecurityLevelError(InvalidSignaturePublicKeySecurityLevelError), diff --git a/packages/rs-dpp/src/errors/consensus/state/identity/master_public_key_update_error.rs b/packages/rs-dpp/src/errors/consensus/state/identity/master_public_key_update_error.rs new file mode 100644 index 0000000000..bde78547a7 --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/state/identity/master_public_key_update_error.rs @@ -0,0 +1,66 @@ +use crate::consensus::basic::BasicError; +use crate::consensus::ConsensusError; +use crate::errors::ProtocolError; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use thiserror::Error; + +use bincode::{Decode, Encode}; + +#[derive( + Error, + Debug, + Clone, + PartialEq, + Eq, + Default, + Encode, + Decode, + PlatformSerialize, + PlatformDeserialize, +)] +#[error("Failed to update the master public key: {description}. Ensure the operation is valid and permissible under current system rules.")] +#[platform_serialize(unversioned)] +pub struct MasterPublicKeyUpdateError { + adding: usize, + removing: usize, + description: String, +} + +/* + +DO NOT CHANGE ORDER OF FIELDS WITHOUT INTRODUCING OF NEW VERSION + +*/ + +impl MasterPublicKeyUpdateError { + pub fn new(adding: usize, removing: usize) -> Self { + let description = match (adding, removing) { + (1, _) => "Attempt to add a new master key is not allowed unless one is being disabled" + .to_string(), + (0, _) => "Removing a master key without adding one is not allowed".to_string(), + (_, 1) | (_, 0) => "Attempt to add more than one master key is not allowed".to_string(), + (adding, removing) => format!( + "Attempting to add {adding} master keys while removing {removing} master keys" + ), + }; + + Self { + adding, + removing, + description, + } + } + + pub fn adding(&self) -> usize { + self.adding + } + + pub fn removing(&self) -> usize { + self.removing + } +} +impl From for ConsensusError { + fn from(err: MasterPublicKeyUpdateError) -> Self { + Self::BasicError(BasicError::MasterPublicKeyUpdateError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/state/identity/mod.rs b/packages/rs-dpp/src/errors/consensus/state/identity/mod.rs index 178b283855..71209abf21 100644 --- a/packages/rs-dpp/src/errors/consensus/state/identity/mod.rs +++ b/packages/rs-dpp/src/errors/consensus/state/identity/mod.rs @@ -12,5 +12,6 @@ pub mod invalid_asset_lock_proof_value; pub mod invalid_identity_contract_nonce_error; pub mod invalid_identity_public_key_id_error; pub mod invalid_identity_revision_error; +pub mod master_public_key_update_error; pub mod max_identity_public_key_limit_reached_error; pub mod missing_identity_public_key_ids_error; diff --git a/packages/rs-dpp/src/identity/identity_public_key/purpose.rs b/packages/rs-dpp/src/identity/identity_public_key/purpose.rs index be9a491177..3d47322d2e 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/purpose.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/purpose.rs @@ -1,4 +1,4 @@ -use crate::identity::Purpose::{AUTHENTICATION, DECRYPTION, ENCRYPTION, SYSTEM, VOTING, WITHDRAW}; +use crate::identity::Purpose::{AUTHENTICATION, DECRYPTION, ENCRYPTION, SYSTEM, TRANSFER, VOTING}; use anyhow::bail; use bincode::{Decode, Encode}; #[cfg(feature = "cbor")] @@ -31,14 +31,33 @@ pub enum Purpose { ENCRYPTION = 1, /// this key cannot be used for signing documents DECRYPTION = 2, - /// this key cannot be used for signing documents - WITHDRAW = 3, + /// this key is used to sign credit transfer and withdrawal state transitions + TRANSFER = 3, /// this key cannot be used for signing documents SYSTEM = 4, /// this key cannot be used for signing documents VOTING = 5, } +impl From for [u8; 1] { + fn from(purpose: Purpose) -> Self { + [purpose as u8] + } +} + +impl From for &'static [u8; 1] { + fn from(purpose: Purpose) -> Self { + match purpose { + AUTHENTICATION => &[0], + ENCRYPTION => &[1], + DECRYPTION => &[2], + TRANSFER => &[3], + SYSTEM => &[4], + VOTING => &[5], + } + } +} + impl TryFrom for Purpose { type Error = anyhow::Error; fn try_from(value: u8) -> Result { @@ -46,7 +65,7 @@ impl TryFrom for Purpose { 0 => Ok(AUTHENTICATION), 1 => Ok(ENCRYPTION), 2 => Ok(DECRYPTION), - 3 => Ok(WITHDRAW), + 3 => Ok(TRANSFER), 4 => Ok(SYSTEM), 5 => Ok(VOTING), value => bail!("unrecognized purpose: {}", value), @@ -69,11 +88,11 @@ impl std::fmt::Display for Purpose { impl Purpose { /// The full range of purposes pub fn full_range() -> [Purpose; 4] { - [AUTHENTICATION, ENCRYPTION, DECRYPTION, WITHDRAW] + [AUTHENTICATION, ENCRYPTION, DECRYPTION, TRANSFER] } /// Just the authentication and withdraw purposes - pub fn authentication_withdraw() -> [Purpose; 2] { - [AUTHENTICATION, WITHDRAW] + pub fn authentication_and_transfer() -> [Purpose; 2] { + [AUTHENTICATION, TRANSFER] } /// Just the encryption and decryption purposes pub fn encryption_decryption() -> [Purpose; 2] { @@ -81,6 +100,6 @@ impl Purpose { } /// The last purpose pub fn last() -> Purpose { - Self::WITHDRAW + Self::TRANSFER } } diff --git a/packages/rs-dpp/src/identity/identity_public_key/random.rs b/packages/rs-dpp/src/identity/identity_public_key/random.rs index 80c28b9829..ca8543c184 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/random.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/random.rs @@ -1,6 +1,6 @@ use crate::identity::identity_public_key::v0::IdentityPublicKeyV0; -use crate::identity::{IdentityPublicKey, KeyCount, KeyID}; +use crate::identity::{IdentityPublicKey, KeyCount, KeyID, KeyType, Purpose, SecurityLevel}; use crate::version::PlatformVersion; use crate::ProtocolError; @@ -243,6 +243,58 @@ impl IdentityPublicKey { } } + /// Generates a random key based on the platform version. + /// + /// # Parameters + /// + /// * `id`: The `KeyID` for the generated key. + /// * `rng`: A mutable reference to a random number generator of type `StdRng`. + /// * `used_key_matrix`: An optional tuple that contains the count of keys that have already been used + /// and a mutable reference to a matrix (or vector) that tracks which keys have been used. + /// * `platform_version`: The platform version which determines the structure of the identity key. + /// + /// # Returns + /// + /// * `Result`: If successful, returns an instance of `Self`. + /// In case of an error, it returns a `ProtocolError`. + /// + /// # Errors + /// + /// * `ProtocolError::PublicKeyGenerationError`: This error is returned if too many keys have already been created. + /// * `ProtocolError::UnknownVersionMismatch`: This error is returned if the provided platform version is not recognized. + /// + pub fn random_key_with_known_attributes( + id: KeyID, + rng: &mut StdRng, + purpose: Purpose, + security_level: SecurityLevel, + key_type: KeyType, + platform_version: &PlatformVersion, + ) -> Result<(Self, Vec), ProtocolError> { + match platform_version + .dpp + .identity_versions + .identity_key_structure_version + { + 0 => { + let (key, private_key) = IdentityPublicKeyV0::random_key_with_known_attributes( + id, + rng, + purpose, + security_level, + key_type, + platform_version, + )?; + Ok((key.into(), private_key)) + } + version => Err(ProtocolError::UnknownVersionMismatch { + method: "IdentityPublicKey::random_key_with_known_attributes".to_string(), + known_versions: vec![0], + received: version, + }), + } + } + /// Generates a random ECDSA master authentication public key along with its corresponding private key. /// /// This method constructs a random ECDSA (using the secp256k1 curve) master authentication public key @@ -287,6 +339,33 @@ impl IdentityPublicKey { } } + /// Generates a random ECDSA master-level authentication public key along with its corresponding private key. + /// + /// This method constructs a random ECDSA (using the secp256k1 curve) high-level authentication public key + /// and returns both the public key and its corresponding private key. + /// + /// # Parameters + /// + /// * `id`: The `KeyID` for the generated key. + /// * `seed`: A seed that will create a random number generator `StdRng`. + /// + /// # Returns + /// + /// * `(Self, Vec)`: A tuple where the first element is an instance of the `IdentityPublicKey` struct, + /// and the second element is the corresponding private key. + /// + pub fn random_ecdsa_master_authentication_key( + id: KeyID, + seed: Option, + platform_version: &PlatformVersion, + ) -> Result<(Self, Vec), ProtocolError> { + let mut rng = match seed { + None => StdRng::from_entropy(), + Some(seed_value) => StdRng::seed_from_u64(seed_value), + }; + Self::random_ecdsa_master_authentication_key_with_rng(id, &mut rng, platform_version) + } + /// Generates a random ECDSA critical-level authentication public key along with its corresponding private key. /// /// This method constructs a random ECDSA (using the secp256k1 curve) high-level authentication public key @@ -507,6 +586,9 @@ impl IdentityPublicKey { used_key_matrix[0] = true; used_key_matrix[1] = true; used_key_matrix[2] = true; + used_key_matrix[4] = true; //also a master key + used_key_matrix[8] = true; //also a master key + used_key_matrix[12] = true; //also a master key main_keys.extend((3..key_count).map(|i| { Self::random_authentication_key_with_private_key_with_rng( i, diff --git a/packages/rs-dpp/src/identity/identity_public_key/v0/random.rs b/packages/rs-dpp/src/identity/identity_public_key/v0/random.rs index 29c1cea85b..2ba6c75e02 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/v0/random.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/v0/random.rs @@ -115,6 +115,31 @@ impl IdentityPublicKeyV0 { )) } + pub fn random_key_with_known_attributes( + id: KeyID, + rng: &mut StdRng, + purpose: Purpose, + security_level: SecurityLevel, + key_type: KeyType, + platform_version: &PlatformVersion, + ) -> Result<(Self, Vec), ProtocolError> { + let read_only = false; + let (public_data, private_data) = + key_type.random_public_and_private_key_data(rng, platform_version)?; + let data = BinaryData::new(public_data); + let identity_public_key = IdentityPublicKeyV0 { + id, + key_type, + purpose, + security_level, + read_only, + disabled_at: None, + data, + contract_bounds: None, + }; + Ok((identity_public_key, private_data)) + } + pub fn random_key_with_rng( id: KeyID, rng: &mut StdRng, diff --git a/packages/rs-dpp/src/serialization/serialization_traits.rs b/packages/rs-dpp/src/serialization/serialization_traits.rs index ced6d61b98..db57810d48 100644 --- a/packages/rs-dpp/src/serialization/serialization_traits.rs +++ b/packages/rs-dpp/src/serialization/serialization_traits.rs @@ -172,7 +172,7 @@ pub trait PlatformMessageSignable { public_key_type: KeyType, public_key_data: &[u8], signature: &[u8], - ) -> Result; + ) -> SimpleConsensusValidationResult; #[cfg(feature = "message-signing")] fn sign_by_private_key( diff --git a/packages/rs-dpp/src/signing.rs b/packages/rs-dpp/src/signing.rs index d63b6db0d6..96c810ff36 100644 --- a/packages/rs-dpp/src/signing.rs +++ b/packages/rs-dpp/src/signing.rs @@ -7,8 +7,7 @@ use crate::serialization::PlatformMessageSignable; #[cfg(feature = "message-signature-verification")] use crate::validation::SimpleConsensusValidationResult; #[cfg(feature = "message-signing")] -use crate::BlsModule; -use crate::ProtocolError; +use crate::{BlsModule, ProtocolError}; use dashcore::signer; impl PlatformMessageSignable for &[u8] { @@ -18,7 +17,7 @@ impl PlatformMessageSignable for &[u8] { public_key_type: KeyType, public_key_data: &[u8], signature: &[u8], - ) -> Result { + ) -> SimpleConsensusValidationResult { let signable_data = self; match public_key_type { KeyType::ECDSA_SECP256K1 => { @@ -31,11 +30,11 @@ impl PlatformMessageSignable for &[u8] { // hex::encode(signable_data), // hex::encode(public_key_data) // )); - Ok(SimpleConsensusValidationResult::new_with_error( + SimpleConsensusValidationResult::new_with_error( SignatureError::BasicECDSAError(BasicECDSAError::new(e.to_string())).into(), - )) + ) } else { - Ok(SimpleConsensusValidationResult::default()) + SimpleConsensusValidationResult::default() } } KeyType::BLS12_381 => { @@ -43,61 +42,61 @@ impl PlatformMessageSignable for &[u8] { Ok(public_key) => public_key, Err(e) => { // dbg!(format!("bls public_key could not be recovered")); - return Ok(SimpleConsensusValidationResult::new_with_error( + return SimpleConsensusValidationResult::new_with_error( SignatureError::BasicBLSError(BasicBLSError::new(e.to_string())).into(), - )); + ); } }; let signature = match bls_signatures::Signature::from_bytes(signature) { Ok(public_key) => public_key, Err(e) => { // dbg!(format!("bls signature could not be recovered")); - return Ok(SimpleConsensusValidationResult::new_with_error( + return SimpleConsensusValidationResult::new_with_error( SignatureError::BasicBLSError(BasicBLSError::new(e.to_string())).into(), - )); + ); } }; if !public_key.verify(&signature, signable_data) { - Ok(SimpleConsensusValidationResult::new_with_error( + SimpleConsensusValidationResult::new_with_error( SignatureError::BasicBLSError(BasicBLSError::new( "bls signature was incorrect".to_string(), )) .into(), - )) + ) } else { - Ok(SimpleConsensusValidationResult::default()) + SimpleConsensusValidationResult::default() } } KeyType::ECDSA_HASH160 => { if !signature.is_empty() { - Ok(SimpleConsensusValidationResult::new_with_error( + SimpleConsensusValidationResult::new_with_error( SignatureError::SignatureShouldNotBePresentError( SignatureShouldNotBePresentError::new("ecdsa_hash160 keys should not have a signature as that would reveal the public key".to_string()), ).into() - )) + ) } else { - Ok(SimpleConsensusValidationResult::default()) + SimpleConsensusValidationResult::default() } } KeyType::BIP13_SCRIPT_HASH => { if !signature.is_empty() { - Ok(SimpleConsensusValidationResult::new_with_error( + SimpleConsensusValidationResult::new_with_error( SignatureError::SignatureShouldNotBePresentError( SignatureShouldNotBePresentError::new("script hash keys should not have a signature as that would reveal the script".to_string()) - ).into())) + ).into()) } else { - Ok(SimpleConsensusValidationResult::default()) + SimpleConsensusValidationResult::default() } } KeyType::EDDSA_25519_HASH160 => { if !signature.is_empty() { - Ok(SimpleConsensusValidationResult::new_with_error( + SimpleConsensusValidationResult::new_with_error( SignatureError::SignatureShouldNotBePresentError( SignatureShouldNotBePresentError::new("eddsa hash 160 keys should not have a signature as that would reveal the script".to_string()) ).into() - )) + ) } else { - Ok(SimpleConsensusValidationResult::default()) + SimpleConsensusValidationResult::default() } } } diff --git a/packages/rs-dpp/src/state_transition/mod.rs b/packages/rs-dpp/src/state_transition/mod.rs index 1102f63335..0ca096ab50 100644 --- a/packages/rs-dpp/src/state_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/mod.rs @@ -57,7 +57,6 @@ use crate::identity::identity_public_key::accessors::v0::IdentityPublicKeyGetter #[cfg(feature = "state-transition-signing")] use crate::identity::signer::Signer; use crate::identity::state_transition::OptionallyAssetLockProved; -#[cfg(feature = "state-transition-signing")] use crate::identity::Purpose; #[cfg(any( feature = "state-transition-signing", @@ -332,11 +331,16 @@ impl StateTransition { call_getter_method_identity_signed!(self, signature_public_key_id) } - /// returns the security level requirement for the state transition + /// returns the key security level requirement for the state transition pub fn security_level_requirement(&self) -> Option> { call_getter_method_identity_signed!(self, security_level_requirement) } + /// returns the key purpose requirement for the state transition + pub fn purpose_requirement(&self) -> Option { + call_getter_method_identity_signed!(self, purpose_requirement) + } + /// returns the signature as a byte-array pub fn owner_id(&self) -> Identifier { call_method!(self, owner_id) diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/identity_signed.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/identity_signed.rs index 5aec8aea2e..c7b4464dec 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/identity_signed.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/data_contract_create_transition/v0/identity_signed.rs @@ -1,4 +1,4 @@ -use crate::identity::SecurityLevel::CRITICAL; +use crate::identity::SecurityLevel::{CRITICAL, HIGH}; use crate::identity::{KeyID, SecurityLevel}; use crate::state_transition::data_contract_create_transition::DataContractCreateTransitionV0; use crate::state_transition::StateTransitionIdentitySigned; @@ -13,6 +13,6 @@ impl StateTransitionIdentitySigned for DataContractCreateTransitionV0 { } fn security_level_requirement(&self) -> Vec { - vec![CRITICAL] + vec![CRITICAL, HIGH] } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/identity_signed.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/identity_signed.rs index 0100b34f87..4b3b448eb5 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/identity_signed.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/identity_signed.rs @@ -1,4 +1,4 @@ -use crate::identity::{KeyID, SecurityLevel}; +use crate::identity::{KeyID, Purpose, SecurityLevel}; use crate::state_transition::identity_credit_transfer_transition::IdentityCreditTransferTransition; use crate::state_transition::StateTransitionIdentitySigned; @@ -26,4 +26,10 @@ impl StateTransitionIdentitySigned for IdentityCreditTransferTransition { } } } + + fn purpose_requirement(&self) -> Purpose { + match self { + IdentityCreditTransferTransition::V0(transition) => transition.purpose_requirement(), + } + } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/v0/identity_signed.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/v0/identity_signed.rs index bee0594ba1..bcab635e22 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/v0/identity_signed.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/v0/identity_signed.rs @@ -1,5 +1,5 @@ use crate::identity::SecurityLevel::CRITICAL; -use crate::identity::{KeyID, SecurityLevel}; +use crate::identity::{KeyID, Purpose, SecurityLevel}; use crate::state_transition::identity_credit_transfer_transition::v0::IdentityCreditTransferTransitionV0; use crate::state_transition::StateTransitionIdentitySigned; @@ -15,4 +15,8 @@ impl StateTransitionIdentitySigned for IdentityCreditTransferTransitionV0 { fn security_level_requirement(&self) -> Vec { vec![CRITICAL] } + + fn purpose_requirement(&self) -> Purpose { + Purpose::TRANSFER + } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/identity_signed.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/identity_signed.rs index 1455089e1e..2dd369f3b3 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/identity_signed.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/identity_signed.rs @@ -1,4 +1,4 @@ -use crate::identity::{KeyID, SecurityLevel}; +use crate::identity::{KeyID, Purpose, SecurityLevel}; use crate::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition; use crate::state_transition::StateTransitionIdentitySigned; @@ -26,4 +26,10 @@ impl StateTransitionIdentitySigned for IdentityCreditWithdrawalTransition { } } } + + fn purpose_requirement(&self) -> Purpose { + match self { + IdentityCreditWithdrawalTransition::V0(transition) => transition.purpose_requirement(), + } + } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/identity_signed.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/identity_signed.rs index 7207aa59e2..2c8011f2fd 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/identity_signed.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/identity_signed.rs @@ -1,5 +1,5 @@ use crate::identity::SecurityLevel::CRITICAL; -use crate::identity::{KeyID, SecurityLevel}; +use crate::identity::{KeyID, Purpose, SecurityLevel}; use crate::state_transition::identity_credit_withdrawal_transition::v0::IdentityCreditWithdrawalTransitionV0; use crate::state_transition::StateTransitionIdentitySigned; @@ -16,4 +16,8 @@ impl StateTransitionIdentitySigned for IdentityCreditWithdrawalTransitionV0 { fn security_level_requirement(&self) -> Vec { vec![CRITICAL] } + + fn purpose_requirement(&self) -> Purpose { + Purpose::TRANSFER + } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/v0_methods.rs index 8824c15498..53200c82e9 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_withdrawal_transition/v0/v0_methods.rs @@ -49,7 +49,7 @@ impl IdentityCreditWithdrawalTransitionMethodsV0 for IdentityCreditWithdrawalTra let identity_public_key = identity .get_first_public_key_matching( - Purpose::WITHDRAW, + Purpose::TRANSFER, SecurityLevel::full_range().into(), KeyType::all_key_types().into(), ) diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/validate_identity_public_keys_structure/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/validate_identity_public_keys_structure/mod.rs index f186a2e424..e002fffb27 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/validate_identity_public_keys_structure/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/validate_identity_public_keys_structure/mod.rs @@ -8,6 +8,7 @@ pub mod v0; impl IdentityPublicKeyInCreation { pub fn validate_identity_public_keys_structure( identity_public_keys_with_witness: &[IdentityPublicKeyInCreation], + in_create_identity: bool, platform_version: &PlatformVersion, ) -> Result { match platform_version @@ -18,6 +19,7 @@ impl IdentityPublicKeyInCreation { { 0 => Self::validate_identity_public_keys_structure_v0( identity_public_keys_with_witness, + in_create_identity, platform_version, ), version => Err(ProtocolError::UnknownVersionMismatch { diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/validate_identity_public_keys_structure/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/validate_identity_public_keys_structure/v0/mod.rs index 6751461f62..4319b9a676 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/validate_identity_public_keys_structure/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/methods/validate_identity_public_keys_structure/v0/mod.rs @@ -1,11 +1,12 @@ use crate::consensus::basic::identity::{ - DuplicatedIdentityPublicKeyIdBasicError, InvalidIdentityPublicKeySecurityLevelError, + DuplicatedIdentityPublicKeyBasicError, DuplicatedIdentityPublicKeyIdBasicError, + InvalidIdentityPublicKeySecurityLevelError, MissingMasterPublicKeyError, + TooManyMasterPublicKeyError, }; use crate::consensus::basic::BasicError; use lazy_static::lazy_static; use std::collections::HashMap; -use crate::consensus::state::identity::duplicated_identity_public_key_state_error::DuplicatedIdentityPublicKeyStateError; use crate::consensus::state::identity::max_identity_public_key_limit_reached_error::MaxIdentityPublicKeyLimitReachedError; use crate::consensus::state::state_error::StateError; @@ -33,7 +34,7 @@ lazy_static! { ); m.insert(Purpose::ENCRYPTION, vec![SecurityLevel::MEDIUM]); m.insert(Purpose::DECRYPTION, vec![SecurityLevel::MEDIUM]); - m.insert(Purpose::WITHDRAW, vec![SecurityLevel::CRITICAL]); + m.insert(Purpose::TRANSFER, vec![SecurityLevel::CRITICAL]); m }; } @@ -43,6 +44,7 @@ impl IdentityPublicKeyInCreation { /// attack vectors. pub(super) fn validate_identity_public_keys_structure_v0( identity_public_keys_with_witness: &[IdentityPublicKeyInCreation], + in_create_identity: bool, platform_version: &PlatformVersion, ) -> Result { if identity_public_keys_with_witness.len() > MAX_PUBLIC_KEYS { @@ -75,13 +77,33 @@ impl IdentityPublicKeyInCreation { )?; if !duplicated_key_ids.is_empty() { return Ok(SimpleConsensusValidationResult::new_with_error( - StateError::DuplicatedIdentityPublicKeyStateError( - DuplicatedIdentityPublicKeyStateError::new(duplicated_key_ids), + BasicError::DuplicatedIdentityPublicKeyBasicError( + DuplicatedIdentityPublicKeyBasicError::new(duplicated_key_ids), ) .into(), )); } + if in_create_identity { + // We should check that we are only adding one master authentication key + + let master_key_count = identity_public_keys_with_witness + .iter() + .filter(|key| key.security_level() == SecurityLevel::MASTER) + .count(); + if master_key_count == 0 { + return Ok(SimpleConsensusValidationResult::new_with_error( + BasicError::MissingMasterPublicKeyError(MissingMasterPublicKeyError::new()) + .into(), + )); + } else if master_key_count > 1 { + return Ok(SimpleConsensusValidationResult::new_with_error( + BasicError::TooManyMasterPublicKeyError(TooManyMasterPublicKeyError::new()) + .into(), + )); + } + } + // We should check all the security levels let validation_errors = identity_public_keys_with_witness .iter() diff --git a/packages/rs-dpp/src/state_transition/traits/state_transition_identity_signed.rs b/packages/rs-dpp/src/state_transition/traits/state_transition_identity_signed.rs index 8e956af747..c81029a7fe 100644 --- a/packages/rs-dpp/src/state_transition/traits/state_transition_identity_signed.rs +++ b/packages/rs-dpp/src/state_transition/traits/state_transition_identity_signed.rs @@ -22,7 +22,8 @@ use crate::state_transition::StateTransitionLike; feature = "state-transition-signing", feature = "state-transition-validation" ))] -use crate::identity::{IdentityPublicKey, Purpose}; +use crate::identity::IdentityPublicKey; +use crate::identity::Purpose; use crate::{ identity::{KeyID, SecurityLevel}, prelude::*, @@ -57,9 +58,9 @@ pub trait StateTransitionIdentitySigned: StateTransitionLike { )); } - if public_key.purpose() != Purpose::AUTHENTICATION { + if public_key.purpose() != self.purpose_requirement() { return Err(ProtocolError::WrongPublicKeyPurposeError( - WrongPublicKeyPurposeError::new(public_key.purpose(), Purpose::AUTHENTICATION), + WrongPublicKeyPurposeError::new(public_key.purpose(), self.purpose_requirement()), )); } Ok(()) @@ -85,6 +86,13 @@ pub trait StateTransitionIdentitySigned: StateTransitionLike { /// Returns minimal key security level that can be used to sign this ST. /// Override this method if the ST requires a different security level. fn security_level_requirement(&self) -> Vec; + + /// The purpose requirement for the signing key + /// The default is authentication + /// However for Withdrawals and Fund Transfers the requirement is TRANSFER + fn purpose_requirement(&self) -> Purpose { + Purpose::AUTHENTICATION + } } pub fn get_compressed_public_ec_key(private_key: &[u8]) -> Result<[u8; 33], ProtocolError> { diff --git a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs index 6a7d59032d..5914b0f48c 100644 --- a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs @@ -1347,6 +1347,12 @@ mod tests { let mut rng = StdRng::seed_from_u64(567); + let (master_key, master_private_key) = + IdentityPublicKey::random_ecdsa_master_authentication_key(0, Some(3), platform_version) + .expect("expected to get key pair"); + + signer.add_key(master_key.clone(), master_private_key.clone()); + let (key, private_key) = IdentityPublicKey::random_ecdsa_critical_level_authentication_key( 1, Some(19), @@ -1370,7 +1376,7 @@ mod tests { let identity: Identity = IdentityV0 { id: identifier, - public_keys: BTreeMap::from([(1, key.clone())]), + public_keys: BTreeMap::from([(0, master_key.clone()), (1, key.clone())]), balance: 1000000000, revision: 0, } @@ -1526,6 +1532,12 @@ mod tests { let mut rng = StdRng::seed_from_u64(567); + let (master_key, master_private_key) = + IdentityPublicKey::random_ecdsa_master_authentication_key(0, Some(3), platform_version) + .expect("expected to get key pair"); + + signer.add_key(master_key.clone(), master_private_key.clone()); + let (key, private_key) = IdentityPublicKey::random_ecdsa_critical_level_authentication_key( 1, Some(19), @@ -1549,7 +1561,7 @@ mod tests { let identity: Identity = IdentityV0 { id: identifier, - public_keys: BTreeMap::from([(1, key.clone())]), + public_keys: BTreeMap::from([(0, master_key.clone()), (1, key.clone())]), balance: 1000000000, revision: 0, } @@ -1656,6 +1668,12 @@ mod tests { let mut rng = StdRng::seed_from_u64(567); + let (master_key, master_private_key) = + IdentityPublicKey::random_ecdsa_master_authentication_key(0, Some(3), platform_version) + .expect("expected to get key pair"); + + signer.add_key(master_key.clone(), master_private_key.clone()); + let (key, private_key) = IdentityPublicKey::random_ecdsa_critical_level_authentication_key( 1, Some(19), @@ -1679,7 +1697,7 @@ mod tests { let identity: Identity = IdentityV0 { id: identifier, - public_keys: BTreeMap::from([(1, key.clone())]), + public_keys: BTreeMap::from([(0, master_key.clone()), (1, key.clone())]), balance: 1000000000, revision: 0, } @@ -1910,6 +1928,12 @@ mod tests { let mut rng = StdRng::seed_from_u64(567); + let (master_key, master_private_key) = + IdentityPublicKey::random_ecdsa_master_authentication_key(0, Some(3), platform_version) + .expect("expected to get key pair"); + + signer.add_key(master_key.clone(), master_private_key.clone()); + let (key, private_key) = IdentityPublicKey::random_ecdsa_critical_level_authentication_key( 1, Some(19), @@ -1933,7 +1957,7 @@ mod tests { let identity: Identity = IdentityV0 { id: identifier, - public_keys: BTreeMap::from([(1, key.clone())]), + public_keys: BTreeMap::from([(0, master_key.clone()), (1, key.clone())]), balance: 1000000000, revision: 0, } @@ -2025,6 +2049,12 @@ mod tests { let mut signer = SimpleSigner::default(); + let (master_key, master_private_key) = + IdentityPublicKey::random_ecdsa_master_authentication_key(0, Some(4), platform_version) + .expect("expected to get key pair"); + + signer.add_key(master_key.clone(), master_private_key.clone()); + let (key, private_key) = IdentityPublicKey::random_ecdsa_critical_level_authentication_key( 1, Some(50), @@ -2040,7 +2070,7 @@ mod tests { let identity: Identity = IdentityV0 { id: identifier, - public_keys: BTreeMap::from([(1, key.clone())]), + public_keys: BTreeMap::from([(0, master_key.clone()), (1, key.clone())]), balance: 1000000000, revision: 0, } diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/disable_identity_keys/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/disable_identity_keys/v0/mod.rs index 91d385e98d..88b2ccbdf9 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/disable_identity_keys/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/disable_identity_keys/v0/mod.rs @@ -4,7 +4,7 @@ use crate::rpc::core::CoreRPCLike; use dashcore_rpc::dashcore_rpc_json::MasternodeListItem; use dpp::block::block_info::BlockInfo; use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; -use dpp::identity::Purpose::WITHDRAW; +use dpp::identity::Purpose::TRANSFER; use dpp::version::PlatformVersion; use drive::drive::batch::DriveOperation; use drive::drive::batch::DriveOperation::IdentityOperation; @@ -62,7 +62,7 @@ where )? .into_iter() .filter_map(|(key_id, key)| { - if key.is_disabled() || key.purpose() == WITHDRAW { + if key.is_disabled() || key.purpose() == TRANSFER { None // Don't disable withdrawal keys } else { Some(key_id) diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/get_operator_identity_keys/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/get_operator_identity_keys/v0/mod.rs index 6df7c15c6e..ff3a889950 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/get_operator_identity_keys/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/get_operator_identity_keys/v0/mod.rs @@ -30,7 +30,7 @@ where IdentityPublicKeyV0 { id: 1, key_type: KeyType::ECDSA_HASH160, - purpose: Purpose::WITHDRAW, + purpose: Purpose::TRANSFER, security_level: SecurityLevel::CRITICAL, read_only: true, data: BinaryData::new(operator_payout_address.to_vec()), diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/get_owner_identity_key/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/get_owner_identity_key/v0/mod.rs index 03865a481c..eb478c5acc 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/get_owner_identity_key/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/get_owner_identity_key/v0/mod.rs @@ -16,7 +16,7 @@ where Ok(IdentityPublicKeyV0 { id: key_id, key_type: KeyType::ECDSA_HASH160, - purpose: Purpose::WITHDRAW, + purpose: Purpose::TRANSFER, security_level: SecurityLevel::CRITICAL, read_only: true, data: BinaryData::new(payout_address.to_vec()), diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_operator_identity/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_operator_identity/v0/mod.rs index 68d9515b03..82e98c3477 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_operator_identity/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_operator_identity/v0/mod.rs @@ -14,7 +14,7 @@ use dpp::identity::accessors::IdentityGettersV0; use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; use dpp::identity::identity_public_key::v0::IdentityPublicKeyV0; -use dpp::identity::Purpose::WITHDRAW; +use dpp::identity::Purpose::TRANSFER; use dpp::identity::{Identity, IdentityPublicKey, KeyID, KeyType, Purpose, SecurityLevel}; use dpp::platform_value::BinaryData; use dpp::version::PlatformVersion; @@ -59,7 +59,7 @@ where .ok_or_else(|| { Error::Execution(ExecutionError::CorruptedCachedState(format!( "expected masternode {} to be in state", - pro_tx_hash.to_string() + pro_tx_hash ))) })?; @@ -191,7 +191,7 @@ where let key = IdentityPublicKeyV0 { id: new_key_id, key_type: KeyType::ECDSA_HASH160, - purpose: WITHDRAW, + purpose: TRANSFER, security_level: SecurityLevel::CRITICAL, read_only: true, data: BinaryData::new(new_operator_payout_address.to_vec()), diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs index fa08af7a16..0e2e4b91b7 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/check_tx_verification/v0/mod.rs @@ -154,7 +154,7 @@ pub(super) fn state_transition_to_execution_event_for_check_tx_v0<'a, C: CoreRPC None }; - // + // Validating signatures let result = state_transition.validate_identity_and_signatures( platform.drive, action.as_ref(), @@ -162,7 +162,7 @@ pub(super) fn state_transition_to_execution_event_for_check_tx_v0<'a, C: CoreRPC &mut state_transition_execution_context, platform_version, )?; - // Validating signatures + if !result.is_valid() { return Ok( ConsensusValidationResult::>::new_with_errors( diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/mod.rs index c27af2cf33..bbd758939b 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/common/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/mod.rs @@ -3,5 +3,6 @@ pub mod asset_lock; pub mod validate_identity_public_key_contract_bounds; pub mod validate_identity_public_key_ids_dont_exist_in_state; pub mod validate_identity_public_key_ids_exist_in_state; +pub mod validate_not_disabling_last_master_key; pub mod validate_state_transition_identity_signed; pub mod validate_unique_identity_public_key_hashes_in_state; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_identity_public_key_ids_exist_in_state/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_identity_public_key_ids_exist_in_state/mod.rs index 933e1ec9c8..aa252d7d03 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_identity_public_key_ids_exist_in_state/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_identity_public_key_ids_exist_in_state/mod.rs @@ -1,6 +1,6 @@ use dpp::identifier::Identifier; -use dpp::identity::KeyID; -use dpp::validation::SimpleConsensusValidationResult; +use dpp::identity::{IdentityPublicKey, KeyID}; +use dpp::validation::ConsensusValidationResult; use drive::drive::Drive; use drive::grovedb::TransactionArg; use dpp::version::PlatformVersion; @@ -18,7 +18,7 @@ pub(crate) fn validate_identity_public_key_ids_exist_in_state( execution_context: &mut StateTransitionExecutionContext, transaction: TransactionArg, platform_version: &PlatformVersion, -) -> Result { +) -> Result>, Error> { match platform_version .drive_abci .validation_and_processing diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_identity_public_key_ids_exist_in_state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_identity_public_key_ids_exist_in_state/v0/mod.rs index 3751c64b84..6422faf196 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_identity_public_key_ids_exist_in_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_identity_public_key_ids_exist_in_state/v0/mod.rs @@ -2,18 +2,18 @@ use crate::error::Error; use dpp::consensus::state::identity::missing_identity_public_key_ids_error::MissingIdentityPublicKeyIdsError; -use dpp::identity::KeyID; +use dpp::identity::{IdentityPublicKey, KeyID}; use dpp::platform_value::Identifier; +use dpp::prelude::ConsensusValidationResult; -use dpp::validation::SimpleConsensusValidationResult; - -use drive::drive::identity::key::fetch::{IdentityKeysRequest, KeyIDVec, KeyRequestType}; +use drive::drive::identity::key::fetch::{ + IdentityKeysRequest, KeyIDIdentityPublicKeyPairBTreeMap, KeyRequestType, +}; use drive::drive::Drive; use drive::grovedb::TransactionArg; use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; use dpp::version::PlatformVersion; -use std::collections::BTreeSet; /// This will validate that all keys are valid against the state pub(super) fn validate_identity_public_key_ids_exist_in_state_v0( @@ -23,7 +23,7 @@ pub(super) fn validate_identity_public_key_ids_exist_in_state_v0( _execution_context: &mut StateTransitionExecutionContext, transaction: TransactionArg, platform_version: &PlatformVersion, -) -> Result { +) -> Result>, Error> { let limit = key_ids.len() as u16; let identity_key_request = IdentityKeysRequest { identity_id: identity_id.to_buffer(), @@ -31,20 +31,20 @@ pub(super) fn validate_identity_public_key_ids_exist_in_state_v0( limit: Some(limit), offset: None, }; - let keys = drive.fetch_identity_keys::( + let to_remove_keys = drive.fetch_identity_keys::( identity_key_request, transaction, platform_version, )?; - if keys.len() != key_ids.len() { - let to_remove = BTreeSet::from_iter(keys); + if to_remove_keys.len() != key_ids.len() { let mut missing_keys = key_ids.to_vec(); - missing_keys.retain(|found_key| !to_remove.contains(found_key)); + missing_keys.retain(|found_key| !to_remove_keys.contains_key(found_key)); // keys should all exist - Ok(SimpleConsensusValidationResult::new_with_error( + Ok(ConsensusValidationResult::new_with_error( MissingIdentityPublicKeyIdsError::new(missing_keys).into(), )) } else { - Ok(SimpleConsensusValidationResult::default()) + let values: Vec<_> = to_remove_keys.into_values().collect(); + Ok(ConsensusValidationResult::new_with_data(values)) } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_not_disabling_last_master_key/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_not_disabling_last_master_key/mod.rs new file mode 100644 index 0000000000..a4d29d4b8b --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_not_disabling_last_master_key/mod.rs @@ -0,0 +1,30 @@ +use dpp::identity::IdentityPublicKey; +use dpp::state_transition::public_key_in_creation::IdentityPublicKeyInCreation; +use dpp::validation::SimpleConsensusValidationResult; +use dpp::version::PlatformVersion; +use crate::error::Error; +use crate::error::execution::ExecutionError; +use crate::execution::validation::state_transition::common::validate_not_disabling_last_master_key::v0::validate_master_key_uniqueness_v0; + +pub mod v0; + +pub(crate) fn validate_master_key_uniqueness( + public_keys_being_added: &[IdentityPublicKeyInCreation], + public_keys_to_disable: &[IdentityPublicKey], + platform_version: &PlatformVersion, +) -> Result { + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .common_validation_methods + .validate_master_key_uniqueness + { + 0 => validate_master_key_uniqueness_v0(public_keys_being_added, public_keys_to_disable), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "validate_not_disabling_last_master_key".to_string(), + known_versions: vec![0], + received: version, + })), + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_not_disabling_last_master_key/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_not_disabling_last_master_key/v0/mod.rs new file mode 100644 index 0000000000..3abdc332e3 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_not_disabling_last_master_key/v0/mod.rs @@ -0,0 +1,42 @@ +use crate::error::Error; +use dpp::consensus::basic::BasicError; +use dpp::consensus::state::identity::master_public_key_update_error::MasterPublicKeyUpdateError; + +use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; +use dpp::identity::{IdentityPublicKey, SecurityLevel}; +use dpp::state_transition::public_key_in_creation::accessors::IdentityPublicKeyInCreationV0Getters; + +use dpp::state_transition::public_key_in_creation::IdentityPublicKeyInCreation; +use dpp::validation::SimpleConsensusValidationResult; + +/// This will validate that all keys are valid against the state +pub(super) fn validate_master_key_uniqueness_v0( + public_keys_being_added: &[IdentityPublicKeyInCreation], + public_keys_to_disable: &[IdentityPublicKey], +) -> Result { + let master_keys_to_disable_count = public_keys_to_disable + .iter() + .filter(|key| key.security_level() == SecurityLevel::MASTER) + .count(); + + let master_keys_being_added_count = public_keys_being_added + .iter() + .filter(|key| key.security_level() == SecurityLevel::MASTER) + .count(); + + // Check that at most one master key is being disabled and at most one is being added + if master_keys_to_disable_count > 1 + || master_keys_being_added_count > 1 + || ((master_keys_to_disable_count == 1) ^ (master_keys_being_added_count == 1)) + { + Ok(SimpleConsensusValidationResult::new_with_error( + BasicError::MasterPublicKeyUpdateError(MasterPublicKeyUpdateError::new( + master_keys_being_added_count, + master_keys_to_disable_count, + )) + .into(), + )) + } else { + Ok(SimpleConsensusValidationResult::default()) + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_state_transition_identity_signed/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_state_transition_identity_signed/v0/mod.rs index f7d929ab80..82afdd2418 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_state_transition_identity_signed/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_state_transition_identity_signed/v0/mod.rs @@ -1,8 +1,9 @@ use crate::error::Error; use dpp::consensus::signature::{ - IdentityNotFoundError, InvalidSignaturePublicKeySecurityLevelError, - InvalidStateTransitionSignatureError, PublicKeySecurityLevelNotMetError, + IdentityNotFoundError, InvalidSignaturePublicKeyPurposeError, + InvalidSignaturePublicKeySecurityLevelError, InvalidStateTransitionSignatureError, + PublicKeySecurityLevelNotMetError, }; use dpp::identity::PartialIdentity; @@ -79,24 +80,39 @@ impl<'a> ValidateStateTransitionIdentitySignatureV0<'a> for StateTransition { let security_levels = match self { StateTransition::DocumentsBatch(_) => { - let action = action.ok_or(ProtocolError::CorruptedCodeExecution( - "we expect a state transition action when validating the signature of the documents batch transition".to_string(), - ))?; - let StateTransitionAction::DocumentsBatchAction(documents_batch_action) = action - else { - return Err(Error::Execution(ExecutionError::CorruptedCodeExecution( - "we expect a documents batch state transition action when validating the signature of the documents batch transition", - ))); - }; - documents_batch_action.contract_based_security_level_requirement() + // We will have an action during consensus validation, but not on mempool check_tx + if let Some(action) = action { + let StateTransitionAction::DocumentsBatchAction(documents_batch_action) = + action + else { + return Err(Error::Execution(ExecutionError::CorruptedCodeExecution( + "we expect a documents batch state transition action when validating the signature of the documents batch transition", + ))); + }; + documents_batch_action.contract_based_security_level_requirement() + } else { + // In this case we just validate the transition + // If it is not valid during consensus validation because the key wasn't the + // right level then we will disable the key as it most likely is an attack + self.security_level_requirement() + .ok_or(ProtocolError::CorruptedCodeExecution( + "state_transition does not have security level".to_string(), + )) + } } _ => self .security_level_requirement() .ok_or(ProtocolError::CorruptedCodeExecution( - "state_transition does not have a owner Id to verify".to_string(), + "state_transition does not have security level".to_string(), )), }?; + let purpose = self + .purpose_requirement() + .ok_or(ProtocolError::CorruptedCodeExecution( + "state_transition does not have a key purpose requirement".to_string(), + ))?; + let key_request = IdentityKeysRequest::new_specific_key_query(owner_id.as_bytes(), key_id); let maybe_partial_identity = if request_identity_revision { @@ -141,6 +157,13 @@ impl<'a> ValidateStateTransitionIdentitySignatureV0<'a> for StateTransition { return Ok(validation_result); } + if purpose != public_key.purpose() { + validation_result.add_error(SignatureError::InvalidSignaturePublicKeyPurposeError( + InvalidSignaturePublicKeyPurposeError::new(public_key.purpose(), purpose), + )); + return Ok(validation_result); + } + if !security_levels.contains(&public_key.security_level()) { validation_result.add_error( SignatureError::InvalidSignaturePublicKeySecurityLevelError( diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs index acff8bcfbd..d8b1eff9d8 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs @@ -7,6 +7,7 @@ use crate::rpc::core::CoreRPCLike; use dpp::block::block_info::BlockInfo; use dpp::identity::PartialIdentity; use dpp::prelude::ConsensusValidationResult; +use dpp::ProtocolError; use crate::error::execution::ExecutionError; use dpp::serialization::Signable; @@ -19,7 +20,7 @@ use drive::state_transition_action::StateTransitionAction; use crate::execution::types::state_transition_execution_context::{StateTransitionExecutionContext}; use crate::execution::validation::state_transition::common::validate_state_transition_identity_signed::{ValidateStateTransitionIdentitySignature}; -use crate::execution::validation::state_transition::state_transitions::identity_update::identity_and_signatures::v0::IdentityUpdateStateTransitionIdentityAndSignaturesValidationV0; +use crate::execution::validation::state_transition::state_transitions::identity_update::advanced_structure::v0::IdentityUpdateStateTransitionIdentityAndSignaturesValidationV0; use crate::execution::validation::state_transition::state_transitions::identity_create::identity_and_signatures::v0::IdentityCreateStateTransitionIdentityAndSignaturesValidationV0; use crate::execution::validation::state_transition::state_transitions::identity_top_up::identity_retrieval::v0::IdentityTopUpStateTransitionIdentityRetrievalV0; use crate::execution::validation::state_transition::ValidationMode; @@ -114,7 +115,16 @@ pub(in crate::execution) fn process_state_transition_v0<'a, C: CoreRPCLike>( // Next we have advanced structure validation, this is structure validation that does not require // state but isn't checked on check_tx. If advanced structure fails identity nonces or identity // contract nonces will be bumped - let consensus_result = state_transition.validate_advanced_structure(platform_version)?; + let identity = maybe_identity + .as_ref() + .ok_or(ProtocolError::CorruptedCodeExecution( + "the identity should always be known on advanced structure validation".to_string(), + ))?; + let consensus_result = state_transition.validate_advanced_structure( + identity, + &mut state_transition_execution_context, + platform_version, + )?; if !consensus_result.is_valid() { return consensus_result.map_result(|action| { @@ -141,11 +151,15 @@ pub(in crate::execution) fn process_state_transition_v0<'a, C: CoreRPCLike>( transaction, )?; if !state_transition_action_result.is_valid_with_data() { - return Ok( - ConsensusValidationResult::::new_with_errors( - state_transition_action_result.errors, - ), - ); + return state_transition_action_result.map_result(|action| { + ExecutionEvent::create_from_state_transition_action( + action, + maybe_identity, + platform.state.last_committed_block_epoch_ref(), + state_transition_execution_context, + platform_version, + ) + }); } state_transition_action_result.into_data()? }; @@ -157,7 +171,15 @@ pub(in crate::execution) fn process_state_transition_v0<'a, C: CoreRPCLike>( platform_version, )?; if !result.is_valid() { - return Ok(ConsensusValidationResult::::new_with_errors(result.errors)); + return result.map_result(|action| { + ExecutionEvent::create_from_state_transition_action( + action, + maybe_identity, + platform.state.last_committed_block_epoch_ref(), + state_transition_execution_context, + platform_version, + ) + }); } Some(action) @@ -273,6 +295,8 @@ pub(crate) trait StateTransitionAdvancedStructureValidationV0 { /// * `Result` - A result with either a SimpleConsensusValidationResult or an Error. fn validate_advanced_structure( &self, + identity: &PartialIdentity, + execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion, ) -> Result, Error>; @@ -325,7 +349,7 @@ pub(crate) trait StateTransitionStructureKnownInStateValidationV0 { platform: &PlatformStateRef, action: &StateTransitionAction, platform_version: &PlatformVersion, - ) -> Result; + ) -> Result, Error>; /// This means we should transform into the action before validation of the structure fn requires_advance_structure_validation_from_state(&self) -> bool { @@ -499,14 +523,49 @@ impl StateTransitionBalanceValidationV0 for StateTransition { impl StateTransitionAdvancedStructureValidationV0 for StateTransition { fn has_advanced_structure_validation(&self) -> bool { - false + matches!(self, StateTransition::IdentityUpdate(_)) } fn validate_advanced_structure( &self, - _platform_version: &PlatformVersion, + identity: &PartialIdentity, + execution_context: &mut StateTransitionExecutionContext, + platform_version: &PlatformVersion, ) -> Result, Error> { - Ok(ConsensusValidationResult::::new()) + match self { + StateTransition::IdentityUpdate(st) => { + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .identity_update_state_transition + .advanced_structure + { + Some(0) => { + let signable_bytes: Vec = self.signable_bytes()?; + st.validate_identity_update_state_transition_signatures_v0( + signable_bytes, + identity, + execution_context, + ) + } + Some(version) => { + Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "identity update transition: validate_advanced_structure" + .to_string(), + known_versions: vec![0], + received: version, + })) + } + None => Err(Error::Execution(ExecutionError::VersionNotActive { + method: "identity update transition: validate_advanced_structure" + .to_string(), + known_versions: vec![0], + })), + } + } + _ => Ok(ConsensusValidationResult::::new()), + } } } @@ -516,12 +575,12 @@ impl StateTransitionStructureKnownInStateValidationV0 for StateTransition { platform: &PlatformStateRef, action: &StateTransitionAction, platform_version: &PlatformVersion, - ) -> Result { + ) -> Result, Error> { match self { StateTransition::DocumentsBatch(st) => { st.validate_advanced_structure_from_state(platform, action, platform_version) } - _ => Ok(SimpleConsensusValidationResult::new()), + _ => Ok(ConsensusValidationResult::new()), } } @@ -558,53 +617,18 @@ impl StateTransitionSignatureValidationV0 for StateTransition { )? .map(Some)) } - StateTransition::IdentityUpdate(st) => { - match platform_version - .drive_abci - .validation_and_processing - .state_transitions - .identity_update_state_transition - .identity_signatures - { - Some(0) => { - let signable_bytes: Vec = self.signable_bytes()?; - let mut validation_result = self - .validate_state_transition_identity_signed( - drive, - action, - true, - tx, - execution_context, - platform_version, - )?; - if !validation_result.is_valid() { - Ok(validation_result.map(Some)) - } else { - let partial_identity = validation_result.data_as_borrowed()?; - let result = st - .validate_identity_update_state_transition_signatures_v0( - signable_bytes, - partial_identity, - execution_context, - )?; - validation_result.merge(result); - Ok(validation_result.map(Some)) - } - } - None => Err(Error::Execution(ExecutionError::VersionNotActive { - method: "identity update transition: validate_identity_and_signatures" - .to_string(), - known_versions: vec![0], - })), - Some(version) => { - Err(Error::Execution(ExecutionError::UnknownVersionMismatch { - method: "identity update transition: validate_identity_and_signatures" - .to_string(), - known_versions: vec![0], - received: version, - })) - } - } + StateTransition::IdentityUpdate(_) => { + //Basic signature verification + Ok(self + .validate_state_transition_identity_signed( + drive, + action, + true, + tx, + execution_context, + platform_version, + )? + .map(Some)) } StateTransition::IdentityCreate(st) => { match platform_version @@ -623,7 +647,7 @@ impl StateTransitionSignatureValidationV0 for StateTransition { let result = st.validate_identity_create_state_transition_signatures_v0( signable_bytes, execution_context, - )?; + ); validation_result.merge(result); validation_result.set_data(None); diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/state/v0/mod.rs index b938cf97f2..5f81fc02ad 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/state/v0/mod.rs @@ -80,7 +80,7 @@ impl DataContractCreateStateTransitionStateValidationV0 for DataContractCreateTr match result { Err(ProtocolError::ConsensusError(consensus_error)) => { let bump_action = StateTransitionAction::BumpIdentityNonceAction( - BumpIdentityNonceAction::from_borrowed_data_contract_create_transition(self)?, + BumpIdentityNonceAction::from_borrowed_data_contract_create_transition(self), ); Ok(ConsensusValidationResult::new_with_data_and_errors( diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/v0/mod.rs index 093fed9188..0a818d94b1 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/v0/mod.rs @@ -106,7 +106,7 @@ impl DataContractUpdateStateTransitionStateValidationV0 for DataContractUpdateTr let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( BumpIdentityDataContractNonceAction::from_borrowed_data_contract_update_transition( self, - )?, + ), ); return Ok(ConsensusValidationResult::new_with_data_and_errors( @@ -132,7 +132,7 @@ impl DataContractUpdateStateTransitionStateValidationV0 for DataContractUpdateTr let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( BumpIdentityDataContractNonceAction::from_borrowed_data_contract_update_transition( self, - )?, + ), ); return Ok(ConsensusValidationResult::new_with_data_and_errors( @@ -167,7 +167,7 @@ impl DataContractUpdateStateTransitionStateValidationV0 for DataContractUpdateTr let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( BumpIdentityDataContractNonceAction::from_borrowed_data_contract_update_transition( self, - )?, + ), ); return Ok(ConsensusValidationResult::new_with_data_and_errors( @@ -195,9 +195,9 @@ impl DataContractUpdateStateTransitionStateValidationV0 for DataContractUpdateTr if !validate_update_result.is_valid() { let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( - BumpIdentityDataContractNonceAction::from_borrowed_data_contract_update_transition( - self, - )?, + BumpIdentityDataContractNonceAction::from_borrowed_data_contract_update_transition( + self, + ), ); return Ok(ConsensusValidationResult::new_with_data_and_errors( @@ -222,7 +222,7 @@ impl DataContractUpdateStateTransitionStateValidationV0 for DataContractUpdateTr let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( BumpIdentityDataContractNonceAction::from_borrowed_data_contract_update_transition( self, - )?, + ), ); return Ok(ConsensusValidationResult::new_with_data_and_errors( @@ -247,7 +247,7 @@ impl DataContractUpdateStateTransitionStateValidationV0 for DataContractUpdateTr let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( BumpIdentityDataContractNonceAction::from_borrowed_data_contract_update_transition( self, - )?, + ), ); return Ok(ConsensusValidationResult::new_with_data_and_errors( @@ -273,9 +273,9 @@ impl DataContractUpdateStateTransitionStateValidationV0 for DataContractUpdateTr if let Some(old_defs) = old_data_contract.schema_defs() { let Some(new_defs) = self.data_contract().schema_defs() else { let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( - BumpIdentityDataContractNonceAction::from_borrowed_data_contract_update_transition( - self, - )?, + BumpIdentityDataContractNonceAction::from_borrowed_data_contract_update_transition( + self, + ), ); return Ok(ConsensusValidationResult::new_with_data_and_errors( @@ -304,7 +304,7 @@ impl DataContractUpdateStateTransitionStateValidationV0 for DataContractUpdateTr let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( BumpIdentityDataContractNonceAction::from_borrowed_data_contract_update_transition( self, - )?, + ), ); let data_contract_error: DataContractError = @@ -327,9 +327,9 @@ impl DataContractUpdateStateTransitionStateValidationV0 for DataContractUpdateTr get_operation_and_property_name_json(&diffs[0]); let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( - BumpIdentityDataContractNonceAction::from_borrowed_data_contract_update_transition( - self, - )?, + BumpIdentityDataContractNonceAction::from_borrowed_data_contract_update_transition( + self, + ), ); return Ok(ConsensusValidationResult::new_with_data_and_errors( @@ -368,7 +368,7 @@ impl DataContractUpdateStateTransitionStateValidationV0 for DataContractUpdateTr let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( BumpIdentityDataContractNonceAction::from_borrowed_data_contract_update_transition( self, - )?, + ), ); let data_contract_error: DataContractError = @@ -394,9 +394,9 @@ impl DataContractUpdateStateTransitionStateValidationV0 for DataContractUpdateTr get_operation_and_property_name_json(&diffs[0]); let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( - BumpIdentityDataContractNonceAction::from_borrowed_data_contract_update_transition( - self, - )?, + BumpIdentityDataContractNonceAction::from_borrowed_data_contract_update_transition( + self, + ), ); return Ok(ConsensusValidationResult::new_with_data_and_errors( @@ -434,7 +434,7 @@ impl DataContractUpdateStateTransitionStateValidationV0 for DataContractUpdateTr match result { Err(ProtocolError::ConsensusError(consensus_error)) => { let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( - BumpIdentityDataContractNonceAction::from_borrowed_data_contract_update_transition(self)?, + BumpIdentityDataContractNonceAction::from_borrowed_data_contract_update_transition(self), ); Ok(ConsensusValidationResult::new_with_data_and_errors( diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/v0/mod.rs index 53ff2d122a..9bfc0321fe 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/v0/mod.rs @@ -3,12 +3,14 @@ use dpp::consensus::basic::document::InvalidDocumentTransitionIdError; use dpp::document::Document; use dpp::state_transition::documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; use dpp::state_transition::documents_batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; -use dpp::state_transition::documents_batch_transition::document_transition::DocumentTransition; +use dpp::state_transition::documents_batch_transition::document_transition::{ + DocumentTransition, DocumentTransitionV0Methods, +}; use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; use dpp::state_transition::StateTransitionLike; -use dpp::validation::SimpleConsensusValidationResult; +use dpp::validation::ConsensusValidationResult; use dpp::version::PlatformVersion; @@ -18,6 +20,8 @@ use crate::execution::validation::state_transition::state_transitions::documents use crate::execution::validation::state_transition::state_transitions::documents_batch::action_validation::document_delete_transition_action::DocumentDeleteTransitionActionValidation; use crate::execution::validation::state_transition::state_transitions::documents_batch::action_validation::document_create_transition_action::DocumentCreateTransitionActionValidation; use dpp::state_transition::documents_batch_transition::document_create_transition::v0::v0_methods::DocumentCreateTransitionV0Methods; +use drive::state_transition_action::StateTransitionAction; +use drive::state_transition_action::system::bump_identity_data_contract_nonce_action::BumpIdentityDataContractNonceAction; use crate::error::execution::ExecutionError; pub(in crate::execution::validation::state_transition::state_transitions::documents_batch) trait DocumentsBatchStateTransitionStructureValidationV0 @@ -26,7 +30,7 @@ pub(in crate::execution::validation::state_transition::state_transitions::docume &self, action: &DocumentsBatchTransitionAction, platform_version: &PlatformVersion, - ) -> Result; + ) -> Result, Error>; } impl DocumentsBatchStateTransitionStructureValidationV0 for DocumentsBatchTransition { @@ -34,7 +38,7 @@ impl DocumentsBatchStateTransitionStructureValidationV0 for DocumentsBatchTransi &self, action: &DocumentsBatchTransitionAction, platform_version: &PlatformVersion, - ) -> Result { + ) -> Result, Error> { // We should validate that all newly created documents have valid ids for transition in self.transitions() { if let DocumentTransition::Create(create_transition) = transition { @@ -48,8 +52,19 @@ impl DocumentsBatchStateTransitionStructureValidationV0 for DocumentsBatchTransi let id = create_transition.base().id(); if generated_document_id != id { - return Ok(SimpleConsensusValidationResult::new_with_error( - InvalidDocumentTransitionIdError::new(generated_document_id, id).into(), + let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( + BumpIdentityDataContractNonceAction::from_borrowed_document_base_transition( + transition.base(), + self.owner_id(), + self.user_fee_increase(), + ), + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + vec![ + InvalidDocumentTransitionIdError::new(generated_document_id, id).into(), + ], )); } } @@ -61,19 +76,40 @@ impl DocumentsBatchStateTransitionStructureValidationV0 for DocumentsBatchTransi DocumentTransitionAction::CreateAction(create_action) => { let result = create_action.validate_structure(platform_version)?; if !result.is_valid() { - return Ok(result); + let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( + BumpIdentityDataContractNonceAction::from_borrowed_document_base_transition_action(transition.base().expect("there is always a base for the create action"), self.owner_id(), self.user_fee_increase()), + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + result.errors, + )); } } DocumentTransitionAction::ReplaceAction(replace_action) => { let result = replace_action.validate_structure(platform_version)?; if !result.is_valid() { - return Ok(result); + let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( + BumpIdentityDataContractNonceAction::from_borrowed_document_base_transition_action(transition.base().expect("there is always a base for the create action"), self.owner_id(), self.user_fee_increase()), + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + result.errors, + )); } } DocumentTransitionAction::DeleteAction(delete_action) => { let result = delete_action.validate_structure(platform_version)?; if !result.is_valid() { - return Ok(result); + let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( + BumpIdentityDataContractNonceAction::from_borrowed_document_base_transition_action(transition.base().expect("there is always a base for the create action"), self.owner_id(), self.user_fee_increase()), + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + result.errors, + )); } } DocumentTransitionAction::BumpIdentityDataContractNonce(_) => { @@ -83,6 +119,6 @@ impl DocumentsBatchStateTransitionStructureValidationV0 for DocumentsBatchTransi } } } - Ok(SimpleConsensusValidationResult::new()) + Ok(ConsensusValidationResult::new()) } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs index ebcfdd56d6..20e1b22015 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs @@ -131,7 +131,7 @@ impl StateTransitionStructureKnownInStateValidationV0 for DocumentsBatchTransiti _platform: &PlatformStateRef, action: &StateTransitionAction, platform_version: &PlatformVersion, - ) -> Result { + ) -> Result, Error> { match platform_version .drive_abci .validation_and_processing diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs index e3d1bbb2c3..91cc4c5b02 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs @@ -95,7 +95,7 @@ impl DocumentsBatchStateTransitionStateValidationV0 for DocumentsBatchTransition ))?, owner_id, state_transition_action.user_fee_increase(), - )?, + ), ), ); } else if platform.config.execution.use_document_triggers { @@ -136,7 +136,7 @@ impl DocumentsBatchStateTransitionStateValidationV0 for DocumentsBatchTransition ))?, owner_id, state_transition_action.user_fee_increase(), - )?, + ), )); } else { validated_transitions.push(transition); diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/identity_and_signatures/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/identity_and_signatures/v0/mod.rs index be5acc7827..6c76374166 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/identity_and_signatures/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/identity_and_signatures/v0/mod.rs @@ -1,4 +1,3 @@ -use crate::error::Error; use dpp::consensus::basic::identity::IdentityAssetLockTransactionOutputNotFoundError; use dpp::consensus::basic::invalid_identifier_error::InvalidIdentifierError; use dpp::consensus::basic::BasicError; @@ -22,7 +21,7 @@ pub(crate) trait IdentityCreateStateTransitionIdentityAndSignaturesValidationV0 &self, signable_bytes: Vec, execution_context: &mut StateTransitionExecutionContext, - ) -> Result; + ) -> SimpleConsensusValidationResult; } impl IdentityCreateStateTransitionIdentityAndSignaturesValidationV0 for IdentityCreateTransition { @@ -30,37 +29,30 @@ impl IdentityCreateStateTransitionIdentityAndSignaturesValidationV0 for Identity &self, signable_bytes: Vec, execution_context: &mut StateTransitionExecutionContext, - ) -> Result { - let mut validation_result = SimpleConsensusValidationResult::default(); + ) -> SimpleConsensusValidationResult { for key in self.public_keys().iter() { let result = signable_bytes.as_slice().verify_signature( key.key_type(), key.data().as_slice(), key.signature().as_slice(), - )?; + ); execution_context.add_operation(ValidationOperation::SignatureVerification( SignatureVerificationOperation::new(key.key_type()), )); if !result.is_valid() { - validation_result.add_errors(result.errors); + return result; } } - if !validation_result.is_valid() { - return Ok(validation_result); - } - // We should validate that the identity id is created from the asset lock proof let identifier_from_outpoint = match self.asset_lock_proof().create_identifier() { Ok(identifier) => identifier, Err(_) => { - return Ok(ConsensusValidationResult::new_with_error( - ConsensusError::BasicError( - BasicError::IdentityAssetLockTransactionOutputNotFoundError( - IdentityAssetLockTransactionOutputNotFoundError::new( - self.asset_lock_proof().output_index() as usize, - ), + return ConsensusValidationResult::new_with_error(ConsensusError::BasicError( + BasicError::IdentityAssetLockTransactionOutputNotFoundError( + IdentityAssetLockTransactionOutputNotFoundError::new( + self.asset_lock_proof().output_index() as usize, ), ), )) @@ -68,16 +60,14 @@ impl IdentityCreateStateTransitionIdentityAndSignaturesValidationV0 for Identity }; if identifier_from_outpoint != self.identity_id() { - return Ok(ConsensusValidationResult::new_with_error( - ConsensusError::BasicError(BasicError::InvalidIdentifierError( - InvalidIdentifierError::new( - "identity_id".to_string(), - "does not match created identifier from asset lock".to_string(), - ), + return ConsensusValidationResult::new_with_error(ConsensusError::BasicError( + BasicError::InvalidIdentifierError(InvalidIdentifierError::new( + "identity_id".to_string(), + "does not match created identifier from asset lock".to_string(), )), )); } - Ok(validation_result) + SimpleConsensusValidationResult::new() } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/structure/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/structure/v0/mod.rs index 502f1c6d3a..43ede0b10e 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/structure/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/structure/v0/mod.rs @@ -29,6 +29,7 @@ impl IdentityCreateStateTransitionStructureValidationV0 for IdentityCreateTransi IdentityPublicKeyInCreation::validate_identity_public_keys_structure( self.public_keys(), + true, platform_version, ) .map_err(Error::Protocol) diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/identity_and_signatures/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/advanced_structure/mod.rs similarity index 100% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/identity_and_signatures/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/advanced_structure/mod.rs diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/identity_and_signatures/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/advanced_structure/v0/mod.rs similarity index 64% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/identity_and_signatures/v0/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/advanced_structure/v0/mod.rs index f91ad92ab0..a5071a5d3a 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/identity_and_signatures/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/advanced_structure/v0/mod.rs @@ -15,7 +15,9 @@ use dpp::serialization::PlatformMessageSignable; use dpp::state_transition::identity_update_transition::accessors::IdentityUpdateTransitionAccessorsV0; use dpp::state_transition::identity_update_transition::IdentityUpdateTransition; use dpp::state_transition::public_key_in_creation::accessors::IdentityPublicKeyInCreationV0Getters; -use dpp::validation::SimpleConsensusValidationResult; +use dpp::validation::ConsensusValidationResult; +use drive::state_transition_action::system::bump_identity_nonce_action::BumpIdentityNonceAction; +use drive::state_transition_action::StateTransitionAction; pub(in crate::execution::validation::state_transition) trait IdentityUpdateStateTransitionIdentityAndSignaturesValidationV0 { @@ -24,7 +26,7 @@ pub(in crate::execution::validation::state_transition) trait IdentityUpdateState signable_bytes: Vec, partial_identity: &PartialIdentity, execution_context: &mut StateTransitionExecutionContext, - ) -> Result; + ) -> Result, Error>; } impl IdentityUpdateStateTransitionIdentityAndSignaturesValidationV0 for IdentityUpdateTransition { @@ -33,37 +35,52 @@ impl IdentityUpdateStateTransitionIdentityAndSignaturesValidationV0 for Identity signable_bytes: Vec, partial_identity: &PartialIdentity, execution_context: &mut StateTransitionExecutionContext, - ) -> Result { - let mut result = SimpleConsensusValidationResult::default(); + ) -> Result, Error> { + let Some(revision) = partial_identity.revision else { + return Err(Error::Execution(CorruptedCodeExecution( + "revision should exist", + ))); + }; + + // Check revision + if revision + 1 != self.revision() { + let bump_action = StateTransitionAction::BumpIdentityNonceAction( + BumpIdentityNonceAction::from_borrowed_identity_update_transition(self), + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + vec![ + StateError::InvalidIdentityRevisionError(InvalidIdentityRevisionError::new( + self.identity_id(), + revision, + )) + .into(), + ], + )); + } for key in self.public_keys_to_add().iter() { let validation_result = signable_bytes.as_slice().verify_signature( key.key_type(), key.data().as_slice(), key.signature().as_slice(), - )?; + ); execution_context.add_operation(ValidationOperation::SignatureVerification( SignatureVerificationOperation::new(key.key_type()), )); if !validation_result.is_valid() { - result.add_errors(validation_result.errors); - } - } + let bump_action = StateTransitionAction::BumpIdentityNonceAction( + BumpIdentityNonceAction::from_borrowed_identity_update_transition(self), + ); - let Some(revision) = partial_identity.revision else { - return Err(Error::Execution(CorruptedCodeExecution( - "revision should exist", - ))); - }; - - // Check revision - if revision + 1 != self.revision() { - result.add_error(StateError::InvalidIdentityRevisionError( - InvalidIdentityRevisionError::new(self.identity_id(), revision), - )); - return Ok(result); + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + validation_result.errors, + )); + } } - Ok(result) + Ok(ConsensusValidationResult::new()) } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/structure/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/basic_structure/mod.rs similarity index 100% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/structure/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/basic_structure/mod.rs diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/structure/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/basic_structure/v0/mod.rs similarity index 99% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/structure/v0/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/basic_structure/v0/mod.rs index b17952d8ff..b8f750804a 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/structure/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/basic_structure/v0/mod.rs @@ -81,6 +81,7 @@ impl IdentityUpdateStateTransitionStructureValidationV0 for IdentityUpdateTransi IdentityPublicKeyInCreation::validate_identity_public_keys_structure( self.public_keys_to_add(), + false, platform_version, ) .map_err(Error::Protocol) diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/mod.rs index 571f999ea1..17729bb336 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/mod.rs @@ -1,7 +1,7 @@ -pub(crate) mod identity_and_signatures; +pub(crate) mod advanced_structure; +mod basic_structure; mod nonce; mod state; -mod structure; use dpp::block::block_info::BlockInfo; use dpp::state_transition::identity_update_transition::IdentityUpdateTransition; @@ -18,8 +18,8 @@ use crate::execution::types::state_transition_execution_context::StateTransition use crate::platform_types::platform::PlatformRef; use crate::rpc::core::CoreRPCLike; +use crate::execution::validation::state_transition::identity_update::basic_structure::v0::IdentityUpdateStateTransitionStructureValidationV0; use crate::execution::validation::state_transition::identity_update::state::v0::IdentityUpdateStateTransitionStateValidationV0; -use crate::execution::validation::state_transition::identity_update::structure::v0::IdentityUpdateStateTransitionStructureValidationV0; use crate::execution::validation::state_transition::processor::v0::{ StateTransitionBasicStructureValidationV0, StateTransitionStateValidationV0, }; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/state/v0/mod.rs index dbfb3fdbb3..08997950bf 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_update/state/v0/mod.rs @@ -18,6 +18,7 @@ use crate::execution::types::state_transition_execution_context::StateTransition use crate::execution::validation::state_transition::common::validate_identity_public_key_contract_bounds::validate_identity_public_keys_contract_bounds; use crate::execution::validation::state_transition::common::validate_identity_public_key_ids_dont_exist_in_state::validate_identity_public_key_ids_dont_exist_in_state; use crate::execution::validation::state_transition::common::validate_identity_public_key_ids_exist_in_state::validate_identity_public_key_ids_exist_in_state; +use crate::execution::validation::state_transition::common::validate_not_disabling_last_master_key::validate_master_key_uniqueness; use crate::execution::validation::state_transition::common::validate_unique_identity_public_key_hashes_in_state::validate_unique_identity_public_key_hashes_not_in_state; pub(in crate::execution::validation::state_transition::state_transitions::identity_update) trait IdentityUpdateStateTransitionStateValidationV0 @@ -60,7 +61,7 @@ impl IdentityUpdateStateTransitionStateValidationV0 for IdentityUpdateTransition if !validation_result.is_valid() { let bump_action = StateTransitionAction::BumpIdentityNonceAction( - BumpIdentityNonceAction::from_borrowed_identity_update_transition(self)?, + BumpIdentityNonceAction::from_borrowed_identity_update_transition(self), ); return Ok(ConsensusValidationResult::new_with_data_and_errors( @@ -83,7 +84,7 @@ impl IdentityUpdateStateTransitionStateValidationV0 for IdentityUpdateTransition if !validation_result.is_valid() { let bump_action = StateTransitionAction::BumpIdentityNonceAction( - BumpIdentityNonceAction::from_borrowed_identity_update_transition(self)?, + BumpIdentityNonceAction::from_borrowed_identity_update_transition(self), ); return Ok(ConsensusValidationResult::new_with_data_and_errors( @@ -108,7 +109,7 @@ impl IdentityUpdateStateTransitionStateValidationV0 for IdentityUpdateTransition if !validation_result.is_valid() { let bump_action = StateTransitionAction::BumpIdentityNonceAction( - BumpIdentityNonceAction::from_borrowed_identity_update_transition(self)?, + BumpIdentityNonceAction::from_borrowed_identity_update_transition(self), ); return Ok(ConsensusValidationResult::new_with_data_and_errors( @@ -118,8 +119,7 @@ impl IdentityUpdateStateTransitionStateValidationV0 for IdentityUpdateTransition } if !self.public_key_ids_to_disable().is_empty() { - // We need to validate that all keys removed existed - validation_result.add_errors( + let validation_result_and_keys_to_disable = validate_identity_public_key_ids_exist_in_state( self.identity_id(), self.public_key_ids_to_disable(), @@ -127,13 +127,29 @@ impl IdentityUpdateStateTransitionStateValidationV0 for IdentityUpdateTransition &mut state_transition_execution_context, tx, platform_version, - )? - .errors, - ); + )?; + // We need to validate that all keys removed existed + if !validation_result_and_keys_to_disable.is_valid() { + let bump_action = StateTransitionAction::BumpIdentityNonceAction( + BumpIdentityNonceAction::from_borrowed_identity_update_transition(self), + ); + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + validation_result_and_keys_to_disable.errors, + )); + } + + let keys_to_disable = validation_result_and_keys_to_disable.into_data()?; + + let validation_result = validate_master_key_uniqueness( + self.public_keys_to_add(), + keys_to_disable.as_slice(), + platform_version, + )?; if !validation_result.is_valid() { let bump_action = StateTransitionAction::BumpIdentityNonceAction( - BumpIdentityNonceAction::from_borrowed_identity_update_transition(self)?, + BumpIdentityNonceAction::from_borrowed_identity_update_transition(self), ); return Ok(ConsensusValidationResult::new_with_data_and_errors( diff --git a/packages/rs-drive-abci/tests/strategy_tests/chain_lock_update.rs b/packages/rs-drive-abci/tests/strategy_tests/chain_lock_update.rs index c5fda75422..56c1c8df75 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/chain_lock_update.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/chain_lock_update.rs @@ -8,7 +8,7 @@ mod tests { use drive_abci::test::helpers::setup::TestPlatformBuilder; use strategy_tests::frequency::Frequency; - use strategy_tests::{StartIdentities, Strategy}; + use strategy_tests::{IdentityInsertInfo, StartIdentities, Strategy}; #[test] fn run_chain_lock_update_quorums_not_changing() { @@ -19,10 +19,8 @@ mod tests { contracts_with_updates: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + identities_inserts: IdentityInsertInfo::default(), + identity_contract_nonce_gaps: None, signer: None, }, diff --git a/packages/rs-drive-abci/tests/strategy_tests/core_update_tests.rs b/packages/rs-drive-abci/tests/strategy_tests/core_update_tests.rs index de8eddbf67..88a439f29f 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/core_update_tests.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/core_update_tests.rs @@ -9,7 +9,7 @@ mod tests { use drive_abci::platform_types::validator_set::v0::ValidatorSetV0Getters; use drive_abci::test::helpers::setup::TestPlatformBuilder; use strategy_tests::frequency::Frequency; - use strategy_tests::{StartIdentities, Strategy}; + use strategy_tests::{IdentityInsertInfo, StartIdentities, Strategy}; #[test] fn run_chain_random_bans() { @@ -18,10 +18,8 @@ mod tests { contracts_with_updates: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + identities_inserts: IdentityInsertInfo::default(), + identity_contract_nonce_gaps: None, signer: None, }, @@ -118,10 +116,8 @@ mod tests { contracts_with_updates: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + identities_inserts: IdentityInsertInfo::default(), + identity_contract_nonce_gaps: None, signer: None, }, @@ -204,10 +200,8 @@ mod tests { contracts_with_updates: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + identities_inserts: IdentityInsertInfo::default(), + identity_contract_nonce_gaps: None, signer: None, }, diff --git a/packages/rs-drive-abci/tests/strategy_tests/execution.rs b/packages/rs-drive-abci/tests/strategy_tests/execution.rs index 9c628c1481..66ba2f947e 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/execution.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/execution.rs @@ -869,16 +869,15 @@ pub(crate) fn continue_chain_for_strategy( .validator_set .get(i as usize) .unwrap(); - let (state_transitions, finalize_block_operations) = strategy - .state_transitions_for_block( - platform, - &block_info, - &mut current_identities, - &mut current_identity_nonce_counter, - &mut current_identity_contract_nonce_counter, - &mut signer, - &mut rng, - ); + let (state_transitions, finalize_block_operations) = strategy.state_transitions_for_block( + platform, + &block_info, + &mut current_identities, + &mut current_identity_nonce_counter, + &mut current_identity_contract_nonce_counter, + &mut signer, + &mut rng, + ); state_transitions_per_block.insert(block_height, state_transitions.clone()); diff --git a/packages/rs-drive-abci/tests/strategy_tests/failures.rs b/packages/rs-drive-abci/tests/strategy_tests/failures.rs index ea50c4439c..d7d7eb9ccc 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/failures.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/failures.rs @@ -5,7 +5,7 @@ mod tests { use strategy_tests::frequency::Frequency; use crate::strategy::{FailureStrategy, NetworkStrategy}; - use strategy_tests::{StartIdentities, Strategy}; + use strategy_tests::{IdentityInsertInfo, StartIdentities, Strategy}; use drive_abci::config::{ExecutionConfig, PlatformConfig, PlatformTestConfig}; @@ -47,10 +47,14 @@ mod tests { )], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: Frequency { - times_per_block_range: 1..2, - chance_per_block: None, + identities_inserts: IdentityInsertInfo { + frequency: Frequency { + times_per_block_range: 1..2, + chance_per_block: None, + }, + ..Default::default() }, + identity_contract_nonce_gaps: None, signer: None, }, @@ -67,7 +71,7 @@ mod tests { dont_finalize_block: false, expect_every_block_errors_with_codes: vec![], rounds_before_successful_block: None, - expect_specific_block_errors_with_codes: HashMap::from([(3, vec![1067])]), //missing position (we skipped pos 6) + expect_specific_block_errors_with_codes: HashMap::from([(3, vec![10411])]), //missing position (we skipped pos 6) }), query_testing: None, verify_state_transition_results: true, @@ -124,10 +128,8 @@ mod tests { contracts_with_updates: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + identities_inserts: IdentityInsertInfo::default(), + identity_contract_nonce_gaps: None, signer: None, }, diff --git a/packages/rs-drive-abci/tests/strategy_tests/main.rs b/packages/rs-drive-abci/tests/strategy_tests/main.rs index 390e244f84..fb19363487 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/main.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/main.rs @@ -85,7 +85,7 @@ mod tests { use strategy_tests::operations::{ DocumentAction, DocumentOp, IdentityUpdateOp, Operation, OperationType, }; - use strategy_tests::StartIdentities; + use strategy_tests::{IdentityInsertInfo, StartIdentities}; use crate::strategy::CoreHeightIncrease::RandomCoreHeightIncrease; use dpp::dashcore::bls_sig_utils::BLSSignature; @@ -111,6 +111,7 @@ mod tests { use itertools::Itertools; use tenderdash_abci::proto::abci::{RequestInfo, ResponseInfo}; + use dpp::identity::{KeyType, Purpose, SecurityLevel}; use dpp::state_transition::StateTransition; use tenderdash_abci::Application; @@ -147,10 +148,8 @@ mod tests { contracts_with_updates: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + identities_inserts: IdentityInsertInfo::default(), + identity_contract_nonce_gaps: None, signer: None, }, @@ -193,10 +192,8 @@ mod tests { contracts_with_updates: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + identities_inserts: IdentityInsertInfo::default(), + identity_contract_nonce_gaps: None, signer: None, }, @@ -240,10 +237,8 @@ mod tests { contracts_with_updates: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + identities_inserts: IdentityInsertInfo::default(), + identity_contract_nonce_gaps: None, signer: None, }, @@ -368,10 +363,8 @@ mod tests { contracts_with_updates: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + identities_inserts: IdentityInsertInfo::default(), + identity_contract_nonce_gaps: None, signer: None, }, @@ -503,10 +496,14 @@ mod tests { contracts_with_updates: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: Frequency { - times_per_block_range: 1..2, - chance_per_block: None, + identities_inserts: IdentityInsertInfo { + frequency: Frequency { + times_per_block_range: 1..2, + chance_per_block: None, + }, + ..Default::default() }, + identity_contract_nonce_gaps: None, signer: None, }, @@ -554,7 +551,7 @@ mod tests { .expect("expected to fetch balances") .expect("expected to have an identity to get balance from"); - assert_eq!(balance, 99864802180) + assert_eq!(balance, 99864800180) } #[test] @@ -564,10 +561,8 @@ mod tests { contracts_with_updates: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + identities_inserts: IdentityInsertInfo::default(), + identity_contract_nonce_gaps: None, signer: None, }, @@ -614,10 +609,8 @@ mod tests { contracts_with_updates: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + identities_inserts: IdentityInsertInfo::default(), + identity_contract_nonce_gaps: None, signer: None, }, @@ -672,10 +665,8 @@ mod tests { contracts_with_updates: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + identities_inserts: IdentityInsertInfo::default(), + identity_contract_nonce_gaps: None, signer: None, }, @@ -735,10 +726,7 @@ mod tests { contracts_with_updates: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + identities_inserts: IdentityInsertInfo::default(), identity_contract_nonce_gaps: None, signer: None, }, @@ -811,10 +799,8 @@ mod tests { contracts_with_updates: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + identities_inserts: IdentityInsertInfo::default(), + identity_contract_nonce_gaps: None, signer: None, }, @@ -876,10 +862,8 @@ mod tests { contracts_with_updates: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + identities_inserts: IdentityInsertInfo::default(), + identity_contract_nonce_gaps: None, signer: None, }, @@ -944,10 +928,8 @@ mod tests { contracts_with_updates: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + identities_inserts: IdentityInsertInfo::default(), + identity_contract_nonce_gaps: None, signer: None, }, @@ -1039,10 +1021,14 @@ mod tests { contracts_with_updates: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: Frequency { - times_per_block_range: 1..2, - chance_per_block: None, + identities_inserts: IdentityInsertInfo { + frequency: Frequency { + times_per_block_range: 1..2, + chance_per_block: None, + }, + ..Default::default() }, + identity_contract_nonce_gaps: None, signer: None, }, @@ -1093,10 +1079,14 @@ mod tests { contracts_with_updates: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: Frequency { - times_per_block_range: 1..2, - chance_per_block: None, + identities_inserts: IdentityInsertInfo { + frequency: Frequency { + times_per_block_range: 1..2, + chance_per_block: None, + }, + ..Default::default() }, + identity_contract_nonce_gaps: None, signer: None, }, @@ -1151,7 +1141,7 @@ mod tests { .unwrap() .unwrap() ), - "6e2987b90789a80ebd2afbc7fc6f86925e504c5f06aad2fbe3982c12d8fbea8b".to_string() + "8e1e8d1ae51b3fc8a9e4acd0d312c9494943f2b7a5b957cc1379ab246ebd678d".to_string() ) } @@ -1171,10 +1161,14 @@ mod tests { contracts_with_updates: vec![(contract, None)], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: Frequency { - times_per_block_range: 1..2, - chance_per_block: None, + identities_inserts: IdentityInsertInfo { + frequency: Frequency { + times_per_block_range: 1..2, + chance_per_block: None, + }, + ..Default::default() }, + identity_contract_nonce_gaps: None, signer: None, }, @@ -1278,10 +1272,14 @@ mod tests { )], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: Frequency { - times_per_block_range: 1..2, - chance_per_block: None, + identities_inserts: IdentityInsertInfo { + frequency: Frequency { + times_per_block_range: 1..2, + chance_per_block: None, + }, + ..Default::default() }, + identity_contract_nonce_gaps: None, signer: None, }, @@ -1378,10 +1376,14 @@ mod tests { }, }], start_identities: StartIdentities::default(), - identities_inserts: Frequency { - times_per_block_range: 1..2, - chance_per_block: None, + identities_inserts: IdentityInsertInfo { + frequency: Frequency { + times_per_block_range: 1..2, + chance_per_block: None, + }, + ..Default::default() }, + identity_contract_nonce_gaps: None, signer: None, }, @@ -1454,10 +1456,14 @@ mod tests { }, }], start_identities: StartIdentities::default(), - identities_inserts: Frequency { - times_per_block_range: 1..2, - chance_per_block: None, + identities_inserts: IdentityInsertInfo { + frequency: Frequency { + times_per_block_range: 1..2, + chance_per_block: None, + }, + ..Default::default() }, + identity_contract_nonce_gaps: None, signer: None, }, @@ -1558,10 +1564,14 @@ mod tests { }, ], start_identities: StartIdentities::default(), - identities_inserts: Frequency { - times_per_block_range: 1..2, - chance_per_block: None, + identities_inserts: IdentityInsertInfo { + frequency: Frequency { + times_per_block_range: 1..2, + chance_per_block: None, + }, + ..Default::default() }, + identity_contract_nonce_gaps: None, signer: None, }, @@ -1662,10 +1672,14 @@ mod tests { }, ], start_identities: StartIdentities::default(), - identities_inserts: Frequency { - times_per_block_range: 1..2, - chance_per_block: None, + identities_inserts: IdentityInsertInfo { + frequency: Frequency { + times_per_block_range: 1..2, + chance_per_block: None, + }, + ..Default::default() }, + identity_contract_nonce_gaps: None, signer: None, }, @@ -1722,7 +1736,7 @@ mod tests { .unwrap() .unwrap() ), - "8797928259c0545f1f12d945b56db05c9e3f9a9511be8e984ef6e505dad50135".to_string() + "665ec5018021b0a14a25b7ac6de780edc943a73adb3dc7e2eb623959a08056c3".to_string() ) } @@ -1781,10 +1795,14 @@ mod tests { }, ], start_identities: StartIdentities::default(), - identities_inserts: Frequency { - times_per_block_range: 1..2, - chance_per_block: None, + identities_inserts: IdentityInsertInfo { + frequency: Frequency { + times_per_block_range: 1..2, + chance_per_block: None, + }, + ..Default::default() }, + identity_contract_nonce_gaps: Some(Frequency { times_per_block_range: 1..3, chance_per_block: Some(0.5), @@ -1843,7 +1861,7 @@ mod tests { .unwrap() .unwrap() ), - "e98075d5d775e0ae9eca7d4c062999076185ff7e71910a65fb0dc10d4bbffd7f".to_string() + "3f1cfdfd2e1019e941434cc841282fbc156ee19062569e393a51af621447c7a7".to_string() ) } @@ -1902,10 +1920,14 @@ mod tests { }, ], start_identities: StartIdentities::default(), - identities_inserts: Frequency { - times_per_block_range: 1..2, - chance_per_block: None, + identities_inserts: IdentityInsertInfo { + frequency: Frequency { + times_per_block_range: 1..2, + chance_per_block: None, + }, + ..Default::default() }, + identity_contract_nonce_gaps: Some(Frequency { times_per_block_range: 24..25, chance_per_block: Some(1.0), @@ -2012,10 +2034,14 @@ mod tests { }, ], start_identities: StartIdentities::default(), - identities_inserts: Frequency { - times_per_block_range: 1..2, - chance_per_block: None, + identities_inserts: IdentityInsertInfo { + frequency: Frequency { + times_per_block_range: 1..2, + chance_per_block: None, + }, + ..Default::default() }, + identity_contract_nonce_gaps: Some(Frequency { times_per_block_range: 25..26, chance_per_block: Some(1.0), @@ -2122,10 +2148,15 @@ mod tests { }, ], start_identities: StartIdentities::default(), - identities_inserts: Frequency { - times_per_block_range: 1..30, - chance_per_block: None, + identities_inserts: IdentityInsertInfo { + frequency: Frequency { + times_per_block_range: 1..30, + chance_per_block: None, + }, + start_keys: 5, + extra_keys: Default::default(), }, + identity_contract_nonce_gaps: None, signer: None, }, @@ -2165,7 +2196,7 @@ mod tests { .build_with_mock_rpc(); let outcome = run_chain_for_strategy(&mut platform, block_count, strategy, config, 15); - assert_eq!(outcome.identities.len() as u64, 421); + assert_eq!(outcome.identities.len() as u64, 470); assert_eq!(outcome.masternode_identity_balances.len(), 100); let balance_count = outcome .masternode_identity_balances @@ -2246,10 +2277,15 @@ mod tests { }, ], start_identities: StartIdentities::default(), - identities_inserts: Frequency { - times_per_block_range: 1..6, - chance_per_block: None, + identities_inserts: IdentityInsertInfo { + frequency: Frequency { + times_per_block_range: 1..6, + chance_per_block: None, + }, + start_keys: 5, + extra_keys: Default::default(), }, + identity_contract_nonce_gaps: None, signer: None, }, @@ -2289,7 +2325,7 @@ mod tests { .build_with_mock_rpc(); let outcome = run_chain_for_strategy(&mut platform, block_count, strategy, config, 15); - assert_eq!(outcome.identities.len() as u64, 86); + assert_eq!(outcome.identities.len() as u64, 90); assert_eq!(outcome.masternode_identity_balances.len(), 100); let balance_count = outcome .masternode_identity_balances @@ -2314,10 +2350,14 @@ mod tests { }, }], start_identities: StartIdentities::default(), - identities_inserts: Frequency { - times_per_block_range: 1..2, - chance_per_block: None, + identities_inserts: IdentityInsertInfo { + frequency: Frequency { + times_per_block_range: 1..2, + chance_per_block: None, + }, + ..Default::default() }, + identity_contract_nonce_gaps: None, signer: None, }, @@ -2388,10 +2428,14 @@ mod tests { }, }], start_identities: StartIdentities::default(), - identities_inserts: Frequency { - times_per_block_range: 1..2, - chance_per_block: None, + identities_inserts: IdentityInsertInfo { + frequency: Frequency { + times_per_block_range: 1..2, + chance_per_block: None, + }, + ..Default::default() }, + identity_contract_nonce_gaps: None, signer: None, }, @@ -2469,10 +2513,14 @@ mod tests { }, }], start_identities: StartIdentities::default(), - identities_inserts: Frequency { - times_per_block_range: 1..2, - chance_per_block: None, + identities_inserts: IdentityInsertInfo { + frequency: Frequency { + times_per_block_range: 1..2, + chance_per_block: None, + }, + ..Default::default() }, + identity_contract_nonce_gaps: None, signer: None, }, @@ -2558,9 +2606,17 @@ mod tests { }, ], start_identities: StartIdentities::default(), - identities_inserts: Frequency { - times_per_block_range: 1..2, - chance_per_block: None, + identities_inserts: IdentityInsertInfo { + frequency: Frequency { + times_per_block_range: 1..2, + chance_per_block: None, + }, + start_keys: 3, + extra_keys: [( + Purpose::TRANSFER, + [(SecurityLevel::CRITICAL, vec![KeyType::ECDSA_SECP256K1])].into(), + )] + .into(), }, identity_contract_nonce_gaps: None, signer: None, @@ -2771,7 +2827,7 @@ mod tests { // Run block 4 // Should change pooled status to broadcasted - let last_block_broadcased_withdrawals_amount = last_block_withdrawals.len(); + let last_block_broadcasted_withdrawals_amount = last_block_withdrawals.len(); let ( ChainExecutionOutcome { abci_app, @@ -2836,7 +2892,7 @@ mod tests { // And extra withdrawals broadcasted let withdrawals_broadcasted_expected = - last_block_broadcased_withdrawals_amount + outcome.withdrawals.len(); + last_block_broadcasted_withdrawals_amount + outcome.withdrawals.len(); assert_eq!( withdrawal_documents_broadcasted.len(), withdrawals_broadcasted_expected @@ -2859,7 +2915,7 @@ mod tests { status_result.status = AssetUnlockStatus::Chainlocked; }); - // Then increase chainlocked height, so that withdrawals for chainlocked tranasctions + // Then increase chainlocked height, so that withdrawals for chainlocked transactions // could be completed in the next block // TODO: do we need this var? chain_locked_height += 1; @@ -3114,11 +3170,16 @@ mod tests { contracts_with_updates: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: Frequency { + identities_inserts: IdentityInsertInfo { //we do this to create some paying transactions - times_per_block_range: 1..2, - chance_per_block: None, + frequency: Frequency { + times_per_block_range: 1..2, + chance_per_block: None, + }, + start_keys: 5, + extra_keys: Default::default(), }, + identity_contract_nonce_gaps: None, signer: None, }, @@ -3274,11 +3335,16 @@ mod tests { contracts_with_updates: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: Frequency { + identities_inserts: IdentityInsertInfo { //we do this to create some paying transactions - times_per_block_range: 1..2, - chance_per_block: None, + frequency: Frequency { + times_per_block_range: 1..2, + chance_per_block: None, + }, + start_keys: 5, + extra_keys: Default::default(), }, + identity_contract_nonce_gaps: None, signer: None, }, @@ -3405,11 +3471,16 @@ mod tests { contracts_with_updates: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: Frequency { + identities_inserts: IdentityInsertInfo { //we do this to create some paying transactions - times_per_block_range: 1..2, - chance_per_block: None, + frequency: Frequency { + times_per_block_range: 1..2, + chance_per_block: None, + }, + start_keys: 5, + extra_keys: Default::default(), }, + identity_contract_nonce_gaps: None, signer: None, }, @@ -3537,10 +3608,8 @@ mod tests { contracts_with_updates: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + identities_inserts: IdentityInsertInfo::default(), + identity_contract_nonce_gaps: None, signer: None, }, @@ -3670,10 +3739,20 @@ mod tests { }, }], start_identities: StartIdentities::default(), - identities_inserts: Frequency { - times_per_block_range: 6..10, - chance_per_block: None, + identities_inserts: IdentityInsertInfo { + //we do this to create some paying transactions + frequency: Frequency { + times_per_block_range: 6..10, + chance_per_block: None, + }, + start_keys: 3, + extra_keys: [( + Purpose::TRANSFER, + [(SecurityLevel::CRITICAL, vec![KeyType::ECDSA_SECP256K1])].into(), + )] + .into(), }, + identity_contract_nonce_gaps: None, signer: None, }, @@ -3725,7 +3804,7 @@ mod tests { ) .expect("expected to fetch balances"); - assert_eq!(outcome.identities.len(), 110); + assert_eq!(outcome.identities.len(), 106); } // Test should filter out transactions exceeding max tx bytes per block @@ -3733,10 +3812,15 @@ mod tests { fn run_transactions_exceeding_max_block_size() { let strategy = NetworkStrategy { strategy: Strategy { - identities_inserts: Frequency { - times_per_block_range: 5..6, - chance_per_block: None, + identities_inserts: IdentityInsertInfo { + frequency: Frequency { + times_per_block_range: 5..6, + chance_per_block: None, + }, + start_keys: 5, + extra_keys: Default::default(), }, + ..Default::default() }, max_tx_bytes_per_block: 3500, diff --git a/packages/rs-drive-abci/tests/strategy_tests/query.rs b/packages/rs-drive-abci/tests/strategy_tests/query.rs index 1ace93ed31..bd68dfbbf2 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/query.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/query.rs @@ -337,7 +337,7 @@ mod tests { use drive_abci::test::helpers::setup::TestPlatformBuilder; - use strategy_tests::{StartIdentities, Strategy}; + use strategy_tests::{IdentityInsertInfo, StartIdentities, Strategy}; use crate::strategy::CoreHeightIncrease::RandomCoreHeightIncrease; @@ -372,10 +372,8 @@ mod tests { contracts_with_updates: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + identities_inserts: IdentityInsertInfo::default(), + identity_contract_nonce_gaps: None, signer: None, }, @@ -472,10 +470,8 @@ mod tests { contracts_with_updates: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + identities_inserts: IdentityInsertInfo::default(), + identity_contract_nonce_gaps: None, signer: None, }, @@ -573,10 +569,8 @@ mod tests { contracts_with_updates: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + identities_inserts: IdentityInsertInfo::default(), + identity_contract_nonce_gaps: None, signer: None, }, diff --git a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs index e26d2317ec..1835c10fb2 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs @@ -19,7 +19,7 @@ use strategy_tests::operations::{ use dpp::document::DocumentV0Getters; use dpp::fee::Credits; -use dpp::identity::{Identity, KeyID, KeyType, Purpose, SecurityLevel}; +use dpp::identity::{Identity, IdentityPublicKey, KeyID, KeyType, Purpose, SecurityLevel}; use dpp::serialization::PlatformSerializableWithPlatformVersion; use dpp::state_transition::data_contract_create_transition::DataContractCreateTransition; use dpp::state_transition::data_contract_update_transition::DataContractUpdateTransition; @@ -39,7 +39,7 @@ use drive_abci::platform_types::platform::Platform; use drive_abci::rpc::core::MockCoreRPCLike; use rand::prelude::{IteratorRandom, SliceRandom, StdRng}; use rand::Rng; -use strategy_tests::Strategy; +use strategy_tests::{KeyMaps, Strategy}; use strategy_tests::transitions::{create_state_transitions_for_identities, instant_asset_lock_proof_fixture}; use std::borrow::Cow; use std::collections::{BTreeMap, HashMap, HashSet}; @@ -369,19 +369,21 @@ impl NetworkStrategy { if block_info.height == 1 && self.strategy.start_identities.number_of_identities > 0 { let mut new_transitions = NetworkStrategy::create_identities_state_transitions( self.strategy.start_identities.number_of_identities.into(), - 5, + self.strategy.identities_inserts.start_keys as KeyID, + &self.strategy.identities_inserts.extra_keys, signer, rng, platform_version, ); state_transitions.append(&mut new_transitions); } - let frequency = &self.strategy.identities_inserts; + let frequency = &self.strategy.identities_inserts.frequency; if frequency.check_hit(rng) { let count = frequency.events(rng); let mut new_transitions = NetworkStrategy::create_identities_state_transitions( count, - 5, + self.strategy.identities_inserts.start_keys as KeyID, + &self.strategy.identities_inserts.extra_keys, signer, rng, platform_version, @@ -1088,13 +1090,14 @@ impl NetworkStrategy { // There can also be contract updates - let mut contract_update_state_transitions = self.initial_contract_update_state_transitions( - current_identities, - block_info.height, - signer, - contract_nonce_counter, - platform_version, - ); + let mut contract_update_state_transitions = self + .initial_contract_update_state_transitions( + current_identities, + block_info.height, + signer, + contract_nonce_counter, + platform_version, + ); state_transitions.append(&mut contract_update_state_transitions); } @@ -1105,17 +1108,37 @@ impl NetworkStrategy { fn create_identities_state_transitions( count: u16, key_count: KeyID, + extra_keys: &KeyMaps, signer: &mut SimpleSigner, rng: &mut StdRng, platform_version: &PlatformVersion, ) -> Vec<(Identity, StateTransition)> { - let (identities, keys) = Identity::random_identities_with_private_keys_with_rng::>( - count, - key_count, - rng, - platform_version, - ) + let (mut identities, mut keys) = Identity::random_identities_with_private_keys_with_rng::< + Vec<_>, + >(count, key_count, rng, platform_version) .expect("expected to create identities"); + + for identity in identities.iter_mut() { + for (purpose, security_to_key_type_map) in extra_keys { + for (security_level, key_types) in security_to_key_type_map { + for key_type in key_types { + let (key, private_key) = + IdentityPublicKey::random_key_with_known_attributes( + (identity.public_keys().len() + 1) as KeyID, + rng, + *purpose, + *security_level, + *key_type, + platform_version, + ) + .expect("expected to create key"); + identity.add_public_key(key.clone()); + keys.push((key, private_key)); + } + } + } + } + signer.add_keys(keys); create_state_transitions_for_identities(identities, signer, rng, platform_version) } diff --git a/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs b/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs index a5070a898c..6a6598a7c6 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs @@ -16,8 +16,7 @@ mod tests { use drive_abci::test::helpers::setup::TestPlatformBuilder; use platform_version::version::mocks::v2_test::TEST_PROTOCOL_VERSION_2; use platform_version::version::mocks::v3_test::TEST_PROTOCOL_VERSION_3; - use strategy_tests::frequency::Frequency; - use strategy_tests::{StartIdentities, Strategy}; + use strategy_tests::{IdentityInsertInfo, StartIdentities, Strategy}; #[test] fn run_chain_version_upgrade() { @@ -36,10 +35,8 @@ mod tests { contracts_with_updates: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + identities_inserts: IdentityInsertInfo::default(), + identity_contract_nonce_gaps: None, signer: None, }, @@ -279,10 +276,8 @@ mod tests { contracts_with_updates: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + identities_inserts: IdentityInsertInfo::default(), + identity_contract_nonce_gaps: None, signer: None, }, @@ -511,10 +506,8 @@ mod tests { contracts_with_updates: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + identities_inserts: IdentityInsertInfo::default(), + identity_contract_nonce_gaps: None, signer: None, }, @@ -740,10 +733,8 @@ mod tests { contracts_with_updates: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + identities_inserts: IdentityInsertInfo::default(), + identity_contract_nonce_gaps: None, signer: None, }, @@ -900,10 +891,8 @@ mod tests { contracts_with_updates: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + identities_inserts: IdentityInsertInfo::default(), + identity_contract_nonce_gaps: None, signer: None, }, @@ -1060,10 +1049,8 @@ mod tests { contracts_with_updates: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + identities_inserts: IdentityInsertInfo::default(), + identity_contract_nonce_gaps: None, signer: None, }, @@ -1162,10 +1149,8 @@ mod tests { contracts_with_updates: vec![], operations: vec![], start_identities: StartIdentities::default(), - identities_inserts: Frequency { - times_per_block_range: Default::default(), - chance_per_block: None, - }, + identities_inserts: IdentityInsertInfo::default(), + identity_contract_nonce_gaps: None, signer: None, }, diff --git a/packages/rs-drive/src/drive/identity/estimation_costs/for_purpose_in_key_reference_tree/v0/mod.rs b/packages/rs-drive/src/drive/identity/estimation_costs/for_purpose_in_key_reference_tree/v0/mod.rs index 149c4da3c2..f7a49a2bd7 100644 --- a/packages/rs-drive/src/drive/identity/estimation_costs/for_purpose_in_key_reference_tree/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/estimation_costs/for_purpose_in_key_reference_tree/v0/mod.rs @@ -37,12 +37,12 @@ impl Drive { let estimated_layer_count = match purpose { Purpose::AUTHENTICATION => ApproximateElements(4), Purpose::ENCRYPTION => { - unreachable!() + return; } Purpose::DECRYPTION => { - unreachable!() + return; } - Purpose::WITHDRAW => ApproximateElements(1), + Purpose::TRANSFER => ApproximateElements(1), Purpose::SYSTEM => ApproximateElements(1), Purpose::VOTING => ApproximateElements(1), }; @@ -50,12 +50,12 @@ impl Drive { let estimated_layer_sizes = match purpose { Purpose::AUTHENTICATION => AllSubtrees(1, NoSumTrees, None), Purpose::ENCRYPTION => { - unreachable!() + return; } Purpose::DECRYPTION => { - unreachable!() + return; } - Purpose::WITHDRAW => AllReference(1, KEY_REFERENCE_SIZE, None), + Purpose::TRANSFER => AllReference(1, KEY_REFERENCE_SIZE, None), Purpose::SYSTEM => AllReference(1, KEY_REFERENCE_SIZE, None), Purpose::VOTING => AllReference(1, KEY_REFERENCE_SIZE, None), }; diff --git a/packages/rs-drive/src/drive/identity/key/insert/create_new_identity_key_query_trees/v0/mod.rs b/packages/rs-drive/src/drive/identity/key/insert/create_new_identity_key_query_trees/v0/mod.rs index e3f720f2e6..309c2957f8 100644 --- a/packages/rs-drive/src/drive/identity/key/insert/create_new_identity_key_query_trees/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/key/insert/create_new_identity_key_query_trees/v0/mod.rs @@ -33,8 +33,8 @@ impl Drive { )?; } - // There are 4 Purposes: Authentication, Encryption, Decryption, Withdrawal - for purpose in Purpose::authentication_withdraw() { + // There are 4 Purposes: Authentication, Encryption, Decryption, Transfer + for purpose in Purpose::authentication_and_transfer() { self.batch_insert_empty_tree( identity_query_key_tree, DriveKeyInfo::Key(vec![purpose as u8]), diff --git a/packages/rs-drive/src/drive/identity/key/insert/insert_key_searchable_references/v0/mod.rs b/packages/rs-drive/src/drive/identity/key/insert/insert_key_searchable_references/v0/mod.rs index 95c523c67c..588d686cbe 100644 --- a/packages/rs-drive/src/drive/identity/key/insert/insert_key_searchable_references/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/key/insert/insert_key_searchable_references/v0/mod.rs @@ -1,8 +1,9 @@ use crate::drive::flags::SINGLE_EPOCH_FLAGS_SIZE; use crate::drive::grove_operations::BatchInsertTreeApplyType; use crate::drive::identity::{ - identity_key_location_within_identity_vec, identity_query_keys_full_tree_path, - identity_query_keys_purpose_tree_path, + identity_key_location_within_identity_vec, + identity_query_keys_for_authentication_full_tree_path, + identity_query_keys_for_transfer_full_tree_path, identity_query_keys_purpose_tree_path, }; use crate::drive::object_size_info::PathKeyElementInfo::PathFixedSizeKeyRefElement; use crate::drive::object_size_info::PathKeyInfo::PathFixedSizeKey; @@ -63,54 +64,76 @@ impl Drive { // Now lets add in references so we can query keys. // We assume the following, the identity already has a the basic Query Tree - if !(purpose == Purpose::AUTHENTICATION && security_level == SecurityLevel::MEDIUM) { - // Not Medium (Medium is already pre-inserted) + match purpose { + Purpose::AUTHENTICATION => { + if security_level != SecurityLevel::MEDIUM { + // Not Medium (Medium is already pre-inserted) - let purpose_path = identity_query_keys_purpose_tree_path( - identity_id.as_slice(), - purpose_vec.as_slice(), - ); + let purpose_path = identity_query_keys_purpose_tree_path( + identity_id.as_slice(), + purpose_vec.as_slice(), + ); - let apply_type = if estimated_costs_only_with_layer_info.is_none() { - BatchInsertTreeApplyType::StatefulBatchInsertTree - } else { - BatchInsertTreeApplyType::StatelessBatchInsertTree { - in_tree_using_sums: false, - is_sum_tree: false, - flags_len: SINGLE_EPOCH_FLAGS_SIZE, - } - }; + let apply_type = if estimated_costs_only_with_layer_info.is_none() { + BatchInsertTreeApplyType::StatefulBatchInsertTree + } else { + BatchInsertTreeApplyType::StatelessBatchInsertTree { + in_tree_using_sums: false, + is_sum_tree: false, + flags_len: SINGLE_EPOCH_FLAGS_SIZE, + } + }; - // We need to insert the security level if it doesn't yet exist - self.batch_insert_empty_tree_if_not_exists_check_existing_operations( - PathFixedSizeKey((purpose_path, vec![security_level as u8])), - None, - apply_type, - transaction, - drive_operations, - drive_version, - )?; - } + // We need to insert the security level if it doesn't yet exist + self.batch_insert_empty_tree_if_not_exists_check_existing_operations( + PathFixedSizeKey((purpose_path, vec![security_level as u8])), + None, + apply_type, + transaction, + drive_operations, + drive_version, + )?; + } - // Now let's set the reference - let reference_path = identity_query_keys_full_tree_path( - identity_id.as_slice(), - purpose_vec.as_slice(), - security_level_vec.as_slice(), - ); + // Now let's set the reference + let reference_path = identity_query_keys_for_authentication_full_tree_path( + identity_id.as_slice(), + security_level_vec.as_slice(), + ); - let key_reference = identity_key_location_within_identity_vec(key_id_bytes); - self.batch_insert( - PathFixedSizeKeyRefElement(( - reference_path, - key_id_bytes, - Element::new_reference_with_flags( - ReferencePathType::UpstreamRootHeightReference(2, key_reference), - None, - ), - )), - drive_operations, - drive_version, - ) + let key_reference = identity_key_location_within_identity_vec(key_id_bytes); + self.batch_insert( + PathFixedSizeKeyRefElement(( + reference_path, + key_id_bytes, + Element::new_reference_with_flags( + ReferencePathType::UpstreamRootHeightReference(2, key_reference), + None, + ), + )), + drive_operations, + drive_version, + ) + } + Purpose::TRANSFER => { + // Now let's set the reference + let reference_path = + identity_query_keys_for_transfer_full_tree_path(identity_id.as_slice()); + let key_reference = identity_key_location_within_identity_vec(key_id_bytes); + self.batch_insert( + PathFixedSizeKeyRefElement(( + reference_path, + key_id_bytes, + Element::new_reference_with_flags( + ReferencePathType::UpstreamRootHeightReference(2, key_reference), + None, + ), + )), + drive_operations, + drive_version, + ) + } + _ => Ok(()), + } } } diff --git a/packages/rs-drive/src/drive/identity/key/insert/insert_new_non_unique_key/v0/mod.rs b/packages/rs-drive/src/drive/identity/key/insert/insert_new_non_unique_key/v0/mod.rs index aa90b52450..e634f4c924 100644 --- a/packages/rs-drive/src/drive/identity/key/insert/insert_new_non_unique_key/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/key/insert/insert_new_non_unique_key/v0/mod.rs @@ -63,7 +63,7 @@ impl Drive { if with_searchable_inner_references && matches!( identity_key.purpose(), - Purpose::AUTHENTICATION | Purpose::WITHDRAW + Purpose::AUTHENTICATION | Purpose::TRANSFER ) { self.insert_key_searchable_references_operations( diff --git a/packages/rs-drive/src/drive/identity/key/insert/insert_new_unique_key/v0/mod.rs b/packages/rs-drive/src/drive/identity/key/insert/insert_new_unique_key/v0/mod.rs index 0f2fd40041..d876d28b05 100644 --- a/packages/rs-drive/src/drive/identity/key/insert/insert_new_unique_key/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/key/insert/insert_new_unique_key/v0/mod.rs @@ -58,7 +58,7 @@ impl Drive { if with_searchable_inner_references && matches!( identity_key.purpose(), - Purpose::AUTHENTICATION | Purpose::WITHDRAW + Purpose::AUTHENTICATION | Purpose::TRANSFER ) { self.insert_key_searchable_references_operations( diff --git a/packages/rs-drive/src/drive/identity/mod.rs b/packages/rs-drive/src/drive/identity/mod.rs index 4266517050..d57226350f 100644 --- a/packages/rs-drive/src/drive/identity/mod.rs +++ b/packages/rs-drive/src/drive/identity/mod.rs @@ -38,7 +38,9 @@ use crate::drive::object_size_info::DriveKeyInfo; use crate::drive::RootTree; #[cfg(any(feature = "full", feature = "verify"))] -use dpp::identity::{KeyID, Purpose, SecurityLevel}; +use dpp::identity::Purpose; +#[cfg(feature = "full")] +use dpp::identity::{KeyID, SecurityLevel}; #[cfg(feature = "full")] /// Everything related to withdrawals @@ -303,16 +305,27 @@ pub(crate) fn identity_query_keys_security_level_tree_path_vec( /// identity query keys full tree path #[cfg(feature = "full")] /// Identity query keys full tree path -pub(crate) fn identity_query_keys_full_tree_path<'a>( +pub(crate) fn identity_query_keys_for_transfer_full_tree_path(identity_id: &[u8]) -> [&[u8]; 4] { + [ + Into::<&[u8; 1]>::into(RootTree::Identities), + identity_id, + Into::<&[u8; 1]>::into(IdentityRootStructure::IdentityTreeKeyReferences), + Into::<&[u8; 1]>::into(Purpose::TRANSFER), + ] +} + +/// identity query keys full tree path +#[cfg(feature = "full")] +/// Identity query keys full tree path +pub(crate) fn identity_query_keys_for_authentication_full_tree_path<'a>( identity_id: &'a [u8], - purpose: &'a [u8], security_level: &'a [u8], ) -> [&'a [u8]; 5] { [ Into::<&[u8; 1]>::into(RootTree::Identities), identity_id, Into::<&[u8; 1]>::into(IdentityRootStructure::IdentityTreeKeyReferences), - purpose, + Into::<&[u8; 1]>::into(Purpose::AUTHENTICATION), security_level, ] } diff --git a/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/transformer.rs b/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/transformer.rs index ec98eb4d65..e5c8c19074 100644 --- a/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/transformer.rs @@ -1,7 +1,6 @@ use dpp::platform_value::Identifier; use dpp::prelude::UserFeeIncrease; -use dpp::ProtocolError; use dpp::state_transition::data_contract_update_transition::DataContractUpdateTransition; use dpp::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; use crate::state_transition_action::contract::data_contract_update::DataContractUpdateTransitionAction; @@ -14,16 +13,16 @@ impl BumpIdentityDataContractNonceAction { value: DocumentBaseTransition, identity_id: Identifier, user_fee_increase: UserFeeIncrease, - ) -> Result { + ) -> Self { match value { - DocumentBaseTransition::V0(v0) => Ok( - BumpIdentityDataContractNonceActionV0::try_from_base_transition( + DocumentBaseTransition::V0(v0) => { + BumpIdentityDataContractNonceActionV0::from_base_transition( v0, identity_id, user_fee_increase, - )? - .into(), - ), + ) + .into() + } } } @@ -32,16 +31,16 @@ impl BumpIdentityDataContractNonceAction { value: &DocumentBaseTransition, identity_id: Identifier, user_fee_increase: UserFeeIncrease, - ) -> Result { + ) -> Self { match value { - DocumentBaseTransition::V0(v0) => Ok( - BumpIdentityDataContractNonceActionV0::try_from_borrowed_base_transition( + DocumentBaseTransition::V0(v0) => { + BumpIdentityDataContractNonceActionV0::from_borrowed_base_transition( v0, identity_id, user_fee_increase, - )? - .into(), - ), + ) + .into() + } } } @@ -50,83 +49,77 @@ impl BumpIdentityDataContractNonceAction { value: DocumentBaseTransitionAction, identity_id: Identifier, user_fee_increase: UserFeeIncrease, - ) -> Result { + ) -> Self { match value { - DocumentBaseTransitionAction::V0(v0) => Ok( - BumpIdentityDataContractNonceActionV0::try_from_base_transition_action( + DocumentBaseTransitionAction::V0(v0) => { + BumpIdentityDataContractNonceActionV0::from_base_transition_action( v0, identity_id, user_fee_increase, - )? - .into(), - ), + ) + .into() + } } } /// from borrowed base transition - pub fn from_document_borrowed_base_transition_action( + pub fn from_borrowed_document_base_transition_action( value: &DocumentBaseTransitionAction, identity_id: Identifier, user_fee_increase: UserFeeIncrease, - ) -> Result { + ) -> Self { match value { - DocumentBaseTransitionAction::V0(v0) => Ok( - BumpIdentityDataContractNonceActionV0::try_from_borrowed_base_transition_action( + DocumentBaseTransitionAction::V0(v0) => { + BumpIdentityDataContractNonceActionV0::from_borrowed_base_transition_action( v0, identity_id, user_fee_increase, - )? - .into(), - ), + ) + .into() + } } } /// from data contract update - pub fn from_data_contract_update_transition( - value: DataContractUpdateTransition, - ) -> Result { + pub fn from_data_contract_update_transition(value: DataContractUpdateTransition) -> Self { match value { - DataContractUpdateTransition::V0(v0) => Ok( - BumpIdentityDataContractNonceActionV0::try_from_data_contract_update(v0)?.into(), - ), + DataContractUpdateTransition::V0(v0) => { + BumpIdentityDataContractNonceActionV0::from_data_contract_update(v0).into() + } } } /// from borrowed data contract update pub fn from_borrowed_data_contract_update_transition( value: &DataContractUpdateTransition, - ) -> Result { + ) -> Self { match value { - DataContractUpdateTransition::V0(v0) => Ok( - BumpIdentityDataContractNonceActionV0::try_from_borrowed_data_contract_update(v0)? - .into(), - ), + DataContractUpdateTransition::V0(v0) => { + BumpIdentityDataContractNonceActionV0::from_borrowed_data_contract_update(v0).into() + } } } /// from data contract update action pub fn from_data_contract_update_transition_action( value: DataContractUpdateTransitionAction, - ) -> Result { + ) -> Self { match value { - DataContractUpdateTransitionAction::V0(v0) => Ok( - BumpIdentityDataContractNonceActionV0::try_from_data_contract_update_action(v0)? - .into(), - ), + DataContractUpdateTransitionAction::V0(v0) => { + BumpIdentityDataContractNonceActionV0::from_data_contract_update_action(v0).into() + } } } /// from borrowed data contract update action pub fn from_borrowed_data_contract_update_transition_action( value: &DataContractUpdateTransitionAction, - ) -> Result { + ) -> Self { match value { - DataContractUpdateTransitionAction::V0(v0) => Ok( - BumpIdentityDataContractNonceActionV0::try_from_borrowed_data_contract_update_action( - v0, - )? - .into(), - ), + DataContractUpdateTransitionAction::V0(v0) => { + BumpIdentityDataContractNonceActionV0::from_borrowed_data_contract_update_action(v0) + .into() + } } } } diff --git a/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/v0/transformer.rs index 6a338e35c4..42a9912790 100644 --- a/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/v0/transformer.rs @@ -2,7 +2,6 @@ use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::platform_value::Identifier; use dpp::prelude::UserFeeIncrease; -use dpp::ProtocolError; use dpp::state_transition::data_contract_update_transition::DataContractUpdateTransitionV0; use dpp::state_transition::documents_batch_transition::document_base_transition::v0::DocumentBaseTransitionV0; use crate::state_transition_action::contract::data_contract_update::v0::DataContractUpdateTransitionActionV0; @@ -10,151 +9,145 @@ use crate::state_transition_action::document::documents_batch::document_transiti use crate::state_transition_action::system::bump_identity_data_contract_nonce_action::BumpIdentityDataContractNonceActionV0; impl BumpIdentityDataContractNonceActionV0 { - /// try from base transition - pub fn try_from_base_transition( + /// from base transition + pub fn from_base_transition( value: DocumentBaseTransitionV0, identity_id: Identifier, user_fee_increase: UserFeeIncrease, - ) -> Result { + ) -> Self { let DocumentBaseTransitionV0 { data_contract_id, identity_contract_nonce, .. } = value; - Ok(BumpIdentityDataContractNonceActionV0 { + BumpIdentityDataContractNonceActionV0 { identity_id, data_contract_id, identity_contract_nonce, user_fee_increase, - }) + } } - /// try from borrowed base transition - pub fn try_from_borrowed_base_transition( + /// from borrowed base transition + pub fn from_borrowed_base_transition( value: &DocumentBaseTransitionV0, identity_id: Identifier, user_fee_increase: UserFeeIncrease, - ) -> Result { + ) -> Self { let DocumentBaseTransitionV0 { data_contract_id, identity_contract_nonce, .. } = value; - Ok(BumpIdentityDataContractNonceActionV0 { + BumpIdentityDataContractNonceActionV0 { identity_id, data_contract_id: *data_contract_id, identity_contract_nonce: *identity_contract_nonce, user_fee_increase, - }) + } } - /// try from base transition - pub fn try_from_base_transition_action( + /// from base transition + pub fn from_base_transition_action( value: DocumentBaseTransitionActionV0, identity_id: Identifier, user_fee_increase: UserFeeIncrease, - ) -> Result { + ) -> Self { let DocumentBaseTransitionActionV0 { data_contract, identity_contract_nonce, .. } = value; - Ok(BumpIdentityDataContractNonceActionV0 { + BumpIdentityDataContractNonceActionV0 { identity_id, data_contract_id: data_contract.contract.id(), identity_contract_nonce, user_fee_increase, - }) + } } - /// try from borrowed base transition - pub fn try_from_borrowed_base_transition_action( + /// from borrowed base transition + pub fn from_borrowed_base_transition_action( value: &DocumentBaseTransitionActionV0, identity_id: Identifier, user_fee_increase: UserFeeIncrease, - ) -> Result { + ) -> Self { let DocumentBaseTransitionActionV0 { data_contract, identity_contract_nonce, .. } = value; - Ok(BumpIdentityDataContractNonceActionV0 { + BumpIdentityDataContractNonceActionV0 { identity_id, data_contract_id: data_contract.contract.id(), identity_contract_nonce: *identity_contract_nonce, user_fee_increase, - }) + } } - /// try from data contract update - pub fn try_from_data_contract_update( - value: DataContractUpdateTransitionV0, - ) -> Result { + /// from data contract update + pub fn from_data_contract_update(value: DataContractUpdateTransitionV0) -> Self { let DataContractUpdateTransitionV0 { data_contract, identity_contract_nonce, user_fee_increase, .. } = value; - Ok(BumpIdentityDataContractNonceActionV0 { + BumpIdentityDataContractNonceActionV0 { identity_id: data_contract.owner_id(), data_contract_id: data_contract.id(), identity_contract_nonce, user_fee_increase, - }) + } } - /// try from borrowed data contract update - pub fn try_from_borrowed_data_contract_update( - value: &DataContractUpdateTransitionV0, - ) -> Result { + /// from borrowed data contract update + pub fn from_borrowed_data_contract_update(value: &DataContractUpdateTransitionV0) -> Self { let DataContractUpdateTransitionV0 { data_contract, identity_contract_nonce, user_fee_increase, .. } = value; - Ok(BumpIdentityDataContractNonceActionV0 { + BumpIdentityDataContractNonceActionV0 { identity_id: data_contract.owner_id(), data_contract_id: data_contract.id(), identity_contract_nonce: *identity_contract_nonce, user_fee_increase: *user_fee_increase, - }) + } } - /// try from data contract update action - pub fn try_from_data_contract_update_action( - value: DataContractUpdateTransitionActionV0, - ) -> Result { + /// from data contract update action + pub fn from_data_contract_update_action(value: DataContractUpdateTransitionActionV0) -> Self { let DataContractUpdateTransitionActionV0 { data_contract, identity_contract_nonce, user_fee_increase, .. } = value; - Ok(BumpIdentityDataContractNonceActionV0 { + BumpIdentityDataContractNonceActionV0 { identity_id: data_contract.owner_id(), data_contract_id: data_contract.id(), identity_contract_nonce, user_fee_increase, - }) + } } - /// try from borrowed data contract update action - pub fn try_from_borrowed_data_contract_update_action( + /// from borrowed data contract update action + pub fn from_borrowed_data_contract_update_action( value: &DataContractUpdateTransitionActionV0, - ) -> Result { + ) -> Self { let DataContractUpdateTransitionActionV0 { data_contract, identity_contract_nonce, user_fee_increase, .. } = value; - Ok(BumpIdentityDataContractNonceActionV0 { + BumpIdentityDataContractNonceActionV0 { identity_id: data_contract.owner_id(), data_contract_id: data_contract.id(), identity_contract_nonce: *identity_contract_nonce, user_fee_increase: *user_fee_increase, - }) + } } } diff --git a/packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/transformer.rs b/packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/transformer.rs index ec75a3ffed..674fb61d3b 100644 --- a/packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/transformer.rs @@ -9,38 +9,31 @@ use dpp::state_transition::data_contract_create_transition::DataContractCreateTr use dpp::state_transition::identity_credit_transfer_transition::IdentityCreditTransferTransition; use dpp::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition; use dpp::state_transition::identity_update_transition::IdentityUpdateTransition; -use dpp::ProtocolError; impl BumpIdentityNonceAction { /// from identity update - pub fn from_identity_update_transition( - value: IdentityUpdateTransition, - ) -> Result { + pub fn from_identity_update_transition(value: IdentityUpdateTransition) -> Self { match value { IdentityUpdateTransition::V0(v0) => { - Ok(BumpIdentityNonceActionV0::try_from_identity_update(v0)?.into()) + BumpIdentityNonceActionV0::from_identity_update(v0).into() } } } /// from borrowed identity update - pub fn from_borrowed_identity_update_transition( - value: &IdentityUpdateTransition, - ) -> Result { + pub fn from_borrowed_identity_update_transition(value: &IdentityUpdateTransition) -> Self { match value { IdentityUpdateTransition::V0(v0) => { - Ok(BumpIdentityNonceActionV0::try_from_borrowed_identity_update(v0)?.into()) + BumpIdentityNonceActionV0::from_borrowed_identity_update(v0).into() } } } /// from identity update action - pub fn from_identity_update_transition_action( - value: IdentityUpdateTransitionAction, - ) -> Result { + pub fn from_identity_update_transition_action(value: IdentityUpdateTransitionAction) -> Self { match value { IdentityUpdateTransitionAction::V0(v0) => { - Ok(BumpIdentityNonceActionV0::try_from_identity_update_action(v0)?.into()) + BumpIdentityNonceActionV0::from_identity_update_action(v0).into() } } } @@ -48,21 +41,19 @@ impl BumpIdentityNonceAction { /// from borrowed identity update action pub fn from_borrowed_identity_update_transition_action( value: &IdentityUpdateTransitionAction, - ) -> Result { + ) -> Self { match value { IdentityUpdateTransitionAction::V0(v0) => { - Ok(BumpIdentityNonceActionV0::try_from_borrowed_identity_update_action(v0)?.into()) + BumpIdentityNonceActionV0::from_borrowed_identity_update_action(v0).into() } } } /// from data contract create transition - pub fn from_data_contract_create_transition( - value: DataContractCreateTransition, - ) -> Result { + pub fn from_data_contract_create_transition(value: DataContractCreateTransition) -> Self { match value { DataContractCreateTransition::V0(v0) => { - Ok(BumpIdentityNonceActionV0::try_from_contract_create(v0)?.into()) + BumpIdentityNonceActionV0::from_contract_create(v0).into() } } } @@ -70,21 +61,19 @@ impl BumpIdentityNonceAction { /// from borrowed data contract create transition pub fn from_borrowed_data_contract_create_transition( value: &DataContractCreateTransition, - ) -> Result { + ) -> Self { match value { DataContractCreateTransition::V0(v0) => { - Ok(BumpIdentityNonceActionV0::try_from_borrowed_contract_create(v0)?.into()) + BumpIdentityNonceActionV0::from_borrowed_contract_create(v0).into() } } } /// from data contract create transition action - pub fn from_data_contract_create_action( - value: DataContractCreateTransitionAction, - ) -> Result { + pub fn from_data_contract_create_action(value: DataContractCreateTransitionAction) -> Self { match value { DataContractCreateTransitionAction::V0(v0) => { - Ok(BumpIdentityNonceActionV0::try_from_contract_create_action(v0)?.into()) + BumpIdentityNonceActionV0::from_contract_create_action(v0).into() } } } @@ -92,10 +81,10 @@ impl BumpIdentityNonceAction { /// from borrowed data contract create transition action pub fn from_borrowed_data_contract_create_action( value: &DataContractCreateTransitionAction, - ) -> Result { + ) -> Self { match value { DataContractCreateTransitionAction::V0(v0) => { - Ok(BumpIdentityNonceActionV0::try_from_borrowed_contract_create_action(v0)?.into()) + BumpIdentityNonceActionV0::from_borrowed_contract_create_action(v0).into() } } } @@ -103,10 +92,10 @@ impl BumpIdentityNonceAction { /// from identity transfer pub fn from_identity_credit_transfer_transition( value: IdentityCreditTransferTransition, - ) -> Result { + ) -> Self { match value { IdentityCreditTransferTransition::V0(v0) => { - Ok(BumpIdentityNonceActionV0::try_from_identity_credit_transfer(v0)?.into()) + BumpIdentityNonceActionV0::from_identity_credit_transfer(v0).into() } } } @@ -114,21 +103,21 @@ impl BumpIdentityNonceAction { /// from borrowed identity transfer pub fn from_borrowed_identity_credit_transfer_transition( value: &IdentityCreditTransferTransition, - ) -> Result { + ) -> Self { match value { - IdentityCreditTransferTransition::V0(v0) => Ok( - BumpIdentityNonceActionV0::try_from_borrowed_identity_credit_transfer(v0)?.into(), - ), + IdentityCreditTransferTransition::V0(v0) => { + BumpIdentityNonceActionV0::from_borrowed_identity_credit_transfer(v0).into() + } } } /// from identity transfer action pub fn from_identity_credit_transfer_transition_action( value: IdentityCreditTransferTransitionAction, - ) -> Result { + ) -> Self { match value { IdentityCreditTransferTransitionAction::V0(v0) => { - Ok(BumpIdentityNonceActionV0::try_from_identity_credit_transfer_action(v0)?.into()) + BumpIdentityNonceActionV0::from_identity_credit_transfer_action(v0).into() } } } @@ -136,22 +125,21 @@ impl BumpIdentityNonceAction { /// from borrowed identity transfer action pub fn from_borrowed_identity_credit_transfer_transition_action( value: &IdentityCreditTransferTransitionAction, - ) -> Result { + ) -> Self { match value { - IdentityCreditTransferTransitionAction::V0(v0) => Ok( - BumpIdentityNonceActionV0::try_from_borrowed_identity_credit_transfer_action(v0)? - .into(), - ), + IdentityCreditTransferTransitionAction::V0(v0) => { + BumpIdentityNonceActionV0::from_borrowed_identity_credit_transfer_action(v0).into() + } } } /// from identity withdrawal pub fn from_identity_credit_withdrawal_transition( value: IdentityCreditWithdrawalTransition, - ) -> Result { + ) -> Self { match value { IdentityCreditWithdrawalTransition::V0(v0) => { - Ok(BumpIdentityNonceActionV0::try_from_identity_credit_withdrawal(v0)?.into()) + BumpIdentityNonceActionV0::from_identity_credit_withdrawal(v0).into() } } } @@ -159,34 +147,34 @@ impl BumpIdentityNonceAction { /// from borrowed identity withdrawal pub fn from_borrowed_identity_credit_withdrawal_transition( value: &IdentityCreditWithdrawalTransition, - ) -> Result { + ) -> Self { match value { - IdentityCreditWithdrawalTransition::V0(v0) => Ok( - BumpIdentityNonceActionV0::try_from_borrowed_identity_credit_withdrawal(v0)?.into(), - ), + IdentityCreditWithdrawalTransition::V0(v0) => { + BumpIdentityNonceActionV0::from_borrowed_identity_credit_withdrawal(v0).into() + } } } /// from identity withdrawal action pub fn from_identity_credit_withdrawal_transition_action( value: IdentityCreditWithdrawalTransitionAction, - ) -> Result { + ) -> Self { match value { - IdentityCreditWithdrawalTransitionAction::V0(v0) => Ok( - BumpIdentityNonceActionV0::try_from_identity_credit_withdrawal_action(v0)?.into(), - ), + IdentityCreditWithdrawalTransitionAction::V0(v0) => { + BumpIdentityNonceActionV0::from_identity_credit_withdrawal_action(v0).into() + } } } /// from borrowed identity withdrawal action pub fn from_borrowed_identity_credit_withdrawal_transition_action( value: &IdentityCreditWithdrawalTransitionAction, - ) -> Result { + ) -> Self { match value { - IdentityCreditWithdrawalTransitionAction::V0(v0) => Ok( - BumpIdentityNonceActionV0::try_from_borrowed_identity_credit_withdrawal_action(v0)? - .into(), - ), + IdentityCreditWithdrawalTransitionAction::V0(v0) => { + BumpIdentityNonceActionV0::from_borrowed_identity_credit_withdrawal_action(v0) + .into() + } } } } diff --git a/packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/v0/transformer.rs index 5c626a336f..99cb834032 100644 --- a/packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/system/bump_identity_nonce_action/v0/transformer.rs @@ -8,278 +8,259 @@ use dpp::state_transition::data_contract_create_transition::DataContractCreateTr use dpp::state_transition::identity_credit_transfer_transition::v0::IdentityCreditTransferTransitionV0; use dpp::state_transition::identity_credit_withdrawal_transition::v0::IdentityCreditWithdrawalTransitionV0; use dpp::state_transition::identity_update_transition::v0::IdentityUpdateTransitionV0; -use dpp::ProtocolError; impl BumpIdentityNonceActionV0 { - /// try from identity update - pub fn try_from_identity_update( - value: IdentityUpdateTransitionV0, - ) -> Result { + /// from identity update + pub fn from_identity_update(value: IdentityUpdateTransitionV0) -> Self { let IdentityUpdateTransitionV0 { identity_id, nonce, user_fee_increase, .. } = value; - Ok(BumpIdentityNonceActionV0 { + BumpIdentityNonceActionV0 { identity_id, identity_nonce: nonce, user_fee_increase, - }) + } } - /// try from borrowed identity update - pub fn try_from_borrowed_identity_update( - value: &IdentityUpdateTransitionV0, - ) -> Result { + /// from borrowed identity update + pub fn from_borrowed_identity_update(value: &IdentityUpdateTransitionV0) -> Self { let IdentityUpdateTransitionV0 { identity_id, nonce, user_fee_increase, .. } = value; - Ok(BumpIdentityNonceActionV0 { + BumpIdentityNonceActionV0 { identity_id: *identity_id, identity_nonce: *nonce, user_fee_increase: *user_fee_increase, - }) + } } - /// try from identity update action - pub fn try_from_identity_update_action( - value: IdentityUpdateTransitionActionV0, - ) -> Result { + /// from identity update action + pub fn from_identity_update_action(value: IdentityUpdateTransitionActionV0) -> Self { let IdentityUpdateTransitionActionV0 { identity_id, nonce, user_fee_increase, .. } = value; - Ok(BumpIdentityNonceActionV0 { + BumpIdentityNonceActionV0 { identity_id, identity_nonce: nonce, user_fee_increase, - }) + } } - /// try from borrowed identity update action - pub fn try_from_borrowed_identity_update_action( - value: &IdentityUpdateTransitionActionV0, - ) -> Result { + /// from borrowed identity update action + pub fn from_borrowed_identity_update_action(value: &IdentityUpdateTransitionActionV0) -> Self { let IdentityUpdateTransitionActionV0 { identity_id, nonce, user_fee_increase, .. } = value; - Ok(BumpIdentityNonceActionV0 { + BumpIdentityNonceActionV0 { identity_id: *identity_id, identity_nonce: *nonce, user_fee_increase: *user_fee_increase, - }) + } } - /// try from contract create - pub fn try_from_contract_create( - value: DataContractCreateTransitionV0, - ) -> Result { + /// from contract create + pub fn from_contract_create(value: DataContractCreateTransitionV0) -> Self { let DataContractCreateTransitionV0 { data_contract, identity_nonce, user_fee_increase, .. } = value; - Ok(BumpIdentityNonceActionV0 { + BumpIdentityNonceActionV0 { identity_id: data_contract.owner_id(), identity_nonce, user_fee_increase, - }) + } } - /// try from contract create - pub fn try_from_borrowed_contract_create( - value: &DataContractCreateTransitionV0, - ) -> Result { + /// from borrowed contract create + pub fn from_borrowed_contract_create(value: &DataContractCreateTransitionV0) -> Self { let DataContractCreateTransitionV0 { data_contract, identity_nonce, user_fee_increase, .. } = value; - Ok(BumpIdentityNonceActionV0 { + BumpIdentityNonceActionV0 { identity_id: data_contract.owner_id(), identity_nonce: *identity_nonce, user_fee_increase: *user_fee_increase, - }) + } } - /// try from contract create action - pub fn try_from_contract_create_action( - value: DataContractCreateTransitionActionV0, - ) -> Result { + /// from contract create action + pub fn from_contract_create_action(value: DataContractCreateTransitionActionV0) -> Self { let DataContractCreateTransitionActionV0 { data_contract, identity_nonce, user_fee_increase, .. } = value; - Ok(BumpIdentityNonceActionV0 { + BumpIdentityNonceActionV0 { identity_id: data_contract.owner_id(), identity_nonce, user_fee_increase, - }) + } } - /// try from contract create - pub fn try_from_borrowed_contract_create_action( + /// from contract create action + pub fn from_borrowed_contract_create_action( value: &DataContractCreateTransitionActionV0, - ) -> Result { + ) -> Self { let DataContractCreateTransitionActionV0 { data_contract, identity_nonce, user_fee_increase, .. } = value; - Ok(BumpIdentityNonceActionV0 { + BumpIdentityNonceActionV0 { identity_id: data_contract.owner_id(), identity_nonce: *identity_nonce, user_fee_increase: *user_fee_increase, - }) + } } - /// try from identity credit transfer - pub fn try_from_identity_credit_transfer( - value: IdentityCreditTransferTransitionV0, - ) -> Result { + /// from identity credit transfer + pub fn from_identity_credit_transfer(value: IdentityCreditTransferTransitionV0) -> Self { let IdentityCreditTransferTransitionV0 { identity_id, nonce, user_fee_increase, .. } = value; - Ok(BumpIdentityNonceActionV0 { + BumpIdentityNonceActionV0 { identity_id, identity_nonce: nonce, user_fee_increase, - }) + } } - /// try from borrowed identity credit transfer - pub fn try_from_borrowed_identity_credit_transfer( + /// from borrowed identity credit transfer + pub fn from_borrowed_identity_credit_transfer( value: &IdentityCreditTransferTransitionV0, - ) -> Result { + ) -> Self { let IdentityCreditTransferTransitionV0 { identity_id, nonce, user_fee_increase, .. } = value; - Ok(BumpIdentityNonceActionV0 { + BumpIdentityNonceActionV0 { identity_id: *identity_id, identity_nonce: *nonce, user_fee_increase: *user_fee_increase, - }) + } } - /// try from identity credit transfer action - pub fn try_from_identity_credit_transfer_action( + /// from identity credit transfer action + pub fn from_identity_credit_transfer_action( value: IdentityCreditTransferTransitionActionV0, - ) -> Result { + ) -> Self { let IdentityCreditTransferTransitionActionV0 { identity_id, nonce, user_fee_increase, .. } = value; - Ok(BumpIdentityNonceActionV0 { + BumpIdentityNonceActionV0 { identity_id, identity_nonce: nonce, user_fee_increase, - }) + } } - /// try from borrowed identity credit transfer action - pub fn try_from_borrowed_identity_credit_transfer_action( + /// from borrowed identity credit transfer action + pub fn from_borrowed_identity_credit_transfer_action( value: &IdentityCreditTransferTransitionActionV0, - ) -> Result { + ) -> Self { let IdentityCreditTransferTransitionActionV0 { identity_id, nonce, user_fee_increase, .. } = value; - Ok(BumpIdentityNonceActionV0 { + BumpIdentityNonceActionV0 { identity_id: *identity_id, identity_nonce: *nonce, user_fee_increase: *user_fee_increase, - }) + } } - /// try from identity credit withdrawal - pub fn try_from_identity_credit_withdrawal( - value: IdentityCreditWithdrawalTransitionV0, - ) -> Result { + /// from identity credit withdrawal + pub fn from_identity_credit_withdrawal(value: IdentityCreditWithdrawalTransitionV0) -> Self { let IdentityCreditWithdrawalTransitionV0 { identity_id, nonce, user_fee_increase, .. } = value; - Ok(BumpIdentityNonceActionV0 { + BumpIdentityNonceActionV0 { identity_id, identity_nonce: nonce, user_fee_increase, - }) + } } - /// try from borrowed identity credit withdrawal - pub fn try_from_borrowed_identity_credit_withdrawal( + /// from borrowed identity credit withdrawal + pub fn from_borrowed_identity_credit_withdrawal( value: &IdentityCreditWithdrawalTransitionV0, - ) -> Result { + ) -> Self { let IdentityCreditWithdrawalTransitionV0 { identity_id, nonce, user_fee_increase, .. } = value; - Ok(BumpIdentityNonceActionV0 { + BumpIdentityNonceActionV0 { identity_id: *identity_id, identity_nonce: *nonce, user_fee_increase: *user_fee_increase, - }) + } } - /// try from identity credit withdrawal action - pub fn try_from_identity_credit_withdrawal_action( + /// from identity credit withdrawal action + pub fn from_identity_credit_withdrawal_action( value: IdentityCreditWithdrawalTransitionActionV0, - ) -> Result { + ) -> Self { let IdentityCreditWithdrawalTransitionActionV0 { identity_id, nonce, user_fee_increase, .. } = value; - Ok(BumpIdentityNonceActionV0 { + BumpIdentityNonceActionV0 { identity_id, identity_nonce: nonce, user_fee_increase, - }) + } } - /// try from borrowed identity credit withdrawal action - pub fn try_from_borrowed_identity_credit_withdrawal_action( + /// from borrowed identity credit withdrawal action + pub fn from_borrowed_identity_credit_withdrawal_action( value: &IdentityCreditWithdrawalTransitionActionV0, - ) -> Result { + ) -> Self { let IdentityCreditWithdrawalTransitionActionV0 { identity_id, nonce, user_fee_increase, .. } = value; - Ok(BumpIdentityNonceActionV0 { + BumpIdentityNonceActionV0 { identity_id: *identity_id, identity_nonce: *nonce, user_fee_increase: *user_fee_increase, - }) + } } } diff --git a/packages/rs-platform-value/src/converter/ciborium.rs b/packages/rs-platform-value/src/converter/ciborium.rs index 8703fed88b..d6f0b8247b 100644 --- a/packages/rs-platform-value/src/converter/ciborium.rs +++ b/packages/rs-platform-value/src/converter/ciborium.rs @@ -129,8 +129,16 @@ impl TryInto for Value { ) } Value::Identifier(bytes) => CborValue::Bytes(bytes.to_vec()), - Value::EnumU8(_) => todo!(), - Value::EnumString(_) => todo!(), + Value::EnumU8(_) => { + return Err(Error::Unsupported( + "No support for conversion of EnumU8 to JSONValue".to_string(), + )) + } + Value::EnumString(_) => { + return Err(Error::Unsupported( + "No support for conversion of EnumString to JSONValue".to_string(), + )) + } }) } } diff --git a/packages/rs-platform-value/src/converter/serde_json.rs b/packages/rs-platform-value/src/converter/serde_json.rs index 6cddde462c..f4be4635ab 100644 --- a/packages/rs-platform-value/src/converter/serde_json.rs +++ b/packages/rs-platform-value/src/converter/serde_json.rs @@ -90,8 +90,16 @@ impl Value { .map(|byte| JsonValue::Number(byte.into())) .collect(), ), - Value::EnumU8(_) => todo!(), - Value::EnumString(_) => todo!(), + Value::EnumU8(_) => { + return Err(Error::Unsupported( + "No support for conversion of EnumU8 to JSONValue".to_string(), + )) + } + Value::EnumString(_) => { + return Err(Error::Unsupported( + "No support for conversion of EnumString to JSONValue".to_string(), + )) + } }) } @@ -178,8 +186,16 @@ impl Value { .map(|byte| JsonValue::Number((*byte).into())) .collect(), ), - Value::EnumU8(_) => todo!(), - Value::EnumString(_) => todo!(), + Value::EnumU8(_) => { + return Err(Error::Unsupported( + "No support for conversion of EnumU8 to JSONValue".to_string(), + )) + } + Value::EnumString(_) => { + return Err(Error::Unsupported( + "No support for conversion of EnumString to JSONValue".to_string(), + )) + } }) } } diff --git a/packages/rs-platform-value/src/display.rs b/packages/rs-platform-value/src/display.rs index 273029f7fc..973fcf0a4c 100644 --- a/packages/rs-platform-value/src/display.rs +++ b/packages/rs-platform-value/src/display.rs @@ -52,8 +52,8 @@ impl Value { "identifier {}", bs58::encode(identifier.as_slice()).into_string() ), - Value::EnumU8(_) => todo!(), - Value::EnumString(_) => todo!(), + Value::EnumU8(_) => "enum u8".to_string(), + Value::EnumString(_) => "enum string".to_string(), } } @@ -109,8 +109,8 @@ impl Value { "identifier {}", bs58::encode(identifier.as_slice()).into_string() ), - Value::EnumU8(_) => todo!(), - Value::EnumString(_) => todo!(), + Value::EnumU8(_) => "enum u8".to_string(), + Value::EnumString(_) => "enum string".to_string(), } } } diff --git a/packages/rs-platform-version/src/version/drive_abci_versions.rs b/packages/rs-platform-version/src/version/drive_abci_versions.rs index 902094ddec..0ab6c90c52 100644 --- a/packages/rs-platform-version/src/version/drive_abci_versions.rs +++ b/packages/rs-platform-version/src/version/drive_abci_versions.rs @@ -151,6 +151,7 @@ pub struct DriveAbciStateTransitionCommonValidationVersions { pub validate_identity_public_key_ids_exist_in_state: FeatureVersion, pub validate_state_transition_identity_signed: FeatureVersion, pub validate_unique_identity_public_key_hashes_in_state: FeatureVersion, + pub validate_master_key_uniqueness: FeatureVersion, } #[derive(Clone, Copy, Debug, Default)] diff --git a/packages/rs-platform-version/src/version/mocks/v2_test.rs b/packages/rs-platform-version/src/version/mocks/v2_test.rs index bb37dfb50b..165d6c4977 100644 --- a/packages/rs-platform-version/src/version/mocks/v2_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v2_test.rs @@ -594,6 +594,7 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { validate_identity_public_key_ids_exist_in_state: 0, validate_state_transition_identity_signed: 0, validate_unique_identity_public_key_hashes_in_state: 0, + validate_master_key_uniqueness: 0, }, identity_create_state_transition: DriveAbciStateTransitionValidationVersion { basic_structure: Some(0), @@ -606,7 +607,7 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { }, identity_update_state_transition: DriveAbciStateTransitionValidationVersion { basic_structure: Some(0), - advanced_structure: None, + advanced_structure: Some(0), identity_signatures: Some(0), balance: None, nonce: Some(0), @@ -644,7 +645,7 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { }, contract_create_state_transition: DriveAbciStateTransitionValidationVersion { basic_structure: Some(0), - advanced_structure: Some(0), + advanced_structure: None, identity_signatures: None, balance: None, nonce: Some(0), @@ -653,7 +654,7 @@ pub(crate) const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { }, contract_update_state_transition: DriveAbciStateTransitionValidationVersion { basic_structure: None, - advanced_structure: Some(0), + advanced_structure: None, identity_signatures: None, balance: None, nonce: Some(0), diff --git a/packages/rs-platform-version/src/version/mocks/v3_test.rs b/packages/rs-platform-version/src/version/mocks/v3_test.rs index 9974e6b528..c2804c84eb 100644 --- a/packages/rs-platform-version/src/version/mocks/v3_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v3_test.rs @@ -594,6 +594,7 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { validate_identity_public_key_ids_exist_in_state: 0, validate_state_transition_identity_signed: 0, validate_unique_identity_public_key_hashes_in_state: 0, + validate_master_key_uniqueness: 0, }, identity_create_state_transition: DriveAbciStateTransitionValidationVersion { basic_structure: Some(0), @@ -606,7 +607,7 @@ pub(crate) const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { }, identity_update_state_transition: DriveAbciStateTransitionValidationVersion { basic_structure: Some(0), - advanced_structure: None, + advanced_structure: Some(0), identity_signatures: Some(0), balance: None, nonce: Some(0), diff --git a/packages/rs-platform-version/src/version/v1.rs b/packages/rs-platform-version/src/version/v1.rs index c4d6d59a0c..07a10eb62b 100644 --- a/packages/rs-platform-version/src/version/v1.rs +++ b/packages/rs-platform-version/src/version/v1.rs @@ -591,6 +591,7 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { validate_identity_public_key_ids_exist_in_state: 0, validate_state_transition_identity_signed: 0, validate_unique_identity_public_key_hashes_in_state: 0, + validate_master_key_uniqueness: 0, }, identity_create_state_transition: DriveAbciStateTransitionValidationVersion { basic_structure: Some(0), @@ -603,7 +604,7 @@ pub(super) const PLATFORM_V1: PlatformVersion = PlatformVersion { }, identity_update_state_transition: DriveAbciStateTransitionValidationVersion { basic_structure: Some(0), - advanced_structure: None, + advanced_structure: Some(0), identity_signatures: Some(0), balance: None, nonce: Some(0), diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.629451923Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.629451923Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json new file mode 100644 index 0000000000000000000000000000000000000000..3d60f5d3616acc3492c9a7b212bc8dc0d34f8727 GIT binary patch literal 21981 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 I|M33*0pP_86#xJL literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.630642159Z_GetDataContractRequest_1d1e53ab5e04d9ec5dce4ff9ac048c03122daf7ab2e77108f4bf44af1ad15eae.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.630642159Z_GetDataContractRequest_1d1e53ab5e04d9ec5dce4ff9ac048c03122daf7ab2e77108f4bf44af1ad15eae.json new file mode 100644 index 0000000000000000000000000000000000000000..e3220975144d71a356f77f82f1a33f9b2adf2b3c GIT binary patch literal 8862 zcmeI2%WmUF5Jj{0R~TGp!CQRiSAu}hNQ@=KG95hz2nPQ5ux-g!pKD__S!NatUz16S(|N7tS;iA(&uF5T* z5A*kFQT*v}o?c(REI(iFUhaOmOIG@s(e~46wOO53H-=mmZKvJC_Oy%@y^8Bm%lLXe zOyhdH+C7br^ZKu8GrrGM)3!G=r{{UST{b9h#!kEaH13aSTXibCPEA+$Rd&L1ozuLY zAIA@{-2kb0JNp%B#b$Nf?pLQNiL!beqb@GWdAXih9H!&>G2P=0u*n=rVe_Ba&@%Xt zw7B^;USEE|7$!`Q&2|6ukOBSmvAz-bv-eot-KZ!{uZMg>sK!9m=L0=fXuv=ViKFWB z9ioH~YB|th&&7WE9^yqL&gda{hy&FPhLSQ&47^u^tErA$tN|0Efq6Pg8JM8H%D1eb z3ho#b3PQVuIUzp}^0dGMEJYPUAK0wo>(&OaLOl*t$0fp&pvEd(Avi!Q1~jD7cAyY| zR)YmC-irY5iHizIBC^aQ=yo+k2t13ItT_-so(4dZJ{T2Dp^oq0R8a0Nu78Z6*3A~qChfXopXPzmeavRR5mR3zVruz?1ex5tcNq-k+)4KxmKQfdaNmFkFoqZp@E*oC4ueiy9y$Rx zqyiZ7L>;Qdjm(y&q!O1R8qD|MH=b{qP=R}K0$G=?YS*M)=&8X#EMkdaG)yL5)105K zES~{@GCJ_yvY1p70kn=tAYmzs(K$)Tk2Nl?VZl#=Wgc#Mh7$y{RVT81$DZEA>{e7K z8N=8f6eXrwLI1Qo$3Q|M-GFq^{Fc<40!NrgjGAIGLuV1=lx4k34V_D6)@uoFdk`gXAcBTI%TmiQ!%3bwz zIOgdLG{l@W3S`9$l7e|3CZFIRmM}TaN(BZDI=L+Q1hN8Nkt5d z;e{YPg`Q^!qzwmRrAG*1d|zz*C3udzho{x)d`KS&a_GoV%X2LWGPW|t^QgcS7L>Sr z3dmX1k|1LmEWn1QUWRK0b3yE2aml*M)?&9p+=E7G#XQ7dn4#R(+_SDdy8-6e*8P@e ze-IOoM&kZ`f*`SY!;-^NXHWi+%8}OD)uaanYeehOTgu8K8Ysf7Wd$I+2F3ww8i=iZ zx`rq3EIJrU#DO3`1c}}lk{A1Vv%?saD3j@iWhoC0b6Ph5{0U*$dJ(~%uN4TgG?~B> zna@l_@>B_GwC^d*AN}eK+*SctI`710bZd!l9+pGxmmG7L&rj*=f5sohxAcv8+$|r8 zKTBM!jIqy1goJ$zWPk)OSo_M<#G=QLZIQ_`KeodO5GE~V2y!`ZNfcW`!mQdqJkZ%# uRvF)UUSu3>VTAB8STjaPe2J$^!h8DXIb|&>KaiLHx*`30`~UK{4*vqxdEt)$ literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.630652428Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.630652428Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json new file mode 100644 index 0000000000000000000000000000000000000000..9b8dfdcc0bbc085ddde9cf11afe896dd5083b411 GIT binary patch literal 74149 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 I|M33*0pP_86#xJL literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.632256765Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.632256765Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json new file mode 100644 index 0000000000000000000000000000000000000000..9b8dfdcc0bbc085ddde9cf11afe896dd5083b411 GIT binary patch literal 74149 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 I|M33*0pP_86#xJL literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.632500304Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.632500304Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json new file mode 100644 index 0000000000000000000000000000000000000000..3d60f5d3616acc3492c9a7b212bc8dc0d34f8727 GIT binary patch literal 21981 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 I|M33*0pP_86#xJL literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.634383016Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.634383016Z_GetDataContractRequest_e87a2e6acef76975c30eb7272da71733fb6ad13495beb7ca1b6a6c4ceb30e0f7.json new file mode 100644 index 0000000000000000000000000000000000000000..9b8dfdcc0bbc085ddde9cf11afe896dd5083b411 GIT binary patch literal 74149 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 I|M33*0pP_86#xJL literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.637905030Z_GetDataContractRequest_e4cf74168e03a40bd159451456b501c1ba166a2dd8f6efb31b0289dc011da983.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.637905030Z_GetDataContractRequest_e4cf74168e03a40bd159451456b501c1ba166a2dd8f6efb31b0289dc011da983.json new file mode 100644 index 0000000000000000000000000000000000000000..571cb9f6636ffb79dce2356ed5407213e273ff70 GIT binary patch literal 8862 zcmeI2%WmUF5Jj{0R~TGp!CQRiSAu}hNQ@=KG95hz2nPQ5blZ|Go;!v&S!Naau($AN>m%Cr?vX#Cv+I~8%HmlR>#*k^zcG^8`Pid^^Ra}os%XSW_&!rj+uqEap6B&8ZE%Bv;xh^OU)A9V6@9_rMY>uq3`On2r8hprF z+%h9a6s445)M=uEXhEq!l*R0F)-T+dK$5s20d7_Wh% zf&s-@xW*Q?M1u0%*9>(vt{PEfXqmFHRuq(pBx6vGqIF^q=E#A}-K)0O2j z08mB;-dh%vN+N*P5eXzLWidJ@3Hh-lMg4wDQ*>cC8-o)%yR3{n3 z*d7!mrdmP&v^>W^LLuFNbkOB3sW%0VFp(HF#bSoeBE~7pdQ%O(l*+8vB4}8hX3?J3 z3d=fsI~49?)W?EI9V{9IGA(R1RaDS7L1hpy3n?f!q_PR_P2_C)FkuFBS;bo-5w!pr z1gZ@f85$@=@CFIn379@A=AMk1Vo_&lTL%k94SQIKWOOqd6M4orWDjaWhISTZVX@zm z%Zm3PO5i{Q4SklSsO2XzAsITvyr0FWmE2+gBcnCAC3DY#w=}0G*u^EJk|344>gjOI z(-~-pIcpTiv~OawgpzG)$sCmzG*}4gl{H$rOZzfcoA3SI{80RTo)72!xJ?bu)VN&s zCaq9m(kIKwh!tz1k!9#rVRmw}AQ;HnZ0rfi;s;g6Q>}2}mgFfTnP5=!o+U{|42U2Kjj|5BT$WY63EeSHVGRE_$z!Vmgm_7w8 zS=5psV;U^LhNfPIYXx&b>|k-py2{pKw?f>5Mrp-7#9)}A+}7N)u06W}=GoT$mS=wu z6OTsX{(XWVv3SFh!%}BY{*cO%*4fph2L)?H>(N`v$|D*m!mMQlAiD;}0c;wGt$n(N zC+{pe7)r!}AU_0&-WZY>`?}d-3`&&Abi=ZghlV+=8vy=GS1)VM7ZvX%Q literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.637905411Z_GetDataContractsRequest_93bdf343bce1bafb96fd873236cabbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.637905411Z_GetDataContractsRequest_93bdf343bce1bafb96fd873236cabbc4ac6ad7e80f0e55fe98bbcfbebf6c0878.json new file mode 100644 index 0000000000000000000000000000000000000000..c55d94b259c7c60d0ee89d8a95cc901520189a1c GIT binary patch literal 8715 zcma)?OK;;w5QKB~uMl|7fz^C3u!jwhACPkp5L$_`gjlAd#{$8^|2;$5@`_*iu?F@* zayZk|U0q$%^!J;^BKtP%58LrR`?UC;E~gv$%m35Wc6~^ff1V$mAAkAzpU>H^SMUAt z`)^-U(S$b(R zY;QNmbT4alZR%>=5B+Mh+}`(h4FcB}f^G$>%djz&?{j+Y0;|@Jk@}Di{J#K6=B}DMKNcMc&deO)L_ma zkQrf{A_~lDz99rGLJHaqt89R0Qy_-SVdetDC1N6n>x>|cY3zm-Lj#2f-Y6JS0TyD8 zs)ql`nG&F9Ow?e8C=m~%NV1!yIgw}ehSh_fkfFVXC&IWt5Hl6r2T=lV6Etv~D&ms* zL}nzZL!|YN+bXyV5*RC5goX$4yo7pX2 zu}Q;13g-m_7QzVC+!}W_=N7(R(uDbNKBZWsW(r}`##Ai<#bk8QVn?Qlt$L~9B35O& z5gF&U0B*1_8$Gg!S^~3(n%=PVqsnUF3mJr1RGGk>(JDLg(<96Q?;?gG4fwMP^X_EK z1_!?hn-&YoNRkC9=rKwN(_2)Hq(~zVOKU=lB%|`tSzoMSt41>m`SV^V!5F&&H0QD_=c?uQ*|a+%_I`0=K(cw z@WjE~>rjTNUM%$t<&-bMXi|&X5t4-BRhUXI_=<%1dcqs(sLX?voSh-Dq>vHdODhPT z8_jdycxr3B^p2;C?BCP4KkfQWYNn>9=)CV~L17zBBmx;pQ!uc+Ia5&h5GvvUStco1 z|70gJicm7W1&LEqq}Z`NSe0F$F==FJ<)BCQlU`VM#Ta$~lUksO;7c)n6Fi6Q?fvq2 z+D{)K=FkxjQMOlWE3r`(rf2<}g(AWzrq2v>b~H{fGQcmZP8tD?Z<#-6mw%wKwJyGdrlu)e@}aS6Xc{l*Q3{LdG}L3D%6H78Z2_8zoe5 z%%EVowDX8H0l7p4M_9DXF%*S%s^(`H@fgF@@OCIAJ*mXFC0HMV0k@71H}>)8BML4< znSG-&U~)>E|xsTVdY zwdA6tTFrXbU%IXoz<=E>-7D(-=+`HuL&2E>2_o$S6SnO1c|y}9|X-!cDS&N zWPVZ5iqf9|VQsNMu$FU|M6nfV_9=}lE!n8st=_pVvKnkOLiiZ0$EGwyqxc`;3EL?E literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.639022859Z_GetDataContractsRequest_f229a0e58a5c4fb050f57c087bf067bd9ccc29eca3092a5664a5a9ba3bb7e967.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.639022859Z_GetDataContractsRequest_f229a0e58a5c4fb050f57c087bf067bd9ccc29eca3092a5664a5a9ba3bb7e967.json new file mode 100644 index 0000000000000000000000000000000000000000..f75ea287ad3314d29dafd3d7976d258129028f1a GIT binary patch literal 75622 zcmeI*TW?(1afabs>sJW6_667G*?=!>AV(xXf*>athMo9(~!@* zJ&P1ciIUoYXQsRNs#S-tzN%V#ck|D8?%uukr=#aDo*X~B_v^cVK6!ci#@2`bK6&-z z(TkIpzkl=5n~!&&{`cSh$AiPC&tLuBvw!^EuxdHMX+(VGun zpZxRno!58%>dvX!Gb^4Ry?pTK!OI6{EIV2B_~^+Gk6)g=ckf`FRrTTV^P~F@A3u2V z?Ea6(5C3@d=>CT*$L`+Vd!=v0*lKi*$<-aF^@`vv!&AH8_> zYZ;-l~GzyI*(u%50tqrvIRGj^_g>cua+bD6U54PEI zpB<{yf=IRACQAFL6p4H2ba;4Pr)8T9#y+mxW{V{{Y32@lj2*Ndy#mkd;|J{?yKK5_ zq4qF3V*wJ&j&BTQ9CAgs9q2K3(0tid2HtUxWk->_MBpretpWAG9e2@b=+0eq+9o&l z4B!D5BtOR?R`7D@{Luiq$9d%Hx3RE=lySo3=Ov5*_Dz-{Pc1s`q?(+Undt2iys-z= z4+zd;w3a2_&!))SBc9^`-;8}^E&|yIN5ry?%=ktKBtm0RZ?wt<&8CGIn#1M-;TmFM z3)h7p!!&tgh@*gF2;ODekPcum%+axj|K-dvfL@qr9|_A2@d!oAZb@^ImwIFM&=VtQ z-@_A2xPKvLV_Q2!3Emboz_2uc{ISJ~VJ~o?iiuV_mZYf7!D4B)&c>Aiw>2>-dI*L_ zS(S{^P>Dt2_xeL)14tz%X=vF&KzRw9LXL-!g6)cw4I0Gjc?YriFTYeWiY*f8u=Z>G zvI|nvOqeQT3wvx1PG%%56#SVERC^hq!2W+oRpS8O*YIUvXxjH>n@!WZjm{6(whH%YKUVu>q9TxXVaN#a)-rk)^<^QNGMT?DO;!4ElOsAH56qXdA_YA|ATw2mu< z$iXbTs%8v9M4)eZ$}!(HREMjlm#hFyB^t7zyqQ>>FQIOyxMp_~N2>fR2)cQaxoRYI zwdCPxL|vamb1oT?k<7D7ori;H!DdY`^3qMvDl|%vFk17TG|v`6ut&@}5tEFnly-$% zRyrQTYkM+RLswvVD^{GawVvan+7v@aP*GP1_cJ?({F(H{c zL*S*^*J2@4PNR@R#Y_)r?RE2f58RT#Wui{Df1Nz(R35X<^yEzaBIZOy1{`lHX7ZoM z*8+Y67@E_OzWO>@@e9r!$Wrh_5>)dHwW9L!XB2id7912Zv8ENY?O!0u7HVLd)~>dU zq2B_S99yG=agm&L{EAZA5xb*yv_vV-(hrG-4|Aww4)YUy{N{o~O1HN`ynYuqdOQ8r zE382pkmqUQ5kllW86Q0vJ_K~@U8GBV(#^Rj&05|7gehU3p{z`Y;IwzC!dq5vc-kJC z%#01ZVJ7Cm$IoGt4;UILY%G(v?=p0D$)(9&;an{%5*b4st^3|y#iuwp_F1DFXh`hDyCnc|L6Y4Il<0F}J~Eec7`rS5xS^42M=r-p`Fa?4|77dzWF zvNX$c|9+Yqmg(|>@Hosj3~LfCU<<^_I!jNO*}{RIwEXI?T#UtCrrgW+S&A1tsuF22FMf0RDzaDTdrs-a3g3& zTFD(3T=|gCqbl>l&pqSwOpn6oP!*5NL+{Z>e9}}jE-LAl@%IT!9}TifCK&~}ev8&F z$OU8ixTtU|{R{axM)yantVr@&F(P7GFu+Vbp@eQBYuN~Og`4V$&(fBg-l}bl2rqiU zH_^m|A=+#QA5giDzI^)TDF*W*C$33X^EqT0k+TMI1;jH?xAKSAVzFYcL}Td#0JJZ)7SAF6@jwCWlXSHSwRl~Ok3C1kriznQ&>HG%w*6u3(Ps$ z``o^LTz`8uZMSn2_T2$)1qJza74KInL@(YJREmQ06C@kI^2@^h;Gd4;4@sChv(i@hxCj3HP1X} z&V&JH4|j$KAaVMq-r$=yP@iL>k-{%&RJx(fl=ilHS-GFjJ>wK6h`@6bBGU%mP_{IJ z_**)qjXgYJh0YW(?<4H6>Knc1_?b<=(2=TkfQsOCXFC8EFcO2| z)(m-|2cW`1vo?3BPurq;MOw0}$%-Bsnwj&&^T9g9-SZbARJA~5QnBNJruOv26PW55 zAftwQRzd>68?I<7aHumQt>lgi;s-C#D9=}K;K9|~Y~c+P7u4I1+bizBJU^;N zGO~J6)#vmV+if+{Z(4w$tDxVe_M7O#)2U_Fb50BBjP~Y{)whR>E3I@OMv3(E zxRy39^qa0q3GQ&&M^=@$A6hikC5PN5Rb&7*??ocQNlzxt9$uitd9#>$9J;q+xM%mE zDO0IXSO?f>WzCt^W3^K2U{Ea;kR4M{x&@BN3inKWS6ubYRK}dWSt=czJgLuZym<&$ z{B8X;M-$ZS;@>I@PQo?j;O%>ioW?&UNg8oVR@nO*T^Kv%I_q^}0_Clr=$JR=N~5Kd zA%&Bd9T}#BOMc3CYIQfURhlsjTJtjU>ojWZEwrIjVkC9i%5WU^Cuvs52G0-)sYuVO z;{~V+l`c^9Sg}H~SGU{TxBa_1qqg#%XT z+}5=AQUEfwpGZKeroDh~y_)T}qVuJf|id739r_ zf+U>@qJLLJVyie=8FyH*;^3+6_P>FWmid@*&Nwb$sX>&Y8h~73UAG*mmfwK$`f{9} zaYb4Uq3D8@M?VdqB0`FlX@sY0(=n~U3hb5&+*7sZTK3CZY+4Z}X$G9oq*HYbnN^T# z0dynMJ(K4Z8E>l9%)MegsEHEI@+4TinJY{|nZnwNo#i(mkd|@f4VTQ>U#&>N^eLa? z{<{JHdVcYZ^hqaEP}s>#6Ksy{reI(cl2q}A$gBlu{V``mhDxS~A(>R?y{F!Ek6S_| zQ#Ce6A9wG9(exwX=P9Sh8v05D6^Qba^YCQvS7Hb)=t zkHO>q&C$nu*Ysy#nv$ENj}P8DaThe~K(hzkgr=Lvtmqc4PNaV5B*&bVBh}g*eY}ft zhYNdlnOWX#FkE3UBH`*ix?2QP-P0yaty8?SM~I^JA7@5Hq0WjNQz$}YZw@*>uvd{u zFSHG>q$}ARbi8wBU3vM_%2Wc=rCj7_{>2`2a1SlxPrDEc?}3Hbu`}mJz4cLwlWodJ zq)7NEGB~FS#w5oMF(0Ns{}Kg&^O#-4$*ps z+^HJq{l#F)6I2YfTgS{>`fYQ+)VOCEmiFBS)qs zFnXJFO2`5$O*%*=d_?t%h@PEc_-!d?(Y!@8xCn9rV2xF1b`@)R)TChrS`|6t`utGA zbj)4}n$DS8njC3Km?~axB_w#~0;bJk*7h}eMg-nTjN%NB;j>~svKWDBzWdW-*|QR- z?w*bhc?QE>1$;g?!s18)EgCAhdD8mBY<+U84gc!@6)ph&t}r0^oE-yP1`R+1aQ z>3+hXY@r5rz;(SV+@aOV6{wIlF-8*5|oh@2^U zX97yWn$<0WJb>n&A(~stf4gLQ?a=bpKo~0r=*pZ;TlKy$EXxv(=Di`_cW ztI({I>y;gm)L1c#_+4PiH=t!WoLScxkJbmgTjxQVu`HWrk1$KBm@#kS<2_#9&eLOm z?9112<;R?IZ9wwjARtI=nFP$PDEa|fBQ!^Qz-_@-iw+uY;tDHo^G79OX&Pi#xaXHr zIHPyEDZLx-MMMa!B4FN%FmWq_3Ds&`EE=*e<+n%+CDM+UxAYD)A$NlLGK>(G(fU_+ zJ`nE7f8^jZy;OpG0kVRoSK_UjrFwd!7F#UaL*(r|7b%Z8oqH5|5t_i?Zjxe=jyi9Y z&1f{;qd|={Q|2oN*c3)>5oPT);JGmoE0v(%gj9Q} zA|_q{LTXtQhPk{2G*2D>_^6v+-8GxPYyR^zkaG*a+LS&gkM9|vmGq(n?vovr0Pu<$ zB=n{agZM=XLyBzj0XwRe>?G;dQVq$O4i|Voz#XGgN4Lw{88ShsD3Jvg*=Di64Lx0b zl(>n9J>=a@gLsx)%%Gq<1tWznP=Xu84bbG}?Y!%-?3$D3`^8=QhdiC-;bzAzH%Q9b z!iGpfq20tT$Q3(iSNySydRbo7q1wDcOPWH!xEkxgaUh!7`rO#?uJ zRpw=*-ikCsf$^A!SS^*{=PSpRGo{)YT|-X!dyVROfk$Y_bS2ytORLvMKWs$*KyahDN|(ch$ZYeD=Sp0Pd!Ou5uw_xDq;A(F>|NR zl7q@(TIPx{=T^o6ygB2OZ}?ci@a%9f=;!`<-?)~>)b%s@UrZ=GOBSVR6hDG!KE*MF z0ZPx7dlEgZG-D%E{#)r9=${nPQF&J3b2ivU5suAY)?Eo1{g7&w&3yK)I6(_V?(+FA z8S2#J`qCvfR3k1(z};fy2$bkFtuxXHq7*cDt=`bS3wo#45}8LbTM`51${=8>5hy#- zxWE&eeKzpB-LCgxv)%^P$t*`>8zD5NKGy`HF||$ z`!OHkhN=tkKH3`8FT~EJ%pl$Dd8eSM2@bM zB0^f6T!Uqo25YDPRDuLRLn?zMMtvp9?rKPMZ||MVOb_9#bbJAZYH6x>3Uv)?t7GWN z($b09y!I$x4Fpx0!xio@j~-S!-t{~qe$E>+1gT_to_O;7;k1FHNzRBrAG>A*c_;Du@yh( zu%&m(jddcKenZwIZ8PGaH7{dCBTYwi3vEa~wDT}Btqh5TODYu45D7j_r4ViQaP!Wl z4LoVPGK!+)1sbfW-CA})TFtu`PlQ4jsU7A?U~ihF!4>GKXNrWKUGi~iST0xrGW1zJ30Ryl z^;Si)XAPro;AN0o0b@RT#jY9s#hb~&%@FhE0oVk5S{^OxnDmx(#H816HVqCE>@k-c}R4q?L1{DTB_vXHu$Xvlzo-x)M4NSQRr6)>NaeTIq~h zSPAOp9_D*;Ni7e&8&Vq8fZ!reg9kTAbQw+U_`+SK3j)BH zH~hZD$XEXSV%8#89H^7i>XI{%J+#u!#RsA?A&=0t&kFgIiUDh}xQlm|MdBnr%QlUp z&Kf(!XW51p^Tr{24F6ctHqJ|z?gG18AJ5!1fWAK8sJgu-VzDoMFv$mx7PDg6rlI!? zX9ypUW0!5F{>3aAB68&C%<=%ShO`(Rp!i}BviK#ds9`9QuRCB?_~Z*yK}Y5iK^(jg z(nY0Ex)Jt*^8iEq9vK7vbRqsgSa^KT>-|HEWg72BCIJ^cHcfh?7#5Zgmly)pcJW#c zItBOvIWqjCZ6a%!5vHAgUS>fhd$r*+gd_ZW2;Z86%Qo>IeuKI{dSI4CUY!i(d^G ze$5NR)6ZBd()#JkIN#_%Ui%=>2W1z#jFhh-VKxu;iQeK7h`DDsWCxto3(CVlMstyY zaMU89v zknggEDT{YLheu|MHzADT2pPIZ$PjM;#<*9~84GQUDlIbOu=gq-XMWu=h@K*4;&6p} zr;*8o5+%&+bo#@|e34&a>_t~}784}l8~cR(N~^ta`UcxXJ2*3Fv0P>zS)72~!ZW@^ zD~_=#459gbo8cH^YAh-h&!rsr#$tU)z=sK>VMD!Bq;0r@vV0*Uz;x3kN!tLB*6_%% zhKHI)2+&4v2&`e{ONcC<`Ep=RshoLgy2PDcexz+KQOoUVLeKUfckeD^?=RMv=f|&} zJvyl`=P2*qcRwCK{Nw#6kJcNPwCQ$8!zUVY@F77`7lvJ3+!QZ~?BtgXZRRckVr@x> zVJ+86Q5=l=t-g?DlFhz7^{#zUYH(;o_ypE+^s@X#JiTjpU;f`ur(Mg~`Wbnz->rH3 M@6&(2zVrJ30nO6h;Q#;t literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.642649491Z_GetEpochsInfoRequest_1b87e649557ccb609adb9e2904c67089535588985622579e77969e0ffd68afc7.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.642649491Z_GetEpochsInfoRequest_1b87e649557ccb609adb9e2904c67089535588985622579e77969e0ffd68afc7.json new file mode 100644 index 0000000000000000000000000000000000000000..d590a2f596c3c69281b2ae62163eea29c6055298 GIT binary patch literal 21008 zcmc)S$!=W95rtu|^%MfvUNDkFk$x4!AlMRHB20-ghX#y>-rZGfNzM9xwh1q6Ya!{@ z9WpY86DK0`-e2FmeS7fB)!qH|?dOBPy!~~1xclMo$N#rS_YaqM4;NQoZr^>}{`~pz z=H|~&mu*kIyM6rpu>Em<{Bn8!?&|aV>(3vyzy5rAbAR>Y%$K{{U#_;lKHNQCJ>CCx z`}fy3U*G)c&2HG&r1*68aQXi7;d1+g-=ut!^yAg_hmSi64$kJ_`%q7U-CbS0`*?Z% z`QqmG-QTa?U;MaoPEJpsUHN@phtGa{xc+o?@#%i|*xAhCW-}+7S12RnNop_g26&IQ_Hw8f~YV-;hltlhJ7_(9|&m3pQf9YXh8Cp=P_ zgD&Uz&RRO8p<8#0;*?_P!`gx%K_=~F+#>NQPs^0V@L3wlWOa%mbhdTKm_p6+j)}3= zvk|nsV;y7cCGZRM>opHGTa7}XsCCE_&lPD2)A4DiHQKMhj(@xcCTCv1;fKJyGMz9B z{ds)i9HE$a$ix^&IN21&@iGI$XfFbpj?8CshyjlrBaVEGP{D2|$}}saem&=?zq*sb ztV)HL&TGT@*?`7LyP`%^B`&T*1|^y%u^~=|1Rbl)!G0sJ67U0lOBYxgaE`FYDaRWS zc}$ff&=})qDF1|Tiqry6hD<@ThB4M*?6FT;JZ)BpP~Ko}UDDW!MS+5jv`7jm1$fQNuF$UYMtv5HsQ-rx-L@o%k;3n@{H)AyP;$ zm6vkQ@^4}ot*VNYBK;nXGsekCkHd~6>^lA6}$1Gzw*1v@NhiPNZXY(u8G?It9#Io*tofD5<1CvJCTdjb9)aczFmg#%mSKtmY8=>yu-RYEBJHw`d~NGwo0l zX~a^qwzI}HgBCR6m3bhPD{-)*8RbOxVXJy=`og&&-A{wdV2qE+{8J=LiKT3FuKk?$ z=!6!F!E&2a&H_l`FjZh+Q;(83Br4)iqGV{lUEnZV$0#KiKvcwMk(fTW6 z$W@};NxVxfqnkL0t(#;mb9w3;TmYABCbkg}2@+YUcFY*F$h|^J%rT~nF?{2>sbCt= z0(fR(YLjk;3!>bm-^B&Seo_s9uCio0YH#WTP{$FQC z!J)8l7j7je^x_a3WzyQCwSsg0km4(}Gh>9(ne5sp zC%n5RDa4FLVz`d$F|RO{G$4}`3a)m0f)JBf5V*zwPep}lqDz@W)|q&KBBf87S^0zg zBg1*@ilokn7R(RniX~R;f(VS@np7w-$@KzCU{U5=??_t>LuB7a)F#ShX*J6au7kD{ zY|Y5LTj6W%F##lJC9CO@(&u!v(-g2SF}Teb((Tmi-jG$4^yPTuYj7fUOO+vj8Hedv ziEu4amC3-&(t9f9prFfk3FVa@kvpR7p{5HPDs5XG)$4#zrcggzKGi^$5;oA+&~E*c zATsd-Cei@$wf%N$zu>2QCxyKw5i-S)L{!;o3K9Ng<4dI%`&tk zE*UxvOra;;Wm^^=PhdPbU$OB&C_HD04h~rY!R|cDL(55?&Ed!dV=yAMRki{!^DObm zR>Ld}U7;nLS;L&Yu2s<8U${_#`)AF~L+gj{x~fk{n|!N2m73CxJYte6PiGO=!z%AC=1*LBhz5v`YPLU;3w1vb#J z++<)u9r~8!Z-uT1j+i*}hP-H#FtJk&WJw0QTgM)LT6FtqV5G@r(eM*vZoa-+WlE|5b#<~kmpj+xbBx`sk5{-(v1d|%P%yE33f}(Bo}6Z zi;FZOk*SUAIgN93mO~zusV2Ogs*w;UV8BXNo4U|EYrZ&|%r7NdCqHZL%mVA^(Zoyr{+S)jM~8P?WLrOYywzuOdL znqdn`0Cu|5vK?PtGVw*b5;Hegg&)Tpw)(QIxv5hrZAS`AGKzhealMGZf}8&PXW^Y( zoUJ1a#bFwV&a0cWBz$9&GFc3X+a<_?>b~{@Gbs+^b#g{43XhHGtfmBbgf2~NM=OTO zw!U=oLdUYvPa(1rYQ6Ak#G78Ron5trcix4}DaATY=|smsT7iMXPmiH))IDV@cW8t64%umF25o#=fSaIuWGiQCE`| zg>~!;E2==9Y2P#=Ni#3?MJ8K+%c4&|O!NdKvJfb&B)0_sv>!L{LLEenDZr1tc=}JnjukQEdOxNsU-= zi&@^ojAJ@z_Jj5NRd!l|;W38?n({G#ZidpalKEmHlV`dTvdOl1Tt#_dgB4Xti&Sff zrrVIveOTQtWBg%`x!ZnGZ}-u-JrZ>A)9xd77uVab*u6wt^3j-7Vy?5;oNu3TU*f!} zmMw%Sq!N)LQ+S=_gbreE84Y1Bcb0l_l62k&=q5wF!y-8=uz9JyWt22CozA$m7`@gX g`qMYU`|!^%JJzyoko~xF_xZ)$pWpud_A$nP0S+HT6#xJL literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.719566753Z_GetEpochsInfoRequest_b2b426ac4a52cb4cb08904c63386caf3663c40a12d3b03827006d66058e439ac.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.719566753Z_GetEpochsInfoRequest_b2b426ac4a52cb4cb08904c63386caf3663c40a12d3b03827006d66058e439ac.json new file mode 100644 index 0000000000000000000000000000000000000000..911577272976e31ee29384f9356dbeb841abbe16 GIT binary patch literal 1466420 zcmeIb-ICCefBfaAzkl~%KK;+yZ2xfi_y5<{KYsb) z=U=}6@jrk1wJ?|%OAAOHMo`#XN~x7DBU)Bp4CpXz!4qxIsS{@eG< zi~qHss`bXF|8*Ju_s!e1{J{SD8~)+;{`KqoCJz41pW9CNZzz5}H=6hNr^1&_doQG zpIM%K#~a>p;}5;?9asKgGfwfq551vtC$!&i!igs=Pjt*Q`_C_F=9@6UY4 z#D7?!``{l^a7AxuuSRXT0}8%@qk)KU2y@U=CLX-5w7z(Swb-@8;n?3gO zdyMfaI(+-gQeEc}bYPL{HoblYsztU9ikXjK`EBv z925`vYGxT?E!Ih}h8YftbwPF_)?%Fm>k%i-U_q?KItSJ%=6$z4- zF)xilpgOD0mFx^y!%MSB%{D;Z4jgyxuG{uI@ab&soEsyoc<0_Ssd(pJ?TIlp2e@Dj zuVTcIAEWUEfRX4XL$bc5g@pYdh);=@(;7NrfzfDcP3L9jpx%UmE)Be_TTL z&d7i@1UIJEri@};pL#%nECbdfYCXYqpt*f&y|jun> z@ahce#agVBU=1%lRHvR`s>EE(lVHAWfFaK?ArmZ&Sc`QItO4c@#y+=LuiCO%(Ca;M zcyA49SDjVoigpI9;jLq8jW>(6SSP_6f*ZryRB>@2b*~BOosmGTV;Gwvit+hU#2GFF z&28aF)r3uNG;JfsJMvmDe8ERV!Va@ez1I$@`wVs+272#GZ32@rbiXw}=~Jx5ItSJ< zbv9*eb7xFo#IOL^o zU{S2~(v`vlrejR4Q4bVrvCe^YXi3N~i4tQm&VlimI%5!swOA*?8l~kiZ|x_h)~mW~ zRziAD9Nt@_)}eZ<-WBZxSi@Fe4Twqyzr|6E#W)AXW8T^nad8}Vuj%NWkwBftytJvJ zSfB3`Q#mX(A)1gn&WXhX&bG{u!#fW6;O||$!&{5780Wy4UYaH(+QvBBUSi(yvctk* zk#ktYu=ZI;y?9D59>W+%tIn$P8PwU-QFTtK&h*;QUzlYqDetC^Vx1FfkQu`oH=Jlf zG$A=mNDO0BN7ea+>WnhG>a05FP-l8+wnOUu0M}@4`y2RlHhs3SO$tIpY_QNpH<|OwCOl#XcwY@EI|z zO&!HLCDtK~pD@>GZjTW7b~a5F+XyjLY`yTosp1nXinU9~N@0cqAG~%`)1v`cSHiUj;S+_R-IMnigE&shwcG+nkp{RT=%MT9(872nr-Ou zjtPN-QN2~~GpIM#n_?~2Ik1kYvngVqciT=A(mUhu-r5vVtW&0lLtgp~E(1+CZA=6x z4zg*g_?iK@DldFKv=mfT`8`#I;#uxk>Ei^2U$1$Ex14ZcXPkgP@Ed$$>QE)*4J?Ya zUb+s(1Xx2tw<{fQcv+0aI0wdK>WtY&ti?JB*6>O6)_d)ky5nevfx{rlFu?Kvpu&~F zYrkP_BGzJ^1M3*Z7z1J~#yKz^^WJbcVlCE5um+hiwKjFES8>@)9eYnCDEN)3wW;I6 zblr<}9;`#^TrRK~Xu@ja+*n_-Y0TKD@ZrVQ3m^ROVz~fDxzh|paxUjdIN$aT;1+USE+&y}+U%SDx_3kZ{SN9g4p*Pm=gM*dj)%%0q%XJd2w>>ZCQF6V#mfJozyf~ZQr`qOh?^A8P5ceSv+&zv# zs`{)xSL`zQ4v-n-8m>jIzrJ}5y!ZmVLZ^>J~tPg=94v6 z^SQ7l6ywj+1UUwaa;%@O7$&H1kNIiF#BwdyNw|ieW_>%T-{zBT+U%S8WbcUM>ow+{wU`s%pY$s zB51;WW6W?7>hp|s3h;TxCKMn2JmU>4%CY{sVwk~)Y-{LFUGIk1R#W{J0pR<2RSxxl;acTjU0&j4t+-*=)~dywJbCA zFx&Uw-BI9{Yq?Is^^l*wqfRK-a-D-~%n;xda$N2{�e1qo2kwP@mQ39Qyoq>(zJj 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 Co@CSj literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.787102609Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.787102609Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json new file mode 100644 index 0000000000000000000000000000000000000000..20ab77901cf923979a5cf56db6f7f175ce1e15da GIT binary patch literal 24209 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.791025249Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.791025249Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json new file mode 100644 index 0000000000000000000000000000000000000000..1ab8cc19086101e35fb5fc43b5d310e4b51a56e0 GIT binary patch literal 21964 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.813846802Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.813846802Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json new file mode 100644 index 0000000000000000000000000000000000000000..1ab8cc19086101e35fb5fc43b5d310e4b51a56e0 GIT binary patch literal 21964 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.815461989Z_DocumentQuery_c104c67292061fe0b8e2f959cd2625892e0011f1264c65e1474532f59456ff51.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.815461989Z_DocumentQuery_c104c67292061fe0b8e2f959cd2625892e0011f1264c65e1474532f59456ff51.json new file mode 100644 index 0000000000000000000000000000000000000000..9ccba2df2b42155c805edd3546823c5a832227f9 GIT binary patch literal 24209 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.815625277Z_DocumentQuery_90af5a08200f1b0e42dbd3ad7a6af38ff6415d9cabab87315b9d9d736194597f.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.815625277Z_DocumentQuery_90af5a08200f1b0e42dbd3ad7a6af38ff6415d9cabab87315b9d9d736194597f.json new file mode 100644 index 0000000000000000000000000000000000000000..ad4ad78c551a2a8a16d06f34d4bac12eb4778ad2 GIT binary patch literal 24335 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.815887401Z_GetIdentityBalanceRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.815887401Z_GetIdentityBalanceRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json new file mode 100644 index 0000000000000000000000000000000000000000..d66fbb0245040408a8bb04eab9d504b3ea6b2d90 GIT binary patch literal 11759 zcma)?*=`$05JmH>uMqg02Uc;JVSXhD2wGw+A(H4&l!3s|zh`>1u;v^&iXUY5EZx<$ z-CNc3W7UjljRR?(< z=9iR5&&FA6o^TqSU zFBi?IpV|0+f7)H|PP=0F;ia4X?bn;raBbG->}{#x`qkmM-(KD9ZXdRHhpWH#*W33e zV^uXX+kZP;-3$|yt;|lh_xtVrW1BX*n0H;Q`c-y)U18YH>2P(p+n#;1D0cR;_UM?i z>)qqc{qD4HqU`RrxtzT!=lMV5)bl3Lr;@_i>4=Wu0oLm|<_O)s8`pfq1=Gp7p zJ4J#vEM79+T^5)4=>D5H?cU{Oag8?2YWj9zSsZVCV2arJpr=qJn#X-DAmkDcco$Pe#s({7V#df4ZsWGF#G*uSyWc}E9p2wy zTtj%A|FZ?7Cc*XwB<6w%0X>F9u_+PvA`&ba8(1z9TFC{TsL6MnvnHkSLQPrY1#YCn zluJkj5kk(ef~JPtF?9zhqQe3cXn2ts6D%-8^iX~TFRUpxeR_ffZPl#EIf_AL!vzCl zh`%&iGQIH%Sn z6C)_+Fl6c#Md8$J@^Us3+#GP&$>=8O2*wkf$3^O({vr9$Kc36FSR5b?uq3tK8agW;B}1YF*3XdWi{VC^YEr=gH^ zbXyemN!8qpHm6r+qB$IQ((Gy`jh?|IWzn?_<2@aRxhRC0+8dK7|fPM#wsk74~Zmk5T?&oTw}o7y2JGhPj!#G9hD9 z>j92Q#ARBArbts*xB_1ox@yZPr?QWX2~{f5;fRSM3`zzv9n1OXpfoqTX$XQjp&YwP zI$SbqvKn`=b4fLWV96lER1fxpz6SPzAy!~iL5r+E{(CZNI9M0N9LuYIp{t1SG6xUm zL(@DF?wmquRzwT{Ri|vrIOno934#j?RQ2CUZ{=>WU}hn=Q4A!hB)JVCQMoBuE%-t` zeQoTNWJ8r6TnxjYD#fQ%C=$0BsH*E&G?NRfW=f%xNFb%+oC47fUJ0h)h6G(Iv;_CX z@RRXem=WsLYg0y=MjsP~>QOqe<|8xs1ng9!X+=^|aT7PZ=#!F(St!}V<{O}KEPT{# zR(FwQidtR@oKW<`#d!9n%*jfFM`=vvL}~3(VMGYkxu*|9rvA2uVilL&>tTOOP48br zw88A}r^E5-etR=~9xxp9Pfzky^RW{UX7=cD23yLcWn@7~YOfZg3OjX43=(2zDPC-w;|~#=IQ`h zOfK0TC3|t%Aa+Q{W1YaB6|<-tm#nAs#frKF3}U*nPJE$BI*jSUsfAULf44O$sssOR9e3eV*UC7GZ0SpCU12RNv7K!X5F%B!LcAor-KR1t(iV zyPIXurH{uLNGxB(R(YN((&dy-Mnd(enJV>>Eh>?UEmFON!w*n<{Zm{y9-bcB=d=^o zpM7axQEqRC&nQ14EAFZdog5G?@vkY>7Q?nsSMEb?s@I|-}dk2|JSd9 F{{`(rXHWnD literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.818184304Z_DocumentQuery_fb3b25c8fa37750a6c1b18d9085fcf0df7bf150009b1ced887a6f051ab86085b.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.818184304Z_DocumentQuery_fb3b25c8fa37750a6c1b18d9085fcf0df7bf150009b1ced887a6f051ab86085b.json new file mode 100644 index 0000000000000000000000000000000000000000..761ee46c827a120fb3f75f5f29d4ce0f94646c1a GIT binary patch literal 22309 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 HKltSzD?X{Q literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.818401023Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.818401023Z_GetIdentityRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json new file mode 100644 index 0000000000000000000000000000000000000000..1ab8cc19086101e35fb5fc43b5d310e4b51a56e0 GIT binary patch literal 21964 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.819407923Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.819407923Z_DocumentQuery_4dd78cc4a7f90bcf8393c36115a093d92d2c84b425f8393ffa9599b06a3a77be.json new file mode 100644 index 0000000000000000000000000000000000000000..20ab77901cf923979a5cf56db6f7f175ce1e15da GIT binary patch literal 24209 zcmeI4U2_}9m4NsYdOwtEQKBdO>%5t2ATmV(_a7g zJ>7$kndb#5$@W%K73;zVrf0fOpO5#v=k$O-KFG4cG+*ZDld4?S`D8ixL-wOxw96k{ zR`onzp5KJJDXP*22E)OJ?N~95U;p^GFJ3(Q>gn@u|NHyXPZt06H2?Fb&tE_OYW)21 z)$`AeFY3`>KYr0XK7MiJKAvozv~@0vtL-ZHuVbT=ynGyGlW>`@W>E|MmA213UoG>CSs3*Q=GoNNDVDb%my`N-u{1S4u2$tVOg{@zu5vY-bvDy~=1I8onPh~Y*0$K$ z$E~kaZ^}?VOC~!0`0~-&r}fRvQCWWUbo%0Qe3?&2XQv}q6kmSv_mjU(Rww`S)u+eB zi|}+~qGoa(=DBI2>4`Yl=-@>fkAtnJm?5UsJTIb)Y_8a~RM!%jFKZNP$Y3?UU__#t8H*Y3`j#Tl9wWj08_TRmewldx^Q*Y*1JDtRN2dlDp zy^2CaU+Uc1Tfe{dR!!5qx!!o2nI1F0uZrq0sp@HS7-#)!lBzTJKVxf;W<}oon!8F9 zzVD{GHrameSaHzPbJtRXS@PU&fFzS|f}~m2MR_F~%$LhhC+Pjh*ZIK@j}HDmJUDx` z`*`r`$Ki)3?x)?AS08Yac~Sl;lvm4ZbF3ry#XSFhJ9fgsMb#7$vh2Abo|}edQWpu( zV$8G=l%+i$X5sMaFnjp8x_EfljijCzcY<&eFI{z6Fua#$uD?C_ZhlZM4t`kcr+1;F zrQY>Dx_U=_tdX`w0~7WhePovL45BT4Wy>m?Rc}H)$(xW_cFp34gQ9Fg88v+qvK9f# z&@|bNL6l`?)Bj=ia!|b-d}#kGUJkOnoZ6?EeX7G^mQQTrH^uVWt_`=N&OX^{bDQ-l zUxw_unpanKzPQfJqw>jj8zWr|FCNlgKA2SVm>#2HpRbx_b`i4hdX>-OjLYlLnmH@V z-Dd8TaK3*2UPN6X%aWL&H_WBP7OjJxySnqir6cWhZ`bK(nk5{xu@ z2VLv0(BmEZ6q|0iU%Ba)dlcM`->u{{-cdAwAPqbuE!E7PDfKvf_Vy zpV;Z)bg?)rQkivGgc?4QCW6&Aq%V8+Bu0y6w`9Uy;Ix)3=6QXa063X;^VGft-kLEt z?$Cxx*D0caJz~^KY*4QR^iif6AL=z$W2+H0%GT6}JV!9-9sD&Cu&#M3Ic9b{+Mjs`{|Q+eZd2K4GQhk(7 z!)0NNK6`U*sd<+qx4UZE?3Epu`fp9U|Jk;l?0eF8blWu>Oo?{i>Rr3;l5}coth2L; zleXGcA!~-P6CnjiSy>jV76)C*z?wVhqvMRjp4S_e^}hG)X#UrE@C05A1#V4})zRp! z@I5^=5xiU7uJ4Hz)ox4B)8IYAq_%R$x_7aG_H}PRwgoy&Z~Rr~+fEZ5Em+5L@6_w| zKvySHA>T15WWRUchLI$C)f?Fmklw|u`r1(2Zs*nRu6I;q4{M&47WhW;qRHxTWz^L^ z=Noh0R;#QGJlcz^qZ?eNBELN?FKgQ7gJa5Ec@^cpw!rnHqik}W*Nu_t*iXqUy|fNE z%`R@UFP?ssx#7|1Fl+18EeSO5H3Ti@^R{*ThiqO=i_0~QNtip0{cWrC(~Z_Pwr0>I z_Pf{m-#U=>ms+;mqm6e1;QMu28>6#f`iXH5#?CGu>EB;K*g0QuEs(#j4TvgSHJ@S~Hgx=ei3XqEBc zP$n)MFXmR|m>XK*S6hdunrCs}$-DB7qibxE3D6E zfsyPuXqI^$zs0ki2R}Xd-Gk_CgWVxb>wANnVJC(M^RUcgQQf&_4_$}i>N@q|PJJgN z2iBW60k4g_ozJStcVT+Iz0-|O#vQBIuc+zW>FI9cdu~V1h%Eu{z^nZ+7dY!^HZH)1`M9IyB*4j8Um_0~ zO#S^EoWm4nxM2hl+zEt~ZHQWqs3t7ohLFJ>gR8kCNWp!Mpvn_0>4#K|N2kR*?n|sO zq*TY;2p{p3i{Jea8>1#hkc#8S*cZmdIKTN=j1&9!Z|q~o2oA^ZXG9IUt)pA|Bg6*$ zaKuO%V+rrz$Roz*5FxIpamqQ5`3QtG?hG`<1B~Yp?)R9mn+ce&gueBgk-sEz&KTbhZ9u7{%Q9%7l#g$6UYF zCdsAEsi7FjPXETd5gz7_f%j6(c=97Z1iS;gN&4uPZj2=zv0GCN*{xK-6jB)s^F75n zg=W0uf8kurb4Nr1LIVl2kPr{g6&l6F=^YZKXJT|`*qA$o{$)-emZV;gQ5xK{o)w5> zKZ4B23F+^P#8O6F()v^VC&Yo^v|i(YU`vPb3Nx^U*oLKu+i2b7zo|9!tDBg9l4~BWOB4;RU!QY@i3vCX$c= zJV0+DutSa5k}^Lk!Lg|Yua(Lxi+Z`X!=yt|9b^Qab8NY~=)v)V%Z|lCrmoL2W}b+PoSg`KS|+@hC&0l+vz} zolE+m=aNb);~_U71St7T!BZv zo+sCOv?+9wd4z>K0m8o}5X9jmFo<%F@eKqKNJAV^LPtw7j7|{(j`fWbEN5gQ`oSsi z74i}=0bh6+>eh-==?P|VKZDWGH6?{|Pt>V&Md)V~O35#s+0nJ+I7Z$raDw#Q*d8!r za-gJA!h68qTgw;rDTKS7&_m^dxU6taUSQR)X_j}$D<+=7?+AiUf|WbzqpIGI@%~q4 z4OUR{o{b~uvW*}OK2eK1LkJ4;JDw~mC1rMFP6ZQSspzF&BIT+Wj|YoRh&ESYdT~N> zNMXc7oamQvPxO~XSvPyx8DH_bA3%le35!x6;A>5u7aWt0kU8le=xH(wGQ|y&GiEY@ zc1gB0y08?X2ts|?+#~B?1ublv&hO-P1A4Q(q2UE%>576)1Ri`x1{c5O{PIGB;KC`> zfLM!dFUNNjJllnm6^Z+zN;Y6T*_B{6iL;Z_A0&IR1<{H5jfxT22KC-#w9naXLMG_1UqP_UfxX+|yKPtRA0UXBS$0Z(`nIK~;pgjdiULc97thTGX- zacm=dp$3#kHozEVfH7gJ8inuk5oSZ4=1DVzxWsMJ1qE&8M47pdCyZQy_j5~5dO)lW znN=jiOI0NOFM(SEJaQqtg)9(wB$_5zW-z>Gx=N%q&e z5fLmPjB)8PFzGq+Ucm$&-Vlf0$`wF~^qfvIJ;9JjrxC=G%`qsYW`louvL?oqa&dOv zq)cHLf`3pij6uf`lk-YaUS(lCC}EQ39yl&PV~{gYM-C&UEdf<1t(50l<`4l%g&0Y! z7NoO8U5fH)9pDXLW?~)e1wln5l0heNK$74|cNlvl*-Ve@);RHUwjjltY|f0JC@G}n zZ3a2~kw=6sX~2uu>AOH6Gko_$8hu0rW(Xz(jg4{VH*B3>N7}F5UazWpH9x=h|eNVNoYIZ~}XuK;omX#OekYHont&n&QfS`)hxiLtIDBY8+opAPlh)Mv5Y5?b_`o z$Otjg)-^cTnm5}V}QR?fks-6Yu-g`!Y#{-{l46ypf`gRQ;o0oG)E zM@pctZ%J`SG8}e3^eqiK0}ad27rsF|NZ!%5uJkYYuA@Y@BhgkL7oU~#m4PG>&p={1 zK>8;?LM9)Sc9)P=DYc}%A?jl*LCyf#W|h}HBuUGK@yVTerH+4}y8jmgjH+D3zcX-N z*dH3$M^=>A682cU$q|JUry=Q-vlA(dh0l}e>J$Qv6qHWH_+fYmO(R{Gnp0dvyODfj ylm!}^D3nPWAF^wC{SH9G{J=;#_ILWzn&htk#EKj4Ja6*{lG^{LztHjEr~d=elAe43 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.823315675Z_GetIdentityBalanceAndRevisionRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.823315675Z_GetIdentityBalanceAndRevisionRequest_e4060c14ceaca6844d682c7393d7776113debe4287515ae60d0645da450a80a1.json new file mode 100644 index 0000000000000000000000000000000000000000..e07910549f59b724af4115e590cf0085dc42e00a GIT binary patch literal 20815 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 COe0|c literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.824051072Z_GetIdentityKeysRequest_b4ecff7acf52818aef9ed37a98d4a459dc7a67570ea6df3f8858d3fae7820ffe.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.824051072Z_GetIdentityKeysRequest_b4ecff7acf52818aef9ed37a98d4a459dc7a67570ea6df3f8858d3fae7820ffe.json new file mode 100644 index 0000000000000000000000000000000000000000..2b6f6eecbeda40ded8ea1d0fe11b274c2d3002ed GIT binary patch literal 15482 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 literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.837728485Z_GetIdentityContractNonceRequest_b7c02dae0c3c762ece1f70a36f88fa69b4749b19cc1f5ef0abf37fa0c04ab2ef.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.837728485Z_GetIdentityContractNonceRequest_b7c02dae0c3c762ece1f70a36f88fa69b4749b19cc1f5ef0abf37fa0c04ab2ef.json new file mode 100644 index 0000000000000000000000000000000000000000..c37c61754c915d3e820749af381041734ba0b1cd GIT binary patch literal 14552 zcmeI3%W~UB5Jj`rSE#tog57+8%&(+UELvhLRxHt>C|9{$`uAX<2OH-w)+Wn%Arl}l znCZTK`*sibf4h4)?N8q~``iBX@53eSvia)Q z_s>y3uV>|p#iAbM`5ms5YWW77OeD%N|ZHhr9;ket}+->&{n=gl(zjn8q_bX#jfjQZIJ>1;&0~91p zPW$`a=Kiq_8(mDhE*7grcB}e?emSSZ&Ed=D%n=3Glb2@?yfC@lKHlALPrEji?Uzl? zC$GkNew*>+xO;s1($?|9GtCE+{t1UaN2mIepPLnLKW*N=Jd;klr_7)o7B^n_Hm8L( zE_{!{a#mu#UB2S*i(KPxS$YWJ6>R!OU{|A3=EJ{nsS99V~rCTh05C` z=5!#J&F|j;-EQs|4Wq$GHO;llaWxjm!D2y+OmT-Dj|q&@Tbsd3L(+x>M$BM>8KPo| zRgF?|dnSV^fghF%}GpAVD8s-;bX_~AmqOHRx zs<3HSh#naIm?R9-;W$Z1T!Y*jQw>4P$Z`ytC8G?-RcN(E2L~{QIPVT96e93Qu?_LT zWmnzS=9mPjLWv;d6KIvJO0PX)g-Baq1Uh#lG}{1VNZ^%Nh&hZDfje+WI*ldJ*kQ)O zhzPm-jHze}k&;A(BC=M{%^xd5sFu8g!(a+nN~Wu2YrEg>;W}f^ zg(gps|C7k4vSR{aq9xylvip=Y!r&qf35lfbvo#j$YSVN8fJ~223fhH{M0_x}N<%^ikrZh%+K?D0-vw=^ zxT8>~Dh4$$Lz05!_1fbeY)tj25E5U3Ppv)xBz0Q|Z-rbawbXw2z?oEPw3C_#Bz0D| zB5}klLk^BmIWy{=zgQY}5kUfctgwROQ(Y>>G+f1a1Ofc~kga;30)~vU+1%MlcDcZuK%5;+m#v$e<)reYb@3q|^*8 z#s~X*u7xQfLQYG7CPYT?s`z&dSl%!}x|AImZ3K+nuN;7{8EQ-_2#R3jk+3gR zFR+;y8+Z>}mOidy2#1uv_(q<2+?v;U<{!%#y75=FJD z4FTiRwkoN)6%b6BECAGQ4yH`S_eWI;J7#KU5#?f9PFlgLT268hOsf3y^Y7s(+^u~9 z1YNKVCd5n7i#h~1?py|4eW6i|Ww3CA4TyNVh3iDdl&n{$id>Q6Y3<@*lHS}VUiDBW zSp|)9pa?}hc-|5;9#WdxB}&ZXIHn)eKO}ZqHdthf14X-hqJ%GT&kYtfP{bT&Lx_h?(;BdsctB?MBhh`;D;phY>D^?^cDITndSn=9J)U;+&F6xps- z9V9J5OKO`*i~*FZb3l>y;l?EmBl+sLqF8&Nb>l$ddkxy4PZnPm?tG{_3()?^No?>2 z_k5)s*&m@YaG;15rJ-pm*C$*BIYSazHBhj*!OlXGoGD0Deo#FqUvmTo3nh-4(V{gy z0=ZSZr&oX!pJc}9Uf-r{mB#zqzU^T0_tW9{bicXl-@okNqa42~sbQGff+{qW%m@so z7IqV~gC*L&u6zSkRIi6YTz@su z$W8roSdswJ+fpP}=f^9jqhN(S5pke;? zx^)HLeqhz1^9hv6ZarZ+TLuL~j)-`dKjj)iLFoRsCXYQ1g%qG5huq|D!b g&eo{^qR2gc|JsyFpL*Vr*M4Bt{=NMF`g5y)0D->Y?EnA( literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.838169256Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.838169256Z_IdentityRequest_5789e2afa300c2ac039646d8b81c53464633a072722c5a04b15ee01f3a45de99.json new file mode 100644 index 0000000000000000000000000000000000000000..d8710cd5009db23bfdc3f08e540c629c88574224 GIT binary patch literal 24692 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 X{|~8CnM%*w$@CpR{dxZP<*WW5B{+tB literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.866866313Z_GetProtocolVersionUpgradeVoteStatusRequest_ec9dca65a964669b3bc8195d5ff106e5eda740be44679cc960ea35f2134af628.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.866866313Z_GetProtocolVersionUpgradeVoteStatusRequest_ec9dca65a964669b3bc8195d5ff106e5eda740be44679cc960ea35f2134af628.json new file mode 100644 index 0000000000000000000000000000000000000000..09304945dc358ec461618e2d0afade611eb9122e GIT binary patch literal 10885 zcmeI2&2k$@41{ymQ>gZw!#4ImuaZi!XmTU5B8dvQblK(7yJv=yXztgPdC5^e*q-GK zW(H^g4eb87xxFpEj=TM4`&9gK`y&nWgYxwMG}=$g-L!b#Z5PwG#r<-BpML!FI5AHy zfB*dN|F4HPo&NQ%++wvoJWWaQae9&r@^ws4rrlvYPJc;%zudgs{C1Pgc+IMhU?; zc^nsy`z%(S%C1w>H_`RyJEZGO+tv1A@e_?Y6Z^XNW}RiM69ylb)0mI4d{{(Xys7Ku zeL=As_lJjkk5@!z0~Kk9?ccLU>ET`0;`&R5_wmP{z|L#VPLPKu<>x{ARn7Z`uMa8= zIUmyp%vX1&wBrUHRz$S(ExI$+A6HbEFz^cXFqhEu7(;-#K!OAfSi(c9t>=40U{i{u zMAeWWUL2YWUc15saYn;iwGh!`tPbXl8rE`6)v!1Yg-haB?myQlCS#)tXVriQJ%JPu z7?4NC7QaEp=(tcepr35E;8Sv_{`0M-^`1%XgQHNmS6IChV5MF9arYoI17 zhzRkR9qa)K4Yv>u@$2PS4dE~XhMdfk&v9!`5{A5zDClv#3YQ56W)c5f(NaQ*2da53 zTAj#?0PS#kObrNM77#_08*#HZ0iR;gA*OUOgBu-Z2(>E25=kJx8cl0)an+35 z79malG#PJd%!BdHwM~0iQl2X}%slhoff$xKVo0~tW0{2!S|m>l(WdCDtUz2sKGp)0 zEnF!Cs={kBOSo&2oO0ZYYb9I@j@01%yi5y7g}=wtr>#d z4e(G_he5zuE!88$d548t%6e9F2#bff(EPwPEq}o{L06>Xv213+7KUFEdU`I?k#`gr zPZS6bW?n+b`(^-Q#I!AtOL*<8y;5Sqyy$`+VB8=AVNF*gj6ua- z2rs}N01J8Ekzn({01Z4+tE?iB$8b6x2fp#kAtYN9+1f8mYO+?F(R`fG+MXt|#RZ{$ zBNJu-ayxb`MRLI~X~m`mZ+7#{pJ7wRIO}s;j8O-aSY!5D#uAGOk->tMdG8m##hj<^ z?S*7c6{mN&c~Ja&*zOLG{u(|1$a+-Nj<+tit#qd%ao$TSkppPMJs0hL&4M$t;&t{fFS$Z|SH_80x5Zwsh8~kLe_3S%qzR}aasPd zY6kt{Oa9Vpu}PnL@teO)R=fwtuxFn)k$cEM!~83|x6Kezw$T?8VWE)+B~PILn0-Oa zjaOKQ(;#AuN&EnTuOe`5p2=DscI$Fx?esMp0uA#6Kai^9Lp;5a-0AysW-2N5oMz^4 N6!V|gf8V}X{0}P1@0X_K7tGH4unnEO2BvBzjmt8Ksdv+;_0={O%$~p1DHi+HX zoxh&mS^T_NESBGf{b9R%TK=~9nI7{G#rgl~=`gPM&@=?G^U?a6zAX4;BQ0vZQLJ+)3}%P_sh-8%`Z23iEAr94&(ZEJ+3FaNR#e|?cIG| zY1zf{eW}w1_QPs(zurEr9(J2QhuhV8r0S-fj2xbKo4ot;M$_zZ`#7u~4_T~Q6>Y1! ztE26vDVM5C zgl$VvCIfe27)umj1!QW7in895tbg#QH*k9h=vo$DV}b`I9JE4WT7U6+Hr>*Gy-+nBB+7l zGTb(VH2c$K)HDq0p{QG%{xC{8H*T1F=I;?Pw5tf|R(hpB1E3DlQL4!*;i+XyA{iO7T!G0;m8{&FCymuH5v?4R3~4)|Tm79!3*$L>%<|JS z<0A@g0=^-mqoGAQ94w^78%u32p&BeM=&jW7np=XFV?j#&G)zEzM1cX8Cw|!IA%kR9 zJkyFX;^!5fQN@a2#}mfL6$HB0fkD(Vb*+RMM70Pg2((ik(S)>1RLH=>dQi!kZBBzMN&qQS*h9Pvj8Gu+7hTGRQqaEma$-2biodAZZHDjO*bT* zLBm>zTl^tlAPgUj>W|-`bf^BZQ*dxf zz5qAk7NVBBfM-r1+ceS~Mn713#kRIco6ODR{&r!*Q#8B3mYal4a((0JR_74iBy!dQ zXNN6#;IgI=XE^O4M0p?ryz;6tyn8d@Jr@WEe X@yBy!Dk?rAFMkY~|GfVD_G#qbp7zp> literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.895002050Z_GetProtocolVersionUpgradeVoteStatusRequest_8534be7e0b4dd648520dc3a67209b1a05862cb8d40c088b193b59ca3564210bc.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.895002050Z_GetProtocolVersionUpgradeVoteStatusRequest_8534be7e0b4dd648520dc3a67209b1a05862cb8d40c088b193b59ca3564210bc.json new file mode 100644 index 0000000000000000000000000000000000000000..ed765df053c096529892f4b986215bc14e53fd83 GIT binary patch literal 11307 zcmeI2%W@k>3`MinSE#tog1|iKUrD7{G{s1)NTNaxT}iq0@0pe;nRAY0ZnKCNwrAMW z-2g6t3v_?Ky1t%$+w2e9-Q(=b_4o0yyqLfLe|$O&tNpNi+V7Ub-^;tz;coo#x0ius za5l}a|3CcKba1lB?{B7=t#`-AVKiL6zZnhsZ8N?Z_Q%c3@aOUG=d0(dU#?tb|L&2cux>)P9!GRMt`;fK|*DO*|H zFSDMV)b;%K!EC=d9Pf)9uO9K@72^uKKPIn6!ETEdZ@w1yc=_>%W0Y^sc2FMQm0upl zU#t3U!PASMJ|;(3i|P2Bw|Kz?vg)TJ7Mzna%+HWrHd&q7syqkx5cnVyBib{|mKi$E z*kiysJjw?d5F!IoWCg`XPq`{?laqP?wiOLF-oU()+`DMF&%_)Zwiyj}f$@n6a}MoC zP36t2DI}mNO4;IjA}Tmva70pu3QH0~QA4WevFGR^<^p=@@jS^|1ytBV)|fDev7l*^ z#>|?qgfTm;k#tvCJCcIee9=MDfMnQ1#o-H#4=g~xkQ#yr<(_lS5j8f^Vog2=KS<)9 z5DTeAf}iu4f(UO5plc_cnj<_V4Z@U8zyy(=Ay(q>#3d zvN2_n(L{&zfEgNMDz5YOr?q~O38=Iw}*42o2=2{IEYXFG$ zTq<%7lGR`gQ#&H4t6&)|magKG7`YIET4=7vGf+#{RSHvx>X@OXidT)!XhPZ*6iC5< z?M-EuAgc^+Qifm!%tQb+sl->$My)AA)=eFn29^reYaj43+Ja<|V$c;CCdK1GnNs+r z>gl;mN5Kj_)v4+Lo7ky>RH0iHqrKLsl%`{}Qk**hl*Vp0p1qbj>dDae)``=H>%fsxi<8FU^@MVYcBm0QX0OtF^gj|Ybjb1OpuakriXe`BNv97*J zlA;lc$+j-1B>7ReQ%^Ny6?&Kt+IUEjq{e(!ZlMj8TS&>2ORD};@Eo?ckE`LhFPAHD z9Y7Ez#bG7E4_u=ozUW{xn0nPX)R}_JOakDe5b#eW70SV|Nv{HlgP2xnWCF) z!Ko?4FI-G8L>Y+F{G}cZ6I7_gQD{~pieRS`6Uy0ulR%T?4=T!8{hgu zQN}^;S7+(c2P}9<{uKJAmJ}RGtC*~OB1SOKuyh$!eYArwT5yWwxsM2|Jo|&TG9!*K z%M&Z=(v4<1lKOc&CEhp+=FA-)6qG(M+h{`zm{7gczcG;XiuTg$c>UG(0^oKk}%#} zQHN6y5o6M2CmuzB1#?eoc}QyBm0>}`{JK) literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.896617067Z_GetProtocolVersionUpgradeVoteStatusRequest_92a45a0fe4f69d355022d2f2f7622dfc69cc7b123be24b7ad993281979b2a3a2.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.896617067Z_GetProtocolVersionUpgradeVoteStatusRequest_92a45a0fe4f69d355022d2f2f7622dfc69cc7b123be24b7ad993281979b2a3a2.json new file mode 100644 index 0000000000000000000000000000000000000000..9d6639943456d25f2d62c73fcf21100aa3efda5c GIT binary patch literal 10992 zcmeI2&2HmH5QKB~Qy4nuz-s>IRf2_}l^9EiWjYeI*kIvz4@Z_|@hjOvfZVcs*jY65h+}+>LzID6(rhl6KcK>6%Oh07j|BqMuVX+(L&%1s;e4nou`}KJ9_v3@< z;q2F+|NZa%aPsMwH|Nfl{o!dC9k1-{@YxuWZ{7IYusd|e0WagBrxf{jQrY*Ne^5{IOsD*{$a1CskJU#gpB0zf2f8 zFLWF|Y_{EeyH93SE30djO&N7_Im5V}pHQqHRZj1>cwY5|(~c9=7!grTP1F~zKaR-pK+7!@?bJfq;2H+R0TL{z#Sku1RWY3- z0+Z4tEvkS8apUk@aN9W^5T7Wys|qF>T&qTSqd>IWQw1W9MPZY;%lW51#lx7$px9#Z z4S^Ie7_i6ylrU(hP=+U>jt%xa7lFIVN^w;(2iZTw@$5EFcKoc(0;~Ge=%8 z0FnxG@>(1aMkiQ=v4w2oB{zme$vCXRBtfV)%%2u0z@=D{8YF|UBvTf_tFQ-Nk^+={ zj=azB0*JVTvzQQgdXyH1sg@PB z7BP^O`vR^K%bu+MmmEUcwiIPDa23X}WC2z{riQpt)_bZo`sGvj!0(i8$P;+SsDpbk zaQ>|3uS|b0Qsn=knv;1{fj1%t!bEuyCMd}K)bMISUq*-`%1t2}Pavmwx)E`%hFQr% zO$xQ+4mD^5>a-!K!p3F1Z47DtXUMqIFsjE!-P??ZNy@2n!@@JY55&-~BBfjDvC2Y* zRt_0PiZ(~*aDu1>#UWI76f6~pIw(iEO;!m{Et?X_NXT*qCNH;S<<=r;s*Z_h#j1Fw6*1!H6`oPWieSeRV&nz`-Ri&qwM<MOe5^nouQD!al;<~3ww4@x1O&V1Rm*Co+6+#sQ-}+|K<{wedQEEENWtN z*^XV5@xk4h$qE~U`{eg?5{(=J8b=peY(l>sOTM$aK&nBDMhhHZDfL9 zJk4E^vD`in>)xiIL?aY~ZC#qA_%XV(o~kS=%rMzI3bwiJ#V)0?WdvhrwS|(*YDwOF z2%i1s;b}1(cIo>9yb(8uTJD0LIe==@M01$@VCfax+M;Z-FjM>63mcxI+5NTLByCdb zn@+bn2Xs@&Sqq#Uw%~!wnnE1mvWFDqKm^G_4fy*3JK`8MTO*2KXA%?2QDPPFBmrcH zavp!f-WE{%n@REpU2SW$;GmpXXX(}e9(XAJjQXaLG&mw}tyuXRF*fWNSf;+6`WOeR zJ3$k{_dX_AEwlZ@1LDm)Dtu!_UwWgNiDZ33)cTuEIq$eryo>I$7OT0B?Mx$5>MCDjDQU)&Ns|akHYhnxaNBQJdnnf|=~d-^o;AIzKo>i_@% literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.913049807Z_IdentityRequest_8fb3b1a4ef0db316161d4ed79b93efbcc93fdbc66e012e606d530c327265c52d.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:45.913049807Z_IdentityRequest_8fb3b1a4ef0db316161d4ed79b93efbcc93fdbc66e012e606d530c327265c52d.json new file mode 100644 index 0000000000000000000000000000000000000000..8ef1f44147525ce08f8a26a61bf2937fcb562e9e GIT binary patch literal 30798 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 BgJl2! literal 0 HcmV?d00001 diff --git a/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:46.188023131Z_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json b/packages/rs-sdk/tests/vectors/msg_2024-03-18T14:19:46.188023131Z_GetEpochsInfoRequest_ae2b6b4e09e8e68e73f2df9af38b0b93d9d2e841a5e3d60755f8e7be3b93315b.json new file mode 100644 index 0000000000000000000000000000000000000000..9e1c943fb3afa5ed3276e4581abf810be81c4ad3 GIT binary patch literal 2425354 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

  • wn9nu96OJH8k>6}UFOw!>S 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%0D4SZx83Fyd6^p5sTpNcf6fp3(2eD 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 diff --git a/.yarn/cache/lru-cache-npm-7.3.1-b157dca680-83adf549d8.zip b/.yarn/cache/lru-cache-npm-7.3.1-b157dca680-83adf549d8.zip deleted file mode 100644 index cd127a2e1b9f29309a1dc4ec614f98841097a3a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12498 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 AQ2+n{ diff --git a/.yarn/cache/mem-fs-editor-npm-9.4.0-97c608fb01-b196c50010.zip b/.yarn/cache/mem-fs-editor-npm-9.4.0-97c608fb01-b196c50010.zip deleted file mode 100644 index da9d0e2dbc6a04803988bdf95da4d2c9834f55de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15928 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 UVFd()1NiX)FqWA=`3|7}2QZgGY5)KL diff --git a/.yarn/cache/minimatch-npm-5.0.0-969101c1d1-ee05bf8c18.zip b/.yarn/cache/minimatch-npm-5.0.0-969101c1d1-ee05bf8c18.zip deleted file mode 100644 index db3898f3278ce7a9b26b44e4ba602150f7b99244..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13202 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 RGQj?7U4L=yK8An&{U0?uy14)V diff --git a/.yarn/cache/minipass-npm-7.0.3-3b57909ee9-04d72c8a43.zip b/.yarn/cache/minipass-npm-7.0.3-3b57909ee9-04d72c8a43.zip deleted file mode 100644 index 3a742326aa50c939bd5225c97418cebc2407554e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73513 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 I&I$0p04kCDzyJUM diff --git a/.yarn/cache/node-releases-npm-2.0.1-77b8e327f7-b20dd8d4bc.zip b/.yarn/cache/node-releases-npm-2.0.1-77b8e327f7-b20dd8d4bc.zip deleted file mode 100644 index f80933576c9e48ea1a4b351320362b52c0f4f228..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4920 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%0A-<{{X4;dl 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 diff --git a/.yarn/cache/browserslist-npm-4.18.1-38eb8a64b9-83bb8dd04c.zip b/.yarn/cache/browserslist-npm-4.18.1-38eb8a64b9-83bb8dd04c.zip deleted file mode 100644 index e00bb3f3422182391bb275270ac54f6bea7179c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20034 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 F_di%(_*4J@ diff --git a/.yarn/cache/caniuse-lite-npm-1.0.30001282-49173a42dd-7802b8e099.zip b/.yarn/cache/caniuse-lite-npm-1.0.30001282-49173a42dd-7802b8e099.zip deleted file mode 100644 index 8b2227c6b3c938f8155111aa87faa700bdcf63d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 687977 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 z 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%0D{Dp@-x?R9?C^pbENsfXC>vIg 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≥iPoW6_dPD?zo?RAcg@ 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

  • hp?m?Jjvxppk;s1JD< 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